@unifylib/ui-lib 1.0.78 → 1.0.79
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/base-table/base-table.component.mjs +23 -22
- package/fesm2022/iq-ui-lib.mjs +33 -32
- package/fesm2022/iq-ui-lib.mjs.map +1 -1
- package/fesm2022/unifylib-ui-lib.mjs +33 -32
- package/fesm2022/unifylib-ui-lib.mjs.map +1 -1
- package/lib/components/base-table/base-table.component.d.ts +3 -3
- package/package.json +1 -1
|
@@ -21,15 +21,17 @@ import * as i0 from "@angular/core";
|
|
|
21
21
|
import * as i1 from "../../services/backend-service";
|
|
22
22
|
import * as i2 from "@ngx-translate/core";
|
|
23
23
|
import * as i3 from "../../services/trigger-form.service";
|
|
24
|
-
import * as i4 from "@angular/
|
|
25
|
-
import * as i5 from "@angular/
|
|
26
|
-
import * as i6 from "@angular/
|
|
24
|
+
import * as i4 from "@angular/cdk/layout";
|
|
25
|
+
import * as i5 from "@angular/router";
|
|
26
|
+
import * as i6 from "@angular/cdk/a11y";
|
|
27
|
+
import * as i7 from "@angular/material/button";
|
|
27
28
|
export class BaseTableComponent extends BaseUtils {
|
|
28
|
-
constructor(backendService, translateService, shareDataService, securityManager, router, liveAnnouncer) {
|
|
29
|
+
constructor(backendService, translateService, shareDataService, breakpointObserver, securityManager, router, liveAnnouncer) {
|
|
29
30
|
super();
|
|
30
31
|
this.backendService = backendService;
|
|
31
32
|
this.translateService = translateService;
|
|
32
33
|
this.shareDataService = shareDataService;
|
|
34
|
+
this.breakpointObserver = breakpointObserver;
|
|
33
35
|
this.securityManager = securityManager;
|
|
34
36
|
this.router = router;
|
|
35
37
|
this.liveAnnouncer = liveAnnouncer;
|
|
@@ -99,7 +101,6 @@ export class BaseTableComponent extends BaseUtils {
|
|
|
99
101
|
this.dataSource = new MatTableDataSource();
|
|
100
102
|
this.columns = [];
|
|
101
103
|
this.filterRequest = new FilterRequest();
|
|
102
|
-
this.initializeMobilePageSize();
|
|
103
104
|
effect(() => {
|
|
104
105
|
if (this.pageInfo.lazyLoadData !== true || this.enforceRefresh === true) {
|
|
105
106
|
this.loadData();
|
|
@@ -117,19 +118,19 @@ export class BaseTableComponent extends BaseUtils {
|
|
|
117
118
|
this.pagesCount = this.totalPagesCount;
|
|
118
119
|
this.pageIndex = this.currentPageIndex;
|
|
119
120
|
}
|
|
120
|
-
this.initializeMobilePageSize();
|
|
121
121
|
this.mobileDisplayedItems = this.pageSize;
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
this.pageSize = this.mobilePageSize;
|
|
129
|
-
if (this.reportRequest?.filterRequest) {
|
|
130
|
-
this.reportRequest.filterRequest.pageSize = this.mobilePageSize;
|
|
122
|
+
this.breakpointObserver
|
|
123
|
+
.observe(['(max-width: 768px)'])
|
|
124
|
+
.subscribe(result => {
|
|
125
|
+
if (result.matches) {
|
|
126
|
+
this.pageSize = 2;
|
|
127
|
+
this.loadData();
|
|
131
128
|
}
|
|
132
|
-
|
|
129
|
+
else {
|
|
130
|
+
this.pageSize = 10;
|
|
131
|
+
this.loadData();
|
|
132
|
+
}
|
|
133
|
+
});
|
|
133
134
|
}
|
|
134
135
|
onPageChange(event) {
|
|
135
136
|
this.pageIndex = event;
|
|
@@ -231,7 +232,7 @@ export class BaseTableComponent extends BaseUtils {
|
|
|
231
232
|
loadData(skipMobileReset = false) {
|
|
232
233
|
clearTimeout(this.timer);
|
|
233
234
|
if (!skipMobileReset) {
|
|
234
|
-
this.initializeMobilePageSize();
|
|
235
|
+
// this.initializeMobilePageSize();
|
|
235
236
|
}
|
|
236
237
|
if (!this.reportRequest.filterRequest) {
|
|
237
238
|
this.reportRequest.filterRequest = new FilterRequest(this.pageSize || this.pageInfo.pageSize);
|
|
@@ -587,8 +588,8 @@ export class BaseTableComponent extends BaseUtils {
|
|
|
587
588
|
return '';
|
|
588
589
|
return super.labelKeyByValue(column, row);
|
|
589
590
|
}
|
|
590
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseTableComponent, deps: [{ token: i1.BackendService }, { token: i2.TranslateService }, { token: i3.ShareDataService }, { token: 'securityManager' }, { token:
|
|
591
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BaseTableComponent, isStandalone: true, selector: "app-base-table", inputs: { filterFields: "filterFields", noDataFoundSvgPath: "noDataFoundSvgPath", noDataFoundTitle: "noDataFoundTitle", noDataFoundSubtitle: "noDataFoundSubtitle", noResultSvgPath: "noResultSvgPath", noResultTitle: "noResultTitle", noResultSubtitle: "noResultSubtitle", pageInfo: "pageInfo", enablePagination: "enablePagination", mobilePageSize: "mobilePageSize", mobileLoadMoreIncrement: "mobileLoadMoreIncrement", data: "data", listAction: "listAction", extraActions: "extraActions", buttonsDisplayMode: "buttonsDisplayMode", columns: "columns", filters: "filters", pathParam: "pathParam", extraButton: "extraButton", enforceRefresh: "enforceRefresh", isPending: "isPending", trigger: "trigger", reportRequest: "reportRequest", separateEndpointData: "separateEndpointData", manageablePages: "manageablePages", totalPagesCount: "totalPagesCount", currentPageIndex: "currentPageIndex", customizedData: "customizedData" }, outputs: { buttonClicked: "buttonClicked", pageChange: "pageChange", userAction: "userAction", hyperLinkAction: "hyperLinkAction", extraAction: "extraAction", selectedColumn: "selectedColumn", listActionClicked: "listActionClicked", showDialog: "showDialog", clickRoutePage: "clickRoutePage" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"flex-column baseTable\">\r\n <div class=\"flex-row flex-100\" >\r\n <div class=\"flex-column align-start flex-100\" style=\"width: 100%;\">\r\n <app-title-bar\r\n [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\r\n [subTitle]=\"(pageInfo.hideTitle || pageInfo.hideSubtitle) ? '' : pageInfo.labelsSection+'.subtitle'\"\r\n [titleMode]=\"''\"\r\n [pageInfo]=\"pageInfo\"\r\n [newAction]=\"showAddNew()\"\r\n [showExtractButton]=\"!pageInfo.hideExtractButton\"\r\n [draftSupported]=\"pageInfo.draftSupported\"\r\n [isPending]=\"isPending\"\r\n [onViewModeChange]=\"switchViewMode.bind(this)\"\r\n [buttons]=\"extraActions\"\r\n [buttonsDisplayMode]=\"buttonsDisplayMode\"\r\n (newActionClicked)=\"onAddNewAction($event)\"\r\n (extractReport)=\"extractReport($event)\"\r\n (viewModeChanged)=\"onViewModeChangedReceived($event)\"\r\n (buttonClicked)=\"buttonClicked.emit($event)\"\r\n [totalElements]=\"pageInfo.hideTitle ? undefined : totalElements\">\r\n </app-title-bar>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filter-row\" *ngIf=\"!pageInfo.hideAdvancedFilter\">\r\n <app-filter-builder\r\n *ngIf=\"!pageInfo.hideAdvancedFilter\"\r\n [pageInfo]=\"pageInfo\"\r\n [columns]=\"columns\"\r\n [filterFields]=\"filterFields\"\r\n [pendingFilters]=\"pendingFilters\"\r\n [showExportButton]=\"!pageInfo.hideExtractButton\"\r\n (filterInformation)=\"storePendingFilters($event)\"\r\n (isEmpty)=\"handleFilterEmpty($event)\"\r\n (applyFilter)=\"applyPendingFilters()\"\r\n (sortByClicked)=\"handleSortClick($event)\"\r\n (exportClicked)=\"extractReport($event)\">\r\n </app-filter-builder>\r\n\r\n <div class=\"button-group\" *ngIf=\"!pageInfo.hideExtractButton\">\r\n <button *ngIf=\"!pageInfo.hideExtractButton\"\r\n mat-flat-button\r\n type=\"button\"\r\n [matMenuTriggerFor]=\"exportMenu\"\r\n class=\"btn-export\"\r\n [attr.aria-label]=\"'export' | translate\"\r\n [attr.aria-haspopup]=\"true\"\r\n >\r\n <div class=\"button-text\">\r\n <mat-icon>file_export</mat-icon>\r\n <span>{{ 'export' | translate }}</span>\r\n <mat-icon class=\"arrow-icon\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n </button>\r\n\r\n <mat-menu #exportMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"extractReport('pdf')\">PDF</button>\r\n <button mat-menu-item (click)=\"extractReport('xlsx')\">Excel</button>\r\n <button mat-menu-item (click)=\"extractReport('csv')\">CSV</button>\r\n </mat-menu>\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"flex-row flex-100 baseTable__detailsColumn\">\r\n <div class=\"flex-100\">\r\n <div class=\"flex-row flex-100 mainTable\">\r\n <div\r\n class=\"table-container\"\r\n role=\"table\"\r\n [attr.aria-label]=\"\r\n pageInfo.labelsSection && !pageInfo.hideTitle\r\n ? (pageInfo.labelsSection + '.list_title' | translate)\r\n : null\r\n \">\r\n <div class=\"table-header\" [attr.data-sort]=\"sortState\" role=\"row\">\r\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\r\n class=\"table-header-cell\"\r\n role=\"columnheader\"\r\n [attr.aria-sort]=\"getColumnAriaSort(columnProp)\"\r\n [attr.tabindex]=\"getColumn(columnProp)?.enableSorting ? 0 : null\"\r\n [class.sortable]=\"getColumn(columnProp)?.enableSorting\"\r\n [class.first-cell]=\"i === 0\"\r\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\r\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\r\n [class.has-width]=\"getColumn(columnProp)?.width\"\r\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\"\r\n (click)=\"getColumn(columnProp)?.enableSorting && handleSortClick(columnProp)\"\r\n (keydown)=\"onSortHeaderKeydown($event, columnProp)\">\r\n <div class=\"table-header-content\">\r\n <span class=\"table-header-label\">{{ labelKey(getColumn(columnProp)) | translate }}</span>\r\n <ng-container *ngIf=\"getColumn(columnProp)?.enableSorting\">\r\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'asc'\"\r\n class=\"sort-icon sort-asc\">arrow_drop_up</mat-icon>\r\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'desc'\"\r\n class=\"sort-icon sort-desc\">arrow_drop_down</mat-icon>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"table-body\" role=\"rowgroup\">\r\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\r\n class=\"table-row\"\r\n role=\"row\"\r\n [attr.tabindex]=\"-1\"\r\n [attr.id]=\"'table-row-' + (row?.id || row?.key || '')\"\r\n [ngClass]=\"{\r\n 'table-row--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\r\n 'table-row--dark-highlight': isDarkHighlight(row)\r\n }\"\r\n (auxclick)=\"openNewTab(row)\"\r\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\r\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\r\n class=\"table-cell\"\r\n role=\"cell\"\r\n [class.first-cell]=\"i === 0\"\r\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\r\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\r\n [class.has-width]=\"getColumn(columnProp)?.width\"\r\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\">\r\n <ng-container [ngSwitch]=\"getColumn(columnProp)?.type\">\r\n <ng-container *ngSwitchCase=\"'workflowStatus'\">\r\n <button mat-button type=\"button\" class=\"wfStatus {{ getStatusDescription(row)}}\" [attr.id]=\"'table-btn-wf-'+columnProp+'-'+(row.id || row.key || '')\" [attr.tabindex]=\"-1\">{{ getStatusDescription(row) }}</button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'hyper-text'\">\r\n <span\r\n *ngIf=\"shouldRenderAsHyperLink(row); else plainHyperText\"\r\n class=\"mat-mdc-form-field-label hyper-link\"\r\n [attr.tabindex]=\"-1\"\r\n (click)=\"hyperLinkClicked(columnProp, row)\">\r\n {{ extractFieldName(row, columnProp) }}\r\n </span>\r\n <ng-template #plainHyperText>\r\n <span class=\"mat-mdc-form-field-label\">{{ extractFieldName(row, columnProp) }}</span>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <button *ngIf=\"shouldShowButton(row)\" mat-button type=\"button\" class=\"primary\" (click)=\"$event.stopPropagation(); actionButtonClicked(columnProp, row)\" [attr.id]=\"'table-btn-action-'+columnProp\">\r\n {{ labelKey(getColumn(columnProp)) + '_title' | translate }}\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'icon'\">\r\n <mat-icon [ngClass]=\"{\r\n 'mainTable__td__icon-green': row[columnProp] === 'pass',\r\n 'mainTable__td__icon-orange': row[columnProp] === 'warning',\r\n 'mainTable__td__icon-red': row[columnProp] === 'error'\r\n }\"\r\n [attr.aria-label]=\"getIconAriaLabelKey(row[columnProp]) | translate\">\r\n {{ getIcon(row[columnProp]) }}\r\n </mat-icon>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <mat-checkbox class=\"primary\" [tabIndex]=\"-1\" [checked]=\"row[columnProp]\" (click)=\"$event.stopPropagation();actionCheckedClicked(columnProp,row)\"></mat-checkbox>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <button mat-button type=\"button\" class=\"stateType {{ row[columnProp]}}\" [attr.id]=\"'table-btn-state-'+columnProp\" [attr.tabindex]=\"-1\">{{ labelKeyByValue(getColumn(columnProp), row) | translate}}</button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n {{ extractFieldName(row, columnProp) | date:'dd/MM/yyyy' }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'croppedText'\">\r\n {{ getCroppedText(row[columnProp], row[getColumn(columnProp)?.width]) }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'download'\">\r\n <mat-icon class=\"mainTable__td__icon-blue\"\r\n [attr.aria-label]=\"'BASE_TABLE.downloadAction' | translate\">system_update_alt</mat-icon>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'onOff'\">\r\n <mat-icon *ngIf=\"row[columnProp] === null\" class=\"mainTable__td__icon-darkorange\"\r\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(null) | translate\">flag</mat-icon>\r\n <mat-icon *ngIf=\"row[columnProp] === false\" class=\"mainTable__td__icon-red\"\r\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(false) | translate\">flag</mat-icon>\r\n <mat-icon *ngIf=\"row[columnProp] === true\" class=\"mainTable__td__icon-green\"\r\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(true) | translate\">flag</mat-icon>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <span *ngIf=\"row[columnProp] === null || row[columnProp] === false\">\r\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'InActive' | translate }}\r\n </span>\r\n <span *ngIf=\"row[columnProp] === true\">\r\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'Active' | translate }}\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'info'\">\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n [attr.tabindex]=\"-1\"\r\n [attr.aria-label]=\"'BASE_TABLE.rowDetails' | translate\"\r\n (click)=\"$event.stopPropagation();emitEvent(row)\"\r\n [attr.id]=\"'table-btn-info-'+row.id\">\r\n <mat-icon aria-hidden=\"true\">info</mat-icon>\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'netAmount'\">\r\n <div class=\"mainTable__td__currency\" style=\"display:inline-block;\">{{ row[getColumn(columnProp)?.currency] }}</div>\r\n <span class=\"mainTable__td__property\" style=\"display:inline-block; margin-left:6px; margin-right:6px;\">\r\n {{ extractFieldName(row, columnProp) | currency:'':'' }}</span>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'localDateTime'\">\r\n {{ extractFieldName(row, columnProp) | date : extractFormat(getColumn(columnProp)) }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\r\n <small><sup class=\"mainTable__td__currency\">{{row[getColumn(columnProp)?.currency]}}</sup></small>\r\n {{ extractFieldName(row, columnProp) | number : (getColumn(columnProp)?.digitInfo || '1.3-5') }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'listAction'\">\r\n <app-button-actions\r\n [row]=\"row\"\r\n [buttonsAction]=\"getColumn(columnProp)?.viewType === 'buttonsAction'\"\r\n [listAction]=\"listAction\"\r\n [actions]=\"listAction\"\r\n (clickedButton)=\"actionListClicked($event,row)\">\r\n </app-button-actions>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngIf=\"getColumn(columnProp)?.translate; else noTranslate\">\r\n <span\r\n [attr.tabindex]=\"-1\"\r\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\">\r\n {{ pageInfo.labelsSection + \".\" + extractFieldName(row, columnProp) | translate }}\r\n </span>\r\n </ng-container>\r\n <ng-template #noTranslate>\r\n <span\r\n [attr.tabindex]=\"-1\"\r\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\"\r\n [innerText]='extractFieldName(row, columnProp)'></span>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Mobile Card View -->\r\n <div class=\"mobile-cards-container\">\r\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\r\n class=\"mobile-card\"\r\n [attr.id]=\"'mobile-card-' + (row?.id || row?.key || '')\"\r\n [ngClass]=\"{\r\n 'mobile-card--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\r\n 'mobile-card--dark-highlight': isDarkHighlight(row)\r\n }\"\r\n (auxclick)=\"openNewTab(row)\"\r\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\r\n\r\n <!-- Mobile Card Header: ID/Name and Status -->\r\n <div class=\"mobile-card__header\">\r\n <div class=\"mobile-card__header-id\">\r\n <span class=\"mobile-card__id-text\">{{ extractFieldName(row, getMobileCardIdColumn()?.property || 'id') }}</span>\r\n </div>\r\n <div class=\"mobile-card__header-status\" *ngIf=\"getMobileCardStatusColumn()\">\r\n <button mat-button class=\"stateType {{ row[getMobileCardStatusColumn()?.property]}}\"\r\n [attr.id]=\"'mobile-btn-state-'+getMobileCardStatusColumn()?.property\">\r\n {{ labelKeyByValue(getMobileCardStatusColumn(), row) | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Divider -->\r\n <div class=\"mobile-card__divider\"></div>\r\n\r\n <!-- Mobile Card Body: Other columns -->\r\n <div class=\"mobile-card__body\">\r\n <div *ngFor=\"let column of getMobileCardColumns()\" class=\"mobile-card__row\">\r\n <div class=\"mobile-card__row-label\">\r\n <span>{{ labelKey(column) | translate }} :</span>\r\n </div>\r\n <div class=\"mobile-card__row-value\">\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <button mat-button class=\"stateType {{ row[column.property]}}\"\r\n [attr.id]=\"'mobile-btn-state-'+column.property\">\r\n {{ labelKeyByValue(column, row) | translate}}\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n {{ extractFieldName(row, column.property) | date:'dd/MM/yyyy' }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'netAmount'\">\r\n <span class=\"mobile-card__amount-currency\">{{ row[column.currency] }}</span>\r\n <span class=\"mobile-card__amount-value\">{{ extractFieldName(row, column.property) | currency:'':'' }}</span>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'localDateTime'\">\r\n {{ extractFieldName(row, column.property) | date : extractFormat(column) }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\r\n <small><sup class=\"mainTable__td__currency\">{{row[column.currency]}}</sup></small>\r\n {{ extractFieldName(row, column.property) | number : (column.digitInfo || '1.3-5') }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngIf=\"column.translate; else noTranslate\">\r\n <span>{{ pageInfo.labelsSection + \".\" + extractFieldName(row, column.property) | translate }}</span>\r\n </ng-container>\r\n <ng-template #noTranslate>\r\n <span [innerText]='extractFieldName(row, column.property)'></span>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Mobile Card Actions -->\r\n <div class=\"mobile-card__actions\" *ngIf=\"listAction && listAction.length > 0\">\r\n <app-button-actions\r\n [row]=\"row\"\r\n [buttonsAction]=\"true\"\r\n [listAction]=\"listAction\"\r\n [actions]=\"listAction\"\r\n (clickedButton)=\"actionListClicked($event,row)\">\r\n </app-button-actions>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"noDataFound\" class=\"dataNotFound flex-column\">\r\n <img *ngIf=\"getDisplaySvgPath()\" [src]=\"getDisplaySvgPath()\" class=\"dataNotFound__icon\" alt=\"No data found\" />\r\n <span class=\"dataNotFound__title\">{{ getDisplayTitle() | translate}}</span>\r\n <span class=\"dataNotFound__subtitle\">{{ getDisplaySubtitle() | translate}}</span>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"(dataSource.data?.length > 0 || customizedData) && !pageInfo.hidePagination\" class=\"main-pagination flex-row\">\r\n <ng-container *ngIf=\"enablePagination\">\r\n <div class=\"flex-column flex-100\">\r\n <app-paginator\r\n [currentPage]=\"pageIndex\"\r\n [totalItems]=\"totalElements\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"[5, 10, 25, 50]\"\r\n [mobileLoadMoreIncrement]=\"mobileLoadMoreIncrement\"\r\n [displayedItems]=\"mobileDisplayedItems || dataSource.data.length\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"\r\n (loadMore)=\"onLoadMore($event)\">\r\n </app-paginator>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;width:100%;max-width:100%;box-sizing:border-box}.baseTable{width:100%!important;max-width:100%!important;box-sizing:border-box}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column;width:100%;max-width:100%;box-sizing:border-box}.flex-100{flex:1 1 100%}.flex-49{flex:0 0 49%}.flex-50{flex:0 0 50%}.align-start{justify-content:flex-start;align-items:flex-start}.align-center{justify-content:center;align-items:center}.align-end{justify-content:flex-end;align-items:flex-end}.gap-0{gap:0}.gap-5{gap:5px}.gap-10{gap:10px}.dataNotFound{display:flex;flex-direction:column;justify-content:center;align-items:center;height:auto;min-height:280px;text-align:center;margin-top:0;padding:40px 0}.dataNotFound__icon{height:auto;width:auto;max-width:200px;max-height:200px;margin-bottom:8px;object-fit:contain}.dataNotFound__title{color:#6a6a6a;font-size:20px;font-weight:700;margin-bottom:4px}.dataNotFound__subtitle{color:#6a6a6a;font-size:20px;font-weight:400}@media (max-width: 960px){.flex-column-sm{flex-direction:column}.align-center-sm{justify-content:center;align-items:flex-start}}.filter-row{display:flex!important;flex-direction:row!important;align-items:center!important;width:100%!important;max-width:100%!important;gap:16px!important;box-sizing:border-box;margin-top:20px;margin-bottom:16px;padding:0;flex-wrap:nowrap!important;min-width:0!important;min-height:48px!important;overflow:visible!important}.filter-row app-filter-builder{flex:1 1 auto!important;min-width:0!important;max-width:none!important;width:auto!important;flex-shrink:1!important;display:flex!important;align-items:center!important;overflow:visible!important}.button-group{display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:flex-end;gap:8px!important;flex-shrink:0!important;flex-grow:0!important;flex-basis:auto!important;height:46px!important;white-space:nowrap!important;z-index:1!important}.mainTable{margin-top:0!important}.btn-apply-filter{background:#fff!important;border:1px solid #3e627b!important;border-radius:8px!important;height:46px!important;min-width:120px!important;padding:0 16px!important;box-shadow:none!important}.btn-apply-filter .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-apply-filter mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-apply-filter span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-apply-filter:hover{background:#fafafa!important}.btn-export{background:#fff!important;border:1px solid #0d4261!important;border-radius:8px!important;height:46px!important;min-width:109px!important;padding:0 16px!important;box-shadow:none!important;margin-bottom:7px!important}.btn-export .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-export mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-export .arrow-icon{font-size:16px;width:16px;height:16px;margin-left:0}.btn-export span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-export:hover{background:#fafafa!important}.arrow-icon{font-size:16px;width:16px;height:16px}@media (max-width: 1024px){.button-group{width:auto}}@media (max-width: 768px){.filter-row{flex-direction:column;align-items:stretch}.button-group{display:none!important}.btn-export{width:100%}}.table-container{width:100%;overflow:hidden;background:#f7f7f7;box-sizing:border-box;display:flex;flex-direction:column}.table-header{display:flex;align-items:center;background:#f7f7f7;border:1px solid #f0eeee;max-height:48px;height:48px;margin-bottom:16px;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-header-cell{display:flex;align-items:center;max-height:48px;height:48px;padding:8px 16px;flex:1;min-width:100px;position:sticky;top:0;background:none;z-index:10;box-sizing:border-box}.table-header-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-header-cell:last-child{border-right:none}.table-header-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-header-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}.table-header-cell.actions-cell{justify-content:center;text-align:center}.table-header-cell.actions-cell .table-header-content{justify-content:center}.table-header-cell.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.table-header-cell.sortable:hover{background:#fafafa}.table-header-content{display:flex;align-items:center;gap:8px;width:100%}.table-header-label{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.sort-icon{font-size:18px;width:18px;height:18px;color:#5c5c5c;display:flex;align-items:center;justify-content:center;transition:color .2s}.sort-icon.sort-asc,.sort-icon.sort-desc{color:#0d4261}.table-body{display:flex;flex-direction:column;gap:8px;background:#f7f7f7}.table-row{display:flex;align-items:center;min-height:48px;background:#fff;border-bottom:1px solid #f0eeee;transition:background-color .2s;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-row:hover{background:#fafafa}.table-row--highlight{background:#f0f8ff}.table-row--dark-highlight{background:#e8f4f8}.table-row .table-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-row .table-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}.table-cell{display:flex;align-items:center;min-height:48px;max-height:none;padding:8px 16px;flex:1;min-width:100px;font-family:Lusail,sans-serif;font-weight:400;font-size:16px;line-height:1.2;color:#000;box-sizing:border-box}.table-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-cell:last-child{border-right:none}.table-cell.actions-cell{justify-content:center;text-align:center}.mobile-cards-container{display:none;flex-direction:column;gap:12px;width:100%;box-sizing:border-box}.mobile-card{background:#fff;border:1px solid #f0eeee;border-radius:8px;padding:12px 20px;display:flex;flex-direction:column;gap:4px;cursor:pointer;transition:background-color .2s;box-sizing:border-box;width:100%}.mobile-card:hover{background:#fafafa}.mobile-card--highlight{background:#f0f8ff}.mobile-card--dark-highlight{background:#e8f4f8}.mobile-card__header{display:flex;align-items:center;justify-content:space-between;height:48px;width:100%;box-sizing:border-box}.mobile-card__header-id{display:flex;flex-direction:column;justify-content:center;flex:1}.mobile-card__id-text{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;text-align:left;white-space:nowrap}.mobile-card__header-status{display:flex;align-items:center;justify-content:flex-end;flex-shrink:0}.mobile-card__divider{height:.347px;width:100%;background:#f0eeee;margin:0;flex-shrink:0}.mobile-card__body{display:flex;flex-direction:column;gap:0;width:100%;box-sizing:border-box}.mobile-card__row{display:flex;align-items:center;justify-content:space-between;height:40px;width:100%;overflow:hidden;box-sizing:border-box}.mobile-card__row-label{display:flex;flex-direction:column;justify-content:center;flex-shrink:0}.mobile-card__row-label span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__row-value{display:flex;flex-direction:column;justify-content:center;flex-shrink:0;text-align:right}.mobile-card__row-value span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__amount-currency{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;display:inline-block}.mobile-card__amount-value{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;display:inline-block;margin-left:6px;margin-right:6px}.mobile-card__actions{border-top:1px solid #f0eeee;padding-top:8px;margin-top:4px;display:flex;align-items:center;justify-content:center;min-height:48px;max-height:48px;width:100%;box-sizing:border-box}@media (max-width: 768px){.table-container{display:none}.mobile-cards-container{display:flex}}@media (min-width: 769px){.mobile-cards-container{display:none}.table-container{display:flex}}:host ::ng-deep button.mat-mdc-button.stateType,:host ::ng-deep button.mdc-button.stateType{white-space:normal!important;height:auto!important;min-height:28px!important;max-width:100%!important;align-items:center!important;justify-content:center!important;cursor:default!important}:host ::ng-deep button.mat-mdc-button.stateType .mdc-button__label,:host ::ng-deep button.mdc-button.stateType .mdc-button__label{white-space:normal!important;display:-webkit-box!important;-webkit-box-orient:vertical!important;-webkit-line-clamp:2!important;line-clamp:2!important;overflow:hidden!important;word-break:break-word!important;line-height:1.25!important;max-width:100%!important;text-align:center!important}@media (max-width: 450px){.mobile-card__header{flex-direction:column;justify-content:flex-start;height:auto;width:100%;box-sizing:border-box;gap:8px}}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: CurrencyPipe, name: "currency" }, { kind: "ngmodule", type: NgxPaginationModule }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ButtonActionsComponent, selector: "app-button-actions", inputs: ["actions", "disabled", "buttonsAction", "listAction", "row"], outputs: ["clickedButton"] }, { kind: "component", type: TitleBarComponent, selector: "app-title-bar", inputs: ["pageTitle", "showExtractButton", "totalElements", "titleMode", "pageInfo", "subTitle", "statusDesc", "newAction", "extraButton", "showDetails", "showImport", "showButton", "extraData", "titleCorporateAdmin", "hideBackButton", "buttons", "buttonsDisplayMode", "draftSupported", "isPending", "onViewModeChange"], outputs: ["newActionClicked", "extraButtonClicked", "extractReport", "buttonClicked", "viewModeChanged"] }, { kind: "component", type: PaginatorComponent, selector: "app-paginator", inputs: ["currentPage", "totalItems", "pageSize", "pageSizeOptions", "mobileLoadMoreIncrement", "displayedItems"], outputs: ["pageChange", "pageSizeChange", "loadMore"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "component", type: 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: "component", type: FilterBuilderComponent, selector: "app-filter-builder", inputs: ["columns", "isChecked", "filterFields", "pageInfo", "pendingFilters", "showExportButton"], outputs: ["filterInformation", "isEmpty", "applyFilter", "sortByClicked", "exportClicked"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: 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: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }], animations: [] }); }
|
|
591
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseTableComponent, deps: [{ token: i1.BackendService }, { token: i2.TranslateService }, { token: i3.ShareDataService }, { token: i4.BreakpointObserver }, { token: 'securityManager' }, { token: i5.Router }, { token: i6.LiveAnnouncer }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
592
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BaseTableComponent, isStandalone: true, selector: "app-base-table", inputs: { filterFields: "filterFields", noDataFoundSvgPath: "noDataFoundSvgPath", noDataFoundTitle: "noDataFoundTitle", noDataFoundSubtitle: "noDataFoundSubtitle", noResultSvgPath: "noResultSvgPath", noResultTitle: "noResultTitle", noResultSubtitle: "noResultSubtitle", pageInfo: "pageInfo", enablePagination: "enablePagination", mobilePageSize: "mobilePageSize", mobileLoadMoreIncrement: "mobileLoadMoreIncrement", data: "data", listAction: "listAction", extraActions: "extraActions", buttonsDisplayMode: "buttonsDisplayMode", columns: "columns", filters: "filters", pathParam: "pathParam", extraButton: "extraButton", enforceRefresh: "enforceRefresh", isPending: "isPending", trigger: "trigger", reportRequest: "reportRequest", separateEndpointData: "separateEndpointData", manageablePages: "manageablePages", totalPagesCount: "totalPagesCount", currentPageIndex: "currentPageIndex", customizedData: "customizedData" }, outputs: { buttonClicked: "buttonClicked", pageChange: "pageChange", userAction: "userAction", hyperLinkAction: "hyperLinkAction", extraAction: "extraAction", selectedColumn: "selectedColumn", listActionClicked: "listActionClicked", showDialog: "showDialog", clickRoutePage: "clickRoutePage" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"flex-column baseTable\">\r\n <div class=\"flex-row flex-100\" >\r\n <div class=\"flex-column align-start flex-100\" style=\"width: 100%;\">\r\n <app-title-bar\r\n [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\r\n [subTitle]=\"(pageInfo.hideTitle || pageInfo.hideSubtitle) ? '' : pageInfo.labelsSection+'.subtitle'\"\r\n [titleMode]=\"''\"\r\n [pageInfo]=\"pageInfo\"\r\n [newAction]=\"showAddNew()\"\r\n [showExtractButton]=\"!pageInfo.hideExtractButton\"\r\n [draftSupported]=\"pageInfo.draftSupported\"\r\n [isPending]=\"isPending\"\r\n [onViewModeChange]=\"switchViewMode.bind(this)\"\r\n [buttons]=\"extraActions\"\r\n [buttonsDisplayMode]=\"buttonsDisplayMode\"\r\n (newActionClicked)=\"onAddNewAction($event)\"\r\n (extractReport)=\"extractReport($event)\"\r\n (viewModeChanged)=\"onViewModeChangedReceived($event)\"\r\n (buttonClicked)=\"buttonClicked.emit($event)\"\r\n [totalElements]=\"pageInfo.hideTitle ? undefined : totalElements\">\r\n </app-title-bar>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filter-row\" *ngIf=\"!pageInfo.hideAdvancedFilter\">\r\n <app-filter-builder\r\n *ngIf=\"!pageInfo.hideAdvancedFilter\"\r\n [pageInfo]=\"pageInfo\"\r\n [columns]=\"columns\"\r\n [filterFields]=\"filterFields\"\r\n [pendingFilters]=\"pendingFilters\"\r\n [showExportButton]=\"!pageInfo.hideExtractButton\"\r\n (filterInformation)=\"storePendingFilters($event)\"\r\n (isEmpty)=\"handleFilterEmpty($event)\"\r\n (applyFilter)=\"applyPendingFilters()\"\r\n (sortByClicked)=\"handleSortClick($event)\"\r\n (exportClicked)=\"extractReport($event)\">\r\n </app-filter-builder>\r\n\r\n <div class=\"button-group\" *ngIf=\"!pageInfo.hideExtractButton\">\r\n <button *ngIf=\"!pageInfo.hideExtractButton\"\r\n mat-flat-button\r\n type=\"button\"\r\n [matMenuTriggerFor]=\"exportMenu\"\r\n class=\"btn-export\"\r\n [attr.aria-label]=\"'export' | translate\"\r\n [attr.aria-haspopup]=\"true\"\r\n >\r\n <div class=\"button-text\">\r\n <mat-icon>file_export</mat-icon>\r\n <span>{{ 'export' | translate }}</span>\r\n <mat-icon class=\"arrow-icon\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n </button>\r\n\r\n <mat-menu #exportMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"extractReport('pdf')\">PDF</button>\r\n <button mat-menu-item (click)=\"extractReport('xlsx')\">Excel</button>\r\n <button mat-menu-item (click)=\"extractReport('csv')\">CSV</button>\r\n </mat-menu>\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"flex-row flex-100 baseTable__detailsColumn\">\r\n <div class=\"flex-100\">\r\n <div class=\"flex-row flex-100 mainTable\">\r\n <div\r\n class=\"table-container\"\r\n role=\"table\"\r\n [attr.aria-label]=\"\r\n pageInfo.labelsSection && !pageInfo.hideTitle\r\n ? (pageInfo.labelsSection + '.list_title' | translate)\r\n : null\r\n \">\r\n <div class=\"table-header\" [attr.data-sort]=\"sortState\" role=\"row\">\r\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\r\n class=\"table-header-cell\"\r\n role=\"columnheader\"\r\n [attr.aria-sort]=\"getColumnAriaSort(columnProp)\"\r\n [attr.tabindex]=\"getColumn(columnProp)?.enableSorting ? 0 : null\"\r\n [class.sortable]=\"getColumn(columnProp)?.enableSorting\"\r\n [class.first-cell]=\"i === 0\"\r\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\r\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\r\n [class.has-width]=\"getColumn(columnProp)?.width\"\r\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\"\r\n (click)=\"getColumn(columnProp)?.enableSorting && handleSortClick(columnProp)\"\r\n (keydown)=\"onSortHeaderKeydown($event, columnProp)\">\r\n <div class=\"table-header-content\">\r\n <span class=\"table-header-label\">{{ labelKey(getColumn(columnProp)) | translate }}</span>\r\n <ng-container *ngIf=\"getColumn(columnProp)?.enableSorting\">\r\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'asc'\"\r\n class=\"sort-icon sort-asc\">arrow_drop_up</mat-icon>\r\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'desc'\"\r\n class=\"sort-icon sort-desc\">arrow_drop_down</mat-icon>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"table-body\" role=\"rowgroup\">\r\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\r\n class=\"table-row\"\r\n role=\"row\"\r\n [attr.tabindex]=\"-1\"\r\n [attr.id]=\"'table-row-' + (row?.id || row?.key || '')\"\r\n [ngClass]=\"{\r\n 'table-row--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\r\n 'table-row--dark-highlight': isDarkHighlight(row)\r\n }\"\r\n (auxclick)=\"openNewTab(row)\"\r\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\r\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\r\n class=\"table-cell\"\r\n role=\"cell\"\r\n [class.first-cell]=\"i === 0\"\r\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\r\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\r\n [class.has-width]=\"getColumn(columnProp)?.width\"\r\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\">\r\n <ng-container [ngSwitch]=\"getColumn(columnProp)?.type\">\r\n <ng-container *ngSwitchCase=\"'workflowStatus'\">\r\n <button mat-button type=\"button\" class=\"wfStatus {{ getStatusDescription(row)}}\" [attr.id]=\"'table-btn-wf-'+columnProp+'-'+(row.id || row.key || '')\" [attr.tabindex]=\"-1\">{{ getStatusDescription(row) }}</button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'hyper-text'\">\r\n <span\r\n *ngIf=\"shouldRenderAsHyperLink(row); else plainHyperText\"\r\n class=\"mat-mdc-form-field-label hyper-link\"\r\n [attr.tabindex]=\"-1\"\r\n (click)=\"hyperLinkClicked(columnProp, row)\">\r\n {{ extractFieldName(row, columnProp) }}\r\n </span>\r\n <ng-template #plainHyperText>\r\n <span class=\"mat-mdc-form-field-label\">{{ extractFieldName(row, columnProp) }}</span>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <button *ngIf=\"shouldShowButton(row)\" mat-button type=\"button\" class=\"primary\" (click)=\"$event.stopPropagation(); actionButtonClicked(columnProp, row)\" [attr.id]=\"'table-btn-action-'+columnProp\">\r\n {{ labelKey(getColumn(columnProp)) + '_title' | translate }}\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'icon'\">\r\n <mat-icon [ngClass]=\"{\r\n 'mainTable__td__icon-green': row[columnProp] === 'pass',\r\n 'mainTable__td__icon-orange': row[columnProp] === 'warning',\r\n 'mainTable__td__icon-red': row[columnProp] === 'error'\r\n }\"\r\n [attr.aria-label]=\"getIconAriaLabelKey(row[columnProp]) | translate\">\r\n {{ getIcon(row[columnProp]) }}\r\n </mat-icon>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <mat-checkbox class=\"primary\" [tabIndex]=\"-1\" [checked]=\"row[columnProp]\" (click)=\"$event.stopPropagation();actionCheckedClicked(columnProp,row)\"></mat-checkbox>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <button mat-button type=\"button\" class=\"stateType {{ row[columnProp]}}\" [attr.id]=\"'table-btn-state-'+columnProp\" [attr.tabindex]=\"-1\">{{ labelKeyByValue(getColumn(columnProp), row) | translate}}</button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n {{ extractFieldName(row, columnProp) | date:'dd/MM/yyyy' }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'croppedText'\">\r\n {{ getCroppedText(row[columnProp], row[getColumn(columnProp)?.width]) }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'download'\">\r\n <mat-icon class=\"mainTable__td__icon-blue\"\r\n [attr.aria-label]=\"'BASE_TABLE.downloadAction' | translate\">system_update_alt</mat-icon>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'onOff'\">\r\n <mat-icon *ngIf=\"row[columnProp] === null\" class=\"mainTable__td__icon-darkorange\"\r\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(null) | translate\">flag</mat-icon>\r\n <mat-icon *ngIf=\"row[columnProp] === false\" class=\"mainTable__td__icon-red\"\r\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(false) | translate\">flag</mat-icon>\r\n <mat-icon *ngIf=\"row[columnProp] === true\" class=\"mainTable__td__icon-green\"\r\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(true) | translate\">flag</mat-icon>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <span *ngIf=\"row[columnProp] === null || row[columnProp] === false\">\r\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'InActive' | translate }}\r\n </span>\r\n <span *ngIf=\"row[columnProp] === true\">\r\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'Active' | translate }}\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'info'\">\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n [attr.tabindex]=\"-1\"\r\n [attr.aria-label]=\"'BASE_TABLE.rowDetails' | translate\"\r\n (click)=\"$event.stopPropagation();emitEvent(row)\"\r\n [attr.id]=\"'table-btn-info-'+row.id\">\r\n <mat-icon aria-hidden=\"true\">info</mat-icon>\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'netAmount'\">\r\n <div class=\"mainTable__td__currency\" style=\"display:inline-block;\">{{ row[getColumn(columnProp)?.currency] }}</div>\r\n <span class=\"mainTable__td__property\" style=\"display:inline-block; margin-left:6px; margin-right:6px;\">\r\n {{ extractFieldName(row, columnProp) | currency:'':'' }}</span>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'localDateTime'\">\r\n {{ extractFieldName(row, columnProp) | date : extractFormat(getColumn(columnProp)) }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\r\n <small><sup class=\"mainTable__td__currency\">{{row[getColumn(columnProp)?.currency]}}</sup></small>\r\n {{ extractFieldName(row, columnProp) | number : (getColumn(columnProp)?.digitInfo || '1.3-5') }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'listAction'\">\r\n <app-button-actions\r\n [row]=\"row\"\r\n [buttonsAction]=\"getColumn(columnProp)?.viewType === 'buttonsAction'\"\r\n [listAction]=\"listAction\"\r\n [actions]=\"listAction\"\r\n (clickedButton)=\"actionListClicked($event,row)\">\r\n </app-button-actions>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngIf=\"getColumn(columnProp)?.translate; else noTranslate\">\r\n <span\r\n [attr.tabindex]=\"-1\"\r\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\">\r\n {{ pageInfo.labelsSection + \".\" + extractFieldName(row, columnProp) | translate }}\r\n </span>\r\n </ng-container>\r\n <ng-template #noTranslate>\r\n <span\r\n [attr.tabindex]=\"-1\"\r\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\"\r\n [innerText]='extractFieldName(row, columnProp)'></span>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Mobile Card View -->\r\n <div class=\"mobile-cards-container\">\r\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\r\n class=\"mobile-card\"\r\n [attr.id]=\"'mobile-card-' + (row?.id || row?.key || '')\"\r\n [ngClass]=\"{\r\n 'mobile-card--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\r\n 'mobile-card--dark-highlight': isDarkHighlight(row)\r\n }\"\r\n (auxclick)=\"openNewTab(row)\"\r\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\r\n\r\n <!-- Mobile Card Header: ID/Name and Status -->\r\n <div class=\"mobile-card__header\">\r\n <div class=\"mobile-card__header-id\">\r\n <span class=\"mobile-card__id-text\">{{ extractFieldName(row, getMobileCardIdColumn()?.property || 'id') }}</span>\r\n </div>\r\n <div class=\"mobile-card__header-status\" *ngIf=\"getMobileCardStatusColumn()\">\r\n <button mat-button class=\"stateType {{ row[getMobileCardStatusColumn()?.property]}}\"\r\n [attr.id]=\"'mobile-btn-state-'+getMobileCardStatusColumn()?.property\">\r\n {{ labelKeyByValue(getMobileCardStatusColumn(), row) | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Divider -->\r\n <div class=\"mobile-card__divider\"></div>\r\n\r\n <!-- Mobile Card Body: Other columns -->\r\n <div class=\"mobile-card__body\">\r\n <div *ngFor=\"let column of getMobileCardColumns()\" class=\"mobile-card__row\">\r\n <div class=\"mobile-card__row-label\">\r\n <span>{{ labelKey(column) | translate }} :</span>\r\n </div>\r\n <div class=\"mobile-card__row-value\">\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <button mat-button class=\"stateType {{ row[column.property]}}\"\r\n [attr.id]=\"'mobile-btn-state-'+column.property\">\r\n {{ labelKeyByValue(column, row) | translate}}\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n {{ extractFieldName(row, column.property) | date:'dd/MM/yyyy' }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'netAmount'\">\r\n <span class=\"mobile-card__amount-currency\">{{ row[column.currency] }}</span>\r\n <span class=\"mobile-card__amount-value\">{{ extractFieldName(row, column.property) | currency:'':'' }}</span>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'localDateTime'\">\r\n {{ extractFieldName(row, column.property) | date : extractFormat(column) }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\r\n <small><sup class=\"mainTable__td__currency\">{{row[column.currency]}}</sup></small>\r\n {{ extractFieldName(row, column.property) | number : (column.digitInfo || '1.3-5') }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngIf=\"column.translate; else noTranslate\">\r\n <span>{{ pageInfo.labelsSection + \".\" + extractFieldName(row, column.property) | translate }}</span>\r\n </ng-container>\r\n <ng-template #noTranslate>\r\n <span [innerText]='extractFieldName(row, column.property)'></span>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Mobile Card Actions -->\r\n <div class=\"mobile-card__actions\" *ngIf=\"listAction && listAction.length > 0\">\r\n <app-button-actions\r\n [row]=\"row\"\r\n [buttonsAction]=\"true\"\r\n [listAction]=\"listAction\"\r\n [actions]=\"listAction\"\r\n (clickedButton)=\"actionListClicked($event,row)\">\r\n </app-button-actions>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"noDataFound\" class=\"dataNotFound flex-column\">\r\n <img *ngIf=\"getDisplaySvgPath()\" [src]=\"getDisplaySvgPath()\" class=\"dataNotFound__icon\" alt=\"No data found\" />\r\n <span class=\"dataNotFound__title\">{{ getDisplayTitle() | translate}}</span>\r\n <span class=\"dataNotFound__subtitle\">{{ getDisplaySubtitle() | translate}}</span>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"(dataSource.data?.length > 0 || customizedData) && !pageInfo.hidePagination\" class=\"main-pagination flex-row\">\r\n <ng-container *ngIf=\"enablePagination\">\r\n <div class=\"flex-column flex-100\">\r\n <app-paginator\r\n [currentPage]=\"pageIndex\"\r\n [totalItems]=\"totalElements\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"[5, 10, 25, 50]\"\r\n [mobileLoadMoreIncrement]=\"mobileLoadMoreIncrement\"\r\n [displayedItems]=\"mobileDisplayedItems || dataSource.data.length\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"\r\n (loadMore)=\"onLoadMore($event)\">\r\n </app-paginator>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;width:100%;max-width:100%;box-sizing:border-box}.baseTable{width:100%!important;max-width:100%!important;box-sizing:border-box}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column;width:100%;max-width:100%;box-sizing:border-box}.flex-100{flex:1 1 100%}.flex-49{flex:0 0 49%}.flex-50{flex:0 0 50%}.align-start{justify-content:flex-start;align-items:flex-start}.align-center{justify-content:center;align-items:center}.align-end{justify-content:flex-end;align-items:flex-end}.gap-0{gap:0}.gap-5{gap:5px}.gap-10{gap:10px}.dataNotFound{display:flex;flex-direction:column;justify-content:center;align-items:center;height:auto;min-height:280px;text-align:center;margin-top:0;padding:40px 0}.dataNotFound__icon{height:auto;width:auto;max-width:200px;max-height:200px;margin-bottom:8px;object-fit:contain}.dataNotFound__title{color:#6a6a6a;font-size:20px;font-weight:700;margin-bottom:4px}.dataNotFound__subtitle{color:#6a6a6a;font-size:20px;font-weight:400}@media (max-width: 960px){.flex-column-sm{flex-direction:column}.align-center-sm{justify-content:center;align-items:flex-start}}.filter-row{display:flex!important;flex-direction:row!important;align-items:center!important;width:100%!important;max-width:100%!important;gap:16px!important;box-sizing:border-box;margin-top:20px;margin-bottom:16px;padding:0;flex-wrap:nowrap!important;min-width:0!important;min-height:48px!important;overflow:visible!important}.filter-row app-filter-builder{flex:1 1 auto!important;min-width:0!important;max-width:none!important;width:auto!important;flex-shrink:1!important;display:flex!important;align-items:center!important;overflow:visible!important}.button-group{display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:flex-end;gap:8px!important;flex-shrink:0!important;flex-grow:0!important;flex-basis:auto!important;height:46px!important;white-space:nowrap!important;z-index:1!important}.mainTable{margin-top:0!important}.btn-apply-filter{background:#fff!important;border:1px solid #3e627b!important;border-radius:8px!important;height:46px!important;min-width:120px!important;padding:0 16px!important;box-shadow:none!important}.btn-apply-filter .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-apply-filter mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-apply-filter span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-apply-filter:hover{background:#fafafa!important}.btn-export{background:#fff!important;border:1px solid #0d4261!important;border-radius:8px!important;height:46px!important;min-width:109px!important;padding:0 16px!important;box-shadow:none!important;margin-bottom:7px!important}.btn-export .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-export mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-export .arrow-icon{font-size:16px;width:16px;height:16px;margin-left:0}.btn-export span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-export:hover{background:#fafafa!important}.arrow-icon{font-size:16px;width:16px;height:16px}@media (max-width: 1024px){.button-group{width:auto}}@media (max-width: 768px){.filter-row{flex-direction:column;align-items:stretch}.button-group{display:none!important}.btn-export{width:100%}}.table-container{width:100%;overflow:hidden;background:#f7f7f7;box-sizing:border-box;display:flex;flex-direction:column}.table-header{display:flex;align-items:center;background:#f7f7f7;border:1px solid #f0eeee;max-height:48px;height:48px;margin-bottom:16px;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-header-cell{display:flex;align-items:center;max-height:48px;height:48px;padding:8px 16px;flex:1;min-width:100px;position:sticky;top:0;background:none;z-index:10;box-sizing:border-box}.table-header-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-header-cell:last-child{border-right:none}.table-header-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-header-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}.table-header-cell.actions-cell{justify-content:center;text-align:center}.table-header-cell.actions-cell .table-header-content{justify-content:center}.table-header-cell.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.table-header-cell.sortable:hover{background:#fafafa}.table-header-content{display:flex;align-items:center;gap:8px;width:100%}.table-header-label{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.sort-icon{font-size:18px;width:18px;height:18px;color:#5c5c5c;display:flex;align-items:center;justify-content:center;transition:color .2s}.sort-icon.sort-asc,.sort-icon.sort-desc{color:#0d4261}.table-body{display:flex;flex-direction:column;gap:8px;background:#f7f7f7}.table-row{display:flex;align-items:center;min-height:48px;background:#fff;border-bottom:1px solid #f0eeee;transition:background-color .2s;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-row:hover{background:#fafafa}.table-row--highlight{background:#f0f8ff}.table-row--dark-highlight{background:#e8f4f8}.table-row .table-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-row .table-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}.table-cell{display:flex;align-items:center;min-height:48px;max-height:none;padding:8px 16px;flex:1;min-width:100px;font-family:Lusail,sans-serif;font-weight:400;font-size:16px;line-height:1.2;color:#000;box-sizing:border-box}.table-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-cell:last-child{border-right:none}.table-cell.actions-cell{justify-content:center;text-align:center}.mobile-cards-container{display:none;flex-direction:column;gap:12px;width:100%;box-sizing:border-box}.mobile-card{background:#fff;border:1px solid #f0eeee;border-radius:8px;padding:12px 20px;display:flex;flex-direction:column;gap:4px;cursor:pointer;transition:background-color .2s;box-sizing:border-box;width:100%}.mobile-card:hover{background:#fafafa}.mobile-card--highlight{background:#f0f8ff}.mobile-card--dark-highlight{background:#e8f4f8}.mobile-card__header{display:flex;align-items:center;justify-content:space-between;height:48px;width:100%;box-sizing:border-box}.mobile-card__header-id{display:flex;flex-direction:column;justify-content:center;flex:1}.mobile-card__id-text{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;text-align:left;white-space:nowrap}.mobile-card__header-status{display:flex;align-items:center;justify-content:flex-end;flex-shrink:0}.mobile-card__divider{height:.347px;width:100%;background:#f0eeee;margin:0;flex-shrink:0}.mobile-card__body{display:flex;flex-direction:column;gap:0;width:100%;box-sizing:border-box}.mobile-card__row{display:flex;align-items:center;justify-content:space-between;height:40px;width:100%;overflow:hidden;box-sizing:border-box}.mobile-card__row-label{display:flex;flex-direction:column;justify-content:center;flex-shrink:0}.mobile-card__row-label span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__row-value{display:flex;flex-direction:column;justify-content:center;flex-shrink:0;text-align:right}.mobile-card__row-value span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__amount-currency{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;display:inline-block}.mobile-card__amount-value{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;display:inline-block;margin-left:6px;margin-right:6px}.mobile-card__actions{border-top:1px solid #f0eeee;padding-top:8px;margin-top:4px;display:flex;align-items:center;justify-content:center;min-height:48px;max-height:48px;width:100%;box-sizing:border-box}@media (max-width: 768px){.table-container{display:none}.mobile-cards-container{display:flex}}@media (min-width: 769px){.mobile-cards-container{display:none}.table-container{display:flex}}:host ::ng-deep button.mat-mdc-button.stateType,:host ::ng-deep button.mdc-button.stateType{white-space:normal!important;height:auto!important;min-height:28px!important;max-width:100%!important;align-items:center!important;justify-content:center!important;cursor:default!important}:host ::ng-deep button.mat-mdc-button.stateType .mdc-button__label,:host ::ng-deep button.mdc-button.stateType .mdc-button__label{white-space:normal!important;display:-webkit-box!important;-webkit-box-orient:vertical!important;-webkit-line-clamp:2!important;line-clamp:2!important;overflow:hidden!important;word-break:break-word!important;line-height:1.25!important;max-width:100%!important;text-align:center!important}@media (max-width: 450px){.mobile-card__header{flex-direction:column;justify-content:flex-start;height:auto;width:100%;box-sizing:border-box;gap:8px}}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: CurrencyPipe, name: "currency" }, { kind: "ngmodule", type: NgxPaginationModule }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ButtonActionsComponent, selector: "app-button-actions", inputs: ["actions", "disabled", "buttonsAction", "listAction", "row"], outputs: ["clickedButton"] }, { kind: "component", type: TitleBarComponent, selector: "app-title-bar", inputs: ["pageTitle", "showExtractButton", "totalElements", "titleMode", "pageInfo", "subTitle", "statusDesc", "newAction", "extraButton", "showDetails", "showImport", "showButton", "extraData", "titleCorporateAdmin", "hideBackButton", "buttons", "buttonsDisplayMode", "draftSupported", "isPending", "onViewModeChange"], outputs: ["newActionClicked", "extraButtonClicked", "extractReport", "buttonClicked", "viewModeChanged"] }, { kind: "component", type: PaginatorComponent, selector: "app-paginator", inputs: ["currentPage", "totalItems", "pageSize", "pageSizeOptions", "mobileLoadMoreIncrement", "displayedItems"], outputs: ["pageChange", "pageSizeChange", "loadMore"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "component", type: 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: "component", type: FilterBuilderComponent, selector: "app-filter-builder", inputs: ["columns", "isChecked", "filterFields", "pageInfo", "pendingFilters", "showExportButton"], outputs: ["filterInformation", "isEmpty", "applyFilter", "sortByClicked", "exportClicked"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: 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: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }], animations: [] }); }
|
|
592
593
|
}
|
|
593
594
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseTableComponent, decorators: [{
|
|
594
595
|
type: Component,
|
|
@@ -619,10 +620,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
619
620
|
MatMenu,
|
|
620
621
|
MatMenuItem,
|
|
621
622
|
], template: "<div class=\"flex-column baseTable\">\r\n <div class=\"flex-row flex-100\" >\r\n <div class=\"flex-column align-start flex-100\" style=\"width: 100%;\">\r\n <app-title-bar\r\n [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\r\n [subTitle]=\"(pageInfo.hideTitle || pageInfo.hideSubtitle) ? '' : pageInfo.labelsSection+'.subtitle'\"\r\n [titleMode]=\"''\"\r\n [pageInfo]=\"pageInfo\"\r\n [newAction]=\"showAddNew()\"\r\n [showExtractButton]=\"!pageInfo.hideExtractButton\"\r\n [draftSupported]=\"pageInfo.draftSupported\"\r\n [isPending]=\"isPending\"\r\n [onViewModeChange]=\"switchViewMode.bind(this)\"\r\n [buttons]=\"extraActions\"\r\n [buttonsDisplayMode]=\"buttonsDisplayMode\"\r\n (newActionClicked)=\"onAddNewAction($event)\"\r\n (extractReport)=\"extractReport($event)\"\r\n (viewModeChanged)=\"onViewModeChangedReceived($event)\"\r\n (buttonClicked)=\"buttonClicked.emit($event)\"\r\n [totalElements]=\"pageInfo.hideTitle ? undefined : totalElements\">\r\n </app-title-bar>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filter-row\" *ngIf=\"!pageInfo.hideAdvancedFilter\">\r\n <app-filter-builder\r\n *ngIf=\"!pageInfo.hideAdvancedFilter\"\r\n [pageInfo]=\"pageInfo\"\r\n [columns]=\"columns\"\r\n [filterFields]=\"filterFields\"\r\n [pendingFilters]=\"pendingFilters\"\r\n [showExportButton]=\"!pageInfo.hideExtractButton\"\r\n (filterInformation)=\"storePendingFilters($event)\"\r\n (isEmpty)=\"handleFilterEmpty($event)\"\r\n (applyFilter)=\"applyPendingFilters()\"\r\n (sortByClicked)=\"handleSortClick($event)\"\r\n (exportClicked)=\"extractReport($event)\">\r\n </app-filter-builder>\r\n\r\n <div class=\"button-group\" *ngIf=\"!pageInfo.hideExtractButton\">\r\n <button *ngIf=\"!pageInfo.hideExtractButton\"\r\n mat-flat-button\r\n type=\"button\"\r\n [matMenuTriggerFor]=\"exportMenu\"\r\n class=\"btn-export\"\r\n [attr.aria-label]=\"'export' | translate\"\r\n [attr.aria-haspopup]=\"true\"\r\n >\r\n <div class=\"button-text\">\r\n <mat-icon>file_export</mat-icon>\r\n <span>{{ 'export' | translate }}</span>\r\n <mat-icon class=\"arrow-icon\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n </button>\r\n\r\n <mat-menu #exportMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"extractReport('pdf')\">PDF</button>\r\n <button mat-menu-item (click)=\"extractReport('xlsx')\">Excel</button>\r\n <button mat-menu-item (click)=\"extractReport('csv')\">CSV</button>\r\n </mat-menu>\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"flex-row flex-100 baseTable__detailsColumn\">\r\n <div class=\"flex-100\">\r\n <div class=\"flex-row flex-100 mainTable\">\r\n <div\r\n class=\"table-container\"\r\n role=\"table\"\r\n [attr.aria-label]=\"\r\n pageInfo.labelsSection && !pageInfo.hideTitle\r\n ? (pageInfo.labelsSection + '.list_title' | translate)\r\n : null\r\n \">\r\n <div class=\"table-header\" [attr.data-sort]=\"sortState\" role=\"row\">\r\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\r\n class=\"table-header-cell\"\r\n role=\"columnheader\"\r\n [attr.aria-sort]=\"getColumnAriaSort(columnProp)\"\r\n [attr.tabindex]=\"getColumn(columnProp)?.enableSorting ? 0 : null\"\r\n [class.sortable]=\"getColumn(columnProp)?.enableSorting\"\r\n [class.first-cell]=\"i === 0\"\r\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\r\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\r\n [class.has-width]=\"getColumn(columnProp)?.width\"\r\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\"\r\n (click)=\"getColumn(columnProp)?.enableSorting && handleSortClick(columnProp)\"\r\n (keydown)=\"onSortHeaderKeydown($event, columnProp)\">\r\n <div class=\"table-header-content\">\r\n <span class=\"table-header-label\">{{ labelKey(getColumn(columnProp)) | translate }}</span>\r\n <ng-container *ngIf=\"getColumn(columnProp)?.enableSorting\">\r\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'asc'\"\r\n class=\"sort-icon sort-asc\">arrow_drop_up</mat-icon>\r\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'desc'\"\r\n class=\"sort-icon sort-desc\">arrow_drop_down</mat-icon>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"table-body\" role=\"rowgroup\">\r\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\r\n class=\"table-row\"\r\n role=\"row\"\r\n [attr.tabindex]=\"-1\"\r\n [attr.id]=\"'table-row-' + (row?.id || row?.key || '')\"\r\n [ngClass]=\"{\r\n 'table-row--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\r\n 'table-row--dark-highlight': isDarkHighlight(row)\r\n }\"\r\n (auxclick)=\"openNewTab(row)\"\r\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\r\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\r\n class=\"table-cell\"\r\n role=\"cell\"\r\n [class.first-cell]=\"i === 0\"\r\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\r\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\r\n [class.has-width]=\"getColumn(columnProp)?.width\"\r\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\">\r\n <ng-container [ngSwitch]=\"getColumn(columnProp)?.type\">\r\n <ng-container *ngSwitchCase=\"'workflowStatus'\">\r\n <button mat-button type=\"button\" class=\"wfStatus {{ getStatusDescription(row)}}\" [attr.id]=\"'table-btn-wf-'+columnProp+'-'+(row.id || row.key || '')\" [attr.tabindex]=\"-1\">{{ getStatusDescription(row) }}</button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'hyper-text'\">\r\n <span\r\n *ngIf=\"shouldRenderAsHyperLink(row); else plainHyperText\"\r\n class=\"mat-mdc-form-field-label hyper-link\"\r\n [attr.tabindex]=\"-1\"\r\n (click)=\"hyperLinkClicked(columnProp, row)\">\r\n {{ extractFieldName(row, columnProp) }}\r\n </span>\r\n <ng-template #plainHyperText>\r\n <span class=\"mat-mdc-form-field-label\">{{ extractFieldName(row, columnProp) }}</span>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <button *ngIf=\"shouldShowButton(row)\" mat-button type=\"button\" class=\"primary\" (click)=\"$event.stopPropagation(); actionButtonClicked(columnProp, row)\" [attr.id]=\"'table-btn-action-'+columnProp\">\r\n {{ labelKey(getColumn(columnProp)) + '_title' | translate }}\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'icon'\">\r\n <mat-icon [ngClass]=\"{\r\n 'mainTable__td__icon-green': row[columnProp] === 'pass',\r\n 'mainTable__td__icon-orange': row[columnProp] === 'warning',\r\n 'mainTable__td__icon-red': row[columnProp] === 'error'\r\n }\"\r\n [attr.aria-label]=\"getIconAriaLabelKey(row[columnProp]) | translate\">\r\n {{ getIcon(row[columnProp]) }}\r\n </mat-icon>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <mat-checkbox class=\"primary\" [tabIndex]=\"-1\" [checked]=\"row[columnProp]\" (click)=\"$event.stopPropagation();actionCheckedClicked(columnProp,row)\"></mat-checkbox>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <button mat-button type=\"button\" class=\"stateType {{ row[columnProp]}}\" [attr.id]=\"'table-btn-state-'+columnProp\" [attr.tabindex]=\"-1\">{{ labelKeyByValue(getColumn(columnProp), row) | translate}}</button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n {{ extractFieldName(row, columnProp) | date:'dd/MM/yyyy' }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'croppedText'\">\r\n {{ getCroppedText(row[columnProp], row[getColumn(columnProp)?.width]) }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'download'\">\r\n <mat-icon class=\"mainTable__td__icon-blue\"\r\n [attr.aria-label]=\"'BASE_TABLE.downloadAction' | translate\">system_update_alt</mat-icon>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'onOff'\">\r\n <mat-icon *ngIf=\"row[columnProp] === null\" class=\"mainTable__td__icon-darkorange\"\r\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(null) | translate\">flag</mat-icon>\r\n <mat-icon *ngIf=\"row[columnProp] === false\" class=\"mainTable__td__icon-red\"\r\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(false) | translate\">flag</mat-icon>\r\n <mat-icon *ngIf=\"row[columnProp] === true\" class=\"mainTable__td__icon-green\"\r\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(true) | translate\">flag</mat-icon>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <span *ngIf=\"row[columnProp] === null || row[columnProp] === false\">\r\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'InActive' | translate }}\r\n </span>\r\n <span *ngIf=\"row[columnProp] === true\">\r\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'Active' | translate }}\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'info'\">\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n [attr.tabindex]=\"-1\"\r\n [attr.aria-label]=\"'BASE_TABLE.rowDetails' | translate\"\r\n (click)=\"$event.stopPropagation();emitEvent(row)\"\r\n [attr.id]=\"'table-btn-info-'+row.id\">\r\n <mat-icon aria-hidden=\"true\">info</mat-icon>\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'netAmount'\">\r\n <div class=\"mainTable__td__currency\" style=\"display:inline-block;\">{{ row[getColumn(columnProp)?.currency] }}</div>\r\n <span class=\"mainTable__td__property\" style=\"display:inline-block; margin-left:6px; margin-right:6px;\">\r\n {{ extractFieldName(row, columnProp) | currency:'':'' }}</span>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'localDateTime'\">\r\n {{ extractFieldName(row, columnProp) | date : extractFormat(getColumn(columnProp)) }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\r\n <small><sup class=\"mainTable__td__currency\">{{row[getColumn(columnProp)?.currency]}}</sup></small>\r\n {{ extractFieldName(row, columnProp) | number : (getColumn(columnProp)?.digitInfo || '1.3-5') }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'listAction'\">\r\n <app-button-actions\r\n [row]=\"row\"\r\n [buttonsAction]=\"getColumn(columnProp)?.viewType === 'buttonsAction'\"\r\n [listAction]=\"listAction\"\r\n [actions]=\"listAction\"\r\n (clickedButton)=\"actionListClicked($event,row)\">\r\n </app-button-actions>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngIf=\"getColumn(columnProp)?.translate; else noTranslate\">\r\n <span\r\n [attr.tabindex]=\"-1\"\r\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\">\r\n {{ pageInfo.labelsSection + \".\" + extractFieldName(row, columnProp) | translate }}\r\n </span>\r\n </ng-container>\r\n <ng-template #noTranslate>\r\n <span\r\n [attr.tabindex]=\"-1\"\r\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\"\r\n [innerText]='extractFieldName(row, columnProp)'></span>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Mobile Card View -->\r\n <div class=\"mobile-cards-container\">\r\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\r\n class=\"mobile-card\"\r\n [attr.id]=\"'mobile-card-' + (row?.id || row?.key || '')\"\r\n [ngClass]=\"{\r\n 'mobile-card--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\r\n 'mobile-card--dark-highlight': isDarkHighlight(row)\r\n }\"\r\n (auxclick)=\"openNewTab(row)\"\r\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\r\n\r\n <!-- Mobile Card Header: ID/Name and Status -->\r\n <div class=\"mobile-card__header\">\r\n <div class=\"mobile-card__header-id\">\r\n <span class=\"mobile-card__id-text\">{{ extractFieldName(row, getMobileCardIdColumn()?.property || 'id') }}</span>\r\n </div>\r\n <div class=\"mobile-card__header-status\" *ngIf=\"getMobileCardStatusColumn()\">\r\n <button mat-button class=\"stateType {{ row[getMobileCardStatusColumn()?.property]}}\"\r\n [attr.id]=\"'mobile-btn-state-'+getMobileCardStatusColumn()?.property\">\r\n {{ labelKeyByValue(getMobileCardStatusColumn(), row) | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Divider -->\r\n <div class=\"mobile-card__divider\"></div>\r\n\r\n <!-- Mobile Card Body: Other columns -->\r\n <div class=\"mobile-card__body\">\r\n <div *ngFor=\"let column of getMobileCardColumns()\" class=\"mobile-card__row\">\r\n <div class=\"mobile-card__row-label\">\r\n <span>{{ labelKey(column) | translate }} :</span>\r\n </div>\r\n <div class=\"mobile-card__row-value\">\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <button mat-button class=\"stateType {{ row[column.property]}}\"\r\n [attr.id]=\"'mobile-btn-state-'+column.property\">\r\n {{ labelKeyByValue(column, row) | translate}}\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n {{ extractFieldName(row, column.property) | date:'dd/MM/yyyy' }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'netAmount'\">\r\n <span class=\"mobile-card__amount-currency\">{{ row[column.currency] }}</span>\r\n <span class=\"mobile-card__amount-value\">{{ extractFieldName(row, column.property) | currency:'':'' }}</span>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'localDateTime'\">\r\n {{ extractFieldName(row, column.property) | date : extractFormat(column) }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\r\n <small><sup class=\"mainTable__td__currency\">{{row[column.currency]}}</sup></small>\r\n {{ extractFieldName(row, column.property) | number : (column.digitInfo || '1.3-5') }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngIf=\"column.translate; else noTranslate\">\r\n <span>{{ pageInfo.labelsSection + \".\" + extractFieldName(row, column.property) | translate }}</span>\r\n </ng-container>\r\n <ng-template #noTranslate>\r\n <span [innerText]='extractFieldName(row, column.property)'></span>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Mobile Card Actions -->\r\n <div class=\"mobile-card__actions\" *ngIf=\"listAction && listAction.length > 0\">\r\n <app-button-actions\r\n [row]=\"row\"\r\n [buttonsAction]=\"true\"\r\n [listAction]=\"listAction\"\r\n [actions]=\"listAction\"\r\n (clickedButton)=\"actionListClicked($event,row)\">\r\n </app-button-actions>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"noDataFound\" class=\"dataNotFound flex-column\">\r\n <img *ngIf=\"getDisplaySvgPath()\" [src]=\"getDisplaySvgPath()\" class=\"dataNotFound__icon\" alt=\"No data found\" />\r\n <span class=\"dataNotFound__title\">{{ getDisplayTitle() | translate}}</span>\r\n <span class=\"dataNotFound__subtitle\">{{ getDisplaySubtitle() | translate}}</span>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"(dataSource.data?.length > 0 || customizedData) && !pageInfo.hidePagination\" class=\"main-pagination flex-row\">\r\n <ng-container *ngIf=\"enablePagination\">\r\n <div class=\"flex-column flex-100\">\r\n <app-paginator\r\n [currentPage]=\"pageIndex\"\r\n [totalItems]=\"totalElements\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"[5, 10, 25, 50]\"\r\n [mobileLoadMoreIncrement]=\"mobileLoadMoreIncrement\"\r\n [displayedItems]=\"mobileDisplayedItems || dataSource.data.length\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"\r\n (loadMore)=\"onLoadMore($event)\">\r\n </app-paginator>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;width:100%;max-width:100%;box-sizing:border-box}.baseTable{width:100%!important;max-width:100%!important;box-sizing:border-box}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column;width:100%;max-width:100%;box-sizing:border-box}.flex-100{flex:1 1 100%}.flex-49{flex:0 0 49%}.flex-50{flex:0 0 50%}.align-start{justify-content:flex-start;align-items:flex-start}.align-center{justify-content:center;align-items:center}.align-end{justify-content:flex-end;align-items:flex-end}.gap-0{gap:0}.gap-5{gap:5px}.gap-10{gap:10px}.dataNotFound{display:flex;flex-direction:column;justify-content:center;align-items:center;height:auto;min-height:280px;text-align:center;margin-top:0;padding:40px 0}.dataNotFound__icon{height:auto;width:auto;max-width:200px;max-height:200px;margin-bottom:8px;object-fit:contain}.dataNotFound__title{color:#6a6a6a;font-size:20px;font-weight:700;margin-bottom:4px}.dataNotFound__subtitle{color:#6a6a6a;font-size:20px;font-weight:400}@media (max-width: 960px){.flex-column-sm{flex-direction:column}.align-center-sm{justify-content:center;align-items:flex-start}}.filter-row{display:flex!important;flex-direction:row!important;align-items:center!important;width:100%!important;max-width:100%!important;gap:16px!important;box-sizing:border-box;margin-top:20px;margin-bottom:16px;padding:0;flex-wrap:nowrap!important;min-width:0!important;min-height:48px!important;overflow:visible!important}.filter-row app-filter-builder{flex:1 1 auto!important;min-width:0!important;max-width:none!important;width:auto!important;flex-shrink:1!important;display:flex!important;align-items:center!important;overflow:visible!important}.button-group{display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:flex-end;gap:8px!important;flex-shrink:0!important;flex-grow:0!important;flex-basis:auto!important;height:46px!important;white-space:nowrap!important;z-index:1!important}.mainTable{margin-top:0!important}.btn-apply-filter{background:#fff!important;border:1px solid #3e627b!important;border-radius:8px!important;height:46px!important;min-width:120px!important;padding:0 16px!important;box-shadow:none!important}.btn-apply-filter .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-apply-filter mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-apply-filter span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-apply-filter:hover{background:#fafafa!important}.btn-export{background:#fff!important;border:1px solid #0d4261!important;border-radius:8px!important;height:46px!important;min-width:109px!important;padding:0 16px!important;box-shadow:none!important;margin-bottom:7px!important}.btn-export .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-export mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-export .arrow-icon{font-size:16px;width:16px;height:16px;margin-left:0}.btn-export span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-export:hover{background:#fafafa!important}.arrow-icon{font-size:16px;width:16px;height:16px}@media (max-width: 1024px){.button-group{width:auto}}@media (max-width: 768px){.filter-row{flex-direction:column;align-items:stretch}.button-group{display:none!important}.btn-export{width:100%}}.table-container{width:100%;overflow:hidden;background:#f7f7f7;box-sizing:border-box;display:flex;flex-direction:column}.table-header{display:flex;align-items:center;background:#f7f7f7;border:1px solid #f0eeee;max-height:48px;height:48px;margin-bottom:16px;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-header-cell{display:flex;align-items:center;max-height:48px;height:48px;padding:8px 16px;flex:1;min-width:100px;position:sticky;top:0;background:none;z-index:10;box-sizing:border-box}.table-header-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-header-cell:last-child{border-right:none}.table-header-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-header-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}.table-header-cell.actions-cell{justify-content:center;text-align:center}.table-header-cell.actions-cell .table-header-content{justify-content:center}.table-header-cell.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.table-header-cell.sortable:hover{background:#fafafa}.table-header-content{display:flex;align-items:center;gap:8px;width:100%}.table-header-label{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.sort-icon{font-size:18px;width:18px;height:18px;color:#5c5c5c;display:flex;align-items:center;justify-content:center;transition:color .2s}.sort-icon.sort-asc,.sort-icon.sort-desc{color:#0d4261}.table-body{display:flex;flex-direction:column;gap:8px;background:#f7f7f7}.table-row{display:flex;align-items:center;min-height:48px;background:#fff;border-bottom:1px solid #f0eeee;transition:background-color .2s;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-row:hover{background:#fafafa}.table-row--highlight{background:#f0f8ff}.table-row--dark-highlight{background:#e8f4f8}.table-row .table-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-row .table-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}.table-cell{display:flex;align-items:center;min-height:48px;max-height:none;padding:8px 16px;flex:1;min-width:100px;font-family:Lusail,sans-serif;font-weight:400;font-size:16px;line-height:1.2;color:#000;box-sizing:border-box}.table-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-cell:last-child{border-right:none}.table-cell.actions-cell{justify-content:center;text-align:center}.mobile-cards-container{display:none;flex-direction:column;gap:12px;width:100%;box-sizing:border-box}.mobile-card{background:#fff;border:1px solid #f0eeee;border-radius:8px;padding:12px 20px;display:flex;flex-direction:column;gap:4px;cursor:pointer;transition:background-color .2s;box-sizing:border-box;width:100%}.mobile-card:hover{background:#fafafa}.mobile-card--highlight{background:#f0f8ff}.mobile-card--dark-highlight{background:#e8f4f8}.mobile-card__header{display:flex;align-items:center;justify-content:space-between;height:48px;width:100%;box-sizing:border-box}.mobile-card__header-id{display:flex;flex-direction:column;justify-content:center;flex:1}.mobile-card__id-text{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;text-align:left;white-space:nowrap}.mobile-card__header-status{display:flex;align-items:center;justify-content:flex-end;flex-shrink:0}.mobile-card__divider{height:.347px;width:100%;background:#f0eeee;margin:0;flex-shrink:0}.mobile-card__body{display:flex;flex-direction:column;gap:0;width:100%;box-sizing:border-box}.mobile-card__row{display:flex;align-items:center;justify-content:space-between;height:40px;width:100%;overflow:hidden;box-sizing:border-box}.mobile-card__row-label{display:flex;flex-direction:column;justify-content:center;flex-shrink:0}.mobile-card__row-label span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__row-value{display:flex;flex-direction:column;justify-content:center;flex-shrink:0;text-align:right}.mobile-card__row-value span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__amount-currency{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;display:inline-block}.mobile-card__amount-value{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;display:inline-block;margin-left:6px;margin-right:6px}.mobile-card__actions{border-top:1px solid #f0eeee;padding-top:8px;margin-top:4px;display:flex;align-items:center;justify-content:center;min-height:48px;max-height:48px;width:100%;box-sizing:border-box}@media (max-width: 768px){.table-container{display:none}.mobile-cards-container{display:flex}}@media (min-width: 769px){.mobile-cards-container{display:none}.table-container{display:flex}}:host ::ng-deep button.mat-mdc-button.stateType,:host ::ng-deep button.mdc-button.stateType{white-space:normal!important;height:auto!important;min-height:28px!important;max-width:100%!important;align-items:center!important;justify-content:center!important;cursor:default!important}:host ::ng-deep button.mat-mdc-button.stateType .mdc-button__label,:host ::ng-deep button.mdc-button.stateType .mdc-button__label{white-space:normal!important;display:-webkit-box!important;-webkit-box-orient:vertical!important;-webkit-line-clamp:2!important;line-clamp:2!important;overflow:hidden!important;word-break:break-word!important;line-height:1.25!important;max-width:100%!important;text-align:center!important}@media (max-width: 450px){.mobile-card__header{flex-direction:column;justify-content:flex-start;height:auto;width:100%;box-sizing:border-box;gap:8px}}\n"] }]
|
|
622
|
-
}], ctorParameters: () => [{ type: i1.BackendService }, { type: i2.TranslateService }, { type: i3.ShareDataService }, { type: undefined, decorators: [{
|
|
623
|
+
}], ctorParameters: () => [{ type: i1.BackendService }, { type: i2.TranslateService }, { type: i3.ShareDataService }, { type: i4.BreakpointObserver }, { type: undefined, decorators: [{
|
|
623
624
|
type: Inject,
|
|
624
625
|
args: ['securityManager']
|
|
625
|
-
}] }, { type:
|
|
626
|
+
}] }, { type: i5.Router }, { type: i6.LiveAnnouncer }], propDecorators: { filterFields: [{
|
|
626
627
|
type: Input
|
|
627
628
|
}], noDataFoundSvgPath: [{
|
|
628
629
|
type: Input
|
|
@@ -697,4 +698,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
697
698
|
}], clickRoutePage: [{
|
|
698
699
|
type: Output
|
|
699
700
|
}] } });
|
|
700
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtdGFibGUvYmFzZS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtdGFibGUvYmFzZS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFJTCxNQUFNLEVBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFDLGVBQWUsRUFBbUIsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsYUFBYSxFQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUNMLFlBQVksRUFDWixRQUFRLEVBQ1IsV0FBVyxFQUNYLE9BQU8sRUFDUCxPQUFPLEVBQ1AsSUFBSSxFQUNKLE9BQU8sRUFDUCxRQUFRLEVBQ1IsWUFBWSxFQUNaLGVBQWUsRUFDaEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDbkYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sNENBQTRDLENBQUM7QUFFbEYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBR2pELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLEVBRUwsZUFBZSxFQUVmLHNCQUFzQixFQUV0QixtQkFBbUIsRUFFcEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFHcEUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBR3hFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSw0REFBNEQsQ0FBQztBQUVsRyxPQUFPLEVBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7QUFxQzVFLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxTQUFTO0lBd0kvQyxZQUNZLGNBQThCLEVBQy9CLGdCQUFrQyxFQUNsQyxnQkFBa0MsRUFDTixlQUFvQixFQUMvQyxNQUFjLEVBQ0wsYUFBNEI7UUFFL0MsS0FBSyxFQUFFLENBQUM7UUFQRSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDL0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ04sb0JBQWUsR0FBZixlQUFlLENBQUs7UUFDL0MsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNMLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBN0lqRCxVQUFLLEdBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3hDLGVBQVUsR0FBRyxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBQyxDQUFDO1FBQ25DLFdBQU0sR0FBRztZQUNQLFlBQVksRUFBRSxFQUFFO1lBQ2hCLFdBQVcsRUFBRSxDQUFDO1lBQ2QsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSztTQUNsQyxDQUFDO1FBQ0ssWUFBTyxHQUFXLENBQUMsQ0FBQztRQUNwQixtQkFBYyxHQUFZLElBQUksQ0FBQztRQUMvQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFDM0IsV0FBTSxHQUFRO1lBQ25CLGFBQWEsRUFBRSxHQUFHO1lBQ2xCLFNBQVMsRUFBRSxHQUFHO1lBQ2QsMkJBQTJCLEVBQUUsWUFBWTtZQUN6QyxxQkFBcUIsRUFBRSxNQUFNO1lBQzdCLHdCQUF3QixFQUFFLGdCQUFnQjtTQUMzQyxDQUFDO1FBS08scUJBQWdCLEdBQUcsa0JBQWtCLENBQUM7UUFDdEMsd0JBQW1CLEdBQUcscUJBQXFCLENBQUM7UUFFNUMsa0JBQWEsR0FBRyxlQUFlLENBQUM7UUFDaEMscUJBQWdCLEdBQUcsa0JBQWtCLENBQUM7UUFDL0Msa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxhQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2QseUJBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLHlCQUFvQixHQUFhLEVBQUUsQ0FBQztRQUM1QywwQkFBcUIsR0FBVSxFQUFFLENBQUM7UUFDbEMsbUJBQWMsR0FBVSxFQUFFLENBQUM7UUFDM0IsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUNmLGtCQUFhLEdBQWtCLElBQUksYUFBYSxFQUFFLENBQUM7UUFHbEQsYUFBUSxHQUFhLGVBQWUsQ0FBQztRQUc5QyxxQkFBZ0IsR0FBWSxJQUFJLENBQUM7UUFHakMsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFHM0IsNEJBQXVCLEdBQVcsQ0FBQyxDQUFDO1FBSXBDLGVBQVUsR0FBMkIsRUFBRSxDQUFDO1FBR3hDLGlCQUFZLEdBQTJCLEVBQUUsQ0FBQztRQUcxQyx1QkFBa0IsR0FBd0IsVUFBVSxDQUFDO1FBTXJELFlBQU8sR0FBYSxFQUFFLENBQUM7UUFNdkIsZ0JBQVcsR0FBNEIsRUFBRSxDQUFDO1FBRWhDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQXdCLENBQUM7UUFHbkUsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFHaEMsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUczQixZQUFPLEdBQVksS0FBSyxDQUFDO1FBR3pCLGtCQUFhLEdBQWtCLElBQUksYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBS3JELG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBRWpDLG9CQUFlLEdBQVcsQ0FBQyxDQUFDO1FBRTVCLHFCQUFnQixHQUFXLENBQUMsQ0FBQztRQUc3QixlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFJbkQsZUFBVSxHQUFzQyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUV4RixvQkFBZSxHQUFzQyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUc3RixnQkFBVyxHQUFzQyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUd6RixtQkFBYyxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBRzlELHNCQUFpQixHQUFpRixJQUFJLFlBQVksRUFJOUcsQ0FBQztRQUdMLGVBQVUsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQVN4RCxxQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQiwyQkFBc0IsR0FBRyxDQUFDLENBQUM7UUFJM0IsbUJBQWMsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQThJNUQsY0FBUyxHQUFRLEVBQUUsQ0FBQztRQStNcEIsZUFBVSxHQUFRLEVBQUUsQ0FBQTtRQUNwQixlQUFVLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFuVjFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUV6QyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUVoQyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDeEUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUVMLENBQUM7SUFFRCxXQUFXO0lBQ1gsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ3BFLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsSUFBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ3pDLENBQUM7UUFFRCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM1QyxDQUFDO0lBRU8sUUFBUTtRQUNkLE9BQU8sT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDO0lBQ25FLENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDM0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3BDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDbEUsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQWE7UUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUdELGdCQUFnQixDQUFDLE9BQVksRUFBRSxRQUFnQjtRQUM3QyxJQUFJLFFBQVEsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1QixPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5RSxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQztZQUMxRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGdCQUFnQixFQUFHLENBQUM7Z0JBQzVELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztnQkFDdEUsT0FBUSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLENBQUM7aUJBQUssQ0FBQztnQkFDTCxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRCxJQUFJLG1CQUFtQjtRQUNyQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUVELFNBQVMsQ0FBQyxRQUFnQjtRQUN4QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsUUFBZ0I7UUFDL0IsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUMvQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGFBQWEsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ25GLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxlQUFlLENBQUMsUUFBZ0I7UUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUQsSUFBSSxhQUFhLEdBQW1CLEtBQUssQ0FBQztRQUUxQyxJQUFJLGlCQUFpQixLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ2hDLGFBQWEsR0FBRyxNQUFNLENBQUM7UUFDekIsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLENBQUM7WUFDaEIsTUFBTSxFQUFFLFFBQVE7WUFDaEIsU0FBUyxFQUFFLGFBQWE7U0FDekIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG1CQUFtQixDQUFDLEtBQW9CLEVBQUUsVUFBa0I7UUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDL0MsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDL0MsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsaUJBQWlCLENBQUMsVUFBa0I7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDL0MsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNqQixPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUlELE9BQU8sQ0FBQyxTQUFpQjtRQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzFELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsS0FBYTtRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLDBDQUEwQztRQUM5RCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzFELElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELFVBQVUsQ0FBQyxXQUFtQjtRQUM1QixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNuRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMxQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMxRCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVPLFFBQVEsQ0FBQyxrQkFBMkIsS0FBSztRQUMvQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXpCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNsQyxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlGLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQzVELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE9BQU8sR0FBRztnQkFDekMsR0FBRyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUM7Z0JBQ3JDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUN2RTthQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDMUQsSUFBSSxJQUFJLENBQUMsb0JBQW9CLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1lBQ2pELGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELENBQUM7YUFBTSxJQUFHLElBQUksQ0FBQyxhQUFhLElBQUksU0FBUyxFQUFDLENBQUM7WUFDekMsT0FBTztRQUNULENBQUM7YUFBTSxJQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQzFELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDN0ksSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQzlELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEdBQUc7b0JBQ3pDLEdBQUcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLElBQUksRUFBRSxDQUFDO29CQUNyQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FDdkU7aUJBQ0YsQ0FBQztnQkFDQSxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUM3RyxNQUFNLGdCQUFnQixHQUFHLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuRCxJQUFJLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUMzQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFBO3dCQUN2RSxJQUFJLENBQUMsV0FBVyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO3dCQUNwRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7d0JBQzdDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7d0JBQ3BFLElBQUksQ0FBQyxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQzt3QkFDckQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDckUsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3ZFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLGdCQUFnQixDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUM7d0JBQ3pELElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO3dCQUM3QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO3dCQUN4RCxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztvQkFDcEQsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsRUFDQyxHQUFHLENBQUMsQ0FBQztRQUNiLENBQUM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDbkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsSUFBSSxPQUFPLENBQUM7UUFDNUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsRUFBRTtZQUM5RSxPQUFPO1lBQ1AsS0FBSztTQUNOLENBQUMsQ0FBQztRQUNILEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxPQUFZO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCxZQUFZLENBQUMsT0FBWTtRQUN2QixPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUE7SUFDMUIsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUM1RSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFFLG1DQUFtQztZQUMvRyxJQUFJLENBQUMsVUFBVSxHQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7WUFDckMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO1lBQzVFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUNsRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFDRCxjQUFjLENBQUMsWUFBaUIsRUFBRSxXQUFtQixFQUFFO1FBQ3JELE9BQU8sWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUNySCxDQUFDO0lBRUQsU0FBUyxDQUFDLE9BQVk7UUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUF3QjtRQUNwQyxPQUFPLE1BQU0sRUFBRSxNQUFNLElBQUksa0JBQWtCLENBQUM7SUFDOUMsQ0FBQztJQUVELGlCQUFpQixDQUFDLFVBQWdDLEVBQUUsT0FBWTtRQUM5RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUMsTUFBTSxFQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBa0IsRUFBRSxPQUFZO1FBQy9DLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDO1FBQ25DLE1BQU0sQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNuQyxDQUFDO0lBR0QsYUFBYSxDQUFDLE9BQVk7UUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFRO1FBQ25CLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNqRCxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUM7WUFFckUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXhELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUV0RSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMxQixXQUFXLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUU7Z0JBQ3hELEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUU7YUFDN0IsQ0FBQyxDQUFDO1lBQ0gsT0FBTztRQUNULENBQUM7UUFDRCx1Q0FBdUM7UUFDdkMsdUJBQXVCO1FBQ3ZCLHFCQUFxQjtRQUNyQiwrQkFBK0I7SUFDakMsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFHO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNqRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDO0lBQ0gsQ0FBQztJQUVELHlCQUF5QixDQUFDLFNBQWtCO1FBQzFDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELGNBQWMsQ0FBQyxTQUFrQjtRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUFXO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUNyRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFDN0IsRUFBRSxXQUFXLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFHLElBQUksRUFBRyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFbEUsdUNBQXVDO1FBQ3ZDLHVCQUF1QjtRQUN2QixxQkFBcUI7UUFDckIsK0JBQStCO0lBQ2pDLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBRTtJQUNyQyxDQUFDO0lBRUQsb0JBQW9CLENBQUMsTUFBVztRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVoQyxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBSUQsV0FBVztRQUNULElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsSUFBRyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssS0FBSyxFQUFDLENBQUM7WUFDN0IsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTzthQUNULE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDO2FBQ3pDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2xCLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hCLEtBQUssRUFBRSxDQUFDO2dCQUNSLE9BQU87WUFDVCxDQUFDO2lCQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDL0IsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBRztRQUNiLElBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsR0FBRztRQUNiLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxTQUFpQixFQUFFLElBQVM7UUFDOUMsSUFBSSxTQUFTLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVPLG9CQUFvQixDQUFDLElBQVM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDakQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDaEUsTUFBTSxHQUFHLEdBQUcsR0FBRyxRQUFRLE9BQU8sQ0FBQztRQUUvQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDcEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMxQixXQUFXLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUU7U0FDekQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGVBQWUsQ0FBQyxTQUFpQixFQUFFLElBQVM7UUFDbEQsTUFBTSxNQUFNLEdBQUcsbUJBQW1CLENBQUM7UUFDbkMsTUFBTSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDN0IsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbkIsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxhQUFhLENBQUMsVUFBZTtRQUMzQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztRQUNuRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEdBQUcsYUFBYSxFQUNwSCxTQUFTLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsT0FBTyxDQUFDLE1BQWM7UUFDcEIsUUFBUSxNQUFNLEVBQUUsQ0FBQztZQUNmLEtBQUssTUFBTSxDQUFDLENBQUMsT0FBTyxjQUFjLENBQUM7WUFDbkMsS0FBSyxTQUFTLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQztZQUNqQyxLQUFLLE9BQU8sQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsTUFBYztRQUNoQyxRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxNQUFNO2dCQUNULE9BQU8sMkJBQTJCLENBQUM7WUFDckMsS0FBSyxTQUFTO2dCQUNaLE9BQU8sOEJBQThCLENBQUM7WUFDeEMsS0FBSyxPQUFPO2dCQUNWLE9BQU8sNEJBQTRCLENBQUM7WUFDdEM7Z0JBQ0UsT0FBTyw4QkFBOEIsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztJQUVELHdCQUF3QixDQUFDLEtBQWlDO1FBQ3hELElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ25CLE9BQU8sNkJBQTZCLENBQUM7UUFDdkMsQ0FBQztRQUNELElBQUksS0FBSyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3BCLE9BQU8sK0JBQStCLENBQUM7UUFDekMsQ0FBQztRQUNELE9BQU8sOEJBQThCLENBQUM7SUFDeEMsQ0FBQztJQUVELG9CQUFvQixDQUFDLFFBQWdCLEVBQUUsT0FBTztRQUM1QyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBR0QsZUFBZSxDQUFDLEdBQVE7UUFDdEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUM7UUFDbkQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUM7UUFFbEQsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3hELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUU5QyxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDOUIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQ3pELENBQUM7SUFDSixDQUFDO0lBRUQsdUJBQXVCLENBQUMsT0FBWTtRQUNsQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQztRQUNuRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQztRQUVsRCxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDNUQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRTlDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBR0QsWUFBWSxDQUFDLE1BQVk7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPO1lBQ3RDLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFNBQVM7Z0JBQy9CLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUVYLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDN0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELGdCQUFnQixDQUFDLE9BQVk7UUFDM0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUM7UUFDbkQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUM7UUFFbEQsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQzVELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUU5QyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELG1CQUFtQixDQUFDLE1BQXFEO1FBQ3ZFLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO0lBQ3RDLENBQUM7SUFFTyw4QkFBOEI7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxNQUFlO1FBQy9CLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFlO1FBQ3ZCLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQiw4QkFBOEI7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3JFLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDekMsQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUMzRyxDQUFDO0lBRUQsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ3ZHLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUM3RyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsTUFBNEI7SUFFL0MsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCx5QkFBeUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLGdCQUFnQixLQUFLLElBQUksQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFFbkQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUM3QixDQUFDLENBQUMsT0FBTztZQUNULENBQUMsQ0FBQyxRQUFRLEtBQUssU0FBUztZQUN4QixDQUFDLEtBQUssS0FBSztZQUNYLENBQUMsS0FBSyxTQUFTLENBQ2hCLENBQUM7SUFDSixDQUFDO0lBRVEsZUFBZSxDQUFDLE1BQW9DLEVBQUUsR0FBUTtRQUNyRSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUMzQyxPQUFPLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLENBQUM7K0dBcHVCVSxrQkFBa0IsZ0hBNElqQixpQkFBaUI7bUdBNUlsQixrQkFBa0IsdXpDQzdGL0IsdTduQkFpWEEsa29TRGhUSSxPQUFPLDJFQUNQLE9BQU8sbUZBQ1AsZUFBZSw0RkFDZixPQUFPLDBJQUNQLGFBQWEsK0JBQ2IsSUFBSSw2RkFDSixRQUFRLDRFQUNSLGVBQWUsb1VBQ2YsUUFBUSx3Q0FDUixZQUFZLGdEQUNaLG1CQUFtQiwrQkFDbkIsWUFBWSxxRkFDWixlQUFlLDhEQUVmLE9BQU8sbUhBRVAsc0JBQXNCLGtLQUN0QixpQkFBaUIscWVBQ2pCLGtCQUFrQiwrTkFDbEIsV0FBVywrQ0FDWCxXQUFXLGlVQUNYLHNCQUFzQiwrUEFDdEIsY0FBYyxxU0FDZCxPQUFPLDJRQUNQLFdBQVcsd0hBMUJELEVBQUU7OzRGQThCSCxrQkFBa0I7a0JBbkM5QixTQUFTOytCQUNFLGdCQUFnQixjQUNkLElBQUksY0FHSixFQUFFLFdBQ0w7d0JBQ1AsT0FBTzt3QkFDUCxPQUFPO3dCQUNQLGVBQWU7d0JBQ2YsT0FBTzt3QkFDUCxhQUFhO3dCQUNiLElBQUk7d0JBQ0osUUFBUTt3QkFDUixlQUFlO3dCQUNmLFFBQVE7d0JBQ1IsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLFlBQVk7d0JBQ1osZUFBZTt3QkFDZixhQUFhO3dCQUNiLE9BQU87d0JBQ1AsU0FBUzt3QkFDVCxzQkFBc0I7d0JBQ3RCLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQixXQUFXO3dCQUNYLFdBQVc7d0JBQ1gsc0JBQXNCO3dCQUN0QixjQUFjO3dCQUNkLE9BQU87d0JBQ1AsV0FBVztxQkFFWjs7MEJBOElJLE1BQU07MkJBQUMsaUJBQWlCOzBGQXZIN0IsWUFBWTtzQkFEWCxLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBYUcsUUFBUTtzQkFEaEIsS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTixjQUFjO3NCQURiLEtBQUs7Z0JBSU4sdUJBQXVCO3NCQUR0QixLQUFLO2dCQUdHLElBQUk7c0JBQVosS0FBSztnQkFFTixVQUFVO3NCQURULEtBQUs7Z0JBSU4sWUFBWTtzQkFEWCxLQUFLO2dCQUlOLGtCQUFrQjtzQkFEakIsS0FBSztnQkFJTixPQUFPO3NCQUROLEtBQUs7Z0JBSU4sT0FBTztzQkFETixLQUFLO2dCQUlOLFNBQVM7c0JBRFIsS0FBSztnQkFJTixXQUFXO3NCQURWLEtBQUs7Z0JBR0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFHUCxjQUFjO3NCQURiLEtBQUs7Z0JBSU4sU0FBUztzQkFEUixLQUFLO2dCQUlOLE9BQU87c0JBRE4sS0FBSztnQkFJTixhQUFhO3NCQURaLEtBQUs7Z0JBSU4sb0JBQW9CO3NCQURuQixLQUFLO2dCQUdOLGVBQWU7c0JBRGQsS0FBSztnQkFHTixlQUFlO3NCQURkLEtBQUs7Z0JBR04sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxNQUFNO2dCQUtQLFVBQVU7c0JBRFQsTUFBTTtnQkFHUCxlQUFlO3NCQURkLE1BQU07Z0JBSVAsV0FBVztzQkFEVixNQUFNO2dCQUlQLGNBQWM7c0JBRGIsTUFBTTtnQkFJUCxpQkFBaUI7c0JBRGhCLE1BQU07Z0JBUVAsVUFBVTtzQkFEVCxNQUFNO2dCQVFQLGNBQWM7c0JBRGIsS0FBSztnQkFTTixjQUFjO3NCQURiLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBlZmZlY3QsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlc1xyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7TWF0VGFibGVEYXRhU291cmNlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGVcIjtcclxuaW1wb3J0IHtUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2V9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XHJcbmltcG9ydCB7TWF0U29ydE1vZHVsZSwgU29ydH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3NvcnRcIjtcclxuaW1wb3J0IHtcclxuICBDdXJyZW5jeVBpcGUsXHJcbiAgRGF0ZVBpcGUsXHJcbiAgRGVjaW1hbFBpcGUsXHJcbiAgTmdDbGFzcyxcclxuICBOZ0Zvck9mLFxyXG4gIE5nSWYsXHJcbiAgTmdTdHlsZSxcclxuICBOZ1N3aXRjaCxcclxuICBOZ1N3aXRjaENhc2UsXHJcbiAgTmdTd2l0Y2hEZWZhdWx0XHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge01hdEljb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pY29uXCI7XHJcbmltcG9ydCB7TWF0QnV0dG9uLCBNYXRCdXR0b25Nb2R1bGUsIE1hdEljb25CdXR0b259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9idXR0b25cIjtcclxuaW1wb3J0IHtOZ3hQYWdpbmF0aW9uTW9kdWxlfSBmcm9tIFwibmd4LXBhZ2luYXRpb25cIjtcclxuaW1wb3J0IHtCdXR0b25BY3Rpb25zQ29tcG9uZW50fSBmcm9tIFwiLi4vYnV0dG9uLWFjdGlvbnMvYnV0dG9uLWFjdGlvbnMuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7U2hhcmVEYXRhU2VydmljZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3RyaWdnZXItZm9ybS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7QmFzZVV0aWxzfSBmcm9tIFwiLi4vLi4vdXRpbHMvYmFzZS11dGlsc1wiO1xyXG5pbXBvcnQge0JhY2tlbmRTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvYmFja2VuZC1zZXJ2aWNlXCI7XHJcbmltcG9ydCB7RmlsdGVyfSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9maWx0ZXIubW9kZWxcIjtcclxuaW1wb3J0IHtGaWx0ZXJSZXF1ZXN0fSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9maWx0ZXItcmVxdWVzdFwiO1xyXG5pbXBvcnQge1xyXG4gIEJ1dHRvbkFjdGlvblNldHRpbmdzLFxyXG4gIEVNUFRZX1BBR0VfSU5GTyxcclxuICBGaWVsZEluZm8sXHJcbiAgRlJPTlRfRU5EX0NPTFVNTl9UWVBFUyxcclxuICBQYWdlSW5mbyxcclxuICBUQUJMRV9SRUNPUkRfQUNUSU9OLFxyXG4gIFRhYmxlQ29sdW1uXHJcbn0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWxcIjtcclxuaW1wb3J0IHtSZXBvcnRSZXF1ZXN0fSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9yZXBvcnQtcmVxdWVzdC5tb2RlbFwiO1xyXG5pbXBvcnQge1RhYmxlUGFnZVVzZXJBY3Rpb259IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL3RhYmxlLXBhZ2UtdXNlci1hY3Rpb24uaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7V29ya2Zsb3d9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL3dvcmtmbG93L3dvcmtmbG93Lm1vZGVsXCI7XHJcbmltcG9ydCB7UmVzcG9uc2VFbnZlbG9wfSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9yZXNwb25zZS1lbnZlbG9wLm1vZGVsXCI7XHJcbmltcG9ydCB7Um91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7TGl2ZUFubm91bmNlcn0gZnJvbSBcIkBhbmd1bGFyL2Nkay9hMTF5XCI7XHJcbmltcG9ydCB7VGl0bGVCYXJDb21wb25lbnR9IGZyb20gXCIuLi90aXRsZS1iYXIvdGl0bGUtYmFyLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge1BhZ2luYXRvckNvbXBvbmVudH0gZnJvbSBcIi4uL3BhZ2luYXRvci9wYWdpbmF0b3IuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7TWF0Q2hlY2tib3h9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveFwiO1xyXG5pbXBvcnQge0ZpbHRlckJ1aWxkZXJDb21wb25lbnR9IGZyb20gXCIuLi9hZHZhbmNlZC1maWx0ZXIvZmlsdGVyLWJ1aWxkZXIvZmlsdGVyLWJ1aWxkZXIuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7RmllbGRGaWx0ZXJ9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL2ZpZWxkLWZpbHRlci5tb2RlbFwiO1xyXG5pbXBvcnQge01hdE1lbnUsIE1hdE1lbnVJdGVtLCBNYXRNZW51VHJpZ2dlcn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL21lbnVcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWJhc2UtdGFibGUnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Jhc2UtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2Jhc2UtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICBhbmltYXRpb25zOiBbXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBOZ1N0eWxlLFxyXG4gICAgTmdDbGFzcyxcclxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcclxuICAgIE1hdEljb24sXHJcbiAgICBNYXRTb3J0TW9kdWxlLFxyXG4gICAgTmdJZixcclxuICAgIE5nU3dpdGNoLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgRGF0ZVBpcGUsXHJcbiAgICBDdXJyZW5jeVBpcGUsXHJcbiAgICBOZ3hQYWdpbmF0aW9uTW9kdWxlLFxyXG4gICAgTmdTd2l0Y2hDYXNlLFxyXG4gICAgTmdTd2l0Y2hEZWZhdWx0LFxyXG4gICAgTWF0SWNvbkJ1dHRvbixcclxuICAgIE5nRm9yT2YsXHJcbiAgICBNYXRCdXR0b24sXHJcbiAgICBCdXR0b25BY3Rpb25zQ29tcG9uZW50LFxyXG4gICAgVGl0bGVCYXJDb21wb25lbnQsXHJcbiAgICBQYWdpbmF0b3JDb21wb25lbnQsXHJcbiAgICBEZWNpbWFsUGlwZSxcclxuICAgIE1hdENoZWNrYm94LFxyXG4gICAgRmlsdGVyQnVpbGRlckNvbXBvbmVudCxcclxuICAgIE1hdE1lbnVUcmlnZ2VyLFxyXG4gICAgTWF0TWVudSxcclxuICAgIE1hdE1lbnVJdGVtLFxyXG5cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXNlVGFibGVDb21wb25lbnQgZXh0ZW5kcyBCYXNlVXRpbHMgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICB0eXBlczogc3RyaW5nW10gPSBbXCJwZGZcIiwgXCJjc3ZcIiwgXCJ4bHN4XCJdXHJcbiAgY29sbGVjdGlvbiA9IHtjb3VudDogNjAsIGRhdGE6IFtdfTtcclxuICBjb25maWcgPSB7XHJcbiAgICBpdGVtc1BlclBhZ2U6IDEwLFxyXG4gICAgY3VycmVudFBhZ2U6IDEsXHJcbiAgICB0b3RhbEl0ZW1zOiB0aGlzLmNvbGxlY3Rpb24uY291bnRcclxuICB9O1xyXG4gIHB1YmxpYyBtYXhTaXplOiBudW1iZXIgPSA3O1xyXG4gIHB1YmxpYyBkaXJlY3Rpb25MaW5rczogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIGF1dG9IaWRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHJlc3BvbnNpdmU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyBsYWJlbHM6IGFueSA9IHtcclxuICAgIHByZXZpb3VzTGFiZWw6ICc8JyxcclxuICAgIG5leHRMYWJlbDogJz4nLFxyXG4gICAgc2NyZWVuUmVhZGVyUGFnaW5hdGlvbkxhYmVsOiAnUGFnaW5hdGlvbicsXHJcbiAgICBzY3JlZW5SZWFkZXJQYWdlTGFiZWw6ICdwYWdlJyxcclxuICAgIHNjcmVlblJlYWRlckN1cnJlbnRMYWJlbDogYFlvdSdyZSBvbiBwYWdlYFxyXG4gIH07XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZmlsdGVyRmllbGRzOiBGaWVsZEluZm9bXTtcclxuICBASW5wdXQoKSBub0RhdGFGb3VuZFN2Z1BhdGg6IHN0cmluZztcclxuICBASW5wdXQoKSBub0RhdGFGb3VuZFRpdGxlID0gJ25vRGF0YUZvdW5kVGl0bGUnO1xyXG4gIEBJbnB1dCgpIG5vRGF0YUZvdW5kU3VidGl0bGUgPSAnbm9EYXRhRm91bmRTdWJ0aXRsZSc7XHJcbiAgQElucHV0KCkgbm9SZXN1bHRTdmdQYXRoOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbm9SZXN1bHRUaXRsZSA9ICdub1Jlc3VsdFRpdGxlJztcclxuICBASW5wdXQoKSBub1Jlc3VsdFN1YnRpdGxlID0gJ25vUmVzdWx0U3VidGl0bGUnO1xyXG4gIHRvdGFsRWxlbWVudHMgPSAwO1xyXG4gIHBhZ2VzQ291bnQgPSAwO1xyXG4gIHBhZ2VJbmRleCA9IDE7XHJcbiAgcGFnZVNpemUgPSAxMDtcclxuICBtb2JpbGVEaXNwbGF5ZWRJdGVtcyA9IDA7XHJcbiAgcHJpdmF0ZSBzZWxlY3RlZFN0YXR1c0ZpbHRlcjogRmlsdGVyW10gPSBbXTtcclxuICBhZHZhbmNlZEFwcGxpZWRGaWx0ZXI6IGFueVtdID0gW107XHJcbiAgcGVuZGluZ0ZpbHRlcnM6IGFueVtdID0gW107XHJcbiAgc2VhcmNoU3RyOiBzdHJpbmcgPSAnJztcclxuICBwcml2YXRlIGZpbHRlclJlcXVlc3Q6IEZpbHRlclJlcXVlc3QgPSBuZXcgRmlsdGVyUmVxdWVzdCgpO1xyXG4gIHByaXZhdGUgdGltZXI6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIG92ZXJyaWRlIHBhZ2VJbmZvOiBQYWdlSW5mbyA9IEVNUFRZX1BBR0VfSU5GTztcclxuXHJcbiAgQElucHV0KClcclxuICBlbmFibGVQYWdpbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KClcclxuICBtb2JpbGVQYWdlU2l6ZTogbnVtYmVyID0gMjtcclxuXHJcbiAgQElucHV0KClcclxuICBtb2JpbGVMb2FkTW9yZUluY3JlbWVudDogbnVtYmVyID0gMjtcclxuXHJcbiAgQElucHV0KCkgZGF0YT86IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+O1xyXG4gIEBJbnB1dCgpXHJcbiAgbGlzdEFjdGlvbjogQnV0dG9uQWN0aW9uU2V0dGluZ3NbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGV4dHJhQWN0aW9uczogQnV0dG9uQWN0aW9uU2V0dGluZ3NbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGJ1dHRvbnNEaXNwbGF5TW9kZTogJ2Ryb3Bkb3duJyB8ICdsaXN0JyA9ICdkcm9wZG93bic7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgY29sdW1uczogVGFibGVDb2x1bW48YW55PltdO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGZpbHRlcnM6IEZpbHRlcltdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIC8vQHRzLWlnbm9yZVxyXG4gIHBhdGhQYXJhbTogbnVtYmVyO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGV4dHJhQnV0dG9uOiAgQnV0dG9uQWN0aW9uU2V0dGluZ3NbXSA9IFtdO1xyXG5cclxuICBAT3V0cHV0KCkgYnV0dG9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QnV0dG9uQWN0aW9uU2V0dGluZ3M+KCk7XHJcblxyXG4gIEBJbnB1dCgpIC8vQHRzLWlnbm9yZVxyXG4gIGVuZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaXNQZW5kaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgdHJpZ2dlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHJlcG9ydFJlcXVlc3Q6IFJlcG9ydFJlcXVlc3QgPSBuZXcgUmVwb3J0UmVxdWVzdCh7fSk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2VwYXJhdGVFbmRwb2ludERhdGE6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIG1hbmFnZWFibGVQYWdlczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgdG90YWxQYWdlc0NvdW50OiBudW1iZXIgPSAwO1xyXG4gIEBJbnB1dCgpXHJcbiAgY3VycmVudFBhZ2VJbmRleDogbnVtYmVyID0gMDtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG5cclxuICBAT3V0cHV0KClcclxuICB1c2VyQWN0aW9uOiBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlUGFnZVVzZXJBY3Rpb24+KCk7XHJcbiAgQE91dHB1dCgpXHJcbiAgaHlwZXJMaW5rQWN0aW9uOiBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlUGFnZVVzZXJBY3Rpb24+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGV4dHJhQWN0aW9uOiBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlUGFnZVVzZXJBY3Rpb24+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHNlbGVjdGVkQ29sdW1uOiBFdmVudEVtaXR0ZXI8U29ydD4gPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGxpc3RBY3Rpb25DbGlja2VkOiBFdmVudEVtaXR0ZXI8eyBhY3Rpb246IEJ1dHRvbkFjdGlvblNldHRpbmdzLCByb3c6IGFueSAsIGlzUGVuZGluZzogYm9vbGVhbn0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7XHJcbiAgICBhY3Rpb246IEJ1dHRvbkFjdGlvblNldHRpbmdzLFxyXG4gICAgcm93OiBhbnksXHJcbiAgICBpc1BlbmRpbmc6IGJvb2xlYW5cclxuICB9PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBzaG93RGlhbG9nOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICB1c2VkV29ya2Zsb3chOiBXb3JrZmxvdztcclxuXHJcbiAgbW9kZTphbnk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgY3VzdG9taXplZERhdGE/OiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcclxuICBkYXRhU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcclxuICBzZWxlY3RlZFJvd0luZGV4ID0gLTE7XHJcbiAgbm9EYXRhRm91bmQgPSBmYWxzZTtcclxuICB0b3RhbFJlcXVpcmVkQ291bnRJdGVtID0gMDtcclxuXHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGNsaWNrUm91dGVQYWdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgICAgcHJpdmF0ZSBiYWNrZW5kU2VydmljZTogQmFja2VuZFNlcnZpY2UsXHJcbiAgICAgIHB1YmxpYyB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICBwdWJsaWMgc2hhcmVEYXRhU2VydmljZTogU2hhcmVEYXRhU2VydmljZSxcclxuICAgICAgQEluamVjdCgnc2VjdXJpdHlNYW5hZ2VyJykgcHJpdmF0ZSBzZWN1cml0eU1hbmFnZXI6IGFueSxcclxuICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgICAgcHJpdmF0ZSByZWFkb25seSBsaXZlQW5ub3VuY2VyOiBMaXZlQW5ub3VuY2VyLFxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoKTtcclxuICAgIHRoaXMuY29sdW1ucyA9IFtdO1xyXG4gICAgdGhpcy5maWx0ZXJSZXF1ZXN0ID0gbmV3IEZpbHRlclJlcXVlc3QoKTtcclxuXHJcbiAgICB0aGlzLmluaXRpYWxpemVNb2JpbGVQYWdlU2l6ZSgpO1xyXG5cclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnBhZ2VJbmZvLmxhenlMb2FkRGF0YSAhPT0gdHJ1ZSB8fCB0aGlzLmVuZm9yY2VSZWZyZXNoID09PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5iYWNrZW5kU2VydmljZS5pc0VtcHR5SXRlbXMgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPD0gMDtcclxuICAgIGlmICh0aGlzLmN1c3RvbWl6ZWREYXRhKSB7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuY3VzdG9taXplZERhdGE7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLm1hbmFnZWFibGVQYWdlcykge1xyXG4gICAgICB0aGlzLnBhZ2VzQ291bnQgPSB0aGlzLnRvdGFsUGFnZXNDb3VudDtcclxuICAgICAgdGhpcy5wYWdlSW5kZXggPSB0aGlzLmN1cnJlbnRQYWdlSW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbml0aWFsaXplTW9iaWxlUGFnZVNpemUoKTtcclxuICAgIHRoaXMubW9iaWxlRGlzcGxheWVkSXRlbXMgPSB0aGlzLnBhZ2VTaXplO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc01vYmlsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8PSA3Njg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVNb2JpbGVQYWdlU2l6ZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzTW9iaWxlKCkgJiYgdGhpcy5wYWdlU2l6ZSA+IHRoaXMubW9iaWxlUGFnZVNpemUpIHtcclxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMubW9iaWxlUGFnZVNpemU7XHJcbiAgICAgIGlmICh0aGlzLnJlcG9ydFJlcXVlc3Q/LmZpbHRlclJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMubW9iaWxlUGFnZVNpemU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uUGFnZUNoYW5nZShldmVudDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmRleCA9IGV2ZW50O1xyXG4gICAgdGhpcy5nZXROZXh0KHRoaXMucGFnZUluZGV4IC0gMSk7XHJcbiAgICBpZiAodGhpcy5tYW5hZ2VhYmxlUGFnZXMpIHtcclxuICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQodGhpcy5wYWdlSW5kZXgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGV4dHJhY3RGaWVsZE5hbWUoZWxlbWVudDogYW55LCBwcm9wZXJ0eTogc3RyaW5nKSB7XHJcbiAgICBpZiAocHJvcGVydHk/LmluY2x1ZGVzKCcuJykpIHtcclxuICAgICAgcmV0dXJuIHByb3BlcnR5LnNwbGl0KCcuJykucmVkdWNlKChhY2MsIHBhcnQpID0+IGFjYyAmJiBhY2NbcGFydF0sIGVsZW1lbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgYyA9IHRoaXMuY29sdW1ucy5maW5kKGMgPT4gYy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50W3Byb3BlcnR5XSkgJiYgYy5hcnJheVN1YlByb3BlcnR5ICkge1xyXG4gICAgICAgIGNvbnN0IGZpZWxkVmFsdWVzID0gZWxlbWVudFtwcm9wZXJ0eV0ubWFwKGYgPT4gZltjLmFycmF5U3ViUHJvcGVydHldKTtcclxuICAgICAgICByZXR1cm4gIGZpZWxkVmFsdWVzLmpvaW4oJywgJyk7XHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudFtwcm9wZXJ0eV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCB2aXNpYmxlQ29sdW1ucygpIHtcclxuICAgIHRoaXMuYnVpbGRHcm91cHMoKVxyXG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlKS5tYXAoY29sdW1uID0+IGNvbHVtbi5wcm9wZXJ0eSk7XHJcbiAgfVxyXG5cclxuICBnZXQgdmlzaWJsZUNvbHVtbnNBcnJheSgpIHtcclxuICAgIHJldHVybiB0aGlzLnZpc2libGVDb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29sdW1uKHByb3BlcnR5OiBzdHJpbmcpOiBUYWJsZUNvbHVtbjxhbnk+IHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZChjID0+IGMucHJvcGVydHkgPT09IHByb3BlcnR5KTtcclxuICB9XHJcblxyXG4gIGdldFNvcnREaXJlY3Rpb24ocHJvcGVydHk6IHN0cmluZyk6ICdhc2MnIHwgJ2Rlc2MnIHwgJycge1xyXG4gICAgaWYgKHRoaXMucmVwb3J0UmVxdWVzdD8uZmlsdGVyUmVxdWVzdD8uc29ydEtleSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Quc29ydERpcmVjdGlvbiA9PT0gJ0FTQycgPyAnYXNjJyA6ICdkZXNjJztcclxuICAgIH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIGhhbmRsZVNvcnRDbGljayhwcm9wZXJ0eTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBDT0xVTU4gPSB0aGlzLmdldENvbHVtbihwcm9wZXJ0eSk7XHJcbiAgICBpZiAoIUNPTFVNTiB8fCAhQ09MVU1OLmVuYWJsZVNvcnRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IENVUlJFTlRfRElSRUNUSU9OID0gdGhpcy5nZXRTb3J0RGlyZWN0aW9uKHByb3BlcnR5KTtcclxuICAgIGxldCBORVdfRElSRUNUSU9OOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnO1xyXG5cclxuICAgIGlmIChDVVJSRU5UX0RJUkVDVElPTiA9PT0gJ2FzYycpIHtcclxuICAgICAgTkVXX0RJUkVDVElPTiA9ICdkZXNjJztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9uU29ydEFjdGlvbih7XHJcbiAgICAgIGFjdGl2ZTogcHJvcGVydHksXHJcbiAgICAgIGRpcmVjdGlvbjogTkVXX0RJUkVDVElPTlxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblNvcnRIZWFkZXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBjb2x1bW5Qcm9wOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5nZXRDb2x1bW4oY29sdW1uUHJvcCk/LmVuYWJsZVNvcnRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICcgJykge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLmhhbmRsZVNvcnRDbGljayhjb2x1bW5Qcm9wKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBhcmlhLXNvcnQgb24gc29ydGFibGUgY29sdW1uIGhlYWRlcnMgKFdDQUcgdGFibGUgc2VtYW50aWNzKS4gKi9cclxuICBnZXRDb2x1bW5BcmlhU29ydChjb2x1bW5Qcm9wOiBzdHJpbmcpOiAnYXNjZW5kaW5nJyB8ICdkZXNjZW5kaW5nJyB8ICdub25lJyB8IG51bGwge1xyXG4gICAgaWYgKCF0aGlzLmdldENvbHVtbihjb2x1bW5Qcm9wKT8uZW5hYmxlU29ydGluZykge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IGQgPSB0aGlzLmdldFNvcnREaXJlY3Rpb24oY29sdW1uUHJvcCk7XHJcbiAgICBpZiAoZCA9PT0gJ2FzYycpIHtcclxuICAgICAgcmV0dXJuICdhc2NlbmRpbmcnO1xyXG4gICAgfVxyXG4gICAgaWYgKGQgPT09ICdkZXNjJykge1xyXG4gICAgICByZXR1cm4gJ2Rlc2NlbmRpbmcnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICdub25lJztcclxuICB9XHJcblxyXG4gIHNvcnRTdGF0ZTogYW55ID0ge307XHJcblxyXG4gIGdldE5leHQocGFnZUluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcclxuICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZTtcclxuICAgIHRoaXMubG9hZERhdGEoKTtcclxuICB9XHJcbiAgb25QYWdlU2l6ZUNoYW5nZShldmVudDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gZXZlbnQ7XHJcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDE7IC8vIHJlc2V0IHRvIGZpcnN0IHBhZ2Ugb24gcGFnZSBzaXplIGNoYW5nZVxyXG4gICAgdGhpcy5tb2JpbGVEaXNwbGF5ZWRJdGVtcyA9IDA7XHJcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XHJcbiAgICB0aGlzLmdldE5leHQoMCk7XHJcbiAgfVxyXG5cclxuICBvbkxvYWRNb3JlKGl0ZW1zVG9Mb2FkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGN1cnJlbnREaXNwbGF5ZWQgPSB0aGlzLm1vYmlsZURpc3BsYXllZEl0ZW1zIHx8IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCB8fCB0aGlzLnBhZ2VTaXplO1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IE1hdGgubWluKGN1cnJlbnREaXNwbGF5ZWQgKyBpdGVtc1RvTG9hZCwgdGhpcy50b3RhbEVsZW1lbnRzKTtcclxuICAgIHRoaXMubW9iaWxlRGlzcGxheWVkSXRlbXMgPSB0aGlzLnBhZ2VTaXplO1xyXG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xyXG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZUluZGV4ID0gMDtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMubG9hZERhdGEodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWREYXRhKHNraXBNb2JpbGVSZXNldDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XHJcblxyXG4gICAgaWYgKCFza2lwTW9iaWxlUmVzZXQpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplTW9iaWxlUGFnZVNpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0KSB7XHJcbiAgICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0ID0gbmV3IEZpbHRlclJlcXVlc3QodGhpcy5wYWdlU2l6ZSB8fCB0aGlzLnBhZ2VJbmZvLnBhZ2VTaXplKTtcclxuICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Quc2VhcmNoU3RyID0gdGhpcy5zZWFyY2hTdHI7XHJcbiAgICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LmZpbHRlcnMgPSBbXHJcbiAgICAgICAgLi4uKHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyIHx8IFtdKSxcclxuICAgICAgICAuLi4odGhpcy5maWx0ZXJzIHx8IFtdKS5maWx0ZXIoZiA9PlxyXG4gICAgICAgICAgISh0aGlzLmFkdmFuY2VkQXBwbGllZEZpbHRlciB8fCBbXSkuc29tZShhID0+IGEuZmllbGQgPT09IGYuZmllbGROYW1lKVxyXG4gICAgICAgIClcclxuICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XHJcbiAgICBpZiAodGhpcy5zZXBhcmF0ZUVuZHBvaW50RGF0YSB8fCAhdGhpcy5wYWdlSW5mby5hcGlVcmkgfHwgdGhpcy5wYWdlSW5mby5hcGlVcmkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5zZXBhcmF0ZUVuZHBvaW50RGF0YTtcclxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5hbm5vdW5jZVRhYmxlUmVzdWx0cygpKTtcclxuICAgIH0gZWxzZSBpZih0aGlzLnJlcG9ydFJlcXVlc3QgPT0gdW5kZWZpbmVkKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIGlmKCF0aGlzLm1hbmFnZWFibGVQYWdlcykgIHtcclxuICAgICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xyXG4gICAgICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QuY29sdW1ucyA9IHRoaXMuY29sdW1ucz8uZmlsdGVyKGMgPT4gRlJPTlRfRU5EX0NPTFVNTl9UWVBFUy5pbmRleE9mKGMudHlwZSkgPCAwICkubWFwKGMgPT4gYy5wcm9wZXJ0eSkgfHwgW107XHJcbiAgICAgICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wZW5kaW5nUGFnZSA9IHRoaXMuaXNQZW5kaW5nO1xyXG4gICAgICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Quc2VhcmNoU3RyID0gdGhpcy5zZWFyY2hTdHI7XHJcbiAgICAgICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5maWx0ZXJzID0gW1xyXG4gICAgICAgICAgICAuLi4odGhpcy5hZHZhbmNlZEFwcGxpZWRGaWx0ZXIgfHwgW10pLFxyXG4gICAgICAgICAgICAuLi4odGhpcy5maWx0ZXJzIHx8IFtdKS5maWx0ZXIoZiA9PlxyXG4gICAgICAgICAgICAgICEodGhpcy5hZHZhbmNlZEFwcGxpZWRGaWx0ZXIgfHwgW10pLnNvbWUoYSA9PiBhLmZpZWxkID09PSBmLmZpZWxkTmFtZSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgXTtcclxuICAgICAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5nZXRJdGVtc0J5RmlsdGVyKHRoaXMucmVwb3J0UmVxdWVzdD8uZmlsdGVyUmVxdWVzdCwgdGhpcy5wYWdlSW5mby5hcGlVcmkpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCByZXNwb25zZUVudmVsb3BlID0gbmV3IFJlc3BvbnNlRW52ZWxvcChyZXNwKTtcclxuICAgICAgICAgICAgICBpZiAocmVzcG9uc2VFbnZlbG9wZS52YWxpZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbFJlcXVpcmVkQ291bnRJdGVtID0gdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZVNpemVcclxuICAgICAgICAgICAgICAgIHRoaXMubm9EYXRhRm91bmQgPSByZXNwb25zZUVudmVsb3BlLmJvZHkubGVuZ3RoIDwgMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gcmVzcG9uc2VFbnZlbG9wZS5ib2R5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5pc0VtcHR5SXRlbXMgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPD0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMudG90YWxFbGVtZW50cyA9IHJlc3BvbnNlRW52ZWxvcGUudG90YWxTaXplIHx8IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VzQ291bnQgPSBNYXRoLmNlaWwodGhpcy50b3RhbEVsZW1lbnRzIC8gdGhpcy5wYWdlU2l6ZSkgfHwgMTtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFnZUluZGV4ID0gKHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleCB8fCAwKSArIDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy50b3RhbEl0ZW1zID0gcmVzcG9uc2VFbnZlbG9wZS50b3RhbFNpemUgfHwgMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmN1cnJlbnRQYWdlID0gdGhpcy5wYWdlSW5kZXggKyAxO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2JpbGVEaXNwbGF5ZWRJdGVtcyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuYW5ub3VuY2VUYWJsZVJlc3VsdHMoKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgICwgMzAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYW5ub3VuY2VUYWJsZVJlc3VsdHMoKTogdm9pZCB7XHJcbiAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5kYXRhU291cmNlPy5kYXRhPy5sZW5ndGggPz8gMDtcclxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy50b3RhbEVsZW1lbnRzID8/IHZpc2libGU7XHJcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0JBU0VfVEFCTEUucmVzdWx0c0Fubm91bmNlbWVudCcsIHtcclxuICAgICAgdmlzaWJsZSxcclxuICAgICAgdG90YWwsXHJcbiAgICB9KTtcclxuICAgIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKG1lc3NhZ2UsICdwb2xpdGUnKTtcclxuICB9XHJcblxyXG4gIGdldFN0YXR1c0Rlc2NyaXB0aW9uKGVsZW1lbnQ6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuYmFja2VuZFNlcnZpY2UuZ2V0U3RhdHVzRGVzY3JpcHRpb24oZWxlbWVudCwgdGhpcy51c2VkV29ya2Zsb3cpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RhdGVUeXBlKGVsZW1lbnQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGVsZW1lbnQuc3RhdGVUeXBlXHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1tcImN1c3RvbWl6ZWREYXRhXCJdICYmICFjaGFuZ2VzW1wiY3VzdG9taXplZERhdGFcIl0uaXNGaXJzdENoYW5nZSgpKSB7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gY2hhbmdlc1tcImN1c3RvbWl6ZWREYXRhXCJdLmN1cnJlbnRWYWx1ZT8uZGF0YSB8fCBbXTsgIC8vIFVwZGF0ZSBkYXRhIHNvdXJjZSB3aXRoIG5ldyBkYXRhXHJcbiAgICAgIHRoaXMucGFnZXNDb3VudD10aGlzLnRvdGFsUGFnZXNDb3VudDtcclxuICAgICAgdGhpcy5wYWdlSW5kZXg9dGhpcy5jdXJyZW50UGFnZUluZGV4O1xyXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLmFubm91bmNlVGFibGVSZXN1bHRzKCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbXCJlbmZvcmNlUmVmcmVzaFwiXSAmJiAhY2hhbmdlc1tcImVuZm9yY2VSZWZyZXNoXCJdLmlzRmlyc3RDaGFuZ2UoKSkge1xyXG4gICAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1tcImlzUGVuZGluZ1wiXSAmJiAhY2hhbmdlc1tcImlzUGVuZGluZ1wiXS5pc0ZpcnN0Q2hhbmdlKCkpIHtcclxuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXRDcm9wcGVkVGV4dChlbGVtZW50VmFsdWU6IGFueSwgc3ViV2lkdGg6IG51bWJlciA9IDIwKSB7XHJcbiAgICByZXR1cm4gZWxlbWVudFZhbHVlICYmIGVsZW1lbnRWYWx1ZS5sZW5ndGggPiBzdWJXaWR0aCA/IGVsZW1lbnRWYWx1ZS5zdWJzdHJpbmcoMCwgc3ViV2lkdGgpICsgXCIuLi5cIiA6IGVsZW1lbnRWYWx1ZTtcclxuICB9XHJcblxyXG4gIGVtaXRFdmVudChlbGVtZW50OiBhbnkpIHtcclxuICAgIHRoaXMuc2hvd0RpYWxvZy5lbWl0KGVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgZXh0cmFjdEZvcm1hdChjb2x1bW46IFRhYmxlQ29sdW1uPGFueT4pIHtcclxuICAgIHJldHVybiBjb2x1bW4/LmZvcm1hdCB8fCAnZC9NL3l5eXksIGg6bW0gYSc7XHJcbiAgfVxyXG5cclxuICBhY3Rpb25MaXN0Q2xpY2tlZChsaXN0QWN0aW9uOiBCdXR0b25BY3Rpb25TZXR0aW5ncywgZWxlbWVudDogYW55KSB7XHJcbiAgICB0aGlzLmxpc3RBY3Rpb25DbGlja2VkLmVtaXQoe2FjdGlvbjpsaXN0QWN0aW9uLCByb3c6IGVsZW1lbnQsIGlzUGVuZGluZzogdGhpcy5pc1BlbmRpbmd9KTtcclxuICB9XHJcblxyXG4gIGh5cGVyTGlua0NsaWNrZWQoYWN0aW9uTmFtZTogc3RyaW5nLCBlbGVtZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGFjdGlvbiA9IFRBQkxFX1JFQ09SRF9BQ1RJT047XHJcbiAgICBhY3Rpb24uYWN0aW9uS2V5ID0gYWN0aW9uTmFtZTtcclxuICAgIGFjdGlvbi5pdGVtID0gZWxlbWVudDtcclxuICAgIGFjdGlvbi5wYWdlSW5mbyA9IHRoaXMucGFnZUluZm87XHJcbiAgICB0aGlzLmh5cGVyTGlua0FjdGlvbi5lbWl0KGFjdGlvbilcclxuICB9XHJcblxyXG5cclxuICBlbWl0Um91dGVQYWdlKGVsZW1lbnQ6IGFueSl7XHJcbiAgICB0aGlzLmNsaWNrUm91dGVQYWdlLmVtaXQoZWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdEl0ZW0ocm93OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnBhZ2VJbmZvLnNlbGZSb3V0aW5nKSB7XHJcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLmlzUGVuZGluZyA/ICdwZW5kaW5nJyA6ICd2aWV3JztcclxuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5wYWdlSW5mby5saXN0Um91dGVQYXRoIHx8IHRoaXMucm91dGVyLnVybH0vdmlld2A7XHJcblxyXG4gICAgICBjb25zdCBlbmNyeXB0ZWRJZCA9IHRoaXMuYmFja2VuZFNlcnZpY2UuZW5jcnlwdChTdHJpbmcocm93LmlkKSk7XHJcbiAgICAgIGNvbnN0IGVuY3J5cHRlZE1vZGUgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQobW9kZSk7XHJcblxyXG4gICAgICBjb25zdCBlbmNyeXB0ZWRSb3cgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQoSlNPTi5zdHJpbmdpZnkocm93KSk7XHJcblxyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSwge1xyXG4gICAgICAgIHF1ZXJ5UGFyYW1zOiB7IHRva2VuOiBlbmNyeXB0ZWRJZCwgbW9kZTogZW5jcnlwdGVkTW9kZSB9LFxyXG4gICAgICAgIHN0YXRlOiB7IHJhdzogZW5jcnlwdGVkUm93IH0sXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBjb25zdCBhY3Rpb24gPSBTRUxFQ1RfUkVDT1JEX0FDVElPTjtcclxuICAgIC8vIGFjdGlvbi5pZCA9IHJvdz8uaWQ7XHJcbiAgICAvLyBhY3Rpb24uaXRlbSA9IHJvdztcclxuICAgIC8vIHRoaXMudXNlckFjdGlvbi5lbWl0KGFjdGlvbilcclxuICB9XHJcblxyXG4gIG9wZW5OZXdUYWIocm93KSB7XHJcbiAgICBpZiAoIXRoaXMucGFnZUluZm8uZW1iZWRlZFRhYmxlT25seSkge1xyXG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5pc1BlbmRpbmcgPyAncGVuZGluZycgOiAndmlldyc7XHJcbiAgICAgIHdpbmRvdy5vcGVuKGAke3RoaXMucGFnZUluZm8ubGlzdFJvdXRlUGF0aH0vJHttb2RlfWAgKyAnLycgKyByb3c/LmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uVmlld01vZGVDaGFuZ2VkUmVjZWl2ZWQoaXNQZW5kaW5nOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnN3aXRjaFZpZXdNb2RlKGlzUGVuZGluZyk7XHJcbiAgfVxyXG5cclxuICBzd2l0Y2hWaWV3TW9kZShpc1BlbmRpbmc6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaXNQZW5kaW5nID0gaXNQZW5kaW5nO1xyXG4gICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgb25BZGROZXdBY3Rpb24oJGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMucGFnZUluZm8ubGlzdFJvdXRlUGF0aCB8fCB0aGlzLnJvdXRlci51cmx9L3ZpZXdgO1xyXG4gICAgY29uc3QgZW5jcnlwdGVkSWQgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQoXCItMVwiKTtcclxuICAgIGNvbnN0IGVuY3J5cHRlZE1vZGUgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQoXCJwZW5kaW5nXCIpO1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3VybH1gXSxcclxuICAgICAgeyBxdWVyeVBhcmFtczogeyB0b2tlbjogZW5jcnlwdGVkSWQgLCBtb2RlIDogZW5jcnlwdGVkTW9kZSB9IH0pO1xyXG5cclxuICAgIC8vIGNvbnN0IGFjdGlvbiA9IFNFTEVDVF9SRUNPUkRfQUNUSU9OO1xyXG4gICAgLy8gYWN0aW9uLmlkID0gcm93Py5pZDtcclxuICAgIC8vIGFjdGlvbi5pdGVtID0gcm93O1xyXG4gICAgLy8gdGhpcy51c2VyQWN0aW9uLmVtaXQoYWN0aW9uKVxyXG4gIH1cclxuXHJcbiAgc2hvd0FkZE5ldygpIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2VJbmZvLmhhc0FkZEJ1dHRvbiA7XHJcbiAgfVxyXG5cclxuICBvbkV4dHJhQnV0dGlvbkFjdGlvbigkZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5leHRyYUFjdGlvbi5lbWl0KCRldmVudCk7XHJcblxyXG4gIH1cclxuXHJcbiAgaGFzR3JvdXBzKCkge1xyXG4gICAgbGV0IGIgPSB0aGlzLmNvbHVtbnMuZmluZEluZGV4KHAgPT4gcC5ncm91cCk7XHJcbiAgICByZXR1cm4gYiA+PSAwO1xyXG4gIH1cclxuICBncm91cE5hbWVzOiBhbnkgPSBbXVxyXG4gIGdyb3VwU3BhbnM6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIGJ1aWxkR3JvdXBzKCl7XHJcbiAgICBsZXQgY291bnQgPSAwO1xyXG4gICAgdGhpcy5ncm91cE5hbWVzID0gW107XHJcbiAgICB0aGlzLmdyb3VwU3BhbnMuY2xlYXIoKTtcclxuICAgIGlmKHRoaXMuaGFzR3JvdXBzKCkgPT09IGZhbHNlKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlID09PSB0cnVlKVxyXG4gICAgICAuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbHVtbi5ncm91cCA9PT0gXCItXCIpIHtcclxuICAgICAgICAgIHRoaXMuZ3JvdXBOYW1lcy5wdXNoKGNvdW50LnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgdGhpcy5pbnNlcnRJbk1hcChjb3VudCk7XHJcbiAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZ3JvdXBOYW1lcy5pbmNsdWRlcyhjb2x1bW4uZ3JvdXApKSB7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwTmFtZXMucHVzaChjb2x1bW4uZ3JvdXApO1xyXG4gICAgICAgICAgdGhpcy5pbnNlcnRJbk1hcChjb2x1bW4uZ3JvdXApO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluc2VydEluTWFwKGNvbHVtbi5ncm91cCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5zZXJ0SW5NYXAoa2V5KXtcclxuICAgIGlmKHRoaXMuZ3JvdXBTcGFucy5oYXMoa2V5KSl7XHJcbiAgICAgIHRoaXMuZ3JvdXBTcGFucy5zZXQoa2V5LnRvU3RyaW5nKCksIHRoaXMuZ3JvdXBTcGFucy5nZXQoa2V5KSArIDEpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ncm91cFNwYW5zLnNldChrZXkudG9TdHJpbmcoKSwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0h1bWFuTWFkZShzdHIpe1xyXG4gICAgcmV0dXJuIGlzTmFOKHN0cik7XHJcbiAgfVxyXG5cclxuICBhY3Rpb25CdXR0b25DbGlja2VkKGFjdGlvbktleTogc3RyaW5nLCBpdGVtOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChhY3Rpb25LZXkgPT09ICduYXZpZ2F0ZScpIHtcclxuICAgICAgdGhpcy5oYW5kbGVOYXZpZ2F0ZUFjdGlvbihpdGVtKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW1pdFRhYmxlQWN0aW9uKGFjdGlvbktleSwgaXRlbSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZU5hdmlnYXRlQWN0aW9uKGl0ZW06IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgbW9kZSA9IHRoaXMuaXNQZW5kaW5nID8gJ3BlbmRpbmcnIDogJ3ZpZXcnO1xyXG4gICAgY29uc3QgYmFzZVBhdGggPSB0aGlzLnBhZ2VJbmZvLmxpc3RSb3V0ZVBhdGggfHwgdGhpcy5yb3V0ZXIudXJsO1xyXG4gICAgY29uc3QgdXJsID0gYCR7YmFzZVBhdGh9L3ZpZXdgO1xyXG5cclxuICAgIGNvbnN0IGVuY3J5cHRlZElkID0gdGhpcy5iYWNrZW5kU2VydmljZS5lbmNyeXB0KGl0ZW0uaWQudG9TdHJpbmcoKSk7XHJcbiAgICBjb25zdCBlbmNyeXB0ZWRNb2RlID0gdGhpcy5iYWNrZW5kU2VydmljZS5lbmNyeXB0KG1vZGUpO1xyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmxdLCB7XHJcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7IHRva2VuOiBlbmNyeXB0ZWRJZCwgbW9kZTogZW5jcnlwdGVkTW9kZSB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW1pdFRhYmxlQWN0aW9uKGFjdGlvbktleTogc3RyaW5nLCBpdGVtOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGFjdGlvbiA9IFRBQkxFX1JFQ09SRF9BQ1RJT047XHJcbiAgICBhY3Rpb24uYWN0aW9uS2V5ID0gYWN0aW9uS2V5O1xyXG4gICAgYWN0aW9uLml0ZW0gPSBpdGVtO1xyXG4gICAgYWN0aW9uLnBhZ2VJbmZvID0gdGhpcy5wYWdlSW5mbztcclxuICAgIHRoaXMudXNlckFjdGlvbi5lbWl0KGFjdGlvbik7XHJcbiAgfVxyXG5cclxuICBleHRyYWN0UmVwb3J0KHJlcG9ydFR5cGU6IGFueSkge1xyXG4gICAgY29uc3QgbXlGaWx0ZXJzID0gdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Q7XHJcbiAgICBjb25zdCByZXBvcnRSZXF1ZXN0ID0gdGhpcy5iYWNrZW5kU2VydmljZS5idWlsZFJlcG9ydFJlcXVlc3QodGhpcy5jb2x1bW5zLCB0aGlzLnBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyAnLmxpc3RfdGl0bGUnLFxyXG4gICAgICBteUZpbHRlcnMsIHJlcG9ydFR5cGUsIHRoaXMucGFnZUluZm8sIHRoaXMuc2VhcmNoU3RyLCAnTEFORFNDQVBFJyk7XHJcbiAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmRvd25sb2FkUmVwb3J0KHJlcG9ydFJlcXVlc3QsIHRoaXMucGFnZUluZm8uYXBpVXJpKTtcclxuICB9XHJcblxyXG4gIGdldEljb24oc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChzdGF0dXMpIHtcclxuICAgICAgY2FzZSAncGFzcyc6IHJldHVybiAnY2hlY2tfY2lyY2xlJztcclxuICAgICAgY2FzZSAnd2FybmluZyc6IHJldHVybiAnd2FybmluZyc7XHJcbiAgICAgIGNhc2UgJ2Vycm9yJzogcmV0dXJuICdlcnJvcic7XHJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAnaGVscCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRJY29uQXJpYUxhYmVsS2V5KHN0YXR1czogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAoc3RhdHVzKSB7XHJcbiAgICAgIGNhc2UgJ3Bhc3MnOlxyXG4gICAgICAgIHJldHVybiAnQkFTRV9UQUJMRS5zdGF0dXNJY29uUGFzcyc7XHJcbiAgICAgIGNhc2UgJ3dhcm5pbmcnOlxyXG4gICAgICAgIHJldHVybiAnQkFTRV9UQUJMRS5zdGF0dXNJY29uV2FybmluZyc7XHJcbiAgICAgIGNhc2UgJ2Vycm9yJzpcclxuICAgICAgICByZXR1cm4gJ0JBU0VfVEFCTEUuc3RhdHVzSWNvbkVycm9yJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ0JBU0VfVEFCTEUuc3RhdHVzSWNvblVua25vd24nO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0T25PZmZGbGFnQXJpYUxhYmVsS2V5KHZhbHVlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcclxuICAgICAgcmV0dXJuICdCQVNFX1RBQkxFLnN0YXR1c0ZsYWdBY3RpdmUnO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm4gJ0JBU0VfVEFCTEUuc3RhdHVzRmxhZ0luYWN0aXZlJztcclxuICAgIH1cclxuICAgIHJldHVybiAnQkFTRV9UQUJMRS5zdGF0dXNGbGFnUGVuZGluZyc7XHJcbiAgfVxyXG5cclxuICBhY3Rpb25DaGVja2VkQ2xpY2tlZChwcm9wZXJ0eTogc3RyaW5nLCBlbGVtZW50KSB7XHJcbiAgICBlbGVtZW50W3Byb3BlcnR5XT0gIWVsZW1lbnRbcHJvcGVydHldO1xyXG4gICAgdGhpcy5hY3Rpb25CdXR0b25DbGlja2VkKHByb3BlcnR5LCBlbGVtZW50KTtcclxuICB9XHJcblxyXG5cclxuICBpc0RhcmtIaWdobGlnaHQocm93OiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGdyb3VwQnlQcm9wID0gdGhpcy5wYWdlSW5mbz8uZ3JvdXBCeVByb3BlcnR5O1xyXG4gICAgY29uc3QgZ3JvdXBCeVZhbHVlcyA9IHRoaXMucGFnZUluZm8/Lmdyb3VwQnlWYWx1ZTtcclxuXHJcbiAgICBpZiAoIWdyb3VwQnlQcm9wIHx8ICFncm91cEJ5VmFsdWVzIHx8ICFyb3dbZ3JvdXBCeVByb3BdKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjZWxsVmFsdWUgPSByb3dbZ3JvdXBCeVByb3BdLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgcmV0dXJuIGdyb3VwQnlWYWx1ZXMuc29tZSh2YWwgPT5cclxuICAgICAgY2VsbFZhbHVlLmluY2x1ZGVzKHZhbCkgJiYgY2VsbFZhbHVlLmxlbmd0aCA+IHZhbC5sZW5ndGhcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzaG91bGRSZW5kZXJBc0h5cGVyTGluayhlbGVtZW50OiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGdyb3VwQnlQcm9wID0gdGhpcy5wYWdlSW5mbz8uZ3JvdXBCeVByb3BlcnR5O1xyXG4gICAgY29uc3QgZ3JvdXBCeVZhbHVlcyA9IHRoaXMucGFnZUluZm8/Lmdyb3VwQnlWYWx1ZTtcclxuXHJcbiAgICBpZiAoIWdyb3VwQnlQcm9wIHx8ICFncm91cEJ5VmFsdWVzIHx8ICFlbGVtZW50W2dyb3VwQnlQcm9wXSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmFsdWUgPSBlbGVtZW50W2dyb3VwQnlQcm9wXS50b1N0cmluZygpO1xyXG5cclxuICAgIHJldHVybiAhZ3JvdXBCeVZhbHVlcy5zb21lKHYgPT4gdmFsdWUuaW5jbHVkZXModikgJiYgdmFsdWUubGVuZ3RoID49IHYubGVuZ3RoKTtcclxuICB9XHJcblxyXG5cclxuICBvblNvcnRBY3Rpb24oJGV2ZW50OiBTb3J0KSB7XHJcbiAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHVtbnMuZmluZChjID0+IGMucHJvcGVydHkgPT09ICRldmVudC5hY3RpdmUpO1xyXG5cclxuICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnNvcnRLZXkgPVxyXG4gICAgICAkZXZlbnQuYWN0aXZlICYmICRldmVudC5kaXJlY3Rpb25cclxuICAgICAgICA/IChjb2w/LnNvcnRLZXkgPz8gJGV2ZW50LmFjdGl2ZSlcclxuICAgICAgICA6ICdpZCc7XHJcblxyXG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Quc29ydERpcmVjdGlvbiA9ICRldmVudC5kaXJlY3Rpb24gPT09ICdhc2MnID8gJ0FTQycgOiAnREVTQyc7XHJcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlSW5kZXggPSAwO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uLmVtaXQoJGV2ZW50KTtcclxuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgc2hvdWxkU2hvd0J1dHRvbihlbGVtZW50OiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGdyb3VwQnlQcm9wID0gdGhpcy5wYWdlSW5mbz8uZ3JvdXBCeVByb3BlcnR5O1xyXG4gICAgY29uc3QgZ3JvdXBCeVZhbHVlcyA9IHRoaXMucGFnZUluZm8/Lmdyb3VwQnlWYWx1ZTtcclxuXHJcbiAgICBpZiAoIWdyb3VwQnlQcm9wIHx8ICFncm91cEJ5VmFsdWVzIHx8ICFlbGVtZW50W2dyb3VwQnlQcm9wXSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnRbZ3JvdXBCeVByb3BdLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgcmV0dXJuICFncm91cEJ5VmFsdWVzLnNvbWUodiA9PiB2YWx1ZS5pbmNsdWRlcyh2KSAmJiB2YWx1ZS5sZW5ndGggPj0gdi5sZW5ndGgpO1xyXG4gIH1cclxuXHJcbiAgc3RvcmVQZW5kaW5nRmlsdGVycygkZXZlbnQ6IHsgZmlsdGVyczogRmllbGRGaWx0ZXJbXSwgc2VhcmNoU3RyOiBzdHJpbmcgfSk6IHZvaWQge1xyXG4gICAgdGhpcy5wZW5kaW5nRmlsdGVycyA9ICRldmVudC5maWx0ZXJzIHx8IFtdO1xyXG4gICAgICB0aGlzLnNlYXJjaFN0ciA9ICRldmVudC5zZWFyY2hTdHI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0UGFnaW5hdGlvbkZvckZpbHRlckNoYW5nZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QpIHtcclxuICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QgPSBuZXcgRmlsdGVyUmVxdWVzdCh0aGlzLnBhZ2VTaXplIHx8IHRoaXMucGFnZUluZm8ucGFnZVNpemUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZUluZGV4ID0gMDtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gMTtcclxuICAgIGlmICh0aGlzLm1hbmFnZWFibGVQYWdlcykge1xyXG4gICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh0aGlzLnBhZ2VJbmRleCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhcHBseVBlbmRpbmdGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hZHZhbmNlZEFwcGxpZWRGaWx0ZXIgPSB0aGlzLnBlbmRpbmdGaWx0ZXJzIHx8IFtdO1xyXG4gICAgdGhpcy5yZXNldFBhZ2luYXRpb25Gb3JGaWx0ZXJDaGFuZ2UoKTtcclxuICAgIHRoaXMubG9hZERhdGEoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUZpbHRlckVtcHR5KCRldmVudDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKCRldmVudCkge1xyXG4gICAgICB0aGlzLnBlbmRpbmdGaWx0ZXJzID0gW107XHJcbiAgICAgIHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyID0gW107XHJcbiAgICAgIHRoaXMuc2VhcmNoU3RyID0gJyc7XHJcbiAgICAgIHRoaXMucmVzZXRQYWdpbmF0aW9uRm9yRmlsdGVyQ2hhbmdlKCk7XHJcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc2V0RGF0YSgkZXZlbnQ6IGJvb2xlYW4pIHtcclxuICAgIGlmICgkZXZlbnQpIHtcclxuICAgICAgdGhpcy5hZHZhbmNlZEFwcGxpZWRGaWx0ZXIgPSBbXTtcclxuICAgICAgdGhpcy5wZW5kaW5nRmlsdGVycyA9IFtdO1xyXG4gICAgICB0aGlzLnJlc2V0UGFnaW5hdGlvbkZvckZpbHRlckNoYW5nZSgpO1xyXG4gICAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgICAgIC8vIHRoaXMucGFnaW5hdG9yLmZpcnN0UGFnZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFzRmlsdGVyc0FwcGxpZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyICYmIHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyLmxlbmd0aCA+IDApIHx8XHJcbiAgICAgICAgICAgKHRoaXMuZmlsdGVycyAmJiB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCkgfHxcclxuICAgICAgICAgICAodGhpcy5wZW5kaW5nRmlsdGVycyAmJiB0aGlzLnBlbmRpbmdGaWx0ZXJzLmxlbmd0aCA+IDApO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGlzcGxheVN2Z1BhdGgoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmhhc0ZpbHRlcnNBcHBsaWVkKCkgJiYgdGhpcy5ub1Jlc3VsdFN2Z1BhdGggPyB0aGlzLm5vUmVzdWx0U3ZnUGF0aCA6IHRoaXMubm9EYXRhRm91bmRTdmdQYXRoO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGlzcGxheVRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5oYXNGaWx0ZXJzQXBwbGllZCgpICYmIHRoaXMubm9SZXN1bHRTdmdQYXRoID8gdGhpcy5ub1Jlc3VsdFRpdGxlIDogdGhpcy5ub0RhdGFGb3VuZFRpdGxlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGlzcGxheVN1YnRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5oYXNGaWx0ZXJzQXBwbGllZCgpICYmIHRoaXMubm9SZXN1bHRTdmdQYXRoID8gdGhpcy5ub1Jlc3VsdFN1YnRpdGxlIDogdGhpcy5ub0RhdGFGb3VuZFN1YnRpdGxlO1xyXG4gIH1cclxuXHJcbiAgYnV0dG9uQ2xpY2tlZEV2ZW50KCRldmVudDogQnV0dG9uQWN0aW9uU2V0dGluZ3MpIHtcclxuXHJcbiAgfVxyXG5cclxuICBnZXRNb2JpbGVDYXJkSWRDb2x1bW4oKTogVGFibGVDb2x1bW48YW55PiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbmQoYyA9PiBjLnZpc2libGUgJiYgYy5tb2JpbGVDYXJkSWQgPT09IHRydWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TW9iaWxlQ2FyZFN0YXR1c0NvbHVtbigpOiBUYWJsZUNvbHVtbjxhbnk+IHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZChjID0+IGMudmlzaWJsZSAmJiBjLm1vYmlsZUNhcmRTdGF0dXMgPT09IHRydWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TW9iaWxlQ2FyZENvbHVtbnMoKTogVGFibGVDb2x1bW48YW55PltdIHtcclxuICAgIGNvbnN0IGlkQ29sID0gdGhpcy5nZXRNb2JpbGVDYXJkSWRDb2x1bW4oKTtcclxuICAgIGNvbnN0IHN0YXR1c0NvbCA9IHRoaXMuZ2V0TW9iaWxlQ2FyZFN0YXR1c0NvbHVtbigpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT5cclxuICAgICAgYy52aXNpYmxlICYmXHJcbiAgICAgIGMucHJvcGVydHkgIT09ICdhY3Rpb25zJyAmJlxyXG4gICAgICBjICE9PSBpZENvbCAmJlxyXG4gICAgICBjICE9PSBzdGF0dXNDb2xcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBsYWJlbEtleUJ5VmFsdWUoY29sdW1uOiBUYWJsZUNvbHVtbjxhbnk+IHwgdW5kZWZpbmVkLCByb3c6IGFueSk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWNvbHVtbiB8fCAhY29sdW1uLnByb3BlcnR5KSByZXR1cm4gJyc7XHJcbiAgICByZXR1cm4gc3VwZXIubGFiZWxLZXlCeVZhbHVlKGNvbHVtbiwgcm93KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGJhc2VUYWJsZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBmbGV4LTEwMFwiID5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbHVtbiBhbGlnbi1zdGFydCBmbGV4LTEwMFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XHJcbiAgICAgIDxhcHAtdGl0bGUtYmFyXHJcbiAgICAgICAgW3BhZ2VUaXRsZV09XCJwYWdlSW5mby5oaWRlVGl0bGUgPyAnJyA6IHBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24rJy5saXN0X3RpdGxlJ1wiXHJcbiAgICAgICAgW3N1YlRpdGxlXT1cIihwYWdlSW5mby5oaWRlVGl0bGUgfHwgcGFnZUluZm8uaGlkZVN1YnRpdGxlKSA/ICcnIDogcGFnZUluZm8ubGFiZWxzU2VjdGlvbisnLnN1YnRpdGxlJ1wiXHJcbiAgICAgICAgW3RpdGxlTW9kZV09XCInJ1wiXHJcbiAgICAgICAgW3BhZ2VJbmZvXT1cInBhZ2VJbmZvXCJcclxuICAgICAgICBbbmV3QWN0aW9uXT1cInNob3dBZGROZXcoKVwiXHJcbiAgICAgICAgW3Nob3dFeHRyYWN0QnV0dG9uXT1cIiFwYWdlSW5mby5oaWRlRXh0cmFjdEJ1dHRvblwiXHJcbiAgICAgICAgW2RyYWZ0U3VwcG9ydGVkXT1cInBhZ2VJbmZvLmRyYWZ0U3VwcG9ydGVkXCJcclxuICAgICAgICBbaXNQZW5kaW5nXT1cImlzUGVuZGluZ1wiXHJcbiAgICAgICAgW29uVmlld01vZGVDaGFuZ2VdPVwic3dpdGNoVmlld01vZGUuYmluZCh0aGlzKVwiXHJcbiAgICAgICAgW2J1dHRvbnNdPVwiZXh0cmFBY3Rpb25zXCJcclxuICAgICAgICBbYnV0dG9uc0Rpc3BsYXlNb2RlXT1cImJ1dHRvbnNEaXNwbGF5TW9kZVwiXHJcbiAgICAgICAgKG5ld0FjdGlvbkNsaWNrZWQpPVwib25BZGROZXdBY3Rpb24oJGV2ZW50KVwiXHJcbiAgICAgICAgKGV4dHJhY3RSZXBvcnQpPVwiZXh0cmFjdFJlcG9ydCgkZXZlbnQpXCJcclxuICAgICAgICAodmlld01vZGVDaGFuZ2VkKT1cIm9uVmlld01vZGVDaGFuZ2VkUmVjZWl2ZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgKGJ1dHRvbkNsaWNrZWQpPVwiYnV0dG9uQ2xpY2tlZC5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIFt0b3RhbEVsZW1lbnRzXT1cInBhZ2VJbmZvLmhpZGVUaXRsZSA/IHVuZGVmaW5lZCA6IHRvdGFsRWxlbWVudHNcIj5cclxuICAgICAgPC9hcHAtdGl0bGUtYmFyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItcm93XCIgKm5nSWY9XCIhcGFnZUluZm8uaGlkZUFkdmFuY2VkRmlsdGVyXCI+XHJcbiAgICA8YXBwLWZpbHRlci1idWlsZGVyXHJcbiAgICAgICpuZ0lmPVwiIXBhZ2VJbmZvLmhpZGVBZHZhbmNlZEZpbHRlclwiXHJcbiAgICAgIFtwYWdlSW5mb109XCJwYWdlSW5mb1wiXHJcbiAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxyXG4gICAgICBbZmlsdGVyRmllbGRzXT1cImZpbHRlckZpZWxkc1wiXHJcbiAgICAgIFtwZW5kaW5nRmlsdGVyc109XCJwZW5kaW5nRmlsdGVyc1wiXHJcbiAgICAgIFtzaG93RXhwb3J0QnV0dG9uXT1cIiFwYWdlSW5mby5oaWRlRXh0cmFjdEJ1dHRvblwiXHJcbiAgICAgIChmaWx0ZXJJbmZvcm1hdGlvbik9XCJzdG9yZVBlbmRpbmdGaWx0ZXJzKCRldmVudClcIlxyXG4gICAgICAoaXNFbXB0eSk9XCJoYW5kbGVGaWx0ZXJFbXB0eSgkZXZlbnQpXCJcclxuICAgICAgKGFwcGx5RmlsdGVyKT1cImFwcGx5UGVuZGluZ0ZpbHRlcnMoKVwiXHJcbiAgICAgIChzb3J0QnlDbGlja2VkKT1cImhhbmRsZVNvcnRDbGljaygkZXZlbnQpXCJcclxuICAgICAgKGV4cG9ydENsaWNrZWQpPVwiZXh0cmFjdFJlcG9ydCgkZXZlbnQpXCI+XHJcbiAgICA8L2FwcC1maWx0ZXItYnVpbGRlcj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWdyb3VwXCIgKm5nSWY9XCIhcGFnZUluZm8uaGlkZUV4dHJhY3RCdXR0b25cIj5cclxuICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFwYWdlSW5mby5oaWRlRXh0cmFjdEJ1dHRvblwiXHJcbiAgICAgICAgbWF0LWZsYXQtYnV0dG9uXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImV4cG9ydE1lbnVcIlxyXG4gICAgICAgIGNsYXNzPVwiYnRuLWV4cG9ydFwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInZXhwb3J0JyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCJ0cnVlXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24tdGV4dFwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmZpbGVfZXhwb3J0PC9tYXQtaWNvbj5cclxuICAgICAgICAgIDxzcGFuPnt7ICdleHBvcnQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYXJyb3ctaWNvblwiPmtleWJvYXJkX2Fycm93X2Rvd248L21hdC1pY29uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxtYXQtbWVudSAjZXhwb3J0TWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImV4dHJhY3RSZXBvcnQoJ3BkZicpXCI+UERGPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJleHRyYWN0UmVwb3J0KCd4bHN4JylcIj5FeGNlbDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZXh0cmFjdFJlcG9ydCgnY3N2JylcIj5DU1Y8L2J1dHRvbj5cclxuICAgICAgPC9tYXQtbWVudT5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcblxyXG4gIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBmbGV4LTEwMCBiYXNlVGFibGVfX2RldGFpbHNDb2x1bW5cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEwMFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3cgZmxleC0xMDAgbWFpblRhYmxlXCI+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIlxyXG4gICAgICAgICAgcm9sZT1cInRhYmxlXCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXHJcbiAgICAgICAgICAgIHBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gJiYgIXBhZ2VJbmZvLmhpZGVUaXRsZVxyXG4gICAgICAgICAgICAgID8gKHBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyAnLmxpc3RfdGl0bGUnIHwgdHJhbnNsYXRlKVxyXG4gICAgICAgICAgICAgIDogbnVsbFxyXG4gICAgICAgICAgXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCIgW2F0dHIuZGF0YS1zb3J0XT1cInNvcnRTdGF0ZVwiIHJvbGU9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uUHJvcCBvZiB2aXNpYmxlQ29sdW1uc0FycmF5OyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICBjbGFzcz1cInRhYmxlLWhlYWRlci1jZWxsXCJcclxuICAgICAgICAgICAgICAgICByb2xlPVwiY29sdW1uaGVhZGVyXCJcclxuICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0Q29sdW1uQXJpYVNvcnQoY29sdW1uUHJvcClcIlxyXG4gICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImdldENvbHVtbihjb2x1bW5Qcm9wKT8uZW5hYmxlU29ydGluZyA/IDAgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICBbY2xhc3Muc29ydGFibGVdPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5lbmFibGVTb3J0aW5nXCJcclxuICAgICAgICAgICAgICAgICBbY2xhc3MuZmlyc3QtY2VsbF09XCJpID09PSAwXCJcclxuICAgICAgICAgICAgICAgICBbY2xhc3MubGFzdC1jZWxsXT1cImkgPT09IHZpc2libGVDb2x1bW5zQXJyYXkubGVuZ3RoIC0gMVwiXHJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGlvbnMtY2VsbF09XCJpID09PSB2aXNpYmxlQ29sdW1uc0FycmF5Lmxlbmd0aCAtIDEgJiYgY29sdW1uUHJvcCA9PT0gJ2FjdGlvbnMnXCJcclxuICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLXdpZHRoXT1cImdldENvbHVtbihjb2x1bW5Qcm9wKT8ud2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldENvbHVtbihjb2x1bW5Qcm9wKT8ud2lkdGggPyB7J3dpZHRoJzogZ2V0Q29sdW1uKGNvbHVtblByb3ApPy53aWR0aCArICclJywgJ2ZsZXgtYmFzaXMnOiBnZXRDb2x1bW4oY29sdW1uUHJvcCk/LndpZHRoICsgJyUnfSA6IHt9XCJcclxuICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5lbmFibGVTb3J0aW5nICYmIGhhbmRsZVNvcnRDbGljayhjb2x1bW5Qcm9wKVwiXHJcbiAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25Tb3J0SGVhZGVyS2V5ZG93bigkZXZlbnQsIGNvbHVtblByb3ApXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlci1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhYmxlLWhlYWRlci1sYWJlbFwiPnt7IGxhYmVsS2V5KGdldENvbHVtbihjb2x1bW5Qcm9wKSkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5lbmFibGVTb3J0aW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImdldFNvcnREaXJlY3Rpb24oY29sdW1uUHJvcCkgPT09ICdhc2MnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzb3J0LWljb24gc29ydC1hc2NcIj5hcnJvd19kcm9wX3VwPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZ2V0U29ydERpcmVjdGlvbihjb2x1bW5Qcm9wKSA9PT0gJ2Rlc2MnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzb3J0LWljb24gc29ydC1kZXNjXCI+YXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1ib2R5XCIgcm9sZT1cInJvd2dyb3VwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBkYXRhU291cmNlLmRhdGE7IGxldCByb3dJbmRleCA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICBjbGFzcz1cInRhYmxlLXJvd1wiXHJcbiAgICAgICAgICAgICAgICAgcm9sZT1cInJvd1wiXHJcbiAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiLTFcIlxyXG4gICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIid0YWJsZS1yb3ctJyArIChyb3c/LmlkIHx8IHJvdz8ua2V5IHx8ICcnKVwiXHJcbiAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgJ3RhYmxlLXJvdy0taGlnaGxpZ2h0Jzogc2VsZWN0ZWRSb3dJbmRleCA9PSByb3cuaWQgfHwgKHBhZ2VJbmZvLmdyb3VwQnlQcm9wZXJ0eSAmJiBwYWdlSW5mby5ncm91cEJ5VmFsdWU/LmluY2x1ZGVzKHJvd1twYWdlSW5mby5ncm91cEJ5UHJvcGVydHldKSksXHJcbiAgICAgICAgICAgICAgICAgICAndGFibGUtcm93LS1kYXJrLWhpZ2hsaWdodCc6IGlzRGFya0hpZ2hsaWdodChyb3cpXHJcbiAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgKGF1eGNsaWNrKT1cIm9wZW5OZXdUYWIocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgb25TZWxlY3RJdGVtKHJvdylcIj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW5Qcm9wIG9mIHZpc2libGVDb2x1bW5zQXJyYXk7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWJsZS1jZWxsXCJcclxuICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjZWxsXCJcclxuICAgICAgICAgICAgICAgICAgIFtjbGFzcy5maXJzdC1jZWxsXT1cImkgPT09IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgW2NsYXNzLmxhc3QtY2VsbF09XCJpID09PSB2aXNpYmxlQ29sdW1uc0FycmF5Lmxlbmd0aCAtIDFcIlxyXG4gICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGlvbnMtY2VsbF09XCJpID09PSB2aXNpYmxlQ29sdW1uc0FycmF5Lmxlbmd0aCAtIDEgJiYgY29sdW1uUHJvcCA9PT0gJ2FjdGlvbnMnXCJcclxuICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oYXMtd2lkdGhdPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy53aWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRDb2x1bW4oY29sdW1uUHJvcCk/LndpZHRoID8geyd3aWR0aCc6IGdldENvbHVtbihjb2x1bW5Qcm9wKT8ud2lkdGggKyAnJScsICdmbGV4LWJhc2lzJzogZ2V0Q29sdW1uKGNvbHVtblByb3ApPy53aWR0aCArICclJ30gOiB7fVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy50eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid3b3JrZmxvd1N0YXR1cydcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwid2ZTdGF0dXMge3sgZ2V0U3RhdHVzRGVzY3JpcHRpb24ocm93KX19XCIgW2F0dHIuaWRdPVwiJ3RhYmxlLWJ0bi13Zi0nK2NvbHVtblByb3ArJy0nKyhyb3cuaWQgfHwgcm93LmtleSB8fCAnJylcIiBbYXR0ci50YWJpbmRleF09XCItMVwiPnt7IGdldFN0YXR1c0Rlc2NyaXB0aW9uKHJvdykgfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaHlwZXItdGV4dCdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG91bGRSZW5kZXJBc0h5cGVyTGluayhyb3cpOyBlbHNlIHBsYWluSHlwZXJUZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWxhYmVsIGh5cGVyLWxpbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiLTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImh5cGVyTGlua0NsaWNrZWQoY29sdW1uUHJvcCwgcm93KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtblByb3ApIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5IeXBlclRleHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1sYWJlbFwiPnt7IGV4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW5Qcm9wKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIididXR0b24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3VsZFNob3dCdXR0b24ocm93KVwiIG1hdC1idXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJpbWFyeVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGFjdGlvbkJ1dHRvbkNsaWNrZWQoY29sdW1uUHJvcCwgcm93KVwiIFthdHRyLmlkXT1cIid0YWJsZS1idG4tYWN0aW9uLScrY29sdW1uUHJvcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgbGFiZWxLZXkoZ2V0Q29sdW1uKGNvbHVtblByb3ApKSArICdfdGl0bGUnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ljb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICdtYWluVGFibGVfX3RkX19pY29uLWdyZWVuJzogcm93W2NvbHVtblByb3BdID09PSAncGFzcycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAnbWFpblRhYmxlX190ZF9faWNvbi1vcmFuZ2UnOiByb3dbY29sdW1uUHJvcF0gPT09ICd3YXJuaW5nJyxcclxuICAgICAgICAgICAgICAgICAgICAgICdtYWluVGFibGVfX3RkX19pY29uLXJlZCc6IHJvd1tjb2x1bW5Qcm9wXSA9PT0gJ2Vycm9yJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImdldEljb25BcmlhTGFiZWxLZXkocm93W2NvbHVtblByb3BdKSB8IHRyYW5zbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgZ2V0SWNvbihyb3dbY29sdW1uUHJvcF0pIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cInByaW1hcnlcIiBbdGFiSW5kZXhdPVwiLTFcIiBbY2hlY2tlZF09XCJyb3dbY29sdW1uUHJvcF1cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2FjdGlvbkNoZWNrZWRDbGlja2VkKGNvbHVtblByb3Ascm93KVwiPjwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdGF0ZVR5cGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInN0YXRlVHlwZSB7eyByb3dbY29sdW1uUHJvcF19fVwiIFthdHRyLmlkXT1cIid0YWJsZS1idG4tc3RhdGUtJytjb2x1bW5Qcm9wXCIgW2F0dHIudGFiaW5kZXhdPVwiLTFcIj57eyBsYWJlbEtleUJ5VmFsdWUoZ2V0Q29sdW1uKGNvbHVtblByb3ApLCByb3cpIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uUHJvcCkgfCBkYXRlOidkZC9NTS95eXl5JyB9fVxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjcm9wcGVkVGV4dCdcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBnZXRDcm9wcGVkVGV4dChyb3dbY29sdW1uUHJvcF0sIHJvd1tnZXRDb2x1bW4oY29sdW1uUHJvcCk/LndpZHRoXSkgfX1cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZG93bmxvYWQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWFpblRhYmxlX190ZF9faWNvbi1ibHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQkFTRV9UQUJMRS5kb3dubG9hZEFjdGlvbicgfCB0cmFuc2xhdGVcIj5zeXN0ZW1fdXBkYXRlX2FsdDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ29uT2ZmJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInJvd1tjb2x1bW5Qcm9wXSA9PT0gbnVsbFwiIGNsYXNzPVwibWFpblRhYmxlX190ZF9faWNvbi1kYXJrb3JhbmdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXRPbk9mZkZsYWdBcmlhTGFiZWxLZXkobnVsbCkgfCB0cmFuc2xhdGVcIj5mbGFnPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJyb3dbY29sdW1uUHJvcF0gPT09IGZhbHNlXCIgY2xhc3M9XCJtYWluVGFibGVfX3RkX19pY29uLXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0T25PZmZGbGFnQXJpYUxhYmVsS2V5KGZhbHNlKSB8IHRyYW5zbGF0ZVwiPmZsYWc8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInJvd1tjb2x1bW5Qcm9wXSA9PT0gdHJ1ZVwiIGNsYXNzPVwibWFpblRhYmxlX190ZF9faWNvbi1ncmVlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0T25PZmZGbGFnQXJpYUxhYmVsS2V5KHRydWUpIHwgdHJhbnNsYXRlXCI+ZmxhZzwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N0YXR1cydcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd1tjb2x1bW5Qcm9wXSA9PT0gbnVsbCB8fCByb3dbY29sdW1uUHJvcF0gPT09IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBwYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgJy4nICsgZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5sYWJlbCArICdJbkFjdGl2ZScgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3dbY29sdW1uUHJvcF0gPT09IHRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IHBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyAnLicgKyBnZXRDb2x1bW4oY29sdW1uUHJvcCk/LmxhYmVsICsgJ0FjdGl2ZScgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2luZm8nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cIi0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0JBU0VfVEFCTEUucm93RGV0YWlscycgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtlbWl0RXZlbnQocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCIndGFibGUtYnRuLWluZm8tJytyb3cuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBhcmlhLWhpZGRlbj1cInRydWVcIj5pbmZvPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbmV0QW1vdW50J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYWluVGFibGVfX3RkX19jdXJyZW5jeVwiIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7XCI+e3sgcm93W2dldENvbHVtbihjb2x1bW5Qcm9wKT8uY3VycmVuY3ldIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYWluVGFibGVfX3RkX19wcm9wZXJ0eVwiIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7IG1hcmdpbi1sZWZ0OjZweDsgbWFyZ2luLXJpZ2h0OjZweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGV4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW5Qcm9wKSB8IGN1cnJlbmN5OicnOicnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsb2NhbERhdGVUaW1lJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGV4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW5Qcm9wKSB8IGRhdGUgOiBleHRyYWN0Rm9ybWF0KGdldENvbHVtbihjb2x1bW5Qcm9wKSkgfX1cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYmlnZGVjaW1hbCdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c21hbGw+PHN1cCBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2N1cnJlbmN5XCI+e3tyb3dbZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5jdXJyZW5jeV19fTwvc3VwPjwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtblByb3ApIHwgbnVtYmVyIDogKGdldENvbHVtbihjb2x1bW5Qcm9wKT8uZGlnaXRJbmZvIHx8ICcxLjMtNScpIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2xpc3RBY3Rpb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFwcC1idXR0b24tYWN0aW9uc1xyXG4gICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2J1dHRvbnNBY3Rpb25dPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy52aWV3VHlwZSA9PT0gJ2J1dHRvbnNBY3Rpb24nXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtsaXN0QWN0aW9uXT1cImxpc3RBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNdPVwibGlzdEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZEJ1dHRvbik9XCJhY3Rpb25MaXN0Q2xpY2tlZCgkZXZlbnQscm93KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXBwLWJ1dHRvbi1hY3Rpb25zPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy50cmFuc2xhdGU7IGVsc2Ugbm9UcmFuc2xhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cIi0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgZW1pdFJvdXRlUGFnZShyb3cpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyBcIi5cIiArIGV4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW5Qcm9wKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9UcmFuc2xhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCItMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGVtaXRSb3V0ZVBhZ2Uocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lclRleHRdPSdleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uUHJvcCknPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gTW9iaWxlIENhcmQgVmlldyAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkcy1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgZGF0YVNvdXJjZS5kYXRhOyBsZXQgcm93SW5kZXggPSBpbmRleFwiXHJcbiAgICAgICAgICAgICBjbGFzcz1cIm1vYmlsZS1jYXJkXCJcclxuICAgICAgICAgICAgIFthdHRyLmlkXT1cIidtb2JpbGUtY2FyZC0nICsgKHJvdz8uaWQgfHwgcm93Py5rZXkgfHwgJycpXCJcclxuICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgJ21vYmlsZS1jYXJkLS1oaWdobGlnaHQnOiBzZWxlY3RlZFJvd0luZGV4ID09IHJvdy5pZCB8fCAocGFnZUluZm8uZ3JvdXBCeVByb3BlcnR5ICYmIHBhZ2VJbmZvLmdyb3VwQnlWYWx1ZT8uaW5jbHVkZXMocm93W3BhZ2VJbmZvLmdyb3VwQnlQcm9wZXJ0eV0pKSxcclxuICAgICAgICAgICAgICAgJ21vYmlsZS1jYXJkLS1kYXJrLWhpZ2hsaWdodCc6IGlzRGFya0hpZ2hsaWdodChyb3cpXHJcbiAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgIChhdXhjbGljayk9XCJvcGVuTmV3VGFiKHJvdylcIlxyXG4gICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgb25TZWxlY3RJdGVtKHJvdylcIj5cclxuXHJcbiAgICAgICAgICA8IS0tIE1vYmlsZSBDYXJkIEhlYWRlcjogSUQvTmFtZSBhbmQgU3RhdHVzIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19oZWFkZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19oZWFkZXItaWRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vYmlsZS1jYXJkX19pZC10ZXh0XCI+e3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGdldE1vYmlsZUNhcmRJZENvbHVtbigpPy5wcm9wZXJ0eSB8fCAnaWQnKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtY2FyZF9faGVhZGVyLXN0YXR1c1wiICpuZ0lmPVwiZ2V0TW9iaWxlQ2FyZFN0YXR1c0NvbHVtbigpXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwic3RhdGVUeXBlIHt7IHJvd1tnZXRNb2JpbGVDYXJkU3RhdHVzQ29sdW1uKCk/LnByb3BlcnR5XX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIidtb2JpbGUtYnRuLXN0YXRlLScrZ2V0TW9iaWxlQ2FyZFN0YXR1c0NvbHVtbigpPy5wcm9wZXJ0eVwiPlxyXG4gICAgICAgICAgICAgICAge3sgbGFiZWxLZXlCeVZhbHVlKGdldE1vYmlsZUNhcmRTdGF0dXNDb2x1bW4oKSwgcm93KSB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBEaXZpZGVyIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19kaXZpZGVyXCI+PC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBNb2JpbGUgQ2FyZCBCb2R5OiBPdGhlciBjb2x1bW5zIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBnZXRNb2JpbGVDYXJkQ29sdW1ucygpXCIgY2xhc3M9XCJtb2JpbGUtY2FyZF9fcm93XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19yb3ctbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX0gOjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLWNhcmRfX3Jvdy12YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLnR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N0YXRlVHlwZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJzdGF0ZVR5cGUge3sgcm93W2NvbHVtbi5wcm9wZXJ0eV19fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCInbW9iaWxlLWJ0bi1zdGF0ZS0nK2NvbHVtbi5wcm9wZXJ0eVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgbGFiZWxLZXlCeVZhbHVlKGNvbHVtbiwgcm93KSB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtbi5wcm9wZXJ0eSkgfCBkYXRlOidkZC9NTS95eXl5JyB9fVxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIiduZXRBbW91bnQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb2JpbGUtY2FyZF9fYW1vdW50LWN1cnJlbmN5XCI+e3sgcm93W2NvbHVtbi5jdXJyZW5jeV0gfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb2JpbGUtY2FyZF9fYW1vdW50LXZhbHVlXCI+e3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtbi5wcm9wZXJ0eSkgfCBjdXJyZW5jeTonJzonJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbG9jYWxEYXRlVGltZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uLnByb3BlcnR5KSB8IGRhdGUgOiBleHRyYWN0Rm9ybWF0KGNvbHVtbikgfX1cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYmlnZGVjaW1hbCdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c21hbGw+PHN1cCBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2N1cnJlbmN5XCI+e3tyb3dbY29sdW1uLmN1cnJlbmN5XX19PC9zdXA+PC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uLnByb3BlcnR5KSB8IG51bWJlciA6IChjb2x1bW4uZGlnaXRJbmZvIHx8ICcxLjMtNScpIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHJhbnNsYXRlOyBlbHNlIG5vVHJhbnNsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBwYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgXCIuXCIgKyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uLnByb3BlcnR5KSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vVHJhbnNsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVyVGV4dF09J2V4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW4ucHJvcGVydHkpJz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIE1vYmlsZSBDYXJkIEFjdGlvbnMgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLWNhcmRfX2FjdGlvbnNcIiAqbmdJZj1cImxpc3RBY3Rpb24gJiYgbGlzdEFjdGlvbi5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgIDxhcHAtYnV0dG9uLWFjdGlvbnNcclxuICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXHJcbiAgICAgICAgICAgICAgW2J1dHRvbnNBY3Rpb25dPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW2xpc3RBY3Rpb25dPVwibGlzdEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgW2FjdGlvbnNdPVwibGlzdEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrZWRCdXR0b24pPVwiYWN0aW9uTGlzdENsaWNrZWQoJGV2ZW50LHJvdylcIj5cclxuICAgICAgICAgICAgPC9hcHAtYnV0dG9uLWFjdGlvbnM+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwibm9EYXRhRm91bmRcIiBjbGFzcz1cImRhdGFOb3RGb3VuZCBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgIDxpbWcgKm5nSWY9XCJnZXREaXNwbGF5U3ZnUGF0aCgpXCIgW3NyY109XCJnZXREaXNwbGF5U3ZnUGF0aCgpXCIgY2xhc3M9XCJkYXRhTm90Rm91bmRfX2ljb25cIiBhbHQ9XCJObyBkYXRhIGZvdW5kXCIgLz5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGFOb3RGb3VuZF9fdGl0bGVcIj57eyBnZXREaXNwbGF5VGl0bGUoKSB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0YU5vdEZvdW5kX19zdWJ0aXRsZVwiPnt7IGdldERpc3BsYXlTdWJ0aXRsZSgpIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgIDxkaXYgICpuZ0lmPVwiKGRhdGFTb3VyY2UuZGF0YT8ubGVuZ3RoID4gMCB8fCBjdXN0b21pemVkRGF0YSkgJiYgIXBhZ2VJbmZvLmhpZGVQYWdpbmF0aW9uXCIgY2xhc3M9XCJtYWluLXBhZ2luYXRpb24gZmxleC1yb3dcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5hYmxlUGFnaW5hdGlvblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGZsZXgtMTAwXCI+XHJcbiAgICAgICAgICAgIDxhcHAtcGFnaW5hdG9yXHJcbiAgICAgICAgICAgICAgW2N1cnJlbnRQYWdlXT1cInBhZ2VJbmRleFwiXHJcbiAgICAgICAgICAgICAgW3RvdGFsSXRlbXNdPVwidG90YWxFbGVtZW50c1wiXHJcbiAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcclxuICAgICAgICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cIls1LCAxMCwgMjUsIDUwXVwiXHJcbiAgICAgICAgICAgICAgW21vYmlsZUxvYWRNb3JlSW5jcmVtZW50XT1cIm1vYmlsZUxvYWRNb3JlSW5jcmVtZW50XCJcclxuICAgICAgICAgICAgICBbZGlzcGxheWVkSXRlbXNdPVwibW9iaWxlRGlzcGxheWVkSXRlbXMgfHwgZGF0YVNvdXJjZS5kYXRhLmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvbkxvYWRNb3JlKCRldmVudClcIj5cclxuICAgICAgICAgICAgPC9hcHAtcGFnaW5hdG9yPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
701
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtdGFibGUvYmFzZS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtdGFibGUvYmFzZS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFJTCxNQUFNLEVBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFDLGVBQWUsRUFBbUIsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsYUFBYSxFQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUNMLFlBQVksRUFDWixRQUFRLEVBQ1IsV0FBVyxFQUNYLE9BQU8sRUFDUCxPQUFPLEVBQ1AsSUFBSSxFQUNKLE9BQU8sRUFDUCxRQUFRLEVBQ1IsWUFBWSxFQUNaLGVBQWUsRUFDaEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDbkYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sNENBQTRDLENBQUM7QUFFbEYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FB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YixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgZWZmZWN0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXNcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge01hdFRhYmxlRGF0YVNvdXJjZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3RhYmxlXCI7XHJcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xyXG5pbXBvcnQge01hdFNvcnRNb2R1bGUsIFNvcnR9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zb3J0XCI7XHJcbmltcG9ydCB7XHJcbiAgQ3VycmVuY3lQaXBlLFxyXG4gIERhdGVQaXBlLFxyXG4gIERlY2ltYWxQaXBlLFxyXG4gIE5nQ2xhc3MsXHJcbiAgTmdGb3JPZixcclxuICBOZ0lmLFxyXG4gIE5nU3R5bGUsXHJcbiAgTmdTd2l0Y2gsXHJcbiAgTmdTd2l0Y2hDYXNlLFxyXG4gIE5nU3dpdGNoRGVmYXVsdFxyXG59IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHtNYXRJY29ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvblwiO1xyXG5pbXBvcnQge01hdEJ1dHRvbiwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uQnV0dG9ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uXCI7XHJcbmltcG9ydCB7Tmd4UGFnaW5hdGlvbk1vZHVsZX0gZnJvbSBcIm5neC1wYWdpbmF0aW9uXCI7XHJcbmltcG9ydCB7QnV0dG9uQWN0aW9uc0NvbXBvbmVudH0gZnJvbSBcIi4uL2J1dHRvbi1hY3Rpb25zL2J1dHRvbi1hY3Rpb25zLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge1NoYXJlRGF0YVNlcnZpY2V9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy90cmlnZ2VyLWZvcm0uc2VydmljZVwiO1xyXG5pbXBvcnQge0Jhc2VVdGlsc30gZnJvbSBcIi4uLy4uL3V0aWxzL2Jhc2UtdXRpbHNcIjtcclxuaW1wb3J0IHtCYWNrZW5kU2VydmljZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2JhY2tlbmQtc2VydmljZVwiO1xyXG5pbXBvcnQge0ZpbHRlcn0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvZmlsdGVyLm1vZGVsXCI7XHJcbmltcG9ydCB7RmlsdGVyUmVxdWVzdH0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvZmlsdGVyLXJlcXVlc3RcIjtcclxuaW1wb3J0IHtcclxuICBCdXR0b25BY3Rpb25TZXR0aW5ncyxcclxuICBFTVBUWV9QQUdFX0lORk8sXHJcbiAgRmllbGRJbmZvLFxyXG4gIEZST05UX0VORF9DT0xVTU5fVFlQRVMsXHJcbiAgUGFnZUluZm8sXHJcbiAgVEFCTEVfUkVDT1JEX0FDVElPTixcclxuICBUYWJsZUNvbHVtblxyXG59IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsXCI7XHJcbmltcG9ydCB7UmVwb3J0UmVxdWVzdH0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvcmVwb3J0LXJlcXVlc3QubW9kZWxcIjtcclxuaW1wb3J0IHtUYWJsZVBhZ2VVc2VyQWN0aW9ufSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC90YWJsZS1wYWdlLXVzZXItYWN0aW9uLmludGVyZmFjZVwiO1xyXG5pbXBvcnQge1dvcmtmbG93fSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC93b3JrZmxvdy93b3JrZmxvdy5tb2RlbFwiO1xyXG5pbXBvcnQge1Jlc3BvbnNlRW52ZWxvcH0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvcmVzcG9uc2UtZW52ZWxvcC5tb2RlbFwiO1xyXG5pbXBvcnQge1JvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge0xpdmVBbm5vdW5jZXJ9IGZyb20gXCJAYW5ndWxhci9jZGsvYTExeVwiO1xyXG5pbXBvcnQge1RpdGxlQmFyQ29tcG9uZW50fSBmcm9tIFwiLi4vdGl0bGUtYmFyL3RpdGxlLWJhci5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtQYWdpbmF0b3JDb21wb25lbnR9IGZyb20gXCIuLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge01hdENoZWNrYm94fSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3hcIjtcclxuaW1wb3J0IHtGaWx0ZXJCdWlsZGVyQ29tcG9uZW50fSBmcm9tIFwiLi4vYWR2YW5jZWQtZmlsdGVyL2ZpbHRlci1idWlsZGVyL2ZpbHRlci1idWlsZGVyLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0ZpZWxkRmlsdGVyfSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9maWVsZC1maWx0ZXIubW9kZWxcIjtcclxuaW1wb3J0IHtNYXRNZW51LCBNYXRNZW51SXRlbSwgTWF0TWVudVRyaWdnZXJ9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9tZW51XCI7XHJcbmltcG9ydCB7QnJlYWtwb2ludE9ic2VydmVyLCBCcmVha3BvaW50c30gZnJvbSBcIkBhbmd1bGFyL2Nkay9sYXlvdXRcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWJhc2UtdGFibGUnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Jhc2UtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2Jhc2UtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICBhbmltYXRpb25zOiBbXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBOZ1N0eWxlLFxyXG4gICAgTmdDbGFzcyxcclxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcclxuICAgIE1hdEljb24sXHJcbiAgICBNYXRTb3J0TW9kdWxlLFxyXG4gICAgTmdJZixcclxuICAgIE5nU3dpdGNoLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgRGF0ZVBpcGUsXHJcbiAgICBDdXJyZW5jeVBpcGUsXHJcbiAgICBOZ3hQYWdpbmF0aW9uTW9kdWxlLFxyXG4gICAgTmdTd2l0Y2hDYXNlLFxyXG4gICAgTmdTd2l0Y2hEZWZhdWx0LFxyXG4gICAgTWF0SWNvbkJ1dHRvbixcclxuICAgIE5nRm9yT2YsXHJcbiAgICBNYXRCdXR0b24sXHJcbiAgICBCdXR0b25BY3Rpb25zQ29tcG9uZW50LFxyXG4gICAgVGl0bGVCYXJDb21wb25lbnQsXHJcbiAgICBQYWdpbmF0b3JDb21wb25lbnQsXHJcbiAgICBEZWNpbWFsUGlwZSxcclxuICAgIE1hdENoZWNrYm94LFxyXG4gICAgRmlsdGVyQnVpbGRlckNvbXBvbmVudCxcclxuICAgIE1hdE1lbnVUcmlnZ2VyLFxyXG4gICAgTWF0TWVudSxcclxuICAgIE1hdE1lbnVJdGVtLFxyXG5cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXNlVGFibGVDb21wb25lbnQgZXh0ZW5kcyBCYXNlVXRpbHMgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICB0eXBlczogc3RyaW5nW10gPSBbXCJwZGZcIiwgXCJjc3ZcIiwgXCJ4bHN4XCJdXHJcbiAgY29sbGVjdGlvbiA9IHtjb3VudDogNjAsIGRhdGE6IFtdfTtcclxuICBjb25maWcgPSB7XHJcbiAgICBpdGVtc1BlclBhZ2U6IDEwLFxyXG4gICAgY3VycmVudFBhZ2U6IDEsXHJcbiAgICB0b3RhbEl0ZW1zOiB0aGlzLmNvbGxlY3Rpb24uY291bnRcclxuICB9O1xyXG4gIHB1YmxpYyBtYXhTaXplOiBudW1iZXIgPSA3O1xyXG4gIHB1YmxpYyBkaXJlY3Rpb25MaW5rczogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIGF1dG9IaWRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHJlc3BvbnNpdmU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyBsYWJlbHM6IGFueSA9IHtcclxuICAgIHByZXZpb3VzTGFiZWw6ICc8JyxcclxuICAgIG5leHRMYWJlbDogJz4nLFxyXG4gICAgc2NyZWVuUmVhZGVyUGFnaW5hdGlvbkxhYmVsOiAnUGFnaW5hdGlvbicsXHJcbiAgICBzY3JlZW5SZWFkZXJQYWdlTGFiZWw6ICdwYWdlJyxcclxuICAgIHNjcmVlblJlYWRlckN1cnJlbnRMYWJlbDogYFlvdSdyZSBvbiBwYWdlYFxyXG4gIH07XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZmlsdGVyRmllbGRzOiBGaWVsZEluZm9bXTtcclxuICBASW5wdXQoKSBub0RhdGFGb3VuZFN2Z1BhdGg6IHN0cmluZztcclxuICBASW5wdXQoKSBub0RhdGFGb3VuZFRpdGxlID0gJ25vRGF0YUZvdW5kVGl0bGUnO1xyXG4gIEBJbnB1dCgpIG5vRGF0YUZvdW5kU3VidGl0bGUgPSAnbm9EYXRhRm91bmRTdWJ0aXRsZSc7XHJcbiAgQElucHV0KCkgbm9SZXN1bHRTdmdQYXRoOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbm9SZXN1bHRUaXRsZSA9ICdub1Jlc3VsdFRpdGxlJztcclxuICBASW5wdXQoKSBub1Jlc3VsdFN1YnRpdGxlID0gJ25vUmVzdWx0U3VidGl0bGUnO1xyXG4gIHRvdGFsRWxlbWVudHMgPSAwO1xyXG4gIHBhZ2VzQ291bnQgPSAwO1xyXG4gIHBhZ2VJbmRleCA9IDE7XHJcbiAgcGFnZVNpemUgPSAxMDtcclxuICBtb2JpbGVEaXNwbGF5ZWRJdGVtcyA9IDA7XHJcbiAgcHJpdmF0ZSBzZWxlY3RlZFN0YXR1c0ZpbHRlcjogRmlsdGVyW10gPSBbXTtcclxuICBhZHZhbmNlZEFwcGxpZWRGaWx0ZXI6IGFueVtdID0gW107XHJcbiAgcGVuZGluZ0ZpbHRlcnM6IGFueVtdID0gW107XHJcbiAgc2VhcmNoU3RyOiBzdHJpbmcgPSAnJztcclxuICBwcml2YXRlIGZpbHRlclJlcXVlc3Q6IEZpbHRlclJlcXVlc3QgPSBuZXcgRmlsdGVyUmVxdWVzdCgpO1xyXG4gIHByaXZhdGUgdGltZXI6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIG92ZXJyaWRlIHBhZ2VJbmZvOiBQYWdlSW5mbyA9IEVNUFRZX1BBR0VfSU5GTztcclxuXHJcbiAgQElucHV0KClcclxuICBlbmFibGVQYWdpbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KClcclxuICBtb2JpbGVQYWdlU2l6ZTogbnVtYmVyID0gMjtcclxuXHJcbiAgQElucHV0KClcclxuICBtb2JpbGVMb2FkTW9yZUluY3JlbWVudDogbnVtYmVyID0gMjtcclxuXHJcbiAgQElucHV0KCkgZGF0YT86IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+O1xyXG4gIEBJbnB1dCgpXHJcbiAgbGlzdEFjdGlvbjogQnV0dG9uQWN0aW9uU2V0dGluZ3NbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGV4dHJhQWN0aW9uczogQnV0dG9uQWN0aW9uU2V0dGluZ3NbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGJ1dHRvbnNEaXNwbGF5TW9kZTogJ2Ryb3Bkb3duJyB8ICdsaXN0JyA9ICdkcm9wZG93bic7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgY29sdW1uczogVGFibGVDb2x1bW48YW55PltdO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGZpbHRlcnM6IEZpbHRlcltdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIC8vQHRzLWlnbm9yZVxyXG4gIHBhdGhQYXJhbTogbnVtYmVyO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGV4dHJhQnV0dG9uOiAgQnV0dG9uQWN0aW9uU2V0dGluZ3NbXSA9IFtdO1xyXG5cclxuICBAT3V0cHV0KCkgYnV0dG9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QnV0dG9uQWN0aW9uU2V0dGluZ3M+KCk7XHJcblxyXG4gIEBJbnB1dCgpIC8vQHRzLWlnbm9yZVxyXG4gIGVuZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaXNQZW5kaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgdHJpZ2dlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHJlcG9ydFJlcXVlc3Q6IFJlcG9ydFJlcXVlc3QgPSBuZXcgUmVwb3J0UmVxdWVzdCh7fSk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2VwYXJhdGVFbmRwb2ludERhdGE6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIG1hbmFnZWFibGVQYWdlczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgdG90YWxQYWdlc0NvdW50OiBudW1iZXIgPSAwO1xyXG4gIEBJbnB1dCgpXHJcbiAgY3VycmVudFBhZ2VJbmRleDogbnVtYmVyID0gMDtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG5cclxuICBAT3V0cHV0KClcclxuICB1c2VyQWN0aW9uOiBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlUGFnZVVzZXJBY3Rpb24+KCk7XHJcbiAgQE91dHB1dCgpXHJcbiAgaHlwZXJMaW5rQWN0aW9uOiBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlUGFnZVVzZXJBY3Rpb24+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGV4dHJhQWN0aW9uOiBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlUGFnZVVzZXJBY3Rpb24+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHNlbGVjdGVkQ29sdW1uOiBFdmVudEVtaXR0ZXI8U29ydD4gPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGxpc3RBY3Rpb25DbGlja2VkOiBFdmVudEVtaXR0ZXI8eyBhY3Rpb246IEJ1dHRvbkFjdGlvblNldHRpbmdzLCByb3c6IGFueSAsIGlzUGVuZGluZzogYm9vbGVhbn0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7XHJcbiAgICBhY3Rpb246IEJ1dHRvbkFjdGlvblNldHRpbmdzLFxyXG4gICAgcm93OiBhbnksXHJcbiAgICBpc1BlbmRpbmc6IGJvb2xlYW5cclxuICB9PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBzaG93RGlhbG9nOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICB1c2VkV29ya2Zsb3chOiBXb3JrZmxvdztcclxuXHJcbiAgbW9kZTphbnk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgY3VzdG9taXplZERhdGE/OiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcclxuICBkYXRhU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcclxuICBzZWxlY3RlZFJvd0luZGV4ID0gLTE7XHJcbiAgbm9EYXRhRm91bmQgPSBmYWxzZTtcclxuICB0b3RhbFJlcXVpcmVkQ291bnRJdGVtID0gMDtcclxuXHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGNsaWNrUm91dGVQYWdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgICAgcHJpdmF0ZSBiYWNrZW5kU2VydmljZTogQmFja2VuZFNlcnZpY2UsXHJcbiAgICAgIHB1YmxpYyB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICBwdWJsaWMgc2hhcmVEYXRhU2VydmljZTogU2hhcmVEYXRhU2VydmljZSxcclxuICAgICAgcHJpdmF0ZSBicmVha3BvaW50T2JzZXJ2ZXI6IEJyZWFrcG9pbnRPYnNlcnZlcixcclxuICAgICAgQEluamVjdCgnc2VjdXJpdHlNYW5hZ2VyJykgcHJpdmF0ZSBzZWN1cml0eU1hbmFnZXI6IGFueSxcclxuICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgICAgcHJpdmF0ZSByZWFkb25seSBsaXZlQW5ub3VuY2VyOiBMaXZlQW5ub3VuY2VyLFxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoKTtcclxuICAgIHRoaXMuY29sdW1ucyA9IFtdO1xyXG4gICAgdGhpcy5maWx0ZXJSZXF1ZXN0ID0gbmV3IEZpbHRlclJlcXVlc3QoKTtcclxuXHJcblxyXG4gICAgZWZmZWN0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMucGFnZUluZm8ubGF6eUxvYWREYXRhICE9PSB0cnVlIHx8IHRoaXMuZW5mb3JjZVJlZnJlc2ggPT09IHRydWUpIHtcclxuICAgICAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmlzRW1wdHlJdGVtcyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCA8PSAwO1xyXG4gICAgaWYgKHRoaXMuY3VzdG9taXplZERhdGEpIHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlID0gdGhpcy5jdXN0b21pemVkRGF0YTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMubWFuYWdlYWJsZVBhZ2VzKSB7XHJcbiAgICAgIHRoaXMucGFnZXNDb3VudCA9IHRoaXMudG90YWxQYWdlc0NvdW50O1xyXG4gICAgICB0aGlzLnBhZ2VJbmRleCA9IHRoaXMuY3VycmVudFBhZ2VJbmRleDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm1vYmlsZURpc3BsYXllZEl0ZW1zID0gdGhpcy5wYWdlU2l6ZTtcclxuXHJcbiAgICB0aGlzLmJyZWFrcG9pbnRPYnNlcnZlclxyXG4gICAgICAub2JzZXJ2ZShbJyhtYXgtd2lkdGg6IDc2OHB4KSddKVxyXG4gICAgICAuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5tYXRjaGVzKSB7XHJcbiAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gMjtcclxuICAgICAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gMTA7XHJcbiAgICAgICAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uUGFnZUNoYW5nZShldmVudDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmRleCA9IGV2ZW50O1xyXG4gICAgdGhpcy5nZXROZXh0KHRoaXMucGFnZUluZGV4IC0gMSk7XHJcbiAgICBpZiAodGhpcy5tYW5hZ2VhYmxlUGFnZXMpIHtcclxuICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQodGhpcy5wYWdlSW5kZXgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGV4dHJhY3RGaWVsZE5hbWUoZWxlbWVudDogYW55LCBwcm9wZXJ0eTogc3RyaW5nKSB7XHJcbiAgICBpZiAocHJvcGVydHk/LmluY2x1ZGVzKCcuJykpIHtcclxuICAgICAgcmV0dXJuIHByb3BlcnR5LnNwbGl0KCcuJykucmVkdWNlKChhY2MsIHBhcnQpID0+IGFjYyAmJiBhY2NbcGFydF0sIGVsZW1lbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgYyA9IHRoaXMuY29sdW1ucy5maW5kKGMgPT4gYy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50W3Byb3BlcnR5XSkgJiYgYy5hcnJheVN1YlByb3BlcnR5ICkge1xyXG4gICAgICAgIGNvbnN0IGZpZWxkVmFsdWVzID0gZWxlbWVudFtwcm9wZXJ0eV0ubWFwKGYgPT4gZltjLmFycmF5U3ViUHJvcGVydHldKTtcclxuICAgICAgICByZXR1cm4gIGZpZWxkVmFsdWVzLmpvaW4oJywgJyk7XHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudFtwcm9wZXJ0eV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCB2aXNpYmxlQ29sdW1ucygpIHtcclxuICAgIHRoaXMuYnVpbGRHcm91cHMoKVxyXG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlKS5tYXAoY29sdW1uID0+IGNvbHVtbi5wcm9wZXJ0eSk7XHJcbiAgfVxyXG5cclxuICBnZXQgdmlzaWJsZUNvbHVtbnNBcnJheSgpIHtcclxuICAgIHJldHVybiB0aGlzLnZpc2libGVDb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29sdW1uKHByb3BlcnR5OiBzdHJpbmcpOiBUYWJsZUNvbHVtbjxhbnk+IHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZChjID0+IGMucHJvcGVydHkgPT09IHByb3BlcnR5KTtcclxuICB9XHJcblxyXG4gIGdldFNvcnREaXJlY3Rpb24ocHJvcGVydHk6IHN0cmluZyk6ICdhc2MnIHwgJ2Rlc2MnIHwgJycge1xyXG4gICAgaWYgKHRoaXMucmVwb3J0UmVxdWVzdD8uZmlsdGVyUmVxdWVzdD8uc29ydEtleSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Quc29ydERpcmVjdGlvbiA9PT0gJ0FTQycgPyAnYXNjJyA6ICdkZXNjJztcclxuICAgIH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIGhhbmRsZVNvcnRDbGljayhwcm9wZXJ0eTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBDT0xVTU4gPSB0aGlzLmdldENvbHVtbihwcm9wZXJ0eSk7XHJcbiAgICBpZiAoIUNPTFVNTiB8fCAhQ09MVU1OLmVuYWJsZVNvcnRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IENVUlJFTlRfRElSRUNUSU9OID0gdGhpcy5nZXRTb3J0RGlyZWN0aW9uKHByb3BlcnR5KTtcclxuICAgIGxldCBORVdfRElSRUNUSU9OOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnO1xyXG5cclxuICAgIGlmIChDVVJSRU5UX0RJUkVDVElPTiA9PT0gJ2FzYycpIHtcclxuICAgICAgTkVXX0RJUkVDVElPTiA9ICdkZXNjJztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9uU29ydEFjdGlvbih7XHJcbiAgICAgIGFjdGl2ZTogcHJvcGVydHksXHJcbiAgICAgIGRpcmVjdGlvbjogTkVXX0RJUkVDVElPTlxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblNvcnRIZWFkZXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBjb2x1bW5Qcm9wOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5nZXRDb2x1bW4oY29sdW1uUHJvcCk/LmVuYWJsZVNvcnRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICcgJykge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLmhhbmRsZVNvcnRDbGljayhjb2x1bW5Qcm9wKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBhcmlhLXNvcnQgb24gc29ydGFibGUgY29sdW1uIGhlYWRlcnMgKFdDQUcgdGFibGUgc2VtYW50aWNzKS4gKi9cclxuICBnZXRDb2x1bW5BcmlhU29ydChjb2x1bW5Qcm9wOiBzdHJpbmcpOiAnYXNjZW5kaW5nJyB8ICdkZXNjZW5kaW5nJyB8ICdub25lJyB8IG51bGwge1xyXG4gICAgaWYgKCF0aGlzLmdldENvbHVtbihjb2x1bW5Qcm9wKT8uZW5hYmxlU29ydGluZykge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IGQgPSB0aGlzLmdldFNvcnREaXJlY3Rpb24oY29sdW1uUHJvcCk7XHJcbiAgICBpZiAoZCA9PT0gJ2FzYycpIHtcclxuICAgICAgcmV0dXJuICdhc2NlbmRpbmcnO1xyXG4gICAgfVxyXG4gICAgaWYgKGQgPT09ICdkZXNjJykge1xyXG4gICAgICByZXR1cm4gJ2Rlc2NlbmRpbmcnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICdub25lJztcclxuICB9XHJcblxyXG4gIHNvcnRTdGF0ZTogYW55ID0ge307XHJcblxyXG4gIGdldE5leHQocGFnZUluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcclxuICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZTtcclxuICAgIHRoaXMubG9hZERhdGEoKTtcclxuICB9XHJcbiAgb25QYWdlU2l6ZUNoYW5nZShldmVudDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gZXZlbnQ7XHJcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDE7IC8vIHJlc2V0IHRvIGZpcnN0IHBhZ2Ugb24gcGFnZSBzaXplIGNoYW5nZVxyXG4gICAgdGhpcy5tb2JpbGVEaXNwbGF5ZWRJdGVtcyA9IDA7XHJcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XHJcbiAgICB0aGlzLmdldE5leHQoMCk7XHJcbiAgfVxyXG5cclxuICBvbkxvYWRNb3JlKGl0ZW1zVG9Mb2FkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGN1cnJlbnREaXNwbGF5ZWQgPSB0aGlzLm1vYmlsZURpc3BsYXllZEl0ZW1zIHx8IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCB8fCB0aGlzLnBhZ2VTaXplO1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IE1hdGgubWluKGN1cnJlbnREaXNwbGF5ZWQgKyBpdGVtc1RvTG9hZCwgdGhpcy50b3RhbEVsZW1lbnRzKTtcclxuICAgIHRoaXMubW9iaWxlRGlzcGxheWVkSXRlbXMgPSB0aGlzLnBhZ2VTaXplO1xyXG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xyXG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZUluZGV4ID0gMDtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMubG9hZERhdGEodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWREYXRhKHNraXBNb2JpbGVSZXNldDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XHJcblxyXG4gICAgaWYgKCFza2lwTW9iaWxlUmVzZXQpIHtcclxuICAgICAgLy8gdGhpcy5pbml0aWFsaXplTW9iaWxlUGFnZVNpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0KSB7XHJcbiAgICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0ID0gbmV3IEZpbHRlclJlcXVlc3QodGhpcy5wYWdlU2l6ZSB8fCB0aGlzLnBhZ2VJbmZvLnBhZ2VTaXplKTtcclxuICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Quc2VhcmNoU3RyID0gdGhpcy5zZWFyY2hTdHI7XHJcbiAgICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LmZpbHRlcnMgPSBbXHJcbiAgICAgICAgLi4uKHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyIHx8IFtdKSxcclxuICAgICAgICAuLi4odGhpcy5maWx0ZXJzIHx8IFtdKS5maWx0ZXIoZiA9PlxyXG4gICAgICAgICAgISh0aGlzLmFkdmFuY2VkQXBwbGllZEZpbHRlciB8fCBbXSkuc29tZShhID0+IGEuZmllbGQgPT09IGYuZmllbGROYW1lKVxyXG4gICAgICAgIClcclxuICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XHJcbiAgICBpZiAodGhpcy5zZXBhcmF0ZUVuZHBvaW50RGF0YSB8fCAhdGhpcy5wYWdlSW5mby5hcGlVcmkgfHwgdGhpcy5wYWdlSW5mby5hcGlVcmkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5zZXBhcmF0ZUVuZHBvaW50RGF0YTtcclxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5hbm5vdW5jZVRhYmxlUmVzdWx0cygpKTtcclxuICAgIH0gZWxzZSBpZih0aGlzLnJlcG9ydFJlcXVlc3QgPT0gdW5kZWZpbmVkKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIGlmKCF0aGlzLm1hbmFnZWFibGVQYWdlcykgIHtcclxuICAgICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xyXG4gICAgICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QuY29sdW1ucyA9IHRoaXMuY29sdW1ucz8uZmlsdGVyKGMgPT4gRlJPTlRfRU5EX0NPTFVNTl9UWVBFUy5pbmRleE9mKGMudHlwZSkgPCAwICkubWFwKGMgPT4gYy5wcm9wZXJ0eSkgfHwgW107XHJcbiAgICAgICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wZW5kaW5nUGFnZSA9IHRoaXMuaXNQZW5kaW5nO1xyXG4gICAgICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Quc2VhcmNoU3RyID0gdGhpcy5zZWFyY2hTdHI7XHJcbiAgICAgICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5maWx0ZXJzID0gW1xyXG4gICAgICAgICAgICAuLi4odGhpcy5hZHZhbmNlZEFwcGxpZWRGaWx0ZXIgfHwgW10pLFxyXG4gICAgICAgICAgICAuLi4odGhpcy5maWx0ZXJzIHx8IFtdKS5maWx0ZXIoZiA9PlxyXG4gICAgICAgICAgICAgICEodGhpcy5hZHZhbmNlZEFwcGxpZWRGaWx0ZXIgfHwgW10pLnNvbWUoYSA9PiBhLmZpZWxkID09PSBmLmZpZWxkTmFtZSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgXTtcclxuICAgICAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5nZXRJdGVtc0J5RmlsdGVyKHRoaXMucmVwb3J0UmVxdWVzdD8uZmlsdGVyUmVxdWVzdCwgdGhpcy5wYWdlSW5mby5hcGlVcmkpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCByZXNwb25zZUVudmVsb3BlID0gbmV3IFJlc3BvbnNlRW52ZWxvcChyZXNwKTtcclxuICAgICAgICAgICAgICBpZiAocmVzcG9uc2VFbnZlbG9wZS52YWxpZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbFJlcXVpcmVkQ291bnRJdGVtID0gdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZVNpemVcclxuICAgICAgICAgICAgICAgIHRoaXMubm9EYXRhRm91bmQgPSByZXNwb25zZUVudmVsb3BlLmJvZHkubGVuZ3RoIDwgMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gcmVzcG9uc2VFbnZlbG9wZS5ib2R5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5pc0VtcHR5SXRlbXMgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPD0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMudG90YWxFbGVtZW50cyA9IHJlc3BvbnNlRW52ZWxvcGUudG90YWxTaXplIHx8IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VzQ291bnQgPSBNYXRoLmNlaWwodGhpcy50b3RhbEVsZW1lbnRzIC8gdGhpcy5wYWdlU2l6ZSkgfHwgMTtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFnZUluZGV4ID0gKHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleCB8fCAwKSArIDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy50b3RhbEl0ZW1zID0gcmVzcG9uc2VFbnZlbG9wZS50b3RhbFNpemUgfHwgMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmN1cnJlbnRQYWdlID0gdGhpcy5wYWdlSW5kZXggKyAxO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2JpbGVEaXNwbGF5ZWRJdGVtcyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuYW5ub3VuY2VUYWJsZVJlc3VsdHMoKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgICwgMzAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYW5ub3VuY2VUYWJsZVJlc3VsdHMoKTogdm9pZCB7XHJcbiAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5kYXRhU291cmNlPy5kYXRhPy5sZW5ndGggPz8gMDtcclxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy50b3RhbEVsZW1lbnRzID8/IHZpc2libGU7XHJcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0JBU0VfVEFCTEUucmVzdWx0c0Fubm91bmNlbWVudCcsIHtcclxuICAgICAgdmlzaWJsZSxcclxuICAgICAgdG90YWwsXHJcbiAgICB9KTtcclxuICAgIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKG1lc3NhZ2UsICdwb2xpdGUnKTtcclxuICB9XHJcblxyXG4gIGdldFN0YXR1c0Rlc2NyaXB0aW9uKGVsZW1lbnQ6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuYmFja2VuZFNlcnZpY2UuZ2V0U3RhdHVzRGVzY3JpcHRpb24oZWxlbWVudCwgdGhpcy51c2VkV29ya2Zsb3cpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RhdGVUeXBlKGVsZW1lbnQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGVsZW1lbnQuc3RhdGVUeXBlXHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1tcImN1c3RvbWl6ZWREYXRhXCJdICYmICFjaGFuZ2VzW1wiY3VzdG9taXplZERhdGFcIl0uaXNGaXJzdENoYW5nZSgpKSB7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gY2hhbmdlc1tcImN1c3RvbWl6ZWREYXRhXCJdLmN1cnJlbnRWYWx1ZT8uZGF0YSB8fCBbXTsgIC8vIFVwZGF0ZSBkYXRhIHNvdXJjZSB3aXRoIG5ldyBkYXRhXHJcbiAgICAgIHRoaXMucGFnZXNDb3VudD10aGlzLnRvdGFsUGFnZXNDb3VudDtcclxuICAgICAgdGhpcy5wYWdlSW5kZXg9dGhpcy5jdXJyZW50UGFnZUluZGV4O1xyXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLmFubm91bmNlVGFibGVSZXN1bHRzKCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbXCJlbmZvcmNlUmVmcmVzaFwiXSAmJiAhY2hhbmdlc1tcImVuZm9yY2VSZWZyZXNoXCJdLmlzRmlyc3RDaGFuZ2UoKSkge1xyXG4gICAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1tcImlzUGVuZGluZ1wiXSAmJiAhY2hhbmdlc1tcImlzUGVuZGluZ1wiXS5pc0ZpcnN0Q2hhbmdlKCkpIHtcclxuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXRDcm9wcGVkVGV4dChlbGVtZW50VmFsdWU6IGFueSwgc3ViV2lkdGg6IG51bWJlciA9IDIwKSB7XHJcbiAgICByZXR1cm4gZWxlbWVudFZhbHVlICYmIGVsZW1lbnRWYWx1ZS5sZW5ndGggPiBzdWJXaWR0aCA/IGVsZW1lbnRWYWx1ZS5zdWJzdHJpbmcoMCwgc3ViV2lkdGgpICsgXCIuLi5cIiA6IGVsZW1lbnRWYWx1ZTtcclxuICB9XHJcblxyXG4gIGVtaXRFdmVudChlbGVtZW50OiBhbnkpIHtcclxuICAgIHRoaXMuc2hvd0RpYWxvZy5lbWl0KGVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgZXh0cmFjdEZvcm1hdChjb2x1bW46IFRhYmxlQ29sdW1uPGFueT4pIHtcclxuICAgIHJldHVybiBjb2x1bW4/LmZvcm1hdCB8fCAnZC9NL3l5eXksIGg6bW0gYSc7XHJcbiAgfVxyXG5cclxuICBhY3Rpb25MaXN0Q2xpY2tlZChsaXN0QWN0aW9uOiBCdXR0b25BY3Rpb25TZXR0aW5ncywgZWxlbWVudDogYW55KSB7XHJcbiAgICB0aGlzLmxpc3RBY3Rpb25DbGlja2VkLmVtaXQoe2FjdGlvbjpsaXN0QWN0aW9uLCByb3c6IGVsZW1lbnQsIGlzUGVuZGluZzogdGhpcy5pc1BlbmRpbmd9KTtcclxuICB9XHJcblxyXG4gIGh5cGVyTGlua0NsaWNrZWQoYWN0aW9uTmFtZTogc3RyaW5nLCBlbGVtZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGFjdGlvbiA9IFRBQkxFX1JFQ09SRF9BQ1RJT047XHJcbiAgICBhY3Rpb24uYWN0aW9uS2V5ID0gYWN0aW9uTmFtZTtcclxuICAgIGFjdGlvbi5pdGVtID0gZWxlbWVudDtcclxuICAgIGFjdGlvbi5wYWdlSW5mbyA9IHRoaXMucGFnZUluZm87XHJcbiAgICB0aGlzLmh5cGVyTGlua0FjdGlvbi5lbWl0KGFjdGlvbilcclxuICB9XHJcblxyXG5cclxuICBlbWl0Um91dGVQYWdlKGVsZW1lbnQ6IGFueSl7XHJcbiAgICB0aGlzLmNsaWNrUm91dGVQYWdlLmVtaXQoZWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdEl0ZW0ocm93OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnBhZ2VJbmZvLnNlbGZSb3V0aW5nKSB7XHJcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLmlzUGVuZGluZyA/ICdwZW5kaW5nJyA6ICd2aWV3JztcclxuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5wYWdlSW5mby5saXN0Um91dGVQYXRoIHx8IHRoaXMucm91dGVyLnVybH0vdmlld2A7XHJcblxyXG4gICAgICBjb25zdCBlbmNyeXB0ZWRJZCA9IHRoaXMuYmFja2VuZFNlcnZpY2UuZW5jcnlwdChTdHJpbmcocm93LmlkKSk7XHJcbiAgICAgIGNvbnN0IGVuY3J5cHRlZE1vZGUgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQobW9kZSk7XHJcblxyXG4gICAgICBjb25zdCBlbmNyeXB0ZWRSb3cgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQoSlNPTi5zdHJpbmdpZnkocm93KSk7XHJcblxyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSwge1xyXG4gICAgICAgIHF1ZXJ5UGFyYW1zOiB7IHRva2VuOiBlbmNyeXB0ZWRJZCwgbW9kZTogZW5jcnlwdGVkTW9kZSB9LFxyXG4gICAgICAgIHN0YXRlOiB7IHJhdzogZW5jcnlwdGVkUm93IH0sXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBjb25zdCBhY3Rpb24gPSBTRUxFQ1RfUkVDT1JEX0FDVElPTjtcclxuICAgIC8vIGFjdGlvbi5pZCA9IHJvdz8uaWQ7XHJcbiAgICAvLyBhY3Rpb24uaXRlbSA9IHJvdztcclxuICAgIC8vIHRoaXMudXNlckFjdGlvbi5lbWl0KGFjdGlvbilcclxuICB9XHJcblxyXG4gIG9wZW5OZXdUYWIocm93KSB7XHJcbiAgICBpZiAoIXRoaXMucGFnZUluZm8uZW1iZWRlZFRhYmxlT25seSkge1xyXG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5pc1BlbmRpbmcgPyAncGVuZGluZycgOiAndmlldyc7XHJcbiAgICAgIHdpbmRvdy5vcGVuKGAke3RoaXMucGFnZUluZm8ubGlzdFJvdXRlUGF0aH0vJHttb2RlfWAgKyAnLycgKyByb3c/LmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uVmlld01vZGVDaGFuZ2VkUmVjZWl2ZWQoaXNQZW5kaW5nOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnN3aXRjaFZpZXdNb2RlKGlzUGVuZGluZyk7XHJcbiAgfVxyXG5cclxuICBzd2l0Y2hWaWV3TW9kZShpc1BlbmRpbmc6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaXNQZW5kaW5nID0gaXNQZW5kaW5nO1xyXG4gICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgb25BZGROZXdBY3Rpb24oJGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMucGFnZUluZm8ubGlzdFJvdXRlUGF0aCB8fCB0aGlzLnJvdXRlci51cmx9L3ZpZXdgO1xyXG4gICAgY29uc3QgZW5jcnlwdGVkSWQgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQoXCItMVwiKTtcclxuICAgIGNvbnN0IGVuY3J5cHRlZE1vZGUgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQoXCJwZW5kaW5nXCIpO1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3VybH1gXSxcclxuICAgICAgeyBxdWVyeVBhcmFtczogeyB0b2tlbjogZW5jcnlwdGVkSWQgLCBtb2RlIDogZW5jcnlwdGVkTW9kZSB9IH0pO1xyXG5cclxuICAgIC8vIGNvbnN0IGFjdGlvbiA9IFNFTEVDVF9SRUNPUkRfQUNUSU9OO1xyXG4gICAgLy8gYWN0aW9uLmlkID0gcm93Py5pZDtcclxuICAgIC8vIGFjdGlvbi5pdGVtID0gcm93O1xyXG4gICAgLy8gdGhpcy51c2VyQWN0aW9uLmVtaXQoYWN0aW9uKVxyXG4gIH1cclxuXHJcbiAgc2hvd0FkZE5ldygpIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2VJbmZvLmhhc0FkZEJ1dHRvbiA7XHJcbiAgfVxyXG5cclxuICBvbkV4dHJhQnV0dGlvbkFjdGlvbigkZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5leHRyYUFjdGlvbi5lbWl0KCRldmVudCk7XHJcblxyXG4gIH1cclxuXHJcbiAgaGFzR3JvdXBzKCkge1xyXG4gICAgbGV0IGIgPSB0aGlzLmNvbHVtbnMuZmluZEluZGV4KHAgPT4gcC5ncm91cCk7XHJcbiAgICByZXR1cm4gYiA+PSAwO1xyXG4gIH1cclxuICBncm91cE5hbWVzOiBhbnkgPSBbXVxyXG4gIGdyb3VwU3BhbnM6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIGJ1aWxkR3JvdXBzKCl7XHJcbiAgICBsZXQgY291bnQgPSAwO1xyXG4gICAgdGhpcy5ncm91cE5hbWVzID0gW107XHJcbiAgICB0aGlzLmdyb3VwU3BhbnMuY2xlYXIoKTtcclxuICAgIGlmKHRoaXMuaGFzR3JvdXBzKCkgPT09IGZhbHNlKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlID09PSB0cnVlKVxyXG4gICAgICAuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbHVtbi5ncm91cCA9PT0gXCItXCIpIHtcclxuICAgICAgICAgIHRoaXMuZ3JvdXBOYW1lcy5wdXNoKGNvdW50LnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgdGhpcy5pbnNlcnRJbk1hcChjb3VudCk7XHJcbiAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZ3JvdXBOYW1lcy5pbmNsdWRlcyhjb2x1bW4uZ3JvdXApKSB7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwTmFtZXMucHVzaChjb2x1bW4uZ3JvdXApO1xyXG4gICAgICAgICAgdGhpcy5pbnNlcnRJbk1hcChjb2x1bW4uZ3JvdXApO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluc2VydEluTWFwKGNvbHVtbi5ncm91cCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5zZXJ0SW5NYXAoa2V5KXtcclxuICAgIGlmKHRoaXMuZ3JvdXBTcGFucy5oYXMoa2V5KSl7XHJcbiAgICAgIHRoaXMuZ3JvdXBTcGFucy5zZXQoa2V5LnRvU3RyaW5nKCksIHRoaXMuZ3JvdXBTcGFucy5nZXQoa2V5KSArIDEpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ncm91cFNwYW5zLnNldChrZXkudG9TdHJpbmcoKSwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0h1bWFuTWFkZShzdHIpe1xyXG4gICAgcmV0dXJuIGlzTmFOKHN0cik7XHJcbiAgfVxyXG5cclxuICBhY3Rpb25CdXR0b25DbGlja2VkKGFjdGlvbktleTogc3RyaW5nLCBpdGVtOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChhY3Rpb25LZXkgPT09ICduYXZpZ2F0ZScpIHtcclxuICAgICAgdGhpcy5oYW5kbGVOYXZpZ2F0ZUFjdGlvbihpdGVtKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW1pdFRhYmxlQWN0aW9uKGFjdGlvbktleSwgaXRlbSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZU5hdmlnYXRlQWN0aW9uKGl0ZW06IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgbW9kZSA9IHRoaXMuaXNQZW5kaW5nID8gJ3BlbmRpbmcnIDogJ3ZpZXcnO1xyXG4gICAgY29uc3QgYmFzZVBhdGggPSB0aGlzLnBhZ2VJbmZvLmxpc3RSb3V0ZVBhdGggfHwgdGhpcy5yb3V0ZXIudXJsO1xyXG4gICAgY29uc3QgdXJsID0gYCR7YmFzZVBhdGh9L3ZpZXdgO1xyXG5cclxuICAgIGNvbnN0IGVuY3J5cHRlZElkID0gdGhpcy5iYWNrZW5kU2VydmljZS5lbmNyeXB0KGl0ZW0uaWQudG9TdHJpbmcoKSk7XHJcbiAgICBjb25zdCBlbmNyeXB0ZWRNb2RlID0gdGhpcy5iYWNrZW5kU2VydmljZS5lbmNyeXB0KG1vZGUpO1xyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmxdLCB7XHJcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7IHRva2VuOiBlbmNyeXB0ZWRJZCwgbW9kZTogZW5jcnlwdGVkTW9kZSB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW1pdFRhYmxlQWN0aW9uKGFjdGlvbktleTogc3RyaW5nLCBpdGVtOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGFjdGlvbiA9IFRBQkxFX1JFQ09SRF9BQ1RJT047XHJcbiAgICBhY3Rpb24uYWN0aW9uS2V5ID0gYWN0aW9uS2V5O1xyXG4gICAgYWN0aW9uLml0ZW0gPSBpdGVtO1xyXG4gICAgYWN0aW9uLnBhZ2VJbmZvID0gdGhpcy5wYWdlSW5mbztcclxuICAgIHRoaXMudXNlckFjdGlvbi5lbWl0KGFjdGlvbik7XHJcbiAgfVxyXG5cclxuICBleHRyYWN0UmVwb3J0KHJlcG9ydFR5cGU6IGFueSkge1xyXG4gICAgY29uc3QgbXlGaWx0ZXJzID0gdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Q7XHJcbiAgICBjb25zdCByZXBvcnRSZXF1ZXN0ID0gdGhpcy5iYWNrZW5kU2VydmljZS5idWlsZFJlcG9ydFJlcXVlc3QodGhpcy5jb2x1bW5zLCB0aGlzLnBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyAnLmxpc3RfdGl0bGUnLFxyXG4gICAgICBteUZpbHRlcnMsIHJlcG9ydFR5cGUsIHRoaXMucGFnZUluZm8sIHRoaXMuc2VhcmNoU3RyLCAnTEFORFNDQVBFJyk7XHJcbiAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmRvd25sb2FkUmVwb3J0KHJlcG9ydFJlcXVlc3QsIHRoaXMucGFnZUluZm8uYXBpVXJpKTtcclxuICB9XHJcblxyXG4gIGdldEljb24oc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChzdGF0dXMpIHtcclxuICAgICAgY2FzZSAncGFzcyc6IHJldHVybiAnY2hlY2tfY2lyY2xlJztcclxuICAgICAgY2FzZSAnd2FybmluZyc6IHJldHVybiAnd2FybmluZyc7XHJcbiAgICAgIGNhc2UgJ2Vycm9yJzogcmV0dXJuICdlcnJvcic7XHJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAnaGVscCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRJY29uQXJpYUxhYmVsS2V5KHN0YXR1czogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAoc3RhdHVzKSB7XHJcbiAgICAgIGNhc2UgJ3Bhc3MnOlxyXG4gICAgICAgIHJldHVybiAnQkFTRV9UQUJMRS5zdGF0dXNJY29uUGFzcyc7XHJcbiAgICAgIGNhc2UgJ3dhcm5pbmcnOlxyXG4gICAgICAgIHJldHVybiAnQkFTRV9UQUJMRS5zdGF0dXNJY29uV2FybmluZyc7XHJcbiAgICAgIGNhc2UgJ2Vycm9yJzpcclxuICAgICAgICByZXR1cm4gJ0JBU0VfVEFCTEUuc3RhdHVzSWNvbkVycm9yJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ0JBU0VfVEFCTEUuc3RhdHVzSWNvblVua25vd24nO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0T25PZmZGbGFnQXJpYUxhYmVsS2V5KHZhbHVlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcclxuICAgICAgcmV0dXJuICdCQVNFX1RBQkxFLnN0YXR1c0ZsYWdBY3RpdmUnO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm4gJ0JBU0VfVEFCTEUuc3RhdHVzRmxhZ0luYWN0aXZlJztcclxuICAgIH1cclxuICAgIHJldHVybiAnQkFTRV9UQUJMRS5zdGF0dXNGbGFnUGVuZGluZyc7XHJcbiAgfVxyXG5cclxuICBhY3Rpb25DaGVja2VkQ2xpY2tlZChwcm9wZXJ0eTogc3RyaW5nLCBlbGVtZW50KSB7XHJcbiAgICBlbGVtZW50W3Byb3BlcnR5XT0gIWVsZW1lbnRbcHJvcGVydHldO1xyXG4gICAgdGhpcy5hY3Rpb25CdXR0b25DbGlja2VkKHByb3BlcnR5LCBlbGVtZW50KTtcclxuICB9XHJcblxyXG5cclxuICBpc0RhcmtIaWdobGlnaHQocm93OiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGdyb3VwQnlQcm9wID0gdGhpcy5wYWdlSW5mbz8uZ3JvdXBCeVByb3BlcnR5O1xyXG4gICAgY29uc3QgZ3JvdXBCeVZhbHVlcyA9IHRoaXMucGFnZUluZm8/Lmdyb3VwQnlWYWx1ZTtcclxuXHJcbiAgICBpZiAoIWdyb3VwQnlQcm9wIHx8ICFncm91cEJ5VmFsdWVzIHx8ICFyb3dbZ3JvdXBCeVByb3BdKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjZWxsVmFsdWUgPSByb3dbZ3JvdXBCeVByb3BdLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgcmV0dXJuIGdyb3VwQnlWYWx1ZXMuc29tZSh2YWwgPT5cclxuICAgICAgY2VsbFZhbHVlLmluY2x1ZGVzKHZhbCkgJiYgY2VsbFZhbHVlLmxlbmd0aCA+IHZhbC5sZW5ndGhcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzaG91bGRSZW5kZXJBc0h5cGVyTGluayhlbGVtZW50OiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGdyb3VwQnlQcm9wID0gdGhpcy5wYWdlSW5mbz8uZ3JvdXBCeVByb3BlcnR5O1xyXG4gICAgY29uc3QgZ3JvdXBCeVZhbHVlcyA9IHRoaXMucGFnZUluZm8/Lmdyb3VwQnlWYWx1ZTtcclxuXHJcbiAgICBpZiAoIWdyb3VwQnlQcm9wIHx8ICFncm91cEJ5VmFsdWVzIHx8ICFlbGVtZW50W2dyb3VwQnlQcm9wXSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmFsdWUgPSBlbGVtZW50W2dyb3VwQnlQcm9wXS50b1N0cmluZygpO1xyXG5cclxuICAgIHJldHVybiAhZ3JvdXBCeVZhbHVlcy5zb21lKHYgPT4gdmFsdWUuaW5jbHVkZXModikgJiYgdmFsdWUubGVuZ3RoID49IHYubGVuZ3RoKTtcclxuICB9XHJcblxyXG5cclxuICBvblNvcnRBY3Rpb24oJGV2ZW50OiBTb3J0KSB7XHJcbiAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHVtbnMuZmluZChjID0+IGMucHJvcGVydHkgPT09ICRldmVudC5hY3RpdmUpO1xyXG5cclxuICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnNvcnRLZXkgPVxyXG4gICAgICAkZXZlbnQuYWN0aXZlICYmICRldmVudC5kaXJlY3Rpb25cclxuICAgICAgICA/IChjb2w/LnNvcnRLZXkgPz8gJGV2ZW50LmFjdGl2ZSlcclxuICAgICAgICA6ICdpZCc7XHJcblxyXG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Quc29ydERpcmVjdGlvbiA9ICRldmVudC5kaXJlY3Rpb24gPT09ICdhc2MnID8gJ0FTQycgOiAnREVTQyc7XHJcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlSW5kZXggPSAwO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uLmVtaXQoJGV2ZW50KTtcclxuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgc2hvdWxkU2hvd0J1dHRvbihlbGVtZW50OiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGdyb3VwQnlQcm9wID0gdGhpcy5wYWdlSW5mbz8uZ3JvdXBCeVByb3BlcnR5O1xyXG4gICAgY29uc3QgZ3JvdXBCeVZhbHVlcyA9IHRoaXMucGFnZUluZm8/Lmdyb3VwQnlWYWx1ZTtcclxuXHJcbiAgICBpZiAoIWdyb3VwQnlQcm9wIHx8ICFncm91cEJ5VmFsdWVzIHx8ICFlbGVtZW50W2dyb3VwQnlQcm9wXSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnRbZ3JvdXBCeVByb3BdLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgcmV0dXJuICFncm91cEJ5VmFsdWVzLnNvbWUodiA9PiB2YWx1ZS5pbmNsdWRlcyh2KSAmJiB2YWx1ZS5sZW5ndGggPj0gdi5sZW5ndGgpO1xyXG4gIH1cclxuXHJcbiAgc3RvcmVQZW5kaW5nRmlsdGVycygkZXZlbnQ6IHsgZmlsdGVyczogRmllbGRGaWx0ZXJbXSwgc2VhcmNoU3RyOiBzdHJpbmcgfSk6IHZvaWQge1xyXG4gICAgdGhpcy5wZW5kaW5nRmlsdGVycyA9ICRldmVudC5maWx0ZXJzIHx8IFtdO1xyXG4gICAgICB0aGlzLnNlYXJjaFN0ciA9ICRldmVudC5zZWFyY2hTdHI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0UGFnaW5hdGlvbkZvckZpbHRlckNoYW5nZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QpIHtcclxuICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QgPSBuZXcgRmlsdGVyUmVxdWVzdCh0aGlzLnBhZ2VTaXplIHx8IHRoaXMucGFnZUluZm8ucGFnZVNpemUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZUluZGV4ID0gMDtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gMTtcclxuICAgIGlmICh0aGlzLm1hbmFnZWFibGVQYWdlcykge1xyXG4gICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh0aGlzLnBhZ2VJbmRleCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhcHBseVBlbmRpbmdGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hZHZhbmNlZEFwcGxpZWRGaWx0ZXIgPSB0aGlzLnBlbmRpbmdGaWx0ZXJzIHx8IFtdO1xyXG4gICAgdGhpcy5yZXNldFBhZ2luYXRpb25Gb3JGaWx0ZXJDaGFuZ2UoKTtcclxuICAgIHRoaXMubG9hZERhdGEoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUZpbHRlckVtcHR5KCRldmVudDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKCRldmVudCkge1xyXG4gICAgICB0aGlzLnBlbmRpbmdGaWx0ZXJzID0gW107XHJcbiAgICAgIHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyID0gW107XHJcbiAgICAgIHRoaXMuc2VhcmNoU3RyID0gJyc7XHJcbiAgICAgIHRoaXMucmVzZXRQYWdpbmF0aW9uRm9yRmlsdGVyQ2hhbmdlKCk7XHJcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc2V0RGF0YSgkZXZlbnQ6IGJvb2xlYW4pIHtcclxuICAgIGlmICgkZXZlbnQpIHtcclxuICAgICAgdGhpcy5hZHZhbmNlZEFwcGxpZWRGaWx0ZXIgPSBbXTtcclxuICAgICAgdGhpcy5wZW5kaW5nRmlsdGVycyA9IFtdO1xyXG4gICAgICB0aGlzLnJlc2V0UGFnaW5hdGlvbkZvckZpbHRlckNoYW5nZSgpO1xyXG4gICAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgICAgIC8vIHRoaXMucGFnaW5hdG9yLmZpcnN0UGFnZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFzRmlsdGVyc0FwcGxpZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyICYmIHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyLmxlbmd0aCA+IDApIHx8XHJcbiAgICAgICAgICAgKHRoaXMuZmlsdGVycyAmJiB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCkgfHxcclxuICAgICAgICAgICAodGhpcy5wZW5kaW5nRmlsdGVycyAmJiB0aGlzLnBlbmRpbmdGaWx0ZXJzLmxlbmd0aCA+IDApO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGlzcGxheVN2Z1BhdGgoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmhhc0ZpbHRlcnNBcHBsaWVkKCkgJiYgdGhpcy5ub1Jlc3VsdFN2Z1BhdGggPyB0aGlzLm5vUmVzdWx0U3ZnUGF0aCA6IHRoaXMubm9EYXRhRm91bmRTdmdQYXRoO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGlzcGxheVRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5oYXNGaWx0ZXJzQXBwbGllZCgpICYmIHRoaXMubm9SZXN1bHRTdmdQYXRoID8gdGhpcy5ub1Jlc3VsdFRpdGxlIDogdGhpcy5ub0RhdGFGb3VuZFRpdGxlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGlzcGxheVN1YnRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5oYXNGaWx0ZXJzQXBwbGllZCgpICYmIHRoaXMubm9SZXN1bHRTdmdQYXRoID8gdGhpcy5ub1Jlc3VsdFN1YnRpdGxlIDogdGhpcy5ub0RhdGFGb3VuZFN1YnRpdGxlO1xyXG4gIH1cclxuXHJcbiAgYnV0dG9uQ2xpY2tlZEV2ZW50KCRldmVudDogQnV0dG9uQWN0aW9uU2V0dGluZ3MpIHtcclxuXHJcbiAgfVxyXG5cclxuICBnZXRNb2JpbGVDYXJkSWRDb2x1bW4oKTogVGFibGVDb2x1bW48YW55PiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbmQoYyA9PiBjLnZpc2libGUgJiYgYy5tb2JpbGVDYXJkSWQgPT09IHRydWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TW9iaWxlQ2FyZFN0YXR1c0NvbHVtbigpOiBUYWJsZUNvbHVtbjxhbnk+IHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZChjID0+IGMudmlzaWJsZSAmJiBjLm1vYmlsZUNhcmRTdGF0dXMgPT09IHRydWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TW9iaWxlQ2FyZENvbHVtbnMoKTogVGFibGVDb2x1bW48YW55PltdIHtcclxuICAgIGNvbnN0IGlkQ29sID0gdGhpcy5nZXRNb2JpbGVDYXJkSWRDb2x1bW4oKTtcclxuICAgIGNvbnN0IHN0YXR1c0NvbCA9IHRoaXMuZ2V0TW9iaWxlQ2FyZFN0YXR1c0NvbHVtbigpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT5cclxuICAgICAgYy52aXNpYmxlICYmXHJcbiAgICAgIGMucHJvcGVydHkgIT09ICdhY3Rpb25zJyAmJlxyXG4gICAgICBjICE9PSBpZENvbCAmJlxyXG4gICAgICBjICE9PSBzdGF0dXNDb2xcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBsYWJlbEtleUJ5VmFsdWUoY29sdW1uOiBUYWJsZUNvbHVtbjxhbnk+IHwgdW5kZWZpbmVkLCByb3c6IGFueSk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWNvbHVtbiB8fCAhY29sdW1uLnByb3BlcnR5KSByZXR1cm4gJyc7XHJcbiAgICByZXR1cm4gc3VwZXIubGFiZWxLZXlCeVZhbHVlKGNvbHVtbiwgcm93KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGJhc2VUYWJsZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBmbGV4LTEwMFwiID5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbHVtbiBhbGlnbi1zdGFydCBmbGV4LTEwMFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XHJcbiAgICAgIDxhcHAtdGl0bGUtYmFyXHJcbiAgICAgICAgW3BhZ2VUaXRsZV09XCJwYWdlSW5mby5oaWRlVGl0bGUgPyAnJyA6IHBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24rJy5saXN0X3RpdGxlJ1wiXHJcbiAgICAgICAgW3N1YlRpdGxlXT1cIihwYWdlSW5mby5oaWRlVGl0bGUgfHwgcGFnZUluZm8uaGlkZVN1YnRpdGxlKSA/ICcnIDogcGFnZUluZm8ubGFiZWxzU2VjdGlvbisnLnN1YnRpdGxlJ1wiXHJcbiAgICAgICAgW3RpdGxlTW9kZV09XCInJ1wiXHJcbiAgICAgICAgW3BhZ2VJbmZvXT1cInBhZ2VJbmZvXCJcclxuICAgICAgICBbbmV3QWN0aW9uXT1cInNob3dBZGROZXcoKVwiXHJcbiAgICAgICAgW3Nob3dFeHRyYWN0QnV0dG9uXT1cIiFwYWdlSW5mby5oaWRlRXh0cmFjdEJ1dHRvblwiXHJcbiAgICAgICAgW2RyYWZ0U3VwcG9ydGVkXT1cInBhZ2VJbmZvLmRyYWZ0U3VwcG9ydGVkXCJcclxuICAgICAgICBbaXNQZW5kaW5nXT1cImlzUGVuZGluZ1wiXHJcbiAgICAgICAgW29uVmlld01vZGVDaGFuZ2VdPVwic3dpdGNoVmlld01vZGUuYmluZCh0aGlzKVwiXHJcbiAgICAgICAgW2J1dHRvbnNdPVwiZXh0cmFBY3Rpb25zXCJcclxuICAgICAgICBbYnV0dG9uc0Rpc3BsYXlNb2RlXT1cImJ1dHRvbnNEaXNwbGF5TW9kZVwiXHJcbiAgICAgICAgKG5ld0FjdGlvbkNsaWNrZWQpPVwib25BZGROZXdBY3Rpb24oJGV2ZW50KVwiXHJcbiAgICAgICAgKGV4dHJhY3RSZXBvcnQpPVwiZXh0cmFjdFJlcG9ydCgkZXZlbnQpXCJcclxuICAgICAgICAodmlld01vZGVDaGFuZ2VkKT1cIm9uVmlld01vZGVDaGFuZ2VkUmVjZWl2ZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgKGJ1dHRvbkNsaWNrZWQpPVwiYnV0dG9uQ2xpY2tlZC5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIFt0b3RhbEVsZW1lbnRzXT1cInBhZ2VJbmZvLmhpZGVUaXRsZSA/IHVuZGVmaW5lZCA6IHRvdGFsRWxlbWVudHNcIj5cclxuICAgICAgPC9hcHAtdGl0bGUtYmFyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItcm93XCIgKm5nSWY9XCIhcGFnZUluZm8uaGlkZUFkdmFuY2VkRmlsdGVyXCI+XHJcbiAgICA8YXBwLWZpbHRlci1idWlsZGVyXHJcbiAgICAgICpuZ0lmPVwiIXBhZ2VJbmZvLmhpZGVBZHZhbmNlZEZpbHRlclwiXHJcbiAgICAgIFtwYWdlSW5mb109XCJwYWdlSW5mb1wiXHJcbiAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxyXG4gICAgICBbZmlsdGVyRmllbGRzXT1cImZpbHRlckZpZWxkc1wiXHJcbiAgICAgIFtwZW5kaW5nRmlsdGVyc109XCJwZW5kaW5nRmlsdGVyc1wiXHJcbiAgICAgIFtzaG93RXhwb3J0QnV0dG9uXT1cIiFwYWdlSW5mby5oaWRlRXh0cmFjdEJ1dHRvblwiXHJcbiAgICAgIChmaWx0ZXJJbmZvcm1hdGlvbik9XCJzdG9yZVBlbmRpbmdGaWx0ZXJzKCRldmVudClcIlxyXG4gICAgICAoaXNFbXB0eSk9XCJoYW5kbGVGaWx0ZXJFbXB0eSgkZXZlbnQpXCJcclxuICAgICAgKGFwcGx5RmlsdGVyKT1cImFwcGx5UGVuZGluZ0ZpbHRlcnMoKVwiXHJcbiAgICAgIChzb3J0QnlDbGlja2VkKT1cImhhbmRsZVNvcnRDbGljaygkZXZlbnQpXCJcclxuICAgICAgKGV4cG9ydENsaWNrZWQpPVwiZXh0cmFjdFJlcG9ydCgkZXZlbnQpXCI+XHJcbiAgICA8L2FwcC1maWx0ZXItYnVpbGRlcj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWdyb3VwXCIgKm5nSWY9XCIhcGFnZUluZm8uaGlkZUV4dHJhY3RCdXR0b25cIj5cclxuICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFwYWdlSW5mby5oaWRlRXh0cmFjdEJ1dHRvblwiXHJcbiAgICAgICAgbWF0LWZsYXQtYnV0dG9uXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImV4cG9ydE1lbnVcIlxyXG4gICAgICAgIGNsYXNzPVwiYnRuLWV4cG9ydFwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInZXhwb3J0JyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCJ0cnVlXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24tdGV4dFwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmZpbGVfZXhwb3J0PC9tYXQtaWNvbj5cclxuICAgICAgICAgIDxzcGFuPnt7ICdleHBvcnQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYXJyb3ctaWNvblwiPmtleWJvYXJkX2Fycm93X2Rvd248L21hdC1pY29uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxtYXQtbWVudSAjZXhwb3J0TWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImV4dHJhY3RSZXBvcnQoJ3BkZicpXCI+UERGPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJleHRyYWN0UmVwb3J0KCd4bHN4JylcIj5FeGNlbDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZXh0cmFjdFJlcG9ydCgnY3N2JylcIj5DU1Y8L2J1dHRvbj5cclxuICAgICAgPC9tYXQtbWVudT5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcblxyXG4gIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBmbGV4LTEwMCBiYXNlVGFibGVfX2RldGFpbHNDb2x1bW5cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEwMFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3cgZmxleC0xMDAgbWFpblRhYmxlXCI+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIlxyXG4gICAgICAgICAgcm9sZT1cInRhYmxlXCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXHJcbiAgICAgICAgICAgIHBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gJiYgIXBhZ2VJbmZvLmhpZGVUaXRsZVxyXG4gICAgICAgICAgICAgID8gKHBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyAnLmxpc3RfdGl0bGUnIHwgdHJhbnNsYXRlKVxyXG4gICAgICAgICAgICAgIDogbnVsbFxyXG4gICAgICAgICAgXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCIgW2F0dHIuZGF0YS1zb3J0XT1cInNvcnRTdGF0ZVwiIHJvbGU9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uUHJvcCBvZiB2aXNpYmxlQ29sdW1uc0FycmF5OyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICBjbGFzcz1cInRhYmxlLWhlYWRlci1jZWxsXCJcclxuICAgICAgICAgICAgICAgICByb2xlPVwiY29sdW1uaGVhZGVyXCJcclxuICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0Q29sdW1uQXJpYVNvcnQoY29sdW1uUHJvcClcIlxyXG4gICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImdldENvbHVtbihjb2x1bW5Qcm9wKT8uZW5hYmxlU29ydGluZyA/IDAgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICBbY2xhc3Muc29ydGFibGVdPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5lbmFibGVTb3J0aW5nXCJcclxuICAgICAgICAgICAgICAgICBbY2xhc3MuZmlyc3QtY2VsbF09XCJpID09PSAwXCJcclxuICAgICAgICAgICAgICAgICBbY2xhc3MubGFzdC1jZWxsXT1cImkgPT09IHZpc2libGVDb2x1bW5zQXJyYXkubGVuZ3RoIC0gMVwiXHJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGlvbnMtY2VsbF09XCJpID09PSB2aXNpYmxlQ29sdW1uc0FycmF5Lmxlbmd0aCAtIDEgJiYgY29sdW1uUHJvcCA9PT0gJ2FjdGlvbnMnXCJcclxuICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLXdpZHRoXT1cImdldENvbHVtbihjb2x1bW5Qcm9wKT8ud2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldENvbHVtbihjb2x1bW5Qcm9wKT8ud2lkdGggPyB7J3dpZHRoJzogZ2V0Q29sdW1uKGNvbHVtblByb3ApPy53aWR0aCArICclJywgJ2ZsZXgtYmFzaXMnOiBnZXRDb2x1bW4oY29sdW1uUHJvcCk/LndpZHRoICsgJyUnfSA6IHt9XCJcclxuICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5lbmFibGVTb3J0aW5nICYmIGhhbmRsZVNvcnRDbGljayhjb2x1bW5Qcm9wKVwiXHJcbiAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25Tb3J0SGVhZGVyS2V5ZG93bigkZXZlbnQsIGNvbHVtblByb3ApXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlci1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhYmxlLWhlYWRlci1sYWJlbFwiPnt7IGxhYmVsS2V5KGdldENvbHVtbihjb2x1bW5Qcm9wKSkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5lbmFibGVTb3J0aW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImdldFNvcnREaXJlY3Rpb24oY29sdW1uUHJvcCkgPT09ICdhc2MnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzb3J0LWljb24gc29ydC1hc2NcIj5hcnJvd19kcm9wX3VwPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZ2V0U29ydERpcmVjdGlvbihjb2x1bW5Qcm9wKSA9PT0gJ2Rlc2MnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzb3J0LWljb24gc29ydC1kZXNjXCI+YXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1ib2R5XCIgcm9sZT1cInJvd2dyb3VwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBkYXRhU291cmNlLmRhdGE7IGxldCByb3dJbmRleCA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICBjbGFzcz1cInRhYmxlLXJvd1wiXHJcbiAgICAgICAgICAgICAgICAgcm9sZT1cInJvd1wiXHJcbiAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiLTFcIlxyXG4gICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIid0YWJsZS1yb3ctJyArIChyb3c/LmlkIHx8IHJvdz8ua2V5IHx8ICcnKVwiXHJcbiAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgJ3RhYmxlLXJvdy0taGlnaGxpZ2h0Jzogc2VsZWN0ZWRSb3dJbmRleCA9PSByb3cuaWQgfHwgKHBhZ2VJbmZvLmdyb3VwQnlQcm9wZXJ0eSAmJiBwYWdlSW5mby5ncm91cEJ5VmFsdWU/LmluY2x1ZGVzKHJvd1twYWdlSW5mby5ncm91cEJ5UHJvcGVydHldKSksXHJcbiAgICAgICAgICAgICAgICAgICAndGFibGUtcm93LS1kYXJrLWhpZ2hsaWdodCc6IGlzRGFya0hpZ2hsaWdodChyb3cpXHJcbiAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgKGF1eGNsaWNrKT1cIm9wZW5OZXdUYWIocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgb25TZWxlY3RJdGVtKHJvdylcIj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW5Qcm9wIG9mIHZpc2libGVDb2x1bW5zQXJyYXk7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWJsZS1jZWxsXCJcclxuICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjZWxsXCJcclxuICAgICAgICAgICAgICAgICAgIFtjbGFzcy5maXJzdC1jZWxsXT1cImkgPT09IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgW2NsYXNzLmxhc3QtY2VsbF09XCJpID09PSB2aXNpYmxlQ29sdW1uc0FycmF5Lmxlbmd0aCAtIDFcIlxyXG4gICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGlvbnMtY2VsbF09XCJpID09PSB2aXNpYmxlQ29sdW1uc0FycmF5Lmxlbmd0aCAtIDEgJiYgY29sdW1uUHJvcCA9PT0gJ2FjdGlvbnMnXCJcclxuICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oYXMtd2lkdGhdPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy53aWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRDb2x1bW4oY29sdW1uUHJvcCk/LndpZHRoID8geyd3aWR0aCc6IGdldENvbHVtbihjb2x1bW5Qcm9wKT8ud2lkdGggKyAnJScsICdmbGV4LWJhc2lzJzogZ2V0Q29sdW1uKGNvbHVtblByb3ApPy53aWR0aCArICclJ30gOiB7fVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy50eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid3b3JrZmxvd1N0YXR1cydcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwid2ZTdGF0dXMge3sgZ2V0U3RhdHVzRGVzY3JpcHRpb24ocm93KX19XCIgW2F0dHIuaWRdPVwiJ3RhYmxlLWJ0bi13Zi0nK2NvbHVtblByb3ArJy0nKyhyb3cuaWQgfHwgcm93LmtleSB8fCAnJylcIiBbYXR0ci50YWJpbmRleF09XCItMVwiPnt7IGdldFN0YXR1c0Rlc2NyaXB0aW9uKHJvdykgfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaHlwZXItdGV4dCdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG91bGRSZW5kZXJBc0h5cGVyTGluayhyb3cpOyBlbHNlIHBsYWluSHlwZXJUZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWxhYmVsIGh5cGVyLWxpbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiLTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImh5cGVyTGlua0NsaWNrZWQoY29sdW1uUHJvcCwgcm93KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtblByb3ApIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5IeXBlclRleHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1sYWJlbFwiPnt7IGV4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW5Qcm9wKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIididXR0b24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3VsZFNob3dCdXR0b24ocm93KVwiIG1hdC1idXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJpbWFyeVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGFjdGlvbkJ1dHRvbkNsaWNrZWQoY29sdW1uUHJvcCwgcm93KVwiIFthdHRyLmlkXT1cIid0YWJsZS1idG4tYWN0aW9uLScrY29sdW1uUHJvcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgbGFiZWxLZXkoZ2V0Q29sdW1uKGNvbHVtblByb3ApKSArICdfdGl0bGUnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ljb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICdtYWluVGFibGVfX3RkX19pY29uLWdyZWVuJzogcm93W2NvbHVtblByb3BdID09PSAncGFzcycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAnbWFpblRhYmxlX190ZF9faWNvbi1vcmFuZ2UnOiByb3dbY29sdW1uUHJvcF0gPT09ICd3YXJuaW5nJyxcclxuICAgICAgICAgICAgICAgICAgICAgICdtYWluVGFibGVfX3RkX19pY29uLXJlZCc6IHJvd1tjb2x1bW5Qcm9wXSA9PT0gJ2Vycm9yJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImdldEljb25BcmlhTGFiZWxLZXkocm93W2NvbHVtblByb3BdKSB8IHRyYW5zbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgZ2V0SWNvbihyb3dbY29sdW1uUHJvcF0pIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cInByaW1hcnlcIiBbdGFiSW5kZXhdPVwiLTFcIiBbY2hlY2tlZF09XCJyb3dbY29sdW1uUHJvcF1cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2FjdGlvbkNoZWNrZWRDbGlja2VkKGNvbHVtblByb3Ascm93KVwiPjwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdGF0ZVR5cGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInN0YXRlVHlwZSB7eyByb3dbY29sdW1uUHJvcF19fVwiIFthdHRyLmlkXT1cIid0YWJsZS1idG4tc3RhdGUtJytjb2x1bW5Qcm9wXCIgW2F0dHIudGFiaW5kZXhdPVwiLTFcIj57eyBsYWJlbEtleUJ5VmFsdWUoZ2V0Q29sdW1uKGNvbHVtblByb3ApLCByb3cpIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uUHJvcCkgfCBkYXRlOidkZC9NTS95eXl5JyB9fVxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjcm9wcGVkVGV4dCdcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBnZXRDcm9wcGVkVGV4dChyb3dbY29sdW1uUHJvcF0sIHJvd1tnZXRDb2x1bW4oY29sdW1uUHJvcCk/LndpZHRoXSkgfX1cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZG93bmxvYWQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWFpblRhYmxlX190ZF9faWNvbi1ibHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQkFTRV9UQUJMRS5kb3dubG9hZEFjdGlvbicgfCB0cmFuc2xhdGVcIj5zeXN0ZW1fdXBkYXRlX2FsdDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ29uT2ZmJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInJvd1tjb2x1bW5Qcm9wXSA9PT0gbnVsbFwiIGNsYXNzPVwibWFpblRhYmxlX190ZF9faWNvbi1kYXJrb3JhbmdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXRPbk9mZkZsYWdBcmlhTGFiZWxLZXkobnVsbCkgfCB0cmFuc2xhdGVcIj5mbGFnPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJyb3dbY29sdW1uUHJvcF0gPT09IGZhbHNlXCIgY2xhc3M9XCJtYWluVGFibGVfX3RkX19pY29uLXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0T25PZmZGbGFnQXJpYUxhYmVsS2V5KGZhbHNlKSB8IHRyYW5zbGF0ZVwiPmZsYWc8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInJvd1tjb2x1bW5Qcm9wXSA9PT0gdHJ1ZVwiIGNsYXNzPVwibWFpblRhYmxlX190ZF9faWNvbi1ncmVlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0T25PZmZGbGFnQXJpYUxhYmVsS2V5KHRydWUpIHwgdHJhbnNsYXRlXCI+ZmxhZzwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N0YXR1cydcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd1tjb2x1bW5Qcm9wXSA9PT0gbnVsbCB8fCByb3dbY29sdW1uUHJvcF0gPT09IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBwYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgJy4nICsgZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5sYWJlbCArICdJbkFjdGl2ZScgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3dbY29sdW1uUHJvcF0gPT09IHRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IHBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyAnLicgKyBnZXRDb2x1bW4oY29sdW1uUHJvcCk/LmxhYmVsICsgJ0FjdGl2ZScgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2luZm8nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cIi0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0JBU0VfVEFCTEUucm93RGV0YWlscycgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtlbWl0RXZlbnQocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCIndGFibGUtYnRuLWluZm8tJytyb3cuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBhcmlhLWhpZGRlbj1cInRydWVcIj5pbmZvPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbmV0QW1vdW50J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYWluVGFibGVfX3RkX19jdXJyZW5jeVwiIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7XCI+e3sgcm93W2dldENvbHVtbihjb2x1bW5Qcm9wKT8uY3VycmVuY3ldIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYWluVGFibGVfX3RkX19wcm9wZXJ0eVwiIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7IG1hcmdpbi1sZWZ0OjZweDsgbWFyZ2luLXJpZ2h0OjZweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGV4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW5Qcm9wKSB8IGN1cnJlbmN5OicnOicnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsb2NhbERhdGVUaW1lJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGV4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW5Qcm9wKSB8IGRhdGUgOiBleHRyYWN0Rm9ybWF0KGdldENvbHVtbihjb2x1bW5Qcm9wKSkgfX1cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYmlnZGVjaW1hbCdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c21hbGw+PHN1cCBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2N1cnJlbmN5XCI+e3tyb3dbZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5jdXJyZW5jeV19fTwvc3VwPjwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtblByb3ApIHwgbnVtYmVyIDogKGdldENvbHVtbihjb2x1bW5Qcm9wKT8uZGlnaXRJbmZvIHx8ICcxLjMtNScpIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2xpc3RBY3Rpb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFwcC1idXR0b24tYWN0aW9uc1xyXG4gICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2J1dHRvbnNBY3Rpb25dPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy52aWV3VHlwZSA9PT0gJ2J1dHRvbnNBY3Rpb24nXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtsaXN0QWN0aW9uXT1cImxpc3RBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNdPVwibGlzdEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZEJ1dHRvbik9XCJhY3Rpb25MaXN0Q2xpY2tlZCgkZXZlbnQscm93KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXBwLWJ1dHRvbi1hY3Rpb25zPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy50cmFuc2xhdGU7IGVsc2Ugbm9UcmFuc2xhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cIi0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgZW1pdFJvdXRlUGFnZShyb3cpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyBcIi5cIiArIGV4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW5Qcm9wKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9UcmFuc2xhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCItMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGVtaXRSb3V0ZVBhZ2Uocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lclRleHRdPSdleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uUHJvcCknPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gTW9iaWxlIENhcmQgVmlldyAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkcy1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgZGF0YVNvdXJjZS5kYXRhOyBsZXQgcm93SW5kZXggPSBpbmRleFwiXHJcbiAgICAgICAgICAgICBjbGFzcz1cIm1vYmlsZS1jYXJkXCJcclxuICAgICAgICAgICAgIFthdHRyLmlkXT1cIidtb2JpbGUtY2FyZC0nICsgKHJvdz8uaWQgfHwgcm93Py5rZXkgfHwgJycpXCJcclxuICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgJ21vYmlsZS1jYXJkLS1oaWdobGlnaHQnOiBzZWxlY3RlZFJvd0luZGV4ID09IHJvdy5pZCB8fCAocGFnZUluZm8uZ3JvdXBCeVByb3BlcnR5ICYmIHBhZ2VJbmZvLmdyb3VwQnlWYWx1ZT8uaW5jbHVkZXMocm93W3BhZ2VJbmZvLmdyb3VwQnlQcm9wZXJ0eV0pKSxcclxuICAgICAgICAgICAgICAgJ21vYmlsZS1jYXJkLS1kYXJrLWhpZ2hsaWdodCc6IGlzRGFya0hpZ2hsaWdodChyb3cpXHJcbiAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgIChhdXhjbGljayk9XCJvcGVuTmV3VGFiKHJvdylcIlxyXG4gICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgb25TZWxlY3RJdGVtKHJvdylcIj5cclxuXHJcbiAgICAgICAgICA8IS0tIE1vYmlsZSBDYXJkIEhlYWRlcjogSUQvTmFtZSBhbmQgU3RhdHVzIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19oZWFkZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19oZWFkZXItaWRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vYmlsZS1jYXJkX19pZC10ZXh0XCI+e3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGdldE1vYmlsZUNhcmRJZENvbHVtbigpPy5wcm9wZXJ0eSB8fCAnaWQnKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtY2FyZF9faGVhZGVyLXN0YXR1c1wiICpuZ0lmPVwiZ2V0TW9iaWxlQ2FyZFN0YXR1c0NvbHVtbigpXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwic3RhdGVUeXBlIHt7IHJvd1tnZXRNb2JpbGVDYXJkU3RhdHVzQ29sdW1uKCk/LnByb3BlcnR5XX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIidtb2JpbGUtYnRuLXN0YXRlLScrZ2V0TW9iaWxlQ2FyZFN0YXR1c0NvbHVtbigpPy5wcm9wZXJ0eVwiPlxyXG4gICAgICAgICAgICAgICAge3sgbGFiZWxLZXlCeVZhbHVlKGdldE1vYmlsZUNhcmRTdGF0dXNDb2x1bW4oKSwgcm93KSB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBEaXZpZGVyIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19kaXZpZGVyXCI+PC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBNb2JpbGUgQ2FyZCBCb2R5OiBPdGhlciBjb2x1bW5zIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBnZXRNb2JpbGVDYXJkQ29sdW1ucygpXCIgY2xhc3M9XCJtb2JpbGUtY2FyZF9fcm93XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19yb3ctbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX0gOjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLWNhcmRfX3Jvdy12YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLnR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N0YXRlVHlwZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJzdGF0ZVR5cGUge3sgcm93W2NvbHVtbi5wcm9wZXJ0eV19fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCInbW9iaWxlLWJ0bi1zdGF0ZS0nK2NvbHVtbi5wcm9wZXJ0eVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgbGFiZWxLZXlCeVZhbHVlKGNvbHVtbiwgcm93KSB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtbi5wcm9wZXJ0eSkgfCBkYXRlOidkZC9NTS95eXl5JyB9fVxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIiduZXRBbW91bnQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb2JpbGUtY2FyZF9fYW1vdW50LWN1cnJlbmN5XCI+e3sgcm93W2NvbHVtbi5jdXJyZW5jeV0gfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb2JpbGUtY2FyZF9fYW1vdW50LXZhbHVlXCI+e3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtbi5wcm9wZXJ0eSkgfCBjdXJyZW5jeTonJzonJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbG9jYWxEYXRlVGltZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uLnByb3BlcnR5KSB8IGRhdGUgOiBleHRyYWN0Rm9ybWF0KGNvbHVtbikgfX1cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYmlnZGVjaW1hbCdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c21hbGw+PHN1cCBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2N1cnJlbmN5XCI+e3tyb3dbY29sdW1uLmN1cnJlbmN5XX19PC9zdXA+PC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uLnByb3BlcnR5KSB8IG51bWJlciA6IChjb2x1bW4uZGlnaXRJbmZvIHx8ICcxLjMtNScpIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHJhbnNsYXRlOyBlbHNlIG5vVHJhbnNsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBwYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgXCIuXCIgKyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uLnByb3BlcnR5KSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vVHJhbnNsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVyVGV4dF09J2V4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW4ucHJvcGVydHkpJz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIE1vYmlsZSBDYXJkIEFjdGlvbnMgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLWNhcmRfX2FjdGlvbnNcIiAqbmdJZj1cImxpc3RBY3Rpb24gJiYgbGlzdEFjdGlvbi5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgIDxhcHAtYnV0dG9uLWFjdGlvbnNcclxuICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXHJcbiAgICAgICAgICAgICAgW2J1dHRvbnNBY3Rpb25dPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW2xpc3RBY3Rpb25dPVwibGlzdEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgW2FjdGlvbnNdPVwibGlzdEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrZWRCdXR0b24pPVwiYWN0aW9uTGlzdENsaWNrZWQoJGV2ZW50LHJvdylcIj5cclxuICAgICAgICAgICAgPC9hcHAtYnV0dG9uLWFjdGlvbnM+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwibm9EYXRhRm91bmRcIiBjbGFzcz1cImRhdGFOb3RGb3VuZCBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgIDxpbWcgKm5nSWY9XCJnZXREaXNwbGF5U3ZnUGF0aCgpXCIgW3NyY109XCJnZXREaXNwbGF5U3ZnUGF0aCgpXCIgY2xhc3M9XCJkYXRhTm90Rm91bmRfX2ljb25cIiBhbHQ9XCJObyBkYXRhIGZvdW5kXCIgLz5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGFOb3RGb3VuZF9fdGl0bGVcIj57eyBnZXREaXNwbGF5VGl0bGUoKSB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0YU5vdEZvdW5kX19zdWJ0aXRsZVwiPnt7IGdldERpc3BsYXlTdWJ0aXRsZSgpIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgIDxkaXYgICpuZ0lmPVwiKGRhdGFTb3VyY2UuZGF0YT8ubGVuZ3RoID4gMCB8fCBjdXN0b21pemVkRGF0YSkgJiYgIXBhZ2VJbmZvLmhpZGVQYWdpbmF0aW9uXCIgY2xhc3M9XCJtYWluLXBhZ2luYXRpb24gZmxleC1yb3dcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5hYmxlUGFnaW5hdGlvblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGZsZXgtMTAwXCI+XHJcbiAgICAgICAgICAgIDxhcHAtcGFnaW5hdG9yXHJcbiAgICAgICAgICAgICAgW2N1cnJlbnRQYWdlXT1cInBhZ2VJbmRleFwiXHJcbiAgICAgICAgICAgICAgW3RvdGFsSXRlbXNdPVwidG90YWxFbGVtZW50c1wiXHJcbiAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcclxuICAgICAgICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cIls1LCAxMCwgMjUsIDUwXVwiXHJcbiAgICAgICAgICAgICAgW21vYmlsZUxvYWRNb3JlSW5jcmVtZW50XT1cIm1vYmlsZUxvYWRNb3JlSW5jcmVtZW50XCJcclxuICAgICAgICAgICAgICBbZGlzcGxheWVkSXRlbXNdPVwibW9iaWxlRGlzcGxheWVkSXRlbXMgfHwgZGF0YVNvdXJjZS5kYXRhLmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvbkxvYWRNb3JlKCRldmVudClcIj5cclxuICAgICAgICAgICAgPC9hcHAtcGFnaW5hdG9yPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|