gamma-app-controller 1.3.6 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/application-controller/application-content.service.mjs +36 -36
- package/esm2020/lib/application-controller/application-menu-controller/application-create-menu/application-create-menu.component.mjs +2 -2
- package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +1 -2
- package/esm2020/lib/application-controller/page-controller/page-config/page-config.component.mjs +3 -3
- package/esm2020/lib/application-controller/support-components/dash-table/dash-table.component.mjs +1 -2
- package/esm2020/lib/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +1 -2
- package/esm2020/lib/shared/permission-helper.mjs +4 -4
- package/esm2020/lib/shared/user-access/user-access.component.mjs +3 -3
- package/esm2020/lib/template-module/KpiCreationModule/create-kpi-tree.component.mjs +137 -277
- package/esm2020/lib/template-module/KpiCreationModule/createKpi.service.mjs +37 -6
- package/esm2020/lib/template-module/KpiCreationModule/treeview/components/basic/basic.component.mjs +3 -3
- package/esm2020/lib/template-module/KpiCreationModule/treeview/components/collapsable/collapsable.component.mjs +4 -15
- package/esm2020/lib/template-module/KpiCreationModule/treeview/treeview.component.mjs +4 -6
- package/esm2020/lib/template-module/bookmarked-template/bookmarked-layout.service.mjs +8 -8
- package/esm2020/lib/template-module/cdrConfigModule/cdr-browser.service.mjs +2 -2
- package/esm2020/lib/template-module/defaulLandingComponent/landing-component.component.mjs +1 -2
- package/esm2020/lib/template-module/defaulLandingComponent/landing-component.service.mjs +8 -8
- package/esm2020/lib/template-module/defaulLandingMultiLayoutComponent/defaulLandingMultiLayout.service.mjs +8 -8
- package/esm2020/lib/template-module/kpiWithMultiLayout/kpi-multi-layout.service.mjs +8 -8
- package/esm2020/lib/template-module/kpiWithSingleLayout/kpi-single-layout.service.mjs +8 -8
- package/fesm2015/gamma-app-controller.mjs +269 -403
- package/fesm2015/gamma-app-controller.mjs.map +1 -1
- package/fesm2020/gamma-app-controller.mjs +278 -403
- package/fesm2020/gamma-app-controller.mjs.map +1 -1
- package/lib/application-controller/application-content.service.d.ts +1 -1
- package/lib/template-module/KpiCreationModule/create-kpi-tree.component.d.ts +10 -15
- package/lib/template-module/KpiCreationModule/createKpi.service.d.ts +4 -0
- package/package.json +1 -1
package/esm2020/lib/application-controller/page-controller/page-config/page-config.component.mjs
CHANGED
|
@@ -1020,10 +1020,10 @@ export class PageConfigComponent {
|
|
|
1020
1020
|
}
|
|
1021
1021
|
}
|
|
1022
1022
|
PageConfigComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PageConfigComponent, deps: [{ token: i1.CommonService }, { token: i2.ActivatedRoute }, { token: i0.ViewContainerRef }, { token: i0.ComponentFactoryResolver }, { token: i3.ApplicationContentService }, { token: i4.ToastrService }, { token: i2.Router }, { token: i5.ApplicationDatssetsCall }], target: i0.ɵɵFactoryTarget.Component });
|
|
1023
|
-
PageConfigComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PageConfigComponent, selector: "app-dashbord-config", viewQueries: [{ propertyName: "dynamicComponentContainer", first: true, predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }, { propertyName: "dynamicContainer", first: true, predicate: ["dynamicContainer"], descendants: true, static: true }, { propertyName: "scrollView", first: true, predicate: DxScrollViewComponent, descendants: true }], ngImport: i0, template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<div class=\"flex flex-row h-[90vh] w-full\">\n <div class=\"w-3/4 border-r h-full flex flex-col px-2\">\n <!-- Scrollable content -->\n <div class=\"flex-grow overflow-y-auto\">\n <div class=\"flex flex-wrap my-3\" #dynamicContainer></div>\n </div>\n\n <!-- Fixed bottom section -->\n <div class=\"flex flex-row justify-center items-center h-16 m-2 border shrink-0\">\n <lib-common-header [pageTitle]=\"''\"></lib-common-header>\n <div class=\"{{commonService.btn_primary_md}} m-2\" (click)=\"addWidget()\">Add Layout</div>\n <div class=\"{{commonService.btnOthersPurple}} m-2 cursor-pointer\" (click)=\"getViewPage()\">View Page</div>\n </div>\n </div>\n <div class=\"w-1/4 p-2 h-full\">\n <ng-container *ngIf=\"isDashBoardContent\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\" (click)=\"backToMainView()\">\n Back\n </div>\n <ng-container *ngFor=\"let item of page_config.api_config; let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b\">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.widGetConfig.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <!-- <button (click)=\"editSelectedWidget(item, i)\"\n class=\"w-8 h-8 bg-sky-600 hover:bg-blue-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-edit\"></i>\n </button> -->\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isWidgetCreationContent\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\">\n <span *ngIf=\"!islayoutCreate\">Widget Settings</span>\n <span *ngIf=\"islayoutCreate\">Layout Settings</span>\n </h6>\n <div class=\"flex flex-row my-4\">\n <dx-check-box class=\"ml-auto\" [(ngModel)]=\"addedwidGetConfig.display\" text=\"Display\"></dx-check-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Width</span>\n <dx-select-box class=\"w-1/2\" [items]=\"widget_width\"\n [(ngModel)]=\"addedwidGetConfig.width\"></dx-select-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Height</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.height\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <div class=\"text-md my-auto px-2\">Widget Title</div>\n <div><dx-text-box class=\"w-1/2\" [(ngModel)]=\"widgetTitle\"></dx-text-box></div>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <span class=\"text-md my-auto px-2\">Widget Name</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"widgetName\"></dx-text-box>\n </div>\n\n\n <div class=\"flex flex-row mb-5 justify-between\" *ngIf=\"islayoutCreate\">\n <span class=\"text-sm my-auto px-2\">Layout Title</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Filter</span>\n <dx-select-box class=\"w-1/2\" [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"selectedFilterId\"\n (onValueChanged)=\"getFilterValueById($event)\"></dx-select-box>\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div class=\"mt-6\" *ngIf=\"!islayoutCreate && isEditMainLayout\">\n <ng-container\n *ngFor=\"let item of dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode;let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b \">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.nodeProperties.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n *ngIf=\"i !== dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </div>\n </ng-container>\n\n\n\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Application Views\n </div>\n <div class=\"border-x border-b p-2\">\n <ng-container *ngFor=\"let item of allWidgetInnerContent; let i = index\">\n <div class=\"group w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.viewName}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== allWidgetInnerContent.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentViews(item)\">\n <i class=\"fa fa-eye\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentDatasets(item)\">\n <i class=\"fa fa-database\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromConfig(i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Add Filter For View\n\n </div>\n <div class=\"border-x border-b p-2\">\n <div class=\"flex flex-row py-3 border-b\">\n <dx-check-box [(ngModel)]=\"addedwidGetConfig.isWidgetFilter\"\n text=\"Popup Columns Filter Enable\"></dx-check-box>\n </div>\n <div class=\"flex flex-row my-2 border-b\">\n <ng-container *ngFor=\"let item of nodeProperticeFilters; let i = index\">\n <div class=\"flex flex-wrap border-b\">\n <div class=\"px-1 w-1/3\">\n <div class=\"text-md\">Input Type</div>\n <dx-select-box [items]=\"['text']\" [(ngModel)]=\"item.input_type\"\n value=\"text\"></dx-select-box>\n </div>\n <div class=\"px-1-1 w-2/3\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Server Column</div>\n <dx-text-box [(ngModel)]=\"item.server_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Local Column</div>\n <dx-text-box [(ngModel)]=\"item.local_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/3\" *ngIf=\"item.input_type == 'select'\">\n <div class=\"text-md\">Columns Name</div>\n <dx-text-box [(ngModel)]=\"item.select_box_option\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\">\n <div class=\"flex justify-end\">\n <div class=\"{{commonService.btn_danger_sm}} w-24 mt-6 text-center\"\n (click)=\"deleteNodeFilter(i)\">Delete Filter</div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"{{commonService.btn_primary_sm}} w-auto text-center\"\n (click)=\"getNodeProperticeFilterOption()\">Add\n Filter</div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-row justify-end items-center h-16 m-2\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div *ngIf=\"islayoutCreate\"\n class=\"{{commonService.btn_success_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addLayoutTOview()\">Add View\n </div>\n <div *ngIf=\"!islayoutCreate && !isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addWidgetTOview()\">Add Layout\n </div>\n <div *ngIf=\"!islayoutCreate && isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateLayoutWidgetTOview()\">Update Layout\n </div>\n\n </ng-container>\n\n <div class=\"{{commonService.btn_warning_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateToView()\" *ngIf=\"isUpdateWidget\">Update View\n </div>\n\n </div>\n\n\n <!-- <pre><code>{{dashBoardWidgetConfig | json}}</code></pre> -->\n </ng-container>\n <ng-container *ngIf=\"isChartButtonClick\">\n <h6\n class=\"mb-2 font-bold text-md tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center\">\n <i class=\"fa fa-bar-chart-o mr-2\"></i> Select View\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursor-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n </h6>\n <div class=\" h-[80vh] overflow-x-auto\">\n <div class=\"relative my-2 \">\n <input type=\"text\" [(ngModel)]=\"viewToSearch\" (keyup)=\"filterViews()\" (keydown)=\"filterViews()\"\n class=\"bg-gray-800 border border-gray-700 text-gray-200 text-sm focus:ring-gray-400 focus:border-gray-500 block w-full p-4 h-8 rounded\"\n placeholder=\"Search View\" />\n <button type=\"button\" class=\"absolute inset-y-0 right-0 flex items-center pr-6\">\n <mat-icon class=\"rotate-90 cursor-pointer\" [svgIcon]=\"'heroicons_outline:search'\"></mat-icon>\n </button>\n </div>\n <ng-container *ngFor=\"let item of filteredComponentConfig\">\n <div class=\"relative group my-3 w-full\">\n <!-- Item View Name -->\n <div class=\"text-md font-bold border-b py-2 cursar-pointer\">\n {{item.viewName}}</div>\n\n <!-- Hover Buttons -->\n <div\n class=\"absolute top-0 right-0 flex space-x-2 opacity-0 group-hover:opacity-100 transition-opacity duration-300 pb-2\">\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700\">\n <i class=\"fa fa-pencil-square-o\" aria-hidden=\"true\"\n (click)=\"editComponentViews(item)\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-green-500 hover:bg-green-700\"\n (click)=\"getComponentConfig(item)\">\n <i class=\"fa fa-plus\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n\n </ng-container>\n <ng-container *ngIf=\"isDefaultView\">\n <ng-container *ngFor=\"let item of dashBoardWidgetConfig.widgets; let i = index\">\n <div class=\"group my-3 w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.widgetTitle}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== dashBoardWidgetConfig.widgets.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"getEditViewFromLayout(item,i)\">\n <i class=\"fa fa-pencil-square\" aria-hidden=\"true\"></i>\n\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromLayout(item,i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n\n </div>\n</div>\n<!-- </div> -->\n\n<dx-popup [(visible)]=\"isEditOptionClick\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"'auto'\" [showTitle]=\"true\" class=\"popup\" title=\"{{editViewdataSourceModal.viewName}}\">\n <div *dxTemplate=\"let data of 'content'\">\n\n <app-dash-chart [datasetmodal]=\"editViewdataSourceModal\" (getChartConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'chart'\"></app-dash-chart>\n <app-dash-table [datasetmodal]=\"editViewdataSourceModal\" (getTableConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'table'\"></app-dash-table>\n <!-- <app-dash-other [datasetmodal]=\"editViewdataSourceModal\" *ngIf=\"editViewdataSourceModal.viewType == 'others'\"\n (createOtherComponentView)=\"getEmitNewChartCongig($event)\"></app-dash-other> -->\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isCreateDataset\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateDatasetWithDatasetId\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\" (onHidden)=\"getDatasetPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [selectedDatasetId]=\"selectedDatasetId\" [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n<dx-popup [(visible)]=\"isCreateNewViewWithDefaultView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\"\n [width]=\"1200\" [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\"\n (onHidden)=\"getViewPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [selectedViewId]=\"selectedViewId\" [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateNewView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isWidgetFilters\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"800\" [height]=\"400\"\n [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"my-2\">\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'85%'\">\n <ng-container *ngFor=\"let item of nodeproperticeFilterDataSource; let i = index\">\n <div class=\"flex flex-row my-2\">\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.columnName\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <dx-select-box [items]=\"['get','let']\" [(ngModel)]=\"item.operator\"\n placeholder=\"Operator\"></dx-select-box>\n </div>\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.value\"></dx-text-box>\n </div>\n </div>\n </ng-container>\n\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"submitFilter()\">Submit</button>\n </div>\n\n </div>\n\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isAdvanceLayout\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"700\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"flex flex-row px-2 mb-3\">\n <div class=\"w-2/3 mb-2\">\n <div class=\"text-md mb-2\">Select Views</div>\n <dx-tag-box [dataSource]=\"componentConfigDataSource\" valueExpr=\"viewId\" displayExpr=\"viewName\"\n [multiline]=\"true\" [showSelectionControls]=\"true\" [(ngModel)]=\"selectedViewsIds\"\n [maxDisplayedTags]=\"3\" (onValueChanged)=\"getSelectedColumnSource($event)\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n <div class=\"w-1/3 px-2\">\n <button class=\"{{commonService.btn_primary_md}} mt-6\" (click)=\"getProcessForConfig()\">\n Add To View\n </button>\n <!-- <button class=\"{{commonService.btn_danger_md}} cursor-pointer mt-6\" (click)=\"cancelCdrConfig()\">Cancel\n </button> -->\n </div>\n </div>\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'80%'\">\n\n <div class=\"m-2 border-b\" *ngIf=\"isProceed\">\n <ng-container *ngFor=\"let item of advanceLayoutContainer; let i = index;\">\n <div class=\"flex flex-row m-2\">\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\">View Name</div>\n <dx-text-box [(ngModel)]=\"item.compConfig.viewConfig[0].viewName\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Title</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Width</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"widget_width\"\n [(ngModel)]=\"item.nodeProperties.width\"></dx-select-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Height</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.height\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Filter</div>\n <dx-select-box [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"item.filterId\"></dx-select-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mt-8\">\n <dx-check-box [(ngModel)]=\"item.nodeProperties.display\" text=\"Display\"></dx-check-box>\n </div>\n </div>\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteView(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 my-2 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\" (click)=\"submitAdvanceView()\">Add\n Layout</button>\n </div>\n </div>\n</dx-popup>", styles: ["::ng-deep #scrollview-demo{min-height:550px}::ng-deep #scrollview{height:auto;position:absolute;top:0;bottom:300px;padding:20px}::ng-deep #scrollview-content{white-space:pre-wrap}.scrollable-content{height:90vh;overflow-y:auto}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i8.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i9.DxPopupComponent, selector: "dx-popup", inputs: ["accessKey", "animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "dragAndResizeArea", "dragEnabled", "dragOutsideBoundary", "elementAttr", "focusStateEnabled", "fullScreen", "height", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "resizeEnabled", "restorePosition", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showTitle", "tabIndex", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onResize", "onResizeEnd", "onResizeStart", "onShowing", "onShown", "onTitleRendered", "accessKeyChange", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "dragAndResizeAreaChange", "dragEnabledChange", "dragOutsideBoundaryChange", "elementAttrChange", "focusStateEnabledChange", "fullScreenChange", "heightChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "resizeEnabledChange", "restorePositionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showTitleChange", "tabIndexChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { kind: "component", type: i10.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }, { kind: "component", type: i11.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i12.DxTagBoxComponent, selector: "dx-tag-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyValueMode", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hideSelectedItems", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxDisplayedTags", "maxFilterQueryLength", "maxLength", "minSearchLength", "multiline", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectAllMode", "selectAllText", "selectedItems", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showMultiTagOnly", "showSelectionControls", "stylingMode", "tabIndex", "tagTemplate", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCustomItemCreating", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onMultiTagPreparing", "onOpened", "onOptionChanged", "onSelectAllValueChanged", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyValueModeChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hideSelectedItemsChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxDisplayedTagsChange", "maxFilterQueryLengthChange", "maxLengthChange", "minSearchLengthChange", "multilineChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectAllModeChange", "selectAllTextChange", "selectedItemsChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showMultiTagOnlyChange", "showSelectionControlsChange", "stylingModeChange", "tabIndexChange", "tagTemplateChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i13.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i14.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: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i16.LoadingComponent, selector: "app-loading" }, { kind: "component", type: i17.CreateCompViewComponent, selector: "app-create-comp-view", inputs: ["kpiTreeData", "isHeader", "selectedViewId"] }, { kind: "component", type: i18.DashChartComponent, selector: "app-dash-chart", inputs: ["datasetmodal"], outputs: ["getChartConfigOutPut"] }, { kind: "component", type: i19.DashTableComponent, selector: "app-dash-table", inputs: ["datasetmodal"], outputs: ["getTableConfigOutPut"] }, { kind: "component", type: i20.CreateDatasetComponent, selector: "app-create-dataset", inputs: ["isHeader", "selectedDatasetId"] }, { kind: "component", type: i21.CommonHeaderComponent, selector: "lib-common-header", inputs: ["pageTitle"] }] });
|
|
1023
|
+
PageConfigComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PageConfigComponent, selector: "app-dashbord-config", viewQueries: [{ propertyName: "dynamicComponentContainer", first: true, predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }, { propertyName: "dynamicContainer", first: true, predicate: ["dynamicContainer"], descendants: true, static: true }, { propertyName: "scrollView", first: true, predicate: DxScrollViewComponent, descendants: true }], ngImport: i0, template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<div class=\"flex flex-row h-[90vh] w-full\">\n <div class=\"w-3/4 border-r h-full flex flex-col px-2\">\n <!-- Scrollable content -->\n <div class=\"flex-grow overflow-y-auto\">\n <div class=\"flex flex-wrap my-3\" #dynamicContainer></div>\n </div>\n\n <!-- Fixed bottom section -->\n <div class=\"flex flex-row justify-center items-center h-16 m-2 border shrink-0\">\n <lib-common-header [pageTitle]=\"''\"></lib-common-header>\n <div class=\"{{commonService.btn_primary_md}} m-2\" (click)=\"addWidget()\">Add Layout</div>\n <div class=\"{{commonService.btnOthersPurple}} m-2 cursor-pointer\" (click)=\"getViewPage()\">View Page</div>\n </div>\n </div>\n <div class=\"w-1/4 p-2 h-full\">\n <ng-container *ngIf=\"isDashBoardContent\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\" (click)=\"backToMainView()\">\n Back\n </div>\n <ng-container *ngFor=\"let item of page_config.api_config; let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b\">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.widGetConfig.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <!-- <button (click)=\"editSelectedWidget(item, i)\"\n class=\"w-8 h-8 bg-sky-600 hover:bg-blue-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-edit\"></i>\n </button> -->\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isWidgetCreationContent\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\">\n <span *ngIf=\"!islayoutCreate\">Widget Settings</span>\n <span *ngIf=\"islayoutCreate\">Layout Settings</span>\n </h6>\n <div class=\"flex flex-row my-4\">\n <dx-check-box class=\"ml-auto\" [(ngModel)]=\"addedwidGetConfig.display\" text=\"Display\"></dx-check-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Width</span>\n <dx-select-box class=\"w-1/2\" [items]=\"widget_width\"\n [(ngModel)]=\"addedwidGetConfig.width\"></dx-select-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Height</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.height\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <div class=\"text-md my-auto px-2 inline\">Widget Title</div>\n <dx-text-box class=\"w-full\" [(ngModel)]=\"widgetTitle\"></dx-text-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <div class=\"text-md my-auto px-2\">Widget Name</div>\n <dx-text-box class=\"w-full\" [(ngModel)]=\"widgetName\"></dx-text-box>\n </div>\n\n\n <div class=\"flex flex-row mb-5 justify-between\" *ngIf=\"islayoutCreate\">\n <span class=\"text-sm my-auto px-2\">Layout Title</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Filter</span>\n <dx-select-box class=\"w-1/2\" [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"selectedFilterId\"\n (onValueChanged)=\"getFilterValueById($event)\"></dx-select-box>\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div class=\"mt-6\" *ngIf=\"!islayoutCreate && isEditMainLayout\">\n <ng-container\n *ngFor=\"let item of dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode;let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b \">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.nodeProperties.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n *ngIf=\"i !== dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </div>\n </ng-container>\n\n\n\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Application Views\n </div>\n <div class=\"border-x border-b p-2\">\n <ng-container *ngFor=\"let item of allWidgetInnerContent; let i = index\">\n <div class=\"group w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.viewName}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== allWidgetInnerContent.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentViews(item)\">\n <i class=\"fa fa-eye\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentDatasets(item)\">\n <i class=\"fa fa-database\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromConfig(i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Add Filter For View\n\n </div>\n <div class=\"border-x border-b p-2\">\n <div class=\"flex flex-row py-3 border-b\">\n <dx-check-box [(ngModel)]=\"addedwidGetConfig.isWidgetFilter\"\n text=\"Popup Columns Filter Enable\"></dx-check-box>\n </div>\n <div class=\"flex flex-row my-2 border-b\">\n <ng-container *ngFor=\"let item of nodeProperticeFilters; let i = index\">\n <div class=\"flex flex-wrap border-b\">\n <div class=\"px-1 w-1/3\">\n <div class=\"text-md\">Input Type</div>\n <dx-select-box [items]=\"['text']\" [(ngModel)]=\"item.input_type\"\n value=\"text\"></dx-select-box>\n </div>\n <div class=\"px-1-1 w-2/3\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Server Column</div>\n <dx-text-box [(ngModel)]=\"item.server_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Local Column</div>\n <dx-text-box [(ngModel)]=\"item.local_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/3\" *ngIf=\"item.input_type == 'select'\">\n <div class=\"text-md\">Columns Name</div>\n <dx-text-box [(ngModel)]=\"item.select_box_option\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\">\n <div class=\"flex justify-end\">\n <div class=\"{{commonService.btn_danger_sm}} w-24 mt-6 text-center\"\n (click)=\"deleteNodeFilter(i)\">Delete Filter</div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"{{commonService.btn_primary_sm}} w-auto text-center\"\n (click)=\"getNodeProperticeFilterOption()\">Add\n Filter</div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-row justify-end items-center h-16 m-2\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div *ngIf=\"islayoutCreate\"\n class=\"{{commonService.btn_success_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addLayoutTOview()\">Add View\n </div>\n <div *ngIf=\"!islayoutCreate && !isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addWidgetTOview()\">Add Layout\n </div>\n <div *ngIf=\"!islayoutCreate && isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateLayoutWidgetTOview()\">Update Layout\n </div>\n\n </ng-container>\n\n <div class=\"{{commonService.btn_warning_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateToView()\" *ngIf=\"isUpdateWidget\">Update View\n </div>\n\n </div>\n\n\n <!-- <pre><code>{{dashBoardWidgetConfig | json}}</code></pre> -->\n </ng-container>\n <ng-container *ngIf=\"isChartButtonClick\">\n <h6\n class=\"mb-2 font-bold text-md tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center\">\n <i class=\"fa fa-bar-chart-o mr-2\"></i> Select View\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursor-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n </h6>\n <div class=\" h-[80vh] overflow-x-auto\">\n <div class=\"relative my-2 \">\n <input type=\"text\" [(ngModel)]=\"viewToSearch\" (keyup)=\"filterViews()\" (keydown)=\"filterViews()\"\n class=\"bg-gray-800 border border-gray-700 text-gray-200 text-sm focus:ring-gray-400 focus:border-gray-500 block w-full p-4 h-8 rounded\"\n placeholder=\"Search View\" />\n <button type=\"button\" class=\"absolute inset-y-0 right-0 flex items-center pr-6\">\n <mat-icon class=\"rotate-90 cursor-pointer\" [svgIcon]=\"'heroicons_outline:search'\"></mat-icon>\n </button>\n </div>\n <ng-container *ngFor=\"let item of filteredComponentConfig\">\n <div class=\"relative group my-3 w-full\">\n <!-- Item View Name -->\n <div class=\"text-md font-bold border-b py-2 cursar-pointer\">\n {{item.viewName}}</div>\n\n <!-- Hover Buttons -->\n <div\n class=\"absolute top-0 right-0 flex space-x-2 opacity-0 group-hover:opacity-100 transition-opacity duration-300 pb-2\">\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700\">\n <i class=\"fa fa-pencil-square-o\" aria-hidden=\"true\"\n (click)=\"editComponentViews(item)\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-green-500 hover:bg-green-700\"\n (click)=\"getComponentConfig(item)\">\n <i class=\"fa fa-plus\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n\n </ng-container>\n <ng-container *ngIf=\"isDefaultView\">\n <ng-container *ngFor=\"let item of dashBoardWidgetConfig.widgets; let i = index\">\n <div class=\"group my-3 w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.widgetTitle}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== dashBoardWidgetConfig.widgets.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"getEditViewFromLayout(item,i)\">\n <i class=\"fa fa-pencil-square\" aria-hidden=\"true\"></i>\n\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromLayout(item,i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n\n </div>\n</div>\n<!-- </div> -->\n\n<dx-popup [(visible)]=\"isEditOptionClick\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"'auto'\" [showTitle]=\"true\" class=\"popup\" title=\"{{editViewdataSourceModal.viewName}}\">\n <div *dxTemplate=\"let data of 'content'\">\n\n <app-dash-chart [datasetmodal]=\"editViewdataSourceModal\" (getChartConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'chart'\"></app-dash-chart>\n <app-dash-table [datasetmodal]=\"editViewdataSourceModal\" (getTableConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'table'\"></app-dash-table>\n <!-- <app-dash-other [datasetmodal]=\"editViewdataSourceModal\" *ngIf=\"editViewdataSourceModal.viewType == 'others'\"\n (createOtherComponentView)=\"getEmitNewChartCongig($event)\"></app-dash-other> -->\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isCreateDataset\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateDatasetWithDatasetId\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\" (onHidden)=\"getDatasetPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [selectedDatasetId]=\"selectedDatasetId\" [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n<dx-popup [(visible)]=\"isCreateNewViewWithDefaultView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\"\n [width]=\"1200\" [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\"\n (onHidden)=\"getViewPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [selectedViewId]=\"selectedViewId\" [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateNewView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isWidgetFilters\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"800\" [height]=\"400\"\n [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"my-2\">\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'85%'\">\n <ng-container *ngFor=\"let item of nodeproperticeFilterDataSource; let i = index\">\n <div class=\"flex flex-row my-2\">\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.columnName\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <dx-select-box [items]=\"['get','let']\" [(ngModel)]=\"item.operator\"\n placeholder=\"Operator\"></dx-select-box>\n </div>\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.value\"></dx-text-box>\n </div>\n </div>\n </ng-container>\n\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"submitFilter()\">Submit</button>\n </div>\n\n </div>\n\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isAdvanceLayout\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"700\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"flex flex-row px-2 mb-3\">\n <div class=\"w-2/3 mb-2\">\n <div class=\"text-md mb-2\">Select Views</div>\n <dx-tag-box [dataSource]=\"componentConfigDataSource\" valueExpr=\"viewId\" displayExpr=\"viewName\"\n [multiline]=\"true\" [showSelectionControls]=\"true\" [(ngModel)]=\"selectedViewsIds\"\n [maxDisplayedTags]=\"3\" (onValueChanged)=\"getSelectedColumnSource($event)\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n <div class=\"w-1/3 px-2\">\n <button class=\"{{commonService.btn_primary_md}} mt-6\" (click)=\"getProcessForConfig()\">\n Add To View\n </button>\n <!-- <button class=\"{{commonService.btn_danger_md}} cursor-pointer mt-6\" (click)=\"cancelCdrConfig()\">Cancel\n </button> -->\n </div>\n </div>\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'80%'\">\n\n <div class=\"m-2 border-b\" *ngIf=\"isProceed\">\n <ng-container *ngFor=\"let item of advanceLayoutContainer; let i = index;\">\n <div class=\"flex flex-row m-2\">\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\">View Name</div>\n <dx-text-box [(ngModel)]=\"item.compConfig.viewConfig[0].viewName\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Title</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Width</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"widget_width\"\n [(ngModel)]=\"item.nodeProperties.width\"></dx-select-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Height</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.height\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Filter</div>\n <dx-select-box [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"item.filterId\"></dx-select-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mt-8\">\n <dx-check-box [(ngModel)]=\"item.nodeProperties.display\" text=\"Display\"></dx-check-box>\n </div>\n </div>\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteView(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 my-2 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\" (click)=\"submitAdvanceView()\">Add\n Layout</button>\n </div>\n </div>\n</dx-popup>", styles: ["::ng-deep #scrollview-demo{min-height:550px}::ng-deep #scrollview{height:auto;position:absolute;top:0;bottom:300px;padding:20px}::ng-deep #scrollview-content{white-space:pre-wrap}.scrollable-content{height:90vh;overflow-y:auto}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i8.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i9.DxPopupComponent, selector: "dx-popup", inputs: ["accessKey", "animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "dragAndResizeArea", "dragEnabled", "dragOutsideBoundary", "elementAttr", "focusStateEnabled", "fullScreen", "height", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "resizeEnabled", "restorePosition", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showTitle", "tabIndex", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onResize", "onResizeEnd", "onResizeStart", "onShowing", "onShown", "onTitleRendered", "accessKeyChange", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "dragAndResizeAreaChange", "dragEnabledChange", "dragOutsideBoundaryChange", "elementAttrChange", "focusStateEnabledChange", "fullScreenChange", "heightChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "resizeEnabledChange", "restorePositionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showTitleChange", "tabIndexChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { kind: "component", type: i10.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }, { kind: "component", type: i11.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i12.DxTagBoxComponent, selector: "dx-tag-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyValueMode", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hideSelectedItems", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxDisplayedTags", "maxFilterQueryLength", "maxLength", "minSearchLength", "multiline", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectAllMode", "selectAllText", "selectedItems", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showMultiTagOnly", "showSelectionControls", "stylingMode", "tabIndex", "tagTemplate", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCustomItemCreating", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onMultiTagPreparing", "onOpened", "onOptionChanged", "onSelectAllValueChanged", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyValueModeChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hideSelectedItemsChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxDisplayedTagsChange", "maxFilterQueryLengthChange", "maxLengthChange", "minSearchLengthChange", "multilineChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectAllModeChange", "selectAllTextChange", "selectedItemsChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showMultiTagOnlyChange", "showSelectionControlsChange", "stylingModeChange", "tabIndexChange", "tagTemplateChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i13.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i14.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: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i16.LoadingComponent, selector: "app-loading" }, { kind: "component", type: i17.CreateCompViewComponent, selector: "app-create-comp-view", inputs: ["kpiTreeData", "isHeader", "selectedViewId"] }, { kind: "component", type: i18.DashChartComponent, selector: "app-dash-chart", inputs: ["datasetmodal"], outputs: ["getChartConfigOutPut"] }, { kind: "component", type: i19.DashTableComponent, selector: "app-dash-table", inputs: ["datasetmodal"], outputs: ["getTableConfigOutPut"] }, { kind: "component", type: i20.CreateDatasetComponent, selector: "app-create-dataset", inputs: ["isHeader", "selectedDatasetId"] }, { kind: "component", type: i21.CommonHeaderComponent, selector: "lib-common-header", inputs: ["pageTitle"] }] });
|
|
1024
1024
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PageConfigComponent, decorators: [{
|
|
1025
1025
|
type: Component,
|
|
1026
|
-
args: [{ selector: 'app-dashbord-config', template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<div class=\"flex flex-row h-[90vh] w-full\">\n <div class=\"w-3/4 border-r h-full flex flex-col px-2\">\n <!-- Scrollable content -->\n <div class=\"flex-grow overflow-y-auto\">\n <div class=\"flex flex-wrap my-3\" #dynamicContainer></div>\n </div>\n\n <!-- Fixed bottom section -->\n <div class=\"flex flex-row justify-center items-center h-16 m-2 border shrink-0\">\n <lib-common-header [pageTitle]=\"''\"></lib-common-header>\n <div class=\"{{commonService.btn_primary_md}} m-2\" (click)=\"addWidget()\">Add Layout</div>\n <div class=\"{{commonService.btnOthersPurple}} m-2 cursor-pointer\" (click)=\"getViewPage()\">View Page</div>\n </div>\n </div>\n <div class=\"w-1/4 p-2 h-full\">\n <ng-container *ngIf=\"isDashBoardContent\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\" (click)=\"backToMainView()\">\n Back\n </div>\n <ng-container *ngFor=\"let item of page_config.api_config; let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b\">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.widGetConfig.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <!-- <button (click)=\"editSelectedWidget(item, i)\"\n class=\"w-8 h-8 bg-sky-600 hover:bg-blue-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-edit\"></i>\n </button> -->\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isWidgetCreationContent\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\">\n <span *ngIf=\"!islayoutCreate\">Widget Settings</span>\n <span *ngIf=\"islayoutCreate\">Layout Settings</span>\n </h6>\n <div class=\"flex flex-row my-4\">\n <dx-check-box class=\"ml-auto\" [(ngModel)]=\"addedwidGetConfig.display\" text=\"Display\"></dx-check-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Width</span>\n <dx-select-box class=\"w-1/2\" [items]=\"widget_width\"\n [(ngModel)]=\"addedwidGetConfig.width\"></dx-select-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Height</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.height\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <div class=\"text-md my-auto px-2\">Widget Title</div>\n <div><dx-text-box class=\"w-1/2\" [(ngModel)]=\"widgetTitle\"></dx-text-box></div>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <span class=\"text-md my-auto px-2\">Widget Name</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"widgetName\"></dx-text-box>\n </div>\n\n\n <div class=\"flex flex-row mb-5 justify-between\" *ngIf=\"islayoutCreate\">\n <span class=\"text-sm my-auto px-2\">Layout Title</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Filter</span>\n <dx-select-box class=\"w-1/2\" [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"selectedFilterId\"\n (onValueChanged)=\"getFilterValueById($event)\"></dx-select-box>\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div class=\"mt-6\" *ngIf=\"!islayoutCreate && isEditMainLayout\">\n <ng-container\n *ngFor=\"let item of dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode;let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b \">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.nodeProperties.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n *ngIf=\"i !== dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </div>\n </ng-container>\n\n\n\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Application Views\n </div>\n <div class=\"border-x border-b p-2\">\n <ng-container *ngFor=\"let item of allWidgetInnerContent; let i = index\">\n <div class=\"group w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.viewName}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== allWidgetInnerContent.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentViews(item)\">\n <i class=\"fa fa-eye\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentDatasets(item)\">\n <i class=\"fa fa-database\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromConfig(i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Add Filter For View\n\n </div>\n <div class=\"border-x border-b p-2\">\n <div class=\"flex flex-row py-3 border-b\">\n <dx-check-box [(ngModel)]=\"addedwidGetConfig.isWidgetFilter\"\n text=\"Popup Columns Filter Enable\"></dx-check-box>\n </div>\n <div class=\"flex flex-row my-2 border-b\">\n <ng-container *ngFor=\"let item of nodeProperticeFilters; let i = index\">\n <div class=\"flex flex-wrap border-b\">\n <div class=\"px-1 w-1/3\">\n <div class=\"text-md\">Input Type</div>\n <dx-select-box [items]=\"['text']\" [(ngModel)]=\"item.input_type\"\n value=\"text\"></dx-select-box>\n </div>\n <div class=\"px-1-1 w-2/3\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Server Column</div>\n <dx-text-box [(ngModel)]=\"item.server_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Local Column</div>\n <dx-text-box [(ngModel)]=\"item.local_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/3\" *ngIf=\"item.input_type == 'select'\">\n <div class=\"text-md\">Columns Name</div>\n <dx-text-box [(ngModel)]=\"item.select_box_option\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\">\n <div class=\"flex justify-end\">\n <div class=\"{{commonService.btn_danger_sm}} w-24 mt-6 text-center\"\n (click)=\"deleteNodeFilter(i)\">Delete Filter</div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"{{commonService.btn_primary_sm}} w-auto text-center\"\n (click)=\"getNodeProperticeFilterOption()\">Add\n Filter</div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-row justify-end items-center h-16 m-2\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div *ngIf=\"islayoutCreate\"\n class=\"{{commonService.btn_success_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addLayoutTOview()\">Add View\n </div>\n <div *ngIf=\"!islayoutCreate && !isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addWidgetTOview()\">Add Layout\n </div>\n <div *ngIf=\"!islayoutCreate && isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateLayoutWidgetTOview()\">Update Layout\n </div>\n\n </ng-container>\n\n <div class=\"{{commonService.btn_warning_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateToView()\" *ngIf=\"isUpdateWidget\">Update View\n </div>\n\n </div>\n\n\n <!-- <pre><code>{{dashBoardWidgetConfig | json}}</code></pre> -->\n </ng-container>\n <ng-container *ngIf=\"isChartButtonClick\">\n <h6\n class=\"mb-2 font-bold text-md tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center\">\n <i class=\"fa fa-bar-chart-o mr-2\"></i> Select View\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursor-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n </h6>\n <div class=\" h-[80vh] overflow-x-auto\">\n <div class=\"relative my-2 \">\n <input type=\"text\" [(ngModel)]=\"viewToSearch\" (keyup)=\"filterViews()\" (keydown)=\"filterViews()\"\n class=\"bg-gray-800 border border-gray-700 text-gray-200 text-sm focus:ring-gray-400 focus:border-gray-500 block w-full p-4 h-8 rounded\"\n placeholder=\"Search View\" />\n <button type=\"button\" class=\"absolute inset-y-0 right-0 flex items-center pr-6\">\n <mat-icon class=\"rotate-90 cursor-pointer\" [svgIcon]=\"'heroicons_outline:search'\"></mat-icon>\n </button>\n </div>\n <ng-container *ngFor=\"let item of filteredComponentConfig\">\n <div class=\"relative group my-3 w-full\">\n <!-- Item View Name -->\n <div class=\"text-md font-bold border-b py-2 cursar-pointer\">\n {{item.viewName}}</div>\n\n <!-- Hover Buttons -->\n <div\n class=\"absolute top-0 right-0 flex space-x-2 opacity-0 group-hover:opacity-100 transition-opacity duration-300 pb-2\">\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700\">\n <i class=\"fa fa-pencil-square-o\" aria-hidden=\"true\"\n (click)=\"editComponentViews(item)\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-green-500 hover:bg-green-700\"\n (click)=\"getComponentConfig(item)\">\n <i class=\"fa fa-plus\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n\n </ng-container>\n <ng-container *ngIf=\"isDefaultView\">\n <ng-container *ngFor=\"let item of dashBoardWidgetConfig.widgets; let i = index\">\n <div class=\"group my-3 w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.widgetTitle}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== dashBoardWidgetConfig.widgets.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"getEditViewFromLayout(item,i)\">\n <i class=\"fa fa-pencil-square\" aria-hidden=\"true\"></i>\n\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromLayout(item,i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n\n </div>\n</div>\n<!-- </div> -->\n\n<dx-popup [(visible)]=\"isEditOptionClick\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"'auto'\" [showTitle]=\"true\" class=\"popup\" title=\"{{editViewdataSourceModal.viewName}}\">\n <div *dxTemplate=\"let data of 'content'\">\n\n <app-dash-chart [datasetmodal]=\"editViewdataSourceModal\" (getChartConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'chart'\"></app-dash-chart>\n <app-dash-table [datasetmodal]=\"editViewdataSourceModal\" (getTableConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'table'\"></app-dash-table>\n <!-- <app-dash-other [datasetmodal]=\"editViewdataSourceModal\" *ngIf=\"editViewdataSourceModal.viewType == 'others'\"\n (createOtherComponentView)=\"getEmitNewChartCongig($event)\"></app-dash-other> -->\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isCreateDataset\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateDatasetWithDatasetId\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\" (onHidden)=\"getDatasetPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [selectedDatasetId]=\"selectedDatasetId\" [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n<dx-popup [(visible)]=\"isCreateNewViewWithDefaultView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\"\n [width]=\"1200\" [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\"\n (onHidden)=\"getViewPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [selectedViewId]=\"selectedViewId\" [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateNewView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isWidgetFilters\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"800\" [height]=\"400\"\n [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"my-2\">\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'85%'\">\n <ng-container *ngFor=\"let item of nodeproperticeFilterDataSource; let i = index\">\n <div class=\"flex flex-row my-2\">\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.columnName\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <dx-select-box [items]=\"['get','let']\" [(ngModel)]=\"item.operator\"\n placeholder=\"Operator\"></dx-select-box>\n </div>\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.value\"></dx-text-box>\n </div>\n </div>\n </ng-container>\n\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"submitFilter()\">Submit</button>\n </div>\n\n </div>\n\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isAdvanceLayout\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"700\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"flex flex-row px-2 mb-3\">\n <div class=\"w-2/3 mb-2\">\n <div class=\"text-md mb-2\">Select Views</div>\n <dx-tag-box [dataSource]=\"componentConfigDataSource\" valueExpr=\"viewId\" displayExpr=\"viewName\"\n [multiline]=\"true\" [showSelectionControls]=\"true\" [(ngModel)]=\"selectedViewsIds\"\n [maxDisplayedTags]=\"3\" (onValueChanged)=\"getSelectedColumnSource($event)\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n <div class=\"w-1/3 px-2\">\n <button class=\"{{commonService.btn_primary_md}} mt-6\" (click)=\"getProcessForConfig()\">\n Add To View\n </button>\n <!-- <button class=\"{{commonService.btn_danger_md}} cursor-pointer mt-6\" (click)=\"cancelCdrConfig()\">Cancel\n </button> -->\n </div>\n </div>\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'80%'\">\n\n <div class=\"m-2 border-b\" *ngIf=\"isProceed\">\n <ng-container *ngFor=\"let item of advanceLayoutContainer; let i = index;\">\n <div class=\"flex flex-row m-2\">\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\">View Name</div>\n <dx-text-box [(ngModel)]=\"item.compConfig.viewConfig[0].viewName\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Title</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Width</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"widget_width\"\n [(ngModel)]=\"item.nodeProperties.width\"></dx-select-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Height</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.height\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Filter</div>\n <dx-select-box [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"item.filterId\"></dx-select-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mt-8\">\n <dx-check-box [(ngModel)]=\"item.nodeProperties.display\" text=\"Display\"></dx-check-box>\n </div>\n </div>\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteView(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 my-2 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\" (click)=\"submitAdvanceView()\">Add\n Layout</button>\n </div>\n </div>\n</dx-popup>", styles: ["::ng-deep #scrollview-demo{min-height:550px}::ng-deep #scrollview{height:auto;position:absolute;top:0;bottom:300px;padding:20px}::ng-deep #scrollview-content{white-space:pre-wrap}.scrollable-content{height:90vh;overflow-y:auto}\n"] }]
|
|
1026
|
+
args: [{ selector: 'app-dashbord-config', template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<div class=\"flex flex-row h-[90vh] w-full\">\n <div class=\"w-3/4 border-r h-full flex flex-col px-2\">\n <!-- Scrollable content -->\n <div class=\"flex-grow overflow-y-auto\">\n <div class=\"flex flex-wrap my-3\" #dynamicContainer></div>\n </div>\n\n <!-- Fixed bottom section -->\n <div class=\"flex flex-row justify-center items-center h-16 m-2 border shrink-0\">\n <lib-common-header [pageTitle]=\"''\"></lib-common-header>\n <div class=\"{{commonService.btn_primary_md}} m-2\" (click)=\"addWidget()\">Add Layout</div>\n <div class=\"{{commonService.btnOthersPurple}} m-2 cursor-pointer\" (click)=\"getViewPage()\">View Page</div>\n </div>\n </div>\n <div class=\"w-1/4 p-2 h-full\">\n <ng-container *ngIf=\"isDashBoardContent\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\" (click)=\"backToMainView()\">\n Back\n </div>\n <ng-container *ngFor=\"let item of page_config.api_config; let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b\">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.widGetConfig.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <!-- <button (click)=\"editSelectedWidget(item, i)\"\n class=\"w-8 h-8 bg-sky-600 hover:bg-blue-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-edit\"></i>\n </button> -->\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isWidgetCreationContent\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\">\n <span *ngIf=\"!islayoutCreate\">Widget Settings</span>\n <span *ngIf=\"islayoutCreate\">Layout Settings</span>\n </h6>\n <div class=\"flex flex-row my-4\">\n <dx-check-box class=\"ml-auto\" [(ngModel)]=\"addedwidGetConfig.display\" text=\"Display\"></dx-check-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Width</span>\n <dx-select-box class=\"w-1/2\" [items]=\"widget_width\"\n [(ngModel)]=\"addedwidGetConfig.width\"></dx-select-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Height</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.height\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <div class=\"text-md my-auto px-2 inline\">Widget Title</div>\n <dx-text-box class=\"w-full\" [(ngModel)]=\"widgetTitle\"></dx-text-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <div class=\"text-md my-auto px-2\">Widget Name</div>\n <dx-text-box class=\"w-full\" [(ngModel)]=\"widgetName\"></dx-text-box>\n </div>\n\n\n <div class=\"flex flex-row mb-5 justify-between\" *ngIf=\"islayoutCreate\">\n <span class=\"text-sm my-auto px-2\">Layout Title</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Filter</span>\n <dx-select-box class=\"w-1/2\" [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"selectedFilterId\"\n (onValueChanged)=\"getFilterValueById($event)\"></dx-select-box>\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div class=\"mt-6\" *ngIf=\"!islayoutCreate && isEditMainLayout\">\n <ng-container\n *ngFor=\"let item of dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode;let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b \">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.nodeProperties.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n *ngIf=\"i !== dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </div>\n </ng-container>\n\n\n\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Application Views\n </div>\n <div class=\"border-x border-b p-2\">\n <ng-container *ngFor=\"let item of allWidgetInnerContent; let i = index\">\n <div class=\"group w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.viewName}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== allWidgetInnerContent.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentViews(item)\">\n <i class=\"fa fa-eye\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentDatasets(item)\">\n <i class=\"fa fa-database\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromConfig(i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Add Filter For View\n\n </div>\n <div class=\"border-x border-b p-2\">\n <div class=\"flex flex-row py-3 border-b\">\n <dx-check-box [(ngModel)]=\"addedwidGetConfig.isWidgetFilter\"\n text=\"Popup Columns Filter Enable\"></dx-check-box>\n </div>\n <div class=\"flex flex-row my-2 border-b\">\n <ng-container *ngFor=\"let item of nodeProperticeFilters; let i = index\">\n <div class=\"flex flex-wrap border-b\">\n <div class=\"px-1 w-1/3\">\n <div class=\"text-md\">Input Type</div>\n <dx-select-box [items]=\"['text']\" [(ngModel)]=\"item.input_type\"\n value=\"text\"></dx-select-box>\n </div>\n <div class=\"px-1-1 w-2/3\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Server Column</div>\n <dx-text-box [(ngModel)]=\"item.server_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Local Column</div>\n <dx-text-box [(ngModel)]=\"item.local_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/3\" *ngIf=\"item.input_type == 'select'\">\n <div class=\"text-md\">Columns Name</div>\n <dx-text-box [(ngModel)]=\"item.select_box_option\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\">\n <div class=\"flex justify-end\">\n <div class=\"{{commonService.btn_danger_sm}} w-24 mt-6 text-center\"\n (click)=\"deleteNodeFilter(i)\">Delete Filter</div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"{{commonService.btn_primary_sm}} w-auto text-center\"\n (click)=\"getNodeProperticeFilterOption()\">Add\n Filter</div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-row justify-end items-center h-16 m-2\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div *ngIf=\"islayoutCreate\"\n class=\"{{commonService.btn_success_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addLayoutTOview()\">Add View\n </div>\n <div *ngIf=\"!islayoutCreate && !isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addWidgetTOview()\">Add Layout\n </div>\n <div *ngIf=\"!islayoutCreate && isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateLayoutWidgetTOview()\">Update Layout\n </div>\n\n </ng-container>\n\n <div class=\"{{commonService.btn_warning_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateToView()\" *ngIf=\"isUpdateWidget\">Update View\n </div>\n\n </div>\n\n\n <!-- <pre><code>{{dashBoardWidgetConfig | json}}</code></pre> -->\n </ng-container>\n <ng-container *ngIf=\"isChartButtonClick\">\n <h6\n class=\"mb-2 font-bold text-md tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center\">\n <i class=\"fa fa-bar-chart-o mr-2\"></i> Select View\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursor-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n </h6>\n <div class=\" h-[80vh] overflow-x-auto\">\n <div class=\"relative my-2 \">\n <input type=\"text\" [(ngModel)]=\"viewToSearch\" (keyup)=\"filterViews()\" (keydown)=\"filterViews()\"\n class=\"bg-gray-800 border border-gray-700 text-gray-200 text-sm focus:ring-gray-400 focus:border-gray-500 block w-full p-4 h-8 rounded\"\n placeholder=\"Search View\" />\n <button type=\"button\" class=\"absolute inset-y-0 right-0 flex items-center pr-6\">\n <mat-icon class=\"rotate-90 cursor-pointer\" [svgIcon]=\"'heroicons_outline:search'\"></mat-icon>\n </button>\n </div>\n <ng-container *ngFor=\"let item of filteredComponentConfig\">\n <div class=\"relative group my-3 w-full\">\n <!-- Item View Name -->\n <div class=\"text-md font-bold border-b py-2 cursar-pointer\">\n {{item.viewName}}</div>\n\n <!-- Hover Buttons -->\n <div\n class=\"absolute top-0 right-0 flex space-x-2 opacity-0 group-hover:opacity-100 transition-opacity duration-300 pb-2\">\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700\">\n <i class=\"fa fa-pencil-square-o\" aria-hidden=\"true\"\n (click)=\"editComponentViews(item)\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-green-500 hover:bg-green-700\"\n (click)=\"getComponentConfig(item)\">\n <i class=\"fa fa-plus\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n\n </ng-container>\n <ng-container *ngIf=\"isDefaultView\">\n <ng-container *ngFor=\"let item of dashBoardWidgetConfig.widgets; let i = index\">\n <div class=\"group my-3 w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.widgetTitle}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== dashBoardWidgetConfig.widgets.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"getEditViewFromLayout(item,i)\">\n <i class=\"fa fa-pencil-square\" aria-hidden=\"true\"></i>\n\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromLayout(item,i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n\n </div>\n</div>\n<!-- </div> -->\n\n<dx-popup [(visible)]=\"isEditOptionClick\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"'auto'\" [showTitle]=\"true\" class=\"popup\" title=\"{{editViewdataSourceModal.viewName}}\">\n <div *dxTemplate=\"let data of 'content'\">\n\n <app-dash-chart [datasetmodal]=\"editViewdataSourceModal\" (getChartConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'chart'\"></app-dash-chart>\n <app-dash-table [datasetmodal]=\"editViewdataSourceModal\" (getTableConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'table'\"></app-dash-table>\n <!-- <app-dash-other [datasetmodal]=\"editViewdataSourceModal\" *ngIf=\"editViewdataSourceModal.viewType == 'others'\"\n (createOtherComponentView)=\"getEmitNewChartCongig($event)\"></app-dash-other> -->\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isCreateDataset\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateDatasetWithDatasetId\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\" (onHidden)=\"getDatasetPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [selectedDatasetId]=\"selectedDatasetId\" [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n<dx-popup [(visible)]=\"isCreateNewViewWithDefaultView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\"\n [width]=\"1200\" [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\"\n (onHidden)=\"getViewPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [selectedViewId]=\"selectedViewId\" [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateNewView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isWidgetFilters\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"800\" [height]=\"400\"\n [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"my-2\">\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'85%'\">\n <ng-container *ngFor=\"let item of nodeproperticeFilterDataSource; let i = index\">\n <div class=\"flex flex-row my-2\">\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.columnName\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <dx-select-box [items]=\"['get','let']\" [(ngModel)]=\"item.operator\"\n placeholder=\"Operator\"></dx-select-box>\n </div>\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.value\"></dx-text-box>\n </div>\n </div>\n </ng-container>\n\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"submitFilter()\">Submit</button>\n </div>\n\n </div>\n\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isAdvanceLayout\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"700\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"flex flex-row px-2 mb-3\">\n <div class=\"w-2/3 mb-2\">\n <div class=\"text-md mb-2\">Select Views</div>\n <dx-tag-box [dataSource]=\"componentConfigDataSource\" valueExpr=\"viewId\" displayExpr=\"viewName\"\n [multiline]=\"true\" [showSelectionControls]=\"true\" [(ngModel)]=\"selectedViewsIds\"\n [maxDisplayedTags]=\"3\" (onValueChanged)=\"getSelectedColumnSource($event)\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n <div class=\"w-1/3 px-2\">\n <button class=\"{{commonService.btn_primary_md}} mt-6\" (click)=\"getProcessForConfig()\">\n Add To View\n </button>\n <!-- <button class=\"{{commonService.btn_danger_md}} cursor-pointer mt-6\" (click)=\"cancelCdrConfig()\">Cancel\n </button> -->\n </div>\n </div>\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'80%'\">\n\n <div class=\"m-2 border-b\" *ngIf=\"isProceed\">\n <ng-container *ngFor=\"let item of advanceLayoutContainer; let i = index;\">\n <div class=\"flex flex-row m-2\">\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\">View Name</div>\n <dx-text-box [(ngModel)]=\"item.compConfig.viewConfig[0].viewName\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Title</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Width</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"widget_width\"\n [(ngModel)]=\"item.nodeProperties.width\"></dx-select-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Height</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.height\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Filter</div>\n <dx-select-box [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"item.filterId\"></dx-select-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mt-8\">\n <dx-check-box [(ngModel)]=\"item.nodeProperties.display\" text=\"Display\"></dx-check-box>\n </div>\n </div>\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteView(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 my-2 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\" (click)=\"submitAdvanceView()\">Add\n Layout</button>\n </div>\n </div>\n</dx-popup>", styles: ["::ng-deep #scrollview-demo{min-height:550px}::ng-deep #scrollview{height:auto;position:absolute;top:0;bottom:300px;padding:20px}::ng-deep #scrollview-content{white-space:pre-wrap}.scrollable-content{height:90vh;overflow-y:auto}\n"] }]
|
|
1027
1027
|
}], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ActivatedRoute }, { type: i0.ViewContainerRef }, { type: i0.ComponentFactoryResolver }, { type: i3.ApplicationContentService }, { type: i4.ToastrService }, { type: i2.Router }, { type: i5.ApplicationDatssetsCall }]; }, propDecorators: { dynamicComponentContainer: [{
|
|
1028
1028
|
type: ViewChild,
|
|
1029
1029
|
args: ['dynamicComponentContainer', { read: ViewContainerRef }]
|
|
@@ -1037,4 +1037,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
1037
1037
|
type: ViewChild,
|
|
1038
1038
|
args: [DxScrollViewComponent, { static: false }]
|
|
1039
1039
|
}] } });
|
|
1040
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL3BhZ2UtY29udHJvbGxlci9wYWdlLWNvbmZpZy9wYWdlLWNvbmZpZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvcGFnZS1jb250cm9sbGVyL3BhZ2UtY29uZmlnL3BhZ2UtY29uZmlnLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFrRyxTQUFTLEVBQWdCLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSXBNLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUzRCxPQUFPLE1BQU0sTUFBTSx1QkFBdUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx3RkFBd0YsQ0FBQztBQUNySSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0RUFBNEUsQ0FBQztBQUN2SCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxzR0FBc0csQ0FBQztBQUN6SixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw4RkFBOEYsQ0FBQztBQUM3SSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSx3R0FBd0csQ0FBQztBQUM1SixPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSx3R0FBd0csQ0FBQztBQUU1SixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzRkFBc0YsQ0FBQztBQUNsSSxPQUFPLEVBQUUsc0JBQXNCLEVB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QUMsc0JBQXNCLENBQUM7U0FDbEc7UUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBSUQsVUFBVSxDQUFDLENBQUM7SUFFWixDQUFDOztnSEF4d0NVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLDhLQWlDa0IsZ0JBQWdCLG9HQUVoQyxnQkFBZ0IsK0tBb0ZyQyxxQkFBcUIsZ0RDaEpsQywrL3lCQWljVzsyRkR4YUUsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLHFCQUFxQjtzVUFzQy9CLHlCQUF5QjtzQkFEeEIsU0FBUzt1QkFBQywyQkFBMkIsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFHbEUsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFFRCxnQkFBZ0I7c0JBQWhFLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQWtGTSxVQUFVO3NCQUE5RCxTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBDb21wb25lbnRSZWYsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgT25EZXN0cm95LCBPbkluaXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uRXh0cmFzLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNvbmZpcm0gfSBmcm9tICdkZXZleHRyZW1lL3VpL2RpYWxvZyc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXBwbGljYXRpb24tY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IER4U2Nyb2xsVmlld0NvbXBvbmVudCB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhcic7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkRhdHNzZXRzQ2FsbCB9IGZyb20gJy4uLy4uL2FwcGxpY2F0aW9uLWRhdGFzZXQtY2FsbC5zZXJ2aWNlJztcbmltcG9ydCBtb21lbnQgZnJvbSAnLi8uLi8uLi9tb21lbnQtaGVscGVyJztcbmltcG9ydCB7IEdhbW1hVG9kYXlQcmV2aW91c0NvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtdG9kYXktcHJldmlvdXMvZ2FtbWEtdG9kYXktcHJldmlvdXMuY29tcG9uZW50JztcbmltcG9ydCB7IEFwcEFkdmFuY2VIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2FwcC1hZHZhbmNlLWhlYWRlci9hcHAtaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYW1tYVRhYmxlV2l0aFBlcmNlbnRhZ2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLXRhYmxlLXdpdGgtcGVyY2VudGFnZS9nYW1tYS10YWJsZS13aXRoLXBlcmNlbnRhZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IEdhbW1TaW5nbGVOdW1iZXJDYXJkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9nYW1tLXNpbmdsZS1udW1iZXItY2FyZC9nYW1tLXNpbmdsZS1udW1iZXItY2FyZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbWFBZHZhbmNlT3BlcmF0b3JUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtYWR2YW5jZS1vcGVyYXRvci10YWJsZS9nYW1tYS1hZHZhbmNlLW9wZXJhdG9yLXRhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBZHZhbmNlV2lkZ2V0SGVhZGVyRmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9hZHZhbmNlLXdpZGdldC1oZWFkZXItZmlsdGVyL2FkdmFuY2Utd2lkZ2V0LWhlYWRlci1maWx0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHsgR2FtbWFBZHZhbmNlQ2hhcnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLWFkdmFuY2UtY2hhcnQvZ2FtbWEtYWR2YW5jZS1jaGFydC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbWFHZW9DaGFydENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtZ2VvLWNoYXJ0L2dhbW1hLWdlby1jaGFydC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbWFIZWF0Q2hhcnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLWhlYXRtYXAvZ2FtbWEtaGVhdG1hcC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZGFzaGJvcmQtY29uZmlnJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BhZ2UtY29uZmlnLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGFnZS1jb25maWcuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBQYWdlQ29uZmlnQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBkYXNoYm9yZF9jb250YWluZXI6IGFueSA9IFtdO1xuICBzZWxlY3RlZF93aWR0aDogYW55O1xuICB3aWRnZXRfd2lkdGggPSBbJ3ctZnVsbCcsICd3LTEvMicsICd3LTEvMycsICd3LTIvMycsICd3LTEvNCcsICd3LTMvNCcsICd3LTEvNScsICd3LTQvNScsICd3LTEvNicsICd3LTUvNiddXG4gIGxvYWRpbmdNb2RhbDogYm9vbGVhbiA9IHRydWU7XG4gIGN1c3RvbWVyczogYW55O1xuICBwYWdlSGVhZGVyc0RhdGE6IGFueTtcbiAgcGFnZV90aXRsZSA9ICdEYXNoYm9hcmQnO1xuICBpc1NydlR5cGVPcGVyYXRvcjogYm9vbGVhbjtcbiAgZGVmYXVsdFN0YXJ0RGF0ZTtcbiAgZGVmYXVsdEVuZERhdGU7XG4gIHBhZ2VfY29uZmlnO1xuICBvcGVyYXRpb25MZXZlbHM6IGFueTtcbiAgZmlsdGVyX3ZhbHVlO1xuICBpc1RvZ2dsZVN3aWNoOiBib29sZWFuID0gdHJ1ZTtcbiAgaXNEYXRlUGlja2VyOiBib29sZWFuID0gZmFsc2U7XG4gIGlzVG9nZ2xlRXZlbnRTdGF0dXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNFZGl0Q2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNDb25maWdWaWV3OiBib29sZWFuO1xuICBpc0xvYWRlcjogYm9vbGVhbjtcbiAgY29tcG9uZW50TmFtZTogYW55O1xuICBpc1VwZGF0ZVdpZGdldDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGlzQ2hhcnRCdXR0b25DbGljazogYm9vbGVhbjtcbiAgY2hhcnRBY2Nlc3M6IGFueTtcbiAgY2hhcnRUeXBlOiBhbnk7XG4gIGRhc2hDaGFydENvbVNvdXJjZTogYW55O1xuICBpc0dlbmVyYXRlOiBib29sZWFuXG4gIGlzRmlsdGVySW5wdXRzOiBib29sZWFuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKi9cblxuICBAVmlld0NoaWxkKCdkeW5hbWljQ29tcG9uZW50Q29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIGR5bmFtaWNDb21wb25lbnRDb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBjb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoJ2R5bmFtaWNDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBkeW5hbWljQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIGR5bmFtaWNDb21wb25lbnRSZWZzOiBDb21wb25lbnRSZWY8YW55PltdID0gW107XG4gIC8vIGR5bmFtaWNDb21wb25lbnRSZWZzOiBDb21wb25lbnRSZWY8YW55PltdID0gW107XG5cbiAgQ29tcFJlZnM6IENvbXBvbmVudFJlZjxhbnk+O1xuXG4gIGNvbXBvbmVudENsYXNzTWFwID0ge1xuICAgIEdhbW1hQWR2YW5jZUNoYXJ0Q29tcG9uZW50LFxuICAgIEdhbW1hVG9kYXlQcmV2aW91c0NvbXBvbmVudCxcbiAgICBBcHBBZHZhbmNlSGVhZGVyQ29tcG9uZW50LFxuICAgIEdhbW1hVGFibGVXaXRoUGVyY2VudGFnZUNvbXBvbmVudCxcbiAgICBHYW1tU2luZ2xlTnVtYmVyQ2FyZENvbXBvbmVudCxcbiAgICBHYW1tYUFkdmFuY2VPcGVyYXRvclRhYmxlQ29tcG9uZW50LFxuICAgIEFkdmFuY2VXaWRnZXRIZWFkZXJGaWx0ZXJDb21wb25lbnQsXG4gICAgR2FtbWFIZWF0Q2hhcnRDb21wb25lbnQsXG4gICAgR2FtbWFHZW9DaGFydENvbXBvbmVudFxuICB9O1xuICBkYXRhU291cmNlTWF0YURhdGE6IGFueSA9IFtdO1xuICBxdWVyeVR5cGUgPSBcIm1vbmdvXCI7XG4gIGRhdGFTZXRNb2RhbDogYW55ID0gW107XG4gIGNvbXBvbmVudENvbmZpZ0RhdGFTb3VyY2U6IGFueSA9IFtdO1xuICBzZWxlc2NlZERhdGFTb3VyY2U6IGFueTtcbiAgZGF0YVNvdXJjZU1vZGFsOiBhbnkgPSB7fTtcbiAgaXNEYXNoQm9hcmRDb250ZW50OiBib29sZWFuID0gZmFsc2U7XG5cbiAgc2VsZWN0ZWRWaWV3Rm9ybUNvbXBvbmVudDogYW55ID0ge307XG4gIGFkZGVkd2lkR2V0Q29uZmlnID0ge1xuICAgIFwiZGlzcGxheVwiOiB0cnVlLFxuICAgIFwid2lkZ2V0VGl0bGVcIjogXCJcIixcbiAgICBcIndpZHRoXCI6IFwiXCIsXG4gICAgXCJoZWlnaHRcIjogXCJcIixcbiAgICBcImlzV2lkZ2V0RmlsdGVyXCI6IGZhbHNlXG4gIH1cblxuICBkYXNoQm9hcmRXaWRnZXRDb25maWc6IGFueSA9IFtcbiAgXTtcbiAgaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQ6IGJvb2xlYW47XG4gIHNlbGVjdGVkV2lkdGg6IGFueTtcbiAgc2VsZWN0ZWRIZWlnaHQ6IGFueTtcbiAgbmV3V2lkZ2V0SW5kZXg6IGFueTtcbiAgc2VsZWN0ZWRJbmRleE9iakZvckNoYXJ0OiBhbnkgPSB7fTtcbiAgc2VsZWN0ZWRDb250YWluZXJPYmplY3RGb3JDaGFydDogYW55ID0ge307XG4gIGRhdGFTZXR0YWJsZURhdGFTb3VyY2U6IGFueTtcbiAgdW5pcXVlRGF0YVNldE9iamVjdCA9IHt9O1xuXG4gIGlzRGFzaEJvYXJkQ29udGVudFR5cGVWaWV3OiBib29sZWFuO1xuICBwYWdlSWQ6IGFueTtcbiAgaXNsYXlvdXRDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgd2lkZ2V0TmFtZTogYW55O1xuICB3aWRnZXRUaXRsZTogYW55O1xuICBhbGxXaWRnZXRJbm5lckNvbnRlbnQ6IGFueTtcbiAgaXNEZWZhdWx0VmlldzogQm9vbGVhbiA9IHRydWU7XG4gIGlzRWRpdE1haW5MYXlvdXQ6IEJvb2xlYW47XG4gIGZpbHRlckRhdGFTb3VyY2U6IGFueTtcbiAgc2VsZWN0ZWRGaWx0ZXJJZDogYW55O1xuXG4gIHZpZXdUb1NlYXJjaDogc3RyaW5nID0gJyc7XG4gIGZpbHRlcmVkQ29tcG9uZW50Q29uZmlnOiBhbnlbXSA9IFtdO1xuICBpc0VkaXRPcHRpb25DbGljazogYm9vbGVhbjtcbiAgZWRpdFZpZXdkYXRhU291cmNlTW9kYWw6IGFueSA9IHt9O1xuXG4gIGVkaXRJdGVtRm9yVXBkYXRlOiBhbnkgPSB7fTtcbiAgcGFnZVRpdGxlOiBhbnk7XG4gIHBhZ2VVcmw6IGFueTtcbiAgYWxsV2lkZ2V0QnlEYXRhc2V0OiBhbnkgPSBbXTtcblxuICBzZWxlY3RlZEZpbHRlcnNEZWZhdWx0OiBhbnk7XG5cbiAgbm9kZVByb3BlcnRpY2VGaWx0ZXJzOiBhbnkgPSBbXTtcblxuICBpc0NyZWF0ZURhdGFzZXQ6IGJvb2xlYW47XG4gIHNlbGVjdGVkRGF0YXNldElkOiBhbnk7XG4gIGlzQ3JlYXRlRGF0YXNldFdpdGhEYXRhc2V0SWQ6IGJvb2xlYW47XG5cbiAgaXNDcmVhdGVOZXdWaWV3OiBib29sZWFuO1xuICBpc0NyZWF0ZU5ld1ZpZXdXaXRoRGVmYXVsdFZpZXc6IGJvb2xlYW47XG5cbiAgZGVmYXVsdEFwcGx5ZWRGaWx0ZXI6IGFueTtcbiAgaXNXaWRnZXRGaWx0ZXJzOiBib29sZWFuO1xuICBub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2U6IGFueTtcbiAgc2VsZWN0ZWRGaWx0ZXJEYXRhc291cmNlOiBhbnkgPSB7fTtcbiAgQFZpZXdDaGlsZChEeFNjcm9sbFZpZXdDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KSBzY3JvbGxWaWV3OiBEeFNjcm9sbFZpZXdDb21wb25lbnQ7XG5cbiAgc2VsZWN0ZWRWaWV3SWQ6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIHNlcnZpY2U6IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdHI6IFRvYXN0clNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGRhdGFzZXRTZXJ2aWNlOiBBcHBsaWNhdGlvbkRhdHNzZXRzQ2FsbCxcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRGFzaEJvYXJkQ29udGVudFR5cGVWaWV3ID0gKHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbJ2NvbnRlbnRUeXBlJ10gPT0gJ3ZpZXcnKSA/IHRydWUgOiBmYWxzZTtcbiAgICB0aGlzLnBhZ2VJZCA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbJ3BhZ2VJZCddO1xuXG4gICAgdGhpcy5nZXREYXRhU2V0KCk7XG4gICAgdGhpcy5kZWZhdWx0U3RhcnREYXRlID0gbW9tZW50KCkuc3VidHJhY3QoJzEwJywgJ2RheXMnKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICB0aGlzLmRlZmF1bHRFbmREYXRlID0gbW9tZW50KCkuc3VidHJhY3QoJzEnLCAnZGF5cycpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgIHRoaXMuZ2V0RmlsdGVySXRlbXMoKVxuICAgIHRoaXMuZ2V0QWxsVmlld3NJdGVtcygpXG5cbiAgICB0aGlzLmdldEFwcFBhZ2VEZXRhaWxDb25maWdCeVBhZ2VJZCgpXG4gIH1cblxuICBnZXRBbGxWaWV3c0l0ZW1zKCkge1xuICAgIHRoaXMuc2VydmljZS5nZXRBcHBWaWV3Q29uZmlncygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZSA9IGRhdGE7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRDb21wb25lbnRDb25maWcgPSB0aGlzLmNvbXBvbmVudENvbmZpZ0RhdGFTb3VyY2U7XG4gICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnVmlldyBDb25maWcnKTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZ2V0RmlsdGVySXRlbXMoKSB7XG4gICAgdGhpcy5zZXJ2aWNlLmdldEFwcEZpbHRlckNvbmZpZ3MoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmZpbHRlckRhdGFTb3VyY2UgPSBkYXRhO1xuICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0Vycm9yJyk7XG5cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBnZXRBcHBQYWdlRGV0YWlsQ29uZmlnQnlQYWdlSWQoKSB7XG4gICAgdGhpcy5zZXJ2aWNlLmdldEFwcFBhZ2VEZXRhaWxDb25maWcodGhpcy5wYWdlSWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnID0gZGF0YTtcbiAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBkYXRhLnBhZ2VOYW1lO1xuICAgICAgICB0aGlzLnBhZ2VVcmwgPSBkYXRhLnBhZ2VVcmw7XG4gICAgICAgIGlmIChkYXRhLndpZGdldHMgJiYgZGF0YS53aWRnZXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIHRoaXMuZ2V0Q29tcG9uZW50Q29uZmlnU2V0KClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0Vycm9yJyk7XG5cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cblxuICBnZXRDb21wb25lbnRDb25maWdTZXQoKSB7XG4gICAgbGV0IGRlZmF1bHRGaWx0ZXJzID0geyBvcGVyYXRpb25GaWx0ZXI6IHsgc3RhcnREYXRlOiBcIlwiLCBlbmREYXRlOiBcIlwiIH0gfTtcbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmZvckVhY2god2lkZ2V0ID0+IHtcbiAgICAgIGlmICh3aWRnZXQuZmlsdGVycykge1xuICAgICAgICB3aWRnZXQuZmlsdGVycy5maWx0ZXJJdGVtcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGlmIChlbGVtZW50LmZpbHRlclR5cGUgPT09ICdkYXRlJyB8fCBlbGVtZW50LmZpbHRlclR5cGUgPT09ICdkYXRldGltZScpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmRlZmF1bHRGaWx0ZXJUeXBlID09PSBcImR5bmFtaWNcIiAmJiBlbGVtZW50Lm1vbWVudEZ1bmN0aW9uICE9PSBcIlwiICYmIGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlICE9PSBcIlwiICYmIGVsZW1lbnQubW9tZW50Rm9ybWF0ICE9PSBcIlwiKSB7XG5cbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubW9tZW50RnVuY3Rpb24gPT0gXCJtb250aFBpY2tlclwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtjb3VudCwgdW5pdF0gPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZS5zcGxpdCgnLCcpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYXBpTmFtZSA9PT0gXCJlbmREYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRpc3BsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLmVuZERhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdChwYXJzZUludChjb3VudCksIHVuaXQpLmVuZE9mKHVuaXQpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEVuZERhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdChwYXJzZUludChjb3VudCksIHVuaXQpLmVuZE9mKHVuaXQpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwic3RhcnREYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlci5zdGFydERhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdChwYXJzZUludChjb3VudCksIHVuaXQpLnN0YXJ0T2YodW5pdCkuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQubW9tZW50RnVuY3Rpb24gPT0gXCJ3ZWVrUGlja2VyXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcGlOYW1lID09PSBcImVuZERhdGVcIikge1xuICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGlzcGxheSkge1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVycy5vcGVyYXRpb25GaWx0ZXIuZW5kRGF0ZSA9IG1vbWVudCgpLmVuZE9mKCd3ZWVrJykuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0RW5kRGF0ZSA9IG1vbWVudCgpLmVuZE9mKCd3ZWVrJykuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYXBpTmFtZSA9PT0gXCJzdGFydERhdGVcIikge1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLnN0YXJ0RGF0ZSA9IG1vbWVudCgpLnN0YXJ0T2YoJ3dlZWsnKS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgW2NvdW50LCB1bml0XSA9IGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYXBpTmFtZSA9PT0gXCJlbmREYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRpc3BsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLmVuZERhdGUgPSBtb21lbnQoKVtlbGVtZW50Lm1vbWVudEZ1bmN0aW9uXShwYXJzZUludChjb3VudCksIHVuaXQpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEVuZERhdGUgPSBtb21lbnQoKVtlbGVtZW50Lm1vbWVudEZ1bmN0aW9uXShwYXJzZUludChjb3VudCksIHVuaXQpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwic3RhcnREYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlci5zdGFydERhdGUgPSBtb21lbnQoKVtlbGVtZW50Lm1vbWVudEZ1bmN0aW9uXShwYXJzZUludChjb3VudCksIHVuaXQpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmRlZmF1bHRGaWx0ZXJUeXBlID09PSBcInN0YXRpY1wiICYmIGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwiZW5kRGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGlzcGxheSkge1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLmVuZERhdGUgPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEVuZERhdGUgPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYXBpTmFtZSA9PT0gXCJzdGFydERhdGVcIikge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlci5zdGFydERhdGUgPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTdGFydERhdGUgPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICh0eXBlb2YgZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUgIT09IFwiXCIpIHx8XG4gICAgICAgICAgICAgIChBcnJheS5pc0FycmF5KGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlKSAmJiBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50Lm9wZXJhdG9yTmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlcltlbGVtZW50Lm9wZXJhdG9yTmFtZV0gPSBBcnJheS5pc0FycmF5KGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlKVxuICAgICAgICAgICAgICAgICAgPyBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZVxuICAgICAgICAgICAgICAgICAgOiBbZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWVdO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlcltlbGVtZW50LmFwaU5hbWVdID0gZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUuam9pbihcIixcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcbiAgICB0aGlzLmRlZmF1bHRBcHBseWVkRmlsdGVyID0gZGVmYXVsdEZpbHRlcnM7XG5cbiAgICBQcm9taXNlLmFsbChhcGlDYWxscykudGhlbigoKSA9PiB7XG4gICAgICAvLyB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldFVuaXF1ZURhdGFTZXRPYmplY3QoKTtcbiAgICAgIHRoaXMuY3JlYXRlRGl2RWxlbWVudHModGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0KTtcbiAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuXG4gIH1cblxuICBnZXREYXRhU2V0KCkge1xuICAgIHRoaXMuaXNMb2FkZXIgPSB0cnVlO1xuICAgIHRoaXMuc2VydmljZS5nZXRBcHBEYXRhc2V0Q29uZmlncygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YVNldHRhYmxlRGF0YVNvdXJjZSA9IGRhdGE7XG4gICAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdEYXRhc2V0IENyZWF0aW9uJylcblxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG5cblxuICBnZXRDb21wb25lbnRDb25maWcoZXZlbnQpIHtcbiAgICBjb25zdCBmb3VuZE9iamVjdCA9IHRoaXMuY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZS5maW5kKHZpZXcgPT4gdmlldy52aWV3SWQgPT09IGV2ZW50LnZpZXdJZCk7XG4gICAgdGhpcy5nZXRFbWl0TmV3Q2hhcnRDb25maWcoZm91bmRPYmplY3QpO1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgfVxuXG4gIGFkZE5ld2NoYXJ0KCkge1xuICAgIHRoaXMuaXNHZW5lcmF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrID0gdHJ1ZTtcbiAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gZmFsc2U7XG4gICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gZmFsc2U7XG4gIH1cblxuXG4gIGFkZFdpZGdldCgpIHtcbiAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQgPSB0cnVlO1xuICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IGZhbHNlO1xuICAgIHRoaXMuaXNFZGl0TWFpbkxheW91dCA9IGZhbHNlO1xuICAgIHRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy5pc1VwZGF0ZVdpZGdldCA9IGZhbHNlO1xuICAgIHRoaXMud2lkZ2V0TmFtZSA9ICcnO1xuICAgIHRoaXMud2lkZ2V0VGl0bGUgPSAnJztcbiAgICB0aGlzLmFkZGVkd2lkR2V0Q29uZmlnID0ge1xuICAgICAgXCJkaXNwbGF5XCI6IHRydWUsXG4gICAgICBcIndpZGdldFRpdGxlXCI6IFwiXCIsXG4gICAgICBcIndpZHRoXCI6IFwiXCIsXG4gICAgICBcImhlaWdodFwiOiBcIlwiLFxuICAgICAgXCJpc1dpZGdldEZpbHRlclwiOiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGdldFdpdGgoZSkge1xuICAgIHRoaXMuc2VsZWN0ZWRXaWR0aCA9IGUudmFsdWU7XG4gIH1cblxuICBnZXRIZWlnaHQoZSkge1xuICAgIHRoaXMuc2VsZWN0ZWRIZWlnaHQgPSBlLnZhbHVlO1xuICB9XG5cbiAgYWRkTGF5b3V0VE92aWV3KCkge1xuICAgIGxldCBpbm5lcl9ub2RlID0ge1xuICAgICAgaWQ6IHRoaXMuY29tbW9uU2VydmljZS5wcmltZXJ5UmVuZG9tZUlkKDUpLFxuICAgICAgbm9kZVRpdGxlOiBcIlwiLFxuICAgICAgZmlsdGVySWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJJZCxcbiAgICAgIG5vZGVQcm9wZXJ0aWVzOiB0aGlzLmFkZGVkd2lkR2V0Q29uZmlnLFxuICAgICAgY29tcENvbmZpZzoge1xuICAgICAgICBkeW5hbWljQ29tcG9uZW50UmVmczogW10sXG4gICAgICAgIHZpZXdDb25maWc6IFtdXG4gICAgICB9LFxuICAgIH1cbiAgICBpZiAodGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlKSB7XG4gICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUucHVzaChpbm5lcl9ub2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlID0gW107XG4gICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUucHVzaChpbm5lcl9ub2RlKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy51cGRhdGVXaWRnZXQoKTtcbiAgfVxuXG5cblxuICByZWZvcm1hdFdpZGdldENvbmZpZyhkYXNoQm9hcmRXaWRnZXRDb25maWcsIGluZGV4ID0gbnVsbCkge1xuICAgIGNvbnN0IHByb2Nlc3NXaWRnZXQgPSAod2lkZ2V0KSA9PiB7XG4gICAgICB3aWRnZXQuY29tcENvbmZpZy52aWV3Q29uZmlnID0gd2lkZ2V0LmNvbXBDb25maWcudmlld0NvbmZpZy5tYXAoY29uZmlnID0+IGNvbmZpZy52aWV3SWQpO1xuICAgICAgd2lkZ2V0LmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMgPSBbXTtcblxuICAgICAgaWYgKHdpZGdldC53aWRnZXROb2RlICYmIHdpZGdldC53aWRnZXROb2RlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgd2lkZ2V0LndpZGdldE5vZGUuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZyA9IG5vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnLm1hcChjb25maWcgPT4gY29uZmlnLnZpZXdJZCk7XG4gICAgICAgICAgbm9kZS5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzID0gW107XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoaW5kZXggIT09IG51bGwgJiYgaW5kZXggPj0gMCAmJiBpbmRleCA8IGRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmxlbmd0aCkge1xuICAgICAgcHJvY2Vzc1dpZGdldChkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1tpbmRleF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKHdpZGdldCA9PiBwcm9jZXNzV2lkZ2V0KHdpZGdldCkpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1tpbmRleF07XG4gIH1cblxuICB1cGRhdGVXaWRnZXQoKSB7XG4gICAgbGV0IG1vZGlmaWVkQ29uZmlnID0gdGhpcy5yZWZvcm1hdFdpZGdldENvbmZpZyh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZywgdGhpcy5uZXdXaWRnZXRJbmRleCk7XG4gICAgbW9kaWZpZWRDb25maWdbJ2ZpbHRlcklkJ10gPSAobW9kaWZpZWRDb25maWcuZmlsdGVycyAmJiBtb2RpZmllZENvbmZpZy5maWx0ZXJzLmZpbHRlcklkKSA/IG1vZGlmaWVkQ29uZmlnLmZpbHRlcnMuZmlsdGVySWQgOiBudWxsO1xuICAgIGRlbGV0ZSBtb2RpZmllZENvbmZpZ1snZmlsdGVycyddO1xuICAgIHRoaXMuc2VydmljZS5lZGl0QXBwV2lkZ2V0Q29uZmlnKG1vZGlmaWVkQ29uZmlnKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmdldEFwcFBhZ2VEZXRhaWxDb25maWdCeVBhZ2VJZCgpXG4gICAgICAgIHRoaXMuYmFja1RvTWFpblZpZXcoKTtcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdXaWRnZXQgQ3JlYXRpb24nKVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5uZXdXaWRnZXRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gZmFsc2U7XG4gICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gdHJ1ZTtcbiAgfVxuXG4gIHVwZGF0ZUxheW91dFdpZGdldFRPdmlldygpIHtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy51cGRhdGVXaWRnZXQoKTtcbiAgfVxuXG4gIGFkZFdpZGdldFRPdmlldygpIHtcbiAgICBsZXQgb2JqID0ge1xuICAgICAgd2lkZ2V0SWQ6IHRoaXMuY29tbW9uU2VydmljZS5wcmltZXJ5UmVuZG9tZUlkKDUpLFxuICAgICAgd2lkZ2V0TmFtZTogdGhpcy53aWRnZXROYW1lLFxuICAgICAgd2lkZ2V0VGl0bGU6IHRoaXMud2lkZ2V0VGl0bGUsXG4gICAgICB3aWRnZXRQcm9wZXJ0aWVzOiB0aGlzLmFkZGVkd2lkR2V0Q29uZmlnLFxuICAgICAgcGFnZUlkOiB0aGlzLnBhZ2VJZCxcbiAgICAgIGZpbHRlcklkOiB0aGlzLnNlbGVjdGVkRmlsdGVySWQsXG4gICAgICB3aWRnZXROb2RlOiBbXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICBpZDogdGhpcy5jb21tb25TZXJ2aWNlLnByaW1lcnlSZW5kb21lSWQoNSksXG4gICAgICAgIC8vICAgbm9kZVRpdGxlOiBcIlwiLFxuICAgICAgICAvLyAgIGZpbHRlcklkOiBcIlwiLFxuICAgICAgICAvLyAgIG5vZGVQcm9wZXJ0aWVzOiB7XG4gICAgICAgIC8vICAgICBcImRpc3BsYXlcIjogdHJ1ZSxcbiAgICAgICAgLy8gICAgIFwid2lkZ2V0VGl0bGVcIjogXCJcIixcbiAgICAgICAgLy8gICAgIFwid2lkdGhcIjogXCJ3LTEvMlwiLFxuICAgICAgICAvLyAgICAgXCJoZWlnaHRcIjogXCJcIixcbiAgICAgICAgLy8gICB9LFxuICAgICAgICAvLyAgIGNvbXBDb25maWc6IHtcbiAgICAgICAgLy8gICAgIGR5bmFtaWNDb21wb25lbnRSZWZzOiBbXSxcbiAgICAgICAgLy8gICAgIHZpZXdDb25maWc6IFtdXG4gICAgICAgIC8vICAgfVxuICAgICAgICAvLyB9XG4gICAgICBdLFxuICAgICAgY29tcENvbmZpZzoge1xuICAgICAgICBkeW5hbWljQ29tcG9uZW50UmVmczogW10sXG4gICAgICAgIHZpZXdDb25maWc6IFtdXG4gICAgICB9LFxuICAgIH1cbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5zZXJ2aWNlLmNyZWF0ZUFwcFdpZGdldENvbmZpZyhvYmopLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgIC8vIHRoaXMuY3JlYXRlRGl2RWxlbWVudHModGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0KVxuICAgICAgICB0aGlzLmdldEFwcFBhZ2VEZXRhaWxDb25maWdCeVBhZ2VJZCgpXG5cbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ1dpZGdldCBDcmVhdGlvbicpXG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLnB1c2gob2JqKVxuICAgIC8vIHRoaXMuaW5zZXJ0RHluYW1pY0NvbXBvbmVudHMoKTtcblxuXG4gICAgdGhpcy5keW5hbWljQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gJyc7XG5cbiAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gZmFsc2U7XG4gICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gdHJ1ZTtcbiAgfVxuXG4gIGluc2VydE5ld1dpZ2V0KGluZGV4KSB7XG4gICAgdGhpcy5hZGRlZHdpZEdldENvbmZpZyA9IHtcbiAgICAgIFwiZGlzcGxheVwiOiB0cnVlLFxuICAgICAgXCJ3aWRnZXRUaXRsZVwiOiBcIlwiLFxuICAgICAgXCJ3aWR0aFwiOiBcIlwiLFxuICAgICAgXCJoZWlnaHRcIjogXCJcIixcbiAgICAgIFwiaXNXaWRnZXRGaWx0ZXJcIjogZmFsc2VcbiAgICB9XG4gICAgdGhpcy5pc1VwZGF0ZVdpZGdldCA9IGZhbHNlO1xuICAgIHRoaXMuaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQgPSB0cnVlO1xuICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IGZhbHNlO1xuICAgIHRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy5pc2xheW91dENyZWF0ZSA9IHRydWU7XG4gICAgdGhpcy5uZXdXaWRnZXRJbmRleCA9IGluZGV4O1xuICB9XG4gIGluc2VydENoYXJ0V2lnZXQoaW5kZXhPYmosIGNvbnRhaW5lckVsZW1lbnQpIHtcblxuICAgIHRoaXMuaXNHZW5lcmF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrID0gdHJ1ZTtcbiAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gZmFsc2U7XG4gICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3RlZENvbnRhaW5lck9iamVjdEZvckNoYXJ0ID0gY29udGFpbmVyRWxlbWVudDtcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXhPYmpGb3JDaGFydCA9IGluZGV4T2JqO1xuICAgIHRoaXMuc2VsZWN0ZWRWaWV3Rm9ybUNvbXBvbmVudCA9IHt9O1xuICB9XG5cbiAgYXN5bmMgZ2V0RW1pdE5ld0NoYXJ0Q29uZmlnKGRhdGEpIHtcbiAgICAvLyBsZXQgZGF0YXNldF9jb25maWcgPSB0aGlzLmRhdGFTZXRNb2RhbC5maW5kKGRhdGFzZXQgPT4gZGF0YXNldC5kYXRhc2V0SWQgPT0gZGF0YS5kYXRhc2V0SWQpO1xuICAgIC8vIGF3YWl0IHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YUZyb21EYXRhU2V0KGRhdGFzZXRfY29uZmlnLCBkYXRhc2V0X2NvbmZpZy5kYXRhc2V0SWQsIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzRGVmYXVsdClcbiAgICAvLyBkYXRhLmtwaUNvbmZpZ1snZGF0YVNvdXJjZSddID0gdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0W2RhdGFzZXRfY29uZmlnLmRhdGFzZXRJZF07XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4T2JqRm9yQ2hhcnQuY29tcENvbmZpZy52aWV3Q29uZmlnLnB1c2goZGF0YSlcbiAgICB0aGlzLmxvYWREeW5hbWljQ29tcG9uZW50KGRhdGEsIHRoaXMuc2VsZWN0ZWRJbmRleE9iakZvckNoYXJ0LCB0aGlzLnNlbGVjdGVkQ29udGFpbmVyT2JqZWN0Rm9yQ2hhcnQpO1xuICAgIGNvbnNvbGUubG9nKHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnKVxuICAgIHRoaXMudXBkYXRlV2lkZ2V0KCk7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ2hhcnRCdXR0b25DbGljayA9IGZhbHNlO1xuXG4gICAgLy8gfVxuXG4gIH1cblxuICB1cGRhdGVUb1ZpZXcoKSB7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMudXBkYXRlV2lkZ2V0KCk7XG4gIH1cblxuICBkZWxldGVXaWRnZXQoaXRlbSwgaW5kZXgpIHtcbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLnNwbGljZShpbmRleCwgMSlcbiAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZGVsZXRlSW5zZXJ0V2lkZ2V0KGl0ZW0sIGNoaWxkSW5kZXgsIHBhcmVudEluZGV4KSB7XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1twYXJlbnRJbmRleF0ud2lkZ2V0Tm9kZS5zcGxpY2UoY2hpbGRJbmRleCwgMSlcbiAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0V2lkZ2V0VGl0bGVEaXYoaXRlbSwgZGl2KSB7XG4gICAgLy8gY29uc3Qgd2lkZ2V0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgLy8gd2lkZ2V0RGl2LmNsYXNzTGlzdC5hZGQoJ2ZsZXgnLCAnaXRlbXMtY2VudGVyJywgJ2p1c3RpZnktYmV0d2VlbicsICdmb250LWJvbGQnLCAndGV4dC1tZCcsICd0ZXh0LWdyYXktOTAwJywgJ2Rhcms6dGV4dC13aGl0ZScsICdib3JkZXItYicsICdwLTMnLCAnYmctZ3JheS04MDAnLCAnbXgtMicsICdyb3VuZGVkLXQtbGcnKTtcbiAgICAvLyBjb25zdCB0aXRsZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIC8vIHRpdGxlRGl2LmlubmVyVGV4dCA9IChpdGVtLm5vZGVQcm9wZXJ0aWVzKSA/IGl0ZW0ubm9kZVByb3BlcnRpZXMud2lkZ2V0VGl0bGUgOiBcIlwiO1xuICAgIC8vIHdpZGdldERpdi5hcHBlbmQodGl0bGVEaXYpXG5cbiAgICBjb25zdCB3aWRnZXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB3aWRnZXREaXYuY2xhc3NMaXN0LmFkZChcbiAgICAgICdmbGV4JywgJ2l0ZW1zLWNlbnRlcicsICdqdXN0aWZ5LWJldHdlZW4nLCAnZm9udC1ib2xkJywgJ3RleHQtbWQnLFxuICAgICAgJ3RleHQtZ3JheS05MDAnLCAnZGFyazp0ZXh0LXdoaXRlJywgJ2JvcmRlci1iJywgJ3AtMycsICdiZy1ncmF5LTgwMCcsXG4gICAgICAnbXgtMicsICdyb3VuZGVkLXQtbGcnLCAncmVsYXRpdmUnIC8vIE5lZWRlZCBmb3IgYWJzb2x1dGUgdG9vbHRpcCBwb3NpdGlvbmluZ1xuICAgICk7XG5cbiAgICBjb25zdCB0aXRsZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRpdGxlRGl2LmNsYXNzTGlzdC5hZGQoJ3JlbGF0aXZlJywgJ2dyb3VwJyk7IC8vIFRhaWx3aW5kIGdyb3VwIGZvciBob3ZlciBlZmZlY3RcblxuICAgIGNvbnN0IHBhcmFtcyA9IGl0ZW0ubm9kZVByb3BlcnRpZXMud2lkZ2V0UGFyYW1zIHx8IFwiXCI7XG5cbiAgICAvLyBFeHRyYWN0IHRvb2x0aXAgY29udGVudCBmcm9tIHdpZGdldFRpdGxlXG4gICAgY29uc3Qgd2lkZ2V0VGl0bGUgPSBpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZGdldFRpdGxlO1xuICAgIGNvbnN0IHRvb2x0aXBNYXRjaCA9IHdpZGdldFRpdGxlLm1hdGNoKC9cXCR0XFx7KFtcXHNcXFNdKj8pXFx9Lyk7IC8vIFN1cHBvcnRzIG11bHRpLWxpbmUgSFRNTFxuXG4gICAgLy8gUmVtb3ZlICckdHsuLi59JyBmcm9tIGRpc3BsYXllZCB0aXRsZVxuICAgIGNvbnN0IGRpc3BsYXlUaXRsZSA9IHdpZGdldFRpdGxlLnJlcGxhY2UoL1xcJHRcXHtbXFxzXFxTXSo/XFx9L2csICcnKS50cmltKCk7XG5cbiAgICAvLyBTZXQgdGl0bGUgdGV4dFxuICAgIHRpdGxlRGl2LmlubmVyVGV4dCA9IGRpc3BsYXlUaXRsZSArIHBhcmFtcztcblxuICAgIC8vIElmIGEgdG9vbHRpcCBpcyBmb3VuZCwgY3JlYXRlIGEgdG9vbHRpcCBkaXZcbiAgICBpZiAodG9vbHRpcE1hdGNoKSB7XG4gICAgICBjb25zdCB0b29sdGlwQ29udGVudCA9IHRvb2x0aXBNYXRjaFsxXS50cmltKCk7XG4gICAgICBjb25zdCB0b29sdGlwRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0b29sdGlwRGl2LmNsYXNzTGlzdC5hZGQoXG4gICAgICAgICdhYnNvbHV0ZScsICdsZWZ0LTAnLCAnYm90dG9tLWZ1bGwnLCAnbWItMicsICd3LW1heCcsICdtYXgtdy14cycsXG4gICAgICAgICdiZy1ibGFjaycsICd0ZXh0LXdoaXRlJywgJ3RleHQtc20nLCAncC0yJywgJ3JvdW5kZWQtbGcnLCAnc2hhZG93LWxnJyxcbiAgICAgICAgJ29wYWNpdHktMCcsICdncm91cC1ob3ZlcjpvcGFjaXR5LTEwMCcsICd0cmFuc2l0aW9uLW9wYWNpdHknLCAnZHVyYXRpb24tMzAwJyxcbiAgICAgICAgJ3otNTAnXG4gICAgICApO1xuICAgICAgdG9vbHRpcERpdi5pbm5lckhUTUwgPSB0b29sdGlwQ29udGVudDsgLy8gU2V0IGlubmVySFRNTCBmb3IgcmljaCBIVE1MIHRvb2x0aXBzXG5cbiAgICAgIC8vIEFwcGVuZCB0b29sdGlwIHRvIHRpdGxlRGl2XG4gICAgICB0aXRsZURpdi5hcHBlbmRDaGlsZCh0b29sdGlwRGl2KTtcbiAgICB9XG5cbiAgICB3aWRnZXREaXYuYXBwZW5kQ2hpbGQodGl0bGVEaXYpO1xuXG5cbiAgICAvLyBBZGQgRm9udEF3ZXNvbWUgZWRpdCBpY29uXG4gICAgY29uc3QgZWRpdEljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XG4gICAgZWRpdEljb24uY2xhc3NMaXN0LmFkZCgnZmEnLCAnZmEtcGVuY2lsJywgJ21sLTInLCAnY3Vyc29yLXBvaW50ZXInLCAndGV4dC1ibHVlLTQwMCcsICdob3Zlcjp0ZXh0LWJsdWUtNzAwJyk7XG4gICAgd2lkZ2V0RGl2LmFwcGVuZChlZGl0SWNvbik7XG5cbiAgICBpZiAoaXRlbS5ub2RlUHJvcGVydGllcy5pc1dpZGdldEZpbHRlcikge1xuICAgICAgY29uc3Qgc2VhcmNoQ29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzZWFyY2hDb250YWluZXJEaXYuY2xhc3NMaXN0LmFkZCgnZmxleCcsICdpdGVtcy1jZW50ZXInLCAnc3BhY2UteC0yJyk7XG4gICAgICBjb25zdCBzZWFyY2hCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgIHNlYXJjaEJ1dHRvbi5pbm5lclRleHQgPSAnRmlsdGVyJztcbiAgICAgIHNlYXJjaEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdweC0zJywgJ3B5LTEuNScsICdiZy1ibHVlLTYwMCcsICdtci0yJywgJ3RleHQtd2hpdGUnLCAncm91bmRlZCcsICdob3ZlcjpiZy1ibHVlLTcwMCcpO1xuICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2UgPSBbXTtcblxuICAgICAgc2VhcmNoQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmlzV2lkZ2V0RmlsdGVycyA9IHRydWU7XG4gICAgICAgIGxldCBmaWx0ZVByb3BlcnRpY2UgPSBbXTtcbiAgICAgICAgaXRlbS5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICBsZXQga2V5X25hbWUgPSB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3RbZWxlbWVudC5kYXRhc2V0SWRdWzBdO1xuICAgICAgICAgIE9iamVjdC5rZXlzKGtleV9uYW1lKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoIWZpbHRlUHJvcGVydGljZS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgIGZpbHRlUHJvcGVydGljZS5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZpbHRlUHJvcGVydGljZS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICBjb2x1bW5OYW1lOiBlbGVtZW50LFxuICAgICAgICAgICAgZGF0YVR5cGU6IFwiZmxvYXRcIixcbiAgICAgICAgICAgIG9wZXJhdG9yOiBcIlwiLFxuICAgICAgICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlLnB1c2gob2JqKVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgc2VhcmNoQ29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHNlYXJjaEJ1dHRvbilcbiAgICAgIHdpZGdldERpdi5hcHBlbmRDaGlsZCh0aXRsZURpdik7XG4gICAgICB3aWRnZXREaXYuYXBwZW5kQ2hpbGQoc2VhcmNoQ29udGFpbmVyRGl2KTtcbiAgICB9XG5cbiAgICBpZiAoaXRlbS5maWx0ZXJJZCkge1xuICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2UgPSB7fTtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlWyd2aWV3Q29uZmlnJ10gPSBpdGVtO1xuICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2VbJ2hhdmluZ0NvbmZpZyddID0gW107XG5cbiAgICAgIHRoaXMuc2VydmljZS5nZXRBcHBGaWx0ZXJDb25maWcoaXRlbS5maWx0ZXJJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpbHRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIHRoaXMubG9hZFdpZGdldEZpbHRlckNvbXBvbmVudChpdGVtLCB3aWRnZXREaXYsIGRhdGEuZmlsdGVySXRlbXMpO1xuICAgICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG5cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChpdGVtLm5vZGVQcm9wZXJ0aWVzLm5vZGVmaWx0ZXJzICYmIGl0ZW0ubm9kZVByb3BlcnRpZXMubm9kZWZpbHRlcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICBjb25zdCBzZWFyY2hDb250YWluZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHNlYXJjaENvbnRhaW5lckRpdi5jbGFzc0xpc3QuYWRkKCdmbGV4JywgJ2l0ZW1zLWNlbnRlcicsICdzcGFjZS14LTInKTtcbiAgICAgIGl0ZW0ubm9kZVByb3BlcnRpZXMubm9kZWZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZmlsdGVyRGl2LmNsYXNzTGlzdC5hZGQoJ2ZsZXgnLCAnaXRlbXMtY2VudGVyJyk7XG4gICAgICAgIGlmIChmaWx0ZXIuaW5wdXRfdHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgY29uc3QgdGV4dEJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgdGV4dEJveC50eXBlID0gJ3RleHQnO1xuICAgICAgICAgIHRleHRCb3gucGxhY2Vob2xkZXIgPSBgRW50ZXIgJHtmaWx0ZXIubG9jYWxfY29sdW1ufWA7XG4gICAgICAgICAgdGV4dEJveC5jbGFzc0xpc3QuYWRkKCdweC0yJywgJ3B5LTEuNScsICdyb3VuZGVkJywgJ2JvcmRlcicsICdtci0xJywgJ2JvcmRlci1ncmF5LTUwMCcsICd0ZXh0LWdyYXktOTAwJywgJ2Rhcms6YmctZ3JheS03MDAnLCAnZGFyazp0ZXh0LXdoaXRlJyk7XG4gICAgICAgICAgY29uc3Qgc2VhcmNoQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgICAgc2VhcmNoQnV0dG9uLmlubmVyVGV4dCA9ICdTZWFyY2gnO1xuICAgICAgICAgIHNlYXJjaEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdweC0zJywgJ3B5LTEuNScsICdiZy1ibHVlLTYwMCcsICdtci0yJywgJ3RleHQtd2hpdGUnLCAncm91bmRlZCcsICdob3ZlcjpiZy1ibHVlLTcwMCcpO1xuICAgICAgICAgIGNvbnN0IHNlcGFyZXJvdEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIHNlcGFyZXJvdEJ1dHRvbi5pbm5lckhUTUwgPSAnfCc7XG4gICAgICAgICAgc2VhcmNoQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VhcmNoVGVybSA9IHRleHRCb3gudmFsdWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnVGV4dCBzZWFyY2ggYnV0dG9uIGNsaWNrZWQgd2l0aDonLCBzZWFyY2hUZXJtKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmaWx0ZXJEaXYuYXBwZW5kQ2hpbGQodGV4dEJveCk7XG4gICAgICAgICAgZmlsdGVyRGl2LmFwcGVuZENoaWxkKHNlYXJjaEJ1dHRvbik7XG4gICAgICAgICAgZmlsdGVyRGl2LmFwcGVuZENoaWxkKHNlcGFyZXJvdEJ1dHRvbik7XG4gICAgICAgIH1cblxuICAgICAgICBzZWFyY2hDb250YWluZXJEaXYuYXBwZW5kQ2hpbGQoZmlsdGVyRGl2KTtcbiAgICAgIH0pO1xuICAgICAgd2lkZ2V0RGl2LmFwcGVuZENoaWxkKHNlYXJjaENvbnRhaW5lckRpdik7XG4gICAgfVxuXG4gICAgZWRpdEljb24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG5cbiAgICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmZpbmRJbmRleChvYmplY3QgPT4gb2JqZWN0LndpZGdldElkID09PSBkaXYud2lkZ2V0SWQpO1xuICAgICAgdGhpcy5pc1VwZGF0ZVdpZGdldCA9IHRydWU7XG4gICAgICB0aGlzLmlzbGF5b3V0Q3JlYXRlID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQgPSB0cnVlO1xuICAgICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gZmFsc2U7XG4gICAgICB0aGlzLmlzQ2hhcnRCdXR0b25DbGljayA9IGZhbHNlO1xuICAgICAgdGhpcy5ub2RlUHJvcGVydGljZUZpbHRlcnMgPSAoaXRlbS5ub2RlUHJvcGVydGllcy5ub2RlZmlsdGVycyAmJiBpdGVtLm5vZGVQcm9wZXJ0aWVzLm5vZGVmaWx0ZXJzLmxlbmd0aCAhPT0gMCkgPyBpdGVtLm5vZGVQcm9wZXJ0aWVzLm5vZGVmaWx0ZXJzIDogW107XG4gICAgICBpdGVtLm5vZGVQcm9wZXJ0aWVzWydub2RlZmlsdGVycyddID0gdGhpcy5ub2RlUHJvcGVydGljZUZpbHRlcnM7XG4gICAgICB0aGlzLmFkZGVkd2lkR2V0Q29uZmlnID0gaXRlbS5ub2RlUHJvcGVydGllcztcbiAgICAgIHRoaXMuYWxsV2lkZ2V0SW5uZXJDb250ZW50ID0gaXRlbS5jb21wQ29uZmlnLnZpZXdDb25maWc7XG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVySWQgPSAoaXRlbS5maWx0ZXJJZCkgPyBpdGVtLmZpbHRlcklkIDogXCJcIjtcbiAgICAgIHRoaXMuZWRpdFZpZXdkYXRhU291cmNlTW9kYWwgPSB7fTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJEYXRhc291cmNlID0gaXRlbTtcbiAgICB9KTtcbiAgICByZXR1cm4gd2lkZ2V0RGl2O1xuICB9XG5cblxuICBnZXRGaWx0ZXJWYWx1ZUJ5SWQoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuZXZlbnQpIHtcbiAgICAgIHRoaXMuc2VydmljZS5nZXRBcHBGaWx0ZXJDb25maWcoZXZlbnQudmFsdWUpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zZWxlY3RlZEZpbHRlckRhdGFzb3VyY2UpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlckRhdGFzb3VyY2UuZmlsdGVySWQgPSB0aGlzLnNlbGVjdGVkRmlsdGVySWQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0uZmlsdGVycyA9IGRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoXCJGaWx0ZXIgQ2hhbmdlZFwiKVxuICAgICAgICB9LCBlcnJvZTogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdGaWx0ZXIgVXBkYXRlJylcblxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG5cbiAgY3JlYXRlRGl2RWxlbWVudHMoZGF0YXNldEJ5SWQpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmR5bmFtaWNDb250YWluZXIubmF0aXZlRWxlbWVudDtcblxuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIGNvbnN0IGNvbnRleHRfZmlsdGVyID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcuZmlsdGVycyA/IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLmZpbHRlcnMuZmlsdGVySXRlbXMgOiBudWxsO1xuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuZm9yRWFjaChhc3luYyBkaXYgPT4ge1xuICAgICAgY29uc3Qgcm93RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBsZXQgd19oZWlnaHQgPSAoZGl2LndpZGdldFByb3BlcnRpZXMuaGVpZ2h0ID09IFwiXCIpID8gXCJoLWF1dG9cIiA6ICdoLVsnICsgZGl2LndpZGdldFByb3BlcnRpZXMuaGVpZ2h0ICsgJ10nO1xuICAgICAgcm93RGl2LmNsYXNzTGlzdC5hZGQoZGl2LndpZGdldFByb3BlcnRpZXMud2lkdGgsIHdfaGVpZ2h0LCAnYm9yZGVyJyk7XG4gICAgICBjb25zdCBmaWx0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgY29uc3QgZmlsdGVySXRlbXMgPSAoZGl2LmZpbHRlcnMpID8gZGl2LmZpbHRlcnMuZmlsdGVySXRlbXMgOiBbXTtcbiAgICAgIC8vIGlmIChkaXYuZmlsdGVycykge1xuICAgICAgdGhpcy5sb2FkRmlsdGVyQ29tcG9uZW50KGRpdiwgZmlsdGVyRGl2LCBmaWx0ZXJJdGVtcywgY29udGV4dF9maWx0ZXIpO1xuXG4gICAgICAvLyB9XG5cbiAgICAgIHJvd0Rpdi5hcHBlbmRDaGlsZChmaWx0ZXJEaXYpXG5cbiAgICAgIGlmIChkaXYud2lkZ2V0Tm9kZSAmJiBkaXYud2lkZ2V0Tm9kZS5sZW5ndGggJiYgZGl2LndpZGdldE5vZGUubGVuZ3RoICE9IDApIHtcbiAgICAgICAgY29uc3QgbWFpbkl0ZW1EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbWFpbkl0ZW1EaXYuY2xhc3NMaXN0LmFkZChcImZsZXhcIiwgXCJmbGV4LXdyYXBcIik7XG4gICAgICAgIHRoaXMubG9hZFdpZGdldE5vZGVzKGRpdiwgbWFpbkl0ZW1EaXYsIGRhdGFzZXRCeUlkKTtcbiAgICAgICAgLy8gZm9yIGxvb3Agb24gd2lkZ2V0XG4gICAgICAgIHJvd0Rpdi5hcHBlbmRDaGlsZChtYWluSXRlbURpdik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBfaW5uZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHBfaW5uZXJEaXYuY2xhc3NMaXN0LmFkZCgncm91bmRlZCcsICdqdXN0aWZ5LWNlbnRlcicsICdpdGVtcy1jZW50ZXInLCAnYm9yZGVyJywgJ3AtMScsICdtLTEnLCAnZmxleCcsICdmbGV4LXJvdycpO1xuICAgICAgLy8gYWRkIHdpZGdldCBidXR0b25cbiAgICAgIGNvbnN0IHBfYnV0dG9uX3dpZGdldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcF9idXR0b25fd2lkZ2V0LmlubmVyVGV4dCA9ICdBZGQgU2luZ2xlIExheW91dCc7XG4gICAgICBwX2J1dHRvbl93aWRnZXQuY2xhc3NMaXN0LmFkZCgnYmctYmx1ZS03MDAnLCBcInAtMVwiLCBcInctZml0XCIsIFwiY3Vyc29yLXBvaW50ZXJcIiwgJ3RleHQteHMnKVxuICAgICAgcF9idXR0b25fd2lkZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuZmluZEluZGV4KG9iamVjdCA9PiBvYmplY3Qud2lkZ2V0SWQgPT09IGRpdi53aWRnZXRJZCk7XG4gICAgICAgIHRoaXMuaW5zZXJ0TmV3V2lnZXQoaW5kZXgpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGRlbGV0ZSB3aWRnZXQgYnV0dG9uXG4gICAgICBjb25zdCBwX2RlbF9idXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHBfZGVsX2J1dHRvbi5pbm5lclRleHQgPSAnRGV0ZXRlIGxheW91dCc7XG4gICAgICBwX2RlbF9idXR0b24uY2xhc3NMaXN0LmFkZCgnYmctcmVkLTcwMCcsIFwicC0xXCIsIFwidy1maXRcIiwgXCJjdXJzb3ItcG9pbnRlclwiLCAndGV4dC14cycpXG4gICAgICBwX2RlbF9idXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG5cblxuICAgICAgICBsZXQgcmVzdWx0ID0gY29uZmlybShcIjxpPkFyZSBZb3UgU3VyZT88L2k+XCIsIFwiRGVsZXRlIExheW91dFwiKTtcbiAgICAgICAgcmVzdWx0LnRoZW4oKGRpYWxvZ1Jlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChkaWFsb2dSZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMgPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLm1hcChjb25maWcgPT4gY29uZmlnLndpZGdldElkKTtcbiAgICAgICAgICAgIHJvd0Rpdi5yZW1vdmUoKVxuXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2UuZWRpdEFwcFBhZ2VDb25maWcodGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldEFwcFBhZ2VEZXRhaWxDb25maWdCeVBhZ2VJZCgpXG4gICAgICAgICAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnV2lkZ2V0IENyZWF0aW9uJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzRGVmYXVsdFZpZXcgPSB0cnVlO1xuXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLy8gYWR2YW5jZWQgYnV0dG9uXG4gICAgICBjb25zdCBhZHZhbmNlX2J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgYWR2YW5jZV9idXR0b24uaW5uZXJUZXh0ID0gJ0FkdmFuY2UgTGF5b3V0JztcbiAgICAgIGFkdmFuY2VfYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2JnLXllbGxvdy03MDAnLCBcInAtMVwiLCBcInctZml0XCIsIFwiY3Vyc29yLXBvaW50ZXJcIiwgJ3RleHQteHMnKVxuICAgICAgYWR2YW5jZV9idXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbXBfb2JqZWN0ID0gdGhpcy5maW5kV2lkZ2V0QnlJZCh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLCBkaXYud2lkZ2V0SWQpO1xuICAgICAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5maW5kSW5kZXgob2JqZWN0ID0+IG9iamVjdC53aWRnZXRJZCA9PT0gZGl2LndpZGdldElkKTtcblxuICAgICAgICB0aGlzLmlzQWR2YW5jZUxheW91dCA9IHRydWU7XG5cbiAgICAgIH0pO1xuXG4gICAgICBwX2lubmVyRGl2LmFwcGVuZENoaWxkKGFkdmFuY2VfYnV0dG9uKTtcbiAgICAgIHBfaW5uZXJEaXYuYXBwZW5kQ2hpbGQocF9idXR0b25fd2lkZ2V0KTtcbiAgICAgIHBfaW5uZXJEaXYuYXBwZW5kQ2hpbGQocF9kZWxfYnV0dG9uKTtcblxuICAgICAgaWYgKCF0aGlzLmlzRGFzaEJvYXJkQ29udGVudFR5cGVWaWV3KSB7XG4gICAgICAgIHJvd0Rpdi5hcHBlbmRDaGlsZChwX2lubmVyRGl2KTtcbiAgICAgIH1cbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChyb3dEaXYpO1xuICAgIH0pO1xuICB9XG5cbiAgbG9hZFdpZGdldE5vZGVzKGRpdjogYW55LCBtYWluSXRlbURpdjogYW55LCBkYXRhc2V0QnlJZDogYW55KSB7XG4gICAgZGl2LndpZGdldE5vZGUuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIHRoaXMubG9hZFNpbmdsZVdpZGdldE5vZGUoaXRlbSwgbWFpbkl0ZW1EaXYsIGRhdGFzZXRCeUlkLCBkaXYpO1xuICAgIH0pO1xuICB9XG5cbiAgbG9hZFNpbmdsZVdpZGdldE5vZGUoaXRlbTogYW55LCBjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCwgZGF0YXNldEJ5SWQ6IGFueSwgZGl2KSB7XG4gICAgbGV0IHdfaGVpZ2h0ID0gKGl0ZW0ubm9kZVByb3BlcnRpZXMuaGVpZ2h0ID09IFwiXCIpID8gXCJoLWF1dG9cIiA6ICdoLVsnICsgaXRlbS5ub2RlUHJvcGVydGllcy5oZWlnaHQgKyAnXSc7XG4gICAgbGV0IHdfd2lkdGggPSAoaXRlbS5ub2RlUHJvcGVydGllcy53aWR0aCA9PSBcIlwiKSA/IFwidy1mdWxsXCIgOiBpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZHRoO1xuICAgIGNvbnN0IGl0ZW1EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBpdGVtRGl2LmNsYXNzTGlzdC5hZGQod193aWR0aCwgd19oZWlnaHQsICdib3JkZXInLCAncC0xJyk7XG5cbiAgICBjb25zdCBmbGV4Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZmxleENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdmbGV4JywgJ2p1c3RpZnktYmV0d2VlbicsICdpdGVtcy1jZW50ZXInLCAndGV4dC1ncmF5LTkwMCcsICdkYXJrOnRleHQtd2hpdGUnLCAnYmctZ3JheS04MDAnLCAnbXgtMicsICdyb3VuZGVkLXQtbGcnKTsgLy8gRmxleGJveCBjb250YWluZXJcblxuICAgIGNvbnN0IHdpZGdldERpdiA9IHRoaXMuZ2V0V2lkZ2V0VGl0bGVEaXYoaXRlbSwgZGl2KVxuICAgIGl0ZW0uY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5rcGlDb25maWcpIHtcbiAgICAgICAgbGV0IGFwaUNhbGxzID0gW107XG4gICAgICAgIHRoaXMuc2VydmljZS5nZXRBcHBEYXRhc2V0Q29uZmlnKGVsZW1lbnQuZGF0YXNldElkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChkYXRhc2V0OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhc2V0LmRhdGFzZXRUeXBlICE9PSBcInNxbFF1ZXJ5XCIgJiYgZGF0YXNldC5kYXRhc2V0VHlwZSAhPT0gXCJwbGFpbmpzb25cIikge1xuICAgICAgICAgICAgICBjb25zdCBkYXRhc2V0V2l0aExpbWl0ID0gdGhpcy5zZXREYXRhU2V0c0xpbWl0KGRhdGFzZXQpO1xuICAgICAgICAgICAgICBhcGlDYWxscy5wdXNoKHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YUZyb21EYXRhU2V0KGRhdGFzZXRXaXRoTGltaXQsIGRhdGFzZXRXaXRoTGltaXQuZGF0YXNldElkLCB0aGlzLmRlZmF1bHRBcHBseWVkRmlsdGVyKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFzZXQuZGF0YXNldFR5cGUgPT0gXCJzcWxRdWVyeVwiKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpbHRlcldpdGhMaW1pdCA9IHRoaXMuc2V0RGF0YVNldHNMaW1pdEZvclNxbChkYXRhc2V0KTtcbiAgICAgICAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChmaWx0ZXJXaXRoTGltaXQsIGZpbHRlcldpdGhMaW1pdC5kYXRhc2V0SWQsIHRoaXMuZGVmYXVsdEFwcGx5ZWRGaWx0ZXIpKTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChkYXRhc2V0LCBkYXRhc2V0LmRhdGFzZXRJZCwgdGhpcy5kZWZhdWx0QXBwbHllZEZpbHRlcikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBQcm9taXNlLmFsbChhcGlDYWxscykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0VW5pcXVlRGF0YVNldE9iamVjdCgpO1xuICAgICAgICAgICAgICBlbGVtZW50LmtwaUNvbmZpZ1snZGF0YVNvdXJjZSddID0gdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0W2VsZW1lbnQuZGF0YXNldElkXVxuICAgICAgICAgICAgICBjb25zdCBjb21wX29iamVjdCA9IHRoaXMuZmluZFdpZGdldEJ5SWQodGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cywgaXRlbS5pZCk7XG4gICAgICAgICAgICAgIHRoaXMubG9hZER5bmFtaWNDb21wb25lbnQoZWxlbWVudCwgY29tcF9vYmplY3QsIGl0ZW1EaXYpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pO1xuICAgIGZsZXhDb250YWluZXIuYXBwZW5kQ2hpbGQod2lkZ2V0RGl2KTtcblxuICAgIC8vIENyZWF0ZSBidXR0b25zIGNvbnRhaW5lciBmb3IgYWxpZ25tZW50XG4gICAgY29uc3QgYnV0dG9uc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGJ1dHRvbnNDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZmxleCcsICdteC0yJyk7IC8vIFRvIGFsaWduIGJ1dHRvbnMgc2lkZSBieSBzaWRlIHdpdGggc29tZSBzcGFjaW5nXG5cblxuICAgIGNvbnN0IGlubmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgaW5uZXJEaXYuY2xhc3NMaXN0LmFkZCgncm91bmRlZCcsICdqdXN0aWZ5LWNlbnRlcicsICdpdGVtcy1jZW50ZXInLCAncC0xJywgJ20tMScsICdmbGV4JywgJ2ZsZXgtcm93Jyk7XG5cbiAgICBjb25zdCBidXR0b25fY2hhcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBidXR0b25fY2hhcnQuaW5uZXJUZXh0ID0gJ0FkZCBWaWV3JztcbiAgICBidXR0b25fY2hhcnQuY2xhc3NMaXN0LmFkZCgnYmctZ3JlZW4tNzAwJywgXCJwLTFcIiwgXCJ3LWZpdFwiLCBcImN1cnNvci1wb2ludGVyXCIsICd0ZXh0LXhzJylcbiAgICBidXR0b25fY2hhcnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5maW5kSW5kZXgob2JqZWN0ID0+IG9iamVjdC53aWRnZXRJZCA9PT0gZGl2LndpZGdldElkKTtcbiAgICAgIGNvbnN0IGNvbXBfb2JqZWN0ID0gdGhpcy5maW5kV2lkZ2V0QnlJZCh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLCBpdGVtLmlkKTtcbiAgICAgIHRoaXMuaW5zZXJ0Q2hhcnRXaWdldChjb21wX29iamVjdCwgaXRlbURpdik7XG4gICAgfSk7XG5cblxuICAgIGNvbnN0IGRlbF9idXR0b25fY2hhcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkZWxfYnV0dG9uX2NoYXJ0LmlubmVyVGV4dCA9ICdEZXRldGUnO1xuICAgIGRlbF9idXR0b25fY2hhcnQuY2xhc3NMaXN0LmFkZCgnYmctcmVkLTcwMCcsIFwicC0xXCIsIFwidy1maXRcIiwgXCJjdXJzb3ItcG9pbnRlclwiLCAndGV4dC14cycpXG4gICAgZGVsX2J1dHRvbl9jaGFydC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGxldCByZXN1bHQgPSBjb25maXJtKFwiPGk+QXJlIFlvdSBTdXJlPzwvaT5cIiwgXCJEZWxldGUgVmlld1wiKTtcbiAgICAgIHJlc3VsdC50aGVuKChkaWFsb2dSZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKGRpYWxvZ1Jlc3VsdCkge1xuICAgICAgICAgIGxldCB3aWRnZXRJbmRleCA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuZmluZEluZGV4KG9iamVjdCA9PiBvYmplY3Qud2lkZ2V0SWQgPT09IGRpdi53aWRnZXRJZCk7XG4gICAgICAgICAgY29uc3QgbWFwZWRPYmplY3QgPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3dpZGdldEluZGV4XVxuICAgICAgICAgIGlmIChtYXBlZE9iamVjdC53aWRnZXROb2RlICYmIG1hcGVkT2JqZWN0LndpZGdldE5vZGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IG1hcEluZGV4ID0gbWFwZWRPYmplY3Qud2lkZ2V0Tm9kZS5maW5kSW5kZXgoaW5kID0+IGluZC5pZCA9PT0gaXRlbS5pZClcbiAgICAgICAgICAgIG1hcGVkT2JqZWN0LndpZGdldE5vZGUuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgICAgbm9kZS5jb21wQ29uZmlnLnZpZXdDb25maWcgPSBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZy5tYXAoY29uZmlnID0+IGNvbmZpZy52aWV3SWQpO1xuICAgICAgICAgICAgICBub2RlLmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMgPSBbXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbWFwZWRPYmplY3Qud2lkZ2V0Tm9kZS5zcGxpY2UobWFwSW5kZXgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXBlZE9iamVjdFsnZmlsdGVySWQnXSA9IChtYXBlZE9iamVjdC5maWx0ZXJzKSA/IG1hcGVkT2JqZWN0LmZpbHRlcnMuZmlsdGVySWQgOiBudWxsO1xuICAgICAgICAgIGRlbGV0ZSBtYXBlZE9iamVjdFsnZmlsdGVycyddO1xuICAgICAgICAgIG1hcGVkT2JqZWN0LmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMgPSBbXTtcbiAgICAgICAgICB0aGlzLnNlcnZpY2UuZWRpdEFwcFdpZGdldENvbmZpZyhtYXBlZE9iamVjdCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5nZXRBcHBQYWdlRGV0YWlsQ29uZmlnQnlQYWdlSWQoKVxuICAgICAgICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ1dpZGdldCBDcmVhdGlvbicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGl0ZW1EaXYucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cblxuICAgIC8vIGlubmVyRGl2LmFwcGVuZENoaWxkKGJ1dHRvbl9jaGFydCk7XG4gICAgLy8gaW5uZXJEaXYuYXBwZW5kQ2hpbGQoZGVsX2J1dHRvbl9jaGFydCk7XG4gICAgLy8gQXBwZW5kIGJ1dHRvbnMgdG8gYnV0dG9ucyBjb250YWluZXJcbiAgICBidXR0b25zQ29udGFpbmVyLmFwcGVuZENoaWxkKGJ1dHRvbl9jaGFydCk7XG4gICAgYnV0dG9uc0NvbnRhaW5lci5hcHBlbmRDaGlsZChkZWxfYnV0dG9uX2NoYXJ0KTtcblxuICAgIC8vIEFkZCB0aGUgYnV0dG9ucyBjb250YWluZXIgdG8gdGhlIGZsZXggY29udGFpbmVyXG4gICAgZmxleENvbnRhaW5lci5hcHBlbmRDaGlsZChidXR0b25zQ29udGFpbmVyKTtcbiAgICBpZiAoIXRoaXMuaXNEYXNoQm9hcmRDb250ZW50VHlwZVZpZXcpIHtcbiAgICB9XG4gICAgaXRlbURpdi5hcHBlbmRDaGlsZChmbGV4Q29udGFpbmVyKTtcbiAgICAvLyBpdGVtRGl2LmFwcGVuZENoaWxkKHdpZGdldERpdik7XG5cbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1EaXYpXG5cblxuXG4gIH1cblxuXG5cbiAgZmluZFdpZGdldEJ5SWQoY29uZmlnczogYW55W10sIGlkOiBzdHJpbmcpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGNvbmZpZ3MpIHtcbiAgICAgIGlmIChjb25maWcuaWQgPT09IGlkKSB7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLndpZGdldE5vZGUgJiYgY29uZmlnLndpZGdldE5vZGUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZmluZFdpZGdldEJ5SWQoY29uZmlnLndpZGdldE5vZGUsIGlkKTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBkZWxldGVXaWRnZXRCeUlkKGNvbmZpZ3M6IGFueVtdLCBpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IGNvbmZpZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChjb25maWdzW2ldLmlkID09PSBpZCkge1xuICAgICAgICBjb25maWdzLnNwbGljZShpLCAxKTtcbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnc1tpXS53aWRnZXROb2RlICYmIGNvbmZpZ3NbaV0ud2lkZ2V0Tm9kZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZGVsZXRlV2lkZ2V0QnlJZChjb25maWdzW2ldLndpZGdldE5vZGUsIGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsb2FkRHluYW1pY0NvbXBvbmVudChkYXRhLCBpbmRleE9iaiwgY29udGFpbmVyRWxlbWVudCk6IGFueSB7XG4gICAgY29uc3QgY29tcG9uZW50Q2xhc3MgPSB0aGlzLmNvbXBvbmVudENsYXNzTWFwW2RhdGEua3BpQ29uZmlnWydjb21wb25lbnROYW1lJ11dO1xuICAgIHRoaXMuQ29tcFJlZnMgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudENsYXNzKTtcbiAgICBjb25zdCBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UgPSB0aGlzLkNvbXBSZWZzLmluc3RhbmNlO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5jaGFydERhdGFTb3VyY2UgPSBkYXRhO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5rcGlfbmFtZSA9IFwiXCI7XG5cbiAgICBpbmRleE9iai5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzLnB1c2godGhpcy5Db21wUmVmcyk7XG4gICAgY29uc3QgY3NzQ2xhc3MgPSBcInctZnVsbFwiO1xuICAgIHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGNzc0NsYXNzKTtcbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBsb2FkRmlsdGVyQ29tcG9uZW50KGluZGV4T2JqLCBjb250YWluZXJFbGVtZW50LCBmaWx0ZXJJdGVtcywgY29udGV4dF9maWx0ZXIpIHtcblxuICAgIGxldCBzZWxlY3RlZERhdGVzID0geyBzdGFydERhdGU6IHRoaXMuZGVmYXVsdFN0YXJ0RGF0ZSwgZW5kRGF0ZTogdGhpcy5kZWZhdWx0RW5kRGF0ZSB9XG4gICAgY29uc3QgY29tcG9uZW50Q2xhc3MgPSB0aGlzLmNvbXBvbmVudENsYXNzTWFwWydBcHBBZHZhbmNlSGVhZGVyQ29tcG9uZW50J107XG4gICAgdGhpcy5Db21wUmVmcyA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50Q2xhc3MpO1xuICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZSA9IHRoaXMuQ29tcFJlZnMuaW5zdGFuY2U7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLnNlbGVjdGVkRGF0ZXMgPSBzZWxlY3RlZERhdGVzO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5maWx0ZXJJdGVtcyA9IGZpbHRlckl0ZW1zO1xuXG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmNvbnRleHRGaWx0ZXJJdGVtcyA9IGNvbnRleHRfZmlsdGVyO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5wYWdlVGl0bGUgPSB0aGlzLnBhZ2VUaXRsZTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuaXNFZGl0QnV0dG9uID0gZmFsc2U7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmlzQWR2YW5jZUJ1dHRvbiA9IHRydWU7XG5cbiAgICBpbmRleE9iai5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzLnB1c2godGhpcy5Db21wUmVmcyk7XG4gICAgY29uc3QgY3NzQ2xhc3MgPSBcInctZnVsbFwiO1xuICAgIHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGNzc0NsYXNzKTtcbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBsb2FkV2lkZ2V0RmlsdGVyQ29tcG9uZW50KGluZGV4T2JqLCBjb250YWluZXJFbGVtZW50LCBmaWx0ZXJJdGVtcykge1xuICAgIGxldCBzZWxlY3RlZERhdGVzID0geyBzdGFydERhdGU6IHRoaXMuZGVmYXVsdFN0YXJ0RGF0ZSwgZW5kRGF0ZTogdGhpcy5kZWZhdWx0RW5kRGF0ZSB9XG4gICAgY29uc3QgY29tcG9uZW50Q2xhc3MgPSB0aGlzLmNvbXBvbmVudENsYXNzTWFwWydBZHZhbmNlV2lkZ2V0SGVhZGVyRmlsdGVyQ29tcG9uZW50J107XG4gICAgdGhpcy5Db21wUmVmcyA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50Q2xhc3MpO1xuICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZSA9IHRoaXMuQ29tcFJlZnMuaW5zdGFuY2U7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLnNlbGVjdGVkRGF0ZXMgPSBzZWxlY3RlZERhdGVzO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5maWx0ZXJJdGVtcyA9IGZpbHRlckl0ZW1zO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5nZXRXaWRnZXRGaWx0ZXJDb25maWcuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLmdldFdpZGdldEZpbHRlckZvclRlbXBsYXRlKHZhbHVlKTtcbiAgICB9KTtcblxuICAgIGluZGV4T2JqLmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMucHVzaCh0aGlzLkNvbXBSZWZzKTtcbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBnZXREZWxldGVWaWV3RnJvbUNvbmZpZyhpbmRleCkge1xuICAgIGNvbnNvbGUubG9nKGluZGV4KTtcbiAgICB0aGlzLmFsbFdpZGdldElubmVyQ29udGVudC5zcGxpY2UoaW5kZXgsIDEpXG4gIH1cblxuICBtb3ZlSXRlbUZvclBhZ2VWaWV3KGluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogJ3VwJyB8ICdkb3duJyk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgbW92aW5nIGJleW9uZCBhcnJheSBib3VuZHNcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZS5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpcmVjdGlvbiA9PT0gJ3VwJyA/IGluZGV4IC0gMSA6IGluZGV4ICsgMTtcbiAgICAvLyBQcmV2ZW50IG1vdmluZyBiZXlvbmQgYXJyYXkgYm91bmRzXG4gICAgaWYgKG5ld1Bvc2l0aW9uIDwgMCB8fCBuZXdQb3NpdGlvbiA+PSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUubGVuZ3RoKSByZXR1cm47XG5cbiAgICAvLyBNb3ZlIGl0ZW1cbiAgICBjb25zdCBpdGVtVG9Nb3ZlID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlW2luZGV4XTtcbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUuc3BsaWNlKGluZGV4LCAxKTsgLy8gUmVtb3ZlIGl0ZW0gZnJvbSBjdXJyZW50IHBvc2l0aW9uXG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaXRlbVRvTW92ZSk7IC8vIEluc2VydCBpdGVtIGluIG5ldyBwb3NpdGlvblxuICB9XG4gIG1vdmVJdGVtRm9yQ29sdW1ucyhpbmRleDogbnVtYmVyLCBkaXJlY3Rpb246ICd1cCcgfCAnZG93bicpOiB2b2lkIHtcbiAgICAvLyBQcmV2ZW50IG1vdmluZyBiZXlvbmQgYXJyYXkgYm91bmRzXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmFsbFdpZGdldElubmVyQ29udGVudC5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpcmVjdGlvbiA9PT0gJ3VwJyA/IGluZGV4IC0gMSA6IGluZGV4ICsgMTtcbiAgICAvLyBQcmV2ZW50IG1vdmluZyBiZXlvbmQgYXJyYXkgYm91bmRzXG4gICAgaWYgKG5ld1Bvc2l0aW9uIDwgMCB8fCBuZXdQb3NpdGlvbiA+PSB0aGlzLmFsbFdpZGdldElubmVyQ29udGVudC5sZW5ndGgpIHJldHVybjtcblxuICAgIC8vIE1vdmUgaXRlbVxuICAgIGNvbnN0IGl0ZW1Ub01vdmUgPSB0aGlzLmFsbFdpZGdldElubmVyQ29udGVudFtpbmRleF07XG4gICAgdGhpcy5hbGxXaWRnZXRJbm5lckNvbnRlbnQuc3BsaWNlKGluZGV4LCAxKTsgLy8gUmVtb3ZlIGl0ZW0gZnJvbSBjdXJyZW50IHBvc2l0aW9uXG4gICAgdGhpcy5hbGxXaWRnZXRJbm5lckNvbnRlbnQuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpdGVtVG9Nb3ZlKTsgLy8gSW5zZXJ0IGl0ZW0gaW4gbmV3IHBvc2l0aW9uXG4gIH1cblxuICBtb3ZlSXRlbUZvcldpZGdldChpbmRleDogbnVtYmVyLCBkaXJlY3Rpb246ICd1cCcgfCAnZG93bicpOiB2b2lkIHtcbiAgICAvLyBQcmV2ZW50IG1vdmluZyBiZXlvbmQgYXJyYXkgYm91bmRzXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlyZWN0aW9uID09PSAndXAnID8gaW5kZXggLSAxIDogaW5kZXggKyAxO1xuICAgIC8vIFByZXZlbnQgbW92aW5nIGJleW9uZCBhcnJheSBib3VuZHNcbiAgICBpZiAobmV3UG9zaXRpb24gPCAwIHx8IG5ld1Bvc2l0aW9uID49IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAvLyBNb3ZlIGl0ZW1cbiAgICBjb25zdCBpdGVtVG9Nb3ZlID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1tpbmRleF07XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5zcGxpY2UoaW5kZXgsIDEpOyAvLyBSZW1vdmUgaXRlbSBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaXRlbVRvTW92ZSk7IC8vIEluc2VydCBpdGVtIGluIG5ldyBwb3NpdGlvblxuICB9XG5cbiAgZ2V0RWRpdFZpZXdGcm9tTGF5b3V0KGRhdGEsIGluZGV4KSB7XG5cbiAgICB0aGlzLmlzRWRpdE1haW5MYXlvdXQgPSB0cnVlO1xuICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSBpbmRleDtcbiAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gdHJ1ZTtcbiAgICB0aGlzLmlzRGVmYXVsdFZpZXcgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ2hhcnRCdXR0b25DbGljayA9IGZhbHNlO1xuICAgIHRoaXMuaXNVcGRhdGVXaWRnZXQgPSBmYWxzZTtcbiAgICB0aGlzLndpZGdldE5hbWUgPSBkYXRhLndpZGdldE5hbWU7XG4gICAgdGhpcy53aWRnZXRUaXRsZSA9IGRhdGEud2lkZ2V0VGl0bGU7XG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcklkID0gZGF0YS5maWx0ZXJzLmZpbHRlcklkO1xuICAgIHRoaXMuYWRkZWR3aWRHZXRDb25maWcgPSBkYXRhLndpZGdldFByb3BlcnRpZXM7XG4gIH1cblxuXG4gIGJhY2tUb01haW5WaWV3KCkge1xuICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IHRydWU7XG4gICAgdGhpcy5pc1VwZGF0ZVdpZGdldCA9IGZhbHNlO1xuICAgIHRoaXMuaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ2hhcnRCdXR0b25DbGljayA9IGZhbHNlO1xuICAgIHRoaXMuaXNFZGl0TWFpbkxheW91dCA9IGZhbHNlO1xuICAgIHRoaXMuaXNsYXlvdXRDcmVhdGUgPSBmYWxzZTtcbiAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJJZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZpbHRlclZpZXdzKCkge1xuICAgIGlmICh0aGlzLnZpZXdUb1NlYXJjaC50cmltKCkgIT09ICcnKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkQ29tcG9uZW50Q29uZmlnID0gdGhpcy5jb21wb25lbnRDb25maWdEYXRhU291cmNlLmZpbHRlcigoaXRlbTogYW55KSA9PlxuICAgICAgICBpdGVtLnZpZXdOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy52aWV3VG9TZWFyY2gudG9Mb3dlckNhc2UoKSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRDb21wb25lbnRDb25maWcgPSB0aGlzLmNvbXBvbmVudENvbmZpZ0RhdGFTb3VyY2U7XG4gICAgfVxuICB9XG5cbiAgZWRpdENvbXBvbmVudFZpZXdzKGl0ZW0pIHtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5lZGl0SXRlbUZvclVwZGF0ZSA9IGl0ZW07XG4gICAgaWYgKHRoaXMuaXNVcGRhdGVXaWRnZXQgJiYgIXRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlld0lkID0gaXRlbS52aWV3SWQ7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0NyZWF0ZU5ld1ZpZXdXaXRoRGVmYXVsdFZpZXcgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgfSwgNDAwKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbmF2aWdhdGlvbjogTmF2aWdhdGlvbkV4dHJhcyA9IHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAndmlld0lkJzogaXRlbS52aWV3SWQsXG4gICAgICAgICAgJ3BhZ2VJZCc6IHRoaXMucGFnZUlkXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2FwcHMvY29udHJvbFBhbmVsL2FwcGxpY2F0aW9uQ29udGVudC9hcHBsaWNhdGlvblZpZXdzJ10sIG5hdmlnYXRpb24pO1xuICAgIH1cbiAgfVxuICBlZGl0Q29tcG9uZW50RGF0YXNldHMoaXRlbSkge1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXRJdGVtRm9yVXBkYXRlID0gaXRlbTtcbiAgICBpZiAodGhpcy5pc1VwZGF0ZVdpZGdldCAmJiAhdGhpcy5pc0NoYXJ0QnV0dG9uQ2xpY2spIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhc2V0SWQgPSBpdGVtLmRhdGFzZXRJZDtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzQ3JlYXRlRGF0YXNldFdpdGhEYXRhc2V0SWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgfSwgNDAwKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbmF2aWdhdGlvbjogTmF2aWdhdGlvbkV4dHJhcyA9IHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAndmlld0lkJzogaXRlbS52aWV3SWQsXG4gICAgICAgICAgJ3BhZ2VJZCc6IHRoaXMucGFnZUlkXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2FwcHMvY29udHJvbFBhbmVsL2FwcGxpY2F0aW9uQ29udGVudC9hcHBsaWNhdGlvblZpZXdzJ10sIG5hdmlnYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIGdldEFsbFBhZ2UoKSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydhcHBzL2NvbnRyb2xQYW5lbC9hcHBsaWNhdGlvbkNvbnRlbnQvYXBwbGljYXRpb25EYXNoYm9hcmQnXSk7XG4gIH1cblxuICB0cmFuc2Zvcm1Db2x1bW5zRm9yQ29sdW1ucyhpbnB1dENvbHVtbnMpIHtcbiAgICBjb25zdCBjb2x1bW5zID0gW107XG5cbiAgICBpbnB1dENvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgY29sdW1ucy5wdXNoKHtcbiAgICAgICAgZGF0YUZpZWxkOiBjb2wuZGF0YUZpZWxkLFxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICBjYXB0aW9uOiBjb2wuY2FwdGlvbixcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cblxuXG4gIGdldENyZWF0ZURhdGFTZXRQYWdlKCkge1xuICAgIHRoaXMuaXNDcmVhdGVEYXRhc2V0ID0gdHJ1ZTtcbiAgfVxuXG4gIGdldENyZWF0ZVZpZXdQYWdlKCkge1xuXG4gICAgdGhpcy5zZWxlY3RlZFZpZXdJZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmlzQ3JlYXRlTmV3VmlldyA9IHRydWU7XG4gICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgIH0sIDQwMCk7XG4gIH1cblxuXG4gIGdldEVtaXROZXdDaGFydENvbmdpZyhldmVudCkge1xuICAgIGRlbGV0ZSBldmVudC5rcGlDb25maWcuZGF0YVNvdXJjZTtcbiAgICB0aGlzLmVkaXRJdGVtRm9yVXBkYXRlWydrcGlDb25maWcnXSA9IGV2ZW50LmtwaUNvbmZpZztcblxuICAgIGNvbnNvbGUubG9nKHRoaXMuZWRpdEl0ZW1Gb3JVcGRhdGUpO1xuICAgIHRoaXMuc2VydmljZS51cGRhdGVBcHBWaWV3Q29uZmlnKHRoaXMuZWRpdEl0ZW1Gb3JVcGRhdGUpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNFZGl0T3B0aW9uQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcygnVmlldyBVcGRhdGUgU3VjY2Vzc2Z1bGx5JylcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdWaWV3IENyZWF0aW9uJylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cblxuICBnZXRWaWV3UGFnZSgpIHtcbiAgICBsZXQgbmF2aWdhdGlvbkV4dHJhczogTmF2aWdhdGlvbkV4dHJhcyA9IHtcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgIFwicGFnZUlkXCI6IHRoaXMucGFnZUlkXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLnBhZ2VVcmxdLCBuYXZpZ2F0aW9uRXh0cmFzKVxuXG4gIH1cbiAgLy8gbm9kZXByb3BlcnRpY2UgZmlsdGVyIFxuXG4gIGdldE5vZGVQcm9wZXJ0aWNlRmlsdGVyT3B0aW9uKCkge1xuICAgIGxldCBvYmogPSB7XG4gICAgICBpbnB1dF90eXBlOiBcInRleHRcIixcbiAgICAgIHNlcnZlcl9jb2x1bW46IFwiXCIsXG4gICAgICBsb2NhbF9jb2x1bW46IFwiXCIsXG4gICAgICBzZWxlY3RfYm94X29wdGlvbjogXCJcIixcbiAgICB9XG4gICAgdGhpcy5ub2RlUHJvcGVydGljZUZpbHRlcnMucHVzaChvYmopXG4gIH1cblxuICBkZWxldGVOb2RlRmlsdGVyKGluZGV4KSB7XG4gICAgdGhpcy5ub2RlUHJvcGVydGljZUZpbHRlcnMuc3BsaWNlKGluZGV4LCAxKVxuICB9XG5cbiAgc2V0RGF0YVNldHNMaW1pdChkYXRhc2V0KSB7XG4gICAgbGV0IGxpbWl0ID0geyBcImxpbWl0XCI6IFwiMTBcIiB9XG4gICAgZGF0YXNldC5jb25maWcucXVlcnlDb25maWcucmVxRmllbGRzLnB1c2gobGltaXQpO1xuICAgIHJldHVybiBkYXRhc2V0O1xuICB9XG5cbiAgc2V0RGF0YVNldHNMaW1pdEZvclNxbChkYXRhc2V0KSB7XG4gICAgY29uc3QgbGltaXRJbmRleCA9IGRhdGFzZXQuY29uZmlnLnF1ZXJ5Q29uZmlnLm1hcGVkRmlsdGVycy5maW5kSW5kZXgoZmlsdGVyID0+IGZpbHRlci5zZXJ2ZXJDb2x1bW4gPT09ICdsaW1pdCcpO1xuXG4gICAgaWYgKGxpbWl0SW5kZXggPT09IC0xKSB7XG4gICAgICBkYXRhc2V0LmNvbmZpZy5xdWVyeUNvbmZpZy5tYXBlZEZpbHRlcnMucHVzaCh7XG4gICAgICAgIGxvY2FsQ29sdW1uOiBcImxpbWl0XCIsXG4gICAgICAgIHNlcnZlckNvbHVtbjogXCJsaW1pdFwiLFxuICAgICAgICBvcGVyYXRvck5hbWU6IFwiZXFcIixcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcIjEwMFwiLFxuICAgICAgICBkYXRhVHlwZTogXCJzdHJpbmdcIlxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGFzZXQuY29uZmlnLnF1ZXJ5Q29uZmlnLm1hcGVkRmlsdGVyc1tsaW1pdEluZGV4XS5kZWZhdWx0VmFsdWUgPSBcIjEwXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGFzZXQ7XG4gIH1cblxuICBnZXRWaWV3UG9wdXBIaWRlKGUpIHtcbiAgICB0aGlzLmdldEFsbFZpZXdzSXRlbXMoKTtcbiAgfVxuXG4gIGdldERhdGFzZXRQb3B1cEhpZGUoZSkge1xuXG4gIH1cblxuICBzdWJtaXRGaWx0ZXIoKSB7XG5cbiAgfVxuXG4gIGdldFdpZGdldEZpbHRlckZvclRlbXBsYXRlKHZhbHVlKSB7XG4gICAgdGhpcy5nZXREYXRhU2V0KCk7XG4gIH1cblxuICBnZXREZWxldGVWaWV3RnJvbUxheW91dChpdGVtLCBpKSB7XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5zcGxpY2UoaSwgMSk7XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKHdpZGdldCA9PiB7XG4gICAgICB3aWRnZXQuY29tcENvbmZpZy52aWV3Q29uZmlnID0gd2lkZ2V0LmNvbXBDb25maWcudmlld0NvbmZpZy5tYXAoY29uZmlnID0+IGNvbmZpZy52aWV3SWQpO1xuICAgICAgd2lkZ2V0LmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMgPSBbXTtcbiAgICAgIGlmICh3aWRnZXQud2lkZ2V0Tm9kZSAmJiB3aWRnZXQud2lkZ2V0Tm9kZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHdpZGdldC53aWRnZXROb2RlLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgbm9kZS5jb21wQ29uZmlnLnZpZXdDb25maWcgPSBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZy5tYXAoY29uZmlnID0+IGNvbmZpZy52aWV3SWQpO1xuICAgICAgICAgIG5vZGUuY29tcENvbmZpZy5keW5hbWljQ29tcG9uZW50UmVmcyA9IFtdO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KVxuICAgIGNvbnN0IHdpZGdldERhdGEgPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZztcbiAgICB3aWRnZXREYXRhWyd3aWRnZXRzJ10gPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLm1hcChpdGVtID0+IGl0ZW0ud2lkZ2V0SWQpO1xuICAgIHdpZGdldERhdGFbJ2ZpbHRlcklkJ10gPSAod2lkZ2V0RGF0YS5maWx0ZXJzKSA/IHdpZGdldERhdGEuZmlsdGVycy5maWx0ZXJJZCA6IG51bGw7XG4gICAgZGVsZXRlIHdpZGdldERhdGFbJ2ZpbHRlcnMnXTtcblxuICAgIHRoaXMuc2VydmljZS5lZGl0QXBwUGFnZUNvbmZpZyh3aWRnZXREYXRhKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKFwiTGF5b3V0IERlbGV0ZWQgU3VjY2Vzc2Z1bGx5XCIpXG4gICAgICAgIHRoaXMuZ2V0QXBwUGFnZURldGFpbENvbmZpZ0J5UGFnZUlkKClcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdXaWRnZXQgQ3JlYXRpb24nKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG4gIC8vIGFkdmFuY2UgTGF5b3V0IFxuICBpc0FkdmFuY2VMYXlvdXQ6IGJvb2xlYW47XG4gIGlzUHJvY2VlZDogYm9vbGVhbjtcbiAgc2VsZWN0ZWRWaWV3c0lkczogYW55ID0gW107XG4gIGFkdmFuY2VMYXlvdXRDb250YWluZXI6IGFueSA9IFtdO1xuICBnZXRQcm9jZXNzRm9yQ29uZmlnKCkge1xuICAgIHRoaXMuYWR2YW5jZUxheW91dENvbnRhaW5lciA9IFtdO1xuICAgIGNvbnN0IGZpbHRlcmVkQ29sdW1ucyA9IHRoaXMuY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZS5maWx0ZXIoY29sdW1uID0+IHRoaXMuc2VsZWN0ZWRWaWV3c0lkcy5pbmNsdWRlcyhjb2x1bW4udmlld0lkKSk7XG4gICAgY29uc3QgY29sdW1uRGVmTGlzdCA9IFtdO1xuXG4gICAgZmlsdGVyZWRDb2x1bW5zLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAvLyBjb25zdCBleGlzdGluZ0NvbHVtbiA9IGZhbHNlO1xuICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgXCJpZFwiOiB0aGlzLmNvbW1vblNlcnZpY2UucHJpbWVyeVJlbmRvbWVJZCg1KSxcbiAgICAgICAgXCJub2RlVGl0bGVcIjogXCJcIixcbiAgICAgICAgXCJjb21wQ29uZmlnXCI6IHtcbiAgICAgICAgICBcImR5bmFtaWNDb21wb25lbnRSZWZzXCI6IFtdLFxuICAgICAgICAgIFwidmlld0NvbmZpZ1wiOiBbZWxlbWVudF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWx0ZXJJZFwiOiBudWxsLFxuICAgICAgICBcIm5vZGVQcm9wZXJ0aWVzXCI6IHtcbiAgICAgICAgICBcImRpc3BsYXlcIjogdHJ1ZSxcbiAgICAgICAgICBcIndpZGdldFRpdGxlXCI6IFwiXCIsXG4gICAgICAgICAgXCJ3aWR0aFwiOiBcIlwiLFxuICAgICAgICAgIFwiaGVpZ2h0XCI6IFwiXCIsXG4gICAgICAgICAgXCJpc1dpZGdldEZpbHRlclwiOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmFkdmFuY2VMYXlvdXRDb250YWluZXIucHVzaChvYmopO1xuXG4gICAgfSk7XG5cbiAgICB0aGlzLmlzUHJvY2VlZCA9IHRydWU7XG4gIH1cblxuICBnZXRTZWxlY3RlZENvbHVtblNvdXJjZShldmVudCkge1xuICAgIGlmIChldmVudC5ldmVudCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZXdzSWRzID0gZXZlbnQudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgc3VibWl0QWR2YW5jZVZpZXcoKSB7XG4gICAgaWYgKHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZSAmJiB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUgPSBbLi4udGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlLCAuLi50aGlzLmFkdmFuY2VMYXlvdXRDb250YWluZXJdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUgPSB0aGlzLmFkdmFuY2VMYXlvdXRDb250YWluZXI7XG4gICAgfVxuICAgIHRoaXMuaXNBZHZhbmNlTGF5b3V0ID0gZmFsc2U7XG4gICAgdGhpcy5hZHZhbmNlTGF5b3V0Q29udGFpbmVyID0gW107XG4gICAgdGhpcy5pc1Byb2NlZWQgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZVdpZGdldCgpO1xuICB9XG5cblxuXG4gIGRlbGV0ZVZpZXcoaSkge1xuXG4gIH1cbn1cbiIsIjxhcHAtbG9hZGluZyAqbmdJZj1cImxvYWRpbmdNb2RhbFwiPjwvYXBwLWxvYWRpbmc+XG5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGgtWzkwdmhdIHctZnVsbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3LTMvNCBib3JkZXItciBoLWZ1bGwgZmxleCBmbGV4LWNvbCBweC0yXCI+XG4gICAgICAgIDwhLS0gU2Nyb2xsYWJsZSBjb250ZW50IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93IG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIG15LTNcIiAjZHluYW1pY0NvbnRhaW5lcj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBGaXhlZCBib3R0b20gc2VjdGlvbiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIGgtMTYgbS0yIGJvcmRlciBzaHJpbmstMFwiPlxuICAgICAgICAgICAgPGxpYi1jb21tb24taGVhZGVyIFtwYWdlVGl0bGVdPVwiJydcIj48L2xpYi1jb21tb24taGVhZGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9tZH19IG0tMlwiIChjbGljayk9XCJhZGRXaWRnZXQoKVwiPkFkZCBMYXlvdXQ8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuT3RoZXJzUHVycGxlfX0gbS0yIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImdldFZpZXdQYWdlKClcIj5WaWV3IFBhZ2U8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInctMS80IHAtMiBoLWZ1bGxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRGFzaEJvYXJkQ29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5EYXJrQmxhY2t9fSBtLTIgdy1maXQgdGV4dC1jZW50ZXIgY3Vyc2FyLXBvaW50ZXJcIiAoY2xpY2spPVwiYmFja1RvTWFpblZpZXcoKVwiPlxuICAgICAgICAgICAgICAgIEJhY2tcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwYWdlX2NvbmZpZy5hcGlfY29uZmlnOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIGJvcmRlci1iXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIHB5LTIgZm9udC1ib2xkICB0ZXh0LXdoaXRlIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS53aWRHZXRDb25maWcud2lkZ2V0VGl0bGV9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggc3BhY2UteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxidXR0b24gKGNsaWNrKT1cImVkaXRTZWxlY3RlZFdpZGdldChpdGVtLCBpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTggaC04IGJnLXNreS02MDAgaG92ZXI6YmctYmx1ZS04MDAgdGV4dC13aGl0ZSByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWVkaXRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTggaC04IGJnLXJlZC02MDAgaG92ZXI6YmctcmVkLTgwMCB0ZXh0LXdoaXRlIHJvdW5kZWQtZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxoNiBjbGFzcz1cIm1iLTIgZm9udC1ib2xkIHRleHQtbGcgdHJhY2tpbmctdGlnaHQgdGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGUgYm9yZGVyLWIgcGItM1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzbGF5b3V0Q3JlYXRlXCI+V2lkZ2V0IFNldHRpbmdzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNsYXlvdXRDcmVhdGVcIj5MYXlvdXQgU2V0dGluZ3M8L3NwYW4+XG4gICAgICAgICAgICA8L2g2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbXktNFwiPlxuICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggY2xhc3M9XCJtbC1hdXRvXCIgWyhuZ01vZGVsKV09XCJhZGRlZHdpZEdldENvbmZpZy5kaXNwbGF5XCIgdGV4dD1cIkRpc3BsYXlcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItMiBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbWQgbXktYXV0byBweC0yXCI+V2lkdGg8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggY2xhc3M9XCJ3LTEvMlwiIFtpdGVtc109XCJ3aWRnZXRfd2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImFkZGVkd2lkR2V0Q29uZmlnLndpZHRoXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBtYi0yIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tZCBteS1hdXRvIHB4LTJcIj5IZWlnaHQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IGNsYXNzPVwidy0xLzJcIiBbKG5nTW9kZWwpXT1cImFkZGVkd2lkR2V0Q29uZmlnLmhlaWdodFwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItMiBqdXN0aWZ5LWJldHdlZW5cIiAqbmdJZj1cIiFpc2xheW91dENyZWF0ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG15LWF1dG8gcHgtMlwiPldpZGdldCBUaXRsZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+PGR4LXRleHQtYm94IGNsYXNzPVwidy0xLzJcIiBbKG5nTW9kZWwpXT1cIndpZGdldFRpdGxlXCI+PC9keC10ZXh0LWJveD48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItMiBqdXN0aWZ5LWJldHdlZW5cIiAqbmdJZj1cIiFpc2xheW91dENyZWF0ZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tZCBteS1hdXRvIHB4LTJcIj5XaWRnZXQgTmFtZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggY2xhc3M9XCJ3LTEvMlwiIFsobmdNb2RlbCldPVwid2lkZ2V0TmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBtYi01IGp1c3RpZnktYmV0d2VlblwiICpuZ0lmPVwiaXNsYXlvdXRDcmVhdGVcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gbXktYXV0byBweC0yXCI+TGF5b3V0IFRpdGxlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBjbGFzcz1cInctMS8yXCIgWyhuZ01vZGVsKV09XCJhZGRlZHdpZEdldENvbmZpZy53aWRnZXRUaXRsZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItMiBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbWQgbXktYXV0byBweC0yXCI+RmlsdGVyPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IGNsYXNzPVwidy0xLzJcIiBbaXRlbXNdPVwiZmlsdGVyRGF0YVNvdXJjZVwiIGRpc3BsYXlFeHByPVwiZmlsdGVyTmFtZVwiIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZUV4cHI9XCJmaWx0ZXJJZFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGaWx0ZXJJZFwiXG4gICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJnZXRGaWx0ZXJWYWx1ZUJ5SWQoJGV2ZW50KVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1VwZGF0ZVdpZGdldFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC02XCIgKm5nSWY9XCIhaXNsYXlvdXRDcmVhdGUgJiYgaXNFZGl0TWFpbkxheW91dFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1tuZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZTtsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMiBmbGV4IGZsZXgtcm93IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgYm9yZGVyLWIgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgcHktMiBmb250LWJvbGQgIHRleHQtd2hpdGUgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0ubm9kZVByb3BlcnRpZXMud2lkZ2V0VGl0bGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHNwYWNlLXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gMFwiIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9zbX19IGN1cnNvci1wb2ludGVyIG14LTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yUGFnZVZpZXcoaSwgJ3VwJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaSAhPT0gIGRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW25ld1dpZGdldEluZGV4XS53aWRnZXROb2RlLmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JQYWdlVmlldyhpLCAnZG93bicpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LWRvd25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctOCBoLTggYmctcmVkLTYwMCBob3ZlcjpiZy1yZWQtODAwIHRleHQtd2hpdGUgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1VwZGF0ZVdpZGdldFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHB5LTEgZm9udC1leHRyYWJvbGQgYm9yZGVyLWIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSBweC0yXCI+IEFwcGxpY2F0aW9uIFZpZXdzXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvcmRlci14IGJvcmRlci1iIHAtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGFsbFdpZGdldElubmVyQ29udGVudDsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwICB3LWZ1bGwgZmxleCBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgZm9udC1ib2xkICBweS0yIGN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS52aWV3TmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBzcGFjZS14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IDBcIiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvckNvbHVtbnMoaSwgJ3VwJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSBhbGxXaWRnZXRJbm5lckNvbnRlbnQubGVuZ3RoIC0gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvckNvbHVtbnMoaSwgJ2Rvd24nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy1kb3duXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJvdW5kZWQtZnVsbCBwLTIgdGV4dC13aGl0ZSBiZy1ibHVlLTUwMCBob3ZlcjpiZy1ibHVlLTcwMCBtYi0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0Q29tcG9uZW50Vmlld3MoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZXllXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJvdW5kZWQtZnVsbCBwLTIgdGV4dC13aGl0ZSBiZy1ibHVlLTUwMCBob3ZlcjpiZy1ibHVlLTcwMCBtYi0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0Q29tcG9uZW50RGF0YXNldHMoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZGF0YWJhc2VcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicm91bmRlZC1mdWxsIHAtMiB0ZXh0LXdoaXRlIGJnLXJlZC01MDAgaG92ZXI6YmctcmVkLTcwMCBtYi0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXREZWxldGVWaWV3RnJvbUNvbmZpZyhpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNVcGRhdGVXaWRnZXRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBweS0xIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBBZGQgRmlsdGVyIEZvciBWaWV3XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyLXggYm9yZGVyLWIgcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHB5LTMgYm9yZGVyLWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggWyhuZ01vZGVsKV09XCJhZGRlZHdpZEdldENvbmZpZy5pc1dpZGdldEZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIlBvcHVwIENvbHVtbnMgRmlsdGVyIEVuYWJsZVwiPjwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbXktMiBib3JkZXItYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBub2RlUHJvcGVydGljZUZpbHRlcnM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgYm9yZGVyLWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kXCI+SW5wdXQgVHlwZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIlsndGV4dCddXCIgWyhuZ01vZGVsKV09XCJpdGVtLmlucHV0X3R5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwidGV4dFwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xLTEgdy0yLzNcIiAqbmdJZj1cIml0ZW0uaW5wdXRfdHlwZSA9PSAndGV4dCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kXCI+U2VydmVyIENvbHVtbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5zZXJ2ZXJfY29sdW1uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xLTEgdy0xLzJcIiAqbmdJZj1cIml0ZW0uaW5wdXRfdHlwZSA9PSAndGV4dCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kXCI+TG9jYWwgQ29sdW1uPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmxvY2FsX2NvbHVtblwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMS0xIHctMS8zXCIgKm5nSWY9XCJpdGVtLmlucHV0X3R5cGUgPT0gJ3NlbGVjdCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kXCI+Q29sdW1ucyBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLnNlbGVjdF9ib3hfb3B0aW9uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xLTEgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gdy0yNCBtdC02IHRleHQtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZU5vZGVGaWx0ZXIoaSlcIj5EZWxldGUgRmlsdGVyPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfc219fSB3LWF1dG8gdGV4dC1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdldE5vZGVQcm9wZXJ0aWNlRmlsdGVyT3B0aW9uKClcIj5BZGRcbiAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlcjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIGl0ZW1zLWNlbnRlciBoLTE2IG0tMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuRGFya0JsYWNrfX0gbS0yIHctZml0IHRleHQtY2VudGVyIGN1cnNhci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJhY2tUb01haW5WaWV3KClcIj5CYWNrXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1VwZGF0ZVdpZGdldFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNsYXlvdXRDcmVhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3N1Y2Nlc3NfbWR9fSBtLTIgdy1maXQgdGV4dC1jZW50ZXIgY3Vyc2FyLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZExheW91dFRPdmlldygpXCI+QWRkIFZpZXdcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNsYXlvdXRDcmVhdGUgJiYgIWlzRWRpdE1haW5MYXlvdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfbWR9fSBtLTIgdy1maXQgdGV4dC1jZW50ZXIgY3Vyc2FyLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFdpZGdldFRPdmlldygpXCI+QWRkIExheW91dFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc2xheW91dENyZWF0ZSAmJiBpc0VkaXRNYWluTGF5b3V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X21kfX0gbS0yIHctZml0IHRleHQtY2VudGVyIGN1cnNhci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVMYXlvdXRXaWRnZXRUT3ZpZXcoKVwiPlVwZGF0ZSBMYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3dhcm5pbmdfbWR9fSBtLTIgdy1maXQgdGV4dC1jZW50ZXIgY3Vyc2FyLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlVG9WaWV3KClcIiAqbmdJZj1cImlzVXBkYXRlV2lkZ2V0XCI+VXBkYXRlIFZpZXdcbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgPCEtLSA8cHJlPjxjb2RlPnt7ZGFzaEJvYXJkV2lkZ2V0Q29uZmlnIHwganNvbn19PC9jb2RlPjwvcHJlPiAtLT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0NoYXJ0QnV0dG9uQ2xpY2tcIj5cbiAgICAgICAgICAgIDxoNlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWItMiBmb250LWJvbGQgdGV4dC1tZCB0cmFja2luZy10aWdodCB0ZXh0LWdyYXktOTAwIGRhcms6dGV4dC13aGl0ZSBib3JkZXItYiBwYi0zIGZsZXggIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYmFyLWNoYXJ0LW8gbXItMlwiPjwvaT4gU2VsZWN0IFZpZXdcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bkRhcmtCbGFja319IG0tMiB3LWZpdCB0ZXh0LWNlbnRlciBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJiYWNrVG9NYWluVmlldygpXCI+QmFja1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIgaC1bODB2aF0gb3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIG15LTIgXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwidmlld1RvU2VhcmNoXCIgKGtleXVwKT1cImZpbHRlclZpZXdzKClcIiAoa2V5ZG93bik9XCJmaWx0ZXJWaWV3cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmctZ3JheS04MDAgYm9yZGVyIGJvcmRlci1ncmF5LTcwMCB0ZXh0LWdyYXktMjAwIHRleHQtc20gZm9jdXM6cmluZy1ncmF5LTQwMCBmb2N1czpib3JkZXItZ3JheS01MDAgYmxvY2sgdy1mdWxsIHAtNCBoLTggcm91bmRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBWaWV3XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhYnNvbHV0ZSBpbnNldC15LTAgcmlnaHQtMCBmbGV4IGl0ZW1zLWNlbnRlciBwci02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJyb3RhdGUtOTAgY3Vyc29yLXBvaW50ZXJcIiBbc3ZnSWNvbl09XCInaGVyb2ljb25zX291dGxpbmU6c2VhcmNoJ1wiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRDb21wb25lbnRDb25maWdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGdyb3VwIG15LTMgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEl0ZW0gVmlldyBOYW1lIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgZm9udC1ib2xkIGJvcmRlci1iIHB5LTIgY3Vyc2FyLXBvaW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0udmlld05hbWV9fTwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhvdmVyIEJ1dHRvbnMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB0b3AtMCAgcmlnaHQtMCBmbGV4IHNwYWNlLXgtMiBvcGFjaXR5LTAgZ3JvdXAtaG92ZXI6b3BhY2l0eS0xMDAgdHJhbnNpdGlvbi1vcGFjaXR5IGR1cmF0aW9uLTMwMCBwYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJvdW5kZWQtZnVsbCBwLTIgdGV4dC13aGl0ZSBiZy1ibHVlLTUwMCBob3ZlcjpiZy1ibHVlLTcwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBlbmNpbC1zcXVhcmUtb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdENvbXBvbmVudFZpZXdzKGl0ZW0pXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyb3VuZGVkLWZ1bGwgcC0yIHRleHQtd2hpdGUgYmctZ3JlZW4tNTAwIGhvdmVyOmJnLWdyZWVuLTcwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXRDb21wb25lbnRDb25maWcoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0RlZmF1bHRWaWV3XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwIG15LTMgdy1mdWxsIGZsZXgganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBmb250LWJvbGQgIHB5LTIgY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS53aWRnZXRUaXRsZX19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHNwYWNlLXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IDBcIiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JXaWRnZXQoaSwgJ3VwJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LXVwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSBkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5sZW5ndGggLSAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JXaWRnZXQoaSwgJ2Rvd24nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctZG93blwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJvdW5kZWQtZnVsbCBwLTIgdGV4dC13aGl0ZSBiZy1ibHVlLTUwMCBob3ZlcjpiZy1ibHVlLTcwMCBtYi0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0RWRpdFZpZXdGcm9tTGF5b3V0KGl0ZW0saSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBlbmNpbC1zcXVhcmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJvdW5kZWQtZnVsbCBwLTIgdGV4dC13aGl0ZSBiZy1yZWQtNTAwIGhvdmVyOmJnLXJlZC03MDAgbWItMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdldERlbGV0ZVZpZXdGcm9tTGF5b3V0KGl0ZW0saSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgPC9kaXY+XG48L2Rpdj5cbjwhLS0gPC9kaXY+IC0tPlxuXG48ZHgtcG9wdXAgWyh2aXNpYmxlKV09XCJpc0VkaXRPcHRpb25DbGlja1wiIFtjbG9zZU9uT3V0c2lkZUNsaWNrXT1cImZhbHNlXCIgW2RyYWdFbmFibGVkXT1cImZhbHNlXCIgW3dpZHRoXT1cIjEyMDBcIlxuICAgIFtoZWlnaHRdPVwiJ2F1dG8nXCIgW3Nob3dUaXRsZV09XCJ0cnVlXCIgY2xhc3M9XCJwb3B1cFwiIHRpdGxlPVwie3tlZGl0Vmlld2RhdGFTb3VyY2VNb2RhbC52aWV3TmFtZX19XCI+XG4gICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjb250ZW50J1wiPlxuXG4gICAgICAgIDxhcHAtZGFzaC1jaGFydCBbZGF0YXNldG1vZGFsXT1cImVkaXRWaWV3ZGF0YVNvdXJjZU1vZGFsXCIgKGdldENoYXJ0Q29uZmlnT3V0UHV0KT1cImdldEVtaXROZXdDaGFydENvbmdpZygkZXZlbnQpXCJcbiAgICAgICAgICAgICpuZ0lmPVwiZWRpdFZpZXdkYXRhU291cmNlTW9kYWwudmlld1R5cGUgPT0gJ2NoYXJ0J1wiPjwvYXBwLWRhc2gtY2hhcnQ+XG4gICAgICAgIDxhcHAtZGFzaC10YWJsZSBbZGF0YXNldG1vZGFsXT1cImVkaXRWaWV3ZGF0YVNvdXJjZU1vZGFsXCIgKGdldFRhYmxlQ29uZmlnT3V0UHV0KT1cImdldEVtaXROZXdDaGFydENvbmdpZygkZXZlbnQpXCJcbiAgICAgICAgICAgICpuZ0lmPVwiZWRpdFZpZXdkYXRhU291cmNlTW9kYWwudmlld1R5cGUgPT0gJ3RhYmxlJ1wiPjwvYXBwLWRhc2gtdGFibGU+XG4gICAgICAgIDwhLS0gPGFwcC1kYXNoLW90aGVyIFtkYXRhc2V0bW9kYWxdPVwiZWRpdFZpZXdkYXRhU291cmNlTW9kYWxcIiAqbmdJZj1cImVkaXRWaWV3ZGF0YVNvdXJjZU1vZGFsLnZpZXdUeXBlID09ICdvdGhlcnMnXCJcbiAgICAgICAgICAgIChjcmVhdGVPdGhlckNvbXBvbmVudFZpZXcpPVwiZ2V0RW1pdE5ld0NoYXJ0Q29uZ2lnKCRldmVudClcIj48L2FwcC1kYXNoLW90aGVyPiAtLT5cbiAgICA8L2Rpdj5cbjwvZHgtcG9wdXA+XG5cblxuPGR4LXBvcHVwIFsodmlzaWJsZSldPVwiaXNDcmVhdGVEYXRhc2V0XCIgW2Nsb3NlT25PdXRzaWRlQ2xpY2tdPVwiZmFsc2VcIiBbZHJhZ0VuYWJsZWRdPVwiZmFsc2VcIiBbd2lkdGhdPVwiMTIwMFwiXG4gICAgW2hlaWdodF09XCI2MDBcIiBbc2hvd1RpdGxlXT1cInRydWVcIiBjbGFzcz1cInBvcHVwXCIgdGl0bGU9XCJEYXRhc2V0IEVkaXRvclwiPlxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIj5cbiAgICAgICAgPGR4LXNjcm9sbC12aWV3IGNsYXNzPVwiaC1mdWxsXCIgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzEwMCUnXCI+XG4gICAgICAgICAgICA8YXBwLWNyZWF0ZS1kYXRhc2V0IFtpc0hlYWRlcl09XCJmYWxzZVwiPjwvYXBwLWNyZWF0ZS1kYXRhc2V0PlxuICAgICAgICA8L2R4LXNjcm9sbC12aWV3PlxuICAgIDwvZGl2PlxuPC9keC1wb3B1cD5cbjxkeC1wb3B1cCBbKHZpc2libGUpXT1cImlzQ3JlYXRlRGF0YXNldFdpdGhEYXRhc2V0SWRcIiBbY2xvc2VPbk91dHNpZGVDbGlja109XCJmYWxzZVwiIFtkcmFnRW5hYmxlZF09XCJmYWxzZVwiIFt3aWR0aF09XCIxMjAwXCJcbiAgICBbaGVpZ2h0XT1cIjYwMFwiIFtzaG93VGl0bGVdPVwidHJ1ZVwiIGNsYXNzPVwicG9wdXBcIiB0aXRsZT1cIkRhdGFzZXQgRWRpdG9yXCIgKG9uSGlkZGVuKT1cImdldERhdGFzZXRQb3B1cEhpZGUoJGV2ZW50KVwiPlxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIj5cbiAgICAgICAgPGR4LXNjcm9sbC12aWV3IGNsYXNzPVwiaC1mdWxsXCIgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzEwMCUnXCI+XG4gICAgICAgICAgICA8YXBwLWNyZWF0ZS1kYXRhc2V0IFtzZWxlY3RlZERhdGFzZXRJZF09XCJzZWxlY3RlZERhdGFzZXRJZFwiIFtpc0hlYWRlcl09XCJmYWxzZVwiPjwvYXBwLWNyZWF0ZS1kYXRhc2V0PlxuICAgICAgICA8L2R4LXNjcm9sbC12aWV3PlxuICAgIDwvZGl2PlxuPC9keC1wb3B1cD5cblxuPGR4LXBvcHVwIFsodmlzaWJsZSldPVwiaXNDcmVhdGVOZXdWaWV3V2l0aERlZmF1bHRWaWV3XCIgW2Nsb3NlT25PdXRzaWRlQ2xpY2tdPVwiZmFsc2VcIiBbZHJhZ0VuYWJsZWRdPVwiZmFsc2VcIlxuICAgIFt3aWR0aF09XCIxMjAwXCIgW2hlaWdodF09XCI2MDBcIiBbc2hvd1RpdGxlXT1cInRydWVcIiBjbGFzcz1cInBvcHVwXCIgdGl0bGU9XCJWaWV3cyBFZGl0b3JcIlxuICAgIChvbkhpZGRlbik9XCJnZXRWaWV3UG9wdXBIaWRlKCRldmVudClcIj5cbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCI+XG4gICAgICAgIDxkeC1zY3JvbGwtdmlldyBjbGFzcz1cImgtZnVsbFwiIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIicxMDAlJ1wiPlxuICAgICAgICAgICAgPGFwcC1jcmVhdGUtY29tcC12aWV3IFtzZWxlY3RlZFZpZXdJZF09XCJzZWxlY3RlZFZpZXdJZFwiIFtpc0hlYWRlcl09XCJmYWxzZVwiPjwvYXBwLWNyZWF0ZS1jb21wLXZpZXc+XG4gICAgICAgIDwvZHgtc2Nyb2xsLXZpZXc+XG4gICAgPC9kaXY+XG48L2R4LXBvcHVwPlxuPGR4LXBvcHVwIFsodmlzaWJsZSldPVwiaXNDcmVhdGVOZXdWaWV3XCIgW2Nsb3NlT25PdXRzaWRlQ2xpY2tdPVwiZmFsc2VcIiBbZHJhZ0VuYWJsZWRdPVwiZmFsc2VcIiBbd2lkdGhdPVwiMTIwMFwiXG4gICAgW2hlaWdodF09XCI2MDBcIiBbc2hvd1RpdGxlXT1cInRydWVcIiBjbGFzcz1cInBvcHVwXCIgdGl0bGU9XCJWaWV3cyBFZGl0b3JcIj5cbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCI+XG4gICAgICAgIDxkeC1zY3JvbGwtdmlldyBjbGFzcz1cImgtZnVsbFwiIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIicxMDAlJ1wiPlxuICAgICAgICAgICAgPGFwcC1jcmVhdGUtY29tcC12aWV3IFtpc0hlYWRlcl09XCJmYWxzZVwiPjwvYXBwLWNyZWF0ZS1jb21wLXZpZXc+XG4gICAgICAgIDwvZHgtc2Nyb2xsLXZpZXc+XG4gICAgPC9kaXY+XG48L2R4LXBvcHVwPlxuXG5cbjxkeC1wb3B1cCBbKHZpc2libGUpXT1cImlzV2lkZ2V0RmlsdGVyc1wiIFtjbG9zZU9uT3V0c2lkZUNsaWNrXT1cImZhbHNlXCIgW2RyYWdFbmFibGVkXT1cImZhbHNlXCIgW3dpZHRoXT1cIjgwMFwiIFtoZWlnaHRdPVwiNDAwXCJcbiAgICBbc2hvd1RpdGxlXT1cInRydWVcIiBjbGFzcz1cInBvcHVwXCIgdGl0bGU9XCJEYXRhc2V0IEZpbHRlclwiPlxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTJcIj5cbiAgICAgICAgICAgIDxkeC1zY3JvbGwtdmlldyBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInODUlJ1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygbm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmNvbHVtbk5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIlsnZ2V0JywnbGV0J11cIiBbKG5nTW9kZWwpXT1cIml0ZW0ub3BlcmF0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk9wZXJhdG9yXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS52YWx1ZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwvZHgtc2Nyb2xsLXZpZXc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBteC0xIGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3N1Y2Nlc3NfbWR9fSBjdXJzb3ItcG9pbnRlciBtdC0yXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN1Ym1pdEZpbHRlcigpXCI+U3VibWl0PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuPC9keC1wb3B1cD5cbjxkeC1wb3B1cCBbKHZpc2libGUpXT1cImlzQWR2YW5jZUxheW91dFwiIFtjbG9zZU9uT3V0c2lkZUNsaWNrXT1cImZhbHNlXCIgW2RyYWdFbmFibGVkXT1cImZhbHNlXCIgW3dpZHRoXT1cIjEyMDBcIlxuICAgIFtoZWlnaHRdPVwiNzAwXCIgW3Nob3dUaXRsZV09XCJ0cnVlXCIgY2xhc3M9XCJwb3B1cFwiIHRpdGxlPVwiRGF0YXNldCBGaWx0ZXJcIj5cbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHB4LTIgbWItM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMi8zIG1iLTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+U2VsZWN0IFZpZXdzPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRhZy1ib3ggW2RhdGFTb3VyY2VdPVwiY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZVwiIHZhbHVlRXhwcj1cInZpZXdJZFwiIGRpc3BsYXlFeHByPVwidmlld05hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbbXVsdGlsaW5lXT1cInRydWVcIiBbc2hvd1NlbGVjdGlvbkNvbnRyb2xzXT1cInRydWVcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkVmlld3NJZHNcIlxuICAgICAgICAgICAgICAgICAgICBbbWF4RGlzcGxheWVkVGFnc109XCIzXCIgKG9uVmFsdWVDaGFuZ2VkKT1cImdldFNlbGVjdGVkQ29sdW1uU291cmNlKCRldmVudClcIiBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPC9keC10YWctYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzMgcHgtMlwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfbWR9fSBtdC02XCIgKGNsaWNrKT1cImdldFByb2Nlc3NGb3JDb25maWcoKVwiPlxuICAgICAgICAgICAgICAgICAgICBBZGQgVG8gVmlld1xuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX21kfX0gY3Vyc29yLXBvaW50ZXIgbXQtNlwiIChjbGljayk9XCJjYW5jZWxDZHJDb25maWcoKVwiPkNhbmNlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+IC0tPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZHgtc2Nyb2xsLXZpZXcgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzgwJSdcIj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMiBib3JkZXItYlwiICpuZ0lmPVwiaXNQcm9jZWVkXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhZHZhbmNlTGF5b3V0Q29udGFpbmVyOyBsZXQgaSA9IGluZGV4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBtLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPlZpZXcgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0uY29tcENvbmZpZy52aWV3Q29uZmlnWzBdLnZpZXdOYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+V2lkZ2V0IFRpdGxlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5ub2RlUHJvcGVydGllcy53aWRnZXRUaXRsZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+V2lkZ2V0IFdpZHRoPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJ3aWRnZXRfd2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0ubm9kZVByb3BlcnRpZXMud2lkdGhcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+V2lkZ2V0IEhlaWdodDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0ubm9kZVByb3BlcnRpZXMuaGVpZ2h0XCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+V2lkZ2V0IEZpbHRlcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJmaWx0ZXJEYXRhU291cmNlXCIgZGlzcGxheUV4cHI9XCJmaWx0ZXJOYW1lXCIgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlRXhwcj1cImZpbHRlcklkXCIgWyhuZ01vZGVsKV09XCJpdGVtLmZpbHRlcklkXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG10LThcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNoZWNrLWJveCBbKG5nTW9kZWwpXT1cIml0ZW0ubm9kZVByb3BlcnRpZXMuZGlzcGxheVwiIHRleHQ9XCJEaXNwbGF5XCI+PC9keC1jaGVjay1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXIgbXQtOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVWaWV3KGkpXCI+PGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZHgtc2Nyb2xsLXZpZXc+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kIG14LTEgbXktMiBmbGV4LWdyb3dcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3N1Y2Nlc3NfbWR9fSBjdXJzb3ItcG9pbnRlciBtdC0yXCIgKGNsaWNrKT1cInN1Ym1pdEFkdmFuY2VWaWV3KClcIj5BZGRcbiAgICAgICAgICAgICAgICBMYXlvdXQ8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2R4LXBvcHVwPiJdfQ==
|
|
1040
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL3BhZ2UtY29udHJvbGxlci9wYWdlLWNvbmZpZy9wYWdlLWNvbmZpZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvcGFnZS1jb250cm9sbGVyL3BhZ2UtY29uZmlnL3BhZ2UtY29uZmlnLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFrRyxTQUFTLEVBQWdCLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSXBNLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUzRCxPQUFPLE1BQU0sTUFBTSx1QkFBdUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx3RkFBd0YsQ0FBQztBQUNySSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0RUFBNEUsQ0FBQztBQUN2SCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxzR0FBc0csQ0FBQztBQUN6SixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw4RkFBOEYsQ0FBQztBQUM3SSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSx3R0FBd0csQ0FBQztBQUM1SixPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSx3R0FBd0csQ0FBQztBQUU1SixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzRkFBc0YsQ0FBQztBQUNsSSxPQUFPLEVBQUUsc0JBQXNCLEVB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QUMsc0JBQXNCLENBQUM7U0FDbEc7UUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBSUQsVUFBVSxDQUFDLENBQUM7SUFFWixDQUFDOztnSEF4d0NVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLDhLQWlDa0IsZ0JBQWdCLG9HQUVoQyxnQkFBZ0IsK0tBb0ZyQyxxQkFBcUIsZ0RDaEpsQywyL3lCQWljVzsyRkR4YUUsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLHFCQUFxQjtzVUFzQy9CLHlCQUF5QjtzQkFEeEIsU0FBUzt1QkFBQywyQkFBMkIsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFHbEUsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFFRCxnQkFBZ0I7c0JBQWhFLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQWtGTSxVQUFVO3NCQUE5RCxTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBDb21wb25lbnRSZWYsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgT25EZXN0cm95LCBPbkluaXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uRXh0cmFzLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNvbmZpcm0gfSBmcm9tICdkZXZleHRyZW1lL3VpL2RpYWxvZyc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXBwbGljYXRpb24tY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IER4U2Nyb2xsVmlld0NvbXBvbmVudCB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhcic7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkRhdHNzZXRzQ2FsbCB9IGZyb20gJy4uLy4uL2FwcGxpY2F0aW9uLWRhdGFzZXQtY2FsbC5zZXJ2aWNlJztcbmltcG9ydCBtb21lbnQgZnJvbSAnLi8uLi8uLi9tb21lbnQtaGVscGVyJztcbmltcG9ydCB7IEdhbW1hVG9kYXlQcmV2aW91c0NvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtdG9kYXktcHJldmlvdXMvZ2FtbWEtdG9kYXktcHJldmlvdXMuY29tcG9uZW50JztcbmltcG9ydCB7IEFwcEFkdmFuY2VIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2FwcC1hZHZhbmNlLWhlYWRlci9hcHAtaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYW1tYVRhYmxlV2l0aFBlcmNlbnRhZ2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLXRhYmxlLXdpdGgtcGVyY2VudGFnZS9nYW1tYS10YWJsZS13aXRoLXBlcmNlbnRhZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IEdhbW1TaW5nbGVOdW1iZXJDYXJkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9nYW1tLXNpbmdsZS1udW1iZXItY2FyZC9nYW1tLXNpbmdsZS1udW1iZXItY2FyZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbWFBZHZhbmNlT3BlcmF0b3JUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtYWR2YW5jZS1vcGVyYXRvci10YWJsZS9nYW1tYS1hZHZhbmNlLW9wZXJhdG9yLXRhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBZHZhbmNlV2lkZ2V0SGVhZGVyRmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9hZHZhbmNlLXdpZGdldC1oZWFkZXItZmlsdGVyL2FkdmFuY2Utd2lkZ2V0LWhlYWRlci1maWx0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHsgR2FtbWFBZHZhbmNlQ2hhcnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLWFkdmFuY2UtY2hhcnQvZ2FtbWEtYWR2YW5jZS1jaGFydC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbWFHZW9DaGFydENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtZ2VvLWNoYXJ0L2dhbW1hLWdlby1jaGFydC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbWFIZWF0Q2hhcnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLWhlYXRtYXAvZ2FtbWEtaGVhdG1hcC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZGFzaGJvcmQtY29uZmlnJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BhZ2UtY29uZmlnLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGFnZS1jb25maWcuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBQYWdlQ29uZmlnQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBkYXNoYm9yZF9jb250YWluZXI6IGFueSA9IFtdO1xuICBzZWxlY3RlZF93aWR0aDogYW55O1xuICB3aWRnZXRfd2lkdGggPSBbJ3ctZnVsbCcsICd3LTEvMicsICd3LTEvMycsICd3LTIvMycsICd3LTEvNCcsICd3LTMvNCcsICd3LTEvNScsICd3LTQvNScsICd3LTEvNicsICd3LTUvNiddXG4gIGxvYWRpbmdNb2RhbDogYm9vbGVhbiA9IHRydWU7XG4gIGN1c3RvbWVyczogYW55O1xuICBwYWdlSGVhZGVyc0RhdGE6IGFueTtcbiAgcGFnZV90aXRsZSA9ICdEYXNoYm9hcmQnO1xuICBpc1NydlR5cGVPcGVyYXRvcjogYm9vbGVhbjtcbiAgZGVmYXVsdFN0YXJ0RGF0ZTtcbiAgZGVmYXVsdEVuZERhdGU7XG4gIHBhZ2VfY29uZmlnO1xuICBvcGVyYXRpb25MZXZlbHM6IGFueTtcbiAgZmlsdGVyX3ZhbHVlO1xuICBpc1RvZ2dsZVN3aWNoOiBib29sZWFuID0gdHJ1ZTtcbiAgaXNEYXRlUGlja2VyOiBib29sZWFuID0gZmFsc2U7XG4gIGlzVG9nZ2xlRXZlbnRTdGF0dXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNFZGl0Q2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNDb25maWdWaWV3OiBib29sZWFuO1xuICBpc0xvYWRlcjogYm9vbGVhbjtcbiAgY29tcG9uZW50TmFtZTogYW55O1xuICBpc1VwZGF0ZVdpZGdldDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGlzQ2hhcnRCdXR0b25DbGljazogYm9vbGVhbjtcbiAgY2hhcnRBY2Nlc3M6IGFueTtcbiAgY2hhcnRUeXBlOiBhbnk7XG4gIGRhc2hDaGFydENvbVNvdXJjZTogYW55O1xuICBpc0dlbmVyYXRlOiBib29sZWFuXG4gIGlzRmlsdGVySW5wdXRzOiBib29sZWFuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKi9cblxuICBAVmlld0NoaWxkKCdkeW5hbWljQ29tcG9uZW50Q29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIGR5bmFtaWNDb21wb25lbnRDb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBjb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoJ2R5bmFtaWNDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBkeW5hbWljQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIGR5bmFtaWNDb21wb25lbnRSZWZzOiBDb21wb25lbnRSZWY8YW55PltdID0gW107XG4gIC8vIGR5bmFtaWNDb21wb25lbnRSZWZzOiBDb21wb25lbnRSZWY8YW55PltdID0gW107XG5cbiAgQ29tcFJlZnM6IENvbXBvbmVudFJlZjxhbnk+O1xuXG4gIGNvbXBvbmVudENsYXNzTWFwID0ge1xuICAgIEdhbW1hQWR2YW5jZUNoYXJ0Q29tcG9uZW50LFxuICAgIEdhbW1hVG9kYXlQcmV2aW91c0NvbXBvbmVudCxcbiAgICBBcHBBZHZhbmNlSGVhZGVyQ29tcG9uZW50LFxuICAgIEdhbW1hVGFibGVXaXRoUGVyY2VudGFnZUNvbXBvbmVudCxcbiAgICBHYW1tU2luZ2xlTnVtYmVyQ2FyZENvbXBvbmVudCxcbiAgICBHYW1tYUFkdmFuY2VPcGVyYXRvclRhYmxlQ29tcG9uZW50LFxuICAgIEFkdmFuY2VXaWRnZXRIZWFkZXJGaWx0ZXJDb21wb25lbnQsXG4gICAgR2FtbWFIZWF0Q2hhcnRDb21wb25lbnQsXG4gICAgR2FtbWFHZW9DaGFydENvbXBvbmVudFxuICB9O1xuICBkYXRhU291cmNlTWF0YURhdGE6IGFueSA9IFtdO1xuICBxdWVyeVR5cGUgPSBcIm1vbmdvXCI7XG4gIGRhdGFTZXRNb2RhbDogYW55ID0gW107XG4gIGNvbXBvbmVudENvbmZpZ0RhdGFTb3VyY2U6IGFueSA9IFtdO1xuICBzZWxlc2NlZERhdGFTb3VyY2U6IGFueTtcbiAgZGF0YVNvdXJjZU1vZGFsOiBhbnkgPSB7fTtcbiAgaXNEYXNoQm9hcmRDb250ZW50OiBib29sZWFuID0gZmFsc2U7XG5cbiAgc2VsZWN0ZWRWaWV3Rm9ybUNvbXBvbmVudDogYW55ID0ge307XG4gIGFkZGVkd2lkR2V0Q29uZmlnID0ge1xuICAgIFwiZGlzcGxheVwiOiB0cnVlLFxuICAgIFwid2lkZ2V0VGl0bGVcIjogXCJcIixcbiAgICBcIndpZHRoXCI6IFwiXCIsXG4gICAgXCJoZWlnaHRcIjogXCJcIixcbiAgICBcImlzV2lkZ2V0RmlsdGVyXCI6IGZhbHNlXG4gIH1cblxuICBkYXNoQm9hcmRXaWRnZXRDb25maWc6IGFueSA9IFtcbiAgXTtcbiAgaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQ6IGJvb2xlYW47XG4gIHNlbGVjdGVkV2lkdGg6IGFueTtcbiAgc2VsZWN0ZWRIZWlnaHQ6IGFueTtcbiAgbmV3V2lkZ2V0SW5kZXg6IGFueTtcbiAgc2VsZWN0ZWRJbmRleE9iakZvckNoYXJ0OiBhbnkgPSB7fTtcbiAgc2VsZWN0ZWRDb250YWluZXJPYmplY3RGb3JDaGFydDogYW55ID0ge307XG4gIGRhdGFTZXR0YWJsZURhdGFTb3VyY2U6IGFueTtcbiAgdW5pcXVlRGF0YVNldE9iamVjdCA9IHt9O1xuXG4gIGlzRGFzaEJvYXJkQ29udGVudFR5cGVWaWV3OiBib29sZWFuO1xuICBwYWdlSWQ6IGFueTtcbiAgaXNsYXlvdXRDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgd2lkZ2V0TmFtZTogYW55O1xuICB3aWRnZXRUaXRsZTogYW55O1xuICBhbGxXaWRnZXRJbm5lckNvbnRlbnQ6IGFueTtcbiAgaXNEZWZhdWx0VmlldzogQm9vbGVhbiA9IHRydWU7XG4gIGlzRWRpdE1haW5MYXlvdXQ6IEJvb2xlYW47XG4gIGZpbHRlckRhdGFTb3VyY2U6IGFueTtcbiAgc2VsZWN0ZWRGaWx0ZXJJZDogYW55O1xuXG4gIHZpZXdUb1NlYXJjaDogc3RyaW5nID0gJyc7XG4gIGZpbHRlcmVkQ29tcG9uZW50Q29uZmlnOiBhbnlbXSA9IFtdO1xuICBpc0VkaXRPcHRpb25DbGljazogYm9vbGVhbjtcbiAgZWRpdFZpZXdkYXRhU291cmNlTW9kYWw6IGFueSA9IHt9O1xuXG4gIGVkaXRJdGVtRm9yVXBkYXRlOiBhbnkgPSB7fTtcbiAgcGFnZVRpdGxlOiBhbnk7XG4gIHBhZ2VVcmw6IGFueTtcbiAgYWxsV2lkZ2V0QnlEYXRhc2V0OiBhbnkgPSBbXTtcblxuICBzZWxlY3RlZEZpbHRlcnNEZWZhdWx0OiBhbnk7XG5cbiAgbm9kZVByb3BlcnRpY2VGaWx0ZXJzOiBhbnkgPSBbXTtcblxuICBpc0NyZWF0ZURhdGFzZXQ6IGJvb2xlYW47XG4gIHNlbGVjdGVkRGF0YXNldElkOiBhbnk7XG4gIGlzQ3JlYXRlRGF0YXNldFdpdGhEYXRhc2V0SWQ6IGJvb2xlYW47XG5cbiAgaXNDcmVhdGVOZXdWaWV3OiBib29sZWFuO1xuICBpc0NyZWF0ZU5ld1ZpZXdXaXRoRGVmYXVsdFZpZXc6IGJvb2xlYW47XG5cbiAgZGVmYXVsdEFwcGx5ZWRGaWx0ZXI6IGFueTtcbiAgaXNXaWRnZXRGaWx0ZXJzOiBib29sZWFuO1xuICBub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2U6IGFueTtcbiAgc2VsZWN0ZWRGaWx0ZXJEYXRhc291cmNlOiBhbnkgPSB7fTtcbiAgQFZpZXdDaGlsZChEeFNjcm9sbFZpZXdDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KSBzY3JvbGxWaWV3OiBEeFNjcm9sbFZpZXdDb21wb25lbnQ7XG5cbiAgc2VsZWN0ZWRWaWV3SWQ6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIHNlcnZpY2U6IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdHI6IFRvYXN0clNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGRhdGFzZXRTZXJ2aWNlOiBBcHBsaWNhdGlvbkRhdHNzZXRzQ2FsbCxcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRGFzaEJvYXJkQ29udGVudFR5cGVWaWV3ID0gKHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbJ2NvbnRlbnRUeXBlJ10gPT0gJ3ZpZXcnKSA/IHRydWUgOiBmYWxzZTtcbiAgICB0aGlzLnBhZ2VJZCA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbJ3BhZ2VJZCddO1xuXG4gICAgdGhpcy5nZXREYXRhU2V0KCk7XG4gICAgdGhpcy5kZWZhdWx0U3RhcnREYXRlID0gbW9tZW50KCkuc3VidHJhY3QoJzEwJywgJ2RheXMnKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICB0aGlzLmRlZmF1bHRFbmREYXRlID0gbW9tZW50KCkuc3VidHJhY3QoJzEnLCAnZGF5cycpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgIHRoaXMuZ2V0RmlsdGVySXRlbXMoKVxuICAgIHRoaXMuZ2V0QWxsVmlld3NJdGVtcygpXG5cbiAgICB0aGlzLmdldEFwcFBhZ2VEZXRhaWxDb25maWdCeVBhZ2VJZCgpXG4gIH1cblxuICBnZXRBbGxWaWV3c0l0ZW1zKCkge1xuICAgIHRoaXMuc2VydmljZS5nZXRBcHBWaWV3Q29uZmlncygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZSA9IGRhdGE7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRDb21wb25lbnRDb25maWcgPSB0aGlzLmNvbXBvbmVudENvbmZpZ0RhdGFTb3VyY2U7XG4gICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnVmlldyBDb25maWcnKTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZ2V0RmlsdGVySXRlbXMoKSB7XG4gICAgdGhpcy5zZXJ2aWNlLmdldEFwcEZpbHRlckNvbmZpZ3MoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmZpbHRlckRhdGFTb3VyY2UgPSBkYXRhO1xuICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0Vycm9yJyk7XG5cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBnZXRBcHBQYWdlRGV0YWlsQ29uZmlnQnlQYWdlSWQoKSB7XG4gICAgdGhpcy5zZXJ2aWNlLmdldEFwcFBhZ2VEZXRhaWxDb25maWcodGhpcy5wYWdlSWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnID0gZGF0YTtcbiAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBkYXRhLnBhZ2VOYW1lO1xuICAgICAgICB0aGlzLnBhZ2VVcmwgPSBkYXRhLnBhZ2VVcmw7XG4gICAgICAgIGlmIChkYXRhLndpZGdldHMgJiYgZGF0YS53aWRnZXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIHRoaXMuZ2V0Q29tcG9uZW50Q29uZmlnU2V0KClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0Vycm9yJyk7XG5cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cblxuICBnZXRDb21wb25lbnRDb25maWdTZXQoKSB7XG4gICAgbGV0IGRlZmF1bHRGaWx0ZXJzID0geyBvcGVyYXRpb25GaWx0ZXI6IHsgc3RhcnREYXRlOiBcIlwiLCBlbmREYXRlOiBcIlwiIH0gfTtcbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmZvckVhY2god2lkZ2V0ID0+IHtcbiAgICAgIGlmICh3aWRnZXQuZmlsdGVycykge1xuICAgICAgICB3aWRnZXQuZmlsdGVycy5maWx0ZXJJdGVtcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGlmIChlbGVtZW50LmZpbHRlclR5cGUgPT09ICdkYXRlJyB8fCBlbGVtZW50LmZpbHRlclR5cGUgPT09ICdkYXRldGltZScpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmRlZmF1bHRGaWx0ZXJUeXBlID09PSBcImR5bmFtaWNcIiAmJiBlbGVtZW50Lm1vbWVudEZ1bmN0aW9uICE9PSBcIlwiICYmIGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlICE9PSBcIlwiICYmIGVsZW1lbnQubW9tZW50Rm9ybWF0ICE9PSBcIlwiKSB7XG5cbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubW9tZW50RnVuY3Rpb24gPT0gXCJtb250aFBpY2tlclwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtjb3VudCwgdW5pdF0gPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZS5zcGxpdCgnLCcpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYXBpTmFtZSA9PT0gXCJlbmREYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRpc3BsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLmVuZERhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdChwYXJzZUludChjb3VudCksIHVuaXQpLmVuZE9mKHVuaXQpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEVuZERhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdChwYXJzZUludChjb3VudCksIHVuaXQpLmVuZE9mKHVuaXQpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwic3RhcnREYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlci5zdGFydERhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdChwYXJzZUludChjb3VudCksIHVuaXQpLnN0YXJ0T2YodW5pdCkuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQubW9tZW50RnVuY3Rpb24gPT0gXCJ3ZWVrUGlja2VyXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcGlOYW1lID09PSBcImVuZERhdGVcIikge1xuICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGlzcGxheSkge1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVycy5vcGVyYXRpb25GaWx0ZXIuZW5kRGF0ZSA9IG1vbWVudCgpLmVuZE9mKCd3ZWVrJykuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0RW5kRGF0ZSA9IG1vbWVudCgpLmVuZE9mKCd3ZWVrJykuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYXBpTmFtZSA9PT0gXCJzdGFydERhdGVcIikge1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLnN0YXJ0RGF0ZSA9IG1vbWVudCgpLnN0YXJ0T2YoJ3dlZWsnKS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgW2NvdW50LCB1bml0XSA9IGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYXBpTmFtZSA9PT0gXCJlbmREYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRpc3BsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLmVuZERhdGUgPSBtb21lbnQoKVtlbGVtZW50Lm1vbWVudEZ1bmN0aW9uXShwYXJzZUludChjb3VudCksIHVuaXQpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEVuZERhdGUgPSBtb21lbnQoKVtlbGVtZW50Lm1vbWVudEZ1bmN0aW9uXShwYXJzZUludChjb3VudCksIHVuaXQpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwic3RhcnREYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlci5zdGFydERhdGUgPSBtb21lbnQoKVtlbGVtZW50Lm1vbWVudEZ1bmN0aW9uXShwYXJzZUludChjb3VudCksIHVuaXQpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmRlZmF1bHRGaWx0ZXJUeXBlID09PSBcInN0YXRpY1wiICYmIGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwiZW5kRGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGlzcGxheSkge1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLmVuZERhdGUgPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEVuZERhdGUgPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYXBpTmFtZSA9PT0gXCJzdGFydERhdGVcIikge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlci5zdGFydERhdGUgPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTdGFydERhdGUgPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICh0eXBlb2YgZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUgIT09IFwiXCIpIHx8XG4gICAgICAgICAgICAgIChBcnJheS5pc0FycmF5KGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlKSAmJiBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50Lm9wZXJhdG9yTmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlcltlbGVtZW50Lm9wZXJhdG9yTmFtZV0gPSBBcnJheS5pc0FycmF5KGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlKVxuICAgICAgICAgICAgICAgICAgPyBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZVxuICAgICAgICAgICAgICAgICAgOiBbZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWVdO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlcltlbGVtZW50LmFwaU5hbWVdID0gZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUuam9pbihcIixcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcbiAgICB0aGlzLmRlZmF1bHRBcHBseWVkRmlsdGVyID0gZGVmYXVsdEZpbHRlcnM7XG5cbiAgICBQcm9taXNlLmFsbChhcGlDYWxscykudGhlbigoKSA9PiB7XG4gICAgICAvLyB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldFVuaXF1ZURhdGFTZXRPYmplY3QoKTtcbiAgICAgIHRoaXMuY3JlYXRlRGl2RWxlbWVudHModGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0KTtcbiAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuXG4gIH1cblxuICBnZXREYXRhU2V0KCkge1xuICAgIHRoaXMuaXNMb2FkZXIgPSB0cnVlO1xuICAgIHRoaXMuc2VydmljZS5nZXRBcHBEYXRhc2V0Q29uZmlncygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YVNldHRhYmxlRGF0YVNvdXJjZSA9IGRhdGE7XG4gICAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdEYXRhc2V0IENyZWF0aW9uJylcblxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG5cblxuICBnZXRDb21wb25lbnRDb25maWcoZXZlbnQpIHtcbiAgICBjb25zdCBmb3VuZE9iamVjdCA9IHRoaXMuY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZS5maW5kKHZpZXcgPT4gdmlldy52aWV3SWQgPT09IGV2ZW50LnZpZXdJZCk7XG4gICAgdGhpcy5nZXRFbWl0TmV3Q2hhcnRDb25maWcoZm91bmRPYmplY3QpO1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgfVxuXG4gIGFkZE5ld2NoYXJ0KCkge1xuICAgIHRoaXMuaXNHZW5lcmF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrID0gdHJ1ZTtcbiAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gZmFsc2U7XG4gICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gZmFsc2U7XG4gIH1cblxuXG4gIGFkZFdpZGdldCgpIHtcbiAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQgPSB0cnVlO1xuICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IGZhbHNlO1xuICAgIHRoaXMuaXNFZGl0TWFpbkxheW91dCA9IGZhbHNlO1xuICAgIHRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy5pc1VwZGF0ZVdpZGdldCA9IGZhbHNlO1xuICAgIHRoaXMud2lkZ2V0TmFtZSA9ICcnO1xuICAgIHRoaXMud2lkZ2V0VGl0bGUgPSAnJztcbiAgICB0aGlzLmFkZGVkd2lkR2V0Q29uZmlnID0ge1xuICAgICAgXCJkaXNwbGF5XCI6IHRydWUsXG4gICAgICBcIndpZGdldFRpdGxlXCI6IFwiXCIsXG4gICAgICBcIndpZHRoXCI6IFwiXCIsXG4gICAgICBcImhlaWdodFwiOiBcIlwiLFxuICAgICAgXCJpc1dpZGdldEZpbHRlclwiOiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGdldFdpdGgoZSkge1xuICAgIHRoaXMuc2VsZWN0ZWRXaWR0aCA9IGUudmFsdWU7XG4gIH1cblxuICBnZXRIZWlnaHQoZSkge1xuICAgIHRoaXMuc2VsZWN0ZWRIZWlnaHQgPSBlLnZhbHVlO1xuICB9XG5cbiAgYWRkTGF5b3V0VE92aWV3KCkge1xuICAgIGxldCBpbm5lcl9ub2RlID0ge1xuICAgICAgaWQ6IHRoaXMuY29tbW9uU2VydmljZS5wcmltZXJ5UmVuZG9tZUlkKDUpLFxuICAgICAgbm9kZVRpdGxlOiBcIlwiLFxuICAgICAgZmlsdGVySWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJJZCxcbiAgICAgIG5vZGVQcm9wZXJ0aWVzOiB0aGlzLmFkZGVkd2lkR2V0Q29uZmlnLFxuICAgICAgY29tcENvbmZpZzoge1xuICAgICAgICBkeW5hbWljQ29tcG9uZW50UmVmczogW10sXG4gICAgICAgIHZpZXdDb25maWc6IFtdXG4gICAgICB9LFxuICAgIH1cbiAgICBpZiAodGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlKSB7XG4gICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUucHVzaChpbm5lcl9ub2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlID0gW107XG4gICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUucHVzaChpbm5lcl9ub2RlKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy51cGRhdGVXaWRnZXQoKTtcbiAgfVxuXG5cblxuICByZWZvcm1hdFdpZGdldENvbmZpZyhkYXNoQm9hcmRXaWRnZXRDb25maWcsIGluZGV4ID0gbnVsbCkge1xuICAgIGNvbnN0IHByb2Nlc3NXaWRnZXQgPSAod2lkZ2V0KSA9PiB7XG4gICAgICB3aWRnZXQuY29tcENvbmZpZy52aWV3Q29uZmlnID0gd2lkZ2V0LmNvbXBDb25maWcudmlld0NvbmZpZy5tYXAoY29uZmlnID0+IGNvbmZpZy52aWV3SWQpO1xuICAgICAgd2lkZ2V0LmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMgPSBbXTtcblxuICAgICAgaWYgKHdpZGdldC53aWRnZXROb2RlICYmIHdpZGdldC53aWRnZXROb2RlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgd2lkZ2V0LndpZGdldE5vZGUuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZyA9IG5vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnLm1hcChjb25maWcgPT4gY29uZmlnLnZpZXdJZCk7XG4gICAgICAgICAgbm9kZS5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzID0gW107XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoaW5kZXggIT09IG51bGwgJiYgaW5kZXggPj0gMCAmJiBpbmRleCA8IGRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmxlbmd0aCkge1xuICAgICAgcHJvY2Vzc1dpZGdldChkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1tpbmRleF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKHdpZGdldCA9PiBwcm9jZXNzV2lkZ2V0KHdpZGdldCkpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1tpbmRleF07XG4gIH1cblxuICB1cGRhdGVXaWRnZXQoKSB7XG4gICAgbGV0IG1vZGlmaWVkQ29uZmlnID0gdGhpcy5yZWZvcm1hdFdpZGdldENvbmZpZyh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZywgdGhpcy5uZXdXaWRnZXRJbmRleCk7XG4gICAgbW9kaWZpZWRDb25maWdbJ2ZpbHRlcklkJ10gPSAobW9kaWZpZWRDb25maWcuZmlsdGVycyAmJiBtb2RpZmllZENvbmZpZy5maWx0ZXJzLmZpbHRlcklkKSA/IG1vZGlmaWVkQ29uZmlnLmZpbHRlcnMuZmlsdGVySWQgOiBudWxsO1xuICAgIGRlbGV0ZSBtb2RpZmllZENvbmZpZ1snZmlsdGVycyddO1xuICAgIHRoaXMuc2VydmljZS5lZGl0QXBwV2lkZ2V0Q29uZmlnKG1vZGlmaWVkQ29uZmlnKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmdldEFwcFBhZ2VEZXRhaWxDb25maWdCeVBhZ2VJZCgpXG4gICAgICAgIHRoaXMuYmFja1RvTWFpblZpZXcoKTtcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdXaWRnZXQgQ3JlYXRpb24nKVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5uZXdXaWRnZXRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gZmFsc2U7XG4gICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gdHJ1ZTtcbiAgfVxuXG4gIHVwZGF0ZUxheW91dFdpZGdldFRPdmlldygpIHtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy51cGRhdGVXaWRnZXQoKTtcbiAgfVxuXG4gIGFkZFdpZGdldFRPdmlldygpIHtcbiAgICBsZXQgb2JqID0ge1xuICAgICAgd2lkZ2V0SWQ6IHRoaXMuY29tbW9uU2VydmljZS5wcmltZXJ5UmVuZG9tZUlkKDUpLFxuICAgICAgd2lkZ2V0TmFtZTogdGhpcy53aWRnZXROYW1lLFxuICAgICAgd2lkZ2V0VGl0bGU6IHRoaXMud2lkZ2V0VGl0bGUsXG4gICAgICB3aWRnZXRQcm9wZXJ0aWVzOiB0aGlzLmFkZGVkd2lkR2V0Q29uZmlnLFxuICAgICAgcGFnZUlkOiB0aGlzLnBhZ2VJZCxcbiAgICAgIGZpbHRlcklkOiB0aGlzLnNlbGVjdGVkRmlsdGVySWQsXG4gICAgICB3aWRnZXROb2RlOiBbXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICBpZDogdGhpcy5jb21tb25TZXJ2aWNlLnByaW1lcnlSZW5kb21lSWQoNSksXG4gICAgICAgIC8vICAgbm9kZVRpdGxlOiBcIlwiLFxuICAgICAgICAvLyAgIGZpbHRlcklkOiBcIlwiLFxuICAgICAgICAvLyAgIG5vZGVQcm9wZXJ0aWVzOiB7XG4gICAgICAgIC8vICAgICBcImRpc3BsYXlcIjogdHJ1ZSxcbiAgICAgICAgLy8gICAgIFwid2lkZ2V0VGl0bGVcIjogXCJcIixcbiAgICAgICAgLy8gICAgIFwid2lkdGhcIjogXCJ3LTEvMlwiLFxuICAgICAgICAvLyAgICAgXCJoZWlnaHRcIjogXCJcIixcbiAgICAgICAgLy8gICB9LFxuICAgICAgICAvLyAgIGNvbXBDb25maWc6IHtcbiAgICAgICAgLy8gICAgIGR5bmFtaWNDb21wb25lbnRSZWZzOiBbXSxcbiAgICAgICAgLy8gICAgIHZpZXdDb25maWc6IFtdXG4gICAgICAgIC8vICAgfVxuICAgICAgICAvLyB9XG4gICAgICBdLFxuICAgICAgY29tcENvbmZpZzoge1xuICAgICAgICBkeW5hbWljQ29tcG9uZW50UmVmczogW10sXG4gICAgICAgIHZpZXdDb25maWc6IFtdXG4gICAgICB9LFxuICAgIH1cbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5zZXJ2aWNlLmNyZWF0ZUFwcFdpZGdldENvbmZpZyhvYmopLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgIC8vIHRoaXMuY3JlYXRlRGl2RWxlbWVudHModGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0KVxuICAgICAgICB0aGlzLmdldEFwcFBhZ2VEZXRhaWxDb25maWdCeVBhZ2VJZCgpXG5cbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ1dpZGdldCBDcmVhdGlvbicpXG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLnB1c2gob2JqKVxuICAgIC8vIHRoaXMuaW5zZXJ0RHluYW1pY0NvbXBvbmVudHMoKTtcblxuXG4gICAgdGhpcy5keW5hbWljQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gJyc7XG5cbiAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gZmFsc2U7XG4gICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gdHJ1ZTtcbiAgfVxuXG4gIGluc2VydE5ld1dpZ2V0KGluZGV4KSB7XG4gICAgdGhpcy5hZGRlZHdpZEdldENvbmZpZyA9IHtcbiAgICAgIFwiZGlzcGxheVwiOiB0cnVlLFxuICAgICAgXCJ3aWRnZXRUaXRsZVwiOiBcIlwiLFxuICAgICAgXCJ3aWR0aFwiOiBcIlwiLFxuICAgICAgXCJoZWlnaHRcIjogXCJcIixcbiAgICAgIFwiaXNXaWRnZXRGaWx0ZXJcIjogZmFsc2VcbiAgICB9XG4gICAgdGhpcy5pc1VwZGF0ZVdpZGdldCA9IGZhbHNlO1xuICAgIHRoaXMuaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQgPSB0cnVlO1xuICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IGZhbHNlO1xuICAgIHRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy5pc2xheW91dENyZWF0ZSA9IHRydWU7XG4gICAgdGhpcy5uZXdXaWRnZXRJbmRleCA9IGluZGV4O1xuICB9XG4gIGluc2VydENoYXJ0V2lnZXQoaW5kZXhPYmosIGNvbnRhaW5lckVsZW1lbnQpIHtcblxuICAgIHRoaXMuaXNHZW5lcmF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrID0gdHJ1ZTtcbiAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gZmFsc2U7XG4gICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3RlZENvbnRhaW5lck9iamVjdEZvckNoYXJ0ID0gY29udGFpbmVyRWxlbWVudDtcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXhPYmpGb3JDaGFydCA9IGluZGV4T2JqO1xuICAgIHRoaXMuc2VsZWN0ZWRWaWV3Rm9ybUNvbXBvbmVudCA9IHt9O1xuICB9XG5cbiAgYXN5bmMgZ2V0RW1pdE5ld0NoYXJ0Q29uZmlnKGRhdGEpIHtcbiAgICAvLyBsZXQgZGF0YXNldF9jb25maWcgPSB0aGlzLmRhdGFTZXRNb2RhbC5maW5kKGRhdGFzZXQgPT4gZGF0YXNldC5kYXRhc2V0SWQgPT0gZGF0YS5kYXRhc2V0SWQpO1xuICAgIC8vIGF3YWl0IHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YUZyb21EYXRhU2V0KGRhdGFzZXRfY29uZmlnLCBkYXRhc2V0X2NvbmZpZy5kYXRhc2V0SWQsIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzRGVmYXVsdClcbiAgICAvLyBkYXRhLmtwaUNvbmZpZ1snZGF0YVNvdXJjZSddID0gdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0W2RhdGFzZXRfY29uZmlnLmRhdGFzZXRJZF07XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4T2JqRm9yQ2hhcnQuY29tcENvbmZpZy52aWV3Q29uZmlnLnB1c2goZGF0YSlcbiAgICB0aGlzLmxvYWREeW5hbWljQ29tcG9uZW50KGRhdGEsIHRoaXMuc2VsZWN0ZWRJbmRleE9iakZvckNoYXJ0LCB0aGlzLnNlbGVjdGVkQ29udGFpbmVyT2JqZWN0Rm9yQ2hhcnQpO1xuICAgIGNvbnNvbGUubG9nKHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnKVxuICAgIHRoaXMudXBkYXRlV2lkZ2V0KCk7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ2hhcnRCdXR0b25DbGljayA9IGZhbHNlO1xuXG4gICAgLy8gfVxuXG4gIH1cblxuICB1cGRhdGVUb1ZpZXcoKSB7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMudXBkYXRlV2lkZ2V0KCk7XG4gIH1cblxuICBkZWxldGVXaWRnZXQoaXRlbSwgaW5kZXgpIHtcbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLnNwbGljZShpbmRleCwgMSlcbiAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZGVsZXRlSW5zZXJ0V2lkZ2V0KGl0ZW0sIGNoaWxkSW5kZXgsIHBhcmVudEluZGV4KSB7XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1twYXJlbnRJbmRleF0ud2lkZ2V0Tm9kZS5zcGxpY2UoY2hpbGRJbmRleCwgMSlcbiAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0V2lkZ2V0VGl0bGVEaXYoaXRlbSwgZGl2KSB7XG4gICAgLy8gY29uc3Qgd2lkZ2V0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgLy8gd2lkZ2V0RGl2LmNsYXNzTGlzdC5hZGQoJ2ZsZXgnLCAnaXRlbXMtY2VudGVyJywgJ2p1c3RpZnktYmV0d2VlbicsICdmb250LWJvbGQnLCAndGV4dC1tZCcsICd0ZXh0LWdyYXktOTAwJywgJ2Rhcms6dGV4dC13aGl0ZScsICdib3JkZXItYicsICdwLTMnLCAnYmctZ3JheS04MDAnLCAnbXgtMicsICdyb3VuZGVkLXQtbGcnKTtcbiAgICAvLyBjb25zdCB0aXRsZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIC8vIHRpdGxlRGl2LmlubmVyVGV4dCA9IChpdGVtLm5vZGVQcm9wZXJ0aWVzKSA/IGl0ZW0ubm9kZVByb3BlcnRpZXMud2lkZ2V0VGl0bGUgOiBcIlwiO1xuICAgIC8vIHdpZGdldERpdi5hcHBlbmQodGl0bGVEaXYpXG5cbiAgICBjb25zdCB3aWRnZXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB3aWRnZXREaXYuY2xhc3NMaXN0LmFkZChcbiAgICAgICdmbGV4JywgJ2l0ZW1zLWNlbnRlcicsICdqdXN0aWZ5LWJldHdlZW4nLCAnZm9udC1ib2xkJywgJ3RleHQtbWQnLFxuICAgICAgJ3RleHQtZ3JheS05MDAnLCAnZGFyazp0ZXh0LXdoaXRlJywgJ2JvcmRlci1iJywgJ3AtMycsICdiZy1ncmF5LTgwMCcsXG4gICAgICAnbXgtMicsICdyb3VuZGVkLXQtbGcnLCAncmVsYXRpdmUnIC8vIE5lZWRlZCBmb3IgYWJzb2x1dGUgdG9vbHRpcCBwb3NpdGlvbmluZ1xuICAgICk7XG5cbiAgICBjb25zdCB0aXRsZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRpdGxlRGl2LmNsYXNzTGlzdC5hZGQoJ3JlbGF0aXZlJywgJ2dyb3VwJyk7IC8vIFRhaWx3aW5kIGdyb3VwIGZvciBob3ZlciBlZmZlY3RcblxuICAgIGNvbnN0IHBhcmFtcyA9IGl0ZW0ubm9kZVByb3BlcnRpZXMud2lkZ2V0UGFyYW1zIHx8IFwiXCI7XG5cbiAgICAvLyBFeHRyYWN0IHRvb2x0aXAgY29udGVudCBmcm9tIHdpZGdldFRpdGxlXG4gICAgY29uc3Qgd2lkZ2V0VGl0bGUgPSBpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZGdldFRpdGxlO1xuICAgIGNvbnN0IHRvb2x0aXBNYXRjaCA9IHdpZGdldFRpdGxlLm1hdGNoKC9cXCR0XFx7KFtcXHNcXFNdKj8pXFx9Lyk7IC8vIFN1cHBvcnRzIG11bHRpLWxpbmUgSFRNTFxuXG4gICAgLy8gUmVtb3ZlICckdHsuLi59JyBmcm9tIGRpc3BsYXllZCB0aXRsZVxuICAgIGNvbnN0IGRpc3BsYXlUaXRsZSA9IHdpZGdldFRpdGxlLnJlcGxhY2UoL1xcJHRcXHtbXFxzXFxTXSo/XFx9L2csICcnKS50cmltKCk7XG5cbiAgICAvLyBTZXQgdGl0bGUgdGV4dFxuICAgIHRpdGxlRGl2LmlubmVyVGV4dCA9IGRpc3BsYXlUaXRsZSArIHBhcmFtcztcblxuICAgIC8vIElmIGEgdG9vbHRpcCBpcyBmb3VuZCwgY3JlYXRlIGEgdG9vbHRpcCBkaXZcbiAgICBpZiAodG9vbHRpcE1hdGNoKSB7XG4gICAgICBjb25zdCB0b29sdGlwQ29udGVudCA9IHRvb2x0aXBNYXRjaFsxXS50cmltKCk7XG4gICAgICBjb25zdCB0b29sdGlwRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0b29sdGlwRGl2LmNsYXNzTGlzdC5hZGQoXG4gICAgICAgICdhYnNvbHV0ZScsICdsZWZ0LTAnLCAnYm90dG9tLWZ1bGwnLCAnbWItMicsICd3LW1heCcsICdtYXgtdy14cycsXG4gICAgICAgICdiZy1ibGFjaycsICd0ZXh0LXdoaXRlJywgJ3RleHQtc20nLCAncC0yJywgJ3JvdW5kZWQtbGcnLCAnc2hhZG93LWxnJyxcbiAgICAgICAgJ29wYWNpdHktMCcsICdncm91cC1ob3ZlcjpvcGFjaXR5LTEwMCcsICd0cmFuc2l0aW9uLW9wYWNpdHknLCAnZHVyYXRpb24tMzAwJyxcbiAgICAgICAgJ3otNTAnXG4gICAgICApO1xuICAgICAgdG9vbHRpcERpdi5pbm5lckhUTUwgPSB0b29sdGlwQ29udGVudDsgLy8gU2V0IGlubmVySFRNTCBmb3IgcmljaCBIVE1MIHRvb2x0aXBzXG5cbiAgICAgIC8vIEFwcGVuZCB0b29sdGlwIHRvIHRpdGxlRGl2XG4gICAgICB0aXRsZURpdi5hcHBlbmRDaGlsZCh0b29sdGlwRGl2KTtcbiAgICB9XG5cbiAgICB3aWRnZXREaXYuYXBwZW5kQ2hpbGQodGl0bGVEaXYpO1xuXG5cbiAgICAvLyBBZGQgRm9udEF3ZXNvbWUgZWRpdCBpY29uXG4gICAgY29uc3QgZWRpdEljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XG4gICAgZWRpdEljb24uY2xhc3NMaXN0LmFkZCgnZmEnLCAnZmEtcGVuY2lsJywgJ21sLTInLCAnY3Vyc29yLXBvaW50ZXInLCAndGV4dC1ibHVlLTQwMCcsICdob3Zlcjp0ZXh0LWJsdWUtNzAwJyk7XG4gICAgd2lkZ2V0RGl2LmFwcGVuZChlZGl0SWNvbik7XG5cbiAgICBpZiAoaXRlbS5ub2RlUHJvcGVydGllcy5pc1dpZGdldEZpbHRlcikge1xuICAgICAgY29uc3Qgc2VhcmNoQ29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzZWFyY2hDb250YWluZXJEaXYuY2xhc3NMaXN0LmFkZCgnZmxleCcsICdpdGVtcy1jZW50ZXInLCAnc3BhY2UteC0yJyk7XG4gICAgICBjb25zdCBzZWFyY2hCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgIHNlYXJjaEJ1dHRvbi5pbm5lclRleHQgPSAnRmlsdGVyJztcbiAgICAgIHNlYXJjaEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdweC0zJywgJ3B5LTEuNScsICdiZy1ibHVlLTYwMCcsICdtci0yJywgJ3RleHQtd2hpdGUnLCAncm91bmRlZCcsICdob3ZlcjpiZy1ibHVlLTcwMCcpO1xuICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2UgPSBbXTtcblxuICAgICAgc2VhcmNoQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmlzV2lkZ2V0RmlsdGVycyA9IHRydWU7XG4gICAgICAgIGxldCBmaWx0ZVByb3BlcnRpY2UgPSBbXTtcbiAgICAgICAgaXRlbS5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICBsZXQga2V5X25hbWUgPSB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3RbZWxlbWVudC5kYXRhc2V0SWRdWzBdO1xuICAgICAgICAgIE9iamVjdC5rZXlzKGtleV9uYW1lKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoIWZpbHRlUHJvcGVydGljZS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgIGZpbHRlUHJvcGVydGljZS5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZpbHRlUHJvcGVydGljZS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICBjb2x1bW5OYW1lOiBlbGVtZW50LFxuICAgICAgICAgICAgZGF0YVR5cGU6IFwiZmxvYXRcIixcbiAgICAgICAgICAgIG9wZXJhdG9yOiBcIlwiLFxuICAgICAgICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlLnB1c2gob2JqKVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgc2VhcmNoQ29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHNlYXJjaEJ1dHRvbilcbiAgICAgIHdpZGdldERpdi5hcHBlbmRDaGlsZCh0aXRsZURpdik7XG4gICAgICB3aWRnZXREaXYuYXBwZW5kQ2hpbGQoc2VhcmNoQ29udGFpbmVyRGl2KTtcbiAgICB9XG5cbiAgICBpZiAoaXRlbS5maWx0ZXJJZCkge1xuICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2UgPSB7fTtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlWyd2aWV3Q29uZmlnJ10gPSBpdGVtO1xuICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2VbJ2hhdmluZ0NvbmZpZyddID0gW107XG5cbiAgICAgIHRoaXMuc2VydmljZS5nZXRBcHBGaWx0ZXJDb25maWcoaXRlbS5maWx0ZXJJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpbHRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIHRoaXMubG9hZFdpZGdldEZpbHRlckNvbXBvbmVudChpdGVtLCB3aWRnZXREaXYsIGRhdGEuZmlsdGVySXRlbXMpO1xuICAgICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG5cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChpdGVtLm5vZGVQcm9wZXJ0aWVzLm5vZGVmaWx0ZXJzICYmIGl0ZW0ubm9kZVByb3BlcnRpZXMubm9kZWZpbHRlcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICBjb25zdCBzZWFyY2hDb250YWluZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHNlYXJjaENvbnRhaW5lckRpdi5jbGFzc0xpc3QuYWRkKCdmbGV4JywgJ2l0ZW1zLWNlbnRlcicsICdzcGFjZS14LTInKTtcbiAgICAgIGl0ZW0ubm9kZVByb3BlcnRpZXMubm9kZWZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZmlsdGVyRGl2LmNsYXNzTGlzdC5hZGQoJ2ZsZXgnLCAnaXRlbXMtY2VudGVyJyk7XG4gICAgICAgIGlmIChmaWx0ZXIuaW5wdXRfdHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgY29uc3QgdGV4dEJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgdGV4dEJveC50eXBlID0gJ3RleHQnO1xuICAgICAgICAgIHRleHRCb3gucGxhY2Vob2xkZXIgPSBgRW50ZXIgJHtmaWx0ZXIubG9jYWxfY29sdW1ufWA7XG4gICAgICAgICAgdGV4dEJveC5jbGFzc0xpc3QuYWRkKCdweC0yJywgJ3B5LTEuNScsICdyb3VuZGVkJywgJ2JvcmRlcicsICdtci0xJywgJ2JvcmRlci1ncmF5LTUwMCcsICd0ZXh0LWdyYXktOTAwJywgJ2Rhcms6YmctZ3JheS03MDAnLCAnZGFyazp0ZXh0LXdoaXRlJyk7XG4gICAgICAgICAgY29uc3Qgc2VhcmNoQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgICAgc2VhcmNoQnV0dG9uLmlubmVyVGV4dCA9ICdTZWFyY2gnO1xuICAgICAgICAgIHNlYXJjaEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdweC0zJywgJ3B5LTEuNScsICdiZy1ibHVlLTYwMCcsICdtci0yJywgJ3RleHQtd2hpdGUnLCAncm91bmRlZCcsICdob3ZlcjpiZy1ibHVlLTcwMCcpO1xuICAgICAgICAgIGNvbnN0IHNlcGFyZXJvdEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIHNlcGFyZXJvdEJ1dHRvbi5pbm5lckhUTUwgPSAnfCc7XG4gICAgICAgICAgc2VhcmNoQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VhcmNoVGVybSA9IHRleHRCb3gudmFsdWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnVGV4dCBzZWFyY2ggYnV0dG9uIGNsaWNrZWQgd2l0aDonLCBzZWFyY2hUZXJtKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmaWx0ZXJEaXYuYXBwZW5kQ2hpbGQodGV4dEJveCk7XG4gICAgICAgICAgZmlsdGVyRGl2LmFwcGVuZENoaWxkKHNlYXJjaEJ1dHRvbik7XG4gICAgICAgICAgZmlsdGVyRGl2LmFwcGVuZENoaWxkKHNlcGFyZXJvdEJ1dHRvbik7XG4gICAgICAgIH1cblxuICAgICAgICBzZWFyY2hDb250YWluZXJEaXYuYXBwZW5kQ2hpbGQoZmlsdGVyRGl2KTtcbiAgICAgIH0pO1xuICAgICAgd2lkZ2V0RGl2LmFwcGVuZENoaWxkKHNlYXJjaENvbnRhaW5lckRpdik7XG4gICAgfVxuXG4gICAgZWRpdEljb24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG5cbiAgICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmZpbmRJbmRleChvYmplY3QgPT4gb2JqZWN0LndpZGdldElkID09PSBkaXYud2lkZ2V0SWQpO1xuICAgICAgdGhpcy5pc1VwZGF0ZVdpZGdldCA9IHRydWU7XG4gICAgICB0aGlzLmlzbGF5b3V0Q3JlYXRlID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQgPSB0cnVlO1xuICAgICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gZmFsc2U7XG4gICAgICB0aGlzLmlzQ2hhcnRCdXR0b25DbGljayA9IGZhbHNlO1xuICAgICAgdGhpcy5ub2RlUHJvcGVydGljZUZpbHRlcnMgPSAoaXRlbS5ub2RlUHJvcGVydGllcy5ub2RlZmlsdGVycyAmJiBpdGVtLm5vZGVQcm9wZXJ0aWVzLm5vZGVmaWx0ZXJzLmxlbmd0aCAhPT0gMCkgPyBpdGVtLm5vZGVQcm9wZXJ0aWVzLm5vZGVmaWx0ZXJzIDogW107XG4gICAgICBpdGVtLm5vZGVQcm9wZXJ0aWVzWydub2RlZmlsdGVycyddID0gdGhpcy5ub2RlUHJvcGVydGljZUZpbHRlcnM7XG4gICAgICB0aGlzLmFkZGVkd2lkR2V0Q29uZmlnID0gaXRlbS5ub2RlUHJvcGVydGllcztcbiAgICAgIHRoaXMuYWxsV2lkZ2V0SW5uZXJDb250ZW50ID0gaXRlbS5jb21wQ29uZmlnLnZpZXdDb25maWc7XG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVySWQgPSAoaXRlbS5maWx0ZXJJZCkgPyBpdGVtLmZpbHRlcklkIDogXCJcIjtcbiAgICAgIHRoaXMuZWRpdFZpZXdkYXRhU291cmNlTW9kYWwgPSB7fTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJEYXRhc291cmNlID0gaXRlbTtcbiAgICB9KTtcbiAgICByZXR1cm4gd2lkZ2V0RGl2O1xuICB9XG5cblxuICBnZXRGaWx0ZXJWYWx1ZUJ5SWQoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuZXZlbnQpIHtcbiAgICAgIHRoaXMuc2VydmljZS5nZXRBcHBGaWx0ZXJDb25maWcoZXZlbnQudmFsdWUpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zZWxlY3RlZEZpbHRlckRhdGFzb3VyY2UpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlckRhdGFzb3VyY2UuZmlsdGVySWQgPSB0aGlzLnNlbGVjdGVkRmlsdGVySWQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0uZmlsdGVycyA9IGRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoXCJGaWx0ZXIgQ2hhbmdlZFwiKVxuICAgICAgICB9LCBlcnJvZTogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdGaWx0ZXIgVXBkYXRlJylcblxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG5cbiAgY3JlYXRlRGl2RWxlbWVudHMoZGF0YXNldEJ5SWQpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmR5bmFtaWNDb250YWluZXIubmF0aXZlRWxlbWVudDtcblxuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIGNvbnN0IGNvbnRleHRfZmlsdGVyID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcuZmlsdGVycyA/IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLmZpbHRlcnMuZmlsdGVySXRlbXMgOiBudWxsO1xuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuZm9yRWFjaChhc3luYyBkaXYgPT4ge1xuICAgICAgY29uc3Qgcm93RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBsZXQgd19oZWlnaHQgPSAoZGl2LndpZGdldFByb3BlcnRpZXMuaGVpZ2h0ID09IFwiXCIpID8gXCJoLWF1dG9cIiA6ICdoLVsnICsgZGl2LndpZGdldFByb3BlcnRpZXMuaGVpZ2h0ICsgJ10nO1xuICAgICAgcm93RGl2LmNsYXNzTGlzdC5hZGQoZGl2LndpZGdldFByb3BlcnRpZXMud2lkdGgsIHdfaGVpZ2h0LCAnYm9yZGVyJyk7XG4gICAgICBjb25zdCBmaWx0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgY29uc3QgZmlsdGVySXRlbXMgPSAoZGl2LmZpbHRlcnMpID8gZGl2LmZpbHRlcnMuZmlsdGVySXRlbXMgOiBbXTtcbiAgICAgIC8vIGlmIChkaXYuZmlsdGVycykge1xuICAgICAgdGhpcy5sb2FkRmlsdGVyQ29tcG9uZW50KGRpdiwgZmlsdGVyRGl2LCBmaWx0ZXJJdGVtcywgY29udGV4dF9maWx0ZXIpO1xuXG4gICAgICAvLyB9XG5cbiAgICAgIHJvd0Rpdi5hcHBlbmRDaGlsZChmaWx0ZXJEaXYpXG5cbiAgICAgIGlmIChkaXYud2lkZ2V0Tm9kZSAmJiBkaXYud2lkZ2V0Tm9kZS5sZW5ndGggJiYgZGl2LndpZGdldE5vZGUubGVuZ3RoICE9IDApIHtcbiAgICAgICAgY29uc3QgbWFpbkl0ZW1EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbWFpbkl0ZW1EaXYuY2xhc3NMaXN0LmFkZChcImZsZXhcIiwgXCJmbGV4LXdyYXBcIik7XG4gICAgICAgIHRoaXMubG9hZFdpZGdldE5vZGVzKGRpdiwgbWFpbkl0ZW1EaXYsIGRhdGFzZXRCeUlkKTtcbiAgICAgICAgLy8gZm9yIGxvb3Agb24gd2lkZ2V0XG4gICAgICAgIHJvd0Rpdi5hcHBlbmRDaGlsZChtYWluSXRlbURpdik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBfaW5uZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHBfaW5uZXJEaXYuY2xhc3NMaXN0LmFkZCgncm91bmRlZCcsICdqdXN0aWZ5LWNlbnRlcicsICdpdGVtcy1jZW50ZXInLCAnYm9yZGVyJywgJ3AtMScsICdtLTEnLCAnZmxleCcsICdmbGV4LXJvdycpO1xuICAgICAgLy8gYWRkIHdpZGdldCBidXR0b25cbiAgICAgIGNvbnN0IHBfYnV0dG9uX3dpZGdldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcF9idXR0b25fd2lkZ2V0LmlubmVyVGV4dCA9ICdBZGQgU2luZ2xlIExheW91dCc7XG4gICAgICBwX2J1dHRvbl93aWRnZXQuY2xhc3NMaXN0LmFkZCgnYmctYmx1ZS03MDAnLCBcInAtMVwiLCBcInctZml0XCIsIFwiY3Vyc29yLXBvaW50ZXJcIiwgJ3RleHQteHMnKVxuICAgICAgcF9idXR0b25fd2lkZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuZmluZEluZGV4KG9iamVjdCA9PiBvYmplY3Qud2lkZ2V0SWQgPT09IGRpdi53aWRnZXRJZCk7XG4gICAgICAgIHRoaXMuaW5zZXJ0TmV3V2lnZXQoaW5kZXgpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGRlbGV0ZSB3aWRnZXQgYnV0dG9uXG4gICAgICBjb25zdCBwX2RlbF9idXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHBfZGVsX2J1dHRvbi5pbm5lclRleHQgPSAnRGV0ZXRlIGxheW91dCc7XG4gICAgICBwX2RlbF9idXR0b24uY2xhc3NMaXN0LmFkZCgnYmctcmVkLTcwMCcsIFwicC0xXCIsIFwidy1maXRcIiwgXCJjdXJzb3ItcG9pbnRlclwiLCAndGV4dC14cycpXG4gICAgICBwX2RlbF9idXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG5cblxuICAgICAgICBsZXQgcmVzdWx0ID0gY29uZmlybShcIjxpPkFyZSBZb3UgU3VyZT88L2k+XCIsIFwiRGVsZXRlIExheW91dFwiKTtcbiAgICAgICAgcmVzdWx0LnRoZW4oKGRpYWxvZ1Jlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChkaWFsb2dSZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMgPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLm1hcChjb25maWcgPT4gY29uZmlnLndpZGdldElkKTtcbiAgICAgICAgICAgIHJvd0Rpdi5yZW1vdmUoKVxuXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2UuZWRpdEFwcFBhZ2VDb25maWcodGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldEFwcFBhZ2VEZXRhaWxDb25maWdCeVBhZ2VJZCgpXG4gICAgICAgICAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnV2lkZ2V0IENyZWF0aW9uJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzRGVmYXVsdFZpZXcgPSB0cnVlO1xuXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLy8gYWR2YW5jZWQgYnV0dG9uXG4gICAgICBjb25zdCBhZHZhbmNlX2J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgYWR2YW5jZV9idXR0b24uaW5uZXJUZXh0ID0gJ0FkdmFuY2UgTGF5b3V0JztcbiAgICAgIGFkdmFuY2VfYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2JnLXllbGxvdy03MDAnLCBcInAtMVwiLCBcInctZml0XCIsIFwiY3Vyc29yLXBvaW50ZXJcIiwgJ3RleHQteHMnKVxuICAgICAgYWR2YW5jZV9idXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbXBfb2JqZWN0ID0gdGhpcy5maW5kV2lkZ2V0QnlJZCh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLCBkaXYud2lkZ2V0SWQpO1xuICAgICAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5maW5kSW5kZXgob2JqZWN0ID0+IG9iamVjdC53aWRnZXRJZCA9PT0gZGl2LndpZGdldElkKTtcblxuICAgICAgICB0aGlzLmlzQWR2YW5jZUxheW91dCA9IHRydWU7XG5cbiAgICAgIH0pO1xuXG4gICAgICBwX2lubmVyRGl2LmFwcGVuZENoaWxkKGFkdmFuY2VfYnV0dG9uKTtcbiAgICAgIHBfaW5uZXJEaXYuYXBwZW5kQ2hpbGQocF9idXR0b25fd2lkZ2V0KTtcbiAgICAgIHBfaW5uZXJEaXYuYXBwZW5kQ2hpbGQocF9kZWxfYnV0dG9uKTtcblxuICAgICAgaWYgKCF0aGlzLmlzRGFzaEJvYXJkQ29udGVudFR5cGVWaWV3KSB7XG4gICAgICAgIHJvd0Rpdi5hcHBlbmRDaGlsZChwX2lubmVyRGl2KTtcbiAgICAgIH1cbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChyb3dEaXYpO1xuICAgIH0pO1xuICB9XG5cbiAgbG9hZFdpZGdldE5vZGVzKGRpdjogYW55LCBtYWluSXRlbURpdjogYW55LCBkYXRhc2V0QnlJZDogYW55KSB7XG4gICAgZGl2LndpZGdldE5vZGUuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIHRoaXMubG9hZFNpbmdsZVdpZGdldE5vZGUoaXRlbSwgbWFpbkl0ZW1EaXYsIGRhdGFzZXRCeUlkLCBkaXYpO1xuICAgIH0pO1xuICB9XG5cbiAgbG9hZFNpbmdsZVdpZGdldE5vZGUoaXRlbTogYW55LCBjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCwgZGF0YXNldEJ5SWQ6IGFueSwgZGl2KSB7XG4gICAgbGV0IHdfaGVpZ2h0ID0gKGl0ZW0ubm9kZVByb3BlcnRpZXMuaGVpZ2h0ID09IFwiXCIpID8gXCJoLWF1dG9cIiA6ICdoLVsnICsgaXRlbS5ub2RlUHJvcGVydGllcy5oZWlnaHQgKyAnXSc7XG4gICAgbGV0IHdfd2lkdGggPSAoaXRlbS5ub2RlUHJvcGVydGllcy53aWR0aCA9PSBcIlwiKSA/IFwidy1mdWxsXCIgOiBpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZHRoO1xuICAgIGNvbnN0IGl0ZW1EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBpdGVtRGl2LmNsYXNzTGlzdC5hZGQod193aWR0aCwgd19oZWlnaHQsICdib3JkZXInLCAncC0xJyk7XG5cbiAgICBjb25zdCBmbGV4Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZmxleENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdmbGV4JywgJ2p1c3RpZnktYmV0d2VlbicsICdpdGVtcy1jZW50ZXInLCAndGV4dC1ncmF5LTkwMCcsICdkYXJrOnRleHQtd2hpdGUnLCAnYmctZ3JheS04MDAnLCAnbXgtMicsICdyb3VuZGVkLXQtbGcnKTsgLy8gRmxleGJveCBjb250YWluZXJcblxuICAgIGNvbnN0IHdpZGdldERpdiA9IHRoaXMuZ2V0V2lkZ2V0VGl0bGVEaXYoaXRlbSwgZGl2KVxuICAgIGl0ZW0uY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5rcGlDb25maWcpIHtcbiAgICAgICAgbGV0IGFwaUNhbGxzID0gW107XG4gICAgICAgIHRoaXMuc2VydmljZS5nZXRBcHBEYXRhc2V0Q29uZmlnKGVsZW1lbnQuZGF0YXNldElkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChkYXRhc2V0OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhc2V0LmRhdGFzZXRUeXBlICE9PSBcInNxbFF1ZXJ5XCIgJiYgZGF0YXNldC5kYXRhc2V0VHlwZSAhPT0gXCJwbGFpbmpzb25cIikge1xuICAgICAgICAgICAgICBjb25zdCBkYXRhc2V0V2l0aExpbWl0ID0gdGhpcy5zZXREYXRhU2V0c0xpbWl0KGRhdGFzZXQpO1xuICAgICAgICAgICAgICBhcGlDYWxscy5wdXNoKHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YUZyb21EYXRhU2V0KGRhdGFzZXRXaXRoTGltaXQsIGRhdGFzZXRXaXRoTGltaXQuZGF0YXNldElkLCB0aGlzLmRlZmF1bHRBcHBseWVkRmlsdGVyKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFzZXQuZGF0YXNldFR5cGUgPT0gXCJzcWxRdWVyeVwiKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpbHRlcldpdGhMaW1pdCA9IHRoaXMuc2V0RGF0YVNldHNMaW1pdEZvclNxbChkYXRhc2V0KTtcbiAgICAgICAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChmaWx0ZXJXaXRoTGltaXQsIGZpbHRlcldpdGhMaW1pdC5kYXRhc2V0SWQsIHRoaXMuZGVmYXVsdEFwcGx5ZWRGaWx0ZXIpKTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChkYXRhc2V0LCBkYXRhc2V0LmRhdGFzZXRJZCwgdGhpcy5kZWZhdWx0QXBwbHllZEZpbHRlcikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBQcm9taXNlLmFsbChhcGlDYWxscykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0VW5pcXVlRGF0YVNldE9iamVjdCgpO1xuICAgICAgICAgICAgICBlbGVtZW50LmtwaUNvbmZpZ1snZGF0YVNvdXJjZSddID0gdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0W2VsZW1lbnQuZGF0YXNldElkXVxuICAgICAgICAgICAgICBjb25zdCBjb21wX29iamVjdCA9IHRoaXMuZmluZFdpZGdldEJ5SWQodGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cywgaXRlbS5pZCk7XG4gICAgICAgICAgICAgIHRoaXMubG9hZER5bmFtaWNDb21wb25lbnQoZWxlbWVudCwgY29tcF9vYmplY3QsIGl0ZW1EaXYpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pO1xuICAgIGZsZXhDb250YWluZXIuYXBwZW5kQ2hpbGQod2lkZ2V0RGl2KTtcblxuICAgIC8vIENyZWF0ZSBidXR0b25zIGNvbnRhaW5lciBmb3IgYWxpZ25tZW50XG4gICAgY29uc3QgYnV0dG9uc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGJ1dHRvbnNDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZmxleCcsICdteC0yJyk7IC8vIFRvIGFsaWduIGJ1dHRvbnMgc2lkZSBieSBzaWRlIHdpdGggc29tZSBzcGFjaW5nXG5cblxuICAgIGNvbnN0IGlubmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgaW5uZXJEaXYuY2xhc3NMaXN0LmFkZCgncm91bmRlZCcsICdqdXN0aWZ5LWNlbnRlcicsICdpdGVtcy1jZW50ZXInLCAncC0xJywgJ20tMScsICdmbGV4JywgJ2ZsZXgtcm93Jyk7XG5cbiAgICBjb25zdCBidXR0b25fY2hhcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBidXR0b25fY2hhcnQuaW5uZXJUZXh0ID0gJ0FkZCBWaWV3JztcbiAgICBidXR0b25fY2hhcnQuY2xhc3NMaXN0LmFkZCgnYmctZ3JlZW4tNzAwJywgXCJwLTFcIiwgXCJ3LWZpdFwiLCBcImN1cnNvci1wb2ludGVyXCIsICd0ZXh0LXhzJylcbiAgICBidXR0b25fY2hhcnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5maW5kSW5kZXgob2JqZWN0ID0+IG9iamVjdC53aWRnZXRJZCA9PT0gZGl2LndpZGdldElkKTtcbiAgICAgIGNvbnN0IGNvbXBfb2JqZWN0ID0gdGhpcy5maW5kV2lkZ2V0QnlJZCh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLCBpdGVtLmlkKTtcbiAgICAgIHRoaXMuaW5zZXJ0Q2hhcnRXaWdldChjb21wX29iamVjdCwgaXRlbURpdik7XG4gICAgfSk7XG5cblxuICAgIGNvbnN0IGRlbF9idXR0b25fY2hhcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkZWxfYnV0dG9uX2NoYXJ0LmlubmVyVGV4dCA9ICdEZXRldGUnO1xuICAgIGRlbF9idXR0b25fY2hhcnQuY2xhc3NMaXN0LmFkZCgnYmctcmVkLTcwMCcsIFwicC0xXCIsIFwidy1maXRcIiwgXCJjdXJzb3ItcG9pbnRlclwiLCAndGV4dC14cycpXG4gICAgZGVsX2J1dHRvbl9jaGFydC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGxldCByZXN1bHQgPSBjb25maXJtKFwiPGk+QXJlIFlvdSBTdXJlPzwvaT5cIiwgXCJEZWxldGUgVmlld1wiKTtcbiAgICAgIHJlc3VsdC50aGVuKChkaWFsb2dSZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKGRpYWxvZ1Jlc3VsdCkge1xuICAgICAgICAgIGxldCB3aWRnZXRJbmRleCA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuZmluZEluZGV4KG9iamVjdCA9PiBvYmplY3Qud2lkZ2V0SWQgPT09IGRpdi53aWRnZXRJZCk7XG4gICAgICAgICAgY29uc3QgbWFwZWRPYmplY3QgPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3dpZGdldEluZGV4XVxuICAgICAgICAgIGlmIChtYXBlZE9iamVjdC53aWRnZXROb2RlICYmIG1hcGVkT2JqZWN0LndpZGdldE5vZGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IG1hcEluZGV4ID0gbWFwZWRPYmplY3Qud2lkZ2V0Tm9kZS5maW5kSW5kZXgoaW5kID0+IGluZC5pZCA9PT0gaXRlbS5pZClcbiAgICAgICAgICAgIG1hcGVkT2JqZWN0LndpZGdldE5vZGUuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgICAgbm9kZS5jb21wQ29uZmlnLnZpZXdDb25maWcgPSBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZy5tYXAoY29uZmlnID0+IGNvbmZpZy52aWV3SWQpO1xuICAgICAgICAgICAgICBub2RlLmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMgPSBbXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbWFwZWRPYmplY3Qud2lkZ2V0Tm9kZS5zcGxpY2UobWFwSW5kZXgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXBlZE9iamVjdFsnZmlsdGVySWQnXSA9IChtYXBlZE9iamVjdC5maWx0ZXJzKSA/IG1hcGVkT2JqZWN0LmZpbHRlcnMuZmlsdGVySWQgOiBudWxsO1xuICAgICAgICAgIGRlbGV0ZSBtYXBlZE9iamVjdFsnZmlsdGVycyddO1xuICAgICAgICAgIG1hcGVkT2JqZWN0LmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMgPSBbXTtcbiAgICAgICAgICB0aGlzLnNlcnZpY2UuZWRpdEFwcFdpZGdldENvbmZpZyhtYXBlZE9iamVjdCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5nZXRBcHBQYWdlRGV0YWlsQ29uZmlnQnlQYWdlSWQoKVxuICAgICAgICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ1dpZGdldCBDcmVhdGlvbicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGl0ZW1EaXYucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cblxuICAgIC8vIGlubmVyRGl2LmFwcGVuZENoaWxkKGJ1dHRvbl9jaGFydCk7XG4gICAgLy8gaW5uZXJEaXYuYXBwZW5kQ2hpbGQoZGVsX2J1dHRvbl9jaGFydCk7XG4gICAgLy8gQXBwZW5kIGJ1dHRvbnMgdG8gYnV0dG9ucyBjb250YWluZXJcbiAgICBidXR0b25zQ29udGFpbmVyLmFwcGVuZENoaWxkKGJ1dHRvbl9jaGFydCk7XG4gICAgYnV0dG9uc0NvbnRhaW5lci5hcHBlbmRDaGlsZChkZWxfYnV0dG9uX2NoYXJ0KTtcblxuICAgIC8vIEFkZCB0aGUgYnV0dG9ucyBjb250YWluZXIgdG8gdGhlIGZsZXggY29udGFpbmVyXG4gICAgZmxleENvbnRhaW5lci5hcHBlbmRDaGlsZChidXR0b25zQ29udGFpbmVyKTtcbiAgICBpZiAoIXRoaXMuaXNEYXNoQm9hcmRDb250ZW50VHlwZVZpZXcpIHtcbiAgICB9XG4gICAgaXRlbURpdi5hcHBlbmRDaGlsZChmbGV4Q29udGFpbmVyKTtcbiAgICAvLyBpdGVtRGl2LmFwcGVuZENoaWxkKHdpZGdldERpdik7XG5cbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1EaXYpXG5cblxuXG4gIH1cblxuXG5cbiAgZmluZFdpZGdldEJ5SWQoY29uZmlnczogYW55W10sIGlkOiBzdHJpbmcpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGNvbmZpZ3MpIHtcbiAgICAgIGlmIChjb25maWcuaWQgPT09IGlkKSB7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLndpZGdldE5vZGUgJiYgY29uZmlnLndpZGdldE5vZGUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZmluZFdpZGdldEJ5SWQoY29uZmlnLndpZGdldE5vZGUsIGlkKTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBkZWxldGVXaWRnZXRCeUlkKGNvbmZpZ3M6IGFueVtdLCBpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IGNvbmZpZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChjb25maWdzW2ldLmlkID09PSBpZCkge1xuICAgICAgICBjb25maWdzLnNwbGljZShpLCAxKTtcbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnc1tpXS53aWRnZXROb2RlICYmIGNvbmZpZ3NbaV0ud2lkZ2V0Tm9kZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZGVsZXRlV2lkZ2V0QnlJZChjb25maWdzW2ldLndpZGdldE5vZGUsIGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsb2FkRHluYW1pY0NvbXBvbmVudChkYXRhLCBpbmRleE9iaiwgY29udGFpbmVyRWxlbWVudCk6IGFueSB7XG4gICAgY29uc3QgY29tcG9uZW50Q2xhc3MgPSB0aGlzLmNvbXBvbmVudENsYXNzTWFwW2RhdGEua3BpQ29uZmlnWydjb21wb25lbnROYW1lJ11dO1xuICAgIHRoaXMuQ29tcFJlZnMgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudENsYXNzKTtcbiAgICBjb25zdCBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UgPSB0aGlzLkNvbXBSZWZzLmluc3RhbmNlO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5jaGFydERhdGFTb3VyY2UgPSBkYXRhO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5rcGlfbmFtZSA9IFwiXCI7XG5cbiAgICBpbmRleE9iai5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzLnB1c2godGhpcy5Db21wUmVmcyk7XG4gICAgY29uc3QgY3NzQ2xhc3MgPSBcInctZnVsbFwiO1xuICAgIHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGNzc0NsYXNzKTtcbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBsb2FkRmlsdGVyQ29tcG9uZW50KGluZGV4T2JqLCBjb250YWluZXJFbGVtZW50LCBmaWx0ZXJJdGVtcywgY29udGV4dF9maWx0ZXIpIHtcblxuICAgIGxldCBzZWxlY3RlZERhdGVzID0geyBzdGFydERhdGU6IHRoaXMuZGVmYXVsdFN0YXJ0RGF0ZSwgZW5kRGF0ZTogdGhpcy5kZWZhdWx0RW5kRGF0ZSB9XG4gICAgY29uc3QgY29tcG9uZW50Q2xhc3MgPSB0aGlzLmNvbXBvbmVudENsYXNzTWFwWydBcHBBZHZhbmNlSGVhZGVyQ29tcG9uZW50J107XG4gICAgdGhpcy5Db21wUmVmcyA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50Q2xhc3MpO1xuICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZSA9IHRoaXMuQ29tcFJlZnMuaW5zdGFuY2U7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLnNlbGVjdGVkRGF0ZXMgPSBzZWxlY3RlZERhdGVzO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5maWx0ZXJJdGVtcyA9IGZpbHRlckl0ZW1zO1xuXG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmNvbnRleHRGaWx0ZXJJdGVtcyA9IGNvbnRleHRfZmlsdGVyO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5wYWdlVGl0bGUgPSB0aGlzLnBhZ2VUaXRsZTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuaXNFZGl0QnV0dG9uID0gZmFsc2U7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmlzQWR2YW5jZUJ1dHRvbiA9IHRydWU7XG5cbiAgICBpbmRleE9iai5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzLnB1c2godGhpcy5Db21wUmVmcyk7XG4gICAgY29uc3QgY3NzQ2xhc3MgPSBcInctZnVsbFwiO1xuICAgIHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGNzc0NsYXNzKTtcbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBsb2FkV2lkZ2V0RmlsdGVyQ29tcG9uZW50KGluZGV4T2JqLCBjb250YWluZXJFbGVtZW50LCBmaWx0ZXJJdGVtcykge1xuICAgIGxldCBzZWxlY3RlZERhdGVzID0geyBzdGFydERhdGU6IHRoaXMuZGVmYXVsdFN0YXJ0RGF0ZSwgZW5kRGF0ZTogdGhpcy5kZWZhdWx0RW5kRGF0ZSB9XG4gICAgY29uc3QgY29tcG9uZW50Q2xhc3MgPSB0aGlzLmNvbXBvbmVudENsYXNzTWFwWydBZHZhbmNlV2lkZ2V0SGVhZGVyRmlsdGVyQ29tcG9uZW50J107XG4gICAgdGhpcy5Db21wUmVmcyA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50Q2xhc3MpO1xuICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZSA9IHRoaXMuQ29tcFJlZnMuaW5zdGFuY2U7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLnNlbGVjdGVkRGF0ZXMgPSBzZWxlY3RlZERhdGVzO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5maWx0ZXJJdGVtcyA9IGZpbHRlckl0ZW1zO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5nZXRXaWRnZXRGaWx0ZXJDb25maWcuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLmdldFdpZGdldEZpbHRlckZvclRlbXBsYXRlKHZhbHVlKTtcbiAgICB9KTtcblxuICAgIGluZGV4T2JqLmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMucHVzaCh0aGlzLkNvbXBSZWZzKTtcbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBnZXREZWxldGVWaWV3RnJvbUNvbmZpZyhpbmRleCkge1xuICAgIGNvbnNvbGUubG9nKGluZGV4KTtcbiAgICB0aGlzLmFsbFdpZGdldElubmVyQ29udGVudC5zcGxpY2UoaW5kZXgsIDEpXG4gIH1cblxuICBtb3ZlSXRlbUZvclBhZ2VWaWV3KGluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogJ3VwJyB8ICdkb3duJyk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgbW92aW5nIGJleW9uZCBhcnJheSBib3VuZHNcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZS5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpcmVjdGlvbiA9PT0gJ3VwJyA/IGluZGV4IC0gMSA6IGluZGV4ICsgMTtcbiAgICAvLyBQcmV2ZW50IG1vdmluZyBiZXlvbmQgYXJyYXkgYm91bmRzXG4gICAgaWYgKG5ld1Bvc2l0aW9uIDwgMCB8fCBuZXdQb3NpdGlvbiA+PSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUubGVuZ3RoKSByZXR1cm47XG5cbiAgICAvLyBNb3ZlIGl0ZW1cbiAgICBjb25zdCBpdGVtVG9Nb3ZlID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlW2luZGV4XTtcbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUuc3BsaWNlKGluZGV4LCAxKTsgLy8gUmVtb3ZlIGl0ZW0gZnJvbSBjdXJyZW50IHBvc2l0aW9uXG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaXRlbVRvTW92ZSk7IC8vIEluc2VydCBpdGVtIGluIG5ldyBwb3NpdGlvblxuICB9XG4gIG1vdmVJdGVtRm9yQ29sdW1ucyhpbmRleDogbnVtYmVyLCBkaXJlY3Rpb246ICd1cCcgfCAnZG93bicpOiB2b2lkIHtcbiAgICAvLyBQcmV2ZW50IG1vdmluZyBiZXlvbmQgYXJyYXkgYm91bmRzXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmFsbFdpZGdldElubmVyQ29udGVudC5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpcmVjdGlvbiA9PT0gJ3VwJyA/IGluZGV4IC0gMSA6IGluZGV4ICsgMTtcbiAgICAvLyBQcmV2ZW50IG1vdmluZyBiZXlvbmQgYXJyYXkgYm91bmRzXG4gICAgaWYgKG5ld1Bvc2l0aW9uIDwgMCB8fCBuZXdQb3NpdGlvbiA+PSB0aGlzLmFsbFdpZGdldElubmVyQ29udGVudC5sZW5ndGgpIHJldHVybjtcblxuICAgIC8vIE1vdmUgaXRlbVxuICAgIGNvbnN0IGl0ZW1Ub01vdmUgPSB0aGlzLmFsbFdpZGdldElubmVyQ29udGVudFtpbmRleF07XG4gICAgdGhpcy5hbGxXaWRnZXRJbm5lckNvbnRlbnQuc3BsaWNlKGluZGV4LCAxKTsgLy8gUmVtb3ZlIGl0ZW0gZnJvbSBjdXJyZW50IHBvc2l0aW9uXG4gICAgdGhpcy5hbGxXaWRnZXRJbm5lckNvbnRlbnQuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpdGVtVG9Nb3ZlKTsgLy8gSW5zZXJ0IGl0ZW0gaW4gbmV3IHBvc2l0aW9uXG4gIH1cblxuICBtb3ZlSXRlbUZvcldpZGdldChpbmRleDogbnVtYmVyLCBkaXJlY3Rpb246ICd1cCcgfCAnZG93bicpOiB2b2lkIHtcbiAgICAvLyBQcmV2ZW50IG1vdmluZyBiZXlvbmQgYXJyYXkgYm91bmRzXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlyZWN0aW9uID09PSAndXAnID8gaW5kZXggLSAxIDogaW5kZXggKyAxO1xuICAgIC8vIFByZXZlbnQgbW92aW5nIGJleW9uZCBhcnJheSBib3VuZHNcbiAgICBpZiAobmV3UG9zaXRpb24gPCAwIHx8IG5ld1Bvc2l0aW9uID49IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAvLyBNb3ZlIGl0ZW1cbiAgICBjb25zdCBpdGVtVG9Nb3ZlID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1tpbmRleF07XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5zcGxpY2UoaW5kZXgsIDEpOyAvLyBSZW1vdmUgaXRlbSBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaXRlbVRvTW92ZSk7IC8vIEluc2VydCBpdGVtIGluIG5ldyBwb3NpdGlvblxuICB9XG5cbiAgZ2V0RWRpdFZpZXdGcm9tTGF5b3V0KGRhdGEsIGluZGV4KSB7XG5cbiAgICB0aGlzLmlzRWRpdE1haW5MYXlvdXQgPSB0cnVlO1xuICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSBpbmRleDtcbiAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gdHJ1ZTtcbiAgICB0aGlzLmlzRGVmYXVsdFZpZXcgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ2hhcnRCdXR0b25DbGljayA9IGZhbHNlO1xuICAgIHRoaXMuaXNVcGRhdGVXaWRnZXQgPSBmYWxzZTtcbiAgICB0aGlzLndpZGdldE5hbWUgPSBkYXRhLndpZGdldE5hbWU7XG4gICAgdGhpcy53aWRnZXRUaXRsZSA9IGRhdGEud2lkZ2V0VGl0bGU7XG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcklkID0gZGF0YS5maWx0ZXJzLmZpbHRlcklkO1xuICAgIHRoaXMuYWRkZWR3aWRHZXRDb25maWcgPSBkYXRhLndpZGdldFByb3BlcnRpZXM7XG4gIH1cblxuXG4gIGJhY2tUb01haW5WaWV3KCkge1xuICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IHRydWU7XG4gICAgdGhpcy5pc1VwZGF0ZVdpZGdldCA9IGZhbHNlO1xuICAgIHRoaXMuaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ2hhcnRCdXR0b25DbGljayA9IGZhbHNlO1xuICAgIHRoaXMuaXNFZGl0TWFpbkxheW91dCA9IGZhbHNlO1xuICAgIHRoaXMuaXNsYXlvdXRDcmVhdGUgPSBmYWxzZTtcbiAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJJZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZpbHRlclZpZXdzKCkge1xuICAgIGlmICh0aGlzLnZpZXdUb1NlYXJjaC50cmltKCkgIT09ICcnKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkQ29tcG9uZW50Q29uZmlnID0gdGhpcy5jb21wb25lbnRDb25maWdEYXRhU291cmNlLmZpbHRlcigoaXRlbTogYW55KSA9PlxuICAgICAgICBpdGVtLnZpZXdOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy52aWV3VG9TZWFyY2gudG9Mb3dlckNhc2UoKSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRDb21wb25lbnRDb25maWcgPSB0aGlzLmNvbXBvbmVudENvbmZpZ0RhdGFTb3VyY2U7XG4gICAgfVxuICB9XG5cbiAgZWRpdENvbXBvbmVudFZpZXdzKGl0ZW0pIHtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5lZGl0SXRlbUZvclVwZGF0ZSA9IGl0ZW07XG4gICAgaWYgKHRoaXMuaXNVcGRhdGVXaWRnZXQgJiYgIXRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlld0lkID0gaXRlbS52aWV3SWQ7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0NyZWF0ZU5ld1ZpZXdXaXRoRGVmYXVsdFZpZXcgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgfSwgNDAwKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbmF2aWdhdGlvbjogTmF2aWdhdGlvbkV4dHJhcyA9IHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAndmlld0lkJzogaXRlbS52aWV3SWQsXG4gICAgICAgICAgJ3BhZ2VJZCc6IHRoaXMucGFnZUlkXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2FwcHMvY29udHJvbFBhbmVsL2FwcGxpY2F0aW9uQ29udGVudC9hcHBsaWNhdGlvblZpZXdzJ10sIG5hdmlnYXRpb24pO1xuICAgIH1cbiAgfVxuICBlZGl0Q29tcG9uZW50RGF0YXNldHMoaXRlbSkge1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXRJdGVtRm9yVXBkYXRlID0gaXRlbTtcbiAgICBpZiAodGhpcy5pc1VwZGF0ZVdpZGdldCAmJiAhdGhpcy5pc0NoYXJ0QnV0dG9uQ2xpY2spIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhc2V0SWQgPSBpdGVtLmRhdGFzZXRJZDtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzQ3JlYXRlRGF0YXNldFdpdGhEYXRhc2V0SWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgfSwgNDAwKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbmF2aWdhdGlvbjogTmF2aWdhdGlvbkV4dHJhcyA9IHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAndmlld0lkJzogaXRlbS52aWV3SWQsXG4gICAgICAgICAgJ3BhZ2VJZCc6IHRoaXMucGFnZUlkXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2FwcHMvY29udHJvbFBhbmVsL2FwcGxpY2F0aW9uQ29udGVudC9hcHBsaWNhdGlvblZpZXdzJ10sIG5hdmlnYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIGdldEFsbFBhZ2UoKSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydhcHBzL2NvbnRyb2xQYW5lbC9hcHBsaWNhdGlvbkNvbnRlbnQvYXBwbGljYXRpb25EYXNoYm9hcmQnXSk7XG4gIH1cblxuICB0cmFuc2Zvcm1Db2x1bW5zRm9yQ29sdW1ucyhpbnB1dENvbHVtbnMpIHtcbiAgICBjb25zdCBjb2x1bW5zID0gW107XG5cbiAgICBpbnB1dENvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgY29sdW1ucy5wdXNoKHtcbiAgICAgICAgZGF0YUZpZWxkOiBjb2wuZGF0YUZpZWxkLFxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICBjYXB0aW9uOiBjb2wuY2FwdGlvbixcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cblxuXG4gIGdldENyZWF0ZURhdGFTZXRQYWdlKCkge1xuICAgIHRoaXMuaXNDcmVhdGVEYXRhc2V0ID0gdHJ1ZTtcbiAgfVxuXG4gIGdldENyZWF0ZVZpZXdQYWdlKCkge1xuXG4gICAgdGhpcy5zZWxlY3RlZFZpZXdJZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmlzQ3JlYXRlTmV3VmlldyA9IHRydWU7XG4gICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgIH0sIDQwMCk7XG4gIH1cblxuXG4gIGdldEVtaXROZXdDaGFydENvbmdpZyhldmVudCkge1xuICAgIGRlbGV0ZSBldmVudC5rcGlDb25maWcuZGF0YVNvdXJjZTtcbiAgICB0aGlzLmVkaXRJdGVtRm9yVXBkYXRlWydrcGlDb25maWcnXSA9IGV2ZW50LmtwaUNvbmZpZztcblxuICAgIGNvbnNvbGUubG9nKHRoaXMuZWRpdEl0ZW1Gb3JVcGRhdGUpO1xuICAgIHRoaXMuc2VydmljZS51cGRhdGVBcHBWaWV3Q29uZmlnKHRoaXMuZWRpdEl0ZW1Gb3JVcGRhdGUpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNFZGl0T3B0aW9uQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcygnVmlldyBVcGRhdGUgU3VjY2Vzc2Z1bGx5JylcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdWaWV3IENyZWF0aW9uJylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cblxuICBnZXRWaWV3UGFnZSgpIHtcbiAgICBsZXQgbmF2aWdhdGlvbkV4dHJhczogTmF2aWdhdGlvbkV4dHJhcyA9IHtcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgIFwicGFnZUlkXCI6IHRoaXMucGFnZUlkXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLnBhZ2VVcmxdLCBuYXZpZ2F0aW9uRXh0cmFzKVxuXG4gIH1cbiAgLy8gbm9kZXByb3BlcnRpY2UgZmlsdGVyIFxuXG4gIGdldE5vZGVQcm9wZXJ0aWNlRmlsdGVyT3B0aW9uKCkge1xuICAgIGxldCBvYmogPSB7XG4gICAgICBpbnB1dF90eXBlOiBcInRleHRcIixcbiAgICAgIHNlcnZlcl9jb2x1bW46IFwiXCIsXG4gICAgICBsb2NhbF9jb2x1bW46IFwiXCIsXG4gICAgICBzZWxlY3RfYm94X29wdGlvbjogXCJcIixcbiAgICB9XG4gICAgdGhpcy5ub2RlUHJvcGVydGljZUZpbHRlcnMucHVzaChvYmopXG4gIH1cblxuICBkZWxldGVOb2RlRmlsdGVyKGluZGV4KSB7XG4gICAgdGhpcy5ub2RlUHJvcGVydGljZUZpbHRlcnMuc3BsaWNlKGluZGV4LCAxKVxuICB9XG5cbiAgc2V0RGF0YVNldHNMaW1pdChkYXRhc2V0KSB7XG4gICAgbGV0IGxpbWl0ID0geyBcImxpbWl0XCI6IFwiMTBcIiB9XG4gICAgZGF0YXNldC5jb25maWcucXVlcnlDb25maWcucmVxRmllbGRzLnB1c2gobGltaXQpO1xuICAgIHJldHVybiBkYXRhc2V0O1xuICB9XG5cbiAgc2V0RGF0YVNldHNMaW1pdEZvclNxbChkYXRhc2V0KSB7XG4gICAgY29uc3QgbGltaXRJbmRleCA9IGRhdGFzZXQuY29uZmlnLnF1ZXJ5Q29uZmlnLm1hcGVkRmlsdGVycy5maW5kSW5kZXgoZmlsdGVyID0+IGZpbHRlci5zZXJ2ZXJDb2x1bW4gPT09ICdsaW1pdCcpO1xuXG4gICAgaWYgKGxpbWl0SW5kZXggPT09IC0xKSB7XG4gICAgICBkYXRhc2V0LmNvbmZpZy5xdWVyeUNvbmZpZy5tYXBlZEZpbHRlcnMucHVzaCh7XG4gICAgICAgIGxvY2FsQ29sdW1uOiBcImxpbWl0XCIsXG4gICAgICAgIHNlcnZlckNvbHVtbjogXCJsaW1pdFwiLFxuICAgICAgICBvcGVyYXRvck5hbWU6IFwiZXFcIixcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcIjEwMFwiLFxuICAgICAgICBkYXRhVHlwZTogXCJzdHJpbmdcIlxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGFzZXQuY29uZmlnLnF1ZXJ5Q29uZmlnLm1hcGVkRmlsdGVyc1tsaW1pdEluZGV4XS5kZWZhdWx0VmFsdWUgPSBcIjEwXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGFzZXQ7XG4gIH1cblxuICBnZXRWaWV3UG9wdXBIaWRlKGUpIHtcbiAgICB0aGlzLmdldEFsbFZpZXdzSXRlbXMoKTtcbiAgfVxuXG4gIGdldERhdGFzZXRQb3B1cEhpZGUoZSkge1xuXG4gIH1cblxuICBzdWJtaXRGaWx0ZXIoKSB7XG5cbiAgfVxuXG4gIGdldFdpZGdldEZpbHRlckZvclRlbXBsYXRlKHZhbHVlKSB7XG4gICAgdGhpcy5nZXREYXRhU2V0KCk7XG4gIH1cblxuICBnZXREZWxldGVWaWV3RnJvbUxheW91dChpdGVtLCBpKSB7XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5zcGxpY2UoaSwgMSk7XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKHdpZGdldCA9PiB7XG4gICAgICB3aWRnZXQuY29tcENvbmZpZy52aWV3Q29uZmlnID0gd2lkZ2V0LmNvbXBDb25maWcudmlld0NvbmZpZy5tYXAoY29uZmlnID0+IGNvbmZpZy52aWV3SWQpO1xuICAgICAgd2lkZ2V0LmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMgPSBbXTtcbiAgICAgIGlmICh3aWRnZXQud2lkZ2V0Tm9kZSAmJiB3aWRnZXQud2lkZ2V0Tm9kZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHdpZGdldC53aWRnZXROb2RlLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgbm9kZS5jb21wQ29uZmlnLnZpZXdDb25maWcgPSBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZy5tYXAoY29uZmlnID0+IGNvbmZpZy52aWV3SWQpO1xuICAgICAgICAgIG5vZGUuY29tcENvbmZpZy5keW5hbWljQ29tcG9uZW50UmVmcyA9IFtdO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KVxuICAgIGNvbnN0IHdpZGdldERhdGEgPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZztcbiAgICB3aWRnZXREYXRhWyd3aWRnZXRzJ10gPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLm1hcChpdGVtID0+IGl0ZW0ud2lkZ2V0SWQpO1xuICAgIHdpZGdldERhdGFbJ2ZpbHRlcklkJ10gPSAod2lkZ2V0RGF0YS5maWx0ZXJzKSA/IHdpZGdldERhdGEuZmlsdGVycy5maWx0ZXJJZCA6IG51bGw7XG4gICAgZGVsZXRlIHdpZGdldERhdGFbJ2ZpbHRlcnMnXTtcblxuICAgIHRoaXMuc2VydmljZS5lZGl0QXBwUGFnZUNvbmZpZyh3aWRnZXREYXRhKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKFwiTGF5b3V0IERlbGV0ZWQgU3VjY2Vzc2Z1bGx5XCIpXG4gICAgICAgIHRoaXMuZ2V0QXBwUGFnZURldGFpbENvbmZpZ0J5UGFnZUlkKClcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdXaWRnZXQgQ3JlYXRpb24nKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG4gIC8vIGFkdmFuY2UgTGF5b3V0IFxuICBpc0FkdmFuY2VMYXlvdXQ6IGJvb2xlYW47XG4gIGlzUHJvY2VlZDogYm9vbGVhbjtcbiAgc2VsZWN0ZWRWaWV3c0lkczogYW55ID0gW107XG4gIGFkdmFuY2VMYXlvdXRDb250YWluZXI6IGFueSA9IFtdO1xuICBnZXRQcm9jZXNzRm9yQ29uZmlnKCkge1xuICAgIHRoaXMuYWR2YW5jZUxheW91dENvbnRhaW5lciA9IFtdO1xuICAgIGNvbnN0IGZpbHRlcmVkQ29sdW1ucyA9IHRoaXMuY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZS5maWx0ZXIoY29sdW1uID0+IHRoaXMuc2VsZWN0ZWRWaWV3c0lkcy5pbmNsdWRlcyhjb2x1bW4udmlld0lkKSk7XG4gICAgY29uc3QgY29sdW1uRGVmTGlzdCA9IFtdO1xuXG4gICAgZmlsdGVyZWRDb2x1bW5zLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAvLyBjb25zdCBleGlzdGluZ0NvbHVtbiA9IGZhbHNlO1xuICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgXCJpZFwiOiB0aGlzLmNvbW1vblNlcnZpY2UucHJpbWVyeVJlbmRvbWVJZCg1KSxcbiAgICAgICAgXCJub2RlVGl0bGVcIjogXCJcIixcbiAgICAgICAgXCJjb21wQ29uZmlnXCI6IHtcbiAgICAgICAgICBcImR5bmFtaWNDb21wb25lbnRSZWZzXCI6IFtdLFxuICAgICAgICAgIFwidmlld0NvbmZpZ1wiOiBbZWxlbWVudF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWx0ZXJJZFwiOiBudWxsLFxuICAgICAgICBcIm5vZGVQcm9wZXJ0aWVzXCI6IHtcbiAgICAgICAgICBcImRpc3BsYXlcIjogdHJ1ZSxcbiAgICAgICAgICBcIndpZGdldFRpdGxlXCI6IFwiXCIsXG4gICAgICAgICAgXCJ3aWR0aFwiOiBcIlwiLFxuICAgICAgICAgIFwiaGVpZ2h0XCI6IFwiXCIsXG4gICAgICAgICAgXCJpc1dpZGdldEZpbHRlclwiOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmFkdmFuY2VMYXlvdXRDb250YWluZXIucHVzaChvYmopO1xuXG4gICAgfSk7XG5cbiAgICB0aGlzLmlzUHJvY2VlZCA9IHRydWU7XG4gIH1cblxuICBnZXRTZWxlY3RlZENvbHVtblNvdXJjZShldmVudCkge1xuICAgIGlmIChldmVudC5ldmVudCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZXdzSWRzID0gZXZlbnQudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgc3VibWl0QWR2YW5jZVZpZXcoKSB7XG4gICAgaWYgKHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZSAmJiB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUgPSBbLi4udGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlLCAuLi50aGlzLmFkdmFuY2VMYXlvdXRDb250YWluZXJdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUgPSB0aGlzLmFkdmFuY2VMYXlvdXRDb250YWluZXI7XG4gICAgfVxuICAgIHRoaXMuaXNBZHZhbmNlTGF5b3V0ID0gZmFsc2U7XG4gICAgdGhpcy5hZHZhbmNlTGF5b3V0Q29udGFpbmVyID0gW107XG4gICAgdGhpcy5pc1Byb2NlZWQgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZVdpZGdldCgpO1xuICB9XG5cblxuXG4gIGRlbGV0ZVZpZXcoaSkge1xuXG4gIH1cbn1cbiIsIjxhcHAtbG9hZGluZyAqbmdJZj1cImxvYWRpbmdNb2RhbFwiPjwvYXBwLWxvYWRpbmc+XG5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGgtWzkwdmhdIHctZnVsbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3LTMvNCBib3JkZXItciBoLWZ1bGwgZmxleCBmbGV4LWNvbCBweC0yXCI+XG4gICAgICAgIDwhLS0gU2Nyb2xsYWJsZSBjb250ZW50IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93IG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIG15LTNcIiAjZHluYW1pY0NvbnRhaW5lcj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBGaXhlZCBib3R0b20gc2VjdGlvbiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIGgtMTYgbS0yIGJvcmRlciBzaHJpbmstMFwiPlxuICAgICAgICAgICAgPGxpYi1jb21tb24taGVhZGVyIFtwYWdlVGl0bGVdPVwiJydcIj48L2xpYi1jb21tb24taGVhZGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9tZH19IG0tMlwiIChjbGljayk9XCJhZGRXaWRnZXQoKVwiPkFkZCBMYXlvdXQ8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuT3RoZXJzUHVycGxlfX0gbS0yIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImdldFZpZXdQYWdlKClcIj5WaWV3IFBhZ2U8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInctMS80IHAtMiBoLWZ1bGxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRGFzaEJvYXJkQ29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5EYXJrQmxhY2t9fSBtLTIgdy1maXQgdGV4dC1jZW50ZXIgY3Vyc2FyLXBvaW50ZXJcIiAoY2xpY2spPVwiYmFja1RvTWFpblZpZXcoKVwiPlxuICAgICAgICAgICAgICAgIEJhY2tcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwYWdlX2NvbmZpZy5hcGlfY29uZmlnOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIGJvcmRlci1iXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIHB5LTIgZm9udC1ib2xkICB0ZXh0LXdoaXRlIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS53aWRHZXRDb25maWcud2lkZ2V0VGl0bGV9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggc3BhY2UteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxidXR0b24gKGNsaWNrKT1cImVkaXRTZWxlY3RlZFdpZGdldChpdGVtLCBpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTggaC04IGJnLXNreS02MDAgaG92ZXI6YmctYmx1ZS04MDAgdGV4dC13aGl0ZSByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWVkaXRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTggaC04IGJnLXJlZC02MDAgaG92ZXI6YmctcmVkLTgwMCB0ZXh0LXdoaXRlIHJvdW5kZWQtZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxoNiBjbGFzcz1cIm1iLTIgZm9udC1ib2xkIHRleHQtbGcgdHJhY2tpbmctdGlnaHQgdGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGUgYm9yZGVyLWIgcGItM1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzbGF5b3V0Q3JlYXRlXCI+V2lkZ2V0IFNldHRpbmdzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNsYXlvdXRDcmVhdGVcIj5MYXlvdXQgU2V0dGluZ3M8L3NwYW4+XG4gICAgICAgICAgICA8L2g2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbXktNFwiPlxuICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggY2xhc3M9XCJtbC1hdXRvXCIgWyhuZ01vZGVsKV09XCJhZGRlZHdpZEdldENvbmZpZy5kaXNwbGF5XCIgdGV4dD1cIkRpc3BsYXlcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItMiBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbWQgbXktYXV0byBweC0yXCI+V2lkdGg8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggY2xhc3M9XCJ3LTEvMlwiIFtpdGVtc109XCJ3aWRnZXRfd2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImFkZGVkd2lkR2V0Q29uZmlnLndpZHRoXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBtYi0yIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tZCBteS1hdXRvIHB4LTJcIj5IZWlnaHQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IGNsYXNzPVwidy0xLzJcIiBbKG5nTW9kZWwpXT1cImFkZGVkd2lkR2V0Q29uZmlnLmhlaWdodFwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItMiBqdXN0aWZ5LWJldHdlZW5cIiAqbmdJZj1cIiFpc2xheW91dENyZWF0ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG15LWF1dG8gcHgtMiBpbmxpbmVcIj5XaWRnZXQgVGl0bGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggY2xhc3M9XCJ3LWZ1bGxcIiBbKG5nTW9kZWwpXT1cIndpZGdldFRpdGxlXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItMiBqdXN0aWZ5LWJldHdlZW5cIiAqbmdJZj1cIiFpc2xheW91dENyZWF0ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG15LWF1dG8gcHgtMlwiPldpZGdldCBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IGNsYXNzPVwidy1mdWxsXCIgWyhuZ01vZGVsKV09XCJ3aWRnZXROYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG1iLTUganVzdGlmeS1iZXR3ZWVuXCIgKm5nSWY9XCJpc2xheW91dENyZWF0ZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1zbSBteS1hdXRvIHB4LTJcIj5MYXlvdXQgVGl0bGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IGNsYXNzPVwidy0xLzJcIiBbKG5nTW9kZWwpXT1cImFkZGVkd2lkR2V0Q29uZmlnLndpZGdldFRpdGxlXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBtYi0yIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tZCBteS1hdXRvIHB4LTJcIj5GaWx0ZXI8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggY2xhc3M9XCJ3LTEvMlwiIFtpdGVtc109XCJmaWx0ZXJEYXRhU291cmNlXCIgZGlzcGxheUV4cHI9XCJmaWx0ZXJOYW1lXCIgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlRXhwcj1cImZpbHRlcklkXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZpbHRlcklkXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImdldEZpbHRlclZhbHVlQnlJZCgkZXZlbnQpXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVXBkYXRlV2lkZ2V0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTZcIiAqbmdJZj1cIiFpc2xheW91dENyZWF0ZSAmJiBpc0VkaXRNYWluTGF5b3V0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW25ld1dpZGdldEluZGV4XS53aWRnZXROb2RlO2xldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIGZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBib3JkZXItYiBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBweS0yIGZvbnQtYm9sZCAgdGV4dC13aGl0ZSBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS5ub2RlUHJvcGVydGllcy53aWRnZXRUaXRsZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggc3BhY2UteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSAwXCIgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JQYWdlVmlldyhpLCAndXAnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy11cFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpICE9PSAgZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbbmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUubGVuZ3RoIC0gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvclBhZ2VWaWV3KGksICdkb3duJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctZG93blwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy04IGgtOCBiZy1yZWQtNjAwIGhvdmVyOmJnLXJlZC04MDAgdGV4dC13aGl0ZSByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVXBkYXRlV2lkZ2V0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gcHktMSBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj4gQXBwbGljYXRpb24gVmlld3NcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyLXggYm9yZGVyLWIgcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYWxsV2lkZ2V0SW5uZXJDb250ZW50OyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAgIHctZnVsbCBmbGV4IGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBmb250LWJvbGQgIHB5LTIgY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLnZpZXdOYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHNwYWNlLXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gMFwiIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9zbX19IGN1cnNvci1wb2ludGVyIG14LTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yQ29sdW1ucyhpLCAndXAnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy11cFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IGFsbFdpZGdldElubmVyQ29udGVudC5sZW5ndGggLSAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9zbX19IGN1cnNvci1wb2ludGVyIG14LTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yQ29sdW1ucyhpLCAnZG93bicpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LWRvd25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicm91bmRlZC1mdWxsIHAtMiB0ZXh0LXdoaXRlIGJnLWJsdWUtNTAwIGhvdmVyOmJnLWJsdWUtNzAwIG1iLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRDb21wb25lbnRWaWV3cyhpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1leWVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicm91bmRlZC1mdWxsIHAtMiB0ZXh0LXdoaXRlIGJnLWJsdWUtNTAwIGhvdmVyOmJnLWJsdWUtNzAwIG1iLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRDb21wb25lbnREYXRhc2V0cyhpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1kYXRhYmFzZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyb3VuZGVkLWZ1bGwgcC0yIHRleHQtd2hpdGUgYmctcmVkLTUwMCBob3ZlcjpiZy1yZWQtNzAwIG1iLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdldERlbGV0ZVZpZXdGcm9tQ29uZmlnKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1VwZGF0ZVdpZGdldFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHB5LTEgZm9udC1leHRyYWJvbGQgYm9yZGVyLWIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSBweC0yXCI+IEFkZCBGaWx0ZXIgRm9yIFZpZXdcblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3JkZXIteCBib3JkZXItYiBwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgcHktMyBib3JkZXItYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNoZWNrLWJveCBbKG5nTW9kZWwpXT1cImFkZGVkd2lkR2V0Q29uZmlnLmlzV2lkZ2V0RmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PVwiUG9wdXAgQ29sdW1ucyBGaWx0ZXIgRW5hYmxlXCI+PC9keC1jaGVjay1ib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBteS0yIGJvcmRlci1iXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIG5vZGVQcm9wZXJ0aWNlRmlsdGVyczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBib3JkZXItYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSB3LTEvM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWRcIj5JbnB1dCBUeXBlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWyd0ZXh0J11cIiBbKG5nTW9kZWwpXT1cIml0ZW0uaW5wdXRfdHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJ0ZXh0XCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEtMSB3LTIvM1wiICpuZ0lmPVwiaXRlbS5pbnB1dF90eXBlID09ICd0ZXh0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWRcIj5TZXJ2ZXIgQ29sdW1uPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLnNlcnZlcl9jb2x1bW5cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEtMSB3LTEvMlwiICpuZ0lmPVwiaXRlbS5pbnB1dF90eXBlID09ICd0ZXh0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWRcIj5Mb2NhbCBDb2x1bW48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0ubG9jYWxfY29sdW1uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xLTEgdy0xLzNcIiAqbmdJZj1cIml0ZW0uaW5wdXRfdHlwZSA9PSAnc2VsZWN0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWRcIj5Db2x1bW5zIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0uc2VsZWN0X2JveF9vcHRpb25cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEtMSB3LTEvMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9kYW5nZXJfc219fSB3LTI0IG10LTYgdGV4dC1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlTm9kZUZpbHRlcihpKVwiPkRlbGV0ZSBGaWx0ZXI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9zbX19IHctYXV0byB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0Tm9kZVByb3BlcnRpY2VGaWx0ZXJPcHRpb24oKVwiPkFkZFxuICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1lbmQgaXRlbXMtY2VudGVyIGgtMTYgbS0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5EYXJrQmxhY2t9fSBtLTIgdy1maXQgdGV4dC1jZW50ZXIgY3Vyc2FyLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYmFja1RvTWFpblZpZXcoKVwiPkJhY2tcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVXBkYXRlV2lkZ2V0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc2xheW91dENyZWF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19tZH19IG0tMiB3LWZpdCB0ZXh0LWNlbnRlciBjdXJzYXItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTGF5b3V0VE92aWV3KClcIj5BZGQgVmlld1xuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc2xheW91dENyZWF0ZSAmJiAhaXNFZGl0TWFpbkxheW91dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9tZH19IG0tMiB3LWZpdCB0ZXh0LWNlbnRlciBjdXJzYXItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkV2lkZ2V0VE92aWV3KClcIj5BZGQgTGF5b3V0XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzbGF5b3V0Q3JlYXRlICYmIGlzRWRpdE1haW5MYXlvdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfbWR9fSBtLTIgdy1maXQgdGV4dC1jZW50ZXIgY3Vyc2FyLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZUxheW91dFdpZGdldFRPdmlldygpXCI+VXBkYXRlIExheW91dFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fd2FybmluZ19tZH19IG0tMiB3LWZpdCB0ZXh0LWNlbnRlciBjdXJzYXItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVUb1ZpZXcoKVwiICpuZ0lmPVwiaXNVcGRhdGVXaWRnZXRcIj5VcGRhdGUgVmlld1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICA8IS0tIDxwcmU+PGNvZGU+e3tkYXNoQm9hcmRXaWRnZXRDb25maWcgfCBqc29ufX08L2NvZGU+PC9wcmU+IC0tPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzQ2hhcnRCdXR0b25DbGlja1wiPlxuICAgICAgICAgICAgPGg2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYi0yIGZvbnQtYm9sZCB0ZXh0LW1kIHRyYWNraW5nLXRpZ2h0IHRleHQtZ3JheS05MDAgZGFyazp0ZXh0LXdoaXRlIGJvcmRlci1iIHBiLTMgZmxleCAgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1iYXItY2hhcnQtbyBtci0yXCI+PC9pPiBTZWxlY3QgVmlld1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuRGFya0JsYWNrfX0gbS0yIHctZml0IHRleHQtY2VudGVyIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJhY2tUb01haW5WaWV3KClcIj5CYWNrXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2g2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiBoLVs4MHZoXSBvdmVyZmxvdy14LWF1dG9cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgbXktMiBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJ2aWV3VG9TZWFyY2hcIiAoa2V5dXApPVwiZmlsdGVyVmlld3MoKVwiIChrZXlkb3duKT1cImZpbHRlclZpZXdzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJiZy1ncmF5LTgwMCBib3JkZXIgYm9yZGVyLWdyYXktNzAwIHRleHQtZ3JheS0yMDAgdGV4dC1zbSBmb2N1czpyaW5nLWdyYXktNDAwIGZvY3VzOmJvcmRlci1ncmF5LTUwMCBibG9jayB3LWZ1bGwgcC00IGgtOCByb3VuZGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFZpZXdcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImFic29sdXRlIGluc2V0LXktMCByaWdodC0wIGZsZXggaXRlbXMtY2VudGVyIHByLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInJvdGF0ZS05MCBjdXJzb3ItcG9pbnRlclwiIFtzdmdJY29uXT1cIidoZXJvaWNvbnNfb3V0bGluZTpzZWFyY2gnXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJlZENvbXBvbmVudENvbmZpZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZ3JvdXAgbXktMyB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSXRlbSBWaWV3IE5hbWUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBmb250LWJvbGQgYm9yZGVyLWIgcHktMiBjdXJzYXItcG9pbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS52aWV3TmFtZX19PC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSG92ZXIgQnV0dG9ucyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIHRvcC0wICByaWdodC0wIGZsZXggc3BhY2UteC0yIG9wYWNpdHktMCBncm91cC1ob3ZlcjpvcGFjaXR5LTEwMCB0cmFuc2l0aW9uLW9wYWNpdHkgZHVyYXRpb24tMzAwIHBiLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicm91bmRlZC1mdWxsIHAtMiB0ZXh0LXdoaXRlIGJnLWJsdWUtNTAwIGhvdmVyOmJnLWJsdWUtNzAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGVuY2lsLXNxdWFyZS1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0Q29tcG9uZW50Vmlld3MoaXRlbSlcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJvdW5kZWQtZnVsbCBwLTIgdGV4dC13aGl0ZSBiZy1ncmVlbi01MDAgaG92ZXI6YmctZ3JlZW4tNzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdldENvbXBvbmVudENvbmZpZyhpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXNcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRGVmYXVsdFZpZXdcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAgbXktMyB3LWZ1bGwgZmxleCBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIGZvbnQtYm9sZCAgcHktMiBjdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLndpZGdldFRpdGxlfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggc3BhY2UteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gMFwiIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9zbX19IGN1cnNvci1wb2ludGVyIG14LTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvcldpZGdldChpLCAndXAnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IGRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9zbX19IGN1cnNvci1wb2ludGVyIG14LTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvcldpZGdldChpLCAnZG93bicpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy1kb3duXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicm91bmRlZC1mdWxsIHAtMiB0ZXh0LXdoaXRlIGJnLWJsdWUtNTAwIGhvdmVyOmJnLWJsdWUtNzAwIG1iLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXRFZGl0Vmlld0Zyb21MYXlvdXQoaXRlbSxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGVuY2lsLXNxdWFyZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicm91bmRlZC1mdWxsIHAtMiB0ZXh0LXdoaXRlIGJnLXJlZC01MDAgaG92ZXI6YmctcmVkLTcwMCBtYi0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0RGVsZXRlVmlld0Zyb21MYXlvdXQoaXRlbSxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPCEtLSA8L2Rpdj4gLS0+XG5cbjxkeC1wb3B1cCBbKHZpc2libGUpXT1cImlzRWRpdE9wdGlvbkNsaWNrXCIgW2Nsb3NlT25PdXRzaWRlQ2xpY2tdPVwiZmFsc2VcIiBbZHJhZ0VuYWJsZWRdPVwiZmFsc2VcIiBbd2lkdGhdPVwiMTIwMFwiXG4gICAgW2hlaWdodF09XCInYXV0bydcIiBbc2hvd1RpdGxlXT1cInRydWVcIiBjbGFzcz1cInBvcHVwXCIgdGl0bGU9XCJ7e2VkaXRWaWV3ZGF0YVNvdXJjZU1vZGFsLnZpZXdOYW1lfX1cIj5cbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCI+XG5cbiAgICAgICAgPGFwcC1kYXNoLWNoYXJ0IFtkYXRhc2V0bW9kYWxdPVwiZWRpdFZpZXdkYXRhU291cmNlTW9kYWxcIiAoZ2V0Q2hhcnRDb25maWdPdXRQdXQpPVwiZ2V0RW1pdE5ld0NoYXJ0Q29uZ2lnKCRldmVudClcIlxuICAgICAgICAgICAgKm5nSWY9XCJlZGl0Vmlld2RhdGFTb3VyY2VNb2RhbC52aWV3VHlwZSA9PSAnY2hhcnQnXCI+PC9hcHAtZGFzaC1jaGFydD5cbiAgICAgICAgPGFwcC1kYXNoLXRhYmxlIFtkYXRhc2V0bW9kYWxdPVwiZWRpdFZpZXdkYXRhU291cmNlTW9kYWxcIiAoZ2V0VGFibGVDb25maWdPdXRQdXQpPVwiZ2V0RW1pdE5ld0NoYXJ0Q29uZ2lnKCRldmVudClcIlxuICAgICAgICAgICAgKm5nSWY9XCJlZGl0Vmlld2RhdGFTb3VyY2VNb2RhbC52aWV3VHlwZSA9PSAndGFibGUnXCI+PC9hcHAtZGFzaC10YWJsZT5cbiAgICAgICAgPCEtLSA8YXBwLWRhc2gtb3RoZXIgW2RhdGFzZXRtb2RhbF09XCJlZGl0Vmlld2RhdGFTb3VyY2VNb2RhbFwiICpuZ0lmPVwiZWRpdFZpZXdkYXRhU291cmNlTW9kYWwudmlld1R5cGUgPT0gJ290aGVycydcIlxuICAgICAgICAgICAgKGNyZWF0ZU90aGVyQ29tcG9uZW50Vmlldyk9XCJnZXRFbWl0TmV3Q2hhcnRDb25naWcoJGV2ZW50KVwiPjwvYXBwLWRhc2gtb3RoZXI+IC0tPlxuICAgIDwvZGl2PlxuPC9keC1wb3B1cD5cblxuXG48ZHgtcG9wdXAgWyh2aXNpYmxlKV09XCJpc0NyZWF0ZURhdGFzZXRcIiBbY2xvc2VPbk91dHNpZGVDbGlja109XCJmYWxzZVwiIFtkcmFnRW5hYmxlZF09XCJmYWxzZVwiIFt3aWR0aF09XCIxMjAwXCJcbiAgICBbaGVpZ2h0XT1cIjYwMFwiIFtzaG93VGl0bGVdPVwidHJ1ZVwiIGNsYXNzPVwicG9wdXBcIiB0aXRsZT1cIkRhdGFzZXQgRWRpdG9yXCI+XG4gICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjb250ZW50J1wiPlxuICAgICAgICA8ZHgtc2Nyb2xsLXZpZXcgY2xhc3M9XCJoLWZ1bGxcIiBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInMTAwJSdcIj5cbiAgICAgICAgICAgIDxhcHAtY3JlYXRlLWRhdGFzZXQgW2lzSGVhZGVyXT1cImZhbHNlXCI+PC9hcHAtY3JlYXRlLWRhdGFzZXQ+XG4gICAgICAgIDwvZHgtc2Nyb2xsLXZpZXc+XG4gICAgPC9kaXY+XG48L2R4LXBvcHVwPlxuPGR4LXBvcHVwIFsodmlzaWJsZSldPVwiaXNDcmVhdGVEYXRhc2V0V2l0aERhdGFzZXRJZFwiIFtjbG9zZU9uT3V0c2lkZUNsaWNrXT1cImZhbHNlXCIgW2RyYWdFbmFibGVkXT1cImZhbHNlXCIgW3dpZHRoXT1cIjEyMDBcIlxuICAgIFtoZWlnaHRdPVwiNjAwXCIgW3Nob3dUaXRsZV09XCJ0cnVlXCIgY2xhc3M9XCJwb3B1cFwiIHRpdGxlPVwiRGF0YXNldCBFZGl0b3JcIiAob25IaWRkZW4pPVwiZ2V0RGF0YXNldFBvcHVwSGlkZSgkZXZlbnQpXCI+XG4gICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjb250ZW50J1wiPlxuICAgICAgICA8ZHgtc2Nyb2xsLXZpZXcgY2xhc3M9XCJoLWZ1bGxcIiBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInMTAwJSdcIj5cbiAgICAgICAgICAgIDxhcHAtY3JlYXRlLWRhdGFzZXQgW3NlbGVjdGVkRGF0YXNldElkXT1cInNlbGVjdGVkRGF0YXNldElkXCIgW2lzSGVhZGVyXT1cImZhbHNlXCI+PC9hcHAtY3JlYXRlLWRhdGFzZXQ+XG4gICAgICAgIDwvZHgtc2Nyb2xsLXZpZXc+XG4gICAgPC9kaXY+XG48L2R4LXBvcHVwPlxuXG48ZHgtcG9wdXAgWyh2aXNpYmxlKV09XCJpc0NyZWF0ZU5ld1ZpZXdXaXRoRGVmYXVsdFZpZXdcIiBbY2xvc2VPbk91dHNpZGVDbGlja109XCJmYWxzZVwiIFtkcmFnRW5hYmxlZF09XCJmYWxzZVwiXG4gICAgW3dpZHRoXT1cIjEyMDBcIiBbaGVpZ2h0XT1cIjYwMFwiIFtzaG93VGl0bGVdPVwidHJ1ZVwiIGNsYXNzPVwicG9wdXBcIiB0aXRsZT1cIlZpZXdzIEVkaXRvclwiXG4gICAgKG9uSGlkZGVuKT1cImdldFZpZXdQb3B1cEhpZGUoJGV2ZW50KVwiPlxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIj5cbiAgICAgICAgPGR4LXNjcm9sbC12aWV3IGNsYXNzPVwiaC1mdWxsXCIgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzEwMCUnXCI+XG4gICAgICAgICAgICA8YXBwLWNyZWF0ZS1jb21wLXZpZXcgW3NlbGVjdGVkVmlld0lkXT1cInNlbGVjdGVkVmlld0lkXCIgW2lzSGVhZGVyXT1cImZhbHNlXCI+PC9hcHAtY3JlYXRlLWNvbXAtdmlldz5cbiAgICAgICAgPC9keC1zY3JvbGwtdmlldz5cbiAgICA8L2Rpdj5cbjwvZHgtcG9wdXA+XG48ZHgtcG9wdXAgWyh2aXNpYmxlKV09XCJpc0NyZWF0ZU5ld1ZpZXdcIiBbY2xvc2VPbk91dHNpZGVDbGlja109XCJmYWxzZVwiIFtkcmFnRW5hYmxlZF09XCJmYWxzZVwiIFt3aWR0aF09XCIxMjAwXCJcbiAgICBbaGVpZ2h0XT1cIjYwMFwiIFtzaG93VGl0bGVdPVwidHJ1ZVwiIGNsYXNzPVwicG9wdXBcIiB0aXRsZT1cIlZpZXdzIEVkaXRvclwiPlxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIj5cbiAgICAgICAgPGR4LXNjcm9sbC12aWV3IGNsYXNzPVwiaC1mdWxsXCIgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzEwMCUnXCI+XG4gICAgICAgICAgICA8YXBwLWNyZWF0ZS1jb21wLXZpZXcgW2lzSGVhZGVyXT1cImZhbHNlXCI+PC9hcHAtY3JlYXRlLWNvbXAtdmlldz5cbiAgICAgICAgPC9keC1zY3JvbGwtdmlldz5cbiAgICA8L2Rpdj5cbjwvZHgtcG9wdXA+XG5cblxuPGR4LXBvcHVwIFsodmlzaWJsZSldPVwiaXNXaWRnZXRGaWx0ZXJzXCIgW2Nsb3NlT25PdXRzaWRlQ2xpY2tdPVwiZmFsc2VcIiBbZHJhZ0VuYWJsZWRdPVwiZmFsc2VcIiBbd2lkdGhdPVwiODAwXCIgW2hlaWdodF09XCI0MDBcIlxuICAgIFtzaG93VGl0bGVdPVwidHJ1ZVwiIGNsYXNzPVwicG9wdXBcIiB0aXRsZT1cIkRhdGFzZXQgRmlsdGVyXCI+XG4gICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjb250ZW50J1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXktMlwiPlxuICAgICAgICAgICAgPGR4LXNjcm9sbC12aWV3IFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIic4NSUnXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2U7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0uY29sdW1uTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydnZXQnLCdsZXQnXVwiIFsobmdNb2RlbCldPVwiaXRlbS5vcGVyYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiT3BlcmF0b3JcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLnZhbHVlXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPC9keC1zY3JvbGwtdmlldz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kIG14LTEgZmxleC1ncm93XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19tZH19IGN1cnNvci1wb2ludGVyIG10LTJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3VibWl0RmlsdGVyKClcIj5TdWJtaXQ8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG48L2R4LXBvcHVwPlxuPGR4LXBvcHVwIFsodmlzaWJsZSldPVwiaXNBZHZhbmNlTGF5b3V0XCIgW2Nsb3NlT25PdXRzaWRlQ2xpY2tdPVwiZmFsc2VcIiBbZHJhZ0VuYWJsZWRdPVwiZmFsc2VcIiBbd2lkdGhdPVwiMTIwMFwiXG4gICAgW2hlaWdodF09XCI3MDBcIiBbc2hvd1RpdGxlXT1cInRydWVcIiBjbGFzcz1cInBvcHVwXCIgdGl0bGU9XCJEYXRhc2V0IEZpbHRlclwiPlxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgcHgtMiBtYi0zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0yLzMgbWItMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5TZWxlY3QgVmlld3M8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGFnLWJveCBbZGF0YVNvdXJjZV09XCJjb21wb25lbnRDb25maWdEYXRhU291cmNlXCIgdmFsdWVFeHByPVwidmlld0lkXCIgZGlzcGxheUV4cHI9XCJ2aWV3TmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIFttdWx0aWxpbmVdPVwidHJ1ZVwiIFtzaG93U2VsZWN0aW9uQ29udHJvbHNdPVwidHJ1ZVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRWaWV3c0lkc1wiXG4gICAgICAgICAgICAgICAgICAgIFttYXhEaXNwbGF5ZWRUYWdzXT1cIjNcIiAob25WYWx1ZUNoYW5nZWQpPVwiZ2V0U2VsZWN0ZWRDb2x1bW5Tb3VyY2UoJGV2ZW50KVwiIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICA8L2R4LXRhZy1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvMyBweC0yXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9tZH19IG10LTZcIiAoY2xpY2spPVwiZ2V0UHJvY2Vzc0ZvckNvbmZpZygpXCI+XG4gICAgICAgICAgICAgICAgICAgIEFkZCBUbyBWaWV3XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9kYW5nZXJfbWR9fSBjdXJzb3ItcG9pbnRlciBtdC02XCIgKGNsaWNrKT1cImNhbmNlbENkckNvbmZpZygpXCI+Q2FuY2VsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4gLS0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkeC1zY3JvbGwtdmlldyBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInODAlJ1wiPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0yIGJvcmRlci1iXCIgKm5nSWY9XCJpc1Byb2NlZWRcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGFkdmFuY2VMYXlvdXRDb250YWluZXI7IGxldCBpID0gaW5kZXg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG0tMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+VmlldyBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5jb21wQ29uZmlnLnZpZXdDb25maWdbMF0udmlld05hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5XaWRnZXQgVGl0bGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZGdldFRpdGxlXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5XaWRnZXQgV2lkdGg8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cIndpZGdldF93aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5ub2RlUHJvcGVydGllcy53aWR0aFwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5XaWRnZXQgSGVpZ2h0PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5ub2RlUHJvcGVydGllcy5oZWlnaHRcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5XaWRnZXQgRmlsdGVyPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cImZpbHRlckRhdGFTb3VyY2VcIiBkaXNwbGF5RXhwcj1cImZpbHRlck5hbWVcIiBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVFeHByPVwiZmlsdGVySWRcIiBbKG5nTW9kZWwpXT1cIml0ZW0uZmlsdGVySWRcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbXQtOFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IFsobmdNb2RlbCldPVwiaXRlbS5ub2RlUHJvcGVydGllcy5kaXNwbGF5XCIgdGV4dD1cIkRpc3BsYXlcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9kYW5nZXJfc219fSBjdXJzb3ItcG9pbnRlciBtdC04XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVZpZXcoaSlcIj48aSBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9keC1zY3JvbGwtdmlldz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgbXgtMSBteS0yIGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19tZH19IGN1cnNvci1wb2ludGVyIG10LTJcIiAoY2xpY2spPVwic3VibWl0QWR2YW5jZVZpZXcoKVwiPkFkZFxuICAgICAgICAgICAgICAgIExheW91dDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZHgtcG9wdXA+Il19
|