@onecx/angular-accelerator 5.12.2 → 5.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/i18n/de.json +148 -132
- package/assets/i18n/en.json +148 -132
- package/esm2022/index.mjs +2 -1
- package/esm2022/lib/angular-accelerator-primeng.module.mjs +12 -5
- package/esm2022/lib/angular-accelerator.module.mjs +12 -7
- package/esm2022/lib/components/column-group-selection/column-group-selection.component.mjs +8 -7
- package/esm2022/lib/components/custom-group-column-selector/custom-group-column-selector.component.mjs +49 -12
- package/esm2022/lib/components/data-layout-selection/data-layout-selection.component.mjs +28 -10
- package/esm2022/lib/components/data-list-grid/data-list-grid.component.mjs +13 -12
- package/esm2022/lib/components/data-list-grid-sorting/data-list-grid-sorting.component.mjs +16 -15
- package/esm2022/lib/components/data-loading-error/data-loading-error.component.mjs +28 -0
- package/esm2022/lib/components/data-table/data-table.component.mjs +6 -6
- package/esm2022/lib/components/data-view/data-view.component.mjs +3 -3
- package/esm2022/lib/components/diagram/diagram.component.mjs +31 -14
- package/esm2022/lib/components/group-by-count-diagram/group-by-count-diagram.component.mjs +3 -3
- package/esm2022/lib/components/interactive-data-view/interactive-data-view.component.mjs +3 -3
- package/esm2022/lib/components/page-header/page-header.component.mjs +10 -6
- package/esm2022/lib/components/search-config/search-config.component.mjs +3 -3
- package/esm2022/lib/components/search-header/search-header.component.mjs +10 -9
- package/esm2022/lib/directives/advanced.directive.mjs +3 -3
- package/esm2022/lib/directives/if-breakpoint.directive.mjs +3 -3
- package/esm2022/lib/directives/if-permission.directive.mjs +3 -3
- package/esm2022/lib/directives/src.directive.mjs +3 -3
- package/esm2022/lib/directives/tooltipOnOverflow.directive.mjs +3 -3
- package/esm2022/lib/pipes/dynamic.pipe.mjs +3 -3
- package/esm2022/lib/pipes/ocxtimeago.pipe.mjs +3 -3
- package/esm2022/lib/services/app-config-service.mjs +3 -3
- package/esm2022/lib/services/breadcrumb.service.mjs +3 -3
- package/esm2022/lib/services/translation-cache.service.mjs +3 -3
- package/esm2022/lib/utils/dateutils.mjs +3 -3
- package/esm2022/testing/custom-group-column-selector.harness.mjs +2 -2
- package/esm2022/testing/data-layout-selection.harness.mjs +6 -7
- package/fesm2022/onecx-angular-accelerator-testing.mjs +6 -7
- package/fesm2022/onecx-angular-accelerator-testing.mjs.map +1 -1
- package/fesm2022/onecx-angular-accelerator.mjs +231 -120
- package/fesm2022/onecx-angular-accelerator.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/lib/angular-accelerator-primeng.module.d.ts +3 -2
- package/lib/angular-accelerator.module.d.ts +13 -12
- package/lib/components/custom-group-column-selector/custom-group-column-selector.component.d.ts +13 -1
- package/lib/components/data-layout-selection/data-layout-selection.component.d.ts +5 -2
- package/lib/components/data-list-grid-sorting/data-list-grid-sorting.component.d.ts +2 -2
- package/lib/components/data-loading-error/data-loading-error.component.d.ts +8 -0
- package/lib/components/data-table/data-table.component.d.ts +1 -1
- package/lib/components/diagram/diagram.component.d.ts +7 -2
- package/lib/components/page-header/page-header.component.d.ts +4 -0
- package/package.json +1 -1
|
@@ -387,7 +387,7 @@ export class DataTableComponent extends DataSortBase {
|
|
|
387
387
|
onEditRow(selectedTableRow) {
|
|
388
388
|
this.editTableRow.emit(selectedTableRow);
|
|
389
389
|
}
|
|
390
|
-
|
|
390
|
+
onFilterChosen(column) {
|
|
391
391
|
this.currentFilterColumn$.next(column);
|
|
392
392
|
}
|
|
393
393
|
onFilterChange(column, event) {
|
|
@@ -585,12 +585,12 @@ export class DataTableComponent extends DataSortBase {
|
|
|
585
585
|
[column.id]: value.label,
|
|
586
586
|
};
|
|
587
587
|
}
|
|
588
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.
|
|
589
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DataTableComponent, selector: "ocx-data-table", inputs: { rows: "rows", selectedRows: "selectedRows", filters: "filters", sortDirection: "sortDirection", sortColumn: "sortColumn", columns: "columns", clientSideFiltering: "clientSideFiltering", clientSideSorting: "clientSideSorting", sortStates: "sortStates", pageSizes: "pageSizes", pageSize: "pageSize", emptyResultsMessage: "emptyResultsMessage", name: "name", deletePermission: "deletePermission", viewPermission: "viewPermission", editPermission: "editPermission", deleteActionVisibleField: "deleteActionVisibleField", deleteActionEnabledField: "deleteActionEnabledField", viewActionVisibleField: "viewActionVisibleField", viewActionEnabledField: "viewActionEnabledField", editActionVisibleField: "editActionVisibleField", editActionEnabledField: "editActionEnabledField", selectionEnabledField: "selectionEnabledField", allowSelectAll: "allowSelectAll", paginator: "paginator", page: "page", totalRecordsOnServer: "totalRecordsOnServer", currentPageShowingKey: "currentPageShowingKey", currentPageShowingWithTotalOnServerKey: "currentPageShowingWithTotalOnServerKey", stringCellTemplate: "stringCellTemplate", numberCellTemplate: "numberCellTemplate", customCellTemplate: "customCellTemplate", dateCellTemplate: "dateCellTemplate", relativeDateCellTemplate: "relativeDateCellTemplate", cellTemplate: "cellTemplate", translationKeyCellTemplate: "translationKeyCellTemplate", stringFilterCellTemplate: "stringFilterCellTemplate", numberFilterCellTemplate: "numberFilterCellTemplate", customFilterCellTemplate: "customFilterCellTemplate", dateFilterCellTemplate: "dateFilterCellTemplate", relativeDateFilterCellTemplate: "relativeDateFilterCellTemplate", filterCellTemplate: "filterCellTemplate", translationKeyFilterCellTemplate: "translationKeyFilterCellTemplate", additionalActions: "additionalActions", frozenActionColumn: "frozenActionColumn", actionColumnPosition: "actionColumnPosition", parentTemplates: "parentTemplates" }, outputs: { filtered: "filtered", sorted: "sorted", viewTableRow: "viewTableRow", editTableRow: "editTableRow", deleteTableRow: "deleteTableRow", selectionChanged: "selectionChanged", pageChanged: "pageChanged", pageSizeChanged: "pageSizeChanged", componentStateChanged: "componentStateChanged" }, queries: [{ propertyName: "stringCellChildTemplate", first: true, predicate: ["stringCell"], descendants: true }, { propertyName: "numberCellChildTemplate", first: true, predicate: ["numberCell"], descendants: true }, { propertyName: "customCellChildTemplate", first: true, predicate: ["customCell"], descendants: true }, { propertyName: "dateCellChildTemplate", first: true, predicate: ["dateCell"], descendants: true }, { propertyName: "relativeDateCellChildTemplate", first: true, predicate: ["relativeDateCell"], descendants: true }, { propertyName: "cellChildTemplate", first: true, predicate: ["cell"], descendants: true }, { propertyName: "translationKeyCellChildTemplate", first: true, predicate: ["translationKeyCell"], descendants: true }, { propertyName: "stringFilterCellChildTemplate", first: true, predicate: ["stringFilterCell"], descendants: true }, { propertyName: "numberFilterCellChildTemplate", first: true, predicate: ["numberFilterCell"], descendants: true }, { propertyName: "customFilterCellChildTemplate", first: true, predicate: ["customFilterCell"], descendants: true }, { propertyName: "dateFilterCellChildTemplate", first: true, predicate: ["dateFilterCell"], descendants: true }, { propertyName: "relativeDateFilterCellChildTemplate", first: true, predicate: ["relativeDateFilterCell"], descendants: true }, { propertyName: "filterCellChildTemplate", first: true, predicate: ["filterCell"], descendants: true }, { propertyName: "translationKeyFilterCellChildTemplate", first: true, predicate: ["translationKeyFilterCell"], descendants: true }, { propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "viewTemplates", predicate: PrimeTemplate, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #actionColumn let-rowObject=\"localRowObject\">\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <td\n class=\"actions\"\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-left' : 'action-column-right'\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n >\n <div class=\"icon-button-row-wrapper\">\n <ng-container\n *ngIf=\"viewTableRowObserved && (!viewActionVisibleField || fieldIsTruthy(rowObject, viewActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(rowObject, viewActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text viewTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.VIEW' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.VIEW' | translate\"\n icon=\"pi pi-eye\"\n (click)=\"onViewRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"editTableRowObserved && (!editActionVisibleField || fieldIsTruthy(rowObject, editActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(rowObject, editActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text editTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.EDIT' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.EDIT' | translate\"\n icon=\"pi pi-pencil\"\n (click)=\"onEditRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"deleteTableRowObserved && (!deleteActionVisibleField || fieldIsTruthy(rowObject, deleteActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(rowObject, deleteActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text p-button-danger deleteTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.DELETE' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.DELETE' | translate\"\n icon=\"pi pi-trash\"\n (click)=\"onDeleteRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of inlineActions$ | async\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(rowObject, action.actionVisibleField))\">\n <button\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(rowObject)\"\n [title]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(rowObject, action.actionEnabledField))\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(rowObject) | async\">\n <p-menu #menu [model]=\"(overflowMenuItems$ | 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, rowObject)\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n [title]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n ></button>\n </ng-container>\n </div>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #actionColumnHeader>\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <th\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-header-left' : 'action-column-header-right'\"\n >\n {{ 'OCX_DATA_TABLE.ACTIONS_COLUMN_NAME' | translate }}\n </th>\n </ng-container>\n</ng-template>\n\n<ng-container *ngIf=\"(displayedPageSize$ | async) as displayedPageSize\">\n <p-table\n *ngIf=\"(columnTemplates$ | async) ?? {} as columnTemplates\"\n [value]=\"(displayedRows$ | async) ?? []\"\n responsiveLayout=\"scroll\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataTable_{{name}}\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selection]=\"(selectedRows$ | async) ?? []\"\n [scrollable]=\"true\"\n paginatorDropdownAppendTo=\"body\"\n >\n <ng-template pTemplate=\"header\">\n <tr>\n <th style=\"width: 4rem\" scope=\"col\" *ngIf=\"selectionChangedObserved\">\n <p-tableHeaderCheckbox *ngIf=\"allowSelectAll\"></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let column of columns\">\n <th *ngIf=\"column.sortable || column.filterable; else simpleHeader\" scope=\"col\">\n <div class=\"table-header-wrapper\">\n <span id=\"{{column.id}}-header-name\">{{ column.nameKey | translate }}</span>\n <span class=\"icon-button-header-wrapper\">\n <button\n *ngIf=\"column.sortable\"\n class=\"pi sortButton\"\n [class.pi-sort-alt]=\"(column?.id === sortColumn && sortDirection === 'NONE') || column?.id !== sortColumn\"\n [class.pi-sort-amount-up]=\"column?.id === sortColumn && sortDirection === 'ASCENDING'\"\n [class.pi-sort-amount-down]=\"column?.id === sortColumn && sortDirection === 'DESCENDING'\"\n (click)=\"onSortColumnClick(column.id)\"\n [title]=\"(sortIconTitle(column.id) | translate)\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.TOGGLE_BUTTON.ARIA_LABEL' | translate: { column: (column.nameKey | translate), direction: (sortDirectionToTitle(columnNextSortDirection(column.id)) | translate)})\"\n ></button>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable\"\n [options]=\"(currentFilterOptions$ | async) || []\"\n [ngModel]=\"(currentSelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onClick)=\"onFilterClick(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value>\n <ng-container\n *ngIf=\"columnTemplates[column.id] as template\"\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n rowObject: getRowObjectFromMultiselectItem(value, column),\n column: column\n }\"\n >\n </ng-container>\n </ng-template>\n </p-multiSelect>\n </span>\n </div>\n </th>\n <ng-template #simpleHeader>\n <th scope=\"col\">{{ column.nameKey | translate }}</th>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowObject>\n <tr>\n <td *ngIf=\"selectionChangedObserved\">\n <p-checkbox\n *ngIf=\"(!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)) && isSelected(rowObject); else defaultCheckbox\"\n [(ngModel)]=\"checked\"\n [binary]=\"true\"\n [disabled]=\"true\"\n ></p-checkbox>\n <ng-template #defaultCheckbox>\n <p-tableCheckbox\n [value]=\"rowObject\"\n [disabled]=\"!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)\"\n ></p-tableCheckbox>\n </ng-template>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n <td *ngFor=\"let column of columns\">\n <ng-container\n [ngTemplateOutlet]=\"\n _cell ? _cell: columnTemplates[column.id]\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column,\n }\"\n ></ng-container>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [colSpan]=\"columns.length + ((anyRowActionObserved || this.additionalActions.length > 0) ? 1 : 0)\">\n {{ emptyResultsMessage || (\"OCX_DATA_TABLE.EMPTY_RESULT\" | translate) }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n</ng-container>\n\n<ng-template pTemplate=\"defaultStringCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id)}} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultNumberCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | number }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultCustomCell\" let-rowObject=\"rowObject\" let-column=\"column\"> </ng-template>\n\n<ng-template pTemplate=\"defaultDateCell\" 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=\"defaultRelativeDateCell\" 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=\"defaultTranslationKeyCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | translate }} </ng-container>\n</ng-template>\n", styles: [":host ::ng-deep .p-multiselect{padding:0;background:#f7f7f7;border:none}:host ::ng-deep .p-multiselect .p-multiselect-container{height:20px;width:20px}:host ::ng-deep .p-multiselect .p-multiselect-trigger{display:none}:host ::ng-deep .p-multiselect .p-multiselect-label.p-placeholder{color:#262626;font-size:.9rem;font-family:Bold,sans-serif;font-weight:700;padding:0}:host ::ng-deep .p-multiselect:focus-within{box-shadow:none;background:#979797}.pi{border:none;background:none;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i6.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "directive", type: i7.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i8.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i8.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "component", type: i8.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i8.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i9.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: i10.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i12.IfPermissionDirective, selector: "[ocxIfPermission], [ocxIfNotPermission]", inputs: ["ocxIfPermission", "ocxIfNotPermission", "onMissingPermission", "ocxIfPermissionPermissions", "ocxIfNotPermissionPermissions"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.DatePipe, name: "date" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i13.OcxTimeAgoPipe, name: "timeago" }] }); }
|
|
588
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: DataTableComponent, deps: [{ token: LOCALE_ID }, { token: i1.TranslateService }, { token: i2.Router }, { token: i0.Injector }, { token: i3.UserService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
589
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.6", type: DataTableComponent, selector: "ocx-data-table", inputs: { rows: "rows", selectedRows: "selectedRows", filters: "filters", sortDirection: "sortDirection", sortColumn: "sortColumn", columns: "columns", clientSideFiltering: "clientSideFiltering", clientSideSorting: "clientSideSorting", sortStates: "sortStates", pageSizes: "pageSizes", pageSize: "pageSize", emptyResultsMessage: "emptyResultsMessage", name: "name", deletePermission: "deletePermission", viewPermission: "viewPermission", editPermission: "editPermission", deleteActionVisibleField: "deleteActionVisibleField", deleteActionEnabledField: "deleteActionEnabledField", viewActionVisibleField: "viewActionVisibleField", viewActionEnabledField: "viewActionEnabledField", editActionVisibleField: "editActionVisibleField", editActionEnabledField: "editActionEnabledField", selectionEnabledField: "selectionEnabledField", allowSelectAll: "allowSelectAll", paginator: "paginator", page: "page", totalRecordsOnServer: "totalRecordsOnServer", currentPageShowingKey: "currentPageShowingKey", currentPageShowingWithTotalOnServerKey: "currentPageShowingWithTotalOnServerKey", stringCellTemplate: "stringCellTemplate", numberCellTemplate: "numberCellTemplate", customCellTemplate: "customCellTemplate", dateCellTemplate: "dateCellTemplate", relativeDateCellTemplate: "relativeDateCellTemplate", cellTemplate: "cellTemplate", translationKeyCellTemplate: "translationKeyCellTemplate", stringFilterCellTemplate: "stringFilterCellTemplate", numberFilterCellTemplate: "numberFilterCellTemplate", customFilterCellTemplate: "customFilterCellTemplate", dateFilterCellTemplate: "dateFilterCellTemplate", relativeDateFilterCellTemplate: "relativeDateFilterCellTemplate", filterCellTemplate: "filterCellTemplate", translationKeyFilterCellTemplate: "translationKeyFilterCellTemplate", additionalActions: "additionalActions", frozenActionColumn: "frozenActionColumn", actionColumnPosition: "actionColumnPosition", parentTemplates: "parentTemplates" }, outputs: { filtered: "filtered", sorted: "sorted", viewTableRow: "viewTableRow", editTableRow: "editTableRow", deleteTableRow: "deleteTableRow", selectionChanged: "selectionChanged", pageChanged: "pageChanged", pageSizeChanged: "pageSizeChanged", componentStateChanged: "componentStateChanged" }, queries: [{ propertyName: "stringCellChildTemplate", first: true, predicate: ["stringCell"], descendants: true }, { propertyName: "numberCellChildTemplate", first: true, predicate: ["numberCell"], descendants: true }, { propertyName: "customCellChildTemplate", first: true, predicate: ["customCell"], descendants: true }, { propertyName: "dateCellChildTemplate", first: true, predicate: ["dateCell"], descendants: true }, { propertyName: "relativeDateCellChildTemplate", first: true, predicate: ["relativeDateCell"], descendants: true }, { propertyName: "cellChildTemplate", first: true, predicate: ["cell"], descendants: true }, { propertyName: "translationKeyCellChildTemplate", first: true, predicate: ["translationKeyCell"], descendants: true }, { propertyName: "stringFilterCellChildTemplate", first: true, predicate: ["stringFilterCell"], descendants: true }, { propertyName: "numberFilterCellChildTemplate", first: true, predicate: ["numberFilterCell"], descendants: true }, { propertyName: "customFilterCellChildTemplate", first: true, predicate: ["customFilterCell"], descendants: true }, { propertyName: "dateFilterCellChildTemplate", first: true, predicate: ["dateFilterCell"], descendants: true }, { propertyName: "relativeDateFilterCellChildTemplate", first: true, predicate: ["relativeDateFilterCell"], descendants: true }, { propertyName: "filterCellChildTemplate", first: true, predicate: ["filterCell"], descendants: true }, { propertyName: "translationKeyFilterCellChildTemplate", first: true, predicate: ["translationKeyFilterCell"], descendants: true }, { propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "viewTemplates", predicate: PrimeTemplate, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #actionColumn let-rowObject=\"localRowObject\">\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <td\n class=\"actions\"\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-left' : 'action-column-right'\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n >\n <div class=\"icon-button-row-wrapper\">\n <ng-container\n *ngIf=\"viewTableRowObserved && (!viewActionVisibleField || fieldIsTruthy(rowObject, viewActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(rowObject, viewActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text viewTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.VIEW' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.VIEW' | translate\"\n icon=\"pi pi-eye\"\n (click)=\"onViewRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"editTableRowObserved && (!editActionVisibleField || fieldIsTruthy(rowObject, editActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(rowObject, editActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text editTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.EDIT' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.EDIT' | translate\"\n icon=\"pi pi-pencil\"\n (click)=\"onEditRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"deleteTableRowObserved && (!deleteActionVisibleField || fieldIsTruthy(rowObject, deleteActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(rowObject, deleteActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text p-button-danger deleteTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.DELETE' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.DELETE' | translate\"\n icon=\"pi pi-trash\"\n (click)=\"onDeleteRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of inlineActions$ | async\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(rowObject, action.actionVisibleField))\">\n <button\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(rowObject)\"\n [title]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(rowObject, action.actionEnabledField))\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(rowObject) | async\">\n <p-menu #menu [model]=\"(overflowMenuItems$ | 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, rowObject)\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n [title]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n ></button>\n </ng-container>\n </div>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #actionColumnHeader>\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <th\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-header-left' : 'action-column-header-right'\"\n >\n {{ 'OCX_DATA_TABLE.ACTIONS_COLUMN_NAME' | translate }}\n </th>\n </ng-container>\n</ng-template>\n\n<ng-container *ngIf=\"(displayedPageSize$ | async) as displayedPageSize\">\n <p-table\n *ngIf=\"(columnTemplates$ | async) ?? {} as columnTemplates\"\n [value]=\"(displayedRows$ | async) ?? []\"\n responsiveLayout=\"scroll\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataTable_{{name}}\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selection]=\"(selectedRows$ | async) ?? []\"\n [scrollable]=\"true\"\n paginatorDropdownAppendTo=\"body\"\n >\n <ng-template pTemplate=\"header\">\n <tr>\n <th style=\"width: 4rem\" scope=\"col\" *ngIf=\"selectionChangedObserved\">\n <p-tableHeaderCheckbox\n *ngIf=\"allowSelectAll\"\n ariaLabel=\"{{'OCX_DATA_TABLE.SELECT_ALL_ARIA_LABEL' | translate}}\"\n ></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let column of columns\">\n <th *ngIf=\"column.sortable || column.filterable; else simpleHeader\" scope=\"col\">\n <div class=\"table-header-wrapper\">\n <span id=\"{{column.id}}-header-name\">{{ column.nameKey | translate }}</span>\n <span class=\"icon-button-header-wrapper\">\n <button\n *ngIf=\"column.sortable\"\n class=\"pi sortButton\"\n [class.pi-sort-alt]=\"(column?.id === sortColumn && sortDirection === 'NONE') || column?.id !== sortColumn\"\n [class.pi-sort-amount-up]=\"column?.id === sortColumn && sortDirection === 'ASCENDING'\"\n [class.pi-sort-amount-down]=\"column?.id === sortColumn && sortDirection === 'DESCENDING'\"\n (click)=\"onSortColumnClick(column.id)\"\n [title]=\"(sortIconTitle(column.id) | translate)\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.TOGGLE_BUTTON.ARIA_LABEL' | translate: { column: (column.nameKey | translate), direction: (sortDirectionToTitle(columnNextSortDirection(column.id)) | translate)})\"\n ></button>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable\"\n [options]=\"(currentFilterOptions$ | async) || []\"\n [ngModel]=\"(currentSelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onFocus)=\"onFilterChosen(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [ariaLabel]=\"'OCX_DATA_TABLE.COLUMN_FILTER_ARIA_LABEL' | translate\"\n [ariaFilterLabel]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value>\n <ng-container\n *ngIf=\"columnTemplates[column.id] as template\"\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n rowObject: getRowObjectFromMultiselectItem(value, column),\n column: column\n }\"\n >\n </ng-container>\n </ng-template>\n </p-multiSelect>\n </span>\n </div>\n </th>\n <ng-template #simpleHeader>\n <th scope=\"col\">{{ column.nameKey | translate }}</th>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowObject>\n <tr>\n <td *ngIf=\"selectionChangedObserved\">\n <p-checkbox\n *ngIf=\"(!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)) && isSelected(rowObject); else defaultCheckbox\"\n [(ngModel)]=\"checked\"\n [binary]=\"true\"\n [disabled]=\"true\"\n [ariaLabel]=\"'OCX_DATA_TABLE.SELECT_ARIA_LABEL' | translate: { key: rowObject.id}\"\n ></p-checkbox>\n <ng-template #defaultCheckbox>\n <p-tableCheckbox\n [value]=\"rowObject\"\n [disabled]=\"!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)\"\n [ariaLabel]=\"'OCX_DATA_TABLE.SELECT_ARIA_LABEL' | translate: { key: rowObject.id}\"\n ></p-tableCheckbox>\n </ng-template>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n <td *ngFor=\"let column of columns\">\n <ng-container\n [ngTemplateOutlet]=\"\n _cell ? _cell: columnTemplates[column.id]\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column,\n }\"\n ></ng-container>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [colSpan]=\"columns.length + ((anyRowActionObserved || this.additionalActions.length > 0) ? 1 : 0)\">\n {{ emptyResultsMessage || (\"OCX_DATA_TABLE.EMPTY_RESULT\" | translate) }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n</ng-container>\n\n<ng-template pTemplate=\"defaultStringCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id)}} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultNumberCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | number }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultCustomCell\" let-rowObject=\"rowObject\" let-column=\"column\"> </ng-template>\n\n<ng-template pTemplate=\"defaultDateCell\" 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=\"defaultRelativeDateCell\" 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=\"defaultTranslationKeyCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | translate }} </ng-container>\n</ng-template>\n", styles: [":host ::ng-deep .p-multiselect{padding:0;background:#f7f7f7;border:none}:host ::ng-deep .p-multiselect .p-multiselect-container{height:20px;width:20px}:host ::ng-deep .p-multiselect .p-multiselect-trigger{display:none}:host ::ng-deep .p-multiselect .p-multiselect-label.p-placeholder{color:#262626;font-size:.9rem;font-family:Bold,sans-serif;font-weight:700;padding:0}:host ::ng-deep .p-multiselect:focus-within{box-shadow:none;background:#979797}.pi{border:none;background:none;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i6.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "directive", type: i7.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i8.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i8.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "component", type: i8.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i8.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i9.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: i10.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i12.IfPermissionDirective, selector: "[ocxIfPermission], [ocxIfNotPermission]", inputs: ["ocxIfPermission", "ocxIfNotPermission", "onMissingPermission", "ocxIfPermissionPermissions", "ocxIfNotPermissionPermissions"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.DatePipe, name: "date" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i13.OcxTimeAgoPipe, name: "timeago" }] }); }
|
|
590
590
|
}
|
|
591
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.
|
|
591
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: DataTableComponent, decorators: [{
|
|
592
592
|
type: Component,
|
|
593
|
-
args: [{ selector: 'ocx-data-table', template: "<ng-template #actionColumn let-rowObject=\"localRowObject\">\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <td\n class=\"actions\"\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-left' : 'action-column-right'\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n >\n <div class=\"icon-button-row-wrapper\">\n <ng-container\n *ngIf=\"viewTableRowObserved && (!viewActionVisibleField || fieldIsTruthy(rowObject, viewActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(rowObject, viewActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text viewTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.VIEW' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.VIEW' | translate\"\n icon=\"pi pi-eye\"\n (click)=\"onViewRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"editTableRowObserved && (!editActionVisibleField || fieldIsTruthy(rowObject, editActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(rowObject, editActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text editTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.EDIT' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.EDIT' | translate\"\n icon=\"pi pi-pencil\"\n (click)=\"onEditRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"deleteTableRowObserved && (!deleteActionVisibleField || fieldIsTruthy(rowObject, deleteActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(rowObject, deleteActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text p-button-danger deleteTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.DELETE' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.DELETE' | translate\"\n icon=\"pi pi-trash\"\n (click)=\"onDeleteRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of inlineActions$ | async\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(rowObject, action.actionVisibleField))\">\n <button\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(rowObject)\"\n [title]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(rowObject, action.actionEnabledField))\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(rowObject) | async\">\n <p-menu #menu [model]=\"(overflowMenuItems$ | 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, rowObject)\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n [title]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n ></button>\n </ng-container>\n </div>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #actionColumnHeader>\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <th\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-header-left' : 'action-column-header-right'\"\n >\n {{ 'OCX_DATA_TABLE.ACTIONS_COLUMN_NAME' | translate }}\n </th>\n </ng-container>\n</ng-template>\n\n<ng-container *ngIf=\"(displayedPageSize$ | async) as displayedPageSize\">\n <p-table\n *ngIf=\"(columnTemplates$ | async) ?? {} as columnTemplates\"\n [value]=\"(displayedRows$ | async) ?? []\"\n responsiveLayout=\"scroll\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataTable_{{name}}\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selection]=\"(selectedRows$ | async) ?? []\"\n [scrollable]=\"true\"\n paginatorDropdownAppendTo=\"body\"\n >\n <ng-template pTemplate=\"header\">\n <tr>\n <th style=\"width: 4rem\" scope=\"col\" *ngIf=\"selectionChangedObserved\">\n <p-tableHeaderCheckbox *ngIf=\"allowSelectAll\"></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let column of columns\">\n <th *ngIf=\"column.sortable || column.filterable; else simpleHeader\" scope=\"col\">\n <div class=\"table-header-wrapper\">\n <span id=\"{{column.id}}-header-name\">{{ column.nameKey | translate }}</span>\n <span class=\"icon-button-header-wrapper\">\n <button\n *ngIf=\"column.sortable\"\n class=\"pi sortButton\"\n [class.pi-sort-alt]=\"(column?.id === sortColumn && sortDirection === 'NONE') || column?.id !== sortColumn\"\n [class.pi-sort-amount-up]=\"column?.id === sortColumn && sortDirection === 'ASCENDING'\"\n [class.pi-sort-amount-down]=\"column?.id === sortColumn && sortDirection === 'DESCENDING'\"\n (click)=\"onSortColumnClick(column.id)\"\n [title]=\"(sortIconTitle(column.id) | translate)\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.TOGGLE_BUTTON.ARIA_LABEL' | translate: { column: (column.nameKey | translate), direction: (sortDirectionToTitle(columnNextSortDirection(column.id)) | translate)})\"\n ></button>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable\"\n [options]=\"(currentFilterOptions$ | async) || []\"\n [ngModel]=\"(currentSelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onClick)=\"onFilterClick(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value>\n <ng-container\n *ngIf=\"columnTemplates[column.id] as template\"\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n rowObject: getRowObjectFromMultiselectItem(value, column),\n column: column\n }\"\n >\n </ng-container>\n </ng-template>\n </p-multiSelect>\n </span>\n </div>\n </th>\n <ng-template #simpleHeader>\n <th scope=\"col\">{{ column.nameKey | translate }}</th>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowObject>\n <tr>\n <td *ngIf=\"selectionChangedObserved\">\n <p-checkbox\n *ngIf=\"(!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)) && isSelected(rowObject); else defaultCheckbox\"\n [(ngModel)]=\"checked\"\n [binary]=\"true\"\n [disabled]=\"true\"\n ></p-checkbox>\n <ng-template #defaultCheckbox>\n <p-tableCheckbox\n [value]=\"rowObject\"\n [disabled]=\"!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)\"\n ></p-tableCheckbox>\n </ng-template>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n <td *ngFor=\"let column of columns\">\n <ng-container\n [ngTemplateOutlet]=\"\n _cell ? _cell: columnTemplates[column.id]\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column,\n }\"\n ></ng-container>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [colSpan]=\"columns.length + ((anyRowActionObserved || this.additionalActions.length > 0) ? 1 : 0)\">\n {{ emptyResultsMessage || (\"OCX_DATA_TABLE.EMPTY_RESULT\" | translate) }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n</ng-container>\n\n<ng-template pTemplate=\"defaultStringCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id)}} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultNumberCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | number }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultCustomCell\" let-rowObject=\"rowObject\" let-column=\"column\"> </ng-template>\n\n<ng-template pTemplate=\"defaultDateCell\" 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=\"defaultRelativeDateCell\" 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=\"defaultTranslationKeyCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | translate }} </ng-container>\n</ng-template>\n", styles: [":host ::ng-deep .p-multiselect{padding:0;background:#f7f7f7;border:none}:host ::ng-deep .p-multiselect .p-multiselect-container{height:20px;width:20px}:host ::ng-deep .p-multiselect .p-multiselect-trigger{display:none}:host ::ng-deep .p-multiselect .p-multiselect-label.p-placeholder{color:#262626;font-size:.9rem;font-family:Bold,sans-serif;font-weight:700;padding:0}:host ::ng-deep .p-multiselect:focus-within{box-shadow:none;background:#979797}.pi{border:none;background:none;cursor:pointer}\n"] }]
|
|
593
|
+
args: [{ selector: 'ocx-data-table', template: "<ng-template #actionColumn let-rowObject=\"localRowObject\">\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <td\n class=\"actions\"\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-left' : 'action-column-right'\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n >\n <div class=\"icon-button-row-wrapper\">\n <ng-container\n *ngIf=\"viewTableRowObserved && (!viewActionVisibleField || fieldIsTruthy(rowObject, viewActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(rowObject, viewActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text viewTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.VIEW' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.VIEW' | translate\"\n icon=\"pi pi-eye\"\n (click)=\"onViewRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"editTableRowObserved && (!editActionVisibleField || fieldIsTruthy(rowObject, editActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(rowObject, editActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text editTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.EDIT' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.EDIT' | translate\"\n icon=\"pi pi-pencil\"\n (click)=\"onEditRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"deleteTableRowObserved && (!deleteActionVisibleField || fieldIsTruthy(rowObject, deleteActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(rowObject, deleteActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text p-button-danger deleteTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.DELETE' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.DELETE' | translate\"\n icon=\"pi pi-trash\"\n (click)=\"onDeleteRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of inlineActions$ | async\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(rowObject, action.actionVisibleField))\">\n <button\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(rowObject)\"\n [title]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(rowObject, action.actionEnabledField))\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(rowObject) | async\">\n <p-menu #menu [model]=\"(overflowMenuItems$ | 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, rowObject)\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n [title]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n ></button>\n </ng-container>\n </div>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #actionColumnHeader>\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <th\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-header-left' : 'action-column-header-right'\"\n >\n {{ 'OCX_DATA_TABLE.ACTIONS_COLUMN_NAME' | translate }}\n </th>\n </ng-container>\n</ng-template>\n\n<ng-container *ngIf=\"(displayedPageSize$ | async) as displayedPageSize\">\n <p-table\n *ngIf=\"(columnTemplates$ | async) ?? {} as columnTemplates\"\n [value]=\"(displayedRows$ | async) ?? []\"\n responsiveLayout=\"scroll\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataTable_{{name}}\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selection]=\"(selectedRows$ | async) ?? []\"\n [scrollable]=\"true\"\n paginatorDropdownAppendTo=\"body\"\n >\n <ng-template pTemplate=\"header\">\n <tr>\n <th style=\"width: 4rem\" scope=\"col\" *ngIf=\"selectionChangedObserved\">\n <p-tableHeaderCheckbox\n *ngIf=\"allowSelectAll\"\n ariaLabel=\"{{'OCX_DATA_TABLE.SELECT_ALL_ARIA_LABEL' | translate}}\"\n ></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let column of columns\">\n <th *ngIf=\"column.sortable || column.filterable; else simpleHeader\" scope=\"col\">\n <div class=\"table-header-wrapper\">\n <span id=\"{{column.id}}-header-name\">{{ column.nameKey | translate }}</span>\n <span class=\"icon-button-header-wrapper\">\n <button\n *ngIf=\"column.sortable\"\n class=\"pi sortButton\"\n [class.pi-sort-alt]=\"(column?.id === sortColumn && sortDirection === 'NONE') || column?.id !== sortColumn\"\n [class.pi-sort-amount-up]=\"column?.id === sortColumn && sortDirection === 'ASCENDING'\"\n [class.pi-sort-amount-down]=\"column?.id === sortColumn && sortDirection === 'DESCENDING'\"\n (click)=\"onSortColumnClick(column.id)\"\n [title]=\"(sortIconTitle(column.id) | translate)\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.TOGGLE_BUTTON.ARIA_LABEL' | translate: { column: (column.nameKey | translate), direction: (sortDirectionToTitle(columnNextSortDirection(column.id)) | translate)})\"\n ></button>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable\"\n [options]=\"(currentFilterOptions$ | async) || []\"\n [ngModel]=\"(currentSelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onFocus)=\"onFilterChosen(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [ariaLabel]=\"'OCX_DATA_TABLE.COLUMN_FILTER_ARIA_LABEL' | translate\"\n [ariaFilterLabel]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value>\n <ng-container\n *ngIf=\"columnTemplates[column.id] as template\"\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n rowObject: getRowObjectFromMultiselectItem(value, column),\n column: column\n }\"\n >\n </ng-container>\n </ng-template>\n </p-multiSelect>\n </span>\n </div>\n </th>\n <ng-template #simpleHeader>\n <th scope=\"col\">{{ column.nameKey | translate }}</th>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowObject>\n <tr>\n <td *ngIf=\"selectionChangedObserved\">\n <p-checkbox\n *ngIf=\"(!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)) && isSelected(rowObject); else defaultCheckbox\"\n [(ngModel)]=\"checked\"\n [binary]=\"true\"\n [disabled]=\"true\"\n [ariaLabel]=\"'OCX_DATA_TABLE.SELECT_ARIA_LABEL' | translate: { key: rowObject.id}\"\n ></p-checkbox>\n <ng-template #defaultCheckbox>\n <p-tableCheckbox\n [value]=\"rowObject\"\n [disabled]=\"!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)\"\n [ariaLabel]=\"'OCX_DATA_TABLE.SELECT_ARIA_LABEL' | translate: { key: rowObject.id}\"\n ></p-tableCheckbox>\n </ng-template>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n <td *ngFor=\"let column of columns\">\n <ng-container\n [ngTemplateOutlet]=\"\n _cell ? _cell: columnTemplates[column.id]\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column,\n }\"\n ></ng-container>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [colSpan]=\"columns.length + ((anyRowActionObserved || this.additionalActions.length > 0) ? 1 : 0)\">\n {{ emptyResultsMessage || (\"OCX_DATA_TABLE.EMPTY_RESULT\" | translate) }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n</ng-container>\n\n<ng-template pTemplate=\"defaultStringCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id)}} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultNumberCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | number }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultCustomCell\" let-rowObject=\"rowObject\" let-column=\"column\"> </ng-template>\n\n<ng-template pTemplate=\"defaultDateCell\" 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=\"defaultRelativeDateCell\" 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=\"defaultTranslationKeyCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | translate }} </ng-container>\n</ng-template>\n", styles: [":host ::ng-deep .p-multiselect{padding:0;background:#f7f7f7;border:none}:host ::ng-deep .p-multiselect .p-multiselect-container{height:20px;width:20px}:host ::ng-deep .p-multiselect .p-multiselect-trigger{display:none}:host ::ng-deep .p-multiselect .p-multiselect-label.p-placeholder{color:#262626;font-size:.9rem;font-family:Bold,sans-serif;font-weight:700;padding:0}:host ::ng-deep .p-multiselect:focus-within{box-shadow:none;background:#979797}.pi{border:none;background:none;cursor:pointer}\n"] }]
|
|
594
594
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
595
595
|
type: Inject,
|
|
596
596
|
args: [LOCALE_ID]
|
|
@@ -755,4 +755,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImpor
|
|
|
755
755
|
}], parentTemplates: [{
|
|
756
756
|
type: Input
|
|
757
757
|
}] } });
|
|
758
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLFNBQVMsRUFFVCxNQUFNLEVBR04sWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQ2xFLE9BQU8sRUFBWSxhQUFhLEVBQWMsTUFBTSxhQUFhLENBQUE7QUFFakUsT0FBTyxFQUNMLGVBQWUsRUFFZixhQUFhLEVBQ2IsWUFBWSxFQUNaLEtBQUssRUFDTCxHQUFHLEVBQ0gsUUFBUSxFQUNSLEVBQUUsRUFDRixjQUFjLEdBQ2YsTUFBTSxNQUFNLENBQUE7QUFDYixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUE7QUFJMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7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Q3NCLHVCQUF1QjtzQkFBbEQsWUFBWTt1QkFBQyxZQUFZO2dCQUlqQixnQ0FBZ0M7c0JBQXhDLEtBQUs7Z0JBQ29DLHFDQUFxQztzQkFBOUUsWUFBWTt1QkFBQywwQkFBMEI7Z0JBT3BDLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFPRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQW1CSCxTQUFTO3NCQURaLGVBQWU7dUJBQUMsYUFBYTtnQkFTMUIsYUFBYTtzQkFEaEIsWUFBWTt1QkFBQyxhQUFhO2dCQVN2QixlQUFlO3NCQURsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgTE9DQUxFX0lELFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnXG5pbXBvcnQgeyBpc1ZhbGlkRGF0ZSB9IGZyb20gJ0BvbmVjeC9hY2NlbGVyYXRvcidcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnQG9uZWN4L2FuZ3VsYXItaW50ZWdyYXRpb24taW50ZXJmYWNlJ1xuaW1wb3J0IHsgTWVudUl0ZW0sIFByaW1lVGVtcGxhdGUsIFNlbGVjdEl0ZW0gfSBmcm9tICdwcmltZW5nL2FwaSdcbmltcG9ydCB7IE1lbnUgfSBmcm9tICdwcmltZW5nL21lbnUnXG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgZmlyc3QsXG4gIG1hcCxcbiAgbWVyZ2VNYXAsXG4gIG9mLFxuICB3aXRoTGF0ZXN0RnJvbSxcbn0gZnJvbSAncnhqcydcbmltcG9ydCB7IENvbHVtblR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbC9jb2x1bW4tdHlwZS5tb2RlbCdcbmltcG9ydCB7IERhdGFBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbC9kYXRhLWFjdGlvbidcbmltcG9ydCB7IERhdGFTb3J0RGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWwvZGF0YS1zb3J0LWRpcmVjdGlvbidcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbiB9IGZyb20gJy4uLy4uL21vZGVsL2RhdGEtdGFibGUtY29sdW1uLm1vZGVsJ1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tICcuLi8uLi91dGlscy9vYmplY3R1dGlscydcbmltcG9ydCB7IERhdGFTb3J0QmFzZSB9IGZyb20gJy4uL2RhdGEtc29ydC1iYXNlL2RhdGEtc29ydC1iYXNlJ1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RJdGVtIH0gZnJvbSAncHJpbWVuZy9tdWx0aXNlbGVjdCdcblxudHlwZSBQcmltaXRpdmUgPSBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgYmlnaW50IHwgRGF0ZVxuZXhwb3J0IHR5cGUgUm93ID0ge1xuICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gIFtjb2x1bW5JZDogc3RyaW5nXTogdW5rbm93blxufVxuXG5leHBvcnQgZW51bSBUZW1wbGF0ZVR5cGUge1xuICBDRUxMID0gJ0NFTEwnLFxuICBGSUxURVJDRUxMID0gJ0ZJTFRFUkNFTEwnLFxufVxuXG5pbnRlcmZhY2UgVGVtcGxhdGVzRGF0YSB7XG4gIHRlbXBsYXRlc09ic2VydmFibGVzOiBSZWNvcmQ8c3RyaW5nLCBPYnNlcnZhYmxlPFRlbXBsYXRlUmVmPGFueT4gfCBudWxsPj5cbiAgaWRTdWZmaXg6IEFycmF5PHN0cmluZz5cbiAgdGVtcGxhdGVOYW1lczogUmVjb3JkPENvbHVtblR5cGUsIEFycmF5PHN0cmluZz4+XG59XG5cbmV4cG9ydCB0eXBlIEZpbHRlciA9IHsgY29sdW1uSWQ6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9XG5leHBvcnQgdHlwZSBTb3J0ID0geyBzb3J0Q29sdW1uOiBzdHJpbmc7IHNvcnREaXJlY3Rpb246IERhdGFTb3J0RGlyZWN0aW9uIH1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhVGFibGVDb21wb25lbnRTdGF0ZSB7XG4gIGZpbHRlcnM/OiBGaWx0ZXJbXVxuICBzb3J0aW5nPzogU29ydFxuICBzZWxlY3RlZFJvd3M/OiBSb3dbXVxuICBhY3RpdmVQYWdlPzogbnVtYmVyXG4gIHBhZ2VTaXplPzogbnVtYmVyXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29jeC1kYXRhLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUNvbXBvbmVudCBleHRlbmRzIERhdGFTb3J0QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIFRlbXBsYXRlVHlwZSA9IFRlbXBsYXRlVHlwZVxuICBjaGVja2VkID0gdHJ1ZVxuICBfcm93cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJvd1tdPihbXSlcbiAgQElucHV0KClcbiAgZ2V0IHJvd3MoKTogUm93W10ge1xuICAgIHJldHVybiB0aGlzLl9yb3dzJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHJvd3ModmFsdWU6IFJvd1tdKSB7XG4gICAgIXRoaXMuX3Jvd3MkLmdldFZhbHVlKCkubGVuZ3RoID8/IHRoaXMucmVzZXRQYWdlKClcbiAgICB0aGlzLl9yb3dzJC5uZXh0KHZhbHVlKVxuICB9XG4gIF9zZWxlY3Rpb25JZHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDwoc3RyaW5nIHwgbnVtYmVyKVtdPihbXSlcbiAgQElucHV0KClcbiAgc2V0IHNlbGVjdGVkUm93cyh2YWx1ZTogUm93W10gfCBzdHJpbmdbXSB8IG51bWJlcltdKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uSWRzJC5uZXh0KFxuICAgICAgdmFsdWUubWFwKChyb3cpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByb3cgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgcmV0dXJuIHJvdy5pZFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgX2ZpbHRlcnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGaWx0ZXJbXT4oW10pXG4gIEBJbnB1dCgpXG4gIGdldCBmaWx0ZXJzKCk6IEZpbHRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVycyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCBmaWx0ZXJzKHZhbHVlOiBGaWx0ZXJbXSkge1xuICAgICF0aGlzLl9maWx0ZXJzJC5nZXRWYWx1ZSgpLmxlbmd0aCA/PyB0aGlzLnJlc2V0UGFnZSgpXG4gICAgdGhpcy5fZmlsdGVycyQubmV4dCh2YWx1ZSlcbiAgfVxuICBfc29ydERpcmVjdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFTb3J0RGlyZWN0aW9uPihEYXRhU29ydERpcmVjdGlvbi5OT05FKVxuICBASW5wdXQoKVxuICBnZXQgc29ydERpcmVjdGlvbigpOiBEYXRhU29ydERpcmVjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnREaXJlY3Rpb24kLmdldFZhbHVlKClcbiAgfVxuICBzZXQgc29ydERpcmVjdGlvbih2YWx1ZTogRGF0YVNvcnREaXJlY3Rpb24pIHtcbiAgICB0aGlzLl9zb3J0RGlyZWN0aW9uJC5uZXh0KHZhbHVlKVxuICB9XG4gIF9zb3J0Q29sdW1uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJylcbiAgQElucHV0KClcbiAgZ2V0IHNvcnRDb2x1bW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcz8uX3NvcnRDb2x1bW4kLmdldFZhbHVlKClcbiAgfVxuICBzZXQgc29ydENvbHVtbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcz8uX3NvcnRDb2x1bW4kLm5leHQodmFsdWUpXG4gIH1cbiAgY29sdW1uVGVtcGxhdGVzJDogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4+IHwgdW5kZWZpbmVkXG4gIF9jb2x1bW5zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0YVRhYmxlQ29sdW1uW10+KFtdKVxuICBASW5wdXQoKVxuICBnZXQgY29sdW1ucygpOiBEYXRhVGFibGVDb2x1bW5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgY29sdW1ucyh2YWx1ZTogRGF0YVRhYmxlQ29sdW1uW10pIHtcbiAgICB0aGlzLl9jb2x1bW5zJC5uZXh0KHZhbHVlKVxuICAgIGNvbnN0IG9icyA9IHZhbHVlLm1hcCgoYykgPT4gdGhpcy5nZXRUZW1wbGF0ZShjLCBUZW1wbGF0ZVR5cGUuQ0VMTCkpXG4gICAgdGhpcy5jb2x1bW5UZW1wbGF0ZXMkID0gY29tYmluZUxhdGVzdChvYnMpLnBpcGUoXG4gICAgICBtYXAoKHZhbHVlcykgPT4gT2JqZWN0LmZyb21FbnRyaWVzKHZhbHVlLm1hcCgoYywgaSkgPT4gW2MuaWQsIHZhbHVlc1tpXV0pKSlcbiAgICApXG4gIH1cbiAgQElucHV0KCkgY2xpZW50U2lkZUZpbHRlcmluZyA9IHRydWVcbiAgQElucHV0KCkgY2xpZW50U2lkZVNvcnRpbmcgPSB0cnVlXG4gIEBJbnB1dCgpIHNvcnRTdGF0ZXM6IERhdGFTb3J0RGlyZWN0aW9uW10gPSBbRGF0YVNvcnREaXJlY3Rpb24uQVNDRU5ESU5HLCBEYXRhU29ydERpcmVjdGlvbi5ERVNDRU5ESU5HXVxuXG4gIGRpc3BsYXllZFBhZ2VTaXplcyQ6IE9ic2VydmFibGU8KG51bWJlciB8IHsgc2hvd0FsbDogc3RyaW5nIH0pW10+XG4gIF9wYWdlU2l6ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDwobnVtYmVyIHwgeyBzaG93QWxsOiBzdHJpbmcgfSlbXT4oWzEwLCAyNSwgNTBdKVxuICBASW5wdXQoKVxuICBnZXQgcGFnZVNpemVzKCk6IChudW1iZXIgfCB7IHNob3dBbGw6IHN0cmluZyB9KVtdIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZVNpemVzJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHBhZ2VTaXplcyh2YWx1ZTogKG51bWJlciB8IHsgc2hvd0FsbDogc3RyaW5nIH0pW10pIHtcbiAgICB0aGlzLl9wYWdlU2l6ZXMkLm5leHQodmFsdWUpXG4gIH1cbiAgZGlzcGxheWVkUGFnZVNpemUkOiBPYnNlcnZhYmxlPG51bWJlcj5cbiAgX3BhZ2VTaXplJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG4gIEBJbnB1dCgpXG4gIGdldCBwYWdlU2l6ZSgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZSQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCBwYWdlU2l6ZSh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcGFnZVNpemUkLm5leHQodmFsdWUpXG4gIH1cblxuICBASW5wdXQoKSBlbXB0eVJlc3VsdHNNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgbmFtZSA9ICcnXG4gIEBJbnB1dCgpIGRlbGV0ZVBlcm1pc3Npb246IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSB2aWV3UGVybWlzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGVkaXRQZXJtaXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZGVsZXRlQWN0aW9uRW5hYmxlZEZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgdmlld0FjdGlvblZpc2libGVGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHZpZXdBY3Rpb25FbmFibGVkRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBlZGl0QWN0aW9uVmlzaWJsZUZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZWRpdEFjdGlvbkVuYWJsZWRGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHNlbGVjdGlvbkVuYWJsZWRGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGFsbG93U2VsZWN0QWxsID0gdHJ1ZVxuICBASW5wdXQoKSBwYWdpbmF0b3IgPSB0cnVlXG4gIEBJbnB1dCgpIHBhZ2UgPSAwXG4gIEBJbnB1dCgpXG4gIGdldCB0b3RhbFJlY29yZHNPblNlcnZlcigpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmFtc1sndG90YWxSZWNvcmRzT25TZXJ2ZXInXSA/IE51bWJlcih0aGlzLnBhcmFtc1sndG90YWxSZWNvcmRzT25TZXJ2ZXInXSkgOiB1bmRlZmluZWRcbiAgfVxuICBzZXQgdG90YWxSZWNvcmRzT25TZXJ2ZXIodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMucGFyYW1zWyd0b3RhbFJlY29yZHNPblNlcnZlciddID0gdmFsdWU/LnRvU3RyaW5nKCkgPz8gJzAnXG4gIH1cbiAgQElucHV0KCkgY3VycmVudFBhZ2VTaG93aW5nS2V5ID0gJ09DWF9EQVRBX1RBQkxFLlNIT1dJTkcnXG4gIEBJbnB1dCgpIGN1cnJlbnRQYWdlU2hvd2luZ1dpdGhUb3RhbE9uU2VydmVyS2V5ID0gJ09DWF9EQVRBX1RBQkxFLlNIT1dJTkdfV0lUSF9UT1RBTF9PTl9TRVJWRVInXG4gIHBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICBjdXJyZW50UGFnZTogJ3tjdXJyZW50UGFnZX0nLFxuICAgIHRvdGFsUGFnZXM6ICd7dG90YWxQYWdlc30nLFxuICAgIHJvd3M6ICd7cm93c30nLFxuICAgIGZpcnN0OiAne2ZpcnN0fScsXG4gICAgbGFzdDogJ3tsYXN0fScsXG4gICAgdG90YWxSZWNvcmRzOiAne3RvdGFsUmVjb3Jkc30nLFxuICB9XG5cbiAgQElucHV0KCkgc3RyaW5nQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ3N0cmluZ0NlbGwnKSBzdHJpbmdDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3N0cmluZ0NlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RyaW5nQ2VsbFRlbXBsYXRlIHx8IHRoaXMuc3RyaW5nQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIEBJbnB1dCgpIG51bWJlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdudW1iZXJDZWxsJykgbnVtYmVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9udW1iZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm51bWJlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLm51bWJlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGFuZCBpbnN0ZWFkIHRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgb2YgYSBzcGVjaWZpYyBjb2x1bW5cbiAgICogdXNlIHRoZSBuZXcgYXBwcm9hY2ggaW5zdGVhZCBieSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uIGNvbHVtbiBpZCArIElkQ2VsbFxuICAgKiBlLmcuIGZvciBhIGNvbHVtbiB3aXRoIHRoZSBpZCAnc3RhdHVzJyB1c2UgcFRlbXBsYXRlPVwic3RhdHVzSWRDZWxsXCJcbiAgICovXG4gIEBJbnB1dCgpIGN1c3RvbUNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGFuZCBpbnN0ZWFkIHRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgb2YgYSBzcGVjaWZpYyBjb2x1bW5cbiAgICogdXNlIHRoZSBuZXcgYXBwcm9hY2ggaW5zdGVhZCBieSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uIGNvbHVtbiBpZCArIElkQ2VsbFxuICAgKiBlLmcuIGZvciBhIGNvbHVtbiB3aXRoIHRoZSBpZCAnc3RhdHVzJyB1c2UgcFRlbXBsYXRlPVwic3RhdHVzSWRDZWxsXCJcbiAgICovXG4gIEBDb250ZW50Q2hpbGQoJ2N1c3RvbUNlbGwnKSBjdXN0b21DZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2N1c3RvbUNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tQ2VsbFRlbXBsYXRlIHx8IHRoaXMuY3VzdG9tQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIEBJbnB1dCgpIGRhdGVDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnZGF0ZUNlbGwnKSBkYXRlQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9kYXRlQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlQ2VsbFRlbXBsYXRlIHx8IHRoaXMuZGF0ZUNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cblxuICBASW5wdXQoKSByZWxhdGl2ZURhdGVDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgncmVsYXRpdmVEYXRlQ2VsbCcpIHJlbGF0aXZlRGF0ZUNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfcmVsYXRpdmVEYXRlQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWxhdGl2ZURhdGVDZWxsVGVtcGxhdGUgfHwgdGhpcy5yZWxhdGl2ZURhdGVDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgY2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ2NlbGwnKSBjZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2NlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbFRlbXBsYXRlIHx8IHRoaXMuY2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICBASW5wdXQoKSB0cmFuc2xhdGlvbktleUNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCd0cmFuc2xhdGlvbktleUNlbGwnKSB0cmFuc2xhdGlvbktleUNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfdHJhbnNsYXRpb25LZXlDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uS2V5Q2VsbFRlbXBsYXRlIHx8IHRoaXMudHJhbnNsYXRpb25LZXlDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIEBJbnB1dCgpIHN0cmluZ0ZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdzdHJpbmdGaWx0ZXJDZWxsJykgc3RyaW5nRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9zdHJpbmdGaWx0ZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0cmluZ0ZpbHRlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLnN0cmluZ0ZpbHRlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgbnVtYmVyRmlsdGVyQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ251bWJlckZpbHRlckNlbGwnKSBudW1iZXJGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX251bWJlckZpbHRlckNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubnVtYmVyRmlsdGVyQ2VsbFRlbXBsYXRlIHx8IHRoaXMubnVtYmVyRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGFuZCBpbnN0ZWFkIHRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgb2YgYSBzcGVjaWZpYyBjb2x1bW4gZmlsdGVyXG4gICAqIHVzZSB0aGUgbmV3IGFwcHJvYWNoIGluc3RlYWQgYnkgZm9sbG93aW5nIHRoZSBuYW1pbmcgY29udmVudGlvbiBjb2x1bW4gaWQgKyBJZEZpbHRlckNlbGxcbiAgICogZS5nLiBmb3IgYSBjb2x1bW4gd2l0aCB0aGUgaWQgJ3N0YXR1cycgdXNlIHBUZW1wbGF0ZT1cInN0YXR1c0lkRmlsdGVyQ2VsbFwiXG4gICAqL1xuICBASW5wdXQoKSBjdXN0b21GaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBhbmQgaW5zdGVhZCB0byBjaGFuZ2UgdGhlIHRlbXBsYXRlIG9mIGEgc3BlY2lmaWMgY29sdW1uIGZpbHRlclxuICAgKiB1c2UgdGhlIG5ldyBhcHByb2FjaCBpbnN0ZWFkIGJ5IGZvbGxvd2luZyB0aGUgbmFtaW5nIGNvbnZlbnRpb24gY29sdW1uIGlkICsgSWRGaWx0ZXJDZWxsXG4gICAqIGUuZy4gZm9yIGEgY29sdW1uIHdpdGggdGhlIGlkICdzdGF0dXMnIHVzZSBwVGVtcGxhdGU9XCJzdGF0dXNJZEZpbHRlckNlbGxcIlxuICAgKi9cbiAgQENvbnRlbnRDaGlsZCgnY3VzdG9tRmlsdGVyQ2VsbCcpIGN1c3RvbUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfY3VzdG9tRmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21GaWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5jdXN0b21GaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIEBJbnB1dCgpIGRhdGVGaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnZGF0ZUZpbHRlckNlbGwnKSBkYXRlRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9kYXRlRmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlRmlsdGVyQ2VsbFRlbXBsYXRlIHx8IHRoaXMuZGF0ZUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgcmVsYXRpdmVEYXRlRmlsdGVyQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ3JlbGF0aXZlRGF0ZUZpbHRlckNlbGwnKSByZWxhdGl2ZURhdGVGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3JlbGF0aXZlRGF0ZUZpbHRlckNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVsYXRpdmVEYXRlRmlsdGVyQ2VsbFRlbXBsYXRlIHx8IHRoaXMucmVsYXRpdmVEYXRlRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICBASW5wdXQoKSBmaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnZmlsdGVyQ2VsbCcpIGZpbHRlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfZmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5maWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ3RyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbCcpIHRyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF90cmFuc2xhdGlvbktleUZpbHRlckNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy50cmFuc2xhdGlvbktleUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cblxuICBfYWRkaXRpb25hbEFjdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhQWN0aW9uW10+KFtdKVxuICBASW5wdXQoKVxuICBnZXQgYWRkaXRpb25hbEFjdGlvbnMoKTogRGF0YUFjdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkaXRpb25hbEFjdGlvbnMkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgYWRkaXRpb25hbEFjdGlvbnModmFsdWU6IERhdGFBY3Rpb25bXSkge1xuICAgIHRoaXMuX2FkZGl0aW9uYWxBY3Rpb25zJC5uZXh0KHZhbHVlKVxuICB9XG4gIEBJbnB1dCgpIGZyb3plbkFjdGlvbkNvbHVtbiA9IGZhbHNlXG4gIEBJbnB1dCgpIGFjdGlvbkNvbHVtblBvc2l0aW9uOiAnbGVmdCcgfCAncmlnaHQnID0gJ3JpZ2h0J1xuXG4gIEBPdXRwdXQoKSBmaWx0ZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsdGVyW10+KClcbiAgQE91dHB1dCgpIHNvcnRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ydD4oKVxuICBAT3V0cHV0KCkgdmlld1RhYmxlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxSb3c+KClcbiAgQE91dHB1dCgpIGVkaXRUYWJsZVJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8Um93PigpXG4gIEBPdXRwdXQoKSBkZWxldGVUYWJsZVJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8Um93PigpXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxSb3dbXT4oKVxuICBAT3V0cHV0KCkgcGFnZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKVxuICBAT3V0cHV0KCkgcGFnZVNpemVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KClcbiAgQE91dHB1dCgpIGNvbXBvbmVudFN0YXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQ29tcG9uZW50U3RhdGU+KClcblxuICBkaXNwbGF5ZWRSb3dzJDogT2JzZXJ2YWJsZTx1bmtub3duW10+IHwgdW5kZWZpbmVkXG4gIHNlbGVjdGVkUm93cyQ6IE9ic2VydmFibGU8dW5rbm93bltdPiB8IHVuZGVmaW5lZFxuXG4gIGN1cnJlbnRGaWx0ZXJDb2x1bW4kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhVGFibGVDb2x1bW4gfCBudWxsPihudWxsKVxuICBjdXJyZW50RmlsdGVyT3B0aW9ucyQ6IE9ic2VydmFibGU8U2VsZWN0SXRlbVtdPiB8IHVuZGVmaW5lZFxuICBjdXJyZW50U2VsZWN0ZWRGaWx0ZXJzJDogT2JzZXJ2YWJsZTxzdHJpbmdbXT4gfCB1bmRlZmluZWRcbiAgZmlsdGVyQW1vdW50cyQ6IE9ic2VydmFibGU8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4gfCB1bmRlZmluZWRcblxuICBvdmVyZmxvd0FjdGlvbnMkOiBPYnNlcnZhYmxlPERhdGFBY3Rpb25bXT5cbiAgaW5saW5lQWN0aW9ucyQ6IE9ic2VydmFibGU8RGF0YUFjdGlvbltdPlxuICBvdmVyZmxvd01lbnVJdGVtcyQ6IE9ic2VydmFibGU8TWVudUl0ZW1bXT5cbiAgY3VycmVudE1lbnVSb3ckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSb3cgfCBudWxsPihudWxsKVxuXG4gIHRlbXBsYXRlcyQ6IEJlaGF2aW9yU3ViamVjdDxRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpXG4gIEBDb250ZW50Q2hpbGRyZW4oUHJpbWVUZW1wbGF0ZSlcbiAgc2V0IHRlbXBsYXRlcyh2YWx1ZTogUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy50ZW1wbGF0ZXMkLm5leHQodmFsdWUpXG4gIH1cblxuICB2aWV3VGVtcGxhdGVzJDogQmVoYXZpb3JTdWJqZWN0PFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZClcbiAgQFZpZXdDaGlsZHJlbihQcmltZVRlbXBsYXRlKVxuICBzZXQgdmlld1RlbXBsYXRlcyh2YWx1ZTogUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy52aWV3VGVtcGxhdGVzJC5uZXh0KHZhbHVlKVxuICB9XG5cbiAgcGFyZW50VGVtcGxhdGVzJDogQmVoYXZpb3JTdWJqZWN0PFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IG51bGwgfCB1bmRlZmluZWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCBudWxsIHwgdW5kZWZpbmVkXG4gID4odW5kZWZpbmVkKVxuICBASW5wdXQoKVxuICBzZXQgcGFyZW50VGVtcGxhdGVzKHZhbHVlOiBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5wYXJlbnRUZW1wbGF0ZXMkLm5leHQodmFsdWUpXG4gIH1cblxuICBnZXQgdmlld1RhYmxlUm93T2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHYgPSB0aGlzLmluamVjdG9yLmdldCgnRGF0YVZpZXdDb21wb25lbnQnLCBudWxsKVxuICAgIHJldHVybiBkdj8udmlld0l0ZW1PYnNlcnZlZCB8fCBkdj8udmlld0l0ZW0ub2JzZXJ2ZWQgfHwgdGhpcy52aWV3VGFibGVSb3cub2JzZXJ2ZWRcbiAgfVxuICBnZXQgZWRpdFRhYmxlUm93T2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHYgPSB0aGlzLmluamVjdG9yLmdldCgnRGF0YVZpZXdDb21wb25lbnQnLCBudWxsKVxuICAgIHJldHVybiBkdj8uZWRpdEl0ZW1PYnNlcnZlZCB8fCBkdj8uZWRpdEl0ZW0ub2JzZXJ2ZWQgfHwgdGhpcy5lZGl0VGFibGVSb3cub2JzZXJ2ZWRcbiAgfVxuICBnZXQgZGVsZXRlVGFibGVSb3dPYnNlcnZlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBkdiA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdEYXRhVmlld0NvbXBvbmVudCcsIG51bGwpXG4gICAgcmV0dXJuIGR2Py5kZWxldGVJdGVtT2JzZXJ2ZWQgfHwgZHY/LmRlbGV0ZUl0ZW0ub2JzZXJ2ZWQgfHwgdGhpcy5kZWxldGVUYWJsZVJvdy5vYnNlcnZlZFxuICB9XG4gIGdldCBhbnlSb3dBY3Rpb25PYnNlcnZlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52aWV3VGFibGVSb3dPYnNlcnZlZCB8fCB0aGlzLmVkaXRUYWJsZVJvd09ic2VydmVkIHx8IHRoaXMuZGVsZXRlVGFibGVSb3dPYnNlcnZlZFxuICB9XG5cbiAgZ2V0IHNlbGVjdGlvbkNoYW5nZWRPYnNlcnZlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBkdiA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdEYXRhVmlld0NvbXBvbmVudCcsIG51bGwpXG4gICAgcmV0dXJuIGR2Py5zZWxlY3Rpb25DaGFuZ2VkT2JzZXJ2ZWQgfHwgZHY/LnNlbGVjdGlvbkNoYW5nZWQub2JzZXJ2ZWQgfHwgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkLm9ic2VydmVkXG4gIH1cblxuICB0ZW1wbGF0ZXNPYnNlcnZhYmxlczogUmVjb3JkPHN0cmluZywgT2JzZXJ2YWJsZTxUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4+ID0ge31cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KExPQ0FMRV9JRCkgbG9jYWxlOiBzdHJpbmcsXG4gICAgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKGxvY2FsZSwgdHJhbnNsYXRlU2VydmljZSlcbiAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUgfHwgdGhpcy5yb3V0ZXIudXJsLnJlcGxhY2UoL1teQS1aYS16MC05XS8sICdfJylcbiAgICB0aGlzLmRpc3BsYXllZFBhZ2VTaXplcyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9wYWdlU2l6ZXMkLCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdPQ1hfREFUQV9UQUJMRS5BTEwnKV0pLnBpcGUoXG4gICAgICBtYXAoKFtwYWdlU2l6ZXMsIHRyYW5zbGF0aW9uXSkgPT4gcGFnZVNpemVzLmNvbmNhdCh7IHNob3dBbGw6IHRyYW5zbGF0aW9uIH0pKVxuICAgIClcbiAgICB0aGlzLmRpc3BsYXllZFBhZ2VTaXplJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX3BhZ2VTaXplJCwgdGhpcy5fcGFnZVNpemVzJF0pLnBpcGUoXG4gICAgICBtYXAoKFtwYWdlU2l6ZSwgcGFnZVNpemVzXSkgPT4gcGFnZVNpemUgPz8gcGFnZVNpemVzLmZpbmQoKHZhbCk6IHZhbCBpcyBudW1iZXIgPT4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpID8/IDUwKVxuICAgIClcbiAgICB0aGlzLm92ZXJmbG93QWN0aW9ucyQgPSB0aGlzLl9hZGRpdGlvbmFsQWN0aW9ucyQucGlwZShcbiAgICAgIG1hcCgoYWN0aW9ucykgPT4gYWN0aW9ucy5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uLnNob3dBc092ZXJmbG93KSlcbiAgICApXG4gICAgdGhpcy5pbmxpbmVBY3Rpb25zJCA9IHRoaXMuX2FkZGl0aW9uYWxBY3Rpb25zJC5waXBlKFxuICAgICAgbWFwKChhY3Rpb25zKSA9PiBhY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiAhYWN0aW9uLnNob3dBc092ZXJmbG93KSlcbiAgICApXG4gICAgdGhpcy5vdmVyZmxvd01lbnVJdGVtcyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLm92ZXJmbG93QWN0aW9ucyQsIHRoaXMuY3VycmVudE1lbnVSb3ckXSkucGlwZShcbiAgICAgIG1lcmdlTWFwKChbYWN0aW9ucywgcm93XSkgPT5cbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldChbLi4uYWN0aW9ucy5tYXAoKGEpID0+IGEubGFiZWxLZXkgfHwgJycpXSkucGlwZShcbiAgICAgICAgICBtYXAoKHRyYW5zbGF0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnNcbiAgICAgICAgICAgICAgLmZpbHRlcigoYSkgPT4gdGhpcy51c2VyU2VydmljZS5oYXNQZXJtaXNzaW9uKGEucGVybWlzc2lvbikpXG4gICAgICAgICAgICAgIC5tYXAoKGEpID0+ICh7XG4gICAgICAgICAgICAgICAgbGFiZWw6IHRyYW5zbGF0aW9uc1thLmxhYmVsS2V5IHx8ICcnXSxcbiAgICAgICAgICAgICAgICBpY29uOiBhLmljb24sXG4gICAgICAgICAgICAgICAgc3R5bGVDbGFzczogKGEuY2xhc3NlcyB8fCBbXSkuam9pbignICcpLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBhLmRpc2FibGVkIHx8ICghIWEuYWN0aW9uRW5hYmxlZEZpZWxkICYmICF0aGlzLmZpZWxkSXNUcnV0aHkocm93LCBhLmFjdGlvbkVuYWJsZWRGaWVsZCkpLFxuICAgICAgICAgICAgICAgIHZpc2libGU6ICFhLmFjdGlvblZpc2libGVGaWVsZCB8fCB0aGlzLmZpZWxkSXNUcnV0aHkocm93LCBhLmFjdGlvblZpc2libGVGaWVsZCksXG4gICAgICAgICAgICAgICAgY29tbWFuZDogKCkgPT4gYS5jYWxsYmFjayhyb3cpLFxuICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5ZWRSb3dzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX3Jvd3MkLCB0aGlzLl9maWx0ZXJzJCwgdGhpcy5fc29ydENvbHVtbiQsIHRoaXMuX3NvcnREaXJlY3Rpb24kXSkucGlwZShcbiAgICAgIG1lcmdlTWFwKChwYXJhbXMpID0+IHRoaXMudHJhbnNsYXRlSXRlbXMocGFyYW1zLCB0aGlzLmNvbHVtbnMsIHRoaXMuY2xpZW50U2lkZUZpbHRlcmluZywgdGhpcy5jbGllbnRTaWRlU29ydGluZykpLFxuICAgICAgbWFwKChwYXJhbXMpID0+IHRoaXMuZmlsdGVySXRlbXMocGFyYW1zLCB0aGlzLmNsaWVudFNpZGVGaWx0ZXJpbmcpKSxcbiAgICAgIG1hcCgocGFyYW1zKSA9PiB0aGlzLnNvcnRJdGVtcyhwYXJhbXMsIHRoaXMuY29sdW1ucywgdGhpcy5jbGllbnRTaWRlU29ydGluZykpLFxuICAgICAgbWFwKChbcm93c10pID0+IHRoaXMuZmxhdHRlbkl0ZW1zKHJvd3MpKVxuICAgIClcbiAgICB0aGlzLmN1cnJlbnRTZWxlY3RlZEZpbHRlcnMkID0gY29tYmluZUxhdGVzdChbdGhpcy5fZmlsdGVycyQsIHRoaXMuY3VycmVudEZpbHRlckNvbHVtbiRdKS5waXBlKFxuICAgICAgbWFwKChbZmlsdGVycywgY3VycmVudEZpbHRlckNvbHVtbl0pID0+IHtcbiAgICAgICAgcmV0dXJuIGZpbHRlcnMuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZCA9PT0gY3VycmVudEZpbHRlckNvbHVtbj8uaWQpLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIudmFsdWUpXG4gICAgICB9KVxuICAgIClcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXJPcHRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX3Jvd3MkLCB0aGlzLmN1cnJlbnRGaWx0ZXJDb2x1bW4kLCB0aGlzLl9maWx0ZXJzJF0pLnBpcGUoXG4gICAgICBtZXJnZU1hcCgoW3Jvd3MsIGN1cnJlbnRGaWx0ZXJDb2x1bW4sIGZpbHRlcnNdKSA9PiB7XG4gICAgICAgIGlmICghY3VycmVudEZpbHRlckNvbHVtbj8uaWQpIHtcbiAgICAgICAgICByZXR1cm4gb2YoW10pXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VycmVudEZpbHRlcnMgPSBmaWx0ZXJzXG4gICAgICAgICAgLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuY29sdW1uSWQgPT09IGN1cnJlbnRGaWx0ZXJDb2x1bW4/LmlkKVxuICAgICAgICAgIC5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLnZhbHVlKVxuXG4gICAgICAgIGNvbnN0IGNvbHVtblZhbHVlcyA9IHJvd3MubWFwKChyb3cpID0+IHJvd1tjdXJyZW50RmlsdGVyQ29sdW1uPy5pZF0pXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZU9ic2VydmFibGUgPVxuICAgICAgICAgIHRoaXMuY29sdW1ucy5maW5kKChjKSA9PiBjLmlkID09PSBjdXJyZW50RmlsdGVyQ29sdW1uPy5pZCk/LmNvbHVtblR5cGUgPT09IENvbHVtblR5cGUuVFJBTlNMQVRJT05fS0VZXG4gICAgICAgICAgICA/IHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoY29sdW1uVmFsdWVzIGFzIHN0cmluZ1tdKVxuICAgICAgICAgICAgOiBvZihPYmplY3QuZnJvbUVudHJpZXMoY29sdW1uVmFsdWVzLm1hcCgoY3YpID0+IFtjdiwgY3ZdKSkpXG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVPYnNlcnZhYmxlLnBpcGUoXG4gICAgICAgICAgbWFwKCh0cmFuc2xhdGVkVmFsdWVzKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0cmFuc2xhdGVkVmFsdWVzKVxuICAgICAgICAgICAgICAuY29uY2F0KGN1cnJlbnRGaWx0ZXJzKVxuICAgICAgICAgICAgICAuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4ICYmIHZhbHVlICE9IG51bGwpXG4gICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgKGZpbHRlck9wdGlvbikgPT5cbiAgICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBmaWx0ZXJPcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJPcHRpb24sXG4gICAgICAgICAgICAgICAgICB9KSBhcyBTZWxlY3RJdGVtXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9KVxuICAgIClcbiAgICB0aGlzLmZpbHRlckFtb3VudHMkID0gdGhpcy5fZmlsdGVycyQucGlwZShcbiAgICAgIG1hcCgoZmlsdGVycykgPT5cbiAgICAgICAgZmlsdGVyc1xuICAgICAgICAgIC5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLmNvbHVtbklkKVxuICAgICAgICAgIC5tYXAoKGNvbHVtbklkKSA9PiBbY29sdW1uSWQsIGZpbHRlcnMuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZCA9PT0gY29sdW1uSWQpLmxlbmd0aF0pXG4gICAgICApLFxuICAgICAgbWFwKChhbW91bnRzKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoYW1vdW50cykpXG4gICAgKVxuICAgIHRoaXMubWFwU2VsZWN0aW9uVG9Sb3dzKClcbiAgICB0aGlzLmVtaXRDb21wb25lbnRTdGF0ZUNoYW5nZWQoKVxuICB9XG5cbiAgZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZChzdGF0ZTogRGF0YVRhYmxlQ29tcG9uZW50U3RhdGUgPSB7fSkge1xuICAgIHRoaXMuZGlzcGxheWVkUGFnZVNpemUkXG4gICAgICAucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLl9zZWxlY3Rpb25JZHMkLCB0aGlzLl9yb3dzJCksIGZpcnN0KCkpXG4gICAgICAuc3Vic2NyaWJlKChbcGFnZVNpemUsIHNlbGVjdGVkSWRzLCByb3dzXSkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBvbmVudFN0YXRlQ2hhbmdlZC5lbWl0KHtcbiAgICAgICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMsXG4gICAgICAgICAgc29ydGluZzoge1xuICAgICAgICAgICAgc29ydENvbHVtbjogdGhpcy5zb3J0Q29sdW1uLFxuICAgICAgICAgICAgc29ydERpcmVjdGlvbjogdGhpcy5zb3J0RGlyZWN0aW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGFnZVNpemUsXG4gICAgICAgICAgYWN0aXZlUGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgIHNlbGVjdGVkUm93czogcm93cy5maWx0ZXIoKHJvdykgPT4gc2VsZWN0ZWRJZHMuaW5jbHVkZXMocm93LmlkKSksXG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIH0pXG4gICAgICB9KVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMudGVtcGxhdGVzJC52YWx1ZT8uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgc3dpdGNoIChpdGVtLmdldFR5cGUoKSkge1xuICAgICAgICBjYXNlICdzdHJpbmdDZWxsJzpcbiAgICAgICAgICB0aGlzLnN0cmluZ0NlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ251bWJlckNlbGwnOlxuICAgICAgICAgIHRoaXMubnVtYmVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnY3VzdG9tQ2VsbCc6XG4gICAgICAgICAgdGhpcy5jdXN0b21DZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdkYXRlQ2VsbCc6XG4gICAgICAgICAgdGhpcy5kYXRlQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAncmVsYXRpdmVEYXRlQ2VsbCc6XG4gICAgICAgICAgdGhpcy5yZWxhdGl2ZURhdGVDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdjZWxsVGVtcGxhdGUnOlxuICAgICAgICAgIHRoaXMuY2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAndHJhbnNsYXRpb25LZXlDZWxsJzpcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uS2V5Q2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnc3RyaW5nRmlsdGVyQ2VsbCc6XG4gICAgICAgICAgdGhpcy5zdHJpbmdGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdudW1iZXJGaWx0ZXJDZWxsJzpcbiAgICAgICAgICB0aGlzLm51bWJlckZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2N1c3RvbUZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMuY3VzdG9tRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnZGF0ZUZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMuZGF0ZUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3JlbGF0aXZlRGF0ZUZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMucmVsYXRpdmVEYXRlRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnZmlsdGVyQ2VsbFRlbXBsYXRlJzpcbiAgICAgICAgICB0aGlzLmZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3RyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbCc6XG4gICAgICAgICAgdGhpcy50cmFuc2xhdGlvbktleUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIG9uU29ydENvbHVtbkNsaWNrKHNvcnRDb2x1bW46IHN0cmluZykge1xuICAgIGNvbnN0IG5ld1NvcnREaXJlY3Rpb24gPSB0aGlzLmNvbHVtbk5leHRTb3J0RGlyZWN0aW9uKHNvcnRDb2x1bW4pXG5cbiAgICB0aGlzLl9zb3J0Q29sdW1uJC5uZXh0KHNvcnRDb2x1bW4pXG4gICAgdGhpcy5fc29ydERpcmVjdGlvbiQubmV4dChuZXdTb3J0RGlyZWN0aW9uKVxuXG4gICAgdGhpcy5zb3J0ZWQuZW1pdCh7IHNvcnRDb2x1bW46IHNvcnRDb2x1bW4sIHNvcnREaXJlY3Rpb246IG5ld1NvcnREaXJlY3Rpb24gfSlcbiAgICB0aGlzLmVtaXRDb21wb25lbnRTdGF0ZUNoYW5nZWQoe1xuICAgICAgc29ydGluZzoge1xuICAgICAgICBzb3J0Q29sdW1uOiBzb3J0Q29sdW1uLFxuICAgICAgICBzb3J0RGlyZWN0aW9uOiBuZXdTb3J0RGlyZWN0aW9uLFxuICAgICAgfSxcbiAgICB9KVxuICB9XG5cbiAgY29sdW1uTmV4dFNvcnREaXJlY3Rpb24oc29ydENvbHVtbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHNvcnRDb2x1bW4gIT09IHRoaXMuc29ydENvbHVtblxuICAgICAgPyB0aGlzLnNvcnRTdGF0ZXNbMF1cbiAgICAgIDogdGhpcy5zb3J0U3RhdGVzWyh0aGlzLnNvcnRTdGF0ZXMuaW5kZXhPZih0aGlzLnNvcnREaXJlY3Rpb24pICsgMSkgJSB0aGlzLnNvcnRTdGF0ZXMubGVuZ3RoXVxuICB9XG5cbiAgb25EZWxldGVSb3coc2VsZWN0ZWRUYWJsZVJvdzogUm93KSB7XG4gICAgdGhpcy5kZWxldGVUYWJsZVJvdy5lbWl0KHNlbGVjdGVkVGFibGVSb3cpXG4gIH1cblxuICBvblZpZXdSb3coc2VsZWN0ZWRUYWJsZVJvdzogUm93KSB7XG4gICAgdGhpcy52aWV3VGFibGVSb3cuZW1pdChzZWxlY3RlZFRhYmxlUm93KVxuICB9XG5cbiAgb25FZGl0Um93KHNlbGVjdGVkVGFibGVSb3c6IFJvdykge1xuICAgIHRoaXMuZWRpdFRhYmxlUm93LmVtaXQoc2VsZWN0ZWRUYWJsZVJvdylcbiAgfVxuXG4gIG9uRmlsdGVyQ2xpY2soY29sdW1uOiBEYXRhVGFibGVDb2x1bW4pIHtcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXJDb2x1bW4kLm5leHQoY29sdW1uKVxuICB9XG5cbiAgb25GaWx0ZXJDaGFuZ2UoY29sdW1uOiBEYXRhVGFibGVDb2x1bW4sIGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5maWx0ZXJzXG4gICAgICAuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZCAhPT0gY29sdW1uLmlkKVxuICAgICAgLmNvbmNhdChcbiAgICAgICAgZXZlbnQudmFsdWUubWFwKCh2YWx1ZTogUHJpbWl0aXZlKSA9PiAoe1xuICAgICAgICAgIGNvbHVtbklkOiBjb2x1bW4uaWQsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0pKVxuICAgICAgKVxuICAgIGlmICh0aGlzLmNsaWVudFNpZGVGaWx0ZXJpbmcpIHtcbiAgICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcnNcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJlZC5lbWl0KGZpbHRlcnMpXG4gICAgdGhpcy5lbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKHtcbiAgICAgIGZpbHRlcnMsXG4gICAgfSlcbiAgICB0aGlzLnJlc2V0UGFnZSgpXG4gIH1cblxuICBnZXRTZWxlY3RlZEZpbHRlcnMoY29sdW1uSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuY29sdW1uSWQgPT09IGNvbHVtbklkKS5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLnZhbHVlKVxuICB9XG5cbiAgc29ydEljb25UaXRsZShzb3J0Q29sdW1uOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0RGlyZWN0aW9uVG9UaXRsZShcbiAgICAgIHNvcnRDb2x1bW4gIT09IHRoaXMuc29ydERpcmVjdGlvblxuICAgICAgICA/IERhdGFTb3J0RGlyZWN0aW9uLk5PTkVcbiAgICAgICAgOiB0aGlzLnNvcnRTdGF0ZXNbdGhpcy5zb3J0U3RhdGVzLmluZGV4T2YodGhpcy5zb3J0RGlyZWN0aW9uKSAlIHRoaXMuc29ydFN0YXRlcy5sZW5ndGhdXG4gICAgKVxuICB9XG5cbiAgc29ydERpcmVjdGlvblRvVGl0bGUoc29ydERpcmVjdGlvbjogRGF0YVNvcnREaXJlY3Rpb24pIHtcbiAgICBzd2l0Y2ggKHNvcnREaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgRGF0YVNvcnREaXJlY3Rpb24uQVNDRU5ESU5HOlxuICAgICAgICByZXR1cm4gJ09DWF9EQVRBX1RBQkxFLlRPR0dMRV9CVVRUT04uQVNDRU5ESU5HX1RJVExFJ1xuICAgICAgY2FzZSBEYXRhU29ydERpcmVjdGlvbi5ERVNDRU5ESU5HOlxuICAgICAgICByZXR1cm4gJ09DWF9EQVRBX1RBQkxFLlRPR0dMRV9CVVRUT04uREVTQ0VORElOR19USVRMRSdcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnT0NYX0RBVEFfVEFCTEUuVE9HR0xFX0JVVFRPTi5ERUZBVUxUX1RJVExFJ1xuICAgIH1cbiAgfVxuXG4gIG1hcFNlbGVjdGlvblRvUm93cygpIHtcbiAgICB0aGlzLnNlbGVjdGVkUm93cyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9zZWxlY3Rpb25JZHMkLCB0aGlzLl9yb3dzJF0pLnBpcGUoXG4gICAgICBtYXAoKFtzZWxlY3RlZFJvd0lkcywgcm93c10pID0+IHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkUm93SWRzLm1hcCgocm93SWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gcm93cy5maW5kKChyKSA9PiByLmlkID09PSByb3dJZClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0aW9uOiBSb3dbXSkge1xuICAgIGxldCBuZXdTZWxlY3Rpb25JZHMgPSBzZWxlY3Rpb24ubWFwKChyb3cpID0+IHJvdy5pZClcbiAgICBjb25zdCByb3dzID0gdGhpcy5fcm93cyQuZ2V0VmFsdWUoKVxuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uRW5hYmxlZEZpZWxkKSB7XG4gICAgICBjb25zdCBkaXNhYmxlZFJvd0lkcyA9IHJvd3MuZmlsdGVyKChyKSA9PiAhdGhpcy5maWVsZElzVHJ1dGh5KHIsIHRoaXMuc2VsZWN0aW9uRW5hYmxlZEZpZWxkKSkubWFwKChyb3cpID0+IHJvdy5pZClcbiAgICAgIGlmIChkaXNhYmxlZFJvd0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NlbGVjdGlvbklkcyA9IHRoaXMubWVyZ2VXaXRoRGlzYWJsZWRLZXlzKG5ld1NlbGVjdGlvbklkcywgZGlzYWJsZWRSb3dJZHMpXG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHRoaXMuX3NlbGVjdGlvbklkcyQubmV4dChuZXdTZWxlY3Rpb25JZHMpXG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkLmVtaXQodGhpcy5fcm93cyQuZ2V0VmFsdWUoKS5maWx0ZXIoKHJvdykgPT4gbmV3U2VsZWN0aW9uSWRzLmluY2x1ZGVzKHJvdy5pZCkpKVxuICAgIHRoaXMuZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZCgpXG4gIH1cblxuICBtZXJnZVdpdGhEaXNhYmxlZEtleXMobmV3U2VsZWN0aW9uSWRzOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBkaXNhYmxlZFJvd0lkczogKHN0cmluZyB8IG51bWJlcilbXSkge1xuICAgIGNvbnN0IHByZXZpb3VzU2VsZWN0aW9uSWRzID0gdGhpcy5fc2VsZWN0aW9uSWRzJC5nZXRWYWx1ZSgpXG4gICAgY29uc3QgcHJldmlvdXNseVNlbGVjdGVkQW5kRGlzYWJsZWQgPSBwcmV2aW91c1NlbGVjdGlvbklkcy5maWx0ZXIoKGlkKSA9PiBkaXNhYmxlZFJvd0lkcy5pbmNsdWRlcyhpZCkpXG4gICAgY29uc3QgZGlzYWJsZWRBbmRQcmV2aW91c2x5RGVzZWxlY3RlZCA9IGRpc2FibGVkUm93SWRzLmZpbHRlcigoaWQpID0+ICFwcmV2aW91c1NlbGVjdGlvbklkcy5pbmNsdWRlcyhpZCkpXG4gICAgY29uc3QgdXBkYXRlZFNlbGVjdGlvbiA9IFsuLi5uZXdTZWxlY3Rpb25JZHNdXG5cbiAgICBwcmV2aW91c2x5U2VsZWN0ZWRBbmREaXNhYmxlZC5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgaWYgKCF1cGRhdGVkU2VsZWN0aW9uLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICB1cGRhdGVkU2VsZWN0aW9uLnB1c2goaWQpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGRpc2FibGVkQW5kUHJldmlvdXNseURlc2VsZWN0ZWQuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdXBkYXRlZFNlbGVjdGlvbi5pbmRleE9mKGlkKVxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgdXBkYXRlZFNlbGVjdGlvbi5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiB1cGRhdGVkU2VsZWN0aW9uXG4gIH1cblxuICBpc1NlbGVjdGVkKHJvdzogUm93KSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbklkcyQuZ2V0VmFsdWUoKS5pbmNsdWRlcyhyb3cuaWQpXG4gIH1cblxuICBvblBhZ2VDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHBhZ2UgPSBldmVudC5maXJzdCAvIGV2ZW50LnJvd3NcbiAgICB0aGlzLnBhZ2UgPSBwYWdlXG4gICAgdGhpcy5wYWdlU2l6ZSA9IGV2ZW50LnJvd3NcbiAgICB0aGlzLnBhZ2VDaGFuZ2VkLmVtaXQocGFnZSlcbiAgICB0aGlzLnBhZ2VTaXplQ2hhbmdlZC5lbWl0KGV2ZW50LnJvd3MpXG4gICAgdGhpcy5lbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKHtcbiAgICAgIGFjdGl2ZVBhZ2U6IHBhZ2UsXG4gICAgICBwYWdlU2l6ZTogZXZlbnQucm93cyxcbiAgICB9KVxuICB9XG5cbiAgcmVzZXRQYWdlKCkge1xuICAgIHRoaXMucGFnZSA9IDBcbiAgICB0aGlzLnBhZ2VDaGFuZ2VkLmVtaXQodGhpcy5wYWdlKVxuICAgIHRoaXMuZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZCgpXG4gIH1cblxuICBmaWVsZElzVHJ1dGh5KG9iamVjdDogYW55LCBrZXk6IGFueSkge1xuICAgIHJldHVybiAhIU9iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEob2JqZWN0LCBrZXkpXG4gIH1cblxuICB0b2dnbGVPdmVyZmxvd01lbnUoZXZlbnQ6IE1vdXNlRXZlbnQsIG1lbnU6IE1lbnUsIHJvdzogUm93KSB7XG4gICAgdGhpcy5jdXJyZW50TWVudVJvdyQubmV4dChyb3cpXG4gICAgbWVudS50b2dnbGUoZXZlbnQpXG4gIH1cblxuICBoYXNWaXNpYmxlT3ZlcmZsb3dNZW51SXRlbXMocm93OiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5vdmVyZmxvd0FjdGlvbnMkLnBpcGUoXG4gICAgICBtYXAoKGFjdGlvbnMpID0+XG4gICAgICAgIGFjdGlvbnMuc29tZShcbiAgICAgICAgICAoYSkgPT5cbiAgICAgICAgICAgICFhLmFjdGlvblZpc2libGVGaWVsZCB8fFxuICAgICAgICAgICAgKHRoaXMuZmllbGRJc1RydXRoeShyb3csIGEuYWN0aW9uVmlzaWJsZUZpZWxkKSAmJiB0aGlzLnVzZXJTZXJ2aWNlLmhhc1Blcm1pc3Npb24oYS5wZXJtaXNzaW9uKSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIGlzRGF0ZSh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgICByZXR1cm4gaXNWYWxpZERhdGUoZClcbiAgfVxuXG4gIGNlbGxUZW1wbGF0ZXNEYXRhOiBUZW1wbGF0ZXNEYXRhID0ge1xuICAgIHRlbXBsYXRlc09ic2VydmFibGVzOiB7fSxcbiAgICBpZFN1ZmZpeDogWydJZFRhYmxlQ2VsbCcsICdJZENlbGwnXSxcbiAgICB0ZW1wbGF0ZU5hbWVzOiB7XG4gICAgICBbQ29sdW1uVHlwZS5EQVRFXTogWydkYXRlQ2VsbCcsICdkYXRlVGFibGVDZWxsJywgJ2RlZmF1bHREYXRlQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuTlVNQkVSXTogWydudW1iZXJDZWxsJywgJ251bWJlclRhYmxlQ2VsbCcsICdkZWZhdWx0TnVtYmVyQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuUkVMQVRJVkVfREFURV06IFsncmVsYXRpdmVEYXRlQ2VsbCcsICdyZWxhdGl2ZURhdGVUYWJsZUNlbGwnLCAnZGVmYXVsdFJlbGF0aXZlRGF0ZUNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLlRSQU5TTEFUSU9OX0tFWV06IFsndHJhbnNsYXRpb25LZXlDZWxsJywgJ3RyYW5zbGF0aW9uS2V5VGFibGVDZWxsJywgJ2RlZmF1bHRUcmFuc2xhdGlvbktleUNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLkNVU1RPTV06IFsnY3VzdG9tQ2VsbCcsICdjdXN0b21UYWJsZUNlbGwnLCAnZGVmYXVsdEN1c3RvbUNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLlNUUklOR106IFsnc3RyaW5nQ2VsbCcsICdzdHJpbmdUYWJsZUNlbGwnLCAnZGVmYXVsdFN0cmluZ0NlbGwnXSxcbiAgICB9LFxuICB9XG5cbiAgZmlsdGVyVGVtcGxhdGVzRGF0YTogVGVtcGxhdGVzRGF0YSA9IHtcbiAgICB0ZW1wbGF0ZXNPYnNlcnZhYmxlczoge30sXG4gICAgaWRTdWZmaXg6IFsnSWRUYWJsZUZpbHRlckNlbGwnLCAnSWRGaWx0ZXJDZWxsJ10sXG4gICAgdGVtcGxhdGVOYW1lczoge1xuICAgICAgW0NvbHVtblR5cGUuREFURV06IFsnZGF0ZUZpbHRlckNlbGwnLCAnZGF0ZVRhYmxlRmlsdGVyQ2VsbCcsICdkZWZhdWx0RGF0ZUNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLk5VTUJFUl06IFsnbnVtYmVyRmlsdGVyQ2VsbCcsICdudW1iZXJUYWJsZUZpbHRlckNlbGwnLCAnZGVmYXVsdE51bWJlckNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLlJFTEFUSVZFX0RBVEVdOiBbJ3JlbGF0aXZlRGF0ZUZpbHRlckNlbGwnLCAncmVsYXRpdmVEYXRlVGFibGVGaWx0ZXJDZWxsJywgJ2RlZmF1bHRSZWxhdGl2ZURhdGVDZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5UUkFOU0xBVElPTl9LRVldOiBbXG4gICAgICAgICd0cmFuc2xhdGlvbktleUZpbHRlckNlbGwnLFxuICAgICAgICAndHJhbnNsYXRpb25LZXlUYWJsZUZpbHRlckNlbGwnLFxuICAgICAgICAnZGVmYXVsdFRyYW5zbGF0aW9uS2V5Q2VsbCcsXG4gICAgICBdLFxuICAgICAgW0NvbHVtblR5cGUuQ1VTVE9NXTogWydjdXN0b21GaWx0ZXJDZWxsJywgJ2N1c3RvbVRhYmxlRmlsdGVyQ2VsbCcsICdkZWZhdWx0Q3VzdG9tQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuU1RSSU5HXTogWydzdHJpbmdGaWx0ZXJDZWxsJywgJ3N0cmluZ1RhYmxlRmlsdGVyQ2VsbCcsICdkZWZhdWx0U3RyaW5nQ2VsbCddLFxuICAgIH0sXG4gIH1cblxuICB0ZW1wbGF0ZXNEYXRhTWFwOiBSZWNvcmQ8VGVtcGxhdGVUeXBlLCBUZW1wbGF0ZXNEYXRhPiA9IHtcbiAgICBbVGVtcGxhdGVUeXBlLkNFTExdOiB0aGlzLmNlbGxUZW1wbGF0ZXNEYXRhLFxuICAgIFtUZW1wbGF0ZVR5cGUuRklMVEVSQ0VMTF06IHRoaXMuZmlsdGVyVGVtcGxhdGVzRGF0YSxcbiAgfVxuXG4gIGZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZXM6IFByaW1lVGVtcGxhdGVbXSwgbmFtZXM6IHN0cmluZ1tdKTogUHJpbWVUZW1wbGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG5hbWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgbmFtZSA9IG5hbWVzW2luZGV4XVxuICAgICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZXMuZmluZCgodGVtcGxhdGUpID0+IHRlbXBsYXRlLm5hbWUgPT09IG5hbWUpXG4gICAgICBpZiAodGVtcGxhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGdldENvbHVtblR5cGVUZW1wbGF0ZSh0ZW1wbGF0ZXM6IFByaW1lVGVtcGxhdGVbXSwgY29sdW1uVHlwZTogQ29sdW1uVHlwZSwgdGVtcGxhdGVUeXBlOiBUZW1wbGF0ZVR5cGUpIHtcbiAgICBsZXQgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcblxuICAgIHN3aXRjaCAodGVtcGxhdGVUeXBlKSB7XG4gICAgICBjYXNlIFRlbXBsYXRlVHlwZS5DRUxMOlxuICAgICAgICBzd2l0Y2ggKGNvbHVtblR5cGUpIHtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuREFURTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fZGF0ZUNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLk5VTUJFUjpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fbnVtYmVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuUkVMQVRJVkVfREFURTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fcmVsYXRpdmVEYXRlQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuVFJBTlNMQVRJT05fS0VZOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl90cmFuc2xhdGlvbktleUNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLkNVU1RPTTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fY3VzdG9tQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9zdHJpbmdDZWxsXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgVGVtcGxhdGVUeXBlLkZJTFRFUkNFTEw6XG4gICAgICAgIHN3aXRjaCAoY29sdW1uVHlwZSkge1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5EQVRFOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9kYXRlRmlsdGVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuTlVNQkVSOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9udW1iZXJGaWx0ZXJDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5SRUxBVElWRV9EQVRFOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9yZWxhdGl2ZURhdGVGaWx0ZXJDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5UUkFOU0xBVElPTl9LRVk6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX3RyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuQ1VTVE9NOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9jdXN0b21GaWx0ZXJDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX3N0cmluZ0ZpbHRlckNlbGxcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICB0ZW1wbGF0ZSA/P1xuICAgICAgdGhpcy5maW5kVGVtcGxhdGUodGVtcGxhdGVzLCB0aGlzLnRlbXBsYXRlc0RhdGFNYXBbdGVtcGxhdGVUeXBlXS50ZW1wbGF0ZU5hbWVzW2NvbHVtblR5cGVdKT8udGVtcGxhdGUgPz9cbiAgICAgIG51bGxcbiAgICApXG4gIH1cblxuICBnZXRUZW1wbGF0ZShjb2x1bW46IERhdGFUYWJsZUNvbHVtbiwgdGVtcGxhdGVUeXBlOiBUZW1wbGF0ZVR5cGUpOiBPYnNlcnZhYmxlPFRlbXBsYXRlUmVmPGFueT4gfCBudWxsPiB7XG4gICAgY29uc3QgdGVtcGxhdGVzRGF0YSA9IHRoaXMudGVtcGxhdGVzRGF0YU1hcFt0ZW1wbGF0ZVR5cGVdXG5cbiAgICBpZiAoIXRlbXBsYXRlc0RhdGEudGVtcGxhdGVzT2JzZXJ2YWJsZXNbY29sdW1uLmlkXSkge1xuICAgICAgdGVtcGxhdGVzRGF0YS50ZW1wbGF0ZXNPYnNlcnZhYmxlc1tjb2x1bW4uaWRdID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgIHRoaXMudGVtcGxhdGVzJCxcbiAgICAgICAgdGhpcy52aWV3VGVtcGxhdGVzJCxcbiAgICAgICAgdGhpcy5wYXJlbnRUZW1wbGF0ZXMkLFxuICAgICAgXSkucGlwZShcbiAgICAgICAgbWFwKChbdCwgdnQsIHB0XSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IFsuLi4odCA/PyBbXSksIC4uLih2dCA/PyBbXSksIC4uLihwdCA/PyBbXSldXG4gICAgICAgICAgY29uc3QgY29sdW1uVGVtcGxhdGUgPSB0aGlzLmZpbmRUZW1wbGF0ZShcbiAgICAgICAgICAgIHRlbXBsYXRlcyxcbiAgICAgICAgICAgIHRlbXBsYXRlc0RhdGEuaWRTdWZmaXgubWFwKChzdWZmaXgpID0+IGNvbHVtbi5pZCArIHN1ZmZpeClcbiAgICAgICAgICApPy50ZW1wbGF0ZVxuICAgICAgICAgIGlmIChjb2x1bW5UZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbHVtblRlbXBsYXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmdldENvbHVtblR5cGVUZW1wbGF0ZSh0ZW1wbGF0ZXMsIGNvbHVtbi5jb2x1bW5UeXBlLCB0ZW1wbGF0ZVR5cGUpXG4gICAgICAgIH0pLFxuICAgICAgICBkZWJvdW5jZVRpbWUoNTApXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiB0ZW1wbGF0ZXNEYXRhLnRlbXBsYXRlc09ic2VydmFibGVzW2NvbHVtbi5pZF1cbiAgfVxuXG4gIHJlc29sdmVGaWVsZERhdGEob2JqZWN0OiBhbnksIGtleTogYW55KSB7XG4gICAgcmV0dXJuIE9iamVjdFV0aWxzLnJlc29sdmVGaWVsZERhdGEob2JqZWN0LCBrZXkpXG4gIH1cblxuICBnZXRSb3dPYmplY3RGcm9tTXVsdGlzZWxlY3RJdGVtKHZhbHVlOiBNdWx0aVNlbGVjdEl0ZW0sIGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtjb2x1bW4uaWRdOiB2YWx1ZS5sYWJlbCxcbiAgICB9XG4gIH1cbn1cbiIsIjxuZy10ZW1wbGF0ZSAjYWN0aW9uQ29sdW1uIGxldC1yb3dPYmplY3Q9XCJsb2NhbFJvd09iamVjdFwiPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJhbnlSb3dBY3Rpb25PYnNlcnZlZCB8fCB0aGlzLmFkZGl0aW9uYWxBY3Rpb25zLmxlbmd0aCA+IDAgfHwgKCh0aGlzLm92ZXJmbG93QWN0aW9ucyQgfCBhc3luYykgPz8gW10pLmxlbmd0aCA+IDBcIlxuICA+XG4gICAgPHRkXG4gICAgICBjbGFzcz1cImFjdGlvbnNcIlxuICAgICAgcEZyb3plbkNvbHVtblxuICAgICAgW2Zyb3plbl09XCJmcm96ZW5BY3Rpb25Db2x1bW5cIlxuICAgICAgW2FsaWduRnJvemVuXT1cImFjdGlvbkNvbHVtblBvc2l0aW9uXCJcbiAgICAgIFthdHRyLm5hbWVdPVwiYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdsZWZ0JyA/ICdhY3Rpb24tY29sdW1uLWxlZnQnIDogJ2FjdGlvbi1jb2x1bW4tcmlnaHQnXCJcbiAgICAgIFtuZ0NsYXNzXT1cIihmcm96ZW5BY3Rpb25Db2x1bW4gJiYgYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdsZWZ0JykgPyAnYm9yZGVyLXJpZ2h0LTEnIDogKGZyb3plbkFjdGlvbkNvbHVtbiAmJiBhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ3JpZ2h0JykgPyAnYm9yZGVyLWxlZnQtMScgOiAnJ1wiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImljb24tYnV0dG9uLXJvdy13cmFwcGVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cInZpZXdUYWJsZVJvd09ic2VydmVkICYmICghdmlld0FjdGlvblZpc2libGVGaWVsZCB8fCBmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgdmlld0FjdGlvblZpc2libGVGaWVsZCkpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJ2aWV3UGVybWlzc2lvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiISF2aWV3QWN0aW9uRW5hYmxlZEZpZWxkICYmICFmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgdmlld0FjdGlvbkVuYWJsZWRGaWVsZClcIlxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgdmlld1RhYmxlUm93QnV0dG9uXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ09DWF9EQVRBX1RBQkxFLkFDVElPTlMuVklFVycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInT0NYX0RBVEFfVEFCTEUuQUNUSU9OUy5WSUVXJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBpY29uPVwicGkgcGktZXllXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblZpZXdSb3cocm93T2JqZWN0KVwiXG4gICAgICAgICAgICBbYXR0ci5uYW1lXT1cIidkYXRhLXRhYmxlLWFjdGlvbi1idXR0b24nXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJlZGl0VGFibGVSb3dPYnNlcnZlZCAmJiAoIWVkaXRBY3Rpb25WaXNpYmxlRmllbGQgfHwgZmllbGRJc1RydXRoeShyb3dPYmplY3QsIGVkaXRBY3Rpb25WaXNpYmxlRmllbGQpKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqb2N4SWZQZXJtaXNzaW9uPVwiZWRpdFBlcm1pc3Npb25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhZWRpdEFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShyb3dPYmplY3QsIGVkaXRBY3Rpb25FbmFibGVkRmllbGQpXCJcbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IGVkaXRUYWJsZVJvd0J1dHRvblwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLkVESVQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09DWF9EQVRBX1RBQkxFLkFDVElPTlMuRURJVCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgaWNvbj1cInBpIHBpLXBlbmNpbFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25FZGl0Um93KHJvd09iamVjdClcIlxuICAgICAgICAgICAgW2F0dHIubmFtZV09XCInZGF0YS10YWJsZS1hY3Rpb24tYnV0dG9uJ1wiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwiZGVsZXRlVGFibGVSb3dPYnNlcnZlZCAmJiAoIWRlbGV0ZUFjdGlvblZpc2libGVGaWVsZCB8fCBmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkKSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm9jeElmUGVybWlzc2lvbj1cImRlbGV0ZVBlcm1pc3Npb25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhZGVsZXRlQWN0aW9uRW5hYmxlZEZpZWxkICYmICFmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgZGVsZXRlQWN0aW9uRW5hYmxlZEZpZWxkKVwiXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1kYW5nZXIgZGVsZXRlVGFibGVSb3dCdXR0b25cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnT0NYX0RBVEFfVEFCTEUuQUNUSU9OUy5ERUxFVEUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09DWF9EQVRBX1RBQkxFLkFDVElPTlMuREVMRVRFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlUm93KHJvd09iamVjdClcIlxuICAgICAgICAgICAgW2F0dHIubmFtZV09XCInZGF0YS10YWJsZS1hY3Rpb24tYnV0dG9uJ1wiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGlubGluZUFjdGlvbnMkIHwgYXN5bmNcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFhY3Rpb24uYWN0aW9uVmlzaWJsZUZpZWxkIHx8IGZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBhY3Rpb24uYWN0aW9uVmlzaWJsZUZpZWxkKSlcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm9jeElmUGVybWlzc2lvbj1cImFjdGlvbi5wZXJtaXNzaW9uXCJcbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFjdGlvbi5jbGFzc2VzXCJcbiAgICAgICAgICAgICAgW2ljb25dPVwiYWN0aW9uLmljb24gfHwgJydcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uLmNhbGxiYWNrKHJvd09iamVjdClcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiYWN0aW9uLmxhYmVsS2V5ID8gKGFjdGlvbi5sYWJlbEtleSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYWN0aW9uLmxhYmVsS2V5ID8gKGFjdGlvbi5sYWJlbEtleSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhY3Rpb24uZGlzYWJsZWQgfHwgKCEhYWN0aW9uLmFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShyb3dPYmplY3QsIGFjdGlvbi5hY3Rpb25FbmFibGVkRmllbGQpKVwiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzVmlzaWJsZU92ZXJmbG93TWVudUl0ZW1zKHJvd09iamVjdCkgfCBhc3luY1wiPlxuICAgICAgICAgIDxwLW1lbnUgI21lbnUgW21vZGVsXT1cIihvdmVyZmxvd01lbnVJdGVtcyQgfCBhc3luYykgfHwgW11cIiBbcG9wdXBdPVwidHJ1ZVwiIGFwcGVuZFRvPVwiYm9keVwiPjwvcC1tZW51PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgICAgICAgIFtpY29uXT1cIidwaSBwaS1lbGxpcHNpcy12J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlT3ZlcmZsb3dNZW51KCRldmVudCwgbWVudSwgcm93T2JqZWN0KVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5NT1JFX0FDVElPTlMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInT0NYX0RBVEFfVEFCTEUuTU9SRV9BQ1RJT05TJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvdGQ+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNhY3Rpb25Db2x1bW5IZWFkZXI+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdJZj1cImFueVJvd0FjdGlvbk9ic2VydmVkIHx8IHRoaXMuYWRkaXRpb25hbEFjdGlvbnMubGVuZ3RoID4gMCAgfHwgKCh0aGlzLm92ZXJmbG93QWN0aW9ucyQgfCBhc3luYykgPz8gW10pLmxlbmd0aCA+IDBcIlxuICA+XG4gICAgPHRoXG4gICAgICBwRnJvemVuQ29sdW1uXG4gICAgICBbZnJvemVuXT1cImZyb3plbkFjdGlvbkNvbHVtblwiXG4gICAgICBbYWxpZ25Gcm96ZW5dPVwiYWN0aW9uQ29sdW1uUG9zaXRpb25cIlxuICAgICAgW25nQ2xhc3NdPVwiKGZyb3plbkFjdGlvbkNvbHVtbiAmJiBhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ2xlZnQnKSA/ICdib3JkZXItcmlnaHQtMScgOiAoZnJvemVuQWN0aW9uQ29sdW1uICYmIGFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAncmlnaHQnKSA/ICdib3JkZXItbGVmdC0xJyA6ICcnXCJcbiAgICAgIFthdHRyLm5hbWVdPVwiYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdsZWZ0JyA/ICdhY3Rpb24tY29sdW1uLWhlYWRlci1sZWZ0JyA6ICdhY3Rpb24tY29sdW1uLWhlYWRlci1yaWdodCdcIlxuICAgID5cbiAgICAgIHt7ICdPQ1hfREFUQV9UQUJMRS5BQ1RJT05TX0NPTFVNTl9OQU1FJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvdGg+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIihkaXNwbGF5ZWRQYWdlU2l6ZSQgfCBhc3luYykgYXMgZGlzcGxheWVkUGFnZVNpemVcIj5cbiAgPHAtdGFibGVcbiAgICAqbmdJZj1cIihjb2x1bW5UZW1wbGF0ZXMkIHwgYXN5bmMpID8/IHt9IGFzIGNvbHVtblRlbXBsYXRlc1wiXG4gICAgW3ZhbHVlXT1cIihkaXNwbGF5ZWRSb3dzJCB8IGFzeW5jKSA/PyBbXVwiXG4gICAgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXG4gICAgW3BhZ2luYXRvcl09XCJwYWdpbmF0b3JcIlxuICAgIFtmaXJzdF09XCJwYWdlICogZGlzcGxheWVkUGFnZVNpemVcIlxuICAgIChvblBhZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuICAgIFtyb3dzXT1cImRpc3BsYXllZFBhZ2VTaXplXCJcbiAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIlxuICAgIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7eyAodG90YWxSZWNvcmRzT25TZXJ2ZXIgPyBjdXJyZW50UGFnZVNob3dpbmdXaXRoVG90YWxPblNlcnZlcktleSA6IGN1cnJlbnRQYWdlU2hvd2luZ0tleSkgfCB0cmFuc2xhdGU6cGFyYW1zIH19XCJcbiAgICBbcm93c1BlclBhZ2VPcHRpb25zXT1cIihkaXNwbGF5ZWRQYWdlU2l6ZXMkIHwgYXN5bmMpID8/IFtdXCJcbiAgICBpZD1cImRhdGFUYWJsZV97e25hbWV9fVwiXG4gICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICBbc2VsZWN0aW9uXT1cIihzZWxlY3RlZFJvd3MkIHwgYXN5bmMpID8/IFtdXCJcbiAgICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICBwYWdpbmF0b3JEcm9wZG93bkFwcGVuZFRvPVwiYm9keVwiXG4gID5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICA8dHI+XG4gICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiA0cmVtXCIgc2NvcGU9XCJjb2xcIiAqbmdJZj1cInNlbGVjdGlvbkNoYW5nZWRPYnNlcnZlZFwiPlxuICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggKm5nSWY9XCJhbGxvd1NlbGVjdEFsbFwiPjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxuICAgICAgICA8L3RoPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdsZWZ0JztcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWN0aW9uQ29sdW1uSGVhZGVyXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiPlxuICAgICAgICAgIDx0aCAqbmdJZj1cImNvbHVtbi5zb3J0YWJsZSB8fCBjb2x1bW4uZmlsdGVyYWJsZTsgZWxzZSBzaW1wbGVIZWFkZXJcIiBzY29wZT1cImNvbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlci13cmFwcGVyXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGlkPVwie3tjb2x1bW4uaWR9fS1oZWFkZXItbmFtZVwiPnt7IGNvbHVtbi5uYW1lS2V5IHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24tYnV0dG9uLWhlYWRlci13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uc29ydGFibGVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwaSBzb3J0QnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5waS1zb3J0LWFsdF09XCIoY29sdW1uPy5pZCA9PT0gc29ydENvbHVtbiAmJiBzb3J0RGlyZWN0aW9uID09PSAnTk9ORScpIHx8IGNvbHVtbj8uaWQgIT09IHNvcnRDb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpLXNvcnQtYW1vdW50LXVwXT1cImNvbHVtbj8uaWQgPT09IHNvcnRDb2x1bW4gJiYgc29ydERpcmVjdGlvbiA9PT0gJ0FTQ0VORElORydcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpLXNvcnQtYW1vdW50LWRvd25dPVwiY29sdW1uPy5pZCA9PT0gc29ydENvbHVtbiAmJiBzb3J0RGlyZWN0aW9uID09PSAnREVTQ0VORElORydcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU29ydENvbHVtbkNsaWNrKGNvbHVtbi5pZClcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihzb3J0SWNvblRpdGxlKGNvbHVtbi5pZCkgfCB0cmFuc2xhdGUpXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKCdPQ1hfREFUQV9UQUJMRS5UT0dHTEVfQlVUVE9OLkFSSUFfTEFCRUwnIHwgdHJhbnNsYXRlOiB7IGNvbHVtbjogKGNvbHVtbi5uYW1lS2V5IHwgdHJhbnNsYXRlKSwgZGlyZWN0aW9uOiAoc29ydERpcmVjdGlvblRvVGl0bGUoY29sdW1uTmV4dFNvcnREaXJlY3Rpb24oY29sdW1uLmlkKSkgfCB0cmFuc2xhdGUpfSlcIlxuICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXJNdWx0aVNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5maWx0ZXJhYmxlXCJcbiAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIihjdXJyZW50RmlsdGVyT3B0aW9ucyQgfCBhc3luYykgfHwgW11cIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiKGN1cnJlbnRTZWxlY3RlZEZpbHRlcnMkIHwgYXN5bmMpIHx8IFtdXCJcbiAgICAgICAgICAgICAgICAgIFtzaG93VG9nZ2xlQWxsXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgZW1wdHlGaWx0ZXJNZXNzYWdlPVwie3sgJ09DWF9EQVRBX1RBQkxFLkVNUFRZX0ZJTFRFUl9NRVNTQUdFJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICBbZGlzcGxheVNlbGVjdGVkTGFiZWxdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgW3Jlc2V0RmlsdGVyT25IaWRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRmlsdGVyQ2hhbmdlKGNvbHVtbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkljb25cIlxuICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uRmlsdGVyQ2xpY2soY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ09DWF9EQVRBX1RBQkxFLkZJTFRFUl9USVRMRScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoJ09DWF9EQVRBX1RBQkxFLkZJTFRFUl9BUklBX0xBQkVMJyB8IHRyYW5zbGF0ZTogeyBjb2x1bW46IGNvbHVtbi5uYW1lS2V5IHwgdHJhbnNsYXRlfSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJzZWxlY3RlZEl0ZW1zXCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwaVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpLWZpbHRlcl09XCIhKChmaWx0ZXJBbW91bnRzJCB8IGFzeW5jKSB8fCB7fSlbY29sdW1uLmlkXVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpLWZpbHRlci1maWxsXT1cIigoZmlsdGVyQW1vdW50cyQgfCBhc3luYykgfHwge30pW2NvbHVtbi5pZF0gPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpdGVtXCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW5UZW1wbGF0ZXNbY29sdW1uLmlkXSBhcyB0ZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgcm93T2JqZWN0OiBnZXRSb3dPYmplY3RGcm9tTXVsdGlzZWxlY3RJdGVtKHZhbHVlLCBjb2x1bW4pLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2ltcGxlSGVhZGVyPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3sgY29sdW1uLm5hbWVLZXkgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdyaWdodCc7XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFjdGlvbkNvbHVtbkhlYWRlclwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1yb3dPYmplY3Q+XG4gICAgICA8dHI+XG4gICAgICAgIDx0ZCAqbmdJZj1cInNlbGVjdGlvbkNoYW5nZWRPYnNlcnZlZFwiPlxuICAgICAgICAgIDxwLWNoZWNrYm94XG4gICAgICAgICAgICAqbmdJZj1cIighIXNlbGVjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShyb3dPYmplY3QsIHNlbGVjdGlvbkVuYWJsZWRGaWVsZCkpICYmIGlzU2VsZWN0ZWQocm93T2JqZWN0KTsgZWxzZSBkZWZhdWx0Q2hlY2tib3hcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjaGVja2VkXCJcbiAgICAgICAgICAgIFtiaW5hcnldPVwidHJ1ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgPjwvcC1jaGVja2JveD5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDaGVja2JveD5cbiAgICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3hcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInJvd09iamVjdFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIXNlbGVjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShyb3dPYmplY3QsIHNlbGVjdGlvbkVuYWJsZWRGaWVsZClcIlxuICAgICAgICAgICAgPjwvcC10YWJsZUNoZWNrYm94PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ2xlZnQnO1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhY3Rpb25Db2x1bW47IGNvbnRleHQ6IHtsb2NhbFJvd09iamVjdDogcm93T2JqZWN0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIlxuICAgICAgICAgICAgICBfY2VsbCA/IF9jZWxsOiBjb2x1bW5UZW1wbGF0ZXNbY29sdW1uLmlkXVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgIHJvd09iamVjdDogcm93T2JqZWN0LFxuICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAncmlnaHQnO1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhY3Rpb25Db2x1bW47IGNvbnRleHQ6IHtsb2NhbFJvd09iamVjdDogcm93T2JqZWN0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XG4gICAgICA8dHI+XG4gICAgICAgIDx0ZCBbY29sU3Bhbl09XCJjb2x1bW5zLmxlbmd0aCArICgoYW55Um93QWN0aW9uT2JzZXJ2ZWQgfHwgdGhpcy5hZGRpdGlvbmFsQWN0aW9ucy5sZW5ndGggPiAwKSA/IDEgOiAwKVwiPlxuICAgICAgICAgIHt7IGVtcHR5UmVzdWx0c01lc3NhZ2UgfHwgKFwiT0NYX0RBVEFfVEFCTEUuRU1QVFlfUkVTVUxUXCIgfCB0cmFuc2xhdGUpIH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvcC10YWJsZT5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdFN0cmluZ0NlbGxcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8bmctY29udGFpbmVyPiB7eyByZXNvbHZlRmllbGREYXRhKHJvd09iamVjdCwgY29sdW1uLmlkKX19IDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHROdW1iZXJDZWxsXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCkgfCBudW1iZXIgfX0gPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdEN1c3RvbUNlbGxcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPiA8L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdERhdGVDZWxsXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCkgfCBkYXRlOiBjb2x1bW4uZGF0ZUZvcm1hdCA/PyAnbWVkaXVtJyB9fSA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJkZWZhdWx0UmVsYXRpdmVEYXRlQ2VsbFwiIGxldC1yb3dPYmplY3Q9XCJyb3dPYmplY3RcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxuZy1jb250YWluZXI+XG4gICAge3sgJ09DWF9EQVRBX1RBQkxFLkVESVRFRCcgfCB0cmFuc2xhdGUgfX0ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCkgfCB0aW1lYWdvIH19XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHRUcmFuc2xhdGlvbktleUNlbGxcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8bmctY29udGFpbmVyPiB7eyByZXNvbHZlRmllbGREYXRhKHJvd09iamVjdCwgY29sdW1uLmlkKSB8IHRyYW5zbGF0ZSB9fSA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
758
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLFNBQVMsRUFFVCxNQUFNLEVBR04sWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQ2xFLE9BQU8sRUFBWSxhQUFhLEVBQWMsTUFBTSxhQUFhLENBQUE7QUFFakUsT0FBTyxFQUNMLGVBQWUsRUFFZixhQUFhLEVBQ2IsWUFBWSxFQUNaLEtBQUssRUFDTCxHQUFHLEVBQ0gsUUFBUSxFQUNSLEVBQUUsRUFDRixjQUFjLEdBQ2YsTUFBTSxNQUFNLENBQUE7QUFDYixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUE7QUFJMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7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Q3NCLHVCQUF1QjtzQkFBbEQsWUFBWTt1QkFBQyxZQUFZO2dCQUlqQixnQ0FBZ0M7c0JBQXhDLEtBQUs7Z0JBQ29DLHFDQUFxQztzQkFBOUUsWUFBWTt1QkFBQywwQkFBMEI7Z0JBT3BDLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFPRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQW1CSCxTQUFTO3NCQURaLGVBQWU7dUJBQUMsYUFBYTtnQkFTMUIsYUFBYTtzQkFEaEIsWUFBWTt1QkFBQyxhQUFhO2dCQVN2QixlQUFlO3NCQURsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgTE9DQUxFX0lELFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnXG5pbXBvcnQgeyBpc1ZhbGlkRGF0ZSB9IGZyb20gJ0BvbmVjeC9hY2NlbGVyYXRvcidcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnQG9uZWN4L2FuZ3VsYXItaW50ZWdyYXRpb24taW50ZXJmYWNlJ1xuaW1wb3J0IHsgTWVudUl0ZW0sIFByaW1lVGVtcGxhdGUsIFNlbGVjdEl0ZW0gfSBmcm9tICdwcmltZW5nL2FwaSdcbmltcG9ydCB7IE1lbnUgfSBmcm9tICdwcmltZW5nL21lbnUnXG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgZmlyc3QsXG4gIG1hcCxcbiAgbWVyZ2VNYXAsXG4gIG9mLFxuICB3aXRoTGF0ZXN0RnJvbSxcbn0gZnJvbSAncnhqcydcbmltcG9ydCB7IENvbHVtblR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbC9jb2x1bW4tdHlwZS5tb2RlbCdcbmltcG9ydCB7IERhdGFBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbC9kYXRhLWFjdGlvbidcbmltcG9ydCB7IERhdGFTb3J0RGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWwvZGF0YS1zb3J0LWRpcmVjdGlvbidcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbiB9IGZyb20gJy4uLy4uL21vZGVsL2RhdGEtdGFibGUtY29sdW1uLm1vZGVsJ1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tICcuLi8uLi91dGlscy9vYmplY3R1dGlscydcbmltcG9ydCB7IERhdGFTb3J0QmFzZSB9IGZyb20gJy4uL2RhdGEtc29ydC1iYXNlL2RhdGEtc29ydC1iYXNlJ1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RJdGVtIH0gZnJvbSAncHJpbWVuZy9tdWx0aXNlbGVjdCdcblxudHlwZSBQcmltaXRpdmUgPSBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgYmlnaW50IHwgRGF0ZVxuZXhwb3J0IHR5cGUgUm93ID0ge1xuICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gIFtjb2x1bW5JZDogc3RyaW5nXTogdW5rbm93blxufVxuXG5leHBvcnQgZW51bSBUZW1wbGF0ZVR5cGUge1xuICBDRUxMID0gJ0NFTEwnLFxuICBGSUxURVJDRUxMID0gJ0ZJTFRFUkNFTEwnLFxufVxuXG5pbnRlcmZhY2UgVGVtcGxhdGVzRGF0YSB7XG4gIHRlbXBsYXRlc09ic2VydmFibGVzOiBSZWNvcmQ8c3RyaW5nLCBPYnNlcnZhYmxlPFRlbXBsYXRlUmVmPGFueT4gfCBudWxsPj5cbiAgaWRTdWZmaXg6IEFycmF5PHN0cmluZz5cbiAgdGVtcGxhdGVOYW1lczogUmVjb3JkPENvbHVtblR5cGUsIEFycmF5PHN0cmluZz4+XG59XG5cbmV4cG9ydCB0eXBlIEZpbHRlciA9IHsgY29sdW1uSWQ6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9XG5leHBvcnQgdHlwZSBTb3J0ID0geyBzb3J0Q29sdW1uOiBzdHJpbmc7IHNvcnREaXJlY3Rpb246IERhdGFTb3J0RGlyZWN0aW9uIH1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhVGFibGVDb21wb25lbnRTdGF0ZSB7XG4gIGZpbHRlcnM/OiBGaWx0ZXJbXVxuICBzb3J0aW5nPzogU29ydFxuICBzZWxlY3RlZFJvd3M/OiBSb3dbXVxuICBhY3RpdmVQYWdlPzogbnVtYmVyXG4gIHBhZ2VTaXplPzogbnVtYmVyXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29jeC1kYXRhLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUNvbXBvbmVudCBleHRlbmRzIERhdGFTb3J0QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIFRlbXBsYXRlVHlwZSA9IFRlbXBsYXRlVHlwZVxuICBjaGVja2VkID0gdHJ1ZVxuICBfcm93cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJvd1tdPihbXSlcbiAgQElucHV0KClcbiAgZ2V0IHJvd3MoKTogUm93W10ge1xuICAgIHJldHVybiB0aGlzLl9yb3dzJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHJvd3ModmFsdWU6IFJvd1tdKSB7XG4gICAgIXRoaXMuX3Jvd3MkLmdldFZhbHVlKCkubGVuZ3RoID8/IHRoaXMucmVzZXRQYWdlKClcbiAgICB0aGlzLl9yb3dzJC5uZXh0KHZhbHVlKVxuICB9XG4gIF9zZWxlY3Rpb25JZHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDwoc3RyaW5nIHwgbnVtYmVyKVtdPihbXSlcbiAgQElucHV0KClcbiAgc2V0IHNlbGVjdGVkUm93cyh2YWx1ZTogUm93W10gfCBzdHJpbmdbXSB8IG51bWJlcltdKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uSWRzJC5uZXh0KFxuICAgICAgdmFsdWUubWFwKChyb3cpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByb3cgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgcmV0dXJuIHJvdy5pZFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgX2ZpbHRlcnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGaWx0ZXJbXT4oW10pXG4gIEBJbnB1dCgpXG4gIGdldCBmaWx0ZXJzKCk6IEZpbHRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVycyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCBmaWx0ZXJzKHZhbHVlOiBGaWx0ZXJbXSkge1xuICAgICF0aGlzLl9maWx0ZXJzJC5nZXRWYWx1ZSgpLmxlbmd0aCA/PyB0aGlzLnJlc2V0UGFnZSgpXG4gICAgdGhpcy5fZmlsdGVycyQubmV4dCh2YWx1ZSlcbiAgfVxuICBfc29ydERpcmVjdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFTb3J0RGlyZWN0aW9uPihEYXRhU29ydERpcmVjdGlvbi5OT05FKVxuICBASW5wdXQoKVxuICBnZXQgc29ydERpcmVjdGlvbigpOiBEYXRhU29ydERpcmVjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnREaXJlY3Rpb24kLmdldFZhbHVlKClcbiAgfVxuICBzZXQgc29ydERpcmVjdGlvbih2YWx1ZTogRGF0YVNvcnREaXJlY3Rpb24pIHtcbiAgICB0aGlzLl9zb3J0RGlyZWN0aW9uJC5uZXh0KHZhbHVlKVxuICB9XG4gIF9zb3J0Q29sdW1uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJylcbiAgQElucHV0KClcbiAgZ2V0IHNvcnRDb2x1bW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcz8uX3NvcnRDb2x1bW4kLmdldFZhbHVlKClcbiAgfVxuICBzZXQgc29ydENvbHVtbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcz8uX3NvcnRDb2x1bW4kLm5leHQodmFsdWUpXG4gIH1cbiAgY29sdW1uVGVtcGxhdGVzJDogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4+IHwgdW5kZWZpbmVkXG4gIF9jb2x1bW5zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0YVRhYmxlQ29sdW1uW10+KFtdKVxuICBASW5wdXQoKVxuICBnZXQgY29sdW1ucygpOiBEYXRhVGFibGVDb2x1bW5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgY29sdW1ucyh2YWx1ZTogRGF0YVRhYmxlQ29sdW1uW10pIHtcbiAgICB0aGlzLl9jb2x1bW5zJC5uZXh0KHZhbHVlKVxuICAgIGNvbnN0IG9icyA9IHZhbHVlLm1hcCgoYykgPT4gdGhpcy5nZXRUZW1wbGF0ZShjLCBUZW1wbGF0ZVR5cGUuQ0VMTCkpXG4gICAgdGhpcy5jb2x1bW5UZW1wbGF0ZXMkID0gY29tYmluZUxhdGVzdChvYnMpLnBpcGUoXG4gICAgICBtYXAoKHZhbHVlcykgPT4gT2JqZWN0LmZyb21FbnRyaWVzKHZhbHVlLm1hcCgoYywgaSkgPT4gW2MuaWQsIHZhbHVlc1tpXV0pKSlcbiAgICApXG4gIH1cbiAgQElucHV0KCkgY2xpZW50U2lkZUZpbHRlcmluZyA9IHRydWVcbiAgQElucHV0KCkgY2xpZW50U2lkZVNvcnRpbmcgPSB0cnVlXG4gIEBJbnB1dCgpIHNvcnRTdGF0ZXM6IERhdGFTb3J0RGlyZWN0aW9uW10gPSBbRGF0YVNvcnREaXJlY3Rpb24uQVNDRU5ESU5HLCBEYXRhU29ydERpcmVjdGlvbi5ERVNDRU5ESU5HXVxuXG4gIGRpc3BsYXllZFBhZ2VTaXplcyQ6IE9ic2VydmFibGU8KG51bWJlciB8IHsgc2hvd0FsbDogc3RyaW5nIH0pW10+XG4gIF9wYWdlU2l6ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDwobnVtYmVyIHwgeyBzaG93QWxsOiBzdHJpbmcgfSlbXT4oWzEwLCAyNSwgNTBdKVxuICBASW5wdXQoKVxuICBnZXQgcGFnZVNpemVzKCk6IChudW1iZXIgfCB7IHNob3dBbGw6IHN0cmluZyB9KVtdIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZVNpemVzJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHBhZ2VTaXplcyh2YWx1ZTogKG51bWJlciB8IHsgc2hvd0FsbDogc3RyaW5nIH0pW10pIHtcbiAgICB0aGlzLl9wYWdlU2l6ZXMkLm5leHQodmFsdWUpXG4gIH1cbiAgZGlzcGxheWVkUGFnZVNpemUkOiBPYnNlcnZhYmxlPG51bWJlcj5cbiAgX3BhZ2VTaXplJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG4gIEBJbnB1dCgpXG4gIGdldCBwYWdlU2l6ZSgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZSQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCBwYWdlU2l6ZSh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcGFnZVNpemUkLm5leHQodmFsdWUpXG4gIH1cblxuICBASW5wdXQoKSBlbXB0eVJlc3VsdHNNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgbmFtZSA9ICcnXG4gIEBJbnB1dCgpIGRlbGV0ZVBlcm1pc3Npb246IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSB2aWV3UGVybWlzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGVkaXRQZXJtaXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZGVsZXRlQWN0aW9uRW5hYmxlZEZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgdmlld0FjdGlvblZpc2libGVGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHZpZXdBY3Rpb25FbmFibGVkRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBlZGl0QWN0aW9uVmlzaWJsZUZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZWRpdEFjdGlvbkVuYWJsZWRGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHNlbGVjdGlvbkVuYWJsZWRGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGFsbG93U2VsZWN0QWxsID0gdHJ1ZVxuICBASW5wdXQoKSBwYWdpbmF0b3IgPSB0cnVlXG4gIEBJbnB1dCgpIHBhZ2UgPSAwXG4gIEBJbnB1dCgpXG4gIGdldCB0b3RhbFJlY29yZHNPblNlcnZlcigpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmFtc1sndG90YWxSZWNvcmRzT25TZXJ2ZXInXSA/IE51bWJlcih0aGlzLnBhcmFtc1sndG90YWxSZWNvcmRzT25TZXJ2ZXInXSkgOiB1bmRlZmluZWRcbiAgfVxuICBzZXQgdG90YWxSZWNvcmRzT25TZXJ2ZXIodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMucGFyYW1zWyd0b3RhbFJlY29yZHNPblNlcnZlciddID0gdmFsdWU/LnRvU3RyaW5nKCkgPz8gJzAnXG4gIH1cbiAgQElucHV0KCkgY3VycmVudFBhZ2VTaG93aW5nS2V5ID0gJ09DWF9EQVRBX1RBQkxFLlNIT1dJTkcnXG4gIEBJbnB1dCgpIGN1cnJlbnRQYWdlU2hvd2luZ1dpdGhUb3RhbE9uU2VydmVyS2V5ID0gJ09DWF9EQVRBX1RBQkxFLlNIT1dJTkdfV0lUSF9UT1RBTF9PTl9TRVJWRVInXG4gIHBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICBjdXJyZW50UGFnZTogJ3tjdXJyZW50UGFnZX0nLFxuICAgIHRvdGFsUGFnZXM6ICd7dG90YWxQYWdlc30nLFxuICAgIHJvd3M6ICd7cm93c30nLFxuICAgIGZpcnN0OiAne2ZpcnN0fScsXG4gICAgbGFzdDogJ3tsYXN0fScsXG4gICAgdG90YWxSZWNvcmRzOiAne3RvdGFsUmVjb3Jkc30nLFxuICB9XG5cbiAgQElucHV0KCkgc3RyaW5nQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ3N0cmluZ0NlbGwnKSBzdHJpbmdDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3N0cmluZ0NlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RyaW5nQ2VsbFRlbXBsYXRlIHx8IHRoaXMuc3RyaW5nQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIEBJbnB1dCgpIG51bWJlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdudW1iZXJDZWxsJykgbnVtYmVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9udW1iZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm51bWJlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLm51bWJlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGFuZCBpbnN0ZWFkIHRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgb2YgYSBzcGVjaWZpYyBjb2x1bW5cbiAgICogdXNlIHRoZSBuZXcgYXBwcm9hY2ggaW5zdGVhZCBieSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uIGNvbHVtbiBpZCArIElkQ2VsbFxuICAgKiBlLmcuIGZvciBhIGNvbHVtbiB3aXRoIHRoZSBpZCAnc3RhdHVzJyB1c2UgcFRlbXBsYXRlPVwic3RhdHVzSWRDZWxsXCJcbiAgICovXG4gIEBJbnB1dCgpIGN1c3RvbUNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGFuZCBpbnN0ZWFkIHRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgb2YgYSBzcGVjaWZpYyBjb2x1bW5cbiAgICogdXNlIHRoZSBuZXcgYXBwcm9hY2ggaW5zdGVhZCBieSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uIGNvbHVtbiBpZCArIElkQ2VsbFxuICAgKiBlLmcuIGZvciBhIGNvbHVtbiB3aXRoIHRoZSBpZCAnc3RhdHVzJyB1c2UgcFRlbXBsYXRlPVwic3RhdHVzSWRDZWxsXCJcbiAgICovXG4gIEBDb250ZW50Q2hpbGQoJ2N1c3RvbUNlbGwnKSBjdXN0b21DZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2N1c3RvbUNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tQ2VsbFRlbXBsYXRlIHx8IHRoaXMuY3VzdG9tQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIEBJbnB1dCgpIGRhdGVDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnZGF0ZUNlbGwnKSBkYXRlQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9kYXRlQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlQ2VsbFRlbXBsYXRlIHx8IHRoaXMuZGF0ZUNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cblxuICBASW5wdXQoKSByZWxhdGl2ZURhdGVDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgncmVsYXRpdmVEYXRlQ2VsbCcpIHJlbGF0aXZlRGF0ZUNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfcmVsYXRpdmVEYXRlQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWxhdGl2ZURhdGVDZWxsVGVtcGxhdGUgfHwgdGhpcy5yZWxhdGl2ZURhdGVDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgY2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ2NlbGwnKSBjZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2NlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbFRlbXBsYXRlIHx8IHRoaXMuY2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICBASW5wdXQoKSB0cmFuc2xhdGlvbktleUNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCd0cmFuc2xhdGlvbktleUNlbGwnKSB0cmFuc2xhdGlvbktleUNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfdHJhbnNsYXRpb25LZXlDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uS2V5Q2VsbFRlbXBsYXRlIHx8IHRoaXMudHJhbnNsYXRpb25LZXlDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIEBJbnB1dCgpIHN0cmluZ0ZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdzdHJpbmdGaWx0ZXJDZWxsJykgc3RyaW5nRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9zdHJpbmdGaWx0ZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0cmluZ0ZpbHRlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLnN0cmluZ0ZpbHRlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgbnVtYmVyRmlsdGVyQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ251bWJlckZpbHRlckNlbGwnKSBudW1iZXJGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX251bWJlckZpbHRlckNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubnVtYmVyRmlsdGVyQ2VsbFRlbXBsYXRlIHx8IHRoaXMubnVtYmVyRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGFuZCBpbnN0ZWFkIHRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgb2YgYSBzcGVjaWZpYyBjb2x1bW4gZmlsdGVyXG4gICAqIHVzZSB0aGUgbmV3IGFwcHJvYWNoIGluc3RlYWQgYnkgZm9sbG93aW5nIHRoZSBuYW1pbmcgY29udmVudGlvbiBjb2x1bW4gaWQgKyBJZEZpbHRlckNlbGxcbiAgICogZS5nLiBmb3IgYSBjb2x1bW4gd2l0aCB0aGUgaWQgJ3N0YXR1cycgdXNlIHBUZW1wbGF0ZT1cInN0YXR1c0lkRmlsdGVyQ2VsbFwiXG4gICAqL1xuICBASW5wdXQoKSBjdXN0b21GaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBhbmQgaW5zdGVhZCB0byBjaGFuZ2UgdGhlIHRlbXBsYXRlIG9mIGEgc3BlY2lmaWMgY29sdW1uIGZpbHRlclxuICAgKiB1c2UgdGhlIG5ldyBhcHByb2FjaCBpbnN0ZWFkIGJ5IGZvbGxvd2luZyB0aGUgbmFtaW5nIGNvbnZlbnRpb24gY29sdW1uIGlkICsgSWRGaWx0ZXJDZWxsXG4gICAqIGUuZy4gZm9yIGEgY29sdW1uIHdpdGggdGhlIGlkICdzdGF0dXMnIHVzZSBwVGVtcGxhdGU9XCJzdGF0dXNJZEZpbHRlckNlbGxcIlxuICAgKi9cbiAgQENvbnRlbnRDaGlsZCgnY3VzdG9tRmlsdGVyQ2VsbCcpIGN1c3RvbUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfY3VzdG9tRmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21GaWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5jdXN0b21GaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIEBJbnB1dCgpIGRhdGVGaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnZGF0ZUZpbHRlckNlbGwnKSBkYXRlRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9kYXRlRmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlRmlsdGVyQ2VsbFRlbXBsYXRlIHx8IHRoaXMuZGF0ZUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgcmVsYXRpdmVEYXRlRmlsdGVyQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ3JlbGF0aXZlRGF0ZUZpbHRlckNlbGwnKSByZWxhdGl2ZURhdGVGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3JlbGF0aXZlRGF0ZUZpbHRlckNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVsYXRpdmVEYXRlRmlsdGVyQ2VsbFRlbXBsYXRlIHx8IHRoaXMucmVsYXRpdmVEYXRlRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICBASW5wdXQoKSBmaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnZmlsdGVyQ2VsbCcpIGZpbHRlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfZmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5maWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ3RyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbCcpIHRyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF90cmFuc2xhdGlvbktleUZpbHRlckNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy50cmFuc2xhdGlvbktleUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cblxuICBfYWRkaXRpb25hbEFjdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhQWN0aW9uW10+KFtdKVxuICBASW5wdXQoKVxuICBnZXQgYWRkaXRpb25hbEFjdGlvbnMoKTogRGF0YUFjdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkaXRpb25hbEFjdGlvbnMkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgYWRkaXRpb25hbEFjdGlvbnModmFsdWU6IERhdGFBY3Rpb25bXSkge1xuICAgIHRoaXMuX2FkZGl0aW9uYWxBY3Rpb25zJC5uZXh0KHZhbHVlKVxuICB9XG4gIEBJbnB1dCgpIGZyb3plbkFjdGlvbkNvbHVtbiA9IGZhbHNlXG4gIEBJbnB1dCgpIGFjdGlvbkNvbHVtblBvc2l0aW9uOiAnbGVmdCcgfCAncmlnaHQnID0gJ3JpZ2h0J1xuXG4gIEBPdXRwdXQoKSBmaWx0ZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsdGVyW10+KClcbiAgQE91dHB1dCgpIHNvcnRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ydD4oKVxuICBAT3V0cHV0KCkgdmlld1RhYmxlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxSb3c+KClcbiAgQE91dHB1dCgpIGVkaXRUYWJsZVJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8Um93PigpXG4gIEBPdXRwdXQoKSBkZWxldGVUYWJsZVJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8Um93PigpXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxSb3dbXT4oKVxuICBAT3V0cHV0KCkgcGFnZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKVxuICBAT3V0cHV0KCkgcGFnZVNpemVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KClcbiAgQE91dHB1dCgpIGNvbXBvbmVudFN0YXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQ29tcG9uZW50U3RhdGU+KClcblxuICBkaXNwbGF5ZWRSb3dzJDogT2JzZXJ2YWJsZTx1bmtub3duW10+IHwgdW5kZWZpbmVkXG4gIHNlbGVjdGVkUm93cyQ6IE9ic2VydmFibGU8dW5rbm93bltdPiB8IHVuZGVmaW5lZFxuXG4gIGN1cnJlbnRGaWx0ZXJDb2x1bW4kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhVGFibGVDb2x1bW4gfCBudWxsPihudWxsKVxuICBjdXJyZW50RmlsdGVyT3B0aW9ucyQ6IE9ic2VydmFibGU8U2VsZWN0SXRlbVtdPiB8IHVuZGVmaW5lZFxuICBjdXJyZW50U2VsZWN0ZWRGaWx0ZXJzJDogT2JzZXJ2YWJsZTxzdHJpbmdbXT4gfCB1bmRlZmluZWRcbiAgZmlsdGVyQW1vdW50cyQ6IE9ic2VydmFibGU8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4gfCB1bmRlZmluZWRcblxuICBvdmVyZmxvd0FjdGlvbnMkOiBPYnNlcnZhYmxlPERhdGFBY3Rpb25bXT5cbiAgaW5saW5lQWN0aW9ucyQ6IE9ic2VydmFibGU8RGF0YUFjdGlvbltdPlxuICBvdmVyZmxvd01lbnVJdGVtcyQ6IE9ic2VydmFibGU8TWVudUl0ZW1bXT5cbiAgY3VycmVudE1lbnVSb3ckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSb3cgfCBudWxsPihudWxsKVxuXG4gIHRlbXBsYXRlcyQ6IEJlaGF2aW9yU3ViamVjdDxRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpXG4gIEBDb250ZW50Q2hpbGRyZW4oUHJpbWVUZW1wbGF0ZSlcbiAgc2V0IHRlbXBsYXRlcyh2YWx1ZTogUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy50ZW1wbGF0ZXMkLm5leHQodmFsdWUpXG4gIH1cblxuICB2aWV3VGVtcGxhdGVzJDogQmVoYXZpb3JTdWJqZWN0PFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZClcbiAgQFZpZXdDaGlsZHJlbihQcmltZVRlbXBsYXRlKVxuICBzZXQgdmlld1RlbXBsYXRlcyh2YWx1ZTogUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy52aWV3VGVtcGxhdGVzJC5uZXh0KHZhbHVlKVxuICB9XG5cbiAgcGFyZW50VGVtcGxhdGVzJDogQmVoYXZpb3JTdWJqZWN0PFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IG51bGwgfCB1bmRlZmluZWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCBudWxsIHwgdW5kZWZpbmVkXG4gID4odW5kZWZpbmVkKVxuICBASW5wdXQoKVxuICBzZXQgcGFyZW50VGVtcGxhdGVzKHZhbHVlOiBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5wYXJlbnRUZW1wbGF0ZXMkLm5leHQodmFsdWUpXG4gIH1cblxuICBnZXQgdmlld1RhYmxlUm93T2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHYgPSB0aGlzLmluamVjdG9yLmdldCgnRGF0YVZpZXdDb21wb25lbnQnLCBudWxsKVxuICAgIHJldHVybiBkdj8udmlld0l0ZW1PYnNlcnZlZCB8fCBkdj8udmlld0l0ZW0ub2JzZXJ2ZWQgfHwgdGhpcy52aWV3VGFibGVSb3cub2JzZXJ2ZWRcbiAgfVxuICBnZXQgZWRpdFRhYmxlUm93T2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHYgPSB0aGlzLmluamVjdG9yLmdldCgnRGF0YVZpZXdDb21wb25lbnQnLCBudWxsKVxuICAgIHJldHVybiBkdj8uZWRpdEl0ZW1PYnNlcnZlZCB8fCBkdj8uZWRpdEl0ZW0ub2JzZXJ2ZWQgfHwgdGhpcy5lZGl0VGFibGVSb3cub2JzZXJ2ZWRcbiAgfVxuICBnZXQgZGVsZXRlVGFibGVSb3dPYnNlcnZlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBkdiA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdEYXRhVmlld0NvbXBvbmVudCcsIG51bGwpXG4gICAgcmV0dXJuIGR2Py5kZWxldGVJdGVtT2JzZXJ2ZWQgfHwgZHY/LmRlbGV0ZUl0ZW0ub2JzZXJ2ZWQgfHwgdGhpcy5kZWxldGVUYWJsZVJvdy5vYnNlcnZlZFxuICB9XG4gIGdldCBhbnlSb3dBY3Rpb25PYnNlcnZlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52aWV3VGFibGVSb3dPYnNlcnZlZCB8fCB0aGlzLmVkaXRUYWJsZVJvd09ic2VydmVkIHx8IHRoaXMuZGVsZXRlVGFibGVSb3dPYnNlcnZlZFxuICB9XG5cbiAgZ2V0IHNlbGVjdGlvbkNoYW5nZWRPYnNlcnZlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBkdiA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdEYXRhVmlld0NvbXBvbmVudCcsIG51bGwpXG4gICAgcmV0dXJuIGR2Py5zZWxlY3Rpb25DaGFuZ2VkT2JzZXJ2ZWQgfHwgZHY/LnNlbGVjdGlvbkNoYW5nZWQub2JzZXJ2ZWQgfHwgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkLm9ic2VydmVkXG4gIH1cblxuICB0ZW1wbGF0ZXNPYnNlcnZhYmxlczogUmVjb3JkPHN0cmluZywgT2JzZXJ2YWJsZTxUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4+ID0ge31cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KExPQ0FMRV9JRCkgbG9jYWxlOiBzdHJpbmcsXG4gICAgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKGxvY2FsZSwgdHJhbnNsYXRlU2VydmljZSlcbiAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUgfHwgdGhpcy5yb3V0ZXIudXJsLnJlcGxhY2UoL1teQS1aYS16MC05XS8sICdfJylcbiAgICB0aGlzLmRpc3BsYXllZFBhZ2VTaXplcyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9wYWdlU2l6ZXMkLCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdPQ1hfREFUQV9UQUJMRS5BTEwnKV0pLnBpcGUoXG4gICAgICBtYXAoKFtwYWdlU2l6ZXMsIHRyYW5zbGF0aW9uXSkgPT4gcGFnZVNpemVzLmNvbmNhdCh7IHNob3dBbGw6IHRyYW5zbGF0aW9uIH0pKVxuICAgIClcbiAgICB0aGlzLmRpc3BsYXllZFBhZ2VTaXplJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX3BhZ2VTaXplJCwgdGhpcy5fcGFnZVNpemVzJF0pLnBpcGUoXG4gICAgICBtYXAoKFtwYWdlU2l6ZSwgcGFnZVNpemVzXSkgPT4gcGFnZVNpemUgPz8gcGFnZVNpemVzLmZpbmQoKHZhbCk6IHZhbCBpcyBudW1iZXIgPT4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpID8/IDUwKVxuICAgIClcbiAgICB0aGlzLm92ZXJmbG93QWN0aW9ucyQgPSB0aGlzLl9hZGRpdGlvbmFsQWN0aW9ucyQucGlwZShcbiAgICAgIG1hcCgoYWN0aW9ucykgPT4gYWN0aW9ucy5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uLnNob3dBc092ZXJmbG93KSlcbiAgICApXG4gICAgdGhpcy5pbmxpbmVBY3Rpb25zJCA9IHRoaXMuX2FkZGl0aW9uYWxBY3Rpb25zJC5waXBlKFxuICAgICAgbWFwKChhY3Rpb25zKSA9PiBhY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiAhYWN0aW9uLnNob3dBc092ZXJmbG93KSlcbiAgICApXG4gICAgdGhpcy5vdmVyZmxvd01lbnVJdGVtcyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLm92ZXJmbG93QWN0aW9ucyQsIHRoaXMuY3VycmVudE1lbnVSb3ckXSkucGlwZShcbiAgICAgIG1lcmdlTWFwKChbYWN0aW9ucywgcm93XSkgPT5cbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldChbLi4uYWN0aW9ucy5tYXAoKGEpID0+IGEubGFiZWxLZXkgfHwgJycpXSkucGlwZShcbiAgICAgICAgICBtYXAoKHRyYW5zbGF0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnNcbiAgICAgICAgICAgICAgLmZpbHRlcigoYSkgPT4gdGhpcy51c2VyU2VydmljZS5oYXNQZXJtaXNzaW9uKGEucGVybWlzc2lvbikpXG4gICAgICAgICAgICAgIC5tYXAoKGEpID0+ICh7XG4gICAgICAgICAgICAgICAgbGFiZWw6IHRyYW5zbGF0aW9uc1thLmxhYmVsS2V5IHx8ICcnXSxcbiAgICAgICAgICAgICAgICBpY29uOiBhLmljb24sXG4gICAgICAgICAgICAgICAgc3R5bGVDbGFzczogKGEuY2xhc3NlcyB8fCBbXSkuam9pbignICcpLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBhLmRpc2FibGVkIHx8ICghIWEuYWN0aW9uRW5hYmxlZEZpZWxkICYmICF0aGlzLmZpZWxkSXNUcnV0aHkocm93LCBhLmFjdGlvbkVuYWJsZWRGaWVsZCkpLFxuICAgICAgICAgICAgICAgIHZpc2libGU6ICFhLmFjdGlvblZpc2libGVGaWVsZCB8fCB0aGlzLmZpZWxkSXNUcnV0aHkocm93LCBhLmFjdGlvblZpc2libGVGaWVsZCksXG4gICAgICAgICAgICAgICAgY29tbWFuZDogKCkgPT4gYS5jYWxsYmFjayhyb3cpLFxuICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5ZWRSb3dzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX3Jvd3MkLCB0aGlzLl9maWx0ZXJzJCwgdGhpcy5fc29ydENvbHVtbiQsIHRoaXMuX3NvcnREaXJlY3Rpb24kXSkucGlwZShcbiAgICAgIG1lcmdlTWFwKChwYXJhbXMpID0+IHRoaXMudHJhbnNsYXRlSXRlbXMocGFyYW1zLCB0aGlzLmNvbHVtbnMsIHRoaXMuY2xpZW50U2lkZUZpbHRlcmluZywgdGhpcy5jbGllbnRTaWRlU29ydGluZykpLFxuICAgICAgbWFwKChwYXJhbXMpID0+IHRoaXMuZmlsdGVySXRlbXMocGFyYW1zLCB0aGlzLmNsaWVudFNpZGVGaWx0ZXJpbmcpKSxcbiAgICAgIG1hcCgocGFyYW1zKSA9PiB0aGlzLnNvcnRJdGVtcyhwYXJhbXMsIHRoaXMuY29sdW1ucywgdGhpcy5jbGllbnRTaWRlU29ydGluZykpLFxuICAgICAgbWFwKChbcm93c10pID0+IHRoaXMuZmxhdHRlbkl0ZW1zKHJvd3MpKVxuICAgIClcbiAgICB0aGlzLmN1cnJlbnRTZWxlY3RlZEZpbHRlcnMkID0gY29tYmluZUxhdGVzdChbdGhpcy5fZmlsdGVycyQsIHRoaXMuY3VycmVudEZpbHRlckNvbHVtbiRdKS5waXBlKFxuICAgICAgbWFwKChbZmlsdGVycywgY3VycmVudEZpbHRlckNvbHVtbl0pID0+IHtcbiAgICAgICAgcmV0dXJuIGZpbHRlcnMuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZCA9PT0gY3VycmVudEZpbHRlckNvbHVtbj8uaWQpLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIudmFsdWUpXG4gICAgICB9KVxuICAgIClcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXJPcHRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX3Jvd3MkLCB0aGlzLmN1cnJlbnRGaWx0ZXJDb2x1bW4kLCB0aGlzLl9maWx0ZXJzJF0pLnBpcGUoXG4gICAgICBtZXJnZU1hcCgoW3Jvd3MsIGN1cnJlbnRGaWx0ZXJDb2x1bW4sIGZpbHRlcnNdKSA9PiB7XG4gICAgICAgIGlmICghY3VycmVudEZpbHRlckNvbHVtbj8uaWQpIHtcbiAgICAgICAgICByZXR1cm4gb2YoW10pXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VycmVudEZpbHRlcnMgPSBmaWx0ZXJzXG4gICAgICAgICAgLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuY29sdW1uSWQgPT09IGN1cnJlbnRGaWx0ZXJDb2x1bW4/LmlkKVxuICAgICAgICAgIC5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLnZhbHVlKVxuXG4gICAgICAgIGNvbnN0IGNvbHVtblZhbHVlcyA9IHJvd3MubWFwKChyb3cpID0+IHJvd1tjdXJyZW50RmlsdGVyQ29sdW1uPy5pZF0pXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZU9ic2VydmFibGUgPVxuICAgICAgICAgIHRoaXMuY29sdW1ucy5maW5kKChjKSA9PiBjLmlkID09PSBjdXJyZW50RmlsdGVyQ29sdW1uPy5pZCk/LmNvbHVtblR5cGUgPT09IENvbHVtblR5cGUuVFJBTlNMQVRJT05fS0VZXG4gICAgICAgICAgICA/IHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoY29sdW1uVmFsdWVzIGFzIHN0cmluZ1tdKVxuICAgICAgICAgICAgOiBvZihPYmplY3QuZnJvbUVudHJpZXMoY29sdW1uVmFsdWVzLm1hcCgoY3YpID0+IFtjdiwgY3ZdKSkpXG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVPYnNlcnZhYmxlLnBpcGUoXG4gICAgICAgICAgbWFwKCh0cmFuc2xhdGVkVmFsdWVzKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0cmFuc2xhdGVkVmFsdWVzKVxuICAgICAgICAgICAgICAuY29uY2F0KGN1cnJlbnRGaWx0ZXJzKVxuICAgICAgICAgICAgICAuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4ICYmIHZhbHVlICE9IG51bGwpXG4gICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgKGZpbHRlck9wdGlvbikgPT5cbiAgICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBmaWx0ZXJPcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJPcHRpb24sXG4gICAgICAgICAgICAgICAgICB9KSBhcyBTZWxlY3RJdGVtXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9KVxuICAgIClcbiAgICB0aGlzLmZpbHRlckFtb3VudHMkID0gdGhpcy5fZmlsdGVycyQucGlwZShcbiAgICAgIG1hcCgoZmlsdGVycykgPT5cbiAgICAgICAgZmlsdGVyc1xuICAgICAgICAgIC5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLmNvbHVtbklkKVxuICAgICAgICAgIC5tYXAoKGNvbHVtbklkKSA9PiBbY29sdW1uSWQsIGZpbHRlcnMuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZCA9PT0gY29sdW1uSWQpLmxlbmd0aF0pXG4gICAgICApLFxuICAgICAgbWFwKChhbW91bnRzKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoYW1vdW50cykpXG4gICAgKVxuICAgIHRoaXMubWFwU2VsZWN0aW9uVG9Sb3dzKClcbiAgICB0aGlzLmVtaXRDb21wb25lbnRTdGF0ZUNoYW5nZWQoKVxuICB9XG5cbiAgZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZChzdGF0ZTogRGF0YVRhYmxlQ29tcG9uZW50U3RhdGUgPSB7fSkge1xuICAgIHRoaXMuZGlzcGxheWVkUGFnZVNpemUkXG4gICAgICAucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLl9zZWxlY3Rpb25JZHMkLCB0aGlzLl9yb3dzJCksIGZpcnN0KCkpXG4gICAgICAuc3Vic2NyaWJlKChbcGFnZVNpemUsIHNlbGVjdGVkSWRzLCByb3dzXSkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBvbmVudFN0YXRlQ2hhbmdlZC5lbWl0KHtcbiAgICAgICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMsXG4gICAgICAgICAgc29ydGluZzoge1xuICAgICAgICAgICAgc29ydENvbHVtbjogdGhpcy5zb3J0Q29sdW1uLFxuICAgICAgICAgICAgc29ydERpcmVjdGlvbjogdGhpcy5zb3J0RGlyZWN0aW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGFnZVNpemUsXG4gICAgICAgICAgYWN0aXZlUGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgIHNlbGVjdGVkUm93czogcm93cy5maWx0ZXIoKHJvdykgPT4gc2VsZWN0ZWRJZHMuaW5jbHVkZXMocm93LmlkKSksXG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIH0pXG4gICAgICB9KVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMudGVtcGxhdGVzJC52YWx1ZT8uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgc3dpdGNoIChpdGVtLmdldFR5cGUoKSkge1xuICAgICAgICBjYXNlICdzdHJpbmdDZWxsJzpcbiAgICAgICAgICB0aGlzLnN0cmluZ0NlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ251bWJlckNlbGwnOlxuICAgICAgICAgIHRoaXMubnVtYmVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnY3VzdG9tQ2VsbCc6XG4gICAgICAgICAgdGhpcy5jdXN0b21DZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdkYXRlQ2VsbCc6XG4gICAgICAgICAgdGhpcy5kYXRlQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAncmVsYXRpdmVEYXRlQ2VsbCc6XG4gICAgICAgICAgdGhpcy5yZWxhdGl2ZURhdGVDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdjZWxsVGVtcGxhdGUnOlxuICAgICAgICAgIHRoaXMuY2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAndHJhbnNsYXRpb25LZXlDZWxsJzpcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uS2V5Q2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnc3RyaW5nRmlsdGVyQ2VsbCc6XG4gICAgICAgICAgdGhpcy5zdHJpbmdGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdudW1iZXJGaWx0ZXJDZWxsJzpcbiAgICAgICAgICB0aGlzLm51bWJlckZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2N1c3RvbUZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMuY3VzdG9tRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnZGF0ZUZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMuZGF0ZUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3JlbGF0aXZlRGF0ZUZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMucmVsYXRpdmVEYXRlRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnZmlsdGVyQ2VsbFRlbXBsYXRlJzpcbiAgICAgICAgICB0aGlzLmZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3RyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbCc6XG4gICAgICAgICAgdGhpcy50cmFuc2xhdGlvbktleUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIG9uU29ydENvbHVtbkNsaWNrKHNvcnRDb2x1bW46IHN0cmluZykge1xuICAgIGNvbnN0IG5ld1NvcnREaXJlY3Rpb24gPSB0aGlzLmNvbHVtbk5leHRTb3J0RGlyZWN0aW9uKHNvcnRDb2x1bW4pXG5cbiAgICB0aGlzLl9zb3J0Q29sdW1uJC5uZXh0KHNvcnRDb2x1bW4pXG4gICAgdGhpcy5fc29ydERpcmVjdGlvbiQubmV4dChuZXdTb3J0RGlyZWN0aW9uKVxuXG4gICAgdGhpcy5zb3J0ZWQuZW1pdCh7IHNvcnRDb2x1bW46IHNvcnRDb2x1bW4sIHNvcnREaXJlY3Rpb246IG5ld1NvcnREaXJlY3Rpb24gfSlcbiAgICB0aGlzLmVtaXRDb21wb25lbnRTdGF0ZUNoYW5nZWQoe1xuICAgICAgc29ydGluZzoge1xuICAgICAgICBzb3J0Q29sdW1uOiBzb3J0Q29sdW1uLFxuICAgICAgICBzb3J0RGlyZWN0aW9uOiBuZXdTb3J0RGlyZWN0aW9uLFxuICAgICAgfSxcbiAgICB9KVxuICB9XG5cbiAgY29sdW1uTmV4dFNvcnREaXJlY3Rpb24oc29ydENvbHVtbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHNvcnRDb2x1bW4gIT09IHRoaXMuc29ydENvbHVtblxuICAgICAgPyB0aGlzLnNvcnRTdGF0ZXNbMF1cbiAgICAgIDogdGhpcy5zb3J0U3RhdGVzWyh0aGlzLnNvcnRTdGF0ZXMuaW5kZXhPZih0aGlzLnNvcnREaXJlY3Rpb24pICsgMSkgJSB0aGlzLnNvcnRTdGF0ZXMubGVuZ3RoXVxuICB9XG5cbiAgb25EZWxldGVSb3coc2VsZWN0ZWRUYWJsZVJvdzogUm93KSB7XG4gICAgdGhpcy5kZWxldGVUYWJsZVJvdy5lbWl0KHNlbGVjdGVkVGFibGVSb3cpXG4gIH1cblxuICBvblZpZXdSb3coc2VsZWN0ZWRUYWJsZVJvdzogUm93KSB7XG4gICAgdGhpcy52aWV3VGFibGVSb3cuZW1pdChzZWxlY3RlZFRhYmxlUm93KVxuICB9XG5cbiAgb25FZGl0Um93KHNlbGVjdGVkVGFibGVSb3c6IFJvdykge1xuICAgIHRoaXMuZWRpdFRhYmxlUm93LmVtaXQoc2VsZWN0ZWRUYWJsZVJvdylcbiAgfVxuXG4gIG9uRmlsdGVyQ2hvc2VuKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uKSB7XG4gICAgdGhpcy5jdXJyZW50RmlsdGVyQ29sdW1uJC5uZXh0KGNvbHVtbilcbiAgfVxuXG4gIG9uRmlsdGVyQ2hhbmdlKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uLCBldmVudDogYW55KSB7XG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuZmlsdGVyc1xuICAgICAgLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuY29sdW1uSWQgIT09IGNvbHVtbi5pZClcbiAgICAgIC5jb25jYXQoXG4gICAgICAgIGV2ZW50LnZhbHVlLm1hcCgodmFsdWU6IFByaW1pdGl2ZSkgPT4gKHtcbiAgICAgICAgICBjb2x1bW5JZDogY29sdW1uLmlkLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICB9KSlcbiAgICAgIClcbiAgICBpZiAodGhpcy5jbGllbnRTaWRlRmlsdGVyaW5nKSB7XG4gICAgICB0aGlzLmZpbHRlcnMgPSBmaWx0ZXJzXG4gICAgfVxuICAgIHRoaXMuZmlsdGVyZWQuZW1pdChmaWx0ZXJzKVxuICAgIHRoaXMuZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZCh7XG4gICAgICBmaWx0ZXJzLFxuICAgIH0pXG4gICAgdGhpcy5yZXNldFBhZ2UoKVxuICB9XG5cbiAgZ2V0U2VsZWN0ZWRGaWx0ZXJzKGNvbHVtbklkOiBzdHJpbmcpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycy5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLmNvbHVtbklkID09PSBjb2x1bW5JZCkubWFwKChmaWx0ZXIpID0+IGZpbHRlci52YWx1ZSlcbiAgfVxuXG4gIHNvcnRJY29uVGl0bGUoc29ydENvbHVtbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ydERpcmVjdGlvblRvVGl0bGUoXG4gICAgICBzb3J0Q29sdW1uICE9PSB0aGlzLnNvcnREaXJlY3Rpb25cbiAgICAgICAgPyBEYXRhU29ydERpcmVjdGlvbi5OT05FXG4gICAgICAgIDogdGhpcy5zb3J0U3RhdGVzW3RoaXMuc29ydFN0YXRlcy5pbmRleE9mKHRoaXMuc29ydERpcmVjdGlvbikgJSB0aGlzLnNvcnRTdGF0ZXMubGVuZ3RoXVxuICAgIClcbiAgfVxuXG4gIHNvcnREaXJlY3Rpb25Ub1RpdGxlKHNvcnREaXJlY3Rpb246IERhdGFTb3J0RGlyZWN0aW9uKSB7XG4gICAgc3dpdGNoIChzb3J0RGlyZWN0aW9uKSB7XG4gICAgICBjYXNlIERhdGFTb3J0RGlyZWN0aW9uLkFTQ0VORElORzpcbiAgICAgICAgcmV0dXJuICdPQ1hfREFUQV9UQUJMRS5UT0dHTEVfQlVUVE9OLkFTQ0VORElOR19USVRMRSdcbiAgICAgIGNhc2UgRGF0YVNvcnREaXJlY3Rpb24uREVTQ0VORElORzpcbiAgICAgICAgcmV0dXJuICdPQ1hfREFUQV9UQUJMRS5UT0dHTEVfQlVUVE9OLkRFU0NFTkRJTkdfVElUTEUnXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ09DWF9EQVRBX1RBQkxFLlRPR0dMRV9CVVRUT04uREVGQVVMVF9USVRMRSdcbiAgICB9XG4gIH1cblxuICBtYXBTZWxlY3Rpb25Ub1Jvd3MoKSB7XG4gICAgdGhpcy5zZWxlY3RlZFJvd3MkID0gY29tYmluZUxhdGVzdChbdGhpcy5fc2VsZWN0aW9uSWRzJCwgdGhpcy5fcm93cyRdKS5waXBlKFxuICAgICAgbWFwKChbc2VsZWN0ZWRSb3dJZHMsIHJvd3NdKSA9PiB7XG4gICAgICAgIHJldHVybiBzZWxlY3RlZFJvd0lkcy5tYXAoKHJvd0lkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJvd3MuZmluZCgocikgPT4gci5pZCA9PT0gcm93SWQpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGlvbjogUm93W10pIHtcbiAgICBsZXQgbmV3U2VsZWN0aW9uSWRzID0gc2VsZWN0aW9uLm1hcCgocm93KSA9PiByb3cuaWQpXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuX3Jvd3MkLmdldFZhbHVlKClcblxuICAgIGlmICh0aGlzLnNlbGVjdGlvbkVuYWJsZWRGaWVsZCkge1xuICAgICAgY29uc3QgZGlzYWJsZWRSb3dJZHMgPSByb3dzLmZpbHRlcigocikgPT4gIXRoaXMuZmllbGRJc1RydXRoeShyLCB0aGlzLnNlbGVjdGlvbkVuYWJsZWRGaWVsZCkpLm1hcCgocm93KSA9PiByb3cuaWQpXG4gICAgICBpZiAoZGlzYWJsZWRSb3dJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZWxlY3Rpb25JZHMgPSB0aGlzLm1lcmdlV2l0aERpc2FibGVkS2V5cyhuZXdTZWxlY3Rpb25JZHMsIGRpc2FibGVkUm93SWRzKVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICB0aGlzLl9zZWxlY3Rpb25JZHMkLm5leHQobmV3U2VsZWN0aW9uSWRzKVxuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHRoaXMuX3Jvd3MkLmdldFZhbHVlKCkuZmlsdGVyKChyb3cpID0+IG5ld1NlbGVjdGlvbklkcy5pbmNsdWRlcyhyb3cuaWQpKSlcbiAgICB0aGlzLmVtaXRDb21wb25lbnRTdGF0ZUNoYW5nZWQoKVxuICB9XG5cbiAgbWVyZ2VXaXRoRGlzYWJsZWRLZXlzKG5ld1NlbGVjdGlvbklkczogKHN0cmluZyB8IG51bWJlcilbXSwgZGlzYWJsZWRSb3dJZHM6IChzdHJpbmcgfCBudW1iZXIpW10pIHtcbiAgICBjb25zdCBwcmV2aW91c1NlbGVjdGlvbklkcyA9IHRoaXMuX3NlbGVjdGlvbklkcyQuZ2V0VmFsdWUoKVxuICAgIGNvbnN0IHByZXZpb3VzbHlTZWxlY3RlZEFuZERpc2FibGVkID0gcHJldmlvdXNTZWxlY3Rpb25JZHMuZmlsdGVyKChpZCkgPT4gZGlzYWJsZWRSb3dJZHMuaW5jbHVkZXMoaWQpKVxuICAgIGNvbnN0IGRpc2FibGVkQW5kUHJldmlvdXNseURlc2VsZWN0ZWQgPSBkaXNhYmxlZFJvd0lkcy5maWx0ZXIoKGlkKSA9PiAhcHJldmlvdXNTZWxlY3Rpb25JZHMuaW5jbHVkZXMoaWQpKVxuICAgIGNvbnN0IHVwZGF0ZWRTZWxlY3Rpb24gPSBbLi4ubmV3U2VsZWN0aW9uSWRzXVxuXG4gICAgcHJldmlvdXNseVNlbGVjdGVkQW5kRGlzYWJsZWQuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgIGlmICghdXBkYXRlZFNlbGVjdGlvbi5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgdXBkYXRlZFNlbGVjdGlvbi5wdXNoKGlkKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBkaXNhYmxlZEFuZFByZXZpb3VzbHlEZXNlbGVjdGVkLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IHVwZGF0ZWRTZWxlY3Rpb24uaW5kZXhPZihpZClcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIHVwZGF0ZWRTZWxlY3Rpb24uc3BsaWNlKGluZGV4LCAxKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gdXBkYXRlZFNlbGVjdGlvblxuICB9XG5cbiAgaXNTZWxlY3RlZChyb3c6IFJvdykge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25JZHMkLmdldFZhbHVlKCkuaW5jbHVkZXMocm93LmlkKVxuICB9XG5cbiAgb25QYWdlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBwYWdlID0gZXZlbnQuZmlyc3QgLyBldmVudC5yb3dzXG4gICAgdGhpcy5wYWdlID0gcGFnZVxuICAgIHRoaXMucGFnZVNpemUgPSBldmVudC5yb3dzXG4gICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KHBhZ2UpXG4gICAgdGhpcy5wYWdlU2l6ZUNoYW5nZWQuZW1pdChldmVudC5yb3dzKVxuICAgIHRoaXMuZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZCh7XG4gICAgICBhY3RpdmVQYWdlOiBwYWdlLFxuICAgICAgcGFnZVNpemU6IGV2ZW50LnJvd3MsXG4gICAgfSlcbiAgfVxuXG4gIHJlc2V0UGFnZSgpIHtcbiAgICB0aGlzLnBhZ2UgPSAwXG4gICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KHRoaXMucGFnZSlcbiAgICB0aGlzLmVtaXRDb21wb25lbnRTdGF0ZUNoYW5nZWQoKVxuICB9XG5cbiAgZmllbGRJc1RydXRoeShvYmplY3Q6IGFueSwga2V5OiBhbnkpIHtcbiAgICByZXR1cm4gISFPYmplY3RVdGlscy5yZXNvbHZlRmllbGREYXRhKG9iamVjdCwga2V5KVxuICB9XG5cbiAgdG9nZ2xlT3ZlcmZsb3dNZW51KGV2ZW50OiBNb3VzZUV2ZW50LCBtZW51OiBNZW51LCByb3c6IFJvdykge1xuICAgIHRoaXMuY3VycmVudE1lbnVSb3ckLm5leHQocm93KVxuICAgIG1lbnUudG9nZ2xlKGV2ZW50KVxuICB9XG5cbiAgaGFzVmlzaWJsZU92ZXJmbG93TWVudUl0ZW1zKHJvdzogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMub3ZlcmZsb3dBY3Rpb25zJC5waXBlKFxuICAgICAgbWFwKChhY3Rpb25zKSA9PlxuICAgICAgICBhY3Rpb25zLnNvbWUoXG4gICAgICAgICAgKGEpID0+XG4gICAgICAgICAgICAhYS5hY3Rpb25WaXNpYmxlRmllbGQgfHxcbiAgICAgICAgICAgICh0aGlzLmZpZWxkSXNUcnV0aHkocm93LCBhLmFjdGlvblZpc2libGVGaWVsZCkgJiYgdGhpcy51c2VyU2VydmljZS5oYXNQZXJtaXNzaW9uKGEucGVybWlzc2lvbikpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIH1cblxuICBpc0RhdGUodmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBjb25zdCBkID0gbmV3IERhdGUodmFsdWUpXG4gICAgcmV0dXJuIGlzVmFsaWREYXRlKGQpXG4gIH1cblxuICBjZWxsVGVtcGxhdGVzRGF0YTogVGVtcGxhdGVzRGF0YSA9IHtcbiAgICB0ZW1wbGF0ZXNPYnNlcnZhYmxlczoge30sXG4gICAgaWRTdWZmaXg6IFsnSWRUYWJsZUNlbGwnLCAnSWRDZWxsJ10sXG4gICAgdGVtcGxhdGVOYW1lczoge1xuICAgICAgW0NvbHVtblR5cGUuREFURV06IFsnZGF0ZUNlbGwnLCAnZGF0ZVRhYmxlQ2VsbCcsICdkZWZhdWx0RGF0ZUNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLk5VTUJFUl06IFsnbnVtYmVyQ2VsbCcsICdudW1iZXJUYWJsZUNlbGwnLCAnZGVmYXVsdE51bWJlckNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLlJFTEFUSVZFX0RBVEVdOiBbJ3JlbGF0aXZlRGF0ZUNlbGwnLCAncmVsYXRpdmVEYXRlVGFibGVDZWxsJywgJ2RlZmF1bHRSZWxhdGl2ZURhdGVDZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5UUkFOU0xBVElPTl9LRVldOiBbJ3RyYW5zbGF0aW9uS2V5Q2VsbCcsICd0cmFuc2xhdGlvbktleVRhYmxlQ2VsbCcsICdkZWZhdWx0VHJhbnNsYXRpb25LZXlDZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5DVVNUT01dOiBbJ2N1c3RvbUNlbGwnLCAnY3VzdG9tVGFibGVDZWxsJywgJ2RlZmF1bHRDdXN0b21DZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5TVFJJTkddOiBbJ3N0cmluZ0NlbGwnLCAnc3RyaW5nVGFibGVDZWxsJywgJ2RlZmF1bHRTdHJpbmdDZWxsJ10sXG4gICAgfSxcbiAgfVxuXG4gIGZpbHRlclRlbXBsYXRlc0RhdGE6IFRlbXBsYXRlc0RhdGEgPSB7XG4gICAgdGVtcGxhdGVzT2JzZXJ2YWJsZXM6IHt9LFxuICAgIGlkU3VmZml4OiBbJ0lkVGFibGVGaWx0ZXJDZWxsJywgJ0lkRmlsdGVyQ2VsbCddLFxuICAgIHRlbXBsYXRlTmFtZXM6IHtcbiAgICAgIFtDb2x1bW5UeXBlLkRBVEVdOiBbJ2RhdGVGaWx0ZXJDZWxsJywgJ2RhdGVUYWJsZUZpbHRlckNlbGwnLCAnZGVmYXVsdERhdGVDZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5OVU1CRVJdOiBbJ251bWJlckZpbHRlckNlbGwnLCAnbnVtYmVyVGFibGVGaWx0ZXJDZWxsJywgJ2RlZmF1bHROdW1iZXJDZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5SRUxBVElWRV9EQVRFXTogWydyZWxhdGl2ZURhdGVGaWx0ZXJDZWxsJywgJ3JlbGF0aXZlRGF0ZVRhYmxlRmlsdGVyQ2VsbCcsICdkZWZhdWx0UmVsYXRpdmVEYXRlQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuVFJBTlNMQVRJT05fS0VZXTogW1xuICAgICAgICAndHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsJyxcbiAgICAgICAgJ3RyYW5zbGF0aW9uS2V5VGFibGVGaWx0ZXJDZWxsJyxcbiAgICAgICAgJ2RlZmF1bHRUcmFuc2xhdGlvbktleUNlbGwnLFxuICAgICAgXSxcbiAgICAgIFtDb2x1bW5UeXBlLkNVU1RPTV06IFsnY3VzdG9tRmlsdGVyQ2VsbCcsICdjdXN0b21UYWJsZUZpbHRlckNlbGwnLCAnZGVmYXVsdEN1c3RvbUNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLlNUUklOR106IFsnc3RyaW5nRmlsdGVyQ2VsbCcsICdzdHJpbmdUYWJsZUZpbHRlckNlbGwnLCAnZGVmYXVsdFN0cmluZ0NlbGwnXSxcbiAgICB9LFxuICB9XG5cbiAgdGVtcGxhdGVzRGF0YU1hcDogUmVjb3JkPFRlbXBsYXRlVHlwZSwgVGVtcGxhdGVzRGF0YT4gPSB7XG4gICAgW1RlbXBsYXRlVHlwZS5DRUxMXTogdGhpcy5jZWxsVGVtcGxhdGVzRGF0YSxcbiAgICBbVGVtcGxhdGVUeXBlLkZJTFRFUkNFTExdOiB0aGlzLmZpbHRlclRlbXBsYXRlc0RhdGEsXG4gIH1cblxuICBmaW5kVGVtcGxhdGUodGVtcGxhdGVzOiBQcmltZVRlbXBsYXRlW10sIG5hbWVzOiBzdHJpbmdbXSk6IFByaW1lVGVtcGxhdGUgfCB1bmRlZmluZWQge1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBuYW1lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBuYW1lc1tpbmRleF1cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGVtcGxhdGVzLmZpbmQoKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZS5uYW1lID09PSBuYW1lKVxuICAgICAgaWYgKHRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBnZXRDb2x1bW5UeXBlVGVtcGxhdGUodGVtcGxhdGVzOiBQcmltZVRlbXBsYXRlW10sIGNvbHVtblR5cGU6IENvbHVtblR5cGUsIHRlbXBsYXRlVHlwZTogVGVtcGxhdGVUeXBlKSB7XG4gICAgbGV0IHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG5cbiAgICBzd2l0Y2ggKHRlbXBsYXRlVHlwZSkge1xuICAgICAgY2FzZSBUZW1wbGF0ZVR5cGUuQ0VMTDpcbiAgICAgICAgc3dpdGNoIChjb2x1bW5UeXBlKSB7XG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLkRBVEU6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX2RhdGVDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5OVU1CRVI6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX251bWJlckNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLlJFTEFUSVZFX0RBVEU6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX3JlbGF0aXZlRGF0ZUNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLlRSQU5TTEFUSU9OX0tFWTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fdHJhbnNsYXRpb25LZXlDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5DVVNUT006XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX2N1c3RvbUNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fc3RyaW5nQ2VsbFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFRlbXBsYXRlVHlwZS5GSUxURVJDRUxMOlxuICAgICAgICBzd2l0Y2ggKGNvbHVtblR5cGUpIHtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuREFURTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fZGF0ZUZpbHRlckNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLk5VTUJFUjpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fbnVtYmVyRmlsdGVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuUkVMQVRJVkVfREFURTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fcmVsYXRpdmVEYXRlRmlsdGVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuVFJBTlNMQVRJT05fS0VZOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl90cmFuc2xhdGlvbktleUZpbHRlckNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLkNVU1RPTTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fY3VzdG9tRmlsdGVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9zdHJpbmdGaWx0ZXJDZWxsXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgdGVtcGxhdGUgPz9cbiAgICAgIHRoaXMuZmluZFRlbXBsYXRlKHRlbXBsYXRlcywgdGhpcy50ZW1wbGF0ZXNEYXRhTWFwW3RlbXBsYXRlVHlwZV0udGVtcGxhdGVOYW1lc1tjb2x1bW5UeXBlXSk/LnRlbXBsYXRlID8/XG4gICAgICBudWxsXG4gICAgKVxuICB9XG5cbiAgZ2V0VGVtcGxhdGUoY29sdW1uOiBEYXRhVGFibGVDb2x1bW4sIHRlbXBsYXRlVHlwZTogVGVtcGxhdGVUeXBlKTogT2JzZXJ2YWJsZTxUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHRlbXBsYXRlc0RhdGEgPSB0aGlzLnRlbXBsYXRlc0RhdGFNYXBbdGVtcGxhdGVUeXBlXVxuXG4gICAgaWYgKCF0ZW1wbGF0ZXNEYXRhLnRlbXBsYXRlc09ic2VydmFibGVzW2NvbHVtbi5pZF0pIHtcbiAgICAgIHRlbXBsYXRlc0RhdGEudGVtcGxhdGVzT2JzZXJ2YWJsZXNbY29sdW1uLmlkXSA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICB0aGlzLnRlbXBsYXRlcyQsXG4gICAgICAgIHRoaXMudmlld1RlbXBsYXRlcyQsXG4gICAgICAgIHRoaXMucGFyZW50VGVtcGxhdGVzJCxcbiAgICAgIF0pLnBpcGUoXG4gICAgICAgIG1hcCgoW3QsIHZ0LCBwdF0pID0+IHtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBbLi4uKHQgPz8gW10pLCAuLi4odnQgPz8gW10pLCAuLi4ocHQgPz8gW10pXVxuICAgICAgICAgIGNvbnN0IGNvbHVtblRlbXBsYXRlID0gdGhpcy5maW5kVGVtcGxhdGUoXG4gICAgICAgICAgICB0ZW1wbGF0ZXMsXG4gICAgICAgICAgICB0ZW1wbGF0ZXNEYXRhLmlkU3VmZml4Lm1hcCgoc3VmZml4KSA9PiBjb2x1bW4uaWQgKyBzdWZmaXgpXG4gICAgICAgICAgKT8udGVtcGxhdGVcbiAgICAgICAgICBpZiAoY29sdW1uVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2x1bW5UZW1wbGF0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDb2x1bW5UeXBlVGVtcGxhdGUodGVtcGxhdGVzLCBjb2x1bW4uY29sdW1uVHlwZSwgdGVtcGxhdGVUeXBlKVxuICAgICAgICB9KSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDUwKVxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGVzRGF0YS50ZW1wbGF0ZXNPYnNlcnZhYmxlc1tjb2x1bW4uaWRdXG4gIH1cblxuICByZXNvbHZlRmllbGREYXRhKG9iamVjdDogYW55LCBrZXk6IGFueSkge1xuICAgIHJldHVybiBPYmplY3RVdGlscy5yZXNvbHZlRmllbGREYXRhKG9iamVjdCwga2V5KVxuICB9XG5cbiAgZ2V0Um93T2JqZWN0RnJvbU11bHRpc2VsZWN0SXRlbSh2YWx1ZTogTXVsdGlTZWxlY3RJdGVtLCBjb2x1bW46IERhdGFUYWJsZUNvbHVtbikge1xuICAgIHJldHVybiB7XG4gICAgICBbY29sdW1uLmlkXTogdmFsdWUubGFiZWwsXG4gICAgfVxuICB9XG59XG4iLCI8bmctdGVtcGxhdGUgI2FjdGlvbkNvbHVtbiBsZXQtcm93T2JqZWN0PVwibG9jYWxSb3dPYmplY3RcIj5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0lmPVwiYW55Um93QWN0aW9uT2JzZXJ2ZWQgfHwgdGhpcy5hZGRpdGlvbmFsQWN0aW9ucy5sZW5ndGggPiAwIHx8ICgodGhpcy5vdmVyZmxvd0FjdGlvbnMkIHwgYXN5bmMpID8/IFtdKS5sZW5ndGggPiAwXCJcbiAgPlxuICAgIDx0ZFxuICAgICAgY2xhc3M9XCJhY3Rpb25zXCJcbiAgICAgIHBGcm96ZW5Db2x1bW5cbiAgICAgIFtmcm96ZW5dPVwiZnJvemVuQWN0aW9uQ29sdW1uXCJcbiAgICAgIFthbGlnbkZyb3plbl09XCJhY3Rpb25Db2x1bW5Qb3NpdGlvblwiXG4gICAgICBbYXR0ci5uYW1lXT1cImFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAnbGVmdCcgPyAnYWN0aW9uLWNvbHVtbi1sZWZ0JyA6ICdhY3Rpb24tY29sdW1uLXJpZ2h0J1wiXG4gICAgICBbbmdDbGFzc109XCIoZnJvemVuQWN0aW9uQ29sdW1uICYmIGFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAnbGVmdCcpID8gJ2JvcmRlci1yaWdodC0xJyA6IChmcm96ZW5BY3Rpb25Db2x1bW4gJiYgYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdyaWdodCcpID8gJ2JvcmRlci1sZWZ0LTEnIDogJydcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWJ1dHRvbi1yb3ctd3JhcHBlclwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJ2aWV3VGFibGVSb3dPYnNlcnZlZCAmJiAoIXZpZXdBY3Rpb25WaXNpYmxlRmllbGQgfHwgZmllbGRJc1RydXRoeShyb3dPYmplY3QsIHZpZXdBY3Rpb25WaXNpYmxlRmllbGQpKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqb2N4SWZQZXJtaXNzaW9uPVwidmlld1Blcm1pc3Npb25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhdmlld0FjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShyb3dPYmplY3QsIHZpZXdBY3Rpb25FbmFibGVkRmllbGQpXCJcbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHZpZXdUYWJsZVJvd0J1dHRvblwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLlZJRVcnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09DWF9EQVRBX1RBQkxFLkFDVElPTlMuVklFVycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgaWNvbj1cInBpIHBpLWV5ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25WaWV3Um93KHJvd09iamVjdClcIlxuICAgICAgICAgICAgW2F0dHIubmFtZV09XCInZGF0YS10YWJsZS1hY3Rpb24tYnV0dG9uJ1wiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwiZWRpdFRhYmxlUm93T2JzZXJ2ZWQgJiYgKCFlZGl0QWN0aW9uVmlzaWJsZUZpZWxkIHx8IGZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBlZGl0QWN0aW9uVmlzaWJsZUZpZWxkKSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm9jeElmUGVybWlzc2lvbj1cImVkaXRQZXJtaXNzaW9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIWVkaXRBY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBlZGl0QWN0aW9uRW5hYmxlZEZpZWxkKVwiXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBlZGl0VGFibGVSb3dCdXR0b25cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnT0NYX0RBVEFfVEFCTEUuQUNUSU9OUy5FRElUJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLkVESVQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS1wZW5jaWxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdFJvdyhyb3dPYmplY3QpXCJcbiAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiJ2RhdGEtdGFibGUtYWN0aW9uLWJ1dHRvbidcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cImRlbGV0ZVRhYmxlUm93T2JzZXJ2ZWQgJiYgKCFkZWxldGVBY3Rpb25WaXNpYmxlRmllbGQgfHwgZmllbGRJc1RydXRoeShyb3dPYmplY3QsIGRlbGV0ZUFjdGlvblZpc2libGVGaWVsZCkpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJkZWxldGVQZXJtaXNzaW9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIWRlbGV0ZUFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShyb3dPYmplY3QsIGRlbGV0ZUFjdGlvbkVuYWJsZWRGaWVsZClcIlxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyIGRlbGV0ZVRhYmxlUm93QnV0dG9uXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ09DWF9EQVRBX1RBQkxFLkFDVElPTlMuREVMRVRFJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLkRFTEVURScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRyYXNoXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZVJvdyhyb3dPYmplY3QpXCJcbiAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiJ2RhdGEtdGFibGUtYWN0aW9uLWJ1dHRvbidcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBpbmxpbmVBY3Rpb25zJCB8IGFzeW5jXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIighYWN0aW9uLmFjdGlvblZpc2libGVGaWVsZCB8fCBmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgYWN0aW9uLmFjdGlvblZpc2libGVGaWVsZCkpXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJhY3Rpb24ucGVybWlzc2lvblwiXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJhY3Rpb24uY2xhc3Nlc1wiXG4gICAgICAgICAgICAgIFtpY29uXT1cImFjdGlvbi5pY29uIHx8ICcnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbi5jYWxsYmFjayhyb3dPYmplY3QpXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cImFjdGlvbi5sYWJlbEtleSA/IChhY3Rpb24ubGFiZWxLZXkgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFjdGlvbi5sYWJlbEtleSA/IChhY3Rpb24ubGFiZWxLZXkgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWN0aW9uLmRpc2FibGVkIHx8ICghIWFjdGlvbi5hY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBhY3Rpb24uYWN0aW9uRW5hYmxlZEZpZWxkKSlcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1Zpc2libGVPdmVyZmxvd01lbnVJdGVtcyhyb3dPYmplY3QpIHwgYXN5bmNcIj5cbiAgICAgICAgICA8cC1tZW51ICNtZW51IFttb2RlbF09XCIob3ZlcmZsb3dNZW51SXRlbXMkIHwgYXN5bmMpIHx8IFtdXCIgW3BvcHVwXT1cInRydWVcIiBhcHBlbmRUbz1cImJvZHlcIj48L3AtbWVudT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiXG4gICAgICAgICAgICBbaWNvbl09XCIncGkgcGktZWxsaXBzaXMtdidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU92ZXJmbG93TWVudSgkZXZlbnQsIG1lbnUsIHJvd09iamVjdClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInT0NYX0RBVEFfVEFCTEUuTU9SRV9BQ1RJT05TJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ09DWF9EQVRBX1RBQkxFLk1PUkVfQUNUSU9OUycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RkPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYWN0aW9uQ29sdW1uSGVhZGVyPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJhbnlSb3dBY3Rpb25PYnNlcnZlZCB8fCB0aGlzLmFkZGl0aW9uYWxBY3Rpb25zLmxlbmd0aCA+IDAgIHx8ICgodGhpcy5vdmVyZmxvd0FjdGlvbnMkIHwgYXN5bmMpID8/IFtdKS5sZW5ndGggPiAwXCJcbiAgPlxuICAgIDx0aFxuICAgICAgcEZyb3plbkNvbHVtblxuICAgICAgW2Zyb3plbl09XCJmcm96ZW5BY3Rpb25Db2x1bW5cIlxuICAgICAgW2FsaWduRnJvemVuXT1cImFjdGlvbkNvbHVtblBvc2l0aW9uXCJcbiAgICAgIFtuZ0NsYXNzXT1cIihmcm96ZW5BY3Rpb25Db2x1bW4gJiYgYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdsZWZ0JykgPyAnYm9yZGVyLXJpZ2h0LTEnIDogKGZyb3plbkFjdGlvbkNvbHVtbiAmJiBhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ3JpZ2h0JykgPyAnYm9yZGVyLWxlZnQtMScgOiAnJ1wiXG4gICAgICBbYXR0ci5uYW1lXT1cImFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAnbGVmdCcgPyAnYWN0aW9uLWNvbHVtbi1oZWFkZXItbGVmdCcgOiAnYWN0aW9uLWNvbHVtbi1oZWFkZXItcmlnaHQnXCJcbiAgICA+XG4gICAgICB7eyAnT0NYX0RBVEFfVEFCTEUuQUNUSU9OU19DT0xVTU5fTkFNRScgfCB0cmFuc2xhdGUgfX1cbiAgICA8L3RoPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIoZGlzcGxheWVkUGFnZVNpemUkIHwgYXN5bmMpIGFzIGRpc3BsYXllZFBhZ2VTaXplXCI+XG4gIDxwLXRhYmxlXG4gICAgKm5nSWY9XCIoY29sdW1uVGVtcGxhdGVzJCB8IGFzeW5jKSA/PyB7fSBhcyBjb2x1bW5UZW1wbGF0ZXNcIlxuICAgIFt2YWx1ZV09XCIoZGlzcGxheWVkUm93cyQgfCBhc3luYykgPz8gW11cIlxuICAgIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxuICAgIFtwYWdpbmF0b3JdPVwicGFnaW5hdG9yXCJcbiAgICBbZmlyc3RdPVwicGFnZSAqIGRpc3BsYXllZFBhZ2VTaXplXCJcbiAgICAob25QYWdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICBbcm93c109XCJkaXNwbGF5ZWRQYWdlU2l6ZVwiXG4gICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCJcbiAgICBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie3sgKHRvdGFsUmVjb3Jkc09uU2VydmVyID8gY3VycmVudFBhZ2VTaG93aW5nV2l0aFRvdGFsT25TZXJ2ZXJLZXkgOiBjdXJyZW50UGFnZVNob3dpbmdLZXkpIHwgdHJhbnNsYXRlOnBhcmFtcyB9fVwiXG4gICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCIoZGlzcGxheWVkUGFnZVNpemVzJCB8IGFzeW5jKSA/PyBbXVwiXG4gICAgaWQ9XCJkYXRhVGFibGVfe3tuYW1lfX1cIlxuICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgW3NlbGVjdGlvbl09XCIoc2VsZWN0ZWRSb3dzJCB8IGFzeW5jKSA/PyBbXVwiXG4gICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXG4gICAgcGFnaW5hdG9yRHJvcGRvd25BcHBlbmRUbz1cImJvZHlcIlxuICA+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgPHRyPlxuICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNHJlbVwiIHNjb3BlPVwiY29sXCIgKm5nSWY9XCJzZWxlY3Rpb25DaGFuZ2VkT2JzZXJ2ZWRcIj5cbiAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94XG4gICAgICAgICAgICAqbmdJZj1cImFsbG93U2VsZWN0QWxsXCJcbiAgICAgICAgICAgIGFyaWFMYWJlbD1cInt7J09DWF9EQVRBX1RBQkxFLlNFTEVDVF9BTExfQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGV9fVwiXG4gICAgICAgICAgPjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxuICAgICAgICA8L3RoPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdsZWZ0JztcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWN0aW9uQ29sdW1uSGVhZGVyXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiPlxuICAgICAgICAgIDx0aCAqbmdJZj1cImNvbHVtbi5zb3J0YWJsZSB8fCBjb2x1bW4uZmlsdGVyYWJsZTsgZWxzZSBzaW1wbGVIZWFkZXJcIiBzY29wZT1cImNvbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlci13cmFwcGVyXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGlkPVwie3tjb2x1bW4uaWR9fS1oZWFkZXItbmFtZVwiPnt7IGNvbHVtbi5uYW1lS2V5IHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24tYnV0dG9uLWhlYWRlci13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uc29ydGFibGVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwaSBzb3J0QnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5waS1zb3J0LWFsdF09XCIoY29sdW1uPy5pZCA9PT0gc29ydENvbHVtbiAmJiBzb3J0RGlyZWN0aW9uID09PSAnTk9ORScpIHx8IGNvbHVtbj8uaWQgIT09IHNvcnRDb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpLXNvcnQtYW1vdW50LXVwXT1cImNvbHVtbj8uaWQgPT09IHNvcnRDb2x1bW4gJiYgc29ydERpcmVjdGlvbiA9PT0gJ0FTQ0VORElORydcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpLXNvcnQtYW1vdW50LWRvd25dPVwiY29sdW1uPy5pZCA9PT0gc29ydENvbHVtbiAmJiBzb3J0RGlyZWN0aW9uID09PSAnREVTQ0VORElORydcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU29ydENvbHVtbkNsaWNrKGNvbHVtbi5pZClcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihzb3J0SWNvblRpdGxlKGNvbHVtbi5pZCkgfCB0cmFuc2xhdGUpXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKCdPQ1hfREFUQV9UQUJMRS5UT0dHTEVfQlVUVE9OLkFSSUFfTEFCRUwnIHwgdHJhbnNsYXRlOiB7IGNvbHVtbjogKGNvbHVtbi5uYW1lS2V5IHwgdHJhbnNsYXRlKSwgZGlyZWN0aW9uOiAoc29ydERpcmVjdGlvblRvVGl0bGUoY29sdW1uTmV4dFNvcnREaXJlY3Rpb24oY29sdW1uLmlkKSkgfCB0cmFuc2xhdGUpfSlcIlxuICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXJNdWx0aVNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5maWx0ZXJhYmxlXCJcbiAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIihjdXJyZW50RmlsdGVyT3B0aW9ucyQgfCBhc3luYykgfHwgW11cIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiKGN1cnJlbnRTZWxlY3RlZEZpbHRlcnMkIHwgYXN5bmMpIHx8IFtdXCJcbiAgICAgICAgICAgICAgICAgIFtzaG93VG9nZ2xlQWxsXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgZW1wdHlGaWx0ZXJNZXNzYWdlPVwie3sgJ09DWF9EQVRBX1RBQkxFLkVNUFRZX0ZJTFRFUl9NRVNTQUdFJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICBbZGlzcGxheVNlbGVjdGVkTGFiZWxdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgW3Jlc2V0RmlsdGVyT25IaWRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRmlsdGVyQ2hhbmdlKGNvbHVtbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkljb25cIlxuICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgIChvbkZvY3VzKT1cIm9uRmlsdGVyQ2hvc2VuKGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidPQ1hfREFUQV9UQUJMRS5GSUxURVJfVElUTEUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiJ09DWF9EQVRBX1RBQkxFLkNPTFVNTl9GSUxURVJfQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgW2FyaWFGaWx0ZXJMYWJlbF09XCIoJ09DWF9EQVRBX1RBQkxFLkZJTFRFUl9BUklBX0xBQkVMJyB8IHRyYW5zbGF0ZTogeyBjb2x1bW46IGNvbHVtbi5uYW1lS2V5IHwgdHJhbnNsYXRlfSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJzZWxlY3RlZEl0ZW1zXCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwaVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpLWZpbHRlcl09XCIhKChmaWx0ZXJBbW91bnRzJCB8IGFzeW5jKSB8fCB7fSlbY29sdW1uLmlkXVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpLWZpbHRlci1maWxsXT1cIigoZmlsdGVyQW1vdW50cyQgfCBhc3luYykgfHwge30pW2NvbHVtbi5pZF0gPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpdGVtXCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW5UZW1wbGF0ZXNbY29sdW1uLmlkXSBhcyB0ZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgcm93T2JqZWN0OiBnZXRSb3dPYmplY3RGcm9tTXVsdGlzZWxlY3RJdGVtKHZhbHVlLCBjb2x1bW4pLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2ltcGxlSGVhZGVyPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3sgY29sdW1uLm5hbWVLZXkgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdyaWdodCc7XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFjdGlvbkNvbHVtbkhlYWRlclwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1yb3dPYmplY3Q+XG4gICAgICA8dHI+XG4gICAgICAgIDx0ZCAqbmdJZj1cInNlbGVjdGlvbkNoYW5nZWRPYnNlcnZlZFwiPlxuICAgICAgICAgIDxwLWNoZWNrYm94XG4gICAgICAgICAgICAqbmdJZj1cIighIXNlbGVjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShyb3dPYmplY3QsIHNlbGVjdGlvbkVuYWJsZWRGaWVsZCkpICYmIGlzU2VsZWN0ZWQocm93T2JqZWN0KTsgZWxzZSBkZWZhdWx0Q2hlY2tib3hcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjaGVja2VkXCJcbiAgICAgICAgICAgIFtiaW5hcnldPVwidHJ1ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbYXJpYUxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5TRUxFQ1RfQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGU6IHsga2V5OiByb3dPYmplY3QuaWR9XCJcbiAgICAgICAgICA+PC9wLWNoZWNrYm94PlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENoZWNrYm94PlxuICAgICAgICAgICAgPHAtdGFibGVDaGVja2JveFxuICAgICAgICAgICAgICBbdmFsdWVdPVwicm93T2JqZWN0XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhc2VsZWN0aW9uRW5hYmxlZEZpZWxkICYmICFmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgc2VsZWN0aW9uRW5hYmxlZEZpZWxkKVwiXG4gICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiJ09DWF9EQVRBX1RBQkxFLlNFTEVDVF9BUklBX0xBQkVMJyB8IHRyYW5zbGF0ZTogeyBrZXk6IHJvd09iamVjdC5pZH1cIlxuICAgICAgICAgICAgPjwvcC10YWJsZUNoZWNrYm94PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ2xlZnQnO1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhY3Rpb25Db2x1bW47IGNvbnRleHQ6IHtsb2NhbFJvd09iamVjdDogcm93T2JqZWN0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIlxuICAgICAgICAgICAgICBfY2VsbCA/IF9jZWxsOiBjb2x1bW5UZW1wbGF0ZXNbY29sdW1uLmlkXVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgIHJvd09iamVjdDogcm93T2JqZWN0LFxuICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAncmlnaHQnO1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhY3Rpb25Db2x1bW47IGNvbnRleHQ6IHtsb2NhbFJvd09iamVjdDogcm93T2JqZWN0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XG4gICAgICA8dHI+XG4gICAgICAgIDx0ZCBbY29sU3Bhbl09XCJjb2x1bW5zLmxlbmd0aCArICgoYW55Um93QWN0aW9uT2JzZXJ2ZWQgfHwgdGhpcy5hZGRpdGlvbmFsQWN0aW9ucy5sZW5ndGggPiAwKSA/IDEgOiAwKVwiPlxuICAgICAgICAgIHt7IGVtcHR5UmVzdWx0c01lc3NhZ2UgfHwgKFwiT0NYX0RBVEFfVEFCTEUuRU1QVFlfUkVTVUxUXCIgfCB0cmFuc2xhdGUpIH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvcC10YWJsZT5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdFN0cmluZ0NlbGxcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8bmctY29udGFpbmVyPiB7eyByZXNvbHZlRmllbGREYXRhKHJvd09iamVjdCwgY29sdW1uLmlkKX19IDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHROdW1iZXJDZWxsXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCkgfCBudW1iZXIgfX0gPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdEN1c3RvbUNlbGxcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPiA8L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdERhdGVDZWxsXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCkgfCBkYXRlOiBjb2x1bW4uZGF0ZUZvcm1hdCA/PyAnbWVkaXVtJyB9fSA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJkZWZhdWx0UmVsYXRpdmVEYXRlQ2VsbFwiIGxldC1yb3dPYmplY3Q9XCJyb3dPYmplY3RcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxuZy1jb250YWluZXI+XG4gICAge3sgJ09DWF9EQVRBX1RBQkxFLkVESVRFRCcgfCB0cmFuc2xhdGUgfX0ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCkgfCB0aW1lYWdvIH19XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHRUcmFuc2xhdGlvbktleUNlbGxcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8bmctY29udGFpbmVyPiB7eyByZXNvbHZlRmllbGREYXRhKHJvd09iamVjdCwgY29sdW1uLmlkKSB8IHRyYW5zbGF0ZSB9fSA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|