@pega/angular-sdk-components 0.24.1 → 0.24.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/_bridge/angular-pconnect.mjs +5 -5
- package/esm2022/lib/_bridge/component-mapper/component-mapper.component.mjs +4 -4
- package/esm2022/lib/_bridge/helpers/sdk_component_map.mjs +1 -1
- package/esm2022/lib/_components/designSystemExtension/alert/alert.component.mjs +4 -4
- package/esm2022/lib/_components/designSystemExtension/alert-banner/alert-banner.component.mjs +4 -4
- package/esm2022/lib/_components/designSystemExtension/banner/banner.component.mjs +4 -4
- package/esm2022/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.mjs +5 -5
- package/esm2022/lib/_components/designSystemExtension/field-group/field-group.component.mjs +3 -3
- package/esm2022/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.mjs +5 -5
- package/esm2022/lib/_components/designSystemExtension/material-details/material-details.component.mjs +5 -5
- package/esm2022/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.mjs +5 -5
- package/esm2022/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.mjs +5 -5
- package/esm2022/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.mjs +4 -4
- package/esm2022/lib/_components/designSystemExtension/material-utility/material-utility.component.mjs +5 -5
- package/esm2022/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.mjs +5 -5
- package/esm2022/lib/_components/designSystemExtension/operator/operator.component.mjs +5 -5
- package/esm2022/lib/_components/designSystemExtension/pulse/pulse.component.mjs +4 -4
- package/esm2022/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.mjs +4 -4
- package/esm2022/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.mjs +3 -3
- package/esm2022/lib/_components/field/auto-complete/auto-complete.component.mjs +5 -5
- package/esm2022/lib/_components/field/cancel-alert/cancel-alert.component.mjs +5 -5
- package/esm2022/lib/_components/field/check-box/check-box.component.mjs +5 -5
- package/esm2022/lib/_components/field/currency/currency.component.mjs +32 -17
- package/esm2022/lib/_components/field/date/date.component.mjs +6 -6
- package/esm2022/lib/_components/field/date-time/date-time.component.mjs +14 -43
- package/esm2022/lib/_components/field/decimal/decimal.component.mjs +37 -10
- package/esm2022/lib/_components/field/dropdown/dropdown.component.mjs +5 -5
- package/esm2022/lib/_components/field/email/email.component.mjs +5 -5
- package/esm2022/lib/_components/field/group/group.component.mjs +5 -5
- package/esm2022/lib/_components/field/integer/integer.component.mjs +5 -5
- package/esm2022/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.mjs +3 -3
- package/esm2022/lib/_components/field/multiselect/multiselect.component.mjs +5 -5
- package/esm2022/lib/_components/field/multiselect/utils.mjs +2 -2
- package/esm2022/lib/_components/field/percentage/percentage.component.mjs +25 -8
- package/esm2022/lib/_components/field/phone/phone.component.mjs +5 -5
- package/esm2022/lib/_components/field/radio-buttons/radio-buttons.component.mjs +5 -5
- package/esm2022/lib/_components/field/rich-text/rich-text.component.mjs +5 -5
- package/esm2022/lib/_components/field/scalar-list/scalar-list.component.mjs +5 -5
- package/esm2022/lib/_components/field/semantic-link/semantic-link.component.mjs +5 -5
- package/esm2022/lib/_components/field/text/text.component.mjs +5 -5
- package/esm2022/lib/_components/field/text-area/text-area.component.mjs +5 -5
- package/esm2022/lib/_components/field/text-content/text-content.component.mjs +5 -5
- package/esm2022/lib/_components/field/text-input/text-input.component.mjs +5 -5
- package/esm2022/lib/_components/field/time/time.component.mjs +5 -5
- package/esm2022/lib/_components/field/url/url.component.mjs +5 -5
- package/esm2022/lib/_components/field/user-reference/user-reference.component.mjs +38 -26
- package/esm2022/lib/_components/infra/Containers/flow-container/flow-container.component.mjs +19 -12
- package/esm2022/lib/_components/infra/Containers/flow-container/helpers.mjs +1 -1
- package/esm2022/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.mjs +3 -3
- package/esm2022/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.mjs +5 -5
- package/esm2022/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.mjs +3 -3
- package/esm2022/lib/_components/infra/Containers/view-container/view-container.component.mjs +10 -10
- package/esm2022/lib/_components/infra/action-buttons/action-buttons.component.mjs +3 -3
- package/esm2022/lib/_components/infra/assignment/assignment.component.mjs +27 -6
- package/esm2022/lib/_components/infra/assignment-card/assignment-card.component.mjs +4 -4
- package/esm2022/lib/_components/infra/dashboard-filter/dashboard-filter.component.mjs +5 -5
- package/esm2022/lib/_components/infra/defer-load/defer-load.component.mjs +5 -5
- package/esm2022/lib/_components/infra/error-boundary/error-boundary.component.mjs +3 -3
- package/esm2022/lib/_components/infra/multi-step/multi-step.component.mjs +6 -6
- package/esm2022/lib/_components/infra/navbar/navbar.component.mjs +9 -7
- package/esm2022/lib/_components/infra/reference/reference.component.mjs +5 -5
- package/esm2022/lib/_components/infra/region/region.component.mjs +4 -4
- package/esm2022/lib/_components/infra/root-container/root-container.component.mjs +5 -5
- package/esm2022/lib/_components/infra/stages/stages.component.mjs +5 -5
- package/esm2022/lib/_components/infra/view/view.component.mjs +5 -5
- package/esm2022/lib/_components/template/app-shell/app-shell.component.mjs +5 -5
- package/esm2022/lib/_components/template/banner-page/banner-page.component.mjs +5 -5
- package/esm2022/lib/_components/template/case-summary/case-summary.component.mjs +6 -6
- package/esm2022/lib/_components/template/case-view/case-view.component.mjs +6 -6
- package/esm2022/lib/_components/template/confirmation/confirmation.component.mjs +5 -5
- package/esm2022/lib/_components/template/data-reference/data-reference.component.mjs +5 -5
- package/esm2022/lib/_components/template/default-form/default-form.component.mjs +5 -5
- package/esm2022/lib/_components/template/details/details.component.mjs +5 -5
- package/esm2022/lib/_components/template/details-narrow-wide/details-narrow-wide.component.mjs +5 -5
- package/esm2022/lib/_components/template/details-one-column/details-one-column.component.mjs +5 -5
- package/esm2022/lib/_components/template/details-sub-tabs/details-sub-tabs.component.mjs +5 -5
- package/esm2022/lib/_components/template/details-three-column/details-three-column.component.mjs +5 -5
- package/esm2022/lib/_components/template/details-two-column/details-two-column.component.mjs +5 -5
- package/esm2022/lib/_components/template/details-wide-narrow/details-wide-narrow.component.mjs +5 -5
- package/esm2022/lib/_components/template/dynamic-tabs/dynamic-tabs.component.mjs +5 -5
- package/esm2022/lib/_components/template/field-group-list/field-group-list.component.mjs +4 -4
- package/esm2022/lib/_components/template/field-group-template/field-group-template.component.mjs +5 -5
- package/esm2022/lib/_components/template/field-value-list/field-value-list.component.mjs +3 -3
- package/esm2022/lib/_components/template/inline-dashboard/inline-dashboard.component.mjs +4 -4
- package/esm2022/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.mjs +5 -5
- package/esm2022/lib/_components/template/list-page/list-page.component.mjs +4 -4
- package/esm2022/lib/_components/template/list-view/DefaultViewMeta.mjs +1 -1
- package/esm2022/lib/_components/template/list-view/list-view.component.mjs +7 -7
- package/esm2022/lib/_components/template/list-view/listViewHelpers.mjs +1 -1
- package/esm2022/lib/_components/template/list-view/utils.mjs +1 -1
- package/esm2022/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.mjs +5 -5
- package/esm2022/lib/_components/template/narrow-wide-form/narrow-wide-form.component.mjs +4 -4
- package/esm2022/lib/_components/template/one-column/one-column.component.mjs +4 -4
- package/esm2022/lib/_components/template/one-column-page/one-column-page.component.mjs +4 -4
- package/esm2022/lib/_components/template/one-column-tab/one-column-tab.component.mjs +4 -4
- package/esm2022/lib/_components/template/page/page.component.mjs +5 -5
- package/esm2022/lib/_components/template/promoted-filters/promoted-filters.component.mjs +5 -5
- package/esm2022/lib/_components/template/repeating-structures/repeating-structures.component.mjs +5 -5
- package/esm2022/lib/_components/template/simple-table/simple-table.component.mjs +5 -5
- package/esm2022/lib/_components/template/simple-table-manual/helpers.mjs +1 -1
- package/esm2022/lib/_components/template/simple-table-manual/simple-table-manual.component.mjs +6 -6
- package/esm2022/lib/_components/template/simple-table-select/simple-table-select.component.mjs +5 -5
- package/esm2022/lib/_components/template/single-reference-readonly/single-reference-readonly.component.mjs +4 -4
- package/esm2022/lib/_components/template/sub-tabs/sub-tabs.component.mjs +5 -5
- package/esm2022/lib/_components/template/three-column/three-column.component.mjs +4 -4
- package/esm2022/lib/_components/template/three-column-page/three-column-page.component.mjs +4 -4
- package/esm2022/lib/_components/template/two-column/two-column.component.mjs +4 -4
- package/esm2022/lib/_components/template/two-column-page/two-column-page.component.mjs +5 -5
- package/esm2022/lib/_components/template/two-column-tab/two-column-tab.component.mjs +4 -4
- package/esm2022/lib/_components/template/utils.mjs +1 -1
- package/esm2022/lib/_components/template/wide-narrow-form/wide-narrow-form.component.mjs +4 -4
- package/esm2022/lib/_components/template/wide-narrow-page/wide-narrow-page.component.mjs +5 -5
- package/esm2022/lib/_components/template/wss-nav-bar/wss-nav-bar.component.mjs +5 -5
- package/esm2022/lib/_components/widget/app-announcement/app-announcement.component.mjs +4 -4
- package/esm2022/lib/_components/widget/attachment/attachment.component.mjs +5 -5
- package/esm2022/lib/_components/widget/case-history/case-history.component.mjs +6 -6
- package/esm2022/lib/_components/widget/feed-container/feed-container.component.mjs +5 -5
- package/esm2022/lib/_components/widget/file-utility/file-utility.component.mjs +18 -18
- package/esm2022/lib/_components/widget/list-utility/list-utility.component.mjs +6 -6
- package/esm2022/lib/_components/widget/quick-create/quick-create.component.mjs +5 -5
- package/esm2022/lib/_components/widget/todo/todo.component.mjs +6 -6
- package/esm2022/lib/_components/widget/utility/utility.component.mjs +5 -5
- package/esm2022/lib/_directives/thousand-seperator.directive.mjs +5 -5
- package/esm2022/lib/_helpers/case-utils.mjs +1 -1
- package/esm2022/lib/_helpers/currency-utils.mjs +1 -1
- package/esm2022/lib/_helpers/event-util.mjs +1 -1
- package/esm2022/lib/_helpers/field-group-utils.mjs +1 -1
- package/esm2022/lib/_helpers/filter-utils.mjs +1 -1
- package/esm2022/lib/_helpers/formatters/boolean.mjs +1 -1
- package/esm2022/lib/_helpers/formatters/currency.mjs +1 -1
- package/esm2022/lib/_helpers/formatters/date.mjs +1 -1
- package/esm2022/lib/_helpers/formatters/format-utils.mjs +1 -1
- package/esm2022/lib/_helpers/formatters/index.mjs +1 -1
- package/esm2022/lib/_helpers/tab-utils.mjs +1 -1
- package/esm2022/lib/_helpers/template-utils.mjs +4 -4
- package/esm2022/lib/_helpers/utils.mjs +5 -5
- package/esm2022/lib/_messages/error-messages.service.mjs +3 -3
- package/esm2022/lib/_messages/get-login-status.service.mjs +3 -3
- package/esm2022/lib/_messages/oauth-response.service.mjs +3 -3
- package/esm2022/lib/_messages/progress-spinner.service.mjs +3 -3
- package/esm2022/lib/_messages/reset-pconnect.service.mjs +3 -3
- package/esm2022/lib/_messages/update-worklist.service.mjs +3 -3
- package/esm2022/lib/_services/case.service.mjs +4 -4
- package/esm2022/lib/_services/datapage.service.mjs +5 -5
- package/esm2022/lib/_services/server-config.service.mjs +3 -3
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/pega-angular-sdk-components.mjs +675 -608
- package/fesm2022/pega-angular-sdk-components.mjs.map +1 -1
- package/lib/_components/field/currency/currency.component.d.ts +4 -5
- package/lib/_components/field/date-time/date-time.component.d.ts +0 -1
- package/lib/_components/field/decimal/decimal.component.d.ts +9 -1
- package/lib/_components/field/percentage/percentage.component.d.ts +4 -0
- package/lib/_components/field/user-reference/user-reference.component.d.ts +9 -4
- package/lib/_components/infra/assignment/assignment.component.d.ts +2 -0
- package/lib/_components/widget/file-utility/file-utility.component.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -88,7 +88,7 @@ export class ListViewComponent {
|
|
|
88
88
|
/** If compositeKeys is defined, use dynamic value, else fallback to pyID or pyGUID. */
|
|
89
89
|
this.compositeKeys = this.configProps$?.compositeKeys;
|
|
90
90
|
this.rowID = this.compositeKeys && this.compositeKeys?.length === 1 ? this.compositeKeys[0] : defRowID;
|
|
91
|
-
this.bShowSearch$ = this.utils.getBooleanValue(this.configProps$.globalSearch ? this.configProps$.globalSearch : this.payload
|
|
91
|
+
this.bShowSearch$ = this.utils.getBooleanValue(this.configProps$.globalSearch ? this.configProps$.globalSearch : this.payload.globalSearch);
|
|
92
92
|
this.bColumnReorder$ = this.utils.getBooleanValue(this.configProps$.reorderFields);
|
|
93
93
|
this.bGrouping$ = this.utils.getBooleanValue(this.configProps$.grouping);
|
|
94
94
|
this.showDynamicFields = this.configProps$?.showDynamicFields;
|
|
@@ -1155,10 +1155,10 @@ export class ListViewComponent {
|
|
|
1155
1155
|
}
|
|
1156
1156
|
return select;
|
|
1157
1157
|
}
|
|
1158
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1159
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ListViewComponent, isStandalone: true, selector: "app-list-view", inputs: { pConn$: "pConn$", bInForm$: "bInForm$", payload: "payload" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], ngImport: i0, template: "<div class=\"psdk-list-header\">\n <div>\n <mat-form-field class=\"psdk-search\" *ngIf=\"bShowSearch$\">\n <mat-label><img class=\"psdk-icon-search\" src=\"{{ searchIcon$ }}\" /> <span class=\"psdk-search-label\">Search</span> </mat-label>\n <input matInput id=\"search\" (keyup)=\"applySearch($event)\" placeholder=\"\" />\n </mat-form-field>\n\n <div *ngIf=\"!bInForm$\" class=\"psdk-outer-div-in-form\">\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"bColumnReorder$\">\n <div>\n <table\n mat-table\n id=\"list-view\"\n [dataSource]=\"repeatList$\"\n matSort\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\" cdkDrag>\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"!bColumnReorder$\">\n <div>\n <table mat-table id=\"list-view\" [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n </div>\n <div *ngIf=\"bInForm$\">\n <div>\n <div class=\"psdk-inner-div-in-form\">\n <table id=\"list-view\" *ngIf=\"repeatListData.length > 0\" mat-table [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngIf=\"singleSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-radio-button [value]=\"row[rowID]\" (change)=\"fieldOnChange(row)\"></mat-radio-button>\n </td>\n </ng-container>\n <ng-container *ngIf=\"multiSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox [value]=\"row[rowID]\" (change)=\"onCheckboxClick(row, $event)\"></mat-checkbox>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n </th>\n <td mat-cell *matCellDef=\"let element\">{{ element[dCol.config.name] || '---' }}</td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n </table>\n <div *ngIf=\"repeatListData?.length === 0\">\n <table id=\"list-view\" *ngIf=\"repeatListData?.length === 0\" mat-table [dataSource]=\"repeatList$\">\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef>{{ dCol.config.label }}</th>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n </table>\n </div>\n <div class=\"psdk-no-records\" *ngIf=\"repeatListData?.length === 0\">No Records Found.</div>\n </div>\n </div>\n </div>\n\n <mat-paginator id=\"pagination\" *ngIf=\"bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500, 1000]\" showFirstLastButtons></mat-paginator>\n <mat-paginator id=\"pagination\" *ngIf=\"!bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500]\" showFirstLastButtons></mat-paginator>\n </div>\n\n <!-- pop overs for filters-->\n <div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n </div>\n</div>\n", styles: [".psdk-list-header{background-color:var(--app-form-color);padding:1rem;margin:.5rem;border-radius:.6125rem}table{width:100%}::ng-deep .mat-sort-header-content{white-space:nowrap}::ng-deep td.mat-mdc-cell{white-space:nowrap}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding:0rem .188rem}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:-moz-fit-content;width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:nowrap;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem;padding-right:.625rem}.psdk-icon-search{vertical-align:sub;padding:.125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{padding:1rem;overflow:hidden}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}.psdk-no-records{height:56px;justify-content:center;display:flex;align-items:center;border:1px solid var(--app-neutral-light-color);border-top:none}.psdk-table-field-link{color:var(--app-primary-color);padding:0;cursor:pointer;border:0;background-color:transparent;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(function () { return CommonModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i3.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatFormFieldModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i4.MatFormField; }), selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i0.forwardRef(function () { return i4.MatLabel; }), selector: "mat-label" }, { kind: "directive", type: i0.forwardRef(function () { return i4.MatSuffix; }), selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatInputModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i5.MatInput; }), selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatTableModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i6.MatTable; }), selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i0.forwardRef(function () { return i6.MatHeaderCellDef; }), selector: "[matHeaderCellDef]" }, { kind: "directive", type: i0.forwardRef(function () { return i6.MatHeaderRowDef; }), selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i0.forwardRef(function () { return i6.MatColumnDef; }), selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i0.forwardRef(function () { return i6.MatCellDef; }), selector: "[matCellDef]" }, { kind: "directive", type: i0.forwardRef(function () { return i6.MatRowDef; }), selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i0.forwardRef(function () { return i6.MatHeaderCell; }), selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i0.forwardRef(function () { return i6.MatCell; }), selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i0.forwardRef(function () { return i6.MatHeaderRow; }), selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i0.forwardRef(function () { return i6.MatRow; }), selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatSortModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i7.MatSort; }), selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i0.forwardRef(function () { return i7.MatSortHeader; }), selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return DragDropModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i8.CdkDropList; }), selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i0.forwardRef(function () { return i8.CdkDrag; }), selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatButtonModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i9.MatButton; }), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(function () { return i9.MatIconButton; }), selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatMenuModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i10.MatMenu; }), selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i0.forwardRef(function () { return i10.MatMenuItem; }), selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i0.forwardRef(function () { return i10.MatMenuTrigger; }), selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatIconModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i11.MatIcon; }), selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatRadioModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i12.MatRadioButton; }), selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatCheckboxModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i13.MatCheckbox; }), selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatPaginatorModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i14.MatPaginator; }), selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatSelectModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i15.MatSelect; }), selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i0.forwardRef(function () { return i16.MatOption; }), selector: "mat-option", exportAs: ["matOption"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatOptionModule; }) }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatDatepickerModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i17.MatDatepicker; }), selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i0.forwardRef(function () { return i17.MatDatepickerInput; }), selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i0.forwardRef(function () { return i17.MatDatepickerToggle; }), selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i0.forwardRef(function () { return ComponentMapperComponent; }), selector: "component-mapper", inputs: ["name", "props", "errorMsg", "outputEvents", "parent"] }] }); }
|
|
1158
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ListViewComponent, deps: [{ token: i1.ProgressSpinnerService }, { token: i2.Utils }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1159
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ListViewComponent, isStandalone: true, selector: "app-list-view", inputs: { pConn$: "pConn$", bInForm$: "bInForm$", payload: "payload" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], ngImport: i0, template: "<div class=\"psdk-list-header\">\n <div>\n <mat-form-field class=\"psdk-search\" *ngIf=\"bShowSearch$\">\n <mat-label><img class=\"psdk-icon-search\" src=\"{{ searchIcon$ }}\" /> <span class=\"psdk-search-label\">Search</span> </mat-label>\n <input matInput id=\"search\" (keyup)=\"applySearch($event)\" placeholder=\"\" />\n </mat-form-field>\n\n <div *ngIf=\"!bInForm$\" class=\"psdk-outer-div-in-form\">\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"bColumnReorder$\">\n <div>\n <table\n mat-table\n id=\"list-view\"\n [dataSource]=\"repeatList$\"\n matSort\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\" cdkDrag>\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"!bColumnReorder$\">\n <div>\n <table mat-table id=\"list-view\" [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n </div>\n <div *ngIf=\"bInForm$\">\n <div>\n <div class=\"psdk-inner-div-in-form\">\n <table id=\"list-view\" *ngIf=\"repeatListData.length > 0\" mat-table [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngIf=\"singleSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-radio-button [value]=\"row[rowID]\" (change)=\"fieldOnChange(row)\"></mat-radio-button>\n </td>\n </ng-container>\n <ng-container *ngIf=\"multiSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox [value]=\"row[rowID]\" (change)=\"onCheckboxClick(row, $event)\"></mat-checkbox>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n </th>\n <td mat-cell *matCellDef=\"let element\">{{ element[dCol.config.name] || '---' }}</td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n </table>\n <div *ngIf=\"repeatListData?.length === 0\">\n <table id=\"list-view\" *ngIf=\"repeatListData?.length === 0\" mat-table [dataSource]=\"repeatList$\">\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef>{{ dCol.config.label }}</th>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n </table>\n </div>\n <div class=\"psdk-no-records\" *ngIf=\"repeatListData?.length === 0\">No Records Found.</div>\n </div>\n </div>\n </div>\n\n <mat-paginator id=\"pagination\" *ngIf=\"bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500, 1000]\" showFirstLastButtons></mat-paginator>\n <mat-paginator id=\"pagination\" *ngIf=\"!bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500]\" showFirstLastButtons></mat-paginator>\n </div>\n\n <!-- pop overs for filters-->\n <div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n </div>\n</div>\n", styles: [".psdk-list-header{background-color:var(--app-form-color);padding:1rem;margin:.5rem;border-radius:.6125rem}table{width:100%}::ng-deep .mat-sort-header-content{white-space:nowrap}::ng-deep td.mat-mdc-cell{white-space:nowrap}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding:0rem .188rem}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:nowrap;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem;padding-right:.625rem}.psdk-icon-search{vertical-align:sub;padding:.125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{padding:1rem;overflow:hidden}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}.psdk-no-records{height:56px;justify-content:center;display:flex;align-items:center;border:1px solid var(--app-neutral-light-color);border-top:none}.psdk-table-field-link{color:var(--app-primary-color);padding:0;cursor:pointer;border:0;background-color:transparent;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "directive", type: i0.forwardRef(() => i3.NgForOf), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(() => i3.NgIf), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatFormFieldModule) }, { kind: "component", type: i0.forwardRef(() => i4.MatFormField), selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i0.forwardRef(() => i4.MatLabel), selector: "mat-label" }, { kind: "directive", type: i0.forwardRef(() => i4.MatSuffix), selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatInputModule) }, { kind: "directive", type: i0.forwardRef(() => i5.MatInput), selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatTableModule) }, { kind: "component", type: i0.forwardRef(() => i6.MatTable), selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatHeaderCellDef), selector: "[matHeaderCellDef]" }, { kind: "directive", type: i0.forwardRef(() => i6.MatHeaderRowDef), selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatColumnDef), selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatCellDef), selector: "[matCellDef]" }, { kind: "directive", type: i0.forwardRef(() => i6.MatRowDef), selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatHeaderCell), selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i0.forwardRef(() => i6.MatCell), selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i0.forwardRef(() => i6.MatHeaderRow), selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i0.forwardRef(() => i6.MatRow), selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatSortModule) }, { kind: "directive", type: i0.forwardRef(() => i7.MatSort), selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i0.forwardRef(() => i7.MatSortHeader), selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: i0.forwardRef(() => DragDropModule) }, { kind: "directive", type: i0.forwardRef(() => i8.CdkDropList), selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i0.forwardRef(() => i8.CdkDrag), selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatButtonModule) }, { kind: "component", type: i0.forwardRef(() => i9.MatButton), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(() => i9.MatIconButton), selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatMenuModule) }, { kind: "component", type: i0.forwardRef(() => i10.MatMenu), selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i0.forwardRef(() => i10.MatMenuItem), selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i0.forwardRef(() => i10.MatMenuTrigger), selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatIconModule) }, { kind: "component", type: i0.forwardRef(() => i11.MatIcon), selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatRadioModule) }, { kind: "component", type: i0.forwardRef(() => i12.MatRadioButton), selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatCheckboxModule) }, { kind: "component", type: i0.forwardRef(() => i13.MatCheckbox), selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatPaginatorModule) }, { kind: "component", type: i0.forwardRef(() => i14.MatPaginator), selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatSelectModule) }, { kind: "component", type: i0.forwardRef(() => i15.MatSelect), selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i0.forwardRef(() => i16.MatOption), selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatOptionModule) }, { kind: "ngmodule", type: i0.forwardRef(() => MatDatepickerModule) }, { kind: "component", type: i0.forwardRef(() => i17.MatDatepicker), selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i0.forwardRef(() => i17.MatDatepickerInput), selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i0.forwardRef(() => i17.MatDatepickerToggle), selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i0.forwardRef(() => ComponentMapperComponent), selector: "component-mapper", inputs: ["name", "props", "errorMsg", "outputEvents", "parent"] }] }); }
|
|
1160
1160
|
}
|
|
1161
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1161
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ListViewComponent, decorators: [{
|
|
1162
1162
|
type: Component,
|
|
1163
1163
|
args: [{ selector: 'app-list-view', standalone: true, imports: [
|
|
1164
1164
|
CommonModule,
|
|
@@ -1179,8 +1179,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
1179
1179
|
MatOptionModule,
|
|
1180
1180
|
MatDatepickerModule,
|
|
1181
1181
|
forwardRef(() => ComponentMapperComponent)
|
|
1182
|
-
], template: "<div class=\"psdk-list-header\">\n <div>\n <mat-form-field class=\"psdk-search\" *ngIf=\"bShowSearch$\">\n <mat-label><img class=\"psdk-icon-search\" src=\"{{ searchIcon$ }}\" /> <span class=\"psdk-search-label\">Search</span> </mat-label>\n <input matInput id=\"search\" (keyup)=\"applySearch($event)\" placeholder=\"\" />\n </mat-form-field>\n\n <div *ngIf=\"!bInForm$\" class=\"psdk-outer-div-in-form\">\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"bColumnReorder$\">\n <div>\n <table\n mat-table\n id=\"list-view\"\n [dataSource]=\"repeatList$\"\n matSort\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\" cdkDrag>\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"!bColumnReorder$\">\n <div>\n <table mat-table id=\"list-view\" [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n </div>\n <div *ngIf=\"bInForm$\">\n <div>\n <div class=\"psdk-inner-div-in-form\">\n <table id=\"list-view\" *ngIf=\"repeatListData.length > 0\" mat-table [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngIf=\"singleSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-radio-button [value]=\"row[rowID]\" (change)=\"fieldOnChange(row)\"></mat-radio-button>\n </td>\n </ng-container>\n <ng-container *ngIf=\"multiSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox [value]=\"row[rowID]\" (change)=\"onCheckboxClick(row, $event)\"></mat-checkbox>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n </th>\n <td mat-cell *matCellDef=\"let element\">{{ element[dCol.config.name] || '---' }}</td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n </table>\n <div *ngIf=\"repeatListData?.length === 0\">\n <table id=\"list-view\" *ngIf=\"repeatListData?.length === 0\" mat-table [dataSource]=\"repeatList$\">\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef>{{ dCol.config.label }}</th>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n </table>\n </div>\n <div class=\"psdk-no-records\" *ngIf=\"repeatListData?.length === 0\">No Records Found.</div>\n </div>\n </div>\n </div>\n\n <mat-paginator id=\"pagination\" *ngIf=\"bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500, 1000]\" showFirstLastButtons></mat-paginator>\n <mat-paginator id=\"pagination\" *ngIf=\"!bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500]\" showFirstLastButtons></mat-paginator>\n </div>\n\n <!-- pop overs for filters-->\n <div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n </div>\n</div>\n", styles: [".psdk-list-header{background-color:var(--app-form-color);padding:1rem;margin:.5rem;border-radius:.6125rem}table{width:100%}::ng-deep .mat-sort-header-content{white-space:nowrap}::ng-deep td.mat-mdc-cell{white-space:nowrap}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding:0rem .188rem}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:-moz-fit-content;width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:nowrap;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem;padding-right:.625rem}.psdk-icon-search{vertical-align:sub;padding:.125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{padding:1rem;overflow:hidden}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}.psdk-no-records{height:56px;justify-content:center;display:flex;align-items:center;border:1px solid var(--app-neutral-light-color);border-top:none}.psdk-table-field-link{color:var(--app-primary-color);padding:0;cursor:pointer;border:0;background-color:transparent;align-items:center}\n"] }]
|
|
1183
|
-
}], ctorParameters:
|
|
1182
|
+
], template: "<div class=\"psdk-list-header\">\n <div>\n <mat-form-field class=\"psdk-search\" *ngIf=\"bShowSearch$\">\n <mat-label><img class=\"psdk-icon-search\" src=\"{{ searchIcon$ }}\" /> <span class=\"psdk-search-label\">Search</span> </mat-label>\n <input matInput id=\"search\" (keyup)=\"applySearch($event)\" placeholder=\"\" />\n </mat-form-field>\n\n <div *ngIf=\"!bInForm$\" class=\"psdk-outer-div-in-form\">\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"bColumnReorder$\">\n <div>\n <table\n mat-table\n id=\"list-view\"\n [dataSource]=\"repeatList$\"\n matSort\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\" cdkDrag>\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n <div class=\"psdk-inner-div-in-form\" *ngIf=\"!bColumnReorder$\">\n <div>\n <table mat-table id=\"list-view\" [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\" sticky=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\" (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div class=\"psdk-mat-header-arrow\">\n <img class=\"psdk-arrow-svg-icon\" arrow=\"none\" [attr.arrowid]=\"dCol.config.name\" />\n </div>\n <div class=\"psdk-mat-header-button\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button *ngIf=\"!_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element; index as i\">\n <button\n *ngIf=\"_showButton(dCol.config.name, dCol); else regular\"\n mat-button\n color=\"primary\"\n (click)=\"_listViewClick(dCol.config, element)\"\n >\n {{ element[dCol.config.name] || '---' }}\n </button>\n <ng-template #regular>\n {{ element[dCol.config.name] || '---' }}\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n\n <!-- Group header -->\n <ng-container matColumnDef=\"groupHeader\">\n <td mat-cell colspan=\"999\" *matCellDef=\"let group\">\n <mat-icon *ngIf=\"group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_less</mat-icon>\n <mat-icon *ngIf=\"!group.expanded\" [attr.style]=\"_getIconStyle(group.level)\">expand_more</mat-icon>\n <strong\n >{{ _getGroupName(groupByColumns$[group.level - 1]) }}: {{ group[groupByColumns$[group.level - 1]] }} ({{\n group.totalCounts\n }})</strong\n >\n </td>\n </ng-container>\n\n <tr mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroup\" (click)=\"_groupHeaderClick(row)\"></tr>\n </table>\n </div>\n </div>\n </div>\n <div *ngIf=\"bInForm$\">\n <div>\n <div class=\"psdk-inner-div-in-form\">\n <table id=\"list-view\" *ngIf=\"repeatListData.length > 0\" mat-table [dataSource]=\"repeatList$\" matSort>\n <ng-container *ngIf=\"singleSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-radio-button [value]=\"row[rowID]\" (change)=\"fieldOnChange(row)\"></mat-radio-button>\n </td>\n </ng-container>\n <ng-container *ngIf=\"multiSelectionMode\" matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox [value]=\"row[rowID]\" (change)=\"onCheckboxClick(row, $event)\"></mat-checkbox>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n {{ dCol.config.label }}\n </th>\n <td mat-cell *matCellDef=\"let element\">{{ element[dCol.config.name] || '---' }}</td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns$\"></tr>\n </table>\n <div *ngIf=\"repeatListData?.length === 0\">\n <table id=\"list-view\" *ngIf=\"repeatListData?.length === 0\" mat-table [dataSource]=\"repeatList$\">\n <ng-container *ngFor=\"let dCol of fields$\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef>{{ dCol.config.label }}</th>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns$\"></tr>\n </table>\n </div>\n <div class=\"psdk-no-records\" *ngIf=\"repeatListData?.length === 0\">No Records Found.</div>\n </div>\n </div>\n </div>\n\n <mat-paginator id=\"pagination\" *ngIf=\"bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500, 1000]\" showFirstLastButtons></mat-paginator>\n <mat-paginator id=\"pagination\" *ngIf=\"!bInForm$\" [pageSizeOptions]=\"[10, 20, 50, 100, 500]\" showFirstLastButtons></mat-paginator>\n </div>\n\n <!-- pop overs for filters-->\n <div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n </div>\n</div>\n", styles: [".psdk-list-header{background-color:var(--app-form-color);padding:1rem;margin:.5rem;border-radius:.6125rem}table{width:100%}::ng-deep .mat-sort-header-content{white-space:nowrap}::ng-deep td.mat-mdc-cell{white-space:nowrap}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding:0rem .188rem}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:nowrap;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem;padding-right:.625rem}.psdk-icon-search{vertical-align:sub;padding:.125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{padding:1rem;overflow:hidden}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}.psdk-no-records{height:56px;justify-content:center;display:flex;align-items:center;border:1px solid var(--app-neutral-light-color);border-top:none}.psdk-table-field-link{color:var(--app-primary-color);padding:0;cursor:pointer;border:0;background-color:transparent;align-items:center}\n"] }]
|
|
1183
|
+
}], ctorParameters: () => [{ type: i1.ProgressSpinnerService }, { type: i2.Utils }], propDecorators: { paginator: [{
|
|
1184
1184
|
type: ViewChild,
|
|
1185
1185
|
args: [MatPaginator]
|
|
1186
1186
|
}], sort: [{
|
|
@@ -1193,4 +1193,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
1193
1193
|
}], payload: [{
|
|
1194
1194
|
type: Input
|
|
1195
1195
|
}] } });
|
|
1196
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fY29tcG9uZW50cy90ZW1wbGF0ZS9saXN0LXZpZXcvbGlzdC12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fY29tcG9uZW50cy90ZW1wbGF0ZS9saXN0LXZpZXcvbGlzdC12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlDQUF5QztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUs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aWxlICovXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWF0RGF0ZXBpY2tlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgTWF0T3B0aW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNYXRSYWRpb01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3JhZGlvJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yLCBNYXRQYWdpbmF0b3JNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgTWF0U29ydCwgTWF0U29ydE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlLCBNYXRUYWJsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IERyYWdEcm9wTW9kdWxlLCBDZGtEcmFnRHJvcCwgbW92ZUl0ZW1JbkFycmF5LCBDZGtEcm9wTGlzdCwgQ2RrRHJhZyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgUHJvZ3Jlc3NTcGlubmVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL19tZXNzYWdlcy9wcm9ncmVzcy1zcGlubmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9faGVscGVycy91dGlscyc7XG5pbXBvcnQgeyBDb21wb25lbnRNYXBwZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9fYnJpZGdlL2NvbXBvbmVudC1tYXBwZXIvY29tcG9uZW50LW1hcHBlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgZ2V0Q3VycmVuY3lPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vX2hlbHBlcnMvY3VycmVuY3ktdXRpbHMnO1xuaW1wb3J0IHsgZ2V0TG9jYWxlLCBnZXRTZWNvbmRzIH0gZnJvbSAnLi4vLi4vLi4vX2hlbHBlcnMvY29tbW9uJztcbmltcG9ydCB7IGZvcm1hdHRlcnMgfSBmcm9tICcuLi8uLi8uLi9faGVscGVycy9mb3JtYXR0ZXJzL2Zvcm1hdC11dGlscyc7XG5cbmltcG9ydCB7IHVzZUluaXQgfSBmcm9tICcuL2xpc3RWaWV3SGVscGVycyc7XG5cbmRlY2xhcmUgY29uc3Qgd2luZG93OiBhbnk7XG5cbmNvbnN0IFNFTEVDVElPTl9NT0RFID0geyBTSU5HTEU6ICdzaW5nbGUnLCBNVUxUSTogJ211bHRpJyB9O1xuXG5pbnRlcmZhY2UgTGlzdFZpZXdQcm9wcyB7XG4gIC8vIElmIGFueSwgZW50ZXIgYWRkaXRpb25hbCBwcm9wcyB0aGF0IG9ubHkgZXhpc3Qgb24gdGhpcyBjb21wb25lbnRcbiAgZ2xvYmFsU2VhcmNoPzogYm9vbGVhbjtcbiAgcmVmZXJlbmNlTGlzdD86IGFueTtcbiAgcm93Q2xpY2tBY3Rpb24/OiBhbnk7XG4gIHNlbGVjdGlvbk1vZGU/OiBzdHJpbmc7XG4gIHJlZmVyZW5jZVR5cGU/OiBzdHJpbmc7XG4gIGNvbXBvc2l0ZUtleXM/OiBhbnk7XG4gIHNob3dEeW5hbWljRmllbGRzPzogYm9vbGVhbjtcbiAgcHJlc2V0cz86IGFueTtcbiAgcmVvcmRlckZpZWxkczogc3RyaW5nIHwgYm9vbGVhbjtcbiAgZ3JvdXBpbmc6IHN0cmluZyB8IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBHcm91cCB7XG4gIGxldmVsID0gMDtcbiAgcGFyZW50OiBHcm91cDtcbiAgZXhwYW5kZWQgPSB0cnVlO1xuICB0b3RhbENvdW50cyA9IDA7XG4gIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5wYXJlbnQgfHwgKHRoaXMucGFyZW50LnZpc2libGUgJiYgdGhpcy5wYXJlbnQuZXhwYW5kZWQpO1xuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1saXN0LXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGlzdC12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGlzdC12aWV3LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIE1hdElucHV0TW9kdWxlLFxuICAgIE1hdFRhYmxlTW9kdWxlLFxuICAgIE1hdFNvcnRNb2R1bGUsXG4gICAgRHJhZ0Ryb3BNb2R1bGUsXG4gICAgQ2RrRHJvcExpc3QsXG4gICAgQ2RrRHJhZyxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0TWVudU1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdFJhZGlvTW9kdWxlLFxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgIE1hdFBhZ2luYXRvck1vZHVsZSxcbiAgICBNYXRTZWxlY3RNb2R1bGUsXG4gICAgTWF0T3B0aW9uTW9kdWxlLFxuICAgIE1hdERhdGVwaWNrZXJNb2R1bGUsXG4gICAgZm9yd2FyZFJlZigoKSA9PiBDb21wb25lbnRNYXBwZXJDb21wb25lbnQpXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTGlzdFZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yKSBwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcbiAgQFZpZXdDaGlsZChNYXRTb3J0KSBzb3J0OiBNYXRTb3J0O1xuXG4gIEBJbnB1dCgpIHBDb25uJDogdHlwZW9mIFBDb25uZWN0O1xuICBASW5wdXQoKSBiSW5Gb3JtJCA9IHRydWU7XG4gIEBJbnB1dCgpIHBheWxvYWQ7XG5cbiAgcmVwZWF0TGlzdCQ6IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+O1xuICBmaWVsZHMkOiBhbnlbXTtcblxuICBkaXNwbGF5ZWRDb2x1bW5zJCA9IEFycmF5PGFueT4oKTtcbiAgZ3JvdXBCeUNvbHVtbnMkOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbmZpZ1Byb3BzJDogTGlzdFZpZXdQcm9wcztcblxuICB1cGRhdGVkUmVmTGlzdDogYW55O1xuXG4gIHJlcGVhdExpc3REYXRhOiBhbnlbXSA9IFtdO1xuXG4gIHNlYXJjaEljb24kOiBzdHJpbmc7XG5cbiAgYlNob3dTZWFyY2gkID0gZmFsc2U7XG4gIGJDb2x1bW5SZW9yZGVyJCA9IGZhbHNlO1xuICBiR3JvdXBpbmckID0gZmFsc2U7XG5cbiAgcGVyZkZpbHRlcjogc3RyaW5nO1xuICBzZWFyY2hGaWx0ZXI6IHN0cmluZztcblxuICBtZW51U3ZnSWNvbiQ6IHN0cmluZztcbiAgYXJyb3dTdmdJY29uJCA9ICcnO1xuICBhcnJvd0Rvd25TdmdJY29uJDogc3RyaW5nO1xuICBhcnJvd1VwU3ZnSWNvbiQ6IHN0cmluZztcblxuICBmaWx0ZXJTdmdJY29uJDogc3RyaW5nO1xuICBmaWx0ZXJPblN2Z0ljb24kOiBzdHJpbmc7XG4gIGdyb3VwQnlTdmdJY29uJDogc3RyaW5nO1xuXG4gIGNvbXBhcmVUeXBlOiBzdHJpbmc7XG4gIGNvbXBhcmVSZWY6IHN0cmluZztcbiAgYXJyb3dEaXJlY3Rpb24gPSAnZG93bic7XG5cbiAgZmlsdGVyQnlDb2x1bW5zOiBhbnlbXSA9IFtdO1xuICBiU2hvd0ZpbHRlclBvcG92ZXIkID0gZmFsc2U7XG4gIGJDb250YWlucyQgPSB0cnVlO1xuICBiRGF0ZVRpbWUkID0gZmFsc2U7XG5cbiAgZmlsdGVyQ29udGFpbnNMYWJlbCQgPSAnJztcbiAgZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdjb250YWlucyc7XG4gIGZpbHRlckNvbnRhaW5zVmFsdWUkOiBhbnk7XG5cbiAgYklzRGF0ZSQgPSBmYWxzZTtcbiAgYklzRGF0ZVRpbWUkID0gZmFsc2U7XG4gIGJJc1RpbWUkID0gZmFsc2U7XG5cbiAgY3VycmVudEZpbHRlclJlZkRhdGE6IGFueTtcbiAgY3VycmVudEZpbHRlckltYWdlRWw6IGFueTtcblxuICBhckZpbHRlck1haW5CdXR0b25zJDogYW55W10gPSBbXTtcbiAgYXJGaWx0ZXJTZWNvbmRhcnlCdXR0b25zJDogYW55W10gPSBbXTtcbiAgc2VsZWN0aW9uTW9kZT86IHN0cmluZztcbiAgc2luZ2xlU2VsZWN0aW9uTW9kZTogYm9vbGVhbjtcbiAgbXVsdGlTZWxlY3Rpb25Nb2RlOiBib29sZWFuO1xuICByb3dJRDogYW55O1xuICByZXNwb25zZTogYW55O1xuICBjb21wb3NpdGVLZXlzOiBhbnk7XG4gIHNob3dEeW5hbWljRmllbGRzOiBhbnk7XG4gIGZpbHRlcnM6IGFueSA9IHt9O1xuICBzZWxlY3RQYXJhbTogYW55W10gPSBbXTtcbiAgZmlsdGVyUGF5bG9hZDogYW55O1xuICByZWY6IGFueSA9IHt9O1xuICBjb3Ntb3NUYWJsZVJlZjogYW55O1xuICBsaXN0Q29udGV4dDogYW55ID0ge307XG4gIHF1ZXJ5OiBhbnkgPSBudWxsO1xuICBwYWdpbmc6IGFueTtcbiAgZmllbGREZWZzOiBhbnk7XG4gIHhSYXlBcGlzID0gUENvcmUuZ2V0RGVidWdnZXIoKS5nZXRYUmF5UnVudGltZSgpO1xuICB4UmF5VWlkID0gdGhpcy54UmF5QXBpcy5zdGFydFhSYXkoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBzU2VydmljZTogUHJvZ3Jlc3NTcGlubmVyU2VydmljZSxcbiAgICBwcml2YXRlIHV0aWxzOiBVdGlsc1xuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWdQcm9wcyQgPSB0aGlzLnBDb25uJC5nZXRDb25maWdQcm9wcygpIGFzIExpc3RWaWV3UHJvcHM7XG4gICAgLyoqIEJ5IGRlZmF1bHQsIHB5R1VJRCBpcyB1c2VkIGZvciBEYXRhIGNsYXNzZXMgYW5kIHB5SUQgaXMgZm9yIFdvcmsgY2xhc3NlcyBhcyByb3ctaWQva2V5ICovXG4gICAgY29uc3QgZGVmUm93SUQgPSB0aGlzLmNvbmZpZ1Byb3BzJD8ucmVmZXJlbmNlVHlwZSA9PT0gJ0Nhc2UnID8gJ3B5SUQnIDogJ3B5R1VJRCc7XG4gICAgLyoqIElmIGNvbXBvc2l0ZUtleXMgaXMgZGVmaW5lZCwgdXNlIGR5bmFtaWMgdmFsdWUsIGVsc2UgZmFsbGJhY2sgdG8gcHlJRCBvciBweUdVSUQuICovXG4gICAgdGhpcy5jb21wb3NpdGVLZXlzID0gdGhpcy5jb25maWdQcm9wcyQ/LmNvbXBvc2l0ZUtleXM7XG4gICAgdGhpcy5yb3dJRCA9IHRoaXMuY29tcG9zaXRlS2V5cyAmJiB0aGlzLmNvbXBvc2l0ZUtleXM/Lmxlbmd0aCA9PT0gMSA/IHRoaXMuY29tcG9zaXRlS2V5c1swXSA6IGRlZlJvd0lEO1xuICAgIHRoaXMuYlNob3dTZWFyY2gkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUodGhpcy5jb25maWdQcm9wcyQuZ2xvYmFsU2VhcmNoID8gdGhpcy5jb25maWdQcm9wcyQuZ2xvYmFsU2VhcmNoIDogdGhpcy5wYXlsb2FkPy5nbG9iYWxTZWFyY2gpO1xuICAgIHRoaXMuYkNvbHVtblJlb3JkZXIkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUodGhpcy5jb25maWdQcm9wcyQucmVvcmRlckZpZWxkcyk7XG4gICAgdGhpcy5iR3JvdXBpbmckID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUodGhpcy5jb25maWdQcm9wcyQuZ3JvdXBpbmcpO1xuICAgIHRoaXMuc2hvd0R5bmFtaWNGaWVsZHMgPSB0aGlzLmNvbmZpZ1Byb3BzJD8uc2hvd0R5bmFtaWNGaWVsZHM7XG5cbiAgICB0aGlzLm1lbnVTdmdJY29uJCA9IHRoaXMudXRpbHMuZ2V0SW1hZ2VTcmMoJ21vcmUnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5hcnJvd0Rvd25TdmdJY29uJCA9IHRoaXMudXRpbHMuZ2V0SW1hZ2VTcmMoJ2Fycm93LWRvd24nLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5hcnJvd1VwU3ZnSWNvbiQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdhcnJvdy11cCcsIHRoaXMudXRpbHMuZ2V0U0RLU3RhdGljQ29udGVudFVybCgpKTtcblxuICAgIHRoaXMuZmlsdGVyU3ZnSWNvbiQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdmaWx0ZXInLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5maWx0ZXJPblN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnZmlsdGVyLW9uJywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuICAgIHRoaXMuZ3JvdXBCeVN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygncm93JywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gdGhpcy5jb25maWdQcm9wcyQuc2VsZWN0aW9uTW9kZTtcblxuICAgIHRoaXMuYXJGaWx0ZXJNYWluQnV0dG9ucyQucHVzaCh7IGFjdGlvbklEOiAnc3VibWl0JywganNBY3Rpb246ICdzdWJtaXQnLCBuYW1lOiAnU3VibWl0JyB9KTtcbiAgICB0aGlzLmFyRmlsdGVyU2Vjb25kYXJ5QnV0dG9ucyQucHVzaCh7IGFjdGlvbklEOiAnY2FuY2VsJywganNBY3Rpb246ICdjYW5jZWwnLCBuYW1lOiAnQ2FuY2VsJyB9KTtcblxuICAgIHRoaXMuc2VhcmNoSWNvbiQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdzZWFyY2gnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBQQ29yZS5nZXRQdWJTdWJVdGlscygpLnN1YnNjcmliZShcbiAgICAgICAgUENvcmUuZ2V0Q29uc3RhbnRzKCkuUFVCX1NVQl9FVkVOVFMuRVZFTlRfREFTSEJPQVJEX0ZJTFRFUl9DSEFOR0UsXG4gICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc0ZpbHRlckNoYW5nZShkYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgYGRhc2hib2FyZC1jb21wb25lbnQtJHsnaWQnfWAsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpXG4gICAgICApO1xuICAgICAgUENvcmUuZ2V0UHViU3ViVXRpbHMoKS5zdWJzY3JpYmUoXG4gICAgICAgIFBDb3JlLmdldENvbnN0YW50cygpLlBVQl9TVUJfRVZFTlRTLkVWRU5UX0RBU0hCT0FSRF9GSUxURVJfQ0xFQVJfQUxMLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5maWx0ZXJzID0ge307XG4gICAgICAgICAgdGhpcy5wcm9jZXNzRmlsdGVyQ2xlYXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgYGRhc2hib2FyZC1jb21wb25lbnQtJHsnaWQnfWAsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpXG4gICAgICApO1xuICAgIH0sIDApO1xuICAgIGlmICh0aGlzLmNvbmZpZ1Byb3BzJCkge1xuICAgICAgaWYgKCF0aGlzLnBheWxvYWQpIHtcbiAgICAgICAgdGhpcy5wYXlsb2FkID0geyByZWZlcmVuY2VMaXN0OiB0aGlzLmNvbmZpZ1Byb3BzJC5yZWZlcmVuY2VMaXN0IH07XG4gICAgICB9XG4gICAgICB1c2VJbml0KHtcbiAgICAgICAgcENvbm4kOiB0aGlzLnBDb25uJCxcbiAgICAgICAgYkluRm9ybSQ6IHRoaXMuYkluRm9ybSQsXG4gICAgICAgIC4uLnRoaXMucGF5bG9hZCxcbiAgICAgICAgbGlzdENvbnRleHQ6IHRoaXMubGlzdENvbnRleHQsXG4gICAgICAgIHJlZjogdGhpcy5yZWYsXG4gICAgICAgIHNob3dEeW5hbWljRmllbGRzOiB0aGlzLnNob3dEeW5hbWljRmllbGRzLFxuICAgICAgICB4UmF5VWlkOiB0aGlzLnhSYXlVaWQsXG4gICAgICAgIGNvc21vc1RhYmxlUmVmOiB0aGlzLmNvc21vc1RhYmxlUmVmLFxuICAgICAgICBzZWxlY3Rpb25Nb2RlOiB0aGlzLnNlbGVjdGlvbk1vZGVcbiAgICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICB0aGlzLmxpc3RDb250ZXh0ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuZ2V0TGlzdERhdGEoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldEZpZWxkRnJvbUZpbHRlcihmaWx0ZXIsIGRhdGVSYW5nZSA9IGZhbHNlKSB7XG4gICAgbGV0IGZpZWxkVmFsdWU7XG4gICAgaWYgKGRhdGVSYW5nZSkge1xuICAgICAgZmllbGRWYWx1ZSA9IGZpbHRlcj8uQU5EWzBdPy5jb25kaXRpb24ubGhzLmZpZWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWVsZFZhbHVlID0gZmlsdGVyPy5jb25kaXRpb24ubGhzLmZpZWxkO1xuICAgIH1cbiAgICByZXR1cm4gZmllbGRWYWx1ZTtcbiAgfVxuXG4gIC8vIFdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gRVZFTlRfREFTSEJPQVJEX0ZJTFRFUl9DSEFOR0UgZmlyZXNcbiAgcHJvY2Vzc0ZpbHRlckNoYW5nZShkYXRhKSB7XG4gICAgY29uc3QgeyBmaWx0ZXJJZCwgZmlsdGVyRXhwcmVzc2lvbiB9ID0gZGF0YTtcbiAgICBsZXQgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZDogYW55ID0ge1xuICAgICAgcXVlcnk6IHtcbiAgICAgICAgZmlsdGVyOiB7fSxcbiAgICAgICAgc2VsZWN0OiBbXVxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmZpbHRlcnNbZmlsdGVySWRdID0gZmlsdGVyRXhwcmVzc2lvbjtcbiAgICBsZXQgaXNEYXRlUmFuZ2UgPSAhIWRhdGEuZmlsdGVyRXhwcmVzc2lvbj8uQU5EO1xuICAgIC8vIFdpbGwgYmUgQU5EIGJ5IGRlZmF1bHQgYnV0IG1ha2luZyBpdCBkeW5hbWljIGluIGNhc2Ugd2Ugc3VwcG9ydCBkeW5hbWljIHJlbGF0aW9uYWwgb3BzIGluIGZ1dHVyZVxuICAgIGNvbnN0IHJlbGF0aW9uYWxPcCA9ICdBTkQnO1xuXG4gICAgbGV0IGZpZWxkID0gdGhpcy5nZXRGaWVsZEZyb21GaWx0ZXIoZmlsdGVyRXhwcmVzc2lvbiwgaXNEYXRlUmFuZ2UpO1xuICAgIGNvbnN0IHNlbGVjdFBhcmFtOiBhbnlbXSA9IFtdO1xuICAgIC8vIENvbnN0cnVjdGluZyB0aGUgc2VsZWN0IHBhcmFtZXRlcnMgbGlzdCAod2lsbCBiZSBzZW50IGluIGRhc2hib2FyZEZpbHRlclBheWxvYWQpXG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zJD8uZm9yRWFjaChjb2wgPT4ge1xuICAgICAgc2VsZWN0UGFyYW0ucHVzaCh7XG4gICAgICAgIGZpZWxkOiBjb2xcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIHRyaWdnZXJlZCBmaWx0ZXIgaXMgYXBwbGljYWJsZSBmb3IgdGhpcyBsaXN0XG4gICAgaWYgKGRhdGEuZmlsdGVyRXhwcmVzc2lvbiAhPT0gbnVsbCAmJiAhKHRoaXMuZGlzcGxheWVkQ29sdW1ucyQ/Lmxlbmd0aCAmJiB0aGlzLmRpc3BsYXllZENvbHVtbnMkPy5pbmNsdWRlcyhmaWVsZCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRoaXMgaXMgYSBmbGFnIHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZXNldCBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkIGluIGNhc2Ugd2UgZG9uJ3QgZmluZCBhbnkgdmFsaWQgZmlsdGVyc1xuICAgIGxldCB2YWxpZEZpbHRlciA9IGZhbHNlO1xuXG4gICAgbGV0IGluZGV4ID0gMTtcbiAgICAvLyBJdGVyYXRpbmcgb3ZlciB0aGUgY3VycmVudCBmaWx0ZXJzIGxpc3QgdG8gY3JlYXRlIGZpbHRlciBkYXRhIHdoaWNoIHdpbGwgYmUgUE9TVGVkXG4gICAgY29uc3QgZmlsdGVyS2V5czogYW55W10gPSBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpO1xuICAgIGNvbnN0IGZpbHRlclZhbHVlczogYW55W10gPSBPYmplY3QudmFsdWVzKHRoaXMuZmlsdGVycyk7XG4gICAgZm9yIChsZXQgZmlsdGVySW5kZXggPSAwOyBmaWx0ZXJJbmRleCA8IGZpbHRlcktleXMubGVuZ3RoOyBmaWx0ZXJJbmRleCsrKSB7XG4gICAgICBjb25zdCBmaWx0ZXIgPSBmaWx0ZXJWYWx1ZXNbZmlsdGVySW5kZXhdO1xuICAgICAgLy8gSWYgdGhlIGZpbHRlciBpcyBudWxsIHRoZW4gd2UgY2FuIHNraXAgdGhpcyBpdGVyYXRpb25cbiAgICAgIGlmIChmaWx0ZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVja2luZyBpZiB0aGUgZmlsdGVyIGlzIG9mIHR5cGUtIERhdGUgUmFuZ2VcbiAgICAgIGlzRGF0ZVJhbmdlID0gISFmaWx0ZXI/LkFORDtcbiAgICAgIGZpZWxkID0gdGhpcy5nZXRGaWVsZEZyb21GaWx0ZXIoZmlsdGVyLCBpc0RhdGVSYW5nZSk7XG5cbiAgICAgIGlmICghKHRoaXMuZGlzcGxheWVkQ29sdW1ucyQ/Lmxlbmd0aCAmJiB0aGlzLmRpc3BsYXllZENvbHVtbnMkPy5pbmNsdWRlcyhmaWVsZCkpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIElmIHdlIHJlYWNoIGhlcmUgdGhhdCBpbXBsaWVzIHdlJ3ZlIGF0IGxlYXN0IG9uZSB2YWxpZCBmaWx0ZXIsIGhlbmNlIHNldHRpbmcgdGhlIGZsYWdcbiAgICAgIHZhbGlkRmlsdGVyID0gdHJ1ZTtcbiAgICAgIC8qKiBCZWxvdyBhcmUgdGhlIDIgY2FzZXMgZm9yLSBUZXh0ICYgRGF0ZS1SYW5nZSBmaWx0ZXIgdHlwZXMgd2hlcmUgd2UnbGwgY29uc3RydWN0IGZpbHRlciBkYXRhIHdoaWNoIHdpbGwgYmUgc2VudCBpbiB0aGUgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZFxuICAgICAgICogSW4gQ29uc3RlbGxhdGlvbiBEWCBDb21wb25lbnRzLCB0aHJvdWdoIFJlcGVhdGluZyBTdHJ1Y3R1cmVzIHRoZXkgbWlnaHQgYmUgdXNpbmcgc2V2ZXJhbCBBUElzIHRvIGRvIGl0LiBXZSdyZSBkb2luZyBpdCBoZXJlXG4gICAgICAgKi9cbiAgICAgIGlmIChpc0RhdGVSYW5nZSkge1xuICAgICAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkID0gdGhpcy5maWx0ZXJCYXNlZE9uRGF0ZVJhbmdlKGRhc2hib2FyZEZpbHRlclBheWxvYWQsIGZpbHRlciwgcmVsYXRpb25hbE9wLCBzZWxlY3RQYXJhbSwgaW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIuZmlsdGVyQ29uZGl0aW9ucyA9IHtcbiAgICAgICAgICAuLi5kYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5maWx0ZXJDb25kaXRpb25zLFxuICAgICAgICAgIFtgVCR7aW5kZXgrK31gXTogeyAuLi5maWx0ZXIuY29uZGl0aW9uLCBpZ25vcmVDYXNlOiB0cnVlIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIubG9naWMpIHtcbiAgICAgICAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5sb2dpYyA9IGAke2Rhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuZmlsdGVyLmxvZ2ljfSAke3JlbGF0aW9uYWxPcH0gVCR7aW5kZXggLSAxfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIubG9naWMgPSBgVCR7aW5kZXggLSAxfWA7XG4gICAgICAgIH1cblxuICAgICAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LnNlbGVjdCA9IHNlbGVjdFBhcmFtO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlc2V0IHRoZSBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkIGlmIHdlIGVuZCB1cCB3aXRoIG5vIHZhbGlkIGZpbHRlcnMgZm9yIHRoZSBsaXN0XG4gICAgaWYgKCF2YWxpZEZpbHRlcikge1xuICAgICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJQYXlsb2FkID0gZGFzaGJvYXJkRmlsdGVyUGF5bG9hZDtcbiAgICB0aGlzLmdldExpc3REYXRhKCk7XG4gIH1cblxuICBmaWx0ZXJCYXNlZE9uRGF0ZVJhbmdlKGRhc2hib2FyZEZpbHRlclBheWxvYWQsIGZpbHRlciwgcmVsYXRpb25hbE9wLCBzZWxlY3RQYXJhbSwgaW5kZXgpIHtcbiAgICBjb25zdCBkYXRlUmVsYXRpb25hbE9wID0gZmlsdGVyPy5BTkQgPyAnQU5EJyA6ICdPUic7XG4gICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIuZmlsdGVyQ29uZGl0aW9ucyA9IHtcbiAgICAgIC4uLmRhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuZmlsdGVyLmZpbHRlckNvbmRpdGlvbnMsXG4gICAgICBbYFQke2luZGV4Kyt9YF06IHsgLi4uZmlsdGVyW3JlbGF0aW9uYWxPcF1bMF0uY29uZGl0aW9uIH0sXG4gICAgICBbYFQke2luZGV4Kyt9YF06IHsgLi4uZmlsdGVyW3JlbGF0aW9uYWxPcF1bMV0uY29uZGl0aW9uIH1cbiAgICB9O1xuICAgIGlmIChkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5sb2dpYykge1xuICAgICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIubG9naWMgPSBgJHtkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5sb2dpY30gJHtyZWxhdGlvbmFsT3B9IChUJHtpbmRleCAtIDJ9ICR7ZGF0ZVJlbGF0aW9uYWxPcH0gVCR7XG4gICAgICAgIGluZGV4IC0gMVxuICAgICAgfSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5sb2dpYyA9IGAoVCR7aW5kZXggLSAyfSAke3JlbGF0aW9uYWxPcH0gVCR7aW5kZXggLSAxfSlgO1xuICAgIH1cblxuICAgIGRhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuc2VsZWN0ID0gc2VsZWN0UGFyYW07XG5cbiAgICByZXR1cm4gZGFzaGJvYXJkRmlsdGVyUGF5bG9hZDtcbiAgfVxuXG4gIHByb2Nlc3NGaWx0ZXJDbGVhcigpIHtcbiAgICB0aGlzLmZpbHRlclBheWxvYWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5nZXRMaXN0RGF0YSgpO1xuICB9XG5cbiAgZ2V0RmllbGRzTWV0YWRhdGEocmVmTGlzdCkge1xuICAgIC8vIEB0cy1pZ25vcmUgLSAzcmQgcGFyYW1ldGVyIFwiYXNzb2NpYXRpb25GaWx0ZXJcIiBzaG91bGQgYmUgb3B0aW9uYWwgZm9yIGdldERhdGFWaWV3TWV0YWRhdGEgbWV0aG9kXG4gICAgcmV0dXJuIFBDb3JlLmdldEFuYWx5dGljc1V0aWxzKCkuZ2V0RGF0YVZpZXdNZXRhZGF0YShyZWZMaXN0LCB0aGlzLnNob3dEeW5hbWljRmllbGRzKTtcbiAgfVxuXG4gIGdldExpc3REYXRhKCkge1xuICAgIC8vIEB0cy1pZ25vcmUgLSBQcm9wZXJ0eSAnZ2V0Q29tcG9uZW50Q29uZmlnJyBpcyBwcml2YXRlIGFuZCBvbmx5IGFjY2Vzc2libGUgd2l0aGluIGNsYXNzICdDMTFuRW52J1xuICAgIGNvbnN0IGNvbXBvbmVudENvbmZpZyA9IHRoaXMucENvbm4kLmdldENvbXBvbmVudENvbmZpZygpO1xuICAgIGlmICh0aGlzLmNvbmZpZ1Byb3BzJCkge1xuICAgICAgdGhpcy5wcmVwYXJlUGF5bG9hZCgpO1xuICAgICAgY29uc3QgcmVmTGlzdCA9IHRoaXMuY29uZmlnUHJvcHMkLnJlZmVyZW5jZUxpc3Q7XG4gICAgICBjb25zdCBmaWVsZHNNZXRhRGF0YVByb21pc2UgPSB0aGlzLmdldEZpZWxkc01ldGFkYXRhKHJlZkxpc3QpO1xuICAgICAgLy8gcmV0dXJucyBhIHByb21pc2VcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLnBheWxvYWQgfHwgdGhpcy5maWx0ZXJQYXlsb2FkIHx8IHt9O1xuICAgICAgY29uc3QgZGF0YVZpZXdQYXJhbWV0ZXJzID0gdGhpcy5wYXlsb2FkLnBhcmFtZXRlcnM7XG5cbiAgICAgIGNvbnN0IHdvcmtMaXN0RGF0YVByb21pc2UgPSAhdGhpcy5iSW5Gb3JtJFxuICAgICAgICA/IC8vIEB0cy1pZ25vcmUgLSAzcmQgcGFyYW1ldGVyIFwiY29udGV4dFwiIHNob3VsZCBiZSBvcHRpb25hbCBpbiBnZXREYXRhIG1ldGhvZFxuICAgICAgICAgIFBDb3JlLmdldERhdGFBcGlVdGlscygpLmdldERhdGEocmVmTGlzdCwgcGF5bG9hZClcbiAgICAgICAgOiBQQ29yZS5nZXREYXRhUGFnZVV0aWxzKCkuZ2V0RGF0YUFzeW5jKFxuICAgICAgICAgICAgcmVmTGlzdCxcbiAgICAgICAgICAgIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCksXG4gICAgICAgICAgICBwYXlsb2FkLmRhdGFWaWV3UGFyYW1ldGVycyA/IHBheWxvYWQuZGF0YVZpZXdQYXJhbWV0ZXJzIDogZGF0YVZpZXdQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgdGhpcy5wYWdpbmcsXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5XG4gICAgICAgICAgKTtcblxuICAgICAgdGhpcy5iU2hvd0ZpbHRlclBvcG92ZXIkID0gZmFsc2U7XG5cbiAgICAgIHRoaXMucHNTZXJ2aWNlLnNlbmRNZXNzYWdlKHRydWUpO1xuXG4gICAgICBQcm9taXNlLmFsbChbZmllbGRzTWV0YURhdGFQcm9taXNlLCB3b3JrTGlzdERhdGFQcm9taXNlXSlcbiAgICAgICAgLnRoZW4oKHJlc3VsdHM6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpZWxkc01ldGFEYXRhID0gcmVzdWx0c1swXTtcbiAgICAgICAgICBjb25zdCB3b3JrTGlzdERhdGEgPSByZXN1bHRzWzFdO1xuXG4gICAgICAgICAgdGhpcy5maWVsZHMkID0gdGhpcy5jb25maWdQcm9wcyQucHJlc2V0c1swXS5jaGlsZHJlblswXS5jaGlsZHJlbjtcbiAgICAgICAgICAvLyB0aGlzIGlzIGFuIHVucmVzb3ZsZWQgdmVyc2lvbiBvZiB0aGlzLmZpZWxkcyQsIG5lZWQgdW5yZXNvbHZlZCwgc28gY2FuIGdldCB0aGUgcHJvcGVydHkgcmVmZXJlbmNlXG4gICAgICAgICAgY29uc3QgY29sdW1uRmllbGRzID0gY29tcG9uZW50Q29uZmlnLnByZXNldHNbMF0uY2hpbGRyZW5bMF0uY2hpbGRyZW47XG5cbiAgICAgICAgICBjb25zdCB0YWJsZURhdGFSZXN1bHRzID0gIXRoaXMuYkluRm9ybSQgPyB3b3JrTGlzdERhdGEuZGF0YS5kYXRhIDogd29ya0xpc3REYXRhLmRhdGE7XG5cbiAgICAgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRIZWFkZXJDZWxscyhjb2x1bW5GaWVsZHMsIHRoaXMuZmllbGREZWZzKTtcbiAgICAgICAgICB0aGlzLmZpZWxkcyQgPSB0aGlzLnVwZGF0ZUZpZWxkcyh0aGlzLmZpZWxkcyQsIGZpZWxkc01ldGFEYXRhLmRhdGEuZmllbGRzLCBjb2x1bW5zKTtcbiAgICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMkID0gY29sdW1ucy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjb2wuaWQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5yZXNwb25zZSA9IHRhYmxlRGF0YVJlc3VsdHM7XG4gICAgICAgICAgdGhpcy51cGRhdGVkUmVmTGlzdCA9IHRoaXMudXBkYXRlRGF0YSh0YWJsZURhdGFSZXN1bHRzLCB0aGlzLmZpZWxkcyQpO1xuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IFNFTEVDVElPTl9NT0RFLlNJTkdMRSAmJiB0aGlzLnVwZGF0ZWRSZWZMaXN0Py5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMkPy51bnNoaWZ0KCdzZWxlY3QnKTtcbiAgICAgICAgICAgIHRoaXMuc2luZ2xlU2VsZWN0aW9uTW9kZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IFNFTEVDVElPTl9NT0RFLk1VTFRJICYmIHRoaXMudXBkYXRlZFJlZkxpc3Q/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyQ/LnVuc2hpZnQoJ3NlbGVjdCcpO1xuICAgICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdGlvbk1vZGUgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMucmVwZWF0TGlzdCQgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHRoaXMudXBkYXRlZFJlZkxpc3QpO1xuICAgICAgICAgIHRoaXMucmVwZWF0TGlzdCQuZmlsdGVyUHJlZGljYXRlID0gdGhpcy5jdXN0b21GaWx0ZXJQcmVkaWNhdGUuYmluZCh0aGlzKTtcblxuICAgICAgICAgIC8vIGtlZXBpbmcgYW4gb3JpZ2luYWwgY29weSB0byBnZXQgYmFjayBhZnRlciBwb3NzaWJsZSBzb3J0cywgZmlsdGVycyBhbmQgZ3JvdXBCeVxuICAgICAgICAgIHRoaXMucmVwZWF0TGlzdERhdGEgPSB0aGlzLnJlcGVhdExpc3QkLmRhdGEuc2xpY2UoKTtcblxuICAgICAgICAgIHRoaXMucmVwZWF0TGlzdCQucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICAgICAgdGhpcy5yZXBlYXRMaXN0JC5zb3J0ID0gdGhpcy5zb3J0O1xuICAgICAgICAgIHRoaXMucHNTZXJ2aWNlLnNlbmRNZXNzYWdlKGZhbHNlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGRuJ3QgZmV0Y2ggZWl0aGVyIHRoZSBmaWVsZHNNZXRhRGF0YSBvciB3b3JrTGlzdERhdGFcIik7XG4gICAgICAgICAgdGhpcy5wc1NlcnZpY2Uuc2VuZE1lc3NhZ2UoZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcmVwYXJlUGF5bG9hZCgpIHtcbiAgICBjb25zdCB7IGZpZWxkRGVmcywgaXRlbUtleSwgcGF0Y2hRdWVyeUZpZWxkcyB9ID0gdGhpcy5saXN0Q29udGV4dC5tZXRhO1xuICAgIHRoaXMuZmllbGREZWZzID0gZmllbGREZWZzO1xuICAgIGxldCBsaXN0RmllbGRzID0gZmllbGREZWZzID8gdGhpcy5idWlsZFNlbGVjdChmaWVsZERlZnMsIHVuZGVmaW5lZCwgcGF0Y2hRdWVyeUZpZWxkcywgdGhpcy5wYXlsb2FkPy5jb21wb3NpdGVLZXlzKSA6IFtdO1xuICAgIGxpc3RGaWVsZHMgPSB0aGlzLmFkZEl0ZW1LZXlJblNlbGVjdChmaWVsZERlZnMsIGl0ZW1LZXksIGxpc3RGaWVsZHMsIHRoaXMucGF5bG9hZD8uY29tcG9zaXRlS2V5cyk7XG4gICAgaWYgKHRoaXMucGF5bG9hZC5xdWVyeSkge1xuICAgICAgdGhpcy5xdWVyeSA9IHRoaXMucGF5bG9hZC5xdWVyeTtcbiAgICB9IGVsc2UgaWYgKGxpc3RGaWVsZHM/Lmxlbmd0aCAmJiB0aGlzLmxpc3RDb250ZXh0Lm1ldGEuaXNRdWVyeWFibGUpIHtcbiAgICAgIGlmICh0aGlzLmZpbHRlclBheWxvYWQpIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHtcbiAgICAgICAgICBzZWxlY3Q6IGxpc3RGaWVsZHMsXG4gICAgICAgICAgZmlsdGVyOiB0aGlzLmZpbHRlclBheWxvYWQ/LnF1ZXJ5Py5maWx0ZXJcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSB7IHNlbGVjdDogbGlzdEZpZWxkcyB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5maWx0ZXJQYXlsb2FkKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5maWx0ZXJQYXlsb2FkPy5xdWVyeTtcbiAgICB9XG4gIH1cbiAgLy8gbmdPbkNoYW5nZXMoY2hhbmdlcykge1xuICAvLyAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMucGF5bG9hZCkge1xuICAvLyAgICAgY29uc3QgY3VycmVudFBheWxvYWRWYWwgPSBjaGFuZ2VzLnBheWxvYWQ/LmN1cnJlbnRWYWx1ZTtcbiAgLy8gICAgIGNvbnN0IHByZXZpb3VzUGF5bG9hZFZhbCA9IGNoYW5nZXMucGF5bG9hZD8ucHJldmlvdXNWYWx1ZTtcbiAgLy8gICAgIGlmIChjdXJyZW50UGF5bG9hZFZhbCAhPT0gcHJldmlvdXNQYXlsb2FkVmFsKSB7XG4gIC8vICAgICAgIHRoaXMuZ2V0TGlzdERhdGEoKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9XG4gIC8vIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBQQ29yZS5nZXRQdWJTdWJVdGlscygpLnVuc3Vic2NyaWJlKFxuICAgICAgUENvcmUuZ2V0Q29uc3RhbnRzKCkuUFVCX1NVQl9FVkVOVFMuRVZFTlRfREFTSEJPQVJEX0ZJTFRFUl9DSEFOR0UsXG4gICAgICBgZGFzaGJvYXJkLWNvbXBvbmVudC0keydpZCd9YCxcbiAgICAgIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKClcbiAgICApO1xuICAgIFBDb3JlLmdldFB1YlN1YlV0aWxzKCkudW5zdWJzY3JpYmUoXG4gICAgICBQQ29yZS5nZXRDb25zdGFudHMoKS5QVUJfU1VCX0VWRU5UUy5FVkVOVF9EQVNIQk9BUkRfRklMVEVSX0NMRUFSX0FMTCxcbiAgICAgIGBkYXNoYm9hcmQtY29tcG9uZW50LSR7J2lkJ31gLFxuICAgICAgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKVxuICAgICk7XG4gIH1cblxuICAvLyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gIC8vICAgLy8gcGFnaW5hdG9yIGhhcyB0byBleGlzdCBmb3IgdGhpcyB0byB3b3JrLFxuICAvLyAgIC8vIHNvIGNhbGxlZCBhZnRlciBpbml0IChwYWdpbmF0b3IgZHJhd24pXG4gIC8vICAgLy8gQ2FsbHMgYXJlIG5vdyBpbiB3b3JrTGlzdERhdGEgcHJvbWlzZVxuICAvLyAgIC8vIHRoaXMucmVwZWF0TGlzdCQucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gIC8vICAgLy8gdGhpcy5yZXBlYXRMaXN0JC5zb3J0ID0gdGhpcy5zb3J0O1xuICAvLyB9XG5cbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XG4gICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuZGlzcGxheWVkQ29sdW1ucyQsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gIH1cblxuICB1cGRhdGVGaWVsZHMoYXJGaWVsZHM6IGFueVtdLCBhckNvbHVtbnMsIGZpZWxkcyk6IGFueVtdIHtcbiAgICBjb25zdCBhclJldHVybiA9IGFyRmllbGRzO1xuICAgIGFyUmV0dXJuLmZvckVhY2goKGZpZWxkLCBpKSA9PiB7XG4gICAgICBmaWVsZC5jb25maWcgPSB7IC4uLmZpZWxkLmNvbmZpZywgLi4uZmllbGRzW2ldLCBuYW1lOiBmaWVsZHNbaV0uaWQgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gYXJSZXR1cm47XG4gIH1cblxuICBhcHBseVNlYXJjaChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgdGhpcy5zZWFyY2hGaWx0ZXIgPSBmaWx0ZXJWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmICh0aGlzLmdyb3VwQnlDb2x1bW5zJC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJlcGVhdExpc3QkLmRhdGEgPSB0aGlzLnJlcGVhdExpc3REYXRhLnNsaWNlKCk7XG4gICAgICB0aGlzLnJlcGVhdExpc3QkLmZpbHRlciA9IHRoaXMuc2VhcmNoRmlsdGVyO1xuICAgICAgY29uc3QgcmVwZWF0RGF0YSA9IHRoaXMucmVwZWF0TGlzdCQuc29ydERhdGEodGhpcy5yZXBlYXRMaXN0JC5maWx0ZXJlZERhdGEsIHRoaXMucmVwZWF0TGlzdCQuc29ydCBhcyBNYXRTb3J0KTtcbiAgICAgIHRoaXMucmVwZWF0TGlzdCQuZGF0YSA9IHRoaXMuYWRkR3JvdXBzKHJlcGVhdERhdGEsIHRoaXMuZ3JvdXBCeUNvbHVtbnMkKTtcblxuICAgICAgdGhpcy5wZXJmRmlsdGVyID0gcGVyZm9ybWFuY2Uubm93KCkudG9TdHJpbmcoKTtcbiAgICAgIHRoaXMucmVwZWF0TGlzdCQuZmlsdGVyID0gdGhpcy5wZXJmRmlsdGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlcGVhdExpc3QkLmZpbHRlciA9IHRoaXMuc2VhcmNoRmlsdGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlcGVhdExpc3QkLnBhZ2luYXRvcikge1xuICAgICAgdGhpcy5yZXBlYXRMaXN0JC5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgZmllbGRPbkNoYW5nZShyb3cpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHJvd1t0aGlzLnJvd0lEXTtcbiAgICBjb25zdCByZXFPYmogPSB7fTtcbiAgICBpZiAodGhpcy5jb21wb3NpdGVLZXlzPy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMucmVzcG9uc2UuZmluZEluZGV4KGVsZW1lbnQgPT4gZWxlbWVudFt0aGlzLnJvd0lEXSA9PT0gdmFsdWUpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRSb3cgPSB0aGlzLnJlc3BvbnNlW2luZGV4XTtcbiAgICAgIHRoaXMuY29tcG9zaXRlS2V5cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICByZXFPYmpbZWxlbWVudF0gPSBzZWxlY3RlZFJvd1tlbGVtZW50XTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXFPYmpbdGhpcy5yb3dJRF0gPSB2YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5wQ29ubiQ/LmdldExpc3RBY3Rpb25zPy4oKT8uc2V0U2VsZWN0ZWRSb3dzKFtyZXFPYmpdKTtcbiAgfVxuXG4gIG9uQ2hlY2tib3hDbGljayhyb3csIGV2ZW50KSB7XG4gICAgY29uc3QgdmFsdWUgPSByb3dbdGhpcy5yb3dJRF07XG4gICAgY29uc3QgY2hlY2tlZCA9IGV2ZW50Py5jaGVja2VkO1xuICAgIGNvbnN0IHJlcU9iajogYW55ID0ge307XG4gICAgaWYgKHRoaXMuY29tcG9zaXRlS2V5cz8ubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJlc3BvbnNlLmZpbmRJbmRleChlbGVtZW50ID0+IGVsZW1lbnRbdGhpcy5yb3dJRF0gPT09IHZhbHVlKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUm93ID0gdGhpcy5yZXNwb25zZVtpbmRleF07XG4gICAgICB0aGlzLmNvbXBvc2l0ZUtleXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgcmVxT2JqW2VsZW1lbnRdID0gc2VsZWN0ZWRSb3dbZWxlbWVudF07XG4gICAgICB9KTtcbiAgICAgIHJlcU9iai4kc2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXFPYmpbdGhpcy5yb3dJRF0gPSB2YWx1ZTtcbiAgICAgIHJlcU9iai4kc2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgIH1cbiAgICB0aGlzLnBDb25uJD8uZ2V0TGlzdEFjdGlvbnMoKT8uc2V0U2VsZWN0ZWRSb3dzKFtyZXFPYmpdKTtcbiAgfVxuXG4gIC8vIHJvd0NsaWNrKHJvdykge1xuICAvLyAgIHN3aXRjaCAodGhpcy5jb25maWdQcm9wcyQucm93Q2xpY2tBY3Rpb24pIHtcbiAgLy8gICAgIGNhc2UgJ29wZW5Bc3NpZ25tZW50JzpcbiAgLy8gICAgICAgdGhpcy5wc1NlcnZpY2Uuc2VuZE1lc3NhZ2UodHJ1ZSk7XG4gIC8vICAgICAgIHRoaXMub3BlbkFzc2lnbm1lbnQocm93KTtcbiAgLy8gICAgICAgYnJlYWs7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgX2dldEljb25TdHlsZShsZXZlbCk6IHN0cmluZyB7XG4gICAgbGV0IHNSZXR1cm4gPSAnJztcbiAgICBsZXQgbkxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTtcbiAgICBuTGV2ZWwtLTtcbiAgICBuTGV2ZWwgKj0gMTU7XG4gICAgc1JldHVybiA9IGBwYWRkaW5nLWxlZnQ6ICR7bkxldmVsfXB4OyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlYDtcblxuICAgIHJldHVybiBzUmV0dXJuO1xuICB9XG5cbiAgX2dldEdyb3VwTmFtZShmaWVsZE5hbWUpIHtcbiAgICBmb3IgKGxldCBmaWVsZEluZGV4ID0gMDsgZmllbGRJbmRleCA8IHRoaXMuZmllbGRzJC5sZW5ndGg7IGZpZWxkSW5kZXgrKykge1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpZWxkcyRbZmllbGRJbmRleF07XG4gICAgICBpZiAoZmllbGQuY29uZmlnLm5hbWUgPT0gZmllbGROYW1lKSB7XG4gICAgICAgIHJldHVybiBmaWVsZC5jb25maWcubGFiZWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIF9zaG93QnV0dG9uKG5hbWUsIHJvdykge1xuICAgIGxldCBiUmV0dXJuID0gZmFsc2U7XG4gICAgY29uc3QgeyBweFJlZk9iamVjdENsYXNzLCBwekluc0tleSwgcHhSZWZPYmplY3RLZXkgfSA9IHJvdztcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ3B4VGFza0xhYmVsJzpcbiAgICAgICAgaWYgKHB4UmVmT2JqZWN0Q2xhc3MgIT0gJycgJiYgcHpJbnNLZXkgIT0gJycpIHtcbiAgICAgICAgICBiUmV0dXJuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3B4UmVmT2JqZWN0SW5zTmFtZSc6XG4gICAgICAgIGlmIChweFJlZk9iamVjdENsYXNzICE9ICcnICYmIHB4UmVmT2JqZWN0S2V5ICE9ICcnKSB7XG4gICAgICAgICAgYlJldHVybiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gYlJldHVybjtcbiAgfVxuXG4gIF9saXN0Vmlld0NsaWNrKGNvbHVtbiwgcm93KSB7XG4gICAgY29uc3QgbmFtZSA9IGNvbHVtbi5pZDtcbiAgICBpZiAoY29sdW1uLmRpc3BsYXlBc0xpbmspIHtcbiAgICAgIGNvbnN0IHsgcHhPYmpDbGFzcyB9ID0gcm93O1xuICAgICAgbGV0IHsgcHpJbnNLZXkgfSA9IHJvdztcbiAgICAgIGlmIChjb2x1bW4uaXNBc3NvY2lhdGlvbikge1xuICAgICAgICBjb25zdCBhc3NvY2lhdGlvbkNhdGVnb3J5ID0gbmFtZS5zcGxpdCgnOicpWzBdO1xuICAgICAgICBwekluc0tleSA9IHJvd1tgJHthc3NvY2lhdGlvbkNhdGVnb3J5fTpwekluc0tleWBdO1xuICAgICAgfVxuICAgICAgaWYgKGNvbHVtbi5pc0Fzc2lnbm1lbnRMaW5rKSB7XG4gICAgICAgIHRoaXMucENvbm4kLmdldEFjdGlvbnNBcGkoKS5vcGVuQXNzaWdubWVudChwekluc0tleSwgcHhPYmpDbGFzcywge1xuICAgICAgICAgIGNvbnRhaW5lck5hbWU6ICdwcmltYXJ5JyxcbiAgICAgICAgICBjaGFubmVsTmFtZTogJydcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBDb25uJC5nZXRBY3Rpb25zQXBpKCkub3BlbldvcmtCeUhhbmRsZShwekluc0tleSwgcHhPYmpDbGFzcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICBjYXNlICdweFRhc2tMYWJlbCc6XG4gICAgICAgICAgdGhpcy5vcGVuQXNzaWdubWVudChyb3cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdweFJlZk9iamVjdEluc05hbWUnOlxuICAgICAgICAgIHRoaXMub3Blbldvcmsocm93KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfaGVhZGVyU29ydENsaWNrKGV2ZW50LCBjb2x1bW5EYXRhKSB7XG4gICAgLy8gaW1hZ2VzIDAgLSBmaWx0ZXIsIDEgLSBhcnJvdywgMiAtIG1vcmVcblxuICAgIC8qKiBDb21tZW50aW5nIHRoaXMgY29kZSBmb3Igbm93IGFzIGl0IGlzIGdpdmluZyBlcnJvcnMgbm90IHN1cmUgaWYgaXQgZXZlciB3b3JrZWQgKi9cbiAgICAvLyBsZXQgYXJyb3dJbWFnZSA9IGV2ZW50LnNyY0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpWzFdO1xuICAgIC8vIGxldCBhcnJvd0F0dHIgPSBhcnJvd0ltYWdlLmdldEF0dHJpYnV0ZSgnYXJyb3cnKTtcblxuICAgIC8vIHRoaXMuY2xlYXJPdXRBcnJvd3MoZXZlbnQsIGNvbHVtbkRhdGEpO1xuXG4gICAgLy8gc3dpdGNoIChhcnJvd0F0dHIpIHtcbiAgICAvLyAgIGNhc2UgJ3VwJzpcbiAgICAvLyAgICAgYXJyb3dJbWFnZS5zcmMgPSB0aGlzLmFycm93RG93blN2Z0ljb24kO1xuICAgIC8vICAgICBhcnJvd0ltYWdlLnNldEF0dHJpYnV0ZSgnYXJyb3cnLCAnZG93bicpO1xuICAgIC8vICAgICBicmVhaztcbiAgICAvLyAgIGNhc2UgJ2Rvd24nOlxuICAgIC8vICAgICBhcnJvd0ltYWdlLnNyYyA9ICcnO1xuICAgIC8vICAgICBhcnJvd0ltYWdlLnNldEF0dHJpYnV0ZSgnYXJyb3cnLCAnbm9uZScpO1xuICAgIC8vICAgICBicmVhaztcbiAgICAvLyAgIGRlZmF1bHQ6XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc3JjID0gdGhpcy5hcnJvd1VwU3ZnSWNvbiQ7XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc2V0QXR0cmlidXRlKCdhcnJvdycsICd1cCcpO1xuICAgIC8vICAgICBicmVhaztcbiAgICAvLyB9XG5cbiAgICB0aGlzLmNvbXBhcmVUeXBlID0gY29sdW1uRGF0YS50eXBlO1xuICAgIHRoaXMuY29tcGFyZVJlZiA9IGNvbHVtbkRhdGEuY29uZmlnLm5hbWU7XG4gICAgLy8gdGhpcy5hcnJvd0RpcmVjdGlvbiA9IGFycm93SW1hZ2UuZ2V0QXR0cmlidXRlKCdhcnJvdycpO1xuICAgIHRoaXMuYXJyb3dEaXJlY3Rpb24gPSB0aGlzLmFycm93RGlyZWN0aW9uID09PSAndXAnID8gJ2Rvd24nIDogJ3VwJztcblxuICAgIHRoaXMuZmlsdGVyU29ydEdyb3VwQnkoKTtcbiAgfVxuXG4gIC8vIENvbW1lbnRpbmcgYmVsb3cgbWV0aG9kLCBzaW5jZSB0aGUgY29kZSB3aGljaCBpcyB1c2luZyBpdCwgaXMgYWxyZWFkeSBjb21tZW50ZWRcbiAgLy8gY2xlYXJPdXRBcnJvd3MoZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgLy8gICBjb25zdCBhckltYWdlcyA9IGV2ZW50LnNyY0VsZW1lbnQucGFyZW50RWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7XG5cbiAgLy8gICBmb3IgKGNvbnN0IHRoZUltYWdlIG9mIGFySW1hZ2VzKSB7XG4gIC8vICAgICAvLyBsZXQgdGhlSW1hZ2UgPSBhckltYWdlc1tpXVxuICAvLyAgICAgY29uc3QgYXJyb3cgPSB0aGVJbWFnZS5nZXRBdHRyaWJ1dGUoJ2Fycm93Jyk7XG4gIC8vICAgICBpZiAoYXJyb3cpIHtcbiAgLy8gICAgICAgY29uc3QgYXJyb3dJZCA9IHRoZUltYWdlLmdldEF0dHJpYnV0ZSgnYXJyb3dpZCcpO1xuICAvLyAgICAgICBpZiAoYXJyb3cgIT0gJ25vbmUnICYmIGFycm93SWQgIT0gY29sdW1uRGF0YS5jb25maWcubmFtZSkge1xuICAvLyAgICAgICAgIHRoZUltYWdlLnNldEF0dHJpYnV0ZSgnYXJyb3cnLCAnbm9uZScpO1xuICAvLyAgICAgICAgIHRoZUltYWdlLnNyYyA9ICcnO1xuICAvLyAgICAgICB9XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgc29ydENvbXBhcmUoYSwgYik6IG51bWJlciB7XG4gICAgbGV0IGFWYWx1ZSA9IGFbdGhpcy5jb21wYXJlUmVmXTtcbiAgICBsZXQgYlZhbHVlID0gYlt0aGlzLmNvbXBhcmVSZWZdO1xuXG4gICAgaWYgKHRoaXMuY29tcGFyZVR5cGUgPT0gJ0RhdGUnIHx8IHRoaXMuY29tcGFyZVR5cGUgPT0gJ0RhdGVUaW1lJykge1xuICAgICAgYVZhbHVlID0gZ2V0U2Vjb25kcyhhVmFsdWUpO1xuICAgICAgYlZhbHVlID0gZ2V0U2Vjb25kcyhiVmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbXBhcmVSZWYgPT0gJ3B4UmVmT2JqZWN0SW5zTmFtZScpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29tcGFyZUJ5Q29sdW1uUHhSZWZPYmplY3RJbnNOYW1lKGFWYWx1ZSwgYlZhbHVlKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5hcnJvd0RpcmVjdGlvbikge1xuICAgICAgY2FzZSAndXAnOlxuICAgICAgICBpZiAoIWFWYWx1ZSB8fCBhVmFsdWUgPCBiVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFiVmFsdWUgfHwgYVZhbHVlID4gYlZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkb3duJzpcbiAgICAgICAgaWYgKCFiVmFsdWUgfHwgYVZhbHVlID4gYlZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYVZhbHVlIHx8IGFWYWx1ZSA8IGJWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb21wYXJlQnlDb2x1bW5QeFJlZk9iamVjdEluc05hbWUoYVZhbHVlLCBiVmFsdWUpIHtcbiAgICBjb25zdCBwcmVmaXhYID0gYVZhbHVlLnNwbGl0KCctJyk7XG4gICAgY29uc3QgcHJlZml4WSA9IGJWYWx1ZS5zcGxpdCgnLScpO1xuICAgIHN3aXRjaCAodGhpcy5hcnJvd0RpcmVjdGlvbikge1xuICAgICAgY2FzZSAndXAnOlxuICAgICAgICBpZiAocHJlZml4WFswXSAhPT0gcHJlZml4WVswXSkge1xuICAgICAgICAgIGlmIChwcmVmaXhYWzBdIDwgcHJlZml4WVswXSkgcmV0dXJuIC0xO1xuICAgICAgICAgIGlmIChwcmVmaXhYWzBdID4gcHJlZml4WVswXSkgcmV0dXJuIDE7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZWZpeFhbMV0gLSBwcmVmaXhZWzFdO1xuICAgICAgY2FzZSAnZG93bic6XG4gICAgICAgIGlmIChwcmVmaXhYWzBdICE9PSBwcmVmaXhZWzBdKSB7XG4gICAgICAgICAgaWYgKHByZWZpeFhbMF0gPiBwcmVmaXhZWzBdKSByZXR1cm4gLTE7XG4gICAgICAgICAgaWYgKHByZWZpeFhbMF0gPCBwcmVmaXhZWzBdKSByZXR1cm4gMTtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJlZml4WVsxXSAtIHByZWZpeFhbMV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdXBkYXRlRmlsdGVyRGlzcGxheSh0eXBlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ25vdGVxdWFsJztcbiAgICAgICAgdGhpcy5iQ29udGFpbnMkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYkRhdGVUaW1lJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYklzRGF0ZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJJc0RhdGVUaW1lJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc1RpbWUkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRGF0ZVRpbWUnOlxuICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnbm90ZXF1YWwnO1xuICAgICAgICB0aGlzLmJDb250YWlucyQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iRGF0ZVRpbWUkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc0RhdGVUaW1lJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYklzVGltZSQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdUaW1lJzpcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ25vdGVxdWFsJztcbiAgICAgICAgdGhpcy5iQ29udGFpbnMkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYkRhdGVUaW1lJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYklzRGF0ZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlVGltZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNUaW1lJCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ2NvbnRhaW5zJztcbiAgICAgICAgdGhpcy5iQ29udGFpbnMkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iRGF0ZVRpbWUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzRGF0ZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlVGltZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNUaW1lJCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBfZmlsdGVyKGV2ZW50LCBjb2x1bW5EYXRhKSB7XG4gICAgLy8gYWRkIGNsaWNrQXdheSBsaXN0ZW5lclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fY2xpY2tBd2F5LmJpbmQodGhpcykpO1xuXG4gICAgdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YSA9IGNvbHVtbkRhdGE7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc0xhYmVsJCA9IGNvbHVtbkRhdGEuY29uZmlnLmxhYmVsO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlckRpc3BsYXkoY29sdW1uRGF0YS50eXBlKTtcblxuICAgICAgdGhpcy51cGRhdGVGaWx0ZXJWYXJzV2l0aEN1cnJlbnQoY29sdW1uRGF0YSk7XG5cbiAgICAgIHRoaXMuYlNob3dGaWx0ZXJQb3BvdmVyJCA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBfY2xpY2tBd2F5KGV2ZW50OiBhbnkpIHtcbiAgICBsZXQgYkluUG9wVXAgPSBmYWxzZTtcblxuICAgIC8vIHJ1biB0aHJvdWdoIGxpc3Qgb2YgZWxlbWVudHMgaW4gcGF0aCwgaWYgbWVudSBub3QgaW4gdGggcGF0aCwgdGhlbiB3YW50IHRvXG4gICAgLy8gaGlkZSAodG9nZ2xlKSB0aGUgbWVudVxuICAgIGNvbnN0IGV2ZW50UGF0aCA9IGV2ZW50LnBhdGg7XG4gICAgZm9yIChsZXQgcGF0aEluZGV4ID0gMDsgcGF0aEluZGV4IDwgZXZlbnRQYXRoLmxlbmd0aDsgcGF0aEluZGV4KyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgZXZlbnRQYXRoW3BhdGhJbmRleF0uY2xhc3NOYW1lID09ICdwc2RrLW1vZGFsLWZpbGUtdG9wJyB8fFxuICAgICAgICBldmVudFBhdGhbcGF0aEluZGV4XS50YWdOYW1lID09ICdCVVRUT04nIHx8XG4gICAgICAgIGV2ZW50UGF0aFtwYXRoSW5kZXhdLnRhZ05hbWUgPT0gJ01BVC1PUFRJT04nIHx8XG4gICAgICAgIGV2ZW50UGF0aFtwYXRoSW5kZXhdLnRhZ05hbWUgPT0gJ01BVC1JTlBVVCdcbiAgICAgICkge1xuICAgICAgICBiSW5Qb3BVcCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWJJblBvcFVwKSB7XG4gICAgICAvLyB0aGlzLmJTaG93RmlsdGVyUG9wb3ZlciQgPSBmYWxzZTtcblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9jbGlja0F3YXkuYmluZCh0aGlzKSk7XG4gICAgfVxuICB9XG5cbiAgX2ZpbHRlckNvbnRhaW5zVHlwZShldmVudCkge1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9IGV2ZW50LnZhbHVlO1xuICB9XG5cbiAgX2ZpbHRlckNvbnRhaW5zVmFsdWUoZXZlbnQpIHtcbiAgICB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICB9XG5cbiAgX2ZpbHRlckNvbnRhaW5zRGF0ZVZhbHVlKGV2ZW50LCB2YWx1ZSkge1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSB2YWx1ZTtcbiAgfVxuXG4gIF9maWx0ZXJDb250YWluc0RhdGVUaW1lVmFsdWUoZXZlbnQpIHtcbiAgICB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICB9XG5cbiAgX2ZpbHRlckNvbnRhaW5zVGltZVZhbHVlKGV2ZW50KSB7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgfVxuXG4gIF9vbkZpbHRlckFjdGlvbkJ1dHRvbkNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICAvLyBtb2RhbCBidXR0b25zXG4gICAgc3dpdGNoIChldmVudC5hY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2NhbmNlbCc6XG4gICAgICAgIHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEgPSBbXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdWJtaXQnOlxuICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcldpdGhJbmZvKCk7XG4gICAgICAgIHRoaXMuZmlsdGVyU29ydEdyb3VwQnkoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLmJTaG93RmlsdGVyUG9wb3ZlciQgPSBmYWxzZTtcblxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fY2xpY2tBd2F5LmJpbmQodGhpcykpO1xuICB9XG5cbiAgdXBkYXRlRmlsdGVyV2l0aEluZm8oKSB7XG4gICAgbGV0IGJGb3VuZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgZmlsdGVyT2JqIG9mIHRoaXMuZmlsdGVyQnlDb2x1bW5zKSB7XG4gICAgICBpZiAoZmlsdGVyT2JqLnJlZiA9PT0gdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YS5jb25maWcubmFtZSkge1xuICAgICAgICBmaWx0ZXJPYmoudHlwZSA9IHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEudHlwZTtcbiAgICAgICAgZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyID0gdGhpcy5maWx0ZXJDb250YWluc1R5cGUkO1xuICAgICAgICBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZSA9IHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQ7XG5cbiAgICAgICAgYkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFiRm91bmQpIHtcbiAgICAgIC8vIGFkZCBpblxuICAgICAgY29uc3QgZmlsdGVyT2JqOiBhbnkgPSB7fTtcbiAgICAgIGZpbHRlck9iai5yZWYgPSB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhLmNvbmZpZy5uYW1lO1xuICAgICAgZmlsdGVyT2JqLnR5cGUgPSB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhLnR5cGU7XG4gICAgICBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIgPSB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQ7XG4gICAgICBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZSA9IHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQ7XG5cbiAgICAgIHRoaXMuZmlsdGVyQnlDb2x1bW5zLnB1c2goZmlsdGVyT2JqKTtcbiAgICB9XG5cbiAgICAvLyBpdGVyYXRlIHRocm91Z2ggZmlsdGVycyBhbmQgdXBkYXRlIGZpbHRlck9uIGljb25cbiAgICBmb3IgKGNvbnN0IGZpbHRlck9iaiBvZiB0aGlzLmZpbHRlckJ5Q29sdW1ucykge1xuICAgICAgY29uc3QgY29udGFpbnNGaWx0ZXJWYWx1ZSA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlO1xuICAgICAgY29uc3QgY29udGFpbnNGaWx0ZXIgPSBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXI7XG4gICAgICBjb25zdCBmaWx0ZXJSZWYgPSBmaWx0ZXJPYmoucmVmO1xuICAgICAgY29uc3QgZmlsdGVySW5kZXggPSB0aGlzLmRpc3BsYXllZENvbHVtbnMkLmluZGV4T2YoZmlsdGVyUmVmKTtcbiAgICAgIGNvbnN0IGFyRmlsdGVySW1nID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ2ZpbHRlck9uSWNvbicpO1xuICAgICAgY29uc3QgZmlsdGVySW1nOiBhbnkgPSBhckZpbHRlckltZ1tmaWx0ZXJJbmRleF07XG4gICAgICBpZiAoY29udGFpbnNGaWx0ZXJWYWx1ZSA9PSAnJyAmJiBjb250YWluc0ZpbHRlciAhPSAnbnVsbCcgJiYgY29udGFpbnNGaWx0ZXIgIT0gJ25vdG51bGwnKSB7XG4gICAgICAgIC8vIGNsZWFyIGljb25cbiAgICAgICAgZmlsdGVySW1nLnNyYyA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2hvdyBpY29uXG4gICAgICAgIGZpbHRlckltZy5zcmMgPSB0aGlzLmZpbHRlck9uU3ZnSWNvbiQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRmlsdGVyVmFyc1dpdGhDdXJyZW50KGNvbHVtbkRhdGEpIHtcbiAgICAvLyBmaW5kIGN1cnJlbnQgcmVmLCBpZiBleGlzdHMsIG1vdmUgZGF0YSB0byB2YXJpYWJsZSB0byBkaXNwbGF5XG5cbiAgICBsZXQgYkZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBmaWx0ZXJPYmogb2YgdGhpcy5maWx0ZXJCeUNvbHVtbnMpIHtcbiAgICAgIGlmIChmaWx0ZXJPYmoucmVmID09PSB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhLmNvbmZpZy5uYW1lKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlcjtcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJCA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlO1xuXG4gICAgICAgIGJGb3VuZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYkZvdW5kKSB7XG4gICAgICBzd2l0Y2ggKGNvbHVtbkRhdGEudHlwZSkge1xuICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgY2FzZSAnRGF0ZVRpbWUnOlxuICAgICAgICBjYXNlICdUaW1lJzpcbiAgICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnbm90ZXF1YWwnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdjb250YWlucyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSAnJztcbiAgICB9XG4gIH1cblxuICBmaWx0ZXJEYXRhKGl0ZW06IGFueSkge1xuICAgIGxldCBiS2VlcCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBmaWx0ZXJPYmogb2YgdGhpcy5maWx0ZXJCeUNvbHVtbnMpIHtcbiAgICAgIGlmIChmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZSAhPSAnJyB8fCBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIgPT0gJ251bGwnIHx8IGZpbHRlck9iai5jb250YWluc0ZpbHRlciA9PSAnbm90bnVsbCcpIHtcbiAgICAgICAgbGV0IGZpbHRlclZhbHVlOiBhbnk7XG5cbiAgICAgICAgc3dpdGNoIChmaWx0ZXJPYmoudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICAgIGNhc2UgJ0RhdGVUaW1lJzpcbiAgICAgICAgICBjYXNlICdUaW1lJzpcbiAgICAgICAgICAgIGJLZWVwID0gdGhpcy5maWx0ZXJEYXRhV2l0aERhdGUoaXRlbSwgZmlsdGVyT2JqLCBmaWx0ZXJWYWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYktlZXAgPSB0aGlzLmZpbHRlckRhdGFXaXRoQ29tbW9uVHlwZXMoaXRlbSwgZmlsdGVyT2JqLCBmaWx0ZXJWYWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBpZiBkb24ndCBrZWVwIHN0b3AgZmlsdGVyaW5nXG4gICAgICBpZiAoIWJLZWVwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiS2VlcDtcbiAgfVxuXG4gIGZpbHRlckRhdGFXaXRoRGF0ZShpdGVtLCBmaWx0ZXJPYmosIGZpbHRlclZhbHVlKSB7XG4gICAgbGV0IGJLZWVwO1xuICAgIGxldCB2YWx1ZSA9IGl0ZW1bZmlsdGVyT2JqLnJlZl0gIT0gbnVsbCA/PyBpdGVtW2ZpbHRlck9iai5yZWZdICE9ICcnID8gZ2V0U2Vjb25kcyhpdGVtW2ZpbHRlck9iai5yZWZdKSA6IG51bGw7XG4gICAgZmlsdGVyVmFsdWUgPSBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZSAhPSBudWxsICYmIGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlICE9ICcnID8gZ2V0U2Vjb25kcyhmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZSkgOiBudWxsO1xuXG4gICAgc3dpdGNoIChmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIpIHtcbiAgICAgIGNhc2UgJ25vdGVxdWFsJzpcbiAgICAgICAgLy8gYmVjYXN1ZSBmaWx0ZXJWYWx1ZSBpcyBpbiBtaW51dGVzLCBuZWVkIHRvIGhhdmUgYSByYW5nZSBvZiBsZXNzIHRoYW4gNjAgc2Vjb25zXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIGZpbHRlclZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBnZXQgcmlkIG9mIG1pbGxpc2Vjb25zXG4gICAgICAgICAgdmFsdWUgLz0gMTAwMDtcbiAgICAgICAgICBmaWx0ZXJWYWx1ZSAvPSAxMDAwO1xuXG4gICAgICAgICAgY29uc3QgZGlmZiA9IHZhbHVlIC0gZmlsdGVyVmFsdWU7XG4gICAgICAgICAgaWYgKGRpZmYgPj0gMCAmJiBkaWZmIDwgNjApIHtcbiAgICAgICAgICAgIGJLZWVwID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYWZ0ZXInOlxuICAgICAgICBpZiAodmFsdWUgPCBmaWx0ZXJWYWx1ZSkge1xuICAgICAgICAgIGJLZWVwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdiZWZvcmUnOlxuICAgICAgICBpZiAodmFsdWUgPiBmaWx0ZXJWYWx1ZSkge1xuICAgICAgICAgIGJLZWVwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBiS2VlcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbm90bnVsbCc6XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgYktlZXAgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBiS2VlcDtcbiAgfVxuXG4gIGZpbHRlckRhdGFXaXRoQ29tbW9uVHlwZXMoaXRlbSwgZmlsdGVyT2JqLCBmaWx0ZXJWYWx1ZSkge1xuICAgIGxldCBiS2VlcDtcbiAgICBjb25zdCB2YWx1ZSA9IGl0ZW1bZmlsdGVyT2JqLnJlZl0udG9Mb3dlckNhc2UoKTtcbiAgICBmaWx0ZXJWYWx1ZSA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBzd2l0Y2ggKGZpbHRlck9iai5jb250YWluc0ZpbHRlcikge1xuICAgICAgY2FzZSAnY29udGFpbnMnOlxuICAgICAgICBpZiAodmFsdWUuaW5kZXhPZihmaWx0ZXJWYWx1ZSkgPCAwKSB7XG4gICAgICAgICAgYktlZXAgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VxdWFscyc6XG4gICAgICAgIGlmICh2YWx1ZSAhPSBmaWx0ZXJWYWx1ZSkge1xuICAgICAgICAgIGJLZWVwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdGFydHN3aXRoJzpcbiAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoZmlsdGVyVmFsdWUpICE9IDApIHtcbiAgICAgICAgICBiS2VlcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJLZWVwO1xuICB9XG5cbiAgZmlsdGVyU29ydEdyb3VwQnkoKSB7XG4gICAgLy8gZ2V0IG9yaWdpbmFsIGRhdGEgc2V0XG4gICAgbGV0IHRoZURhdGEgPSB0aGlzLnJlcGVhdExpc3REYXRhLnNsaWNlKCk7XG5cbiAgICAvLyBsYXN0IGZpbHRlciBjb25maWcgZGF0YSBpcyBnbG9iYWxcbiAgICB0aGVEYXRhID0gdGhlRGF0YS5maWx0ZXIodGhpcy5maWx0ZXJEYXRhLmJpbmQodGhpcykpO1xuXG4gICAgLy8gbGFzdCBzb3J0IGNvbmZpZyBkYXRhIGlzIGdsb2JhbFxuICAgIHRoZURhdGEuc29ydCh0aGlzLnNvcnRDb21wYXJlLmJpbmQodGhpcykpO1xuXG4gICAgY29uc3QgcmVHcm91cERhdGEgPSB0aGlzLmFkZEdyb3Vwcyh0aGVEYXRhLCB0aGlzLmdyb3VwQnlDb2x1bW5zJCk7XG5cbiAgICB0aGlzLnJlcGVhdExpc3QkLmRhdGEgPSBbXTtcbiAgICB0aGlzLnJlcGVhdExpc3QkLmRhdGEucHVzaCguLi5yZUdyb3VwRGF0YSk7XG5cbiAgICBpZiAodGhpcy5zZWFyY2hGaWx0ZXIgJiYgdGhpcy5zZWFyY2hGaWx0ZXIgIT0gJycpIHtcbiAgICAgIHRoaXMucmVwZWF0TGlzdCQuZmlsdGVyID0gdGhpcy5zZWFyY2hGaWx0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGVyZkZpbHRlciA9IHBlcmZvcm1hbmNlLm5vdygpLnRvU3RyaW5nKCk7XG4gICAgICB0aGlzLnJlcGVhdExpc3QkLmZpbHRlciA9IHRoaXMucGVyZkZpbHRlcjtcbiAgICB9XG4gICAgdGhpcy5yZXBlYXRMaXN0JC5maWx0ZXIgPSAnJztcblxuICAgIGlmICh0aGlzLnJlcGVhdExpc3QkLnBhZ2luYXRvcikge1xuICAgICAgdGhpcy5yZXBlYXRMaXN0JC5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgLy9cbiAgLy8gR3JvdXBpbmcgY29kZSBpbnNwaXJlZCBieSB0aGlzIGV4YW1wbGVcbiAgLy8gaHR0cHM6Ly9zdGFja2JsaXR6LmNvbS9lZGl0L2FuZ3VsYXItbWF0ZXJpYWwtdGFibGUtcm93LWdyb3VwaW5nXG4gIC8vXG5cbiAgX3Nob3dVbkdyb3VwQnkoY29sdW1uRGF0YSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuZ3JvdXBCeUNvbHVtbnMkKSB7XG4gICAgICBpZiAodmFsID09IGNvbHVtbkRhdGEuY29uZmlnLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgX2dyb3VwQnkoZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgICB0aGlzLmNoZWNrR3JvdXBCeUNvbHVtbihjb2x1bW5EYXRhLmNvbmZpZy5uYW1lLCB0cnVlKTtcblxuICAgIHRoaXMuZmlsdGVyU29ydEdyb3VwQnkoKTtcbiAgfVxuXG4gIF91bkdyb3VwQnkoZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgICAvLyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmNoZWNrR3JvdXBCeUNvbHVtbihjb2x1bW5EYXRhLmNvbmZpZy5uYW1lLCBmYWxzZSk7XG5cbiAgICB0aGlzLmZpbHRlclNvcnRHcm91cEJ5KCk7XG4gIH1cblxuICBjaGVja0dyb3VwQnlDb2x1bW4oZmllbGQsIGFkZCkge1xuICAgIGxldCBmb3VuZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGhpcy5ncm91cEJ5Q29sdW1ucyQpIHtcbiAgICAgIGlmIChjb2x1bW4gPT09IGZpZWxkKSB7XG4gICAgICAgIGZvdW5kID0gdGhpcy5ncm91cEJ5Q29sdW1ucyQuaW5kZXhPZihjb2x1bW4sIDApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZm91bmQgIT0gbnVsbCAmJiBmb3VuZCA+PSAwKSB7XG4gICAgICBpZiAoIWFkZCkge1xuICAgICAgICB0aGlzLmdyb3VwQnlDb2x1bW5zJC5zcGxpY2UoZm91bmQsIDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWRkKSB7XG4gICAgICB0aGlzLmdyb3VwQnlDb2x1bW5zJC5wdXNoKGZpZWxkKTtcbiAgICB9XG4gIH1cblxuICBhZGRHcm91cHMoZGF0YTogYW55W10sIGdyb3VwQnlDb2x1bW5zOiBzdHJpbmdbXSk6IGFueVtdIHtcbiAgICBjb25zdCByb290R3JvdXAgPSBuZXcgR3JvdXAoKTtcbiAgICByb290R3JvdXAuZXhwYW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLmdldFN1YmxldmVsKGRhdGEsIDAsIGdyb3VwQnlDb2x1bW5zLCByb290R3JvdXApO1xuICB9XG5cbiAgZ2V0U3VibGV2ZWwoZGF0YTogYW55W10sIGxldmVsOiBudW1iZXIsIGdyb3VwQnlDb2x1bW5zOiBzdHJpbmdbXSwgcGFyZW50OiBHcm91cCk6IGFueVtdIHtcbiAgICBpZiAobGV2ZWwgPj0gZ3JvdXBCeUNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgY29uc3QgZ3JvdXBzID0gdGhpcy51bmlxdWVCeShcbiAgICAgIGRhdGEubWFwKHJvdyA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBHcm91cCgpO1xuICAgICAgICByZXN1bHQubGV2ZWwgPSBsZXZlbCArIDE7XG4gICAgICAgIHJlc3VsdC5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGxldmVsOyBpKyspIHtcbiAgICAgICAgICByZXN1bHRbZ3JvdXBCeUNvbHVtbnNbaV1dID0gcm93W2dyb3VwQnlDb2x1bW5zW2ldXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSksXG4gICAgICBKU09OLnN0cmluZ2lmeVxuICAgICk7XG5cbiAgICBjb25zdCBjdXJyZW50Q29sdW1uID0gZ3JvdXBCeUNvbHVtbnNbbGV2ZWxdO1xuICAgIGxldCBzdWJHcm91cHM6IGFueVtdID0gW107XG4gICAgZ3JvdXBzLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgY29uc3Qgcm93c0luR3JvdXAgPSBkYXRhLmZpbHRlcihyb3cgPT4gZ3JvdXBbY3VycmVudENvbHVtbl0gPT09IHJvd1tjdXJyZW50Q29sdW1uXSk7XG4gICAgICBncm91cC50b3RhbENvdW50cyA9IHJvd3NJbkdyb3VwLmxlbmd0aDtcbiAgICAgIGNvbnN0IHN1Ykdyb3VwID0gdGhpcy5nZXRTdWJsZXZlbChyb3dzSW5Hcm91cCwgbGV2ZWwgKyAxLCBncm91cEJ5Q29sdW1ucywgZ3JvdXApO1xuICAgICAgc3ViR3JvdXAudW5zaGlmdChncm91cCk7XG4gICAgICBzdWJHcm91cHMgPSBzdWJHcm91cHMuY29uY2F0KHN1Ykdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3ViR3JvdXBzO1xuICB9XG5cbiAgdW5pcXVlQnkoYSwga2V5KSB7XG4gICAgY29uc3Qgc2VlbiA9IHt9O1xuICAgIHJldHVybiBhLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGNvbnN0IGsgPSBrZXkoaXRlbSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmV0dXJuLWFzc2lnbiwgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICByZXR1cm4gc2Vlbi5oYXNPd25Qcm9wZXJ0eShrKSA/IGZhbHNlIDogKHNlZW5ba10gPSB0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzR3JvdXAoaW5kZXgsIGl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXRlbS5sZXZlbDtcbiAgfVxuXG4gIF9ncm91cEhlYWRlckNsaWNrKHJvdykge1xuICAgIHJvdy5leHBhbmRlZCA9ICFyb3cuZXhwYW5kZWQ7XG4gICAgLy8gdGhpcy5yZXBlYXRMaXN0JC5maWx0ZXIgPSBcIlwiO1xuICAgIHRoaXMucGVyZkZpbHRlciA9IHBlcmZvcm1hbmNlLm5vdygpLnRvU3RyaW5nKCk7XG4gICAgdGhpcy5yZXBlYXRMaXN0JC5maWx0ZXIgPSB0aGlzLnBlcmZGaWx0ZXI7XG4gIH1cblxuICAvLyBiZWxvdyBpcyBmb3IgZ3JpZCByb3cgZ3JvdXBpbmdcbiAgY3VzdG9tRmlsdGVyUHJlZGljYXRlKGRhdGE6IGFueSB8IEdyb3VwLCBmaWx0ZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkYXRhIGluc3RhbmNlb2YgR3JvdXAgPyBkYXRhLnZpc2libGUgOiB0aGlzLmdldERhdGFSb3dWaXNpYmxlV2l0aEZpbHRlcihkYXRhLCBmaWx0ZXIpO1xuICB9XG5cbiAgZ2V0RGF0YVJvd1Zpc2libGUoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZ3JvdXBSb3dzID0gdGhpcy5yZXBlYXRMaXN0JC5kYXRhLmZpbHRlcihyb3cgPT4ge1xuICAgICAgaWYgKCEocm93IGluc3RhbmNlb2YgR3JvdXApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGxldCBtYXRjaCA9IHRydWU7XG4gICAgICB0aGlzLmdyb3VwQnlDb2x1bW5zJC5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAgIGlmICghcm93W2NvbHVtbl0gfHwgIWRhdGFbY29sdW1uXSB8fCByb3dbY29sdW1uXSAhPT0gZGF0YVtjb2x1bW5dKSB7XG4gICAgICAgICAgbWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG5cbiAgICBpZiAoZ3JvdXBSb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGdyb3VwUm93c1swXSBhcyBHcm91cDtcbiAgICByZXR1cm4gcGFyZW50LnZpc2libGUgJiYgcGFyZW50LmV4cGFuZGVkO1xuICB9XG5cbiAgZ2V0RGF0YVJvd1Zpc2libGVXaXRoRmlsdGVyKGRhdGEsIGZpbHRlcikge1xuICAgIC8vIGZpc3QgY2hlY2sgaWYgcm93IGlzIHZpc2libGUgd2l0aCBncm91cGluZ1xuICAgIGxldCBiVmlzaWJsZSA9IHRoaXMuZ2V0RGF0YVJvd1Zpc2libGUoZGF0YSk7XG5cbiAgICBpZiAoYlZpc2libGUgJiYgZmlsdGVyICYmIGZpbHRlciAhPSAnJyAmJiBmaWx0ZXIgIT0gdGhpcy5wZXJmRmlsdGVyKSB7XG4gICAgICAvLyBub3cgY2hlY2sgaWYgcm93IGlzIGZpbHRlcmVkLlxuXG4gICAgICAvLyBhc3N1bWUgbm90IHRoZXJlIHVubGVzcyB3ZSBmaW5kIGl0XG4gICAgICBiVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zJCkge1xuICAgICAgICAvLyBmaWx0ZXIgaXMgbG93ZXIgY2FzZVxuICAgICAgICBpZiAoZGF0YVtjb2xdICYmIGRhdGFbY29sXS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihmaWx0ZXIpID49IDApIHtcbiAgICAgICAgICBiVmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYlZpc2libGU7XG4gIH1cblxuICB1cGRhdGVEYXRhKGxpc3REYXRhOiBhbnlbXSwgZmllbGREYXRhOiBhbnlbXSk6IGFueVtdIHtcbiAgICBjb25zdCByZXR1cm5MaXN0OiBhbnlbXSA9IG5ldyBBcnJheTxhbnk+KCk7XG4gICAgbGlzdERhdGEuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgLy8gY29weVxuICAgICAgY29uc3Qgcm93RGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocm93KSk7XG5cbiAgICAgIGZvciAobGV0IGZpZWxkSW5kZXggPSAwOyBmaWVsZEluZGV4IDwgZmllbGREYXRhLmxlbmd0aDsgZmllbGRJbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGZpZWxkRGF0YVtmaWVsZEluZGV4XS5jb25maWc7XG4gICAgICAgIGxldCBmaWVsZE5hbWU7XG4gICAgICAgIGxldCBmb3JtYXR0ZWREYXRlO1xuICAgICAgICBsZXQgbXlGb3JtYXQ7XG4gICAgICAgIGxldCB0aGVDdXJyZW5jeU9wdGlvbnM7XG5cbiAgICAgICAgc3dpdGNoIChmaWVsZERhdGFbZmllbGRJbmRleF0udHlwZSkge1xuICAgICAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICAgICAgZmllbGROYW1lID0gY29uZmlnLm5hbWU7XG4gICAgICAgICAgICBteUZvcm1hdCA9IGNvbmZpZy5mb3JtYXR0ZXI7XG4gICAgICAgICAgICBpZiAoIW15Rm9ybWF0KSB7XG4gICAgICAgICAgICAgIG15Rm9ybWF0ID0gJ0RhdGUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybWF0dGVkRGF0ZSA9IHRoaXMudXRpbHMuZ2VuZXJhdGVEYXRlKHJvd0RhdGFbZmllbGROYW1lXSwgbXlGb3JtYXQpO1xuXG4gICAgICAgICAgICByb3dEYXRhW2ZpZWxkTmFtZV0gPSBmb3JtYXR0ZWREYXRlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnRGF0ZVRpbWUnOlxuICAgICAgICAgICAgZmllbGROYW1lID0gY29uZmlnLm5hbWU7XG4gICAgICAgICAgICBteUZvcm1hdCA9IGNvbmZpZy5mb3JtYXR0ZXI7XG4gICAgICAgICAgICBpZiAoIW15Rm9ybWF0KSB7XG4gICAgICAgICAgICAgIG15Rm9ybWF0ID0gJ0RhdGVUaW1lLUxvbmcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybWF0dGVkRGF0ZSA9IHRoaXMudXRpbHMuZ2VuZXJhdGVEYXRlVGltZShyb3dEYXRhW2ZpZWxkTmFtZV0sIG15Rm9ybWF0KTtcblxuICAgICAgICAgICAgcm93RGF0YVtmaWVsZE5hbWVdID0gZm9ybWF0dGVkRGF0ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ0N1cnJlbmN5JzpcbiAgICAgICAgICAgIGZpZWxkTmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgICAgICAgICAgdGhlQ3VycmVuY3lPcHRpb25zID0gZ2V0Q3VycmVuY3lPcHRpb25zKFBDb3JlLmdldEVudmlyb25tZW50SW5mbygpLmdldExvY2FsZSgpIGFzIHN0cmluZyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY2FzZS1kZWNsYXJhdGlvbnNcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICAgICAgICBsb2NhbGU6IGdldExvY2FsZSgpLFxuICAgICAgICAgICAgICBwb3NpdGlvbjogJ2JlZm9yZScsXG4gICAgICAgICAgICAgIGRlY1BsYWNlczogMlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jYXNlLWRlY2xhcmF0aW9uc1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgLi4udGhlQ3VycmVuY3lPcHRpb25zIH07XG4gICAgICAgICAgICByb3dEYXRhW2ZpZWxkTmFtZV0gPSBmb3JtYXR0ZXJzLkN1cnJlbmN5KHJvd0RhdGFbZmllbGROYW1lXSwgcGFyYW1zKTtcbiAgICAgICAgICAgIC8vIHZhbCA9IGZvcm1hdCh2YWx1ZSwgY29sdW1uLnR5cGUsIHRoZUN1cnJlbmN5T3B0aW9ucyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybkxpc3QucHVzaChyb3dEYXRhKTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXR1cm5MaXN0O1xuICB9XG5cbiAgb3BlbkFzc2lnbm1lbnQocm93KSB7XG4gICAgY29uc3QgeyBweFJlZk9iamVjdENsYXNzLCBwekluc0tleSB9ID0gcm93O1xuICAgIGNvbnN0IHNUYXJnZXQgPSB0aGlzLnBDb25uJC5nZXRDb250YWluZXJOYW1lKCk7XG4gICAgY29uc3Qgb3B0aW9uczogYW55ID0geyBjb250YWluZXJOYW1lOiBzVGFyZ2V0IH07XG4gICAgdGhpcy5wQ29ubiQuZ2V0QWN0aW9uc0FwaSgpLm9wZW5Bc3NpZ25tZW50KHB6SW5zS2V5LCBweFJlZk9iamVjdENsYXNzLCBvcHRpb25zKTtcbiAgfVxuXG4gIG9wZW5Xb3JrKHJvdykge1xuICAgIGNvbnN0IHB4UmVmT2JqZWN0Q2xhc3MgPSByb3cucHhSZWZPYmplY3RDbGFzcyB8fCByb3cucHhPYmpDbGFzcztcbiAgICBjb25zdCB7IHB4UmVmT2JqZWN0S2V5IH0gPSByb3c7XG4gICAgaWYgKHB4UmVmT2JqZWN0Q2xhc3MgIT09ICcnICYmIHB4UmVmT2JqZWN0S2V5ICE9PSAnJykge1xuICAgICAgdGhpcy5wQ29ubiQuZ2V0QWN0aW9uc0FwaSgpLm9wZW5Xb3JrQnlIYW5kbGUocHhSZWZPYmplY3RLZXksIHB4UmVmT2JqZWN0Q2xhc3MpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRpYWxpemVEYXRhKGRhdGEpIHtcbiAgICBkYXRhLmZvckVhY2goKGl0ZW0sIGlkeCkgPT4ge1xuICAgICAgaXRlbS5fX29yaWdpbmFsX2luZGV4ID0gaWR4O1xuICAgICAgaXRlbS5fX2xldmVsID0gMTtcbiAgICB9KTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZ2V0VHlwZShmaWVsZCkge1xuICAgIGNvbnN0IHsgY29uZmlnID0ge30sIHR5cGUgfSA9IGZpZWxkO1xuICAgIGNvbnN0IHsgZm9ybWF0VHlwZSB9ID0gY29uZmlnO1xuICAgIGlmIChmb3JtYXRUeXBlID09PSAnZGF0ZXRpbWUnIHx8IGZvcm1hdFR5cGUgPT09ICdkYXRlJykge1xuICAgICAgLy8gY3VycmVudGx5IGNvc21vcyBoYXMgb25seSBzdXBwb3J0IGZvciBkYXRlIC4uLiBpdCBhbHNvIG5lZWQgdG8gc3VwcG9ydCBkYXRlVGltZVxuICAgICAgcmV0dXJuICdkYXRlJztcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZUNvbHVtbnMoZmllbGRzID0gW10pIHtcbiAgICByZXR1cm4gZmllbGRzLm1hcCgoZmllbGQ6IGFueSwgb3JpZ2luYWxDb2xJbmRleCkgPT4gKHtcbiAgICAgIC4uLmZpZWxkLFxuICAgICAgdHlwZTogdGhpcy5nZXRUeXBlKGZpZWxkKSxcbiAgICAgIG5hbWU6IGZpZWxkLmNvbmZpZy52YWx1ZS5zdWJzdHJpbmcoNCksXG4gICAgICBsYWJlbDogZmllbGQuY29uZmlnLmxhYmVsLnN1YnN0cmluZygzKSxcbiAgICAgIGlkOiBvcmlnaW5hbENvbEluZGV4LFxuICAgICAgZ3JvdXBpbmdFbmFibGVkOiB0cnVlLFxuICAgICAgZ3JvdXBlZDogZmFsc2UsXG4gICAgICBtaW5XaWR0aDogNTAsXG4gICAgICBjZWxsUmVuZGVyZXI6IHRoaXMuZ2V0VHlwZShmaWVsZCkgPT09ICd0ZXh0JyA/IG51bGwgOiBmaWVsZC50eXBlLFxuICAgICAgZmlsdGVyOiB0cnVlXG4gICAgfSkpO1xuICB9XG5cbiAgZ2V0SGVhZGVyQ2VsbHMoY29sRmllbGRzLCBmaWVsZHMpIHtcbiAgICBjb25zdCBBc3NpZ25EYXNoT2JqZWN0cyA9IFsnQXNzaWduLVdvcmtsaXN0JywgJ0Fzc2lnbi1Xb3JrQmFza2V0J107XG4gICAgcmV0dXJuIGNvbEZpZWxkcy5tYXAoKGZpZWxkOiBhbnksIGluZGV4KSA9PiB7XG4gICAgICBsZXQgdGhlRmllbGQgPSBmaWVsZC5jb25maWcudmFsdWUuc3Vic3RyaW5nKGZpZWxkLmNvbmZpZy52YWx1ZS5pbmRleE9mKCcgJykgKyAxKTtcbiAgICAgIGlmICh0aGVGaWVsZC5pbmRleE9mKCcuJykgPT09IDApIHtcbiAgICAgICAgdGhlRmllbGQgPSB0aGVGaWVsZC5zdWJzdHJpbmcoMSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb2xJbmRleCA9IGZpZWxkcy5maW5kSW5kZXgoZWxlID0+IGVsZS5uYW1lID09PSB0aGVGaWVsZCk7XG4gICAgICBjb25zdCBkaXNwbGF5QXNMaW5rID0gZmllbGQuY29uZmlnLmRpc3BsYXlBc0xpbms7XG4gICAgICBjb25zdCBoZWFkZXJSb3c6IGFueSA9IHt9O1xuICAgICAgaGVhZGVyUm93LmlkID0gZmllbGRzW2luZGV4XS5pZDtcbiAgICAgIGhlYWRlclJvdy50eXBlID0gZmllbGQudHlwZTtcbiAgICAgIGhlYWRlclJvdy5kaXNwbGF5QXNMaW5rID0gZGlzcGxheUFzTGluaztcbiAgICAgIGhlYWRlclJvdy5udW1lcmljID0gZmllbGQudHlwZSA9PT0gJ0RlY2ltYWwnIHx8IGZpZWxkLnR5cGUgPT09ICdJbnRlZ2VyJyB8fCBmaWVsZC50eXBlID09PSAnUGVyY2VudGFnZScgfHwgZmllbGQudHlwZSA9PT0gJ0N1cnJlbmN5JyB8fCBmYWxzZTtcbiAgICAgIGhlYWRlclJvdy5kaXNhYmxlUGFkZGluZyA9IGZhbHNlO1xuICAgICAgaGVhZGVyUm93LmxhYmVsID0gZmllbGRzW2luZGV4XS5sYWJlbDtcbiAgICAgIGlmIChjb2xJbmRleCA+IC0xKSB7XG4gICAgICAgIGhlYWRlclJvdy5jbGFzc0lEID0gZmllbGRzW2NvbEluZGV4XS5jbGFzc0lEO1xuICAgICAgfVxuICAgICAgaWYgKGRpc3BsYXlBc0xpbmspIHtcbiAgICAgICAgaGVhZGVyUm93LmlzQXNzaWdubWVudExpbmsgPSBBc3NpZ25EYXNoT2JqZWN0cy5pbmNsdWRlcyhoZWFkZXJSb3cuY2xhc3NJRCk7XG4gICAgICAgIGlmIChmaWVsZC5jb25maWcudmFsdWU/LnN0YXJ0c1dpdGgoJ0BDQScpKSB7XG4gICAgICAgICAgaGVhZGVyUm93LmlzQXNzb2NpYXRpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaGVhZGVyUm93O1xuICAgIH0pO1xuICB9XG5cbiAgYnVpbGRTZWxlY3QoZmllbGREZWZzLCBjb2xJZCwgcGF0Y2hRdWVyeUZpZWxkcyA9IFtdLCBjb21wb3NpdGVLZXlzID0gW10pIHtcbiAgICBjb25zdCBsaXN0RmllbGRzOiBhbnkgPSBbXTtcbiAgICBpZiAoY29sSWQpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5nZXRGaWVsZChmaWVsZERlZnMsIGNvbElkKTtcbiAgICAgIGxpc3RGaWVsZHMucHVzaCh7XG4gICAgICAgIGZpZWxkOiBmaWVsZC5uYW1lXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTk9URTogSWYgd2UgZXZlciBkZWNpZGUgdG8gbm90IHNldCB1cCBhbGwgdGhlIGBmaWVsZERlZnNgIG9uIHNlbGVjdCwgZW5zdXJlIHRoYXQgdGhlIGZpZWxkc1xuICAgICAgLy8gIGNvcnJlc3BvbmRpbmcgdG8gYHN0YXRlLmdyb3Vwc2AgYXJlIHNldCB1cC4gTmVlZGVkIGluIENsaWVudC1tb2RlIGdyb3VwaW5nL3BhZ2luYXRpb24uXG4gICAgICBmaWVsZERlZnMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgIGlmICghbGlzdEZpZWxkcy5maW5kKGYgPT4gZi5maWVsZCA9PT0gZmllbGQubmFtZSkpIHtcbiAgICAgICAgICBsaXN0RmllbGRzLnB1c2goe1xuICAgICAgICAgICAgZmllbGQ6IGZpZWxkLm5hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwYXRjaFF1ZXJ5RmllbGRzLmZvckVhY2goayA9PiB7XG4gICAgICAgIGlmICghbGlzdEZpZWxkcy5maW5kKGYgPT4gZi5maWVsZCA9PT0gaykpIHtcbiAgICAgICAgICBsaXN0RmllbGRzLnB1c2goe1xuICAgICAgICAgICAgZmllbGQ6IGtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29tcG9zaXRlS2V5cy5mb3JFYWNoKGsgPT4ge1xuICAgICAgaWYgKCFsaXN0RmllbGRzLmZpbmQoZiA9PiBmLmZpZWxkID09PSBrKSkge1xuICAgICAgICBsaXN0RmllbGRzLnB1c2goe1xuICAgICAgICAgIGZpZWxkOiBrXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBsaXN0RmllbGRzO1xuICB9XG5cbiAgZ2V0RmllbGQoZmllbGREZWZzLCBjb2x1bW5JZCkge1xuICAgIGNvbnN0IGZpZWxkc01hcCA9IHRoaXMuZ2V0RmllbGRzTWFwKGZpZWxkRGVmcyk7XG4gICAgcmV0dXJuIGZpZWxkc01hcC5nZXQoY29sdW1uSWQpO1xuICB9XG5cbiAgZ2V0RmllbGRzTWFwKGZpZWxkRGVmcykge1xuICAgIGNvbnN0IGZpZWxkc01hcCA9IG5ldyBNYXAoKTtcbiAgICBmaWVsZERlZnMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGZpZWxkc01hcC5zZXQoZWxlbWVudC5pZCwgZWxlbWVudCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpZWxkc01hcDtcbiAgfVxuXG4gIGFkZEl0ZW1LZXlJblNlbGVjdChmaWVsZERlZnMsIGl0ZW1LZXksIHNlbGVjdCwgY29tcG9zaXRlS2V5cykge1xuICAgIGNvbnN0IGVsZW1lbnRGb3VuZCA9IHRoaXMuZ2V0RmllbGQoZmllbGREZWZzLCBpdGVtS2V5KTtcblxuICAgIGlmIChcbiAgICAgIGl0ZW1LZXkgJiZcbiAgICAgICFlbGVtZW50Rm91bmQgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoc2VsZWN0KSAmJlxuICAgICAgIShjb21wb3NpdGVLZXlzICE9PSBudWxsICYmIGNvbXBvc2l0ZUtleXM/Lmxlbmd0aCkgJiZcbiAgICAgICFzZWxlY3QuZmluZChzZWwgPT4gc2VsLmZpZWxkID09PSBpdGVtS2V5KVxuICAgICkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4uc2VsZWN0LFxuICAgICAgICB7XG4gICAgICAgICAgZmllbGQ6IGl0ZW1LZXlcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0O1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicHNkay1saXN0LWhlYWRlclwiPlxuICA8ZGl2PlxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInBzZGstc2VhcmNoXCIgKm5nSWY9XCJiU2hvd1NlYXJjaCRcIj5cbiAgICAgIDxtYXQtbGFiZWw+PGltZyBjbGFzcz1cInBzZGstaWNvbi1zZWFyY2hcIiBzcmM9XCJ7eyBzZWFyY2hJY29uJCB9fVwiIC8+IDxzcGFuIGNsYXNzPVwicHNkay1zZWFyY2gtbGFiZWxcIj5TZWFyY2g8L3NwYW4+IDwvbWF0LWxhYmVsPlxuICAgICAgPGlucHV0IG1hdElucHV0IGlkPVwic2VhcmNoXCIgKGtleXVwKT1cImFwcGx5U2VhcmNoKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIlwiIC8+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgIDxkaXYgKm5nSWY9XCIhYkluRm9ybSRcIiBjbGFzcz1cInBzZGstb3V0ZXItZGl2LWluLWZvcm1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLWlubmVyLWRpdi1pbi1mb3JtXCIgKm5nSWY9XCJiQ29sdW1uUmVvcmRlciRcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8dGFibGVcbiAgICAgICAgICAgIG1hdC10YWJsZVxuICAgICAgICAgICAgaWQ9XCJsaXN0LXZpZXdcIlxuICAgICAgICAgICAgW2RhdGFTb3VyY2VdPVwicmVwZWF0TGlzdCRcIlxuICAgICAgICAgICAgbWF0U29ydFxuICAgICAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgICAgIGNka0Ryb3BMaXN0T3JpZW50YXRpb249XCJob3Jpem9udGFsXCJcbiAgICAgICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkQ29sIG9mIGZpZWxkcyRcIiBbbWF0Q29sdW1uRGVmXT1cImRDb2wuY29uZmlnLm5hbWVcIiBzdGlja3k9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXJcIiAoY2xpY2spPVwiX2hlYWRlclNvcnRDbGljaygkZXZlbnQsIGRDb2wpXCIgYXJyb3dQb3NpdGlvbj1cImJlZm9yZVwiIGNka0RyYWc+XG4gICAgICAgICAgICAgICAge3sgZENvbC5jb25maWcubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tYXQtaGVhZGVyLWZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstZmlsdGVyLXN2Zy1pY29uXCIgbmFtZT1cImZpbHRlck9uSWNvblwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstbWF0LWhlYWRlci1hcnJvd1wiPlxuICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstYXJyb3ctc3ZnLWljb25cIiBhcnJvdz1cIm5vbmVcIiBbYXR0ci5hcnJvd2lkXT1cImRDb2wuY29uZmlnLm5hbWVcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXItYnV0dG9uXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImdyb3VwTWVudVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBtZW51U3ZnSWNvbiQgfX1cIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI2dyb3VwTWVudT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFfc2hvd1VuR3JvdXBCeShkQ29sKSAmJiBiR3JvdXBpbmckXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiX2dyb3VwQnkoJGV2ZW50LCBkQ29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IGdyb3VwQnlTdmdJY29uJCB9fVwiIC8+PHNwYW4+R3JvdXAgQnk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiX3Nob3dVbkdyb3VwQnkoZENvbCkgJiYgYkdyb3VwaW5nJFwiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIl91bkdyb3VwQnkoJGV2ZW50LCBkQ29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IGdyb3VwQnlTdmdJY29uJCB9fVwiIC8+PHNwYW4+VW5ncm91cDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiX2ZpbHRlcigkZXZlbnQsIGRDb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgZmlsdGVyU3ZnSWNvbiQgfX1cIiAvPjxzcGFuPkZpbHRlcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgaW5kZXggYXMgaVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiX3Nob3dCdXR0b24oZENvbC5jb25maWcubmFtZSwgZENvbCk7IGVsc2UgcmVndWxhclwiXG4gICAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9saXN0Vmlld0NsaWNrKGRDb2wuY29uZmlnLCBlbGVtZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgZWxlbWVudFtkQ29sLmNvbmZpZy5uYW1lXSB8fCAnLS0tJyB9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVndWxhcj5cbiAgICAgICAgICAgICAgICAgIHt7IGVsZW1lbnRbZENvbC5jb25maWcubmFtZV0gfHwgJy0tLScgfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1ucyQ7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XG4gICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucyRcIj48L3RyPlxuXG4gICAgICAgICAgICA8IS0tIEdyb3VwIGhlYWRlciAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZ3JvdXBIZWFkZXJcIj5cbiAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsIGNvbHNwYW49XCI5OTlcIiAqbWF0Q2VsbERlZj1cImxldCBncm91cFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImdyb3VwLmV4cGFuZGVkXCIgW2F0dHIuc3R5bGVdPVwiX2dldEljb25TdHlsZShncm91cC5sZXZlbClcIj5leHBhbmRfbGVzczwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWdyb3VwLmV4cGFuZGVkXCIgW2F0dHIuc3R5bGVdPVwiX2dldEljb25TdHlsZShncm91cC5sZXZlbClcIj5leHBhbmRfbW9yZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPHN0cm9uZ1xuICAgICAgICAgICAgICAgICAgPnt7IF9nZXRHcm91cE5hbWUoZ3JvdXBCeUNvbHVtbnMkW2dyb3VwLmxldmVsIC0gMV0pIH19OiB7eyBncm91cFtncm91cEJ5Q29sdW1ucyRbZ3JvdXAubGV2ZWwgLSAxXV0gfX0gKHt7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLnRvdGFsQ291bnRzXG4gICAgICAgICAgICAgICAgICB9fSk8L3N0cm9uZ1xuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogWydncm91cEhlYWRlciddOyB3aGVuOiBpc0dyb3VwXCIgKGNsaWNrKT1cIl9ncm91cEhlYWRlckNsaWNrKHJvdylcIj48L3RyPlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHNkay1pbm5lci1kaXYtaW4tZm9ybVwiICpuZ0lmPVwiIWJDb2x1bW5SZW9yZGVyJFwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDx0YWJsZSBtYXQtdGFibGUgaWQ9XCJsaXN0LXZpZXdcIiBbZGF0YVNvdXJjZV09XCJyZXBlYXRMaXN0JFwiIG1hdFNvcnQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkQ29sIG9mIGZpZWxkcyRcIiBbbWF0Q29sdW1uRGVmXT1cImRDb2wuY29uZmlnLm5hbWVcIiBzdGlja3k9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXJcIiAoY2xpY2spPVwiX2hlYWRlclNvcnRDbGljaygkZXZlbnQsIGRDb2wpXCIgYXJyb3dQb3NpdGlvbj1cImJlZm9yZVwiPlxuICAgICAgICAgICAgICAgIHt7IGRDb2wuY29uZmlnLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstbWF0LWhlYWRlci1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWZpbHRlci1zdmctaWNvblwiIG5hbWU9XCJmaWx0ZXJPbkljb25cIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXItYXJyb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWFycm93LXN2Zy1pY29uXCIgYXJyb3c9XCJub25lXCIgW2F0dHIuYXJyb3dpZF09XCJkQ29sLmNvbmZpZy5uYW1lXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tYXQtaGVhZGVyLWJ1dHRvblwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJncm91cE1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgbWVudVN2Z0ljb24kIH19XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICNncm91cE1lbnU+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhX3Nob3dVbkdyb3VwQnkoZENvbCkgJiYgYkdyb3VwaW5nJFwiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIl9ncm91cEJ5KCRldmVudCwgZENvbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBncm91cEJ5U3ZnSWNvbiQgfX1cIiAvPjxzcGFuPkdyb3VwIEJ5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIl9zaG93VW5Hcm91cEJ5KGRDb2wpICYmIGJHcm91cGluZyRcIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJfdW5Hcm91cEJ5KCRldmVudCwgZENvbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBncm91cEJ5U3ZnSWNvbiQgfX1cIiAvPjxzcGFuPlVuZ3JvdXA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIl9maWx0ZXIoJGV2ZW50LCBkQ29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IGZpbHRlclN2Z0ljb24kIH19XCIgLz48c3Bhbj5GaWx0ZXI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGluZGV4IGFzIGlcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIl9zaG93QnV0dG9uKGRDb2wuY29uZmlnLm5hbWUsIGRDb2wpOyBlbHNlIHJlZ3VsYXJcIlxuICAgICAgICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJfbGlzdFZpZXdDbGljayhkQ29sLmNvbmZpZywgZWxlbWVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IGVsZW1lbnRbZENvbC5jb25maWcubmFtZV0gfHwgJy0tLScgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JlZ3VsYXI+XG4gICAgICAgICAgICAgICAgICB7eyBlbGVtZW50W2RDb2wuY29uZmlnLm5hbWVdIHx8ICctLS0nIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnMkOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnMkXCI+PC90cj5cblxuICAgICAgICAgICAgPCEtLSBHcm91cCBoZWFkZXIgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImdyb3VwSGVhZGVyXCI+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjb2xzcGFuPVwiOTk5XCIgKm1hdENlbGxEZWY9XCJsZXQgZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJncm91cC5leHBhbmRlZFwiIFthdHRyLnN0eWxlXT1cIl9nZXRJY29uU3R5bGUoZ3JvdXAubGV2ZWwpXCI+ZXhwYW5kX2xlc3M8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFncm91cC5leHBhbmRlZFwiIFthdHRyLnN0eWxlXT1cIl9nZXRJY29uU3R5bGUoZ3JvdXAubGV2ZWwpXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDxzdHJvbmdcbiAgICAgICAgICAgICAgICAgID57eyBfZ2V0R3JvdXBOYW1lKGdyb3VwQnlDb2x1bW5zJFtncm91cC5sZXZlbCAtIDFdKSB9fToge3sgZ3JvdXBbZ3JvdXBCeUNvbHVtbnMkW2dyb3VwLmxldmVsIC0gMV1dIH19ICh7e1xuICAgICAgICAgICAgICAgICAgICBncm91cC50b3RhbENvdW50c1xuICAgICAgICAgICAgICAgICAgfX0pPC9zdHJvbmdcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZ3JvdXBIZWFkZXInXTsgd2hlbjogaXNHcm91cFwiIChjbGljayk9XCJfZ3JvdXBIZWFkZXJDbGljayhyb3cpXCI+PC90cj5cbiAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJiSW5Gb3JtJFwiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstaW5uZXItZGl2LWluLWZvcm1cIj5cbiAgICAgICAgICA8dGFibGUgaWQ9XCJsaXN0LXZpZXdcIiAqbmdJZj1cInJlcGVhdExpc3REYXRhLmxlbmd0aCA+IDBcIiBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwicmVwZWF0TGlzdCRcIiBtYXRTb3J0PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNpbmdsZVNlbGVjdGlvbk1vZGVcIiBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIj5cbiAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj48L3RoPlxuICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gW3ZhbHVlXT1cInJvd1tyb3dJRF1cIiAoY2hhbmdlKT1cImZpZWxkT25DaGFuZ2Uocm93KVwiPjwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm11bHRpU2VsZWN0aW9uTW9kZVwiIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxuICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPjwvdGg+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFt2YWx1ZV09XCJyb3dbcm93SURdXCIgKGNoYW5nZSk9XCJvbkNoZWNrYm94Q2xpY2socm93LCAkZXZlbnQpXCI+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRDb2wgb2YgZmllbGRzJFwiIFttYXRDb2x1bW5EZWZdPVwiZENvbC5jb25maWcubmFtZVwiPlxuICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlciAoY2xpY2spPVwiX2hlYWRlclNvcnRDbGljaygkZXZlbnQsIGRDb2wpXCIgYXJyb3dQb3NpdGlvbj1cImJlZm9yZVwiPlxuICAgICAgICAgICAgICAgIHt7IGRDb2wuY29uZmlnLmxhYmVsIH19XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudFtkQ29sLmNvbmZpZy5uYW1lXSB8fCAnLS0tJyB9fTwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zJFwiPjwvdHI+XG4gICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucyRcIj48L3RyPlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInJlcGVhdExpc3REYXRhPy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgIDx0YWJsZSBpZD1cImxpc3Qtdmlld1wiICpuZ0lmPVwicmVwZWF0TGlzdERhdGE/Lmxlbmd0aCA9PT0gMFwiIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJyZXBlYXRMaXN0JFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkQ29sIG9mIGZpZWxkcyRcIiBbbWF0Q29sdW1uRGVmXT1cImRDb2wuY29uZmlnLm5hbWVcIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPnt7IGRDb2wuY29uZmlnLmxhYmVsIH19PC90aD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1ucyRcIj48L3RyPlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1uby1yZWNvcmRzXCIgKm5nSWY9XCJyZXBlYXRMaXN0RGF0YT8ubGVuZ3RoID09PSAwXCI+Tm8gUmVjb3JkcyBGb3VuZC48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxtYXQtcGFnaW5hdG9yIGlkPVwicGFnaW5hdGlvblwiICpuZ0lmPVwiYkluRm9ybSRcIiBbcGFnZVNpemVPcHRpb25zXT1cIlsxMCwgMjAsIDUwLCAxMDAsIDUwMCwgMTAwMF1cIiBzaG93Rmlyc3RMYXN0QnV0dG9ucz48L21hdC1wYWdpbmF0b3I+XG4gICAgPG1hdC1wYWdpbmF0b3IgaWQ9XCJwYWdpbmF0aW9uXCIgKm5nSWY9XCIhYkluRm9ybSRcIiBbcGFnZVNpemVPcHRpb25zXT1cIlsxMCwgMjAsIDUwLCAxMDAsIDUwMF1cIiBzaG93Rmlyc3RMYXN0QnV0dG9ucz48L21hdC1wYWdpbmF0b3I+XG4gIDwvZGl2PlxuXG4gIDwhLS0gcG9wIG92ZXJzIGZvciBmaWx0ZXJzLS0+XG4gIDxkaXYgKm5nSWY9XCJiU2hvd0ZpbHRlclBvcG92ZXIkXCIgY2xhc3M9XCJwc2RrLWRpYWxvZy1iYWNrZ3JvdW5kXCI+XG4gICAgPGRpdiBjbGFzcz1cInBzZGstbW9kYWwtZmlsZS10b3BcIj5cbiAgICAgIDxoND5cbiAgICAgICAgRmlsdGVyOjxiPiB7eyBmaWx0ZXJDb250YWluc0xhYmVsJCB9fTwvYj5cbiAgICAgIDwvaDQ+XG4gICAgICA8ZGl2ICpuZ0lmPVwiYkNvbnRhaW5zJFwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICA8bWF0LXNlbGVjdCBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNUeXBlJFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zVHlwZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImNvbnRhaW5zXCI+Q29udGFpbnM8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImVxdWFsc1wiPkVxdWFsczwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwic3RhcnRzd2l0aFwiPlN0YXJ0cyB3aXRoPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNWYWx1ZSRcIiAoY2hhbmdlKT1cIl9maWx0ZXJDb250YWluc1ZhbHVlKCRldmVudClcIiAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJiRGF0ZVRpbWUkXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInBzZGstZnVsbC13aWR0aFwiPlxuICAgICAgICAgIDxtYXQtc2VsZWN0IFt2YWx1ZV09XCJmaWx0ZXJDb250YWluc1R5cGUkXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNUeXBlKCRldmVudClcIj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibm90ZXF1YWxcIj5pcyBub3QgZXF1YWwgdG88L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImFmdGVyXCI+YWZ0ZXI8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImJlZm9yZVwiPmJlZm9yZTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibnVsbFwiPmlzIG51bGw8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm5vdG51bGxcIj5pcyBub3QgbnVsbDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiYklzRGF0ZSQgJiYgZmlsdGVyQ29udGFpbnNUeXBlJCAhPT0gJ251bGwnICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT0gJ25vdG51bGwnXCIgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPkRhdGU8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAjZGF0ZUlucHV0XG4gICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJwZWdhZGF0ZVwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNWYWx1ZSRcIlxuICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zRGF0ZVZhbHVlKCRldmVudCwgZGF0ZUlucHV0LnZhbHVlKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBlZ2FkYXRlXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwZWdhZGF0ZSBbc3RhcnRBdF09XCJmaWx0ZXJDb250YWluc1ZhbHVlJFwiPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiYklzRGF0ZVRpbWUkICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT09ICdudWxsJyAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9ICdub3RudWxsJ1wiIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD5EYXRlIHRpbWU8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCIgKGNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNEYXRlVGltZVZhbHVlKCRldmVudClcIiAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImJJc1RpbWUkICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT09ICdudWxsJyAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9ICdub3RudWxsJ1wiIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD5UaW1lPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0aW1lXCIgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCIgKGNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNUaW1lVmFsdWUoJGV2ZW50KVwiIC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGNvbXBvbmVudC1tYXBwZXJcbiAgICAgICAgbmFtZT1cIkFjdGlvbkJ1dHRvbnNcIlxuICAgICAgICBbcHJvcHNdPVwieyBhck1haW5CdXR0b25zJDogYXJGaWx0ZXJNYWluQnV0dG9ucyQsIGFyU2Vjb25kYXJ5QnV0dG9ucyQ6IGFyRmlsdGVyU2Vjb25kYXJ5QnV0dG9ucyQgfVwiXG4gICAgICAgIFtwYXJlbnRdPVwidGhpc1wiXG4gICAgICAgIFtvdXRwdXRFdmVudHNdPVwieyBhY3Rpb25CdXR0b25DbGljazogX29uRmlsdGVyQWN0aW9uQnV0dG9uQ2xpY2sgfVwiXG4gICAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
1196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fY29tcG9uZW50cy90ZW1wbGF0ZS9saXN0LXZpZXcvbGlzdC12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fY29tcG9uZW50cy90ZW1wbGF0ZS9saXN0LXZpZXcvbGlzdC12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlDQUF5QztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUs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ZUFBZTt3QkFDZixlQUFlO3dCQUNmLG1CQUFtQjt3QkFDbkIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO3FCQUMzQzsrR0FHd0IsU0FBUztzQkFBakMsU0FBUzt1QkFBQyxZQUFZO2dCQUNILElBQUk7c0JBQXZCLFNBQVM7dUJBQUMsT0FBTztnQkFFVCxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtY2xhc3Nlcy1wZXItZmlsZSAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBWaWV3Q2hpbGQsIGZvcndhcmRSZWYsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdERhdGVwaWNrZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IE1hdE9wdGlvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgTWF0UmFkaW9Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9yYWRpbyc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgTWF0UGFnaW5hdG9yTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFNvcnQsIE1hdFNvcnRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBEcmFnRHJvcE1vZHVsZSwgQ2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSwgQ2RrRHJvcExpc3QsIENka0RyYWcgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IFByb2dyZXNzU3Bpbm5lclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9fbWVzc2FnZXMvcHJvZ3Jlc3Mtc3Bpbm5lci5zZXJ2aWNlJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vX2hlbHBlcnMvdXRpbHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50TWFwcGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vX2JyaWRnZS9jb21wb25lbnQtbWFwcGVyL2NvbXBvbmVudC1tYXBwZXIuY29tcG9uZW50JztcbmltcG9ydCB7IGdldEN1cnJlbmN5T3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL19oZWxwZXJzL2N1cnJlbmN5LXV0aWxzJztcbmltcG9ydCB7IGdldExvY2FsZSwgZ2V0U2Vjb25kcyB9IGZyb20gJy4uLy4uLy4uL19oZWxwZXJzL2NvbW1vbic7XG5pbXBvcnQgeyBmb3JtYXR0ZXJzIH0gZnJvbSAnLi4vLi4vLi4vX2hlbHBlcnMvZm9ybWF0dGVycy9mb3JtYXQtdXRpbHMnO1xuXG5pbXBvcnQgeyB1c2VJbml0IH0gZnJvbSAnLi9saXN0Vmlld0hlbHBlcnMnO1xuXG5kZWNsYXJlIGNvbnN0IHdpbmRvdzogYW55O1xuXG5jb25zdCBTRUxFQ1RJT05fTU9ERSA9IHsgU0lOR0xFOiAnc2luZ2xlJywgTVVMVEk6ICdtdWx0aScgfTtcblxuaW50ZXJmYWNlIExpc3RWaWV3UHJvcHMge1xuICAvLyBJZiBhbnksIGVudGVyIGFkZGl0aW9uYWwgcHJvcHMgdGhhdCBvbmx5IGV4aXN0IG9uIHRoaXMgY29tcG9uZW50XG4gIGdsb2JhbFNlYXJjaD86IGJvb2xlYW47XG4gIHJlZmVyZW5jZUxpc3Q/OiBhbnk7XG4gIHJvd0NsaWNrQWN0aW9uPzogYW55O1xuICBzZWxlY3Rpb25Nb2RlPzogc3RyaW5nO1xuICByZWZlcmVuY2VUeXBlPzogc3RyaW5nO1xuICBjb21wb3NpdGVLZXlzPzogYW55O1xuICBzaG93RHluYW1pY0ZpZWxkcz86IGJvb2xlYW47XG4gIHByZXNldHM/OiBhbnk7XG4gIHJlb3JkZXJGaWVsZHM6IHN0cmluZyB8IGJvb2xlYW47XG4gIGdyb3VwaW5nOiBzdHJpbmcgfCBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgR3JvdXAge1xuICBsZXZlbCA9IDA7XG4gIHBhcmVudDogR3JvdXA7XG4gIGV4cGFuZGVkID0gdHJ1ZTtcbiAgdG90YWxDb3VudHMgPSAwO1xuICBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMucGFyZW50IHx8ICh0aGlzLnBhcmVudC52aXNpYmxlICYmIHRoaXMucGFyZW50LmV4cGFuZGVkKTtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbGlzdC12aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xpc3Qtdmlldy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xpc3Qtdmlldy5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBNYXRUYWJsZU1vZHVsZSxcbiAgICBNYXRTb3J0TW9kdWxlLFxuICAgIERyYWdEcm9wTW9kdWxlLFxuICAgIENka0Ryb3BMaXN0LFxuICAgIENka0RyYWcsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBNYXRSYWRpb01vZHVsZSxcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcbiAgICBNYXRQYWdpbmF0b3JNb2R1bGUsXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgIE1hdE9wdGlvbk1vZHVsZSxcbiAgICBNYXREYXRlcGlja2VyTW9kdWxlLFxuICAgIGZvcndhcmRSZWYoKCkgPT4gQ29tcG9uZW50TWFwcGVyQ29tcG9uZW50KVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExpc3RWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvcikgcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydDogTWF0U29ydDtcblxuICBASW5wdXQoKSBwQ29ubiQ6IHR5cGVvZiBQQ29ubmVjdDtcbiAgQElucHV0KCkgYkluRm9ybSQgPSB0cnVlO1xuICBASW5wdXQoKSBwYXlsb2FkO1xuXG4gIHJlcGVhdExpc3QkOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcbiAgZmllbGRzJDogYW55W107XG5cbiAgZGlzcGxheWVkQ29sdW1ucyQgPSBBcnJheTxhbnk+KCk7XG4gIGdyb3VwQnlDb2x1bW5zJDogc3RyaW5nW10gPSBbXTtcblxuICBjb25maWdQcm9wcyQ6IExpc3RWaWV3UHJvcHM7XG5cbiAgdXBkYXRlZFJlZkxpc3Q6IGFueTtcblxuICByZXBlYXRMaXN0RGF0YTogYW55W10gPSBbXTtcblxuICBzZWFyY2hJY29uJDogc3RyaW5nO1xuXG4gIGJTaG93U2VhcmNoJCA9IGZhbHNlO1xuICBiQ29sdW1uUmVvcmRlciQgPSBmYWxzZTtcbiAgYkdyb3VwaW5nJCA9IGZhbHNlO1xuXG4gIHBlcmZGaWx0ZXI6IHN0cmluZztcbiAgc2VhcmNoRmlsdGVyOiBzdHJpbmc7XG5cbiAgbWVudVN2Z0ljb24kOiBzdHJpbmc7XG4gIGFycm93U3ZnSWNvbiQgPSAnJztcbiAgYXJyb3dEb3duU3ZnSWNvbiQ6IHN0cmluZztcbiAgYXJyb3dVcFN2Z0ljb24kOiBzdHJpbmc7XG5cbiAgZmlsdGVyU3ZnSWNvbiQ6IHN0cmluZztcbiAgZmlsdGVyT25TdmdJY29uJDogc3RyaW5nO1xuICBncm91cEJ5U3ZnSWNvbiQ6IHN0cmluZztcblxuICBjb21wYXJlVHlwZTogc3RyaW5nO1xuICBjb21wYXJlUmVmOiBzdHJpbmc7XG4gIGFycm93RGlyZWN0aW9uID0gJ2Rvd24nO1xuXG4gIGZpbHRlckJ5Q29sdW1uczogYW55W10gPSBbXTtcbiAgYlNob3dGaWx0ZXJQb3BvdmVyJCA9IGZhbHNlO1xuICBiQ29udGFpbnMkID0gdHJ1ZTtcbiAgYkRhdGVUaW1lJCA9IGZhbHNlO1xuXG4gIGZpbHRlckNvbnRhaW5zTGFiZWwkID0gJyc7XG4gIGZpbHRlckNvbnRhaW5zVHlwZSQgPSAnY29udGFpbnMnO1xuICBmaWx0ZXJDb250YWluc1ZhbHVlJDogYW55O1xuXG4gIGJJc0RhdGUkID0gZmFsc2U7XG4gIGJJc0RhdGVUaW1lJCA9IGZhbHNlO1xuICBiSXNUaW1lJCA9IGZhbHNlO1xuXG4gIGN1cnJlbnRGaWx0ZXJSZWZEYXRhOiBhbnk7XG4gIGN1cnJlbnRGaWx0ZXJJbWFnZUVsOiBhbnk7XG5cbiAgYXJGaWx0ZXJNYWluQnV0dG9ucyQ6IGFueVtdID0gW107XG4gIGFyRmlsdGVyU2Vjb25kYXJ5QnV0dG9ucyQ6IGFueVtdID0gW107XG4gIHNlbGVjdGlvbk1vZGU/OiBzdHJpbmc7XG4gIHNpbmdsZVNlbGVjdGlvbk1vZGU6IGJvb2xlYW47XG4gIG11bHRpU2VsZWN0aW9uTW9kZTogYm9vbGVhbjtcbiAgcm93SUQ6IGFueTtcbiAgcmVzcG9uc2U6IGFueTtcbiAgY29tcG9zaXRlS2V5czogYW55O1xuICBzaG93RHluYW1pY0ZpZWxkczogYW55O1xuICBmaWx0ZXJzOiBhbnkgPSB7fTtcbiAgc2VsZWN0UGFyYW06IGFueVtdID0gW107XG4gIGZpbHRlclBheWxvYWQ6IGFueTtcbiAgcmVmOiBhbnkgPSB7fTtcbiAgY29zbW9zVGFibGVSZWY6IGFueTtcbiAgbGlzdENvbnRleHQ6IGFueSA9IHt9O1xuICBxdWVyeTogYW55ID0gbnVsbDtcbiAgcGFnaW5nOiBhbnk7XG4gIGZpZWxkRGVmczogYW55O1xuICB4UmF5QXBpcyA9IFBDb3JlLmdldERlYnVnZ2VyKCkuZ2V0WFJheVJ1bnRpbWUoKTtcbiAgeFJheVVpZCA9IHRoaXMueFJheUFwaXMuc3RhcnRYUmF5KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwc1NlcnZpY2U6IFByb2dyZXNzU3Bpbm5lclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1dGlsczogVXRpbHNcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnUHJvcHMkID0gdGhpcy5wQ29ubiQuZ2V0Q29uZmlnUHJvcHMoKSBhcyBMaXN0Vmlld1Byb3BzO1xuICAgIC8qKiBCeSBkZWZhdWx0LCBweUdVSUQgaXMgdXNlZCBmb3IgRGF0YSBjbGFzc2VzIGFuZCBweUlEIGlzIGZvciBXb3JrIGNsYXNzZXMgYXMgcm93LWlkL2tleSAqL1xuICAgIGNvbnN0IGRlZlJvd0lEID0gdGhpcy5jb25maWdQcm9wcyQ/LnJlZmVyZW5jZVR5cGUgPT09ICdDYXNlJyA/ICdweUlEJyA6ICdweUdVSUQnO1xuICAgIC8qKiBJZiBjb21wb3NpdGVLZXlzIGlzIGRlZmluZWQsIHVzZSBkeW5hbWljIHZhbHVlLCBlbHNlIGZhbGxiYWNrIHRvIHB5SUQgb3IgcHlHVUlELiAqL1xuICAgIHRoaXMuY29tcG9zaXRlS2V5cyA9IHRoaXMuY29uZmlnUHJvcHMkPy5jb21wb3NpdGVLZXlzO1xuICAgIHRoaXMucm93SUQgPSB0aGlzLmNvbXBvc2l0ZUtleXMgJiYgdGhpcy5jb21wb3NpdGVLZXlzPy5sZW5ndGggPT09IDEgPyB0aGlzLmNvbXBvc2l0ZUtleXNbMF0gOiBkZWZSb3dJRDtcbiAgICB0aGlzLmJTaG93U2VhcmNoJCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKHRoaXMuY29uZmlnUHJvcHMkLmdsb2JhbFNlYXJjaCA/IHRoaXMuY29uZmlnUHJvcHMkLmdsb2JhbFNlYXJjaCA6IHRoaXMucGF5bG9hZC5nbG9iYWxTZWFyY2gpO1xuICAgIHRoaXMuYkNvbHVtblJlb3JkZXIkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUodGhpcy5jb25maWdQcm9wcyQucmVvcmRlckZpZWxkcyk7XG4gICAgdGhpcy5iR3JvdXBpbmckID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUodGhpcy5jb25maWdQcm9wcyQuZ3JvdXBpbmcpO1xuICAgIHRoaXMuc2hvd0R5bmFtaWNGaWVsZHMgPSB0aGlzLmNvbmZpZ1Byb3BzJD8uc2hvd0R5bmFtaWNGaWVsZHM7XG5cbiAgICB0aGlzLm1lbnVTdmdJY29uJCA9IHRoaXMudXRpbHMuZ2V0SW1hZ2VTcmMoJ21vcmUnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5hcnJvd0Rvd25TdmdJY29uJCA9IHRoaXMudXRpbHMuZ2V0SW1hZ2VTcmMoJ2Fycm93LWRvd24nLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5hcnJvd1VwU3ZnSWNvbiQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdhcnJvdy11cCcsIHRoaXMudXRpbHMuZ2V0U0RLU3RhdGljQ29udGVudFVybCgpKTtcblxuICAgIHRoaXMuZmlsdGVyU3ZnSWNvbiQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdmaWx0ZXInLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5maWx0ZXJPblN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnZmlsdGVyLW9uJywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuICAgIHRoaXMuZ3JvdXBCeVN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygncm93JywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gdGhpcy5jb25maWdQcm9wcyQuc2VsZWN0aW9uTW9kZTtcblxuICAgIHRoaXMuYXJGaWx0ZXJNYWluQnV0dG9ucyQucHVzaCh7IGFjdGlvbklEOiAnc3VibWl0JywganNBY3Rpb246ICdzdWJtaXQnLCBuYW1lOiAnU3VibWl0JyB9KTtcbiAgICB0aGlzLmFyRmlsdGVyU2Vjb25kYXJ5QnV0dG9ucyQucHVzaCh7IGFjdGlvbklEOiAnY2FuY2VsJywganNBY3Rpb246ICdjYW5jZWwnLCBuYW1lOiAnQ2FuY2VsJyB9KTtcblxuICAgIHRoaXMuc2VhcmNoSWNvbiQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdzZWFyY2gnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBQQ29yZS5nZXRQdWJTdWJVdGlscygpLnN1YnNjcmliZShcbiAgICAgICAgUENvcmUuZ2V0Q29uc3RhbnRzKCkuUFVCX1NVQl9FVkVOVFMuRVZFTlRfREFTSEJPQVJEX0ZJTFRFUl9DSEFOR0UsXG4gICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc0ZpbHRlckNoYW5nZShkYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgYGRhc2hib2FyZC1jb21wb25lbnQtJHsnaWQnfWAsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpXG4gICAgICApO1xuICAgICAgUENvcmUuZ2V0UHViU3ViVXRpbHMoKS5zdWJzY3JpYmUoXG4gICAgICAgIFBDb3JlLmdldENvbnN0YW50cygpLlBVQl9TVUJfRVZFTlRTLkVWRU5UX0RBU0hCT0FSRF9GSUxURVJfQ0xFQVJfQUxMLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5maWx0ZXJzID0ge307XG4gICAgICAgICAgdGhpcy5wcm9jZXNzRmlsdGVyQ2xlYXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgYGRhc2hib2FyZC1jb21wb25lbnQtJHsnaWQnfWAsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpXG4gICAgICApO1xuICAgIH0sIDApO1xuICAgIGlmICh0aGlzLmNvbmZpZ1Byb3BzJCkge1xuICAgICAgaWYgKCF0aGlzLnBheWxvYWQpIHtcbiAgICAgICAgdGhpcy5wYXlsb2FkID0geyByZWZlcmVuY2VMaXN0OiB0aGlzLmNvbmZpZ1Byb3BzJC5yZWZlcmVuY2VMaXN0IH07XG4gICAgICB9XG4gICAgICB1c2VJbml0KHtcbiAgICAgICAgcENvbm4kOiB0aGlzLnBDb25uJCxcbiAgICAgICAgYkluRm9ybSQ6IHRoaXMuYkluRm9ybSQsXG4gICAgICAgIC4uLnRoaXMucGF5bG9hZCxcbiAgICAgICAgbGlzdENvbnRleHQ6IHRoaXMubGlzdENvbnRleHQsXG4gICAgICAgIHJlZjogdGhpcy5yZWYsXG4gICAgICAgIHNob3dEeW5hbWljRmllbGRzOiB0aGlzLnNob3dEeW5hbWljRmllbGRzLFxuICAgICAgICB4UmF5VWlkOiB0aGlzLnhSYXlVaWQsXG4gICAgICAgIGNvc21vc1RhYmxlUmVmOiB0aGlzLmNvc21vc1RhYmxlUmVmLFxuICAgICAgICBzZWxlY3Rpb25Nb2RlOiB0aGlzLnNlbGVjdGlvbk1vZGVcbiAgICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICB0aGlzLmxpc3RDb250ZXh0ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuZ2V0TGlzdERhdGEoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldEZpZWxkRnJvbUZpbHRlcihmaWx0ZXIsIGRhdGVSYW5nZSA9IGZhbHNlKSB7XG4gICAgbGV0IGZpZWxkVmFsdWU7XG4gICAgaWYgKGRhdGVSYW5nZSkge1xuICAgICAgZmllbGRWYWx1ZSA9IGZpbHRlcj8uQU5EWzBdPy5jb25kaXRpb24ubGhzLmZpZWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWVsZFZhbHVlID0gZmlsdGVyPy5jb25kaXRpb24ubGhzLmZpZWxkO1xuICAgIH1cbiAgICByZXR1cm4gZmllbGRWYWx1ZTtcbiAgfVxuXG4gIC8vIFdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gRVZFTlRfREFTSEJPQVJEX0ZJTFRFUl9DSEFOR0UgZmlyZXNcbiAgcHJvY2Vzc0ZpbHRlckNoYW5nZShkYXRhKSB7XG4gICAgY29uc3QgeyBmaWx0ZXJJZCwgZmlsdGVyRXhwcmVzc2lvbiB9ID0gZGF0YTtcbiAgICBsZXQgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZDogYW55ID0ge1xuICAgICAgcXVlcnk6IHtcbiAgICAgICAgZmlsdGVyOiB7fSxcbiAgICAgICAgc2VsZWN0OiBbXVxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmZpbHRlcnNbZmlsdGVySWRdID0gZmlsdGVyRXhwcmVzc2lvbjtcbiAgICBsZXQgaXNEYXRlUmFuZ2UgPSAhIWRhdGEuZmlsdGVyRXhwcmVzc2lvbj8uQU5EO1xuICAgIC8vIFdpbGwgYmUgQU5EIGJ5IGRlZmF1bHQgYnV0IG1ha2luZyBpdCBkeW5hbWljIGluIGNhc2Ugd2Ugc3VwcG9ydCBkeW5hbWljIHJlbGF0aW9uYWwgb3BzIGluIGZ1dHVyZVxuICAgIGNvbnN0IHJlbGF0aW9uYWxPcCA9ICdBTkQnO1xuXG4gICAgbGV0IGZpZWxkID0gdGhpcy5nZXRGaWVsZEZyb21GaWx0ZXIoZmlsdGVyRXhwcmVzc2lvbiwgaXNEYXRlUmFuZ2UpO1xuICAgIGNvbnN0IHNlbGVjdFBhcmFtOiBhbnlbXSA9IFtdO1xuICAgIC8vIENvbnN0cnVjdGluZyB0aGUgc2VsZWN0IHBhcmFtZXRlcnMgbGlzdCAod2lsbCBiZSBzZW50IGluIGRhc2hib2FyZEZpbHRlclBheWxvYWQpXG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zJD8uZm9yRWFjaChjb2wgPT4ge1xuICAgICAgc2VsZWN0UGFyYW0ucHVzaCh7XG4gICAgICAgIGZpZWxkOiBjb2xcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIHRyaWdnZXJlZCBmaWx0ZXIgaXMgYXBwbGljYWJsZSBmb3IgdGhpcyBsaXN0XG4gICAgaWYgKGRhdGEuZmlsdGVyRXhwcmVzc2lvbiAhPT0gbnVsbCAmJiAhKHRoaXMuZGlzcGxheWVkQ29sdW1ucyQ/Lmxlbmd0aCAmJiB0aGlzLmRpc3BsYXllZENvbHVtbnMkPy5pbmNsdWRlcyhmaWVsZCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRoaXMgaXMgYSBmbGFnIHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZXNldCBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkIGluIGNhc2Ugd2UgZG9uJ3QgZmluZCBhbnkgdmFsaWQgZmlsdGVyc1xuICAgIGxldCB2YWxpZEZpbHRlciA9IGZhbHNlO1xuXG4gICAgbGV0IGluZGV4ID0gMTtcbiAgICAvLyBJdGVyYXRpbmcgb3ZlciB0aGUgY3VycmVudCBmaWx0ZXJzIGxpc3QgdG8gY3JlYXRlIGZpbHRlciBkYXRhIHdoaWNoIHdpbGwgYmUgUE9TVGVkXG4gICAgY29uc3QgZmlsdGVyS2V5czogYW55W10gPSBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpO1xuICAgIGNvbnN0IGZpbHRlclZhbHVlczogYW55W10gPSBPYmplY3QudmFsdWVzKHRoaXMuZmlsdGVycyk7XG4gICAgZm9yIChsZXQgZmlsdGVySW5kZXggPSAwOyBmaWx0ZXJJbmRleCA8IGZpbHRlcktleXMubGVuZ3RoOyBmaWx0ZXJJbmRleCsrKSB7XG4gICAgICBjb25zdCBmaWx0ZXIgPSBmaWx0ZXJWYWx1ZXNbZmlsdGVySW5kZXhdO1xuICAgICAgLy8gSWYgdGhlIGZpbHRlciBpcyBudWxsIHRoZW4gd2UgY2FuIHNraXAgdGhpcyBpdGVyYXRpb25cbiAgICAgIGlmIChmaWx0ZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVja2luZyBpZiB0aGUgZmlsdGVyIGlzIG9mIHR5cGUtIERhdGUgUmFuZ2VcbiAgICAgIGlzRGF0ZVJhbmdlID0gISFmaWx0ZXI/LkFORDtcbiAgICAgIGZpZWxkID0gdGhpcy5nZXRGaWVsZEZyb21GaWx0ZXIoZmlsdGVyLCBpc0RhdGVSYW5nZSk7XG5cbiAgICAgIGlmICghKHRoaXMuZGlzcGxheWVkQ29sdW1ucyQ/Lmxlbmd0aCAmJiB0aGlzLmRpc3BsYXllZENvbHVtbnMkPy5pbmNsdWRlcyhmaWVsZCkpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIElmIHdlIHJlYWNoIGhlcmUgdGhhdCBpbXBsaWVzIHdlJ3ZlIGF0IGxlYXN0IG9uZSB2YWxpZCBmaWx0ZXIsIGhlbmNlIHNldHRpbmcgdGhlIGZsYWdcbiAgICAgIHZhbGlkRmlsdGVyID0gdHJ1ZTtcbiAgICAgIC8qKiBCZWxvdyBhcmUgdGhlIDIgY2FzZXMgZm9yLSBUZXh0ICYgRGF0ZS1SYW5nZSBmaWx0ZXIgdHlwZXMgd2hlcmUgd2UnbGwgY29uc3RydWN0IGZpbHRlciBkYXRhIHdoaWNoIHdpbGwgYmUgc2VudCBpbiB0aGUgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZFxuICAgICAgICogSW4gQ29uc3RlbGxhdGlvbiBEWCBDb21wb25lbnRzLCB0aHJvdWdoIFJlcGVhdGluZyBTdHJ1Y3R1cmVzIHRoZXkgbWlnaHQgYmUgdXNpbmcgc2V2ZXJhbCBBUElzIHRvIGRvIGl0LiBXZSdyZSBkb2luZyBpdCBoZXJlXG4gICAgICAgKi9cbiAgICAgIGlmIChpc0RhdGVSYW5nZSkge1xuICAgICAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkID0gdGhpcy5maWx0ZXJCYXNlZE9uRGF0ZVJhbmdlKGRhc2hib2FyZEZpbHRlclBheWxvYWQsIGZpbHRlciwgcmVsYXRpb25hbE9wLCBzZWxlY3RQYXJhbSwgaW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIuZmlsdGVyQ29uZGl0aW9ucyA9IHtcbiAgICAgICAgICAuLi5kYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5maWx0ZXJDb25kaXRpb25zLFxuICAgICAgICAgIFtgVCR7aW5kZXgrK31gXTogeyAuLi5maWx0ZXIuY29uZGl0aW9uLCBpZ25vcmVDYXNlOiB0cnVlIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIubG9naWMpIHtcbiAgICAgICAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5sb2dpYyA9IGAke2Rhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuZmlsdGVyLmxvZ2ljfSAke3JlbGF0aW9uYWxPcH0gVCR7aW5kZXggLSAxfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIubG9naWMgPSBgVCR7aW5kZXggLSAxfWA7XG4gICAgICAgIH1cblxuICAgICAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LnNlbGVjdCA9IHNlbGVjdFBhcmFtO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlc2V0IHRoZSBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkIGlmIHdlIGVuZCB1cCB3aXRoIG5vIHZhbGlkIGZpbHRlcnMgZm9yIHRoZSBsaXN0XG4gICAgaWYgKCF2YWxpZEZpbHRlcikge1xuICAgICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJQYXlsb2FkID0gZGFzaGJvYXJkRmlsdGVyUGF5bG9hZDtcbiAgICB0aGlzLmdldExpc3REYXRhKCk7XG4gIH1cblxuICBmaWx0ZXJCYXNlZE9uRGF0ZVJhbmdlKGRhc2hib2FyZEZpbHRlclBheWxvYWQsIGZpbHRlciwgcmVsYXRpb25hbE9wLCBzZWxlY3RQYXJhbSwgaW5kZXgpIHtcbiAgICBjb25zdCBkYXRlUmVsYXRpb25hbE9wID0gZmlsdGVyPy5BTkQgPyAnQU5EJyA6ICdPUic7XG4gICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIuZmlsdGVyQ29uZGl0aW9ucyA9IHtcbiAgICAgIC4uLmRhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuZmlsdGVyLmZpbHRlckNvbmRpdGlvbnMsXG4gICAgICBbYFQke2luZGV4Kyt9YF06IHsgLi4uZmlsdGVyW3JlbGF0aW9uYWxPcF1bMF0uY29uZGl0aW9uIH0sXG4gICAgICBbYFQke2luZGV4Kyt9YF06IHsgLi4uZmlsdGVyW3JlbGF0aW9uYWxPcF1bMV0uY29uZGl0aW9uIH1cbiAgICB9O1xuICAgIGlmIChkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5sb2dpYykge1xuICAgICAgZGFzaGJvYXJkRmlsdGVyUGF5bG9hZC5xdWVyeS5maWx0ZXIubG9naWMgPSBgJHtkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5sb2dpY30gJHtyZWxhdGlvbmFsT3B9IChUJHtpbmRleCAtIDJ9ICR7ZGF0ZVJlbGF0aW9uYWxPcH0gVCR7XG4gICAgICAgIGluZGV4IC0gMVxuICAgICAgfSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXNoYm9hcmRGaWx0ZXJQYXlsb2FkLnF1ZXJ5LmZpbHRlci5sb2dpYyA9IGAoVCR7aW5kZXggLSAyfSAke3JlbGF0aW9uYWxPcH0gVCR7aW5kZXggLSAxfSlgO1xuICAgIH1cblxuICAgIGRhc2hib2FyZEZpbHRlclBheWxvYWQucXVlcnkuc2VsZWN0ID0gc2VsZWN0UGFyYW07XG5cbiAgICByZXR1cm4gZGFzaGJvYXJkRmlsdGVyUGF5bG9hZDtcbiAgfVxuXG4gIHByb2Nlc3NGaWx0ZXJDbGVhcigpIHtcbiAgICB0aGlzLmZpbHRlclBheWxvYWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5nZXRMaXN0RGF0YSgpO1xuICB9XG5cbiAgZ2V0RmllbGRzTWV0YWRhdGEocmVmTGlzdCkge1xuICAgIC8vIEB0cy1pZ25vcmUgLSAzcmQgcGFyYW1ldGVyIFwiYXNzb2NpYXRpb25GaWx0ZXJcIiBzaG91bGQgYmUgb3B0aW9uYWwgZm9yIGdldERhdGFWaWV3TWV0YWRhdGEgbWV0aG9kXG4gICAgcmV0dXJuIFBDb3JlLmdldEFuYWx5dGljc1V0aWxzKCkuZ2V0RGF0YVZpZXdNZXRhZGF0YShyZWZMaXN0LCB0aGlzLnNob3dEeW5hbWljRmllbGRzKTtcbiAgfVxuXG4gIGdldExpc3REYXRhKCkge1xuICAgIC8vIEB0cy1pZ25vcmUgLSBQcm9wZXJ0eSAnZ2V0Q29tcG9uZW50Q29uZmlnJyBpcyBwcml2YXRlIGFuZCBvbmx5IGFjY2Vzc2libGUgd2l0aGluIGNsYXNzICdDMTFuRW52J1xuICAgIGNvbnN0IGNvbXBvbmVudENvbmZpZyA9IHRoaXMucENvbm4kLmdldENvbXBvbmVudENvbmZpZygpO1xuICAgIGlmICh0aGlzLmNvbmZpZ1Byb3BzJCkge1xuICAgICAgdGhpcy5wcmVwYXJlUGF5bG9hZCgpO1xuICAgICAgY29uc3QgcmVmTGlzdCA9IHRoaXMuY29uZmlnUHJvcHMkLnJlZmVyZW5jZUxpc3Q7XG4gICAgICBjb25zdCBmaWVsZHNNZXRhRGF0YVByb21pc2UgPSB0aGlzLmdldEZpZWxkc01ldGFkYXRhKHJlZkxpc3QpO1xuICAgICAgLy8gcmV0dXJucyBhIHByb21pc2VcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLnBheWxvYWQgfHwgdGhpcy5maWx0ZXJQYXlsb2FkIHx8IHt9O1xuICAgICAgY29uc3QgZGF0YVZpZXdQYXJhbWV0ZXJzID0gdGhpcy5wYXlsb2FkLnBhcmFtZXRlcnM7XG5cbiAgICAgIGNvbnN0IHdvcmtMaXN0RGF0YVByb21pc2UgPSAhdGhpcy5iSW5Gb3JtJFxuICAgICAgICA/IC8vIEB0cy1pZ25vcmUgLSAzcmQgcGFyYW1ldGVyIFwiY29udGV4dFwiIHNob3VsZCBiZSBvcHRpb25hbCBpbiBnZXREYXRhIG1ldGhvZFxuICAgICAgICAgIFBDb3JlLmdldERhdGFBcGlVdGlscygpLmdldERhdGEocmVmTGlzdCwgcGF5bG9hZClcbiAgICAgICAgOiBQQ29yZS5nZXREYXRhUGFnZVV0aWxzKCkuZ2V0RGF0YUFzeW5jKFxuICAgICAgICAgICAgcmVmTGlzdCxcbiAgICAgICAgICAgIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCksXG4gICAgICAgICAgICBwYXlsb2FkLmRhdGFWaWV3UGFyYW1ldGVycyA/IHBheWxvYWQuZGF0YVZpZXdQYXJhbWV0ZXJzIDogZGF0YVZpZXdQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgdGhpcy5wYWdpbmcsXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5XG4gICAgICAgICAgKTtcblxuICAgICAgdGhpcy5iU2hvd0ZpbHRlclBvcG92ZXIkID0gZmFsc2U7XG5cbiAgICAgIHRoaXMucHNTZXJ2aWNlLnNlbmRNZXNzYWdlKHRydWUpO1xuXG4gICAgICBQcm9taXNlLmFsbChbZmllbGRzTWV0YURhdGFQcm9taXNlLCB3b3JrTGlzdERhdGFQcm9taXNlXSlcbiAgICAgICAgLnRoZW4oKHJlc3VsdHM6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpZWxkc01ldGFEYXRhID0gcmVzdWx0c1swXTtcbiAgICAgICAgICBjb25zdCB3b3JrTGlzdERhdGEgPSByZXN1bHRzWzFdO1xuXG4gICAgICAgICAgdGhpcy5maWVsZHMkID0gdGhpcy5jb25maWdQcm9wcyQucHJlc2V0c1swXS5jaGlsZHJlblswXS5jaGlsZHJlbjtcbiAgICAgICAgICAvLyB0aGlzIGlzIGFuIHVucmVzb3ZsZWQgdmVyc2lvbiBvZiB0aGlzLmZpZWxkcyQsIG5lZWQgdW5yZXNvbHZlZCwgc28gY2FuIGdldCB0aGUgcHJvcGVydHkgcmVmZXJlbmNlXG4gICAgICAgICAgY29uc3QgY29sdW1uRmllbGRzID0gY29tcG9uZW50Q29uZmlnLnByZXNldHNbMF0uY2hpbGRyZW5bMF0uY2hpbGRyZW47XG5cbiAgICAgICAgICBjb25zdCB0YWJsZURhdGFSZXN1bHRzID0gIXRoaXMuYkluRm9ybSQgPyB3b3JrTGlzdERhdGEuZGF0YS5kYXRhIDogd29ya0xpc3REYXRhLmRhdGE7XG5cbiAgICAgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRIZWFkZXJDZWxscyhjb2x1bW5GaWVsZHMsIHRoaXMuZmllbGREZWZzKTtcbiAgICAgICAgICB0aGlzLmZpZWxkcyQgPSB0aGlzLnVwZGF0ZUZpZWxkcyh0aGlzLmZpZWxkcyQsIGZpZWxkc01ldGFEYXRhLmRhdGEuZmllbGRzLCBjb2x1bW5zKTtcbiAgICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMkID0gY29sdW1ucy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjb2wuaWQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5yZXNwb25zZSA9IHRhYmxlRGF0YVJlc3VsdHM7XG4gICAgICAgICAgdGhpcy51cGRhdGVkUmVmTGlzdCA9IHRoaXMudXBkYXRlRGF0YSh0YWJsZURhdGFSZXN1bHRzLCB0aGlzLmZpZWxkcyQpO1xuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IFNFTEVDVElPTl9NT0RFLlNJTkdMRSAmJiB0aGlzLnVwZGF0ZWRSZWZMaXN0Py5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMkPy51bnNoaWZ0KCdzZWxlY3QnKTtcbiAgICAgICAgICAgIHRoaXMuc2luZ2xlU2VsZWN0aW9uTW9kZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IFNFTEVDVElPTl9NT0RFLk1VTFRJICYmIHRoaXMudXBkYXRlZFJlZkxpc3Q/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyQ/LnVuc2hpZnQoJ3NlbGVjdCcpO1xuICAgICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdGlvbk1vZGUgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMucmVwZWF0TGlzdCQgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHRoaXMudXBkYXRlZFJlZkxpc3QpO1xuICAgICAgICAgIHRoaXMucmVwZWF0TGlzdCQuZmlsdGVyUHJlZGljYXRlID0gdGhpcy5jdXN0b21GaWx0ZXJQcmVkaWNhdGUuYmluZCh0aGlzKTtcblxuICAgICAgICAgIC8vIGtlZXBpbmcgYW4gb3JpZ2luYWwgY29weSB0byBnZXQgYmFjayBhZnRlciBwb3NzaWJsZSBzb3J0cywgZmlsdGVycyBhbmQgZ3JvdXBCeVxuICAgICAgICAgIHRoaXMucmVwZWF0TGlzdERhdGEgPSB0aGlzLnJlcGVhdExpc3QkLmRhdGEuc2xpY2UoKTtcblxuICAgICAgICAgIHRoaXMucmVwZWF0TGlzdCQucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICAgICAgdGhpcy5yZXBlYXRMaXN0JC5zb3J0ID0gdGhpcy5zb3J0O1xuICAgICAgICAgIHRoaXMucHNTZXJ2aWNlLnNlbmRNZXNzYWdlKGZhbHNlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGRuJ3QgZmV0Y2ggZWl0aGVyIHRoZSBmaWVsZHNNZXRhRGF0YSBvciB3b3JrTGlzdERhdGFcIik7XG4gICAgICAgICAgdGhpcy5wc1NlcnZpY2Uuc2VuZE1lc3NhZ2UoZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcmVwYXJlUGF5bG9hZCgpIHtcbiAgICBjb25zdCB7IGZpZWxkRGVmcywgaXRlbUtleSwgcGF0Y2hRdWVyeUZpZWxkcyB9ID0gdGhpcy5saXN0Q29udGV4dC5tZXRhO1xuICAgIHRoaXMuZmllbGREZWZzID0gZmllbGREZWZzO1xuICAgIGxldCBsaXN0RmllbGRzID0gZmllbGREZWZzID8gdGhpcy5idWlsZFNlbGVjdChmaWVsZERlZnMsIHVuZGVmaW5lZCwgcGF0Y2hRdWVyeUZpZWxkcywgdGhpcy5wYXlsb2FkPy5jb21wb3NpdGVLZXlzKSA6IFtdO1xuICAgIGxpc3RGaWVsZHMgPSB0aGlzLmFkZEl0ZW1LZXlJblNlbGVjdChmaWVsZERlZnMsIGl0ZW1LZXksIGxpc3RGaWVsZHMsIHRoaXMucGF5bG9hZD8uY29tcG9zaXRlS2V5cyk7XG4gICAgaWYgKHRoaXMucGF5bG9hZC5xdWVyeSkge1xuICAgICAgdGhpcy5xdWVyeSA9IHRoaXMucGF5bG9hZC5xdWVyeTtcbiAgICB9IGVsc2UgaWYgKGxpc3RGaWVsZHM/Lmxlbmd0aCAmJiB0aGlzLmxpc3RDb250ZXh0Lm1ldGEuaXNRdWVyeWFibGUpIHtcbiAgICAgIGlmICh0aGlzLmZpbHRlclBheWxvYWQpIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHtcbiAgICAgICAgICBzZWxlY3Q6IGxpc3RGaWVsZHMsXG4gICAgICAgICAgZmlsdGVyOiB0aGlzLmZpbHRlclBheWxvYWQ/LnF1ZXJ5Py5maWx0ZXJcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSB7IHNlbGVjdDogbGlzdEZpZWxkcyB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5maWx0ZXJQYXlsb2FkKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5maWx0ZXJQYXlsb2FkPy5xdWVyeTtcbiAgICB9XG4gIH1cbiAgLy8gbmdPbkNoYW5nZXMoY2hhbmdlcykge1xuICAvLyAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMucGF5bG9hZCkge1xuICAvLyAgICAgY29uc3QgY3VycmVudFBheWxvYWRWYWwgPSBjaGFuZ2VzLnBheWxvYWQ/LmN1cnJlbnRWYWx1ZTtcbiAgLy8gICAgIGNvbnN0IHByZXZpb3VzUGF5bG9hZFZhbCA9IGNoYW5nZXMucGF5bG9hZD8ucHJldmlvdXNWYWx1ZTtcbiAgLy8gICAgIGlmIChjdXJyZW50UGF5bG9hZFZhbCAhPT0gcHJldmlvdXNQYXlsb2FkVmFsKSB7XG4gIC8vICAgICAgIHRoaXMuZ2V0TGlzdERhdGEoKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9XG4gIC8vIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBQQ29yZS5nZXRQdWJTdWJVdGlscygpLnVuc3Vic2NyaWJlKFxuICAgICAgUENvcmUuZ2V0Q29uc3RhbnRzKCkuUFVCX1NVQl9FVkVOVFMuRVZFTlRfREFTSEJPQVJEX0ZJTFRFUl9DSEFOR0UsXG4gICAgICBgZGFzaGJvYXJkLWNvbXBvbmVudC0keydpZCd9YCxcbiAgICAgIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKClcbiAgICApO1xuICAgIFBDb3JlLmdldFB1YlN1YlV0aWxzKCkudW5zdWJzY3JpYmUoXG4gICAgICBQQ29yZS5nZXRDb25zdGFudHMoKS5QVUJfU1VCX0VWRU5UUy5FVkVOVF9EQVNIQk9BUkRfRklMVEVSX0NMRUFSX0FMTCxcbiAgICAgIGBkYXNoYm9hcmQtY29tcG9uZW50LSR7J2lkJ31gLFxuICAgICAgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKVxuICAgICk7XG4gIH1cblxuICAvLyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gIC8vICAgLy8gcGFnaW5hdG9yIGhhcyB0byBleGlzdCBmb3IgdGhpcyB0byB3b3JrLFxuICAvLyAgIC8vIHNvIGNhbGxlZCBhZnRlciBpbml0IChwYWdpbmF0b3IgZHJhd24pXG4gIC8vICAgLy8gQ2FsbHMgYXJlIG5vdyBpbiB3b3JrTGlzdERhdGEgcHJvbWlzZVxuICAvLyAgIC8vIHRoaXMucmVwZWF0TGlzdCQucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gIC8vICAgLy8gdGhpcy5yZXBlYXRMaXN0JC5zb3J0ID0gdGhpcy5zb3J0O1xuICAvLyB9XG5cbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XG4gICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuZGlzcGxheWVkQ29sdW1ucyQsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gIH1cblxuICB1cGRhdGVGaWVsZHMoYXJGaWVsZHM6IGFueVtdLCBhckNvbHVtbnMsIGZpZWxkcyk6IGFueVtdIHtcbiAgICBjb25zdCBhclJldHVybiA9IGFyRmllbGRzO1xuICAgIGFyUmV0dXJuLmZvckVhY2goKGZpZWxkLCBpKSA9PiB7XG4gICAgICBmaWVsZC5jb25maWcgPSB7IC4uLmZpZWxkLmNvbmZpZywgLi4uZmllbGRzW2ldLCBuYW1lOiBmaWVsZHNbaV0uaWQgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gYXJSZXR1cm47XG4gIH1cblxuICBhcHBseVNlYXJjaChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgdGhpcy5zZWFyY2hGaWx0ZXIgPSBmaWx0ZXJWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmICh0aGlzLmdyb3VwQnlDb2x1bW5zJC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJlcGVhdExpc3QkLmRhdGEgPSB0aGlzLnJlcGVhdExpc3REYXRhLnNsaWNlKCk7XG4gICAgICB0aGlzLnJlcGVhdExpc3QkLmZpbHRlciA9IHRoaXMuc2VhcmNoRmlsdGVyO1xuICAgICAgY29uc3QgcmVwZWF0RGF0YSA9IHRoaXMucmVwZWF0TGlzdCQuc29ydERhdGEodGhpcy5yZXBlYXRMaXN0JC5maWx0ZXJlZERhdGEsIHRoaXMucmVwZWF0TGlzdCQuc29ydCBhcyBNYXRTb3J0KTtcbiAgICAgIHRoaXMucmVwZWF0TGlzdCQuZGF0YSA9IHRoaXMuYWRkR3JvdXBzKHJlcGVhdERhdGEsIHRoaXMuZ3JvdXBCeUNvbHVtbnMkKTtcblxuICAgICAgdGhpcy5wZXJmRmlsdGVyID0gcGVyZm9ybWFuY2Uubm93KCkudG9TdHJpbmcoKTtcbiAgICAgIHRoaXMucmVwZWF0TGlzdCQuZmlsdGVyID0gdGhpcy5wZXJmRmlsdGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlcGVhdExpc3QkLmZpbHRlciA9IHRoaXMuc2VhcmNoRmlsdGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlcGVhdExpc3QkLnBhZ2luYXRvcikge1xuICAgICAgdGhpcy5yZXBlYXRMaXN0JC5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgZmllbGRPbkNoYW5nZShyb3cpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHJvd1t0aGlzLnJvd0lEXTtcbiAgICBjb25zdCByZXFPYmogPSB7fTtcbiAgICBpZiAodGhpcy5jb21wb3NpdGVLZXlzPy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMucmVzcG9uc2UuZmluZEluZGV4KGVsZW1lbnQgPT4gZWxlbWVudFt0aGlzLnJvd0lEXSA9PT0gdmFsdWUpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRSb3cgPSB0aGlzLnJlc3BvbnNlW2luZGV4XTtcbiAgICAgIHRoaXMuY29tcG9zaXRlS2V5cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICByZXFPYmpbZWxlbWVudF0gPSBzZWxlY3RlZFJvd1tlbGVtZW50XTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXFPYmpbdGhpcy5yb3dJRF0gPSB2YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5wQ29ubiQ/LmdldExpc3RBY3Rpb25zPy4oKT8uc2V0U2VsZWN0ZWRSb3dzKFtyZXFPYmpdKTtcbiAgfVxuXG4gIG9uQ2hlY2tib3hDbGljayhyb3csIGV2ZW50KSB7XG4gICAgY29uc3QgdmFsdWUgPSByb3dbdGhpcy5yb3dJRF07XG4gICAgY29uc3QgY2hlY2tlZCA9IGV2ZW50Py5jaGVja2VkO1xuICAgIGNvbnN0IHJlcU9iajogYW55ID0ge307XG4gICAgaWYgKHRoaXMuY29tcG9zaXRlS2V5cz8ubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJlc3BvbnNlLmZpbmRJbmRleChlbGVtZW50ID0+IGVsZW1lbnRbdGhpcy5yb3dJRF0gPT09IHZhbHVlKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUm93ID0gdGhpcy5yZXNwb25zZVtpbmRleF07XG4gICAgICB0aGlzLmNvbXBvc2l0ZUtleXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgcmVxT2JqW2VsZW1lbnRdID0gc2VsZWN0ZWRSb3dbZWxlbWVudF07XG4gICAgICB9KTtcbiAgICAgIHJlcU9iai4kc2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXFPYmpbdGhpcy5yb3dJRF0gPSB2YWx1ZTtcbiAgICAgIHJlcU9iai4kc2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgIH1cbiAgICB0aGlzLnBDb25uJD8uZ2V0TGlzdEFjdGlvbnMoKT8uc2V0U2VsZWN0ZWRSb3dzKFtyZXFPYmpdKTtcbiAgfVxuXG4gIC8vIHJvd0NsaWNrKHJvdykge1xuICAvLyAgIHN3aXRjaCAodGhpcy5jb25maWdQcm9wcyQucm93Q2xpY2tBY3Rpb24pIHtcbiAgLy8gICAgIGNhc2UgJ29wZW5Bc3NpZ25tZW50JzpcbiAgLy8gICAgICAgdGhpcy5wc1NlcnZpY2Uuc2VuZE1lc3NhZ2UodHJ1ZSk7XG4gIC8vICAgICAgIHRoaXMub3BlbkFzc2lnbm1lbnQocm93KTtcbiAgLy8gICAgICAgYnJlYWs7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgX2dldEljb25TdHlsZShsZXZlbCk6IHN0cmluZyB7XG4gICAgbGV0IHNSZXR1cm4gPSAnJztcbiAgICBsZXQgbkxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTtcbiAgICBuTGV2ZWwtLTtcbiAgICBuTGV2ZWwgKj0gMTU7XG4gICAgc1JldHVybiA9IGBwYWRkaW5nLWxlZnQ6ICR7bkxldmVsfXB4OyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlYDtcblxuICAgIHJldHVybiBzUmV0dXJuO1xuICB9XG5cbiAgX2dldEdyb3VwTmFtZShmaWVsZE5hbWUpIHtcbiAgICBmb3IgKGxldCBmaWVsZEluZGV4ID0gMDsgZmllbGRJbmRleCA8IHRoaXMuZmllbGRzJC5sZW5ndGg7IGZpZWxkSW5kZXgrKykge1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpZWxkcyRbZmllbGRJbmRleF07XG4gICAgICBpZiAoZmllbGQuY29uZmlnLm5hbWUgPT0gZmllbGROYW1lKSB7XG4gICAgICAgIHJldHVybiBmaWVsZC5jb25maWcubGFiZWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIF9zaG93QnV0dG9uKG5hbWUsIHJvdykge1xuICAgIGxldCBiUmV0dXJuID0gZmFsc2U7XG4gICAgY29uc3QgeyBweFJlZk9iamVjdENsYXNzLCBwekluc0tleSwgcHhSZWZPYmplY3RLZXkgfSA9IHJvdztcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ3B4VGFza0xhYmVsJzpcbiAgICAgICAgaWYgKHB4UmVmT2JqZWN0Q2xhc3MgIT0gJycgJiYgcHpJbnNLZXkgIT0gJycpIHtcbiAgICAgICAgICBiUmV0dXJuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3B4UmVmT2JqZWN0SW5zTmFtZSc6XG4gICAgICAgIGlmIChweFJlZk9iamVjdENsYXNzICE9ICcnICYmIHB4UmVmT2JqZWN0S2V5ICE9ICcnKSB7XG4gICAgICAgICAgYlJldHVybiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gYlJldHVybjtcbiAgfVxuXG4gIF9saXN0Vmlld0NsaWNrKGNvbHVtbiwgcm93KSB7XG4gICAgY29uc3QgbmFtZSA9IGNvbHVtbi5pZDtcbiAgICBpZiAoY29sdW1uLmRpc3BsYXlBc0xpbmspIHtcbiAgICAgIGNvbnN0IHsgcHhPYmpDbGFzcyB9ID0gcm93O1xuICAgICAgbGV0IHsgcHpJbnNLZXkgfSA9IHJvdztcbiAgICAgIGlmIChjb2x1bW4uaXNBc3NvY2lhdGlvbikge1xuICAgICAgICBjb25zdCBhc3NvY2lhdGlvbkNhdGVnb3J5ID0gbmFtZS5zcGxpdCgnOicpWzBdO1xuICAgICAgICBwekluc0tleSA9IHJvd1tgJHthc3NvY2lhdGlvbkNhdGVnb3J5fTpwekluc0tleWBdO1xuICAgICAgfVxuICAgICAgaWYgKGNvbHVtbi5pc0Fzc2lnbm1lbnRMaW5rKSB7XG4gICAgICAgIHRoaXMucENvbm4kLmdldEFjdGlvbnNBcGkoKS5vcGVuQXNzaWdubWVudChwekluc0tleSwgcHhPYmpDbGFzcywge1xuICAgICAgICAgIGNvbnRhaW5lck5hbWU6ICdwcmltYXJ5JyxcbiAgICAgICAgICBjaGFubmVsTmFtZTogJydcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBDb25uJC5nZXRBY3Rpb25zQXBpKCkub3BlbldvcmtCeUhhbmRsZShwekluc0tleSwgcHhPYmpDbGFzcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICBjYXNlICdweFRhc2tMYWJlbCc6XG4gICAgICAgICAgdGhpcy5vcGVuQXNzaWdubWVudChyb3cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdweFJlZk9iamVjdEluc05hbWUnOlxuICAgICAgICAgIHRoaXMub3Blbldvcmsocm93KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfaGVhZGVyU29ydENsaWNrKGV2ZW50LCBjb2x1bW5EYXRhKSB7XG4gICAgLy8gaW1hZ2VzIDAgLSBmaWx0ZXIsIDEgLSBhcnJvdywgMiAtIG1vcmVcblxuICAgIC8qKiBDb21tZW50aW5nIHRoaXMgY29kZSBmb3Igbm93IGFzIGl0IGlzIGdpdmluZyBlcnJvcnMgbm90IHN1cmUgaWYgaXQgZXZlciB3b3JrZWQgKi9cbiAgICAvLyBsZXQgYXJyb3dJbWFnZSA9IGV2ZW50LnNyY0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpWzFdO1xuICAgIC8vIGxldCBhcnJvd0F0dHIgPSBhcnJvd0ltYWdlLmdldEF0dHJpYnV0ZSgnYXJyb3cnKTtcblxuICAgIC8vIHRoaXMuY2xlYXJPdXRBcnJvd3MoZXZlbnQsIGNvbHVtbkRhdGEpO1xuXG4gICAgLy8gc3dpdGNoIChhcnJvd0F0dHIpIHtcbiAgICAvLyAgIGNhc2UgJ3VwJzpcbiAgICAvLyAgICAgYXJyb3dJbWFnZS5zcmMgPSB0aGlzLmFycm93RG93blN2Z0ljb24kO1xuICAgIC8vICAgICBhcnJvd0ltYWdlLnNldEF0dHJpYnV0ZSgnYXJyb3cnLCAnZG93bicpO1xuICAgIC8vICAgICBicmVhaztcbiAgICAvLyAgIGNhc2UgJ2Rvd24nOlxuICAgIC8vICAgICBhcnJvd0ltYWdlLnNyYyA9ICcnO1xuICAgIC8vICAgICBhcnJvd0ltYWdlLnNldEF0dHJpYnV0ZSgnYXJyb3cnLCAnbm9uZScpO1xuICAgIC8vICAgICBicmVhaztcbiAgICAvLyAgIGRlZmF1bHQ6XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc3JjID0gdGhpcy5hcnJvd1VwU3ZnSWNvbiQ7XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc2V0QXR0cmlidXRlKCdhcnJvdycsICd1cCcpO1xuICAgIC8vICAgICBicmVhaztcbiAgICAvLyB9XG5cbiAgICB0aGlzLmNvbXBhcmVUeXBlID0gY29sdW1uRGF0YS50eXBlO1xuICAgIHRoaXMuY29tcGFyZVJlZiA9IGNvbHVtbkRhdGEuY29uZmlnLm5hbWU7XG4gICAgLy8gdGhpcy5hcnJvd0RpcmVjdGlvbiA9IGFycm93SW1hZ2UuZ2V0QXR0cmlidXRlKCdhcnJvdycpO1xuICAgIHRoaXMuYXJyb3dEaXJlY3Rpb24gPSB0aGlzLmFycm93RGlyZWN0aW9uID09PSAndXAnID8gJ2Rvd24nIDogJ3VwJztcblxuICAgIHRoaXMuZmlsdGVyU29ydEdyb3VwQnkoKTtcbiAgfVxuXG4gIC8vIENvbW1lbnRpbmcgYmVsb3cgbWV0aG9kLCBzaW5jZSB0aGUgY29kZSB3aGljaCBpcyB1c2luZyBpdCwgaXMgYWxyZWFkeSBjb21tZW50ZWRcbiAgLy8gY2xlYXJPdXRBcnJvd3MoZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgLy8gICBjb25zdCBhckltYWdlcyA9IGV2ZW50LnNyY0VsZW1lbnQucGFyZW50RWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7XG5cbiAgLy8gICBmb3IgKGNvbnN0IHRoZUltYWdlIG9mIGFySW1hZ2VzKSB7XG4gIC8vICAgICAvLyBsZXQgdGhlSW1hZ2UgPSBhckltYWdlc1tpXVxuICAvLyAgICAgY29uc3QgYXJyb3cgPSB0aGVJbWFnZS5nZXRBdHRyaWJ1dGUoJ2Fycm93Jyk7XG4gIC8vICAgICBpZiAoYXJyb3cpIHtcbiAgLy8gICAgICAgY29uc3QgYXJyb3dJZCA9IHRoZUltYWdlLmdldEF0dHJpYnV0ZSgnYXJyb3dpZCcpO1xuICAvLyAgICAgICBpZiAoYXJyb3cgIT0gJ25vbmUnICYmIGFycm93SWQgIT0gY29sdW1uRGF0YS5jb25maWcubmFtZSkge1xuICAvLyAgICAgICAgIHRoZUltYWdlLnNldEF0dHJpYnV0ZSgnYXJyb3cnLCAnbm9uZScpO1xuICAvLyAgICAgICAgIHRoZUltYWdlLnNyYyA9ICcnO1xuICAvLyAgICAgICB9XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgc29ydENvbXBhcmUoYSwgYik6IG51bWJlciB7XG4gICAgbGV0IGFWYWx1ZSA9IGFbdGhpcy5jb21wYXJlUmVmXTtcbiAgICBsZXQgYlZhbHVlID0gYlt0aGlzLmNvbXBhcmVSZWZdO1xuXG4gICAgaWYgKHRoaXMuY29tcGFyZVR5cGUgPT0gJ0RhdGUnIHx8IHRoaXMuY29tcGFyZVR5cGUgPT0gJ0RhdGVUaW1lJykge1xuICAgICAgYVZhbHVlID0gZ2V0U2Vjb25kcyhhVmFsdWUpO1xuICAgICAgYlZhbHVlID0gZ2V0U2Vjb25kcyhiVmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbXBhcmVSZWYgPT0gJ3B4UmVmT2JqZWN0SW5zTmFtZScpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29tcGFyZUJ5Q29sdW1uUHhSZWZPYmplY3RJbnNOYW1lKGFWYWx1ZSwgYlZhbHVlKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5hcnJvd0RpcmVjdGlvbikge1xuICAgICAgY2FzZSAndXAnOlxuICAgICAgICBpZiAoIWFWYWx1ZSB8fCBhVmFsdWUgPCBiVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFiVmFsdWUgfHwgYVZhbHVlID4gYlZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkb3duJzpcbiAgICAgICAgaWYgKCFiVmFsdWUgfHwgYVZhbHVlID4gYlZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYVZhbHVlIHx8IGFWYWx1ZSA8IGJWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb21wYXJlQnlDb2x1bW5QeFJlZk9iamVjdEluc05hbWUoYVZhbHVlLCBiVmFsdWUpIHtcbiAgICBjb25zdCBwcmVmaXhYID0gYVZhbHVlLnNwbGl0KCctJyk7XG4gICAgY29uc3QgcHJlZml4WSA9IGJWYWx1ZS5zcGxpdCgnLScpO1xuICAgIHN3aXRjaCAodGhpcy5hcnJvd0RpcmVjdGlvbikge1xuICAgICAgY2FzZSAndXAnOlxuICAgICAgICBpZiAocHJlZml4WFswXSAhPT0gcHJlZml4WVswXSkge1xuICAgICAgICAgIGlmIChwcmVmaXhYWzBdIDwgcHJlZml4WVswXSkgcmV0dXJuIC0xO1xuICAgICAgICAgIGlmIChwcmVmaXhYWzBdID4gcHJlZml4WVswXSkgcmV0dXJuIDE7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZWZpeFhbMV0gLSBwcmVmaXhZWzFdO1xuICAgICAgY2FzZSAnZG93bic6XG4gICAgICAgIGlmIChwcmVmaXhYWzBdICE9PSBwcmVmaXhZWzBdKSB7XG4gICAgICAgICAgaWYgKHByZWZpeFhbMF0gPiBwcmVmaXhZWzBdKSByZXR1cm4gLTE7XG4gICAgICAgICAgaWYgKHByZWZpeFhbMF0gPCBwcmVmaXhZWzBdKSByZXR1cm4gMTtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJlZml4WVsxXSAtIHByZWZpeFhbMV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdXBkYXRlRmlsdGVyRGlzcGxheSh0eXBlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ25vdGVxdWFsJztcbiAgICAgICAgdGhpcy5iQ29udGFpbnMkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYkRhdGVUaW1lJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYklzRGF0ZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJJc0RhdGVUaW1lJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc1RpbWUkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRGF0ZVRpbWUnOlxuICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnbm90ZXF1YWwnO1xuICAgICAgICB0aGlzLmJDb250YWlucyQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iRGF0ZVRpbWUkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc0RhdGVUaW1lJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYklzVGltZSQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdUaW1lJzpcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ25vdGVxdWFsJztcbiAgICAgICAgdGhpcy5iQ29udGFpbnMkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYkRhdGVUaW1lJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYklzRGF0ZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlVGltZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNUaW1lJCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ2NvbnRhaW5zJztcbiAgICAgICAgdGhpcy5iQ29udGFpbnMkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iRGF0ZVRpbWUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzRGF0ZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlVGltZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNUaW1lJCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBfZmlsdGVyKGV2ZW50LCBjb2x1bW5EYXRhKSB7XG4gICAgLy8gYWRkIGNsaWNrQXdheSBsaXN0ZW5lclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fY2xpY2tBd2F5LmJpbmQodGhpcykpO1xuXG4gICAgdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YSA9IGNvbHVtbkRhdGE7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc0xhYmVsJCA9IGNvbHVtbkRhdGEuY29uZmlnLmxhYmVsO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlckRpc3BsYXkoY29sdW1uRGF0YS50eXBlKTtcblxuICAgICAgdGhpcy51cGRhdGVGaWx0ZXJWYXJzV2l0aEN1cnJlbnQoY29sdW1uRGF0YSk7XG5cbiAgICAgIHRoaXMuYlNob3dGaWx0ZXJQb3BvdmVyJCA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBfY2xpY2tBd2F5KGV2ZW50OiBhbnkpIHtcbiAgICBsZXQgYkluUG9wVXAgPSBmYWxzZTtcblxuICAgIC8vIHJ1biB0aHJvdWdoIGxpc3Qgb2YgZWxlbWVudHMgaW4gcGF0aCwgaWYgbWVudSBub3QgaW4gdGggcGF0aCwgdGhlbiB3YW50IHRvXG4gICAgLy8gaGlkZSAodG9nZ2xlKSB0aGUgbWVudVxuICAgIGNvbnN0IGV2ZW50UGF0aCA9IGV2ZW50LnBhdGg7XG4gICAgZm9yIChsZXQgcGF0aEluZGV4ID0gMDsgcGF0aEluZGV4IDwgZXZlbnRQYXRoLmxlbmd0aDsgcGF0aEluZGV4KyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgZXZlbnRQYXRoW3BhdGhJbmRleF0uY2xhc3NOYW1lID09ICdwc2RrLW1vZGFsLWZpbGUtdG9wJyB8fFxuICAgICAgICBldmVudFBhdGhbcGF0aEluZGV4XS50YWdOYW1lID09ICdCVVRUT04nIHx8XG4gICAgICAgIGV2ZW50UGF0aFtwYXRoSW5kZXhdLnRhZ05hbWUgPT0gJ01BVC1PUFRJT04nIHx8XG4gICAgICAgIGV2ZW50UGF0aFtwYXRoSW5kZXhdLnRhZ05hbWUgPT0gJ01BVC1JTlBVVCdcbiAgICAgICkge1xuICAgICAgICBiSW5Qb3BVcCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWJJblBvcFVwKSB7XG4gICAgICAvLyB0aGlzLmJTaG93RmlsdGVyUG9wb3ZlciQgPSBmYWxzZTtcblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9jbGlja0F3YXkuYmluZCh0aGlzKSk7XG4gICAgfVxuICB9XG5cbiAgX2ZpbHRlckNvbnRhaW5zVHlwZShldmVudCkge1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9IGV2ZW50LnZhbHVlO1xuICB9XG5cbiAgX2ZpbHRlckNvbnRhaW5zVmFsdWUoZXZlbnQpIHtcbiAgICB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICB9XG5cbiAgX2ZpbHRlckNvbnRhaW5zRGF0ZVZhbHVlKGV2ZW50LCB2YWx1ZSkge1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSB2YWx1ZTtcbiAgfVxuXG4gIF9maWx0ZXJDb250YWluc0RhdGVUaW1lVmFsdWUoZXZlbnQpIHtcbiAgICB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICB9XG5cbiAgX2ZpbHRlckNvbnRhaW5zVGltZVZhbHVlKGV2ZW50KSB7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgfVxuXG4gIF9vbkZpbHRlckFjdGlvbkJ1dHRvbkNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICAvLyBtb2RhbCBidXR0b25zXG4gICAgc3dpdGNoIChldmVudC5hY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2NhbmNlbCc6XG4gICAgICAgIHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEgPSBbXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdWJtaXQnOlxuICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcldpdGhJbmZvKCk7XG4gICAgICAgIHRoaXMuZmlsdGVyU29ydEdyb3VwQnkoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLmJTaG93RmlsdGVyUG9wb3ZlciQgPSBmYWxzZTtcblxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fY2xpY2tBd2F5LmJpbmQodGhpcykpO1xuICB9XG5cbiAgdXBkYXRlRmlsdGVyV2l0aEluZm8oKSB7XG4gICAgbGV0IGJGb3VuZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgZmlsdGVyT2JqIG9mIHRoaXMuZmlsdGVyQnlDb2x1bW5zKSB7XG4gICAgICBpZiAoZmlsdGVyT2JqLnJlZiA9PT0gdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YS5jb25maWcubmFtZSkge1xuICAgICAgICBmaWx0ZXJPYmoudHlwZSA9IHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEudHlwZTtcbiAgICAgICAgZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyID0gdGhpcy5maWx0ZXJDb250YWluc1R5cGUkO1xuICAgICAgICBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZSA9IHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQ7XG5cbiAgICAgICAgYkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFiRm91bmQpIHtcbiAgICAgIC8vIGFkZCBpblxuICAgICAgY29uc3QgZmlsdGVyT2JqOiBhbnkgPSB7fTtcbiAgICAgIGZpbHRlck9iai5yZWYgPSB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhLmNvbmZpZy5uYW1lO1xuICAgICAgZmlsdGVyT2JqLnR5cGUgPSB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhLnR5cGU7XG4gICAgICBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIgPSB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQ7XG4gICAgICBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZSA9IHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQ7XG5cbiAgICAgIHRoaXMuZmlsdGVyQnlDb2x1bW5zLnB1c2goZmlsdGVyT2JqKTtcbiAgICB9XG5cbiAgICAvLyBpdGVyYXRlIHRocm91Z2ggZmlsdGVycyBhbmQgdXBkYXRlIGZpbHRlck9uIGljb25cbiAgICBmb3IgKGNvbnN0IGZpbHRlck9iaiBvZiB0aGlzLmZpbHRlckJ5Q29sdW1ucykge1xuICAgICAgY29uc3QgY29udGFpbnNGaWx0ZXJWYWx1ZSA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlO1xuICAgICAgY29uc3QgY29udGFpbnNGaWx0ZXIgPSBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXI7XG4gICAgICBjb25zdCBmaWx0ZXJSZWYgPSBmaWx0ZXJPYmoucmVmO1xuICAgICAgY29uc3QgZmlsdGVySW5kZXggPSB0aGlzLmRpc3BsYXllZENvbHVtbnMkLmluZGV4T2YoZmlsdGVyUmVmKTtcbiAgICAgIGNvbnN0IGFyRmlsdGVySW1nID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ2ZpbHRlck9uSWNvbicpO1xuICAgICAgY29uc3QgZmlsdGVySW1nOiBhbnkgPSBhckZpbHRlckltZ1tmaWx0ZXJJbmRleF07XG4gICAgICBpZiAoY29udGFpbnNGaWx0ZXJWYWx1ZSA9PSAnJyAmJiBjb250YWluc0ZpbHRlciAhPSAnbnVsbCcgJiYgY29udGFpbnNGaWx0ZXIgIT0gJ25vdG51bGwnKSB7XG4gICAgICAgIC8vIGNsZWFyIGljb25cbiAgICAgICAgZmlsdGVySW1nLnNyYyA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2hvdyBpY29uXG4gICAgICAgIGZpbHRlckltZy5zcmMgPSB0aGlzLmZpbHRlck9uU3ZnSWNvbiQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRmlsdGVyVmFyc1dpdGhDdXJyZW50KGNvbHVtbkRhdGEpIHtcbiAgICAvLyBmaW5kIGN1cnJlbnQgcmVmLCBpZiBleGlzdHMsIG1vdmUgZGF0YSB0byB2YXJpYWJsZSB0byBkaXNwbGF5XG5cbiAgICBsZXQgYkZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBmaWx0ZXJPYmogb2YgdGhpcy5maWx0ZXJCeUNvbHVtbnMpIHtcbiAgICAgIGlmIChmaWx0ZXJPYmoucmVmID09PSB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhLmNvbmZpZy5uYW1lKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlcjtcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJCA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlO1xuXG4gICAgICAgIGJGb3VuZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYkZvdW5kKSB7XG4gICAgICBzd2l0Y2ggKGNvbHVtbkRhdGEudHlwZSkge1xuICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgY2FzZSAnRGF0ZVRpbWUnOlxuICAgICAgICBjYXNlICdUaW1lJzpcbiAgICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnbm90ZXF1YWwnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdjb250YWlucyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSAnJztcbiAgICB9XG4gIH1cblxuICBmaWx0ZXJEYXRhKGl0ZW06IGFueSkge1xuICAgIGxldCBiS2VlcCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBmaWx0ZXJPYmogb2YgdGhpcy5maWx0ZXJCeUNvbHVtbnMpIHtcbiAgICAgIGlmIChmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZSAhPSAnJyB8fCBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIgPT0gJ251bGwnIHx8IGZpbHRlck9iai5jb250YWluc0ZpbHRlciA9PSAnbm90bnVsbCcpIHtcbiAgICAgICAgbGV0IGZpbHRlclZhbHVlOiBhbnk7XG5cbiAgICAgICAgc3dpdGNoIChmaWx0ZXJPYmoudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICAgIGNhc2UgJ0RhdGVUaW1lJzpcbiAgICAgICAgICBjYXNlICdUaW1lJzpcbiAgICAgICAgICAgIGJLZWVwID0gdGhpcy5maWx0ZXJEYXRhV2l0aERhdGUoaXRlbSwgZmlsdGVyT2JqLCBmaWx0ZXJWYWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYktlZXAgPSB0aGlzLmZpbHRlckRhdGFXaXRoQ29tbW9uVHlwZXMoaXRlbSwgZmlsdGVyT2JqLCBmaWx0ZXJWYWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBpZiBkb24ndCBrZWVwIHN0b3AgZmlsdGVyaW5nXG4gICAgICBpZiAoIWJLZWVwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiS2VlcDtcbiAgfVxuXG4gIGZpbHRlckRhdGFXaXRoRGF0ZShpdGVtLCBmaWx0ZXJPYmosIGZpbHRlclZhbHVlKSB7XG4gICAgbGV0IGJLZWVwO1xuICAgIGxldCB2YWx1ZSA9IGl0ZW1bZmlsdGVyT2JqLnJlZl0gIT0gbnVsbCA/PyBpdGVtW2ZpbHRlck9iai5yZWZdICE9ICcnID8gZ2V0U2Vjb25kcyhpdGVtW2ZpbHRlck9iai5yZWZdKSA6IG51bGw7XG4gICAgZmlsdGVyVmFsdWUgPSBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZSAhPSBudWxsICYmIGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlICE9ICcnID8gZ2V0U2Vjb25kcyhmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZSkgOiBudWxsO1xuXG4gICAgc3dpdGNoIChmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIpIHtcbiAgICAgIGNhc2UgJ25vdGVxdWFsJzpcbiAgICAgICAgLy8gYmVjYXN1ZSBmaWx0ZXJWYWx1ZSBpcyBpbiBtaW51dGVzLCBuZWVkIHRvIGhhdmUgYSByYW5nZSBvZiBsZXNzIHRoYW4gNjAgc2Vjb25zXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIGZpbHRlclZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBnZXQgcmlkIG9mIG1pbGxpc2Vjb25zXG4gICAgICAgICAgdmFsdWUgLz0gMTAwMDtcbiAgICAgICAgICBmaWx0ZXJWYWx1ZSAvPSAxMDAwO1xuXG4gICAgICAgICAgY29uc3QgZGlmZiA9IHZhbHVlIC0gZmlsdGVyVmFsdWU7XG4gICAgICAgICAgaWYgKGRpZmYgPj0gMCAmJiBkaWZmIDwgNjApIHtcbiAgICAgICAgICAgIGJLZWVwID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYWZ0ZXInOlxuICAgICAgICBpZiAodmFsdWUgPCBmaWx0ZXJWYWx1ZSkge1xuICAgICAgICAgIGJLZWVwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdiZWZvcmUnOlxuICAgICAgICBpZiAodmFsdWUgPiBmaWx0ZXJWYWx1ZSkge1xuICAgICAgICAgIGJLZWVwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBiS2VlcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbm90bnVsbCc6XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgYktlZXAgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBiS2VlcDtcbiAgfVxuXG4gIGZpbHRlckRhdGFXaXRoQ29tbW9uVHlwZXMoaXRlbSwgZmlsdGVyT2JqLCBmaWx0ZXJWYWx1ZSkge1xuICAgIGxldCBiS2VlcDtcbiAgICBjb25zdCB2YWx1ZSA9IGl0ZW1bZmlsdGVyT2JqLnJlZl0udG9Mb3dlckNhc2UoKTtcbiAgICBmaWx0ZXJWYWx1ZSA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBzd2l0Y2ggKGZpbHRlck9iai5jb250YWluc0ZpbHRlcikge1xuICAgICAgY2FzZSAnY29udGFpbnMnOlxuICAgICAgICBpZiAodmFsdWUuaW5kZXhPZihmaWx0ZXJWYWx1ZSkgPCAwKSB7XG4gICAgICAgICAgYktlZXAgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VxdWFscyc6XG4gICAgICAgIGlmICh2YWx1ZSAhPSBmaWx0ZXJWYWx1ZSkge1xuICAgICAgICAgIGJLZWVwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdGFydHN3aXRoJzpcbiAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoZmlsdGVyVmFsdWUpICE9IDApIHtcbiAgICAgICAgICBiS2VlcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJLZWVwO1xuICB9XG5cbiAgZmlsdGVyU29ydEdyb3VwQnkoKSB7XG4gICAgLy8gZ2V0IG9yaWdpbmFsIGRhdGEgc2V0XG4gICAgbGV0IHRoZURhdGEgPSB0aGlzLnJlcGVhdExpc3REYXRhLnNsaWNlKCk7XG5cbiAgICAvLyBsYXN0IGZpbHRlciBjb25maWcgZGF0YSBpcyBnbG9iYWxcbiAgICB0aGVEYXRhID0gdGhlRGF0YS5maWx0ZXIodGhpcy5maWx0ZXJEYXRhLmJpbmQodGhpcykpO1xuXG4gICAgLy8gbGFzdCBzb3J0IGNvbmZpZyBkYXRhIGlzIGdsb2JhbFxuICAgIHRoZURhdGEuc29ydCh0aGlzLnNvcnRDb21wYXJlLmJpbmQodGhpcykpO1xuXG4gICAgY29uc3QgcmVHcm91cERhdGEgPSB0aGlzLmFkZEdyb3Vwcyh0aGVEYXRhLCB0aGlzLmdyb3VwQnlDb2x1bW5zJCk7XG5cbiAgICB0aGlzLnJlcGVhdExpc3QkLmRhdGEgPSBbXTtcbiAgICB0aGlzLnJlcGVhdExpc3QkLmRhdGEucHVzaCguLi5yZUdyb3VwRGF0YSk7XG5cbiAgICBpZiAodGhpcy5zZWFyY2hGaWx0ZXIgJiYgdGhpcy5zZWFyY2hGaWx0ZXIgIT0gJycpIHtcbiAgICAgIHRoaXMucmVwZWF0TGlzdCQuZmlsdGVyID0gdGhpcy5zZWFyY2hGaWx0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGVyZkZpbHRlciA9IHBlcmZvcm1hbmNlLm5vdygpLnRvU3RyaW5nKCk7XG4gICAgICB0aGlzLnJlcGVhdExpc3QkLmZpbHRlciA9IHRoaXMucGVyZkZpbHRlcjtcbiAgICB9XG4gICAgdGhpcy5yZXBlYXRMaXN0JC5maWx0ZXIgPSAnJztcblxuICAgIGlmICh0aGlzLnJlcGVhdExpc3QkLnBhZ2luYXRvcikge1xuICAgICAgdGhpcy5yZXBlYXRMaXN0JC5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgLy9cbiAgLy8gR3JvdXBpbmcgY29kZSBpbnNwaXJlZCBieSB0aGlzIGV4YW1wbGVcbiAgLy8gaHR0cHM6Ly9zdGFja2JsaXR6LmNvbS9lZGl0L2FuZ3VsYXItbWF0ZXJpYWwtdGFibGUtcm93LWdyb3VwaW5nXG4gIC8vXG5cbiAgX3Nob3dVbkdyb3VwQnkoY29sdW1uRGF0YSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuZ3JvdXBCeUNvbHVtbnMkKSB7XG4gICAgICBpZiAodmFsID09IGNvbHVtbkRhdGEuY29uZmlnLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgX2dyb3VwQnkoZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgICB0aGlzLmNoZWNrR3JvdXBCeUNvbHVtbihjb2x1bW5EYXRhLmNvbmZpZy5uYW1lLCB0cnVlKTtcblxuICAgIHRoaXMuZmlsdGVyU29ydEdyb3VwQnkoKTtcbiAgfVxuXG4gIF91bkdyb3VwQnkoZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgICAvLyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmNoZWNrR3JvdXBCeUNvbHVtbihjb2x1bW5EYXRhLmNvbmZpZy5uYW1lLCBmYWxzZSk7XG5cbiAgICB0aGlzLmZpbHRlclNvcnRHcm91cEJ5KCk7XG4gIH1cblxuICBjaGVja0dyb3VwQnlDb2x1bW4oZmllbGQsIGFkZCkge1xuICAgIGxldCBmb3VuZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGhpcy5ncm91cEJ5Q29sdW1ucyQpIHtcbiAgICAgIGlmIChjb2x1bW4gPT09IGZpZWxkKSB7XG4gICAgICAgIGZvdW5kID0gdGhpcy5ncm91cEJ5Q29sdW1ucyQuaW5kZXhPZihjb2x1bW4sIDApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZm91bmQgIT0gbnVsbCAmJiBmb3VuZCA+PSAwKSB7XG4gICAgICBpZiAoIWFkZCkge1xuICAgICAgICB0aGlzLmdyb3VwQnlDb2x1bW5zJC5zcGxpY2UoZm91bmQsIDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWRkKSB7XG4gICAgICB0aGlzLmdyb3VwQnlDb2x1bW5zJC5wdXNoKGZpZWxkKTtcbiAgICB9XG4gIH1cblxuICBhZGRHcm91cHMoZGF0YTogYW55W10sIGdyb3VwQnlDb2x1bW5zOiBzdHJpbmdbXSk6IGFueVtdIHtcbiAgICBjb25zdCByb290R3JvdXAgPSBuZXcgR3JvdXAoKTtcbiAgICByb290R3JvdXAuZXhwYW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLmdldFN1YmxldmVsKGRhdGEsIDAsIGdyb3VwQnlDb2x1bW5zLCByb290R3JvdXApO1xuICB9XG5cbiAgZ2V0U3VibGV2ZWwoZGF0YTogYW55W10sIGxldmVsOiBudW1iZXIsIGdyb3VwQnlDb2x1bW5zOiBzdHJpbmdbXSwgcGFyZW50OiBHcm91cCk6IGFueVtdIHtcbiAgICBpZiAobGV2ZWwgPj0gZ3JvdXBCeUNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgY29uc3QgZ3JvdXBzID0gdGhpcy51bmlxdWVCeShcbiAgICAgIGRhdGEubWFwKHJvdyA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBHcm91cCgpO1xuICAgICAgICByZXN1bHQubGV2ZWwgPSBsZXZlbCArIDE7XG4gICAgICAgIHJlc3VsdC5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGxldmVsOyBpKyspIHtcbiAgICAgICAgICByZXN1bHRbZ3JvdXBCeUNvbHVtbnNbaV1dID0gcm93W2dyb3VwQnlDb2x1bW5zW2ldXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSksXG4gICAgICBKU09OLnN0cmluZ2lmeVxuICAgICk7XG5cbiAgICBjb25zdCBjdXJyZW50Q29sdW1uID0gZ3JvdXBCeUNvbHVtbnNbbGV2ZWxdO1xuICAgIGxldCBzdWJHcm91cHM6IGFueVtdID0gW107XG4gICAgZ3JvdXBzLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgY29uc3Qgcm93c0luR3JvdXAgPSBkYXRhLmZpbHRlcihyb3cgPT4gZ3JvdXBbY3VycmVudENvbHVtbl0gPT09IHJvd1tjdXJyZW50Q29sdW1uXSk7XG4gICAgICBncm91cC50b3RhbENvdW50cyA9IHJvd3NJbkdyb3VwLmxlbmd0aDtcbiAgICAgIGNvbnN0IHN1Ykdyb3VwID0gdGhpcy5nZXRTdWJsZXZlbChyb3dzSW5Hcm91cCwgbGV2ZWwgKyAxLCBncm91cEJ5Q29sdW1ucywgZ3JvdXApO1xuICAgICAgc3ViR3JvdXAudW5zaGlmdChncm91cCk7XG4gICAgICBzdWJHcm91cHMgPSBzdWJHcm91cHMuY29uY2F0KHN1Ykdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3ViR3JvdXBzO1xuICB9XG5cbiAgdW5pcXVlQnkoYSwga2V5KSB7XG4gICAgY29uc3Qgc2VlbiA9IHt9O1xuICAgIHJldHVybiBhLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGNvbnN0IGsgPSBrZXkoaXRlbSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmV0dXJuLWFzc2lnbiwgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICByZXR1cm4gc2Vlbi5oYXNPd25Qcm9wZXJ0eShrKSA/IGZhbHNlIDogKHNlZW5ba10gPSB0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzR3JvdXAoaW5kZXgsIGl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXRlbS5sZXZlbDtcbiAgfVxuXG4gIF9ncm91cEhlYWRlckNsaWNrKHJvdykge1xuICAgIHJvdy5leHBhbmRlZCA9ICFyb3cuZXhwYW5kZWQ7XG4gICAgLy8gdGhpcy5yZXBlYXRMaXN0JC5maWx0ZXIgPSBcIlwiO1xuICAgIHRoaXMucGVyZkZpbHRlciA9IHBlcmZvcm1hbmNlLm5vdygpLnRvU3RyaW5nKCk7XG4gICAgdGhpcy5yZXBlYXRMaXN0JC5maWx0ZXIgPSB0aGlzLnBlcmZGaWx0ZXI7XG4gIH1cblxuICAvLyBiZWxvdyBpcyBmb3IgZ3JpZCByb3cgZ3JvdXBpbmdcbiAgY3VzdG9tRmlsdGVyUHJlZGljYXRlKGRhdGE6IGFueSB8IEdyb3VwLCBmaWx0ZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkYXRhIGluc3RhbmNlb2YgR3JvdXAgPyBkYXRhLnZpc2libGUgOiB0aGlzLmdldERhdGFSb3dWaXNpYmxlV2l0aEZpbHRlcihkYXRhLCBmaWx0ZXIpO1xuICB9XG5cbiAgZ2V0RGF0YVJvd1Zpc2libGUoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZ3JvdXBSb3dzID0gdGhpcy5yZXBlYXRMaXN0JC5kYXRhLmZpbHRlcihyb3cgPT4ge1xuICAgICAgaWYgKCEocm93IGluc3RhbmNlb2YgR3JvdXApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGxldCBtYXRjaCA9IHRydWU7XG4gICAgICB0aGlzLmdyb3VwQnlDb2x1bW5zJC5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAgIGlmICghcm93W2NvbHVtbl0gfHwgIWRhdGFbY29sdW1uXSB8fCByb3dbY29sdW1uXSAhPT0gZGF0YVtjb2x1bW5dKSB7XG4gICAgICAgICAgbWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG5cbiAgICBpZiAoZ3JvdXBSb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGdyb3VwUm93c1swXSBhcyBHcm91cDtcbiAgICByZXR1cm4gcGFyZW50LnZpc2libGUgJiYgcGFyZW50LmV4cGFuZGVkO1xuICB9XG5cbiAgZ2V0RGF0YVJvd1Zpc2libGVXaXRoRmlsdGVyKGRhdGEsIGZpbHRlcikge1xuICAgIC8vIGZpc3QgY2hlY2sgaWYgcm93IGlzIHZpc2libGUgd2l0aCBncm91cGluZ1xuICAgIGxldCBiVmlzaWJsZSA9IHRoaXMuZ2V0RGF0YVJvd1Zpc2libGUoZGF0YSk7XG5cbiAgICBpZiAoYlZpc2libGUgJiYgZmlsdGVyICYmIGZpbHRlciAhPSAnJyAmJiBmaWx0ZXIgIT0gdGhpcy5wZXJmRmlsdGVyKSB7XG4gICAgICAvLyBub3cgY2hlY2sgaWYgcm93IGlzIGZpbHRlcmVkLlxuXG4gICAgICAvLyBhc3N1bWUgbm90IHRoZXJlIHVubGVzcyB3ZSBmaW5kIGl0XG4gICAgICBiVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zJCkge1xuICAgICAgICAvLyBmaWx0ZXIgaXMgbG93ZXIgY2FzZVxuICAgICAgICBpZiAoZGF0YVtjb2xdICYmIGRhdGFbY29sXS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihmaWx0ZXIpID49IDApIHtcbiAgICAgICAgICBiVmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYlZpc2libGU7XG4gIH1cblxuICB1cGRhdGVEYXRhKGxpc3REYXRhOiBhbnlbXSwgZmllbGREYXRhOiBhbnlbXSk6IGFueVtdIHtcbiAgICBjb25zdCByZXR1cm5MaXN0OiBhbnlbXSA9IG5ldyBBcnJheTxhbnk+KCk7XG4gICAgbGlzdERhdGEuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgLy8gY29weVxuICAgICAgY29uc3Qgcm93RGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocm93KSk7XG5cbiAgICAgIGZvciAobGV0IGZpZWxkSW5kZXggPSAwOyBmaWVsZEluZGV4IDwgZmllbGREYXRhLmxlbmd0aDsgZmllbGRJbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGZpZWxkRGF0YVtmaWVsZEluZGV4XS5jb25maWc7XG4gICAgICAgIGxldCBmaWVsZE5hbWU7XG4gICAgICAgIGxldCBmb3JtYXR0ZWREYXRlO1xuICAgICAgICBsZXQgbXlGb3JtYXQ7XG4gICAgICAgIGxldCB0aGVDdXJyZW5jeU9wdGlvbnM7XG5cbiAgICAgICAgc3dpdGNoIChmaWVsZERhdGFbZmllbGRJbmRleF0udHlwZSkge1xuICAgICAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICAgICAgZmllbGROYW1lID0gY29uZmlnLm5hbWU7XG4gICAgICAgICAgICBteUZvcm1hdCA9IGNvbmZpZy5mb3JtYXR0ZXI7XG4gICAgICAgICAgICBpZiAoIW15Rm9ybWF0KSB7XG4gICAgICAgICAgICAgIG15Rm9ybWF0ID0gJ0RhdGUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybWF0dGVkRGF0ZSA9IHRoaXMudXRpbHMuZ2VuZXJhdGVEYXRlKHJvd0RhdGFbZmllbGROYW1lXSwgbXlGb3JtYXQpO1xuXG4gICAgICAgICAgICByb3dEYXRhW2ZpZWxkTmFtZV0gPSBmb3JtYXR0ZWREYXRlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnRGF0ZVRpbWUnOlxuICAgICAgICAgICAgZmllbGROYW1lID0gY29uZmlnLm5hbWU7XG4gICAgICAgICAgICBteUZvcm1hdCA9IGNvbmZpZy5mb3JtYXR0ZXI7XG4gICAgICAgICAgICBpZiAoIW15Rm9ybWF0KSB7XG4gICAgICAgICAgICAgIG15Rm9ybWF0ID0gJ0RhdGVUaW1lLUxvbmcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybWF0dGVkRGF0ZSA9IHRoaXMudXRpbHMuZ2VuZXJhdGVEYXRlVGltZShyb3dEYXRhW2ZpZWxkTmFtZV0sIG15Rm9ybWF0KTtcblxuICAgICAgICAgICAgcm93RGF0YVtmaWVsZE5hbWVdID0gZm9ybWF0dGVkRGF0ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ0N1cnJlbmN5JzpcbiAgICAgICAgICAgIGZpZWxkTmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgICAgICAgICAgdGhlQ3VycmVuY3lPcHRpb25zID0gZ2V0Q3VycmVuY3lPcHRpb25zKFBDb3JlLmdldEVudmlyb25tZW50SW5mbygpLmdldExvY2FsZSgpIGFzIHN0cmluZyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY2FzZS1kZWNsYXJhdGlvbnNcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICAgICAgICBsb2NhbGU6IGdldExvY2FsZSgpLFxuICAgICAgICAgICAgICBwb3NpdGlvbjogJ2JlZm9yZScsXG4gICAgICAgICAgICAgIGRlY1BsYWNlczogMlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jYXNlLWRlY2xhcmF0aW9uc1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgLi4udGhlQ3VycmVuY3lPcHRpb25zIH07XG4gICAgICAgICAgICByb3dEYXRhW2ZpZWxkTmFtZV0gPSBmb3JtYXR0ZXJzLkN1cnJlbmN5KHJvd0RhdGFbZmllbGROYW1lXSwgcGFyYW1zKTtcbiAgICAgICAgICAgIC8vIHZhbCA9IGZvcm1hdCh2YWx1ZSwgY29sdW1uLnR5cGUsIHRoZUN1cnJlbmN5T3B0aW9ucyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybkxpc3QucHVzaChyb3dEYXRhKTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXR1cm5MaXN0O1xuICB9XG5cbiAgb3BlbkFzc2lnbm1lbnQocm93KSB7XG4gICAgY29uc3QgeyBweFJlZk9iamVjdENsYXNzLCBwekluc0tleSB9ID0gcm93O1xuICAgIGNvbnN0IHNUYXJnZXQgPSB0aGlzLnBDb25uJC5nZXRDb250YWluZXJOYW1lKCk7XG4gICAgY29uc3Qgb3B0aW9uczogYW55ID0geyBjb250YWluZXJOYW1lOiBzVGFyZ2V0IH07XG4gICAgdGhpcy5wQ29ubiQuZ2V0QWN0aW9uc0FwaSgpLm9wZW5Bc3NpZ25tZW50KHB6SW5zS2V5LCBweFJlZk9iamVjdENsYXNzLCBvcHRpb25zKTtcbiAgfVxuXG4gIG9wZW5Xb3JrKHJvdykge1xuICAgIGNvbnN0IHB4UmVmT2JqZWN0Q2xhc3MgPSByb3cucHhSZWZPYmplY3RDbGFzcyB8fCByb3cucHhPYmpDbGFzcztcbiAgICBjb25zdCB7IHB4UmVmT2JqZWN0S2V5IH0gPSByb3c7XG4gICAgaWYgKHB4UmVmT2JqZWN0Q2xhc3MgIT09ICcnICYmIHB4UmVmT2JqZWN0S2V5ICE9PSAnJykge1xuICAgICAgdGhpcy5wQ29ubiQuZ2V0QWN0aW9uc0FwaSgpLm9wZW5Xb3JrQnlIYW5kbGUocHhSZWZPYmplY3RLZXksIHB4UmVmT2JqZWN0Q2xhc3MpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRpYWxpemVEYXRhKGRhdGEpIHtcbiAgICBkYXRhLmZvckVhY2goKGl0ZW0sIGlkeCkgPT4ge1xuICAgICAgaXRlbS5fX29yaWdpbmFsX2luZGV4ID0gaWR4O1xuICAgICAgaXRlbS5fX2xldmVsID0gMTtcbiAgICB9KTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZ2V0VHlwZShmaWVsZCkge1xuICAgIGNvbnN0IHsgY29uZmlnID0ge30sIHR5cGUgfSA9IGZpZWxkO1xuICAgIGNvbnN0IHsgZm9ybWF0VHlwZSB9ID0gY29uZmlnO1xuICAgIGlmIChmb3JtYXRUeXBlID09PSAnZGF0ZXRpbWUnIHx8IGZvcm1hdFR5cGUgPT09ICdkYXRlJykge1xuICAgICAgLy8gY3VycmVudGx5IGNvc21vcyBoYXMgb25seSBzdXBwb3J0IGZvciBkYXRlIC4uLiBpdCBhbHNvIG5lZWQgdG8gc3VwcG9ydCBkYXRlVGltZVxuICAgICAgcmV0dXJuICdkYXRlJztcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZUNvbHVtbnMoZmllbGRzID0gW10pIHtcbiAgICByZXR1cm4gZmllbGRzLm1hcCgoZmllbGQ6IGFueSwgb3JpZ2luYWxDb2xJbmRleCkgPT4gKHtcbiAgICAgIC4uLmZpZWxkLFxuICAgICAgdHlwZTogdGhpcy5nZXRUeXBlKGZpZWxkKSxcbiAgICAgIG5hbWU6IGZpZWxkLmNvbmZpZy52YWx1ZS5zdWJzdHJpbmcoNCksXG4gICAgICBsYWJlbDogZmllbGQuY29uZmlnLmxhYmVsLnN1YnN0cmluZygzKSxcbiAgICAgIGlkOiBvcmlnaW5hbENvbEluZGV4LFxuICAgICAgZ3JvdXBpbmdFbmFibGVkOiB0cnVlLFxuICAgICAgZ3JvdXBlZDogZmFsc2UsXG4gICAgICBtaW5XaWR0aDogNTAsXG4gICAgICBjZWxsUmVuZGVyZXI6IHRoaXMuZ2V0VHlwZShmaWVsZCkgPT09ICd0ZXh0JyA/IG51bGwgOiBmaWVsZC50eXBlLFxuICAgICAgZmlsdGVyOiB0cnVlXG4gICAgfSkpO1xuICB9XG5cbiAgZ2V0SGVhZGVyQ2VsbHMoY29sRmllbGRzLCBmaWVsZHMpIHtcbiAgICBjb25zdCBBc3NpZ25EYXNoT2JqZWN0cyA9IFsnQXNzaWduLVdvcmtsaXN0JywgJ0Fzc2lnbi1Xb3JrQmFza2V0J107XG4gICAgcmV0dXJuIGNvbEZpZWxkcy5tYXAoKGZpZWxkOiBhbnksIGluZGV4KSA9PiB7XG4gICAgICBsZXQgdGhlRmllbGQgPSBmaWVsZC5jb25maWcudmFsdWUuc3Vic3RyaW5nKGZpZWxkLmNvbmZpZy52YWx1ZS5pbmRleE9mKCcgJykgKyAxKTtcbiAgICAgIGlmICh0aGVGaWVsZC5pbmRleE9mKCcuJykgPT09IDApIHtcbiAgICAgICAgdGhlRmllbGQgPSB0aGVGaWVsZC5zdWJzdHJpbmcoMSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb2xJbmRleCA9IGZpZWxkcy5maW5kSW5kZXgoZWxlID0+IGVsZS5uYW1lID09PSB0aGVGaWVsZCk7XG4gICAgICBjb25zdCBkaXNwbGF5QXNMaW5rID0gZmllbGQuY29uZmlnLmRpc3BsYXlBc0xpbms7XG4gICAgICBjb25zdCBoZWFkZXJSb3c6IGFueSA9IHt9O1xuICAgICAgaGVhZGVyUm93LmlkID0gZmllbGRzW2luZGV4XS5pZDtcbiAgICAgIGhlYWRlclJvdy50eXBlID0gZmllbGQudHlwZTtcbiAgICAgIGhlYWRlclJvdy5kaXNwbGF5QXNMaW5rID0gZGlzcGxheUFzTGluaztcbiAgICAgIGhlYWRlclJvdy5udW1lcmljID0gZmllbGQudHlwZSA9PT0gJ0RlY2ltYWwnIHx8IGZpZWxkLnR5cGUgPT09ICdJbnRlZ2VyJyB8fCBmaWVsZC50eXBlID09PSAnUGVyY2VudGFnZScgfHwgZmllbGQudHlwZSA9PT0gJ0N1cnJlbmN5JyB8fCBmYWxzZTtcbiAgICAgIGhlYWRlclJvdy5kaXNhYmxlUGFkZGluZyA9IGZhbHNlO1xuICAgICAgaGVhZGVyUm93LmxhYmVsID0gZmllbGRzW2luZGV4XS5sYWJlbDtcbiAgICAgIGlmIChjb2xJbmRleCA+IC0xKSB7XG4gICAgICAgIGhlYWRlclJvdy5jbGFzc0lEID0gZmllbGRzW2NvbEluZGV4XS5jbGFzc0lEO1xuICAgICAgfVxuICAgICAgaWYgKGRpc3BsYXlBc0xpbmspIHtcbiAgICAgICAgaGVhZGVyUm93LmlzQXNzaWdubWVudExpbmsgPSBBc3NpZ25EYXNoT2JqZWN0cy5pbmNsdWRlcyhoZWFkZXJSb3cuY2xhc3NJRCk7XG4gICAgICAgIGlmIChmaWVsZC5jb25maWcudmFsdWU/LnN0YXJ0c1dpdGgoJ0BDQScpKSB7XG4gICAgICAgICAgaGVhZGVyUm93LmlzQXNzb2NpYXRpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaGVhZGVyUm93O1xuICAgIH0pO1xuICB9XG5cbiAgYnVpbGRTZWxlY3QoZmllbGREZWZzLCBjb2xJZCwgcGF0Y2hRdWVyeUZpZWxkcyA9IFtdLCBjb21wb3NpdGVLZXlzID0gW10pIHtcbiAgICBjb25zdCBsaXN0RmllbGRzOiBhbnkgPSBbXTtcbiAgICBpZiAoY29sSWQpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5nZXRGaWVsZChmaWVsZERlZnMsIGNvbElkKTtcbiAgICAgIGxpc3RGaWVsZHMucHVzaCh7XG4gICAgICAgIGZpZWxkOiBmaWVsZC5uYW1lXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTk9URTogSWYgd2UgZXZlciBkZWNpZGUgdG8gbm90IHNldCB1cCBhbGwgdGhlIGBmaWVsZERlZnNgIG9uIHNlbGVjdCwgZW5zdXJlIHRoYXQgdGhlIGZpZWxkc1xuICAgICAgLy8gIGNvcnJlc3BvbmRpbmcgdG8gYHN0YXRlLmdyb3Vwc2AgYXJlIHNldCB1cC4gTmVlZGVkIGluIENsaWVudC1tb2RlIGdyb3VwaW5nL3BhZ2luYXRpb24uXG4gICAgICBmaWVsZERlZnMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgIGlmICghbGlzdEZpZWxkcy5maW5kKGYgPT4gZi5maWVsZCA9PT0gZmllbGQubmFtZSkpIHtcbiAgICAgICAgICBsaXN0RmllbGRzLnB1c2goe1xuICAgICAgICAgICAgZmllbGQ6IGZpZWxkLm5hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwYXRjaFF1ZXJ5RmllbGRzLmZvckVhY2goayA9PiB7XG4gICAgICAgIGlmICghbGlzdEZpZWxkcy5maW5kKGYgPT4gZi5maWVsZCA9PT0gaykpIHtcbiAgICAgICAgICBsaXN0RmllbGRzLnB1c2goe1xuICAgICAgICAgICAgZmllbGQ6IGtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29tcG9zaXRlS2V5cy5mb3JFYWNoKGsgPT4ge1xuICAgICAgaWYgKCFsaXN0RmllbGRzLmZpbmQoZiA9PiBmLmZpZWxkID09PSBrKSkge1xuICAgICAgICBsaXN0RmllbGRzLnB1c2goe1xuICAgICAgICAgIGZpZWxkOiBrXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBsaXN0RmllbGRzO1xuICB9XG5cbiAgZ2V0RmllbGQoZmllbGREZWZzLCBjb2x1bW5JZCkge1xuICAgIGNvbnN0IGZpZWxkc01hcCA9IHRoaXMuZ2V0RmllbGRzTWFwKGZpZWxkRGVmcyk7XG4gICAgcmV0dXJuIGZpZWxkc01hcC5nZXQoY29sdW1uSWQpO1xuICB9XG5cbiAgZ2V0RmllbGRzTWFwKGZpZWxkRGVmcykge1xuICAgIGNvbnN0IGZpZWxkc01hcCA9IG5ldyBNYXAoKTtcbiAgICBmaWVsZERlZnMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGZpZWxkc01hcC5zZXQoZWxlbWVudC5pZCwgZWxlbWVudCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpZWxkc01hcDtcbiAgfVxuXG4gIGFkZEl0ZW1LZXlJblNlbGVjdChmaWVsZERlZnMsIGl0ZW1LZXksIHNlbGVjdCwgY29tcG9zaXRlS2V5cykge1xuICAgIGNvbnN0IGVsZW1lbnRGb3VuZCA9IHRoaXMuZ2V0RmllbGQoZmllbGREZWZzLCBpdGVtS2V5KTtcblxuICAgIGlmIChcbiAgICAgIGl0ZW1LZXkgJiZcbiAgICAgICFlbGVtZW50Rm91bmQgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoc2VsZWN0KSAmJlxuICAgICAgIShjb21wb3NpdGVLZXlzICE9PSBudWxsICYmIGNvbXBvc2l0ZUtleXM/Lmxlbmd0aCkgJiZcbiAgICAgICFzZWxlY3QuZmluZChzZWwgPT4gc2VsLmZpZWxkID09PSBpdGVtS2V5KVxuICAgICkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4uc2VsZWN0LFxuICAgICAgICB7XG4gICAgICAgICAgZmllbGQ6IGl0ZW1LZXlcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0O1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicHNkay1saXN0LWhlYWRlclwiPlxuICA8ZGl2PlxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInBzZGstc2VhcmNoXCIgKm5nSWY9XCJiU2hvd1NlYXJjaCRcIj5cbiAgICAgIDxtYXQtbGFiZWw+PGltZyBjbGFzcz1cInBzZGstaWNvbi1zZWFyY2hcIiBzcmM9XCJ7eyBzZWFyY2hJY29uJCB9fVwiIC8+IDxzcGFuIGNsYXNzPVwicHNkay1zZWFyY2gtbGFiZWxcIj5TZWFyY2g8L3NwYW4+IDwvbWF0LWxhYmVsPlxuICAgICAgPGlucHV0IG1hdElucHV0IGlkPVwic2VhcmNoXCIgKGtleXVwKT1cImFwcGx5U2VhcmNoKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIlwiIC8+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgIDxkaXYgKm5nSWY9XCIhYkluRm9ybSRcIiBjbGFzcz1cInBzZGstb3V0ZXItZGl2LWluLWZvcm1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLWlubmVyLWRpdi1pbi1mb3JtXCIgKm5nSWY9XCJiQ29sdW1uUmVvcmRlciRcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8dGFibGVcbiAgICAgICAgICAgIG1hdC10YWJsZVxuICAgICAgICAgICAgaWQ9XCJsaXN0LXZpZXdcIlxuICAgICAgICAgICAgW2RhdGFTb3VyY2VdPVwicmVwZWF0TGlzdCRcIlxuICAgICAgICAgICAgbWF0U29ydFxuICAgICAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgICAgIGNka0Ryb3BMaXN0T3JpZW50YXRpb249XCJob3Jpem9udGFsXCJcbiAgICAgICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkQ29sIG9mIGZpZWxkcyRcIiBbbWF0Q29sdW1uRGVmXT1cImRDb2wuY29uZmlnLm5hbWVcIiBzdGlja3k9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXJcIiAoY2xpY2spPVwiX2hlYWRlclNvcnRDbGljaygkZXZlbnQsIGRDb2wpXCIgYXJyb3dQb3NpdGlvbj1cImJlZm9yZVwiIGNka0RyYWc+XG4gICAgICAgICAgICAgICAge3sgZENvbC5jb25maWcubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tYXQtaGVhZGVyLWZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstZmlsdGVyLXN2Zy1pY29uXCIgbmFtZT1cImZpbHRlck9uSWNvblwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstbWF0LWhlYWRlci1hcnJvd1wiPlxuICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstYXJyb3ctc3ZnLWljb25cIiBhcnJvdz1cIm5vbmVcIiBbYXR0ci5hcnJvd2lkXT1cImRDb2wuY29uZmlnLm5hbWVcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXItYnV0dG9uXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImdyb3VwTWVudVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBtZW51U3ZnSWNvbiQgfX1cIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI2dyb3VwTWVudT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFfc2hvd1VuR3JvdXBCeShkQ29sKSAmJiBiR3JvdXBpbmckXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiX2dyb3VwQnkoJGV2ZW50LCBkQ29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IGdyb3VwQnlTdmdJY29uJCB9fVwiIC8+PHNwYW4+R3JvdXAgQnk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiX3Nob3dVbkdyb3VwQnkoZENvbCkgJiYgYkdyb3VwaW5nJFwiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIl91bkdyb3VwQnkoJGV2ZW50LCBkQ29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IGdyb3VwQnlTdmdJY29uJCB9fVwiIC8+PHNwYW4+VW5ncm91cDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiX2ZpbHRlcigkZXZlbnQsIGRDb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgZmlsdGVyU3ZnSWNvbiQgfX1cIiAvPjxzcGFuPkZpbHRlcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgaW5kZXggYXMgaVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiX3Nob3dCdXR0b24oZENvbC5jb25maWcubmFtZSwgZENvbCk7IGVsc2UgcmVndWxhclwiXG4gICAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9saXN0Vmlld0NsaWNrKGRDb2wuY29uZmlnLCBlbGVtZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgZWxlbWVudFtkQ29sLmNvbmZpZy5uYW1lXSB8fCAnLS0tJyB9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVndWxhcj5cbiAgICAgICAgICAgICAgICAgIHt7IGVsZW1lbnRbZENvbC5jb25maWcubmFtZV0gfHwgJy0tLScgfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1ucyQ7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XG4gICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucyRcIj48L3RyPlxuXG4gICAgICAgICAgICA8IS0tIEdyb3VwIGhlYWRlciAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZ3JvdXBIZWFkZXJcIj5cbiAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsIGNvbHNwYW49XCI5OTlcIiAqbWF0Q2VsbERlZj1cImxldCBncm91cFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImdyb3VwLmV4cGFuZGVkXCIgW2F0dHIuc3R5bGVdPVwiX2dldEljb25TdHlsZShncm91cC5sZXZlbClcIj5leHBhbmRfbGVzczwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWdyb3VwLmV4cGFuZGVkXCIgW2F0dHIuc3R5bGVdPVwiX2dldEljb25TdHlsZShncm91cC5sZXZlbClcIj5leHBhbmRfbW9yZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPHN0cm9uZ1xuICAgICAgICAgICAgICAgICAgPnt7IF9nZXRHcm91cE5hbWUoZ3JvdXBCeUNvbHVtbnMkW2dyb3VwLmxldmVsIC0gMV0pIH19OiB7eyBncm91cFtncm91cEJ5Q29sdW1ucyRbZ3JvdXAubGV2ZWwgLSAxXV0gfX0gKHt7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLnRvdGFsQ291bnRzXG4gICAgICAgICAgICAgICAgICB9fSk8L3N0cm9uZ1xuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogWydncm91cEhlYWRlciddOyB3aGVuOiBpc0dyb3VwXCIgKGNsaWNrKT1cIl9ncm91cEhlYWRlckNsaWNrKHJvdylcIj48L3RyPlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHNkay1pbm5lci1kaXYtaW4tZm9ybVwiICpuZ0lmPVwiIWJDb2x1bW5SZW9yZGVyJFwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDx0YWJsZSBtYXQtdGFibGUgaWQ9XCJsaXN0LXZpZXdcIiBbZGF0YVNvdXJjZV09XCJyZXBlYXRMaXN0JFwiIG1hdFNvcnQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkQ29sIG9mIGZpZWxkcyRcIiBbbWF0Q29sdW1uRGVmXT1cImRDb2wuY29uZmlnLm5hbWVcIiBzdGlja3k9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXJcIiAoY2xpY2spPVwiX2hlYWRlclNvcnRDbGljaygkZXZlbnQsIGRDb2wpXCIgYXJyb3dQb3NpdGlvbj1cImJlZm9yZVwiPlxuICAgICAgICAgICAgICAgIHt7IGRDb2wuY29uZmlnLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstbWF0LWhlYWRlci1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWZpbHRlci1zdmctaWNvblwiIG5hbWU9XCJmaWx0ZXJPbkljb25cIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXItYXJyb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWFycm93LXN2Zy1pY29uXCIgYXJyb3c9XCJub25lXCIgW2F0dHIuYXJyb3dpZF09XCJkQ29sLmNvbmZpZy5uYW1lXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tYXQtaGVhZGVyLWJ1dHRvblwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJncm91cE1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgbWVudVN2Z0ljb24kIH19XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICNncm91cE1lbnU+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhX3Nob3dVbkdyb3VwQnkoZENvbCkgJiYgYkdyb3VwaW5nJFwiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIl9ncm91cEJ5KCRldmVudCwgZENvbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBncm91cEJ5U3ZnSWNvbiQgfX1cIiAvPjxzcGFuPkdyb3VwIEJ5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIl9zaG93VW5Hcm91cEJ5KGRDb2wpICYmIGJHcm91cGluZyRcIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJfdW5Hcm91cEJ5KCRldmVudCwgZENvbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBncm91cEJ5U3ZnSWNvbiQgfX1cIiAvPjxzcGFuPlVuZ3JvdXA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIl9maWx0ZXIoJGV2ZW50LCBkQ29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IGZpbHRlclN2Z0ljb24kIH19XCIgLz48c3Bhbj5GaWx0ZXI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGluZGV4IGFzIGlcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIl9zaG93QnV0dG9uKGRDb2wuY29uZmlnLm5hbWUsIGRDb2wpOyBlbHNlIHJlZ3VsYXJcIlxuICAgICAgICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJfbGlzdFZpZXdDbGljayhkQ29sLmNvbmZpZywgZWxlbWVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IGVsZW1lbnRbZENvbC5jb25maWcubmFtZV0gfHwgJy0tLScgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JlZ3VsYXI+XG4gICAgICAgICAgICAgICAgICB7eyBlbGVtZW50W2RDb2wuY29uZmlnLm5hbWVdIHx8ICctLS0nIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnMkOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnMkXCI+PC90cj5cblxuICAgICAgICAgICAgPCEtLSBHcm91cCBoZWFkZXIgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImdyb3VwSGVhZGVyXCI+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjb2xzcGFuPVwiOTk5XCIgKm1hdENlbGxEZWY9XCJsZXQgZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJncm91cC5leHBhbmRlZFwiIFthdHRyLnN0eWxlXT1cIl9nZXRJY29uU3R5bGUoZ3JvdXAubGV2ZWwpXCI+ZXhwYW5kX2xlc3M8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFncm91cC5leHBhbmRlZFwiIFthdHRyLnN0eWxlXT1cIl9nZXRJY29uU3R5bGUoZ3JvdXAubGV2ZWwpXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDxzdHJvbmdcbiAgICAgICAgICAgICAgICAgID57eyBfZ2V0R3JvdXBOYW1lKGdyb3VwQnlDb2x1bW5zJFtncm91cC5sZXZlbCAtIDFdKSB9fToge3sgZ3JvdXBbZ3JvdXBCeUNvbHVtbnMkW2dyb3VwLmxldmVsIC0gMV1dIH19ICh7e1xuICAgICAgICAgICAgICAgICAgICBncm91cC50b3RhbENvdW50c1xuICAgICAgICAgICAgICAgICAgfX0pPC9zdHJvbmdcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZ3JvdXBIZWFkZXInXTsgd2hlbjogaXNHcm91cFwiIChjbGljayk9XCJfZ3JvdXBIZWFkZXJDbGljayhyb3cpXCI+PC90cj5cbiAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJiSW5Gb3JtJFwiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstaW5uZXItZGl2LWluLWZvcm1cIj5cbiAgICAgICAgICA8dGFibGUgaWQ9XCJsaXN0LXZpZXdcIiAqbmdJZj1cInJlcGVhdExpc3REYXRhLmxlbmd0aCA+IDBcIiBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwicmVwZWF0TGlzdCRcIiBtYXRTb3J0PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNpbmdsZVNlbGVjdGlvbk1vZGVcIiBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIj5cbiAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj48L3RoPlxuICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gW3ZhbHVlXT1cInJvd1tyb3dJRF1cIiAoY2hhbmdlKT1cImZpZWxkT25DaGFuZ2Uocm93KVwiPjwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm11bHRpU2VsZWN0aW9uTW9kZVwiIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxuICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPjwvdGg+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFt2YWx1ZV09XCJyb3dbcm93SURdXCIgKGNoYW5nZSk9XCJvbkNoZWNrYm94Q2xpY2socm93LCAkZXZlbnQpXCI+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRDb2wgb2YgZmllbGRzJFwiIFttYXRDb2x1bW5EZWZdPVwiZENvbC5jb25maWcubmFtZVwiPlxuICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlciAoY2xpY2spPVwiX2hlYWRlclNvcnRDbGljaygkZXZlbnQsIGRDb2wpXCIgYXJyb3dQb3NpdGlvbj1cImJlZm9yZVwiPlxuICAgICAgICAgICAgICAgIHt7IGRDb2wuY29uZmlnLmxhYmVsIH19XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudFtkQ29sLmNvbmZpZy5uYW1lXSB8fCAnLS0tJyB9fTwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zJFwiPjwvdHI+XG4gICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucyRcIj48L3RyPlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInJlcGVhdExpc3REYXRhPy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgIDx0YWJsZSBpZD1cImxpc3Qtdmlld1wiICpuZ0lmPVwicmVwZWF0TGlzdERhdGE/Lmxlbmd0aCA9PT0gMFwiIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJyZXBlYXRMaXN0JFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkQ29sIG9mIGZpZWxkcyRcIiBbbWF0Q29sdW1uRGVmXT1cImRDb2wuY29uZmlnLm5hbWVcIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPnt7IGRDb2wuY29uZmlnLmxhYmVsIH19PC90aD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1ucyRcIj48L3RyPlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1uby1yZWNvcmRzXCIgKm5nSWY9XCJyZXBlYXRMaXN0RGF0YT8ubGVuZ3RoID09PSAwXCI+Tm8gUmVjb3JkcyBGb3VuZC48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxtYXQtcGFnaW5hdG9yIGlkPVwicGFnaW5hdGlvblwiICpuZ0lmPVwiYkluRm9ybSRcIiBbcGFnZVNpemVPcHRpb25zXT1cIlsxMCwgMjAsIDUwLCAxMDAsIDUwMCwgMTAwMF1cIiBzaG93Rmlyc3RMYXN0QnV0dG9ucz48L21hdC1wYWdpbmF0b3I+XG4gICAgPG1hdC1wYWdpbmF0b3IgaWQ9XCJwYWdpbmF0aW9uXCIgKm5nSWY9XCIhYkluRm9ybSRcIiBbcGFnZVNpemVPcHRpb25zXT1cIlsxMCwgMjAsIDUwLCAxMDAsIDUwMF1cIiBzaG93Rmlyc3RMYXN0QnV0dG9ucz48L21hdC1wYWdpbmF0b3I+XG4gIDwvZGl2PlxuXG4gIDwhLS0gcG9wIG92ZXJzIGZvciBmaWx0ZXJzLS0+XG4gIDxkaXYgKm5nSWY9XCJiU2hvd0ZpbHRlclBvcG92ZXIkXCIgY2xhc3M9XCJwc2RrLWRpYWxvZy1iYWNrZ3JvdW5kXCI+XG4gICAgPGRpdiBjbGFzcz1cInBzZGstbW9kYWwtZmlsZS10b3BcIj5cbiAgICAgIDxoND5cbiAgICAgICAgRmlsdGVyOjxiPiB7eyBmaWx0ZXJDb250YWluc0xhYmVsJCB9fTwvYj5cbiAgICAgIDwvaDQ+XG4gICAgICA8ZGl2ICpuZ0lmPVwiYkNvbnRhaW5zJFwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICA8bWF0LXNlbGVjdCBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNUeXBlJFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zVHlwZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImNvbnRhaW5zXCI+Q29udGFpbnM8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImVxdWFsc1wiPkVxdWFsczwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwic3RhcnRzd2l0aFwiPlN0YXJ0cyB3aXRoPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNWYWx1ZSRcIiAoY2hhbmdlKT1cIl9maWx0ZXJDb250YWluc1ZhbHVlKCRldmVudClcIiAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJiRGF0ZVRpbWUkXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInBzZGstZnVsbC13aWR0aFwiPlxuICAgICAgICAgIDxtYXQtc2VsZWN0IFt2YWx1ZV09XCJmaWx0ZXJDb250YWluc1R5cGUkXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNUeXBlKCRldmVudClcIj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibm90ZXF1YWxcIj5pcyBub3QgZXF1YWwgdG88L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImFmdGVyXCI+YWZ0ZXI8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImJlZm9yZVwiPmJlZm9yZTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibnVsbFwiPmlzIG51bGw8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm5vdG51bGxcIj5pcyBub3QgbnVsbDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiYklzRGF0ZSQgJiYgZmlsdGVyQ29udGFpbnNUeXBlJCAhPT0gJ251bGwnICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT0gJ25vdG51bGwnXCIgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPkRhdGU8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAjZGF0ZUlucHV0XG4gICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJwZWdhZGF0ZVwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNWYWx1ZSRcIlxuICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zRGF0ZVZhbHVlKCRldmVudCwgZGF0ZUlucHV0LnZhbHVlKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBlZ2FkYXRlXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwZWdhZGF0ZSBbc3RhcnRBdF09XCJmaWx0ZXJDb250YWluc1ZhbHVlJFwiPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiYklzRGF0ZVRpbWUkICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT09ICdudWxsJyAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9ICdub3RudWxsJ1wiIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD5EYXRlIHRpbWU8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCIgKGNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNEYXRlVGltZVZhbHVlKCRldmVudClcIiAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImJJc1RpbWUkICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT09ICdudWxsJyAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9ICdub3RudWxsJ1wiIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD5UaW1lPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0aW1lXCIgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCIgKGNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNUaW1lVmFsdWUoJGV2ZW50KVwiIC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGNvbXBvbmVudC1tYXBwZXJcbiAgICAgICAgbmFtZT1cIkFjdGlvbkJ1dHRvbnNcIlxuICAgICAgICBbcHJvcHNdPVwieyBhck1haW5CdXR0b25zJDogYXJGaWx0ZXJNYWluQnV0dG9ucyQsIGFyU2Vjb25kYXJ5QnV0dG9ucyQ6IGFyRmlsdGVyU2Vjb25kYXJ5QnV0dG9ucyQgfVwiXG4gICAgICAgIFtwYXJlbnRdPVwidGhpc1wiXG4gICAgICAgIFtvdXRwdXRFdmVudHNdPVwieyBhY3Rpb25CdXR0b25DbGljazogX29uRmlsdGVyQWN0aW9uQnV0dG9uQ2xpY2sgfVwiXG4gICAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|