@paperless/angular 2.0.1-beta.99 → 2.2.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.
@@ -1,14 +1,15 @@
1
1
  import { __decorate } from "tslib";
2
- import { ChangeDetectionStrategy, Component, ContentChild, ContentChildren, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, TemplateRef, ViewChildren, ViewChild } from '@angular/core';
2
+ import { ChangeDetectionStrategy, Component, ContentChild, ContentChildren, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, TemplateRef, ViewChildren, ViewChild, } from '@angular/core';
3
3
  import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
4
4
  import { isMobile, tableColumSizesOptions, floatingMenuContainerClass, cn, } from '@paperless/core';
5
- import { BehaviorSubject, distinctUntilChanged, filter, take, } from 'rxjs';
5
+ import { BehaviorSubject, debounceTime, distinctUntilChanged, filter, take, } from 'rxjs';
6
6
  import { TableCustomActionsDirective, TableCustomFilterDirective, TableFilterModalDirective, } from '../../directives';
7
7
  import { TableColumn } from '../table-column/table-column.component';
8
8
  import { TableRowAction, } from '../table-row-action/table-row-action.component';
9
9
  import { defaultSize, defaultSizeOptions } from './constants';
10
10
  import { TableCell } from '../table-cell/table-cell.component';
11
- import { PTableRow } from 'projects/paperless/src/public-api';
11
+ import { PTableRow } from '../../../../stencil/components';
12
+ import { TableCustomRowDirective } from '../../directives/p-table-custom-row.directive';
12
13
  import * as i0 from "@angular/core";
13
14
  import * as i1 from "@angular/common";
14
15
  import * as i2 from "@angular/router";
@@ -200,7 +201,7 @@ let Table = class Table {
200
201
  * Wether to show the shadow or not
201
202
  */
202
203
  this.shadow = true;
203
- this.columns = [];
204
+ this.columns$ = new BehaviorSubject([]);
204
205
  this.parsedItems = [];
205
206
  this.loadingRows = Array.from({
206
207
  length: this.amountOfLoadingRows,
@@ -227,13 +228,6 @@ let Table = class Table {
227
228
  this.footerHidden$ = new BehaviorSubject(false);
228
229
  this.cn = cn;
229
230
  }
230
- set columnDefinitions(v) {
231
- this._columnDefinitions = v;
232
- this._generateColumns();
233
- }
234
- get columnDefinitions() {
235
- return this._columnDefinitions;
236
- }
237
231
  set rowActions(v) {
238
232
  this._rowActions = v;
239
233
  this._setRowSelectionData();
@@ -273,16 +267,19 @@ let Table = class Table {
273
267
  this._setRowSelectionData();
274
268
  }
275
269
  if (changes['enableScroll']?.currentValue) {
276
- this._calculateColumnWidths();
277
270
  this._checkChangesSubscriptions();
278
271
  }
279
272
  }
280
273
  ngAfterViewInit() {
281
- if (!this.enableScroll) {
282
- return;
274
+ if (this.enableScroll) {
275
+ this._checkChangesSubscriptions();
276
+ }
277
+ if (this.columnDefinitions) {
278
+ this.columnDefinitions.changes
279
+ .pipe(untilDestroyed(this), debounceTime(100))
280
+ .subscribe(() => this._generateColumns());
281
+ this._generateColumns();
283
282
  }
284
- this._calculateColumnWidths();
285
- this._checkChangesSubscriptions();
286
283
  }
287
284
  onResize() {
288
285
  this._setRowSelectionData();
@@ -358,9 +355,9 @@ let Table = class Table {
358
355
  this.parsedItems = JSON.parse(items);
359
356
  }
360
357
  _generateColumns() {
361
- let definitionsArray = Array.from(this._columnDefinitions);
358
+ let definitionsArray = Array.from(this.columnDefinitions);
362
359
  definitionsArray = this._parseDefinitions(definitionsArray);
363
- this.columns = definitionsArray;
360
+ this.columns$.next(definitionsArray);
364
361
  }
365
362
  _checkboxDisabled(item, rowIndex) {
366
363
  const selectionContains = this._selectionContains(item, rowIndex);
@@ -676,15 +673,22 @@ let Table = class Table {
676
673
  return definition;
677
674
  }
678
675
  _checkChangesSubscriptions() {
679
- if (this._rowChangesSubscription) {
680
- this._rowChangesSubscription = this.tableRows.changes.pipe(untilDestroyed(this)).subscribe(() => this._calculateColumnWidths());
676
+ if (!this._rowChangesSubscription && this.tableRows) {
677
+ this._rowChangesSubscription = this.tableRows.changes
678
+ .pipe(untilDestroyed(this), debounceTime(100))
679
+ .subscribe(() => this._calculateColumnWidths());
681
680
  }
682
- if (!this._cellChangesSubscription) {
683
- this.tableCells.changes.pipe(untilDestroyed(this)).subscribe(() => this._calculateColumnWidths());
681
+ if (!this._cellChangesSubscription && this.tableCells) {
682
+ this._cellChangesSubscription = this.tableCells.changes
683
+ .pipe(untilDestroyed(this), debounceTime(100))
684
+ .subscribe(() => this._calculateColumnWidths());
684
685
  }
685
686
  }
686
687
  _calculateColumnWidths() {
687
- if (!this.tableCells) {
688
+ if (!this.enableScroll) {
689
+ return;
690
+ }
691
+ if (!this.tableCells || !this.tableRows) {
688
692
  return;
689
693
  }
690
694
  if (this._calculateColumnWidthsTimeout) {
@@ -752,14 +756,14 @@ let Table = class Table {
752
756
  }
753
757
  };
754
758
  Table.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: Table, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
755
- Table.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: Table, selector: "p-table-ngx", inputs: { items: "items", loading: "loading", headerLoading: "headerLoading", footerLoading: "footerLoading", amountOfLoadingRows: "amountOfLoadingRows", enableRowSelection: "enableRowSelection", rowSelectionLimit: "rowSelectionLimit", enableRowClick: "enableRowClick", selectedRows: "selectedRows", selectionKey: "selectionKey", canSelectKey: "canSelectKey", enableFloatingMenu: "enableFloatingMenu", floatingMenuAmountSelectedText: "floatingMenuAmountSelectedText", floatingMenuAmountSelectedTemplate: "floatingMenuAmountSelectedTemplate", enableHeader: "enableHeader", quickFilters: "quickFilters", activeQuickFilterIdentifier: "activeQuickFilterIdentifier", enableSearch: "enableSearch", query: "query", enableFilter: "enableFilter", enableFilterDesktop: "enableFilterDesktop", selectedFiltersAmount: "selectedFiltersAmount", filterButtonTemplate: "filterButtonTemplate", enableAction: "enableAction", actionButtonLoading: "actionButtonLoading", actionButtonIcon: "actionButtonIcon", actionButtonEnabled: "actionButtonEnabled", actionButtonText: "actionButtonText", actionButtonTemplate: "actionButtonTemplate", enableFooter: "enableFooter", enablePaginationSize: "enablePaginationSize", enablePaginationPages: "enablePaginationPages", enableExport: "enableExport", page: "page", total: "total", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", hideOnSinglePage: "hideOnSinglePage", emptyStateType: "emptyStateType", emptyStateIllustration: "emptyStateIllustration", emptyStateHeader: "emptyStateHeader", emptyStateContent: "emptyStateContent", emptyStateAction: "emptyStateAction", emptyStateActionIcon: "emptyStateActionIcon", enableEmptyStateAction: "enableEmptyStateAction", emptyStateFilteredIllustration: "emptyStateFilteredIllustration", emptyStateFilteredHeader: "emptyStateFilteredHeader", emptyStateFilteredContent: "emptyStateFilteredContent", enableScroll: "enableScroll", shadow: "shadow", filterModalHeaderText: "filterModalHeaderText", filterModalSaveText: "filterModalSaveText", filterModalCancelText: "filterModalCancelText", filterModalResetText: "filterModalResetText", filterModalShowReset: "filterModalShowReset", filterModalShowResetMobile: "filterModalShowResetMobile" }, outputs: { selectedRowsChange: "selectedRowsChange", rowClick: "rowClick", rowSelected: "rowSelected", rowDeselected: "rowDeselected", quickFilter: "quickFilter", queryChange: "queryChange", filter: "filter", action: "action", pageChange: "pageChange", pageSizeChange: "pageSizeChange", export: "export", emptyStateActionClick: "emptyStateActionClick", filterModalShow: "filterModalShow", filterModalSave: "filterModalSave", filterModalReset: "filterModalReset" }, host: { listeners: { "window:resize": "onResize($event)", "document:keydown": "keyDown($event)", "document:keyup": "keyUp($event)", "document:visibilitychange": "visibilityChange($event)" }, properties: { "class": "this.className" } }, queries: [{ propertyName: "headerCustomFilterTemplate", first: true, predicate: TableCustomFilterDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "headerCustomActionsTemplate", first: true, predicate: TableCustomActionsDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "filterModalTemplate", first: true, predicate: TableFilterModalDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "columnDefinitions", predicate: TableColumn }, { propertyName: "rowActions", predicate: TableRowAction }], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }, { propertyName: "tableRows", predicate: PTableRow, descendants: true, read: ElementRef }, { propertyName: "tableCells", predicate: TableCell, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<p-table-container>\n\t<p-table-header\n\t\t*ngIf=\"enableHeader\"\n\t\tclass=\"mb-8\"\n\t\t[quickFilters]=\"quickFilters\"\n\t\t[activeQuickFilterIdentifier]=\"activeQuickFilterIdentifier\"\n\t\t(quickFilter)=\"onQuickFilter($event)\"\n\t\t[enableSearch]=\"enableSearch\"\n\t\t[query]=\"query\"\n\t\t(queryChange)=\"onQueryChange($event)\"\n\t\t[enableFilter]=\"enableFilter\"\n\t\t[enableFilterDesktop]=\"enableFilterDesktop\"\n\t\t[selectedFiltersAmount]=\"selectedFiltersAmount\"\n\t\t[filterButtonTemplate]=\"filterButtonTemplate\"\n\t\t(filter)=\"filterModalShow$.next(true)\"\n\t\t[enableAction]=\"enableAction\"\n\t\t[canUseAction]=\"actionButtonEnabled\"\n\t\t[actionButtonTemplate]=\"actionButtonTemplate\"\n\t\t[actionLoading]=\"actionButtonLoading\"\n\t\t[actionText]=\"actionButtonText\"\n\t\t[actionIcon]=\"actionButtonIcon\"\n\t\t(action)=\"action.emit()\"\n\t\t[itemsSelectedAmount]=\"selectedRows.length\"\n\t\t[enableExport]=\"enableExport\"\n\t\t(export)=\"export.emit()\"\n\t\t[loading]=\"headerLoading\"\n\t>\n\t\t<ng-container *ngIf=\"headerCustomFilterTemplate\">\n\t\t\t<ng-container\n\t\t\t\t*ngTemplateOutlet=\"headerCustomFilterTemplate\"\n\t\t\t></ng-container>\n\t\t</ng-container>\n\n\t\t<ng-container *ngIf=\"headerCustomActionsTemplate\">\n\t\t\t<ng-container\n\t\t\t\t*ngTemplateOutlet=\"headerCustomActionsTemplate\"\n\t\t\t></ng-container>\n\t\t</ng-container>\n\t</p-table-header>\n\n\t<div class=\"relative flex-1\" *ngIf=\"enableScroll; else rowsTemplate\">\n\t\t<div class=\"flex flex-col overflow-x-auto\"\n\t\t\t#scrollContainer\n\t\t\t[class]=\"cn(\n\t\t\t\t'before:absolute before:top-0 before:left-0 before:z-[1] before:pointer-events-none',\n\t\t\t\t'before:w-[10%] before:h-full before:transition-opacity',\n\t\t\t\t'before:bg-gradient-to-r before:from-white before:via-white/80 before:to-transparent',\n\n\t\t\t\t'after:absolute after:top-0 after:right-0 after:z-[0] before:pointer-events-none',\n\t\t\t\t'after:w-[10%] after:h-full after:transition-opacity',\n\t\t\t\t'after:bg-gradient-to-l after:from-white after:via-white/80 after:to-transparent',\n\n\t\t\t\t{\n\t\t\t\t\t'before:opacity-0': reachedScrollStart$ | async,\n\t\t\t\t\t'after:opacity-0': reachedScrollEnd$ | async,\n\t\t\t\t\t'before:opacity-100': (reachedScrollStart$ | async) === false,\n\t\t\t\t\t'after:opacity-100': (reachedScrollEnd$ | async) === false,\n\t\t\t\t}\n\t\t\t)\"\n\t\t\t(scroll)=\"onContainerXScroll($event)\"\n\t\t>\n\t\t\t<ng-container *ngTemplateOutlet=\"rowsTemplate\"></ng-container>\n\t\t</div>\n\t</div>\n\n\t<ng-container *ngIf=\"enableFloatingMenu && enableRowSelection\">\n\t\t<p-floating-menu-container\n\t\t\t[usedInTable]=\"true\"\n\t\t\t[class]=\"\n\t\t\t\tfloatingMenuContainerClass({\n\t\t\t\t\thasFooter: enableFooter && (footerHidden$ | async) === false,\n\t\t\t\t\tactive: selectedRows.length > 0,\n\t\t\t\t\tshown: $any(floatingMenuShown$ | async)\n\t\t\t\t})\n\t\t\t\"\n\t\t\t[amount]=\"floatingMenuAmountSelectedText\"\n\t\t\t[enableAmountSelected]=\"!!(rowActionsFloating$ | async)?.length\"\n\t\t\t(close)=\"_selectAllChange(null, false)\"\n\t\t>\n\t\t\t<p-floating-menu-item\n\t\t\t\t*ngFor=\"let action of rowActionsFloating$ | async\"\n\t\t\t\tslot=\"floating-menu-item\"\n\t\t\t\t[disabled]=\"\n\t\t\t\t\t(action['type'] === 'single' && selectedRows.length > 1) ||\n\t\t\t\t\taction['disabled']\n\t\t\t\t\"\n\t\t\t\t[loading]=\"action['loading']\"\n\t\t\t\t[icon]=\"action['icon']\"\n\t\t\t\t[iconRotate]=\"action['iconRotate']\"\n\t\t\t\t[iconFlip]=\"action['iconFlip']\"\n\t\t\t\t(click)=\"_rowActionClick(action)\"\n\t\t\t>\n\t\t\t\t{{ action['label'] }}\n\t\t\t</p-floating-menu-item>\n\t\t</p-floating-menu-container>\n\t</ng-container>\n\n\t<p-table-footer\n\t\t*ngIf=\"enableFooter\"\n\t\t[hideOnSinglePage]=\"hideOnSinglePage\"\n\t\t[enablePaginationSize]=\"enablePaginationSize\"\n\t\t[pageSize]=\"pageSize\"\n\t\t[pageSizeOptions]=\"pageSizeOptions\"\n\t\t(pageSizeChange)=\"onPageSizeChange($event)\"\n\t\t[enablePaginationPages]=\"enablePaginationPages\"\n\t\t[page]=\"page\"\n\t\t[total]=\"total\"\n\t\t(pageChange)=\"onPageChange($event)\"\n\t\t[loading]=\"footerLoading\"\n\t\t(hiddenChange)=\"footerHidden$.next($event.detail)\"\n\t></p-table-footer>\n</p-table-container>\n\n<ng-template #rowsTemplate>\n\t<p-table-row variant=\"header\">\n\t\t<ng-container *ngFor=\"let col of columns; let index = index\">\n\t\t\t<p-table-cell-ngx\n\t\t\t\t[definition]=\"col\"\n\t\t\t\t[value]=\"col.name\"\n\t\t\t\tvariant=\"header\"\n\t\t\t\t[index]=\"index\"\n\t\t\t\t[checkbox]=\"\n\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t: undefined\n\t\t\t\t\"\n\t\t\t></p-table-cell-ngx>\n\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t<p-checkbox\n\t\t\t\t\t(checkedChange)=\"_selectAllChange($event)\"\n\t\t\t\t\t[checked]=\"_selectionContainsAll()\"\n\t\t\t\t\t[indeterminate]=\"_selectionIndeterminate()\"\n\t\t\t\t\t[class.opacity-0]=\"rowSelectionLimit !== undefined\"\n\t\t\t\t\t[disabled]=\"rowSelectionLimit !== undefined\"\n\t\t\t\t></p-checkbox>\n\t\t\t</ng-template>\n\t\t</ng-container>\n\t</p-table-row>\n\n\t<div class=\"flex flex-1 flex-col\">\n\t\t<ng-container *ngIf=\"loading; else contentTemplate\">\n\t\t\t<p-table-row\n\t\t\t\t*ngFor=\"let r of loadingRows; let rowIndex = index\"\n\t\t\t\t[enableHover]=\"enableRowSelection || enableRowClick\"\n\t\t\t>\n\t\t\t\t<ng-container *ngFor=\"let col of columns; let index = index\">\n\t\t\t\t\t<p-table-cell-ngx\n\t\t\t\t\t\t[definition]=\"col\"\n\t\t\t\t\t\tvariant=\"loading\"\n\t\t\t\t\t\t[checkbox]=\"\n\t\t\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t[index]=\"index\"\n\t\t\t\t\t\t[rowIndex]=\"rowIndex\"\n\t\t\t\t\t></p-table-cell-ngx>\n\t\t\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t\t\t<p-loader\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tclass=\"h-6 w-6 rounded\"\n\t\t\t\t\t\t></p-loader>\n\t\t\t\t\t</ng-template>\n\t\t\t\t</ng-container>\n\t\t\t</p-table-row>\n\t\t</ng-container>\n\n\t\t<ng-template #contentTemplate>\n\t\t\t<ng-container *ngIf=\"parsedItems?.length; else emptyStateTemplate\">\n\t\t\t\t<p-table-row\n\t\t\t\t\t*ngFor=\"let item of parsedItems; let rowIndex = index\"\n\t\t\t\t\t[enableHover]=\"enableRowSelection || enableRowClick\"\n\t\t\t\t\t(click)=\"_rowClick($event, rowIndex)\"\n\t\t\t\t>\n\t\t\t\t\t<ng-container\n\t\t\t\t\t\t*ngIf=\"\n\t\t\t\t\t\t\tparseRowActionsRow(\n\t\t\t\t\t\t\t\trowActionsRow$ | async,\n\t\t\t\t\t\t\t\trowIndex\n\t\t\t\t\t\t\t) as rowActionsRow\n\t\t\t\t\t\t\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ng-container *ngFor=\"let col of columns; let index = index\">\n\t\t\t\t\t\t\t<p-table-cell-ngx\n\t\t\t\t\t\t\t\t[definition]=\"col\"\n\t\t\t\t\t\t\t\t[item]=\"item\"\n\t\t\t\t\t\t\t\t[checkbox]=\"\n\t\t\t\t\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t[index]=\"index\"\n\t\t\t\t\t\t\t\t[rowIndex]=\"rowIndex\"\n\t\t\t\t\t\t\t\t[template]=\"col.template\"\n\t\t\t\t\t\t\t></p-table-cell-ngx>\n\n\t\t\t\t\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t\t\t\t\t<p-checkbox\n\t\t\t\t\t\t\t\t\t(checkedChange)=\"_checkboxChange($event.target, rowIndex)\"\n\t\t\t\t\t\t\t\t\t[disabled]=\"_checkboxDisabled(item, rowIndex)\"\n\t\t\t\t\t\t\t\t\t[checked]=\"_selectionContains(item, rowIndex)\"\n\t\t\t\t\t\t\t\t></p-checkbox>\n\t\t\t\t\t\t\t</ng-template>\n\t\t\t\t\t\t</ng-container>\n\n\t\t\t\t\t\t<p-table-row-actions-container\n\t\t\t\t\t\t\t*ngIf=\"!!rowActionsRow?.length && !(isMobile$ | async)\"\n\t\t\t\t\t\t\tslot=\"actions\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ng-container *ngFor=\"let action of rowActionsRow\">\n\t\t\t\t\t\t\t\t<p-tooltip\n\t\t\t\t\t\t\t\t\t*ngIf=\"\n\t\t\t\t\t\t\t\t\t\taction.showFunction\n\t\t\t\t\t\t\t\t\t\t\t? action.showFunction(parsedItems[rowIndex])\n\t\t\t\t\t\t\t\t\t\t\t: true\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t[content]=\"action['label']\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<p-button\n\t\t\t\t\t\t\t\t\t\tdata-is-action\n\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tslot=\"trigger\"\n\t\t\t\t\t\t\t\t\t\t[icon]=\"action['icon']\"\n\t\t\t\t\t\t\t\t\t\t[iconRotate]=\"action['iconRotate']\"\n\t\t\t\t\t\t\t\t\t\ticonFlip=\"action.iconFlip\"\n\t\t\t\t\t\t\t\t\t\ticonOnly=\"true\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t[loading]=\"action['loading']\"\n\t\t\t\t\t\t\t\t\t\t[disabled]=\"action['disabled']\"\n\t\t\t\t\t\t\t\t\t\t[routerLink]=\"\n\t\t\t\t\t\t\t\t\t\t\taction.routerLink\n\t\t\t\t\t\t\t\t\t\t\t\t? (_getActionRouterLink(action.routerLink, rowIndex)\n\t\t\t\t\t\t\t\t\t\t\t\t | async)\n\t\t\t\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\t[queryParams]=\"\n\t\t\t\t\t\t\t\t\t\t\taction.queryParams\n\t\t\t\t\t\t\t\t\t\t\t\t? (_getActionQueryParams(action.queryParams, rowIndex)\n\t\t\t\t\t\t\t\t\t\t\t\t | async)\n\t\t\t\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\t(onClick)=\"_rowActionClick(action, rowIndex)\"\n\t\t\t\t\t\t\t\t\t></p-button>\n\t\t\t\t\t\t\t\t</p-tooltip>\n\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t</p-table-row-actions-container>\n\t\t\t\t\t</ng-container>\n\t\t\t\t</p-table-row>\n\t\t\t</ng-container>\n\t\t</ng-template>\n\t</div>\n</ng-template>\n\n<ng-container *ngIf=\"filterModalTemplate\">\n\t<p-modal\n\t\t[header]=\"filterModalHeaderText\"\n\t\t[show]=\"filterModalShow$ | async\"\n\t\t(closed)=\"filterModalShow$.next(false)\"\n\t>\n\t\t<div\n\t\t\tslot=\"content\"\n\t\t\tclass=\"flex flex-col gap-6\"\n\t\t>\n\t\t\t<ng-container *ngTemplateOutlet=\"filterModalTemplate\"></ng-container>\n\t\t</div>\n\t\t<div\n\t\t\tslot=\"footer\"\n\t\t\tclass=\"flex w-full justify-between gap-4\"\n\t\t>\n\t\t\t<p-button\n\t\t\t\t*ngIf=\"filterModalShowResetMobile\"\n\t\t\t\tclass=\"flex w-full tablet:w-auto desktop-xs:hidden\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t(onClick)=\"onFilterModalReset(true)\"\n\t\t\t>\n\t\t\t\t{{ filterModalResetText }}\n\t\t\t</p-button>\n\t\t\t<p-button\n\t\t\t\t*ngIf=\"filterModalShowReset\"\n\t\t\t\tclass=\"hidden w-full tablet:w-auto desktop-xs:flex\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t(onClick)=\"onFilterModalReset()\"\n\t\t\t>\n\t\t\t\t{{ filterModalResetText }}\n\t\t\t</p-button>\n\t\t\t<p-button\n\t\t\t\tclass=\"ml-auto w-full tablet:w-auto\"\n\t\t\t\ticon=\"checkmark\"\n\t\t\t\t(onClick)=\"onFilterModalSave()\"\n\t\t\t>\n\t\t\t\t{{ filterModalSaveText }}\n\t\t\t</p-button>\n\t\t</div>\n\t</p-modal>\n</ng-container>\n\n<ng-template #emptyStateTemplate>\n\t<p-empty-state\n\t\t*ngIf=\"emptyStateType === 'filtered'; else emptyStateNonFilterTemplate\"\n\t\tclass=\"my-16 self-center\"\n\t\t[illustration]=\"emptyStateFilteredIllustration\"\n\t\t[header]=\"emptyStateFilteredHeader\"\n\t\t[content]=\"emptyStateFilteredContent\"\n\t></p-empty-state>\n</ng-template>\n\n<ng-template #emptyStateNonFilterTemplate>\n\t<p-empty-state\n\t\tclass=\"my-16 self-center\"\n\t\t[illustration]=\"emptyStateIllustration\"\n\t\t[header]=\"emptyStateHeader\"\n\t\t[content]=\"emptyStateContent\"\n\t\t[enableAction]=\"enableEmptyStateAction\"\n\t\t[actionText]=\"emptyStateAction\"\n\t\t[actionIcon]=\"emptyStateActionIcon\"\n\t\t(action)=\"emptyStateClicked()\"\n\t></p-empty-state>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.PButton, selector: "p-button", inputs: ["active", "as", "buttonGroupPosition", "chevron", "chevronPosition", "class", "disabled", "href", "icon", "iconFlip", "iconOnly", "iconPosition", "iconRotate", "inheritText", "label", "loading", "size", "target", "type", "underline", "variant"] }, { kind: "component", type: i3.PCheckbox, selector: "p-checkbox", inputs: ["checked", "disabled", "id", "indeterminate", "name", "required"] }, { kind: "component", type: i3.PEmptyState, selector: "p-empty-state", inputs: ["actionIcon", "actionLoading", "actionText", "actionVariant", "content", "enableAction", "header", "illustration"] }, { kind: "component", type: i3.PFloatingMenuContainer, selector: "p-floating-menu-container", inputs: ["amount", "amountSelectedTemplate", "enableAmountSelected", "enableClose", "usedInTable"] }, { kind: "component", type: i3.PFloatingMenuItem, selector: "p-floating-menu-item", inputs: ["disabled", "hover", "icon", "iconFlip", "iconPosition", "iconRotate", "loading"] }, { kind: "component", type: i3.PLoader, selector: "p-loader", inputs: ["color", "modalDescription", "modalTitle", "show", "variant"] }, { kind: "component", type: i3.PModal, selector: "p-modal", inputs: ["applyBlur", "backdropClickClose", "header", "scrollLock", "show", "showClose", "showMobileFooter", "size"] }, { kind: "component", type: i3.PTableContainer, selector: "p-table-container" }, { kind: "component", type: i3.PTableFooter, selector: "p-table-footer", inputs: ["enablePaginationPages", "enablePaginationSize", "hideOnSinglePage", "loading", "page", "pageSize", "pageSizeOptions", "total"] }, { kind: "component", type: i3.PTableHeader, selector: "p-table-header", inputs: ["actionButtonTemplate", "actionIcon", "actionLoading", "actionText", "activeQuickFilterIdentifier", "canUseAction", "enableAction", "enableExport", "enableFilter", "enableFilterDesktop", "enableSearch", "filterButtonTemplate", "itemsSelectedAmount", "loading", "query", "quickFilters", "selectedFiltersAmount"] }, { kind: "component", type: i3.PTableRow, selector: "p-table-row", inputs: ["enableHover", "variant"] }, { kind: "component", type: i3.PTableRowActionsContainer, selector: "p-table-row-actions-container" }, { kind: "component", type: i3.PTooltip, selector: "p-tooltip", inputs: ["canManuallyClose", "content", "enableUserInput", "offset", "placement", "show", "strategy", "usePortal", "variant"] }, { kind: "component", type: i4.TableCell, selector: "p-table-cell-ngx", inputs: ["variant", "index", "rowIndex", "definition", "item", "value", "checkbox", "template"] }, { kind: "directive", type: i5.TableFooterDirective, selector: "p-table-footer" }, { kind: "directive", type: i6.TableHeaderDirective, selector: "p-table-header" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
759
+ Table.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: Table, selector: "p-table-ngx", inputs: { items: "items", loading: "loading", headerLoading: "headerLoading", footerLoading: "footerLoading", amountOfLoadingRows: "amountOfLoadingRows", enableRowSelection: "enableRowSelection", rowSelectionLimit: "rowSelectionLimit", enableRowClick: "enableRowClick", selectedRows: "selectedRows", selectionKey: "selectionKey", canSelectKey: "canSelectKey", enableFloatingMenu: "enableFloatingMenu", floatingMenuAmountSelectedText: "floatingMenuAmountSelectedText", floatingMenuAmountSelectedTemplate: "floatingMenuAmountSelectedTemplate", enableHeader: "enableHeader", quickFilters: "quickFilters", activeQuickFilterIdentifier: "activeQuickFilterIdentifier", enableSearch: "enableSearch", query: "query", enableFilter: "enableFilter", enableFilterDesktop: "enableFilterDesktop", selectedFiltersAmount: "selectedFiltersAmount", filterButtonTemplate: "filterButtonTemplate", enableAction: "enableAction", actionButtonLoading: "actionButtonLoading", actionButtonIcon: "actionButtonIcon", actionButtonEnabled: "actionButtonEnabled", actionButtonText: "actionButtonText", actionButtonTemplate: "actionButtonTemplate", enableFooter: "enableFooter", enablePaginationSize: "enablePaginationSize", enablePaginationPages: "enablePaginationPages", enableExport: "enableExport", page: "page", total: "total", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", hideOnSinglePage: "hideOnSinglePage", emptyStateType: "emptyStateType", emptyStateIllustration: "emptyStateIllustration", emptyStateHeader: "emptyStateHeader", emptyStateContent: "emptyStateContent", emptyStateAction: "emptyStateAction", emptyStateActionIcon: "emptyStateActionIcon", enableEmptyStateAction: "enableEmptyStateAction", emptyStateFilteredIllustration: "emptyStateFilteredIllustration", emptyStateFilteredHeader: "emptyStateFilteredHeader", emptyStateFilteredContent: "emptyStateFilteredContent", enableScroll: "enableScroll", shadow: "shadow", filterModalHeaderText: "filterModalHeaderText", filterModalSaveText: "filterModalSaveText", filterModalCancelText: "filterModalCancelText", filterModalResetText: "filterModalResetText", filterModalShowReset: "filterModalShowReset", filterModalShowResetMobile: "filterModalShowResetMobile" }, outputs: { selectedRowsChange: "selectedRowsChange", rowClick: "rowClick", rowSelected: "rowSelected", rowDeselected: "rowDeselected", quickFilter: "quickFilter", queryChange: "queryChange", filter: "filter", action: "action", pageChange: "pageChange", pageSizeChange: "pageSizeChange", export: "export", emptyStateActionClick: "emptyStateActionClick", filterModalShow: "filterModalShow", filterModalSave: "filterModalSave", filterModalReset: "filterModalReset" }, host: { listeners: { "window:resize": "onResize($event)", "document:keydown": "keyDown($event)", "document:keyup": "keyUp($event)", "document:visibilitychange": "visibilityChange($event)" }, properties: { "class": "this.className" } }, queries: [{ propertyName: "headerCustomFilterTemplate", first: true, predicate: TableCustomFilterDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "headerCustomActionsTemplate", first: true, predicate: TableCustomActionsDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "filterModalTemplate", first: true, predicate: TableFilterModalDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "columnDefinitions", predicate: TableColumn }, { propertyName: "rowActions", predicate: TableRowAction }, { propertyName: "customRows", predicate: TableCustomRowDirective }], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }, { propertyName: "tableRows", predicate: PTableRow, descendants: true, read: ElementRef }, { propertyName: "tableCells", predicate: TableCell, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<p-table-container>\n\t<p-table-header\n\t\t*ngIf=\"enableHeader\"\n\t\tclass=\"mb-8\"\n\t\t[quickFilters]=\"quickFilters\"\n\t\t[activeQuickFilterIdentifier]=\"activeQuickFilterIdentifier\"\n\t\t(quickFilter)=\"onQuickFilter($event)\"\n\t\t[enableSearch]=\"enableSearch\"\n\t\t[query]=\"query\"\n\t\t(queryChange)=\"onQueryChange($event)\"\n\t\t[enableFilter]=\"enableFilter\"\n\t\t[enableFilterDesktop]=\"enableFilterDesktop\"\n\t\t[selectedFiltersAmount]=\"selectedFiltersAmount\"\n\t\t[filterButtonTemplate]=\"filterButtonTemplate\"\n\t\t(filter)=\"filterModalShow$.next(true)\"\n\t\t[enableAction]=\"enableAction\"\n\t\t[canUseAction]=\"actionButtonEnabled\"\n\t\t[actionButtonTemplate]=\"actionButtonTemplate\"\n\t\t[actionLoading]=\"actionButtonLoading\"\n\t\t[actionText]=\"actionButtonText\"\n\t\t[actionIcon]=\"actionButtonIcon\"\n\t\t(action)=\"action.emit()\"\n\t\t[itemsSelectedAmount]=\"selectedRows.length\"\n\t\t[enableExport]=\"enableExport\"\n\t\t(export)=\"export.emit()\"\n\t\t[loading]=\"headerLoading\"\n\t>\n\t\t<ng-container *ngIf=\"headerCustomFilterTemplate\">\n\t\t\t<ng-container\n\t\t\t\t*ngTemplateOutlet=\"headerCustomFilterTemplate\"\n\t\t\t></ng-container>\n\t\t</ng-container>\n\n\t\t<ng-container *ngIf=\"headerCustomActionsTemplate\">\n\t\t\t<ng-container\n\t\t\t\t*ngTemplateOutlet=\"headerCustomActionsTemplate\"\n\t\t\t></ng-container>\n\t\t</ng-container>\n\t</p-table-header>\n\n\t<div\n\t\tclass=\"relative flex-1\"\n\t\t*ngIf=\"enableScroll; else rowsTemplate\"\n\t>\n\t\t<div\n\t\t\tclass=\"flex flex-col overflow-x-auto\"\n\t\t\t#scrollContainer\n\t\t\t[class]=\"\n\t\t\t\tcn(\n\t\t\t\t\t'before:absolute before:top-0 before:left-0 before:z-[1] before:pointer-events-none',\n\t\t\t\t\t'before:w-[10%] before:h-full before:transition-opacity',\n\t\t\t\t\t'before:bg-gradient-to-r before:from-white before:via-white/80 before:to-transparent',\n\t\t\t\t\t'after:absolute after:top-0 after:right-0 after:z-[0] before:pointer-events-none',\n\t\t\t\t\t'after:w-[10%] after:h-full after:transition-opacity',\n\t\t\t\t\t'after:bg-gradient-to-l after:from-white after:via-white/80 after:to-transparent',\n\t\t\t\t\t{\n\t\t\t\t\t\t'before:opacity-0': reachedScrollStart$ | async,\n\t\t\t\t\t\t'after:opacity-0': reachedScrollEnd$ | async,\n\t\t\t\t\t\t'before:opacity-100': (reachedScrollStart$ | async) === false,\n\t\t\t\t\t\t'after:opacity-100': (reachedScrollEnd$ | async) === false\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\"\n\t\t\t(scroll)=\"onContainerXScroll($event)\"\n\t\t>\n\t\t\t<ng-container *ngTemplateOutlet=\"rowsTemplate\"></ng-container>\n\t\t</div>\n\t</div>\n\n\t<ng-container *ngIf=\"enableFloatingMenu && enableRowSelection\">\n\t\t<p-floating-menu-container\n\t\t\t[usedInTable]=\"true\"\n\t\t\t[class]=\"\n\t\t\t\tfloatingMenuContainerClass({\n\t\t\t\t\thasFooter: enableFooter && (footerHidden$ | async) === false,\n\t\t\t\t\tactive: selectedRows.length > 0,\n\t\t\t\t\tshown: $any(floatingMenuShown$ | async)\n\t\t\t\t})\n\t\t\t\"\n\t\t\t[amount]=\"floatingMenuAmountSelectedText\"\n\t\t\t[enableAmountSelected]=\"!!(rowActionsFloating$ | async)?.length\"\n\t\t\t(close)=\"_selectAllChange(null, false)\"\n\t\t>\n\t\t\t<p-floating-menu-item\n\t\t\t\t*ngFor=\"let action of rowActionsFloating$ | async\"\n\t\t\t\tslot=\"floating-menu-item\"\n\t\t\t\t[disabled]=\"\n\t\t\t\t\t(action['type'] === 'single' && selectedRows.length > 1) ||\n\t\t\t\t\taction['disabled']\n\t\t\t\t\"\n\t\t\t\t[loading]=\"action['loading']\"\n\t\t\t\t[icon]=\"action['icon']\"\n\t\t\t\t[iconRotate]=\"action['iconRotate']\"\n\t\t\t\t[iconFlip]=\"action['iconFlip']\"\n\t\t\t\t(click)=\"_rowActionClick(action)\"\n\t\t\t>\n\t\t\t\t{{ action['label'] }}\n\t\t\t</p-floating-menu-item>\n\t\t</p-floating-menu-container>\n\t</ng-container>\n\n\t<p-table-footer\n\t\t*ngIf=\"enableFooter\"\n\t\t[hideOnSinglePage]=\"hideOnSinglePage\"\n\t\t[enablePaginationSize]=\"enablePaginationSize\"\n\t\t[pageSize]=\"pageSize\"\n\t\t[pageSizeOptions]=\"pageSizeOptions\"\n\t\t(pageSizeChange)=\"onPageSizeChange($event)\"\n\t\t[enablePaginationPages]=\"enablePaginationPages\"\n\t\t[page]=\"page\"\n\t\t[total]=\"total\"\n\t\t(pageChange)=\"onPageChange($event)\"\n\t\t[loading]=\"footerLoading\"\n\t\t(hiddenChange)=\"footerHidden$.next($event.detail)\"\n\t></p-table-footer>\n</p-table-container>\n\n<ng-template #rowsTemplate>\n\t<p-table-row variant=\"header\">\n\t\t<ng-container *ngFor=\"let col of columns$ | async; let index = index\">\n\t\t\t<p-table-cell-ngx\n\t\t\t\t[definition]=\"col\"\n\t\t\t\t[value]=\"col.name\"\n\t\t\t\tvariant=\"header\"\n\t\t\t\t[index]=\"index\"\n\t\t\t\t[checkbox]=\"\n\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t: undefined\n\t\t\t\t\"\n\t\t\t></p-table-cell-ngx>\n\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t<p-checkbox\n\t\t\t\t\t(checkedChange)=\"_selectAllChange($event)\"\n\t\t\t\t\t[checked]=\"_selectionContainsAll()\"\n\t\t\t\t\t[indeterminate]=\"_selectionIndeterminate()\"\n\t\t\t\t\t[class.opacity-0]=\"rowSelectionLimit !== undefined\"\n\t\t\t\t\t[disabled]=\"rowSelectionLimit !== undefined\"\n\t\t\t\t></p-checkbox>\n\t\t\t</ng-template>\n\t\t</ng-container>\n\t</p-table-row>\n\n\t<div class=\"flex flex-1 flex-col\">\n\t\t<ng-container *ngIf=\"loading; else contentTemplate\">\n\t\t\t<p-table-row\n\t\t\t\t*ngFor=\"let r of loadingRows; let rowIndex = index\"\n\t\t\t\t[enableHover]=\"enableRowSelection || enableRowClick\"\n\t\t\t\t[isLast]=\"rowIndex === loadingRows.length - 1\"\n\t\t\t>\n\t\t\t\t<ng-container *ngFor=\"let col of columns$ | async; let index = index\">\n\t\t\t\t\t<p-table-cell-ngx\n\t\t\t\t\t\t[definition]=\"col\"\n\t\t\t\t\t\tvariant=\"loading\"\n\t\t\t\t\t\t[checkbox]=\"\n\t\t\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t[index]=\"index\"\n\t\t\t\t\t\t[rowIndex]=\"rowIndex\"\n\t\t\t\t\t></p-table-cell-ngx>\n\t\t\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t\t\t<p-loader\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tclass=\"h-6 w-6 rounded\"\n\t\t\t\t\t\t></p-loader>\n\t\t\t\t\t</ng-template>\n\t\t\t\t</ng-container>\n\t\t\t</p-table-row>\n\t\t</ng-container>\n\n\t\t<ng-template #contentTemplate>\n\t\t\t<ng-container *ngIf=\"parsedItems?.length; else emptyStateTemplate\">\n\t\t\t\t<p-table-row\n\t\t\t\t\t*ngFor=\"let item of parsedItems; let rowIndex = index\"\n\t\t\t\t\t[enableHover]=\"enableRowSelection || enableRowClick\"\n\t\t\t\t\t[checked]=\"_selectionContains(item, rowIndex)\"\n\t\t\t\t\t[isLast]=\"rowIndex === parsedItems.length - 1\"\n\t\t\t\t\t(click)=\"_rowClick($event, rowIndex)\"\n\t\t\t\t>\n\t\t\t\t\t<ng-container\n\t\t\t\t\t\t*ngIf=\"\n\t\t\t\t\t\t\tparseRowActionsRow(\n\t\t\t\t\t\t\t\trowActionsRow$ | async,\n\t\t\t\t\t\t\t\trowIndex\n\t\t\t\t\t\t\t) as rowActionsRow\n\t\t\t\t\t\t\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t*ngFor=\"let col of columns$ | async; let index = index\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<p-table-cell-ngx\n\t\t\t\t\t\t\t\t[definition]=\"col\"\n\t\t\t\t\t\t\t\t[item]=\"item\"\n\t\t\t\t\t\t\t\t[checkbox]=\"\n\t\t\t\t\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t[index]=\"index\"\n\t\t\t\t\t\t\t\t[rowIndex]=\"rowIndex\"\n\t\t\t\t\t\t\t\t[template]=\"col.template\"\n\t\t\t\t\t\t\t></p-table-cell-ngx>\n\n\t\t\t\t\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t\t\t\t\t<p-checkbox\n\t\t\t\t\t\t\t\t\t(checkedChange)=\"_checkboxChange($event.target, rowIndex)\"\n\t\t\t\t\t\t\t\t\t[disabled]=\"_checkboxDisabled(item, rowIndex)\"\n\t\t\t\t\t\t\t\t\t[checked]=\"_selectionContains(item, rowIndex)\"\n\t\t\t\t\t\t\t\t></p-checkbox>\n\t\t\t\t\t\t\t</ng-template>\n\t\t\t\t\t\t</ng-container>\n\n\t\t\t\t\t\t<p-table-row-actions-container\n\t\t\t\t\t\t\t*ngIf=\"!!rowActionsRow?.length && !(isMobile$ | async)\"\n\t\t\t\t\t\t\tslot=\"actions\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ng-container *ngFor=\"let action of rowActionsRow\">\n\t\t\t\t\t\t\t\t<p-tooltip\n\t\t\t\t\t\t\t\t\t*ngIf=\"\n\t\t\t\t\t\t\t\t\t\taction.showFunction\n\t\t\t\t\t\t\t\t\t\t\t? action.showFunction(parsedItems[rowIndex])\n\t\t\t\t\t\t\t\t\t\t\t: true\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t[content]=\"action['label']\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<p-button\n\t\t\t\t\t\t\t\t\t\tdata-is-action\n\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tslot=\"trigger\"\n\t\t\t\t\t\t\t\t\t\t[icon]=\"action['icon']\"\n\t\t\t\t\t\t\t\t\t\t[iconRotate]=\"action['iconRotate']\"\n\t\t\t\t\t\t\t\t\t\ticonFlip=\"action.iconFlip\"\n\t\t\t\t\t\t\t\t\t\ticonOnly=\"true\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t[loading]=\"action['loading']\"\n\t\t\t\t\t\t\t\t\t\t[disabled]=\"action['disabled']\"\n\t\t\t\t\t\t\t\t\t\t[routerLink]=\"\n\t\t\t\t\t\t\t\t\t\t\taction.routerLink\n\t\t\t\t\t\t\t\t\t\t\t\t? (_getActionRouterLink(action.routerLink, rowIndex)\n\t\t\t\t\t\t\t\t\t\t\t\t | async)\n\t\t\t\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\t[queryParams]=\"\n\t\t\t\t\t\t\t\t\t\t\taction.queryParams\n\t\t\t\t\t\t\t\t\t\t\t\t? (_getActionQueryParams(action.queryParams, rowIndex)\n\t\t\t\t\t\t\t\t\t\t\t\t | async)\n\t\t\t\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\t(onClick)=\"_rowActionClick(action, rowIndex)\"\n\t\t\t\t\t\t\t\t\t></p-button>\n\t\t\t\t\t\t\t\t</p-tooltip>\n\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t</p-table-row-actions-container>\n\t\t\t\t\t</ng-container>\n\t\t\t\t</p-table-row>\n\t\t\t</ng-container>\n\t\t</ng-template>\n\n\t\t<ng-container *ngFor=\"let customRow of customRows\">\n\t\t\t<p-table-row [variant]=\"customRow.variant\">\n\t\t\t\t<ng-container *ngTemplateOutlet=\"customRow.templateRef\"></ng-container>\n\t\t\t</p-table-row>\n\t\t</ng-container>\n\t</div>\n</ng-template>\n\n<ng-container *ngIf=\"filterModalTemplate\">\n\t<p-modal\n\t\t[header]=\"filterModalHeaderText\"\n\t\t[show]=\"filterModalShow$ | async\"\n\t\t(closed)=\"filterModalShow$.next(false)\"\n\t>\n\t\t<div\n\t\t\tslot=\"content\"\n\t\t\tclass=\"flex flex-col gap-6\"\n\t\t>\n\t\t\t<ng-container *ngTemplateOutlet=\"filterModalTemplate\"></ng-container>\n\t\t</div>\n\t\t<div\n\t\t\tslot=\"footer\"\n\t\t\tclass=\"flex w-full justify-between gap-4\"\n\t\t>\n\t\t\t<p-button\n\t\t\t\t*ngIf=\"filterModalShowResetMobile\"\n\t\t\t\tclass=\"flex w-full tablet:w-auto desktop-xs:hidden\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t(onClick)=\"onFilterModalReset(true)\"\n\t\t\t>\n\t\t\t\t{{ filterModalResetText }}\n\t\t\t</p-button>\n\t\t\t<p-button\n\t\t\t\t*ngIf=\"filterModalShowReset\"\n\t\t\t\tclass=\"hidden w-full tablet:w-auto desktop-xs:flex\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t(onClick)=\"onFilterModalReset()\"\n\t\t\t>\n\t\t\t\t{{ filterModalResetText }}\n\t\t\t</p-button>\n\t\t\t<p-button\n\t\t\t\tclass=\"ml-auto w-full tablet:w-auto\"\n\t\t\t\ticon=\"checkmark\"\n\t\t\t\t(onClick)=\"onFilterModalSave()\"\n\t\t\t>\n\t\t\t\t{{ filterModalSaveText }}\n\t\t\t</p-button>\n\t\t</div>\n\t</p-modal>\n</ng-container>\n\n<ng-template #emptyStateTemplate>\n\t<p-empty-state\n\t\t*ngIf=\"emptyStateType === 'filtered'; else emptyStateNonFilterTemplate\"\n\t\tclass=\"my-16 self-center\"\n\t\t[illustration]=\"emptyStateFilteredIllustration\"\n\t\t[header]=\"emptyStateFilteredHeader\"\n\t\t[content]=\"emptyStateFilteredContent\"\n\t\t[enableAction]=\"false\"\n\t></p-empty-state>\n</ng-template>\n\n<ng-template #emptyStateNonFilterTemplate>\n\t<p-empty-state\n\t\tclass=\"my-16 self-center\"\n\t\t[illustration]=\"emptyStateIllustration\"\n\t\t[header]=\"emptyStateHeader\"\n\t\t[content]=\"emptyStateContent\"\n\t\t[enableAction]=\"enableEmptyStateAction\"\n\t\t[actionText]=\"emptyStateAction\"\n\t\t[actionIcon]=\"emptyStateActionIcon\"\n\t\t(action)=\"emptyStateClicked()\"\n\t></p-empty-state>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.PButton, selector: "p-button", inputs: ["active", "as", "buttonGroupPosition", "chevron", "chevronPosition", "class", "disabled", "error", "href", "icon", "iconFlip", "iconOnly", "iconPosition", "iconRotate", "inheritText", "label", "loading", "size", "target", "type", "variant"] }, { kind: "component", type: i3.PCheckbox, selector: "p-checkbox", inputs: ["checked", "disabled", "id", "indeterminate", "name", "required"] }, { kind: "component", type: i3.PEmptyState, selector: "p-empty-state", inputs: ["actionIcon", "actionIconPosition", "actionLoading", "actionText", "actionVariant", "content", "enableAction", "header", "illustration"] }, { kind: "component", type: i3.PFloatingMenuContainer, selector: "p-floating-menu-container", inputs: ["amount", "amountSelectedTemplate", "enableAmountSelected", "enableClose", "usedInTable"] }, { kind: "component", type: i3.PFloatingMenuItem, selector: "p-floating-menu-item", inputs: ["disabled", "hover", "icon", "iconFlip", "iconPosition", "iconRotate", "loading"] }, { kind: "component", type: i3.PLoader, selector: "p-loader", inputs: ["color", "modalDescription", "modalTitle", "show", "variant"] }, { kind: "component", type: i3.PModal, selector: "p-modal", inputs: ["applyBlur", "backdropClickClose", "header", "scrollLock", "show", "showClose", "showMobileFooter", "size"] }, { kind: "component", type: i3.PTableContainer, selector: "p-table-container" }, { kind: "component", type: i3.PTableFooter, selector: "p-table-footer", inputs: ["enablePaginationPages", "enablePaginationSize", "hideOnSinglePage", "loading", "page", "pageSize", "pageSizeOptions", "total"] }, { kind: "component", type: i3.PTableHeader, selector: "p-table-header", inputs: ["actionButtonTemplate", "actionIcon", "actionLoading", "actionText", "activeQuickFilterIdentifier", "canUseAction", "enableAction", "enableExport", "enableFilter", "enableFilterDesktop", "enableSearch", "filterButtonTemplate", "itemsSelectedAmount", "loading", "query", "quickFilters", "selectedFiltersAmount"] }, { kind: "component", type: i3.PTableRow, selector: "p-table-row", inputs: ["checked", "enableHover", "isLast", "variant"] }, { kind: "component", type: i3.PTableRowActionsContainer, selector: "p-table-row-actions-container" }, { kind: "component", type: i3.PTooltip, selector: "p-tooltip", inputs: ["canManuallyClose", "content", "enableUserInput", "offset", "placement", "show", "strategy", "variant"] }, { kind: "component", type: i4.TableCell, selector: "p-table-cell-ngx", inputs: ["variant", "index", "rowIndex", "definition", "item", "value", "checkbox", "template"] }, { kind: "directive", type: i5.TableFooterDirective, selector: "p-table-footer" }, { kind: "directive", type: i6.TableHeaderDirective, selector: "p-table-header" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
756
760
  Table = __decorate([
757
761
  UntilDestroy({ checkProperties: true })
758
762
  ], Table);
759
763
  export { Table };
760
764
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: Table, decorators: [{
761
765
  type: Component,
762
- args: [{ selector: 'p-table-ngx', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-table-container>\n\t<p-table-header\n\t\t*ngIf=\"enableHeader\"\n\t\tclass=\"mb-8\"\n\t\t[quickFilters]=\"quickFilters\"\n\t\t[activeQuickFilterIdentifier]=\"activeQuickFilterIdentifier\"\n\t\t(quickFilter)=\"onQuickFilter($event)\"\n\t\t[enableSearch]=\"enableSearch\"\n\t\t[query]=\"query\"\n\t\t(queryChange)=\"onQueryChange($event)\"\n\t\t[enableFilter]=\"enableFilter\"\n\t\t[enableFilterDesktop]=\"enableFilterDesktop\"\n\t\t[selectedFiltersAmount]=\"selectedFiltersAmount\"\n\t\t[filterButtonTemplate]=\"filterButtonTemplate\"\n\t\t(filter)=\"filterModalShow$.next(true)\"\n\t\t[enableAction]=\"enableAction\"\n\t\t[canUseAction]=\"actionButtonEnabled\"\n\t\t[actionButtonTemplate]=\"actionButtonTemplate\"\n\t\t[actionLoading]=\"actionButtonLoading\"\n\t\t[actionText]=\"actionButtonText\"\n\t\t[actionIcon]=\"actionButtonIcon\"\n\t\t(action)=\"action.emit()\"\n\t\t[itemsSelectedAmount]=\"selectedRows.length\"\n\t\t[enableExport]=\"enableExport\"\n\t\t(export)=\"export.emit()\"\n\t\t[loading]=\"headerLoading\"\n\t>\n\t\t<ng-container *ngIf=\"headerCustomFilterTemplate\">\n\t\t\t<ng-container\n\t\t\t\t*ngTemplateOutlet=\"headerCustomFilterTemplate\"\n\t\t\t></ng-container>\n\t\t</ng-container>\n\n\t\t<ng-container *ngIf=\"headerCustomActionsTemplate\">\n\t\t\t<ng-container\n\t\t\t\t*ngTemplateOutlet=\"headerCustomActionsTemplate\"\n\t\t\t></ng-container>\n\t\t</ng-container>\n\t</p-table-header>\n\n\t<div class=\"relative flex-1\" *ngIf=\"enableScroll; else rowsTemplate\">\n\t\t<div class=\"flex flex-col overflow-x-auto\"\n\t\t\t#scrollContainer\n\t\t\t[class]=\"cn(\n\t\t\t\t'before:absolute before:top-0 before:left-0 before:z-[1] before:pointer-events-none',\n\t\t\t\t'before:w-[10%] before:h-full before:transition-opacity',\n\t\t\t\t'before:bg-gradient-to-r before:from-white before:via-white/80 before:to-transparent',\n\n\t\t\t\t'after:absolute after:top-0 after:right-0 after:z-[0] before:pointer-events-none',\n\t\t\t\t'after:w-[10%] after:h-full after:transition-opacity',\n\t\t\t\t'after:bg-gradient-to-l after:from-white after:via-white/80 after:to-transparent',\n\n\t\t\t\t{\n\t\t\t\t\t'before:opacity-0': reachedScrollStart$ | async,\n\t\t\t\t\t'after:opacity-0': reachedScrollEnd$ | async,\n\t\t\t\t\t'before:opacity-100': (reachedScrollStart$ | async) === false,\n\t\t\t\t\t'after:opacity-100': (reachedScrollEnd$ | async) === false,\n\t\t\t\t}\n\t\t\t)\"\n\t\t\t(scroll)=\"onContainerXScroll($event)\"\n\t\t>\n\t\t\t<ng-container *ngTemplateOutlet=\"rowsTemplate\"></ng-container>\n\t\t</div>\n\t</div>\n\n\t<ng-container *ngIf=\"enableFloatingMenu && enableRowSelection\">\n\t\t<p-floating-menu-container\n\t\t\t[usedInTable]=\"true\"\n\t\t\t[class]=\"\n\t\t\t\tfloatingMenuContainerClass({\n\t\t\t\t\thasFooter: enableFooter && (footerHidden$ | async) === false,\n\t\t\t\t\tactive: selectedRows.length > 0,\n\t\t\t\t\tshown: $any(floatingMenuShown$ | async)\n\t\t\t\t})\n\t\t\t\"\n\t\t\t[amount]=\"floatingMenuAmountSelectedText\"\n\t\t\t[enableAmountSelected]=\"!!(rowActionsFloating$ | async)?.length\"\n\t\t\t(close)=\"_selectAllChange(null, false)\"\n\t\t>\n\t\t\t<p-floating-menu-item\n\t\t\t\t*ngFor=\"let action of rowActionsFloating$ | async\"\n\t\t\t\tslot=\"floating-menu-item\"\n\t\t\t\t[disabled]=\"\n\t\t\t\t\t(action['type'] === 'single' && selectedRows.length > 1) ||\n\t\t\t\t\taction['disabled']\n\t\t\t\t\"\n\t\t\t\t[loading]=\"action['loading']\"\n\t\t\t\t[icon]=\"action['icon']\"\n\t\t\t\t[iconRotate]=\"action['iconRotate']\"\n\t\t\t\t[iconFlip]=\"action['iconFlip']\"\n\t\t\t\t(click)=\"_rowActionClick(action)\"\n\t\t\t>\n\t\t\t\t{{ action['label'] }}\n\t\t\t</p-floating-menu-item>\n\t\t</p-floating-menu-container>\n\t</ng-container>\n\n\t<p-table-footer\n\t\t*ngIf=\"enableFooter\"\n\t\t[hideOnSinglePage]=\"hideOnSinglePage\"\n\t\t[enablePaginationSize]=\"enablePaginationSize\"\n\t\t[pageSize]=\"pageSize\"\n\t\t[pageSizeOptions]=\"pageSizeOptions\"\n\t\t(pageSizeChange)=\"onPageSizeChange($event)\"\n\t\t[enablePaginationPages]=\"enablePaginationPages\"\n\t\t[page]=\"page\"\n\t\t[total]=\"total\"\n\t\t(pageChange)=\"onPageChange($event)\"\n\t\t[loading]=\"footerLoading\"\n\t\t(hiddenChange)=\"footerHidden$.next($event.detail)\"\n\t></p-table-footer>\n</p-table-container>\n\n<ng-template #rowsTemplate>\n\t<p-table-row variant=\"header\">\n\t\t<ng-container *ngFor=\"let col of columns; let index = index\">\n\t\t\t<p-table-cell-ngx\n\t\t\t\t[definition]=\"col\"\n\t\t\t\t[value]=\"col.name\"\n\t\t\t\tvariant=\"header\"\n\t\t\t\t[index]=\"index\"\n\t\t\t\t[checkbox]=\"\n\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t: undefined\n\t\t\t\t\"\n\t\t\t></p-table-cell-ngx>\n\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t<p-checkbox\n\t\t\t\t\t(checkedChange)=\"_selectAllChange($event)\"\n\t\t\t\t\t[checked]=\"_selectionContainsAll()\"\n\t\t\t\t\t[indeterminate]=\"_selectionIndeterminate()\"\n\t\t\t\t\t[class.opacity-0]=\"rowSelectionLimit !== undefined\"\n\t\t\t\t\t[disabled]=\"rowSelectionLimit !== undefined\"\n\t\t\t\t></p-checkbox>\n\t\t\t</ng-template>\n\t\t</ng-container>\n\t</p-table-row>\n\n\t<div class=\"flex flex-1 flex-col\">\n\t\t<ng-container *ngIf=\"loading; else contentTemplate\">\n\t\t\t<p-table-row\n\t\t\t\t*ngFor=\"let r of loadingRows; let rowIndex = index\"\n\t\t\t\t[enableHover]=\"enableRowSelection || enableRowClick\"\n\t\t\t>\n\t\t\t\t<ng-container *ngFor=\"let col of columns; let index = index\">\n\t\t\t\t\t<p-table-cell-ngx\n\t\t\t\t\t\t[definition]=\"col\"\n\t\t\t\t\t\tvariant=\"loading\"\n\t\t\t\t\t\t[checkbox]=\"\n\t\t\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t[index]=\"index\"\n\t\t\t\t\t\t[rowIndex]=\"rowIndex\"\n\t\t\t\t\t></p-table-cell-ngx>\n\t\t\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t\t\t<p-loader\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tclass=\"h-6 w-6 rounded\"\n\t\t\t\t\t\t></p-loader>\n\t\t\t\t\t</ng-template>\n\t\t\t\t</ng-container>\n\t\t\t</p-table-row>\n\t\t</ng-container>\n\n\t\t<ng-template #contentTemplate>\n\t\t\t<ng-container *ngIf=\"parsedItems?.length; else emptyStateTemplate\">\n\t\t\t\t<p-table-row\n\t\t\t\t\t*ngFor=\"let item of parsedItems; let rowIndex = index\"\n\t\t\t\t\t[enableHover]=\"enableRowSelection || enableRowClick\"\n\t\t\t\t\t(click)=\"_rowClick($event, rowIndex)\"\n\t\t\t\t>\n\t\t\t\t\t<ng-container\n\t\t\t\t\t\t*ngIf=\"\n\t\t\t\t\t\t\tparseRowActionsRow(\n\t\t\t\t\t\t\t\trowActionsRow$ | async,\n\t\t\t\t\t\t\t\trowIndex\n\t\t\t\t\t\t\t) as rowActionsRow\n\t\t\t\t\t\t\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ng-container *ngFor=\"let col of columns; let index = index\">\n\t\t\t\t\t\t\t<p-table-cell-ngx\n\t\t\t\t\t\t\t\t[definition]=\"col\"\n\t\t\t\t\t\t\t\t[item]=\"item\"\n\t\t\t\t\t\t\t\t[checkbox]=\"\n\t\t\t\t\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t[index]=\"index\"\n\t\t\t\t\t\t\t\t[rowIndex]=\"rowIndex\"\n\t\t\t\t\t\t\t\t[template]=\"col.template\"\n\t\t\t\t\t\t\t></p-table-cell-ngx>\n\n\t\t\t\t\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t\t\t\t\t<p-checkbox\n\t\t\t\t\t\t\t\t\t(checkedChange)=\"_checkboxChange($event.target, rowIndex)\"\n\t\t\t\t\t\t\t\t\t[disabled]=\"_checkboxDisabled(item, rowIndex)\"\n\t\t\t\t\t\t\t\t\t[checked]=\"_selectionContains(item, rowIndex)\"\n\t\t\t\t\t\t\t\t></p-checkbox>\n\t\t\t\t\t\t\t</ng-template>\n\t\t\t\t\t\t</ng-container>\n\n\t\t\t\t\t\t<p-table-row-actions-container\n\t\t\t\t\t\t\t*ngIf=\"!!rowActionsRow?.length && !(isMobile$ | async)\"\n\t\t\t\t\t\t\tslot=\"actions\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ng-container *ngFor=\"let action of rowActionsRow\">\n\t\t\t\t\t\t\t\t<p-tooltip\n\t\t\t\t\t\t\t\t\t*ngIf=\"\n\t\t\t\t\t\t\t\t\t\taction.showFunction\n\t\t\t\t\t\t\t\t\t\t\t? action.showFunction(parsedItems[rowIndex])\n\t\t\t\t\t\t\t\t\t\t\t: true\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t[content]=\"action['label']\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<p-button\n\t\t\t\t\t\t\t\t\t\tdata-is-action\n\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tslot=\"trigger\"\n\t\t\t\t\t\t\t\t\t\t[icon]=\"action['icon']\"\n\t\t\t\t\t\t\t\t\t\t[iconRotate]=\"action['iconRotate']\"\n\t\t\t\t\t\t\t\t\t\ticonFlip=\"action.iconFlip\"\n\t\t\t\t\t\t\t\t\t\ticonOnly=\"true\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t[loading]=\"action['loading']\"\n\t\t\t\t\t\t\t\t\t\t[disabled]=\"action['disabled']\"\n\t\t\t\t\t\t\t\t\t\t[routerLink]=\"\n\t\t\t\t\t\t\t\t\t\t\taction.routerLink\n\t\t\t\t\t\t\t\t\t\t\t\t? (_getActionRouterLink(action.routerLink, rowIndex)\n\t\t\t\t\t\t\t\t\t\t\t\t | async)\n\t\t\t\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\t[queryParams]=\"\n\t\t\t\t\t\t\t\t\t\t\taction.queryParams\n\t\t\t\t\t\t\t\t\t\t\t\t? (_getActionQueryParams(action.queryParams, rowIndex)\n\t\t\t\t\t\t\t\t\t\t\t\t | async)\n\t\t\t\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\t(onClick)=\"_rowActionClick(action, rowIndex)\"\n\t\t\t\t\t\t\t\t\t></p-button>\n\t\t\t\t\t\t\t\t</p-tooltip>\n\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t</p-table-row-actions-container>\n\t\t\t\t\t</ng-container>\n\t\t\t\t</p-table-row>\n\t\t\t</ng-container>\n\t\t</ng-template>\n\t</div>\n</ng-template>\n\n<ng-container *ngIf=\"filterModalTemplate\">\n\t<p-modal\n\t\t[header]=\"filterModalHeaderText\"\n\t\t[show]=\"filterModalShow$ | async\"\n\t\t(closed)=\"filterModalShow$.next(false)\"\n\t>\n\t\t<div\n\t\t\tslot=\"content\"\n\t\t\tclass=\"flex flex-col gap-6\"\n\t\t>\n\t\t\t<ng-container *ngTemplateOutlet=\"filterModalTemplate\"></ng-container>\n\t\t</div>\n\t\t<div\n\t\t\tslot=\"footer\"\n\t\t\tclass=\"flex w-full justify-between gap-4\"\n\t\t>\n\t\t\t<p-button\n\t\t\t\t*ngIf=\"filterModalShowResetMobile\"\n\t\t\t\tclass=\"flex w-full tablet:w-auto desktop-xs:hidden\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t(onClick)=\"onFilterModalReset(true)\"\n\t\t\t>\n\t\t\t\t{{ filterModalResetText }}\n\t\t\t</p-button>\n\t\t\t<p-button\n\t\t\t\t*ngIf=\"filterModalShowReset\"\n\t\t\t\tclass=\"hidden w-full tablet:w-auto desktop-xs:flex\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t(onClick)=\"onFilterModalReset()\"\n\t\t\t>\n\t\t\t\t{{ filterModalResetText }}\n\t\t\t</p-button>\n\t\t\t<p-button\n\t\t\t\tclass=\"ml-auto w-full tablet:w-auto\"\n\t\t\t\ticon=\"checkmark\"\n\t\t\t\t(onClick)=\"onFilterModalSave()\"\n\t\t\t>\n\t\t\t\t{{ filterModalSaveText }}\n\t\t\t</p-button>\n\t\t</div>\n\t</p-modal>\n</ng-container>\n\n<ng-template #emptyStateTemplate>\n\t<p-empty-state\n\t\t*ngIf=\"emptyStateType === 'filtered'; else emptyStateNonFilterTemplate\"\n\t\tclass=\"my-16 self-center\"\n\t\t[illustration]=\"emptyStateFilteredIllustration\"\n\t\t[header]=\"emptyStateFilteredHeader\"\n\t\t[content]=\"emptyStateFilteredContent\"\n\t></p-empty-state>\n</ng-template>\n\n<ng-template #emptyStateNonFilterTemplate>\n\t<p-empty-state\n\t\tclass=\"my-16 self-center\"\n\t\t[illustration]=\"emptyStateIllustration\"\n\t\t[header]=\"emptyStateHeader\"\n\t\t[content]=\"emptyStateContent\"\n\t\t[enableAction]=\"enableEmptyStateAction\"\n\t\t[actionText]=\"emptyStateAction\"\n\t\t[actionIcon]=\"emptyStateActionIcon\"\n\t\t(action)=\"emptyStateClicked()\"\n\t></p-empty-state>\n</ng-template>\n" }]
766
+ args: [{ selector: 'p-table-ngx', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-table-container>\n\t<p-table-header\n\t\t*ngIf=\"enableHeader\"\n\t\tclass=\"mb-8\"\n\t\t[quickFilters]=\"quickFilters\"\n\t\t[activeQuickFilterIdentifier]=\"activeQuickFilterIdentifier\"\n\t\t(quickFilter)=\"onQuickFilter($event)\"\n\t\t[enableSearch]=\"enableSearch\"\n\t\t[query]=\"query\"\n\t\t(queryChange)=\"onQueryChange($event)\"\n\t\t[enableFilter]=\"enableFilter\"\n\t\t[enableFilterDesktop]=\"enableFilterDesktop\"\n\t\t[selectedFiltersAmount]=\"selectedFiltersAmount\"\n\t\t[filterButtonTemplate]=\"filterButtonTemplate\"\n\t\t(filter)=\"filterModalShow$.next(true)\"\n\t\t[enableAction]=\"enableAction\"\n\t\t[canUseAction]=\"actionButtonEnabled\"\n\t\t[actionButtonTemplate]=\"actionButtonTemplate\"\n\t\t[actionLoading]=\"actionButtonLoading\"\n\t\t[actionText]=\"actionButtonText\"\n\t\t[actionIcon]=\"actionButtonIcon\"\n\t\t(action)=\"action.emit()\"\n\t\t[itemsSelectedAmount]=\"selectedRows.length\"\n\t\t[enableExport]=\"enableExport\"\n\t\t(export)=\"export.emit()\"\n\t\t[loading]=\"headerLoading\"\n\t>\n\t\t<ng-container *ngIf=\"headerCustomFilterTemplate\">\n\t\t\t<ng-container\n\t\t\t\t*ngTemplateOutlet=\"headerCustomFilterTemplate\"\n\t\t\t></ng-container>\n\t\t</ng-container>\n\n\t\t<ng-container *ngIf=\"headerCustomActionsTemplate\">\n\t\t\t<ng-container\n\t\t\t\t*ngTemplateOutlet=\"headerCustomActionsTemplate\"\n\t\t\t></ng-container>\n\t\t</ng-container>\n\t</p-table-header>\n\n\t<div\n\t\tclass=\"relative flex-1\"\n\t\t*ngIf=\"enableScroll; else rowsTemplate\"\n\t>\n\t\t<div\n\t\t\tclass=\"flex flex-col overflow-x-auto\"\n\t\t\t#scrollContainer\n\t\t\t[class]=\"\n\t\t\t\tcn(\n\t\t\t\t\t'before:absolute before:top-0 before:left-0 before:z-[1] before:pointer-events-none',\n\t\t\t\t\t'before:w-[10%] before:h-full before:transition-opacity',\n\t\t\t\t\t'before:bg-gradient-to-r before:from-white before:via-white/80 before:to-transparent',\n\t\t\t\t\t'after:absolute after:top-0 after:right-0 after:z-[0] before:pointer-events-none',\n\t\t\t\t\t'after:w-[10%] after:h-full after:transition-opacity',\n\t\t\t\t\t'after:bg-gradient-to-l after:from-white after:via-white/80 after:to-transparent',\n\t\t\t\t\t{\n\t\t\t\t\t\t'before:opacity-0': reachedScrollStart$ | async,\n\t\t\t\t\t\t'after:opacity-0': reachedScrollEnd$ | async,\n\t\t\t\t\t\t'before:opacity-100': (reachedScrollStart$ | async) === false,\n\t\t\t\t\t\t'after:opacity-100': (reachedScrollEnd$ | async) === false\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\"\n\t\t\t(scroll)=\"onContainerXScroll($event)\"\n\t\t>\n\t\t\t<ng-container *ngTemplateOutlet=\"rowsTemplate\"></ng-container>\n\t\t</div>\n\t</div>\n\n\t<ng-container *ngIf=\"enableFloatingMenu && enableRowSelection\">\n\t\t<p-floating-menu-container\n\t\t\t[usedInTable]=\"true\"\n\t\t\t[class]=\"\n\t\t\t\tfloatingMenuContainerClass({\n\t\t\t\t\thasFooter: enableFooter && (footerHidden$ | async) === false,\n\t\t\t\t\tactive: selectedRows.length > 0,\n\t\t\t\t\tshown: $any(floatingMenuShown$ | async)\n\t\t\t\t})\n\t\t\t\"\n\t\t\t[amount]=\"floatingMenuAmountSelectedText\"\n\t\t\t[enableAmountSelected]=\"!!(rowActionsFloating$ | async)?.length\"\n\t\t\t(close)=\"_selectAllChange(null, false)\"\n\t\t>\n\t\t\t<p-floating-menu-item\n\t\t\t\t*ngFor=\"let action of rowActionsFloating$ | async\"\n\t\t\t\tslot=\"floating-menu-item\"\n\t\t\t\t[disabled]=\"\n\t\t\t\t\t(action['type'] === 'single' && selectedRows.length > 1) ||\n\t\t\t\t\taction['disabled']\n\t\t\t\t\"\n\t\t\t\t[loading]=\"action['loading']\"\n\t\t\t\t[icon]=\"action['icon']\"\n\t\t\t\t[iconRotate]=\"action['iconRotate']\"\n\t\t\t\t[iconFlip]=\"action['iconFlip']\"\n\t\t\t\t(click)=\"_rowActionClick(action)\"\n\t\t\t>\n\t\t\t\t{{ action['label'] }}\n\t\t\t</p-floating-menu-item>\n\t\t</p-floating-menu-container>\n\t</ng-container>\n\n\t<p-table-footer\n\t\t*ngIf=\"enableFooter\"\n\t\t[hideOnSinglePage]=\"hideOnSinglePage\"\n\t\t[enablePaginationSize]=\"enablePaginationSize\"\n\t\t[pageSize]=\"pageSize\"\n\t\t[pageSizeOptions]=\"pageSizeOptions\"\n\t\t(pageSizeChange)=\"onPageSizeChange($event)\"\n\t\t[enablePaginationPages]=\"enablePaginationPages\"\n\t\t[page]=\"page\"\n\t\t[total]=\"total\"\n\t\t(pageChange)=\"onPageChange($event)\"\n\t\t[loading]=\"footerLoading\"\n\t\t(hiddenChange)=\"footerHidden$.next($event.detail)\"\n\t></p-table-footer>\n</p-table-container>\n\n<ng-template #rowsTemplate>\n\t<p-table-row variant=\"header\">\n\t\t<ng-container *ngFor=\"let col of columns$ | async; let index = index\">\n\t\t\t<p-table-cell-ngx\n\t\t\t\t[definition]=\"col\"\n\t\t\t\t[value]=\"col.name\"\n\t\t\t\tvariant=\"header\"\n\t\t\t\t[index]=\"index\"\n\t\t\t\t[checkbox]=\"\n\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t: undefined\n\t\t\t\t\"\n\t\t\t></p-table-cell-ngx>\n\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t<p-checkbox\n\t\t\t\t\t(checkedChange)=\"_selectAllChange($event)\"\n\t\t\t\t\t[checked]=\"_selectionContainsAll()\"\n\t\t\t\t\t[indeterminate]=\"_selectionIndeterminate()\"\n\t\t\t\t\t[class.opacity-0]=\"rowSelectionLimit !== undefined\"\n\t\t\t\t\t[disabled]=\"rowSelectionLimit !== undefined\"\n\t\t\t\t></p-checkbox>\n\t\t\t</ng-template>\n\t\t</ng-container>\n\t</p-table-row>\n\n\t<div class=\"flex flex-1 flex-col\">\n\t\t<ng-container *ngIf=\"loading; else contentTemplate\">\n\t\t\t<p-table-row\n\t\t\t\t*ngFor=\"let r of loadingRows; let rowIndex = index\"\n\t\t\t\t[enableHover]=\"enableRowSelection || enableRowClick\"\n\t\t\t\t[isLast]=\"rowIndex === loadingRows.length - 1\"\n\t\t\t>\n\t\t\t\t<ng-container *ngFor=\"let col of columns$ | async; let index = index\">\n\t\t\t\t\t<p-table-cell-ngx\n\t\t\t\t\t\t[definition]=\"col\"\n\t\t\t\t\t\tvariant=\"loading\"\n\t\t\t\t\t\t[checkbox]=\"\n\t\t\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t[index]=\"index\"\n\t\t\t\t\t\t[rowIndex]=\"rowIndex\"\n\t\t\t\t\t></p-table-cell-ngx>\n\t\t\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t\t\t<p-loader\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tclass=\"h-6 w-6 rounded\"\n\t\t\t\t\t\t></p-loader>\n\t\t\t\t\t</ng-template>\n\t\t\t\t</ng-container>\n\t\t\t</p-table-row>\n\t\t</ng-container>\n\n\t\t<ng-template #contentTemplate>\n\t\t\t<ng-container *ngIf=\"parsedItems?.length; else emptyStateTemplate\">\n\t\t\t\t<p-table-row\n\t\t\t\t\t*ngFor=\"let item of parsedItems; let rowIndex = index\"\n\t\t\t\t\t[enableHover]=\"enableRowSelection || enableRowClick\"\n\t\t\t\t\t[checked]=\"_selectionContains(item, rowIndex)\"\n\t\t\t\t\t[isLast]=\"rowIndex === parsedItems.length - 1\"\n\t\t\t\t\t(click)=\"_rowClick($event, rowIndex)\"\n\t\t\t\t>\n\t\t\t\t\t<ng-container\n\t\t\t\t\t\t*ngIf=\"\n\t\t\t\t\t\t\tparseRowActionsRow(\n\t\t\t\t\t\t\t\trowActionsRow$ | async,\n\t\t\t\t\t\t\t\trowIndex\n\t\t\t\t\t\t\t) as rowActionsRow\n\t\t\t\t\t\t\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t*ngFor=\"let col of columns$ | async; let index = index\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<p-table-cell-ngx\n\t\t\t\t\t\t\t\t[definition]=\"col\"\n\t\t\t\t\t\t\t\t[item]=\"item\"\n\t\t\t\t\t\t\t\t[checkbox]=\"\n\t\t\t\t\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t[index]=\"index\"\n\t\t\t\t\t\t\t\t[rowIndex]=\"rowIndex\"\n\t\t\t\t\t\t\t\t[template]=\"col.template\"\n\t\t\t\t\t\t\t></p-table-cell-ngx>\n\n\t\t\t\t\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t\t\t\t\t<p-checkbox\n\t\t\t\t\t\t\t\t\t(checkedChange)=\"_checkboxChange($event.target, rowIndex)\"\n\t\t\t\t\t\t\t\t\t[disabled]=\"_checkboxDisabled(item, rowIndex)\"\n\t\t\t\t\t\t\t\t\t[checked]=\"_selectionContains(item, rowIndex)\"\n\t\t\t\t\t\t\t\t></p-checkbox>\n\t\t\t\t\t\t\t</ng-template>\n\t\t\t\t\t\t</ng-container>\n\n\t\t\t\t\t\t<p-table-row-actions-container\n\t\t\t\t\t\t\t*ngIf=\"!!rowActionsRow?.length && !(isMobile$ | async)\"\n\t\t\t\t\t\t\tslot=\"actions\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ng-container *ngFor=\"let action of rowActionsRow\">\n\t\t\t\t\t\t\t\t<p-tooltip\n\t\t\t\t\t\t\t\t\t*ngIf=\"\n\t\t\t\t\t\t\t\t\t\taction.showFunction\n\t\t\t\t\t\t\t\t\t\t\t? action.showFunction(parsedItems[rowIndex])\n\t\t\t\t\t\t\t\t\t\t\t: true\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t[content]=\"action['label']\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<p-button\n\t\t\t\t\t\t\t\t\t\tdata-is-action\n\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tslot=\"trigger\"\n\t\t\t\t\t\t\t\t\t\t[icon]=\"action['icon']\"\n\t\t\t\t\t\t\t\t\t\t[iconRotate]=\"action['iconRotate']\"\n\t\t\t\t\t\t\t\t\t\ticonFlip=\"action.iconFlip\"\n\t\t\t\t\t\t\t\t\t\ticonOnly=\"true\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t[loading]=\"action['loading']\"\n\t\t\t\t\t\t\t\t\t\t[disabled]=\"action['disabled']\"\n\t\t\t\t\t\t\t\t\t\t[routerLink]=\"\n\t\t\t\t\t\t\t\t\t\t\taction.routerLink\n\t\t\t\t\t\t\t\t\t\t\t\t? (_getActionRouterLink(action.routerLink, rowIndex)\n\t\t\t\t\t\t\t\t\t\t\t\t | async)\n\t\t\t\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\t[queryParams]=\"\n\t\t\t\t\t\t\t\t\t\t\taction.queryParams\n\t\t\t\t\t\t\t\t\t\t\t\t? (_getActionQueryParams(action.queryParams, rowIndex)\n\t\t\t\t\t\t\t\t\t\t\t\t | async)\n\t\t\t\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\t(onClick)=\"_rowActionClick(action, rowIndex)\"\n\t\t\t\t\t\t\t\t\t></p-button>\n\t\t\t\t\t\t\t\t</p-tooltip>\n\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t</p-table-row-actions-container>\n\t\t\t\t\t</ng-container>\n\t\t\t\t</p-table-row>\n\t\t\t</ng-container>\n\t\t</ng-template>\n\n\t\t<ng-container *ngFor=\"let customRow of customRows\">\n\t\t\t<p-table-row [variant]=\"customRow.variant\">\n\t\t\t\t<ng-container *ngTemplateOutlet=\"customRow.templateRef\"></ng-container>\n\t\t\t</p-table-row>\n\t\t</ng-container>\n\t</div>\n</ng-template>\n\n<ng-container *ngIf=\"filterModalTemplate\">\n\t<p-modal\n\t\t[header]=\"filterModalHeaderText\"\n\t\t[show]=\"filterModalShow$ | async\"\n\t\t(closed)=\"filterModalShow$.next(false)\"\n\t>\n\t\t<div\n\t\t\tslot=\"content\"\n\t\t\tclass=\"flex flex-col gap-6\"\n\t\t>\n\t\t\t<ng-container *ngTemplateOutlet=\"filterModalTemplate\"></ng-container>\n\t\t</div>\n\t\t<div\n\t\t\tslot=\"footer\"\n\t\t\tclass=\"flex w-full justify-between gap-4\"\n\t\t>\n\t\t\t<p-button\n\t\t\t\t*ngIf=\"filterModalShowResetMobile\"\n\t\t\t\tclass=\"flex w-full tablet:w-auto desktop-xs:hidden\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t(onClick)=\"onFilterModalReset(true)\"\n\t\t\t>\n\t\t\t\t{{ filterModalResetText }}\n\t\t\t</p-button>\n\t\t\t<p-button\n\t\t\t\t*ngIf=\"filterModalShowReset\"\n\t\t\t\tclass=\"hidden w-full tablet:w-auto desktop-xs:flex\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t(onClick)=\"onFilterModalReset()\"\n\t\t\t>\n\t\t\t\t{{ filterModalResetText }}\n\t\t\t</p-button>\n\t\t\t<p-button\n\t\t\t\tclass=\"ml-auto w-full tablet:w-auto\"\n\t\t\t\ticon=\"checkmark\"\n\t\t\t\t(onClick)=\"onFilterModalSave()\"\n\t\t\t>\n\t\t\t\t{{ filterModalSaveText }}\n\t\t\t</p-button>\n\t\t</div>\n\t</p-modal>\n</ng-container>\n\n<ng-template #emptyStateTemplate>\n\t<p-empty-state\n\t\t*ngIf=\"emptyStateType === 'filtered'; else emptyStateNonFilterTemplate\"\n\t\tclass=\"my-16 self-center\"\n\t\t[illustration]=\"emptyStateFilteredIllustration\"\n\t\t[header]=\"emptyStateFilteredHeader\"\n\t\t[content]=\"emptyStateFilteredContent\"\n\t\t[enableAction]=\"false\"\n\t></p-empty-state>\n</ng-template>\n\n<ng-template #emptyStateNonFilterTemplate>\n\t<p-empty-state\n\t\tclass=\"my-16 self-center\"\n\t\t[illustration]=\"emptyStateIllustration\"\n\t\t[header]=\"emptyStateHeader\"\n\t\t[content]=\"emptyStateContent\"\n\t\t[enableAction]=\"enableEmptyStateAction\"\n\t\t[actionText]=\"emptyStateAction\"\n\t\t[actionIcon]=\"emptyStateActionIcon\"\n\t\t(action)=\"emptyStateClicked()\"\n\t></p-empty-state>\n</ng-template>\n" }]
763
767
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { className: [{
764
768
  type: HostBinding,
765
769
  args: ['class']
@@ -920,6 +924,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
920
924
  }], rowActions: [{
921
925
  type: ContentChildren,
922
926
  args: [TableRowAction]
927
+ }], customRows: [{
928
+ type: ContentChildren,
929
+ args: [TableCustomRowDirective]
923
930
  }], filterModalHeaderText: [{
924
931
  type: Input
925
932
  }], filterModalSaveText: [{
@@ -951,4 +958,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
951
958
  type: HostListener,
952
959
  args: ['document:visibilitychange', ['$event']]
953
960
  }] } });
954
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGFwZXJsZXNzL3NyYy9saWIvbW9kdWxlcy90YWJsZS9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhcGVybGVzcy9zcmMvbGliL21vZHVsZXMvdGFibGUvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNOLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFHTixXQUFXLEVBQ1IsWUFBWSxFQUNmLFNBQVMsRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JFLE9BQU8sRUFDTixRQUFRLEVBR1Isc0JBQXNCLEVBQ3RCLDBCQUEwQixFQUN2QixFQUFFLEdBQ0wsTUFBTSxpQkFBaUIsQ0FBQztBQU16QixPQUFPLEVBQ04sZUFBZSxFQUNmLG9CQUFvQixFQUNwQixNQUFNLEVBRU4sSUFBSSxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUNOLDJCQUEyQixFQUMzQiwwQkFBMEIsRUFDMUIseUJBQXlCLEdBQ3pCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3JFLE9BQU8sRUFFTixjQUFjLEdBR2QsTUFBTSxnREFBZ0QsQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlELE9BQU8sRUFBRSxTQUFTLEVBQUUs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QUMsMkJBQTJCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q2hhbmdlRGV0ZWN0b3JSZWYsXG5cdENvbXBvbmVudCxcblx0Q29udGVudENoaWxkLFxuXHRDb250ZW50Q2hpbGRyZW4sXG5cdEVsZW1lbnRSZWYsXG5cdEV2ZW50RW1pdHRlcixcblx0SG9zdEJpbmRpbmcsXG5cdEhvc3RMaXN0ZW5lcixcblx0SW5wdXQsXG5cdE9uQ2hhbmdlcyxcblx0T25Jbml0LFxuXHRPdXRwdXQsXG5cdFF1ZXJ5TGlzdCxcblx0U2ltcGxlQ2hhbmdlcyxcblx0VGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkcmVuLFxuXHRWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVW50aWxEZXN0cm95LCB1bnRpbERlc3Ryb3llZCB9IGZyb20gJ0BuZ25lYXQvdW50aWwtZGVzdHJveSc7XG5pbXBvcnQge1xuXHRpc01vYmlsZSxcblx0UXVpY2tGaWx0ZXIsXG5cdFJvd0NsaWNrRXZlbnQsXG5cdHRhYmxlQ29sdW1TaXplc09wdGlvbnMsXG5cdGZsb2F0aW5nTWVudUNvbnRhaW5lckNsYXNzLFxuICAgIGNuLFxufSBmcm9tICdAcGFwZXJsZXNzL2NvcmUnO1xuaW1wb3J0IHtcblx0SWNvblZhcmlhbnQsXG5cdElsbHVzdHJhdGlvblZhcmlhbnQsXG5cdFRhYmxlQ29sdW1uU2l6ZXMsXG59IGZyb20gJ0BwYXBlcmxlc3MvY29yZS9kaXN0L3R5cGVzL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtcblx0QmVoYXZpb3JTdWJqZWN0LFxuXHRkaXN0aW5jdFVudGlsQ2hhbmdlZCxcblx0ZmlsdGVyLFxuXHRTdWJzY3JpcHRpb24sXG5cdHRha2UsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcblx0VGFibGVDdXN0b21BY3Rpb25zRGlyZWN0aXZlLFxuXHRUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZSxcblx0VGFibGVGaWx0ZXJNb2RhbERpcmVjdGl2ZSxcbn0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBUYWJsZUNvbHVtbiB9IGZyb20gJy4uL3RhYmxlLWNvbHVtbi90YWJsZS1jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7XG5cdEFzeW5jSXRlbSxcblx0VGFibGVSb3dBY3Rpb24sXG5cdFRhYmxlUm93QWN0aW9uUXVlcnlQYXJhbXMsXG5cdFRhYmxlUm93QWN0aW9uUm91dGVyTGluayxcbn0gZnJvbSAnLi4vdGFibGUtcm93LWFjdGlvbi90YWJsZS1yb3ctYWN0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBkZWZhdWx0U2l6ZSwgZGVmYXVsdFNpemVPcHRpb25zIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgVGFibGVDZWxsIH0gZnJvbSAnLi4vdGFibGUtY2VsbC90YWJsZS1jZWxsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQVGFibGVSb3cgfSBmcm9tICdwcm9qZWN0cy9wYXBlcmxlc3Mvc3JjL3B1YmxpYy1hcGknO1xuXG5AVW50aWxEZXN0cm95KHsgY2hlY2tQcm9wZXJ0aWVzOiB0cnVlIH0pXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICdwLXRhYmxlLW5neCcsXG5cdHRlbXBsYXRlVXJsOiAndGFibGUuY29tcG9uZW50Lmh0bWwnLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGFibGUgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cdEBIb3N0QmluZGluZygnY2xhc3MnKSBjbGFzc05hbWUgPSAnZmxleCBmbGV4LWNvbCB6LTAnO1xuXG5cdC8qKlxuXHQgKiBUaGUgaXRlbXMgdG8gYmUgZmVkIHRvIHRoZSB0YWJsZVxuXHQgKi9cblx0QElucHV0KCkgaXRlbXMhOiBzdHJpbmcgfCBhbnlbXTtcblxuXHQvKipcblx0ICogV2V0aGVyIGRhdGEgaXMgbG9hZGluZ1xuXHQgKi9cblx0QElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdGhlIGhlYWRlciBzaG91bGQgc2hvdyBsb2FkaW5nIHN0YXRlXG5cdCAqL1xuXHRASW5wdXQoKSBoZWFkZXJMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIFdldGhlciB0aGUgZm9vdGVyIHNob3VsZCBzaG93IGxvYWRpbmcgc3RhdGVcblx0ICovXG5cdEBJbnB1dCgpIGZvb3RlckxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHQvKipcblx0ICogVGhlIGFtb3VudCBvZiBsb2FkaW5nIHJvd3MgdG8gc2hvd1xuXHQgKi9cblx0QElucHV0KCkgYW1vdW50T2ZMb2FkaW5nUm93czogbnVtYmVyID0gNjtcblxuXHQvKipcblx0ICogV2V0aGVyIHRvIGVuYWJsZSBzZWxlY3Rpb25cblx0ICovXG5cdEBJbnB1dCgpIGVuYWJsZVJvd1NlbGVjdGlvbjogYm9vbGVhbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIEEgbGltaXQgdG8gdGhlIGFtb3VudCBvZiByb3dzIHRoYXQgY2FuIGJlIHNlbGVjdGVkXG5cdCAqL1xuXHRASW5wdXQoKSByb3dTZWxlY3Rpb25MaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdG8gZW5hYmxlIHJvdyBjbGlja2luZ1xuXHQgKi9cblx0QElucHV0KCkgZW5hYmxlUm93Q2xpY2s6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdC8qKlxuXHQgKiBUaGUgY3VycmVudCBzZWxlY3Rpb24gb2YgaXRlbXNcblx0ICovXG5cdEBJbnB1dCgpIHNlbGVjdGVkUm93czogYW55W10gPSBbXTtcblxuXHQvKipcblx0ICogRXZlbnQgd2hlbmV2ZXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGNoYW5nZXNcblx0ICovXG5cdEBPdXRwdXQoKSBzZWxlY3RlZFJvd3NDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKlxuXHQgKiBUaGUga2V5IHRvIGRldGVybWluZSBpZiBhIHJvdyBpcyBzZWxlY3RlZFxuXHQgKi9cblx0QElucHV0KCkgc2VsZWN0aW9uS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIEEga2V5IHRvIGRldGVybWluZSBpZiBhIHJvdyBjYW4gYmUgc2VsZWN0ZWRcblx0ICovXG5cdEBJbnB1dCgpIGNhblNlbGVjdEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdG8gZW5hYmxlIHRoZSBmbG9hdGluZyBtZW51XG5cdCAqL1xuXHRASW5wdXQoKSBlbmFibGVGbG9hdGluZ01lbnU6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdC8qKlxuXHQgKiBUaGUgZmxvYXRpbmcgbWVudSBhbW91bnQgaXRlbSB0ZXh0XG5cdCAqL1xuXHRASW5wdXQoKSBmbG9hdGluZ01lbnVBbW91bnRTZWxlY3RlZFRleHQ6IHN0cmluZyA9ICcwIGl0ZW1zIHNlbGVjdGVkJztcblxuXHQvKipcblx0ICogVGhlIHRlbXBsYXRlIGZvciBhbW91bnQgc2VsZWN0ZWQgaXRlbSBpbiB0aGUgZmxvYXRpbmcgbWVudVxuXHQgKi9cblx0QElucHV0KCkgZmxvYXRpbmdNZW51QW1vdW50U2VsZWN0ZWRUZW1wbGF0ZTogYW55O1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdGhlIGZsb2F0aW5nIG1lbnUgaGFzIGJlZW4gc2hvd24gYXRsZWFzdCBvbmNlXG5cdCAqL1xuXHRwdWJsaWMgZmxvYXRpbmdNZW51U2hvd24kID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cblx0LyoqXG5cdCAqIEV2ZW50IHdoZW5ldmVyIGEgcm93IGlzIGNsaWNrZWRcblx0ICovXG5cdEBPdXRwdXQoKSByb3dDbGljazogRXZlbnRFbWl0dGVyPFJvd0NsaWNrRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKlxuXHQgKiBFdmVudCB3aGVuZXZlciBhIHJvdyBpcyBzZWxlY3RlZFxuXHQgKi9cblx0QE91dHB1dCgpIHJvd1NlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKipcblx0ICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgZGVzZWxlY3RlZFxuXHQgKi9cblx0QE91dHB1dCgpIHJvd0Rlc2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBTVEFSVCBIRUFERVIgKi9cblxuXHQvKipcblx0ICogV2V0aGVyIHRvIHNob3cgdGhlIGhlYWRlclxuXHQgKi9cblx0QElucHV0KCkgZW5hYmxlSGVhZGVyOiBib29sZWFuID0gdHJ1ZTtcblxuXHQvKipcblx0ICogUXVpY2sgZmlsdGVycyB0byBzaG93XG5cdCAqL1xuXHRASW5wdXQoKSBxdWlja0ZpbHRlcnM6IFF1aWNrRmlsdGVyW10gPSBbXTtcblxuXHQvKipcblx0ICogQWN0aXZlIHF1aWNrIGZpbHRlciBpZGVudGlmaWVyXG5cdCAqL1xuXHRASW5wdXQoKSBhY3RpdmVRdWlja0ZpbHRlcklkZW50aWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogV2V0aGVyIHRvIHNob3cgdGhlIHNlYXJjaCBpbnB1dFxuXHQgKi9cblx0QElucHV0KCkgZW5hYmxlU2VhcmNoOiBib29sZWFuID0gdHJ1ZTtcblxuXHQvKipcblx0ICogVGhlIHF1ZXJ5IHRvIHNob3cgaW4gdGhlIHNlYXJjaCBiYXJcblx0ICovXG5cdEBJbnB1dCgpIHF1ZXJ5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIFdldGhlciB0byBzaG93IHRoZSBmaWx0ZXIgYnV0dG9uXG5cdCAqL1xuXHRASW5wdXQoKSBlbmFibGVGaWx0ZXI6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdG8gc2hvdyB0aGUgZmlsdGVyIGJ1dHRvbiBvbiBkZXNrdG9wXG5cdCAqL1xuXHRASW5wdXQoKSBlbmFibGVGaWx0ZXJEZXNrdG9wOiBib29sZWFuID0gdHJ1ZTtcblxuXHQvKipcblx0ICogVGhlIGFtb3VudCBvZiBmaWx0ZXJzIGJlaW5nIHNlbGVjdGVkXG5cdCAqL1xuXHRASW5wdXQoKSBzZWxlY3RlZEZpbHRlcnNBbW91bnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogVGhlIHRlbXBsYXRlIGZvciB0aGUgZmlsdGVyIGJ1dHRvbiB0ZXh0XG5cdCAqL1xuXHRASW5wdXQoKSBmaWx0ZXJCdXR0b25UZW1wbGF0ZTogYW55O1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdG8gc2hvdyB0aGUgYWN0aW9uIGJ1dHRvblxuXHQgKi9cblx0QElucHV0KCkgZW5hYmxlQWN0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIFdldGhlciB0aGUgYWN0aW9uIGJ1dHRvbiBpcyBsb2FkaW5nXG5cdCAqL1xuXHRASW5wdXQoKSBhY3Rpb25CdXR0b25Mb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIFRoZSBhY3Rpb24gYnV0dG9uIGljb25cblx0ICovXG5cdEBJbnB1dCgpIGFjdGlvbkJ1dHRvbkljb246IEljb25WYXJpYW50ID0gJ3BlbmNpbCc7XG5cblx0LyoqXG5cdCAqIFdldGhlciB0aGUgYWN0aW9uIGJ1dHRvbiBpcyBlbmFibGVkXG5cdCAqL1xuXHRASW5wdXQoKSBhY3Rpb25CdXR0b25FbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuXHQvKipcblx0ICogVGhlIGFjdGlvbiBidXR0b24gdGV4dCBpZiBjaGFuZ2VkXG5cdCAqL1xuXHRASW5wdXQoKSBhY3Rpb25CdXR0b25UZXh0Pzogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBhY3Rpb24gYnV0dG9uIHRleHRcblx0ICovXG5cdEBJbnB1dCgpIGFjdGlvbkJ1dHRvblRlbXBsYXRlOiBhbnk7XG5cblx0LyoqXG5cdCAqIEV2ZW50IHdoZW4gb25lIG9mIHRoZSBxdWljayBmaWx0ZXJzIGlzIGNsaWNrZWRcblx0ICovXG5cdEBPdXRwdXQoKSBxdWlja0ZpbHRlcjogRXZlbnRFbWl0dGVyPFF1aWNrRmlsdGVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKipcblx0ICogRXZlbnQgd2hlbiB0aGUgcXVlcnkgY2hhbmdlc1xuXHQgKi9cblx0QE91dHB1dCgpIHF1ZXJ5Q2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKipcblx0ICogRXZlbnQgd2hlbiB0aGUgZmlsdGVyIGJ1dHRvbiBpcyBjbGlja2VkXG5cdCAqL1xuXHRAT3V0cHV0KCkgZmlsdGVyOiBFdmVudEVtaXR0ZXI8bnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqXG5cdCAqIEV2ZW50IHdoZW4gdGhlIGFjdGlvbiBidXR0b24gaXMgY2xpY2tlZFxuXHQgKi9cblx0QE91dHB1dCgpIGFjdGlvbjogRXZlbnRFbWl0dGVyPG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBTVEFSVCBGT09URVIgKi9cblxuXHQvKipcblx0ICogV2V0aGVyIHRvIHNob3cgdGhlIGZvb3RlclxuXHQgKi9cblx0QElucHV0KCkgZW5hYmxlRm9vdGVyOiBib29sZWFuID0gdHJ1ZTtcblxuXHQvKipcblx0ICogV2V0aGVyIHRvIGVuYWJsZSBwYWdpbmF0aW9uIHNpemUgc2VsZWN0XG5cdCAqL1xuXHRASW5wdXQoKSBlbmFibGVQYWdpbmF0aW9uU2l6ZTogYm9vbGVhbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIFdldGhlciB0byBlbmFibGUgcGFnaW5hdGlvbiBwYWdlc1xuXHQgKi9cblx0QElucHV0KCkgZW5hYmxlUGFnaW5hdGlvblBhZ2VzOiBib29sZWFuID0gdHJ1ZTtcblxuXHQvKipcblx0ICogV2V0aGVyIHRvIGVuYWJsZSBleHBvcnRcblx0ICovXG5cdEBJbnB1dCgpIGVuYWJsZUV4cG9ydDogYm9vbGVhbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIFRoZSBjdXJyZW50IHBhZ2Vcblx0ICovXG5cdEBJbnB1dCgpIHBhZ2U6IG51bWJlciA9IDE7XG5cblx0LyoqXG5cdCAqIFRoZSB0b3RhbCBhbW91bnQgb2YgaXRlbXNcblx0ICovXG5cdEBJbnB1dCgpIHRvdGFsITogbnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBFdmVudCB3aGVuZXZlciB0aGUgcGFnZSBjaGFuZ2VzXG5cdCAqL1xuXHRAT3V0cHV0KCkgcGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqXG5cdCAqIFRoZSBhbW91bnQgb2YgaXRlbXMgcGVyIHBhZ2Vcblx0ICovXG5cdEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSBkZWZhdWx0U2l6ZTtcblxuXHQvKipcblx0ICogVGhlIG9wdGlvbnMgZm9yIHRoZSBwYWdlIHNpemVcblx0ICovXG5cdEBJbnB1dCgpIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSBkZWZhdWx0U2l6ZU9wdGlvbnM7XG5cblx0LyoqXG5cdCAqIEV2ZW50IHdoZW5ldmVyIHRoZSBwYWdlIGNoYW5nZXNcblx0ICovXG5cdEBPdXRwdXQoKSBwYWdlU2l6ZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqXG5cdCAqIEV2ZW50IHdoZW5ldmVyIHRoZSBwYWdlIGNoYW5nZXNcblx0ICovXG5cdEBPdXRwdXQoKSBleHBvcnQ6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdG8gaGlkZSB3aGVuIHRoZXJlIGlzIG9ubHkgMSBwYWdlIGF2YWlsYWJsZVxuXHQgKi9cblx0QElucHV0KCkgaGlkZU9uU2luZ2xlUGFnZTogYm9vbGVhbiA9IHRydWU7XG5cblx0LyogRW1wdHkgc3RhdGUgc3RhcnQgKi9cblx0QElucHV0KCkgZW1wdHlTdGF0ZVR5cGU6ICdub19maWx0ZXInIHwgJ2ZpbHRlcmVkJyA9ICdub19maWx0ZXInO1xuXG5cdEBJbnB1dCgpIGVtcHR5U3RhdGVJbGx1c3RyYXRpb246IElsbHVzdHJhdGlvblZhcmlhbnQgPSAndGFibGUnO1xuXHRASW5wdXQoKSBlbXB0eVN0YXRlSGVhZGVyITogc3RyaW5nO1xuXHRASW5wdXQoKSBlbXB0eVN0YXRlQ29udGVudCE6IHN0cmluZztcblx0QElucHV0KCkgZW1wdHlTdGF0ZUFjdGlvbiE6IHN0cmluZztcblx0QElucHV0KCkgZW1wdHlTdGF0ZUFjdGlvbkljb246IEljb25WYXJpYW50ID0gJ3BsdXMnO1xuXG5cdEBJbnB1dCgpIGVuYWJsZUVtcHR5U3RhdGVBY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuXG5cdEBJbnB1dCgpIGVtcHR5U3RhdGVGaWx0ZXJlZElsbHVzdHJhdGlvbjogSWxsdXN0cmF0aW9uVmFyaWFudCA9ICdzZWFyY2gnO1xuXHRASW5wdXQoKSBlbXB0eVN0YXRlRmlsdGVyZWRIZWFkZXIhOiBzdHJpbmc7XG5cdEBJbnB1dCgpIGVtcHR5U3RhdGVGaWx0ZXJlZENvbnRlbnQhOiBzdHJpbmc7XG5cblxuXHQvKipcblx0ICogV2V0aGVyIHRvIGVuYWJsZSBzY3JvbGxpbmdcblx0ICovXG5cdEBJbnB1dCgpIGVuYWJsZVNjcm9sbDogYm9vbGVhbiA9IGZhbHNlO1xuXHRAVmlld0NoaWxkcmVuKFBUYWJsZVJvdywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHRhYmxlUm93cyE6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPFBUYWJsZVJvdz4+O1xuXHRAVmlld0NoaWxkcmVuKFRhYmxlQ2VsbCwgeyByZWFkOiBFbGVtZW50UmVmIH0pIHRhYmxlQ2VsbHMhOiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxUYWJsZUNlbGw+Pjtcblx0QFZpZXdDaGlsZCgnc2Nyb2xsQ29udGFpbmVyJykgc2Nyb2xsQ29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cblx0cHVibGljIHJlYWNoZWRTY3JvbGxTdGFydCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuXHRwdWJsaWMgcmVhY2hlZFNjcm9sbEVuZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblx0cHJpdmF0ZSBfdG90YWxXaWR0aCA9IDA7XG5cdHByaXZhdGUgX2NhbGN1bGF0ZUNvbHVtbldpZHRoc1RpbWVvdXQ/OiBudW1iZXI7XG5cblx0cHJpdmF0ZSBfcm93Q2hhbmdlc1N1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblx0cHJpdmF0ZSBfY2VsbENoYW5nZXNTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cblx0LyoqXG5cdCAqIEV2ZW50IHdoZW5ldmVyIHRoZSBlbXB0eSBzdGF0ZSBpcyBjbGlja2VkXG5cdCAqL1xuXHRAT3V0cHV0KCkgZW1wdHlTdGF0ZUFjdGlvbkNsaWNrOiBFdmVudEVtaXR0ZXI8bnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyogRW1wdHkgc3RhdGUgZW5kICovXG5cblx0Lypcblx0ICogV2V0aGVyIHRvIHNob3cgdGhlIHNoYWRvdyBvciBub3Rcblx0ICovXG5cdEBJbnB1dCgpIHNoYWRvdzogYm9vbGVhbiA9IHRydWU7XG5cblx0cHVibGljIGNvbHVtbnM6IGFueVtdID0gW107XG5cdHB1YmxpYyBwYXJzZWRJdGVtczogYW55W10gPSBbXTtcblx0cHVibGljIGxvYWRpbmdSb3dzID0gQXJyYXkuZnJvbSh7XG5cdFx0bGVuZ3RoOiB0aGlzLmFtb3VudE9mTG9hZGluZ1Jvd3MsXG5cdH0pO1xuXHRwcml2YXRlIF9jdHJsRG93biA9IGZhbHNlO1xuXG5cdC8vIEFuZ3VsYXIgc3R1ZmZcblx0Ly8gY3VzdG9tIGZpbHRlciB0ZW1wbGF0ZVxuXHRAQ29udGVudENoaWxkKFRhYmxlQ3VzdG9tRmlsdGVyRGlyZWN0aXZlLCB7XG5cdFx0cmVhZDogVGVtcGxhdGVSZWYsXG5cdFx0c3RhdGljOiB0cnVlLFxuXHR9KVxuXHRwdWJsaWMgaGVhZGVyQ3VzdG9tRmlsdGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ7XG5cblx0Ly8gY3VzdG9tIGFjdGlvbnMgdGVtcGxhdGVcblx0QENvbnRlbnRDaGlsZChUYWJsZUN1c3RvbUFjdGlvbnNEaXJlY3RpdmUsIHtcblx0XHRyZWFkOiBUZW1wbGF0ZVJlZixcblx0XHRzdGF0aWM6IHRydWUsXG5cdH0pXG5cdHB1YmxpYyBoZWFkZXJDdXN0b21BY3Rpb25zVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ7XG5cblx0Ly8gY29sdW1uIHRlbXBsYXRlc1xuXHRwcml2YXRlIF9jb2x1bW5EZWZpbml0aW9ucyE6IFF1ZXJ5TGlzdDxUYWJsZUNvbHVtbj47XG5cblx0QENvbnRlbnRDaGlsZHJlbihUYWJsZUNvbHVtbilcblx0c2V0IGNvbHVtbkRlZmluaXRpb25zKHY6IFF1ZXJ5TGlzdDxUYWJsZUNvbHVtbj4pIHtcblx0XHR0aGlzLl9jb2x1bW5EZWZpbml0aW9ucyA9IHY7XG5cdFx0dGhpcy5fZ2VuZXJhdGVDb2x1bW5zKCk7XG5cdH1cblx0Z2V0IGNvbHVtbkRlZmluaXRpb25zKCk6IFF1ZXJ5TGlzdDxUYWJsZUNvbHVtbj4ge1xuXHRcdHJldHVybiB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucztcblx0fVxuXG5cdC8vIGZpbHRlciBtb2RhbFxuXHRAQ29udGVudENoaWxkKFRhYmxlRmlsdGVyTW9kYWxEaXJlY3RpdmUsIHtcblx0XHRyZWFkOiBUZW1wbGF0ZVJlZixcblx0XHRzdGF0aWM6IHRydWUsXG5cdH0pXG5cdHB1YmxpYyBmaWx0ZXJNb2RhbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkO1xuXG5cdHB1YmxpYyBmaWx0ZXJNb2RhbFNob3ckID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cblx0Ly8gcm93IGFjdGlvbnMgdGVtcGxhdGVzXG5cdHByaXZhdGUgX3Jvd0FjdGlvbnMhOiBRdWVyeUxpc3Q8VGFibGVSb3dBY3Rpb24+O1xuXHRwcml2YXRlIF9yb3dBY3Rpb25zU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuXHRAQ29udGVudENoaWxkcmVuKFRhYmxlUm93QWN0aW9uKVxuXHRzZXQgcm93QWN0aW9ucyh2OiBRdWVyeUxpc3Q8VGFibGVSb3dBY3Rpb24+KSB7XG5cdFx0dGhpcy5fcm93QWN0aW9ucyA9IHY7XG5cdFx0dGhpcy5fc2V0Um93U2VsZWN0aW9uRGF0YSgpO1xuXHR9XG5cdGdldCByb3dBY3Rpb25zKCk6IFF1ZXJ5TGlzdDxUYWJsZVJvd0FjdGlvbj4ge1xuXHRcdHJldHVybiB0aGlzLl9yb3dBY3Rpb25zO1xuXHR9XG5cblx0QElucHV0KCkgZmlsdGVyTW9kYWxIZWFkZXJUZXh0OiBzdHJpbmcgPSAnRmlsdGVycyc7XG5cdEBJbnB1dCgpIGZpbHRlck1vZGFsU2F2ZVRleHQ6IHN0cmluZyA9ICdTYXZlJztcblx0QElucHV0KCkgZmlsdGVyTW9kYWxDYW5jZWxUZXh0OiBzdHJpbmcgPSAnQ2FuY2VsJztcblx0QElucHV0KCkgZmlsdGVyTW9kYWxSZXNldFRleHQ6IHN0cmluZyA9ICdSZXNldCBmaWx0ZXJzJztcblxuXHRASW5wdXQoKSBmaWx0ZXJNb2RhbFNob3dSZXNldDogYm9vbGVhbiA9IGZhbHNlO1xuXHRASW5wdXQoKSBmaWx0ZXJNb2RhbFNob3dSZXNldE1vYmlsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdEBPdXRwdXQoKSBmaWx0ZXJNb2RhbFNob3c6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIGZpbHRlck1vZGFsU2F2ZTogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXHRAT3V0cHV0KCkgZmlsdGVyTW9kYWxSZXNldDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdHB1YmxpYyByb3dBY3Rpb25zUm93JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFibGVSb3dBY3Rpb25bXT4oW10pO1xuXHRwdWJsaWMgcm93QWN0aW9uc0Zsb2F0aW5nQWxsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFibGVSb3dBY3Rpb25bXT4oW10pO1xuXHRwdWJsaWMgcm93QWN0aW9uc0Zsb2F0aW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFibGVSb3dBY3Rpb25bXT4oW10pO1xuXG5cdHB1YmxpYyBpc01vYmlsZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGlzTW9iaWxlKCkpO1xuXG5cdHB1YmxpYyBmbG9hdGluZ01lbnVDb250YWluZXJDbGFzcyA9IGZsb2F0aW5nTWVudUNvbnRhaW5lckNsYXNzO1xuXG5cdHByaXZhdGUgX3Jlc2l6ZVRpbWVvdXQ6IHVua25vd247XG5cdHByaXZhdGUgX2lucHV0RW5hYmxlUm93U2VsZWN0aW9uOiBib29sZWFuID0gdGhpcy5lbmFibGVSb3dTZWxlY3Rpb247XG5cdHByaXZhdGUgX2lucHV0Um93U2VsZWN0aW9uTGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IHRoaXMucm93U2VsZWN0aW9uTGltaXQ7XG5cblx0cHVibGljIGZvb3RlckhpZGRlbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuXHRwdWJsaWMgY24gPSBjbjtcblxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIF9jaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG5cdG5nT25Jbml0KCkge1xuXHRcdHRoaXMuX3BhcnNlSXRlbXModGhpcy5pdGVtcyk7XG5cblx0XHR0aGlzLmxvYWRpbmdSb3dzID0gQXJyYXkuZnJvbSh7XG5cdFx0XHRsZW5ndGg6IHRoaXMuYW1vdW50T2ZMb2FkaW5nUm93cyxcblx0XHR9KTtcblxuXHRcdHRoaXMuZmlsdGVyTW9kYWxTaG93JFxuXHRcdFx0LnBpcGUodW50aWxEZXN0cm95ZWQodGhpcyksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG5cdFx0XHQuc3Vic2NyaWJlKHZhbHVlID0+IHRoaXMuZmlsdGVyTW9kYWxTaG93Lm5leHQodmFsdWUpKTtcblx0fVxuXG5cdG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcblx0XHRpZiAoY2hhbmdlc1snaXRlbXMnXSkge1xuXHRcdFx0dGhpcy5fcGFyc2VJdGVtcyhjaGFuZ2VzWydpdGVtcyddLmN1cnJlbnRWYWx1ZSk7XG5cdFx0fVxuXG5cdFx0aWYgKGNoYW5nZXNbJ2Ftb3VudE9mTG9hZGluZ1Jvd3MnXSkge1xuXHRcdFx0dGhpcy5sb2FkaW5nUm93cyA9IEFycmF5LmZyb20oe1xuXHRcdFx0XHRsZW5ndGg6IGNoYW5nZXNbJ2Ftb3VudE9mTG9hZGluZ1Jvd3MnXS5jdXJyZW50VmFsdWUsXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRsZXQgY2FsY3VsYXRlUm93U2VsZWN0aW9uRGF0YSA9IGZhbHNlO1xuXHRcdGlmIChjaGFuZ2VzWydlbmFibGVSb3dTZWxlY3Rpb24nXSkge1xuXHRcdFx0dGhpcy5faW5wdXRFbmFibGVSb3dTZWxlY3Rpb24gPVxuXHRcdFx0XHRjaGFuZ2VzWydlbmFibGVSb3dTZWxlY3Rpb24nXS5jdXJyZW50VmFsdWU7XG5cdFx0XHRjYWxjdWxhdGVSb3dTZWxlY3Rpb25EYXRhID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoY2hhbmdlc1sncm93U2VsZWN0aW9uTGltaXQnXSkge1xuXHRcdFx0dGhpcy5faW5wdXRSb3dTZWxlY3Rpb25MaW1pdCA9IGNoYW5nZXNbJ3Jvd1NlbGVjdGlvbkxpbWl0J10uY3VycmVudFZhbHVlO1xuXHRcdFx0Y2FsY3VsYXRlUm93U2VsZWN0aW9uRGF0YSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKGNhbGN1bGF0ZVJvd1NlbGVjdGlvbkRhdGEgfHwgY2hhbmdlc1snc2VsZWN0ZWRSb3dzJ10pIHtcblx0XHRcdHRoaXMuX3NldFJvd1NlbGVjdGlvbkRhdGEoKTtcblx0XHR9XG5cblx0XHRpZihjaGFuZ2VzWydlbmFibGVTY3JvbGwnXT8uY3VycmVudFZhbHVlKSB7XG5cdFx0XHR0aGlzLl9jYWxjdWxhdGVDb2x1bW5XaWR0aHMoKTtcblx0XHRcdHRoaXMuX2NoZWNrQ2hhbmdlc1N1YnNjcmlwdGlvbnMoKTtcblx0XHR9XG5cdH1cblxuXHRuZ0FmdGVyVmlld0luaXQoKSB7XG5cdFx0aWYoIXRoaXMuZW5hYmxlU2Nyb2xsKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fY2FsY3VsYXRlQ29sdW1uV2lkdGhzKCk7XG5cdFx0dGhpcy5fY2hlY2tDaGFuZ2VzU3Vic2NyaXB0aW9ucygpO1xuXHR9XG5cblxuXHRASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcblx0b25SZXNpemUoKSB7XG5cdFx0dGhpcy5fc2V0Um93U2VsZWN0aW9uRGF0YSgpO1xuXHRcdHRoaXMuX2NhbGN1bGF0ZUNvbHVtbldpZHRocygpO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXG5cdGtleURvd24oeyBrZXkgfTogeyBrZXk6IHN0cmluZyB9KSB7XG5cdFx0aWYgKGtleSAhPT0gJ0NvbnRyb2wnIHx8IHRoaXMuX2N0cmxEb3duID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fY3RybERvd24gPSB0cnVlO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5dXAnLCBbJyRldmVudCddKVxuXHRrZXlVcCh7IGtleSB9OiB7IGtleTogc3RyaW5nIH0pIHtcblx0XHRpZiAoa2V5ICE9PSAnQ29udHJvbCcgfHwgdGhpcy5fY3RybERvd24gPT09IGZhbHNlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fY3RybERvd24gPSBmYWxzZTtcblx0fVxuXG5cdEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OnZpc2liaWxpdHljaGFuZ2UnLCBbJyRldmVudCddKVxuXHR2aXNpYmlsaXR5Q2hhbmdlKCkge1xuXHRcdGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgIT09ICdoaWRkZW4nIHx8IHRoaXMuX2N0cmxEb3duID09PSBmYWxzZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX2N0cmxEb3duID0gZmFsc2U7XG5cdH1cblxuXHRvblF1ZXJ5Q2hhbmdlKHsgZGV0YWlsIH06IGFueSkge1xuXHRcdHRoaXMucXVlcnlDaGFuZ2UuZW1pdChkZXRhaWwpO1xuXHR9XG5cblx0b25RdWlja0ZpbHRlcih7IGRldGFpbCB9OiBhbnkpIHtcblx0XHR0aGlzLnF1aWNrRmlsdGVyLmVtaXQoZGV0YWlsKTtcblx0fVxuXG5cdG9uUGFnZVNpemVDaGFuZ2UoeyBkZXRhaWwgfTogYW55KSB7XG5cdFx0dGhpcy5wYWdlU2l6ZSA9IGRldGFpbDtcblx0XHR0aGlzLnBhZ2VTaXplQ2hhbmdlLmVtaXQoZGV0YWlsKTtcblx0fVxuXG5cdG9uUGFnZUNoYW5nZSh7IGRldGFpbCB9OiBhbnkpIHtcblx0XHR0aGlzLnBhZ2UgPSBkZXRhaWw7XG5cdFx0dGhpcy5wYWdlQ2hhbmdlLmVtaXQoZGV0YWlsKTtcblx0fVxuXG5cdG9uRmlsdGVyTW9kYWxTYXZlKCkge1xuXHRcdHRoaXMuZmlsdGVyTW9kYWxTYXZlLm5leHQoKTtcblx0XHR0aGlzLmZpbHRlck1vZGFsU2hvdyQubmV4dChmYWxzZSk7XG5cdH1cblxuXHRvbkZpbHRlck1vZGFsUmVzZXQocmVzZXRRdWlja0ZpbHRlciA9IGZhbHNlKSB7XG5cdFx0dGhpcy5maWx0ZXJNb2RhbFJlc2V0Lm5leHQocmVzZXRRdWlja0ZpbHRlcik7XG5cdFx0dGhpcy5maWx0ZXJNb2RhbFNob3ckLm5leHQoZmFsc2UpO1xuXHR9XG5cblx0ZW1wdHlTdGF0ZUNsaWNrZWQoKSB7XG5cdFx0aWYgKCF0aGlzLmVuYWJsZUVtcHR5U3RhdGVBY3Rpb24pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLmVtcHR5U3RhdGVBY3Rpb25DbGljay5lbWl0KCk7XG5cdH1cblxuXHRwYXJzZVJvd0FjdGlvbnNSb3coYWN0aW9uczogVGFibGVSb3dBY3Rpb25bXSB8IG51bGwsIHJvd0luZGV4OiBudW1iZXIpIHtcblx0XHRpZiAoIWFjdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY3Rpb25zLmZpbHRlcihcblx0XHRcdGEgPT4gIWEuc2hvd0Z1bmN0aW9uIHx8IGEuc2hvd0Z1bmN0aW9uKHRoaXMucGFyc2VkSXRlbXNbcm93SW5kZXhdKVxuXHRcdCk7XG5cdH1cblxuXHRvbkNvbnRhaW5lclhTY3JvbGwoZXY6IGFueSkge1xuXHRcdGlmKCF0aGlzLmVuYWJsZVNjcm9sbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX2NhbGN1bGF0ZVNjcm9sbFBvc2l0aW9uKGV2KTtcblx0fVxuXG5cdHByaXZhdGUgX3BhcnNlSXRlbXMoaXRlbXM6IHN0cmluZyB8IGFueVtdKSB7XG5cdFx0aWYgKCFpdGVtcykge1xuXHRcdFx0dGhpcy5wYXJzZWRJdGVtcyA9IFtdO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuXHRcdFx0dGhpcy5wYXJzZWRJdGVtcyA9IGl0ZW1zO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMucGFyc2VkSXRlbXMgPSBKU09OLnBhcnNlKGl0ZW1zKTtcblx0fVxuXG5cdHByaXZhdGUgX2dlbmVyYXRlQ29sdW1ucygpIHtcblx0XHRsZXQgZGVmaW5pdGlvbnNBcnJheSA9IEFycmF5LmZyb20odGhpcy5fY29sdW1uRGVmaW5pdGlvbnMpIGFzIFRhYmxlQ29sdW1uW107XG5cblx0XHRkZWZpbml0aW9uc0FycmF5ID0gdGhpcy5fcGFyc2VEZWZpbml0aW9ucyhkZWZpbml0aW9uc0FycmF5KTtcblxuXHRcdHRoaXMuY29sdW1ucyA9IGRlZmluaXRpb25zQXJyYXk7XG5cdH1cblxuXHRwdWJsaWMgX2NoZWNrYm94RGlzYWJsZWQoaXRlbTogYW55LCByb3dJbmRleDogbnVtYmVyKSB7XG5cdFx0Y29uc3Qgc2VsZWN0aW9uQ29udGFpbnMgPSB0aGlzLl9zZWxlY3Rpb25Db250YWlucyhpdGVtLCByb3dJbmRleCk7XG5cdFx0cmV0dXJuIChcblx0XHRcdCh0aGlzLmNhblNlbGVjdEtleSAmJiAhaXRlbVt0aGlzLmNhblNlbGVjdEtleV0pIHx8XG5cdFx0XHQodGhpcy5yb3dTZWxlY3Rpb25MaW1pdCAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdCFzZWxlY3Rpb25Db250YWlucyAmJlxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGggPT09IHRoaXMucm93U2VsZWN0aW9uTGltaXQpXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBfc2VsZWN0QWxsQ2hhbmdlKCRldmVudDogYW55LCBmb3JjZVZhbHVlPzogYm9vbGVhbikge1xuXHRcdGlmICghdGhpcy5lbmFibGVSb3dTZWxlY3Rpb24pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCB2YWx1ZSA9IGZvcmNlVmFsdWUgPT09IHVuZGVmaW5lZCA/ICRldmVudC5kZXRhaWwgOiBmb3JjZVZhbHVlO1xuXG5cdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHRjb25zdCB0b0FkZCA9IFtdO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhcnNlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IHJvdyA9IHRoaXMucGFyc2VkSXRlbXNbaV07XG5cdFx0XHRcdGlmICh0aGlzLmNhblNlbGVjdEtleSAmJiAhcm93W3RoaXMuY2FuU2VsZWN0S2V5XSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5zKHJvdywgaSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRvQWRkLnB1c2gocm93KTtcblx0XHRcdFx0dGhpcy5yb3dTZWxlY3RlZC5lbWl0KHJvdyk7XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHRoaXMucm93U2VsZWN0aW9uTGltaXQgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aCArIHRvQWRkLmxlbmd0aCA9PT0gdGhpcy5yb3dTZWxlY3Rpb25MaW1pdFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNlbGVjdGVkUm93cyA9IFsuLi50aGlzLnNlbGVjdGVkUm93cywgLi4udG9BZGRdO1xuXHRcdFx0dGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG5cblx0XHRcdGlmICh0aGlzLmVuYWJsZUZsb2F0aW5nTWVudSkge1xuXHRcdFx0XHR0aGlzLl9zaG93RmxvYXRpbmdNZW51KCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRSb3dzW2ldO1xuXHRcdFx0Y29uc3Qgcm93ID0gdGhpcy5wYXJzZWRJdGVtcy5maW5kKFxuXHRcdFx0XHRkID0+IHRoaXMuX2dldFNlbGVjdGlvblZhbHVlKGQsIGkpID09PSB0aGlzLl9nZXRTZWxlY3Rpb25WYWx1ZSh2YWx1ZSwgaSlcblx0XHRcdCk7XG5cblx0XHRcdGlmICghcm93KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnJvd0Rlc2VsZWN0ZWQuZW1pdChyb3cpO1xuXHRcdH1cblxuXHRcdHRoaXMuc2VsZWN0ZWRSb3dzID0gW107XG5cdFx0dGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG5cdH1cblxuXHRwdWJsaWMgX2NoZWNrYm94Q2hhbmdlKHRhcmdldDogYW55LCBpbmRleDogbnVtYmVyKSB7XG5cdFx0aWYgKCF0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHZhbHVlID0gdGhpcy5fZ2V0Q2hlY2tlZFZhbHVlKHRhcmdldCk7XG5cdFx0aWYgKFxuXHRcdFx0dmFsdWUgJiZcblx0XHRcdHRoaXMucm93U2VsZWN0aW9uTGltaXQgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0dGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID49IHRoaXMucm93U2VsZWN0aW9uTGltaXRcblx0XHQpIHtcblx0XHRcdHRhcmdldC5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgcm93ID0gdGhpcy5wYXJzZWRJdGVtc1tpbmRleF07XG5cblx0XHRpZiAodGhpcy5jYW5TZWxlY3RLZXkgJiYgIXJvd1t0aGlzLmNhblNlbGVjdEtleV0pIHtcblx0XHRcdHRhcmdldC5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHR0aGlzLnNlbGVjdGVkUm93cyA9IFsuLi50aGlzLnNlbGVjdGVkUm93cywgcm93XTtcblx0XHRcdHRoaXMuc2VsZWN0ZWRSb3dzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFJvd3MpO1xuXHRcdFx0dGhpcy5yb3dTZWxlY3RlZC5lbWl0KHJvdyk7XG5cblx0XHRcdGlmICh0aGlzLmVuYWJsZUZsb2F0aW5nTWVudSkge1xuXHRcdFx0XHR0aGlzLl9zaG93RmxvYXRpbmdNZW51KCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgaW5kZXhPZlRvUmVtb3ZlID0gdGhpcy5fc2VsZWN0aW9uQ29udGFpbnMocm93LCBpbmRleCwgdHJ1ZSk7XG5cblx0XHQvLyB3ZSBuZWVkIHRvIGRvIHRoaXMsIGJlY2F1c2Ugc3BsaWNlIGRvZXMgbm90IHRyaWdnZXIgdGhlIHNlbGVjdGlvbiBzZXR0ZXIuXG5cdFx0Y29uc3Qgc2VsZWN0aW9uID0gWy4uLnRoaXMuc2VsZWN0ZWRSb3dzXTtcblx0XHRzZWxlY3Rpb24uc3BsaWNlKGluZGV4T2ZUb1JlbW92ZSwgMSk7XG5cdFx0dGhpcy5zZWxlY3RlZFJvd3MgPSBzZWxlY3Rpb247XG5cdFx0dGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG5cdFx0dGhpcy5yb3dEZXNlbGVjdGVkLmVtaXQocm93KTtcblx0fVxuXG5cdHByaXZhdGUgX2dldENoZWNrZWRWYWx1ZSh0YXJnZXQ6IGFueSkge1xuXHRcdHJldHVybiB0YXJnZXQ/LmNoZWNrZWQ7XG5cdH1cblxuXHRwcml2YXRlIF9nZXRTZWxlY3Rpb25WYWx1ZShyb3c6IGFueSwgaW5kZXg6IG51bWJlcikge1xuXHRcdHJldHVybiB0aGlzLnNlbGVjdGlvbktleSA/IHJvdz8uW3RoaXMuc2VsZWN0aW9uS2V5XSB8fCBpbmRleCA6IGluZGV4O1xuXHR9XG5cblx0cHVibGljIF9zZWxlY3Rpb25Db250YWlucyhyb3c6IGFueSwgaW5kZXg6IG51bWJlciwgcmV0dXJuSW5kZXggPSBmYWxzZSk6IGFueSB7XG5cdFx0Y29uc3QgcmV0dXJuVmFsdWUgPSB0aGlzLnNlbGVjdGVkUm93cy5maW5kSW5kZXgoXG5cdFx0XHRpdGVtID0+XG5cdFx0XHRcdHRoaXMuX2dldFNlbGVjdGlvblZhbHVlKHJvdywgaW5kZXgpID09PVxuXHRcdFx0XHR0aGlzLl9nZXRTZWxlY3Rpb25WYWx1ZShpdGVtLCBpbmRleClcblx0XHQpO1xuXHRcdHJldHVybiAhcmV0dXJuSW5kZXggPyByZXR1cm5WYWx1ZSA+PSAwIDogcmV0dXJuVmFsdWU7XG5cdH1cblxuXHRwdWJsaWMgX3NlbGVjdGlvbkNvbnRhaW5zQWxsKCkge1xuXHRcdGxldCByZXR1cm5WYWx1ZSA9IHRydWU7XG5cdFx0aWYgKCF0aGlzLnBhcnNlZEl0ZW1zPy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHR0aGlzLnJvd1NlbGVjdGlvbkxpbWl0ICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aCA9PT0gdGhpcy5yb3dTZWxlY3Rpb25MaW1pdFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhcnNlZEl0ZW1zPy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgaXRlbSA9IHRoaXMucGFyc2VkSXRlbXNbaV07XG5cdFx0XHRjb25zdCBjb250YWlucyA9IHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5zKGl0ZW0sIGkpO1xuXG5cdFx0XHRpZiAoIWNvbnRhaW5zKSB7XG5cdFx0XHRcdHJldHVyblZhbHVlID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXR1cm5WYWx1ZTtcblx0fVxuXG5cdHB1YmxpYyBfc2VsZWN0aW9uSW5kZXRlcm1pbmF0ZSgpIHtcblx0XHRpZiAoIXRoaXMucGFyc2VkSXRlbXM/Lmxlbmd0aCB8fCAhdGhpcy5zZWxlY3RlZFJvd3M/Lmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdHRoaXMucm93U2VsZWN0aW9uTGltaXQgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0dGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID09PSB0aGlzLnJvd1NlbGVjdGlvbkxpbWl0XG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0bGV0IGNvbnRhaW5zQ291bnQgPSAwO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wYXJzZWRJdGVtcz8ubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGl0ZW0gPSB0aGlzLnBhcnNlZEl0ZW1zW2ldO1xuXHRcdFx0Y29uc3QgY29udGFpbnMgPSB0aGlzLl9zZWxlY3Rpb25Db250YWlucyhpdGVtLCBpKTtcblxuXHRcdFx0aWYgKGNvbnRhaW5zKSB7XG5cdFx0XHRcdGNvbnRhaW5zQ291bnQrKztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY29udGFpbnNDb3VudCA+IDAgJiYgY29udGFpbnNDb3VudCAhPT0gdGhpcy5wYXJzZWRJdGVtcy5sZW5ndGg7XG5cdH1cblxuXHRwdWJsaWMgX3Jvd0NsaWNrKCRldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlcikge1xuXHRcdGNvbnN0IHRhcmdldCA9ICRldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cblx0XHRpZiAoXG5cdFx0XHR0YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnIHx8XG5cdFx0XHQodGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnR5cGUgPT09ICdjaGVja2JveCdcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCByb3cgPSB0aGlzLl9maW5kUm93KHRhcmdldCk7XG5cdFx0Y29uc3QgYWN0aW9uID0gdGhpcy5fZmluZFJvd0FjdGlvbih0YXJnZXQpO1xuXG5cdFx0aWYgKGFjdGlvbikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmVuYWJsZVJvd0NsaWNrKSB7XG5cdFx0XHRjb25zdCBpdGVtID0gdGhpcy5wYXJzZWRJdGVtc1tpbmRleF07XG5cdFx0XHR0aGlzLnJvd0NsaWNrLmVtaXQoe1xuXHRcdFx0XHRpdGVtLFxuXHRcdFx0XHRjdHJsRG93bjogdGhpcy5fY3RybERvd24sXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuZW5hYmxlUm93U2VsZWN0aW9uKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hlY2tib3ggPSByb3c/LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScpO1xuXG5cdFx0aWYgKCFjaGVja2JveCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNoZWNrYm94LmNoZWNrZWQgPSAhY2hlY2tib3guY2hlY2tlZDtcblx0XHR0aGlzLl9jaGVja2JveENoYW5nZShjaGVja2JveCwgaW5kZXgpO1xuXHR9XG5cblx0cHVibGljIF9nZXRBY3Rpb25Sb3V0ZXJMaW5rKFxuXHRcdHJvdXRlckxpbms6IFRhYmxlUm93QWN0aW9uUm91dGVyTGluayxcblx0XHRyb3dJbmRleDogbnVtYmVyXG5cdCk6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBhbnlbXT4gfCBBc3luY0l0ZW08c3RyaW5nIHwgYW55W10+IHtcblx0XHRpZiAodHlwZW9mIHJvdXRlckxpbmsgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGNvbnN0IGl0ZW0gPSB0aGlzLnBhcnNlZEl0ZW1zW3Jvd0luZGV4XTtcblx0XHRcdHJldHVybiB0aGlzLl9nZXRBY3Rpb25Sb3V0ZXJMaW5rKHJvdXRlckxpbmsoaXRlbSksIHJvd0luZGV4KTtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHJvdXRlckxpbmsgPT09ICdzdHJpbmcnIHx8IEFycmF5LmlzQXJyYXkocm91dGVyTGluaykpIHtcblx0XHRcdHJldHVybiBuZXcgQmVoYXZpb3JTdWJqZWN0KHJvdXRlckxpbmspO1xuXHRcdH1cblxuXHRcdHJldHVybiByb3V0ZXJMaW5rO1xuXHR9XG5cblx0cHVibGljIF9nZXRBY3Rpb25RdWVyeVBhcmFtcyhcblx0XHRxdWVyeVBhcmFtczogVGFibGVSb3dBY3Rpb25RdWVyeVBhcmFtcyxcblx0XHRyb3dJbmRleDogbnVtYmVyXG5cdCk6IEJlaGF2aW9yU3ViamVjdDxQYXJhbXM+IHwgQXN5bmNJdGVtPFBhcmFtcz4ge1xuXHRcdGlmICh0eXBlb2YgcXVlcnlQYXJhbXMgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGNvbnN0IGl0ZW0gPSB0aGlzLnBhcnNlZEl0ZW1zW3Jvd0luZGV4XTtcblx0XHRcdHJldHVybiB0aGlzLl9nZXRBY3Rpb25RdWVyeVBhcmFtcyhxdWVyeVBhcmFtcyhpdGVtKSwgcm93SW5kZXgpO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeVBhcmFtcyBpbnN0YW5jZW9mIE9iamVjdCAmJiBxdWVyeVBhcmFtcy5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG5cdFx0XHRyZXR1cm4gbmV3IEJlaGF2aW9yU3ViamVjdChxdWVyeVBhcmFtcyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHF1ZXJ5UGFyYW1zIGFzIEFzeW5jSXRlbTxQYXJhbXM+O1xuXHR9XG5cblx0cHVibGljIF9yb3dBY3Rpb25DbGljayhhY3Rpb246IFRhYmxlUm93QWN0aW9uLCByb3dJbmRleD86IG51bWJlcikge1xuXHRcdGlmIChhY3Rpb24uZGlzYWJsZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoYWN0aW9uLmxvYWRpbmcpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIWFjdGlvbi5hY3Rpb24pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHRhY3Rpb24udHlwZSA9PT0gJ211bHRpJyB8fFxuXHRcdFx0KGFjdGlvbi50eXBlID09PSAnYm90aCcgJiYgcm93SW5kZXggPT09IHVuZGVmaW5lZClcblx0XHQpIHtcblx0XHRcdGFjdGlvbi5hY3Rpb24uZW1pdCh7XG5cdFx0XHRcdGl0ZW1zOiB0aGlzLnNlbGVjdGVkUm93cyxcblx0XHRcdFx0bXVsdGk6IHRydWUsXG5cdFx0XHRcdGN0cmxEb3duOiB0aGlzLl9jdHJsRG93bixcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdGFjdGlvbi5yb3V0ZXJMaW5rIHx8XG5cdFx0XHQoQXJyYXkuaXNBcnJheShhY3Rpb24ucm91dGVyTGluaykgJiYgYWN0aW9uLnJvdXRlckxpbmsubGVuZ3RoKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGl0ZW0gPVxuXHRcdFx0cm93SW5kZXggIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IHRoaXMucGFyc2VkSXRlbXNbcm93SW5kZXhdXG5cdFx0XHRcdDogdGhpcy5zZWxlY3RlZFJvd3NbMF07XG5cdFx0YWN0aW9uLmFjdGlvbi5lbWl0KHtcblx0XHRcdGl0ZW0sXG5cdFx0XHRtdWx0aTogZmFsc2UsXG5cdFx0XHRjdHJsRG93bjogdGhpcy5fY3RybERvd24sXG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIF9maW5kUm93KGVsOiBIVE1MRWxlbWVudCB8IG51bGwpOiBhbnkge1xuXHRcdGlmICghZWwpIHtcblx0XHRcdHJldHVybiBlbDtcblx0XHR9XG5cblx0XHRpZiAoZWw/LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09ICdwLXRhYmxlLXJvdycpIHtcblx0XHRcdHJldHVybiBlbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fZmluZFJvdyhlbD8ucGFyZW50RWxlbWVudCk7XG5cdH1cblxuXHRwcml2YXRlIF9maW5kUm93QWN0aW9uKGVsOiBIVE1MRWxlbWVudCB8IG51bGwpOiBhbnkge1xuXHRcdGlmICghZWwpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1pcy1hY3Rpb24nKSAhPT0gbnVsbCAmJlxuXHRcdFx0ZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWlzLWFjdGlvbicpICE9PSAnZmFsc2UnXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gZWw7XG5cdFx0fVxuXG5cdFx0aWYgKGVsPy50YWdOYW1lPy50b0xvd2VyQ2FzZSgpID09PSAncC10YWJsZS1yb3cnKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fZmluZFJvd0FjdGlvbihlbD8ucGFyZW50RWxlbWVudCk7XG5cdH1cblxuXHRwcml2YXRlIF9zZXRSb3dTZWxlY3Rpb25EYXRhKCkge1xuXHRcdGlmICh0aGlzLl9yZXNpemVUaW1lb3V0KSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy5fcmVzaXplVGltZW91dCBhcyBudW1iZXIpO1xuXHRcdH1cblxuXHRcdC8vIFdlIGFkZCBhIHRpbWVvdXQgaGVyZSBiZWNhdXNlIGl0J3MgYSBsb3QgZWFzaWVyIG9uIHRoZSBtYWNoaW5lIHRvIGRvIHRoZXNlIHdoZW4gc29tZW9uZSBpcyBkb25lXG5cdFx0Ly8gcmVzaXppbmcgYW5kIHBsYXlpbmcgYXJvdW5kIHdpdGggdGhlaXIgYnJvd3NlclxuXHRcdHRoaXMuX3Jlc2l6ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdGNvbnN0IG1vYmlsZSA9IGlzTW9iaWxlKCk7XG5cdFx0XHR0aGlzLmlzTW9iaWxlJC5uZXh0KG1vYmlsZSk7XG5cblx0XHRcdGNvbnN0IGFjdGlvbnMgPSBBcnJheS5mcm9tKHRoaXMuX3Jvd0FjdGlvbnMpIGFzIFRhYmxlUm93QWN0aW9uW107XG5cblx0XHRcdGlmICh0aGlzLl9yb3dBY3Rpb25zU3Vic2NyaXB0aW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0Zm9yIChsZXQgc3Vic2NyaXB0aW9uIG9mIHRoaXMuX3Jvd0FjdGlvbnNTdWJzY3JpcHRpb25zKSB7XG5cdFx0XHRcdFx0c3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fcm93QWN0aW9uc1N1YnNjcmlwdGlvbnMgPSBhY3Rpb25zLm1hcChhY3Rpb24gPT5cblx0XHRcdFx0YWN0aW9uLl9sb2FkaW5nQ2hhbmdlZFxuXHRcdFx0XHRcdC5waXBlKHVudGlsRGVzdHJveWVkKHRoaXMpKVxuXHRcdFx0XHRcdC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fY2hhbmdlRGV0ZWN0aW9uLmRldGVjdENoYW5nZXMoKSlcblx0XHRcdCk7XG5cblx0XHRcdC8vIHdlIGhhY2sgdGhpcyB0byBhbnlbXSB0byBtYWtlIGl0IHdvcmsuLlxuXHRcdFx0Y29uc3Qgcm93QWN0aW9uc1JvdyA9IGFjdGlvbnMuZmlsdGVyKFxuXHRcdFx0XHRhID0+IGEudHlwZSA9PT0gJ2JvdGgnIHx8IGEudHlwZSA9PT0gJ3NpbmdsZSdcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByb3dBY3Rpb25zRmxvYXRpbmcgPSBhY3Rpb25zLmZpbHRlcihcblx0XHRcdFx0YSA9PlxuXHRcdFx0XHRcdCh0aGlzLl9pbnB1dEVuYWJsZVJvd1NlbGVjdGlvbiAmJlxuXHRcdFx0XHRcdFx0KGEudHlwZSA9PT0gJ2JvdGgnIHx8IGEudHlwZSA9PT0gJ211bHRpJykpIHx8XG5cdFx0XHRcdFx0KG1vYmlsZSAmJiBhLnR5cGUgPT09ICdzaW5nbGUnICYmICFhLnJvdXRlckxpbmspXG5cdFx0XHQpO1xuXG5cdFx0XHRsZXQgcm93U2VsZWN0aW9uTGltaXQgPSB0aGlzLl9pbnB1dFJvd1NlbGVjdGlvbkxpbWl0O1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRtb2JpbGUgJiYgLy8gd2UncmUgbW9iaWxlXG5cdFx0XHRcdHJvd0FjdGlvbnNGbG9hdGluZz8ubGVuZ3RoICYmIC8vIHdlIGhhdmUgYXRsZWFzdCAxIGl0ZW0gaW4gX3Jvd0FjdGlvbnNGbG9hdGluZ1xuXHRcdFx0XHQoKHJvd1NlbGVjdGlvbkxpbWl0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5lbmFibGVSb3dTZWxlY3Rpb24pIHx8XG5cdFx0XHRcdFx0IXRoaXMuZW5hYmxlUm93U2VsZWN0aW9uKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJvd1NlbGVjdGlvbkxpbWl0ID0gMTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5yb3dTZWxlY3Rpb25MaW1pdCA9IHJvd1NlbGVjdGlvbkxpbWl0O1xuXG5cdFx0XHRsZXQgZW5hYmxlUm93U2VsZWN0aW9uID0gdGhpcy5faW5wdXRFbmFibGVSb3dTZWxlY3Rpb247XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG1vYmlsZSAmJiAvLyB3ZSdyZSBtb2JpbGVcblx0XHRcdFx0cm93QWN0aW9uc0Zsb2F0aW5nPy5sZW5ndGggJiYgLy8gd2UgaGF2ZSBhdGxlYXN0IDEgaXRlbSBpbiBfcm93QWN0aW9uc0Zsb2F0aW5nXG5cdFx0XHRcdCFlbmFibGVSb3dTZWxlY3Rpb25cblx0XHRcdCkge1xuXHRcdFx0XHRlbmFibGVSb3dTZWxlY3Rpb24gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5lbmFibGVSb3dTZWxlY3Rpb24gPSBlbmFibGVSb3dTZWxlY3Rpb247XG5cblx0XHRcdHRoaXMucm93QWN0aW9uc1JvdyQubmV4dChyb3dBY3Rpb25zUm93KTtcblx0XHRcdHRoaXMucm93QWN0aW9uc0Zsb2F0aW5nQWxsJC5uZXh0KHJvd0FjdGlvbnNGbG9hdGluZyk7XG5cblx0XHRcdHRoaXMuZmxvYXRpbmdNZW51U2hvd24kXG5cdFx0XHRcdC5waXBlKFxuXHRcdFx0XHRcdHRha2UoMSksXG5cdFx0XHRcdFx0ZmlsdGVyKHYgPT4gISF2KVxuXHRcdFx0XHQpXG5cdFx0XHRcdC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fc2hvd0Zsb2F0aW5nTWVudSgpKTtcblx0XHR9LCAyMDApO1xuXHR9XG5cblx0cHJpdmF0ZSBfc2hvd0Zsb2F0aW5nTWVudSgpIHtcblx0XHR0aGlzLnJvd0FjdGlvbnNGbG9hdGluZ0FsbCQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoYWN0aW9ucyA9PiB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHRoaXMucm93U2VsZWN0aW9uTGltaXQgPT09IDEgJiZcblx0XHRcdFx0YWN0aW9ucy5maW5kSW5kZXgoXG5cdFx0XHRcdFx0YSA9PiAoYS50eXBlID09PSAnc2luZ2xlJyB8fCBhLnR5cGUgPT09ICdib3RoJykgJiYgYS5zaG93RnVuY3Rpb25cblx0XHRcdFx0KSA+PSAwXG5cdFx0XHQpIHtcblx0XHRcdFx0YWN0aW9ucyA9IGFjdGlvbnMuZmlsdGVyKFxuXHRcdFx0XHRcdGEgPT5cblx0XHRcdFx0XHRcdGEudHlwZSA9PT0gJ211bHRpJyB8fFxuXHRcdFx0XHRcdFx0IWEuc2hvd0Z1bmN0aW9uIHx8XG5cdFx0XHRcdFx0XHRhLnNob3dGdW5jdGlvbih0aGlzLnNlbGVjdGVkUm93c1swXSlcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5yb3dBY3Rpb25zRmxvYXRpbmckLm5leHQoYWN0aW9ucyk7XG5cdFx0XHR0aGlzLmZsb2F0aW5nTWVudVNob3duJC5uZXh0KHRydWUpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBfcGFyc2VEZWZpbml0aW9ucyhkZWZpbml0aW9uc0FycmF5OiBUYWJsZUNvbHVtbltdKSB7XG5cdFx0cmV0dXJuIGRlZmluaXRpb25zQXJyYXkubWFwKGRlZmluaXRpb24gPT4ge1xuXHRcdFx0ZGVmaW5pdGlvbiA9IHRoaXMuX3BhcnNlRGVmaW5pdGlvblNpemVzKGRlZmluaXRpb24pO1xuXHRcdFx0cmV0dXJuIGRlZmluaXRpb247XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIF9wYXJzZURlZmluaXRpb25TaXplcyhkZWZpbml0aW9uOiBUYWJsZUNvbHVtbikge1xuXHRcdGNvbnN0IGRlZmluaXRpb25BbnkgPSBkZWZpbml0aW9uIGFzIGFueTtcblx0XHRsZXQgcGFyc2VkU2l6ZXM6IFRhYmxlQ29sdW1uU2l6ZXMgPSB7IGRlZmF1bHQ6ICdmdWxsJyB9O1xuXG5cdFx0Zm9yIChjb25zdCBbaW5kZXgsIHNpemVdIG9mIHRhYmxlQ29sdW1TaXplc09wdGlvbnMuZW50cmllcygpKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGRlZmluaXRpb25Bbnkuc2l6ZXMgPT09ICdhdXRvJyB8fFxuXHRcdFx0XHRkZWZpbml0aW9uQW55LnNpemVzID09PSAnaGlkZGVuJyB8fFxuXHRcdFx0XHRkZWZpbml0aW9uQW55LnNpemVzID09PSAnZnVsbCcgfHxcblx0XHRcdFx0dHlwZW9mIGRlZmluaXRpb25Bbnkuc2l6ZXMgPT09ICdudW1iZXInXG5cdFx0XHQpIHtcblx0XHRcdFx0cGFyc2VkU2l6ZXNbc2l6ZV0gPVxuXHRcdFx0XHRcdGRlZmluaXRpb25Bbnkuc2l6ZXMgPT09ICdhdXRvJyA/ICdmdWxsJyA6IGRlZmluaXRpb25Bbnkuc2l6ZXM7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRwYXJzZWRTaXplc1tzaXplXSA9XG5cdFx0XHRcdGRlZmluaXRpb25Bbnkuc2l6ZXNbc2l6ZV0gPz9cblx0XHRcdFx0cGFyc2VkU2l6ZXNbdGFibGVDb2x1bVNpemVzT3B0aW9uc1tpbmRleCAtIDFdXTtcblx0XHR9XG5cblx0XHRkZWZpbml0aW9uLnBhcnNlZFNpemVzID0gcGFyc2VkU2l6ZXM7XG5cdFx0cmV0dXJuIGRlZmluaXRpb247XG5cdH1cblxuXHRwcml2YXRlIF9jaGVja0NoYW5nZXNTdWJzY3JpcHRpb25zKCkge1xuXHRcdGlmKHRoaXMuX3Jvd0NoYW5nZXNTdWJzY3JpcHRpb24pIHtcblx0XHRcdHRoaXMuX3Jvd0NoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLnRhYmxlUm93cy5jaGFuZ2VzLnBpcGUodW50aWxEZXN0cm95ZWQodGhpcykpLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9jYWxjdWxhdGVDb2x1bW5XaWR0aHMoKSk7XG5cdFx0fVxuXG5cdFx0aWYoIXRoaXMuX2NlbGxDaGFuZ2VzU3Vic2NyaXB0aW9uKSB7XG5cdFx0XHR0aGlzLnRhYmxlQ2VsbHMuY2hhbmdlcy5waXBlKHVudGlsRGVzdHJveWVkKHRoaXMpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fY2FsY3VsYXRlQ29sdW1uV2lkdGhzKCkpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgX2NhbGN1bGF0ZUNvbHVtbldpZHRocygpICB7XG5cdFx0aWYoIXRoaXMudGFibGVDZWxscykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmKHRoaXMuX2NhbGN1bGF0ZUNvbHVtbldpZHRoc1RpbWVvdXQpIHtcblx0XHRcdGNsZWFyVGltZW91dCh0aGlzLl9jYWxjdWxhdGVDb2x1bW5XaWR0aHNUaW1lb3V0KTtcblx0XHRcdHRoaXMuX2NhbGN1bGF0ZUNvbHVtbldpZHRoc1RpbWVvdXQgPSAwO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJvd3MgPSB0aGlzLnRhYmxlUm93cy5tYXAoYyA9PiBjLm5hdGl2ZUVsZW1lbnQgYXMgdW5rbm93biBhcyBIVE1MRWxlbWVudCk7XG5cdFx0Y29uc3QgY2VsbHMgPSB0aGlzLnRhYmxlQ2VsbHMubWFwKGMgPT4gYy5uYXRpdmVFbGVtZW50IGFzIHVua25vd24gYXMgSFRNTEVsZW1lbnQpO1xuXG5cdFx0dGhpcy5fY2FsY3VsYXRlQ29sdW1uV2lkdGhzVGltZW91dCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuXHRcdFx0dGhpcy5fc2V0Um93c1dpZHRoKHJvd3MpO1xuXG5cdFx0XHRjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cdFx0XHRmb3IoY29uc3QgY2VsbCBvZiBjZWxscykge1xuXHRcdFx0XHRpZihjZWxsLnN0eWxlLndpZHRoPy5sZW5ndGgpIHtcblx0XHRcdFx0XHRjZWxsLnN0eWxlLndpZHRoID0gJyc7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRwcm9taXNlcy5wdXNoKG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgcmVjdCA9IGNlbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0XHRcdFx0Y2VsbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgYHdpZHRoOiAke3JlY3Qud2lkdGh9cHggIWltcG9ydGFudGApO1xuXHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0fSwgMTAwKSkpXG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcblxuXHRcdFx0dGhpcy5fc2V0Um93c1dpZHRoKHJvd3MsICdtaW4tY29udGVudCcpO1xuXG5cdFx0XHR0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKCk7XG5cdFx0fSwgMjAwKSBhcyB1bmtub3duIGFzIG51bWJlcjtcblx0fVxuXG5cdHByaXZhdGUgX3NldFJvd3NXaWR0aChyb3dzOiBIVE1MRWxlbWVudFtdLCB2YWx1ZTogJ21pbi1jb250ZW50JyB8IG51bGwgPSBudWxsKSB7XG5cdFx0Zm9yKGxldCBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHJvdyA9IHJvd3NbaV07XG5cblx0XHRcdGNvbnN0IHNoYWRvdyA9IHJvdy5zaGFkb3dSb290O1xuXHRcdFx0aWYoIXNoYWRvdykge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZmlyc3REaXYgPSBzaGFkb3cucXVlcnlTZWxlY3RvcignKjpudGgtY2hpbGQoMSknKTtcblx0XHRcdGlmKCFmaXJzdERpdikge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgc2Vjb25kRGl2ID0gZmlyc3REaXYucXVlcnlTZWxlY3RvcignKjpudGgtY2hpbGQoMSknKTtcblx0XHRcdGlmKCFzZWNvbmREaXYpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmKHZhbHVlID09PSBudWxsKSB7XG5cdFx0XHRcdGZpcnN0RGl2LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnJyk7XG5cdFx0XHRcdHNlY29uZERpdi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJycpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Zmlyc3REaXYuc2V0QXR0cmlidXRlKCdzdHlsZScsICd3aWR0aDogbWluLWNvbnRlbnQ7Jylcblx0XHRcdHNlY29uZERpdi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3dpZHRoOiBtaW4tY29udGVudDsnKVxuXG5cdFx0XHRpZihpID09PSAwKSB7XG5cdFx0XHRcdHRoaXMuX3RvdGFsV2lkdGggPSBmaXJzdERpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIF9yZXNldFNjcm9sbFBvc2l0aW9uKCkge1xuXHRcdGlmKHRoaXMuc2Nyb2xsQ29udGFpbmVyKSB7XG5cdFx0XHR0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAwO1xuXHRcdH1cblxuXHRcdHRoaXMucmVhY2hlZFNjcm9sbFN0YXJ0JC5uZXh0KHRydWUpXG5cdFx0dGhpcy5yZWFjaGVkU2Nyb2xsRW5kJC5uZXh0KGZhbHNlKTtcblx0fVxuXG5cdHByaXZhdGUgX2NhbGN1bGF0ZVNjcm9sbFBvc2l0aW9uKHsgdGFyZ2V0IH06IHsgdGFyZ2V0OiBIVE1MRGl2RWxlbWVudCB9KSB7XG5cdFx0dGhpcy5yZWFjaGVkU2Nyb2xsU3RhcnQkLm5leHQodGFyZ2V0LnNjcm9sbExlZnQgPCAxMDApO1xuXG5cdFx0Y29uc3QgcmlnaHQgPSB0YXJnZXQuc2Nyb2xsTGVmdCArIHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblx0XHR0aGlzLnJlYWNoZWRTY3JvbGxFbmQkLm5leHQocmlnaHQgPiB0aGlzLl90b3RhbFdpZHRoIC0gMTAwKVxuXHR9XG5cdH1cbiIsIjxwLXRhYmxlLWNvbnRhaW5lcj5cblx0PHAtdGFibGUtaGVhZGVyXG5cdFx0Km5nSWY9XCJlbmFibGVIZWFkZXJcIlxuXHRcdGNsYXNzPVwibWItOFwiXG5cdFx0W3F1aWNrRmlsdGVyc109XCJxdWlja0ZpbHRlcnNcIlxuXHRcdFthY3RpdmVRdWlja0ZpbHRlcklkZW50aWZpZXJdPVwiYWN0aXZlUXVpY2tGaWx0ZXJJZGVudGlmaWVyXCJcblx0XHQocXVpY2tGaWx0ZXIpPVwib25RdWlja0ZpbHRlcigkZXZlbnQpXCJcblx0XHRbZW5hYmxlU2VhcmNoXT1cImVuYWJsZVNlYXJjaFwiXG5cdFx0W3F1ZXJ5XT1cInF1ZXJ5XCJcblx0XHQocXVlcnlDaGFuZ2UpPVwib25RdWVyeUNoYW5nZSgkZXZlbnQpXCJcblx0XHRbZW5hYmxlRmlsdGVyXT1cImVuYWJsZUZpbHRlclwiXG5cdFx0W2VuYWJsZUZpbHRlckRlc2t0b3BdPVwiZW5hYmxlRmlsdGVyRGVza3RvcFwiXG5cdFx0W3NlbGVjdGVkRmlsdGVyc0Ftb3VudF09XCJzZWxlY3RlZEZpbHRlcnNBbW91bnRcIlxuXHRcdFtmaWx0ZXJCdXR0b25UZW1wbGF0ZV09XCJmaWx0ZXJCdXR0b25UZW1wbGF0ZVwiXG5cdFx0KGZpbHRlcik9XCJmaWx0ZXJNb2RhbFNob3ckLm5leHQodHJ1ZSlcIlxuXHRcdFtlbmFibGVBY3Rpb25dPVwiZW5hYmxlQWN0aW9uXCJcblx0XHRbY2FuVXNlQWN0aW9uXT1cImFjdGlvbkJ1dHRvbkVuYWJsZWRcIlxuXHRcdFthY3Rpb25CdXR0b25UZW1wbGF0ZV09XCJhY3Rpb25CdXR0b25UZW1wbGF0ZVwiXG5cdFx0W2FjdGlvbkxvYWRpbmddPVwiYWN0aW9uQnV0dG9uTG9hZGluZ1wiXG5cdFx0W2FjdGlvblRleHRdPVwiYWN0aW9uQnV0dG9uVGV4dFwiXG5cdFx0W2FjdGlvbkljb25dPVwiYWN0aW9uQnV0dG9uSWNvblwiXG5cdFx0KGFjdGlvbik9XCJhY3Rpb24uZW1pdCgpXCJcblx0XHRbaXRlbXNTZWxlY3RlZEFtb3VudF09XCJzZWxlY3RlZFJvd3MubGVuZ3RoXCJcblx0XHRbZW5hYmxlRXhwb3J0XT1cImVuYWJsZUV4cG9ydFwiXG5cdFx0KGV4cG9ydCk9XCJleHBvcnQuZW1pdCgpXCJcblx0XHRbbG9hZGluZ109XCJoZWFkZXJMb2FkaW5nXCJcblx0PlxuXHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJoZWFkZXJDdXN0b21GaWx0ZXJUZW1wbGF0ZVwiPlxuXHRcdFx0PG5nLWNvbnRhaW5lclxuXHRcdFx0XHQqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlckN1c3RvbUZpbHRlclRlbXBsYXRlXCJcblx0XHRcdD48L25nLWNvbnRhaW5lcj5cblx0XHQ8L25nLWNvbnRhaW5lcj5cblxuXHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJoZWFkZXJDdXN0b21BY3Rpb25zVGVtcGxhdGVcIj5cblx0XHRcdDxuZy1jb250YWluZXJcblx0XHRcdFx0Km5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJDdXN0b21BY3Rpb25zVGVtcGxhdGVcIlxuXHRcdFx0PjwvbmctY29udGFpbmVyPlxuXHRcdDwvbmctY29udGFpbmVyPlxuXHQ8L3AtdGFibGUtaGVhZGVyPlxuXG5cdDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4LTFcIiAqbmdJZj1cImVuYWJsZVNjcm9sbDsgZWxzZSByb3dzVGVtcGxhdGVcIj5cblx0XHQ8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBvdmVyZmxvdy14LWF1dG9cIlxuXHRcdFx0I3Njcm9sbENvbnRhaW5lclxuXHRcdFx0W2NsYXNzXT1cImNuKFxuXHRcdFx0XHQnYmVmb3JlOmFic29sdXRlIGJlZm9yZTp0b3AtMCBiZWZvcmU6bGVmdC0wIGJlZm9yZTp6LVsxXSBiZWZvcmU6cG9pbnRlci1ldmVudHMtbm9uZScsXG5cdFx0XHRcdCdiZWZvcmU6dy1bMTAlXSBiZWZvcmU6aC1mdWxsIGJlZm9yZTp0cmFuc2l0aW9uLW9wYWNpdHknLFxuXHRcdFx0XHQnYmVmb3JlOmJnLWdyYWRpZW50LXRvLXIgYmVmb3JlOmZyb20td2hpdGUgYmVmb3JlOnZpYS13aGl0ZS84MCBiZWZvcmU6dG8tdHJhbnNwYXJlbnQnLFxuXG5cdFx0XHRcdCdhZnRlcjphYnNvbHV0ZSBhZnRlcjp0b3AtMCBhZnRlcjpyaWdodC0wIGFmdGVyOnotWzBdIGJlZm9yZTpwb2ludGVyLWV2ZW50cy1ub25lJyxcblx0XHRcdFx0J2FmdGVyOnctWzEwJV0gYWZ0ZXI6aC1mdWxsIGFmdGVyOnRyYW5zaXRpb24tb3BhY2l0eScsXG5cdFx0XHRcdCdhZnRlcjpiZy1ncmFkaWVudC10by1sIGFmdGVyOmZyb20td2hpdGUgYWZ0ZXI6dmlhLXdoaXRlLzgwIGFmdGVyOnRvLXRyYW5zcGFyZW50JyxcblxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0J2JlZm9yZTpvcGFjaXR5LTAnOiByZWFjaGVkU2Nyb2xsU3RhcnQkIHwgYXN5bmMsXG5cdFx0XHRcdFx0J2FmdGVyOm9wYWNpdHktMCc6IHJlYWNoZWRTY3JvbGxFbmQkIHwgYXN5bmMsXG5cdFx0XHRcdFx0J2JlZm9yZTpvcGFjaXR5LTEwMCc6IChyZWFjaGVkU2Nyb2xsU3RhcnQkIHwgYXN5bmMpID09PSBmYWxzZSxcblx0XHRcdFx0XHQnYWZ0ZXI6b3BhY2l0eS0xMDAnOiAocmVhY2hlZFNjcm9sbEVuZCQgfCBhc3luYykgPT09IGZhbHNlLFxuXHRcdFx0XHR9XG5cdFx0XHQpXCJcblx0XHRcdChzY3JvbGwpPVwib25Db250YWluZXJYU2Nyb2xsKCRldmVudClcIlxuXHRcdD5cblx0XHRcdDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyb3dzVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG5cblx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImVuYWJsZUZsb2F0aW5nTWVudSAmJiBlbmFibGVSb3dTZWxlY3Rpb25cIj5cblx0XHQ8cC1mbG9hdGluZy1tZW51LWNvbnRhaW5lclxuXHRcdFx0W3VzZWRJblRhYmxlXT1cInRydWVcIlxuXHRcdFx0W2NsYXNzXT1cIlxuXHRcdFx0XHRmbG9hdGluZ01lbnVDb250YWluZXJDbGFzcyh7XG5cdFx0XHRcdFx0aGFzRm9vdGVyOiBlbmFibGVGb290ZXIgJiYgKGZvb3RlckhpZGRlbiQgfCBhc3luYykgPT09IGZhbHNlLFxuXHRcdFx0XHRcdGFjdGl2ZTogc2VsZWN0ZWRSb3dzLmxlbmd0aCA+IDAsXG5cdFx0XHRcdFx0c2hvd246ICRhbnkoZmxvYXRpbmdNZW51U2hvd24kIHwgYXN5bmMpXG5cdFx0XHRcdH0pXG5cdFx0XHRcIlxuXHRcdFx0W2Ftb3VudF09XCJmbG9hdGluZ01lbnVBbW91bnRTZWxlY3RlZFRleHRcIlxuXHRcdFx0W2VuYWJsZUFtb3VudFNlbGVjdGVkXT1cIiEhKHJvd0FjdGlvbnNGbG9hdGluZyQgfCBhc3luYyk/Lmxlbmd0aFwiXG5cdFx0XHQoY2xvc2UpPVwiX3NlbGVjdEFsbENoYW5nZShudWxsLCBmYWxzZSlcIlxuXHRcdD5cblx0XHRcdDxwLWZsb2F0aW5nLW1lbnUtaXRlbVxuXHRcdFx0XHQqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIHJvd0FjdGlvbnNGbG9hdGluZyQgfCBhc3luY1wiXG5cdFx0XHRcdHNsb3Q9XCJmbG9hdGluZy1tZW51LWl0ZW1cIlxuXHRcdFx0XHRbZGlzYWJsZWRdPVwiXG5cdFx0XHRcdFx0KGFjdGlvblsndHlwZSddID09PSAnc2luZ2xlJyAmJiBzZWxlY3RlZFJvd3MubGVuZ3RoID4gMSkgfHxcblx0XHRcdFx0XHRhY3Rpb25bJ2Rpc2FibGVkJ11cblx0XHRcdFx0XCJcblx0XHRcdFx0W2xvYWRpbmddPVwiYWN0aW9uWydsb2FkaW5nJ11cIlxuXHRcdFx0XHRbaWNvbl09XCJhY3Rpb25bJ2ljb24nXVwiXG5cdFx0XHRcdFtpY29uUm90YXRlXT1cImFjdGlvblsnaWNvblJvdGF0ZSddXCJcblx0XHRcdFx0W2ljb25GbGlwXT1cImFjdGlvblsnaWNvbkZsaXAnXVwiXG5cdFx0XHRcdChjbGljayk9XCJfcm93QWN0aW9uQ2xpY2soYWN0aW9uKVwiXG5cdFx0XHQ+XG5cdFx0XHRcdHt7IGFjdGlvblsnbGFiZWwnXSB9fVxuXHRcdFx0PC9wLWZsb2F0aW5nLW1lbnUtaXRlbT5cblx0XHQ8L3AtZmxvYXRpbmctbWVudS1jb250YWluZXI+XG5cdDwvbmctY29udGFpbmVyPlxuXG5cdDxwLXRhYmxlLWZvb3RlclxuXHRcdCpuZ0lmPVwiZW5hYmxlRm9vdGVyXCJcblx0XHRbaGlkZU9uU2luZ2xlUGFnZV09XCJoaWRlT25TaW5nbGVQYWdlXCJcblx0XHRbZW5hYmxlUGFnaW5hdGlvblNpemVdPVwiZW5hYmxlUGFnaW5hdGlvblNpemVcIlxuXHRcdFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG5cdFx0W3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIlxuXHRcdChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIlxuXHRcdFtlbmFibGVQYWdpbmF0aW9uUGFnZXNdPVwiZW5hYmxlUGFnaW5hdGlvblBhZ2VzXCJcblx0XHRbcGFnZV09XCJwYWdlXCJcblx0XHRbdG90YWxdPVwidG90YWxcIlxuXHRcdChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcblx0XHRbbG9hZGluZ109XCJmb290ZXJMb2FkaW5nXCJcblx0XHQoaGlkZGVuQ2hhbmdlKT1cImZvb3RlckhpZGRlbiQubmV4dCgkZXZlbnQuZGV0YWlsKVwiXG5cdD48L3AtdGFibGUtZm9vdGVyPlxuPC9wLXRhYmxlLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNyb3dzVGVtcGxhdGU+XG5cdDxwLXRhYmxlLXJvdyB2YXJpYW50PVwiaGVhZGVyXCI+XG5cdFx0PG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnM7IGxldCBpbmRleCA9IGluZGV4XCI+XG5cdFx0XHQ8cC10YWJsZS1jZWxsLW5neFxuXHRcdFx0XHRbZGVmaW5pdGlvbl09XCJjb2xcIlxuXHRcdFx0XHRbdmFsdWVdPVwiY29sLm5hbWVcIlxuXHRcdFx0XHR2YXJpYW50PVwiaGVhZGVyXCJcblx0XHRcdFx0W2luZGV4XT1cImluZGV4XCJcblx0XHRcdFx0W2NoZWNrYm94XT1cIlxuXHRcdFx0XHRcdChpbmRleCA9PT0gMCB8fCBjb2wuaGFzQ2hlY2tib3gpICYmIGVuYWJsZVJvd1NlbGVjdGlvblxuXHRcdFx0XHRcdFx0PyBjaGVja2JveFRlbXBsYXRlXG5cdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdFx0XHRcIlxuXHRcdFx0PjwvcC10YWJsZS1jZWxsLW5neD5cblx0XHRcdDxuZy10ZW1wbGF0ZSAjY2hlY2tib3hUZW1wbGF0ZT5cblx0XHRcdFx0PHAtY2hlY2tib3hcblx0XHRcdFx0XHQoY2hlY2tlZENoYW5nZSk9XCJfc2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIlxuXHRcdFx0XHRcdFtjaGVja2VkXT1cIl9zZWxlY3Rpb25Db250YWluc0FsbCgpXCJcblx0XHRcdFx0XHRbaW5kZXRlcm1pbmF0ZV09XCJfc2VsZWN0aW9uSW5kZXRlcm1pbmF0ZSgpXCJcblx0XHRcdFx0XHRbY2xhc3Mub3BhY2l0eS0wXT1cInJvd1NlbGVjdGlvbkxpbWl0ICE9PSB1bmRlZmluZWRcIlxuXHRcdFx0XHRcdFtkaXNhYmxlZF09XCJyb3dTZWxlY3Rpb25MaW1pdCAhPT0gdW5kZWZpbmVkXCJcblx0XHRcdFx0PjwvcC1jaGVja2JveD5cblx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0PC9uZy1jb250YWluZXI+XG5cdDwvcC10YWJsZS1yb3c+XG5cblx0PGRpdiBjbGFzcz1cImZsZXggZmxleC0xIGZsZXgtY29sXCI+XG5cdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmc7IGVsc2UgY29udGVudFRlbXBsYXRlXCI+XG5cdFx0XHQ8cC10YWJsZS1yb3dcblx0XHRcdFx0Km5nRm9yPVwibGV0IHIgb2YgbG9hZGluZ1Jvd3M7IGxldCByb3dJbmRleCA9IGluZGV4XCJcblx0XHRcdFx0W2VuYWJsZUhvdmVyXT1cImVuYWJsZVJvd1NlbGVjdGlvbiB8fCBlbmFibGVSb3dDbGlja1wiXG5cdFx0XHQ+XG5cdFx0XHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zOyBsZXQgaW5kZXggPSBpbmRleFwiPlxuXHRcdFx0XHRcdDxwLXRhYmxlLWNlbGwtbmd4XG5cdFx0XHRcdFx0XHRbZGVmaW5pdGlvbl09XCJjb2xcIlxuXHRcdFx0XHRcdFx0dmFyaWFudD1cImxvYWRpbmdcIlxuXHRcdFx0XHRcdFx0W2NoZWNrYm94XT1cIlxuXHRcdFx0XHRcdFx0XHQoaW5kZXggPT09IDAgfHwgY29sLmhhc0NoZWNrYm94KSAmJiBlbmFibGVSb3dTZWxlY3Rpb25cblx0XHRcdFx0XHRcdFx0XHQ/IGNoZWNrYm94VGVtcGxhdGVcblx0XHRcdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0XCJcblx0XHRcdFx0XHRcdFtpbmRleF09XCJpbmRleFwiXG5cdFx0XHRcdFx0XHRbcm93SW5kZXhdPVwicm93SW5kZXhcIlxuXHRcdFx0XHRcdD48L3AtdGFibGUtY2VsbC1uZ3g+XG5cdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNjaGVja2JveFRlbXBsYXRlPlxuXHRcdFx0XHRcdFx0PHAtbG9hZGVyXG5cdFx0XHRcdFx0XHRcdHZhcmlhbnQ9XCJnaG9zdFwiXG5cdFx0XHRcdFx0XHRcdGNsYXNzPVwiaC02IHctNiByb3VuZGVkXCJcblx0XHRcdFx0XHRcdD48L3AtbG9hZGVyPlxuXHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0XHRcdDwvbmctY29udGFpbmVyPlxuXHRcdFx0PC9wLXRhYmxlLXJvdz5cblx0XHQ8L25nLWNvbnRhaW5lcj5cblxuXHRcdDxuZy10ZW1wbGF0ZSAjY29udGVudFRlbXBsYXRlPlxuXHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cInBhcnNlZEl0ZW1zPy5sZW5ndGg7IGVsc2UgZW1wdHlTdGF0ZVRlbXBsYXRlXCI+XG5cdFx0XHRcdDxwLXRhYmxlLXJvd1xuXHRcdFx0XHRcdCpuZ0Zvcj1cImxldCBpdGVtIG9mIHBhcnNlZEl0ZW1zOyBsZXQgcm93SW5kZXggPSBpbmRleFwiXG5cdFx0XHRcdFx0W2VuYWJsZUhvdmVyXT1cImVuYWJsZVJvd1NlbGVjdGlvbiB8fCBlbmFibGVSb3dDbGlja1wiXG5cdFx0XHRcdFx0KGNsaWNrKT1cIl9yb3dDbGljaygkZXZlbnQsIHJvd0luZGV4KVwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8bmctY29udGFpbmVyXG5cdFx0XHRcdFx0XHQqbmdJZj1cIlxuXHRcdFx0XHRcdFx0XHRwYXJzZVJvd0FjdGlvbnNSb3coXG5cdFx0XHRcdFx0XHRcdFx0cm93QWN0aW9uc1JvdyQgfCBhc3luYyxcblx0XHRcdFx0XHRcdFx0XHRyb3dJbmRleFxuXHRcdFx0XHRcdFx0XHQpIGFzIHJvd0FjdGlvbnNSb3dcblx0XHRcdFx0XHRcdFwiXG5cdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnM7IGxldCBpbmRleCA9IGluZGV4XCI+XG5cdFx0XHRcdFx0XHRcdDxwLXRhYmxlLWNlbGwtbmd4XG5cdFx0XHRcdFx0XHRcdFx0W2RlZmluaXRpb25dPVwiY29sXCJcblx0XHRcdFx0XHRcdFx0XHRbaXRlbV09XCJpdGVtXCJcblx0XHRcdFx0XHRcdFx0XHRbY2hlY2tib3hdPVwiXG5cdFx0XHRcdFx0XHRcdFx0XHQoaW5kZXggPT09IDAgfHwgY29sLmhhc0NoZWNrYm94KSAmJiBlbmFibGVSb3dTZWxlY3Rpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0PyBjaGVja2JveFRlbXBsYXRlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDogdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdFx0XCJcblx0XHRcdFx0XHRcdFx0XHRbaW5kZXhdPVwiaW5kZXhcIlxuXHRcdFx0XHRcdFx0XHRcdFtyb3dJbmRleF09XCJyb3dJbmRleFwiXG5cdFx0XHRcdFx0XHRcdFx0W3RlbXBsYXRlXT1cImNvbC50ZW1wbGF0ZVwiXG5cdFx0XHRcdFx0XHRcdD48L3AtdGFibGUtY2VsbC1uZ3g+XG5cblx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNjaGVja2JveFRlbXBsYXRlPlxuXHRcdFx0XHRcdFx0XHRcdDxwLWNoZWNrYm94XG5cdFx0XHRcdFx0XHRcdFx0XHQoY2hlY2tlZENoYW5nZSk9XCJfY2hlY2tib3hDaGFuZ2UoJGV2ZW50LnRhcmdldCwgcm93SW5kZXgpXCJcblx0XHRcdFx0XHRcdFx0XHRcdFtkaXNhYmxlZF09XCJfY2hlY2tib3hEaXNhYmxlZChpdGVtLCByb3dJbmRleClcIlxuXHRcdFx0XHRcdFx0XHRcdFx0W2NoZWNrZWRdPVwiX3NlbGVjdGlvbkNvbnRhaW5zKGl0ZW0sIHJvd0luZGV4KVwiXG5cdFx0XHRcdFx0XHRcdFx0PjwvcC1jaGVja2JveD5cblx0XHRcdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxuXG5cdFx0XHRcdFx0XHQ8cC10YWJsZS1yb3ctYWN0aW9ucy1jb250YWluZXJcblx0XHRcdFx0XHRcdFx0Km5nSWY9XCIhIXJvd0FjdGlvbnNSb3c/Lmxlbmd0aCAmJiAhKGlzTW9iaWxlJCB8IGFzeW5jKVwiXG5cdFx0XHRcdFx0XHRcdHNsb3Q9XCJhY3Rpb25zXCJcblx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIHJvd0FjdGlvbnNSb3dcIj5cblx0XHRcdFx0XHRcdFx0XHQ8cC10b29sdGlwXG5cdFx0XHRcdFx0XHRcdFx0XHQqbmdJZj1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhY3Rpb24uc2hvd0Z1bmN0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyBhY3Rpb24uc2hvd0Z1bmN0aW9uKHBhcnNlZEl0ZW1zW3Jvd0luZGV4XSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRbY29udGVudF09XCJhY3Rpb25bJ2xhYmVsJ11cIlxuXHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdDxwLWJ1dHRvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhLWlzLWFjdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXJpYW50PVwic2Vjb25kYXJ5XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0c2xvdD1cInRyaWdnZXJcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRbaWNvbl09XCJhY3Rpb25bJ2ljb24nXVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFtpY29uUm90YXRlXT1cImFjdGlvblsnaWNvblJvdGF0ZSddXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWNvbkZsaXA9XCJhY3Rpb24uaWNvbkZsaXBcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpY29uT25seT1cInRydWVcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzaXplPVwic21cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRbbG9hZGluZ109XCJhY3Rpb25bJ2xvYWRpbmcnXVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFtkaXNhYmxlZF09XCJhY3Rpb25bJ2Rpc2FibGVkJ11cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRbcm91dGVyTGlua109XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhY3Rpb24ucm91dGVyTGlua1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoX2dldEFjdGlvblJvdXRlckxpbmsoYWN0aW9uLnJvdXRlckxpbmssIHJvd0luZGV4KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICB8IGFzeW5jKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiBudWxsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFtxdWVyeVBhcmFtc109XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhY3Rpb24ucXVlcnlQYXJhbXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gKF9nZXRBY3Rpb25RdWVyeVBhcmFtcyhhY3Rpb24ucXVlcnlQYXJhbXMsIHJvd0luZGV4KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICB8IGFzeW5jKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiBudWxsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdChvbkNsaWNrKT1cIl9yb3dBY3Rpb25DbGljayhhY3Rpb24sIHJvd0luZGV4KVwiXG5cdFx0XHRcdFx0XHRcdFx0XHQ+PC9wLWJ1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHQ8L3AtdG9vbHRpcD5cblx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XG5cdFx0XHRcdFx0XHQ8L3AtdGFibGUtcm93LWFjdGlvbnMtY29udGFpbmVyPlxuXHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxuXHRcdFx0XHQ8L3AtdGFibGUtcm93PlxuXHRcdFx0PC9uZy1jb250YWluZXI+XG5cdFx0PC9uZy10ZW1wbGF0ZT5cblx0PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyTW9kYWxUZW1wbGF0ZVwiPlxuXHQ8cC1tb2RhbFxuXHRcdFtoZWFkZXJdPVwiZmlsdGVyTW9kYWxIZWFkZXJUZXh0XCJcblx0XHRbc2hvd109XCJmaWx0ZXJNb2RhbFNob3ckIHwgYXN5bmNcIlxuXHRcdChjbG9zZWQpPVwiZmlsdGVyTW9kYWxTaG93JC5uZXh0KGZhbHNlKVwiXG5cdD5cblx0XHQ8ZGl2XG5cdFx0XHRzbG90PVwiY29udGVudFwiXG5cdFx0XHRjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTZcIlxuXHRcdD5cblx0XHRcdDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaWx0ZXJNb2RhbFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG5cdFx0PC9kaXY+XG5cdFx0PGRpdlxuXHRcdFx0c2xvdD1cImZvb3RlclwiXG5cdFx0XHRjbGFzcz1cImZsZXggdy1mdWxsIGp1c3RpZnktYmV0d2VlbiBnYXAtNFwiXG5cdFx0PlxuXHRcdFx0PHAtYnV0dG9uXG5cdFx0XHRcdCpuZ0lmPVwiZmlsdGVyTW9kYWxTaG93UmVzZXRNb2JpbGVcIlxuXHRcdFx0XHRjbGFzcz1cImZsZXggdy1mdWxsIHRhYmxldDp3LWF1dG8gZGVza3RvcC14czpoaWRkZW5cIlxuXHRcdFx0XHR2YXJpYW50PVwic2Vjb25kYXJ5XCJcblx0XHRcdFx0KG9uQ2xpY2spPVwib25GaWx0ZXJNb2RhbFJlc2V0KHRydWUpXCJcblx0XHRcdD5cblx0XHRcdFx0e3sgZmlsdGVyTW9kYWxSZXNldFRleHQgfX1cblx0XHRcdDwvcC1idXR0b24+XG5cdFx0XHQ8cC1idXR0b25cblx0XHRcdFx0Km5nSWY9XCJmaWx0ZXJNb2RhbFNob3dSZXNldFwiXG5cdFx0XHRcdGNsYXNzPVwiaGlkZGVuIHctZnVsbCB0YWJsZXQ6dy1hdXRvIGRlc2t0b3AteHM6ZmxleFwiXG5cdFx0XHRcdHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuXHRcdFx0XHQob25DbGljayk9XCJvbkZpbHRlck1vZGFsUmVzZXQoKVwiXG5cdFx0XHQ+XG5cdFx0XHRcdHt7IGZpbHRlck1vZGFsUmVzZXRUZXh0IH19XG5cdFx0XHQ8L3AtYnV0dG9uPlxuXHRcdFx0PHAtYnV0dG9uXG5cdFx0XHRcdGNsYXNzPVwibWwtYXV0byB3LWZ1bGwgdGFibGV0OnctYXV0b1wiXG5cdFx0XHRcdGljb249XCJjaGVja21hcmtcIlxuXHRcdFx0XHQob25DbGljayk9XCJvbkZpbHRlck1vZGFsU2F2ZSgpXCJcblx0XHRcdD5cblx0XHRcdFx0e3sgZmlsdGVyTW9kYWxTYXZlVGV4dCB9fVxuXHRcdFx0PC9wLWJ1dHRvbj5cblx0XHQ8L2Rpdj5cblx0PC9wLW1vZGFsPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjZW1wdHlTdGF0ZVRlbXBsYXRlPlxuXHQ8cC1lbXB0eS1zdGF0ZVxuXHRcdCpuZ0lmPVwiZW1wdHlTdGF0ZVR5cGUgPT09ICdmaWx0ZXJlZCc7IGVsc2UgZW1wdHlTdGF0ZU5vbkZpbHRlclRlbXBsYXRlXCJcblx0XHRjbGFzcz1cIm15LTE2IHNlbGYtY2VudGVyXCJcblx0XHRbaWxsdXN0cmF0aW9uXT1cImVtcHR5U3RhdGVGaWx0ZXJlZElsbHVzdHJhdGlvblwiXG5cdFx0W2hlYWRlcl09XCJlbXB0eVN0YXRlRmlsdGVyZWRIZWFkZXJcIlxuXHRcdFtjb250ZW50XT1cImVtcHR5U3RhdGVGaWx0ZXJlZENvbnRlbnRcIlxuXHQ+PC9wLWVtcHR5LXN0YXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNlbXB0eVN0YXRlTm9uRmlsdGVyVGVtcGxhdGU+XG5cdDxwLWVtcHR5LXN0YXRlXG5cdFx0Y2xhc3M9XCJteS0xNiBzZWxmLWNlbnRlclwiXG5cdFx0W2lsbHVzdHJhdGlvbl09XCJlbXB0eVN0YXRlSWxsdXN0cmF0aW9uXCJcblx0XHRbaGVhZGVyXT1cImVtcHR5U3RhdGVIZWFkZXJcIlxuXHRcdFtjb250ZW50XT1cImVtcHR5U3RhdGVDb250ZW50XCJcblx0XHRbZW5hYmxlQWN0aW9uXT1cImVuYWJsZUVtcHR5U3RhdGVBY3Rpb25cIlxuXHRcdFthY3Rpb25UZXh0XT1cImVtcHR5U3RhdGVBY3Rpb25cIlxuXHRcdFthY3Rpb25JY29uXT1cImVtcHR5U3RhdGVBY3Rpb25JY29uXCJcblx0XHQoYWN0aW9uKT1cImVtcHR5U3RhdGVDbGlja2VkKClcIlxuXHQ+PC9wLWVtcHR5LXN0YXRlPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
961
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGFwZXJsZXNzL3NyYy9saWIvbW9kdWxlcy90YWJsZS9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhcGVybGVzcy9zcmMvbGliL21vZHVsZXMvdGFibGUvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNOLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFHTixXQUFXLEVBQ1gsWUFBWSxFQUNaLFNBQVMsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JFLE9BQU8sRUFDTixRQUFRLEVBR1Isc0JBQXNCLEVBQ3RCLDBCQUEwQixFQUMxQixFQUFFLEdBQ0YsTUFBTSxpQkFBaUIsQ0FBQztBQU16QixPQUFPLEVBQ04sZUFBZSxFQUNmLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsTUFBTSxFQUVOLElBQUksR0FDSixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFDTiwyQkFBMkIsRUFDM0IsMEJBQTBCLEVBQzFCLHlCQUF5QixHQUN6QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNyRSxPQUFPLEVBRU4sY0FBYyxHQUdkLE1BQU0sZ0RBQWdELENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM5RCxPQUFPLEVBQUUs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QkFBNUIsS0FBSztnQkFFRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csMEJBQTBCO3NCQUFsQyxLQUFLO2dCQUVJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBOEVQLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBT3pDLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFVNUMsS0FBSztzQkFESixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVUxQyxnQkFBZ0I7c0JBRGYsWUFBWTt1QkFBQywyQkFBMkIsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuXHRDaGFuZ2VEZXRlY3RvclJlZixcblx0Q29tcG9uZW50LFxuXHRDb250ZW50Q2hpbGQsXG5cdENvbnRlbnRDaGlsZHJlbixcblx0RWxlbWVudFJlZixcblx0RXZlbnRFbWl0dGVyLFxuXHRIb3N0QmluZGluZyxcblx0SG9zdExpc3RlbmVyLFxuXHRJbnB1dCxcblx0T25DaGFuZ2VzLFxuXHRPbkluaXQsXG5cdE91dHB1dCxcblx0UXVlcnlMaXN0LFxuXHRTaW1wbGVDaGFuZ2VzLFxuXHRUZW1wbGF0ZVJlZixcblx0Vmlld0NoaWxkcmVuLFxuXHRWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFVudGlsRGVzdHJveSwgdW50aWxEZXN0cm95ZWQgfSBmcm9tICdAbmduZWF0L3VudGlsLWRlc3Ryb3knO1xuaW1wb3J0IHtcblx0aXNNb2JpbGUsXG5cdFF1aWNrRmlsdGVyLFxuXHRSb3dDbGlja0V2ZW50LFxuXHR0YWJsZUNvbHVtU2l6ZXNPcHRpb25zLFxuXHRmbG9hdGluZ01lbnVDb250YWluZXJDbGFzcyxcblx0Y24sXG59IGZyb20gJ0BwYXBlcmxlc3MvY29yZSc7XG5pbXBvcnQge1xuXHRJY29uVmFyaWFudCxcblx0SWxsdXN0cmF0aW9uVmFyaWFudCxcblx0VGFibGVDb2x1bW5TaXplcyxcbn0gZnJvbSAnQHBhcGVybGVzcy9jb3JlL2Rpc3QvdHlwZXMvY29tcG9uZW50cyc7XG5pbXBvcnQge1xuXHRCZWhhdmlvclN1YmplY3QsXG5cdGRlYm91bmNlVGltZSxcblx0ZGlzdGluY3RVbnRpbENoYW5nZWQsXG5cdGZpbHRlcixcblx0U3Vic2NyaXB0aW9uLFxuXHR0YWtlLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG5cdFRhYmxlQ3VzdG9tQWN0aW9uc0RpcmVjdGl2ZSxcblx0VGFibGVDdXN0b21GaWx0ZXJEaXJlY3RpdmUsXG5cdFRhYmxlRmlsdGVyTW9kYWxEaXJlY3RpdmUsXG59IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tICcuLi90YWJsZS1jb2x1bW4vdGFibGUtY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuXHRBc3luY0l0ZW0sXG5cdFRhYmxlUm93QWN0aW9uLFxuXHRUYWJsZVJvd0FjdGlvblF1ZXJ5UGFyYW1zLFxuXHRUYWJsZVJvd0FjdGlvblJvdXRlckxpbmssXG59IGZyb20gJy4uL3RhYmxlLXJvdy1hY3Rpb24vdGFibGUtcm93LWFjdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgZGVmYXVsdFNpemUsIGRlZmF1bHRTaXplT3B0aW9ucyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IFRhYmxlQ2VsbCB9IGZyb20gJy4uL3RhYmxlLWNlbGwvdGFibGUtY2VsbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUFRhYmxlUm93IH0gZnJvbSAnLi4vLi4vLi4vLi4vc3RlbmNpbC9jb21wb25lbnRzJztcbmltcG9ydCB7IFRhYmxlQ3VzdG9tUm93RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9wLXRhYmxlLWN1c3RvbS1yb3cuZGlyZWN0aXZlJztcblxuQFVudGlsRGVzdHJveSh7IGNoZWNrUHJvcGVydGllczogdHJ1ZSB9KVxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAncC10YWJsZS1uZ3gnLFxuXHR0ZW1wbGF0ZVVybDogJ3RhYmxlLmNvbXBvbmVudC5odG1sJyxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXHRASG9zdEJpbmRpbmcoJ2NsYXNzJykgY2xhc3NOYW1lID0gJ2ZsZXggZmxleC1jb2wgei0wJztcblxuXHQvKipcblx0ICogVGhlIGl0ZW1zIHRvIGJlIGZlZCB0byB0aGUgdGFibGVcblx0ICovXG5cdEBJbnB1dCgpIGl0ZW1zITogc3RyaW5nIHwgYW55W107XG5cblx0LyoqXG5cdCAqIFdldGhlciBkYXRhIGlzIGxvYWRpbmdcblx0ICovXG5cdEBJbnB1dCgpIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHQvKipcblx0ICogV2V0aGVyIHRoZSBoZWFkZXIgc2hvdWxkIHNob3cgbG9hZGluZyBzdGF0ZVxuXHQgKi9cblx0QElucHV0KCkgaGVhZGVyTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdGhlIGZvb3RlciBzaG91bGQgc2hvdyBsb2FkaW5nIHN0YXRlXG5cdCAqL1xuXHRASW5wdXQoKSBmb290ZXJMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIFRoZSBhbW91bnQgb2YgbG9hZGluZyByb3dzIHRvIHNob3dcblx0ICovXG5cdEBJbnB1dCgpIGFtb3VudE9mTG9hZGluZ1Jvd3M6IG51bWJlciA9IDY7XG5cblx0LyoqXG5cdCAqIFdldGhlciB0byBlbmFibGUgc2VsZWN0aW9uXG5cdCAqL1xuXHRASW5wdXQoKSBlbmFibGVSb3dTZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuXG5cdC8qKlxuXHQgKiBBIGxpbWl0IHRvIHRoZSBhbW91bnQgb2Ygcm93cyB0aGF0IGNhbiBiZSBzZWxlY3RlZFxuXHQgKi9cblx0QElucHV0KCkgcm93U2VsZWN0aW9uTGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogV2V0aGVyIHRvIGVuYWJsZSByb3cgY2xpY2tpbmdcblx0ICovXG5cdEBJbnB1dCgpIGVuYWJsZVJvd0NsaWNrOiBib29sZWFuID0gdHJ1ZTtcblxuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9mIGl0ZW1zXG5cdCAqL1xuXHRASW5wdXQoKSBzZWxlY3RlZFJvd3M6IGFueVtdID0gW107XG5cblx0LyoqXG5cdCAqIEV2ZW50IHdoZW5ldmVyIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBjaGFuZ2VzXG5cdCAqL1xuXHRAT3V0cHV0KCkgc2VsZWN0ZWRSb3dzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKipcblx0ICogVGhlIGtleSB0byBkZXRlcm1pbmUgaWYgYSByb3cgaXMgc2VsZWN0ZWRcblx0ICovXG5cdEBJbnB1dCgpIHNlbGVjdGlvbktleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBBIGtleSB0byBkZXRlcm1pbmUgaWYgYSByb3cgY2FuIGJlIHNlbGVjdGVkXG5cdCAqL1xuXHRASW5wdXQoKSBjYW5TZWxlY3RLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogV2V0aGVyIHRvIGVuYWJsZSB0aGUgZmxvYXRpbmcgbWVudVxuXHQgKi9cblx0QElucHV0KCkgZW5hYmxlRmxvYXRpbmdNZW51OiBib29sZWFuID0gdHJ1ZTtcblxuXHQvKipcblx0ICogVGhlIGZsb2F0aW5nIG1lbnUgYW1vdW50IGl0ZW0gdGV4dFxuXHQgKi9cblx0QElucHV0KCkgZmxvYXRpbmdNZW51QW1vdW50U2VsZWN0ZWRUZXh0OiBzdHJpbmcgPSAnMCBpdGVtcyBzZWxlY3RlZCc7XG5cblx0LyoqXG5cdCAqIFRoZSB0ZW1wbGF0ZSBmb3IgYW1vdW50IHNlbGVjdGVkIGl0ZW0gaW4gdGhlIGZsb2F0aW5nIG1lbnVcblx0ICovXG5cdEBJbnB1dCgpIGZsb2F0aW5nTWVudUFtb3VudFNlbGVjdGVkVGVtcGxhdGU6IGFueTtcblxuXHQvKipcblx0ICogV2V0aGVyIHRoZSBmbG9hdGluZyBtZW51IGhhcyBiZWVuIHNob3duIGF0bGVhc3Qgb25jZVxuXHQgKi9cblx0cHVibGljIGZsb2F0aW5nTWVudVNob3duJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG5cdC8qKlxuXHQgKiBFdmVudCB3aGVuZXZlciBhIHJvdyBpcyBjbGlja2VkXG5cdCAqL1xuXHRAT3V0cHV0KCkgcm93Q2xpY2s6IEV2ZW50RW1pdHRlcjxSb3dDbGlja0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKipcblx0ICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgc2VsZWN0ZWRcblx0ICovXG5cdEBPdXRwdXQoKSByb3dTZWxlY3RlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqXG5cdCAqIEV2ZW50IHdoZW5ldmVyIGEgcm93IGlzIGRlc2VsZWN0ZWRcblx0ICovXG5cdEBPdXRwdXQoKSByb3dEZXNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogU1RBUlQgSEVBREVSICovXG5cblx0LyoqXG5cdCAqIFdldGhlciB0byBzaG93IHRoZSBoZWFkZXJcblx0ICovXG5cdEBJbnB1dCgpIGVuYWJsZUhlYWRlcjogYm9vbGVhbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIFF1aWNrIGZpbHRlcnMgdG8gc2hvd1xuXHQgKi9cblx0QElucHV0KCkgcXVpY2tGaWx0ZXJzOiBRdWlja0ZpbHRlcltdID0gW107XG5cblx0LyoqXG5cdCAqIEFjdGl2ZSBxdWljayBmaWx0ZXIgaWRlbnRpZmllclxuXHQgKi9cblx0QElucHV0KCkgYWN0aXZlUXVpY2tGaWx0ZXJJZGVudGlmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIFdldGhlciB0byBzaG93IHRoZSBzZWFyY2ggaW5wdXRcblx0ICovXG5cdEBJbnB1dCgpIGVuYWJsZVNlYXJjaDogYm9vbGVhbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIFRoZSBxdWVyeSB0byBzaG93IGluIHRoZSBzZWFyY2ggYmFyXG5cdCAqL1xuXHRASW5wdXQoKSBxdWVyeTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdG8gc2hvdyB0aGUgZmlsdGVyIGJ1dHRvblxuXHQgKi9cblx0QElucHV0KCkgZW5hYmxlRmlsdGVyOiBib29sZWFuID0gdHJ1ZTtcblxuXHQvKipcblx0ICogV2V0aGVyIHRvIHNob3cgdGhlIGZpbHRlciBidXR0b24gb24gZGVza3RvcFxuXHQgKi9cblx0QElucHV0KCkgZW5hYmxlRmlsdGVyRGVza3RvcDogYm9vbGVhbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIFRoZSBhbW91bnQgb2YgZmlsdGVycyBiZWluZyBzZWxlY3RlZFxuXHQgKi9cblx0QElucHV0KCkgc2VsZWN0ZWRGaWx0ZXJzQW1vdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIFRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGZpbHRlciBidXR0b24gdGV4dFxuXHQgKi9cblx0QElucHV0KCkgZmlsdGVyQnV0dG9uVGVtcGxhdGU6IGFueTtcblxuXHQvKipcblx0ICogV2V0aGVyIHRvIHNob3cgdGhlIGFjdGlvbiBidXR0b25cblx0ICovXG5cdEBJbnB1dCgpIGVuYWJsZUFjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdGhlIGFjdGlvbiBidXR0b24gaXMgbG9hZGluZ1xuXHQgKi9cblx0QElucHV0KCkgYWN0aW9uQnV0dG9uTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBUaGUgYWN0aW9uIGJ1dHRvbiBpY29uXG5cdCAqL1xuXHRASW5wdXQoKSBhY3Rpb25CdXR0b25JY29uOiBJY29uVmFyaWFudCA9ICdwZW5jaWwnO1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdGhlIGFjdGlvbiBidXR0b24gaXMgZW5hYmxlZFxuXHQgKi9cblx0QElucHV0KCkgYWN0aW9uQnV0dG9uRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIFRoZSBhY3Rpb24gYnV0dG9uIHRleHQgaWYgY2hhbmdlZFxuXHQgKi9cblx0QElucHV0KCkgYWN0aW9uQnV0dG9uVGV4dD86IHN0cmluZztcblxuXHQvKipcblx0ICogVGhlIHRlbXBsYXRlIGZvciB0aGUgYWN0aW9uIGJ1dHRvbiB0ZXh0XG5cdCAqL1xuXHRASW5wdXQoKSBhY3Rpb25CdXR0b25UZW1wbGF0ZTogYW55O1xuXG5cdC8qKlxuXHQgKiBFdmVudCB3aGVuIG9uZSBvZiB0aGUgcXVpY2sgZmlsdGVycyBpcyBjbGlja2VkXG5cdCAqL1xuXHRAT3V0cHV0KCkgcXVpY2tGaWx0ZXI6IEV2ZW50RW1pdHRlcjxRdWlja0ZpbHRlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqXG5cdCAqIEV2ZW50IHdoZW4gdGhlIHF1ZXJ5IGNoYW5nZXNcblx0ICovXG5cdEBPdXRwdXQoKSBxdWVyeUNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqXG5cdCAqIEV2ZW50IHdoZW4gdGhlIGZpbHRlciBidXR0b24gaXMgY2xpY2tlZFxuXHQgKi9cblx0QE91dHB1dCgpIGZpbHRlcjogRXZlbnRFbWl0dGVyPG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKlxuXHQgKiBFdmVudCB3aGVuIHRoZSBhY3Rpb24gYnV0dG9uIGlzIGNsaWNrZWRcblx0ICovXG5cdEBPdXRwdXQoKSBhY3Rpb246IEV2ZW50RW1pdHRlcjxudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogU1RBUlQgRk9PVEVSICovXG5cblx0LyoqXG5cdCAqIFdldGhlciB0byBzaG93IHRoZSBmb290ZXJcblx0ICovXG5cdEBJbnB1dCgpIGVuYWJsZUZvb3RlcjogYm9vbGVhbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIFdldGhlciB0byBlbmFibGUgcGFnaW5hdGlvbiBzaXplIHNlbGVjdFxuXHQgKi9cblx0QElucHV0KCkgZW5hYmxlUGFnaW5hdGlvblNpemU6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdG8gZW5hYmxlIHBhZ2luYXRpb24gcGFnZXNcblx0ICovXG5cdEBJbnB1dCgpIGVuYWJsZVBhZ2luYXRpb25QYWdlczogYm9vbGVhbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIFdldGhlciB0byBlbmFibGUgZXhwb3J0XG5cdCAqL1xuXHRASW5wdXQoKSBlbmFibGVFeHBvcnQ6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdC8qKlxuXHQgKiBUaGUgY3VycmVudCBwYWdlXG5cdCAqL1xuXHRASW5wdXQoKSBwYWdlOiBudW1iZXIgPSAxO1xuXG5cdC8qKlxuXHQgKiBUaGUgdG90YWwgYW1vdW50IG9mIGl0ZW1zXG5cdCAqL1xuXHRASW5wdXQoKSB0b3RhbCE6IG51bWJlcjtcblxuXHQvKipcblx0ICogRXZlbnQgd2hlbmV2ZXIgdGhlIHBhZ2UgY2hhbmdlc1xuXHQgKi9cblx0QE91dHB1dCgpIHBhZ2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKlxuXHQgKiBUaGUgYW1vdW50IG9mIGl0ZW1zIHBlciBwYWdlXG5cdCAqL1xuXHRASW5wdXQoKSBwYWdlU2l6ZTogbnVtYmVyID0gZGVmYXVsdFNpemU7XG5cblx0LyoqXG5cdCAqIFRoZSBvcHRpb25zIGZvciB0aGUgcGFnZSBzaXplXG5cdCAqL1xuXHRASW5wdXQoKSBwYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdID0gZGVmYXVsdFNpemVPcHRpb25zO1xuXG5cdC8qKlxuXHQgKiBFdmVudCB3aGVuZXZlciB0aGUgcGFnZSBjaGFuZ2VzXG5cdCAqL1xuXHRAT3V0cHV0KCkgcGFnZVNpemVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKlxuXHQgKiBFdmVudCB3aGVuZXZlciB0aGUgcGFnZSBjaGFuZ2VzXG5cdCAqL1xuXHRAT3V0cHV0KCkgZXhwb3J0OiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKipcblx0ICogV2V0aGVyIHRvIGhpZGUgd2hlbiB0aGVyZSBpcyBvbmx5IDEgcGFnZSBhdmFpbGFibGVcblx0ICovXG5cdEBJbnB1dCgpIGhpZGVPblNpbmdsZVBhZ2U6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdC8qIEVtcHR5IHN0YXRlIHN0YXJ0ICovXG5cdEBJbnB1dCgpIGVtcHR5U3RhdGVUeXBlOiAnbm9fZmlsdGVyJyB8ICdmaWx0ZXJlZCcgPSAnbm9fZmlsdGVyJztcblxuXHRASW5wdXQoKSBlbXB0eVN0YXRlSWxsdXN0cmF0aW9uOiBJbGx1c3RyYXRpb25WYXJpYW50ID0gJ3RhYmxlJztcblx0QElucHV0KCkgZW1wdHlTdGF0ZUhlYWRlciE6IHN0cmluZztcblx0QElucHV0KCkgZW1wdHlTdGF0ZUNvbnRlbnQhOiBzdHJpbmc7XG5cdEBJbnB1dCgpIGVtcHR5U3RhdGVBY3Rpb24hOiBzdHJpbmc7XG5cdEBJbnB1dCgpIGVtcHR5U3RhdGVBY3Rpb25JY29uOiBJY29uVmFyaWFudCA9ICdwbHVzJztcblxuXHRASW5wdXQoKSBlbmFibGVFbXB0eVN0YXRlQWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuXHRASW5wdXQoKSBlbXB0eVN0YXRlRmlsdGVyZWRJbGx1c3RyYXRpb246IElsbHVzdHJhdGlvblZhcmlhbnQgPSAnc2VhcmNoJztcblx0QElucHV0KCkgZW1wdHlTdGF0ZUZpbHRlcmVkSGVhZGVyITogc3RyaW5nO1xuXHRASW5wdXQoKSBlbXB0eVN0YXRlRmlsdGVyZWRDb250ZW50ITogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdG8gZW5hYmxlIHNjcm9sbGluZ1xuXHQgKi9cblx0QElucHV0KCkgZW5hYmxlU2Nyb2xsOiBib29sZWFuID0gZmFsc2U7XG5cdEBWaWV3Q2hpbGRyZW4oUFRhYmxlUm93LCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgdGFibGVSb3dzITogUXVlcnlMaXN0PFxuXHRcdEVsZW1lbnRSZWY8UFRhYmxlUm93PlxuXHQ+O1xuXHRAVmlld0NoaWxkcmVuKFRhYmxlQ2VsbCwgeyByZWFkOiBFbGVtZW50UmVmIH0pIHRhYmxlQ2VsbHMhOiBRdWVyeUxpc3Q8XG5cdFx0RWxlbWVudFJlZjxUYWJsZUNlbGw+XG5cdD47XG5cdEBWaWV3Q2hpbGQoJ3Njcm9sbENvbnRhaW5lcicpIHNjcm9sbENvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG5cdHB1YmxpYyByZWFjaGVkU2Nyb2xsU3RhcnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcblx0cHVibGljIHJlYWNoZWRTY3JvbGxFbmQkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cdHByaXZhdGUgX3RvdGFsV2lkdGggPSAwO1xuXHRwcml2YXRlIF9jYWxjdWxhdGVDb2x1bW5XaWR0aHNUaW1lb3V0PzogbnVtYmVyO1xuXG5cdHByaXZhdGUgX3Jvd0NoYW5nZXNTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cdHByaXZhdGUgX2NlbGxDaGFuZ2VzU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG5cdC8qKlxuXHQgKiBFdmVudCB3aGVuZXZlciB0aGUgZW1wdHkgc3RhdGUgaXMgY2xpY2tlZFxuXHQgKi9cblx0QE91dHB1dCgpIGVtcHR5U3RhdGVBY3Rpb25DbGljazogRXZlbnRFbWl0dGVyPG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qIEVtcHR5IHN0YXRlIGVuZCAqL1xuXG5cdC8qXG5cdCAqIFdldGhlciB0byBzaG93IHRoZSBzaGFkb3cgb3Igbm90XG5cdCAqL1xuXHRASW5wdXQoKSBzaGFkb3c6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdHB1YmxpYyBjb2x1bW5zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcblx0cHVibGljIHBhcnNlZEl0ZW1zOiBhbnlbXSA9IFtdO1xuXHRwdWJsaWMgbG9hZGluZ1Jvd3MgPSBBcnJheS5mcm9tKHtcblx0XHRsZW5ndGg6IHRoaXMuYW1vdW50T2ZMb2FkaW5nUm93cyxcblx0fSk7XG5cdHByaXZhdGUgX2N0cmxEb3duID0gZmFsc2U7XG5cblx0Ly8gQW5ndWxhciBzdHVmZlxuXHQvLyBjdXN0b20gZmlsdGVyIHRlbXBsYXRlXG5cdEBDb250ZW50Q2hpbGQoVGFibGVDdXN0b21GaWx0ZXJEaXJlY3RpdmUsIHtcblx0XHRyZWFkOiBUZW1wbGF0ZVJlZixcblx0XHRzdGF0aWM6IHRydWUsXG5cdH0pXG5cdHB1YmxpYyBoZWFkZXJDdXN0b21GaWx0ZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZDtcblxuXHQvLyBjdXN0b20gYWN0aW9ucyB0ZW1wbGF0ZVxuXHRAQ29udGVudENoaWxkKFRhYmxlQ3VzdG9tQWN0aW9uc0RpcmVjdGl2ZSwge1xuXHRcdHJlYWQ6IFRlbXBsYXRlUmVmLFxuXHRcdHN0YXRpYzogdHJ1ZSxcblx0fSlcblx0cHVibGljIGhlYWRlckN1c3RvbUFjdGlvbnNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZDtcblxuXHQvLyBjb2x1bW4gdGVtcGxhdGVzXG5cdEBDb250ZW50Q2hpbGRyZW4oVGFibGVDb2x1bW4pIGNvbHVtbkRlZmluaXRpb25zITogUXVlcnlMaXN0PFRhYmxlQ29sdW1uPjtcblxuXHQvLyBmaWx0ZXIgbW9kYWxcblx0QENvbnRlbnRDaGlsZChUYWJsZUZpbHRlck1vZGFsRGlyZWN0aXZlLCB7XG5cdFx0cmVhZDogVGVtcGxhdGVSZWYsXG5cdFx0c3RhdGljOiB0cnVlLFxuXHR9KVxuXHRwdWJsaWMgZmlsdGVyTW9kYWxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZDtcblxuXHRwdWJsaWMgZmlsdGVyTW9kYWxTaG93JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG5cdC8vIHJvdyBhY3Rpb25zIHRlbXBsYXRlc1xuXHRwcml2YXRlIF9yb3dBY3Rpb25zITogUXVlcnlMaXN0PFRhYmxlUm93QWN0aW9uPjtcblx0cHJpdmF0ZSBfcm93QWN0aW9uc1N1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cblx0QENvbnRlbnRDaGlsZHJlbihUYWJsZVJvd0FjdGlvbilcblx0c2V0IHJvd0FjdGlvbnModjogUXVlcnlMaXN0PFRhYmxlUm93QWN0aW9uPikge1xuXHRcdHRoaXMuX3Jvd0FjdGlvbnMgPSB2O1xuXHRcdHRoaXMuX3NldFJvd1NlbGVjdGlvbkRhdGEoKTtcblx0fVxuXHRnZXQgcm93QWN0aW9ucygpOiBRdWVyeUxpc3Q8VGFibGVSb3dBY3Rpb24+IHtcblx0XHRyZXR1cm4gdGhpcy5fcm93QWN0aW9ucztcblx0fVxuXG5cdC8vIGN1c3RvbSByb3dzIHRlbXBsYXRlc1xuXHRAQ29udGVudENoaWxkcmVuKFRhYmxlQ3VzdG9tUm93RGlyZWN0aXZlKVxuXHRjdXN0b21Sb3dzITogUXVlcnlMaXN0PFRhYmxlQ3VzdG9tUm93RGlyZWN0aXZlPjtcblxuXHRASW5wdXQoKSBmaWx0ZXJNb2RhbEhlYWRlclRleHQ6IHN0cmluZyA9ICdGaWx0ZXJzJztcblx0QElucHV0KCkgZmlsdGVyTW9kYWxTYXZlVGV4dDogc3RyaW5nID0gJ1NhdmUnO1xuXHRASW5wdXQoKSBmaWx0ZXJNb2RhbENhbmNlbFRleHQ6IHN0cmluZyA9ICdDYW5jZWwnO1xuXHRASW5wdXQoKSBmaWx0ZXJNb2RhbFJlc2V0VGV4dDogc3RyaW5nID0gJ1Jlc2V0IGZpbHRlcnMnO1xuXG5cdEBJbnB1dCgpIGZpbHRlck1vZGFsU2hvd1Jlc2V0OiBib29sZWFuID0gZmFsc2U7XG5cdEBJbnB1dCgpIGZpbHRlck1vZGFsU2hvd1Jlc2V0TW9iaWxlOiBib29sZWFuID0gZmFsc2U7XG5cblx0QE91dHB1dCgpIGZpbHRlck1vZGFsU2hvdzogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXHRAT3V0cHV0KCkgZmlsdGVyTW9kYWxTYXZlOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBPdXRwdXQoKSBmaWx0ZXJNb2RhbFJlc2V0OiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0cHVibGljIHJvd0FjdGlvbnNSb3ckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYWJsZVJvd0FjdGlvbltdPihbXSk7XG5cdHB1YmxpYyByb3dBY3Rpb25zRmxvYXRpbmdBbGwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYWJsZVJvd0FjdGlvbltdPihbXSk7XG5cdHB1YmxpYyByb3dBY3Rpb25zRmxvYXRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYWJsZVJvd0FjdGlvbltdPihbXSk7XG5cblx0cHVibGljIGlzTW9iaWxlJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoaXNNb2JpbGUoKSk7XG5cblx0cHVibGljIGZsb2F0aW5nTWVudUNvbnRhaW5lckNsYXNzID0gZmxvYXRpbmdNZW51Q29udGFpbmVyQ2xhc3M7XG5cblx0cHJpdmF0ZSBfcmVzaXplVGltZW91dDogdW5rbm93bjtcblx0cHJpdmF0ZSBfaW5wdXRFbmFibGVSb3dTZWxlY3Rpb246IGJvb2xlYW4gPSB0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbjtcblx0cHJpdmF0ZSBfaW5wdXRSb3dTZWxlY3Rpb25MaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdGhpcy5yb3dTZWxlY3Rpb25MaW1pdDtcblxuXHRwdWJsaWMgZm9vdGVySGlkZGVuJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG5cdHB1YmxpYyBjbiA9IGNuO1xuXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgX2NoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cblx0bmdPbkluaXQoKSB7XG5cdFx0dGhpcy5fcGFyc2VJdGVtcyh0aGlzLml0ZW1zKTtcblxuXHRcdHRoaXMubG9hZGluZ1Jvd3MgPSBBcnJheS5mcm9tKHtcblx0XHRcdGxlbmd0aDogdGhpcy5hbW91bnRPZkxvYWRpbmdSb3dzLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5maWx0ZXJNb2RhbFNob3ckXG5cdFx0XHQucGlwZSh1bnRpbERlc3Ryb3llZCh0aGlzKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcblx0XHRcdC5zdWJzY3JpYmUodmFsdWUgPT4gdGhpcy5maWx0ZXJNb2RhbFNob3cubmV4dCh2YWx1ZSkpO1xuXHR9XG5cblx0bmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuXHRcdGlmIChjaGFuZ2VzWydpdGVtcyddKSB7XG5cdFx0XHR0aGlzLl9wYXJzZUl0ZW1zKGNoYW5nZXNbJ2l0ZW1zJ10uY3VycmVudFZhbHVlKTtcblx0XHR9XG5cblx0XHRpZiAoY2hhbmdlc1snYW1vdW50T2ZMb2FkaW5nUm93cyddKSB7XG5cdFx0XHR0aGlzLmxvYWRpbmdSb3dzID0gQXJyYXkuZnJvbSh7XG5cdFx0XHRcdGxlbmd0aDogY2hhbmdlc1snYW1vdW50T2ZMb2FkaW5nUm93cyddLmN1cnJlbnRWYWx1ZSxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGxldCBjYWxjdWxhdGVSb3dTZWxlY3Rpb25EYXRhID0gZmFsc2U7XG5cdFx0aWYgKGNoYW5nZXNbJ2VuYWJsZVJvd1NlbGVjdGlvbiddKSB7XG5cdFx0XHR0aGlzLl9pbnB1dEVuYWJsZVJvd1NlbGVjdGlvbiA9XG5cdFx0XHRcdGNoYW5nZXNbJ2VuYWJsZVJvd1NlbGVjdGlvbiddLmN1cnJlbnRWYWx1ZTtcblx0XHRcdGNhbGN1bGF0ZVJvd1NlbGVjdGlvbkRhdGEgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChjaGFuZ2VzWydyb3dTZWxlY3Rpb25MaW1pdCddKSB7XG5cdFx0XHR0aGlzLl9pbnB1dFJvd1NlbGVjdGlvbkxpbWl0ID0gY2hhbmdlc1sncm93U2VsZWN0aW9uTGltaXQnXS5jdXJyZW50VmFsdWU7XG5cdFx0XHRjYWxjdWxhdGVSb3dTZWxlY3Rpb25EYXRhID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoY2FsY3VsYXRlUm93U2VsZWN0aW9uRGF0YSB8fCBjaGFuZ2VzWydzZWxlY3RlZFJvd3MnXSkge1xuXHRcdFx0dGhpcy5fc2V0Um93U2VsZWN0aW9uRGF0YSgpO1xuXHRcdH1cblxuXHRcdGlmIChjaGFuZ2VzWydlbmFibGVTY3JvbGwnXT8uY3VycmVudFZhbHVlKSB7XG5cdFx0XHR0aGlzLl9jaGVja0NoYW5nZXNTdWJzY3JpcHRpb25zKCk7XG5cdFx0fVxuXHR9XG5cblx0bmdBZnRlclZpZXdJbml0KCkge1xuXHRcdGlmICh0aGlzLmVuYWJsZVNjcm9sbCkge1xuXHRcdFx0dGhpcy5fY2hlY2tDaGFuZ2VzU3Vic2NyaXB0aW9ucygpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNvbHVtbkRlZmluaXRpb25zKSB7XG5cdFx0XHR0aGlzLmNvbHVtbkRlZmluaXRpb25zLmNoYW5nZXNcblx0XHRcdFx0LnBpcGUodW50aWxEZXN0cm95ZWQodGhpcyksIGRlYm91bmNlVGltZSgxMDApKVxuXHRcdFx0XHQuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2dlbmVyYXRlQ29sdW1ucygpKTtcblx0XHRcdHRoaXMuX2dlbmVyYXRlQ29sdW1ucygpO1xuXHRcdH1cblx0fVxuXG5cdEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxuXHRvblJlc2l6ZSgpIHtcblx0XHR0aGlzLl9zZXRSb3dTZWxlY3Rpb25EYXRhKCk7XG5cdFx0dGhpcy5fY2FsY3VsYXRlQ29sdW1uV2lkdGhzKCk7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcblx0a2V5RG93bih7IGtleSB9OiB7IGtleTogc3RyaW5nIH0pIHtcblx0XHRpZiAoa2V5ICE9PSAnQ29udHJvbCcgfHwgdGhpcy5fY3RybERvd24gPT09IHRydWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9jdHJsRG93biA9IHRydWU7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXl1cCcsIFsnJGV2ZW50J10pXG5cdGtleVVwKHsga2V5IH06IHsga2V5OiBzdHJpbmcgfSkge1xuXHRcdGlmIChrZXkgIT09ICdDb250cm9sJyB8fCB0aGlzLl9jdHJsRG93biA9PT0gZmFsc2UpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9jdHJsRG93biA9IGZhbHNlO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6dmlzaWJpbGl0eWNoYW5nZScsIFsnJGV2ZW50J10pXG5cdHZpc2liaWxpdHlDaGFuZ2UoKSB7XG5cdFx0aWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSAhPT0gJ2hpZGRlbicgfHwgdGhpcy5fY3RybERvd24gPT09IGZhbHNlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fY3RybERvd24gPSBmYWxzZTtcblx0fVxuXG5cdG9uUXVlcnlDaGFuZ2UoeyBkZXRhaWwgfTogYW55KSB7XG5cdFx0dGhpcy5xdWVyeUNoYW5nZS5lbWl0KGRldGFpbCk7XG5cdH1cblxuXHRvblF1aWNrRmlsdGVyKHsgZGV0YWlsIH06IGFueSkge1xuXHRcdHRoaXMucXVpY2tGaWx0ZXIuZW1pdChkZXRhaWwpO1xuXHR9XG5cblx0b25QYWdlU2l6ZUNoYW5nZSh7IGRldGFpbCB9OiBhbnkpIHtcblx0XHR0aGlzLnBhZ2VTaXplID0gZGV0YWlsO1xuXHRcdHRoaXMucGFnZVNpemVDaGFuZ2UuZW1pdChkZXRhaWwpO1xuXHR9XG5cblx0b25QYWdlQ2hhbmdlKHsgZGV0YWlsIH06IGFueSkge1xuXHRcdHRoaXMucGFnZSA9IGRldGFpbDtcblx0XHR0aGlzLnBhZ2VDaGFuZ2UuZW1pdChkZXRhaWwpO1xuXHR9XG5cblx0b25GaWx0ZXJNb2RhbFNhdmUoKSB7XG5cdFx0dGhpcy5maWx0ZXJNb2RhbFNhdmUubmV4dCgpO1xuXHRcdHRoaXMuZmlsdGVyTW9kYWxTaG93JC5uZXh0KGZhbHNlKTtcblx0fVxuXG5cdG9uRmlsdGVyTW9kYWxSZXNldChyZXNldFF1aWNrRmlsdGVyID0gZmFsc2UpIHtcblx0XHR0aGlzLmZpbHRlck1vZGFsUmVzZXQubmV4dChyZXNldFF1aWNrRmlsdGVyKTtcblx0XHR0aGlzLmZpbHRlck1vZGFsU2hvdyQubmV4dChmYWxzZSk7XG5cdH1cblxuXHRlbXB0eVN0YXRlQ2xpY2tlZCgpIHtcblx0XHRpZiAoIXRoaXMuZW5hYmxlRW1wdHlTdGF0ZUFjdGlvbikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuZW1wdHlTdGF0ZUFjdGlvbkNsaWNrLmVtaXQoKTtcblx0fVxuXG5cdHBhcnNlUm93QWN0aW9uc1JvdyhhY3Rpb25zOiBUYWJsZVJvd0FjdGlvbltdIHwgbnVsbCwgcm93SW5kZXg6IG51bWJlcikge1xuXHRcdGlmICghYWN0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFjdGlvbnMuZmlsdGVyKFxuXHRcdFx0YSA9PiAhYS5zaG93RnVuY3Rpb24gfHwgYS5zaG93RnVuY3Rpb24odGhpcy5wYXJzZWRJdGVtc1tyb3dJbmRleF0pXG5cdFx0KTtcblx0fVxuXG5cdG9uQ29udGFpbmVyWFNjcm9sbChldjogYW55KSB7XG5cdFx0aWYgKCF0aGlzLmVuYWJsZVNjcm9sbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX2NhbGN1bGF0ZVNjcm9sbFBvc2l0aW9uKGV2KTtcblx0fVxuXG5cdHByaXZhdGUgX3BhcnNlSXRlbXMoaXRlbXM6IHN0cmluZyB8IGFueVtdKSB7XG5cdFx0aWYgKCFpdGVtcykge1xuXHRcdFx0dGhpcy5wYXJzZWRJdGVtcyA9IFtdO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuXHRcdFx0dGhpcy5wYXJzZWRJdGVtcyA9IGl0ZW1zO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMucGFyc2VkSXRlbXMgPSBKU09OLnBhcnNlKGl0ZW1zKTtcblx0fVxuXG5cdHByaXZhdGUgX2dlbmVyYXRlQ29sdW1ucygpIHtcblx0XHRsZXQgZGVmaW5pdGlvbnNBcnJheSA9IEFycmF5LmZyb20odGhpcy5jb2x1bW5EZWZpbml0aW9ucykgYXMgVGFibGVDb2x1bW5bXTtcblxuXHRcdGRlZmluaXRpb25zQXJyYXkgPSB0aGlzLl9wYXJzZURlZmluaXRpb25zKGRlZmluaXRpb25zQXJyYXkpO1xuXG5cdFx0dGhpcy5jb2x1bW5zJC5uZXh0KGRlZmluaXRpb25zQXJyYXkpO1xuXHR9XG5cblx0cHVibGljIF9jaGVja2JveERpc2FibGVkKGl0ZW06IGFueSwgcm93SW5kZXg6IG51bWJlcikge1xuXHRcdGNvbnN0IHNlbGVjdGlvbkNvbnRhaW5zID0gdGhpcy5fc2VsZWN0aW9uQ29udGFpbnMoaXRlbSwgcm93SW5kZXgpO1xuXHRcdHJldHVybiAoXG5cdFx0XHQodGhpcy5jYW5TZWxlY3RLZXkgJiYgIWl0ZW1bdGhpcy5jYW5TZWxlY3RLZXldKSB8fFxuXHRcdFx0KHRoaXMucm93U2VsZWN0aW9uTGltaXQgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHQhc2VsZWN0aW9uQ29udGFpbnMgJiZcblx0XHRcdFx0dGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID09PSB0aGlzLnJvd1NlbGVjdGlvbkxpbWl0KVxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgX3NlbGVjdEFsbENoYW5nZSgkZXZlbnQ6IGFueSwgZm9yY2VWYWx1ZT86IGJvb2xlYW4pIHtcblx0XHRpZiAoIXRoaXMuZW5hYmxlUm93U2VsZWN0aW9uKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmFsdWUgPSBmb3JjZVZhbHVlID09PSB1bmRlZmluZWQgPyAkZXZlbnQuZGV0YWlsIDogZm9yY2VWYWx1ZTtcblxuXHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0Y29uc3QgdG9BZGQgPSBbXTtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wYXJzZWRJdGVtcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCByb3cgPSB0aGlzLnBhcnNlZEl0ZW1zW2ldO1xuXHRcdFx0XHRpZiAodGhpcy5jYW5TZWxlY3RLZXkgJiYgIXJvd1t0aGlzLmNhblNlbGVjdEtleV0pIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0aGlzLl9zZWxlY3Rpb25Db250YWlucyhyb3csIGkpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0b0FkZC5wdXNoKHJvdyk7XG5cdFx0XHRcdHRoaXMucm93U2VsZWN0ZWQuZW1pdChyb3cpO1xuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHR0aGlzLnJvd1NlbGVjdGlvbkxpbWl0ICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGggKyB0b0FkZC5sZW5ndGggPT09IHRoaXMucm93U2VsZWN0aW9uTGltaXRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zZWxlY3RlZFJvd3MgPSBbLi4udGhpcy5zZWxlY3RlZFJvd3MsIC4uLnRvQWRkXTtcblx0XHRcdHRoaXMuc2VsZWN0ZWRSb3dzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFJvd3MpO1xuXG5cdFx0XHRpZiAodGhpcy5lbmFibGVGbG9hdGluZ01lbnUpIHtcblx0XHRcdFx0dGhpcy5fc2hvd0Zsb2F0aW5nTWVudSgpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgdmFsdWUgPSB0aGlzLnNlbGVjdGVkUm93c1tpXTtcblx0XHRcdGNvbnN0IHJvdyA9IHRoaXMucGFyc2VkSXRlbXMuZmluZChcblx0XHRcdFx0ZCA9PiB0aGlzLl9nZXRTZWxlY3Rpb25WYWx1ZShkLCBpKSA9PT0gdGhpcy5fZ2V0U2VsZWN0aW9uVmFsdWUodmFsdWUsIGkpXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoIXJvdykge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5yb3dEZXNlbGVjdGVkLmVtaXQocm93KTtcblx0XHR9XG5cblx0XHR0aGlzLnNlbGVjdGVkUm93cyA9IFtdO1xuXHRcdHRoaXMuc2VsZWN0ZWRSb3dzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFJvd3MpO1xuXHR9XG5cblx0cHVibGljIF9jaGVja2JveENoYW5nZSh0YXJnZXQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xuXHRcdGlmICghdGhpcy5lbmFibGVSb3dTZWxlY3Rpb24pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCB2YWx1ZSA9IHRoaXMuX2dldENoZWNrZWRWYWx1ZSh0YXJnZXQpO1xuXHRcdGlmIChcblx0XHRcdHZhbHVlICYmXG5cdFx0XHR0aGlzLnJvd1NlbGVjdGlvbkxpbWl0ICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aCA+PSB0aGlzLnJvd1NlbGVjdGlvbkxpbWl0XG5cdFx0KSB7XG5cdFx0XHR0YXJnZXQuY2hlY2tlZCA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJvdyA9IHRoaXMucGFyc2VkSXRlbXNbaW5kZXhdO1xuXG5cdFx0aWYgKHRoaXMuY2FuU2VsZWN0S2V5ICYmICFyb3dbdGhpcy5jYW5TZWxlY3RLZXldKSB7XG5cdFx0XHR0YXJnZXQuY2hlY2tlZCA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0dGhpcy5zZWxlY3RlZFJvd3MgPSBbLi4udGhpcy5zZWxlY3RlZFJvd3MsIHJvd107XG5cdFx0XHR0aGlzLnNlbGVjdGVkUm93c0NoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRSb3dzKTtcblx0XHRcdHRoaXMucm93U2VsZWN0ZWQuZW1pdChyb3cpO1xuXG5cdFx0XHRpZiAodGhpcy5lbmFibGVGbG9hdGluZ01lbnUpIHtcblx0XHRcdFx0dGhpcy5fc2hvd0Zsb2F0aW5nTWVudSgpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGluZGV4T2ZUb1JlbW92ZSA9IHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5zKHJvdywgaW5kZXgsIHRydWUpO1xuXG5cdFx0Ly8gd2UgbmVlZCB0byBkbyB0aGlzLCBiZWNhdXNlIHNwbGljZSBkb2VzIG5vdCB0cmlnZ2VyIHRoZSBzZWxlY3Rpb24gc2V0dGVyLlxuXHRcdGNvbnN0IHNlbGVjdGlvbiA9IFsuLi50aGlzLnNlbGVjdGVkUm93c107XG5cdFx0c2VsZWN0aW9uLnNwbGljZShpbmRleE9mVG9SZW1vdmUsIDEpO1xuXHRcdHRoaXMuc2VsZWN0ZWRSb3dzID0gc2VsZWN0aW9uO1xuXHRcdHRoaXMuc2VsZWN0ZWRSb3dzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFJvd3MpO1xuXHRcdHRoaXMucm93RGVzZWxlY3RlZC5lbWl0KHJvdyk7XG5cdH1cblxuXHRwcml2YXRlIF9nZXRDaGVja2VkVmFsdWUodGFyZ2V0OiBhbnkpIHtcblx0XHRyZXR1cm4gdGFyZ2V0Py5jaGVja2VkO1xuXHR9XG5cblx0cHJpdmF0ZSBfZ2V0U2VsZWN0aW9uVmFsdWUocm93OiBhbnksIGluZGV4OiBudW1iZXIpIHtcblx0XHRyZXR1cm4gdGhpcy5zZWxlY3Rpb25LZXkgPyByb3c/Llt0aGlzLnNlbGVjdGlvbktleV0gfHwgaW5kZXggOiBpbmRleDtcblx0fVxuXG5cdHB1YmxpYyBfc2VsZWN0aW9uQ29udGFpbnMocm93OiBhbnksIGluZGV4OiBudW1iZXIsIHJldHVybkluZGV4ID0gZmFsc2UpOiBhbnkge1xuXHRcdGNvbnN0IHJldHVyblZhbHVlID0gdGhpcy5zZWxlY3RlZFJvd3MuZmluZEluZGV4KFxuXHRcdFx0aXRlbSA9PlxuXHRcdFx0XHR0aGlzLl9nZXRTZWxlY3Rpb25WYWx1ZShyb3csIGluZGV4KSA9PT1cblx0XHRcdFx0dGhpcy5fZ2V0U2VsZWN0aW9uVmFsdWUoaXRlbSwgaW5kZXgpXG5cdFx0KTtcblx0XHRyZXR1cm4gIXJldHVybkluZGV4ID8gcmV0dXJuVmFsdWUgPj0gMCA6IHJldHVyblZhbHVlO1xuXHR9XG5cblx0cHVibGljIF9zZWxlY3Rpb25Db250YWluc0FsbCgpIHtcblx0XHRsZXQgcmV0dXJuVmFsdWUgPSB0cnVlO1xuXHRcdGlmICghdGhpcy5wYXJzZWRJdGVtcz8ubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5yb3dTZWxlY3Rpb25MaW1pdCAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHR0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGggPT09IHRoaXMucm93U2VsZWN0aW9uTGltaXRcblx0XHQpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wYXJzZWRJdGVtcz8ubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGl0ZW0gPSB0aGlzLnBhcnNlZEl0ZW1zW2ldO1xuXHRcdFx0Y29uc3QgY29udGFpbnMgPSB0aGlzLl9zZWxlY3Rpb25Db250YWlucyhpdGVtLCBpKTtcblxuXHRcdFx0aWYgKCFjb250YWlucykge1xuXHRcdFx0XHRyZXR1cm5WYWx1ZSA9IGZhbHNlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmV0dXJuVmFsdWU7XG5cdH1cblxuXHRwdWJsaWMgX3NlbGVjdGlvbkluZGV0ZXJtaW5hdGUoKSB7XG5cdFx0aWYgKCF0aGlzLnBhcnNlZEl0ZW1zPy5sZW5ndGggfHwgIXRoaXMuc2VsZWN0ZWRSb3dzPy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHR0aGlzLnJvd1NlbGVjdGlvbkxpbWl0ICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aCA9PT0gdGhpcy5yb3dTZWxlY3Rpb25MaW1pdFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGxldCBjb250YWluc0NvdW50ID0gMDtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFyc2VkSXRlbXM/Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBpdGVtID0gdGhpcy5wYXJzZWRJdGVtc1tpXTtcblx0XHRcdGNvbnN0IGNvbnRhaW5zID0gdGhpcy5fc2VsZWN0aW9uQ29udGFpbnMoaXRlbSwgaSk7XG5cblx0XHRcdGlmIChjb250YWlucykge1xuXHRcdFx0XHRjb250YWluc0NvdW50Kys7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbnRhaW5zQ291bnQgPiAwICYmIGNvbnRhaW5zQ291bnQgIT09IHRoaXMucGFyc2VkSXRlbXMubGVuZ3RoO1xuXHR9XG5cblx0cHVibGljIF9yb3dDbGljaygkZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcblx0XHRjb25zdCB0YXJnZXQgPSAkZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG5cdFx0aWYgKFxuXHRcdFx0dGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyB8fFxuXHRcdFx0KHRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS50eXBlID09PSAnY2hlY2tib3gnXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgcm93ID0gdGhpcy5fZmluZFJvdyh0YXJnZXQpO1xuXHRcdGNvbnN0IGFjdGlvbiA9IHRoaXMuX2ZpbmRSb3dBY3Rpb24odGFyZ2V0KTtcblxuXHRcdGlmIChhY3Rpb24pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5lbmFibGVSb3dDbGljaykge1xuXHRcdFx0Y29uc3QgaXRlbSA9IHRoaXMucGFyc2VkSXRlbXNbaW5kZXhdO1xuXHRcdFx0dGhpcy5yb3dDbGljay5lbWl0KHtcblx0XHRcdFx0aXRlbSxcblx0XHRcdFx0Y3RybERvd246IHRoaXMuX2N0cmxEb3duLFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNoZWNrYm94ID0gcm93Py5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKTtcblxuXHRcdGlmICghY2hlY2tib3gpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjaGVja2JveC5jaGVja2VkID0gIWNoZWNrYm94LmNoZWNrZWQ7XG5cdFx0dGhpcy5fY2hlY2tib3hDaGFuZ2UoY2hlY2tib3gsIGluZGV4KTtcblx0fVxuXG5cdHB1YmxpYyBfZ2V0QWN0aW9uUm91dGVyTGluayhcblx0XHRyb3V0ZXJMaW5rOiBUYWJsZVJvd0FjdGlvblJvdXRlckxpbmssXG5cdFx0cm93SW5kZXg6IG51bWJlclxuXHQpOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgYW55W10+IHwgQXN5bmNJdGVtPHN0cmluZyB8IGFueVtdPiB7XG5cdFx0aWYgKHR5cGVvZiByb3V0ZXJMaW5rID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRjb25zdCBpdGVtID0gdGhpcy5wYXJzZWRJdGVtc1tyb3dJbmRleF07XG5cdFx0XHRyZXR1cm4gdGhpcy5fZ2V0QWN0aW9uUm91dGVyTGluayhyb3V0ZXJMaW5rKGl0ZW0pLCByb3dJbmRleCk7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiByb3V0ZXJMaW5rID09PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KHJvdXRlckxpbmspKSB7XG5cdFx0XHRyZXR1cm4gbmV3IEJlaGF2aW9yU3ViamVjdChyb3V0ZXJMaW5rKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcm91dGVyTGluaztcblx0fVxuXG5cdHB1YmxpYyBfZ2V0QWN0aW9uUXVlcnlQYXJhbXMoXG5cdFx0cXVlcnlQYXJhbXM6IFRhYmxlUm93QWN0aW9uUXVlcnlQYXJhbXMsXG5cdFx0cm93SW5kZXg6IG51bWJlclxuXHQpOiBCZWhhdmlvclN1YmplY3Q8UGFyYW1zPiB8IEFzeW5jSXRlbTxQYXJhbXM+IHtcblx0XHRpZiAodHlwZW9mIHF1ZXJ5UGFyYW1zID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRjb25zdCBpdGVtID0gdGhpcy5wYXJzZWRJdGVtc1tyb3dJbmRleF07XG5cdFx0XHRyZXR1cm4gdGhpcy5fZ2V0QWN0aW9uUXVlcnlQYXJhbXMocXVlcnlQYXJhbXMoaXRlbSksIHJvd0luZGV4KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnlQYXJhbXMgaW5zdGFuY2VvZiBPYmplY3QgJiYgcXVlcnlQYXJhbXMuY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xuXHRcdFx0cmV0dXJuIG5ldyBCZWhhdmlvclN1YmplY3QocXVlcnlQYXJhbXMpO1xuXHRcdH1cblxuXHRcdHJldHVybiBxdWVyeVBhcmFtcyBhcyBBc3luY0l0ZW08UGFyYW1zPjtcblx0fVxuXG5cdHB1YmxpYyBfcm93QWN0aW9uQ2xpY2soYWN0aW9uOiBUYWJsZVJvd0FjdGlvbiwgcm93SW5kZXg/OiBudW1iZXIpIHtcblx0XHRpZiAoYWN0aW9uLmRpc2FibGVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGFjdGlvbi5sb2FkaW5nKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCFhY3Rpb24uYWN0aW9uKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0YWN0aW9uLnR5cGUgPT09ICdtdWx0aScgfHxcblx0XHRcdChhY3Rpb24udHlwZSA9PT0gJ2JvdGgnICYmIHJvd0luZGV4ID09PSB1bmRlZmluZWQpXG5cdFx0KSB7XG5cdFx0XHRhY3Rpb24uYWN0aW9uLmVtaXQoe1xuXHRcdFx0XHRpdGVtczogdGhpcy5zZWxlY3RlZFJvd3MsXG5cdFx0XHRcdG11bHRpOiB0cnVlLFxuXHRcdFx0XHRjdHJsRG93bjogdGhpcy5fY3RybERvd24sXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHRhY3Rpb24ucm91dGVyTGluayB8fFxuXHRcdFx0KEFycmF5LmlzQXJyYXkoYWN0aW9uLnJvdXRlckxpbmspICYmIGFjdGlvbi5yb3V0ZXJMaW5rLmxlbmd0aClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBpdGVtID1cblx0XHRcdHJvd0luZGV4ICE9PSB1bmRlZmluZWRcblx0XHRcdFx0PyB0aGlzLnBhcnNlZEl0ZW1zW3Jvd0luZGV4XVxuXHRcdFx0XHQ6IHRoaXMuc2VsZWN0ZWRSb3dzWzBdO1xuXHRcdGFjdGlvbi5hY3Rpb24uZW1pdCh7XG5cdFx0XHRpdGVtLFxuXHRcdFx0bXVsdGk6IGZhbHNlLFxuXHRcdFx0Y3RybERvd246IHRoaXMuX2N0cmxEb3duLFxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBfZmluZFJvdyhlbDogSFRNTEVsZW1lbnQgfCBudWxsKTogYW55IHtcblx0XHRpZiAoIWVsKSB7XG5cdFx0XHRyZXR1cm4gZWw7XG5cdFx0fVxuXG5cdFx0aWYgKGVsPy50YWdOYW1lPy50b0xvd2VyQ2FzZSgpID09PSAncC10YWJsZS1yb3cnKSB7XG5cdFx0XHRyZXR1cm4gZWw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX2ZpbmRSb3coZWw/LnBhcmVudEVsZW1lbnQpO1xuXHR9XG5cblx0cHJpdmF0ZSBfZmluZFJvd0FjdGlvbihlbDogSFRNTEVsZW1lbnQgfCBudWxsKTogYW55IHtcblx0XHRpZiAoIWVsKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHRlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaXMtYWN0aW9uJykgIT09IG51bGwgJiZcblx0XHRcdGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1pcy1hY3Rpb24nKSAhPT0gJ2ZhbHNlJ1xuXHRcdCkge1xuXHRcdFx0cmV0dXJuIGVsO1xuXHRcdH1cblxuXHRcdGlmIChlbD8udGFnTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gJ3AtdGFibGUtcm93Jykge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX2ZpbmRSb3dBY3Rpb24oZWw/LnBhcmVudEVsZW1lbnQpO1xuXHR9XG5cblx0cHJpdmF0ZSBfc2V0Um93U2VsZWN0aW9uRGF0YSgpIHtcblx0XHRpZiAodGhpcy5fcmVzaXplVGltZW91dCkge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMuX3Jlc2l6ZVRpbWVvdXQgYXMgbnVtYmVyKTtcblx0XHR9XG5cblx0XHQvLyBXZSBhZGQgYSB0aW1lb3V0IGhlcmUgYmVjYXVzZSBpdCdzIGEgbG90IGVhc2llciBvbiB0aGUgbWFjaGluZSB0byBkbyB0aGVzZSB3aGVuIHNvbWVvbmUgaXMgZG9uZVxuXHRcdC8vIHJlc2l6aW5nIGFuZCBwbGF5aW5nIGFyb3VuZCB3aXRoIHRoZWlyIGJyb3dzZXJcblx0XHR0aGlzLl9yZXNpemVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRjb25zdCBtb2JpbGUgPSBpc01vYmlsZSgpO1xuXHRcdFx0dGhpcy5pc01vYmlsZSQubmV4dChtb2JpbGUpO1xuXG5cdFx0XHRjb25zdCBhY3Rpb25zID0gQXJyYXkuZnJvbSh0aGlzLl9yb3dBY3Rpb25zKSBhcyBUYWJsZVJvd0FjdGlvbltdO1xuXG5cdFx0XHRpZiAodGhpcy5fcm93QWN0aW9uc1N1YnNjcmlwdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRcdGZvciAobGV0IHN1YnNjcmlwdGlvbiBvZiB0aGlzLl9yb3dBY3Rpb25zU3Vic2NyaXB0aW9ucykge1xuXHRcdFx0XHRcdHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3Jvd0FjdGlvbnNTdWJzY3JpcHRpb25zID0gYWN0aW9ucy5tYXAoYWN0aW9uID0+XG5cdFx0XHRcdGFjdGlvbi5fbG9hZGluZ0NoYW5nZWRcblx0XHRcdFx0XHQucGlwZSh1bnRpbERlc3Ryb3llZCh0aGlzKSlcblx0XHRcdFx0XHQuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2NoYW5nZURldGVjdGlvbi5kZXRlY3RDaGFuZ2VzKCkpXG5cdFx0XHQpO1xuXG5cdFx0XHQvLyB3ZSBoYWNrIHRoaXMgdG8gYW55W10gdG8gbWFrZSBpdCB3b3JrLi5cblx0XHRcdGNvbnN0IHJvd0FjdGlvbnNSb3cgPSBhY3Rpb25zLmZpbHRlcihcblx0XHRcdFx0YSA9PiBhLnR5cGUgPT09ICdib3RoJyB8fCBhLnR5cGUgPT09ICdzaW5nbGUnXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3Qgcm93QWN0aW9uc0Zsb2F0aW5nID0gYWN0aW9ucy5maWx0ZXIoXG5cdFx0XHRcdGEgPT5cblx0XHRcdFx0XHQodGhpcy5faW5wdXRFbmFibGVSb3dTZWxlY3Rpb24gJiZcblx0XHRcdFx0XHRcdChhLnR5cGUgPT09ICdib3RoJyB8fCBhLnR5cGUgPT09ICdtdWx0aScpKSB8fFxuXHRcdFx0XHRcdChtb2JpbGUgJiYgYS50eXBlID09PSAnc2luZ2xlJyAmJiAhYS5yb3V0ZXJMaW5rKVxuXHRcdFx0KTtcblxuXHRcdFx0bGV0IHJvd1NlbGVjdGlvbkxpbWl0ID0gdGhpcy5faW5wdXRSb3dTZWxlY3Rpb25MaW1pdDtcblx0XHRcdGlmIChcblx0XHRcdFx0bW9iaWxlICYmIC8vIHdlJ3JlIG1vYmlsZVxuXHRcdFx0XHRyb3dBY3Rpb25zRmxvYXRpbmc/Lmxlbmd0aCAmJiAvLyB3ZSBoYXZlIGF0bGVhc3QgMSBpdGVtIGluIF9yb3dBY3Rpb25zRmxvYXRpbmdcblx0XHRcdFx0KChyb3dTZWxlY3Rpb25MaW1pdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZW5hYmxlUm93U2VsZWN0aW9uKSB8fFxuXHRcdFx0XHRcdCF0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbilcblx0XHRcdCkge1xuXHRcdFx0XHRyb3dTZWxlY3Rpb25MaW1pdCA9IDE7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucm93U2VsZWN0aW9uTGltaXQgPSByb3dTZWxlY3Rpb25MaW1pdDtcblxuXHRcdFx0bGV0IGVuYWJsZVJvd1NlbGVjdGlvbiA9IHRoaXMuX2lucHV0RW5hYmxlUm93U2VsZWN0aW9uO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRtb2JpbGUgJiYgLy8gd2UncmUgbW9iaWxlXG5cdFx0XHRcdHJvd0FjdGlvbnNGbG9hdGluZz8ubGVuZ3RoICYmIC8vIHdlIGhhdmUgYXRsZWFzdCAxIGl0ZW0gaW4gX3Jvd0FjdGlvbnNGbG9hdGluZ1xuXHRcdFx0XHQhZW5hYmxlUm93U2VsZWN0aW9uXG5cdFx0XHQpIHtcblx0XHRcdFx0ZW5hYmxlUm93U2VsZWN0aW9uID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZW5hYmxlUm93U2VsZWN0aW9uID0gZW5hYmxlUm93U2VsZWN0aW9uO1xuXG5cdFx0XHR0aGlzLnJvd0FjdGlvbnNSb3ckLm5leHQocm93QWN0aW9uc1Jvdyk7XG5cdFx0XHR0aGlzLnJvd0FjdGlvbnNGbG9hdGluZ0FsbCQubmV4dChyb3dBY3Rpb25zRmxvYXRpbmcpO1xuXG5cdFx0XHR0aGlzLmZsb2F0aW5nTWVudVNob3duJFxuXHRcdFx0XHQucGlwZShcblx0XHRcdFx0XHR0YWtlKDEpLFxuXHRcdFx0XHRcdGZpbHRlcih2ID0+ICEhdilcblx0XHRcdFx0KVxuXHRcdFx0XHQuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3Nob3dGbG9hdGluZ01lbnUoKSk7XG5cdFx0fSwgMjAwKTtcblx0fVxuXG5cdHByaXZhdGUgX3Nob3dGbG9hdGluZ01lbnUoKSB7XG5cdFx0dGhpcy5yb3dBY3Rpb25zRmxvYXRpbmdBbGwkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGFjdGlvbnMgPT4ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLnJvd1NlbGVjdGlvbkxpbWl0ID09PSAxICYmXG5cdFx0XHRcdGFjdGlvbnMuZmluZEluZGV4KFxuXHRcdFx0XHRcdGEgPT4gKGEudHlwZSA9PT0gJ3NpbmdsZScgfHwgYS50eXBlID09PSAnYm90aCcpICYmIGEuc2hvd0Z1bmN0aW9uXG5cdFx0XHRcdCkgPj0gMFxuXHRcdFx0KSB7XG5cdFx0XHRcdGFjdGlvbnMgPSBhY3Rpb25zLmZpbHRlcihcblx0XHRcdFx0XHRhID0+XG5cdFx0XHRcdFx0XHRhLnR5cGUgPT09ICdtdWx0aScgfHxcblx0XHRcdFx0XHRcdCFhLnNob3dGdW5jdGlvbiB8fFxuXHRcdFx0XHRcdFx0YS5zaG93RnVuY3Rpb24odGhpcy5zZWxlY3RlZFJvd3NbMF0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucm93QWN0aW9uc0Zsb2F0aW5nJC5uZXh0KGFjdGlvbnMpO1xuXHRcdFx0dGhpcy5mbG9hdGluZ01lbnVTaG93biQubmV4dCh0cnVlKTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgX3BhcnNlRGVmaW5pdGlvbnMoZGVmaW5pdGlvbnNBcnJheTogVGFibGVDb2x1bW5bXSkge1xuXHRcdHJldHVybiBkZWZpbml0aW9uc0FycmF5Lm1hcChkZWZpbml0aW9uID0+IHtcblx0XHRcdGRlZmluaXRpb24gPSB0aGlzLl9wYXJzZURlZmluaXRpb25TaXplcyhkZWZpbml0aW9uKTtcblx0XHRcdHJldHVybiBkZWZpbml0aW9uO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBfcGFyc2VEZWZpbml0aW9uU2l6ZXMoZGVmaW5pdGlvbjogVGFibGVDb2x1bW4pIHtcblx0XHRjb25zdCBkZWZpbml0aW9uQW55ID0gZGVmaW5pdGlvbiBhcyBhbnk7XG5cdFx0bGV0IHBhcnNlZFNpemVzOiBUYWJsZUNvbHVtblNpemVzID0geyBkZWZhdWx0OiAnZnVsbCcgfTtcblxuXHRcdGZvciAoY29uc3QgW2luZGV4LCBzaXplXSBvZiB0YWJsZUNvbHVtU2l6ZXNPcHRpb25zLmVudHJpZXMoKSkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRkZWZpbml0aW9uQW55LnNpemVzID09PSAnYXV0bycgfHxcblx0XHRcdFx0ZGVmaW5pdGlvbkFueS5zaXplcyA9PT0gJ2hpZGRlbicgfHxcblx0XHRcdFx0ZGVmaW5pdGlvbkFueS5zaXplcyA9PT0gJ2Z1bGwnIHx8XG5cdFx0XHRcdHR5cGVvZiBkZWZpbml0aW9uQW55LnNpemVzID09PSAnbnVtYmVyJ1xuXHRcdFx0KSB7XG5cdFx0XHRcdHBhcnNlZFNpemVzW3NpemVdID1cblx0XHRcdFx0XHRkZWZpbml0aW9uQW55LnNpemVzID09PSAnYXV0bycgPyAnZnVsbCcgOiBkZWZpbml0aW9uQW55LnNpemVzO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0cGFyc2VkU2l6ZXNbc2l6ZV0gPVxuXHRcdFx0XHRkZWZpbml0aW9uQW55LnNpemVzW3NpemVdID8/XG5cdFx0XHRcdHBhcnNlZFNpemVzW3RhYmxlQ29sdW1TaXplc09wdGlvbnNbaW5kZXggLSAxXV07XG5cdFx0fVxuXG5cdFx0ZGVmaW5pdGlvbi5wYXJzZWRTaXplcyA9IHBhcnNlZFNpemVzO1xuXHRcdHJldHVybiBkZWZpbml0aW9uO1xuXHR9XG5cblx0cHJpdmF0ZSBfY2hlY2tDaGFuZ2VzU3Vic2NyaXB0aW9ucygpIHtcblx0XHRpZiAoIXRoaXMuX3Jvd0NoYW5nZXNTdWJzY3JpcHRpb24gJiYgdGhpcy50YWJsZVJvd3MpIHtcblx0XHRcdHRoaXMuX3Jvd0NoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLnRhYmxlUm93cy5jaGFuZ2VzXG5cdFx0XHRcdC5waXBlKHVudGlsRGVzdHJveWVkKHRoaXMpLCBkZWJvdW5jZVRpbWUoMTAwKSlcblx0XHRcdFx0LnN1YnNjcmliZSgoKSA9PiB0aGlzLl9jYWxjdWxhdGVDb2x1bW5XaWR0aHMoKSk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLl9jZWxsQ2hhbmdlc1N1YnNjcmlwdGlvbiAmJiB0aGlzLnRhYmxlQ2VsbHMpIHtcblx0XHRcdHRoaXMuX2NlbGxDaGFuZ2VzU3Vic2NyaXB0aW9uID0gdGhpcy50YWJsZUNlbGxzLmNoYW5nZXNcblx0XHRcdFx0LnBpcGUodW50aWxEZXN0cm95ZWQodGhpcyksIGRlYm91bmNlVGltZSgxMDApKVxuXHRcdFx0XHQuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2NhbGN1bGF0ZUNvbHVtbldpZHRocygpKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIF9jYWxjdWxhdGVDb2x1bW5XaWR0aHMoKSB7XG5cdFx0aWYgKCF0aGlzLmVuYWJsZVNjcm9sbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy50YWJsZUNlbGxzIHx8ICF0aGlzLnRhYmxlUm93cykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9jYWxjdWxhdGVDb2x1bW5XaWR0aHNUaW1lb3V0KSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy5fY2FsY3VsYXRlQ29sdW1uV2lkdGhzVGltZW91dCk7XG5cdFx0XHR0aGlzLl9jYWxjdWxhdGVDb2x1bW5XaWR0aHNUaW1lb3V0ID0gMDtcblx0XHR9XG5cblx0XHRjb25zdCByb3dzID0gdGhpcy50YWJsZVJvd3MubWFwKFxuXHRcdFx0YyA9PiBjLm5hdGl2ZUVsZW1lbnQgYXMgdW5rbm93biBhcyBIVE1MRWxlbWVudFxuXHRcdCk7XG5cdFx0Y29uc3QgY2VsbHMgPSB0aGlzLnRhYmxlQ2VsbHMubWFwKFxuXHRcdFx0YyA9PiBjLm5hdGl2ZUVsZW1lbnQgYXMgdW5rbm93biBhcyBIVE1MRWxlbWVudFxuXHRcdCk7XG5cblx0XHR0aGlzLl9jYWxjdWxhdGVDb2x1bW5XaWR0aHNUaW1lb3V0ID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG5cdFx0XHR0aGlzLl9zZXRSb3dzV2lkdGgocm93cyk7XG5cblx0XHRcdGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcblx0XHRcdGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xuXHRcdFx0XHRpZiAoY2VsbC5zdHlsZS53aWR0aD8ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Y2VsbC5zdHlsZS53aWR0aCA9ICcnO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRuZXcgUHJvbWlzZShyZXNvbHZlID0+XG5cdFx0XHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgcmVjdCA9IGNlbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0XHRcdFx0XHRcdGNlbGwuc2V0QXR0cmlidXRlKCdzdHlsZScsIGB3aWR0aDogJHtyZWN0LndpZHRofXB4ICFpbXBvcnRhbnRgKTtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSwgMTAwKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuXG5cdFx0XHR0aGlzLl9zZXRSb3dzV2lkdGgocm93cywgJ21pbi1jb250ZW50Jyk7XG5cblx0XHRcdHRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24oKTtcblx0XHR9LCAyMDApIGFzIHVua25vd24gYXMgbnVtYmVyO1xuXHR9XG5cblx0cHJpdmF0ZSBfc2V0Um93c1dpZHRoKFxuXHRcdHJvd3M6IEhUTUxFbGVtZW50W10sXG5cdFx0dmFsdWU6ICdtaW4tY29udGVudCcgfCBudWxsID0gbnVsbFxuXHQpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHJvdyA9IHJvd3NbaV07XG5cblx0XHRcdGNvbnN0IHNoYWRvdyA9IHJvdy5zaGFkb3dSb290O1xuXHRcdFx0aWYgKCFzaGFkb3cpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGZpcnN0RGl2ID0gc2hhZG93LnF1ZXJ5U2VsZWN0b3IoJyo6bnRoLWNoaWxkKDEpJyk7XG5cdFx0XHRpZiAoIWZpcnN0RGl2KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBzZWNvbmREaXYgPSBmaXJzdERpdi5xdWVyeVNlbGVjdG9yKCcqOm50aC1jaGlsZCgxKScpO1xuXHRcdFx0aWYgKCFzZWNvbmREaXYpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRmaXJzdERpdi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJycpO1xuXHRcdFx0XHRzZWNvbmREaXYuc2V0QXR0cmlidXRlKCdzdHlsZScsICcnKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGZpcnN0RGl2LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnd2lkdGg6IG1pbi1jb250ZW50OycpO1xuXHRcdFx0c2Vjb25kRGl2LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnd2lkdGg6IG1pbi1jb250ZW50OycpO1xuXG5cdFx0XHRpZiAoaSA9PT0gMCkge1xuXHRcdFx0XHR0aGlzLl90b3RhbFdpZHRoID0gZmlyc3REaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBfcmVzZXRTY3JvbGxQb3NpdGlvbigpIHtcblx0XHRpZiAodGhpcy5zY3JvbGxDb250YWluZXIpIHtcblx0XHRcdHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IDA7XG5cdFx0fVxuXG5cdFx0dGhpcy5yZWFjaGVkU2Nyb2xsU3RhcnQkLm5leHQodHJ1ZSk7XG5cdFx0dGhpcy5yZWFjaGVkU2Nyb2xsRW5kJC5uZXh0KGZhbHNlKTtcblx0fVxuXG5cdHByaXZhdGUgX2NhbGN1bGF0ZVNjcm9sbFBvc2l0aW9uKHsgdGFyZ2V0IH06IHsgdGFyZ2V0OiBIVE1MRGl2RWxlbWVudCB9KSB7XG5cdFx0dGhpcy5yZWFjaGVkU2Nyb2xsU3RhcnQkLm5leHQodGFyZ2V0LnNjcm9sbExlZnQgPCAxMDApO1xuXG5cdFx0Y29uc3QgcmlnaHQgPSB0YXJnZXQuc2Nyb2xsTGVmdCArIHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblx0XHR0aGlzLnJlYWNoZWRTY3JvbGxFbmQkLm5leHQocmlnaHQgPiB0aGlzLl90b3RhbFdpZHRoIC0gMTAwKTtcblx0fVxufVxuIiwiPHAtdGFibGUtY29udGFpbmVyPlxuXHQ8cC10YWJsZS1oZWFkZXJcblx0XHQqbmdJZj1cImVuYWJsZUhlYWRlclwiXG5cdFx0Y2xhc3M9XCJtYi04XCJcblx0XHRbcXVpY2tGaWx0ZXJzXT1cInF1aWNrRmlsdGVyc1wiXG5cdFx0W2FjdGl2ZVF1aWNrRmlsdGVySWRlbnRpZmllcl09XCJhY3RpdmVRdWlja0ZpbHRlcklkZW50aWZpZXJcIlxuXHRcdChxdWlja0ZpbHRlcik9XCJvblF1aWNrRmlsdGVyKCRldmVudClcIlxuXHRcdFtlbmFibGVTZWFyY2hdPVwiZW5hYmxlU2VhcmNoXCJcblx0XHRbcXVlcnldPVwicXVlcnlcIlxuXHRcdChxdWVyeUNoYW5nZSk9XCJvblF1ZXJ5Q2hhbmdlKCRldmVudClcIlxuXHRcdFtlbmFibGVGaWx0ZXJdPVwiZW5hYmxlRmlsdGVyXCJcblx0XHRbZW5hYmxlRmlsdGVyRGVza3RvcF09XCJlbmFibGVGaWx0ZXJEZXNrdG9wXCJcblx0XHRbc2VsZWN0ZWRGaWx0ZXJzQW1vdW50XT1cInNlbGVjdGVkRmlsdGVyc0Ftb3VudFwiXG5cdFx0W2ZpbHRlckJ1dHRvblRlbXBsYXRlXT1cImZpbHRlckJ1dHRvblRlbXBsYXRlXCJcblx0XHQoZmlsdGVyKT1cImZpbHRlck1vZGFsU2hvdyQubmV4dCh0cnVlKVwiXG5cdFx0W2VuYWJsZUFjdGlvbl09XCJlbmFibGVBY3Rpb25cIlxuXHRcdFtjYW5Vc2VBY3Rpb25dPVwiYWN0aW9uQnV0dG9uRW5hYmxlZFwiXG5cdFx0W2FjdGlvbkJ1dHRvblRlbXBsYXRlXT1cImFjdGlvbkJ1dHRvblRlbXBsYXRlXCJcblx0XHRbYWN0aW9uTG9hZGluZ109XCJhY3Rpb25CdXR0b25Mb2FkaW5nXCJcblx0XHRbYWN0aW9uVGV4dF09XCJhY3Rpb25CdXR0b25UZXh0XCJcblx0XHRbYWN0aW9uSWNvbl09XCJhY3Rpb25CdXR0b25JY29uXCJcblx0XHQoYWN0aW9uKT1cImFjdGlvbi5lbWl0KClcIlxuXHRcdFtpdGVtc1NlbGVjdGVkQW1vdW50XT1cInNlbGVjdGVkUm93cy5sZW5ndGhcIlxuXHRcdFtlbmFibGVFeHBvcnRdPVwiZW5hYmxlRXhwb3J0XCJcblx0XHQoZXhwb3J0KT1cImV4cG9ydC5lbWl0KClcIlxuXHRcdFtsb2FkaW5nXT1cImhlYWRlckxvYWRpbmdcIlxuXHQ+XG5cdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImhlYWRlckN1c3RvbUZpbHRlclRlbXBsYXRlXCI+XG5cdFx0XHQ8bmctY29udGFpbmVyXG5cdFx0XHRcdCpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyQ3VzdG9tRmlsdGVyVGVtcGxhdGVcIlxuXHRcdFx0PjwvbmctY29udGFpbmVyPlxuXHRcdDwvbmctY29udGFpbmVyPlxuXG5cdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImhlYWRlckN1c3RvbUFjdGlvbnNUZW1wbGF0ZVwiPlxuXHRcdFx0PG5nLWNvbnRhaW5lclxuXHRcdFx0XHQqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlckN1c3RvbUFjdGlvbnNUZW1wbGF0ZVwiXG5cdFx0XHQ+PC9uZy1jb250YWluZXI+XG5cdFx0PC9uZy1jb250YWluZXI+XG5cdDwvcC10YWJsZS1oZWFkZXI+XG5cblx0PGRpdlxuXHRcdGNsYXNzPVwicmVsYXRpdmUgZmxleC0xXCJcblx0XHQqbmdJZj1cImVuYWJsZVNjcm9sbDsgZWxzZSByb3dzVGVtcGxhdGVcIlxuXHQ+XG5cdFx0PGRpdlxuXHRcdFx0Y2xhc3M9XCJmbGV4IGZsZXgtY29sIG92ZXJmbG93LXgtYXV0b1wiXG5cdFx0XHQjc2Nyb2xsQ29udGFpbmVyXG5cdFx0XHRbY2xhc3NdPVwiXG5cdFx0XHRcdGNuKFxuXHRcdFx0XHRcdCdiZWZvcmU6YWJzb2x1dGUgYmVmb3JlOnRvcC0wIGJlZm9yZTpsZWZ0LTAgYmVmb3JlOnotWzFdIGJlZm9yZTpwb2ludGVyLWV2ZW50cy1ub25lJyxcblx0XHRcdFx0XHQnYmVmb3JlOnctWzEwJV0gYmVmb3JlOmgtZnVsbCBiZWZvcmU6dHJhbnNpdGlvbi1vcGFjaXR5Jyxcblx0XHRcdFx0XHQnYmVmb3JlOmJnLWdyYWRpZW50LXRvLXIgYmVmb3JlOmZyb20td2hpdGUgYmVmb3JlOnZpYS13aGl0ZS84MCBiZWZvcmU6dG8tdHJhbnNwYXJlbnQnLFxuXHRcdFx0XHRcdCdhZnRlcjphYnNvbHV0ZSBhZnRlcjp0b3AtMCBhZnRlcjpyaWdodC0wIGFmdGVyOnotWzBdIGJlZm9yZTpwb2ludGVyLWV2ZW50cy1ub25lJyxcblx0XHRcdFx0XHQnYWZ0ZXI6dy1bMTAlXSBhZnRlcjpoLWZ1bGwgYWZ0ZXI6dHJhbnNpdGlvbi1vcGFjaXR5Jyxcblx0XHRcdFx0XHQnYWZ0ZXI6YmctZ3JhZGllbnQtdG8tbCBhZnRlcjpmcm9tLXdoaXRlIGFmdGVyOnZpYS13aGl0ZS84MCBhZnRlcjp0by10cmFuc3BhcmVudCcsXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0J2JlZm9yZTpvcGFjaXR5LTAnOiByZWFjaGVkU2Nyb2xsU3RhcnQkIHwgYXN5bmMsXG5cdFx0XHRcdFx0XHQnYWZ0ZXI6b3BhY2l0eS0wJzogcmVhY2hlZFNjcm9sbEVuZCQgfCBhc3luYyxcblx0XHRcdFx0XHRcdCdiZWZvcmU6b3BhY2l0eS0xMDAnOiAocmVhY2hlZFNjcm9sbFN0YXJ0JCB8IGFzeW5jKSA9PT0gZmFsc2UsXG5cdFx0XHRcdFx0XHQnYWZ0ZXI6b3BhY2l0eS0xMDAnOiAocmVhY2hlZFNjcm9sbEVuZCQgfCBhc3luYykgPT09IGZhbHNlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpXG5cdFx0XHRcIlxuXHRcdFx0KHNjcm9sbCk9XCJvbkNvbnRhaW5lclhTY3JvbGwoJGV2ZW50KVwiXG5cdFx0PlxuXHRcdFx0PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJvd3NUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuXHRcdDwvZGl2PlxuXHQ8L2Rpdj5cblxuXHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZW5hYmxlRmxvYXRpbmdNZW51ICYmIGVuYWJsZVJvd1NlbGVjdGlvblwiPlxuXHRcdDxwLWZsb2F0aW5nLW1lbnUtY29udGFpbmVyXG5cdFx0XHRbdXNlZEluVGFibGVdPVwidHJ1ZVwiXG5cdFx0XHRbY2xhc3NdPVwiXG5cdFx0XHRcdGZsb2F0aW5nTWVudUNvbnRhaW5lckNsYXNzKHtcblx0XHRcdFx0XHRoYXNGb290ZXI6IGVuYWJsZUZvb3RlciAmJiAoZm9vdGVySGlkZGVuJCB8IGFzeW5jKSA9PT0gZmFsc2UsXG5cdFx0XHRcdFx0YWN0aXZlOiBzZWxlY3RlZFJvd3MubGVuZ3RoID4gMCxcblx0XHRcdFx0XHRzaG93bjogJGFueShmbG9hdGluZ01lbnVTaG93biQgfCBhc3luYylcblx0XHRcdFx0fSlcblx0XHRcdFwiXG5cdFx0XHRbYW1vdW50XT1cImZsb2F0aW5nTWVudUFtb3VudFNlbGVjdGVkVGV4dFwiXG5cdFx0XHRbZW5hYmxlQW1vdW50U2VsZWN0ZWRdPVwiISEocm93QWN0aW9uc0Zsb2F0aW5nJCB8IGFzeW5jKT8ubGVuZ3RoXCJcblx0XHRcdChjbG9zZSk9XCJfc2VsZWN0QWxsQ2hhbmdlKG51bGwsIGZhbHNlKVwiXG5cdFx0PlxuXHRcdFx0PHAtZmxvYXRpbmctbWVudS1pdGVtXG5cdFx0XHRcdCpuZ0Zvcj1cImxldCBhY3Rpb24gb2Ygcm93QWN0aW9uc0Zsb2F0aW5nJCB8IGFzeW5jXCJcblx0XHRcdFx0c2xvdD1cImZsb2F0aW5nLW1lbnUtaXRlbVwiXG5cdFx0XHRcdFtkaXNhYmxlZF09XCJcblx0XHRcdFx0XHQoYWN0aW9uWyd0eXBlJ10gPT09ICdzaW5nbGUnICYmIHNlbGVjdGVkUm93cy5sZW5ndGggPiAxKSB8fFxuXHRcdFx0XHRcdGFjdGlvblsnZGlzYWJsZWQnXVxuXHRcdFx0XHRcIlxuXHRcdFx0XHRbbG9hZGluZ109XCJhY3Rpb25bJ2xvYWRpbmcnXVwiXG5cdFx0XHRcdFtpY29uXT1cImFjdGlvblsnaWNvbiddXCJcblx0XHRcdFx0W2ljb25Sb3RhdGVdPVwiYWN0aW9uWydpY29uUm90YXRlJ11cIlxuXHRcdFx0XHRbaWNvbkZsaXBdPVwiYWN0aW9uWydpY29uRmxpcCddXCJcblx0XHRcdFx0KGNsaWNrKT1cIl9yb3dBY3Rpb25DbGljayhhY3Rpb24pXCJcblx0XHRcdD5cblx0XHRcdFx0e3sgYWN0aW9uWydsYWJlbCddIH19XG5cdFx0XHQ8L3AtZmxvYXRpbmctbWVudS1pdGVtPlxuXHRcdDwvcC1mbG9hdGluZy1tZW51LWNvbnRhaW5lcj5cblx0PC9uZy1jb250YWluZXI+XG5cblx0PHAtdGFibGUtZm9vdGVyXG5cdFx0Km5nSWY9XCJlbmFibGVGb290ZXJcIlxuXHRcdFtoaWRlT25TaW5nbGVQYWdlXT1cImhpZGVPblNpbmdsZVBhZ2VcIlxuXHRcdFtlbmFibGVQYWdpbmF0aW9uU2l6ZV09XCJlbmFibGVQYWdpbmF0aW9uU2l6ZVwiXG5cdFx0W3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcblx0XHRbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiXG5cdFx0KHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiXG5cdFx0W2VuYWJsZVBhZ2luYXRpb25QYWdlc109XCJlbmFibGVQYWdpbmF0aW9uUGFnZXNcIlxuXHRcdFtwYWdlXT1cInBhZ2VcIlxuXHRcdFt0b3RhbF09XCJ0b3RhbFwiXG5cdFx0KHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuXHRcdFtsb2FkaW5nXT1cImZvb3RlckxvYWRpbmdcIlxuXHRcdChoaWRkZW5DaGFuZ2UpPVwiZm9vdGVySGlkZGVuJC5uZXh0KCRldmVudC5kZXRhaWwpXCJcblx0PjwvcC10YWJsZS1mb290ZXI+XG48L3AtdGFibGUtY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI3Jvd3NUZW1wbGF0ZT5cblx0PHAtdGFibGUtcm93IHZhcmlhbnQ9XCJoZWFkZXJcIj5cblx0XHQ8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1ucyQgfCBhc3luYzsgbGV0IGluZGV4ID0gaW5kZXhcIj5cblx0XHRcdDxwLXRhYmxlLWNlbGwtbmd4XG5cdFx0XHRcdFtkZWZpbml0aW9uXT1cImNvbFwiXG5cdFx0XHRcdFt2YWx1ZV09XCJjb2wubmFtZVwiXG5cdFx0XHRcdHZhcmlhbnQ9XCJoZWFkZXJcIlxuXHRcdFx0XHRbaW5kZXhdPVwiaW5kZXhcIlxuXHRcdFx0XHRbY2hlY2tib3hdPVwiXG5cdFx0XHRcdFx0KGluZGV4ID09PSAwIHx8IGNvbC5oYXNDaGVja2JveCkgJiYgZW5hYmxlUm93U2VsZWN0aW9uXG5cdFx0XHRcdFx0XHQ/IGNoZWNrYm94VGVtcGxhdGVcblx0XHRcdFx0XHRcdDogdW5kZWZpbmVkXG5cdFx0XHRcdFwiXG5cdFx0XHQ+PC9wLXRhYmxlLWNlbGwtbmd4PlxuXHRcdFx0PG5nLXRlbXBsYXRlICNjaGVja2JveFRlbXBsYXRlPlxuXHRcdFx0XHQ8cC1jaGVja2JveFxuXHRcdFx0XHRcdChjaGVja2VkQ2hhbmdlKT1cIl9zZWxlY3RBbGxDaGFuZ2UoJGV2ZW50KVwiXG5cdFx0XHRcdFx0W2NoZWNrZWRdPVwiX3NlbGVjdGlvbkNvbnRhaW5zQWxsKClcIlxuXHRcdFx0XHRcdFtpbmRldGVybWluYXRlXT1cIl9zZWxlY3Rpb25JbmRldGVybWluYXRlKClcIlxuXHRcdFx0XHRcdFtjbGFzcy5vcGFjaXR5LTBdPVwicm93U2VsZWN0aW9uTGltaXQgIT09IHVuZGVmaW5lZFwiXG5cdFx0XHRcdFx0W2Rpc2FibGVkXT1cInJvd1NlbGVjdGlvbkxpbWl0ICE9PSB1bmRlZmluZWRcIlxuXHRcdFx0XHQ+PC9wLWNoZWNrYm94PlxuXHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHQ8L25nLWNvbnRhaW5lcj5cblx0PC9wLXRhYmxlLXJvdz5cblxuXHQ8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LTEgZmxleC1jb2xcIj5cblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZzsgZWxzZSBjb250ZW50VGVtcGxhdGVcIj5cblx0XHRcdDxwLXRhYmxlLXJvd1xuXHRcdFx0XHQqbmdGb3I9XCJsZXQgciBvZiBsb2FkaW5nUm93czsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIlxuXHRcdFx0XHRbZW5hYmxlSG92ZXJdPVwiZW5hYmxlUm93U2VsZWN0aW9uIHx8IGVuYWJsZVJvd0NsaWNrXCJcblx0XHRcdFx0W2lzTGFzdF09XCJyb3dJbmRleCA9PT0gbG9hZGluZ1Jvd3MubGVuZ3RoIC0gMVwiXG5cdFx0XHQ+XG5cdFx0XHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zJCB8IGFzeW5jOyBsZXQgaW5kZXggPSBpbmRleFwiPlxuXHRcdFx0XHRcdDxwLXRhYmxlLWNlbGwtbmd4XG5cdFx0XHRcdFx0XHRbZGVmaW5pdGlvbl09XCJjb2xcIlxuXHRcdFx0XHRcdFx0dmFyaWFudD1cImxvYWRpbmdcIlxuXHRcdFx0XHRcdFx0W2NoZWNrYm94XT1cIlxuXHRcdFx0XHRcdFx0XHQoaW5kZXggPT09IDAgfHwgY29sLmhhc0NoZWNrYm94KSAmJiBlbmFibGVSb3dTZWxlY3Rpb25cblx0XHRcdFx0XHRcdFx0XHQ/IGNoZWNrYm94VGVtcGxhdGVcblx0XHRcdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0XCJcblx0XHRcdFx0XHRcdFtpbmRleF09XCJpbmRleFwiXG5cdFx0XHRcdFx0XHRbcm93SW5kZXhdPVwicm93SW5kZXhcIlxuXHRcdFx0XHRcdD48L3AtdGFibGUtY2VsbC1uZ3g+XG5cdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNjaGVja2JveFRlbXBsYXRlPlxuXHRcdFx0XHRcdFx0PHAtbG9hZGVyXG5cdFx0XHRcdFx0XHRcdHZhcmlhbnQ9XCJnaG9zdFwiXG5cdFx0XHRcdFx0XHRcdGNsYXNzPVwiaC02IHctNiByb3VuZGVkXCJcblx0XHRcdFx0XHRcdD48L3AtbG9hZGVyPlxuXHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0XHRcdDwvbmctY29udGFpbmVyPlxuXHRcdFx0PC9wLXRhYmxlLXJvdz5cblx0XHQ8L25nLWNvbnRhaW5lcj5cblxuXHRcdDxuZy10ZW1wbGF0ZSAjY29udGVudFRlbXBsYXRlPlxuXHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cInBhcnNlZEl0ZW1zPy5sZW5ndGg7IGVsc2UgZW1wdHlTdGF0ZVRlbXBsYXRlXCI+XG5cdFx0XHRcdDxwLXRhYmxlLXJvd1xuXHRcdFx0XHRcdCpuZ0Zvcj1cImxldCBpdGVtIG9mIHBhcnNlZEl0ZW1zOyBsZXQgcm93SW5kZXggPSBpbmRleFwiXG5cdFx0XHRcdFx0W2VuYWJsZUhvdmVyXT1cImVuYWJsZVJvd1NlbGVjdGlvbiB8fCBlbmFibGVSb3dDbGlja1wiXG5cdFx0XHRcdFx0W2NoZWNrZWRdPVwiX3NlbGVjdGlvbkNvbnRhaW5zKGl0ZW0sIHJvd0luZGV4KVwiXG5cdFx0XHRcdFx0W2lzTGFzdF09XCJyb3dJbmRleCA9PT0gcGFyc2VkSXRlbXMubGVuZ3RoIC0gMVwiXG5cdFx0XHRcdFx0KGNsaWNrKT1cIl9yb3dDbGljaygkZXZlbnQsIHJvd0luZGV4KVwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8bmctY29udGFpbmVyXG5cdFx0XHRcdFx0XHQqbmdJZj1cIlxuXHRcdFx0XHRcdFx0XHRwYXJzZVJvd0FjdGlvbnNSb3coXG5cdFx0XHRcdFx0XHRcdFx0cm93QWN0aW9uc1JvdyQgfCBhc3luYyxcblx0XHRcdFx0XHRcdFx0XHRyb3dJbmRleFxuXHRcdFx0XHRcdFx0XHQpIGFzIHJvd0FjdGlvbnNSb3dcblx0XHRcdFx0XHRcdFwiXG5cdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lclxuXHRcdFx0XHRcdFx0XHQqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnMkIHwgYXN5bmM7IGxldCBpbmRleCA9IGluZGV4XCJcblx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0PHAtdGFibGUtY2VsbC1uZ3hcblx0XHRcdFx0XHRcdFx0XHRbZGVmaW5pdGlvbl09XCJjb2xcIlxuXHRcdFx0XHRcdFx0XHRcdFtpdGVtXT1cIml0ZW1cIlxuXHRcdFx0XHRcdFx0XHRcdFtjaGVja2JveF09XCJcblx0XHRcdFx0XHRcdFx0XHRcdChpbmRleCA9PT0gMCB8fCBjb2wuaGFzQ2hlY2tib3gpICYmIGVuYWJsZVJvd1NlbGVjdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ/IGNoZWNrYm94VGVtcGxhdGVcblx0XHRcdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0XHRcIlxuXHRcdFx0XHRcdFx0XHRcdFtpbmRleF09XCJpbmRleFwiXG5cdFx0XHRcdFx0XHRcdFx0W3Jvd0luZGV4XT1cInJvd0luZGV4XCJcblx0XHRcdFx0XHRcdFx0XHRbdGVtcGxhdGVdPVwiY29sLnRlbXBsYXRlXCJcblx0XHRcdFx0XHRcdFx0PjwvcC10YWJsZS1jZWxsLW5neD5cblxuXHRcdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI2NoZWNrYm94VGVtcGxhdGU+XG5cdFx0XHRcdFx0XHRcdFx0PHAtY2hlY2tib3hcblx0XHRcdFx0XHRcdFx0XHRcdChjaGVja2VkQ2hhbmdlKT1cIl9jaGVja2JveENoYW5nZSgkZXZlbnQudGFyZ2V0LCByb3dJbmRleClcIlxuXHRcdFx0XHRcdFx0XHRcdFx0W2Rpc2FibGVkXT1cIl9jaGVja2JveERpc2FibGVkKGl0ZW0sIHJvd0luZGV4KVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRbY2hlY2tlZF09XCJfc2VsZWN0aW9uQ29udGFpbnMoaXRlbSwgcm93SW5kZXgpXCJcblx0XHRcdFx0XHRcdFx0XHQ+PC9wLWNoZWNrYm94PlxuXHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XG5cblx0XHRcdFx0XHRcdDxwLXRhYmxlLXJvdy1hY3Rpb25zLWNvbnRhaW5lclxuXHRcdFx0XHRcdFx0XHQqbmdJZj1cIiEhcm93QWN0aW9uc1Jvdz8ubGVuZ3RoICYmICEoaXNNb2JpbGUkIHwgYXN5bmMpXCJcblx0XHRcdFx0XHRcdFx0c2xvdD1cImFjdGlvbnNcIlxuXHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb24gb2Ygcm93QWN0aW9uc1Jvd1wiPlxuXHRcdFx0XHRcdFx0XHRcdDxwLXRvb2x0aXBcblx0XHRcdFx0XHRcdFx0XHRcdCpuZ0lmPVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFjdGlvbi5zaG93RnVuY3Rpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IGFjdGlvbi5zaG93RnVuY3Rpb24ocGFyc2VkSXRlbXNbcm93SW5kZXhdKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogdHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFtjb250ZW50XT1cImFjdGlvblsnbGFiZWwnXVwiXG5cdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0PHAtYnV0dG9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGEtaXMtYWN0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzbG90PVwidHJpZ2dlclwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFtpY29uXT1cImFjdGlvblsnaWNvbiddXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0W2ljb25Sb3RhdGVdPVwiYWN0aW9uWydpY29uUm90YXRlJ11cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpY29uRmxpcD1cImFjdGlvbi5pY29uRmxpcFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGljb25Pbmx5PVwidHJ1ZVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNpemU9XCJzbVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFtsb2FkaW5nXT1cImFjdGlvblsnbG9hZGluZyddXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0W2Rpc2FibGVkXT1cImFjdGlvblsnZGlzYWJsZWQnXVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFtyb3V0ZXJMaW5rXT1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFjdGlvbi5yb3V0ZXJMaW5rXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IChfZ2V0QWN0aW9uUm91dGVyTGluayhhY3Rpb24ucm91dGVyTGluaywgcm93SW5kZXgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIHwgYXN5bmMpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IG51bGxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0W3F1ZXJ5UGFyYW1zXT1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFjdGlvbi5xdWVyeVBhcmFtc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoX2dldEFjdGlvblF1ZXJ5UGFyYW1zKGFjdGlvbi5xdWVyeVBhcmFtcywgcm93SW5kZXgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIHwgYXN5bmMpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IG51bGxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KG9uQ2xpY2spPVwiX3Jvd0FjdGlvbkNsaWNrKGFjdGlvbiwgcm93SW5kZXgpXCJcblx0XHRcdFx0XHRcdFx0XHRcdD48L3AtYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHRcdDwvcC10b29sdGlwPlxuXHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cblx0XHRcdFx0XHRcdDwvcC10YWJsZS1yb3ctYWN0aW9ucy1jb250YWluZXI+XG5cdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XG5cdFx0XHRcdDwvcC10YWJsZS1yb3c+XG5cdFx0XHQ8L25nLWNvbnRhaW5lcj5cblx0XHQ8L25nLXRlbXBsYXRlPlxuXG5cdFx0PG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY3VzdG9tUm93IG9mIGN1c3RvbVJvd3NcIj5cblx0XHRcdDxwLXRhYmxlLXJvdyBbdmFyaWFudF09XCJjdXN0b21Sb3cudmFyaWFudFwiPlxuXHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tUm93LnRlbXBsYXRlUmVmXCI+PC9uZy1jb250YWluZXI+XG5cdFx0XHQ8L3AtdGFibGUtcm93PlxuXHRcdDwvbmctY29udGFpbmVyPlxuXHQ8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJNb2RhbFRlbXBsYXRlXCI+XG5cdDxwLW1vZGFsXG5cdFx0W2hlYWRlcl09XCJmaWx0ZXJNb2RhbEhlYWRlclRleHRcIlxuXHRcdFtzaG93XT1cImZpbHRlck1vZGFsU2hvdyQgfCBhc3luY1wiXG5cdFx0KGNsb3NlZCk9XCJmaWx0ZXJNb2RhbFNob3ckLm5leHQoZmFsc2UpXCJcblx0PlxuXHRcdDxkaXZcblx0XHRcdHNsb3Q9XCJjb250ZW50XCJcblx0XHRcdGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNlwiXG5cdFx0PlxuXHRcdFx0PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpbHRlck1vZGFsVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cblx0XHQ8L2Rpdj5cblx0XHQ8ZGl2XG5cdFx0XHRzbG90PVwiZm9vdGVyXCJcblx0XHRcdGNsYXNzPVwiZmxleCB3LWZ1bGwganVzdGlmeS1iZXR3ZWVuIGdhcC00XCJcblx0XHQ+XG5cdFx0XHQ8cC1idXR0b25cblx0XHRcdFx0Km5nSWY9XCJmaWx0ZXJNb2RhbFNob3dSZXNldE1vYmlsZVwiXG5cdFx0XHRcdGNsYXNzPVwiZmxleCB3LWZ1bGwgdGFibGV0OnctYXV0byBkZXNrdG9wLXhzOmhpZGRlblwiXG5cdFx0XHRcdHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuXHRcdFx0XHQob25DbGljayk9XCJvbkZpbHRlck1vZGFsUmVzZXQodHJ1ZSlcIlxuXHRcdFx0PlxuXHRcdFx0XHR7eyBmaWx0ZXJNb2RhbFJlc2V0VGV4dCB9fVxuXHRcdFx0PC9wLWJ1dHRvbj5cblx0XHRcdDxwLWJ1dHRvblxuXHRcdFx0XHQqbmdJZj1cImZpbHRlck1vZGFsU2hvd1Jlc2V0XCJcblx0XHRcdFx0Y2xhc3M9XCJoaWRkZW4gdy1mdWxsIHRhYmxldDp3LWF1dG8gZGVza3RvcC14czpmbGV4XCJcblx0XHRcdFx0dmFyaWFudD1cInNlY29uZGFyeVwiXG5cdFx0XHRcdChvbkNsaWNrKT1cIm9uRmlsdGVyTW9kYWxSZXNldCgpXCJcblx0XHRcdD5cblx0XHRcdFx0e3sgZmlsdGVyTW9kYWxSZXNldFRleHQgfX1cblx0XHRcdDwvcC1idXR0b24+XG5cdFx0XHQ8cC1idXR0b25cblx0XHRcdFx0Y2xhc3M9XCJtbC1hdXRvIHctZnVsbCB0YWJsZXQ6dy1hdXRvXCJcblx0XHRcdFx0aWNvbj1cImNoZWNrbWFya1wiXG5cdFx0XHRcdChvbkNsaWNrKT1cIm9uRmlsdGVyTW9kYWxTYXZlKClcIlxuXHRcdFx0PlxuXHRcdFx0XHR7eyBmaWx0ZXJNb2RhbFNhdmVUZXh0IH19XG5cdFx0XHQ8L3AtYnV0dG9uPlxuXHRcdDwvZGl2PlxuXHQ8L3AtbW9kYWw+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNlbXB0eVN0YXRlVGVtcGxhdGU+XG5cdDxwLWVtcHR5LXN0YXRlXG5cdFx0Km5nSWY9XCJlbXB0eVN0YXRlVHlwZSA9PT0gJ2ZpbHRlcmVkJzsgZWxzZSBlbXB0eVN0YXRlTm9uRmlsdGVyVGVtcGxhdGVcIlxuXHRcdGNsYXNzPVwibXktMTYgc2VsZi1jZW50ZXJcIlxuXHRcdFtpbGx1c3RyYXRpb25dPVwiZW1wdHlTdGF0ZUZpbHRlcmVkSWxsdXN0cmF0aW9uXCJcblx0XHRbaGVhZGVyXT1cImVtcHR5U3RhdGVGaWx0ZXJlZEhlYWRlclwiXG5cdFx0W2NvbnRlbnRdPVwiZW1wdHlTdGF0ZUZpbHRlcmVkQ29udGVudFwiXG5cdFx0W2VuYWJsZUFjdGlvbl09XCJmYWxzZVwiXG5cdD48L3AtZW1wdHktc3RhdGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2VtcHR5U3RhdGVOb25GaWx0ZXJUZW1wbGF0ZT5cblx0PHAtZW1wdHktc3RhdGVcblx0XHRjbGFzcz1cIm15LTE2IHNlbGYtY2VudGVyXCJcblx0XHRbaWxsdXN0cmF0aW9uXT1cImVtcHR5U3RhdGVJbGx1c3RyYXRpb25cIlxuXHRcdFtoZWFkZXJdPVwiZW1wdHlTdGF0ZUhlYWRlclwiXG5cdFx0W2NvbnRlbnRdPVwiZW1wdHlTdGF0ZUNvbnRlbnRcIlxuXHRcdFtlbmFibGVBY3Rpb25dPVwiZW5hYmxlRW1wdHlTdGF0ZUFjdGlvblwiXG5cdFx0W2FjdGlvblRleHRdPVwiZW1wdHlTdGF0ZUFjdGlvblwiXG5cdFx0W2FjdGlvbkljb25dPVwiZW1wdHlTdGF0ZUFjdGlvbkljb25cIlxuXHRcdChhY3Rpb24pPVwiZW1wdHlTdGF0ZUNsaWNrZWQoKVwiXG5cdD48L3AtZW1wdHktc3RhdGU+XG48L25nLXRlbXBsYXRlPlxuIl19