@onecx/angular-accelerator 5.52.5 → 5.52.7
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/data-list-grid/data-list-grid.component.mjs +18 -24
- package/esm2022/lib/components/data-table/data-table.component.mjs +16 -20
- package/fesm2022/onecx-angular-accelerator.mjs +30 -40
- package/fesm2022/onecx-angular-accelerator.mjs.map +1 -1
- package/lib/components/data-list-grid/data-list-grid.component.d.ts +11 -6
- package/lib/components/data-table/data-table.component.d.ts +11 -6
- package/package.json +7 -7
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Component, ContentChild, ContentChildren, EventEmitter, Inject, Injector, Input, LOCALE_ID, Optional, Output, ViewChildren, } from '@angular/core';
|
|
1
|
+
import { Component, computed, ContentChild, ContentChildren, EventEmitter, Inject, Injector, input, Input, LOCALE_ID, Optional, Output, ViewChildren, } from '@angular/core';
|
|
2
2
|
import { Router } from '@angular/router';
|
|
3
3
|
import { LiveAnnouncer } from '@angular/cdk/a11y';
|
|
4
4
|
import { TranslateService } from '@ngx-translate/core';
|
|
5
5
|
import { AppStateService, UserService } from '@onecx/angular-integration-interface';
|
|
6
6
|
import { PrimeIcons, PrimeTemplate } from 'primeng/api';
|
|
7
|
-
import { BehaviorSubject, combineLatest, debounceTime, first, firstValueFrom, map, mergeMap, of, switchMap } from 'rxjs';
|
|
7
|
+
import { BehaviorSubject, combineLatest, debounceTime, first, firstValueFrom, map, mergeMap, of, switchMap, } from 'rxjs';
|
|
8
8
|
import { ColumnType } from '../../model/column-type.model';
|
|
9
9
|
import { ObjectUtils } from '../../utils/objectutils';
|
|
10
10
|
import { DataSortBase } from '../data-sort-base/data-sort-base';
|
|
@@ -54,12 +54,6 @@ export class DataListGridComponent extends DataSortBase {
|
|
|
54
54
|
const obs = value.map((c) => this.getTemplate(c));
|
|
55
55
|
this.columnTemplates$ = combineLatest(obs).pipe(map((values) => Object.fromEntries(value.map((c, i) => [c.id, values[i]]))), debounceTime(50));
|
|
56
56
|
}
|
|
57
|
-
get totalRecordsOnServer() {
|
|
58
|
-
return this.params['totalRecordsOnServer'] ? Number(this.params['totalRecordsOnServer']) : undefined;
|
|
59
|
-
}
|
|
60
|
-
set totalRecordsOnServer(value) {
|
|
61
|
-
this.params['totalRecordsOnServer'] = value?.toString() ?? '0';
|
|
62
|
-
}
|
|
63
57
|
get data() {
|
|
64
58
|
return this._data$.getValue();
|
|
65
59
|
}
|
|
@@ -68,9 +62,7 @@ export class DataListGridComponent extends DataSortBase {
|
|
|
68
62
|
this._originalData = [...value];
|
|
69
63
|
this._data$.next([...value]);
|
|
70
64
|
const currentResults = value.length;
|
|
71
|
-
const newStatus = currentResults === 0
|
|
72
|
-
? 'OCX_DATA_LIST_GRID.NO_SEARCH_RESULTS_FOUND'
|
|
73
|
-
: 'OCX_DATA_LIST_GRID.SEARCH_RESULTS_FOUND';
|
|
65
|
+
const newStatus = currentResults === 0 ? 'OCX_DATA_LIST_GRID.NO_SEARCH_RESULTS_FOUND' : 'OCX_DATA_LIST_GRID.SEARCH_RESULTS_FOUND';
|
|
74
66
|
firstValueFrom(this.translateService.get(newStatus, { results: currentResults })).then((translatedText) => {
|
|
75
67
|
this.liveAnnouncer.announce(translatedText);
|
|
76
68
|
});
|
|
@@ -186,16 +178,20 @@ export class DataListGridComponent extends DataSortBase {
|
|
|
186
178
|
this.page = 0;
|
|
187
179
|
this._columns$ = new BehaviorSubject([]);
|
|
188
180
|
this.name = '';
|
|
181
|
+
this.totalRecordsOnServer = input(undefined);
|
|
189
182
|
this.currentPageShowingKey = 'OCX_DATA_TABLE.SHOWING';
|
|
190
183
|
this.currentPageShowingWithTotalOnServerKey = 'OCX_DATA_TABLE.SHOWING_WITH_TOTAL_ON_SERVER';
|
|
191
|
-
this.params = {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
184
|
+
this.params = computed(() => {
|
|
185
|
+
return {
|
|
186
|
+
currentPage: '{currentPage}',
|
|
187
|
+
totalPages: '{totalPages}',
|
|
188
|
+
rows: '{rows}',
|
|
189
|
+
first: '{first}',
|
|
190
|
+
last: '{last}',
|
|
191
|
+
totalRecords: '{totalRecords}',
|
|
192
|
+
totalRecordsOnServer: this.totalRecordsOnServer()
|
|
193
|
+
};
|
|
194
|
+
});
|
|
199
195
|
this._data$ = new BehaviorSubject([]);
|
|
200
196
|
this._filters$ = new BehaviorSubject([]);
|
|
201
197
|
this._originalData = [];
|
|
@@ -510,11 +506,11 @@ export class DataListGridComponent extends DataSortBase {
|
|
|
510
506
|
return this.userService.getPermissions();
|
|
511
507
|
}
|
|
512
508
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DataListGridComponent, deps: [{ token: LOCALE_ID }, { token: i1.TranslateService }, { token: i2.UserService }, { token: i3.Router }, { token: i0.Injector }, { token: i2.AppStateService }, { token: i4.LiveAnnouncer }, { token: HAS_PERMISSION_CHECKER, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
513
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DataListGridComponent, selector: "ocx-data-list-grid", inputs: { titleLineId: "titleLineId", subtitleLineIds: "subtitleLineIds", clientSideSorting: "clientSideSorting", clientSideFiltering: "clientSideFiltering", sortStates: "sortStates", pageSizes: "pageSizes", pageSize: "pageSize", showAllOption: "showAllOption", emptyResultsMessage: "emptyResultsMessage", fallbackImage: "fallbackImage", layout: "layout", viewPermission: "viewPermission", editPermission: "editPermission", deletePermission: "deletePermission", deleteActionVisibleField: "deleteActionVisibleField", deleteActionEnabledField: "deleteActionEnabledField", viewActionVisibleField: "viewActionVisibleField", viewActionEnabledField: "viewActionEnabledField", editActionVisibleField: "editActionVisibleField", editActionEnabledField: "editActionEnabledField", viewMenuItemKey: "viewMenuItemKey", editMenuItemKey: "editMenuItemKey", deleteMenuItemKey: "deleteMenuItemKey", paginator: "paginator", page: "page", columns: "columns", name: "name", totalRecordsOnServer: "totalRecordsOnServer", currentPageShowingKey: "currentPageShowingKey", currentPageShowingWithTotalOnServerKey: "currentPageShowingWithTotalOnServerKey", data: "data", filters: "filters", sortDirection: "sortDirection", sortField: "sortField", gridItemSubtitleLinesTemplate: "gridItemSubtitleLinesTemplate", listItemSubtitleLinesTemplate: "listItemSubtitleLinesTemplate", listItemTemplate: "listItemTemplate", gridItemTemplate: "gridItemTemplate", listValueTemplate: "listValueTemplate", translationKeyListValueTemplate: "translationKeyListValueTemplate", numberListValueTemplate: "numberListValueTemplate", relativeDateListValueTemplate: "relativeDateListValueTemplate", customListValueTemplate: "customListValueTemplate", stringListValueTemplate: "stringListValueTemplate", dateListValueTemplate: "dateListValueTemplate", additionalActions: "additionalActions", parentTemplates: "parentTemplates" }, outputs: { viewItem: "viewItem", editItem: "editItem", deleteItem: "deleteItem", pageChanged: "pageChanged", pageSizeChanged: "pageSizeChanged", componentStateChanged: "componentStateChanged" }, queries: [{ propertyName: "gridItemSubtitleLinesChildTemplate", first: true, predicate: ["gridItemSubtitleLines"], descendants: true }, { propertyName: "listItemSubtitleLinesChildTemplate", first: true, predicate: ["listItemSubtitleLines"], descendants: true }, { propertyName: "listItemChildTemplate", first: true, predicate: ["listItem"], descendants: true }, { propertyName: "gridItemChildTemplate", first: true, predicate: ["gridItem"], descendants: true }, { propertyName: "listValueChildTemplate", first: true, predicate: ["listValue"], descendants: true }, { propertyName: "translationKeyListValueChildTemplate", first: true, predicate: ["translationKeyListValue"], descendants: true }, { propertyName: "numberListValueChildTemplate", first: true, predicate: ["numberListValue"], descendants: true }, { propertyName: "relativeDateListValueChildTemplate", first: true, predicate: ["relativeDateListValue"], descendants: true }, { propertyName: "customListValueChildTemplate", first: true, predicate: ["customListValue"], descendants: true }, { propertyName: "stringListValueChildTemplate", first: true, predicate: ["stringListValue"], descendants: true }, { propertyName: "dateListValueChildTemplate", first: true, predicate: ["dateListValue"], descendants: true }, { propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "viewTemplates", predicate: PrimeTemplate, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"(displayedPageSize$ | async) as displayedPageSize\">\n <p-dataView\n *ngIf=\"(columnTemplates$ | async) ?? {} as columnTemplates\"\n [value]=\"(displayedItems$ | async) ?? []\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [layout]=\"layout\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataListGrid_{{name}}\"\n paginatorDropdownAppendTo=\"body\"\n >\n <ng-template #gridItem let-rows pTemplate=\"gridItem\">\n <div class=\"p-grid p-nogutter grid grid-nogutter\">\n <ng-template ngFor let-item [ngForOf]=\"rows\">\n <ng-container\n [ngTemplateOutlet]=\"_gridItem ? _gridItem : defaultGridItem\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </ng-template>\n </div>\n </ng-template>\n\n <ng-template #listItem let-rows pTemplate=\"listItem\">\n <div class=\"p-grid p-nogutter grid grid-nogutter\">\n <ng-template ngFor let-item [ngForOf]=\"rows\">\n @defer (on viewport; on idle){\n <ng-container\n [ngTemplateOutlet]=\"_listItem ? _listItem : defaultListItem\"\n [ngTemplateOutletContext]=\"{\n $implicit:item,\n item:item,\n columnTemplates: columnTemplates\n }\"\n ></ng-container>\n } @placeholder {\n <div style=\"width: 100%; height: 80px\"></div>\n }\n </ng-template>\n </div>\n </ng-template>\n <ng-template pTemplate=\"empty\">\n <span>{{ emptyResultsMessage || (\"OCX_DATA_LIST_GRID.EMPTY_RESULT\" | translate) }}</span>\n </ng-template>\n </p-dataView>\n</ng-container>\n\n<ng-template #defaultGridItem let-item>\n <div class=\"col-12 lg:col-6 xl:col-4 flex\">\n <div class=\"data-grid-item card flex flex-column justify-content-between w-12 lg:w-11 mb-4 mt-4 align-self-stretch\">\n <div class=\"flex justify-content-center mb-3\">\n <img\n class=\"image\"\n src=\"{{ item.imagePath || (fallbackImagePath$ | async) }}\"\n (error)=\"imgError(item)\"\n alt=\"{{resolveFieldData(item, titleLineId)|| ''}}\"\n />\n </div>\n <div class=\"flex flex-row justify-content-between align-items-center\">\n <div class=\"data-grid-items flex-row\">\n <div class=\"item-name font-medium mr-3 text-2xl\">\n <ng-container *ngIf=\"hasViewPermission$ | async as hasViewPermission; else noViewPermission\">\n <a [routerLink]=\"\" (click)=\"onViewRow(item)\">{{ resolveFieldData(item, titleLineId) || '' }}</a>\n </ng-container>\n <ng-template #noViewPermission>\n <a [routerLink]=\"\">{{ resolveFieldData(item, titleLineId) || '' }}</a>\n </ng-template>\n </div>\n <ng-container\n [ngTemplateOutlet]=\"_gridItemSubtitleLines ? _gridItemSubtitleLines : defaultGridItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </div>\n <div *ngIf=\"(gridMenuItems$ | async) as gridMenuItems\">\n <p-menu #menu [model]=\"gridMenuItems\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n (click)=\"setSelectedItem(item); menu.toggle($event)\"\n icon=\"pi pi-ellipsis-v\"\n [attr.aria-label]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS_ARIA_LABEL' | translate\"\n class=\"more-actions-menu-button menu-btn\"\n [attr.name]=\"'data-grid-item-menu-button'\"\n [pTooltip]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS_TOOLTIP' | translate\"\n tooltipPosition=\"top\"\n ></button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #defaultGridItemSubtitleLines let-item>\n <div *ngFor=\"let subtitleLineId of subtitleLineIds\" class=\"subtitleLine edit-time text-xl my-3\">\n {{ resolveFieldData(item, subtitleLineId) }}\n </div>\n</ng-template>\n<ng-template #defaultListItem let-item=\"item\" let-columnTemplates=\"columnTemplates\">\n <div class=\"col-12\" *ngIf=\"columnTemplates\">\n <div class=\"data-list-items p-3\">\n <div class=\"item-name-row flex flex-row justify-content-between\">\n <div class=\"item-name mr-3 text-2xl font-medium align-content-center\">\n <span *ngIf=\"titleLineId\">{{ resolveFieldData(item, titleLineId) || '' }}</span>\n </div>\n <div class=\"flex flex-row\">\n <ng-container\n *ngIf=\"viewItemObserved && (!viewActionVisibleField || fieldIsTruthy(item, viewActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(item, 'id')}}-viewButton\"\n type=\"button\"\n icon=\"pi pi-eye\"\n pButton\n class=\"p-button-rounded p-button-text mb-1 mr-2 viewListItemButton\"\n [pTooltip]=\"(viewMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.VIEW') | translate\"\n tooltipPosition=\"top\"\n [attr.aria-label]=\"(viewMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.VIEW') | translate\"\n (click)=\"onViewRow(item)\"\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(item, viewActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"editItemObserved && (!editActionVisibleField || fieldIsTruthy(item, editActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(item, 'id')}}-editButton\"\n type=\"button\"\n class=\"p-button-rounded p-button-text mb-1 mr-2 editListItemButton\"\n icon=\"pi pi-pencil\"\n pButton\n [pTooltip]=\"(editMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.EDIT') | translate\"\n tooltipPosition=\"top\"\n [attr.aria-label]=\"(editMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.EDIT') | translate\"\n (click)=\"onEditRow(item)\"\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(item, editActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"deleteItemObserved && (!deleteActionVisibleField || fieldIsTruthy(item, deleteActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(item, 'id')}}-deleteButton\"\n type=\"button\"\n icon=\"pi pi-trash\"\n class=\"p-button-rounded p-button-text p-button-danger mb-1 mr-2 deleteListItemButton\"\n pButton\n [pTooltip]=\"(deleteMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.DELETE') | translate\"\n tooltipPosition=\"top\"\n [attr.aria-label]=\"(deleteMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.DELETE') | translate\"\n (click)=\"onDeleteRow(item)\"\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(item, deleteActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of inlineListActions$ | async\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(item, action.actionVisibleField))\">\n <button\n id=\"{{resolveFieldData(item, 'id')}}-{{action.id ? action.id.concat('ActionButton') : 'inlineActionButton'}}\"\n *ocxIfPermission=\"action.permission\"\n pButton\n class=\"p-button-rounded p-button-text\"\n [ngClass]=\"action.classes\"\n [icon]=\"action.icon || ''\"\n (click)=\"action.callback(item)\"\n [pTooltip]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n tooltipPosition=\"top\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(item, action.actionEnabledField))\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(item) | async\">\n <p-menu #menu [model]=\"(overflowListMenuItems$ | async) || []\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n class=\"p-button-rounded p-button-text\"\n [icon]=\"'pi pi-ellipsis-v'\"\n (click)=\"toggleOverflowMenu($event, menu, item)\"\n [attr.aria-label]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS_ARIA_LABEL' | translate\"\n [pTooltip]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS_TOOLTIP' | translate\"\n tooltipPosition=\"top\"\n [attr.name]=\"'data-list-overflow-item-menu-button'\"\n ></button>\n </ng-container>\n </div>\n </div>\n <div class=\"text-base font-light my-1\">\n <ng-container\n [ngTemplateOutlet]=\"_listItemSubtitleLines ? _listItemSubtitleLines : defaultListItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </div>\n <div class=\"flex flex-wrap\">\n <div *ngFor=\"let col of getFilteredColumns()\" class=\"w-12rem my-2 mr-2\">\n <div class=\"font-bold\" [ocxTooltipOnOverflow]=\"col.nameKey | translate\" tooltipPosition=\"top\">\n {{ col.nameKey | translate }}\n </div>\n <div\n [ocxTooltipOnOverflow]=\"col.columnType === columnType.TRANSLATION_KEY ? (resolveFieldData(item,col.id) | translate) : resolveFieldData(item, col.id)\"\n tooltipPosition=\"top\"\n >\n @defer(on viewport;){\n <ng-container\n [ngTemplateOutlet]=\"_listValue ? _listValue: defaultListValue\"\n [ngTemplateOutletContext]=\"{\n rowObject: item,\n column: col,\n columnTemplates: columnTemplates\n }\"\n >\n </ng-container>\n } @placeholder {\n <p-skeleton width=\"5rem\" />\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #defaultListItemSubtitleLines let-item=\"$implicit\">\n <div *ngFor=\"let subtitleLineId of subtitleLineIds\" class=\"subtitleLine text-xl my-3\">\n {{ resolveFieldData(item, subtitleLineId) }}\n </div>\n</ng-template>\n\n<ng-template #defaultListValue let-rowObject=\"rowObject\" let-column=\"column\" let-columnTemplates=\"columnTemplates\">\n <ng-container\n *ngIf=\"columnTemplates[column.id]\"\n [ngTemplateOutlet]=\"columnTemplates[column.id]\"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n >\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultStringListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultNumberListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | number }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultCustomListValue\" let-rowObject=\"rowObject\" let-column=\"column\"> </ng-template>\n\n<ng-template pTemplate=\"defaultDateListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | date: column.dateFormat ?? 'medium' }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultRelativeDateListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container>\n {{ 'OCX_DATA_TABLE.EDITED' | translate }} {{ resolveFieldData(rowObject, column.id) | timeago }}\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultTranslationKeyListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | translate }} </ng-container>\n</ng-template>\n", styles: [".image{width:100%;height:100%}.menu-btn{color:var(--primary-text-color);background-color:var(--primary-color, var(--primary-color-default));border:var(--button-border);border-radius:var(--border-radius);padding:var(--button-padding);cursor:pointer;min-width:4rem}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i9.DataView, selector: "p-dataView", inputs: ["paginator", "rows", "totalRecords", "pageLinks", "rowsPerPageOptions", "paginatorPosition", "paginatorStyleClass", "alwaysShowPaginator", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showFirstLastIcon", "showPageLinks", "lazy", "lazyLoadOnInit", "emptyMessage", "style", "styleClass", "gridStyleClass", "trackBy", "filterBy", "filterLocale", "loading", "loadingIcon", "first", "sortField", "sortOrder", "value", "layout"], outputs: ["onLazyLoad", "onPage", "onSort", "onChangeLayout"] }, { kind: "component", type: i10.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i11.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "directive", type: i12.IfPermissionDirective, selector: "[ocxIfPermission], [ocxIfNotPermission]", inputs: ["ocxIfPermission", "ocxIfNotPermission", "ocxIfPermissionOnMissingPermission", "ocxIfNotPermissionOnMissingPermission", "onMissingPermission", "ocxIfPermissionPermissions", "ocxIfNotPermissionPermissions", "ocxIfPermissionElseTemplate", "ocxIfNotPermissionElseTemplate"] }, { kind: "directive", type: i13.TooltipOnOverflowDirective, selector: "[ocxTooltipOnOverflow]", inputs: ["ocxTooltipOnOverflow"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.DecimalPipe, name: "number" }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i14.OcxTimeAgoPipe, name: "timeago" }], deferBlockDependencies: [() => [i5.NgTemplateOutlet], () => [i5.NgTemplateOutlet]] }); }
|
|
509
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DataListGridComponent, selector: "ocx-data-list-grid", inputs: { titleLineId: { classPropertyName: "titleLineId", publicName: "titleLineId", isSignal: false, isRequired: false, transformFunction: null }, subtitleLineIds: { classPropertyName: "subtitleLineIds", publicName: "subtitleLineIds", isSignal: false, isRequired: false, transformFunction: null }, clientSideSorting: { classPropertyName: "clientSideSorting", publicName: "clientSideSorting", isSignal: false, isRequired: false, transformFunction: null }, clientSideFiltering: { classPropertyName: "clientSideFiltering", publicName: "clientSideFiltering", isSignal: false, isRequired: false, transformFunction: null }, sortStates: { classPropertyName: "sortStates", publicName: "sortStates", isSignal: false, isRequired: false, transformFunction: null }, pageSizes: { classPropertyName: "pageSizes", publicName: "pageSizes", isSignal: false, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: false, isRequired: false, transformFunction: null }, showAllOption: { classPropertyName: "showAllOption", publicName: "showAllOption", isSignal: false, isRequired: false, transformFunction: null }, emptyResultsMessage: { classPropertyName: "emptyResultsMessage", publicName: "emptyResultsMessage", isSignal: false, isRequired: false, transformFunction: null }, fallbackImage: { classPropertyName: "fallbackImage", publicName: "fallbackImage", isSignal: false, isRequired: false, transformFunction: null }, layout: { classPropertyName: "layout", publicName: "layout", isSignal: false, isRequired: false, transformFunction: null }, viewPermission: { classPropertyName: "viewPermission", publicName: "viewPermission", isSignal: false, isRequired: false, transformFunction: null }, editPermission: { classPropertyName: "editPermission", publicName: "editPermission", isSignal: false, isRequired: false, transformFunction: null }, deletePermission: { classPropertyName: "deletePermission", publicName: "deletePermission", isSignal: false, isRequired: false, transformFunction: null }, deleteActionVisibleField: { classPropertyName: "deleteActionVisibleField", publicName: "deleteActionVisibleField", isSignal: false, isRequired: false, transformFunction: null }, deleteActionEnabledField: { classPropertyName: "deleteActionEnabledField", publicName: "deleteActionEnabledField", isSignal: false, isRequired: false, transformFunction: null }, viewActionVisibleField: { classPropertyName: "viewActionVisibleField", publicName: "viewActionVisibleField", isSignal: false, isRequired: false, transformFunction: null }, viewActionEnabledField: { classPropertyName: "viewActionEnabledField", publicName: "viewActionEnabledField", isSignal: false, isRequired: false, transformFunction: null }, editActionVisibleField: { classPropertyName: "editActionVisibleField", publicName: "editActionVisibleField", isSignal: false, isRequired: false, transformFunction: null }, editActionEnabledField: { classPropertyName: "editActionEnabledField", publicName: "editActionEnabledField", isSignal: false, isRequired: false, transformFunction: null }, viewMenuItemKey: { classPropertyName: "viewMenuItemKey", publicName: "viewMenuItemKey", isSignal: false, isRequired: false, transformFunction: null }, editMenuItemKey: { classPropertyName: "editMenuItemKey", publicName: "editMenuItemKey", isSignal: false, isRequired: false, transformFunction: null }, deleteMenuItemKey: { classPropertyName: "deleteMenuItemKey", publicName: "deleteMenuItemKey", isSignal: false, isRequired: false, transformFunction: null }, paginator: { classPropertyName: "paginator", publicName: "paginator", isSignal: false, isRequired: false, transformFunction: null }, page: { classPropertyName: "page", publicName: "page", isSignal: false, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: false, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: false, isRequired: false, transformFunction: null }, totalRecordsOnServer: { classPropertyName: "totalRecordsOnServer", publicName: "totalRecordsOnServer", isSignal: true, isRequired: false, transformFunction: null }, currentPageShowingKey: { classPropertyName: "currentPageShowingKey", publicName: "currentPageShowingKey", isSignal: false, isRequired: false, transformFunction: null }, currentPageShowingWithTotalOnServerKey: { classPropertyName: "currentPageShowingWithTotalOnServerKey", publicName: "currentPageShowingWithTotalOnServerKey", isSignal: false, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: false, isRequired: false, transformFunction: null }, filters: { classPropertyName: "filters", publicName: "filters", isSignal: false, isRequired: false, transformFunction: null }, sortDirection: { classPropertyName: "sortDirection", publicName: "sortDirection", isSignal: false, isRequired: false, transformFunction: null }, sortField: { classPropertyName: "sortField", publicName: "sortField", isSignal: false, isRequired: false, transformFunction: null }, gridItemSubtitleLinesTemplate: { classPropertyName: "gridItemSubtitleLinesTemplate", publicName: "gridItemSubtitleLinesTemplate", isSignal: false, isRequired: false, transformFunction: null }, listItemSubtitleLinesTemplate: { classPropertyName: "listItemSubtitleLinesTemplate", publicName: "listItemSubtitleLinesTemplate", isSignal: false, isRequired: false, transformFunction: null }, listItemTemplate: { classPropertyName: "listItemTemplate", publicName: "listItemTemplate", isSignal: false, isRequired: false, transformFunction: null }, gridItemTemplate: { classPropertyName: "gridItemTemplate", publicName: "gridItemTemplate", isSignal: false, isRequired: false, transformFunction: null }, listValueTemplate: { classPropertyName: "listValueTemplate", publicName: "listValueTemplate", isSignal: false, isRequired: false, transformFunction: null }, translationKeyListValueTemplate: { classPropertyName: "translationKeyListValueTemplate", publicName: "translationKeyListValueTemplate", isSignal: false, isRequired: false, transformFunction: null }, numberListValueTemplate: { classPropertyName: "numberListValueTemplate", publicName: "numberListValueTemplate", isSignal: false, isRequired: false, transformFunction: null }, relativeDateListValueTemplate: { classPropertyName: "relativeDateListValueTemplate", publicName: "relativeDateListValueTemplate", isSignal: false, isRequired: false, transformFunction: null }, customListValueTemplate: { classPropertyName: "customListValueTemplate", publicName: "customListValueTemplate", isSignal: false, isRequired: false, transformFunction: null }, stringListValueTemplate: { classPropertyName: "stringListValueTemplate", publicName: "stringListValueTemplate", isSignal: false, isRequired: false, transformFunction: null }, dateListValueTemplate: { classPropertyName: "dateListValueTemplate", publicName: "dateListValueTemplate", isSignal: false, isRequired: false, transformFunction: null }, additionalActions: { classPropertyName: "additionalActions", publicName: "additionalActions", isSignal: false, isRequired: false, transformFunction: null }, parentTemplates: { classPropertyName: "parentTemplates", publicName: "parentTemplates", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { viewItem: "viewItem", editItem: "editItem", deleteItem: "deleteItem", pageChanged: "pageChanged", pageSizeChanged: "pageSizeChanged", componentStateChanged: "componentStateChanged" }, queries: [{ propertyName: "gridItemSubtitleLinesChildTemplate", first: true, predicate: ["gridItemSubtitleLines"], descendants: true }, { propertyName: "listItemSubtitleLinesChildTemplate", first: true, predicate: ["listItemSubtitleLines"], descendants: true }, { propertyName: "listItemChildTemplate", first: true, predicate: ["listItem"], descendants: true }, { propertyName: "gridItemChildTemplate", first: true, predicate: ["gridItem"], descendants: true }, { propertyName: "listValueChildTemplate", first: true, predicate: ["listValue"], descendants: true }, { propertyName: "translationKeyListValueChildTemplate", first: true, predicate: ["translationKeyListValue"], descendants: true }, { propertyName: "numberListValueChildTemplate", first: true, predicate: ["numberListValue"], descendants: true }, { propertyName: "relativeDateListValueChildTemplate", first: true, predicate: ["relativeDateListValue"], descendants: true }, { propertyName: "customListValueChildTemplate", first: true, predicate: ["customListValue"], descendants: true }, { propertyName: "stringListValueChildTemplate", first: true, predicate: ["stringListValue"], descendants: true }, { propertyName: "dateListValueChildTemplate", first: true, predicate: ["dateListValue"], descendants: true }, { propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "viewTemplates", predicate: PrimeTemplate, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"(displayedPageSize$ | async) as displayedPageSize\">\n <p-dataView\n *ngIf=\"(columnTemplates$ | async) ?? {} as columnTemplates\"\n [value]=\"(displayedItems$ | async) ?? []\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [layout]=\"layout\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer() ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params() }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataListGrid_{{name}}\"\n paginatorDropdownAppendTo=\"body\"\n >\n <ng-template #gridItem let-rows pTemplate=\"gridItem\">\n <div class=\"p-grid p-nogutter grid grid-nogutter\">\n <ng-template ngFor let-item [ngForOf]=\"rows\">\n <ng-container\n [ngTemplateOutlet]=\"_gridItem ? _gridItem : defaultGridItem\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </ng-template>\n </div>\n </ng-template>\n\n <ng-template #listItem let-rows pTemplate=\"listItem\">\n <div class=\"p-grid p-nogutter grid grid-nogutter\">\n <ng-template ngFor let-item [ngForOf]=\"rows\">\n @defer (on viewport; on idle){\n <ng-container\n [ngTemplateOutlet]=\"_listItem ? _listItem : defaultListItem\"\n [ngTemplateOutletContext]=\"{\n $implicit:item,\n item:item,\n columnTemplates: columnTemplates\n }\"\n ></ng-container>\n } @placeholder {\n <div style=\"width: 100%; height: 80px\"></div>\n }\n </ng-template>\n </div>\n </ng-template>\n <ng-template pTemplate=\"empty\">\n <span>{{ emptyResultsMessage || (\"OCX_DATA_LIST_GRID.EMPTY_RESULT\" | translate) }}</span>\n </ng-template>\n </p-dataView>\n</ng-container>\n\n<ng-template #defaultGridItem let-item>\n <div class=\"col-12 lg:col-6 xl:col-4 flex\">\n <div class=\"data-grid-item card flex flex-column justify-content-between w-12 lg:w-11 mb-4 mt-4 align-self-stretch\">\n <div class=\"flex justify-content-center mb-3\">\n <img\n class=\"image\"\n src=\"{{ item.imagePath || (fallbackImagePath$ | async) }}\"\n (error)=\"imgError(item)\"\n alt=\"{{resolveFieldData(item, titleLineId)|| ''}}\"\n />\n </div>\n <div class=\"flex flex-row justify-content-between align-items-center\">\n <div class=\"data-grid-items flex-row\">\n <div class=\"item-name font-medium mr-3 text-2xl\">\n <ng-container *ngIf=\"hasViewPermission$ | async as hasViewPermission; else noViewPermission\">\n <a [routerLink]=\"\" (click)=\"onViewRow(item)\">{{ resolveFieldData(item, titleLineId) || '' }}</a>\n </ng-container>\n <ng-template #noViewPermission>\n <a [routerLink]=\"\">{{ resolveFieldData(item, titleLineId) || '' }}</a>\n </ng-template>\n </div>\n <ng-container\n [ngTemplateOutlet]=\"_gridItemSubtitleLines ? _gridItemSubtitleLines : defaultGridItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </div>\n <div *ngIf=\"(gridMenuItems$ | async) as gridMenuItems\">\n <p-menu #menu [model]=\"gridMenuItems\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n (click)=\"setSelectedItem(item); menu.toggle($event)\"\n icon=\"pi pi-ellipsis-v\"\n [attr.aria-label]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS_ARIA_LABEL' | translate\"\n class=\"more-actions-menu-button menu-btn\"\n [attr.name]=\"'data-grid-item-menu-button'\"\n [pTooltip]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS_TOOLTIP' | translate\"\n tooltipPosition=\"top\"\n ></button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #defaultGridItemSubtitleLines let-item>\n <div *ngFor=\"let subtitleLineId of subtitleLineIds\" class=\"subtitleLine edit-time text-xl my-3\">\n {{ resolveFieldData(item, subtitleLineId) }}\n </div>\n</ng-template>\n<ng-template #defaultListItem let-item=\"item\" let-columnTemplates=\"columnTemplates\">\n <div class=\"col-12\" *ngIf=\"columnTemplates\">\n <div class=\"data-list-items p-3\">\n <div class=\"item-name-row flex flex-row justify-content-between\">\n <div class=\"item-name mr-3 text-2xl font-medium align-content-center\">\n <span *ngIf=\"titleLineId\">{{ resolveFieldData(item, titleLineId) || '' }}</span>\n </div>\n <div class=\"flex flex-row\">\n <ng-container\n *ngIf=\"viewItemObserved && (!viewActionVisibleField || fieldIsTruthy(item, viewActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(item, 'id')}}-viewButton\"\n type=\"button\"\n icon=\"pi pi-eye\"\n pButton\n class=\"p-button-rounded p-button-text mb-1 mr-2 viewListItemButton\"\n [pTooltip]=\"(viewMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.VIEW') | translate\"\n tooltipPosition=\"top\"\n [attr.aria-label]=\"(viewMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.VIEW') | translate\"\n (click)=\"onViewRow(item)\"\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(item, viewActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"editItemObserved && (!editActionVisibleField || fieldIsTruthy(item, editActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(item, 'id')}}-editButton\"\n type=\"button\"\n class=\"p-button-rounded p-button-text mb-1 mr-2 editListItemButton\"\n icon=\"pi pi-pencil\"\n pButton\n [pTooltip]=\"(editMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.EDIT') | translate\"\n tooltipPosition=\"top\"\n [attr.aria-label]=\"(editMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.EDIT') | translate\"\n (click)=\"onEditRow(item)\"\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(item, editActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"deleteItemObserved && (!deleteActionVisibleField || fieldIsTruthy(item, deleteActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(item, 'id')}}-deleteButton\"\n type=\"button\"\n icon=\"pi pi-trash\"\n class=\"p-button-rounded p-button-text p-button-danger mb-1 mr-2 deleteListItemButton\"\n pButton\n [pTooltip]=\"(deleteMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.DELETE') | translate\"\n tooltipPosition=\"top\"\n [attr.aria-label]=\"(deleteMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.DELETE') | translate\"\n (click)=\"onDeleteRow(item)\"\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(item, deleteActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of inlineListActions$ | async\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(item, action.actionVisibleField))\">\n <button\n id=\"{{resolveFieldData(item, 'id')}}-{{action.id ? action.id.concat('ActionButton') : 'inlineActionButton'}}\"\n *ocxIfPermission=\"action.permission\"\n pButton\n class=\"p-button-rounded p-button-text\"\n [ngClass]=\"action.classes\"\n [icon]=\"action.icon || ''\"\n (click)=\"action.callback(item)\"\n [pTooltip]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n tooltipPosition=\"top\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(item, action.actionEnabledField))\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(item) | async\">\n <p-menu #menu [model]=\"(overflowListMenuItems$ | async) || []\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n class=\"p-button-rounded p-button-text\"\n [icon]=\"'pi pi-ellipsis-v'\"\n (click)=\"toggleOverflowMenu($event, menu, item)\"\n [attr.aria-label]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS_ARIA_LABEL' | translate\"\n [pTooltip]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS_TOOLTIP' | translate\"\n tooltipPosition=\"top\"\n [attr.name]=\"'data-list-overflow-item-menu-button'\"\n ></button>\n </ng-container>\n </div>\n </div>\n <div class=\"text-base font-light my-1\">\n <ng-container\n [ngTemplateOutlet]=\"_listItemSubtitleLines ? _listItemSubtitleLines : defaultListItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </div>\n <div class=\"flex flex-wrap\">\n <div *ngFor=\"let col of getFilteredColumns()\" class=\"w-12rem my-2 mr-2\">\n <div class=\"font-bold\" [ocxTooltipOnOverflow]=\"col.nameKey | translate\" tooltipPosition=\"top\">\n {{ col.nameKey | translate }}\n </div>\n <div\n [ocxTooltipOnOverflow]=\"col.columnType === columnType.TRANSLATION_KEY ? (resolveFieldData(item,col.id) | translate) : resolveFieldData(item, col.id)\"\n tooltipPosition=\"top\"\n >\n @defer(on viewport;){\n <ng-container\n [ngTemplateOutlet]=\"_listValue ? _listValue: defaultListValue\"\n [ngTemplateOutletContext]=\"{\n rowObject: item,\n column: col,\n columnTemplates: columnTemplates\n }\"\n >\n </ng-container>\n } @placeholder {\n <p-skeleton width=\"5rem\" />\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #defaultListItemSubtitleLines let-item=\"$implicit\">\n <div *ngFor=\"let subtitleLineId of subtitleLineIds\" class=\"subtitleLine text-xl my-3\">\n {{ resolveFieldData(item, subtitleLineId) }}\n </div>\n</ng-template>\n\n<ng-template #defaultListValue let-rowObject=\"rowObject\" let-column=\"column\" let-columnTemplates=\"columnTemplates\">\n <ng-container\n *ngIf=\"columnTemplates[column.id]\"\n [ngTemplateOutlet]=\"columnTemplates[column.id]\"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n >\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultStringListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultNumberListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | number }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultCustomListValue\" let-rowObject=\"rowObject\" let-column=\"column\"> </ng-template>\n\n<ng-template pTemplate=\"defaultDateListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | date: column.dateFormat ?? 'medium' }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultRelativeDateListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container>\n {{ 'OCX_DATA_TABLE.EDITED' | translate }} {{ resolveFieldData(rowObject, column.id) | timeago }}\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultTranslationKeyListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | translate }} </ng-container>\n</ng-template>\n", styles: [".image{width:100%;height:100%}.menu-btn{color:var(--primary-text-color);background-color:var(--primary-color, var(--primary-color-default));border:var(--button-border);border-radius:var(--border-radius);padding:var(--button-padding);cursor:pointer;min-width:4rem}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i9.DataView, selector: "p-dataView", inputs: ["paginator", "rows", "totalRecords", "pageLinks", "rowsPerPageOptions", "paginatorPosition", "paginatorStyleClass", "alwaysShowPaginator", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showFirstLastIcon", "showPageLinks", "lazy", "lazyLoadOnInit", "emptyMessage", "style", "styleClass", "gridStyleClass", "trackBy", "filterBy", "filterLocale", "loading", "loadingIcon", "first", "sortField", "sortOrder", "value", "layout"], outputs: ["onLazyLoad", "onPage", "onSort", "onChangeLayout"] }, { kind: "component", type: i10.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i11.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "directive", type: i12.IfPermissionDirective, selector: "[ocxIfPermission], [ocxIfNotPermission]", inputs: ["ocxIfPermission", "ocxIfNotPermission", "ocxIfPermissionOnMissingPermission", "ocxIfNotPermissionOnMissingPermission", "onMissingPermission", "ocxIfPermissionPermissions", "ocxIfNotPermissionPermissions", "ocxIfPermissionElseTemplate", "ocxIfNotPermissionElseTemplate"] }, { kind: "directive", type: i13.TooltipOnOverflowDirective, selector: "[ocxTooltipOnOverflow]", inputs: ["ocxTooltipOnOverflow"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.DecimalPipe, name: "number" }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i14.OcxTimeAgoPipe, name: "timeago" }], deferBlockDependencies: [() => [i5.NgTemplateOutlet], () => [i5.NgTemplateOutlet]] }); }
|
|
514
510
|
}
|
|
515
511
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DataListGridComponent, decorators: [{
|
|
516
512
|
type: Component,
|
|
517
|
-
args: [{ selector: 'ocx-data-list-grid', template: "<ng-container *ngIf=\"(displayedPageSize$ | async) as displayedPageSize\">\n <p-dataView\n *ngIf=\"(columnTemplates$ | async) ?? {} as columnTemplates\"\n [value]=\"(displayedItems$ | async) ?? []\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [layout]=\"layout\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataListGrid_{{name}}\"\n paginatorDropdownAppendTo=\"body\"\n >\n <ng-template #gridItem let-rows pTemplate=\"gridItem\">\n <div class=\"p-grid p-nogutter grid grid-nogutter\">\n <ng-template ngFor let-item [ngForOf]=\"rows\">\n <ng-container\n [ngTemplateOutlet]=\"_gridItem ? _gridItem : defaultGridItem\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </ng-template>\n </div>\n </ng-template>\n\n <ng-template #listItem let-rows pTemplate=\"listItem\">\n <div class=\"p-grid p-nogutter grid grid-nogutter\">\n <ng-template ngFor let-item [ngForOf]=\"rows\">\n @defer (on viewport; on idle){\n <ng-container\n [ngTemplateOutlet]=\"_listItem ? _listItem : defaultListItem\"\n [ngTemplateOutletContext]=\"{\n $implicit:item,\n item:item,\n columnTemplates: columnTemplates\n }\"\n ></ng-container>\n } @placeholder {\n <div style=\"width: 100%; height: 80px\"></div>\n }\n </ng-template>\n </div>\n </ng-template>\n <ng-template pTemplate=\"empty\">\n <span>{{ emptyResultsMessage || (\"OCX_DATA_LIST_GRID.EMPTY_RESULT\" | translate) }}</span>\n </ng-template>\n </p-dataView>\n</ng-container>\n\n<ng-template #defaultGridItem let-item>\n <div class=\"col-12 lg:col-6 xl:col-4 flex\">\n <div class=\"data-grid-item card flex flex-column justify-content-between w-12 lg:w-11 mb-4 mt-4 align-self-stretch\">\n <div class=\"flex justify-content-center mb-3\">\n <img\n class=\"image\"\n src=\"{{ item.imagePath || (fallbackImagePath$ | async) }}\"\n (error)=\"imgError(item)\"\n alt=\"{{resolveFieldData(item, titleLineId)|| ''}}\"\n />\n </div>\n <div class=\"flex flex-row justify-content-between align-items-center\">\n <div class=\"data-grid-items flex-row\">\n <div class=\"item-name font-medium mr-3 text-2xl\">\n <ng-container *ngIf=\"hasViewPermission$ | async as hasViewPermission; else noViewPermission\">\n <a [routerLink]=\"\" (click)=\"onViewRow(item)\">{{ resolveFieldData(item, titleLineId) || '' }}</a>\n </ng-container>\n <ng-template #noViewPermission>\n <a [routerLink]=\"\">{{ resolveFieldData(item, titleLineId) || '' }}</a>\n </ng-template>\n </div>\n <ng-container\n [ngTemplateOutlet]=\"_gridItemSubtitleLines ? _gridItemSubtitleLines : defaultGridItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </div>\n <div *ngIf=\"(gridMenuItems$ | async) as gridMenuItems\">\n <p-menu #menu [model]=\"gridMenuItems\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n (click)=\"setSelectedItem(item); menu.toggle($event)\"\n icon=\"pi pi-ellipsis-v\"\n [attr.aria-label]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS_ARIA_LABEL' | translate\"\n class=\"more-actions-menu-button menu-btn\"\n [attr.name]=\"'data-grid-item-menu-button'\"\n [pTooltip]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS_TOOLTIP' | translate\"\n tooltipPosition=\"top\"\n ></button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #defaultGridItemSubtitleLines let-item>\n <div *ngFor=\"let subtitleLineId of subtitleLineIds\" class=\"subtitleLine edit-time text-xl my-3\">\n {{ resolveFieldData(item, subtitleLineId) }}\n </div>\n</ng-template>\n<ng-template #defaultListItem let-item=\"item\" let-columnTemplates=\"columnTemplates\">\n <div class=\"col-12\" *ngIf=\"columnTemplates\">\n <div class=\"data-list-items p-3\">\n <div class=\"item-name-row flex flex-row justify-content-between\">\n <div class=\"item-name mr-3 text-2xl font-medium align-content-center\">\n <span *ngIf=\"titleLineId\">{{ resolveFieldData(item, titleLineId) || '' }}</span>\n </div>\n <div class=\"flex flex-row\">\n <ng-container\n *ngIf=\"viewItemObserved && (!viewActionVisibleField || fieldIsTruthy(item, viewActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(item, 'id')}}-viewButton\"\n type=\"button\"\n icon=\"pi pi-eye\"\n pButton\n class=\"p-button-rounded p-button-text mb-1 mr-2 viewListItemButton\"\n [pTooltip]=\"(viewMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.VIEW') | translate\"\n tooltipPosition=\"top\"\n [attr.aria-label]=\"(viewMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.VIEW') | translate\"\n (click)=\"onViewRow(item)\"\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(item, viewActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"editItemObserved && (!editActionVisibleField || fieldIsTruthy(item, editActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(item, 'id')}}-editButton\"\n type=\"button\"\n class=\"p-button-rounded p-button-text mb-1 mr-2 editListItemButton\"\n icon=\"pi pi-pencil\"\n pButton\n [pTooltip]=\"(editMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.EDIT') | translate\"\n tooltipPosition=\"top\"\n [attr.aria-label]=\"(editMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.EDIT') | translate\"\n (click)=\"onEditRow(item)\"\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(item, editActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"deleteItemObserved && (!deleteActionVisibleField || fieldIsTruthy(item, deleteActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(item, 'id')}}-deleteButton\"\n type=\"button\"\n icon=\"pi pi-trash\"\n class=\"p-button-rounded p-button-text p-button-danger mb-1 mr-2 deleteListItemButton\"\n pButton\n [pTooltip]=\"(deleteMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.DELETE') | translate\"\n tooltipPosition=\"top\"\n [attr.aria-label]=\"(deleteMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.DELETE') | translate\"\n (click)=\"onDeleteRow(item)\"\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(item, deleteActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of inlineListActions$ | async\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(item, action.actionVisibleField))\">\n <button\n id=\"{{resolveFieldData(item, 'id')}}-{{action.id ? action.id.concat('ActionButton') : 'inlineActionButton'}}\"\n *ocxIfPermission=\"action.permission\"\n pButton\n class=\"p-button-rounded p-button-text\"\n [ngClass]=\"action.classes\"\n [icon]=\"action.icon || ''\"\n (click)=\"action.callback(item)\"\n [pTooltip]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n tooltipPosition=\"top\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(item, action.actionEnabledField))\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(item) | async\">\n <p-menu #menu [model]=\"(overflowListMenuItems$ | async) || []\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n class=\"p-button-rounded p-button-text\"\n [icon]=\"'pi pi-ellipsis-v'\"\n (click)=\"toggleOverflowMenu($event, menu, item)\"\n [attr.aria-label]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS_ARIA_LABEL' | translate\"\n [pTooltip]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS_TOOLTIP' | translate\"\n tooltipPosition=\"top\"\n [attr.name]=\"'data-list-overflow-item-menu-button'\"\n ></button>\n </ng-container>\n </div>\n </div>\n <div class=\"text-base font-light my-1\">\n <ng-container\n [ngTemplateOutlet]=\"_listItemSubtitleLines ? _listItemSubtitleLines : defaultListItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </div>\n <div class=\"flex flex-wrap\">\n <div *ngFor=\"let col of getFilteredColumns()\" class=\"w-12rem my-2 mr-2\">\n <div class=\"font-bold\" [ocxTooltipOnOverflow]=\"col.nameKey | translate\" tooltipPosition=\"top\">\n {{ col.nameKey | translate }}\n </div>\n <div\n [ocxTooltipOnOverflow]=\"col.columnType === columnType.TRANSLATION_KEY ? (resolveFieldData(item,col.id) | translate) : resolveFieldData(item, col.id)\"\n tooltipPosition=\"top\"\n >\n @defer(on viewport;){\n <ng-container\n [ngTemplateOutlet]=\"_listValue ? _listValue: defaultListValue\"\n [ngTemplateOutletContext]=\"{\n rowObject: item,\n column: col,\n columnTemplates: columnTemplates\n }\"\n >\n </ng-container>\n } @placeholder {\n <p-skeleton width=\"5rem\" />\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #defaultListItemSubtitleLines let-item=\"$implicit\">\n <div *ngFor=\"let subtitleLineId of subtitleLineIds\" class=\"subtitleLine text-xl my-3\">\n {{ resolveFieldData(item, subtitleLineId) }}\n </div>\n</ng-template>\n\n<ng-template #defaultListValue let-rowObject=\"rowObject\" let-column=\"column\" let-columnTemplates=\"columnTemplates\">\n <ng-container\n *ngIf=\"columnTemplates[column.id]\"\n [ngTemplateOutlet]=\"columnTemplates[column.id]\"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n >\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultStringListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultNumberListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | number }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultCustomListValue\" let-rowObject=\"rowObject\" let-column=\"column\"> </ng-template>\n\n<ng-template pTemplate=\"defaultDateListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | date: column.dateFormat ?? 'medium' }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultRelativeDateListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container>\n {{ 'OCX_DATA_TABLE.EDITED' | translate }} {{ resolveFieldData(rowObject, column.id) | timeago }}\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultTranslationKeyListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | translate }} </ng-container>\n</ng-template>\n", styles: [".image{width:100%;height:100%}.menu-btn{color:var(--primary-text-color);background-color:var(--primary-color, var(--primary-color-default));border:var(--button-border);border-radius:var(--border-radius);padding:var(--button-padding);cursor:pointer;min-width:4rem}\n"] }]
|
|
513
|
+
args: [{ selector: 'ocx-data-list-grid', template: "<ng-container *ngIf=\"(displayedPageSize$ | async) as displayedPageSize\">\n <p-dataView\n *ngIf=\"(columnTemplates$ | async) ?? {} as columnTemplates\"\n [value]=\"(displayedItems$ | async) ?? []\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [layout]=\"layout\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer() ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params() }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataListGrid_{{name}}\"\n paginatorDropdownAppendTo=\"body\"\n >\n <ng-template #gridItem let-rows pTemplate=\"gridItem\">\n <div class=\"p-grid p-nogutter grid grid-nogutter\">\n <ng-template ngFor let-item [ngForOf]=\"rows\">\n <ng-container\n [ngTemplateOutlet]=\"_gridItem ? _gridItem : defaultGridItem\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </ng-template>\n </div>\n </ng-template>\n\n <ng-template #listItem let-rows pTemplate=\"listItem\">\n <div class=\"p-grid p-nogutter grid grid-nogutter\">\n <ng-template ngFor let-item [ngForOf]=\"rows\">\n @defer (on viewport; on idle){\n <ng-container\n [ngTemplateOutlet]=\"_listItem ? _listItem : defaultListItem\"\n [ngTemplateOutletContext]=\"{\n $implicit:item,\n item:item,\n columnTemplates: columnTemplates\n }\"\n ></ng-container>\n } @placeholder {\n <div style=\"width: 100%; height: 80px\"></div>\n }\n </ng-template>\n </div>\n </ng-template>\n <ng-template pTemplate=\"empty\">\n <span>{{ emptyResultsMessage || (\"OCX_DATA_LIST_GRID.EMPTY_RESULT\" | translate) }}</span>\n </ng-template>\n </p-dataView>\n</ng-container>\n\n<ng-template #defaultGridItem let-item>\n <div class=\"col-12 lg:col-6 xl:col-4 flex\">\n <div class=\"data-grid-item card flex flex-column justify-content-between w-12 lg:w-11 mb-4 mt-4 align-self-stretch\">\n <div class=\"flex justify-content-center mb-3\">\n <img\n class=\"image\"\n src=\"{{ item.imagePath || (fallbackImagePath$ | async) }}\"\n (error)=\"imgError(item)\"\n alt=\"{{resolveFieldData(item, titleLineId)|| ''}}\"\n />\n </div>\n <div class=\"flex flex-row justify-content-between align-items-center\">\n <div class=\"data-grid-items flex-row\">\n <div class=\"item-name font-medium mr-3 text-2xl\">\n <ng-container *ngIf=\"hasViewPermission$ | async as hasViewPermission; else noViewPermission\">\n <a [routerLink]=\"\" (click)=\"onViewRow(item)\">{{ resolveFieldData(item, titleLineId) || '' }}</a>\n </ng-container>\n <ng-template #noViewPermission>\n <a [routerLink]=\"\">{{ resolveFieldData(item, titleLineId) || '' }}</a>\n </ng-template>\n </div>\n <ng-container\n [ngTemplateOutlet]=\"_gridItemSubtitleLines ? _gridItemSubtitleLines : defaultGridItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </div>\n <div *ngIf=\"(gridMenuItems$ | async) as gridMenuItems\">\n <p-menu #menu [model]=\"gridMenuItems\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n (click)=\"setSelectedItem(item); menu.toggle($event)\"\n icon=\"pi pi-ellipsis-v\"\n [attr.aria-label]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS_ARIA_LABEL' | translate\"\n class=\"more-actions-menu-button menu-btn\"\n [attr.name]=\"'data-grid-item-menu-button'\"\n [pTooltip]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS_TOOLTIP' | translate\"\n tooltipPosition=\"top\"\n ></button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #defaultGridItemSubtitleLines let-item>\n <div *ngFor=\"let subtitleLineId of subtitleLineIds\" class=\"subtitleLine edit-time text-xl my-3\">\n {{ resolveFieldData(item, subtitleLineId) }}\n </div>\n</ng-template>\n<ng-template #defaultListItem let-item=\"item\" let-columnTemplates=\"columnTemplates\">\n <div class=\"col-12\" *ngIf=\"columnTemplates\">\n <div class=\"data-list-items p-3\">\n <div class=\"item-name-row flex flex-row justify-content-between\">\n <div class=\"item-name mr-3 text-2xl font-medium align-content-center\">\n <span *ngIf=\"titleLineId\">{{ resolveFieldData(item, titleLineId) || '' }}</span>\n </div>\n <div class=\"flex flex-row\">\n <ng-container\n *ngIf=\"viewItemObserved && (!viewActionVisibleField || fieldIsTruthy(item, viewActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(item, 'id')}}-viewButton\"\n type=\"button\"\n icon=\"pi pi-eye\"\n pButton\n class=\"p-button-rounded p-button-text mb-1 mr-2 viewListItemButton\"\n [pTooltip]=\"(viewMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.VIEW') | translate\"\n tooltipPosition=\"top\"\n [attr.aria-label]=\"(viewMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.VIEW') | translate\"\n (click)=\"onViewRow(item)\"\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(item, viewActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"editItemObserved && (!editActionVisibleField || fieldIsTruthy(item, editActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(item, 'id')}}-editButton\"\n type=\"button\"\n class=\"p-button-rounded p-button-text mb-1 mr-2 editListItemButton\"\n icon=\"pi pi-pencil\"\n pButton\n [pTooltip]=\"(editMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.EDIT') | translate\"\n tooltipPosition=\"top\"\n [attr.aria-label]=\"(editMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.EDIT') | translate\"\n (click)=\"onEditRow(item)\"\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(item, editActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"deleteItemObserved && (!deleteActionVisibleField || fieldIsTruthy(item, deleteActionVisibleField))\"\n >\n <button\n id=\"{{resolveFieldData(item, 'id')}}-deleteButton\"\n type=\"button\"\n icon=\"pi pi-trash\"\n class=\"p-button-rounded p-button-text p-button-danger mb-1 mr-2 deleteListItemButton\"\n pButton\n [pTooltip]=\"(deleteMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.DELETE') | translate\"\n tooltipPosition=\"top\"\n [attr.aria-label]=\"(deleteMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.DELETE') | translate\"\n (click)=\"onDeleteRow(item)\"\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(item, deleteActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of inlineListActions$ | async\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(item, action.actionVisibleField))\">\n <button\n id=\"{{resolveFieldData(item, 'id')}}-{{action.id ? action.id.concat('ActionButton') : 'inlineActionButton'}}\"\n *ocxIfPermission=\"action.permission\"\n pButton\n class=\"p-button-rounded p-button-text\"\n [ngClass]=\"action.classes\"\n [icon]=\"action.icon || ''\"\n (click)=\"action.callback(item)\"\n [pTooltip]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n tooltipPosition=\"top\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(item, action.actionEnabledField))\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(item) | async\">\n <p-menu #menu [model]=\"(overflowListMenuItems$ | async) || []\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n class=\"p-button-rounded p-button-text\"\n [icon]=\"'pi pi-ellipsis-v'\"\n (click)=\"toggleOverflowMenu($event, menu, item)\"\n [attr.aria-label]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS_ARIA_LABEL' | translate\"\n [pTooltip]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS_TOOLTIP' | translate\"\n tooltipPosition=\"top\"\n [attr.name]=\"'data-list-overflow-item-menu-button'\"\n ></button>\n </ng-container>\n </div>\n </div>\n <div class=\"text-base font-light my-1\">\n <ng-container\n [ngTemplateOutlet]=\"_listItemSubtitleLines ? _listItemSubtitleLines : defaultListItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </div>\n <div class=\"flex flex-wrap\">\n <div *ngFor=\"let col of getFilteredColumns()\" class=\"w-12rem my-2 mr-2\">\n <div class=\"font-bold\" [ocxTooltipOnOverflow]=\"col.nameKey | translate\" tooltipPosition=\"top\">\n {{ col.nameKey | translate }}\n </div>\n <div\n [ocxTooltipOnOverflow]=\"col.columnType === columnType.TRANSLATION_KEY ? (resolveFieldData(item,col.id) | translate) : resolveFieldData(item, col.id)\"\n tooltipPosition=\"top\"\n >\n @defer(on viewport;){\n <ng-container\n [ngTemplateOutlet]=\"_listValue ? _listValue: defaultListValue\"\n [ngTemplateOutletContext]=\"{\n rowObject: item,\n column: col,\n columnTemplates: columnTemplates\n }\"\n >\n </ng-container>\n } @placeholder {\n <p-skeleton width=\"5rem\" />\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #defaultListItemSubtitleLines let-item=\"$implicit\">\n <div *ngFor=\"let subtitleLineId of subtitleLineIds\" class=\"subtitleLine text-xl my-3\">\n {{ resolveFieldData(item, subtitleLineId) }}\n </div>\n</ng-template>\n\n<ng-template #defaultListValue let-rowObject=\"rowObject\" let-column=\"column\" let-columnTemplates=\"columnTemplates\">\n <ng-container\n *ngIf=\"columnTemplates[column.id]\"\n [ngTemplateOutlet]=\"columnTemplates[column.id]\"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n >\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultStringListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultNumberListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | number }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultCustomListValue\" let-rowObject=\"rowObject\" let-column=\"column\"> </ng-template>\n\n<ng-template pTemplate=\"defaultDateListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | date: column.dateFormat ?? 'medium' }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultRelativeDateListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container>\n {{ 'OCX_DATA_TABLE.EDITED' | translate }} {{ resolveFieldData(rowObject, column.id) | timeago }}\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultTranslationKeyListValue\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | translate }} </ng-container>\n</ng-template>\n", styles: [".image{width:100%;height:100%}.menu-btn{color:var(--primary-text-color);background-color:var(--primary-color, var(--primary-color-default));border:var(--button-border);border-radius:var(--border-radius);padding:var(--button-padding);cursor:pointer;min-width:4rem}\n"] }]
|
|
518
514
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
519
515
|
type: Inject,
|
|
520
516
|
args: [LOCALE_ID]
|
|
@@ -577,8 +573,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
577
573
|
type: Input
|
|
578
574
|
}], name: [{
|
|
579
575
|
type: Input
|
|
580
|
-
}], totalRecordsOnServer: [{
|
|
581
|
-
type: Input
|
|
582
576
|
}], currentPageShowingKey: [{
|
|
583
577
|
type: Input
|
|
584
578
|
}], currentPageShowingWithTotalOnServerKey: [{
|
|
@@ -669,4 +663,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
669
663
|
}], parentTemplates: [{
|
|
670
664
|
type: Input
|
|
671
665
|
}] } });
|
|
672
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1saXN0LWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWFjY2VsZXJhdG9yL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWxpc3QtZ3JpZC9kYXRhLWxpc3QtZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtbGlzdC1ncmlkL2RhdGEtbGlzdC1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFFZixZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBQ0wsU0FBUyxFQUVULFFBQVEsRUFDUixNQUFNLEVBR04sWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUVuRixPQUFPLEVBQVksVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUVqRSxPQUFPLEVBQUUsZUFBZSxFQUFjLGFBQWEsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDcEksT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBSTFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIs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dCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRG9DaGVjayxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgTE9DQUxFX0lELFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcidcbmltcG9ydCB7IExpdmVBbm5vdW5jZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSdcbmltcG9ydCB7IEFwcFN0YXRlU2VydmljZSwgVXNlclNlcnZpY2UgfSBmcm9tICdAb25lY3gvYW5ndWxhci1pbnRlZ3JhdGlvbi1pbnRlcmZhY2UnXG5pbXBvcnQgeyBNZmVJbmZvIH0gZnJvbSAnQG9uZWN4L2ludGVncmF0aW9uLWludGVyZmFjZSdcbmltcG9ydCB7IE1lbnVJdGVtLCBQcmltZUljb25zLCBQcmltZVRlbXBsYXRlIH0gZnJvbSAncHJpbWVuZy9hcGknXG5pbXBvcnQgeyBNZW51IH0gZnJvbSAncHJpbWVuZy9tZW51J1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0LCBkZWJvdW5jZVRpbWUsIGZpcnN0LCBmaXJzdFZhbHVlRnJvbSwgbWFwLCBtZXJnZU1hcCwgb2YsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBDb2x1bW5UeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWwvY29sdW1uLXR5cGUubW9kZWwnXG5pbXBvcnQgeyBEYXRhQWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWwvZGF0YS1hY3Rpb24nXG5pbXBvcnQgeyBEYXRhU29ydERpcmVjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVsL2RhdGEtc29ydC1kaXJlY3Rpb24nXG5pbXBvcnQgeyBEYXRhVGFibGVDb2x1bW4gfSBmcm9tICcuLi8uLi9tb2RlbC9kYXRhLXRhYmxlLWNvbHVtbi5tb2RlbCdcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbHMvb2JqZWN0dXRpbHMnXG5pbXBvcnQgeyBEYXRhU29ydEJhc2UgfSBmcm9tICcuLi9kYXRhLXNvcnQtYmFzZS9kYXRhLXNvcnQtYmFzZSdcbmltcG9ydCB7IFJvdyB9IGZyb20gJy4uL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQnXG5pbXBvcnQgeyBGaWx0ZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9maWx0ZXIubW9kZWwnXG5pbXBvcnQgeyBIQVNfUEVSTUlTU0lPTl9DSEVDS0VSLCBIYXNQZXJtaXNzaW9uQ2hlY2tlciB9IGZyb20gJ0BvbmVjeC9hbmd1bGFyLXV0aWxzJ1xuXG5leHBvcnQgdHlwZSBMaXN0R3JpZERhdGEgPSB7XG4gIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgaW1hZ2VQYXRoOiBzdHJpbmcgfCBudW1iZXJcbiAgW2NvbHVtbklkOiBzdHJpbmddOiB1bmtub3duXG59XG5cbnR5cGUgUm93TGlzdEdyaWREYXRhID0gTGlzdEdyaWREYXRhICYgUm93XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdEdyaWREYXRhTWVudUl0ZW0gZXh0ZW5kcyBNZW51SXRlbSB7XG4gIHBlcm1pc3Npb246IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFMaXN0R3JpZENvbXBvbmVudFN0YXRlIHtcbiAgYWN0aXZlUGFnZT86IG51bWJlclxuICBwYWdlU2l6ZT86IG51bWJlclxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvY3gtZGF0YS1saXN0LWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1saXN0LWdyaWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kYXRhLWxpc3QtZ3JpZC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhTGlzdEdyaWRDb21wb25lbnQgZXh0ZW5kcyBEYXRhU29ydEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIERvQ2hlY2ssIEFmdGVyQ29udGVudEluaXQge1xuICBASW5wdXQoKSB0aXRsZUxpbmVJZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHN1YnRpdGxlTGluZUlkczogc3RyaW5nW10gPSBbXVxuICBASW5wdXQoKSBjbGllbnRTaWRlU29ydGluZyA9IHRydWVcbiAgQElucHV0KCkgY2xpZW50U2lkZUZpbHRlcmluZyA9IHRydWVcbiAgQElucHV0KCkgc29ydFN0YXRlczogRGF0YVNvcnREaXJlY3Rpb25bXSA9IFtdXG5cbiAgZGlzcGxheWVkUGFnZVNpemVzJDogT2JzZXJ2YWJsZTwobnVtYmVyIHwgeyBzaG93QWxsOiBzdHJpbmcgfSlbXT5cbiAgX3BhZ2VTaXplcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PChudW1iZXIgfCB7IHNob3dBbGw6IHN0cmluZyB9KVtdPihbMTAsIDI1LCA1MF0pXG4gIEBJbnB1dCgpXG4gIGdldCBwYWdlU2l6ZXMoKTogKG51bWJlciB8IHsgc2hvd0FsbDogc3RyaW5nIH0pW10ge1xuICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZXMkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgcGFnZVNpemVzKHZhbHVlOiAobnVtYmVyIHwgeyBzaG93QWxsOiBzdHJpbmcgfSlbXSkge1xuICAgIHRoaXMuX3BhZ2VTaXplcyQubmV4dCh2YWx1ZSlcbiAgfVxuXG4gIGRpc3BsYXllZFBhZ2VTaXplJDogT2JzZXJ2YWJsZTxudW1iZXI+XG4gIF9wYWdlU2l6ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuICBASW5wdXQoKVxuICBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZVNpemUkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgcGFnZVNpemUodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BhZ2VTaXplJC5uZXh0KHZhbHVlKVxuICB9XG4gIF9zaG93QWxsT3B0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpXG4gIEBJbnB1dCgpXG4gIHNldCBzaG93QWxsT3B0aW9uKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2hvd0FsbE9wdGlvbiQubmV4dCh2YWx1ZSlcbiAgfVxuXG4gIEBJbnB1dCgpIGVtcHR5UmVzdWx0c01lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBmYWxsYmFja0ltYWdlID0gJ3BsYWNlaG9sZGVyLnBuZydcbiAgQElucHV0KCkgbGF5b3V0OiAnZ3JpZCcgfCAnbGlzdCcgPSAnZ3JpZCdcbiAgX3ZpZXdQZXJtaXNzaW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiAgQElucHV0KClcbiAgZ2V0IHZpZXdQZXJtaXNzaW9uKCk6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdmlld1Blcm1pc3Npb24kLmdldFZhbHVlKClcbiAgfVxuICBzZXQgdmlld1Blcm1pc3Npb24odmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdmlld1Blcm1pc3Npb24kLm5leHQodmFsdWUpXG4gIH1cbiAgQElucHV0KCkgZWRpdFBlcm1pc3Npb246IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGRlbGV0ZVBlcm1pc3Npb246IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGRlbGV0ZUFjdGlvblZpc2libGVGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGRlbGV0ZUFjdGlvbkVuYWJsZWRGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHZpZXdBY3Rpb25WaXNpYmxlRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSB2aWV3QWN0aW9uRW5hYmxlZEZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZWRpdEFjdGlvblZpc2libGVGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGVkaXRBY3Rpb25FbmFibGVkRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSB2aWV3TWVudUl0ZW1LZXk6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBlZGl0TWVudUl0ZW1LZXk6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBkZWxldGVNZW51SXRlbUtleTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHBhZ2luYXRvciA9IHRydWVcbiAgQElucHV0KCkgcGFnZSA9IDBcbiAgY29sdW1uVGVtcGxhdGVzJDogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4+IHwgdW5kZWZpbmVkXG4gIF9jb2x1bW5zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0YVRhYmxlQ29sdW1uW10+KFtdKVxuICBASW5wdXQoKVxuICBnZXQgY29sdW1ucygpOiBEYXRhVGFibGVDb2x1bW5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgY29sdW1ucyh2YWx1ZTogRGF0YVRhYmxlQ29sdW1uW10pIHtcbiAgICB0aGlzLl9jb2x1bW5zJC5uZXh0KHZhbHVlKVxuICAgIGNvbnN0IG9icyA9IHZhbHVlLm1hcCgoYykgPT4gdGhpcy5nZXRUZW1wbGF0ZShjKSlcbiAgICB0aGlzLmNvbHVtblRlbXBsYXRlcyQgPSBjb21iaW5lTGF0ZXN0KG9icykucGlwZShcbiAgICAgIG1hcCgodmFsdWVzKSA9PiBPYmplY3QuZnJvbUVudHJpZXModmFsdWUubWFwKChjLCBpKSA9PiBbYy5pZCwgdmFsdWVzW2ldXSkpKSxcbiAgICAgIGRlYm91bmNlVGltZSg1MClcbiAgICApXG4gIH1cbiAgQElucHV0KCkgbmFtZSA9ICcnXG4gIEBJbnB1dCgpXG4gIGdldCB0b3RhbFJlY29yZHNPblNlcnZlcigpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmFtc1sndG90YWxSZWNvcmRzT25TZXJ2ZXInXSA/IE51bWJlcih0aGlzLnBhcmFtc1sndG90YWxSZWNvcmRzT25TZXJ2ZXInXSkgOiB1bmRlZmluZWRcbiAgfVxuICBzZXQgdG90YWxSZWNvcmRzT25TZXJ2ZXIodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMucGFyYW1zWyd0b3RhbFJlY29yZHNPblNlcnZlciddID0gdmFsdWU/LnRvU3RyaW5nKCkgPz8gJzAnXG4gIH1cbiAgQElucHV0KCkgY3VycmVudFBhZ2VTaG93aW5nS2V5ID0gJ09DWF9EQVRBX1RBQkxFLlNIT1dJTkcnXG4gIEBJbnB1dCgpIGN1cnJlbnRQYWdlU2hvd2luZ1dpdGhUb3RhbE9uU2VydmVyS2V5ID0gJ09DWF9EQVRBX1RBQkxFLlNIT1dJTkdfV0lUSF9UT1RBTF9PTl9TRVJWRVInXG4gIHBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICBjdXJyZW50UGFnZTogJ3tjdXJyZW50UGFnZX0nLFxuICAgIHRvdGFsUGFnZXM6ICd7dG90YWxQYWdlc30nLFxuICAgIHJvd3M6ICd7cm93c30nLFxuICAgIGZpcnN0OiAne2ZpcnN0fScsXG4gICAgbGFzdDogJ3tsYXN0fScsXG4gICAgdG90YWxSZWNvcmRzOiAne3RvdGFsUmVjb3Jkc30nLFxuICB9XG5cblxuICBfZGF0YSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJvd0xpc3RHcmlkRGF0YVtdPihbXSlcbiAgQElucHV0KClcbiAgZ2V0IGRhdGEoKTogUm93TGlzdEdyaWREYXRhW10ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IGRhdGEodmFsdWU6IFJvd0xpc3RHcmlkRGF0YVtdKSB7XG4gICAgIXRoaXMuX2RhdGEkLmdldFZhbHVlKCkubGVuZ3RoID8/IHRoaXMucmVzZXRQYWdlKClcbiAgICB0aGlzLl9vcmlnaW5hbERhdGEgPSBbLi4udmFsdWVdXG4gICAgdGhpcy5fZGF0YSQubmV4dChbLi4udmFsdWVdKVxuXG4gICAgY29uc3QgY3VycmVudFJlc3VsdHMgPSB2YWx1ZS5sZW5ndGg7XG4gICAgY29uc3QgbmV3U3RhdHVzID0gY3VycmVudFJlc3VsdHMgPT09IDBcbiAgICAgID8gJ09DWF9EQVRBX0xJU1RfR1JJRC5OT19TRUFSQ0hfUkVTVUxUU19GT1VORCdcbiAgICAgIDogJ09DWF9EQVRBX0xJU1RfR1JJRC5TRUFSQ0hfUkVTVUxUU19GT1VORCc7XG5cbiAgICBmaXJzdFZhbHVlRnJvbShcbiAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQobmV3U3RhdHVzLCB7IHJlc3VsdHM6IGN1cnJlbnRSZXN1bHRzIH0pICkudGhlbigodHJhbnNsYXRlZFRleHQ6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmxpdmVBbm5vdW5jZXIuYW5ub3VuY2UodHJhbnNsYXRlZFRleHQpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBfZmlsdGVycyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZpbHRlcltdPihbXSlcbiAgQElucHV0KClcbiAgZ2V0IGZpbHRlcnMoKTogRmlsdGVyW10ge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJzJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IGZpbHRlcnModmFsdWU6IEZpbHRlcltdKSB7XG4gICAgIXRoaXMuX2ZpbHRlcnMkLmdldFZhbHVlKCkubGVuZ3RoID8/IHRoaXMucmVzZXRQYWdlKClcbiAgICB0aGlzLl9maWx0ZXJzJC5uZXh0KHZhbHVlKVxuICB9XG4gIF9vcmlnaW5hbERhdGE6IFJvd0xpc3RHcmlkRGF0YVtdID0gW11cbiAgX3NvcnREaXJlY3Rpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhU29ydERpcmVjdGlvbj4oRGF0YVNvcnREaXJlY3Rpb24uTk9ORSlcbiAgQElucHV0KClcbiAgZ2V0IHNvcnREaXJlY3Rpb24oKTogRGF0YVNvcnREaXJlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9zb3J0RGlyZWN0aW9uJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHNvcnREaXJlY3Rpb24odmFsdWU6IERhdGFTb3J0RGlyZWN0aW9uKSB7XG4gICAgaWYgKHZhbHVlID09PSBEYXRhU29ydERpcmVjdGlvbi5OT05FKSB7XG4gICAgICB0aGlzLl9kYXRhJC5uZXh0KFsuLi50aGlzLl9vcmlnaW5hbERhdGFdKVxuICAgIH1cbiAgICB0aGlzLl9zb3J0RGlyZWN0aW9uJC5uZXh0KHZhbHVlKVxuICB9XG4gIF9zb3J0RmllbGQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKVxuICBASW5wdXQoKVxuICBnZXQgc29ydEZpZWxkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXM/Ll9zb3J0RmllbGQkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgc29ydEZpZWxkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zb3J0RmllbGQkLm5leHQodmFsdWUpXG4gIH1cblxuICBASW5wdXQoKSBncmlkSXRlbVN1YnRpdGxlTGluZXNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdncmlkSXRlbVN1YnRpdGxlTGluZXMnKSBncmlkSXRlbVN1YnRpdGxlTGluZXNDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfZ3JpZEl0ZW1TdWJ0aXRsZUxpbmVzKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdyaWRJdGVtU3VidGl0bGVMaW5lc1RlbXBsYXRlIHx8IHRoaXMuZ3JpZEl0ZW1TdWJ0aXRsZUxpbmVzQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgbGlzdEl0ZW1TdWJ0aXRsZUxpbmVzVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnbGlzdEl0ZW1TdWJ0aXRsZUxpbmVzJykgbGlzdEl0ZW1TdWJ0aXRsZUxpbmVzQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2xpc3RJdGVtU3VidGl0bGVMaW5lcygpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5saXN0SXRlbVN1YnRpdGxlTGluZXNUZW1wbGF0ZSB8fCB0aGlzLmxpc3RJdGVtU3VidGl0bGVMaW5lc0NoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIEBJbnB1dCgpIGxpc3RJdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnbGlzdEl0ZW0nKSBsaXN0SXRlbUNoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9saXN0SXRlbSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5saXN0SXRlbVRlbXBsYXRlIHx8IHRoaXMubGlzdEl0ZW1DaGlsZFRlbXBsYXRlXG4gIH1cblxuICBASW5wdXQoKSBncmlkSXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ2dyaWRJdGVtJykgZ3JpZEl0ZW1DaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfZ3JpZEl0ZW0oKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZEl0ZW1UZW1wbGF0ZSB8fCB0aGlzLmdyaWRJdGVtQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgbGlzdFZhbHVlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnbGlzdFZhbHVlJykgbGlzdFZhbHVlQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2xpc3RWYWx1ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5saXN0VmFsdWVUZW1wbGF0ZSB8fCB0aGlzLmxpc3RWYWx1ZUNoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uS2V5TGlzdFZhbHVlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgndHJhbnNsYXRpb25LZXlMaXN0VmFsdWUnKSB0cmFuc2xhdGlvbktleUxpc3RWYWx1ZUNoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF90cmFuc2xhdGlvbktleUxpc3RWYWx1ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvbktleUxpc3RWYWx1ZVRlbXBsYXRlIHx8IHRoaXMudHJhbnNsYXRpb25LZXlMaXN0VmFsdWVDaGlsZFRlbXBsYXRlXG4gIH1cblxuICBASW5wdXQoKSBudW1iZXJMaXN0VmFsdWVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdudW1iZXJMaXN0VmFsdWUnKSBudW1iZXJMaXN0VmFsdWVDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfbnVtYmVyTGlzdFZhbHVlKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm51bWJlckxpc3RWYWx1ZVRlbXBsYXRlIHx8IHRoaXMubnVtYmVyTGlzdFZhbHVlQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgcmVsYXRpdmVEYXRlTGlzdFZhbHVlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgncmVsYXRpdmVEYXRlTGlzdFZhbHVlJykgcmVsYXRpdmVEYXRlTGlzdFZhbHVlQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3JlbGF0aXZlRGF0ZUxpc3RWYWx1ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWxhdGl2ZURhdGVMaXN0VmFsdWVUZW1wbGF0ZSB8fCB0aGlzLnJlbGF0aXZlRGF0ZUxpc3RWYWx1ZUNoaWxkVGVtcGxhdGVcbiAgfVxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGFuZCBpbnN0ZWFkIHRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgb2YgYSBzcGVjaWZpYyBjb2x1bW5cbiAgICogdXNlIHRoZSBuZXcgYXBwcm9hY2ggaW5zdGVhZCBieSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uIGNvbHVtbiBpZCArIElkTGlzdFZhbHVlXG4gICAqIGUuZy4gZm9yIGEgY29sdW1uIHdpdGggdGhlIGlkICdzdGF0dXMnIHVzZSBwVGVtcGxhdGU9XCJzdGF0dXNJZExpc3RWYWx1ZVwiXG4gICAqL1xuICBASW5wdXQoKSBjdXN0b21MaXN0VmFsdWVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGFuZCBpbnN0ZWFkIHRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgb2YgYSBzcGVjaWZpYyBjb2x1bW5cbiAgICogdXNlIHRoZSBuZXcgYXBwcm9hY2ggaW5zdGVhZCBieSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uIGNvbHVtbiBpZCArIElkTGlzdFZhbHVlXG4gICAqIGUuZy4gZm9yIGEgY29sdW1uIHdpdGggdGhlIGlkICdzdGF0dXMnIHVzZSBwVGVtcGxhdGU9XCJzdGF0dXNJZExpc3RWYWx1ZVwiXG4gICAqL1xuICBAQ29udGVudENoaWxkKCdjdXN0b21MaXN0VmFsdWUnKSBjdXN0b21MaXN0VmFsdWVDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfY3VzdG9tTGlzdFZhbHVlKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmN1c3RvbUxpc3RWYWx1ZVRlbXBsYXRlIHx8IHRoaXMuY3VzdG9tTGlzdFZhbHVlQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgc3RyaW5nTGlzdFZhbHVlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnc3RyaW5nTGlzdFZhbHVlJykgc3RyaW5nTGlzdFZhbHVlQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3N0cmluZ0xpc3RWYWx1ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zdHJpbmdMaXN0VmFsdWVUZW1wbGF0ZSB8fCB0aGlzLnN0cmluZ0xpc3RWYWx1ZUNoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIEBJbnB1dCgpIGRhdGVMaXN0VmFsdWVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdkYXRlTGlzdFZhbHVlJykgZGF0ZUxpc3RWYWx1ZUNoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9kYXRlTGlzdFZhbHVlKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmRhdGVMaXN0VmFsdWVUZW1wbGF0ZSB8fCB0aGlzLmRhdGVMaXN0VmFsdWVDaGlsZFRlbXBsYXRlXG4gIH1cblxuICBpbmxpbmVMaXN0QWN0aW9ucyQ6IE9ic2VydmFibGU8RGF0YUFjdGlvbltdPlxuICBvdmVyZmxvd0xpc3RBY3Rpb25zJDogT2JzZXJ2YWJsZTxEYXRhQWN0aW9uW10+XG4gIG92ZXJmbG93TGlzdE1lbnVJdGVtcyQ6IE9ic2VydmFibGU8TWVudUl0ZW1bXT5cbiAgY3VycmVudE1lbnVSb3ckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSb3cgfCBudWxsPihudWxsKVxuICBfYWRkaXRpb25hbEFjdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhQWN0aW9uW10+KFtdKVxuICBASW5wdXQoKVxuICBnZXQgYWRkaXRpb25hbEFjdGlvbnMoKTogRGF0YUFjdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkaXRpb25hbEFjdGlvbnMkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgYWRkaXRpb25hbEFjdGlvbnModmFsdWU6IERhdGFBY3Rpb25bXSkge1xuICAgIHRoaXMuX2FkZGl0aW9uYWxBY3Rpb25zJC5uZXh0KHZhbHVlKVxuICB9XG5cbiAgQE91dHB1dCgpIHZpZXdJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxMaXN0R3JpZERhdGE+KClcbiAgQE91dHB1dCgpIGVkaXRJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxMaXN0R3JpZERhdGE+KClcbiAgQE91dHB1dCgpIGRlbGV0ZUl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPExpc3RHcmlkRGF0YT4oKVxuICBAT3V0cHV0KCkgcGFnZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKVxuICBAT3V0cHV0KCkgcGFnZVNpemVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KClcbiAgQE91dHB1dCgpIGNvbXBvbmVudFN0YXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YUxpc3RHcmlkQ29tcG9uZW50U3RhdGU+KClcblxuICBnZXQgdmlld0l0ZW1PYnNlcnZlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBkdiA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdEYXRhVmlld0NvbXBvbmVudCcsIG51bGwpXG4gICAgcmV0dXJuIGR2Py52aWV3SXRlbU9ic2VydmVkIHx8IGR2Py52aWV3SXRlbS5vYnNlcnZlZCB8fCB0aGlzLnZpZXdJdGVtLm9ic2VydmVkXG4gIH1cbiAgZ2V0IGVkaXRJdGVtT2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHYgPSB0aGlzLmluamVjdG9yLmdldCgnRGF0YVZpZXdDb21wb25lbnQnLCBudWxsKVxuICAgIHJldHVybiBkdj8uZWRpdEl0ZW1PYnNlcnZlZCB8fCBkdj8uZWRpdEl0ZW0ub2JzZXJ2ZWQgfHwgdGhpcy5lZGl0SXRlbS5vYnNlcnZlZFxuICB9XG4gIGdldCBkZWxldGVJdGVtT2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHYgPSB0aGlzLmluamVjdG9yLmdldCgnRGF0YVZpZXdDb21wb25lbnQnLCBudWxsKVxuICAgIHJldHVybiBkdj8uZGVsZXRlSXRlbU9ic2VydmVkIHx8IGR2Py5kZWxldGVJdGVtLm9ic2VydmVkIHx8IHRoaXMuZGVsZXRlSXRlbS5vYnNlcnZlZFxuICB9XG5cbiAgZ2V0IHNvcnREaXJlY3Rpb25OdW1iZXIoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5zb3J0RGlyZWN0aW9uID09PSBEYXRhU29ydERpcmVjdGlvbi5BU0NFTkRJTkcpIHJldHVybiAxXG4gICAgaWYgKHRoaXMuc29ydERpcmVjdGlvbiA9PT0gRGF0YVNvcnREaXJlY3Rpb24uREVTQ0VORElORykgcmV0dXJuIC0xXG4gICAgcmV0dXJuIDBcbiAgfVxuXG4gIGdyaWRNZW51SXRlbXMkOiBPYnNlcnZhYmxlPE1lbnVJdGVtW10+XG4gIF9zZWxlY3RlZEl0ZW0kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMaXN0R3JpZERhdGEgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiAgb2JzZXJ2ZWRPdXRwdXRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKVxuXG4gIGRpc3BsYXllZEl0ZW1zJDogT2JzZXJ2YWJsZTx1bmtub3duW10+IHwgdW5kZWZpbmVkXG4gIGZhbGxiYWNrSW1hZ2VQYXRoJCE6IE9ic2VydmFibGU8c3RyaW5nPlxuXG4gIHRlbXBsYXRlcyQ6IEJlaGF2aW9yU3ViamVjdDxRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpXG4gIEBDb250ZW50Q2hpbGRyZW4oUHJpbWVUZW1wbGF0ZSlcbiAgc2V0IHRlbXBsYXRlcyh2YWx1ZTogUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy50ZW1wbGF0ZXMkLm5leHQodmFsdWUpXG4gIH1cblxuICB2aWV3VGVtcGxhdGVzJDogQmVoYXZpb3JTdWJqZWN0PFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZClcbiAgQFZpZXdDaGlsZHJlbihQcmltZVRlbXBsYXRlKVxuICBzZXQgdmlld1RlbXBsYXRlcyh2YWx1ZTogUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy52aWV3VGVtcGxhdGVzJC5uZXh0KHZhbHVlKVxuICB9XG5cbiAgcGFyZW50VGVtcGxhdGVzJDogQmVoYXZpb3JTdWJqZWN0PFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IG51bGwgfCB1bmRlZmluZWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCBudWxsIHwgdW5kZWZpbmVkXG4gID4odW5kZWZpbmVkKVxuICBASW5wdXQoKVxuICBzZXQgcGFyZW50VGVtcGxhdGVzKHZhbHVlOiBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5wYXJlbnRUZW1wbGF0ZXMkLm5leHQodmFsdWUpXG4gIH1cblxuICBjb2x1bW5UeXBlID0gQ29sdW1uVHlwZVxuICB0ZW1wbGF0ZXNPYnNlcnZhYmxlczogUmVjb3JkPHN0cmluZywgT2JzZXJ2YWJsZTxUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4+ID0ge31cbiAgaGFzVmlld1Blcm1pc3Npb24kOiBPYnNlcnZhYmxlPGJvb2xlYW4+XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChMT0NBTEVfSUQpIGxvY2FsZTogc3RyaW5nLFxuICAgIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIGFwcFN0YXRlU2VydmljZTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbGl2ZUFubm91bmNlcjogTGl2ZUFubm91bmNlcixcbiAgICBASW5qZWN0KEhBU19QRVJNSVNTSU9OX0NIRUNLRVIpIEBPcHRpb25hbCgpIHByaXZhdGUgaGFzUGVybWlzc2lvbkNoZWNrZXI/OiBIYXNQZXJtaXNzaW9uQ2hlY2tlclxuICApIHtcbiAgICBzdXBlcihsb2NhbGUsIHRyYW5zbGF0ZVNlcnZpY2UpXG4gICAgdGhpcy5uYW1lID0gdGhpcy5uYW1lIHx8IHRoaXMucm91dGVyLnVybC5yZXBsYWNlKC9bXkEtWmEtejAtOV0vLCAnXycpXG4gICAgdGhpcy5mYWxsYmFja0ltYWdlUGF0aCQgPSB0aGlzLmFwcFN0YXRlU2VydmljZS5jdXJyZW50TWZlJC5waXBlKFxuICAgICAgbWFwKChjdXJyZW50TWZlKSA9PiB0aGlzLmdldEZhbGxiYWNrSW1hZ2VQYXRoKGN1cnJlbnRNZmUpKVxuICAgIClcbiAgICB0aGlzLmRpc3BsYXllZFBhZ2VTaXplcyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuX3BhZ2VTaXplcyQsXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdPQ1hfREFUQV9UQUJMRS5BTEwnKSxcbiAgICAgIHRoaXMuX3Nob3dBbGxPcHRpb24kLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtwYWdlU2l6ZXMsIHRyYW5zbGF0aW9uLCBzaG93QWxsT3B0aW9uXSkgPT5cbiAgICAgICAgc2hvd0FsbE9wdGlvbiA/IHBhZ2VTaXplcy5jb25jYXQoeyBzaG93QWxsOiB0cmFuc2xhdGlvbiB9KSA6IHBhZ2VTaXplc1xuICAgICAgKVxuICAgIClcbiAgICB0aGlzLmRpc3BsYXllZFBhZ2VTaXplJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX3BhZ2VTaXplJCwgdGhpcy5fcGFnZVNpemVzJF0pLnBpcGUoXG4gICAgICBtYXAoKFtwYWdlU2l6ZSwgcGFnZVNpemVzXSkgPT4gcGFnZVNpemUgPz8gcGFnZVNpemVzLmZpbmQoKHZhbCk6IHZhbCBpcyBudW1iZXIgPT4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpID8/IDUwKVxuICAgIClcbiAgICB0aGlzLmlubGluZUxpc3RBY3Rpb25zJCA9IHRoaXMuX2FkZGl0aW9uYWxBY3Rpb25zJC5waXBlKFxuICAgICAgbWFwKChhY3Rpb25zKSA9PiBhY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiAhYWN0aW9uLnNob3dBc092ZXJmbG93KSlcbiAgICApXG4gICAgdGhpcy5vdmVyZmxvd0xpc3RBY3Rpb25zJCA9IHRoaXMuX2FkZGl0aW9uYWxBY3Rpb25zJC5waXBlKFxuICAgICAgbWFwKChhY3Rpb25zKSA9PiBhY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24uc2hvd0FzT3ZlcmZsb3cpKVxuICAgIClcbiAgICB0aGlzLm92ZXJmbG93TGlzdE1lbnVJdGVtcyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLm92ZXJmbG93TGlzdEFjdGlvbnMkLCB0aGlzLmN1cnJlbnRNZW51Um93JF0pLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKFthY3Rpb25zLCByb3ddKSA9PlxuICAgICAgICB0aGlzLmZpbHRlckFjdGlvbnNCYXNlZE9uUGVybWlzc2lvbnMoYWN0aW9ucykucGlwZShcbiAgICAgICAgICBtYXAoKHBlcm1pdHRlZEFjdGlvbnMpID0+ICh7IGFjdGlvbnM6IHBlcm1pdHRlZEFjdGlvbnMsIHJvdzogcm93IH0pKVxuICAgICAgICApXG4gICAgICApLFxuICAgICAgbWVyZ2VNYXAoKHsgYWN0aW9ucywgcm93IH0pID0+IHtcbiAgICAgICAgaWYgKGFjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKFtdKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KFsuLi5hY3Rpb25zLm1hcCgoYSkgPT4gYS5sYWJlbEtleSB8fCAnJyldKS5waXBlKFxuICAgICAgICAgIG1hcCgodHJhbnNsYXRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9ucy5tYXAoKGEpID0+ICh7XG4gICAgICAgICAgICAgIGxhYmVsOiB0cmFuc2xhdGlvbnNbYS5sYWJlbEtleSB8fCAnJ10sXG4gICAgICAgICAgICAgIGljb246IGEuaWNvbixcbiAgICAgICAgICAgICAgc3R5bGVDbGFzczogKGEuY2xhc3NlcyB8fCBbXSkuam9pbignICcpLFxuICAgICAgICAgICAgICBkaXNhYmxlZDogYS5kaXNhYmxlZCB8fCAoISFhLmFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhdGhpcy5maWVsZElzVHJ1dGh5KHJvdywgYS5hY3Rpb25FbmFibGVkRmllbGQpKSxcbiAgICAgICAgICAgICAgdmlzaWJsZTogIWEuYWN0aW9uVmlzaWJsZUZpZWxkIHx8IHRoaXMuZmllbGRJc1RydXRoeShyb3csIGEuYWN0aW9uVmlzaWJsZUZpZWxkKSxcbiAgICAgICAgICAgICAgY29tbWFuZDogKCkgPT4gYS5jYWxsYmFjayhyb3cpLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICApXG4gICAgdGhpcy5oYXNWaWV3UGVybWlzc2lvbiQgPSB0aGlzLl92aWV3UGVybWlzc2lvbiQucGlwZShcbiAgICAgIG1hcCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgICBpZiAoIXBlcm1pc3Npb24pIHJldHVybiBbXVxuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwZXJtaXNzaW9uKSA/IHBlcm1pc3Npb24gOiBbcGVybWlzc2lvbl1cbiAgICAgIH0pLFxuICAgICAgc3dpdGNoTWFwKChwZXJtaXNzaW9uQXJyYXkpID0+IHtcbiAgICAgICAgaWYgKHBlcm1pc3Npb25BcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gb2YodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRQZXJtaXNzaW9ucygpLnBpcGUobWFwKChwZXJtaXNzaW9ucykgPT4gcGVybWlzc2lvbkFycmF5LmV2ZXJ5KChwKSA9PiBwZXJtaXNzaW9ucy5pbmNsdWRlcyhwKSkpKVxuICAgICAgfSlcbiAgICApXG5cbiAgICB0aGlzLmdyaWRNZW51SXRlbXMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmdldFBlcm1pc3Npb25zKCksXG4gICAgICB0aGlzLl9hZGRpdGlvbmFsQWN0aW9ucyQuYXNPYnNlcnZhYmxlKCksXG4gICAgICB0aGlzLl9zZWxlY3RlZEl0ZW0kLmFzT2JzZXJ2YWJsZSgpLFxuICAgICAgdGhpcy5vYnNlcnZlZE91dHB1dHMkLmFzT2JzZXJ2YWJsZSgpLFxuICAgIF0pLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKFtwZXJtaXNzaW9ucywgYWRkaXRpb25hbEFjdGlvbnMsIHNlbGVjdGVkSXRlbSwgX29ic2VydmVkT3V0cHV0c10pID0+XG4gICAgICAgIHRoaXMuZmlsdGVyQWN0aW9uc0Jhc2VkT25QZXJtaXNzaW9ucyhhZGRpdGlvbmFsQWN0aW9ucywgcGVybWlzc2lvbnMpLnBpcGUoXG4gICAgICAgICAgbWFwKChwZXJtaXR0ZWRBY3Rpb25zKSA9PiAoeyBwZXJtaXNzaW9ucywgYWRkaXRpb25hbEFjdGlvbnM6IHBlcm1pdHRlZEFjdGlvbnMsIHNlbGVjdGVkSXRlbSB9KSlcbiAgICAgICAgKVxuICAgICAgKSxcbiAgICAgIHN3aXRjaE1hcCgoeyBwZXJtaXNzaW9ucywgYWRkaXRpb25hbEFjdGlvbnMsIHNlbGVjdGVkSXRlbSB9KSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEdyaWRBY3Rpb25zVHJhbnNsYXRpb25zKGFkZGl0aW9uYWxBY3Rpb25zLCBwZXJtaXNzaW9ucykucGlwZShcbiAgICAgICAgICBtYXAoKHRyYW5zbGF0aW9ucykgPT4gKHsgcGVybWlzc2lvbnMsIGFkZGl0aW9uYWxBY3Rpb25zLCBzZWxlY3RlZEl0ZW0sIHRyYW5zbGF0aW9ucyB9KSlcbiAgICAgICAgKVxuICAgICAgfSksXG4gICAgICBtYXAoKHsgcGVybWlzc2lvbnMsIGFkZGl0aW9uYWxBY3Rpb25zLCBzZWxlY3RlZEl0ZW0sIHRyYW5zbGF0aW9ucyB9KSA9PlxuICAgICAgICB0aGlzLm1hcEdyaWRNZW51SXRlbXMocGVybWlzc2lvbnMsIGFkZGl0aW9uYWxBY3Rpb25zLCBzZWxlY3RlZEl0ZW0sIHRyYW5zbGF0aW9ucylcbiAgICAgIClcbiAgICApXG4gIH1cblxuICBuZ0RvQ2hlY2soKTogdm9pZCB7XG4gICAgY29uc3Qgb2JzZXJ2ZWRPdXRwdXRzID0gPGFueT50aGlzLnZpZXdJdGVtLm9ic2VydmVkICsgPGFueT50aGlzLmRlbGV0ZUl0ZW0ub2JzZXJ2ZWQgKyA8YW55PnRoaXMuZWRpdEl0ZW0ub2JzZXJ2ZWRcbiAgICBpZiAodGhpcy5vYnNlcnZlZE91dHB1dHMkLmdldFZhbHVlKCkgIT09IG9ic2VydmVkT3V0cHV0cykge1xuICAgICAgdGhpcy5vYnNlcnZlZE91dHB1dHMkLm5leHQob2JzZXJ2ZWRPdXRwdXRzKVxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheWVkSXRlbXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5fZGF0YSQsIHRoaXMuX2ZpbHRlcnMkLCB0aGlzLl9zb3J0RmllbGQkLCB0aGlzLl9zb3J0RGlyZWN0aW9uJF0pLnBpcGUoXG4gICAgICBtZXJnZU1hcCgocGFyYW1zKSA9PiB0aGlzLnRyYW5zbGF0ZUl0ZW1zKHBhcmFtcywgdGhpcy5jb2x1bW5zLCB0aGlzLmNsaWVudFNpZGVGaWx0ZXJpbmcsIHRoaXMuY2xpZW50U2lkZVNvcnRpbmcpKSxcbiAgICAgIG1hcCgocGFyYW1zKSA9PiB0aGlzLmZpbHRlckl0ZW1zKHBhcmFtcywgdGhpcy5jbGllbnRTaWRlRmlsdGVyaW5nKSksXG4gICAgICBtYXAoKHBhcmFtcykgPT4gdGhpcy5zb3J0SXRlbXMocGFyYW1zLCB0aGlzLmNvbHVtbnMsIHRoaXMuY2xpZW50U2lkZVNvcnRpbmcpKSxcbiAgICAgIG1hcCgoW2l0ZW1zXSkgPT4gaXRlbXMpXG4gICAgKVxuXG4gICAgdGhpcy5lbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKClcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLnRlbXBsYXRlcyQudmFsdWU/LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHN3aXRjaCAoaXRlbS5nZXRUeXBlKCkpIHtcbiAgICAgICAgY2FzZSAnbGlzdFZhbHVlJzpcbiAgICAgICAgICB0aGlzLmxpc3RWYWx1ZUNoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAndHJhbnNsYXRpb25LZXlMaXN0VmFsdWUnOlxuICAgICAgICAgIHRoaXMudHJhbnNsYXRpb25LZXlMaXN0VmFsdWVDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ251bWJlckxpc3RWYWx1ZSc6XG4gICAgICAgICAgdGhpcy5udW1iZXJMaXN0VmFsdWVDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3JlbGF0aXZlRGF0ZUxpc3RWYWx1ZSc6XG4gICAgICAgICAgdGhpcy5yZWxhdGl2ZURhdGVMaXN0VmFsdWVDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2N1c3RvbUxpc3RWYWx1ZSc6XG4gICAgICAgICAgdGhpcy5jdXN0b21MaXN0VmFsdWVDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3N0cmluZ0xpc3RWYWx1ZSc6XG4gICAgICAgICAgdGhpcy5zdHJpbmdMaXN0VmFsdWVDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2RhdGVMaXN0VmFsdWUnOlxuICAgICAgICAgIHRoaXMuZGF0ZUxpc3RWYWx1ZUNoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25EZWxldGVSb3coZWxlbWVudDogTGlzdEdyaWREYXRhKSB7XG4gICAgdGhpcy5kZWxldGVJdGVtLmVtaXQoZWxlbWVudClcbiAgfVxuXG4gIG9uVmlld1JvdyhlbGVtZW50OiBMaXN0R3JpZERhdGEpIHtcbiAgICB0aGlzLnZpZXdJdGVtLmVtaXQoZWxlbWVudClcbiAgfVxuXG4gIG9uRWRpdFJvdyhlbGVtZW50OiBMaXN0R3JpZERhdGEpIHtcbiAgICB0aGlzLmVkaXRJdGVtLmVtaXQoZWxlbWVudClcbiAgfVxuXG4gIGltZ0Vycm9yKGl0ZW06IExpc3RHcmlkRGF0YSkge1xuICAgIGl0ZW0uaW1hZ2VQYXRoID0gJydcbiAgfVxuXG4gIGdldEZhbGxiYWNrSW1hZ2VQYXRoKG1mZUluZm86IE1mZUluZm8pIHtcbiAgICByZXR1cm4gbWZlSW5mbz8ucmVtb3RlQmFzZVVybFxuICAgICAgPyBgJHttZmVJbmZvLnJlbW90ZUJhc2VVcmx9L29uZWN4LXBvcnRhbC1saWIvYXNzZXRzL2ltYWdlcy8ke3RoaXMuZmFsbGJhY2tJbWFnZX1gXG4gICAgICA6IGAuL29uZWN4LXBvcnRhbC1saWIvYXNzZXRzL2ltYWdlcy8ke3RoaXMuZmFsbGJhY2tJbWFnZX1gXG4gIH1cblxuICBzZXRTZWxlY3RlZEl0ZW0oaXRlbTogTGlzdEdyaWREYXRhKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWRJdGVtJC5uZXh0KGl0ZW0pXG4gIH1cblxuICByZXNvbHZlRmllbGREYXRhKG9iamVjdDogYW55LCBrZXk6IGFueSkge1xuICAgIHJldHVybiBPYmplY3RVdGlscy5yZXNvbHZlRmllbGREYXRhKG9iamVjdCwga2V5KVxuICB9XG5cbiAgZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZChzdGF0ZTogRGF0YUxpc3RHcmlkQ29tcG9uZW50U3RhdGUgPSB7fSkge1xuICAgIHRoaXMuZGlzcGxheWVkUGFnZVNpemUkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChwYWdlU2l6ZSkgPT4ge1xuICAgICAgdGhpcy5jb21wb25lbnRTdGF0ZUNoYW5nZWQuZW1pdCh7XG4gICAgICAgIHBhZ2VTaXplLFxuICAgICAgICBhY3RpdmVQYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgb25QYWdlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBwYWdlID0gZXZlbnQuZmlyc3QgLyBldmVudC5yb3dzXG4gICAgdGhpcy5wYWdlID0gcGFnZVxuICAgIHRoaXMucGFnZVNpemUgPSBldmVudC5yb3dzXG4gICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KHBhZ2UpXG4gICAgdGhpcy5wYWdlU2l6ZUNoYW5nZWQuZW1pdChldmVudC5yb3dzKVxuICAgIHRoaXMuZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZCh7XG4gICAgICBhY3RpdmVQYWdlOiBwYWdlLFxuICAgICAgcGFnZVNpemU6IGV2ZW50LnJvd3MsXG4gICAgfSlcbiAgfVxuXG4gIHJlc2V0UGFnZSgpIHtcbiAgICB0aGlzLnBhZ2UgPSAwXG4gICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KHRoaXMucGFnZSlcbiAgICB0aGlzLmVtaXRDb21wb25lbnRTdGF0ZUNoYW5nZWQoKVxuICB9XG5cbiAgZmllbGRJc1RydXRoeShvYmplY3Q6IGFueSwga2V5OiBhbnkpIHtcbiAgICByZXR1cm4gISF0aGlzLnJlc29sdmVGaWVsZERhdGEob2JqZWN0LCBrZXkpXG4gIH1cblxuICBoYXNWaXNpYmxlT3ZlcmZsb3dNZW51SXRlbXMocm93OiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5vdmVyZmxvd0xpc3RBY3Rpb25zJC5waXBlKFxuICAgICAgc3dpdGNoTWFwKChhY3Rpb25zKSA9PiB0aGlzLmZpbHRlckFjdGlvbnNCYXNlZE9uUGVybWlzc2lvbnMoYWN0aW9ucykpLFxuICAgICAgbWFwKChhY3Rpb25zKSA9PiBhY3Rpb25zLnNvbWUoKGEpID0+ICFhLmFjdGlvblZpc2libGVGaWVsZCB8fCB0aGlzLmZpZWxkSXNUcnV0aHkocm93LCBhLmFjdGlvblZpc2libGVGaWVsZCkpKVxuICAgIClcbiAgfVxuXG4gIHRvZ2dsZU92ZXJmbG93TWVudShldmVudDogTW91c2VFdmVudCwgbWVudTogTWVudSwgcm93OiBSb3cpIHtcbiAgICB0aGlzLmN1cnJlbnRNZW51Um93JC5uZXh0KHJvdylcbiAgICBtZW51LnRvZ2dsZShldmVudClcbiAgfVxuXG4gIGdldEZpbHRlcmVkQ29sdW1ucygpIHtcbiAgICBsZXQgaWRzOiBzdHJpbmdbXSA9IFsuLi4odGhpcy5zdWJ0aXRsZUxpbmVJZHMgPz8gW10pXVxuICAgIGlmICh0aGlzLnRpdGxlTGluZUlkKSB7XG4gICAgICBpZHMgPSBbdGhpcy50aXRsZUxpbmVJZCwgLi4uKHRoaXMuc3VidGl0bGVMaW5lSWRzID8/IFtdKV1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maWx0ZXIoKGMpID0+ICFpZHMuaW5jbHVkZXMoYy5pZCkpXG4gIH1cblxuICBmaW5kVGVtcGxhdGUodGVtcGxhdGVzOiBQcmltZVRlbXBsYXRlW10sIG5hbWVzOiBzdHJpbmdbXSk6IFByaW1lVGVtcGxhdGUgfCB1bmRlZmluZWQge1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBuYW1lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBuYW1lc1tpbmRleF1cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGVtcGxhdGVzLmZpbmQoKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZS5uYW1lID09PSBuYW1lKVxuICAgICAgaWYgKHRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBnZXRUZW1wbGF0ZShjb2x1bW46IERhdGFUYWJsZUNvbHVtbik6IE9ic2VydmFibGU8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMudGVtcGxhdGVzT2JzZXJ2YWJsZXNbY29sdW1uLmlkXSkge1xuICAgICAgdGhpcy50ZW1wbGF0ZXNPYnNlcnZhYmxlc1tjb2x1bW4uaWRdID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgIHRoaXMudGVtcGxhdGVzJCxcbiAgICAgICAgdGhpcy52aWV3VGVtcGxhdGVzJCxcbiAgICAgICAgdGhpcy5wYXJlbnRUZW1wbGF0ZXMkLFxuICAgICAgXSkucGlwZShcbiAgICAgICAgbWFwKChbdCwgdnQsIHB0XSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IFsuLi4odCA/PyBbXSksIC4uLih2dCA/PyBbXSksIC4uLihwdCA/PyBbXSldXG4gICAgICAgICAgY29uc3QgY29sdW1uVGVtcGxhdGUgPSB0ZW1wbGF0ZXMuZmluZCgodGVtcGxhdGUpID0+IHRlbXBsYXRlLm5hbWUgPT09IGNvbHVtbi5pZCArICdJZExpc3RWYWx1ZScpPy50ZW1wbGF0ZVxuICAgICAgICAgIGlmIChjb2x1bW5UZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbHVtblRlbXBsYXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIHN3aXRjaCAoY29sdW1uLmNvbHVtblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5EQVRFOlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVMaXN0VmFsdWUgPz9cbiAgICAgICAgICAgICAgICB0aGlzLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZXMsIFsnZGF0ZUxpc3RWYWx1ZScsICdkZWZhdWx0RGF0ZUxpc3RWYWx1ZSddKT8udGVtcGxhdGUgPz9cbiAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5OVU1CRVI6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdGhpcy5fbnVtYmVyTGlzdFZhbHVlID8/XG4gICAgICAgICAgICAgICAgdGhpcy5maW5kVGVtcGxhdGUodGVtcGxhdGVzLCBbJ251bWJlckxpc3RWYWx1ZScsICdkZWZhdWx0TnVtYmVyTGlzdFZhbHVlJ10pPy50ZW1wbGF0ZSA/P1xuICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLlJFTEFUSVZFX0RBVEU6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVsYXRpdmVEYXRlTGlzdFZhbHVlID8/XG4gICAgICAgICAgICAgICAgdGhpcy5maW5kVGVtcGxhdGUodGVtcGxhdGVzLCBbJ3JlbGF0aXZlRGF0ZUxpc3RWYWx1ZScsICdkZWZhdWx0UmVsYXRpdmVEYXRlTGlzdFZhbHVlJ10pPy50ZW1wbGF0ZSA/P1xuICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLlRSQU5TTEFUSU9OX0tFWTpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2xhdGlvbktleUxpc3RWYWx1ZSA/P1xuICAgICAgICAgICAgICAgIHRoaXMuZmluZFRlbXBsYXRlKHRlbXBsYXRlcywgWyd0cmFuc2xhdGlvbktleUxpc3RWYWx1ZScsICdkZWZhdWx0VHJhbnNsYXRpb25LZXlMaXN0VmFsdWUnXSk/LnRlbXBsYXRlID8/XG4gICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICBjYXNlIENvbHVtblR5cGUuQ1VTVE9NOlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRoaXMuX2N1c3RvbUxpc3RWYWx1ZSA/P1xuICAgICAgICAgICAgICAgIHRoaXMuZmluZFRlbXBsYXRlKHRlbXBsYXRlcywgWydjdXN0b21MaXN0VmFsdWUnLCAnZGVmYXVsdEN1c3RvbUxpc3RWYWx1ZSddKT8udGVtcGxhdGUgPz9cbiAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RyaW5nTGlzdFZhbHVlID8/XG4gICAgICAgICAgICAgICAgdGhpcy5maW5kVGVtcGxhdGUodGVtcGxhdGVzLCBbJ3N0cmluZ0xpc3RWYWx1ZScsICdkZWZhdWx0U3RyaW5nTGlzdFZhbHVlJ10pPy50ZW1wbGF0ZSA/P1xuICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVzT2JzZXJ2YWJsZXNbY29sdW1uLmlkXVxuICB9XG5cbiAgcHJpdmF0ZSBtYXBHcmlkTWVudUl0ZW1zKFxuICAgIHBlcm1pc3Npb25zOiBzdHJpbmdbXSxcbiAgICBhZGRpdGlvbmFsQWN0aW9uczogRGF0YUFjdGlvbltdLFxuICAgIHNlbGVjdGVkSXRlbTogTGlzdEdyaWREYXRhIHwgdW5kZWZpbmVkLFxuICAgIHRyYW5zbGF0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICApOiBNZW51SXRlbVtdIHtcbiAgICBsZXQgZGVsZXRlRGlzYWJsZWQgPSBmYWxzZVxuICAgIGxldCBlZGl0RGlzYWJsZWQgPSBmYWxzZVxuICAgIGxldCB2aWV3RGlzYWJsZWQgPSBmYWxzZVxuXG4gICAgbGV0IGRlbGV0ZVZpc2libGUgPSB0cnVlXG4gICAgbGV0IGVkaXRWaXNpYmxlID0gdHJ1ZVxuICAgIGxldCB2aWV3VmlzaWJsZSA9IHRydWVcblxuICAgIGlmIChzZWxlY3RlZEl0ZW0pIHtcbiAgICAgIHZpZXdEaXNhYmxlZCA9ICEhdGhpcy52aWV3QWN0aW9uRW5hYmxlZEZpZWxkICYmICF0aGlzLmZpZWxkSXNUcnV0aHkoc2VsZWN0ZWRJdGVtLCB0aGlzLnZpZXdBY3Rpb25FbmFibGVkRmllbGQpXG4gICAgICBlZGl0RGlzYWJsZWQgPSAhIXRoaXMuZWRpdEFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhdGhpcy5maWVsZElzVHJ1dGh5KHNlbGVjdGVkSXRlbSwgdGhpcy5lZGl0QWN0aW9uRW5hYmxlZEZpZWxkKVxuICAgICAgZGVsZXRlRGlzYWJsZWQgPVxuICAgICAgICAhIXRoaXMuZGVsZXRlQWN0aW9uRW5hYmxlZEZpZWxkICYmICF0aGlzLmZpZWxkSXNUcnV0aHkoc2VsZWN0ZWRJdGVtLCB0aGlzLmRlbGV0ZUFjdGlvbkVuYWJsZWRGaWVsZClcblxuICAgICAgdmlld1Zpc2libGUgPSAhdGhpcy52aWV3QWN0aW9uVmlzaWJsZUZpZWxkIHx8IHRoaXMuZmllbGRJc1RydXRoeShzZWxlY3RlZEl0ZW0sIHRoaXMudmlld0FjdGlvblZpc2libGVGaWVsZClcbiAgICAgIGVkaXRWaXNpYmxlID0gIXRoaXMuZWRpdEFjdGlvblZpc2libGVGaWVsZCB8fCB0aGlzLmZpZWxkSXNUcnV0aHkoc2VsZWN0ZWRJdGVtLCB0aGlzLmVkaXRBY3Rpb25WaXNpYmxlRmllbGQpXG4gICAgICBkZWxldGVWaXNpYmxlID0gIXRoaXMuZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkIHx8IHRoaXMuZmllbGRJc1RydXRoeShzZWxlY3RlZEl0ZW0sIHRoaXMuZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkKVxuICAgIH1cblxuICAgIGNvbnN0IG1lbnVJdGVtczogTWVudUl0ZW1bXSA9IFtdXG4gICAgY29uc3QgYXV0b21hdGlvbklkID0gJ2RhdGEtZ3JpZC1hY3Rpb24tYnV0dG9uJ1xuICAgIGNvbnN0IGF1dG9tYXRpb25JZEhpZGRlbiA9ICdkYXRhLWdyaWQtYWN0aW9uLWJ1dHRvbi1oaWRkZW4nXG4gICAgaWYgKHRoaXMuc2hvdWxkRGlzcGxheUFjdGlvbih0aGlzLnZpZXdQZXJtaXNzaW9uLCB0aGlzLnZpZXdJdGVtLCBwZXJtaXNzaW9ucykpIHtcbiAgICAgIG1lbnVJdGVtcy5wdXNoKHtcbiAgICAgICAgbGFiZWw6IHRyYW5zbGF0aW9uc1t0aGlzLnZpZXdNZW51SXRlbUtleSB8fCAnT0NYX0RBVEFfTElTVF9HUklELk1FTlUuVklFVyddLFxuICAgICAgICBpY29uOiBQcmltZUljb25zLkVZRSxcbiAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy52aWV3SXRlbS5lbWl0KHNlbGVjdGVkSXRlbSksXG4gICAgICAgIGRpc2FibGVkOiB2aWV3RGlzYWJsZWQsXG4gICAgICAgIHZpc2libGU6IHZpZXdWaXNpYmxlLFxuICAgICAgICBhdXRvbWF0aW9uSWQ6IHZpZXdWaXNpYmxlID8gYXV0b21hdGlvbklkIDogYXV0b21hdGlvbklkSGlkZGVuLFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvdWxkRGlzcGxheUFjdGlvbih0aGlzLmVkaXRQZXJtaXNzaW9uLCB0aGlzLmVkaXRJdGVtLCBwZXJtaXNzaW9ucykpIHtcbiAgICAgIG1lbnVJdGVtcy5wdXNoKHtcbiAgICAgICAgbGFiZWw6IHRyYW5zbGF0aW9uc1t0aGlzLmVkaXRNZW51SXRlbUtleSB8fCAnT0NYX0RBVEFfTElTVF9HUklELk1FTlUuRURJVCddLFxuICAgICAgICBpY29uOiBQcmltZUljb25zLlBFTkNJTCxcbiAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy5lZGl0SXRlbS5lbWl0KHNlbGVjdGVkSXRlbSksXG4gICAgICAgIGRpc2FibGVkOiBlZGl0RGlzYWJsZWQsXG4gICAgICAgIHZpc2libGU6IGVkaXRWaXNpYmxlLFxuICAgICAgICBhdXRvbWF0aW9uSWQ6IGVkaXRWaXNpYmxlID8gYXV0b21hdGlvbklkIDogYXV0b21hdGlvbklkSGlkZGVuLFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvdWxkRGlzcGxheUFjdGlvbih0aGlzLmRlbGV0ZVBlcm1pc3Npb24sIHRoaXMuZGVsZXRlSXRlbSwgcGVybWlzc2lvbnMpKSB7XG4gICAgICBtZW51SXRlbXMucHVzaCh7XG4gICAgICAgIGxhYmVsOiB0cmFuc2xhdGlvbnNbdGhpcy5kZWxldGVNZW51SXRlbUtleSB8fCAnT0NYX0RBVEFfTElTVF9HUklELk1FTlUuREVMRVRFJ10sXG4gICAgICAgIGljb246IFByaW1lSWNvbnMuVFJBU0gsXG4gICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMuZGVsZXRlSXRlbS5lbWl0KHNlbGVjdGVkSXRlbSksXG4gICAgICAgIGRpc2FibGVkOiBkZWxldGVEaXNhYmxlZCxcbiAgICAgICAgdmlzaWJsZTogZGVsZXRlVmlzaWJsZSxcbiAgICAgICAgYXV0b21hdGlvbklkOiBkZWxldGVWaXNpYmxlID8gYXV0b21hdGlvbklkIDogYXV0b21hdGlvbklkSGlkZGVuLFxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3QgdmFsID0gbWVudUl0ZW1zLmNvbmNhdChcbiAgICAgIGFkZGl0aW9uYWxBY3Rpb25zLm1hcCgoYSkgPT4ge1xuICAgICAgICBjb25zdCBpc1Zpc2libGUgPSAhYS5hY3Rpb25WaXNpYmxlRmllbGQgfHwgdGhpcy5maWVsZElzVHJ1dGh5KHNlbGVjdGVkSXRlbSwgYS5hY3Rpb25WaXNpYmxlRmllbGQpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGFiZWw6IHRyYW5zbGF0aW9uc1thLmxhYmVsS2V5IHx8ICcnXSxcbiAgICAgICAgICBpY29uOiBhLmljb24sXG4gICAgICAgICAgc3R5bGVDbGFzczogKGEuY2xhc3NlcyB8fCBbXSkuam9pbignICcpLFxuICAgICAgICAgIGRpc2FibGVkOiBhLmRpc2FibGVkIHx8ICghIWEuYWN0aW9uRW5hYmxlZEZpZWxkICYmICF0aGlzLmZpZWxkSXNUcnV0aHkoc2VsZWN0ZWRJdGVtLCBhLmFjdGlvbkVuYWJsZWRGaWVsZCkpLFxuICAgICAgICAgIHZpc2libGU6IGlzVmlzaWJsZSxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiBhLmNhbGxiYWNrKHNlbGVjdGVkSXRlbSksXG4gICAgICAgICAgYXV0b21hdGlvbklkOiBpc1Zpc2libGUgPyBhdXRvbWF0aW9uSWQgOiBhdXRvbWF0aW9uSWRIaWRkZW4sXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuICAgIHJldHVybiB2YWxcbiAgfVxuXG4gIHByaXZhdGUgZ2V0R3JpZEFjdGlvbnNUcmFuc2xhdGlvbnMoXG4gICAgYWRkaXRpb25hbEFjdGlvbnM6IERhdGFBY3Rpb25bXSxcbiAgICBwZXJtaXNzaW9uczogc3RyaW5nW11cbiAgKTogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoW1xuICAgICAgdGhpcy52aWV3TWVudUl0ZW1LZXkgfHwgJ09DWF9EQVRBX0xJU1RfR1JJRC5NRU5VLlZJRVcnLFxuICAgICAgdGhpcy5lZGl0TWVudUl0ZW1LZXkgfHwgJ09DWF9EQVRBX0xJU1RfR1JJRC5NRU5VLkVESVQnLFxuICAgICAgdGhpcy5kZWxldGVNZW51SXRlbUtleSB8fCAnT0NYX0RBVEFfTElTVF9HUklELk1FTlUuREVMRVRFJyxcbiAgICAgIC4uLmFkZGl0aW9uYWxBY3Rpb25zXG4gICAgICAgIC5maWx0ZXIoKGFjdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHBlcm1pc3Npb25zQXJyYXkgPSBBcnJheS5pc0FycmF5KGFjdGlvbi5wZXJtaXNzaW9uKSA/IGFjdGlvbi5wZXJtaXNzaW9uIDogW2FjdGlvbi5wZXJtaXNzaW9uXVxuICAgICAgICAgIHJldHVybiBwZXJtaXNzaW9uc0FycmF5LmV2ZXJ5KChwKSA9PiBwZXJtaXNzaW9ucy5pbmNsdWRlcyhwKSlcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcCgoYSkgPT4gYS5sYWJlbEtleSB8fCAnJyksXG4gICAgXSlcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkRGlzcGxheUFjdGlvbihcbiAgICBwZXJtaXNzaW9uOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgICBlbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PixcbiAgICB1c2VyUGVybWlzc2lvbnM6IHN0cmluZ1tdXG4gICk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gQXJyYXkuaXNBcnJheShwZXJtaXNzaW9uKSA/IHBlcm1pc3Npb24gOiBwZXJtaXNzaW9uID8gW3Blcm1pc3Npb25dIDogW11cbiAgICByZXR1cm4gZW1pdHRlci5vYnNlcnZlZCAmJiBwZXJtaXNzaW9ucy5ldmVyeSgocCkgPT4gdXNlclBlcm1pc3Npb25zLmluY2x1ZGVzKHApKVxuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJBY3Rpb25zQmFzZWRPblBlcm1pc3Npb25zKGFjdGlvbnM6IERhdGFBY3Rpb25bXSwgcGVybWlzc2lvbnM/OiBzdHJpbmdbXSk6IE9ic2VydmFibGU8RGF0YUFjdGlvbltdPiB7XG4gICAgY29uc3QgcGVybWlzc2lvbnMkID0gcGVybWlzc2lvbnMgPyBvZihwZXJtaXNzaW9ucykgOiB0aGlzLmdldFBlcm1pc3Npb25zKClcbiAgICByZXR1cm4gcGVybWlzc2lvbnMkLnBpcGUoXG4gICAgICBtYXAoKHBlcm1pc3Npb25zKSA9PiB7XG4gICAgICAgIHJldHVybiBhY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiB7XG4gICAgICAgICAgY29uc3QgYWN0aW9uUGVybWlzc2lvbnMgPSBBcnJheS5pc0FycmF5KGFjdGlvbi5wZXJtaXNzaW9uKSA/IGFjdGlvbi5wZXJtaXNzaW9uIDogW2FjdGlvbi5wZXJtaXNzaW9uXVxuICAgICAgICAgIHJldHVybiBhY3Rpb25QZXJtaXNzaW9ucy5ldmVyeSgocCkgPT4gcGVybWlzc2lvbnMuaW5jbHVkZXMocCkpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVybWlzc2lvbnMoKTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xuICAgIGlmICh0aGlzLmhhc1Blcm1pc3Npb25DaGVja2VyPy5nZXRQZXJtaXNzaW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzUGVybWlzc2lvbkNoZWNrZXIuZ2V0UGVybWlzc2lvbnMoKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnVzZXJTZXJ2aWNlLmdldFBlcm1pc3Npb25zKClcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIihkaXNwbGF5ZWRQYWdlU2l6ZSQgfCBhc3luYykgYXMgZGlzcGxheWVkUGFnZVNpemVcIj5cbiAgPHAtZGF0YVZpZXdcbiAgICAqbmdJZj1cIihjb2x1bW5UZW1wbGF0ZXMkIHwgYXN5bmMpID8/IHt9IGFzIGNvbHVtblRlbXBsYXRlc1wiXG4gICAgW3ZhbHVlXT1cIihkaXNwbGF5ZWRJdGVtcyQgfCBhc3luYykgPz8gW11cIlxuICAgIFtwYWdpbmF0b3JdPVwicGFnaW5hdG9yXCJcbiAgICBbZmlyc3RdPVwicGFnZSAqIGRpc3BsYXllZFBhZ2VTaXplXCJcbiAgICAob25QYWdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICBbcm93c109XCJkaXNwbGF5ZWRQYWdlU2l6ZVwiXG4gICAgW2xheW91dF09XCJsYXlvdXRcIlxuICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiXG4gICAgY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZT1cInt7ICh0b3RhbFJlY29yZHNPblNlcnZlciA/IGN1cnJlbnRQYWdlU2hvd2luZ1dpdGhUb3RhbE9uU2VydmVyS2V5IDogY3VycmVudFBhZ2VTaG93aW5nS2V5KSB8IHRyYW5zbGF0ZTpwYXJhbXMgfX1cIlxuICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiKGRpc3BsYXllZFBhZ2VTaXplcyQgfCBhc3luYykgPz8gW11cIlxuICAgIGlkPVwiZGF0YUxpc3RHcmlkX3t7bmFtZX19XCJcbiAgICBwYWdpbmF0b3JEcm9wZG93bkFwcGVuZFRvPVwiYm9keVwiXG4gID5cbiAgICA8bmctdGVtcGxhdGUgI2dyaWRJdGVtIGxldC1yb3dzIHBUZW1wbGF0ZT1cImdyaWRJdGVtXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicC1ncmlkIHAtbm9ndXR0ZXIgZ3JpZCBncmlkLW5vZ3V0dGVyXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtaXRlbSBbbmdGb3JPZl09XCJyb3dzXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiX2dyaWRJdGVtID8gX2dyaWRJdGVtIDogZGVmYXVsdEdyaWRJdGVtXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0Oml0ZW19XCJcbiAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlICNsaXN0SXRlbSBsZXQtcm93cyBwVGVtcGxhdGU9XCJsaXN0SXRlbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInAtZ3JpZCBwLW5vZ3V0dGVyIGdyaWQgZ3JpZC1ub2d1dHRlclwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWl0ZW0gW25nRm9yT2ZdPVwicm93c1wiPlxuICAgICAgICAgIEBkZWZlciAob24gdmlld3BvcnQ7IG9uIGlkbGUpe1xuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIl9saXN0SXRlbSA/IF9saXN0SXRlbSA6IGRlZmF1bHRMaXN0SXRlbVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAkaW1wbGljaXQ6aXRlbSxcbiAgICAgICAgICAgICAgaXRlbTppdGVtLFxuICAgICAgICAgICAgICBjb2x1bW5UZW1wbGF0ZXM6IGNvbHVtblRlbXBsYXRlc1xuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgfSBAcGxhY2Vob2xkZXIge1xuICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiA4MHB4XCI+PC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHlcIj5cbiAgICAgIDxzcGFuPnt7IGVtcHR5UmVzdWx0c01lc3NhZ2UgfHwgKFwiT0NYX0RBVEFfTElTVF9HUklELkVNUFRZX1JFU1VMVFwiIHwgdHJhbnNsYXRlKSB9fTwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L3AtZGF0YVZpZXc+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0R3JpZEl0ZW0gbGV0LWl0ZW0+XG4gIDxkaXYgY2xhc3M9XCJjb2wtMTIgbGc6Y29sLTYgeGw6Y29sLTQgZmxleFwiPlxuICAgIDxkaXYgY2xhc3M9XCJkYXRhLWdyaWQtaXRlbSBjYXJkIGZsZXggZmxleC1jb2x1bW4ganVzdGlmeS1jb250ZW50LWJldHdlZW4gdy0xMiBsZzp3LTExIG1iLTQgbXQtNCBhbGlnbi1zZWxmLXN0cmV0Y2hcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgbWItM1wiPlxuICAgICAgICA8aW1nXG4gICAgICAgICAgY2xhc3M9XCJpbWFnZVwiXG4gICAgICAgICAgc3JjPVwie3sgaXRlbS5pbWFnZVBhdGggfHwgKGZhbGxiYWNrSW1hZ2VQYXRoJCB8IGFzeW5jKSB9fVwiXG4gICAgICAgICAgKGVycm9yKT1cImltZ0Vycm9yKGl0ZW0pXCJcbiAgICAgICAgICBhbHQ9XCJ7e3Jlc29sdmVGaWVsZERhdGEoaXRlbSwgdGl0bGVMaW5lSWQpfHwgJyd9fVwiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YS1ncmlkLWl0ZW1zIGZsZXgtcm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tbmFtZSBmb250LW1lZGl1bSBtci0zIHRleHQtMnhsXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzVmlld1Blcm1pc3Npb24kIHwgYXN5bmMgYXMgaGFzVmlld1Blcm1pc3Npb247IGVsc2Ugbm9WaWV3UGVybWlzc2lvblwiPlxuICAgICAgICAgICAgICA8YSBbcm91dGVyTGlua109XCJcIiAoY2xpY2spPVwib25WaWV3Um93KGl0ZW0pXCI+e3sgcmVzb2x2ZUZpZWxkRGF0YShpdGVtLCB0aXRsZUxpbmVJZCkgfHwgJycgfX08L2E+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9WaWV3UGVybWlzc2lvbj5cbiAgICAgICAgICAgICAgPGEgW3JvdXRlckxpbmtdPVwiXCI+e3sgcmVzb2x2ZUZpZWxkRGF0YShpdGVtLCB0aXRsZUxpbmVJZCkgfHwgJycgfX08L2E+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIl9ncmlkSXRlbVN1YnRpdGxlTGluZXMgPyBfZ3JpZEl0ZW1TdWJ0aXRsZUxpbmVzIDogZGVmYXVsdEdyaWRJdGVtU3VidGl0bGVMaW5lc1wiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDppdGVtfVwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIihncmlkTWVudUl0ZW1zJCB8IGFzeW5jKSBhcyBncmlkTWVudUl0ZW1zXCI+XG4gICAgICAgICAgPHAtbWVudSAjbWVudSBbbW9kZWxdPVwiZ3JpZE1lbnVJdGVtc1wiIFtwb3B1cF09XCJ0cnVlXCIgYXBwZW5kVG89XCJib2R5XCI+PC9wLW1lbnU+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgKGNsaWNrKT1cInNldFNlbGVjdGVkSXRlbShpdGVtKTsgbWVudS50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICBpY29uPVwicGkgcGktZWxsaXBzaXMtdlwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidPQ1hfREFUQV9MSVNUX0dSSUQuTU9SRV9BQ1RJT05TX0FSSUFfTEFCRUwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGNsYXNzPVwibW9yZS1hY3Rpb25zLW1lbnUtYnV0dG9uIG1lbnUtYnRuXCJcbiAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiJ2RhdGEtZ3JpZC1pdGVtLW1lbnUtYnV0dG9uJ1wiXG4gICAgICAgICAgICBbcFRvb2x0aXBdPVwiJ09DWF9EQVRBX0xJU1RfR1JJRC5NT1JFX0FDVElPTlNfVE9PTFRJUCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEdyaWRJdGVtU3VidGl0bGVMaW5lcyBsZXQtaXRlbT5cbiAgPGRpdiAqbmdGb3I9XCJsZXQgc3VidGl0bGVMaW5lSWQgb2Ygc3VidGl0bGVMaW5lSWRzXCIgY2xhc3M9XCJzdWJ0aXRsZUxpbmUgZWRpdC10aW1lIHRleHQteGwgbXktM1wiPlxuICAgIHt7IHJlc29sdmVGaWVsZERhdGEoaXRlbSwgc3VidGl0bGVMaW5lSWQpIH19XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdExpc3RJdGVtIGxldC1pdGVtPVwiaXRlbVwiIGxldC1jb2x1bW5UZW1wbGF0ZXM9XCJjb2x1bW5UZW1wbGF0ZXNcIj5cbiAgPGRpdiBjbGFzcz1cImNvbC0xMlwiICpuZ0lmPVwiY29sdW1uVGVtcGxhdGVzXCI+XG4gICAgPGRpdiBjbGFzcz1cImRhdGEtbGlzdC1pdGVtcyBwLTNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLW5hbWUtcm93IGZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tbmFtZSBtci0zIHRleHQtMnhsIGZvbnQtbWVkaXVtIGFsaWduLWNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0aXRsZUxpbmVJZFwiPnt7IHJlc29sdmVGaWVsZERhdGEoaXRlbSwgdGl0bGVMaW5lSWQpIHx8ICcnIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdJZj1cInZpZXdJdGVtT2JzZXJ2ZWQgJiYgKCF2aWV3QWN0aW9uVmlzaWJsZUZpZWxkIHx8IGZpZWxkSXNUcnV0aHkoaXRlbSwgdmlld0FjdGlvblZpc2libGVGaWVsZCkpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGlkPVwie3tyZXNvbHZlRmllbGREYXRhKGl0ZW0sICdpZCcpfX0tdmlld0J1dHRvblwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBpY29uPVwicGkgcGktZXllXCJcbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBtYi0xIG1yLTIgdmlld0xpc3RJdGVtQnV0dG9uXCJcbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIih2aWV3TWVudUl0ZW1LZXkgfHwgJ09DWF9EQVRBX0xJU1RfR1JJRC5NRU5VLlZJRVcnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKHZpZXdNZW51SXRlbUtleSB8fCAnT0NYX0RBVEFfTElTVF9HUklELk1FTlUuVklFVycpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmlld1JvdyhpdGVtKVwiXG4gICAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJ2aWV3UGVybWlzc2lvblwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIXZpZXdBY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkoaXRlbSwgdmlld0FjdGlvbkVuYWJsZWRGaWVsZClcIlxuICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cIidkYXRhLWxpc3QtYWN0aW9uLWJ1dHRvbidcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiZWRpdEl0ZW1PYnNlcnZlZCAmJiAoIWVkaXRBY3Rpb25WaXNpYmxlRmllbGQgfHwgZmllbGRJc1RydXRoeShpdGVtLCBlZGl0QWN0aW9uVmlzaWJsZUZpZWxkKSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgaWQ9XCJ7e3Jlc29sdmVGaWVsZERhdGEoaXRlbSwgJ2lkJyl9fS1lZGl0QnV0dG9uXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IG1iLTEgbXItMiBlZGl0TGlzdEl0ZW1CdXR0b25cIlxuICAgICAgICAgICAgICBpY29uPVwicGkgcGktcGVuY2lsXCJcbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiKGVkaXRNZW51SXRlbUtleSB8fCAnT0NYX0RBVEFfTElTVF9HUklELk1FTlUuRURJVCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoZWRpdE1lbnVJdGVtS2V5IHx8ICdPQ1hfREFUQV9MSVNUX0dSSUQuTUVOVS5FRElUJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25FZGl0Um93KGl0ZW0pXCJcbiAgICAgICAgICAgICAgKm9jeElmUGVybWlzc2lvbj1cImVkaXRQZXJtaXNzaW9uXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhZWRpdEFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShpdGVtLCBlZGl0QWN0aW9uRW5hYmxlZEZpZWxkKVwiXG4gICAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiJ2RhdGEtbGlzdC1hY3Rpb24tYnV0dG9uJ1wiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nSWY9XCJkZWxldGVJdGVtT2JzZXJ2ZWQgJiYgKCFkZWxldGVBY3Rpb25WaXNpYmxlRmllbGQgfHwgZmllbGRJc1RydXRoeShpdGVtLCBkZWxldGVBY3Rpb25WaXNpYmxlRmllbGQpKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBpZD1cInt7cmVzb2x2ZUZpZWxkRGF0YShpdGVtLCAnaWQnKX19LWRlbGV0ZUJ1dHRvblwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIlxuICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1kYW5nZXIgbWItMSBtci0yIGRlbGV0ZUxpc3RJdGVtQnV0dG9uXCJcbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiKGRlbGV0ZU1lbnVJdGVtS2V5IHx8ICdPQ1hfREFUQV9MSVNUX0dSSUQuTUVOVS5ERUxFVEUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGRlbGV0ZU1lbnVJdGVtS2V5IHx8ICdPQ1hfREFUQV9MSVNUX0dSSUQuTUVOVS5ERUxFVEUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZVJvdyhpdGVtKVwiXG4gICAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJkZWxldGVQZXJtaXNzaW9uXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhZGVsZXRlQWN0aW9uRW5hYmxlZEZpZWxkICYmICFmaWVsZElzVHJ1dGh5KGl0ZW0sIGRlbGV0ZUFjdGlvbkVuYWJsZWRGaWVsZClcIlxuICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cIidkYXRhLWxpc3QtYWN0aW9uLWJ1dHRvbidcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBpbmxpbmVMaXN0QWN0aW9ucyQgfCBhc3luY1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIighYWN0aW9uLmFjdGlvblZpc2libGVGaWVsZCB8fCBmaWVsZElzVHJ1dGh5KGl0ZW0sIGFjdGlvbi5hY3Rpb25WaXNpYmxlRmllbGQpKVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgaWQ9XCJ7e3Jlc29sdmVGaWVsZERhdGEoaXRlbSwgJ2lkJyl9fS17e2FjdGlvbi5pZCA/IGFjdGlvbi5pZC5jb25jYXQoJ0FjdGlvbkJ1dHRvbicpIDogJ2lubGluZUFjdGlvbkJ1dHRvbid9fVwiXG4gICAgICAgICAgICAgICAgKm9jeElmUGVybWlzc2lvbj1cImFjdGlvbi5wZXJtaXNzaW9uXCJcbiAgICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFjdGlvbi5jbGFzc2VzXCJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCJhY3Rpb24uaWNvbiB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbi5jYWxsYmFjayhpdGVtKVwiXG4gICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cImFjdGlvbi5sYWJlbEtleSA/IChhY3Rpb24ubGFiZWxLZXkgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhY3Rpb24ubGFiZWxLZXkgPyAoYWN0aW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWN0aW9uLmRpc2FibGVkIHx8ICghIWFjdGlvbi5hY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkoaXRlbSwgYWN0aW9uLmFjdGlvbkVuYWJsZWRGaWVsZCkpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cIidkYXRhLWxpc3QtYWN0aW9uLWJ1dHRvbidcIlxuICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzVmlzaWJsZU92ZXJmbG93TWVudUl0ZW1zKGl0ZW0pIHwgYXN5bmNcIj5cbiAgICAgICAgICAgIDxwLW1lbnUgI21lbnUgW21vZGVsXT1cIihvdmVyZmxvd0xpc3RNZW51SXRlbXMkIHwgYXN5bmMpIHx8IFtdXCIgW3BvcHVwXT1cInRydWVcIiBhcHBlbmRUbz1cImJvZHlcIj48L3AtbWVudT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiXG4gICAgICAgICAgICAgIFtpY29uXT1cIidwaSBwaS1lbGxpcHNpcy12J1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVPdmVyZmxvd01lbnUoJGV2ZW50LCBtZW51LCBpdGVtKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09DWF9EQVRBX0xJU1RfR1JJRC5NT1JFX0FDVElPTlNfQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiJ09DWF9EQVRBX0xJU1RfR1JJRC5NT1JFX0FDVElPTlNfVE9PTFRJUCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cIidkYXRhLWxpc3Qtb3ZlcmZsb3ctaXRlbS1tZW51LWJ1dHRvbidcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInRleHQtYmFzZSBmb250LWxpZ2h0IG15LTFcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIl9saXN0SXRlbVN1YnRpdGxlTGluZXMgPyBfbGlzdEl0ZW1TdWJ0aXRsZUxpbmVzIDogZGVmYXVsdExpc3RJdGVtU3VidGl0bGVMaW5lc1wiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6aXRlbX1cIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcFwiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2wgb2YgZ2V0RmlsdGVyZWRDb2x1bW5zKClcIiBjbGFzcz1cInctMTJyZW0gbXktMiBtci0yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZFwiIFtvY3hUb29sdGlwT25PdmVyZmxvd109XCJjb2wubmFtZUtleSB8IHRyYW5zbGF0ZVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiPlxuICAgICAgICAgICAge3sgY29sLm5hbWVLZXkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBbb2N4VG9vbHRpcE9uT3ZlcmZsb3ddPVwiY29sLmNvbHVtblR5cGUgPT09IGNvbHVtblR5cGUuVFJBTlNMQVRJT05fS0VZID8gKHJlc29sdmVGaWVsZERhdGEoaXRlbSxjb2wuaWQpIHwgdHJhbnNsYXRlKSA6IHJlc29sdmVGaWVsZERhdGEoaXRlbSwgY29sLmlkKVwiXG4gICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBkZWZlcihvbiB2aWV3cG9ydDspe1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJfbGlzdFZhbHVlID8gX2xpc3RWYWx1ZTogZGVmYXVsdExpc3RWYWx1ZVwiXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgcm93T2JqZWN0OiBpdGVtLFxuICAgICAgICAgICAgICAgIGNvbHVtbjogY29sLFxuICAgICAgICAgICAgICAgIGNvbHVtblRlbXBsYXRlczogY29sdW1uVGVtcGxhdGVzXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH0gQHBsYWNlaG9sZGVyIHtcbiAgICAgICAgICAgIDxwLXNrZWxldG9uIHdpZHRoPVwiNXJlbVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdExpc3RJdGVtU3VidGl0bGVMaW5lcyBsZXQtaXRlbT1cIiRpbXBsaWNpdFwiPlxuICA8ZGl2ICpuZ0Zvcj1cImxldCBzdWJ0aXRsZUxpbmVJZCBvZiBzdWJ0aXRsZUxpbmVJZHNcIiBjbGFzcz1cInN1YnRpdGxlTGluZSB0ZXh0LXhsIG15LTNcIj5cbiAgICB7eyByZXNvbHZlRmllbGREYXRhKGl0ZW0sIHN1YnRpdGxlTGluZUlkKSB9fVxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdExpc3RWYWx1ZSBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiIGxldC1jb2x1bW5UZW1wbGF0ZXM9XCJjb2x1bW5UZW1wbGF0ZXNcIj5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0lmPVwiY29sdW1uVGVtcGxhdGVzW2NvbHVtbi5pZF1cIlxuICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtblRlbXBsYXRlc1tjb2x1bW4uaWRdXCJcbiAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgIHJvd09iamVjdDogcm93T2JqZWN0LFxuICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICAgICAgICB9XCJcbiAgPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJkZWZhdWx0U3RyaW5nTGlzdFZhbHVlXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCkgfX0gPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdE51bWJlckxpc3RWYWx1ZVwiIGxldC1yb3dPYmplY3Q9XCJyb3dPYmplY3RcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxuZy1jb250YWluZXI+IHt7IHJlc29sdmVGaWVsZERhdGEocm93T2JqZWN0LCBjb2x1bW4uaWQpIHwgbnVtYmVyIH19IDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHRDdXN0b21MaXN0VmFsdWVcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPiA8L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdERhdGVMaXN0VmFsdWVcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8bmctY29udGFpbmVyPiB7eyByZXNvbHZlRmllbGREYXRhKHJvd09iamVjdCwgY29sdW1uLmlkKSB8IGRhdGU6IGNvbHVtbi5kYXRlRm9ybWF0ID8/ICdtZWRpdW0nIH19IDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHRSZWxhdGl2ZURhdGVMaXN0VmFsdWVcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8bmctY29udGFpbmVyPlxuICAgIHt7ICdPQ1hfREFUQV9UQUJMRS5FRElURUQnIHwgdHJhbnNsYXRlIH19IHt7IHJlc29sdmVGaWVsZERhdGEocm93T2JqZWN0LCBjb2x1bW4uaWQpIHwgdGltZWFnbyB9fVxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJkZWZhdWx0VHJhbnNsYXRpb25LZXlMaXN0VmFsdWVcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8bmctY29udGFpbmVyPiB7eyByZXNvbHZlRmllbGREYXRhKHJvd09iamVjdCwgY29sdW1uLmlkKSB8IHRyYW5zbGF0ZSB9fSA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
666
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1saXN0LWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWFjY2VsZXJhdG9yL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWxpc3QtZ3JpZC9kYXRhLWxpc3QtZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtbGlzdC1ncmlkL2RhdGEtbGlzdC1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFlBQVksRUFDWixlQUFlLEVBRWYsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLEtBQUssRUFDTCxTQUFTLEVBRVQsUUFBUSxFQUNSLE1BQU0sRUFHTixZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBRW5GLE9BQU8sRUFBWSxVQUFVLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBRWpFLE9BQU8sRUFDTCxlQUFlLEVBRWYsYUFBYSxFQUNiLFlBQVksRUFDWixLQUFLLEVBQ0wsY0FBYyxFQUNkLEdBQUcsRUFDSCxRQUFRLEVBQ1IsRUFBRSxFQUNGLFNBQVMsR0FDVixNQUFNLE1BQU0sQ0FBQTtBQUNiLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQTtBQUkxRCxPQUFPLEVBQUUsV0FB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QVU7Z0JBS2YsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNxQixzQkFBc0I7c0JBQWhELFlBQVk7dUJBQUMsV0FBVztnQkFLaEIsK0JBQStCO3NCQUF2QyxLQUFLO2dCQUNtQyxvQ0FBb0M7c0JBQTVFLFlBQVk7dUJBQUMseUJBQXlCO2dCQUs5Qix1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQzJCLDRCQUE0QjtzQkFBNUQsWUFBWTt1QkFBQyxpQkFBaUI7Z0JBS3RCLDZCQUE2QjtzQkFBckMsS0FBSztnQkFDaUMsa0NBQWtDO3NCQUF4RSxZQUFZO3VCQUFDLHVCQUF1QjtnQkFTNUIsdUJBQXVCO3NCQUEvQixLQUFLO2dCQU0yQiw0QkFBNEI7c0JBQTVELFlBQVk7dUJBQUMsaUJBQWlCO2dCQUt0Qix1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQzJCLDRCQUE0QjtzQkFBNUQsWUFBWTt1QkFBQyxpQkFBaUI7Z0JBS3RCLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDeUIsMEJBQTBCO3NCQUF4RCxZQUFZO3VCQUFDLGVBQWU7Z0JBV3pCLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFRSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQWdDSCxTQUFTO3NCQURaLGVBQWU7dUJBQUMsYUFBYTtnQkFTMUIsYUFBYTtzQkFEaEIsWUFBWTt1QkFBQyxhQUFhO2dCQVN2QixlQUFlO3NCQURsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgQ29udGVudENoaWxkLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIERvQ2hlY2ssXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgaW5wdXQsXG4gIElucHV0LFxuICBMT0NBTEVfSUQsXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgTGl2ZUFubm91bmNlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5J1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnXG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UsIFVzZXJTZXJ2aWNlIH0gZnJvbSAnQG9uZWN4L2FuZ3VsYXItaW50ZWdyYXRpb24taW50ZXJmYWNlJ1xuaW1wb3J0IHsgTWZlSW5mbyB9IGZyb20gJ0BvbmVjeC9pbnRlZ3JhdGlvbi1pbnRlcmZhY2UnXG5pbXBvcnQgeyBNZW51SXRlbSwgUHJpbWVJY29ucywgUHJpbWVUZW1wbGF0ZSB9IGZyb20gJ3ByaW1lbmcvYXBpJ1xuaW1wb3J0IHsgTWVudSB9IGZyb20gJ3ByaW1lbmcvbWVudSdcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgY29tYmluZUxhdGVzdCxcbiAgZGVib3VuY2VUaW1lLFxuICBmaXJzdCxcbiAgZmlyc3RWYWx1ZUZyb20sXG4gIG1hcCxcbiAgbWVyZ2VNYXAsXG4gIG9mLFxuICBzd2l0Y2hNYXAsXG59IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBDb2x1bW5UeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWwvY29sdW1uLXR5cGUubW9kZWwnXG5pbXBvcnQgeyBEYXRhQWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWwvZGF0YS1hY3Rpb24nXG5pbXBvcnQgeyBEYXRhU29ydERpcmVjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVsL2RhdGEtc29ydC1kaXJlY3Rpb24nXG5pbXBvcnQgeyBEYXRhVGFibGVDb2x1bW4gfSBmcm9tICcuLi8uLi9tb2RlbC9kYXRhLXRhYmxlLWNvbHVtbi5tb2RlbCdcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbHMvb2JqZWN0dXRpbHMnXG5pbXBvcnQgeyBEYXRhU29ydEJhc2UgfSBmcm9tICcuLi9kYXRhLXNvcnQtYmFzZS9kYXRhLXNvcnQtYmFzZSdcbmltcG9ydCB7IFJvdyB9IGZyb20gJy4uL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQnXG5pbXBvcnQgeyBGaWx0ZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9maWx0ZXIubW9kZWwnXG5pbXBvcnQgeyBIQVNfUEVSTUlTU0lPTl9DSEVDS0VSLCBIYXNQZXJtaXNzaW9uQ2hlY2tlciB9IGZyb20gJ0BvbmVjeC9hbmd1bGFyLXV0aWxzJ1xuXG5leHBvcnQgdHlwZSBMaXN0R3JpZERhdGEgPSB7XG4gIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgaW1hZ2VQYXRoOiBzdHJpbmcgfCBudW1iZXJcbiAgW2NvbHVtbklkOiBzdHJpbmddOiB1bmtub3duXG59XG5cbnR5cGUgUm93TGlzdEdyaWREYXRhID0gTGlzdEdyaWREYXRhICYgUm93XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdEdyaWREYXRhTWVudUl0ZW0gZXh0ZW5kcyBNZW51SXRlbSB7XG4gIHBlcm1pc3Npb246IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFMaXN0R3JpZENvbXBvbmVudFN0YXRlIHtcbiAgYWN0aXZlUGFnZT86IG51bWJlclxuICBwYWdlU2l6ZT86IG51bWJlclxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvY3gtZGF0YS1saXN0LWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1saXN0LWdyaWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kYXRhLWxpc3QtZ3JpZC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhTGlzdEdyaWRDb21wb25lbnQgZXh0ZW5kcyBEYXRhU29ydEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIERvQ2hlY2ssIEFmdGVyQ29udGVudEluaXQge1xuICBASW5wdXQoKSB0aXRsZUxpbmVJZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHN1YnRpdGxlTGluZUlkczogc3RyaW5nW10gPSBbXVxuICBASW5wdXQoKSBjbGllbnRTaWRlU29ydGluZyA9IHRydWVcbiAgQElucHV0KCkgY2xpZW50U2lkZUZpbHRlcmluZyA9IHRydWVcbiAgQElucHV0KCkgc29ydFN0YXRlczogRGF0YVNvcnREaXJlY3Rpb25bXSA9IFtdXG5cbiAgZGlzcGxheWVkUGFnZVNpemVzJDogT2JzZXJ2YWJsZTwobnVtYmVyIHwgeyBzaG93QWxsOiBzdHJpbmcgfSlbXT5cbiAgX3BhZ2VTaXplcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PChudW1iZXIgfCB7IHNob3dBbGw6IHN0cmluZyB9KVtdPihbMTAsIDI1LCA1MF0pXG4gIEBJbnB1dCgpXG4gIGdldCBwYWdlU2l6ZXMoKTogKG51bWJlciB8IHsgc2hvd0FsbDogc3RyaW5nIH0pW10ge1xuICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZXMkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgcGFnZVNpemVzKHZhbHVlOiAobnVtYmVyIHwgeyBzaG93QWxsOiBzdHJpbmcgfSlbXSkge1xuICAgIHRoaXMuX3BhZ2VTaXplcyQubmV4dCh2YWx1ZSlcbiAgfVxuXG4gIGRpc3BsYXllZFBhZ2VTaXplJDogT2JzZXJ2YWJsZTxudW1iZXI+XG4gIF9wYWdlU2l6ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuICBASW5wdXQoKVxuICBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZVNpemUkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgcGFnZVNpemUodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BhZ2VTaXplJC5uZXh0KHZhbHVlKVxuICB9XG4gIF9zaG93QWxsT3B0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpXG4gIEBJbnB1dCgpXG4gIHNldCBzaG93QWxsT3B0aW9uKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2hvd0FsbE9wdGlvbiQubmV4dCh2YWx1ZSlcbiAgfVxuXG4gIEBJbnB1dCgpIGVtcHR5UmVzdWx0c01lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBmYWxsYmFja0ltYWdlID0gJ3BsYWNlaG9sZGVyLnBuZydcbiAgQElucHV0KCkgbGF5b3V0OiAnZ3JpZCcgfCAnbGlzdCcgPSAnZ3JpZCdcbiAgX3ZpZXdQZXJtaXNzaW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiAgQElucHV0KClcbiAgZ2V0IHZpZXdQZXJtaXNzaW9uKCk6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdmlld1Blcm1pc3Npb24kLmdldFZhbHVlKClcbiAgfVxuICBzZXQgdmlld1Blcm1pc3Npb24odmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdmlld1Blcm1pc3Npb24kLm5leHQodmFsdWUpXG4gIH1cbiAgQElucHV0KCkgZWRpdFBlcm1pc3Npb246IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGRlbGV0ZVBlcm1pc3Npb246IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGRlbGV0ZUFjdGlvblZpc2libGVGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGRlbGV0ZUFjdGlvbkVuYWJsZWRGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHZpZXdBY3Rpb25WaXNpYmxlRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSB2aWV3QWN0aW9uRW5hYmxlZEZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZWRpdEFjdGlvblZpc2libGVGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGVkaXRBY3Rpb25FbmFibGVkRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSB2aWV3TWVudUl0ZW1LZXk6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBlZGl0TWVudUl0ZW1LZXk6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBkZWxldGVNZW51SXRlbUtleTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHBhZ2luYXRvciA9IHRydWVcbiAgQElucHV0KCkgcGFnZSA9IDBcbiAgY29sdW1uVGVtcGxhdGVzJDogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4+IHwgdW5kZWZpbmVkXG4gIF9jb2x1bW5zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0YVRhYmxlQ29sdW1uW10+KFtdKVxuICBASW5wdXQoKVxuICBnZXQgY29sdW1ucygpOiBEYXRhVGFibGVDb2x1bW5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgY29sdW1ucyh2YWx1ZTogRGF0YVRhYmxlQ29sdW1uW10pIHtcbiAgICB0aGlzLl9jb2x1bW5zJC5uZXh0KHZhbHVlKVxuICAgIGNvbnN0IG9icyA9IHZhbHVlLm1hcCgoYykgPT4gdGhpcy5nZXRUZW1wbGF0ZShjKSlcbiAgICB0aGlzLmNvbHVtblRlbXBsYXRlcyQgPSBjb21iaW5lTGF0ZXN0KG9icykucGlwZShcbiAgICAgIG1hcCgodmFsdWVzKSA9PiBPYmplY3QuZnJvbUVudHJpZXModmFsdWUubWFwKChjLCBpKSA9PiBbYy5pZCwgdmFsdWVzW2ldXSkpKSxcbiAgICAgIGRlYm91bmNlVGltZSg1MClcbiAgICApXG4gIH1cbiAgQElucHV0KCkgbmFtZSA9ICcnXG4gIHRvdGFsUmVjb3Jkc09uU2VydmVyID0gaW5wdXQ8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG4gIEBJbnB1dCgpIGN1cnJlbnRQYWdlU2hvd2luZ0tleSA9ICdPQ1hfREFUQV9UQUJMRS5TSE9XSU5HJ1xuICBASW5wdXQoKSBjdXJyZW50UGFnZVNob3dpbmdXaXRoVG90YWxPblNlcnZlcktleSA9ICdPQ1hfREFUQV9UQUJMRS5TSE9XSU5HX1dJVEhfVE9UQUxfT05fU0VSVkVSJ1xuICBwYXJhbXM9IGNvbXB1dGVkKCgpID0+IHsgICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRQYWdlOiAne2N1cnJlbnRQYWdlfScsXG4gICAgICB0b3RhbFBhZ2VzOiAne3RvdGFsUGFnZXN9JyxcbiAgICAgIHJvd3M6ICd7cm93c30nLFxuICAgICAgZmlyc3Q6ICd7Zmlyc3R9JyxcbiAgICAgIGxhc3Q6ICd7bGFzdH0nLFxuICAgICAgdG90YWxSZWNvcmRzOiAne3RvdGFsUmVjb3Jkc30nLFxuICAgICAgdG90YWxSZWNvcmRzT25TZXJ2ZXI6IHRoaXMudG90YWxSZWNvcmRzT25TZXJ2ZXIoKVxuICAgIH1cbiAgfSlcblxuICBfZGF0YSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJvd0xpc3RHcmlkRGF0YVtdPihbXSlcbiAgQElucHV0KClcbiAgZ2V0IGRhdGEoKTogUm93TGlzdEdyaWREYXRhW10ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IGRhdGEodmFsdWU6IFJvd0xpc3RHcmlkRGF0YVtdKSB7XG4gICAgIXRoaXMuX2RhdGEkLmdldFZhbHVlKCkubGVuZ3RoID8/IHRoaXMucmVzZXRQYWdlKClcbiAgICB0aGlzLl9vcmlnaW5hbERhdGEgPSBbLi4udmFsdWVdXG4gICAgdGhpcy5fZGF0YSQubmV4dChbLi4udmFsdWVdKVxuXG4gICAgY29uc3QgY3VycmVudFJlc3VsdHMgPSB2YWx1ZS5sZW5ndGhcbiAgICBjb25zdCBuZXdTdGF0dXMgPVxuICAgICAgY3VycmVudFJlc3VsdHMgPT09IDAgPyAnT0NYX0RBVEFfTElTVF9HUklELk5PX1NFQVJDSF9SRVNVTFRTX0ZPVU5EJyA6ICdPQ1hfREFUQV9MSVNUX0dSSUQuU0VBUkNIX1JFU1VMVFNfRk9VTkQnXG5cbiAgICBmaXJzdFZhbHVlRnJvbSh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KG5ld1N0YXR1cywgeyByZXN1bHRzOiBjdXJyZW50UmVzdWx0cyB9KSkudGhlbigodHJhbnNsYXRlZFRleHQ6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKHRyYW5zbGF0ZWRUZXh0KVxuICAgIH0pXG4gIH1cblxuICBfZmlsdGVycyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZpbHRlcltdPihbXSlcbiAgQElucHV0KClcbiAgZ2V0IGZpbHRlcnMoKTogRmlsdGVyW10ge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJzJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IGZpbHRlcnModmFsdWU6IEZpbHRlcltdKSB7XG4gICAgIXRoaXMuX2ZpbHRlcnMkLmdldFZhbHVlKCkubGVuZ3RoID8/IHRoaXMucmVzZXRQYWdlKClcbiAgICB0aGlzLl9maWx0ZXJzJC5uZXh0KHZhbHVlKVxuICB9XG4gIF9vcmlnaW5hbERhdGE6IFJvd0xpc3RHcmlkRGF0YVtdID0gW11cbiAgX3NvcnREaXJlY3Rpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhU29ydERpcmVjdGlvbj4oRGF0YVNvcnREaXJlY3Rpb24uTk9ORSlcbiAgQElucHV0KClcbiAgZ2V0IHNvcnREaXJlY3Rpb24oKTogRGF0YVNvcnREaXJlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9zb3J0RGlyZWN0aW9uJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHNvcnREaXJlY3Rpb24odmFsdWU6IERhdGFTb3J0RGlyZWN0aW9uKSB7XG4gICAgaWYgKHZhbHVlID09PSBEYXRhU29ydERpcmVjdGlvbi5OT05FKSB7XG4gICAgICB0aGlzLl9kYXRhJC5uZXh0KFsuLi50aGlzLl9vcmlnaW5hbERhdGFdKVxuICAgIH1cbiAgICB0aGlzLl9zb3J0RGlyZWN0aW9uJC5uZXh0KHZhbHVlKVxuICB9XG4gIF9zb3J0RmllbGQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKVxuICBASW5wdXQoKVxuICBnZXQgc29ydEZpZWxkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXM/Ll9zb3J0RmllbGQkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgc29ydEZpZWxkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zb3J0RmllbGQkLm5leHQodmFsdWUpXG4gIH1cblxuICBASW5wdXQoKSBncmlkSXRlbVN1YnRpdGxlTGluZXNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdncmlkSXRlbVN1YnRpdGxlTGluZXMnKSBncmlkSXRlbVN1YnRpdGxlTGluZXNDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfZ3JpZEl0ZW1TdWJ0aXRsZUxpbmVzKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdyaWRJdGVtU3VidGl0bGVMaW5lc1RlbXBsYXRlIHx8IHRoaXMuZ3JpZEl0ZW1TdWJ0aXRsZUxpbmVzQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgbGlzdEl0ZW1TdWJ0aXRsZUxpbmVzVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnbGlzdEl0ZW1TdWJ0aXRsZUxpbmVzJykgbGlzdEl0ZW1TdWJ0aXRsZUxpbmVzQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2xpc3RJdGVtU3VidGl0bGVMaW5lcygpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5saXN0SXRlbVN1YnRpdGxlTGluZXNUZW1wbGF0ZSB8fCB0aGlzLmxpc3RJdGVtU3VidGl0bGVMaW5lc0NoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIEBJbnB1dCgpIGxpc3RJdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnbGlzdEl0ZW0nKSBsaXN0SXRlbUNoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9saXN0SXRlbSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5saXN0SXRlbVRlbXBsYXRlIHx8IHRoaXMubGlzdEl0ZW1DaGlsZFRlbXBsYXRlXG4gIH1cblxuICBASW5wdXQoKSBncmlkSXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ2dyaWRJdGVtJykgZ3JpZEl0ZW1DaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfZ3JpZEl0ZW0oKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZEl0ZW1UZW1wbGF0ZSB8fCB0aGlzLmdyaWRJdGVtQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgbGlzdFZhbHVlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnbGlzdFZhbHVlJykgbGlzdFZhbHVlQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2xpc3RWYWx1ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5saXN0VmFsdWVUZW1wbGF0ZSB8fCB0aGlzLmxpc3RWYWx1ZUNoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uS2V5TGlzdFZhbHVlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgndHJhbnNsYXRpb25LZXlMaXN0VmFsdWUnKSB0cmFuc2xhdGlvbktleUxpc3RWYWx1ZUNoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF90cmFuc2xhdGlvbktleUxpc3RWYWx1ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvbktleUxpc3RWYWx1ZVRlbXBsYXRlIHx8IHRoaXMudHJhbnNsYXRpb25LZXlMaXN0VmFsdWVDaGlsZFRlbXBsYXRlXG4gIH1cblxuICBASW5wdXQoKSBudW1iZXJMaXN0VmFsdWVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdudW1iZXJMaXN0VmFsdWUnKSBudW1iZXJMaXN0VmFsdWVDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfbnVtYmVyTGlzdFZhbHVlKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm51bWJlckxpc3RWYWx1ZVRlbXBsYXRlIHx8IHRoaXMubnVtYmVyTGlzdFZhbHVlQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgcmVsYXRpdmVEYXRlTGlzdFZhbHVlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgncmVsYXRpdmVEYXRlTGlzdFZhbHVlJykgcmVsYXRpdmVEYXRlTGlzdFZhbHVlQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3JlbGF0aXZlRGF0ZUxpc3RWYWx1ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWxhdGl2ZURhdGVMaXN0VmFsdWVUZW1wbGF0ZSB8fCB0aGlzLnJlbGF0aXZlRGF0ZUxpc3RWYWx1ZUNoaWxkVGVtcGxhdGVcbiAgfVxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGFuZCBpbnN0ZWFkIHRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgb2YgYSBzcGVjaWZpYyBjb2x1bW5cbiAgICogdXNlIHRoZSBuZXcgYXBwcm9hY2ggaW5zdGVhZCBieSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uIGNvbHVtbiBpZCArIElkTGlzdFZhbHVlXG4gICAqIGUuZy4gZm9yIGEgY29sdW1uIHdpdGggdGhlIGlkICdzdGF0dXMnIHVzZSBwVGVtcGxhdGU9XCJzdGF0dXNJZExpc3RWYWx1ZVwiXG4gICAqL1xuICBASW5wdXQoKSBjdXN0b21MaXN0VmFsdWVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGFuZCBpbnN0ZWFkIHRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgb2YgYSBzcGVjaWZpYyBjb2x1bW5cbiAgICogdXNlIHRoZSBuZXcgYXBwcm9hY2ggaW5zdGVhZCBieSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uIGNvbHVtbiBpZCArIElkTGlzdFZhbHVlXG4gICAqIGUuZy4gZm9yIGEgY29sdW1uIHdpdGggdGhlIGlkICdzdGF0dXMnIHVzZSBwVGVtcGxhdGU9XCJzdGF0dXNJZExpc3RWYWx1ZVwiXG4gICAqL1xuICBAQ29udGVudENoaWxkKCdjdXN0b21MaXN0VmFsdWUnKSBjdXN0b21MaXN0VmFsdWVDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfY3VzdG9tTGlzdFZhbHVlKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmN1c3RvbUxpc3RWYWx1ZVRlbXBsYXRlIHx8IHRoaXMuY3VzdG9tTGlzdFZhbHVlQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgc3RyaW5nTGlzdFZhbHVlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnc3RyaW5nTGlzdFZhbHVlJykgc3RyaW5nTGlzdFZhbHVlQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3N0cmluZ0xpc3RWYWx1ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zdHJpbmdMaXN0VmFsdWVUZW1wbGF0ZSB8fCB0aGlzLnN0cmluZ0xpc3RWYWx1ZUNoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIEBJbnB1dCgpIGRhdGVMaXN0VmFsdWVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdkYXRlTGlzdFZhbHVlJykgZGF0ZUxpc3RWYWx1ZUNoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9kYXRlTGlzdFZhbHVlKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmRhdGVMaXN0VmFsdWVUZW1wbGF0ZSB8fCB0aGlzLmRhdGVMaXN0VmFsdWVDaGlsZFRlbXBsYXRlXG4gIH1cblxuICBpbmxpbmVMaXN0QWN0aW9ucyQ6IE9ic2VydmFibGU8RGF0YUFjdGlvbltdPlxuICBvdmVyZmxvd0xpc3RBY3Rpb25zJDogT2JzZXJ2YWJsZTxEYXRhQWN0aW9uW10+XG4gIG92ZXJmbG93TGlzdE1lbnVJdGVtcyQ6IE9ic2VydmFibGU8TWVudUl0ZW1bXT5cbiAgY3VycmVudE1lbnVSb3ckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSb3cgfCBudWxsPihudWxsKVxuICBfYWRkaXRpb25hbEFjdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhQWN0aW9uW10+KFtdKVxuICBASW5wdXQoKVxuICBnZXQgYWRkaXRpb25hbEFjdGlvbnMoKTogRGF0YUFjdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkaXRpb25hbEFjdGlvbnMkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgYWRkaXRpb25hbEFjdGlvbnModmFsdWU6IERhdGFBY3Rpb25bXSkge1xuICAgIHRoaXMuX2FkZGl0aW9uYWxBY3Rpb25zJC5uZXh0KHZhbHVlKVxuICB9XG5cbiAgQE91dHB1dCgpIHZpZXdJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxMaXN0R3JpZERhdGE+KClcbiAgQE91dHB1dCgpIGVkaXRJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxMaXN0R3JpZERhdGE+KClcbiAgQE91dHB1dCgpIGRlbGV0ZUl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPExpc3RHcmlkRGF0YT4oKVxuICBAT3V0cHV0KCkgcGFnZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKVxuICBAT3V0cHV0KCkgcGFnZVNpemVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KClcbiAgQE91dHB1dCgpIGNvbXBvbmVudFN0YXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YUxpc3RHcmlkQ29tcG9uZW50U3RhdGU+KClcblxuICBnZXQgdmlld0l0ZW1PYnNlcnZlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBkdiA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdEYXRhVmlld0NvbXBvbmVudCcsIG51bGwpXG4gICAgcmV0dXJuIGR2Py52aWV3SXRlbU9ic2VydmVkIHx8IGR2Py52aWV3SXRlbS5vYnNlcnZlZCB8fCB0aGlzLnZpZXdJdGVtLm9ic2VydmVkXG4gIH1cbiAgZ2V0IGVkaXRJdGVtT2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHYgPSB0aGlzLmluamVjdG9yLmdldCgnRGF0YVZpZXdDb21wb25lbnQnLCBudWxsKVxuICAgIHJldHVybiBkdj8uZWRpdEl0ZW1PYnNlcnZlZCB8fCBkdj8uZWRpdEl0ZW0ub2JzZXJ2ZWQgfHwgdGhpcy5lZGl0SXRlbS5vYnNlcnZlZFxuICB9XG4gIGdldCBkZWxldGVJdGVtT2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHYgPSB0aGlzLmluamVjdG9yLmdldCgnRGF0YVZpZXdDb21wb25lbnQnLCBudWxsKVxuICAgIHJldHVybiBkdj8uZGVsZXRlSXRlbU9ic2VydmVkIHx8IGR2Py5kZWxldGVJdGVtLm9ic2VydmVkIHx8IHRoaXMuZGVsZXRlSXRlbS5vYnNlcnZlZFxuICB9XG5cbiAgZ2V0IHNvcnREaXJlY3Rpb25OdW1iZXIoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5zb3J0RGlyZWN0aW9uID09PSBEYXRhU29ydERpcmVjdGlvbi5BU0NFTkRJTkcpIHJldHVybiAxXG4gICAgaWYgKHRoaXMuc29ydERpcmVjdGlvbiA9PT0gRGF0YVNvcnREaXJlY3Rpb24uREVTQ0VORElORykgcmV0dXJuIC0xXG4gICAgcmV0dXJuIDBcbiAgfVxuXG4gIGdyaWRNZW51SXRlbXMkOiBPYnNlcnZhYmxlPE1lbnVJdGVtW10+XG4gIF9zZWxlY3RlZEl0ZW0kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMaXN0R3JpZERhdGEgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiAgb2JzZXJ2ZWRPdXRwdXRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKVxuXG4gIGRpc3BsYXllZEl0ZW1zJDogT2JzZXJ2YWJsZTx1bmtub3duW10+IHwgdW5kZWZpbmVkXG4gIGZhbGxiYWNrSW1hZ2VQYXRoJCE6IE9ic2VydmFibGU8c3RyaW5nPlxuXG4gIHRlbXBsYXRlcyQ6IEJlaGF2aW9yU3ViamVjdDxRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpXG4gIEBDb250ZW50Q2hpbGRyZW4oUHJpbWVUZW1wbGF0ZSlcbiAgc2V0IHRlbXBsYXRlcyh2YWx1ZTogUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy50ZW1wbGF0ZXMkLm5leHQodmFsdWUpXG4gIH1cblxuICB2aWV3VGVtcGxhdGVzJDogQmVoYXZpb3JTdWJqZWN0PFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZClcbiAgQFZpZXdDaGlsZHJlbihQcmltZVRlbXBsYXRlKVxuICBzZXQgdmlld1RlbXBsYXRlcyh2YWx1ZTogUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy52aWV3VGVtcGxhdGVzJC5uZXh0KHZhbHVlKVxuICB9XG5cbiAgcGFyZW50VGVtcGxhdGVzJDogQmVoYXZpb3JTdWJqZWN0PFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IG51bGwgfCB1bmRlZmluZWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCBudWxsIHwgdW5kZWZpbmVkXG4gID4odW5kZWZpbmVkKVxuICBASW5wdXQoKVxuICBzZXQgcGFyZW50VGVtcGxhdGVzKHZhbHVlOiBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5wYXJlbnRUZW1wbGF0ZXMkLm5leHQodmFsdWUpXG4gIH1cblxuICBjb2x1bW5UeXBlID0gQ29sdW1uVHlwZVxuICB0ZW1wbGF0ZXNPYnNlcnZhYmxlczogUmVjb3JkPHN0cmluZywgT2JzZXJ2YWJsZTxUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4+ID0ge31cbiAgaGFzVmlld1Blcm1pc3Npb24kOiBPYnNlcnZhYmxlPGJvb2xlYW4+XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChMT0NBTEVfSUQpIGxvY2FsZTogc3RyaW5nLFxuICAgIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIGFwcFN0YXRlU2VydmljZTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbGl2ZUFubm91bmNlcjogTGl2ZUFubm91bmNlcixcbiAgICBASW5qZWN0KEhBU19QRVJNSVNTSU9OX0NIRUNLRVIpIEBPcHRpb25hbCgpIHByaXZhdGUgaGFzUGVybWlzc2lvbkNoZWNrZXI/OiBIYXNQZXJtaXNzaW9uQ2hlY2tlclxuICApIHtcbiAgICBzdXBlcihsb2NhbGUsIHRyYW5zbGF0ZVNlcnZpY2UpXG4gICAgdGhpcy5uYW1lID0gdGhpcy5uYW1lIHx8IHRoaXMucm91dGVyLnVybC5yZXBsYWNlKC9bXkEtWmEtejAtOV0vLCAnXycpXG4gICAgdGhpcy5mYWxsYmFja0ltYWdlUGF0aCQgPSB0aGlzLmFwcFN0YXRlU2VydmljZS5jdXJyZW50TWZlJC5waXBlKFxuICAgICAgbWFwKChjdXJyZW50TWZlKSA9PiB0aGlzLmdldEZhbGxiYWNrSW1hZ2VQYXRoKGN1cnJlbnRNZmUpKVxuICAgIClcbiAgICB0aGlzLmRpc3BsYXllZFBhZ2VTaXplcyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuX3BhZ2VTaXplcyQsXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdPQ1hfREFUQV9UQUJMRS5BTEwnKSxcbiAgICAgIHRoaXMuX3Nob3dBbGxPcHRpb24kLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtwYWdlU2l6ZXMsIHRyYW5zbGF0aW9uLCBzaG93QWxsT3B0aW9uXSkgPT5cbiAgICAgICAgc2hvd0FsbE9wdGlvbiA/IHBhZ2VTaXplcy5jb25jYXQoeyBzaG93QWxsOiB0cmFuc2xhdGlvbiB9KSA6IHBhZ2VTaXplc1xuICAgICAgKVxuICAgIClcbiAgICB0aGlzLmRpc3BsYXllZFBhZ2VTaXplJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX3BhZ2VTaXplJCwgdGhpcy5fcGFnZVNpemVzJF0pLnBpcGUoXG4gICAgICBtYXAoKFtwYWdlU2l6ZSwgcGFnZVNpemVzXSkgPT4gcGFnZVNpemUgPz8gcGFnZVNpemVzLmZpbmQoKHZhbCk6IHZhbCBpcyBudW1iZXIgPT4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpID8/IDUwKVxuICAgIClcbiAgICB0aGlzLmlubGluZUxpc3RBY3Rpb25zJCA9IHRoaXMuX2FkZGl0aW9uYWxBY3Rpb25zJC5waXBlKFxuICAgICAgbWFwKChhY3Rpb25zKSA9PiBhY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiAhYWN0aW9uLnNob3dBc092ZXJmbG93KSlcbiAgICApXG4gICAgdGhpcy5vdmVyZmxvd0xpc3RBY3Rpb25zJCA9IHRoaXMuX2FkZGl0aW9uYWxBY3Rpb25zJC5waXBlKFxuICAgICAgbWFwKChhY3Rpb25zKSA9PiBhY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24uc2hvd0FzT3ZlcmZsb3cpKVxuICAgIClcbiAgICB0aGlzLm92ZXJmbG93TGlzdE1lbnVJdGVtcyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLm92ZXJmbG93TGlzdEFjdGlvbnMkLCB0aGlzLmN1cnJlbnRNZW51Um93JF0pLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKFthY3Rpb25zLCByb3ddKSA9PlxuICAgICAgICB0aGlzLmZpbHRlckFjdGlvbnNCYXNlZE9uUGVybWlzc2lvbnMoYWN0aW9ucykucGlwZShcbiAgICAgICAgICBtYXAoKHBlcm1pdHRlZEFjdGlvbnMpID0+ICh7IGFjdGlvbnM6IHBlcm1pdHRlZEFjdGlvbnMsIHJvdzogcm93IH0pKVxuICAgICAgICApXG4gICAgICApLFxuICAgICAgbWVyZ2VNYXAoKHsgYWN0aW9ucywgcm93IH0pID0+IHtcbiAgICAgICAgaWYgKGFjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKFtdKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KFsuLi5hY3Rpb25zLm1hcCgoYSkgPT4gYS5sYWJlbEtleSB8fCAnJyldKS5waXBlKFxuICAgICAgICAgIG1hcCgodHJhbnNsYXRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9ucy5tYXAoKGEpID0+ICh7XG4gICAgICAgICAgICAgIGxhYmVsOiB0cmFuc2xhdGlvbnNbYS5sYWJlbEtleSB8fCAnJ10sXG4gICAgICAgICAgICAgIGljb246IGEuaWNvbixcbiAgICAgICAgICAgICAgc3R5bGVDbGFzczogKGEuY2xhc3NlcyB8fCBbXSkuam9pbignICcpLFxuICAgICAgICAgICAgICBkaXNhYmxlZDogYS5kaXNhYmxlZCB8fCAoISFhLmFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhdGhpcy5maWVsZElzVHJ1dGh5KHJvdywgYS5hY3Rpb25FbmFibGVkRmllbGQpKSxcbiAgICAgICAgICAgICAgdmlzaWJsZTogIWEuYWN0aW9uVmlzaWJsZUZpZWxkIHx8IHRoaXMuZmllbGRJc1RydXRoeShyb3csIGEuYWN0aW9uVmlzaWJsZUZpZWxkKSxcbiAgICAgICAgICAgICAgY29tbWFuZDogKCkgPT4gYS5jYWxsYmFjayhyb3cpLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICApXG4gICAgdGhpcy5oYXNWaWV3UGVybWlzc2lvbiQgPSB0aGlzLl92aWV3UGVybWlzc2lvbiQucGlwZShcbiAgICAgIG1hcCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgICBpZiAoIXBlcm1pc3Npb24pIHJldHVybiBbXVxuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwZXJtaXNzaW9uKSA/IHBlcm1pc3Npb24gOiBbcGVybWlzc2lvbl1cbiAgICAgIH0pLFxuICAgICAgc3dpdGNoTWFwKChwZXJtaXNzaW9uQXJyYXkpID0+IHtcbiAgICAgICAgaWYgKHBlcm1pc3Npb25BcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gb2YodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRQZXJtaXNzaW9ucygpLnBpcGUobWFwKChwZXJtaXNzaW9ucykgPT4gcGVybWlzc2lvbkFycmF5LmV2ZXJ5KChwKSA9PiBwZXJtaXNzaW9ucy5pbmNsdWRlcyhwKSkpKVxuICAgICAgfSlcbiAgICApXG5cbiAgICB0aGlzLmdyaWRNZW51SXRlbXMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmdldFBlcm1pc3Npb25zKCksXG4gICAgICB0aGlzLl9hZGRpdGlvbmFsQWN0aW9ucyQuYXNPYnNlcnZhYmxlKCksXG4gICAgICB0aGlzLl9zZWxlY3RlZEl0ZW0kLmFzT2JzZXJ2YWJsZSgpLFxuICAgICAgdGhpcy5vYnNlcnZlZE91dHB1dHMkLmFzT2JzZXJ2YWJsZSgpLFxuICAgIF0pLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKFtwZXJtaXNzaW9ucywgYWRkaXRpb25hbEFjdGlvbnMsIHNlbGVjdGVkSXRlbSwgX29ic2VydmVkT3V0cHV0c10pID0+XG4gICAgICAgIHRoaXMuZmlsdGVyQWN0aW9uc0Jhc2VkT25QZXJtaXNzaW9ucyhhZGRpdGlvbmFsQWN0aW9ucywgcGVybWlzc2lvbnMpLnBpcGUoXG4gICAgICAgICAgbWFwKChwZXJtaXR0ZWRBY3Rpb25zKSA9PiAoeyBwZXJtaXNzaW9ucywgYWRkaXRpb25hbEFjdGlvbnM6IHBlcm1pdHRlZEFjdGlvbnMsIHNlbGVjdGVkSXRlbSB9KSlcbiAgICAgICAgKVxuICAgICAgKSxcbiAgICAgIHN3aXRjaE1hcCgoeyBwZXJtaXNzaW9ucywgYWRkaXRpb25hbEFjdGlvbnMsIHNlbGVjdGVkSXRlbSB9KSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEdyaWRBY3Rpb25zVHJhbnNsYXRpb25zKGFkZGl0aW9uYWxBY3Rpb25zLCBwZXJtaXNzaW9ucykucGlwZShcbiAgICAgICAgICBtYXAoKHRyYW5zbGF0aW9ucykgPT4gKHsgcGVybWlzc2lvbnMsIGFkZGl0aW9uYWxBY3Rpb25zLCBzZWxlY3RlZEl0ZW0sIHRyYW5zbGF0aW9ucyB9KSlcbiAgICAgICAgKVxuICAgICAgfSksXG4gICAgICBtYXAoKHsgcGVybWlzc2lvbnMsIGFkZGl0aW9uYWxBY3Rpb25zLCBzZWxlY3RlZEl0ZW0sIHRyYW5zbGF0aW9ucyB9KSA9PlxuICAgICAgICB0aGlzLm1hcEdyaWRNZW51SXRlbXMocGVybWlzc2lvbnMsIGFkZGl0aW9uYWxBY3Rpb25zLCBzZWxlY3RlZEl0ZW0sIHRyYW5zbGF0aW9ucylcbiAgICAgIClcbiAgICApXG4gIH1cblxuICBuZ0RvQ2hlY2soKTogdm9pZCB7XG4gICAgY29uc3Qgb2JzZXJ2ZWRPdXRwdXRzID0gPGFueT50aGlzLnZpZXdJdGVtLm9ic2VydmVkICsgPGFueT50aGlzLmRlbGV0ZUl0ZW0ub2JzZXJ2ZWQgKyA8YW55PnRoaXMuZWRpdEl0ZW0ub2JzZXJ2ZWRcbiAgICBpZiAodGhpcy5vYnNlcnZlZE91dHB1dHMkLmdldFZhbHVlKCkgIT09IG9ic2VydmVkT3V0cHV0cykge1xuICAgICAgdGhpcy5vYnNlcnZlZE91dHB1dHMkLm5leHQob2JzZXJ2ZWRPdXRwdXRzKVxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheWVkSXRlbXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5fZGF0YSQsIHRoaXMuX2ZpbHRlcnMkLCB0aGlzLl9zb3J0RmllbGQkLCB0aGlzLl9zb3J0RGlyZWN0aW9uJF0pLnBpcGUoXG4gICAgICBtZXJnZU1hcCgocGFyYW1zKSA9PiB0aGlzLnRyYW5zbGF0ZUl0ZW1zKHBhcmFtcywgdGhpcy5jb2x1bW5zLCB0aGlzLmNsaWVudFNpZGVGaWx0ZXJpbmcsIHRoaXMuY2xpZW50U2lkZVNvcnRpbmcpKSxcbiAgICAgIG1hcCgocGFyYW1zKSA9PiB0aGlzLmZpbHRlckl0ZW1zKHBhcmFtcywgdGhpcy5jbGllbnRTaWRlRmlsdGVyaW5nKSksXG4gICAgICBtYXAoKHBhcmFtcykgPT4gdGhpcy5zb3J0SXRlbXMocGFyYW1zLCB0aGlzLmNvbHVtbnMsIHRoaXMuY2xpZW50U2lkZVNvcnRpbmcpKSxcbiAgICAgIG1hcCgoW2l0ZW1zXSkgPT4gaXRlbXMpXG4gICAgKVxuXG4gICAgdGhpcy5lbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKClcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLnRlbXBsYXRlcyQudmFsdWU/LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHN3aXRjaCAoaXRlbS5nZXRUeXBlKCkpIHtcbiAgICAgICAgY2FzZSAnbGlzdFZhbHVlJzpcbiAgICAgICAgICB0aGlzLmxpc3RWYWx1ZUNoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAndHJhbnNsYXRpb25LZXlMaXN0VmFsdWUnOlxuICAgICAgICAgIHRoaXMudHJhbnNsYXRpb25LZXlMaXN0VmFsdWVDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ251bWJlckxpc3RWYWx1ZSc6XG4gICAgICAgICAgdGhpcy5udW1iZXJMaXN0VmFsdWVDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3JlbGF0aXZlRGF0ZUxpc3RWYWx1ZSc6XG4gICAgICAgICAgdGhpcy5yZWxhdGl2ZURhdGVMaXN0VmFsdWVDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2N1c3RvbUxpc3RWYWx1ZSc6XG4gICAgICAgICAgdGhpcy5jdXN0b21MaXN0VmFsdWVDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3N0cmluZ0xpc3RWYWx1ZSc6XG4gICAgICAgICAgdGhpcy5zdHJpbmdMaXN0VmFsdWVDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2RhdGVMaXN0VmFsdWUnOlxuICAgICAgICAgIHRoaXMuZGF0ZUxpc3RWYWx1ZUNoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25EZWxldGVSb3coZWxlbWVudDogTGlzdEdyaWREYXRhKSB7XG4gICAgdGhpcy5kZWxldGVJdGVtLmVtaXQoZWxlbWVudClcbiAgfVxuXG4gIG9uVmlld1JvdyhlbGVtZW50OiBMaXN0R3JpZERhdGEpIHtcbiAgICB0aGlzLnZpZXdJdGVtLmVtaXQoZWxlbWVudClcbiAgfVxuXG4gIG9uRWRpdFJvdyhlbGVtZW50OiBMaXN0R3JpZERhdGEpIHtcbiAgICB0aGlzLmVkaXRJdGVtLmVtaXQoZWxlbWVudClcbiAgfVxuXG4gIGltZ0Vycm9yKGl0ZW06IExpc3RHcmlkRGF0YSkge1xuICAgIGl0ZW0uaW1hZ2VQYXRoID0gJydcbiAgfVxuXG4gIGdldEZhbGxiYWNrSW1hZ2VQYXRoKG1mZUluZm86IE1mZUluZm8pIHtcbiAgICByZXR1cm4gbWZlSW5mbz8ucmVtb3RlQmFzZVVybFxuICAgICAgPyBgJHttZmVJbmZvLnJlbW90ZUJhc2VVcmx9L29uZWN4LXBvcnRhbC1saWIvYXNzZXRzL2ltYWdlcy8ke3RoaXMuZmFsbGJhY2tJbWFnZX1gXG4gICAgICA6IGAuL29uZWN4LXBvcnRhbC1saWIvYXNzZXRzL2ltYWdlcy8ke3RoaXMuZmFsbGJhY2tJbWFnZX1gXG4gIH1cblxuICBzZXRTZWxlY3RlZEl0ZW0oaXRlbTogTGlzdEdyaWREYXRhKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWRJdGVtJC5uZXh0KGl0ZW0pXG4gIH1cblxuICByZXNvbHZlRmllbGREYXRhKG9iamVjdDogYW55LCBrZXk6IGFueSkge1xuICAgIHJldHVybiBPYmplY3RVdGlscy5yZXNvbHZlRmllbGREYXRhKG9iamVjdCwga2V5KVxuICB9XG5cbiAgZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZChzdGF0ZTogRGF0YUxpc3RHcmlkQ29tcG9uZW50U3RhdGUgPSB7fSkge1xuICAgIHRoaXMuZGlzcGxheWVkUGFnZVNpemUkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChwYWdlU2l6ZSkgPT4ge1xuICAgICAgdGhpcy5jb21wb25lbnRTdGF0ZUNoYW5nZWQuZW1pdCh7XG4gICAgICAgIHBhZ2VTaXplLFxuICAgICAgICBhY3RpdmVQYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgb25QYWdlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBwYWdlID0gZXZlbnQuZmlyc3QgLyBldmVudC5yb3dzXG4gICAgdGhpcy5wYWdlID0gcGFnZVxuICAgIHRoaXMucGFnZVNpemUgPSBldmVudC5yb3dzXG4gICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KHBhZ2UpXG4gICAgdGhpcy5wYWdlU2l6ZUNoYW5nZWQuZW1pdChldmVudC5yb3dzKVxuICAgIHRoaXMuZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZCh7XG4gICAgICBhY3RpdmVQYWdlOiBwYWdlLFxuICAgICAgcGFnZVNpemU6IGV2ZW50LnJvd3MsXG4gICAgfSlcbiAgfVxuXG4gIHJlc2V0UGFnZSgpIHtcbiAgICB0aGlzLnBhZ2UgPSAwXG4gICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KHRoaXMucGFnZSlcbiAgICB0aGlzLmVtaXRDb21wb25lbnRTdGF0ZUNoYW5nZWQoKVxuICB9XG5cbiAgZmllbGRJc1RydXRoeShvYmplY3Q6IGFueSwga2V5OiBhbnkpIHtcbiAgICByZXR1cm4gISF0aGlzLnJlc29sdmVGaWVsZERhdGEob2JqZWN0LCBrZXkpXG4gIH1cblxuICBoYXNWaXNpYmxlT3ZlcmZsb3dNZW51SXRlbXMocm93OiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5vdmVyZmxvd0xpc3RBY3Rpb25zJC5waXBlKFxuICAgICAgc3dpdGNoTWFwKChhY3Rpb25zKSA9PiB0aGlzLmZpbHRlckFjdGlvbnNCYXNlZE9uUGVybWlzc2lvbnMoYWN0aW9ucykpLFxuICAgICAgbWFwKChhY3Rpb25zKSA9PiBhY3Rpb25zLnNvbWUoKGEpID0+ICFhLmFjdGlvblZpc2libGVGaWVsZCB8fCB0aGlzLmZpZWxkSXNUcnV0aHkocm93LCBhLmFjdGlvblZpc2libGVGaWVsZCkpKVxuICAgIClcbiAgfVxuXG4gIHRvZ2dsZU92ZXJmbG93TWVudShldmVudDogTW91c2VFdmVudCwgbWVudTogTWVudSwgcm93OiBSb3cpIHtcbiAgICB0aGlzLmN1cnJlbnRNZW51Um93JC5uZXh0KHJvdylcbiAgICBtZW51LnRvZ2dsZShldmVudClcbiAgfVxuXG4gIGdldEZpbHRlcmVkQ29sdW1ucygpIHtcbiAgICBsZXQgaWRzOiBzdHJpbmdbXSA9IFsuLi4odGhpcy5zdWJ0aXRsZUxpbmVJZHMgPz8gW10pXVxuICAgIGlmICh0aGlzLnRpdGxlTGluZUlkKSB7XG4gICAgICBpZHMgPSBbdGhpcy50aXRsZUxpbmVJZCwgLi4uKHRoaXMuc3VidGl0bGVMaW5lSWRzID8/IFtdKV1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maWx0ZXIoKGMpID0+ICFpZHMuaW5jbHVkZXMoYy5pZCkpXG4gIH1cblxuICBmaW5kVGVtcGxhdGUodGVtcGxhdGVzOiBQcmltZVRlbXBsYXRlW10sIG5hbWVzOiBzdHJpbmdbXSk6IFByaW1lVGVtcGxhdGUgfCB1bmRlZmluZWQge1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBuYW1lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBuYW1lc1tpbmRleF1cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGVtcGxhdGVzLmZpbmQoKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZS5uYW1lID09PSBuYW1lKVxuICAgICAgaWYgKHRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBnZXRUZW1wbGF0ZShjb2x1bW46IERhdGFUYWJsZUNvbHVtbik6IE9ic2VydmFibGU8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMudGVtcGxhdGVzT2JzZXJ2YWJsZXNbY29sdW1uLmlkXSkge1xuICAgICAgdGhpcy50ZW1wbGF0ZXNPYnNlcnZhYmxlc1tjb2x1bW4uaWRdID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgIHRoaXMudGVtcGxhdGVzJCxcbiAgICAgICAgdGhpcy52aWV3VGVtcGxhdGVzJCxcbiAgICAgICAgdGhpcy5wYXJlbnRUZW1wbGF0ZXMkLFxuICAgICAgXSkucGlwZShcbiAgICAgICAgbWFwKChbdCwgdnQsIHB0XSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IFsuLi4odCA/PyBbXSksIC4uLih2dCA/PyBbXSksIC4uLihwdCA/PyBbXSldXG4gICAgICAgICAgY29uc3QgY29sdW1uVGVtcGxhdGUgPSB0ZW1wbGF0ZXMuZmluZCgodGVtcGxhdGUpID0+IHRlbXBsYXRlLm5hbWUgPT09IGNvbHVtbi5pZCArICdJZExpc3RWYWx1ZScpPy50ZW1wbGF0ZVxuICAgICAgICAgIGlmIChjb2x1bW5UZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbHVtblRlbXBsYXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIHN3aXRjaCAoY29sdW1uLmNvbHVtblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5EQVRFOlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVMaXN0VmFsdWUgPz9cbiAgICAgICAgICAgICAgICB0aGlzLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZXMsIFsnZGF0ZUxpc3RWYWx1ZScsICdkZWZhdWx0RGF0ZUxpc3RWYWx1ZSddKT8udGVtcGxhdGUgPz9cbiAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5OVU1CRVI6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdGhpcy5fbnVtYmVyTGlzdFZhbHVlID8/XG4gICAgICAgICAgICAgICAgdGhpcy5maW5kVGVtcGxhdGUodGVtcGxhdGVzLCBbJ251bWJlckxpc3RWYWx1ZScsICdkZWZhdWx0TnVtYmVyTGlzdFZhbHVlJ10pPy50ZW1wbGF0ZSA/P1xuICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLlJFTEFUSVZFX0RBVEU6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVsYXRpdmVEYXRlTGlzdFZhbHVlID8/XG4gICAgICAgICAgICAgICAgdGhpcy5maW5kVGVtcGxhdGUodGVtcGxhdGVzLCBbJ3JlbGF0aXZlRGF0ZUxpc3RWYWx1ZScsICdkZWZhdWx0UmVsYXRpdmVEYXRlTGlzdFZhbHVlJ10pPy50ZW1wbGF0ZSA/P1xuICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLlRSQU5TTEFUSU9OX0tFWTpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2xhdGlvbktleUxpc3RWYWx1ZSA/P1xuICAgICAgICAgICAgICAgIHRoaXMuZmluZFRlbXBsYXRlKHRlbXBsYXRlcywgWyd0cmFuc2xhdGlvbktleUxpc3RWYWx1ZScsICdkZWZhdWx0VHJhbnNsYXRpb25LZXlMaXN0VmFsdWUnXSk/LnRlbXBsYXRlID8/XG4gICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICBjYXNlIENvbHVtblR5cGUuQ1VTVE9NOlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRoaXMuX2N1c3RvbUxpc3RWYWx1ZSA/P1xuICAgICAgICAgICAgICAgIHRoaXMuZmluZFRlbXBsYXRlKHRlbXBsYXRlcywgWydjdXN0b21MaXN0VmFsdWUnLCAnZGVmYXVsdEN1c3RvbUxpc3RWYWx1ZSddKT8udGVtcGxhdGUgPz9cbiAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RyaW5nTGlzdFZhbHVlID8/XG4gICAgICAgICAgICAgICAgdGhpcy5maW5kVGVtcGxhdGUodGVtcGxhdGVzLCBbJ3N0cmluZ0xpc3RWYWx1ZScsICdkZWZhdWx0U3RyaW5nTGlzdFZhbHVlJ10pPy50ZW1wbGF0ZSA/P1xuICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVzT2JzZXJ2YWJsZXNbY29sdW1uLmlkXVxuICB9XG5cbiAgcHJpdmF0ZSBtYXBHcmlkTWVudUl0ZW1zKFxuICAgIHBlcm1pc3Npb25zOiBzdHJpbmdbXSxcbiAgICBhZGRpdGlvbmFsQWN0aW9uczogRGF0YUFjdGlvbltdLFxuICAgIHNlbGVjdGVkSXRlbTogTGlzdEdyaWREYXRhIHwgdW5kZWZpbmVkLFxuICAgIHRyYW5zbGF0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICApOiBNZW51SXRlbVtdIHtcbiAgICBsZXQgZGVsZXRlRGlzYWJsZWQgPSBmYWxzZVxuICAgIGxldCBlZGl0RGlzYWJsZWQgPSBmYWxzZVxuICAgIGxldCB2aWV3RGlzYWJsZWQgPSBmYWxzZVxuXG4gICAgbGV0IGRlbGV0ZVZpc2libGUgPSB0cnVlXG4gICAgbGV0IGVkaXRWaXNpYmxlID0gdHJ1ZVxuICAgIGxldCB2aWV3VmlzaWJsZSA9IHRydWVcblxuICAgIGlmIChzZWxlY3RlZEl0ZW0pIHtcbiAgICAgIHZpZXdEaXNhYmxlZCA9ICEhdGhpcy52aWV3QWN0aW9uRW5hYmxlZEZpZWxkICYmICF0aGlzLmZpZWxkSXNUcnV0aHkoc2VsZWN0ZWRJdGVtLCB0aGlzLnZpZXdBY3Rpb25FbmFibGVkRmllbGQpXG4gICAgICBlZGl0RGlzYWJsZWQgPSAhIXRoaXMuZWRpdEFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhdGhpcy5maWVsZElzVHJ1dGh5KHNlbGVjdGVkSXRlbSwgdGhpcy5lZGl0QWN0aW9uRW5hYmxlZEZpZWxkKVxuICAgICAgZGVsZXRlRGlzYWJsZWQgPVxuICAgICAgICAhIXRoaXMuZGVsZXRlQWN0aW9uRW5hYmxlZEZpZWxkICYmICF0aGlzLmZpZWxkSXNUcnV0aHkoc2VsZWN0ZWRJdGVtLCB0aGlzLmRlbGV0ZUFjdGlvbkVuYWJsZWRGaWVsZClcblxuICAgICAgdmlld1Zpc2libGUgPSAhdGhpcy52aWV3QWN0aW9uVmlzaWJsZUZpZWxkIHx8IHRoaXMuZmllbGRJc1RydXRoeShzZWxlY3RlZEl0ZW0sIHRoaXMudmlld0FjdGlvblZpc2libGVGaWVsZClcbiAgICAgIGVkaXRWaXNpYmxlID0gIXRoaXMuZWRpdEFjdGlvblZpc2libGVGaWVsZCB8fCB0aGlzLmZpZWxkSXNUcnV0aHkoc2VsZWN0ZWRJdGVtLCB0aGlzLmVkaXRBY3Rpb25WaXNpYmxlRmllbGQpXG4gICAgICBkZWxldGVWaXNpYmxlID0gIXRoaXMuZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkIHx8IHRoaXMuZmllbGRJc1RydXRoeShzZWxlY3RlZEl0ZW0sIHRoaXMuZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkKVxuICAgIH1cblxuICAgIGNvbnN0IG1lbnVJdGVtczogTWVudUl0ZW1bXSA9IFtdXG4gICAgY29uc3QgYXV0b21hdGlvbklkID0gJ2RhdGEtZ3JpZC1hY3Rpb24tYnV0dG9uJ1xuICAgIGNvbnN0IGF1dG9tYXRpb25JZEhpZGRlbiA9ICdkYXRhLWdyaWQtYWN0aW9uLWJ1dHRvbi1oaWRkZW4nXG4gICAgaWYgKHRoaXMuc2hvdWxkRGlzcGxheUFjdGlvbih0aGlzLnZpZXdQZXJtaXNzaW9uLCB0aGlzLnZpZXdJdGVtLCBwZXJtaXNzaW9ucykpIHtcbiAgICAgIG1lbnVJdGVtcy5wdXNoKHtcbiAgICAgICAgbGFiZWw6IHRyYW5zbGF0aW9uc1t0aGlzLnZpZXdNZW51SXRlbUtleSB8fCAnT0NYX0RBVEFfTElTVF9HUklELk1FTlUuVklFVyddLFxuICAgICAgICBpY29uOiBQcmltZUljb25zLkVZRSxcbiAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy52aWV3SXRlbS5lbWl0KHNlbGVjdGVkSXRlbSksXG4gICAgICAgIGRpc2FibGVkOiB2aWV3RGlzYWJsZWQsXG4gICAgICAgIHZpc2libGU6IHZpZXdWaXNpYmxlLFxuICAgICAgICBhdXRvbWF0aW9uSWQ6IHZpZXdWaXNpYmxlID8gYXV0b21hdGlvbklkIDogYXV0b21hdGlvbklkSGlkZGVuLFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvdWxkRGlzcGxheUFjdGlvbih0aGlzLmVkaXRQZXJtaXNzaW9uLCB0aGlzLmVkaXRJdGVtLCBwZXJtaXNzaW9ucykpIHtcbiAgICAgIG1lbnVJdGVtcy5wdXNoKHtcbiAgICAgICAgbGFiZWw6IHRyYW5zbGF0aW9uc1t0aGlzLmVkaXRNZW51SXRlbUtleSB8fCAnT0NYX0RBVEFfTElTVF9HUklELk1FTlUuRURJVCddLFxuICAgICAgICBpY29uOiBQcmltZUljb25zLlBFTkNJTCxcbiAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy5lZGl0SXRlbS5lbWl0KHNlbGVjdGVkSXRlbSksXG4gICAgICAgIGRpc2FibGVkOiBlZGl0RGlzYWJsZWQsXG4gICAgICAgIHZpc2libGU6IGVkaXRWaXNpYmxlLFxuICAgICAgICBhdXRvbWF0aW9uSWQ6IGVkaXRWaXNpYmxlID8gYXV0b21hdGlvbklkIDogYXV0b21hdGlvbklkSGlkZGVuLFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvdWxkRGlzcGxheUFjdGlvbih0aGlzLmRlbGV0ZVBlcm1pc3Npb24sIHRoaXMuZGVsZXRlSXRlbSwgcGVybWlzc2lvbnMpKSB7XG4gICAgICBtZW51SXRlbXMucHVzaCh7XG4gICAgICAgIGxhYmVsOiB0cmFuc2xhdGlvbnNbdGhpcy5kZWxldGVNZW51SXRlbUtleSB8fCAnT0NYX0RBVEFfTElTVF9HUklELk1FTlUuREVMRVRFJ10sXG4gICAgICAgIGljb246IFByaW1lSWNvbnMuVFJBU0gsXG4gICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMuZGVsZXRlSXRlbS5lbWl0KHNlbGVjdGVkSXRlbSksXG4gICAgICAgIGRpc2FibGVkOiBkZWxldGVEaXNhYmxlZCxcbiAgICAgICAgdmlzaWJsZTogZGVsZXRlVmlzaWJsZSxcbiAgICAgICAgYXV0b21hdGlvbklkOiBkZWxldGVWaXNpYmxlID8gYXV0b21hdGlvbklkIDogYXV0b21hdGlvbklkSGlkZGVuLFxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3QgdmFsID0gbWVudUl0ZW1zLmNvbmNhdChcbiAgICAgIGFkZGl0aW9uYWxBY3Rpb25zLm1hcCgoYSkgPT4ge1xuICAgICAgICBjb25zdCBpc1Zpc2libGUgPSAhYS5hY3Rpb25WaXNpYmxlRmllbGQgfHwgdGhpcy5maWVsZElzVHJ1dGh5KHNlbGVjdGVkSXRlbSwgYS5hY3Rpb25WaXNpYmxlRmllbGQpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGFiZWw6IHRyYW5zbGF0aW9uc1thLmxhYmVsS2V5IHx8ICcnXSxcbiAgICAgICAgICBpY29uOiBhLmljb24sXG4gICAgICAgICAgc3R5bGVDbGFzczogKGEuY2xhc3NlcyB8fCBbXSkuam9pbignICcpLFxuICAgICAgICAgIGRpc2FibGVkOiBhLmRpc2FibGVkIHx8ICghIWEuYWN0aW9uRW5hYmxlZEZpZWxkICYmICF0aGlzLmZpZWxkSXNUcnV0aHkoc2VsZWN0ZWRJdGVtLCBhLmFjdGlvbkVuYWJsZWRGaWVsZCkpLFxuICAgICAgICAgIHZpc2libGU6IGlzVmlzaWJsZSxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiBhLmNhbGxiYWNrKHNlbGVjdGVkSXRlbSksXG4gICAgICAgICAgYXV0b21hdGlvbklkOiBpc1Zpc2libGUgPyBhdXRvbWF0aW9uSWQgOiBhdXRvbWF0aW9uSWRIaWRkZW4sXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuICAgIHJldHVybiB2YWxcbiAgfVxuXG4gIHByaXZhdGUgZ2V0R3JpZEFjdGlvbnNUcmFuc2xhdGlvbnMoXG4gICAgYWRkaXRpb25hbEFjdGlvbnM6IERhdGFBY3Rpb25bXSxcbiAgICBwZXJtaXNzaW9uczogc3RyaW5nW11cbiAgKTogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoW1xuICAgICAgdGhpcy52aWV3TWVudUl0ZW1LZXkgfHwgJ09DWF9EQVRBX0xJU1RfR1JJRC5NRU5VLlZJRVcnLFxuICAgICAgdGhpcy5lZGl0TWVudUl0ZW1LZXkgfHwgJ09DWF9EQVRBX0xJU1RfR1JJRC5NRU5VLkVESVQnLFxuICAgICAgdGhpcy5kZWxldGVNZW51SXRlbUtleSB8fCAnT0NYX0RBVEFfTElTVF9HUklELk1FTlUuREVMRVRFJyxcbiAgICAgIC4uLmFkZGl0aW9uYWxBY3Rpb25zXG4gICAgICAgIC5maWx0ZXIoKGFjdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHBlcm1pc3Npb25zQXJyYXkgPSBBcnJheS5pc0FycmF5KGFjdGlvbi5wZXJtaXNzaW9uKSA/IGFjdGlvbi5wZXJtaXNzaW9uIDogW2FjdGlvbi5wZXJtaXNzaW9uXVxuICAgICAgICAgIHJldHVybiBwZXJtaXNzaW9uc0FycmF5LmV2ZXJ5KChwKSA9PiBwZXJtaXNzaW9ucy5pbmNsdWRlcyhwKSlcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcCgoYSkgPT4gYS5sYWJlbEtleSB8fCAnJyksXG4gICAgXSlcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkRGlzcGxheUFjdGlvbihcbiAgICBwZXJtaXNzaW9uOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgICBlbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PixcbiAgICB1c2VyUGVybWlzc2lvbnM6IHN0cmluZ1tdXG4gICk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gQXJyYXkuaXNBcnJheShwZXJtaXNzaW9uKSA/IHBlcm1pc3Npb24gOiBwZXJtaXNzaW9uID8gW3Blcm1pc3Npb25dIDogW11cbiAgICByZXR1cm4gZW1pdHRlci5vYnNlcnZlZCAmJiBwZXJtaXNzaW9ucy5ldmVyeSgocCkgPT4gdXNlclBlcm1pc3Npb25zLmluY2x1ZGVzKHApKVxuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJBY3Rpb25zQmFzZWRPblBlcm1pc3Npb25zKGFjdGlvbnM6IERhdGFBY3Rpb25bXSwgcGVybWlzc2lvbnM/OiBzdHJpbmdbXSk6IE9ic2VydmFibGU8RGF0YUFjdGlvbltdPiB7XG4gICAgY29uc3QgcGVybWlzc2lvbnMkID0gcGVybWlzc2lvbnMgPyBvZihwZXJtaXNzaW9ucykgOiB0aGlzLmdldFBlcm1pc3Npb25zKClcbiAgICByZXR1cm4gcGVybWlzc2lvbnMkLnBpcGUoXG4gICAgICBtYXAoKHBlcm1pc3Npb25zKSA9PiB7XG4gICAgICAgIHJldHVybiBhY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiB7XG4gICAgICAgICAgY29uc3QgYWN0aW9uUGVybWlzc2lvbnMgPSBBcnJheS5pc0FycmF5KGFjdGlvbi5wZXJtaXNzaW9uKSA/IGFjdGlvbi5wZXJtaXNzaW9uIDogW2FjdGlvbi5wZXJtaXNzaW9uXVxuICAgICAgICAgIHJldHVybiBhY3Rpb25QZXJtaXNzaW9ucy5ldmVyeSgocCkgPT4gcGVybWlzc2lvbnMuaW5jbHVkZXMocCkpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVybWlzc2lvbnMoKTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xuICAgIGlmICh0aGlzLmhhc1Blcm1pc3Npb25DaGVja2VyPy5nZXRQZXJtaXNzaW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzUGVybWlzc2lvbkNoZWNrZXIuZ2V0UGVybWlzc2lvbnMoKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnVzZXJTZXJ2aWNlLmdldFBlcm1pc3Npb25zKClcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIihkaXNwbGF5ZWRQYWdlU2l6ZSQgfCBhc3luYykgYXMgZGlzcGxheWVkUGFnZVNpemVcIj5cbiAgPHAtZGF0YVZpZXdcbiAgICAqbmdJZj1cIihjb2x1bW5UZW1wbGF0ZXMkIHwgYXN5bmMpID8/IHt9IGFzIGNvbHVtblRlbXBsYXRlc1wiXG4gICAgW3ZhbHVlXT1cIihkaXNwbGF5ZWRJdGVtcyQgfCBhc3luYykgPz8gW11cIlxuICAgIFtwYWdpbmF0b3JdPVwicGFnaW5hdG9yXCJcbiAgICBbZmlyc3RdPVwicGFnZSAqIGRpc3BsYXllZFBhZ2VTaXplXCJcbiAgICAob25QYWdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICBbcm93c109XCJkaXNwbGF5ZWRQYWdlU2l6ZVwiXG4gICAgW2xheW91dF09XCJsYXlvdXRcIlxuICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiXG4gICAgY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZT1cInt7ICh0b3RhbFJlY29yZHNPblNlcnZlcigpID8gY3VycmVudFBhZ2VTaG93aW5nV2l0aFRvdGFsT25TZXJ2ZXJLZXkgOiBjdXJyZW50UGFnZVNob3dpbmdLZXkpIHwgdHJhbnNsYXRlOnBhcmFtcygpIH19XCJcbiAgICBbcm93c1BlclBhZ2VPcHRpb25zXT1cIihkaXNwbGF5ZWRQYWdlU2l6ZXMkIHwgYXN5bmMpID8/IFtdXCJcbiAgICBpZD1cImRhdGFMaXN0R3JpZF97e25hbWV9fVwiXG4gICAgcGFnaW5hdG9yRHJvcGRvd25BcHBlbmRUbz1cImJvZHlcIlxuICA+XG4gICAgPG5nLXRlbXBsYXRlICNncmlkSXRlbSBsZXQtcm93cyBwVGVtcGxhdGU9XCJncmlkSXRlbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInAtZ3JpZCBwLW5vZ3V0dGVyIGdyaWQgZ3JpZC1ub2d1dHRlclwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWl0ZW0gW25nRm9yT2ZdPVwicm93c1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIl9ncmlkSXRlbSA/IF9ncmlkSXRlbSA6IGRlZmF1bHRHcmlkSXRlbVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDppdGVtfVwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxuZy10ZW1wbGF0ZSAjbGlzdEl0ZW0gbGV0LXJvd3MgcFRlbXBsYXRlPVwibGlzdEl0ZW1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLWdyaWQgcC1ub2d1dHRlciBncmlkIGdyaWQtbm9ndXR0ZXJcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1pdGVtIFtuZ0Zvck9mXT1cInJvd3NcIj5cbiAgICAgICAgICBAZGVmZXIgKG9uIHZpZXdwb3J0OyBvbiBpZGxlKXtcbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJfbGlzdEl0ZW0gPyBfbGlzdEl0ZW0gOiBkZWZhdWx0TGlzdEl0ZW1cIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgJGltcGxpY2l0Oml0ZW0sXG4gICAgICAgICAgICAgIGl0ZW06aXRlbSxcbiAgICAgICAgICAgICAgY29sdW1uVGVtcGxhdGVzOiBjb2x1bW5UZW1wbGF0ZXNcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIH0gQHBsYWNlaG9sZGVyIHtcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogODBweFwiPjwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5XCI+XG4gICAgICA8c3Bhbj57eyBlbXB0eVJlc3VsdHNNZXNzYWdlIHx8IChcIk9DWF9EQVRBX0xJU1RfR1JJRC5FTVBUWV9SRVNVTFRcIiB8IHRyYW5zbGF0ZSkgfX08L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9wLWRhdGFWaWV3PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEdyaWRJdGVtIGxldC1pdGVtPlxuICA8ZGl2IGNsYXNzPVwiY29sLTEyIGxnOmNvbC02IHhsOmNvbC00IGZsZXhcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZGF0YS1ncmlkLWl0ZW0gY2FyZCBmbGV4IGZsZXgtY29sdW1uIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHctMTIgbGc6dy0xMSBtYi00IG10LTQgYWxpZ24tc2VsZi1zdHJldGNoXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIG1iLTNcIj5cbiAgICAgICAgPGltZ1xuICAgICAgICAgIGNsYXNzPVwiaW1hZ2VcIlxuICAgICAgICAgIHNyYz1cInt7IGl0ZW0uaW1hZ2VQYXRoIHx8IChmYWxsYmFja0ltYWdlUGF0aCQgfCBhc3luYykgfX1cIlxuICAgICAgICAgIChlcnJvcik9XCJpbWdFcnJvcihpdGVtKVwiXG4gICAgICAgICAgYWx0PVwie3tyZXNvbHZlRmllbGREYXRhKGl0ZW0sIHRpdGxlTGluZUlkKXx8ICcnfX1cIlxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtZ3JpZC1pdGVtcyBmbGV4LXJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLW5hbWUgZm9udC1tZWRpdW0gbXItMyB0ZXh0LTJ4bFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1ZpZXdQZXJtaXNzaW9uJCB8IGFzeW5jIGFzIGhhc1ZpZXdQZXJtaXNzaW9uOyBlbHNlIG5vVmlld1Blcm1pc3Npb25cIj5cbiAgICAgICAgICAgICAgPGEgW3JvdXRlckxpbmtdPVwiXCIgKGNsaWNrKT1cIm9uVmlld1JvdyhpdGVtKVwiPnt7IHJlc29sdmVGaWVsZERhdGEoaXRlbSwgdGl0bGVMaW5lSWQpIHx8ICcnIH19PC9hPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vVmlld1Blcm1pc3Npb24+XG4gICAgICAgICAgICAgIDxhIFtyb3V0ZXJMaW5rXT1cIlwiPnt7IHJlc29sdmVGaWVsZERhdGEoaXRlbSwgdGl0bGVMaW5lSWQpIHx8ICcnIH19PC9hPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJfZ3JpZEl0ZW1TdWJ0aXRsZUxpbmVzID8gX2dyaWRJdGVtU3VidGl0bGVMaW5lcyA6IGRlZmF1bHRHcmlkSXRlbVN1YnRpdGxlTGluZXNcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6aXRlbX1cIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIoZ3JpZE1lbnVJdGVtcyQgfCBhc3luYykgYXMgZ3JpZE1lbnVJdGVtc1wiPlxuICAgICAgICAgIDxwLW1lbnUgI21lbnUgW21vZGVsXT1cImdyaWRNZW51SXRlbXNcIiBbcG9wdXBdPVwidHJ1ZVwiIGFwcGVuZFRvPVwiYm9keVwiPjwvcC1tZW51PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJzZXRTZWxlY3RlZEl0ZW0oaXRlbSk7IG1lbnUudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgICAgaWNvbj1cInBpIHBpLWVsbGlwc2lzLXZcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInT0NYX0RBVEFfTElTVF9HUklELk1PUkVfQUNUSU9OU19BUklBX0xBQkVMJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBjbGFzcz1cIm1vcmUtYWN0aW9ucy1tZW51LWJ1dHRvbiBtZW51LWJ0blwiXG4gICAgICAgICAgICBbYXR0ci5uYW1lXT1cIidkYXRhLWdyaWQtaXRlbS1tZW51LWJ1dHRvbidcIlxuICAgICAgICAgICAgW3BUb29sdGlwXT1cIidPQ1hfREFUQV9MSVNUX0dSSUQuTU9SRV9BQ1RJT05TX1RPT0xUSVAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2RlZmF1bHRHcmlkSXRlbVN1YnRpdGxlTGluZXMgbGV0LWl0ZW0+XG4gIDxkaXYgKm5nRm9yPVwibGV0IHN1YnRpdGxlTGluZUlkIG9mIHN1YnRpdGxlTGluZUlkc1wiIGNsYXNzPVwic3VidGl0bGVMaW5lIGVkaXQtdGltZSB0ZXh0LXhsIG15LTNcIj5cbiAgICB7eyByZXNvbHZlRmllbGREYXRhKGl0ZW0sIHN1YnRpdGxlTGluZUlkKSB9fVxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2RlZmF1bHRMaXN0SXRlbSBsZXQtaXRlbT1cIml0ZW1cIiBsZXQtY29sdW1uVGVtcGxhdGVzPVwiY29sdW1uVGVtcGxhdGVzXCI+XG4gIDxkaXYgY2xhc3M9XCJjb2wtMTJcIiAqbmdJZj1cImNvbHVtblRlbXBsYXRlc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJkYXRhLWxpc3QtaXRlbXMgcC0zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1uYW1lLXJvdyBmbGV4IGZsZXgtcm93IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLW5hbWUgbXItMyB0ZXh0LTJ4bCBmb250LW1lZGl1bSBhbGlnbi1jb250ZW50LWNlbnRlclwiPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGl0bGVMaW5lSWRcIj57eyByZXNvbHZlRmllbGREYXRhKGl0ZW0sIHRpdGxlTGluZUlkKSB8fCAnJyB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nSWY9XCJ2aWV3SXRlbU9ic2VydmVkICYmICghdmlld0FjdGlvblZpc2libGVGaWVsZCB8fCBmaWVsZElzVHJ1dGh5KGl0ZW0sIHZpZXdBY3Rpb25WaXNpYmxlRmllbGQpKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBpZD1cInt7cmVzb2x2ZUZpZWxkRGF0YShpdGVtLCAnaWQnKX19LXZpZXdCdXR0b25cIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWV5ZVwiXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgbWItMSBtci0yIHZpZXdMaXN0SXRlbUJ1dHRvblwiXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCIodmlld01lbnVJdGVtS2V5IHx8ICdPQ1hfREFUQV9MSVNUX0dSSUQuTUVOVS5WSUVXJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIih2aWV3TWVudUl0ZW1LZXkgfHwgJ09DWF9EQVRBX0xJU1RfR1JJRC5NRU5VLlZJRVcnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblZpZXdSb3coaXRlbSlcIlxuICAgICAgICAgICAgICAqb2N4SWZQZXJtaXNzaW9uPVwidmlld1Blcm1pc3Npb25cIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiISF2aWV3QWN0aW9uRW5hYmxlZEZpZWxkICYmICFmaWVsZElzVHJ1dGh5KGl0ZW0sIHZpZXdBY3Rpb25FbmFibGVkRmllbGQpXCJcbiAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCInZGF0YS1saXN0LWFjdGlvbi1idXR0b24nXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdJZj1cImVkaXRJdGVtT2JzZXJ2ZWQgJiYgKCFlZGl0QWN0aW9uVmlzaWJsZUZpZWxkIHx8IGZpZWxkSXNUcnV0aHkoaXRlbSwgZWRpdEFjdGlvblZpc2libGVGaWVsZCkpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGlkPVwie3tyZXNvbHZlRmllbGREYXRhKGl0ZW0sICdpZCcpfX0tZWRpdEJ1dHRvblwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBtYi0xIG1yLTIgZWRpdExpc3RJdGVtQnV0dG9uXCJcbiAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXBlbmNpbFwiXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIihlZGl0TWVudUl0ZW1LZXkgfHwgJ09DWF9EQVRBX0xJU1RfR1JJRC5NRU5VLkVESVQnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGVkaXRNZW51SXRlbUtleSB8fCAnT0NYX0RBVEFfTElTVF9HUklELk1FTlUuRURJVCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdFJvdyhpdGVtKVwiXG4gICAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJlZGl0UGVybWlzc2lvblwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIWVkaXRBY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkoaXRlbSwgZWRpdEFjdGlvbkVuYWJsZWRGaWVsZClcIlxuICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cIidkYXRhLWxpc3QtYWN0aW9uLWJ1dHRvbidcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiZGVsZXRlSXRlbU9ic2VydmVkICYmICghZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkIHx8IGZpZWxkSXNUcnV0aHkoaXRlbSwgZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkKSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgaWQ9XCJ7e3Jlc29sdmVGaWVsZERhdGEoaXRlbSwgJ2lkJyl9fS1kZWxldGVCdXR0b25cIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRyYXNoXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyIG1iLTEgbXItMiBkZWxldGVMaXN0SXRlbUJ1dHRvblwiXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIihkZWxldGVNZW51SXRlbUtleSB8fCAnT0NYX0RBVEFfTElTVF9HUklELk1FTlUuREVMRVRFJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihkZWxldGVNZW51SXRlbUtleSB8fCAnT0NYX0RBVEFfTElTVF9HUklELk1FTlUuREVMRVRFJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVSb3coaXRlbSlcIlxuICAgICAgICAgICAgICAqb2N4SWZQZXJtaXNzaW9uPVwiZGVsZXRlUGVybWlzc2lvblwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIWRlbGV0ZUFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShpdGVtLCBkZWxldGVBY3Rpb25FbmFibGVkRmllbGQpXCJcbiAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCInZGF0YS1saXN0LWFjdGlvbi1idXR0b24nXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgaW5saW5lTGlzdEFjdGlvbnMkIHwgYXN5bmNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIWFjdGlvbi5hY3Rpb25WaXNpYmxlRmllbGQgfHwgZmllbGRJc1RydXRoeShpdGVtLCBhY3Rpb24uYWN0aW9uVmlzaWJsZUZpZWxkKSlcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGlkPVwie3tyZXNvbHZlRmllbGREYXRhKGl0ZW0sICdpZCcpfX0te3thY3Rpb24uaWQgPyBhY3Rpb24uaWQuY29uY2F0KCdBY3Rpb25CdXR0b24nKSA6ICdpbmxpbmVBY3Rpb25CdXR0b24nfX1cIlxuICAgICAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJhY3Rpb24ucGVybWlzc2lvblwiXG4gICAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJhY3Rpb24uY2xhc3Nlc1wiXG4gICAgICAgICAgICAgICAgW2ljb25dPVwiYWN0aW9uLmljb24gfHwgJydcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb24uY2FsbGJhY2soaXRlbSlcIlxuICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJhY3Rpb24ubGFiZWxLZXkgPyAoYWN0aW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYWN0aW9uLmxhYmVsS2V5ID8gKGFjdGlvbi5sYWJlbEtleSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjdGlvbi5kaXNhYmxlZCB8fCAoISFhY3Rpb24uYWN0aW9uRW5hYmxlZEZpZWxkICYmICFmaWVsZElzVHJ1dGh5KGl0ZW0sIGFjdGlvbi5hY3Rpb25FbmFibGVkRmllbGQpKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCInZGF0YS1saXN0LWFjdGlvbi1idXR0b24nXCJcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1Zpc2libGVPdmVyZmxvd01lbnVJdGVtcyhpdGVtKSB8IGFzeW5jXCI+XG4gICAgICAgICAgICA8cC1tZW51ICNtZW51IFttb2RlbF09XCIob3ZlcmZsb3dMaXN0TWVudUl0ZW1zJCB8IGFzeW5jKSB8fCBbXVwiIFtwb3B1cF09XCJ0cnVlXCIgYXBwZW5kVG89XCJib2R5XCI+PC9wLW1lbnU+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgICAgICBbaWNvbl09XCIncGkgcGktZWxsaXBzaXMtdidcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlT3ZlcmZsb3dNZW51KCRldmVudCwgbWVudSwgaXRlbSlcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidPQ1hfREFUQV9MSVNUX0dSSUQuTU9SRV9BQ1RJT05TX0FSSUFfTEFCRUwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIidPQ1hfREFUQV9MSVNUX0dSSUQuTU9SRV9BQ1RJT05TX1RPT0xUSVAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcbiAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCInZGF0YS1saXN0LW92ZXJmbG93LWl0ZW0tbWVudS1idXR0b24nXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgZm9udC1saWdodCBteS0xXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJfbGlzdEl0ZW1TdWJ0aXRsZUxpbmVzID8gX2xpc3RJdGVtU3VidGl0bGVMaW5lcyA6IGRlZmF1bHRMaXN0SXRlbVN1YnRpdGxlTGluZXNcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0Oml0ZW19XCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXBcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sIG9mIGdldEZpbHRlcmVkQ29sdW1ucygpXCIgY2xhc3M9XCJ3LTEycmVtIG15LTIgbXItMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LWJvbGRcIiBbb2N4VG9vbHRpcE9uT3ZlcmZsb3ddPVwiY29sLm5hbWVLZXkgfCB0cmFuc2xhdGVcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5cbiAgICAgICAgICAgIHt7IGNvbC5uYW1lS2V5IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgW29jeFRvb2x0aXBPbk92ZXJmbG93XT1cImNvbC5jb2x1bW5UeXBlID09PSBjb2x1bW5UeXBlLlRSQU5TTEFUSU9OX0tFWSA/IChyZXNvbHZlRmllbGREYXRhKGl0ZW0sY29sLmlkKSB8IHRyYW5zbGF0ZSkgOiByZXNvbHZlRmllbGREYXRhKGl0ZW0sIGNvbC5pZClcIlxuICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAZGVmZXIob24gdmlld3BvcnQ7KXtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiX2xpc3RWYWx1ZSA/IF9saXN0VmFsdWU6IGRlZmF1bHRMaXN0VmFsdWVcIlxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgIHJvd09iamVjdDogaXRlbSxcbiAgICAgICAgICAgICAgICBjb2x1bW46IGNvbCxcbiAgICAgICAgICAgICAgICBjb2x1bW5UZW1wbGF0ZXM6IGNvbHVtblRlbXBsYXRlc1xuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICB9IEBwbGFjZWhvbGRlciB7XG4gICAgICAgICAgICA8cC1za2VsZXRvbiB3aWR0aD1cIjVyZW1cIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2RlZmF1bHRMaXN0SXRlbVN1YnRpdGxlTGluZXMgbGV0LWl0ZW09XCIkaW1wbGljaXRcIj5cbiAgPGRpdiAqbmdGb3I9XCJsZXQgc3VidGl0bGVMaW5lSWQgb2Ygc3VidGl0bGVMaW5lSWRzXCIgY2xhc3M9XCJzdWJ0aXRsZUxpbmUgdGV4dC14bCBteS0zXCI+XG4gICAge3sgcmVzb2x2ZUZpZWxkRGF0YShpdGVtLCBzdWJ0aXRsZUxpbmVJZCkgfX1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRMaXN0VmFsdWUgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIiBsZXQtY29sdW1uVGVtcGxhdGVzPVwiY29sdW1uVGVtcGxhdGVzXCI+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdJZj1cImNvbHVtblRlbXBsYXRlc1tjb2x1bW4uaWRdXCJcbiAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW5UZW1wbGF0ZXNbY29sdW1uLmlkXVwiXG4gICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICByb3dPYmplY3Q6IHJvd09iamVjdCxcbiAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgICAgICAgfVwiXG4gID5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdFN0cmluZ0xpc3RWYWx1ZVwiIGxldC1yb3dPYmplY3Q9XCJyb3dPYmplY3RcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxuZy1jb250YWluZXI+IHt7IHJlc29sdmVGaWVsZERhdGEocm93T2JqZWN0LCBjb2x1bW4uaWQpIH19IDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHROdW1iZXJMaXN0VmFsdWVcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8bmctY29udGFpbmVyPiB7eyByZXNvbHZlRmllbGREYXRhKHJvd09iamVjdCwgY29sdW1uLmlkKSB8IG51bWJlciB9fSA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJkZWZhdWx0Q3VzdG9tTGlzdFZhbHVlXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj4gPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHREYXRlTGlzdFZhbHVlXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCkgfCBkYXRlOiBjb2x1bW4uZGF0ZUZvcm1hdCA/PyAnbWVkaXVtJyB9fSA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJkZWZhdWx0UmVsYXRpdmVEYXRlTGlzdFZhbHVlXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj5cbiAgICB7eyAnT0NYX0RBVEFfVEFCTEUuRURJVEVEJyB8IHRyYW5zbGF0ZSB9fSB7eyByZXNvbHZlRmllbGREYXRhKHJvd09iamVjdCwgY29sdW1uLmlkKSB8IHRpbWVhZ28gfX1cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdFRyYW5zbGF0aW9uS2V5TGlzdFZhbHVlXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCkgfCB0cmFuc2xhdGUgfX0gPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuIl19
|