ets-fe-ng-sdk 17.0.308 → 17.0.310
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/Reusables/reusable-comps/find-item/find-item.component.mjs +2 -2
- package/esm2022/lib/Shared/components/btn/btn.model.mjs +1 -1
- package/esm2022/lib/Shared/components/btn/btn.service.mjs +168 -164
- package/esm2022/lib/Shared/components/editable-text-case/editable-text-case.component.mjs +2 -2
- package/esm2022/lib/Shared/components/file-upload/file-upload.component.mjs +17 -5
- package/esm2022/lib/Shared/components/form-generator/form-generator.base.component.mjs +1 -1
- package/esm2022/lib/Shared/components/form-generator/form-generator.component.mjs +3 -3
- package/esm2022/lib/Shared/components/input/day-hour-min-input/day-hour-min-input.component.mjs +1 -1
- package/esm2022/lib/Shared/components/input/input-base.component.mjs +6 -2
- package/esm2022/lib/Shared/components/input/input-basic.component.mjs +3 -7
- package/esm2022/lib/Shared/components/input/input-control.component.mjs +3 -3
- package/esm2022/lib/Shared/components/input/input-td-rf.component.mjs +3 -3
- package/esm2022/lib/Shared/components/input/input.component.mjs +3 -3
- package/esm2022/lib/Shared/components/input/validation-message/validation-message.component.mjs +6 -10
- package/esm2022/lib/Shared/components/input-table/input-table.component.mjs +2 -2
- package/esm2022/lib/Shared/components/table-input/table-input-row/table-input-row.component.mjs +2 -2
- package/esm2022/lib/Shared/components/table-plain/table-plain.component.mjs +2 -2
- package/esm2022/lib/Shared/components/webcam-media/webcam-media.component.mjs +266 -0
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/ets-fe-ng-sdk.mjs +548 -283
- package/fesm2022/ets-fe-ng-sdk.mjs.map +1 -1
- package/lib/Services/utility.service.d.ts +1 -1
- package/lib/Shared/components/btn/btn.component.d.ts +1 -1
- package/lib/Shared/components/btn/btn.model.d.ts +1 -1
- package/lib/Shared/components/btn/btn.service.d.ts +7 -0
- package/lib/Shared/components/file-upload/file-upload.component.d.ts +9 -3
- package/lib/Shared/components/form-generator/form-generator.base.component.d.ts +2 -0
- package/lib/Shared/components/info-dialog/info-dialog.component.d.ts +1 -1
- package/lib/Shared/components/input/input-base.component.d.ts +3 -1
- package/lib/Shared/components/input/input-basic.component.d.ts +1 -3
- package/lib/Shared/components/input/validation-message/validation-message.component.d.ts +3 -3
- package/lib/Shared/components/webcam-media/webcam-media.component.d.ts +88 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -183,7 +183,7 @@ export class TablePlainComponent extends TableBaseComponent {
|
|
|
183
183
|
this.filterChange.emit(e);
|
|
184
184
|
}
|
|
185
185
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: TablePlainComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
186
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.1", type: TablePlainComponent, isStandalone: true, selector: "table-plain", inputs: { customSelectClass: { classPropertyName: "customSelectClass", publicName: "customSelectClass", isSignal: true, isRequired: false, transformFunction: null }, idField: { classPropertyName: "idField", publicName: "idField", isSignal: true, isRequired: false, transformFunction: null }, obsDataSource: { classPropertyName: "obsDataSource", publicName: "obsDataSource", isSignal: true, isRequired: false, transformFunction: null }, showFilter: { classPropertyName: "showFilter", publicName: "showFilter", isSignal: true, isRequired: false, transformFunction: null }, showPager: { classPropertyName: "showPager", publicName: "showPager", isSignal: true, isRequired: false, transformFunction: null }, disableSelectionByField: { classPropertyName: "disableSelectionByField", publicName: "disableSelectionByField", isSignal: false, isRequired: false, transformFunction: null }, _data: { classPropertyName: "_data", publicName: "data", isSignal: false, isRequired: false, transformFunction: null }, _filterFields: { classPropertyName: "_filterFields", publicName: "filterFields", isSignal: false, isRequired: false, transformFunction: null }, _filterFieldsMap: { classPropertyName: "_filterFieldsMap", publicName: "filterFieldsMap", isSignal: false, isRequired: false, transformFunction: null }, selectionPerPage: { classPropertyName: "selectionPerPage", publicName: "selectionPerPage", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { _view: "view", dataChanged: "dataChanged", filterChange: "filterChange", listMutated: "listMutated" }, usesInheritance: true, ngImport: i0, template: "<div class=\"table-plain\">\n @if (header()) {\n <h6 class=\"text-primary\">\n {{ header() | appTranslate | async }}\n </h6>\n }\n\n @if (filterFields()) {\n <div class=\"d-flex\">\n <app-btn\n text=\"{{ filterCont.hidden ? 'Show Filter' : 'Hide Filter' }}\"\n [icon]=\"filterCont.hidden ? 'search' : 'close'\"\n (mclick)=\"filterCont.hidden = !filterCont.hidden\" />\n </div>\n <div class=\"row align-items-center mt-2\" [hidden]=\"true\" #filterCont>\n @for (scheme of filterFields(); track scheme) {\n <div class=\"col-md-4 col-xxl-3\">\n @switch (scheme.type) {\n @case ('autocomplete') {\n <div class=\"col\">\n <app-autocomplete\n [form]=\"filterForm\"\n [label]=\"scheme.label\"\n [labelField]=\"scheme.labelField\"\n [labelType]=\"scheme.labelType | toAny\"\n [name]=\"scheme.field | toAny\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [valueField]=\"scheme.valueField\"\n [hint]=\"scheme.hint\"\n [disabled]=\"scheme.disabledIf | functionCaller2: filterForm.value : scheme.field\"\n #inputTag\n [options]=\"scheme.options || cellOptions[scheme.field | toAny]\"\n (mchange)=\"onFilterChange(dataSource().filteredData)\"></app-autocomplete>\n <app-validation-message [input]=\"inputTag\" />\n </div>\n }\n @default {\n <app-input-basic\n #formField\n [name]=\"scheme.field | toAny\"\n [form]=\"filterForm\"\n [stacked]=\"true\"\n [type]=\"scheme.type\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [labelField]=\"scheme.labelField\"\n [noFormat]=\"true\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"scheme.disabledIf | functionCaller2: filterForm.value : scheme.field\"\n [options]=\"scheme.options || cellOptions[scheme.field | toAny]\"\n (mchange)=\"onFilterChange(dataSource().filteredData)\" />\n <app-validation-message [input]=\"formField\" />\n }\n }\n </div>\n }\n <div class=\"col-md justify-content-end d-flex\">\n <app-btn type=\"danger-outline\" text=\"Clear\" icon=\"delete\" (mclick)=\"clearFilter()\"></app-btn>\n </div>\n </div>\n }\n\n @if (startSectionTemplate() || showFilter() || showExport() || showAdditionalColumns()) {\n <div class=\" \">\n <div class=\"row g-3 justify-content-between align-items-end\">\n <div class=\"col-md\">\n @if (startSectionTemplate) {\n <ng-container [ngTemplateOutlet]=\"startSectionTemplate()\"></ng-container>\n }\n @if (showFilter()) {\n <form [formGroup]=\"filterForm\">\n <div class=\"row justify-content-center align-items-end\">\n <div class=\"col-md-auto\">\n <app-autocomplete\n label=\"Filter\"\n type=\"select\"\n [form]=\"filterForm\"\n name=\"field\"\n [stacked]=\"false\"\n [options]=\"filterOptions()\"\n valueField=\"code\"\n labelField=\"description\"></app-autocomplete>\n </div>\n <div class=\"col-md-auto\">\n <app-input-basic label=\"Value\" type=\"text\" [form]=\"filterForm\" name=\"value\" [stacked]=\"false\"></app-input-basic>\n </div>\n <div class=\"col-md-auto\">\n <app-btn text=\"Clear\" type=\"secondary\" (mclick)=\"clearFilter()\"></app-btn>\n </div>\n </div>\n </form>\n }\n </div>\n @if (showExport() || showAdditionalColumns()) {\n <div class=\"col-md-auto\">\n <div class=\"row row-cols-auto g-3 justify-content-end\">\n <span>\n @if (showExport()) {\n <app-export-table\n [disabled]=\"!dataSource()?.data?.length\"\n [label]=\"label()\"\n [displayedColumns]=\"computedDisplayedColumns()\"\n [data]=\"dataSource()?.data\" />\n }\n </span>\n @if (showAdditionalColumns()) {\n <div class=\"d-flex\">\n <fields-to-display\n [fields]=\"allTableColumns()\"\n [currentColumns]=\"computedDisplayedColumns()\"\n (fieldsChanged)=\"fieldsChanged($event)\" />\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <div [ngClass]=\"{ border: distinct() }\" class=\"mt-2 rounded-10 overflow-auto table-container {{ tableContainerClass() }} \">\n <div class=\"table-responsive\">\n <table\n mat-table\n [dataSource]=\"dataSource() || obsDataSource()\"\n matSort\n class=\"w-100 d-table table mb-0\"\n [multiTemplateDataRows]=\"isExpandable\"\n #table\n [ngClass]=\"{ smallerFonts, nowrap, centerCells, curvy, 'table-striped': striped }\">\n <!-- Checkbox Column -->\n <ng-container matColumnDef=\"mselect\" [sticky]=\"!placeSelectionAtRight\" [stickyEnd]=\"placeSelectionAtRight\">\n <th mat-header-cell *matHeaderCellDef>\n @if (customSelectClass) {\n <input\n type=\"checkbox\"\n [class]=\"customSelectClass\"\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [attr.aria-label]=\"checkboxLabel()\" />\n }\n @if (!customSelectClass) {\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [aria-label]=\"checkboxLabel()\"></mat-checkbox>\n }\n </th>\n <td mat-cell *matCellDef=\"let row\">\n @if (customSelectClass) {\n <input\n type=\"checkbox\"\n class=\"form-control control-bg-gray\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [attr.aria-label]=\"checkboxLabel(row)\" />\n }\n @if (!customSelectClass) {\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [aria-label]=\"checkboxLabel(row)\"\n [disabled]=\"this.disableSelectionByField | functionCaller1: row\"></mat-checkbox>\n }\n </td>\n </ng-container>\n <!-- Columns -->\n @for (col of computedDisplayedColumns(); track col; let i = $index) {\n @switch (col.type) {\n <!-- CHECKBOX -->\n @case ('textarea') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- <app-input-td-rf [(model)]=\"col.\" [showLabel]=\"false\" /> -->\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- CHECKBOX -->\n @case ('checkbox') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- Removing the empty space above checkboxes -->\n <app-input-ngmodel\n [showLabel]=\"false\"\n [stacked]=\"true\"\n type=\"checkbox\"\n [disabled]=\"col.disabled\"\n [checked]=\"col.checked\"\n [(model)]=\"row[col.f]\"\n (mchange)=\"outputCheckbox(col.f, row, $event)\"></app-input-ngmodel>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Input -->\n @case ('input') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- Removing the empty space above checkboxes -->\n <app-input-basic\n [showLabel]=\"false\"\n [stacked]=\"true\"\n type=\"text\"\n [disabled]=\"col.disabled\"\n [form]=\"row\"\n [name]=\"col.f\"\n [noFormat]=\"true\"></app-input-basic>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- PROGRESS BAR -->\n @case ('progress') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"progress\">\n <div class=\"progress-bar progress-bar-striped bg-success\" role=\"progressbar\" [ngStyle]=\"{ width: row[col.f] }\">\n {{ row[col.f] }}\n </div>\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- COLOR -->\n @case ('color') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"square-2\" [style]=\"'background-color:' + row[col.f]\"></div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Button -->\n @case ('button') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index\" class=\"btn-cell\">\n <app-btn\n [icon]=\"col.icon || col.btn?.icon\"\n [type]=\"col.btn?.type\"\n (mclick)=\"col.action ? col.action(row, col.f, getActionStatusCallback(col), index) : null\"\n [help]=\"col.btn?.help\"\n [showHelpIcon]=\"col.btn?.showHelpIcon\"\n [text]=\"col.btn?.label\"\n [loading]=\"col.btn?.loading\"\n [iconBtn]=\"col.btn?.iconBtn\"\n mclass=\"w-auto\"\n [disabled]=\"col.btn?.disabled || col.btn?.loading\"></app-btn>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Sub Table -->\n @case ('table') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell class=\"text-center\" *matCellDef=\"let row\">\n <div class=\"inline-block\">\n <app-btn\n [icon]=\"col.icon\"\n [type]=\"col.btn?.type || 'dark'\"\n (mclick)=\"col.action ? col.action(row, col.f) : null\"\n [group]=\"col.btn?.group\"\n [help]=\"col.subTable | tableToString: row | async\"\n [showHelpIcon]=\"false\"\n [text]=\"col.btn?.label\"\n [iconBtn]=\"true\"\n mclass=\"w-auto\"></app-btn>\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- ACTION COLUMNS -->\n @case ('btns') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"btn-cell text-center\">\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\" class=\"btn-cell\">\n <div class=\"d-flex col-md-auto col-sm-auto justify-content-center\">\n @for (button of col.buttons; track button) {\n <div class=\"mx-2\">\n <app-btn\n [icon]=\"button.icon\"\n [text]=\"button.label\"\n [help]=\"button.help\"\n [showHelpIcon]=\"button.showHelpIcon\"\n [type]=\"button.type\"\n [group]=\"button.group\"\n [iconBtn]=\"!button.label\"\n mclass=\"w-auto\"\n (mclick)=\"button.action(row, i, btn)\"\n #btn></app-btn>\n </div>\n }\n </div>\n </td>\n </ng-container>\n }\n\n <!-- EDITABLE -->\n @case ('editable') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <a\n class=\"cell\"\n [mqueryParams]=\"col.mqueryParams | functionCaller2: row : col.f\"\n [mrouterLink]=\"col.routeFormatter | functionCaller2: row : col.f\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></a>\n <i (click)=\"col.action ? col.action(row, col.f) : null\" class=\"ps-1 pointer fas fa-pencil-alt\"></i>\n </td>\n </ng-container>\n }\n\n <!-- DEFAULT -->\n @default {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n @if (col.routeFormatter) {\n @if (extractRoute | functionCaller2: col : row; as cellRoute) {\n <a\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [queryParams]=\"cellRoute.queryParams\"\n routerLink=\"{{ cellRoute.route }}\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></a>\n }\n } @else {\n <span\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></span>\n }\n </td>\n </ng-container>\n }\n\n <!--// -->\n }\n }\n <!-- EXPANDABLE COLUMN-->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"_expandCol\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef aria-label=\"row actions\"> </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"d-flex justify-content-end\">\n <app-btn\n [iconBtn]=\"true\"\n type=\"clear\"\n [customIcon]=\"expandedElement !== row ? 'fa fa-chevron-down' : 'fa fa-chevron-up'\"\n aria-label=\"expand row\"\n (mclick)=\"expandedElement = expandedElement === row ? null : row; $event.stopPropagation()\"></app-btn>\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- Options Column -->\n @if (rowOptions()?.length > 0) {\n <ng-container matColumnDef=\"option\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of rowOptions(); track option) {\n <button mat-menu-item class=\"{{ option.itemClass }}\" (click)=\"option.action(row)\">\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n </td>\n </ng-container>\n }\n\n @if (rawColumns(); as dcols) {\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"dcols?.length || 1\" [ngClass]=\"{ hideBorder: row != expandedElement }\">\n <div class=\"example-element-detail\" [@detailExpand]=\"row == expandedElement ? 'expanded' : 'collapsed'\">\n <ng-container *ngTemplateOutlet=\"expandedRowTemplate(); context: { $implicit: { row } }\"></ng-container>\n </div>\n </td>\n </ng-container>\n }\n <tr mat-header-row *matHeaderRowDef=\"dcols\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: dcols\"\n [ngClass]=\"{ pointer: showRowPointer(), disabled: isDisabledFunc() ? isDisabledFunc()(row) : false }\"\n [matTooltip]=\"isDisabledFunc() && isDisabledFunc()(row) ? 'Disabled' : null\"\n (click)=\"rowClick(row)\"></tr>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell no-item\" [attr.colspan]=\"dcols?.length || 1\">\n {{ noItemTxt() | appTranslate | async }}\n </td>\n </tr>\n @if (isExpandable()) {\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"expanded-detail-row\" [style.height.px]=\"0\"></tr>\n }\n }\n </table>\n </div>\n @if (showPager()) {\n <mat-paginator\n [length]=\"resultsLength()\"\n [pageSizeOptions]=\"computedPageSizeOptions()\"\n [pageSize]=\"pageSize()\"\n showFirstLastButtons></mat-paginator>\n }\n </div>\n</div>\n", styles: [":host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail{padding:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder{border-bottom:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail{overflow:hidden;display:flex}:host ::ng-deep .table-plain .mat-cell,:host ::ng-deep .table-https .mat-cell{padding:3px 5px!important}:host ::ng-deep .table-plain .colour,:host ::ng-deep .table-https .colour{height:15px;width:15px;display:inline-block;border-radius:5px}:host ::ng-deep .table-plain .centerCells .mat-sort-header-container,:host ::ng-deep .table-plain .centerCells .mat-mdc-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-mdc-sort-header-container{justify-content:center}:host ::ng-deep .table-plain .default.colour,:host ::ng-deep .table-https .default.colour{background-color:#545454}:host ::ng-deep .table-plain .btn-cell,:host ::ng-deep .table-https .btn-cell{width:1%}:host ::ng-deep .table-plain input[type=checkbox]:not(.form-control),:host ::ng-deep .table-https input[type=checkbox]:not(.form-control){border:1px solid rgba(80,78,245,.3019607843)}:host ::ng-deep .table-plain .mat-header-cell,:host ::ng-deep .table-plain .mat-mdc-header-cell,:host ::ng-deep .table-https .mat-header-cell,:host ::ng-deep .table-https .mat-mdc-header-cell{vertical-align:middle;color:var(--primary);font-style:normal;font-weight:600;font-size:14px;text-align:center}:host ::ng-deep .table-plain .mat-table-sticky-border-elem-left,:host ::ng-deep .table-plain .mat-mdc-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-mdc-table-sticky-border-elem-left{border-right:1px solid #e0e0e0;background-color:#fff}:host ::ng-deep .table-plain .mat-mdc-table-sticky,:host ::ng-deep .table-https .mat-mdc-table-sticky{background-color:#fff!important}:host ::ng-deep .table-plain .smallerFonts td,:host ::ng-deep .table-plain .smallerFonts th,:host ::ng-deep .table-https .smallerFonts td,:host ::ng-deep .table-https .smallerFonts th{font-size:.7rem}:host ::ng-deep .table-plain .nowrap td,:host ::ng-deep .table-plain .nowrap th,:host ::ng-deep .table-https .nowrap td,:host ::ng-deep .table-https .nowrap th{white-space:nowrap;text-align:left;padding:5px}:host ::ng-deep .table-plain table tr,:host ::ng-deep .table-https table tr{position:relative}:host ::ng-deep .table-plain table tr.mat-mdc-row,:host ::ng-deep .table-plain table tr.mat-mdc-header-row,:host ::ng-deep .table-plain table tr .mat-header-row,:host ::ng-deep .table-https table tr.mat-mdc-row,:host ::ng-deep .table-https table tr.mat-mdc-header-row,:host ::ng-deep .table-https table tr .mat-header-row{height:52px}:host ::ng-deep .table-plain table tr td:hover,:host ::ng-deep .table-https table tr td:hover{color:unset!important;text-decoration:unset;cursor:unset}:host ::ng-deep .table-plain table tr.disabled:after,:host ::ng-deep .table-https table tr.disabled:after{content:\" \";display:block;background-color:#c7c7c726;width:100%;height:100%;position:absolute;top:0;left:0;z-index:11111;cursor:not-allowed}:host ::ng-deep .table-plain .centerCells td,:host ::ng-deep .table-https .centerCells td{text-align:center}:host ::ng-deep .table-plain .curvy tr,:host ::ng-deep .table-https .curvy tr{border-radius:0 10px}:host ::ng-deep .table-plain .inline-block,:host ::ng-deep .table-https .inline-block{display:inline-block}:host ::ng-deep .table-plain td.no-item,:host ::ng-deep .table-https td.no-item{border-bottom:none!important;height:50px}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: AutocompleteComponent, selector: "app-autocomplete,autocomplete", inputs: ["showRequiredTag", "validate", "options"] }, { kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "disabled", "form", "forms", "help", "iconBtn", "loading", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid"], outputs: ["mclick"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ExportTableComponent, selector: "app-export-table", inputs: ["data", "displayedColumns", "searchFunc", "searchQuery", "label", "disabled"] }, { kind: "component", type: FieldsToDisplayComponent, selector: "fields-to-display", inputs: ["fields", "currentColumns"], outputs: ["fieldsChanged"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "pipe", type: FunctionCaller1, name: "functionCaller1" }, { kind: "pipe", type: FunctionCaller2, name: "functionCaller2" }, { kind: "pipe", type: GetColFormattedPipe, name: "getColFormatted" }, { kind: "component", type: InfoIconComponent, selector: "app-info-icon", inputs: ["text", "coloured", "left", "right"] }, { kind: "component", type: InputBasicComponent, selector: "app-input-basic,app-input", inputs: ["accept", "autocomplete", "input", "contextData", "decimalPoints", "files", "hide", "hint", "labelLink", "lblCl", "light", "loading", "minLength", "maxLength", "multiple", "optionsFunc", "theme", "vms", "xsmall", "setCurrentDate", "options", "mvalue"], outputs: ["mSelectOptionChange", "mSelectedOptionLabel"] }, { kind: "directive", type: InputFormatDirective, selector: "input:not([matInput]):not([noformat])", inputs: ["value"] }, { kind: "component", type: InputNGModelComponent, selector: "app-input-ngmodel", inputs: ["mvalue", "cls", "colored", "disabled", "hide", "hint", "id", "inpCl", "label", "lblCl", "lblPosition", "mini", "light", "name", "model", "optionFormatter", "options", "checked", "contextData", "decimalPoints", "labelField", "max", "min", "placeholder", "prefix", "readonly", "required", "showEmptyOption", "showLabel", "showValidation", "showValidationIcon", "small", "stacked", "suffix", "theme", "type", "valueField", "labelType", "xsmall"], outputs: ["modelChange", "mchange"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3.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: MatMenuModule }, { kind: "component", type: i4.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: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.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: MatPaginatorModule }, { kind: "component", type: i5.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i6.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i6.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i7.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i7.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i7.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i7.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i7.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i7.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i7.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i7.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i7.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i7.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i7.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i8.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: MrouterLinkirective, selector: "[mrouterLink]", inputs: ["mrouterLink", "mrouterLinkActivatedRoute", "mqueryParams", "isPhone", "isEmail"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TablePipesModule }, { kind: "pipe", type: i10.TableToStringPipe, name: "tableToString" }, { kind: "pipe", type: ToAnyPipe, name: "toAny" }, { kind: "pipe", type: TranslatePipe, name: "appTranslate" }, { kind: "component", type: ValidationMessageComponent, selector: "app-validation-message", inputs: ["debug", "label", "hideOverflow", "minLength", "maxLength", "ignoreDirtiness", "customMessage", "control", "input"] }, { kind: "pipe", type: ValueOrXPipe, name: "valueOrX" }], animations: [
|
|
186
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.1", type: TablePlainComponent, isStandalone: true, selector: "table-plain", inputs: { customSelectClass: { classPropertyName: "customSelectClass", publicName: "customSelectClass", isSignal: true, isRequired: false, transformFunction: null }, idField: { classPropertyName: "idField", publicName: "idField", isSignal: true, isRequired: false, transformFunction: null }, obsDataSource: { classPropertyName: "obsDataSource", publicName: "obsDataSource", isSignal: true, isRequired: false, transformFunction: null }, showFilter: { classPropertyName: "showFilter", publicName: "showFilter", isSignal: true, isRequired: false, transformFunction: null }, showPager: { classPropertyName: "showPager", publicName: "showPager", isSignal: true, isRequired: false, transformFunction: null }, disableSelectionByField: { classPropertyName: "disableSelectionByField", publicName: "disableSelectionByField", isSignal: false, isRequired: false, transformFunction: null }, _data: { classPropertyName: "_data", publicName: "data", isSignal: false, isRequired: false, transformFunction: null }, _filterFields: { classPropertyName: "_filterFields", publicName: "filterFields", isSignal: false, isRequired: false, transformFunction: null }, _filterFieldsMap: { classPropertyName: "_filterFieldsMap", publicName: "filterFieldsMap", isSignal: false, isRequired: false, transformFunction: null }, selectionPerPage: { classPropertyName: "selectionPerPage", publicName: "selectionPerPage", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { _view: "view", dataChanged: "dataChanged", filterChange: "filterChange", listMutated: "listMutated" }, usesInheritance: true, ngImport: i0, template: "<div class=\"table-plain\">\n @if (header()) {\n <h6 class=\"text-primary\">\n {{ header() | appTranslate | async }}\n </h6>\n }\n\n @if (filterFields()) {\n <div class=\"d-flex\">\n <app-btn\n text=\"{{ filterCont.hidden ? 'Show Filter' : 'Hide Filter' }}\"\n [icon]=\"filterCont.hidden ? 'search' : 'close'\"\n (mclick)=\"filterCont.hidden = !filterCont.hidden\" />\n </div>\n <div class=\"row align-items-center mt-2\" [hidden]=\"true\" #filterCont>\n @for (scheme of filterFields(); track scheme) {\n <div class=\"col-md-4 col-xxl-3\">\n @switch (scheme.type) {\n @case ('autocomplete') {\n <div class=\"col\">\n <app-autocomplete\n [form]=\"filterForm\"\n [label]=\"scheme.label\"\n [labelField]=\"scheme.labelField\"\n [labelType]=\"scheme.labelType | toAny\"\n [name]=\"scheme.field | toAny\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [valueField]=\"scheme.valueField\"\n [hint]=\"scheme.hint\"\n [disabled]=\"scheme.disabledIf | functionCaller2: filterForm.value : scheme.field\"\n #inputTag\n [options]=\"scheme.options || cellOptions[scheme.field | toAny]\"\n (mchange)=\"onFilterChange(dataSource().filteredData)\"></app-autocomplete>\n <app-validation-message [input]=\"inputTag\" />\n </div>\n }\n @default {\n <app-input-basic\n #formField\n [name]=\"scheme.field | toAny\"\n [form]=\"filterForm\"\n [stacked]=\"true\"\n [type]=\"scheme.type\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [labelField]=\"scheme.labelField\"\n [noFormat]=\"true\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"scheme.disabledIf | functionCaller2: filterForm.value : scheme.field\"\n [options]=\"scheme.options || cellOptions[scheme.field | toAny]\"\n (mchange)=\"onFilterChange(dataSource().filteredData)\" />\n <app-validation-message [input]=\"formField\" />\n }\n }\n </div>\n }\n <div class=\"col-md justify-content-end d-flex\">\n <app-btn type=\"danger-outline\" text=\"Clear\" icon=\"delete\" (mclick)=\"clearFilter()\"></app-btn>\n </div>\n </div>\n }\n\n @if (startSectionTemplate() || showFilter() || showExport() || showAdditionalColumns()) {\n <div class=\" \">\n <div class=\"row g-3 justify-content-between align-items-end\">\n <div class=\"col-md\">\n @if (startSectionTemplate) {\n <ng-container [ngTemplateOutlet]=\"startSectionTemplate()\"></ng-container>\n }\n @if (showFilter()) {\n <form [formGroup]=\"filterForm\">\n <div class=\"row justify-content-center align-items-end\">\n <div class=\"col-md-auto\">\n <app-autocomplete\n label=\"Filter\"\n type=\"select\"\n [form]=\"filterForm\"\n name=\"field\"\n [stacked]=\"false\"\n [options]=\"filterOptions()\"\n valueField=\"code\"\n labelField=\"description\"></app-autocomplete>\n </div>\n <div class=\"col-md-auto\">\n <app-input-basic label=\"Value\" type=\"text\" [form]=\"filterForm\" name=\"value\" [stacked]=\"false\"></app-input-basic>\n </div>\n <div class=\"col-md-auto\">\n <app-btn text=\"Clear\" type=\"secondary\" (mclick)=\"clearFilter()\"></app-btn>\n </div>\n </div>\n </form>\n }\n </div>\n @if (showExport() || showAdditionalColumns()) {\n <div class=\"col-md-auto\">\n <div class=\"row row-cols-auto g-3 justify-content-end\">\n <span>\n @if (showExport()) {\n <app-export-table\n [disabled]=\"!dataSource()?.data?.length\"\n [label]=\"label()\"\n [displayedColumns]=\"computedDisplayedColumns()\"\n [data]=\"dataSource()?.data\" />\n }\n </span>\n @if (showAdditionalColumns()) {\n <div class=\"d-flex\">\n <fields-to-display\n [fields]=\"allTableColumns()\"\n [currentColumns]=\"computedDisplayedColumns()\"\n (fieldsChanged)=\"fieldsChanged($event)\" />\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <div [ngClass]=\"{ border: distinct() }\" class=\"mt-2 rounded-10 overflow-auto table-container {{ tableContainerClass() }} \">\n <div class=\"table-responsive\">\n <table\n mat-table\n [dataSource]=\"dataSource() || obsDataSource()\"\n matSort\n class=\"w-100 d-table table mb-0\"\n [multiTemplateDataRows]=\"isExpandable\"\n #table\n [ngClass]=\"{ smallerFonts, nowrap, centerCells, curvy, 'table-striped': striped }\">\n <!-- Checkbox Column -->\n <ng-container matColumnDef=\"mselect\" [sticky]=\"!placeSelectionAtRight\" [stickyEnd]=\"placeSelectionAtRight\">\n <th mat-header-cell *matHeaderCellDef>\n @if (customSelectClass) {\n <input\n type=\"checkbox\"\n [class]=\"customSelectClass\"\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [attr.aria-label]=\"checkboxLabel()\" />\n }\n @if (!customSelectClass) {\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [aria-label]=\"checkboxLabel()\"></mat-checkbox>\n }\n </th>\n <td mat-cell *matCellDef=\"let row\">\n @if (customSelectClass) {\n <input\n type=\"checkbox\"\n class=\"form-control control-bg-gray\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [attr.aria-label]=\"checkboxLabel(row)\" />\n }\n @if (!customSelectClass) {\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [aria-label]=\"checkboxLabel(row)\"\n [disabled]=\"this.disableSelectionByField | functionCaller1: row\"></mat-checkbox>\n }\n </td>\n </ng-container>\n <!-- Columns -->\n @for (col of computedDisplayedColumns(); track col; let i = $index) {\n @switch (col.type) {\n <!-- CHECKBOX -->\n @case ('textarea') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- <app-input-td-rf [(model)]=\"col.\" [showLabel]=\"false\" /> -->\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- CHECKBOX -->\n @case ('checkbox') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- Removing the empty space above checkboxes -->\n <app-input-ngmodel\n [showLabel]=\"false\"\n [stacked]=\"true\"\n type=\"checkbox\"\n [disabled]=\"col.disabled\"\n [checked]=\"col.checked\"\n [(model)]=\"row[col.f]\"\n (mchange)=\"outputCheckbox(col.f, row, $event)\"></app-input-ngmodel>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Input -->\n @case ('input') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- Removing the empty space above checkboxes -->\n <app-input-basic\n [showLabel]=\"false\"\n [stacked]=\"true\"\n type=\"text\"\n [disabled]=\"col.disabled\"\n [form]=\"row\"\n [name]=\"col.f\"\n [noFormat]=\"true\"></app-input-basic>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- PROGRESS BAR -->\n @case ('progress') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"progress\">\n <div class=\"progress-bar progress-bar-striped bg-success\" role=\"progressbar\" [ngStyle]=\"{ width: row[col.f] }\">\n {{ row[col.f] }}\n </div>\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- COLOR -->\n @case ('color') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"square-2\" [style]=\"'background-color:' + row[col.f]\"></div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Button -->\n @case ('button') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index\" class=\"btn-cell\">\n <app-btn\n [icon]=\"col.icon || col.btn?.icon\"\n [type]=\"col.btn?.type\"\n (mclick)=\"col.action ? col.action(row, col.f, getActionStatusCallback(col), index) : null\"\n [help]=\"col.btn?.help\"\n [showHelpIcon]=\"col.btn?.showHelpIcon\"\n [text]=\"col.btn?.label\"\n [loading]=\"col.btn?.loading\"\n [iconBtn]=\"col.btn?.iconBtn\"\n mclass=\"w-auto\"\n [disabled]=\"col.btn?.disabled || col.btn?.loading\"></app-btn>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Sub Table -->\n @case ('table') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell class=\"text-center\" *matCellDef=\"let row\">\n <div class=\"inline-block\">\n <app-btn\n [icon]=\"col.icon\"\n [type]=\"col.btn?.type || 'dark'\"\n (mclick)=\"col.action ? col.action(row, col.f) : null\"\n [group]=\"col.btn?.group\"\n [help]=\"col.subTable | tableToString: row | async\"\n [showHelpIcon]=\"false\"\n [text]=\"col.btn?.label\"\n [iconBtn]=\"true\"\n mclass=\"w-auto\"></app-btn>\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- ACTION COLUMNS -->\n @case ('btns') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"btn-cell text-center\">\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\" class=\"btn-cell\">\n <div class=\"d-flex col-md-auto col-sm-auto justify-content-center\">\n @for (button of col.buttons; track button) {\n <div class=\"mx-2\">\n <app-btn\n [icon]=\"button.icon\"\n [text]=\"button.label\"\n [help]=\"button.help\"\n [showHelpIcon]=\"button.showHelpIcon\"\n [type]=\"button.type\"\n [group]=\"button.group\"\n [iconBtn]=\"!button.label\"\n mclass=\"w-auto\"\n (mclick)=\"button.action(row, i, btn)\"\n #btn></app-btn>\n </div>\n }\n </div>\n </td>\n </ng-container>\n }\n\n <!-- EDITABLE -->\n @case ('editable') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <a\n class=\"cell\"\n [mqueryParams]=\"col.mqueryParams | functionCaller2: row : col.f\"\n [mrouterLink]=\"col.routeFormatter | functionCaller2: row : col.f\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></a>\n <i (click)=\"col.action ? col.action(row, col.f) : null\" class=\"ps-1 pointer fas fa-pencil-alt\"></i>\n </td>\n </ng-container>\n }\n\n <!-- DEFAULT -->\n @default {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n @if (col.routeFormatter) {\n @if (extractRoute | functionCaller2: col : row; as cellRoute) {\n <a\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [queryParams]=\"cellRoute.queryParams\"\n routerLink=\"{{ cellRoute.route }}\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></a>\n }\n } @else {\n <span\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></span>\n }\n </td>\n </ng-container>\n }\n\n <!--// -->\n }\n }\n <!-- EXPANDABLE COLUMN-->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"_expandCol\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef aria-label=\"row actions\"> </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"d-flex justify-content-end\">\n <app-btn\n [iconBtn]=\"true\"\n type=\"clear\"\n [customIcon]=\"expandedElement !== row ? 'fa fa-chevron-down' : 'fa fa-chevron-up'\"\n aria-label=\"expand row\"\n (mclick)=\"expandedElement = expandedElement === row ? null : row; $event.stopPropagation()\"></app-btn>\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- Options Column -->\n @if (rowOptions()?.length > 0) {\n <ng-container matColumnDef=\"option\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of rowOptions(); track option) {\n <button mat-menu-item class=\"{{ option.itemClass }}\" (click)=\"option.action(row)\">\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n </td>\n </ng-container>\n }\n\n @if (rawColumns(); as dcols) {\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"dcols?.length || 1\" [ngClass]=\"{ hideBorder: row != expandedElement }\">\n <div class=\"example-element-detail\" [@detailExpand]=\"row == expandedElement ? 'expanded' : 'collapsed'\">\n <ng-container *ngTemplateOutlet=\"expandedRowTemplate(); context: { $implicit: { row } }\"></ng-container>\n </div>\n </td>\n </ng-container>\n }\n <tr mat-header-row *matHeaderRowDef=\"dcols\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: dcols\"\n [ngClass]=\"{ pointer: showRowPointer(), disabled: isDisabledFunc() ? isDisabledFunc()(row) : false }\"\n [matTooltip]=\"isDisabledFunc() && isDisabledFunc()(row) ? 'Disabled' : null\"\n (click)=\"rowClick(row)\"></tr>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell no-item\" [attr.colspan]=\"dcols?.length || 1\">\n {{ noItemTxt() | appTranslate | async }}\n </td>\n </tr>\n @if (isExpandable()) {\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"expanded-detail-row\" [style.height.px]=\"0\"></tr>\n }\n }\n </table>\n </div>\n @if (showPager()) {\n <mat-paginator\n [length]=\"resultsLength()\"\n [pageSizeOptions]=\"computedPageSizeOptions()\"\n [pageSize]=\"pageSize()\"\n showFirstLastButtons></mat-paginator>\n }\n </div>\n</div>\n", styles: [":host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail{padding:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder{border-bottom:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail{overflow:hidden;display:flex}:host ::ng-deep .table-plain .mat-cell,:host ::ng-deep .table-https .mat-cell{padding:3px 5px!important}:host ::ng-deep .table-plain .colour,:host ::ng-deep .table-https .colour{height:15px;width:15px;display:inline-block;border-radius:5px}:host ::ng-deep .table-plain .centerCells .mat-sort-header-container,:host ::ng-deep .table-plain .centerCells .mat-mdc-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-mdc-sort-header-container{justify-content:center}:host ::ng-deep .table-plain .default.colour,:host ::ng-deep .table-https .default.colour{background-color:#545454}:host ::ng-deep .table-plain .btn-cell,:host ::ng-deep .table-https .btn-cell{width:1%}:host ::ng-deep .table-plain input[type=checkbox]:not(.form-control),:host ::ng-deep .table-https input[type=checkbox]:not(.form-control){border:1px solid rgba(80,78,245,.3019607843)}:host ::ng-deep .table-plain .mat-header-cell,:host ::ng-deep .table-plain .mat-mdc-header-cell,:host ::ng-deep .table-https .mat-header-cell,:host ::ng-deep .table-https .mat-mdc-header-cell{vertical-align:middle;color:var(--primary);font-style:normal;font-weight:600;font-size:14px;text-align:center}:host ::ng-deep .table-plain .mat-table-sticky-border-elem-left,:host ::ng-deep .table-plain .mat-mdc-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-mdc-table-sticky-border-elem-left{border-right:1px solid #e0e0e0;background-color:#fff}:host ::ng-deep .table-plain .mat-mdc-table-sticky,:host ::ng-deep .table-https .mat-mdc-table-sticky{background-color:#fff!important}:host ::ng-deep .table-plain .smallerFonts td,:host ::ng-deep .table-plain .smallerFonts th,:host ::ng-deep .table-https .smallerFonts td,:host ::ng-deep .table-https .smallerFonts th{font-size:.7rem}:host ::ng-deep .table-plain .nowrap td,:host ::ng-deep .table-plain .nowrap th,:host ::ng-deep .table-https .nowrap td,:host ::ng-deep .table-https .nowrap th{white-space:nowrap;text-align:left;padding:5px}:host ::ng-deep .table-plain table tr,:host ::ng-deep .table-https table tr{position:relative}:host ::ng-deep .table-plain table tr.mat-mdc-row,:host ::ng-deep .table-plain table tr.mat-mdc-header-row,:host ::ng-deep .table-plain table tr .mat-header-row,:host ::ng-deep .table-https table tr.mat-mdc-row,:host ::ng-deep .table-https table tr.mat-mdc-header-row,:host ::ng-deep .table-https table tr .mat-header-row{height:52px}:host ::ng-deep .table-plain table tr td:hover,:host ::ng-deep .table-https table tr td:hover{color:unset!important;text-decoration:unset;cursor:unset}:host ::ng-deep .table-plain table tr.disabled:after,:host ::ng-deep .table-https table tr.disabled:after{content:\" \";display:block;background-color:#c7c7c726;width:100%;height:100%;position:absolute;top:0;left:0;z-index:11111;cursor:not-allowed}:host ::ng-deep .table-plain .centerCells td,:host ::ng-deep .table-https .centerCells td{text-align:center}:host ::ng-deep .table-plain .curvy tr,:host ::ng-deep .table-https .curvy tr{border-radius:0 10px}:host ::ng-deep .table-plain .inline-block,:host ::ng-deep .table-https .inline-block{display:inline-block}:host ::ng-deep .table-plain td.no-item,:host ::ng-deep .table-https td.no-item{border-bottom:none!important;height:50px}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: AutocompleteComponent, selector: "app-autocomplete,autocomplete", inputs: ["showRequiredTag", "validate", "options"] }, { kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "disabled", "form", "forms", "help", "iconBtn", "loading", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid"], outputs: ["mclick"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ExportTableComponent, selector: "app-export-table", inputs: ["data", "displayedColumns", "searchFunc", "searchQuery", "label", "disabled"] }, { kind: "component", type: FieldsToDisplayComponent, selector: "fields-to-display", inputs: ["fields", "currentColumns"], outputs: ["fieldsChanged"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "pipe", type: FunctionCaller1, name: "functionCaller1" }, { kind: "pipe", type: FunctionCaller2, name: "functionCaller2" }, { kind: "pipe", type: GetColFormattedPipe, name: "getColFormatted" }, { kind: "component", type: InfoIconComponent, selector: "app-info-icon", inputs: ["text", "coloured", "left", "right"] }, { kind: "component", type: InputBasicComponent, selector: "app-input-basic,app-input", inputs: ["accept", "autocomplete", "input", "contextData", "decimalPoints", "files", "hide", "hint", "labelLink", "lblCl", "light", "loading", "multiple", "optionsFunc", "theme", "vms", "xsmall", "setCurrentDate", "options", "mvalue"], outputs: ["mSelectOptionChange", "mSelectedOptionLabel"] }, { kind: "directive", type: InputFormatDirective, selector: "input:not([matInput]):not([noformat])", inputs: ["value"] }, { kind: "component", type: InputNGModelComponent, selector: "app-input-ngmodel", inputs: ["mvalue", "cls", "colored", "disabled", "hide", "hint", "id", "inpCl", "label", "lblCl", "lblPosition", "mini", "light", "name", "model", "optionFormatter", "options", "checked", "contextData", "decimalPoints", "labelField", "max", "min", "placeholder", "prefix", "readonly", "required", "showEmptyOption", "showLabel", "showValidation", "showValidationIcon", "small", "stacked", "suffix", "theme", "type", "valueField", "labelType", "xsmall"], outputs: ["modelChange", "mchange"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3.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: MatMenuModule }, { kind: "component", type: i4.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: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.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: MatPaginatorModule }, { kind: "component", type: i5.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i6.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i6.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i7.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i7.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i7.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i7.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i7.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i7.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i7.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i7.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i7.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i7.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i7.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i8.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: MrouterLinkirective, selector: "[mrouterLink]", inputs: ["mrouterLink", "mrouterLinkActivatedRoute", "mqueryParams", "isPhone", "isEmail"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TablePipesModule }, { kind: "pipe", type: i10.TableToStringPipe, name: "tableToString" }, { kind: "pipe", type: ToAnyPipe, name: "toAny" }, { kind: "pipe", type: TranslatePipe, name: "appTranslate" }, { kind: "component", type: ValidationMessageComponent, selector: "app-validation-message", inputs: ["debug", "label", "hideOverflow", "minLength", "maxLength", "ignoreDirtiness", "customMessage", "control", "input"] }, { kind: "pipe", type: ValueOrXPipe, name: "valueOrX" }], animations: [
|
|
187
187
|
trigger('detailExpand', [
|
|
188
188
|
state('collapsed', style({ height: '0px', minHeight: '0' })),
|
|
189
189
|
state('expanded', style({ height: '*' })),
|
|
@@ -255,4 +255,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImpor
|
|
|
255
255
|
}], selectionPerPage: [{
|
|
256
256
|
type: Input
|
|
257
257
|
}] } });
|
|
258
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtcGxhaW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXRzLWZlLW5nLXNkay9zcmMvbGliL1NoYXJlZC9jb21wb25lbnRzL3RhYmxlLXBsYWluL3RhYmxlLXBsYWluLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V0cy1mZS1uZy1zZGsvc3JjL2xpYi9TaGFyZWQvY29tcG9uZW50cy90YWJsZS1wbGFpbi90YWJsZS1wbGFpbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUtOLFFBQVEsRUFDUixNQUFNLEVBRU4sS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBQzNHLE9BQU8sRUFBZ0Msa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRixPQUFPLEVBQVcsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUF3QixrQkFBa0IsSUFBSSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6SCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBYyxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHdkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FB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QyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztZQUNwSCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDM0ksSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7WUFDckMsT0FBTztTQUNSO1FBRUQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDekIsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO1lBQ3BILElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUMzSSxJQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FB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QUFDLE1BQU07Z0JBQ0osV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBc0VZLEtBQUs7c0JBQXZCLEtBQUs7dUJBQUMsTUFBTTtnQkFJYyxhQUFhO3NCQUF2QyxLQUFLO3VCQUFDLGNBQWM7Z0JBS1MsZ0JBQWdCO3NCQUE3QyxLQUFLO3VCQUFDLGlCQUFpQjtnQkFLZixnQkFBZ0I7c0JBQXhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25DaGFuZ2UsIFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpZ25hbCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgV3JpdGFibGVTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IgYXMgTWF0UGFnaW5hdG9yLCBNYXRQYWdpbmF0b3JNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgTWF0U29ydCwgTWF0U29ydE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgTWF0VGFibGUgYXMgTWF0VGFibGUsIE1hdFRhYmxlRGF0YVNvdXJjZSBhcyBNYXRUYWJsZURhdGFTb3VyY2UsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSUZvcm1PcHRpb25zLCBJRm9ybVNjaGVtYSB9IGZyb20gJy4uLy4uL21vZGVscy9mb3JtLXNjaGVtYS5tb2RlbCc7XG5pbXBvcnQgeyBJQ29kZURlc2NyaXB0aW9uLCBJT2JqZWN0TGl0ZXJhbCwgSVJvd09wdGlvbiwgSVN0cmljdEZvcm1Hcm91cCwgU29ydFR5cGUsIFRhYmxlQ29sIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2luZGV4Lm1vZGVsJztcbmltcG9ydCB7IEZ1bmN0aW9uQ2FsbGVyMSwgRnVuY3Rpb25DYWxsZXIyLCBUb0FueVBpcGUsIFZhbHVlT3JYUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL3V0aWxpdHkucGlwZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvdHJhbnNsYXRlLnBpcGUnO1xuaW1wb3J0IHsgR2V0Q29sRm9ybWF0dGVkUGlwZSwgR2V0UmF3RmllbGRzUGlwZSwgVGFibGVQaXBlc01vZHVsZSwgVGFibGVUb1N0cmluZ1BpcGUgfSBmcm9tICcuL3RhYmxlLnBpcGUnO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgTXJvdXRlckxpbmtpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvaW5kZXguZGlyZWN0aXZlJztcbmltcG9ydCB7IElucHV0TkdNb2RlbENvbXBvbmVudCB9IGZyb20gJy4uL2lucHV0LU5nTW9kZWwvaW5wdXQtbmdtb2RlbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW5mb0ljb25Db21wb25lbnQgfSBmcm9tICcuLi9pbmZvLWljb24vaW5mby1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcbmltcG9ydCB7IElucHV0Rm9ybWF0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9pbnB1dC1mb3JtYXR0ZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZpZWxkc1RvRGlzcGxheUNvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkcy10by1kaXNwbGF5L2ZpZWxkcy10by1kaXNwbGF5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFeHBvcnRUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uL2V4cG9ydC10YWJsZS9leHBvcnQtdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IEJ0bkNvbXBvbmVudCB9IGZyb20gJy4uL2J0bi9idG4uY29tcG9uZW50JztcbmltcG9ydCB7IElucHV0QmFzaWNDb21wb25lbnQgfSBmcm9tICcuLi9pbnB1dC9pbnB1dC1iYXNpYy5jb21wb25lbnQnO1xuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VDb21wb25lbnQgfSBmcm9tICcuLi9pbnB1dC92YWxpZGF0aW9uLW1lc3NhZ2UvdmFsaWRhdGlvbi1tZXNzYWdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBdXRvY29tcGxldGVDb21wb25lbnQgfSBmcm9tICcuLi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgdHJpZ2dlciwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCBhbmltYXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBVdGlsaXR5U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL1NlcnZpY2VzL3V0aWxpdHkuc2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZVNlcnZpY2UgfSBmcm9tICcuL3RhYmxlLXBsYWluLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGVCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi90YWJsZS1iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtR2VuZXJhdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS1nZW5lcmF0b3IvZm9ybS1nZW5lcmF0b3IuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFibGUtcGxhaW4nLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUtcGxhaW4uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS1wbGFpbi5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcignZGV0YWlsRXhwYW5kJywgW1xuICAgICAgc3RhdGUoJ2NvbGxhcHNlZCcsIHN0eWxlKHsgaGVpZ2h0OiAnMHB4JywgbWluSGVpZ2h0OiAnMCcgfSkpLFxuICAgICAgc3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxuICAgIF0pLFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgQXN5bmNQaXBlLFxuICAgIEF1dG9jb21wbGV0ZUNvbXBvbmVudCxcbiAgICBCdG5Db21wb25lbnQsXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEV4cG9ydFRhYmxlQ29tcG9uZW50LFxuICAgIEZpZWxkc1RvRGlzcGxheUNvbXBvbmVudCxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBGdW5jdGlvbkNhbGxlcjEsXG4gICAgRnVuY3Rpb25DYWxsZXIyLFxuICAgIEdldENvbEZvcm1hdHRlZFBpcGUsXG4gICAgR2V0UmF3RmllbGRzUGlwZSxcbiAgICBJbmZvSWNvbkNvbXBvbmVudCxcbiAgICBJbnB1dEJhc2ljQ29tcG9uZW50LFxuICAgIElucHV0Rm9ybWF0RGlyZWN0aXZlLFxuICAgIEZvcm1HZW5lcmF0b3JDb21wb25lbnQsXG4gICAgSW5wdXROR01vZGVsQ29tcG9uZW50LFxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgTWF0UGFnaW5hdG9yTW9kdWxlLFxuICAgIE1hdFNvcnRNb2R1bGUsXG4gICAgTWF0VGFibGVNb2R1bGUsXG4gICAgUm91dGVyTW9kdWxlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgTXJvdXRlckxpbmtpcmVjdGl2ZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFRhYmxlUGlwZXNNb2R1bGUsXG4gICAgVGFibGVUb1N0cmluZ1BpcGUsXG4gICAgVG9BbnlQaXBlLFxuICAgIFRyYW5zbGF0ZVBpcGUsXG4gICAgVmFsaWRhdGlvbk1lc3NhZ2VDb21wb25lbnQsXG4gICAgVmFsdWVPclhQaXBlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZVBsYWluQ29tcG9uZW50PFRJdGVtID0gYW55PiBleHRlbmRzIFRhYmxlQmFzZUNvbXBvbmVudDxUSXRlbT4gaW1wbGVtZW50cyBPbkluaXQge1xuICBvdmVycmlkZSBkYXRhID0gc2lnbmFsPFRJdGVtW10+KG51bGwpO1xuICBjdXN0b21TZWxlY3RDbGFzcyA9IGlucHV0PHN0cmluZz4oKTsgLy8gY3VzdG9tIGNsYXNzIGZvciByb3cgc2VsZWN0aW9uIGNoZWNrYm94ZXNcbiAgaWRGaWVsZCA9IGlucHV0PHN0cmluZz4oJ2lkJyk7XG4gIG9ic0RhdGFTb3VyY2UgPSBpbnB1dDxPYnNlcnZhYmxlPFRJdGVtW10+PihudWxsKTtcbiAgc2hvd0ZpbHRlciA9IGlucHV0KGZhbHNlKTtcbiAgc2hvd1BhZ2VyID0gaW5wdXQoZmFsc2UpO1xuICBASW5wdXQoKSBkaXNhYmxlU2VsZWN0aW9uQnlGaWVsZDogKHg6IGFueSkgPT4gYm9vbGVhbiA9ICh4KSA9PiBmYWxzZTtcblxuICBAT3V0cHV0KCd2aWV3JykgX3ZpZXcgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGRhdGFDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZmlsdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBsaXN0TXV0YXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VEl0ZW1bXT4oKTtcblxuICBvdmVycmlkZSByZXN1bHRzTGVuZ3RoID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB0aGlzLmRhdGEoKT8ubGVuZ3RoKTtcblxuICBjZWxsT3B0aW9uczogSUZvcm1PcHRpb25zID0ge307XG4gIGRhdGFTb3VyY2UgPSBjb21wdXRlZDxNYXRUYWJsZURhdGFTb3VyY2U8VEl0ZW0+PigoKSA9PiB7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy5kYXRhKCkgfHwgW10pLFxuICAgICAgZmlsdGVyRm9ybVZhbHVlID0gdGhpcy5maWx0ZXJGb3JtU2lnbmFsKCksXG4gICAgICBuZ0FmdGVyVmlld0luaXRTaWduYWwgPSB0aGlzLm5nQWZ0ZXJWaWV3SW5pdFNpZ25hbCgpLFxuICAgICAgZmlsdGVyRmllbGRzID0gdGhpcy5maWx0ZXJGaWVsZHMoKTtcbiAgICBkYXRhU291cmNlLnNvcnQgPSB0aGlzLnNvcnQ7XG4gICAgaWYgKHRoaXMub3JkZXJGaWVsZCgpICYmIHRoaXMub3JkZXJEaXJlY3Rpb24oKSAmJiBkYXRhU291cmNlLnNvcnQpIHtcbiAgICAgIGRhdGFTb3VyY2Uuc29ydC5hY3RpdmUgPSB0aGlzLm9yZGVyRmllbGQoKS50b1N0cmluZygpO1xuICAgICAgZGF0YVNvdXJjZS5zb3J0LmRpcmVjdGlvbiA9IHRoaXMub3JkZXJEaXJlY3Rpb24oKTtcbiAgICAgIGRhdGFTb3VyY2Uuc29ydC5zb3J0Q2hhbmdlLmVtaXQoe1xuICAgICAgICBhY3RpdmU6IHRoaXMub3JkZXJGaWVsZD8udG9TdHJpbmcoKSxcbiAgICAgICAgZGlyZWN0aW9uOiB0aGlzLm9yZGVyRGlyZWN0aW9uKCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd1BhZ2VyKCkpIHtcbiAgICAgIGRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dGaWx0ZXIoKSkge1xuICAgICAgdGhpcy5kZWZhdWx0RmlsdGVyUHJlZGljYXRlID0gdGhpcy5kZWZhdWx0RmlsdGVyUHJlZGljYXRlIHx8IGRhdGFTb3VyY2UuZmlsdGVyUHJlZGljYXRlLmNsb25lKCk7XG4gICAgICBkYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZSA9IChyb3c6IGFueSwgZmlsdGVyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlci5maWVsZCkge1xuICAgICAgICAgIHJldHVybiAocm93W2ZpbHRlci5maWVsZF0/LnRvTG93ZXJDYXNlKCk/LnRyaW0oKSB8fCAnJyk/LmluY2x1ZGVzKGZpbHRlci52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEZpbHRlclByZWRpY2F0ZShyb3csIGZpbHRlci52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChmaWx0ZXJGaWVsZHMpIHtcbiAgICAgIHRoaXMuZGVmYXVsdEZpbHRlclByZWRpY2F0ZSA9IHRoaXMuZGVmYXVsdEZpbHRlclByZWRpY2F0ZSB8fCBkYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZS5jbG9uZSgpO1xuICAgICAgZGF0YVNvdXJjZS5maWx0ZXJQcmVkaWNhdGUgPSAocm93OiBhbnksIGZpbHRlcjogYW55KSA9PiB7XG4gICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKGZpbHRlcikuc29tZSgoa2V5KSA9PiBmaWx0ZXJba2V5XSkpIHJldHVybiB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmaWx0ZXIpIHtcbiAgICAgICAgICAvLyBjb25zdCBpdDEgPSBmaWx0ZXJba2V5XT8udG9Mb3dlckNhc2UoKTsgO1xuICAgICAgICAgIC8vIGNvbnN0IGl0MiA9IHJvd1trZXldPy50b1N0cmluZygpPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIC8vIGNvbnN0IGl0MyA9IHJvd1trZXldPy50b1N0cmluZygpPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgICAgIC8vIGNvbnN0IGl0NCA9IChyb3dba2V5XT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSB8fCAnJyk/LmluY2x1ZGVzKFxuICAgICAgICAgIC8vICAgZmlsdGVyW2tleV0/LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGNvbnNvbGUubG9nKHJvdyk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZmlsdGVyW2tleV0/LnRvU3RyaW5nKCk/LnRvTG93ZXJDYXNlKCkgJiZcbiAgICAgICAgICAgIChyb3dba2V5XT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSB8fCAnJyk/LmluY2x1ZGVzKGZpbHRlcltrZXldPy50b1N0cmluZygpPy50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGZpbHRlckZvcm1WYWx1ZSkgZGF0YVNvdXJjZS5maWx0ZXIgPSBmaWx0ZXJGb3JtVmFsdWUgYXMgYW55O1xuICAgIHJldHVybiBkYXRhU291cmNlO1xuICB9KTtcbiAgZGVmYXVsdEZpbHRlclByZWRpY2F0ZTogYW55O1xuXG4gIGZpbHRlckZpZWxkcyA9IHNpZ25hbDxJRm9ybVNjaGVtYVtdPihudWxsKTtcbiAgZmlsdGVyT3B0aW9ucyA9IGNvbXB1dGVkPElDb2RlRGVzY3JpcHRpb25bXT4oXG4gICAgKCkgPT5cbiAgICAgIHRoaXMuY29tcHV0ZWREaXNwbGF5ZWRDb2x1bW5zKCk/Lm1hcCgoeCkgPT4gKHtcbiAgICAgICAgY29kZTogeC5mIGFzIHN0cmluZyxcbiAgICAgICAgZGVzY3JpcHRpb246IHgudCxcbiAgICAgIH0pKSxcbiAgKTtcbiAgZmlsdGVyRm9ybSA9IG5ldyBGb3JtR3JvdXAoeyBmaWVsZDogbmV3IEZvcm1Db250cm9sKCksIHZhbHVlOiBuZXcgRm9ybUNvbnRyb2woKSB9KTtcblxuICBASW5wdXQoJ2RhdGEnKSBzZXQgX2RhdGEodjogVEl0ZW1bXSkge1xuICAgIHRoaXMuZGF0YS5zZXQodik7XG4gIH1cblxuICBASW5wdXQoJ2ZpbHRlckZpZWxkcycpIHNldCBfZmlsdGVyRmllbGRzKHY6IElGb3JtU2NoZW1hW10pIHtcbiAgICB0aGlzLnVTLmFkZEZvcm1TY2hlbWFUb0Zvcm0odiwgdGhpcy5maWx0ZXJGb3JtKTtcbiAgICB0aGlzLmZpbHRlckZpZWxkcy5zZXQodik7XG4gICAgZm9yIChjb25zdCBzY2hlbWUgb2Ygdikgc2NoZW1lLm9wdGlvbnNJbml0RnVuYz8uc3Vic2NyaWJlKChyKSA9PiAodGhpcy5jZWxsT3B0aW9uc1tzY2hlbWUuZmllbGQ/LnRvU3RyaW5nKCldID0gcikpO1xuICB9XG4gIEBJbnB1dCgnZmlsdGVyRmllbGRzTWFwJykgc2V0IF9maWx0ZXJGaWVsZHNNYXAodjogeyBbeDogc3RyaW5nXTogSUZvcm1TY2hlbWEgfSkge1xuICAgIHRoaXMuX2ZpbHRlckZpZWxkcyA9IE9iamVjdC52YWx1ZXModik7XG4gIH1cblxuICAvKiogU2VsZWN0cyBhbGwgcm93cyBpbiB0aGUgY3VycmVudCBwYWdlIG9mIHRoZSB0YWJsZSBpZiB0cnVlICovXG4gIEBJbnB1dCgpIHNlbGVjdGlvblBlclBhZ2U6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGZpbHRlckZvcm1TaWduYWwgPSB0b1NpZ25hbChcbiAgICB0aGlzLmZpbHRlckZvcm0udmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICBtYXAoKHI6IHsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgIC8vIGRlYnVnZ2VyXG4gICAgICAgIGNvbnNvbGUubG9nKHIpO1xuICAgICAgICBpZiAoIXRoaXMuZmlsdGVyRmllbGRzKSByLnZhbHVlID0gci52YWx1ZT8udG9Mb3dlckNhc2UoKT8udHJpbSgpIHx8ICcnO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0pLFxuICAgICksXG4gICk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coYHRhYmxlIGRhdGFgLCB0aGlzLmRhdGEoKSk7XG5cbiAgICAgIHRoaXMuZGF0YUNoYW5nZWQuZW1pdCh0aGlzLmRhdGEoKSk7XG4gICAgICB0aGlzLnNlbGVjdGlvbj8uY2xlYXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkgeyBcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm5nQWZ0ZXJWaWV3SW5pdFNpZ25hbC5zZXQoY2xvbmVEZWVwKE1hdGgucmFuZG9tKCkpKTtcbiAgfVxuXG4gIGNsZWFyRmlsdGVyKCkge1xuICAgIHRoaXMuZmlsdGVyRm9ybS5yZXNldCgpO1xuICB9XG4gIG92ZXJyaWRlIG91dHB1dENoZWNrYm94KGZpZWxkOiBrZXlvZiBUSXRlbSwgaXRlbTogVEl0ZW0sIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCByZXQgPSBzdXBlci5vdXRwdXRDaGVja2JveChmaWVsZCwgaXRlbSwgdmFsdWUpO1xuICAgIHRoaXMubGlzdE11dGF0ZWQuZW1pdCh0aGlzLmRhdGEoKSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKiBTZWxlY3RzIGFsbCByb3dzIGlmIHRoZXkgYXJlIG5vdCBhbGwgc2VsZWN0ZWQ7IG90aGVyd2lzZSBjbGVhciBzZWxlY3Rpb24uICovXG4gIG1hc3RlclRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBsYXN0U2VsZWN0aW9uID0gdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA/IHRoaXMuc2VsZWN0ZWRJdGVtc1t0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoIC0gMV0gOiBudWxsO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSB0aGlzLmRhdGFTb3VyY2UoKTtcbiAgICBsZXQgc2VsZWN0ZWRJbmRleCA9IGxhc3RTZWxlY3Rpb24gPyBkYXRhU291cmNlLmRhdGEuZmluZEluZGV4KChyKSA9PiByID09IGxhc3RTZWxlY3Rpb24pIDogLTE7XG4gICAgbGV0IGVuZCA9IHRoaXMucGFnaW5hdG9yLmhhc05leHRQYWdlKCkgPyAoZGF0YVNvdXJjZS5wYWdpbmF0b3IucGFnZUluZGV4ICsgMSkgKiBkYXRhU291cmNlLnBhZ2luYXRvci5wYWdlU2l6ZSA6IGRhdGFTb3VyY2UuZGF0YS5sZW5ndGg7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggJiYgc2VsZWN0ZWRJbmRleCAhPSAtMSAmJiBzZWxlY3RlZEluZGV4ICsgMSA9PSBlbmQpIHtcbiAgICAgIGxldCBzdGFydCA9IGRhdGFTb3VyY2UucGFnaW5hdG9yLnBhZ2VJbmRleCA8IDEgPyAwIDogZGF0YVNvdXJjZS5wYWdpbmF0b3IucGFnZUluZGV4ICogZGF0YVNvdXJjZS5wYWdpbmF0b3IucGFnZVNpemU7XG4gICAgICBsZXQgZW5kID0gdGhpcy5wYWdpbmF0b3IuaGFzTmV4dFBhZ2UoKSA/IChkYXRhU291cmNlLnBhZ2luYXRvci5wYWdlSW5kZXggKyAxKSAqIGRhdGFTb3VyY2UucGFnaW5hdG9yLnBhZ2VTaXplIDogZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCArIDE7XG4gICAgICBsZXQgcGFnZURhdGEgPSBkYXRhU291cmNlLmRhdGEuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5kZXNlbGVjdCguLi5wYWdlRGF0YSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uUGVyUGFnZSkge1xuICAgICAgbGV0IHN0YXJ0ID0gZGF0YVNvdXJjZS5wYWdpbmF0b3IucGFnZUluZGV4IDwgMSA/IDAgOiBkYXRhU291cmNlLnBhZ2luYXRvci5wYWdlSW5kZXggKiBkYXRhU291cmNlLnBhZ2luYXRvci5wYWdlU2l6ZTtcbiAgICAgIGxldCBlbmQgPSB0aGlzLnBhZ2luYXRvci5oYXNOZXh0UGFnZSgpID8gKGRhdGFTb3VyY2UucGFnaW5hdG9yLnBhZ2VJbmRleCArIDEpICogZGF0YVNvdXJjZS5wYWdpbmF0b3IucGFnZVNpemUgOiBkYXRhU291cmNlLmRhdGEubGVuZ3RoICsgMTtcbiAgICAgIGxldCBwYWdlRGF0YSA9IGRhdGFTb3VyY2UuZGF0YS5zbGljZShzdGFydCwgZW5kKTtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi5wYWdlRGF0YS5maWx0ZXIoKHgpID0+ICF0aGlzLmRpc2FibGVTZWxlY3Rpb25CeUZpZWxkKHgpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi5kYXRhU291cmNlLmRhdGEuZmlsdGVyKCh4KSA9PiAhdGhpcy5kaXNhYmxlU2VsZWN0aW9uQnlGaWVsZCh4KSkpO1xuICAgIH1cbiAgfVxuXG4gIG9uRmlsdGVyQ2hhbmdlKGUpIHtcbiAgICB0aGlzLmZpbHRlckNoYW5nZS5lbWl0KGUpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGFibGUtcGxhaW5cIj5cbiAgQGlmIChoZWFkZXIoKSkge1xuICAgIDxoNiBjbGFzcz1cInRleHQtcHJpbWFyeVwiPlxuICAgICAge3sgaGVhZGVyKCkgfCBhcHBUcmFuc2xhdGUgfCBhc3luYyB9fVxuICAgIDwvaDY+XG4gIH1cblxuICBAaWYgKGZpbHRlckZpZWxkcygpKSB7XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgPGFwcC1idG5cbiAgICAgICAgdGV4dD1cInt7IGZpbHRlckNvbnQuaGlkZGVuID8gJ1Nob3cgRmlsdGVyJyA6ICdIaWRlIEZpbHRlcicgfX1cIlxuICAgICAgICBbaWNvbl09XCJmaWx0ZXJDb250LmhpZGRlbiA/ICdzZWFyY2gnIDogJ2Nsb3NlJ1wiXG4gICAgICAgIChtY2xpY2spPVwiZmlsdGVyQ29udC5oaWRkZW4gPSAhZmlsdGVyQ29udC5oaWRkZW5cIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyIG10LTJcIiBbaGlkZGVuXT1cInRydWVcIiAjZmlsdGVyQ29udD5cbiAgICAgIEBmb3IgKHNjaGVtZSBvZiBmaWx0ZXJGaWVsZHMoKTsgdHJhY2sgc2NoZW1lKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNCBjb2wteHhsLTNcIj5cbiAgICAgICAgICBAc3dpdGNoIChzY2hlbWUudHlwZSkge1xuICAgICAgICAgICAgQGNhc2UgKCdhdXRvY29tcGxldGUnKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICA8YXBwLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZmlsdGVyRm9ybVwiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwic2NoZW1lLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbEZpZWxkXT1cInNjaGVtZS5sYWJlbEZpZWxkXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbFR5cGVdPVwic2NoZW1lLmxhYmVsVHlwZSB8IHRvQW55XCJcbiAgICAgICAgICAgICAgICAgIFtuYW1lXT1cInNjaGVtZS5maWVsZCB8IHRvQW55XCJcbiAgICAgICAgICAgICAgICAgIFtvcHRpb25Gb3JtYXR0ZXJdPVwic2NoZW1lLm9wdGlvbkZvcm1hdHRlclwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZF09XCJzY2hlbWUudmFsdWVGaWVsZFwiXG4gICAgICAgICAgICAgICAgICBbaGludF09XCJzY2hlbWUuaGludFwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2NoZW1lLmRpc2FibGVkSWYgfCBmdW5jdGlvbkNhbGxlcjI6IGZpbHRlckZvcm0udmFsdWUgOiBzY2hlbWUuZmllbGRcIlxuICAgICAgICAgICAgICAgICAgI2lucHV0VGFnXG4gICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJzY2hlbWUub3B0aW9ucyB8fCBjZWxsT3B0aW9uc1tzY2hlbWUuZmllbGQgfCB0b0FueV1cIlxuICAgICAgICAgICAgICAgICAgKG1jaGFuZ2UpPVwib25GaWx0ZXJDaGFuZ2UoZGF0YVNvdXJjZSgpLmZpbHRlcmVkRGF0YSlcIj48L2FwcC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgICAgICAgPGFwcC12YWxpZGF0aW9uLW1lc3NhZ2UgW2lucHV0XT1cImlucHV0VGFnXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgIDxhcHAtaW5wdXQtYmFzaWNcbiAgICAgICAgICAgICAgICAjZm9ybUZpZWxkXG4gICAgICAgICAgICAgICAgW25hbWVdPVwic2NoZW1lLmZpZWxkIHwgdG9BbnlcIlxuICAgICAgICAgICAgICAgIFtmb3JtXT1cImZpbHRlckZvcm1cIlxuICAgICAgICAgICAgICAgIFtzdGFja2VkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFt0eXBlXT1cInNjaGVtZS50eXBlXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZF09XCJzY2hlbWUudmFsdWVGaWVsZFwiXG4gICAgICAgICAgICAgICAgW2xhYmVsVHlwZV09XCJzY2hlbWUubGFiZWxUeXBlIHwgdG9BbnlcIlxuICAgICAgICAgICAgICAgIFtsYWJlbEZpZWxkXT1cInNjaGVtZS5sYWJlbEZpZWxkXCJcbiAgICAgICAgICAgICAgICBbbm9Gb3JtYXRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW29wdGlvbkZvcm1hdHRlcl09XCJzY2hlbWUub3B0aW9uRm9ybWF0dGVyXCJcbiAgICAgICAgICAgICAgICBbZGVjaW1hbFBvaW50c109XCJzY2hlbWUuZGVjaW1hbFBvaW50c1wiXG4gICAgICAgICAgICAgICAgW2hpbnRdPVwic2NoZW1lLmhpbnRcIlxuICAgICAgICAgICAgICAgIFttYXhdPVwic2NoZW1lLm1heFwiXG4gICAgICAgICAgICAgICAgW21pbl09XCJzY2hlbWUubWluXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2NoZW1lLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwic2NoZW1lLmxhYmVsXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2NoZW1lLmRpc2FibGVkSWYgfCBmdW5jdGlvbkNhbGxlcjI6IGZpbHRlckZvcm0udmFsdWUgOiBzY2hlbWUuZmllbGRcIlxuICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInNjaGVtZS5vcHRpb25zIHx8IGNlbGxPcHRpb25zW3NjaGVtZS5maWVsZCB8IHRvQW55XVwiXG4gICAgICAgICAgICAgICAgKG1jaGFuZ2UpPVwib25GaWx0ZXJDaGFuZ2UoZGF0YVNvdXJjZSgpLmZpbHRlcmVkRGF0YSlcIiAvPlxuICAgICAgICAgICAgICA8YXBwLXZhbGlkYXRpb24tbWVzc2FnZSBbaW5wdXRdPVwiZm9ybUZpZWxkXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGQtZmxleFwiPlxuICAgICAgICA8YXBwLWJ0biB0eXBlPVwiZGFuZ2VyLW91dGxpbmVcIiB0ZXh0PVwiQ2xlYXJcIiBpY29uPVwiZGVsZXRlXCIgKG1jbGljayk9XCJjbGVhckZpbHRlcigpXCI+PC9hcHAtYnRuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cblxuICBAaWYgKHN0YXJ0U2VjdGlvblRlbXBsYXRlKCkgfHwgc2hvd0ZpbHRlcigpIHx8IHNob3dFeHBvcnQoKSB8fCBzaG93QWRkaXRpb25hbENvbHVtbnMoKSkge1xuICAgIDxkaXYgY2xhc3M9XCIgXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93IGctMyBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1lbmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZFwiPlxuICAgICAgICAgIEBpZiAoc3RhcnRTZWN0aW9uVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwic3RhcnRTZWN0aW9uVGVtcGxhdGUoKVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKHNob3dGaWx0ZXIoKSkge1xuICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1lbmRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgIDxhcHAtYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiRmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZpbHRlckZvcm1cIlxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbc3RhY2tlZF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImZpbHRlck9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlRmllbGQ9XCJjb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxGaWVsZD1cImRlc2NyaXB0aW9uXCI+PC9hcHAtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1iYXNpYyBsYWJlbD1cIlZhbHVlXCIgdHlwZT1cInRleHRcIiBbZm9ybV09XCJmaWx0ZXJGb3JtXCIgbmFtZT1cInZhbHVlXCIgW3N0YWNrZWRdPVwiZmFsc2VcIj48L2FwcC1pbnB1dC1iYXNpYz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgIDxhcHAtYnRuIHRleHQ9XCJDbGVhclwiIHR5cGU9XCJzZWNvbmRhcnlcIiAobWNsaWNrKT1cImNsZWFyRmlsdGVyKClcIj48L2FwcC1idG4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAoc2hvd0V4cG9ydCgpIHx8IHNob3dBZGRpdGlvbmFsQ29sdW1ucygpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC1hdXRvXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHJvdy1jb2xzLWF1dG8gZy0zIGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChzaG93RXhwb3J0KCkpIHtcbiAgICAgICAgICAgICAgICAgIDxhcHAtZXhwb3J0LXRhYmxlXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZGF0YVNvdXJjZSgpPy5kYXRhPy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwibGFiZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5ZWRDb2x1bW5zXT1cImNvbXB1dGVkRGlzcGxheWVkQ29sdW1ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiZGF0YVNvdXJjZSgpPy5kYXRhXCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgQGlmIChzaG93QWRkaXRpb25hbENvbHVtbnMoKSkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgIDxmaWVsZHMtdG8tZGlzcGxheVxuICAgICAgICAgICAgICAgICAgICBbZmllbGRzXT1cImFsbFRhYmxlQ29sdW1ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgW2N1cnJlbnRDb2x1bW5zXT1cImNvbXB1dGVkRGlzcGxheWVkQ29sdW1ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgKGZpZWxkc0NoYW5nZWQpPVwiZmllbGRzQ2hhbmdlZCgkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG4gIDxkaXYgW25nQ2xhc3NdPVwieyBib3JkZXI6IGRpc3RpbmN0KCkgfVwiIGNsYXNzPVwibXQtMiByb3VuZGVkLTEwIG92ZXJmbG93LWF1dG8gdGFibGUtY29udGFpbmVyIHt7IHRhYmxlQ29udGFpbmVyQ2xhc3MoKSB9fSBcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuICAgICAgPHRhYmxlXG4gICAgICAgIG1hdC10YWJsZVxuICAgICAgICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlKCkgfHwgb2JzRGF0YVNvdXJjZSgpXCJcbiAgICAgICAgbWF0U29ydFxuICAgICAgICBjbGFzcz1cInctMTAwIGQtdGFibGUgdGFibGUgbWItMFwiXG4gICAgICAgIFttdWx0aVRlbXBsYXRlRGF0YVJvd3NdPVwiaXNFeHBhbmRhYmxlXCJcbiAgICAgICAgI3RhYmxlXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgc21hbGxlckZvbnRzLCBub3dyYXAsIGNlbnRlckNlbGxzLCBjdXJ2eSwgJ3RhYmxlLXN0cmlwZWQnOiBzdHJpcGVkIH1cIj5cbiAgICAgICAgPCEtLSBDaGVja2JveCBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibXNlbGVjdFwiIFtzdGlja3ldPVwiIXBsYWNlU2VsZWN0aW9uQXRSaWdodFwiIFtzdGlja3lFbmRdPVwicGxhY2VTZWxlY3Rpb25BdFJpZ2h0XCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICAgIEBpZiAoY3VzdG9tU2VsZWN0Q2xhc3MpIHtcbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY3VzdG9tU2VsZWN0Q2xhc3NcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gbWFzdGVyVG9nZ2xlKCkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiBpc0FsbFNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICFpc0FsbFNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY2hlY2tib3hMYWJlbCgpXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoIWN1c3RvbVNlbGVjdENsYXNzKSB7XG4gICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IG1hc3RlclRvZ2dsZSgpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgaXNBbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhaXNBbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICBbYXJpYS1sYWJlbF09XCJjaGVja2JveExhYmVsKClcIj48L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICAgIEBpZiAoY3VzdG9tU2VsZWN0Q2xhc3MpIHtcbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBjb250cm9sLWJnLWdyYXlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gc2VsZWN0aW9uLnRvZ2dsZShyb3cpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjaGVja2JveExhYmVsKHJvdylcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmICghY3VzdG9tU2VsZWN0Q2xhc3MpIHtcbiAgICAgICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gc2VsZWN0aW9uLnRvZ2dsZShyb3cpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgW2FyaWEtbGFiZWxdPVwiY2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidGhpcy5kaXNhYmxlU2VsZWN0aW9uQnlGaWVsZCB8IGZ1bmN0aW9uQ2FsbGVyMTogcm93XCI+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gQ29sdW1ucyAtLT5cbiAgICAgICAgQGZvciAoY29sIG9mIGNvbXB1dGVkRGlzcGxheWVkQ29sdW1ucygpOyB0cmFjayBjb2w7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgQHN3aXRjaCAoY29sLnR5cGUpIHtcbiAgICAgICAgICAgIDwhLS0gQ0hFQ0tCT1ggLS0+XG4gICAgICAgICAgICBAY2FzZSAoJ3RleHRhcmVhJykge1xuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInt7IGNvbC5mIHwgdG9BbnkgfX1cIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgICAgICAgICAgPGFwcC1pbmZvLWljb24gW3RleHRdPVwiY29sLmhpbnRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY29sLnQgfCBhcHBUcmFuc2xhdGUgfCBhc3luYyB9fVxuICAgICAgICAgICAgICAgICAgPC9hcHAtaW5mby1pY29uPlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgICAgICAgICAgPCEtLSA8YXBwLWlucHV0LXRkLXJmICBbKG1vZGVsKV09XCJjb2wuXCIgW3Nob3dMYWJlbF09XCJmYWxzZVwiICAvPiAtLT5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0vLyAtLT5cbiAgICAgICAgICAgIDwhLS0gQ0hFQ0tCT1ggLS0+XG4gICAgICAgICAgICBAY2FzZSAoJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInt7IGNvbC5mIHwgdG9BbnkgfX1cIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgICAgICAgICAgPGFwcC1pbmZvLWljb24gW3RleHRdPVwiY29sLmhpbnRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY29sLnQgfCBhcHBUcmFuc2xhdGUgfCBhc3luYyB9fVxuICAgICAgICAgICAgICAgICAgPC9hcHAtaW5mby1pY29uPlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgICAgICAgICAgPCEtLSBSZW1vdmluZyB0aGUgZW1wdHkgc3BhY2UgYWJvdmUgY2hlY2tib3hlcyAtLT5cbiAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtbmdtb2RlbFxuICAgICAgICAgICAgICAgICAgICBbc2hvd0xhYmVsXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0YWNrZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJjb2wuY2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgIFsobW9kZWwpXT1cInJvd1tjb2wuZl1cIlxuICAgICAgICAgICAgICAgICAgICAobWNoYW5nZSk9XCJvdXRwdXRDaGVja2JveChjb2wuZiwgcm93LCAkZXZlbnQpXCI+PC9hcHAtaW5wdXQtbmdtb2RlbD5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0vLyAtLT5cblxuICAgICAgICAgICAgPCEtLSBJbnB1dCAtLT5cbiAgICAgICAgICAgIEBjYXNlICgnaW5wdXQnKSB7XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwie3sgY29sLmYgfCB0b0FueSB9fVwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgICAgICAgICA8YXBwLWluZm8taWNvbiBbdGV4dF09XCJjb2wuaGludFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBjb2wudCB8IGFwcFRyYW5zbGF0ZSB8IGFzeW5jIH19XG4gICAgICAgICAgICAgICAgICA8L2FwcC1pbmZvLWljb24+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgICAgICAgICA8IS0tIFJlbW92aW5nIHRoZSBlbXB0eSBzcGFjZSBhYm92ZSBjaGVja2JveGVzIC0tPlxuICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1iYXNpY1xuICAgICAgICAgICAgICAgICAgICBbc2hvd0xhYmVsXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0YWNrZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImNvbC5mXCJcbiAgICAgICAgICAgICAgICAgICAgW25vRm9ybWF0XT1cInRydWVcIj48L2FwcC1pbnB1dC1iYXNpYz5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0vLyAtLT5cblxuICAgICAgICAgICAgPCEtLSBQUk9HUkVTUyBCQVIgLS0+XG4gICAgICAgICAgICBAY2FzZSAoJ3Byb2dyZXNzJykge1xuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInt7IGNvbC5mIHwgdG9BbnkgfX1cIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgICAgICAgICAgPGFwcC1pbmZvLWljb24gW3RleHRdPVwiY29sLmhpbnRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY29sLnQgfCBhcHBUcmFuc2xhdGUgfCBhc3luYyB9fVxuICAgICAgICAgICAgICAgICAgPC9hcHAtaW5mby1pY29uPlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLXN0cmlwZWQgYmctc3VjY2Vzc1wiIHJvbGU9XCJwcm9ncmVzc2JhclwiIFtuZ1N0eWxlXT1cInsgd2lkdGg6IHJvd1tjb2wuZl0gfVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IHJvd1tjb2wuZl0gfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0vLyAtLT5cblxuICAgICAgICAgICAgPCEtLSBDT0xPUiAtLT5cbiAgICAgICAgICAgIEBjYXNlICgnY29sb3InKSB7XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwie3sgY29sLmYgfCB0b0FueSB9fVwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgICAgICAgICA8YXBwLWluZm8taWNvbiBbdGV4dF09XCJjb2wuaGludFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBjb2wudCB8IGFwcFRyYW5zbGF0ZSB8IGFzeW5jIH19XG4gICAgICAgICAgICAgICAgICA8L2FwcC1pbmZvLWljb24+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3F1YXJlLTJcIiBbc3R5bGVdPVwiJ2JhY2tncm91bmQtY29sb3I6JyArIHJvd1tjb2wuZl1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0vLyAtLT5cblxuICAgICAgICAgICAgPCEtLSBCdXR0b24gLS0+XG4gICAgICAgICAgICBAY2FzZSAoJ2J1dHRvbicpIHtcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ7eyBjb2wuZiB8IHRvQW55IH19XCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCBjbGFzcz1cInRleHQtY2VudGVyXCIgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgICAgICAgICA8YXBwLWluZm8taWNvbiBbdGV4dF09XCJjb2wuaGludFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBjb2wudCB8IGFwcFRyYW5zbGF0ZSB8IGFzeW5jIH19XG4gICAgICAgICAgICAgICAgICA8L2FwcC1pbmZvLWljb24+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93OyBsZXQgaW5kZXggPSBpbmRleFwiIGNsYXNzPVwiYnRuLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgIDxhcHAtYnRuXG4gICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImNvbC5pY29uIHx8IGNvbC5idG4/Lmljb25cIlxuICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJjb2wuYnRuPy50eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgKG1jbGljayk9XCJjb2wuYWN0aW9uID8gY29sLmFjdGlvbihyb3csIGNvbC5mLCBnZXRBY3Rpb25TdGF0dXNDYWxsYmFjayhjb2wpLCBpbmRleCkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2hlbHBdPVwiY29sLmJ0bj8uaGVscFwiXG4gICAgICAgICAgICAgICAgICAgIFtzaG93SGVscEljb25dPVwiY29sLmJ0bj8uc2hvd0hlbHBJY29uXCJcbiAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiY29sLmJ0bj8ubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJjb2wuYnRuPy5sb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgW2ljb25CdG5dPVwiY29sLmJ0bj8uaWNvbkJ0blwiXG4gICAgICAgICAgICAgICAgICAgIG1jbGFzcz1cInctYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2wuYnRuPy5kaXNhYmxlZCB8fCBjb2wuYnRuPy5sb2FkaW5nXCI+PC9hcHAtYnRuPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPCEtLS8vIC0tPlxuXG4gICAgICAgICAgICA8IS0tIFN1YiBUYWJsZSAtLT5cbiAgICAgICAgICAgIEBjYXNlICgndGFibGUnKSB7XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwie3sgY29sLmYgfCB0b0FueSB9fVwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgICAgICAgICAgPGFwcC1pbmZvLWljb24gW3RleHRdPVwiY29sLmhpbnRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY29sLnQgfCBhcHBUcmFuc2xhdGUgfCBhc3luYyB9fVxuICAgICAgICAgICAgICAgICAgPC9hcHAtaW5mby1pY29uPlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsIGNsYXNzPVwidGV4dC1jZW50ZXJcIiAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmxpbmUtYmxvY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgPGFwcC1idG5cbiAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJjb2wuaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiY29sLmJ0bj8udHlwZSB8fCAnZGFyaydcIlxuICAgICAgICAgICAgICAgICAgICAgIChtY2xpY2spPVwiY29sLmFjdGlvbiA/IGNvbC5hY3Rpb24ocm93LCBjb2wuZikgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBdPVwiY29sLmJ0bj8uZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtoZWxwXT1cImNvbC5zdWJUYWJsZSB8IHRhYmxlVG9TdHJpbmc6IHJvdyB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd0hlbHBJY29uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCJjb2wuYnRuPy5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ljb25CdG5dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgbWNsYXNzPVwidy1hdXRvXCI+PC9hcHAtYnRuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8IS0tLy8gLS0+XG5cbiAgICAgICAgICAgIDwhLS0gQUNUSU9OIENPTFVNTlMgLS0+XG4gICAgICAgICAgICBAY2FzZSAoJ2J0bnMnKSB7XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwie3sgY29sLmYgfCB0b0FueSB9fVwiIHN0aWNreUVuZD5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlciBjbGFzcz1cImJ0bi1jZWxsIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8YXBwLWluZm8taWNvbiBbdGV4dF09XCJjb2wuaGludFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBjb2wudCB8IGFwcFRyYW5zbGF0ZSB8IGFzeW5jIH19XG4gICAgICAgICAgICAgICAgICA8L2FwcC1pbmZvLWljb24+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93OyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJidG4tY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBjb2wtbWQtYXV0byBjb2wtc20tYXV0byBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGJ1dHRvbiBvZiBjb2wuYnV0dG9uczsgdHJhY2sgYnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtYnRuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImJ1dHRvbi5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiYnV0dG9uLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2hlbHBdPVwiYnV0dG9uLmhlbHBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0hlbHBJY29uXT1cImJ1dHRvbi5zaG93SGVscEljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJidXR0b24udHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cF09XCJidXR0b24uZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbkJ0bl09XCIhYnV0dG9uLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWNsYXNzPVwidy1hdXRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1jbGljayk9XCJidXR0b24uYWN0aW9uKHJvdywgaSwgYnRuKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICNidG4+PC9hcHAtYnRuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPCEtLSBFRElUQUJMRSAtLT5cbiAgICAgICAgICAgIEBjYXNlICgnZWRpdGFibGUnKSB7XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwie3sgY29sLmYgfCB0b0FueSB9fVwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPGFwcC1pbmZvLWljb24gW3RleHRdPVwiY29sLmhpbnRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY29sLnQgfCBhcHBUcmFuc2xhdGUgfCBhc3luYyB9fVxuICAgICAgICAgICAgICAgICAgPC9hcHAtaW5mby1pY29uPlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW21xdWVyeVBhcmFtc109XCJjb2wubXF1ZXJ5UGFyYW1zIHwgZnVuY3Rpb25DYWxsZXIyOiByb3cgOiBjb2wuZlwiXG4gICAgICAgICAgICAgICAgICAgIFttcm91dGVyTGlua109XCJjb2wucm91dGVGb3JtYXR0ZXIgfCBmdW5jdGlvbkNhbGxlcjI6IHJvdyA6IGNvbC5mXCJcbiAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJyb3cgfCBnZXRDb2xGb3JtYXR0ZWQ6IGNvbCB8IGFzeW5jIHwgdmFsdWVPclg6ICctJ1wiPjwvYT5cbiAgICAgICAgICAgICAgICAgIDxpIChjbGljayk9XCJjb2wuYWN0aW9uID8gY29sLmFjdGlvbihyb3csIGNvbC5mKSA6IG51bGxcIiBjbGFzcz1cInBzLTEgcG9pbnRlciBmYXMgZmEtcGVuY2lsLWFsdFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPCEtLSBERUZBVUxUIC0tPlxuICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInt7IGNvbC5mIHwgdG9BbnkgfX1cIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxhcHAtaW5mby1pY29uIFt0ZXh0XT1cImNvbC5oaW50XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGNvbC50IHwgYXBwVHJhbnNsYXRlIHwgYXN5bmMgfX1cbiAgICAgICAgICAgICAgICAgIDwvYXBwLWluZm8taWNvbj5cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoY29sLnJvdXRlRm9ybWF0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoZXh0cmFjdFJvdXRlIHwgZnVuY3Rpb25DYWxsZXIyOiBjb2wgOiByb3c7IGFzIGNlbGxSb3V0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBwb2ludGVyOiBjb2wuYWN0aW9uLCBsaW5rOiBjb2wuYWN0aW9uIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbC5hY3Rpb24gPyBjb2wuYWN0aW9uKHJvdywgY29sLmYpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiY2VsbFJvdXRlLnF1ZXJ5UGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlckxpbms9XCJ7eyBjZWxsUm91dGUucm91dGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJyb3cgfCBnZXRDb2xGb3JtYXR0ZWQ6IGNvbCB8IGFzeW5jIHwgdmFsdWVPclg6ICctJ1wiPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IHBvaW50ZXI6IGNvbC5hY3Rpb24sIGxpbms6IGNvbC5hY3Rpb24gfVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbC5hY3Rpb24gPyBjb2wuYWN0aW9uKHJvdywgY29sLmYpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJyb3cgfCBnZXRDb2xGb3JtYXR0ZWQ6IGNvbCB8IGFzeW5jIHwgdmFsdWVPclg6ICctJ1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPCEtLS8vIC0tPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA8IS0tIEVYUEFOREFCTEUgQ09MVU1OLS0+XG4gICAgICAgIEBpZiAoaXNFeHBhbmRhYmxlKCkpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIl9leHBhbmRDb2xcIiBzdGlja3lFbmQ+XG4gICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGFyaWEtbGFiZWw9XCJyb3cgYWN0aW9uc1wiPiZuYnNwOzwvdGg+XG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgICAgICAgIDxhcHAtYnRuXG4gICAgICAgICAgICAgICAgICBbaWNvbkJ0bl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjbGVhclwiXG4gICAgICAgICAgICAgICAgICBbY3VzdG9tSWNvbl09XCJleHBhbmRlZEVsZW1lbnQgIT09IHJvdyA/ICdmYSBmYS1jaGV2cm9uLWRvd24nIDogJ2ZhIGZhLWNoZXZyb24tdXAnXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJleHBhbmQgcm93XCJcbiAgICAgICAgICAgICAgICAgIChtY2xpY2spPVwiZXhwYW5kZWRFbGVtZW50ID0gZXhwYW5kZWRFbGVtZW50ID09PSByb3cgPyBudWxsIDogcm93OyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj48L2FwcC1idG4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuICAgICAgICA8IS0tLy8gLS0+XG4gICAgICAgIDwhLS0gT3B0aW9ucyBDb2x1bW4gLS0+XG4gICAgICAgIEBpZiAocm93T3B0aW9ucygpPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJvcHRpb25cIiBzdGlja3lFbmQ+XG4gICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPjwvdGg+XG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCIgY2xhc3M9XCJidG4gbXMtMlwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZWxsaXBzaXMtdiBtZS0wXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiByb3dPcHRpb25zKCk7IHRyYWNrIG9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIGNsYXNzPVwie3sgb3B0aW9uLml0ZW1DbGFzcyB9fVwiIChjbGljayk9XCJvcHRpb24uYWN0aW9uKHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgb3B0aW9uLnQgfCBhcHBUcmFuc2xhdGUgfCBhc3luYyB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAocmF3Q29sdW1ucygpOyBhcyBkY29scykge1xuICAgICAgICAgIDwhLS0gRXhwYW5kZWQgQ29udGVudCBDb2x1bW4gLSBUaGUgZGV0YWlsIHJvdyBpcyBtYWRlIHVwIG9mIHRoaXMgb25lIGNvbHVtbiB0aGF0IHNwYW5zIGFjcm9zcyBhbGwgY29sdW1ucyAtLT5cbiAgICAgICAgICBAaWYgKGlzRXhwYW5kYWJsZSgpKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImV4cGFuZGVkRGV0YWlsXCI+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBbYXR0ci5jb2xzcGFuXT1cImRjb2xzPy5sZW5ndGggfHwgMVwiIFtuZ0NsYXNzXT1cInsgaGlkZUJvcmRlcjogcm93ICE9IGV4cGFuZGVkRWxlbWVudCB9XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtZWxlbWVudC1kZXRhaWxcIiBbQGRldGFpbEV4cGFuZF09XCJyb3cgPT0gZXhwYW5kZWRFbGVtZW50ID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZXhwYW5kZWRSb3dUZW1wbGF0ZSgpOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyByb3cgfSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkY29sc1wiPjwvdHI+XG4gICAgICAgICAgPHRyXG4gICAgICAgICAgICBtYXQtcm93XG4gICAgICAgICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGNvbHNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBwb2ludGVyOiBzaG93Um93UG9pbnRlcigpLCBkaXNhYmxlZDogaXNEaXNhYmxlZEZ1bmMoKSA/IGlzRGlzYWJsZWRGdW5jKCkocm93KSA6IGZhbHNlIH1cIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiaXNEaXNhYmxlZEZ1bmMoKSAmJiBpc0Rpc2FibGVkRnVuYygpKHJvdykgPyAnRGlzYWJsZWQnIDogbnVsbFwiXG4gICAgICAgICAgICAoY2xpY2spPVwicm93Q2xpY2socm93KVwiPjwvdHI+XG4gICAgICAgICAgPHRyIGNsYXNzPVwibWF0LXJvd1wiICptYXROb0RhdGFSb3c+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbCBuby1pdGVtXCIgW2F0dHIuY29sc3Bhbl09XCJkY29scz8ubGVuZ3RoIHx8IDFcIj5cbiAgICAgICAgICAgICAge3sgbm9JdGVtVHh0KCkgfCBhcHBUcmFuc2xhdGUgfCBhc3luYyB9fVxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICAgIEBpZiAoaXNFeHBhbmRhYmxlKCkpIHtcbiAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ2V4cGFuZGVkRGV0YWlsJ11cIiBjbGFzcz1cImV4cGFuZGVkLWRldGFpbC1yb3dcIiBbc3R5bGUuaGVpZ2h0LnB4XT1cIjBcIj48L3RyPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5cbiAgICBAaWYgKHNob3dQYWdlcigpKSB7XG4gICAgICA8bWF0LXBhZ2luYXRvclxuICAgICAgICBbbGVuZ3RoXT1cInJlc3VsdHNMZW5ndGgoKVwiXG4gICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwiY29tcHV0ZWRQYWdlU2l6ZU9wdGlvbnMoKVwiXG4gICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZSgpXCJcbiAgICAgICAgc2hvd0ZpcnN0TGFzdEJ1dHRvbnM+PC9tYXQtcGFnaW5hdG9yPlxuICAgIH1cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
258
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtcGxhaW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXRzLWZlLW5nLXNkay9zcmMvbGliL1NoYXJlZC9jb21wb25lbnRzL3RhYmxlLXBsYWluL3RhYmxlLXBsYWluLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V0cy1mZS1uZy1zZGsvc3JjL2xpYi9TaGFyZWQvY29tcG9uZW50cy90YWJsZS1wbGFpbi90YWJsZS1wbGFpbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUtOLFFBQVEsRUFDUixNQUFNLEVBRU4sS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBQzNHLE9BQU8sRUFBZ0Msa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRixPQUFPLEVBQVcsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUF3QixrQkFBa0IsSUFBSSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6SCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBYyxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHdkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FB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QyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztZQUNwSCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDM0ksSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7WUFDckMsT0FBTztTQUNSO1FBRUQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDekIsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO1lBQ3BILElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUMzSSxJQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FB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QUFDLE1BQU07Z0JBQ0osV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBc0VZLEtBQUs7c0JBQXZCLEtBQUs7dUJBQUMsTUFBTTtnQkFJYyxhQUFhO3NCQUF2QyxLQUFLO3VCQUFDLGNBQWM7Z0JBS1MsZ0JBQWdCO3NCQUE3QyxLQUFLO3VCQUFDLGlCQUFpQjtnQkFLZixnQkFBZ0I7c0JBQXhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25DaGFuZ2UsIFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpZ25hbCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgV3JpdGFibGVTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IgYXMgTWF0UGFnaW5hdG9yLCBNYXRQYWdpbmF0b3JNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgTWF0U29ydCwgTWF0U29ydE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgTWF0VGFibGUgYXMgTWF0VGFibGUsIE1hdFRhYmxlRGF0YVNvdXJjZSBhcyBNYXRUYWJsZURhdGFTb3VyY2UsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSUZvcm1PcHRpb25zLCBJRm9ybVNjaGVtYSB9IGZyb20gJy4uLy4uL21vZGVscy9mb3JtLXNjaGVtYS5tb2RlbCc7XG5pbXBvcnQgeyBJQ29kZURlc2NyaXB0aW9uLCBJT2JqZWN0TGl0ZXJhbCwgSVJvd09wdGlvbiwgSVN0cmljdEZvcm1Hcm91cCwgU29ydFR5cGUsIFRhYmxlQ29sIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2luZGV4Lm1vZGVsJztcbmltcG9ydCB7IEZ1bmN0aW9uQ2FsbGVyMSwgRnVuY3Rpb25DYWxsZXIyLCBUb0FueVBpcGUsIFZhbHVlT3JYUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL3V0aWxpdHkucGlwZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvdHJhbnNsYXRlLnBpcGUnO1xuaW1wb3J0IHsgR2V0Q29sRm9ybWF0dGVkUGlwZSwgR2V0UmF3RmllbGRzUGlwZSwgVGFibGVQaXBlc01vZHVsZSwgVGFibGVUb1N0cmluZ1BpcGUgfSBmcm9tICcuL3RhYmxlLnBpcGUnO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgTXJvdXRlckxpbmtpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvaW5kZXguZGlyZWN0aXZlJztcbmltcG9ydCB7IElucHV0TkdNb2RlbENvbXBvbmVudCB9IGZyb20gJy4uL2lucHV0LU5nTW9kZWwvaW5wdXQtbmdtb2RlbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW5mb0ljb25Db21wb25lbnQgfSBmcm9tICcuLi9pbmZvLWljb24vaW5mby1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcbmltcG9ydCB7IElucHV0Rm9ybWF0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9pbnB1dC1mb3JtYXR0ZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZpZWxkc1RvRGlzcGxheUNvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkcy10by1kaXNwbGF5L2ZpZWxkcy10by1kaXNwbGF5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFeHBvcnRUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uL2V4cG9ydC10YWJsZS9leHBvcnQtdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IEJ0bkNvbXBvbmVudCB9IGZyb20gJy4uL2J0bi9idG4uY29tcG9uZW50JztcbmltcG9ydCB7IElucHV0QmFzaWNDb21wb25lbnQgfSBmcm9tICcuLi9pbnB1dC9pbnB1dC1iYXNpYy5jb21wb25lbnQnO1xuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VDb21wb25lbnQgfSBmcm9tICcuLi9pbnB1dC92YWxpZGF0aW9uLW1lc3NhZ2UvdmFsaWRhdGlvbi1tZXNzYWdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBdXRvY29tcGxldGVDb21wb25lbnQgfSBmcm9tICcuLi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgdHJpZ2dlciwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCBhbmltYXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBVdGlsaXR5U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL1NlcnZpY2VzL3V0aWxpdHkuc2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZVNlcnZpY2UgfSBmcm9tICcuL3RhYmxlLXBsYWluLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGVCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi90YWJsZS1iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtR2VuZXJhdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS1nZW5lcmF0b3IvZm9ybS1nZW5lcmF0b3IuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFibGUtcGxhaW4nLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUtcGxhaW4uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS1wbGFpbi5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcignZGV0YWlsRXhwYW5kJywgW1xuICAgICAgc3RhdGUoJ2NvbGxhcHNlZCcsIHN0eWxlKHsgaGVpZ2h0OiAnMHB4JywgbWluSGVpZ2h0OiAnMCcgfSkpLFxuICAgICAgc3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxuICAgIF0pLFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgQXN5bmNQaXBlLFxuICAgIEF1dG9jb21wbGV0ZUNvbXBvbmVudCxcbiAgICBCdG5Db21wb25lbnQsXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEV4cG9ydFRhYmxlQ29tcG9uZW50LFxuICAgIEZpZWxkc1RvRGlzcGxheUNvbXBvbmVudCxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBGdW5jdGlvbkNhbGxlcjEsXG4gICAgRnVuY3Rpb25DYWxsZXIyLFxuICAgIEdldENvbEZvcm1hdHRlZFBpcGUsXG4gICAgR2V0UmF3RmllbGRzUGlwZSxcbiAgICBJbmZvSWNvbkNvbXBvbmVudCxcbiAgICBJbnB1dEJhc2ljQ29tcG9uZW50LFxuICAgIElucHV0Rm9ybWF0RGlyZWN0aXZlLFxuICAgIEZvcm1HZW5lcmF0b3JDb21wb25lbnQsXG4gICAgSW5wdXROR01vZGVsQ29tcG9uZW50LFxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgTWF0UGFnaW5hdG9yTW9kdWxlLFxuICAgIE1hdFNvcnRNb2R1bGUsXG4gICAgTWF0VGFibGVNb2R1bGUsXG4gICAgUm91dGVyTW9kdWxlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgTXJvdXRlckxpbmtpcmVjdGl2ZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFRhYmxlUGlwZXNNb2R1bGUsXG4gICAgVGFibGVUb1N0cmluZ1BpcGUsXG4gICAgVG9BbnlQaXBlLFxuICAgIFRyYW5zbGF0ZVBpcGUsXG4gICAgVmFsaWRhdGlvbk1lc3NhZ2VDb21wb25lbnQsXG4gICAgVmFsdWVPclhQaXBlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZVBsYWluQ29tcG9uZW50PFRJdGVtID0gYW55PiBleHRlbmRzIFRhYmxlQmFzZUNvbXBvbmVudDxUSXRlbT4gaW1wbGVtZW50cyBPbkluaXQge1xuICBvdmVycmlkZSBkYXRhID0gc2lnbmFsPFRJdGVtW10+KG51bGwpO1xuICBjdXN0b21TZWxlY3RDbGFzcyA9IGlucHV0PHN0cmluZz4oKTsgLy8gY3VzdG9tIGNsYXNzIGZvciByb3cgc2VsZWN0aW9uIGNoZWNrYm94ZXNcbiAgaWRGaWVsZCA9IGlucHV0PHN0cmluZz4oJ2lkJyk7XG4gIG9ic0RhdGFTb3VyY2UgPSBpbnB1dDxPYnNlcnZhYmxlPFRJdGVtW10+PihudWxsKTtcbiAgc2hvd0ZpbHRlciA9IGlucHV0KGZhbHNlKTtcbiAgc2hvd1BhZ2VyID0gaW5wdXQoZmFsc2UpO1xuICBASW5wdXQoKSBkaXNhYmxlU2VsZWN0aW9uQnlGaWVsZDogKHg6IGFueSkgPT4gYm9vbGVhbiA9ICh4KSA9PiBmYWxzZTtcblxuICBAT3V0cHV0KCd2aWV3JykgX3ZpZXcgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGRhdGFDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZmlsdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBsaXN0TXV0YXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VEl0ZW1bXT4oKTtcblxuICBvdmVycmlkZSByZXN1bHRzTGVuZ3RoID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB0aGlzLmRhdGEoKT8ubGVuZ3RoKTtcblxuICBjZWxsT3B0aW9uczogSUZvcm1PcHRpb25zID0ge307XG4gIGRhdGFTb3VyY2UgPSBjb21wdXRlZDxNYXRUYWJsZURhdGFTb3VyY2U8VEl0ZW0+PigoKSA9PiB7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy5kYXRhKCkgfHwgW10pLFxuICAgICAgZmlsdGVyRm9ybVZhbHVlID0gdGhpcy5maWx0ZXJGb3JtU2lnbmFsKCksXG4gICAgICBuZ0FmdGVyVmlld0luaXRTaWduYWwgPSB0aGlzLm5nQWZ0ZXJWaWV3SW5pdFNpZ25hbCgpLFxuICAgICAgZmlsdGVyRmllbGRzID0gdGhpcy5maWx0ZXJGaWVsZHMoKTtcbiAgICBkYXRhU291cmNlLnNvcnQgPSB0aGlzLnNvcnQ7XG4gICAgaWYgKHRoaXMub3JkZXJGaWVsZCgpICYmIHRoaXMub3JkZXJEaXJlY3Rpb24oKSAmJiBkYXRhU291cmNlLnNvcnQpIHtcbiAgICAgIGRhdGFTb3VyY2Uuc29ydC5hY3RpdmUgPSB0aGlzLm9yZGVyRmllbGQoKS50b1N0cmluZygpO1xuICAgICAgZGF0YVNvdXJjZS5zb3J0LmRpcmVjdGlvbiA9IHRoaXMub3JkZXJEaXJlY3Rpb24oKTtcbiAgICAgIGRhdGFTb3VyY2Uuc29ydC5zb3J0Q2hhbmdlLmVtaXQoe1xuICAgICAgICBhY3RpdmU6IHRoaXMub3JkZXJGaWVsZD8udG9TdHJpbmcoKSxcbiAgICAgICAgZGlyZWN0aW9uOiB0aGlzLm9yZGVyRGlyZWN0aW9uKCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd1BhZ2VyKCkpIHtcbiAgICAgIGRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dGaWx0ZXIoKSkge1xuICAgICAgdGhpcy5kZWZhdWx0RmlsdGVyUHJlZGljYXRlID0gdGhpcy5kZWZhdWx0RmlsdGVyUHJlZGljYXRlIHx8IGRhdGFTb3VyY2UuZmlsdGVyUHJlZGljYXRlLmNsb25lKCk7XG4gICAgICBkYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZSA9IChyb3c6IGFueSwgZmlsdGVyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlci5maWVsZCkge1xuICAgICAgICAgIHJldHVybiAocm93W2ZpbHRlci5maWVsZF0/LnRvTG93ZXJDYXNlKCk/LnRyaW0oKSB8fCAnJyk/LmluY2x1ZGVzKGZpbHRlci52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEZpbHRlclByZWRpY2F0ZShyb3csIGZpbHRlci52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChmaWx0ZXJGaWVsZHMpIHtcbiAgICAgIHRoaXMuZGVmYXVsdEZpbHRlclByZWRpY2F0ZSA9IHRoaXMuZGVmYXVsdEZpbHRlclByZWRpY2F0ZSB8fCBkYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZS5jbG9uZSgpO1xuICAgICAgZGF0YVNvdXJjZS5maWx0ZXJQcmVkaWNhdGUgPSAocm93OiBhbnksIGZpbHRlcjogYW55KSA9PiB7XG4gICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKGZpbHRlcikuc29tZSgoa2V5KSA9PiBmaWx0ZXJba2V5XSkpIHJldHVybiB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmaWx0ZXIpIHtcbiAgICAgICAgICAvLyBjb25zdCBpdDEgPSBmaWx0ZXJba2V5XT8udG9Mb3dlckNhc2UoKTsgO1xuICAgICAgICAgIC8vIGNvbnN0IGl0MiA9IHJvd1trZXldPy50b1N0cmluZygpPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIC8vIGNvbnN0IGl0MyA9IHJvd1trZXldPy50b1N0cmluZygpPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgICAgIC8vIGNvbnN0IGl0NCA9IChyb3dba2V5XT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSB8fCAnJyk/LmluY2x1ZGVzKFxuICAgICAgICAgIC8vICAgZmlsdGVyW2tleV0/LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGNvbnNvbGUubG9nKHJvdyk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZmlsdGVyW2tleV0/LnRvU3RyaW5nKCk/LnRvTG93ZXJDYXNlKCkgJiZcbiAgICAgICAgICAgIChyb3dba2V5XT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSB8fCAnJyk/LmluY2x1ZGVzKGZpbHRlcltrZXldPy50b1N0cmluZygpPy50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGZpbHRlckZvcm1WYWx1ZSkgZGF0YVNvdXJjZS5maWx0ZXIgPSBmaWx0ZXJGb3JtVmFsdWUgYXMgYW55O1xuICAgIHJldHVybiBkYXRhU291cmNlO1xuICB9KTtcbiAgZGVmYXVsdEZpbHRlclByZWRpY2F0ZTogYW55O1xuXG4gIGZpbHRlckZpZWxkcyA9IHNpZ25hbDxJRm9ybVNjaGVtYVtdPihudWxsKTtcbiAgZmlsdGVyT3B0aW9ucyA9IGNvbXB1dGVkPElDb2RlRGVzY3JpcHRpb25bXT4oXG4gICAgKCkgPT5cbiAgICAgIHRoaXMuY29tcHV0ZWREaXNwbGF5ZWRDb2x1bW5zKCk/Lm1hcCgoeCkgPT4gKHtcbiAgICAgICAgY29kZTogeC5mIGFzIHN0cmluZyxcbiAgICAgICAgZGVzY3JpcHRpb246IHgudCxcbiAgICAgIH0pKSxcbiAgKTtcbiAgZmlsdGVyRm9ybSA9IG5ldyBGb3JtR3JvdXAoeyBmaWVsZDogbmV3IEZvcm1Db250cm9sKCksIHZhbHVlOiBuZXcgRm9ybUNvbnRyb2woKSB9KTtcblxuICBASW5wdXQoJ2RhdGEnKSBzZXQgX2RhdGEodjogVEl0ZW1bXSkge1xuICAgIHRoaXMuZGF0YS5zZXQodik7XG4gIH1cblxuICBASW5wdXQoJ2ZpbHRlckZpZWxkcycpIHNldCBfZmlsdGVyRmllbGRzKHY6IElGb3JtU2NoZW1hW10pIHtcbiAgICB0aGlzLnVTLmFkZEZvcm1TY2hlbWFUb0Zvcm0odiwgdGhpcy5maWx0ZXJGb3JtKTtcbiAgICB0aGlzLmZpbHRlckZpZWxkcy5zZXQodik7XG4gICAgZm9yIChjb25zdCBzY2hlbWUgb2Ygdikgc2NoZW1lLm9wdGlvbnNJbml0RnVuYz8uc3Vic2NyaWJlKChyKSA9PiAodGhpcy5jZWxsT3B0aW9uc1tzY2hlbWUuZmllbGQ/LnRvU3RyaW5nKCldID0gcikpO1xuICB9XG4gIEBJbnB1dCgnZmlsdGVyRmllbGRzTWFwJykgc2V0IF9maWx0ZXJGaWVsZHNNYXAodjogeyBbeDogc3RyaW5nXTogSUZvcm1TY2hlbWEgfSkge1xuICAgIHRoaXMuX2ZpbHRlckZpZWxkcyA9IE9iamVjdC52YWx1ZXModik7XG4gIH1cblxuICAvKiogU2VsZWN0cyBhbGwgcm93cyBpbiB0aGUgY3VycmVudCBwYWdlIG9mIHRoZSB0YWJsZSBpZiB0cnVlICovXG4gIEBJbnB1dCgpIHNlbGVjdGlvblBlclBhZ2U6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGZpbHRlckZvcm1TaWduYWwgPSB0b1NpZ25hbChcbiAgICB0aGlzLmZpbHRlckZvcm0udmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICBtYXAoKHI6IHsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgIC8vIGRlYnVnZ2VyXG4gICAgICAgIGNvbnNvbGUubG9nKHIpO1xuICAgICAgICBpZiAoIXRoaXMuZmlsdGVyRmllbGRzKSByLnZhbHVlID0gci52YWx1ZT8udG9Mb3dlckNhc2UoKT8udHJpbSgpIHx8ICcnO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0pLFxuICAgICksXG4gICk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coYHRhYmxlIGRhdGFgLCB0aGlzLmRhdGEoKSk7XG5cbiAgICAgIHRoaXMuZGF0YUNoYW5nZWQuZW1pdCh0aGlzLmRhdGEoKSk7XG4gICAgICB0aGlzLnNlbGVjdGlvbj8uY2xlYXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkgeyBcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm5nQWZ0ZXJWaWV3SW5pdFNpZ25hbC5zZXQoY2xvbmVEZWVwKE1hdGgucmFuZG9tKCkpKTtcbiAgfVxuXG4gIGNsZWFyRmlsdGVyKCkge1xuICAgIHRoaXMuZmlsdGVyRm9ybS5yZXNldCgpO1xuICB9XG4gIG92ZXJyaWRlIG91dHB1dENoZWNrYm94KGZpZWxkOiBrZXlvZiBUSXRlbSwgaXRlbTogVEl0ZW0sIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCByZXQgPSBzdXBlci5vdXRwdXRDaGVja2JveChmaWVsZCwgaXRlbSwgdmFsdWUpO1xuICAgIHRoaXMubGlzdE11dGF0ZWQuZW1pdCh0aGlzLmRhdGEoKSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKiBTZWxlY3RzIGFsbCByb3dzIGlmIHRoZXkgYXJlIG5vdCBhbGwgc2VsZWN0ZWQ7IG90aGVyd2lzZSBjbGVhciBzZWxlY3Rpb24uICovXG4gIG1hc3RlclRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBsYXN0U2VsZWN0aW9uID0gdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA/IHRoaXMuc2VsZWN0ZWRJdGVtc1t0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoIC0gMV0gOiBudWxsO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSB0aGlzLmRhdGFTb3VyY2UoKTtcbiAgICBsZXQgc2VsZWN0ZWRJbmRleCA9IGxhc3RTZWxlY3Rpb24gPyBkYXRhU291cmNlLmRhdGEuZmluZEluZGV4KChyKSA9PiByID09IGxhc3RTZWxlY3Rpb24pIDogLTE7XG4gICAgbGV0IGVuZCA9IHRoaXMucGFnaW5hdG9yLmhhc05leHRQYWdlKCkgPyAoZGF0YVNvdXJjZS5wYWdpbmF0b3IucGFnZUluZGV4ICsgMSkgKiBkYXRhU291cmNlLnBhZ2luYXRvci5wYWdlU2l6ZSA6IGRhdGFTb3VyY2UuZGF0YS5sZW5ndGg7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggJiYgc2VsZWN0ZWRJbmRleCAhPSAtMSAmJiBzZWxlY3RlZEluZGV4ICsgMSA9PSBlbmQpIHtcbiAgICAgIGxldCBzdGFydCA9IGRhdGFTb3VyY2UucGFnaW5hdG9yLnBhZ2VJbmRleCA8IDEgPyAwIDogZGF0YVNvdXJjZS5wYWdpbmF0b3IucGFnZUluZGV4ICogZGF0YVNvdXJjZS5wYWdpbmF0b3IucGFnZVNpemU7XG4gICAgICBsZXQgZW5kID0gdGhpcy5wYWdpbmF0b3IuaGFzTmV4dFBhZ2UoKSA/IChkYXRhU291cmNlLnBhZ2luYXRvci5wYWdlSW5kZXggKyAxKSAqIGRhdGFTb3VyY2UucGFnaW5hdG9yLnBhZ2VTaXplIDogZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCArIDE7XG4gICAgICBsZXQgcGFnZURhdGEgPSBkYXRhU291cmNlLmRhdGEuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5kZXNlbGVjdCguLi5wYWdlRGF0YSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uUGVyUGFnZSkge1xuICAgICAgbGV0IHN0YXJ0ID0gZGF0YVNvdXJjZS5wYWdpbmF0b3IucGFnZUluZGV4IDwgMSA/IDAgOiBkYXRhU291cmNlLnBhZ2luYXRvci5wYWdlSW5kZXggKiBkYXRhU291cmNlLnBhZ2luYXRvci5wYWdlU2l6ZTtcbiAgICAgIGxldCBlbmQgPSB0aGlzLnBhZ2luYXRvci5oYXNOZXh0UGFnZSgpID8gKGRhdGFTb3VyY2UucGFnaW5hdG9yLnBhZ2VJbmRleCArIDEpICogZGF0YVNvdXJjZS5wYWdpbmF0b3IucGFnZVNpemUgOiBkYXRhU291cmNlLmRhdGEubGVuZ3RoICsgMTtcbiAgICAgIGxldCBwYWdlRGF0YSA9IGRhdGFTb3VyY2UuZGF0YS5zbGljZShzdGFydCwgZW5kKTtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi5wYWdlRGF0YS5maWx0ZXIoKHgpID0+ICF0aGlzLmRpc2FibGVTZWxlY3Rpb25CeUZpZWxkKHgpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi5kYXRhU291cmNlLmRhdGEuZmlsdGVyKCh4KSA9PiAhdGhpcy5kaXNhYmxlU2VsZWN0aW9uQnlGaWVsZCh4KSkpO1xuICAgIH1cbiAgfVxuXG4gIG9uRmlsdGVyQ2hhbmdlKGUpIHtcbiAgICB0aGlzLmZpbHRlckNoYW5nZS5lbWl0KGUpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGFibGUtcGxhaW5cIj5cbiAgQGlmIChoZWFkZXIoKSkge1xuICAgIDxoNiBjbGFzcz1cInRleHQtcHJpbWFyeVwiPlxuICAgICAge3sgaGVhZGVyKCkgfCBhcHBUcmFuc2xhdGUgfCBhc3luYyB9fVxuICAgIDwvaDY+XG4gIH1cblxuICBAaWYgKGZpbHRlckZpZWxkcygpKSB7XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgPGFwcC1idG5cbiAgICAgICAgdGV4dD1cInt7IGZpbHRlckNvbnQuaGlkZGVuID8gJ1Nob3cgRmlsdGVyJyA6ICdIaWRlIEZpbHRlcicgfX1cIlxuICAgICAgICBbaWNvbl09XCJmaWx0ZXJDb250LmhpZGRlbiA/ICdzZWFyY2gnIDogJ2Nsb3NlJ1wiXG4gICAgICAgIChtY2xpY2spPVwiZmlsdGVyQ29udC5oaWRkZW4gPSAhZmlsdGVyQ29udC5oaWRkZW5cIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyIG10LTJcIiBbaGlkZGVuXT1cInRydWVcIiAjZmlsdGVyQ29udD5cbiAgICAgIEBmb3IgKHNjaGVtZSBvZiBmaWx0ZXJGaWVsZHMoKTsgdHJhY2sgc2NoZW1lKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNCBjb2wteHhsLTNcIj5cbiAgICAgICAgICBAc3dpdGNoIChzY2hlbWUudHlwZSkge1xuICAgICAgICAgICAgQGNhc2UgKCdhdXRvY29tcGxldGUnKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICA8YXBwLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZmlsdGVyRm9ybVwiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwic2NoZW1lLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbEZpZWxkXT1cInNjaGVtZS5sYWJlbEZpZWxkXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbFR5cGVdPVwic2NoZW1lLmxhYmVsVHlwZSB8IHRvQW55XCJcbiAgICAgICAgICAgICAgICAgIFtuYW1lXT1cInNjaGVtZS5maWVsZCB8IHRvQW55XCJcbiAgICAgICAgICAgICAgICAgIFtvcHRpb25Gb3JtYXR0ZXJdPVwic2NoZW1lLm9wdGlvbkZvcm1hdHRlclwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZF09XCJzY2hlbWUudmFsdWVGaWVsZFwiXG4gICAgICAgICAgICAgICAgICBbaGludF09XCJzY2hlbWUuaGludFwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2NoZW1lLmRpc2FibGVkSWYgfCBmdW5jdGlvbkNhbGxlcjI6IGZpbHRlckZvcm0udmFsdWUgOiBzY2hlbWUuZmllbGRcIlxuICAgICAgICAgICAgICAgICAgI2lucHV0VGFnXG4gICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJzY2hlbWUub3B0aW9ucyB8fCBjZWxsT3B0aW9uc1tzY2hlbWUuZmllbGQgfCB0b0FueV1cIlxuICAgICAgICAgICAgICAgICAgKG1jaGFuZ2UpPVwib25GaWx0ZXJDaGFuZ2UoZGF0YVNvdXJjZSgpLmZpbHRlcmVkRGF0YSlcIj48L2FwcC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgICAgICAgPGFwcC12YWxpZGF0aW9uLW1lc3NhZ2UgW2lucHV0XT1cImlucHV0VGFnXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgIDxhcHAtaW5wdXQtYmFzaWNcbiAgICAgICAgICAgICAgICAjZm9ybUZpZWxkXG4gICAgICAgICAgICAgICAgW25hbWVdPVwic2NoZW1lLmZpZWxkIHwgdG9BbnlcIlxuICAgICAgICAgICAgICAgIFtmb3JtXT1cImZpbHRlckZvcm1cIlxuICAgICAgICAgICAgICAgIFtzdGFja2VkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFt0eXBlXT1cInNjaGVtZS50eXBlXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZF09XCJzY2hlbWUudmFsdWVGaWVsZFwiXG4gICAgICAgICAgICAgICAgW2xhYmVsVHlwZV09XCJzY2hlbWUubGFiZWxUeXBlIHwgdG9BbnlcIlxuICAgICAgICAgICAgICAgIFtsYWJlbEZpZWxkXT1cInNjaGVtZS5sYWJlbEZpZWxkXCJcbiAgICAgICAgICAgICAgICBbbm9Gb3JtYXRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW29wdGlvbkZvcm1hdHRlcl09XCJzY2hlbWUub3B0aW9uRm9ybWF0dGVyXCJcbiAgICAgICAgICAgICAgICBbZGVjaW1hbFBvaW50c109XCJzY2hlbWUuZGVjaW1hbFBvaW50c1wiXG4gICAgICAgICAgICAgICAgW2hpbnRdPVwic2NoZW1lLmhpbnRcIlxuICAgICAgICAgICAgICAgIFttYXhdPVwic2NoZW1lLm1heFwiXG4gICAgICAgICAgICAgICAgW21pbl09XCJzY2hlbWUubWluXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2NoZW1lLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwic2NoZW1lLmxhYmVsXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2NoZW1lLmRpc2FibGVkSWYgfCBmdW5jdGlvbkNhbGxlcjI6IGZpbHRlckZvcm0udmFsdWUgOiBzY2hlbWUuZmllbGRcIlxuICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInNjaGVtZS5vcHRpb25zIHx8IGNlbGxPcHRpb25zW3NjaGVtZS5maWVsZCB8IHRvQW55XVwiXG4gICAgICAgICAgICAgICAgKG1jaGFuZ2UpPVwib25GaWx0ZXJDaGFuZ2UoZGF0YVNvdXJjZSgpLmZpbHRlcmVkRGF0YSlcIiAvPlxuICAgICAgICAgICAgICA8YXBwLXZhbGlkYXRpb24tbWVzc2FnZSBbaW5wdXRdPVwiZm9ybUZpZWxkXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGQtZmxleFwiPlxuICAgICAgICA8YXBwLWJ0biB0eXBlPVwiZGFuZ2VyLW91dGxpbmVcIiB0ZXh0PVwiQ2xlYXJcIiBpY29uPVwiZGVsZXRlXCIgKG1jbGljayk9XCJjbGVhckZpbHRlcigpXCI+PC9hcHAtYnRuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cblxuICBAaWYgKHN0YXJ0U2VjdGlvblRlbXBsYXRlKCkgfHwgc2hvd0ZpbHRlcigpIHx8IHNob3dFeHBvcnQoKSB8fCBzaG93QWRkaXRpb25hbENvbHVtbnMoKSkge1xuICAgIDxkaXYgY2xhc3M9XCIgXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93IGctMyBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1lbmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZFwiPlxuICAgICAgICAgIEBpZiAoc3RhcnRTZWN0aW9uVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwic3RhcnRTZWN0aW9uVGVtcGxhdGUoKVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKHNob3dGaWx0ZXIoKSkge1xuICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1lbmRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgIDxhcHAtYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiRmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZpbHRlckZvcm1cIlxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbc3RhY2tlZF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImZpbHRlck9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlRmllbGQ9XCJjb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxGaWVsZD1cImRlc2NyaXB0aW9uXCI+PC9hcHAtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1iYXNpYyBsYWJlbD1cIlZhbHVlXCIgdHlwZT1cInRleHRcIiBbZm9ybV09XCJmaWx0ZXJGb3JtXCIgbmFtZT1cInZhbHVlXCIgW3N0YWNrZWRdPVwiZmFsc2VcIj48L2FwcC1pbnB1dC1iYXNpYz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgIDxhcHAtYnRuIHRleHQ9XCJDbGVhclwiIHR5cGU9XCJzZWNvbmRhcnlcIiAobWNsaWNrKT1cImNsZWFyRmlsdGVyKClcIj48L2FwcC1idG4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAoc2hvd0V4cG9ydCgpIHx8IHNob3dBZGRpdGlvbmFsQ29sdW1ucygpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC1hdXRvXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHJvdy1jb2xzLWF1dG8gZy0zIGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChzaG93RXhwb3J0KCkpIHtcbiAgICAgICAgICAgICAgICAgIDxhcHAtZXhwb3J0LXRhYmxlXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZGF0YVNvdXJjZSgpPy5kYXRhPy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwibGFiZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5ZWRDb2x1bW5zXT1cImNvbXB1dGVkRGlzcGxheWVkQ29sdW1ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiZGF0YVNvdXJjZSgpPy5kYXRhXCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgQGlmIChzaG93QWRkaXRpb25hbENvbHVtbnMoKSkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgIDxmaWVsZHMtdG8tZGlzcGxheVxuICAgICAgICAgICAgICAgICAgICBbZmllbGRzXT1cImFsbFRhYmxlQ29sdW1ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgW2N1cnJlbnRDb2x1bW5zXT1cImNvbXB1dGVkRGlzcGxheWVkQ29sdW1ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgKGZpZWxkc0NoYW5nZWQpPVwiZmllbGRzQ2hhbmdlZCgkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG4gIDxkaXYgW25nQ2xhc3NdPVwieyBib3JkZXI6IGRpc3RpbmN0KCkgfVwiIGNsYXNzPVwibXQtMiByb3VuZGVkLTEwIG92ZXJmbG93LWF1dG8gdGFibGUtY29udGFpbmVyIHt7IHRhYmxlQ29udGFpbmVyQ2xhc3MoKSB9fSBcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuICAgICAgPHRhYmxlXG4gICAgICAgIG1hdC10YWJsZVxuICAgICAgICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlKCkgfHwgb2JzRGF0YVNvdXJjZSgpXCJcbiAgICAgICAgbWF0U29ydFxuICAgICAgICBjbGFzcz1cInctMTAwIGQtdGFibGUgdGFibGUgbWItMFwiXG4gICAgICAgIFttdWx0aVRlbXBsYXRlRGF0YVJvd3NdPVwiaXNFeHBhbmRhYmxlXCJcbiAgICAgICAgI3RhYmxlXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgc21hbGxlckZvbnRzLCBub3dyYXAsIGNlbnRlckNlbGxzLCBjdXJ2eSwgJ3RhYmxlLXN0cmlwZWQnOiBzdHJpcGVkIH1cIj5cbiAgICAgICAgPCEtLSBDaGVja2JveCBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibXNlbGVjdFwiIFtzdGlja3ldPVwiIXBsYWNlU2VsZWN0aW9uQXRSaWdodFwiIFtzdGlja3lFbmRdPVwicGxhY2VTZWxlY3Rpb25BdFJpZ2h0XCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICAgIEBpZiAoY3VzdG9tU2VsZWN0Q2xhc3MpIHtcbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY3VzdG9tU2VsZWN0Q2xhc3NcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gbWFzdGVyVG9nZ2xlKCkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiBpc0FsbFNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICFpc0FsbFNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY2hlY2tib3hMYWJlbCgpXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoIWN1c3RvbVNlbGVjdENsYXNzKSB7XG4gICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IG1hc3RlclRvZ2dsZSgpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgaXNBbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhaXNBbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICBbYXJpYS1sYWJlbF09XCJjaGVja2JveExhYmVsKClcIj48L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICAgIEBpZiAoY3VzdG9tU2VsZWN0Q2xhc3MpIHtcbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBjb250cm9sLWJnLWdyYXlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gc2VsZWN0aW9uLnRvZ2dsZShyb3cpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjaGVja2JveExhYmVsKHJvdylcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmICghY3VzdG9tU2VsZWN0Q2xhc3MpIHtcbiAgICAgICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gc2VsZWN0aW9uLnRvZ2dsZShyb3cpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgW2FyaWEtbGFiZWxdPVwiY2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidGhpcy5kaXNhYmxlU2VsZWN0aW9uQnlGaWVsZCB8IGZ1bmN0aW9uQ2FsbGVyMTogcm93XCI+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gQ29sdW1ucyAtLT5cbiAgICAgICAgQGZvciAoY29sIG9mIGNvbXB1dGVkRGlzcGxheWVkQ29sdW1ucygpOyB0cmFjayBjb2w7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgQHN3aXRjaCAoY29sLnR5cGUpIHtcbiAgICAgICAgICAgIDwhLS0gQ0hFQ0tCT1ggLS0+XG4gICAgICAgICAgICBAY2FzZSAoJ3RleHRhcmVhJykge1xuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInt7IGNvbC5mIHwgdG9BbnkgfX1cIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgICAgICAgICAgPGFwcC1pbmZvLWljb24gW3RleHRdPVwiY29sLmhpbnRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY29sLnQgfCBhcHBUcmFuc2xhdGUgfCBhc3luYyB9fVxuICAgICAgICAgICAgICAgICAgPC9hcHAtaW5mby1pY29uPlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgICAgICAgICAgPCEtLSA8YXBwLWlucHV0LXRkLXJmICBbKG1vZGVsKV09XCJjb2wuXCIgW3Nob3dMYWJlbF09XCJmYWxzZVwiICAvPiAtLT5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0vLyAtLT5cbiAgICAgICAgICAgIDwhLS0gQ0hFQ0tCT1ggLS0+XG4gICAgICAgICAgICBAY2FzZSAoJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInt7IGNvbC5mIHwgdG9BbnkgfX1cIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgICAgICAgICAgPGFwcC1pbmZvLWljb24gW3RleHRdPVwiY29sLmhpbnRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY29sLnQgfCBhcHBUcmFuc2xhdGUgfCBhc3luYyB9fVxuICAgICAgICAgICAgICAgICAgPC9hcHAtaW5mby1pY29uPlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgICAgICAgICAgPCEtLSBSZW1vdmluZyB0aGUgZW1wdHkgc3BhY2UgYWJvdmUgY2hlY2tib3hlcyAtLT5cbiAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtbmdtb2RlbFxuICAgICAgICAgICAgICAgICAgICBbc2hvd0xhYmVsXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0YWNrZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJjb2wuY2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgIFsobW9kZWwpXT1cInJvd1tjb2wuZl1cIlxuICAgICAgICAgICAgICAgICAgICAobWNoYW5nZSk9XCJvdXRwdXRDaGVja2JveChjb2wuZiwgcm93LCAkZXZlbnQpXCI+PC9hcHAtaW5wdXQtbmdtb2RlbD5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0vLyAtLT5cblxuICAgICAgICAgICAgPCEtLSBJbnB1dCAtLT5cbiAgICAgICAgICAgIEBjYXNlICgnaW5wdXQnKSB7XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwie3sgY29sLmYgfCB0b0FueSB9fVwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgICAgICAgICA8YXBwLWluZm8taWNvbiBbdGV4dF09XCJjb2wuaGludFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBjb2wudCB8IGFwcFRyYW5zbGF0ZSB8IGFzeW5jIH19XG4gICAgICAgICAgICAgICAgICA8L2FwcC1pbmZvLWljb24+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgICAgICAgICA8IS0tIFJlbW92aW5nIHRoZSBlbXB0eSBzcGFjZSBhYm92ZSBjaGVja2JveGVzIC0tPlxuICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1iYXNpY1xuICAgICAgICAgICAgICAgICAgICBbc2hvd0xhYmVsXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0YWNrZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImNvbC5mXCJcbiAgICAgICAgICAgICAgICAgICAgW25vRm9ybWF0XT1cInRydWVcIj48L2FwcC1pbnB1dC1iYXNpYz5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0vLyAtLT5cblxuICAgICAgICAgICAgPCEtLSBQUk9HUkVTUyBCQVIgLS0+XG4gICAgICAgICAgICBAY2FzZSAoJ3Byb2dyZXNzJykge1xuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInt7IGNvbC5mIHwgdG9BbnkgfX1cIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgICAgICAgICAgPGFwcC1pbmZvLWljb24gW3RleHRdPVwiY29sLmhpbnRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY29sLnQgfCBhcHBUcmFuc2xhdGUgfCBhc3luYyB9fVxuICAgICAgICAgICAgICAgICAgPC9hcHAtaW5mby1pY29uPlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLXN0cmlwZWQgYmctc3VjY2Vzc1wiIHJvbGU9XCJwcm9ncmVzc2JhclwiIFtuZ1N0eWxlXT1cInsgd2lkdGg6IHJvd1tjb2wuZl0gfVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IHJvd1tjb2wuZl0gfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0vLyAtLT5cblxuICAgICAgICAgICAgPCEtLSBDT0xPUiAtLT5cbiAgICAgICAgICAgIEBjYXNlICgnY29sb3InKSB7XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwie3sgY29sLmYgfCB0b0FueSB9fVwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgICAgICAgICA8YXBwLWluZm8taWNvbiBbdGV4dF09XCJjb2wuaGludFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBjb2wudCB8IGFwcFRyYW5zbGF0ZSB8IGFzeW5jIH19XG4gICAgICAgICAgICAgICAgICA8L2FwcC1pbmZvLWljb24+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3F1YXJlLTJcIiBbc3R5bGVdPVwiJ2JhY2tncm91bmQtY29sb3I6JyArIHJvd1tjb2wuZl1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0vLyAtLT5cblxuICAgICAgICAgICAgPCEtLSBCdXR0b24gLS0+XG4gICAgICAgICAgICBAY2FzZSAoJ2J1dHRvbicpIHtcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ7eyBjb2wuZiB8IHRvQW55IH19XCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCBjbGFzcz1cInRleHQtY2VudGVyXCIgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgICAgICAgICA8YXBwLWluZm8taWNvbiBbdGV4dF09XCJjb2wuaGludFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBjb2wudCB8IGFwcFRyYW5zbGF0ZSB8IGFzeW5jIH19XG4gICAgICAgICAgICAgICAgICA8L2FwcC1pbmZvLWljb24+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93OyBsZXQgaW5kZXggPSBpbmRleFwiIGNsYXNzPVwiYnRuLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgIDxhcHAtYnRuXG4gICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImNvbC5pY29uIHx8IGNvbC5idG4/Lmljb25cIlxuICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJjb2wuYnRuPy50eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgKG1jbGljayk9XCJjb2wuYWN0aW9uID8gY29sLmFjdGlvbihyb3csIGNvbC5mLCBnZXRBY3Rpb25TdGF0dXNDYWxsYmFjayhjb2wpLCBpbmRleCkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2hlbHBdPVwiY29sLmJ0bj8uaGVscFwiXG4gICAgICAgICAgICAgICAgICAgIFtzaG93SGVscEljb25dPVwiY29sLmJ0bj8uc2hvd0hlbHBJY29uXCJcbiAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiY29sLmJ0bj8ubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJjb2wuYnRuPy5sb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgW2ljb25CdG5dPVwiY29sLmJ0bj8uaWNvbkJ0blwiXG4gICAgICAgICAgICAgICAgICAgIG1jbGFzcz1cInctYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2wuYnRuPy5kaXNhYmxlZCB8fCBjb2wuYnRuPy5sb2FkaW5nXCI+PC9hcHAtYnRuPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPCEtLS8vIC0tPlxuXG4gICAgICAgICAgICA8IS0tIFN1YiBUYWJsZSAtLT5cbiAgICAgICAgICAgIEBjYXNlICgndGFibGUnKSB7XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwie3sgY29sLmYgfCB0b0FueSB9fVwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgICAgICAgICAgPGFwcC1pbmZvLWljb24gW3RleHRdPVwiY29sLmhpbnRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY29sLnQgfCBhcHBUcmFuc2xhdGUgfCBhc3luYyB9fVxuICAgICAgICAgICAgICAgICAgPC9hcHAtaW5mby1pY29uPlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsIGNsYXNzPVwidGV4dC1jZW50ZXJcIiAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmxpbmUtYmxvY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgPGFwcC1idG5cbiAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJjb2wuaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiY29sLmJ0bj8udHlwZSB8fCAnZGFyaydcIlxuICAgICAgICAgICAgICAgICAgICAgIChtY2xpY2spPVwiY29sLmFjdGlvbiA/IGNvbC5hY3Rpb24ocm93LCBjb2wuZikgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBdPVwiY29sLmJ0bj8uZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtoZWxwXT1cImNvbC5zdWJUYWJsZSB8IHRhYmxlVG9TdHJpbmc6IHJvdyB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd0hlbHBJY29uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCJjb2wuYnRuPy5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ljb25CdG5dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgbWNsYXNzPVwidy1hdXRvXCI+PC9hcHAtYnRuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8IS0tLy8gLS0+XG5cbiAgICAgICAgICAgIDwhLS0gQUNUSU9OIENPTFVNTlMgLS0+XG4gICAgICAgICAgICBAY2FzZSAoJ2J0bnMnKSB7XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwie3sgY29sLmYgfCB0b0FueSB9fVwiIHN0aWNreUVuZD5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlciBjbGFzcz1cImJ0bi1jZWxsIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8YXBwLWluZm8taWNvbiBbdGV4dF09XCJjb2wuaGludFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBjb2wudCB8IGFwcFRyYW5zbGF0ZSB8IGFzeW5jIH19XG4gICAgICAgICAgICAgICAgICA8L2FwcC1pbmZvLWljb24+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93OyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJidG4tY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBjb2wtbWQtYXV0byBjb2wtc20tYXV0byBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGJ1dHRvbiBvZiBjb2wuYnV0dG9uczsgdHJhY2sgYnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtYnRuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImJ1dHRvbi5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiYnV0dG9uLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2hlbHBdPVwiYnV0dG9uLmhlbHBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0hlbHBJY29uXT1cImJ1dHRvbi5zaG93SGVscEljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJidXR0b24udHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cF09XCJidXR0b24uZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbkJ0bl09XCIhYnV0dG9uLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWNsYXNzPVwidy1hdXRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1jbGljayk9XCJidXR0b24uYWN0aW9uKHJvdywgaSwgYnRuKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICNidG4+PC9hcHAtYnRuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPCEtLSBFRElUQUJMRSAtLT5cbiAgICAgICAgICAgIEBjYXNlICgnZWRpdGFibGUnKSB7XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwie3sgY29sLmYgfCB0b0FueSB9fVwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPGFwcC1pbmZvLWljb24gW3RleHRdPVwiY29sLmhpbnRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY29sLnQgfCBhcHBUcmFuc2xhdGUgfCBhc3luYyB9fVxuICAgICAgICAgICAgICAgICAgPC9hcHAtaW5mby1pY29uPlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW21xdWVyeVBhcmFtc109XCJjb2wubXF1ZXJ5UGFyYW1zIHwgZnVuY3Rpb25DYWxsZXIyOiByb3cgOiBjb2wuZlwiXG4gICAgICAgICAgICAgICAgICAgIFttcm91dGVyTGlua109XCJjb2wucm91dGVGb3JtYXR0ZXIgfCBmdW5jdGlvbkNhbGxlcjI6IHJvdyA6IGNvbC5mXCJcbiAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJyb3cgfCBnZXRDb2xGb3JtYXR0ZWQ6IGNvbCB8IGFzeW5jIHwgdmFsdWVPclg6ICctJ1wiPjwvYT5cbiAgICAgICAgICAgICAgICAgIDxpIChjbGljayk9XCJjb2wuYWN0aW9uID8gY29sLmFjdGlvbihyb3csIGNvbC5mKSA6IG51bGxcIiBjbGFzcz1cInBzLTEgcG9pbnRlciBmYXMgZmEtcGVuY2lsLWFsdFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPCEtLSBERUZBVUxUIC0tPlxuICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInt7IGNvbC5mIHwgdG9BbnkgfX1cIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxhcHAtaW5mby1pY29uIFt0ZXh0XT1cImNvbC5oaW50XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGNvbC50IHwgYXBwVHJhbnNsYXRlIHwgYXN5bmMgfX1cbiAgICAgICAgICAgICAgICAgIDwvYXBwLWluZm8taWNvbj5cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoY29sLnJvdXRlRm9ybWF0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoZXh0cmFjdFJvdXRlIHwgZnVuY3Rpb25DYWxsZXIyOiBjb2wgOiByb3c7IGFzIGNlbGxSb3V0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBwb2ludGVyOiBjb2wuYWN0aW9uLCBsaW5rOiBjb2wuYWN0aW9uIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbC5hY3Rpb24gPyBjb2wuYWN0aW9uKHJvdywgY29sLmYpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiY2VsbFJvdXRlLnF1ZXJ5UGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlckxpbms9XCJ7eyBjZWxsUm91dGUucm91dGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJyb3cgfCBnZXRDb2xGb3JtYXR0ZWQ6IGNvbCB8IGFzeW5jIHwgdmFsdWVPclg6ICctJ1wiPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IHBvaW50ZXI6IGNvbC5hY3Rpb24sIGxpbms6IGNvbC5hY3Rpb24gfVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbC5hY3Rpb24gPyBjb2wuYWN0aW9uKHJvdywgY29sLmYpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJyb3cgfCBnZXRDb2xGb3JtYXR0ZWQ6IGNvbCB8IGFzeW5jIHwgdmFsdWVPclg6ICctJ1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPCEtLS8vIC0tPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA8IS0tIEVYUEFOREFCTEUgQ09MVU1OLS0+XG4gICAgICAgIEBpZiAoaXNFeHBhbmRhYmxlKCkpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIl9leHBhbmRDb2xcIiBzdGlja3lFbmQ+XG4gICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGFyaWEtbGFiZWw9XCJyb3cgYWN0aW9uc1wiPiZuYnNwOzwvdGg+XG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgICAgICAgIDxhcHAtYnRuXG4gICAgICAgICAgICAgICAgICBbaWNvbkJ0bl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjbGVhclwiXG4gICAgICAgICAgICAgICAgICBbY3VzdG9tSWNvbl09XCJleHBhbmRlZEVsZW1lbnQgIT09IHJvdyA/ICdmYSBmYS1jaGV2cm9uLWRvd24nIDogJ2ZhIGZhLWNoZXZyb24tdXAnXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJleHBhbmQgcm93XCJcbiAgICAgICAgICAgICAgICAgIChtY2xpY2spPVwiZXhwYW5kZWRFbGVtZW50ID0gZXhwYW5kZWRFbGVtZW50ID09PSByb3cgPyBudWxsIDogcm93OyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj48L2FwcC1idG4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuICAgICAgICA8IS0tLy8gLS0+XG4gICAgICAgIDwhLS0gT3B0aW9ucyBDb2x1bW4gLS0+XG4gICAgICAgIEBpZiAocm93T3B0aW9ucygpPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJvcHRpb25cIiBzdGlja3lFbmQ+XG4gICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPjwvdGg+XG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCIgY2xhc3M9XCJidG4gbXMtMlwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZWxsaXBzaXMtdiBtZS0wXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiByb3dPcHRpb25zKCk7IHRyYWNrIG9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIGNsYXNzPVwie3sgb3B0aW9uLml0ZW1DbGFzcyB9fVwiIChjbGljayk9XCJvcHRpb24uYWN0aW9uKHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgb3B0aW9uLnQgfCBhcHBUcmFuc2xhdGUgfCBhc3luYyB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAocmF3Q29sdW1ucygpOyBhcyBkY29scykge1xuICAgICAgICAgIDwhLS0gRXhwYW5kZWQgQ29udGVudCBDb2x1bW4gLSBUaGUgZGV0YWlsIHJvdyBpcyBtYWRlIHVwIG9mIHRoaXMgb25lIGNvbHVtbiB0aGF0IHNwYW5zIGFjcm9zcyBhbGwgY29sdW1ucyAtLT5cbiAgICAgICAgICBAaWYgKGlzRXhwYW5kYWJsZSgpKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImV4cGFuZGVkRGV0YWlsXCI+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBbYXR0ci5jb2xzcGFuXT1cImRjb2xzPy5sZW5ndGggfHwgMVwiIFtuZ0NsYXNzXT1cInsgaGlkZUJvcmRlcjogcm93ICE9IGV4cGFuZGVkRWxlbWVudCB9XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtZWxlbWVudC1kZXRhaWxcIiBbQGRldGFpbEV4cGFuZF09XCJyb3cgPT0gZXhwYW5kZWRFbGVtZW50ID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZXhwYW5kZWRSb3dUZW1wbGF0ZSgpOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyByb3cgfSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkY29sc1wiPjwvdHI+XG4gICAgICAgICAgPHRyXG4gICAgICAgICAgICBtYXQtcm93XG4gICAgICAgICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGNvbHNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBwb2ludGVyOiBzaG93Um93UG9pbnRlcigpLCBkaXNhYmxlZDogaXNEaXNhYmxlZEZ1bmMoKSA/IGlzRGlzYWJsZWRGdW5jKCkocm93KSA6IGZhbHNlIH1cIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiaXNEaXNhYmxlZEZ1bmMoKSAmJiBpc0Rpc2FibGVkRnVuYygpKHJvdykgPyAnRGlzYWJsZWQnIDogbnVsbFwiXG4gICAgICAgICAgICAoY2xpY2spPVwicm93Q2xpY2socm93KVwiPjwvdHI+XG4gICAgICAgICAgPHRyIGNsYXNzPVwibWF0LXJvd1wiICptYXROb0RhdGFSb3c+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbCBuby1pdGVtXCIgW2F0dHIuY29sc3Bhbl09XCJkY29scz8ubGVuZ3RoIHx8IDFcIj5cbiAgICAgICAgICAgICAge3sgbm9JdGVtVHh0KCkgfCBhcHBUcmFuc2xhdGUgfCBhc3luYyB9fVxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICAgIEBpZiAoaXNFeHBhbmRhYmxlKCkpIHtcbiAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ2V4cGFuZGVkRGV0YWlsJ11cIiBjbGFzcz1cImV4cGFuZGVkLWRldGFpbC1yb3dcIiBbc3R5bGUuaGVpZ2h0LnB4XT1cIjBcIj48L3RyPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5cbiAgICBAaWYgKHNob3dQYWdlcigpKSB7XG4gICAgICA8bWF0LXBhZ2luYXRvclxuICAgICAgICBbbGVuZ3RoXT1cInJlc3VsdHNMZW5ndGgoKVwiXG4gICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwiY29tcHV0ZWRQYWdlU2l6ZU9wdGlvbnMoKVwiXG4gICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZSgpXCJcbiAgICAgICAgc2hvd0ZpcnN0TGFzdEJ1dHRvbnM+PC9tYXQtcGFnaW5hdG9yPlxuICAgIH1cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|