@valtimo/components 12.10.1 → 12.11.0
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/esm2022/lib/components/carbon-list/carbon-list.component.mjs +7 -4
- package/esm2022/lib/components/carbon-list/tags-modal/tags-modal.component.mjs +4 -2
- package/esm2022/lib/components/case-tags-selector/case-tags-selector.component.mjs +80 -0
- package/esm2022/lib/components/form-io/form-io-currency/currency.component.mjs +14 -11
- package/esm2022/lib/components/form-io/form-io-currency/currency.formio.mjs +2 -2
- package/esm2022/lib/components/form-io/form-io-iban/iban.formio.mjs +2 -2
- package/esm2022/lib/components/search-fields/search-fields.component.mjs +3 -3
- package/esm2022/lib/directives/valtimo-cds-modal/valtimo-cds-modal.directive.mjs +22 -2
- package/esm2022/lib/models/carbon-list.model.mjs +1 -1
- package/esm2022/lib/modules/custom-formio-component/register-custom-component.mjs +9 -5
- package/esm2022/public_api.mjs +2 -1
- package/fesm2022/valtimo-components.mjs +124 -26
- package/fesm2022/valtimo-components.mjs.map +1 -1
- package/lib/components/carbon-list/carbon-list.component.d.ts.map +1 -1
- package/lib/components/carbon-list/tags-modal/tags-modal.component.d.ts.map +1 -1
- package/lib/components/case-tags-selector/case-tags-selector.component.d.ts +20 -0
- package/lib/components/case-tags-selector/case-tags-selector.component.d.ts.map +1 -0
- package/lib/components/form-io/form-io-currency/currency.component.d.ts +1 -0
- package/lib/components/form-io/form-io-currency/currency.component.d.ts.map +1 -1
- package/lib/directives/valtimo-cds-modal/valtimo-cds-modal.directive.d.ts +1 -0
- package/lib/directives/valtimo-cds-modal/valtimo-cds-modal.directive.d.ts.map +1 -1
- package/lib/models/carbon-list.model.d.ts +2 -0
- package/lib/models/carbon-list.model.d.ts.map +1 -1
- package/lib/modules/custom-formio-component/register-custom-component.d.ts.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/public_api.d.ts.map +1 -1
|
@@ -214,11 +214,11 @@ export class SearchFieldsComponent {
|
|
|
214
214
|
}
|
|
215
215
|
}
|
|
216
216
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchFieldsComponent, deps: [{ token: i1.DocumentService }, { token: i2.TranslateService }, { token: i3.IconService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
217
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchFieldsComponent, selector: "valtimo-search-fields", inputs: { loading: "loading", searchFields: "searchFields", documentDefinitionName: "documentDefinitionName", setValuesSubject$: "setValuesSubject$", clearValuesSubject$: "clearValuesSubject$", defaultValues: "defaultValues", inputDisabled: "inputDisabled", externalSearchField: "externalSearchField" }, outputs: { doSearch: "doSearch" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"loading\">\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\n</ng-container>\n<ng-container *ngIf=\"!loading\">\n <cds-accordion>\n <cds-accordion-item\n [title]=\"'searchFields.searchButtonText' | translate\"\n (selected)=\"toggleExpanded()\"\n [expanded]=\"expanded$ | async\"\n >\n <ng-container *ngTemplateOutlet=\"searchFieldsTemplate\"></ng-container>\n </cds-accordion-item>\n </cds-accordion>\n</ng-container>\n\n<ng-template #loadingTemplate>\n <div class=\"loading-container\"><cds-loading></cds-loading></div>\n</ng-template>\n\n<ng-template #searchFieldsTemplate>\n <ng-container *ngIf=\"searchFields$ | async as searchFields\">\n <ng-container\n *ngIf=\"{\n noSearchFields: (!searchFields || searchFields.length === 0) && !externalSearchField,\n } as vars\"\n >\n <div\n *ngIf=\"!vars.noSearchFields\"\n class=\"search-fields-container\"\n [ngClass]=\"{'search-fields-container--hidden': (expanded$ | async) === false}\"\n >\n <ng-content></ng-content>\n\n <ng-container *ngFor=\"let searchField of searchFields\">\n <div class=\"search-field-container\">\n <ng-container\n *ngTemplateOutlet=\"searchFieldTemplate; context: {searchField: searchField}\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n\n <div class=\"meta-container\" *ngIf=\"expanded$ | async\">\n <ng-container\n *ngTemplateOutlet=\"buttonsTemplate; context: {noSearchFields: vars.noSearchFields}\"\n ></ng-container>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #searchFieldTemplate let-searchField=\"searchField\">\n <ng-container\n *ngIf=\"{\n values: values$ | async,\n tooltipKey: 'searchFieldsTooltips.' + searchField.key,\n tooltip: 'searchFieldsTooltips.' + searchField.key | translate,\n searchField,\n title:\n searchField.title ||\n ('searchFields.' + searchField.key !== ('searchFields.' + searchField.key | translate)\n ? ('searchFields.' + searchField.key | translate)\n : searchField.key),\n } as vars\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateText;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateNumber;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDate;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateBoolean;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateTime;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateNumberRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateTextRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateTimeRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateSingleSelectDropdown;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateMultiSelectDropdown;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateText\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-input\n *ngIf=\"searchField.dataType === 'text' && searchField.fieldType === 'single'\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [name]=\"searchField.key\"\n [title]=\"title\"\n [fullWidth]=\"true\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n >\n </v-input>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateNumber\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-input\n *ngIf=\"searchField.dataType === 'number' && searchField.fieldType === 'single'\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [name]=\"searchField.key\"\n [title]=\"title\"\n [fullWidth]=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n >\n </v-input>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDate\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-date-picker\n *ngIf=\"searchField.dataType === 'date' && searchField.fieldType === 'single'\"\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [name]=\"searchField.key\"\n fullWidth=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n ></v-date-picker>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateTextRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'text' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-input\n name=\"start\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n >\n </v-input>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-input\n name=\"end\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n >\n </v-input>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateNumberRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'number' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-input\n name=\"start\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n >\n </v-input>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-input\n name=\"end\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n >\n </v-input>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'date' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-date-picker\n name=\"start\"\n fullWidth=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n ></v-date-picker>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-date-picker\n name=\"end\"\n fullWidth=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n ></v-date-picker>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateBoolean\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'boolean'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"booleanItems$ | async as booleanItems\"\n [items]=\"booleanItems\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"singleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionId]=\"getDefaultBooleanSelectionId(values, searchField.key)\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateTime\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-date-picker\n *ngIf=\"searchField.dataType === 'datetime' && searchField.fieldType === 'single'\"\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [name]=\"searchField.key\"\n fullWidth=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event, true)\"\n [smallLabel]=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n ></v-date-picker>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateTimeRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'datetime' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event, true)\"\n className=\"multiple-search-fields\"\n >\n <v-date-picker\n name=\"start\"\n fullWidth=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n ></v-date-picker>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-date-picker\n name=\"end\"\n fullWidth=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n ></v-date-picker>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateSingleSelectDropdown\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container\n *ngIf=\"\n searchField.dataType === 'text' &&\n (searchField.fieldType === 'single-select-dropdown' ||\n searchField.fieldType === 'single_select_dropdown')\n \"\n >\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"dropdownSelectItemsMap[searchField.key] as searchFieldSelectItems\"\n [items]=\"searchFieldSelectItems\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"singleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionId]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateMultiSelectDropdown\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container\n *ngIf=\"\n searchField.dataType === 'text' &&\n (searchField.fieldType === 'multi-select-dropdown' ||\n searchField.fieldType === 'multi_select_dropdown')\n \"\n >\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"dropdownSelectItemsMap[searchField.key] as searchFieldSelectItems\"\n [items]=\"searchFieldSelectItems\"\n [margin]=\"false\"\n [multiple]=\"true\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"multipleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionIds]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template #toText>\n <div class=\"to-text\">\n <v-paragraph>{{ 'searchFields.to' | translate }}</v-paragraph>\n </div>\n</ng-template>\n\n<ng-template #buttonsTemplate let-noSearchFields=\"noSearchFields\">\n <ng-container\n *ngTemplateOutlet=\"noSearchFieldsTemplate; context: {noSearchFields: noSearchFields}\"\n ></ng-container>\n\n <div class=\"buttons-container\" *ngIf=\"!noSearchFields && {expanded: expanded$ | async} as obs\">\n <div class=\"right-buttons\">\n <button\n *ngIf=\"obs.expanded\"\n cdsButton=\"tertiary\"\n data-testid=\"search-fields-clear-button\"\n (click)=\"clear()\"\n [disabled]=\"loading || noSearchFields || inputDisabled\"\n type=\"button\"\n id=\"clear\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.clearButtonText' | translate }}\n </button>\n\n <button\n *ngIf=\"obs.expanded\"\n cdsButton=\"primary\"\n data-testid=\"search-fields-search-button\"\n (click)=\"search()\"\n [disabled]=\"\n loading || noSearchFields || (hasValidValues$ | async) === false || inputDisabled\n \"\n type=\"button\"\n id=\"search\"\n >\n <svg cdsIcon=\"search\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.searchButtonText' | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #noSearchFieldsTemplate let-noSearchFields=\"noSearchFields\">\n <div class=\"no-search-fields-message\" *ngIf=\"noSearchFields\">\n <v-paragraph dataTestId=\"search-fields-no-fields\" [fullWidth]=\"true\" [center]=\"true\">{{\n 'searchFields.noneConfigured' | translate\n }}</v-paragraph>\n </div>\n</ng-template>\n", styles: ["::ng-deep .multiple-search-fields{display:flex!important;flex-direction:row!important;align-items:center}.to-text{margin-inline-start:8px;margin-inline-end:8px}.buttons-container{width:100%;display:flex;justify-content:flex-end}.right-buttons{display:flex;flex-direction:row;gap:16px}.search-fields-container{padding-bottom:16px;padding-top:16px;display:grid;gap:16px;grid-template-columns:repeat(3,1fr)}.search-fields-container--hidden{display:none}.meta-container{width:100%;padding-bottom:16px}.loading-container{display:flex;width:100%;justify-content:center}.no-search-fields-message{display:flex;width:100%;justify-content:center;margin-top:16px}.search-fields-tile{padding:0}::ng-deep .cds--accordion{background-color:var(--cds-layer)}::ng-deep .cds--accordion__item{border-inline-start:1px solid var(--cds-border-subtle);border-inline-end:1px solid var(--cds-border-subtle)}::ng-deep .cds--accordion__content{padding:0 16px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.InputComponent, selector: "v-input", inputs: ["name", "type", "title", "titleTranslationKey", "defaultValue", "widthPx", "fullWidth", "margin", "smallMargin", "disabled", "step", "min", "maxLength", "tooltip", "required", "hideNumberSpinBox", "smallLabel", "rows", "clear$", "carbonTheme", "placeholder", "dataTestId", "trim"], outputs: ["valueChange"] }, { kind: "component", type: i6.FormComponent, selector: "v-form", inputs: ["className"], outputs: ["valueChange"] }, { kind: "component", type: i7.DatePickerComponent, selector: "v-date-picker", inputs: ["name", "title", "titleTranslationKey", "widthPx", "fullWidth", "margin", "disabled", "tooltip", "required", "defaultDate", "defaultDateIsToday", "smallLabel", "clear$", "enableTime", "carbonTheme"], outputs: ["valueChange"] }, { kind: "component", type: i8.InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }, { kind: "component", type: i9.ParagraphComponent, selector: "v-paragraph", inputs: ["center", "fullWidth", "margin", "italic", "loading", "dataTestId"] }, { kind: "directive", type: i3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: i10.SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "dropUp", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme", "appendInline", "dataTestId"], outputs: ["selectedChange"] }, { kind: "component", type: i3.Accordion, selector: "cds-accordion, ibm-accordion", inputs: ["align", "size", "skeleton"] }, { kind: "component", type: i3.AccordionItem, selector: "cds-accordion-item, ibm-accordion-item", inputs: ["title", "context", "id", "skeleton", "expanded", "disabled"], outputs: ["selected"] }, { kind: "directive", type: i3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i3.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] }); }
|
|
217
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchFieldsComponent, selector: "valtimo-search-fields", inputs: { loading: "loading", searchFields: "searchFields", documentDefinitionName: "documentDefinitionName", setValuesSubject$: "setValuesSubject$", clearValuesSubject$: "clearValuesSubject$", defaultValues: "defaultValues", inputDisabled: "inputDisabled", externalSearchField: "externalSearchField" }, outputs: { doSearch: "doSearch" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"loading\">\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"!loading\">\n <cds-accordion>\n <cds-accordion-item\n [title]=\"'searchFields.searchButtonText' | translate\"\n (selected)=\"toggleExpanded()\"\n [expanded]=\"expanded$ | async\"\n >\n <ng-container *ngTemplateOutlet=\"searchFieldsTemplate\"></ng-container>\n </cds-accordion-item>\n </cds-accordion>\n</ng-container>\n\n<ng-template #loadingTemplate>\n <div class=\"loading-container\"><cds-loading></cds-loading></div>\n</ng-template>\n\n<ng-template #searchFieldsTemplate>\n <ng-container *ngIf=\"searchFields$ | async as searchFields\">\n <ng-container\n *ngIf=\"{\n noSearchFields: (!searchFields || searchFields.length === 0) && !externalSearchField,\n } as vars\"\n >\n <div\n *ngIf=\"!vars.noSearchFields\"\n class=\"search-fields-container\"\n [ngClass]=\"{'search-fields-container--hidden': (expanded$ | async) === false}\"\n [cdsLayer]=\"1\"\n >\n <ng-content></ng-content>\n\n <ng-container *ngFor=\"let searchField of searchFields\">\n <div class=\"search-field-container\">\n <ng-container\n *ngTemplateOutlet=\"searchFieldTemplate; context: {searchField: searchField}\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n\n <div class=\"meta-container\" *ngIf=\"expanded$ | async\">\n <ng-container\n *ngTemplateOutlet=\"buttonsTemplate; context: {noSearchFields: vars.noSearchFields}\"\n ></ng-container>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #searchFieldTemplate let-searchField=\"searchField\">\n <ng-container\n *ngIf=\"{\n values: values$ | async,\n tooltipKey: 'searchFieldsTooltips.' + searchField.key,\n tooltip: 'searchFieldsTooltips.' + searchField.key | translate,\n searchField,\n title:\n searchField.title ||\n ('searchFields.' + searchField.key !== ('searchFields.' + searchField.key | translate)\n ? ('searchFields.' + searchField.key | translate)\n : searchField.key),\n } as vars\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateText;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateNumber;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDate;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateBoolean;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateTime;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateNumberRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateTextRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateTimeRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateSingleSelectDropdown;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateMultiSelectDropdown;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateText\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-input\n *ngIf=\"searchField.dataType === 'text' && searchField.fieldType === 'single'\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [name]=\"searchField.key\"\n [title]=\"title\"\n [fullWidth]=\"true\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateNumber\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-input\n *ngIf=\"searchField.dataType === 'number' && searchField.fieldType === 'single'\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [name]=\"searchField.key\"\n [title]=\"title\"\n [fullWidth]=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDate\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-date-picker\n *ngIf=\"searchField.dataType === 'date' && searchField.fieldType === 'single'\"\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [name]=\"searchField.key\"\n fullWidth=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateTextRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'text' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-input\n name=\"start\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-input\n name=\"end\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateNumberRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'number' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-input\n name=\"start\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-input\n name=\"end\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'date' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-date-picker\n name=\"start\"\n fullWidth=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-date-picker\n name=\"end\"\n fullWidth=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateBoolean\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'boolean'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"booleanItems$ | async as booleanItems\"\n [items]=\"booleanItems\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"singleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionId]=\"getDefaultBooleanSelectionId(values, searchField.key)\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateTime\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-date-picker\n *ngIf=\"searchField.dataType === 'datetime' && searchField.fieldType === 'single'\"\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [name]=\"searchField.key\"\n fullWidth=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event, true)\"\n [smallLabel]=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateTimeRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'datetime' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event, true)\"\n className=\"multiple-search-fields\"\n >\n <v-date-picker\n name=\"start\"\n fullWidth=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-date-picker\n name=\"end\"\n fullWidth=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateSingleSelectDropdown\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container\n *ngIf=\"\n searchField.dataType === 'text' &&\n (searchField.fieldType === 'single-select-dropdown' ||\n searchField.fieldType === 'single_select_dropdown')\n \"\n >\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"dropdownSelectItemsMap[searchField.key] as searchFieldSelectItems\"\n [items]=\"searchFieldSelectItems\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"singleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionId]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateMultiSelectDropdown\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container\n *ngIf=\"\n searchField.dataType === 'text' &&\n (searchField.fieldType === 'multi-select-dropdown' ||\n searchField.fieldType === 'multi_select_dropdown')\n \"\n >\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"dropdownSelectItemsMap[searchField.key] as searchFieldSelectItems\"\n [items]=\"searchFieldSelectItems\"\n [margin]=\"false\"\n [multiple]=\"true\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"multipleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionIds]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template #toText>\n <div class=\"to-text\">\n <v-paragraph>{{ 'searchFields.to' | translate }}</v-paragraph>\n </div>\n</ng-template>\n\n<ng-template #buttonsTemplate let-noSearchFields=\"noSearchFields\">\n <ng-container\n *ngTemplateOutlet=\"noSearchFieldsTemplate; context: {noSearchFields: noSearchFields}\"\n ></ng-container>\n\n <div class=\"buttons-container\" *ngIf=\"!noSearchFields && {expanded: expanded$ | async} as obs\">\n <div class=\"right-buttons\">\n <button\n *ngIf=\"obs.expanded\"\n cdsButton=\"tertiary\"\n data-testid=\"search-fields-clear-button\"\n (click)=\"clear()\"\n [disabled]=\"loading || noSearchFields || inputDisabled\"\n type=\"button\"\n id=\"clear\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.clearButtonText' | translate }}\n </button>\n\n <button\n *ngIf=\"obs.expanded\"\n cdsButton=\"primary\"\n data-testid=\"search-fields-search-button\"\n (click)=\"search()\"\n [disabled]=\"\n loading || noSearchFields || (hasValidValues$ | async) === false || inputDisabled\n \"\n type=\"button\"\n id=\"search\"\n >\n <svg cdsIcon=\"search\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.searchButtonText' | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #noSearchFieldsTemplate let-noSearchFields=\"noSearchFields\">\n <div class=\"no-search-fields-message\" *ngIf=\"noSearchFields\">\n <v-paragraph dataTestId=\"search-fields-no-fields\" [fullWidth]=\"true\" [center]=\"true\">{{\n 'searchFields.noneConfigured' | translate\n }}</v-paragraph>\n </div>\n</ng-template>\n", styles: ["::ng-deep .multiple-search-fields{display:flex!important;flex-direction:row!important;align-items:center}.to-text{margin-inline-start:8px;margin-inline-end:8px}.buttons-container{width:100%;display:flex;justify-content:flex-end}.right-buttons{display:flex;flex-direction:row;gap:16px}.search-fields-container{padding-bottom:16px;padding-top:16px;display:grid;gap:16px;grid-template-columns:repeat(3,1fr)}.search-fields-container--hidden{display:none}.meta-container{width:100%;padding-bottom:16px}.loading-container{display:flex;width:100%;justify-content:center}.no-search-fields-message{display:flex;width:100%;justify-content:center;margin-top:16px}.search-fields-tile{padding:0}::ng-deep .cds--accordion{background-color:var(--cds-layer)}::ng-deep .cds--accordion__item{border-inline-start:1px solid var(--cds-border-subtle);border-inline-end:1px solid var(--cds-border-subtle)}::ng-deep .cds--accordion__content{padding:0 16px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.InputComponent, selector: "v-input", inputs: ["name", "type", "title", "titleTranslationKey", "defaultValue", "widthPx", "fullWidth", "margin", "smallMargin", "disabled", "step", "min", "maxLength", "tooltip", "required", "hideNumberSpinBox", "smallLabel", "rows", "clear$", "carbonTheme", "placeholder", "dataTestId", "trim"], outputs: ["valueChange"] }, { kind: "component", type: i6.FormComponent, selector: "v-form", inputs: ["className"], outputs: ["valueChange"] }, { kind: "component", type: i7.DatePickerComponent, selector: "v-date-picker", inputs: ["name", "title", "titleTranslationKey", "widthPx", "fullWidth", "margin", "disabled", "tooltip", "required", "defaultDate", "defaultDateIsToday", "smallLabel", "clear$", "enableTime", "carbonTheme"], outputs: ["valueChange"] }, { kind: "component", type: i8.InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }, { kind: "component", type: i9.ParagraphComponent, selector: "v-paragraph", inputs: ["center", "fullWidth", "margin", "italic", "loading", "dataTestId"] }, { kind: "directive", type: i3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: i10.SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "dropUp", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme", "appendInline", "dataTestId"], outputs: ["selectedChange"] }, { kind: "component", type: i3.Accordion, selector: "cds-accordion, ibm-accordion", inputs: ["align", "size", "skeleton"] }, { kind: "component", type: i3.AccordionItem, selector: "cds-accordion-item, ibm-accordion-item", inputs: ["title", "context", "id", "skeleton", "expanded", "disabled"], outputs: ["selected"] }, { kind: "directive", type: i3.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "directive", type: i3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i3.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] }); }
|
|
218
218
|
}
|
|
219
219
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchFieldsComponent, decorators: [{
|
|
220
220
|
type: Component,
|
|
221
|
-
args: [{ selector: 'valtimo-search-fields', template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"loading\">\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\n</ng-container>\n<ng-container *ngIf=\"!loading\">\n <cds-accordion>\n <cds-accordion-item\n [title]=\"'searchFields.searchButtonText' | translate\"\n (selected)=\"toggleExpanded()\"\n [expanded]=\"expanded$ | async\"\n >\n <ng-container *ngTemplateOutlet=\"searchFieldsTemplate\"></ng-container>\n </cds-accordion-item>\n </cds-accordion>\n</ng-container>\n\n<ng-template #loadingTemplate>\n <div class=\"loading-container\"><cds-loading></cds-loading></div>\n</ng-template>\n\n<ng-template #searchFieldsTemplate>\n <ng-container *ngIf=\"searchFields$ | async as searchFields\">\n <ng-container\n *ngIf=\"{\n noSearchFields: (!searchFields || searchFields.length === 0) && !externalSearchField,\n } as vars\"\n >\n <div\n *ngIf=\"!vars.noSearchFields\"\n class=\"search-fields-container\"\n [ngClass]=\"{'search-fields-container--hidden': (expanded$ | async) === false}\"\n >\n <ng-content></ng-content>\n\n <ng-container *ngFor=\"let searchField of searchFields\">\n <div class=\"search-field-container\">\n <ng-container\n *ngTemplateOutlet=\"searchFieldTemplate; context: {searchField: searchField}\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n\n <div class=\"meta-container\" *ngIf=\"expanded$ | async\">\n <ng-container\n *ngTemplateOutlet=\"buttonsTemplate; context: {noSearchFields: vars.noSearchFields}\"\n ></ng-container>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #searchFieldTemplate let-searchField=\"searchField\">\n <ng-container\n *ngIf=\"{\n values: values$ | async,\n tooltipKey: 'searchFieldsTooltips.' + searchField.key,\n tooltip: 'searchFieldsTooltips.' + searchField.key | translate,\n searchField,\n title:\n searchField.title ||\n ('searchFields.' + searchField.key !== ('searchFields.' + searchField.key | translate)\n ? ('searchFields.' + searchField.key | translate)\n : searchField.key),\n } as vars\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateText;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateNumber;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDate;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateBoolean;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateTime;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateNumberRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateTextRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateTimeRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateSingleSelectDropdown;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateMultiSelectDropdown;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateText\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-input\n *ngIf=\"searchField.dataType === 'text' && searchField.fieldType === 'single'\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [name]=\"searchField.key\"\n [title]=\"title\"\n [fullWidth]=\"true\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n >\n </v-input>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateNumber\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-input\n *ngIf=\"searchField.dataType === 'number' && searchField.fieldType === 'single'\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [name]=\"searchField.key\"\n [title]=\"title\"\n [fullWidth]=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n >\n </v-input>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDate\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-date-picker\n *ngIf=\"searchField.dataType === 'date' && searchField.fieldType === 'single'\"\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [name]=\"searchField.key\"\n fullWidth=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n ></v-date-picker>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateTextRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'text' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-input\n name=\"start\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n >\n </v-input>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-input\n name=\"end\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n >\n </v-input>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateNumberRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'number' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-input\n name=\"start\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n >\n </v-input>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-input\n name=\"end\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n >\n </v-input>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'date' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-date-picker\n name=\"start\"\n fullWidth=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n ></v-date-picker>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-date-picker\n name=\"end\"\n fullWidth=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n ></v-date-picker>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateBoolean\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'boolean'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"booleanItems$ | async as booleanItems\"\n [items]=\"booleanItems\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"singleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionId]=\"getDefaultBooleanSelectionId(values, searchField.key)\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateTime\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-date-picker\n *ngIf=\"searchField.dataType === 'datetime' && searchField.fieldType === 'single'\"\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [name]=\"searchField.key\"\n fullWidth=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event, true)\"\n [smallLabel]=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n ></v-date-picker>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateTimeRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'datetime' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event, true)\"\n className=\"multiple-search-fields\"\n >\n <v-date-picker\n name=\"start\"\n fullWidth=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n ></v-date-picker>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-date-picker\n name=\"end\"\n fullWidth=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n ></v-date-picker>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateSingleSelectDropdown\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container\n *ngIf=\"\n searchField.dataType === 'text' &&\n (searchField.fieldType === 'single-select-dropdown' ||\n searchField.fieldType === 'single_select_dropdown')\n \"\n >\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"dropdownSelectItemsMap[searchField.key] as searchFieldSelectItems\"\n [items]=\"searchFieldSelectItems\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"singleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionId]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateMultiSelectDropdown\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container\n *ngIf=\"\n searchField.dataType === 'text' &&\n (searchField.fieldType === 'multi-select-dropdown' ||\n searchField.fieldType === 'multi_select_dropdown')\n \"\n >\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"dropdownSelectItemsMap[searchField.key] as searchFieldSelectItems\"\n [items]=\"searchFieldSelectItems\"\n [margin]=\"false\"\n [multiple]=\"true\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"multipleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionIds]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [carbonTheme]=\"carbonTheme\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template #toText>\n <div class=\"to-text\">\n <v-paragraph>{{ 'searchFields.to' | translate }}</v-paragraph>\n </div>\n</ng-template>\n\n<ng-template #buttonsTemplate let-noSearchFields=\"noSearchFields\">\n <ng-container\n *ngTemplateOutlet=\"noSearchFieldsTemplate; context: {noSearchFields: noSearchFields}\"\n ></ng-container>\n\n <div class=\"buttons-container\" *ngIf=\"!noSearchFields && {expanded: expanded$ | async} as obs\">\n <div class=\"right-buttons\">\n <button\n *ngIf=\"obs.expanded\"\n cdsButton=\"tertiary\"\n data-testid=\"search-fields-clear-button\"\n (click)=\"clear()\"\n [disabled]=\"loading || noSearchFields || inputDisabled\"\n type=\"button\"\n id=\"clear\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.clearButtonText' | translate }}\n </button>\n\n <button\n *ngIf=\"obs.expanded\"\n cdsButton=\"primary\"\n data-testid=\"search-fields-search-button\"\n (click)=\"search()\"\n [disabled]=\"\n loading || noSearchFields || (hasValidValues$ | async) === false || inputDisabled\n \"\n type=\"button\"\n id=\"search\"\n >\n <svg cdsIcon=\"search\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.searchButtonText' | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #noSearchFieldsTemplate let-noSearchFields=\"noSearchFields\">\n <div class=\"no-search-fields-message\" *ngIf=\"noSearchFields\">\n <v-paragraph dataTestId=\"search-fields-no-fields\" [fullWidth]=\"true\" [center]=\"true\">{{\n 'searchFields.noneConfigured' | translate\n }}</v-paragraph>\n </div>\n</ng-template>\n", styles: ["::ng-deep .multiple-search-fields{display:flex!important;flex-direction:row!important;align-items:center}.to-text{margin-inline-start:8px;margin-inline-end:8px}.buttons-container{width:100%;display:flex;justify-content:flex-end}.right-buttons{display:flex;flex-direction:row;gap:16px}.search-fields-container{padding-bottom:16px;padding-top:16px;display:grid;gap:16px;grid-template-columns:repeat(3,1fr)}.search-fields-container--hidden{display:none}.meta-container{width:100%;padding-bottom:16px}.loading-container{display:flex;width:100%;justify-content:center}.no-search-fields-message{display:flex;width:100%;justify-content:center;margin-top:16px}.search-fields-tile{padding:0}::ng-deep .cds--accordion{background-color:var(--cds-layer)}::ng-deep .cds--accordion__item{border-inline-start:1px solid var(--cds-border-subtle);border-inline-end:1px solid var(--cds-border-subtle)}::ng-deep .cds--accordion__content{padding:0 16px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
|
|
221
|
+
args: [{ selector: 'valtimo-search-fields', template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"loading\">\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"!loading\">\n <cds-accordion>\n <cds-accordion-item\n [title]=\"'searchFields.searchButtonText' | translate\"\n (selected)=\"toggleExpanded()\"\n [expanded]=\"expanded$ | async\"\n >\n <ng-container *ngTemplateOutlet=\"searchFieldsTemplate\"></ng-container>\n </cds-accordion-item>\n </cds-accordion>\n</ng-container>\n\n<ng-template #loadingTemplate>\n <div class=\"loading-container\"><cds-loading></cds-loading></div>\n</ng-template>\n\n<ng-template #searchFieldsTemplate>\n <ng-container *ngIf=\"searchFields$ | async as searchFields\">\n <ng-container\n *ngIf=\"{\n noSearchFields: (!searchFields || searchFields.length === 0) && !externalSearchField,\n } as vars\"\n >\n <div\n *ngIf=\"!vars.noSearchFields\"\n class=\"search-fields-container\"\n [ngClass]=\"{'search-fields-container--hidden': (expanded$ | async) === false}\"\n [cdsLayer]=\"1\"\n >\n <ng-content></ng-content>\n\n <ng-container *ngFor=\"let searchField of searchFields\">\n <div class=\"search-field-container\">\n <ng-container\n *ngTemplateOutlet=\"searchFieldTemplate; context: {searchField: searchField}\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n\n <div class=\"meta-container\" *ngIf=\"expanded$ | async\">\n <ng-container\n *ngTemplateOutlet=\"buttonsTemplate; context: {noSearchFields: vars.noSearchFields}\"\n ></ng-container>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #searchFieldTemplate let-searchField=\"searchField\">\n <ng-container\n *ngIf=\"{\n values: values$ | async,\n tooltipKey: 'searchFieldsTooltips.' + searchField.key,\n tooltip: 'searchFieldsTooltips.' + searchField.key | translate,\n searchField,\n title:\n searchField.title ||\n ('searchFields.' + searchField.key !== ('searchFields.' + searchField.key | translate)\n ? ('searchFields.' + searchField.key | translate)\n : searchField.key),\n } as vars\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateText;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateNumber;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDate;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateBoolean;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateTime;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateNumberRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateTextRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateDateTimeRange;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateSingleSelectDropdown;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n searchFieldTemplateMultiSelectDropdown;\n context: {\n searchField: searchField,\n tooltipKey: vars.tooltipKey,\n tooltip: vars.tooltip,\n title: vars.title,\n values: vars.values,\n }\n \"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateText\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-input\n *ngIf=\"searchField.dataType === 'text' && searchField.fieldType === 'single'\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [name]=\"searchField.key\"\n [title]=\"title\"\n [fullWidth]=\"true\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateNumber\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-input\n *ngIf=\"searchField.dataType === 'number' && searchField.fieldType === 'single'\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [name]=\"searchField.key\"\n [title]=\"title\"\n [fullWidth]=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDate\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-date-picker\n *ngIf=\"searchField.dataType === 'date' && searchField.fieldType === 'single'\"\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [name]=\"searchField.key\"\n fullWidth=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event)\"\n [smallLabel]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateTextRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'text' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-input\n name=\"start\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-input\n name=\"end\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateNumberRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'number' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-input\n name=\"start\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-input\n name=\"end\"\n [dataTestId]=\"'search-field-' + searchField.key\"\n [fullWidth]=\"true\"\n type=\"number\"\n [hideNumberSpinBox]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultValue]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n >\n </v-input>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'date' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event)\"\n className=\"multiple-search-fields\"\n >\n <v-date-picker\n name=\"start\"\n fullWidth=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-date-picker\n name=\"end\"\n fullWidth=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateBoolean\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'boolean'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"booleanItems$ | async as booleanItems\"\n [items]=\"booleanItems\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"singleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionId]=\"getDefaultBooleanSelectionId(values, searchField.key)\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateTime\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <v-date-picker\n *ngIf=\"searchField.dataType === 'datetime' && searchField.fieldType === 'single'\"\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [name]=\"searchField.key\"\n fullWidth=\"true\"\n (valueChange)=\"singleValueChange(searchField.key, $event, true)\"\n [smallLabel]=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateDateTimeRange\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container *ngIf=\"searchField.dataType === 'datetime' && searchField.fieldType === 'range'\">\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-form\n (valueChange)=\"multipleValueChange(searchField.key, $event, true)\"\n className=\"multiple-search-fields\"\n >\n <v-date-picker\n name=\"start\"\n fullWidth=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.start\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n <ng-container *ngTemplateOutlet=\"toText\"></ng-container>\n <v-date-picker\n name=\"end\"\n fullWidth=\"true\"\n [enableTime]=\"true\"\n [clear$]=\"clear$\"\n (keyup.enter)=\"search()\"\n [defaultDate]=\"values[searchField.key]?.end\"\n [disabled]=\"inputDisabled\"\n ></v-date-picker>\n </v-form>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateSingleSelectDropdown\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container\n *ngIf=\"\n searchField.dataType === 'text' &&\n (searchField.fieldType === 'single-select-dropdown' ||\n searchField.fieldType === 'single_select_dropdown')\n \"\n >\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"dropdownSelectItemsMap[searchField.key] as searchFieldSelectItems\"\n [items]=\"searchFieldSelectItems\"\n [margin]=\"false\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"singleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionId]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template\n #searchFieldTemplateMultiSelectDropdown\n let-searchField=\"searchField\"\n let-tooltip=\"tooltip\"\n let-tooltipKey=\"tooltipKey\"\n let-title=\"title\"\n let-values=\"values\"\n>\n <ng-container\n *ngIf=\"\n searchField.dataType === 'text' &&\n (searchField.fieldType === 'multi-select-dropdown' ||\n searchField.fieldType === 'multi_select_dropdown')\n \"\n >\n <v-input-label\n [title]=\"title\"\n [tooltip]=\"tooltip !== tooltipKey && tooltip\"\n [small]=\"true\"\n ></v-input-label>\n <v-select\n *ngIf=\"dropdownSelectItemsMap[searchField.key] as searchFieldSelectItems\"\n [items]=\"searchFieldSelectItems\"\n [margin]=\"false\"\n [multiple]=\"true\"\n [required]=\"false\"\n [name]=\"searchField.key\"\n [clearSelectionSubject$]=\"clear$\"\n (selectedChange)=\"multipleValueChange(searchField.key, $event)\"\n (keyup.enter)=\"search()\"\n [defaultSelectionIds]=\"values[searchField.key]\"\n [disabled]=\"inputDisabled\"\n [appendInline]=\"false\"\n ></v-select>\n </ng-container>\n</ng-template>\n\n<ng-template #toText>\n <div class=\"to-text\">\n <v-paragraph>{{ 'searchFields.to' | translate }}</v-paragraph>\n </div>\n</ng-template>\n\n<ng-template #buttonsTemplate let-noSearchFields=\"noSearchFields\">\n <ng-container\n *ngTemplateOutlet=\"noSearchFieldsTemplate; context: {noSearchFields: noSearchFields}\"\n ></ng-container>\n\n <div class=\"buttons-container\" *ngIf=\"!noSearchFields && {expanded: expanded$ | async} as obs\">\n <div class=\"right-buttons\">\n <button\n *ngIf=\"obs.expanded\"\n cdsButton=\"tertiary\"\n data-testid=\"search-fields-clear-button\"\n (click)=\"clear()\"\n [disabled]=\"loading || noSearchFields || inputDisabled\"\n type=\"button\"\n id=\"clear\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.clearButtonText' | translate }}\n </button>\n\n <button\n *ngIf=\"obs.expanded\"\n cdsButton=\"primary\"\n data-testid=\"search-fields-search-button\"\n (click)=\"search()\"\n [disabled]=\"\n loading || noSearchFields || (hasValidValues$ | async) === false || inputDisabled\n \"\n type=\"button\"\n id=\"search\"\n >\n <svg cdsIcon=\"search\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFields.searchButtonText' | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #noSearchFieldsTemplate let-noSearchFields=\"noSearchFields\">\n <div class=\"no-search-fields-message\" *ngIf=\"noSearchFields\">\n <v-paragraph dataTestId=\"search-fields-no-fields\" [fullWidth]=\"true\" [center]=\"true\">{{\n 'searchFields.noneConfigured' | translate\n }}</v-paragraph>\n </div>\n</ng-template>\n", styles: ["::ng-deep .multiple-search-fields{display:flex!important;flex-direction:row!important;align-items:center}.to-text{margin-inline-start:8px;margin-inline-end:8px}.buttons-container{width:100%;display:flex;justify-content:flex-end}.right-buttons{display:flex;flex-direction:row;gap:16px}.search-fields-container{padding-bottom:16px;padding-top:16px;display:grid;gap:16px;grid-template-columns:repeat(3,1fr)}.search-fields-container--hidden{display:none}.meta-container{width:100%;padding-bottom:16px}.loading-container{display:flex;width:100%;justify-content:center}.no-search-fields-message{display:flex;width:100%;justify-content:center;margin-top:16px}.search-fields-tile{padding:0}::ng-deep .cds--accordion{background-color:var(--cds-layer)}::ng-deep .cds--accordion__item{border-inline-start:1px solid var(--cds-border-subtle);border-inline-end:1px solid var(--cds-border-subtle)}::ng-deep .cds--accordion__content{padding:0 16px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
|
|
222
222
|
}], ctorParameters: () => [{ type: i1.DocumentService }, { type: i2.TranslateService }, { type: i3.IconService }], propDecorators: { loading: [{
|
|
223
223
|
type: Input
|
|
224
224
|
}], searchFields: [{
|
|
@@ -238,4 +238,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
238
238
|
}], doSearch: [{
|
|
239
239
|
type: Output
|
|
240
240
|
}] } });
|
|
241
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWZpZWxkcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL2NvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3NlYXJjaC1maWVsZHMvc2VhcmNoLWZpZWxkcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL2NvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3NlYXJjaC1maWVsZHMvc2VhcmNoLWZpZWxkcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXhGLE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBYyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUtsRyxPQUFPLEVBQUMsYUFBYSxFQUFFLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7O0FBT3pELE1BQU0sT0FBTyxxQkFBcUI7SUFFaEMsSUFBb0IsWUFBWSxDQUFDLE1BQTBCO1FBQ3pELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxJQUFvQixzQkFBc0IsQ0FBQyxzQkFBOEI7UUFDdkUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsNkJBQTZCLENBQUMsRUFBRTtZQUNwRixJQUFJLDZCQUE2QixLQUFLLHNCQUFzQixFQUFFLENBQUM7Z0JBQzdELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMs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QUN0QyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUMxQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQzsrR0F2UFUscUJBQXFCO21HQUFyQixxQkFBcUIsZ1pDOUJsQyxnMm5CQWdwQkE7OzRGRGxuQmEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLHVCQUF1Qjs2SUFLakIsT0FBTztzQkFBdEIsS0FBSztnQkFDYyxZQUFZO3NCQUEvQixLQUFLO2dCQUdjLHNCQUFzQjtzQkFBekMsS0FBSztnQkFPVSxpQkFBaUI7c0JBQWhDLEtBQUs7Z0JBQ1UsbUJBQW1CO3NCQUFsQyxLQUFLO2dCQUNVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBQ1UsYUFBYTtzQkFBNUIsS0FBSztnQkFDVSxtQkFBbUI7c0JBQWxDLEtBQUs7Z0JBRVcsUUFBUTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U2VhcmNoRmllbGQsIFNlYXJjaEZpZWxkQm9vbGVhbiwgU2VhcmNoRmllbGRWYWx1ZXN9IGZyb20gJ0B2YWx0aW1vL2NvbmZpZyc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgbWFwLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRha2V9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtTZWxlY3RJdGVtfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7RG9jdW1lbnRTZXJ2aWNlfSBmcm9tICdAdmFsdGltby9kb2N1bWVudCc7XG5pbXBvcnQge0ljb25TZXJ2aWNlfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyJztcbmltcG9ydCB7Q2hldnJvbkRvd24xNiwgQ2hldnJvblVwMTZ9IGZyb20gJ0BjYXJib24vaWNvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLXNlYXJjaC1maWVsZHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2VhcmNoLWZpZWxkcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NlYXJjaC1maWVsZHMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgU2VhcmNoRmllbGRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwdWJsaWMgbG9hZGluZyE6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgc2VhcmNoRmllbGRzKGZpZWxkczogQXJyYXk8U2VhcmNoRmllbGQ+KSB7XG4gICAgdGhpcy5zZWFyY2hGaWVsZHMkLm5leHQoZmllbGRzKTtcbiAgfVxuICBASW5wdXQoKSBwdWJsaWMgc2V0IGRvY3VtZW50RGVmaW5pdGlvbk5hbWUoZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoY3VycmVudERvY3VtZW50RGVmaW5pdGlvbk5hbWUgPT4ge1xuICAgICAgaWYgKGN1cnJlbnREb2N1bWVudERlZmluaXRpb25OYW1lICE9PSBkb2N1bWVudERlZmluaXRpb25OYW1lKSB7XG4gICAgICAgIHRoaXMuX2RvY3VtZW50RGVmaW5pdGlvbk5hbWUkLm5leHQoZG9jdW1lbnREZWZpbml0aW9uTmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgQElucHV0KCkgcHVibGljIHNldFZhbHVlc1N1YmplY3QkITogT2JzZXJ2YWJsZTxTZWFyY2hGaWVsZFZhbHVlcz47XG4gIEBJbnB1dCgpIHB1YmxpYyBjbGVhclZhbHVlc1N1YmplY3QkITogT2JzZXJ2YWJsZTxudWxsPjtcbiAgQElucHV0KCkgcHVibGljIGRlZmF1bHRWYWx1ZXMhOiBTZWFyY2hGaWVsZFZhbHVlcztcbiAgQElucHV0KCkgcHVibGljIGlucHV0RGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIGV4dGVybmFsU2VhcmNoRmllbGQgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgcHVibGljIGRvU2VhcmNoOiBFdmVudEVtaXR0ZXI8U2VhcmNoRmllbGRWYWx1ZXM+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPFNlYXJjaEZpZWxkVmFsdWVzPigpO1xuXG4gIHB1YmxpYyByZWFkb25seSBzZWFyY2hGaWVsZHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBcnJheTxTZWFyY2hGaWVsZD4+KFtdKTtcbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlYXJjaEZpZWxkVmFsdWVzPih7fSk7XG4gIHB1YmxpYyByZWFkb25seSBoYXNWYWxpZFZhbHVlcyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnZhbHVlcyQucGlwZShcbiAgICBtYXAodmFsdWVzID0+IHtcbiAgICAgIGNvbnN0IGhhc1ZhbHVlcyA9IChPYmplY3Qua2V5cyh2YWx1ZXMpIHx8IFtdKS5sZW5ndGggPiAwO1xuICAgICAgY29uc3QgcmFuZ2VWYWx1ZXMgPVxuICAgICAgICAoaGFzVmFsdWVzICYmIE9iamVjdC52YWx1ZXModmFsdWVzKT8uZmlsdGVyKHZhbHVlID0+ICh2YWx1ZSBhcyBhbnkpLnN0YXJ0KSkgfHwgW107XG4gICAgICBjb25zdCB2YWxpZFJhbmdlVmFsdWVzID0gcmFuZ2VWYWx1ZXM/LmZpbHRlcihcbiAgICAgICAgdmFsdWUgPT4gKHZhbHVlIGFzIGFueSkuc3RhcnQgPCAodmFsdWUgYXMgYW55KS5lbmRcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiAhIShoYXNWYWx1ZXMgJiYgcmFuZ2VWYWx1ZXMubGVuZ3RoID09PSB2YWxpZFJhbmdlVmFsdWVzLmxlbmd0aCk7XG4gICAgfSlcbiAgKTtcbiAgcHVibGljIHJlYWRvbmx5IGV4cGFuZGVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgY2xlYXIkID0gbmV3IFN1YmplY3Q8bnVsbD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kb2N1bWVudERlZmluaXRpb25OYW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IEJPT0xFQU5fUE9TSVRJVkU6IFNlYXJjaEZpZWxkQm9vbGVhbiA9ICdib29sZWFuUG9zaXRpdmUnO1xuICBwcml2YXRlIHJlYWRvbmx5IEJPT0xFQU5fTkVHQVRJVkU6IFNlYXJjaEZpZWxkQm9vbGVhbiA9ICdib29sZWFuTmVnYXRpdmUnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX0JPT0xFQU5fVFlQRVM6IEFycmF5PFNlYXJjaEZpZWxkQm9vbGVhbj4gPSBbXG4gICAgdGhpcy5CT09MRUFOX1BPU0lUSVZFLFxuICAgIHRoaXMuQk9PTEVBTl9ORUdBVElWRSxcbiAgXTtcbiAgcHVibGljIHJlYWRvbmx5IGJvb2xlYW5JdGVtcyQ6IE9ic2VydmFibGU8QXJyYXk8U2VsZWN0SXRlbT4+ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlXG4gICAgLnN0cmVhbSgna2V5JylcbiAgICAucGlwZShcbiAgICAgIG1hcCgoKSA9PlxuICAgICAgICB0aGlzLl9CT09MRUFOX1RZUEVTLm1hcCh0eXBlID0+ICh7XG4gICAgICAgICAgaWQ6IHR5cGUsXG4gICAgICAgICAgdGV4dDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHNlYXJjaEZpZWxkcy4ke3R5cGV9YCksXG4gICAgICAgIH0pKVxuICAgICAgKVxuICAgICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGRyb3Bkb3duU2VsZWN0SXRlbXNNYXA6IE1hcDxzdHJpbmcsIEFycmF5PFNlbGVjdEl0ZW0+PiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50U2VydmljZTogRG9jdW1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGljb25TZXJ2aWNlOiBJY29uU2VydmljZVxuICApIHtcbiAgICB0aGlzLmljb25TZXJ2aWNlLnJlZ2lzdGVyQWxsKFtDaGV2cm9uRG93bjE2LCBDaGV2cm9uVXAxNl0pO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMub3BlbkRvY3VtZW50RGVmaW5pdGlvbk5hbWVTdWJzY3JpcHRpb24oKTtcbiAgICB0aGlzLm9wZW5WYWx1ZXNTdWJqZWN0U3Vic2NyaXB0aW9uKCk7XG4gICAgdGhpcy5vcGVuQ2xlYXJTdWJzY3JpcHRpb24oKTtcbiAgICB0aGlzLm9wZW5Ecm9wZG93blN1YnNjcmlwdGlvbigpO1xuICAgIHRoaXMuc2V0RGVmYXVsdFZhbHVlcygpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzaW5nbGVWYWx1ZUNoYW5nZShzZWFyY2hGaWVsZEtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBpc0RhdGVUaW1lPzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmFsdWVzJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSh2YWx1ZXMgPT4ge1xuICAgICAgaWYgKHZhbHVlIHx8IE51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgICAgIHRoaXMudmFsdWVzJC5uZXh0KHsuLi52YWx1ZXMsIFtzZWFyY2hGaWVsZEtleV06IHRoaXMuZ2V0U2luZ2xlVmFsdWUodmFsdWUsIGlzRGF0ZVRpbWUpfSk7XG4gICAgICB9IGVsc2UgaWYgKE9iamVjdC5rZXlzKHZhbHVlcykuaW5jbHVkZXMoc2VhcmNoRmllbGRLZXkpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlc0NvcHkgPSB7Li4udmFsdWVzfTtcbiAgICAgICAgZGVsZXRlIHZhbHVlc0NvcHlbc2VhcmNoRmllbGRLZXldO1xuICAgICAgICB0aGlzLnZhbHVlcyQubmV4dCh2YWx1ZXNDb3B5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtdWx0aXBsZVZhbHVlQ2hhbmdlKHNlYXJjaEZpZWxkS2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIGlzRGF0ZVRpbWU/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZXMkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKHZhbHVlcyA9PiB7XG4gICAgICBpZiAodmFsdWUuc3RhcnQgJiYgdmFsdWUuZW5kKSB7XG4gICAgICAgIHRoaXMudmFsdWVzJC5uZXh0KHtcbiAgICAgICAgICAuLi52YWx1ZXMsXG4gICAgICAgICAgW3NlYXJjaEZpZWxkS2V5XToge1xuICAgICAgICAgICAgc3RhcnQ6IHRoaXMuZ2V0U2luZ2xlVmFsdWUodmFsdWUuc3RhcnQsIGlzRGF0ZVRpbWUpLFxuICAgICAgICAgICAgZW5kOiB0aGlzLmdldFNpbmdsZVZhbHVlKHZhbHVlLmVuZCwgaXNEYXRlVGltZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy52YWx1ZXMkLm5leHQoe1xuICAgICAgICAgIC4uLnZhbHVlcyxcbiAgICAgICAgICBbc2VhcmNoRmllbGRLZXldOiB2YWx1ZS5tYXAodiA9PiB0aGlzLmdldFNpbmdsZVZhbHVlKHYsIGlzRGF0ZVRpbWUpKSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlc1tzZWFyY2hGaWVsZEtleV0pIHtcbiAgICAgICAgY29uc3QgdmFsdWVzQ29weSA9IHsuLi52YWx1ZXN9O1xuICAgICAgICBkZWxldGUgdmFsdWVzQ29weVtzZWFyY2hGaWVsZEtleV07XG4gICAgICAgIHRoaXMudmFsdWVzJC5uZXh0KHZhbHVlc0NvcHkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUV4cGFuZGVkKCk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWQkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGV4cGFuZGVkID0+IHtcbiAgICAgIHRoaXMuZXhwYW5kZWQkLm5leHQoIWV4cGFuZGVkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZWFyY2goKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZXMkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKHZhbHVlcyA9PiB7XG4gICAgICB0aGlzLmRvU2VhcmNoLmVtaXQodmFsdWVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyJC5uZXh0KG51bGwpO1xuICAgIHRoaXMuZG9TZWFyY2guZW1pdCh7fSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGVmYXVsdEJvb2xlYW5TZWxlY3Rpb25JZChcbiAgICB2YWx1ZXM6IFNlYXJjaEZpZWxkVmFsdWVzLFxuICAgIHNlYXJjaEZpZWxkS2V5OiBzdHJpbmdcbiAgKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3Qgc2VhcmNoRmllbGRWYWx1ZSA9IHZhbHVlc1tzZWFyY2hGaWVsZEtleV07XG5cbiAgICBpZiAoc2VhcmNoRmllbGRWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuQk9PTEVBTl9QT1NJVElWRTtcbiAgICB9IGVsc2UgaWYgKHNlYXJjaEZpZWxkVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5CT09MRUFOX05FR0FUSVZFO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2luZ2xlVmFsdWUodmFsdWU6IGFueSwgaXNEYXRlVGltZT86IGJvb2xlYW4pOiBhbnkge1xuICAgIGlmIChpc0RhdGVUaW1lKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5CT09MRUFOX1BPU0lUSVZFKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLkJPT0xFQU5fTkVHQVRJVkUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIG9wZW5Eb2N1bWVudERlZmluaXRpb25OYW1lU3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5fZG9jdW1lbnREZWZpbml0aW9uTmFtZSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb2xsYXBzZSgpO1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5WYWx1ZXNTdWJqZWN0U3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNldFZhbHVlc1N1YmplY3QkKSB7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgdGhpcy5zZXRWYWx1ZXNTdWJqZWN0JC5zdWJzY3JpYmUodmFsdWVzID0+IHtcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXModmFsdWVzIHx8IHt9KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcyQubmV4dCh2YWx1ZXMpO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2goKTtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9wZW5DbGVhclN1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbGVhclZhbHVlc1N1YmplY3QkKSB7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgdGhpcy5jbGVhclZhbHVlc1N1YmplY3QkLnN1YnNjcmliZSh2YWx1ZXMgPT4ge1xuICAgICAgICAgIHRoaXMudmFsdWVzJC5uZXh0KHt9KTtcbiAgICAgICAgICB0aGlzLnNlYXJjaCgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9wZW5Ecm9wZG93blN1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuX2RvY3VtZW50RGVmaW5pdGlvbk5hbWUkLCB0aGlzLnNlYXJjaEZpZWxkcyRdKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoKFtkb2N1bWVudERlZmluaXRpb25OYW1lLCBzZWFyY2hGaWVsZHNdKSA9PlxuICAgICAgICAgICAgc2VhcmNoRmllbGRzXG4gICAgICAgICAgICAgID8uZmlsdGVyKHNlYXJjaEZpZWxkID0+IHNlYXJjaEZpZWxkLmRyb3Bkb3duRGF0YVByb3ZpZGVyKVxuICAgICAgICAgICAgICAubWFwKHNlYXJjaEZpZWxkID0+XG4gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudFNlcnZpY2VcbiAgICAgICAgICAgICAgICAgIC5nZXREcm9wZG93bkRhdGEoXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaEZpZWxkLmRyb3Bkb3duRGF0YVByb3ZpZGVyLFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudERlZmluaXRpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hGaWVsZC5rZXlcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoZHJvcGRvd25EYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3Bkb3duRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25TZWxlY3RJdGVtc01hcFtzZWFyY2hGaWVsZC5rZXldID0gT2JqZWN0LmtleXMoZHJvcGRvd25EYXRhKS5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bkZpZWxkS2V5ID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBkcm9wZG93bkZpZWxkS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBkcm9wZG93bkRhdGFbZHJvcGRvd25GaWVsZEtleV0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93blNlbGVjdEl0ZW1zTWFwW3NlYXJjaEZpZWxkLmtleV0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsYXBzZSgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwYW5kKCk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWQkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHNldERlZmF1bHRWYWx1ZXMoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5kZWZhdWx0VmFsdWVzICYmXG4gICAgICB0eXBlb2YgdGhpcy5kZWZhdWx0VmFsdWVzID09PSAnb2JqZWN0JyAmJlxuICAgICAgT2JqZWN0LmtleXModGhpcy5kZWZhdWx0VmFsdWVzKS5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICB0aGlzLnZhbHVlcyQubmV4dCh0aGlzLmRlZmF1bHRWYWx1ZXMpO1xuICAgICAgdGhpcy5zZWFyY2goKTtcbiAgICAgIHRoaXMuZXhwYW5kKCk7XG4gICAgfVxuICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+XG4gIDxjZHMtYWNjb3JkaW9uPlxuICAgIDxjZHMtYWNjb3JkaW9uLWl0ZW1cbiAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzLnNlYXJjaEJ1dHRvblRleHQnIHwgdHJhbnNsYXRlXCJcbiAgICAgIChzZWxlY3RlZCk9XCJ0b2dnbGVFeHBhbmRlZCgpXCJcbiAgICAgIFtleHBhbmRlZF09XCJleHBhbmRlZCQgfCBhc3luY1wiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlYXJjaEZpZWxkc1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9jZHMtYWNjb3JkaW9uLWl0ZW0+XG4gIDwvY2RzLWFjY29yZGlvbj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmdUZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImxvYWRpbmctY29udGFpbmVyXCI+PGNkcy1sb2FkaW5nPjwvY2RzLWxvYWRpbmc+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3NlYXJjaEZpZWxkc1RlbXBsYXRlPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VhcmNoRmllbGRzJCB8IGFzeW5jIGFzIHNlYXJjaEZpZWxkc1wiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ0lmPVwie1xuICAgICAgICBub1NlYXJjaEZpZWxkczogKCFzZWFyY2hGaWVsZHMgfHwgc2VhcmNoRmllbGRzLmxlbmd0aCA9PT0gMCkgJiYgIWV4dGVybmFsU2VhcmNoRmllbGQsXG4gICAgICB9IGFzIHZhcnNcIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCIhdmFycy5ub1NlYXJjaEZpZWxkc1wiXG4gICAgICAgIGNsYXNzPVwic2VhcmNoLWZpZWxkcy1jb250YWluZXJcIlxuICAgICAgICBbbmdDbGFzc109XCJ7J3NlYXJjaC1maWVsZHMtY29udGFpbmVyLS1oaWRkZW4nOiAoZXhwYW5kZWQkIHwgYXN5bmMpID09PSBmYWxzZX1cIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VhcmNoRmllbGQgb2Ygc2VhcmNoRmllbGRzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1maWVsZC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWFyY2hGaWVsZFRlbXBsYXRlOyBjb250ZXh0OiB7c2VhcmNoRmllbGQ6IHNlYXJjaEZpZWxkfVwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtZXRhLWNvbnRhaW5lclwiICpuZ0lmPVwiZXhwYW5kZWQkIHwgYXN5bmNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uc1RlbXBsYXRlOyBjb250ZXh0OiB7bm9TZWFyY2hGaWVsZHM6IHZhcnMubm9TZWFyY2hGaWVsZHN9XCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzZWFyY2hGaWVsZFRlbXBsYXRlIGxldC1zZWFyY2hGaWVsZD1cInNlYXJjaEZpZWxkXCI+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdJZj1cIntcbiAgICAgIHZhbHVlczogdmFsdWVzJCB8IGFzeW5jLFxuICAgICAgdG9vbHRpcEtleTogJ3NlYXJjaEZpZWxkc1Rvb2x0aXBzLicgKyBzZWFyY2hGaWVsZC5rZXksXG4gICAgICB0b29sdGlwOiAnc2VhcmNoRmllbGRzVG9vbHRpcHMuJyArIHNlYXJjaEZpZWxkLmtleSB8IHRyYW5zbGF0ZSxcbiAgICAgIHNlYXJjaEZpZWxkLFxuICAgICAgdGl0bGU6XG4gICAgICAgIHNlYXJjaEZpZWxkLnRpdGxlIHx8XG4gICAgICAgICgnc2VhcmNoRmllbGRzLicgKyBzZWFyY2hGaWVsZC5rZXkgIT09ICgnc2VhcmNoRmllbGRzLicgKyBzZWFyY2hGaWVsZC5rZXkgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgPyAoJ3NlYXJjaEZpZWxkcy4nICsgc2VhcmNoRmllbGQua2V5IHwgdHJhbnNsYXRlKVxuICAgICAgICAgIDogc2VhcmNoRmllbGQua2V5KSxcbiAgICB9IGFzIHZhcnNcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgc2VhcmNoRmllbGRUZW1wbGF0ZVRleHQ7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBzZWFyY2hGaWVsZDogc2VhcmNoRmllbGQsXG4gICAgICAgICAgdG9vbHRpcEtleTogdmFycy50b29sdGlwS2V5LFxuICAgICAgICAgIHRvb2x0aXA6IHZhcnMudG9vbHRpcCxcbiAgICAgICAgICB0aXRsZTogdmFycy50aXRsZSxcbiAgICAgICAgICB2YWx1ZXM6IHZhcnMudmFsdWVzLFxuICAgICAgICB9XG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICBzZWFyY2hGaWVsZFRlbXBsYXRlTnVtYmVyO1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgc2VhcmNoRmllbGQ6IHNlYXJjaEZpZWxkLFxuICAgICAgICAgIHRvb2x0aXBLZXk6IHZhcnMudG9vbHRpcEtleSxcbiAgICAgICAgICB0b29sdGlwOiB2YXJzLnRvb2x0aXAsXG4gICAgICAgICAgdGl0bGU6IHZhcnMudGl0bGUsXG4gICAgICAgICAgdmFsdWVzOiB2YXJzLnZhbHVlcyxcbiAgICAgICAgfVxuICAgICAgXCJcbiAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgc2VhcmNoRmllbGRUZW1wbGF0ZURhdGU7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBzZWFyY2hGaWVsZDogc2VhcmNoRmllbGQsXG4gICAgICAgICAgdG9vbHRpcEtleTogdmFycy50b29sdGlwS2V5LFxuICAgICAgICAgIHRvb2x0aXA6IHZhcnMudG9vbHRpcCxcbiAgICAgICAgICB0aXRsZTogdmFycy50aXRsZSxcbiAgICAgICAgICB2YWx1ZXM6IHZhcnMudmFsdWVzLFxuICAgICAgICB9XG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICBzZWFyY2hGaWVsZFRlbXBsYXRlQm9vbGVhbjtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIHNlYXJjaEZpZWxkOiBzZWFyY2hGaWVsZCxcbiAgICAgICAgICB0b29sdGlwS2V5OiB2YXJzLnRvb2x0aXBLZXksXG4gICAgICAgICAgdG9vbHRpcDogdmFycy50b29sdGlwLFxuICAgICAgICAgIHRpdGxlOiB2YXJzLnRpdGxlLFxuICAgICAgICAgIHZhbHVlczogdmFycy52YWx1ZXMsXG4gICAgICAgIH1cbiAgICAgIFwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIHNlYXJjaEZpZWxkVGVtcGxhdGVEYXRlVGltZTtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIHNlYXJjaEZpZWxkOiBzZWFyY2hGaWVsZCxcbiAgICAgICAgICB0b29sdGlwS2V5OiB2YXJzLnRvb2x0aXBLZXksXG4gICAgICAgICAgdG9vbHRpcDogdmFycy50b29sdGlwLFxuICAgICAgICAgIHRpdGxlOiB2YXJzLnRpdGxlLFxuICAgICAgICAgIHZhbHVlczogdmFycy52YWx1ZXMsXG4gICAgICAgIH1cbiAgICAgIFwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIHNlYXJjaEZpZWxkVGVtcGxhdGVOdW1iZXJSYW5nZTtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIHNlYXJjaEZpZWxkOiBzZWFyY2hGaWVsZCxcbiAgICAgICAgICB0b29sdGlwS2V5OiB2YXJzLnRvb2x0aXBLZXksXG4gICAgICAgICAgdG9vbHRpcDogdmFycy50b29sdGlwLFxuICAgICAgICAgIHRpdGxlOiB2YXJzLnRpdGxlLFxuICAgICAgICAgIHZhbHVlczogdmFycy52YWx1ZXMsXG4gICAgICAgIH1cbiAgICAgIFwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIHNlYXJjaEZpZWxkVGVtcGxhdGVUZXh0UmFuZ2U7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBzZWFyY2hGaWVsZDogc2VhcmNoRmllbGQsXG4gICAgICAgICAgdG9vbHRpcEtleTogdmFycy50b29sdGlwS2V5LFxuICAgICAgICAgIHRvb2x0aXA6IHZhcnMudG9vbHRpcCxcbiAgICAgICAgICB0aXRsZTogdmFycy50aXRsZSxcbiAgICAgICAgICB2YWx1ZXM6IHZhcnMudmFsdWVzLFxuICAgICAgICB9XG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICBzZWFyY2hGaWVsZFRlbXBsYXRlRGF0ZVJhbmdlO1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgc2VhcmNoRmllbGQ6IHNlYXJjaEZpZWxkLFxuICAgICAgICAgIHRvb2x0aXBLZXk6IHZhcnMudG9vbHRpcEtleSxcbiAgICAgICAgICB0b29sdGlwOiB2YXJzLnRvb2x0aXAsXG4gICAgICAgICAgdGl0bGU6IHZhcnMudGl0bGUsXG4gICAgICAgICAgdmFsdWVzOiB2YXJzLnZhbHVlcyxcbiAgICAgICAgfVxuICAgICAgXCJcbiAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgc2VhcmNoRmllbGRUZW1wbGF0ZURhdGVUaW1lUmFuZ2U7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBzZWFyY2hGaWVsZDogc2VhcmNoRmllbGQsXG4gICAgICAgICAgdG9vbHRpcEtleTogdmFycy50b29sdGlwS2V5LFxuICAgICAgICAgIHRvb2x0aXA6IHZhcnMudG9vbHRpcCxcbiAgICAgICAgICB0aXRsZTogdmFycy50aXRsZSxcbiAgICAgICAgICB2YWx1ZXM6IHZhcnMudmFsdWVzLFxuICAgICAgICB9XG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICBzZWFyY2hGaWVsZFRlbXBsYXRlU2luZ2xlU2VsZWN0RHJvcGRvd247XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBzZWFyY2hGaWVsZDogc2VhcmNoRmllbGQsXG4gICAgICAgICAgdG9vbHRpcEtleTogdmFycy50b29sdGlwS2V5LFxuICAgICAgICAgIHRvb2x0aXA6IHZhcnMudG9vbHRpcCxcbiAgICAgICAgICB0aXRsZTogdmFycy50aXRsZSxcbiAgICAgICAgICB2YWx1ZXM6IHZhcnMudmFsdWVzLFxuICAgICAgICB9XG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICBzZWFyY2hGaWVsZFRlbXBsYXRlTXVsdGlTZWxlY3REcm9wZG93bjtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIHNlYXJjaEZpZWxkOiBzZWFyY2hGaWVsZCxcbiAgICAgICAgICB0b29sdGlwS2V5OiB2YXJzLnRvb2x0aXBLZXksXG4gICAgICAgICAgdG9vbHRpcDogdmFycy50b29sdGlwLFxuICAgICAgICAgIHRpdGxlOiB2YXJzLnRpdGxlLFxuICAgICAgICAgIHZhbHVlczogdmFycy52YWx1ZXMsXG4gICAgICAgIH1cbiAgICAgIFwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjc2VhcmNoRmllbGRUZW1wbGF0ZVRleHRcbiAgbGV0LXNlYXJjaEZpZWxkPVwic2VhcmNoRmllbGRcIlxuICBsZXQtdG9vbHRpcD1cInRvb2x0aXBcIlxuICBsZXQtdG9vbHRpcEtleT1cInRvb2x0aXBLZXlcIlxuICBsZXQtdGl0bGU9XCJ0aXRsZVwiXG4gIGxldC12YWx1ZXM9XCJ2YWx1ZXNcIlxuPlxuICA8di1pbnB1dFxuICAgICpuZ0lmPVwic2VhcmNoRmllbGQuZGF0YVR5cGUgPT09ICd0ZXh0JyAmJiBzZWFyY2hGaWVsZC5maWVsZFR5cGUgPT09ICdzaW5nbGUnXCJcbiAgICBbZGF0YVRlc3RJZF09XCInc2VhcmNoLWZpZWxkLScgKyBzZWFyY2hGaWVsZC5rZXlcIlxuICAgIFtuYW1lXT1cInNlYXJjaEZpZWxkLmtleVwiXG4gICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgIFt0b29sdGlwXT1cInRvb2x0aXAgIT09IHRvb2x0aXBLZXkgJiYgdG9vbHRpcFwiXG4gICAgKHZhbHVlQ2hhbmdlKT1cInNpbmdsZVZhbHVlQ2hhbmdlKHNlYXJjaEZpZWxkLmtleSwgJGV2ZW50KVwiXG4gICAgW3NtYWxsTGFiZWxdPVwidHJ1ZVwiXG4gICAgW2NsZWFyJF09XCJjbGVhciRcIlxuICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2goKVwiXG4gICAgW2RlZmF1bHRWYWx1ZV09XCJ2YWx1ZXNbc2VhcmNoRmllbGQua2V5XVwiXG4gICAgW2Rpc2FibGVkXT1cImlucHV0RGlzYWJsZWRcIlxuICAgIFtjYXJib25UaGVtZV09XCJjYXJib25UaGVtZVwiXG4gID5cbiAgPC92LWlucHV0PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNzZWFyY2hGaWVsZFRlbXBsYXRlTnVtYmVyXG4gIGxldC1zZWFyY2hGaWVsZD1cInNlYXJjaEZpZWxkXCJcbiAgbGV0LXRvb2x0aXA9XCJ0b29sdGlwXCJcbiAgbGV0LXRvb2x0aXBLZXk9XCJ0b29sdGlwS2V5XCJcbiAgbGV0LXRpdGxlPVwidGl0bGVcIlxuICBsZXQtdmFsdWVzPVwidmFsdWVzXCJcbj5cbiAgPHYtaW5wdXRcbiAgICAqbmdJZj1cInNlYXJjaEZpZWxkLmRhdGFUeXBlID09PSAnbnVtYmVyJyAmJiBzZWFyY2hGaWVsZC5maWVsZFR5cGUgPT09ICdzaW5nbGUnXCJcbiAgICBbZGF0YVRlc3RJZF09XCInc2VhcmNoLWZpZWxkLScgKyBzZWFyY2hGaWVsZC5rZXlcIlxuICAgIFtuYW1lXT1cInNlYXJjaEZpZWxkLmtleVwiXG4gICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICh2YWx1ZUNoYW5nZSk9XCJzaW5nbGVWYWx1ZUNoYW5nZShzZWFyY2hGaWVsZC5rZXksICRldmVudClcIlxuICAgIHR5cGU9XCJudW1iZXJcIlxuICAgIFtoaWRlTnVtYmVyU3BpbkJveF09XCJ0cnVlXCJcbiAgICBbdG9vbHRpcF09XCJ0b29sdGlwICE9PSB0b29sdGlwS2V5ICYmIHRvb2x0aXBcIlxuICAgIFtzbWFsbExhYmVsXT1cInRydWVcIlxuICAgIFtjbGVhciRdPVwiY2xlYXIkXCJcbiAgICAoa2V5dXAuZW50ZXIpPVwic2VhcmNoKClcIlxuICAgIFtkZWZhdWx0VmFsdWVdPVwidmFsdWVzW3NlYXJjaEZpZWxkLmtleV1cIlxuICAgIFtkaXNhYmxlZF09XCJpbnB1dERpc2FibGVkXCJcbiAgICBbY2FyYm9uVGhlbWVdPVwiY2FyYm9uVGhlbWVcIlxuICA+XG4gIDwvdi1pbnB1dD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjc2VhcmNoRmllbGRUZW1wbGF0ZURhdGVcbiAgbGV0LXNlYXJjaEZpZWxkPVwic2VhcmNoRmllbGRcIlxuICBsZXQtdG9vbHRpcD1cInRvb2x0aXBcIlxuICBsZXQtdG9vbHRpcEtleT1cInRvb2x0aXBLZXlcIlxuICBsZXQtdGl0bGU9XCJ0aXRsZVwiXG4gIGxldC12YWx1ZXM9XCJ2YWx1ZXNcIlxuPlxuICA8di1kYXRlLXBpY2tlclxuICAgICpuZ0lmPVwic2VhcmNoRmllbGQuZGF0YVR5cGUgPT09ICdkYXRlJyAmJiBzZWFyY2hGaWVsZC5maWVsZFR5cGUgPT09ICdzaW5nbGUnXCJcbiAgICBbdGl0bGVdPVwidGl0bGVcIlxuICAgIFt0b29sdGlwXT1cInRvb2x0aXAgIT09IHRvb2x0aXBLZXkgJiYgdG9vbHRpcFwiXG4gICAgW25hbWVdPVwic2VhcmNoRmllbGQua2V5XCJcbiAgICBmdWxsV2lkdGg9XCJ0cnVlXCJcbiAgICAodmFsdWVDaGFuZ2UpPVwic2luZ2xlVmFsdWVDaGFuZ2Uoc2VhcmNoRmllbGQua2V5LCAkZXZlbnQpXCJcbiAgICBbc21hbGxMYWJlbF09XCJ0cnVlXCJcbiAgICBbY2xlYXIkXT1cImNsZWFyJFwiXG4gICAgKGtleXVwLmVudGVyKT1cInNlYXJjaCgpXCJcbiAgICBbZGVmYXVsdERhdGVdPVwidmFsdWVzW3NlYXJjaEZpZWxkLmtleV1cIlxuICAgIFtkaXNhYmxlZF09XCJpbnB1dERpc2FibGVkXCJcbiAgICBbY2FyYm9uVGhlbWVdPVwiY2FyYm9uVGhlbWVcIlxuICA+PC92LWRhdGUtcGlja2VyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNzZWFyY2hGaWVsZFRlbXBsYXRlVGV4dFJhbmdlXG4gIGxldC1zZWFyY2hGaWVsZD1cInNlYXJjaEZpZWxkXCJcbiAgbGV0LXRvb2x0aXA9XCJ0b29sdGlwXCJcbiAgbGV0LXRvb2x0aXBLZXk9XCJ0b29sdGlwS2V5XCJcbiAgbGV0LXRpdGxlPVwidGl0bGVcIlxuICBsZXQtdmFsdWVzPVwidmFsdWVzXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlYXJjaEZpZWxkLmRhdGFUeXBlID09PSAndGV4dCcgJiYgc2VhcmNoRmllbGQuZmllbGRUeXBlID09PSAncmFuZ2UnXCI+XG4gICAgPHYtaW5wdXQtbGFiZWxcbiAgICAgIFt0aXRsZV09XCJ0aXRsZVwiXG4gICAgICBbdG9vbHRpcF09XCJ0b29sdGlwICE9PSB0b29sdGlwS2V5ICYmIHRvb2x0aXBcIlxuICAgICAgW3NtYWxsXT1cInRydWVcIlxuICAgID48L3YtaW5wdXQtbGFiZWw+XG4gICAgPHYtZm9ybVxuICAgICAgKHZhbHVlQ2hhbmdlKT1cIm11bHRpcGxlVmFsdWVDaGFuZ2Uoc2VhcmNoRmllbGQua2V5LCAkZXZlbnQpXCJcbiAgICAgIGNsYXNzTmFtZT1cIm11bHRpcGxlLXNlYXJjaC1maWVsZHNcIlxuICAgID5cbiAgICAgIDx2LWlucHV0XG4gICAgICAgIG5hbWU9XCJzdGFydFwiXG4gICAgICAgIFtkYXRhVGVzdElkXT1cIidzZWFyY2gtZmllbGQtJyArIHNlYXJjaEZpZWxkLmtleVwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIFtjbGVhciRdPVwiY2xlYXIkXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaCgpXCJcbiAgICAgICAgW2RlZmF1bHRWYWx1ZV09XCJ2YWx1ZXNbc2VhcmNoRmllbGQua2V5XT8uc3RhcnRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaW5wdXREaXNhYmxlZFwiXG4gICAgICAgIFtjYXJib25UaGVtZV09XCJjYXJib25UaGVtZVwiXG4gICAgICA+XG4gICAgICA8L3YtaW5wdXQ+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidG9UZXh0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8di1pbnB1dFxuICAgICAgICBuYW1lPVwiZW5kXCJcbiAgICAgICAgW2RhdGFUZXN0SWRdPVwiJ3NlYXJjaC1maWVsZC0nICsgc2VhcmNoRmllbGQua2V5XCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgW2NsZWFyJF09XCJjbGVhciRcIlxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2VhcmNoKClcIlxuICAgICAgICBbZGVmYXVsdFZhbHVlXT1cInZhbHVlc1tzZWFyY2hGaWVsZC5rZXldPy5lbmRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaW5wdXREaXNhYmxlZFwiXG4gICAgICAgIFtjYXJib25UaGVtZV09XCJjYXJib25UaGVtZVwiXG4gICAgICA+XG4gICAgICA8L3YtaW5wdXQ+XG4gICAgPC92LWZvcm0+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNzZWFyY2hGaWVsZFRlbXBsYXRlTnVtYmVyUmFuZ2VcbiAgbGV0LXNlYXJjaEZpZWxkPVwic2VhcmNoRmllbGRcIlxuICBsZXQtdG9vbHRpcD1cInRvb2x0aXBcIlxuICBsZXQtdG9vbHRpcEtleT1cInRvb2x0aXBLZXlcIlxuICBsZXQtdGl0bGU9XCJ0aXRsZVwiXG4gIGxldC12YWx1ZXM9XCJ2YWx1ZXNcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VhcmNoRmllbGQuZGF0YVR5cGUgPT09ICdudW1iZXInICYmIHNlYXJjaEZpZWxkLmZpZWxkVHlwZSA9PT0gJ3JhbmdlJ1wiPlxuICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICBbdGl0bGVdPVwidGl0bGVcIlxuICAgICAgW3Rvb2x0aXBdPVwidG9vbHRpcCAhPT0gdG9vbHRpcEtleSAmJiB0b29sdGlwXCJcbiAgICAgIFtzbWFsbF09XCJ0cnVlXCJcbiAgICA+PC92LWlucHV0LWxhYmVsPlxuICAgIDx2LWZvcm1cbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJtdWx0aXBsZVZhbHVlQ2hhbmdlKHNlYXJjaEZpZWxkLmtleSwgJGV2ZW50KVwiXG4gICAgICBjbGFzc05hbWU9XCJtdWx0aXBsZS1zZWFyY2gtZmllbGRzXCJcbiAgICA+XG4gICAgICA8di1pbnB1dFxuICAgICAgICBuYW1lPVwic3RhcnRcIlxuICAgICAgICBbZGF0YVRlc3RJZF09XCInc2VhcmNoLWZpZWxkLScgKyBzZWFyY2hGaWVsZC5rZXlcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgW2hpZGVOdW1iZXJTcGluQm94XT1cInRydWVcIlxuICAgICAgICBbY2xlYXIkXT1cImNsZWFyJFwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2goKVwiXG4gICAgICAgIFtkZWZhdWx0VmFsdWVdPVwidmFsdWVzW3NlYXJjaEZpZWxkLmtleV0/LnN0YXJ0XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlucHV0RGlzYWJsZWRcIlxuICAgICAgICBbY2FyYm9uVGhlbWVdPVwiY2FyYm9uVGhlbWVcIlxuICAgICAgPlxuICAgICAgPC92LWlucHV0PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRvVGV4dFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPHYtaW5wdXRcbiAgICAgICAgbmFtZT1cImVuZFwiXG4gICAgICAgIFtkYXRhVGVzdElkXT1cIidzZWFyY2gtZmllbGQtJyArIHNlYXJjaEZpZWxkLmtleVwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICBbaGlkZU51bWJlclNwaW5Cb3hdPVwidHJ1ZVwiXG4gICAgICAgIFtjbGVhciRdPVwiY2xlYXIkXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaCgpXCJcbiAgICAgICAgW2RlZmF1bHRWYWx1ZV09XCJ2YWx1ZXNbc2VhcmNoRmllbGQua2V5XT8uZW5kXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlucHV0RGlzYWJsZWRcIlxuICAgICAgICBbY2FyYm9uVGhlbWVdPVwiY2FyYm9uVGhlbWVcIlxuICAgICAgPlxuICAgICAgPC92LWlucHV0PlxuICAgIDwvdi1mb3JtPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjc2VhcmNoRmllbGRUZW1wbGF0ZURhdGVSYW5nZVxuICBsZXQtc2VhcmNoRmllbGQ9XCJzZWFyY2hGaWVsZFwiXG4gIGxldC10b29sdGlwPVwidG9vbHRpcFwiXG4gIGxldC10b29sdGlwS2V5PVwidG9vbHRpcEtleVwiXG4gIGxldC10aXRsZT1cInRpdGxlXCJcbiAgbGV0LXZhbHVlcz1cInZhbHVlc1wiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWFyY2hGaWVsZC5kYXRhVHlwZSA9PT0gJ2RhdGUnICYmIHNlYXJjaEZpZWxkLmZpZWxkVHlwZSA9PT0gJ3JhbmdlJ1wiPlxuICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICBbdGl0bGVdPVwidGl0bGVcIlxuICAgICAgW3Rvb2x0aXBdPVwidG9vbHRpcCAhPT0gdG9vbHRpcEtleSAmJiB0b29sdGlwXCJcbiAgICAgIFtzbWFsbF09XCJ0cnVlXCJcbiAgICA+PC92LWlucHV0LWxhYmVsPlxuICAgIDx2LWZvcm1cbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJtdWx0aXBsZVZhbHVlQ2hhbmdlKHNlYXJjaEZpZWxkLmtleSwgJGV2ZW50KVwiXG4gICAgICBjbGFzc05hbWU9XCJtdWx0aXBsZS1zZWFyY2gtZmllbGRzXCJcbiAgICA+XG4gICAgICA8di1kYXRlLXBpY2tlclxuICAgICAgICBuYW1lPVwic3RhcnRcIlxuICAgICAgICBmdWxsV2lkdGg9XCJ0cnVlXCJcbiAgICAgICAgW2NsZWFyJF09XCJjbGVhciRcIlxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2VhcmNoKClcIlxuICAgICAgICBbZGVmYXVsdERhdGVdPVwidmFsdWVzW3NlYXJjaEZpZWxkLmtleV0/LnN0YXJ0XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlucHV0RGlzYWJsZWRcIlxuICAgICAgICBbY2FyYm9uVGhlbWVdPVwiY2FyYm9uVGhlbWVcIlxuICAgICAgPjwvdi1kYXRlLXBpY2tlcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0b1RleHRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDx2LWRhdGUtcGlja2VyXG4gICAgICAgIG5hbWU9XCJlbmRcIlxuICAgICAgICBmdWxsV2lkdGg9XCJ0cnVlXCJcbiAgICAgICAgW2NsZWFyJF09XCJjbGVhciRcIlxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2VhcmNoKClcIlxuICAgICAgICBbZGVmYXVsdERhdGVdPVwidmFsdWVzW3NlYXJjaEZpZWxkLmtleV0/LmVuZFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpbnB1dERpc2FibGVkXCJcbiAgICAgICAgW2NhcmJvblRoZW1lXT1cImNhcmJvblRoZW1lXCJcbiAgICAgID48L3YtZGF0ZS1waWNrZXI+XG4gICAgPC92LWZvcm0+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNzZWFyY2hGaWVsZFRlbXBsYXRlQm9vbGVhblxuICBsZXQtc2VhcmNoRmllbGQ9XCJzZWFyY2hGaWVsZFwiXG4gIGxldC10b29sdGlwPVwidG9vbHRpcFwiXG4gIGxldC10b29sdGlwS2V5PVwidG9vbHRpcEtleVwiXG4gIGxldC10aXRsZT1cInRpdGxlXCJcbiAgbGV0LXZhbHVlcz1cInZhbHVlc1wiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWFyY2hGaWVsZC5kYXRhVHlwZSA9PT0gJ2Jvb2xlYW4nXCI+XG4gICAgPHYtaW5wdXQtbGFiZWxcbiAgICAgIFt0aXRsZV09XCJ0aXRsZVwiXG4gICAgICBbdG9vbHRpcF09XCJ0b29sdGlwICE9PSB0b29sdGlwS2V5ICYmIHRvb2x0aXBcIlxuICAgICAgW3NtYWxsXT1cInRydWVcIlxuICAgID48L3YtaW5wdXQtbGFiZWw+XG4gICAgPHYtc2VsZWN0XG4gICAgICAqbmdJZj1cImJvb2xlYW5JdGVtcyQgfCBhc3luYyBhcyBib29sZWFuSXRlbXNcIlxuICAgICAgW2l0ZW1zXT1cImJvb2xlYW5JdGVtc1wiXG4gICAgICBbbWFyZ2luXT1cImZhbHNlXCJcbiAgICAgIFtyZXF1aXJlZF09XCJmYWxzZVwiXG4gICAgICBbbmFtZV09XCJzZWFyY2hGaWVsZC5rZXlcIlxuICAgICAgW2NsZWFyU2VsZWN0aW9uU3ViamVjdCRdPVwiY2xlYXIkXCJcbiAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJzaW5nbGVWYWx1ZUNoYW5nZShzZWFyY2hGaWVsZC5rZXksICRldmVudClcIlxuICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaCgpXCJcbiAgICAgIFtkZWZhdWx0U2VsZWN0aW9uSWRdPVwiZ2V0RGVmYXVsdEJvb2xlYW5TZWxlY3Rpb25JZCh2YWx1ZXMsIHNlYXJjaEZpZWxkLmtleSlcIlxuICAgICAgW2Rpc2FibGVkXT1cImlucHV0RGlzYWJsZWRcIlxuICAgICAgW2NhcmJvblRoZW1lXT1cImNhcmJvblRoZW1lXCJcbiAgICAgIFthcHBlbmRJbmxpbmVdPVwiZmFsc2VcIlxuICAgID48L3Ytc2VsZWN0PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjc2VhcmNoRmllbGRUZW1wbGF0ZURhdGVUaW1lXG4gIGxldC1zZWFyY2hGaWVsZD1cInNlYXJjaEZpZWxkXCJcbiAgbGV0LXRvb2x0aXA9XCJ0b29sdGlwXCJcbiAgbGV0LXRvb2x0aXBLZXk9XCJ0b29sdGlwS2V5XCJcbiAgbGV0LXRpdGxlPVwidGl0bGVcIlxuICBsZXQtdmFsdWVzPVwidmFsdWVzXCJcbj5cbiAgPHYtZGF0ZS1waWNrZXJcbiAgICAqbmdJZj1cInNlYXJjaEZpZWxkLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnICYmIHNlYXJjaEZpZWxkLmZpZWxkVHlwZSA9PT0gJ3NpbmdsZSdcIlxuICAgIFt0aXRsZV09XCJ0aXRsZVwiXG4gICAgW3Rvb2x0aXBdPVwidG9vbHRpcCAhPT0gdG9vbHRpcEtleSAmJiB0b29sdGlwXCJcbiAgICBbbmFtZV09XCJzZWFyY2hGaWVsZC5rZXlcIlxuICAgIGZ1bGxXaWR0aD1cInRydWVcIlxuICAgICh2YWx1ZUNoYW5nZSk9XCJzaW5nbGVWYWx1ZUNoYW5nZShzZWFyY2hGaWVsZC5rZXksICRldmVudCwgdHJ1ZSlcIlxuICAgIFtzbWFsbExhYmVsXT1cInRydWVcIlxuICAgIFtlbmFibGVUaW1lXT1cInRydWVcIlxuICAgIFtjbGVhciRdPVwiY2xlYXIkXCJcbiAgICAoa2V5dXAuZW50ZXIpPVwic2VhcmNoKClcIlxuICAgIFtkZWZhdWx0RGF0ZV09XCJ2YWx1ZXNbc2VhcmNoRmllbGQua2V5XVwiXG4gICAgW2Rpc2FibGVkXT1cImlucHV0RGlzYWJsZWRcIlxuICAgIFtjYXJib25UaGVtZV09XCJjYXJib25UaGVtZVwiXG4gID48L3YtZGF0ZS1waWNrZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI3NlYXJjaEZpZWxkVGVtcGxhdGVEYXRlVGltZVJhbmdlXG4gIGxldC1zZWFyY2hGaWVsZD1cInNlYXJjaEZpZWxkXCJcbiAgbGV0LXRvb2x0aXA9XCJ0b29sdGlwXCJcbiAgbGV0LXRvb2x0aXBLZXk9XCJ0b29sdGlwS2V5XCJcbiAgbGV0LXRpdGxlPVwidGl0bGVcIlxuICBsZXQtdmFsdWVzPVwidmFsdWVzXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlYXJjaEZpZWxkLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnICYmIHNlYXJjaEZpZWxkLmZpZWxkVHlwZSA9PT0gJ3JhbmdlJ1wiPlxuICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICBbdGl0bGVdPVwidGl0bGVcIlxuICAgICAgW3Rvb2x0aXBdPVwidG9vbHRpcCAhPT0gdG9vbHRpcEtleSAmJiB0b29sdGlwXCJcbiAgICAgIFtzbWFsbF09XCJ0cnVlXCJcbiAgICA+PC92LWlucHV0LWxhYmVsPlxuICAgIDx2LWZvcm1cbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJtdWx0aXBsZVZhbHVlQ2hhbmdlKHNlYXJjaEZpZWxkLmtleSwgJGV2ZW50LCB0cnVlKVwiXG4gICAgICBjbGFzc05hbWU9XCJtdWx0aXBsZS1zZWFyY2gtZmllbGRzXCJcbiAgICA+XG4gICAgICA8di1kYXRlLXBpY2tlclxuICAgICAgICBuYW1lPVwic3RhcnRcIlxuICAgICAgICBmdWxsV2lkdGg9XCJ0cnVlXCJcbiAgICAgICAgW2VuYWJsZVRpbWVdPVwidHJ1ZVwiXG4gICAgICAgIFtjbGVhciRdPVwiY2xlYXIkXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaCgpXCJcbiAgICAgICAgW2RlZmF1bHREYXRlXT1cInZhbHVlc1tzZWFyY2hGaWVsZC5rZXldPy5zdGFydFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpbnB1dERpc2FibGVkXCJcbiAgICAgICAgW2NhcmJvblRoZW1lXT1cImNhcmJvblRoZW1lXCJcbiAgICAgID48L3YtZGF0ZS1waWNrZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidG9UZXh0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8di1kYXRlLXBpY2tlclxuICAgICAgICBuYW1lPVwiZW5kXCJcbiAgICAgICAgZnVsbFdpZHRoPVwidHJ1ZVwiXG4gICAgICAgIFtlbmFibGVUaW1lXT1cInRydWVcIlxuICAgICAgICBbY2xlYXIkXT1cImNsZWFyJFwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2goKVwiXG4gICAgICAgIFtkZWZhdWx0RGF0ZV09XCJ2YWx1ZXNbc2VhcmNoRmllbGQua2V5XT8uZW5kXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlucHV0RGlzYWJsZWRcIlxuICAgICAgICBbY2FyYm9uVGhlbWVdPVwiY2FyYm9uVGhlbWVcIlxuICAgICAgPjwvdi1kYXRlLXBpY2tlcj5cbiAgICA8L3YtZm9ybT5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI3NlYXJjaEZpZWxkVGVtcGxhdGVTaW5nbGVTZWxlY3REcm9wZG93blxuICBsZXQtc2VhcmNoRmllbGQ9XCJzZWFyY2hGaWVsZFwiXG4gIGxldC10b29sdGlwPVwidG9vbHRpcFwiXG4gIGxldC10b29sdGlwS2V5PVwidG9vbHRpcEtleVwiXG4gIGxldC10aXRsZT1cInRpdGxlXCJcbiAgbGV0LXZhbHVlcz1cInZhbHVlc1wiXG4+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdJZj1cIlxuICAgICAgc2VhcmNoRmllbGQuZGF0YVR5cGUgPT09ICd0ZXh0JyAmJlxuICAgICAgKHNlYXJjaEZpZWxkLmZpZWxkVHlwZSA9PT0gJ3NpbmdsZS1zZWxlY3QtZHJvcGRvd24nIHx8XG4gICAgICAgIHNlYXJjaEZpZWxkLmZpZWxkVHlwZSA9PT0gJ3NpbmdsZV9zZWxlY3RfZHJvcGRvd24nKVxuICAgIFwiXG4gID5cbiAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICAgIFt0b29sdGlwXT1cInRvb2x0aXAgIT09IHRvb2x0aXBLZXkgJiYgdG9vbHRpcFwiXG4gICAgICBbc21hbGxdPVwidHJ1ZVwiXG4gICAgPjwvdi1pbnB1dC1sYWJlbD5cbiAgICA8di1zZWxlY3RcbiAgICAgICpuZ0lmPVwiZHJvcGRvd25TZWxlY3RJdGVtc01hcFtzZWFyY2hGaWVsZC5rZXldIGFzIHNlYXJjaEZpZWxkU2VsZWN0SXRlbXNcIlxuICAgICAgW2l0ZW1zXT1cInNlYXJjaEZpZWxkU2VsZWN0SXRlbXNcIlxuICAgICAgW21hcmdpbl09XCJmYWxzZVwiXG4gICAgICBbcmVxdWlyZWRdPVwiZmFsc2VcIlxuICAgICAgW25hbWVdPVwic2VhcmNoRmllbGQua2V5XCJcbiAgICAgIFtjbGVhclNlbGVjdGlvblN1YmplY3QkXT1cImNsZWFyJFwiXG4gICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwic2luZ2xlVmFsdWVDaGFuZ2Uoc2VhcmNoRmllbGQua2V5LCAkZXZlbnQpXCJcbiAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2goKVwiXG4gICAgICBbZGVmYXVsdFNlbGVjdGlvbklkXT1cInZhbHVlc1tzZWFyY2hGaWVsZC5rZXldXCJcbiAgICAgIFtkaXNhYmxlZF09XCJpbnB1dERpc2FibGVkXCJcbiAgICAgIFtjYXJib25UaGVtZV09XCJjYXJib25UaGVtZVwiXG4gICAgICBbYXBwZW5kSW5saW5lXT1cImZhbHNlXCJcbiAgICA+PC92LXNlbGVjdD5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI3NlYXJjaEZpZWxkVGVtcGxhdGVNdWx0aVNlbGVjdERyb3Bkb3duXG4gIGxldC1zZWFyY2hGaWVsZD1cInNlYXJjaEZpZWxkXCJcbiAgbGV0LXRvb2x0aXA9XCJ0b29sdGlwXCJcbiAgbGV0LXRvb2x0aXBLZXk9XCJ0b29sdGlwS2V5XCJcbiAgbGV0LXRpdGxlPVwidGl0bGVcIlxuICBsZXQtdmFsdWVzPVwidmFsdWVzXCJcbj5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0lmPVwiXG4gICAgICBzZWFyY2hGaWVsZC5kYXRhVHlwZSA9PT0gJ3RleHQnICYmXG4gICAgICAoc2VhcmNoRmllbGQuZmllbGRUeXBlID09PSAnbXVsdGktc2VsZWN0LWRyb3Bkb3duJyB8fFxuICAgICAgICBzZWFyY2hGaWVsZC5maWVsZFR5cGUgPT09ICdtdWx0aV9zZWxlY3RfZHJvcGRvd24nKVxuICAgIFwiXG4gID5cbiAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICAgIFt0b29sdGlwXT1cInRvb2x0aXAgIT09IHRvb2x0aXBLZXkgJiYgdG9vbHRpcFwiXG4gICAgICBbc21hbGxdPVwidHJ1ZVwiXG4gICAgPjwvdi1pbnB1dC1sYWJlbD5cbiAgICA8di1zZWxlY3RcbiAgICAgICpuZ0lmPVwiZHJvcGRvd25TZWxlY3RJdGVtc01hcFtzZWFyY2hGaWVsZC5rZXldIGFzIHNlYXJjaEZpZWxkU2VsZWN0SXRlbXNcIlxuICAgICAgW2l0ZW1zXT1cInNlYXJjaEZpZWxkU2VsZWN0SXRlbXNcIlxuICAgICAgW21hcmdpbl09XCJmYWxzZVwiXG4gICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiXG4gICAgICBbcmVxdWlyZWRdPVwiZmFsc2VcIlxuICAgICAgW25hbWVdPVwic2VhcmNoRmllbGQua2V5XCJcbiAgICAgIFtjbGVhclNlbGVjdGlvblN1YmplY3QkXT1cImNsZWFyJFwiXG4gICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwibXVsdGlwbGVWYWx1ZUNoYW5nZShzZWFyY2hGaWVsZC5rZXksICRldmVudClcIlxuICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaCgpXCJcbiAgICAgIFtkZWZhdWx0U2VsZWN0aW9uSWRzXT1cInZhbHVlc1tzZWFyY2hGaWVsZC5rZXldXCJcbiAgICAgIFtkaXNhYmxlZF09XCJpbnB1dERpc2FibGVkXCJcbiAgICAgIFtjYXJib25UaGVtZV09XCJjYXJib25UaGVtZVwiXG4gICAgICBbYXBwZW5kSW5saW5lXT1cImZhbHNlXCJcbiAgICA+PC92LXNlbGVjdD5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RvVGV4dD5cbiAgPGRpdiBjbGFzcz1cInRvLXRleHRcIj5cbiAgICA8di1wYXJhZ3JhcGg+e3sgJ3NlYXJjaEZpZWxkcy50bycgfCB0cmFuc2xhdGUgfX08L3YtcGFyYWdyYXBoPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYnV0dG9uc1RlbXBsYXRlIGxldC1ub1NlYXJjaEZpZWxkcz1cIm5vU2VhcmNoRmllbGRzXCI+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdUZW1wbGF0ZU91dGxldD1cIm5vU2VhcmNoRmllbGRzVGVtcGxhdGU7IGNvbnRleHQ6IHtub1NlYXJjaEZpZWxkczogbm9TZWFyY2hGaWVsZHN9XCJcbiAgPjwvbmctY29udGFpbmVyPlxuXG4gIDxkaXYgY2xhc3M9XCJidXR0b25zLWNvbnRhaW5lclwiICpuZ0lmPVwiIW5vU2VhcmNoRmllbGRzICYmIHtleHBhbmRlZDogZXhwYW5kZWQkIHwgYXN5bmN9IGFzIG9ic1wiPlxuICAgIDxkaXYgY2xhc3M9XCJyaWdodC1idXR0b25zXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwib2JzLmV4cGFuZGVkXCJcbiAgICAgICAgY2RzQnV0dG9uPVwidGVydGlhcnlcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cInNlYXJjaC1maWVsZHMtY2xlYXItYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cImNsZWFyKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibG9hZGluZyB8fCBub1NlYXJjaEZpZWxkcyB8fCBpbnB1dERpc2FibGVkXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGlkPVwiY2xlYXJcIlxuICAgICAgPlxuICAgICAgICA8c3ZnIGNkc0ljb249XCJ0cmFzaC1jYW5cIiBzaXplPVwiMTZcIiBjbGFzcz1cImNkcy0tYnRuX19pY29uXCI+PC9zdmc+XG5cbiAgICAgICAge3sgJ3NlYXJjaEZpZWxkcy5jbGVhckJ1dHRvblRleHQnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIm9icy5leHBhbmRlZFwiXG4gICAgICAgIGNkc0J1dHRvbj1cInByaW1hcnlcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cInNlYXJjaC1maWVsZHMtc2VhcmNoLWJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJzZWFyY2goKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICBsb2FkaW5nIHx8IG5vU2VhcmNoRmllbGRzIHx8IChoYXNWYWxpZFZhbHVlcyQgfCBhc3luYykgPT09IGZhbHNlIHx8IGlucHV0RGlzYWJsZWRcbiAgICAgICAgXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGlkPVwic2VhcmNoXCJcbiAgICAgID5cbiAgICAgICAgPHN2ZyBjZHNJY29uPVwic2VhcmNoXCIgc2l6ZT1cIjE2XCIgY2xhc3M9XCJjZHMtLWJ0bl9faWNvblwiPjwvc3ZnPlxuXG4gICAgICAgIHt7ICdzZWFyY2hGaWVsZHMuc2VhcmNoQnV0dG9uVGV4dCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbm9TZWFyY2hGaWVsZHNUZW1wbGF0ZSBsZXQtbm9TZWFyY2hGaWVsZHM9XCJub1NlYXJjaEZpZWxkc1wiPlxuICA8ZGl2IGNsYXNzPVwibm8tc2VhcmNoLWZpZWxkcy1tZXNzYWdlXCIgKm5nSWY9XCJub1NlYXJjaEZpZWxkc1wiPlxuICAgIDx2LXBhcmFncmFwaCBkYXRhVGVzdElkPVwic2VhcmNoLWZpZWxkcy1uby1maWVsZHNcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBbY2VudGVyXT1cInRydWVcIj57e1xuICAgICAgJ3NlYXJjaEZpZWxkcy5ub25lQ29uZmlndXJlZCcgfCB0cmFuc2xhdGVcbiAgICB9fTwvdi1wYXJhZ3JhcGg+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
241
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWZpZWxkcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL2NvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3NlYXJjaC1maWVsZHMvc2VhcmNoLWZpZWxkcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL2NvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3NlYXJjaC1maWVsZHMvc2VhcmNoLWZpZWxkcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXhGLE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBYyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUtsRyxPQUFPLEVBQUMsYUFBYSxFQUFFLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7O0FBT3pELE1BQU0sT0FBTyxxQkFBcUI7SUFFaEMsSUFBb0IsWUFBWSxDQUFDLE1BQTBCO1FBQ3pELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxJQUFvQixzQkFBc0IsQ0FBQyxzQkFBOEI7UUFDdkUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsNkJBQTZCLENBQUMsRUFBRTtZQUNwRixJQUFJLDZCQUE2QixLQUFLLHNCQUFzQixFQUFFLENBQUM7Z0JBQzdELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMs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QUN0QyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUMxQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQzsrR0F2UFUscUJBQXFCO21HQUFyQixxQkFBcUIsZ1pDOUJsQyx5MG1CQW1vQkE7OzRGRHJtQmEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLHVCQUF1Qjs2SUFLakIsT0FBTztzQkFBdEIsS0FBSztnQkFDYyxZQUFZO3NCQUEvQixLQUFLO2dCQUdjLHNCQUFzQjtzQkFBekMsS0FBSztnQkFPVSxpQkFBaUI7c0JBQWhDLEtBQUs7Z0JBQ1UsbUJBQW1CO3NCQUFsQyxLQUFLO2dCQUNVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBQ1UsYUFBYTtzQkFBNUIsS0FBSztnQkFDVSxtQkFBbUI7c0JBQWxDLEtBQUs7Z0JBRVcsUUFBUTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U2VhcmNoRmllbGQsIFNlYXJjaEZpZWxkQm9vbGVhbiwgU2VhcmNoRmllbGRWYWx1ZXN9IGZyb20gJ0B2YWx0aW1vL2NvbmZpZyc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgbWFwLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRha2V9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtTZWxlY3RJdGVtfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7RG9jdW1lbnRTZXJ2aWNlfSBmcm9tICdAdmFsdGltby9kb2N1bWVudCc7XG5pbXBvcnQge0ljb25TZXJ2aWNlfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyJztcbmltcG9ydCB7Q2hldnJvbkRvd24xNiwgQ2hldnJvblVwMTZ9IGZyb20gJ0BjYXJib24vaWNvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLXNlYXJjaC1maWVsZHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2VhcmNoLWZpZWxkcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NlYXJjaC1maWVsZHMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgU2VhcmNoRmllbGRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwdWJsaWMgbG9hZGluZyE6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgc2VhcmNoRmllbGRzKGZpZWxkczogQXJyYXk8U2VhcmNoRmllbGQ+KSB7XG4gICAgdGhpcy5zZWFyY2hGaWVsZHMkLm5leHQoZmllbGRzKTtcbiAgfVxuICBASW5wdXQoKSBwdWJsaWMgc2V0IGRvY3VtZW50RGVmaW5pdGlvbk5hbWUoZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoY3VycmVudERvY3VtZW50RGVmaW5pdGlvbk5hbWUgPT4ge1xuICAgICAgaWYgKGN1cnJlbnREb2N1bWVudERlZmluaXRpb25OYW1lICE9PSBkb2N1bWVudERlZmluaXRpb25OYW1lKSB7XG4gICAgICAgIHRoaXMuX2RvY3VtZW50RGVmaW5pdGlvbk5hbWUkLm5leHQoZG9jdW1lbnREZWZpbml0aW9uTmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgQElucHV0KCkgcHVibGljIHNldFZhbHVlc1N1YmplY3QkITogT2JzZXJ2YWJsZTxTZWFyY2hGaWVsZFZhbHVlcz47XG4gIEBJbnB1dCgpIHB1YmxpYyBjbGVhclZhbHVlc1N1YmplY3QkITogT2JzZXJ2YWJsZTxudWxsPjtcbiAgQElucHV0KCkgcHVibGljIGRlZmF1bHRWYWx1ZXMhOiBTZWFyY2hGaWVsZFZhbHVlcztcbiAgQElucHV0KCkgcHVibGljIGlucHV0RGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIGV4dGVybmFsU2VhcmNoRmllbGQgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgcHVibGljIGRvU2VhcmNoOiBFdmVudEVtaXR0ZXI8U2VhcmNoRmllbGRWYWx1ZXM+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPFNlYXJjaEZpZWxkVmFsdWVzPigpO1xuXG4gIHB1YmxpYyByZWFkb25seSBzZWFyY2hGaWVsZHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBcnJheTxTZWFyY2hGaWVsZD4+KFtdKTtcbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlYXJjaEZpZWxkVmFsdWVzPih7fSk7XG4gIHB1YmxpYyByZWFkb25seSBoYXNWYWxpZFZhbHVlcyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnZhbHVlcyQucGlwZShcbiAgICBtYXAodmFsdWVzID0+IHtcbiAgICAgIGNvbnN0IGhhc1ZhbHVlcyA9IChPYmplY3Qua2V5cyh2YWx1ZXMpIHx8IFtdKS5sZW5ndGggPiAwO1xuICAgICAgY29uc3QgcmFuZ2VWYWx1ZXMgPVxuICAgICAgICAoaGFzVmFsdWVzICYmIE9iamVjdC52YWx1ZXModmFsdWVzKT8uZmlsdGVyKHZhbHVlID0+ICh2YWx1ZSBhcyBhbnkpLnN0YXJ0KSkgfHwgW107XG4gICAgICBjb25zdCB2YWxpZFJhbmdlVmFsdWVzID0gcmFuZ2VWYWx1ZXM/LmZpbHRlcihcbiAgICAgICAgdmFsdWUgPT4gKHZhbHVlIGFzIGFueSkuc3RhcnQgPCAodmFsdWUgYXMgYW55KS5lbmRcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiAhIShoYXNWYWx1ZXMgJiYgcmFuZ2VWYWx1ZXMubGVuZ3RoID09PSB2YWxpZFJhbmdlVmFsdWVzLmxlbmd0aCk7XG4gICAgfSlcbiAgKTtcbiAgcHVibGljIHJlYWRvbmx5IGV4cGFuZGVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgY2xlYXIkID0gbmV3IFN1YmplY3Q8bnVsbD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kb2N1bWVudERlZmluaXRpb25OYW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IEJPT0xFQU5fUE9TSVRJVkU6IFNlYXJjaEZpZWxkQm9vbGVhbiA9ICdib29sZWFuUG9zaXRpdmUnO1xuICBwcml2YXRlIHJlYWRvbmx5IEJPT0xFQU5fTkVHQVRJVkU6IFNlYXJjaEZpZWxkQm9vbGVhbiA9ICdib29sZWFuTmVnYXRpdmUnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX0JPT0xFQU5fVFlQRVM6IEFycmF5PFNlYXJjaEZpZWxkQm9vbGVhbj4gPSBbXG4gICAgdGhpcy5CT09MRUFOX1BPU0lUSVZFLFxuICAgIHRoaXMuQk9PTEVBTl9ORUdBVElWRSxcbiAgXTtcbiAgcHVibGljIHJlYWRvbmx5IGJvb2xlYW5JdGVtcyQ6IE9ic2VydmFibGU8QXJyYXk8U2VsZWN0SXRlbT4+ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlXG4gICAgLnN0cmVhbSgna2V5JylcbiAgICAucGlwZShcbiAgICAgIG1hcCgoKSA9PlxuICAgICAgICB0aGlzLl9CT09MRUFOX1RZUEVTLm1hcCh0eXBlID0+ICh7XG4gICAgICAgICAgaWQ6IHR5cGUsXG4gICAgICAgICAgdGV4dDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHNlYXJjaEZpZWxkcy4ke3R5cGV9YCksXG4gICAgICAgIH0pKVxuICAgICAgKVxuICAgICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGRyb3Bkb3duU2VsZWN0SXRlbXNNYXA6IE1hcDxzdHJpbmcsIEFycmF5PFNlbGVjdEl0ZW0+PiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50U2VydmljZTogRG9jdW1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGljb25TZXJ2aWNlOiBJY29uU2VydmljZVxuICApIHtcbiAgICB0aGlzLmljb25TZXJ2aWNlLnJlZ2lzdGVyQWxsKFtDaGV2cm9uRG93bjE2LCBDaGV2cm9uVXAxNl0pO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMub3BlbkRvY3VtZW50RGVmaW5pdGlvbk5hbWVTdWJzY3JpcHRpb24oKTtcbiAgICB0aGlzLm9wZW5WYWx1ZXNTdWJqZWN0U3Vic2NyaXB0aW9uKCk7XG4gICAgdGhpcy5vcGVuQ2xlYXJTdWJzY3JpcHRpb24oKTtcbiAgICB0aGlzLm9wZW5Ecm9wZG93blN1YnNjcmlwdGlvbigpO1xuICAgIHRoaXMuc2V0RGVmYXVsdFZhbHVlcygpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzaW5nbGVWYWx1ZUNoYW5nZShzZWFyY2hGaWVsZEtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBpc0RhdGVUaW1lPzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmFsdWVzJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSh2YWx1ZXMgPT4ge1xuICAgICAgaWYgKHZhbHVlIHx8IE51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgICAgIHRoaXMudmFsdWVzJC5uZXh0KHsuLi52YWx1ZXMsIFtzZWFyY2hGaWVsZEtleV06IHRoaXMuZ2V0U2luZ2xlVmFsdWUodmFsdWUsIGlzRGF0ZVRpbWUpfSk7XG4gICAgICB9IGVsc2UgaWYgKE9iamVjdC5rZXlzKHZhbHVlcykuaW5jbHVkZXMoc2VhcmNoRmllbGRLZXkpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlc0NvcHkgPSB7Li4udmFsdWVzfTtcbiAgICAgICAgZGVsZXRlIHZhbHVlc0NvcHlbc2VhcmNoRmllbGRLZXldO1xuICAgICAgICB0aGlzLnZhbHVlcyQubmV4dCh2YWx1ZXNDb3B5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtdWx0aXBsZVZhbHVlQ2hhbmdlKHNlYXJjaEZpZWxkS2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIGlzRGF0ZVRpbWU/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZXMkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKHZhbHVlcyA9PiB7XG4gICAgICBpZiAodmFsdWUuc3RhcnQgJiYgdmFsdWUuZW5kKSB7XG4gICAgICAgIHRoaXMudmFsdWVzJC5uZXh0KHtcbiAgICAgICAgICAuLi52YWx1ZXMsXG4gICAgICAgICAgW3NlYXJjaEZpZWxkS2V5XToge1xuICAgICAgICAgICAgc3RhcnQ6IHRoaXMuZ2V0U2luZ2xlVmFsdWUodmFsdWUuc3RhcnQsIGlzRGF0ZVRpbWUpLFxuICAgICAgICAgICAgZW5kOiB0aGlzLmdldFNpbmdsZVZhbHVlKHZhbHVlLmVuZCwgaXNEYXRlVGltZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy52YWx1ZXMkLm5leHQoe1xuICAgICAgICAgIC4uLnZhbHVlcyxcbiAgICAgICAgICBbc2VhcmNoRmllbGRLZXldOiB2YWx1ZS5tYXAodiA9PiB0aGlzLmdldFNpbmdsZVZhbHVlKHYsIGlzRGF0ZVRpbWUpKSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlc1tzZWFyY2hGaWVsZEtleV0pIHtcbiAgICAgICAgY29uc3QgdmFsdWVzQ29weSA9IHsuLi52YWx1ZXN9O1xuICAgICAgICBkZWxldGUgdmFsdWVzQ29weVtzZWFyY2hGaWVsZEtleV07XG4gICAgICAgIHRoaXMudmFsdWVzJC5uZXh0KHZhbHVlc0NvcHkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUV4cGFuZGVkKCk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWQkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGV4cGFuZGVkID0+IHtcbiAgICAgIHRoaXMuZXhwYW5kZWQkLm5leHQoIWV4cGFuZGVkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZWFyY2goKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZXMkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKHZhbHVlcyA9PiB7XG4gICAgICB0aGlzLmRvU2VhcmNoLmVtaXQodmFsdWVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyJC5uZXh0KG51bGwpO1xuICAgIHRoaXMuZG9TZWFyY2guZW1pdCh7fSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGVmYXVsdEJvb2xlYW5TZWxlY3Rpb25JZChcbiAgICB2YWx1ZXM6IFNlYXJjaEZpZWxkVmFsdWVzLFxuICAgIHNlYXJjaEZpZWxkS2V5OiBzdHJpbmdcbiAgKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3Qgc2VhcmNoRmllbGRWYWx1ZSA9IHZhbHVlc1tzZWFyY2hGaWVsZEtleV07XG5cbiAgICBpZiAoc2VhcmNoRmllbGRWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuQk9PTEVBTl9QT1NJVElWRTtcbiAgICB9IGVsc2UgaWYgKHNlYXJjaEZpZWxkVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5CT09MRUFOX05FR0FUSVZFO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2luZ2xlVmFsdWUodmFsdWU6IGFueSwgaXNEYXRlVGltZT86IGJvb2xlYW4pOiBhbnkge1xuICAgIGlmIChpc0RhdGVUaW1lKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5CT09MRUFOX1BPU0lUSVZFKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLkJPT0xFQU5fTkVHQVRJVkUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIG9wZW5Eb2N1bWVudERlZmluaXRpb25OYW1lU3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5fZG9jdW1lbnREZWZpbml0aW9uTmFtZSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb2xsYXBzZSgpO1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5WYWx1ZXNTdWJqZWN0U3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNldFZhbHVlc1N1YmplY3QkKSB7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgdGhpcy5zZXRWYWx1ZXNTdWJqZWN0JC5zdWJzY3JpYmUodmFsdWVzID0+IHtcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXModmFsdWVzIHx8IHt9KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcyQubmV4dCh2YWx1ZXMpO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2goKTtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9wZW5DbGVhclN1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbGVhclZhbHVlc1N1YmplY3QkKSB7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgdGhpcy5jbGVhclZhbHVlc1N1YmplY3QkLnN1YnNjcmliZSh2YWx1ZXMgPT4ge1xuICAgICAgICAgIHRoaXMudmFsdWVzJC5uZXh0KHt9KTtcbiAgICAgICAgICB0aGlzLnNlYXJjaCgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9wZW5Ecm9wZG93blN1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuX2RvY3VtZW50RGVmaW5pdGlvbk5hbWUkLCB0aGlzLnNlYXJjaEZpZWxkcyRdKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoKFtkb2N1bWVudERlZmluaXRpb25OYW1lLCBzZWFyY2hGaWVsZHNdKSA9PlxuICAgICAgICAgICAgc2VhcmNoRmllbGRzXG4gICAgICAgICAgICAgID8uZmlsdGVyKHNlYXJjaEZpZWxkID0+IHNlYXJjaEZpZWxkLmRyb3Bkb3duRGF0YVByb3ZpZGVyKVxuICAgICAgICAgICAgICAubWFwKHNlYXJjaEZpZWxkID0+XG4gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudFNlcnZpY2VcbiAgICAgICAgICAgICAgICAgIC5nZXREcm9wZG93bkRhdGEoXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaEZpZWxkLmRyb3Bkb3duRGF0YVByb3ZpZGVyLFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudERlZmluaXRpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hGaWVsZC5rZXlcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoZHJvcGRvd25EYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3Bkb3duRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25TZWxlY3RJdGVtc01hcFtzZWFyY2hGaWVsZC5rZXldID0gT2JqZWN0LmtleXMoZHJvcGRvd25EYXRhKS5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bkZpZWxkS2V5ID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBkcm9wZG93bkZpZWxkS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBkcm9wZG93bkRhdGFbZHJvcGRvd25GaWVsZEtleV0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93blNlbGVjdEl0ZW1zTWFwW3NlYXJjaEZpZWxkLmtleV0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsYXBzZSgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwYW5kKCk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWQkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHNldERlZmF1bHRWYWx1ZXMoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5kZWZhdWx0VmFsdWVzICYmXG4gICAgICB0eXBlb2YgdGhpcy5kZWZhdWx0VmFsdWVzID09PSAnb2JqZWN0JyAmJlxuICAgICAgT2JqZWN0LmtleXModGhpcy5kZWZhdWx0VmFsdWVzKS5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICB0aGlzLnZhbHVlcyQubmV4dCh0aGlzLmRlZmF1bHRWYWx1ZXMpO1xuICAgICAgdGhpcy5zZWFyY2goKTtcbiAgICAgIHRoaXMuZXhwYW5kKCk7XG4gICAgfVxuICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj5cbiAgPGNkcy1hY2NvcmRpb24+XG4gICAgPGNkcy1hY2NvcmRpb24taXRlbVxuICAgICAgW3RpdGxlXT1cIidzZWFyY2hGaWVsZHMuc2VhcmNoQnV0dG9uVGV4dCcgfCB0cmFuc2xhdGVcIlxuICAgICAgKHNlbGVjdGVkKT1cInRvZ2dsZUV4cGFuZGVkKClcIlxuICAgICAgW2V4cGFuZGVkXT1cImV4cGFuZGVkJCB8IGFzeW5jXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VhcmNoRmllbGRzVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Nkcy1hY2NvcmRpb24taXRlbT5cbiAgPC9jZHMtYWNjb3JkaW9uPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZ1RlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwibG9hZGluZy1jb250YWluZXJcIj48Y2RzLWxvYWRpbmc+PC9jZHMtbG9hZGluZz48L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2VhcmNoRmllbGRzVGVtcGxhdGU+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWFyY2hGaWVsZHMkIHwgYXN5bmMgYXMgc2VhcmNoRmllbGRzXCI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nSWY9XCJ7XG4gICAgICAgIG5vU2VhcmNoRmllbGRzOiAoIXNlYXJjaEZpZWxkcyB8fCBzZWFyY2hGaWVsZHMubGVuZ3RoID09PSAwKSAmJiAhZXh0ZXJuYWxTZWFyY2hGaWVsZCxcbiAgICAgIH0gYXMgdmFyc1wiXG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIiF2YXJzLm5vU2VhcmNoRmllbGRzXCJcbiAgICAgICAgY2xhc3M9XCJzZWFyY2gtZmllbGRzLWNvbnRhaW5lclwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsnc2VhcmNoLWZpZWxkcy1jb250YWluZXItLWhpZGRlbic6IChleHBhbmRlZCQgfCBhc3luYykgPT09IGZhbHNlfVwiXG4gICAgICAgIFtjZHNMYXllcl09XCIxXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNlYXJjaEZpZWxkIG9mIHNlYXJjaEZpZWxkc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtZmllbGQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VhcmNoRmllbGRUZW1wbGF0ZTsgY29udGV4dDoge3NlYXJjaEZpZWxkOiBzZWFyY2hGaWVsZH1cIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWV0YS1jb250YWluZXJcIiAqbmdJZj1cImV4cGFuZGVkJCB8IGFzeW5jXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbnNUZW1wbGF0ZTsgY29udGV4dDoge25vU2VhcmNoRmllbGRzOiB2YXJzLm5vU2VhcmNoRmllbGRzfVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2VhcmNoRmllbGRUZW1wbGF0ZSBsZXQtc2VhcmNoRmllbGQ9XCJzZWFyY2hGaWVsZFwiPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJ7XG4gICAgICB2YWx1ZXM6IHZhbHVlcyQgfCBhc3luYyxcbiAgICAgIHRvb2x0aXBLZXk6ICdzZWFyY2hGaWVsZHNUb29sdGlwcy4nICsgc2VhcmNoRmllbGQua2V5LFxuICAgICAgdG9vbHRpcDogJ3NlYXJjaEZpZWxkc1Rvb2x0aXBzLicgKyBzZWFyY2hGaWVsZC5rZXkgfCB0cmFuc2xhdGUsXG4gICAgICBzZWFyY2hGaWVsZCxcbiAgICAgIHRpdGxlOlxuICAgICAgICBzZWFyY2hGaWVsZC50aXRsZSB8fFxuICAgICAgICAoJ3NlYXJjaEZpZWxkcy4nICsgc2VhcmNoRmllbGQua2V5ICE9PSAoJ3NlYXJjaEZpZWxkcy4nICsgc2VhcmNoRmllbGQua2V5IHwgdHJhbnNsYXRlKVxuICAgICAgICAgID8gKCdzZWFyY2hGaWVsZHMuJyArIHNlYXJjaEZpZWxkLmtleSB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICA6IHNlYXJjaEZpZWxkLmtleSksXG4gICAgfSBhcyB2YXJzXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIHNlYXJjaEZpZWxkVGVtcGxhdGVUZXh0O1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgc2VhcmNoRmllbGQ6IHNlYXJjaEZpZWxkLFxuICAgICAgICAgIHRvb2x0aXBLZXk6IHZhcnMudG9vbHRpcEtleSxcbiAgICAgICAgICB0b29sdGlwOiB2YXJzLnRvb2x0aXAsXG4gICAgICAgICAgdGl0bGU6IHZhcnMudGl0bGUsXG4gICAgICAgICAgdmFsdWVzOiB2YXJzLnZhbHVlcyxcbiAgICAgICAgfVxuICAgICAgXCJcbiAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgc2VhcmNoRmllbGRUZW1wbGF0ZU51bWJlcjtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIHNlYXJjaEZpZWxkOiBzZWFyY2hGaWVsZCxcbiAgICAgICAgICB0b29sdGlwS2V5OiB2YXJzLnRvb2x0aXBLZXksXG4gICAgICAgICAgdG9vbHRpcDogdmFycy50b29sdGlwLFxuICAgICAgICAgIHRpdGxlOiB2YXJzLnRpdGxlLFxuICAgICAgICAgIHZhbHVlczogdmFycy52YWx1ZXMsXG4gICAgICAgIH1cbiAgICAgIFwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIHNlYXJjaEZpZWxkVGVtcGxhdGVEYXRlO1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgc2VhcmNoRmllbGQ6IHNlYXJjaEZpZWxkLFxuICAgICAgICAgIHRvb2x0aXBLZXk6IHZhcnMudG9vbHRpcEtleSxcbiAgICAgICAgICB0b29sdGlwOiB2YXJzLnRvb2x0aXAsXG4gICAgICAgICAgdGl0bGU6IHZhcnMudGl0bGUsXG4gICAgICAgICAgdmFsdWVzOiB2YXJzLnZhbHVlcyxcbiAgICAgICAgfVxuICAgICAgXCJcbiAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgc2VhcmNoRmllbGRUZW1wbGF0ZUJvb2xlYW47XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBzZWFyY2hGaWVsZDogc2VhcmNoRmllbGQsXG4gICAgICAgICAgdG9vbHRpcEtleTogdmFycy50b29sdGlwS2V5LFxuICAgICAgICAgIHRvb2x0aXA6IHZhcnMudG9vbHRpcCxcbiAgICAgICAgICB0aXRsZTogdmFycy50aXRsZSxcbiAgICAgICAgICB2YWx1ZXM6IHZhcnMudmFsdWVzLFxuICAgICAgICB9XG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICBzZWFyY2hGaWVsZFRlbXBsYXRlRGF0ZVRpbWU7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBzZWFyY2hGaWVsZDogc2VhcmNoRmllbGQsXG4gICAgICAgICAgdG9vbHRpcEtleTogdmFycy50b29sdGlwS2V5LFxuICAgICAgICAgIHRvb2x0aXA6IHZhcnMudG9vbHRpcCxcbiAgICAgICAgICB0aXRsZTogdmFycy50aXRsZSxcbiAgICAgICAgICB2YWx1ZXM6IHZhcnMudmFsdWVzLFxuICAgICAgICB9XG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICBzZWFyY2hGaWVsZFRlbXBsYXRlTnVtYmVyUmFuZ2U7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBzZWFyY2hGaWVsZDogc2VhcmNoRmllbGQsXG4gICAgICAgICAgdG9vbHRpcEtleTogdmFycy50b29sdGlwS2V5LFxuICAgICAgICAgIHRvb2x0aXA6IHZhcnMudG9vbHRpcCxcbiAgICAgICAgICB0aXRsZTogdmFycy50aXRsZSxcbiAgICAgICAgICB2YWx1ZXM6IHZhcnMudmFsdWVzLFxuICAgICAgICB9XG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICBzZWFyY2hGaWVsZFRlbXBsYXRlVGV4dFJhbmdlO1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgc2VhcmNoRmllbGQ6IHNlYXJjaEZpZWxkLFxuICAgICAgICAgIHRvb2x0aXBLZXk6IHZhcnMudG9vbHRpcEtleSxcbiAgICAgICAgICB0b29sdGlwOiB2YXJzLnRvb2x0aXAsXG4gICAgICAgICAgdGl0bGU6IHZhcnMudGl0bGUsXG4gICAgICAgICAgdmFsdWVzOiB2YXJzLnZhbHVlcyxcbiAgICAgICAgfVxuICAgICAgXCJcbiAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgc2VhcmNoRmllbGRUZW1wbGF0ZURhdGVSYW5nZTtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIHNlYXJjaEZpZWxkOiBzZWFyY2hGaWVsZCxcbiAgICAgICAgICB0b29sdGlwS2V5OiB2YXJzLnRvb2x0aXBLZXksXG4gICAgICAgICAgdG9vbHRpcDogdmFycy50b29sdGlwLFxuICAgICAgICAgIHRpdGxlOiB2YXJzLnRpdGxlLFxuICAgICAgICAgIHZhbHVlczogdmFycy52YWx1ZXMsXG4gICAgICAgIH1cbiAgICAgIFwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIHNlYXJjaEZpZWxkVGVtcGxhdGVEYXRlVGltZVJhbmdlO1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgc2VhcmNoRmllbGQ6IHNlYXJjaEZpZWxkLFxuICAgICAgICAgIHRvb2x0aXBLZXk6IHZhcnMudG9vbHRpcEtleSxcbiAgICAgICAgICB0b29sdGlwOiB2YXJzLnRvb2x0aXAsXG4gICAgICAgICAgdGl0bGU6IHZhcnMudGl0bGUsXG4gICAgICAgICAgdmFsdWVzOiB2YXJzLnZhbHVlcyxcbiAgICAgICAgfVxuICAgICAgXCJcbiAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgc2VhcmNoRmllbGRUZW1wbGF0ZVNpbmdsZVNlbGVjdERyb3Bkb3duO1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgc2VhcmNoRmllbGQ6IHNlYXJjaEZpZWxkLFxuICAgICAgICAgIHRvb2x0aXBLZXk6IHZhcnMudG9vbHRpcEtleSxcbiAgICAgICAgICB0b29sdGlwOiB2YXJzLnRvb2x0aXAsXG4gICAgICAgICAgdGl0bGU6IHZhcnMudGl0bGUsXG4gICAgICAgICAgdmFsdWVzOiB2YXJzLnZhbHVlcyxcbiAgICAgICAgfVxuICAgICAgXCJcbiAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgc2VhcmNoRmllbGRUZW1wbGF0ZU11bHRpU2VsZWN0RHJvcGRvd247XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBzZWFyY2hGaWVsZDogc2VhcmNoRmllbGQsXG4gICAgICAgICAgdG9vbHRpcEtleTogdmFycy50b29sdGlwS2V5LFxuICAgICAgICAgIHRvb2x0aXA6IHZhcnMudG9vbHRpcCxcbiAgICAgICAgICB0aXRsZTogdmFycy50aXRsZSxcbiAgICAgICAgICB2YWx1ZXM6IHZhcnMudmFsdWVzLFxuICAgICAgICB9XG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI3NlYXJjaEZpZWxkVGVtcGxhdGVUZXh0XG4gIGxldC1zZWFyY2hGaWVsZD1cInNlYXJjaEZpZWxkXCJcbiAgbGV0LXRvb2x0aXA9XCJ0b29sdGlwXCJcbiAgbGV0LXRvb2x0aXBLZXk9XCJ0b29sdGlwS2V5XCJcbiAgbGV0LXRpdGxlPVwidGl0bGVcIlxuICBsZXQtdmFsdWVzPVwidmFsdWVzXCJcbj5cbiAgPHYtaW5wdXRcbiAgICAqbmdJZj1cInNlYXJjaEZpZWxkLmRhdGFUeXBlID09PSAndGV4dCcgJiYgc2VhcmNoRmllbGQuZmllbGRUeXBlID09PSAnc2luZ2xlJ1wiXG4gICAgW2RhdGFUZXN0SWRdPVwiJ3NlYXJjaC1maWVsZC0nICsgc2VhcmNoRmllbGQua2V5XCJcbiAgICBbbmFtZV09XCJzZWFyY2hGaWVsZC5rZXlcIlxuICAgIFt0aXRsZV09XCJ0aXRsZVwiXG4gICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICBbdG9vbHRpcF09XCJ0b29sdGlwICE9PSB0b29sdGlwS2V5ICYmIHRvb2x0aXBcIlxuICAgICh2YWx1ZUNoYW5nZSk9XCJzaW5nbGVWYWx1ZUNoYW5nZShzZWFyY2hGaWVsZC5rZXksICRldmVudClcIlxuICAgIFtzbWFsbExhYmVsXT1cInRydWVcIlxuICAgIFtjbGVhciRdPVwiY2xlYXIkXCJcbiAgICAoa2V5dXAuZW50ZXIpPVwic2VhcmNoKClcIlxuICAgIFtkZWZhdWx0VmFsdWVdPVwidmFsdWVzW3NlYXJjaEZpZWxkLmtleV1cIlxuICAgIFtkaXNhYmxlZF09XCJpbnB1dERpc2FibGVkXCJcbiAgPlxuICA8L3YtaW5wdXQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI3NlYXJjaEZpZWxkVGVtcGxhdGVOdW1iZXJcbiAgbGV0LXNlYXJjaEZpZWxkPVwic2VhcmNoRmllbGRcIlxuICBsZXQtdG9vbHRpcD1cInRvb2x0aXBcIlxuICBsZXQtdG9vbHRpcEtleT1cInRvb2x0aXBLZXlcIlxuICBsZXQtdGl0bGU9XCJ0aXRsZVwiXG4gIGxldC12YWx1ZXM9XCJ2YWx1ZXNcIlxuPlxuICA8di1pbnB1dFxuICAgICpuZ0lmPVwic2VhcmNoRmllbGQuZGF0YVR5cGUgPT09ICdudW1iZXInICYmIHNlYXJjaEZpZWxkLmZpZWxkVHlwZSA9PT0gJ3NpbmdsZSdcIlxuICAgIFtkYXRhVGVzdElkXT1cIidzZWFyY2gtZmllbGQtJyArIHNlYXJjaEZpZWxkLmtleVwiXG4gICAgW25hbWVdPVwic2VhcmNoRmllbGQua2V5XCJcbiAgICBbdGl0bGVdPVwidGl0bGVcIlxuICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgKHZhbHVlQ2hhbmdlKT1cInNpbmdsZVZhbHVlQ2hhbmdlKHNlYXJjaEZpZWxkLmtleSwgJGV2ZW50KVwiXG4gICAgdHlwZT1cIm51bWJlclwiXG4gICAgW2hpZGVOdW1iZXJTcGluQm94XT1cInRydWVcIlxuICAgIFt0b29sdGlwXT1cInRvb2x0aXAgIT09IHRvb2x0aXBLZXkgJiYgdG9vbHRpcFwiXG4gICAgW3NtYWxsTGFiZWxdPVwidHJ1ZVwiXG4gICAgW2NsZWFyJF09XCJjbGVhciRcIlxuICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2goKVwiXG4gICAgW2RlZmF1bHRWYWx1ZV09XCJ2YWx1ZXNbc2VhcmNoRmllbGQua2V5XVwiXG4gICAgW2Rpc2FibGVkXT1cImlucHV0RGlzYWJsZWRcIlxuICA+XG4gIDwvdi1pbnB1dD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjc2VhcmNoRmllbGRUZW1wbGF0ZURhdGVcbiAgbGV0LXNlYXJjaEZpZWxkPVwic2VhcmNoRmllbGRcIlxuICBsZXQtdG9vbHRpcD1cInRvb2x0aXBcIlxuICBsZXQtdG9vbHRpcEtleT1cInRvb2x0aXBLZXlcIlxuICBsZXQtdGl0bGU9XCJ0aXRsZVwiXG4gIGxldC12YWx1ZXM9XCJ2YWx1ZXNcIlxuPlxuICA8di1kYXRlLXBpY2tlclxuICAgICpuZ0lmPVwic2VhcmNoRmllbGQuZGF0YVR5cGUgPT09ICdkYXRlJyAmJiBzZWFyY2hGaWVsZC5maWVsZFR5cGUgPT09ICdzaW5nbGUnXCJcbiAgICBbdGl0bGVdPVwidGl0bGVcIlxuICAgIFt0b29sdGlwXT1cInRvb2x0aXAgIT09IHRvb2x0aXBLZXkgJiYgdG9vbHRpcFwiXG4gICAgW25hbWVdPVwic2VhcmNoRmllbGQua2V5XCJcbiAgICBmdWxsV2lkdGg9XCJ0cnVlXCJcbiAgICAodmFsdWVDaGFuZ2UpPVwic2luZ2xlVmFsdWVDaGFuZ2Uoc2VhcmNoRmllbGQua2V5LCAkZXZlbnQpXCJcbiAgICBbc21hbGxMYWJlbF09XCJ0cnVlXCJcbiAgICBbY2xlYXIkXT1cImNsZWFyJFwiXG4gICAgKGtleXVwLmVudGVyKT1cInNlYXJjaCgpXCJcbiAgICBbZGVmYXVsdERhdGVdPVwidmFsdWVzW3NlYXJjaEZpZWxkLmtleV1cIlxuICAgIFtkaXNhYmxlZF09XCJpbnB1dERpc2FibGVkXCJcbiAgPjwvdi1kYXRlLXBpY2tlcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjc2VhcmNoRmllbGRUZW1wbGF0ZVRleHRSYW5nZVxuICBsZXQtc2VhcmNoRmllbGQ9XCJzZWFyY2hGaWVsZFwiXG4gIGxldC10b29sdGlwPVwidG9vbHRpcFwiXG4gIGxldC10b29sdGlwS2V5PVwidG9vbHRpcEtleVwiXG4gIGxldC10aXRsZT1cInRpdGxlXCJcbiAgbGV0LXZhbHVlcz1cInZhbHVlc1wiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWFyY2hGaWVsZC5kYXRhVHlwZSA9PT0gJ3RleHQnICYmIHNlYXJjaEZpZWxkLmZpZWxkVHlwZSA9PT0gJ3JhbmdlJ1wiPlxuICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICBbdGl0bGVdPVwidGl0bGVcIlxuICAgICAgW3Rvb2x0aXBdPVwidG9vbHRpcCAhPT0gdG9vbHRpcEtleSAmJiB0b29sdGlwXCJcbiAgICAgIFtzbWFsbF09XCJ0cnVlXCJcbiAgICA+PC92LWlucHV0LWxhYmVsPlxuICAgIDx2LWZvcm1cbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJtdWx0aXBsZVZhbHVlQ2hhbmdlKHNlYXJjaEZpZWxkLmtleSwgJGV2ZW50KVwiXG4gICAgICBjbGFzc05hbWU9XCJtdWx0aXBsZS1zZWFyY2gtZmllbGRzXCJcbiAgICA+XG4gICAgICA8di1pbnB1dFxuICAgICAgICBuYW1lPVwic3RhcnRcIlxuICAgICAgICBbZGF0YVRlc3RJZF09XCInc2VhcmNoLWZpZWxkLScgKyBzZWFyY2hGaWVsZC5rZXlcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICBbY2xlYXIkXT1cImNsZWFyJFwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2goKVwiXG4gICAgICAgIFtkZWZhdWx0VmFsdWVdPVwidmFsdWVzW3NlYXJjaEZpZWxkLmtleV0/LnN0YXJ0XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlucHV0RGlzYWJsZWRcIlxuICAgICAgPlxuICAgICAgPC92LWlucHV0PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRvVGV4dFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPHYtaW5wdXRcbiAgICAgICAgbmFtZT1cImVuZFwiXG4gICAgICAgIFtkYXRhVGVzdElkXT1cIidzZWFyY2gtZmllbGQtJyArIHNlYXJjaEZpZWxkLmtleVwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIFtjbGVhciRdPVwiY2xlYXIkXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaCgpXCJcbiAgICAgICAgW2RlZmF1bHRWYWx1ZV09XCJ2YWx1ZXNbc2VhcmNoRmllbGQua2V5XT8uZW5kXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlucHV0RGlzYWJsZWRcIlxuICAgICAgPlxuICAgICAgPC92LWlucHV0PlxuICAgIDwvdi1mb3JtPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjc2VhcmNoRmllbGRUZW1wbGF0ZU51bWJlclJhbmdlXG4gIGxldC1zZWFyY2hGaWVsZD1cInNlYXJjaEZpZWxkXCJcbiAgbGV0LXRvb2x0aXA9XCJ0b29sdGlwXCJcbiAgbGV0LXRvb2x0aXBLZXk9XCJ0b29sdGlwS2V5XCJcbiAgbGV0LXRpdGxlPVwidGl0bGVcIlxuICBsZXQtdmFsdWVzPVwidmFsdWVzXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlYXJjaEZpZWxkLmRhdGFUeXBlID09PSAnbnVtYmVyJyAmJiBzZWFyY2hGaWVsZC5maWVsZFR5cGUgPT09ICdyYW5nZSdcIj5cbiAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICAgIFt0b29sdGlwXT1cInRvb2x0aXAgIT09IHRvb2x0aXBLZXkgJiYgdG9vbHRpcFwiXG4gICAgICBbc21hbGxdPVwidHJ1ZVwiXG4gICAgPjwvdi1pbnB1dC1sYWJlbD5cbiAgICA8di1mb3JtXG4gICAgICAodmFsdWVDaGFuZ2UpPVwibXVsdGlwbGVWYWx1ZUNoYW5nZShzZWFyY2hGaWVsZC5rZXksICRldmVudClcIlxuICAgICAgY2xhc3NOYW1lPVwibXVsdGlwbGUtc2VhcmNoLWZpZWxkc1wiXG4gICAgPlxuICAgICAgPHYtaW5wdXRcbiAgICAgICAgbmFtZT1cInN0YXJ0XCJcbiAgICAgICAgW2RhdGFUZXN0SWRdPVwiJ3NlYXJjaC1maWVsZC0nICsgc2VhcmNoRmllbGQua2V5XCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgIFtoaWRlTnVtYmVyU3BpbkJveF09XCJ0cnVlXCJcbiAgICAgICAgW2NsZWFyJF09XCJjbGVhciRcIlxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2VhcmNoKClcIlxuICAgICAgICBbZGVmYXVsdFZhbHVlXT1cInZhbHVlc1tzZWFyY2hGaWVsZC5rZXldPy5zdGFydFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpbnB1dERpc2FibGVkXCJcbiAgICAgID5cbiAgICAgIDwvdi1pbnB1dD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0b1RleHRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDx2LWlucHV0XG4gICAgICAgIG5hbWU9XCJlbmRcIlxuICAgICAgICBbZGF0YVRlc3RJZF09XCInc2VhcmNoLWZpZWxkLScgKyBzZWFyY2hGaWVsZC5rZXlcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgW2hpZGVOdW1iZXJTcGluQm94XT1cInRydWVcIlxuICAgICAgICBbY2xlYXIkXT1cImNsZWFyJFwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2goKVwiXG4gICAgICAgIFtkZWZhdWx0VmFsdWVdPVwidmFsdWVzW3NlYXJjaEZpZWxkLmtleV0/LmVuZFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpbnB1dERpc2FibGVkXCJcbiAgICAgID5cbiAgICAgIDwvdi1pbnB1dD5cbiAgICA8L3YtZm9ybT5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI3NlYXJjaEZpZWxkVGVtcGxhdGVEYXRlUmFuZ2VcbiAgbGV0LXNlYXJjaEZpZWxkPVwic2VhcmNoRmllbGRcIlxuICBsZXQtdG9vbHRpcD1cInRvb2x0aXBcIlxuICBsZXQtdG9vbHRpcEtleT1cInRvb2x0aXBLZXlcIlxuICBsZXQtdGl0bGU9XCJ0aXRsZVwiXG4gIGxldC12YWx1ZXM9XCJ2YWx1ZXNcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VhcmNoRmllbGQuZGF0YVR5cGUgPT09ICdkYXRlJyAmJiBzZWFyY2hGaWVsZC5maWVsZFR5cGUgPT09ICdyYW5nZSdcIj5cbiAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICAgIFt0b29sdGlwXT1cInRvb2x0aXAgIT09IHRvb2x0aXBLZXkgJiYgdG9vbHRpcFwiXG4gICAgICBbc21hbGxdPVwidHJ1ZVwiXG4gICAgPjwvdi1pbnB1dC1sYWJlbD5cbiAgICA8di1mb3JtXG4gICAgICAodmFsdWVDaGFuZ2UpPVwibXVsdGlwbGVWYWx1ZUNoYW5nZShzZWFyY2hGaWVsZC5rZXksICRldmVudClcIlxuICAgICAgY2xhc3NOYW1lPVwibXVsdGlwbGUtc2VhcmNoLWZpZWxkc1wiXG4gICAgPlxuICAgICAgPHYtZGF0ZS1waWNrZXJcbiAgICAgICAgbmFtZT1cInN0YXJ0XCJcbiAgICAgICAgZnVsbFdpZHRoPVwidHJ1ZVwiXG4gICAgICAgIFtjbGVhciRdPVwiY2xlYXIkXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaCgpXCJcbiAgICAgICAgW2RlZmF1bHREYXRlXT1cInZhbHVlc1tzZWFyY2hGaWVsZC5rZXldPy5zdGFydFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpbnB1dERpc2FibGVkXCJcbiAgICAgID48L3YtZGF0ZS1waWNrZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidG9UZXh0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8di1kYXRlLXBpY2tlclxuICAgICAgICBuYW1lPVwiZW5kXCJcbiAgICAgICAgZnVsbFdpZHRoPVwidHJ1ZVwiXG4gICAgICAgIFtjbGVhciRdPVwiY2xlYXIkXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaCgpXCJcbiAgICAgICAgW2RlZmF1bHREYXRlXT1cInZhbHVlc1tzZWFyY2hGaWVsZC5rZXldPy5lbmRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaW5wdXREaXNhYmxlZFwiXG4gICAgICA+PC92LWRhdGUtcGlja2VyPlxuICAgIDwvdi1mb3JtPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjc2VhcmNoRmllbGRUZW1wbGF0ZUJvb2xlYW5cbiAgbGV0LXNlYXJjaEZpZWxkPVwic2VhcmNoRmllbGRcIlxuICBsZXQtdG9vbHRpcD1cInRvb2x0aXBcIlxuICBsZXQtdG9vbHRpcEtleT1cInRvb2x0aXBLZXlcIlxuICBsZXQtdGl0bGU9XCJ0aXRsZVwiXG4gIGxldC12YWx1ZXM9XCJ2YWx1ZXNcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VhcmNoRmllbGQuZGF0YVR5cGUgPT09ICdib29sZWFuJ1wiPlxuICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICBbdGl0bGVdPVwidGl0bGVcIlxuICAgICAgW3Rvb2x0aXBdPVwidG9vbHRpcCAhPT0gdG9vbHRpcEtleSAmJiB0b29sdGlwXCJcbiAgICAgIFtzbWFsbF09XCJ0cnVlXCJcbiAgICA+PC92LWlucHV0LWxhYmVsPlxuICAgIDx2LXNlbGVjdFxuICAgICAgKm5nSWY9XCJib29sZWFuSXRlbXMkIHwgYXN5bmMgYXMgYm9vbGVhbkl0ZW1zXCJcbiAgICAgIFtpdGVtc109XCJib29sZWFuSXRlbXNcIlxuICAgICAgW21hcmdpbl09XCJmYWxzZVwiXG4gICAgICBbcmVxdWlyZWRdPVwiZmFsc2VcIlxuICAgICAgW25hbWVdPVwic2VhcmNoRmllbGQua2V5XCJcbiAgICAgIFtjbGVhclNlbGVjdGlvblN1YmplY3QkXT1cImNsZWFyJFwiXG4gICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwic2luZ2xlVmFsdWVDaGFuZ2Uoc2VhcmNoRmllbGQua2V5LCAkZXZlbnQpXCJcbiAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2goKVwiXG4gICAgICBbZGVmYXVsdFNlbGVjdGlvbklkXT1cImdldERlZmF1bHRCb29sZWFuU2VsZWN0aW9uSWQodmFsdWVzLCBzZWFyY2hGaWVsZC5rZXkpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJpbnB1dERpc2FibGVkXCJcbiAgICAgIFthcHBlbmRJbmxpbmVdPVwiZmFsc2VcIlxuICAgID48L3Ytc2VsZWN0PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjc2VhcmNoRmllbGRUZW1wbGF0ZURhdGVUaW1lXG4gIGxldC1zZWFyY2hGaWVsZD1cInNlYXJjaEZpZWxkXCJcbiAgbGV0LXRvb2x0aXA9XCJ0b29sdGlwXCJcbiAgbGV0LXRvb2x0aXBLZXk9XCJ0b29sdGlwS2V5XCJcbiAgbGV0LXRpdGxlPVwidGl0bGVcIlxuICBsZXQtdmFsdWVzPVwidmFsdWVzXCJcbj5cbiAgPHYtZGF0ZS1waWNrZXJcbiAgICAqbmdJZj1cInNlYXJjaEZpZWxkLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnICYmIHNlYXJjaEZpZWxkLmZpZWxkVHlwZSA9PT0gJ3NpbmdsZSdcIlxuICAgIFt0aXRsZV09XCJ0aXRsZVwiXG4gICAgW3Rvb2x0aXBdPVwidG9vbHRpcCAhPT0gdG9vbHRpcEtleSAmJiB0b29sdGlwXCJcbiAgICBbbmFtZV09XCJzZWFyY2hGaWVsZC5rZXlcIlxuICAgIGZ1bGxXaWR0aD1cInRydWVcIlxuICAgICh2YWx1ZUNoYW5nZSk9XCJzaW5nbGVWYWx1ZUNoYW5nZShzZWFyY2hGaWVsZC5rZXksICRldmVudCwgdHJ1ZSlcIlxuICAgIFtzbWFsbExhYmVsXT1cInRydWVcIlxuICAgIFtlbmFibGVUaW1lXT1cInRydWVcIlxuICAgIFtjbGVhciRdPVwiY2xlYXIkXCJcbiAgICAoa2V5dXAuZW50ZXIpPVwic2VhcmNoKClcIlxuICAgIFtkZWZhdWx0RGF0ZV09XCJ2YWx1ZXNbc2VhcmNoRmllbGQua2V5XVwiXG4gICAgW2Rpc2FibGVkXT1cImlucHV0RGlzYWJsZWRcIlxuICA+PC92LWRhdGUtcGlja2VyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNzZWFyY2hGaWVsZFRlbXBsYXRlRGF0ZVRpbWVSYW5nZVxuICBsZXQtc2VhcmNoRmllbGQ9XCJzZWFyY2hGaWVsZFwiXG4gIGxldC10b29sdGlwPVwidG9vbHRpcFwiXG4gIGxldC10b29sdGlwS2V5PVwidG9vbHRpcEtleVwiXG4gIGxldC10aXRsZT1cInRpdGxlXCJcbiAgbGV0LXZhbHVlcz1cInZhbHVlc1wiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWFyY2hGaWVsZC5kYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJyAmJiBzZWFyY2hGaWVsZC5maWVsZFR5cGUgPT09ICdyYW5nZSdcIj5cbiAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICAgIFt0b29sdGlwXT1cInRvb2x0aXAgIT09IHRvb2x0aXBLZXkgJiYgdG9vbHRpcFwiXG4gICAgICBbc21hbGxdPVwidHJ1ZVwiXG4gICAgPjwvdi1pbnB1dC1sYWJlbD5cbiAgICA8di1mb3JtXG4gICAgICAodmFsdWVDaGFuZ2UpPVwibXVsdGlwbGVWYWx1ZUNoYW5nZShzZWFyY2hGaWVsZC5rZXksICRldmVudCwgdHJ1ZSlcIlxuICAgICAgY2xhc3NOYW1lPVwibXVsdGlwbGUtc2VhcmNoLWZpZWxkc1wiXG4gICAgPlxuICAgICAgPHYtZGF0ZS1waWNrZXJcbiAgICAgICAgbmFtZT1cInN0YXJ0XCJcbiAgICAgICAgZnVsbFdpZHRoPVwidHJ1ZVwiXG4gICAgICAgIFtlbmFibGVUaW1lXT1cInRydWVcIlxuICAgICAgICBbY2xlYXIkXT1cImNsZWFyJFwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2goKVwiXG4gICAgICAgIFtkZWZhdWx0RGF0ZV09XCJ2YWx1ZXNbc2VhcmNoRmllbGQua2V5XT8uc3RhcnRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaW5wdXREaXNhYmxlZFwiXG4gICAgICA+PC92LWRhdGUtcGlja2VyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRvVGV4dFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPHYtZGF0ZS1waWNrZXJcbiAgICAgICAgbmFtZT1cImVuZFwiXG4gICAgICAgIGZ1bGxXaWR0aD1cInRydWVcIlxuICAgICAgICBbZW5hYmxlVGltZV09XCJ0cnVlXCJcbiAgICAgICAgW2NsZWFyJF09XCJjbGVhciRcIlxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2VhcmNoKClcIlxuICAgICAgICBbZGVmYXVsdERhdGVdPVwidmFsdWVzW3NlYXJjaEZpZWxkLmtleV0/LmVuZFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpbnB1dERpc2FibGVkXCJcbiAgICAgID48L3YtZGF0ZS1waWNrZXI+XG4gICAgPC92LWZvcm0+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNzZWFyY2hGaWVsZFRlbXBsYXRlU2luZ2xlU2VsZWN0RHJvcGRvd25cbiAgbGV0LXNlYXJjaEZpZWxkPVwic2VhcmNoRmllbGRcIlxuICBsZXQtdG9vbHRpcD1cInRvb2x0aXBcIlxuICBsZXQtdG9vbHRpcEtleT1cInRvb2x0aXBLZXlcIlxuICBsZXQtdGl0bGU9XCJ0aXRsZVwiXG4gIGxldC12YWx1ZXM9XCJ2YWx1ZXNcIlxuPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJcbiAgICAgIHNlYXJjaEZpZWxkLmRhdGFUeXBlID09PSAndGV4dCcgJiZcbiAgICAgIChzZWFyY2hGaWVsZC5maWVsZFR5cGUgPT09ICdzaW5nbGUtc2VsZWN0LWRyb3Bkb3duJyB8fFxuICAgICAgICBzZWFyY2hGaWVsZC5maWVsZFR5cGUgPT09ICdzaW5nbGVfc2VsZWN0X2Ryb3Bkb3duJylcbiAgICBcIlxuICA+XG4gICAgPHYtaW5wdXQtbGFiZWxcbiAgICAgIFt0aXRsZV09XCJ0aXRsZVwiXG4gICAgICBbdG9vbHRpcF09XCJ0b29sdGlwICE9PSB0b29sdGlwS2V5ICYmIHRvb2x0aXBcIlxuICAgICAgW3NtYWxsXT1cInRydWVcIlxuICAgID48L3YtaW5wdXQtbGFiZWw+XG4gICAgPHYtc2VsZWN0XG4gICAgICAqbmdJZj1cImRyb3Bkb3duU2VsZWN0SXRlbXNNYXBbc2VhcmNoRmllbGQua2V5XSBhcyBzZWFyY2hGaWVsZFNlbGVjdEl0ZW1zXCJcbiAgICAgIFtpdGVtc109XCJzZWFyY2hGaWVsZFNlbGVjdEl0ZW1zXCJcbiAgICAgIFttYXJnaW5dPVwiZmFsc2VcIlxuICAgICAgW3JlcXVpcmVkXT1cImZhbHNlXCJcbiAgICAgIFtuYW1lXT1cInNlYXJjaEZpZWxkLmtleVwiXG4gICAgICBbY2xlYXJTZWxlY3Rpb25TdWJqZWN0JF09XCJjbGVhciRcIlxuICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cInNpbmdsZVZhbHVlQ2hhbmdlKHNlYXJjaEZpZWxkLmtleSwgJGV2ZW50KVwiXG4gICAgICAoa2V5dXAuZW50ZXIpPVwic2VhcmNoKClcIlxuICAgICAgW2RlZmF1bHRTZWxlY3Rpb25JZF09XCJ2YWx1ZXNbc2VhcmNoRmllbGQua2V5XVwiXG4gICAgICBbZGlzYWJsZWRdPVwiaW5wdXREaXNhYmxlZFwiXG4gICAgICBbYXBwZW5kSW5saW5lXT1cImZhbHNlXCJcbiAgICA+PC92LXNlbGVjdD5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI3NlYXJjaEZpZWxkVGVtcGxhdGVNdWx0aVNlbGVjdERyb3Bkb3duXG4gIGxldC1zZWFyY2hGaWVsZD1cInNlYXJjaEZpZWxkXCJcbiAgbGV0LXRvb2x0aXA9XCJ0b29sdGlwXCJcbiAgbGV0LXRvb2x0aXBLZXk9XCJ0b29sdGlwS2V5XCJcbiAgbGV0LXRpdGxlPVwidGl0bGVcIlxuICBsZXQtdmFsdWVzPVwidmFsdWVzXCJcbj5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0lmPVwiXG4gICAgICBzZWFyY2hGaWVsZC5kYXRhVHlwZSA9PT0gJ3RleHQnICYmXG4gICAgICAoc2VhcmNoRmllbGQuZmllbGRUeXBlID09PSAnbXVsdGktc2VsZWN0LWRyb3Bkb3duJyB8fFxuICAgICAgICBzZWFyY2hGaWVsZC5maWVsZFR5cGUgPT09ICdtdWx0aV9zZWxlY3RfZHJvcGRvd24nKVxuICAgIFwiXG4gID5cbiAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICAgIFt0b29sdGlwXT1cInRvb2x0aXAgIT09IHRvb2x0aXBLZXkgJiYgdG9vbHRpcFwiXG4gICAgICBbc21hbGxdPVwidHJ1ZVwiXG4gICAgPjwvdi1pbnB1dC1sYWJlbD5cbiAgICA8di1zZWxlY3RcbiAgICAgICpuZ0lmPVwiZHJvcGRvd25TZWxlY3RJdGVtc01hcFtzZWFyY2hGaWVsZC5rZXldIGFzIHNlYXJjaEZpZWxkU2VsZWN0SXRlbXNcIlxuICAgICAgW2l0ZW1zXT1cInNlYXJjaEZpZWxkU2VsZWN0SXRlbXNcIlxuICAgICAgW21hcmdpbl09XCJmYWxzZVwiXG4gICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiXG4gICAgICBbcmVxdWlyZWRdPVwiZmFsc2VcIlxuICAgICAgW25hbWVdPVwic2VhcmNoRmllbGQua2V5XCJcbiAgICAgIFtjbGVhclNlbGVjdGlvblN1YmplY3QkXT1cImNsZWFyJFwiXG4gICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwibXVsdGlwbGVWYWx1ZUNoYW5nZShzZWFyY2hGaWVsZC5rZXksICRldmVudClcIlxuICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaCgpXCJcbiAgICAgIFtkZWZhdWx0U2VsZWN0aW9uSWRzXT1cInZhbHVlc1tzZWFyY2hGaWVsZC5rZXldXCJcbiAgICAgIFtkaXNhYmxlZF09XCJpbnB1dERpc2FibGVkXCJcbiAgICAgIFthcHBlbmRJbmxpbmVdPVwiZmFsc2VcIlxuICAgID48L3Ytc2VsZWN0PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdG9UZXh0PlxuICA8ZGl2IGNsYXNzPVwidG8tdGV4dFwiPlxuICAgIDx2LXBhcmFncmFwaD57eyAnc2VhcmNoRmllbGRzLnRvJyB8IHRyYW5zbGF0ZSB9fTwvdi1wYXJhZ3JhcGg+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNidXR0b25zVGVtcGxhdGUgbGV0LW5vU2VhcmNoRmllbGRzPVwibm9TZWFyY2hGaWVsZHNcIj5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9TZWFyY2hGaWVsZHNUZW1wbGF0ZTsgY29udGV4dDoge25vU2VhcmNoRmllbGRzOiBub1NlYXJjaEZpZWxkc31cIlxuICA+PC9uZy1jb250YWluZXI+XG5cbiAgPGRpdiBjbGFzcz1cImJ1dHRvbnMtY29udGFpbmVyXCIgKm5nSWY9XCIhbm9TZWFyY2hGaWVsZHMgJiYge2V4cGFuZGVkOiBleHBhbmRlZCQgfCBhc3luY30gYXMgb2JzXCI+XG4gICAgPGRpdiBjbGFzcz1cInJpZ2h0LWJ1dHRvbnNcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJvYnMuZXhwYW5kZWRcIlxuICAgICAgICBjZHNCdXR0b249XCJ0ZXJ0aWFyeVwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwic2VhcmNoLWZpZWxkcy1jbGVhci1idXR0b25cIlxuICAgICAgICAoY2xpY2spPVwiY2xlYXIoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nIHx8IG5vU2VhcmNoRmllbGRzIHx8IGlucHV0RGlzYWJsZWRcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgaWQ9XCJjbGVhclwiXG4gICAgICA+XG4gICAgICAgIDxzdmcgY2RzSWNvbj1cInRyYXNoLWNhblwiIHNpemU9XCIxNlwiIGNsYXNzPVwiY2RzLS1idG5fX2ljb25cIj48L3N2Zz5cblxuICAgICAgICB7eyAnc2VhcmNoRmllbGRzLmNsZWFyQnV0dG9uVGV4dCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwib2JzLmV4cGFuZGVkXCJcbiAgICAgICAgY2RzQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwic2VhcmNoLWZpZWxkcy1zZWFyY2gtYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cInNlYXJjaCgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgIGxvYWRpbmcgfHwgbm9TZWFyY2hGaWVsZHMgfHwgKGhhc1ZhbGlkVmFsdWVzJCB8IGFzeW5jKSA9PT0gZmFsc2UgfHwgaW5wdXREaXNhYmxlZFxuICAgICAgICBcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgaWQ9XCJzZWFyY2hcIlxuICAgICAgPlxuICAgICAgICA8c3ZnIGNkc0ljb249XCJzZWFyY2hcIiBzaXplPVwiMTZcIiBjbGFzcz1cImNkcy0tYnRuX19pY29uXCI+PC9zdmc+XG5cbiAgICAgICAge3sgJ3NlYXJjaEZpZWxkcy5zZWFyY2hCdXR0b25UZXh0JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNub1NlYXJjaEZpZWxkc1RlbXBsYXRlIGxldC1ub1NlYXJjaEZpZWxkcz1cIm5vU2VhcmNoRmllbGRzXCI+XG4gIDxkaXYgY2xhc3M9XCJuby1zZWFyY2gtZmllbGRzLW1lc3NhZ2VcIiAqbmdJZj1cIm5vU2VhcmNoRmllbGRzXCI+XG4gICAgPHYtcGFyYWdyYXBoIGRhdGFUZXN0SWQ9XCJzZWFyY2gtZmllbGRzLW5vLWZpZWxkc1wiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFtjZW50ZXJdPVwidHJ1ZVwiPnt7XG4gICAgICAnc2VhcmNoRmllbGRzLm5vbmVDb25maWd1cmVkJyB8IHRyYW5zbGF0ZVxuICAgIH19PC92LXBhcmFncmFwaD5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright 2015-2024 Ritense BV, the Netherlands.
|
|
3
3
|
*
|
|
4
4
|
* Licensed under EUPL, Version 1.2 (the "License");
|
|
5
|
-
*
|
|
5
|
+
* You may not use this file except in compliance with the License.
|
|
6
6
|
* You may obtain a copy of the License at
|
|
7
7
|
*
|
|
8
8
|
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
|
@@ -50,6 +50,26 @@ export class ValtimoCdsModalDirective {
|
|
|
50
50
|
setStyle() {
|
|
51
51
|
this.renderer.setStyle(this.document.body, 'overflow', 'hidden', RendererStyleFlags2.Important);
|
|
52
52
|
this.renderer.setStyle(this.document.documentElement, 'overflow', 'hidden', RendererStyleFlags2.Important);
|
|
53
|
+
this.preventModalCloseButtonTooltip();
|
|
54
|
+
}
|
|
55
|
+
preventModalCloseButtonTooltip() {
|
|
56
|
+
const modalElement = this.elementRef.nativeElement;
|
|
57
|
+
const closeButton = modalElement.querySelector('.cds--modal-close');
|
|
58
|
+
let attempts = 0;
|
|
59
|
+
const maxAttempts = 100;
|
|
60
|
+
const blurIfFocused = () => {
|
|
61
|
+
if (!closeButton || attempts >= maxAttempts) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (this.document.activeElement === closeButton) {
|
|
65
|
+
closeButton.blur();
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
attempts++;
|
|
69
|
+
requestAnimationFrame(blurIfFocused);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
requestAnimationFrame(blurIfFocused);
|
|
53
73
|
}
|
|
54
74
|
removeStyle() {
|
|
55
75
|
this.renderer.removeStyle(this.document.body, 'overflow');
|
|
@@ -65,4 +85,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
65
85
|
type: Inject,
|
|
66
86
|
args: [DOCUMENT]
|
|
67
87
|
}] }, { type: i0.ElementRef }, { type: i0.Renderer2 }] });
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdGltby1jZHMtbW9kYWwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby9jb21wb25lbnRzL3NyYy9saWIvZGlyZWN0aXZlcy92YWx0aW1vLWNkcy1tb2RhbC92YWx0aW1vLWNkcy1tb2RhbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUVMLFNBQVMsRUFFVCxNQUFNLEVBR04sbUJBQW1CLEdBQ3BCLE1BQU0sZUFBZSxDQUFDOztBQUd2QixNQUFNLE9BQU8sd0JBQXdCO0lBR25DLFlBQzRCLFFBQWtCLEVBQzNCLFVBQXNCLEVBQ3RCLFFBQW1CO1FBRlYsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUMzQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFpQjlCLHNCQUFpQixHQUFHLENBQUMsUUFBd0IsRUFBUSxFQUFFO1lBQzdELE1BQU0sbUJBQW1CLEdBQUcsaUJBQWlCLENBQUM7WUFFOUMsSUFBSSxRQUFRLENBQUMsYUFBYSxLQUFLLG1CQUFtQixFQUFFLENBQUM7Z0JBQ25ELE1BQU0sSUFBSSxHQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUVsRSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUM3QixJQUFJLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQzt3QkFDcEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNsQixDQUFDO3lCQUFNLElBQUksSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO3dCQUM1QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ3JCLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUM7UUE5QkEsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxTQUEyQixFQUFFLEVBQUU7WUFDNUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQXdCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFO1lBQzVELFVBQVUsRUFBRSxJQUFJO1NBQ2pCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFtQk8sUUFBUTtRQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUM3QixVQUFVLEVBQ1YsUUFBUSxFQUNSLG1CQUFtQixDQUFDLFNBQVMsQ0FDOUIsQ0FBQztRQUVGLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFTyw4QkFBOEI7UUFDcEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUE0QixDQUFDO1FBQ2xFLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQWdCLENBQUM7UUFFbkYsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQztRQUV4QixNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUU7WUFDekIsSUFBSSxDQUFDLFdBQVcsSUFBSSxRQUFRLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQzVDLE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDaEQsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixRQUFRLEVBQUUsQ0FBQztnQkFDWCxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYscUJBQXFCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVPLFdBQVc7UUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdkUsQ0FBQzsrR0E5RVUsd0JBQXdCLGtCQUl6QixRQUFRO21HQUpQLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFEcEMsU0FBUzttQkFBQyxFQUFDLFFBQVEsRUFBRSxtQkFBbUIsRUFBQzs7MEJBS3JDLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdCxcbiAgT25EZXN0cm95LFxuICBSZW5kZXJlcjIsXG4gIFJlbmRlcmVyU3R5bGVGbGFnczIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtzZWxlY3RvcjogJ1t2YWx0aW1vQ2RzTW9kYWxdJ30pXG5leHBvcnQgY2xhc3MgVmFsdGltb0Nkc01vZGFsRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfbXV0YXRpb25PYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlcjogUmVuZGVyZXIyXG4gICkge1xuICAgIHRoaXMuX211dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zOiBNdXRhdGlvblJlY29yZFtdKSA9PiB7XG4gICAgICBtdXRhdGlvbnMuZm9yRWFjaCgobXV0YXRpb246IE11dGF0aW9uUmVjb3JkKSA9PiB0aGlzLmF0dHJpYnV0ZU11dGF0aW9uKG11dGF0aW9uKSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB7XG4gICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fbXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBwcml2YXRlIGF0dHJpYnV0ZU11dGF0aW9uID0gKG11dGF0aW9uOiBNdXRhdGlvblJlY29yZCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IE9QRU5fQVRUUklCVVRFX05BTUUgPSAnbmctcmVmbGVjdC1vcGVuJztcblxuICAgIGlmIChtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSBPUEVOX0FUVFJJQlVURV9OQU1FKSB7XG4gICAgICBjb25zdCBvcGVuOiAndHJ1ZScgfCAnZmFsc2UnID1cbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKE9QRU5fQVRUUklCVVRFX05BTUUpO1xuXG4gICAgICBpZiAodHlwZW9mIG9wZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChvcGVuID09PSAndHJ1ZScpIHtcbiAgICAgICAgICB0aGlzLnNldFN0eWxlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlbiA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgIHRoaXMucmVtb3ZlU3R5bGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHNldFN0eWxlKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5kb2N1bWVudC5ib2R5LCAnb3ZlcmZsb3cnLCAnaGlkZGVuJywgUmVuZGVyZXJTdHlsZUZsYWdzMi5JbXBvcnRhbnQpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgICdvdmVyZmxvdycsXG4gICAgICAnaGlkZGVuJyxcbiAgICAgIFJlbmRlcmVyU3R5bGVGbGFnczIuSW1wb3J0YW50XG4gICAgKTtcblxuICAgIHRoaXMucHJldmVudE1vZGFsQ2xvc2VCdXR0b25Ub29sdGlwKCk7XG4gIH1cblxuICBwcml2YXRlIHByZXZlbnRNb2RhbENsb3NlQnV0dG9uVG9vbHRpcCgpOiB2b2lkIHtcbiAgICBjb25zdCBtb2RhbEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBjbG9zZUJ1dHRvbiA9IG1vZGFsRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuY2RzLS1tb2RhbC1jbG9zZScpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICBjb25zdCBtYXhBdHRlbXB0cyA9IDEwMDtcblxuICAgIGNvbnN0IGJsdXJJZkZvY3VzZWQgPSAoKSA9PiB7XG4gICAgICBpZiAoIWNsb3NlQnV0dG9uIHx8IGF0dGVtcHRzID49IG1heEF0dGVtcHRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gY2xvc2VCdXR0b24pIHtcbiAgICAgICAgY2xvc2VCdXR0b24uYmx1cigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXR0ZW1wdHMrKztcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGJsdXJJZkZvY3VzZWQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYmx1cklmRm9jdXNlZCk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVN0eWxlKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUodGhpcy5kb2N1bWVudC5ib2R5LCAnb3ZlcmZsb3cnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnb3ZlcmZsb3cnKTtcbiAgfVxufVxuIl19
|