@valtimo/object-management 12.3.1 → 12.4.1
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/object-management-detail-container/tabs/object-management-detail/object-management-detail.component.mjs +3 -3
- package/esm2022/lib/components/object-management-detail-container/tabs/object-management-list-columns/object-management-list-columns.component.mjs +3 -3
- package/esm2022/lib/components/object-management-detail-container/tabs/object-management-list-search-fields/object-management-list-search-fields.component.mjs +3 -3
- package/esm2022/lib/components/object-management-modal/object-management-modal.component.mjs +3 -3
- package/esm2022/lib/components/object-management-upload-modal/object-management-upload-modal.component.mjs +3 -3
- package/fesm2022/valtimo-object-management.mjs +10 -10
- package/fesm2022/valtimo-object-management.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -329,13 +329,13 @@ export class ObjectManagementListSearchFieldsComponent {
|
|
|
329
329
|
};
|
|
330
330
|
}
|
|
331
331
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ObjectManagementListSearchFieldsComponent, deps: [{ token: i1.ObjectManagementService }, { token: i2.ActivatedRoute }, { token: i3.TranslateService }, { token: i4.ConfigService }, { token: i5.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
332
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ObjectManagementListSearchFieldsComponent, selector: "valtimo-object-management-list-search-fields", viewQueries: [{ propertyName: "moveRowButtonsTemplateRef", first: true, predicate: ["moveRowButtons"], descendants: true }], 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<ng-container\n *ngIf=\"{\n searchFields: translatedObjectManagementListSearchFields$ | async,\n fields: objectManagementFields$ | async,\n objectId: objectId$ | async,\n downloadUrl: downloadUrl$ | async,\n downloadName: downloadName$ | async,\n loading: loading$ | async\n } as obs\"\n>\n <div class=\"container-fluid pr-0 pl-0\">\n <div class=\"text-right\">\n <div class=\"btn-group mt-m3px mb-3 mr-2\">\n <ng-container *ngTemplateOutlet=\"buttons; context: {obs: obs}\"></ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"!obs.loading; else loading\">\n <ng-container *ngIf=\"obs.searchFields?.length > 0; else noConfigWarning\">\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"createEditModal\"></ng-container>\n <ng-container *ngTemplateOutlet=\"deleteModal\"></ng-container>\n </div>\n</ng-container>\n\n<ng-template #buttons let-obs=\"obs\">\n <a\n cdsLink\n class=\"center-link\"\n [href]=\"obs.downloadUrl\"\n [download]=\"obs.downloadName\"\n [disabled]=\"\n !obs.downloadUrl ||\n !obs.downloadName ||\n obs.searchFields?.length < 1 ||\n obs.disableInput ||\n obs.loading\n \"\n >\n {{ 'searchFieldsOverview.download' | translate }}\n </a>\n <button\n (click)=\"openModal('create')\"\n cdsButton=\"primary\"\n size=\"md\"\n [disabled]=\"obs.loading\"\n class=\"ml-3\"\n >\n {{ 'searchFieldsOverview.add' | translate }}\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</ng-template>\n\n<ng-template #moveRowButtons let-index=\"index\" let-length=\"length\">\n <div\n class=\"move-row-buttons\"\n *ngIf=\"{\n disableInput: disableInput$ | async,\n objectId: objectId$ | async\n } as obs\"\n >\n <i\n class=\"mdi mdi-delete btn btn-outline-danger mr-1\"\n (click)=\"deleteRow(index, $event)\"\n [ngClass]=\"{'disabled disabled-move-row-button': obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-up-bold btn btn-outline-primary mr-1\"\n (click)=\"moveRow(index, true, $event, obs.objectId)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === 0 || obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-down-bold btn btn-outline-secondary\"\n (click)=\"moveRow(index, false, $event, obs.objectId)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === length - 1 || obs.disableInput}\"\n ></i>\n </div>\n</ng-template>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-list\n [items]=\"obs.searchFields\"\n [fields]=\"obs.fields\"\n [viewMode]=\"false\"\n [header]=\"false\"\n *ngIf=\"obs.searchFields; else loading\"\n [lastColumnTemplate]=\"moveRowButtonsTemplateRef\"\n (rowClicked)=\"columnRowClicked($event)\"\n >\n </valtimo-list>\n</ng-template>\n\n<ng-template #createEditModal>\n <cds-modal\n valtimoCdsModal\n *ngIf=\"{\n type: currentModalType$ | async,\n show: showModal$ | async,\n valid: valid$ | async,\n disableInput: disableInput$ | async,\n validKey: validKey$ | async\n } as modalObs\"\n [open]=\"modalObs.show\"\n >\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"closeModal()\">\n <h3 cdsModalHeaderHeading>\n {{\n modalObs.type === 'create'\n ? ('searchFieldsOverview.add' | translate)\n : ('searchFieldsOverview.edit' | translate)\n }}\n </h3>\n </cds-modal-header>\n <section cdsModalContent>\n <ng-container *ngTemplateOutlet=\"modalContent; context: {modalObs: modalObs}\"></ng-container>\n </section>\n <ng-container *ngTemplateOutlet=\"modalFooter; context: {modalObs: modalObs}\"></ng-container>\n </cds-modal>\n</ng-template>\n\n<ng-template #modalContent let-modalObs=\"modalObs\">\n <form [formGroup]=\"formGroup\" class=\"list-column-form\">\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'searchFieldsOverview.title' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.title' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"title\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label\n [disabled]=\"modalObs.disableInput || modalObs.type === 'edit'\"\n [invalid]=\"modalObs.validKey === false\"\n [invalidText]=\"'searchFieldsOverview.uniqueKeyWarning' | translate\"\n >\n <span class=\"label-with-tooltip\">\n {{ 'searchFieldsOverview.key' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.key' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"key\" [invalid]=\"modalObs.validKey === false\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'searchFieldsOverview.path' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.objectsApiPath' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"path\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'searchFieldsOverview.dataType' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.dataType' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown formControlName=\"dataType\" [disabled]=\"modalObs.disableInput\">\n <cds-dropdown-list [items]=\"dataTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'searchFieldsOverview.fieldType' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.fieldType' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown formControlName=\"fieldType\" [disabled]=\"modalObs.disableInput\">\n <cds-dropdown-list [items]=\"fieldTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n </form>\n</ng-template>\n\n<ng-template #modalFooter let-modalObs=\"modalObs\">\n <cds-modal-footer>\n <ng-container>\n <button\n cdsButton=\"secondary\"\n [attr.modal-primary-focus]=\"true\"\n (click)=\"closeModal()\"\n [disabled]=\"modalObs.disableInput\"\n >\n {{ 'searchFieldsOverview.close' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n [attr.modal-primary-focus]=\"true\"\n [disabled]=\"modalObs.valid === false\"\n (click)=\"saveListSearchFields()\"\n [disabled]=\"\n modalObs.disableInput || modalObs.valid === false || modalObs.validKey === false\n \"\n >\n {{ 'searchFieldsOverview.save' | translate }}\n </button>\n </ng-container>\n </cds-modal-footer>\n</ng-template>\n\n<ng-template #deleteModal>\n <valtimo-confirmation-modal\n [showModalSubject$]=\"showDeleteModal$\"\n [outputOnConfirm]=\"deleteRowIndex$ | async\"\n (confirmEvent)=\"deleteRowConfirmation($event)\"\n confirmButtonTextTranslationKey=\"searchFieldsOverview.deleteSearchField\"\n titleTranslationKey=\"searchFieldsOverview.searchField\"\n contentTranslationKey=\"searchFieldsOverview.deleteSearchFieldConfirmation\"\n ></valtimo-confirmation-modal>\n</ng-template>\n\n<ng-template #noConfigWarning>\n <div class=\"pl-2 pr-2 pb-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'info',\n title: 'searchFieldsOverview.noSearchFieldsConfiguredWarningTitle' | translate,\n showClose: false\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"loading-icon\"><cds-loading></cds-loading></div>\n</ng-template>\n", styles: ["::ng-deep .tab-container{min-height:unset!important}::ng-deep .cds--inline-notification{max-width:100%}.label-with-tooltip{display:flex;align-items:center}.cds--text-input__field-wrapper:not(:last-child){margin-bottom:1rem}.display-type-dropdown{width:300px}.list-column-form{margin-bottom:3rem}.select-label{padding-bottom:.5rem;width:250px}.loading-icon{width:100%;display:flex;align-items:center;justify-content:center}.center-link{display:flex;align-items:center}::ng-deep .move-row-buttons{display:flex;flex-direction:row;justify-content:flex-end;padding-right:13px}\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: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i7.ListComponent, selector: "valtimo-list", inputs: ["items", "fields", "pagination", "viewMode", "isSearchable", "header", "actions", "paginationIdentifier", "initialSortState", "lastColumnTemplate"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged"] }, { kind: "component", type: i8.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i8.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "directive", type: i8.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: i7.TooltipIconComponent, selector: "v-tooltip-icon", inputs: ["tooltip", "disabled"] }, { kind: "component", type: i8.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i8.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i8.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i8.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i8.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "component", type: i8.Notification, selector: "cds-notification, cds-inline-notification, ibm-notification, ibm-inline-notification", inputs: ["notificationObj"] }, { kind: "component", type: i8.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "component", type: i8.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i8.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "directive", type: i8.Link, selector: "[cdsLink], [ibmLink]", inputs: ["inline", "disabled"] }, { kind: "directive", type: i8.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i9.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i9.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i9.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i7.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "showOptionalButton", "optionalButtonText", "optionalButtonTextTranslationKey", "optionalButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm", "outputOnOptional", "spacerAfterCancelButton"], outputs: ["confirmEvent", "optionalEvent", "cancelEvent"] }, { kind: "directive", type: i7.ValtimoCdsModalDirective, selector: "[valtimoCdsModal]" }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
|
|
332
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ObjectManagementListSearchFieldsComponent, selector: "valtimo-object-management-list-search-fields", viewQueries: [{ propertyName: "moveRowButtonsTemplateRef", first: true, predicate: ["moveRowButtons"], descendants: true }], 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<ng-container\n *ngIf=\"{\n searchFields: translatedObjectManagementListSearchFields$ | async,\n fields: objectManagementFields$ | async,\n objectId: objectId$ | async,\n downloadUrl: downloadUrl$ | async,\n downloadName: downloadName$ | async,\n loading: loading$ | async,\n } as obs\"\n>\n <div class=\"container-fluid pr-0 pl-0\">\n <div class=\"text-right\">\n <div class=\"btn-group mt-m3px mb-3 mr-2\">\n <ng-container *ngTemplateOutlet=\"buttons; context: {obs: obs}\"></ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"!obs.loading; else loading\">\n <ng-container *ngIf=\"obs.searchFields?.length > 0; else noConfigWarning\">\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"createEditModal\"></ng-container>\n <ng-container *ngTemplateOutlet=\"deleteModal\"></ng-container>\n </div>\n</ng-container>\n\n<ng-template #buttons let-obs=\"obs\">\n <a\n cdsLink\n class=\"center-link\"\n [href]=\"obs.downloadUrl\"\n [download]=\"obs.downloadName\"\n [disabled]=\"\n !obs.downloadUrl ||\n !obs.downloadName ||\n obs.searchFields?.length < 1 ||\n obs.disableInput ||\n obs.loading\n \"\n >\n {{ 'searchFieldsOverview.download' | translate }}\n </a>\n <button\n (click)=\"openModal('create')\"\n cdsButton=\"primary\"\n size=\"md\"\n [disabled]=\"obs.loading\"\n class=\"ml-3\"\n >\n {{ 'searchFieldsOverview.add' | translate }}\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</ng-template>\n\n<ng-template #moveRowButtons let-index=\"index\" let-length=\"length\">\n <div\n class=\"move-row-buttons\"\n *ngIf=\"{\n disableInput: disableInput$ | async,\n objectId: objectId$ | async,\n } as obs\"\n >\n <i\n class=\"mdi mdi-delete btn btn-outline-danger mr-1\"\n (click)=\"deleteRow(index, $event)\"\n [ngClass]=\"{'disabled disabled-move-row-button': obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-up-bold btn btn-outline-primary mr-1\"\n (click)=\"moveRow(index, true, $event, obs.objectId)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === 0 || obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-down-bold btn btn-outline-secondary\"\n (click)=\"moveRow(index, false, $event, obs.objectId)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === length - 1 || obs.disableInput}\"\n ></i>\n </div>\n</ng-template>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-list\n [items]=\"obs.searchFields\"\n [fields]=\"obs.fields\"\n [viewMode]=\"false\"\n [header]=\"false\"\n *ngIf=\"obs.searchFields; else loading\"\n [lastColumnTemplate]=\"moveRowButtonsTemplateRef\"\n (rowClicked)=\"columnRowClicked($event)\"\n >\n </valtimo-list>\n</ng-template>\n\n<ng-template #createEditModal>\n <cds-modal\n valtimoCdsModal\n *ngIf=\"{\n type: currentModalType$ | async,\n show: showModal$ | async,\n valid: valid$ | async,\n disableInput: disableInput$ | async,\n validKey: validKey$ | async,\n } as modalObs\"\n [open]=\"modalObs.show\"\n >\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"closeModal()\">\n <h3 cdsModalHeaderHeading>\n {{\n modalObs.type === 'create'\n ? ('searchFieldsOverview.add' | translate)\n : ('searchFieldsOverview.edit' | translate)\n }}\n </h3>\n </cds-modal-header>\n <section cdsModalContent>\n <ng-container *ngTemplateOutlet=\"modalContent; context: {modalObs: modalObs}\"></ng-container>\n </section>\n <ng-container *ngTemplateOutlet=\"modalFooter; context: {modalObs: modalObs}\"></ng-container>\n </cds-modal>\n</ng-template>\n\n<ng-template #modalContent let-modalObs=\"modalObs\">\n <form [formGroup]=\"formGroup\" class=\"list-column-form\">\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'searchFieldsOverview.title' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.title' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"title\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label\n [disabled]=\"modalObs.disableInput || modalObs.type === 'edit'\"\n [invalid]=\"modalObs.validKey === false\"\n [invalidText]=\"'searchFieldsOverview.uniqueKeyWarning' | translate\"\n >\n <span class=\"label-with-tooltip\">\n {{ 'searchFieldsOverview.key' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.key' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"key\" [invalid]=\"modalObs.validKey === false\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'searchFieldsOverview.path' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.objectsApiPath' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"path\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'searchFieldsOverview.dataType' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.dataType' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown formControlName=\"dataType\" [disabled]=\"modalObs.disableInput\">\n <cds-dropdown-list [items]=\"dataTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'searchFieldsOverview.fieldType' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.fieldType' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown formControlName=\"fieldType\" [disabled]=\"modalObs.disableInput\">\n <cds-dropdown-list [items]=\"fieldTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n </form>\n</ng-template>\n\n<ng-template #modalFooter let-modalObs=\"modalObs\">\n <cds-modal-footer>\n <ng-container>\n <button\n cdsButton=\"secondary\"\n [attr.modal-primary-focus]=\"true\"\n (click)=\"closeModal()\"\n [disabled]=\"modalObs.disableInput\"\n >\n {{ 'searchFieldsOverview.close' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n [attr.modal-primary-focus]=\"true\"\n [disabled]=\"modalObs.valid === false\"\n (click)=\"saveListSearchFields()\"\n [disabled]=\"\n modalObs.disableInput || modalObs.valid === false || modalObs.validKey === false\n \"\n >\n {{ 'searchFieldsOverview.save' | translate }}\n </button>\n </ng-container>\n </cds-modal-footer>\n</ng-template>\n\n<ng-template #deleteModal>\n <valtimo-confirmation-modal\n [showModalSubject$]=\"showDeleteModal$\"\n [outputOnConfirm]=\"deleteRowIndex$ | async\"\n (confirmEvent)=\"deleteRowConfirmation($event)\"\n confirmButtonTextTranslationKey=\"searchFieldsOverview.deleteSearchField\"\n titleTranslationKey=\"searchFieldsOverview.searchField\"\n contentTranslationKey=\"searchFieldsOverview.deleteSearchFieldConfirmation\"\n ></valtimo-confirmation-modal>\n</ng-template>\n\n<ng-template #noConfigWarning>\n <div class=\"pl-2 pr-2 pb-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'info',\n title: 'searchFieldsOverview.noSearchFieldsConfiguredWarningTitle' | translate,\n showClose: false,\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"loading-icon\"><cds-loading></cds-loading></div>\n</ng-template>\n", styles: ["::ng-deep .tab-container{min-height:unset!important}::ng-deep .cds--inline-notification{max-width:100%}.label-with-tooltip{display:flex;align-items:center}.cds--text-input__field-wrapper:not(:last-child){margin-bottom:1rem}.display-type-dropdown{width:300px}.list-column-form{margin-bottom:3rem}.select-label{padding-bottom:.5rem;width:250px}.loading-icon{width:100%;display:flex;align-items:center;justify-content:center}.center-link{display:flex;align-items:center}::ng-deep .move-row-buttons{display:flex;flex-direction:row;justify-content:flex-end;padding-right:13px}\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: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i7.ListComponent, selector: "valtimo-list", inputs: ["items", "fields", "pagination", "viewMode", "isSearchable", "header", "actions", "paginationIdentifier", "initialSortState", "lastColumnTemplate"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged"] }, { kind: "component", type: i8.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i8.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "directive", type: i8.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: i7.TooltipIconComponent, selector: "v-tooltip-icon", inputs: ["tooltip", "disabled"] }, { kind: "component", type: i8.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i8.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i8.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i8.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i8.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "component", type: i8.Notification, selector: "cds-notification, cds-inline-notification, ibm-notification, ibm-inline-notification", inputs: ["notificationObj"] }, { kind: "component", type: i8.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "component", type: i8.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i8.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "directive", type: i8.Link, selector: "[cdsLink], [ibmLink]", inputs: ["inline", "disabled"] }, { kind: "directive", type: i8.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i9.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i9.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i9.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i7.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "showOptionalButton", "optionalButtonText", "optionalButtonTextTranslationKey", "optionalButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm", "outputOnOptional", "spacerAfterCancelButton"], outputs: ["confirmEvent", "optionalEvent", "cancelEvent"] }, { kind: "directive", type: i7.ValtimoCdsModalDirective, selector: "[valtimoCdsModal]" }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
|
|
333
333
|
}
|
|
334
334
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ObjectManagementListSearchFieldsComponent, decorators: [{
|
|
335
335
|
type: Component,
|
|
336
|
-
args: [{ selector: 'valtimo-object-management-list-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<ng-container\n *ngIf=\"{\n searchFields: translatedObjectManagementListSearchFields$ | async,\n fields: objectManagementFields$ | async,\n objectId: objectId$ | async,\n downloadUrl: downloadUrl$ | async,\n downloadName: downloadName$ | async,\n loading: loading$ | async\n } as obs\"\n>\n <div class=\"container-fluid pr-0 pl-0\">\n <div class=\"text-right\">\n <div class=\"btn-group mt-m3px mb-3 mr-2\">\n <ng-container *ngTemplateOutlet=\"buttons; context: {obs: obs}\"></ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"!obs.loading; else loading\">\n <ng-container *ngIf=\"obs.searchFields?.length > 0; else noConfigWarning\">\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"createEditModal\"></ng-container>\n <ng-container *ngTemplateOutlet=\"deleteModal\"></ng-container>\n </div>\n</ng-container>\n\n<ng-template #buttons let-obs=\"obs\">\n <a\n cdsLink\n class=\"center-link\"\n [href]=\"obs.downloadUrl\"\n [download]=\"obs.downloadName\"\n [disabled]=\"\n !obs.downloadUrl ||\n !obs.downloadName ||\n obs.searchFields?.length < 1 ||\n obs.disableInput ||\n obs.loading\n \"\n >\n {{ 'searchFieldsOverview.download' | translate }}\n </a>\n <button\n (click)=\"openModal('create')\"\n cdsButton=\"primary\"\n size=\"md\"\n [disabled]=\"obs.loading\"\n class=\"ml-3\"\n >\n {{ 'searchFieldsOverview.add' | translate }}\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</ng-template>\n\n<ng-template #moveRowButtons let-index=\"index\" let-length=\"length\">\n <div\n class=\"move-row-buttons\"\n *ngIf=\"{\n disableInput: disableInput$ | async,\n objectId: objectId$ | async\n } as obs\"\n >\n <i\n class=\"mdi mdi-delete btn btn-outline-danger mr-1\"\n (click)=\"deleteRow(index, $event)\"\n [ngClass]=\"{'disabled disabled-move-row-button': obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-up-bold btn btn-outline-primary mr-1\"\n (click)=\"moveRow(index, true, $event, obs.objectId)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === 0 || obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-down-bold btn btn-outline-secondary\"\n (click)=\"moveRow(index, false, $event, obs.objectId)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === length - 1 || obs.disableInput}\"\n ></i>\n </div>\n</ng-template>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-list\n [items]=\"obs.searchFields\"\n [fields]=\"obs.fields\"\n [viewMode]=\"false\"\n [header]=\"false\"\n *ngIf=\"obs.searchFields; else loading\"\n [lastColumnTemplate]=\"moveRowButtonsTemplateRef\"\n (rowClicked)=\"columnRowClicked($event)\"\n >\n </valtimo-list>\n</ng-template>\n\n<ng-template #createEditModal>\n <cds-modal\n valtimoCdsModal\n *ngIf=\"{\n type: currentModalType$ | async,\n show: showModal$ | async,\n valid: valid$ | async,\n disableInput: disableInput$ | async,\n validKey: validKey$ | async\n } as modalObs\"\n [open]=\"modalObs.show\"\n >\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"closeModal()\">\n <h3 cdsModalHeaderHeading>\n {{\n modalObs.type === 'create'\n ? ('searchFieldsOverview.add' | translate)\n : ('searchFieldsOverview.edit' | translate)\n }}\n </h3>\n </cds-modal-header>\n <section cdsModalContent>\n <ng-container *ngTemplateOutlet=\"modalContent; context: {modalObs: modalObs}\"></ng-container>\n </section>\n <ng-container *ngTemplateOutlet=\"modalFooter; context: {modalObs: modalObs}\"></ng-container>\n </cds-modal>\n</ng-template>\n\n<ng-template #modalContent let-modalObs=\"modalObs\">\n <form [formGroup]=\"formGroup\" class=\"list-column-form\">\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'searchFieldsOverview.title' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.title' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"title\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label\n [disabled]=\"modalObs.disableInput || modalObs.type === 'edit'\"\n [invalid]=\"modalObs.validKey === false\"\n [invalidText]=\"'searchFieldsOverview.uniqueKeyWarning' | translate\"\n >\n <span class=\"label-with-tooltip\">\n {{ 'searchFieldsOverview.key' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.key' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"key\" [invalid]=\"modalObs.validKey === false\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'searchFieldsOverview.path' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.objectsApiPath' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"path\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'searchFieldsOverview.dataType' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.dataType' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown formControlName=\"dataType\" [disabled]=\"modalObs.disableInput\">\n <cds-dropdown-list [items]=\"dataTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'searchFieldsOverview.fieldType' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.fieldType' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown formControlName=\"fieldType\" [disabled]=\"modalObs.disableInput\">\n <cds-dropdown-list [items]=\"fieldTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n </form>\n</ng-template>\n\n<ng-template #modalFooter let-modalObs=\"modalObs\">\n <cds-modal-footer>\n <ng-container>\n <button\n cdsButton=\"secondary\"\n [attr.modal-primary-focus]=\"true\"\n (click)=\"closeModal()\"\n [disabled]=\"modalObs.disableInput\"\n >\n {{ 'searchFieldsOverview.close' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n [attr.modal-primary-focus]=\"true\"\n [disabled]=\"modalObs.valid === false\"\n (click)=\"saveListSearchFields()\"\n [disabled]=\"\n modalObs.disableInput || modalObs.valid === false || modalObs.validKey === false\n \"\n >\n {{ 'searchFieldsOverview.save' | translate }}\n </button>\n </ng-container>\n </cds-modal-footer>\n</ng-template>\n\n<ng-template #deleteModal>\n <valtimo-confirmation-modal\n [showModalSubject$]=\"showDeleteModal$\"\n [outputOnConfirm]=\"deleteRowIndex$ | async\"\n (confirmEvent)=\"deleteRowConfirmation($event)\"\n confirmButtonTextTranslationKey=\"searchFieldsOverview.deleteSearchField\"\n titleTranslationKey=\"searchFieldsOverview.searchField\"\n contentTranslationKey=\"searchFieldsOverview.deleteSearchFieldConfirmation\"\n ></valtimo-confirmation-modal>\n</ng-template>\n\n<ng-template #noConfigWarning>\n <div class=\"pl-2 pr-2 pb-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'info',\n title: 'searchFieldsOverview.noSearchFieldsConfiguredWarningTitle' | translate,\n showClose: false\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"loading-icon\"><cds-loading></cds-loading></div>\n</ng-template>\n", styles: ["::ng-deep .tab-container{min-height:unset!important}::ng-deep .cds--inline-notification{max-width:100%}.label-with-tooltip{display:flex;align-items:center}.cds--text-input__field-wrapper:not(:last-child){margin-bottom:1rem}.display-type-dropdown{width:300px}.list-column-form{margin-bottom:3rem}.select-label{padding-bottom:.5rem;width:250px}.loading-icon{width:100%;display:flex;align-items:center;justify-content:center}.center-link{display:flex;align-items:center}::ng-deep .move-row-buttons{display:flex;flex-direction:row;justify-content:flex-end;padding-right:13px}\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"] }]
|
|
336
|
+
args: [{ selector: 'valtimo-object-management-list-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<ng-container\n *ngIf=\"{\n searchFields: translatedObjectManagementListSearchFields$ | async,\n fields: objectManagementFields$ | async,\n objectId: objectId$ | async,\n downloadUrl: downloadUrl$ | async,\n downloadName: downloadName$ | async,\n loading: loading$ | async,\n } as obs\"\n>\n <div class=\"container-fluid pr-0 pl-0\">\n <div class=\"text-right\">\n <div class=\"btn-group mt-m3px mb-3 mr-2\">\n <ng-container *ngTemplateOutlet=\"buttons; context: {obs: obs}\"></ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"!obs.loading; else loading\">\n <ng-container *ngIf=\"obs.searchFields?.length > 0; else noConfigWarning\">\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"createEditModal\"></ng-container>\n <ng-container *ngTemplateOutlet=\"deleteModal\"></ng-container>\n </div>\n</ng-container>\n\n<ng-template #buttons let-obs=\"obs\">\n <a\n cdsLink\n class=\"center-link\"\n [href]=\"obs.downloadUrl\"\n [download]=\"obs.downloadName\"\n [disabled]=\"\n !obs.downloadUrl ||\n !obs.downloadName ||\n obs.searchFields?.length < 1 ||\n obs.disableInput ||\n obs.loading\n \"\n >\n {{ 'searchFieldsOverview.download' | translate }}\n </a>\n <button\n (click)=\"openModal('create')\"\n cdsButton=\"primary\"\n size=\"md\"\n [disabled]=\"obs.loading\"\n class=\"ml-3\"\n >\n {{ 'searchFieldsOverview.add' | translate }}\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</ng-template>\n\n<ng-template #moveRowButtons let-index=\"index\" let-length=\"length\">\n <div\n class=\"move-row-buttons\"\n *ngIf=\"{\n disableInput: disableInput$ | async,\n objectId: objectId$ | async,\n } as obs\"\n >\n <i\n class=\"mdi mdi-delete btn btn-outline-danger mr-1\"\n (click)=\"deleteRow(index, $event)\"\n [ngClass]=\"{'disabled disabled-move-row-button': obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-up-bold btn btn-outline-primary mr-1\"\n (click)=\"moveRow(index, true, $event, obs.objectId)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === 0 || obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-down-bold btn btn-outline-secondary\"\n (click)=\"moveRow(index, false, $event, obs.objectId)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === length - 1 || obs.disableInput}\"\n ></i>\n </div>\n</ng-template>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-list\n [items]=\"obs.searchFields\"\n [fields]=\"obs.fields\"\n [viewMode]=\"false\"\n [header]=\"false\"\n *ngIf=\"obs.searchFields; else loading\"\n [lastColumnTemplate]=\"moveRowButtonsTemplateRef\"\n (rowClicked)=\"columnRowClicked($event)\"\n >\n </valtimo-list>\n</ng-template>\n\n<ng-template #createEditModal>\n <cds-modal\n valtimoCdsModal\n *ngIf=\"{\n type: currentModalType$ | async,\n show: showModal$ | async,\n valid: valid$ | async,\n disableInput: disableInput$ | async,\n validKey: validKey$ | async,\n } as modalObs\"\n [open]=\"modalObs.show\"\n >\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"closeModal()\">\n <h3 cdsModalHeaderHeading>\n {{\n modalObs.type === 'create'\n ? ('searchFieldsOverview.add' | translate)\n : ('searchFieldsOverview.edit' | translate)\n }}\n </h3>\n </cds-modal-header>\n <section cdsModalContent>\n <ng-container *ngTemplateOutlet=\"modalContent; context: {modalObs: modalObs}\"></ng-container>\n </section>\n <ng-container *ngTemplateOutlet=\"modalFooter; context: {modalObs: modalObs}\"></ng-container>\n </cds-modal>\n</ng-template>\n\n<ng-template #modalContent let-modalObs=\"modalObs\">\n <form [formGroup]=\"formGroup\" class=\"list-column-form\">\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'searchFieldsOverview.title' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.title' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"title\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label\n [disabled]=\"modalObs.disableInput || modalObs.type === 'edit'\"\n [invalid]=\"modalObs.validKey === false\"\n [invalidText]=\"'searchFieldsOverview.uniqueKeyWarning' | translate\"\n >\n <span class=\"label-with-tooltip\">\n {{ 'searchFieldsOverview.key' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.key' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"key\" [invalid]=\"modalObs.validKey === false\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'searchFieldsOverview.path' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.objectsApiPath' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"path\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'searchFieldsOverview.dataType' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.dataType' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown formControlName=\"dataType\" [disabled]=\"modalObs.disableInput\">\n <cds-dropdown-list [items]=\"dataTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'searchFieldsOverview.fieldType' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'searchFieldsOverviewTooltips.fieldType' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown formControlName=\"fieldType\" [disabled]=\"modalObs.disableInput\">\n <cds-dropdown-list [items]=\"fieldTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n </form>\n</ng-template>\n\n<ng-template #modalFooter let-modalObs=\"modalObs\">\n <cds-modal-footer>\n <ng-container>\n <button\n cdsButton=\"secondary\"\n [attr.modal-primary-focus]=\"true\"\n (click)=\"closeModal()\"\n [disabled]=\"modalObs.disableInput\"\n >\n {{ 'searchFieldsOverview.close' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n [attr.modal-primary-focus]=\"true\"\n [disabled]=\"modalObs.valid === false\"\n (click)=\"saveListSearchFields()\"\n [disabled]=\"\n modalObs.disableInput || modalObs.valid === false || modalObs.validKey === false\n \"\n >\n {{ 'searchFieldsOverview.save' | translate }}\n </button>\n </ng-container>\n </cds-modal-footer>\n</ng-template>\n\n<ng-template #deleteModal>\n <valtimo-confirmation-modal\n [showModalSubject$]=\"showDeleteModal$\"\n [outputOnConfirm]=\"deleteRowIndex$ | async\"\n (confirmEvent)=\"deleteRowConfirmation($event)\"\n confirmButtonTextTranslationKey=\"searchFieldsOverview.deleteSearchField\"\n titleTranslationKey=\"searchFieldsOverview.searchField\"\n contentTranslationKey=\"searchFieldsOverview.deleteSearchFieldConfirmation\"\n ></valtimo-confirmation-modal>\n</ng-template>\n\n<ng-template #noConfigWarning>\n <div class=\"pl-2 pr-2 pb-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'info',\n title: 'searchFieldsOverview.noSearchFieldsConfiguredWarningTitle' | translate,\n showClose: false,\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"loading-icon\"><cds-loading></cds-loading></div>\n</ng-template>\n", styles: ["::ng-deep .tab-container{min-height:unset!important}::ng-deep .cds--inline-notification{max-width:100%}.label-with-tooltip{display:flex;align-items:center}.cds--text-input__field-wrapper:not(:last-child){margin-bottom:1rem}.display-type-dropdown{width:300px}.list-column-form{margin-bottom:3rem}.select-label{padding-bottom:.5rem;width:250px}.loading-icon{width:100%;display:flex;align-items:center;justify-content:center}.center-link{display:flex;align-items:center}::ng-deep .move-row-buttons{display:flex;flex-direction:row;justify-content:flex-end;padding-right:13px}\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"] }]
|
|
337
337
|
}], ctorParameters: () => [{ type: i1.ObjectManagementService }, { type: i2.ActivatedRoute }, { type: i3.TranslateService }, { type: i4.ConfigService }, { type: i5.DomSanitizer }], propDecorators: { moveRowButtonsTemplateRef: [{
|
|
338
338
|
type: ViewChild,
|
|
339
339
|
args: ['moveRowButtons']
|
|
340
340
|
}] } });
|
|
341
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LW1hbmFnZW1lbnQtbGlzdC1zZWFyY2gtZmllbGRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vb2JqZWN0LW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL29iamVjdC1tYW5hZ2VtZW50LWRldGFpbC1jb250YWluZXIvdGFicy9vYmplY3QtbWFuYWdlbWVudC1saXN0LXNlYXJjaC1maWVsZHMvb2JqZWN0LW1hbmFnZW1lbnQtbGlzdC1zZWFyY2gtZmllbGRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vb2JqZWN0LW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL29iamVjdC1tYW5hZ2VtZW50LWRldGFpbC1jb250YWluZXIvdGFicy9vYmplY3QtbWFuYWdlbWVudC1saXN0LXNlYXJjaC1maWVsZHMvb2JqZWN0LW1hbmFnZW1lbnQtbGlzdC1zZWFyY2gtZmllbGRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBZSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBQ2IsTUFBTSxFQUNOLEdBQUcsRUFFSCxFQUFFLEVBQ0YsU0FBUyxFQUNULE9BQU8sRUFDUCxTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBV2QsT0FBTyxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFXbEUsTUFBTSxPQUFPLHlDQUF5QztJQXdMcEQsWUFDbUIs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LEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDNUIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJO1lBQ3BCLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUc7WUFDaEMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRztTQUNuQyxDQUFDO0lBQ0osQ0FBQzsrR0FsYlUseUNBQXlDO21HQUF6Qyx5Q0FBeUMsaU5DbkR0RCw4d1NBc1FBOzs0RkRuTmEseUNBQXlDO2tCQUxyRCxTQUFTOytCQUNFLDhDQUE4QzsrTUFLcEIseUJBQXlCO3NCQUE1RCxTQUFTO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7Q29tcG9uZW50LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBzdGFydFdpdGgsXG4gIFN1YmplY3QsXG4gIHN3aXRjaE1hcCxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7RG9tU2FuaXRpemVyLCBTYWZlVXJsfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7XG4gIENvbmZpZ1NlcnZpY2UsXG4gIERlZmluaXRpb25Db2x1bW4sXG4gIFNlYXJjaEZpZWxkLFxuICBTZWFyY2hGaWVsZENvbHVtblZpZXcsXG4gIFNlYXJjaEZpZWxkRGF0YVR5cGUsXG4gIFNlYXJjaEZpZWxkRmllbGRUeXBlLFxufSBmcm9tICdAdmFsdGltby9jb25maWcnO1xuaW1wb3J0IHtMaXN0RmllbGR9IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCB0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0Zvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7TGlzdEl0ZW19IGZyb20gJ2NhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXIvZHJvcGRvd24vbGlzdC1pdGVtLmludGVyZmFjZSc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7T2JqZWN0TWFuYWdlbWVudFNlcnZpY2V9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL29iamVjdC1tYW5hZ2VtZW50LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLW9iamVjdC1tYW5hZ2VtZW50LWxpc3Qtc2VhcmNoLWZpZWxkcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9vYmplY3QtbWFuYWdlbWVudC1saXN0LXNlYXJjaC1maWVsZHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9vYmplY3QtbWFuYWdlbWVudC1saXN0LXNlYXJjaC1maWVsZHMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHNDb21wb25lbnQge1xuICBAVmlld0NoaWxkKCdtb3ZlUm93QnV0dG9ucycpIHB1YmxpYyBtb3ZlUm93QnV0dG9uc1RlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICByZWFkb25seSBkb3dubG9hZE5hbWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgZG93bmxvYWRVcmwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTYWZlVXJsPih1bmRlZmluZWQpO1xuICByZWFkb25seSBsb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGN1cnJlbnRNb2RhbFR5cGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCdjcmVhdGUnKTtcbiAgcmVhZG9ubHkgc2hvd01vZGFsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBkaXNhYmxlSW5wdXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHNob3dEZWxldGVNb2RhbCQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICByZWFkb25seSBkZWxldGVSb3dJbmRleCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG5cbiAgcmVhZG9ubHkgSU5WQUxJRF9LRVkgPSAnaW52YWxpZCc7XG4gIHJlYWRvbmx5IGZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIHRpdGxlOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGtleTogbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICBwYXRoOiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIGRhdGFUeXBlOiBuZXcgRm9ybUNvbnRyb2woe1xuICAgICAga2V5OiB0aGlzLklOVkFMSURfS0VZLFxuICAgIH0pLFxuICAgIGZpZWxkVHlwZTogbmV3IEZvcm1Db250cm9sKHtcbiAgICAgIGtleTogdGhpcy5JTlZBTElEX0tFWSxcbiAgICB9KSxcbiAgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ09MVU1OUzogQXJyYXk8RGVmaW5pdGlvbkNvbHVtbj4gPSBbXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgcHJvcGVydHlOYW1lOiAndGl0bGUnLFxuICAgICAgdHJhbnNsYXRpb25LZXk6ICd0aXRsZScsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdrZXknLFxuICAgICAgdHJhbnNsYXRpb25LZXk6ICdrZXknLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgcHJvcGVydHlOYW1lOiAncGF0aCcsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ3BhdGgnLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgcHJvcGVydHlOYW1lOiAnZGF0YVR5cGUnLFxuICAgICAgdHJhbnNsYXRpb25LZXk6ICdkYXRhVHlwZScsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdmaWVsZFR5cGUnLFxuICAgICAgdHJhbnNsYXRpb25LZXk6ICdmaWVsZFR5cGUnLFxuICAgIH0sXG4gIF07XG4gIHJlYWRvbmx5IERBVEFfVFlQRVM6IEFycmF5PFNlYXJjaEZpZWxkRGF0YVR5cGU+ID0gW1xuICAgICd0ZXh0JyxcbiAgICAnbnVtYmVyJyxcbiAgICAnZGF0ZScsXG4gICAgJ2RhdGV0aW1lJyxcbiAgICAnYm9vbGVhbicsXG4gIF07XG4gIHByaXZhdGUgcmVhZG9ubHkgRklFTERfVFlQRVM6IEFycmF5PFNlYXJjaEZpZWxkRmllbGRUeXBlPiA9IFsnc2luZ2xlJywgJ3JhbmdlJ107XG4gIHByaXZhdGUgY2FjaGVkT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHM6IEFycmF5PFNlYXJjaEZpZWxkPiA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZnJlc2hPYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IG9iamVjdE1hbmFnZW1lbnRGaWVsZHMkOiBPYnNlcnZhYmxlPEFycmF5PExpc3RGaWVsZD4+ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlXG4gICAgLnN0cmVhbSgna2V5JylcbiAgICAucGlwZShcbiAgICAgIG1hcCgoKSA9PlxuICAgICAgICB0aGlzLkNPTFVNTlMubWFwKGNvbHVtbiA9PiAoe1xuICAgICAgICAgIGtleTogY29sdW1uLnByb3BlcnR5TmFtZSxcbiAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHNlYXJjaEZpZWxkc092ZXJ2aWV3LiR7Y29sdW1uLnRyYW5zbGF0aW9uS2V5fWApLFxuICAgICAgICAgIHNvcnRhYmxlOiBjb2x1bW4uc29ydGFibGUsXG4gICAgICAgICAgLi4uKGNvbHVtbi52aWV3VHlwZSAmJiB7dmlld1R5cGU6IGNvbHVtbi52aWV3VHlwZX0pLFxuICAgICAgICB9KSlcbiAgICAgIClcbiAgICApO1xuXG4gIHJlYWRvbmx5IG9iamVjdElkJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5yb3V0ZS5wYXJhbXMucGlwZShcbiAgICBtYXAocGFyYW1zID0+IHBhcmFtcy5pZCB8fCAnJyksXG4gICAgZmlsdGVyKG9iamVjdElkID0+ICEhb2JqZWN0SWQpXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcyQ6IE9ic2VydmFibGU8QXJyYXk8YW55Pj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLm9iamVjdElkJCxcbiAgICB0aGlzLnJlZnJlc2hPYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcyQsXG4gIF0pLnBpcGUoXG4gICAgc3dpdGNoTWFwKChbb2JqZWN0SWRdKSA9PiB0aGlzLm9iamVjdE1hbmFnZW1lbnRTZXJ2aWNlLmdldFNlYXJjaEZpZWxkKG9iamVjdElkKSksXG4gICAgdGFwKG9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzID0+IHtcbiAgICAgIHRoaXMub2JqZWN0SWQkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKG9iamVjdElkID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzICYmXG4gICAgICAgICAgQXJyYXkuaXNBcnJheShvYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcykgJiZcbiAgICAgICAgICBvYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcy5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuc2V0RG93bmxvYWQob2JqZWN0SWQsIG9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSksXG4gICAgdGFwKG9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzID0+IHtcbiAgICAgIHRoaXMuY2FjaGVkT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMgPSBvYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcztcbiAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgfSlcbiAgKTtcblxuICByZWFkb25seSB0cmFuc2xhdGVkT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMkOiBPYnNlcnZhYmxlPEFycmF5PFNlYXJjaEZpZWxkQ29sdW1uVmlldz4+ID1cbiAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMub2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMkLFxuICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JyksXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW2NvbHVtbnNdKSA9PlxuICAgICAgICBjb2x1bW5zLm1hcChjb2x1bW4gPT4gKHtcbiAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgdGl0bGU6IGNvbHVtbi50aXRsZSB8fCAnLScsXG4gICAgICAgICAgZGF0YVR5cGU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgICAgYHNlYXJjaEZpZWxkcy4ke2NvbHVtbj8uZGF0YVR5cGU/LnRvTG93ZXJDYXNlKCl9YFxuICAgICAgICAgICksXG4gICAgICAgICAgZmllbGRUeXBlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgIGBzZWFyY2hGaWVsZHNPdmVydmlldy4ke2NvbHVtbj8uZmllbGRUeXBlPy50b0xvd2VyQ2FzZSgpfWBcbiAgICAgICAgICApLFxuICAgICAgICB9KSlcbiAgICAgIClcbiAgICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkRGF0YVR5cGVJdGVtSW5kZXgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuXG4gIHJlYWRvbmx5IGRhdGFUeXBlSXRlbXMkOiBPYnNlcnZhYmxlPEFycmF5PExpc3RJdGVtPj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLnNlbGVjdGVkRGF0YVR5cGVJdGVtSW5kZXgkLFxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW3NlbGVjdGVkRGF0YVR5cGVJdGVtSW5kZXhdKSA9PlxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHNlYXJjaEZpZWxkRGF0YVR5cGUuc2VsZWN0YCksXG4gICAgICAgICAga2V5OiB0aGlzLklOVkFMSURfS0VZLFxuICAgICAgICB9LFxuICAgICAgICAuLi50aGlzLkRBVEFfVFlQRVMubWFwKHR5cGUgPT4gKHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgc2VhcmNoRmllbGRzLiR7dHlwZX1gKSxcbiAgICAgICAgICBrZXk6IHR5cGUudG9VcHBlckNhc2UoKSxcbiAgICAgICAgfSkpLFxuICAgICAgXS5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBzZWxlY3RlZDogaW5kZXggPT09IHNlbGVjdGVkRGF0YVR5cGVJdGVtSW5kZXgsXG4gICAgICB9KSlcbiAgICApXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRGaWVsZFR5cGVJdGVtSW5kZXgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICByZWFkb25seSBmaWVsZFR5cGVJdGVtcyQ6IE9ic2VydmFibGU8QXJyYXk8TGlzdEl0ZW0+PiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuc2VsZWN0ZWRGaWVsZFR5cGVJdGVtSW5kZXgkLFxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW3NlbGVjdGVkRmllbGRUeXBlSXRlbUluZGV4XSkgPT5cbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBzZWFyY2hGaWVsZEZpZWxkVHlwZS5zZWxlY3RgKSxcbiAgICAgICAgICBrZXk6IHRoaXMuSU5WQUxJRF9LRVksXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnRoaXMuRklFTERfVFlQRVMubWFwKHR5cGUgPT4gKHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgc2VhcmNoRmllbGRzT3ZlcnZpZXcuJHt0eXBlfWApLFxuICAgICAgICAgIGtleTogdHlwZS50b1VwcGVyQ2FzZSgpLFxuICAgICAgICB9KSksXG4gICAgICBdLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XG4gICAgICAgIC4uLml0ZW0sXG4gICAgICAgIHNlbGVjdGVkOiBpbmRleCA9PT0gc2VsZWN0ZWRGaWVsZFR5cGVJdGVtSW5kZXgsXG4gICAgICB9KSlcbiAgICApXG4gICk7XG5cbiAgcmVhZG9ubHkgdmFsaWRLZXkkID0gY29tYmluZUxhdGVzdChbdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLCB0aGlzLmN1cnJlbnRNb2RhbFR5cGUkXSkucGlwZShcbiAgICBtYXAoKFtmb3JtVmFsdWVzLCBjdXJyZW50TW9kYWxUeXBlXSkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmdLZXlzID0gdGhpcy5jYWNoZWRPYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcy5tYXAoY29sdW1uID0+IGNvbHVtbi5rZXkpO1xuICAgICAgcmV0dXJuIGN1cnJlbnRNb2RhbFR5cGUgPT09ICdjcmVhdGUnID8gIWV4aXN0aW5nS2V5cy5pbmNsdWRlcyhmb3JtVmFsdWVzLmtleSkgOiB0cnVlO1xuICAgIH0pLFxuICAgIHN0YXJ0V2l0aChmYWxzZSlcbiAgKTtcblxuICByZWFkb25seSB2YWxpZCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMsIHRoaXMudmFsaWRLZXkkXSkucGlwZShcbiAgICBtYXAoKFtmb3JtVmFsdWVzLCB2YWxpZEtleV0pID0+ICEhKGZvcm1WYWx1ZXMucGF0aCAmJiB2YWxpZEtleSkpLFxuICAgIHN0YXJ0V2l0aChmYWxzZSlcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdE1hbmFnZW1lbnRTZXJ2aWNlOiBPYmplY3RNYW5hZ2VtZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXJcbiAgKSB7fVxuXG4gIG9wZW5Nb2RhbChtb2RhbFR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2hvd01vZGFsJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuY3VycmVudE1vZGFsVHlwZSQubmV4dChtb2RhbFR5cGUpO1xuXG4gICAgaWYgKG1vZGFsVHlwZSA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzWydrZXknXS5lbmFibGUoKTtcbiAgICAgIHRoaXMucmVzZXRGb3JtR3JvdXAoKTtcbiAgICB9IGVsc2UgaWYgKG1vZGFsVHlwZSA9PT0gJ2VkaXQnKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1sna2V5J10uZGlzYWJsZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93TW9kYWwkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgZGVsZXRlUm93KGxpc3RTZWFyY2hGaWVsZFJvd0luZGV4OiBudW1iZXIsIGNsaWNrRXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjbGlja0V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5zaG93RGVsZXRlTW9kYWwkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZWxldGVSb3dJbmRleCQubmV4dChsaXN0U2VhcmNoRmllbGRSb3dJbmRleCk7XG4gIH1cblxuICBkZWxldGVSb3dDb25maXJtYXRpb24obGlzdFNlYXJjaEZpZWxkUm93SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbktleSA9IHRoaXMuZ2V0Q29sdW1uS2V5KGxpc3RTZWFyY2hGaWVsZFJvd0luZGV4KTtcblxuICAgIGlmIChjb2x1bW5LZXkpIHtcbiAgICAgIHRoaXMuZGlzYWJsZUlucHV0KCk7XG5cbiAgICAgIHRoaXMub2JqZWN0SWQkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgc3dpdGNoTWFwKG9iamVjdElkID0+XG4gICAgICAgICAgICB0aGlzLm9iamVjdE1hbmFnZW1lbnRTZXJ2aWNlLmRlbGV0ZVNlYXJjaEZpZWxkKG9iamVjdElkLCBjb2x1bW5LZXkpXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5yZWZyZXNoT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMoKSksXG4gICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29sdW1uS2V5KGxpc3RTZWFyY2hGaWVsZFJvd0luZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRPYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkc1tsaXN0U2VhcmNoRmllbGRSb3dJbmRleF0/LmtleTtcbiAgfVxuXG4gIG1vdmVSb3coXG4gICAgbGlzdFNlYXJjaEZpZWxkUm93SW5kZXg6IG51bWJlcixcbiAgICBtb3ZlVXA6IGJvb2xlYW4sXG4gICAgY2xpY2tFdmVudDogTW91c2VFdmVudCxcbiAgICBvYmplY3RJZDogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzID0gWy4uLnRoaXMuY2FjaGVkT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHNdO1xuICAgIGNvbnN0IGxpc3RTZWFyY2hGaWVsZFJvdyA9IG9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzW2xpc3RTZWFyY2hGaWVsZFJvd0luZGV4XTtcblxuICAgIGNsaWNrRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgbGlzdFNlYXJjaEZpZWxkSW5kZXggPSBvYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcy5maW5kSW5kZXgoXG4gICAgICBmaWVsZCA9PiBmaWVsZC5rZXkgPT09IGxpc3RTZWFyY2hGaWVsZFJvdy5rZXlcbiAgICApO1xuICAgIGNvbnN0IGZvdW5kTGlzdFNlYXJjaEZpZWxkID0gey4uLm9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzW2xpc3RTZWFyY2hGaWVsZEluZGV4XX07XG4gICAgY29uc3QgZmlsdGVyZWRMaXN0U2VhcmNoRmllbGQgPSBvYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcy5maWx0ZXIoXG4gICAgICBmaWVsZCA9PiBmaWVsZC5rZXkgIT09IGxpc3RTZWFyY2hGaWVsZFJvdy5rZXlcbiAgICApO1xuICAgIGNvbnN0IG11bHRpcGxlTGlzdFNlYXJjaEZpZWxkcyA9IG9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzLmxlbmd0aCA+IDE7XG5cbiAgICBpZiAobXVsdGlwbGVMaXN0U2VhcmNoRmllbGRzICYmIG1vdmVVcCAmJiBsaXN0U2VhcmNoRmllbGRJbmRleCA+IDApIHtcbiAgICAgIGNvbnN0IGxpc3RTZWFyY2hGaWVsZEJlZm9yZUtleSA9IGAke1xuICAgICAgICBvYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkc1tsaXN0U2VhcmNoRmllbGRJbmRleCAtIDFdLmtleVxuICAgICAgfWA7XG4gICAgICBjb25zdCBsaXN0U2VhcmNoRmllbGRCZWZvcmVJbmRleCA9IGZpbHRlcmVkTGlzdFNlYXJjaEZpZWxkLmZpbmRJbmRleChcbiAgICAgICAgZmllbGQgPT4gZmllbGQua2V5ID09PSBsaXN0U2VhcmNoRmllbGRCZWZvcmVLZXlcbiAgICAgICk7XG4gICAgICBmaWx0ZXJlZExpc3RTZWFyY2hGaWVsZC5zcGxpY2UobGlzdFNlYXJjaEZpZWxkQmVmb3JlSW5kZXgsIDAsIGZvdW5kTGlzdFNlYXJjaEZpZWxkKTtcbiAgICAgIHRoaXMudXBkYXRlT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZChvYmplY3RJZCwgZmlsdGVyZWRMaXN0U2VhcmNoRmllbGQpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBtdWx0aXBsZUxpc3RTZWFyY2hGaWVsZHMgJiZcbiAgICAgICFtb3ZlVXAgJiZcbiAgICAgIGxpc3RTZWFyY2hGaWVsZEluZGV4IDwgb2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMubGVuZ3RoXG4gICAgKSB7XG4gICAgICBjb25zdCBjYXNlTGlzdENvbHVtbkFmdGVyS2V5ID0gYCR7XG4gICAgICAgIG9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzW2xpc3RTZWFyY2hGaWVsZEluZGV4ICsgMV0ua2V5XG4gICAgICB9YDtcbiAgICAgIGNvbnN0IGNhc2VMaXN0Q29sdW1uQWZ0ZXJJbmRleCA9IGZpbHRlcmVkTGlzdFNlYXJjaEZpZWxkLmZpbmRJbmRleChcbiAgICAgICAgZmllbGQgPT4gZmllbGQua2V5ID09PSBjYXNlTGlzdENvbHVtbkFmdGVyS2V5XG4gICAgICApO1xuICAgICAgZmlsdGVyZWRMaXN0U2VhcmNoRmllbGQuc3BsaWNlKGNhc2VMaXN0Q29sdW1uQWZ0ZXJJbmRleCArIDEsIDAsIGZvdW5kTGlzdFNlYXJjaEZpZWxkKTtcbiAgICAgIHRoaXMudXBkYXRlT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZChvYmplY3RJZCwgZmlsdGVyZWRMaXN0U2VhcmNoRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIHNhdmVMaXN0U2VhcmNoRmllbGRzKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZUlucHV0KCk7XG5cbiAgICB0aGlzLmN1cnJlbnRNb2RhbFR5cGUkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGN1cnJlbnRNb2RhbFR5cGUgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRNb2RhbFR5cGUgPT09ICdjcmVhdGUnKSB7XG4gICAgICAgIHRoaXMuYWRkU2VhcmNoRmllbGQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlU2VhcmNoRmllbGQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNvbHVtblJvd0NsaWNrZWQocm93OiB7a2V5OiBzdHJpbmd9KTogdm9pZCB7XG4gICAgdGhpcy5yZXNldEZvcm1Hcm91cCgpO1xuXG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5kYXRhVHlwZUl0ZW1zJCwgdGhpcy5maWVsZFR5cGVJdGVtcyRdKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKFtkYXRhVHlwZUl0ZW1zLCBmaWVsZFR5cGVJdGVtc10pID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5jYWNoZWRPYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcy5maW5kKFxuICAgICAgICAgIGNhY2hlZENvbHVtbiA9PiBjYWNoZWRDb2x1bW4ua2V5ID09PSByb3cua2V5XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRhdGFUeXBlSXRlbSA9IGRhdGFUeXBlSXRlbXMuZmluZChpdGVtID0+IGl0ZW0ua2V5ID09PSBjb2x1bW4uZGF0YVR5cGUpO1xuICAgICAgICBjb25zdCBkYXRhVHlwZUl0ZW1JbmRleCA9IGRhdGFUeXBlSXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbi5kYXRhVHlwZSk7XG5cbiAgICAgICAgY29uc3QgZmllbGRUeXBlSXRlbSA9IGZpZWxkVHlwZUl0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLmtleSA9PT0gY29sdW1uLmZpZWxkVHlwZSk7XG4gICAgICAgIGNvbnN0IGZpZWxkVHlwZUl0ZW1JbmRleCA9IGZpZWxkVHlwZUl0ZW1zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0ua2V5ID09PSBjb2x1bW4uZmllbGRUeXBlKTtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0YVR5cGVJdGVtSW5kZXgkLm5leHQoZGF0YVR5cGVJdGVtSW5kZXgpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGRUeXBlSXRlbUluZGV4JC5uZXh0KGZpZWxkVHlwZUl0ZW1JbmRleCk7XG5cbiAgICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAga2V5OiBjb2x1bW4ua2V5LFxuICAgICAgICAgIHRpdGxlOiBjb2x1bW4udGl0bGUsXG4gICAgICAgICAgcGF0aDogY29sdW1uLnBhdGgsXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGRhdGFUeXBlOiB7Li4uZGF0YVR5cGVJdGVtfSxcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgZmllbGRUeXBlOiB7Li4uZmllbGRUeXBlSXRlbX0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub3Blbk1vZGFsKCdlZGl0Jyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZChcbiAgICBvYmplY3RJZDogc3RyaW5nLFxuICAgIHNlYXJjaEZpZWxkOiBBcnJheTxTZWFyY2hGaWVsZD5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlSW5wdXQoKTtcbiAgICB0aGlzLm9iamVjdE1hbmFnZW1lbnRTZXJ2aWNlXG4gICAgICAucHV0U2VhcmNoRmllbGRzKG9iamVjdElkLCBzZWFyY2hGaWVsZClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVmcmVzaE9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzKCk7XG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oYGxpc3Qtc2VhcmNoLWZpZWxkcyR7b2JqZWN0SWR9YCwgbnVsbCk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRTZWFyY2hGaWVsZCgpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmZvcm1Hcm91cC52YWx1ZTtcblxuICAgIHRoaXMub2JqZWN0SWQkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKG9iamVjdElkID0+XG4gICAgICAgICAgdGhpcy5vYmplY3RNYW5hZ2VtZW50U2VydmljZS5wb3N0U2VhcmNoRmllbGQoXG4gICAgICAgICAgICBvYmplY3RJZCxcbiAgICAgICAgICAgIHRoaXMubWFwRm9ybVZhbHVlc1RvQ29sdW1uKGZvcm1WYWx1ZSlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jbG9zZU1vZGFsKCk7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMoKTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZW5hYmxlSW5wdXQoKTtcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlYXJjaEZpZWxkKCk6IHZvaWQge1xuICAgIHRoaXMub2JqZWN0SWQkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKG9iamVjdElkID0+XG4gICAgICAgICAgdGhpcy5vYmplY3RNYW5hZ2VtZW50U2VydmljZS5wdXRTZWFyY2hGaWVsZChcbiAgICAgICAgICAgIG9iamVjdElkLFxuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAudmFsdWUua2V5LFxuICAgICAgICAgICAgdGhpcy5tYXBGb3JtVmFsdWVzVG9Db2x1bW4odGhpcy5mb3JtR3JvdXAudmFsdWUpXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2xvc2VNb2RhbCgpO1xuICAgICAgICAgIHRoaXMucmVmcmVzaE9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzKCk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREb3dubG9hZChvYmplY3RJZDogc3RyaW5nLCBPYmplY3RNYW5hZ2VtZW50U2VhcmNoRmllbGRzOiBBcnJheTxTZWFyY2hGaWVsZD4pOiB2b2lkIHtcbiAgICB0aGlzLmRvd25sb2FkTmFtZSQubmV4dChgJHtvYmplY3RJZH0uanNvbmApO1xuICAgIHRoaXMuZG93bmxvYWRVcmwkLm5leHQoXG4gICAgICB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKFxuICAgICAgICAnZGF0YTp0ZXh0L2pzb247Y2hhcnNldD1VVEYtOCwnICtcbiAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoT2JqZWN0TWFuYWdlbWVudFNlYXJjaEZpZWxkcywgbnVsbCwgMikpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZUlucHV0KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZUlucHV0JC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZm9ybUdyb3VwLmRpc2FibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlSW5wdXQkLm5leHQoZmFsc2UpO1xuICAgIHRoaXMuZm9ybUdyb3VwLmVuYWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMkLm5leHQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Rm9ybUdyb3VwKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUdyb3VwLnJlc2V0KCk7XG4gICAgdGhpcy5zZWxlY3RlZERhdGFUeXBlSXRlbUluZGV4JC5uZXh0KDApO1xuICAgIHRoaXMuc2VsZWN0ZWRGaWVsZFR5cGVJdGVtSW5kZXgkLm5leHQoMCk7XG4gIH1cblxuICBwcml2YXRlIG1hcEZvcm1WYWx1ZXNUb0NvbHVtbihmb3JtVmFsdWU6IGFueSk6IFNlYXJjaEZpZWxkIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiBmb3JtVmFsdWUua2V5LFxuICAgICAgdGl0bGU6IGZvcm1WYWx1ZS50aXRsZSB8fCAnJyxcbiAgICAgIHBhdGg6IGZvcm1WYWx1ZS5wYXRoLFxuICAgICAgZGF0YVR5cGU6IGZvcm1WYWx1ZS5kYXRhVHlwZS5rZXksXG4gICAgICBmaWVsZFR5cGU6IGZvcm1WYWx1ZS5maWVsZFR5cGUua2V5LFxuICAgIH07XG4gIH1cbn1cbiIsIjwhLS1cbiAgfiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAgflxuICB+IExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgflxuICB+IGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAgflxuICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAtLT5cbjxuZy1jb250YWluZXJcbiAgKm5nSWY9XCJ7XG4gICAgc2VhcmNoRmllbGRzOiB0cmFuc2xhdGVkT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMkIHwgYXN5bmMsXG4gICAgZmllbGRzOiBvYmplY3RNYW5hZ2VtZW50RmllbGRzJCB8IGFzeW5jLFxuICAgIG9iamVjdElkOiBvYmplY3RJZCQgfCBhc3luYyxcbiAgICBkb3dubG9hZFVybDogZG93bmxvYWRVcmwkIHwgYXN5bmMsXG4gICAgZG93bmxvYWROYW1lOiBkb3dubG9hZE5hbWUkIHwgYXN5bmMsXG4gICAgbG9hZGluZzogbG9hZGluZyQgfCBhc3luY1xuICB9IGFzIG9ic1wiXG4+XG4gIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgcHItMCBwbC0wXCI+XG4gICAgPGRpdiBjbGFzcz1cInRleHQtcmlnaHRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgbXQtbTNweCBtYi0zIG1yLTJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbnM7IGNvbnRleHQ6IHtvYnM6IG9ic31cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhb2JzLmxvYWRpbmc7IGVsc2UgbG9hZGluZ1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9icy5zZWFyY2hGaWVsZHM/Lmxlbmd0aCA+IDA7IGVsc2Ugbm9Db25maWdXYXJuaW5nXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsaXN0OyBjb250ZXh0OiB7b2JzOiBvYnN9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3JlYXRlRWRpdE1vZGFsXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRlbGV0ZU1vZGFsXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjYnV0dG9ucyBsZXQtb2JzPVwib2JzXCI+XG4gIDxhXG4gICAgY2RzTGlua1xuICAgIGNsYXNzPVwiY2VudGVyLWxpbmtcIlxuICAgIFtocmVmXT1cIm9icy5kb3dubG9hZFVybFwiXG4gICAgW2Rvd25sb2FkXT1cIm9icy5kb3dubG9hZE5hbWVcIlxuICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICFvYnMuZG93bmxvYWRVcmwgfHxcbiAgICAgICFvYnMuZG93bmxvYWROYW1lIHx8XG4gICAgICBvYnMuc2VhcmNoRmllbGRzPy5sZW5ndGggPCAxIHx8XG4gICAgICBvYnMuZGlzYWJsZUlucHV0IHx8XG4gICAgICBvYnMubG9hZGluZ1xuICAgIFwiXG4gID5cbiAgICB7eyAnc2VhcmNoRmllbGRzT3ZlcnZpZXcuZG93bmxvYWQnIHwgdHJhbnNsYXRlIH19XG4gIDwvYT5cbiAgPGJ1dHRvblxuICAgIChjbGljayk9XCJvcGVuTW9kYWwoJ2NyZWF0ZScpXCJcbiAgICBjZHNCdXR0b249XCJwcmltYXJ5XCJcbiAgICBzaXplPVwibWRcIlxuICAgIFtkaXNhYmxlZF09XCJvYnMubG9hZGluZ1wiXG4gICAgY2xhc3M9XCJtbC0zXCJcbiAgPlxuICAgIHt7ICdzZWFyY2hGaWVsZHNPdmVydmlldy5hZGQnIHwgdHJhbnNsYXRlIH19XG4gICAgPHN2ZyBjbGFzcz1cImNkcy0tYnRuX19pY29uXCIgY2RzSWNvbj1cImFkZFwiIHNpemU9XCIxNlwiPjwvc3ZnPlxuICA8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW92ZVJvd0J1dHRvbnMgbGV0LWluZGV4PVwiaW5kZXhcIiBsZXQtbGVuZ3RoPVwibGVuZ3RoXCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cIm1vdmUtcm93LWJ1dHRvbnNcIlxuICAgICpuZ0lmPVwie1xuICAgICAgZGlzYWJsZUlucHV0OiBkaXNhYmxlSW5wdXQkIHwgYXN5bmMsXG4gICAgICBvYmplY3RJZDogb2JqZWN0SWQkIHwgYXN5bmNcbiAgICB9IGFzIG9ic1wiXG4gID5cbiAgICA8aVxuICAgICAgY2xhc3M9XCJtZGkgbWRpLWRlbGV0ZSBidG4gYnRuLW91dGxpbmUtZGFuZ2VyIG1yLTFcIlxuICAgICAgKGNsaWNrKT1cImRlbGV0ZVJvdyhpbmRleCwgJGV2ZW50KVwiXG4gICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGVkIGRpc2FibGVkLW1vdmUtcm93LWJ1dHRvbic6IG9icy5kaXNhYmxlSW5wdXR9XCJcbiAgICA+PC9pPlxuICAgIDxpXG4gICAgICBjbGFzcz1cIm1kaSBtZGktYXJyb3ctdXAtYm9sZCBidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBtci0xXCJcbiAgICAgIChjbGljayk9XCJtb3ZlUm93KGluZGV4LCB0cnVlLCAkZXZlbnQsIG9icy5vYmplY3RJZClcIlxuICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlZCBkaXNhYmxlZC1tb3ZlLXJvdy1idXR0b24nOiBpbmRleCA9PT0gMCB8fCBvYnMuZGlzYWJsZUlucHV0fVwiXG4gICAgPjwvaT5cbiAgICA8aVxuICAgICAgY2xhc3M9XCJtZGkgbWRpLWFycm93LWRvd24tYm9sZCBidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCJcbiAgICAgIChjbGljayk9XCJtb3ZlUm93KGluZGV4LCBmYWxzZSwgJGV2ZW50LCBvYnMub2JqZWN0SWQpXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQgZGlzYWJsZWQtbW92ZS1yb3ctYnV0dG9uJzogaW5kZXggPT09IGxlbmd0aCAtIDEgfHwgb2JzLmRpc2FibGVJbnB1dH1cIlxuICAgID48L2k+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsaXN0IGxldC1vYnM9XCJvYnNcIj5cbiAgPHZhbHRpbW8tbGlzdFxuICAgIFtpdGVtc109XCJvYnMuc2VhcmNoRmllbGRzXCJcbiAgICBbZmllbGRzXT1cIm9icy5maWVsZHNcIlxuICAgIFt2aWV3TW9kZV09XCJmYWxzZVwiXG4gICAgW2hlYWRlcl09XCJmYWxzZVwiXG4gICAgKm5nSWY9XCJvYnMuc2VhcmNoRmllbGRzOyBlbHNlIGxvYWRpbmdcIlxuICAgIFtsYXN0Q29sdW1uVGVtcGxhdGVdPVwibW92ZVJvd0J1dHRvbnNUZW1wbGF0ZVJlZlwiXG4gICAgKHJvd0NsaWNrZWQpPVwiY29sdW1uUm93Q2xpY2tlZCgkZXZlbnQpXCJcbiAgPlxuICA8L3ZhbHRpbW8tbGlzdD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY3JlYXRlRWRpdE1vZGFsPlxuICA8Y2RzLW1vZGFsXG4gICAgdmFsdGltb0Nkc01vZGFsXG4gICAgKm5nSWY9XCJ7XG4gICAgICB0eXBlOiBjdXJyZW50TW9kYWxUeXBlJCB8IGFzeW5jLFxuICAgICAgc2hvdzogc2hvd01vZGFsJCB8IGFzeW5jLFxuICAgICAgdmFsaWQ6IHZhbGlkJCB8IGFzeW5jLFxuICAgICAgZGlzYWJsZUlucHV0OiBkaXNhYmxlSW5wdXQkIHwgYXN5bmMsXG4gICAgICB2YWxpZEtleTogdmFsaWRLZXkkIHwgYXN5bmNcbiAgICB9IGFzIG1vZGFsT2JzXCJcbiAgICBbb3Blbl09XCJtb2RhbE9icy5zaG93XCJcbiAgPlxuICAgIDxjZHMtbW9kYWwtaGVhZGVyIFtzaG93Q2xvc2VCdXR0b25dPVwidHJ1ZVwiIChjbG9zZVNlbGVjdCk9XCJjbG9zZU1vZGFsKClcIj5cbiAgICAgIDxoMyBjZHNNb2RhbEhlYWRlckhlYWRpbmc+XG4gICAgICAgIHt7XG4gICAgICAgICAgbW9kYWxPYnMudHlwZSA9PT0gJ2NyZWF0ZSdcbiAgICAgICAgICAgID8gKCdzZWFyY2hGaWVsZHNPdmVydmlldy5hZGQnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgOiAoJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmVkaXQnIHwgdHJhbnNsYXRlKVxuICAgICAgICB9fVxuICAgICAgPC9oMz5cbiAgICA8L2Nkcy1tb2RhbC1oZWFkZXI+XG4gICAgPHNlY3Rpb24gY2RzTW9kYWxDb250ZW50PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1vZGFsQ29udGVudDsgY29udGV4dDoge21vZGFsT2JzOiBtb2RhbE9ic31cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L3NlY3Rpb24+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1vZGFsRm9vdGVyOyBjb250ZXh0OiB7bW9kYWxPYnM6IG1vZGFsT2JzfVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Nkcy1tb2RhbD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9kYWxDb250ZW50IGxldC1tb2RhbE9icz1cIm1vZGFsT2JzXCI+XG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCIgY2xhc3M9XCJsaXN0LWNvbHVtbi1mb3JtXCI+XG4gICAgPGRpdiBjbGFzcz1cImNkcy0tdGV4dC1pbnB1dF9fZmllbGQtd3JhcHBlclwiPlxuICAgICAgPGNkcy1sYWJlbCBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwXCI+XG4gICAgICAgICAge3sgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnRpdGxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDx2LXRvb2x0aXAtaWNvblxuICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMudGl0bGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxpbnB1dCBjZHNUZXh0IGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgLz5cbiAgICAgIDwvY2RzLWxhYmVsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjZHMtLXRleHQtaW5wdXRfX2ZpZWxkLXdyYXBwZXJcIj5cbiAgICAgIDxjZHMtbGFiZWxcbiAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dCB8fCBtb2RhbE9icy50eXBlID09PSAnZWRpdCdcIlxuICAgICAgICBbaW52YWxpZF09XCJtb2RhbE9icy52YWxpZEtleSA9PT0gZmFsc2VcIlxuICAgICAgICBbaW52YWxpZFRleHRdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnVuaXF1ZUtleVdhcm5pbmcnIHwgdHJhbnNsYXRlXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXBcIj5cbiAgICAgICAgICB7eyAnc2VhcmNoRmllbGRzT3ZlcnZpZXcua2V5JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDx2LXRvb2x0aXAtaWNvblxuICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMua2V5JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICA+PC92LXRvb2x0aXAtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aW5wdXQgY2RzVGV4dCBmb3JtQ29udHJvbE5hbWU9XCJrZXlcIiBbaW52YWxpZF09XCJtb2RhbE9icy52YWxpZEtleSA9PT0gZmFsc2VcIiAvPlxuICAgICAgPC9jZHMtbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNkcy0tdGV4dC1pbnB1dF9fZmllbGQtd3JhcHBlclwiPlxuICAgICAgPGNkcy1sYWJlbCBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwXCI+XG4gICAgICAgICAge3sgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnBhdGgnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5vYmplY3RzQXBpUGF0aCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgPjwvdi10b29sdGlwLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGlucHV0IGNkc1RleHQgZm9ybUNvbnRyb2xOYW1lPVwicGF0aFwiIC8+XG4gICAgICA8L2Nkcy1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8Y2RzLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXAgc2VsZWN0LWxhYmVsXCI+XG4gICAgICAgICAge3sgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRhdGFUeXBlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDx2LXRvb2x0aXAtaWNvblxuICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMuZGF0YVR5cGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxjZHMtZHJvcGRvd24gZm9ybUNvbnRyb2xOYW1lPVwiZGF0YVR5cGVcIiBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgICAgPGNkcy1kcm9wZG93bi1saXN0IFtpdGVtc109XCJkYXRhVHlwZUl0ZW1zJCB8IGFzeW5jXCI+PC9jZHMtZHJvcGRvd24tbGlzdD5cbiAgICAgICAgPC9jZHMtZHJvcGRvd24+XG4gICAgICA8L2Nkcy1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8Y2RzLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXAgc2VsZWN0LWxhYmVsXCI+XG4gICAgICAgICAge3sgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmZpZWxkVHlwZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8di10b29sdGlwLWljb25cbiAgICAgICAgICAgIFt0b29sdGlwXT1cIidzZWFyY2hGaWVsZHNPdmVydmlld1Rvb2x0aXBzLmZpZWxkVHlwZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgPjwvdi10b29sdGlwLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGNkcy1kcm9wZG93biBmb3JtQ29udHJvbE5hbWU9XCJmaWVsZFR5cGVcIiBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgICAgPGNkcy1kcm9wZG93bi1saXN0IFtpdGVtc109XCJmaWVsZFR5cGVJdGVtcyQgfCBhc3luY1wiPjwvY2RzLWRyb3Bkb3duLWxpc3Q+XG4gICAgICAgIDwvY2RzLWRyb3Bkb3duPlxuICAgICAgPC9jZHMtbGFiZWw+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9kYWxGb290ZXIgbGV0LW1vZGFsT2JzPVwibW9kYWxPYnNcIj5cbiAgPGNkcy1tb2RhbC1mb290ZXI+XG4gICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2RzQnV0dG9uPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgW2F0dHIubW9kYWwtcHJpbWFyeS1mb2N1c109XCJ0cnVlXCJcbiAgICAgICAgKGNsaWNrKT1cImNsb3NlTW9kYWwoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgPlxuICAgICAgICB7eyAnc2VhcmNoRmllbGRzT3ZlcnZpZXcuY2xvc2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2RzQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgICAgIFthdHRyLm1vZGFsLXByaW1hcnktZm9jdXNdPVwidHJ1ZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy52YWxpZCA9PT0gZmFsc2VcIlxuICAgICAgICAoY2xpY2spPVwic2F2ZUxpc3RTZWFyY2hGaWVsZHMoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICBtb2RhbE9icy5kaXNhYmxlSW5wdXQgfHwgbW9kYWxPYnMudmFsaWQgPT09IGZhbHNlIHx8IG1vZGFsT2JzLnZhbGlkS2V5ID09PSBmYWxzZVxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICB7eyAnc2VhcmNoRmllbGRzT3ZlcnZpZXcuc2F2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Nkcy1tb2RhbC1mb290ZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlbGV0ZU1vZGFsPlxuICA8dmFsdGltby1jb25maXJtYXRpb24tbW9kYWxcbiAgICBbc2hvd01vZGFsU3ViamVjdCRdPVwic2hvd0RlbGV0ZU1vZGFsJFwiXG4gICAgW291dHB1dE9uQ29uZmlybV09XCJkZWxldGVSb3dJbmRleCQgfCBhc3luY1wiXG4gICAgKGNvbmZpcm1FdmVudCk9XCJkZWxldGVSb3dDb25maXJtYXRpb24oJGV2ZW50KVwiXG4gICAgY29uZmlybUJ1dHRvblRleHRUcmFuc2xhdGlvbktleT1cInNlYXJjaEZpZWxkc092ZXJ2aWV3LmRlbGV0ZVNlYXJjaEZpZWxkXCJcbiAgICB0aXRsZVRyYW5zbGF0aW9uS2V5PVwic2VhcmNoRmllbGRzT3ZlcnZpZXcuc2VhcmNoRmllbGRcIlxuICAgIGNvbnRlbnRUcmFuc2xhdGlvbktleT1cInNlYXJjaEZpZWxkc092ZXJ2aWV3LmRlbGV0ZVNlYXJjaEZpZWxkQ29uZmlybWF0aW9uXCJcbiAgPjwvdmFsdGltby1jb25maXJtYXRpb24tbW9kYWw+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI25vQ29uZmlnV2FybmluZz5cbiAgPGRpdiBjbGFzcz1cInBsLTIgcHItMiBwYi0yXCI+XG4gICAgPGNkcy1ub3RpZmljYXRpb25cbiAgICAgIFtub3RpZmljYXRpb25PYmpdPVwie1xuICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgIHRpdGxlOiAnc2VhcmNoRmllbGRzT3ZlcnZpZXcubm9TZWFyY2hGaWVsZHNDb25maWd1cmVkV2FybmluZ1RpdGxlJyB8IHRyYW5zbGF0ZSxcbiAgICAgICAgc2hvd0Nsb3NlOiBmYWxzZVxuICAgICAgfVwiXG4gICAgPlxuICAgIDwvY2RzLW5vdGlmaWNhdGlvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmc+XG4gIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWljb25cIj48Y2RzLWxvYWRpbmc+PC9jZHMtbG9hZGluZz48L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
341
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LW1hbmFnZW1lbnQtbGlzdC1zZWFyY2gtZmllbGRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vb2JqZWN0LW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL29iamVjdC1tYW5hZ2VtZW50LWRldGFpbC1jb250YWluZXIvdGFicy9vYmplY3QtbWFuYWdlbWVudC1saXN0LXNlYXJjaC1maWVsZHMvb2JqZWN0LW1hbmFnZW1lbnQtbGlzdC1zZWFyY2gtZmllbGRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vb2JqZWN0LW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL29iamVjdC1tYW5hZ2VtZW50LWRldGFpbC1jb250YWluZXIvdGFicy9vYmplY3QtbWFuYWdlbWVudC1saXN0LXNlYXJjaC1maWVsZHMvb2JqZWN0LW1hbmFnZW1lbnQtbGlzdC1zZWFyY2gtZmllbGRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBZSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBQ2IsTUFBTSxFQUNOLEdBQUcsRUFFSCxFQUFFLEVBQ0YsU0FBUyxFQUNULE9BQU8sRUFDUCxTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBV2QsT0FBTyxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFXbEUsTUFBTSxPQUFPLHlDQUF5QztJQXdMcEQsWUFDbUIs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LEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDNUIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJO1lBQ3BCLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUc7WUFDaEMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRztTQUNuQyxDQUFDO0lBQ0osQ0FBQzsrR0FsYlUseUNBQXlDO21HQUF6Qyx5Q0FBeUMsaU5DbkR0RCxreFNBc1FBOzs0RkRuTmEseUNBQXlDO2tCQUxyRCxTQUFTOytCQUNFLDhDQUE4QzsrTUFLcEIseUJBQXlCO3NCQUE1RCxTQUFTO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7Q29tcG9uZW50LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBzdGFydFdpdGgsXG4gIFN1YmplY3QsXG4gIHN3aXRjaE1hcCxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7RG9tU2FuaXRpemVyLCBTYWZlVXJsfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7XG4gIENvbmZpZ1NlcnZpY2UsXG4gIERlZmluaXRpb25Db2x1bW4sXG4gIFNlYXJjaEZpZWxkLFxuICBTZWFyY2hGaWVsZENvbHVtblZpZXcsXG4gIFNlYXJjaEZpZWxkRGF0YVR5cGUsXG4gIFNlYXJjaEZpZWxkRmllbGRUeXBlLFxufSBmcm9tICdAdmFsdGltby9jb25maWcnO1xuaW1wb3J0IHtMaXN0RmllbGR9IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCB0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0Zvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7TGlzdEl0ZW19IGZyb20gJ2NhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXIvZHJvcGRvd24vbGlzdC1pdGVtLmludGVyZmFjZSc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7T2JqZWN0TWFuYWdlbWVudFNlcnZpY2V9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL29iamVjdC1tYW5hZ2VtZW50LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLW9iamVjdC1tYW5hZ2VtZW50LWxpc3Qtc2VhcmNoLWZpZWxkcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9vYmplY3QtbWFuYWdlbWVudC1saXN0LXNlYXJjaC1maWVsZHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9vYmplY3QtbWFuYWdlbWVudC1saXN0LXNlYXJjaC1maWVsZHMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHNDb21wb25lbnQge1xuICBAVmlld0NoaWxkKCdtb3ZlUm93QnV0dG9ucycpIHB1YmxpYyBtb3ZlUm93QnV0dG9uc1RlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICByZWFkb25seSBkb3dubG9hZE5hbWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgZG93bmxvYWRVcmwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTYWZlVXJsPih1bmRlZmluZWQpO1xuICByZWFkb25seSBsb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGN1cnJlbnRNb2RhbFR5cGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCdjcmVhdGUnKTtcbiAgcmVhZG9ubHkgc2hvd01vZGFsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBkaXNhYmxlSW5wdXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHNob3dEZWxldGVNb2RhbCQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICByZWFkb25seSBkZWxldGVSb3dJbmRleCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG5cbiAgcmVhZG9ubHkgSU5WQUxJRF9LRVkgPSAnaW52YWxpZCc7XG4gIHJlYWRvbmx5IGZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIHRpdGxlOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGtleTogbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICBwYXRoOiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIGRhdGFUeXBlOiBuZXcgRm9ybUNvbnRyb2woe1xuICAgICAga2V5OiB0aGlzLklOVkFMSURfS0VZLFxuICAgIH0pLFxuICAgIGZpZWxkVHlwZTogbmV3IEZvcm1Db250cm9sKHtcbiAgICAgIGtleTogdGhpcy5JTlZBTElEX0tFWSxcbiAgICB9KSxcbiAgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ09MVU1OUzogQXJyYXk8RGVmaW5pdGlvbkNvbHVtbj4gPSBbXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgcHJvcGVydHlOYW1lOiAndGl0bGUnLFxuICAgICAgdHJhbnNsYXRpb25LZXk6ICd0aXRsZScsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdrZXknLFxuICAgICAgdHJhbnNsYXRpb25LZXk6ICdrZXknLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgcHJvcGVydHlOYW1lOiAncGF0aCcsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ3BhdGgnLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgcHJvcGVydHlOYW1lOiAnZGF0YVR5cGUnLFxuICAgICAgdHJhbnNsYXRpb25LZXk6ICdkYXRhVHlwZScsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdmaWVsZFR5cGUnLFxuICAgICAgdHJhbnNsYXRpb25LZXk6ICdmaWVsZFR5cGUnLFxuICAgIH0sXG4gIF07XG4gIHJlYWRvbmx5IERBVEFfVFlQRVM6IEFycmF5PFNlYXJjaEZpZWxkRGF0YVR5cGU+ID0gW1xuICAgICd0ZXh0JyxcbiAgICAnbnVtYmVyJyxcbiAgICAnZGF0ZScsXG4gICAgJ2RhdGV0aW1lJyxcbiAgICAnYm9vbGVhbicsXG4gIF07XG4gIHByaXZhdGUgcmVhZG9ubHkgRklFTERfVFlQRVM6IEFycmF5PFNlYXJjaEZpZWxkRmllbGRUeXBlPiA9IFsnc2luZ2xlJywgJ3JhbmdlJ107XG4gIHByaXZhdGUgY2FjaGVkT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHM6IEFycmF5PFNlYXJjaEZpZWxkPiA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZnJlc2hPYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IG9iamVjdE1hbmFnZW1lbnRGaWVsZHMkOiBPYnNlcnZhYmxlPEFycmF5PExpc3RGaWVsZD4+ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlXG4gICAgLnN0cmVhbSgna2V5JylcbiAgICAucGlwZShcbiAgICAgIG1hcCgoKSA9PlxuICAgICAgICB0aGlzLkNPTFVNTlMubWFwKGNvbHVtbiA9PiAoe1xuICAgICAgICAgIGtleTogY29sdW1uLnByb3BlcnR5TmFtZSxcbiAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHNlYXJjaEZpZWxkc092ZXJ2aWV3LiR7Y29sdW1uLnRyYW5zbGF0aW9uS2V5fWApLFxuICAgICAgICAgIHNvcnRhYmxlOiBjb2x1bW4uc29ydGFibGUsXG4gICAgICAgICAgLi4uKGNvbHVtbi52aWV3VHlwZSAmJiB7dmlld1R5cGU6IGNvbHVtbi52aWV3VHlwZX0pLFxuICAgICAgICB9KSlcbiAgICAgIClcbiAgICApO1xuXG4gIHJlYWRvbmx5IG9iamVjdElkJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5yb3V0ZS5wYXJhbXMucGlwZShcbiAgICBtYXAocGFyYW1zID0+IHBhcmFtcy5pZCB8fCAnJyksXG4gICAgZmlsdGVyKG9iamVjdElkID0+ICEhb2JqZWN0SWQpXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcyQ6IE9ic2VydmFibGU8QXJyYXk8YW55Pj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLm9iamVjdElkJCxcbiAgICB0aGlzLnJlZnJlc2hPYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcyQsXG4gIF0pLnBpcGUoXG4gICAgc3dpdGNoTWFwKChbb2JqZWN0SWRdKSA9PiB0aGlzLm9iamVjdE1hbmFnZW1lbnRTZXJ2aWNlLmdldFNlYXJjaEZpZWxkKG9iamVjdElkKSksXG4gICAgdGFwKG9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzID0+IHtcbiAgICAgIHRoaXMub2JqZWN0SWQkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKG9iamVjdElkID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzICYmXG4gICAgICAgICAgQXJyYXkuaXNBcnJheShvYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcykgJiZcbiAgICAgICAgICBvYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcy5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuc2V0RG93bmxvYWQob2JqZWN0SWQsIG9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSksXG4gICAgdGFwKG9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzID0+IHtcbiAgICAgIHRoaXMuY2FjaGVkT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMgPSBvYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcztcbiAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgfSlcbiAgKTtcblxuICByZWFkb25seSB0cmFuc2xhdGVkT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMkOiBPYnNlcnZhYmxlPEFycmF5PFNlYXJjaEZpZWxkQ29sdW1uVmlldz4+ID1cbiAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMub2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMkLFxuICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JyksXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW2NvbHVtbnNdKSA9PlxuICAgICAgICBjb2x1bW5zLm1hcChjb2x1bW4gPT4gKHtcbiAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgdGl0bGU6IGNvbHVtbi50aXRsZSB8fCAnLScsXG4gICAgICAgICAgZGF0YVR5cGU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgICAgYHNlYXJjaEZpZWxkcy4ke2NvbHVtbj8uZGF0YVR5cGU/LnRvTG93ZXJDYXNlKCl9YFxuICAgICAgICAgICksXG4gICAgICAgICAgZmllbGRUeXBlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgIGBzZWFyY2hGaWVsZHNPdmVydmlldy4ke2NvbHVtbj8uZmllbGRUeXBlPy50b0xvd2VyQ2FzZSgpfWBcbiAgICAgICAgICApLFxuICAgICAgICB9KSlcbiAgICAgIClcbiAgICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkRGF0YVR5cGVJdGVtSW5kZXgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuXG4gIHJlYWRvbmx5IGRhdGFUeXBlSXRlbXMkOiBPYnNlcnZhYmxlPEFycmF5PExpc3RJdGVtPj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLnNlbGVjdGVkRGF0YVR5cGVJdGVtSW5kZXgkLFxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW3NlbGVjdGVkRGF0YVR5cGVJdGVtSW5kZXhdKSA9PlxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHNlYXJjaEZpZWxkRGF0YVR5cGUuc2VsZWN0YCksXG4gICAgICAgICAga2V5OiB0aGlzLklOVkFMSURfS0VZLFxuICAgICAgICB9LFxuICAgICAgICAuLi50aGlzLkRBVEFfVFlQRVMubWFwKHR5cGUgPT4gKHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgc2VhcmNoRmllbGRzLiR7dHlwZX1gKSxcbiAgICAgICAgICBrZXk6IHR5cGUudG9VcHBlckNhc2UoKSxcbiAgICAgICAgfSkpLFxuICAgICAgXS5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBzZWxlY3RlZDogaW5kZXggPT09IHNlbGVjdGVkRGF0YVR5cGVJdGVtSW5kZXgsXG4gICAgICB9KSlcbiAgICApXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRGaWVsZFR5cGVJdGVtSW5kZXgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICByZWFkb25seSBmaWVsZFR5cGVJdGVtcyQ6IE9ic2VydmFibGU8QXJyYXk8TGlzdEl0ZW0+PiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuc2VsZWN0ZWRGaWVsZFR5cGVJdGVtSW5kZXgkLFxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW3NlbGVjdGVkRmllbGRUeXBlSXRlbUluZGV4XSkgPT5cbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBzZWFyY2hGaWVsZEZpZWxkVHlwZS5zZWxlY3RgKSxcbiAgICAgICAgICBrZXk6IHRoaXMuSU5WQUxJRF9LRVksXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnRoaXMuRklFTERfVFlQRVMubWFwKHR5cGUgPT4gKHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgc2VhcmNoRmllbGRzT3ZlcnZpZXcuJHt0eXBlfWApLFxuICAgICAgICAgIGtleTogdHlwZS50b1VwcGVyQ2FzZSgpLFxuICAgICAgICB9KSksXG4gICAgICBdLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XG4gICAgICAgIC4uLml0ZW0sXG4gICAgICAgIHNlbGVjdGVkOiBpbmRleCA9PT0gc2VsZWN0ZWRGaWVsZFR5cGVJdGVtSW5kZXgsXG4gICAgICB9KSlcbiAgICApXG4gICk7XG5cbiAgcmVhZG9ubHkgdmFsaWRLZXkkID0gY29tYmluZUxhdGVzdChbdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLCB0aGlzLmN1cnJlbnRNb2RhbFR5cGUkXSkucGlwZShcbiAgICBtYXAoKFtmb3JtVmFsdWVzLCBjdXJyZW50TW9kYWxUeXBlXSkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmdLZXlzID0gdGhpcy5jYWNoZWRPYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcy5tYXAoY29sdW1uID0+IGNvbHVtbi5rZXkpO1xuICAgICAgcmV0dXJuIGN1cnJlbnRNb2RhbFR5cGUgPT09ICdjcmVhdGUnID8gIWV4aXN0aW5nS2V5cy5pbmNsdWRlcyhmb3JtVmFsdWVzLmtleSkgOiB0cnVlO1xuICAgIH0pLFxuICAgIHN0YXJ0V2l0aChmYWxzZSlcbiAgKTtcblxuICByZWFkb25seSB2YWxpZCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMsIHRoaXMudmFsaWRLZXkkXSkucGlwZShcbiAgICBtYXAoKFtmb3JtVmFsdWVzLCB2YWxpZEtleV0pID0+ICEhKGZvcm1WYWx1ZXMucGF0aCAmJiB2YWxpZEtleSkpLFxuICAgIHN0YXJ0V2l0aChmYWxzZSlcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdE1hbmFnZW1lbnRTZXJ2aWNlOiBPYmplY3RNYW5hZ2VtZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXJcbiAgKSB7fVxuXG4gIG9wZW5Nb2RhbChtb2RhbFR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2hvd01vZGFsJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuY3VycmVudE1vZGFsVHlwZSQubmV4dChtb2RhbFR5cGUpO1xuXG4gICAgaWYgKG1vZGFsVHlwZSA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzWydrZXknXS5lbmFibGUoKTtcbiAgICAgIHRoaXMucmVzZXRGb3JtR3JvdXAoKTtcbiAgICB9IGVsc2UgaWYgKG1vZGFsVHlwZSA9PT0gJ2VkaXQnKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1sna2V5J10uZGlzYWJsZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93TW9kYWwkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgZGVsZXRlUm93KGxpc3RTZWFyY2hGaWVsZFJvd0luZGV4OiBudW1iZXIsIGNsaWNrRXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjbGlja0V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5zaG93RGVsZXRlTW9kYWwkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZWxldGVSb3dJbmRleCQubmV4dChsaXN0U2VhcmNoRmllbGRSb3dJbmRleCk7XG4gIH1cblxuICBkZWxldGVSb3dDb25maXJtYXRpb24obGlzdFNlYXJjaEZpZWxkUm93SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbktleSA9IHRoaXMuZ2V0Q29sdW1uS2V5KGxpc3RTZWFyY2hGaWVsZFJvd0luZGV4KTtcblxuICAgIGlmIChjb2x1bW5LZXkpIHtcbiAgICAgIHRoaXMuZGlzYWJsZUlucHV0KCk7XG5cbiAgICAgIHRoaXMub2JqZWN0SWQkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgc3dpdGNoTWFwKG9iamVjdElkID0+XG4gICAgICAgICAgICB0aGlzLm9iamVjdE1hbmFnZW1lbnRTZXJ2aWNlLmRlbGV0ZVNlYXJjaEZpZWxkKG9iamVjdElkLCBjb2x1bW5LZXkpXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5yZWZyZXNoT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMoKSksXG4gICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29sdW1uS2V5KGxpc3RTZWFyY2hGaWVsZFJvd0luZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRPYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkc1tsaXN0U2VhcmNoRmllbGRSb3dJbmRleF0/LmtleTtcbiAgfVxuXG4gIG1vdmVSb3coXG4gICAgbGlzdFNlYXJjaEZpZWxkUm93SW5kZXg6IG51bWJlcixcbiAgICBtb3ZlVXA6IGJvb2xlYW4sXG4gICAgY2xpY2tFdmVudDogTW91c2VFdmVudCxcbiAgICBvYmplY3RJZDogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzID0gWy4uLnRoaXMuY2FjaGVkT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHNdO1xuICAgIGNvbnN0IGxpc3RTZWFyY2hGaWVsZFJvdyA9IG9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzW2xpc3RTZWFyY2hGaWVsZFJvd0luZGV4XTtcblxuICAgIGNsaWNrRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgbGlzdFNlYXJjaEZpZWxkSW5kZXggPSBvYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcy5maW5kSW5kZXgoXG4gICAgICBmaWVsZCA9PiBmaWVsZC5rZXkgPT09IGxpc3RTZWFyY2hGaWVsZFJvdy5rZXlcbiAgICApO1xuICAgIGNvbnN0IGZvdW5kTGlzdFNlYXJjaEZpZWxkID0gey4uLm9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzW2xpc3RTZWFyY2hGaWVsZEluZGV4XX07XG4gICAgY29uc3QgZmlsdGVyZWRMaXN0U2VhcmNoRmllbGQgPSBvYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcy5maWx0ZXIoXG4gICAgICBmaWVsZCA9PiBmaWVsZC5rZXkgIT09IGxpc3RTZWFyY2hGaWVsZFJvdy5rZXlcbiAgICApO1xuICAgIGNvbnN0IG11bHRpcGxlTGlzdFNlYXJjaEZpZWxkcyA9IG9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzLmxlbmd0aCA+IDE7XG5cbiAgICBpZiAobXVsdGlwbGVMaXN0U2VhcmNoRmllbGRzICYmIG1vdmVVcCAmJiBsaXN0U2VhcmNoRmllbGRJbmRleCA+IDApIHtcbiAgICAgIGNvbnN0IGxpc3RTZWFyY2hGaWVsZEJlZm9yZUtleSA9IGAke1xuICAgICAgICBvYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkc1tsaXN0U2VhcmNoRmllbGRJbmRleCAtIDFdLmtleVxuICAgICAgfWA7XG4gICAgICBjb25zdCBsaXN0U2VhcmNoRmllbGRCZWZvcmVJbmRleCA9IGZpbHRlcmVkTGlzdFNlYXJjaEZpZWxkLmZpbmRJbmRleChcbiAgICAgICAgZmllbGQgPT4gZmllbGQua2V5ID09PSBsaXN0U2VhcmNoRmllbGRCZWZvcmVLZXlcbiAgICAgICk7XG4gICAgICBmaWx0ZXJlZExpc3RTZWFyY2hGaWVsZC5zcGxpY2UobGlzdFNlYXJjaEZpZWxkQmVmb3JlSW5kZXgsIDAsIGZvdW5kTGlzdFNlYXJjaEZpZWxkKTtcbiAgICAgIHRoaXMudXBkYXRlT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZChvYmplY3RJZCwgZmlsdGVyZWRMaXN0U2VhcmNoRmllbGQpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBtdWx0aXBsZUxpc3RTZWFyY2hGaWVsZHMgJiZcbiAgICAgICFtb3ZlVXAgJiZcbiAgICAgIGxpc3RTZWFyY2hGaWVsZEluZGV4IDwgb2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMubGVuZ3RoXG4gICAgKSB7XG4gICAgICBjb25zdCBjYXNlTGlzdENvbHVtbkFmdGVyS2V5ID0gYCR7XG4gICAgICAgIG9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzW2xpc3RTZWFyY2hGaWVsZEluZGV4ICsgMV0ua2V5XG4gICAgICB9YDtcbiAgICAgIGNvbnN0IGNhc2VMaXN0Q29sdW1uQWZ0ZXJJbmRleCA9IGZpbHRlcmVkTGlzdFNlYXJjaEZpZWxkLmZpbmRJbmRleChcbiAgICAgICAgZmllbGQgPT4gZmllbGQua2V5ID09PSBjYXNlTGlzdENvbHVtbkFmdGVyS2V5XG4gICAgICApO1xuICAgICAgZmlsdGVyZWRMaXN0U2VhcmNoRmllbGQuc3BsaWNlKGNhc2VMaXN0Q29sdW1uQWZ0ZXJJbmRleCArIDEsIDAsIGZvdW5kTGlzdFNlYXJjaEZpZWxkKTtcbiAgICAgIHRoaXMudXBkYXRlT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZChvYmplY3RJZCwgZmlsdGVyZWRMaXN0U2VhcmNoRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIHNhdmVMaXN0U2VhcmNoRmllbGRzKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZUlucHV0KCk7XG5cbiAgICB0aGlzLmN1cnJlbnRNb2RhbFR5cGUkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGN1cnJlbnRNb2RhbFR5cGUgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRNb2RhbFR5cGUgPT09ICdjcmVhdGUnKSB7XG4gICAgICAgIHRoaXMuYWRkU2VhcmNoRmllbGQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlU2VhcmNoRmllbGQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNvbHVtblJvd0NsaWNrZWQocm93OiB7a2V5OiBzdHJpbmd9KTogdm9pZCB7XG4gICAgdGhpcy5yZXNldEZvcm1Hcm91cCgpO1xuXG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5kYXRhVHlwZUl0ZW1zJCwgdGhpcy5maWVsZFR5cGVJdGVtcyRdKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKFtkYXRhVHlwZUl0ZW1zLCBmaWVsZFR5cGVJdGVtc10pID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5jYWNoZWRPYmplY3RNYW5hZ2VtZW50TGlzdFNlYXJjaEZpZWxkcy5maW5kKFxuICAgICAgICAgIGNhY2hlZENvbHVtbiA9PiBjYWNoZWRDb2x1bW4ua2V5ID09PSByb3cua2V5XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRhdGFUeXBlSXRlbSA9IGRhdGFUeXBlSXRlbXMuZmluZChpdGVtID0+IGl0ZW0ua2V5ID09PSBjb2x1bW4uZGF0YVR5cGUpO1xuICAgICAgICBjb25zdCBkYXRhVHlwZUl0ZW1JbmRleCA9IGRhdGFUeXBlSXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbi5kYXRhVHlwZSk7XG5cbiAgICAgICAgY29uc3QgZmllbGRUeXBlSXRlbSA9IGZpZWxkVHlwZUl0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLmtleSA9PT0gY29sdW1uLmZpZWxkVHlwZSk7XG4gICAgICAgIGNvbnN0IGZpZWxkVHlwZUl0ZW1JbmRleCA9IGZpZWxkVHlwZUl0ZW1zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0ua2V5ID09PSBjb2x1bW4uZmllbGRUeXBlKTtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0YVR5cGVJdGVtSW5kZXgkLm5leHQoZGF0YVR5cGVJdGVtSW5kZXgpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGRUeXBlSXRlbUluZGV4JC5uZXh0KGZpZWxkVHlwZUl0ZW1JbmRleCk7XG5cbiAgICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAga2V5OiBjb2x1bW4ua2V5LFxuICAgICAgICAgIHRpdGxlOiBjb2x1bW4udGl0bGUsXG4gICAgICAgICAgcGF0aDogY29sdW1uLnBhdGgsXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGRhdGFUeXBlOiB7Li4uZGF0YVR5cGVJdGVtfSxcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgZmllbGRUeXBlOiB7Li4uZmllbGRUeXBlSXRlbX0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub3Blbk1vZGFsKCdlZGl0Jyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZChcbiAgICBvYmplY3RJZDogc3RyaW5nLFxuICAgIHNlYXJjaEZpZWxkOiBBcnJheTxTZWFyY2hGaWVsZD5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlSW5wdXQoKTtcbiAgICB0aGlzLm9iamVjdE1hbmFnZW1lbnRTZXJ2aWNlXG4gICAgICAucHV0U2VhcmNoRmllbGRzKG9iamVjdElkLCBzZWFyY2hGaWVsZClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVmcmVzaE9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzKCk7XG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oYGxpc3Qtc2VhcmNoLWZpZWxkcyR7b2JqZWN0SWR9YCwgbnVsbCk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRTZWFyY2hGaWVsZCgpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmZvcm1Hcm91cC52YWx1ZTtcblxuICAgIHRoaXMub2JqZWN0SWQkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKG9iamVjdElkID0+XG4gICAgICAgICAgdGhpcy5vYmplY3RNYW5hZ2VtZW50U2VydmljZS5wb3N0U2VhcmNoRmllbGQoXG4gICAgICAgICAgICBvYmplY3RJZCxcbiAgICAgICAgICAgIHRoaXMubWFwRm9ybVZhbHVlc1RvQ29sdW1uKGZvcm1WYWx1ZSlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jbG9zZU1vZGFsKCk7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMoKTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZW5hYmxlSW5wdXQoKTtcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlYXJjaEZpZWxkKCk6IHZvaWQge1xuICAgIHRoaXMub2JqZWN0SWQkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKG9iamVjdElkID0+XG4gICAgICAgICAgdGhpcy5vYmplY3RNYW5hZ2VtZW50U2VydmljZS5wdXRTZWFyY2hGaWVsZChcbiAgICAgICAgICAgIG9iamVjdElkLFxuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAudmFsdWUua2V5LFxuICAgICAgICAgICAgdGhpcy5tYXBGb3JtVmFsdWVzVG9Db2x1bW4odGhpcy5mb3JtR3JvdXAudmFsdWUpXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2xvc2VNb2RhbCgpO1xuICAgICAgICAgIHRoaXMucmVmcmVzaE9iamVjdE1hbmFnZW1lbnRMaXN0U2VhcmNoRmllbGRzKCk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREb3dubG9hZChvYmplY3RJZDogc3RyaW5nLCBPYmplY3RNYW5hZ2VtZW50U2VhcmNoRmllbGRzOiBBcnJheTxTZWFyY2hGaWVsZD4pOiB2b2lkIHtcbiAgICB0aGlzLmRvd25sb2FkTmFtZSQubmV4dChgJHtvYmplY3RJZH0uanNvbmApO1xuICAgIHRoaXMuZG93bmxvYWRVcmwkLm5leHQoXG4gICAgICB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKFxuICAgICAgICAnZGF0YTp0ZXh0L2pzb247Y2hhcnNldD1VVEYtOCwnICtcbiAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoT2JqZWN0TWFuYWdlbWVudFNlYXJjaEZpZWxkcywgbnVsbCwgMikpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZUlucHV0KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZUlucHV0JC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZm9ybUdyb3VwLmRpc2FibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlSW5wdXQkLm5leHQoZmFsc2UpO1xuICAgIHRoaXMuZm9ybUdyb3VwLmVuYWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMkLm5leHQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Rm9ybUdyb3VwKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUdyb3VwLnJlc2V0KCk7XG4gICAgdGhpcy5zZWxlY3RlZERhdGFUeXBlSXRlbUluZGV4JC5uZXh0KDApO1xuICAgIHRoaXMuc2VsZWN0ZWRGaWVsZFR5cGVJdGVtSW5kZXgkLm5leHQoMCk7XG4gIH1cblxuICBwcml2YXRlIG1hcEZvcm1WYWx1ZXNUb0NvbHVtbihmb3JtVmFsdWU6IGFueSk6IFNlYXJjaEZpZWxkIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiBmb3JtVmFsdWUua2V5LFxuICAgICAgdGl0bGU6IGZvcm1WYWx1ZS50aXRsZSB8fCAnJyxcbiAgICAgIHBhdGg6IGZvcm1WYWx1ZS5wYXRoLFxuICAgICAgZGF0YVR5cGU6IGZvcm1WYWx1ZS5kYXRhVHlwZS5rZXksXG4gICAgICBmaWVsZFR5cGU6IGZvcm1WYWx1ZS5maWVsZFR5cGUua2V5LFxuICAgIH07XG4gIH1cbn1cbiIsIjwhLS1cbiAgfiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAgflxuICB+IExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgflxuICB+IGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAgflxuICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAtLT5cbjxuZy1jb250YWluZXJcbiAgKm5nSWY9XCJ7XG4gICAgc2VhcmNoRmllbGRzOiB0cmFuc2xhdGVkT2JqZWN0TWFuYWdlbWVudExpc3RTZWFyY2hGaWVsZHMkIHwgYXN5bmMsXG4gICAgZmllbGRzOiBvYmplY3RNYW5hZ2VtZW50RmllbGRzJCB8IGFzeW5jLFxuICAgIG9iamVjdElkOiBvYmplY3RJZCQgfCBhc3luYyxcbiAgICBkb3dubG9hZFVybDogZG93bmxvYWRVcmwkIHwgYXN5bmMsXG4gICAgZG93bmxvYWROYW1lOiBkb3dubG9hZE5hbWUkIHwgYXN5bmMsXG4gICAgbG9hZGluZzogbG9hZGluZyQgfCBhc3luYyxcbiAgfSBhcyBvYnNcIlxuPlxuICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkIHByLTAgcGwtMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXJpZ2h0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIG10LW0zcHggbWItMyBtci0yXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidXR0b25zOyBjb250ZXh0OiB7b2JzOiBvYnN9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW9icy5sb2FkaW5nOyBlbHNlIGxvYWRpbmdcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvYnMuc2VhcmNoRmllbGRzPy5sZW5ndGggPiAwOyBlbHNlIG5vQ29uZmlnV2FybmluZ1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdDsgY29udGV4dDoge29iczogb2JzfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNyZWF0ZUVkaXRNb2RhbFwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZWxldGVNb2RhbFwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2J1dHRvbnMgbGV0LW9icz1cIm9ic1wiPlxuICA8YVxuICAgIGNkc0xpbmtcbiAgICBjbGFzcz1cImNlbnRlci1saW5rXCJcbiAgICBbaHJlZl09XCJvYnMuZG93bmxvYWRVcmxcIlxuICAgIFtkb3dubG9hZF09XCJvYnMuZG93bmxvYWROYW1lXCJcbiAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAhb2JzLmRvd25sb2FkVXJsIHx8XG4gICAgICAhb2JzLmRvd25sb2FkTmFtZSB8fFxuICAgICAgb2JzLnNlYXJjaEZpZWxkcz8ubGVuZ3RoIDwgMSB8fFxuICAgICAgb2JzLmRpc2FibGVJbnB1dCB8fFxuICAgICAgb2JzLmxvYWRpbmdcbiAgICBcIlxuICA+XG4gICAge3sgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRvd25sb2FkJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2E+XG4gIDxidXR0b25cbiAgICAoY2xpY2spPVwib3Blbk1vZGFsKCdjcmVhdGUnKVwiXG4gICAgY2RzQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgc2l6ZT1cIm1kXCJcbiAgICBbZGlzYWJsZWRdPVwib2JzLmxvYWRpbmdcIlxuICAgIGNsYXNzPVwibWwtM1wiXG4gID5cbiAgICB7eyAnc2VhcmNoRmllbGRzT3ZlcnZpZXcuYWRkJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDxzdmcgY2xhc3M9XCJjZHMtLWJ0bl9faWNvblwiIGNkc0ljb249XCJhZGRcIiBzaXplPVwiMTZcIj48L3N2Zz5cbiAgPC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vdmVSb3dCdXR0b25zIGxldC1pbmRleD1cImluZGV4XCIgbGV0LWxlbmd0aD1cImxlbmd0aFwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJtb3ZlLXJvdy1idXR0b25zXCJcbiAgICAqbmdJZj1cIntcbiAgICAgIGRpc2FibGVJbnB1dDogZGlzYWJsZUlucHV0JCB8IGFzeW5jLFxuICAgICAgb2JqZWN0SWQ6IG9iamVjdElkJCB8IGFzeW5jLFxuICAgIH0gYXMgb2JzXCJcbiAgPlxuICAgIDxpXG4gICAgICBjbGFzcz1cIm1kaSBtZGktZGVsZXRlIGJ0biBidG4tb3V0bGluZS1kYW5nZXIgbXItMVwiXG4gICAgICAoY2xpY2spPVwiZGVsZXRlUm93KGluZGV4LCAkZXZlbnQpXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQgZGlzYWJsZWQtbW92ZS1yb3ctYnV0dG9uJzogb2JzLmRpc2FibGVJbnB1dH1cIlxuICAgID48L2k+XG4gICAgPGlcbiAgICAgIGNsYXNzPVwibWRpIG1kaS1hcnJvdy11cC1ib2xkIGJ0biBidG4tb3V0bGluZS1wcmltYXJ5IG1yLTFcIlxuICAgICAgKGNsaWNrKT1cIm1vdmVSb3coaW5kZXgsIHRydWUsICRldmVudCwgb2JzLm9iamVjdElkKVwiXG4gICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGVkIGRpc2FibGVkLW1vdmUtcm93LWJ1dHRvbic6IGluZGV4ID09PSAwIHx8IG9icy5kaXNhYmxlSW5wdXR9XCJcbiAgICA+PC9pPlxuICAgIDxpXG4gICAgICBjbGFzcz1cIm1kaSBtZGktYXJyb3ctZG93bi1ib2xkIGJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIlxuICAgICAgKGNsaWNrKT1cIm1vdmVSb3coaW5kZXgsIGZhbHNlLCAkZXZlbnQsIG9icy5vYmplY3RJZClcIlxuICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlZCBkaXNhYmxlZC1tb3ZlLXJvdy1idXR0b24nOiBpbmRleCA9PT0gbGVuZ3RoIC0gMSB8fCBvYnMuZGlzYWJsZUlucHV0fVwiXG4gICAgPjwvaT5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xpc3QgbGV0LW9icz1cIm9ic1wiPlxuICA8dmFsdGltby1saXN0XG4gICAgW2l0ZW1zXT1cIm9icy5zZWFyY2hGaWVsZHNcIlxuICAgIFtmaWVsZHNdPVwib2JzLmZpZWxkc1wiXG4gICAgW3ZpZXdNb2RlXT1cImZhbHNlXCJcbiAgICBbaGVhZGVyXT1cImZhbHNlXCJcbiAgICAqbmdJZj1cIm9icy5zZWFyY2hGaWVsZHM7IGVsc2UgbG9hZGluZ1wiXG4gICAgW2xhc3RDb2x1bW5UZW1wbGF0ZV09XCJtb3ZlUm93QnV0dG9uc1RlbXBsYXRlUmVmXCJcbiAgICAocm93Q2xpY2tlZCk9XCJjb2x1bW5Sb3dDbGlja2VkKCRldmVudClcIlxuICA+XG4gIDwvdmFsdGltby1saXN0PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjcmVhdGVFZGl0TW9kYWw+XG4gIDxjZHMtbW9kYWxcbiAgICB2YWx0aW1vQ2RzTW9kYWxcbiAgICAqbmdJZj1cIntcbiAgICAgIHR5cGU6IGN1cnJlbnRNb2RhbFR5cGUkIHwgYXN5bmMsXG4gICAgICBzaG93OiBzaG93TW9kYWwkIHwgYXN5bmMsXG4gICAgICB2YWxpZDogdmFsaWQkIHwgYXN5bmMsXG4gICAgICBkaXNhYmxlSW5wdXQ6IGRpc2FibGVJbnB1dCQgfCBhc3luYyxcbiAgICAgIHZhbGlkS2V5OiB2YWxpZEtleSQgfCBhc3luYyxcbiAgICB9IGFzIG1vZGFsT2JzXCJcbiAgICBbb3Blbl09XCJtb2RhbE9icy5zaG93XCJcbiAgPlxuICAgIDxjZHMtbW9kYWwtaGVhZGVyIFtzaG93Q2xvc2VCdXR0b25dPVwidHJ1ZVwiIChjbG9zZVNlbGVjdCk9XCJjbG9zZU1vZGFsKClcIj5cbiAgICAgIDxoMyBjZHNNb2RhbEhlYWRlckhlYWRpbmc+XG4gICAgICAgIHt7XG4gICAgICAgICAgbW9kYWxPYnMudHlwZSA9PT0gJ2NyZWF0ZSdcbiAgICAgICAgICAgID8gKCdzZWFyY2hGaWVsZHNPdmVydmlldy5hZGQnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgOiAoJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmVkaXQnIHwgdHJhbnNsYXRlKVxuICAgICAgICB9fVxuICAgICAgPC9oMz5cbiAgICA8L2Nkcy1tb2RhbC1oZWFkZXI+XG4gICAgPHNlY3Rpb24gY2RzTW9kYWxDb250ZW50PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1vZGFsQ29udGVudDsgY29udGV4dDoge21vZGFsT2JzOiBtb2RhbE9ic31cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L3NlY3Rpb24+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1vZGFsRm9vdGVyOyBjb250ZXh0OiB7bW9kYWxPYnM6IG1vZGFsT2JzfVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Nkcy1tb2RhbD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9kYWxDb250ZW50IGxldC1tb2RhbE9icz1cIm1vZGFsT2JzXCI+XG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCIgY2xhc3M9XCJsaXN0LWNvbHVtbi1mb3JtXCI+XG4gICAgPGRpdiBjbGFzcz1cImNkcy0tdGV4dC1pbnB1dF9fZmllbGQtd3JhcHBlclwiPlxuICAgICAgPGNkcy1sYWJlbCBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwXCI+XG4gICAgICAgICAge3sgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnRpdGxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDx2LXRvb2x0aXAtaWNvblxuICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMudGl0bGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxpbnB1dCBjZHNUZXh0IGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgLz5cbiAgICAgIDwvY2RzLWxhYmVsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjZHMtLXRleHQtaW5wdXRfX2ZpZWxkLXdyYXBwZXJcIj5cbiAgICAgIDxjZHMtbGFiZWxcbiAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dCB8fCBtb2RhbE9icy50eXBlID09PSAnZWRpdCdcIlxuICAgICAgICBbaW52YWxpZF09XCJtb2RhbE9icy52YWxpZEtleSA9PT0gZmFsc2VcIlxuICAgICAgICBbaW52YWxpZFRleHRdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnVuaXF1ZUtleVdhcm5pbmcnIHwgdHJhbnNsYXRlXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXBcIj5cbiAgICAgICAgICB7eyAnc2VhcmNoRmllbGRzT3ZlcnZpZXcua2V5JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDx2LXRvb2x0aXAtaWNvblxuICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMua2V5JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICA+PC92LXRvb2x0aXAtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aW5wdXQgY2RzVGV4dCBmb3JtQ29udHJvbE5hbWU9XCJrZXlcIiBbaW52YWxpZF09XCJtb2RhbE9icy52YWxpZEtleSA9PT0gZmFsc2VcIiAvPlxuICAgICAgPC9jZHMtbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNkcy0tdGV4dC1pbnB1dF9fZmllbGQtd3JhcHBlclwiPlxuICAgICAgPGNkcy1sYWJlbCBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwXCI+XG4gICAgICAgICAge3sgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnBhdGgnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5vYmplY3RzQXBpUGF0aCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgPjwvdi10b29sdGlwLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGlucHV0IGNkc1RleHQgZm9ybUNvbnRyb2xOYW1lPVwicGF0aFwiIC8+XG4gICAgICA8L2Nkcy1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8Y2RzLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXAgc2VsZWN0LWxhYmVsXCI+XG4gICAgICAgICAge3sgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRhdGFUeXBlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDx2LXRvb2x0aXAtaWNvblxuICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMuZGF0YVR5cGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxjZHMtZHJvcGRvd24gZm9ybUNvbnRyb2xOYW1lPVwiZGF0YVR5cGVcIiBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgICAgPGNkcy1kcm9wZG93bi1saXN0IFtpdGVtc109XCJkYXRhVHlwZUl0ZW1zJCB8IGFzeW5jXCI+PC9jZHMtZHJvcGRvd24tbGlzdD5cbiAgICAgICAgPC9jZHMtZHJvcGRvd24+XG4gICAgICA8L2Nkcy1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8Y2RzLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXAgc2VsZWN0LWxhYmVsXCI+XG4gICAgICAgICAge3sgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmZpZWxkVHlwZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8di10b29sdGlwLWljb25cbiAgICAgICAgICAgIFt0b29sdGlwXT1cIidzZWFyY2hGaWVsZHNPdmVydmlld1Rvb2x0aXBzLmZpZWxkVHlwZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgPjwvdi10b29sdGlwLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGNkcy1kcm9wZG93biBmb3JtQ29udHJvbE5hbWU9XCJmaWVsZFR5cGVcIiBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgICAgPGNkcy1kcm9wZG93bi1saXN0IFtpdGVtc109XCJmaWVsZFR5cGVJdGVtcyQgfCBhc3luY1wiPjwvY2RzLWRyb3Bkb3duLWxpc3Q+XG4gICAgICAgIDwvY2RzLWRyb3Bkb3duPlxuICAgICAgPC9jZHMtbGFiZWw+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9kYWxGb290ZXIgbGV0LW1vZGFsT2JzPVwibW9kYWxPYnNcIj5cbiAgPGNkcy1tb2RhbC1mb290ZXI+XG4gICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2RzQnV0dG9uPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgW2F0dHIubW9kYWwtcHJpbWFyeS1mb2N1c109XCJ0cnVlXCJcbiAgICAgICAgKGNsaWNrKT1cImNsb3NlTW9kYWwoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgPlxuICAgICAgICB7eyAnc2VhcmNoRmllbGRzT3ZlcnZpZXcuY2xvc2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2RzQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgICAgIFthdHRyLm1vZGFsLXByaW1hcnktZm9jdXNdPVwidHJ1ZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy52YWxpZCA9PT0gZmFsc2VcIlxuICAgICAgICAoY2xpY2spPVwic2F2ZUxpc3RTZWFyY2hGaWVsZHMoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICBtb2RhbE9icy5kaXNhYmxlSW5wdXQgfHwgbW9kYWxPYnMudmFsaWQgPT09IGZhbHNlIHx8IG1vZGFsT2JzLnZhbGlkS2V5ID09PSBmYWxzZVxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICB7eyAnc2VhcmNoRmllbGRzT3ZlcnZpZXcuc2F2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Nkcy1tb2RhbC1mb290ZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlbGV0ZU1vZGFsPlxuICA8dmFsdGltby1jb25maXJtYXRpb24tbW9kYWxcbiAgICBbc2hvd01vZGFsU3ViamVjdCRdPVwic2hvd0RlbGV0ZU1vZGFsJFwiXG4gICAgW291dHB1dE9uQ29uZmlybV09XCJkZWxldGVSb3dJbmRleCQgfCBhc3luY1wiXG4gICAgKGNvbmZpcm1FdmVudCk9XCJkZWxldGVSb3dDb25maXJtYXRpb24oJGV2ZW50KVwiXG4gICAgY29uZmlybUJ1dHRvblRleHRUcmFuc2xhdGlvbktleT1cInNlYXJjaEZpZWxkc092ZXJ2aWV3LmRlbGV0ZVNlYXJjaEZpZWxkXCJcbiAgICB0aXRsZVRyYW5zbGF0aW9uS2V5PVwic2VhcmNoRmllbGRzT3ZlcnZpZXcuc2VhcmNoRmllbGRcIlxuICAgIGNvbnRlbnRUcmFuc2xhdGlvbktleT1cInNlYXJjaEZpZWxkc092ZXJ2aWV3LmRlbGV0ZVNlYXJjaEZpZWxkQ29uZmlybWF0aW9uXCJcbiAgPjwvdmFsdGltby1jb25maXJtYXRpb24tbW9kYWw+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI25vQ29uZmlnV2FybmluZz5cbiAgPGRpdiBjbGFzcz1cInBsLTIgcHItMiBwYi0yXCI+XG4gICAgPGNkcy1ub3RpZmljYXRpb25cbiAgICAgIFtub3RpZmljYXRpb25PYmpdPVwie1xuICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgIHRpdGxlOiAnc2VhcmNoRmllbGRzT3ZlcnZpZXcubm9TZWFyY2hGaWVsZHNDb25maWd1cmVkV2FybmluZ1RpdGxlJyB8IHRyYW5zbGF0ZSxcbiAgICAgICAgc2hvd0Nsb3NlOiBmYWxzZSxcbiAgICAgIH1cIlxuICAgID5cbiAgICA8L2Nkcy1ub3RpZmljYXRpb24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2FkaW5nPlxuICA8ZGl2IGNsYXNzPVwibG9hZGluZy1pY29uXCI+PGNkcy1sb2FkaW5nPjwvY2RzLWxvYWRpbmc+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|