@cqa-lib/cqa-ui 1.1.176 → 1.1.177

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.
@@ -171,7 +171,7 @@ export class IterationsLoopComponent {
171
171
  }
172
172
  }
173
173
  IterationsLoopComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: IterationsLoopComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
174
- IterationsLoopComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: IterationsLoopComponent, selector: "cqa-iterations-loop", inputs: { iterations: "iterations", summary: "summary", isTableDataLoading: "isTableDataLoading" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\" style=\"display: block; width: 100%;\">\n <div class=\"cqa-flex cqa-flex-col\">\n <div class=\"cqa-bg-white\">\n <cqa-table-template\n [columns]=\"tableColumns\"\n [data]=\"iterations\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [isEmptyState]=\"isEmptyState\"\n [emptyStateConfig]=\"emptyStateConfig\"\n [isTableDataLoading]=\"isTableDataLoading\"\n [showSearchBar]=\"false\"\n [showFilterButton]=\"false\"\n [showSettingsButton]=\"false\"\n [showAutoRefreshButton]=\"false\"\n [showOtherButton]=\"false\"\n [showFilterPanel]=\"false\"\n [serverSidePagination]=\"false\"\n (pageChange)=\"onPageChange($event)\">\n </cqa-table-template>\n </div>\n\n <div *ngIf=\"!isEmptyState\" class=\"cqa-p-[17px] cqa-mt-6 cqa-bg-[#FBFCFF] cqa-rounded-[5px]\" style=\"border: 1px solid #E5E5E5;\">\n <h4 class=\"cqa-text-[16px] cqa-text-[#111827] cqa-mb-3\">Summary</h4>\n <div class=\"cqa-grid cqa-grid-cols-3 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mb-1\">Total Iterations</span>\n <span class=\"cqa-text-[22px] cqa-leading-[28px] cqa-font-semibold cqa-text-[#0B0B0B]\">{{ computedSummary.totalIterations }}</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mb-1\">Passed</span>\n <span class=\"cqa-text-[22px] cqa-leading-[28px] cqa-font-semibold cqa-text-[#00C950]\">{{ computedSummary.passed }}</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mb-1\">Failed</span>\n <span class=\"cqa-text-[22px] cqa-leading-[28px] cqa-font-semibold cqa-text-[#FB2C36]\">{{ computedSummary.failed }}</span>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n", components: [{ type: i1.TableTemplateComponent, selector: "cqa-table-template", inputs: ["searchPlaceholder", "searchValue", "showClear", "showSearchBar", "filterConfig", "showFilterPanel", "showFilterButton", "otherButtons", "otherDropDownButtons", "otherSelectDropDownButtons", "otherButtonLabel", "otherButtonVariant", "showOtherButton", "showActionButton", "showSettingsButton", "showAutoRefreshButton", "data", "isEmptyState", "emptyStateConfig", "actions", "chips", "filterApplied", "columns", "selectedAutoRefreshInterval", "pageIndex", "pageSize", "pageSizeOptions", "serverSidePagination", "totalElements", "isTableLoading", "isTableDataLoading"], outputs: ["onSearchChange", "onApplyFilterClick", "onResetFilterClick", "onClearAll", "removeChip", "pageChange", "onReload", "onAutoRefreshClick"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
174
+ IterationsLoopComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: IterationsLoopComponent, selector: "cqa-iterations-loop", inputs: { iterations: "iterations", summary: "summary", isTableDataLoading: "isTableDataLoading" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\" style=\"display: block; width: 100%;\">\n <div class=\"cqa-flex cqa-flex-col\">\n <div class=\"cqa-bg-white\">\n <cqa-table-template\n [columns]=\"tableColumns\"\n [data]=\"iterations\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [isEmptyState]=\"isEmptyState\"\n [emptyStateConfig]=\"emptyStateConfig\"\n [isTableDataLoading]=\"isTableDataLoading\"\n [showSearchBar]=\"false\"\n [showFilterButton]=\"false\"\n [showSettingsButton]=\"false\"\n [showAutoRefreshButton]=\"false\"\n [showOtherButton]=\"false\"\n [showFilterPanel]=\"false\"\n [serverSidePagination]=\"false\"\n (pageChange)=\"onPageChange($event)\">\n </cqa-table-template>\n </div>\n\n <div *ngIf=\"!isEmptyState\" class=\"cqa-p-[17px] cqa-mt-6 cqa-bg-[#FBFCFF] cqa-rounded-[5px]\" style=\"border: 1px solid #E5E5E5;\">\n <h4 class=\"cqa-text-[16px] cqa-text-[#111827] cqa-mb-3\">Summary</h4>\n <div class=\"cqa-grid cqa-grid-cols-3 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mb-1\">Total Iterations</span>\n <span class=\"cqa-text-[22px] cqa-leading-[28px] cqa-font-semibold cqa-text-[#0B0B0B]\">{{ computedSummary.totalIterations }}</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mb-1\">Passed</span>\n <span class=\"cqa-text-[22px] cqa-leading-[28px] cqa-font-semibold cqa-text-[#00C950]\">{{ computedSummary.passed }}</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mb-1\">Failed</span>\n <span class=\"cqa-text-[22px] cqa-leading-[28px] cqa-font-semibold cqa-text-[#FB2C36]\">{{ computedSummary.failed }}</span>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n", components: [{ type: i1.TableTemplateComponent, selector: "cqa-table-template", inputs: ["searchPlaceholder", "searchValue", "showClear", "showSearchBar", "filterConfig", "showFilterPanel", "showFilterButton", "otherButtons", "otherDropDownButtons", "otherSelectDropDownButtons", "otherButtonLabel", "otherButtonVariant", "showOtherButton", "showActionButton", "showSettingsButton", "showAutoRefreshButton", "data", "isEmptyState", "emptyStateConfig", "actions", "chips", "filterApplied", "columns", "selectedAutoRefreshInterval", "pageIndex", "pageSize", "pageSizeOptions", "serverSidePagination", "totalElements", "isTableLoading", "isTableDataLoading", "cellJsonPathGetter", "onJsonPathCopiedHandler"], outputs: ["onSearchChange", "onApplyFilterClick", "onResetFilterClick", "onClearAll", "removeChip", "pageChange", "onReload", "onAutoRefreshClick"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
175
175
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: IterationsLoopComponent, decorators: [{
176
176
  type: Component,
177
177
  args: [{ selector: 'cqa-iterations-loop', template: "<div class=\"cqa-ui-root\" style=\"display: block; width: 100%;\">\n <div class=\"cqa-flex cqa-flex-col\">\n <div class=\"cqa-bg-white\">\n <cqa-table-template\n [columns]=\"tableColumns\"\n [data]=\"iterations\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [isEmptyState]=\"isEmptyState\"\n [emptyStateConfig]=\"emptyStateConfig\"\n [isTableDataLoading]=\"isTableDataLoading\"\n [showSearchBar]=\"false\"\n [showFilterButton]=\"false\"\n [showSettingsButton]=\"false\"\n [showAutoRefreshButton]=\"false\"\n [showOtherButton]=\"false\"\n [showFilterPanel]=\"false\"\n [serverSidePagination]=\"false\"\n (pageChange)=\"onPageChange($event)\">\n </cqa-table-template>\n </div>\n\n <div *ngIf=\"!isEmptyState\" class=\"cqa-p-[17px] cqa-mt-6 cqa-bg-[#FBFCFF] cqa-rounded-[5px]\" style=\"border: 1px solid #E5E5E5;\">\n <h4 class=\"cqa-text-[16px] cqa-text-[#111827] cqa-mb-3\">Summary</h4>\n <div class=\"cqa-grid cqa-grid-cols-3 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mb-1\">Total Iterations</span>\n <span class=\"cqa-text-[22px] cqa-leading-[28px] cqa-font-semibold cqa-text-[#0B0B0B]\">{{ computedSummary.totalIterations }}</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mb-1\">Passed</span>\n <span class=\"cqa-text-[22px] cqa-leading-[28px] cqa-font-semibold cqa-text-[#00C950]\">{{ computedSummary.passed }}</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mb-1\">Failed</span>\n <span class=\"cqa-text-[22px] cqa-leading-[28px] cqa-font-semibold cqa-text-[#FB2C36]\">{{ computedSummary.failed }}</span>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n", styles: [] }]
@@ -238,6 +238,34 @@ export class DynamicTableComponent {
238
238
  trackByIndex(index) {
239
239
  return index;
240
240
  }
241
+ copyCellJsonPath(path, event, source = 'dbQueryResponse') {
242
+ if (!path)
243
+ return;
244
+ event.preventDefault();
245
+ event.stopPropagation();
246
+ navigator.clipboard.writeText(path).then(() => {
247
+ // Call the handler if provided
248
+ if (this.onJsonPathCopiedHandler) {
249
+ try {
250
+ this.onJsonPathCopiedHandler({ path, source });
251
+ }
252
+ catch (handlerError) {
253
+ console.error('Error in onJsonPathCopiedHandler:', handlerError);
254
+ }
255
+ }
256
+ }).catch(err => {
257
+ console.error('Failed to copy jsonPath:', err);
258
+ // Still call the handler even on failure (similar to api-step pattern)
259
+ if (this.onJsonPathCopiedHandler) {
260
+ try {
261
+ this.onJsonPathCopiedHandler({ path, source });
262
+ }
263
+ catch (handlerError) {
264
+ console.error('Error in onJsonPathCopiedHandler:', handlerError);
265
+ }
266
+ }
267
+ });
268
+ }
241
269
  // Compute grid-template-columns string from column config
242
270
  updateGridTemplate() {
243
271
  const cols = this.visibleColumns;
@@ -387,10 +415,10 @@ export class DynamicTableComponent {
387
415
  }
388
416
  }
389
417
  DynamicTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicTableComponent, deps: [{ token: i1.DomSanitizer }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
390
- DynamicTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DynamicTableComponent, selector: "app-dynamic-table", inputs: { data: "data", columns: "columns", emptyState: "emptyState", gridTemplateColumns: "gridTemplateColumns", screenWidth: "screenWidth", enableSelectAll: "enableSelectAll", enableLocalSort: "enableLocalSort", isTableLoading: "isTableLoading", isTableDataLoading: "isTableDataLoading" }, outputs: { sortChange: "sortChange" }, host: { classAttribute: "cqa-ui-root" }, queries: [{ propertyName: "emptyTableTpl", first: true, predicate: ["emptyTableTpl"], descendants: true, read: TemplateRef }, { propertyName: "cellTemplates", predicate: DynamicCellTemplateDirective }, { propertyName: "headerTemplates", predicate: DynamicHeaderTemplateDirective }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\">\n <div class=\"cqa-relative\" [class.cqa-max-h-[100px]]=\"showTableLoading\">\n <cqa-full-table-loader *ngIf=\"showTableLoading\"></cqa-full-table-loader>\n <cqa-table-data-loader *ngIf=\"showTableDataLoading\"></cqa-table-data-loader>\n <table class=\"table-inner cqa-w-full cqa-border cqa-border-solid cqa-border-gray-200\" [class.is-loading]=\"true\" *ngIf=\"!showTableLoading\">\n <colgroup>\n <ng-container *ngFor=\"let width of computedColumnWidths; trackBy: trackByIndex\">\n <col [style.width]=\"width\" />\n </ng-container>\n </colgroup>\n\n <thead *ngIf=\"data?.length\">\n <tr class=\"table-header cqa-items-center\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <th\n class=\"header-cell cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-bg-[#eff0f7]\"\n [ngClass]=\"[\n col.fieldId + '-cell',\n col.align === 'center' ? 'cqa-text-center' : col.align === 'right' ? 'cqa-text-right' : 'cqa-text-left'\n ]\">\n <!-- Built-in select-all for checkbox column when enabled and no custom header template -->\n <ng-container\n *ngIf=\"col.fieldId === 'checkbox' && enableSelectAll && !getHeaderTemplate(col.fieldId); else headerTplOrDefault\">\n <div class=\"custom-checkbox\">\n <input type=\"checkbox\" id=\"checkbox\" aria-label=\"Select all rows\" [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\" (change)=\"onSelectAllChange($event)\" class=\"hidden-checkbox\" />\n <label for=\"checkbox\" class=\"custom-checkbox-label\"></label>\n </div>\n </ng-container>\n <ng-template #headerTplOrDefault>\n <ng-container *ngIf=\"getHeaderTemplate(col.fieldId) as headerTpl; else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\n </ng-container>\n <ng-template #defaultHeader>\n <ng-container *ngIf=\"col.sortable; else plainHeader\">\n <button type=\"button\" class=\"header-text cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-0\"\n (click)=\"toggleSort(col)\" [attr.aria-label]=\"'Sort by ' + (col.fieldName || col.fieldId)\">\n <span class=\"cqa-text-[12.3px] cqa-leading-[17.5px] cqa-text-[#0A0A0A] cqa-font-medium\">{{\n col.fieldName }}</span>\n <span *ngIf=\"isSortedAsc(col.fieldId)\">\u25B2</span>\n <span *ngIf=\"isSortedDesc(col.fieldId)\">\u25BC</span>\n </button>\n </ng-container>\n <ng-template #plainHeader>\n <span class=\"header-text\">{{ col.fieldName }}</span>\n </ng-template>\n </ng-template>\n </ng-template>\n </th>\n </ng-container>\n </tr>\n </thead>\n\n <tbody class=\"table-body cqa-w-full\">\n <tr class=\"table-row cqa-bg-surface-default hover:cqa-bg-surface-hover\" *ngFor=\"let row of computedData; let rowIndex = index; trackBy: trackByIndex\"\n [class.selected]=\"row?.isSelected\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <td class=\"cell cqa-px-[10.5px] cqa-py-[11px]\" \n [ngClass]=\"[\n col.fieldId + '-cell',\n col.align === 'center' ? 'cqa-text-center' : col.align === 'right' ? 'cqa-text-right' : 'cqa-text-left'\n ]\">\n <!-- Built-in checkbox cell when no custom template is provided -->\n <ng-container *ngIf=\"col.fieldId === 'checkbox' && !getCellTemplate(col.fieldId); else regularCell\">\n <div class=\"custom-checkbox\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\">\n <input\n type=\"checkbox\"\n class=\"hidden-checkbox\"\n [attr.id]=\"'row-checkbox-' + rowIndex\"\n aria-label=\"Select row\"\n [checked]=\"row?.isSelected\"\n (change)=\"onRowSelectChange($event, row)\" />\n <label\n class=\"custom-checkbox-label\"\n [attr.for]=\"'row-checkbox-' + rowIndex\">\n </label>\n </div>\n </ng-container>\n <ng-template #regularCell>\n <ng-container *ngIf=\"getCellTemplate(col.fieldId) as cellTpl; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"cellTpl; context: {$implicit: row, row: row, value: getCellValue(row, col.fieldValue)}\"></ng-container>\n </ng-container>\n <ng-template #defaultCell>\n <ng-container *ngIf=\"getRenderedValue(row, col) as renderedValue\">\n <ng-container *ngIf=\"isComponent(renderedValue); else nonComponentCell\">\n <ng-container \n cqaCellContainer \n #cellContainer=\"cqaCellContainer\"\n [componentConfig]=\"renderedValue\"\n [row]=\"row\"\n [column]=\"col\"\n [rowIndex]=\"rowIndex\"\n [colId]=\"col.fieldId\">\n </ng-container>\n </ng-container>\n <ng-template #nonComponentCell>\n <ng-container *ngIf=\"isHtmlString(renderedValue); else textCell\">\n <div class=\"cqa-text-xs cqa-leading-[17px]\" [innerHTML]=\"getSanitizedHtml(renderedValue)\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\"></div>\n </ng-container>\n <ng-template #textCell>\n <span class=\"cqa-text-xs cqa-text-[#374151]\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\">{{ renderedValue }}</span>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n</div>", components: [{ type: i2.FullTableLoaderComponent, selector: "cqa-full-table-loader", inputs: ["label"] }, { type: i3.TableDataLoaderComponent, selector: "cqa-table-data-loader", inputs: ["label", "size"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i5.DynamicCellContainerDirective, selector: "[cqaCellContainer]", inputs: ["componentConfig", "row", "column", "rowIndex", "colId"], exportAs: ["cqaCellContainer"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
418
+ DynamicTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DynamicTableComponent, selector: "app-dynamic-table", inputs: { data: "data", columns: "columns", emptyState: "emptyState", gridTemplateColumns: "gridTemplateColumns", screenWidth: "screenWidth", enableSelectAll: "enableSelectAll", enableLocalSort: "enableLocalSort", isTableLoading: "isTableLoading", isTableDataLoading: "isTableDataLoading", cellJsonPathGetter: "cellJsonPathGetter", onJsonPathCopiedHandler: "onJsonPathCopiedHandler" }, outputs: { sortChange: "sortChange" }, host: { classAttribute: "cqa-ui-root" }, queries: [{ propertyName: "emptyTableTpl", first: true, predicate: ["emptyTableTpl"], descendants: true, read: TemplateRef }, { propertyName: "cellTemplates", predicate: DynamicCellTemplateDirective }, { propertyName: "headerTemplates", predicate: DynamicHeaderTemplateDirective }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\">\n <div class=\"cqa-relative\" [class.cqa-max-h-[100px]]=\"showTableLoading\">\n <cqa-full-table-loader *ngIf=\"showTableLoading\"></cqa-full-table-loader>\n <cqa-table-data-loader *ngIf=\"showTableDataLoading\"></cqa-table-data-loader>\n <table class=\"table-inner cqa-w-full cqa-border cqa-border-solid cqa-border-gray-200\" [class.is-loading]=\"true\" *ngIf=\"!showTableLoading\">\n <colgroup>\n <ng-container *ngFor=\"let width of computedColumnWidths; trackBy: trackByIndex\">\n <col [style.width]=\"width\" />\n </ng-container>\n </colgroup>\n\n <thead *ngIf=\"data?.length\">\n <tr class=\"table-header cqa-items-center\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <th\n class=\"header-cell cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-bg-[#eff0f7]\"\n [ngClass]=\"[\n col.fieldId + '-cell',\n col.align === 'center' ? 'cqa-text-center' : col.align === 'right' ? 'cqa-text-right' : 'cqa-text-left'\n ]\">\n <!-- Built-in select-all for checkbox column when enabled and no custom header template -->\n <ng-container\n *ngIf=\"col.fieldId === 'checkbox' && enableSelectAll && !getHeaderTemplate(col.fieldId); else headerTplOrDefault\">\n <div class=\"custom-checkbox\">\n <input type=\"checkbox\" id=\"checkbox\" aria-label=\"Select all rows\" [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\" (change)=\"onSelectAllChange($event)\" class=\"hidden-checkbox\" />\n <label for=\"checkbox\" class=\"custom-checkbox-label\"></label>\n </div>\n </ng-container>\n <ng-template #headerTplOrDefault>\n <ng-container *ngIf=\"getHeaderTemplate(col.fieldId) as headerTpl; else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\n </ng-container>\n <ng-template #defaultHeader>\n <ng-container *ngIf=\"col.sortable; else plainHeader\">\n <button type=\"button\" class=\"header-text cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-0\"\n (click)=\"toggleSort(col)\" [attr.aria-label]=\"'Sort by ' + (col.fieldName || col.fieldId)\">\n <span class=\"cqa-text-[12.3px] cqa-leading-[17.5px] cqa-text-[#0A0A0A] cqa-font-medium\">{{\n col.fieldName }}</span>\n <span *ngIf=\"isSortedAsc(col.fieldId)\">\u25B2</span>\n <span *ngIf=\"isSortedDesc(col.fieldId)\">\u25BC</span>\n </button>\n </ng-container>\n <ng-template #plainHeader>\n <span class=\"header-text\">{{ col.fieldName }}</span>\n </ng-template>\n </ng-template>\n </ng-template>\n </th>\n </ng-container>\n </tr>\n </thead>\n\n <tbody class=\"table-body cqa-w-full\">\n <tr class=\"table-row cqa-bg-surface-default hover:cqa-bg-surface-hover\" *ngFor=\"let row of computedData; let rowIndex = index; trackBy: trackByIndex\"\n [class.selected]=\"row?.isSelected\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <td class=\"cell cqa-px-[10.5px] cqa-py-[11px]\" \n [ngClass]=\"[\n col.fieldId + '-cell',\n col.align === 'center' ? 'cqa-text-center' : col.align === 'right' ? 'cqa-text-right' : 'cqa-text-left',\n cellJsonPathGetter && col.fieldId !== 'checkbox' && col.fieldId !== 'actions' ? 'cqa-cursor-pointer' : ''\n ]\"\n (dblclick)=\"cellJsonPathGetter && col?.fieldId !== 'checkbox' && col?.fieldId !== 'actions' && copyCellJsonPath(cellJsonPathGetter(rowIndex, col?.fieldId, row), $event, 'dbQueryResponse')\">\n <!-- Built-in checkbox cell when no custom template is provided -->\n <ng-container *ngIf=\"col.fieldId === 'checkbox' && !getCellTemplate(col.fieldId); else regularCell\">\n <div class=\"custom-checkbox\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\">\n <input\n type=\"checkbox\"\n class=\"hidden-checkbox\"\n [attr.id]=\"'row-checkbox-' + rowIndex\"\n aria-label=\"Select row\"\n [checked]=\"row?.isSelected\"\n (change)=\"onRowSelectChange($event, row)\" />\n <label\n class=\"custom-checkbox-label\"\n [attr.for]=\"'row-checkbox-' + rowIndex\">\n </label>\n </div>\n </ng-container>\n <ng-template #regularCell>\n <ng-container *ngIf=\"getCellTemplate(col.fieldId) as cellTpl; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"cellTpl; context: {$implicit: row, row: row, value: getCellValue(row, col.fieldValue)}\"></ng-container>\n </ng-container>\n <ng-template #defaultCell>\n <ng-container *ngIf=\"getRenderedValue(row, col) as renderedValue\">\n <ng-container *ngIf=\"isComponent(renderedValue); else nonComponentCell\">\n <ng-container \n cqaCellContainer \n #cellContainer=\"cqaCellContainer\"\n [componentConfig]=\"renderedValue\"\n [row]=\"row\"\n [column]=\"col\"\n [rowIndex]=\"rowIndex\"\n [colId]=\"col.fieldId\">\n </ng-container>\n </ng-container>\n <ng-template #nonComponentCell>\n <ng-container *ngIf=\"isHtmlString(renderedValue); else textCell\">\n <div class=\"cqa-text-xs cqa-leading-[17px]\" [innerHTML]=\"getSanitizedHtml(renderedValue)\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\"></div>\n </ng-container>\n <ng-template #textCell>\n <span class=\"cqa-text-xs cqa-text-[#374151]\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\">{{ renderedValue }}</span>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n</div>", components: [{ type: i2.FullTableLoaderComponent, selector: "cqa-full-table-loader", inputs: ["label"] }, { type: i3.TableDataLoaderComponent, selector: "cqa-table-data-loader", inputs: ["label", "size"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i5.DynamicCellContainerDirective, selector: "[cqaCellContainer]", inputs: ["componentConfig", "row", "column", "rowIndex", "colId"], exportAs: ["cqaCellContainer"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
391
419
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicTableComponent, decorators: [{
392
420
  type: Component,
393
- args: [{ selector: "app-dynamic-table", host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-ui-root\">\n <div class=\"cqa-relative\" [class.cqa-max-h-[100px]]=\"showTableLoading\">\n <cqa-full-table-loader *ngIf=\"showTableLoading\"></cqa-full-table-loader>\n <cqa-table-data-loader *ngIf=\"showTableDataLoading\"></cqa-table-data-loader>\n <table class=\"table-inner cqa-w-full cqa-border cqa-border-solid cqa-border-gray-200\" [class.is-loading]=\"true\" *ngIf=\"!showTableLoading\">\n <colgroup>\n <ng-container *ngFor=\"let width of computedColumnWidths; trackBy: trackByIndex\">\n <col [style.width]=\"width\" />\n </ng-container>\n </colgroup>\n\n <thead *ngIf=\"data?.length\">\n <tr class=\"table-header cqa-items-center\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <th\n class=\"header-cell cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-bg-[#eff0f7]\"\n [ngClass]=\"[\n col.fieldId + '-cell',\n col.align === 'center' ? 'cqa-text-center' : col.align === 'right' ? 'cqa-text-right' : 'cqa-text-left'\n ]\">\n <!-- Built-in select-all for checkbox column when enabled and no custom header template -->\n <ng-container\n *ngIf=\"col.fieldId === 'checkbox' && enableSelectAll && !getHeaderTemplate(col.fieldId); else headerTplOrDefault\">\n <div class=\"custom-checkbox\">\n <input type=\"checkbox\" id=\"checkbox\" aria-label=\"Select all rows\" [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\" (change)=\"onSelectAllChange($event)\" class=\"hidden-checkbox\" />\n <label for=\"checkbox\" class=\"custom-checkbox-label\"></label>\n </div>\n </ng-container>\n <ng-template #headerTplOrDefault>\n <ng-container *ngIf=\"getHeaderTemplate(col.fieldId) as headerTpl; else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\n </ng-container>\n <ng-template #defaultHeader>\n <ng-container *ngIf=\"col.sortable; else plainHeader\">\n <button type=\"button\" class=\"header-text cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-0\"\n (click)=\"toggleSort(col)\" [attr.aria-label]=\"'Sort by ' + (col.fieldName || col.fieldId)\">\n <span class=\"cqa-text-[12.3px] cqa-leading-[17.5px] cqa-text-[#0A0A0A] cqa-font-medium\">{{\n col.fieldName }}</span>\n <span *ngIf=\"isSortedAsc(col.fieldId)\">\u25B2</span>\n <span *ngIf=\"isSortedDesc(col.fieldId)\">\u25BC</span>\n </button>\n </ng-container>\n <ng-template #plainHeader>\n <span class=\"header-text\">{{ col.fieldName }}</span>\n </ng-template>\n </ng-template>\n </ng-template>\n </th>\n </ng-container>\n </tr>\n </thead>\n\n <tbody class=\"table-body cqa-w-full\">\n <tr class=\"table-row cqa-bg-surface-default hover:cqa-bg-surface-hover\" *ngFor=\"let row of computedData; let rowIndex = index; trackBy: trackByIndex\"\n [class.selected]=\"row?.isSelected\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <td class=\"cell cqa-px-[10.5px] cqa-py-[11px]\" \n [ngClass]=\"[\n col.fieldId + '-cell',\n col.align === 'center' ? 'cqa-text-center' : col.align === 'right' ? 'cqa-text-right' : 'cqa-text-left'\n ]\">\n <!-- Built-in checkbox cell when no custom template is provided -->\n <ng-container *ngIf=\"col.fieldId === 'checkbox' && !getCellTemplate(col.fieldId); else regularCell\">\n <div class=\"custom-checkbox\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\">\n <input\n type=\"checkbox\"\n class=\"hidden-checkbox\"\n [attr.id]=\"'row-checkbox-' + rowIndex\"\n aria-label=\"Select row\"\n [checked]=\"row?.isSelected\"\n (change)=\"onRowSelectChange($event, row)\" />\n <label\n class=\"custom-checkbox-label\"\n [attr.for]=\"'row-checkbox-' + rowIndex\">\n </label>\n </div>\n </ng-container>\n <ng-template #regularCell>\n <ng-container *ngIf=\"getCellTemplate(col.fieldId) as cellTpl; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"cellTpl; context: {$implicit: row, row: row, value: getCellValue(row, col.fieldValue)}\"></ng-container>\n </ng-container>\n <ng-template #defaultCell>\n <ng-container *ngIf=\"getRenderedValue(row, col) as renderedValue\">\n <ng-container *ngIf=\"isComponent(renderedValue); else nonComponentCell\">\n <ng-container \n cqaCellContainer \n #cellContainer=\"cqaCellContainer\"\n [componentConfig]=\"renderedValue\"\n [row]=\"row\"\n [column]=\"col\"\n [rowIndex]=\"rowIndex\"\n [colId]=\"col.fieldId\">\n </ng-container>\n </ng-container>\n <ng-template #nonComponentCell>\n <ng-container *ngIf=\"isHtmlString(renderedValue); else textCell\">\n <div class=\"cqa-text-xs cqa-leading-[17px]\" [innerHTML]=\"getSanitizedHtml(renderedValue)\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\"></div>\n </ng-container>\n <ng-template #textCell>\n <span class=\"cqa-text-xs cqa-text-[#374151]\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\">{{ renderedValue }}</span>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n</div>", styles: [] }]
421
+ args: [{ selector: "app-dynamic-table", host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-ui-root\">\n <div class=\"cqa-relative\" [class.cqa-max-h-[100px]]=\"showTableLoading\">\n <cqa-full-table-loader *ngIf=\"showTableLoading\"></cqa-full-table-loader>\n <cqa-table-data-loader *ngIf=\"showTableDataLoading\"></cqa-table-data-loader>\n <table class=\"table-inner cqa-w-full cqa-border cqa-border-solid cqa-border-gray-200\" [class.is-loading]=\"true\" *ngIf=\"!showTableLoading\">\n <colgroup>\n <ng-container *ngFor=\"let width of computedColumnWidths; trackBy: trackByIndex\">\n <col [style.width]=\"width\" />\n </ng-container>\n </colgroup>\n\n <thead *ngIf=\"data?.length\">\n <tr class=\"table-header cqa-items-center\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <th\n class=\"header-cell cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-bg-[#eff0f7]\"\n [ngClass]=\"[\n col.fieldId + '-cell',\n col.align === 'center' ? 'cqa-text-center' : col.align === 'right' ? 'cqa-text-right' : 'cqa-text-left'\n ]\">\n <!-- Built-in select-all for checkbox column when enabled and no custom header template -->\n <ng-container\n *ngIf=\"col.fieldId === 'checkbox' && enableSelectAll && !getHeaderTemplate(col.fieldId); else headerTplOrDefault\">\n <div class=\"custom-checkbox\">\n <input type=\"checkbox\" id=\"checkbox\" aria-label=\"Select all rows\" [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\" (change)=\"onSelectAllChange($event)\" class=\"hidden-checkbox\" />\n <label for=\"checkbox\" class=\"custom-checkbox-label\"></label>\n </div>\n </ng-container>\n <ng-template #headerTplOrDefault>\n <ng-container *ngIf=\"getHeaderTemplate(col.fieldId) as headerTpl; else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\n </ng-container>\n <ng-template #defaultHeader>\n <ng-container *ngIf=\"col.sortable; else plainHeader\">\n <button type=\"button\" class=\"header-text cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-0\"\n (click)=\"toggleSort(col)\" [attr.aria-label]=\"'Sort by ' + (col.fieldName || col.fieldId)\">\n <span class=\"cqa-text-[12.3px] cqa-leading-[17.5px] cqa-text-[#0A0A0A] cqa-font-medium\">{{\n col.fieldName }}</span>\n <span *ngIf=\"isSortedAsc(col.fieldId)\">\u25B2</span>\n <span *ngIf=\"isSortedDesc(col.fieldId)\">\u25BC</span>\n </button>\n </ng-container>\n <ng-template #plainHeader>\n <span class=\"header-text\">{{ col.fieldName }}</span>\n </ng-template>\n </ng-template>\n </ng-template>\n </th>\n </ng-container>\n </tr>\n </thead>\n\n <tbody class=\"table-body cqa-w-full\">\n <tr class=\"table-row cqa-bg-surface-default hover:cqa-bg-surface-hover\" *ngFor=\"let row of computedData; let rowIndex = index; trackBy: trackByIndex\"\n [class.selected]=\"row?.isSelected\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <td class=\"cell cqa-px-[10.5px] cqa-py-[11px]\" \n [ngClass]=\"[\n col.fieldId + '-cell',\n col.align === 'center' ? 'cqa-text-center' : col.align === 'right' ? 'cqa-text-right' : 'cqa-text-left',\n cellJsonPathGetter && col.fieldId !== 'checkbox' && col.fieldId !== 'actions' ? 'cqa-cursor-pointer' : ''\n ]\"\n (dblclick)=\"cellJsonPathGetter && col?.fieldId !== 'checkbox' && col?.fieldId !== 'actions' && copyCellJsonPath(cellJsonPathGetter(rowIndex, col?.fieldId, row), $event, 'dbQueryResponse')\">\n <!-- Built-in checkbox cell when no custom template is provided -->\n <ng-container *ngIf=\"col.fieldId === 'checkbox' && !getCellTemplate(col.fieldId); else regularCell\">\n <div class=\"custom-checkbox\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\">\n <input\n type=\"checkbox\"\n class=\"hidden-checkbox\"\n [attr.id]=\"'row-checkbox-' + rowIndex\"\n aria-label=\"Select row\"\n [checked]=\"row?.isSelected\"\n (change)=\"onRowSelectChange($event, row)\" />\n <label\n class=\"custom-checkbox-label\"\n [attr.for]=\"'row-checkbox-' + rowIndex\">\n </label>\n </div>\n </ng-container>\n <ng-template #regularCell>\n <ng-container *ngIf=\"getCellTemplate(col.fieldId) as cellTpl; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"cellTpl; context: {$implicit: row, row: row, value: getCellValue(row, col.fieldValue)}\"></ng-container>\n </ng-container>\n <ng-template #defaultCell>\n <ng-container *ngIf=\"getRenderedValue(row, col) as renderedValue\">\n <ng-container *ngIf=\"isComponent(renderedValue); else nonComponentCell\">\n <ng-container \n cqaCellContainer \n #cellContainer=\"cqaCellContainer\"\n [componentConfig]=\"renderedValue\"\n [row]=\"row\"\n [column]=\"col\"\n [rowIndex]=\"rowIndex\"\n [colId]=\"col.fieldId\">\n </ng-container>\n </ng-container>\n <ng-template #nonComponentCell>\n <ng-container *ngIf=\"isHtmlString(renderedValue); else textCell\">\n <div class=\"cqa-text-xs cqa-leading-[17px]\" [innerHTML]=\"getSanitizedHtml(renderedValue)\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\"></div>\n </ng-container>\n <ng-template #textCell>\n <span class=\"cqa-text-xs cqa-text-[#374151]\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\">{{ renderedValue }}</span>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n</div>", styles: [] }]
394
422
  }], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { data: [{
395
423
  type: Input
396
424
  }], columns: [{
@@ -411,6 +439,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
411
439
  type: Input
412
440
  }], sortChange: [{
413
441
  type: Output
442
+ }], cellJsonPathGetter: [{
443
+ type: Input
444
+ }], onJsonPathCopiedHandler: [{
445
+ type: Input
414
446
  }], cellTemplates: [{
415
447
  type: ContentChildren,
416
448
  args: [DynamicCellTemplateDirective]
@@ -421,4 +453,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
421
453
  type: ContentChild,
422
454
  args: ['emptyTableTpl', { read: TemplateRef }]
423
455
  }] } });
424
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RhYmxlL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RhYmxlL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFhLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUEyRyx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoUSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7OztBQWlDeEcsTUFBTSxPQUFPLHFCQUFxQjtJQTBDaEMsWUFDVSxTQUF1QixFQUN2QixHQUFzQjtRQUR0QixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBM0N2QixTQUFJLEdBQVUsRUFBRSxDQUFDO1FBQ2pCLFlBQU8sR0FBeUIsRUFBRSxDQUFDO1FBUzVDLDhEQUE4RDtRQUNyRCxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUN6QyxzRkFBc0Y7UUFDN0Usb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFPekMsc0VBQXNFO1FBQzVELGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBOEUsQ0FBQztRQVF0SCxnRkFBZ0Y7UUFDeEUsa0JBQWEsR0FBRyxJQUFJLEdBQUcsRUFBNkIsQ0FBQztRQUU3RCwrQkFBK0I7UUFDL0IsbUJBQWMsR0FBeUIsRUFBRSxDQUFDO1FBQzFDLGlCQUFZLEdBQVUsRUFBRSxDQUFDO1FBQ3pCLHlCQUFvQixHQUFXLEVBQUUsQ0FBQztRQUNsQyx5QkFBb0IsR0FBYSxFQUFFLENBQUM7UUFFcEMs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LElBQUksRUFBRSxDQUFDLENBQUM7SUFDakYsQ0FBQzs7a0hBN2FVLHFCQUFxQjtzR0FBckIscUJBQXFCLG9nQkE0Qk8sV0FBVyxnREFKakMsNEJBQTRCLGtEQUM1Qiw4QkFBOEIsa0RDNURqRCx3dk5BdUhNOzJGRHBGTyxxQkFBcUI7a0JBUGpDLFNBQVM7K0JBQ0UsbUJBQW1CLFFBR3ZCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxtQkFDYix1QkFBdUIsQ0FBQyxNQUFNO21JQUd0QyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUlHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUlHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU07Z0JBRXdDLGFBQWE7c0JBQTNELGVBQWU7dUJBQUMsNEJBQTRCO2dCQUNJLGVBQWU7c0JBQS9ELGVBQWU7dUJBQUMsOEJBQThCO2dCQUdPLGFBQWE7c0JBQWxFLFlBQVk7dUJBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkLCBDb250ZW50Q2hpbGRyZW4sIElucHV0LCBRdWVyeUxpc3QsIFRlbXBsYXRlUmVmLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBDb21wb25lbnRSZWYsIFR5cGUsIE9uRGVzdHJveSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XG5pbXBvcnQgeyBEeW5hbWljQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLCBEeW5hbWljSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tIFwiLi9keW5hbWljLWNlbGwuZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBDb21wb25lbnRSZW5kZXJDb25maWcgfSBmcm9tIFwiLi9jb21wb25lbnQtcmVuZGVyLWNvbmZpZy5pbnRlcmZhY2VcIjtcblxuZXhwb3J0IHsgQ29tcG9uZW50UmVuZGVyQ29uZmlnIH0gZnJvbSBcIi4vY29tcG9uZW50LXJlbmRlci1jb25maWcuaW50ZXJmYWNlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1pY1RhYmxlQ29sdW1uIHtcbiAgZmllbGRJZDogc3RyaW5nO1xuICBmaWVsZE5hbWU/OiBzdHJpbmc7XG4gIGZpZWxkVmFsdWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBjdXN0b20gcmVuZGVyZXIgaW52b2tlZCB3aGVuIG5vIHByb2plY3RlZCBjZWxsIHRlbXBsYXRlIGlzIHByb3ZpZGVkLlxuICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcvbnVtYmVyL0hUTUwgc3RyaW5nL0NvbXBvbmVudCBjbGFzcy9Db21wb25lbnRSZW5kZXJDb25maWcgdG8gZGlzcGxheSBmb3IgdGhlIGdpdmVuIHJvdy5cbiAgICogSFRNTCBzdHJpbmdzIHdpbGwgYmUgc2FuaXRpemVkIGFuZCByZW5kZXJlZCBzYWZlbHkuXG4gICAqIENvbXBvbmVudCBjbGFzc2VzIHdpbGwgYmUgZHluYW1pY2FsbHkgaW5zdGFudGlhdGVkLlxuICAgKi9cbiAgcmVuZGVyPzogKHJvdzogYW55LCBjb2x1bW46IER5bmFtaWNUYWJsZUNvbHVtbikgPT4gc3RyaW5nIHwgbnVtYmVyIHwgU2FmZUh0bWwgfCBUeXBlPGFueT4gfCBDb21wb25lbnRSZW5kZXJDb25maWc7XG4gIGlzRGVmYXVsdD86IGJvb2xlYW47XG4gIHNvcnRhYmxlPzogYm9vbGVhbjtcbiAgaXNTaG93PzogYm9vbGVhbjtcbiAgLy8gTmV3IGNvbmZpZ3VyYXRpb24gZmllbGRzIHRvIHVuaWZ5IGxheW91dCBsb2dpY1xuICB3ZWlnaHQ/OiBudW1iZXI7IC8vIHJlbGF0aXZlIHdlaWdodCBmb3IgZHluYW1pYyBzaGFyZVxuICBmaXhlZFB4PzogbnVtYmVyOyAvLyBmaXhlZCB3aWR0aCBpbiBweCAoZS5nLiBjaGVja2JveC9hY3Rpb25zKVxuICByZXNwb25zaXZlPzogeyB4cz86IGJvb2xlYW47IHNtPzogYm9vbGVhbjsgbWQ/OiBib29sZWFuIH07IC8vIGhpZGUgYXQgc3BlY2lmaWMgYnJlYWtwb2ludHNcbiAgYWxpZ24/OiAnbGVmdCcgfCAnY2VudGVyJyB8ICdyaWdodCc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhcHAtZHluYW1pYy10YWJsZVwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2R5bmFtaWMtdGFibGUuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGRhdGE6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIGNvbHVtbnM6IER5bmFtaWNUYWJsZUNvbHVtbltdID0gW107XG4gIC8qKlxuICAgKiBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdCB1c2VkIHdoZW4gbm8gY3VzdG9tIGVtcHR5IHRlbXBsYXRlIGlzIHByb3ZpZGVkLlxuICAgKi9cbiAgQElucHV0KCkgZW1wdHlTdGF0ZT86IHsgdGl0bGU/OiBzdHJpbmc7IGRlc2NyaXB0aW9uPzogc3RyaW5nOyBpbWFnZVVybD86IHN0cmluZzsgYWN0aW9ucz86IGFueVtdIH07XG4gIC8vIE9wdGlvbmFsIG92ZXJyaWRlOyBpZiBvbWl0dGVkIHdlIGNvbXB1dGUgZnJvbSBjb2x1bW5zXG4gIEBJbnB1dCgpIGdyaWRUZW1wbGF0ZUNvbHVtbnM/OiBzdHJpbmc7XG4gIC8vIEJyZWFrcG9pbnQtYXdhcmUgc2l6aW5nOyBwcm92aWRlIGZyb20gcGFyZW50IHRvIGF2b2lkIGV4dHJhIGxpc3RlbmVyc1xuICBASW5wdXQoKSBzY3JlZW5XaWR0aD86IG51bWJlcjtcbiAgLy8gRW5hYmxlIGJ1aWx0LWluIHNlbGVjdC1hbGwgYmVoYXZpb3IgZm9yIGEgJ2NoZWNrYm94JyBjb2x1bW5cbiAgQElucHV0KCkgZW5hYmxlU2VsZWN0QWxsOiBib29sZWFuID0gdHJ1ZTtcbiAgLy8gRW5hYmxlIHNpbXBsZSBjbGllbnQtc2lkZSBzb3J0aW5nIHdoZW4gY2xpY2tpbmcgc29ydGFibGUgaGVhZGVycyAobm8gY3VzdG9tIGhlYWRlcilcbiAgQElucHV0KCkgZW5hYmxlTG9jYWxTb3J0OiBib29sZWFuID0gdHJ1ZTtcbiAgLy8gQmFja3dhcmQtY29tcGF0IGxvYWRpbmcgZmxhZyAoYXBwbGllcyB0byBib3RoIGxvYWRlcnMgaWYgc3BlY2lmaWMgZmxhZ3Mgbm90IHByb3ZpZGVkKVxuICBcbiAgLy8gTmV3OiBjb250cm9scyB0aGUgZnVsbCB0YWJsZSBvdmVybGF5IGxvYWRlclxuICBASW5wdXQoKSBpc1RhYmxlTG9hZGluZz86IGJvb2xlYW47XG4gIC8vIE5ldzogY29udHJvbHMgdGhlIGlubGluZSBkYXRhIGxvYWRlciBhYm92ZSB0aGUgdGFibGVcbiAgQElucHV0KCkgaXNUYWJsZURhdGFMb2FkaW5nPzogYm9vbGVhbjtcbiAgLy8gRW1pdCBzb3J0IGNoYW5nZXMgc28gcGFyZW50IGNhbiBwZXJmb3JtIHNlcnZlci1zaWRlIHNvcnQgaWYgZGVzaXJlZFxuICBAT3V0cHV0KCkgc29ydENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBmaWVsZElkOiBzdHJpbmc7IGZpZWxkVmFsdWU/OiBzdHJpbmc7IGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgfCBudWxsIH0+KCk7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihEeW5hbWljQ2VsbFRlbXBsYXRlRGlyZWN0aXZlKSBjZWxsVGVtcGxhdGVzITogUXVlcnlMaXN0PER5bmFtaWNDZWxsVGVtcGxhdGVEaXJlY3RpdmU+O1xuICBAQ29udGVudENoaWxkcmVuKER5bmFtaWNIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSkgaGVhZGVyVGVtcGxhdGVzITogUXVlcnlMaXN0PER5bmFtaWNIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZT47XG4gIC8vIEFsbG93IGNvbnN1bWVycyB0byBwcm9qZWN0IGEgY3VzdG9tIGVtcHR5LXN0YXRlIHRlbXBsYXRlIHVzaW5nIGEgdGVtcGxhdGUgcmVmIG5hbWVcbiAgLy8gZS5nLiA8bmctdGVtcGxhdGUgI2VtcHR5VGFibGVUcGw+Q3VzdG9tIGVtcHR5IFVJPC9uZy10ZW1wbGF0ZT5cbiAgQENvbnRlbnRDaGlsZCgnZW1wdHlUYWJsZVRwbCcsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgZW1wdHlUYWJsZVRwbD86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLy8gTWFwIHRvIHN0b3JlIGNvbXBvbmVudCByZWZlcmVuY2VzIGZvciBjbGVhbnVwOiByb3dJbmRleF9jb2xJZCAtPiBDb21wb25lbnRSZWZcbiAgcHJpdmF0ZSBjb21wb25lbnRSZWZzID0gbmV3IE1hcDxzdHJpbmcsIENvbXBvbmVudFJlZjxhbnk+PigpO1xuXG4gIC8vIENhY2hlcyBmb3IgZXhwZW5zaXZlIGdldHRlcnNcbiAgdmlzaWJsZUNvbHVtbnM6IER5bmFtaWNUYWJsZUNvbHVtbltdID0gW107XG4gIGNvbXB1dGVkRGF0YTogYW55W10gPSBbXTtcbiAgY29tcHV0ZWRHcmlkVGVtcGxhdGU6IHN0cmluZyA9ICcnO1xuICBjb21wdXRlZENvbHVtbldpZHRoczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBDYWNoZSBmb3Igc2FuaXRpemVkIEhUTUwgdG8gYXZvaWQgcmVkdW5kYW50IGlubmVySFRNTCByZW5kZXJzXG4gIHByaXZhdGUgaHRtbENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFNhZmVIdG1sPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge31cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbHVtbnMnXSB8fCBjaGFuZ2VzWydzY3JlZW5XaWR0aCddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZpc2libGVDb2x1bW5zKCk7XG4gICAgICB0aGlzLnVwZGF0ZUdyaWRUZW1wbGF0ZSgpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZGF0YSddIHx8IGNoYW5nZXNbJ2NvbHVtbnMnXSB8fCBjaGFuZ2VzWydlbmFibGVMb2NhbFNvcnQnXSkge1xuICAgICAgdGhpcy51cGRhdGVDb21wdXRlZERhdGEoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhbiB1cCBhbGwgZHluYW1pY2FsbHkgY3JlYXRlZCBjb21wb25lbnRzXG4gICAgdGhpcy5jb21wb25lbnRSZWZzLmZvckVhY2gocmVmID0+IHJlZi5kZXN0cm95KCkpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmcy5jbGVhcigpO1xuICAgIHRoaXMuaHRtbENhY2hlLmNsZWFyKCk7XG4gIH1cblxuICBwcml2YXRlIGdldCBpc1hzKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHcgPSB0aGlzLnNjcmVlbldpZHRoIHx8IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIHJldHVybiB3IDw9IDQ4MDtcbiAgfVxuICBwcml2YXRlIGdldCBpc1NtKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHcgPSB0aGlzLnNjcmVlbldpZHRoIHx8IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIHJldHVybiB3IDw9IDc2ODtcbiAgfVxuICBwcml2YXRlIGdldCBpc01kKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHcgPSB0aGlzLnNjcmVlbldpZHRoIHx8IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIHJldHVybiB3IDw9IDk5MjtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJsZUNvbHVtbnMoKTogdm9pZCB7XG4gICAgY29uc3QgcmVzcG9uc2l2ZUZpbHRlciA9IChjOiBEeW5hbWljVGFibGVDb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IHIgPSBjPy5yZXNwb25zaXZlIHx8IHt9O1xuICAgICAgaWYgKHIueHMgJiYgdGhpcy5pc1hzKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoci5zbSAmJiB0aGlzLmlzU20pIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChyLm1kICYmIHRoaXMuaXNNZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gKHRoaXMuY29sdW1ucyB8fCBbXSkuZmlsdGVyKGMgPT4gYy5pc1Nob3cgIT09IGZhbHNlKS5maWx0ZXIocmVzcG9uc2l2ZUZpbHRlcik7XG4gIH1cblxuICBnZXRIZWFkZXJUZW1wbGF0ZShjb2xJZDogc3RyaW5nKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xuICAgIGNvbnN0IHRwbCA9IHRoaXMuaGVhZGVyVGVtcGxhdGVzPy5maW5kKHQgPT4gdC5uYW1lID09PSBjb2xJZCk7XG4gICAgcmV0dXJuIHRwbCA/IHRwbC50ZW1wbGF0ZSA6IG51bGw7XG4gIH1cblxuICBnZXRDZWxsVGVtcGxhdGUoY29sSWQ6IHN0cmluZyk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcbiAgICBjb25zdCB0cGwgPSB0aGlzLmNlbGxUZW1wbGF0ZXM/LmZpbmQodCA9PiB0Lm5hbWUgPT09IGNvbElkKTtcbiAgICByZXR1cm4gdHBsID8gdHBsLnRlbXBsYXRlIDogbnVsbDtcbiAgfVxuXG4gIGdldFJlbmRlcmVkVmFsdWUocm93OiBhbnksIGNvbHVtbjogRHluYW1pY1RhYmxlQ29sdW1uKTogYW55IHtcbiAgICBpZiAoY29sdW1uPy5yZW5kZXIgJiYgdHlwZW9mIGNvbHVtbi5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBjb2x1bW4ucmVuZGVyKHJvdywgY29sdW1uKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0R5bmFtaWNUYWJsZSByZW5kZXIgZnVuY3Rpb24gdGhyZXcgYW4gZXJyb3IgZm9yIGNvbHVtbicsIGNvbHVtbj8uZmllbGRJZCwgZXJyKTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRDZWxsVmFsdWUocm93LCBjb2x1bW4/LmZpZWxkVmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgcmVuZGVyZWQgdmFsdWUgaXMgYSBjb21wb25lbnQgY2xhc3Mgb3IgY29tcG9uZW50IGNvbmZpZ1xuICAgKi9cbiAgaXNDb21wb25lbnQodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsdWUpIHJldHVybiBmYWxzZTtcbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgY29tcG9uZW50IGNsYXNzIChoYXMgQENvbXBvbmVudCBkZWNvcmF0b3IgbWV0YWRhdGEpXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZS5wcm90b3R5cGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgQ29tcG9uZW50UmVuZGVyQ29uZmlnXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUuY29tcG9uZW50ICYmIHR5cGVvZiB2YWx1ZS5jb21wb25lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY29tcG9uZW50IGNsYXNzIGZyb20gYSByZW5kZXIgdmFsdWUgKGNvdWxkIGJlIGNsYXNzIG9yIGNvbmZpZylcbiAgICovXG4gIGdldENvbXBvbmVudENsYXNzKHZhbHVlOiBUeXBlPGFueT4gfCBDb21wb25lbnRSZW5kZXJDb25maWcpOiBUeXBlPGFueT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUuY29tcG9uZW50KSB7XG4gICAgICByZXR1cm4gdmFsdWUuY29tcG9uZW50O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29tcG9uZW50IHZhbHVlJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBjb21wb25lbnQgaW5wdXRzIGZyb20gYSByZW5kZXIgdmFsdWVcbiAgICovXG4gIGdldENvbXBvbmVudElucHV0cyh2YWx1ZTogVHlwZTxhbnk+IHwgQ29tcG9uZW50UmVuZGVyQ29uZmlnKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUuaW5wdXRzKSB7XG4gICAgICByZXR1cm4gdmFsdWUuaW5wdXRzO1xuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBjb21wb25lbnQgb3V0cHV0cyBmcm9tIGEgcmVuZGVyIHZhbHVlXG4gICAqL1xuICBnZXRDb21wb25lbnRPdXRwdXRzKHZhbHVlOiBUeXBlPGFueT4gfCBDb21wb25lbnRSZW5kZXJDb25maWcpOiB7IFtrZXk6IHN0cmluZ106IChldmVudDogYW55KSA9PiB2b2lkIH0ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLm91dHB1dHMpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5vdXRwdXRzO1xuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgYSBjb21wb25lbnQgaW4gYSBWaWV3Q29udGFpbmVyUmVmIChjYWxsZWQgZnJvbSB0ZW1wbGF0ZSlcbiAgICovXG4gIGluaXRDb21wb25lbnQoXG4gICAgdmNyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHJlbmRlcmVkVmFsdWU6IFR5cGU8YW55PiB8IENvbXBvbmVudFJlbmRlckNvbmZpZyxcbiAgICByb3c6IGFueSxcbiAgICBjb2x1bW46IER5bmFtaWNUYWJsZUNvbHVtbixcbiAgICByb3dJbmRleDogbnVtYmVyLFxuICAgIGNvbElkOiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCF2Y3IpIHJldHVybiBmYWxzZTtcbiAgICBcbiAgICBjb25zdCBrZXkgPSBgJHtyb3dJbmRleH1fJHtjb2xJZH1gO1xuICAgIFxuICAgIC8vIElmIGNvbXBvbmVudCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBjZWxsLCBkb24ndCByZWNyZWF0ZVxuICAgIGlmICh0aGlzLmNvbXBvbmVudFJlZnMuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb21wb25lbnRDbGFzcyA9IHRoaXMuZ2V0Q29tcG9uZW50Q2xhc3MocmVuZGVyZWRWYWx1ZSk7XG4gICAgICBjb25zdCBpbnB1dHMgPSB0aGlzLmdldENvbXBvbmVudElucHV0cyhyZW5kZXJlZFZhbHVlKTtcbiAgICAgIGNvbnN0IG91dHB1dHMgPSB0aGlzLmdldENvbXBvbmVudE91dHB1dHMocmVuZGVyZWRWYWx1ZSk7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgY29tcG9uZW50XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB2Y3IuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudENsYXNzKTtcbiAgICAgIFxuICAgICAgLy8gU2V0IGlucHV0c1xuICAgICAgT2JqZWN0LmtleXMoaW5wdXRzKS5mb3JFYWNoKGlucHV0S2V5ID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbnN0YW5jZSAmJiBpbnB1dEtleSBpbiBjb21wb25lbnRSZWYuaW5zdGFuY2UpIHtcbiAgICAgICAgICAoY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIGFueSlbaW5wdXRLZXldID0gaW5wdXRzW2lucHV0S2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFN1YnNjcmliZSB0byBvdXRwdXRzXG4gICAgICBPYmplY3Qua2V5cyhvdXRwdXRzKS5mb3JFYWNoKG91dHB1dEtleSA9PiB7XG4gICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5zdGFuY2UgJiYgb3V0cHV0S2V5IGluIGNvbXBvbmVudFJlZi5pbnN0YW5jZSkge1xuICAgICAgICAgIGNvbnN0IG91dHB1dCA9IChjb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgYW55KVtvdXRwdXRLZXldO1xuICAgICAgICAgIGlmIChvdXRwdXQgJiYgdHlwZW9mIG91dHB1dC5zdWJzY3JpYmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG91dHB1dC5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IG91dHB1dHNbb3V0cHV0S2V5XTtcbiAgICAgICAgICAgICAgaWYgKGhhbmRsZXIpIGhhbmRsZXIoZXZlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChvdXRwdXQgJiYgdHlwZW9mIG91dHB1dC5lbWl0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBGb3IgRXZlbnRFbWl0dGVyLCB3cmFwIHRoZSBlbWl0IHRvIGNhbGwgdGhlIGhhbmRsZXJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRW1pdCA9IG91dHB1dC5lbWl0LmJpbmQob3V0cHV0KTtcbiAgICAgICAgICAgIChjb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgYW55KVtvdXRwdXRLZXldID0ge1xuICAgICAgICAgICAgICBlbWl0OiAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsRW1pdChldmVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IG91dHB1dHNbb3V0cHV0S2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcikgaGFuZGxlcihldmVudCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHN1YnNjcmliZTogb3V0cHV0LnN1YnNjcmliZS5iaW5kKG91dHB1dClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTWFyayBmb3IgY2hhbmdlIGRldGVjdGlvblxuICAgICAgY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgXG4gICAgICAvLyBTdG9yZSByZWZlcmVuY2UgZm9yIGNsZWFudXBcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmcy5zZXQoa2V5LCBjb21wb25lbnRSZWYpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGNvbXBvbmVudCBpbiB0YWJsZSBjZWxsOicsIGVycik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgcmVuZGVyZWQgdmFsdWUgaXMgYW4gSFRNTCBzdHJpbmcgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQgd2l0aCBpbm5lckhUTUxcbiAgICovXG4gIGlzSHRtbFN0cmluZyh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgICAvLyBGYXN0ZXIgY2hlY2s6IGlmIGl0IGNvbnRhaW5zIGFuIG9wZW5pbmcgdGFnIHBhdHRlcm4gbmVhciB0aGUgc3RhcnRcbiAgICAvLyBvciBqdXN0IGhhcyBhbnkgYnJhY2tldHMuIFdyYXBwaW5nIGluIGEgcmVnZXggd2l0aCBbXFxzXFxTXSogaXMgdmVyeSBzbG93LlxuICAgIHJldHVybiB2YWx1ZS5pbmNsdWRlcygnPCcpICYmIC88W2Etei9dW14+XSo+L2kudGVzdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2FuaXRpemVzIEhUTUwgc3RyaW5nIGZvciBzYWZlIHJlbmRlcmluZyB3aXRoIGNhY2hpbmdcbiAgICovXG4gIGdldFNhbml0aXplZEh0bWwodmFsdWU6IHN0cmluZyk6IFNhZmVIdG1sIHtcbiAgICBsZXQgY2FjaGVkID0gdGhpcy5odG1sQ2FjaGUuZ2V0KHZhbHVlKTtcbiAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgY2FjaGVkID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodmFsdWUpO1xuICAgICAgdGhpcy5odG1sQ2FjaGUuc2V0KHZhbHVlLCBjYWNoZWQpO1xuICAgICAgXG4gICAgICAvLyBTaW1wbGUgY2FjaGUgZXZpY3Rpb25cbiAgICAgIGlmICh0aGlzLmh0bWxDYWNoZS5zaXplID4gMTAwMCkge1xuICAgICAgICBjb25zdCBmaXJzdEtleSA9IHRoaXMuaHRtbENhY2hlLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgIGlmIChmaXJzdEtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5odG1sQ2FjaGUuZGVsZXRlKGZpcnN0S2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgZ2V0Q2VsbFZhbHVlKHJvdzogYW55LCBwYXRoPzogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIXJvdyB8fCAhcGF0aCkgcmV0dXJuIFwiXCI7XG4gICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcbiAgICBsZXQgY3VycmVudCA9IHJvdztcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGlmIChjdXJyZW50ID09IG51bGwpIHJldHVybiBcIlwiO1xuICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydF07XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50ID8/IFwiXCI7XG4gIH1cblxuICB0cmFja0J5SW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLy8gQ29tcHV0ZSBncmlkLXRlbXBsYXRlLWNvbHVtbnMgc3RyaW5nIGZyb20gY29sdW1uIGNvbmZpZ1xuICBwcml2YXRlIHVwZGF0ZUdyaWRUZW1wbGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb2xzID0gdGhpcy52aXNpYmxlQ29sdW1ucztcbiAgICBpZiAoIWNvbHM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5jb21wdXRlZEdyaWRUZW1wbGF0ZSA9ICcnO1xuICAgICAgdGhpcy5jb21wdXRlZENvbHVtbldpZHRocyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBmaXhlZFB4ID0gY29scy5yZWR1Y2UoKHN1bSwgYykgPT4gc3VtICsgKGMuZml4ZWRQeCB8fCAwKSwgMCk7XG4gICAgY29uc3QgZHluYW1pY0NvbHMgPSBjb2xzLmZpbHRlcihjID0+ICFjLmZpeGVkUHgpO1xuICAgIGNvbnN0IHRvdGFsV2VpZ2h0ID0gZHluYW1pY0NvbHMucmVkdWNlKChzdW0sIGMpID0+IHN1bSArIChjLndlaWdodCB8fCAxKSwgMCkgfHwgMTtcbiAgICBcbiAgICB0aGlzLmNvbXB1dGVkQ29sdW1uV2lkdGhzID0gY29scy5tYXAoYyA9PiB7XG4gICAgICBpZiAoYy5maXhlZFB4ICYmIGMuZml4ZWRQeCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGAke2MuZml4ZWRQeH1weGA7XG4gICAgICB9XG4gICAgICBjb25zdCBzaGFyZSA9IChjLndlaWdodCB8fCAxKSAvIHRvdGFsV2VpZ2h0O1xuICAgICAgcmV0dXJuIGBjYWxjKCgxMDAlIC0gJHtmaXhlZFB4fXB4KSAqICR7c2hhcmUudG9GaXhlZCg0KX0pYDtcbiAgICB9KTtcbiAgICBcbiAgICBpZiAodGhpcy5ncmlkVGVtcGxhdGVDb2x1bW5zKSB7XG4gICAgICB0aGlzLmNvbXB1dGVkR3JpZFRlbXBsYXRlID0gdGhpcy5ncmlkVGVtcGxhdGVDb2x1bW5zO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbXB1dGVkR3JpZFRlbXBsYXRlID0gdGhpcy5jb21wdXRlZENvbHVtbldpZHRocy5qb2luKCcgJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2VsZWN0aW9uIGhlbHBlcnNcbiAgZ2V0IGFsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmRhdGEgfHwgW107XG4gICAgaWYgKCFyb3dzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiByb3dzLmV2ZXJ5KHIgPT4gISFyPy5pc1NlbGVjdGVkKTtcbiAgfVxuXG4gIGdldCBzb21lU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZGF0YSB8fCBbXTtcbiAgICBpZiAoIXJvd3MubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgYW55U2VsZWN0ZWQgPSByb3dzLnNvbWUociA9PiAhIXI/LmlzU2VsZWN0ZWQpO1xuICAgIHJldHVybiBhbnlTZWxlY3RlZCAmJiAhdGhpcy5hbGxTZWxlY3RlZDtcbiAgfVxuXG4gIG9uU2VsZWN0QWxsQ2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMudG9nZ2xlU2VsZWN0QWxsKHRhcmdldC5jaGVja2VkKTtcbiAgfVxuXG4gIG9uUm93U2VsZWN0Q2hhbmdlKGV2ZW50OiBFdmVudCwgcm93OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICByb3cuaXNTZWxlY3RlZCA9IHRhcmdldC5jaGVja2VkO1xuICB9XG5cbiAgdG9nZ2xlU2VsZWN0QWxsKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5kYXRhIHx8IFtdO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgcm93LmlzU2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IFNvcnRpbmcgc3VwcG9ydCA9PT09PVxuICBwcml2YXRlIF9zb3J0QWN0aXZlPzogc3RyaW5nO1xuICBwcml2YXRlIF9zb3J0RGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgdXBkYXRlQ29tcHV0ZWREYXRhKCk6IHZvaWQge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZGF0YSB8fCBbXTtcbiAgICBpZiAoIXRoaXMuZW5hYmxlTG9jYWxTb3J0IHx8ICF0aGlzLl9zb3J0QWN0aXZlIHx8ICF0aGlzLl9zb3J0RGlyZWN0aW9uKSB7XG4gICAgICB0aGlzLmNvbXB1dGVkRGF0YSA9IHNvdXJjZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29sID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maW5kKGMgPT4gYy5maWVsZElkID09PSB0aGlzLl9zb3J0QWN0aXZlKTtcbiAgICBpZiAoIWNvbCB8fCAhY29sLmZpZWxkVmFsdWUpIHtcbiAgICAgIHRoaXMuY29tcHV0ZWREYXRhID0gc291cmNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkaXIgPSB0aGlzLl9zb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IDEgOiAtMTtcbiAgICBjb25zdCBmaWVsZFBhdGggPSBjb2wuZmllbGRWYWx1ZTtcbiAgICBjb25zdCBvdXQgPSBbLi4uc291cmNlXTtcbiAgICBvdXQuc29ydCgoYSwgYikgPT4gZGlyICogdGhpcy5jb21wYXJlVmFsdWVzKHRoaXMuZ2V0Q2VsbFZhbHVlKGEsIGZpZWxkUGF0aCksIHRoaXMuZ2V0Q2VsbFZhbHVlKGIsIGZpZWxkUGF0aCkpKTtcbiAgICB0aGlzLmNvbXB1dGVkRGF0YSA9IG91dDtcbiAgfVxuXG4gIC8vIENvbXB1dGVkIGxvYWRpbmcgZmxhZ3MgdG8gc3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIGdldCBzaG93VGFibGVMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVGFibGVMb2FkaW5nID8/IGZhbHNlO1xuICB9XG5cbiAgZ2V0IHNob3dUYWJsZURhdGFMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVGFibGVEYXRhTG9hZGluZyA/PyBmYWxzZTtcbiAgfVxuXG4gIC8vIFRydWUgd2hlbiB0YWJsZSBoYXMgbm8gZGF0YSBhbmQgaXMgbm90IGN1cnJlbnRseSBsb2FkaW5nIOKAlCB1c2VkIHRvIHNob3cgYW4gZW1wdHkgc3RhdGVcbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYW55TG9hZGluZyA9IHRoaXMuc2hvd1RhYmxlTG9hZGluZyB8fCB0aGlzLnNob3dUYWJsZURhdGFMb2FkaW5nO1xuICAgIHJldHVybiAhYW55TG9hZGluZyAmJiAoISh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLmxlbmd0aCkgfHwgdGhpcy5kYXRhLmxlbmd0aCA9PT0gMCk7XG4gIH1cblxuICBpc1NvcnRlZEFzYyhjb2xJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRBY3RpdmUgPT09IGNvbElkICYmIHRoaXMuX3NvcnREaXJlY3Rpb24gPT09ICdhc2MnO1xuICB9XG5cbiAgaXNTb3J0ZWREZXNjKGNvbElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydEFjdGl2ZSA9PT0gY29sSWQgJiYgdGhpcy5fc29ydERpcmVjdGlvbiA9PT0gJ2Rlc2MnO1xuICB9XG5cbiAgdG9nZ2xlU29ydChjb2w6IER5bmFtaWNUYWJsZUNvbHVtbik6IHZvaWQge1xuICAgIGlmICghY29sPy5zb3J0YWJsZSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbElkID0gY29sLmZpZWxkSWQ7XG4gICAgaWYgKHRoaXMuX3NvcnRBY3RpdmUgIT09IGNvbElkKSB7XG4gICAgICB0aGlzLl9zb3J0QWN0aXZlID0gY29sSWQ7XG4gICAgICB0aGlzLl9zb3J0RGlyZWN0aW9uID0gJ2FzYyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGN5Y2xlIGFzYyAtPiBkZXNjIC0+IG51bGwgLT4gYXNjXG4gICAgICBpZiAodGhpcy5fc29ydERpcmVjdGlvbiA9PT0gJ2FzYycpIHRoaXMuX3NvcnREaXJlY3Rpb24gPSAnZGVzYyc7XG4gICAgICBlbHNlIGlmICh0aGlzLl9zb3J0RGlyZWN0aW9uID09PSAnZGVzYycpIHRoaXMuX3NvcnREaXJlY3Rpb24gPSBudWxsO1xuICAgICAgZWxzZSB0aGlzLl9zb3J0RGlyZWN0aW9uID0gJ2FzYyc7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQ29tcHV0ZWREYXRhKCk7XG4gICAgdGhpcy5zb3J0Q2hhbmdlLmVtaXQoeyBmaWVsZElkOiB0aGlzLl9zb3J0QWN0aXZlLCBmaWVsZFZhbHVlOiBjb2wuZmllbGRWYWx1ZSwgZGlyZWN0aW9uOiB0aGlzLl9zb3J0RGlyZWN0aW9uIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wYXJlVmFsdWVzKGE6IGFueSwgYjogYW55KTogbnVtYmVyIHtcbiAgICBpZiAoYSA9PSBudWxsICYmIGIgPT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgaWYgKGEgPT0gbnVsbCkgcmV0dXJuIDE7IC8vIG51bGxzIGxhc3QgaW4gYXNjIChoYW5kbGVkIGJ5IGRpciBtdWx0aXBsaWVyKVxuICAgIGlmIChiID09IG51bGwpIHJldHVybiAtMTtcblxuICAgIGNvbnN0IG51bUEgPSB0eXBlb2YgYSA9PT0gJ251bWJlcicgPyBhIDogTnVtYmVyKGEpO1xuICAgIGNvbnN0IG51bUIgPSB0eXBlb2YgYiA9PT0gJ251bWJlcicgPyBiIDogTnVtYmVyKGIpO1xuICAgIGNvbnN0IGFJc051bSA9ICFpc05hTihudW1BKSAmJiBhICE9PSAnJyAmJiBhICE9PSBudWxsICYmIGEgIT09IGZhbHNlO1xuICAgIGNvbnN0IGJJc051bSA9ICFpc05hTihudW1CKSAmJiBiICE9PSAnJyAmJiBiICE9PSBudWxsICYmIGIgIT09IGZhbHNlO1xuICAgIGlmIChhSXNOdW0gJiYgYklzTnVtKSB7XG4gICAgICBpZiAobnVtQSA8IG51bUIpIHJldHVybiAtMTtcbiAgICAgIGlmIChudW1BID4gbnVtQikgcmV0dXJuIDE7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBEYXRlIGRldGVjdGlvbjogYXR0ZW1wdCBwYXJzZSB3aGVuIGJvdGggdmFsdWVzIGFyZSBzdHJpbmdzIGFuZCBwYXJzZWFibGVcbiAgICBpZiAodHlwZW9mIGEgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBiID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdHNBID0gRGF0ZS5wYXJzZShhKTtcbiAgICAgIGNvbnN0IHRzQiA9IERhdGUucGFyc2UoYik7XG4gICAgICBpZiAoIWlzTmFOKHRzQSkgJiYgIWlzTmFOKHRzQikpIHtcbiAgICAgICAgaWYgKHRzQSA8IHRzQikgcmV0dXJuIC0xO1xuICAgICAgICBpZiAodHNBID4gdHNCKSByZXR1cm4gMTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICAvLyBsb2NhbGVDb21wYXJlLCBjYXNlLWluc2Vuc2l0aXZlXG4gICAgICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIsIHVuZGVmaW5lZCwgeyBzZW5zaXRpdml0eTogJ2Jhc2UnLCBudW1lcmljOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIHRvIHN0cmluZyBjb21wYXJpc29uXG4gICAgY29uc3Qgc2EgPSBTdHJpbmcoYSk7XG4gICAgY29uc3Qgc2IgPSBTdHJpbmcoYik7XG4gICAgcmV0dXJuIHNhLmxvY2FsZUNvbXBhcmUoc2IsIHVuZGVmaW5lZCwgeyBzZW5zaXRpdml0eTogJ2Jhc2UnLCBudW1lcmljOiB0cnVlIH0pO1xuICB9XG59XG5cblxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmVcIiBbY2xhc3MuY3FhLW1heC1oLVsxMDBweF1dPVwic2hvd1RhYmxlTG9hZGluZ1wiPlxuICAgIDxjcWEtZnVsbC10YWJsZS1sb2FkZXIgKm5nSWY9XCJzaG93VGFibGVMb2FkaW5nXCI+PC9jcWEtZnVsbC10YWJsZS1sb2FkZXI+XG4gICAgPGNxYS10YWJsZS1kYXRhLWxvYWRlciAqbmdJZj1cInNob3dUYWJsZURhdGFMb2FkaW5nXCI+PC9jcWEtdGFibGUtZGF0YS1sb2FkZXI+XG4gICAgPHRhYmxlIGNsYXNzPVwidGFibGUtaW5uZXIgY3FhLXctZnVsbCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1ncmF5LTIwMFwiIFtjbGFzcy5pcy1sb2FkaW5nXT1cInRydWVcIiAqbmdJZj1cIiFzaG93VGFibGVMb2FkaW5nXCI+XG4gICAgICA8Y29sZ3JvdXA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHdpZHRoIG9mIGNvbXB1dGVkQ29sdW1uV2lkdGhzOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIj5cbiAgICAgICAgICA8Y29sIFtzdHlsZS53aWR0aF09XCJ3aWR0aFwiIC8+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9jb2xncm91cD5cblxuICAgICAgPHRoZWFkICpuZ0lmPVwiZGF0YT8ubGVuZ3RoXCI+XG4gICAgICAgIDx0ciBjbGFzcz1cInRhYmxlLWhlYWRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIHZpc2libGVDb2x1bW5zOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIj5cbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICBjbGFzcz1cImhlYWRlci1jZWxsIGNxYS1weS1bMTMuMjVweF0gY3FhLXB4LVsxMC41cHhdIGNxYS10ZXh0LXhzIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtYmctWyNlZmYwZjddXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgICAgIGNvbC5maWVsZElkICsgJy1jZWxsJyxcbiAgICAgICAgICAgICAgICBjb2wuYWxpZ24gPT09ICdjZW50ZXInID8gJ2NxYS10ZXh0LWNlbnRlcicgOiBjb2wuYWxpZ24gPT09ICdyaWdodCcgPyAnY3FhLXRleHQtcmlnaHQnIDogJ2NxYS10ZXh0LWxlZnQnXG4gICAgICAgICAgICAgIF1cIj5cbiAgICAgICAgICAgICAgPCEtLSBCdWlsdC1pbiBzZWxlY3QtYWxsIGZvciBjaGVja2JveCBjb2x1bW4gd2hlbiBlbmFibGVkIGFuZCBubyBjdXN0b20gaGVhZGVyIHRlbXBsYXRlIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuZmllbGRJZCA9PT0gJ2NoZWNrYm94JyAmJiBlbmFibGVTZWxlY3RBbGwgJiYgIWdldEhlYWRlclRlbXBsYXRlKGNvbC5maWVsZElkKTsgZWxzZSBoZWFkZXJUcGxPckRlZmF1bHRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJjaGVja2JveFwiIGFyaWEtbGFiZWw9XCJTZWxlY3QgYWxsIHJvd3NcIiBbY2hlY2tlZF09XCJhbGxTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzb21lU2VsZWN0ZWRcIiAoY2hhbmdlKT1cIm9uU2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIiBjbGFzcz1cImhpZGRlbi1jaGVja2JveFwiIC8+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2hlY2tib3hcIiBjbGFzcz1cImN1c3RvbS1jaGVja2JveC1sYWJlbFwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2hlYWRlclRwbE9yRGVmYXVsdD5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0SGVhZGVyVGVtcGxhdGUoY29sLmZpZWxkSWQpIGFzIGhlYWRlclRwbDsgZWxzZSBkZWZhdWx0SGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyVHBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5zb3J0YWJsZTsgZWxzZSBwbGFpbkhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImhlYWRlci10ZXh0IGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtcHgtMFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNvcnQoY29sKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NvcnQgYnkgJyArIChjb2wuZmllbGROYW1lIHx8IGNvbC5maWVsZElkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEyLjNweF0gY3FhLWxlYWRpbmctWzE3LjVweF0gY3FhLXRleHQtWyMwQTBBMEFdIGNxYS1mb250LW1lZGl1bVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wuZmllbGROYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNTb3J0ZWRBc2MoY29sLmZpZWxkSWQpXCI+4payPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNTb3J0ZWREZXNjKGNvbC5maWVsZElkKVwiPuKWvDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5IZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXRleHRcIj57eyBjb2wuZmllbGROYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG5cbiAgICAgIDx0Ym9keSBjbGFzcz1cInRhYmxlLWJvZHkgY3FhLXctZnVsbFwiPlxuICAgICAgICA8dHIgY2xhc3M9XCJ0YWJsZS1yb3cgY3FhLWJnLXN1cmZhY2UtZGVmYXVsdCBob3ZlcjpjcWEtYmctc3VyZmFjZS1ob3ZlclwiICpuZ0Zvcj1cImxldCByb3cgb2YgY29tcHV0ZWREYXRhOyBsZXQgcm93SW5kZXggPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcbiAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwicm93Py5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIHZpc2libGVDb2x1bW5zOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNlbGwgY3FhLXB4LVsxMC41cHhdIGNxYS1weS1bMTFweF1cIiBcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgICAgIGNvbC5maWVsZElkICsgJy1jZWxsJyxcbiAgICAgICAgICAgICAgICBjb2wuYWxpZ24gPT09ICdjZW50ZXInID8gJ2NxYS10ZXh0LWNlbnRlcicgOiBjb2wuYWxpZ24gPT09ICdyaWdodCcgPyAnY3FhLXRleHQtcmlnaHQnIDogJ2NxYS10ZXh0LWxlZnQnXG4gICAgICAgICAgICAgIF1cIj5cbiAgICAgICAgICAgICAgPCEtLSBCdWlsdC1pbiBjaGVja2JveCBjZWxsIHdoZW4gbm8gY3VzdG9tIHRlbXBsYXRlIGlzIHByb3ZpZGVkIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmZpZWxkSWQgPT09ICdjaGVja2JveCcgJiYgIWdldENlbGxUZW1wbGF0ZShjb2wuZmllbGRJZCk7IGVsc2UgcmVndWxhckNlbGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94XCIgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgICAgICAgY29sLmFsaWduID09PSAnY2VudGVyJyA/ICdjcWEtZmxleCBjcWEtanVzdGlmeS1jZW50ZXInIDogY29sLmFsaWduID09PSAncmlnaHQnID8gJ2NxYS1mbGV4IGNxYS1qdXN0aWZ5LWVuZCcgOiAnJ1xuICAgICAgICAgICAgICAgIF1cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhpZGRlbi1jaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIidyb3ctY2hlY2tib3gtJyArIHJvd0luZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlNlbGVjdCByb3dcIlxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJyb3c/LmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uUm93U2VsZWN0Q2hhbmdlKCRldmVudCwgcm93KVwiIC8+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXN0b20tY2hlY2tib3gtbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5mb3JdPVwiJ3Jvdy1jaGVja2JveC0nICsgcm93SW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JlZ3VsYXJDZWxsPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRDZWxsVGVtcGxhdGUoY29sLmZpZWxkSWQpIGFzIGNlbGxUcGw7IGVsc2UgZGVmYXVsdENlbGxcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjZWxsVHBsOyBjb250ZXh0OiB7JGltcGxpY2l0OiByb3csIHJvdzogcm93LCB2YWx1ZTogZ2V0Q2VsbFZhbHVlKHJvdywgY29sLmZpZWxkVmFsdWUpfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENlbGw+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0UmVuZGVyZWRWYWx1ZShyb3csIGNvbCkgYXMgcmVuZGVyZWRWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDb21wb25lbnQocmVuZGVyZWRWYWx1ZSk7IGVsc2Ugbm9uQ29tcG9uZW50Q2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgXG4gICAgICAgICAgICAgICAgICAgICAgICBjcWFDZWxsQ29udGFpbmVyIFxuICAgICAgICAgICAgICAgICAgICAgICAgI2NlbGxDb250YWluZXI9XCJjcWFDZWxsQ29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRDb25maWddPVwicmVuZGVyZWRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93SW5kZXhdPVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbElkXT1cImNvbC5maWVsZElkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vbkNvbXBvbmVudENlbGw+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzSHRtbFN0cmluZyhyZW5kZXJlZFZhbHVlKTsgZWxzZSB0ZXh0Q2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS1sZWFkaW5nLVsxN3B4XVwiIFtpbm5lckhUTUxdPVwiZ2V0U2FuaXRpemVkSHRtbChyZW5kZXJlZFZhbHVlKVwiIFtuZ0NsYXNzXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5hbGlnbiA9PT0gJ2NlbnRlcicgPyAnY3FhLWZsZXggY3FhLWp1c3RpZnktY2VudGVyJyA6IGNvbC5hbGlnbiA9PT0gJ3JpZ2h0JyA/ICdjcWEtZmxleCBjcWEtanVzdGlmeS1lbmQnIDogJydcbiAgICAgICAgICAgICAgICAgICAgICBdXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0ZXh0Q2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyMzNzQxNTFdXCIgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sLmFsaWduID09PSAnY2VudGVyJyA/ICdjcWEtZmxleCBjcWEtanVzdGlmeS1jZW50ZXInIDogY29sLmFsaWduID09PSAncmlnaHQnID8gJ2NxYS1mbGV4IGNxYS1qdXN0aWZ5LWVuZCcgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgIF1cIj57eyByZW5kZXJlZFZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
456
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RhYmxlL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RhYmxlL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFhLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUEyRyx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoUSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7OztBQWlDeEcsTUFBTSxPQUFPLHFCQUFxQjtJQWdEaEMsWUFDVSxTQUF1QixFQUN2QixHQUFzQjtRQUR0QixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBakR2QixTQUFJLEdBQVUsRUFBRSxDQUFDO1FBQ2pCLFlBQU8sR0FBeUIsRUFBRSxDQUFDO1FBUzVDLDhEQUE4RDtRQUNyRCxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUN6QyxzRkFBc0Y7UUFDN0Usb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFPekMsc0VBQXNFO1FBQzVELGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBOEUsQ0FBQztRQWN0SCxnRkFBZ0Y7UUFDeEUsa0JBQWEsR0FBRyxJQUFJLEdBQUcsRUFBNkIsQ0FBQztRQUU3RCwrQkFBK0I7UUFDL0IsbUJBQWMsR0FBeUIsRUFBRSxDQUFDO1FBQzFDLGlCQUFZLEdBQVUsRUFBRSxDQUFDO1FBQ3pCLHlCQUFvQixHQUFXLEVBQUUsQ0FBQztRQUNsQyx5QkFBb0IsR0FBYSxFQUFFLENBQUM7UUFFcEMs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cUI7a0JBUGpDLFNBQVM7K0JBQ0UsbUJBQW1CLFFBR3ZCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxtQkFDYix1QkFBdUIsQ0FBQyxNQUFNO21JQUd0QyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUlHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUlHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU07Z0JBR0Usa0JBQWtCO3NCQUExQixLQUFLO2dCQUdHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFFeUMsYUFBYTtzQkFBM0QsZUFBZTt1QkFBQyw0QkFBNEI7Z0JBQ0ksZUFBZTtzQkFBL0QsZUFBZTt1QkFBQyw4QkFBOEI7Z0JBR08sYUFBYTtzQkFBbEUsWUFBWTt1QkFBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIENvbnRlbnRDaGlsZHJlbiwgSW5wdXQsIFF1ZXJ5TGlzdCwgVGVtcGxhdGVSZWYsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIENvbXBvbmVudFJlZiwgVHlwZSwgT25EZXN0cm95LCBDaGFuZ2VEZXRlY3RvclJlZiwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSBcIkBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJcIjtcbmltcG9ydCB7IER5bmFtaWNDZWxsVGVtcGxhdGVEaXJlY3RpdmUsIER5bmFtaWNIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gXCIuL2R5bmFtaWMtY2VsbC5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IENvbXBvbmVudFJlbmRlckNvbmZpZyB9IGZyb20gXCIuL2NvbXBvbmVudC1yZW5kZXItY29uZmlnLmludGVyZmFjZVwiO1xuXG5leHBvcnQgeyBDb21wb25lbnRSZW5kZXJDb25maWcgfSBmcm9tIFwiLi9jb21wb25lbnQtcmVuZGVyLWNvbmZpZy5pbnRlcmZhY2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljVGFibGVDb2x1bW4ge1xuICBmaWVsZElkOiBzdHJpbmc7XG4gIGZpZWxkTmFtZT86IHN0cmluZztcbiAgZmllbGRWYWx1ZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGN1c3RvbSByZW5kZXJlciBpbnZva2VkIHdoZW4gbm8gcHJvamVjdGVkIGNlbGwgdGVtcGxhdGUgaXMgcHJvdmlkZWQuXG4gICAqIFJldHVybnMgdGhlIHN0cmluZy9udW1iZXIvSFRNTCBzdHJpbmcvQ29tcG9uZW50IGNsYXNzL0NvbXBvbmVudFJlbmRlckNvbmZpZyB0byBkaXNwbGF5IGZvciB0aGUgZ2l2ZW4gcm93LlxuICAgKiBIVE1MIHN0cmluZ3Mgd2lsbCBiZSBzYW5pdGl6ZWQgYW5kIHJlbmRlcmVkIHNhZmVseS5cbiAgICogQ29tcG9uZW50IGNsYXNzZXMgd2lsbCBiZSBkeW5hbWljYWxseSBpbnN0YW50aWF0ZWQuXG4gICAqL1xuICByZW5kZXI/OiAocm93OiBhbnksIGNvbHVtbjogRHluYW1pY1RhYmxlQ29sdW1uKSA9PiBzdHJpbmcgfCBudW1iZXIgfCBTYWZlSHRtbCB8IFR5cGU8YW55PiB8IENvbXBvbmVudFJlbmRlckNvbmZpZztcbiAgaXNEZWZhdWx0PzogYm9vbGVhbjtcbiAgc29ydGFibGU/OiBib29sZWFuO1xuICBpc1Nob3c/OiBib29sZWFuO1xuICAvLyBOZXcgY29uZmlndXJhdGlvbiBmaWVsZHMgdG8gdW5pZnkgbGF5b3V0IGxvZ2ljXG4gIHdlaWdodD86IG51bWJlcjsgLy8gcmVsYXRpdmUgd2VpZ2h0IGZvciBkeW5hbWljIHNoYXJlXG4gIGZpeGVkUHg/OiBudW1iZXI7IC8vIGZpeGVkIHdpZHRoIGluIHB4IChlLmcuIGNoZWNrYm94L2FjdGlvbnMpXG4gIHJlc3BvbnNpdmU/OiB7IHhzPzogYm9vbGVhbjsgc20/OiBib29sZWFuOyBtZD86IGJvb2xlYW4gfTsgLy8gaGlkZSBhdCBzcGVjaWZpYyBicmVha3BvaW50c1xuICBhbGlnbj86ICdsZWZ0JyB8ICdjZW50ZXInIHwgJ3JpZ2h0Jztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFwcC1keW5hbWljLXRhYmxlXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZGF0YTogYW55W10gPSBbXTtcbiAgQElucHV0KCkgY29sdW1uczogRHluYW1pY1RhYmxlQ29sdW1uW10gPSBbXTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHVzZWQgd2hlbiBubyBjdXN0b20gZW1wdHkgdGVtcGxhdGUgaXMgcHJvdmlkZWQuXG4gICAqL1xuICBASW5wdXQoKSBlbXB0eVN0YXRlPzogeyB0aXRsZT86IHN0cmluZzsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IGltYWdlVXJsPzogc3RyaW5nOyBhY3Rpb25zPzogYW55W10gfTtcbiAgLy8gT3B0aW9uYWwgb3ZlcnJpZGU7IGlmIG9taXR0ZWQgd2UgY29tcHV0ZSBmcm9tIGNvbHVtbnNcbiAgQElucHV0KCkgZ3JpZFRlbXBsYXRlQ29sdW1ucz86IHN0cmluZztcbiAgLy8gQnJlYWtwb2ludC1hd2FyZSBzaXppbmc7IHByb3ZpZGUgZnJvbSBwYXJlbnQgdG8gYXZvaWQgZXh0cmEgbGlzdGVuZXJzXG4gIEBJbnB1dCgpIHNjcmVlbldpZHRoPzogbnVtYmVyO1xuICAvLyBFbmFibGUgYnVpbHQtaW4gc2VsZWN0LWFsbCBiZWhhdmlvciBmb3IgYSAnY2hlY2tib3gnIGNvbHVtblxuICBASW5wdXQoKSBlbmFibGVTZWxlY3RBbGw6IGJvb2xlYW4gPSB0cnVlO1xuICAvLyBFbmFibGUgc2ltcGxlIGNsaWVudC1zaWRlIHNvcnRpbmcgd2hlbiBjbGlja2luZyBzb3J0YWJsZSBoZWFkZXJzIChubyBjdXN0b20gaGVhZGVyKVxuICBASW5wdXQoKSBlbmFibGVMb2NhbFNvcnQ6IGJvb2xlYW4gPSB0cnVlO1xuICAvLyBCYWNrd2FyZC1jb21wYXQgbG9hZGluZyBmbGFnIChhcHBsaWVzIHRvIGJvdGggbG9hZGVycyBpZiBzcGVjaWZpYyBmbGFncyBub3QgcHJvdmlkZWQpXG4gIFxuICAvLyBOZXc6IGNvbnRyb2xzIHRoZSBmdWxsIHRhYmxlIG92ZXJsYXkgbG9hZGVyXG4gIEBJbnB1dCgpIGlzVGFibGVMb2FkaW5nPzogYm9vbGVhbjtcbiAgLy8gTmV3OiBjb250cm9scyB0aGUgaW5saW5lIGRhdGEgbG9hZGVyIGFib3ZlIHRoZSB0YWJsZVxuICBASW5wdXQoKSBpc1RhYmxlRGF0YUxvYWRpbmc/OiBib29sZWFuO1xuICAvLyBFbWl0IHNvcnQgY2hhbmdlcyBzbyBwYXJlbnQgY2FuIHBlcmZvcm0gc2VydmVyLXNpZGUgc29ydCBpZiBkZXNpcmVkXG4gIEBPdXRwdXQoKSBzb3J0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGZpZWxkSWQ6IHN0cmluZzsgZmllbGRWYWx1ZT86IHN0cmluZzsgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwgfT4oKTtcblxuICAvLyBPcHRpb25hbCBnZXR0ZXIgZm9yIEpTT04gcGF0aCBwZXIgY2VsbC4gV2hlbiBwcm92aWRlZCwgZG91YmxlLWNsaWNraW5nIGEgY2VsbCBjb3BpZXMgdGhlIHBhdGguXG4gIEBJbnB1dCgpIGNlbGxKc29uUGF0aEdldHRlcj86IChyb3dJbmRleDogbnVtYmVyLCBjb2xJZDogc3RyaW5nLCByb3c6IGFueSkgPT4gc3RyaW5nO1xuXG4gIC8vIE9wdGlvbmFsIGhhbmRsZXIgY2FsbGVkIHdoZW4gYSBKU09OIHBhdGggaXMgY29waWVkIGZyb20gYSB0YWJsZSBjZWxsXG4gIEBJbnB1dCgpIG9uSnNvblBhdGhDb3BpZWRIYW5kbGVyPzogKGV2ZW50OiB7IHBhdGg6IHN0cmluZzsgc291cmNlOiBzdHJpbmcgfSkgPT4gdm9pZDtcblxuICBAQ29udGVudENoaWxkcmVuKER5bmFtaWNDZWxsVGVtcGxhdGVEaXJlY3RpdmUpIGNlbGxUZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8RHluYW1pY0NlbGxUZW1wbGF0ZURpcmVjdGl2ZT47XG4gIEBDb250ZW50Q2hpbGRyZW4oRHluYW1pY0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlKSBoZWFkZXJUZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8RHluYW1pY0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlPjtcbiAgLy8gQWxsb3cgY29uc3VtZXJzIHRvIHByb2plY3QgYSBjdXN0b20gZW1wdHktc3RhdGUgdGVtcGxhdGUgdXNpbmcgYSB0ZW1wbGF0ZSByZWYgbmFtZVxuICAvLyBlLmcuIDxuZy10ZW1wbGF0ZSAjZW1wdHlUYWJsZVRwbD5DdXN0b20gZW1wdHkgVUk8L25nLXRlbXBsYXRlPlxuICBAQ29udGVudENoaWxkKCdlbXB0eVRhYmxlVHBsJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBlbXB0eVRhYmxlVHBsPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvLyBNYXAgdG8gc3RvcmUgY29tcG9uZW50IHJlZmVyZW5jZXMgZm9yIGNsZWFudXA6IHJvd0luZGV4X2NvbElkIC0+IENvbXBvbmVudFJlZlxuICBwcml2YXRlIGNvbXBvbmVudFJlZnMgPSBuZXcgTWFwPHN0cmluZywgQ29tcG9uZW50UmVmPGFueT4+KCk7XG5cbiAgLy8gQ2FjaGVzIGZvciBleHBlbnNpdmUgZ2V0dGVyc1xuICB2aXNpYmxlQ29sdW1uczogRHluYW1pY1RhYmxlQ29sdW1uW10gPSBbXTtcbiAgY29tcHV0ZWREYXRhOiBhbnlbXSA9IFtdO1xuICBjb21wdXRlZEdyaWRUZW1wbGF0ZTogc3RyaW5nID0gJyc7XG4gIGNvbXB1dGVkQ29sdW1uV2lkdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIENhY2hlIGZvciBzYW5pdGl6ZWQgSFRNTCB0byBhdm9pZCByZWR1bmRhbnQgaW5uZXJIVE1MIHJlbmRlcnNcbiAgcHJpdmF0ZSBodG1sQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgU2FmZUh0bWw+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29sdW1ucyddIHx8IGNoYW5nZXNbJ3NjcmVlbldpZHRoJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlVmlzaWJsZUNvbHVtbnMoKTtcbiAgICAgIHRoaXMudXBkYXRlR3JpZFRlbXBsYXRlKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydkYXRhJ10gfHwgY2hhbmdlc1snY29sdW1ucyddIHx8IGNoYW5nZXNbJ2VuYWJsZUxvY2FsU29ydCddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbXB1dGVkRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIENsZWFuIHVwIGFsbCBkeW5hbWljYWxseSBjcmVhdGVkIGNvbXBvbmVudHNcbiAgICB0aGlzLmNvbXBvbmVudFJlZnMuZm9yRWFjaChyZWYgPT4gcmVmLmRlc3Ryb3koKSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWZzLmNsZWFyKCk7XG4gICAgdGhpcy5odG1sQ2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGlzWHMoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdyA9IHRoaXMuc2NyZWVuV2lkdGggfHwgd2luZG93LmlubmVyV2lkdGg7XG4gICAgcmV0dXJuIHcgPD0gNDgwO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzU20oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdyA9IHRoaXMuc2NyZWVuV2lkdGggfHwgd2luZG93LmlubmVyV2lkdGg7XG4gICAgcmV0dXJuIHcgPD0gNzY4O1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzTWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdyA9IHRoaXMuc2NyZWVuV2lkdGggfHwgd2luZG93LmlubmVyV2lkdGg7XG4gICAgcmV0dXJuIHcgPD0gOTkyO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmxlQ29sdW1ucygpOiB2b2lkIHtcbiAgICBjb25zdCByZXNwb25zaXZlRmlsdGVyID0gKGM6IER5bmFtaWNUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgciA9IGM/LnJlc3BvbnNpdmUgfHwge307XG4gICAgICBpZiAoci54cyAmJiB0aGlzLmlzWHMpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChyLnNtICYmIHRoaXMuaXNTbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHIubWQgJiYgdGhpcy5pc01kKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSAodGhpcy5jb2x1bW5zIHx8IFtdKS5maWx0ZXIoYyA9PiBjLmlzU2hvdyAhPT0gZmFsc2UpLmZpbHRlcihyZXNwb25zaXZlRmlsdGVyKTtcbiAgfVxuXG4gIGdldEhlYWRlclRlbXBsYXRlKGNvbElkOiBzdHJpbmcpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB7XG4gICAgY29uc3QgdHBsID0gdGhpcy5oZWFkZXJUZW1wbGF0ZXM/LmZpbmQodCA9PiB0Lm5hbWUgPT09IGNvbElkKTtcbiAgICByZXR1cm4gdHBsID8gdHBsLnRlbXBsYXRlIDogbnVsbDtcbiAgfVxuXG4gIGdldENlbGxUZW1wbGF0ZShjb2xJZDogc3RyaW5nKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xuICAgIGNvbnN0IHRwbCA9IHRoaXMuY2VsbFRlbXBsYXRlcz8uZmluZCh0ID0+IHQubmFtZSA9PT0gY29sSWQpO1xuICAgIHJldHVybiB0cGwgPyB0cGwudGVtcGxhdGUgOiBudWxsO1xuICB9XG5cbiAgZ2V0UmVuZGVyZWRWYWx1ZShyb3c6IGFueSwgY29sdW1uOiBEeW5hbWljVGFibGVDb2x1bW4pOiBhbnkge1xuICAgIGlmIChjb2x1bW4/LnJlbmRlciAmJiB0eXBlb2YgY29sdW1uLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbi5yZW5kZXIocm93LCBjb2x1bW4pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRHluYW1pY1RhYmxlIHJlbmRlciBmdW5jdGlvbiB0aHJldyBhbiBlcnJvciBmb3IgY29sdW1uJywgY29sdW1uPy5maWVsZElkLCBlcnIpO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldENlbGxWYWx1ZShyb3csIGNvbHVtbj8uZmllbGRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSByZW5kZXJlZCB2YWx1ZSBpcyBhIGNvbXBvbmVudCBjbGFzcyBvciBjb21wb25lbnQgY29uZmlnXG4gICAqL1xuICBpc0NvbXBvbmVudCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjb21wb25lbnQgY2xhc3MgKGhhcyBAQ29tcG9uZW50IGRlY29yYXRvciBtZXRhZGF0YSlcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLnByb3RvdHlwZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBDb21wb25lbnRSZW5kZXJDb25maWdcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5jb21wb25lbnQgJiYgdHlwZW9mIHZhbHVlLmNvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb21wb25lbnQgY2xhc3MgZnJvbSBhIHJlbmRlciB2YWx1ZSAoY291bGQgYmUgY2xhc3Mgb3IgY29uZmlnKVxuICAgKi9cbiAgZ2V0Q29tcG9uZW50Q2xhc3ModmFsdWU6IFR5cGU8YW55PiB8IENvbXBvbmVudFJlbmRlckNvbmZpZyk6IFR5cGU8YW55PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5jb21wb25lbnQpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5jb21wb25lbnQ7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb21wb25lbnQgdmFsdWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNvbXBvbmVudCBpbnB1dHMgZnJvbSBhIHJlbmRlciB2YWx1ZVxuICAgKi9cbiAgZ2V0Q29tcG9uZW50SW5wdXRzKHZhbHVlOiBUeXBlPGFueT4gfCBDb21wb25lbnRSZW5kZXJDb25maWcpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5pbnB1dHMpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5pbnB1dHM7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNvbXBvbmVudCBvdXRwdXRzIGZyb20gYSByZW5kZXIgdmFsdWVcbiAgICovXG4gIGdldENvbXBvbmVudE91dHB1dHModmFsdWU6IFR5cGU8YW55PiB8IENvbXBvbmVudFJlbmRlckNvbmZpZyk6IHsgW2tleTogc3RyaW5nXTogKGV2ZW50OiBhbnkpID0+IHZvaWQgfSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUub3V0cHV0cykge1xuICAgICAgcmV0dXJuIHZhbHVlLm91dHB1dHM7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhIGNvbXBvbmVudCBpbiBhIFZpZXdDb250YWluZXJSZWYgKGNhbGxlZCBmcm9tIHRlbXBsYXRlKVxuICAgKi9cbiAgaW5pdENvbXBvbmVudChcbiAgICB2Y3I6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcmVuZGVyZWRWYWx1ZTogVHlwZTxhbnk+IHwgQ29tcG9uZW50UmVuZGVyQ29uZmlnLFxuICAgIHJvdzogYW55LFxuICAgIGNvbHVtbjogRHluYW1pY1RhYmxlQ29sdW1uLFxuICAgIHJvd0luZGV4OiBudW1iZXIsXG4gICAgY29sSWQ6IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXZjcikgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgIGNvbnN0IGtleSA9IGAke3Jvd0luZGV4fV8ke2NvbElkfWA7XG4gICAgXG4gICAgLy8gSWYgY29tcG9uZW50IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIGNlbGwsIGRvbid0IHJlY3JlYXRlXG4gICAgaWYgKHRoaXMuY29tcG9uZW50UmVmcy5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudENsYXNzID0gdGhpcy5nZXRDb21wb25lbnRDbGFzcyhyZW5kZXJlZFZhbHVlKTtcbiAgICAgIGNvbnN0IGlucHV0cyA9IHRoaXMuZ2V0Q29tcG9uZW50SW5wdXRzKHJlbmRlcmVkVmFsdWUpO1xuICAgICAgY29uc3Qgb3V0cHV0cyA9IHRoaXMuZ2V0Q29tcG9uZW50T3V0cHV0cyhyZW5kZXJlZFZhbHVlKTtcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBjb21wb25lbnRcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHZjci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50Q2xhc3MpO1xuICAgICAgXG4gICAgICAvLyBTZXQgaW5wdXRzXG4gICAgICBPYmplY3Qua2V5cyhpbnB1dHMpLmZvckVhY2goaW5wdXRLZXkgPT4ge1xuICAgICAgICBpZiAoY29tcG9uZW50UmVmLmluc3RhbmNlICYmIGlucHV0S2V5IGluIGNvbXBvbmVudFJlZi5pbnN0YW5jZSkge1xuICAgICAgICAgIChjb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgYW55KVtpbnB1dEtleV0gPSBpbnB1dHNbaW5wdXRLZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gU3Vic2NyaWJlIHRvIG91dHB1dHNcbiAgICAgIE9iamVjdC5rZXlzKG91dHB1dHMpLmZvckVhY2gob3V0cHV0S2V5ID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbnN0YW5jZSAmJiBvdXRwdXRLZXkgaW4gY29tcG9uZW50UmVmLmluc3RhbmNlKSB7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0ID0gKGNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBhbnkpW291dHB1dEtleV07XG4gICAgICAgICAgaWYgKG91dHB1dCAmJiB0eXBlb2Ygb3V0cHV0LnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb3V0cHV0LnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gb3V0cHV0c1tvdXRwdXRLZXldO1xuICAgICAgICAgICAgICBpZiAoaGFuZGxlcikgaGFuZGxlcihldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG91dHB1dCAmJiB0eXBlb2Ygb3V0cHV0LmVtaXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEZvciBFdmVudEVtaXR0ZXIsIHdyYXAgdGhlIGVtaXQgdG8gY2FsbCB0aGUgaGFuZGxlclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxFbWl0ID0gb3V0cHV0LmVtaXQuYmluZChvdXRwdXQpO1xuICAgICAgICAgICAgKGNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBhbnkpW291dHB1dEtleV0gPSB7XG4gICAgICAgICAgICAgIGVtaXQ6IChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFbWl0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gb3V0cHV0c1tvdXRwdXRLZXldO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKSBoYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgc3Vic2NyaWJlOiBvdXRwdXQuc3Vic2NyaWJlLmJpbmQob3V0cHV0KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBNYXJrIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICBjb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICBcbiAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZSBmb3IgY2xlYW51cFxuICAgICAgdGhpcy5jb21wb25lbnRSZWZzLnNldChrZXksIGNvbXBvbmVudFJlZik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgY29tcG9uZW50IGluIHRhYmxlIGNlbGw6JywgZXJyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSByZW5kZXJlZCB2YWx1ZSBpcyBhbiBIVE1MIHN0cmluZyB0aGF0IHNob3VsZCBiZSByZW5kZXJlZCB3aXRoIGlubmVySFRNTFxuICAgKi9cbiAgaXNIdG1sU3RyaW5nKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgIC8vIEZhc3RlciBjaGVjazogaWYgaXQgY29udGFpbnMgYW4gb3BlbmluZyB0YWcgcGF0dGVybiBuZWFyIHRoZSBzdGFydFxuICAgIC8vIG9yIGp1c3QgaGFzIGFueSBicmFja2V0cy4gV3JhcHBpbmcgaW4gYSByZWdleCB3aXRoIFtcXHNcXFNdKiBpcyB2ZXJ5IHNsb3cuXG4gICAgcmV0dXJuIHZhbHVlLmluY2x1ZGVzKCc8JykgJiYgLzxbYS16L11bXj5dKj4vaS50ZXN0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZXMgSFRNTCBzdHJpbmcgZm9yIHNhZmUgcmVuZGVyaW5nIHdpdGggY2FjaGluZ1xuICAgKi9cbiAgZ2V0U2FuaXRpemVkSHRtbCh2YWx1ZTogc3RyaW5nKTogU2FmZUh0bWwge1xuICAgIGxldCBjYWNoZWQgPSB0aGlzLmh0bWxDYWNoZS5nZXQodmFsdWUpO1xuICAgIGlmICghY2FjaGVkKSB7XG4gICAgICBjYWNoZWQgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh2YWx1ZSk7XG4gICAgICB0aGlzLmh0bWxDYWNoZS5zZXQodmFsdWUsIGNhY2hlZCk7XG4gICAgICBcbiAgICAgIC8vIFNpbXBsZSBjYWNoZSBldmljdGlvblxuICAgICAgaWYgKHRoaXMuaHRtbENhY2hlLnNpemUgPiAxMDAwKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5odG1sQ2FjaGUua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgaWYgKGZpcnN0S2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmh0bWxDYWNoZS5kZWxldGUoZmlyc3RLZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cblxuICBnZXRDZWxsVmFsdWUocm93OiBhbnksIHBhdGg/OiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghcm93IHx8ICFwYXRoKSByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICAgIGxldCBjdXJyZW50ID0gcm93O1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgcmV0dXJuIFwiXCI7XG4gICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnQgPz8gXCJcIjtcbiAgfVxuXG4gIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBjb3B5Q2VsbEpzb25QYXRoKHBhdGg6IHN0cmluZywgZXZlbnQ6IEV2ZW50LCBzb3VyY2U6IHN0cmluZyA9ICdkYlF1ZXJ5UmVzcG9uc2UnKTogdm9pZCB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChwYXRoKS50aGVuKCgpID0+IHtcbiAgICAgIC8vIENhbGwgdGhlIGhhbmRsZXIgaWYgcHJvdmlkZWRcbiAgICAgIGlmICh0aGlzLm9uSnNvblBhdGhDb3BpZWRIYW5kbGVyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5vbkpzb25QYXRoQ29waWVkSGFuZGxlcih7IHBhdGgsIHNvdXJjZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoaGFuZGxlckVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gb25Kc29uUGF0aENvcGllZEhhbmRsZXI6JywgaGFuZGxlckVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY29weSBqc29uUGF0aDonLCBlcnIpO1xuICAgICAgLy8gU3RpbGwgY2FsbCB0aGUgaGFuZGxlciBldmVuIG9uIGZhaWx1cmUgKHNpbWlsYXIgdG8gYXBpLXN0ZXAgcGF0dGVybilcbiAgICAgIGlmICh0aGlzLm9uSnNvblBhdGhDb3BpZWRIYW5kbGVyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5vbkpzb25QYXRoQ29waWVkSGFuZGxlcih7IHBhdGgsIHNvdXJjZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoaGFuZGxlckVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gb25Kc29uUGF0aENvcGllZEhhbmRsZXI6JywgaGFuZGxlckVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gQ29tcHV0ZSBncmlkLXRlbXBsYXRlLWNvbHVtbnMgc3RyaW5nIGZyb20gY29sdW1uIGNvbmZpZ1xuICBwcml2YXRlIHVwZGF0ZUdyaWRUZW1wbGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb2xzID0gdGhpcy52aXNpYmxlQ29sdW1ucztcbiAgICBpZiAoIWNvbHM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5jb21wdXRlZEdyaWRUZW1wbGF0ZSA9ICcnO1xuICAgICAgdGhpcy5jb21wdXRlZENvbHVtbldpZHRocyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBmaXhlZFB4ID0gY29scy5yZWR1Y2UoKHN1bSwgYykgPT4gc3VtICsgKGMuZml4ZWRQeCB8fCAwKSwgMCk7XG4gICAgY29uc3QgZHluYW1pY0NvbHMgPSBjb2xzLmZpbHRlcihjID0+ICFjLmZpeGVkUHgpO1xuICAgIGNvbnN0IHRvdGFsV2VpZ2h0ID0gZHluYW1pY0NvbHMucmVkdWNlKChzdW0sIGMpID0+IHN1bSArIChjLndlaWdodCB8fCAxKSwgMCkgfHwgMTtcbiAgICBcbiAgICB0aGlzLmNvbXB1dGVkQ29sdW1uV2lkdGhzID0gY29scy5tYXAoYyA9PiB7XG4gICAgICBpZiAoYy5maXhlZFB4ICYmIGMuZml4ZWRQeCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGAke2MuZml4ZWRQeH1weGA7XG4gICAgICB9XG4gICAgICBjb25zdCBzaGFyZSA9IChjLndlaWdodCB8fCAxKSAvIHRvdGFsV2VpZ2h0O1xuICAgICAgcmV0dXJuIGBjYWxjKCgxMDAlIC0gJHtmaXhlZFB4fXB4KSAqICR7c2hhcmUudG9GaXhlZCg0KX0pYDtcbiAgICB9KTtcbiAgICBcbiAgICBpZiAodGhpcy5ncmlkVGVtcGxhdGVDb2x1bW5zKSB7XG4gICAgICB0aGlzLmNvbXB1dGVkR3JpZFRlbXBsYXRlID0gdGhpcy5ncmlkVGVtcGxhdGVDb2x1bW5zO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbXB1dGVkR3JpZFRlbXBsYXRlID0gdGhpcy5jb21wdXRlZENvbHVtbldpZHRocy5qb2luKCcgJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2VsZWN0aW9uIGhlbHBlcnNcbiAgZ2V0IGFsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmRhdGEgfHwgW107XG4gICAgaWYgKCFyb3dzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiByb3dzLmV2ZXJ5KHIgPT4gISFyPy5pc1NlbGVjdGVkKTtcbiAgfVxuXG4gIGdldCBzb21lU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZGF0YSB8fCBbXTtcbiAgICBpZiAoIXJvd3MubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgYW55U2VsZWN0ZWQgPSByb3dzLnNvbWUociA9PiAhIXI/LmlzU2VsZWN0ZWQpO1xuICAgIHJldHVybiBhbnlTZWxlY3RlZCAmJiAhdGhpcy5hbGxTZWxlY3RlZDtcbiAgfVxuXG4gIG9uU2VsZWN0QWxsQ2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMudG9nZ2xlU2VsZWN0QWxsKHRhcmdldC5jaGVja2VkKTtcbiAgfVxuXG4gIG9uUm93U2VsZWN0Q2hhbmdlKGV2ZW50OiBFdmVudCwgcm93OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICByb3cuaXNTZWxlY3RlZCA9IHRhcmdldC5jaGVja2VkO1xuICB9XG5cbiAgdG9nZ2xlU2VsZWN0QWxsKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5kYXRhIHx8IFtdO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgcm93LmlzU2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IFNvcnRpbmcgc3VwcG9ydCA9PT09PVxuICBwcml2YXRlIF9zb3J0QWN0aXZlPzogc3RyaW5nO1xuICBwcml2YXRlIF9zb3J0RGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgdXBkYXRlQ29tcHV0ZWREYXRhKCk6IHZvaWQge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZGF0YSB8fCBbXTtcbiAgICBpZiAoIXRoaXMuZW5hYmxlTG9jYWxTb3J0IHx8ICF0aGlzLl9zb3J0QWN0aXZlIHx8ICF0aGlzLl9zb3J0RGlyZWN0aW9uKSB7XG4gICAgICB0aGlzLmNvbXB1dGVkRGF0YSA9IHNvdXJjZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29sID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maW5kKGMgPT4gYy5maWVsZElkID09PSB0aGlzLl9zb3J0QWN0aXZlKTtcbiAgICBpZiAoIWNvbCB8fCAhY29sLmZpZWxkVmFsdWUpIHtcbiAgICAgIHRoaXMuY29tcHV0ZWREYXRhID0gc291cmNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkaXIgPSB0aGlzLl9zb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IDEgOiAtMTtcbiAgICBjb25zdCBmaWVsZFBhdGggPSBjb2wuZmllbGRWYWx1ZTtcbiAgICBjb25zdCBvdXQgPSBbLi4uc291cmNlXTtcbiAgICBvdXQuc29ydCgoYSwgYikgPT4gZGlyICogdGhpcy5jb21wYXJlVmFsdWVzKHRoaXMuZ2V0Q2VsbFZhbHVlKGEsIGZpZWxkUGF0aCksIHRoaXMuZ2V0Q2VsbFZhbHVlKGIsIGZpZWxkUGF0aCkpKTtcbiAgICB0aGlzLmNvbXB1dGVkRGF0YSA9IG91dDtcbiAgfVxuXG4gIC8vIENvbXB1dGVkIGxvYWRpbmcgZmxhZ3MgdG8gc3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIGdldCBzaG93VGFibGVMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVGFibGVMb2FkaW5nID8/IGZhbHNlO1xuICB9XG5cbiAgZ2V0IHNob3dUYWJsZURhdGFMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVGFibGVEYXRhTG9hZGluZyA/PyBmYWxzZTtcbiAgfVxuXG4gIC8vIFRydWUgd2hlbiB0YWJsZSBoYXMgbm8gZGF0YSBhbmQgaXMgbm90IGN1cnJlbnRseSBsb2FkaW5nIOKAlCB1c2VkIHRvIHNob3cgYW4gZW1wdHkgc3RhdGVcbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYW55TG9hZGluZyA9IHRoaXMuc2hvd1RhYmxlTG9hZGluZyB8fCB0aGlzLnNob3dUYWJsZURhdGFMb2FkaW5nO1xuICAgIHJldHVybiAhYW55TG9hZGluZyAmJiAoISh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLmxlbmd0aCkgfHwgdGhpcy5kYXRhLmxlbmd0aCA9PT0gMCk7XG4gIH1cblxuICBpc1NvcnRlZEFzYyhjb2xJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRBY3RpdmUgPT09IGNvbElkICYmIHRoaXMuX3NvcnREaXJlY3Rpb24gPT09ICdhc2MnO1xuICB9XG5cbiAgaXNTb3J0ZWREZXNjKGNvbElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydEFjdGl2ZSA9PT0gY29sSWQgJiYgdGhpcy5fc29ydERpcmVjdGlvbiA9PT0gJ2Rlc2MnO1xuICB9XG5cbiAgdG9nZ2xlU29ydChjb2w6IER5bmFtaWNUYWJsZUNvbHVtbik6IHZvaWQge1xuICAgIGlmICghY29sPy5zb3J0YWJsZSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbElkID0gY29sLmZpZWxkSWQ7XG4gICAgaWYgKHRoaXMuX3NvcnRBY3RpdmUgIT09IGNvbElkKSB7XG4gICAgICB0aGlzLl9zb3J0QWN0aXZlID0gY29sSWQ7XG4gICAgICB0aGlzLl9zb3J0RGlyZWN0aW9uID0gJ2FzYyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGN5Y2xlIGFzYyAtPiBkZXNjIC0+IG51bGwgLT4gYXNjXG4gICAgICBpZiAodGhpcy5fc29ydERpcmVjdGlvbiA9PT0gJ2FzYycpIHRoaXMuX3NvcnREaXJlY3Rpb24gPSAnZGVzYyc7XG4gICAgICBlbHNlIGlmICh0aGlzLl9zb3J0RGlyZWN0aW9uID09PSAnZGVzYycpIHRoaXMuX3NvcnREaXJlY3Rpb24gPSBudWxsO1xuICAgICAgZWxzZSB0aGlzLl9zb3J0RGlyZWN0aW9uID0gJ2FzYyc7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQ29tcHV0ZWREYXRhKCk7XG4gICAgdGhpcy5zb3J0Q2hhbmdlLmVtaXQoeyBmaWVsZElkOiB0aGlzLl9zb3J0QWN0aXZlLCBmaWVsZFZhbHVlOiBjb2wuZmllbGRWYWx1ZSwgZGlyZWN0aW9uOiB0aGlzLl9zb3J0RGlyZWN0aW9uIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wYXJlVmFsdWVzKGE6IGFueSwgYjogYW55KTogbnVtYmVyIHtcbiAgICBpZiAoYSA9PSBudWxsICYmIGIgPT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgaWYgKGEgPT0gbnVsbCkgcmV0dXJuIDE7IC8vIG51bGxzIGxhc3QgaW4gYXNjIChoYW5kbGVkIGJ5IGRpciBtdWx0aXBsaWVyKVxuICAgIGlmIChiID09IG51bGwpIHJldHVybiAtMTtcblxuICAgIGNvbnN0IG51bUEgPSB0eXBlb2YgYSA9PT0gJ251bWJlcicgPyBhIDogTnVtYmVyKGEpO1xuICAgIGNvbnN0IG51bUIgPSB0eXBlb2YgYiA9PT0gJ251bWJlcicgPyBiIDogTnVtYmVyKGIpO1xuICAgIGNvbnN0IGFJc051bSA9ICFpc05hTihudW1BKSAmJiBhICE9PSAnJyAmJiBhICE9PSBudWxsICYmIGEgIT09IGZhbHNlO1xuICAgIGNvbnN0IGJJc051bSA9ICFpc05hTihudW1CKSAmJiBiICE9PSAnJyAmJiBiICE9PSBudWxsICYmIGIgIT09IGZhbHNlO1xuICAgIGlmIChhSXNOdW0gJiYgYklzTnVtKSB7XG4gICAgICBpZiAobnVtQSA8IG51bUIpIHJldHVybiAtMTtcbiAgICAgIGlmIChudW1BID4gbnVtQikgcmV0dXJuIDE7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBEYXRlIGRldGVjdGlvbjogYXR0ZW1wdCBwYXJzZSB3aGVuIGJvdGggdmFsdWVzIGFyZSBzdHJpbmdzIGFuZCBwYXJzZWFibGVcbiAgICBpZiAodHlwZW9mIGEgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBiID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdHNBID0gRGF0ZS5wYXJzZShhKTtcbiAgICAgIGNvbnN0IHRzQiA9IERhdGUucGFyc2UoYik7XG4gICAgICBpZiAoIWlzTmFOKHRzQSkgJiYgIWlzTmFOKHRzQikpIHtcbiAgICAgICAgaWYgKHRzQSA8IHRzQikgcmV0dXJuIC0xO1xuICAgICAgICBpZiAodHNBID4gdHNCKSByZXR1cm4gMTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICAvLyBsb2NhbGVDb21wYXJlLCBjYXNlLWluc2Vuc2l0aXZlXG4gICAgICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIsIHVuZGVmaW5lZCwgeyBzZW5zaXRpdml0eTogJ2Jhc2UnLCBudW1lcmljOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIHRvIHN0cmluZyBjb21wYXJpc29uXG4gICAgY29uc3Qgc2EgPSBTdHJpbmcoYSk7XG4gICAgY29uc3Qgc2IgPSBTdHJpbmcoYik7XG4gICAgcmV0dXJuIHNhLmxvY2FsZUNvbXBhcmUoc2IsIHVuZGVmaW5lZCwgeyBzZW5zaXRpdml0eTogJ2Jhc2UnLCBudW1lcmljOiB0cnVlIH0pO1xuICB9XG59XG5cblxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmVcIiBbY2xhc3MuY3FhLW1heC1oLVsxMDBweF1dPVwic2hvd1RhYmxlTG9hZGluZ1wiPlxuICAgIDxjcWEtZnVsbC10YWJsZS1sb2FkZXIgKm5nSWY9XCJzaG93VGFibGVMb2FkaW5nXCI+PC9jcWEtZnVsbC10YWJsZS1sb2FkZXI+XG4gICAgPGNxYS10YWJsZS1kYXRhLWxvYWRlciAqbmdJZj1cInNob3dUYWJsZURhdGFMb2FkaW5nXCI+PC9jcWEtdGFibGUtZGF0YS1sb2FkZXI+XG4gICAgPHRhYmxlIGNsYXNzPVwidGFibGUtaW5uZXIgY3FhLXctZnVsbCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1ncmF5LTIwMFwiIFtjbGFzcy5pcy1sb2FkaW5nXT1cInRydWVcIiAqbmdJZj1cIiFzaG93VGFibGVMb2FkaW5nXCI+XG4gICAgICA8Y29sZ3JvdXA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHdpZHRoIG9mIGNvbXB1dGVkQ29sdW1uV2lkdGhzOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIj5cbiAgICAgICAgICA8Y29sIFtzdHlsZS53aWR0aF09XCJ3aWR0aFwiIC8+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9jb2xncm91cD5cblxuICAgICAgPHRoZWFkICpuZ0lmPVwiZGF0YT8ubGVuZ3RoXCI+XG4gICAgICAgIDx0ciBjbGFzcz1cInRhYmxlLWhlYWRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIHZpc2libGVDb2x1bW5zOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIj5cbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICBjbGFzcz1cImhlYWRlci1jZWxsIGNxYS1weS1bMTMuMjVweF0gY3FhLXB4LVsxMC41cHhdIGNxYS10ZXh0LXhzIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtYmctWyNlZmYwZjddXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgICAgIGNvbC5maWVsZElkICsgJy1jZWxsJyxcbiAgICAgICAgICAgICAgICBjb2wuYWxpZ24gPT09ICdjZW50ZXInID8gJ2NxYS10ZXh0LWNlbnRlcicgOiBjb2wuYWxpZ24gPT09ICdyaWdodCcgPyAnY3FhLXRleHQtcmlnaHQnIDogJ2NxYS10ZXh0LWxlZnQnXG4gICAgICAgICAgICAgIF1cIj5cbiAgICAgICAgICAgICAgPCEtLSBCdWlsdC1pbiBzZWxlY3QtYWxsIGZvciBjaGVja2JveCBjb2x1bW4gd2hlbiBlbmFibGVkIGFuZCBubyBjdXN0b20gaGVhZGVyIHRlbXBsYXRlIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuZmllbGRJZCA9PT0gJ2NoZWNrYm94JyAmJiBlbmFibGVTZWxlY3RBbGwgJiYgIWdldEhlYWRlclRlbXBsYXRlKGNvbC5maWVsZElkKTsgZWxzZSBoZWFkZXJUcGxPckRlZmF1bHRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJjaGVja2JveFwiIGFyaWEtbGFiZWw9XCJTZWxlY3QgYWxsIHJvd3NcIiBbY2hlY2tlZF09XCJhbGxTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzb21lU2VsZWN0ZWRcIiAoY2hhbmdlKT1cIm9uU2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIiBjbGFzcz1cImhpZGRlbi1jaGVja2JveFwiIC8+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2hlY2tib3hcIiBjbGFzcz1cImN1c3RvbS1jaGVja2JveC1sYWJlbFwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2hlYWRlclRwbE9yRGVmYXVsdD5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0SGVhZGVyVGVtcGxhdGUoY29sLmZpZWxkSWQpIGFzIGhlYWRlclRwbDsgZWxzZSBkZWZhdWx0SGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyVHBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5zb3J0YWJsZTsgZWxzZSBwbGFpbkhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImhlYWRlci10ZXh0IGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtcHgtMFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNvcnQoY29sKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NvcnQgYnkgJyArIChjb2wuZmllbGROYW1lIHx8IGNvbC5maWVsZElkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEyLjNweF0gY3FhLWxlYWRpbmctWzE3LjVweF0gY3FhLXRleHQtWyMwQTBBMEFdIGNxYS1mb250LW1lZGl1bVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wuZmllbGROYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNTb3J0ZWRBc2MoY29sLmZpZWxkSWQpXCI+4payPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNTb3J0ZWREZXNjKGNvbC5maWVsZElkKVwiPuKWvDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5IZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXRleHRcIj57eyBjb2wuZmllbGROYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG5cbiAgICAgIDx0Ym9keSBjbGFzcz1cInRhYmxlLWJvZHkgY3FhLXctZnVsbFwiPlxuICAgICAgICA8dHIgY2xhc3M9XCJ0YWJsZS1yb3cgY3FhLWJnLXN1cmZhY2UtZGVmYXVsdCBob3ZlcjpjcWEtYmctc3VyZmFjZS1ob3ZlclwiICpuZ0Zvcj1cImxldCByb3cgb2YgY29tcHV0ZWREYXRhOyBsZXQgcm93SW5kZXggPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcbiAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwicm93Py5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIHZpc2libGVDb2x1bW5zOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNlbGwgY3FhLXB4LVsxMC41cHhdIGNxYS1weS1bMTFweF1cIiBcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgICAgIGNvbC5maWVsZElkICsgJy1jZWxsJyxcbiAgICAgICAgICAgICAgICBjb2wuYWxpZ24gPT09ICdjZW50ZXInID8gJ2NxYS10ZXh0LWNlbnRlcicgOiBjb2wuYWxpZ24gPT09ICdyaWdodCcgPyAnY3FhLXRleHQtcmlnaHQnIDogJ2NxYS10ZXh0LWxlZnQnLFxuICAgICAgICAgICAgICAgIGNlbGxKc29uUGF0aEdldHRlciAmJiBjb2wuZmllbGRJZCAhPT0gJ2NoZWNrYm94JyAmJiBjb2wuZmllbGRJZCAhPT0gJ2FjdGlvbnMnID8gJ2NxYS1jdXJzb3ItcG9pbnRlcicgOiAnJ1xuICAgICAgICAgICAgICBdXCJcbiAgICAgICAgICAgICAgKGRibGNsaWNrKT1cImNlbGxKc29uUGF0aEdldHRlciAmJiBjb2w/LmZpZWxkSWQgIT09ICdjaGVja2JveCcgJiYgY29sPy5maWVsZElkICE9PSAnYWN0aW9ucycgJiYgY29weUNlbGxKc29uUGF0aChjZWxsSnNvblBhdGhHZXR0ZXIocm93SW5kZXgsIGNvbD8uZmllbGRJZCwgcm93KSwgJGV2ZW50LCAnZGJRdWVyeVJlc3BvbnNlJylcIj5cbiAgICAgICAgICAgICAgPCEtLSBCdWlsdC1pbiBjaGVja2JveCBjZWxsIHdoZW4gbm8gY3VzdG9tIHRlbXBsYXRlIGlzIHByb3ZpZGVkIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmZpZWxkSWQgPT09ICdjaGVja2JveCcgJiYgIWdldENlbGxUZW1wbGF0ZShjb2wuZmllbGRJZCk7IGVsc2UgcmVndWxhckNlbGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94XCIgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgICAgICAgY29sLmFsaWduID09PSAnY2VudGVyJyA/ICdjcWEtZmxleCBjcWEtanVzdGlmeS1jZW50ZXInIDogY29sLmFsaWduID09PSAncmlnaHQnID8gJ2NxYS1mbGV4IGNxYS1qdXN0aWZ5LWVuZCcgOiAnJ1xuICAgICAgICAgICAgICAgIF1cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhpZGRlbi1jaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIidyb3ctY2hlY2tib3gtJyArIHJvd0luZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlNlbGVjdCByb3dcIlxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJyb3c/LmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uUm93U2VsZWN0Q2hhbmdlKCRldmVudCwgcm93KVwiIC8+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXN0b20tY2hlY2tib3gtbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5mb3JdPVwiJ3Jvdy1jaGVja2JveC0nICsgcm93SW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JlZ3VsYXJDZWxsPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRDZWxsVGVtcGxhdGUoY29sLmZpZWxkSWQpIGFzIGNlbGxUcGw7IGVsc2UgZGVmYXVsdENlbGxcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjZWxsVHBsOyBjb250ZXh0OiB7JGltcGxpY2l0OiByb3csIHJvdzogcm93LCB2YWx1ZTogZ2V0Q2VsbFZhbHVlKHJvdywgY29sLmZpZWxkVmFsdWUpfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENlbGw+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0UmVuZGVyZWRWYWx1ZShyb3csIGNvbCkgYXMgcmVuZGVyZWRWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDb21wb25lbnQocmVuZGVyZWRWYWx1ZSk7IGVsc2Ugbm9uQ29tcG9uZW50Q2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgXG4gICAgICAgICAgICAgICAgICAgICAgICBjcWFDZWxsQ29udGFpbmVyIFxuICAgICAgICAgICAgICAgICAgICAgICAgI2NlbGxDb250YWluZXI9XCJjcWFDZWxsQ29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRDb25maWddPVwicmVuZGVyZWRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93SW5kZXhdPVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbElkXT1cImNvbC5maWVsZElkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vbkNvbXBvbmVudENlbGw+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzSHRtbFN0cmluZyhyZW5kZXJlZFZhbHVlKTsgZWxzZSB0ZXh0Q2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS1sZWFkaW5nLVsxN3B4XVwiIFtpbm5lckhUTUxdPVwiZ2V0U2FuaXRpemVkSHRtbChyZW5kZXJlZFZhbHVlKVwiIFtuZ0NsYXNzXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5hbGlnbiA9PT0gJ2NlbnRlcicgPyAnY3FhLWZsZXggY3FhLWp1c3RpZnktY2VudGVyJyA6IGNvbC5hbGlnbiA9PT0gJ3JpZ2h0JyA/ICdjcWEtZmxleCBjcWEtanVzdGlmeS1lbmQnIDogJydcbiAgICAgICAgICAgICAgICAgICAgICBdXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0ZXh0Q2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyMzNzQxNTFdXCIgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sLmFsaWduID09PSAnY2VudGVyJyA/ICdjcWEtZmxleCBjcWEtanVzdGlmeS1jZW50ZXInIDogY29sLmFsaWduID09PSAncmlnaHQnID8gJ2NxYS1mbGV4IGNxYS1qdXN0aWZ5LWVuZCcgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgIF1cIj57eyByZW5kZXJlZFZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=