@energycap/components 0.44.2-github-actions.20250919-1816 → 0.44.2-github-actions.20250919-1421
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.
- package/README.md +188 -188
- package/esm2022/lib/components.module.mjs +1 -1
- package/esm2022/lib/controls/banner/banner.component.mjs +3 -3
- package/esm2022/lib/controls/button/button.component.mjs +3 -3
- package/esm2022/lib/controls/button/copy-button-base.directive.mjs +1 -1
- package/esm2022/lib/controls/button/copy-button.directive.mjs +1 -1
- package/esm2022/lib/controls/button/copy-table-button.directive.mjs +1 -1
- package/esm2022/lib/controls/calendar/calendar-item.component.mjs +1 -1
- package/esm2022/lib/controls/calendar/calendar.component.mjs +3 -3
- package/esm2022/lib/controls/calendar/calendar.types.mjs +1 -1
- package/esm2022/lib/controls/checkbox/checkbox.component.mjs +3 -3
- package/esm2022/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +1 -1
- package/esm2022/lib/controls/combobox/combobox.component.mjs +3 -3
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/date-input-selection-strategy-base.mjs +1 -1
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/day-selection-strategy.mjs +1 -1
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/last-28-days-selection-strategy.mjs +1 -1
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/last-7-days-selection-strategy.mjs +1 -1
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/month-selection-strategy.mjs +1 -1
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/quarter-selection-strategy.mjs +1 -1
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.mjs +1 -1
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.mjs +1 -1
- package/esm2022/lib/controls/date-input/date-input.component.mjs +3 -3
- package/esm2022/lib/controls/date-input/date-input.types.mjs +1 -1
- package/esm2022/lib/controls/dropdown/dropdown.component.mjs +3 -3
- package/esm2022/lib/controls/file-upload/file-upload.component.mjs +3 -3
- package/esm2022/lib/controls/form-control/form-control.component.mjs +3 -3
- package/esm2022/lib/controls/form-control-base.mjs +1 -1
- package/esm2022/lib/controls/form-control-label/form-control-label.component.mjs +3 -3
- package/esm2022/lib/controls/form-group/form-group.component.mjs +3 -3
- package/esm2022/lib/controls/help-popover/help-popover.component.mjs +3 -3
- package/esm2022/lib/controls/item-picker/item-picker.component.mjs +3 -3
- package/esm2022/lib/controls/link-button/link-button.component.mjs +1 -1
- package/esm2022/lib/controls/menu/menu.component.mjs +3 -3
- package/esm2022/lib/controls/navigation/link-item.mjs +1 -1
- package/esm2022/lib/controls/navigation/nav-group.mjs +1 -1
- package/esm2022/lib/controls/navigation/nav-item-active.directive.mjs +1 -1
- package/esm2022/lib/controls/navigation/nav-item.mjs +1 -1
- package/esm2022/lib/controls/numericbox/numericbox.component.mjs +3 -3
- package/esm2022/lib/controls/popover/popover.component.mjs +3 -3
- package/esm2022/lib/controls/radio-button/radio-button-option.mjs +1 -1
- package/esm2022/lib/controls/radio-button/radio-button.component.mjs +3 -3
- package/esm2022/lib/controls/select/select.component.mjs +3 -3
- package/esm2022/lib/controls/tabs/tabs.component.mjs +3 -3
- package/esm2022/lib/controls/textbox/textbox.component.mjs +3 -3
- package/esm2022/lib/core/cache.service.mjs +1 -1
- package/esm2022/lib/core/custom-validators.mjs +1 -1
- package/esm2022/lib/core/date-time-helper.mjs +1 -1
- package/esm2022/lib/core/error.service.mjs +1 -1
- package/esm2022/lib/core/router-helper.service.mjs +1 -1
- package/esm2022/lib/core/scroll.service.mjs +1 -1
- package/esm2022/lib/core/telemetry-tracker.service.mjs +1 -1
- package/esm2022/lib/core/telemetry.service.mjs +1 -1
- package/esm2022/lib/core/validation-message.service.mjs +1 -1
- package/esm2022/lib/core/validation-patterns.mjs +1 -1
- package/esm2022/lib/core/window.service.mjs +1 -1
- package/esm2022/lib/display/app-bar/app-bar.component.mjs +3 -3
- package/esm2022/lib/display/avatar/avatar.component.mjs +1 -1
- package/esm2022/lib/display/avatar/avatar.service.mjs +1 -1
- package/esm2022/lib/display/confirm/confirm.component.mjs +3 -3
- package/esm2022/lib/display/dialog/dialog-content.mjs +1 -1
- package/esm2022/lib/display/dialog/dialog-group/dialog-group.component.mjs +3 -3
- package/esm2022/lib/display/dialog/dialog-types.mjs +1 -1
- package/esm2022/lib/display/dialog/dialog.component.mjs +1 -1
- package/esm2022/lib/display/dialog/dialog.service.mjs +1 -1
- package/esm2022/lib/display/help/help-types.mjs +1 -1
- package/esm2022/lib/display/hierarchy/hierarchy-base.mjs +1 -1
- package/esm2022/lib/display/hierarchy/hierarchy-mocks.spec.mjs +1 -1
- package/esm2022/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +3 -3
- package/esm2022/lib/display/item-display/item-display.component.mjs +3 -3
- package/esm2022/lib/display/json-display/json-display.component.mjs +3 -3
- package/esm2022/lib/display/resizable/resizable-base.mjs +1 -1
- package/esm2022/lib/display/resizable/resizable.component.mjs +7 -7
- package/esm2022/lib/display/spinner/spinner.component.mjs +3 -3
- package/esm2022/lib/display/splash/splash.component.mjs +3 -3
- package/esm2022/lib/display/splash/splash.service.mjs +1 -1
- package/esm2022/lib/display/table/resizable-column.component.mjs +3 -3
- package/esm2022/lib/display/table/resizable-table.directive.mjs +1 -1
- package/esm2022/lib/display/table/searchable-table.component.mjs +3 -3
- package/esm2022/lib/display/table/table-detail-row.component.mjs +11 -11
- package/esm2022/lib/display/table/table-locked-column.component.mjs +1 -1
- package/esm2022/lib/display/table/table-master-header-row.component.mjs +1 -1
- package/esm2022/lib/display/table/table-master-row.component.mjs +3 -3
- package/esm2022/lib/display/table/table-pagination.component.mjs +3 -3
- package/esm2022/lib/display/table/table-selectable-row.component.mjs +3 -3
- package/esm2022/lib/display/table/table.component.mjs +3 -3
- package/esm2022/lib/display/tags/tag.mjs +1 -1
- package/esm2022/lib/display/tags/tags.component.mjs +3 -3
- package/esm2022/lib/display/toast/toast/toast.component.mjs +3 -3
- package/esm2022/lib/display/toast/toast-types.mjs +1 -1
- package/esm2022/lib/display/toast/toast.service.mjs +1 -1
- package/esm2022/lib/display/toast/toaster/toaster.component.mjs +3 -3
- package/esm2022/lib/display/tooltip/tooltip.component.mjs +3 -3
- package/esm2022/lib/display/tooltip/tooltip.service.mjs +1 -1
- package/esm2022/lib/display/tooltip-directive/tooltip.directive.mjs +1 -1
- package/esm2022/lib/display/tree/tree.component.mjs +3 -3
- package/esm2022/lib/display/view-overlay/view-overlay.component.mjs +3 -3
- package/esm2022/lib/shared/directives/click-area-for/click-area-for.directive.mjs +1 -1
- package/esm2022/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +1 -1
- package/esm2022/lib/shared/directives/keyboard-nav-container/keyboard-nav-container.directive.mjs +1 -1
- package/esm2022/lib/shared/directives/popup/popup-container.directive.mjs +1 -1
- package/esm2022/lib/shared/display/pipes/date-display-2.pipe.mjs +1 -1
- package/esm2022/lib/shared/display/pipes/date-display.pipe.mjs +1 -1
- package/esm2022/lib/shared/display/pipes/highlight-text.pipe.mjs +1 -1
- package/esm2022/lib/shared/display/pipes/relative-date.pipe.mjs +1 -1
- package/esm2022/lib/shared/display/pipes/row-count.pipe.mjs +1 -1
- package/esm2022/lib/shared/display/pipes/time-display.pipe.mjs +1 -1
- package/esm2022/lib/shared/display.mjs +1 -1
- package/esm2022/lib/shared/form-group.helper.mjs +1 -1
- package/esm2022/lib/shared/json-helper.mjs +1 -1
- package/esm2022/lib/shared/lodash-helper.mjs +1 -1
- package/esm2022/lib/shared/page/page-base/page-base.component.mjs +1 -1
- package/esm2022/lib/shared/page/page-statuses.mjs +1 -1
- package/esm2022/lib/shared/page/page-title/page-title.component.mjs +3 -3
- package/esm2022/lib/shared/page/page-view/page-view.component.mjs +3 -3
- package/esm2022/lib/shared/testing/copy-button-base-test-injector-factory.spec.mjs +1 -1
- package/esm2022/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs +1 -1
- package/esm2022/lib/shared/testing/page-base-component-test-helper.spec.mjs +1 -1
- package/esm2022/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +1 -1
- package/esm2022/lib/shared/testing/public-mocks.spec.mjs +1 -1
- package/esm2022/lib/shared/testing/spy-factory.spec.mjs +1 -1
- package/esm2022/lib/shared/testing/translation-mocks.spec.mjs +1 -1
- package/esm2022/lib/shared/user-preference.service.mjs +1 -1
- package/esm2022/lib/shared/wizard/wizard-base/wizard-base.component.mjs +1 -1
- package/esm2022/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +3 -3
- package/esm2022/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +3 -3
- package/esm2022/public-api.mjs +1 -1
- package/fesm2022/energycap-components.mjs +104 -104
- package/fesm2022/energycap-components.mjs.map +1 -1
- package/package.json +1 -1
- package/schematics/collection.json +4 -4
- package/src/assets/images/favicon-ech.svg +14 -14
- package/src/assets/images/favicon-esa.svg +6 -6
- package/src/assets/images/favicon-eum.svg +13 -13
- package/src/assets/images/favicon-whitelabel.svg +4 -4
- package/src/assets/images/favicon.svg +12 -12
- package/src/assets/images/icon-carbonhub.svg +10 -10
- package/src/assets/images/icon-eum.svg +5 -5
- package/src/assets/images/icon-ucp.svg +12 -12
- package/src/assets/images/icon-wattics.svg +5 -5
- package/src/assets/images/icon.svg +11 -11
- package/src/assets/images/logo.svg +10 -10
- package/src/assets/images/splash-electric.svg +3 -3
- package/src/assets/images/splash-interval.svg +3 -3
- package/src/assets/images/splash-seedling.svg +11 -11
- package/src/assets/images/splash-water.svg +3 -3
- package/src/assets/locales/en_US.json +58 -58
- package/src/assets/scripts/unsupported-browser.js +17 -17
- package/src/styles/_base.scss +38 -38
- package/src/styles/_colors.scss +96 -96
- package/src/styles/_core.scss +3 -3
- package/src/styles/_functions.scss +114 -114
- package/src/styles/_global-variables.scss +229 -229
- package/src/styles/_icons.scss +23 -23
- package/src/styles/bootstrap/_grid.scss +33 -33
- package/src/styles/bootstrap/_reboot.scss +322 -322
- package/src/styles/components/_card.scss +21 -21
- package/src/styles/components/_link-icons.scss +37 -37
- package/src/styles/components/_splash.scss +150 -150
- package/src/styles/components/_tag.scss +18 -18
- package/src/styles/components/_unsupported-browsers.scss +23 -23
- package/src/styles/email/_email-base.scss +227 -227
- package/src/styles/email/email.scss +42 -42
- package/src/styles/index.scss +28 -28
- package/src/styles/mixins/_animations.scss +17 -17
- package/src/styles/mixins/_button-base.scss +185 -185
- package/src/styles/mixins/_card-base.scss +40 -40
- package/src/styles/mixins/_common.scss +51 -51
- package/src/styles/mixins/_dialog-base.scss +95 -95
- package/src/styles/mixins/_form-control-base.scss +640 -640
- package/src/styles/mixins/_login.scss +74 -74
- package/src/styles/mixins/_menu-base.scss +153 -153
- package/src/styles/mixins/_overlay-base.scss +32 -32
- package/src/styles/mixins/_resizable-base.scss +57 -57
- package/src/styles/mixins/_spinner-base.scss +34 -34
- package/src/styles/mixins/_table-base.scss +297 -297
- package/src/styles/mixins/_tabs-base.scss +146 -146
- package/src/styles/mixins/_tags-base.scss +121 -121
- package/src/styles/mixins/_text.scss +89 -89
- package/src/styles/mixins.scss +14 -14
- package/src/styles/utilities/_borders.scss +29 -29
- package/src/styles/utilities/_common.scss +49 -49
- package/src/styles/utilities/_layout.scss +115 -115
- package/src/styles/utilities/_spacing.scss +64 -64
- package/src/styles/utilities/_text.scss +139 -139
|
@@ -812,11 +812,11 @@ export class ComboboxComponent extends FormControlBase {
|
|
|
812
812
|
return index;
|
|
813
813
|
}
|
|
814
814
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ComboboxComponent, deps: [{ token: i1.ValidationMessageService }, { token: i2.FormGroupHelper }, { token: i3.TranslateService }, { token: i4.ScrollService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
815
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ComboboxComponent, selector: "ec-combobox", inputs: { addNew: "addNew", addNewOptions: "addNewOptions", maxlength: "maxlength", menuPosition: "menuPosition", minlength: "minlength", options: "options", templateType: "templateType", customMenuTemplate: "customMenuTemplate", preserveIconSpace: "preserveIconSpace", popupFixed: "popupFixed", totalRecords: "totalRecords", upperCase: "upperCase", placeholder: "placeholder", loadOnOpenObservable: "loadOnOpenObservable", hideToggleButton: "hideToggleButton", alwaysOpen: "alwaysOpen", menuElementClasses: "menuElementClasses", textboxElementClasses: "textboxElementClasses", hideNoMatches: "hideNoMatches", noMatchesText: "noMatchesText", truncateItems: "truncateItems" }, outputs: { addNewClick: "addNewClick", search: "search" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "textbox", first: true, predicate: ["textbox"], descendants: true }, { propertyName: "popup", first: true, predicate: PopupContainerDirective, descendants: true }, { propertyName: "addNewButton", first: true, predicate: ["addNewButton"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"control control-label-{{labelPosition}}\"\n [ngClass]=\"{'open': menuStatus === 'visible',\n 'invalid': formModel.touched && formModel.invalid,\n 'has-icon': ((templateType === 'iconAndLabel' || templateType === 'iconLabelCaption') && formModel.value && formModel.value.icon && formModel.value.label === textboxFormModel.value),\n 'is-readonly': readonly,\n 'is-disabled': formModel.disabled,\n 'is-always-open': alwaysOpen}\">\n\n <label *ngIf=\"label\">\n <span>{{label | translate}}</span>\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\"> {{validationErrors}}</span>\n <ec-help-popover id=\"{{id}}_helpPopover\"\n *ngIf=\"helpPopover\"\n class=\"d-inline-block my-n3 mx-n1\"\n text=\"{{helpPopover | translate}}\"\n contentPosition=\"{{helpPopoverPosition}}\">\n </ec-help-popover>\n </label>\n\n <ng-container *ngIf=\"alwaysOpen; else popupTarget\">\n <div class=\"textbox-group control-input\"\n [ngClass]=\"textboxElementClasses\">\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\n </div>\n\n <ng-container *ngIf=\"filteredOptions.length > 0 || textboxFormModel.value\">\n <ng-container *ngTemplateOutlet=\"dropdownmenu\"></ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #popupTarget>\n <div class=\"textbox-group control-input\"\n [ngClass]=\"textboxElementClasses\"\n *ecPopup=\"dropdownmenu\">\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #textbox>\n <i class=\"ec-icon {{formModel.value?.icon}}\"></i>\n\n <ec-textbox class=\"textbox-group-input mb-0\"\n #textbox\n [id]=\"id\"\n [autofocus]=\"autofocus\"\n [formModel]=\"textboxFormModel\"\n [maxlength]=\"maxlength\"\n [minlength]=\"minlength\"\n [placeholder]=\"effectivePlaceholder\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [readonly]=\"readonly\"\n (input)=\"textboxValueChanged($event)\"\n (keydown)=\"keyNavigate($event)\"\n (focusout)=\"onBlur()\"\n [upperCase]=\"upperCase\"\n [pending]=\"pending && alwaysOpen\"\n [autocomplete]=\"'off'\"></ec-textbox>\n\n <ec-button class=\"textbox-group-btn-right\"\n *ngIf=\"!hideToggleButton\"\n [id]=\"id + '_button'\"\n [disabled]=\"formModel.disabled\"\n icon=\"icon-caret-down\"\n [tabindex]=\"-1\"\n type=\"secondary\"\n (click)=\"toggleMenu($event)\"\n (keydown)=\"keyNavigate($event)\"\n [class.active]=\"menuStatus === 'visible'\"></ec-button>\n</ng-template>\n\n<ng-template #dropdownmenu>\n <div class=\"popup\"\n ecOverlay\n [status]=\"pending && !alwaysOpen ? 'pending' : 'hasData'\">\n\n <button class=\"add-new {{addNewOptions?.classList}}\"\n id=\"{{id}}_addNew\"\n #addNewButton\n [class.is-selected]=\"addNewSelected\"\n *ngIf=\"addNew\"\n [hidden]=\"foundMatch || (addNew === 'dynamic' && (!textboxFormModel.value || (formModel.value && textboxFormModel.value === formModel.value.label)))\"\n (click)=\"onAddNew($event)\">\n <span class=\"add-new-label ec-util-truncate\">\n <span *ngIf=\"addNew === 'static' || addNew === true\"\n translate>{{addNewOptions?.label}}\n </span>\n <span *ngIf=\"addNew === 'dynamic'\">{{'Add' | translate}} <strong class=\"ec-util-truncate\"\n [ngClass]=\"{'text-uppercase': upperCase}\">{{textboxFormModel.value}}</strong>\n </span>\n </span>\n <i class=\"ec-icon {{addNewOptions?.icon}}\"></i>\n </button>\n\n <ec-menu id=\"{{id}}_menu\"\n [class.border-top-0]=\"!filteredOptions.length && hideNoMatches\"\n [ngClass]=\"menuElementClasses\"\n [templateType]=\"templateType\"\n [customMenuTemplate]=\"customMenuTemplate\"\n [showNoItems]=\"!hideNoMatches\"\n [noDataText]=\"noMatchesText\"\n [items]=\"filteredOptions\"\n [selected]=\"selectedItem\"\n (selectedChanged)=\"selectedChanged($event)\"\n [preserveIconSpace]=\"preserveIconSpace\"\n [truncateItems]=\"truncateItems\"></ec-menu>\n\n <footer *ngIf=\"totalRecords && totalRecords > filteredOptions.length && filteredOptions.length > 0\">\n <span>{{filteredOptionCount}} {{'of' | translate}} {{totalRecords}}</span>\n </footer>\n </div>\n</ng-template>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}.control{position:relative}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched{background-image:none;padding-left:.5rem}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched:not(.is-empty)~.units-left{left:0}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty{background-image:none;background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-form-control-border-color-focus);box-shadow:var(--ec-form-control-box-shadow-focus);position:relative;z-index:1}.control .textbox-group .ec-icon{display:none;position:absolute;top:.5rem;left:.5rem;z-index:2}.control.has-icon:not(.invalid) .ec-icon{display:inline-flex}.control.has-icon:not(.invalid) ec-textbox ::ng-deep input{padding-left:1.75rem}.control.is-disabled:not(.is-readonly) .ec-icon{filter:grayscale(100%);opacity:var(--ec-form-control-opacity-disabled)}.control.is-readonly ec-textbox ::ng-deep input{border-right-width:1px;border-top-right-radius:var(--ec-border-radius);border-bottom-right-radius:var(--ec-border-radius)}.control.is-readonly ec-button{display:none}.control.is-always-open{height:100%}.control.is-always-open label,.control.is-always-open .textbox-group{margin-left:1rem;margin-right:1rem}.control.is-always-open .textbox-group{margin-bottom:1rem}.control.is-always-open .popup{background-color:transparent;box-shadow:none;flex:1 1;border:0;margin:0;z-index:0;min-height:0}.control.is-always-open ec-menu{border-top:1px solid var(--ec-border-color)}.control.is-always-open ec-menu ::ng-deep ul{max-height:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.popup{background-color:var(--ec-background-color);border-radius:var(--ec-border-radius-card);box-shadow:var(--ec-box-shadow-overlay);margin-top:.25rem;overflow:hidden;z-index:var(--ec-z-index-popup)}ec-menu{display:block}ec-menu:not(:first-child){border-top:1px solid var(--ec-border-color)}ec-menu ::ng-deep ul{max-height:30vh}ec-menu ::ng-deep ul li{white-space:nowrap}.add-new{height:2rem;line-height:1.25rem;padding:.25rem .5rem;display:flex;align-items:center;background-color:var(--ec-background-color);cursor:pointer;border:0;width:100%}.add-new:hover,.add-new.is-selected{background-color:var(--ec-background-color-hover)}.add-new:focus{outline:none;background-color:var(--ec-background-color-hover)}.add-new-label{flex:1 1;margin-right:.5rem;text-align:left}.add-new .ec-icon{flex:0 0 auto}footer{padding:.5rem;border-top:1px solid var(--ec-border-color);color:var(--ec-color-hint-dark);font-size:var(--ec-font-size-label);text-align:right;line-height:1}ec-button{--ec-button-border-color-secondary: var(--ec-form-control-border-color);--ec-button-border-color-secondary-focus: var(--ec-form-control-border-color);--ec-button-color-icon-secondary: var(--ec-color-icon)}.open:not(.is-always-open) .textbox-group ec-textbox{--ec-form-control-box-shadow-focus: none;--ec-form-control-border-color-focus: var(--ec-form-control-border-color)}.open:not(.is-always-open) .textbox-group ec-button{--ec-button-box-shadow-focus-secondary: none;--ec-button-background-color-secondary: var(--ec-background-color-selected)}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i6.ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: i7.TextboxComponent, selector: "ec-textbox", inputs: ["autocomplete", "type", "placeholder", "maxlength", "minlength", "rows", "selectOnAutofocus", "upperCase"] }, { kind: "component", type: i8.ViewOverlayComponent, selector: "[ecOverlay]", inputs: ["status", "message", "action", "noDataTemplate", "displayAsMask", "overlayClassList"] }, { kind: "component", type: i9.MenuComponent, selector: "ec-menu", inputs: ["id", "items", "selected", "parent", "templateType", "customMenuTemplate", "title", "showNoItems", "noDataText", "enableKeyNav", "highlightedItem", "maintainSelectedItem", "truncateItems", "preserveIconSpace", "dropdownToggleButton"], outputs: ["selectedChanged", "menuClosed"] }, { kind: "directive", type: i10.PopupContainerDirective, selector: "[ecPopup]", inputs: ["ecPopup", "options"] }, { kind: "component", type: i11.HelpPopoverComponent, selector: "ec-help-popover", inputs: ["id", "text", "contentPosition", "maxWidth"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
|
|
815
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ComboboxComponent, selector: "ec-combobox", inputs: { addNew: "addNew", addNewOptions: "addNewOptions", maxlength: "maxlength", menuPosition: "menuPosition", minlength: "minlength", options: "options", templateType: "templateType", customMenuTemplate: "customMenuTemplate", preserveIconSpace: "preserveIconSpace", popupFixed: "popupFixed", totalRecords: "totalRecords", upperCase: "upperCase", placeholder: "placeholder", loadOnOpenObservable: "loadOnOpenObservable", hideToggleButton: "hideToggleButton", alwaysOpen: "alwaysOpen", menuElementClasses: "menuElementClasses", textboxElementClasses: "textboxElementClasses", hideNoMatches: "hideNoMatches", noMatchesText: "noMatchesText", truncateItems: "truncateItems" }, outputs: { addNewClick: "addNewClick", search: "search" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "textbox", first: true, predicate: ["textbox"], descendants: true }, { propertyName: "popup", first: true, predicate: PopupContainerDirective, descendants: true }, { propertyName: "addNewButton", first: true, predicate: ["addNewButton"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [ngClass]=\"{'open': menuStatus === 'visible',\r\n 'invalid': formModel.touched && formModel.invalid,\r\n 'has-icon': ((templateType === 'iconAndLabel' || templateType === 'iconLabelCaption') && formModel.value && formModel.value.icon && formModel.value.label === textboxFormModel.value),\r\n 'is-readonly': readonly,\r\n 'is-disabled': formModel.disabled,\r\n 'is-always-open': alwaysOpen}\">\r\n\r\n <label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\"> {{validationErrors}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n </label>\r\n\r\n <ng-container *ngIf=\"alwaysOpen; else popupTarget\">\r\n <div class=\"textbox-group control-input\"\r\n [ngClass]=\"textboxElementClasses\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"filteredOptions.length > 0 || textboxFormModel.value\">\r\n <ng-container *ngTemplateOutlet=\"dropdownmenu\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n<ng-template #popupTarget>\r\n <div class=\"textbox-group control-input\"\r\n [ngClass]=\"textboxElementClasses\"\r\n *ecPopup=\"dropdownmenu\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #textbox>\r\n <i class=\"ec-icon {{formModel.value?.icon}}\"></i>\r\n\r\n <ec-textbox class=\"textbox-group-input mb-0\"\r\n #textbox\r\n [id]=\"id\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [maxlength]=\"maxlength\"\r\n [minlength]=\"minlength\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n (input)=\"textboxValueChanged($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n (focusout)=\"onBlur()\"\r\n [upperCase]=\"upperCase\"\r\n [pending]=\"pending && alwaysOpen\"\r\n [autocomplete]=\"'off'\"></ec-textbox>\r\n\r\n <ec-button class=\"textbox-group-btn-right\"\r\n *ngIf=\"!hideToggleButton\"\r\n [id]=\"id + '_button'\"\r\n [disabled]=\"formModel.disabled\"\r\n icon=\"icon-caret-down\"\r\n [tabindex]=\"-1\"\r\n type=\"secondary\"\r\n (click)=\"toggleMenu($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n [class.active]=\"menuStatus === 'visible'\"></ec-button>\r\n</ng-template>\r\n\r\n<ng-template #dropdownmenu>\r\n <div class=\"popup\"\r\n ecOverlay\r\n [status]=\"pending && !alwaysOpen ? 'pending' : 'hasData'\">\r\n\r\n <button class=\"add-new {{addNewOptions?.classList}}\"\r\n id=\"{{id}}_addNew\"\r\n #addNewButton\r\n [class.is-selected]=\"addNewSelected\"\r\n *ngIf=\"addNew\"\r\n [hidden]=\"foundMatch || (addNew === 'dynamic' && (!textboxFormModel.value || (formModel.value && textboxFormModel.value === formModel.value.label)))\"\r\n (click)=\"onAddNew($event)\">\r\n <span class=\"add-new-label ec-util-truncate\">\r\n <span *ngIf=\"addNew === 'static' || addNew === true\"\r\n translate>{{addNewOptions?.label}}\r\n </span>\r\n <span *ngIf=\"addNew === 'dynamic'\">{{'Add' | translate}} <strong class=\"ec-util-truncate\"\r\n [ngClass]=\"{'text-uppercase': upperCase}\">{{textboxFormModel.value}}</strong>\r\n </span>\r\n </span>\r\n <i class=\"ec-icon {{addNewOptions?.icon}}\"></i>\r\n </button>\r\n\r\n <ec-menu id=\"{{id}}_menu\"\r\n [class.border-top-0]=\"!filteredOptions.length && hideNoMatches\"\r\n [ngClass]=\"menuElementClasses\"\r\n [templateType]=\"templateType\"\r\n [customMenuTemplate]=\"customMenuTemplate\"\r\n [showNoItems]=\"!hideNoMatches\"\r\n [noDataText]=\"noMatchesText\"\r\n [items]=\"filteredOptions\"\r\n [selected]=\"selectedItem\"\r\n (selectedChanged)=\"selectedChanged($event)\"\r\n [preserveIconSpace]=\"preserveIconSpace\"\r\n [truncateItems]=\"truncateItems\"></ec-menu>\r\n\r\n <footer *ngIf=\"totalRecords && totalRecords > filteredOptions.length && filteredOptions.length > 0\">\r\n <span>{{filteredOptionCount}} {{'of' | translate}} {{totalRecords}}</span>\r\n </footer>\r\n </div>\r\n</ng-template>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}.control{position:relative}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched{background-image:none;padding-left:.5rem}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched:not(.is-empty)~.units-left{left:0}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty{background-image:none;background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-form-control-border-color-focus);box-shadow:var(--ec-form-control-box-shadow-focus);position:relative;z-index:1}.control .textbox-group .ec-icon{display:none;position:absolute;top:.5rem;left:.5rem;z-index:2}.control.has-icon:not(.invalid) .ec-icon{display:inline-flex}.control.has-icon:not(.invalid) ec-textbox ::ng-deep input{padding-left:1.75rem}.control.is-disabled:not(.is-readonly) .ec-icon{filter:grayscale(100%);opacity:var(--ec-form-control-opacity-disabled)}.control.is-readonly ec-textbox ::ng-deep input{border-right-width:1px;border-top-right-radius:var(--ec-border-radius);border-bottom-right-radius:var(--ec-border-radius)}.control.is-readonly ec-button{display:none}.control.is-always-open{height:100%}.control.is-always-open label,.control.is-always-open .textbox-group{margin-left:1rem;margin-right:1rem}.control.is-always-open .textbox-group{margin-bottom:1rem}.control.is-always-open .popup{background-color:transparent;box-shadow:none;flex:1 1;border:0;margin:0;z-index:0;min-height:0}.control.is-always-open ec-menu{border-top:1px solid var(--ec-border-color)}.control.is-always-open ec-menu ::ng-deep ul{max-height:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.popup{background-color:var(--ec-background-color);border-radius:var(--ec-border-radius-card);box-shadow:var(--ec-box-shadow-overlay);margin-top:.25rem;overflow:hidden;z-index:var(--ec-z-index-popup)}ec-menu{display:block}ec-menu:not(:first-child){border-top:1px solid var(--ec-border-color)}ec-menu ::ng-deep ul{max-height:30vh}ec-menu ::ng-deep ul li{white-space:nowrap}.add-new{height:2rem;line-height:1.25rem;padding:.25rem .5rem;display:flex;align-items:center;background-color:var(--ec-background-color);cursor:pointer;border:0;width:100%}.add-new:hover,.add-new.is-selected{background-color:var(--ec-background-color-hover)}.add-new:focus{outline:none;background-color:var(--ec-background-color-hover)}.add-new-label{flex:1 1;margin-right:.5rem;text-align:left}.add-new .ec-icon{flex:0 0 auto}footer{padding:.5rem;border-top:1px solid var(--ec-border-color);color:var(--ec-color-hint-dark);font-size:var(--ec-font-size-label);text-align:right;line-height:1}ec-button{--ec-button-border-color-secondary: var(--ec-form-control-border-color);--ec-button-border-color-secondary-focus: var(--ec-form-control-border-color);--ec-button-color-icon-secondary: var(--ec-color-icon)}.open:not(.is-always-open) .textbox-group ec-textbox{--ec-form-control-box-shadow-focus: none;--ec-form-control-border-color-focus: var(--ec-form-control-border-color)}.open:not(.is-always-open) .textbox-group ec-button{--ec-button-box-shadow-focus-secondary: none;--ec-button-background-color-secondary: var(--ec-background-color-selected)}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i6.ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: i7.TextboxComponent, selector: "ec-textbox", inputs: ["autocomplete", "type", "placeholder", "maxlength", "minlength", "rows", "selectOnAutofocus", "upperCase"] }, { kind: "component", type: i8.ViewOverlayComponent, selector: "[ecOverlay]", inputs: ["status", "message", "action", "noDataTemplate", "displayAsMask", "overlayClassList"] }, { kind: "component", type: i9.MenuComponent, selector: "ec-menu", inputs: ["id", "items", "selected", "parent", "templateType", "customMenuTemplate", "title", "showNoItems", "noDataText", "enableKeyNav", "highlightedItem", "maintainSelectedItem", "truncateItems", "preserveIconSpace", "dropdownToggleButton"], outputs: ["selectedChanged", "menuClosed"] }, { kind: "directive", type: i10.PopupContainerDirective, selector: "[ecPopup]", inputs: ["ecPopup", "options"] }, { kind: "component", type: i11.HelpPopoverComponent, selector: "ec-help-popover", inputs: ["id", "text", "contentPosition", "maxWidth"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
|
|
816
816
|
}
|
|
817
817
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ComboboxComponent, decorators: [{
|
|
818
818
|
type: Component,
|
|
819
|
-
args: [{ selector: 'ec-combobox', template: "<div class=\"control control-label-{{labelPosition}}\"\n [ngClass]=\"{'open': menuStatus === 'visible',\n 'invalid': formModel.touched && formModel.invalid,\n 'has-icon': ((templateType === 'iconAndLabel' || templateType === 'iconLabelCaption') && formModel.value && formModel.value.icon && formModel.value.label === textboxFormModel.value),\n 'is-readonly': readonly,\n 'is-disabled': formModel.disabled,\n 'is-always-open': alwaysOpen}\">\n\n <label *ngIf=\"label\">\n <span>{{label | translate}}</span>\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\"> {{validationErrors}}</span>\n <ec-help-popover id=\"{{id}}_helpPopover\"\n *ngIf=\"helpPopover\"\n class=\"d-inline-block my-n3 mx-n1\"\n text=\"{{helpPopover | translate}}\"\n contentPosition=\"{{helpPopoverPosition}}\">\n </ec-help-popover>\n </label>\n\n <ng-container *ngIf=\"alwaysOpen; else popupTarget\">\n <div class=\"textbox-group control-input\"\n [ngClass]=\"textboxElementClasses\">\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\n </div>\n\n <ng-container *ngIf=\"filteredOptions.length > 0 || textboxFormModel.value\">\n <ng-container *ngTemplateOutlet=\"dropdownmenu\"></ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #popupTarget>\n <div class=\"textbox-group control-input\"\n [ngClass]=\"textboxElementClasses\"\n *ecPopup=\"dropdownmenu\">\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #textbox>\n <i class=\"ec-icon {{formModel.value?.icon}}\"></i>\n\n <ec-textbox class=\"textbox-group-input mb-0\"\n #textbox\n [id]=\"id\"\n [autofocus]=\"autofocus\"\n [formModel]=\"textboxFormModel\"\n [maxlength]=\"maxlength\"\n [minlength]=\"minlength\"\n [placeholder]=\"effectivePlaceholder\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [readonly]=\"readonly\"\n (input)=\"textboxValueChanged($event)\"\n (keydown)=\"keyNavigate($event)\"\n (focusout)=\"onBlur()\"\n [upperCase]=\"upperCase\"\n [pending]=\"pending && alwaysOpen\"\n [autocomplete]=\"'off'\"></ec-textbox>\n\n <ec-button class=\"textbox-group-btn-right\"\n *ngIf=\"!hideToggleButton\"\n [id]=\"id + '_button'\"\n [disabled]=\"formModel.disabled\"\n icon=\"icon-caret-down\"\n [tabindex]=\"-1\"\n type=\"secondary\"\n (click)=\"toggleMenu($event)\"\n (keydown)=\"keyNavigate($event)\"\n [class.active]=\"menuStatus === 'visible'\"></ec-button>\n</ng-template>\n\n<ng-template #dropdownmenu>\n <div class=\"popup\"\n ecOverlay\n [status]=\"pending && !alwaysOpen ? 'pending' : 'hasData'\">\n\n <button class=\"add-new {{addNewOptions?.classList}}\"\n id=\"{{id}}_addNew\"\n #addNewButton\n [class.is-selected]=\"addNewSelected\"\n *ngIf=\"addNew\"\n [hidden]=\"foundMatch || (addNew === 'dynamic' && (!textboxFormModel.value || (formModel.value && textboxFormModel.value === formModel.value.label)))\"\n (click)=\"onAddNew($event)\">\n <span class=\"add-new-label ec-util-truncate\">\n <span *ngIf=\"addNew === 'static' || addNew === true\"\n translate>{{addNewOptions?.label}}\n </span>\n <span *ngIf=\"addNew === 'dynamic'\">{{'Add' | translate}} <strong class=\"ec-util-truncate\"\n [ngClass]=\"{'text-uppercase': upperCase}\">{{textboxFormModel.value}}</strong>\n </span>\n </span>\n <i class=\"ec-icon {{addNewOptions?.icon}}\"></i>\n </button>\n\n <ec-menu id=\"{{id}}_menu\"\n [class.border-top-0]=\"!filteredOptions.length && hideNoMatches\"\n [ngClass]=\"menuElementClasses\"\n [templateType]=\"templateType\"\n [customMenuTemplate]=\"customMenuTemplate\"\n [showNoItems]=\"!hideNoMatches\"\n [noDataText]=\"noMatchesText\"\n [items]=\"filteredOptions\"\n [selected]=\"selectedItem\"\n (selectedChanged)=\"selectedChanged($event)\"\n [preserveIconSpace]=\"preserveIconSpace\"\n [truncateItems]=\"truncateItems\"></ec-menu>\n\n <footer *ngIf=\"totalRecords && totalRecords > filteredOptions.length && filteredOptions.length > 0\">\n <span>{{filteredOptionCount}} {{'of' | translate}} {{totalRecords}}</span>\n </footer>\n </div>\n</ng-template>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}.control{position:relative}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched{background-image:none;padding-left:.5rem}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched:not(.is-empty)~.units-left{left:0}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty{background-image:none;background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-form-control-border-color-focus);box-shadow:var(--ec-form-control-box-shadow-focus);position:relative;z-index:1}.control .textbox-group .ec-icon{display:none;position:absolute;top:.5rem;left:.5rem;z-index:2}.control.has-icon:not(.invalid) .ec-icon{display:inline-flex}.control.has-icon:not(.invalid) ec-textbox ::ng-deep input{padding-left:1.75rem}.control.is-disabled:not(.is-readonly) .ec-icon{filter:grayscale(100%);opacity:var(--ec-form-control-opacity-disabled)}.control.is-readonly ec-textbox ::ng-deep input{border-right-width:1px;border-top-right-radius:var(--ec-border-radius);border-bottom-right-radius:var(--ec-border-radius)}.control.is-readonly ec-button{display:none}.control.is-always-open{height:100%}.control.is-always-open label,.control.is-always-open .textbox-group{margin-left:1rem;margin-right:1rem}.control.is-always-open .textbox-group{margin-bottom:1rem}.control.is-always-open .popup{background-color:transparent;box-shadow:none;flex:1 1;border:0;margin:0;z-index:0;min-height:0}.control.is-always-open ec-menu{border-top:1px solid var(--ec-border-color)}.control.is-always-open ec-menu ::ng-deep ul{max-height:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.popup{background-color:var(--ec-background-color);border-radius:var(--ec-border-radius-card);box-shadow:var(--ec-box-shadow-overlay);margin-top:.25rem;overflow:hidden;z-index:var(--ec-z-index-popup)}ec-menu{display:block}ec-menu:not(:first-child){border-top:1px solid var(--ec-border-color)}ec-menu ::ng-deep ul{max-height:30vh}ec-menu ::ng-deep ul li{white-space:nowrap}.add-new{height:2rem;line-height:1.25rem;padding:.25rem .5rem;display:flex;align-items:center;background-color:var(--ec-background-color);cursor:pointer;border:0;width:100%}.add-new:hover,.add-new.is-selected{background-color:var(--ec-background-color-hover)}.add-new:focus{outline:none;background-color:var(--ec-background-color-hover)}.add-new-label{flex:1 1;margin-right:.5rem;text-align:left}.add-new .ec-icon{flex:0 0 auto}footer{padding:.5rem;border-top:1px solid var(--ec-border-color);color:var(--ec-color-hint-dark);font-size:var(--ec-font-size-label);text-align:right;line-height:1}ec-button{--ec-button-border-color-secondary: var(--ec-form-control-border-color);--ec-button-border-color-secondary-focus: var(--ec-form-control-border-color);--ec-button-color-icon-secondary: var(--ec-color-icon)}.open:not(.is-always-open) .textbox-group ec-textbox{--ec-form-control-box-shadow-focus: none;--ec-form-control-border-color-focus: var(--ec-form-control-border-color)}.open:not(.is-always-open) .textbox-group ec-button{--ec-button-box-shadow-focus-secondary: none;--ec-button-background-color-secondary: var(--ec-background-color-selected)}\n"] }]
|
|
819
|
+
args: [{ selector: 'ec-combobox', template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [ngClass]=\"{'open': menuStatus === 'visible',\r\n 'invalid': formModel.touched && formModel.invalid,\r\n 'has-icon': ((templateType === 'iconAndLabel' || templateType === 'iconLabelCaption') && formModel.value && formModel.value.icon && formModel.value.label === textboxFormModel.value),\r\n 'is-readonly': readonly,\r\n 'is-disabled': formModel.disabled,\r\n 'is-always-open': alwaysOpen}\">\r\n\r\n <label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\"> {{validationErrors}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n </label>\r\n\r\n <ng-container *ngIf=\"alwaysOpen; else popupTarget\">\r\n <div class=\"textbox-group control-input\"\r\n [ngClass]=\"textboxElementClasses\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"filteredOptions.length > 0 || textboxFormModel.value\">\r\n <ng-container *ngTemplateOutlet=\"dropdownmenu\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n<ng-template #popupTarget>\r\n <div class=\"textbox-group control-input\"\r\n [ngClass]=\"textboxElementClasses\"\r\n *ecPopup=\"dropdownmenu\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #textbox>\r\n <i class=\"ec-icon {{formModel.value?.icon}}\"></i>\r\n\r\n <ec-textbox class=\"textbox-group-input mb-0\"\r\n #textbox\r\n [id]=\"id\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [maxlength]=\"maxlength\"\r\n [minlength]=\"minlength\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n (input)=\"textboxValueChanged($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n (focusout)=\"onBlur()\"\r\n [upperCase]=\"upperCase\"\r\n [pending]=\"pending && alwaysOpen\"\r\n [autocomplete]=\"'off'\"></ec-textbox>\r\n\r\n <ec-button class=\"textbox-group-btn-right\"\r\n *ngIf=\"!hideToggleButton\"\r\n [id]=\"id + '_button'\"\r\n [disabled]=\"formModel.disabled\"\r\n icon=\"icon-caret-down\"\r\n [tabindex]=\"-1\"\r\n type=\"secondary\"\r\n (click)=\"toggleMenu($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n [class.active]=\"menuStatus === 'visible'\"></ec-button>\r\n</ng-template>\r\n\r\n<ng-template #dropdownmenu>\r\n <div class=\"popup\"\r\n ecOverlay\r\n [status]=\"pending && !alwaysOpen ? 'pending' : 'hasData'\">\r\n\r\n <button class=\"add-new {{addNewOptions?.classList}}\"\r\n id=\"{{id}}_addNew\"\r\n #addNewButton\r\n [class.is-selected]=\"addNewSelected\"\r\n *ngIf=\"addNew\"\r\n [hidden]=\"foundMatch || (addNew === 'dynamic' && (!textboxFormModel.value || (formModel.value && textboxFormModel.value === formModel.value.label)))\"\r\n (click)=\"onAddNew($event)\">\r\n <span class=\"add-new-label ec-util-truncate\">\r\n <span *ngIf=\"addNew === 'static' || addNew === true\"\r\n translate>{{addNewOptions?.label}}\r\n </span>\r\n <span *ngIf=\"addNew === 'dynamic'\">{{'Add' | translate}} <strong class=\"ec-util-truncate\"\r\n [ngClass]=\"{'text-uppercase': upperCase}\">{{textboxFormModel.value}}</strong>\r\n </span>\r\n </span>\r\n <i class=\"ec-icon {{addNewOptions?.icon}}\"></i>\r\n </button>\r\n\r\n <ec-menu id=\"{{id}}_menu\"\r\n [class.border-top-0]=\"!filteredOptions.length && hideNoMatches\"\r\n [ngClass]=\"menuElementClasses\"\r\n [templateType]=\"templateType\"\r\n [customMenuTemplate]=\"customMenuTemplate\"\r\n [showNoItems]=\"!hideNoMatches\"\r\n [noDataText]=\"noMatchesText\"\r\n [items]=\"filteredOptions\"\r\n [selected]=\"selectedItem\"\r\n (selectedChanged)=\"selectedChanged($event)\"\r\n [preserveIconSpace]=\"preserveIconSpace\"\r\n [truncateItems]=\"truncateItems\"></ec-menu>\r\n\r\n <footer *ngIf=\"totalRecords && totalRecords > filteredOptions.length && filteredOptions.length > 0\">\r\n <span>{{filteredOptionCount}} {{'of' | translate}} {{totalRecords}}</span>\r\n </footer>\r\n </div>\r\n</ng-template>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}.control{position:relative}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched{background-image:none;padding-left:.5rem}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched:not(.is-empty)~.units-left{left:0}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty{background-image:none;background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-form-control-border-color-focus);box-shadow:var(--ec-form-control-box-shadow-focus);position:relative;z-index:1}.control .textbox-group .ec-icon{display:none;position:absolute;top:.5rem;left:.5rem;z-index:2}.control.has-icon:not(.invalid) .ec-icon{display:inline-flex}.control.has-icon:not(.invalid) ec-textbox ::ng-deep input{padding-left:1.75rem}.control.is-disabled:not(.is-readonly) .ec-icon{filter:grayscale(100%);opacity:var(--ec-form-control-opacity-disabled)}.control.is-readonly ec-textbox ::ng-deep input{border-right-width:1px;border-top-right-radius:var(--ec-border-radius);border-bottom-right-radius:var(--ec-border-radius)}.control.is-readonly ec-button{display:none}.control.is-always-open{height:100%}.control.is-always-open label,.control.is-always-open .textbox-group{margin-left:1rem;margin-right:1rem}.control.is-always-open .textbox-group{margin-bottom:1rem}.control.is-always-open .popup{background-color:transparent;box-shadow:none;flex:1 1;border:0;margin:0;z-index:0;min-height:0}.control.is-always-open ec-menu{border-top:1px solid var(--ec-border-color)}.control.is-always-open ec-menu ::ng-deep ul{max-height:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.popup{background-color:var(--ec-background-color);border-radius:var(--ec-border-radius-card);box-shadow:var(--ec-box-shadow-overlay);margin-top:.25rem;overflow:hidden;z-index:var(--ec-z-index-popup)}ec-menu{display:block}ec-menu:not(:first-child){border-top:1px solid var(--ec-border-color)}ec-menu ::ng-deep ul{max-height:30vh}ec-menu ::ng-deep ul li{white-space:nowrap}.add-new{height:2rem;line-height:1.25rem;padding:.25rem .5rem;display:flex;align-items:center;background-color:var(--ec-background-color);cursor:pointer;border:0;width:100%}.add-new:hover,.add-new.is-selected{background-color:var(--ec-background-color-hover)}.add-new:focus{outline:none;background-color:var(--ec-background-color-hover)}.add-new-label{flex:1 1;margin-right:.5rem;text-align:left}.add-new .ec-icon{flex:0 0 auto}footer{padding:.5rem;border-top:1px solid var(--ec-border-color);color:var(--ec-color-hint-dark);font-size:var(--ec-font-size-label);text-align:right;line-height:1}ec-button{--ec-button-border-color-secondary: var(--ec-form-control-border-color);--ec-button-border-color-secondary-focus: var(--ec-form-control-border-color);--ec-button-color-icon-secondary: var(--ec-color-icon)}.open:not(.is-always-open) .textbox-group ec-textbox{--ec-form-control-box-shadow-focus: none;--ec-form-control-border-color-focus: var(--ec-form-control-border-color)}.open:not(.is-always-open) .textbox-group ec-button{--ec-button-box-shadow-focus-secondary: none;--ec-button-background-color-secondary: var(--ec-background-color-selected)}\n"] }]
|
|
820
820
|
}], ctorParameters: () => [{ type: i1.ValidationMessageService }, { type: i2.FormGroupHelper }, { type: i3.TranslateService }, { type: i4.ScrollService }], propDecorators: { onResize: [{
|
|
821
821
|
type: HostListener,
|
|
822
822
|
args: ['window:resize']
|
|
@@ -876,4 +876,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
876
876
|
type: ViewChild,
|
|
877
877
|
args: ['addNewButton']
|
|
878
878
|
}] } });
|
|
879
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFtRCxTQUFTLEVBQWMsWUFBWSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBQzFLLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlqRCxPQUFPLEVBQXNELGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNHLE9BQU8sRUFBRSx1QkFBdUIsRUFBZSxNQUFNLHlEQUF5RCxDQUFDOzs7Ozs7Ozs7Ozs7O0FBeUIvRzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQU1ILE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxlQUFlO0lBRXJEOzs7OztPQUtHO0lBQzRCLFFBQVE7UUFDdEMsSUFBSSxJQUFJLENBQUMsS0FBSztZQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQXdPRCxZQUNXLHdCQUFrRCxFQUNsRCxlQUFnQyxFQUNoQyxTQUEyQixFQUMzQixhQUE0QjtRQUV0QyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFMdkMsNkJBQXdCLEdBQXhCLHdCQUF3QixD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S3dCLEtBQUs7c0JBQWhELFNBQVM7dUJBQUMsdUJBQXVCO2dCQU1DLFlBQVk7c0JBQTlDLFNBQVM7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMsIFZhbGlkYXRvckZuIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1Db250cm9sQmFzZSB9IGZyb20gJy4uL2Zvcm0tY29udHJvbC1iYXNlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFRleHRib3hDb21wb25lbnQgfSBmcm9tICcuLi90ZXh0Ym94L3RleHRib3guY29tcG9uZW50JztcbmltcG9ydCB7IFZhbGlkYXRpb25NZXNzYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvdmFsaWRhdGlvbi1tZXNzYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybUdyb3VwSGVscGVyIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Zvcm0tZ3JvdXAuaGVscGVyJztcbmltcG9ydCB7IE1lbnVJdGVtLCBNZW51VGVtcGxhdGVUeXBlLCBNZW51SG9zdEVsZW1lbnRDbGFzc2VzLCBNZW51Q29tcG9uZW50IH0gZnJvbSAnLi4vbWVudS9tZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQb3B1cENvbnRhaW5lckRpcmVjdGl2ZSwgUG9wdXBTdGF0dXMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZGlyZWN0aXZlcy9wb3B1cC9wb3B1cC1jb250YWluZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IFNjcm9sbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3Njcm9sbC5zZXJ2aWNlJztcblxuLyoqXG4gKiBQb3NpdGlvbiBvZiB0aGUgbWVudSByZWxhdGl2ZSB0byB0aGUgaW5wdXRcbiAqL1xuZXhwb3J0IHR5cGUgQ29tYm9ib3hNZW51UG9zaXRpb24gPSBcInRvcF9yaWdodFwiIHwgXCJ0b3BfbGVmdFwiIHwgXCJib3R0b21fbGVmdFwiIHwgXCJib3R0b21fcmlnaHRcIjtcblxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGFkZCBuZXcgaW1wbGVtZW50YXRpb24uIFN0YXRpYyBkaXNwbGF5cyBhIHNpbXBsZSBzdGF0aWMgYnV0dG9uIHdoaWxlIGR5bmFtaWMgdXBkYXRlc1xuICogdGhlIGxhYmVsIG9mIHRoZSBidXR0b24gd2l0aCB2YWx1ZSBvZiB0aGUgdGV4dGJveFxuICovXG50eXBlIEFkZE5ld1R5cGUgPSBcImR5bmFtaWNcIiB8IFwic3RhdGljXCIgfCBib29sZWFuO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBcIkFkZCBuZXdcIiBidXR0b24gd2hlbiBpbiBzdGF0aWMgbW9kZVxuICovXG50eXBlIEFkZE5ld09wdGlvbnMgPSB7XG5cdGxhYmVsPzogc3RyaW5nOyBcdC8qKiBBIGN1c3RvbSBsYWJlbCB0byBkaXNwbGF5IGluIHBsYWNlIG9mIHRoZSBkZWZhdWx0IFwiQWRkIG5ldy4uLlwiICovXG5cdGNsYXNzTGlzdD86IHN0cmluZzsgXHQvKiogQSBzdHJpbmcgb2Ygc3BhY2Utc2VwYXJhdGVkIHV0aWxpdHkgY2xhc3NlcyB3ZSdsbCBhcHBseSB0byB0aGUgbGFiZWwgKi9cblx0aWNvbj86IHN0cmluZzsgXHQvKiogQSBjdXN0b20gaWNvbiB0byBkaXNwbGF5IGluIHBsYWNlIG9mIHRoZSBkZWZhdWx0ICdpY29uLWFkZCcgKi9cbn07XG5cblxuLyoqXG4gKiBTZWxlY3QgYm94IChzZWxlY3QsIGF1dG9jb21wbGV0ZSwgY29tYm9ib3gpXG4gKlxuICogTk9URTogTWluL21heCBsZW5ndGggdmFsaWRhdGlvbiBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgaW50ZXJuYWwgZWMtdGV4dGJveC5cbiAqIFZhbHVlcyBwYXNzZWQgaW4gdmlhIGlucHV0IHByb3BlcnRpZXMgKEBzZWUgbWF4bGVuZ3RoICwgQHNlZSBtaW5sZW5ndGggKVxuICogYXJlIHVzZWQgdG8gY3JlYXRlIHZhbGlkYXRvcnMgb24gdGhlIHRleHRib3guICBXaGVuIHRoZSB2YWxpZGF0aW9uIG9uIHRoZVxuICogdGV4dGJveCBmYWlscywgdGhlIHZhbGlkYXRpb24gZXJyb3IocykgZ2V0IHBhc3NlZCB1cCB0byB0aGUge0BzZWUgZm9ybU1vZGVsIH0uXG4gKiBXaGVuIHNldHRpbmcgdXAgdGhpcyBjb21wb25lbnQncyB7QHNlZSBGb3JtQ29udHJvbCB9LCB5b3UgZG8gTk9UIG5lZWQgdG8gc2V0IHRoZVxuICogVmFsaWRhdG9ycy5taW5MZW5ndGggb3IgVmFsaWRhdG9ycy5tYXhMZW5ndGggdmFsaWRhdG9ycy5cbiAqXG4gKiBSZXF1aXJlZCBpcyBhbHNvIHBhc3NlZCB2aWEgaW5wdXQgcHJvcGVydHksIGJ1dCB5b3UgU0hPVUxEIGFsc28gc2V0IHVwIHRoZVxuICogVmFsaWRhdG9ycy5yZXF1aXJlZCB2YWxpZGF0b3Igb24gdGhpcyBjb21wb25lbnQncyBGb3JtQ29udHJvbC5cbiAqXG4gKiBAZXhwb3J0XG4gKi9cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ2VjLWNvbWJvYm94Jyxcblx0dGVtcGxhdGVVcmw6ICdjb21ib2JveC5jb21wb25lbnQuaHRtbCcsXG5cdHN0eWxlVXJsczogWycuL2NvbWJvYm94LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ29tYm9ib3hDb21wb25lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XG5cblx0LyoqXG5cdCAqIENsb3NlIHRoZSBwb3B1cCBtZW51IG9uIHJlc2l6ZSBzbyB0aGUgd2lkdGggYW5kIHBvc2l0aW9uaW5nIGNhbiBiZSByZWNhbGN1bGF0ZWRcblx0ICogY29ycmVjdGx5LiBDYW5ub3QgYmUgcGxhY2VkIG9uIHRoZSBwb3B1cERpcmVjdGl2ZSBiZWNhdXNlIG9mIGEgYnVnIHdoZXJlXG5cdCAqIEhvc3RMaXN0ZW5lcnMgZm9yIGdsb2JhbCBldmVudHMgZG9uJ3QgZmlyZVxuXHQgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE0MTkxXG5cdCAqL1xuXHRASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJykgb25SZXNpemUoKSB7XG5cdFx0aWYgKHRoaXMucG9wdXApIHRoaXMucG9wdXAuaGlkZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNob3cgdGhlIGFkZCBuZXcgYnV0dG9uIGluIHRoZSBwb3B1cFxuXHQgKi9cblx0QElucHV0KCkgcHVibGljIGFkZE5ldz86IEFkZE5ld1R5cGU7XG5cblx0LyoqIENvbmZpZ3VyZSB0aGUgYWRkTmV3IGJ1dHRvbiBsYWJlbCAmIGljb24gd2hlbiBhZGROZXcgaXMgdHJ1ZSBhbmQgc2V0IHRvIHN0YXRpY1xuXHQgKiBEZWZhdWx0IGlzIHNldCB0bzogeyBsYWJlbDogJ0FsbCBuZXcuLi4nLCBpY29uOiAnaWNvbi1hZGQnfVxuXHQgKiBAc2VlIEFkZE5ld09wdGlvbnNcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XG5cdCAqIEBleGFtcGxlXG5cdCAqIDxlYy1jb21ib2JveCBbYWRkTmV3XT1cInRydWVcIiBcblx0ICogXHQgICAgICAgICBbYWRkTmV3T3B0aW9uc109XCJ7IFxuKiBcdFx0XHRcdFx0XHRsYWJlbDogJ0hlbHAgbWUgY2hvb3NlLi4uJyxcbiogXHRcdFx0XHRcdFx0aWNvbjogJ2ljb24tc2VhcmNoJyxcbiogXHRcdFx0XHRcdFx0Y2xhc3NMaXN0OiAndGV4dC1ib2R5LTIgdGV4dC1saW5rJyB9XCI+XG5cdCAqIDwvZWMtY29tYm9ib3g+XG5cdCAqL1xuXHRASW5wdXQoKSBwdWJsaWMgYWRkTmV3T3B0aW9ucz86IEFkZE5ld09wdGlvbnMgPSB7IFxuXHRcdGxhYmVsOiAnQWRkIG5ldy4uLicsXG5cdFx0aWNvbjogJ2ljb24tYWRkJyxcblx0fTtcblxuXHQvKipcblx0ICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWxsb3dlZCBpbiB0aGUgaW5wdXQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBUZXh0Ym94Q29tcG9uZW50XG5cdCAqL1xuXHRASW5wdXQoKSBwdWJsaWMgbWF4bGVuZ3RoPzogbnVtYmVyO1xuXG5cblx0LyoqXG5cdCAqIFBvc2l0aW9uIG9mIHRoZSBtZW51IHJlbGF0aXZlIHRvIHRoZSB0ZXh0IGJveFxuXHQgKiBAZGVmYXVsdCAnYm90dG9tX3JpZ2h0J1xuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcblx0ICovXG5cdEBJbnB1dCgpIHB1YmxpYyBtZW51UG9zaXRpb24/OiBDb21ib2JveE1lbnVQb3NpdGlvbiA9ICdib3R0b21fcmlnaHQnO1xuXG5cblx0LyoqXG5cdCAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFsbG93ZWQgaW4gdGhlIGlucHV0XG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBUZXh0Ym94Q29tcG9uZW50XG5cdCAqL1xuXHRASW5wdXQoKSBwdWJsaWMgbWlubGVuZ3RoPzogbnVtYmVyO1xuXG5cblx0LyoqXG5cdCAqIEl0ZW1zIHRvIHNob3cgaW4gY29tYm9ib3ggbWVudVxuXHQgKlxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcblx0ICovXG5cdEBJbnB1dCgpIHB1YmxpYyBvcHRpb25zOiBBcnJheTxNZW51SXRlbT4gPSBbXTtcblxuXG5cdC8qKlxuXHQgKiBEaXNwbGF5IHRlbXBsYXRlIGZvciBtZW51IGl0ZW1zXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxuXHQgKi9cblx0QElucHV0KCkgcHVibGljIHRlbXBsYXRlVHlwZTogTWVudVRlbXBsYXRlVHlwZSA9ICdsYWJlbCc7XG5cblx0LyoqXG4gICAgICogT3B0aW9uYWwgY3VzdG9tIHRlbXBsYXRlIGZvciB0aGUgbWVudSBpdGVtcy4gTXVzdCBkZWNsYXJlIGEgdGVtcGxhdGVcblx0ICogaW5wdXQgdmFyaWFibGUgY2FsbGVkIFwiaXRlbVwiIGxpa2Ugc286IDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVOYW1lIGxldC1pdGVtPixcblx0ICogd2hlcmUgaXRlbSByZXByZXNlbnRzIHRoZSBtZW51SXRlbS5cbiAgICAgKiBXaWxsIG92ZXJyaWRlIHRoZSBjaG9pY2UgZm9yIHRlbXBsYXRlVHlwZSBpZiBwcm92aWRlZC5cblx0ICpcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGN1c3RvbU1lbnVUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cblx0LyoqXG5cdCAqIFdoZW4gdHJ1ZSwgdGhlIG1lbnUgaXRlbXMgd2lsbCBwcmVzZXJ2ZSB0aGUgaWNvbiBzcGFjZSB3aGVuIHRoZXJlIGlzIG5vIGljb25cblx0ICovXG5cdEBJbnB1dCgpIHB1YmxpYyBwcmVzZXJ2ZUljb25TcGFjZTogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBQb3NpdGlvbiB0aGUgbWVudSBhcyBmaXhlZCwgaWRlYWwgd2hlbiBjb21ib2JveGVzIGFyZSBpbnNpZGUgZGlhbG9nc1xuXHQgKiBEZWZhdWx0aW5nIHRvIHRydWUgc28gYWxsIG1lbnVzIHdpbGwgYmUgYXQgbGVhc3QgdGhlIHdpZHRoIG9mIHRoZVxuXHQgKiB0ZXh0Ym94ICsgYnV0dG9uLCBidXQgY2FuIGdyb3cgd2lkZXIgaWYgdGhlIGlubmVyIGVsZW1lbnRzIG5lZWQgaXRcblx0ICovXG5cdEBJbnB1dCgpIHB1YmxpYyBwb3B1cEZpeGVkOiBib29sZWFuID0gdHJ1ZTtcblxuXG5cdC8qKlxuXHQgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHJlY29yZHMgZnJvbSB0aGUgZGF0YXNvdXJjZVxuXHQgKi9cblx0QElucHV0KCkgcHVibGljIHRvdGFsUmVjb3Jkcz86IG51bWJlcjtcblxuXHQvKipcblx0ICogSWYgc2V0IHRvIHRydWUsIHdlIHdpbGwgdXBwZXJDYXNlIHRoZSB0ZXh0IGJveCBhbmQgYXBwbHkgdGhlIGNsYXNzIG9uIHRoZSBhZGQgYm94XG5cdCAqL1xuXHRASW5wdXQoKSBwdWJsaWMgdXBwZXJDYXNlOiBib29sZWFuID0gZmFsc2U7XG5cblxuXHQvKipUaGUgcGxhY2Vob2xkZXIgdG8gc2hvdyBpbiB0aGUgY29tYm9ib3guIExlYXZlIGVtcHR5IHRvIHVzZSBkZWZhdWx0IGJlaGF2aW9yIGRldGVybWluZWRcblx0ICogYnkgd2hldGhlciBBZGQgTmV3IGlzIGVuYWJsZWRcblx0ICovXG5cdEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG5cblx0LyoqIE9ic2VydmFibGUgdG8gc3Vic2NyaWJlIHRvIHdoZW4gdGhlIGNvbWJvYm94IG1lbnUgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZSAqL1xuXHRASW5wdXQoKSBwdWJsaWMgbG9hZE9uT3Blbk9ic2VydmFibGU/OiBPYnNlcnZhYmxlPE1lbnVJdGVtW10+IHwgdW5kZWZpbmVkO1xuXG5cdC8qKiBEbyBub3QgZGlzcGxheSB0aGUgdG9nZ2xlIGJ1dHRvbiB3aGVuIHRydWUgKi9cblx0QElucHV0KCkgcHVibGljIGhpZGVUb2dnbGVCdXR0b24gPSBmYWxzZTtcblxuXHQvKipcblx0ICogQWx3YXlzIHNob3cgdGhlIG1lbnUgd2hlbiB0aGUgZm9ybU1vZGVsIGhhcyBhIHZhbHVlLiBTZXRzXG5cdCAqIGhpZGVUb2dnbGVCdXR0b24gdG8gdHJ1ZSBhbmQgbWVudVN0YXR1cyB0byB2aXNpYmxlIGFzIHdlbGwuXG5cdCAqL1xuXHRASW5wdXQoKSBwdWJsaWMgYWx3YXlzT3BlbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBBZGRpdG9uYWwgY2xhc3NlcyB0byBhcHBseSB0byB0aGUgZWMtbWVudSBlbGVtZW50XG5cdCAqL1xuXHRASW5wdXQoKSBwdWJsaWMgbWVudUVsZW1lbnRDbGFzc2VzOiBNZW51SG9zdEVsZW1lbnRDbGFzc2VzIHwgc3RyaW5nW10gPSBbXTtcblxuXHQvKipcblx0ICogQWRkaXRpb25hbCBjbGFzc2VzIHRvIGFwcGx5IHRvIHRoZSAudGV4dGJveC1ncm91cCBlbGVtZW50XG5cdCAqL1xuXHRASW5wdXQoKSBwdWJsaWMgdGV4dGJveEVsZW1lbnRDbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdC8qKiBIaWRlICdObyBtYXRjaGVzJyBtZXNzYWdlIHdoZW4gdHJ1ZSAqL1xuXHRASW5wdXQoKSBwdWJsaWMgaGlkZU5vTWF0Y2hlczogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuICAgKiBUZXh0IHRvIHNob3cgd2hlbiB0aGUgbWVudSBpcyBlbXB0eS4gXCJObyBtYXRjaGVzXCIgaXMgdGhlIGRlZmF1bHQuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgbm9NYXRjaGVzVGV4dDogc3RyaW5nID0gJ05vTWF0Y2hlc19TQyc7XG5cblx0LyoqXG5cdCAqIFRydW5jYXRlIG1lbnUgaXRlbXMgd2hlbiB0cnVlXG5cdCAqL1xuXHRASW5wdXQoKSBwdWJsaWMgdHJ1bmNhdGVJdGVtczogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBOb3RpZnkgdGhlIHBhcmVudCB0aGF0IHRoZSBhZGQgbmV3IGJ1dHRvbiB3YXMgY2xpY2tlZFxuXHQgKiBAdG9kbyBkaXNjdXNzIGlmIHdlIG5lZWQgdG8gc2VuZCBhbG9uZyB0aGUgdmFsdWUgb3Igc2hvdWxkXG5cdCAqIHRoZSBwYXJlbnQgZ2V0IGl0IGZyb20gdGhlIGZvcm1Nb2RlbFxuXHQgKiAobHdmIDIwMTcuMDcuMTMpOiBJIHRoaW5rIHdlIG1pZ2h0IGFzIHdlbGwgc2VuZCB0aGUgdmFsdWUgYWxvbmcgYW5kXG5cdCAqIGxlYXZlIGl0IHVwIHRvIHRoZSBwYXJlbnQgdG8gZGVjaWRlIGhvdyB0byBoYW5kbGUgaXQuXG5cdCAqL1xuXHRAT3V0cHV0KCkgcHVibGljIGFkZE5ld0NsaWNrOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG5cblx0LyoqXG5cdCAqIE5vdGlmeSBwYXJlbnQgd2hlbiB0ZXh0IHR5cGVkIGludG8gdGV4dGJveFxuXHQgKi9cblx0QE91dHB1dCgpIHB1YmxpYyBzZWFyY2g6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cblxuXHRAVmlld0NoaWxkKCd0ZXh0Ym94JykgcHVibGljIHRleHRib3ghOiBUZXh0Ym94Q29tcG9uZW50O1xuXG5cdC8qKlxuXHQgKiBBY2Nlc3MgdG8gdGhlIG1lbnUncyBjb21wb25lbnQgdmlhIHRoZSAge0BsaW5rIFBvcHVwQ29udGFpbmVyRGlyZWN0aXZlfVxuXHQgKi9cblx0QFZpZXdDaGlsZChQb3B1cENvbnRhaW5lckRpcmVjdGl2ZSkgcHJpdmF0ZSBwb3B1cD86IFBvcHVwQ29udGFpbmVyRGlyZWN0aXZlO1xuXG5cblx0LyoqXG5cdCAqIFJlZmVyZW5jZSB0aGUgYWRkLW5ldyBidXR0b24gZWxlbWVudFxuXHQgKi9cblx0QFZpZXdDaGlsZCgnYWRkTmV3QnV0dG9uJykgcHJpdmF0ZSBhZGROZXdCdXR0b24hOiBFbGVtZW50UmVmO1xuXG5cblx0LyoqXG5cdCAqIEZpbHRlcmVkIEl0ZW1zIHRvIHNob3cgaW4gY29tYm9ib3ggbWVudVxuXHQgKi9cblx0cHVibGljIGZpbHRlcmVkT3B0aW9uczogQXJyYXk8TWVudUl0ZW0+ID0gW107XG5cblxuXHQvKipcblx0ICogVHJhY2tzIGlmIHRoZSBtZW51IGlzIG9wZW4gb3IgaGlkZGVuXG5cdCAqL1xuXHRwdWJsaWMgbWVudVN0YXR1czogUG9wdXBTdGF0dXMgPSAnaGlkZGVuJztcblxuXG5cdC8qKlxuXHQgKiBQbGFjZWhvbGRlciB0byBhc3NpZ24gdG8gdGV4dGJveFxuXHQgKi9cblx0cHVibGljIGVmZmVjdGl2ZVBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcblxuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnRseS1zZWxlY3RlZCBtZW51IGl0ZW1cblx0ICovXG5cdHB1YmxpYyBzZWxlY3RlZEl0ZW06IE1lbnVJdGVtIHwgbnVsbCA9IG51bGw7XG5cblxuXHQvKipcblx0ICogRm9ybUNvbnRyb2wgZm9yIHRoZSB0ZXh0Ym94XG5cdCAqL1xuXHRwdWJsaWMgdGV4dGJveEZvcm1Nb2RlbDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJyk7XG5cblxuXHQvKipcblx0ICogVHJhY2tzIHdoZXRoZXIgdGhlIGFkZCBuZXcgYnV0dG9uIGlzIHNlbGVjdGVkXG5cdCAqL1xuXHRwdWJsaWMgYWRkTmV3U2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXG5cdC8qKlxuXHQgKiBUcmFja3Mgd2hldGhlciB0aGUgdGV4dGJveEZvcm1Nb2RlbCB2YWx1ZSBtYXRjaGVzIGFuIGl0ZW0gaW4gdGhlIGZpbHRlcmVkT3B0aW9uc1xuXHQgKi9cblx0cHVibGljIGZvdW5kTWF0Y2g6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHQvKipcblx0ICogTnVtYmVyIG9mIGZpbHRlcmVkIG9wdGlvbnMgdG8gZGlzcGxheSBpbiB0aGUgZm9vdGVyLiAgRXhjbHVkZXMgaGVhZGluZ3MuXG5cdCAqL1xuXHRwdWJsaWMgZmlsdGVyZWRPcHRpb25Db3VudDogbnVtYmVyID0gMDtcblxuXHQvKipcblx0ICogRmxhdCBsaXN0IG9mIHNlbGVjdGFibGUgaXRlbXMgaW4gdGhlIGNvbWJvYm94LlxuXHQgKiBEb2VzIG5vdCBpbmNsdWRlIGhlYWRpbmdzIG9yIGRpdmlkZXItc2VjdGlvbiBpdGVtcy5cblx0ICovXG5cdHByaXZhdGUgc2VsZWN0YWJsZUl0ZW1zOiBNZW51SXRlbVtdID0gW107XG5cblx0LyoqXG5cdCAqIEluZGV4IG9mIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgb3B0aW9uc1xuXHQgKi9cblx0cHJpdmF0ZSBzZWxlY3RlZEl0ZW1JbmRleDogbnVtYmVyID0gLTE7XG5cblx0LyoqIFBsYWNlaG9sZGVyIHRleHQgZm9yICdDaG9vc2Ugb3IgQWRkLi4uJyAqL1xuXHRwcml2YXRlIGNob29zZU9yQWRkUGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuXG5cdC8qKiBQbGFjZWhvbGRlciB0ZXh0IGZvciAnQ2hvb3NlJyAqL1xuXHRwcml2YXRlIGNob29zZVBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcblxuXHRwcml2YXRlIGhhc0RhdGFCZWVuTG9hZGVkT25PcGVuOiBib29sZWFuID0gZmFsc2U7XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cHJvdGVjdGVkIHZhbGlkYXRpb25NZXNzYWdlU2VydmljZTogVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBmb3JtR3JvdXBIZWxwZXI6IEZvcm1Hcm91cEhlbHBlcixcblx0XHRwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBzY3JvbGxTZXJ2aWNlOiBTY3JvbGxTZXJ2aWNlXG5cdCkge1xuXHRcdHN1cGVyKHZhbGlkYXRpb25NZXNzYWdlU2VydmljZSwgZm9ybUdyb3VwSGVscGVyKTtcblx0fVxuXG5cblx0LyoqXG5cdCAqIFRoZSBhbmd1bGFyIG9uQ2hhbmdlcyBsaWZlY3ljbGUgZXZlbnRcblx0ICogQHNlZSBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvbGlmZWN5Y2xlLWhvb2tzXG5cdCAqL1xuXHRwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuXHRcdHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuXG5cdFx0Ly8gd2hlbiBvcHRpb25zIGNoYW5nZXNcblx0XHRpZiAoY2hhbmdlcy5vcHRpb25zKSB7XG5cdFx0XHR0aGlzLnJlc2V0T3B0aW9ucygpO1xuXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHBvcHVwIHBvc2l0aW9uXG5cdFx0XHRpZiAodGhpcy5wb3B1cCkge1xuXHRcdFx0XHR0aGlzLnBvcHVwLnVwZGF0ZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSB2YWxpZGF0b3JzIG9uIHRoZSB0ZXh0Ym94XG5cdFx0aWYgKGNoYW5nZXMucmVxdWlyZWQgfHwgY2hhbmdlcy5taW5sZW5ndGggfHwgY2hhbmdlcy5tYXhsZW5ndGgpIHtcblx0XHRcdHRoaXMuc2V0VGV4dGJveEZvcm1Nb2RlbFZhbGlkYXRvcnMoKTtcblx0XHR9XG5cblx0XHQvLyBVcGRhdGUgcGxhY2Vob2xkZXIgdGV4dCB3aGVuICdBZGQgTmV3JyBpcyBjb25kaXRpb25hbC5cblx0XHQvLyBuZ09uQ2hhbmdlcygpIGtpY2tzIG9mZiBiZWZvcmUgbmdPbkluaXQsIHNvIGluIG9yZGVyXG5cdFx0Ly8gdG8gbm90IG92ZXJ3cml0ZSBhIHVzZXItcHJvdmlkZWQgcGxhY2Vob2xkZXIsIGRvIG5vdFxuXHRcdC8vIHVwZGF0ZSBwbGFjZWhvbGRlciBvbiBmaXJzdCBjaGFuZ2UgKG5nT25Jbml0IHdpbGwgdGFrZSBjYXJlIG9mIGl0KS5cblx0XHRpZiAoKGNoYW5nZXMuYWRkTmV3ICYmICFjaGFuZ2VzLmFkZE5ldy5pc0ZpcnN0Q2hhbmdlKCkpIHx8IGNoYW5nZXMucGxhY2Vob2xkZXIpIHtcblx0XHRcdHRoaXMudXBkYXRlUGxhY2Vob2xkZXJUZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBhbmd1bGFyIG9uSW5pdCBsaWZlY3ljbGUgaG9va1xuXHQgKiBAc2VlIGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9saWZlY3ljbGUtaG9va3Ncblx0ICovXG5cdHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcblx0XHRzdXBlci5uZ09uSW5pdCgpO1xuXG5cdFx0aWYgKHRoaXMuYWx3YXlzT3Blbikge1xuXHRcdFx0dGhpcy5oaWRlVG9nZ2xlQnV0dG9uID0gdHJ1ZTtcblx0XHRcdHRoaXMubWVudVN0YXR1cyA9ICd2aXNpYmxlJztcblx0XHR9XG5cblx0XHQvLyBHZXQgdHJhbnNsYXRlZCBwbGFjZWhvbGRlciB0ZXh0XG5cdFx0dGhpcy5jaG9vc2VPckFkZFBsYWNlaG9sZGVyID0gYCR7dGhpcy50cmFuc2xhdGUuaW5zdGFudCgnQ2hvb3NlIG9yIGFkZCcpfS4uLmA7XG5cdFx0dGhpcy5jaG9vc2VQbGFjZWhvbGRlciA9IGAke3RoaXMudHJhbnNsYXRlLmluc3RhbnQoJ0Nob29zZScpfWA7XG5cblx0XHR0aGlzLmZvcm1Nb2RlbENoYW5nZWQodGhpcy5mb3JtTW9kZWwudmFsdWUpO1xuXHRcdHRoaXMuc2V0VGV4dGJveEZvcm1Nb2RlbFZhbGlkYXRvcnMoKTtcblxuXHRcdC8vIEVycm9ycyBmb3IgdGhpcyBjb21wb25lbnQgYXJlIGRpc3BsYXllZCB2aWEgdGhlIHZhbGlkYXRpb25FcnJvcnMgcHJvcGVydHksIHdoaWNoIGlzXG5cdFx0Ly8gcG9wdWxhdGVkIHdoZW4gdHJhbnNsYXRlVmFsaWRhdGlvbk1lc3NhZ2VzIGlzIHJ1bi5cblx0XHQvLyBXaGVuIHRoZSBpbnRlcm5hbCBUZXh0Ym94Q29tcG9uZW50IGhhcyB2YWxpZGF0aW9uIGVycm9ycywgd2Ugc2V0IHRoZW0gb24gdGhlXG5cdFx0Ly8gZm9ybU1vZGVsIGFzIHdlbGwuICBUaGlzIHVwZGF0ZXMgdGhlIHZhbGlkaXR5IG9mIG91ciBDb21ib2JveENvbXBvbmVudCBjb250cm9sLFxuXHRcdC8vIGJ1dCBkb2VzIG5vdCB0cmlnZ2VyIHRyYW5zbGF0aW9uLiAgU3Vic2NyaWJlIHRvIHN0YXR1c0NoYW5nZXMgaGVyZSBzbyBjb21wb25lbnRcblx0XHQvLyB2YWxpZGF0aW9uIGVycm9ycyB3aWxsIGFwcGVhciBhbG9uZyB3aXRoIHRoZSBDb21ib2JveENvbXBvbmVudCdzIGxhYmVsLlxuXHRcdHRoaXMuZm9ybU1vZGVsLnZhbHVlQ2hhbmdlcy5waXBlKFxuXHRcdFx0dGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKVxuXHRcdCkuc3Vic2NyaWJlKGRhdGEgPT4gdGhpcy5mb3JtTW9kZWxDaGFuZ2VkKGRhdGEpKTtcblxuXHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zdGF0dXNDaGFuZ2VzLnBpcGUoXG5cdFx0XHR0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpXG5cdFx0KS5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLnNldEZvcm1Nb2RlbFZhbGlkYXRpb25FcnJvcnMoZGF0YSkpO1xuXG5cdFx0Ly8gZGVmYXVsdCBwbGFjZWhvbGRlclxuXHRcdHRoaXMudXBkYXRlUGxhY2Vob2xkZXJUZXh0KCk7XG5cdH1cblxuXG5cdC8qKlxuXHQgKiBUaGUgYW5ndWxhciBhZnRlclZpZXdJbml0IGxpZmVjeWNsZSBob29rXG5cdCAqIEBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2xpZmVjeWNsZS1ob29rc1xuXHQgKi9cblx0cHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMucG9wdXApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBhbGxvdyBvdmVyZmxvdyBvdXQgb2YgdGhlIHNjcm9sbFBhcmVudFxuXHRcdC8vIHByZXZlbnRzIG1lbnUgZnJvbSBvYnNjdXJpbmcgdGhlIGNvbWJvYm94XG5cdFx0bGV0IHBvcHBlck9wdGlvbnM6IFBvcHBlci5Qb3BwZXJPcHRpb25zID0ge1xuXHRcdFx0bW9kaWZpZXJzOiB7XG5cdFx0XHRcdHByZXZlbnRPdmVyZmxvdzoge1xuXHRcdFx0XHRcdGJvdW5kYXJpZXNFbGVtZW50OiAndmlld3BvcnQnXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gY29udmVydCB0aGUgQ29tYm9ib3hNZW51UG9zaXRpb24gaW50byBhIFBvcHBlclBsYWNlbWVudFxuXHRcdHN3aXRjaCAodGhpcy5tZW51UG9zaXRpb24pIHtcblx0XHRcdGNhc2UgKFwidG9wX2xlZnRcIik6XG5cdFx0XHRcdHBvcHBlck9wdGlvbnMucGxhY2VtZW50ID0gJ3RvcC1zdGFydCc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAoXCJ0b3BfcmlnaHRcIik6XG5cdFx0XHRcdHBvcHBlck9wdGlvbnMucGxhY2VtZW50ID0gJ3RvcC1lbmQnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgKFwiYm90dG9tX2xlZnRcIik6XG5cdFx0XHRcdHBvcHBlck9wdGlvbnMucGxhY2VtZW50ID0gJ2JvdHRvbS1zdGFydCc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAoXCJib3R0b21fcmlnaHRcIik6XG5cdFx0XHRcdHBvcHBlck9wdGlvbnMucGxhY2VtZW50ID0gJ2JvdHRvbS1lbmQnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtZW51UG9zaXRpb24gZm9yIENvbWJvYm94Q29tcG9uZW50LmApXG5cdFx0fVxuXG5cdFx0Ly8gU2Nyb2xsIHRoZSBtZW51IHRvIHRoZSBzZWxlY3RlZCBpdGVtIG9uY2UgdGhlIHBvcHVwIG1lbnUgaXMgcmVhZHlcblx0XHRwb3BwZXJPcHRpb25zLm9uQ3JlYXRlID0gKCkgPT4ge1xuXHRcdFx0dGhpcy5zY3JvbGxNZW51KCk7XG5cblx0XHRcdGlmICh0aGlzLnBvcHVwRml4ZWQpIHtcblx0XHRcdFx0dGhpcy5wb3B1cCEuZml4UG9zaXRpb24oKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5wb3B1cEZpeGVkKSB7XG5cdFx0XHRwb3BwZXJPcHRpb25zLm9uVXBkYXRlID0gKCkgPT4ge1xuXHRcdFx0XHR0aGlzLnBvcHVwIS5maXhQb3NpdGlvbigpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMucG9wdXAucG9wcGVyT3B0aW9ucyA9IHBvcHBlck9wdGlvbnM7XG5cblx0XHR0aGlzLnBvcHVwLnBvcHBlclN0YXR1c0NoYW5nZS5waXBlKFxuXHRcdFx0dGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKVxuXHRcdCkuc3Vic2NyaWJlKChldmVudDogJ3Zpc2libGUnIHwgJ2hpZGRlbicpID0+IHtcblx0XHRcdFx0dGhpcy5tZW51U3RhdHVzID0gZXZlbnQ7XG5cblx0XHRcdFx0Ly8gU3luY2hyb25pemUgdGhlIGZvcm1Nb2RlbCBhbmQgdGV4dEZvcm1Nb2RlbCB2YWx1ZXMgd2hlbiB0aGVcblx0XHRcdFx0Ly8gcG9wdXAgbWVudSBjbG9zZXMgYW5kIHVuLWZpbHRlciB0aGUgb3B0aW9ucyBhbmQgcmVzZXQgdGhlXG5cdFx0XHRcdC8vIHNlbGVjdGVkSXRlbSBhbmQgaW5kZXhcblx0XHRcdFx0aWYgKGV2ZW50ID09PSAnaGlkZGVuJykge1xuXHRcdFx0XHRcdHRoaXMuc3luY01vZGVsVmFsdWVzKCk7XG5cdFx0XHRcdFx0dGhpcy5yZXNldE9wdGlvbnMoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXG5cdC8qKlxuXHQgKiBTZXQgZXJyb3JzIG9uIHRoZSB0ZXh0Ym94Rm9ybU1vZGVsLCB3aGljaCB3aWxsIHRoZW4gc2V0IGVycm9ycyBvbiB0aGVcblx0ICogZm9ybU1vZGVsLiBBbHNvIG1hcmsgdGhlIGZvcm1Nb2RlbCBhcyB0b3VjaGVkIHRvIGRpc3BsYXkgYW55IGVycm9ycy5cblx0ICogQHBhcmFtIGVycm9ycyBrZXkocykgb2YgVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlIGVycm9ycyB0byBkaXNwbGF5IG9yIHJlbW92ZVxuXHQgKiBAbWVtYmVyb2YgQ29tb2JvYm94Q29tcG9uZW50XG5cdCAqL1xuXHRwdWJsaWMgc2V0RXJyb3JzKGVycm9yczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0pOiB2b2lkIHtcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0RXJyb3JzKGVycm9ycyk7XG5cdFx0dGhpcy5mb3JtTW9kZWwubWFya0FzVG91Y2hlZCgpO1xuXHR9XG5cblxuXHQvKipcblx0ICogVW5maWx0ZXIgb3B0aW9ucyBhbmQgdXBkYXRlIHRoZSBzZWxlY3RlZEl0ZW0gYW5kIHNlbGVjdGVkSXRlbUluZGV4XG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxuXHQgKi9cblx0cHVibGljIHJlc2V0T3B0aW9ucyhvcHRpb25zPzogTWVudUl0ZW1bXSk6IHZvaWQge1xuXHRcdHRoaXMuZmlsdGVyZWRPcHRpb25zID0gb3B0aW9ucyB8fCB0aGlzLm9wdGlvbnM7XG5cdFx0dGhpcy5zZWxlY3RhYmxlSXRlbXMgPSBNZW51Q29tcG9uZW50LmdldFNlbGVjdGFibGVJdGVtcyh0aGlzLmZpbHRlcmVkT3B0aW9ucyk7XG5cdFx0Ly8gZG8gbm90IGNvdW50IGhlYWRpbmdzXG5cdFx0dGhpcy5maWx0ZXJlZE9wdGlvbkNvdW50ID0gdGhpcy5maWx0ZXJlZE9wdGlvbnM/LmZpbHRlcihvID0+IG8uZGlzcGxheSAhPT0gJ2hlYWRpbmcnICYmIG8uZGlzcGxheSAhPT0gJ2RpdmlkZWQtc2VjdGlvbicpLmxlbmd0aCB8fCAwO1xuXG5cdFx0Ly9pZiB0aGV5IGhhdmUgbm8gc2VhcmNoIHRlcm0sIGRvbid0IHRyeSB0byBzZWxlY3QgYW55dGhpbmcgc28gdGhleSBjYW4gY2xlYXIgdGhlIGJveCBvdXQgYnkgaGl0dGluZyBlbnRlclxuXHRcdC8vaWYgdGhleSBoYXZlIGEgc2VhcmNoIHRlcm0gYW5kIHRoZSBvcHRpb25zIGNoYW5nZWQsIHNlbGVjdCBhbiBvcHRpb24gZnJvbSB0aGUgbWVudSBzbyB0aGV5IHdpbGwgZ2V0IGl0IGF1dG9tYXRpY2FsbHkgaWYgdGhleSBoaXQgZW50ZXJcblx0XHRpZiAodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlICE9PSAnJykge1xuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IHRoaXMuZmluZERlZmF1bHRTZWxlY3Rpb25JbmRleCh0aGlzLnNlbGVjdGFibGVJdGVtcywgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKTtcblx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtID0gdGhpcy5zZWxlY3RhYmxlSXRlbXNbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleF0gfHwgbnVsbDtcblx0XHRcdHRoaXMuc2Nyb2xsTWVudSh0aGlzLnNlbGVjdGVkSXRlbUluZGV4KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly9pZiB0aGV5IGhhdmUgbm8gc2VhcmNoIHRlcm0gYW5kIHRoZSBvcHRpb25zIGFyZSByZXNldCwgZG9uJ3QgYXV0by1waWNrIHRoZSBmaXJzdCBvbmVcblx0XHRcdC8vc28gdGhhdCBlbnRlciB3aWxsIGFsbG93IHRoZW0gdG8gd2lwZSBvdXQgdGhlaXIgbGFzdCBzZWxlY3Rpb25cblx0XHRcdHRoaXMuY2xlYXJTZWxlY3RlZEl0ZW0oKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTGlzdGVuIHRvIHRoZSBzZWxlY3RlZCBjaGFuZ2VkIGV2ZW50IGZyb20ge0BsaW5rIE1lbnVDb21wb25lbnR9IGFuZCB1cGRhdGUgdGhlIGZvcm1cblx0ICogbW9kZWwgYW5kIGNsb3NlIG1lbnVcblx0ICovXG5cdHB1YmxpYyBzZWxlY3RlZENoYW5nZWQoaXRlbTogTWVudUl0ZW0pOiB2b2lkIHtcblx0XHR0aGlzLnNldEZvcm1Nb2RlbFZhbHVlKGl0ZW0pO1xuXHRcdHRoaXMudG9nZ2xlTWVudSgpO1xuXHR9XG5cblxuXHQvKipcblx0ICogU2hvdyBhbmQgaGlkZSB0aGUgcG9wdXAgbWVudVxuXHQgKlxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcblx0ICovXG5cdHB1YmxpYyB0b2dnbGVNZW51KGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMucG9wdXApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZXZlbnQpIHtcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5mb3JtTW9kZWwuZGlzYWJsZWQpIHtcblx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICd2aXNpYmxlJykge1xuXHRcdFx0XHQvLyBXaGVuIHRoZSBwb3B1cCBpcyBoaWRkZW4gaXQgd2lsbCBlbWl0IGl0cyBjaGFuZ2VkIHN0YXR1cyBhbmRcblx0XHRcdFx0Ly8gd2Ugd2lsbCByZXNldCB2YWx1ZXMgaWYgbmVlZCBiZS5cblx0XHRcdFx0dGhpcy5wb3B1cC5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0aWYgKHRoaXMubG9hZE9uT3Blbk9ic2VydmFibGUgJiYgIXRoaXMuaGFzRGF0YUJlZW5Mb2FkZWRPbk9wZW4pIHtcblx0XHRcdFx0XHR0aGlzLnBlbmRpbmcgPSB0cnVlO1xuXG5cdFx0XHRcdFx0dGhpcy5sb2FkT25PcGVuT2JzZXJ2YWJsZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgocmVzdWx0OiBNZW51SXRlbVtdKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmhhc0RhdGFCZWVuTG9hZGVkT25PcGVuID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0dGhpcy5wZW5kaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0XHR0aGlzLm9wdGlvbnMgPSByZXN1bHQ7XG5cblx0XHRcdFx0XHRcdHRoaXMucmVzZXRPcHRpb25zKCk7XG5cdFx0XHRcdFx0XHR0aGlzLnBvcHVwIS5zaG93KCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5wb3B1cC5zaG93KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgb25CbHVyKCk6IHZvaWQge1xuXHRcdHRoaXMuZm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcblx0fVxuXG5cblx0LyoqXG5cdCAqIENvbnRyb2wgdGhlIG1lbnUgd2l0aCBrZXlib2FyZCBuYXZpZ2F0aW9uXG5cdCAqXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2tleSNFeGFtcGxlIHwgS2V5Ym9hcmRFdmVudC5rZXl9XG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2tleS9LZXlfVmFsdWVzIHwgS2V5IFZhbHVlc31cblx0ICpcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XG5cdCAqL1xuXHRwdWJsaWMga2V5TmF2aWdhdGUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcblx0XHRzd2l0Y2ggKGV2ZW50LmtleSkge1xuXHRcdFx0Y2FzZSBcIkFycm93RG93blwiOlxuXHRcdFx0Y2FzZSBcIkRvd25cIjpcblx0XHRcdGNhc2UgXCJBcnJvd1VwXCI6XG5cdFx0XHRjYXNlIFwiVXBcIjpcblx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdHRoaXMub25BcnJvd0Rvd25VcChldmVudCk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiQmFja3NwYWNlXCI6XG5cdFx0XHRjYXNlIFwiRGVsZXRlXCI6XG5cdFx0XHRjYXNlIFwiRGVsXCI6XG5cdFx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICdoaWRkZW4nKSB7XG5cdFx0XHRcdFx0dGhpcy50b2dnbGVNZW51KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiVGFiXCI6XG5cdFx0XHRcdC8vIElmIHRhYmJpbmcgZnJvbSB0aGUgdGV4dGJveCB0byB0aGUgYnV0dG9uLCBvdmVycmlkZSB0aGUgdGV4dGJveCBhcyBiZWluZ1xuXHRcdFx0XHQvLyBtYXJrZWQgdG91Y2hlZCBzbyB3ZSBkb24ndCBzZWUgdGhlIGludmFsaWQgc3RhdGUuIE9ubHkgc2hvdyB0aGUgaW52YWxpZCBzdGF0ZVxuXHRcdFx0XHQvLyB3aGVuIHRhYmJpbmcgb3V0IG9mIGNvbWJvYm94IGZyb20gdGhlIGJ1dHRvbiBvciBiYWNrIHRhYmJpbmcgZnJvbSB0aGUgdGV4dGJveFxuXHRcdFx0XHQvLyBpZiAoZXZlbnQua2V5ID09PSAnVGFiJyAmJiBldmVudC5zcmNFbGVtZW50ICYmIGV2ZW50LnNyY0VsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJykge1xuXHRcdFx0XHQvLyBcdGlmIChldmVudC5zaGlmdEtleSkge1xuXHRcdFx0XHQvLyBcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcblx0XHRcdFx0Ly8gXHRcdHRoaXMuZm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcblx0XHRcdFx0Ly8gXHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLm1hcmtBc1VudG91Y2hlZCgpO1xuXHRcdFx0XHQvLyBcdH1cblx0XHRcdFx0Ly8gfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdUYWInICYmIGV2ZW50LnNyY0VsZW1lbnQgJiYgZXZlbnQuc3JjRWxlbWVudC50YWdOYW1lID09PSAnQlVUVE9OJykge1xuXHRcdFx0XHQvLyBcdGlmICghZXZlbnQuc2hpZnRLZXkpIHtcblx0XHRcdFx0Ly8gXHRcdHRoaXMuZm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcblx0XHRcdFx0Ly8gXHR9XG5cdFx0XHRcdC8vIH1cblxuXHRcdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAndmlzaWJsZScpIHtcblx0XHRcdFx0XHQvL2lmIHRoZSBzZWxlY3RlZCBvcHRpb24gaXMgdGhlIGFkZCBuZXcgYnV0dG9uIGxldCBpdCBmaXJlIGJ1dCBkb24ndCBhbGxvd1xuXHRcdFx0XHRcdC8vdGhlIHRhYiBldmVudCB0byBjYXJyeSB0aGVtIGZvcndhcmQgZnJvbSB3aGVyZXZlciB0aGV5IGxhbmQgLSB0aGV5IHdvdWxkIHNraXAgdGhlIGZpcnN0IGJveCBvbiB0aGUgYWRkIG5ldyBmb3JtXG5cdFx0XHRcdFx0Ly9JbiB0aGUgbm9ybWFsIGNhc2Ugd2Ugd2FudCB0byBhbGxvdyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvciB0aGV5IHdvbid0IGJlIGFibGUgdG8gdGFiIG91dCBvZiB0aGUgY29udHJvbCBhdCBhbGwuXG5cdFx0XHRcdFx0aWYodGhpcy5hZGROZXdTZWxlY3RlZCl7XG5cdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuY29tbWl0U2VsZWN0aW9uKGV2ZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcIkVudGVyXCI6XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ3Zpc2libGUnKSB7XG5cdFx0XHRcdFx0dGhpcy5jb21taXRTZWxlY3Rpb24oZXZlbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiRXNjYXBlXCI6XG5cdFx0XHRjYXNlIFwiRXNjXCI6XG5cdFx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICd2aXNpYmxlJykge1xuXHRcdFx0XHRcdC8vIEp1c3QgY2xvc2UgdGhlIG1lbnUsIGRvIG5vdCBmb2N1cyB0aGUgbmV4dCBlbGVtZW50IG9uIHRhYlxuXHRcdFx0XHRcdC8vIHVubGVzcyB0aGUgbWVudSBpcyBoaWRkZW5cblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdFx0Ly8gQ2xvc2UgdGhlIG1lbnUgYmVmb3JlIHdlIHJlc2V0IHNlbGVjdGVkSXRlbSBzbyB3ZSBkb24ndCBzZWUgdGhlIGhpZ2hsaWdodCBjaGFuZ2luZ1xuXHRcdFx0XHRcdC8vIHdoZW4gcmVzZXQgdGhlIHNlbGVjdGVkIGl0ZW0gYmFjayB0byB0aGUgZm9ybU1vZGVsXG5cdFx0XHRcdFx0dGhpcy50b2dnbGVNZW51KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCIgXCI6XG5cdFx0XHRjYXNlIFwiU3BhY2ViYXJcIjpcblx0XHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ2hpZGRlbicpIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdHRoaXMudG9nZ2xlTWVudSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAnaGlkZGVuJyAmJiBldmVudC5rZXkgIT09ICdTaGlmdCcpIHtcblx0XHRcdFx0XHR0aGlzLnRvZ2dsZU1lbnUoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGYWNpbGl0YXRlcyBhZGRpbmcgaXRlbXMgdG8gYSBjb21ib2JveFxuXHQgKlxuXHQgKiBAcGFyYW0gYWRkRm4gRnVuY3Rpb24gZnJvbSBwYXJlbnQgdGhhdCBzaG91bGQgbWFrZSBhbiBBUEkgcmVxdWVzdCB0byBhZGQgYSBuZXcgaXRlbSB0byB0aGUgY29tYm9ib3gncyBvcHRpb25zXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxuXHQgKi9cblx0cHVibGljIGFzeW5jIGFkZE5ld0l0ZW0oYWRkRm46ICgpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGFkZEZuKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIFdlIGdhdmUgaXQgb3VyIGJlc3QgdHJ5LCBzb21ldGhpbmcgaXMgcmVhbGx5IHdoYWNrLCBzbyBsZXQncyBqdXN0IHNldCB0aGUgZXJyb3JcbiAgICAgICAgICAgIHRoaXMuc2V0RXJyb3JzKHsgJ2FkZG5ldyc6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9nZ2xlTWVudSgpO1xuICAgIH1cblxuXHQvKipcblx0ICogRmlndXJlIG91dCB3aGV0aGVyIHRoZXkgYXJlIGFkZGluZyBuZXcgb3IgaGF2ZSBhbiBpdGVtIHNlbGVjdGVkLCBhbmQgY29tbWl0IGl0IHRvIHRoZSBmb3JtIG1vZGVsXG5cdCAqL1xuICBwcml2YXRlIGNvbW1pdFNlbGVjdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmFkZE5ld1NlbGVjdGVkKSB7XG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdHRoaXMub25BZGROZXcoZXZlbnQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldEZvcm1Nb2RlbFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtKTtcblx0XHRcdHRoaXMudG9nZ2xlTWVudSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSB0ZXh0Ym94IHRvIHRoZSBwYXJlbnQgd2hlbiB0aGUgYWRkIG5ldyBidXR0b24gaXNcblx0ICogY2xpY2tlZFxuXHQgKlxuXHQgKiBAcGFyYW0gZXZlbnQgQWRkIG5ldyBidXR0b24gY2xpY2sgb3IgZW50ZXIga2V5IGV2ZW50XG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxuXHQgKi9cblx0cHVibGljIG9uQWRkTmV3KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSBmYWxzZTtcblx0XHR0aGlzLmFkZE5ld0NsaWNrLmVtaXQodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKTtcblx0XHR0aGlzLnBvcHVwPy5oaWRlKCk7XG5cdH1cblxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZSB0aGUgZHJvcGRvd24gbWVudSB1c2luZyB1cCBhbmQgZG93biBhcnJvdyBrZXlzXG5cdCAqXG5cdCAqIEBwYXJhbSBldmVudCBVcCBvciBkb3duIGFycm93IGtleWRvd24gZXZlbnRcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XG5cdCAqL1xuXHRwcml2YXRlIG9uQXJyb3dEb3duVXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcblx0XHRzd2l0Y2ggKGV2ZW50LmtleSkge1xuXHRcdFx0Y2FzZSBcIkFycm93RG93blwiOlxuXHRcdFx0Y2FzZSBcIkRvd25cIjpcblx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPT09IC0xICYmIHRoaXMuYWRkTmV3QnV0dG9uICYmICF0aGlzLmFkZE5ld0J1dHRvbi5uYXRpdmVFbGVtZW50LmhpZGRlbiAmJiAhdGhpcy5hZGROZXdTZWxlY3RlZCkge1xuXHRcdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPCB0aGlzLnNlbGVjdGFibGVJdGVtcy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCsrO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuYWRkTmV3U2VsZWN0ZWQpIHtcblx0XHRcdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJBcnJvd1VwXCI6XG5cdFx0XHRjYXNlIFwiVXBcIjpcblx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPT09IC0xICYmIHRoaXMuYWRkTmV3QnV0dG9uICYmICF0aGlzLmFkZE5ld0J1dHRvbi5uYXRpdmVFbGVtZW50LmhpZGRlbiAmJiB0aGlzLmFkZE5ld1NlbGVjdGVkKSB7XG5cdFx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IGZhbHNlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPiAtMSkge1xuXHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXgtLTtcblxuXHRcdFx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID09PSAtMSAmJiB0aGlzLmFkZE5ld0J1dHRvbiAmJiAhdGhpcy5hZGROZXdCdXR0b24ubmF0aXZlRWxlbWVudC5oaWRkZW4pIHtcblx0XHRcdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuc2VsZWN0ZWRJdGVtID0gdGhpcy5zZWxlY3RhYmxlSXRlbXNbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleF07XG5cblx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAnaGlkZGVuJykge1xuXG5cdFx0XHR0aGlzLnNldEZvcm1Nb2RlbFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zY3JvbGxNZW51KCk7XG5cdFx0fVxuXHR9XG5cblxuXG5cdC8qKlxuXG5cdCAqIEZpbHRlciBhcnJheSBvZiBvcHRpb25zIGJ5IGxhYmVsIG9yIGNhcHRpb24gKGNvbnRhaW5zKVxuXHQgKlxuXHQgKiBAcGFyYW0gZmlsdGVyVGV4dCBUaGUgdmFsdWUgb2YgdGV4dGJveCB0aGF0IHdlIHdpbGwgZmlsdGVyIG91ciBvcHRpb25zIGJ5XG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxuXHQgKi9cblx0cHJpdmF0ZSBmaWx0ZXJPcHRpb25zQXJyYXkoZmlsdGVyVGV4dDogc3RyaW5nKTogQXJyYXk8TWVudUl0ZW0+IHtcblx0XHRsZXQgc2VhcmNoVGV4dCA9IGZpbHRlclRleHQudG9Mb3dlckNhc2UoKTtcblx0XHRpZiAoZmlsdGVyVGV4dCAmJiBmaWx0ZXJUZXh0ICE9PSAnJykge1xuXHRcdFx0Y29uc3QgbWF0Y2hlc1NlYXJjaCA9IChpdGVtOiBNZW51SXRlbSkgPT4gaXRlbS5sYWJlbC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoVGV4dCkgPj0gMCB8fCAoaXRlbS5jYXB0aW9uICYmIGl0ZW0uY2FwdGlvbi50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoVGV4dCkgPj0gMCk7XG5cdFx0XHRyZXR1cm4gdGhpcy5vcHRpb25zLnJlZHVjZSgoZmlsdGVyZWRJdGVtcywgaXRlbSkgPT4ge1xuXHRcdFx0XHQvLyBNYXRjaCB0aGUgaXRlbSBpdHNlbGYgaWYgaXQgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlblxuXHRcdFx0XHRpZiAoIWl0ZW0uaXRlbXM/Lmxlbmd0aCAmJiBtYXRjaGVzU2VhcmNoKGl0ZW0pKSB7XG5cdFx0XHRcdFx0ZmlsdGVyZWRJdGVtcy5wdXNoKGl0ZW0pO1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGNoaWxkcmVuLCBmaWx0ZXIgdGhlbSBhbmQgYWRkIHRoZSBwYXJlbnQgaWYgaXQgaGFzIGFueSBjaGlsZHJlbiB0aGF0IG1hdGNoXG5cdFx0XHRcdH0gZWxzZSBpZiAoaXRlbS5pdGVtcz8ubGVuZ3RoICYmIChpdGVtLmRpc3BsYXkgPT09ICdoZWFkaW5nJyB8fCBpdGVtLmRpc3BsYXkgPT09ICdkaXZpZGVkLXNlY3Rpb24nKSkge1xuXHRcdFx0XHRcdGNvbnN0IGZpbHRlcmVkQ2hpbGRJdGVtcyA9IGl0ZW0uaXRlbXMuZmlsdGVyKG1hdGNoZXNTZWFyY2gpO1xuXHRcdFx0XHRcdGlmIChmaWx0ZXJlZENoaWxkSXRlbXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHQvLyBOZWVkIHRvIGNsb25lIHRoZSBwYXJlbnQgaXRlbSB3aXRoIHRoZSBmaWx0ZXJlZCBjaGlsZHJlbiBzbyB3ZSBkb24ndCBtb2RpZnkgdGhlIG9yaWdpbmFsXG5cdFx0XHRcdFx0XHRmaWx0ZXJlZEl0ZW1zLnB1c2goey4uLml0ZW0sIGl0ZW1zOiBmaWx0ZXJlZENoaWxkSXRlbXN9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZpbHRlcmVkSXRlbXM7XG5cdFx0XHR9LCA8TWVudUl0ZW1bXT5bXSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLm9wdGlvbnM7XG5cdFx0fVxuXHR9XG5cblxuXHQvKipcblx0ICogRmluZCBhIGdpdmVuIGl0ZW0ncyBpbmRleCBpbiB0aGUgZmlsdGVyZWQgaXRlbXMgYXJyYXkuXG5cdCAqXG5cdCAqIFJldHVybnMgLTEgaWYgbm90IGZvdW5kXG5cdCAqIEBwYXJhbSBpdGVtIFRoZSBtYXRjaGluZyBpdGVtIHRvIGZpbmQgaW4gdGhlXG5cdCAqIGZpbHRlcmRPcHRpb25zIGFycmF5LiBXaWxsIHVzZSB0aGUgc2VsZWN0ZWRJdGVtIGlmIG5vdGhpbmcgaXMgcGFzc2VkLlxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcblx0ICovXG5cdHByaXZhdGUgZmluZFNlbGVjdGVkSXRlbUluZGV4KGl0ZW0/OiBNZW51SXRlbSk6IG51bWJlciB7XG5cdFx0bGV0IGl0ZW1Ub0ZpbmQgPSBpdGVtID8gaXRlbSA6IHRoaXMuc2VsZWN0ZWRJdGVtO1xuXG5cdFx0aWYgKGl0ZW1Ub0ZpbmQpIHtcblx0XHRcdHJldHVybiB0aGlzLnNlbGVjdGFibGVJdGVtcy5maW5kSW5kZXgoaXRlbSA9PiB7XG5cdFx0XHRcdGlmKGl0ZW0uaWQgJiYgKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5pZCkge1xuXHRcdFx0XHRcdHJldHVybiBpdGVtLmxhYmVsID09PSAoPE1lbnVJdGVtPml0ZW1Ub0ZpbmQpLmxhYmVsICYmIGl0ZW0uaWQgPT09ICg8TWVudUl0ZW0+aXRlbVRvRmluZCkuaWRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gaXRlbS5sYWJlbCA9PT0gKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5sYWJlbDtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIC0xO1xuXHR9XG5cblxuXHQvKipcblx0ICogUmVhY3QgdG8gb3VyIGZvcm1Nb2RlbCBjaGFuZ2luZ1xuXHQgKlxuXHQgKiBUaGUgZm9ybU1vZGVsIHJlcHJlc2VudHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBNb2RlbEl0ZW1cblx0ICogV2hlbiBjaGFuZ2VkLCBzZXQgdGhlIHZhbHVlIG9mIHRoZSBUZXh0Ym94Q29tcG9uZW50IGFuZFxuXHQgKiBmaW5kIGluZGV4IG9mIGl0ZW0gaW4gb3B0aW9ucyBsaXN0LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcblx0ICovXG5cdHByaXZhdGUgZm9ybU1vZGVsQ2hhbmdlZChkYXRhPzogTWVudUl0ZW0pOiB2b2lkIHtcblx0XHR0aGlzLnN5bmNocm9uaXplRGlzYWJsZWRBdHRyaWJ1dGVzKCk7XG5cblx0XHRpZiAoZGF0YSkge1xuXHRcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbHVlKGRhdGEuc2VsZWN0ZWRMYWJlbCB8fCBkYXRhLmxhYmVsKTtcblxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IHRoaXMuZmluZFNlbGVjdGVkSXRlbUluZGV4KGRhdGEpO1xuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPj0gMCkge1xuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbSA9IHRoaXMuc2VsZWN0YWJsZUl0ZW1zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXhdO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvL1RoZSBob3N0IHdpcGVkIG91dCB0aGUgZGF0YSBleHRlcm5hbGx5LCBjbGVhciB0aGUgdGV4dGJveCBhbmQgdGhlIHRyYWNraW5nIHN0YXRlXG5cdFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwucmVzZXQoKTtcblx0XHRcdHRoaXMuY2xlYXJTZWxlY3RlZEl0ZW0oKTtcblx0XHR9XG5cdH1cblxuXG5cdC8qKlxuXHQgKiBTY3JvbGwgdGhlIG1lbnUgaWYgdGhlIGN1cnJlbnQgc2VsZWN0ZWRJdGVtSW5kZXggaXMgb3V0IG9mIHZpZXdcblx0ICpcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XG5cdCAqL1xuXHRwcml2YXRlIHNjcm9sbE1lbnUoa25vd25JbmRleD86IG51bWJlcik6IHZvaWQge1xuXHRcdGlmICh0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyBVcGRhdGUgdGhlIHNlbGVjdGVkSXRlbUluZGV4IGluIGNhc2Ugb3VyIG9wdGlvbnMgY2hhbmdlZFxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IGtub3duSW5kZXggPT09IHVuZGVmaW5lZCA/IHRoaXMuZmluZFNlbGVjdGVkSXRlbUluZGV4KCkgOiBrbm93bkluZGV4O1xuXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA+IC0xICYmIHRoaXMuc2VsZWN0ZWRJdGVtKSB7XG5cdFx0XHRcdC8vIFRoZSBtZW51IGNvbXBvbmVudCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgaWRzIGZvciB0aGUgbWVudSBpdGVtcyBpZiB0aGV5IGRvbnQgaGF2ZSB0aGVtLFxuXHRcdFx0XHQvLyBzbyB0aGV5IG5lZWQgdG8gYmUgYWNjb3VudGVkIGZvciBoZXJlIHNpbmNlIHRoZSBjb21ib2JveCBkb2Vzbid0IGtub3cgYWJvdXQgdGhvc2UgaWRzXG5cdFx0XHRcdGxldCBpdGVtSWQgPSB0aGlzLnNlbGVjdGVkSXRlbS5pZCA/IHRoaXMuc2VsZWN0ZWRJdGVtLmlkIDogTWVudUNvbXBvbmVudC5nZXRJbmRleGVkSXRlbUlkKHRoaXMuZmlsdGVyZWRPcHRpb25zLCB0aGlzLnNlbGVjdGVkSXRlbSwgYCR7dGhpcy5pZH1fbWVudWApO1xuXG5cdFx0XHRcdC8vdHJpZ2dlciB0aGUgc2Nyb2xsaW5nIGFmdGVyIGEgdGljayB0byBhbGxvdyB0aGUgbWVudSB0byBiZSB1cCB0byBkYXRlIChhbmQgcGVuZGluZyBtYXNrIGNsZWFyZWQpIGJlZm9yZSBtZWFzdXJpbmdcblx0XHRcdFx0c2V0VGltZW91dCgoKT0+e1xuXHRcdFx0XHRcdHRoaXMuc2Nyb2xsU2VydmljZS5zY3JvbGxJdGVtQ2VudGVyZWQoYCMke3RoaXMuaWR9X21lbnVfbGlzdGAsIGAjJHtpdGVtSWR9YCk7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cblx0LyoqXG5cdCAqIFNlYXJjaC9GaWx0ZXIgYmFzZWQgb24gdGV4dGJveCBpbnB1dFxuXHQgKiBOT1RFOiBzbyBhcyBub3QgdG8gcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBvbiBldmVyeSBrZXkgZXZlbnQsIHdlIHN1Z2dlc3QgeW91IGRlYm91bmNlIHlvdXJcblx0ICogc3Vic2NyaXB0aW9uXG5cdCAqIEBzZWUge0BsaW5rIGh0dHA6Ly9yZWFjdGl2ZXguaW8vcnhqcy9jbGFzcy9lczYvT2JzZXJ2YWJsZS5qc35PYnNlcnZhYmxlLmh0bWwjaW5zdGFuY2UtbWV0aG9kLWRlYm91bmNlVGltZSB8IE9ic2VydmFibGUuZGVib3VuY2VUaW1lfVxuXHQgKlxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcblx0ICovXG5cdHByaXZhdGUgc2VhcmNoQW5kRmlsdGVyKHNlYXJjaFRleHQ/OiBzdHJpbmcpOiB2b2lkIHtcblxuXHRcdC8vIGFsd2F5cyBlbWl0XG5cdFx0dGhpcy5zZWFyY2guZW1pdChzZWFyY2hUZXh0KTtcblxuXHRcdC8vIGRvIGludGVybmFsIGZpbHRlcmluZyBpZiBubyBvbmUncyBzdWJzY3JpYmVkIHRvIG91ciBzZWFyY2ggZW1pdHRlclxuXHRcdGlmICh0aGlzLnNlYXJjaC5vYnNlcnZlcnMubGVuZ3RoID09PSAwICYmIHNlYXJjaFRleHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5yZXNldE9wdGlvbnModGhpcy5maWx0ZXJPcHRpb25zQXJyYXkoc2VhcmNoVGV4dCkpO1xuXG5cdFx0XHRpZiAodGhpcy5hZGROZXdTZWxlY3RlZCAmJiAhdGhpcy5hZGROZXdCdXR0b24pIHtcblx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cblx0LyoqXG5cdCAqIFNldCB7QGxpbmsgZm9ybU1vZGVsIH0ncyB2YWxpZGF0aW9uIGVycm9ycyBlcXVhbCB0byB0aGUgaW50ZXJuYWwgdGV4dGJveCdzLlxuXHQgKlxuXHQgKiBXaGVuIHRoZSBpbnRlcm5hbCB0ZXh0Ym94IGlzIGludmFsaWQsIG5lZWQgdG8gc2V0IHRoaXMgY29udHJvbCdzXG5cdCAqIGVycm9ycyBiZWNhdXNlIHdlIGFyZSB1c2luZyBvdXIgb3duIGxhYmVsLCBub3QgVGV4dGJveENvbnRyb2wncy5cblx0ICogV2UgdXNlIG91ciBvd24gbGFiZWwgc28gbGFiZWwgdGV4dCB3aWxsIHdyYXAgYXQgdGhlIGVuZCBvZiB0aGUgYnV0dG9uLFxuXHQgKiBub3QgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dGJveC5cblx0ICpcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XG5cdCAqL1xuXHRwcml2YXRlIHNldEZvcm1Nb2RlbFZhbGlkYXRpb25FcnJvcnMoZGF0YT86IGFueSk6IHZvaWQge1xuXHRcdGlmICh0aGlzLnRleHRib3hGb3JtTW9kZWwuaW52YWxpZCkge1xuXHRcdFx0dGhpcy5mb3JtTW9kZWwuc2V0RXJyb3JzKHRoaXMudGV4dGJveEZvcm1Nb2RlbC5lcnJvcnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmZvcm1Nb2RlbC5zZXRFcnJvcnMobnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZSB0aGUgZm9ybSBtb2RlbCB2YWx1ZSB3aXRoIHRoZSBzZWxlY3RlZCBpdGVtIG9yIHJlc2V0IGZvcm0gbW9kZWwgdmFsdWUgaWYgaXRlbSBpcyBudWxsXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxuXHQgKi9cblx0cHJpdmF0ZSBzZXRGb3JtTW9kZWxWYWx1ZShpdGVtOiBNZW51SXRlbSB8IG51bGwpOiB2b2lkIHtcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUoaXRlbSA/IChpdGVtLnNlbGVjdGVkTGFiZWwgfHwgaXRlbS5sYWJlbCkgOiAnJyk7XG5cdFx0dGhpcy5mb3JtTW9kZWwuc2V0VmFsdWUoaXRlbSk7XG5cdFx0dGhpcy5mb3JtTW9kZWwubWFya0FzRGlydHkoKTtcblx0fVxuXG5cblx0LyoqXG5cdCAqIFNldCB2YWxpZGF0b3JzIG9uIHRoZSB7QHNlZSB0ZXh0Ym94Rm9ybU1vZGVsIH1cblx0ICpcblx0ICogVmFsaWRhdG9ycyBhcmUgY3VycmVudGx5IHNldCBiYXNlZCBvbiB0aGUge0BzZWUgbWF4bGVuZ3RoIH0sXG5cdCAqIHtAc2VlIG1pbmxlbmd0aCB9LCBhbmQge0BzZWUgcmVxdWlyZWQgfSBpbnB1dHMuICBUaGlzIHdvcmtzIHdlbGxcblx0ICogd2l0aCB7QHNlZSBUZXh0Ym94Q29tcG9uZW50IH0sIHdoaWNoIG5lZWRzIHRoZXNlIGlucHV0cyB0byBhcHBseVxuXHQgKiB0aGUgcHJvcGVyIGF0dHJpYnV0ZXMgdG8gaXRzIGlucHV0cy5cblx0ICpcblx0ICogQSBmdXR1cmUgcmVsZWFzZSBvZiBBbmd1bGFyIHdpbGwgc3VwcG9zZWRseSBhZGQgdGhlc2UgYXR0cmlidXRlc1xuXHQgKiBmb3IgeW91LCB3aGljaCB3aWxsIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgVGV4dGJveENvbXBvbmVudCB0byBoYXZlXG5cdCAqIHN1Y2ggaW5wdXRzLiAgVGhpcyBjb21wb25lbnQsIGhvd2V2ZXIsIHdpbGwgc3RpbGwgbmVlZCB0aGVzZSBpbnB1dHNcblx0ICogYXMgdGhlcmUgaXMgbm8gY3VycmVudCB3YXkgdG8ga25vdyB3aGljaCB2YWxpZGF0b3JzIGFyZSBhcHBsaWVkIHRvIGl0XG5cdCAqIGZyb20gaXRzIHBhcmVudCBWaWV3IENvbXBvbmVudC5cblx0ICpcblx0ICpcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XG5cdCAqL1xuXHRwcml2YXRlIHNldFRleHRib3hGb3JtTW9kZWxWYWxpZGF0b3JzKCk6IHZvaWQge1xuXHRcdGxldCB2YWxpZGF0b3JzOiBBcnJheTxWYWxpZGF0b3JGbj4gPSBbXTtcblxuXHRcdGlmICh0aGlzLnJlcXVpcmVkKSB7XG5cdFx0XHR2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubWlubGVuZ3RoKSB7XG5cdFx0XHR2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodGhpcy5taW5sZW5ndGgpKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5tYXhsZW5ndGgpIHtcblx0XHRcdHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heExlbmd0aCh0aGlzLm1heGxlbmd0aCkpO1xuXHRcdH1cblxuXHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xuXG5cdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcblx0fVxuXG5cblx0LyoqXG5cdCAqIEtlZXAgdGV4dGJveCdzIGRpc2FibGVkIHN0YXR1cyBpbi1zeW5jIHdpdGggY29tYm9ib3gnc1xuXHQgKlxuXHQgKiB7QGxpbmsgVGV4dGJveENvbXBvbmVudH0gZ2V0cyBpdHMgZGlzYWJsZWQgc3RhdHVzIGZyb20gaXRzIHtAbGluayBGb3JtQ29udHJvbH1cblx0ICpcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XG5cdCAqL1xuXHRwcml2YXRlIHN5bmNocm9uaXplRGlzYWJsZWRBdHRyaWJ1dGVzKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmZvcm1Nb2RlbC5kaXNhYmxlZCAhPT0gdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmRpc2FibGVkKSB7XG5cdFx0XHRpZiAodGhpcy5mb3JtTW9kZWwuZGlzYWJsZWQpIHtcblx0XHRcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmRpc2FibGUoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5lbmFibGUoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXG5cdC8qKlxuXHQgKiBJZiB0aGUgZm9ybU1vZGVsIHZhbHVlIGFuZCB0ZXh0Ym94IHZhbHVlIGRvIG5vdCBtYXRjaCwgcmVzZXQgdGhlIHRleHRib3ggYW5kIHNlbGVjdGVkSXRlbSB0b1xuXHQgKiB0aGUgZm9ybU1vZGxlIHZhbHVlLiBJZiB0aGVyZSBpcyBubyBmb3JtTW9kZWwgdmFsdWUsIG1ha2Ugc3VyZSB3ZSBjbGVhciB0aGUgdGV4dGJveC4gUmVzZXQgdGhlXG5cdCAqIGZpbHRlcmVkT3B0aW9ucyB0byB0aGUgZnVsbCBsaXN0IGFuZCB1cGRhdGUgdGhlIHNlbGVjdGVkSXRlbUluZGV4XG5cdCAqXG5cdCAqL1xuXHRwcml2YXRlIHN5bmNNb2RlbFZhbHVlcygpOiB2b2lkIHtcblx0XHQvLyBJZiB0aGVyZSBpcyBhIGZvcm1Nb2RlbCB2YWx1ZSwgcmVzZXQgdGhlIHNlbGVjdGVkIGl0ZW0uIElmIHRoZXJlIGlzbid0LCBtYWtlXG5cdFx0Ly8gc3VyZSB3ZSBjbGVhciB0aGUgdGV4dGJveFxuXHRcdGNvbnN0IG5ld0xhYmVsID0gdGhpcy5mb3JtTW9kZWwudmFsdWU/LnNlbGVjdGVkTGFiZWwgfHwgdGhpcy5mb3JtTW9kZWwudmFsdWU/LmxhYmVsO1xuXHRcdGlmICh0aGlzLmZvcm1Nb2RlbC52YWx1ZSAmJiAobmV3TGFiZWwgIT09IHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSkpIHtcblx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWx1ZShuZXdMYWJlbCk7XG5cdFx0fSBlbHNlIGlmICghdGhpcy5mb3JtTW9kZWwudmFsdWUpIHtcblx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWx1ZSgnJyk7XG5cdFx0fVxuXHR9XG5cblxuXHQvKipcblx0ICogU2VhcmNoIGFuZCBmaWx0ZXIgdGhlIG9wdGlvbnMgbGlzdCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dGJveCBpbnB1dCBjaGFuZ2VzLiBJZiBhZGROZXcgaXNcblx0ICogc2V0IGFsc28gY2hlY2sgZm9yIG1hdGNoZXMgaW4gb3VyIGZpbHRlcmVkT3B0aW9ucyB0byBjb25kaXRpb25hbGx5IHNob3cgYW5kIGhpZGUgdGhlIGFkZCBuZXdcblx0ICogYnV0dG9uXG5cdCAqXG5cdCAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL2lucHV0XG5cdCAqL1xuXHRwdWJsaWMgdGV4dGJveFZhbHVlQ2hhbmdlZChldmVudDogRXZlbnQpOiB2b2lkIHtcblx0XHR0aGlzLnNlYXJjaEFuZEZpbHRlcih0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUpO1xuXG5cdFx0aWYgKHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSA9PT0gJycpIHtcblx0XHRcdHRoaXMuY2xlYXJTZWxlY3RlZEl0ZW0oKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5hZGROZXcpIHtcblx0XHRcdGxldCBtYXRjaCA9IHRoaXMuZmlsdGVyZWRPcHRpb25zLmZpbmQoKG9wdGlvbikgPT4ge1xuXHRcdFx0XHRyZXR1cm4gb3B0aW9uLmxhYmVsLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmZvdW5kTWF0Y2ggPSBtYXRjaCA/IHRydWUgOiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBVcGRhdGUgdGhlIHBvcHVwIG1lbnUgcG9zaXRpb24gd2hlbiBpbnB1dCB2YWx1ZSBjaGFuZ2VzXG5cdFx0aWYgKHRoaXMucG9wdXApIHtcblx0XHRcdHRoaXMucG9wdXAudXBkYXRlKCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBjbGVhclNlbGVjdGVkSXRlbSgpOiB2b2lkIHtcblx0XHR0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7XG5cdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IC0xO1xuXHR9XG5cblx0LyoqUmVjb21wdXRlIHdoYXQgdGhlIHBsYWNlaG9sZGVyIHNob3VsZCBiZSBiYXNlZCBvbiB3aGV0aGVyIHRoZSB1c2VyIHByb3ZpZGVkIG9uZSBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFkZE5ldyBpbnB1dCAqL1xuXHRwcml2YXRlIHVwZGF0ZVBsYWNlaG9sZGVyVGV4dCgpe1xuXHRcdGlmICh0aGlzLnBsYWNlaG9sZGVyKSB7XG5cdFx0XHR0aGlzLmVmZmVjdGl2ZVBsYWNlaG9sZGVyID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0aGlzLnBsYWNlaG9sZGVyKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuYWRkTmV3KSB7XG5cdFx0XHR0aGlzLmVmZmVjdGl2ZVBsYWNlaG9sZGVyID0gdGhpcy5jaG9vc2VPckFkZFBsYWNlaG9sZGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmVmZmVjdGl2ZVBsYWNlaG9sZGVyID0gdGhpcy5jaG9vc2VQbGFjZWhvbGRlcjtcblx0XHR9XG5cdH1cblxuXHQvKipGaW5kIHRoZSBvcHRpb24gd2Ugd2FudCB0byBiZSB0aGUgZGVmYXVsdCBzZWxlY3Rpb24uIElmIHRoZXJlIGlzIGFuIGV4YWN0IG1hdGNoLCB1c2UgdGhhdFxuXHQgKiBvdGhlcndpc2UgaWYgdGhlcmUgYXJlIGl0ZW1zLCByZXR1cm4gemVybyB0byBpbmRpY2F0ZSB0aGUgZmlyc3QgaXRlbS4gT3RoZXJ3aXNlIHJldHVybiAtMVxuXHQgKiB0byBpbmRpY2F0ZSBubyBzZWxlY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZmluZERlZmF1bHRTZWxlY3Rpb25JbmRleChvcHRpb25zOiBNZW51SXRlbVtdLCBzZWFyY2hUZXh0OiBzdHJpbmcpOiBudW1iZXIge1xuXHRcdGxldCBpbmRleCA9IC0xO1xuXG5cdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLmxlbmd0aCl7XG5cdFx0XHRpbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KG9wdGlvbj0+b3B0aW9uICE9IG51bGwpO1xuXG5cdFx0XHRpZihzZWFyY2hUZXh0KXtcblx0XHRcdFx0c2VhcmNoVGV4dCA9IHNlYXJjaFRleHQudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cdFx0XHRcdGxldCBleGFjdE1hdGNoSW5kZXggPSBvcHRpb25zLmZpbmRJbmRleChvcHRpb249Pm9wdGlvbi5sYWJlbC50b0xvd2VyQ2FzZSgpID09IHNlYXJjaFRleHQpO1xuXHRcdFx0XHRpZihleGFjdE1hdGNoSW5kZXggPj0wKXtcblx0XHRcdFx0XHRpbmRleCA9IGV4YWN0TWF0Y2hJbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaW5kZXg7XG5cdH1cblxufVxuIiwiPGRpdiBjbGFzcz1cImNvbnRyb2wgY29udHJvbC1sYWJlbC17e2xhYmVsUG9zaXRpb259fVwiXG4gICAgIFtuZ0NsYXNzXT1cInsnb3Blbic6IG1lbnVTdGF0dXMgPT09ICd2aXNpYmxlJyxcbiAgICAgICAgICAgICAgICAgJ2ludmFsaWQnOiBmb3JtTW9kZWwudG91Y2hlZCAmJiBmb3JtTW9kZWwuaW52YWxpZCxcbiAgICAgICAgICAgICAgICAgJ2hhcy1pY29uJzogKCh0ZW1wbGF0ZVR5cGUgPT09ICdpY29uQW5kTGFiZWwnIHx8IHRlbXBsYXRlVHlwZSA9PT0gJ2ljb25MYWJlbENhcHRpb24nKSAmJiBmb3JtTW9kZWwudmFsdWUgJiYgZm9ybU1vZGVsLnZhbHVlLmljb24gJiYgZm9ybU1vZGVsLnZhbHVlLmxhYmVsID09PSB0ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKSxcbiAgICAgICAgICAgICAgICAgJ2lzLXJlYWRvbmx5JzogcmVhZG9ubHksXG4gICAgICAgICAgICAgICAgICdpcy1kaXNhYmxlZCc6IGZvcm1Nb2RlbC5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgJ2lzLWFsd2F5cy1vcGVuJzogYWx3YXlzT3Blbn1cIj5cblxuICA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiPlxuICAgIDxzcGFuPnt7bGFiZWwgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cInZhbGlkYXRpb25FcnJvcnMubGVuZ3RoID4gMCAmJiBmb3JtTW9kZWwudG91Y2hlZCAmJiBmb3JtTW9kZWwuaW52YWxpZFwiPiZuYnNwO3t7dmFsaWRhdGlvbkVycm9yc319PC9zcGFuPlxuICAgIDxlYy1oZWxwLXBvcG92ZXIgaWQ9XCJ7e2lkfX1faGVscFBvcG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJoZWxwUG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtaW5saW5lLWJsb2NrIG15LW4zIG14LW4xXCJcbiAgICAgICAgICAgICAgICAgICAgIHRleHQ9XCJ7e2hlbHBQb3BvdmVyIHwgdHJhbnNsYXRlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgY29udGVudFBvc2l0aW9uPVwie3toZWxwUG9wb3ZlclBvc2l0aW9ufX1cIj5cbiAgICA8L2VjLWhlbHAtcG9wb3Zlcj5cbiAgPC9sYWJlbD5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWx3YXlzT3BlbjsgZWxzZSBwb3B1cFRhcmdldFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0Ym94LWdyb3VwIGNvbnRyb2wtaW5wdXRcIlxuICAgICAgICAgW25nQ2xhc3NdPVwidGV4dGJveEVsZW1lbnRDbGFzc2VzXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGV4dGJveFwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPiAwIHx8IHRleHRib3hGb3JtTW9kZWwudmFsdWVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkcm9wZG93bm1lbnVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNwb3B1cFRhcmdldD5cbiAgPGRpdiBjbGFzcz1cInRleHRib3gtZ3JvdXAgY29udHJvbC1pbnB1dFwiXG4gICAgICAgW25nQ2xhc3NdPVwidGV4dGJveEVsZW1lbnRDbGFzc2VzXCJcbiAgICAgICAqZWNQb3B1cD1cImRyb3Bkb3dubWVudVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZXh0Ym94XCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZXh0Ym94PlxuICA8aSBjbGFzcz1cImVjLWljb24ge3tmb3JtTW9kZWwudmFsdWU/Lmljb259fVwiPjwvaT5cblxuICA8ZWMtdGV4dGJveCBjbGFzcz1cInRleHRib3gtZ3JvdXAtaW5wdXQgbWItMFwiXG4gICAgICAgICAgICAgICN0ZXh0Ym94XG4gICAgICAgICAgICAgIFtpZF09XCJpZFwiXG4gICAgICAgICAgICAgIFthdXRvZm9jdXNdPVwiYXV0b2ZvY3VzXCJcbiAgICAgICAgICAgICAgW2Zvcm1Nb2RlbF09XCJ0ZXh0Ym94Rm9ybU1vZGVsXCJcbiAgICAgICAgICAgICAgW21heGxlbmd0aF09XCJtYXhsZW5ndGhcIlxuICAgICAgICAgICAgICBbbWlubGVuZ3RoXT1cIm1pbmxlbmd0aFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJlZmZlY3RpdmVQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJ0ZXh0Ym94VmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJrZXlOYXZpZ2F0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cIm9uQmx1cigpXCJcbiAgICAgICAgICAgICAgW3VwcGVyQ2FzZV09XCJ1cHBlckNhc2VcIlxuICAgICAgICAgICAgICBbcGVuZGluZ109XCJwZW5kaW5nICYmIGFsd2F5c09wZW5cIlxuICAgICAgICAgICAgICBbYXV0b2NvbXBsZXRlXT1cIidvZmYnXCI+PC9lYy10ZXh0Ym94PlxuXG4gIDxlYy1idXR0b24gY2xhc3M9XCJ0ZXh0Ym94LWdyb3VwLWJ0bi1yaWdodFwiXG4gICAgICAgICAgICAgKm5nSWY9XCIhaGlkZVRvZ2dsZUJ1dHRvblwiXG4gICAgICAgICAgICAgW2lkXT1cImlkICsgJ19idXR0b24nXCJcbiAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybU1vZGVsLmRpc2FibGVkXCJcbiAgICAgICAgICAgICBpY29uPVwiaWNvbi1jYXJldC1kb3duXCJcbiAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgIHR5cGU9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVNZW51KCRldmVudClcIlxuICAgICAgICAgICAgIChrZXlkb3duKT1cImtleU5hdmlnYXRlKCRldmVudClcIlxuICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwibWVudVN0YXR1cyA9PT0gJ3Zpc2libGUnXCI+PC9lYy1idXR0b24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2Ryb3Bkb3dubWVudT5cbiAgPGRpdiBjbGFzcz1cInBvcHVwXCJcbiAgICAgICBlY092ZXJsYXlcbiAgICAgICBbc3RhdHVzXT1cInBlbmRpbmcgJiYgIWFsd2F5c09wZW4gPyAncGVuZGluZycgOiAnaGFzRGF0YSdcIj5cblxuICAgIDxidXR0b24gY2xhc3M9XCJhZGQtbmV3IHt7YWRkTmV3T3B0aW9ucz8uY2xhc3NMaXN0fX1cIlxuICAgICAgICAgICAgaWQ9XCJ7e2lkfX1fYWRkTmV3XCJcbiAgICAgICAgICAgICNhZGROZXdCdXR0b25cbiAgICAgICAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJhZGROZXdTZWxlY3RlZFwiXG4gICAgICAgICAgICAqbmdJZj1cImFkZE5ld1wiXG4gICAgICAgICAgICBbaGlkZGVuXT1cImZvdW5kTWF0Y2ggfHwgKGFkZE5ldyA9PT0gJ2R5bmFtaWMnICYmICghdGV4dGJveEZvcm1Nb2RlbC52YWx1ZSB8fCAoZm9ybU1vZGVsLnZhbHVlICYmIHRleHRib3hGb3JtTW9kZWwudmFsdWUgPT09IGZvcm1Nb2RlbC52YWx1ZS5sYWJlbCkpKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25BZGROZXcoJGV2ZW50KVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJhZGQtbmV3LWxhYmVsIGVjLXV0aWwtdHJ1bmNhdGVcIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJhZGROZXcgPT09ICdzdGF0aWMnIHx8IGFkZE5ldyA9PT0gdHJ1ZVwiXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZT57e2FkZE5ld09wdGlvbnM/LmxhYmVsfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImFkZE5ldyA9PT0gJ2R5bmFtaWMnXCI+e3snQWRkJyB8IHRyYW5zbGF0ZX19IDxzdHJvbmcgY2xhc3M9XCJlYy11dGlsLXRydW5jYXRlXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsndGV4dC11cHBlcmNhc2UnOiB1cHBlckNhc2V9XCI+e3t0ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlfX08L3N0cm9uZz5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgICAgPGkgY2xhc3M9XCJlYy1pY29uIHt7YWRkTmV3T3B0aW9ucz8uaWNvbn19XCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGVjLW1lbnUgaWQ9XCJ7e2lkfX1fbWVudVwiXG4gICAgICAgICAgICAgW2NsYXNzLmJvcmRlci10b3AtMF09XCIhZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAmJiBoaWRlTm9NYXRjaGVzXCJcbiAgICAgICAgICAgICBbbmdDbGFzc109XCJtZW51RWxlbWVudENsYXNzZXNcIlxuICAgICAgICAgICAgIFt0ZW1wbGF0ZVR5cGVdPVwidGVtcGxhdGVUeXBlXCJcbiAgICAgICAgICAgICBbY3VzdG9tTWVudVRlbXBsYXRlXT1cImN1c3RvbU1lbnVUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgW3Nob3dOb0l0ZW1zXT1cIiFoaWRlTm9NYXRjaGVzXCJcbiAgICAgICAgICAgICBbbm9EYXRhVGV4dF09XCJub01hdGNoZXNUZXh0XCJcbiAgICAgICAgICAgICBbaXRlbXNdPVwiZmlsdGVyZWRPcHRpb25zXCJcbiAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwic2VsZWN0ZWRJdGVtXCJcbiAgICAgICAgICAgICAoc2VsZWN0ZWRDaGFuZ2VkKT1cInNlbGVjdGVkQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICBbcHJlc2VydmVJY29uU3BhY2VdPVwicHJlc2VydmVJY29uU3BhY2VcIlxuICAgICAgICAgICAgIFt0cnVuY2F0ZUl0ZW1zXT1cInRydW5jYXRlSXRlbXNcIj48L2VjLW1lbnU+XG5cbiAgICA8Zm9vdGVyICpuZ0lmPVwidG90YWxSZWNvcmRzICYmIHRvdGFsUmVjb3JkcyA+IGZpbHRlcmVkT3B0aW9ucy5sZW5ndGggJiYgZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA+IDBcIj5cbiAgICAgIDxzcGFuPnt7ZmlsdGVyZWRPcHRpb25Db3VudH19IHt7J29mJyB8IHRyYW5zbGF0ZX19IHt7dG90YWxSZWNvcmRzfX08L3NwYW4+XG4gICAgPC9mb290ZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT4iXX0=
|
|
879
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFtRCxTQUFTLEVBQWMsWUFBWSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBQzFLLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlqRCxPQUFPLEVBQXNELGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNHLE9BQU8sRUFBRSx1QkFBdUIsRUFBZSxNQUFNLHlEQUF5RCxDQUFDOzs7Ozs7Ozs7Ozs7O0FBeUIvRzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQU1ILE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxlQUFlO0lBRXJEOzs7OztPQUtHO0lBQzRCLFFBQVE7UUFDdEMsSUFBSSxJQUFJLENBQUMsS0FBSztZQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQXdPRCxZQUNXLHdCQUFrRCxFQUNsRCxlQUFnQyxFQUNoQyxTQUEyQixFQUMzQixhQUE0QjtRQUV0QyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFMdkMsNkJBQXdCLEdBQXhCLHdCQUF3QixD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S3dCLEtBQUs7c0JBQWhELFNBQVM7dUJBQUMsdUJBQXVCO2dCQU1DLFlBQVk7c0JBQTlDLFNBQVM7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9ycywgVmFsaWRhdG9yRm4gfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sQmFzZSB9IGZyb20gJy4uL2Zvcm0tY29udHJvbC1iYXNlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFRleHRib3hDb21wb25lbnQgfSBmcm9tICcuLi90ZXh0Ym94L3RleHRib3guY29tcG9uZW50JztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS92YWxpZGF0aW9uLW1lc3NhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cEhlbHBlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9mb3JtLWdyb3VwLmhlbHBlcic7XHJcbmltcG9ydCB7IE1lbnVJdGVtLCBNZW51VGVtcGxhdGVUeXBlLCBNZW51SG9zdEVsZW1lbnRDbGFzc2VzLCBNZW51Q29tcG9uZW50IH0gZnJvbSAnLi4vbWVudS9tZW51LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFBvcHVwQ29udGFpbmVyRGlyZWN0aXZlLCBQb3B1cFN0YXR1cyB9IGZyb20gJy4uLy4uL3NoYXJlZC9kaXJlY3RpdmVzL3BvcHVwL3BvcHVwLWNvbnRhaW5lci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTY3JvbGxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zY3JvbGwuc2VydmljZSc7XHJcblxyXG4vKipcclxuICogUG9zaXRpb24gb2YgdGhlIG1lbnUgcmVsYXRpdmUgdG8gdGhlIGlucHV0XHJcbiAqL1xyXG5leHBvcnQgdHlwZSBDb21ib2JveE1lbnVQb3NpdGlvbiA9IFwidG9wX3JpZ2h0XCIgfCBcInRvcF9sZWZ0XCIgfCBcImJvdHRvbV9sZWZ0XCIgfCBcImJvdHRvbV9yaWdodFwiO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBUaGUgdHlwZSBvZiBhZGQgbmV3IGltcGxlbWVudGF0aW9uLiBTdGF0aWMgZGlzcGxheXMgYSBzaW1wbGUgc3RhdGljIGJ1dHRvbiB3aGlsZSBkeW5hbWljIHVwZGF0ZXNcclxuICogdGhlIGxhYmVsIG9mIHRoZSBidXR0b24gd2l0aCB2YWx1ZSBvZiB0aGUgdGV4dGJveFxyXG4gKi9cclxudHlwZSBBZGROZXdUeXBlID0gXCJkeW5hbWljXCIgfCBcInN0YXRpY1wiIHwgYm9vbGVhbjtcclxuXHJcbi8qKlxyXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgXCJBZGQgbmV3XCIgYnV0dG9uIHdoZW4gaW4gc3RhdGljIG1vZGVcclxuICovXHJcbnR5cGUgQWRkTmV3T3B0aW9ucyA9IHtcclxuXHRsYWJlbD86IHN0cmluZzsgXHQvKiogQSBjdXN0b20gbGFiZWwgdG8gZGlzcGxheSBpbiBwbGFjZSBvZiB0aGUgZGVmYXVsdCBcIkFkZCBuZXcuLi5cIiAqL1xyXG5cdGNsYXNzTGlzdD86IHN0cmluZzsgXHQvKiogQSBzdHJpbmcgb2Ygc3BhY2Utc2VwYXJhdGVkIHV0aWxpdHkgY2xhc3NlcyB3ZSdsbCBhcHBseSB0byB0aGUgbGFiZWwgKi9cclxuXHRpY29uPzogc3RyaW5nOyBcdC8qKiBBIGN1c3RvbSBpY29uIHRvIGRpc3BsYXkgaW4gcGxhY2Ugb2YgdGhlIGRlZmF1bHQgJ2ljb24tYWRkJyAqL1xyXG59O1xyXG5cclxuXHJcbi8qKlxyXG4gKiBTZWxlY3QgYm94IChzZWxlY3QsIGF1dG9jb21wbGV0ZSwgY29tYm9ib3gpXHJcbiAqXHJcbiAqIE5PVEU6IE1pbi9tYXggbGVuZ3RoIHZhbGlkYXRpb24gaXMgaW1wbGVtZW50ZWQgb24gdGhlIGludGVybmFsIGVjLXRleHRib3guXHJcbiAqIFZhbHVlcyBwYXNzZWQgaW4gdmlhIGlucHV0IHByb3BlcnRpZXMgKEBzZWUgbWF4bGVuZ3RoICwgQHNlZSBtaW5sZW5ndGggKVxyXG4gKiBhcmUgdXNlZCB0byBjcmVhdGUgdmFsaWRhdG9ycyBvbiB0aGUgdGV4dGJveC4gIFdoZW4gdGhlIHZhbGlkYXRpb24gb24gdGhlXHJcbiAqIHRleHRib3ggZmFpbHMsIHRoZSB2YWxpZGF0aW9uIGVycm9yKHMpIGdldCBwYXNzZWQgdXAgdG8gdGhlIHtAc2VlIGZvcm1Nb2RlbCB9LlxyXG4gKiBXaGVuIHNldHRpbmcgdXAgdGhpcyBjb21wb25lbnQncyB7QHNlZSBGb3JtQ29udHJvbCB9LCB5b3UgZG8gTk9UIG5lZWQgdG8gc2V0IHRoZVxyXG4gKiBWYWxpZGF0b3JzLm1pbkxlbmd0aCBvciBWYWxpZGF0b3JzLm1heExlbmd0aCB2YWxpZGF0b3JzLlxyXG4gKlxyXG4gKiBSZXF1aXJlZCBpcyBhbHNvIHBhc3NlZCB2aWEgaW5wdXQgcHJvcGVydHksIGJ1dCB5b3UgU0hPVUxEIGFsc28gc2V0IHVwIHRoZVxyXG4gKiBWYWxpZGF0b3JzLnJlcXVpcmVkIHZhbGlkYXRvciBvbiB0aGlzIGNvbXBvbmVudCdzIEZvcm1Db250cm9sLlxyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ2VjLWNvbWJvYm94JyxcclxuXHR0ZW1wbGF0ZVVybDogJ2NvbWJvYm94LmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnLi9jb21ib2JveC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb21ib2JveENvbXBvbmVudCBleHRlbmRzIEZvcm1Db250cm9sQmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ2xvc2UgdGhlIHBvcHVwIG1lbnUgb24gcmVzaXplIHNvIHRoZSB3aWR0aCBhbmQgcG9zaXRpb25pbmcgY2FuIGJlIHJlY2FsY3VsYXRlZFxyXG5cdCAqIGNvcnJlY3RseS4gQ2Fubm90IGJlIHBsYWNlZCBvbiB0aGUgcG9wdXBEaXJlY3RpdmUgYmVjYXVzZSBvZiBhIGJ1ZyB3aGVyZVxyXG5cdCAqIEhvc3RMaXN0ZW5lcnMgZm9yIGdsb2JhbCBldmVudHMgZG9uJ3QgZmlyZVxyXG5cdCAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTQxOTFcclxuXHQgKi9cclxuXHRASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJykgb25SZXNpemUoKSB7XHJcblx0XHRpZiAodGhpcy5wb3B1cCkgdGhpcy5wb3B1cC5oaWRlKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTaG93IHRoZSBhZGQgbmV3IGJ1dHRvbiBpbiB0aGUgcG9wdXBcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgYWRkTmV3PzogQWRkTmV3VHlwZTtcclxuXHJcblx0LyoqIENvbmZpZ3VyZSB0aGUgYWRkTmV3IGJ1dHRvbiBsYWJlbCAmIGljb24gd2hlbiBhZGROZXcgaXMgdHJ1ZSBhbmQgc2V0IHRvIHN0YXRpY1xyXG5cdCAqIERlZmF1bHQgaXMgc2V0IHRvOiB7IGxhYmVsOiAnQWxsIG5ldy4uLicsIGljb246ICdpY29uLWFkZCd9XHJcblx0ICogQHNlZSBBZGROZXdPcHRpb25zXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICogQGV4YW1wbGVcclxuXHQgKiA8ZWMtY29tYm9ib3ggW2FkZE5ld109XCJ0cnVlXCIgXHJcblx0ICogXHQgICAgICAgICBbYWRkTmV3T3B0aW9uc109XCJ7IFxyXG4qIFx0XHRcdFx0XHRcdGxhYmVsOiAnSGVscCBtZSBjaG9vc2UuLi4nLFxyXG4qIFx0XHRcdFx0XHRcdGljb246ICdpY29uLXNlYXJjaCcsXHJcbiogXHRcdFx0XHRcdFx0Y2xhc3NMaXN0OiAndGV4dC1ib2R5LTIgdGV4dC1saW5rJyB9XCI+XHJcblx0ICogPC9lYy1jb21ib2JveD5cclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgYWRkTmV3T3B0aW9ucz86IEFkZE5ld09wdGlvbnMgPSB7IFxyXG5cdFx0bGFiZWw6ICdBZGQgbmV3Li4uJyxcclxuXHRcdGljb246ICdpY29uLWFkZCcsXHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWxsb3dlZCBpbiB0aGUgaW5wdXQuXHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgVGV4dGJveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBtYXhsZW5ndGg/OiBudW1iZXI7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBQb3NpdGlvbiBvZiB0aGUgbWVudSByZWxhdGl2ZSB0byB0aGUgdGV4dCBib3hcclxuXHQgKiBAZGVmYXVsdCAnYm90dG9tX3JpZ2h0J1xyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBtZW51UG9zaXRpb24/OiBDb21ib2JveE1lbnVQb3NpdGlvbiA9ICdib3R0b21fcmlnaHQnO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWxsb3dlZCBpbiB0aGUgaW5wdXRcclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBUZXh0Ym94Q29tcG9uZW50XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIG1pbmxlbmd0aD86IG51bWJlcjtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0ZW1zIHRvIHNob3cgaW4gY29tYm9ib3ggbWVudVxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIG9wdGlvbnM6IEFycmF5PE1lbnVJdGVtPiA9IFtdO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogRGlzcGxheSB0ZW1wbGF0ZSBmb3IgbWVudSBpdGVtc1xyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIHRlbXBsYXRlVHlwZTogTWVudVRlbXBsYXRlVHlwZSA9ICdsYWJlbCc7XHJcblxyXG5cdC8qKlxyXG4gICAgICogT3B0aW9uYWwgY3VzdG9tIHRlbXBsYXRlIGZvciB0aGUgbWVudSBpdGVtcy4gTXVzdCBkZWNsYXJlIGEgdGVtcGxhdGVcclxuXHQgKiBpbnB1dCB2YXJpYWJsZSBjYWxsZWQgXCJpdGVtXCIgbGlrZSBzbzogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZU5hbWUgbGV0LWl0ZW0+LFxyXG5cdCAqIHdoZXJlIGl0ZW0gcmVwcmVzZW50cyB0aGUgbWVudUl0ZW0uXHJcbiAgICAgKiBXaWxsIG92ZXJyaWRlIHRoZSBjaG9pY2UgZm9yIHRlbXBsYXRlVHlwZSBpZiBwcm92aWRlZC5cclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgY3VzdG9tTWVudVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcblx0LyoqXHJcblx0ICogV2hlbiB0cnVlLCB0aGUgbWVudSBpdGVtcyB3aWxsIHByZXNlcnZlIHRoZSBpY29uIHNwYWNlIHdoZW4gdGhlcmUgaXMgbm8gaWNvblxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBwcmVzZXJ2ZUljb25TcGFjZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBQb3NpdGlvbiB0aGUgbWVudSBhcyBmaXhlZCwgaWRlYWwgd2hlbiBjb21ib2JveGVzIGFyZSBpbnNpZGUgZGlhbG9nc1xyXG5cdCAqIERlZmF1bHRpbmcgdG8gdHJ1ZSBzbyBhbGwgbWVudXMgd2lsbCBiZSBhdCBsZWFzdCB0aGUgd2lkdGggb2YgdGhlXHJcblx0ICogdGV4dGJveCArIGJ1dHRvbiwgYnV0IGNhbiBncm93IHdpZGVyIGlmIHRoZSBpbm5lciBlbGVtZW50cyBuZWVkIGl0XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIHBvcHVwRml4ZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHRvdGFsIG51bWJlciBvZiByZWNvcmRzIGZyb20gdGhlIGRhdGFzb3VyY2VcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgdG90YWxSZWNvcmRzPzogbnVtYmVyO1xyXG5cclxuXHQvKipcclxuXHQgKiBJZiBzZXQgdG8gdHJ1ZSwgd2Ugd2lsbCB1cHBlckNhc2UgdGhlIHRleHQgYm94IGFuZCBhcHBseSB0aGUgY2xhc3Mgb24gdGhlIGFkZCBib3hcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgdXBwZXJDYXNlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuXHQvKipUaGUgcGxhY2Vob2xkZXIgdG8gc2hvdyBpbiB0aGUgY29tYm9ib3guIExlYXZlIGVtcHR5IHRvIHVzZSBkZWZhdWx0IGJlaGF2aW9yIGRldGVybWluZWRcclxuXHQgKiBieSB3aGV0aGVyIEFkZCBOZXcgaXMgZW5hYmxlZFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XHJcblxyXG5cdC8qKiBPYnNlcnZhYmxlIHRvIHN1YnNjcmliZSB0byB3aGVuIHRoZSBjb21ib2JveCBtZW51IGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgbG9hZE9uT3Blbk9ic2VydmFibGU/OiBPYnNlcnZhYmxlPE1lbnVJdGVtW10+IHwgdW5kZWZpbmVkO1xyXG5cclxuXHQvKiogRG8gbm90IGRpc3BsYXkgdGhlIHRvZ2dsZSBidXR0b24gd2hlbiB0cnVlICovXHJcblx0QElucHV0KCkgcHVibGljIGhpZGVUb2dnbGVCdXR0b24gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogQWx3YXlzIHNob3cgdGhlIG1lbnUgd2hlbiB0aGUgZm9ybU1vZGVsIGhhcyBhIHZhbHVlLiBTZXRzXHJcblx0ICogaGlkZVRvZ2dsZUJ1dHRvbiB0byB0cnVlIGFuZCBtZW51U3RhdHVzIHRvIHZpc2libGUgYXMgd2VsbC5cclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgYWx3YXlzT3BlbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBBZGRpdG9uYWwgY2xhc3NlcyB0byBhcHBseSB0byB0aGUgZWMtbWVudSBlbGVtZW50XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIG1lbnVFbGVtZW50Q2xhc3NlczogTWVudUhvc3RFbGVtZW50Q2xhc3NlcyB8IHN0cmluZ1tdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZGl0aW9uYWwgY2xhc3NlcyB0byBhcHBseSB0byB0aGUgLnRleHRib3gtZ3JvdXAgZWxlbWVudFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyB0ZXh0Ym94RWxlbWVudENsYXNzZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG5cdC8qKiBIaWRlICdObyBtYXRjaGVzJyBtZXNzYWdlIHdoZW4gdHJ1ZSAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBoaWRlTm9NYXRjaGVzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG4gICAqIFRleHQgdG8gc2hvdyB3aGVuIHRoZSBtZW51IGlzIGVtcHR5LiBcIk5vIG1hdGNoZXNcIiBpcyB0aGUgZGVmYXVsdC5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgbm9NYXRjaGVzVGV4dDogc3RyaW5nID0gJ05vTWF0Y2hlc19TQyc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRydW5jYXRlIG1lbnUgaXRlbXMgd2hlbiB0cnVlXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIHRydW5jYXRlSXRlbXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogTm90aWZ5IHRoZSBwYXJlbnQgdGhhdCB0aGUgYWRkIG5ldyBidXR0b24gd2FzIGNsaWNrZWRcclxuXHQgKiBAdG9kbyBkaXNjdXNzIGlmIHdlIG5lZWQgdG8gc2VuZCBhbG9uZyB0aGUgdmFsdWUgb3Igc2hvdWxkXHJcblx0ICogdGhlIHBhcmVudCBnZXQgaXQgZnJvbSB0aGUgZm9ybU1vZGVsXHJcblx0ICogKGx3ZiAyMDE3LjA3LjEzKTogSSB0aGluayB3ZSBtaWdodCBhcyB3ZWxsIHNlbmQgdGhlIHZhbHVlIGFsb25nIGFuZFxyXG5cdCAqIGxlYXZlIGl0IHVwIHRvIHRoZSBwYXJlbnQgdG8gZGVjaWRlIGhvdyB0byBoYW5kbGUgaXQuXHJcblx0ICovXHJcblx0QE91dHB1dCgpIHB1YmxpYyBhZGROZXdDbGljazogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIE5vdGlmeSBwYXJlbnQgd2hlbiB0ZXh0IHR5cGVkIGludG8gdGV4dGJveFxyXG5cdCAqL1xyXG5cdEBPdXRwdXQoKSBwdWJsaWMgc2VhcmNoOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuXHJcblx0QFZpZXdDaGlsZCgndGV4dGJveCcpIHB1YmxpYyB0ZXh0Ym94ITogVGV4dGJveENvbXBvbmVudDtcclxuXHJcblx0LyoqXHJcblx0ICogQWNjZXNzIHRvIHRoZSBtZW51J3MgY29tcG9uZW50IHZpYSB0aGUgIHtAbGluayBQb3B1cENvbnRhaW5lckRpcmVjdGl2ZX1cclxuXHQgKi9cclxuXHRAVmlld0NoaWxkKFBvcHVwQ29udGFpbmVyRGlyZWN0aXZlKSBwcml2YXRlIHBvcHVwPzogUG9wdXBDb250YWluZXJEaXJlY3RpdmU7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBSZWZlcmVuY2UgdGhlIGFkZC1uZXcgYnV0dG9uIGVsZW1lbnRcclxuXHQgKi9cclxuXHRAVmlld0NoaWxkKCdhZGROZXdCdXR0b24nKSBwcml2YXRlIGFkZE5ld0J1dHRvbiE6IEVsZW1lbnRSZWY7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBGaWx0ZXJlZCBJdGVtcyB0byBzaG93IGluIGNvbWJvYm94IG1lbnVcclxuXHQgKi9cclxuXHRwdWJsaWMgZmlsdGVyZWRPcHRpb25zOiBBcnJheTxNZW51SXRlbT4gPSBbXTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYWNrcyBpZiB0aGUgbWVudSBpcyBvcGVuIG9yIGhpZGRlblxyXG5cdCAqL1xyXG5cdHB1YmxpYyBtZW51U3RhdHVzOiBQb3B1cFN0YXR1cyA9ICdoaWRkZW4nO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogUGxhY2Vob2xkZXIgdG8gYXNzaWduIHRvIHRleHRib3hcclxuXHQgKi9cclxuXHRwdWJsaWMgZWZmZWN0aXZlUGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgbWVudSBpdGVtXHJcblx0ICovXHJcblx0cHVibGljIHNlbGVjdGVkSXRlbTogTWVudUl0ZW0gfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEZvcm1Db250cm9sIGZvciB0aGUgdGV4dGJveFxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0ZXh0Ym94Rm9ybU1vZGVsOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCcnKTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYWNrcyB3aGV0aGVyIHRoZSBhZGQgbmV3IGJ1dHRvbiBpcyBzZWxlY3RlZFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBhZGROZXdTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVHJhY2tzIHdoZXRoZXIgdGhlIHRleHRib3hGb3JtTW9kZWwgdmFsdWUgbWF0Y2hlcyBhbiBpdGVtIGluIHRoZSBmaWx0ZXJlZE9wdGlvbnNcclxuXHQgKi9cclxuXHRwdWJsaWMgZm91bmRNYXRjaDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBOdW1iZXIgb2YgZmlsdGVyZWQgb3B0aW9ucyB0byBkaXNwbGF5IGluIHRoZSBmb290ZXIuICBFeGNsdWRlcyBoZWFkaW5ncy5cclxuXHQgKi9cclxuXHRwdWJsaWMgZmlsdGVyZWRPcHRpb25Db3VudDogbnVtYmVyID0gMDtcclxuXHJcblx0LyoqXHJcblx0ICogRmxhdCBsaXN0IG9mIHNlbGVjdGFibGUgaXRlbXMgaW4gdGhlIGNvbWJvYm94LlxyXG5cdCAqIERvZXMgbm90IGluY2x1ZGUgaGVhZGluZ3Mgb3IgZGl2aWRlci1zZWN0aW9uIGl0ZW1zLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2VsZWN0YWJsZUl0ZW1zOiBNZW51SXRlbVtdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGV4IG9mIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgb3B0aW9uc1xyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2VsZWN0ZWRJdGVtSW5kZXg6IG51bWJlciA9IC0xO1xyXG5cclxuXHQvKiogUGxhY2Vob2xkZXIgdGV4dCBmb3IgJ0Nob29zZSBvciBBZGQuLi4nICovXHJcblx0cHJpdmF0ZSBjaG9vc2VPckFkZFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuXHJcblx0LyoqIFBsYWNlaG9sZGVyIHRleHQgZm9yICdDaG9vc2UnICovXHJcblx0cHJpdmF0ZSBjaG9vc2VQbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XHJcblxyXG5cdHByaXZhdGUgaGFzRGF0YUJlZW5Mb2FkZWRPbk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwcm90ZWN0ZWQgdmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlOiBWYWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UsXHJcblx0XHRwcm90ZWN0ZWQgZm9ybUdyb3VwSGVscGVyOiBGb3JtR3JvdXBIZWxwZXIsXHJcblx0XHRwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG5cdFx0cHJvdGVjdGVkIHNjcm9sbFNlcnZpY2U6IFNjcm9sbFNlcnZpY2VcclxuXHQpIHtcclxuXHRcdHN1cGVyKHZhbGlkYXRpb25NZXNzYWdlU2VydmljZSwgZm9ybUdyb3VwSGVscGVyKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYW5ndWxhciBvbkNoYW5nZXMgbGlmZWN5Y2xlIGV2ZW50XHJcblx0ICogQHNlZSBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvbGlmZWN5Y2xlLWhvb2tzXHJcblx0ICovXHJcblx0cHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuXHRcdHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xyXG5cclxuXHRcdC8vIHdoZW4gb3B0aW9ucyBjaGFuZ2VzXHJcblx0XHRpZiAoY2hhbmdlcy5vcHRpb25zKSB7XHJcblx0XHRcdHRoaXMucmVzZXRPcHRpb25zKCk7XHJcblxyXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHBvcHVwIHBvc2l0aW9uXHJcblx0XHRcdGlmICh0aGlzLnBvcHVwKSB7XHJcblx0XHRcdFx0dGhpcy5wb3B1cC51cGRhdGUoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHVwZGF0ZSB2YWxpZGF0b3JzIG9uIHRoZSB0ZXh0Ym94XHJcblx0XHRpZiAoY2hhbmdlcy5yZXF1aXJlZCB8fCBjaGFuZ2VzLm1pbmxlbmd0aCB8fCBjaGFuZ2VzLm1heGxlbmd0aCkge1xyXG5cdFx0XHR0aGlzLnNldFRleHRib3hGb3JtTW9kZWxWYWxpZGF0b3JzKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVXBkYXRlIHBsYWNlaG9sZGVyIHRleHQgd2hlbiAnQWRkIE5ldycgaXMgY29uZGl0aW9uYWwuXHJcblx0XHQvLyBuZ09uQ2hhbmdlcygpIGtpY2tzIG9mZiBiZWZvcmUgbmdPbkluaXQsIHNvIGluIG9yZGVyXHJcblx0XHQvLyB0byBub3Qgb3ZlcndyaXRlIGEgdXNlci1wcm92aWRlZCBwbGFjZWhvbGRlciwgZG8gbm90XHJcblx0XHQvLyB1cGRhdGUgcGxhY2Vob2xkZXIgb24gZmlyc3QgY2hhbmdlIChuZ09uSW5pdCB3aWxsIHRha2UgY2FyZSBvZiBpdCkuXHJcblx0XHRpZiAoKGNoYW5nZXMuYWRkTmV3ICYmICFjaGFuZ2VzLmFkZE5ldy5pc0ZpcnN0Q2hhbmdlKCkpIHx8IGNoYW5nZXMucGxhY2Vob2xkZXIpIHtcclxuXHRcdFx0dGhpcy51cGRhdGVQbGFjZWhvbGRlclRleHQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBhbmd1bGFyIG9uSW5pdCBsaWZlY3ljbGUgaG9va1xyXG5cdCAqIEBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2xpZmVjeWNsZS1ob29rc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHRcdHN1cGVyLm5nT25Jbml0KCk7XHJcblxyXG5cdFx0aWYgKHRoaXMuYWx3YXlzT3Blbikge1xyXG5cdFx0XHR0aGlzLmhpZGVUb2dnbGVCdXR0b24gPSB0cnVlO1xyXG5cdFx0XHR0aGlzLm1lbnVTdGF0dXMgPSAndmlzaWJsZSc7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gR2V0IHRyYW5zbGF0ZWQgcGxhY2Vob2xkZXIgdGV4dFxyXG5cdFx0dGhpcy5jaG9vc2VPckFkZFBsYWNlaG9sZGVyID0gYCR7dGhpcy50cmFuc2xhdGUuaW5zdGFudCgnQ2hvb3NlIG9yIGFkZCcpfS4uLmA7XHJcblx0XHR0aGlzLmNob29zZVBsYWNlaG9sZGVyID0gYCR7dGhpcy50cmFuc2xhdGUuaW5zdGFudCgnQ2hvb3NlJyl9YDtcclxuXHJcblx0XHR0aGlzLmZvcm1Nb2RlbENoYW5nZWQodGhpcy5mb3JtTW9kZWwudmFsdWUpO1xyXG5cdFx0dGhpcy5zZXRUZXh0Ym94Rm9ybU1vZGVsVmFsaWRhdG9ycygpO1xyXG5cclxuXHRcdC8vIEVycm9ycyBmb3IgdGhpcyBjb21wb25lbnQgYXJlIGRpc3BsYXllZCB2aWEgdGhlIHZhbGlkYXRpb25FcnJvcnMgcHJvcGVydHksIHdoaWNoIGlzXHJcblx0XHQvLyBwb3B1bGF0ZWQgd2hlbiB0cmFuc2xhdGVWYWxpZGF0aW9uTWVzc2FnZXMgaXMgcnVuLlxyXG5cdFx0Ly8gV2hlbiB0aGUgaW50ZXJuYWwgVGV4dGJveENvbXBvbmVudCBoYXMgdmFsaWRhdGlvbiBlcnJvcnMsIHdlIHNldCB0aGVtIG9uIHRoZVxyXG5cdFx0Ly8gZm9ybU1vZGVsIGFzIHdlbGwuICBUaGlzIHVwZGF0ZXMgdGhlIHZhbGlkaXR5IG9mIG91ciBDb21ib2JveENvbXBvbmVudCBjb250cm9sLFxyXG5cdFx0Ly8gYnV0IGRvZXMgbm90IHRyaWdnZXIgdHJhbnNsYXRpb24uICBTdWJzY3JpYmUgdG8gc3RhdHVzQ2hhbmdlcyBoZXJlIHNvIGNvbXBvbmVudFxyXG5cdFx0Ly8gdmFsaWRhdGlvbiBlcnJvcnMgd2lsbCBhcHBlYXIgYWxvbmcgd2l0aCB0aGUgQ29tYm9ib3hDb21wb25lbnQncyBsYWJlbC5cclxuXHRcdHRoaXMuZm9ybU1vZGVsLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG5cdFx0XHR0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpXHJcblx0XHQpLnN1YnNjcmliZShkYXRhID0+IHRoaXMuZm9ybU1vZGVsQ2hhbmdlZChkYXRhKSk7XHJcblxyXG5cdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnN0YXR1c0NoYW5nZXMucGlwZShcclxuXHRcdFx0dGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKVxyXG5cdFx0KS5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLnNldEZvcm1Nb2RlbFZhbGlkYXRpb25FcnJvcnMoZGF0YSkpO1xyXG5cclxuXHRcdC8vIGRlZmF1bHQgcGxhY2Vob2xkZXJcclxuXHRcdHRoaXMudXBkYXRlUGxhY2Vob2xkZXJUZXh0KCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGFuZ3VsYXIgYWZ0ZXJWaWV3SW5pdCBsaWZlY3ljbGUgaG9va1xyXG5cdCAqIEBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2xpZmVjeWNsZS1ob29rc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcblx0XHRpZiAoIXRoaXMucG9wdXApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGFsbG93IG92ZXJmbG93IG91dCBvZiB0aGUgc2Nyb2xsUGFyZW50XHJcblx0XHQvLyBwcmV2ZW50cyBtZW51IGZyb20gb2JzY3VyaW5nIHRoZSBjb21ib2JveFxyXG5cdFx0bGV0IHBvcHBlck9wdGlvbnM6IFBvcHBlci5Qb3BwZXJPcHRpb25zID0ge1xyXG5cdFx0XHRtb2RpZmllcnM6IHtcclxuXHRcdFx0XHRwcmV2ZW50T3ZlcmZsb3c6IHtcclxuXHRcdFx0XHRcdGJvdW5kYXJpZXNFbGVtZW50OiAndmlld3BvcnQnXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIGNvbnZlcnQgdGhlIENvbWJvYm94TWVudVBvc2l0aW9uIGludG8gYSBQb3BwZXJQbGFjZW1lbnRcclxuXHRcdHN3aXRjaCAodGhpcy5tZW51UG9zaXRpb24pIHtcclxuXHRcdFx0Y2FzZSAoXCJ0b3BfbGVmdFwiKTpcclxuXHRcdFx0XHRwb3BwZXJPcHRpb25zLnBsYWNlbWVudCA9ICd0b3Atc3RhcnQnO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIChcInRvcF9yaWdodFwiKTpcclxuXHRcdFx0XHRwb3BwZXJPcHRpb25zLnBsYWNlbWVudCA9ICd0b3AtZW5kJztcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAoXCJib3R0b21fbGVmdFwiKTpcclxuXHRcdFx0XHRwb3BwZXJPcHRpb25zLnBsYWNlbWVudCA9ICdib3R0b20tc3RhcnQnO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIChcImJvdHRvbV9yaWdodFwiKTpcclxuXHRcdFx0XHRwb3BwZXJPcHRpb25zLnBsYWNlbWVudCA9ICdib3R0b20tZW5kJztcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbWVudVBvc2l0aW9uIGZvciBDb21ib2JveENvbXBvbmVudC5gKVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFNjcm9sbCB0aGUgbWVudSB0byB0aGUgc2VsZWN0ZWQgaXRlbSBvbmNlIHRoZSBwb3B1cCBtZW51IGlzIHJlYWR5XHJcblx0XHRwb3BwZXJPcHRpb25zLm9uQ3JlYXRlID0gKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnNjcm9sbE1lbnUoKTtcclxuXHJcblx0XHRcdGlmICh0aGlzLnBvcHVwRml4ZWQpIHtcclxuXHRcdFx0XHR0aGlzLnBvcHVwIS5maXhQb3NpdGlvbigpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMucG9wdXBGaXhlZCkge1xyXG5cdFx0XHRwb3BwZXJPcHRpb25zLm9uVXBkYXRlID0gKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMucG9wdXAhLmZpeFBvc2l0aW9uKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnBvcHVwLnBvcHBlck9wdGlvbnMgPSBwb3BwZXJPcHRpb25zO1xyXG5cclxuXHRcdHRoaXMucG9wdXAucG9wcGVyU3RhdHVzQ2hhbmdlLnBpcGUoXHJcblx0XHRcdHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZClcclxuXHRcdCkuc3Vic2NyaWJlKChldmVudDogJ3Zpc2libGUnIHwgJ2hpZGRlbicpID0+IHtcclxuXHRcdFx0XHR0aGlzLm1lbnVTdGF0dXMgPSBldmVudDtcclxuXHJcblx0XHRcdFx0Ly8gU3luY2hyb25pemUgdGhlIGZvcm1Nb2RlbCBhbmQgdGV4dEZvcm1Nb2RlbCB2YWx1ZXMgd2hlbiB0aGVcclxuXHRcdFx0XHQvLyBwb3B1cCBtZW51IGNsb3NlcyBhbmQgdW4tZmlsdGVyIHRoZSBvcHRpb25zIGFuZCByZXNldCB0aGVcclxuXHRcdFx0XHQvLyBzZWxlY3RlZEl0ZW0gYW5kIGluZGV4XHJcblx0XHRcdFx0aWYgKGV2ZW50ID09PSAnaGlkZGVuJykge1xyXG5cdFx0XHRcdFx0dGhpcy5zeW5jTW9kZWxWYWx1ZXMoKTtcclxuXHRcdFx0XHRcdHRoaXMucmVzZXRPcHRpb25zKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBTZXQgZXJyb3JzIG9uIHRoZSB0ZXh0Ym94Rm9ybU1vZGVsLCB3aGljaCB3aWxsIHRoZW4gc2V0IGVycm9ycyBvbiB0aGVcclxuXHQgKiBmb3JtTW9kZWwuIEFsc28gbWFyayB0aGUgZm9ybU1vZGVsIGFzIHRvdWNoZWQgdG8gZGlzcGxheSBhbnkgZXJyb3JzLlxyXG5cdCAqIEBwYXJhbSBlcnJvcnMga2V5KHMpIG9mIFZhbGlkYXRpb25NZXNzYWdlU2VydmljZSBlcnJvcnMgdG8gZGlzcGxheSBvciByZW1vdmVcclxuXHQgKiBAbWVtYmVyb2YgQ29tb2JvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIHNldEVycm9ycyhlcnJvcnM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9KTogdm9pZCB7XHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0RXJyb3JzKGVycm9ycyk7XHJcblx0XHR0aGlzLmZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVW5maWx0ZXIgb3B0aW9ucyBhbmQgdXBkYXRlIHRoZSBzZWxlY3RlZEl0ZW0gYW5kIHNlbGVjdGVkSXRlbUluZGV4XHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIHJlc2V0T3B0aW9ucyhvcHRpb25zPzogTWVudUl0ZW1bXSk6IHZvaWQge1xyXG5cdFx0dGhpcy5maWx0ZXJlZE9wdGlvbnMgPSBvcHRpb25zIHx8IHRoaXMub3B0aW9ucztcclxuXHRcdHRoaXMuc2VsZWN0YWJsZUl0ZW1zID0gTWVudUNvbXBvbmVudC5nZXRTZWxlY3RhYmxlSXRlbXModGhpcy5maWx0ZXJlZE9wdGlvbnMpO1xyXG5cdFx0Ly8gZG8gbm90IGNvdW50IGhlYWRpbmdzXHJcblx0XHR0aGlzLmZpbHRlcmVkT3B0aW9uQ291bnQgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucz8uZmlsdGVyKG8gPT4gby5kaXNwbGF5ICE9PSAnaGVhZGluZycgJiYgby5kaXNwbGF5ICE9PSAnZGl2aWRlZC1zZWN0aW9uJykubGVuZ3RoIHx8IDA7XHJcblxyXG5cdFx0Ly9pZiB0aGV5IGhhdmUgbm8gc2VhcmNoIHRlcm0sIGRvbid0IHRyeSB0byBzZWxlY3QgYW55dGhpbmcgc28gdGhleSBjYW4gY2xlYXIgdGhlIGJveCBvdXQgYnkgaGl0dGluZyBlbnRlclxyXG5cdFx0Ly9pZiB0aGV5IGhhdmUgYSBzZWFyY2ggdGVybSBhbmQgdGhlIG9wdGlvbnMgY2hhbmdlZCwgc2VsZWN0IGFuIG9wdGlvbiBmcm9tIHRoZSBtZW51IHNvIHRoZXkgd2lsbCBnZXQgaXQgYXV0b21hdGljYWxseSBpZiB0aGV5IGhpdCBlbnRlclxyXG5cdFx0aWYgKHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSAhPT0gJycpIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IHRoaXMuZmluZERlZmF1bHRTZWxlY3Rpb25JbmRleCh0aGlzLnNlbGVjdGFibGVJdGVtcywgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKTtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGFibGVJdGVtc1t0aGlzLnNlbGVjdGVkSXRlbUluZGV4XSB8fCBudWxsO1xyXG5cdFx0XHR0aGlzLnNjcm9sbE1lbnUodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvL2lmIHRoZXkgaGF2ZSBubyBzZWFyY2ggdGVybSBhbmQgdGhlIG9wdGlvbnMgYXJlIHJlc2V0LCBkb24ndCBhdXRvLXBpY2sgdGhlIGZpcnN0IG9uZVxyXG5cdFx0XHQvL3NvIHRoYXQgZW50ZXIgd2lsbCBhbGxvdyB0aGVtIHRvIHdpcGUgb3V0IHRoZWlyIGxhc3Qgc2VsZWN0aW9uXHJcblx0XHRcdHRoaXMuY2xlYXJTZWxlY3RlZEl0ZW0oKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpc3RlbiB0byB0aGUgc2VsZWN0ZWQgY2hhbmdlZCBldmVudCBmcm9tIHtAbGluayBNZW51Q29tcG9uZW50fSBhbmQgdXBkYXRlIHRoZSBmb3JtXHJcblx0ICogbW9kZWwgYW5kIGNsb3NlIG1lbnVcclxuXHQgKi9cclxuXHRwdWJsaWMgc2VsZWN0ZWRDaGFuZ2VkKGl0ZW06IE1lbnVJdGVtKTogdm9pZCB7XHJcblx0XHR0aGlzLnNldEZvcm1Nb2RlbFZhbHVlKGl0ZW0pO1xyXG5cdFx0dGhpcy50b2dnbGVNZW51KCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2hvdyBhbmQgaGlkZSB0aGUgcG9wdXAgbWVudVxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIHRvZ2dsZU1lbnUoZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLnBvcHVwKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoZXZlbnQpIHtcclxuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCF0aGlzLmZvcm1Nb2RlbC5kaXNhYmxlZCkge1xyXG5cdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAndmlzaWJsZScpIHtcclxuXHRcdFx0XHQvLyBXaGVuIHRoZSBwb3B1cCBpcyBoaWRkZW4gaXQgd2lsbCBlbWl0IGl0cyBjaGFuZ2VkIHN0YXR1cyBhbmRcclxuXHRcdFx0XHQvLyB3ZSB3aWxsIHJlc2V0IHZhbHVlcyBpZiBuZWVkIGJlLlxyXG5cdFx0XHRcdHRoaXMucG9wdXAuaGlkZSgpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdGlmICh0aGlzLmxvYWRPbk9wZW5PYnNlcnZhYmxlICYmICF0aGlzLmhhc0RhdGFCZWVuTG9hZGVkT25PcGVuKSB7XHJcblx0XHRcdFx0XHR0aGlzLnBlbmRpbmcgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdHRoaXMubG9hZE9uT3Blbk9ic2VydmFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKHJlc3VsdDogTWVudUl0ZW1bXSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmhhc0RhdGFCZWVuTG9hZGVkT25PcGVuID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRcdHRoaXMucGVuZGluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHR0aGlzLm9wdGlvbnMgPSByZXN1bHQ7XHJcblxyXG5cdFx0XHRcdFx0XHR0aGlzLnJlc2V0T3B0aW9ucygpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBvcHVwIS5zaG93KCk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dGhpcy5wb3B1cC5zaG93KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgb25CbHVyKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5mb3JtTW9kZWwubWFya0FzVG91Y2hlZCgpO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnRyb2wgdGhlIG1lbnUgd2l0aCBrZXlib2FyZCBuYXZpZ2F0aW9uXHJcblx0ICpcclxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudC9rZXkjRXhhbXBsZSB8IEtleWJvYXJkRXZlbnQua2V5fVxyXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2tleS9LZXlfVmFsdWVzIHwgS2V5IFZhbHVlc31cclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBrZXlOYXZpZ2F0ZShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG5cdFx0c3dpdGNoIChldmVudC5rZXkpIHtcclxuXHRcdFx0Y2FzZSBcIkFycm93RG93blwiOlxyXG5cdFx0XHRjYXNlIFwiRG93blwiOlxyXG5cdFx0XHRjYXNlIFwiQXJyb3dVcFwiOlxyXG5cdFx0XHRjYXNlIFwiVXBcIjpcclxuXHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdHRoaXMub25BcnJvd0Rvd25VcChldmVudCk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFwiQmFja3NwYWNlXCI6XHJcblx0XHRcdGNhc2UgXCJEZWxldGVcIjpcclxuXHRcdFx0Y2FzZSBcIkRlbFwiOlxyXG5cdFx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICdoaWRkZW4nKSB7XHJcblx0XHRcdFx0XHR0aGlzLnRvZ2dsZU1lbnUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgXCJUYWJcIjpcclxuXHRcdFx0XHQvLyBJZiB0YWJiaW5nIGZyb20gdGhlIHRleHRib3ggdG8gdGhlIGJ1dHRvbiwgb3ZlcnJpZGUgdGhlIHRleHRib3ggYXMgYmVpbmdcclxuXHRcdFx0XHQvLyBtYXJrZWQgdG91Y2hlZCBzbyB3ZSBkb24ndCBzZWUgdGhlIGludmFsaWQgc3RhdGUuIE9ubHkgc2hvdyB0aGUgaW52YWxpZCBzdGF0ZVxyXG5cdFx0XHRcdC8vIHdoZW4gdGFiYmluZyBvdXQgb2YgY29tYm9ib3ggZnJvbSB0aGUgYnV0dG9uIG9yIGJhY2sgdGFiYmluZyBmcm9tIHRoZSB0ZXh0Ym94XHJcblx0XHRcdFx0Ly8gaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicgJiYgZXZlbnQuc3JjRWxlbWVudCAmJiBldmVudC5zcmNFbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcpIHtcclxuXHRcdFx0XHQvLyBcdGlmIChldmVudC5zaGlmdEtleSkge1xyXG5cdFx0XHRcdC8vIFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwubWFya0FzVG91Y2hlZCgpO1xyXG5cdFx0XHRcdC8vIFx0XHR0aGlzLmZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcblx0XHRcdFx0Ly8gXHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwubWFya0FzVW50b3VjaGVkKCk7XHJcblx0XHRcdFx0Ly8gXHR9XHJcblx0XHRcdFx0Ly8gfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdUYWInICYmIGV2ZW50LnNyY0VsZW1lbnQgJiYgZXZlbnQuc3JjRWxlbWVudC50YWdOYW1lID09PSAnQlVUVE9OJykge1xyXG5cdFx0XHRcdC8vIFx0aWYgKCFldmVudC5zaGlmdEtleSkge1xyXG5cdFx0XHRcdC8vIFx0XHR0aGlzLmZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcblx0XHRcdFx0Ly8gXHR9XHJcblx0XHRcdFx0Ly8gfVxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAndmlzaWJsZScpIHtcclxuXHRcdFx0XHRcdC8vaWYgdGhlIHNlbGVjdGVkIG9wdGlvbiBpcyB0aGUgYWRkIG5ldyBidXR0b24gbGV0IGl0IGZpcmUgYnV0IGRvbid0IGFsbG93XHJcblx0XHRcdFx0XHQvL3RoZSB0YWIgZXZlbnQgdG8gY2FycnkgdGhlbSBmb3J3YXJkIGZyb20gd2hlcmV2ZXIgdGhleSBsYW5kIC0gdGhleSB3b3VsZCBza2lwIHRoZSBmaXJzdCBib3ggb24gdGhlIGFkZCBuZXcgZm9ybVxyXG5cdFx0XHRcdFx0Ly9JbiB0aGUgbm9ybWFsIGNhc2Ugd2Ugd2FudCB0byBhbGxvdyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvciB0aGV5IHdvbid0IGJlIGFibGUgdG8gdGFiIG91dCBvZiB0aGUgY29udHJvbCBhdCBhbGwuXHJcblx0XHRcdFx0XHRpZih0aGlzLmFkZE5ld1NlbGVjdGVkKXtcclxuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR0aGlzLmNvbW1pdFNlbGVjdGlvbihldmVudCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBcIkVudGVyXCI6XHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ3Zpc2libGUnKSB7XHJcblx0XHRcdFx0XHR0aGlzLmNvbW1pdFNlbGVjdGlvbihldmVudCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBcIkVzY2FwZVwiOlxyXG5cdFx0XHRjYXNlIFwiRXNjXCI6XHJcblx0XHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ3Zpc2libGUnKSB7XHJcblx0XHRcdFx0XHQvLyBKdXN0IGNsb3NlIHRoZSBtZW51LCBkbyBub3QgZm9jdXMgdGhlIG5leHQgZWxlbWVudCBvbiB0YWJcclxuXHRcdFx0XHRcdC8vIHVubGVzcyB0aGUgbWVudSBpcyBoaWRkZW5cclxuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gQ2xvc2UgdGhlIG1lbnUgYmVmb3JlIHdlIHJlc2V0IHNlbGVjdGVkSXRlbSBzbyB3ZSBkb24ndCBzZWUgdGhlIGhpZ2hsaWdodCBjaGFuZ2luZ1xyXG5cdFx0XHRcdFx0Ly8gd2hlbiByZXNldCB0aGUgc2VsZWN0ZWQgaXRlbSBiYWNrIHRvIHRoZSBmb3JtTW9kZWxcclxuXHRcdFx0XHRcdHRoaXMudG9nZ2xlTWVudSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgXCIgXCI6XHJcblx0XHRcdGNhc2UgXCJTcGFjZWJhclwiOlxyXG5cdFx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICdoaWRkZW4nKSB7XHJcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0dGhpcy50b2dnbGVNZW51KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAnaGlkZGVuJyAmJiBldmVudC5rZXkgIT09ICdTaGlmdCcpIHtcclxuXHRcdFx0XHRcdHRoaXMudG9nZ2xlTWVudSgpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWNpbGl0YXRlcyBhZGRpbmcgaXRlbXMgdG8gYSBjb21ib2JveFxyXG5cdCAqXHJcblx0ICogQHBhcmFtIGFkZEZuIEZ1bmN0aW9uIGZyb20gcGFyZW50IHRoYXQgc2hvdWxkIG1ha2UgYW4gQVBJIHJlcXVlc3QgdG8gYWRkIGEgbmV3IGl0ZW0gdG8gdGhlIGNvbWJvYm94J3Mgb3B0aW9uc1xyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBhc3luYyBhZGROZXdJdGVtKGFkZEZuOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSB7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gdHJ1ZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBhZGRGbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBXZSBnYXZlIGl0IG91ciBiZXN0IHRyeSwgc29tZXRoaW5nIGlzIHJlYWxseSB3aGFjaywgc28gbGV0J3MganVzdCBzZXQgdGhlIGVycm9yXHJcbiAgICAgICAgICAgIHRoaXMuc2V0RXJyb3JzKHsgJ2FkZG5ldyc6IHRydWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucGVuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudG9nZ2xlTWVudSgpO1xyXG4gICAgfVxyXG5cclxuXHQvKipcclxuXHQgKiBGaWd1cmUgb3V0IHdoZXRoZXIgdGhleSBhcmUgYWRkaW5nIG5ldyBvciBoYXZlIGFuIGl0ZW0gc2VsZWN0ZWQsIGFuZCBjb21taXQgaXQgdG8gdGhlIGZvcm0gbW9kZWxcclxuXHQgKi9cclxuICBwcml2YXRlIGNvbW1pdFNlbGVjdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuYWRkTmV3U2VsZWN0ZWQpIHtcclxuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdHRoaXMub25BZGROZXcoZXZlbnQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5zZXRGb3JtTW9kZWxWYWx1ZSh0aGlzLnNlbGVjdGVkSXRlbSk7XHJcblx0XHRcdHRoaXMudG9nZ2xlTWVudSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VuZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgdGV4dGJveCB0byB0aGUgcGFyZW50IHdoZW4gdGhlIGFkZCBuZXcgYnV0dG9uIGlzXHJcblx0ICogY2xpY2tlZFxyXG5cdCAqXHJcblx0ICogQHBhcmFtIGV2ZW50IEFkZCBuZXcgYnV0dG9uIGNsaWNrIG9yIGVudGVyIGtleSBldmVudFxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBvbkFkZE5ldyhldmVudDogRXZlbnQpOiB2b2lkIHtcclxuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IGZhbHNlO1xyXG5cdFx0dGhpcy5hZGROZXdDbGljay5lbWl0KHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSk7XHJcblx0XHR0aGlzLnBvcHVwPy5oaWRlKCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogTmF2aWdhdGUgdGhlIGRyb3Bkb3duIG1lbnUgdXNpbmcgdXAgYW5kIGRvd24gYXJyb3cga2V5c1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIGV2ZW50IFVwIG9yIGRvd24gYXJyb3cga2V5ZG93biBldmVudFxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgb25BcnJvd0Rvd25VcChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG5cdFx0c3dpdGNoIChldmVudC5rZXkpIHtcclxuXHRcdFx0Y2FzZSBcIkFycm93RG93blwiOlxyXG5cdFx0XHRjYXNlIFwiRG93blwiOlxyXG5cdFx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID09PSAtMSAmJiB0aGlzLmFkZE5ld0J1dHRvbiAmJiAhdGhpcy5hZGROZXdCdXR0b24ubmF0aXZlRWxlbWVudC5oaWRkZW4gJiYgIXRoaXMuYWRkTmV3U2VsZWN0ZWQpIHtcclxuXHRcdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSB0cnVlO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA8IHRoaXMuc2VsZWN0YWJsZUl0ZW1zLmxlbmd0aCAtIDEpIHtcclxuXHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXgrKztcclxuXHJcblx0XHRcdFx0XHRpZiAodGhpcy5hZGROZXdTZWxlY3RlZCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmFkZE5ld1NlbGVjdGVkID0gZmFsc2U7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBcIkFycm93VXBcIjpcclxuXHRcdFx0Y2FzZSBcIlVwXCI6XHJcblx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPT09IC0xICYmIHRoaXMuYWRkTmV3QnV0dG9uICYmICF0aGlzLmFkZE5ld0J1dHRvbi5uYXRpdmVFbGVtZW50LmhpZGRlbiAmJiB0aGlzLmFkZE5ld1NlbGVjdGVkKSB7XHJcblx0XHRcdFx0XHR0aGlzLmFkZE5ld1NlbGVjdGVkID0gZmFsc2U7XHJcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID4gLTEpIHtcclxuXHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXgtLTtcclxuXHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9PT0gLTEgJiYgdGhpcy5hZGROZXdCdXR0b24gJiYgIXRoaXMuYWRkTmV3QnV0dG9uLm5hdGl2ZUVsZW1lbnQuaGlkZGVuKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuc2VsZWN0ZWRJdGVtID0gdGhpcy5zZWxlY3RhYmxlSXRlbXNbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleF07XHJcblxyXG5cdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ2hpZGRlbicpIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0Rm9ybU1vZGVsVmFsdWUodGhpcy5zZWxlY3RlZEl0ZW0pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5zY3JvbGxNZW51KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblxyXG5cdC8qKlxyXG5cclxuXHQgKiBGaWx0ZXIgYXJyYXkgb2Ygb3B0aW9ucyBieSBsYWJlbCBvciBjYXB0aW9uIChjb250YWlucylcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBmaWx0ZXJUZXh0IFRoZSB2YWx1ZSBvZiB0ZXh0Ym94IHRoYXQgd2Ugd2lsbCBmaWx0ZXIgb3VyIG9wdGlvbnMgYnlcclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZmlsdGVyT3B0aW9uc0FycmF5KGZpbHRlclRleHQ6IHN0cmluZyk6IEFycmF5PE1lbnVJdGVtPiB7XHJcblx0XHRsZXQgc2VhcmNoVGV4dCA9IGZpbHRlclRleHQudG9Mb3dlckNhc2UoKTtcclxuXHRcdGlmIChmaWx0ZXJUZXh0ICYmIGZpbHRlclRleHQgIT09ICcnKSB7XHJcblx0XHRcdGNvbnN0IG1hdGNoZXNTZWFyY2ggPSAoaXRlbTogTWVudUl0ZW0pID0+IGl0ZW0ubGFiZWwudG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlYXJjaFRleHQpID49IDAgfHwgKGl0ZW0uY2FwdGlvbiAmJiBpdGVtLmNhcHRpb24udG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlYXJjaFRleHQpID49IDApO1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5vcHRpb25zLnJlZHVjZSgoZmlsdGVyZWRJdGVtcywgaXRlbSkgPT4ge1xyXG5cdFx0XHRcdC8vIE1hdGNoIHRoZSBpdGVtIGl0c2VsZiBpZiBpdCBkb2Vzbid0IGhhdmUgYW55IGNoaWxkcmVuXHJcblx0XHRcdFx0aWYgKCFpdGVtLml0ZW1zPy5sZW5ndGggJiYgbWF0Y2hlc1NlYXJjaChpdGVtKSkge1xyXG5cdFx0XHRcdFx0ZmlsdGVyZWRJdGVtcy5wdXNoKGl0ZW0pO1xyXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgY2hpbGRyZW4sIGZpbHRlciB0aGVtIGFuZCBhZGQgdGhlIHBhcmVudCBpZiBpdCBoYXMgYW55IGNoaWxkcmVuIHRoYXQgbWF0Y2hcclxuXHRcdFx0XHR9IGVsc2UgaWYgKGl0ZW0uaXRlbXM/Lmxlbmd0aCAmJiAoaXRlbS5kaXNwbGF5ID09PSAnaGVhZGluZycgfHwgaXRlbS5kaXNwbGF5ID09PSAnZGl2aWRlZC1zZWN0aW9uJykpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGZpbHRlcmVkQ2hpbGRJdGVtcyA9IGl0ZW0uaXRlbXMuZmlsdGVyKG1hdGNoZXNTZWFyY2gpO1xyXG5cdFx0XHRcdFx0aWYgKGZpbHRlcmVkQ2hpbGRJdGVtcy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0Ly8gTmVlZCB0byBjbG9uZSB0aGUgcGFyZW50IGl0ZW0gd2l0aCB0aGUgZmlsdGVyZWQgY2hpbGRyZW4gc28gd2UgZG9uJ3QgbW9kaWZ5IHRoZSBvcmlnaW5hbFxyXG5cdFx0XHRcdFx0XHRmaWx0ZXJlZEl0ZW1zLnB1c2goey4uLml0ZW0sIGl0ZW1zOiBmaWx0ZXJlZENoaWxkSXRlbXN9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIGZpbHRlcmVkSXRlbXM7XHJcblx0XHRcdH0sIDxNZW51SXRlbVtdPltdKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJldHVybiB0aGlzLm9wdGlvbnM7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogRmluZCBhIGdpdmVuIGl0ZW0ncyBpbmRleCBpbiB0aGUgZmlsdGVyZWQgaXRlbXMgYXJyYXkuXHJcblx0ICpcclxuXHQgKiBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZFxyXG5cdCAqIEBwYXJhbSBpdGVtIFRoZSBtYXRjaGluZyBpdGVtIHRvIGZpbmQgaW4gdGhlXHJcblx0ICogZmlsdGVyZE9wdGlvbnMgYXJyYXkuIFdpbGwgdXNlIHRoZSBzZWxlY3RlZEl0ZW0gaWYgbm90aGluZyBpcyBwYXNzZWQuXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBmaW5kU2VsZWN0ZWRJdGVtSW5kZXgoaXRlbT86IE1lbnVJdGVtKTogbnVtYmVyIHtcclxuXHRcdGxldCBpdGVtVG9GaW5kID0gaXRlbSA/IGl0ZW0gOiB0aGlzLnNlbGVjdGVkSXRlbTtcclxuXHJcblx0XHRpZiAoaXRlbVRvRmluZCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5zZWxlY3RhYmxlSXRlbXMuZmluZEluZGV4KGl0ZW0gPT4ge1xyXG5cdFx0XHRcdGlmKGl0ZW0uaWQgJiYgKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5pZCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGl0ZW0ubGFiZWwgPT09ICg8TWVudUl0ZW0+aXRlbVRvRmluZCkubGFiZWwgJiYgaXRlbS5pZCA9PT0gKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5pZFxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gaXRlbS5sYWJlbCA9PT0gKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5sYWJlbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAtMTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBSZWFjdCB0byBvdXIgZm9ybU1vZGVsIGNoYW5naW5nXHJcblx0ICpcclxuXHQgKiBUaGUgZm9ybU1vZGVsIHJlcHJlc2VudHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBNb2RlbEl0ZW1cclxuXHQgKiBXaGVuIGNoYW5nZWQsIHNldCB0aGUgdmFsdWUgb2YgdGhlIFRleHRib3hDb21wb25lbnQgYW5kXHJcblx0ICogZmluZCBpbmRleCBvZiBpdGVtIGluIG9wdGlvbnMgbGlzdC5cclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZm9ybU1vZGVsQ2hhbmdlZChkYXRhPzogTWVudUl0ZW0pOiB2b2lkIHtcclxuXHRcdHRoaXMuc3luY2hyb25pemVEaXNhYmxlZEF0dHJpYnV0ZXMoKTtcclxuXHJcblx0XHRpZiAoZGF0YSkge1xyXG5cdFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUoZGF0YS5zZWxlY3RlZExhYmVsIHx8IGRhdGEubGFiZWwpO1xyXG5cclxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IHRoaXMuZmluZFNlbGVjdGVkSXRlbUluZGV4KGRhdGEpO1xyXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA+PSAwKSB7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGFibGVJdGVtc1t0aGlzLnNlbGVjdGVkSXRlbUluZGV4XTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly9UaGUgaG9zdCB3aXBlZCBvdXQgdGhlIGRhdGEgZXh0ZXJuYWxseSwgY2xlYXIgdGhlIHRleHRib3ggYW5kIHRoZSB0cmFja2luZyBzdGF0ZVxyXG5cdFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwucmVzZXQoKTtcclxuXHRcdFx0dGhpcy5jbGVhclNlbGVjdGVkSXRlbSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNjcm9sbCB0aGUgbWVudSBpZiB0aGUgY3VycmVudCBzZWxlY3RlZEl0ZW1JbmRleCBpcyBvdXQgb2Ygdmlld1xyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzY3JvbGxNZW51KGtub3duSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdC8vIFVwZGF0ZSB0aGUgc2VsZWN0ZWRJdGVtSW5kZXggaW4gY2FzZSBvdXIgb3B0aW9ucyBjaGFuZ2VkXHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSBrbm93bkluZGV4ID09PSB1bmRlZmluZWQgPyB0aGlzLmZpbmRTZWxlY3RlZEl0ZW1JbmRleCgpIDoga25vd25JbmRleDtcclxuXHJcblx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID4gLTEgJiYgdGhpcy5zZWxlY3RlZEl0ZW0pIHtcclxuXHRcdFx0XHQvLyBUaGUgbWVudSBjb21wb25lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGlkcyBmb3IgdGhlIG1lbnUgaXRlbXMgaWYgdGhleSBkb250IGhhdmUgdGhlbSxcclxuXHRcdFx0XHQvLyBzbyB0aGV5IG5lZWQgdG8gYmUgYWNjb3VudGVkIGZvciBoZXJlIHNpbmNlIHRoZSBjb21ib2JveCBkb2Vzbid0IGtub3cgYWJvdXQgdGhvc2UgaWRzXHJcblx0XHRcdFx0bGV0IGl0ZW1JZCA9IHRoaXMuc2VsZWN0ZWRJdGVtLmlkID8gdGhpcy5zZWxlY3RlZEl0ZW0uaWQgOiBNZW51Q29tcG9uZW50LmdldEluZGV4ZWRJdGVtSWQodGhpcy5maWx0ZXJlZE9wdGlvbnMsIHRoaXMuc2VsZWN0ZWRJdGVtLCBgJHt0aGlzLmlkfV9tZW51YCk7XHJcblxyXG5cdFx0XHRcdC8vdHJpZ2dlciB0aGUgc2Nyb2xsaW5nIGFmdGVyIGEgdGljayB0byBhbGxvdyB0aGUgbWVudSB0byBiZSB1cCB0byBkYXRlIChhbmQgcGVuZGluZyBtYXNrIGNsZWFyZWQpIGJlZm9yZSBtZWFzdXJpbmdcclxuXHRcdFx0XHRzZXRUaW1lb3V0KCgpPT57XHJcblx0XHRcdFx0XHR0aGlzLnNjcm9sbFNlcnZpY2Uuc2Nyb2xsSXRlbUNlbnRlcmVkKGAjJHt0aGlzLmlkfV9tZW51X2xpc3RgLCBgIyR7aXRlbUlkfWApO1xyXG5cdFx0XHRcdH0sIDApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlYXJjaC9GaWx0ZXIgYmFzZWQgb24gdGV4dGJveCBpbnB1dFxyXG5cdCAqIE5PVEU6IHNvIGFzIG5vdCB0byByZWNlaXZlIGEgbm90aWZpY2F0aW9uIG9uIGV2ZXJ5IGtleSBldmVudCwgd2Ugc3VnZ2VzdCB5b3UgZGVib3VuY2UgeW91clxyXG5cdCAqIHN1YnNjcmlwdGlvblxyXG5cdCAqIEBzZWUge0BsaW5rIGh0dHA6Ly9yZWFjdGl2ZXguaW8vcnhqcy9jbGFzcy9lczYvT2JzZXJ2YWJsZS5qc35PYnNlcnZhYmxlLmh0bWwjaW5zdGFuY2UtbWV0aG9kLWRlYm91bmNlVGltZSB8IE9ic2VydmFibGUuZGVib3VuY2VUaW1lfVxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzZWFyY2hBbmRGaWx0ZXIoc2VhcmNoVGV4dD86IHN0cmluZyk6IHZvaWQge1xyXG5cclxuXHRcdC8vIGFsd2F5cyBlbWl0XHJcblx0XHR0aGlzLnNlYXJjaC5lbWl0KHNlYXJjaFRleHQpO1xyXG5cclxuXHRcdC8vIGRvIGludGVybmFsIGZpbHRlcmluZyBpZiBubyBvbmUncyBzdWJzY3JpYmVkIHRvIG91ciBzZWFyY2ggZW1pdHRlclxyXG5cdFx0aWYgKHRoaXMuc2VhcmNoLm9ic2VydmVycy5sZW5ndGggPT09IDAgJiYgc2VhcmNoVGV4dCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHRoaXMucmVzZXRPcHRpb25zKHRoaXMuZmlsdGVyT3B0aW9uc0FycmF5KHNlYXJjaFRleHQpKTtcclxuXHJcblx0XHRcdGlmICh0aGlzLmFkZE5ld1NlbGVjdGVkICYmICF0aGlzLmFkZE5ld0J1dHRvbikge1xyXG5cdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldCB7QGxpbmsgZm9ybU1vZGVsIH0ncyB2YWxpZGF0aW9uIGVycm9ycyBlcXVhbCB0byB0aGUgaW50ZXJuYWwgdGV4dGJveCdzLlxyXG5cdCAqXHJcblx0ICogV2hlbiB0aGUgaW50ZXJuYWwgdGV4dGJveCBpcyBpbnZhbGlkLCBuZWVkIHRvIHNldCB0aGlzIGNvbnRyb2wnc1xyXG5cdCAqIGVycm9ycyBiZWNhdXNlIHdlIGFyZSB1c2luZyBvdXIgb3duIGxhYmVsLCBub3QgVGV4dGJveENvbnRyb2wncy5cclxuXHQgKiBXZSB1c2Ugb3VyIG93biBsYWJlbCBzbyBsYWJlbCB0ZXh0IHdpbGwgd3JhcCBhdCB0aGUgZW5kIG9mIHRoZSBidXR0b24sXHJcblx0ICogbm90IGF0IHRoZSBlbmQgb2YgdGhlIHRleHRib3guXHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHNldEZvcm1Nb2RlbFZhbGlkYXRpb25FcnJvcnMoZGF0YT86IGFueSk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMudGV4dGJveEZvcm1Nb2RlbC5pbnZhbGlkKSB7XHJcblx0XHRcdHRoaXMuZm9ybU1vZGVsLnNldEVycm9ycyh0aGlzLnRleHRib3hGb3JtTW9kZWwuZXJyb3JzKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuZm9ybU1vZGVsLnNldEVycm9ycyhudWxsKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZSB0aGUgZm9ybSBtb2RlbCB2YWx1ZSB3aXRoIHRoZSBzZWxlY3RlZCBpdGVtIG9yIHJlc2V0IGZvcm0gbW9kZWwgdmFsdWUgaWYgaXRlbSBpcyBudWxsXHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHNldEZvcm1Nb2RlbFZhbHVlKGl0ZW06IE1lbnVJdGVtIHwgbnVsbCk6IHZvaWQge1xyXG5cdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbHVlKGl0ZW0gPyAoaXRlbS5zZWxlY3RlZExhYmVsIHx8IGl0ZW0ubGFiZWwpIDogJycpO1xyXG5cdFx0dGhpcy5mb3JtTW9kZWwuc2V0VmFsdWUoaXRlbSk7XHJcblx0XHR0aGlzLmZvcm1Nb2RlbC5tYXJrQXNEaXJ0eSgpO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldCB2YWxpZGF0b3JzIG9uIHRoZSB7QHNlZSB0ZXh0Ym94Rm9ybU1vZGVsIH1cclxuXHQgKlxyXG5cdCAqIFZhbGlkYXRvcnMgYXJlIGN1cnJlbnRseSBzZXQgYmFzZWQgb24gdGhlIHtAc2VlIG1heGxlbmd0aCB9LFxyXG5cdCAqIHtAc2VlIG1pbmxlbmd0aCB9LCBhbmQge0BzZWUgcmVxdWlyZWQgfSBpbnB1dHMuICBUaGlzIHdvcmtzIHdlbGxcclxuXHQgKiB3aXRoIHtAc2VlIFRleHRib3hDb21wb25lbnQgfSwgd2hpY2ggbmVlZHMgdGhlc2UgaW5wdXRzIHRvIGFwcGx5XHJcblx0ICogdGhlIHByb3BlciBhdHRyaWJ1dGVzIHRvIGl0cyBpbnB1dHMuXHJcblx0ICpcclxuXHQgKiBBIGZ1dHVyZSByZWxlYXNlIG9mIEFuZ3VsYXIgd2lsbCBzdXBwb3NlZGx5IGFkZCB0aGVzZSBhdHRyaWJ1dGVzXHJcblx0ICogZm9yIHlvdSwgd2hpY2ggd2lsbCBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIFRleHRib3hDb21wb25lbnQgdG8gaGF2ZVxyXG5cdCAqIHN1Y2ggaW5wdXRzLiAgVGhpcyBjb21wb25lbnQsIGhvd2V2ZXIsIHdpbGwgc3RpbGwgbmVlZCB0aGVzZSBpbnB1dHNcclxuXHQgKiBhcyB0aGVyZSBpcyBubyBjdXJyZW50IHdheSB0byBrbm93IHdoaWNoIHZhbGlkYXRvcnMgYXJlIGFwcGxpZWQgdG8gaXRcclxuXHQgKiBmcm9tIGl0cyBwYXJlbnQgVmlldyBDb21wb25lbnQuXHJcblx0ICpcclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2V0VGV4dGJveEZvcm1Nb2RlbFZhbGlkYXRvcnMoKTogdm9pZCB7XHJcblx0XHRsZXQgdmFsaWRhdG9yczogQXJyYXk8VmFsaWRhdG9yRm4+ID0gW107XHJcblxyXG5cdFx0aWYgKHRoaXMucmVxdWlyZWQpIHtcclxuXHRcdFx0dmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLm1pbmxlbmd0aCkge1xyXG5cdFx0XHR2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodGhpcy5taW5sZW5ndGgpKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5tYXhsZW5ndGgpIHtcclxuXHRcdFx0dmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHRoaXMubWF4bGVuZ3RoKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XHJcblxyXG5cdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBLZWVwIHRleHRib3gncyBkaXNhYmxlZCBzdGF0dXMgaW4tc3luYyB3aXRoIGNvbWJvYm94J3NcclxuXHQgKlxyXG5cdCAqIHtAbGluayBUZXh0Ym94Q29tcG9uZW50fSBnZXRzIGl0cyBkaXNhYmxlZCBzdGF0dXMgZnJvbSBpdHMge0BsaW5rIEZvcm1Db250cm9sfVxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzeW5jaHJvbml6ZURpc2FibGVkQXR0cmlidXRlcygpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmZvcm1Nb2RlbC5kaXNhYmxlZCAhPT0gdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmRpc2FibGVkKSB7XHJcblx0XHRcdGlmICh0aGlzLmZvcm1Nb2RlbC5kaXNhYmxlZCkge1xyXG5cdFx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5kaXNhYmxlKCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmVuYWJsZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhlIGZvcm1Nb2RlbCB2YWx1ZSBhbmQgdGV4dGJveCB2YWx1ZSBkbyBub3QgbWF0Y2gsIHJlc2V0IHRoZSB0ZXh0Ym94IGFuZCBzZWxlY3RlZEl0ZW0gdG9cclxuXHQgKiB0aGUgZm9ybU1vZGxlIHZhbHVlLiBJZiB0aGVyZSBpcyBubyBmb3JtTW9kZWwgdmFsdWUsIG1ha2Ugc3VyZSB3ZSBjbGVhciB0aGUgdGV4dGJveC4gUmVzZXQgdGhlXHJcblx0ICogZmlsdGVyZWRPcHRpb25zIHRvIHRoZSBmdWxsIGxpc3QgYW5kIHVwZGF0ZSB0aGUgc2VsZWN0ZWRJdGVtSW5kZXhcclxuXHQgKlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3luY01vZGVsVmFsdWVzKCk6IHZvaWQge1xyXG5cdFx0Ly8gSWYgdGhlcmUgaXMgYSBmb3JtTW9kZWwgdmFsdWUsIHJlc2V0IHRoZSBzZWxlY3RlZCBpdGVtLiBJZiB0aGVyZSBpc24ndCwgbWFrZVxyXG5cdFx0Ly8gc3VyZSB3ZSBjbGVhciB0aGUgdGV4dGJveFxyXG5cdFx0Y29uc3QgbmV3TGFiZWwgPSB0aGlzLmZvcm1Nb2RlbC52YWx1ZT8uc2VsZWN0ZWRMYWJlbCB8fCB0aGlzLmZvcm1Nb2RlbC52YWx1ZT8ubGFiZWw7XHJcblx0XHRpZiAodGhpcy5mb3JtTW9kZWwudmFsdWUgJiYgKG5ld0xhYmVsICE9PSB0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUpKSB7XHJcblx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWx1ZShuZXdMYWJlbCk7XHJcblx0XHR9IGVsc2UgaWYgKCF0aGlzLmZvcm1Nb2RlbC52YWx1ZSkge1xyXG5cdFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUoJycpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlYXJjaCBhbmQgZmlsdGVyIHRoZSBvcHRpb25zIGxpc3Qgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIHRleHRib3ggaW5wdXQgY2hhbmdlcy4gSWYgYWRkTmV3IGlzXHJcblx0ICogc2V0IGFsc28gY2hlY2sgZm9yIG1hdGNoZXMgaW4gb3VyIGZpbHRlcmVkT3B0aW9ucyB0byBjb25kaXRpb25hbGx5IHNob3cgYW5kIGhpZGUgdGhlIGFkZCBuZXdcclxuXHQgKiBidXR0b25cclxuXHQgKlxyXG5cdCAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL2lucHV0XHJcblx0ICovXHJcblx0cHVibGljIHRleHRib3hWYWx1ZUNoYW5nZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcblx0XHR0aGlzLnNlYXJjaEFuZEZpbHRlcih0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUpO1xyXG5cclxuXHRcdGlmICh0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUgPT09ICcnKSB7XHJcblx0XHRcdHRoaXMuY2xlYXJTZWxlY3RlZEl0ZW0oKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5hZGROZXcpIHtcclxuXHRcdFx0bGV0IG1hdGNoID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMuZmluZCgob3B0aW9uKSA9PiB7XHJcblx0XHRcdFx0cmV0dXJuIG9wdGlvbi5sYWJlbC50b0xvd2VyQ2FzZSgpID09PSB0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHRoaXMuZm91bmRNYXRjaCA9IG1hdGNoID8gdHJ1ZSA6IGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFVwZGF0ZSB0aGUgcG9wdXAgbWVudSBwb3NpdGlvbiB3aGVuIGlucHV0IHZhbHVlIGNoYW5nZXNcclxuXHRcdGlmICh0aGlzLnBvcHVwKSB7XHJcblx0XHRcdHRoaXMucG9wdXAudXBkYXRlKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGNsZWFyU2VsZWN0ZWRJdGVtKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsO1xyXG5cdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IC0xO1xyXG5cdH1cclxuXHJcblx0LyoqUmVjb21wdXRlIHdoYXQgdGhlIHBsYWNlaG9sZGVyIHNob3VsZCBiZSBiYXNlZCBvbiB3aGV0aGVyIHRoZSB1c2VyIHByb3ZpZGVkIG9uZSBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFkZE5ldyBpbnB1dCAqL1xyXG5cdHByaXZhdGUgdXBkYXRlUGxhY2Vob2xkZXJUZXh0KCl7XHJcblx0XHRpZiAodGhpcy5wbGFjZWhvbGRlcikge1xyXG5cdFx0XHR0aGlzLmVmZmVjdGl2ZVBsYWNlaG9sZGVyID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0aGlzLnBsYWNlaG9sZGVyKTtcclxuXHRcdH0gZWxzZSBpZiAodGhpcy5hZGROZXcpIHtcclxuXHRcdFx0dGhpcy5lZmZlY3RpdmVQbGFjZWhvbGRlciA9IHRoaXMuY2hvb3NlT3JBZGRQbGFjZWhvbGRlcjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuZWZmZWN0aXZlUGxhY2Vob2xkZXIgPSB0aGlzLmNob29zZVBsYWNlaG9sZGVyO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqRmluZCB0aGUgb3B0aW9uIHdlIHdhbnQgdG8gYmUgdGhlIGRlZmF1bHQgc2VsZWN0aW9uLiBJZiB0aGVyZSBpcyBhbiBleGFjdCBtYXRjaCwgdXNlIHRoYXRcclxuXHQgKiBvdGhlcndpc2UgaWYgdGhlcmUgYXJlIGl0ZW1zLCByZXR1cm4gemVybyB0byBpbmRpY2F0ZSB0aGUgZmlyc3QgaXRlbS4gT3RoZXJ3aXNlIHJldHVybiAtMVxyXG5cdCAqIHRvIGluZGljYXRlIG5vIHNlbGVjdGlvblxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZmluZERlZmF1bHRTZWxlY3Rpb25JbmRleChvcHRpb25zOiBNZW51SXRlbVtdLCBzZWFyY2hUZXh0OiBzdHJpbmcpOiBudW1iZXIge1xyXG5cdFx0bGV0IGluZGV4ID0gLTE7XHJcblxyXG5cdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLmxlbmd0aCl7XHJcblx0XHRcdGluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgob3B0aW9uPT5vcHRpb24gIT0gbnVsbCk7XHJcblxyXG5cdFx0XHRpZihzZWFyY2hUZXh0KXtcclxuXHRcdFx0XHRzZWFyY2hUZXh0ID0gc2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcclxuXHRcdFx0XHRsZXQgZXhhY3RNYXRjaEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgob3B0aW9uPT5vcHRpb24ubGFiZWwudG9Mb3dlckNhc2UoKSA9PSBzZWFyY2hUZXh0KTtcclxuXHRcdFx0XHRpZihleGFjdE1hdGNoSW5kZXggPj0wKXtcclxuXHRcdFx0XHRcdGluZGV4ID0gZXhhY3RNYXRjaEluZGV4O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGluZGV4O1xyXG5cdH1cclxuXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNvbnRyb2wgY29udHJvbC1sYWJlbC17e2xhYmVsUG9zaXRpb259fVwiXHJcbiAgICAgW25nQ2xhc3NdPVwieydvcGVuJzogbWVudVN0YXR1cyA9PT0gJ3Zpc2libGUnLFxyXG4gICAgICAgICAgICAgICAgICdpbnZhbGlkJzogZm9ybU1vZGVsLnRvdWNoZWQgJiYgZm9ybU1vZGVsLmludmFsaWQsXHJcbiAgICAgICAgICAgICAgICAgJ2hhcy1pY29uJzogKCh0ZW1wbGF0ZVR5cGUgPT09ICdpY29uQW5kTGFiZWwnIHx8IHRlbXBsYXRlVHlwZSA9PT0gJ2ljb25MYWJlbENhcHRpb24nKSAmJiBmb3JtTW9kZWwudmFsdWUgJiYgZm9ybU1vZGVsLnZhbHVlLmljb24gJiYgZm9ybU1vZGVsLnZhbHVlLmxhYmVsID09PSB0ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKSxcclxuICAgICAgICAgICAgICAgICAnaXMtcmVhZG9ubHknOiByZWFkb25seSxcclxuICAgICAgICAgICAgICAgICAnaXMtZGlzYWJsZWQnOiBmb3JtTW9kZWwuZGlzYWJsZWQsXHJcbiAgICAgICAgICAgICAgICAgJ2lzLWFsd2F5cy1vcGVuJzogYWx3YXlzT3Blbn1cIj5cclxuXHJcbiAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIj5cclxuICAgIDxzcGFuPnt7bGFiZWwgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgIDxzcGFuICpuZ0lmPVwidmFsaWRhdGlvbkVycm9ycy5sZW5ndGggPiAwICYmIGZvcm1Nb2RlbC50b3VjaGVkICYmIGZvcm1Nb2RlbC5pbnZhbGlkXCI+Jm5ic3A7e3t2YWxpZGF0aW9uRXJyb3JzfX08L3NwYW4+XHJcbiAgICA8ZWMtaGVscC1wb3BvdmVyIGlkPVwie3tpZH19X2hlbHBQb3BvdmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJoZWxwUG9wb3ZlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2sgbXktbjMgbXgtbjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICB0ZXh0PVwie3toZWxwUG9wb3ZlciB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgY29udGVudFBvc2l0aW9uPVwie3toZWxwUG9wb3ZlclBvc2l0aW9ufX1cIj5cclxuICAgIDwvZWMtaGVscC1wb3BvdmVyPlxyXG4gIDwvbGFiZWw+XHJcblxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJhbHdheXNPcGVuOyBlbHNlIHBvcHVwVGFyZ2V0XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGV4dGJveC1ncm91cCBjb250cm9sLWlucHV0XCJcclxuICAgICAgICAgW25nQ2xhc3NdPVwidGV4dGJveEVsZW1lbnRDbGFzc2VzXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZXh0Ym94XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA+IDAgfHwgdGV4dGJveEZvcm1Nb2RlbC52YWx1ZVwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd25tZW51XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI3BvcHVwVGFyZ2V0PlxyXG4gIDxkaXYgY2xhc3M9XCJ0ZXh0Ym94LWdyb3VwIGNvbnRyb2wtaW5wdXRcIlxyXG4gICAgICAgW25nQ2xhc3NdPVwidGV4dGJveEVsZW1lbnRDbGFzc2VzXCJcclxuICAgICAgICplY1BvcHVwPVwiZHJvcGRvd25tZW51XCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGV4dGJveFwiPjwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICN0ZXh0Ym94PlxyXG4gIDxpIGNsYXNzPVwiZWMtaWNvbiB7e2Zvcm1Nb2RlbC52YWx1ZT8uaWNvbn19XCI+PC9pPlxyXG5cclxuICA8ZWMtdGV4dGJveCBjbGFzcz1cInRleHRib3gtZ3JvdXAtaW5wdXQgbWItMFwiXHJcbiAgICAgICAgICAgICAgI3RleHRib3hcclxuICAgICAgICAgICAgICBbaWRdPVwiaWRcIlxyXG4gICAgICAgICAgICAgIFthdXRvZm9jdXNdPVwiYXV0b2ZvY3VzXCJcclxuICAgICAgICAgICAgICBbZm9ybU1vZGVsXT1cInRleHRib3hGb3JtTW9kZWxcIlxyXG4gICAgICAgICAgICAgIFttYXhsZW5ndGhdPVwibWF4bGVuZ3RoXCJcclxuICAgICAgICAgICAgICBbbWlubGVuZ3RoXT1cIm1pbmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImVmZmVjdGl2ZVBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXHJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwidGV4dGJveFZhbHVlQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJrZXlOYXZpZ2F0ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoZm9jdXNvdXQpPVwib25CbHVyKClcIlxyXG4gICAgICAgICAgICAgIFt1cHBlckNhc2VdPVwidXBwZXJDYXNlXCJcclxuICAgICAgICAgICAgICBbcGVuZGluZ109XCJwZW5kaW5nICYmIGFsd2F5c09wZW5cIlxyXG4gICAgICAgICAgICAgIFthdXRvY29tcGxldGVdPVwiJ29mZidcIj48L2VjLXRleHRib3g+XHJcblxyXG4gIDxlYy1idXR0b24gY2xhc3M9XCJ0ZXh0Ym94LWdyb3VwLWJ0bi1yaWdodFwiXHJcbiAgICAgICAgICAgICAqbmdJZj1cIiFoaWRlVG9nZ2xlQnV0dG9uXCJcclxuICAgICAgICAgICAgIFtpZF09XCJpZCArICdfYnV0dG9uJ1wiXHJcbiAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybU1vZGVsLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgIGljb249XCJpY29uLWNhcmV0LWRvd25cIlxyXG4gICAgICAgICAgICAgW3RhYmluZGV4XT1cIi0xXCJcclxuICAgICAgICAgICAgIHR5cGU9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU1lbnUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAoa2V5ZG93bik9XCJrZXlOYXZpZ2F0ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwibWVudVN0YXR1cyA9PT0gJ3Zpc2libGUnXCI+PC9lYy1idXR0b24+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2Ryb3Bkb3dubWVudT5cclxuICA8ZGl2IGNsYXNzPVwicG9wdXBcIlxyXG4gICAgICAgZWNPdmVybGF5XHJcbiAgICAgICBbc3RhdHVzXT1cInBlbmRpbmcgJiYgIWFsd2F5c09wZW4gPyAncGVuZGluZycgOiAnaGFzRGF0YSdcIj5cclxuXHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYWRkLW5ldyB7e2FkZE5ld09wdGlvbnM/LmNsYXNzTGlzdH19XCJcclxuICAgICAgICAgICAgaWQ9XCJ7e2lkfX1fYWRkTmV3XCJcclxuICAgICAgICAgICAgI2FkZE5ld0J1dHRvblxyXG4gICAgICAgICAgICBbY2xhc3MuaXMtc2VsZWN0ZWRdPVwiYWRkTmV3U2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAqbmdJZj1cImFkZE5ld1wiXHJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZm91bmRNYXRjaCB8fCAoYWRkTmV3ID09PSAnZHluYW1pYycgJiYgKCF0ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlIHx8IChmb3JtTW9kZWwudmFsdWUgJiYgdGV4dGJveEZvcm1Nb2RlbC52YWx1ZSA9PT0gZm9ybU1vZGVsLnZhbHVlLmxhYmVsKSkpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkTmV3KCRldmVudClcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJhZGQtbmV3LWxhYmVsIGVjLXV0aWwtdHJ1bmNhdGVcIj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImFkZE5ldyA9PT0gJ3N0YXRpYycgfHwgYWRkTmV3ID09PSB0cnVlXCJcclxuICAgICAgICAgICAgICB0cmFuc2xhdGU+e3thZGROZXdPcHRpb25zPy5sYWJlbH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiYWRkTmV3ID09PSAnZHluYW1pYydcIj57eydBZGQnIHwgdHJhbnNsYXRlfX0gPHN0cm9uZyBjbGFzcz1cImVjLXV0aWwtdHJ1bmNhdGVcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3RleHQtdXBwZXJjYXNlJzogdXBwZXJDYXNlfVwiPnt7dGV4dGJveEZvcm1Nb2RlbC52YWx1ZX19PC9zdHJvbmc+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxpIGNsYXNzPVwiZWMtaWNvbiB7e2FkZE5ld09wdGlvbnM/Lmljb259fVwiPjwvaT5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDxlYy1tZW51IGlkPVwie3tpZH19X21lbnVcIlxyXG4gICAgICAgICAgICAgW2NsYXNzLmJvcmRlci10b3AtMF09XCIhZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAmJiBoaWRlTm9NYXRjaGVzXCJcclxuICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm1lbnVFbGVtZW50Q2xhc3Nlc1wiXHJcbiAgICAgICAgICAgICBbdGVtcGxhdGVUeXBlXT1cInRlbXBsYXRlVHlwZVwiXHJcbiAgICAgICAgICAgICBbY3VzdG9tTWVudVRlbXBsYXRlXT1cImN1c3RvbU1lbnVUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICBbc2hvd05vSXRlbXNdPVwiIWhpZGVOb01hdGNoZXNcIlxyXG4gICAgICAgICAgICAgW25vRGF0YVRleHRdPVwibm9NYXRjaGVzVGV4dFwiXHJcbiAgICAgICAgICAgICBbaXRlbXNdPVwiZmlsdGVyZWRPcHRpb25zXCJcclxuICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJzZWxlY3RlZEl0ZW1cIlxyXG4gICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlZCk9XCJzZWxlY3RlZENoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICBbcHJlc2VydmVJY29uU3BhY2VdPVwicHJlc2VydmVJY29uU3BhY2VcIlxyXG4gICAgICAgICAgICAgW3RydW5jYXRlSXRlbXNdPVwidHJ1bmNhdGVJdGVtc1wiPjwvZWMtbWVudT5cclxuXHJcbiAgICA8Zm9vdGVyICpuZ0lmPVwidG90YWxSZWNvcmRzICYmIHRvdGFsUmVjb3JkcyA+IGZpbHRlcmVkT3B0aW9ucy5sZW5ndGggJiYgZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA+IDBcIj5cclxuICAgICAgPHNwYW4+e3tmaWx0ZXJlZE9wdGlvbkNvdW50fX0ge3snb2YnIHwgdHJhbnNsYXRlfX0ge3t0b3RhbFJlY29yZHN9fTwvc3Bhbj5cclxuICAgIDwvZm9vdGVyPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
|
|
@@ -54,4 +54,4 @@ export class DateInputSelectionStrategyBase {
|
|
|
54
54
|
}
|
|
55
55
|
;
|
|
56
56
|
}
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1pbnB1dC1zZWxlY3Rpb24tc3RyYXRlZ3ktYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9kYXRlLWlucHV0L2RhdGUtaW5wdXQtc2VsZWN0aW9uLXN0cmF0ZWdpZXMvZGF0ZS1pbnB1dC1zZWxlY3Rpb24tc3RyYXRlZ3ktYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWhEOztHQUVHO0FBQ0gsTUFBTSxPQUFnQiw4QkFBOEI7SUFTbEQsc0VBQXNFO0lBQ3RFLFdBQVcsQ0FBQyxLQUFnQyxFQUFFLFlBQXNCLEVBQUUsSUFBK0I7UUFDbkcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztRQUV6QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ25CLGdKQUFnSjtZQUNoSixxSUFBcUk7WUFDckksaUZBQWlGO1lBQ2pGLElBQUksSUFBSSxFQUFFLHlCQUF5QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEVBQUUsQ0FBQztnQkFDckYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNwQyxDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQWFELHFEQUFxRDtJQUNyRCw4QkFBOEIsQ0FBQyxJQUFVLEVBQUUsaUJBQThDO1FBQ3ZGLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFNRCxxRkFBcUY7SUFDckYsc0JBQXNCLENBQUMsU0FBcUMsRUFBRSxPQUFhLEVBQUUsT0FBYSxFQUFFLFdBQTBCO1FBQ3BILElBQUksSUFBVSxDQUFDO1FBRWYsOEVBQThFO1FBQzlFLElBQUksU0FBUyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDMUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLElBQUksU0FBUyxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hELHdEQUF3RDtRQUN4RCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksR0FBRyxTQUFTLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBRUQsa0RBQWtEO1FBQ2xELElBQUksR0FBRyxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN2QyxJQUFJLEdBQUcsSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFdkMsbUhBQW1IO1FBQ25ILDhIQUE4SDtRQUM5SCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUU1RyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBQUEsQ0FBQztJQUVGOzs7T0FHRztJQUNILHdCQUF3QixDQUFDLFNBQXFDLEVBQUUsT0FBYSxFQUFFLE9BQWEsRUFBRSxXQUEwQjtRQUN0SCxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFBO0lBQzNELENBQUM7SUFBQSxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcclxuaW1wb3J0IHsgQ2FsZW5kYXIgfSBmcm9tIFwiLi4vLi4vY2FsZW5kYXIvY2FsZW5kYXIudHlwZXNcIjtcclxuaW1wb3J0IHsgRGF0ZUlucHV0IH0gZnJvbSBcIi4uL2RhdGUtaW5wdXQudHlwZXNcIjtcclxuXHJcbi8qKlxyXG4gKiBDb250YWlucyB0aGUgbG9naWMgZm9yIHNlbGVjdGluZywgZm9ybWF0dGluZywgYW5kIHBhcnNpbmcgZGF0ZSBkYXRlcyBmb3IgYSBzcGVjaWZpYyBzZWxlY3Rpb24gbW9kZS5cclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEYXRlSW5wdXRTZWxlY3Rpb25TdHJhdGVneUJhc2Uge1xyXG4gIC8qKiBUaGUgY2FsZW5kYXIgdmlldyBtb2RlIHdoZXJlIHNlbGVjdGlvbnMgb2NjdXIgZm9yIHRoaXMgbW9kZS4gVGhpcyBpcyB1c2VkIHRvIHpvb20gdGhlIGNhbGVuZGFyIGludG8gdGhlIHNlbGVjdGlvbiAqL1xyXG4gIGFic3RyYWN0IHJlYWRvbmx5IHNlbGVjdGlvblZpZXdNb2RlOiBDYWxlbmRhci5WaWV3TW9kZTtcclxuICAvKiogVGhlIGxpc3Qgb2YgdmlldyBtb2RlcyB0aGF0IGFyZSBhY2Nlc3NpYmxlIGJ5IHRoaXMgc2VsZWN0aW9uIG1vZGUuIFVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNhbGVuZGFyIHZpZXcgbmVlZHMgdG8gYmUgY2hhbmdlZCBvciBub3Qgb24gc2VsZWN0aW9uIGNoYW5nZS4gKi9cclxuICBhYnN0cmFjdCByZWFkb25seSB2YWxpZFZpZXdNb2RlczogQ2FsZW5kYXIuVmlld01vZGVbXTtcclxuICAvKiogV2hldGhlciB0aGUgc2Vjb25kYXJ5IHRleHRib3ggc2hvdWxkIGJlIHNob3duIGZvciB0aGlzIHNlbGVjdGlvbiBtb2RlICovXHJcbiAgYWJzdHJhY3QgcmVhZG9ubHkgc2hvd1NlY29uZGFyeVRleHRib3g6IGJvb2xlYW47XHJcbiAgLyoqIFdoZXRoZXIgdGhlIHNlY29uZGFyeSBjYWxlbmRhciBzaG91bGQgYmUgc2hvd24gZm9yIHRoaXMgc2VsZWN0aW9uIG1vZGUgKi9cclxuICBhYnN0cmFjdCByZWFkb25seSBzaG93U2Vjb25kYXJ5Q2FsZW5kYXI6IGJvb2xlYW47XHJcbiAgLyoqIFBhcnNlcyB0aGUgc3RyaW5nIGludG8gYSBkYXRlIHVzaW5nIHRoZSBwcm92aWRlZCBwYXJzZSBmb3JtYXRzLiAqL1xyXG4gIHBhcnNlU3RyaW5nKHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJzZUZvcm1hdHM6IHN0cmluZ1tdLCBvcHRzPzogRGF0ZUlucHV0LlBhcnNpbmdPcHRpb25zKTogRGF0ZSB8IG51bGwge1xyXG4gICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IGRhdGUgPSBtb21lbnQodmFsdWUsIHBhcnNlRm9ybWF0cyk7XHJcblxyXG4gICAgaWYgKGRhdGUuaXNWYWxpZCgpKSB7XHJcbiAgICAgIC8vIElmIHdlJ3JlIGluIGEgdGVtcG9yYXJ5IHN0YXRlICh3aGVuIHRoZSB1c2VyIGlzIHR5cGluZyBpbiBhIHRleHRib3gpLCB3ZSBuZWVkIHRvIHNldCB0aGUgeWVhciB0byB0aGUgY3VycmVudCB5ZWFyIGlmIGl0J3MgYmVmb3JlIHRoZSBtaW4geWVhclxyXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSBjYWxlbmRhcnMgZnJvbSBzaG93aW5nIHVuaGVscGZ1bCBkYXRlcyB0aGF0IGFyZSBpbiB0aGUgZGlzdGFudCBwYXN0IGJlZm9yZSB0aGUgdXNlciBmaW5pc2hlcyB0eXBpbmcgaW4gdGhlIGRhdGUuXHJcbiAgICAgIC8vIFdlIGRvbid0IGRvIHRoaXMgbW9kaWZpY2F0aW9uIHdoZW4gdGhlIHJlYWwgc2VsZWN0aW9uIGhhcHBlbnMgb24gdGV4dGJveCBibHVyLlxyXG4gICAgICBpZiAob3B0cz8uc2hpZnRUb0N1cnJlbnRZZWFySWZCZWxvdyAmJiBkYXRlLmlzQmVmb3JlKG9wdHMuc2hpZnRUb0N1cnJlbnRZZWFySWZCZWxvdykpIHtcclxuICAgICAgICBkYXRlLnNldCgneWVhcicsIG1vbWVudCgpLnllYXIoKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBkYXRlLnRvRGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICAvKiogRm9ybWF0cyBhIGRhdGUgaW5wdXQgc2VsZWN0aW9uIGludG8gdmFsdWVzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZGF0ZSBpbnB1dCdzIHRleHRib3hlcy4gKi9cclxuICBhYnN0cmFjdCBmb3JtYXRTZWxlY3Rpb24oc2VsZWN0aW9uPzogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGwpOiBEYXRlSW5wdXQuVGV4dGJveEdyb3VwWyd2YWx1ZSddO1xyXG4gIC8qKiBcclxuICAgKiBQYXJzZXMgdGhlIGRhdGUgaW5wdXQncyB2YWx1ZXMgaW50byBhIGRhdGUgc2VsZWN0aW9uIHRvIGRpc3BsYXkgaW4gdGhlIGNhbGVuZGFycy5cclxuICAgKiBgcGFyc2VGcm9tRW5kYCBjb250cm9scyB3aGV0aGVyIHRoZSBmaXhlZCByYW5nZSBtb2RlcyAobGFzdDdkYXlzLCBsYXN0MjhkYXlzKSB3aWxsIGtleSBvZmYgdGhlIGVuZCBkYXRlIGluc3RlYWQgb2YgdGhlIHN0YXJ0IGRhdGUuXHJcbiAgICogVGhpcyBpcyB1c2VkIHdoZW4gdGhlIHVzZXIgaXMgdHlwaW5nIGluIHRoZSBlbmQgZGF0ZSB0ZXh0Ym94LlxyXG4gICAqL1xyXG4gIGFic3RyYWN0IHBhcnNlVGV4dGJveFZhbHVlcyh2YWx1ZTogRGF0ZUlucHV0LlRleHRib3hHcm91cFsndmFsdWUnXSwgcGFyc2VGb3JtYXRzOiBzdHJpbmdbXSwgb3B0cz86IERhdGVJbnB1dC5QYXJzaW5nT3B0aW9ucyk6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsO1xyXG4gIC8qKiBSZXR1cm5zIGEgc2VsZWN0aW9uIGdpdmVuIGEgZGF0ZSBhbmQgYW4gZXhpc3Rpbmcgc2VsZWN0aW9uIChpbiB0aGUgY2FzZSBvZiBkYXRlIHJhbmdlcykuIENhbGxlZCB3aGVuIGEgZGF0ZSBpcyBjbGlja2VkIGluIHRoZSBjYWxlbmRhcnMuICovXHJcbiAgYWJzdHJhY3QgZ2V0U2VsZWN0aW9uRnJvbURhdGUoZGF0ZTogRGF0ZSwgZXhpc3RpbmdTZWxlY3Rpb24/OiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCk6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsO1xyXG4gIC8qKiBSZXR1cm5zIGEgbmV3IHNlbGVjdGlvbiB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgZ2l2ZW4gcHJldmlvdXMgc2VsZWN0aW9uIGZyb20gYSBkaWZmZXJlbnQgc2VsZWN0aW9uIG1vZGUgKi9cclxuICBhYnN0cmFjdCBnZXROZXdTZWxlY3Rpb25Gcm9tRXhpc3RpbmcocHJldmlvdXNTZWxlY3Rpb24/OiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCk6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsO1xyXG4gIC8qKiBSZXR1cm5zIGEgbmV3IHNlbGVjdGlvbiBmb3IgdGhlIHByb3ZpZGVkIGRhdGUuICovXHJcbiAgZ2V0U2VsZWN0aW9uRm9yUXVpY2tTZWxlY3REYXRlKGRhdGU6IERhdGUsIGV4aXN0aW5nU2VsZWN0aW9uPzogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGwpOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRTZWxlY3Rpb25Gcm9tRGF0ZShkYXRlLCBleGlzdGluZ1NlbGVjdGlvbik7XHJcbiAgfVxyXG4gIC8qKiBSZXR1cm5zIHRoZSBuZXh0IHNlbGVjdGlvbi4gQ2FsbGVkIGJ5IHRoZSBkYXRlIGlucHV0IHN0ZXBwZXJzIHRvIG1vdmUgdGhlIHJhbmdlLiAqL1xyXG4gIGFic3RyYWN0IGdldE5leHRTZWxlY3Rpb24oc2VsZWN0aW9uOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCk6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsO1xyXG4gIC8qKiBSZXR1cm5zIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uIENhbGxlZCBieSB0aGUgZGF0ZSBpbnB1dCBzdGVwcGVycyB0byBtb3ZlIHRoZSByYW5nZS4gKi9cclxuICBhYnN0cmFjdCBnZXRQcmV2aW91c1NlbGVjdGlvbihzZWxlY3Rpb246IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsKTogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGw7XHJcbiAgXHJcbiAgLyoqIFJldHVybnMgdGhlIHZpZXcgZm9yIHRoZSBwcmltYXJ5IGNhbGVuZGFyIGZvciB0aGUgc2VsZWN0aW9uIGFuZCBzZWxlY3Rpb24gbW9kZSAqL1xyXG4gIGdldFByaW1hcnlDYWxlbmRhclZpZXcoc2VsZWN0aW9uOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCwgbWluRGF0ZTogRGF0ZSwgbWF4RGF0ZTogRGF0ZSwgY3VycmVudFZpZXc6IENhbGVuZGFyLlZpZXcpOiBDYWxlbmRhci5WaWV3IHtcclxuICAgIGxldCBkYXRlOiBEYXRlO1xyXG5cclxuICAgIC8vIElmIHdlIGhhdmUgYSByYW5nZSwgdXNlIHRoZSBlbmQgZGF0ZSwgZGVmYXVsdGluZyB0byB0aGUgc3RhcnQgZGF0ZSBvciB0b2RheVxyXG4gICAgaWYgKERhdGVJbnB1dC5pc1NlbGVjdGlvblJhbmdlKHNlbGVjdGlvbikpIHtcclxuICAgICAgZGF0ZSA9IHNlbGVjdGlvbi5lbmQgfHwgc2VsZWN0aW9uLnN0YXJ0IHx8IG5ldyBEYXRlKCk7XHJcbiAgICAvLyBJZiB3ZSBoYXZlIGEgc2luZ2xlIGRhdGUsIHVzZSBpdCwgZGVmYXVsdGluZyB0byB0b2RheVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZGF0ZSA9IHNlbGVjdGlvbiB8fCBuZXcgRGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEVuc3VyZSB0aGUgZGF0ZSBpcyB3aXRoaW4gdGhlIG1pbiBhbmQgbWF4IGRhdGVzXHJcbiAgICBkYXRlID0gZGF0ZSA8IG1pbkRhdGUgPyBtaW5EYXRlIDogZGF0ZTtcclxuICAgIGRhdGUgPSBkYXRlID4gbWF4RGF0ZSA/IG1heERhdGUgOiBkYXRlO1xyXG5cclxuICAgIC8vIElmIHRoZSBjdXJyZW50IGNhbGVuZGFyIHZpZXcgbW9kZSBpcyB2YWxpZCBmb3IgdGhlIHNlbGVjdGlvbiBtb2RlLCB1c2UgaXQsIG90aGVyd2lzZSB1c2UgdGhlIHNlbGVjdGlvbiB2aWV3IG1vZGVcclxuICAgIC8vIFRoaXMgcHJldmVudHMgdGhlIGNhbGVuZGFyIGZyb20gY2hhbmdpbmcgdmlldyBtb2RlcyBhcyB0aGUgdXNlciB0eXBlcy9ibHVycyB0aGUgdGV4dGJveGVzIGFzIGxvbmcgYXMgdGhlIHZpZXcgbW9kZSBpcyB2YWxpZFxyXG4gICAgY29uc3Qgdmlld01vZGUgPSB0aGlzLnZhbGlkVmlld01vZGVzLmluY2x1ZGVzKGN1cnJlbnRWaWV3Lm1vZGUpID8gY3VycmVudFZpZXcubW9kZSA6IHRoaXMuc2VsZWN0aW9uVmlld01vZGU7XHJcblxyXG4gICAgcmV0dXJuIHsgbW9kZTogdmlld01vZGUsIGRhdGUgfTtcclxuICB9O1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHZpZXcgZm9yIHRoZSBzZWNvbmRhcnkgY2FsZW5kYXIgZm9yIHRoZSBzZWxlY3Rpb24gYW5kIHNlbGVjdGlvbiBtb2RlLlxyXG4gICAqIFRoaXMgaXMgaXMgb25seSB1c2VkIGJ5IHRoZSByYW5nZSBzZWxlY3Rpb24gc3RyYXRlZ3kuIEFsbCBvdGhlcnMganVzdCByZXR1cm4gdGhlIGN1cnJlbnQgZGF0ZS5cclxuICAgKi9cclxuICBnZXRTZWNvbmRhcnlDYWxlbmRhclZpZXcoc2VsZWN0aW9uOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCwgbWluRGF0ZTogRGF0ZSwgbWF4RGF0ZTogRGF0ZSwgY3VycmVudFZpZXc6IENhbGVuZGFyLlZpZXcpOiBDYWxlbmRhci5WaWV3IHtcclxuICAgIHJldHVybiB7IG1vZGU6IHRoaXMuc2VsZWN0aW9uVmlld01vZGUsIGRhdGU6IG5ldyBEYXRlKCkgfVxyXG4gIH07XHJcbn1cclxuIl19
|