@testgorilla/tgo-ui 2.24.20 → 2.24.21

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 (154) hide show
  1. package/components/datepicker/datepicker.component.d.ts +1 -1
  2. package/components/gaussian-chart/gaussian-chart.component.d.ts +75 -0
  3. package/components/gaussian-chart/gaussian-chart.module.d.ts +13 -0
  4. package/components/table/table.component.d.ts +5 -3
  5. package/components/table/table.model.d.ts +2 -1
  6. package/esm2022/assets/i18n/en.json +24 -7
  7. package/esm2022/components/accordion/accordion.component.mjs +4 -4
  8. package/esm2022/components/accordion/accordion.component.module.mjs +5 -5
  9. package/esm2022/components/alert-banner/alert-banner.component.mjs +4 -4
  10. package/esm2022/components/alert-banner/alert-banner.component.module.mjs +5 -5
  11. package/esm2022/components/autocomplete/autocomplete.component.mjs +4 -4
  12. package/esm2022/components/autocomplete/autocomplete.component.module.mjs +5 -5
  13. package/esm2022/components/autocomplete/includes.pipe.mjs +4 -4
  14. package/esm2022/components/autocomplete/prevent-input.directive.mjs +4 -4
  15. package/esm2022/components/autocomplete/transform-Item.pipe.mjs +4 -4
  16. package/esm2022/components/avatar/avatar.component.mjs +4 -4
  17. package/esm2022/components/avatar/avatar.component.module.mjs +5 -5
  18. package/esm2022/components/badge/badge.component.mjs +4 -4
  19. package/esm2022/components/badge/badge.component.module.mjs +5 -5
  20. package/esm2022/components/button/button.component.mjs +4 -4
  21. package/esm2022/components/button/button.component.module.mjs +5 -5
  22. package/esm2022/components/card/card.component.mjs +4 -4
  23. package/esm2022/components/card/card.component.module.mjs +5 -5
  24. package/esm2022/components/checkbox/checkbox.component.mjs +4 -4
  25. package/esm2022/components/checkbox/checkbox.component.module.mjs +5 -5
  26. package/esm2022/components/checkbox/focus-visible.directive.mjs +4 -4
  27. package/esm2022/components/checklist/checklist.component.mjs +4 -4
  28. package/esm2022/components/confirm-dialog/confirm-dialog.component.mjs +4 -4
  29. package/esm2022/components/confirm-dialog/confirm-dialog.component.module.mjs +5 -5
  30. package/esm2022/components/datepicker/date-adapter.mjs +30 -0
  31. package/esm2022/components/datepicker/datepicker.component.mjs +8 -10
  32. package/esm2022/components/datepicker/datepicker.component.module.mjs +5 -5
  33. package/esm2022/components/datepicker/datepicker.service.mjs +4 -4
  34. package/esm2022/components/datepicker/no-date-format.directive.mjs +7 -7
  35. package/esm2022/components/deprecated-paginator/deprecated-paginator.component.mjs +4 -4
  36. package/esm2022/components/deprecated-paginator/deprecated-paginator.component.module.mjs +5 -5
  37. package/esm2022/components/deprecated-table/deprecated-table.component.mjs +4 -4
  38. package/esm2022/components/deprecated-table/deprecated-table.component.module.mjs +5 -5
  39. package/esm2022/components/deprecated-table/directives/dynamic-component.directive.mjs +4 -4
  40. package/esm2022/components/dialog/dialog.component.mjs +4 -4
  41. package/esm2022/components/dialog/dialog.component.module.mjs +5 -5
  42. package/esm2022/components/dialog/dialog.service.mjs +4 -4
  43. package/esm2022/components/divider/divider.component.mjs +4 -4
  44. package/esm2022/components/divider/divider.component.module.mjs +5 -5
  45. package/esm2022/components/dropdown/dropdown.component.mjs +10 -8
  46. package/esm2022/components/dropdown/dropdown.component.module.mjs +5 -5
  47. package/esm2022/components/elevation-shadow/elevation-shadow.component.mjs +4 -4
  48. package/esm2022/components/elevation-shadow/elevation-shadow.component.module.mjs +5 -5
  49. package/esm2022/components/empty-state/empty-state.component.mjs +4 -4
  50. package/esm2022/components/empty-state/empty-state.component.module.mjs +5 -5
  51. package/esm2022/components/field/field.component.mjs +4 -4
  52. package/esm2022/components/field/field.component.module.mjs +5 -5
  53. package/esm2022/components/file-upload/file-upload.component.mjs +4 -4
  54. package/esm2022/components/file-upload/file-upload.component.module.mjs +5 -5
  55. package/esm2022/components/gaussian-chart/gaussian-chart.component.mjs +246 -0
  56. package/esm2022/components/gaussian-chart/gaussian-chart.module.mjs +42 -0
  57. package/esm2022/components/icon/icon.component.mjs +5 -5
  58. package/esm2022/components/icon/icon.component.module.mjs +5 -5
  59. package/esm2022/components/icon-label/icon-label.component.mjs +4 -4
  60. package/esm2022/components/icon-label/icon-label.component.module.mjs +5 -5
  61. package/esm2022/components/logo/logo.component.mjs +4 -4
  62. package/esm2022/components/logo/logo.component.module.mjs +5 -5
  63. package/esm2022/components/media-card/media-card.component.mjs +4 -4
  64. package/esm2022/components/multi-input/multi-input.component.mjs +4 -4
  65. package/esm2022/components/multi-input/multi-input.component.module.mjs +5 -5
  66. package/esm2022/components/navbar/mobile-navbar-side-sheet/mobile-navbar-side-sheet.component.mjs +4 -4
  67. package/esm2022/components/navbar/navbar.component.mjs +4 -4
  68. package/esm2022/components/navbar/navbar.component.module.mjs +5 -5
  69. package/esm2022/components/overflow-menu/overflow-menu.component.mjs +4 -4
  70. package/esm2022/components/overflow-menu/overflow-menu.component.module.mjs +5 -5
  71. package/esm2022/components/page-header/page-header.component.mjs +4 -4
  72. package/esm2022/components/page-header/page-header.component.module.mjs +5 -5
  73. package/esm2022/components/paginator/paginator.component.mjs +4 -4
  74. package/esm2022/components/paginator/paginator.component.module.mjs +5 -5
  75. package/esm2022/components/password-criteria/password.component.mjs +4 -4
  76. package/esm2022/components/password-criteria/password.component.module.mjs +5 -5
  77. package/esm2022/components/password-strength/password-strength.component.mjs +4 -4
  78. package/esm2022/components/password-strength/password-strength.component.module.mjs +5 -5
  79. package/esm2022/components/phone-input/join-strings.pipe.mjs +4 -4
  80. package/esm2022/components/phone-input/phone-input.component.mjs +4 -4
  81. package/esm2022/components/phone-input/phone-input.component.module.mjs +5 -5
  82. package/esm2022/components/progress-bar/progress-bar.component.mjs +4 -4
  83. package/esm2022/components/progress-bar/progress-bar.component.module.mjs +5 -5
  84. package/esm2022/components/radial-progress/radial-progress.component.mjs +4 -4
  85. package/esm2022/components/radial-progress/radial-progress.component.module.mjs +5 -5
  86. package/esm2022/components/radio-button/radio-button.component.mjs +4 -4
  87. package/esm2022/components/radio-button/radio-button.component.module.mjs +5 -5
  88. package/esm2022/components/rating/half-star.pipe.mjs +4 -4
  89. package/esm2022/components/rating/rating.component.mjs +4 -4
  90. package/esm2022/components/rating/rating.component.module.mjs +5 -5
  91. package/esm2022/components/scale/scale.component.mjs +5 -5
  92. package/esm2022/components/scale/scale.component.module.mjs +5 -5
  93. package/esm2022/components/segmented-bar/segmented-bar.component.mjs +4 -4
  94. package/esm2022/components/segmented-bar/segmented-bar.component.module.mjs +5 -5
  95. package/esm2022/components/segmented-button/segmented-button.component.mjs +4 -4
  96. package/esm2022/components/segmented-button/segmented-button.component.module.mjs +5 -5
  97. package/esm2022/components/side-panel/side-panel.component.mjs +4 -4
  98. package/esm2022/components/side-panel/side-panel.service.mjs +4 -4
  99. package/esm2022/components/side-sheet/side-sheet.component.mjs +4 -4
  100. package/esm2022/components/side-sheet/side-sheet.component.module.mjs +5 -5
  101. package/esm2022/components/side-sheet/side-sheet.service.mjs +4 -4
  102. package/esm2022/components/skeleton/skeleton.component.mjs +4 -4
  103. package/esm2022/components/slider/slider.component.mjs +4 -4
  104. package/esm2022/components/slider/slider.component.module.mjs +5 -5
  105. package/esm2022/components/snackbar/snackbar.component.mjs +4 -4
  106. package/esm2022/components/snackbar/snackbar.component.module.mjs +5 -5
  107. package/esm2022/components/snackbar/snackbar.service.mjs +4 -4
  108. package/esm2022/components/spider-chart/spider-chart.component.mjs +4 -4
  109. package/esm2022/components/spider-chart/spider-chart.module.mjs +5 -5
  110. package/esm2022/components/spinner/spinner.component.mjs +4 -4
  111. package/esm2022/components/spinner/spinner.module.mjs +5 -5
  112. package/esm2022/components/step/step.component.mjs +4 -4
  113. package/esm2022/components/step/step.component.module.mjs +5 -5
  114. package/esm2022/components/stepper/stepper.component.mjs +4 -4
  115. package/esm2022/components/stepper/stepper.component.module.mjs +5 -5
  116. package/esm2022/components/table/sentence-case.pipe.mjs +4 -4
  117. package/esm2022/components/table/table.component.mjs +45 -33
  118. package/esm2022/components/table/table.component.module.mjs +5 -5
  119. package/esm2022/components/table/table.model.mjs +1 -1
  120. package/esm2022/components/tabs/tab.directive.mjs +4 -4
  121. package/esm2022/components/tabs/tabs.component.mjs +4 -4
  122. package/esm2022/components/tabs/tabs.component.module.mjs +5 -5
  123. package/esm2022/components/tag/tag.component.mjs +4 -4
  124. package/esm2022/components/tag/tag.component.module.mjs +5 -5
  125. package/esm2022/components/toggle/toggle.component.mjs +4 -4
  126. package/esm2022/components/toggle/toggle.component.module.mjs +5 -5
  127. package/esm2022/components/tooltip/tooltip-template.directive.mjs +14 -12
  128. package/esm2022/components/tooltip/tooltip.component.mjs +4 -4
  129. package/esm2022/components/tooltip/tooltip.component.module.mjs +5 -5
  130. package/esm2022/components/universal-skills-report/universal-skills-report.component.mjs +18 -18
  131. package/esm2022/components/universal-skills-report/universal-skills-report.component.module.mjs +5 -5
  132. package/esm2022/components/validation-error/validation-error.component.mjs +4 -4
  133. package/esm2022/components/validation-error/validation-error.module.mjs +5 -5
  134. package/esm2022/directives/digits-only.directive.mjs +4 -4
  135. package/esm2022/directives/drag-drop.directive.mjs +4 -4
  136. package/esm2022/directives/ellipse-text.directive.mjs +4 -4
  137. package/esm2022/directives/select-text.directive.mjs +4 -4
  138. package/esm2022/directives/step-line-element.directive.mjs +4 -4
  139. package/esm2022/pipes/data-property-getter.mjs +4 -4
  140. package/esm2022/pipes/has-validation-error.pipe.mjs +4 -4
  141. package/esm2022/pipes/memoize-func.pipe.mjs +4 -4
  142. package/esm2022/pipes/name-initials.pipe.mjs +4 -4
  143. package/esm2022/pipes/ui-ordinal-suffix.pipe.mjs +4 -4
  144. package/esm2022/pipes/ui-translate.pipe.mjs +4 -4
  145. package/esm2022/public-api.mjs +4 -1
  146. package/esm2022/services/icons.service.mjs +4 -4
  147. package/esm2022/utils/localization/language.service.mjs +4 -4
  148. package/fesm2022/testgorilla-tgo-ui.mjs +832 -530
  149. package/fesm2022/testgorilla-tgo-ui.mjs.map +1 -1
  150. package/package.json +2 -1
  151. package/projects/tgo-canopy-ui/assets/i18n/en.json +24 -7
  152. package/public-api.d.ts +2 -0
  153. package/esm2022/components/datepicker/DateAdapter.mjs +0 -30
  154. /package/components/datepicker/{DateAdapter.d.ts → date-adapter.d.ts} +0 -0
@@ -600,10 +600,10 @@ export class AutocompleteComponent {
600
600
  }
601
601
  this.matAutocomplete._setScrollTop(this.matAutocomplete._keyManager.activeItemIndex * optionHeight);
602
602
  }
603
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: AutocompleteComponent, deps: [{ token: 'CANOPYUI_DEFAULT_APPLICATION_THEME', optional: true }, { token: i0.ChangeDetectorRef }, { token: i1.DomSanitizer }, { token: i2.NgControl, optional: true, self: true }, { token: PLATFORM_ID }, { token: i0.ElementRef }, { token: i3.FocusMonitor }, { token: i0.DestroyRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
604
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.7", type: AutocompleteComponent, selector: "ui-autocomplete", inputs: { itemsList: "itemsList", suggestionsList: "suggestionsList", disabled: "disabled", allowAdd: "allowAdd", textField: "textField", valueField: "valueField", label: "label", placeholder: "placeholder", itemValue: "itemValue", type: "type", minCharactersSearch: "minCharactersSearch", variant: "variant", showBottomContent: "showBottomContent", valuePrimitive: "valuePrimitive", fullWidth: "fullWidth", applicationTheme: "applicationTheme", required: "required", errors: "errors", companyColor: "companyColor", hideBuiltInErrors: "hideBuiltInErrors", hideLabelInErrors: "hideLabelInErrors", virtualScroll: ["virtualScroll", "virtualScroll", booleanAttribute], compareWith: "compareWith", dropdownPanelClass: "dropdownPanelClass", closeOnScroll: "closeOnScroll", size: "size", allowUserInput: "allowUserInput", clearable: "clearable", exactMatchSelect: "exactMatchSelect", maxItemSelected: "maxItemSelected" }, outputs: { selectionChange: "selectionChange", searchTextChange: "searchTextChange", blur: "blur", focus: "focus" }, host: { properties: { "class.full-width": "this.fullWidth", "attr.theme": "this.applicationTheme" } }, viewQueries: [{ propertyName: "formFieldElement", first: true, predicate: ["formField"], descendants: true }, { propertyName: "tagContainer", first: true, predicate: ["tagContainer"], descendants: true }, { propertyName: "autocomplete", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "cdkVirtualScrollViewPort", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "matAutocomplete", first: true, predicate: ["autocomplete"], descendants: true }, { propertyName: "matInput", first: true, predicate: ["matInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container>\n <div class=\"autocomplete-wrapper\" [ngClass]=\"{ 'full-width': fullWidth, disabled: disabled }\">\n <mat-form-field\n [color]=\"(safeErrors.length || (ngControl?.errors && ngControl?.touched ) || (AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && inputValue) ) ? 'warn' : 'accent'\"\n [appearance]=\"'outline'\"\n [ngClass]=\"{ 'large-size': type === autocompleteType.LARGE, 'hide-bottom-content': !showBottomContent, 'keyboard-focused': keyboardFocused(), 'has-label': !!label }\"\n >\n <mat-label *ngIf=\"label\">{{ label }} <span *ngIf=\"required\">*</span></mat-label>\n <div #formField class=\"input-container\">\n <span style=\"position: absolute; left: -9999px\" *ngIf=\"textField ? value?.[textField] : value === inputValue\" aria-live=\"polite\">{{ (('SELECTED') | uiTranslate | async) + ' ' + inputValue }}</span>\n\n <input\n #trigger=\"matAutocompleteTrigger\"\n #matInput\n [uiPreventInput]=\"!allowUserInput\"\n [disabled]=\"disabled\"\n [ngClass]=\"{ 'unset-margin': this.value && type === autocompleteType.LARGE, 'no-caret': !allowUserInput }\"\n (blur)=\"refillInput()\"\n (focusin)=\"onFocus()\"\n [attr.aria-label]=\"((translationContext + 'SELECTED') | uiTranslate | async) + ' ' + (value | transformItem: textField : true)\"\n [style.opacity]=\"type === autocompleteType.MULTI ? inputOpacity : 1\"\n matInput\n [placeholder]=\"value && value.length ? '': placeholder\"\n [type]=\"'text'\"\n [matAutocomplete]=\"autocomplete\"\n (input)=\"onInputChange($event)\"\n [(ngModel)]=\"inputValue\"\n />\n <div\n class=\"selected-items\"\n #tagContainer\n *ngIf=\"\n (type === autocompleteType.LARGE && this.value) ||\n (!(inputValue && this.isInputFocus) && this.value && type !== autocompleteType.SINGLE)\n \"\n >\n <ui-tag\n class=\"value-tag\"\n [id]=\"'ui-tag-' + i\"\n *ngFor=\"let valueItem of value; let i = index\"\n [label]=\"valueItem | transformItem: textField\"\n [allowClose]=\"true\"\n [applicationTheme]=\"applicationTheme\"\n [style.opacity]=\"type === autocompleteType.MULTI ? inputOpacity : 1\"\n [style.display]=\"(isOverLapping && i > 0 && i >= overlapIndex) || (size === 'small' && value.length > 1) ? 'none' : 'block'\"\n [ngStyle]=\"{ '--tag-max-width': type === autocompleteType.LARGE ? 'fit-content' : firstTagMaxWidth + 'px' }\"\n [ngClass]=\"{\n 'overlap-tag': isOverlapChecking && overlapIndex && i >= overlapIndex && type === autocompleteType.MULTI\n }\"\n (close)=\"onOptionRemoved(valueItem)\"\n ></ui-tag>\n @if (size === 'small') {\n <div class=\"selected-count\" *ngIf=\"value.length > 1\">\n {{ (translationContext + 'SELECTED_AMOUNT' | uiTranslate : { numberSelected: (value | slice: overlapIndex).length }) | async }}\n </div>\n } @else {\n <div *ngIf=\"value.length > 1 && isOverLapping\" class=\"overlap-count\">\n <ui-tag [applicationTheme]=\"applicationTheme\"\n [label]=\"'+' + (value.length - overlapIndex)\"></ui-tag>\n </div>\n }\n </div>\n </div>\n\n <ui-icon\n *ngIf=\"clearable && (type === autocompleteType.SINGLE && (value?.length || hasObjectValue)) || (type !== autocompleteType.SINGLE && value && value.length > 1 && ((AutocompleteUtils.isPrimitive(value) && value.length) || (!AutocompleteUtils.isPrimitive(value) && (AutocompleteUtils.isArray(value) && value.length || !AutocompleteUtils.isArray(value) && !value.length))))\"\n class=\"remove-selected\"\n [tabIndex]=\"disabled ? -1 : 0\"\n (keydown.enter)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\n (keydown.space)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\n [ngClass]=\"{ 'large-input-icon': type === autocompleteType.LARGE }\"\n (click)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\n [size]=\"'24'\"\n [color]=\"applicationTheme === 'classic' ? 'inherit' : 'rebrand-black'\"\n [attr.aria-label]=\"('COMMON.CLEAR') | uiTranslate | async\"\n [name]=\"applicationTheme === 'classic' ? 'Close' : 'Close-in-line'\"\n ></ui-icon>\n\n <ui-icon\n class=\"arrow-state\"\n [ngClass]=\"{ opened: autocomplete.isOpen, 'large-input-icon': type === autocompleteType.LARGE }\"\n *ngIf=\"isDropdown\"\n [size]=\"'24'\"\n [name]=\"applicationTheme !== 'classic' ? 'Arrow-chevron-down-in-line' : 'Arrow_down'\"\n (click)=\"onChevronClick(autocomplete)\"\n ></ui-icon>\n\n\n <mat-autocomplete\n #autocomplete\n [class]=\"applicationTheme + ' ' + dropdownPanelClass\"\n (optionSelected)=\"onOptionSelected($event)\"\n [disableRipple]=\"applicationTheme !== 'classic'\"\n [hideSingleSelectionIndicator]=\"false\"\n (opened)=\"gotoUp()\"\n >\n @if (type !== autocompleteType.MULTI || value?.length < maxItemSelected) {\n <ng-container *ngIf=\"!(searchResult$ | async)\">\n <ng-container *ngIf=\"!isDropdown; else dropdownList\">\n <mat-optgroup [label]=\"((translationContext + 'SUGGESTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"suggestionsList.length\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': suggested | includes: value : valueField }\"\n *ngFor=\"let suggested of suggestionsList\"\n [value]=\"suggested\"\n >\n <span [selectText]=\"userInput$ | async\">{{ suggested | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n <mat-optgroup [label]=\"((translationContext + 'SELECTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"value?.length && type !== autocompleteType.SINGLE\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of value\"\n [value]=\"item\"\n >\n <span>{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n <mat-optgroup [label]=\"((translationContext + 'SELECTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"value?.length && type === autocompleteType.SINGLE\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [class]=\"'selected-option'\"\n [value]=\"value\"\n >\n <span [selectText]=\"userInput$ | async\">{{ value | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n </ng-container>\n\n <ng-template #dropdownList>\n <cdk-virtual-scroll-viewport *ngIf=\"virtualScroll; else defaultViewPort\" [itemSize]=\"48\"\n [style.height]=\"'200px'\" class=\"virtual-scroll\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *cdkVirtualFor=\"let item of itemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </cdk-virtual-scroll-viewport>\n\n <ng-template #defaultViewPort>\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of itemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </ng-template>\n\n </ng-template>\n\n </ng-container>\n\n <ng-container *ngIf=\"filteredSuggestionList$ | async as filteredSuggestionList\">\n <ng-container *ngIf=\"filteredItemsList$ | async as filteredItemsList\">\n <mat-optgroup [label]=\"((translationContext + 'SUGGESTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"filteredSuggestionList.length\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of filteredSuggestionList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n <ng-container *ngIf=\"!filteredSuggestionList.length; else showItemListWithGroup\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of filteredItemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </ng-container>\n\n <ng-template #showItemListWithGroup>\n <mat-optgroup [label]=\"((translationContext + 'ALL_ITEMS') | uiTranslate | async)! | uppercase\"\n *ngIf=\"filteredItemsList.length\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of filteredItemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n </ng-template>\n\n <ng-container *ngIf=\"!filteredItemsList.length && !filteredSuggestionList.length && inputValue\">\n <ng-container *ngIf=\"allowAdd; else notFound\">\n <mat-option (mousedown)=$event.preventDefault() [value]=\"inputValue\">\n <span>{{ ('COMMON.ADD') | uiTranslate | async }}</span>\n <span class=\"add-suggestion\">\"{{ inputValue }}\"</span>\n </mat-option>\n </ng-container>\n\n <ng-template #notFound>\n <mat-option [style.pointer-events]=\"'none'\">\n <span>{{ (translationContext + 'NO_RESULTS_FOUND') | uiTranslate | async }}</span>\n </mat-option>\n </ng-template>\n </ng-container>\n </ng-container>\n </ng-container>\n }\n </mat-autocomplete>\n <mat-hint class=\"error\" *ngIf=\"safeErrors.length || (ngControl?.errors | hasValidationError) || (AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && inputValue)\">\n <div class=\"errors\" *ngIf=\"(AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && inputValue)\">\n <ui-icon [applicationTheme]=\"applicationTheme\" [name]=\"'Error'\"></ui-icon>\n <span>{{ (translationContext + 'MAX_SELECTED_ERROR') | uiTranslate : { max: maxItemSelected } | async }}</span>\n </div>\n <ng-container *ngIf=\"safeErrors.length\">\n <div class=\"errors\" *ngFor=\"let error of safeErrors; trackBy: trackByFn\">\n <ui-icon [applicationTheme]=\"applicationTheme\" [name]=\"'Error'\"></ui-icon>\n <span [innerHTML]=\"error\"></span>\n </div>\n </ng-container>\n <ui-validation-error *ngIf=\"ngControl && !hideBuiltInErrors\" [ngControl]=\"ngControl\"\n [label]=\"hideLabelInErrors ? null : label\"></ui-validation-error>\n\n </mat-hint>\n </mat-form-field>\n </div>\n</ng-container>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}:host{width:320px;display:block}:host.full-width{width:100%}:host ui-tag{height:32px;margin:4px}:host ui-tag ::ng-deep .tag-container{margin:0!important}:host ui-tag ::ng-deep .tag-wrapper{max-width:fit-content}.large-size input{margin:10px 0}.large-size .selected-items{margin:5px 0;flex-wrap:wrap}.large-size .input-container{display:flex;flex-direction:column-reverse}.large-size ::ng-deep .mat-mdc-form-field-infix,.large-size .mat-mdc-form-field-flex{align-items:unset!important}.disabled{opacity:.5}.disabled *{pointer-events:none}.input-container{width:100%;margin:auto;display:flex;flex-direction:row-reverse}.input-container .selected-items{display:flex;padding-left:4px}.input-container .selected-items .selected-count{white-space:nowrap}.input-container .selected-items .value-tag{max-width:var(--tag-max-width)}.input-container .selected-items .value-tag ::ng-deep .tag-container{max-width:var(--tag-max-width)}.input-container .selected-items .overlap-count{font-size:14px;line-height:20px}.input-container .selected-items .overlap-count ui-tag{display:block}.input-container .selected-items .overlap-tag{position:absolute;opacity:0}.input-container input{margin-left:6px}.input-container input.unset-margin{margin-top:unset}.input-container input.no-caret{cursor:pointer;caret-color:transparent!important}.add-suggestion{margin:0 5px;color:#000;font-weight:700}.remove-selected{cursor:pointer;margin-right:2px;border-radius:50px;height:fit-content}.remove-selected.large-input-icon{margin-top:10px}.arrow-state{height:24px;cursor:pointer}.arrow-state.large-input-icon{margin-top:10px}.arrow-state.opened{transform:rotateX(180deg)}::ng-deep .autocomplete-wrapper .mat-mdc-form-field{width:100%}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error,::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error svg{color:#cb7b7a}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{display:flex}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{display:flex;flex-flow:column;row-gap:4px}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error .errors{display:flex}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error .errors ui-icon{margin-right:8px}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{color:#e02800!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error svg{color:#e02800!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-bottom-align:before{height:0}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint-wrapper{padding:0 0 12px;font-size:12px;line-height:16px;position:relative}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint-wrapper .mat-form-field-hint-spacer{display:none}::ng-deep .autocomplete-wrapper .mat-mdc-form-field.hide-bottom-content .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{top:28px!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:22px!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper{padding-left:12px!important;height:unset!important;max-height:unset!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{color:#276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__notch{border-bottom:2px solid #276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__leading{border-left:2px solid #276678!important;border-bottom:2px solid #276678!important;border-top:2px solid #276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__trailing{border:2px solid #276678!important;border-left:unset!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-infix,::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-flex{min-height:48px!important;max-height:184px!important;overflow-y:auto;overflow-x:hidden;padding:0!important;display:flex;justify-content:center;text-align:center;align-items:center;flex-direction:row;width:100%}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-line-ripple{display:none!important}::ng-deep .mat-mdc-autocomplete-panel{box-shadow:0 8px 24px 4px #00000014;max-height:312px!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option:hover:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option:focus:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mat-mdc-option-active,::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mdc-list-item--selected:not(.mat-mdc-option-multiple):not(.mdc-list-item--disabled){background:#e9f0f1!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option{padding-right:32px;padding-left:12px!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option ui-icon{display:none;position:absolute;right:0;bottom:calc(50% - 8px);margin:0 10px}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.selected-option{background:#e9f0f1}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.selected-option ui-icon{display:block}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mdc-list-item--selected .mdc-list-item__primary-text,::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option .mdc-list-item--activated .mdc-list-item__primary-text{color:#000!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option .mat-pseudo-checkbox{display:none}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-optgroup .mat-mdc-optgroup-label{font-weight:700!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-optgroup .mdc-list-item__primary-text{color:#000;font-size:12px;line-height:16px;font-weight:700}.active-field .mdc-notched-outline__leading{border-left-width:2px;border-top-width:2px;border-bottom-width:2px}.active-field .mdc-notched-outline__notch{border-top-width:2px;border-bottom-width:2px}.active-field .mdc-notched-outline__trailing{border-top-width:2px;border-bottom-width:2px;border-right-width:2px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i7.MatOptgroup, selector: "mat-optgroup", inputs: ["disabled"], exportAs: ["matOptgroup"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i9.TagComponent, selector: "ui-tag", inputs: ["label", "icon", "allowClose", "readOnly", "isSelected", "showIconWhenSelected", "isDisabled", "applicationTheme", "ariaLabel", "ariaRequired"], outputs: ["close", "press"] }, { kind: "component", type: i10.IconComponent, selector: "ui-icon", inputs: ["size", "cssClass", "name", "color", "filled", "applicationTheme", "useFullIconName"] }, { kind: "component", type: i11.ValidationErrorComponent, selector: "ui-validation-error", inputs: ["ngControl", "touchedOn", "errorMessage", "label", "applicationTheme"] }, { kind: "directive", type: i12.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i12.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i12.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i13.PreventInputDirective, selector: "[uiPreventInput]", inputs: ["uiPreventInput"] }, { kind: "directive", type: i14.SelectTextDirective, selector: "[selectText]", inputs: ["selectText"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i4.SlicePipe, name: "slice" }, { kind: "pipe", type: i15.UiTranslatePipe, name: "uiTranslate" }, { kind: "pipe", type: i16.HasValidationErrorPipe, name: "hasValidationError" }, { kind: "pipe", type: i17.TransformItemPipe, name: "transformItem" }, { kind: "pipe", type: i18.IncludesPipe, name: "includes" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
603
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AutocompleteComponent, deps: [{ token: 'CANOPYUI_DEFAULT_APPLICATION_THEME', optional: true }, { token: i0.ChangeDetectorRef }, { token: i1.DomSanitizer }, { token: i2.NgControl, optional: true, self: true }, { token: PLATFORM_ID }, { token: i0.ElementRef }, { token: i3.FocusMonitor }, { token: i0.DestroyRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
604
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AutocompleteComponent, selector: "ui-autocomplete", inputs: { itemsList: "itemsList", suggestionsList: "suggestionsList", disabled: "disabled", allowAdd: "allowAdd", textField: "textField", valueField: "valueField", label: "label", placeholder: "placeholder", itemValue: "itemValue", type: "type", minCharactersSearch: "minCharactersSearch", variant: "variant", showBottomContent: "showBottomContent", valuePrimitive: "valuePrimitive", fullWidth: "fullWidth", applicationTheme: "applicationTheme", required: "required", errors: "errors", companyColor: "companyColor", hideBuiltInErrors: "hideBuiltInErrors", hideLabelInErrors: "hideLabelInErrors", virtualScroll: ["virtualScroll", "virtualScroll", booleanAttribute], compareWith: "compareWith", dropdownPanelClass: "dropdownPanelClass", closeOnScroll: "closeOnScroll", size: "size", allowUserInput: "allowUserInput", clearable: "clearable", exactMatchSelect: "exactMatchSelect", maxItemSelected: "maxItemSelected" }, outputs: { selectionChange: "selectionChange", searchTextChange: "searchTextChange", blur: "blur", focus: "focus" }, host: { properties: { "class.full-width": "this.fullWidth", "attr.theme": "this.applicationTheme" } }, viewQueries: [{ propertyName: "formFieldElement", first: true, predicate: ["formField"], descendants: true }, { propertyName: "tagContainer", first: true, predicate: ["tagContainer"], descendants: true }, { propertyName: "autocomplete", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "cdkVirtualScrollViewPort", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "matAutocomplete", first: true, predicate: ["autocomplete"], descendants: true }, { propertyName: "matInput", first: true, predicate: ["matInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container>\n <div class=\"autocomplete-wrapper\" [ngClass]=\"{ 'full-width': fullWidth, disabled: disabled }\">\n <mat-form-field\n [color]=\"(safeErrors.length || (ngControl?.errors && ngControl?.touched ) || (AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && inputValue) ) ? 'warn' : 'accent'\"\n [appearance]=\"'outline'\"\n [ngClass]=\"{ 'large-size': type === autocompleteType.LARGE, 'hide-bottom-content': !showBottomContent, 'keyboard-focused': keyboardFocused(), 'has-label': !!label }\"\n >\n <mat-label *ngIf=\"label\">{{ label }} <span *ngIf=\"required\">*</span></mat-label>\n <div #formField class=\"input-container\">\n <span style=\"position: absolute; left: -9999px\" *ngIf=\"textField ? value?.[textField] : value === inputValue\" aria-live=\"polite\">{{ (('SELECTED') | uiTranslate | async) + ' ' + inputValue }}</span>\n\n <input\n #trigger=\"matAutocompleteTrigger\"\n #matInput\n [uiPreventInput]=\"!allowUserInput\"\n [disabled]=\"disabled\"\n [ngClass]=\"{ 'unset-margin': this.value && type === autocompleteType.LARGE, 'no-caret': !allowUserInput }\"\n (blur)=\"refillInput()\"\n (focusin)=\"onFocus()\"\n [attr.aria-label]=\"((translationContext + 'SELECTED') | uiTranslate | async) + ' ' + (value | transformItem: textField : true)\"\n [style.opacity]=\"type === autocompleteType.MULTI ? inputOpacity : 1\"\n matInput\n [placeholder]=\"value && value.length ? '': placeholder\"\n [type]=\"'text'\"\n [matAutocomplete]=\"autocomplete\"\n (input)=\"onInputChange($event)\"\n [(ngModel)]=\"inputValue\"\n />\n <div\n class=\"selected-items\"\n #tagContainer\n *ngIf=\"\n (type === autocompleteType.LARGE && this.value) ||\n (!(inputValue && this.isInputFocus) && this.value && type !== autocompleteType.SINGLE)\n \"\n >\n <ui-tag\n class=\"value-tag\"\n [id]=\"'ui-tag-' + i\"\n *ngFor=\"let valueItem of value; let i = index\"\n [label]=\"valueItem | transformItem: textField\"\n [allowClose]=\"true\"\n [applicationTheme]=\"applicationTheme\"\n [style.opacity]=\"type === autocompleteType.MULTI ? inputOpacity : 1\"\n [style.display]=\"(isOverLapping && i > 0 && i >= overlapIndex) || (size === 'small' && value.length > 1) ? 'none' : 'block'\"\n [ngStyle]=\"{ '--tag-max-width': type === autocompleteType.LARGE ? 'fit-content' : firstTagMaxWidth + 'px' }\"\n [ngClass]=\"{\n 'overlap-tag': isOverlapChecking && overlapIndex && i >= overlapIndex && type === autocompleteType.MULTI\n }\"\n (close)=\"onOptionRemoved(valueItem)\"\n ></ui-tag>\n @if (size === 'small') {\n <div class=\"selected-count\" *ngIf=\"value.length > 1\">\n {{ (translationContext + 'SELECTED_AMOUNT' | uiTranslate : { numberSelected: (value | slice: overlapIndex).length }) | async }}\n </div>\n } @else {\n <div *ngIf=\"value.length > 1 && isOverLapping\" class=\"overlap-count\">\n <ui-tag [applicationTheme]=\"applicationTheme\"\n [label]=\"'+' + (value.length - overlapIndex)\"></ui-tag>\n </div>\n }\n </div>\n </div>\n\n <ui-icon\n *ngIf=\"clearable && (type === autocompleteType.SINGLE && (value?.length || hasObjectValue)) || (type !== autocompleteType.SINGLE && value && value.length > 1 && ((AutocompleteUtils.isPrimitive(value) && value.length) || (!AutocompleteUtils.isPrimitive(value) && (AutocompleteUtils.isArray(value) && value.length || !AutocompleteUtils.isArray(value) && !value.length))))\"\n class=\"remove-selected\"\n [tabIndex]=\"disabled ? -1 : 0\"\n (keydown.enter)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\n (keydown.space)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\n [ngClass]=\"{ 'large-input-icon': type === autocompleteType.LARGE }\"\n (click)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\n [size]=\"'24'\"\n [color]=\"applicationTheme === 'classic' ? 'inherit' : 'rebrand-black'\"\n [attr.aria-label]=\"('COMMON.CLEAR') | uiTranslate | async\"\n [name]=\"applicationTheme === 'classic' ? 'Close' : 'Close-in-line'\"\n ></ui-icon>\n\n <ui-icon\n class=\"arrow-state\"\n [ngClass]=\"{ opened: autocomplete.isOpen, 'large-input-icon': type === autocompleteType.LARGE }\"\n *ngIf=\"isDropdown\"\n [size]=\"'24'\"\n [name]=\"applicationTheme !== 'classic' ? 'Arrow-chevron-down-in-line' : 'Arrow_down'\"\n (click)=\"onChevronClick(autocomplete)\"\n ></ui-icon>\n\n\n <mat-autocomplete\n #autocomplete\n [class]=\"applicationTheme + ' ' + dropdownPanelClass\"\n (optionSelected)=\"onOptionSelected($event)\"\n [disableRipple]=\"applicationTheme !== 'classic'\"\n [hideSingleSelectionIndicator]=\"false\"\n (opened)=\"gotoUp()\"\n >\n @if (type !== autocompleteType.MULTI || value?.length < maxItemSelected) {\n <ng-container *ngIf=\"!(searchResult$ | async)\">\n <ng-container *ngIf=\"!isDropdown; else dropdownList\">\n <mat-optgroup [label]=\"((translationContext + 'SUGGESTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"suggestionsList.length\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': suggested | includes: value : valueField }\"\n *ngFor=\"let suggested of suggestionsList\"\n [value]=\"suggested\"\n >\n <span [selectText]=\"userInput$ | async\">{{ suggested | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n <mat-optgroup [label]=\"((translationContext + 'SELECTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"value?.length && type !== autocompleteType.SINGLE\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of value\"\n [value]=\"item\"\n >\n <span>{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n <mat-optgroup [label]=\"((translationContext + 'SELECTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"value?.length && type === autocompleteType.SINGLE\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [class]=\"'selected-option'\"\n [value]=\"value\"\n >\n <span [selectText]=\"userInput$ | async\">{{ value | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n </ng-container>\n\n <ng-template #dropdownList>\n <cdk-virtual-scroll-viewport *ngIf=\"virtualScroll; else defaultViewPort\" [itemSize]=\"48\"\n [style.height]=\"'200px'\" class=\"virtual-scroll\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *cdkVirtualFor=\"let item of itemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </cdk-virtual-scroll-viewport>\n\n <ng-template #defaultViewPort>\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of itemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </ng-template>\n\n </ng-template>\n\n </ng-container>\n\n <ng-container *ngIf=\"filteredSuggestionList$ | async as filteredSuggestionList\">\n <ng-container *ngIf=\"filteredItemsList$ | async as filteredItemsList\">\n <mat-optgroup [label]=\"((translationContext + 'SUGGESTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"filteredSuggestionList.length\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of filteredSuggestionList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n <ng-container *ngIf=\"!filteredSuggestionList.length; else showItemListWithGroup\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of filteredItemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </ng-container>\n\n <ng-template #showItemListWithGroup>\n <mat-optgroup [label]=\"((translationContext + 'ALL_ITEMS') | uiTranslate | async)! | uppercase\"\n *ngIf=\"filteredItemsList.length\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of filteredItemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n </ng-template>\n\n <ng-container *ngIf=\"!filteredItemsList.length && !filteredSuggestionList.length && inputValue\">\n <ng-container *ngIf=\"allowAdd; else notFound\">\n <mat-option (mousedown)=$event.preventDefault() [value]=\"inputValue\">\n <span>{{ ('COMMON.ADD') | uiTranslate | async }}</span>\n <span class=\"add-suggestion\">\"{{ inputValue }}\"</span>\n </mat-option>\n </ng-container>\n\n <ng-template #notFound>\n <mat-option [style.pointer-events]=\"'none'\">\n <span>{{ (translationContext + 'NO_RESULTS_FOUND') | uiTranslate | async }}</span>\n </mat-option>\n </ng-template>\n </ng-container>\n </ng-container>\n </ng-container>\n }\n </mat-autocomplete>\n <mat-hint class=\"error\" *ngIf=\"safeErrors.length || (ngControl?.errors | hasValidationError) || (AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && inputValue)\">\n <div class=\"errors\" *ngIf=\"(AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && inputValue)\">\n <ui-icon [applicationTheme]=\"applicationTheme\" [name]=\"'Error'\"></ui-icon>\n <span>{{ (translationContext + 'MAX_SELECTED_ERROR') | uiTranslate : { max: maxItemSelected } | async }}</span>\n </div>\n <ng-container *ngIf=\"safeErrors.length\">\n <div class=\"errors\" *ngFor=\"let error of safeErrors; trackBy: trackByFn\">\n <ui-icon [applicationTheme]=\"applicationTheme\" [name]=\"'Error'\"></ui-icon>\n <span [innerHTML]=\"error\"></span>\n </div>\n </ng-container>\n <ui-validation-error *ngIf=\"ngControl && !hideBuiltInErrors\" [ngControl]=\"ngControl\"\n [label]=\"hideLabelInErrors ? null : label\"></ui-validation-error>\n\n </mat-hint>\n </mat-form-field>\n </div>\n</ng-container>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}:host{width:320px;display:block}:host.full-width{width:100%}:host ui-tag{height:32px;margin:4px}:host ui-tag ::ng-deep .tag-container{margin:0!important}:host ui-tag ::ng-deep .tag-wrapper{max-width:fit-content}.large-size input{margin:10px 0}.large-size .selected-items{margin:5px 0;flex-wrap:wrap}.large-size .input-container{display:flex;flex-direction:column-reverse}.large-size ::ng-deep .mat-mdc-form-field-infix,.large-size .mat-mdc-form-field-flex{align-items:unset!important}.disabled{opacity:.5}.disabled *{pointer-events:none}.input-container{width:100%;margin:auto;display:flex;flex-direction:row-reverse}.input-container .selected-items{display:flex;padding-left:4px}.input-container .selected-items .selected-count{white-space:nowrap}.input-container .selected-items .value-tag{max-width:var(--tag-max-width)}.input-container .selected-items .value-tag ::ng-deep .tag-container{max-width:var(--tag-max-width)}.input-container .selected-items .overlap-count{font-size:14px;line-height:20px}.input-container .selected-items .overlap-count ui-tag{display:block}.input-container .selected-items .overlap-tag{position:absolute;opacity:0}.input-container input{margin-left:6px}.input-container input.unset-margin{margin-top:unset}.input-container input.no-caret{cursor:pointer;caret-color:transparent!important}.add-suggestion{margin:0 5px;color:#000;font-weight:700}.remove-selected{cursor:pointer;margin-right:2px;border-radius:50px;height:fit-content}.remove-selected.large-input-icon{margin-top:10px}.arrow-state{height:24px;cursor:pointer}.arrow-state.large-input-icon{margin-top:10px}.arrow-state.opened{transform:rotateX(180deg)}::ng-deep .autocomplete-wrapper .mat-mdc-form-field{width:100%}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error,::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error svg{color:#cb7b7a}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{display:flex}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{display:flex;flex-flow:column;row-gap:4px}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error .errors{display:flex}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error .errors ui-icon{margin-right:8px}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{color:#e02800!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error svg{color:#e02800!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-bottom-align:before{height:0}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint-wrapper{padding:0 0 12px;font-size:12px;line-height:16px;position:relative}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint-wrapper .mat-form-field-hint-spacer{display:none}::ng-deep .autocomplete-wrapper .mat-mdc-form-field.hide-bottom-content .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{top:28px!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:22px!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper{padding-left:12px!important;height:unset!important;max-height:unset!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{color:#276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__notch{border-bottom:2px solid #276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__leading{border-left:2px solid #276678!important;border-bottom:2px solid #276678!important;border-top:2px solid #276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__trailing{border:2px solid #276678!important;border-left:unset!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-infix,::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-flex{min-height:48px!important;max-height:184px!important;overflow-y:auto;overflow-x:hidden;padding:0!important;display:flex;justify-content:center;text-align:center;align-items:center;flex-direction:row;width:100%}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-line-ripple{display:none!important}::ng-deep .mat-mdc-autocomplete-panel{box-shadow:0 8px 24px 4px #00000014;max-height:312px!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option:hover:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option:focus:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mat-mdc-option-active,::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mdc-list-item--selected:not(.mat-mdc-option-multiple):not(.mdc-list-item--disabled){background:#e9f0f1!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option{padding-right:32px;padding-left:12px!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option ui-icon{display:none;position:absolute;right:0;bottom:calc(50% - 8px);margin:0 10px}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.selected-option{background:#e9f0f1}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.selected-option ui-icon{display:block}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mdc-list-item--selected .mdc-list-item__primary-text,::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option .mdc-list-item--activated .mdc-list-item__primary-text{color:#000!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option .mat-pseudo-checkbox{display:none}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-optgroup .mat-mdc-optgroup-label{font-weight:700!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-optgroup .mdc-list-item__primary-text{color:#000;font-size:12px;line-height:16px;font-weight:700}.active-field .mdc-notched-outline__leading{border-left-width:2px;border-top-width:2px;border-bottom-width:2px}.active-field .mdc-notched-outline__notch{border-top-width:2px;border-bottom-width:2px}.active-field .mdc-notched-outline__trailing{border-top-width:2px;border-bottom-width:2px;border-right-width:2px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i7.MatOptgroup, selector: "mat-optgroup", inputs: ["disabled"], exportAs: ["matOptgroup"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i9.TagComponent, selector: "ui-tag", inputs: ["label", "icon", "allowClose", "readOnly", "isSelected", "showIconWhenSelected", "isDisabled", "applicationTheme", "ariaLabel", "ariaRequired"], outputs: ["close", "press"] }, { kind: "component", type: i10.IconComponent, selector: "ui-icon", inputs: ["size", "cssClass", "name", "color", "filled", "applicationTheme", "useFullIconName"] }, { kind: "component", type: i11.ValidationErrorComponent, selector: "ui-validation-error", inputs: ["ngControl", "touchedOn", "errorMessage", "label", "applicationTheme"] }, { kind: "directive", type: i12.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i12.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i12.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i13.PreventInputDirective, selector: "[uiPreventInput]", inputs: ["uiPreventInput"] }, { kind: "directive", type: i14.SelectTextDirective, selector: "[selectText]", inputs: ["selectText"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i4.SlicePipe, name: "slice" }, { kind: "pipe", type: i15.UiTranslatePipe, name: "uiTranslate" }, { kind: "pipe", type: i16.HasValidationErrorPipe, name: "hasValidationError" }, { kind: "pipe", type: i17.TransformItemPipe, name: "transformItem" }, { kind: "pipe", type: i18.IncludesPipe, name: "includes" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
605
605
  }
606
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: AutocompleteComponent, decorators: [{
606
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AutocompleteComponent, decorators: [{
607
607
  type: Component,
608
608
  args: [{ selector: 'ui-autocomplete', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container>\n <div class=\"autocomplete-wrapper\" [ngClass]=\"{ 'full-width': fullWidth, disabled: disabled }\">\n <mat-form-field\n [color]=\"(safeErrors.length || (ngControl?.errors && ngControl?.touched ) || (AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && inputValue) ) ? 'warn' : 'accent'\"\n [appearance]=\"'outline'\"\n [ngClass]=\"{ 'large-size': type === autocompleteType.LARGE, 'hide-bottom-content': !showBottomContent, 'keyboard-focused': keyboardFocused(), 'has-label': !!label }\"\n >\n <mat-label *ngIf=\"label\">{{ label }} <span *ngIf=\"required\">*</span></mat-label>\n <div #formField class=\"input-container\">\n <span style=\"position: absolute; left: -9999px\" *ngIf=\"textField ? value?.[textField] : value === inputValue\" aria-live=\"polite\">{{ (('SELECTED') | uiTranslate | async) + ' ' + inputValue }}</span>\n\n <input\n #trigger=\"matAutocompleteTrigger\"\n #matInput\n [uiPreventInput]=\"!allowUserInput\"\n [disabled]=\"disabled\"\n [ngClass]=\"{ 'unset-margin': this.value && type === autocompleteType.LARGE, 'no-caret': !allowUserInput }\"\n (blur)=\"refillInput()\"\n (focusin)=\"onFocus()\"\n [attr.aria-label]=\"((translationContext + 'SELECTED') | uiTranslate | async) + ' ' + (value | transformItem: textField : true)\"\n [style.opacity]=\"type === autocompleteType.MULTI ? inputOpacity : 1\"\n matInput\n [placeholder]=\"value && value.length ? '': placeholder\"\n [type]=\"'text'\"\n [matAutocomplete]=\"autocomplete\"\n (input)=\"onInputChange($event)\"\n [(ngModel)]=\"inputValue\"\n />\n <div\n class=\"selected-items\"\n #tagContainer\n *ngIf=\"\n (type === autocompleteType.LARGE && this.value) ||\n (!(inputValue && this.isInputFocus) && this.value && type !== autocompleteType.SINGLE)\n \"\n >\n <ui-tag\n class=\"value-tag\"\n [id]=\"'ui-tag-' + i\"\n *ngFor=\"let valueItem of value; let i = index\"\n [label]=\"valueItem | transformItem: textField\"\n [allowClose]=\"true\"\n [applicationTheme]=\"applicationTheme\"\n [style.opacity]=\"type === autocompleteType.MULTI ? inputOpacity : 1\"\n [style.display]=\"(isOverLapping && i > 0 && i >= overlapIndex) || (size === 'small' && value.length > 1) ? 'none' : 'block'\"\n [ngStyle]=\"{ '--tag-max-width': type === autocompleteType.LARGE ? 'fit-content' : firstTagMaxWidth + 'px' }\"\n [ngClass]=\"{\n 'overlap-tag': isOverlapChecking && overlapIndex && i >= overlapIndex && type === autocompleteType.MULTI\n }\"\n (close)=\"onOptionRemoved(valueItem)\"\n ></ui-tag>\n @if (size === 'small') {\n <div class=\"selected-count\" *ngIf=\"value.length > 1\">\n {{ (translationContext + 'SELECTED_AMOUNT' | uiTranslate : { numberSelected: (value | slice: overlapIndex).length }) | async }}\n </div>\n } @else {\n <div *ngIf=\"value.length > 1 && isOverLapping\" class=\"overlap-count\">\n <ui-tag [applicationTheme]=\"applicationTheme\"\n [label]=\"'+' + (value.length - overlapIndex)\"></ui-tag>\n </div>\n }\n </div>\n </div>\n\n <ui-icon\n *ngIf=\"clearable && (type === autocompleteType.SINGLE && (value?.length || hasObjectValue)) || (type !== autocompleteType.SINGLE && value && value.length > 1 && ((AutocompleteUtils.isPrimitive(value) && value.length) || (!AutocompleteUtils.isPrimitive(value) && (AutocompleteUtils.isArray(value) && value.length || !AutocompleteUtils.isArray(value) && !value.length))))\"\n class=\"remove-selected\"\n [tabIndex]=\"disabled ? -1 : 0\"\n (keydown.enter)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\n (keydown.space)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\n [ngClass]=\"{ 'large-input-icon': type === autocompleteType.LARGE }\"\n (click)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\n [size]=\"'24'\"\n [color]=\"applicationTheme === 'classic' ? 'inherit' : 'rebrand-black'\"\n [attr.aria-label]=\"('COMMON.CLEAR') | uiTranslate | async\"\n [name]=\"applicationTheme === 'classic' ? 'Close' : 'Close-in-line'\"\n ></ui-icon>\n\n <ui-icon\n class=\"arrow-state\"\n [ngClass]=\"{ opened: autocomplete.isOpen, 'large-input-icon': type === autocompleteType.LARGE }\"\n *ngIf=\"isDropdown\"\n [size]=\"'24'\"\n [name]=\"applicationTheme !== 'classic' ? 'Arrow-chevron-down-in-line' : 'Arrow_down'\"\n (click)=\"onChevronClick(autocomplete)\"\n ></ui-icon>\n\n\n <mat-autocomplete\n #autocomplete\n [class]=\"applicationTheme + ' ' + dropdownPanelClass\"\n (optionSelected)=\"onOptionSelected($event)\"\n [disableRipple]=\"applicationTheme !== 'classic'\"\n [hideSingleSelectionIndicator]=\"false\"\n (opened)=\"gotoUp()\"\n >\n @if (type !== autocompleteType.MULTI || value?.length < maxItemSelected) {\n <ng-container *ngIf=\"!(searchResult$ | async)\">\n <ng-container *ngIf=\"!isDropdown; else dropdownList\">\n <mat-optgroup [label]=\"((translationContext + 'SUGGESTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"suggestionsList.length\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': suggested | includes: value : valueField }\"\n *ngFor=\"let suggested of suggestionsList\"\n [value]=\"suggested\"\n >\n <span [selectText]=\"userInput$ | async\">{{ suggested | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n <mat-optgroup [label]=\"((translationContext + 'SELECTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"value?.length && type !== autocompleteType.SINGLE\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of value\"\n [value]=\"item\"\n >\n <span>{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n <mat-optgroup [label]=\"((translationContext + 'SELECTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"value?.length && type === autocompleteType.SINGLE\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [class]=\"'selected-option'\"\n [value]=\"value\"\n >\n <span [selectText]=\"userInput$ | async\">{{ value | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n </ng-container>\n\n <ng-template #dropdownList>\n <cdk-virtual-scroll-viewport *ngIf=\"virtualScroll; else defaultViewPort\" [itemSize]=\"48\"\n [style.height]=\"'200px'\" class=\"virtual-scroll\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *cdkVirtualFor=\"let item of itemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </cdk-virtual-scroll-viewport>\n\n <ng-template #defaultViewPort>\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of itemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </ng-template>\n\n </ng-template>\n\n </ng-container>\n\n <ng-container *ngIf=\"filteredSuggestionList$ | async as filteredSuggestionList\">\n <ng-container *ngIf=\"filteredItemsList$ | async as filteredItemsList\">\n <mat-optgroup [label]=\"((translationContext + 'SUGGESTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"filteredSuggestionList.length\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of filteredSuggestionList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n <ng-container *ngIf=\"!filteredSuggestionList.length; else showItemListWithGroup\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of filteredItemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </ng-container>\n\n <ng-template #showItemListWithGroup>\n <mat-optgroup [label]=\"((translationContext + 'ALL_ITEMS') | uiTranslate | async)! | uppercase\"\n *ngIf=\"filteredItemsList.length\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of filteredItemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n </ng-template>\n\n <ng-container *ngIf=\"!filteredItemsList.length && !filteredSuggestionList.length && inputValue\">\n <ng-container *ngIf=\"allowAdd; else notFound\">\n <mat-option (mousedown)=$event.preventDefault() [value]=\"inputValue\">\n <span>{{ ('COMMON.ADD') | uiTranslate | async }}</span>\n <span class=\"add-suggestion\">\"{{ inputValue }}\"</span>\n </mat-option>\n </ng-container>\n\n <ng-template #notFound>\n <mat-option [style.pointer-events]=\"'none'\">\n <span>{{ (translationContext + 'NO_RESULTS_FOUND') | uiTranslate | async }}</span>\n </mat-option>\n </ng-template>\n </ng-container>\n </ng-container>\n </ng-container>\n }\n </mat-autocomplete>\n <mat-hint class=\"error\" *ngIf=\"safeErrors.length || (ngControl?.errors | hasValidationError) || (AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && inputValue)\">\n <div class=\"errors\" *ngIf=\"(AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && inputValue)\">\n <ui-icon [applicationTheme]=\"applicationTheme\" [name]=\"'Error'\"></ui-icon>\n <span>{{ (translationContext + 'MAX_SELECTED_ERROR') | uiTranslate : { max: maxItemSelected } | async }}</span>\n </div>\n <ng-container *ngIf=\"safeErrors.length\">\n <div class=\"errors\" *ngFor=\"let error of safeErrors; trackBy: trackByFn\">\n <ui-icon [applicationTheme]=\"applicationTheme\" [name]=\"'Error'\"></ui-icon>\n <span [innerHTML]=\"error\"></span>\n </div>\n </ng-container>\n <ui-validation-error *ngIf=\"ngControl && !hideBuiltInErrors\" [ngControl]=\"ngControl\"\n [label]=\"hideLabelInErrors ? null : label\"></ui-validation-error>\n\n </mat-hint>\n </mat-form-field>\n </div>\n</ng-container>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}:host{width:320px;display:block}:host.full-width{width:100%}:host ui-tag{height:32px;margin:4px}:host ui-tag ::ng-deep .tag-container{margin:0!important}:host ui-tag ::ng-deep .tag-wrapper{max-width:fit-content}.large-size input{margin:10px 0}.large-size .selected-items{margin:5px 0;flex-wrap:wrap}.large-size .input-container{display:flex;flex-direction:column-reverse}.large-size ::ng-deep .mat-mdc-form-field-infix,.large-size .mat-mdc-form-field-flex{align-items:unset!important}.disabled{opacity:.5}.disabled *{pointer-events:none}.input-container{width:100%;margin:auto;display:flex;flex-direction:row-reverse}.input-container .selected-items{display:flex;padding-left:4px}.input-container .selected-items .selected-count{white-space:nowrap}.input-container .selected-items .value-tag{max-width:var(--tag-max-width)}.input-container .selected-items .value-tag ::ng-deep .tag-container{max-width:var(--tag-max-width)}.input-container .selected-items .overlap-count{font-size:14px;line-height:20px}.input-container .selected-items .overlap-count ui-tag{display:block}.input-container .selected-items .overlap-tag{position:absolute;opacity:0}.input-container input{margin-left:6px}.input-container input.unset-margin{margin-top:unset}.input-container input.no-caret{cursor:pointer;caret-color:transparent!important}.add-suggestion{margin:0 5px;color:#000;font-weight:700}.remove-selected{cursor:pointer;margin-right:2px;border-radius:50px;height:fit-content}.remove-selected.large-input-icon{margin-top:10px}.arrow-state{height:24px;cursor:pointer}.arrow-state.large-input-icon{margin-top:10px}.arrow-state.opened{transform:rotateX(180deg)}::ng-deep .autocomplete-wrapper .mat-mdc-form-field{width:100%}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error,::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error svg{color:#cb7b7a}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{display:flex}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{display:flex;flex-flow:column;row-gap:4px}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error .errors{display:flex}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error .errors ui-icon{margin-right:8px}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{color:#e02800!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error svg{color:#e02800!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-bottom-align:before{height:0}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint-wrapper{padding:0 0 12px;font-size:12px;line-height:16px;position:relative}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint-wrapper .mat-form-field-hint-spacer{display:none}::ng-deep .autocomplete-wrapper .mat-mdc-form-field.hide-bottom-content .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{top:28px!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:22px!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper{padding-left:12px!important;height:unset!important;max-height:unset!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{color:#276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__notch{border-bottom:2px solid #276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__leading{border-left:2px solid #276678!important;border-bottom:2px solid #276678!important;border-top:2px solid #276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__trailing{border:2px solid #276678!important;border-left:unset!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-infix,::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-flex{min-height:48px!important;max-height:184px!important;overflow-y:auto;overflow-x:hidden;padding:0!important;display:flex;justify-content:center;text-align:center;align-items:center;flex-direction:row;width:100%}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-line-ripple{display:none!important}::ng-deep .mat-mdc-autocomplete-panel{box-shadow:0 8px 24px 4px #00000014;max-height:312px!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option:hover:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option:focus:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mat-mdc-option-active,::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mdc-list-item--selected:not(.mat-mdc-option-multiple):not(.mdc-list-item--disabled){background:#e9f0f1!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option{padding-right:32px;padding-left:12px!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option ui-icon{display:none;position:absolute;right:0;bottom:calc(50% - 8px);margin:0 10px}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.selected-option{background:#e9f0f1}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.selected-option ui-icon{display:block}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mdc-list-item--selected .mdc-list-item__primary-text,::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option .mdc-list-item--activated .mdc-list-item__primary-text{color:#000!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option .mat-pseudo-checkbox{display:none}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-optgroup .mat-mdc-optgroup-label{font-weight:700!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-optgroup .mdc-list-item__primary-text{color:#000;font-size:12px;line-height:16px;font-weight:700}.active-field .mdc-notched-outline__leading{border-left-width:2px;border-top-width:2px;border-bottom-width:2px}.active-field .mdc-notched-outline__notch{border-top-width:2px;border-bottom-width:2px}.active-field .mdc-notched-outline__trailing{border-top-width:2px;border-bottom-width:2px;border-right-width:2px}\n"] }]
609
609
  }], ctorParameters: () => [{ type: undefined, decorators: [{
@@ -713,4 +713,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImpor
713
713
  type: ViewChild,
714
714
  args: ['matInput']
715
715
  }] } });
716
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rnby1jYW5vcHktdWkvY29tcG9uZW50cy9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rnby1jYW5vcHktdWkvY29tcG9uZW50cy9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBRXZCLFNBQVMsRUFJVCxZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sRUFDTixXQUFXLEVBQ1gsSUFBSSxFQUNKLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXJELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFDTCxZQUFZLEVBR1osaUJBQWlCLEVBQ2pCLE9BQU8sRUFDUCxPQUFPLEdBQ1IsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUXBFLG9FQUFvRTtBQUNwRSxNQUFNLE9BQU8scUJBQXFCO0lBeURoQzs7OztPQUlHO0lBQ0gsSUFBYSxTQUFTLENBQUMsQ0FB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SztzQkFBZCxNQUFNO2dCQUVpQixnQkFBZ0I7c0JBQXZDLFNBQVM7dUJBQUMsV0FBVztnQkFDSyxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0gsWUFBWTtzQkFBakMsU0FBUzt1QkFBQyxTQUFTO2dCQUNvQyx3QkFBd0I7c0JBQS9FLFNBQVM7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUMzQixlQUFlO3NCQUF6QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0YsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgRG9DaGVjayxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUExBVEZPUk1fSUQsXG4gIFNlbGYsXG4gIHNpZ25hbCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGUsIE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQsIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgbWFwLCBSZXBsYXlTdWJqZWN0LCBzdGFydFdpdGggfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uVGhlbWUgfSBmcm9tICcuLi8uLi9tb2RlbHMvYXBwbGljYXRpb24tdGhlbWUubW9kZWwnO1xuaW1wb3J0IHsgQXV0b2NvbXBsZXRlVXRpbHMgfSBmcm9tICcuLi8uLi91dGlscy9hdXRvY29tcGxldGUtdXRpbHMnO1xuaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlLFxuICBBdXRvY29tcGxldGVTaXplLFxuICBBdXRvY29tcGxldGVUeXBlLFxuICBEcm9wZG93blZhcmlhdGlvbixcbiAgUGFkZGluZyxcbiAgVGltZW91dCxcbn0gZnJvbSAnLi9hdXRvY29tcGxldGUubW9kZWwnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9jdXNNb25pdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgSUtleWJvYXJkRXZlbnQgfSBmcm9tICcuLi8uLi9tb2RlbHMva2V5Ym9hcmQtZXZlbnRzLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndWktYXV0b2NvbXBsZXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWNvbmZsaWN0aW5nLWxpZmVjeWNsZVxuZXhwb3J0IGNsYXNzIEF1dG9jb21wbGV0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIERvQ2hlY2ssIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBAcHJvcGVydHkgaXRlbXNMaXN0XG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbGlzdCBvZiBpdGVtcyB0byBkaXNwbGF5IGluIHRoZSBhdXRvY29tcGxldGUuXG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGl0ZW1zTGlzdDogYW55W10gPSBbXTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IHN1Z2dlc3Rpb25zTGlzdFxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxpc3Qgb2Ygc3VnZ2VzdGlvbnMgdG8gZGlzcGxheSBpbiB0aGUgYXV0b2NvbXBsZXRlLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBzdWdnZXN0aW9uc0xpc3Q6IGFueVtdID0gW107XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb24gSWYgYHRydWVgLCB0aGUgYXV0b2NvbXBsZXRlIGlzIGRpc2FibGVkLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYWxsb3dBZGRcbiAgICogQGRlc2NyaXB0aW9uIElmIGB0cnVlYCwgYWxsb3dzIGFkZGluZyBuZXcgdmFsdWVzIHRvIHRoZSBhdXRvY29tcGxldGUuXG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGFsbG93QWRkID0gdHJ1ZTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IHRleHRGaWVsZFxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGZpZWxkIHRvIGJlIHVzZWQgYXMgdGhlIGRpc3BsYXkgdGV4dCBpbiB0aGUgYXV0b2NvbXBsZXRlLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSB0ZXh0RmllbGQgPSAnJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhbHVlRmllbGRcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBmaWVsZCB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBpbiB0aGUgYXV0b2NvbXBsZXRlLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSB2YWx1ZUZpZWxkID0gJyc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBsYWJlbFxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxhYmVsIGZvciB0aGUgYXV0b2NvbXBsZXRlIGlucHV0LlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBsYWJlbCA9ICcnO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgcGxhY2Vob2xkZXJcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBwbGFjZWhvbGRlciBmb3IgdGhlIGF1dG9jb21wbGV0ZSBpbnB1dC5cbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhbHVlXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc2VsZWN0ZWQgdmFsdWUocykgaW4gdGhlIGF1dG9jb21wbGV0ZS5cbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgc2V0IGl0ZW1WYWx1ZSh2OiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlID0gQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2KSA/IHYgOiB2ID8gW3ZdIDogW107XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHR5cGVcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB0eXBlIG9mIHRoZSBhdXRvY29tcGxldGUgKCdzaW5nbGUnLCAnbXVsdGknLCBldGMuKS5cbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgdHlwZTogQXV0b2NvbXBsZXRlVHlwZSA9ICdtdWx0aSc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBtaW5DaGFyYWN0ZXJzU2VhcmNoXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbWluaW11bSBjaGFyYWN0ZXJzIHRvIHRyaWdnZXIgc2VhcmNoLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBtaW5DaGFyYWN0ZXJzU2VhcmNoID0gMztcblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhcmlhbnRcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB2YXJpYW50IG9mIEF1dG9jb21wbGV0ZVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSB2YXJpYW50ID0gRHJvcGRvd25WYXJpYXRpb24uQVVUT0NPTVBMRVRFO1xuXG4gIC8qKlxuICAgKiBTaG93IHJlc2VydmVkIGNvbnRlbnQgYmVsb3cgZm9ybSBmaWVsZFxuICAgKiBAcHJvcGVydHkgc2hvd0JvdHRvbUNvbnRlbnRcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIHNob3dCb3R0b21Db250ZW50ID0gdHJ1ZTtcblxuICAvKipcbiAgICogUmV0dXJuIGZ1bGwgb2JqZWN0IGlmIHRydWVcbiAgICogQHByb3BlcnR5IHZhbHVlUHJpbWl0aXZlXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSB2YWx1ZVByaW1pdGl2ZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0b3Igb2YgdGhlIGF1dG9jb21wbGV0ZSB3aWR0aFxuICAgKiBAcHJvcGVydHkgZnVsbFdpZHRoXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZ1bGwtd2lkdGgnKVxuICBASW5wdXQoKVxuICBmdWxsV2lkdGggPSBmYWxzZTtcblxuICAvKipcbiAgICpcbiAgICogRGVmaW5lcyB0aGUgYXBwbGljYXRpb24gdGhlbWVcbiAgICpcbiAgICogQHR5cGUge0FwcGxpY2F0aW9uVGhlbWV9XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBIb3N0QmluZGluZygnYXR0ci50aGVtZScpXG4gIEBJbnB1dCgpXG4gIGFwcGxpY2F0aW9uVGhlbWU6IEFwcGxpY2F0aW9uVGhlbWUgPSAnbGlnaHQnO1xuXG4gIC8qKlxuICAgKiBBdXRvY29tcGxldGUgaXMgcmVxdWlyZWQgb3Igbm90XG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5wdXQgZmllbGQgZXJyb3JzXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgc2V0IGVycm9ycyhlcnJvcnM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5zYWZlRXJyb3JzID0gZXJyb3JzPy5maWx0ZXIoQm9vbGVhbikubWFwKGVycm9yID0+IHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGVycm9yKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29sb3Igb2YgdGhlIG9wdGlvbiBob3Zlci5cbiAgICogRGVmYXVsdHMgdG8gVGVzdCBHb3JpbGxhIHByaW1hcnkgY29sb3IuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGNvbXBhbnlDb2xvcjogc3RyaW5nIHwgbnVsbCA9ICcjRkZGMkZDJztcblxuICAvKipcbiAgICogSGlkZSBpbi1idWlsZCBlcnJvcnMgZm9yIFJlYWN0aXZlIEZvcm1zXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGhpZGVCdWlsdEluRXJyb3JzID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEhpZGUgbGFiZWwgaW4gZXJyb3JzXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGhpZGVMYWJlbEluRXJyb3JzID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgZHJvcGRvd24gbGlzdCB0byB2aXJ0dWFsIHNjcm9sbCBtb2RlXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgdmlydHVhbFNjcm9sbCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgY29tcGFyZVdpdGhcbiAgICogQGRlc2NyaXB0aW9uIEN1c3RvbSBjb21wYXJpc29uIGxvZ2ljIGZvciB0aGUgYXV0b2NvbXBsZXRlLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBjb21wYXJlV2l0aDogKGE6IGFueSwgYjogYW55KSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZHJvcGRvd25QYW5lbENsYXNzXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIGNsYXNzIG9uIGF1dG9jb21wbGV0ZSBkcm9wZG93blxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBkcm9wZG93blBhbmVsQ2xhc3MgPSAnJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IGNsb3NlT25TY3JvbGxcbiAgICogQGRlc2NyaXB0aW9uIERlZmluZXMgaWYgZHJvcGRvd24gc2hvdWxkIGJlIGNsb3NlZCBvbiBwYWdlIHNjcm9sbFxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBjbG9zZU9uU2Nyb2xsID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBBdXRvY29tcGxldGVTaXplXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIHRoZSBzaXplIG9mIHRoZSBhdXRvY29tcGxldGUuIFNtYWxsIGNoYW5nZXMgdGhlIHRhZ3MgdG8gY291bnRlcjsgbWVkaXVtIGlzIGRlZmF1bHQuXG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIHNpemU6IEF1dG9jb21wbGV0ZVNpemUgPSAnbWVkaXVtJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IGFsbG93VXNlcklucHV0XG4gICAqIEBkZXNjcmlwdGlvbiBJZiBgdHJ1ZWAsIGFsbG93cyB0aGUgdXNlciB0byBpbnB1dCBjdXN0b20gdmFsdWVzIGluIHRoZSBhdXRvY29tcGxldGUuXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBhbGxvd1VzZXJJbnB1dCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBjbGVhcmFibGVcbiAgICogQGRlc2NyaXB0aW9uIElmIGB0cnVlYCwgYWxsb3dzIHRoZSB1c2VyIHRvIGNsZWFyIHRoZSBpbnB1dCB2YWx1ZXNcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGNsZWFyYWJsZSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBleGFjdE1hdGNoU2VsZWN0XG4gICAqIEBkZXNjcmlwdGlvbiBJZiBgdHJ1ZWAsIGFsbG93cyB0byBzZWxlY3QgdGhlIGV4YWN0IG1hdGNoIGZyb20gdGhlIHN1Z2dlc3Rpb25zIGxpc3RcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGV4YWN0TWF0Y2hTZWxlY3QgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgbWF4SXRlbVNlbGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBzZWxlY3RlZCBpbiB0aGUgYXV0b2NvbXBsZXRlXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBtYXhJdGVtU2VsZWN0ZWQgPSBJbmZpbml0eTtcblxuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hUZXh0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBibHVyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgnZm9ybUZpZWxkJykgZm9ybUZpZWxkRWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3RhZ0NvbnRhaW5lcicpIHRhZ0NvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXInKSBhdXRvY29tcGxldGU6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXI7XG4gIEBWaWV3Q2hpbGQoQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCB7IHN0YXRpYzogZmFsc2UgfSkgY2RrVmlydHVhbFNjcm9sbFZpZXdQb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG4gIEBWaWV3Q2hpbGQoJ2F1dG9jb21wbGV0ZScpIG1hdEF1dG9jb21wbGV0ZTogTWF0QXV0b2NvbXBsZXRlO1xuICBAVmlld0NoaWxkKCdtYXRJbnB1dCcpIG1hdElucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gIHByb3RlY3RlZCBzYWZlRXJyb3JzOiBTYWZlSHRtbFtdID0gW107XG4gIHByb3RlY3RlZCB2YWx1ZTogYW55O1xuICBwcm90ZWN0ZWQgaW5wdXRWYWx1ZTogYW55ID0gJyc7XG4gIHByb3RlY3RlZCBpc0lucHV0Rm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGF1dG9jb21wbGV0ZVR5cGUgPSBBdXRvY29tcGxldGU7XG4gIHByb3RlY3RlZCBpc092ZXJMYXBwaW5nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc092ZXJsYXBDaGVja2luZyA9IHRydWU7XG4gIHByb3RlY3RlZCBvdmVybGFwSW5kZXggPSAwO1xuICBwcm90ZWN0ZWQgaW5wdXRPcGFjaXR5ID0gMTtcbiAgcHJvdGVjdGVkIGZpcnN0VGFnTWF4V2lkdGg6IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCBpbnB1dFZhbHVlU2VhcmNoJCA9IG5ldyBSZXBsYXlTdWJqZWN0PHN0cmluZz4oMSk7XG4gIHByb3RlY3RlZCB1c2VySW5wdXQkID0gbmV3IFJlcGxheVN1YmplY3Q8c3RyaW5nPigxKTtcbiAgcHJvdGVjdGVkIGZpbHRlcmVkSXRlbXNMaXN0JCA9IHRoaXMuaW5wdXRWYWx1ZVNlYXJjaCQucGlwZShcbiAgICBzdGFydFdpdGgoJycpLFxuICAgIG1hcChpbnB1dFZhbHVlID0+XG4gICAgICBpbnB1dFZhbHVlLmxlbmd0aCA/IEF1dG9jb21wbGV0ZVV0aWxzLmZpbHRlckl0ZW1zKHRoaXMuaXRlbXNMaXN0LCBpbnB1dFZhbHVlLCB0aGlzLnRleHRGaWVsZCkgOiBudWxsXG4gICAgKVxuICApO1xuICBwcm90ZWN0ZWQgZmlsdGVyZWRTdWdnZXN0aW9uTGlzdCQgPSB0aGlzLmlucHV0VmFsdWVTZWFyY2gkLnBpcGUoXG4gICAgbWFwKGlucHV0VmFsdWUgPT5cbiAgICAgIGlucHV0VmFsdWUubGVuZ3RoID8gQXV0b2NvbXBsZXRlVXRpbHMuZmlsdGVySXRlbXModGhpcy5zdWdnZXN0aW9uc0xpc3QsIGlucHV0VmFsdWUsIHRoaXMudGV4dEZpZWxkKSA6IG51bGxcbiAgICApXG4gICk7XG5cbiAgc2Nyb2xsRXZlbnQgPSAoZXZlbnQ6IGFueSk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGlzTm90QXV0b2NvbXBsZXRlU2Nyb2xsID1cbiAgICAgICFldmVudC50YXJnZXQ/LmlkPy5pbmNsdWRlcygnbWF0LWF1dG9jb21wbGV0ZS0nKSAmJlxuICAgICAgIWV2ZW50LnRhcmdldD8ucGFyZW50RWxlbWVudD8uaWQ/LmluY2x1ZGVzKCdtYXQtYXV0b2NvbXBsZXRlLScpICYmXG4gICAgICAhZXZlbnQudGFyZ2V0Py5jbGFzc0xpc3Q/LmNvbnRhaW5zKCdtYXQtbWRjLWF1dG9jb21wbGV0ZS10cmlnZ2VyJyk7XG5cbiAgICBpZiAodGhpcy5hdXRvY29tcGxldGUucGFuZWxPcGVuICYmIGlzTm90QXV0b2NvbXBsZXRlU2Nyb2xsKSB7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZS5jbG9zZVBhbmVsKCk7XG4gICAgfVxuICB9O1xuXG4gIHByb3RlY3RlZCBzZWFyY2hSZXN1bHQkID0gdGhpcy5pbnB1dFZhbHVlU2VhcmNoJC5waXBlKG1hcChpbnB1dFZhbHVlID0+ICEhaW5wdXRWYWx1ZS50cmltKCkpKTtcbiAgcHJvdGVjdGVkIHRyYW5zbGF0aW9uQ29udGV4dCA9ICdBVVRPQ09NUExFVEUuJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEF1dG9jb21wbGV0ZVV0aWxzID0gQXV0b2NvbXBsZXRlVXRpbHM7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNQbGF0Zm9ybSA9IGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCk7XG4gIHByaXZhdGUgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG4gIHByb3RlY3RlZCBrZXlib2FyZEZvY3VzZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoJ0NBTk9QWVVJX0RFRkFVTFRfQVBQTElDQVRJT05fVEhFTUUnKSBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRBcHBUaGVtZTogQXBwbGljYXRpb25UaGVtZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQ6IGFueSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZm9jdXNNb25pdG9yOiBGb2N1c01vbml0b3IsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmOiBEZXN0cm95UmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmdab25lOiBOZ1pvbmVcbiAgKSB7XG4gICAgaWYgKHRoaXMubmdDb250cm9sICE9IG51bGwpIHtcbiAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xuICAgIH1cblxuICAgIGlmIChkZWZhdWx0QXBwVGhlbWUpIHtcbiAgICAgIHRoaXMuYXBwbGljYXRpb25UaGVtZSA9IGRlZmF1bHRBcHBUaGVtZTtcbiAgICB9XG5cbiAgICB0aGlzLnN1YnNjcmliZXJEaXNwbGF5Q2hhbmdlKCk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBtYXJrIGNvbXBvbmVudCB2aWV3IGFzIGRpcnR5IHdoZW4gdG91Y2hlZCBwcm9ncmFtbWF0aWNhbGx5IHdpdGggbWFya0FzVG91Y2hlZC9tYXJrQWxsQXNUb3VjaGVkIG9yIGVycm9yc1xuICAgKiB0byBkaXNwbGF5IHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgbWlnaHQgaGFwcGVuIChlLmcuIHJlcXVpcmVkKVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1jb25mbGljdGluZy1saWZlY3ljbGVcbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm5nQ29udHJvbD8udG91Y2hlZCB8fCB0aGlzLm5nQ29udHJvbD8uZXJyb3JzKSB7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWNvbmZsaWN0aW5nLWxpZmVjeWNsZVxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtc0xpc3QgPSBBdXRvY29tcGxldGVVdGlscy5leGNsdWRlU3VnZ2VzdGlvbnModGhpcy5pdGVtc0xpc3QsIHRoaXMuc3VnZ2VzdGlvbnNMaXN0LCB0aGlzLnZhbHVlRmllbGQpO1xuICAgIHRoaXMuaW5pdFZhbHVlKCk7XG5cbiAgICBpZiAodGhpcy5pc1BsYXRmb3JtICYmIGNoYW5nZXNbJ2NvbXBhbnlDb2xvciddKSB7XG4gICAgICB0aGlzLnNldENvbXBhbnlDb2xvclZhcmlhYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1jb25mbGljdGluZy1saWZlY3ljbGVcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnR5cGUgIT09IEF1dG9jb21wbGV0ZS5MQVJHRSkge1xuICAgICAgdGhpcy5jaGVja092ZXJsYXAoVGltZW91dC5WSUVXX0lOSVRJQUxJWkVEX0NPTVBPTkVOVF9MT0FELCB0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5pc1BsYXRmb3JtICYmIHRoaXMuc2V0Q29tcGFueUNvbG9yVmFyaWFibGUoKTtcbiAgICBpZiAodGhpcy5jbG9zZU9uU2Nyb2xsKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5zY3JvbGxFdmVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5mb2N1c01vbml0b3JcbiAgICAgIC5tb25pdG9yKHRoaXMubWF0SW5wdXQpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUob3JpZ2luID0+XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5rZXlib2FyZEZvY3VzZWQuc2V0KG9yaWdpbiA9PT0gJ2tleWJvYXJkJyk7XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgdGhpcy5tYXRJbnB1dC5uYXRpdmVFbGVtZW50Lm9ua2V5ZG93biA9IHRoaXMub25LZXlkb3duLmJpbmQodGhpcyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWNvbmZsaWN0aW5nLWxpZmVjeWNsZVxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5zY3JvbGxFdmVudCwgdHJ1ZSk7XG5cbiAgICBpZiAodGhpcy5vYnNlcnZlcikge1xuICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcbiAgb25Ub3VjaCA9ICgpID0+IHt9O1xuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2ggPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmFsdWVQcmltaXRpdmUgJiYgdGhpcy50ZXh0RmllbGQgJiYgdGhpcy52YWx1ZUZpZWxkKSB7XG4gICAgICBpZiAodGhpcy50eXBlID09PSBBdXRvY29tcGxldGUuU0lOR0xFKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLml0ZW1zTGlzdC5maW5kKGl0ZW0gPT4gaXRlbVt0aGlzLnZhbHVlRmllbGRdID09PSB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlID0gQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICA/IHRoaXMuaXRlbXNMaXN0LmZpbHRlcihpdGVtID0+IHZhbHVlLmZpbmQoKHY6IGFueSkgPT4gdiA9PT0gaXRlbVt0aGlzLnZhbHVlRmllbGRdKSlcbiAgICAgICAgICA6IFt0aGlzLml0ZW1zTGlzdC5maW5kKGl0ZW0gPT4gaXRlbVt0aGlzLnZhbHVlRmllbGRdID09PSB2YWx1ZSldO1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoID8gdGhpcy52YWx1ZSA6IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5pbml0VmFsdWUoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbk9wdGlvblNlbGVjdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9IGV2ZW50Lm9wdGlvbi52YWx1ZTtcbiAgICBjb25zdCBpdGVtVmFsdWUgPSBBdXRvY29tcGxldGVVdGlscy5jcmVhdGVWYWx1ZUl0ZW0oaW5wdXRWYWx1ZSwgdGhpcy50ZXh0RmllbGQsIHRoaXMudmFsdWVGaWVsZCk7XG4gICAgdGhpcy5hZGROZXdWYWx1ZShpdGVtVmFsdWUpO1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gdGhpcy5hdXRvY29tcGxldGVUeXBlLk1VTFRJKSB7XG4gICAgICB0aGlzLmNoZWNrT3ZlcmxhcCgpO1xuICAgIH1cblxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnR5cGUgIT09IHRoaXMuYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEUpIHtcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBBdXRvY29tcGxldGVVdGlscy50cmFuc2Zvcm1EaXNwbGF5VmFsdWUodGhpcy52YWx1ZSwgdGhpcy50ZXh0RmllbGQpO1xuICAgICAgfVxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uVXBkYXRlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25PcHRpb25SZW1vdmVkKG9wdGlvbjogYW55KTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmF1dG9jb21wbGV0ZS5jbG9zZVBhbmVsKCksIDApO1xuICAgIGNvbnN0IGZvdW5kVmFsdWUgPSB0aGlzLnZhbHVlLmZpbmQoKHY6IGFueSkgPT4gKHRoaXMuY29tcGFyZVdpdGggPyB0aGlzLmNvbXBhcmVXaXRoKHYsIG9wdGlvbikgOiB2ID09PSBvcHRpb24pKTtcblxuICAgIGlmIChmb3VuZFZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIoKHY6IGFueSkgPT4gKHRoaXMuY29tcGFyZVdpdGggPyAhdGhpcy5jb21wYXJlV2l0aCh2LCBvcHRpb24pIDogdiAhPT0gb3B0aW9uKSk7XG4gICAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZS5vcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi52YWx1ZS52YWx1ZSA9PT0gZm91bmRWYWx1ZS52YWx1ZSkge1xuICAgICAgICAgIG9wdGlvbi5kZXNlbGVjdCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50eXBlID09PSB0aGlzLmF1dG9jb21wbGV0ZVR5cGUuTVVMVEkpIHtcbiAgICAgIHRoaXMuY2hlY2tPdmVybGFwKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbHVlLmxlbmd0aCkge1xuICAgICAgdGhpcy5pbnB1dFZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5vblVwZGF0ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW5wdXRDaGFuZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgdGhpcy51c2VySW5wdXQkLm5leHQoaW5wdXRWYWx1ZSk7XG4gICAgaWYgKGlucHV0VmFsdWUubGVuZ3RoID49IHRoaXMubWluQ2hhcmFjdGVyc1NlYXJjaCkge1xuICAgICAgdGhpcy5pbnB1dFZhbHVlU2VhcmNoJC5uZXh0KGlucHV0VmFsdWUpO1xuICAgICAgdGhpcy5zZWFyY2hUZXh0Q2hhbmdlLmVtaXQoaW5wdXRWYWx1ZSk7XG4gICAgICBjb25zdCBmaW5kVmFsdWUgPSBbLi4udGhpcy5zdWdnZXN0aW9uc0xpc3QsIC4uLnRoaXMuaXRlbXNMaXN0XS5maW5kKFxuICAgICAgICB2ID0+IGlucHV0VmFsdWUgPT09ICh0aGlzLnRleHRGaWVsZCA/IHZbdGhpcy50ZXh0RmllbGRdIDogdilcbiAgICAgICk7XG4gICAgICBjb25zdCBjb3VudCA9IEF1dG9jb21wbGV0ZVV0aWxzLmNvdW50TWF0Y2hpbmdXb3JkcyhcbiAgICAgICAgWy4uLnRoaXMuc3VnZ2VzdGlvbnNMaXN0LCAuLi50aGlzLml0ZW1zTGlzdF0sXG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSxcbiAgICAgICAgdGhpcy50ZXh0RmllbGRcbiAgICAgICk7XG4gICAgICBpZiAoZmluZFZhbHVlICYmIGNvdW50ID09PSAxICYmIHRoaXMuZXhhY3RNYXRjaFNlbGVjdCkge1xuICAgICAgICB0aGlzLm9uT3B0aW9uU2VsZWN0ZWQoeyBvcHRpb246IHsgdmFsdWU6IGZpbmRWYWx1ZSB9IH0gYXMgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZVNlYXJjaCQubmV4dCgnJyk7XG4gICAgICB0aGlzLnVzZXJJbnB1dCQubmV4dCgnJyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dFZhbHVlID0gJyc7XG4gICAgdGhpcy52YWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodGhpcy52YWx1ZSkgPyBbXSA6ICcnO1xuICAgIHRoaXMuaXNPdmVyTGFwcGluZyA9IGZhbHNlO1xuICAgIHRoaXMub3ZlcmxhcEluZGV4ID0gMDtcbiAgICB0aGlzLm9uVXBkYXRlKCk7XG4gICAgdGhpcy5tYXRBdXRvY29tcGxldGU/Lm9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4gb3B0aW9uLmRlc2VsZWN0KCkpO1xuICAgIHRoaXMub25Ub3VjaCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZmlsbElucHV0KCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy50eXBlID09PSB0aGlzLmF1dG9jb21wbGV0ZVR5cGUuU0lOR0xFICYmICF0aGlzLmlucHV0VmFsdWUpIHtcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gQXV0b2NvbXBsZXRlVXRpbHMudHJhbnNmb3JtRGlzcGxheVZhbHVlKHRoaXMudmFsdWUsIHRoaXMudGV4dEZpZWxkKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaW5wdXRWYWx1ZSAmJiB0aGlzLnZhbHVlPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gJyAnO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlucHV0VmFsdWUgJiYgdGhpcy50eXBlID09PSBBdXRvY29tcGxldGUuU0lOR0xFICYmIHRoaXMudmFsdWUgJiYgT2JqZWN0LmtleXModGhpcy52YWx1ZSkubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLnRyYW5zZm9ybURpc3BsYXlWYWx1ZShcbiAgICAgICAgICBBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHRoaXMudmFsdWUpID8gdGhpcy52YWx1ZVswXSA6IHRoaXMudmFsdWUsXG4gICAgICAgICAgdGhpcy50ZXh0RmllbGRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pbnB1dFZhbHVlKSB7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICcgJztcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbnB1dFZhbHVlU2VhcmNoJC5uZXh0KCcnKTtcbiAgICAgIHRoaXMudXNlcklucHV0JC5uZXh0KCcnKTtcbiAgICAgIHRoaXMuaXNJbnB1dEZvY3VzID0gZmFsc2U7XG4gICAgICB0aGlzLm9uVG91Y2goKTtcbiAgICAgIHRoaXMuYmx1ci5lbWl0KCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ290b1VwKCkge1xuICAgIGlmICh0aGlzLmNka1ZpcnR1YWxTY3JvbGxWaWV3UG9ydCkge1xuICAgICAgdGhpcy5jZGtWaXJ0dWFsU2Nyb2xsVmlld1BvcnQuc2Nyb2xsVG9JbmRleCgwKTtcbiAgICAgIHRoaXMuY2RrVmlydHVhbFNjcm9sbFZpZXdQb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uRm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5pc0lucHV0Rm9jdXMgPSB0cnVlO1xuXG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodGhpcy5pbnB1dFZhbHVlKSA/IHRoaXMuaW5wdXRWYWx1ZVswXSA6IHRoaXMuaW5wdXRWYWx1ZTtcblxuICAgIGlmIChBdXRvY29tcGxldGVVdGlscy5pc1ByaW1pdGl2ZShpbnB1dFZhbHVlKSkge1xuICAgICAgaWYgKHR5cGVvZiBpbnB1dFZhbHVlICE9PSAnbnVtYmVyJyAmJiBpbnB1dFZhbHVlPy5tYXRjaCgvXlxccysvZ20pKSB7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IGlucHV0VmFsdWUudHJpbVN0YXJ0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbnB1dFZhbHVlW3RoaXMudGV4dEZpZWxkXT8ubWF0Y2goL15cXHMrL2dtKSkge1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBpbnB1dFZhbHVlW3RoaXMudGV4dEZpZWxkXS50cmltU3RhcnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5mb2N1cy5lbWl0KCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrT3ZlcmxhcChkZWxheSA9IFRpbWVvdXQuVklFV19JTklUSUFMSVpFRF9BRlRFUl9BQ1RJT04sIGluaXQgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuaXNPdmVyTGFwcGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNPdmVybGFwQ2hlY2tpbmcgPSB0cnVlO1xuICAgIHRoaXMuaW5wdXRPcGFjaXR5ID0gMDtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXRXaWR0aCA9IHRoaXMuaW5wdXRXaWR0aDtcbiAgICAgIGNvbnN0IHRhZ3MgPSB0aGlzLnRhZ0NvbnRhaW5lcj8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudmFsdWUtdGFnJyk7XG4gICAgICBpZiAodGFncykge1xuICAgICAgICBsZXQgd2lkdGggPSAwO1xuICAgICAgICBsZXQgZmlyc3RUYWdXaWR0aCA9IDA7XG5cbiAgICAgICAgdGFncy5mb3JFYWNoKCh0YWc6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIHdpZHRoICs9IHRhZy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgICAgIGlmICghaW5kZXgpIHtcbiAgICAgICAgICAgIGZpcnN0VGFnV2lkdGggPSB3aWR0aDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbnBXaWR0aCA9IHRoaXMuZm9ybUZpZWxkRWxlbWVudD8ubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIDIwO1xuICAgICAgICAgIHRoaXMuZmlyc3RUYWdNYXhXaWR0aCA9XG4gICAgICAgICAgICB0YWdzLmxlbmd0aCA+IDFcbiAgICAgICAgICAgICAgPyBpbnBXaWR0aCAtXG4gICAgICAgICAgICAgICAgKHRoaXMudmFyaWFudCA9PT0gRHJvcGRvd25WYXJpYXRpb24uRFJPUERPV05cbiAgICAgICAgICAgICAgICAgID8gUGFkZGluZy5EUk9QRE9XTl9TUEFDRV9DT05UQUlORVJcbiAgICAgICAgICAgICAgICAgIDogUGFkZGluZy5BVVRPQ09NUExFVEVfU1BBQ0VfQ09OVEFJTkVSKVxuICAgICAgICAgICAgICA6IGlucFdpZHRoO1xuXG4gICAgICAgICAgaWYgKCF0aGlzLmlzT3ZlckxhcHBpbmcgJiYgd2lkdGggPiBpbnB1dFdpZHRoICYmIGluZGV4ID4gMCkge1xuICAgICAgICAgICAgdGhpcy5pc092ZXJMYXBwaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxhcEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pc092ZXJsYXBDaGVja2luZyA9IGZhbHNlO1xuICAgICAgICBpZiAoaW5pdCkge1xuICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09IHRoaXMuYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEUpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLnRyYW5zZm9ybURpc3BsYXlWYWx1ZSh0aGlzLnZhbHVlWzBdLCB0aGlzLnRleHRGaWVsZCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICcgJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFnQ29udGFpbmVyV2lkdGggPSB0aGlzLnRhZ0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICB0aGlzLnRhZ0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LnN0eWxlLm1heFdpZHRoID0gdGFnQ29udGFpbmVyV2lkdGggLyAxMDAgPyAnMTAwJScgOiB0YWdDb250YWluZXJXaWR0aCArICdweCc7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgICAgdGhpcy5pbnB1dE9wYWNpdHkgPSAxO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxuXG4gIHByaXZhdGUgb25VcGRhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dFZhbHVlU2VhcmNoJC5uZXh0KCcnKTtcbiAgICB0aGlzLnVzZXJJbnB1dCQubmV4dCgnJyk7XG4gICAgaWYgKCF0aGlzLnZhbHVlUHJpbWl0aXZlKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy50eXBlID09PSBBdXRvY29tcGxldGUuU0lOR0xFKSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZVt0aGlzLnZhbHVlRmllbGRdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZS5tYXAoKHY6IGFueSkgPT4gdlt0aGlzLnZhbHVlRmllbGRdKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRWYWx1ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50eXBlID09PSB0aGlzLmF1dG9jb21wbGV0ZVR5cGUuU0lOR0xFICYmIHRoaXMudmFyaWFudCAhPT0gRHJvcGRvd25WYXJpYXRpb24uRFJPUERPV04pIHtcbiAgICAgIGlmIChBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLnRyYW5zZm9ybURpc3BsYXlWYWx1ZSh0aGlzLnZhbHVlWzBdLCB0aGlzLnRleHRGaWVsZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSB0aGlzLnZhbHVlID8gQXV0b2NvbXBsZXRlVXRpbHMudHJhbnNmb3JtRGlzcGxheVZhbHVlKHRoaXMudmFsdWUsIHRoaXMudGV4dEZpZWxkKSA6ICcnO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy52YXJpYW50ID09PSBEcm9wZG93blZhcmlhdGlvbi5EUk9QRE9XTikge1xuICAgICAgdGhpcy5pbnB1dFZhbHVlID1cbiAgICAgICAgKEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodGhpcy52YWx1ZSkgJiYgIXRoaXMudmFsdWU/Lmxlbmd0aCkgfHwgIXRoaXMudmFsdWVcbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiB0aGlzLnR5cGUgPT09IEF1dG9jb21wbGV0ZS5TSU5HTEVcbiAgICAgICAgICA/IEF1dG9jb21wbGV0ZVV0aWxzLnRyYW5zZm9ybURpc3BsYXlWYWx1ZShcbiAgICAgICAgICAgICAgQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh0aGlzLnZhbHVlKSA/IHRoaXMudmFsdWVbMF0gOiB0aGlzLnZhbHVlLFxuICAgICAgICAgICAgICB0aGlzLnRleHRGaWVsZFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogJyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlucHV0VmFsdWUgPSB0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUubGVuZ3RoID8gJyAnIDogJyc7XG4gICAgfVxuICAgIGlmICh0aGlzLnR5cGUgPT09IHRoaXMuYXV0b2NvbXBsZXRlVHlwZS5NVUxUSSkge1xuICAgICAgdGhpcy5jaGVja092ZXJsYXAoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZE5ld1ZhbHVlKG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50eXBlICE9PSB0aGlzLmF1dG9jb21wbGV0ZVR5cGUuU0lOR0xFICYmICF0aGlzLnZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgZm91bmREdXBsaWNhdGUgPSB0aGlzLmNvbXBhcmVXaXRoXG4gICAgICA/IHRoaXMudmFsdWUuZmluZCgodjogYW55KSA9PiB0aGlzLmNvbXBhcmVXaXRoKHYsIG5ld1ZhbHVlKSlcbiAgICAgIDogQXV0b2NvbXBsZXRlVXRpbHMuZmluZER1cGxpY2F0ZSh0aGlzLnZhbHVlLCBuZXdWYWx1ZSwgdGhpcy50ZXh0RmllbGQpO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gdGhpcy5hdXRvY29tcGxldGVUeXBlLlNJTkdMRSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGZvdW5kRHVwbGljYXRlXG4gICAgICAgID8gdGhpcy52YWx1ZS5maWx0ZXIoKHY6IGFueSkgPT5cbiAgICAgICAgICAgIHRoaXMuY29tcGFyZVdpdGggPyAhdGhpcy5jb21wYXJlV2l0aCh2LCBmb3VuZER1cGxpY2F0ZSkgOiB2ICE9PSBmb3VuZER1cGxpY2F0ZVxuICAgICAgICAgIClcbiAgICAgICAgOiBbLi4udGhpcy52YWx1ZSwgbmV3VmFsdWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBpc0Ryb3Bkb3duKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZhcmlhbnQgPT09IERyb3Bkb3duVmFyaWF0aW9uLkRST1BET1dOO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2hldnJvbkNsaWNrKGF1dG9jb21wbGV0ZTogTWF0QXV0b2NvbXBsZXRlKTogdm9pZCB7XG4gICAgaWYgKGF1dG9jb21wbGV0ZS5pc09wZW4pIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZS5jbG9zZVBhbmVsKCk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlucHV0V2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5mb3JtRmllbGRFbGVtZW50Py5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC1cbiAgICAgICh0aGlzLmlzRHJvcGRvd24gPyBQYWRkaW5nLkRST1BET1dOX0NPTlRBSU5FUiA6IFBhZGRpbmcuQVVUT0NPTVBMRVRFX0NPTlRBSU5FUilcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRyYWNrQnlGbiA9IChpbmRleDogbnVtYmVyLCB2YWx1ZTogYW55KSA9PiB2YWx1ZS5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5O1xuXG4gIC8qKlxuICAgKiBBZGRpbmcgY29tcGFueSBjb2xvciB2YXJpYWJsZSB0byB0aGUgYm9keSB0byBzdHlsZSBvdmVybGF5IGNvbnRhaW5lciB0aGF0J3Mgb3V0IG9mIHRoZSBjb21wb25lbnQgc2NvcGUuXG4gICAqL1xuICBwcml2YXRlIHNldENvbXBhbnlDb2xvclZhcmlhYmxlKCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoJy0tdWktYXV0b2NvbXBsZXRlLW9wdGlvbi1jb2xvcicsIGAke3RoaXMuY29tcGFueUNvbG9yfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVyRGlzcGxheUNoYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCBhdXRvY29tcGxldGVIb3N0RWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcblxuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgbXV0YXRpb25zLmZvckVhY2gobXV0YXRpb24gPT4ge1xuICAgICAgICBpZiAobXV0YXRpb24uYXR0cmlidXRlTmFtZSA9PT0gJ3N0eWxlJykge1xuICAgICAgICAgIGNvbnN0IGRpc3BsYXlTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoYXV0b2NvbXBsZXRlSG9zdEVsZW1lbnQpLmRpc3BsYXk7XG4gICAgICAgICAgaWYgKGRpc3BsYXlTdHlsZSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrT3ZlcmxhcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoYXV0b2NvbXBsZXRlSG9zdEVsZW1lbnQsIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFsnc3R5bGUnXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaGFzT2JqZWN0VmFsdWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWUgPyAhIU9iamVjdC5rZXlzKHRoaXMudmFsdWUpLmxlbmd0aCA6IGZhbHNlO1xuICB9XG5cbiAgb25LZXlkb3duKCRldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IG9wdGlvbkhlaWdodCA9IDQ4O1xuXG4gICAgaWYgKCRldmVudC5rZXkgPT09IElLZXlib2FyZEV2ZW50LkhPTUUpIHtcbiAgICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlLl9rZXlNYW5hZ2VyLnNldEZpcnN0SXRlbUFjdGl2ZSgpO1xuICAgIH0gZWxzZSBpZiAoJGV2ZW50LmtleSA9PT0gSUtleWJvYXJkRXZlbnQuRU5EKSB7XG4gICAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5zZXRMYXN0SXRlbUFjdGl2ZSgpO1xuICAgIH0gZWxzZSBpZiAoJGV2ZW50LmtleSA9PT0gSUtleWJvYXJkRXZlbnQuUEFHRV9ET1dOKSB7XG4gICAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5zZXROZXh0SXRlbUFjdGl2ZSgpO1xuICAgICAgdGhpcy5tYXRBdXRvY29tcGxldGUuX2tleU1hbmFnZXIuc2V0TmV4dEl0ZW1BY3RpdmUoKTtcbiAgICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlLl9rZXlNYW5hZ2VyLnNldE5leHRJdGVtQWN0aXZlKCk7XG4gICAgfSBlbHNlIGlmICgkZXZlbnQua2V5ID09PSBJS2V5Ym9hcmRFdmVudC5QQUdFX1VQKSB7XG4gICAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5zZXRQcmV2aW91c0l0ZW1BY3RpdmUoKTtcbiAgICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlLl9rZXlNYW5hZ2VyLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO1xuICAgICAgdGhpcy5tYXRBdXRvY29tcGxldGUuX2tleU1hbmFnZXIuc2V0UHJldmlvdXNJdGVtQWN0aXZlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5tYXRBdXRvY29tcGxldGUuX3NldFNjcm9sbFRvcCh0aGlzLm1hdEF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5hY3RpdmVJdGVtSW5kZXghICogb3B0aW9uSGVpZ2h0KTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cImF1dG9jb21wbGV0ZS13cmFwcGVyXCIgW25nQ2xhc3NdPVwieyAnZnVsbC13aWR0aCc6IGZ1bGxXaWR0aCwgZGlzYWJsZWQ6IGRpc2FibGVkIH1cIj5cbiAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgIFtjb2xvcl09XCIoc2FmZUVycm9ycy5sZW5ndGggfHwgKG5nQ29udHJvbD8uZXJyb3JzICYmIG5nQ29udHJvbD8udG91Y2hlZCApIHx8IChBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpID4gbWF4SXRlbVNlbGVjdGVkIHx8ICgoQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoKSA+PSBtYXhJdGVtU2VsZWN0ZWQgJiYgaW5wdXRWYWx1ZSkgKSA/ICd3YXJuJyA6ICdhY2NlbnQnXCJcbiAgICAgIFthcHBlYXJhbmNlXT1cIidvdXRsaW5lJ1wiXG4gICAgICBbbmdDbGFzc109XCJ7ICdsYXJnZS1zaXplJzogdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5MQVJHRSwgJ2hpZGUtYm90dG9tLWNvbnRlbnQnOiAhc2hvd0JvdHRvbUNvbnRlbnQsICdrZXlib2FyZC1mb2N1c2VkJzoga2V5Ym9hcmRGb2N1c2VkKCksICdoYXMtbGFiZWwnOiAhIWxhYmVsIH1cIlxuICAgID5cbiAgICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJsYWJlbFwiPnt7IGxhYmVsIH19IDxzcGFuICpuZ0lmPVwicmVxdWlyZWRcIj4qPC9zcGFuPjwvbWF0LWxhYmVsPlxuICAgICAgPGRpdiAjZm9ybUZpZWxkIGNsYXNzPVwiaW5wdXQtY29udGFpbmVyXCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAtOTk5OXB4XCIgKm5nSWY9XCJ0ZXh0RmllbGQgPyB2YWx1ZT8uW3RleHRGaWVsZF0gOiB2YWx1ZSA9PT0gaW5wdXRWYWx1ZVwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPnt7ICgoJ1NFTEVDVEVEJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jKSArICcgJyArIGlucHV0VmFsdWUgfX08L3NwYW4+XG5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgI3RyaWdnZXI9XCJtYXRBdXRvY29tcGxldGVUcmlnZ2VyXCJcbiAgICAgICAgICAjbWF0SW5wdXRcbiAgICAgICAgICBbdWlQcmV2ZW50SW5wdXRdPVwiIWFsbG93VXNlcklucHV0XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3Vuc2V0LW1hcmdpbic6IHRoaXMudmFsdWUgJiYgdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5MQVJHRSwgJ25vLWNhcmV0JzogIWFsbG93VXNlcklucHV0IH1cIlxuICAgICAgICAgIChibHVyKT1cInJlZmlsbElucHV0KClcIlxuICAgICAgICAgIChmb2N1c2luKT1cIm9uRm9jdXMoKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoKHRyYW5zbGF0aW9uQ29udGV4dCArICdTRUxFQ1RFRCcpIHwgdWlUcmFuc2xhdGUgfCBhc3luYykgKyAnICcgKyAodmFsdWUgfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgOiB0cnVlKVwiXG4gICAgICAgICAgW3N0eWxlLm9wYWNpdHldPVwidHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5NVUxUSSA/IGlucHV0T3BhY2l0eSA6IDFcIlxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInZhbHVlICYmIHZhbHVlLmxlbmd0aCA/ICcnOiBwbGFjZWhvbGRlclwiXG4gICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJpbnB1dFZhbHVlXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic2VsZWN0ZWQtaXRlbXNcIlxuICAgICAgICAgICN0YWdDb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgKHR5cGUgPT09IGF1dG9jb21wbGV0ZVR5cGUuTEFSR0UgJiYgdGhpcy52YWx1ZSkgfHxcbiAgICAgICAgICAgICghKGlucHV0VmFsdWUgJiYgdGhpcy5pc0lucHV0Rm9jdXMpICYmIHRoaXMudmFsdWUgJiYgdHlwZSAhPT0gYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEUpXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx1aS10YWdcbiAgICAgICAgICAgIGNsYXNzPVwidmFsdWUtdGFnXCJcbiAgICAgICAgICAgIFtpZF09XCIndWktdGFnLScgKyBpXCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCB2YWx1ZUl0ZW0gb2YgdmFsdWU7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgW2xhYmVsXT1cInZhbHVlSXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZFwiXG4gICAgICAgICAgICBbYWxsb3dDbG9zZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgW3N0eWxlLm9wYWNpdHldPVwidHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5NVUxUSSA/IGlucHV0T3BhY2l0eSA6IDFcIlxuICAgICAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwiKGlzT3ZlckxhcHBpbmcgJiYgaSA+IDAgJiYgaSA+PSBvdmVybGFwSW5kZXgpIHx8IChzaXplID09PSAnc21hbGwnICYmIHZhbHVlLmxlbmd0aCA+IDEpICA/ICdub25lJyA6ICdibG9jaydcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnLS10YWctbWF4LXdpZHRoJzogdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5MQVJHRSA/ICdmaXQtY29udGVudCcgOiBmaXJzdFRhZ01heFdpZHRoICsgJ3B4JyB9XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgJ292ZXJsYXAtdGFnJzogaXNPdmVybGFwQ2hlY2tpbmcgJiYgb3ZlcmxhcEluZGV4ICYmIGkgPj0gb3ZlcmxhcEluZGV4ICYmIHR5cGUgPT09IGF1dG9jb21wbGV0ZVR5cGUuTVVMVElcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgKGNsb3NlKT1cIm9uT3B0aW9uUmVtb3ZlZCh2YWx1ZUl0ZW0pXCJcbiAgICAgICAgICA+PC91aS10YWc+XG4gICAgICAgICAgQGlmIChzaXplID09PSAnc21hbGwnKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWQtY291bnRcIiAqbmdJZj1cInZhbHVlLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICAgICAge3sgKHRyYW5zbGF0aW9uQ29udGV4dCArICdTRUxFQ1RFRF9BTU9VTlQnIHwgdWlUcmFuc2xhdGUgOiB7IG51bWJlclNlbGVjdGVkOiAodmFsdWUgfCBzbGljZTogb3ZlcmxhcEluZGV4KS5sZW5ndGggfSkgfCBhc3luYyB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidmFsdWUubGVuZ3RoID4gMSAmJiBpc092ZXJMYXBwaW5nXCIgY2xhc3M9XCJvdmVybGFwLWNvdW50XCI+XG4gICAgICAgICAgICAgIDx1aS10YWcgW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicrJyArICh2YWx1ZS5sZW5ndGggLSBvdmVybGFwSW5kZXgpXCI+PC91aS10YWc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDx1aS1pY29uXG4gICAgICAgICpuZ0lmPVwiY2xlYXJhYmxlICYmICh0eXBlID09PSBhdXRvY29tcGxldGVUeXBlLlNJTkdMRSAmJiAodmFsdWU/Lmxlbmd0aCB8fCBoYXNPYmplY3RWYWx1ZSkpIHx8ICh0eXBlICE9PSBhdXRvY29tcGxldGVUeXBlLlNJTkdMRSAmJiB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPiAxICYmICgoQXV0b2NvbXBsZXRlVXRpbHMuaXNQcmltaXRpdmUodmFsdWUpICYmIHZhbHVlLmxlbmd0aCkgfHwgKCFBdXRvY29tcGxldGVVdGlscy5pc1ByaW1pdGl2ZSh2YWx1ZSkgJiYgKEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCB8fCAhQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2YWx1ZSkgJiYgIXZhbHVlLmxlbmd0aCkpKSlcIlxuICAgICAgICBjbGFzcz1cInJlbW92ZS1zZWxlY3RlZFwiXG4gICAgICAgIFt0YWJJbmRleF09XCJkaXNhYmxlZCA/IC0xIDogMFwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uQ2xlYXIoKTskZXZlbnQucHJldmVudERlZmF1bHQoKTskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJvbkNsZWFyKCk7JGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnbGFyZ2UtaW5wdXQtaWNvbic6IHR5cGUgPT09IGF1dG9jb21wbGV0ZVR5cGUuTEFSR0UgfVwiXG4gICAgICAgIChjbGljayk9XCJvbkNsZWFyKCk7JGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgW3NpemVdPVwiJzI0J1wiXG4gICAgICAgIFtjb2xvcl09XCJhcHBsaWNhdGlvblRoZW1lID09PSAnY2xhc3NpYycgPyAnaW5oZXJpdCcgOiAncmVicmFuZC1ibGFjaydcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIignQ09NTU9OLkNMRUFSJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jXCJcbiAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0Nsb3NlJyA6ICdDbG9zZS1pbi1saW5lJ1wiXG4gICAgICA+PC91aS1pY29uPlxuXG4gICAgICA8dWktaWNvblxuICAgICAgICBjbGFzcz1cImFycm93LXN0YXRlXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyBvcGVuZWQ6IGF1dG9jb21wbGV0ZS5pc09wZW4sICdsYXJnZS1pbnB1dC1pY29uJzogdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5MQVJHRSB9XCJcbiAgICAgICAgKm5nSWY9XCJpc0Ryb3Bkb3duXCJcbiAgICAgICAgW3NpemVdPVwiJzI0J1wiXG4gICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgIT09ICdjbGFzc2ljJyA/ICdBcnJvdy1jaGV2cm9uLWRvd24taW4tbGluZScgOiAnQXJyb3dfZG93bidcIlxuICAgICAgICAoY2xpY2spPVwib25DaGV2cm9uQ2xpY2soYXV0b2NvbXBsZXRlKVwiXG4gICAgICA+PC91aS1pY29uPlxuXG5cbiAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXG4gICAgICAgICNhdXRvY29tcGxldGVcbiAgICAgICAgW2NsYXNzXT1cImFwcGxpY2F0aW9uVGhlbWUgKyAnICcgKyBkcm9wZG93blBhbmVsQ2xhc3NcIlxuICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25PcHRpb25TZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgW2Rpc2FibGVSaXBwbGVdPVwiYXBwbGljYXRpb25UaGVtZSAhPT0gJ2NsYXNzaWMnXCJcbiAgICAgICAgW2hpZGVTaW5nbGVTZWxlY3Rpb25JbmRpY2F0b3JdPVwiZmFsc2VcIlxuICAgICAgICAob3BlbmVkKT1cImdvdG9VcCgpXCJcbiAgICAgID5cbiAgICAgICAgQGlmICh0eXBlICE9PSBhdXRvY29tcGxldGVUeXBlLk1VTFRJIHx8IHZhbHVlPy5sZW5ndGggPCBtYXhJdGVtU2VsZWN0ZWQpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIShzZWFyY2hSZXN1bHQkIHwgYXN5bmMpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzRHJvcGRvd247IGVsc2UgZHJvcGRvd25MaXN0XCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0Z3JvdXAgW2xhYmVsXT1cIigodHJhbnNsYXRpb25Db250ZXh0ICsgJ1NVR0dFU1RFRCcpIHwgdWlUcmFuc2xhdGUgfCBhc3luYykhIHwgdXBwZXJjYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN1Z2dlc3Rpb25zTGlzdC5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9JGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IHN1Z2dlc3RlZCB8IGluY2x1ZGVzOiB2YWx1ZSA6IHZhbHVlRmllbGQgfVwiXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc3VnZ2VzdGVkIG9mIHN1Z2dlc3Rpb25zTGlzdFwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic3VnZ2VzdGVkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbc2VsZWN0VGV4dF09XCJ1c2VySW5wdXQkIHwgYXN5bmNcIj57eyBzdWdnZXN0ZWQgfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cblxuICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwIFtsYWJlbF09XCIoKHRyYW5zbGF0aW9uQ29udGV4dCArICdTRUxFQ1RFRCcpIHwgdWlUcmFuc2xhdGUgfCBhc3luYykhIHwgdXBwZXJjYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInZhbHVlPy5sZW5ndGggJiYgdHlwZSAhPT0gYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9JGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IGl0ZW0gfCBpbmNsdWRlczogdmFsdWUgOiB2YWx1ZUZpZWxkIH1cIlxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdmFsdWVcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cblxuICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwIFtsYWJlbF09XCIoKHRyYW5zbGF0aW9uQ29udGV4dCArICdTRUxFQ1RFRCcpIHwgdWlUcmFuc2xhdGUgfCBhc3luYykhIHwgdXBwZXJjYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInZhbHVlPy5sZW5ndGggJiYgdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9JGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCInc2VsZWN0ZWQtb3B0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtzZWxlY3RUZXh0XT1cInVzZXJJbnB1dCQgfCBhc3luY1wiPnt7IHZhbHVlIHwgdHJhbnNmb3JtSXRlbTogdGV4dEZpZWxkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJhcHBsaWNhdGlvblRoZW1lID09PSAnY2xhc3NpYycgPyAnQ2hlY2snIDogJ0NoZWNrLWluLWxpbmUnXCI+PC91aS1pY29uPlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkcm9wZG93bkxpc3Q+XG4gICAgICAgICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQgKm5nSWY9XCJ2aXJ0dWFsU2Nyb2xsOyBlbHNlIGRlZmF1bHRWaWV3UG9ydFwiIFtpdGVtU2l6ZV09XCI0OFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodF09XCInMjAwcHgnXCIgY2xhc3M9XCJ2aXJ0dWFsLXNjcm9sbFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT0kZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogaXRlbSB8IGluY2x1ZGVzOiB2YWx1ZSA6IHZhbHVlRmllbGQgfVwiXG4gICAgICAgICAgICAgICAgICAqY2RrVmlydHVhbEZvcj1cImxldCBpdGVtIG9mIGl0ZW1zTGlzdFwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwidXNlcklucHV0JCB8IGFzeW5jXCI+e3sgaXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDx1aS1pY29uIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0NoZWNrJyA6ICdDaGVjay1pbi1saW5lJ1wiPjwvdWktaWNvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFZpZXdQb3J0PlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT0kZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogaXRlbSB8IGluY2x1ZGVzOiB2YWx1ZSA6IHZhbHVlRmllbGQgfVwiXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc0xpc3RcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtzZWxlY3RUZXh0XT1cInVzZXJJbnB1dCQgfCBhc3luY1wiPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyZWRTdWdnZXN0aW9uTGlzdCQgfCBhc3luYyBhcyBmaWx0ZXJlZFN1Z2dlc3Rpb25MaXN0XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyZWRJdGVtc0xpc3QkIHwgYXN5bmMgYXMgZmlsdGVyZWRJdGVtc0xpc3RcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRncm91cCBbbGFiZWxdPVwiKCh0cmFuc2xhdGlvbkNvbnRleHQgKyAnU1VHR0VTVEVEJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jKSEgfCB1cHBlcmNhc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmlsdGVyZWRTdWdnZXN0aW9uTGlzdC5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9JGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IGl0ZW0gfCBpbmNsdWRlczogdmFsdWUgOiB2YWx1ZUZpZWxkIH1cIlxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRTdWdnZXN0aW9uTGlzdFwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwidXNlcklucHV0JCB8IGFzeW5jXCI+e3sgaXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDx1aS1pY29uIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0NoZWNrJyA6ICdDaGVjay1pbi1saW5lJ1wiPjwvdWktaWNvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGdyb3VwPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmlsdGVyZWRTdWdnZXN0aW9uTGlzdC5sZW5ndGg7IGVsc2Ugc2hvd0l0ZW1MaXN0V2l0aEdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZC1vcHRpb24nOiBpdGVtIHwgaW5jbHVkZXM6IHZhbHVlIDogdmFsdWVGaWVsZCB9XCJcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkSXRlbXNMaXN0XCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbc2VsZWN0VGV4dF09XCJ1c2VySW5wdXQkIHwgYXN5bmNcIj57eyBpdGVtIHwgdHJhbnNmb3JtSXRlbTogdGV4dEZpZWxkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJhcHBsaWNhdGlvblRoZW1lID09PSAnY2xhc3NpYycgPyAnQ2hlY2snIDogJ0NoZWNrLWluLWxpbmUnXCI+PC91aS1pY29uPlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzaG93SXRlbUxpc3RXaXRoR3JvdXA+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRncm91cCBbbGFiZWxdPVwiKCh0cmFuc2xhdGlvbkNvbnRleHQgKyAnQUxMX0lURU1TJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jKSEgfCB1cHBlcmNhc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmaWx0ZXJlZEl0ZW1zTGlzdC5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IGl0ZW0gfCBpbmNsdWRlczogdmFsdWUgOiB2YWx1ZUZpZWxkIH1cIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJlZEl0ZW1zTGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwidXNlcklucHV0JCB8IGFzeW5jXCI+e3sgaXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmaWx0ZXJlZEl0ZW1zTGlzdC5sZW5ndGggJiYgIWZpbHRlcmVkU3VnZ2VzdGlvbkxpc3QubGVuZ3RoICYmIGlucHV0VmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWxsb3dBZGQ7IGVsc2Ugbm90Rm91bmRcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpIFt2YWx1ZV09XCJpbnB1dFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ICgnQ09NTU9OLkFERCcpIHwgdWlUcmFuc2xhdGUgfCBhc3luYyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhZGQtc3VnZ2VzdGlvblwiPlwie3sgaW5wdXRWYWx1ZSB9fVwiPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub3RGb3VuZD5cbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFtzdHlsZS5wb2ludGVyLWV2ZW50c109XCInbm9uZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgKHRyYW5zbGF0aW9uQ29udGV4dCArICdOT19SRVNVTFRTX0ZPVU5EJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICAgIDxtYXQtaGludCBjbGFzcz1cImVycm9yXCIgKm5nSWY9XCJzYWZlRXJyb3JzLmxlbmd0aCB8fCAobmdDb250cm9sPy5lcnJvcnMgfCBoYXNWYWxpZGF0aW9uRXJyb3IpIHx8IChBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpID4gbWF4SXRlbVNlbGVjdGVkIHx8ICgoQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoKSA+PSBtYXhJdGVtU2VsZWN0ZWQgJiYgaW5wdXRWYWx1ZSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVycm9yc1wiICpuZ0lmPVwiKEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCkgPiBtYXhJdGVtU2VsZWN0ZWQgfHwgKChBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpID49IG1heEl0ZW1TZWxlY3RlZCAmJiBpbnB1dFZhbHVlKVwiPlxuICAgICAgICAgIDx1aS1pY29uIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIiBbbmFtZV09XCInRXJyb3InXCI+PC91aS1pY29uPlxuICAgICAgICAgIDxzcGFuPnt7ICh0cmFuc2xhdGlvbkNvbnRleHQgKyAnTUFYX1NFTEVDVEVEX0VSUk9SJykgfCB1aVRyYW5zbGF0ZSA6IHsgbWF4OiBtYXhJdGVtU2VsZWN0ZWQgfSB8IGFzeW5jIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNhZmVFcnJvcnMubGVuZ3RoXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVycm9yc1wiICpuZ0Zvcj1cImxldCBlcnJvciBvZiBzYWZlRXJyb3JzOyB0cmFja0J5OiB0cmFja0J5Rm5cIj5cbiAgICAgICAgICAgIDx1aS1pY29uIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIiBbbmFtZV09XCInRXJyb3InXCI+PC91aS1pY29uPlxuICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJlcnJvclwiPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDx1aS12YWxpZGF0aW9uLWVycm9yICpuZ0lmPVwibmdDb250cm9sICYmICFoaWRlQnVpbHRJbkVycm9yc1wiIFtuZ0NvbnRyb2xdPVwibmdDb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImhpZGVMYWJlbEluRXJyb3JzID8gbnVsbCA6IGxhYmVsXCI+PC91aS12YWxpZGF0aW9uLWVycm9yPlxuXG4gICAgICA8L21hdC1oaW50PlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4iXX0=
716
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rnby1jYW5vcHktdWkvY29tcG9uZW50cy9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rnby1jYW5vcHktdWkvY29tcG9uZW50cy9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBRXZCLFNBQVMsRUFJVCxZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sRUFDTixXQUFXLEVBQ1gsSUFBSSxFQUNKLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXJELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFDTCxZQUFZLEVBR1osaUJBQWlCLEVBQ2pCLE9BQU8sRUFDUCxPQUFPLEdBQ1IsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUXBFLG9FQUFvRTtBQUNwRSxNQUFNLE9BQU8scUJBQXFCO0lBeURoQzs7OztPQUlHO0lBQ0gsSUFBYSxTQUFTLENBQUMsQ0FB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SztzQkFBZCxNQUFNO2dCQUVpQixnQkFBZ0I7c0JBQXZDLFNBQVM7dUJBQUMsV0FBVztnQkFDSyxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0gsWUFBWTtzQkFBakMsU0FBUzt1QkFBQyxTQUFTO2dCQUNvQyx3QkFBd0I7c0JBQS9FLFNBQVM7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUMzQixlQUFlO3NCQUF6QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0YsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgRG9DaGVjayxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUExBVEZPUk1fSUQsXG4gIFNlbGYsXG4gIHNpZ25hbCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGUsIE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQsIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgbWFwLCBSZXBsYXlTdWJqZWN0LCBzdGFydFdpdGggfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uVGhlbWUgfSBmcm9tICcuLi8uLi9tb2RlbHMvYXBwbGljYXRpb24tdGhlbWUubW9kZWwnO1xuaW1wb3J0IHsgQXV0b2NvbXBsZXRlVXRpbHMgfSBmcm9tICcuLi8uLi91dGlscy9hdXRvY29tcGxldGUtdXRpbHMnO1xuaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlLFxuICBBdXRvY29tcGxldGVTaXplLFxuICBBdXRvY29tcGxldGVUeXBlLFxuICBEcm9wZG93blZhcmlhdGlvbixcbiAgUGFkZGluZyxcbiAgVGltZW91dCxcbn0gZnJvbSAnLi9hdXRvY29tcGxldGUubW9kZWwnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9jdXNNb25pdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgSUtleWJvYXJkRXZlbnQgfSBmcm9tICcuLi8uLi9tb2RlbHMva2V5Ym9hcmQtZXZlbnRzLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndWktYXV0b2NvbXBsZXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWNvbmZsaWN0aW5nLWxpZmVjeWNsZVxuZXhwb3J0IGNsYXNzIEF1dG9jb21wbGV0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIERvQ2hlY2ssIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBAcHJvcGVydHkgaXRlbXNMaXN0XG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbGlzdCBvZiBpdGVtcyB0byBkaXNwbGF5IGluIHRoZSBhdXRvY29tcGxldGUuXG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGl0ZW1zTGlzdDogYW55W10gPSBbXTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IHN1Z2dlc3Rpb25zTGlzdFxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxpc3Qgb2Ygc3VnZ2VzdGlvbnMgdG8gZGlzcGxheSBpbiB0aGUgYXV0b2NvbXBsZXRlLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBzdWdnZXN0aW9uc0xpc3Q6IGFueVtdID0gW107XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb24gSWYgYHRydWVgLCB0aGUgYXV0b2NvbXBsZXRlIGlzIGRpc2FibGVkLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYWxsb3dBZGRcbiAgICogQGRlc2NyaXB0aW9uIElmIGB0cnVlYCwgYWxsb3dzIGFkZGluZyBuZXcgdmFsdWVzIHRvIHRoZSBhdXRvY29tcGxldGUuXG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGFsbG93QWRkID0gdHJ1ZTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IHRleHRGaWVsZFxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGZpZWxkIHRvIGJlIHVzZWQgYXMgdGhlIGRpc3BsYXkgdGV4dCBpbiB0aGUgYXV0b2NvbXBsZXRlLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSB0ZXh0RmllbGQgPSAnJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhbHVlRmllbGRcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBmaWVsZCB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBpbiB0aGUgYXV0b2NvbXBsZXRlLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSB2YWx1ZUZpZWxkID0gJyc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBsYWJlbFxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxhYmVsIGZvciB0aGUgYXV0b2NvbXBsZXRlIGlucHV0LlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBsYWJlbCA9ICcnO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgcGxhY2Vob2xkZXJcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBwbGFjZWhvbGRlciBmb3IgdGhlIGF1dG9jb21wbGV0ZSBpbnB1dC5cbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhbHVlXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc2VsZWN0ZWQgdmFsdWUocykgaW4gdGhlIGF1dG9jb21wbGV0ZS5cbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgc2V0IGl0ZW1WYWx1ZSh2OiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlID0gQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2KSA/IHYgOiB2ID8gW3ZdIDogW107XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHR5cGVcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB0eXBlIG9mIHRoZSBhdXRvY29tcGxldGUgKCdzaW5nbGUnLCAnbXVsdGknLCBldGMuKS5cbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgdHlwZTogQXV0b2NvbXBsZXRlVHlwZSA9ICdtdWx0aSc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBtaW5DaGFyYWN0ZXJzU2VhcmNoXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbWluaW11bSBjaGFyYWN0ZXJzIHRvIHRyaWdnZXIgc2VhcmNoLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBtaW5DaGFyYWN0ZXJzU2VhcmNoID0gMztcblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhcmlhbnRcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB2YXJpYW50IG9mIEF1dG9jb21wbGV0ZVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSB2YXJpYW50ID0gRHJvcGRvd25WYXJpYXRpb24uQVVUT0NPTVBMRVRFO1xuXG4gIC8qKlxuICAgKiBTaG93IHJlc2VydmVkIGNvbnRlbnQgYmVsb3cgZm9ybSBmaWVsZFxuICAgKiBAcHJvcGVydHkgc2hvd0JvdHRvbUNvbnRlbnRcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIHNob3dCb3R0b21Db250ZW50ID0gdHJ1ZTtcblxuICAvKipcbiAgICogUmV0dXJuIGZ1bGwgb2JqZWN0IGlmIHRydWVcbiAgICogQHByb3BlcnR5IHZhbHVlUHJpbWl0aXZlXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSB2YWx1ZVByaW1pdGl2ZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0b3Igb2YgdGhlIGF1dG9jb21wbGV0ZSB3aWR0aFxuICAgKiBAcHJvcGVydHkgZnVsbFdpZHRoXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZ1bGwtd2lkdGgnKVxuICBASW5wdXQoKVxuICBmdWxsV2lkdGggPSBmYWxzZTtcblxuICAvKipcbiAgICpcbiAgICogRGVmaW5lcyB0aGUgYXBwbGljYXRpb24gdGhlbWVcbiAgICpcbiAgICogQHR5cGUge0FwcGxpY2F0aW9uVGhlbWV9XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBIb3N0QmluZGluZygnYXR0ci50aGVtZScpXG4gIEBJbnB1dCgpXG4gIGFwcGxpY2F0aW9uVGhlbWU6IEFwcGxpY2F0aW9uVGhlbWUgPSAnbGlnaHQnO1xuXG4gIC8qKlxuICAgKiBBdXRvY29tcGxldGUgaXMgcmVxdWlyZWQgb3Igbm90XG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5wdXQgZmllbGQgZXJyb3JzXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgc2V0IGVycm9ycyhlcnJvcnM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5zYWZlRXJyb3JzID0gZXJyb3JzPy5maWx0ZXIoQm9vbGVhbikubWFwKGVycm9yID0+IHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGVycm9yKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29sb3Igb2YgdGhlIG9wdGlvbiBob3Zlci5cbiAgICogRGVmYXVsdHMgdG8gVGVzdCBHb3JpbGxhIHByaW1hcnkgY29sb3IuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGNvbXBhbnlDb2xvcjogc3RyaW5nIHwgbnVsbCA9ICcjRkZGMkZDJztcblxuICAvKipcbiAgICogSGlkZSBpbi1idWlsZCBlcnJvcnMgZm9yIFJlYWN0aXZlIEZvcm1zXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGhpZGVCdWlsdEluRXJyb3JzID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEhpZGUgbGFiZWwgaW4gZXJyb3JzXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGhpZGVMYWJlbEluRXJyb3JzID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgZHJvcGRvd24gbGlzdCB0byB2aXJ0dWFsIHNjcm9sbCBtb2RlXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgdmlydHVhbFNjcm9sbCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgY29tcGFyZVdpdGhcbiAgICogQGRlc2NyaXB0aW9uIEN1c3RvbSBjb21wYXJpc29uIGxvZ2ljIGZvciB0aGUgYXV0b2NvbXBsZXRlLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBjb21wYXJlV2l0aDogKGE6IGFueSwgYjogYW55KSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZHJvcGRvd25QYW5lbENsYXNzXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIGNsYXNzIG9uIGF1dG9jb21wbGV0ZSBkcm9wZG93blxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBkcm9wZG93blBhbmVsQ2xhc3MgPSAnJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IGNsb3NlT25TY3JvbGxcbiAgICogQGRlc2NyaXB0aW9uIERlZmluZXMgaWYgZHJvcGRvd24gc2hvdWxkIGJlIGNsb3NlZCBvbiBwYWdlIHNjcm9sbFxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBjbG9zZU9uU2Nyb2xsID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBBdXRvY29tcGxldGVTaXplXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIHRoZSBzaXplIG9mIHRoZSBhdXRvY29tcGxldGUuIFNtYWxsIGNoYW5nZXMgdGhlIHRhZ3MgdG8gY291bnRlcjsgbWVkaXVtIGlzIGRlZmF1bHQuXG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIHNpemU6IEF1dG9jb21wbGV0ZVNpemUgPSAnbWVkaXVtJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IGFsbG93VXNlcklucHV0XG4gICAqIEBkZXNjcmlwdGlvbiBJZiBgdHJ1ZWAsIGFsbG93cyB0aGUgdXNlciB0byBpbnB1dCBjdXN0b20gdmFsdWVzIGluIHRoZSBhdXRvY29tcGxldGUuXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBhbGxvd1VzZXJJbnB1dCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBjbGVhcmFibGVcbiAgICogQGRlc2NyaXB0aW9uIElmIGB0cnVlYCwgYWxsb3dzIHRoZSB1c2VyIHRvIGNsZWFyIHRoZSBpbnB1dCB2YWx1ZXNcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGNsZWFyYWJsZSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBleGFjdE1hdGNoU2VsZWN0XG4gICAqIEBkZXNjcmlwdGlvbiBJZiBgdHJ1ZWAsIGFsbG93cyB0byBzZWxlY3QgdGhlIGV4YWN0IG1hdGNoIGZyb20gdGhlIHN1Z2dlc3Rpb25zIGxpc3RcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGV4YWN0TWF0Y2hTZWxlY3QgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgbWF4SXRlbVNlbGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBzZWxlY3RlZCBpbiB0aGUgYXV0b2NvbXBsZXRlXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBtYXhJdGVtU2VsZWN0ZWQgPSBJbmZpbml0eTtcblxuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hUZXh0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBibHVyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgnZm9ybUZpZWxkJykgZm9ybUZpZWxkRWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3RhZ0NvbnRhaW5lcicpIHRhZ0NvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXInKSBhdXRvY29tcGxldGU6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXI7XG4gIEBWaWV3Q2hpbGQoQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCB7IHN0YXRpYzogZmFsc2UgfSkgY2RrVmlydHVhbFNjcm9sbFZpZXdQb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG4gIEBWaWV3Q2hpbGQoJ2F1dG9jb21wbGV0ZScpIG1hdEF1dG9jb21wbGV0ZTogTWF0QXV0b2NvbXBsZXRlO1xuICBAVmlld0NoaWxkKCdtYXRJbnB1dCcpIG1hdElucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gIHByb3RlY3RlZCBzYWZlRXJyb3JzOiBTYWZlSHRtbFtdID0gW107XG4gIHByb3RlY3RlZCB2YWx1ZTogYW55O1xuICBwcm90ZWN0ZWQgaW5wdXRWYWx1ZTogYW55ID0gJyc7XG4gIHByb3RlY3RlZCBpc0lucHV0Rm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGF1dG9jb21wbGV0ZVR5cGUgPSBBdXRvY29tcGxldGU7XG4gIHByb3RlY3RlZCBpc092ZXJMYXBwaW5nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc092ZXJsYXBDaGVja2luZyA9IHRydWU7XG4gIHByb3RlY3RlZCBvdmVybGFwSW5kZXggPSAwO1xuICBwcm90ZWN0ZWQgaW5wdXRPcGFjaXR5ID0gMTtcbiAgcHJvdGVjdGVkIGZpcnN0VGFnTWF4V2lkdGg6IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCBpbnB1dFZhbHVlU2VhcmNoJCA9IG5ldyBSZXBsYXlTdWJqZWN0PHN0cmluZz4oMSk7XG4gIHByb3RlY3RlZCB1c2VySW5wdXQkID0gbmV3IFJlcGxheVN1YmplY3Q8c3RyaW5nPigxKTtcbiAgcHJvdGVjdGVkIGZpbHRlcmVkSXRlbXNMaXN0JCA9IHRoaXMuaW5wdXRWYWx1ZVNlYXJjaCQucGlwZShcbiAgICBzdGFydFdpdGgoJycpLFxuICAgIG1hcChpbnB1dFZhbHVlID0+XG4gICAgICBpbnB1dFZhbHVlLmxlbmd0aCA/IEF1dG9jb21wbGV0ZVV0aWxzLmZpbHRlckl0ZW1zKHRoaXMuaXRlbXNMaXN0LCBpbnB1dFZhbHVlLCB0aGlzLnRleHRGaWVsZCkgOiBudWxsXG4gICAgKVxuICApO1xuICBwcm90ZWN0ZWQgZmlsdGVyZWRTdWdnZXN0aW9uTGlzdCQgPSB0aGlzLmlucHV0VmFsdWVTZWFyY2gkLnBpcGUoXG4gICAgbWFwKGlucHV0VmFsdWUgPT5cbiAgICAgIGlucHV0VmFsdWUubGVuZ3RoID8gQXV0b2NvbXBsZXRlVXRpbHMuZmlsdGVySXRlbXModGhpcy5zdWdnZXN0aW9uc0xpc3QsIGlucHV0VmFsdWUsIHRoaXMudGV4dEZpZWxkKSA6IG51bGxcbiAgICApXG4gICk7XG5cbiAgc2Nyb2xsRXZlbnQgPSAoZXZlbnQ6IGFueSk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGlzTm90QXV0b2NvbXBsZXRlU2Nyb2xsID1cbiAgICAgICFldmVudC50YXJnZXQ/LmlkPy5pbmNsdWRlcygnbWF0LWF1dG9jb21wbGV0ZS0nKSAmJlxuICAgICAgIWV2ZW50LnRhcmdldD8ucGFyZW50RWxlbWVudD8uaWQ/LmluY2x1ZGVzKCdtYXQtYXV0b2NvbXBsZXRlLScpICYmXG4gICAgICAhZXZlbnQudGFyZ2V0Py5jbGFzc0xpc3Q/LmNvbnRhaW5zKCdtYXQtbWRjLWF1dG9jb21wbGV0ZS10cmlnZ2VyJyk7XG5cbiAgICBpZiAodGhpcy5hdXRvY29tcGxldGUucGFuZWxPcGVuICYmIGlzTm90QXV0b2NvbXBsZXRlU2Nyb2xsKSB7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZS5jbG9zZVBhbmVsKCk7XG4gICAgfVxuICB9O1xuXG4gIHByb3RlY3RlZCBzZWFyY2hSZXN1bHQkID0gdGhpcy5pbnB1dFZhbHVlU2VhcmNoJC5waXBlKG1hcChpbnB1dFZhbHVlID0+ICEhaW5wdXRWYWx1ZS50cmltKCkpKTtcbiAgcHJvdGVjdGVkIHRyYW5zbGF0aW9uQ29udGV4dCA9ICdBVVRPQ09NUExFVEUuJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEF1dG9jb21wbGV0ZVV0aWxzID0gQXV0b2NvbXBsZXRlVXRpbHM7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNQbGF0Zm9ybSA9IGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCk7XG4gIHByaXZhdGUgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG4gIHByb3RlY3RlZCBrZXlib2FyZEZvY3VzZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoJ0NBTk9QWVVJX0RFRkFVTFRfQVBQTElDQVRJT05fVEhFTUUnKSBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRBcHBUaGVtZTogQXBwbGljYXRpb25UaGVtZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQ6IGFueSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZm9jdXNNb25pdG9yOiBGb2N1c01vbml0b3IsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmOiBEZXN0cm95UmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmdab25lOiBOZ1pvbmVcbiAgKSB7XG4gICAgaWYgKHRoaXMubmdDb250cm9sICE9IG51bGwpIHtcbiAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xuICAgIH1cblxuICAgIGlmIChkZWZhdWx0QXBwVGhlbWUpIHtcbiAgICAgIHRoaXMuYXBwbGljYXRpb25UaGVtZSA9IGRlZmF1bHRBcHBUaGVtZTtcbiAgICB9XG5cbiAgICB0aGlzLnN1YnNjcmliZXJEaXNwbGF5Q2hhbmdlKCk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBtYXJrIGNvbXBvbmVudCB2aWV3IGFzIGRpcnR5IHdoZW4gdG91Y2hlZCBwcm9ncmFtbWF0aWNhbGx5IHdpdGggbWFya0FzVG91Y2hlZC9tYXJrQWxsQXNUb3VjaGVkIG9yIGVycm9yc1xuICAgKiB0byBkaXNwbGF5IHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgbWlnaHQgaGFwcGVuIChlLmcuIHJlcXVpcmVkKVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1jb25mbGljdGluZy1saWZlY3ljbGVcbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm5nQ29udHJvbD8udG91Y2hlZCB8fCB0aGlzLm5nQ29udHJvbD8uZXJyb3JzKSB7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWNvbmZsaWN0aW5nLWxpZmVjeWNsZVxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtc0xpc3QgPSBBdXRvY29tcGxldGVVdGlscy5leGNsdWRlU3VnZ2VzdGlvbnModGhpcy5pdGVtc0xpc3QsIHRoaXMuc3VnZ2VzdGlvbnNMaXN0LCB0aGlzLnZhbHVlRmllbGQpO1xuICAgIHRoaXMuaW5pdFZhbHVlKCk7XG5cbiAgICBpZiAodGhpcy5pc1BsYXRmb3JtICYmIGNoYW5nZXNbJ2NvbXBhbnlDb2xvciddKSB7XG4gICAgICB0aGlzLnNldENvbXBhbnlDb2xvclZhcmlhYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1jb25mbGljdGluZy1saWZlY3ljbGVcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnR5cGUgIT09IEF1dG9jb21wbGV0ZS5MQVJHRSkge1xuICAgICAgdGhpcy5jaGVja092ZXJsYXAoVGltZW91dC5WSUVXX0lOSVRJQUxJWkVEX0NPTVBPTkVOVF9MT0FELCB0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5pc1BsYXRmb3JtICYmIHRoaXMuc2V0Q29tcGFueUNvbG9yVmFyaWFibGUoKTtcbiAgICBpZiAodGhpcy5jbG9zZU9uU2Nyb2xsKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5zY3JvbGxFdmVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5mb2N1c01vbml0b3JcbiAgICAgIC5tb25pdG9yKHRoaXMubWF0SW5wdXQpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUob3JpZ2luID0+XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5rZXlib2FyZEZvY3VzZWQuc2V0KG9yaWdpbiA9PT0gJ2tleWJvYXJkJyk7XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgdGhpcy5tYXRJbnB1dC5uYXRpdmVFbGVtZW50Lm9ua2V5ZG93biA9IHRoaXMub25LZXlkb3duLmJpbmQodGhpcyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWNvbmZsaWN0aW5nLWxpZmVjeWNsZVxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5zY3JvbGxFdmVudCwgdHJ1ZSk7XG5cbiAgICBpZiAodGhpcy5vYnNlcnZlcikge1xuICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcbiAgb25Ub3VjaCA9ICgpID0+IHt9O1xuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2ggPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmFsdWVQcmltaXRpdmUgJiYgdGhpcy50ZXh0RmllbGQgJiYgdGhpcy52YWx1ZUZpZWxkKSB7XG4gICAgICBpZiAodGhpcy50eXBlID09PSBBdXRvY29tcGxldGUuU0lOR0xFKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLml0ZW1zTGlzdC5maW5kKGl0ZW0gPT4gaXRlbVt0aGlzLnZhbHVlRmllbGRdID09PSB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlID0gQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICA/IHRoaXMuaXRlbXNMaXN0LmZpbHRlcihpdGVtID0+IHZhbHVlLmZpbmQoKHY6IGFueSkgPT4gdiA9PT0gaXRlbVt0aGlzLnZhbHVlRmllbGRdKSlcbiAgICAgICAgICA6IFt0aGlzLml0ZW1zTGlzdC5maW5kKGl0ZW0gPT4gaXRlbVt0aGlzLnZhbHVlRmllbGRdID09PSB2YWx1ZSldO1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoID8gdGhpcy52YWx1ZSA6IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5pbml0VmFsdWUoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbk9wdGlvblNlbGVjdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9IGV2ZW50Lm9wdGlvbi52YWx1ZTtcbiAgICBjb25zdCBpdGVtVmFsdWUgPSBBdXRvY29tcGxldGVVdGlscy5jcmVhdGVWYWx1ZUl0ZW0oaW5wdXRWYWx1ZSwgdGhpcy50ZXh0RmllbGQsIHRoaXMudmFsdWVGaWVsZCk7XG4gICAgdGhpcy5hZGROZXdWYWx1ZShpdGVtVmFsdWUpO1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gdGhpcy5hdXRvY29tcGxldGVUeXBlLk1VTFRJKSB7XG4gICAgICB0aGlzLmNoZWNrT3ZlcmxhcCgpO1xuICAgIH1cblxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnR5cGUgIT09IHRoaXMuYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEUpIHtcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBBdXRvY29tcGxldGVVdGlscy50cmFuc2Zvcm1EaXNwbGF5VmFsdWUodGhpcy52YWx1ZSwgdGhpcy50ZXh0RmllbGQpO1xuICAgICAgfVxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uVXBkYXRlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25PcHRpb25SZW1vdmVkKG9wdGlvbjogYW55KTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmF1dG9jb21wbGV0ZS5jbG9zZVBhbmVsKCksIDApO1xuICAgIGNvbnN0IGZvdW5kVmFsdWUgPSB0aGlzLnZhbHVlLmZpbmQoKHY6IGFueSkgPT4gKHRoaXMuY29tcGFyZVdpdGggPyB0aGlzLmNvbXBhcmVXaXRoKHYsIG9wdGlvbikgOiB2ID09PSBvcHRpb24pKTtcblxuICAgIGlmIChmb3VuZFZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIoKHY6IGFueSkgPT4gKHRoaXMuY29tcGFyZVdpdGggPyAhdGhpcy5jb21wYXJlV2l0aCh2LCBvcHRpb24pIDogdiAhPT0gb3B0aW9uKSk7XG4gICAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZS5vcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi52YWx1ZS52YWx1ZSA9PT0gZm91bmRWYWx1ZS52YWx1ZSkge1xuICAgICAgICAgIG9wdGlvbi5kZXNlbGVjdCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50eXBlID09PSB0aGlzLmF1dG9jb21wbGV0ZVR5cGUuTVVMVEkpIHtcbiAgICAgIHRoaXMuY2hlY2tPdmVybGFwKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbHVlLmxlbmd0aCkge1xuICAgICAgdGhpcy5pbnB1dFZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5vblVwZGF0ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW5wdXRDaGFuZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgdGhpcy51c2VySW5wdXQkLm5leHQoaW5wdXRWYWx1ZSk7XG4gICAgaWYgKGlucHV0VmFsdWUubGVuZ3RoID49IHRoaXMubWluQ2hhcmFjdGVyc1NlYXJjaCkge1xuICAgICAgdGhpcy5pbnB1dFZhbHVlU2VhcmNoJC5uZXh0KGlucHV0VmFsdWUpO1xuICAgICAgdGhpcy5zZWFyY2hUZXh0Q2hhbmdlLmVtaXQoaW5wdXRWYWx1ZSk7XG4gICAgICBjb25zdCBmaW5kVmFsdWUgPSBbLi4udGhpcy5zdWdnZXN0aW9uc0xpc3QsIC4uLnRoaXMuaXRlbXNMaXN0XS5maW5kKFxuICAgICAgICB2ID0+IGlucHV0VmFsdWUgPT09ICh0aGlzLnRleHRGaWVsZCA/IHZbdGhpcy50ZXh0RmllbGRdIDogdilcbiAgICAgICk7XG4gICAgICBjb25zdCBjb3VudCA9IEF1dG9jb21wbGV0ZVV0aWxzLmNvdW50TWF0Y2hpbmdXb3JkcyhcbiAgICAgICAgWy4uLnRoaXMuc3VnZ2VzdGlvbnNMaXN0LCAuLi50aGlzLml0ZW1zTGlzdF0sXG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSxcbiAgICAgICAgdGhpcy50ZXh0RmllbGRcbiAgICAgICk7XG4gICAgICBpZiAoZmluZFZhbHVlICYmIGNvdW50ID09PSAxICYmIHRoaXMuZXhhY3RNYXRjaFNlbGVjdCkge1xuICAgICAgICB0aGlzLm9uT3B0aW9uU2VsZWN0ZWQoeyBvcHRpb246IHsgdmFsdWU6IGZpbmRWYWx1ZSB9IH0gYXMgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZVNlYXJjaCQubmV4dCgnJyk7XG4gICAgICB0aGlzLnVzZXJJbnB1dCQubmV4dCgnJyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dFZhbHVlID0gJyc7XG4gICAgdGhpcy52YWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodGhpcy52YWx1ZSkgPyBbXSA6ICcnO1xuICAgIHRoaXMuaXNPdmVyTGFwcGluZyA9IGZhbHNlO1xuICAgIHRoaXMub3ZlcmxhcEluZGV4ID0gMDtcbiAgICB0aGlzLm9uVXBkYXRlKCk7XG4gICAgdGhpcy5tYXRBdXRvY29tcGxldGU/Lm9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4gb3B0aW9uLmRlc2VsZWN0KCkpO1xuICAgIHRoaXMub25Ub3VjaCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZmlsbElucHV0KCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy50eXBlID09PSB0aGlzLmF1dG9jb21wbGV0ZVR5cGUuU0lOR0xFICYmICF0aGlzLmlucHV0VmFsdWUpIHtcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gQXV0b2NvbXBsZXRlVXRpbHMudHJhbnNmb3JtRGlzcGxheVZhbHVlKHRoaXMudmFsdWUsIHRoaXMudGV4dEZpZWxkKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaW5wdXRWYWx1ZSAmJiB0aGlzLnZhbHVlPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gJyAnO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlucHV0VmFsdWUgJiYgdGhpcy50eXBlID09PSBBdXRvY29tcGxldGUuU0lOR0xFICYmIHRoaXMudmFsdWUgJiYgT2JqZWN0LmtleXModGhpcy52YWx1ZSkubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLnRyYW5zZm9ybURpc3BsYXlWYWx1ZShcbiAgICAgICAgICBBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHRoaXMudmFsdWUpID8gdGhpcy52YWx1ZVswXSA6IHRoaXMudmFsdWUsXG4gICAgICAgICAgdGhpcy50ZXh0RmllbGRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pbnB1dFZhbHVlKSB7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICcgJztcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbnB1dFZhbHVlU2VhcmNoJC5uZXh0KCcnKTtcbiAgICAgIHRoaXMudXNlcklucHV0JC5uZXh0KCcnKTtcbiAgICAgIHRoaXMuaXNJbnB1dEZvY3VzID0gZmFsc2U7XG4gICAgICB0aGlzLm9uVG91Y2goKTtcbiAgICAgIHRoaXMuYmx1ci5lbWl0KCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ290b1VwKCkge1xuICAgIGlmICh0aGlzLmNka1ZpcnR1YWxTY3JvbGxWaWV3UG9ydCkge1xuICAgICAgdGhpcy5jZGtWaXJ0dWFsU2Nyb2xsVmlld1BvcnQuc2Nyb2xsVG9JbmRleCgwKTtcbiAgICAgIHRoaXMuY2RrVmlydHVhbFNjcm9sbFZpZXdQb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uRm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5pc0lucHV0Rm9jdXMgPSB0cnVlO1xuXG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodGhpcy5pbnB1dFZhbHVlKSA/IHRoaXMuaW5wdXRWYWx1ZVswXSA6IHRoaXMuaW5wdXRWYWx1ZTtcblxuICAgIGlmIChBdXRvY29tcGxldGVVdGlscy5pc1ByaW1pdGl2ZShpbnB1dFZhbHVlKSkge1xuICAgICAgaWYgKHR5cGVvZiBpbnB1dFZhbHVlICE9PSAnbnVtYmVyJyAmJiBpbnB1dFZhbHVlPy5tYXRjaCgvXlxccysvZ20pKSB7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IGlucHV0VmFsdWUudHJpbVN0YXJ0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbnB1dFZhbHVlW3RoaXMudGV4dEZpZWxkXT8ubWF0Y2goL15cXHMrL2dtKSkge1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBpbnB1dFZhbHVlW3RoaXMudGV4dEZpZWxkXS50cmltU3RhcnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5mb2N1cy5lbWl0KCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrT3ZlcmxhcChkZWxheSA9IFRpbWVvdXQuVklFV19JTklUSUFMSVpFRF9BRlRFUl9BQ1RJT04sIGluaXQgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuaXNPdmVyTGFwcGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNPdmVybGFwQ2hlY2tpbmcgPSB0cnVlO1xuICAgIHRoaXMuaW5wdXRPcGFjaXR5ID0gMDtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXRXaWR0aCA9IHRoaXMuaW5wdXRXaWR0aDtcbiAgICAgIGNvbnN0IHRhZ3MgPSB0aGlzLnRhZ0NvbnRhaW5lcj8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudmFsdWUtdGFnJyk7XG4gICAgICBpZiAodGFncykge1xuICAgICAgICBsZXQgd2lkdGggPSAwO1xuICAgICAgICBsZXQgZmlyc3RUYWdXaWR0aCA9IDA7XG5cbiAgICAgICAgdGFncy5mb3JFYWNoKCh0YWc6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIHdpZHRoICs9IHRhZy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgICAgIGlmICghaW5kZXgpIHtcbiAgICAgICAgICAgIGZpcnN0VGFnV2lkdGggPSB3aWR0aDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbnBXaWR0aCA9IHRoaXMuZm9ybUZpZWxkRWxlbWVudD8ubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIDIwO1xuICAgICAgICAgIHRoaXMuZmlyc3RUYWdNYXhXaWR0aCA9XG4gICAgICAgICAgICB0YWdzLmxlbmd0aCA+IDFcbiAgICAgICAgICAgICAgPyBpbnBXaWR0aCAtXG4gICAgICAgICAgICAgICAgKHRoaXMudmFyaWFudCA9PT0gRHJvcGRvd25WYXJpYXRpb24uRFJPUERPV05cbiAgICAgICAgICAgICAgICAgID8gUGFkZGluZy5EUk9QRE9XTl9TUEFDRV9DT05UQUlORVJcbiAgICAgICAgICAgICAgICAgIDogUGFkZGluZy5BVVRPQ09NUExFVEVfU1BBQ0VfQ09OVEFJTkVSKVxuICAgICAgICAgICAgICA6IGlucFdpZHRoO1xuXG4gICAgICAgICAgaWYgKCF0aGlzLmlzT3ZlckxhcHBpbmcgJiYgd2lkdGggPiBpbnB1dFdpZHRoICYmIGluZGV4ID4gMCkge1xuICAgICAgICAgICAgdGhpcy5pc092ZXJMYXBwaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxhcEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pc092ZXJsYXBDaGVja2luZyA9IGZhbHNlO1xuICAgICAgICBpZiAoaW5pdCkge1xuICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09IHRoaXMuYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEUpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLnRyYW5zZm9ybURpc3BsYXlWYWx1ZSh0aGlzLnZhbHVlWzBdLCB0aGlzLnRleHRGaWVsZCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICcgJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFnQ29udGFpbmVyV2lkdGggPSB0aGlzLnRhZ0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICB0aGlzLnRhZ0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LnN0eWxlLm1heFdpZHRoID0gdGFnQ29udGFpbmVyV2lkdGggLyAxMDAgPyAnMTAwJScgOiB0YWdDb250YWluZXJXaWR0aCArICdweCc7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgICAgdGhpcy5pbnB1dE9wYWNpdHkgPSAxO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxuXG4gIHByaXZhdGUgb25VcGRhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dFZhbHVlU2VhcmNoJC5uZXh0KCcnKTtcbiAgICB0aGlzLnVzZXJJbnB1dCQubmV4dCgnJyk7XG4gICAgaWYgKCF0aGlzLnZhbHVlUHJpbWl0aXZlKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy50eXBlID09PSBBdXRvY29tcGxldGUuU0lOR0xFKSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZVt0aGlzLnZhbHVlRmllbGRdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZS5tYXAoKHY6IGFueSkgPT4gdlt0aGlzLnZhbHVlRmllbGRdKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRWYWx1ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50eXBlID09PSB0aGlzLmF1dG9jb21wbGV0ZVR5cGUuU0lOR0xFICYmIHRoaXMudmFyaWFudCAhPT0gRHJvcGRvd25WYXJpYXRpb24uRFJPUERPV04pIHtcbiAgICAgIGlmIChBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLnRyYW5zZm9ybURpc3BsYXlWYWx1ZSh0aGlzLnZhbHVlWzBdLCB0aGlzLnRleHRGaWVsZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSB0aGlzLnZhbHVlID8gQXV0b2NvbXBsZXRlVXRpbHMudHJhbnNmb3JtRGlzcGxheVZhbHVlKHRoaXMudmFsdWUsIHRoaXMudGV4dEZpZWxkKSA6ICcnO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy52YXJpYW50ID09PSBEcm9wZG93blZhcmlhdGlvbi5EUk9QRE9XTikge1xuICAgICAgdGhpcy5pbnB1dFZhbHVlID1cbiAgICAgICAgKEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodGhpcy52YWx1ZSkgJiYgIXRoaXMudmFsdWU/Lmxlbmd0aCkgfHwgIXRoaXMudmFsdWVcbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiB0aGlzLnR5cGUgPT09IEF1dG9jb21wbGV0ZS5TSU5HTEVcbiAgICAgICAgICA/IEF1dG9jb21wbGV0ZVV0aWxzLnRyYW5zZm9ybURpc3BsYXlWYWx1ZShcbiAgICAgICAgICAgICAgQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh0aGlzLnZhbHVlKSA/IHRoaXMudmFsdWVbMF0gOiB0aGlzLnZhbHVlLFxuICAgICAgICAgICAgICB0aGlzLnRleHRGaWVsZFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogJyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlucHV0VmFsdWUgPSB0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUubGVuZ3RoID8gJyAnIDogJyc7XG4gICAgfVxuICAgIGlmICh0aGlzLnR5cGUgPT09IHRoaXMuYXV0b2NvbXBsZXRlVHlwZS5NVUxUSSkge1xuICAgICAgdGhpcy5jaGVja092ZXJsYXAoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZE5ld1ZhbHVlKG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50eXBlICE9PSB0aGlzLmF1dG9jb21wbGV0ZVR5cGUuU0lOR0xFICYmICF0aGlzLnZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgZm91bmREdXBsaWNhdGUgPSB0aGlzLmNvbXBhcmVXaXRoXG4gICAgICA/IHRoaXMudmFsdWUuZmluZCgodjogYW55KSA9PiB0aGlzLmNvbXBhcmVXaXRoKHYsIG5ld1ZhbHVlKSlcbiAgICAgIDogQXV0b2NvbXBsZXRlVXRpbHMuZmluZER1cGxpY2F0ZSh0aGlzLnZhbHVlLCBuZXdWYWx1ZSwgdGhpcy50ZXh0RmllbGQpO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gdGhpcy5hdXRvY29tcGxldGVUeXBlLlNJTkdMRSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGZvdW5kRHVwbGljYXRlXG4gICAgICAgID8gdGhpcy52YWx1ZS5maWx0ZXIoKHY6IGFueSkgPT5cbiAgICAgICAgICAgIHRoaXMuY29tcGFyZVdpdGggPyAhdGhpcy5jb21wYXJlV2l0aCh2LCBmb3VuZER1cGxpY2F0ZSkgOiB2ICE9PSBmb3VuZER1cGxpY2F0ZVxuICAgICAgICAgIClcbiAgICAgICAgOiBbLi4udGhpcy52YWx1ZSwgbmV3VmFsdWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBpc0Ryb3Bkb3duKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZhcmlhbnQgPT09IERyb3Bkb3duVmFyaWF0aW9uLkRST1BET1dOO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2hldnJvbkNsaWNrKGF1dG9jb21wbGV0ZTogTWF0QXV0b2NvbXBsZXRlKTogdm9pZCB7XG4gICAgaWYgKGF1dG9jb21wbGV0ZS5pc09wZW4pIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZS5jbG9zZVBhbmVsKCk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlucHV0V2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5mb3JtRmllbGRFbGVtZW50Py5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC1cbiAgICAgICh0aGlzLmlzRHJvcGRvd24gPyBQYWRkaW5nLkRST1BET1dOX0NPTlRBSU5FUiA6IFBhZGRpbmcuQVVUT0NPTVBMRVRFX0NPTlRBSU5FUilcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRyYWNrQnlGbiA9IChpbmRleDogbnVtYmVyLCB2YWx1ZTogYW55KSA9PiB2YWx1ZS5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5O1xuXG4gIC8qKlxuICAgKiBBZGRpbmcgY29tcGFueSBjb2xvciB2YXJpYWJsZSB0byB0aGUgYm9keSB0byBzdHlsZSBvdmVybGF5IGNvbnRhaW5lciB0aGF0J3Mgb3V0IG9mIHRoZSBjb21wb25lbnQgc2NvcGUuXG4gICAqL1xuICBwcml2YXRlIHNldENvbXBhbnlDb2xvclZhcmlhYmxlKCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoJy0tdWktYXV0b2NvbXBsZXRlLW9wdGlvbi1jb2xvcicsIGAke3RoaXMuY29tcGFueUNvbG9yfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVyRGlzcGxheUNoYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCBhdXRvY29tcGxldGVIb3N0RWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcblxuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgbXV0YXRpb25zLmZvckVhY2gobXV0YXRpb24gPT4ge1xuICAgICAgICBpZiAobXV0YXRpb24uYXR0cmlidXRlTmFtZSA9PT0gJ3N0eWxlJykge1xuICAgICAgICAgIGNvbnN0IGRpc3BsYXlTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoYXV0b2NvbXBsZXRlSG9zdEVsZW1lbnQpLmRpc3BsYXk7XG4gICAgICAgICAgaWYgKGRpc3BsYXlTdHlsZSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrT3ZlcmxhcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoYXV0b2NvbXBsZXRlSG9zdEVsZW1lbnQsIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFsnc3R5bGUnXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaGFzT2JqZWN0VmFsdWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWUgPyAhIU9iamVjdC5rZXlzKHRoaXMudmFsdWUpLmxlbmd0aCA6IGZhbHNlO1xuICB9XG5cbiAgb25LZXlkb3duKCRldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IG9wdGlvbkhlaWdodCA9IDQ4O1xuXG4gICAgaWYgKCRldmVudC5rZXkgPT09IElLZXlib2FyZEV2ZW50LkhPTUUpIHtcbiAgICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlLl9rZXlNYW5hZ2VyLnNldEZpcnN0SXRlbUFjdGl2ZSgpO1xuICAgIH0gZWxzZSBpZiAoJGV2ZW50LmtleSA9PT0gSUtleWJvYXJkRXZlbnQuRU5EKSB7XG4gICAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5zZXRMYXN0SXRlbUFjdGl2ZSgpO1xuICAgIH0gZWxzZSBpZiAoJGV2ZW50LmtleSA9PT0gSUtleWJvYXJkRXZlbnQuUEFHRV9ET1dOKSB7XG4gICAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5zZXROZXh0SXRlbUFjdGl2ZSgpO1xuICAgICAgdGhpcy5tYXRBdXRvY29tcGxldGUuX2tleU1hbmFnZXIuc2V0TmV4dEl0ZW1BY3RpdmUoKTtcbiAgICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlLl9rZXlNYW5hZ2VyLnNldE5leHRJdGVtQWN0aXZlKCk7XG4gICAgfSBlbHNlIGlmICgkZXZlbnQua2V5ID09PSBJS2V5Ym9hcmRFdmVudC5QQUdFX1VQKSB7XG4gICAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5zZXRQcmV2aW91c0l0ZW1BY3RpdmUoKTtcbiAgICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlLl9rZXlNYW5hZ2VyLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO1xuICAgICAgdGhpcy5tYXRBdXRvY29tcGxldGUuX2tleU1hbmFnZXIuc2V0UHJldmlvdXNJdGVtQWN0aXZlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5tYXRBdXRvY29tcGxldGUuX3NldFNjcm9sbFRvcCh0aGlzLm1hdEF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5hY3RpdmVJdGVtSW5kZXghICogb3B0aW9uSGVpZ2h0KTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cImF1dG9jb21wbGV0ZS13cmFwcGVyXCIgW25nQ2xhc3NdPVwieyAnZnVsbC13aWR0aCc6IGZ1bGxXaWR0aCwgZGlzYWJsZWQ6IGRpc2FibGVkIH1cIj5cbiAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgIFtjb2xvcl09XCIoc2FmZUVycm9ycy5sZW5ndGggfHwgKG5nQ29udHJvbD8uZXJyb3JzICYmIG5nQ29udHJvbD8udG91Y2hlZCApIHx8IChBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpID4gbWF4SXRlbVNlbGVjdGVkIHx8ICgoQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoKSA+PSBtYXhJdGVtU2VsZWN0ZWQgJiYgaW5wdXRWYWx1ZSkgKSA/ICd3YXJuJyA6ICdhY2NlbnQnXCJcbiAgICAgIFthcHBlYXJhbmNlXT1cIidvdXRsaW5lJ1wiXG4gICAgICBbbmdDbGFzc109XCJ7ICdsYXJnZS1zaXplJzogdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5MQVJHRSwgJ2hpZGUtYm90dG9tLWNvbnRlbnQnOiAhc2hvd0JvdHRvbUNvbnRlbnQsICdrZXlib2FyZC1mb2N1c2VkJzoga2V5Ym9hcmRGb2N1c2VkKCksICdoYXMtbGFiZWwnOiAhIWxhYmVsIH1cIlxuICAgID5cbiAgICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJsYWJlbFwiPnt7IGxhYmVsIH19IDxzcGFuICpuZ0lmPVwicmVxdWlyZWRcIj4qPC9zcGFuPjwvbWF0LWxhYmVsPlxuICAgICAgPGRpdiAjZm9ybUZpZWxkIGNsYXNzPVwiaW5wdXQtY29udGFpbmVyXCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAtOTk5OXB4XCIgKm5nSWY9XCJ0ZXh0RmllbGQgPyB2YWx1ZT8uW3RleHRGaWVsZF0gOiB2YWx1ZSA9PT0gaW5wdXRWYWx1ZVwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPnt7ICgoJ1NFTEVDVEVEJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jKSArICcgJyArIGlucHV0VmFsdWUgfX08L3NwYW4+XG5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgI3RyaWdnZXI9XCJtYXRBdXRvY29tcGxldGVUcmlnZ2VyXCJcbiAgICAgICAgICAjbWF0SW5wdXRcbiAgICAgICAgICBbdWlQcmV2ZW50SW5wdXRdPVwiIWFsbG93VXNlcklucHV0XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3Vuc2V0LW1hcmdpbic6IHRoaXMudmFsdWUgJiYgdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5MQVJHRSwgJ25vLWNhcmV0JzogIWFsbG93VXNlcklucHV0IH1cIlxuICAgICAgICAgIChibHVyKT1cInJlZmlsbElucHV0KClcIlxuICAgICAgICAgIChmb2N1c2luKT1cIm9uRm9jdXMoKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoKHRyYW5zbGF0aW9uQ29udGV4dCArICdTRUxFQ1RFRCcpIHwgdWlUcmFuc2xhdGUgfCBhc3luYykgKyAnICcgKyAodmFsdWUgfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgOiB0cnVlKVwiXG4gICAgICAgICAgW3N0eWxlLm9wYWNpdHldPVwidHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5NVUxUSSA/IGlucHV0T3BhY2l0eSA6IDFcIlxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInZhbHVlICYmIHZhbHVlLmxlbmd0aCA/ICcnOiBwbGFjZWhvbGRlclwiXG4gICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJpbnB1dFZhbHVlXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic2VsZWN0ZWQtaXRlbXNcIlxuICAgICAgICAgICN0YWdDb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgKHR5cGUgPT09IGF1dG9jb21wbGV0ZVR5cGUuTEFSR0UgJiYgdGhpcy52YWx1ZSkgfHxcbiAgICAgICAgICAgICghKGlucHV0VmFsdWUgJiYgdGhpcy5pc0lucHV0Rm9jdXMpICYmIHRoaXMudmFsdWUgJiYgdHlwZSAhPT0gYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEUpXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx1aS10YWdcbiAgICAgICAgICAgIGNsYXNzPVwidmFsdWUtdGFnXCJcbiAgICAgICAgICAgIFtpZF09XCIndWktdGFnLScgKyBpXCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCB2YWx1ZUl0ZW0gb2YgdmFsdWU7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgW2xhYmVsXT1cInZhbHVlSXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZFwiXG4gICAgICAgICAgICBbYWxsb3dDbG9zZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgW3N0eWxlLm9wYWNpdHldPVwidHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5NVUxUSSA/IGlucHV0T3BhY2l0eSA6IDFcIlxuICAgICAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwiKGlzT3ZlckxhcHBpbmcgJiYgaSA+IDAgJiYgaSA+PSBvdmVybGFwSW5kZXgpIHx8IChzaXplID09PSAnc21hbGwnICYmIHZhbHVlLmxlbmd0aCA+IDEpICA/ICdub25lJyA6ICdibG9jaydcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnLS10YWctbWF4LXdpZHRoJzogdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5MQVJHRSA/ICdmaXQtY29udGVudCcgOiBmaXJzdFRhZ01heFdpZHRoICsgJ3B4JyB9XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgJ292ZXJsYXAtdGFnJzogaXNPdmVybGFwQ2hlY2tpbmcgJiYgb3ZlcmxhcEluZGV4ICYmIGkgPj0gb3ZlcmxhcEluZGV4ICYmIHR5cGUgPT09IGF1dG9jb21wbGV0ZVR5cGUuTVVMVElcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgKGNsb3NlKT1cIm9uT3B0aW9uUmVtb3ZlZCh2YWx1ZUl0ZW0pXCJcbiAgICAgICAgICA+PC91aS10YWc+XG4gICAgICAgICAgQGlmIChzaXplID09PSAnc21hbGwnKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWQtY291bnRcIiAqbmdJZj1cInZhbHVlLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICAgICAge3sgKHRyYW5zbGF0aW9uQ29udGV4dCArICdTRUxFQ1RFRF9BTU9VTlQnIHwgdWlUcmFuc2xhdGUgOiB7IG51bWJlclNlbGVjdGVkOiAodmFsdWUgfCBzbGljZTogb3ZlcmxhcEluZGV4KS5sZW5ndGggfSkgfCBhc3luYyB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidmFsdWUubGVuZ3RoID4gMSAmJiBpc092ZXJMYXBwaW5nXCIgY2xhc3M9XCJvdmVybGFwLWNvdW50XCI+XG4gICAgICAgICAgICAgIDx1aS10YWcgW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicrJyArICh2YWx1ZS5sZW5ndGggLSBvdmVybGFwSW5kZXgpXCI+PC91aS10YWc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDx1aS1pY29uXG4gICAgICAgICpuZ0lmPVwiY2xlYXJhYmxlICYmICh0eXBlID09PSBhdXRvY29tcGxldGVUeXBlLlNJTkdMRSAmJiAodmFsdWU/Lmxlbmd0aCB8fCBoYXNPYmplY3RWYWx1ZSkpIHx8ICh0eXBlICE9PSBhdXRvY29tcGxldGVUeXBlLlNJTkdMRSAmJiB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPiAxICYmICgoQXV0b2NvbXBsZXRlVXRpbHMuaXNQcmltaXRpdmUodmFsdWUpICYmIHZhbHVlLmxlbmd0aCkgfHwgKCFBdXRvY29tcGxldGVVdGlscy5pc1ByaW1pdGl2ZSh2YWx1ZSkgJiYgKEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCB8fCAhQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2YWx1ZSkgJiYgIXZhbHVlLmxlbmd0aCkpKSlcIlxuICAgICAgICBjbGFzcz1cInJlbW92ZS1zZWxlY3RlZFwiXG4gICAgICAgIFt0YWJJbmRleF09XCJkaXNhYmxlZCA/IC0xIDogMFwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uQ2xlYXIoKTskZXZlbnQucHJldmVudERlZmF1bHQoKTskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJvbkNsZWFyKCk7JGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnbGFyZ2UtaW5wdXQtaWNvbic6IHR5cGUgPT09IGF1dG9jb21wbGV0ZVR5cGUuTEFSR0UgfVwiXG4gICAgICAgIChjbGljayk9XCJvbkNsZWFyKCk7JGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgW3NpemVdPVwiJzI0J1wiXG4gICAgICAgIFtjb2xvcl09XCJhcHBsaWNhdGlvblRoZW1lID09PSAnY2xhc3NpYycgPyAnaW5oZXJpdCcgOiAncmVicmFuZC1ibGFjaydcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIignQ09NTU9OLkNMRUFSJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jXCJcbiAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0Nsb3NlJyA6ICdDbG9zZS1pbi1saW5lJ1wiXG4gICAgICA+PC91aS1pY29uPlxuXG4gICAgICA8dWktaWNvblxuICAgICAgICBjbGFzcz1cImFycm93LXN0YXRlXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyBvcGVuZWQ6IGF1dG9jb21wbGV0ZS5pc09wZW4sICdsYXJnZS1pbnB1dC1pY29uJzogdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5MQVJHRSB9XCJcbiAgICAgICAgKm5nSWY9XCJpc0Ryb3Bkb3duXCJcbiAgICAgICAgW3NpemVdPVwiJzI0J1wiXG4gICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgIT09ICdjbGFzc2ljJyA/ICdBcnJvdy1jaGV2cm9uLWRvd24taW4tbGluZScgOiAnQXJyb3dfZG93bidcIlxuICAgICAgICAoY2xpY2spPVwib25DaGV2cm9uQ2xpY2soYXV0b2NvbXBsZXRlKVwiXG4gICAgICA+PC91aS1pY29uPlxuXG5cbiAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXG4gICAgICAgICNhdXRvY29tcGxldGVcbiAgICAgICAgW2NsYXNzXT1cImFwcGxpY2F0aW9uVGhlbWUgKyAnICcgKyBkcm9wZG93blBhbmVsQ2xhc3NcIlxuICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25PcHRpb25TZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgW2Rpc2FibGVSaXBwbGVdPVwiYXBwbGljYXRpb25UaGVtZSAhPT0gJ2NsYXNzaWMnXCJcbiAgICAgICAgW2hpZGVTaW5nbGVTZWxlY3Rpb25JbmRpY2F0b3JdPVwiZmFsc2VcIlxuICAgICAgICAob3BlbmVkKT1cImdvdG9VcCgpXCJcbiAgICAgID5cbiAgICAgICAgQGlmICh0eXBlICE9PSBhdXRvY29tcGxldGVUeXBlLk1VTFRJIHx8IHZhbHVlPy5sZW5ndGggPCBtYXhJdGVtU2VsZWN0ZWQpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIShzZWFyY2hSZXN1bHQkIHwgYXN5bmMpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzRHJvcGRvd247IGVsc2UgZHJvcGRvd25MaXN0XCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0Z3JvdXAgW2xhYmVsXT1cIigodHJhbnNsYXRpb25Db250ZXh0ICsgJ1NVR0dFU1RFRCcpIHwgdWlUcmFuc2xhdGUgfCBhc3luYykhIHwgdXBwZXJjYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN1Z2dlc3Rpb25zTGlzdC5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9JGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IHN1Z2dlc3RlZCB8IGluY2x1ZGVzOiB2YWx1ZSA6IHZhbHVlRmllbGQgfVwiXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc3VnZ2VzdGVkIG9mIHN1Z2dlc3Rpb25zTGlzdFwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic3VnZ2VzdGVkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbc2VsZWN0VGV4dF09XCJ1c2VySW5wdXQkIHwgYXN5bmNcIj57eyBzdWdnZXN0ZWQgfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cblxuICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwIFtsYWJlbF09XCIoKHRyYW5zbGF0aW9uQ29udGV4dCArICdTRUxFQ1RFRCcpIHwgdWlUcmFuc2xhdGUgfCBhc3luYykhIHwgdXBwZXJjYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInZhbHVlPy5sZW5ndGggJiYgdHlwZSAhPT0gYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9JGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IGl0ZW0gfCBpbmNsdWRlczogdmFsdWUgOiB2YWx1ZUZpZWxkIH1cIlxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdmFsdWVcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cblxuICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwIFtsYWJlbF09XCIoKHRyYW5zbGF0aW9uQ29udGV4dCArICdTRUxFQ1RFRCcpIHwgdWlUcmFuc2xhdGUgfCBhc3luYykhIHwgdXBwZXJjYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInZhbHVlPy5sZW5ndGggJiYgdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9JGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCInc2VsZWN0ZWQtb3B0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtzZWxlY3RUZXh0XT1cInVzZXJJbnB1dCQgfCBhc3luY1wiPnt7IHZhbHVlIHwgdHJhbnNmb3JtSXRlbTogdGV4dEZpZWxkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJhcHBsaWNhdGlvblRoZW1lID09PSAnY2xhc3NpYycgPyAnQ2hlY2snIDogJ0NoZWNrLWluLWxpbmUnXCI+PC91aS1pY29uPlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkcm9wZG93bkxpc3Q+XG4gICAgICAgICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQgKm5nSWY9XCJ2aXJ0dWFsU2Nyb2xsOyBlbHNlIGRlZmF1bHRWaWV3UG9ydFwiIFtpdGVtU2l6ZV09XCI0OFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodF09XCInMjAwcHgnXCIgY2xhc3M9XCJ2aXJ0dWFsLXNjcm9sbFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT0kZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogaXRlbSB8IGluY2x1ZGVzOiB2YWx1ZSA6IHZhbHVlRmllbGQgfVwiXG4gICAgICAgICAgICAgICAgICAqY2RrVmlydHVhbEZvcj1cImxldCBpdGVtIG9mIGl0ZW1zTGlzdFwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwidXNlcklucHV0JCB8IGFzeW5jXCI+e3sgaXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDx1aS1pY29uIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0NoZWNrJyA6ICdDaGVjay1pbi1saW5lJ1wiPjwvdWktaWNvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFZpZXdQb3J0PlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT0kZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogaXRlbSB8IGluY2x1ZGVzOiB2YWx1ZSA6IHZhbHVlRmllbGQgfVwiXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc0xpc3RcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtzZWxlY3RUZXh0XT1cInVzZXJJbnB1dCQgfCBhc3luY1wiPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyZWRTdWdnZXN0aW9uTGlzdCQgfCBhc3luYyBhcyBmaWx0ZXJlZFN1Z2dlc3Rpb25MaXN0XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyZWRJdGVtc0xpc3QkIHwgYXN5bmMgYXMgZmlsdGVyZWRJdGVtc0xpc3RcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRncm91cCBbbGFiZWxdPVwiKCh0cmFuc2xhdGlvbkNvbnRleHQgKyAnU1VHR0VTVEVEJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jKSEgfCB1cHBlcmNhc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmlsdGVyZWRTdWdnZXN0aW9uTGlzdC5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9JGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IGl0ZW0gfCBpbmNsdWRlczogdmFsdWUgOiB2YWx1ZUZpZWxkIH1cIlxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRTdWdnZXN0aW9uTGlzdFwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwidXNlcklucHV0JCB8IGFzeW5jXCI+e3sgaXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDx1aS1pY29uIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0NoZWNrJyA6ICdDaGVjay1pbi1saW5lJ1wiPjwvdWktaWNvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGdyb3VwPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmlsdGVyZWRTdWdnZXN0aW9uTGlzdC5sZW5ndGg7IGVsc2Ugc2hvd0l0ZW1MaXN0V2l0aEdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZC1vcHRpb24nOiBpdGVtIHwgaW5jbHVkZXM6IHZhbHVlIDogdmFsdWVGaWVsZCB9XCJcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkSXRlbXNMaXN0XCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbc2VsZWN0VGV4dF09XCJ1c2VySW5wdXQkIHwgYXN5bmNcIj57eyBpdGVtIHwgdHJhbnNmb3JtSXRlbTogdGV4dEZpZWxkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJhcHBsaWNhdGlvblRoZW1lID09PSAnY2xhc3NpYycgPyAnQ2hlY2snIDogJ0NoZWNrLWluLWxpbmUnXCI+PC91aS1pY29uPlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzaG93SXRlbUxpc3RXaXRoR3JvdXA+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRncm91cCBbbGFiZWxdPVwiKCh0cmFuc2xhdGlvbkNvbnRleHQgKyAnQUxMX0lURU1TJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jKSEgfCB1cHBlcmNhc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmaWx0ZXJlZEl0ZW1zTGlzdC5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IGl0ZW0gfCBpbmNsdWRlczogdmFsdWUgOiB2YWx1ZUZpZWxkIH1cIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJlZEl0ZW1zTGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwidXNlcklucHV0JCB8IGFzeW5jXCI+e3sgaXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmaWx0ZXJlZEl0ZW1zTGlzdC5sZW5ndGggJiYgIWZpbHRlcmVkU3VnZ2VzdGlvbkxpc3QubGVuZ3RoICYmIGlucHV0VmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWxsb3dBZGQ7IGVsc2Ugbm90Rm91bmRcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpIFt2YWx1ZV09XCJpbnB1dFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ICgnQ09NTU9OLkFERCcpIHwgdWlUcmFuc2xhdGUgfCBhc3luYyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhZGQtc3VnZ2VzdGlvblwiPlwie3sgaW5wdXRWYWx1ZSB9fVwiPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub3RGb3VuZD5cbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFtzdHlsZS5wb2ludGVyLWV2ZW50c109XCInbm9uZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgKHRyYW5zbGF0aW9uQ29udGV4dCArICdOT19SRVNVTFRTX0ZPVU5EJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICAgIDxtYXQtaGludCBjbGFzcz1cImVycm9yXCIgKm5nSWY9XCJzYWZlRXJyb3JzLmxlbmd0aCB8fCAobmdDb250cm9sPy5lcnJvcnMgfCBoYXNWYWxpZGF0aW9uRXJyb3IpIHx8IChBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpID4gbWF4SXRlbVNlbGVjdGVkIHx8ICgoQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoKSA+PSBtYXhJdGVtU2VsZWN0ZWQgJiYgaW5wdXRWYWx1ZSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVycm9yc1wiICpuZ0lmPVwiKEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCkgPiBtYXhJdGVtU2VsZWN0ZWQgfHwgKChBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpID49IG1heEl0ZW1TZWxlY3RlZCAmJiBpbnB1dFZhbHVlKVwiPlxuICAgICAgICAgIDx1aS1pY29uIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIiBbbmFtZV09XCInRXJyb3InXCI+PC91aS1pY29uPlxuICAgICAgICAgIDxzcGFuPnt7ICh0cmFuc2xhdGlvbkNvbnRleHQgKyAnTUFYX1NFTEVDVEVEX0VSUk9SJykgfCB1aVRyYW5zbGF0ZSA6IHsgbWF4OiBtYXhJdGVtU2VsZWN0ZWQgfSB8IGFzeW5jIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNhZmVFcnJvcnMubGVuZ3RoXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVycm9yc1wiICpuZ0Zvcj1cImxldCBlcnJvciBvZiBzYWZlRXJyb3JzOyB0cmFja0J5OiB0cmFja0J5Rm5cIj5cbiAgICAgICAgICAgIDx1aS1pY29uIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIiBbbmFtZV09XCInRXJyb3InXCI+PC91aS1pY29uPlxuICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJlcnJvclwiPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDx1aS12YWxpZGF0aW9uLWVycm9yICpuZ0lmPVwibmdDb250cm9sICYmICFoaWRlQnVpbHRJbkVycm9yc1wiIFtuZ0NvbnRyb2xdPVwibmdDb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImhpZGVMYWJlbEluRXJyb3JzID8gbnVsbCA6IGxhYmVsXCI+PC91aS12YWxpZGF0aW9uLWVycm9yPlxuXG4gICAgICA8L21hdC1oaW50PlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4iXX0=