@deeksha2309/sunbird-collection-editor 8.0.7 → 8.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/deeksha2309-sunbird-collection-editor.d.ts.map +1 -0
  2. package/esm2022/deeksha2309-sunbird-collection-editor.mjs +5 -0
  3. package/esm2022/lib/collection-editor-library.module.mjs +30 -6
  4. package/esm2022/lib/components/answer/answer.component.mjs +6 -3
  5. package/esm2022/lib/components/app-loader/app-loader.component.mjs +30 -0
  6. package/esm2022/lib/components/asset-browser/asset-browser.component.mjs +30 -12
  7. package/esm2022/lib/components/assign-page-number/assign-page-number.component.mjs +1 -1
  8. package/esm2022/lib/components/bulk-upload/bulk-upload.component.mjs +447 -0
  9. package/esm2022/lib/components/ckeditor-tool/ckeditor-tool.component.mjs +30 -12
  10. package/esm2022/lib/components/collection-icon/collection-icon.component.mjs +3 -3
  11. package/esm2022/lib/components/csv-upload/csv-upload.component.mjs +2 -2
  12. package/esm2022/lib/components/editor/editor.component.mjs +143 -64
  13. package/esm2022/lib/components/fancy-tree/fancy-tree.component.mjs +91 -9
  14. package/esm2022/lib/components/header/header.component.mjs +27 -9
  15. package/esm2022/lib/components/library/library.component.mjs +4 -4
  16. package/esm2022/lib/components/library-list/library-list.component.mjs +4 -4
  17. package/esm2022/lib/components/library-player/library-player.component.mjs +4 -4
  18. package/esm2022/lib/components/meta-form/meta-form.component.mjs +10 -18
  19. package/esm2022/lib/components/options/options.component.mjs +40 -27
  20. package/esm2022/lib/components/progress-status/progress-status.component.mjs +1 -1
  21. package/esm2022/lib/components/publish-checklist/publish-checklist.component.mjs +6 -3
  22. package/esm2022/lib/components/question/question.component.mjs +185 -77
  23. package/esm2022/lib/components/question-option-sub-menu/question-option-sub-menu.component.mjs +36 -0
  24. package/esm2022/lib/components/quml-player/quml-player.component.mjs +2 -2
  25. package/esm2022/lib/components/qumlplayer-page/qumlplayer-page.component.mjs +3 -3
  26. package/esm2022/lib/components/relational-metadata/relational-metadata.component.mjs +80 -0
  27. package/esm2022/lib/components/resource-reorder/resource-reorder.component.mjs +3 -3
  28. package/esm2022/lib/components/slider/slider.component.mjs +46 -0
  29. package/esm2022/lib/components/template/template.component.mjs +3 -3
  30. package/esm2022/lib/components/translations/translations.component.mjs +132 -0
  31. package/esm2022/lib/directives/date-format/date-format.pipe.mjs +34 -0
  32. package/esm2022/lib/interfaces/CreationContext.mjs +2 -0
  33. package/esm2022/lib/interfaces/editor.mjs +1 -1
  34. package/esm2022/lib/interfaces/loader.mjs +2 -0
  35. package/esm2022/lib/pipes/interpolate.pipe.mjs +17 -0
  36. package/esm2022/lib/pipes/sanitize-html.pipe.mjs +6 -8
  37. package/esm2022/lib/services/bulk-job/bulk-job.service.mjs +67 -0
  38. package/esm2022/lib/services/config/category.config.json +1 -0
  39. package/esm2022/lib/services/config/editor.config.json +29 -2
  40. package/esm2022/lib/services/config/label.config.json +16 -3
  41. package/esm2022/lib/services/config/player.config.json +3 -0
  42. package/esm2022/lib/services/config/url.config.json +17 -1
  43. package/esm2022/lib/services/editor/editor.service.mjs +64 -26
  44. package/esm2022/lib/services/question/question.service.mjs +27 -35
  45. package/esm2022/lib/services/tree/tree.service.mjs +20 -5
  46. package/fesm2022/{project-sunbird-sunbird-collection-editor.mjs → deeksha2309-sunbird-collection-editor.mjs} +1779 -483
  47. package/fesm2022/deeksha2309-sunbird-collection-editor.mjs.map +1 -0
  48. package/index.d.ts +2 -2
  49. package/lib/collection-editor-library.module.d.ts +51 -43
  50. package/lib/collection-editor-library.module.d.ts.map +1 -1
  51. package/lib/components/answer/answer.component.d.ts +2 -1
  52. package/lib/components/answer/answer.component.d.ts.map +1 -1
  53. package/lib/components/app-loader/app-loader.component.d.ts +18 -0
  54. package/lib/components/app-loader/app-loader.component.d.ts.map +1 -0
  55. package/lib/components/asset-browser/asset-browser.component.d.ts.map +1 -1
  56. package/lib/components/bulk-upload/bulk-upload.component.d.ts +71 -0
  57. package/lib/components/bulk-upload/bulk-upload.component.d.ts.map +1 -0
  58. package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts +1 -1
  59. package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts.map +1 -1
  60. package/lib/components/editor/editor.component.d.ts +11 -7
  61. package/lib/components/editor/editor.component.d.ts.map +1 -1
  62. package/lib/components/fancy-tree/fancy-tree.component.d.ts +11 -3
  63. package/lib/components/fancy-tree/fancy-tree.component.d.ts.map +1 -1
  64. package/lib/components/header/header.component.d.ts +6 -2
  65. package/lib/components/header/header.component.d.ts.map +1 -1
  66. package/lib/components/library/library.component.d.ts +1 -1
  67. package/lib/components/library/library.component.d.ts.map +1 -1
  68. package/lib/components/meta-form/meta-form.component.d.ts +3 -4
  69. package/lib/components/meta-form/meta-form.component.d.ts.map +1 -1
  70. package/lib/components/options/options.component.d.ts +15 -7
  71. package/lib/components/options/options.component.d.ts.map +1 -1
  72. package/lib/components/publish-checklist/publish-checklist.component.d.ts +2 -1
  73. package/lib/components/publish-checklist/publish-checklist.component.d.ts.map +1 -1
  74. package/lib/components/question/question.component.d.ts +21 -28
  75. package/lib/components/question/question.component.d.ts.map +1 -1
  76. package/lib/components/question-option-sub-menu/question-option-sub-menu.component.d.ts +27 -0
  77. package/lib/components/question-option-sub-menu/question-option-sub-menu.component.d.ts.map +1 -0
  78. package/lib/components/relational-metadata/relational-metadata.component.d.ts +25 -0
  79. package/lib/components/relational-metadata/relational-metadata.component.d.ts.map +1 -0
  80. package/lib/components/slider/slider.component.d.ts +25 -0
  81. package/lib/components/slider/slider.component.d.ts.map +1 -0
  82. package/lib/components/translations/translations.component.d.ts +70 -0
  83. package/lib/components/translations/translations.component.d.ts.map +1 -0
  84. package/lib/directives/date-format/date-format.pipe.d.ts +20 -0
  85. package/lib/directives/date-format/date-format.pipe.d.ts.map +1 -0
  86. package/lib/interfaces/CreationContext.d.ts +11 -0
  87. package/lib/interfaces/CreationContext.d.ts.map +1 -0
  88. package/lib/interfaces/editor.d.ts +10 -5
  89. package/lib/interfaces/editor.d.ts.map +1 -1
  90. package/lib/interfaces/loader.d.ts +11 -0
  91. package/lib/interfaces/loader.d.ts.map +1 -0
  92. package/lib/pipes/interpolate.pipe.d.ts +8 -0
  93. package/lib/pipes/interpolate.pipe.d.ts.map +1 -0
  94. package/lib/pipes/sanitize-html.pipe.d.ts +4 -4
  95. package/lib/pipes/sanitize-html.pipe.d.ts.map +1 -1
  96. package/lib/services/bulk-job/bulk-job.service.d.ts +17 -0
  97. package/lib/services/bulk-job/bulk-job.service.d.ts.map +1 -0
  98. package/lib/services/editor/editor.service.d.ts +7 -4
  99. package/lib/services/editor/editor.service.d.ts.map +1 -1
  100. package/lib/services/question/question.service.d.ts +2 -2
  101. package/lib/services/question/question.service.d.ts.map +1 -1
  102. package/lib/services/tree/tree.service.d.ts +3 -1
  103. package/lib/services/tree/tree.service.d.ts.map +1 -1
  104. package/package.json +5 -5
  105. package/esm2022/project-sunbird-sunbird-collection-editor.mjs +0 -5
  106. package/fesm2022/project-sunbird-sunbird-collection-editor.mjs.map +0 -1
  107. package/project-sunbird-sunbird-collection-editor.d.ts.map +0 -1
@@ -141,11 +141,15 @@ export class CkeditorToolComponent {
141
141
  this.videoDataOutput.emit(false);
142
142
  }
143
143
  dismissImageUploadModal() {
144
- this.showImageUploadModal = false;
144
+ if (this.isClosable) {
145
+ this.showImageUploadModal = false;
146
+ }
145
147
  }
146
148
  initiateImageUploadModal() {
147
149
  this.showImagePicker = false;
148
150
  this.showImageUploadModal = true;
151
+ this.loading = false;
152
+ this.isClosable = true;
149
153
  }
150
154
  dismissVideoUploadModal() {
151
155
  if (this.isClosable) {
@@ -342,7 +346,7 @@ export class CkeditorToolComponent {
342
346
  this.editorInstance.model.change(writer => {
343
347
  const imageElement = writer.createElement('image', {
344
348
  src,
345
- alt: imageId,
349
+ alt: imageName,
346
350
  'data-asset-variable': imageId
347
351
  });
348
352
  this.editorInstance.model.insertContent(imageElement, this.editorInstance.model.document.selection);
@@ -484,6 +488,7 @@ export class CkeditorToolComponent {
484
488
  * function to upload image
485
489
  */
486
490
  uploadImage(event) {
491
+ this.imageFile = event.target.files[0];
487
492
  const file = event.target.files[0];
488
493
  this.assetName = file.name;
489
494
  const reader = new FileReader();
@@ -511,7 +516,6 @@ export class CkeditorToolComponent {
511
516
  this.errorMsg = _.get(this.configService.labelConfig, 'messages.error.020');
512
517
  }
513
518
  if (!this.showErrorMsg) {
514
- this.imageFile = file;
515
519
  this.imageUploadLoader = true;
516
520
  this.imageFormValid = true;
517
521
  this.assestData = this.generateAssetCreateRequest(fileName, fileType, 'image');
@@ -533,16 +537,28 @@ export class CkeditorToolComponent {
533
537
  this.formConfig = formvalue;
534
538
  }
535
539
  uploadAndUseImage(modal) {
536
- this.questionService.createMediaAsset({ content: this.assestData }).pipe(catchError(err => {
540
+ this.isClosable = false;
541
+ this.loading = true;
542
+ this.showErrorMsg = false;
543
+ this.imageFormValid = false;
544
+ this.questionService.createMediaAsset({ asset: this.assestData }).pipe(catchError(err => {
537
545
  const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.019') };
546
+ this.loading = false;
547
+ this.isClosable = true;
548
+ this.imageFormValid = true;
538
549
  return throwError(this.editorService.apiErrorHandling(err, errInfo));
539
550
  })).subscribe((res) => {
540
551
  const imgId = res.result.node_id;
541
- const request = {
542
- data: this.formData
552
+ const preSignedRequest = {
553
+ content: {
554
+ fileName: this.assetName
555
+ }
543
556
  };
544
- this.questionService.uploadMedia(request, imgId).pipe(catchError(err => {
545
- const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.019') };
557
+ this.questionService.generatePreSignedUrl(preSignedRequest, imgId).pipe(catchError(err => {
558
+ const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.026') };
559
+ this.loading = false;
560
+ this.isClosable = true;
561
+ this.imageFormValid = true;
546
562
  return throwError(this.editorService.apiErrorHandling(err, errInfo));
547
563
  })).subscribe((response) => {
548
564
  const signedURL = response.result.pre_signed_url;
@@ -625,6 +641,8 @@ export class CkeditorToolComponent {
625
641
  this.formConfig = this.initialFormConfig;
626
642
  this.imageUploadLoader = false;
627
643
  this.imageFormValid = false;
644
+ this.loading = false;
645
+ this.isClosable = true;
628
646
  }
629
647
  /**
630
648
  * function to upload video
@@ -678,7 +696,7 @@ export class CkeditorToolComponent {
678
696
  this.showErrorMsg = false;
679
697
  this.imageFormValid = false;
680
698
  if (!this.showErrorMsg) {
681
- this.questionService.createMediaAsset({ content: this.assestData }).pipe(catchError(err => {
699
+ this.questionService.createMediaAsset({ asset: this.assestData }).pipe(catchError(err => {
682
700
  this.loading = false;
683
701
  this.isClosable = true;
684
702
  this.imageFormValid = true;
@@ -869,11 +887,11 @@ export class CkeditorToolComponent {
869
887
  return null;
870
888
  }
871
889
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CkeditorToolComponent, deps: [{ token: i1.QuestionService }, { token: i2.EditorService }, { token: i3.ToasterService }, { token: i4.ConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
872
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CkeditorToolComponent, selector: "lib-ckeditor-tool", inputs: { editorDataInput: "editorDataInput", videoShow: "videoShow", setCharacterLimit: "setCharacterLimit", setImageLimit: "setImageLimit" }, outputs: { editorDataOutput: "editorDataOutput", hasError: "hasError", videoDataOutput: "videoDataOutput" }, viewQueries: [{ propertyName: "editorRef", first: true, predicate: ["editor"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"editorWrapper\" [ngClass]=\"{'hasError': limitExceeded}\">\n <button type=\"button\" data-tooltip=\"Add image\" data-position=\"bottom center\" data-variation=\"mini\" data-inverted=\"\"\n title=\"Add image\" [disabled]=\"isAssetBrowserReadOnly || isEditorFocused\" (click)=\"initializeImagePicker('question')\"\n class=\"ui icon button insert-image-btn\">\n <i class=\"image outline icon\" aria-hidden=\"true\"></i>\n </button>\n <textarea class=\"editor\" #editor name=\"question\" placeholder=\"\"></textarea>\n <div *ngIf=\"setCharacterLimit > 0\">\n <div class=\"characterCount\">\n {{configService.labelConfig?.lbl?.charactersLeft}} {{charactersLeft}}\n </div>\n </div>\n</div>\n\n<sui-modal [isClosable]=\"true\" class=\"sb-modal overflow-modal\" [isInverted]=\"false\" (dismissed)=\"dismissImagePicker()\"\n *ngIf=\"showImagePicker\" [size]=\"'normal'\" [isFullScreen]=\"false\" [mustScroll]=\"true\" #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.selectImage}}</div>\n <div class=\"sb-modal-content p-0\">\n <sui-tabset>\n <div class=\"sb-tabset-menu\">\n <a class=\"sb-item\" (activate)=\"getMyImages(0)\" suiTabHeader=\"1\">{{configService.labelConfig?.lbl?.myImages}}</a>\n <a class=\"sb-item\" (activate)=\"getAllImages(0)\" suiTabHeader=\"2\">{{configService.labelConfig?.lbl?.allImage}}</a>\n </div>\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadMyImages()\" suiTabContent=\"1\">\n <div class=\"ui pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchImages($event, 'myImages')\" class=\"sb-search-input\" [(ngModel)]=\"searchMyInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchImages('clearInput', 'myImages')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!myAssets?.length && searchMyInput\" class=\"fs-0785\"> {{emptyImageSearchMessage}} </div>\n <div class=\"sb-grid-layout image\">\n <div class=\"sb-video-content\" *ngFor=\"let data of myAssets\">\n <div class=\"sb-image-section relative position\">\n <img (click)=\"addImageInEditor(data.downloadUrl, data.identifier)\" [src]=\"data.downloadUrl\">\n </div>\n </div>\n\n </div>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadAllImages()\" suiTabContent=\"2\">\n <div class=\"ui pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchImages($event, 'allImages')\" class=\"sb-search-input\" [(ngModel)]=\"searchAllInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchImages('clearInput', 'allImages')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\">{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!allImages?.length && searchAllInput\" class=\"fs-0785\"> {{emptyImageSearchMessage}} </div>\n <div class=\"sb-grid-layout image\">\n <div class=\"sb-video-content\" *ngFor=\"let data of allImages\">\n <div class=\"sb-image-section\">\n <img (click)=\"addImageInEditor(data.downloadUrl, data.identifier)\" [src]=\"data.downloadUrl\">\n </div>\n </div>\n </div>\n\n </div>\n </sui-tabset>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-end\">\n <button (click)=\"openImageUploadModal();\" class=\"sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.upload_use_btn_label}}</button>\n </div>\n</sui-modal>\n\n<sui-modal [isClosable]=\"isClosable\" class=\"sb-modal overflow-modal\" [isInverted]=\"false\"\n (dismissed)=\"dismissVideoPicker()\" *ngIf=\"showVideoPicker\" [size]=\"'normal'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.selectVideo}}</div>\n <div class=\"sb-modal-content p-0\">\n <sui-tabset>\n <div class=\"sb-tabset-menu\">\n <a class=\"sb-item\" (activate)=\"getMyVideos(0)\" suiTabHeader=\"1\">{{configService.labelConfig?.lbl?.myVideos}}</a>\n <a class=\"sb-item\" (activate)=\"getAllVideos(0)\" suiTabHeader=\"2\">{{configService.labelConfig?.lbl?.allVideos}}</a>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadMyVideos()\" suiTabContent=\"1\">\n <div class=\"pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchVideo($event, 'myVideos')\" class=\"sb-search-input\" [(ngModel)]=\"searchMyInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchVideo('clearInput', 'myVideos')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!myAssets?.length && searchMyInput\" class=\"fs-0785\"> {{emptyVideoSearchMessage}} </div>\n <div class=\"sb-grid-layout video\">\n <div class=\"sb-video-content\" *ngFor=\"let data of myAssets\">\n <div class=\"sb-image-section relative position\" [ngClass]=\"{'active': selectedVideoId === data.identifier}\"\n (click)=\"selectVideo(data)\">\n <div class=\"overlay-image\"><i class=\"play circle icon\" aria-hidden=\"true\"></i></div>\n <i class=\"check circle icon selected-video\" aria-hidden=\"true\"></i>\n <img [src]=\"data.thumbnail\">\n </div>\n </div>\n\n </div>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadAllVideos()\" suiTabContent=\"2\">\n <div class=\" pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchVideo($event, 'allVideos')\" class=\"sb-search-input\" [(ngModel)]=\"searchAllInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchVideo('clearInput', 'allVideos')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!allVideos?.length && searchAllInput\" class=\"fs-0785\"> {{emptyVideoSearchMessage}} </div>\n <div class=\"sb-grid-layout video\">\n <div class=\"sb-video-content\" *ngFor=\"let data of allVideos\">\n <div class=\"sb-image-section relative position\" [ngClass]=\"{'active': selectedVideoId === data.identifier}\"\n (click)=\"selectVideo(data);\">\n <div class=\"overlay-image\"><i class=\"play circle icon\" aria-hidden=\"true\"></i></div>\n <i class=\"check circle icon selected-video\" aria-hidden=\"true\"></i>\n <img [src]=\"data.thumbnail\">\n </div>\n </div>\n </div>\n </div>\n </sui-tabset>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between pl-20\">\n <div>\n <button (click)=\"addVideoInEditor();\" class=\"sb-btn sb-btn-normal\"\n [ngClass]=\"{'sb-btn-primary': showAddButton, 'sb-btn-disabled': !showAddButton}\">{{configService.labelConfig?.button_labels?.add_btn_label}}</button>\n </div>\n <div>\n <button (click)=\"openVideoUploadModal();\" class=\"sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.upload_use_btn_label}}</button>\n </div>\n </div>\n</sui-modal>\n\n<!-- Upload image pop up code here -->\n\n<sui-modal class=\"sb-modal overflow-modal\" [isClosable]=\"true\" [isInverted]=\"false\"\n (dismissed)=\"dismissImageUploadModal()\" *ngIf=\"showImageUploadModal\" [size]=\"'large'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" appBodyScroll #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.uploadAndUse}}</div>\n <div class=\"p-10 sb-bg-white\">\n <div class=\"d-flex\">\n <div class=\"w-50\">\n <div class=\"content\">\n <h6 class=\"mb-8 fs-normal\">{{configService.labelConfig?.lbl?.chooseOrDragImage}}<span class=\"red\">*</span></h6>\n <div class=\"upload-image-modal-section d-flex flex-ai-center flex-jc-center flex-dc\">\n <ng-container>\n <button class=\"upload-input-button sb-btn sb-btn-success sb-btn-normal\">\n {{configService.labelConfig?.button_labels?.upload_from_computer_btn_label}}\n <input (change)=\"uploadImage($event)\" type=\"file\" [accept]=\"acceptImageType\" name=\"assetfile\">\n </button>\n <div class=\"py-10 fs-0-785 sb-color-primary\" *ngIf=\"imageUploadLoader\"> {{assetName}} </div>\n <span class=\"fsmall mt-8\">{{configService.labelConfig?.lbl?.upload}} {{assetConfig.image.accepted}} ({{configService.labelConfig?.lbl?.maxFileSize}}\n {{assetConfig.image.size}}{{assetConfig.image.sizeType}})</span>\n <div *ngIf=\"showErrorMsg\" class=\"sb-color-error fsmall mt-8\">\n <p>{{errorMsg}}</p>\n </div>\n </ng-container>\n </div>\n <div class=\"ui info message sb-info-bx\">\n <ul class=\"list\">\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.allowedFileTypes}} {{assetConfig.image.accepted}}</li>\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.maximumAllowedFileSize}} {{assetConfig.image.size}}{{assetConfig.image.sizeType}}</li>\n </ul>\n </div>\n <h6 class=\"fs-0785\">{{configService.labelConfig?.lbl?.copyRightsAndLicense}}<span class=\"red\">*</span></h6>\n <p class=\"fsmall mt-8 terms-and-condition\">{{termsAndCondition}}</p>\n </div>\n </div>\n <div class=\"w-50 pl-10 ml-10 b-bl\">\n <div class=\"ui info message sb-info-bx mb-0\">\n <ul class=\"list\">\n <li class=\"fs-0785 font-weight-bold\">\n <i class=\"icon info circle\" aria-hidden=\"true\"></i>\n {{configService.labelConfig?.lbl?.dropChooseFile}}</li>\n </ul>\n </div>\n <div class=\"sb-form-fields\">\n <div class=\"form-container upload-form\">\n <sb-dynamic-form [config]=\"formConfig\" (statusChanges)=\"onStatusChanges($event)\"\n (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between p-0\">\n <div>\n <button (click)=\"dismissPops(modal);\" class=\"mr-10 sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.cancel_btn_label}}</button>\n\n <button (click)=\"uploadAndUseImage(modal);\" [disabled]=\"!imageFormValid\"\n [ngClass]=\"{'sb-btn-primary': imageFormValid, 'sb-btn-disabled': !imageFormValid}\"\n class=\"sb-btn sb-btn-normal text-left\">{{configService.labelConfig?.button_labels?.upload_use_btn_label}} \n </button>\n </div>\n <div>\n <button (click)=\"dismissImageUploadModal();\" class=\" sb-btn sb-btn-primary sb-btn-normal\"> {{configService.labelConfig?.button_labels?.back_btn_label}}</button>\n </div>\n </div>\n </div>\n</sui-modal>\n\n<!-- Upload video pop up code here -->\n<sui-modal class=\"sb-modal overflow-modal\" [isClosable]=\"isClosable\" [isInverted]=\"false\"\n (dismissed)=\"dismissVideoUploadModal()\" *ngIf=\"showVideoUploadModal\" [size]=\"'large'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" appBodyScroll #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.uploadAndUse}}</div>\n <div class=\"p-10 sb-bg-white\">\n <div class=\"d-flex\">\n <div class=\"w-50\">\n <div class=\"content\">\n <h6 class=\"mb-8 fs-normal\">{{configService.labelConfig?.lbl?.chooseOrDragVideo}}<span class=\"red\">*</span></h6>\n <div class=\"upload-image-modal-section d-flex flex-ai-center flex-jc-center flex-dc\">\n <ng-container>\n <button class=\"upload-input-button sb-btn sb-btn-success sb-btn-normal\">\n {{configService.labelConfig?.button_labels?.upload_from_computer_btn_label}}\n <input (change)=\"uploadVideoFromLocal($event)\" type=\"file\" [accept]=\"acceptVideoType\" name=\"assetfile\">\n </button>\n <div class=\"py-10 fs-0-785 sb-color-primary\" *ngIf=\"imageUploadLoader\"> {{videoFile?.name}} </div>\n <span class=\"fsmall mt-8\">{{configService.labelConfig?.lbl?.upload}} {{assetConfig.video.accepted}} ({{configService.labelConfig?.lbl?.maxFileSize}}\n {{assetConfig.video.size}}{{assetConfig.video.sizeType}})</span>\n <div *ngIf=\"showErrorMsg\" class=\"sb-color-error fsmall mt-8\">\n <p>{{errorMsg}}</p>\n </div>\n </ng-container>\n </div>\n <div class=\"ui info message sb-info-bx\">\n <ul class=\"list\">\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.allowedFileTypes}} {{assetConfig.video.accepted}}</li>\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.maximumAllowedFileSize}} {{assetConfig.video.size}}{{assetConfig.video.sizeType}}</li>\n </ul>\n </div>\n <h6 class=\"fs-0785\">{{configService.labelConfig?.lbl?.copyRightsAndLicense}}<span class=\"red\">*</span></h6>\n <p class=\"fsmall mt-8 terms-and-condition\">{{termsAndCondition}}</p>\n </div>\n </div>\n <div class=\"w-50 pl-10 ml-10 b-bl\">\n <div class=\"ui info message sb-info-bx mb-0\">\n <ul class=\"list\">\n <li class=\"fs-0785 font-weight-bold\">\n <i class=\"icon info circle\" aria-hidden=\"true\"></i>\n {{configService.labelConfig?.lbl?.dropChooseFile}}</li>\n </ul>\n </div>\n <div class=\"sb-form-fields\">\n <div class=\"form-container upload-form\">\n <sb-dynamic-form [config]=\"formConfig\" (statusChanges)=\"onStatusChanges($event)\"\n (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between p-0\">\n <div>\n <button (click)=\"dismissVideoPops(modal);\" class=\"mr-10 sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.cancel_btn_label}}</button>\n <button type=\"button\" class=\"sb-btn sb-btn-normal text-left sb-btn-loading-spinner sb-btn-primary\"\n [disabled]=\"!imageFormValid\" (click)=\"uploadVideo(modal);\" \n [ngClass]=\"{'sb-btn-primary': imageFormValid, 'sb-btn-disabled': !imageFormValid}\">\n <div class=\"sb-loading-spinner\" *ngIf=\"loading\" role=\"status\" aria-hidden=\"true\"></div>\n {{configService.labelConfig?.lbl?.uploadAndUse}}\n </button>\n </div>\n <div>\n <button (click)=\"dismissVideoUploadModal();\" class=\" sb-btn sb-btn-primary sb-btn-normal\"> {{configService.labelConfig?.button_labels?.back_btn_label}}</button>\n </div>\n </div>\n </div>\n</sui-modal>", styles: [".editorWrapper{border:0px solid white}.editorWrapper.hasError{border:1px solid red;border-radius:2px}.characterCount{text-align:right;border-top:0;padding-right:7px;font-size:11px;font-weight:700;margin-top:-16px;position:relative}.custom-image img{border:1px dotted;padding:7px;margin:6px;cursor:pointer}.resource-image{height:180px!important}.asset_container{overflow-y:auto;overflow-x:hidden;min-height:300px!important;max-height:300px!important;padding:5px}.insert-image-btn{position:absolute;z-index:1;left:653px;background-color:transparent;padding:12px 14px!important;margin-left:6px}.insert-image-btn>.icon{opacity:1}.insert-image-btn:active{background-color:transparent}.upload-file-description p{color:#999}.upload-file-description ul{margin:0;list-style:disc}.upload-file-description ul li{margin-bottom:8px}.upload-file-description ul li a{cursor:pointer;font-size:12px}.sb-grid-layout{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));grid-gap:16px}.sb-grid-layout.image{grid-template-columns:repeat(auto-fill,minmax(96px,1fr))}.sb-grid-layout.video{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}.sb-grid-layout .sb-video-content .sb-image-section{height:96px;overflow:hidden;border-radius:4px;box-shadow:inset 0 1px 3px #00000080}.sb-image-section .selected-video{display:none}.sb-image-section.active .selected-video{position:absolute;right:4px;top:4px;color:#07bc81;font-size:20px;display:block}.sb-grid-layout .sb-video-content .sb-image-section img{width:100%;height:100%;cursor:pointer}.overlay-image{width:100%;height:100%;background:#0000004d;position:absolute;left:0;right:0;cursor:pointer}.overlay-image .play.icon{position:absolute;transform:translate(-50%,-50%);top:50%;left:50%;color:#fff9;font-size:32px;cursor:pointer}::ng-deep .ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar,::ng-deep .ck.ck-editor__top .ck-sticky-panel .ck-toolbar.ck-rounded-corners{border-left:none;border-right:none;border-bottom:1px solid #c4c4c4;border-radius:0}::ng-deep .ck-rounded-corners .ck.ck-editor__main>.ck-editor__editable,::ng-deep .ck.ck-editor__main>.ck-editor__editable.ck-rounded-corners{border:none}::ng-deep .ck-dropdown.ck-font-size-dropdown .ck-dropdown__panel{height:150px;overflow-y:scroll}::ng-deep figure.image.ck-widget{width:auto;height:auto;overflow:visible}::ng-deep figure.image img{width:100%}::ng-deep figure.image.resize-25{width:25%;height:auto}::ng-deep figure.image.resize-50{width:50%;height:auto}::ng-deep figure.image.resize-75{width:75%;height:auto}::ng-deep figure.image.resize-100{width:100%;height:auto}::ng-deep figure.table{margin:2.2rem 0 1.5rem 1rem!important}::ng-deep .text-center{text-align:center}::ng-deep .text-left{text-align:left}::ng-deep .text-right{text-align:right}::ng-deep .fs-8{font-size:.5rem}::ng-deep .fs-10{font-size:.625rem}::ng-deep .fs-12{font-size:.75rem}::ng-deep .fs-14{font-size:.875rem}::ng-deep .fs-16{font-size:1rem}::ng-deep .fs-18{font-size:1.125rem}::ng-deep .fs-20{font-size:1.25rem}::ng-deep .fs-22{font-size:1.375rem}::ng-deep .fs-24{font-size:1.5rem}::ng-deep .fs-26{font-size:1.625rem}::ng-deep .fs-28{font-size:1.75rem}::ng-deep .fs-30{font-size:1.875rem}::ng-deep .fs-36{font-size:2.25rem}.upload-image-modal-section{border-radius:4px;width:100%;min-height:130px;background:#f5f9fc;border:1px dashed #024f9d}.upload-input-button input[type=file]{position:absolute;right:0;top:0;font-size:118px;margin:0;padding:0;cursor:pointer;opacity:0;height:100%}.upload-file-section{display:flex;height:240px;width:100%;max-width:800px;align-items:center;justify-content:center;flex-direction:column;margin:0 auto;background-color:#f5f9fc;border:1px dashed #80a7ce}.qq-uploader.qq-uploader-selector.custom-qq-uploader{background:inherit;border-color:none;border:none;max-height:inherit;min-height:inherit;overflow-y:inherit;width:688px;height:240px;display:flex;justify-content:center;align-items:center}.terms-and-condition{line-height:14px}.sb-info-bx{padding:.4rem!important}.sb-info-bx li{margin:0!important;padding:0!important}.sb-info-bx li:before{content:\"\"!important}.red{color:red}.b-bl{border-left:solid 1px #e4e1e1}.sb-form-fields .sb-field-group{margin:1rem 0}.sb-form-fields .sb-field{position:relative;margin-bottom:.5rem}.sb-form-fields .sb-field .sb-form-control{border:1px solid rgba(34,36,38,.15);width:100%;border-radius:.28571429rem;box-shadow:0 0 0 0 transparent inset;padding:.25rem .5rem!important}@keyframes spinner-border{to{transform:rotate(360deg)}}.sb-loading-spinner{width:1rem;height:1rem;margin-right:8px;border-width:.2em;display:inline-block;vertical-align:text-bottom;border:.15em solid currentColor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.sb-btn-loading:before{position:absolute;content:\"\";top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.15)}.sb-btn-loading:after{position:absolute;content:\"\";top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;animation:button-spin .6s linear;animation-iteration-count:infinite;border-radius:500rem;border-color:#fff transparent transparent;border-style:solid;border-width:.2em;box-shadow:0 0 0 1px transparent}.sb-btn-outline-disabled{background-color:#fff;border:1px solid #cccccc;color:#999;cursor:default;font-weight:400}.sb-color-grey{color:#666}.flex-jc-space-end{justify-content:flex-end!important}.fs-0785{font-size:.785rem!important}.ui.info.message{color:#276f86!important}.sb-textbox[disabled=true]{opacity:.3!important;font-weight:500!important}.sb-tabset-segment{min-height:288px;max-height:288px;overflow-y:auto}input:focus-visible{border:none!important}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.SuiModal, selector: "sui-modal", inputs: ["isClosable", "closeResult", "size", "isCentered", "isFullScreen", "isBasic", "mustScroll", "isInverted", "transition", "transitionDuration"], outputs: ["approved", "denied", "dismissed"] }, { kind: "component", type: i7.SuiTabset, selector: "sui-tabset" }, { kind: "directive", type: i7.SuiTabHeader, selector: "[suiTabHeader]", inputs: ["suiTabHeader", "isActive", "isDisabled"], outputs: ["isActiveChange", "activate", "deactivate"] }, { kind: "directive", type: i7.SuiTabContent, selector: "[suiTabContent]", inputs: ["suiTabContent"] }, { kind: "component", type: i8.DynamicFormComponent, selector: "sb-dynamic-form", inputs: ["config", "dataLoadStatusDelegate"], outputs: ["initialize", "finalize", "valueChanges", "statusChanges"] }, { kind: "directive", type: i9.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }] }); }
890
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CkeditorToolComponent, selector: "lib-ckeditor-tool", inputs: { editorDataInput: "editorDataInput", videoShow: "videoShow", setCharacterLimit: "setCharacterLimit", setImageLimit: "setImageLimit" }, outputs: { editorDataOutput: "editorDataOutput", hasError: "hasError", videoDataOutput: "videoDataOutput" }, viewQueries: [{ propertyName: "editorRef", first: true, predicate: ["editor"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"editorWrapper\" [ngClass]=\"{'hasError': limitExceeded}\">\n <button type=\"button\" data-tooltip=\"Add image\" data-position=\"bottom center\" data-variation=\"mini\" data-inverted=\"\"\n title=\"Add image\" [disabled]=\"isAssetBrowserReadOnly || isEditorFocused\" (click)=\"initializeImagePicker('question')\"\n class=\"ui icon button insert-image-btn\">\n <i class=\"image outline icon\" aria-hidden=\"true\"></i>\n </button>\n <textarea class=\"editor\" #editor name=\"question\" placeholder=\"\"></textarea>\n <div *ngIf=\"setCharacterLimit > 0\">\n <div class=\"characterCount\">\n {{configService.labelConfig?.lbl?.charactersLeft}} {{charactersLeft}}\n </div>\n </div>\n</div>\n\n<sui-modal [isClosable]=\"true\" class=\"sb-modal overflow-modal\" [isInverted]=\"false\" (dismissed)=\"dismissImagePicker()\"\n *ngIf=\"showImagePicker\" [size]=\"'normal'\" [isFullScreen]=\"false\" [mustScroll]=\"true\" #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.selectImage}}</div>\n <div class=\"sb-modal-content p-0\">\n <sui-tabset>\n <div class=\"sb-tabset-menu\">\n <a class=\"sb-item\" (activate)=\"getMyImages(0)\" suiTabHeader=\"1\">{{configService.labelConfig?.lbl?.myImages}}</a>\n <a class=\"sb-item\" (activate)=\"getAllImages(0)\" suiTabHeader=\"2\">{{configService.labelConfig?.lbl?.allImage}}</a>\n </div>\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadMyImages()\" suiTabContent=\"1\">\n <div class=\"ui pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchImages($event, 'myImages')\" class=\"sb-search-input\" [(ngModel)]=\"searchMyInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchImages('clearInput', 'myImages')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!myAssets?.length && searchMyInput\" class=\"fs-0785\"> {{emptyImageSearchMessage}} </div>\n <div class=\"sb-grid-layout image\">\n <div class=\"sb-video-content\" *ngFor=\"let data of myAssets\">\n <div class=\"sb-image-section relative position\">\n <img (click)=\"addImageInEditor(data.downloadUrl, data.identifier, data.name)\" alt=\"{{data?.name}}\" [src]=\"data.downloadUrl\">\n </div>\n </div>\n\n </div>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadAllImages()\" suiTabContent=\"2\">\n <div class=\"ui pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchImages($event, 'allImages')\" class=\"sb-search-input\" [(ngModel)]=\"searchAllInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchImages('clearInput', 'allImages')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\">{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!allImages?.length && searchAllInput\" class=\"fs-0785\"> {{emptyImageSearchMessage}} </div>\n <div class=\"sb-grid-layout image\">\n <div class=\"sb-video-content\" *ngFor=\"let data of allImages\">\n <div class=\"sb-image-section\">\n <img (click)=\"addImageInEditor(data.downloadUrl, data.identifier, data.name)\" alt=\"{{data?.name}}\" [src]=\"data.downloadUrl\">\n </div>\n </div>\n </div>\n\n </div>\n </sui-tabset>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-end\">\n <button (click)=\"openImageUploadModal();\" class=\"sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.upload_use_btn_label}}</button>\n </div>\n</sui-modal>\n\n<sui-modal [isClosable]=\"isClosable\" class=\"sb-modal overflow-modal\" [isInverted]=\"false\"\n (dismissed)=\"dismissVideoPicker()\" *ngIf=\"showVideoPicker\" [size]=\"'normal'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.selectVideo}}</div>\n <div class=\"sb-modal-content p-0\">\n <sui-tabset>\n <div class=\"sb-tabset-menu\">\n <a class=\"sb-item\" (activate)=\"getMyVideos(0)\" suiTabHeader=\"1\">{{configService.labelConfig?.lbl?.myVideos}}</a>\n <a class=\"sb-item\" (activate)=\"getAllVideos(0)\" suiTabHeader=\"2\">{{configService.labelConfig?.lbl?.allVideos}}</a>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadMyVideos()\" suiTabContent=\"1\">\n <div class=\"pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchVideo($event, 'myVideos')\" class=\"sb-search-input\" [(ngModel)]=\"searchMyInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchVideo('clearInput', 'myVideos')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!myAssets?.length && searchMyInput\" class=\"fs-0785\"> {{emptyVideoSearchMessage}} </div>\n <div class=\"sb-grid-layout video\">\n <div class=\"sb-video-content\" *ngFor=\"let data of myAssets\">\n <div class=\"sb-image-section relative position\" [ngClass]=\"{'active': selectedVideoId === data.identifier}\"\n (click)=\"selectVideo(data)\">\n <div class=\"overlay-image\"><i class=\"play circle icon\" aria-hidden=\"true\"></i></div>\n <i class=\"check circle icon selected-video\" aria-hidden=\"true\"></i>\n <img [src]=\"data.thumbnail\" alt=\"{{data?.name}}\">\n </div>\n </div>\n\n </div>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadAllVideos()\" suiTabContent=\"2\">\n <div class=\" pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchVideo($event, 'allVideos')\" class=\"sb-search-input\" [(ngModel)]=\"searchAllInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchVideo('clearInput', 'allVideos')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!allVideos?.length && searchAllInput\" class=\"fs-0785\"> {{emptyVideoSearchMessage}} </div>\n <div class=\"sb-grid-layout video\">\n <div class=\"sb-video-content\" *ngFor=\"let data of allVideos\">\n <div class=\"sb-image-section relative position\" [ngClass]=\"{'active': selectedVideoId === data.identifier}\"\n (click)=\"selectVideo(data);\">\n <div class=\"overlay-image\"><i class=\"play circle icon\" aria-hidden=\"true\"></i></div>\n <i class=\"check circle icon selected-video\" aria-hidden=\"true\"></i>\n <img [src]=\"data.thumbnail\" alt=\"{{data?.name}}\">\n </div>\n </div>\n </div>\n </div>\n </sui-tabset>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between pl-20\">\n <div>\n <button (click)=\"addVideoInEditor();\" class=\"sb-btn sb-btn-normal\"\n [ngClass]=\"{'sb-btn-primary': showAddButton, 'sb-btn-disabled': !showAddButton}\">{{configService.labelConfig?.button_labels?.add_btn_label}}</button>\n </div>\n <div>\n <button (click)=\"openVideoUploadModal();\" class=\"sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.upload_use_btn_label}}</button>\n </div>\n </div>\n</sui-modal>\n\n<!-- Upload image pop up code here -->\n\n<sui-modal class=\"sb-modal overflow-modal\" [isClosable]=\"isClosable\" [isInverted]=\"false\"\n (dismissed)=\"dismissImageUploadModal()\" *ngIf=\"showImageUploadModal\" [size]=\"'large'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" appBodyScroll #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.uploadAndUse}}</div>\n <div class=\"p-10 sb-bg-white\">\n <div class=\"d-flex\">\n <div class=\"w-50\">\n <div class=\"content\">\n <h6 class=\"mb-8 fs-normal\">{{configService.labelConfig?.lbl?.chooseOrDragImage}}<span class=\"red\">*</span></h6>\n <div class=\"upload-image-modal-section d-flex flex-ai-center flex-jc-center flex-dc\">\n <ng-container>\n <button class=\"upload-input-button sb-btn sb-btn-success sb-btn-normal\">\n {{configService.labelConfig?.button_labels?.upload_from_computer_btn_label}}\n <input (change)=\"uploadImage($event)\" type=\"file\" [accept]=\"acceptImageType\" name=\"assetfile\">\n </button>\n <div class=\"py-10 fs-0-785 sb-color-primary\" *ngIf=\"imageUploadLoader\"> {{assetName}} </div>\n <span class=\"fsmall mt-8\">{{configService.labelConfig?.lbl?.upload}} {{assetConfig.image.accepted}} ({{configService.labelConfig?.lbl?.maxFileSize}}\n {{assetConfig.image.size}}{{assetConfig.image.sizeType}})</span>\n <div *ngIf=\"showErrorMsg\" class=\"sb-color-error fsmall mt-8\">\n <p>{{errorMsg}}</p>\n </div>\n </ng-container>\n </div>\n <div class=\"ui info message sb-info-bx\">\n <ul class=\"list\">\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.allowedFileTypes}} {{assetConfig.image.accepted}}</li>\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.maximumAllowedFileSize}} {{assetConfig.image.size}}{{assetConfig.image.sizeType}}</li>\n </ul>\n </div>\n <h6 class=\"fs-0785\">{{configService.labelConfig?.lbl?.copyRightsAndLicense}}<span class=\"red\">*</span></h6>\n <p class=\"fsmall mt-8 terms-and-condition\">{{termsAndCondition}}</p>\n </div>\n </div>\n <div class=\"w-50 pl-10 ml-10 b-bl\">\n <div class=\"ui info message sb-info-bx mb-0\">\n <ul class=\"list\">\n <li class=\"fs-0785 font-weight-bold\">\n <i class=\"icon info circle\" aria-hidden=\"true\"></i>\n {{configService.labelConfig?.lbl?.dropChooseFile}}</li>\n </ul>\n </div>\n <div class=\"sb-form-fields\">\n <div class=\"form-container upload-form\">\n <sb-dynamic-form [config]=\"formConfig\" (statusChanges)=\"onStatusChanges($event)\"\n (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between p-0\">\n <div>\n <button (click)=\"dismissPops(modal);\" class=\"mr-10 sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.cancel_btn_label}}</button>\n <button type=\"button\" class=\"sb-btn sb-btn-normal text-left sb-btn-loading-spinner sb-btn-primary\"\n [disabled]=\"!imageFormValid\" (click)=\"uploadAndUseImage(modal);\" \n [ngClass]=\"{'sb-btn-primary': imageFormValid, 'sb-btn-disabled': !imageFormValid}\">\n <div class=\"sb-loading-spinner\" *ngIf=\"loading\" role=\"status\" aria-hidden=\"true\"></div>\n {{configService.labelConfig?.button_labels?.upload_use_btn_label}}\n </button>\n </div>\n <div>\n <button (click)=\"dismissImageUploadModal();\" class=\" sb-btn sb-btn-primary sb-btn-normal\"> {{configService.labelConfig?.button_labels?.back_btn_label}}</button>\n </div>\n </div>\n </div>\n</sui-modal>\n\n<!-- Upload video pop up code here -->\n<sui-modal class=\"sb-modal overflow-modal\" [isClosable]=\"isClosable\" [isInverted]=\"false\"\n (dismissed)=\"dismissVideoUploadModal()\" *ngIf=\"showVideoUploadModal\" [size]=\"'large'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" appBodyScroll #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.uploadAndUse}}</div>\n <div class=\"p-10 sb-bg-white\">\n <div class=\"d-flex\">\n <div class=\"w-50\">\n <div class=\"content\">\n <h6 class=\"mb-8 fs-normal\">{{configService.labelConfig?.lbl?.chooseOrDragVideo}}<span class=\"red\">*</span></h6>\n <div class=\"upload-image-modal-section d-flex flex-ai-center flex-jc-center flex-dc\">\n <ng-container>\n <button class=\"upload-input-button sb-btn sb-btn-success sb-btn-normal\">\n {{configService.labelConfig?.button_labels?.upload_from_computer_btn_label}}\n <input (change)=\"uploadVideoFromLocal($event)\" type=\"file\" [accept]=\"acceptVideoType\" name=\"assetfile\">\n </button>\n <div class=\"py-10 fs-0-785 sb-color-primary\" *ngIf=\"imageUploadLoader\"> {{videoFile?.name}} </div>\n <span class=\"fsmall mt-8\">{{configService.labelConfig?.lbl?.upload}} {{assetConfig.video.accepted}} ({{configService.labelConfig?.lbl?.maxFileSize}}\n {{assetConfig.video.size}}{{assetConfig.video.sizeType}})</span>\n <div *ngIf=\"showErrorMsg\" class=\"sb-color-error fsmall mt-8\">\n <p>{{errorMsg}}</p>\n </div>\n </ng-container>\n </div>\n <div class=\"ui info message sb-info-bx\">\n <ul class=\"list\">\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.allowedFileTypes}} {{assetConfig.video.accepted}}</li>\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.maximumAllowedFileSize}} {{assetConfig.video.size}}{{assetConfig.video.sizeType}}</li>\n </ul>\n </div>\n <h6 class=\"fs-0785\">{{configService.labelConfig?.lbl?.copyRightsAndLicense}}<span class=\"red\">*</span></h6>\n <p class=\"fsmall mt-8 terms-and-condition\">{{termsAndCondition}}</p>\n </div>\n </div>\n <div class=\"w-50 pl-10 ml-10 b-bl\">\n <div class=\"ui info message sb-info-bx mb-0\">\n <ul class=\"list\">\n <li class=\"fs-0785 font-weight-bold\">\n <i class=\"icon info circle\" aria-hidden=\"true\"></i>\n {{configService.labelConfig?.lbl?.dropChooseFile}}</li>\n </ul>\n </div>\n <div class=\"sb-form-fields\">\n <div class=\"form-container upload-form\">\n <sb-dynamic-form [config]=\"formConfig\" (statusChanges)=\"onStatusChanges($event)\"\n (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between p-0\">\n <div>\n <button (click)=\"dismissVideoPops(modal);\" class=\"mr-10 sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.cancel_btn_label}}</button>\n <button type=\"button\" class=\"sb-btn sb-btn-normal text-left sb-btn-loading-spinner sb-btn-primary\"\n [disabled]=\"!imageFormValid\" (click)=\"uploadVideo(modal);\" \n [ngClass]=\"{'sb-btn-primary': imageFormValid, 'sb-btn-disabled': !imageFormValid}\">\n <div class=\"sb-loading-spinner\" *ngIf=\"loading\" role=\"status\" aria-hidden=\"true\"></div>\n {{configService.labelConfig?.lbl?.uploadAndUse}}\n </button>\n </div>\n <div>\n <button (click)=\"dismissVideoUploadModal();\" class=\" sb-btn sb-btn-primary sb-btn-normal\"> {{configService.labelConfig?.button_labels?.back_btn_label}}</button>\n </div>\n </div>\n </div>\n</sui-modal>", styles: [".editorWrapper{border:0px solid white}.editorWrapper.hasError{border:1px solid red;border-radius:2px}.characterCount{text-align:right;border-top:0;padding-right:7px;font-size:11px;font-weight:700;margin-top:-16px;position:relative}.custom-image img{border:1px dotted;padding:7px;margin:6px;cursor:pointer}.resource-image{height:180px!important}.asset_container{overflow-y:auto;overflow-x:hidden;min-height:300px!important;max-height:300px!important;padding:5px}.insert-image-btn{position:absolute;z-index:1;left:653px;background-color:transparent;padding:12px 14px!important;margin-left:6px}.insert-image-btn>.icon{opacity:1}.insert-image-btn:active{background-color:transparent}.upload-file-description p{color:#999}.upload-file-description ul{margin:0;list-style:disc}.upload-file-description ul li{margin-bottom:8px}.upload-file-description ul li a{cursor:pointer;font-size:12px}.sb-grid-layout{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));grid-gap:16px}.sb-grid-layout.image{grid-template-columns:repeat(auto-fill,minmax(96px,1fr))}.sb-grid-layout.video{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}.sb-grid-layout .sb-video-content .sb-image-section{height:96px;overflow:hidden;border-radius:4px;box-shadow:inset 0 1px 3px #00000080}.sb-image-section .selected-video{display:none}.sb-image-section.active .selected-video{position:absolute;right:4px;top:4px;color:#07bc81;font-size:20px;display:block}.sb-grid-layout .sb-video-content .sb-image-section img{width:100%;height:100%;cursor:pointer}.overlay-image{width:100%;height:100%;background:#0000004d;position:absolute;left:0;right:0;cursor:pointer}.overlay-image .play.icon{position:absolute;transform:translate(-50%,-50%);top:50%;left:50%;color:#fff9;font-size:32px;cursor:pointer}::ng-deep .ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar,::ng-deep .ck.ck-editor__top .ck-sticky-panel .ck-toolbar.ck-rounded-corners{border-left:none;border-right:none;border-bottom:1px solid #c4c4c4;border-radius:0}::ng-deep .ck-rounded-corners .ck.ck-editor__main>.ck-editor__editable,::ng-deep .ck.ck-editor__main>.ck-editor__editable.ck-rounded-corners{border:none}::ng-deep .ck-dropdown.ck-font-size-dropdown .ck-dropdown__panel{height:150px;overflow-y:scroll}::ng-deep figure.image.ck-widget{width:auto;height:auto;overflow:visible}::ng-deep figure.image img{width:100%}::ng-deep figure.image.resize-25{width:25%;height:auto}::ng-deep figure.image.resize-50{width:50%;height:auto}::ng-deep figure.image.resize-75{width:75%;height:auto}::ng-deep figure.image.resize-100{width:100%;height:auto}::ng-deep figure.table{margin:2.2rem 0 1.5rem 1rem!important}::ng-deep .text-center{text-align:center}::ng-deep .text-left{text-align:left}::ng-deep .text-right{text-align:right}::ng-deep .fs-8{font-size:.5rem}::ng-deep .fs-10{font-size:.625rem}::ng-deep .fs-12{font-size:.75rem}::ng-deep .fs-14{font-size:.875rem}::ng-deep .fs-16{font-size:1rem}::ng-deep .fs-18{font-size:1.125rem}::ng-deep .fs-20{font-size:1.25rem}::ng-deep .fs-22{font-size:1.375rem}::ng-deep .fs-24{font-size:1.5rem}::ng-deep .fs-26{font-size:1.625rem}::ng-deep .fs-28{font-size:1.75rem}::ng-deep .fs-30{font-size:1.875rem}::ng-deep .fs-36{font-size:2.25rem}.upload-image-modal-section{border-radius:4px;width:100%;min-height:130px;background:#f5f9fc;border:1px dashed #024f9d}.upload-input-button input[type=file]{position:absolute;right:0;top:0;font-size:118px;margin:0;padding:0;cursor:pointer;opacity:0;height:100%}.upload-file-section{display:flex;height:240px;width:100%;max-width:800px;align-items:center;justify-content:center;flex-direction:column;margin:0 auto;background-color:#f5f9fc;border:1px dashed #80a7ce}.qq-uploader.qq-uploader-selector.custom-qq-uploader{background:inherit;border-color:none;border:none;max-height:inherit;min-height:inherit;overflow-y:inherit;width:688px;height:240px;display:flex;justify-content:center;align-items:center}.terms-and-condition{line-height:14px}.sb-info-bx{padding:.4rem!important}.sb-info-bx li{margin:0!important;padding:0!important}.sb-info-bx li:before{content:\"\"!important}.red{color:red}.b-bl{border-left:solid 1px #e4e1e1}.sb-form-fields .sb-field-group{margin:1rem 0}.sb-form-fields .sb-field{position:relative;margin-bottom:.5rem}.sb-form-fields .sb-field .sb-form-control{border:1px solid rgba(34,36,38,.15);width:100%;border-radius:.28571429rem;box-shadow:0 0 0 0 transparent inset;padding:.25rem .5rem!important}@keyframes spinner-border{to{transform:rotate(360deg)}}.sb-loading-spinner{width:1rem;height:1rem;margin-right:8px;border-width:.2em;display:inline-block;vertical-align:text-bottom;border:.15em solid currentColor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.sb-btn-loading:before{position:absolute;content:\"\";top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.15)}.sb-btn-loading:after{position:absolute;content:\"\";top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;animation:button-spin .6s linear;animation-iteration-count:infinite;border-radius:500rem;border-color:#fff transparent transparent;border-style:solid;border-width:.2em;box-shadow:0 0 0 1px transparent}.sb-btn-outline-disabled{background-color:#fff;border:1px solid #cccccc;color:#999;cursor:default;font-weight:400}.sb-color-grey{color:#666}.flex-jc-space-end{justify-content:flex-end!important}.fs-0785{font-size:.785rem!important}.ui.info.message{color:#276f86!important}.sb-textbox[disabled=true]{opacity:.3!important;font-weight:500!important}.sb-tabset-segment{min-height:288px;max-height:288px;overflow-y:auto}input:focus-visible{border:none!important}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.SuiModal, selector: "sui-modal", inputs: ["isClosable", "closeResult", "size", "isCentered", "isFullScreen", "isBasic", "mustScroll", "isInverted", "transition", "transitionDuration"], outputs: ["approved", "denied", "dismissed"] }, { kind: "component", type: i7.SuiTabset, selector: "sui-tabset" }, { kind: "directive", type: i7.SuiTabHeader, selector: "[suiTabHeader]", inputs: ["suiTabHeader", "isActive", "isDisabled"], outputs: ["isActiveChange", "activate", "deactivate"] }, { kind: "directive", type: i7.SuiTabContent, selector: "[suiTabContent]", inputs: ["suiTabContent"] }, { kind: "component", type: i8.DynamicFormComponent, selector: "sb-dynamic-form", inputs: ["config", "dataLoadStatusDelegate"], outputs: ["initialize", "finalize", "valueChanges", "statusChanges"] }, { kind: "directive", type: i9.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }] }); }
873
891
  }
874
892
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CkeditorToolComponent, decorators: [{
875
893
  type: Component,
876
- args: [{ selector: 'lib-ckeditor-tool', template: "<div class=\"editorWrapper\" [ngClass]=\"{'hasError': limitExceeded}\">\n <button type=\"button\" data-tooltip=\"Add image\" data-position=\"bottom center\" data-variation=\"mini\" data-inverted=\"\"\n title=\"Add image\" [disabled]=\"isAssetBrowserReadOnly || isEditorFocused\" (click)=\"initializeImagePicker('question')\"\n class=\"ui icon button insert-image-btn\">\n <i class=\"image outline icon\" aria-hidden=\"true\"></i>\n </button>\n <textarea class=\"editor\" #editor name=\"question\" placeholder=\"\"></textarea>\n <div *ngIf=\"setCharacterLimit > 0\">\n <div class=\"characterCount\">\n {{configService.labelConfig?.lbl?.charactersLeft}} {{charactersLeft}}\n </div>\n </div>\n</div>\n\n<sui-modal [isClosable]=\"true\" class=\"sb-modal overflow-modal\" [isInverted]=\"false\" (dismissed)=\"dismissImagePicker()\"\n *ngIf=\"showImagePicker\" [size]=\"'normal'\" [isFullScreen]=\"false\" [mustScroll]=\"true\" #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.selectImage}}</div>\n <div class=\"sb-modal-content p-0\">\n <sui-tabset>\n <div class=\"sb-tabset-menu\">\n <a class=\"sb-item\" (activate)=\"getMyImages(0)\" suiTabHeader=\"1\">{{configService.labelConfig?.lbl?.myImages}}</a>\n <a class=\"sb-item\" (activate)=\"getAllImages(0)\" suiTabHeader=\"2\">{{configService.labelConfig?.lbl?.allImage}}</a>\n </div>\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadMyImages()\" suiTabContent=\"1\">\n <div class=\"ui pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchImages($event, 'myImages')\" class=\"sb-search-input\" [(ngModel)]=\"searchMyInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchImages('clearInput', 'myImages')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!myAssets?.length && searchMyInput\" class=\"fs-0785\"> {{emptyImageSearchMessage}} </div>\n <div class=\"sb-grid-layout image\">\n <div class=\"sb-video-content\" *ngFor=\"let data of myAssets\">\n <div class=\"sb-image-section relative position\">\n <img (click)=\"addImageInEditor(data.downloadUrl, data.identifier)\" [src]=\"data.downloadUrl\">\n </div>\n </div>\n\n </div>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadAllImages()\" suiTabContent=\"2\">\n <div class=\"ui pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchImages($event, 'allImages')\" class=\"sb-search-input\" [(ngModel)]=\"searchAllInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchImages('clearInput', 'allImages')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\">{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!allImages?.length && searchAllInput\" class=\"fs-0785\"> {{emptyImageSearchMessage}} </div>\n <div class=\"sb-grid-layout image\">\n <div class=\"sb-video-content\" *ngFor=\"let data of allImages\">\n <div class=\"sb-image-section\">\n <img (click)=\"addImageInEditor(data.downloadUrl, data.identifier)\" [src]=\"data.downloadUrl\">\n </div>\n </div>\n </div>\n\n </div>\n </sui-tabset>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-end\">\n <button (click)=\"openImageUploadModal();\" class=\"sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.upload_use_btn_label}}</button>\n </div>\n</sui-modal>\n\n<sui-modal [isClosable]=\"isClosable\" class=\"sb-modal overflow-modal\" [isInverted]=\"false\"\n (dismissed)=\"dismissVideoPicker()\" *ngIf=\"showVideoPicker\" [size]=\"'normal'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.selectVideo}}</div>\n <div class=\"sb-modal-content p-0\">\n <sui-tabset>\n <div class=\"sb-tabset-menu\">\n <a class=\"sb-item\" (activate)=\"getMyVideos(0)\" suiTabHeader=\"1\">{{configService.labelConfig?.lbl?.myVideos}}</a>\n <a class=\"sb-item\" (activate)=\"getAllVideos(0)\" suiTabHeader=\"2\">{{configService.labelConfig?.lbl?.allVideos}}</a>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadMyVideos()\" suiTabContent=\"1\">\n <div class=\"pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchVideo($event, 'myVideos')\" class=\"sb-search-input\" [(ngModel)]=\"searchMyInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchVideo('clearInput', 'myVideos')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!myAssets?.length && searchMyInput\" class=\"fs-0785\"> {{emptyVideoSearchMessage}} </div>\n <div class=\"sb-grid-layout video\">\n <div class=\"sb-video-content\" *ngFor=\"let data of myAssets\">\n <div class=\"sb-image-section relative position\" [ngClass]=\"{'active': selectedVideoId === data.identifier}\"\n (click)=\"selectVideo(data)\">\n <div class=\"overlay-image\"><i class=\"play circle icon\" aria-hidden=\"true\"></i></div>\n <i class=\"check circle icon selected-video\" aria-hidden=\"true\"></i>\n <img [src]=\"data.thumbnail\">\n </div>\n </div>\n\n </div>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadAllVideos()\" suiTabContent=\"2\">\n <div class=\" pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchVideo($event, 'allVideos')\" class=\"sb-search-input\" [(ngModel)]=\"searchAllInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchVideo('clearInput', 'allVideos')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!allVideos?.length && searchAllInput\" class=\"fs-0785\"> {{emptyVideoSearchMessage}} </div>\n <div class=\"sb-grid-layout video\">\n <div class=\"sb-video-content\" *ngFor=\"let data of allVideos\">\n <div class=\"sb-image-section relative position\" [ngClass]=\"{'active': selectedVideoId === data.identifier}\"\n (click)=\"selectVideo(data);\">\n <div class=\"overlay-image\"><i class=\"play circle icon\" aria-hidden=\"true\"></i></div>\n <i class=\"check circle icon selected-video\" aria-hidden=\"true\"></i>\n <img [src]=\"data.thumbnail\">\n </div>\n </div>\n </div>\n </div>\n </sui-tabset>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between pl-20\">\n <div>\n <button (click)=\"addVideoInEditor();\" class=\"sb-btn sb-btn-normal\"\n [ngClass]=\"{'sb-btn-primary': showAddButton, 'sb-btn-disabled': !showAddButton}\">{{configService.labelConfig?.button_labels?.add_btn_label}}</button>\n </div>\n <div>\n <button (click)=\"openVideoUploadModal();\" class=\"sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.upload_use_btn_label}}</button>\n </div>\n </div>\n</sui-modal>\n\n<!-- Upload image pop up code here -->\n\n<sui-modal class=\"sb-modal overflow-modal\" [isClosable]=\"true\" [isInverted]=\"false\"\n (dismissed)=\"dismissImageUploadModal()\" *ngIf=\"showImageUploadModal\" [size]=\"'large'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" appBodyScroll #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.uploadAndUse}}</div>\n <div class=\"p-10 sb-bg-white\">\n <div class=\"d-flex\">\n <div class=\"w-50\">\n <div class=\"content\">\n <h6 class=\"mb-8 fs-normal\">{{configService.labelConfig?.lbl?.chooseOrDragImage}}<span class=\"red\">*</span></h6>\n <div class=\"upload-image-modal-section d-flex flex-ai-center flex-jc-center flex-dc\">\n <ng-container>\n <button class=\"upload-input-button sb-btn sb-btn-success sb-btn-normal\">\n {{configService.labelConfig?.button_labels?.upload_from_computer_btn_label}}\n <input (change)=\"uploadImage($event)\" type=\"file\" [accept]=\"acceptImageType\" name=\"assetfile\">\n </button>\n <div class=\"py-10 fs-0-785 sb-color-primary\" *ngIf=\"imageUploadLoader\"> {{assetName}} </div>\n <span class=\"fsmall mt-8\">{{configService.labelConfig?.lbl?.upload}} {{assetConfig.image.accepted}} ({{configService.labelConfig?.lbl?.maxFileSize}}\n {{assetConfig.image.size}}{{assetConfig.image.sizeType}})</span>\n <div *ngIf=\"showErrorMsg\" class=\"sb-color-error fsmall mt-8\">\n <p>{{errorMsg}}</p>\n </div>\n </ng-container>\n </div>\n <div class=\"ui info message sb-info-bx\">\n <ul class=\"list\">\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.allowedFileTypes}} {{assetConfig.image.accepted}}</li>\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.maximumAllowedFileSize}} {{assetConfig.image.size}}{{assetConfig.image.sizeType}}</li>\n </ul>\n </div>\n <h6 class=\"fs-0785\">{{configService.labelConfig?.lbl?.copyRightsAndLicense}}<span class=\"red\">*</span></h6>\n <p class=\"fsmall mt-8 terms-and-condition\">{{termsAndCondition}}</p>\n </div>\n </div>\n <div class=\"w-50 pl-10 ml-10 b-bl\">\n <div class=\"ui info message sb-info-bx mb-0\">\n <ul class=\"list\">\n <li class=\"fs-0785 font-weight-bold\">\n <i class=\"icon info circle\" aria-hidden=\"true\"></i>\n {{configService.labelConfig?.lbl?.dropChooseFile}}</li>\n </ul>\n </div>\n <div class=\"sb-form-fields\">\n <div class=\"form-container upload-form\">\n <sb-dynamic-form [config]=\"formConfig\" (statusChanges)=\"onStatusChanges($event)\"\n (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between p-0\">\n <div>\n <button (click)=\"dismissPops(modal);\" class=\"mr-10 sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.cancel_btn_label}}</button>\n\n <button (click)=\"uploadAndUseImage(modal);\" [disabled]=\"!imageFormValid\"\n [ngClass]=\"{'sb-btn-primary': imageFormValid, 'sb-btn-disabled': !imageFormValid}\"\n class=\"sb-btn sb-btn-normal text-left\">{{configService.labelConfig?.button_labels?.upload_use_btn_label}} \n </button>\n </div>\n <div>\n <button (click)=\"dismissImageUploadModal();\" class=\" sb-btn sb-btn-primary sb-btn-normal\"> {{configService.labelConfig?.button_labels?.back_btn_label}}</button>\n </div>\n </div>\n </div>\n</sui-modal>\n\n<!-- Upload video pop up code here -->\n<sui-modal class=\"sb-modal overflow-modal\" [isClosable]=\"isClosable\" [isInverted]=\"false\"\n (dismissed)=\"dismissVideoUploadModal()\" *ngIf=\"showVideoUploadModal\" [size]=\"'large'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" appBodyScroll #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.uploadAndUse}}</div>\n <div class=\"p-10 sb-bg-white\">\n <div class=\"d-flex\">\n <div class=\"w-50\">\n <div class=\"content\">\n <h6 class=\"mb-8 fs-normal\">{{configService.labelConfig?.lbl?.chooseOrDragVideo}}<span class=\"red\">*</span></h6>\n <div class=\"upload-image-modal-section d-flex flex-ai-center flex-jc-center flex-dc\">\n <ng-container>\n <button class=\"upload-input-button sb-btn sb-btn-success sb-btn-normal\">\n {{configService.labelConfig?.button_labels?.upload_from_computer_btn_label}}\n <input (change)=\"uploadVideoFromLocal($event)\" type=\"file\" [accept]=\"acceptVideoType\" name=\"assetfile\">\n </button>\n <div class=\"py-10 fs-0-785 sb-color-primary\" *ngIf=\"imageUploadLoader\"> {{videoFile?.name}} </div>\n <span class=\"fsmall mt-8\">{{configService.labelConfig?.lbl?.upload}} {{assetConfig.video.accepted}} ({{configService.labelConfig?.lbl?.maxFileSize}}\n {{assetConfig.video.size}}{{assetConfig.video.sizeType}})</span>\n <div *ngIf=\"showErrorMsg\" class=\"sb-color-error fsmall mt-8\">\n <p>{{errorMsg}}</p>\n </div>\n </ng-container>\n </div>\n <div class=\"ui info message sb-info-bx\">\n <ul class=\"list\">\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.allowedFileTypes}} {{assetConfig.video.accepted}}</li>\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.maximumAllowedFileSize}} {{assetConfig.video.size}}{{assetConfig.video.sizeType}}</li>\n </ul>\n </div>\n <h6 class=\"fs-0785\">{{configService.labelConfig?.lbl?.copyRightsAndLicense}}<span class=\"red\">*</span></h6>\n <p class=\"fsmall mt-8 terms-and-condition\">{{termsAndCondition}}</p>\n </div>\n </div>\n <div class=\"w-50 pl-10 ml-10 b-bl\">\n <div class=\"ui info message sb-info-bx mb-0\">\n <ul class=\"list\">\n <li class=\"fs-0785 font-weight-bold\">\n <i class=\"icon info circle\" aria-hidden=\"true\"></i>\n {{configService.labelConfig?.lbl?.dropChooseFile}}</li>\n </ul>\n </div>\n <div class=\"sb-form-fields\">\n <div class=\"form-container upload-form\">\n <sb-dynamic-form [config]=\"formConfig\" (statusChanges)=\"onStatusChanges($event)\"\n (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between p-0\">\n <div>\n <button (click)=\"dismissVideoPops(modal);\" class=\"mr-10 sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.cancel_btn_label}}</button>\n <button type=\"button\" class=\"sb-btn sb-btn-normal text-left sb-btn-loading-spinner sb-btn-primary\"\n [disabled]=\"!imageFormValid\" (click)=\"uploadVideo(modal);\" \n [ngClass]=\"{'sb-btn-primary': imageFormValid, 'sb-btn-disabled': !imageFormValid}\">\n <div class=\"sb-loading-spinner\" *ngIf=\"loading\" role=\"status\" aria-hidden=\"true\"></div>\n {{configService.labelConfig?.lbl?.uploadAndUse}}\n </button>\n </div>\n <div>\n <button (click)=\"dismissVideoUploadModal();\" class=\" sb-btn sb-btn-primary sb-btn-normal\"> {{configService.labelConfig?.button_labels?.back_btn_label}}</button>\n </div>\n </div>\n </div>\n</sui-modal>", styles: [".editorWrapper{border:0px solid white}.editorWrapper.hasError{border:1px solid red;border-radius:2px}.characterCount{text-align:right;border-top:0;padding-right:7px;font-size:11px;font-weight:700;margin-top:-16px;position:relative}.custom-image img{border:1px dotted;padding:7px;margin:6px;cursor:pointer}.resource-image{height:180px!important}.asset_container{overflow-y:auto;overflow-x:hidden;min-height:300px!important;max-height:300px!important;padding:5px}.insert-image-btn{position:absolute;z-index:1;left:653px;background-color:transparent;padding:12px 14px!important;margin-left:6px}.insert-image-btn>.icon{opacity:1}.insert-image-btn:active{background-color:transparent}.upload-file-description p{color:#999}.upload-file-description ul{margin:0;list-style:disc}.upload-file-description ul li{margin-bottom:8px}.upload-file-description ul li a{cursor:pointer;font-size:12px}.sb-grid-layout{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));grid-gap:16px}.sb-grid-layout.image{grid-template-columns:repeat(auto-fill,minmax(96px,1fr))}.sb-grid-layout.video{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}.sb-grid-layout .sb-video-content .sb-image-section{height:96px;overflow:hidden;border-radius:4px;box-shadow:inset 0 1px 3px #00000080}.sb-image-section .selected-video{display:none}.sb-image-section.active .selected-video{position:absolute;right:4px;top:4px;color:#07bc81;font-size:20px;display:block}.sb-grid-layout .sb-video-content .sb-image-section img{width:100%;height:100%;cursor:pointer}.overlay-image{width:100%;height:100%;background:#0000004d;position:absolute;left:0;right:0;cursor:pointer}.overlay-image .play.icon{position:absolute;transform:translate(-50%,-50%);top:50%;left:50%;color:#fff9;font-size:32px;cursor:pointer}::ng-deep .ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar,::ng-deep .ck.ck-editor__top .ck-sticky-panel .ck-toolbar.ck-rounded-corners{border-left:none;border-right:none;border-bottom:1px solid #c4c4c4;border-radius:0}::ng-deep .ck-rounded-corners .ck.ck-editor__main>.ck-editor__editable,::ng-deep .ck.ck-editor__main>.ck-editor__editable.ck-rounded-corners{border:none}::ng-deep .ck-dropdown.ck-font-size-dropdown .ck-dropdown__panel{height:150px;overflow-y:scroll}::ng-deep figure.image.ck-widget{width:auto;height:auto;overflow:visible}::ng-deep figure.image img{width:100%}::ng-deep figure.image.resize-25{width:25%;height:auto}::ng-deep figure.image.resize-50{width:50%;height:auto}::ng-deep figure.image.resize-75{width:75%;height:auto}::ng-deep figure.image.resize-100{width:100%;height:auto}::ng-deep figure.table{margin:2.2rem 0 1.5rem 1rem!important}::ng-deep .text-center{text-align:center}::ng-deep .text-left{text-align:left}::ng-deep .text-right{text-align:right}::ng-deep .fs-8{font-size:.5rem}::ng-deep .fs-10{font-size:.625rem}::ng-deep .fs-12{font-size:.75rem}::ng-deep .fs-14{font-size:.875rem}::ng-deep .fs-16{font-size:1rem}::ng-deep .fs-18{font-size:1.125rem}::ng-deep .fs-20{font-size:1.25rem}::ng-deep .fs-22{font-size:1.375rem}::ng-deep .fs-24{font-size:1.5rem}::ng-deep .fs-26{font-size:1.625rem}::ng-deep .fs-28{font-size:1.75rem}::ng-deep .fs-30{font-size:1.875rem}::ng-deep .fs-36{font-size:2.25rem}.upload-image-modal-section{border-radius:4px;width:100%;min-height:130px;background:#f5f9fc;border:1px dashed #024f9d}.upload-input-button input[type=file]{position:absolute;right:0;top:0;font-size:118px;margin:0;padding:0;cursor:pointer;opacity:0;height:100%}.upload-file-section{display:flex;height:240px;width:100%;max-width:800px;align-items:center;justify-content:center;flex-direction:column;margin:0 auto;background-color:#f5f9fc;border:1px dashed #80a7ce}.qq-uploader.qq-uploader-selector.custom-qq-uploader{background:inherit;border-color:none;border:none;max-height:inherit;min-height:inherit;overflow-y:inherit;width:688px;height:240px;display:flex;justify-content:center;align-items:center}.terms-and-condition{line-height:14px}.sb-info-bx{padding:.4rem!important}.sb-info-bx li{margin:0!important;padding:0!important}.sb-info-bx li:before{content:\"\"!important}.red{color:red}.b-bl{border-left:solid 1px #e4e1e1}.sb-form-fields .sb-field-group{margin:1rem 0}.sb-form-fields .sb-field{position:relative;margin-bottom:.5rem}.sb-form-fields .sb-field .sb-form-control{border:1px solid rgba(34,36,38,.15);width:100%;border-radius:.28571429rem;box-shadow:0 0 0 0 transparent inset;padding:.25rem .5rem!important}@keyframes spinner-border{to{transform:rotate(360deg)}}.sb-loading-spinner{width:1rem;height:1rem;margin-right:8px;border-width:.2em;display:inline-block;vertical-align:text-bottom;border:.15em solid currentColor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.sb-btn-loading:before{position:absolute;content:\"\";top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.15)}.sb-btn-loading:after{position:absolute;content:\"\";top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;animation:button-spin .6s linear;animation-iteration-count:infinite;border-radius:500rem;border-color:#fff transparent transparent;border-style:solid;border-width:.2em;box-shadow:0 0 0 1px transparent}.sb-btn-outline-disabled{background-color:#fff;border:1px solid #cccccc;color:#999;cursor:default;font-weight:400}.sb-color-grey{color:#666}.flex-jc-space-end{justify-content:flex-end!important}.fs-0785{font-size:.785rem!important}.ui.info.message{color:#276f86!important}.sb-textbox[disabled=true]{opacity:.3!important;font-weight:500!important}.sb-tabset-segment{min-height:288px;max-height:288px;overflow-y:auto}input:focus-visible{border:none!important}\n"] }]
894
+ args: [{ selector: 'lib-ckeditor-tool', template: "<div class=\"editorWrapper\" [ngClass]=\"{'hasError': limitExceeded}\">\n <button type=\"button\" data-tooltip=\"Add image\" data-position=\"bottom center\" data-variation=\"mini\" data-inverted=\"\"\n title=\"Add image\" [disabled]=\"isAssetBrowserReadOnly || isEditorFocused\" (click)=\"initializeImagePicker('question')\"\n class=\"ui icon button insert-image-btn\">\n <i class=\"image outline icon\" aria-hidden=\"true\"></i>\n </button>\n <textarea class=\"editor\" #editor name=\"question\" placeholder=\"\"></textarea>\n <div *ngIf=\"setCharacterLimit > 0\">\n <div class=\"characterCount\">\n {{configService.labelConfig?.lbl?.charactersLeft}} {{charactersLeft}}\n </div>\n </div>\n</div>\n\n<sui-modal [isClosable]=\"true\" class=\"sb-modal overflow-modal\" [isInverted]=\"false\" (dismissed)=\"dismissImagePicker()\"\n *ngIf=\"showImagePicker\" [size]=\"'normal'\" [isFullScreen]=\"false\" [mustScroll]=\"true\" #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.selectImage}}</div>\n <div class=\"sb-modal-content p-0\">\n <sui-tabset>\n <div class=\"sb-tabset-menu\">\n <a class=\"sb-item\" (activate)=\"getMyImages(0)\" suiTabHeader=\"1\">{{configService.labelConfig?.lbl?.myImages}}</a>\n <a class=\"sb-item\" (activate)=\"getAllImages(0)\" suiTabHeader=\"2\">{{configService.labelConfig?.lbl?.allImage}}</a>\n </div>\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadMyImages()\" suiTabContent=\"1\">\n <div class=\"ui pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchImages($event, 'myImages')\" class=\"sb-search-input\" [(ngModel)]=\"searchMyInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchImages('clearInput', 'myImages')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!myAssets?.length && searchMyInput\" class=\"fs-0785\"> {{emptyImageSearchMessage}} </div>\n <div class=\"sb-grid-layout image\">\n <div class=\"sb-video-content\" *ngFor=\"let data of myAssets\">\n <div class=\"sb-image-section relative position\">\n <img (click)=\"addImageInEditor(data.downloadUrl, data.identifier, data.name)\" alt=\"{{data?.name}}\" [src]=\"data.downloadUrl\">\n </div>\n </div>\n\n </div>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadAllImages()\" suiTabContent=\"2\">\n <div class=\"ui pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchImages($event, 'allImages')\" class=\"sb-search-input\" [(ngModel)]=\"searchAllInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchImages('clearInput', 'allImages')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\">{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!allImages?.length && searchAllInput\" class=\"fs-0785\"> {{emptyImageSearchMessage}} </div>\n <div class=\"sb-grid-layout image\">\n <div class=\"sb-video-content\" *ngFor=\"let data of allImages\">\n <div class=\"sb-image-section\">\n <img (click)=\"addImageInEditor(data.downloadUrl, data.identifier, data.name)\" alt=\"{{data?.name}}\" [src]=\"data.downloadUrl\">\n </div>\n </div>\n </div>\n\n </div>\n </sui-tabset>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-end\">\n <button (click)=\"openImageUploadModal();\" class=\"sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.upload_use_btn_label}}</button>\n </div>\n</sui-modal>\n\n<sui-modal [isClosable]=\"isClosable\" class=\"sb-modal overflow-modal\" [isInverted]=\"false\"\n (dismissed)=\"dismissVideoPicker()\" *ngIf=\"showVideoPicker\" [size]=\"'normal'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.selectVideo}}</div>\n <div class=\"sb-modal-content p-0\">\n <sui-tabset>\n <div class=\"sb-tabset-menu\">\n <a class=\"sb-item\" (activate)=\"getMyVideos(0)\" suiTabHeader=\"1\">{{configService.labelConfig?.lbl?.myVideos}}</a>\n <a class=\"sb-item\" (activate)=\"getAllVideos(0)\" suiTabHeader=\"2\">{{configService.labelConfig?.lbl?.allVideos}}</a>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadMyVideos()\" suiTabContent=\"1\">\n <div class=\"pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchVideo($event, 'myVideos')\" class=\"sb-search-input\" [(ngModel)]=\"searchMyInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchVideo('clearInput', 'myVideos')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!myAssets?.length && searchMyInput\" class=\"fs-0785\"> {{emptyVideoSearchMessage}} </div>\n <div class=\"sb-grid-layout video\">\n <div class=\"sb-video-content\" *ngFor=\"let data of myAssets\">\n <div class=\"sb-image-section relative position\" [ngClass]=\"{'active': selectedVideoId === data.identifier}\"\n (click)=\"selectVideo(data)\">\n <div class=\"overlay-image\"><i class=\"play circle icon\" aria-hidden=\"true\"></i></div>\n <i class=\"check circle icon selected-video\" aria-hidden=\"true\"></i>\n <img [src]=\"data.thumbnail\" alt=\"{{data?.name}}\">\n </div>\n </div>\n\n </div>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadAllVideos()\" suiTabContent=\"2\">\n <div class=\" pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchVideo($event, 'allVideos')\" class=\"sb-search-input\" [(ngModel)]=\"searchAllInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchVideo('clearInput', 'allVideos')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!allVideos?.length && searchAllInput\" class=\"fs-0785\"> {{emptyVideoSearchMessage}} </div>\n <div class=\"sb-grid-layout video\">\n <div class=\"sb-video-content\" *ngFor=\"let data of allVideos\">\n <div class=\"sb-image-section relative position\" [ngClass]=\"{'active': selectedVideoId === data.identifier}\"\n (click)=\"selectVideo(data);\">\n <div class=\"overlay-image\"><i class=\"play circle icon\" aria-hidden=\"true\"></i></div>\n <i class=\"check circle icon selected-video\" aria-hidden=\"true\"></i>\n <img [src]=\"data.thumbnail\" alt=\"{{data?.name}}\">\n </div>\n </div>\n </div>\n </div>\n </sui-tabset>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between pl-20\">\n <div>\n <button (click)=\"addVideoInEditor();\" class=\"sb-btn sb-btn-normal\"\n [ngClass]=\"{'sb-btn-primary': showAddButton, 'sb-btn-disabled': !showAddButton}\">{{configService.labelConfig?.button_labels?.add_btn_label}}</button>\n </div>\n <div>\n <button (click)=\"openVideoUploadModal();\" class=\"sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.upload_use_btn_label}}</button>\n </div>\n </div>\n</sui-modal>\n\n<!-- Upload image pop up code here -->\n\n<sui-modal class=\"sb-modal overflow-modal\" [isClosable]=\"isClosable\" [isInverted]=\"false\"\n (dismissed)=\"dismissImageUploadModal()\" *ngIf=\"showImageUploadModal\" [size]=\"'large'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" appBodyScroll #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.uploadAndUse}}</div>\n <div class=\"p-10 sb-bg-white\">\n <div class=\"d-flex\">\n <div class=\"w-50\">\n <div class=\"content\">\n <h6 class=\"mb-8 fs-normal\">{{configService.labelConfig?.lbl?.chooseOrDragImage}}<span class=\"red\">*</span></h6>\n <div class=\"upload-image-modal-section d-flex flex-ai-center flex-jc-center flex-dc\">\n <ng-container>\n <button class=\"upload-input-button sb-btn sb-btn-success sb-btn-normal\">\n {{configService.labelConfig?.button_labels?.upload_from_computer_btn_label}}\n <input (change)=\"uploadImage($event)\" type=\"file\" [accept]=\"acceptImageType\" name=\"assetfile\">\n </button>\n <div class=\"py-10 fs-0-785 sb-color-primary\" *ngIf=\"imageUploadLoader\"> {{assetName}} </div>\n <span class=\"fsmall mt-8\">{{configService.labelConfig?.lbl?.upload}} {{assetConfig.image.accepted}} ({{configService.labelConfig?.lbl?.maxFileSize}}\n {{assetConfig.image.size}}{{assetConfig.image.sizeType}})</span>\n <div *ngIf=\"showErrorMsg\" class=\"sb-color-error fsmall mt-8\">\n <p>{{errorMsg}}</p>\n </div>\n </ng-container>\n </div>\n <div class=\"ui info message sb-info-bx\">\n <ul class=\"list\">\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.allowedFileTypes}} {{assetConfig.image.accepted}}</li>\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.maximumAllowedFileSize}} {{assetConfig.image.size}}{{assetConfig.image.sizeType}}</li>\n </ul>\n </div>\n <h6 class=\"fs-0785\">{{configService.labelConfig?.lbl?.copyRightsAndLicense}}<span class=\"red\">*</span></h6>\n <p class=\"fsmall mt-8 terms-and-condition\">{{termsAndCondition}}</p>\n </div>\n </div>\n <div class=\"w-50 pl-10 ml-10 b-bl\">\n <div class=\"ui info message sb-info-bx mb-0\">\n <ul class=\"list\">\n <li class=\"fs-0785 font-weight-bold\">\n <i class=\"icon info circle\" aria-hidden=\"true\"></i>\n {{configService.labelConfig?.lbl?.dropChooseFile}}</li>\n </ul>\n </div>\n <div class=\"sb-form-fields\">\n <div class=\"form-container upload-form\">\n <sb-dynamic-form [config]=\"formConfig\" (statusChanges)=\"onStatusChanges($event)\"\n (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between p-0\">\n <div>\n <button (click)=\"dismissPops(modal);\" class=\"mr-10 sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.cancel_btn_label}}</button>\n <button type=\"button\" class=\"sb-btn sb-btn-normal text-left sb-btn-loading-spinner sb-btn-primary\"\n [disabled]=\"!imageFormValid\" (click)=\"uploadAndUseImage(modal);\" \n [ngClass]=\"{'sb-btn-primary': imageFormValid, 'sb-btn-disabled': !imageFormValid}\">\n <div class=\"sb-loading-spinner\" *ngIf=\"loading\" role=\"status\" aria-hidden=\"true\"></div>\n {{configService.labelConfig?.button_labels?.upload_use_btn_label}}\n </button>\n </div>\n <div>\n <button (click)=\"dismissImageUploadModal();\" class=\" sb-btn sb-btn-primary sb-btn-normal\"> {{configService.labelConfig?.button_labels?.back_btn_label}}</button>\n </div>\n </div>\n </div>\n</sui-modal>\n\n<!-- Upload video pop up code here -->\n<sui-modal class=\"sb-modal overflow-modal\" [isClosable]=\"isClosable\" [isInverted]=\"false\"\n (dismissed)=\"dismissVideoUploadModal()\" *ngIf=\"showVideoUploadModal\" [size]=\"'large'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" appBodyScroll #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.uploadAndUse}}</div>\n <div class=\"p-10 sb-bg-white\">\n <div class=\"d-flex\">\n <div class=\"w-50\">\n <div class=\"content\">\n <h6 class=\"mb-8 fs-normal\">{{configService.labelConfig?.lbl?.chooseOrDragVideo}}<span class=\"red\">*</span></h6>\n <div class=\"upload-image-modal-section d-flex flex-ai-center flex-jc-center flex-dc\">\n <ng-container>\n <button class=\"upload-input-button sb-btn sb-btn-success sb-btn-normal\">\n {{configService.labelConfig?.button_labels?.upload_from_computer_btn_label}}\n <input (change)=\"uploadVideoFromLocal($event)\" type=\"file\" [accept]=\"acceptVideoType\" name=\"assetfile\">\n </button>\n <div class=\"py-10 fs-0-785 sb-color-primary\" *ngIf=\"imageUploadLoader\"> {{videoFile?.name}} </div>\n <span class=\"fsmall mt-8\">{{configService.labelConfig?.lbl?.upload}} {{assetConfig.video.accepted}} ({{configService.labelConfig?.lbl?.maxFileSize}}\n {{assetConfig.video.size}}{{assetConfig.video.sizeType}})</span>\n <div *ngIf=\"showErrorMsg\" class=\"sb-color-error fsmall mt-8\">\n <p>{{errorMsg}}</p>\n </div>\n </ng-container>\n </div>\n <div class=\"ui info message sb-info-bx\">\n <ul class=\"list\">\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.allowedFileTypes}} {{assetConfig.video.accepted}}</li>\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.maximumAllowedFileSize}} {{assetConfig.video.size}}{{assetConfig.video.sizeType}}</li>\n </ul>\n </div>\n <h6 class=\"fs-0785\">{{configService.labelConfig?.lbl?.copyRightsAndLicense}}<span class=\"red\">*</span></h6>\n <p class=\"fsmall mt-8 terms-and-condition\">{{termsAndCondition}}</p>\n </div>\n </div>\n <div class=\"w-50 pl-10 ml-10 b-bl\">\n <div class=\"ui info message sb-info-bx mb-0\">\n <ul class=\"list\">\n <li class=\"fs-0785 font-weight-bold\">\n <i class=\"icon info circle\" aria-hidden=\"true\"></i>\n {{configService.labelConfig?.lbl?.dropChooseFile}}</li>\n </ul>\n </div>\n <div class=\"sb-form-fields\">\n <div class=\"form-container upload-form\">\n <sb-dynamic-form [config]=\"formConfig\" (statusChanges)=\"onStatusChanges($event)\"\n (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between p-0\">\n <div>\n <button (click)=\"dismissVideoPops(modal);\" class=\"mr-10 sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.cancel_btn_label}}</button>\n <button type=\"button\" class=\"sb-btn sb-btn-normal text-left sb-btn-loading-spinner sb-btn-primary\"\n [disabled]=\"!imageFormValid\" (click)=\"uploadVideo(modal);\" \n [ngClass]=\"{'sb-btn-primary': imageFormValid, 'sb-btn-disabled': !imageFormValid}\">\n <div class=\"sb-loading-spinner\" *ngIf=\"loading\" role=\"status\" aria-hidden=\"true\"></div>\n {{configService.labelConfig?.lbl?.uploadAndUse}}\n </button>\n </div>\n <div>\n <button (click)=\"dismissVideoUploadModal();\" class=\" sb-btn sb-btn-primary sb-btn-normal\"> {{configService.labelConfig?.button_labels?.back_btn_label}}</button>\n </div>\n </div>\n </div>\n</sui-modal>", styles: [".editorWrapper{border:0px solid white}.editorWrapper.hasError{border:1px solid red;border-radius:2px}.characterCount{text-align:right;border-top:0;padding-right:7px;font-size:11px;font-weight:700;margin-top:-16px;position:relative}.custom-image img{border:1px dotted;padding:7px;margin:6px;cursor:pointer}.resource-image{height:180px!important}.asset_container{overflow-y:auto;overflow-x:hidden;min-height:300px!important;max-height:300px!important;padding:5px}.insert-image-btn{position:absolute;z-index:1;left:653px;background-color:transparent;padding:12px 14px!important;margin-left:6px}.insert-image-btn>.icon{opacity:1}.insert-image-btn:active{background-color:transparent}.upload-file-description p{color:#999}.upload-file-description ul{margin:0;list-style:disc}.upload-file-description ul li{margin-bottom:8px}.upload-file-description ul li a{cursor:pointer;font-size:12px}.sb-grid-layout{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));grid-gap:16px}.sb-grid-layout.image{grid-template-columns:repeat(auto-fill,minmax(96px,1fr))}.sb-grid-layout.video{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}.sb-grid-layout .sb-video-content .sb-image-section{height:96px;overflow:hidden;border-radius:4px;box-shadow:inset 0 1px 3px #00000080}.sb-image-section .selected-video{display:none}.sb-image-section.active .selected-video{position:absolute;right:4px;top:4px;color:#07bc81;font-size:20px;display:block}.sb-grid-layout .sb-video-content .sb-image-section img{width:100%;height:100%;cursor:pointer}.overlay-image{width:100%;height:100%;background:#0000004d;position:absolute;left:0;right:0;cursor:pointer}.overlay-image .play.icon{position:absolute;transform:translate(-50%,-50%);top:50%;left:50%;color:#fff9;font-size:32px;cursor:pointer}::ng-deep .ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar,::ng-deep .ck.ck-editor__top .ck-sticky-panel .ck-toolbar.ck-rounded-corners{border-left:none;border-right:none;border-bottom:1px solid #c4c4c4;border-radius:0}::ng-deep .ck-rounded-corners .ck.ck-editor__main>.ck-editor__editable,::ng-deep .ck.ck-editor__main>.ck-editor__editable.ck-rounded-corners{border:none}::ng-deep .ck-dropdown.ck-font-size-dropdown .ck-dropdown__panel{height:150px;overflow-y:scroll}::ng-deep figure.image.ck-widget{width:auto;height:auto;overflow:visible}::ng-deep figure.image img{width:100%}::ng-deep figure.image.resize-25{width:25%;height:auto}::ng-deep figure.image.resize-50{width:50%;height:auto}::ng-deep figure.image.resize-75{width:75%;height:auto}::ng-deep figure.image.resize-100{width:100%;height:auto}::ng-deep figure.table{margin:2.2rem 0 1.5rem 1rem!important}::ng-deep .text-center{text-align:center}::ng-deep .text-left{text-align:left}::ng-deep .text-right{text-align:right}::ng-deep .fs-8{font-size:.5rem}::ng-deep .fs-10{font-size:.625rem}::ng-deep .fs-12{font-size:.75rem}::ng-deep .fs-14{font-size:.875rem}::ng-deep .fs-16{font-size:1rem}::ng-deep .fs-18{font-size:1.125rem}::ng-deep .fs-20{font-size:1.25rem}::ng-deep .fs-22{font-size:1.375rem}::ng-deep .fs-24{font-size:1.5rem}::ng-deep .fs-26{font-size:1.625rem}::ng-deep .fs-28{font-size:1.75rem}::ng-deep .fs-30{font-size:1.875rem}::ng-deep .fs-36{font-size:2.25rem}.upload-image-modal-section{border-radius:4px;width:100%;min-height:130px;background:#f5f9fc;border:1px dashed #024f9d}.upload-input-button input[type=file]{position:absolute;right:0;top:0;font-size:118px;margin:0;padding:0;cursor:pointer;opacity:0;height:100%}.upload-file-section{display:flex;height:240px;width:100%;max-width:800px;align-items:center;justify-content:center;flex-direction:column;margin:0 auto;background-color:#f5f9fc;border:1px dashed #80a7ce}.qq-uploader.qq-uploader-selector.custom-qq-uploader{background:inherit;border-color:none;border:none;max-height:inherit;min-height:inherit;overflow-y:inherit;width:688px;height:240px;display:flex;justify-content:center;align-items:center}.terms-and-condition{line-height:14px}.sb-info-bx{padding:.4rem!important}.sb-info-bx li{margin:0!important;padding:0!important}.sb-info-bx li:before{content:\"\"!important}.red{color:red}.b-bl{border-left:solid 1px #e4e1e1}.sb-form-fields .sb-field-group{margin:1rem 0}.sb-form-fields .sb-field{position:relative;margin-bottom:.5rem}.sb-form-fields .sb-field .sb-form-control{border:1px solid rgba(34,36,38,.15);width:100%;border-radius:.28571429rem;box-shadow:0 0 0 0 transparent inset;padding:.25rem .5rem!important}@keyframes spinner-border{to{transform:rotate(360deg)}}.sb-loading-spinner{width:1rem;height:1rem;margin-right:8px;border-width:.2em;display:inline-block;vertical-align:text-bottom;border:.15em solid currentColor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.sb-btn-loading:before{position:absolute;content:\"\";top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.15)}.sb-btn-loading:after{position:absolute;content:\"\";top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;animation:button-spin .6s linear;animation-iteration-count:infinite;border-radius:500rem;border-color:#fff transparent transparent;border-style:solid;border-width:.2em;box-shadow:0 0 0 1px transparent}.sb-btn-outline-disabled{background-color:#fff;border:1px solid #cccccc;color:#999;cursor:default;font-weight:400}.sb-color-grey{color:#666}.flex-jc-space-end{justify-content:flex-end!important}.fs-0785{font-size:.785rem!important}.ui.info.message{color:#276f86!important}.sb-textbox[disabled=true]{opacity:.3!important;font-weight:500!important}.sb-tabset-segment{min-height:288px;max-height:288px;overflow-y:auto}input:focus-visible{border:none!important}\n"] }]
877
895
  }], ctorParameters: function () { return [{ type: i1.QuestionService }, { type: i2.EditorService }, { type: i3.ToasterService }, { type: i4.ConfigService }]; }, propDecorators: { editorRef: [{
878
896
  type: ViewChild,
879
897
  args: ['editor']
@@ -892,4 +910,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
892
910
  }], setImageLimit: [{
893
911
  type: Input
894
912
  }] } });
895
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2tlZGl0b3ItdG9vbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2xsZWN0aW9uLWVkaXRvci1saWJyYXJ5L3NyYy9saWIvY29tcG9uZW50cy9ja2VkaXRvci10b29sL2NrZWRpdG9yLXRvb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sbGVjdGlvbi1lZGl0b3ItbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvY2tlZGl0b3ItdG9vbC9ja2VkaXRvci10b29sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXlCLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFhLFNBQVMsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUNoSSxPQUFPLGFBQWEsTUFBTSx5Q0FBeUMsQ0FBQztBQUNwRSxPQUFPLEtBQUssQ0FBQyxNQUFNLFdBQVcsQ0FBQztBQUMvQixPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSzlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7Ozs7Ozs7QUFPN0QsTUFBTSxPQUFPLHFCQUFxQjtJQXFCaEMsWUFBb0IsZUFBZ0MsRUFBVSxhQUE0QixFQUNoRixjQUE4QixFQUFTLGFBQTRCO1FBRHpELG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUFVLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ2hGLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUFTLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBbkJuRSxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzNDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FB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LE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO29CQUMxRSxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDekMsQ0FBQyxDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzFCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ2pFLE9BQU8sYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7K0dBMTRCVSxxQkFBcUI7bUdBQXJCLHFCQUFxQixnYkNoQmxDLG80aEJBaVNZOzs0RkRqUkMscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG1CQUFtQjsyTEFLRCxTQUFTO3NCQUFwQyxTQUFTO3VCQUFDLFFBQVE7Z0JBQ1YsZUFBZTtzQkFBdkIsS0FBSztnQkFDSSxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNFLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT3V0cHV0LCBJbnB1dCwgRXZlbnRFbWl0dGVyLCBPbkNoYW5nZXMsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IENsYXNzaWNFZGl0b3IgZnJvbSAnQHByb2plY3Qtc3VuYmlyZC9ja2VkaXRvci1idWlsZC1jbGFzc2ljJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHRocm93RXJyb3IsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFF1ZXN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3F1ZXN0aW9uL3F1ZXN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWRpdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VkaXRvci9lZGl0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RvYXN0ZXIvdG9hc3Rlci5zZXJ2aWNlJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWcvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi4vYXNzZXQtYnJvd3Nlci9hc3NldC1icm93c2VyLmRhdGEnO1xuZGVjbGFyZSBjb25zdCBTdW5iaXJkRmlsZVVwbG9hZExpYjogYW55O1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWNrZWRpdG9yLXRvb2wnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2tlZGl0b3ItdG9vbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NrZWRpdG9yLXRvb2wuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDa2VkaXRvclRvb2xDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIEBWaWV3Q2hpbGQoJ2VkaXRvcicpIHB1YmxpYyBlZGl0b3JSZWY6IEVsZW1lbnRSZWY7XG4gIEBJbnB1dCgpIGVkaXRvckRhdGFJbnB1dDogYW55O1xuICBAT3V0cHV0KCkgZWRpdG9yRGF0YU91dHB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgaGFzRXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHZpZGVvRGF0YU91dHB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBASW5wdXQoKSB2aWRlb1Nob3c7XG4gIEBJbnB1dCgpIHNldENoYXJhY3RlckxpbWl0OiBudW1iZXI7XG4gIEBJbnB1dCgpIHNldEltYWdlTGltaXQ6IGFueTtcbiAgcHVibGljIGVkaXRvckNvbmZpZzogYW55O1xuICBwdWJsaWMgaW1hZ2VVcGxvYWRMb2FkZXIgPSBmYWxzZTtcbiAgcHVibGljIGVkaXRvckluc3RhbmNlOiBhbnk7XG4gIHB1YmxpYyBpc0VkaXRvckZvY3VzZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBsaW1pdEV4Y2VlZGVkOiBib29sZWFuO1xuICBwdWJsaWMgY2hhcmFjdGVyc0xlZnQ6IG51bWJlcjtcbiAgcHVibGljIGlzQXNzZXRCcm93c2VyUmVhZE9ubHkgPSBmYWxzZTtcbiAgcHVibGljIGNoYXJhY3RlckNvdW50O1xuICBwdWJsaWMgbWVkaWFvYmo7XG4gIGluaXRpYWxpemVkID0gZmFsc2U7XG4gIHB1YmxpYyBhc3NldFByb3h5VXJsOiBhbnk7XG4gIHB1YmxpYyBsYXN0SW1nUmVzaXplV2lkdGg7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcXVlc3Rpb25TZXJ2aWNlOiBRdWVzdGlvblNlcnZpY2UsIHByaXZhdGUgZWRpdG9yU2VydmljZTogRWRpdG9yU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0ZXJTZXJ2aWNlOiBUb2FzdGVyU2VydmljZSwgcHVibGljIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UpIHsgfVxuICBhc3NldENvbmZpZzogYW55ID0ge307XG4gIG15QXNzZXRzID0gW107XG4gIGFsbEltYWdlcyA9IFtdO1xuICBhbGxWaWRlb3MgPSBbXTtcbiAgc2VsZWN0ZWRWaWRlbyA9IHt9O1xuICBsb2FkaW5nID0gZmFsc2U7XG4gIGlzQ2xvc2FibGUgPSB0cnVlO1xuICBzZWxlY3RlZFZpZGVvSWQ6IHN0cmluZztcbiAgc2hvd0FkZEJ1dHRvbjogYm9vbGVhbjtcbiAgc2hvd0ltYWdlUGlja2VyOiBib29sZWFuO1xuICBzaG93VmlkZW9QaWNrZXIgPSBmYWxzZTtcbiAgc2hvd0ltYWdlVXBsb2FkTW9kYWw6IGJvb2xlYW47XG4gIHNob3dWaWRlb1VwbG9hZE1vZGFsOiBib29sZWFuO1xuICBhY2NlcHRWaWRlb1R5cGU6IGFueTtcbiAgYWNjZXB0SW1hZ2VUeXBlOiBhbnk7XG4gIHNob3dFcnJvck1zZzogYm9vbGVhbjtcbiAgZXJyb3JNc2c6IHN0cmluZztcbiAgcXVlcnk6IHN0cmluZztcbiAgcHVibGljIGFzc2V0c0NvdW50OiBhbnk7XG4gIHB1YmxpYyBzZWFyY2hNeUlucHV0ID0gJyc7XG4gIHB1YmxpYyBzZWFyY2hBbGxJbnB1dDogYW55O1xuICBwdWJsaWMgZm9ybURhdGE6IGFueTtcbiAgcHVibGljIGFzc2VzdERhdGEgPSB7fTtcbiAgcHVibGljIGZvcm1Db25maWc6IGFueTtcbiAgcHVibGljIGluaXRpYWxGb3JtQ29uZmlnOiBhbnk7XG4gIHB1YmxpYyBpbWFnZUZvcm1WYWxpZCA9IGZhbHNlO1xuICBwdWJsaWMgdmlkZW9GaWxlOiBhbnk7XG4gIHB1YmxpYyBpbWFnZUZpbGU6IGFueTtcbiAgcHVibGljIHRlcm1zQW5kQ29uZGl0aW9uOiBhbnk7XG4gIHB1YmxpYyBhc3NldE5hbWU6IGFueTtcbiAgcHVibGljIGVtcHR5SW1hZ2VTZWFyY2hNZXNzYWdlOiBhbnk7XG4gIHB1YmxpYyBlbXB0eVZpZGVvU2VhcmNoTWVzc2FnZTogYW55O1xuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmFzc2V0UHJveHlVcmwgPSBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UudXJsQ29uRmlnLCAnVVJMUy5hc3NldFByb3h5VXJsJyk7XG4gICAgdGhpcy5pbml0aWFsRm9ybUNvbmZpZyA9IF8uZ2V0KGNvbmZpZywgJ3VwbG9hZEljb25Gb3JtQ29uZmlnJyk7XG4gICAgdGhpcy5mb3JtQ29uZmlnID0gXy5nZXQoY29uZmlnLCAndXBsb2FkSWNvbkZvcm1Db25maWcnKTtcbiAgICB0aGlzLmVtcHR5SW1hZ2VTZWFyY2hNZXNzYWdlID0gXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDE2Jyk7XG4gICAgdGhpcy5lbXB0eVZpZGVvU2VhcmNoTWVzc2FnZSA9IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAxNycpO1xuICAgIHRoaXMudGVybXNBbmRDb25kaXRpb24gPSBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UubGFiZWxDb25maWcsICd0ZXJtc0FuZENvbmRpdGlvbnMuMDAxJyk7XG4gICAgdGhpcy5hc3NldENvbmZpZyA9IHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcuY29uZmlnLmFzc2V0Q29uZmlnO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuZWRpdG9yQ29uZmlnID0ge1xuICAgICAgdG9vbGJhcjogWydoZWFkaW5nJywgJ3wnLCAnYm9sZCcsICd8JywgJ2l0YWxpYycsICd8JywgJ3VuZGVybGluZScsICd8JywgJ0J1bGxldGVkTGlzdCcsICd8JywgJ2FsaWdubWVudCcsXG4gICAgICAgICd8JywgJ2luc2VydFRhYmxlJywgJ3wnLCAnbnVtYmVyZWRMaXN0JywgJ3wnLCAnZm9udFNpemUnLCAnfCcsICdzdWJzY3JpcHQnLCAnfCcsICdzdXBlcnNjcmlwdCcsICd8JyxcbiAgICAgICAgJ01hdGhUZXh0JywgJ3wnLCAnc3BlY2lhbENoYXJhY3RlcnMnLCAnfCdcbiAgICAgIF0sXG4gICAgICBmb250U2l6ZToge1xuICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgJ2VpZ2h0JyxcbiAgICAgICAgICAndGVuJyxcbiAgICAgICAgICAndHdlbHZlJyxcbiAgICAgICAgICAnZm91cnRlZW4nLFxuICAgICAgICAgICdzaXh0ZWVuJyxcbiAgICAgICAgICAnZWlnaHRlZW4nLFxuICAgICAgICAgICd0d2VudHknLFxuICAgICAgICAgICd0d2VudHl0d28nLFxuICAgICAgICAgICd0d2VudHlmb3VyJyxcbiAgICAgICAgICAndHdlbnR5c2l4JyxcbiAgICAgICAgICAndHdlbnR5ZWlnaHQnLFxuICAgICAgICAgICd0aGlydHknLFxuICAgICAgICAgICd0aGlydHlzaXgnXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBpbWFnZToge1xuICAgICAgICByZXNpemVVbml0OiAnJScsXG4gICAgICAgIHJlc2l6ZU9wdGlvbnM6IFt7XG4gICAgICAgICAgbmFtZTogJ3Jlc2l6ZUltYWdlOjI1JyxcbiAgICAgICAgICB2YWx1ZTogJzI1JyxcbiAgICAgICAgICBpY29uOiAnc21hbGwnLFxuICAgICAgICAgIGNsYXNzTmFtZTogJ3Jlc2l6ZS0yNSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdyZXNpemVJbWFnZTo1MCcsXG4gICAgICAgICAgdmFsdWU6ICc1MCcsXG4gICAgICAgICAgaWNvbjogJ21lZGl1bScsXG4gICAgICAgICAgY2xhc3NOYW1lOiAncmVzaXplLTUwJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3Jlc2l6ZUltYWdlOjc1JyxcbiAgICAgICAgICB2YWx1ZTogJzc1JyxcbiAgICAgICAgICBpY29uOiAnbGFyZ2UnLFxuICAgICAgICAgIGNsYXNzTmFtZTogJ3Jlc2l6ZS03NSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdyZXNpemVJbWFnZToxMDAnLFxuICAgICAgICAgIHZhbHVlOiAnMTAwJyxcbiAgICAgICAgICBpY29uOiAnZnVsbCcsXG4gICAgICAgICAgY2xhc3NOYW1lOiAncmVzaXplLTEwMCdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdyZXNpemVJbWFnZTpvcmlnaW5hbCcsXG4gICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgaWNvbjogJ29yaWdpbmFsJyxcbiAgICAgICAgICBjbGFzc05hbWU6ICdyZXNpemUtb3JpZ2luYWwnXG4gICAgICAgIH1dLFxuICAgICAgICB0b29sYmFyOiBbJ2ltYWdlU3R5bGU6YWxpZ25MZWZ0JywgJ2ltYWdlU3R5bGU6YWxpZ25DZW50ZXInLCAnaW1hZ2VTdHlsZTphbGlnblJpZ2h0JywgJ3wnLFxuICAgICAgICAgICdyZXNpemVJbWFnZToyNScsICdyZXNpemVJbWFnZTo1MCcsICdyZXNpemVJbWFnZTo3NScsICdyZXNpemVJbWFnZToxMDAnLCAncmVzaXplSW1hZ2U6b3JpZ2luYWwnXSxcbiAgICAgICAgc3R5bGVzOiBbJ2Z1bGwnLCAnYWxpZ25MZWZ0JywgJ2FsaWduUmlnaHQnLCAnYWxpZ25DZW50ZXInXVxuICAgICAgfSxcbiAgICAgIGlzUmVhZE9ubHk6IGZhbHNlLFxuICAgICAgcmVtb3ZlUGx1Z2luczogWydJbWFnZUNhcHRpb24nLCAnbWF0aHR5cGUnLCAnQ2hlbVR5cGUnLCAnSW1hZ2VSZXNpemVIYW5kbGVzJ11cbiAgICB9O1xuXG4gICAgdGhpcy5hY2NlcHRWaWRlb1R5cGUgPSB0aGlzLmdldEFjY2VwdFR5cGUodGhpcy5hc3NldENvbmZpZy52aWRlby5hY2NlcHRlZCwgJ3ZpZGVvJyk7XG4gICAgdGhpcy5hY2NlcHRJbWFnZVR5cGUgPSB0aGlzLmdldEFjY2VwdFR5cGUodGhpcy5hc3NldENvbmZpZy5pbWFnZS5hY2NlcHRlZCwgJ2ltYWdlJyk7XG4gIH1cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgaWYgKHRoaXMudmlkZW9TaG93KSB7XG4gICAgICB0aGlzLnNob3dWaWRlb1BpY2tlciA9IHRydWU7XG4gICAgICB0aGlzLnNlbGVjdFZpZGVvKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUVkaXRvcnMoKTtcbiAgfVxuXG5cbiAgaW5pdGlhbGl6ZUltYWdlUGlja2VyKGVkaXRvclR5cGUpIHtcbiAgICB0aGlzLnNob3dJbWFnZVBpY2tlciA9IHRydWU7XG4gIH1cblxuICBpbml0aWFsaXplVmlkZW9QaWNrZXIoZWRpdG9yVHlwZSkge1xuICAgIHRoaXMuc2hvd1ZpZGVvUGlja2VyID0gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogZnVuY3Rpb24gdG8gaGlkZSBpbWFnZSBwaWNrZXJcbiAgICovXG4gIGRpc21pc3NJbWFnZVBpY2tlcigpIHtcbiAgICB0aGlzLnNob3dJbWFnZVBpY2tlciA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIGZ1bmN0aW9uIHRvIGhpZGUgdmlkZW8gcGlja2VyXG4gICAqL1xuICBkaXNtaXNzVmlkZW9QaWNrZXIoKSB7XG4gICAgdGhpcy5zaG93VmlkZW9QaWNrZXIgPSBmYWxzZTtcbiAgICB0aGlzLnZpZGVvU2hvdyA9IGZhbHNlO1xuICAgIHRoaXMudmlkZW9EYXRhT3V0cHV0LmVtaXQoZmFsc2UpO1xuICB9XG4gIGRpc21pc3NJbWFnZVVwbG9hZE1vZGFsKCkge1xuICAgIHRoaXMuc2hvd0ltYWdlVXBsb2FkTW9kYWwgPSBmYWxzZTtcbiAgfVxuICBpbml0aWF0ZUltYWdlVXBsb2FkTW9kYWwoKSB7XG4gICAgdGhpcy5zaG93SW1hZ2VQaWNrZXIgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dJbWFnZVVwbG9hZE1vZGFsID0gdHJ1ZTtcbiAgfVxuXG4gIGRpc21pc3NWaWRlb1VwbG9hZE1vZGFsKCkge1xuICAgIGlmICh0aGlzLmlzQ2xvc2FibGUpIHtcbiAgICAgIHRoaXMuc2hvd1ZpZGVvVXBsb2FkTW9kYWwgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaW5pdGlhdGVWaWRlb1VwbG9hZE1vZGFsKCkge1xuICAgIHRoaXMuc2hvd1ZpZGVvUGlja2VyID0gZmFsc2U7XG4gICAgdGhpcy5zaG93SW1hZ2VVcGxvYWRNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5pc0Nsb3NhYmxlID0gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgaXNFZGl0b3JSZWFkT25seShzdGF0ZSkge1xuICAgIHRoaXMuZWRpdG9ySW5zdGFuY2UuaXNSZWFkT25seSA9IHN0YXRlO1xuICAgIHRoaXMuaXNBc3NldEJyb3dzZXJSZWFkT25seSA9IHN0YXRlO1xuICB9XG4gIGdldEFjY2VwdFR5cGUodHlwZUxpc3QsIHR5cGUpIHtcbiAgICBjb25zdCBhY2NlcHRUeXBlTGlzdCA9IHR5cGVMaXN0LnNwbGl0KCcsICcpO1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIF8uZm9yRWFjaChhY2NlcHRUeXBlTGlzdCwgKGNvbnRlbnQpID0+IHtcbiAgICAgIHJlc3VsdC5wdXNoKGAke3R5cGV9LyR7Y29udGVudH1gKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7XG4gIH1cblxuICBjdXN0b21JbWFnZVJlc2l6ZXIoZWRpdG9yKSB7XG4gICAgLy8gQm90aCB0aGUgZGF0YSBhbmQgdGhlIGVkaXRpbmcgcGlwZWxpbmVzIGFyZSBhZmZlY3RlZCBieSB0aGlzIGNvbnZlcnNpb24uXG4gICAgZWRpdG9yLmNvbnZlcnNpb24uZm9yKCdkb3duY2FzdCcpLmFkZChkaXNwYXRjaGVyID0+IHtcbiAgICAgIC8vIExpbmtzIGFyZSByZXByZXNlbnRlZCBpbiB0aGUgbW9kZWwgYXMgYSBcImxpbmtIcmVmXCIgYXR0cmlidXRlLlxuICAgICAgLy8gVXNlIHRoZSBcImxvd1wiIGxpc3RlbmVyIHByaW9yaXR5IHRvIGFwcGx5IHRoZSBjaGFuZ2VzIGFmdGVyIHRoZSBsaW5rIGZlYXR1cmUuXG4gICAgICBkaXNwYXRjaGVyLm9uKCdhdHRyaWJ1dGU6d2lkdGg6aW1hZ2UnLCAoZXZ0LCBkYXRhLCBjb252ZXJzaW9uQXBpKSA9PiB7XG4gICAgICAgIGlmICghY29udmVyc2lvbkFwaS5jb25zdW1hYmxlLmNvbnN1bWUoZGF0YS5pdGVtLCBldnQubmFtZSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGVkaXRvci5jb25maWcuZ2V0KCdpbWFnZS5yZXNpemVPcHRpb25zJyk7XG4gICAgICAgIGNvbnN0IGlzRW5hYmxlZCA9IGVkaXRvci5jb25maWcuZ2V0KCdpbWFnZS5yZXNpemVFbmFibGVkJyk7XG4gICAgICAgIGNvbnN0IHNpemVMYWJsZXMgPSBvcHRpb25zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtLmxhYmVsO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbmV3SW1nV2lkdGhWYWx1ZSA9IGRhdGEuYXR0cmlidXRlTmV3VmFsdWUgPT09IG51bGwgPyAnT3JpZ2luYWwnIDogZGF0YS5hdHRyaWJ1dGVOZXdWYWx1ZTtcbiAgICAgICAgaWYgKHNpemVMYWJsZXMuaW5jbHVkZXMobmV3SW1nV2lkdGhWYWx1ZSkpIHtcbiAgICAgICAgICB0aGlzLmxhc3RJbWdSZXNpemVXaWR0aCA9IG5ld0ltZ1dpZHRoVmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzRW5hYmxlZCAmJiBzaXplTGFibGVzLmxlbmd0aCA+IDAgJiYgIXNpemVMYWJsZXMuaW5jbHVkZXMobmV3SW1nV2lkdGhWYWx1ZSkpIHtcbiAgICAgICAgICBlZGl0b3IuZXhlY3V0ZSgnaW1hZ2VSZXNpemUnLCB7IHdpZHRoOiB0aGlzLmxhc3RJbWdSZXNpemVXaWR0aCB9KTtcbiAgICAgICAgICByZXR1cm4gZXZ0LnN0b3AoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZpZXdXcml0ZXIgPSBjb252ZXJzaW9uQXBpLndyaXRlcjtcbiAgICAgICAgY29uc3QgZmlndXJlID0gY29udmVyc2lvbkFwaS5tYXBwZXIudG9WaWV3RWxlbWVudChkYXRhLml0ZW0pO1xuXG4gICAgICAgIGlmIChkYXRhLmF0dHJpYnV0ZU5ld1ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmlld1dyaXRlci5zZXRTdHlsZSgnd2lkdGgnLCBkYXRhLmF0dHJpYnV0ZU5ld1ZhbHVlLCBmaWd1cmUpO1xuICAgICAgICAgIHZpZXdXcml0ZXIuYWRkQ2xhc3MoJ2ltYWdlX3Jlc2l6ZWQnLCBmaWd1cmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZpZXdXcml0ZXIucmVtb3ZlU3R5bGUoJ3dpZHRoJywgZmlndXJlKTtcbiAgICAgICAgICB2aWV3V3JpdGVyLnJlbW92ZUNsYXNzKCdpbWFnZV9yZXNpemVkJywgZmlndXJlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBpbml0aWFsaXplRWRpdG9ycygpIHtcbiAgICBDbGFzc2ljRWRpdG9yLmNyZWF0ZSh0aGlzLmVkaXRvclJlZi5uYXRpdmVFbGVtZW50LCB7XG4gICAgICBhbGlnbm1lbnQ6IHtcbiAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgIHsgbmFtZTogJ2xlZnQnLCBjbGFzc05hbWU6ICd0ZXh0LWxlZnQnIH0sXG4gICAgICAgICAgeyBuYW1lOiAnY2VudGVyJywgY2xhc3NOYW1lOiAndGV4dC1jZW50ZXInIH0sXG4gICAgICAgICAgeyBuYW1lOiAncmlnaHQnLCBjbGFzc05hbWU6ICd0ZXh0LXJpZ2h0JyB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBoZWFkaW5nOiB7XG4gICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICB7IG1vZGVsOiAncGFyYWdyYXBoJywgdGl0bGU6ICdQYXJhZ3JhcGgnIH0sXG4gICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmcxJywgdmlldzogJ2gxJywgdGl0bGU6ICdIZWFkaW5nIDEnIH0sXG4gICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmcyJywgdmlldzogJ2gyJywgdGl0bGU6ICdIZWFkaW5nIDInIH0sXG4gICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmczJywgdmlldzogJ2gzJywgdGl0bGU6ICdIZWFkaW5nIDMnIH0sXG4gICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmc0JywgdmlldzogJ2g0JywgdGl0bGU6ICdIZWFkaW5nIDQnIH0sXG4gICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmc1JywgdmlldzogJ2g1JywgdGl0bGU6ICdIZWFkaW5nIDUnIH0sXG4gICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmc2JywgdmlldzogJ2g2JywgdGl0bGU6ICdIZWFkaW5nIDYnIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIGV4dHJhUGx1Z2luczogWydUYWJsZScsICdIZWFkaW5nJ10sXG4gICAgICB0b29sYmFyOiB0aGlzLmVkaXRvckNvbmZpZy50b29sYmFyLFxuICAgICAgZm9udFNpemU6IHRoaXMuZWRpdG9yQ29uZmlnLmZvbnRTaXplLFxuICAgICAgaW1hZ2U6IHRoaXMuZWRpdG9yQ29uZmlnLmltYWdlLFxuICAgICAgaXNSZWFkT25seTogdGhpcy5lZGl0b3JDb25maWcuaXNSZWFkT25seSxcbiAgICAgIHJlbW92ZVBsdWdpbnM6IHRoaXMuZWRpdG9yQ29uZmlnLnJlbW92ZVBsdWdpbnNcbiAgICB9KVxuICAgICAgLnRoZW4oZWRpdG9yID0+IHtcbiAgICAgICAgdGhpcy5lZGl0b3JJbnN0YW5jZSA9IGVkaXRvcjtcbiAgICAgICAgdGhpcy5pc0Fzc2V0QnJvd3NlclJlYWRPbmx5ID0gdGhpcy5lZGl0b3JDb25maWcuaXNSZWFkT25seTtcbiAgICAgICAgaWYgKHRoaXMuZWRpdG9yRGF0YUlucHV0KSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3JEYXRhSW5wdXQgPSB0aGlzLmVkaXRvckRhdGFJbnB1dFxuICAgICAgICAgICAgLnJlcGxhY2UoLyg8aW1nKFwiW15cIl0qXCJ8W15cXC9cIj5dKSopPi9naSwgJyQxLz4nKVxuICAgICAgICAgICAgLnJlcGxhY2UoLyg8YnIoXCJbXlwiXSpcInxbXlxcL1wiPl0pKik+L2dpLCAnJDEvPicpO1xuICAgICAgICAgIHRoaXMuZWRpdG9ySW5zdGFuY2Uuc2V0RGF0YSh0aGlzLmVkaXRvckRhdGFJbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3JJbnN0YW5jZS5zZXREYXRhKCcnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygnRWRpdG9yIHdhcyBpbml0aWFsaXplZCcpO1xuICAgICAgICB0aGlzLmNoYW5nZVRyYWNrZXIodGhpcy5lZGl0b3JJbnN0YW5jZSk7XG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnQodGhpcy5lZGl0b3JJbnN0YW5jZSk7XG4gICAgICAgIC8vIHRoaXMucGFzdGVUcmFja2VyKHRoaXMuZWRpdG9ySW5zdGFuY2UpO1xuICAgICAgICB0aGlzLmNoYXJhY3RlckNvdW50ID0gdGhpcy5jb3VudENoYXJhY3RlcnModGhpcy5lZGl0b3JJbnN0YW5jZS5tb2RlbC5kb2N1bWVudCk7XG4gICAgICAgIHRoaXMuY2hhcmFjdGVyc0xlZnQgPSB0aGlzLmdldENoYXJhY3RlcnNMZWZ0KCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvci5zdGFjayk7XG4gICAgICB9KTtcbiAgfVxuICBjaGFuZ2VUcmFja2VyKGVkaXRvcikge1xuICAgIGVkaXRvci5tb2RlbC5kb2N1bWVudC5vbignY2hhbmdlJywgKGV2ZW50SW5mbywgYmF0Y2gpID0+IHtcbiAgICAgIGlmICh0aGlzLnNldENoYXJhY3RlckxpbWl0ICYmIHRoaXMuc2V0Q2hhcmFjdGVyTGltaXQgPiAwKSB7XG4gICAgICAgIHRoaXMuY2hlY2tDaGFyYWN0ZXJMaW1pdCgpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gZXZlbnRJbmZvLnNvdXJjZS5zZWxlY3Rpb24uZ2V0U2VsZWN0ZWRFbGVtZW50KCk7XG4gICAgICB0aGlzLmlzRWRpdG9yRm9jdXNlZCA9IChzZWxlY3RlZEVsZW1lbnQgJiYgc2VsZWN0ZWRFbGVtZW50Lm5hbWUgPT09ICdpbWFnZScpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuc2V0SW1hZ2VMaW1pdCAmJiB0aGlzLnNldEltYWdlTGltaXQgPiAwKSB7XG4gICAgICAgIHRoaXMuY2hlY2tJbWFnZUxpbWl0KCk7XG4gICAgICB9XG4gICAgICB0aGlzLmVkaXRvckRhdGFPdXRwdXQuZW1pdCh7XG4gICAgICAgIGJvZHk6IGVkaXRvci5nZXREYXRhKCksXG4gICAgICAgIGxlbmd0aDogdGhpcy5jaGFyYWN0ZXJDb3VudCxcbiAgICAgICAgbWVkaWFvYmo6IHRoaXMubWVkaWFvYmpcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHBhc3RlVHJhY2tlcihlZGl0b3IpIHtcbiAgICBlZGl0b3IuZWRpdGluZy52aWV3LmRvY3VtZW50Lm9uKCdjbGlwYm9hcmRJbnB1dCcsIChldnQsIGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFUcmFuc2ZlciA9IGRhdGEuZGF0YVRyYW5zZmVyO1xuICAgICAgY29uc3QgdXJsTWF0Y2ggPVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIC8oaHR0cHM/OlxcL1xcLyg/Ond3d1xcLnwoPyF3d3cpKVthLXpBLVowLTldW2EtekEtWjAtOS1dK1thLXpBLVowLTldXFwuW15cXHNdezIsfXx3d3dcXC5bYS16QS1aMC05XVthLXpBLVowLTktXStbYS16QS1aMC05XVxcLlteXFxzXXsyLH18aHR0cHM/OlxcL1xcLyg/Ond3d1xcLnwoPyF3d3cpKVthLXpBLVowLTldK1xcLlteXFxzXXsyLH18d3d3XFwuW2EtekEtWjAtOV0rXFwuW15cXHNdezIsfXxmaWxlOlxcL1xcL1xcLytbXlxcc117MCx9KS9naTtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCh1cmxNYXRjaCk7XG4gICAgICBjb25zdCBnZXRVcmwgPSBkYXRhVHJhbnNmZXIuZ2V0RGF0YSgndGV4dC9odG1sJykubWF0Y2gocmVnZXgpO1xuICAgICAgaWYgKGdldFVybCAmJiBnZXRVcmwubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjAxMCcpKTtcbiAgICAgICAgZXZ0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBjaGVja0ltYWdlTGltaXQoKSB7XG4gICAgY29uc3QgY2hpbGROb2RlcyA9IHRoaXMuZWRpdG9ySW5zdGFuY2UubW9kZWwuZG9jdW1lbnQuZ2V0Um9vdCgpLl9jaGlsZHJlbi5fbm9kZXM7XG4gICAgdGhpcy5pc0Fzc2V0QnJvd3NlclJlYWRPbmx5ID0gXy5rZXlzKF8ucGlja0J5KGNoaWxkTm9kZXMsIHsgbmFtZTogJ2ltYWdlJyB9KSkubGVuZ3RoID09PSB0aGlzLnNldEltYWdlTGltaXQgPyB0cnVlIDogZmFsc2U7XG4gIH1cbiAgY2hlY2tDaGFyYWN0ZXJMaW1pdCgpIHtcbiAgICB0aGlzLmNoYXJhY3RlckNvdW50ID0gdGhpcy5jb3VudENoYXJhY3RlcnModGhpcy5lZGl0b3JJbnN0YW5jZS5tb2RlbC5kb2N1bWVudCk7XG4gICAgdGhpcy5jaGFyYWN0ZXJzTGVmdCA9IHRoaXMuZ2V0Q2hhcmFjdGVyc0xlZnQoKTtcbiAgICB0aGlzLmxpbWl0RXhjZWVkZWQgPSAodGhpcy5jaGFyYWN0ZXJDb3VudCA8PSB0aGlzLnNldENoYXJhY3RlckxpbWl0KSA/IGZhbHNlIDogdHJ1ZTtcbiAgICB0aGlzLmhhc0Vycm9yLmVtaXQodGhpcy5saW1pdEV4Y2VlZGVkKTtcbiAgfVxuICAvKipcbiAgICogZnVuY3Rpb24gdG8gZ2V0IGltYWdlc1xuICAgKiBAcGFyYW0gb2Zmc2V0IHBhZ2Ugbm9cbiAgICovXG4gIGdldE15SW1hZ2VzKG9mZnNldCwgcXVlcnk/LCBzZWFyY2g/KSB7XG4gICAgdGhpcy5hc3NldHNDb3VudCA9IDA7XG4gICAgaWYgKCFzZWFyY2gpIHtcbiAgICAgIHRoaXMuc2VhcmNoTXlJbnB1dCA9ICcnO1xuICAgIH1cbiAgICBpZiAob2Zmc2V0ID09PSAwKSB7XG4gICAgICB0aGlzLm15QXNzZXRzLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgbWVkaWFUeXBlOiBbJ2ltYWdlJ10sXG4gICAgICAgIGNyZWF0ZWRCeTogXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZywgJ2NvbnRleHQudXNlci5pZCcpXG4gICAgICB9LFxuICAgICAgb2Zmc2V0XG4gICAgfTtcbiAgICBpZiAocXVlcnkpIHtcbiAgICAgIHJlcVsncXVlcnknXSA9IHF1ZXJ5O1xuICAgIH1cbiAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS5nZXRBc3NldE1lZGlhKHJlcSkucGlwZShjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICBjb25zdCBlcnJJbmZvID0geyBlcnJvck1zZzogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDIyJykgfTtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbykpO1xuICAgIH0pKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgdGhpcy5hc3NldHNDb3VudCA9IHJlcy5yZXN1bHQuY291bnQ7XG4gICAgICBfLm1hcChyZXMucmVzdWx0LmNvbnRlbnQsIChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmRvd25sb2FkVXJsKSB7XG4gICAgICAgICAgdGhpcy5teUFzc2V0cy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEltYWdlSW5FZGl0b3IoaW1hZ2VVcmwsIGltYWdlSWQsIGltYWdlTmFtZT8pIHtcbiAgICBjb25zdCBzcmMgPSB0aGlzLmdldE1lZGlhT3JpZ2luVVJMKGltYWdlVXJsKTtcbiAgICBjb25zdCBiYXNlVXJsID0gXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZywgJ2NvbnRleHQuaG9zdCcpIHx8IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbjtcbiAgICB0aGlzLm1lZGlhb2JqID0ge1xuICAgICAgaWQ6IGltYWdlSWQsXG4gICAgICB0eXBlOiAnaW1hZ2UnLFxuICAgICAgc3JjLFxuICAgICAgYmFzZVVybFxuICAgIH07XG4gICAgdGhpcy5lZGl0b3JJbnN0YW5jZS5tb2RlbC5jaGFuZ2Uod3JpdGVyID0+IHtcbiAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IHdyaXRlci5jcmVhdGVFbGVtZW50KCdpbWFnZScsIHtcbiAgICAgICAgc3JjLFxuICAgICAgICBhbHQ6IGltYWdlSWQsXG4gICAgICAgICdkYXRhLWFzc2V0LXZhcmlhYmxlJzogaW1hZ2VJZFxuICAgICAgfSk7XG4gICAgICB0aGlzLmVkaXRvckluc3RhbmNlLm1vZGVsLmluc2VydENvbnRlbnQoaW1hZ2VFbGVtZW50LCB0aGlzLmVkaXRvckluc3RhbmNlLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbik7XG4gICAgfSk7XG4gICAgdGhpcy5zaG93SW1hZ2VQaWNrZXIgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dJbWFnZVVwbG9hZE1vZGFsID0gZmFsc2U7XG4gIH1cblxuICBhZGRWaWRlb0luRWRpdG9yKHZpZGVvTW9kYWw/KSB7XG4gICAgY29uc3QgdmlkZW9EYXRhOiBhbnkgPSBfLmNsb25lRGVlcCh0aGlzLnNlbGVjdGVkVmlkZW8pO1xuICAgIHZpZGVvRGF0YS5zcmMgPSB0aGlzLmdldE1lZGlhT3JpZ2luVVJMKHZpZGVvRGF0YS5kb3dubG9hZFVybCk7XG4gICAgdmlkZW9EYXRhLnRodW1ibmFpbCA9ICh2aWRlb0RhdGEudGh1bWJuYWlsKSAmJiB0aGlzLmdldE1lZGlhT3JpZ2luVVJMKHZpZGVvRGF0YS50aHVtYm5haWwpO1xuICAgIHRoaXMuc2hvd1ZpZGVvUGlja2VyID0gZmFsc2U7XG4gICAgdGhpcy52aWRlb0RhdGFPdXRwdXQuZW1pdCh2aWRlb0RhdGEpO1xuICAgIGlmICh2aWRlb01vZGFsKSB7XG4gICAgICB2aWRlb01vZGFsLmRlbnkoKTtcbiAgICB9XG4gIH1cblxuXG4gIGdldEFsbEltYWdlcyhvZmZzZXQsIHF1ZXJ5Pywgc2VhcmNoPykge1xuICAgIHRoaXMuYXNzZXRzQ291bnQgPSAwO1xuICAgIGlmICghc2VhcmNoKSB7XG4gICAgICB0aGlzLnNlYXJjaEFsbElucHV0ID0gJyc7XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPT09IDApIHtcbiAgICAgIHRoaXMuYWxsSW1hZ2VzLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgbWVkaWFUeXBlOiBbJ2ltYWdlJ11cbiAgICAgIH0sXG4gICAgICBvZmZzZXRcbiAgICB9O1xuICAgIGlmIChxdWVyeSkge1xuICAgICAgcmVxWydxdWVyeSddID0gcXVlcnk7XG4gICAgfVxuICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLmdldEFzc2V0TWVkaWEocmVxKS5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgIGNvbnN0IGVyckluZm8gPSB7IGVycm9yTXNnOiBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UubGFiZWxDb25maWcsICdtZXNzYWdlcy5lcnJvci4wMjInKSB9O1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IodGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKSk7XG4gICAgfSkpXG4gICAgICAuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5hc3NldHNDb3VudCA9IHJlcy5yZXN1bHQuY291bnQ7XG4gICAgICAgIF8ubWFwKHJlcy5yZXN1bHQuY29udGVudCwgKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbS5kb3dubG9hZFVybCkge1xuICAgICAgICAgICAgdGhpcy5hbGxJbWFnZXMucHVzaChpdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogZnVuY3Rpb24gdG8gZ2V0IHZpZGVvc1xuICAgKiBAcGFyYW0gb2Zmc2V0IHBhZ2Ugbm9cbiAgICovXG4gIGdldE15VmlkZW9zKG9mZnNldCwgcXVlcnk/LCBzZWFyY2g/KSB7XG4gICAgdGhpcy5hc3NldHNDb3VudCA9IDA7XG4gICAgaWYgKCFzZWFyY2gpIHtcbiAgICAgIHRoaXMuc2VhcmNoTXlJbnB1dCA9ICcnO1xuICAgICAgdGhpcy5zZWxlY3RWaWRlbyh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAob2Zmc2V0ID09PSAwKSB7XG4gICAgICB0aGlzLm15QXNzZXRzLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIGNvbnN0IHJlcTogYW55ID0ge1xuICAgICAgZmlsdGVyczoge1xuICAgICAgICBtZWRpYVR5cGU6IFsndmlkZW8nXSxcbiAgICAgICAgY3JlYXRlZEJ5OiBfLmdldCh0aGlzLmVkaXRvclNlcnZpY2UuZWRpdG9yQ29uZmlnLCAnY29udGV4dC51c2VyLmlkJylcbiAgICAgIH0sXG4gICAgICBvZmZzZXRcbiAgICB9O1xuXG4gICAgaWYgKHF1ZXJ5KSB7XG4gICAgICByZXEucXVlcnkgPSBxdWVyeTtcbiAgICB9XG5cbiAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS5nZXRBc3NldE1lZGlhKHJlcSkucGlwZShjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICBjb25zdCBlcnJJbmZvID0geyBlcnJvck1zZzogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDIzJykgfTtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbykpO1xuICAgIH0pKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgdGhpcy5hc3NldHNDb3VudCA9IHJlcy5yZXN1bHQuY291bnQ7XG4gICAgICBfLm1hcChyZXMucmVzdWx0LmNvbnRlbnQsIChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmRvd25sb2FkVXJsKSB7XG4gICAgICAgICAgdGhpcy5teUFzc2V0cy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEFsbFZpZGVvcyhvZmZzZXQsIHF1ZXJ5Pywgc2VhcmNoPykge1xuICAgIHRoaXMuYXNzZXRzQ291bnQgPSAwO1xuICAgIGlmICghc2VhcmNoKSB7XG4gICAgICB0aGlzLnNlYXJjaEFsbElucHV0ID0gJyc7XG4gICAgICB0aGlzLnNlbGVjdFZpZGVvKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPT09IDApIHtcbiAgICAgIHRoaXMuYWxsVmlkZW9zLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIGNvbnN0IHJlcTogYW55ID0ge1xuICAgICAgZmlsdGVyczoge1xuICAgICAgICBtZWRpYVR5cGU6IFsndmlkZW8nXSxcbiAgICAgIH0sXG4gICAgICBvZmZzZXRcbiAgICB9O1xuICAgIGlmIChxdWVyeSkge1xuICAgICAgcmVxLnF1ZXJ5ID0gcXVlcnk7XG4gICAgfVxuXG4gICAgdGhpcy5xdWVzdGlvblNlcnZpY2UuZ2V0QXNzZXRNZWRpYShyZXEpLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgY29uc3QgZXJySW5mbyA9IHsgZXJyb3JNc2c6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAyMycpIH07XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcih0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pKTtcbiAgICB9KSkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIHRoaXMuYXNzZXRzQ291bnQgPSByZXMucmVzdWx0LmNvdW50O1xuICAgICAgXy5tYXAocmVzLnJlc3VsdC5jb250ZW50LCAoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5kb3dubG9hZFVybCkge1xuICAgICAgICAgIHRoaXMuYWxsVmlkZW9zLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGZ1bmN0aW9uIHRvIGxhenkgbG9hZCBteSBpbWFnZXNcbiAgICovXG4gIGxhenlsb2FkTXlJbWFnZXMoKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5teUFzc2V0cy5sZW5ndGg7XG4gICAgdGhpcy5nZXRNeUltYWdlcyhvZmZzZXQsIHRoaXMucXVlcnksIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGZ1bmN0aW9uIHRvIGxhenkgbG9hZCBhbGwgaW1hZ2VzXG4gICAqL1xuICBsYXp5bG9hZEFsbEltYWdlcygpIHtcbiAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmFsbEltYWdlcy5sZW5ndGg7XG4gICAgdGhpcy5nZXRBbGxJbWFnZXMob2Zmc2V0LCB0aGlzLnF1ZXJ5LCB0cnVlKTtcbiAgfVxuXG5cbiAgbGF6eWxvYWRNeVZpZGVvcygpIHtcbiAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm15QXNzZXRzLmxlbmd0aDtcbiAgICB0aGlzLmdldE15VmlkZW9zKG9mZnNldCwgdGhpcy5xdWVyeSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogZnVuY3Rpb24gdG8gbGF6eSBsb2FkIGFsbCB2aWRlb3NcbiAgICovXG4gIGxhenlsb2FkQWxsVmlkZW9zKCkge1xuICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYWxsVmlkZW9zLmxlbmd0aDtcbiAgICB0aGlzLmdldEFsbFZpZGVvcyhvZmZzZXQsIHRoaXMucXVlcnksIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGZ1bmN0aW9uIHRvIHVwbG9hZCBpbWFnZVxuICAgKi9cbiAgdXBsb2FkSW1hZ2UoZXZlbnQpIHtcbiAgICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuICAgIHRoaXMuYXNzZXROYW1lID0gZmlsZS5uYW1lO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgdGhpcy5mb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIHRoaXMuZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZSk7XG4gICAgY29uc3QgZmlsZVR5cGUgPSBmaWxlLnR5cGU7XG4gICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlLm5hbWUuc3BsaXQoJy4nKS5zbGljZSgwLCAtMSkuam9pbignLicpO1xuICAgIGNvbnN0IGZpbGVTaXplID0gZmlsZS5zaXplIC8gMTAyNCAvIDEwMjQ7XG4gICAgaWYgKGZpbGVUeXBlLnNwbGl0KCcvJylbMF0gPT09ICdpbWFnZScpIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yTXNnID0gZmFsc2U7XG4gICAgICBpZiAoZmlsZVNpemUgPiB0aGlzLmFzc2V0Q29uZmlnLmltYWdlLnNpemUpIHtcbiAgICAgICAgdGhpcy5zaG93RXJyb3JNc2cgPSB0cnVlO1xuICAgICAgICB0aGlzLmVycm9yTXNnID0gXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDIxJylcbiAgICAgICAgICArIHRoaXMuYXNzZXRDb25maWcuaW1hZ2Uuc2l6ZSArIHRoaXMuYXNzZXRDb25maWcuaW1hZ2Uuc2l6ZVR5cGU7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtQ29uZmlnKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVycm9yTXNnID0gJyc7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yTXNnID0gZmFsc2U7XG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dFcnJvck1zZyA9IHRydWU7XG4gICAgICB0aGlzLmVycm9yTXNnID0gXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDIwJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zaG93RXJyb3JNc2cpIHtcbiAgICAgIHRoaXMuaW1hZ2VGaWxlID0gZmlsZTtcbiAgICAgIHRoaXMuaW1hZ2VVcGxvYWRMb2FkZXIgPSB0cnVlO1xuICAgICAgdGhpcy5pbWFnZUZvcm1WYWxpZCA9IHRydWU7XG4gICAgICB0aGlzLmFzc2VzdERhdGEgPSB0aGlzLmdlbmVyYXRlQXNzZXRDcmVhdGVSZXF1ZXN0KGZpbGVOYW1lLCBmaWxlVHlwZSwgJ2ltYWdlJyk7XG4gICAgICB0aGlzLnBvcHVsYXRlRm9ybURhdGEodGhpcy5hc3Nlc3REYXRhKTtcbiAgICB9XG4gIH1cbiAgcmVzZXRGb3JtQ29uZmlnKCkge1xuICAgIHRoaXMuaW1hZ2VVcGxvYWRMb2FkZXIgPSBmYWxzZTtcbiAgICB0aGlzLmltYWdlRm9ybVZhbGlkID0gZmFsc2U7XG4gICAgdGhpcy5mb3JtQ29uZmlnID0gdGhpcy5pbml0aWFsRm9ybUNvbmZpZztcbiAgfVxuICBwb3B1bGF0ZUZvcm1EYXRhKGZvcm1EYXRhKSB7XG4gICAgY29uc3QgZm9ybXZhbHVlID0gXy5jbG9uZURlZXAodGhpcy5mb3JtQ29uZmlnKTtcbiAgICB0aGlzLmZvcm1Db25maWcgPSBudWxsO1xuICAgIF8uZm9yRWFjaChmb3JtdmFsdWUsIChmb3JtRmllbGRDYXRlZ29yeSkgPT4ge1xuICAgICAgZm9ybUZpZWxkQ2F0ZWdvcnkuZGVmYXVsdCA9IGZvcm1EYXRhW2Zvcm1GaWVsZENhdGVnb3J5LmNvZGVdO1xuICAgICAgZm9ybUZpZWxkQ2F0ZWdvcnkuZWRpdGFibGUgPSB0cnVlO1xuICAgIH0pO1xuICAgIHRoaXMuZm9ybUNvbmZpZyA9IGZvcm12YWx1ZTtcbiAgfVxuICB1cGxvYWRBbmRVc2VJbWFnZShtb2RhbCkge1xuICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLmNyZWF0ZU1lZGlhQXNzZXQoeyBjb250ZW50OiB0aGlzLmFzc2VzdERhdGEgfSkucGlwZShjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICBjb25zdCBlcnJJbmZvID0geyBlcnJvck1zZzogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDE5JykgfTtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbykpO1xuICAgIH0pKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgY29uc3QgaW1nSWQgPSByZXMucmVzdWx0Lm5vZGVfaWQ7XG4gICAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICBkYXRhOiB0aGlzLmZvcm1EYXRhXG4gICAgICB9O1xuICAgICAgdGhpcy5xdWVzdGlvblNlcnZpY2UudXBsb2FkTWVkaWEocmVxdWVzdCwgaW1nSWQpLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICBjb25zdCBlcnJJbmZvID0geyBlcnJvck1zZzogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDE5JykgfTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IodGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKSk7XG4gICAgICB9KSkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCBzaWduZWRVUkwgPSByZXNwb25zZS5yZXN1bHQucHJlX3NpZ25lZF91cmw7XG4gICAgICAgIGxldCBibG9iQ29uZmlnID0ge1xuICAgICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICAgICAgICBjb250ZW50VHlwZTogJ0Fzc2V0J1xuICAgICAgICB9O1xuICAgICAgICBibG9iQ29uZmlnID0gdGhpcy5lZGl0b3JTZXJ2aWNlLmFwcGVuZENsb3VkU3RvcmFnZUhlYWRlcnMoYmxvYkNvbmZpZyk7XG4gICAgICAgIHRoaXMudXBsb2FkVG9CbG9iKHNpZ25lZFVSTCwgdGhpcy5pbWFnZUZpbGUsIGJsb2JDb25maWcpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsZVVSTCA9IHNpZ25lZFVSTC5zcGxpdCgnPycpWzBdO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICBkYXRhLmFwcGVuZCgnZmlsZVVybCcsIGZpbGVVUkwpO1xuICAgICAgICAgIGRhdGEuYXBwZW5kKCdtaW1lVHlwZScsIHRoaXMuaW1hZ2VGaWxlLnR5cGUpO1xuICAgICAgICAgIGNvbnN0IGNvbmZpZzEgPSB7XG4gICAgICAgICAgICBlbmN0eXBlOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsXG4gICAgICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsXG4gICAgICAgICAgICBjYWNoZTogZmFsc2VcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHVwbG9hZE1lZGlhQ29uZmlnID0ge1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhcmFtOiBjb25maWcxXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS51cGxvYWRNZWRpYSh1cGxvYWRNZWRpYUNvbmZpZywgaW1nSWQpLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXJySW5mbyA9IHsgZXJyb3JNc2c6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAxOScpIH07XG4gICAgICAgICAgICB0aGlzLmlzQ2xvc2FibGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmltYWdlRm9ybVZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbykpO1xuICAgICAgICAgIH0pKS5zdWJzY3JpYmUoKHJlc3BvbnNlMSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRJbWFnZUluRWRpdG9yKHJlc3BvbnNlMS5yZXN1bHQuY29udGVudF91cmwsIHJlc3BvbnNlMS5yZXN1bHQubm9kZV9pZCwgdGhpcy5hc3Nlc3REYXRhWyduYW1lJ10pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIG9wZW5JbWFnZVVwbG9hZE1vZGFsKCkge1xuICAgIHRoaXMuc2hvd0ltYWdlVXBsb2FkTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMucmVzZXRGb3JtRGF0YSgpO1xuICB9XG4gIGRpc21pc3NQb3BzKG1vZGFsKSB7XG4gICAgdGhpcy5kaXNtaXNzSW1hZ2VQaWNrZXIoKTtcbiAgICBtb2RhbC5kZW55KCk7XG4gIH1cbiAgb25TdGF0dXNDaGFuZ2VzKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmlzVmFsaWQgJiYgdGhpcy5pbWFnZVVwbG9hZExvYWRlcikge1xuICAgICAgdGhpcy5pbWFnZUZvcm1WYWxpZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW1hZ2VGb3JtVmFsaWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgdmFsdWVDaGFuZ2VzKGV2ZW50KSB7XG4gICAgdGhpcy5hc3Nlc3REYXRhID0gXy5tZXJnZSh7fSwgdGhpcy5hc3Nlc3REYXRhLCBldmVudCk7XG4gIH1cbiAgLy8gc2VhcmNoIGZlYXR1cmUgZm9yIGltYWdlc1xuICBzZWFyY2hJbWFnZXMoZXZlbnQsIHR5cGUpIHtcbiAgICBpZiAoZXZlbnQgPT09ICdjbGVhcklucHV0JyAmJiB0eXBlID09PSAnbXlJbWFnZXMnKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gJyc7XG4gICAgICB0aGlzLnNlYXJjaE15SW5wdXQgPSAnJztcbiAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSAnY2xlYXJJbnB1dCcgJiYgdHlwZSA9PT0gJ2FsbEltYWdlcycpIHtcbiAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgIHRoaXMuc2VhcmNoQWxsSW5wdXQgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5xdWVyeSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdteUltYWdlcycpIHtcbiAgICAgIHRoaXMuZ2V0TXlJbWFnZXMoMCwgdGhpcy5xdWVyeSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2V0QWxsSW1hZ2VzKDAsIHRoaXMucXVlcnksIHRydWUpO1xuICAgIH1cbiAgfVxuICAvLyBnZW5lcmFsIG1ldGhvZFxuICByZXNldEZvcm1EYXRhKCkge1xuICAgIHRoaXMuc2hvd0Vycm9yTXNnID0gZmFsc2U7XG4gICAgdGhpcy5mb3JtRGF0YSA9IG51bGw7XG4gICAgdGhpcy5mb3JtQ29uZmlnID0gdGhpcy5pbml0aWFsRm9ybUNvbmZpZztcbiAgICB0aGlzLmltYWdlVXBsb2FkTG9hZGVyID0gZmFsc2U7XG4gICAgdGhpcy5pbWFnZUZvcm1WYWxpZCA9IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBmdW5jdGlvbiB0byB1cGxvYWQgdmlkZW9cbiAgICovXG4gIG9wZW5WaWRlb1VwbG9hZE1vZGFsKCkge1xuICAgIHRoaXMuc2hvd1ZpZGVvVXBsb2FkTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMucmVzZXRGb3JtRGF0YSgpO1xuICB9XG4gIGRpc21pc3NWaWRlb1BvcHMobW9kYWwpIHtcbiAgICBpZiAodGhpcy5pc0Nsb3NhYmxlKSB7XG4gICAgICB0aGlzLmRpc21pc3NWaWRlb1BpY2tlcigpO1xuICAgICAgbW9kYWwuZGVueSgpO1xuICAgIH1cbiAgfVxuICB1cGxvYWRWaWRlb0Zyb21Mb2NhbChldmVudCkge1xuICAgIHRoaXMudmlkZW9GaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgdGhpcy5mb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIHRoaXMuZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgdGhpcy52aWRlb0ZpbGUpO1xuICAgIGNvbnN0IGZpbGVUeXBlID0gdGhpcy52aWRlb0ZpbGUudHlwZTtcbiAgICBjb25zdCBmaWxlTmFtZSA9IHRoaXMudmlkZW9GaWxlLm5hbWUuc3BsaXQoJy4nKS5zbGljZSgwLCAtMSkuam9pbignLicpO1xuICAgIGNvbnN0IGZpbGVTaXplID0gdGhpcy52aWRlb0ZpbGUuc2l6ZSAvIDEwMjQgLyAxMDI0O1xuICAgIGlmIChfLmluY2x1ZGVzKGZpbGVUeXBlLnNwbGl0KCcvJyksICd2aWRlbycpKSB7XG4gICAgICB0aGlzLnNob3dFcnJvck1zZyA9IGZhbHNlO1xuICAgICAgaWYgKGZpbGVTaXplID4gdGhpcy5hc3NldENvbmZpZy52aWRlby5zaXplKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yTXNnID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lcnJvck1zZyA9IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAyMScpICtcbiAgICAgICAgICB0aGlzLmFzc2V0Q29uZmlnLnZpZGVvLnNpemUgKyB0aGlzLmFzc2V0Q29uZmlnLnZpZGVvLnNpemVUeXBlO1xuICAgICAgICB0aGlzLnJlc2V0Rm9ybUNvbmZpZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lcnJvck1zZyA9ICcnO1xuICAgICAgICB0aGlzLnNob3dFcnJvck1zZyA9IGZhbHNlO1xuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTCh0aGlzLnZpZGVvRmlsZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yTXNnID0gdHJ1ZTtcbiAgICAgIHRoaXMuZXJyb3JNc2cgPSBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UubGFiZWxDb25maWcsICdtZXNzYWdlcy5lcnJvci4wMjQnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNob3dFcnJvck1zZykge1xuICAgICAgdGhpcy5pbWFnZVVwbG9hZExvYWRlciA9IHRydWU7XG4gICAgICB0aGlzLmltYWdlRm9ybVZhbGlkID0gdHJ1ZTtcbiAgICAgIHRoaXMuYXNzZXN0RGF0YSA9IHRoaXMuZ2VuZXJhdGVBc3NldENyZWF0ZVJlcXVlc3QoZmlsZU5hbWUsIGZpbGVUeXBlLCAndmlkZW8nKTtcbiAgICAgIHRoaXMucG9wdWxhdGVGb3JtRGF0YSh0aGlzLmFzc2VzdERhdGEpO1xuICAgIH1cbiAgfVxuICB1cGxvYWRWaWRlbyh2aWRlb01vZGFsKSB7XG4gICAgdGhpcy5pc0Nsb3NhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNob3dFcnJvck1zZyA9IGZhbHNlO1xuICAgIHRoaXMuaW1hZ2VGb3JtVmFsaWQgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuc2hvd0Vycm9yTXNnKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS5jcmVhdGVNZWRpYUFzc2V0KHsgY29udGVudDogdGhpcy5hc3Nlc3REYXRhIH0pLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0Nsb3NhYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbWFnZUZvcm1WYWxpZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGVyckluZm8gPSB7IGVycm9yTXNnOiBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UubGFiZWxDb25maWcsICdtZXNzYWdlcy5lcnJvci4wMjUnKSB9O1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcih0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pKTtcbiAgICAgIH0pKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50SWQgPSByZXMucmVzdWx0Lm5vZGVfaWQ7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgZmlsZU5hbWU6IHRoaXMudmlkZW9GaWxlLm5hbWVcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLmdlbmVyYXRlUHJlU2lnbmVkVXJsKHJlcXVlc3QsIGNvbnRlbnRJZCkucGlwZShjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgY29uc3QgZXJySW5mbyA9IHsgZXJyb3JNc2c6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAyNicpIH07XG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5pc0Nsb3NhYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmltYWdlRm9ybVZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcih0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pKTtcbiAgICAgICAgfSkpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBjb25zdCBzaWduZWRVUkwgPSByZXNwb25zZS5yZXN1bHQucHJlX3NpZ25lZF91cmw7XG4gICAgICAgICAgbGV0IGJsb2JDb25maWcgPSB7XG4gICAgICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ0Fzc2V0J1xuICAgICAgICAgIH07XG4gICAgICAgICAgYmxvYkNvbmZpZyA9IHRoaXMuZWRpdG9yU2VydmljZS5hcHBlbmRDbG91ZFN0b3JhZ2VIZWFkZXJzKGJsb2JDb25maWcpO1xuICAgICAgICAgIHRoaXMudXBsb2FkVG9CbG9iKHNpZ25lZFVSTCwgdGhpcy52aWRlb0ZpbGUsIGJsb2JDb25maWcpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWxlVVJMID0gc2lnbmVkVVJMLnNwbGl0KCc/JylbMF07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnRXaXRoVVJMKGZpbGVVUkwsIHRoaXMudmlkZW9GaWxlLnR5cGUsIGNvbnRlbnRJZCwgdmlkZW9Nb2RhbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVBc3NldENyZWF0ZVJlcXVlc3QoZmlsZU5hbWUsIGZpbGVUeXBlLCBtZWRpYVR5cGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogZmlsZU5hbWUsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBtaW1lVHlwZTogZmlsZVR5cGUsXG4gICAgICBjcmVhdGVkQnk6IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LnVzZXIuaWQnKSxcbiAgICAgIGNyZWF0b3I6IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LnVzZXIuZnVsbE5hbWUnKSxcbiAgICAgIGNoYW5uZWw6IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LmNoYW5uZWwnKVxuICAgIH07XG4gIH1cblxuICB1cGxvYWRUb0Jsb2Ioc2lnbmVkVVJMLCBmaWxlLCBjb25maWcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IGNzcCA9IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LmNsb3VkU3RvcmFnZS5wcm92aWRlcicsICdhenVyZScpO1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcbiAgICAgIGNvbnN0IHVwbG9hZGVyTGliID0gbmV3IFN1bmJpcmRGaWxlVXBsb2FkTGliLkZpbGVVcGxvYWRlcigpO1xuICAgICAgdXBsb2FkZXJMaWIudXBsb2FkKHsgdXJsOiBzaWduZWRVUkwsIGZpbGUsIGNzcCB9KVxuICAgICAgICAub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zdCBlcnJJbmZvID0geyBlcnJvck1zZzogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDE4JykgfTtcbiAgICAgICAgICB0aGlzLmlzQ2xvc2FibGUgPSB0cnVlO1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaW1hZ2VGb3JtVmFsaWQgPSB0cnVlO1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVycm9yLCBlcnJJbmZvKSk7XG4gICAgICAgIH0pLm9uKFwiY29tcGxldGVkXCIsIChjb21wbGV0ZWQpID0+IHtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KGNvbXBsZXRlZCk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZUNvbnRlbnRXaXRoVVJMKGZpbGVVUkwsIG1pbWVUeXBlLCBjb250ZW50SWQsIHZpZGVvTW9kYWw/KSB7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGRhdGEuYXBwZW5kKCdmaWxlVXJsJywgZmlsZVVSTCk7XG4gICAgZGF0YS5hcHBlbmQoJ21pbWVUeXBlJywgbWltZVR5cGUpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGVuY3R5cGU6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyxcbiAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICAgIGNvbnRlbnRUeXBlOiBmYWxzZSxcbiAgICAgIGNhY2hlOiBmYWxzZVxuICAgIH07XG4gICAgY29uc3Qgb3B0aW9uID0ge1xuICAgICAgZGF0YSxcbiAgICAgIHBhcmFtOiBjb25maWdcbiAgICB9O1xuICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLnVwbG9hZE1lZGlhKG9wdGlvbiwgY29udGVudElkKS5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgIGNvbnN0IGVyckluZm8gPSB7IGVycm9yTXNnOiBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UubGFiZWxDb25maWcsICdtZXNzYWdlcy5lcnJvci4wMjcnKSB9O1xuICAgICAgdGhpcy5pc0Nsb3NhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5pbWFnZUZvcm1WYWxpZCA9IHRydWU7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcih0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pKTtcbiAgICB9KSkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAvLyBSZWFkIHVwbG9hZCB2aWRlbyBkYXRhXG4gICAgICB0aGlzLmdldFVwbG9hZFZpZGVvKHJlcy5yZXN1bHQubm9kZV9pZCwgdmlkZW9Nb2RhbCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRVcGxvYWRWaWRlbyh2aWRlb0lkLCB2aWRlb01vZGFsPykge1xuICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLmdldFZpZGVvKHZpZGVvSWQpLnBpcGUobWFwKChkYXRhOiBhbnkpID0+IGRhdGEucmVzdWx0LmNvbnRlbnQpLCBjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICBjb25zdCBlcnJJbmZvID0geyBlcnJvck1zZzogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDExJykgfTtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5pc0Nsb3NhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW1hZ2VGb3JtVmFsaWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IodGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKSk7XG4gICAgfSkpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5zdWNjZXNzKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLnN1Y2Nlc3MuMDA2JykpO1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZGVvID0gcmVzO1xuICAgICAgdGhpcy5zaG93QWRkQnV0dG9uID0gdHJ1ZTtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5pc0Nsb3NhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW1hZ2VGb3JtVmFsaWQgPSB0cnVlO1xuICAgICAgdGhpcy5hZGRWaWRlb0luRWRpdG9yKHZpZGVvTW9kYWwpO1xuICAgIH0pO1xuICB9XG5cbiAgc2VhcmNoTXlWaWRlbyhldmVudCkge1xuICAgIHRoaXMucXVlcnkgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5nZXRNeVZpZGVvcygwLCB0aGlzLnF1ZXJ5KTtcbiAgfVxuICBzZWFyY2hBbGxWaWRlbyhldmVudCkge1xuICAgIHRoaXMucXVlcnkgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5nZXRBbGxWaWRlb3MoMCwgdGhpcy5xdWVyeSk7XG4gIH1cbiAgLy8gc2VhcmNoVmlkZW8gZmVhdHVyZVxuICBzZWFyY2hWaWRlbyhldmVudCwgdHlwZSkge1xuICAgIGlmIChldmVudCA9PT0gJ2NsZWFySW5wdXQnICYmIHR5cGUgPT09ICdteVZpZGVvcycpIHtcbiAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgIHRoaXMuc2VhcmNoTXlJbnB1dCA9ICcnO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdjbGVhcklucHV0JyAmJiB0eXBlID09PSAnYWxsVmlkZW9zJykge1xuICAgICAgdGhpcy5xdWVyeSA9ICcnO1xuICAgICAgdGhpcy5zZWFyY2hBbGxJbnB1dCA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ215VmlkZW9zJykge1xuICAgICAgdGhpcy5nZXRNeVZpZGVvcygwLCB0aGlzLnF1ZXJ5LCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZXRBbGxWaWRlb3MoMCwgdGhpcy5xdWVyeSwgdHJ1ZSk7XG4gICAgfVxuICB9XG4gIHNlbGVjdFZpZGVvKGRhdGEpIHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgdGhpcy5zaG93QWRkQnV0dG9uID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWaWRlb0lkID0gZGF0YS5pZGVudGlmaWVyO1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZGVvID0gZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93QWRkQnV0dG9uID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlkZW9JZCA9ICcnO1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZGVvID0ge307XG4gICAgfVxuXG4gIH1cblxuICBjb3VudENoYXJhY3RlcnMoZG9jdW1lbnQpIHtcbiAgICBjb25zdCByb290RWxlbWVudCA9IGRvY3VtZW50LmdldFJvb3QoKTtcbiAgICByZXR1cm4gdGhpcy5jb3VudENoYXJhY3RlcnNJbkVsZW1lbnQocm9vdEVsZW1lbnQpO1xuICB9XG4gIGNvdW50Q2hhcmFjdGVyc0luRWxlbWVudChub2RlKSB7XG4gICAgbGV0IGNoYXJzID0gMDtcbiAgICBjb25zdCBmb3JFYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2g7XG4gICAgY29uc3QgZm9yRSA9IG5vZGUuZ2V0Q2hpbGRyZW4oKTtcbiAgICBsZXQgY2hpbGQ7XG5cbiAgICB3aGlsZSAoIShjaGlsZCA9IGZvckUubmV4dCgpKS5kb25lKSB7XG4gICAgICBpZiAoY2hpbGQudmFsdWUuaXMoJ3RleHQnKSkge1xuICAgICAgICBjaGFycyArPSBjaGlsZC52YWx1ZS5kYXRhLmxlbmd0aDtcbiAgICAgIH0gZWxzZSBpZiAoY2hpbGQudmFsdWUuaXMoJ2VsZW1lbnQnKSkge1xuICAgICAgICBjaGFycyArPSB0aGlzLmNvdW50Q2hhcmFjdGVyc0luRWxlbWVudChjaGlsZC52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGFycztcbiAgfVxuXG4gIGdldE1lZGlhT3JpZ2luVVJMKHNyYykge1xuICAgIGNvbnN0IHJlcGxhY2VUZXh0ID0gdGhpcy5hc3NldFByb3h5VXJsO1xuICAgIGNvbnN0IGNsb3VkU3RvcmFnZVVybHMgPSBfLmNvbXBhY3QoXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZywgJ2NvbnRleHQuY2xvdWRTdG9yYWdlVXJscycpIHx8IFtdKTtcbiAgICBfLmZvckVhY2goY2xvdWRTdG9yYWdlVXJscywgdXJsID0+IHtcbiAgICAgIGlmIChzcmMuaW5kZXhPZih1cmwpICE9PSAtMSkge1xuICAgICAgICBzcmMgPSBzcmMucmVwbGFjZSh1cmwsIHJlcGxhY2VUZXh0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3JjO1xuICB9XG4gIC8vIEhlcmUgRXZlbnQgbGlzdGVuZXIgaXMgYXR0YWNoZWQgdG8gZG9jdW1lbnQgdG8gbGlzdGVuIHRoZSBjbGljayBldmVudCBmcm9tIFdpcmlzIHBsdWdpbiAoJ09LJy0+IGJ1dHRvbilcbiAgYXR0YWNoRXZlbnQoZWRpdG9yKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICAgIGlmIChlLnRhcmdldCAmJiAoZS50YXJnZXQgYXMgRWxlbWVudCkuY2xhc3NOYW1lID09PSAnd3JzX21vZGFsX2J1dHRvbl9hY2NlcHQnKSB7XG4gICAgICAgIGVkaXRvci5tb2RlbC5jaGFuZ2Uod3JpdGVyID0+IHtcbiAgICAgICAgICBjb25zdCBpbnNlcnRQb3NpdGlvbiA9IGVkaXRvci5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb24uZ2V0Rmlyc3RQb3NpdGlvbigpO1xuICAgICAgICAgIHdyaXRlci5pbnNlcnRUZXh0KCcgJywgaW5zZXJ0UG9zaXRpb24pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldENoYXJhY3RlcnNMZWZ0KCkge1xuICAgIGlmICh0aGlzLnNldENoYXJhY3RlckxpbWl0KSB7XG4gICAgICBsZXQgY2hhclJlbWFpbmluZyA9IHRoaXMuc2V0Q2hhcmFjdGVyTGltaXQgLSB0aGlzLmNoYXJhY3RlckNvdW50O1xuICAgICAgcmV0dXJuIGNoYXJSZW1haW5pbmcgPiAwID8gY2hhclJlbWFpbmluZyA6IDA7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZWRpdG9yV3JhcHBlclwiIFtuZ0NsYXNzXT1cInsnaGFzRXJyb3InOiBsaW1pdEV4Y2VlZGVkfVwiPlxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLXRvb2x0aXA9XCJBZGQgaW1hZ2VcIiBkYXRhLXBvc2l0aW9uPVwiYm90dG9tIGNlbnRlclwiIGRhdGEtdmFyaWF0aW9uPVwibWluaVwiIGRhdGEtaW52ZXJ0ZWQ9XCJcIlxuICAgIHRpdGxlPVwiQWRkIGltYWdlXCIgW2Rpc2FibGVkXT1cImlzQXNzZXRCcm93c2VyUmVhZE9ubHkgfHwgaXNFZGl0b3JGb2N1c2VkXCIgKGNsaWNrKT1cImluaXRpYWxpemVJbWFnZVBpY2tlcigncXVlc3Rpb24nKVwiXG4gICAgY2xhc3M9XCJ1aSBpY29uIGJ1dHRvbiBpbnNlcnQtaW1hZ2UtYnRuXCI+XG4gICAgPGkgY2xhc3M9XCJpbWFnZSBvdXRsaW5lIGljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gIDwvYnV0dG9uPlxuICA8dGV4dGFyZWEgY2xhc3M9XCJlZGl0b3JcIiAjZWRpdG9yIG5hbWU9XCJxdWVzdGlvblwiIHBsYWNlaG9sZGVyPVwiXCI+PC90ZXh0YXJlYT5cbiAgPGRpdiAqbmdJZj1cInNldENoYXJhY3RlckxpbWl0ID4gMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjaGFyYWN0ZXJDb3VudFwiPlxuICAgICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmNoYXJhY3RlcnNMZWZ0fX0ge3tjaGFyYWN0ZXJzTGVmdH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxzdWktbW9kYWwgW2lzQ2xvc2FibGVdPVwidHJ1ZVwiIGNsYXNzPVwic2ItbW9kYWwgb3ZlcmZsb3ctbW9kYWxcIiBbaXNJbnZlcnRlZF09XCJmYWxzZVwiIChkaXNtaXNzZWQpPVwiZGlzbWlzc0ltYWdlUGlja2VyKClcIlxuICAqbmdJZj1cInNob3dJbWFnZVBpY2tlclwiIFtzaXplXT1cIidub3JtYWwnXCIgW2lzRnVsbFNjcmVlbl09XCJmYWxzZVwiIFttdXN0U2Nyb2xsXT1cInRydWVcIiAjbW9kYWw+XG4gIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1oZWFkZXJcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uc2VsZWN0SW1hZ2V9fTwvZGl2PlxuICA8ZGl2IGNsYXNzPVwic2ItbW9kYWwtY29udGVudCBwLTBcIj5cbiAgICA8c3VpLXRhYnNldD5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYi10YWJzZXQtbWVudVwiPlxuICAgICAgICA8YSBjbGFzcz1cInNiLWl0ZW1cIiAoYWN0aXZhdGUpPVwiZ2V0TXlJbWFnZXMoMClcIiBzdWlUYWJIZWFkZXI9XCIxXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/Lm15SW1hZ2VzfX08L2E+XG4gICAgICAgIDxhIGNsYXNzPVwic2ItaXRlbVwiIChhY3RpdmF0ZSk9XCJnZXRBbGxJbWFnZXMoMClcIiBzdWlUYWJIZWFkZXI9XCIyXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmFsbEltYWdlfX08L2E+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ1aSBzZWdtZW50IHNiLXRhYnNldC1zZWdtZW50IG0tMCBwdC0xNVwiIGluZmluaXRlU2Nyb2xsIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cIjJcIlxuICAgICAgICBbaW5maW5pdGVTY3JvbGxUaHJvdHRsZV09XCI1MDBcIiBbc2Nyb2xsV2luZG93XT1cImZhbHNlXCIgKHNjcm9sbGVkKT1cImxhenlsb2FkTXlJbWFnZXMoKVwiIHN1aVRhYkNvbnRlbnQ9XCIxXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1aSAgcGItMTYgZC1mbGV4IHBsLTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Itc2VhcmNoLWJveCBzbWFsbCBuby1idG5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1kaXYgcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJzZWFyY2ggaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwic2VhcmNoSW1hZ2VzKCRldmVudCwgJ215SW1hZ2VzJylcIiBjbGFzcz1cInNiLXNlYXJjaC1pbnB1dFwiIFsobmdNb2RlbCldPVwic2VhcmNoTXlJbnB1dFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj17e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uc2VhcmNoUGxhY2Vob2xkZXJ9fSAvPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImNsb3NlIGljb25cIiAoY2xpY2spPVwic2VhcmNoSW1hZ2VzKCdjbGVhcklucHV0JywgJ215SW1hZ2VzJylcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzYi1idG4gc2ItYnRuLW5vcm1hbFwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uYnV0dG9uX2xhYmVscz8uc2VhcmNoX2J0bl9sYWJlbH19PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHAgY2xhc3M9XCJmcy0wLTk4NiBtbC1hdXRvIHNiLWNvbG9yLWdyZXlcIiA+e3thc3NldHNDb3VudH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFteUFzc2V0cz8ubGVuZ3RoICYmIHNlYXJjaE15SW5wdXRcIiBjbGFzcz1cImZzLTA3ODVcIj4ge3tlbXB0eUltYWdlU2VhcmNoTWVzc2FnZX19IDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2ItZ3JpZC1sYXlvdXQgaW1hZ2VcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2ItdmlkZW8tY29udGVudFwiICpuZ0Zvcj1cImxldCBkYXRhIG9mIG15QXNzZXRzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2ItaW1hZ2Utc2VjdGlvbiByZWxhdGl2ZSBwb3NpdGlvblwiPlxuICAgICAgICAgICAgICA8aW1nIChjbGljayk9XCJhZGRJbWFnZUluRWRpdG9yKGRhdGEuZG93bmxvYWRVcmwsIGRhdGEuaWRlbnRpZmllcilcIiBbc3JjXT1cImRhdGEuZG93bmxvYWRVcmxcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ1aSBzZWdtZW50IHNiLXRhYnNldC1zZWdtZW50IG0tMCBwdC0xNVwiIGluZmluaXRlU2Nyb2xsIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cIjJcIlxuICAgICAgICBbaW5maW5pdGVTY3JvbGxUaHJvdHRsZV09XCI1MDBcIiBbc2Nyb2xsV2luZG93XT1cImZhbHNlXCIgKHNjcm9sbGVkKT1cImxhenlsb2FkQWxsSW1hZ2VzKClcIiBzdWlUYWJDb250ZW50PVwiMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidWkgIHBiLTE2IGQtZmxleCBwbC0wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiLXNlYXJjaC1ib3ggc21hbGwgbm8tYnRuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZGl2IHJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwic2VhcmNoIGljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cInNlYXJjaEltYWdlcygkZXZlbnQsICdhbGxJbWFnZXMnKVwiIGNsYXNzPVwic2Itc2VhcmNoLWlucHV0XCIgWyhuZ01vZGVsKV09XCJzZWFyY2hBbGxJbnB1dFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj17e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uc2VhcmNoUGxhY2Vob2xkZXJ9fSAvPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImNsb3NlIGljb25cIiAoY2xpY2spPVwic2VhcmNoSW1hZ2VzKCdjbGVhcklucHV0JywgJ2FsbEltYWdlcycpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWxcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LnNlYXJjaF9idG5fbGFiZWx9fTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwiZnMtMC05ODYgbWwtYXV0byBzYi1jb2xvci1ncmV5XCI+e3thc3NldHNDb3VudH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFhbGxJbWFnZXM/Lmxlbmd0aCAmJiBzZWFyY2hBbGxJbnB1dFwiIGNsYXNzPVwiZnMtMDc4NVwiPiB7e2VtcHR5SW1hZ2VTZWFyY2hNZXNzYWdlfX0gPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYi1ncmlkLWxheW91dCBpbWFnZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi12aWRlby1jb250ZW50XCIgKm5nRm9yPVwibGV0IGRhdGEgb2YgYWxsSW1hZ2VzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2ItaW1hZ2Utc2VjdGlvblwiPlxuICAgICAgICAgICAgICA8aW1nIChjbGljayk9XCJhZGRJbWFnZUluRWRpdG9yKGRhdGEuZG93bmxvYWRVcmwsIGRhdGEuaWRlbnRpZmllcilcIiBbc3JjXT1cImRhdGEuZG93bmxvYWRVcmxcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG4gICAgPC9zdWktdGFic2V0PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWFjdGlvbnMgZmxleC1qYy1zcGFjZS1lbmRcIj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJvcGVuSW1hZ2VVcGxvYWRNb2RhbCgpO1wiIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1wcmltYXJ5IHNiLWJ0bi1ub3JtYWxcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LnVwbG9hZF91c2VfYnRuX2xhYmVsfX08L2J1dHRvbj5cbiAgPC9kaXY+XG48L3N1aS1tb2RhbD5cblxuPHN1aS1tb2RhbCBbaXNDbG9zYWJsZV09XCJpc0Nsb3NhYmxlXCIgY2xhc3M9XCJzYi1tb2RhbCBvdmVyZmxvdy1tb2RhbFwiIFtpc0ludmVydGVkXT1cImZhbHNlXCJcbiAgKGRpc21pc3NlZCk9XCJkaXNtaXNzVmlkZW9QaWNrZXIoKVwiICpuZ0lmPVwic2hvd1ZpZGVvUGlja2VyXCIgW3NpemVdPVwiJ25vcm1hbCdcIiBbaXNGdWxsU2NyZWVuXT1cImZhbHNlXCJcbiAgW211c3RTY3JvbGxdPVwidHJ1ZVwiICNtb2RhbD5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWhlYWRlclwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5zZWxlY3RWaWRlb319PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1jb250ZW50IHAtMFwiPlxuICAgIDxzdWktdGFic2V0PlxuICAgICAgPGRpdiBjbGFzcz1cInNiLXRhYnNldC1tZW51XCI+XG4gICAgICAgIDxhIGNsYXNzPVwic2ItaXRlbVwiIChhY3RpdmF0ZSk9XCJnZXRNeVZpZGVvcygwKVwiIHN1aVRhYkhlYWRlcj1cIjFcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8ubXlWaWRlb3N9fTwvYT5cbiAgICAgICAgPGEgY2xhc3M9XCJzYi1pdGVtXCIgKGFjdGl2YXRlKT1cImdldEFsbFZpZGVvcygwKVwiIHN1aVRhYkhlYWRlcj1cIjJcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uYWxsVmlkZW9zfX08L2E+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInVpIHNlZ21lbnQgc2ItdGFic2V0LXNlZ21lbnQgbS0wIHB0LTE1XCIgaW5maW5pdGVTY3JvbGwgW2luZmluaXRlU2Nyb2xsRGlzdGFuY2VdPVwiMlwiXG4gICAgICAgIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjUwMFwiIFtzY3JvbGxXaW5kb3ddPVwiZmFsc2VcIiAoc2Nyb2xsZWQpPVwibGF6eWxvYWRNeVZpZGVvcygpXCIgc3VpVGFiQ29udGVudD1cIjFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBiLTE2IGQtZmxleCBwbC0wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiLXNlYXJjaC1ib3ggc21hbGwgbm8tYnRuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZGl2IHJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwic2VhcmNoIGljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cInNlYXJjaFZpZGVvKCRldmVudCwgJ215VmlkZW9zJylcIiBjbGFzcz1cInNiLXNlYXJjaC1pbnB1dFwiIFsobmdNb2RlbCldPVwic2VhcmNoTXlJbnB1dFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj17e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uc2VhcmNoUGxhY2Vob2xkZXJ9fSAvPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImNsb3NlIGljb25cIiAoY2xpY2spPVwic2VhcmNoVmlkZW8oJ2NsZWFySW5wdXQnLCAnbXlWaWRlb3MnKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNiLWJ0biBzYi1idG4tbm9ybWFsXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy5zZWFyY2hfYnRuX2xhYmVsfX08L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cCBjbGFzcz1cImZzLTAtOTg2IG1sLWF1dG8gc2ItY29sb3ItZ3JleVwiID57e2Fzc2V0c0NvdW50fX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIW15QXNzZXRzPy5sZW5ndGggJiYgc2VhcmNoTXlJbnB1dFwiIGNsYXNzPVwiZnMtMDc4NVwiPiB7e2VtcHR5VmlkZW9TZWFyY2hNZXNzYWdlfX0gPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYi1ncmlkLWxheW91dCB2aWRlb1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi12aWRlby1jb250ZW50XCIgKm5nRm9yPVwibGV0IGRhdGEgb2YgbXlBc3NldHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1pbWFnZS1zZWN0aW9uIHJlbGF0aXZlIHBvc2l0aW9uXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBzZWxlY3RlZFZpZGVvSWQgPT09IGRhdGEuaWRlbnRpZmllcn1cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VmlkZW8oZGF0YSlcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktaW1hZ2VcIj48aSBjbGFzcz1cInBsYXkgY2lyY2xlIGljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9kaXY+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiY2hlY2sgY2lyY2xlIGljb24gc2VsZWN0ZWQtdmlkZW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCJkYXRhLnRodW1ibmFpbFwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInVpIHNlZ21lbnQgc2ItdGFic2V0LXNlZ21lbnQgbS0wIHB0LTE1XCIgaW5maW5pdGVTY3JvbGwgW2luZmluaXRlU2Nyb2xsRGlzdGFuY2VdPVwiMlwiXG4gICAgICAgIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjUwMFwiIFtzY3JvbGxXaW5kb3ddPVwiZmFsc2VcIiAoc2Nyb2xsZWQpPVwibGF6eWxvYWRBbGxWaWRlb3MoKVwiIHN1aVRhYkNvbnRlbnQ9XCIyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCIgcGItMTYgZC1mbGV4IHBsLTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Itc2VhcmNoLWJveCBzbWFsbCBuby1idG5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1kaXYgcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJzZWFyY2ggaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwic2VhcmNoVmlkZW8oJGV2ZW50LCAnYWxsVmlkZW9zJylcIiBjbGFzcz1cInNiLXNlYXJjaC1pbnB1dFwiIFsobmdNb2RlbCldPVwic2VhcmNoQWxsSW5wdXRcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LnNlYXJjaFBsYWNlaG9sZGVyfX0gLz5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJjbG9zZSBpY29uXCIgKGNsaWNrKT1cInNlYXJjaFZpZGVvKCdjbGVhcklucHV0JywgJ2FsbFZpZGVvcycpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWxcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LnNlYXJjaF9idG5fbGFiZWx9fTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwiZnMtMC05ODYgbWwtYXV0byBzYi1jb2xvci1ncmV5XCIgPnt7YXNzZXRzQ291bnR9fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhYWxsVmlkZW9zPy5sZW5ndGggJiYgc2VhcmNoQWxsSW5wdXRcIiBjbGFzcz1cImZzLTA3ODVcIj4ge3tlbXB0eVZpZGVvU2VhcmNoTWVzc2FnZX19IDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2ItZ3JpZC1sYXlvdXQgdmlkZW9cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2ItdmlkZW8tY29udGVudFwiICpuZ0Zvcj1cImxldCBkYXRhIG9mIGFsbFZpZGVvc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiLWltYWdlLXNlY3Rpb24gcmVsYXRpdmUgcG9zaXRpb25cIiBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IHNlbGVjdGVkVmlkZW9JZCA9PT0gZGF0YS5pZGVudGlmaWVyfVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RWaWRlbyhkYXRhKTtcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktaW1hZ2VcIj48aSBjbGFzcz1cInBsYXkgY2lyY2xlIGljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9kaXY+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiY2hlY2sgY2lyY2xlIGljb24gc2VsZWN0ZWQtdmlkZW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCJkYXRhLnRodW1ibmFpbFwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9zdWktdGFic2V0PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWFjdGlvbnMgZmxleC1qYy1zcGFjZS1iZXR3ZWVuIHBsLTIwXCI+XG4gICAgPGRpdj5cbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImFkZFZpZGVvSW5FZGl0b3IoKTtcIiBjbGFzcz1cInNiLWJ0biBzYi1idG4tbm9ybWFsXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieydzYi1idG4tcHJpbWFyeSc6IHNob3dBZGRCdXR0b24sICdzYi1idG4tZGlzYWJsZWQnOiAhc2hvd0FkZEJ1dHRvbn1cIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LmFkZF9idG5fbGFiZWx9fTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXY+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJvcGVuVmlkZW9VcGxvYWRNb2RhbCgpO1wiIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1wcmltYXJ5IHNiLWJ0bi1ub3JtYWxcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LnVwbG9hZF91c2VfYnRuX2xhYmVsfX08L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3N1aS1tb2RhbD5cblxuPCEtLSBVcGxvYWQgaW1hZ2UgcG9wIHVwIGNvZGUgaGVyZSAgLS0+XG5cbjxzdWktbW9kYWwgY2xhc3M9XCJzYi1tb2RhbCBvdmVyZmxvdy1tb2RhbFwiIFtpc0Nsb3NhYmxlXT1cInRydWVcIiBbaXNJbnZlcnRlZF09XCJmYWxzZVwiXG4gIChkaXNtaXNzZWQpPVwiZGlzbWlzc0ltYWdlVXBsb2FkTW9kYWwoKVwiICpuZ0lmPVwic2hvd0ltYWdlVXBsb2FkTW9kYWxcIiBbc2l6ZV09XCInbGFyZ2UnXCIgW2lzRnVsbFNjcmVlbl09XCJmYWxzZVwiXG4gIFttdXN0U2Nyb2xsXT1cInRydWVcIiBhcHBCb2R5U2Nyb2xsICNtb2RhbD5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWhlYWRlclwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy51cGxvYWRBbmRVc2V9fTwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicC0xMCBzYi1iZy13aGl0ZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3LTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+XG4gICAgICAgICAgPGg2IGNsYXNzPVwibWItOCBmcy1ub3JtYWxcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uY2hvb3NlT3JEcmFnSW1hZ2V9fTxzcGFuIGNsYXNzPVwicmVkXCI+Kjwvc3Bhbj48L2g2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWQtaW1hZ2UtbW9kYWwtc2VjdGlvbiBkLWZsZXggZmxleC1haS1jZW50ZXIgZmxleC1qYy1jZW50ZXIgZmxleC1kY1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInVwbG9hZC1pbnB1dC1idXR0b24gc2ItYnRuIHNiLWJ0bi1zdWNjZXNzIHNiLWJ0bi1ub3JtYWxcIj5cbiAgICAgICAgICAgICAgICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy51cGxvYWRfZnJvbV9jb21wdXRlcl9idG5fbGFiZWx9fVxuICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cInVwbG9hZEltYWdlKCRldmVudClcIiB0eXBlPVwiZmlsZVwiIFthY2NlcHRdPVwiYWNjZXB0SW1hZ2VUeXBlXCIgbmFtZT1cImFzc2V0ZmlsZVwiPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB5LTEwIGZzLTAtNzg1IHNiLWNvbG9yLXByaW1hcnlcIiAqbmdJZj1cImltYWdlVXBsb2FkTG9hZGVyXCI+IHt7YXNzZXROYW1lfX0gPC9kaXY+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnNtYWxsIG10LThcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8udXBsb2FkfX0ge3thc3NldENvbmZpZy5pbWFnZS5hY2NlcHRlZH19ICh7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8ubWF4RmlsZVNpemV9fVxuICAgICAgICAgICAgICAgIHt7YXNzZXRDb25maWcuaW1hZ2Uuc2l6ZX19e3thc3NldENvbmZpZy5pbWFnZS5zaXplVHlwZX19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dFcnJvck1zZ1wiIGNsYXNzPVwic2ItY29sb3ItZXJyb3IgZnNtYWxsIG10LThcIj5cbiAgICAgICAgICAgICAgICA8cD57e2Vycm9yTXNnfX08L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInVpIGluZm8gbWVzc2FnZSBzYi1pbmZvLWJ4XCI+XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0XCI+XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cImZzLTA3ODVcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uYWxsb3dlZEZpbGVUeXBlc319IHt7YXNzZXRDb25maWcuaW1hZ2UuYWNjZXB0ZWR9fTwvbGk+XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cImZzLTA3ODVcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8ubWF4aW11bUFsbG93ZWRGaWxlU2l6ZX19IHt7YXNzZXRDb25maWcuaW1hZ2Uuc2l6ZX19e3thc3NldENvbmZpZy5pbWFnZS5zaXplVHlwZX19PC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGg2IGNsYXNzPVwiZnMtMDc4NVwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5jb3B5UmlnaHRzQW5kTGljZW5zZX19PHNwYW4gY2xhc3M9XCJyZWRcIj4qPC9zcGFuPjwvaDY+XG4gICAgICAgICAgPHAgY2xhc3M9XCJmc21hbGwgbXQtOCB0ZXJtcy1hbmQtY29uZGl0aW9uXCI+e3t0ZXJtc0FuZENvbmRpdGlvbn19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInctNTAgcGwtMTAgbWwtMTAgYi1ibFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidWkgaW5mbyBtZXNzYWdlIHNiLWluZm8tYnggbWItMFwiPlxuICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3RcIj5cbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImZzLTA3ODUgZm9udC13ZWlnaHQtYm9sZFwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb24gaW5mbyBjaXJjbGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5kcm9wQ2hvb3NlRmlsZX19PC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiLWZvcm0tZmllbGRzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY29udGFpbmVyIHVwbG9hZC1mb3JtXCI+XG4gICAgICAgICAgICA8c2ItZHluYW1pYy1mb3JtIFtjb25maWddPVwiZm9ybUNvbmZpZ1wiIChzdGF0dXNDaGFuZ2VzKT1cIm9uU3RhdHVzQ2hhbmdlcygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlcyk9XCJ2YWx1ZUNoYW5nZXMoJGV2ZW50KVwiPjwvc2ItZHluYW1pYy1mb3JtPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1hY3Rpb25zIGZsZXgtamMtc3BhY2UtYmV0d2VlbiBwLTBcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImRpc21pc3NQb3BzKG1vZGFsKTtcIiBjbGFzcz1cIm1yLTEwIHNiLWJ0biBzYi1idG4tcHJpbWFyeSBzYi1idG4tbm9ybWFsXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy5jYW5jZWxfYnRuX2xhYmVsfX08L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ1cGxvYWRBbmRVc2VJbWFnZShtb2RhbCk7XCIgW2Rpc2FibGVkXT1cIiFpbWFnZUZvcm1WYWxpZFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieydzYi1idG4tcHJpbWFyeSc6IGltYWdlRm9ybVZhbGlkLCAnc2ItYnRuLWRpc2FibGVkJzogIWltYWdlRm9ybVZhbGlkfVwiXG4gICAgICAgICAgY2xhc3M9XCJzYi1idG4gIHNiLWJ0bi1ub3JtYWwgdGV4dC1sZWZ0XCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy51cGxvYWRfdXNlX2J0bl9sYWJlbH19IFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJkaXNtaXNzSW1hZ2VVcGxvYWRNb2RhbCgpO1wiIGNsYXNzPVwiIHNiLWJ0biBzYi1idG4tcHJpbWFyeSBzYi1idG4tbm9ybWFsXCI+IHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uYnV0dG9uX2xhYmVscz8uYmFja19idG5fbGFiZWx9fTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9zdWktbW9kYWw+XG5cbjwhLS0gVXBsb2FkIHZpZGVvIHBvcCB1cCBjb2RlIGhlcmUgIC0tPlxuPHN1aS1tb2RhbCBjbGFzcz1cInNiLW1vZGFsIG92ZXJmbG93LW1vZGFsXCIgW2lzQ2xvc2FibGVdPVwiaXNDbG9zYWJsZVwiIFtpc0ludmVydGVkXT1cImZhbHNlXCJcbiAgKGRpc21pc3NlZCk9XCJkaXNtaXNzVmlkZW9VcGxvYWRNb2RhbCgpXCIgKm5nSWY9XCJzaG93VmlkZW9VcGxvYWRNb2RhbFwiIFtzaXplXT1cIidsYXJnZSdcIiBbaXNGdWxsU2NyZWVuXT1cImZhbHNlXCJcbiAgW211c3RTY3JvbGxdPVwidHJ1ZVwiIGFwcEJvZHlTY3JvbGwgI21vZGFsPlxuICA8ZGl2IGNsYXNzPVwic2ItbW9kYWwtaGVhZGVyXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LnVwbG9hZEFuZFVzZX19PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJwLTEwIHNiLWJnLXdoaXRlXCI+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInctNTBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgICA8aDYgY2xhc3M9XCJtYi04IGZzLW5vcm1hbFwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5jaG9vc2VPckRyYWdWaWRlb319PHNwYW4gY2xhc3M9XCJyZWRcIj4qPC9zcGFuPjwvaDY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInVwbG9hZC1pbWFnZS1tb2RhbC1zZWN0aW9uIGQtZmxleCBmbGV4LWFpLWNlbnRlciBmbGV4LWpjLWNlbnRlciBmbGV4LWRjXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidXBsb2FkLWlucHV0LWJ1dHRvbiBzYi1idG4gc2ItYnRuLXN1Y2Nlc3Mgc2ItYnRuLW5vcm1hbFwiPlxuICAgICAgICAgICAgICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LnVwbG9hZF9mcm9tX2NvbXB1dGVyX2J0bl9sYWJlbH19XG4gICAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwidXBsb2FkVmlkZW9Gcm9tTG9jYWwoJGV2ZW50KVwiIHR5cGU9XCJmaWxlXCIgW2FjY2VwdF09XCJhY2NlcHRWaWRlb1R5cGVcIiBuYW1lPVwiYXNzZXRmaWxlXCI+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHktMTAgZnMtMC03ODUgc2ItY29sb3ItcHJpbWFyeVwiICpuZ0lmPVwiaW1hZ2VVcGxvYWRMb2FkZXJcIj4ge3t2aWRlb0ZpbGU/Lm5hbWV9fSA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmc21hbGwgbXQtOFwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy51cGxvYWR9fSB7e2Fzc2V0Q29uZmlnLnZpZGVvLmFjY2VwdGVkfX0gKHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5tYXhGaWxlU2l6ZX19XG4gICAgICAgICAgICAgICAge3thc3NldENvbmZpZy52aWRlby5zaXplfX17e2Fzc2V0Q29uZmlnLnZpZGVvLnNpemVUeXBlfX0pPC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0Vycm9yTXNnXCIgY2xhc3M9XCJzYi1jb2xvci1lcnJvciBmc21hbGwgbXQtOFwiPlxuICAgICAgICAgICAgICAgIDxwPnt7ZXJyb3JNc2d9fTwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidWkgaW5mbyBtZXNzYWdlIHNiLWluZm8tYnhcIj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3RcIj5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZnMtMDc4NVwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5hbGxvd2VkRmlsZVR5cGVzfX0ge3thc3NldENvbmZpZy52aWRlby5hY2NlcHRlZH19PC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZnMtMDc4NVwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5tYXhpbXVtQWxsb3dlZEZpbGVTaXplfX0ge3thc3NldENvbmZpZy52aWRlby5zaXplfX17e2Fzc2V0Q29uZmlnLnZpZGVvLnNpemVUeXBlfX08L2xpPlxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8aDYgY2xhc3M9XCJmcy0wNzg1XCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmNvcHlSaWdodHNBbmRMaWNlbnNlfX08c3BhbiBjbGFzcz1cInJlZFwiPio8L3NwYW4+PC9oNj5cbiAgICAgICAgICA8cCBjbGFzcz1cImZzbWFsbCBtdC04IHRlcm1zLWFuZC1jb25kaXRpb25cIj57e3Rlcm1zQW5kQ29uZGl0aW9ufX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidy01MCBwbC0xMCBtbC0xMCBiLWJsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1aSBpbmZvIG1lc3NhZ2Ugc2ItaW5mby1ieCBtYi0wXCI+XG4gICAgICAgICAgPHVsIGNsYXNzPVwibGlzdFwiPlxuICAgICAgICAgICAgPGxpIGNsYXNzPVwiZnMtMDc4NSBmb250LXdlaWdodC1ib2xkXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbiBpbmZvIGNpcmNsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmRyb3BDaG9vc2VGaWxlfX08L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2ItZm9ybS1maWVsZHNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250YWluZXIgdXBsb2FkLWZvcm1cIj5cbiAgICAgICAgICAgIDxzYi1keW5hbWljLWZvcm0gW2NvbmZpZ109XCJmb3JtQ29uZmlnXCIgKHN0YXR1c0NoYW5nZXMpPVwib25TdGF0dXNDaGFuZ2VzKCRldmVudClcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2VzKT1cInZhbHVlQ2hhbmdlcygkZXZlbnQpXCI+PC9zYi1keW5hbWljLWZvcm0+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWFjdGlvbnMgZmxleC1qYy1zcGFjZS1iZXR3ZWVuIHAtMFwiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZGlzbWlzc1ZpZGVvUG9wcyhtb2RhbCk7XCIgY2xhc3M9XCJtci0xMCBzYi1idG4gc2ItYnRuLXByaW1hcnkgc2ItYnRuLW5vcm1hbFwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uYnV0dG9uX2xhYmVscz8uY2FuY2VsX2J0bl9sYWJlbH19PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzYi1idG4gc2ItYnRuLW5vcm1hbCB0ZXh0LWxlZnQgc2ItYnRuLWxvYWRpbmctc3Bpbm5lciBzYi1idG4tcHJpbWFyeVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpbWFnZUZvcm1WYWxpZFwiICAoY2xpY2spPVwidXBsb2FkVmlkZW8obW9kYWwpO1wiIFxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc2ItYnRuLXByaW1hcnknOiBpbWFnZUZvcm1WYWxpZCwgJ3NiLWJ0bi1kaXNhYmxlZCc6ICFpbWFnZUZvcm1WYWxpZH1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1sb2FkaW5nLXNwaW5uZXJcIiAgKm5nSWY9XCJsb2FkaW5nXCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxuICAgICAgICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8udXBsb2FkQW5kVXNlfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZGlzbWlzc1ZpZGVvVXBsb2FkTW9kYWwoKTtcIiBjbGFzcz1cIiBzYi1idG4gc2ItYnRuLXByaW1hcnkgc2ItYnRuLW5vcm1hbFwiPiB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LmJhY2tfYnRuX2xhYmVsfX08L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvc3VpLW1vZGFsPiJdfQ==
913
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2tlZGl0b3ItdG9vbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2xsZWN0aW9uLWVkaXRvci1saWJyYXJ5L3NyYy9saWIvY29tcG9uZW50cy9ja2VkaXRvci10b29sL2NrZWRpdG9yLXRvb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sbGVjdGlvbi1lZGl0b3ItbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvY2tlZGl0b3ItdG9vbC9ja2VkaXRvci10b29sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXlCLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFhLFNBQVMsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUNoSSxPQUFPLGFBQWEsTUFBTSx5Q0FBeUMsQ0FBQztBQUNwRSxPQUFPLEtBQUssQ0FBQyxNQUFNLFdBQVcsQ0FBQztBQUMvQixPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSzlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7Ozs7Ozs7QUFPN0QsTUFBTSxPQUFPLHFCQUFxQjtJQXFCaEMsWUFBb0IsZUFBZ0MsRUFBVSxhQUE0QixFQUN0RSxjQUE4QixFQUFTLGFBQTRCO1FBRG5FLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUFVLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ3RFLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUFTLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBbkI3RSxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzNDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FB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RSxPQUFPLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOytHQTc1QlUscUJBQXFCO21HQUFyQixxQkFBcUIsZ2JDaEJsQyw4cWlCQWtTWTs7NEZEbFJDLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxtQkFBbUI7MkxBS0QsU0FBUztzQkFBcEMsU0FBUzt1QkFBQyxRQUFRO2dCQUNWLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0ksZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRSxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEFmdGVyVmlld0luaXQsIE91dHB1dCwgSW5wdXQsIEV2ZW50RW1pdHRlciwgT25DaGFuZ2VzLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBDbGFzc2ljRWRpdG9yIGZyb20gJ0Bwcm9qZWN0LXN1bmJpcmQvY2tlZGl0b3ItYnVpbGQtY2xhc3NpYyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyB0aHJvd0Vycm9yLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBRdWVzdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9xdWVzdGlvbi9xdWVzdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEVkaXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lZGl0b3IvZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90b2FzdGVyL3RvYXN0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlnL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4uL2Fzc2V0LWJyb3dzZXIvYXNzZXQtYnJvd3Nlci5kYXRhJztcbmRlY2xhcmUgY29uc3QgU3VuYmlyZEZpbGVVcGxvYWRMaWI6IGFueTtcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1ja2VkaXRvci10b29sJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NrZWRpdG9yLXRvb2wuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ja2VkaXRvci10b29sLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ2tlZGl0b3JUb29sQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xuICBAVmlld0NoaWxkKCdlZGl0b3InKSBwdWJsaWMgZWRpdG9yUmVmOiBFbGVtZW50UmVmO1xuICBASW5wdXQoKSBlZGl0b3JEYXRhSW5wdXQ6IGFueTtcbiAgQE91dHB1dCgpIGVkaXRvckRhdGFPdXRwdXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGhhc0Vycm9yID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSB2aWRlb0RhdGFPdXRwdXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQElucHV0KCkgdmlkZW9TaG93O1xuICBASW5wdXQoKSBzZXRDaGFyYWN0ZXJMaW1pdDogbnVtYmVyO1xuICBASW5wdXQoKSBzZXRJbWFnZUxpbWl0OiBhbnk7XG4gIHB1YmxpYyBlZGl0b3JDb25maWc6IGFueTtcbiAgcHVibGljIGltYWdlVXBsb2FkTG9hZGVyID0gZmFsc2U7XG4gIHB1YmxpYyBlZGl0b3JJbnN0YW5jZTogYW55O1xuICBwdWJsaWMgaXNFZGl0b3JGb2N1c2VkOiBib29sZWFuO1xuICBwdWJsaWMgbGltaXRFeGNlZWRlZDogYm9vbGVhbjtcbiAgcHVibGljIGNoYXJhY3RlcnNMZWZ0OiBudW1iZXI7XG4gIHB1YmxpYyBpc0Fzc2V0QnJvd3NlclJlYWRPbmx5ID0gZmFsc2U7XG4gIHB1YmxpYyBjaGFyYWN0ZXJDb3VudDtcbiAgcHVibGljIG1lZGlhb2JqO1xuICBpbml0aWFsaXplZCA9IGZhbHNlO1xuICBwdWJsaWMgYXNzZXRQcm94eVVybDogYW55O1xuICBwdWJsaWMgbGFzdEltZ1Jlc2l6ZVdpZHRoO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHF1ZXN0aW9uU2VydmljZTogUXVlc3Rpb25TZXJ2aWNlLCBwcml2YXRlIGVkaXRvclNlcnZpY2U6IEVkaXRvclNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgdG9hc3RlclNlcnZpY2U6IFRvYXN0ZXJTZXJ2aWNlLCBwdWJsaWMgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSkgeyB9XG4gIGFzc2V0Q29uZmlnOiBhbnkgPSB7fTtcbiAgbXlBc3NldHMgPSBbXTtcbiAgYWxsSW1hZ2VzID0gW107XG4gIGFsbFZpZGVvcyA9IFtdO1xuICBzZWxlY3RlZFZpZGVvID0ge307XG4gIGxvYWRpbmcgPSBmYWxzZTtcbiAgaXNDbG9zYWJsZSA9IHRydWU7XG4gIHNlbGVjdGVkVmlkZW9JZDogc3RyaW5nO1xuICBzaG93QWRkQnV0dG9uOiBib29sZWFuO1xuICBzaG93SW1hZ2VQaWNrZXI6IGJvb2xlYW47XG4gIHNob3dWaWRlb1BpY2tlciA9IGZhbHNlO1xuICBzaG93SW1hZ2VVcGxvYWRNb2RhbDogYm9vbGVhbjtcbiAgc2hvd1ZpZGVvVXBsb2FkTW9kYWw6IGJvb2xlYW47XG4gIGFjY2VwdFZpZGVvVHlwZTogYW55O1xuICBhY2NlcHRJbWFnZVR5cGU6IGFueTtcbiAgc2hvd0Vycm9yTXNnOiBib29sZWFuO1xuICBlcnJvck1zZzogc3RyaW5nO1xuICBxdWVyeTogc3RyaW5nO1xuICBwdWJsaWMgYXNzZXRzQ291bnQ6IGFueTtcbiAgcHVibGljIHNlYXJjaE15SW5wdXQgPSAnJztcbiAgcHVibGljIHNlYXJjaEFsbElucHV0OiBhbnk7XG4gIHB1YmxpYyBmb3JtRGF0YTogYW55O1xuICBwdWJsaWMgYXNzZXN0RGF0YSA9IHt9O1xuICBwdWJsaWMgZm9ybUNvbmZpZzogYW55O1xuICBwdWJsaWMgaW5pdGlhbEZvcm1Db25maWc6IGFueTtcbiAgcHVibGljIGltYWdlRm9ybVZhbGlkID0gZmFsc2U7XG4gIHB1YmxpYyB2aWRlb0ZpbGU6IGFueTtcbiAgcHVibGljIGltYWdlRmlsZTogYW55O1xuICBwdWJsaWMgdGVybXNBbmRDb25kaXRpb246IGFueTtcbiAgcHVibGljIGFzc2V0TmFtZTogYW55O1xuICBwdWJsaWMgZW1wdHlJbWFnZVNlYXJjaE1lc3NhZ2U6IGFueTtcbiAgcHVibGljIGVtcHR5VmlkZW9TZWFyY2hNZXNzYWdlOiBhbnk7XG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuYXNzZXRQcm94eVVybCA9ICBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UudXJsQ29uRmlnLCAnVVJMUy5hc3NldFByb3h5VXJsJyk7XG4gICAgdGhpcy5pbml0aWFsRm9ybUNvbmZpZyA9IF8uZ2V0KGNvbmZpZywgJ3VwbG9hZEljb25Gb3JtQ29uZmlnJyk7XG4gICAgdGhpcy5mb3JtQ29uZmlnID0gXy5nZXQoY29uZmlnLCAndXBsb2FkSWNvbkZvcm1Db25maWcnKTtcbiAgICB0aGlzLmVtcHR5SW1hZ2VTZWFyY2hNZXNzYWdlID0gIF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAxNicpO1xuICAgIHRoaXMuZW1wdHlWaWRlb1NlYXJjaE1lc3NhZ2UgPSAgXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDE3Jyk7XG4gICAgdGhpcy50ZXJtc0FuZENvbmRpdGlvbiA9ICBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UubGFiZWxDb25maWcsICd0ZXJtc0FuZENvbmRpdGlvbnMuMDAxJyk7XG4gICAgdGhpcy5hc3NldENvbmZpZyA9IHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcuY29uZmlnLmFzc2V0Q29uZmlnO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuZWRpdG9yQ29uZmlnID0ge1xuICAgICAgdG9vbGJhcjogWydoZWFkaW5nJywgJ3wnLCAnYm9sZCcsICd8JywgJ2l0YWxpYycsICd8JywgJ3VuZGVybGluZScsICd8JywgJ0J1bGxldGVkTGlzdCcsICd8JywgJ2FsaWdubWVudCcsXG4gICAgICAgICd8JywgJ2luc2VydFRhYmxlJywgJ3wnLCAnbnVtYmVyZWRMaXN0JywgJ3wnLCAnZm9udFNpemUnLCAnfCcsICdzdWJzY3JpcHQnLCAnfCcsICdzdXBlcnNjcmlwdCcsICd8JyxcbiAgICAgICAgJ01hdGhUZXh0JywgJ3wnLCAnc3BlY2lhbENoYXJhY3RlcnMnLCAnfCdcbiAgICAgIF0sXG4gICAgICBmb250U2l6ZToge1xuICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgJ2VpZ2h0JyxcbiAgICAgICAgICAndGVuJyxcbiAgICAgICAgICAndHdlbHZlJyxcbiAgICAgICAgICAnZm91cnRlZW4nLFxuICAgICAgICAgICdzaXh0ZWVuJyxcbiAgICAgICAgICAnZWlnaHRlZW4nLFxuICAgICAgICAgICd0d2VudHknLFxuICAgICAgICAgICd0d2VudHl0d28nLFxuICAgICAgICAgICd0d2VudHlmb3VyJyxcbiAgICAgICAgICAndHdlbnR5c2l4JyxcbiAgICAgICAgICAndHdlbnR5ZWlnaHQnLFxuICAgICAgICAgICd0aGlydHknLFxuICAgICAgICAgICd0aGlydHlzaXgnXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBpbWFnZToge1xuICAgICAgICByZXNpemVVbml0OiAnJScsXG4gICAgICAgIHJlc2l6ZU9wdGlvbnM6IFt7XG4gICAgICAgICAgbmFtZTogJ3Jlc2l6ZUltYWdlOjI1JyxcbiAgICAgICAgICB2YWx1ZTogJzI1JyxcbiAgICAgICAgICBpY29uOiAnc21hbGwnLFxuICAgICAgICAgIGNsYXNzTmFtZTogJ3Jlc2l6ZS0yNSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdyZXNpemVJbWFnZTo1MCcsXG4gICAgICAgICAgdmFsdWU6ICc1MCcsXG4gICAgICAgICAgaWNvbjogJ21lZGl1bScsXG4gICAgICAgICAgY2xhc3NOYW1lOiAncmVzaXplLTUwJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3Jlc2l6ZUltYWdlOjc1JyxcbiAgICAgICAgICB2YWx1ZTogJzc1JyxcbiAgICAgICAgICBpY29uOiAnbGFyZ2UnLFxuICAgICAgICAgIGNsYXNzTmFtZTogJ3Jlc2l6ZS03NSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdyZXNpemVJbWFnZToxMDAnLFxuICAgICAgICAgIHZhbHVlOiAnMTAwJyxcbiAgICAgICAgICBpY29uOiAnZnVsbCcsXG4gICAgICAgICAgY2xhc3NOYW1lOiAncmVzaXplLTEwMCdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdyZXNpemVJbWFnZTpvcmlnaW5hbCcsXG4gICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgaWNvbjogJ29yaWdpbmFsJyxcbiAgICAgICAgICBjbGFzc05hbWU6ICdyZXNpemUtb3JpZ2luYWwnXG4gICAgICAgIH1dLFxuICAgICAgICB0b29sYmFyOiBbJ2ltYWdlU3R5bGU6YWxpZ25MZWZ0JywgJ2ltYWdlU3R5bGU6YWxpZ25DZW50ZXInLCAnaW1hZ2VTdHlsZTphbGlnblJpZ2h0JywgJ3wnLFxuICAgICAgICAncmVzaXplSW1hZ2U6MjUnLCAncmVzaXplSW1hZ2U6NTAnLCAncmVzaXplSW1hZ2U6NzUnLCAgJ3Jlc2l6ZUltYWdlOjEwMCcsICdyZXNpemVJbWFnZTpvcmlnaW5hbCddLFxuICAgICAgICBzdHlsZXM6IFsnZnVsbCcsICdhbGlnbkxlZnQnLCAnYWxpZ25SaWdodCcsICdhbGlnbkNlbnRlciddXG4gICAgICB9LFxuICAgICAgaXNSZWFkT25seTogZmFsc2UsXG4gICAgICByZW1vdmVQbHVnaW5zOiBbJ0ltYWdlQ2FwdGlvbicsICdtYXRodHlwZScsICdDaGVtVHlwZScsICdJbWFnZVJlc2l6ZUhhbmRsZXMnXVxuICAgIH07XG5cbiAgICB0aGlzLmFjY2VwdFZpZGVvVHlwZSA9IHRoaXMuZ2V0QWNjZXB0VHlwZSh0aGlzLmFzc2V0Q29uZmlnLnZpZGVvLmFjY2VwdGVkLCAndmlkZW8nKTtcbiAgICB0aGlzLmFjY2VwdEltYWdlVHlwZSA9IHRoaXMuZ2V0QWNjZXB0VHlwZSh0aGlzLmFzc2V0Q29uZmlnLmltYWdlLmFjY2VwdGVkLCAnaW1hZ2UnKTtcbiAgfVxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAodGhpcy52aWRlb1Nob3cpIHtcbiAgICAgIHRoaXMuc2hvd1ZpZGVvUGlja2VyID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2VsZWN0VmlkZW8odW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplRWRpdG9ycygpO1xuICB9XG5cblxuICBpbml0aWFsaXplSW1hZ2VQaWNrZXIoZWRpdG9yVHlwZSkge1xuICAgIHRoaXMuc2hvd0ltYWdlUGlja2VyID0gdHJ1ZTtcbiAgfVxuXG4gIGluaXRpYWxpemVWaWRlb1BpY2tlcihlZGl0b3JUeXBlKSB7XG4gICAgdGhpcy5zaG93VmlkZW9QaWNrZXIgPSB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBmdW5jdGlvbiB0byBoaWRlIGltYWdlIHBpY2tlclxuICAgKi9cbiAgZGlzbWlzc0ltYWdlUGlja2VyKCkge1xuICAgIHRoaXMuc2hvd0ltYWdlUGlja2VyID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogZnVuY3Rpb24gdG8gaGlkZSB2aWRlbyBwaWNrZXJcbiAgICovXG4gIGRpc21pc3NWaWRlb1BpY2tlcigpIHtcbiAgICB0aGlzLnNob3dWaWRlb1BpY2tlciA9IGZhbHNlO1xuICAgIHRoaXMudmlkZW9TaG93ID0gZmFsc2U7XG4gICAgdGhpcy52aWRlb0RhdGFPdXRwdXQuZW1pdChmYWxzZSk7XG4gIH1cbiAgZGlzbWlzc0ltYWdlVXBsb2FkTW9kYWwoKSB7XG4gICAgaWYgKHRoaXMuaXNDbG9zYWJsZSkge1xuICAgIHRoaXMuc2hvd0ltYWdlVXBsb2FkTW9kYWwgPSBmYWxzZTtcbiAgfVxuICB9XG4gIGluaXRpYXRlSW1hZ2VVcGxvYWRNb2RhbCgpIHtcbiAgICB0aGlzLnNob3dJbWFnZVBpY2tlciA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd0ltYWdlVXBsb2FkTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNDbG9zYWJsZSA9IHRydWU7XG4gIH1cblxuICBkaXNtaXNzVmlkZW9VcGxvYWRNb2RhbCgpIHtcbiAgICBpZiAodGhpcy5pc0Nsb3NhYmxlKSB7XG4gICAgICB0aGlzLnNob3dWaWRlb1VwbG9hZE1vZGFsID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGluaXRpYXRlVmlkZW9VcGxvYWRNb2RhbCgpIHtcbiAgICB0aGlzLnNob3dWaWRlb1BpY2tlciA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd0ltYWdlVXBsb2FkTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNDbG9zYWJsZSA9IHRydWU7XG4gIH1cbiAgcHVibGljIGlzRWRpdG9yUmVhZE9ubHkoc3RhdGUpIHtcbiAgICB0aGlzLmVkaXRvckluc3RhbmNlLmlzUmVhZE9ubHkgPSBzdGF0ZTtcbiAgICB0aGlzLmlzQXNzZXRCcm93c2VyUmVhZE9ubHkgPSBzdGF0ZTtcbiAgfVxuICBnZXRBY2NlcHRUeXBlKHR5cGVMaXN0LCB0eXBlKSB7XG4gICAgY29uc3QgYWNjZXB0VHlwZUxpc3QgPSB0eXBlTGlzdC5zcGxpdCgnLCAnKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBfLmZvckVhY2goYWNjZXB0VHlwZUxpc3QsIChjb250ZW50KSA9PiB7XG4gICAgICByZXN1bHQucHVzaChgJHt0eXBlfS8ke2NvbnRlbnR9YCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpO1xuICB9XG5cbiAgY3VzdG9tSW1hZ2VSZXNpemVyKGVkaXRvcikge1xuICAgIC8vIEJvdGggdGhlIGRhdGEgYW5kIHRoZSBlZGl0aW5nIHBpcGVsaW5lcyBhcmUgYWZmZWN0ZWQgYnkgdGhpcyBjb252ZXJzaW9uLlxuICAgIGVkaXRvci5jb252ZXJzaW9uLmZvcignZG93bmNhc3QnKS5hZGQoZGlzcGF0Y2hlciA9PiB7XG4gICAgICAvLyBMaW5rcyBhcmUgcmVwcmVzZW50ZWQgaW4gdGhlIG1vZGVsIGFzIGEgXCJsaW5rSHJlZlwiIGF0dHJpYnV0ZS5cbiAgICAgIC8vIFVzZSB0aGUgXCJsb3dcIiBsaXN0ZW5lciBwcmlvcml0eSB0byBhcHBseSB0aGUgY2hhbmdlcyBhZnRlciB0aGUgbGluayBmZWF0dXJlLlxuICAgICAgZGlzcGF0Y2hlci5vbignYXR0cmlidXRlOndpZHRoOmltYWdlJywgKGV2dCwgZGF0YSwgY29udmVyc2lvbkFwaSkgPT4ge1xuICAgICAgICBpZiAoIWNvbnZlcnNpb25BcGkuY29uc3VtYWJsZS5jb25zdW1lKGRhdGEuaXRlbSwgZXZ0Lm5hbWUpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBlZGl0b3IuY29uZmlnLmdldCgnaW1hZ2UucmVzaXplT3B0aW9ucycpO1xuICAgICAgICBjb25zdCBpc0VuYWJsZWQgPSBlZGl0b3IuY29uZmlnLmdldCgnaW1hZ2UucmVzaXplRW5hYmxlZCcpO1xuICAgICAgICBjb25zdCBzaXplTGFibGVzID0gb3B0aW9ucy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICByZXR1cm4gaXRlbS5sYWJlbDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5ld0ltZ1dpZHRoVmFsdWUgPSBkYXRhLmF0dHJpYnV0ZU5ld1ZhbHVlID09PSBudWxsID8gJ09yaWdpbmFsJyA6IGRhdGEuYXR0cmlidXRlTmV3VmFsdWU7XG4gICAgICAgIGlmIChzaXplTGFibGVzLmluY2x1ZGVzKG5ld0ltZ1dpZHRoVmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5sYXN0SW1nUmVzaXplV2lkdGggPSBuZXdJbWdXaWR0aFZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0VuYWJsZWQgJiYgc2l6ZUxhYmxlcy5sZW5ndGggPiAwICYmICFzaXplTGFibGVzLmluY2x1ZGVzKG5ld0ltZ1dpZHRoVmFsdWUpKSB7XG4gICAgICAgICAgZWRpdG9yLmV4ZWN1dGUoJ2ltYWdlUmVzaXplJywgeyB3aWR0aDogdGhpcy5sYXN0SW1nUmVzaXplV2lkdGggfSk7XG4gICAgICAgICAgcmV0dXJuIGV2dC5zdG9wKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2aWV3V3JpdGVyID0gY29udmVyc2lvbkFwaS53cml0ZXI7XG4gICAgICAgIGNvbnN0IGZpZ3VyZSA9IGNvbnZlcnNpb25BcGkubWFwcGVyLnRvVmlld0VsZW1lbnQoZGF0YS5pdGVtKTtcblxuICAgICAgICBpZiAoZGF0YS5hdHRyaWJ1dGVOZXdWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZpZXdXcml0ZXIuc2V0U3R5bGUoJ3dpZHRoJywgZGF0YS5hdHRyaWJ1dGVOZXdWYWx1ZSwgZmlndXJlKTtcbiAgICAgICAgICB2aWV3V3JpdGVyLmFkZENsYXNzKCdpbWFnZV9yZXNpemVkJywgZmlndXJlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2aWV3V3JpdGVyLnJlbW92ZVN0eWxlKCd3aWR0aCcsIGZpZ3VyZSk7XG4gICAgICAgICAgdmlld1dyaXRlci5yZW1vdmVDbGFzcygnaW1hZ2VfcmVzaXplZCcsIGZpZ3VyZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgaW5pdGlhbGl6ZUVkaXRvcnMoKSB7XG4gICAgQ2xhc3NpY0VkaXRvci5jcmVhdGUodGhpcy5lZGl0b3JSZWYubmF0aXZlRWxlbWVudCwge1xuICAgICAgYWxpZ25tZW50OiB7XG4gICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICB7IG5hbWU6ICdsZWZ0JywgY2xhc3NOYW1lOiAndGV4dC1sZWZ0JyB9LFxuICAgICAgICAgIHsgbmFtZTogJ2NlbnRlcicsIGNsYXNzTmFtZTogJ3RleHQtY2VudGVyJyB9LFxuICAgICAgICAgIHsgbmFtZTogJ3JpZ2h0JywgY2xhc3NOYW1lOiAndGV4dC1yaWdodCcgfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgaGVhZGluZzoge1xuICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgeyBtb2RlbDogJ3BhcmFncmFwaCcsIHRpdGxlOiAnUGFyYWdyYXBoJyB9LFxuICAgICAgICAgIHsgbW9kZWw6ICdoZWFkaW5nMScsIHZpZXc6ICdoMScsIHRpdGxlOiAnSGVhZGluZyAxJyB9LFxuICAgICAgICAgIHsgbW9kZWw6ICdoZWFkaW5nMicsIHZpZXc6ICdoMicsIHRpdGxlOiAnSGVhZGluZyAyJyB9LFxuICAgICAgICAgIHsgbW9kZWw6ICdoZWFkaW5nMycsIHZpZXc6ICdoMycsIHRpdGxlOiAnSGVhZGluZyAzJyB9LFxuICAgICAgICAgIHsgbW9kZWw6ICdoZWFkaW5nNCcsIHZpZXc6ICdoNCcsIHRpdGxlOiAnSGVhZGluZyA0JyB9LFxuICAgICAgICAgIHsgbW9kZWw6ICdoZWFkaW5nNScsIHZpZXc6ICdoNScsIHRpdGxlOiAnSGVhZGluZyA1JyB9LFxuICAgICAgICAgIHsgbW9kZWw6ICdoZWFkaW5nNicsIHZpZXc6ICdoNicsIHRpdGxlOiAnSGVhZGluZyA2JyB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBleHRyYVBsdWdpbnM6IFsnVGFibGUnLCAnSGVhZGluZyddLFxuICAgICAgdG9vbGJhcjogdGhpcy5lZGl0b3JDb25maWcudG9vbGJhcixcbiAgICAgIGZvbnRTaXplOiB0aGlzLmVkaXRvckNvbmZpZy5mb250U2l6ZSxcbiAgICAgIGltYWdlOiB0aGlzLmVkaXRvckNvbmZpZy5pbWFnZSxcbiAgICAgIGlzUmVhZE9ubHk6IHRoaXMuZWRpdG9yQ29uZmlnLmlzUmVhZE9ubHksXG4gICAgICByZW1vdmVQbHVnaW5zOiB0aGlzLmVkaXRvckNvbmZpZy5yZW1vdmVQbHVnaW5zXG4gICAgfSlcbiAgICAgIC50aGVuKGVkaXRvciA9PiB7XG4gICAgICAgIHRoaXMuZWRpdG9ySW5zdGFuY2UgPSBlZGl0b3I7XG4gICAgICAgIHRoaXMuaXNBc3NldEJyb3dzZXJSZWFkT25seSA9IHRoaXMuZWRpdG9yQ29uZmlnLmlzUmVhZE9ubHk7XG4gICAgICAgIGlmICh0aGlzLmVkaXRvckRhdGFJbnB1dCkge1xuICAgICAgICAgIHRoaXMuZWRpdG9yRGF0YUlucHV0ID0gdGhpcy5lZGl0b3JEYXRhSW5wdXRcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oPGltZyhcIlteXCJdKlwifFteXFwvXCI+XSkqKT4vZ2ksICckMS8+JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oPGJyKFwiW15cIl0qXCJ8W15cXC9cIj5dKSopPi9naSwgJyQxLz4nKTtcbiAgICAgICAgICB0aGlzLmVkaXRvckluc3RhbmNlLnNldERhdGEodGhpcy5lZGl0b3JEYXRhSW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZWRpdG9ySW5zdGFuY2Uuc2V0RGF0YSgnJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ0VkaXRvciB3YXMgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VUcmFja2VyKHRoaXMuZWRpdG9ySW5zdGFuY2UpO1xuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50KHRoaXMuZWRpdG9ySW5zdGFuY2UpO1xuICAgICAgICAvLyB0aGlzLnBhc3RlVHJhY2tlcih0aGlzLmVkaXRvckluc3RhbmNlKTtcbiAgICAgICAgdGhpcy5jaGFyYWN0ZXJDb3VudCA9IHRoaXMuY291bnRDaGFyYWN0ZXJzKHRoaXMuZWRpdG9ySW5zdGFuY2UubW9kZWwuZG9jdW1lbnQpO1xuICAgICAgICB0aGlzLmNoYXJhY3RlcnNMZWZ0ID0gdGhpcy5nZXRDaGFyYWN0ZXJzTGVmdCgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3Iuc3RhY2spO1xuICAgICAgfSk7XG4gIH1cbiAgY2hhbmdlVHJhY2tlcihlZGl0b3IpIHtcbiAgICBlZGl0b3IubW9kZWwuZG9jdW1lbnQub24oJ2NoYW5nZScsIChldmVudEluZm8sIGJhdGNoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zZXRDaGFyYWN0ZXJMaW1pdCAmJiB0aGlzLnNldENoYXJhY3RlckxpbWl0ID4gMCkge1xuICAgICAgICB0aGlzLmNoZWNrQ2hhcmFjdGVyTGltaXQoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudCA9IGV2ZW50SW5mby5zb3VyY2Uuc2VsZWN0aW9uLmdldFNlbGVjdGVkRWxlbWVudCgpO1xuICAgICAgdGhpcy5pc0VkaXRvckZvY3VzZWQgPSAoc2VsZWN0ZWRFbGVtZW50ICYmIHNlbGVjdGVkRWxlbWVudC5uYW1lID09PSAnaW1hZ2UnKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgIGlmICh0aGlzLnNldEltYWdlTGltaXQgJiYgdGhpcy5zZXRJbWFnZUxpbWl0ID4gMCkge1xuICAgICAgICB0aGlzLmNoZWNrSW1hZ2VMaW1pdCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5lZGl0b3JEYXRhT3V0cHV0LmVtaXQoe1xuICAgICAgICBib2R5OiBlZGl0b3IuZ2V0RGF0YSgpLFxuICAgICAgICBsZW5ndGg6IHRoaXMuY2hhcmFjdGVyQ291bnQsXG4gICAgICAgIG1lZGlhb2JqOiB0aGlzLm1lZGlhb2JqXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBwYXN0ZVRyYWNrZXIoZWRpdG9yKSB7XG4gICAgZWRpdG9yLmVkaXRpbmcudmlldy5kb2N1bWVudC5vbignY2xpcGJvYXJkSW5wdXQnLCAoZXZ0LCBkYXRhKSA9PiB7XG4gICAgICBjb25zdCBkYXRhVHJhbnNmZXIgPSBkYXRhLmRhdGFUcmFuc2ZlcjtcbiAgICAgIGNvbnN0IHVybE1hdGNoID1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAvKGh0dHBzPzpcXC9cXC8oPzp3d3dcXC58KD8hd3d3KSlbYS16QS1aMC05XVthLXpBLVowLTktXStbYS16QS1aMC05XVxcLlteXFxzXXsyLH18d3d3XFwuW2EtekEtWjAtOV1bYS16QS1aMC05LV0rW2EtekEtWjAtOV1cXC5bXlxcc117Mix9fGh0dHBzPzpcXC9cXC8oPzp3d3dcXC58KD8hd3d3KSlbYS16QS1aMC05XStcXC5bXlxcc117Mix9fHd3d1xcLlthLXpBLVowLTldK1xcLlteXFxzXXsyLH18ZmlsZTpcXC9cXC9cXC8rW15cXHNdezAsfSkvZ2k7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAodXJsTWF0Y2gpO1xuICAgICAgY29uc3QgZ2V0VXJsID0gZGF0YVRyYW5zZmVyLmdldERhdGEoJ3RleHQvaHRtbCcpLm1hdGNoKHJlZ2V4KTtcbiAgICAgIGlmIChnZXRVcmwgJiYgZ2V0VXJsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMTAnKSk7XG4gICAgICAgIGV2dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgY2hlY2tJbWFnZUxpbWl0KCkge1xuICAgIGNvbnN0IGNoaWxkTm9kZXMgPSB0aGlzLmVkaXRvckluc3RhbmNlLm1vZGVsLmRvY3VtZW50LmdldFJvb3QoKS5fY2hpbGRyZW4uX25vZGVzO1xuICAgIHRoaXMuaXNBc3NldEJyb3dzZXJSZWFkT25seSA9IF8ua2V5cyhfLnBpY2tCeShjaGlsZE5vZGVzLCB7IG5hbWU6ICdpbWFnZScgfSkpLmxlbmd0aCA9PT0gdGhpcy5zZXRJbWFnZUxpbWl0ID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG4gIGNoZWNrQ2hhcmFjdGVyTGltaXQoKSB7XG4gICAgdGhpcy5jaGFyYWN0ZXJDb3VudCA9IHRoaXMuY291bnRDaGFyYWN0ZXJzKHRoaXMuZWRpdG9ySW5zdGFuY2UubW9kZWwuZG9jdW1lbnQpO1xuICAgIHRoaXMuY2hhcmFjdGVyc0xlZnQgPSB0aGlzLmdldENoYXJhY3RlcnNMZWZ0KCk7XG4gICAgdGhpcy5saW1pdEV4Y2VlZGVkID0gKHRoaXMuY2hhcmFjdGVyQ291bnQgPD0gdGhpcy5zZXRDaGFyYWN0ZXJMaW1pdCkgPyBmYWxzZSA6IHRydWU7XG4gICAgdGhpcy5oYXNFcnJvci5lbWl0KHRoaXMubGltaXRFeGNlZWRlZCk7XG4gIH1cbiAgLyoqXG4gICAqIGZ1bmN0aW9uIHRvIGdldCBpbWFnZXNcbiAgICogQHBhcmFtIG9mZnNldCBwYWdlIG5vXG4gICAqL1xuICBnZXRNeUltYWdlcyhvZmZzZXQsIHF1ZXJ5Pywgc2VhcmNoPykge1xuICAgIHRoaXMuYXNzZXRzQ291bnQgPSAwO1xuICAgIGlmICghc2VhcmNoKSB7XG4gICAgICB0aGlzLnNlYXJjaE15SW5wdXQgPSAnJztcbiAgICB9XG4gICAgaWYgKG9mZnNldCA9PT0gMCkge1xuICAgICAgdGhpcy5teUFzc2V0cy5sZW5ndGggPSAwO1xuICAgIH1cbiAgICBjb25zdCByZXEgPSB7XG4gICAgICBmaWx0ZXJzOiB7XG4gICAgICAgIG1lZGlhVHlwZTogWydpbWFnZSddLFxuICAgICAgICBjcmVhdGVkQnk6IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LnVzZXIuaWQnKVxuICAgICAgfSxcbiAgICAgIG9mZnNldFxuICAgIH07XG4gICAgaWYgKHF1ZXJ5KSB7XG4gICAgICByZXFbJ3F1ZXJ5J10gPSBxdWVyeTtcbiAgICB9XG4gICAgdGhpcy5xdWVzdGlvblNlcnZpY2UuZ2V0QXNzZXRNZWRpYShyZXEpLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgY29uc3QgZXJySW5mbyA9IHsgZXJyb3JNc2c6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAyMicpIH07XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcih0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pKTtcbiAgICB9KSkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIHRoaXMuYXNzZXRzQ291bnQgPSByZXMucmVzdWx0LmNvdW50O1xuICAgICAgXy5tYXAocmVzLnJlc3VsdC5jb250ZW50LCAoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5kb3dubG9hZFVybCkge1xuICAgICAgICAgIHRoaXMubXlBc3NldHMucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRJbWFnZUluRWRpdG9yKGltYWdlVXJsLCBpbWFnZUlkLCBpbWFnZU5hbWUpIHtcbiAgICBjb25zdCBzcmMgPSB0aGlzLmdldE1lZGlhT3JpZ2luVVJMKGltYWdlVXJsKTtcbiAgICBjb25zdCBiYXNlVXJsID0gXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZywgJ2NvbnRleHQuaG9zdCcpIHx8IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbjtcbiAgICB0aGlzLm1lZGlhb2JqID0ge1xuICAgICAgaWQ6IGltYWdlSWQsXG4gICAgICB0eXBlOiAnaW1hZ2UnLFxuICAgICAgc3JjLFxuICAgICAgYmFzZVVybFxuICAgIH07XG4gICAgdGhpcy5lZGl0b3JJbnN0YW5jZS5tb2RlbC5jaGFuZ2Uod3JpdGVyID0+IHtcbiAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IHdyaXRlci5jcmVhdGVFbGVtZW50KCdpbWFnZScsIHtcbiAgICAgICAgc3JjLFxuICAgICAgICBhbHQ6IGltYWdlTmFtZSxcbiAgICAgICAgJ2RhdGEtYXNzZXQtdmFyaWFibGUnOiBpbWFnZUlkXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZWRpdG9ySW5zdGFuY2UubW9kZWwuaW5zZXJ0Q29udGVudChpbWFnZUVsZW1lbnQsIHRoaXMuZWRpdG9ySW5zdGFuY2UubW9kZWwuZG9jdW1lbnQuc2VsZWN0aW9uKTtcbiAgICB9KTtcbiAgICB0aGlzLnNob3dJbWFnZVBpY2tlciA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd0ltYWdlVXBsb2FkTW9kYWwgPSBmYWxzZTtcbiAgfVxuXG4gIGFkZFZpZGVvSW5FZGl0b3IodmlkZW9Nb2RhbD8pIHtcbiAgICBjb25zdCB2aWRlb0RhdGE6IGFueSA9IF8uY2xvbmVEZWVwKHRoaXMuc2VsZWN0ZWRWaWRlbyk7XG4gICAgdmlkZW9EYXRhLnNyYyA9IHRoaXMuZ2V0TWVkaWFPcmlnaW5VUkwodmlkZW9EYXRhLmRvd25sb2FkVXJsKTtcbiAgICB2aWRlb0RhdGEudGh1bWJuYWlsID0gKHZpZGVvRGF0YS50aHVtYm5haWwpICYmIHRoaXMuZ2V0TWVkaWFPcmlnaW5VUkwodmlkZW9EYXRhLnRodW1ibmFpbCk7XG4gICAgdGhpcy5zaG93VmlkZW9QaWNrZXIgPSBmYWxzZTtcbiAgICB0aGlzLnZpZGVvRGF0YU91dHB1dC5lbWl0KHZpZGVvRGF0YSk7XG4gICAgaWYgKHZpZGVvTW9kYWwpIHtcbiAgICAgIHZpZGVvTW9kYWwuZGVueSgpO1xuICAgIH1cbiAgfVxuXG5cbiAgZ2V0QWxsSW1hZ2VzKG9mZnNldCwgcXVlcnk/LCBzZWFyY2g/KSB7XG4gICAgdGhpcy5hc3NldHNDb3VudCA9IDA7XG4gICAgaWYgKCFzZWFyY2gpIHtcbiAgICAgIHRoaXMuc2VhcmNoQWxsSW5wdXQgPSAnJztcbiAgICB9XG4gICAgaWYgKG9mZnNldCA9PT0gMCkge1xuICAgICAgdGhpcy5hbGxJbWFnZXMubGVuZ3RoID0gMDtcbiAgICB9XG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgZmlsdGVyczoge1xuICAgICAgICBtZWRpYVR5cGU6IFsnaW1hZ2UnXVxuICAgICAgfSxcbiAgICAgIG9mZnNldFxuICAgIH07XG4gICAgaWYgKHF1ZXJ5KSB7XG4gICAgICByZXFbJ3F1ZXJ5J10gPSBxdWVyeTtcbiAgICB9XG4gICAgdGhpcy5xdWVzdGlvblNlcnZpY2UuZ2V0QXNzZXRNZWRpYShyZXEpLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgY29uc3QgZXJySW5mbyA9IHsgZXJyb3JNc2c6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAyMicpIH07XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcih0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pKTtcbiAgICB9KSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmFzc2V0c0NvdW50ID0gcmVzLnJlc3VsdC5jb3VudDtcbiAgICAgICAgXy5tYXAocmVzLnJlc3VsdC5jb250ZW50LCAoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmRvd25sb2FkVXJsKSB7XG4gICAgICAgICAgICB0aGlzLmFsbEltYWdlcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmdW5jdGlvbiB0byBnZXQgdmlkZW9zXG4gICAqIEBwYXJhbSBvZmZzZXQgcGFnZSBub1xuICAgKi9cbiAgZ2V0TXlWaWRlb3Mob2Zmc2V0LCBxdWVyeT8sIHNlYXJjaD8pIHtcbiAgICB0aGlzLmFzc2V0c0NvdW50ID0gMDtcbiAgICBpZiAoIXNlYXJjaCkge1xuICAgICAgdGhpcy5zZWFyY2hNeUlucHV0ID0gJyc7XG4gICAgICB0aGlzLnNlbGVjdFZpZGVvKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPT09IDApIHtcbiAgICAgIHRoaXMubXlBc3NldHMubGVuZ3RoID0gMDtcbiAgICB9XG4gICAgY29uc3QgcmVxOiBhbnkgPSB7XG4gICAgICBmaWx0ZXJzOiB7XG4gICAgICAgIG1lZGlhVHlwZTogWyd2aWRlbyddLFxuICAgICAgICBjcmVhdGVkQnk6IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LnVzZXIuaWQnKVxuICAgICAgfSxcbiAgICAgIG9mZnNldFxuICAgIH07XG5cbiAgICBpZiAocXVlcnkpIHtcbiAgICAgIHJlcS5xdWVyeSA9IHF1ZXJ5O1xuICAgIH1cblxuICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLmdldEFzc2V0TWVkaWEocmVxKS5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgIGNvbnN0IGVyckluZm8gPSB7IGVycm9yTXNnOiBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UubGFiZWxDb25maWcsICdtZXNzYWdlcy5lcnJvci4wMjMnKX07XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcih0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pKTtcbiAgICB9KSkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIHRoaXMuYXNzZXRzQ291bnQgPSByZXMucmVzdWx0LmNvdW50O1xuICAgICAgXy5tYXAocmVzLnJlc3VsdC5jb250ZW50LCAoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5kb3dubG9hZFVybCkge1xuICAgICAgICAgIHRoaXMubXlBc3NldHMucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRBbGxWaWRlb3Mob2Zmc2V0LCBxdWVyeT8sIHNlYXJjaD8pIHtcbiAgICB0aGlzLmFzc2V0c0NvdW50ID0gMDtcbiAgICBpZiAoIXNlYXJjaCkge1xuICAgICAgdGhpcy5zZWFyY2hBbGxJbnB1dCA9ICcnO1xuICAgICAgdGhpcy5zZWxlY3RWaWRlbyh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAob2Zmc2V0ID09PSAwKSB7XG4gICAgICB0aGlzLmFsbFZpZGVvcy5sZW5ndGggPSAwO1xuICAgIH1cbiAgICBjb25zdCByZXE6IGFueSA9IHtcbiAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgbWVkaWFUeXBlOiBbJ3ZpZGVvJ10sXG4gICAgICB9LFxuICAgICAgb2Zmc2V0XG4gICAgfTtcbiAgICBpZiAocXVlcnkpIHtcbiAgICAgIHJlcS5xdWVyeSA9IHF1ZXJ5O1xuICAgIH1cblxuICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLmdldEFzc2V0TWVkaWEocmVxKS5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgIGNvbnN0IGVyckluZm8gPSB7IGVycm9yTXNnOiBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UubGFiZWxDb25maWcsICdtZXNzYWdlcy5lcnJvci4wMjMnKSB9O1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IodGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKSk7XG4gICAgfSkpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICB0aGlzLmFzc2V0c0NvdW50ID0gcmVzLnJlc3VsdC5jb3VudDtcbiAgICAgIF8ubWFwKHJlcy5yZXN1bHQuY29udGVudCwgKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uZG93bmxvYWRVcmwpIHtcbiAgICAgICAgICB0aGlzLmFsbFZpZGVvcy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmdW5jdGlvbiB0byBsYXp5IGxvYWQgbXkgaW1hZ2VzXG4gICAqL1xuICBsYXp5bG9hZE15SW1hZ2VzKCkge1xuICAgIGNvbnN0IG9mZnNldCA9IHRoaXMubXlBc3NldHMubGVuZ3RoO1xuICAgIHRoaXMuZ2V0TXlJbWFnZXMob2Zmc2V0LCB0aGlzLnF1ZXJ5LCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmdW5jdGlvbiB0byBsYXp5IGxvYWQgYWxsIGltYWdlc1xuICAgKi9cbiAgbGF6eWxvYWRBbGxJbWFnZXMoKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5hbGxJbWFnZXMubGVuZ3RoO1xuICAgIHRoaXMuZ2V0QWxsSW1hZ2VzKG9mZnNldCwgdGhpcy5xdWVyeSwgdHJ1ZSk7XG4gIH1cblxuXG4gIGxhenlsb2FkTXlWaWRlb3MoKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5teUFzc2V0cy5sZW5ndGg7XG4gICAgdGhpcy5nZXRNeVZpZGVvcyhvZmZzZXQsIHRoaXMucXVlcnksIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGZ1bmN0aW9uIHRvIGxhenkgbG9hZCBhbGwgdmlkZW9zXG4gICAqL1xuICBsYXp5bG9hZEFsbFZpZGVvcygpIHtcbiAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmFsbFZpZGVvcy5sZW5ndGg7XG4gICAgdGhpcy5nZXRBbGxWaWRlb3Mob2Zmc2V0LCB0aGlzLnF1ZXJ5LCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmdW5jdGlvbiB0byB1cGxvYWQgaW1hZ2VcbiAgICovXG4gIHVwbG9hZEltYWdlKGV2ZW50KSB7XG4gICAgdGhpcy5pbWFnZUZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXTtcbiAgICB0aGlzLmFzc2V0TmFtZSA9IGZpbGUubmFtZTtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHRoaXMuZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICB0aGlzLmZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUpO1xuICAgIGNvbnN0IGZpbGVUeXBlID0gZmlsZS50eXBlO1xuICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZS5uYW1lLnNwbGl0KCcuJykuc2xpY2UoMCwgLTEpLmpvaW4oJy4nKTtcbiAgICBjb25zdCBmaWxlU2l6ZSA9IGZpbGUuc2l6ZSAvIDEwMjQgLyAxMDI0O1xuICAgIGlmIChmaWxlVHlwZS5zcGxpdCgnLycpWzBdID09PSAnaW1hZ2UnKSB7XG4gICAgICB0aGlzLnNob3dFcnJvck1zZyA9IGZhbHNlO1xuICAgICAgaWYgKGZpbGVTaXplID4gdGhpcy5hc3NldENvbmZpZy5pbWFnZS5zaXplKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yTXNnID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lcnJvck1zZyA9IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAyMScpXG4gICAgICAgICArIHRoaXMuYXNzZXRDb25maWcuaW1hZ2Uuc2l6ZSArIHRoaXMuYXNzZXRDb25maWcuaW1hZ2Uuc2l6ZVR5cGU7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtQ29uZmlnKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVycm9yTXNnID0gJyc7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yTXNnID0gZmFsc2U7XG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dFcnJvck1zZyA9IHRydWU7XG4gICAgICB0aGlzLmVycm9yTXNnID0gXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDIwJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zaG93RXJyb3JNc2cpIHtcbiAgICAgIHRoaXMuaW1hZ2VVcGxvYWRMb2FkZXIgPSB0cnVlO1xuICAgICAgdGhpcy5pbWFnZUZvcm1WYWxpZCA9IHRydWU7XG4gICAgICB0aGlzLmFzc2VzdERhdGEgPSB0aGlzLmdlbmVyYXRlQXNzZXRDcmVhdGVSZXF1ZXN0KGZpbGVOYW1lLCBmaWxlVHlwZSwgJ2ltYWdlJyk7XG4gICAgICB0aGlzLnBvcHVsYXRlRm9ybURhdGEodGhpcy5hc3Nlc3REYXRhKTtcbiAgICB9XG4gIH1cbiAgcmVzZXRGb3JtQ29uZmlnKCkge1xuICAgIHRoaXMuaW1hZ2VVcGxvYWRMb2FkZXIgPSBmYWxzZTtcbiAgICB0aGlzLmltYWdlRm9ybVZhbGlkID0gZmFsc2U7XG4gICAgdGhpcy5mb3JtQ29uZmlnID0gdGhpcy5pbml0aWFsRm9ybUNvbmZpZztcbiAgfVxuICBwb3B1bGF0ZUZvcm1EYXRhKGZvcm1EYXRhKSB7XG4gICAgY29uc3QgZm9ybXZhbHVlID0gXy5jbG9uZURlZXAodGhpcy5mb3JtQ29uZmlnKTtcbiAgICB0aGlzLmZvcm1Db25maWcgPSBudWxsO1xuICAgIF8uZm9yRWFjaChmb3JtdmFsdWUsIChmb3JtRmllbGRDYXRlZ29yeSkgPT4ge1xuICAgICAgZm9ybUZpZWxkQ2F0ZWdvcnkuZGVmYXVsdCA9IGZvcm1EYXRhW2Zvcm1GaWVsZENhdGVnb3J5LmNvZGVdO1xuICAgICAgZm9ybUZpZWxkQ2F0ZWdvcnkuZWRpdGFibGUgPSB0cnVlO1xuICAgIH0pO1xuICAgIHRoaXMuZm9ybUNvbmZpZyA9IGZvcm12YWx1ZTtcbiAgfVxuICB1cGxvYWRBbmRVc2VJbWFnZShtb2RhbCkge1xuICAgIHRoaXMuaXNDbG9zYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5zaG93RXJyb3JNc2cgPSBmYWxzZTtcbiAgICB0aGlzLmltYWdlRm9ybVZhbGlkID0gZmFsc2U7XG4gICAgdGhpcy5xdWVzdGlvblNlcnZpY2UuY3JlYXRlTWVkaWFBc3NldCh7IGFzc2V0OiB0aGlzLmFzc2VzdERhdGEgfSkucGlwZShjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICBjb25zdCBlcnJJbmZvID0geyBlcnJvck1zZzogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDE5JykgfTtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5pc0Nsb3NhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW1hZ2VGb3JtVmFsaWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IodGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKSk7XG4gICAgfSkpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBjb25zdCBpbWdJZCA9IHJlcy5yZXN1bHQubm9kZV9pZDtcbiAgICAgIGNvbnN0IHByZVNpZ25lZFJlcXVlc3QgPSB7XG4gICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICBmaWxlTmFtZTogdGhpcy5hc3NldE5hbWVcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLmdlbmVyYXRlUHJlU2lnbmVkVXJsKHByZVNpZ25lZFJlcXVlc3QsIGltZ0lkKS5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgY29uc3QgZXJySW5mbyA9IHsgZXJyb3JNc2c6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAyNicpIH07XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzQ2xvc2FibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmltYWdlRm9ybVZhbGlkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IodGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKSk7XG4gICAgICB9KSkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCBzaWduZWRVUkwgPSByZXNwb25zZS5yZXN1bHQucHJlX3NpZ25lZF91cmw7XG4gICAgICAgIGxldCBibG9iQ29uZmlnID0ge1xuICAgICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICAgICAgICBjb250ZW50VHlwZTogJ0Fzc2V0J1xuICAgICAgICB9O1xuICAgICAgICBibG9iQ29uZmlnID0gdGhpcy5lZGl0b3JTZXJ2aWNlLmFwcGVuZENsb3VkU3RvcmFnZUhlYWRlcnMoYmxvYkNvbmZpZyk7XG4gICAgICAgIHRoaXMudXBsb2FkVG9CbG9iKHNpZ25lZFVSTCwgdGhpcy5pbWFnZUZpbGUsIGJsb2JDb25maWcpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsZVVSTCA9IHNpZ25lZFVSTC5zcGxpdCgnPycpWzBdO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICBkYXRhLmFwcGVuZCgnZmlsZVVybCcsIGZpbGVVUkwpO1xuICAgICAgICAgIGRhdGEuYXBwZW5kKCdtaW1lVHlwZScsIHRoaXMuaW1hZ2VGaWxlLnR5cGUpO1xuICAgICAgICAgIGNvbnN0IGNvbmZpZzEgPSB7XG4gICAgICAgICAgICBlbmN0eXBlOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsXG4gICAgICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsXG4gICAgICAgICAgICBjYWNoZTogZmFsc2VcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHVwbG9hZE1lZGlhQ29uZmlnID0ge1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhcmFtOiBjb25maWcxXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS51cGxvYWRNZWRpYSh1cGxvYWRNZWRpYUNvbmZpZywgaW1nSWQpLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXJySW5mbyA9IHsgZXJyb3JNc2c6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAxOScpIH07XG4gICAgICAgICAgICB0aGlzLmlzQ2xvc2FibGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmltYWdlRm9ybVZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbykpO1xuICAgICAgICAgIH0pKS5zdWJzY3JpYmUoKHJlc3BvbnNlMSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRJbWFnZUluRWRpdG9yKHJlc3BvbnNlMS5yZXN1bHQuY29udGVudF91cmwsIHJlc3BvbnNlMS5yZXN1bHQubm9kZV9pZCwgdGhpcy5hc3Nlc3REYXRhWyduYW1lJ10pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG4gIH1cbiAgb3BlbkltYWdlVXBsb2FkTW9kYWwoKSB7XG4gICAgdGhpcy5zaG93SW1hZ2VVcGxvYWRNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5yZXNldEZvcm1EYXRhKCk7XG4gIH1cbiAgZGlzbWlzc1BvcHMobW9kYWwpIHtcbiAgICB0aGlzLmRpc21pc3NJbWFnZVBpY2tlcigpO1xuICAgIG1vZGFsLmRlbnkoKTtcbiAgfVxuICBvblN0YXR1c0NoYW5nZXMoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuaXNWYWxpZCAmJiB0aGlzLmltYWdlVXBsb2FkTG9hZGVyKSB7XG4gICAgICB0aGlzLmltYWdlRm9ybVZhbGlkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbWFnZUZvcm1WYWxpZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICB2YWx1ZUNoYW5nZXMoZXZlbnQpIHtcbiAgICB0aGlzLmFzc2VzdERhdGEgPSBfLm1lcmdlKHt9LCB0aGlzLmFzc2VzdERhdGEsIGV2ZW50KTtcbiAgfVxuICAvLyBzZWFyY2ggZmVhdHVyZSBmb3IgaW1hZ2VzXG4gIHNlYXJjaEltYWdlcyhldmVudCwgdHlwZSkge1xuICAgIGlmIChldmVudCA9PT0gJ2NsZWFySW5wdXQnICYmIHR5cGUgPT09ICdteUltYWdlcycpIHtcbiAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgIHRoaXMuc2VhcmNoTXlJbnB1dCA9ICcnO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdjbGVhcklucHV0JyAmJiB0eXBlID09PSAnYWxsSW1hZ2VzJykge1xuICAgICAgdGhpcy5xdWVyeSA9ICcnO1xuICAgICAgdGhpcy5zZWFyY2hBbGxJbnB1dCA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ215SW1hZ2VzJykge1xuICAgICAgdGhpcy5nZXRNeUltYWdlcygwLCB0aGlzLnF1ZXJ5LCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZXRBbGxJbWFnZXMoMCwgdGhpcy5xdWVyeSwgdHJ1ZSk7XG4gICAgfVxuICB9XG4gIC8vIGdlbmVyYWwgbWV0aG9kXG4gIHJlc2V0Rm9ybURhdGEoKSB7XG4gICAgdGhpcy5zaG93RXJyb3JNc2cgPSBmYWxzZTtcbiAgICB0aGlzLmZvcm1EYXRhID0gbnVsbDtcbiAgICB0aGlzLmZvcm1Db25maWcgPSB0aGlzLmluaXRpYWxGb3JtQ29uZmlnO1xuICAgIHRoaXMuaW1hZ2VVcGxvYWRMb2FkZXIgPSBmYWxzZTtcbiAgICB0aGlzLmltYWdlRm9ybVZhbGlkID0gZmFsc2U7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5pc0Nsb3NhYmxlID0gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogZnVuY3Rpb24gdG8gdXBsb2FkIHZpZGVvXG4gICAqL1xuICBvcGVuVmlkZW9VcGxvYWRNb2RhbCgpIHtcbiAgICB0aGlzLnNob3dWaWRlb1VwbG9hZE1vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLnJlc2V0Rm9ybURhdGEoKTtcbiAgfVxuICBkaXNtaXNzVmlkZW9Qb3BzKG1vZGFsKSB7XG4gICAgaWYgKHRoaXMuaXNDbG9zYWJsZSkge1xuICAgIHRoaXMuZGlzbWlzc1ZpZGVvUGlja2VyKCk7XG4gICAgbW9kYWwuZGVueSgpO1xuICAgIH1cbiAgfVxuICB1cGxvYWRWaWRlb0Zyb21Mb2NhbChldmVudCkge1xuICAgIHRoaXMudmlkZW9GaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgdGhpcy5mb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIHRoaXMuZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgdGhpcy52aWRlb0ZpbGUpO1xuICAgIGNvbnN0IGZpbGVUeXBlID0gdGhpcy52aWRlb0ZpbGUudHlwZTtcbiAgICBjb25zdCBmaWxlTmFtZSA9IHRoaXMudmlkZW9GaWxlLm5hbWUuc3BsaXQoJy4nKS5zbGljZSgwLCAtMSkuam9pbignLicpO1xuICAgIGNvbnN0IGZpbGVTaXplID0gdGhpcy52aWRlb0ZpbGUuc2l6ZSAvIDEwMjQgLyAxMDI0O1xuICAgIGlmIChfLmluY2x1ZGVzKGZpbGVUeXBlLnNwbGl0KCcvJyksICd2aWRlbycpKSB7XG4gICAgICB0aGlzLnNob3dFcnJvck1zZyA9IGZhbHNlO1xuICAgICAgaWYgKGZpbGVTaXplID4gdGhpcy5hc3NldENvbmZpZy52aWRlby5zaXplKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yTXNnID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lcnJvck1zZyA9IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAyMScpICtcbiAgICAgICAgIHRoaXMuYXNzZXRDb25maWcudmlkZW8uc2l6ZSArIHRoaXMuYXNzZXRDb25maWcudmlkZW8uc2l6ZVR5cGU7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtQ29uZmlnKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVycm9yTXNnID0gJyc7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yTXNnID0gZmFsc2U7XG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKHRoaXMudmlkZW9GaWxlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93RXJyb3JNc2cgPSB0cnVlO1xuICAgICAgdGhpcy5lcnJvck1zZyA9IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAyNCcpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc2hvd0Vycm9yTXNnKSB7XG4gICAgICB0aGlzLmltYWdlVXBsb2FkTG9hZGVyID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW1hZ2VGb3JtVmFsaWQgPSB0cnVlO1xuICAgICAgdGhpcy5hc3Nlc3REYXRhID0gdGhpcy5nZW5lcmF0ZUFzc2V0Q3JlYXRlUmVxdWVzdChmaWxlTmFtZSwgZmlsZVR5cGUsICd2aWRlbycpO1xuICAgICAgdGhpcy5wb3B1bGF0ZUZvcm1EYXRhKHRoaXMuYXNzZXN0RGF0YSk7XG4gICAgfVxuICB9XG4gIHVwbG9hZFZpZGVvKHZpZGVvTW9kYWwpIHtcbiAgICB0aGlzLmlzQ2xvc2FibGUgPSBmYWxzZTtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc2hvd0Vycm9yTXNnID0gZmFsc2U7XG4gICAgdGhpcy5pbWFnZUZvcm1WYWxpZCA9IGZhbHNlO1xuICAgIGlmICghdGhpcy5zaG93RXJyb3JNc2cpIHtcbiAgICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLmNyZWF0ZU1lZGlhQXNzZXQoeyBhc3NldDogdGhpcy5hc3Nlc3REYXRhIH0pLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0Nsb3NhYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbWFnZUZvcm1WYWxpZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGVyckluZm8gPSB7IGVycm9yTXNnOiBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UubGFiZWxDb25maWcsICdtZXNzYWdlcy5lcnJvci4wMjUnKSB9O1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcih0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pKTtcbiAgICAgIH0pKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50SWQgPSByZXMucmVzdWx0Lm5vZGVfaWQ7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgZmlsZU5hbWU6IHRoaXMudmlkZW9GaWxlLm5hbWVcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLmdlbmVyYXRlUHJlU2lnbmVkVXJsKHJlcXVlc3QsIGNvbnRlbnRJZCkucGlwZShjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgY29uc3QgZXJySW5mbyA9IHsgZXJyb3JNc2c6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAyNicpIH07XG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5pc0Nsb3NhYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmltYWdlRm9ybVZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcih0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pKTtcbiAgICAgICAgfSkpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBjb25zdCBzaWduZWRVUkwgPSByZXNwb25zZS5yZXN1bHQucHJlX3NpZ25lZF91cmw7XG4gICAgICAgICAgbGV0IGJsb2JDb25maWcgPSB7XG4gICAgICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ0Fzc2V0J1xuICAgICAgICAgIH07XG4gICAgICAgICAgYmxvYkNvbmZpZyA9IHRoaXMuZWRpdG9yU2VydmljZS5hcHBlbmRDbG91ZFN0b3JhZ2VIZWFkZXJzKGJsb2JDb25maWcpO1xuICAgICAgICAgIHRoaXMudXBsb2FkVG9CbG9iKHNpZ25lZFVSTCwgdGhpcy52aWRlb0ZpbGUsIGJsb2JDb25maWcpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWxlVVJMID0gc2lnbmVkVVJMLnNwbGl0KCc/JylbMF07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnRXaXRoVVJMKGZpbGVVUkwsIHRoaXMudmlkZW9GaWxlLnR5cGUsIGNvbnRlbnRJZCwgdmlkZW9Nb2RhbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVBc3NldENyZWF0ZVJlcXVlc3QoZmlsZU5hbWUsIGZpbGVUeXBlLCBtZWRpYVR5cGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogZmlsZU5hbWUsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBtaW1lVHlwZTogZmlsZVR5cGUsXG4gICAgICBjcmVhdGVkQnk6IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LnVzZXIuaWQnKSxcbiAgICAgIGNyZWF0b3I6IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LnVzZXIuZnVsbE5hbWUnKSxcbiAgICAgIGNoYW5uZWw6IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LmNoYW5uZWwnKVxuICAgIH07XG4gIH1cblxuICB1cGxvYWRUb0Jsb2Ioc2lnbmVkVVJMLCBmaWxlLCBjb25maWcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IGNzcCA9IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LmNsb3VkU3RvcmFnZS5wcm92aWRlcicsICdhenVyZScpO1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcbiAgICAgIGNvbnN0IHVwbG9hZGVyTGliID0gbmV3IFN1bmJpcmRGaWxlVXBsb2FkTGliLkZpbGVVcGxvYWRlcigpO1xuICAgICAgdXBsb2FkZXJMaWIudXBsb2FkKHsgdXJsOiBzaWduZWRVUkwsIGZpbGUsIGNzcCB9KVxuICAgICAgLm9uKFwiZXJyb3JcIiwgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckluZm8gPSB7IGVycm9yTXNnOiBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UubGFiZWxDb25maWcsICdtZXNzYWdlcy5lcnJvci4wMTgnKSB9O1xuICAgICAgICB0aGlzLmlzQ2xvc2FibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbWFnZUZvcm1WYWxpZCA9IHRydWU7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVycm9yLCBlcnJJbmZvKSk7XG4gICAgICB9KS5vbihcImNvbXBsZXRlZFwiLCAoY29tcGxldGVkKSA9PiB7XG4gICAgICAgIG9ic2VydmVyLm5leHQoY29tcGxldGVkKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVDb250ZW50V2l0aFVSTChmaWxlVVJMLCBtaW1lVHlwZSwgY29udGVudElkLCB2aWRlb01vZGFsPykge1xuICAgIGNvbnN0IGRhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBkYXRhLmFwcGVuZCgnZmlsZVVybCcsIGZpbGVVUkwpO1xuICAgIGRhdGEuYXBwZW5kKCdtaW1lVHlwZScsIG1pbWVUeXBlKTtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBlbmN0eXBlOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsXG4gICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXG4gICAgICBjb250ZW50VHlwZTogZmFsc2UsXG4gICAgICBjYWNoZTogZmFsc2VcbiAgICB9O1xuICAgIGNvbnN0IG9wdGlvbiA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBwYXJhbTogY29uZmlnXG4gICAgfTtcbiAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS51cGxvYWRNZWRpYShvcHRpb24sIGNvbnRlbnRJZCkucGlwZShjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICBjb25zdCBlcnJJbmZvID0geyBlcnJvck1zZzogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDI3JykgfTtcbiAgICAgIHRoaXMuaXNDbG9zYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuaW1hZ2VGb3JtVmFsaWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IodGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKSk7XG4gICAgfSkpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgLy8gUmVhZCB1cGxvYWQgdmlkZW8gZGF0YVxuICAgICAgdGhpcy5nZXRVcGxvYWRWaWRlbyhyZXMucmVzdWx0Lm5vZGVfaWQsIHZpZGVvTW9kYWwpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0VXBsb2FkVmlkZW8odmlkZW9JZCwgdmlkZW9Nb2RhbD8pIHtcbiAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS5nZXRWaWRlbyh2aWRlb0lkKS5waXBlKG1hcCgoZGF0YTogYW55KSA9PiBkYXRhLnJlc3VsdC5jb250ZW50KSwgY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgY29uc3QgZXJySW5mbyA9IHsgZXJyb3JNc2c6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjAxMScpIH07XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNDbG9zYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLmltYWdlRm9ybVZhbGlkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbykpO1xuICAgIH0pKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uuc3VjY2VzcyhfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5zdWNjZXNzLjAwNicpKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWaWRlbyA9IHJlcztcbiAgICAgIHRoaXMuc2hvd0FkZEJ1dHRvbiA9IHRydWU7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNDbG9zYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLmltYWdlRm9ybVZhbGlkID0gdHJ1ZTtcbiAgICAgIHRoaXMuYWRkVmlkZW9JbkVkaXRvcih2aWRlb01vZGFsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHNlYXJjaE15VmlkZW8oZXZlbnQpIHtcbiAgICB0aGlzLnF1ZXJ5ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuZ2V0TXlWaWRlb3MoMCwgdGhpcy5xdWVyeSk7XG4gIH1cbiAgc2VhcmNoQWxsVmlkZW8oZXZlbnQpIHtcbiAgICB0aGlzLnF1ZXJ5ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuZ2V0QWxsVmlkZW9zKDAsIHRoaXMucXVlcnkpO1xuICB9XG4gIC8vIHNlYXJjaFZpZGVvIGZlYXR1cmVcbiAgc2VhcmNoVmlkZW8oZXZlbnQsIHR5cGUpIHtcbiAgICBpZiAoZXZlbnQgPT09ICdjbGVhcklucHV0JyAmJiB0eXBlID09PSAnbXlWaWRlb3MnKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gJyc7XG4gICAgICB0aGlzLnNlYXJjaE15SW5wdXQgPSAnJztcbiAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSAnY2xlYXJJbnB1dCcgJiYgdHlwZSA9PT0gJ2FsbFZpZGVvcycpIHtcbiAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgIHRoaXMuc2VhcmNoQWxsSW5wdXQgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5xdWVyeSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdteVZpZGVvcycpIHtcbiAgICAgIHRoaXMuZ2V0TXlWaWRlb3MoMCwgdGhpcy5xdWVyeSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2V0QWxsVmlkZW9zKDAsIHRoaXMucXVlcnksIHRydWUpO1xuICAgIH1cbiAgfVxuICBzZWxlY3RWaWRlbyhkYXRhKSB7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRoaXMuc2hvd0FkZEJ1dHRvbiA9IHRydWU7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlkZW9JZCA9IGRhdGEuaWRlbnRpZmllcjtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWaWRlbyA9IGRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvd0FkZEJ1dHRvbiA9IGZhbHNlO1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZGVvSWQgPSAnJztcbiAgICAgIHRoaXMuc2VsZWN0ZWRWaWRlbyA9IHt9O1xuICAgIH1cblxuICB9XG5cbiAgY291bnRDaGFyYWN0ZXJzKGRvY3VtZW50KSB7XG4gICAgY29uc3Qgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRSb290KCk7XG4gICAgcmV0dXJuIHRoaXMuY291bnRDaGFyYWN0ZXJzSW5FbGVtZW50KHJvb3RFbGVtZW50KTtcbiAgfVxuICBjb3VudENoYXJhY3RlcnNJbkVsZW1lbnQobm9kZSkge1xuICAgIGxldCBjaGFycyA9IDA7XG4gICAgY29uc3QgZm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoO1xuICAgIGNvbnN0IGZvckUgPSBub2RlLmdldENoaWxkcmVuKCk7XG4gICAgbGV0IGNoaWxkO1xuXG4gICAgd2hpbGUgKCEoY2hpbGQgPSBmb3JFLm5leHQoKSkuZG9uZSkge1xuICAgICAgaWYgKGNoaWxkLnZhbHVlLmlzKCd0ZXh0JykpIHtcbiAgICAgICAgY2hhcnMgKz0gY2hpbGQudmFsdWUuZGF0YS5sZW5ndGg7XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkLnZhbHVlLmlzKCdlbGVtZW50JykpIHtcbiAgICAgICAgY2hhcnMgKz0gdGhpcy5jb3VudENoYXJhY3RlcnNJbkVsZW1lbnQoY2hpbGQudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hhcnM7XG4gIH1cblxuICBnZXRNZWRpYU9yaWdpblVSTChzcmMpIHtcbiAgICBjb25zdCByZXBsYWNlVGV4dCA9IHRoaXMuYXNzZXRQcm94eVVybDtcbiAgICBjb25zdCBjbG91ZFN0b3JhZ2VVcmxzID0gXy5jb21wYWN0KF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LmNsb3VkU3RvcmFnZVVybHMnKSB8fCBbXSk7XG4gICAgXy5mb3JFYWNoKGNsb3VkU3RvcmFnZVVybHMsIHVybCA9PiB7XG4gICAgICBpZiAoc3JjLmluZGV4T2YodXJsKSAhPT0gLTEpIHtcbiAgICAgICAgc3JjID0gc3JjLnJlcGxhY2UodXJsLCByZXBsYWNlVGV4dCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNyYztcbiAgfVxuICAvLyBIZXJlIEV2ZW50IGxpc3RlbmVyIGlzIGF0dGFjaGVkIHRvIGRvY3VtZW50IHRvIGxpc3RlbiB0aGUgY2xpY2sgZXZlbnQgZnJvbSBXaXJpcyBwbHVnaW4gKCdPSyctPiBidXR0b24pXG4gIGF0dGFjaEV2ZW50KGVkaXRvcikge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQgJiYgKGUudGFyZ2V0IGFzIEVsZW1lbnQpLmNsYXNzTmFtZSA9PT0gJ3dyc19tb2RhbF9idXR0b25fYWNjZXB0Jykge1xuICAgICAgICBlZGl0b3IubW9kZWwuY2hhbmdlKHdyaXRlciA9PiB7XG4gICAgICAgICAgY29uc3QgaW5zZXJ0UG9zaXRpb24gPSBlZGl0b3IubW9kZWwuZG9jdW1lbnQuc2VsZWN0aW9uLmdldEZpcnN0UG9zaXRpb24oKTtcbiAgICAgICAgICB3cml0ZXIuaW5zZXJ0VGV4dCgnICcsIGluc2VydFBvc2l0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRDaGFyYWN0ZXJzTGVmdCgpIHtcbiAgICBpZiAodGhpcy5zZXRDaGFyYWN0ZXJMaW1pdCkge1xuICAgICAgbGV0IGNoYXJSZW1haW5pbmcgPSB0aGlzLnNldENoYXJhY3RlckxpbWl0IC0gdGhpcy5jaGFyYWN0ZXJDb3VudDtcbiAgICAgIHJldHVybiBjaGFyUmVtYWluaW5nID4gMCA/IGNoYXJSZW1haW5pbmcgOiAwO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImVkaXRvcldyYXBwZXJcIiBbbmdDbGFzc109XCJ7J2hhc0Vycm9yJzogbGltaXRFeGNlZWRlZH1cIj5cbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS10b29sdGlwPVwiQWRkIGltYWdlXCIgZGF0YS1wb3NpdGlvbj1cImJvdHRvbSBjZW50ZXJcIiBkYXRhLXZhcmlhdGlvbj1cIm1pbmlcIiBkYXRhLWludmVydGVkPVwiXCJcbiAgICB0aXRsZT1cIkFkZCBpbWFnZVwiIFtkaXNhYmxlZF09XCJpc0Fzc2V0QnJvd3NlclJlYWRPbmx5IHx8IGlzRWRpdG9yRm9jdXNlZFwiIChjbGljayk9XCJpbml0aWFsaXplSW1hZ2VQaWNrZXIoJ3F1ZXN0aW9uJylcIlxuICAgIGNsYXNzPVwidWkgaWNvbiBidXR0b24gaW5zZXJ0LWltYWdlLWJ0blwiPlxuICAgIDxpIGNsYXNzPVwiaW1hZ2Ugb3V0bGluZSBpY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICA8L2J1dHRvbj5cbiAgPHRleHRhcmVhIGNsYXNzPVwiZWRpdG9yXCIgI2VkaXRvciBuYW1lPVwicXVlc3Rpb25cIiBwbGFjZWhvbGRlcj1cIlwiPjwvdGV4dGFyZWE+XG4gIDxkaXYgKm5nSWY9XCJzZXRDaGFyYWN0ZXJMaW1pdCA+IDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2hhcmFjdGVyQ291bnRcIj5cbiAgICAgIHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5jaGFyYWN0ZXJzTGVmdH19IHt7Y2hhcmFjdGVyc0xlZnR9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48c3VpLW1vZGFsIFtpc0Nsb3NhYmxlXT1cInRydWVcIiBjbGFzcz1cInNiLW1vZGFsIG92ZXJmbG93LW1vZGFsXCIgW2lzSW52ZXJ0ZWRdPVwiZmFsc2VcIiAoZGlzbWlzc2VkKT1cImRpc21pc3NJbWFnZVBpY2tlcigpXCJcbiAgKm5nSWY9XCJzaG93SW1hZ2VQaWNrZXJcIiBbc2l6ZV09XCInbm9ybWFsJ1wiIFtpc0Z1bGxTY3JlZW5dPVwiZmFsc2VcIiBbbXVzdFNjcm9sbF09XCJ0cnVlXCIgI21vZGFsPlxuICA8ZGl2IGNsYXNzPVwic2ItbW9kYWwtaGVhZGVyXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LnNlbGVjdEltYWdlfX08L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWNvbnRlbnQgcC0wXCI+XG4gICAgPHN1aS10YWJzZXQ+XG4gICAgICA8ZGl2IGNsYXNzPVwic2ItdGFic2V0LW1lbnVcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJzYi1pdGVtXCIgKGFjdGl2YXRlKT1cImdldE15SW1hZ2VzKDApXCIgc3VpVGFiSGVhZGVyPVwiMVwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5teUltYWdlc319PC9hPlxuICAgICAgICA8YSBjbGFzcz1cInNiLWl0ZW1cIiAoYWN0aXZhdGUpPVwiZ2V0QWxsSW1hZ2VzKDApXCIgc3VpVGFiSGVhZGVyPVwiMlwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5hbGxJbWFnZX19PC9hPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidWkgc2VnbWVudCBzYi10YWJzZXQtc2VnbWVudCBtLTAgcHQtMTVcIiBpbmZpbml0ZVNjcm9sbCBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCIyXCJcbiAgICAgICAgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiNTAwXCIgW3Njcm9sbFdpbmRvd109XCJmYWxzZVwiIChzY3JvbGxlZCk9XCJsYXp5bG9hZE15SW1hZ2VzKClcIiBzdWlUYWJDb250ZW50PVwiMVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidWkgIHBiLTE2IGQtZmxleCBwbC0wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiLXNlYXJjaC1ib3ggc21hbGwgbm8tYnRuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZGl2IHJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwic2VhcmNoIGljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cInNlYXJjaEltYWdlcygkZXZlbnQsICdteUltYWdlcycpXCIgY2xhc3M9XCJzYi1zZWFyY2gtaW5wdXRcIiBbKG5nTW9kZWwpXT1cInNlYXJjaE15SW5wdXRcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LnNlYXJjaFBsYWNlaG9sZGVyfX0gLz5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJjbG9zZSBpY29uXCIgKGNsaWNrKT1cInNlYXJjaEltYWdlcygnY2xlYXJJbnB1dCcsICdteUltYWdlcycpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWxcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LnNlYXJjaF9idG5fbGFiZWx9fTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwiZnMtMC05ODYgbWwtYXV0byBzYi1jb2xvci1ncmV5XCIgPnt7YXNzZXRzQ291bnR9fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhbXlBc3NldHM/Lmxlbmd0aCAmJiBzZWFyY2hNeUlucHV0XCIgY2xhc3M9XCJmcy0wNzg1XCI+IHt7ZW1wdHlJbWFnZVNlYXJjaE1lc3NhZ2V9fSA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiLWdyaWQtbGF5b3V0IGltYWdlXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiLXZpZGVvLWNvbnRlbnRcIiAqbmdGb3I9XCJsZXQgZGF0YSBvZiBteUFzc2V0c1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiLWltYWdlLXNlY3Rpb24gcmVsYXRpdmUgcG9zaXRpb25cIj5cbiAgICAgICAgICAgICAgPGltZyAoY2xpY2spPVwiYWRkSW1hZ2VJbkVkaXRvcihkYXRhLmRvd25sb2FkVXJsLCBkYXRhLmlkZW50aWZpZXIsIGRhdGEubmFtZSlcIiBhbHQ9XCJ7e2RhdGE/Lm5hbWV9fVwiIFtzcmNdPVwiZGF0YS5kb3dubG9hZFVybFwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInVpIHNlZ21lbnQgc2ItdGFic2V0LXNlZ21lbnQgbS0wIHB0LTE1XCIgaW5maW5pdGVTY3JvbGwgW2luZmluaXRlU2Nyb2xsRGlzdGFuY2VdPVwiMlwiXG4gICAgICAgIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjUwMFwiIFtzY3JvbGxXaW5kb3ddPVwiZmFsc2VcIiAoc2Nyb2xsZWQpPVwibGF6eWxvYWRBbGxJbWFnZXMoKVwiIHN1aVRhYkNvbnRlbnQ9XCIyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1aSAgcGItMTYgZC1mbGV4IHBsLTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Itc2VhcmNoLWJveCBzbWFsbCBuby1idG5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1kaXYgcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJzZWFyY2ggaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwic2VhcmNoSW1hZ2VzKCRldmVudCwgJ2FsbEltYWdlcycpXCIgY2xhc3M9XCJzYi1zZWFyY2gtaW5wdXRcIiBbKG5nTW9kZWwpXT1cInNlYXJjaEFsbElucHV0XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPXt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5zZWFyY2hQbGFjZWhvbGRlcn19IC8+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiY2xvc2UgaWNvblwiIChjbGljayk9XCJzZWFyY2hJbWFnZXMoJ2NsZWFySW5wdXQnLCAnYWxsSW1hZ2VzJylcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzYi1idG4gc2ItYnRuLW5vcm1hbFwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uYnV0dG9uX2xhYmVscz8uc2VhcmNoX2J0bl9sYWJlbH19PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHAgY2xhc3M9XCJmcy0wLTk4NiBtbC1hdXRvIHNiLWNvbG9yLWdyZXlcIj57e2Fzc2V0c0NvdW50fX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWFsbEltYWdlcz8ubGVuZ3RoICYmIHNlYXJjaEFsbElucHV0XCIgY2xhc3M9XCJmcy0wNzg1XCI+IHt7ZW1wdHlJbWFnZVNlYXJjaE1lc3NhZ2V9fSA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiLWdyaWQtbGF5b3V0IGltYWdlXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiLXZpZGVvLWNvbnRlbnRcIiAqbmdGb3I9XCJsZXQgZGF0YSBvZiBhbGxJbWFnZXNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1pbWFnZS1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgIDxpbWcgKGNsaWNrKT1cImFkZEltYWdlSW5FZGl0b3IoZGF0YS5kb3dubG9hZFVybCwgZGF0YS5pZGVudGlmaWVyLCBkYXRhLm5hbWUpXCIgYWx0PVwie3tkYXRhPy5uYW1lfX1cIiBbc3JjXT1cImRhdGEuZG93bmxvYWRVcmxcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG4gICAgPC9zdWktdGFic2V0PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWFjdGlvbnMgZmxleC1qYy1zcGFjZS1lbmRcIj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJvcGVuSW1hZ2VVcGxvYWRNb2RhbCgpO1wiIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1wcmltYXJ5IHNiLWJ0bi1ub3JtYWxcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LnVwbG9hZF91c2VfYnRuX2xhYmVsfX08L2J1dHRvbj5cbiAgPC9kaXY+XG48L3N1aS1tb2RhbD5cblxuPHN1aS1tb2RhbCBbaXNDbG9zYWJsZV09XCJpc0Nsb3NhYmxlXCIgY2xhc3M9XCJzYi1tb2RhbCBvdmVyZmxvdy1tb2RhbFwiIFtpc0ludmVydGVkXT1cImZhbHNlXCJcbiAgKGRpc21pc3NlZCk9XCJkaXNtaXNzVmlkZW9QaWNrZXIoKVwiICpuZ0lmPVwic2hvd1ZpZGVvUGlja2VyXCIgW3NpemVdPVwiJ25vcm1hbCdcIiBbaXNGdWxsU2NyZWVuXT1cImZhbHNlXCJcbiAgW211c3RTY3JvbGxdPVwidHJ1ZVwiICNtb2RhbD5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWhlYWRlclwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5zZWxlY3RWaWRlb319PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1jb250ZW50IHAtMFwiPlxuICAgIDxzdWktdGFic2V0PlxuICAgICAgPGRpdiBjbGFzcz1cInNiLXRhYnNldC1tZW51XCI+XG4gICAgICAgIDxhIGNsYXNzPVwic2ItaXRlbVwiIChhY3RpdmF0ZSk9XCJnZXRNeVZpZGVvcygwKVwiIHN1aVRhYkhlYWRlcj1cIjFcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8ubXlWaWRlb3N9fTwvYT5cbiAgICAgICAgPGEgY2xhc3M9XCJzYi1pdGVtXCIgKGFjdGl2YXRlKT1cImdldEFsbFZpZGVvcygwKVwiIHN1aVRhYkhlYWRlcj1cIjJcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uYWxsVmlkZW9zfX08L2E+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInVpIHNlZ21lbnQgc2ItdGFic2V0LXNlZ21lbnQgbS0wIHB0LTE1XCIgaW5maW5pdGVTY3JvbGwgW2luZmluaXRlU2Nyb2xsRGlzdGFuY2VdPVwiMlwiXG4gICAgICAgIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjUwMFwiIFtzY3JvbGxXaW5kb3ddPVwiZmFsc2VcIiAoc2Nyb2xsZWQpPVwibGF6eWxvYWRNeVZpZGVvcygpXCIgc3VpVGFiQ29udGVudD1cIjFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBiLTE2IGQtZmxleCBwbC0wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiLXNlYXJjaC1ib3ggc21hbGwgbm8tYnRuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZGl2IHJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwic2VhcmNoIGljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cInNlYXJjaFZpZGVvKCRldmVudCwgJ215VmlkZW9zJylcIiBjbGFzcz1cInNiLXNlYXJjaC1pbnB1dFwiIFsobmdNb2RlbCldPVwic2VhcmNoTXlJbnB1dFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj17e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uc2VhcmNoUGxhY2Vob2xkZXJ9fSAvPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImNsb3NlIGljb25cIiAoY2xpY2spPVwic2VhcmNoVmlkZW8oJ2NsZWFySW5wdXQnLCAnbXlWaWRlb3MnKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNiLWJ0biBzYi1idG4tbm9ybWFsXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy5zZWFyY2hfYnRuX2xhYmVsfX08L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cCBjbGFzcz1cImZzLTAtOTg2IG1sLWF1dG8gc2ItY29sb3ItZ3JleVwiID57e2Fzc2V0c0NvdW50fX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIW15QXNzZXRzPy5sZW5ndGggJiYgc2VhcmNoTXlJbnB1dFwiIGNsYXNzPVwiZnMtMDc4NVwiPiB7e2VtcHR5VmlkZW9TZWFyY2hNZXNzYWdlfX0gPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYi1ncmlkLWxheW91dCB2aWRlb1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi12aWRlby1jb250ZW50XCIgKm5nRm9yPVwibGV0IGRhdGEgb2YgbXlBc3NldHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1pbWFnZS1zZWN0aW9uIHJlbGF0aXZlIHBvc2l0aW9uXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBzZWxlY3RlZFZpZGVvSWQgPT09IGRhdGEuaWRlbnRpZmllcn1cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VmlkZW8oZGF0YSlcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktaW1hZ2VcIj48aSBjbGFzcz1cInBsYXkgY2lyY2xlIGljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9kaXY+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiY2hlY2sgY2lyY2xlIGljb24gc2VsZWN0ZWQtdmlkZW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCJkYXRhLnRodW1ibmFpbFwiIGFsdD1cInt7ZGF0YT8ubmFtZX19XCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwidWkgc2VnbWVudCBzYi10YWJzZXQtc2VnbWVudCBtLTAgcHQtMTVcIiBpbmZpbml0ZVNjcm9sbCBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCIyXCJcbiAgICAgICAgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiNTAwXCIgW3Njcm9sbFdpbmRvd109XCJmYWxzZVwiIChzY3JvbGxlZCk9XCJsYXp5bG9hZEFsbFZpZGVvcygpXCIgc3VpVGFiQ29udGVudD1cIjJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIiBwYi0xNiBkLWZsZXggcGwtMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1zZWFyY2gtYm94IHNtYWxsIG5vLWJ0blwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWRpdiByZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInNlYXJjaCBpY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJzZWFyY2hWaWRlbygkZXZlbnQsICdhbGxWaWRlb3MnKVwiIGNsYXNzPVwic2Itc2VhcmNoLWlucHV0XCIgWyhuZ01vZGVsKV09XCJzZWFyY2hBbGxJbnB1dFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj17e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uc2VhcmNoUGxhY2Vob2xkZXJ9fSAvPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImNsb3NlIGljb25cIiAoY2xpY2spPVwic2VhcmNoVmlkZW8oJ2NsZWFySW5wdXQnLCAnYWxsVmlkZW9zJylcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzYi1idG4gc2ItYnRuLW5vcm1hbFwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uYnV0dG9uX2xhYmVscz8uc2VhcmNoX2J0bl9sYWJlbH19PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHAgY2xhc3M9XCJmcy0wLTk4NiBtbC1hdXRvIHNiLWNvbG9yLWdyZXlcIiA+e3thc3NldHNDb3VudH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFhbGxWaWRlb3M/Lmxlbmd0aCAmJiBzZWFyY2hBbGxJbnB1dFwiIGNsYXNzPVwiZnMtMDc4NVwiPiB7e2VtcHR5VmlkZW9TZWFyY2hNZXNzYWdlfX0gPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYi1ncmlkLWxheW91dCB2aWRlb1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi12aWRlby1jb250ZW50XCIgKm5nRm9yPVwibGV0IGRhdGEgb2YgYWxsVmlkZW9zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2ItaW1hZ2Utc2VjdGlvbiByZWxhdGl2ZSBwb3NpdGlvblwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogc2VsZWN0ZWRWaWRlb0lkID09PSBkYXRhLmlkZW50aWZpZXJ9XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFZpZGVvKGRhdGEpO1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheS1pbWFnZVwiPjxpIGNsYXNzPVwicGxheSBjaXJjbGUgaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2Rpdj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJjaGVjayBjaXJjbGUgaWNvbiBzZWxlY3RlZC12aWRlb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImRhdGEudGh1bWJuYWlsXCIgYWx0PVwie3tkYXRhPy5uYW1lfX1cIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvc3VpLXRhYnNldD5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1hY3Rpb25zIGZsZXgtamMtc3BhY2UtYmV0d2VlbiBwbC0yMFwiPlxuICAgIDxkaXY+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJhZGRWaWRlb0luRWRpdG9yKCk7XCIgY2xhc3M9XCJzYi1idG4gc2ItYnRuLW5vcm1hbFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsnc2ItYnRuLXByaW1hcnknOiBzaG93QWRkQnV0dG9uLCAnc2ItYnRuLWRpc2FibGVkJzogIXNob3dBZGRCdXR0b259XCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy5hZGRfYnRuX2xhYmVsfX08L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib3BlblZpZGVvVXBsb2FkTW9kYWwoKTtcIiBjbGFzcz1cInNiLWJ0biBzYi1idG4tcHJpbWFyeSBzYi1idG4tbm9ybWFsXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy51cGxvYWRfdXNlX2J0bl9sYWJlbH19PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9zdWktbW9kYWw+XG5cbjwhLS0gVXBsb2FkIGltYWdlIHBvcCB1cCBjb2RlIGhlcmUgIC0tPlxuXG48c3VpLW1vZGFsIGNsYXNzPVwic2ItbW9kYWwgb3ZlcmZsb3ctbW9kYWxcIiBbaXNDbG9zYWJsZV09XCJpc0Nsb3NhYmxlXCIgW2lzSW52ZXJ0ZWRdPVwiZmFsc2VcIlxuICAoZGlzbWlzc2VkKT1cImRpc21pc3NJbWFnZVVwbG9hZE1vZGFsKClcIiAqbmdJZj1cInNob3dJbWFnZVVwbG9hZE1vZGFsXCIgW3NpemVdPVwiJ2xhcmdlJ1wiIFtpc0Z1bGxTY3JlZW5dPVwiZmFsc2VcIlxuICBbbXVzdFNjcm9sbF09XCJ0cnVlXCIgYXBwQm9keVNjcm9sbCAjbW9kYWw+XG4gIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1oZWFkZXJcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8udXBsb2FkQW5kVXNlfX08L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInAtMTAgc2ItYmctd2hpdGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidy01MFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiPlxuICAgICAgICAgIDxoNiBjbGFzcz1cIm1iLTggZnMtbm9ybWFsXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmNob29zZU9yRHJhZ0ltYWdlfX08c3BhbiBjbGFzcz1cInJlZFwiPio8L3NwYW4+PC9oNj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidXBsb2FkLWltYWdlLW1vZGFsLXNlY3Rpb24gZC1mbGV4IGZsZXgtYWktY2VudGVyIGZsZXgtamMtY2VudGVyIGZsZXgtZGNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ1cGxvYWQtaW5wdXQtYnV0dG9uIHNiLWJ0biBzYi1idG4tc3VjY2VzcyBzYi1idG4tbm9ybWFsXCI+XG4gICAgICAgICAgICAgICAgIHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uYnV0dG9uX2xhYmVscz8udXBsb2FkX2Zyb21fY29tcHV0ZXJfYnRuX2xhYmVsfX1cbiAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJ1cGxvYWRJbWFnZSgkZXZlbnQpXCIgdHlwZT1cImZpbGVcIiBbYWNjZXB0XT1cImFjY2VwdEltYWdlVHlwZVwiIG5hbWU9XCJhc3NldGZpbGVcIj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweS0xMCBmcy0wLTc4NSBzYi1jb2xvci1wcmltYXJ5XCIgKm5nSWY9XCJpbWFnZVVwbG9hZExvYWRlclwiPiB7e2Fzc2V0TmFtZX19IDwvZGl2PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZzbWFsbCBtdC04XCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LnVwbG9hZH19IHt7YXNzZXRDb25maWcuaW1hZ2UuYWNjZXB0ZWR9fSAoe3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/Lm1heEZpbGVTaXplfX1cbiAgICAgICAgICAgICAgICB7e2Fzc2V0Q29uZmlnLmltYWdlLnNpemV9fXt7YXNzZXRDb25maWcuaW1hZ2Uuc2l6ZVR5cGV9fSk8L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93RXJyb3JNc2dcIiBjbGFzcz1cInNiLWNvbG9yLWVycm9yIGZzbWFsbCBtdC04XCI+XG4gICAgICAgICAgICAgICAgPHA+e3tlcnJvck1zZ319PC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aSBpbmZvIG1lc3NhZ2Ugc2ItaW5mby1ieFwiPlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdFwiPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJmcy0wNzg1XCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmFsbG93ZWRGaWxlVHlwZXN9fSB7e2Fzc2V0Q29uZmlnLmltYWdlLmFjY2VwdGVkfX08L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJmcy0wNzg1XCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/Lm1heGltdW1BbGxvd2VkRmlsZVNpemV9fSB7e2Fzc2V0Q29uZmlnLmltYWdlLnNpemV9fXt7YXNzZXRDb25maWcuaW1hZ2Uuc2l6ZVR5cGV9fTwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxoNiBjbGFzcz1cImZzLTA3ODVcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uY29weVJpZ2h0c0FuZExpY2Vuc2V9fTxzcGFuIGNsYXNzPVwicmVkXCI+Kjwvc3Bhbj48L2g2PlxuICAgICAgICAgIDxwIGNsYXNzPVwiZnNtYWxsIG10LTggdGVybXMtYW5kLWNvbmRpdGlvblwiPnt7dGVybXNBbmRDb25kaXRpb259fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3LTUwIHBsLTEwIG1sLTEwIGItYmxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInVpIGluZm8gbWVzc2FnZSBzYi1pbmZvLWJ4IG1iLTBcIj5cbiAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0XCI+XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJmcy0wNzg1IGZvbnQtd2VpZ2h0LWJvbGRcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29uIGluZm8gY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uZHJvcENob29zZUZpbGV9fTwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYi1mb3JtLWZpZWxkc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lciB1cGxvYWQtZm9ybVwiPlxuICAgICAgICAgICAgPHNiLWR5bmFtaWMtZm9ybSBbY29uZmlnXT1cImZvcm1Db25maWdcIiAoc3RhdHVzQ2hhbmdlcyk9XCJvblN0YXR1c0NoYW5nZXMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZXMpPVwidmFsdWVDaGFuZ2VzKCRldmVudClcIj48L3NiLWR5bmFtaWMtZm9ybT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic2ItbW9kYWwtYWN0aW9ucyBmbGV4LWpjLXNwYWNlLWJldHdlZW4gcC0wXCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJkaXNtaXNzUG9wcyhtb2RhbCk7XCIgY2xhc3M9XCJtci0xMCBzYi1idG4gc2ItYnRuLXByaW1hcnkgc2ItYnRuLW5vcm1hbFwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uYnV0dG9uX2xhYmVscz8uY2FuY2VsX2J0bl9sYWJlbH19PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzYi1idG4gc2ItYnRuLW5vcm1hbCB0ZXh0LWxlZnQgc2ItYnRuLWxvYWRpbmctc3Bpbm5lciBzYi1idG4tcHJpbWFyeVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpbWFnZUZvcm1WYWxpZFwiICAoY2xpY2spPVwidXBsb2FkQW5kVXNlSW1hZ2UobW9kYWwpO1wiIFxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc2ItYnRuLXByaW1hcnknOiBpbWFnZUZvcm1WYWxpZCwgJ3NiLWJ0bi1kaXNhYmxlZCc6ICFpbWFnZUZvcm1WYWxpZH1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1sb2FkaW5nLXNwaW5uZXJcIiAgKm5nSWY9XCJsb2FkaW5nXCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxuICAgICAgICAgICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy51cGxvYWRfdXNlX2J0bl9sYWJlbH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImRpc21pc3NJbWFnZVVwbG9hZE1vZGFsKCk7XCIgY2xhc3M9XCIgc2ItYnRuIHNiLWJ0bi1wcmltYXJ5IHNiLWJ0bi1ub3JtYWxcIj4ge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy5iYWNrX2J0bl9sYWJlbH19PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3N1aS1tb2RhbD5cblxuPCEtLSBVcGxvYWQgdmlkZW8gcG9wIHVwIGNvZGUgaGVyZSAgLS0+XG48c3VpLW1vZGFsIGNsYXNzPVwic2ItbW9kYWwgb3ZlcmZsb3ctbW9kYWxcIiBbaXNDbG9zYWJsZV09XCJpc0Nsb3NhYmxlXCIgW2lzSW52ZXJ0ZWRdPVwiZmFsc2VcIlxuICAoZGlzbWlzc2VkKT1cImRpc21pc3NWaWRlb1VwbG9hZE1vZGFsKClcIiAqbmdJZj1cInNob3dWaWRlb1VwbG9hZE1vZGFsXCIgW3NpemVdPVwiJ2xhcmdlJ1wiIFtpc0Z1bGxTY3JlZW5dPVwiZmFsc2VcIlxuICBbbXVzdFNjcm9sbF09XCJ0cnVlXCIgYXBwQm9keVNjcm9sbCAjbW9kYWw+XG4gIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1oZWFkZXJcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8udXBsb2FkQW5kVXNlfX08L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInAtMTAgc2ItYmctd2hpdGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidy01MFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiPlxuICAgICAgICAgIDxoNiBjbGFzcz1cIm1iLTggZnMtbm9ybWFsXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmNob29zZU9yRHJhZ1ZpZGVvfX08c3BhbiBjbGFzcz1cInJlZFwiPio8L3NwYW4+PC9oNj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidXBsb2FkLWltYWdlLW1vZGFsLXNlY3Rpb24gZC1mbGV4IGZsZXgtYWktY2VudGVyIGZsZXgtamMtY2VudGVyIGZsZXgtZGNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ1cGxvYWQtaW5wdXQtYnV0dG9uIHNiLWJ0biBzYi1idG4tc3VjY2VzcyBzYi1idG4tbm9ybWFsXCI+XG4gICAgICAgICAgICAgICAgIHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uYnV0dG9uX2xhYmVscz8udXBsb2FkX2Zyb21fY29tcHV0ZXJfYnRuX2xhYmVsfX1cbiAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJ1cGxvYWRWaWRlb0Zyb21Mb2NhbCgkZXZlbnQpXCIgdHlwZT1cImZpbGVcIiBbYWNjZXB0XT1cImFjY2VwdFZpZGVvVHlwZVwiIG5hbWU9XCJhc3NldGZpbGVcIj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweS0xMCBmcy0wLTc4NSBzYi1jb2xvci1wcmltYXJ5XCIgKm5nSWY9XCJpbWFnZVVwbG9hZExvYWRlclwiPiB7e3ZpZGVvRmlsZT8ubmFtZX19IDwvZGl2PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZzbWFsbCBtdC04XCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LnVwbG9hZH19IHt7YXNzZXRDb25maWcudmlkZW8uYWNjZXB0ZWR9fSAoe3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/Lm1heEZpbGVTaXplfX1cbiAgICAgICAgICAgICAgICB7e2Fzc2V0Q29uZmlnLnZpZGVvLnNpemV9fXt7YXNzZXRDb25maWcudmlkZW8uc2l6ZVR5cGV9fSk8L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93RXJyb3JNc2dcIiBjbGFzcz1cInNiLWNvbG9yLWVycm9yIGZzbWFsbCBtdC04XCI+XG4gICAgICAgICAgICAgICAgPHA+e3tlcnJvck1zZ319PC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aSBpbmZvIG1lc3NhZ2Ugc2ItaW5mby1ieFwiPlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdFwiPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJmcy0wNzg1XCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmFsbG93ZWRGaWxlVHlwZXN9fSB7e2Fzc2V0Q29uZmlnLnZpZGVvLmFjY2VwdGVkfX08L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJmcy0wNzg1XCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/Lm1heGltdW1BbGxvd2VkRmlsZVNpemV9fSB7e2Fzc2V0Q29uZmlnLnZpZGVvLnNpemV9fXt7YXNzZXRDb25maWcudmlkZW8uc2l6ZVR5cGV9fTwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxoNiBjbGFzcz1cImZzLTA3ODVcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uY29weVJpZ2h0c0FuZExpY2Vuc2V9fTxzcGFuIGNsYXNzPVwicmVkXCI+Kjwvc3Bhbj48L2g2PlxuICAgICAgICAgIDxwIGNsYXNzPVwiZnNtYWxsIG10LTggdGVybXMtYW5kLWNvbmRpdGlvblwiPnt7dGVybXNBbmRDb25kaXRpb259fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3LTUwIHBsLTEwIG1sLTEwIGItYmxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInVpIGluZm8gbWVzc2FnZSBzYi1pbmZvLWJ4IG1iLTBcIj5cbiAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0XCI+XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJmcy0wNzg1IGZvbnQtd2VpZ2h0LWJvbGRcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29uIGluZm8gY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uZHJvcENob29zZUZpbGV9fTwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYi1mb3JtLWZpZWxkc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lciB1cGxvYWQtZm9ybVwiPlxuICAgICAgICAgICAgPHNiLWR5bmFtaWMtZm9ybSBbY29uZmlnXT1cImZvcm1Db25maWdcIiAoc3RhdHVzQ2hhbmdlcyk9XCJvblN0YXR1c0NoYW5nZXMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZXMpPVwidmFsdWVDaGFuZ2VzKCRldmVudClcIj48L3NiLWR5bmFtaWMtZm9ybT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic2ItbW9kYWwtYWN0aW9ucyBmbGV4LWpjLXNwYWNlLWJldHdlZW4gcC0wXCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJkaXNtaXNzVmlkZW9Qb3BzKG1vZGFsKTtcIiBjbGFzcz1cIm1yLTEwIHNiLWJ0biBzYi1idG4tcHJpbWFyeSBzYi1idG4tbm9ybWFsXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy5jYW5jZWxfYnRuX2xhYmVsfX08L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNiLWJ0biBzYi1idG4tbm9ybWFsIHRleHQtbGVmdCBzYi1idG4tbG9hZGluZy1zcGlubmVyIHNiLWJ0bi1wcmltYXJ5XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWltYWdlRm9ybVZhbGlkXCIgIChjbGljayk9XCJ1cGxvYWRWaWRlbyhtb2RhbCk7XCIgXG4gICAgICAgICAgW25nQ2xhc3NdPVwieydzYi1idG4tcHJpbWFyeSc6IGltYWdlRm9ybVZhbGlkLCAnc2ItYnRuLWRpc2FibGVkJzogIWltYWdlRm9ybVZhbGlkfVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiLWxvYWRpbmctc3Bpbm5lclwiICAqbmdJZj1cImxvYWRpbmdcIiByb2xlPVwic3RhdHVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9kaXY+XG4gICAgICAgICAgIHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy51cGxvYWRBbmRVc2V9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJkaXNtaXNzVmlkZW9VcGxvYWRNb2RhbCgpO1wiIGNsYXNzPVwiIHNiLWJ0biBzYi1idG4tcHJpbWFyeSBzYi1idG4tbm9ybWFsXCI+IHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uYnV0dG9uX2xhYmVscz8uYmFja19idG5fbGFiZWx9fTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9zdWktbW9kYWw+Il19