@aquera/ngx-smart-table 0.0.9-alpha → 0.0.11-alpha

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.
@@ -21,10 +21,11 @@ import * as i10 from "@angular/common";
21
21
  import * as i11 from "../../directives/st-keyboard-navigation.directive";
22
22
  import * as i12 from "../../directives/st-column-resize.directive";
23
23
  export class StTableComponent {
24
- constructor(schemaValidator, logger, virtualScrollService) {
24
+ constructor(schemaValidator, logger, virtualScrollService, elementRef) {
25
25
  this.schemaValidator = schemaValidator;
26
26
  this.logger = logger;
27
27
  this.virtualScrollService = virtualScrollService;
28
+ this.elementRef = elementRef;
28
29
  // Z-Index constants for template use
29
30
  this.ZIndex = TableZIndex;
30
31
  // DEPRECATED: Use tableConfig instead
@@ -49,6 +50,8 @@ export class StTableComponent {
49
50
  this.rowAction = new EventEmitter();
50
51
  // NEW: Validation state change output
51
52
  this.validationStateChange = new EventEmitter();
53
+ // NEW: Request to add a new row (emitted when navigating past last row with addRowOnNavigatePastEnd enabled)
54
+ this.requestAddRow = new EventEmitter();
52
55
  // NEW: Optional validation flag
53
56
  this.validateConfig = false;
54
57
  this.internalData$ = new BehaviorSubject([]);
@@ -1052,6 +1055,10 @@ export class StTableComponent {
1052
1055
  this.focusSubscription = tableState.focusedCellPosition$.subscribe(position => {
1053
1056
  this.updateCellFocusStates(position);
1054
1057
  });
1058
+ // Subscribe to request add row events (when navigating past last row)
1059
+ this.requestAddRowSubscription = tableState.requestAddRow$.subscribe(event => {
1060
+ this.requestAddRow.emit(event);
1061
+ });
1055
1062
  // Auto-focus first cell to enable keyboard navigation
1056
1063
  if (this.visibleCellGrid.length > 0 && this.visibleColumns.length > 0) {
1057
1064
  setTimeout(() => {
@@ -1094,7 +1101,17 @@ export class StTableComponent {
1094
1101
  setTimeout(() => {
1095
1102
  // Use absolute row index for virtual scroll compatibility
1096
1103
  const absoluteRowIndex = this.getAbsoluteRowIndex(rowIndex);
1097
- const tr = document.querySelector(`tr[data-row-index="${absoluteRowIndex}"]`);
1104
+ // Query within this component's host element to avoid selecting rows from other tables
1105
+ const hostElement = this.elementRef?.nativeElement;
1106
+ if (!hostElement)
1107
+ return;
1108
+ // First, ensure the table container has focus for keyboard navigation
1109
+ // The keyboard navigation directive listens on the .st-table container
1110
+ const tableContainer = hostElement.querySelector('.st-table');
1111
+ if (tableContainer && typeof tableContainer.focus === 'function') {
1112
+ tableContainer.focus({ preventScroll: true });
1113
+ }
1114
+ const tr = hostElement.querySelector(`tr[data-row-index="${absoluteRowIndex}"]`);
1098
1115
  if (tr) {
1099
1116
  const cells = tr.querySelectorAll('td:not(.settings-column):not(.row-number-cell)');
1100
1117
  const targetCell = cells[colIndex];
@@ -1134,14 +1151,18 @@ export class StTableComponent {
1134
1151
  }
1135
1152
  return;
1136
1153
  }
1137
- // Horizontal scrolling
1138
- if (cellRect.left < visibleLeft) {
1139
- // Cell is hidden behind left sticky columns
1140
- scrollContainer.scrollLeft -= (visibleLeft - cellRect.left);
1141
- }
1142
- else if (cellRect.right > visibleRight) {
1143
- // Cell is hidden behind right sticky columns
1144
- scrollContainer.scrollLeft += (cellRect.right - visibleRight);
1154
+ // Check if cell is already fully visible horizontally (no scroll needed)
1155
+ const isCellFullyVisibleHorizontally = cellRect.left >= visibleLeft && cellRect.right <= visibleRight;
1156
+ // Only scroll horizontally if cell is NOT fully visible
1157
+ if (!isCellFullyVisibleHorizontally) {
1158
+ if (cellRect.left < visibleLeft) {
1159
+ // Cell is hidden behind left sticky columns
1160
+ scrollContainer.scrollLeft -= (visibleLeft - cellRect.left);
1161
+ }
1162
+ else if (cellRect.right > visibleRight) {
1163
+ // Cell is hidden behind right sticky columns
1164
+ scrollContainer.scrollLeft += (cellRect.right - visibleRight);
1165
+ }
1145
1166
  }
1146
1167
  // Vertical scrolling
1147
1168
  if (cellRect.top < visibleTop) {
@@ -1164,10 +1185,15 @@ export class StTableComponent {
1164
1185
  this.scrollContainer = this.scrollViewport.nativeElement;
1165
1186
  return this.scrollContainer;
1166
1187
  }
1167
- // Standard mode uses .st-table container (cache it to avoid selecting wrong table repeatedly)
1168
- const tableContainer = document.querySelector('.st-table');
1169
- if (tableContainer) {
1170
- this.scrollContainer = tableContainer;
1188
+ // Standard mode uses .st-table container within THIS component's host element
1189
+ // Use elementRef to query within the component instead of document.querySelector
1190
+ // which would return the first table on the page
1191
+ const hostElement = this.elementRef?.nativeElement;
1192
+ if (hostElement) {
1193
+ const tableContainer = hostElement.querySelector('.st-table');
1194
+ if (tableContainer) {
1195
+ this.scrollContainer = tableContainer;
1196
+ }
1171
1197
  }
1172
1198
  return this.scrollContainer || null;
1173
1199
  }
@@ -1301,16 +1327,17 @@ export class StTableComponent {
1301
1327
  this.focusSubscription?.unsubscribe();
1302
1328
  this.validationSubscription?.unsubscribe();
1303
1329
  this.dataSubscription?.unsubscribe();
1330
+ this.requestAddRowSubscription?.unsubscribe();
1304
1331
  this.virtualScrollState$.complete();
1305
1332
  this.internalData$.complete();
1306
1333
  }
1307
1334
  }
1308
- StTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StTableComponent, deps: [{ token: i1.JsonSchemaValidatorService }, { token: i2.ValidationLoggerService }, { token: i3.VirtualScrollService }], target: i0.ɵɵFactoryTarget.Component });
1309
- StTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StTableComponent, selector: "st-table", inputs: { tableConfig: "tableConfig", data: "data", data$: "data$", tableState: "tableState", enableSorting: "enableSorting", enableFiltering: "enableFiltering", validateConfig: "validateConfig" }, outputs: { stateChange: "stateChange", dataChange: "dataChange", cellEdit: "cellEdit", cellSave: "cellSave", cellCancel: "cellCancel", cellChange: "cellChange", columnResized: "columnResized", columnMoved: "columnMoved", configValidationErrors: "configValidationErrors", columnAdded: "columnAdded", rowAction: "rowAction", validationStateChange: "validationStateChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "scrollViewport", first: true, predicate: ["scrollViewport"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<!-- Top pagination controls -->\n<st-pagination \n *ngIf=\"showTopPagination() && !(mergedConfig.tableSkeleton?.enabled | async)\" \n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n position=\"top\">\n</st-pagination>\n\n<div class=\"st-table\" *ngIf=\"!(mergedConfig.tableSkeleton?.enabled | async)\" \n [ngClass]=\"{\n 'virtual-scroll-enabled': isVirtualScrollEnabled(),\n 'keyboard-navigation-enabled': isKeyboardNavigationEnabled()\n }\"\n [ngStyle]=\"{\n 'max-height.px': !isVirtualScrollEnabled() ? mergedConfig.display?.maxHeight : null\n }\"\n stKeyboardNavigation\n [tableState]=\"getActiveTableState()\" \n [attr.tabindex]=\"isKeyboardNavigationEnabled() ? 0 : -1\"\n (focus)=\"onTableContainerFocus($event)\"\n [attr.title]=\"isKeyboardNavigationEnabled() ? 'Click a cell or press Tab to start keyboard navigation' : null\">\n <!-- Unified Table Actions Menu -->\n\n <!-- Virtual scroll viewport wrapper -->\n <div class=\"st-scroll-viewport\" #scrollViewport *ngIf=\"isVirtualScrollEnabled()\"\n [ngStyle]=\"{ 'height.px': getVirtualScrollViewportHeight() }\">\n\n <!-- Spacer to create scrollable area -->\n <div class=\"st-scroll-spacer\" [ngStyle]=\"{ 'height.px': virtualScrollTotalHeight$ | async }\">\n </div>\n\n <!-- Table positioner with transform (instead of tbody) -->\n <div class=\"st-table-positioner\" [ngStyle]=\"{ transform: 'translateY(' + (virtualScrollOffsetY$ | async) + 'px)' }\">\n <!-- Table with only visible rows -->\n <ng-container *ngTemplateOutlet=\"tableTemplate; context: { \n mode: 'virtual',\n theadStyle: { top: (virtualScrollOffsetYNeg$ | async) + 'px' }\n }\"></ng-container>\n </div>\n </div>\n \n <!-- Standard table (when virtual scroll disabled) -->\n <ng-container *ngIf=\"!isVirtualScrollEnabled()\">\n <ng-container *ngTemplateOutlet=\"tableTemplate; context: { \n mode: 'standard',\n theadStyle: null\n }\"></ng-container>\n </ng-container>\n\n <!-- Shared Column Menu Dropdown -->\n <st-column-menu-dropdown \n [isOpen]=\"columnMenuState.isOpen\"\n [position]=\"columnMenuState.position\"\n [context]=\"columnMenuState.context\"\n (actionClicked)=\"onColumnActionClicked($event)\"\n (closed)=\"closeColumnMenu()\">\n </st-column-menu-dropdown>\n</div>\n\n<ng-container *ngIf=\"(mergedConfig.tableSkeleton?.enabled | async)\">\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\n</ng-container>\n\n<!-- Shared Row Actions Dropdown -->\n<st-row-actions-dropdown [isOpen]=\"dropdownState.isOpen\" [position]=\"dropdownState.position\"\n [context]=\"dropdownState.context\" (actionClicked)=\"onRowActionClicked($event)\" (closed)=\"closeRowActionsDropdown()\">\n</st-row-actions-dropdown>\n\n\n<!-- Bottom pagination controls -->\n<st-pagination \n *ngIf=\"showBottomPagination() && !(mergedConfig.tableSkeleton?.enabled | async)\" \n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n position=\"bottom\">\n</st-pagination>\n\n\n <!-- ========================================== -->\n <!-- REUSABLE TABLE TEMPLATE -->\n <!-- ========================================== -->\n <ng-template #tableTemplate let-mode=\"mode\" let-theadStyle=\"theadStyle\">\n <table class=\"st-table-element\">\n <!-- TABLE HEADER -->\n <thead [ngClass]=\"{ 'sticky': mergedConfig.display?.stickyHeader }\" [ngStyle]=\"theadStyle\">\n <tr>\n <!-- Row Number Header -->\n <th *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-header header-cell sticky-left\"\n [ngStyle]=\"{\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_HEADER_CELL,\n 'width.px': 30\n }\">\n #\n </th>\n <!-- Column Headers -->\n <th \n *ngFor=\"let column of visibleColumns; let colIndex = index; let isFirst = first; let isLast = last\"\n [ngClass]=\"{\n 'header-cell': mode === 'standard',\n 'sticky-left': column.sticky === 'left',\n 'sticky-right': column.sticky === 'right',\n 'sticky-right-first': column.sticky === 'right' && isFirstStickyRight(column.key),\n 'resizable': column.resizable !== false\n }\"\n [ngStyle]=\"{\n position: column.sticky ? 'sticky' : null,\n 'left.px': column.sticky === 'left' ? (column.stickyOffset || 0) : null,\n 'right.px': column.sticky === 'right' ? (column.stickyOffset || 0) : null,\n 'z-index': column.sticky ? ZIndex.STICKY_HEADER_CELL : null,\n 'width.px': column.width\n }\">\n \n <st-header \n [column]=\"column\"\n [columnIndex]=\"colIndex\"\n [isFirstColumn]=\"isFirst\"\n [isLastColumn]=\"isLast\"\n [tableState]=\"getActiveTableState()\"\n [enableSorting]=\"mergedConfig.sorting?.enabled ?? enableSorting\"\n [enableFiltering]=\"mergedConfig.filtering?.enabled ?? enableFiltering\"\n (columnMoved)=\"onColumnMoved($event)\"\n (menuClick)=\"openColumnMenu($event, column, colIndex, isFirst, isLast)\">\n </st-header>\n\n <div \n class=\"resize-handle\" \n stColumnResize\n [column]=\"column\"\n (columnResized)=\"onColumnResized($event)\"\n *ngIf=\"column.resizable !== false\">\n </div>\n </th>\n \n <!-- Settings Column Header -->\n <th \n class=\"settings-column sticky-right\"\n [ngClass]=\"{ 'header-cell': mode === 'standard' }\"\n [ngStyle]=\"{ 'z-index': ZIndex.STICKY_HEADER_CELL }\">\n <div [ngClass]=\"{ 'flex-center': mode === 'virtual', 'header-content': mode === 'standard' }\">\n <st-table-actions \n [tableState]=\"getActiveTableState()\"\n [allowAddColumn]=\"mergedConfig.features?.columnManagement?.allowAdd || false\"\n (addColumnClicked)=\"onAddColumnClick()\">\n </st-table-actions>\n </div>\n </th>\n </tr>\n </thead>\n\n <!-- TABLE BODY -->\n <tbody>\n <!-- Virtual Scroll Rows -->\n <ng-container *ngIf=\"mode === 'virtual'\">\n <tr *ngFor=\"let row of visibleRows$ | async; let relativeIndex = index; trackBy: trackByRowIndex\"\n [attr.data-row-index]=\"getAbsoluteRowIndex(relativeIndex)\">\n <!-- Row Number Cell -->\n <td *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-cell\" \n [ngClass]=\"{ 'sticky-left': 'left' }\"\n [ngStyle]=\"{\n 'width.px': 30,\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_BODY_CELL,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\">\n {{getAbsoluteRowIndex(relativeIndex) + 1}}\n </td>\n <ng-container *ngTemplateOutlet=\"bodyCellTemplate; context: { \n row: row,\n rowIndex: getAbsoluteRowIndex(relativeIndex),\n mode: 'virtual',\n relativeIndex: relativeIndex\n }\"></ng-container>\n </tr>\n </ng-container>\n\n <!-- Standard Rows -->\n <ng-container *ngIf=\"mode === 'standard'\">\n <tr *ngFor=\"let row of visibleCellGrid; let rowIndex = index\" [attr.data-row-index]=\"rowIndex\">\n <!-- Row Number Cell -->\n <td *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-cell\" \n [ngClass]=\"{ 'sticky-left': 'left' }\"\n [ngStyle]=\"{\n 'width.px': 30,\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_BODY_CELL,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\">\n {{rowIndex + 1}}\n </td>\n <ng-container *ngTemplateOutlet=\"bodyCellTemplate; context: { \n row: row,\n rowIndex: rowIndex,\n mode: 'standard'\n }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </ng-template>\n\n <!-- ========================================== -->\n <!-- REUSABLE BODY CELL TEMPLATE -->\n <!-- ========================================== -->\n <ng-template #bodyCellTemplate let-row=\"row\" let-rowIndex=\"rowIndex\" let-mode=\"mode\" let-relativeIndex=\"relativeIndex\">\n <!-- Data Cells -->\n <td \n *ngFor=\"let cell of row; let colIndex = index\"\n [ngClass]=\"{\n 'sticky-left': visibleColumns[colIndex]?.sticky === 'left',\n 'sticky-right': visibleColumns[colIndex]?.sticky === 'right',\n 'sticky-right-first': visibleColumns[colIndex]?.sticky === 'right' && visibleColumns[colIndex]?.key && isFirstStickyRight(visibleColumns[colIndex].key),\n 'align-center': visibleColumns[colIndex]?.alignment === 'center',\n 'align-right': visibleColumns[colIndex]?.alignment === 'right',\n 'cell-focused': cell.isFocused()\n }\"\n [ngStyle]=\"{\n position: visibleColumns[colIndex]?.sticky ? 'sticky' : null,\n 'left.px': visibleColumns[colIndex]?.sticky === 'left' ? (visibleColumns[colIndex]?.stickyOffset || 0) : null,\n 'right.px': visibleColumns[colIndex]?.sticky === 'right' ? (visibleColumns[colIndex]?.stickyOffset || 0) : null,\n 'z-index': visibleColumns[colIndex]?.sticky ? ZIndex.STICKY_BODY_CELL : null,\n 'width.px': visibleColumns[colIndex]?.width,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\"\n (click)=\"isKeyboardNavigationEnabled() ? onCellClick(rowIndex, colIndex) : null\">\n \n <!-- Virtual Scroll Cell -->\n <st-cell \n *ngIf=\"mode === 'virtual'\"\n [cell]=\"cell\" \n [attr.tabindex]=\"cell.isFocused() ? 0 : -1\" \n [editMode]=\"getEditModeForCells()\"\n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n [columnIndex]=\"colIndex\"\n (cellEdit)=\"onCellEdit($event)\" \n (cellSave)=\"onCellSave($event)\"\n (cellSaveAndNavigate)=\"onCellSaveAndNavigate($event)\" \n (cellCancel)=\"onCellCancel($event)\"\n (cellChange)=\"cellChange.emit($event)\">\n </st-cell>\n\n <!-- Standard Cell -->\n <st-cell \n *ngIf=\"mode === 'standard'\"\n [cell]=\"cell\" \n [attr.tabindex]=\"cell.isFocused() ? 0 : -1\"\n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n [columnIndex]=\"colIndex\"\n (cellSave)=\"onCellSave($event)\"\n (cellChange)=\"cellChange.emit($event)\">\n </st-cell>\n </td>\n \n <!-- Row Actions Cell -->\n <td class=\"settings-column\"\n [ngClass]=\"{\n 'has-actions': hasRowActions()\n }\"\n [ngStyle]=\"{\n position: hasRowActions() ? 'sticky' : null,\n 'right.px': hasRowActions() ? 0 : null,\n 'z-index': hasRowActions() ? ZIndex.STICKY_BODY_CELL : null\n }\">\n <button \n *ngIf=\"hasRowActions()\"\n class=\"settings-trigger\"\n (click)=\"openRowActionsDropdown($event, getRowData(rowIndex), rowIndex)\"\n type=\"button\" \n aria-label=\"Row actions\">\n \u22EF\n </button>\n </td>\n </ng-template>\n\n<ng-template #skeletonLoader>\n <div class=\"list-row\" *ngIf=\"(mergedConfig.tableSkeleton?.enabled | async)\">\n <div *ngFor=\"let i of skeletonColumns\" class=\"list-content\">\n <nile-skeleton-loader variant=\"text\" width=\"90%\" height=\"18\" *ngFor=\"let j of skeletonRows\"></nile-skeleton-loader>\n </div>\n </div>\n</ng-template>", styles: [".st-table{width:100%;overflow:auto;position:relative;height:100%;max-height:30rem;border-radius:4px;border:1px solid #E6E9EB}.st-table st-table-actions{position:sticky;right:0}.st-table.keyboard-navigation-enabled{cursor:pointer}.st-table.keyboard-navigation-enabled:focus{outline:none;box-shadow:0 0 0 2px #3b82f64d}.st-table.keyboard-navigation-enabled td.cell-focused{outline:2px solid #4299e1;outline-offset:-1px;position:relative;box-shadow:0 0 0 3px #3182ce1a}.st-table.keyboard-navigation-enabled td.cell-focused:focus{outline:2px solid #4299e1;outline-offset:-1px;box-shadow:0 0 0 3px #3182ce1a}.st-table.keyboard-navigation-enabled td.cell-focused:has(.st-cell.editing){box-shadow:0 0 0 4px #2563eb26}.st-table.virtual-scroll-enabled{overflow-x:visible;margin:0;border:1px solid #E6E9EB;border-collapse:separate;border-spacing:0}.st-table.virtual-scroll-enabled .st-scroll-viewport{position:relative;overflow-y:auto;overflow-x:auto;scroll-behavior:smooth}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-scroll-spacer{position:absolute;top:0;left:0;width:1px;pointer-events:none;z-index:-1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-positioner{position:absolute;top:0;left:0;right:0;will-change:transform}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element{position:relative;width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead{background-color:#fff;border-bottom:1px solid #E6E9EB}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead.sticky{position:sticky;top:0;z-index:3;background-color:#fff;will-change:top;backface-visibility:hidden}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead.sticky:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:linear-gradient(to bottom,rgba(0,0,0,.1),transparent)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th{padding:0;vertical-align:middle;position:relative;border:none;background-color:#fff;will-change:top;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left{position:sticky;left:0;background-color:#fff;z-index:2;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)):after{content:\"\";position:absolute;right:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to left,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right{position:sticky;right:0;background-color:#fff;z-index:2;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right-first:not(.settings-column){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to right,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.settings-column{width:2rem;text-align:center;font-weight:600;font-size:12px;position:sticky;right:0;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb;z-index:2}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:4;pointer-events:auto}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:hover:after,.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:active:after{opacity:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.row-number-header{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)):after{content:\"\";position:absolute;right:-6px;top:0;bottom:-1px;width:5px;border-left:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,.08) 0%,rgba(0,0,0,0) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-6px;top:0;bottom:-1px;width:5px;border-right:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,0) 0%,rgba(0,0,0,.08) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody{will-change:transform;position:relative;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr{border-bottom:1px solid #E6E9EB;transition:background-color .15s;height:2rem;box-sizing:border-box}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr:last-child{border-bottom:none}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td{padding:0;vertical-align:middle;box-sizing:border-box;height:2rem;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb;border:none}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.align-center{text-align:center}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.align-right{text-align:right}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left{position:sticky;z-index:2;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)):after{content:\"\";position:absolute;right:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to left,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right{position:sticky;z-index:2;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right-first:not(.settings-column){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to right,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column{width:2rem;text-align:center;position:sticky;right:0;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb;z-index:2}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column .settings-trigger{background:none;border:none;font-size:1rem;line-height:1;cursor:pointer;border-radius:4px;transition:all .15s ease}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column .settings-trigger:focus{outline:2px solid #4299e1;outline-offset:2px}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.row-number-cell{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)):after{content:\"\";position:absolute;right:-6px;top:0;bottom:-1px;width:5px;border-left:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,.08) 0%,rgba(0,0,0,0) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right-first:before{content:\"\";position:absolute;left:-6px;top:0;bottom:-1px;width:5px;border-right:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,0) 0%,rgba(0,0,0,.08) 100%)}.st-table:not(.virtual-scroll-enabled) .st-table-element{width:100%;height:100%;overflow:auto;border-collapse:separate;border-spacing:0;table-layout:fixed}.st-table:not(.virtual-scroll-enabled) .st-table-element thead{background-color:#fff;border-bottom:1px solid #E6E9EB}.st-table:not(.virtual-scroll-enabled) .st-table-element thead.sticky{position:sticky;top:0;z-index:3;background-color:#fff;will-change:top;backface-visibility:hidden}.st-table:not(.virtual-scroll-enabled) .st-table-element thead.sticky:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:linear-gradient(to bottom,rgba(0,0,0,.1),transparent)}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th{padding:0;vertical-align:middle;position:relative;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb;border:none}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left{position:sticky;left:0;background-color:#fff;z-index:2;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)):after{content:\"\";position:absolute;right:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to left,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right{position:sticky;right:0;background-color:#fff;z-index:2;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right-first:not(.settings-column){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to right,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.settings-column{width:2rem;text-align:center;font-weight:600;font-size:12px;position:sticky;right:0;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb;z-index:2}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:4;pointer-events:auto}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:hover:after,.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:active:after{opacity:1}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.row-number-header{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody{will-change:transform;position:relative;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr{height:2rem;box-sizing:border-box}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr:last-child{border-bottom:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td{padding:0;vertical-align:middle;height:2rem;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb;border:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.row-number-cell{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.align-center{text-align:center}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.align-right{text-align:right}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left{position:sticky;z-index:2;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)):after{content:\"\";position:absolute;right:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to left,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right{position:sticky;z-index:2;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right-first:not(.settings-column){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to right,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.settings-column{position:sticky;right:0;width:2rem;text-align:center;border-right:none;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb;z-index:2}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.settings-column .settings-trigger{background:none;border:none;font-size:1rem;line-height:1;cursor:pointer;border-radius:4px;transition:all .15s ease}.st-table:not(.virtual-scroll-enabled) .st-table-element .header-content{display:flex;height:2rem;align-items:center}.st-table:not(.virtual-scroll-enabled) .st-table-element .header-content .table-header-text{flex-grow:1;padding-left:4px}.st-table:not(.virtual-scroll-enabled) .st-table-element .settings-column>.header-content{display:flex;align-items:center;justify-content:center}.flex-center{display:flex;align-items:center;justify-content:center}.list-row{padding:1rem}.list-row .list-content{display:flex;justify-content:space-evenly;gap:4px;margin-bottom:1rem}\n"], components: [{ type: i4.StPaginationComponent, selector: "st-pagination", inputs: ["tableState", "tableConfig", "position"] }, { type: i5.StColumnMenuDropdownComponent, selector: "st-column-menu-dropdown", inputs: ["isOpen", "position", "context"], outputs: ["actionClicked", "closed"] }, { type: i6.StRowActionsDropdownComponent, selector: "st-row-actions-dropdown", inputs: ["isOpen", "position", "context"], outputs: ["actionClicked", "closed"] }, { type: i7.StHeaderComponent, selector: "st-header", inputs: ["column", "columnIndex", "isFirstColumn", "isLastColumn", "tableState", "enableSorting", "enableFiltering"], outputs: ["sortToggle", "filterChange", "columnMoved", "menuClick"] }, { type: i8.StTableActionsComponent, selector: "st-table-actions", inputs: ["tableState", "allowAddColumn"], outputs: ["addColumnClicked"] }, { type: i9.StCellComponent, selector: "st-cell", inputs: ["cell", "editMode", "tableState", "tableConfig", "columnIndex"], outputs: ["cellChange", "cellEdit", "cellSave", "cellCancel", "cellSaveAndNavigate"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.StKeyboardNavigationDirective, selector: "[stKeyboardNavigation]", inputs: ["tableState"] }, { type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i12.StColumnResizeDirective, selector: "[stColumnResize]", inputs: ["column"], outputs: ["columnResized"] }], pipes: { "async": i10.AsyncPipe } });
1335
+ StTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StTableComponent, deps: [{ token: i1.JsonSchemaValidatorService }, { token: i2.ValidationLoggerService }, { token: i3.VirtualScrollService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1336
+ StTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StTableComponent, selector: "st-table", inputs: { tableConfig: "tableConfig", data: "data", data$: "data$", tableState: "tableState", enableSorting: "enableSorting", enableFiltering: "enableFiltering", validateConfig: "validateConfig" }, outputs: { stateChange: "stateChange", dataChange: "dataChange", cellEdit: "cellEdit", cellSave: "cellSave", cellCancel: "cellCancel", cellChange: "cellChange", columnResized: "columnResized", columnMoved: "columnMoved", configValidationErrors: "configValidationErrors", columnAdded: "columnAdded", rowAction: "rowAction", validationStateChange: "validationStateChange", requestAddRow: "requestAddRow" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "scrollViewport", first: true, predicate: ["scrollViewport"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<!-- Top pagination controls -->\n<st-pagination \n *ngIf=\"showTopPagination() && !(mergedConfig.tableSkeleton?.enabled | async)\" \n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n position=\"top\">\n</st-pagination>\n\n<div class=\"st-table\" *ngIf=\"!(mergedConfig.tableSkeleton?.enabled | async)\" \n [ngClass]=\"{\n 'virtual-scroll-enabled': isVirtualScrollEnabled(),\n 'keyboard-navigation-enabled': isKeyboardNavigationEnabled()\n }\"\n [ngStyle]=\"{\n 'max-height.px': !isVirtualScrollEnabled() ? mergedConfig.display?.maxHeight : null\n }\"\n stKeyboardNavigation\n [tableState]=\"getActiveTableState()\"\n [addRowOnNavigatePastEnd]=\"mergedConfig.features?.keyboardNavigation?.addRowOnNavigatePastEnd || false\"\n [attr.tabindex]=\"isKeyboardNavigationEnabled() ? 0 : -1\"\n (focus)=\"onTableContainerFocus($event)\"\n [attr.title]=\"isKeyboardNavigationEnabled() ? 'Click a cell or press Tab to start keyboard navigation' : null\">\n <!-- Unified Table Actions Menu -->\n\n <!-- Virtual scroll viewport wrapper -->\n <div class=\"st-scroll-viewport\" #scrollViewport *ngIf=\"isVirtualScrollEnabled()\"\n [ngStyle]=\"{ 'height.px': getVirtualScrollViewportHeight() }\">\n\n <!-- Spacer to create scrollable area -->\n <div class=\"st-scroll-spacer\" [ngStyle]=\"{ 'height.px': virtualScrollTotalHeight$ | async }\">\n </div>\n\n <!-- Table positioner with transform (instead of tbody) -->\n <div class=\"st-table-positioner\" [ngStyle]=\"{ transform: 'translateY(' + (virtualScrollOffsetY$ | async) + 'px)' }\">\n <!-- Table with only visible rows -->\n <ng-container *ngTemplateOutlet=\"tableTemplate; context: { \n mode: 'virtual',\n theadStyle: { top: (virtualScrollOffsetYNeg$ | async) + 'px' }\n }\"></ng-container>\n </div>\n </div>\n \n <!-- Standard table (when virtual scroll disabled) -->\n <ng-container *ngIf=\"!isVirtualScrollEnabled()\">\n <ng-container *ngTemplateOutlet=\"tableTemplate; context: { \n mode: 'standard',\n theadStyle: null\n }\"></ng-container>\n </ng-container>\n\n <!-- Shared Column Menu Dropdown -->\n <st-column-menu-dropdown \n [isOpen]=\"columnMenuState.isOpen\"\n [position]=\"columnMenuState.position\"\n [context]=\"columnMenuState.context\"\n (actionClicked)=\"onColumnActionClicked($event)\"\n (closed)=\"closeColumnMenu()\">\n </st-column-menu-dropdown>\n</div>\n\n<ng-container *ngIf=\"(mergedConfig.tableSkeleton?.enabled | async)\">\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\n</ng-container>\n\n<!-- Shared Row Actions Dropdown -->\n<st-row-actions-dropdown [isOpen]=\"dropdownState.isOpen\" [position]=\"dropdownState.position\"\n [context]=\"dropdownState.context\" (actionClicked)=\"onRowActionClicked($event)\" (closed)=\"closeRowActionsDropdown()\">\n</st-row-actions-dropdown>\n\n\n<!-- Bottom pagination controls -->\n<st-pagination \n *ngIf=\"showBottomPagination() && !(mergedConfig.tableSkeleton?.enabled | async)\" \n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n position=\"bottom\">\n</st-pagination>\n\n\n <!-- ========================================== -->\n <!-- REUSABLE TABLE TEMPLATE -->\n <!-- ========================================== -->\n <ng-template #tableTemplate let-mode=\"mode\" let-theadStyle=\"theadStyle\">\n <table class=\"st-table-element\">\n <!-- TABLE HEADER -->\n <thead [ngClass]=\"{ 'sticky': mergedConfig.display?.stickyHeader }\" [ngStyle]=\"theadStyle\">\n <tr>\n <!-- Row Number Header -->\n <th *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-header header-cell sticky-left\"\n [ngStyle]=\"{\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_HEADER_CELL,\n 'width.px': 30\n }\">\n #\n </th>\n <!-- Column Headers -->\n <th \n *ngFor=\"let column of visibleColumns; let colIndex = index; let isFirst = first; let isLast = last\"\n [ngClass]=\"{\n 'header-cell': mode === 'standard',\n 'sticky-left': column.sticky === 'left',\n 'sticky-right': column.sticky === 'right',\n 'sticky-right-first': column.sticky === 'right' && isFirstStickyRight(column.key),\n 'resizable': column.resizable !== false\n }\"\n [ngStyle]=\"{\n position: column.sticky ? 'sticky' : null,\n 'left.px': column.sticky === 'left' ? (column.stickyOffset || 0) : null,\n 'right.px': column.sticky === 'right' ? (column.stickyOffset || 0) : null,\n 'z-index': column.sticky ? ZIndex.STICKY_HEADER_CELL : null,\n 'width.px': column.width\n }\">\n \n <st-header \n [column]=\"column\"\n [columnIndex]=\"colIndex\"\n [isFirstColumn]=\"isFirst\"\n [isLastColumn]=\"isLast\"\n [tableState]=\"getActiveTableState()\"\n [enableSorting]=\"mergedConfig.sorting?.enabled ?? enableSorting\"\n [enableFiltering]=\"mergedConfig.filtering?.enabled ?? enableFiltering\"\n (columnMoved)=\"onColumnMoved($event)\"\n (menuClick)=\"openColumnMenu($event, column, colIndex, isFirst, isLast)\">\n </st-header>\n\n <div \n class=\"resize-handle\" \n stColumnResize\n [column]=\"column\"\n (columnResized)=\"onColumnResized($event)\"\n *ngIf=\"column.resizable !== false\">\n </div>\n </th>\n \n <!-- Settings Column Header -->\n <th \n class=\"settings-column sticky-right\"\n [ngClass]=\"{ 'header-cell': mode === 'standard' }\"\n [ngStyle]=\"{ 'z-index': ZIndex.STICKY_HEADER_CELL }\">\n <div [ngClass]=\"{ 'flex-center': mode === 'virtual', 'header-content': mode === 'standard' }\">\n <st-table-actions \n [tableState]=\"getActiveTableState()\"\n [allowAddColumn]=\"mergedConfig.features?.columnManagement?.allowAdd || false\"\n (addColumnClicked)=\"onAddColumnClick()\">\n </st-table-actions>\n </div>\n </th>\n </tr>\n </thead>\n\n <!-- TABLE BODY -->\n <tbody>\n <!-- Virtual Scroll Rows -->\n <ng-container *ngIf=\"mode === 'virtual'\">\n <tr *ngFor=\"let row of visibleRows$ | async; let relativeIndex = index; trackBy: trackByRowIndex\"\n [attr.data-row-index]=\"getAbsoluteRowIndex(relativeIndex)\">\n <!-- Row Number Cell -->\n <td *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-cell\" \n [ngClass]=\"{ 'sticky-left': 'left' }\"\n [ngStyle]=\"{\n 'width.px': 30,\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_BODY_CELL,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\">\n {{getAbsoluteRowIndex(relativeIndex) + 1}}\n </td>\n <ng-container *ngTemplateOutlet=\"bodyCellTemplate; context: { \n row: row,\n rowIndex: getAbsoluteRowIndex(relativeIndex),\n mode: 'virtual',\n relativeIndex: relativeIndex\n }\"></ng-container>\n </tr>\n </ng-container>\n\n <!-- Standard Rows -->\n <ng-container *ngIf=\"mode === 'standard'\">\n <tr *ngFor=\"let row of visibleCellGrid; let rowIndex = index\" [attr.data-row-index]=\"rowIndex\">\n <!-- Row Number Cell -->\n <td *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-cell\" \n [ngClass]=\"{ 'sticky-left': 'left' }\"\n [ngStyle]=\"{\n 'width.px': 30,\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_BODY_CELL,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\">\n {{rowIndex + 1}}\n </td>\n <ng-container *ngTemplateOutlet=\"bodyCellTemplate; context: { \n row: row,\n rowIndex: rowIndex,\n mode: 'standard'\n }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </ng-template>\n\n <!-- ========================================== -->\n <!-- REUSABLE BODY CELL TEMPLATE -->\n <!-- ========================================== -->\n <ng-template #bodyCellTemplate let-row=\"row\" let-rowIndex=\"rowIndex\" let-mode=\"mode\" let-relativeIndex=\"relativeIndex\">\n <!-- Data Cells -->\n <td \n *ngFor=\"let cell of row; let colIndex = index\"\n [ngClass]=\"{\n 'sticky-left': visibleColumns[colIndex]?.sticky === 'left',\n 'sticky-right': visibleColumns[colIndex]?.sticky === 'right',\n 'sticky-right-first': visibleColumns[colIndex]?.sticky === 'right' && visibleColumns[colIndex]?.key && isFirstStickyRight(visibleColumns[colIndex].key),\n 'align-center': visibleColumns[colIndex]?.alignment === 'center',\n 'align-right': visibleColumns[colIndex]?.alignment === 'right',\n 'cell-focused': cell.isFocused()\n }\"\n [ngStyle]=\"{\n position: visibleColumns[colIndex]?.sticky ? 'sticky' : null,\n 'left.px': visibleColumns[colIndex]?.sticky === 'left' ? (visibleColumns[colIndex]?.stickyOffset || 0) : null,\n 'right.px': visibleColumns[colIndex]?.sticky === 'right' ? (visibleColumns[colIndex]?.stickyOffset || 0) : null,\n 'z-index': visibleColumns[colIndex]?.sticky ? ZIndex.STICKY_BODY_CELL : null,\n 'width.px': visibleColumns[colIndex]?.width,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\"\n (click)=\"isKeyboardNavigationEnabled() ? onCellClick(rowIndex, colIndex) : null\">\n \n <!-- Virtual Scroll Cell -->\n <st-cell \n *ngIf=\"mode === 'virtual'\"\n [cell]=\"cell\" \n [attr.tabindex]=\"cell.isFocused() ? 0 : -1\" \n [editMode]=\"getEditModeForCells()\"\n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n [columnIndex]=\"colIndex\"\n (cellEdit)=\"onCellEdit($event)\" \n (cellSave)=\"onCellSave($event)\"\n (cellSaveAndNavigate)=\"onCellSaveAndNavigate($event)\" \n (cellCancel)=\"onCellCancel($event)\"\n (cellChange)=\"cellChange.emit($event)\">\n </st-cell>\n\n <!-- Standard Cell -->\n <st-cell \n *ngIf=\"mode === 'standard'\"\n [cell]=\"cell\" \n [attr.tabindex]=\"cell.isFocused() ? 0 : -1\"\n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n [columnIndex]=\"colIndex\"\n (cellSave)=\"onCellSave($event)\"\n (cellChange)=\"cellChange.emit($event)\">\n </st-cell>\n </td>\n \n <!-- Row Actions Cell -->\n <td class=\"settings-column\"\n [ngClass]=\"{\n 'has-actions': hasRowActions()\n }\"\n [ngStyle]=\"{\n position: hasRowActions() ? 'sticky' : null,\n 'right.px': hasRowActions() ? 0 : null,\n 'z-index': hasRowActions() ? ZIndex.STICKY_BODY_CELL : null\n }\">\n <button \n *ngIf=\"hasRowActions()\"\n class=\"settings-trigger\"\n (click)=\"openRowActionsDropdown($event, getRowData(rowIndex), rowIndex)\"\n type=\"button\" \n aria-label=\"Row actions\">\n \u22EF\n </button>\n </td>\n </ng-template>\n\n<ng-template #skeletonLoader>\n <div class=\"list-row\" *ngIf=\"(mergedConfig.tableSkeleton?.enabled | async)\">\n <div *ngFor=\"let i of skeletonColumns\" class=\"list-content\">\n <nile-skeleton-loader variant=\"text\" width=\"90%\" height=\"18\" *ngFor=\"let j of skeletonRows\"></nile-skeleton-loader>\n </div>\n </div>\n</ng-template>", styles: [".st-table{width:100%;overflow:auto;position:relative;height:100%;max-height:30rem;border-radius:4px;border:1px solid #E6E9EB}.st-table st-table-actions{position:sticky;right:0}.st-table.keyboard-navigation-enabled{cursor:pointer}.st-table.keyboard-navigation-enabled:focus{outline:none;box-shadow:0 0 0 2px #3b82f64d}.st-table.keyboard-navigation-enabled td.cell-focused{outline:2px solid #4299e1;outline-offset:-1px;position:relative;box-shadow:0 0 0 3px #3182ce1a}.st-table.keyboard-navigation-enabled td.cell-focused:focus{outline:2px solid #4299e1;outline-offset:-1px;box-shadow:0 0 0 3px #3182ce1a}.st-table.keyboard-navigation-enabled td.cell-focused:has(.st-cell.editing){box-shadow:0 0 0 4px #2563eb26}.st-table.virtual-scroll-enabled{overflow-x:visible;margin:0;border:1px solid #E6E9EB;border-collapse:separate;border-spacing:0}.st-table.virtual-scroll-enabled .st-scroll-viewport{position:relative;overflow-y:auto;overflow-x:auto;scroll-behavior:smooth}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-scroll-spacer{position:absolute;top:0;left:0;width:1px;pointer-events:none;z-index:-1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-positioner{position:absolute;top:0;left:0;right:0;will-change:transform}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element{position:relative;width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead{background-color:#fff;border-bottom:1px solid #E6E9EB}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead.sticky{position:sticky;top:0;z-index:3;background-color:#fff;will-change:top;backface-visibility:hidden}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead.sticky:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:linear-gradient(to bottom,rgba(0,0,0,.1),transparent)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th{padding:0;vertical-align:middle;position:relative;border:none;background-color:#fff;will-change:top;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left{position:sticky;left:0;background-color:#fff;z-index:2;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)):after{content:\"\";position:absolute;right:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to left,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right{position:sticky;right:0;background-color:#fff;z-index:2;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right-first:not(.settings-column){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to right,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.settings-column{width:2rem;text-align:center;font-weight:600;font-size:12px;position:sticky;right:0;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb;z-index:2}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:4;pointer-events:auto}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:hover:after,.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:active:after{opacity:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.row-number-header{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)):after{content:\"\";position:absolute;right:-6px;top:0;bottom:-1px;width:5px;border-left:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,.08) 0%,rgba(0,0,0,0) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-6px;top:0;bottom:-1px;width:5px;border-right:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,0) 0%,rgba(0,0,0,.08) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody{will-change:transform;position:relative;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr{border-bottom:1px solid #E6E9EB;transition:background-color .15s;height:2rem;box-sizing:border-box}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr:last-child{border-bottom:none}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td{padding:0;vertical-align:middle;box-sizing:border-box;height:2rem;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb;border:none}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.align-center{text-align:center}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.align-right{text-align:right}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left{position:sticky;z-index:2;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)):after{content:\"\";position:absolute;right:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to left,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right{position:sticky;z-index:2;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right-first:not(.settings-column){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to right,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column{width:2rem;text-align:center;position:sticky;right:0;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb;z-index:2}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column .settings-trigger{background:none;border:none;font-size:1rem;line-height:1;cursor:pointer;border-radius:4px;transition:all .15s ease}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column .settings-trigger:focus{outline:2px solid #4299e1;outline-offset:2px}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.row-number-cell{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)):after{content:\"\";position:absolute;right:-6px;top:0;bottom:-1px;width:5px;border-left:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,.08) 0%,rgba(0,0,0,0) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right-first:before{content:\"\";position:absolute;left:-6px;top:0;bottom:-1px;width:5px;border-right:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,0) 0%,rgba(0,0,0,.08) 100%)}.st-table:not(.virtual-scroll-enabled) .st-table-element{width:100%;height:100%;overflow:auto;border-collapse:separate;border-spacing:0;table-layout:fixed}.st-table:not(.virtual-scroll-enabled) .st-table-element thead{background-color:#fff;border-bottom:1px solid #E6E9EB}.st-table:not(.virtual-scroll-enabled) .st-table-element thead.sticky{position:sticky;top:0;z-index:3;background-color:#fff;will-change:top;backface-visibility:hidden}.st-table:not(.virtual-scroll-enabled) .st-table-element thead.sticky:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:linear-gradient(to bottom,rgba(0,0,0,.1),transparent)}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th{padding:0;vertical-align:middle;position:relative;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb;border:none}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left{position:sticky;left:0;background-color:#fff;z-index:2;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)):after{content:\"\";position:absolute;right:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to left,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right{position:sticky;right:0;background-color:#fff;z-index:2;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right-first:not(.settings-column){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to right,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.settings-column{width:2rem;text-align:center;font-weight:600;font-size:12px;position:sticky;right:0;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb;z-index:2}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:4;pointer-events:auto}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:hover:after,.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:active:after{opacity:1}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.row-number-header{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody{will-change:transform;position:relative;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr{height:2rem;box-sizing:border-box}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr:last-child{border-bottom:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td{padding:0;vertical-align:middle;height:2rem;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb;border:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.row-number-cell{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.align-center{text-align:center}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.align-right{text-align:right}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left{position:sticky;z-index:2;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)):after{content:\"\";position:absolute;right:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to left,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right{position:sticky;z-index:2;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right-first:not(.settings-column){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to right,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.settings-column{position:sticky;right:0;width:2rem;text-align:center;border-right:none;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb;z-index:2}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.settings-column .settings-trigger{background:none;border:none;font-size:1rem;line-height:1;cursor:pointer;border-radius:4px;transition:all .15s ease}.st-table:not(.virtual-scroll-enabled) .st-table-element .header-content{display:flex;height:2rem;align-items:center}.st-table:not(.virtual-scroll-enabled) .st-table-element .header-content .table-header-text{flex-grow:1;padding-left:4px}.st-table:not(.virtual-scroll-enabled) .st-table-element .settings-column>.header-content{display:flex;align-items:center;justify-content:center}.flex-center{display:flex;align-items:center;justify-content:center}.list-row{padding:1rem}.list-row .list-content{display:flex;justify-content:space-evenly;gap:4px;margin-bottom:1rem}\n"], components: [{ type: i4.StPaginationComponent, selector: "st-pagination", inputs: ["tableState", "tableConfig", "position"] }, { type: i5.StColumnMenuDropdownComponent, selector: "st-column-menu-dropdown", inputs: ["isOpen", "position", "context"], outputs: ["actionClicked", "closed"] }, { type: i6.StRowActionsDropdownComponent, selector: "st-row-actions-dropdown", inputs: ["isOpen", "position", "context"], outputs: ["actionClicked", "closed"] }, { type: i7.StHeaderComponent, selector: "st-header", inputs: ["column", "columnIndex", "isFirstColumn", "isLastColumn", "tableState", "enableSorting", "enableFiltering"], outputs: ["sortToggle", "filterChange", "columnMoved", "menuClick"] }, { type: i8.StTableActionsComponent, selector: "st-table-actions", inputs: ["tableState", "allowAddColumn"], outputs: ["addColumnClicked"] }, { type: i9.StCellComponent, selector: "st-cell", inputs: ["cell", "editMode", "tableState", "tableConfig", "columnIndex"], outputs: ["cellChange", "cellEdit", "cellSave", "cellCancel", "cellSaveAndNavigate"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.StKeyboardNavigationDirective, selector: "[stKeyboardNavigation]", inputs: ["tableState", "addRowOnNavigatePastEnd"] }, { type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i12.StColumnResizeDirective, selector: "[stColumnResize]", inputs: ["column"], outputs: ["columnResized"] }], pipes: { "async": i10.AsyncPipe } });
1310
1337
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StTableComponent, decorators: [{
1311
1338
  type: Component,
1312
- args: [{ selector: 'st-table', template: "<!-- Top pagination controls -->\n<st-pagination \n *ngIf=\"showTopPagination() && !(mergedConfig.tableSkeleton?.enabled | async)\" \n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n position=\"top\">\n</st-pagination>\n\n<div class=\"st-table\" *ngIf=\"!(mergedConfig.tableSkeleton?.enabled | async)\" \n [ngClass]=\"{\n 'virtual-scroll-enabled': isVirtualScrollEnabled(),\n 'keyboard-navigation-enabled': isKeyboardNavigationEnabled()\n }\"\n [ngStyle]=\"{\n 'max-height.px': !isVirtualScrollEnabled() ? mergedConfig.display?.maxHeight : null\n }\"\n stKeyboardNavigation\n [tableState]=\"getActiveTableState()\" \n [attr.tabindex]=\"isKeyboardNavigationEnabled() ? 0 : -1\"\n (focus)=\"onTableContainerFocus($event)\"\n [attr.title]=\"isKeyboardNavigationEnabled() ? 'Click a cell or press Tab to start keyboard navigation' : null\">\n <!-- Unified Table Actions Menu -->\n\n <!-- Virtual scroll viewport wrapper -->\n <div class=\"st-scroll-viewport\" #scrollViewport *ngIf=\"isVirtualScrollEnabled()\"\n [ngStyle]=\"{ 'height.px': getVirtualScrollViewportHeight() }\">\n\n <!-- Spacer to create scrollable area -->\n <div class=\"st-scroll-spacer\" [ngStyle]=\"{ 'height.px': virtualScrollTotalHeight$ | async }\">\n </div>\n\n <!-- Table positioner with transform (instead of tbody) -->\n <div class=\"st-table-positioner\" [ngStyle]=\"{ transform: 'translateY(' + (virtualScrollOffsetY$ | async) + 'px)' }\">\n <!-- Table with only visible rows -->\n <ng-container *ngTemplateOutlet=\"tableTemplate; context: { \n mode: 'virtual',\n theadStyle: { top: (virtualScrollOffsetYNeg$ | async) + 'px' }\n }\"></ng-container>\n </div>\n </div>\n \n <!-- Standard table (when virtual scroll disabled) -->\n <ng-container *ngIf=\"!isVirtualScrollEnabled()\">\n <ng-container *ngTemplateOutlet=\"tableTemplate; context: { \n mode: 'standard',\n theadStyle: null\n }\"></ng-container>\n </ng-container>\n\n <!-- Shared Column Menu Dropdown -->\n <st-column-menu-dropdown \n [isOpen]=\"columnMenuState.isOpen\"\n [position]=\"columnMenuState.position\"\n [context]=\"columnMenuState.context\"\n (actionClicked)=\"onColumnActionClicked($event)\"\n (closed)=\"closeColumnMenu()\">\n </st-column-menu-dropdown>\n</div>\n\n<ng-container *ngIf=\"(mergedConfig.tableSkeleton?.enabled | async)\">\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\n</ng-container>\n\n<!-- Shared Row Actions Dropdown -->\n<st-row-actions-dropdown [isOpen]=\"dropdownState.isOpen\" [position]=\"dropdownState.position\"\n [context]=\"dropdownState.context\" (actionClicked)=\"onRowActionClicked($event)\" (closed)=\"closeRowActionsDropdown()\">\n</st-row-actions-dropdown>\n\n\n<!-- Bottom pagination controls -->\n<st-pagination \n *ngIf=\"showBottomPagination() && !(mergedConfig.tableSkeleton?.enabled | async)\" \n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n position=\"bottom\">\n</st-pagination>\n\n\n <!-- ========================================== -->\n <!-- REUSABLE TABLE TEMPLATE -->\n <!-- ========================================== -->\n <ng-template #tableTemplate let-mode=\"mode\" let-theadStyle=\"theadStyle\">\n <table class=\"st-table-element\">\n <!-- TABLE HEADER -->\n <thead [ngClass]=\"{ 'sticky': mergedConfig.display?.stickyHeader }\" [ngStyle]=\"theadStyle\">\n <tr>\n <!-- Row Number Header -->\n <th *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-header header-cell sticky-left\"\n [ngStyle]=\"{\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_HEADER_CELL,\n 'width.px': 30\n }\">\n #\n </th>\n <!-- Column Headers -->\n <th \n *ngFor=\"let column of visibleColumns; let colIndex = index; let isFirst = first; let isLast = last\"\n [ngClass]=\"{\n 'header-cell': mode === 'standard',\n 'sticky-left': column.sticky === 'left',\n 'sticky-right': column.sticky === 'right',\n 'sticky-right-first': column.sticky === 'right' && isFirstStickyRight(column.key),\n 'resizable': column.resizable !== false\n }\"\n [ngStyle]=\"{\n position: column.sticky ? 'sticky' : null,\n 'left.px': column.sticky === 'left' ? (column.stickyOffset || 0) : null,\n 'right.px': column.sticky === 'right' ? (column.stickyOffset || 0) : null,\n 'z-index': column.sticky ? ZIndex.STICKY_HEADER_CELL : null,\n 'width.px': column.width\n }\">\n \n <st-header \n [column]=\"column\"\n [columnIndex]=\"colIndex\"\n [isFirstColumn]=\"isFirst\"\n [isLastColumn]=\"isLast\"\n [tableState]=\"getActiveTableState()\"\n [enableSorting]=\"mergedConfig.sorting?.enabled ?? enableSorting\"\n [enableFiltering]=\"mergedConfig.filtering?.enabled ?? enableFiltering\"\n (columnMoved)=\"onColumnMoved($event)\"\n (menuClick)=\"openColumnMenu($event, column, colIndex, isFirst, isLast)\">\n </st-header>\n\n <div \n class=\"resize-handle\" \n stColumnResize\n [column]=\"column\"\n (columnResized)=\"onColumnResized($event)\"\n *ngIf=\"column.resizable !== false\">\n </div>\n </th>\n \n <!-- Settings Column Header -->\n <th \n class=\"settings-column sticky-right\"\n [ngClass]=\"{ 'header-cell': mode === 'standard' }\"\n [ngStyle]=\"{ 'z-index': ZIndex.STICKY_HEADER_CELL }\">\n <div [ngClass]=\"{ 'flex-center': mode === 'virtual', 'header-content': mode === 'standard' }\">\n <st-table-actions \n [tableState]=\"getActiveTableState()\"\n [allowAddColumn]=\"mergedConfig.features?.columnManagement?.allowAdd || false\"\n (addColumnClicked)=\"onAddColumnClick()\">\n </st-table-actions>\n </div>\n </th>\n </tr>\n </thead>\n\n <!-- TABLE BODY -->\n <tbody>\n <!-- Virtual Scroll Rows -->\n <ng-container *ngIf=\"mode === 'virtual'\">\n <tr *ngFor=\"let row of visibleRows$ | async; let relativeIndex = index; trackBy: trackByRowIndex\"\n [attr.data-row-index]=\"getAbsoluteRowIndex(relativeIndex)\">\n <!-- Row Number Cell -->\n <td *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-cell\" \n [ngClass]=\"{ 'sticky-left': 'left' }\"\n [ngStyle]=\"{\n 'width.px': 30,\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_BODY_CELL,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\">\n {{getAbsoluteRowIndex(relativeIndex) + 1}}\n </td>\n <ng-container *ngTemplateOutlet=\"bodyCellTemplate; context: { \n row: row,\n rowIndex: getAbsoluteRowIndex(relativeIndex),\n mode: 'virtual',\n relativeIndex: relativeIndex\n }\"></ng-container>\n </tr>\n </ng-container>\n\n <!-- Standard Rows -->\n <ng-container *ngIf=\"mode === 'standard'\">\n <tr *ngFor=\"let row of visibleCellGrid; let rowIndex = index\" [attr.data-row-index]=\"rowIndex\">\n <!-- Row Number Cell -->\n <td *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-cell\" \n [ngClass]=\"{ 'sticky-left': 'left' }\"\n [ngStyle]=\"{\n 'width.px': 30,\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_BODY_CELL,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\">\n {{rowIndex + 1}}\n </td>\n <ng-container *ngTemplateOutlet=\"bodyCellTemplate; context: { \n row: row,\n rowIndex: rowIndex,\n mode: 'standard'\n }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </ng-template>\n\n <!-- ========================================== -->\n <!-- REUSABLE BODY CELL TEMPLATE -->\n <!-- ========================================== -->\n <ng-template #bodyCellTemplate let-row=\"row\" let-rowIndex=\"rowIndex\" let-mode=\"mode\" let-relativeIndex=\"relativeIndex\">\n <!-- Data Cells -->\n <td \n *ngFor=\"let cell of row; let colIndex = index\"\n [ngClass]=\"{\n 'sticky-left': visibleColumns[colIndex]?.sticky === 'left',\n 'sticky-right': visibleColumns[colIndex]?.sticky === 'right',\n 'sticky-right-first': visibleColumns[colIndex]?.sticky === 'right' && visibleColumns[colIndex]?.key && isFirstStickyRight(visibleColumns[colIndex].key),\n 'align-center': visibleColumns[colIndex]?.alignment === 'center',\n 'align-right': visibleColumns[colIndex]?.alignment === 'right',\n 'cell-focused': cell.isFocused()\n }\"\n [ngStyle]=\"{\n position: visibleColumns[colIndex]?.sticky ? 'sticky' : null,\n 'left.px': visibleColumns[colIndex]?.sticky === 'left' ? (visibleColumns[colIndex]?.stickyOffset || 0) : null,\n 'right.px': visibleColumns[colIndex]?.sticky === 'right' ? (visibleColumns[colIndex]?.stickyOffset || 0) : null,\n 'z-index': visibleColumns[colIndex]?.sticky ? ZIndex.STICKY_BODY_CELL : null,\n 'width.px': visibleColumns[colIndex]?.width,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\"\n (click)=\"isKeyboardNavigationEnabled() ? onCellClick(rowIndex, colIndex) : null\">\n \n <!-- Virtual Scroll Cell -->\n <st-cell \n *ngIf=\"mode === 'virtual'\"\n [cell]=\"cell\" \n [attr.tabindex]=\"cell.isFocused() ? 0 : -1\" \n [editMode]=\"getEditModeForCells()\"\n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n [columnIndex]=\"colIndex\"\n (cellEdit)=\"onCellEdit($event)\" \n (cellSave)=\"onCellSave($event)\"\n (cellSaveAndNavigate)=\"onCellSaveAndNavigate($event)\" \n (cellCancel)=\"onCellCancel($event)\"\n (cellChange)=\"cellChange.emit($event)\">\n </st-cell>\n\n <!-- Standard Cell -->\n <st-cell \n *ngIf=\"mode === 'standard'\"\n [cell]=\"cell\" \n [attr.tabindex]=\"cell.isFocused() ? 0 : -1\"\n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n [columnIndex]=\"colIndex\"\n (cellSave)=\"onCellSave($event)\"\n (cellChange)=\"cellChange.emit($event)\">\n </st-cell>\n </td>\n \n <!-- Row Actions Cell -->\n <td class=\"settings-column\"\n [ngClass]=\"{\n 'has-actions': hasRowActions()\n }\"\n [ngStyle]=\"{\n position: hasRowActions() ? 'sticky' : null,\n 'right.px': hasRowActions() ? 0 : null,\n 'z-index': hasRowActions() ? ZIndex.STICKY_BODY_CELL : null\n }\">\n <button \n *ngIf=\"hasRowActions()\"\n class=\"settings-trigger\"\n (click)=\"openRowActionsDropdown($event, getRowData(rowIndex), rowIndex)\"\n type=\"button\" \n aria-label=\"Row actions\">\n \u22EF\n </button>\n </td>\n </ng-template>\n\n<ng-template #skeletonLoader>\n <div class=\"list-row\" *ngIf=\"(mergedConfig.tableSkeleton?.enabled | async)\">\n <div *ngFor=\"let i of skeletonColumns\" class=\"list-content\">\n <nile-skeleton-loader variant=\"text\" width=\"90%\" height=\"18\" *ngFor=\"let j of skeletonRows\"></nile-skeleton-loader>\n </div>\n </div>\n</ng-template>", styles: [".st-table{width:100%;overflow:auto;position:relative;height:100%;max-height:30rem;border-radius:4px;border:1px solid #E6E9EB}.st-table st-table-actions{position:sticky;right:0}.st-table.keyboard-navigation-enabled{cursor:pointer}.st-table.keyboard-navigation-enabled:focus{outline:none;box-shadow:0 0 0 2px #3b82f64d}.st-table.keyboard-navigation-enabled td.cell-focused{outline:2px solid #4299e1;outline-offset:-1px;position:relative;box-shadow:0 0 0 3px #3182ce1a}.st-table.keyboard-navigation-enabled td.cell-focused:focus{outline:2px solid #4299e1;outline-offset:-1px;box-shadow:0 0 0 3px #3182ce1a}.st-table.keyboard-navigation-enabled td.cell-focused:has(.st-cell.editing){box-shadow:0 0 0 4px #2563eb26}.st-table.virtual-scroll-enabled{overflow-x:visible;margin:0;border:1px solid #E6E9EB;border-collapse:separate;border-spacing:0}.st-table.virtual-scroll-enabled .st-scroll-viewport{position:relative;overflow-y:auto;overflow-x:auto;scroll-behavior:smooth}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-scroll-spacer{position:absolute;top:0;left:0;width:1px;pointer-events:none;z-index:-1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-positioner{position:absolute;top:0;left:0;right:0;will-change:transform}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element{position:relative;width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead{background-color:#fff;border-bottom:1px solid #E6E9EB}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead.sticky{position:sticky;top:0;z-index:3;background-color:#fff;will-change:top;backface-visibility:hidden}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead.sticky:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:linear-gradient(to bottom,rgba(0,0,0,.1),transparent)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th{padding:0;vertical-align:middle;position:relative;border:none;background-color:#fff;will-change:top;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left{position:sticky;left:0;background-color:#fff;z-index:2;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)):after{content:\"\";position:absolute;right:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to left,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right{position:sticky;right:0;background-color:#fff;z-index:2;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right-first:not(.settings-column){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to right,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.settings-column{width:2rem;text-align:center;font-weight:600;font-size:12px;position:sticky;right:0;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb;z-index:2}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:4;pointer-events:auto}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:hover:after,.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:active:after{opacity:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.row-number-header{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)):after{content:\"\";position:absolute;right:-6px;top:0;bottom:-1px;width:5px;border-left:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,.08) 0%,rgba(0,0,0,0) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-6px;top:0;bottom:-1px;width:5px;border-right:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,0) 0%,rgba(0,0,0,.08) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody{will-change:transform;position:relative;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr{border-bottom:1px solid #E6E9EB;transition:background-color .15s;height:2rem;box-sizing:border-box}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr:last-child{border-bottom:none}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td{padding:0;vertical-align:middle;box-sizing:border-box;height:2rem;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb;border:none}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.align-center{text-align:center}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.align-right{text-align:right}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left{position:sticky;z-index:2;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)):after{content:\"\";position:absolute;right:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to left,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right{position:sticky;z-index:2;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right-first:not(.settings-column){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to right,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column{width:2rem;text-align:center;position:sticky;right:0;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb;z-index:2}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column .settings-trigger{background:none;border:none;font-size:1rem;line-height:1;cursor:pointer;border-radius:4px;transition:all .15s ease}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column .settings-trigger:focus{outline:2px solid #4299e1;outline-offset:2px}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.row-number-cell{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)):after{content:\"\";position:absolute;right:-6px;top:0;bottom:-1px;width:5px;border-left:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,.08) 0%,rgba(0,0,0,0) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right-first:before{content:\"\";position:absolute;left:-6px;top:0;bottom:-1px;width:5px;border-right:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,0) 0%,rgba(0,0,0,.08) 100%)}.st-table:not(.virtual-scroll-enabled) .st-table-element{width:100%;height:100%;overflow:auto;border-collapse:separate;border-spacing:0;table-layout:fixed}.st-table:not(.virtual-scroll-enabled) .st-table-element thead{background-color:#fff;border-bottom:1px solid #E6E9EB}.st-table:not(.virtual-scroll-enabled) .st-table-element thead.sticky{position:sticky;top:0;z-index:3;background-color:#fff;will-change:top;backface-visibility:hidden}.st-table:not(.virtual-scroll-enabled) .st-table-element thead.sticky:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:linear-gradient(to bottom,rgba(0,0,0,.1),transparent)}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th{padding:0;vertical-align:middle;position:relative;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb;border:none}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left{position:sticky;left:0;background-color:#fff;z-index:2;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)):after{content:\"\";position:absolute;right:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to left,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right{position:sticky;right:0;background-color:#fff;z-index:2;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right-first:not(.settings-column){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to right,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.settings-column{width:2rem;text-align:center;font-weight:600;font-size:12px;position:sticky;right:0;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb;z-index:2}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:4;pointer-events:auto}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:hover:after,.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:active:after{opacity:1}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.row-number-header{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody{will-change:transform;position:relative;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr{height:2rem;box-sizing:border-box}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr:last-child{border-bottom:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td{padding:0;vertical-align:middle;height:2rem;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb;border:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.row-number-cell{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.align-center{text-align:center}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.align-right{text-align:right}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left{position:sticky;z-index:2;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)):after{content:\"\";position:absolute;right:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to left,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right{position:sticky;z-index:2;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right-first:not(.settings-column){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to right,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.settings-column{position:sticky;right:0;width:2rem;text-align:center;border-right:none;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb;z-index:2}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.settings-column .settings-trigger{background:none;border:none;font-size:1rem;line-height:1;cursor:pointer;border-radius:4px;transition:all .15s ease}.st-table:not(.virtual-scroll-enabled) .st-table-element .header-content{display:flex;height:2rem;align-items:center}.st-table:not(.virtual-scroll-enabled) .st-table-element .header-content .table-header-text{flex-grow:1;padding-left:4px}.st-table:not(.virtual-scroll-enabled) .st-table-element .settings-column>.header-content{display:flex;align-items:center;justify-content:center}.flex-center{display:flex;align-items:center;justify-content:center}.list-row{padding:1rem}.list-row .list-content{display:flex;justify-content:space-evenly;gap:4px;margin-bottom:1rem}\n"] }]
1313
- }], ctorParameters: function () { return [{ type: i1.JsonSchemaValidatorService }, { type: i2.ValidationLoggerService }, { type: i3.VirtualScrollService }]; }, propDecorators: { tableConfig: [{
1339
+ args: [{ selector: 'st-table', template: "<!-- Top pagination controls -->\n<st-pagination \n *ngIf=\"showTopPagination() && !(mergedConfig.tableSkeleton?.enabled | async)\" \n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n position=\"top\">\n</st-pagination>\n\n<div class=\"st-table\" *ngIf=\"!(mergedConfig.tableSkeleton?.enabled | async)\" \n [ngClass]=\"{\n 'virtual-scroll-enabled': isVirtualScrollEnabled(),\n 'keyboard-navigation-enabled': isKeyboardNavigationEnabled()\n }\"\n [ngStyle]=\"{\n 'max-height.px': !isVirtualScrollEnabled() ? mergedConfig.display?.maxHeight : null\n }\"\n stKeyboardNavigation\n [tableState]=\"getActiveTableState()\"\n [addRowOnNavigatePastEnd]=\"mergedConfig.features?.keyboardNavigation?.addRowOnNavigatePastEnd || false\"\n [attr.tabindex]=\"isKeyboardNavigationEnabled() ? 0 : -1\"\n (focus)=\"onTableContainerFocus($event)\"\n [attr.title]=\"isKeyboardNavigationEnabled() ? 'Click a cell or press Tab to start keyboard navigation' : null\">\n <!-- Unified Table Actions Menu -->\n\n <!-- Virtual scroll viewport wrapper -->\n <div class=\"st-scroll-viewport\" #scrollViewport *ngIf=\"isVirtualScrollEnabled()\"\n [ngStyle]=\"{ 'height.px': getVirtualScrollViewportHeight() }\">\n\n <!-- Spacer to create scrollable area -->\n <div class=\"st-scroll-spacer\" [ngStyle]=\"{ 'height.px': virtualScrollTotalHeight$ | async }\">\n </div>\n\n <!-- Table positioner with transform (instead of tbody) -->\n <div class=\"st-table-positioner\" [ngStyle]=\"{ transform: 'translateY(' + (virtualScrollOffsetY$ | async) + 'px)' }\">\n <!-- Table with only visible rows -->\n <ng-container *ngTemplateOutlet=\"tableTemplate; context: { \n mode: 'virtual',\n theadStyle: { top: (virtualScrollOffsetYNeg$ | async) + 'px' }\n }\"></ng-container>\n </div>\n </div>\n \n <!-- Standard table (when virtual scroll disabled) -->\n <ng-container *ngIf=\"!isVirtualScrollEnabled()\">\n <ng-container *ngTemplateOutlet=\"tableTemplate; context: { \n mode: 'standard',\n theadStyle: null\n }\"></ng-container>\n </ng-container>\n\n <!-- Shared Column Menu Dropdown -->\n <st-column-menu-dropdown \n [isOpen]=\"columnMenuState.isOpen\"\n [position]=\"columnMenuState.position\"\n [context]=\"columnMenuState.context\"\n (actionClicked)=\"onColumnActionClicked($event)\"\n (closed)=\"closeColumnMenu()\">\n </st-column-menu-dropdown>\n</div>\n\n<ng-container *ngIf=\"(mergedConfig.tableSkeleton?.enabled | async)\">\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\n</ng-container>\n\n<!-- Shared Row Actions Dropdown -->\n<st-row-actions-dropdown [isOpen]=\"dropdownState.isOpen\" [position]=\"dropdownState.position\"\n [context]=\"dropdownState.context\" (actionClicked)=\"onRowActionClicked($event)\" (closed)=\"closeRowActionsDropdown()\">\n</st-row-actions-dropdown>\n\n\n<!-- Bottom pagination controls -->\n<st-pagination \n *ngIf=\"showBottomPagination() && !(mergedConfig.tableSkeleton?.enabled | async)\" \n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n position=\"bottom\">\n</st-pagination>\n\n\n <!-- ========================================== -->\n <!-- REUSABLE TABLE TEMPLATE -->\n <!-- ========================================== -->\n <ng-template #tableTemplate let-mode=\"mode\" let-theadStyle=\"theadStyle\">\n <table class=\"st-table-element\">\n <!-- TABLE HEADER -->\n <thead [ngClass]=\"{ 'sticky': mergedConfig.display?.stickyHeader }\" [ngStyle]=\"theadStyle\">\n <tr>\n <!-- Row Number Header -->\n <th *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-header header-cell sticky-left\"\n [ngStyle]=\"{\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_HEADER_CELL,\n 'width.px': 30\n }\">\n #\n </th>\n <!-- Column Headers -->\n <th \n *ngFor=\"let column of visibleColumns; let colIndex = index; let isFirst = first; let isLast = last\"\n [ngClass]=\"{\n 'header-cell': mode === 'standard',\n 'sticky-left': column.sticky === 'left',\n 'sticky-right': column.sticky === 'right',\n 'sticky-right-first': column.sticky === 'right' && isFirstStickyRight(column.key),\n 'resizable': column.resizable !== false\n }\"\n [ngStyle]=\"{\n position: column.sticky ? 'sticky' : null,\n 'left.px': column.sticky === 'left' ? (column.stickyOffset || 0) : null,\n 'right.px': column.sticky === 'right' ? (column.stickyOffset || 0) : null,\n 'z-index': column.sticky ? ZIndex.STICKY_HEADER_CELL : null,\n 'width.px': column.width\n }\">\n \n <st-header \n [column]=\"column\"\n [columnIndex]=\"colIndex\"\n [isFirstColumn]=\"isFirst\"\n [isLastColumn]=\"isLast\"\n [tableState]=\"getActiveTableState()\"\n [enableSorting]=\"mergedConfig.sorting?.enabled ?? enableSorting\"\n [enableFiltering]=\"mergedConfig.filtering?.enabled ?? enableFiltering\"\n (columnMoved)=\"onColumnMoved($event)\"\n (menuClick)=\"openColumnMenu($event, column, colIndex, isFirst, isLast)\">\n </st-header>\n\n <div \n class=\"resize-handle\" \n stColumnResize\n [column]=\"column\"\n (columnResized)=\"onColumnResized($event)\"\n *ngIf=\"column.resizable !== false\">\n </div>\n </th>\n \n <!-- Settings Column Header -->\n <th \n class=\"settings-column sticky-right\"\n [ngClass]=\"{ 'header-cell': mode === 'standard' }\"\n [ngStyle]=\"{ 'z-index': ZIndex.STICKY_HEADER_CELL }\">\n <div [ngClass]=\"{ 'flex-center': mode === 'virtual', 'header-content': mode === 'standard' }\">\n <st-table-actions \n [tableState]=\"getActiveTableState()\"\n [allowAddColumn]=\"mergedConfig.features?.columnManagement?.allowAdd || false\"\n (addColumnClicked)=\"onAddColumnClick()\">\n </st-table-actions>\n </div>\n </th>\n </tr>\n </thead>\n\n <!-- TABLE BODY -->\n <tbody>\n <!-- Virtual Scroll Rows -->\n <ng-container *ngIf=\"mode === 'virtual'\">\n <tr *ngFor=\"let row of visibleRows$ | async; let relativeIndex = index; trackBy: trackByRowIndex\"\n [attr.data-row-index]=\"getAbsoluteRowIndex(relativeIndex)\">\n <!-- Row Number Cell -->\n <td *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-cell\" \n [ngClass]=\"{ 'sticky-left': 'left' }\"\n [ngStyle]=\"{\n 'width.px': 30,\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_BODY_CELL,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\">\n {{getAbsoluteRowIndex(relativeIndex) + 1}}\n </td>\n <ng-container *ngTemplateOutlet=\"bodyCellTemplate; context: { \n row: row,\n rowIndex: getAbsoluteRowIndex(relativeIndex),\n mode: 'virtual',\n relativeIndex: relativeIndex\n }\"></ng-container>\n </tr>\n </ng-container>\n\n <!-- Standard Rows -->\n <ng-container *ngIf=\"mode === 'standard'\">\n <tr *ngFor=\"let row of visibleCellGrid; let rowIndex = index\" [attr.data-row-index]=\"rowIndex\">\n <!-- Row Number Cell -->\n <td *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-cell\" \n [ngClass]=\"{ 'sticky-left': 'left' }\"\n [ngStyle]=\"{\n 'width.px': 30,\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_BODY_CELL,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\">\n {{rowIndex + 1}}\n </td>\n <ng-container *ngTemplateOutlet=\"bodyCellTemplate; context: { \n row: row,\n rowIndex: rowIndex,\n mode: 'standard'\n }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </ng-template>\n\n <!-- ========================================== -->\n <!-- REUSABLE BODY CELL TEMPLATE -->\n <!-- ========================================== -->\n <ng-template #bodyCellTemplate let-row=\"row\" let-rowIndex=\"rowIndex\" let-mode=\"mode\" let-relativeIndex=\"relativeIndex\">\n <!-- Data Cells -->\n <td \n *ngFor=\"let cell of row; let colIndex = index\"\n [ngClass]=\"{\n 'sticky-left': visibleColumns[colIndex]?.sticky === 'left',\n 'sticky-right': visibleColumns[colIndex]?.sticky === 'right',\n 'sticky-right-first': visibleColumns[colIndex]?.sticky === 'right' && visibleColumns[colIndex]?.key && isFirstStickyRight(visibleColumns[colIndex].key),\n 'align-center': visibleColumns[colIndex]?.alignment === 'center',\n 'align-right': visibleColumns[colIndex]?.alignment === 'right',\n 'cell-focused': cell.isFocused()\n }\"\n [ngStyle]=\"{\n position: visibleColumns[colIndex]?.sticky ? 'sticky' : null,\n 'left.px': visibleColumns[colIndex]?.sticky === 'left' ? (visibleColumns[colIndex]?.stickyOffset || 0) : null,\n 'right.px': visibleColumns[colIndex]?.sticky === 'right' ? (visibleColumns[colIndex]?.stickyOffset || 0) : null,\n 'z-index': visibleColumns[colIndex]?.sticky ? ZIndex.STICKY_BODY_CELL : null,\n 'width.px': visibleColumns[colIndex]?.width,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\"\n (click)=\"isKeyboardNavigationEnabled() ? onCellClick(rowIndex, colIndex) : null\">\n \n <!-- Virtual Scroll Cell -->\n <st-cell \n *ngIf=\"mode === 'virtual'\"\n [cell]=\"cell\" \n [attr.tabindex]=\"cell.isFocused() ? 0 : -1\" \n [editMode]=\"getEditModeForCells()\"\n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n [columnIndex]=\"colIndex\"\n (cellEdit)=\"onCellEdit($event)\" \n (cellSave)=\"onCellSave($event)\"\n (cellSaveAndNavigate)=\"onCellSaveAndNavigate($event)\" \n (cellCancel)=\"onCellCancel($event)\"\n (cellChange)=\"cellChange.emit($event)\">\n </st-cell>\n\n <!-- Standard Cell -->\n <st-cell \n *ngIf=\"mode === 'standard'\"\n [cell]=\"cell\" \n [attr.tabindex]=\"cell.isFocused() ? 0 : -1\"\n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n [columnIndex]=\"colIndex\"\n (cellSave)=\"onCellSave($event)\"\n (cellChange)=\"cellChange.emit($event)\">\n </st-cell>\n </td>\n \n <!-- Row Actions Cell -->\n <td class=\"settings-column\"\n [ngClass]=\"{\n 'has-actions': hasRowActions()\n }\"\n [ngStyle]=\"{\n position: hasRowActions() ? 'sticky' : null,\n 'right.px': hasRowActions() ? 0 : null,\n 'z-index': hasRowActions() ? ZIndex.STICKY_BODY_CELL : null\n }\">\n <button \n *ngIf=\"hasRowActions()\"\n class=\"settings-trigger\"\n (click)=\"openRowActionsDropdown($event, getRowData(rowIndex), rowIndex)\"\n type=\"button\" \n aria-label=\"Row actions\">\n \u22EF\n </button>\n </td>\n </ng-template>\n\n<ng-template #skeletonLoader>\n <div class=\"list-row\" *ngIf=\"(mergedConfig.tableSkeleton?.enabled | async)\">\n <div *ngFor=\"let i of skeletonColumns\" class=\"list-content\">\n <nile-skeleton-loader variant=\"text\" width=\"90%\" height=\"18\" *ngFor=\"let j of skeletonRows\"></nile-skeleton-loader>\n </div>\n </div>\n</ng-template>", styles: [".st-table{width:100%;overflow:auto;position:relative;height:100%;max-height:30rem;border-radius:4px;border:1px solid #E6E9EB}.st-table st-table-actions{position:sticky;right:0}.st-table.keyboard-navigation-enabled{cursor:pointer}.st-table.keyboard-navigation-enabled:focus{outline:none;box-shadow:0 0 0 2px #3b82f64d}.st-table.keyboard-navigation-enabled td.cell-focused{outline:2px solid #4299e1;outline-offset:-1px;position:relative;box-shadow:0 0 0 3px #3182ce1a}.st-table.keyboard-navigation-enabled td.cell-focused:focus{outline:2px solid #4299e1;outline-offset:-1px;box-shadow:0 0 0 3px #3182ce1a}.st-table.keyboard-navigation-enabled td.cell-focused:has(.st-cell.editing){box-shadow:0 0 0 4px #2563eb26}.st-table.virtual-scroll-enabled{overflow-x:visible;margin:0;border:1px solid #E6E9EB;border-collapse:separate;border-spacing:0}.st-table.virtual-scroll-enabled .st-scroll-viewport{position:relative;overflow-y:auto;overflow-x:auto;scroll-behavior:smooth}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-scroll-spacer{position:absolute;top:0;left:0;width:1px;pointer-events:none;z-index:-1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-positioner{position:absolute;top:0;left:0;right:0;will-change:transform}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element{position:relative;width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead{background-color:#fff;border-bottom:1px solid #E6E9EB}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead.sticky{position:sticky;top:0;z-index:3;background-color:#fff;will-change:top;backface-visibility:hidden}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead.sticky:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:linear-gradient(to bottom,rgba(0,0,0,.1),transparent)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th{padding:0;vertical-align:middle;position:relative;border:none;background-color:#fff;will-change:top;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left{position:sticky;left:0;background-color:#fff;z-index:2;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)):after{content:\"\";position:absolute;right:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to left,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right{position:sticky;right:0;background-color:#fff;z-index:2;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right-first:not(.settings-column){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to right,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.settings-column{width:2rem;text-align:center;font-weight:600;font-size:12px;position:sticky;right:0;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb;z-index:2}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:4;pointer-events:auto}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:hover:after,.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:active:after{opacity:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.row-number-header{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)):after{content:\"\";position:absolute;right:-6px;top:0;bottom:-1px;width:5px;border-left:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,.08) 0%,rgba(0,0,0,0) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-6px;top:0;bottom:-1px;width:5px;border-right:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,0) 0%,rgba(0,0,0,.08) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody{will-change:transform;position:relative;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr{border-bottom:1px solid #E6E9EB;transition:background-color .15s;height:2rem;box-sizing:border-box}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr:last-child{border-bottom:none}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td{padding:0;vertical-align:middle;box-sizing:border-box;height:2rem;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb;border:none}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.align-center{text-align:center}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.align-right{text-align:right}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left{position:sticky;z-index:2;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)):after{content:\"\";position:absolute;right:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to left,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right{position:sticky;z-index:2;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right-first:not(.settings-column){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to right,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column{width:2rem;text-align:center;position:sticky;right:0;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb;z-index:2}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column .settings-trigger{background:none;border:none;font-size:1rem;line-height:1;cursor:pointer;border-radius:4px;transition:all .15s ease}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column .settings-trigger:focus{outline:2px solid #4299e1;outline-offset:2px}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.row-number-cell{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)):after{content:\"\";position:absolute;right:-6px;top:0;bottom:-1px;width:5px;border-left:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,.08) 0%,rgba(0,0,0,0) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right-first:before{content:\"\";position:absolute;left:-6px;top:0;bottom:-1px;width:5px;border-right:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,0) 0%,rgba(0,0,0,.08) 100%)}.st-table:not(.virtual-scroll-enabled) .st-table-element{width:100%;height:100%;overflow:auto;border-collapse:separate;border-spacing:0;table-layout:fixed}.st-table:not(.virtual-scroll-enabled) .st-table-element thead{background-color:#fff;border-bottom:1px solid #E6E9EB}.st-table:not(.virtual-scroll-enabled) .st-table-element thead.sticky{position:sticky;top:0;z-index:3;background-color:#fff;will-change:top;backface-visibility:hidden}.st-table:not(.virtual-scroll-enabled) .st-table-element thead.sticky:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:linear-gradient(to bottom,rgba(0,0,0,.1),transparent)}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th{padding:0;vertical-align:middle;position:relative;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb;border:none}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left{position:sticky;left:0;background-color:#fff;z-index:2;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)):after{content:\"\";position:absolute;right:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to left,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right{position:sticky;right:0;background-color:#fff;z-index:2;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right-first:not(.settings-column){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to right,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.settings-column{width:2rem;text-align:center;font-weight:600;font-size:12px;position:sticky;right:0;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb;z-index:2}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:4;pointer-events:auto}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:hover:after,.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:active:after{opacity:1}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.row-number-header{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody{will-change:transform;position:relative;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr{height:2rem;box-sizing:border-box}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr:last-child{border-bottom:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td{padding:0;vertical-align:middle;height:2rem;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb;border:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.row-number-cell{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.align-center{text-align:center}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.align-right{text-align:right}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left{position:sticky;z-index:2;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset -1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)):after{content:\"\";position:absolute;right:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to left,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right{position:sticky;z-index:2;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right-first:not(.settings-column){position:relative;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-8px;top:0;bottom:0;width:8px;background:linear-gradient(to right,transparent,rgba(0,0,0,.08));pointer-events:none;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.settings-column{position:sticky;right:0;width:2rem;text-align:center;border-right:none;background-color:#fff;box-shadow:inset 0 -1px #e6e9eb,inset 1px 0 #e6e9eb;z-index:2}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.settings-column .settings-trigger{background:none;border:none;font-size:1rem;line-height:1;cursor:pointer;border-radius:4px;transition:all .15s ease}.st-table:not(.virtual-scroll-enabled) .st-table-element .header-content{display:flex;height:2rem;align-items:center}.st-table:not(.virtual-scroll-enabled) .st-table-element .header-content .table-header-text{flex-grow:1;padding-left:4px}.st-table:not(.virtual-scroll-enabled) .st-table-element .settings-column>.header-content{display:flex;align-items:center;justify-content:center}.flex-center{display:flex;align-items:center;justify-content:center}.list-row{padding:1rem}.list-row .list-content{display:flex;justify-content:space-evenly;gap:4px;margin-bottom:1rem}\n"] }]
1340
+ }], ctorParameters: function () { return [{ type: i1.JsonSchemaValidatorService }, { type: i2.ValidationLoggerService }, { type: i3.VirtualScrollService }, { type: i0.ElementRef }]; }, propDecorators: { tableConfig: [{
1314
1341
  type: Input
1315
1342
  }], data: [{
1316
1343
  type: Input
@@ -1346,6 +1373,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1346
1373
  type: Output
1347
1374
  }], validationStateChange: [{
1348
1375
  type: Output
1376
+ }], requestAddRow: [{
1377
+ type: Output
1349
1378
  }], validateConfig: [{
1350
1379
  type: Input
1351
1380
  }], scrollViewport: [{
@@ -1355,4 +1384,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1355
1384
  type: HostListener,
1356
1385
  args: ['document:click', ['$event']]
1357
1386
  }] } });
1358
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9yZW5kZXJlci9jb21wb25lbnRzL3N0LXRhYmxlL3N0LXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC10YWJsZS9zdC10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUErQyxTQUFTLEVBQUUsVUFBVSxFQUFpQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEssT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RCxPQUFPLEVBQWUsZ0JBQWdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV2RixPQUFPLEVBQWtFLFFBQVEsRUFBdUIsTUFBTSw0QkFBNEIsQ0FBQztBQUMzSSxPQUFPLEVBQUUsZUFBZSxFQUE0QixNQUFNLE1BQU0sQ0FBQztBQUNqRSxPQUFPLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFPM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFRekQsTUFBTSxPQUFPLGdCQUFnQjtJQTBIM0IsWUFDVSxlQUEyQyxFQUMzQyxNQUErQixFQUMvQixvQkFBMEM7UUFGMUMsb0JBQWUsR0FBZixlQUFlLENBQTRCO1FBQzNDLFdBQU0sR0FBTixNQUFNLENBQXlCO1FB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bXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29sdW1uQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2NvbHVtbi1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IENlbGwgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2VsbC5jbGFzcyc7XG5pbXBvcnQgeyBUYWJsZVN0YXRlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXN0YXRlLmNsYXNzJztcbmltcG9ydCB7IFRhYmxlQ29uZmlnLCBtZXJnZVRhYmxlQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3RhYmxlLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGFibGVTdGF0ZUNoYW5nZUV2ZW50LCBDb2x1bW5SZXNpemVFdmVudCwgQ29sdW1uQWRkRXZlbnQsIENvbHVtbk1vdmVFdmVudCwgQ2VsbEZvY3VzUG9zaXRpb24sIERhdGFDaGFuZ2VFdmVudCB9IGZyb20gJy4uLy4uL21vZGVscy90YWJsZS10eXBlcyc7XG5pbXBvcnQgeyBDZWxsQ2hhbmdlRXZlbnQsIENlbGxTYXZlRXZlbnQsIENlbGxFZGl0RXZlbnQsIENlbGxDYW5jZWxFdmVudCwgRWRpdE1vZGUsIE5hdmlnYXRpb25EaXJlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY2VsbC10eXBlcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEpzb25TY2hlbWFWYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvanNvbi1zY2hlbWEtdmFsaWRhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2NoZW1hVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3NjaGVtYS12YWxpZGF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24tbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlydHVhbFNjcm9sbFNlcnZpY2UsIFZpcnR1YWxTY3JvbGxTdGF0ZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ZpcnR1YWwtc2Nyb2xsLnNlcnZpY2UnO1xuaW1wb3J0IHsgUm93QWN0aW9uLCBSb3dBY3Rpb25Db250ZXh0LCBSb3dBY3Rpb25FdmVudCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9yb3ctYWN0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb2x1bW5BY3Rpb24sIENvbHVtbkFjdGlvbkNvbnRleHQsIENvbHVtbkFjdGlvbkV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2NvbHVtbi1hY3Rpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFRhYmxlWkluZGV4IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3otaW5kZXguZW51bSc7XG5pbXBvcnQgeyBTb3J0RGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXR5cGVzJztcbmltcG9ydCB7IFRhYmxlVmFsaWRhdGlvblN0YXRlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXZhbGlkYXRpb24tc3RhdGUuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3QtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3QtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdC10YWJsZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFN0VGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgLy8gWi1JbmRleCBjb25zdGFudHMgZm9yIHRlbXBsYXRlIHVzZVxuICByZWFkb25seSBaSW5kZXggPSBUYWJsZVpJbmRleDtcbiAgXG4gIC8vIE5FVzogUHJpbWFyeSBjb25maWd1cmF0aW9uIGlucHV0XG4gIEBJbnB1dCgpIHRhYmxlQ29uZmlnITogVGFibGVDb25maWc7XG4gIFxuICAvLyBORVc6IFJhdyBkYXRhIGlucHV0IChhbHRlcm5hdGl2ZSB0byBjZWxsR3JpZClcbiAgQElucHV0KCkgZGF0YT86IGFueVtdO1xuICBcbiAgLy8gTkVXOiBPYnNlcnZhYmxlL0JlaGF2aW9yU3ViamVjdCBkYXRhIGlucHV0IChmb3IgcmVhY3RpdmUgZGF0YSBzdHJlYW1zKVxuICBASW5wdXQoKSBkYXRhJD86IE9ic2VydmFibGU8YW55W10+IHwgQmVoYXZpb3JTdWJqZWN0PGFueVtdPjtcbiAgXG4gIEBJbnB1dCgpIHRhYmxlU3RhdGU/OiBUYWJsZVN0YXRlO1xuICBcbiAgLy8gREVQUkVDQVRFRDogVXNlIHRhYmxlQ29uZmlnIGluc3RlYWRcbiAgQElucHV0KCkgZW5hYmxlU29ydGluZzogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGVuYWJsZUZpbHRlcmluZzogYm9vbGVhbiA9IHRydWU7XG4gIFxuICAvLyBORVc6IFN0YXRlIGNoYW5nZSBvdXRwdXRcbiAgQE91dHB1dCgpIHN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZVN0YXRlQ2hhbmdlRXZlbnQ+KCk7XG4gIFxuICAvLyBORVc6IERhdGEgY2hhbmdlIG91dHB1dCAoZm9yIGFzeW5jIGRhdGEgdXBkYXRlcylcbiAgQE91dHB1dCgpIGRhdGFDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFDaGFuZ2VFdmVudD4oKTtcbiAgXG4gIC8vIEVYSVNUSU5HOiBDZWxsIGFuZCBjb2x1bW4gZXZlbnRzXG4gIEBPdXRwdXQoKSBjZWxsRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbEVkaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNlbGxTYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxDZWxsU2F2ZUV2ZW50PigpO1xuICBAT3V0cHV0KCkgY2VsbENhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbENhbmNlbEV2ZW50PigpO1xuICBAT3V0cHV0KCkgY2VsbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbENoYW5nZUV2ZW50PigpO1xuICBAT3V0cHV0KCkgY29sdW1uUmVzaXplZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uUmVzaXplRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjb2x1bW5Nb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uTW92ZUV2ZW50PigpO1xuICBcbiAgLy8gTkVXOiBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gb3V0cHV0XG4gIEBPdXRwdXQoKSBjb25maWdWYWxpZGF0aW9uRXJyb3JzID0gbmV3IEV2ZW50RW1pdHRlcjxTY2hlbWFWYWxpZGF0aW9uRXJyb3JbXT4oKTtcbiAgXG4gIC8vIE5FVzogQ29sdW1uIG1hbmFnZW1lbnQgb3V0cHV0XG4gIEBPdXRwdXQoKSBjb2x1bW5BZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uQWRkRXZlbnQ+KCk7XG4gIFxuICAvLyBORVc6IFJvdyBhY3Rpb24gb3V0cHV0XG4gIEBPdXRwdXQoKSByb3dBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPFJvd0FjdGlvbkV2ZW50PigpO1xuICBcbiAgLy8gTkVXOiBWYWxpZGF0aW9uIHN0YXRlIGNoYW5nZSBvdXRwdXRcbiAgQE91dHB1dCgpIHZhbGlkYXRpb25TdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVWYWxpZGF0aW9uU3RhdGU+KCk7XG4gIFxuICAvLyBORVc6IE9wdGlvbmFsIHZhbGlkYXRpb24gZmxhZ1xuICBASW5wdXQoKSB2YWxpZGF0ZUNvbmZpZzogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLy8gSW50ZXJuYWwgc3RhdGVcbiAgcHJpdmF0ZSBpbnRlcm5hbFRhYmxlU3RhdGU/OiBUYWJsZVN0YXRlO1xuICBwcml2YXRlIGludGVybmFsQ2VsbEdyaWQ/OiBDZWxsPGFueT5bXVtdO1xuICBwcml2YXRlIHN0YXRlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGZvY3VzU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHZhbGlkYXRpb25TdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZGF0YVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBpbnRlcm5hbERhdGEkOiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICBwcml2YXRlIHByZXZpb3VzRGF0YTogYW55W10gPSBbXTtcbiAgbWVyZ2VkQ29uZmlnITogVGFibGVDb25maWc7XG4gIFxuICAvLyBNb2RhbCBzdGF0ZVxuICBwdWJsaWMgc2hvd0NvbHVtbk1vZGFsOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvLyBDYWNoZWQgdmlzaWJsZSBjb2x1bW5zIGFuZCBjZWxsIGdyaWQgdG8gcHJldmVudCByZS1jcmVhdGlvbiBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gIHB1YmxpYyB2aXNpYmxlQ29sdW1uczogQ29sdW1uQ29uZmlnPGFueT5bXSA9IFtdO1xuICBwdWJsaWMgdmlzaWJsZUNlbGxHcmlkOiBDZWxsPGFueT5bXVtdID0gW107XG4gIFxuICAvLyBSb3cgYWN0aW9ucyBkcm9wZG93biBzdGF0ZVxuICBwdWJsaWMgZHJvcGRvd25TdGF0ZToge1xuICAgIGlzT3BlbjogYm9vbGVhbjtcbiAgICBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICAgIGNvbnRleHQ6IFJvd0FjdGlvbkNvbnRleHQgfCBudWxsO1xuICB9ID0ge1xuICAgIGlzT3BlbjogZmFsc2UsXG4gICAgcG9zaXRpb246IHsgeDogMCwgeTogMCB9LFxuICAgIGNvbnRleHQ6IG51bGxcbiAgfTtcbiAgXG4gIHB1YmxpYyBza2VsZXRvbkNvbHVtbnM/OiBudW1iZXJbXTtcbiAgcHVibGljIHNrZWxldG9uUm93cz86IG51bWJlcltdO1xuXG4gIC8vIENvbHVtbiBtZW51IGRyb3Bkb3duIHN0YXRlXG4gIHB1YmxpYyBjb2x1bW5NZW51U3RhdGU6IHtcbiAgICBpc09wZW46IGJvb2xlYW47XG4gICAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcbiAgICBjb250ZXh0OiBDb2x1bW5BY3Rpb25Db250ZXh0IHwgbnVsbDtcbiAgfSA9IHtcbiAgICBpc09wZW46IGZhbHNlLFxuICAgIHBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSxcbiAgICBjb250ZXh0OiBudWxsXG4gIH07XG4gIFxuICAvLyBWaXJ0dWFsIHNjcm9sbCBwcm9wZXJ0aWVzXG4gIHByaXZhdGUgc2Nyb2xsQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgc2Nyb2xsU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHZpcnR1YWxTY3JvbGxTdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFZpcnR1YWxTY3JvbGxTdGF0ZSB8IG51bGw+KG51bGwpO1xuICBcbiAgLy8gT2JzZXJ2YWJsZSBzdHJlYW1zIGRlcml2ZWQgZnJvbSB2aXJ0dWFsIHNjcm9sbCBzdGF0ZVxuICBwdWJsaWMgdmlydHVhbFNjcm9sbFRvdGFsSGVpZ2h0JDogT2JzZXJ2YWJsZTxudW1iZXI+ID0gdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLnBpcGUoXG4gICAgbWFwKHN0YXRlID0+IHN0YXRlPy50b3RhbEhlaWdodCA/PyAwKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICk7XG4gIFxuICBwdWJsaWMgdmlydHVhbFNjcm9sbE9mZnNldFkkOiBPYnNlcnZhYmxlPG51bWJlcj4gPSB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQucGlwZShcbiAgICBtYXAoc3RhdGUgPT4gc3RhdGU/Lm9mZnNldFkgPz8gMCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICApO1xuXG4gIHB1YmxpYyB2aXJ0dWFsU2Nyb2xsT2Zmc2V0WU5lZyQ6IE9ic2VydmFibGU8bnVtYmVyPiA9IHRoaXMudmlydHVhbFNjcm9sbFN0YXRlJC5waXBlKFxuICAgIG1hcChzdGF0ZSA9PiBOdW1iZXIoc3RhdGU/Lm9mZnNldFkgPz8gMCkgKiAtMSApLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgKTtcbiAgXG4gIHB1YmxpYyB2aXNpYmxlUm93cyQ6IE9ic2VydmFibGU8Q2VsbDxhbnk+W11bXT4gPSB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQucGlwZShcbiAgICBtYXAoc3RhdGUgPT4ge1xuICAgICAgaWYgKCFzdGF0ZSkgcmV0dXJuIHRoaXMudmlzaWJsZUNlbGxHcmlkO1xuICAgICAgY29uc3QgeyBzdGFydEluZGV4LCBlbmRJbmRleCB9ID0gc3RhdGU7XG4gICAgICByZXR1cm4gdGhpcy52aXNpYmxlQ2VsbEdyaWQuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgIH0pXG4gICk7XG4gIFxuICBAVmlld0NoaWxkKCdzY3JvbGxWaWV3cG9ydCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBzY3JvbGxWaWV3cG9ydD86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzY2hlbWFWYWxpZGF0b3I6IEpzb25TY2hlbWFWYWxpZGF0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9nZ2VyOiBWYWxpZGF0aW9uTG9nZ2VyU2VydmljZSxcbiAgICBwcml2YXRlIHZpcnR1YWxTY3JvbGxTZXJ2aWNlOiBWaXJ0dWFsU2Nyb2xsU2VydmljZSxcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFZhbGlkYXRlIHRoYXQgYXQgbGVhc3QgdGFibGVDb25maWcgb3IgY29sdW1ucyBpcyBwcm92aWRlZFxuICAgIGlmICghdGhpcy50YWJsZUNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFaXRoZXIgdGFibGVDb25maWcgb3IgY29sdW1ucyBtdXN0IGJlIHByb3ZpZGVkJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIE1lcmdlIGNvbmZpZyB3aXRoIGRlZmF1bHRzXG4gICAgaWYgKHRoaXMudGFibGVDb25maWcpIHtcbiAgICAgIHRoaXMubWVyZ2VkQ29uZmlnID0gbWVyZ2VUYWJsZUNvbmZpZyh0aGlzLnRhYmxlQ29uZmlnKTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgY29uZmlndXJhdGlvbiBpZiBlbmFibGVkXG4gICAgICBpZiAodGhpcy52YWxpZGF0ZUNvbmZpZykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlQ29uZmlndXJhdGlvbih0aGlzLm1lcmdlZENvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIENyZWF0ZSBvciB1c2UgVGFibGVTdGF0ZVxuICAgIGlmICghdGhpcy50YWJsZVN0YXRlKSB7XG4gICAgICB0aGlzLmNyZWF0ZUludGVybmFsVGFibGVTdGF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdWJzY3JpYmUgdG8gZXh0ZXJuYWwgdGFibGVTdGF0ZSBjaGFuZ2VzXG4gICAgICB0aGlzLnN1YnNjcmliZVRvRXh0ZXJuYWxUYWJsZVN0YXRlKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFNldHVwIGRhdGEgc291cmNlIChzeW5jIG9yIGFzeW5jKVxuICAgIHRoaXMuc2V0dXBEYXRhU291cmNlKCk7XG4gICAgXG4gICAgLy8gQ2FsY3VsYXRlIHN0aWNreSBvZmZzZXRzXG4gICAgY29uc3Qgcm93TnVtYmVyV2lkdGggPSB0aGlzLm1lcmdlZENvbmZpZy5zaG93Um93TnVtYmVyID8gMzAgOiAwO1xuICAgIGNvbnN0IHNldHRpbmdzQ29sdW1uV2lkdGggPSB0aGlzLmhhc1Jvd0FjdGlvbnMoKSA/IDI4IDogMDsgLy8gU2V0dGluZ3MgY29sdW1uIGlzIH4zMnB4IHdpZGUgd2hlbiB2aXNpYmxlXG4gICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkuY2FsY3VsYXRlU3RpY2t5T2Zmc2V0cyhyb3dOdW1iZXJXaWR0aCwgc2V0dGluZ3NDb2x1bW5XaWR0aCk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSB2aXNpYmxlIGNvbHVtbnMgYW5kIGNlbGwgZ3JpZFxuICAgIHRoaXMudXBkYXRlVmlzaWJsZURhdGEoKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIHZpcnR1YWwgc2Nyb2xsIGlmIGVuYWJsZWRcbiAgICBpZiAodGhpcy5pc1ZpcnR1YWxTY3JvbGxFbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVZpcnR1YWxTY3JvbGwoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBrZXlib2FyZCBuYXZpZ2F0aW9uIGlmIGVuYWJsZWRcbiAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSkge1xuICAgICAgdGhpcy5pbml0aWFsaXplS2V5Ym9hcmROYXZpZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgdGhpcy5za2VsZXRvbkNvbHVtbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0aGlzLm1lcmdlZENvbmZpZy50YWJsZVNrZWxldG9uPy5jb2x1bW5zID8/IDEwIH0sIChfLCBpKSA9PiBpKTtcbiAgICB0aGlzLnNrZWxldG9uUm93cyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMubWVyZ2VkQ29uZmlnLnRhYmxlU2tlbGV0b24/LnJvd3MgPz8gMTAgfSwgKF8sIGkpID0+IGkpO1xuICB9XG4gIFxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gU2V0dXAgdmlydHVhbCBzY3JvbGwgYWZ0ZXIgdmlldyBpcyByZWFkeVxuICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSAmJiB0aGlzLnNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICB0aGlzLnNldHVwVmlydHVhbFNjcm9sbExpc3RlbmVyKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb24gd2hlbiB0YWJsZUNvbmZpZyBjaGFuZ2VzXG4gICAgaWYgKGNoYW5nZXNbJ3RhYmxlQ29uZmlnJ10gJiYgIWNoYW5nZXNbJ3RhYmxlQ29uZmlnJ10uZmlyc3RDaGFuZ2UgJiYgdGhpcy50YWJsZUNvbmZpZykge1xuICAgICAgdGhpcy5tZXJnZWRDb25maWcgPSBtZXJnZVRhYmxlQ29uZmlnKHRoaXMudGFibGVDb25maWcpO1xuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSBjb25maWd1cmF0aW9uIGlmIGVuYWJsZWRcbiAgICAgIGlmICh0aGlzLnZhbGlkYXRlQ29uZmlnKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVDb25maWd1cmF0aW9uKHRoaXMubWVyZ2VkQ29uZmlnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIGludGVybmFsIHRhYmxlIHN0YXRlIHdpdGggbmV3IGNvbHVtbnMgaWYgdXNpbmcgaW50ZXJuYWwgc3RhdGVcbiAgICAgIGlmICh0aGlzLmludGVybmFsVGFibGVTdGF0ZSkge1xuICAgICAgICB0aGlzLmludGVybmFsVGFibGVTdGF0ZS51cGRhdGVDb2x1bW5zKHRoaXMubWVyZ2VkQ29uZmlnLmNvbHVtbnMpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVcGRhdGUgdmlzaWJsZSBjb2x1bW5zIGFuZCBjZWxsIGdyaWRcbiAgICAgIHRoaXMudXBkYXRlVmlzaWJsZURhdGEoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gUmVjcmVhdGUgY2VsbCBncmlkIHdoZW4gZGF0YSBjaGFuZ2VzIChvbmx5IGlmIG5vdCB1c2luZyBkYXRhJCBPYnNlcnZhYmxlKVxuICAgIGlmIChjaGFuZ2VzWydkYXRhJ10gJiYgIWNoYW5nZXNbJ2RhdGEnXS5maXJzdENoYW5nZSAmJiB0aGlzLmRhdGEgJiYgIXRoaXMuZGF0YSQpIHtcbiAgICAgIHRoaXMuaGFuZGxlU3luY0RhdGFDaGFuZ2UoY2hhbmdlc1snZGF0YSddLnByZXZpb3VzVmFsdWUgfHwgW10pO1xuICAgIH1cbiAgICBcbiAgICAvLyBIYW5kbGUgZGF0YSQgT2JzZXJ2YWJsZSBpbnB1dCBjaGFuZ2VzXG4gICAgaWYgKGNoYW5nZXNbJ2RhdGEkJ10gJiYgIWNoYW5nZXNbJ2RhdGEkJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMuc2V0dXBEYXRhU291cmNlKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlY3JlYXRlIGNlbGwgZ3JpZCB3aGVuIGNlbGxHcmlkIGNoYW5nZXNcbiAgICBpZiAoY2hhbmdlc1snY2VsbEdyaWQnXSAmJiAhY2hhbmdlc1snY2VsbEdyaWQnXS5maXJzdENoYW5nZSkge1xuICAgICAgLy8gQ2VsbCBncmlkIHdhcyB1cGRhdGVkIGV4dGVybmFsbHksIG5vIG5lZWQgdG8gcmVjcmVhdGVcbiAgICAgIC8vIEp1c3QgcmVjYWxjdWxhdGUgc3RpY2t5IG9mZnNldHMgaWYgbmVlZGVkXG4gICAgICBpZiAodGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkpIHtcbiAgICAgICAgY29uc3Qgcm93TnVtYmVyV2lkdGggPSB0aGlzLm1lcmdlZENvbmZpZy5zaG93Um93TnVtYmVyID8gMzAgOiAwO1xuICAgICAgICBjb25zdCBzZXR0aW5nc0NvbHVtbldpZHRoID0gdGhpcy5oYXNSb3dBY3Rpb25zKCkgPyAzMiA6IDA7XG4gICAgICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLmNhbGN1bGF0ZVN0aWNreU9mZnNldHMocm93TnVtYmVyV2lkdGgsIHNldHRpbmdzQ29sdW1uV2lkdGgpO1xuICAgICAgfVxuICAgICAgLy8gVXBkYXRlIHZpc2libGUgY29sdW1ucyBhbmQgY2VsbCBncmlkXG4gICAgICB0aGlzLnVwZGF0ZVZpc2libGVEYXRhKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIEhhbmRsZSB0YWJsZVN0YXRlIGlucHV0IGNoYW5nZXMgKHdoZW4gZXh0ZXJuYWwgc3RhdGUgaXMgcHJvdmlkZWQsIGUuZy4sIGluIHdvcmtib29rKVxuICAgIGlmIChjaGFuZ2VzWyd0YWJsZVN0YXRlJ10gJiYgIWNoYW5nZXNbJ3RhYmxlU3RhdGUnXS5maXJzdENoYW5nZSAmJiB0aGlzLnRhYmxlU3RhdGUpIHtcbiAgICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gYWxsIG9sZCB0YWJsZVN0YXRlIG9ic2VydmFibGVzIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAgICB0aGlzLnN0YXRlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy52YWxpZGF0aW9uU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5mb2N1c1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIFxuICAgICAgLy8gUmVzdWJzY3JpYmUgdG8gbmV3IHRhYmxlU3RhdGUncyBvYnNlcnZhYmxlc1xuICAgICAgdGhpcy5zdWJzY3JpYmVUb0V4dGVybmFsVGFibGVTdGF0ZSgpO1xuICAgICAgXG4gICAgICAvLyBSZWluaXRpYWxpemUga2V5Ym9hcmQgbmF2aWdhdGlvbiB3aXRoIG5ldyB0YWJsZVN0YXRlXG4gICAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVLZXlib2FyZE5hdmlnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gUmVjYWxjdWxhdGUgdmlydHVhbCBzY3JvbGwgd2hlbiBkYXRhIGNoYW5nZXNcbiAgICBpZiAoKGNoYW5nZXNbJ2RhdGEnXSB8fCBjaGFuZ2VzWydjZWxsR3JpZCddKSAmJiAhY2hhbmdlc1snZGF0YSddPy5maXJzdENoYW5nZSkge1xuICAgICAgaWYgKHRoaXMuaXNWaXJ0dWFsU2Nyb2xsRW5hYmxlZCgpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMudmlydHVhbFNjcm9sbFN0YXRlJC52YWx1ZTtcbiAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSkge1xuICAgICAgICAgIGNvbnN0IG5ld1N0YXRlID0gdGhpcy52aXJ0dWFsU2Nyb2xsU2VydmljZS5jYWxjdWxhdGVWaXNpYmxlUmFuZ2Uoe1xuICAgICAgICAgICAgc2Nyb2xsVG9wOiBjdXJyZW50U3RhdGUuc2Nyb2xsVG9wLFxuICAgICAgICAgICAgdmlld3BvcnRIZWlnaHQ6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbFZpZXdwb3J0SGVpZ2h0KCksXG4gICAgICAgICAgICB0b3RhbEl0ZW1zOiB0aGlzLnZpc2libGVDZWxsR3JpZC5sZW5ndGgsXG4gICAgICAgICAgICBpdGVtU2l6ZTogdGhpcy5nZXRWaXJ0dWFsU2Nyb2xsSXRlbVNpemUoKSxcbiAgICAgICAgICAgIGJ1ZmZlclNpemU6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbEJ1ZmZlclNpemUoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMudmlydHVhbFNjcm9sbFN0YXRlJC5uZXh0KG5ld1N0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVcGRhdGUga2V5Ym9hcmQgbmF2aWdhdGlvbiBkaW1lbnNpb25zIGlmIGVuYWJsZWRcbiAgICAgIGlmICh0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpICYmIChjaGFuZ2VzWydkYXRhJ10gfHwgY2hhbmdlc1snY2VsbEdyaWQnXSkpIHtcbiAgICAgICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkuc2V0RGltZW5zaW9ucyhcbiAgICAgICAgICB0aGlzLnZpc2libGVDZWxsR3JpZC5sZW5ndGgsXG4gICAgICAgICAgdGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGhcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGludGVybmFsIFRhYmxlU3RhdGUgZnJvbSBjb25maWdcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlSW50ZXJuYWxUYWJsZVN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldEFjdGl2ZUNvbHVtbnMoKTtcbiAgICB0aGlzLmludGVybmFsVGFibGVTdGF0ZSA9IG5ldyBUYWJsZVN0YXRlKGNvbHVtbnMsIHtcbiAgICAgIHBhZ2VTaXplOiB0aGlzLm1lcmdlZENvbmZpZy5wYWdpbmF0aW9uPy5wYWdlU2l6ZSxcbiAgICAgIGluaXRpYWxQYWdlOiB0aGlzLm1lcmdlZENvbmZpZy5pbml0aWFsU3RhdGU/LnBhZ2VcbiAgICB9KTtcbiAgICBcbiAgICAvLyBTZXQgdG90YWwgaXRlbXMgaWYgcHJvdmlkZWQgaW4gY29uZmlnIChmb3Igc2VydmVyLXNpZGUgcGFnaW5hdGlvbilcbiAgICBpZiAodGhpcy5tZXJnZWRDb25maWcucGFnaW5hdGlvbj8udG90YWxJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmludGVybmFsVGFibGVTdGF0ZS5zZXRUb3RhbEl0ZW1zKHRoaXMubWVyZ2VkQ29uZmlnLnBhZ2luYXRpb24udG90YWxJdGVtcyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFwcGx5IGluaXRpYWwgc29ydCBpZiBwcm92aWRlZFxuICAgIGlmICh0aGlzLm1lcmdlZENvbmZpZy5pbml0aWFsU3RhdGU/LnNvcnRCeSkge1xuICAgICAgdGhpcy5tZXJnZWRDb25maWcuaW5pdGlhbFN0YXRlLnNvcnRCeS5mb3JFYWNoKHNvcnQgPT4ge1xuICAgICAgICB0aGlzLmludGVybmFsVGFibGVTdGF0ZSEuYWRkU29ydFRvQ29sdW1uKHNvcnQua2V5LCBzb3J0LmRpcmVjdGlvbik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQXBwbHkgaW5pdGlhbCBmaWx0ZXJzIGlmIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMubWVyZ2VkQ29uZmlnLmluaXRpYWxTdGF0ZT8uZmlsdGVycykge1xuICAgICAgdGhpcy5tZXJnZWRDb25maWcuaW5pdGlhbFN0YXRlLmZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgICB0aGlzLmludGVybmFsVGFibGVTdGF0ZSEuc2V0RmlsdGVyT25Db2x1bW4oZmlsdGVyLmtleSwgZmlsdGVyLm9wZXJhdG9yLCBmaWx0ZXIudmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFN1YnNjcmliZSB0byBpbnRlcm5hbCBzdGF0ZSBjaGFuZ2VzIGFuZCByZS1lbWl0XG4gICAgdGhpcy5zdWJzY3JpYmVUb0ludGVybmFsU3RhdGUoKTtcbiAgICBcbiAgICAvLyBTdWJzY3JpYmUgdG8gdmFsaWRhdGlvbiBzdGF0ZSBjaGFuZ2VzIGFuZCByZS1lbWl0XG4gICAgdGhpcy5zdWJzY3JpYmVUb1ZhbGlkYXRpb25TdGF0ZSgpO1xuICB9XG4gIFxuICBwcml2YXRlIHN1YnNjcmliZVRvVmFsaWRhdGlvblN0YXRlKCkge1xuICAgIGlmICghdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUpIHJldHVybjtcbiAgICB0aGlzLnZhbGlkYXRpb25TdWJzY3JpcHRpb24gPSB0aGlzLmludGVybmFsVGFibGVTdGF0ZS50YWJsZVZhbGlkYXRpb25TdGF0ZSRcbiAgICAgIC5zdWJzY3JpYmUoc3RhdGUgPT4ge1xuICAgICAgICB0aGlzLnZhbGlkYXRpb25TdGF0ZUNoYW5nZS5lbWl0KHN0YXRlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0ludGVybmFsU3RhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmludGVybmFsVGFibGVTdGF0ZSkgcmV0dXJuO1xuICAgIHRoaXMuc3RhdGVTdWJzY3JpcHRpb24gPSB0aGlzLmludGVybmFsVGFibGVTdGF0ZT8uc3RhdGVDaGFuZ2UkXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZS5lbWl0KGV2ZW50KTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlzaWJsZSBjb2x1bW5zIGFuZCBjZWxsIGdyaWQgb24gdmlzaWJpbGl0eSBjaGFuZ2VzXG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnY29sdW1uLXZpc2liaWxpdHknIHx8IGV2ZW50LnR5cGUgPT09ICdjb2x1bW4tY29uZmlnJykge1xuICAgICAgICAgIHRoaXMudXBkYXRlVmlzaWJsZURhdGEoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIGV4dGVybmFsIFRhYmxlU3RhdGUgY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0V4dGVybmFsVGFibGVTdGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGFibGVTdGF0ZSkgcmV0dXJuO1xuICAgIFxuICAgIHRoaXMuc3RhdGVTdWJzY3JpcHRpb24gPSB0aGlzLnRhYmxlU3RhdGUuc3RhdGVDaGFuZ2UkXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSB2aXNpYmxlIGNvbHVtbnMgYW5kIGNlbGwgZ3JpZCBvbiB2aXNpYmlsaXR5IGNoYW5nZXNcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjb2x1bW4tdmlzaWJpbGl0eScgfHwgZXZlbnQudHlwZSA9PT0gJ2NvbHVtbi1jb25maWcnKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVWaXNpYmxlRGF0YSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBcbiAgICAvLyBTdWJzY3JpYmUgdG8gdmFsaWRhdGlvbiBzdGF0ZSBjaGFuZ2VzIGFuZCByZS1lbWl0XG4gICB0aGlzLnN1YnNjcmliZVRvVmFsaWRhdGlvblN0YXRlKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDcmVhdGUgY2VsbCBncmlkIGZyb20gcmF3IGRhdGFcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQ2VsbEdyaWRGcm9tRGF0YSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldEFjdGl2ZUNvbHVtbnMoKTtcbiAgICB0aGlzLmludGVybmFsQ2VsbEdyaWQgPSB0aGlzLmRhdGEubWFwKChyb3dEYXRhLCByb3dJbmRleCkgPT5cbiAgICAgIGNvbHVtbnMubWFwKGNvbHVtbiA9PiBcbiAgICAgICAgbmV3IENlbGwoY29sdW1uLCByb3dEYXRhW2NvbHVtbi5rZXldLCByb3dEYXRhLCByb3dJbmRleClcbiAgICAgIClcbiAgICApO1xuICB9XG4gIFxuICAvKipcbiAgICogU2V0dXAgZGF0YSBzb3VyY2UgLSBlaXRoZXIgc3luYyBhcnJheSBvciBhc3luYyBPYnNlcnZhYmxlXG4gICAqIEhhbmRsZXMgaW5pdGlhbGl6YXRpb24gYW5kIHN1YnNjcmlwdGlvbiB0byBkYXRhIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgc2V0dXBEYXRhU291cmNlKCk6IHZvaWQge1xuICAgIC8vIFdhcm4gaWYgYm90aCBkYXRhIGFuZCBkYXRhJCBhcmUgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YSQpIHtcbiAgICAgIGNvbnNvbGUud2FybignU3RUYWJsZUNvbXBvbmVudDogQm90aCBkYXRhIGFuZCBkYXRhJCBpbnB1dHMgYXJlIHByb3ZpZGVkLiBVc2luZyBkYXRhJCAoT2JzZXJ2YWJsZSkgYW5kIGlnbm9yaW5nIGRhdGEgYXJyYXkuJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIHN1YnNjcmlwdGlvblxuICAgIHRoaXMuZGF0YVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICBcbiAgICAvLyBQcmlvcml0eTogZGF0YSQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGRhdGFcbiAgICBpZiAodGhpcy5kYXRhJCkge1xuICAgICAgdGhpcy5zdWJzY3JpYmVUb0RhdGFDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgIC8vIEZvciBzeW5jIGRhdGEsIGVtaXQgb25jZSB0aHJvdWdoIGludGVybmFsIG9ic2VydmFibGVcbiAgICAgIHRoaXMucHJldmlvdXNEYXRhID0gW107XG4gICAgICB0aGlzLmludGVybmFsRGF0YSQubmV4dCh0aGlzLmRhdGEpO1xuICAgICAgdGhpcy5zdWJzY3JpYmVUb0RhdGFDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGRhdGEgcHJvdmlkZWQsIGVtaXQgZW1wdHkgYXJyYXlcbiAgICAgIHRoaXMucHJldmlvdXNEYXRhID0gW107XG4gICAgICB0aGlzLmludGVybmFsRGF0YSQubmV4dChbXSk7XG4gICAgICB0aGlzLnN1YnNjcmliZVRvRGF0YUNoYW5nZXMoKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gZGF0YSBjaGFuZ2VzIChlaXRoZXIgZnJvbSBkYXRhJCBpbnB1dCBvciBpbnRlcm5hbCBCZWhhdmlvclN1YmplY3QpXG4gICAqL1xuICBwcml2YXRlIHN1YnNjcmliZVRvRGF0YUNoYW5nZXMoKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YVNvdXJjZSQgPSB0aGlzLmRhdGEkIHx8IHRoaXMuaW50ZXJuYWxEYXRhJC5hc09ic2VydmFibGUoKTtcbiAgICBcbiAgICB0aGlzLmRhdGFTdWJzY3JpcHRpb24gPSBkYXRhU291cmNlJC5zdWJzY3JpYmUobmV3RGF0YSA9PiB7XG4gICAgICB0aGlzLmhhbmRsZURhdGFDaGFuZ2UobmV3RGF0YSk7XG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgZGF0YSBjaGFuZ2UgZnJvbSBPYnNlcnZhYmxlIGVtaXNzaW9uXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZURhdGFDaGFuZ2UobmV3RGF0YTogYW55W10pOiB2b2lkIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHNvdXJjZTogJ3N5bmMnIHwgJ2FzeW5jJyA9IHRoaXMuZGF0YSQgPyAnYXN5bmMnIDogJ3N5bmMnO1xuICAgIFxuICAgIC8vIEVtaXQgZGF0YSBjaGFuZ2UgZXZlbnRcbiAgICB0aGlzLmRhdGFDaGFuZ2UuZW1pdCh7XG4gICAgICBwcmV2aW91c0RhdGE6IHRoaXMucHJldmlvdXNEYXRhLFxuICAgICAgY3VycmVudERhdGE6IG5ld0RhdGEsXG4gICAgICB0aW1lc3RhbXAsXG4gICAgICBzb3VyY2VcbiAgICB9KTtcbiAgICBcbiAgICAvLyBVcGRhdGUgZGF0YSByZWZlcmVuY2VcbiAgICB0aGlzLmRhdGEgPSBuZXdEYXRhO1xuICAgIHRoaXMucHJldmlvdXNEYXRhID0gWy4uLm5ld0RhdGFdO1xuICAgIFxuICAgIC8vIFJlY3JlYXRlIGNlbGwgZ3JpZFxuICAgIHRoaXMuY3JlYXRlQ2VsbEdyaWRGcm9tRGF0YSgpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSB2aXNpYmxlIGRhdGFcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVEYXRhKCk7XG4gICAgXG4gICAgLy8gUmVjYWxjdWxhdGUgdmlydHVhbCBzY3JvbGwgaWYgZW5hYmxlZFxuICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSkge1xuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLnZhbHVlO1xuICAgICAgaWYgKGN1cnJlbnRTdGF0ZSkge1xuICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHRoaXMudmlydHVhbFNjcm9sbFNlcnZpY2UuY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHtcbiAgICAgICAgICBzY3JvbGxUb3A6IGN1cnJlbnRTdGF0ZS5zY3JvbGxUb3AsXG4gICAgICAgICAgdmlld3BvcnRIZWlnaHQ6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbFZpZXdwb3J0SGVpZ2h0KCksXG4gICAgICAgICAgdG90YWxJdGVtczogdGhpcy52aXNpYmxlQ2VsbEdyaWQubGVuZ3RoLFxuICAgICAgICAgIGl0ZW1TaXplOiB0aGlzLmdldFZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpLFxuICAgICAgICAgIGJ1ZmZlclNpemU6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbEJ1ZmZlclNpemUoKVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLm5leHQobmV3U3RhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUga2V5Ym9hcmQgbmF2aWdhdGlvbiBkaW1lbnNpb25zIGlmIGVuYWJsZWRcbiAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSkge1xuICAgICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkuc2V0RGltZW5zaW9ucyhcbiAgICAgICAgdGhpcy52aXNpYmxlQ2VsbEdyaWQubGVuZ3RoLFxuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zLmxlbmd0aFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgc3luYyBkYXRhIGNoYW5nZSAoZnJvbSBASW5wdXQoKSBkYXRhIGNoYW5nZXMpXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVN5bmNEYXRhQ2hhbmdlKHByZXZpb3VzRGF0YTogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLnByZXZpb3VzRGF0YSA9IHByZXZpb3VzRGF0YTtcbiAgICB0aGlzLmludGVybmFsRGF0YSQubmV4dCh0aGlzLmRhdGEgfHwgW10pO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGFjdGl2ZSBUYWJsZVN0YXRlIChwcm92aWRlZCBvciBpbnRlcm5hbClcbiAgICovXG4gIGdldEFjdGl2ZVRhYmxlU3RhdGUoKTogVGFibGVTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVTdGF0ZSB8fCB0aGlzLmludGVybmFsVGFibGVTdGF0ZSE7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgYWN0aXZlIGNlbGwgZ3JpZCAocHJvdmlkZWQgb3IgaW50ZXJuYWwpXG4gICAqL1xuICBnZXRBY3RpdmVDZWxsR3JpZCgpOiBDZWxsPGFueT5bXVtdIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcm5hbENlbGxHcmlkIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB2aXNpYmxlIGNlbGwgZ3JpZCAoZmlsdGVyZWQgdG8gb25seSBpbmNsdWRlIHZpc2libGUgY29sdW1ucylcbiAgICovXG4gIGdldFZpc2libGVDZWxsR3JpZCgpOiBDZWxsPGFueT5bXVtdIHtcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLmdldFZpc2libGVDb2x1bW5zKCk7XG4gICAgY29uc3QgdmlzaWJsZUNvbHVtbktleXMgPSBuZXcgU2V0KHZpc2libGVDb2x1bW5zLm1hcChjb2wgPT4gY29sLmtleSkpO1xuICAgIFxuICAgIC8vIEdldCBjb2x1bW4gaW5kaWNlcyBmb3IgdmlzaWJsZSBjb2x1bW5zXG4gICAgY29uc3QgdmlzaWJsZUluZGljZXMgPSBhbGxDb2x1bW5zXG4gICAgICAubWFwKChjb2wsIGluZGV4KSA9PiB2aXNpYmxlQ29sdW1uS2V5cy5oYXMoY29sLmtleSkgPyBpbmRleCA6IC0xKVxuICAgICAgLmZpbHRlcihpbmRleCA9PiBpbmRleCAhPT0gLTEpO1xuICAgIFxuICAgIGNvbnN0IGZ1bGxHcmlkID0gdGhpcy5nZXRBY3RpdmVDZWxsR3JpZCgpO1xuICAgIHJldHVybiBmdWxsR3JpZC5tYXAocm93ID0+IFxuICAgICAgdmlzaWJsZUluZGljZXMubWFwKGluZGV4ID0+IHJvd1tpbmRleF0pLmZpbHRlcihjZWxsID0+IGNlbGwgIT09IHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgdmlzaWJsZSBjZWxsIGdyaWQgYmFzZWQgb24gY3VycmVudCB2aXNpYmlsaXR5IGFuZCBjb2x1bW4gb3JkZXJcbiAgICogQ2FsbGVkIHdoZW4gZGF0YSwgdmlzaWJpbGl0eSwgb3IgY29sdW1uIG9yZGVyIGNoYW5nZXNcbiAgICogXG4gICAqIFRoaXMgbWV0aG9kIHByb3Blcmx5IGhhbmRsZXMgY29sdW1uIHJlb3JkZXJpbmcgYnkgbWFwcGluZyBjZWxscyBiYXNlZCBvblxuICAgKiBjb2x1bW4ga2V5cyByYXRoZXIgdGhhbiBpbmRpY2VzLCBlbnN1cmluZyBjZWxscyBmb2xsb3cgdGhlaXIgY29sdW1ucy5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJsZUNlbGxHcmlkKCk6IHZvaWQge1xuICAgIGNvbnN0IGZ1bGxHcmlkID0gdGhpcy5nZXRBY3RpdmVDZWxsR3JpZCgpO1xuICAgIFxuICAgIC8vIEhhbmRsZSBlbXB0eSBncmlkXG4gICAgaWYgKCFmdWxsR3JpZCB8fCBmdWxsR3JpZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMudmlzaWJsZUNlbGxHcmlkID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIEJ1aWxkIGEgbWFwIG9mIGNvbHVtbktleSDihpIgY2VsbEluZGV4IGZvciB0aGUgY3VycmVudCBncmlkIHN0cnVjdHVyZVxuICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIGZpbmQgY2VsbHMgYnkgY29sdW1uIGtleSByZWdhcmRsZXNzIG9mIHRoZWlyIGN1cnJlbnQgcG9zaXRpb25cbiAgICBjb25zdCBrZXlUb0luZGV4TWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBmdWxsR3JpZFswXT8uZm9yRWFjaCgoY2VsbCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbkNvbmZpZyA9IGNlbGwuZ2V0Q29sdW1uQ29uZmlnKCk7XG4gICAgICAgIGtleVRvSW5kZXhNYXAuc2V0KGNvbHVtbkNvbmZpZy5rZXksIGluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvLyBSZW9yZGVyIGNlbGxzIHRvIG1hdGNoIHRoZSB2aXNpYmxlQ29sdW1ucyBvcmRlclxuICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdoZW4gY29sdW1ucyBhcmUgbW92ZWQsIHRoZSBjZWxsIGRhdGEgZm9sbG93c1xuICAgIHRoaXMudmlzaWJsZUNlbGxHcmlkID0gZnVsbEdyaWQubWFwKHJvdyA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29sdW1uc1xuICAgICAgICAubWFwKGNvbCA9PiB7XG4gICAgICAgICAgY29uc3QgY2VsbEluZGV4ID0ga2V5VG9JbmRleE1hcC5nZXQoY29sLmtleSk7XG4gICAgICAgICAgcmV0dXJuIGNlbGxJbmRleCAhPT0gdW5kZWZpbmVkID8gcm93W2NlbGxJbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKGNlbGwpOiBjZWxsIGlzIENlbGw8YW55PiA9PiBjZWxsICE9PSB1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgdmlzaWJsZSBjb2x1bW5zIGJhc2VkIG9uIGN1cnJlbnQgdmlzaWJpbGl0eVxuICAgKiBDYWxsZWQgb25seSB3aGVuIHZpc2liaWxpdHkgYWN0dWFsbHkgY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmxlQ29sdW1ucygpOiB2b2lkIHtcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wudmlzaWJsZSAhPT0gZmFsc2UpO1xuICAgIFxuICAgIC8vIFJlY2FsY3VsYXRlIHN0aWNreSBvZmZzZXRzIGZvciB2aXNpYmxlIGNvbHVtbnMgb25seVxuICAgIHRoaXMucmVjYWxjdWxhdGVWaXNpYmxlU3RpY2t5T2Zmc2V0cyh0aGlzLnZpc2libGVDb2x1bW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYm90aCB2aXNpYmxlIGNvbHVtbnMgYW5kIGNlbGwgZ3JpZFxuICAgKiBDYWxsIHRoaXMgd2hlbmV2ZXIgZGF0YSBvciB2aXNpYmlsaXR5IGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJsZURhdGEoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlQ29sdW1ucygpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUNlbGxHcmlkKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgYWN0aXZlIGNvbHVtbnMgKGZyb20gY29uZmlnIG9yIGxlZ2FjeSBpbnB1dClcbiAgICovXG4gIGdldEFjdGl2ZUNvbHVtbnMoKTogQ29sdW1uQ29uZmlnPGFueT5bXSB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VkQ29uZmlnLmNvbHVtbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZpc2libGUgY29sdW1ucyAoZmlsdGVyZWQgYnkgdmlzaWJpbGl0eSBwcm9wZXJ0eSlcbiAgICogQWxzbyByZWNhbGN1bGF0ZXMgc3RpY2t5IG9mZnNldHMgYmFzZWQgb24gdmlzaWJsZSBjb2x1bW5zIG9ubHlcbiAgICovXG4gIGdldFZpc2libGVDb2x1bW5zKCk6IENvbHVtbkNvbmZpZzxhbnk+W10ge1xuICAgIGNvbnN0IGFsbENvbHVtbnMgPSB0aGlzLmdldEFjdGl2ZUNvbHVtbnMoKTtcbiAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wudmlzaWJsZSAhPT0gZmFsc2UpOyAvLyBEZWZhdWx0IHRvIHRydWUgaWYgbm90IHNldFxuICAgIFxuICAgIC8vIFJlY2FsY3VsYXRlIHN0aWNreSBvZmZzZXRzIGZvciB2aXNpYmxlIGNvbHVtbnMgb25seVxuICAgIHRoaXMucmVjYWxjdWxhdGVWaXNpYmxlU3RpY2t5T2Zmc2V0cyh2aXNpYmxlQ29sdW1ucyk7XG4gICAgXG4gICAgcmV0dXJuIHZpc2libGVDb2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYXRlIHN0aWNreSBvZmZzZXRzIGJhc2VkIG9uIHZpc2libGUgY29sdW1ucyBvbmx5XG4gICAqIFRoaXMgZW5zdXJlcyBjb3JyZWN0IHBvc2l0aW9uaW5nIHdoZW4gY29sdW1ucyBhcmUgaGlkZGVuXG4gICAqL1xuICBwcml2YXRlIHJlY2FsY3VsYXRlVmlzaWJsZVN0aWNreU9mZnNldHModmlzaWJsZUNvbHVtbnM6IENvbHVtbkNvbmZpZzxhbnk+W10pOiB2b2lkIHtcbiAgICAvLyBDYWxjdWxhdGUgbGVmdCBzdGlja3kgb2Zmc2V0c1xuICAgIC8vIEFjY291bnQgZm9yIHJvdyBudW1iZXIgY29sdW1uIHdpZHRoIGlmIHNob3duXG4gICAgbGV0IGxlZnRPZmZzZXQgPSB0aGlzLm1lcmdlZENvbmZpZy5zaG93Um93TnVtYmVyID8gMzAgOiAwO1xuICAgIHZpc2libGVDb2x1bW5zLmZvckVhY2goY29sID0+IHtcbiAgICAgIGlmIChjb2wuc3RpY2t5ID09PSAnbGVmdCcpIHtcbiAgICAgICAgKGNvbCBhcyBhbnkpLnN0aWNreU9mZnNldCA9IGxlZnRPZmZzZXQ7XG4gICAgICAgIGxlZnRPZmZzZXQgKz0gKGNvbC53aWR0aCBhcyBudW1iZXIpIHx8IDEwMDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENhbGN1bGF0ZSByaWdodCBzdGlja3kgb2Zmc2V0c1xuICAgIGxldCByaWdodE9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IHZpc2libGVDb2x1bW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBjb2wgPSB2aXNpYmxlQ29sdW1uc1tpXTtcbiAgICAgIGlmIChjb2wuc3RpY2t5ID09PSAncmlnaHQnKSB7XG4gICAgICAgIChjb2wgYXMgYW55KS5zdGlja3lPZmZzZXQgPSByaWdodE9mZnNldDtcbiAgICAgICAgcmlnaHRPZmZzZXQgKz0gKGNvbC53aWR0aCBhcyBudW1iZXIpIHx8IDEwMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkNlbGxDaGFuZ2UoZXZlbnQ6IENlbGxDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2VsbENoYW5nZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uQ29sdW1uUmVzaXplZChldmVudDogQ29sdW1uUmVzaXplRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBSZWNhbGN1bGF0ZSBzdGlja3kgb2Zmc2V0cyBhZnRlciByZXNpemVcbiAgICBjb25zdCByb3dOdW1iZXJXaWR0aCA9IHRoaXMubWVyZ2VkQ29uZmlnLnNob3dSb3dOdW1iZXIgPyAzMCA6IDA7XG4gICAgY29uc3Qgc2V0dGluZ3NDb2x1bW5XaWR0aCA9IHRoaXMuaGFzUm93QWN0aW9ucygpID8gMzIgOiAwO1xuICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLmNhbGN1bGF0ZVN0aWNreU9mZnNldHMocm93TnVtYmVyV2lkdGgsIHNldHRpbmdzQ29sdW1uV2lkdGgpO1xuICAgIFxuICAgIC8vIEVtaXQgdG8gcGFyZW50XG4gICAgdGhpcy5jb2x1bW5SZXNpemVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25Db2x1bW5Nb3ZlZChldmVudDoge2NvbHVtbktleTogc3RyaW5nLCBkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCd9KTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ2V0QWN0aXZlQ29sdW1ucygpO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGNvbHVtbnMuZmluZEluZGV4KGMgPT4gYy5rZXkgPT09IGV2ZW50LmNvbHVtbktleSk7XG4gICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gLTEpIHJldHVybjtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgdGFyZ2V0IGluZGV4XG4gICAgY29uc3QgdGFyZ2V0SW5kZXggPSBldmVudC5kaXJlY3Rpb24gPT09ICdsZWZ0JyBcbiAgICAgID8gY3VycmVudEluZGV4IC0gMSBcbiAgICAgIDogY3VycmVudEluZGV4ICsgMTtcbiAgICBcbiAgICAvLyBDaGVjayBib3VuZHNcbiAgICBpZiAodGFyZ2V0SW5kZXggPCAwIHx8IHRhcmdldEluZGV4ID49IGNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIFN3YXAgY29sdW1uc1xuICAgIFtjb2x1bW5zW2N1cnJlbnRJbmRleF0sIGNvbHVtbnNbdGFyZ2V0SW5kZXhdXSA9IFxuICAgIFtjb2x1bW5zW3RhcmdldEluZGV4XSwgY29sdW1uc1tjdXJyZW50SW5kZXhdXTtcbiAgICBcbiAgICAvLyBVcGRhdGUgVGFibGVTdGF0ZSB3aXRoIG5ldyBjb2x1bW4gb3JkZXJcbiAgICB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKS51cGRhdGVDb2x1bW5zKGNvbHVtbnMpO1xuICAgIHRoaXMuY29sdW1uTW92ZWQuZW1pdCh7XG4gICAgICBjb2x1bW5LZXk6IGV2ZW50LmNvbHVtbktleSxcbiAgICAgIGRpcmVjdGlvbjogZXZlbnQuZGlyZWN0aW9uLFxuICAgICAgb2xkSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgIG5ld0luZGV4OiB0YXJnZXRJbmRleCxcbiAgICAgIGNvbHVtbjogY29sdW1uc1tjdXJyZW50SW5kZXhdXG4gICAgfSk7XG4gICAgLy8gRm9yY2UgdmlydHVhbCBzY3JvbGwgdG8gcmUtcmVuZGVyIGJ5IHJlLWVtaXR0aW5nIGN1cnJlbnQgc3RhdGVcbiAgICAvLyBUaGlzIGVuc3VyZXMgdmlzaWJsZVJvd3MkIHBpY2tzIHVwIHRoZSB1cGRhdGVkIHZpc2libGVDZWxsR3JpZFxuICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSkge1xuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLnZhbHVlO1xuICAgICAgaWYgKGN1cnJlbnRTdGF0ZSkge1xuICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQubmV4dCh7Li4uY3VycmVudFN0YXRlfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgY29sdW1uIHRvIHBvc2l0aW9uIGp1c3QgYmVmb3JlIHJpZ2h0IHN0aWNreSBjb2x1bW5zICh1c2VkIHdoZW4gcGlubmluZyByaWdodClcbiAgICovXG4gIHByaXZhdGUgbW92ZUNvbHVtblRvRW5kKGNvbHVtbktleTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ2V0QWN0aXZlQ29sdW1ucygpO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGNvbHVtbnMuZmluZEluZGV4KGMgPT4gYy5rZXkgPT09IGNvbHVtbktleSk7XG4gICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gLTEpIHJldHVybjtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgcmlnaHQtc3RpY2t5IGNvbHVtblxuICAgIGNvbnN0IGZpcnN0UmlnaHRTdGlja3lJbmRleCA9IGNvbHVtbnMuZmluZEluZGV4KGMgPT4gYy5zdGlja3kgPT09ICdyaWdodCcpO1xuICAgIFxuICAgIC8vIERldGVybWluZSB0YXJnZXQgaW5kZXg6IGp1c3QgYmVmb3JlIGZpcnN0IHJpZ2h0LXN0aWNreSwgb3IgYXQgZW5kIGlmIG5vbmUgZXhpc3RcbiAgICBjb25zdCB0YXJnZXRJbmRleCA9IGZpcnN0UmlnaHRTdGlja3lJbmRleCAhPT0gLTEgPyBmaXJzdFJpZ2h0U3RpY2t5SW5kZXggOiBjb2x1bW5zLmxlbmd0aDtcbiAgICBcbiAgICAvLyBJZiBhbHJlYWR5IGF0IHRhcmdldCBwb3NpdGlvbiwgbm8gbmVlZCB0byBtb3ZlXG4gICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gdGFyZ2V0SW5kZXggfHwgY3VycmVudEluZGV4ID09PSB0YXJnZXRJbmRleCAtIDEpIHJldHVybjtcbiAgICBcbiAgICAvLyBSZW1vdmUgY29sdW1uIGZyb20gY3VycmVudCBwb3NpdGlvblxuICAgIGNvbnN0IFtjb2x1bW5dID0gY29sdW1ucy5zcGxpY2UoY3VycmVudEluZGV4LCAxKTtcbiAgICBcbiAgICAvLyBBZGp1c3QgdGFyZ2V0IGluZGV4IGlmIHdlIHJlbW92ZWQgYW4gZWxlbWVudCBiZWZvcmUgaXRcbiAgICBjb25zdCBhZGp1c3RlZFRhcmdldEluZGV4ID0gY3VycmVudEluZGV4IDwgdGFyZ2V0SW5kZXggPyB0YXJnZXRJbmRleCAtIDEgOiB0YXJnZXRJbmRleDtcbiAgICBcbiAgICAvLyBJbnNlcnQgYXQgdGFyZ2V0IHBvc2l0aW9uIChiZWZvcmUgZmlyc3QgcmlnaHQtc3RpY2t5IGNvbHVtbiwgb3IgYXQgZW5kKVxuICAgIGNvbHVtbnMuc3BsaWNlKGFkanVzdGVkVGFyZ2V0SW5kZXgsIDAsIGNvbHVtbik7XG4gICAgXG4gICAgLy8gVXBkYXRlIFRhYmxlU3RhdGUgd2l0aCBuZXcgY29sdW1uIG9yZGVyXG4gICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkudXBkYXRlQ29sdW1ucyhjb2x1bW5zKTtcbiAgICBcbiAgICAvLyBGb3JjZSB2aXJ0dWFsIHNjcm9sbCB0byByZS1yZW5kZXJcbiAgICBpZiAodGhpcy5pc1ZpcnR1YWxTY3JvbGxFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMudmlydHVhbFNjcm9sbFN0YXRlJC52YWx1ZTtcbiAgICAgIGlmIChjdXJyZW50U3RhdGUpIHtcbiAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLm5leHQoey4uLmN1cnJlbnRTdGF0ZX0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VtdWxhdGl2ZSBsZWZ0IG9mZnNldCBmb3IgYSBzdGlja3kgY29sdW1uIG9uIHRoZSBsZWZ0IHNpZGVcbiAgICovXG4gIGdldFN0aWNreUxlZnRPZmZzZXQoY29sdW1uS2V5OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldEFjdGl2ZUNvbHVtbnMoKTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2x1bW5zKSB7XG4gICAgICBpZiAoY29sLmtleSA9PT0gY29sdW1uS2V5KSBicmVhaztcbiAgICAgIGlmIChjb2wuc3RpY2t5ID09PSAnbGVmdCcpIHtcbiAgICAgICAgb2Zmc2V0ICs9IChjb2wud2lkdGggYXMgbnVtYmVyKSB8fCAxMDA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZmZzZXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1bXVsYXRpdmUgcmlnaHQgb2Zmc2V0IGZvciBhIHN0aWNreSBjb2x1bW4gb24gdGhlIHJpZ2h0IHNpZGVcbiAgICovXG4gIGdldFN0aWNreVJpZ2h0T2Zmc2V0KGNvbHVtbktleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgY29uc3QgY29sSW5kZXggPSBjb2x1bW5zLmZpbmRJbmRleChjID0+IGMua2V5ID09PSBjb2x1bW5LZXkpO1xuICAgIGZvciAobGV0IGkgPSBjb2xJbmRleCArIDE7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjb2wgPSBjb2x1bW5zW2ldO1xuICAgICAgaWYgKGNvbC5zdGlja3kgPT09ICdyaWdodCcpIHtcbiAgICAgICAgb2Zmc2V0ICs9IChjb2wud2lkdGggYXMgbnVtYmVyKSB8fCAxMDA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZmZzZXQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0b3AgcGFnaW5hdGlvbiBzaG91bGQgYmUgc2hvd25cbiAgICovXG4gIHNob3dUb3BQYWdpbmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1lcmdlZENvbmZpZy5wYWdpbmF0aW9uPy5lbmFibGVkID09IHRydWUgJiZcbiAgICAgICAgICAgdGhpcy5tZXJnZWRDb25maWcucGFnaW5hdGlvbj8uc2hvd1RvcENvbnRyb2xzID09PSB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgYm90dG9tIHBhZ2luYXRpb24gc2hvdWxkIGJlIHNob3duXG4gICAqL1xuICBzaG93Qm90dG9tUGFnaW5hdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZWRDb25maWcucGFnaW5hdGlvbj8uZW5hYmxlZCA9PSB0cnVlICYmXG4gICAgICAgICAgICh0aGlzLm1lcmdlZENvbmZpZy5wYWdpbmF0aW9uPy5zaG93Qm90dG9tQ29udHJvbHMgPz8gdHJ1ZSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0YWJsZSBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBjb25maWcgVGFibGUgY29uZmlndXJhdGlvbiB0byB2YWxpZGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNvbmZpZ3VyYXRpb24oY29uZmlnOiBUYWJsZUNvbmZpZyk6IHZvaWQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2NoZW1hVmFsaWRhdG9yLnZhbGlkYXRlKGNvbmZpZywgdHJ1ZSwgZmFsc2UpOyAvLyBEaXNhYmxlIGxvZ2dpbmcgaGVyZSwgd2UnbGwgbG9nIG1hbnVhbGx5IHdpdGggY29udGV4dFxuICAgIFxuICAgIGlmICghcmVzdWx0LnZhbGlkICYmIHJlc3VsdC5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gRW1pdCB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAgdGhpcy5jb25maWdWYWxpZGF0aW9uRXJyb3JzLmVtaXQocmVzdWx0LmVycm9ycyk7XG4gICAgICBcbiAgICAgIC8vIExvZyB2YWxpZGF0aW9uIGVycm9ycyB3aXRoIGNvbnRleHRcbiAgICAgIGNvbnN0IGNvbmZpZ1NuaXBwZXQgPSBKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpLnN1YnN0cmluZygwLCA1MDApOyAvLyBGaXJzdCA1MDAgY2hhcnMgb2YgY29uZmlnXG4gICAgICB0aGlzLmxvZ2dlci5sb2dWYWxpZGF0aW9uRXJyb3JzKHJlc3VsdC5lcnJvcnMsICdyZW5kZXJlcicsIHtcbiAgICAgICAgY29uZmlnU25pcHBldDogY29uZmlnU25pcHBldFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIExvZyB3YXJuaW5ncyB0byBjb25zb2xlIChkb24ndCBicmVhayByZW5kZXJpbmcpXG4gICAgICBjb25zb2xlLndhcm4oJ1NtYXJ0IFRhYmxlOiBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gZXJyb3JzIGRldGVjdGVkOicsIHJlc3VsdC5lcnJvcnMpO1xuICAgICAgcmVzdWx0LmVycm9ycy5mb3JFYWNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKGAgIC0gJHtlcnJvci5maWVsZCB8fCBlcnJvci5wYXRofTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIGFkZCBjb2x1bW4gYnV0dG9uIGNsaWNrXG4gICAqL1xuICBvbkFkZENvbHVtbkNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0NvbHVtbk1vZGFsID0gdHJ1ZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBjb2x1bW4gY3JlYXRlZCBmcm9tIG1vZGFsXG4gICAqL1xuICBvbkNvbHVtbkNyZWF0ZWQoY29sdW1uOiBDb2x1bW5Db25maWcpOiB2b2lkIHtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgY29uc3QgYWRkRXZlbnQ6IENvbHVtbkFkZEV2ZW50ID0ge1xuICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICBpbmRleDogY29sdW1ucy5sZW5ndGgsXG4gICAgICB0b3RhbENvbHVtbnM6IGNvbHVtbnMubGVuZ3RoICsgMVxuICAgIH07XG4gICAgXG4gICAgLy8gRW1pdCB0aGUgbmV3IGNvbHVtbiB0byBwYXJlbnQgY29tcG9uZW50XG4gICAgdGhpcy5jb2x1bW5BZGRlZC5lbWl0KGFkZEV2ZW50KTtcbiAgICBcbiAgICAvLyBDbG9zZSB0aGUgbW9kYWxcbiAgICB0aGlzLnNob3dDb2x1bW5Nb2RhbCA9IGZhbHNlO1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIG1vZGFsIGNhbmNlbGxlZFxuICAgKi9cbiAgb25Nb2RhbENhbmNlbGxlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dDb2x1bW5Nb2RhbCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHZpcnR1YWwgc2Nyb2xsIGlzIGVuYWJsZWRcbiAgICovXG4gIGlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VkQ29uZmlnLmRpc3BsYXk/LnZpcnR1YWxTY3JvbGw/LmVuYWJsZWQgPz8gZmFsc2U7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjb2x1bW4gaXMgdGhlIGZpcnN0IHN0aWNreS1yaWdodCBjb2x1bW4gKGZvciBzaGFkb3cgc3R5bGluZylcbiAgICovXG4gIGlzRmlyc3RTdGlja3lSaWdodChjb2x1bW5LZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0aWNreVJpZ2h0Q29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuc3RpY2t5ID09PSAncmlnaHQnICYmICFjb2wua2V5LmluY2x1ZGVzKCdzZXR0aW5ncycpKTtcbiAgICByZXR1cm4gc3RpY2t5UmlnaHRDb2x1bW5zLmxlbmd0aCA+IDAgJiYgc3RpY2t5UmlnaHRDb2x1bW5zWzBdLmtleSA9PT0gY29sdW1uS2V5O1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHZpcnR1YWwgc2Nyb2xsIGl0ZW0gc2l6ZVxuICAgKi9cbiAgZ2V0VmlydHVhbFNjcm9sbEl0ZW1TaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VkQ29uZmlnLmRpc3BsYXk/LnZpcnR1YWxTY3JvbGw/Lml0ZW1TaXplID8/IDQ4O1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHZpZXdwb3J0IGhlaWdodFxuICAgKi9cbiAgZ2V0VmlydHVhbFNjcm9sbFZpZXdwb3J0SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VkQ29uZmlnLmRpc3BsYXk/LnZpcnR1YWxTY3JvbGw/LnZpZXdwb3J0SGVpZ2h0ID8/IDYwMDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBidWZmZXIgc2l6ZVxuICAgKi9cbiAgZ2V0VmlydHVhbFNjcm9sbEJ1ZmZlclNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZWRDb25maWcuZGlzcGxheT8udmlydHVhbFNjcm9sbD8uYnVmZmVyU2l6ZSA/PyA1O1xuICB9XG4gIFxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB2aXJ0dWFsIHNjcm9sbCBzdGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplVmlydHVhbFNjcm9sbCgpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHRoaXMudmlydHVhbFNjcm9sbFNlcnZpY2UuY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHtcbiAgICAgIHNjcm9sbFRvcDogMCxcbiAgICAgIHZpZXdwb3J0SGVpZ2h0OiB0aGlzLmdldFZpcnR1YWxTY3JvbGxWaWV3cG9ydEhlaWdodCgpLFxuICAgICAgdG90YWxJdGVtczogdGhpcy52aXNpYmxlQ2VsbEdyaWQubGVuZ3RoLFxuICAgICAgaXRlbVNpemU6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbEl0ZW1TaXplKCksXG4gICAgICBidWZmZXJTaXplOiB0aGlzLmdldFZpcnR1YWxTY3JvbGxCdWZmZXJTaXplKClcbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQubmV4dChuZXdTdGF0ZSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZXR1cCBzY3JvbGwgZXZlbnQgbGlzdGVuZXJcbiAgICovXG4gIHByaXZhdGUgc2V0dXBWaXJ0dWFsU2Nyb2xsTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNjcm9sbFZpZXdwb3J0KSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuc2Nyb2xsVmlld3BvcnQubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lciA9IGVsZW1lbnQ7XG4gICAgXG4gICAgdGhpcy5zY3JvbGxTdWJzY3JpcHRpb24gPSB0aGlzLnZpcnR1YWxTY3JvbGxTZXJ2aWNlXG4gICAgICAuY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZShlbGVtZW50KVxuICAgICAgLnN1YnNjcmliZShzY3JvbGxUb3AgPT4gdGhpcy5vblZpcnR1YWxTY3JvbGwoc2Nyb2xsVG9wKSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgdmlydHVhbCBzY3JvbGwgZXZlbnRcbiAgICovXG4gIHByaXZhdGUgb25WaXJ0dWFsU2Nyb2xsKHNjcm9sbFRvcDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbmV3U3RhdGUgPSB0aGlzLnZpcnR1YWxTY3JvbGxTZXJ2aWNlLmNhbGN1bGF0ZVZpc2libGVSYW5nZSh7XG4gICAgICBzY3JvbGxUb3AsXG4gICAgICB2aWV3cG9ydEhlaWdodDogdGhpcy5nZXRWaXJ0dWFsU2Nyb2xsVmlld3BvcnRIZWlnaHQoKSxcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudmlzaWJsZUNlbGxHcmlkLmxlbmd0aCxcbiAgICAgIGl0ZW1TaXplOiB0aGlzLmdldFZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpLFxuICAgICAgYnVmZmVyU2l6ZTogdGhpcy5nZXRWaXJ0dWFsU2Nyb2xsQnVmZmVyU2l6ZSgpXG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLm5leHQobmV3U3RhdGUpO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHJvdyBpbmRleCBmb3IgdHJhY2tpbmdcbiAgICovXG4gIGdldEFic29sdXRlUm93SW5kZXgocmVsYXRpdmVJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQudmFsdWU7XG4gICAgaWYgKCFjdXJyZW50U3RhdGUpIHJldHVybiByZWxhdGl2ZUluZGV4O1xuICAgIHJldHVybiBjdXJyZW50U3RhdGUuc3RhcnRJbmRleCArIHJlbGF0aXZlSW5kZXg7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBUcmFja0J5IGZ1bmN0aW9uIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICovXG4gIHRyYWNrQnlSb3dJbmRleCA9IChpbmRleDogbnVtYmVyLCByb3c6IENlbGw8YW55PltdKTogbnVtYmVyID0+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRBYnNvbHV0ZVJvd0luZGV4KGluZGV4KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFNjcm9sbCB0byBzcGVjaWZpYyByb3cgcHJvZ3JhbW1hdGljYWxseVxuICAgKi9cbiAgc2Nyb2xsVG9Sb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zY3JvbGxDb250YWluZXIgfHwgIXRoaXMuaXNWaXJ0dWFsU2Nyb2xsRW5hYmxlZCgpKSByZXR1cm47XG4gICAgXG4gICAgY29uc3Qgc2Nyb2xsVG9wID0gaW5kZXggKiB0aGlzLmdldFZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpO1xuICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIHJvdyBhY3Rpb25zIGFyZSBlbmFibGVkXG4gICAqL1xuICBoYXNSb3dBY3Rpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLm1lcmdlZENvbmZpZy5mZWF0dXJlcz8ucm93TWFuYWdlbWVudD8uYWN0aW9ucyAmJiBcbiAgICAgICAgICAgICAgdGhpcy5tZXJnZWRDb25maWcuZmVhdHVyZXMucm93TWFuYWdlbWVudC5hY3Rpb25zLmxlbmd0aCA+IDApO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHJvdyBhY3Rpb25zIGZyb20gY29uZmlnXG4gICAqL1xuICBnZXRSb3dBY3Rpb25zKCk6IFJvd0FjdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZWRDb25maWcuZmVhdHVyZXM/LnJvd01hbmFnZW1lbnQ/LmFjdGlvbnMgfHwgW107XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgcm93IGRhdGEgZnJvbSBjZWxsIGdyaWRcbiAgICovXG4gIGdldFJvd0RhdGEocm93SW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgY29uc3QgY2VsbEdyaWQgPSB0aGlzLmdldEFjdGl2ZUNlbGxHcmlkKCk7XG4gICAgaWYgKCFjZWxsR3JpZCB8fCByb3dJbmRleCA8IDAgfHwgcm93SW5kZXggPj0gY2VsbEdyaWQubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgY29uc3Qgcm93ID0gY2VsbEdyaWRbcm93SW5kZXhdO1xuICAgIGlmICghcm93IHx8IHJvdy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICAvLyBHZXQgcmF3IGRhdGEgZnJvbSBmaXJzdCBjZWxsIChhbGwgY2VsbHMgaW4gYSByb3cgc2hhcmUgdGhlIHNhbWUgcm93RGF0YSlcbiAgICByZXR1cm4gcm93WzBdPy5nZXRSb3dEYXRhKCkgfHwgbnVsbDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIE9wZW4gcm93IGFjdGlvbnMgZHJvcGRvd25cbiAgICovXG4gIG9wZW5Sb3dBY3Rpb25zRHJvcGRvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIHJvd0RhdGE6IGFueSwgcm93SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIFxuICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbiAoYmVsb3cgdGhlIGJ1dHRvbiBieSBkZWZhdWx0KVxuICAgIGNvbnN0IHBvc2l0aW9uID0ge1xuICAgICAgeDogcmVjdC5sZWZ0LFxuICAgICAgeTogcmVjdC5ib3R0b20gKyA0IC8vIDRweCBnYXBcbiAgICB9O1xuICAgIFxuICAgIC8vIENyZWF0ZSBjb250ZXh0XG4gICAgY29uc3QgY29udGV4dDogUm93QWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIHJvd0RhdGEsXG4gICAgICByb3dJbmRleCxcbiAgICAgIGFjdGlvbnM6IHRoaXMuZ2V0Um93QWN0aW9ucygpXG4gICAgfTtcbiAgICBcbiAgICAvLyBVcGRhdGUgZHJvcGRvd24gc3RhdGVcbiAgICB0aGlzLmRyb3Bkb3duU3RhdGUgPSB7XG4gICAgICBpc09wZW46IHRydWUsXG4gICAgICBwb3NpdGlvbixcbiAgICAgIGNvbnRleHRcbiAgICB9O1xuICAgIFxuICAgIC8vIERpc2FibGUgYm9keSBzY3JvbGxcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgXG4gICAgLy8gSWYgdmlydHVhbCBzY3JvbGwgaXMgZW5hYmxlZCwgYWRkIHNjcm9sbCBsaXN0ZW5lciB0byBjbG9zZSBkcm9wZG93blxuICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSAmJiB0aGlzLnNjcm9sbENvbnRhaW5lcikge1xuICAgICAgY29uc3Qgc2Nyb2xsTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2VSb3dBY3Rpb25zRHJvcGRvd24oKTtcbiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXI/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbExpc3RlbmVyKTtcbiAgICAgIH07XG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxMaXN0ZW5lciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENsb3NlIHJvdyBhY3Rpb25zIGRyb3Bkb3duXG4gICAqL1xuICBjbG9zZVJvd0FjdGlvbnNEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmRyb3Bkb3duU3RhdGUgPSB7XG4gICAgICBpc09wZW46IGZhbHNlLFxuICAgICAgcG9zaXRpb246IHsgeDogMCwgeTogMCB9LFxuICAgICAgY29udGV4dDogbnVsbFxuICAgIH07XG4gICAgXG4gICAgLy8gUmUtZW5hYmxlIGJvZHkgc2Nyb2xsXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHJvdyBhY3Rpb24gY2xpY2tlZFxuICAgKi9cbiAgb25Sb3dBY3Rpb25DbGlja2VkKGV2ZW50OiBSb3dBY3Rpb25FdmVudCk6IHZvaWQge1xuICAgIC8vIEV4ZWN1dGUgYWN0aW9uIGNhbGxiYWNrIGlmIHByb3ZpZGVkXG4gICAgaWYgKGV2ZW50LmFjdGlvbi5hY3Rpb24pIHtcbiAgICAgIGV2ZW50LmFjdGlvbi5hY3Rpb24oZXZlbnQucm93RGF0YSwgZXZlbnQucm93SW5kZXgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBFbWl0IGV2ZW50IHRvIHBhcmVudFxuICAgIHRoaXMucm93QWN0aW9uLmVtaXQoZXZlbnQpO1xuICAgIFxuICAgIC8vIENsb3NlIGRyb3Bkb3duXG4gICAgdGhpcy5jbG9zZVJvd0FjdGlvbnNEcm9wZG93bigpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDT0xVTU4gTUVOVSBBQ1RJT05TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT3BlbiBjb2x1bW4gbWVudSBkcm9wZG93blxuICAgKi9cbiAgb3BlbkNvbHVtbk1lbnUoZXZlbnQ6IE1vdXNlRXZlbnQsIGNvbHVtbjogQ29sdW1uQ29uZmlnPGFueT4sIGNvbHVtbkluZGV4OiBudW1iZXIsIGlzRmlyc3Q6IGJvb2xlYW4sIGlzTGFzdDogYm9vbGVhbik6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IHJlY3QgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gKGJlbG93IHRoZSBidXR0b24gYnkgZGVmYXVsdClcbiAgICBjb25zdCBwb3NpdGlvbiA9IHtcbiAgICAgIHg6IHJlY3QubGVmdCxcbiAgICAgIHk6IHJlY3QuYm90dG9tICsgNCAvLyA0cHggZ2FwXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBjb250ZXh0XG4gICAgY29uc3QgY29udGV4dDogQ29sdW1uQWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIGNvbHVtbixcbiAgICAgIGNvbHVtbkluZGV4LFxuICAgICAgaXNGaXJzdENvbHVtbjogaXNGaXJzdCxcbiAgICAgIGlzTGFzdENvbHVtbjogaXNMYXN0LFxuICAgICAgdGFibGVTdGF0ZTogdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCksXG4gICAgICBhY3Rpb25zOiB0aGlzLmdldENvbHVtbkFjdGlvbnMoY29sdW1uLCBjb2x1bW5JbmRleCwgaXNGaXJzdCwgaXNMYXN0KVxuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgY29sdW1uIG1lbnUgc3RhdGVcbiAgICB0aGlzLmNvbHVtbk1lbnVTdGF0ZSA9IHtcbiAgICAgIGlzT3BlbjogdHJ1ZSxcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgY29udGV4dFxuICAgIH07XG5cbiAgICAvLyBEaXNhYmxlIGJvZHkgc2Nyb2xsXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuXG4gICAgLy8gSWYgdmlydHVhbCBzY3JvbGwgaXMgZW5hYmxlZCwgYWRkIHNjcm9sbCBsaXN0ZW5lciB0byBjbG9zZSBkcm9wZG93blxuICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSAmJiB0aGlzLnNjcm9sbENvbnRhaW5lcikge1xuICAgICAgY29uc3Qgc2Nyb2xsTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2VDb2x1bW5NZW51KCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyPy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxMaXN0ZW5lcik7XG4gICAgICB9O1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgY29sdW1uIG1lbnUgZHJvcGRvd25cbiAgICovXG4gIGNsb3NlQ29sdW1uTWVudSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbHVtbk1lbnVTdGF0ZSA9IHtcbiAgICAgIGlzT3BlbjogZmFsc2UsXG4gICAgICBwb3NpdGlvbjogeyB4OiAwLCB5OiAwIH0sXG4gICAgICBjb250ZXh0OiBudWxsXG4gICAgfTtcblxuICAgIC8vIFJlLWVuYWJsZSBib2R5IHNjcm9sbFxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY29sdW1uIGFjdGlvbiBjbGlja2VkXG4gICAqL1xuICBvbkNvbHVtbkFjdGlvbkNsaWNrZWQoZXZlbnQ6IENvbHVtbkFjdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgLy8gRXhlY3V0ZSBhY3Rpb24gY2FsbGJhY2sgaWYgcHJvdmlkZWRcbiAgICBpZiAoZXZlbnQuYWN0aW9uLmFjdGlvbikge1xuICAgICAgZXZlbnQuYWN0aW9uLmFjdGlvbihldmVudC5jb2x1bW4sIGV2ZW50LmNvbHVtbkluZGV4KTtcbiAgICB9XG5cbiAgICAvLyBEb24ndCBjbG9zZSBtZW51IGlmIGl0J3MgYSBmaWx0ZXIgYWN0aW9uIChmaWx0ZXIgbmVlZHMgbWVudSB0byBzdGF5IG9wZW4pXG4gICAgaWYgKGV2ZW50LmFjdGlvbi5pZCA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBkcm9wZG93biBmb3Igb3RoZXIgYWN0aW9uc1xuICAgIHRoaXMuY2xvc2VDb2x1bW5NZW51KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbHVtbiBhY3Rpb25zIChidWlsdC1pbiArIGN1c3RvbSlcbiAgICovXG4gIHByaXZhdGUgZ2V0Q29sdW1uQWN0aW9ucyhcbiAgICBjb2x1bW46IENvbHVtbkNvbmZpZzxhbnk+LCBcbiAgICBjb2x1bW5JbmRleDogbnVtYmVyLCBcbiAgICBpc0ZpcnN0OiBib29sZWFuLCBcbiAgICBpc0xhc3Q6IGJvb2xlYW5cbiAgKTogQ29sdW1uQWN0aW9uW10ge1xuICAgIGNvbnN0IGFjdGlvbnM6IENvbHVtbkFjdGlvbltdID0gW107XG4gICAgXG4gICAgLy8gQWRkIGJ1aWx0LWluIGFjdGlvbnMgaWYgZW5hYmxlZCAoZGVmYXVsdDogdHJ1ZSlcbiAgICBjb25zdCBpbmNsdWRlQnVpbHRJbiA9IGNvbHVtbi5pbmNsdWRlQnVpbHRJbkFjdGlvbnMgPz8gdHJ1ZTtcbiAgICBpZiAoaW5jbHVkZUJ1aWx0SW4pIHtcbiAgICAgIGFjdGlvbnMucHVzaCguLi50aGlzLmdldEJ1aWx0SW5Db2x1bW5BY3Rpb25zKGNvbHVtbiwgY29sdW1uSW5kZXgsIGlzRmlyc3QsIGlzTGFzdCkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgY3VzdG9tIGNvbHVtbiBhY3Rpb25zIGZyb20gY29uZmlnXG4gICAgaWYgKGNvbHVtbi5jb2x1bW5BY3Rpb25zICYmIGNvbHVtbi5jb2x1bW5BY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGFjdGlvbnMucHVzaCguLi5jb2x1bW4uY29sdW1uQWN0aW9ucyk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBhY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBidWlsdC1pbiBjb2x1bW4gYWN0aW9ucyAoc29ydCwgZmlsdGVyLCBwaW4sIG1vdmUpXG4gICAqL1xuICBwcml2YXRlIGdldEJ1aWx0SW5Db2x1bW5BY3Rpb25zKFxuICAgIGNvbHVtbjogQ29sdW1uQ29uZmlnPGFueT4sXG4gICAgY29sdW1uSW5kZXg6IG51bWJlcixcbiAgICBpc0ZpcnN0OiBib29sZWFuLFxuICAgIGlzTGFzdDogYm9vbGVhblxuICApOiBDb2x1bW5BY3Rpb25bXSB7XG4gICAgY29uc3QgdGFibGVTdGF0ZSA9IHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpO1xuICAgIGNvbnN0IGFjdGlvbnM6IENvbHVtbkFjdGlvbltdID0gW107XG5cbiAgICAvLyBTb3J0IGFzY2VuZGluZ1xuICAgIGlmIChjb2x1bW4uc29ydGFibGUgIT09IGZhbHNlKSB7XG4gICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogJ3NvcnQtYXNjJyxcbiAgICAgICAgbGFiZWw6IHRoaXMuZ2V0U29ydExhYmVsKGNvbHVtbiwgJ2FzYycpLFxuICAgICAgICBpY29uOiAn4oaRJyxcbiAgICAgICAgYWN0aW9uOiAoY29sKSA9PiB7XG4gICAgICAgICAgdGFibGVTdGF0ZS5hZGRTb3J0VG9Db2x1bW4oY29sLmtleSwgU29ydERpcmVjdGlvbi5BU0MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGRlc2NlbmRpbmdcbiAgICBpZiAoY29sdW1uLnNvcnRhYmxlICE9PSBmYWxzZSkge1xuICAgICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgaWQ6ICdzb3J0LWRlc2MnLFxuICAgICAgICBsYWJlbDogdGhpcy5nZXRTb3J0TGFiZWwoY29sdW1uLCAnZGVzYycpLFxuICAgICAgICBpY29uOiAn4oaTJyxcbiAgICAgICAgYWN0aW9uOiAoY29sKSA9PiB7XG4gICAgICAgICAgdGFibGVTdGF0ZS5hZGRTb3J0VG9Db2x1bW4oY29sLmtleSwgU29ydERpcmVjdGlvbi5ERVNDKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgc29ydCAob25seSBzaG93IGlmIGN1cnJlbnRseSBzb3J0ZWQpXG4gICAgaWYgKGNvbHVtbi5zb3J0YWJsZSAhPT0gZmFsc2UgJiYgY29sdW1uLnNvcnREaXJlY3Rpb24gJiYgY29sdW1uLnNvcnREaXJlY3Rpb24gIT09IFNvcnREaXJlY3Rpb24uTk9ORSkge1xuICAgICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgaWQ6ICdjbGVhci1zb3J0JyxcbiAgICAgICAgbGFiZWw6ICdDbGVhciBTb3J0JyxcbiAgICAgICAgaWNvbjogJ+KclScsXG4gICAgICAgIGFjdGlvbjogKGNvbCkgPT4ge1xuICAgICAgICAgIHRhYmxlU3RhdGUuYWRkU29ydFRvQ29sdW1uKGNvbC5rZXksIFNvcnREaXJlY3Rpb24uTk9ORSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEZpbHRlclxuICAgIGlmIChjb2x1bW4uZmlsdGVyYWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgIGFjdGlvbnMucHVzaCh7XG4gICAgICAgIGlkOiAnZmlsdGVyJyxcbiAgICAgICAgbGFiZWw6ICdGaWx0ZXInLFxuICAgICAgICBpY29uOiAn4pqRJyxcbiAgICAgICAgYWN0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgLy8gRmlsdGVyIGFjdGlvbiBoYW5kbGVkIGJ5IGNvbHVtbiBtZW51IGNvbXBvbmVudFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBQaW4gTGVmdCAoaWYgbm90IGFscmVhZHkgcGlubmVkKVxuICAgIGlmIChjb2x1bW4ucGlubmFibGUgIT09IGZhbHNlICYmIGNvbHVtbi5zdGlja3kgIT09ICdsZWZ0JyAmJiBjb2x1bW4uc3RpY2t5ICE9PSAncmlnaHQnKSB7XG4gICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogJ3Bpbi1sZWZ0JyxcbiAgICAgICAgbGFiZWw6ICdQaW4gTGVmdCcsXG4gICAgICAgIGljb246ICfwn5OMJyxcbiAgICAgICAgYWN0aW9uOiAoY29sKSA9PiB7XG4gICAgICAgICAgdGFibGVTdGF0ZS5zZXRTdGlja3lDb2x1bW4oY29sLmtleSwgJ2xlZnQnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUGluIFJpZ2h0IChpZiBub3QgYWxyZWFkeSBwaW5uZWQpXG4gICAgaWYgKGNvbHVtbi5waW5uYWJsZSAhPT0gZmFsc2UgJiYgY29sdW1uLnN0aWNreSAhPT0gJ2xlZnQnICYmIGNvbHVtbi5zdGlja3kgIT09ICdyaWdodCcpIHtcbiAgICAgIGFjdGlvbnMucHVzaCh7XG4gICAgICAgIGlkOiAncGluLXJpZ2h0JyxcbiAgICAgICAgbGFiZWw6ICdQaW4gUmlnaHQnLFxuICAgICAgICBpY29uOiAn8J+TjCcsXG4gICAgICAgIGFjdGlvbjogKGNvbCkgPT4ge1xuICAgICAgICAgIHRoaXMubW92ZUNvbHVtblRvRW5kKGNvbC5rZXkpO1xuICAgICAgICAgIHRhYmxlU3RhdGUuc2V0U3RpY2t5Q29sdW1uKGNvbC5rZXksICdyaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBVbnBpbiAoaWYgY3VycmVudGx5IHBpbm5lZClcbiAgICBpZiAoY29sdW1uLnBpbm5hYmxlICE9PSBmYWxzZSAmJiAoY29sdW1uLnN0aWNreSA9PT0gJ2xlZnQnIHx8IGNvbHVtbi5zdGlja3kgPT09ICdyaWdodCcpKSB7XG4gICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogJ3VucGluJyxcbiAgICAgICAgbGFiZWw6ICdVbnBpbicsXG4gICAgICAgIGljb246ICfwn5ONJyxcbiAgICAgICAgYWN0aW9uOiAoY29sKSA9PiB7XG4gICAgICAgICAgdGFibGVTdGF0ZS5zZXRTdGlja3lDb2x1bW4oY29sLmtleSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBNb3ZlIGxlZnQgKG9ubHkgaWYgbW92YWJsZSBhbmQgbm90IHBpbm5lZClcbiAgICBpZiAoIWlzRmlyc3QgJiYgY29sdW1uLm1vdmFibGUgIT09IGZhbHNlICYmICFjb2x1bW4uc3RpY2t5KSB7XG4gICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogJ21vdmUtbGVmdCcsXG4gICAgICAgIGxhYmVsOiAnTW92ZSBMZWZ0JyxcbiAgICAgICAgaWNvbjogJ+KGkCcsXG4gICAgICAgIGFjdGlvbjogKGNvbCkgPT4ge1xuICAgICAgICAgIHRoaXMub25Db2x1bW5Nb3ZlZCh7XG4gICAgICAgICAgICBjb2x1bW5LZXk6IGNvbC5rZXksXG4gICAgICAgICAgICBkaXJlY3Rpb246ICdsZWZ0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBNb3ZlIHJpZ2h0IChvbmx5IGlmIG1vdmFibGUgYW5kIG5vdCBwaW5uZWQpXG4gICAgaWYgKCFpc0xhc3QgJiYgY29sdW1uLm1vdmFibGUgIT09IGZhbHNlICYmICFjb2x1bW4uc3RpY2t5KSB7XG4gICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogJ21vdmUtcmlnaHQnLFxuICAgICAgICBsYWJlbDogJ01vdmUgUmlnaHQnLFxuICAgICAgICBpY29uOiAn4oaSJyxcbiAgICAgICAgYWN0aW9uOiAoY29sKSA9PiB7XG4gICAgICAgICAgdGhpcy5vbkNvbHVtbk1vdmVkKHtcbiAgICAgICAgICAgIGNvbHVtbktleTogY29sLmtleSxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogJ3JpZ2h0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc29ydCBsYWJlbCBiYXNlZCBvbiBjb2x1bW4gZGF0YSB0eXBlXG4gICAqL1xuICBwcml2YXRlIGdldFNvcnRMYWJlbChjb2x1bW46IENvbHVtbkNvbmZpZzxhbnk+LCBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IGNvbHVtbi5kYXRhVHlwZTtcblxuICAgIGlmIChkYXRhVHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBkaXJlY3Rpb24gPT09ICdhc2MnID8gJ1NvcnQgMOKGkjknIDogJ1NvcnQgOeKGkjAnO1xuICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT09ICdkYXRlJykge1xuICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ2FzYycgPyAnU29ydCBPbGRlc3QgRmlyc3QnIDogJ1NvcnQgTmV3ZXN0IEZpcnN0JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ2FzYycgPyAnU29ydCBB4oaSWicgOiAnU29ydCBa4oaSQSc7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBLRVlCT0FSRCBOQVZJR0FUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVLZXlib2FyZE5hdmlnYXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgdGFibGVTdGF0ZSA9IHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpO1xuICAgIFxuICAgIHRhYmxlU3RhdGUuc2V0RGltZW5zaW9ucyhcbiAgICAgIHRoaXMudmlzaWJsZUNlbGxHcmlkLmxlbmd0aCxcbiAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMubGVuZ3RoXG4gICAgKTtcbiAgICBcbiAgICAvLyBTdWJzY3JpYmUgdG8gZm9jdXMgcG9zaXRpb24gY2hhbmdlc1xuICAgIHRoaXMuZm9jdXNTdWJzY3JpcHRpb24gPSB0YWJsZVN0YXRlLmZvY3VzZWRDZWxsUG9zaXRpb24kLnN1YnNjcmliZShwb3NpdGlvbiA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUNlbGxGb2N1c1N0YXRlcyhwb3NpdGlvbik7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gQXV0by1mb2N1cyBmaXJzdCBjZWxsIHRvIGVuYWJsZSBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gICAgaWYgKHRoaXMudmlzaWJsZUNlbGxHcmlkLmxlbmd0aCA+IDAgJiYgdGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGFibGVTdGF0ZS5mb2N1c0NlbGwoMCwgMCk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBVcGRhdGUgZm9jdXMgc3RhdGUgaW4gYWxsIGNlbGxzXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUNlbGxGb2N1c1N0YXRlcyhwb3NpdGlvbjogQ2VsbEZvY3VzUG9zaXRpb24gfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpc2libGVDZWxsR3JpZCkgcmV0dXJuO1xuICAgIFxuICAgIGZvciAobGV0IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCB0aGlzLnZpc2libGVDZWxsR3JpZC5sZW5ndGg7IHJvd0luZGV4KyspIHtcbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMudmlzaWJsZUNlbGxHcmlkW3Jvd0luZGV4XTtcbiAgICAgIGZvciAobGV0IGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCByb3cubGVuZ3RoOyBjb2xJbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGNlbGwgPSByb3dbY29sSW5kZXhdO1xuICAgICAgICBpZiAoIWNlbGwpIGNvbnRpbnVlO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgc2hvdWxkRm9jdXMgPSBwb3NpdGlvbiAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLnJvd0luZGV4ID09PSByb3dJbmRleCAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLmNvbHVtbkluZGV4ID09PSBjb2xJbmRleDtcbiAgICAgICAgXG4gICAgICAgIGlmIChzaG91bGRGb2N1cykge1xuICAgICAgICAgIGNlbGwuZm9jdXMoKTtcbiAgICAgICAgICAvLyBGb2N1cyB0aGUgYWN0dWFsIERPTSBlbGVtZW50XG4gICAgICAgICAgdGhpcy5mb2N1c1RkRWxlbWVudChyb3dJbmRleCwgY29sSW5kZXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNlbGwuYmx1cigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogRm9jdXMgdGhlIFREIGVsZW1lbnQgaW4gdGhlIERPTSBhbmQgc2Nyb2xsIGl0IGludG8gdmlldyxcbiAgICogYWNjb3VudGluZyBmb3Igc3RpY2t5IGNvbHVtbnMgb24gbGVmdCBhbmQgcmlnaHRcbiAgICovXG4gIHByaXZhdGUgZm9jdXNUZEVsZW1lbnQocm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGVuc3VyZSBET00gaGFzIHVwZGF0ZWRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIFVzZSBhYnNvbHV0ZSByb3cgaW5kZXggZm9yIHZpcnR1YWwgc2Nyb2xsIGNvbXBhdGliaWxpdHlcbiAgICAgIGNvbnN0IGFic29sdXRlUm93SW5kZXggPSB0aGlzLmdldEFic29sdXRlUm93SW5kZXgocm93SW5kZXgpO1xuICAgICAgY29uc3QgdHIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGB0cltkYXRhLXJvdy1pbmRleD1cIiR7YWJzb2x1dGVSb3dJbmRleH1cIl1gKTtcbiAgICAgIGlmICh0cikge1xuICAgICAgICBjb25zdCBjZWxscyA9IHRyLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkOm5vdCguc2V0dGluZ3MtY29sdW1uKTpub3QoLnJvdy1udW1iZXItY2VsbCknKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0Q2VsbCA9IGNlbGxzW2NvbEluZGV4XSBhcyBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRhcmdldENlbGwgJiYgdHlwZW9mIHRhcmdldENlbGwuZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0YXJnZXRDZWxsLmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgICAgICAgICB0aGlzLnNjcm9sbENlbGxJbnRvVmlldyh0YXJnZXRDZWxsLCBjb2xJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGwgYSBjZWxsIGludG8gdmlldywgYWNjb3VudGluZyBmb3Igc3RpY2t5IGNvbHVtbnNcbiAgICovXG4gIHByaXZhdGUgc2Nyb2xsQ2VsbEludG9WaWV3KGNlbGw6IEhUTUxFbGVtZW50LCBjb2xJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gRmluZCB0aGUgc2Nyb2xsIGNvbnRhaW5lclxuICAgIGNvbnN0IHNjcm9sbENvbnRhaW5lciA9IHRoaXMuZ2V0U2Nyb2xsQ29udGFpbmVyRWxlbWVudCgpO1xuICAgIGlmICghc2Nyb2xsQ29udGFpbmVyKSByZXR1cm47XG5cbiAgICBjb25zdCBjZWxsUmVjdCA9IGNlbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHNjcm9sbENvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIC8vIENhbGN1bGF0ZSBzdGlja3kgY29sdW1uIHdpZHRoc1xuICAgIGNvbnN0IHsgbGVmdFN0aWNreVdpZHRoLCByaWdodFN0aWNreVdpZHRoIH0gPSB0aGlzLmNhbGN1bGF0ZVN0aWNreVdpZHRocygpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHZpc2libGUgYXJlYSAoZXhjbHVkaW5nIHN0aWNreSBjb2x1bW5zKVxuICAgIGNvbnN0IHZpc2libGVMZWZ0ID0gY29udGFpbmVyUmVjdC5sZWZ0ICsgbGVmdFN0aWNreVdpZHRoO1xuICAgIGNvbnN0IHZpc2libGVSaWdodCA9IGNvbnRhaW5lclJlY3QucmlnaHQgLSByaWdodFN0aWNreVdpZHRoO1xuICAgIGNvbnN0IHZpc2libGVUb3AgPSBjb250YWluZXJSZWN0LnRvcDtcbiAgICBjb25zdCB2aXNpYmxlQm90dG9tID0gY29udGFpbmVyUmVjdC5ib3R0b207XG5cbiAgICAvLyBDaGVjayBpZiBjb2x1bW4gaXMgc3RpY2t5IChkb24ndCBzY3JvbGwgZm9yIHN0aWNreSBjb2x1bW5zKVxuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMudmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdO1xuICAgIGlmIChjb2x1bW4/LnN0aWNreSkge1xuICAgICAgLy8gSnVzdCBlbnN1cmUgdmVydGljYWwgdmlzaWJpbGl0eSBmb3Igc3RpY2t5IGNvbHVtbnNcbiAgICAgIGlmIChjZWxsUmVjdC50b3AgPCB2aXNpYmxlVG9wKSB7XG4gICAgICAgIHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AgLT0gKHZpc2libGVUb3AgLSBjZWxsUmVjdC50b3ApO1xuICAgICAgfSBlbHNlIGlmIChjZWxsUmVjdC5ib3R0b20gPiB2aXNpYmxlQm90dG9tKSB7XG4gICAgICAgIHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AgKz0gKGNlbGxSZWN0LmJvdHRvbSAtIHZpc2libGVCb3R0b20pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEhvcml6b250YWwgc2Nyb2xsaW5nXG4gICAgaWYgKGNlbGxSZWN0LmxlZnQgPCB2aXNpYmxlTGVmdCkge1xuICAgICAgLy8gQ2VsbCBpcyBoaWRkZW4gYmVoaW5kIGxlZnQgc3RpY2t5IGNvbHVtbnNcbiAgICAgIHNjcm9sbENvbnRhaW5lci5zY3JvbGxMZWZ0IC09ICh2aXNpYmxlTGVmdCAtIGNlbGxSZWN0LmxlZnQpO1xuICAgIH0gZWxzZSBpZiAoY2VsbFJlY3QucmlnaHQgPiB2aXNpYmxlUmlnaHQpIHtcbiAgICAgIC8vIENlbGwgaXMgaGlkZGVuIGJlaGluZCByaWdodCBzdGlja3kgY29sdW1uc1xuICAgICAgc2Nyb2xsQ29udGFpbmVyLnNjcm9sbExlZnQgKz0gKGNlbGxSZWN0LnJpZ2h0IC0gdmlzaWJsZVJpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBWZXJ0aWNhbCBzY3JvbGxpbmdcbiAgICBpZiAoY2VsbFJlY3QudG9wIDwgdmlzaWJsZVRvcCkge1xuICAgICAgc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCAtPSAodmlzaWJsZVRvcCAtIGNlbGxSZWN0LnRvcCk7XG4gICAgfSBlbHNlIGlmIChjZWxsUmVjdC5ib3R0b20gPiB2aXNpYmxlQm90dG9tKSB7XG4gICAgICBzY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wICs9IChjZWxsUmVjdC5ib3R0b20gLSB2aXNpYmxlQm90dG9tKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzY3JvbGwgY29udGFpbmVyIGVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgZ2V0U2Nyb2xsQ29udGFpbmVyRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIC8vIFByZWZlciBjYWNoZWQgY29udGFpbmVyIGlmIGFscmVhZHkgcmVzb2x2ZWRcbiAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjcm9sbENvbnRhaW5lcjtcbiAgICB9XG4gICAgLy8gVmlydHVhbCBzY3JvbGwgdXNlcyBzY3JvbGxWaWV3cG9ydFxuICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSAmJiB0aGlzLnNjcm9sbFZpZXdwb3J0Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lciA9IHRoaXMuc2Nyb2xsVmlld3BvcnQubmF0aXZlRWxlbWVudDtcbiAgICAgIHJldHVybiB0aGlzLnNjcm9sbENvbnRhaW5lcjtcbiAgICB9XG4gICAgLy8gU3RhbmRhcmQgbW9kZSB1c2VzIC5zdC10YWJsZSBjb250YWluZXIgKGNhY2hlIGl0IHRvIGF2b2lkIHNlbGVjdGluZyB3cm9uZyB0YWJsZSByZXBlYXRlZGx5KVxuICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN0LXRhYmxlJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICh0YWJsZUNvbnRhaW5lcikge1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIgPSB0YWJsZUNvbnRhaW5lcjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2Nyb2xsQ29udGFpbmVyIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRvdGFsIHdpZHRoIG9mIHN0aWNreSBjb2x1bW5zIG9uIGxlZnQgYW5kIHJpZ2h0XG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVN0aWNreVdpZHRocygpOiB7IGxlZnRTdGlja3lXaWR0aDogbnVtYmVyOyByaWdodFN0aWNreVdpZHRoOiBudW1iZXIgfSB7XG4gICAgbGV0IGxlZnRTdGlja3lXaWR0aCA9IDA7XG4gICAgbGV0IHJpZ2h0U3RpY2t5V2lkdGggPSAwO1xuXG4gICAgLy8gQWNjb3VudCBmb3Igcm93IG51bWJlciBjb2x1bW4gaWYgZW5hYmxlZFxuICAgIGlmICh0aGlzLm1lcmdlZENvbmZpZy5zaG93Um93TnVtYmVyKSB7XG4gICAgICBsZWZ0U3RpY2t5V2lkdGggKz0gMzA7IC8vIFJvdyBudW1iZXIgY29sdW1uIHdpZHRoXG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGZyb20gY29sdW1uIGNvbmZpZ3NcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLnZpc2libGVDb2x1bW5zKSB7XG4gICAgICBpZiAoY29sLnN0aWNreSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIGxlZnRTdGlja3lXaWR0aCArPSAoY29sLndpZHRoIGFzIG51bWJlcikgfHwgMTAwO1xuICAgICAgfSBlbHNlIGlmIChjb2wuc3RpY2t5ID09PSAncmlnaHQnKSB7XG4gICAgICAgIHJpZ2h0U3RpY2t5V2lkdGggKz0gKGNvbC53aWR0aCBhcyBudW1iZXIpIHx8IDEwMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBY2NvdW50IGZvciBzZXR0aW5ncyBjb2x1bW4gb25seSB3aGVuIHJvdyBhY3Rpb25zIGFyZSBlbmFibGVkICh1c2UgY29uc2lzdGVudCB3aWR0aClcbiAgICBjb25zdCBzZXR0aW5nc0NvbHVtbldpZHRoID0gdGhpcy5oYXNSb3dBY3Rpb25zKCkgPyAzMiA6IDA7XG4gICAgcmlnaHRTdGlja3lXaWR0aCArPSBzZXR0aW5nc0NvbHVtbldpZHRoO1xuXG4gICAgcmV0dXJuIHsgbGVmdFN0aWNreVdpZHRoLCByaWdodFN0aWNreVdpZHRoIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgY2VsbCBjbGlja1xuICAgKi9cbiAgb25DZWxsQ2xpY2socm93SW5kZXg6IG51bWJlciwgY29sdW1uSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSkgcmV0dXJuO1xuICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLmZvY3VzQ2VsbChyb3dJbmRleCwgY29sdW1uSW5kZXgpO1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIGNlbGwgZW50ZXJpbmcgZWRpdCBtb2RlXG4gICAqL1xuICBvbkNlbGxFZGl0KGV2ZW50OiBDZWxsRWRpdEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jZWxsRWRpdC5lbWl0KGV2ZW50KTtcbiAgICBcbiAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSkge1xuICAgICAgY29uc3Qgcm93SW5kZXggPSBldmVudC5jZWxsLmdldFJvd0luZGV4KCk7XG4gICAgICBjb25zdCBjb2x1bW5LZXkgPSBldmVudC5jb2x1bW5LZXk7XG4gICAgICBjb25zdCBjb2x1bW5JbmRleCA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmluZEluZGV4KGNvbCA9PiBjb2wua2V5ID09PSBjb2x1bW5LZXkpO1xuICAgICAgXG4gICAgICBpZiAocm93SW5kZXggIT09IHVuZGVmaW5lZCAmJiBjb2x1bW5JbmRleCA+PSAwKSB7XG4gICAgICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLnNldEVkaXRpbmdDZWxsKHJvd0luZGV4LCBjb2x1bW5JbmRleCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIGNlbGwgc2F2ZVxuICAgKi9cbiAgb25DZWxsU2F2ZShldmVudDogQ2VsbFNhdmVFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2VsbFNhdmUuZW1pdChldmVudCk7XG4gICAgXG4gICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLmNsZWFyRWRpdGluZ0NlbGwoKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgY2VsbCBjYW5jZWxcbiAgICovXG4gIG9uQ2VsbENhbmNlbChldmVudDogQ2VsbENhbmNlbEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jZWxsQ2FuY2VsLmVtaXQoZXZlbnQpO1xuICAgIFxuICAgIGlmICh0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpKSB7XG4gICAgICB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKS5jbGVhckVkaXRpbmdDZWxsKCk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIGNlbGwgc2F2ZSB3aXRoIG5hdmlnYXRpb24gKEV4Y2VsLWxpa2UgYmVoYXZpb3IpXG4gICAqL1xuICBvbkNlbGxTYXZlQW5kTmF2aWdhdGUoZXZlbnQ6IHtldmVudDogS2V5Ym9hcmRFdmVudCwgZGlyZWN0aW9uOiBOYXZpZ2F0aW9uRGlyZWN0aW9ufSk6IHZvaWQge1xuICAgIC8vIE5hdmlnYXRpb24gaXMgYWxyZWFkeSBoYW5kbGVkIGJ5IHRoZSBkaXJlY3RpdmUgYWZ0ZXIgc2F2ZVxuICAgIC8vIEp1c3QgZW5zdXJlIGVkaXRpbmcgc3RhdGUgaXMgY2xlYXJlZFxuICAgIGlmICh0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpKSB7XG4gICAgICB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKS5jbGVhckVkaXRpbmdDZWxsKCk7XG4gICAgICAvLyBNb3ZlIGZvY3VzIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0aW9uXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkubW92ZUZvY3VzKGV2ZW50LmRpcmVjdGlvbik7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgZm9jdXMgb24gdGFibGUgY29udGFpbmVyIC0gZm9jdXMgZmlyc3QgY2VsbCBpZiBubyBjZWxsIGlzIGZvY3VzZWRcbiAgICovXG4gIG9uVGFibGVDb250YWluZXJGb2N1cyhldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHRhYmxlU3RhdGUgPSB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKTtcbiAgICBjb25zdCBjdXJyZW50Rm9jdXMgPSB0YWJsZVN0YXRlLmdldEZvY3VzZWRQb3NpdGlvbigpO1xuICAgIFxuICAgIC8vIElmIG5vIGNlbGwgaXMgZm9jdXNlZCwgZm9jdXMgdGhlIGZpcnN0IGNlbGxcbiAgICBpZiAoIWN1cnJlbnRGb2N1cyAmJiB0aGlzLnZpc2libGVDZWxsR3JpZC5sZW5ndGggPiAwICYmIHRoaXMudmlzaWJsZUNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGFibGVTdGF0ZS5mb2N1c0NlbGwoMCwgMCk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYga2V5Ym9hcmQgbmF2aWdhdGlvbiBpcyBlbmFibGVkXG4gICAqL1xuICBpc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VkQ29uZmlnLmZlYXR1cmVzPy5rZXlib2FyZE5hdmlnYXRpb24/LmVuYWJsZWQgPz8gZmFsc2U7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgRWRpdE1vZGUgZW51bSB2YWx1ZSBmb3IgY2VsbHNcbiAgICogRm9yIEV4Y2VsLWxpa2UgdGFibGVzIHdpdGgga2V5Ym9hcmQgbmF2aWdhdGlvbiwgdXNlIEVOVEVSIG1vZGVcbiAgICogd2hpY2ggYWxsb3dzIGFycm93IGtleSBuYXZpZ2F0aW9uIHdpdGhvdXQgdHJpZ2dlcmluZyBlZGl0LlxuICAgKiBEb3VibGUtY2xpY2sgd2lsbCBzdGlsbCB3b3JrIHRvIHN0YXJ0IGVkaXRpbmcuXG4gICAqL1xuICBnZXRFZGl0TW9kZUZvckNlbGxzKCk6IEVkaXRNb2RlIHtcbiAgICAvLyBJZiBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIGVuYWJsZWQsIHVzZSBFTlRFUiBtb2RlIGZvciBFeGNlbC1saWtlIGJlaGF2aW9yXG4gICAgLy8gT3RoZXJ3aXNlIHVzZSBDTElDSyBtb2RlIGZvciBpbW1lZGlhdGUgZWRpdGluZ1xuICAgIGlmICh0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gRWRpdE1vZGUuRU5URVI7XG4gICAgfVxuICAgIHJldHVybiBFZGl0TW9kZS5DTElDSztcbiAgfVxuICBcbiAgLyoqXG4gICAqIENsZWFyIGZvY3VzIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSB0YWJsZVxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkpIHJldHVybjtcbiAgICBcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgdGFibGVFbGVtZW50ID0gdGFyZ2V0LmNsb3Nlc3QoJy5zdC10YWJsZScpO1xuICAgIFxuICAgIGlmICghdGFibGVFbGVtZW50KSB7XG4gICAgICB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKS5jbGVhckZvY3VzKCk7XG4gICAgICB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKS5jbGVhckVkaXRpbmdDZWxsKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnNjcm9sbFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmZvY3VzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMudmFsaWRhdGlvblN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRhdGFTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5pbnRlcm5hbERhdGEkLmNvbXBsZXRlKCk7XG4gIH1cbiAgXG59XG5cbiIsIjwhLS0gVG9wIHBhZ2luYXRpb24gY29udHJvbHMgLS0+XG48c3QtcGFnaW5hdGlvbiBcbiAgKm5nSWY9XCJzaG93VG9wUGFnaW5hdGlvbigpICYmICEobWVyZ2VkQ29uZmlnLnRhYmxlU2tlbGV0b24/LmVuYWJsZWQgfCBhc3luYylcIiBcbiAgW3RhYmxlU3RhdGVdPVwiZ2V0QWN0aXZlVGFibGVTdGF0ZSgpXCJcbiAgW3RhYmxlQ29uZmlnXT1cIm1lcmdlZENvbmZpZ1wiXG4gIHBvc2l0aW9uPVwidG9wXCI+XG48L3N0LXBhZ2luYXRpb24+XG5cbjxkaXYgY2xhc3M9XCJzdC10YWJsZVwiICpuZ0lmPVwiIShtZXJnZWRDb25maWcudGFibGVTa2VsZXRvbj8uZW5hYmxlZCB8IGFzeW5jKVwiIFxuICBbbmdDbGFzc109XCJ7XG4gICAgJ3ZpcnR1YWwtc2Nyb2xsLWVuYWJsZWQnOiBpc1ZpcnR1YWxTY3JvbGxFbmFibGVkKCksXG4gICAgJ2tleWJvYXJkLW5hdmlnYXRpb24tZW5hYmxlZCc6IGlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpXG4gIH1cIlxuICBbbmdTdHlsZV09XCJ7XG4gICAgJ21heC1oZWlnaHQucHgnOiAhaXNWaXJ0dWFsU2Nyb2xsRW5hYmxlZCgpID8gbWVyZ2VkQ29uZmlnLmRpc3BsYXk/Lm1heEhlaWdodCA6IG51bGxcbiAgfVwiXG4gIHN0S2V5Ym9hcmROYXZpZ2F0aW9uXG4gIFt0YWJsZVN0YXRlXT1cImdldEFjdGl2ZVRhYmxlU3RhdGUoKVwiIFxuICBbYXR0ci50YWJpbmRleF09XCJpc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSA/IDAgOiAtMVwiXG4gIChmb2N1cyk9XCJvblRhYmxlQ29udGFpbmVyRm9jdXMoJGV2ZW50KVwiXG4gIFthdHRyLnRpdGxlXT1cImlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpID8gJ0NsaWNrIGEgY2VsbCBvciBwcmVzcyBUYWIgdG8gc3RhcnQga2V5Ym9hcmQgbmF2aWdhdGlvbicgOiBudWxsXCI+XG4gIDwhLS0gVW5pZmllZCBUYWJsZSBBY3Rpb25zIE1lbnUgLS0+XG5cbiAgPCEtLSBWaXJ0dWFsIHNjcm9sbCB2aWV3cG9ydCB3cmFwcGVyIC0tPlxuICA8ZGl2IGNsYXNzPVwic3Qtc2Nyb2xsLXZpZXdwb3J0XCIgI3Njcm9sbFZpZXdwb3J0ICpuZ0lmPVwiaXNWaXJ0dWFsU2Nyb2xsRW5hYmxlZCgpXCJcbiAgICBbbmdTdHlsZV09XCJ7ICdoZWlnaHQucHgnOiBnZXRWaXJ0dWFsU2Nyb2xsVmlld3BvcnRIZWlnaHQoKSB9XCI+XG5cbiAgICA8IS0tIFNwYWNlciB0byBjcmVhdGUgc2Nyb2xsYWJsZSBhcmVhIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJzdC1zY3JvbGwtc3BhY2VyXCIgW25nU3R5bGVdPVwieyAnaGVpZ2h0LnB4JzogdmlydHVhbFNjcm9sbFRvdGFsSGVpZ2h0JCB8IGFzeW5jIH1cIj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVGFibGUgcG9zaXRpb25lciB3aXRoIHRyYW5zZm9ybSAoaW5zdGVhZCBvZiB0Ym9keSkgLS0+XG4gICAgPGRpdiBjbGFzcz1cInN0LXRhYmxlLXBvc2l0aW9uZXJcIiBbbmdTdHlsZV09XCJ7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoJyArICh2aXJ0dWFsU2Nyb2xsT2Zmc2V0WSQgfCBhc3luYykgKyAncHgpJyB9XCI+XG4gICAgICA8IS0tIFRhYmxlIHdpdGggb25seSB2aXNpYmxlIHJvd3MgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVUZW1wbGF0ZTsgY29udGV4dDogeyBcbiAgICAgICAgbW9kZTogJ3ZpcnR1YWwnLFxuICAgICAgICB0aGVhZFN0eWxlOiB7IHRvcDogKHZpcnR1YWxTY3JvbGxPZmZzZXRZTmVnJCB8IGFzeW5jKSArICdweCcgfVxuICAgICAgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgXG4gIDwhLS0gU3RhbmRhcmQgdGFibGUgKHdoZW4gdmlydHVhbCBzY3JvbGwgZGlzYWJsZWQpIC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZVRlbXBsYXRlOyBjb250ZXh0OiB7IFxuICAgICAgbW9kZTogJ3N0YW5kYXJkJyxcbiAgICAgIHRoZWFkU3R5bGU6IG51bGxcbiAgICB9XCI+PC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gU2hhcmVkIENvbHVtbiBNZW51IERyb3Bkb3duIC0tPlxuICA8c3QtY29sdW1uLW1lbnUtZHJvcGRvd24gXG4gIFtpc09wZW5dPVwiY29sdW1uTWVudVN0YXRlLmlzT3BlblwiXG4gIFtwb3NpdGlvbl09XCJjb2x1bW5NZW51U3RhdGUucG9zaXRpb25cIlxuICBbY29udGV4dF09XCJjb2x1bW5NZW51U3RhdGUuY29udGV4dFwiXG4gIChhY3Rpb25DbGlja2VkKT1cIm9uQ29sdW1uQWN0aW9uQ2xpY2tlZCgkZXZlbnQpXCJcbiAgKGNsb3NlZCk9XCJjbG9zZUNvbHVtbk1lbnUoKVwiPlxuICA8L3N0LWNvbHVtbi1tZW51LWRyb3Bkb3duPlxuPC9kaXY+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIobWVyZ2VkQ29uZmlnLnRhYmxlU2tlbGV0b24/LmVuYWJsZWQgfCBhc3luYylcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNrZWxldG9uTG9hZGVyXCI+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPCEtLSBTaGFyZWQgUm93IEFjdGlvbnMgRHJvcGRvd24gLS0+XG48c3Qtcm93LWFjdGlvbnMtZHJvcGRvd24gW2lzT3Blbl09XCJkcm9wZG93blN0YXRlLmlzT3BlblwiIFtwb3NpdGlvbl09XCJkcm9wZG93blN0YXRlLnBvc2l0aW9uXCJcbiAgW2NvbnRleHRdPVwiZHJvcGRvd25TdGF0ZS5jb250ZXh0XCIgKGFjdGlvbkNsaWNrZWQpPVwib25Sb3dBY3Rpb25DbGlja2VkKCRldmVudClcIiAoY2xvc2VkKT1cImNsb3NlUm93QWN0aW9uc0Ryb3Bkb3duKClcIj5cbjwvc3Qtcm93LWFjdGlvbnMtZHJvcGRvd24+XG5cblxuPCEtLSBCb3R0b20gcGFnaW5hdGlvbiBjb250cm9scyAtLT5cbjxzdC1wYWdpbmF0aW9uIFxuICAqbmdJZj1cInNob3dCb3R0b21QYWdpbmF0aW9uKCkgJiYgIShtZXJnZWRDb25maWcudGFibGVTa2VsZXRvbj8uZW5hYmxlZCB8IGFzeW5jKVwiIFxuICBbdGFibGVTdGF0ZV09XCJnZXRBY3RpdmVUYWJsZVN0YXRlKClcIlxuICBbdGFibGVDb25maWddPVwibWVyZ2VkQ29uZmlnXCJcbiAgcG9zaXRpb249XCJib3R0b21cIj5cbjwvc3QtcGFnaW5hdGlvbj5cblxuXG4gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPlxuICA8IS0tIFJFVVNBQkxFIFRBQkxFIFRFTVBMQVRFIC0tPlxuICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cbiAgPG5nLXRlbXBsYXRlICN0YWJsZVRlbXBsYXRlIGxldC1tb2RlPVwibW9kZVwiIGxldC10aGVhZFN0eWxlPVwidGhlYWRTdHlsZVwiPlxuICAgIDx0YWJsZSBjbGFzcz1cInN0LXRhYmxlLWVsZW1lbnRcIj5cbiAgICAgIDwhLS0gVEFCTEUgSEVBREVSIC0tPlxuICAgICAgPHRoZWFkIFtuZ0NsYXNzXT1cInsgJ3N0aWNreSc6IG1lcmdlZENvbmZpZy5kaXNwbGF5Py5zdGlja3lIZWFkZXIgfVwiIFtuZ1N0eWxlXT1cInRoZWFkU3R5bGVcIj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDwhLS0gUm93IE51bWJlciBIZWFkZXIgLS0+XG4gICAgICAgICAgPHRoICpuZ0lmPVwibWVyZ2VkQ29uZmlnLnNob3dSb3dOdW1iZXJcIiBjbGFzcz1cInJvdy1udW1iZXItaGVhZGVyIGhlYWRlci1jZWxsIHN0aWNreS1sZWZ0XCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnc3RpY2t5JyxcbiAgICAgICAgICAgICAgICAnbGVmdC5weCc6IDAsXG4gICAgICAgICAgICAgICAgJ3otaW5kZXgnOiBaSW5kZXguU1RJQ0tZX0hFQURFUl9DRUxMLFxuICAgICAgICAgICAgICAgICd3aWR0aC5weCc6IDMwXG4gICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICNcbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDwhLS0gQ29sdW1uIEhlYWRlcnMgLS0+XG4gICAgICAgICAgPHRoIFxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiB2aXNpYmxlQ29sdW1uczsgbGV0IGNvbEluZGV4ID0gaW5kZXg7IGxldCBpc0ZpcnN0ID0gZmlyc3Q7IGxldCBpc0xhc3QgPSBsYXN0XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgJ2hlYWRlci1jZWxsJzogbW9kZSA9PT0gJ3N0YW5kYXJkJyxcbiAgICAgICAgICAgICAgJ3N0aWNreS1sZWZ0JzogY29sdW1uLnN0aWNreSA9PT0gJ2xlZnQnLFxuICAgICAgICAgICAgICAnc3RpY2t5LXJpZ2h0JzogY29sdW1uLnN0aWNreSA9PT0gJ3JpZ2h0JyxcbiAgICAgICAgICAgICAgJ3N0aWNreS1yaWdodC1maXJzdCc6IGNvbHVtbi5zdGlja3kgPT09ICdyaWdodCcgJiYgaXNGaXJzdFN0aWNreVJpZ2h0KGNvbHVtbi5rZXkpLFxuICAgICAgICAgICAgICAncmVzaXphYmxlJzogY29sdW1uLnJlc2l6YWJsZSAhPT0gZmFsc2VcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICBwb3NpdGlvbjogY29sdW1uLnN0aWNreSA/ICdzdGlja3knIDogbnVsbCxcbiAgICAgICAgICAgICAgJ2xlZnQucHgnOiBjb2x1bW4uc3RpY2t5ID09PSAnbGVmdCcgPyAoY29sdW1uLnN0aWNreU9mZnNldCB8fCAwKSA6IG51bGwsXG4gICAgICAgICAgICAgICdyaWdodC5weCc6IGNvbHVtbi5zdGlja3kgPT09ICdyaWdodCcgPyAoY29sdW1uLnN0aWNreU9mZnNldCB8fCAwKSA6IG51bGwsXG4gICAgICAgICAgICAgICd6LWluZGV4JzogY29sdW1uLnN0aWNreSA/IFpJbmRleC5TVElDS1lfSEVBREVSX0NFTEwgOiBudWxsLFxuICAgICAgICAgICAgICAnd2lkdGgucHgnOiBjb2x1bW4ud2lkdGhcbiAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPHN0LWhlYWRlciBcbiAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICBbY29sdW1uSW5kZXhdPVwiY29sSW5kZXhcIlxuICAgICAgICAgICAgICBbaXNGaXJzdENvbHVtbl09XCJpc0ZpcnN0XCJcbiAgICAgICAgICAgICAgW2lzTGFzdENvbHVtbl09XCJpc0xhc3RcIlxuICAgICAgICAgICAgICBbdGFibGVTdGF0ZV09XCJnZXRBY3RpdmVUYWJsZVN0YXRlKClcIlxuICAgICAgICAgICAgICBbZW5hYmxlU29ydGluZ109XCJtZXJnZWRDb25maWcuc29ydGluZz8uZW5hYmxlZCA/PyBlbmFibGVTb3J0aW5nXCJcbiAgICAgICAgICAgICAgW2VuYWJsZUZpbHRlcmluZ109XCJtZXJnZWRDb25maWcuZmlsdGVyaW5nPy5lbmFibGVkID8/IGVuYWJsZUZpbHRlcmluZ1wiXG4gICAgICAgICAgICAgIChjb2x1bW5Nb3ZlZCk9XCJvbkNvbHVtbk1vdmVkKCRldmVudClcIlxuICAgICAgICAgICAgICAobWVudUNsaWNrKT1cIm9wZW5Db2x1bW5NZW51KCRldmVudCwgY29sdW1uLCBjb2xJbmRleCwgaXNGaXJzdCwgaXNMYXN0KVwiPlxuICAgICAgICAgICAgPC9zdC1oZWFkZXI+XG5cbiAgICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAgIGNsYXNzPVwicmVzaXplLWhhbmRsZVwiIFxuICAgICAgICAgICAgICBzdENvbHVtblJlc2l6ZVxuICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgIChjb2x1bW5SZXNpemVkKT1cIm9uQ29sdW1uUmVzaXplZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4ucmVzaXphYmxlICE9PSBmYWxzZVwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICBcbiAgICAgICAgICA8IS0tIFNldHRpbmdzIENvbHVtbiBIZWFkZXIgLS0+XG4gICAgICAgICAgPHRoIFxuICAgICAgICAgICAgY2xhc3M9XCJzZXR0aW5ncy1jb2x1bW4gc3RpY2t5LXJpZ2h0XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2hlYWRlci1jZWxsJzogbW9kZSA9PT0gJ3N0YW5kYXJkJyB9XCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3otaW5kZXgnOiBaSW5kZXguU1RJQ0tZX0hFQURFUl9DRUxMIH1cIj5cbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyAnZmxleC1jZW50ZXInOiBtb2RlID09PSAndmlydHVhbCcsICdoZWFkZXItY29udGVudCc6IG1vZGUgPT09ICdzdGFuZGFyZCcgfVwiPlxuICAgICAgICAgICAgICA8c3QtdGFibGUtYWN0aW9ucyBcbiAgICAgICAgICAgICAgICBbdGFibGVTdGF0ZV09XCJnZXRBY3RpdmVUYWJsZVN0YXRlKClcIlxuICAgICAgICAgICAgICAgIFthbGxvd0FkZENvbHVtbl09XCJtZXJnZWRDb25maWcuZmVhdHVyZXM/LmNvbHVtbk1hbmFnZW1lbnQ/LmFsbG93QWRkIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAoYWRkQ29sdW1uQ2xpY2tlZCk9XCJvbkFkZENvbHVtbkNsaWNrKClcIj5cbiAgICAgICAgICAgICAgPC9zdC10YWJsZS1hY3Rpb25zPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG5cbiAgICAgIDwhLS0gVEFCTEUgQk9EWSAtLT5cbiAgICAgIDx0Ym9keT5cbiAgICAgICAgPCEtLSBWaXJ0dWFsIFNjcm9sbCBSb3dzIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZSA9PT0gJ3ZpcnR1YWwnXCI+XG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgdmlzaWJsZVJvd3MkIHwgYXN5bmM7IGxldCByZWxhdGl2ZUluZGV4ID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlSb3dJbmRleFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXJvdy1pbmRleF09XCJnZXRBYnNvbHV0ZVJvd0luZGV4KHJlbGF0aXZlSW5kZXgpXCI+XG4gICAgICAgICAgICA8IS0tIFJvdyBOdW1iZXIgQ2VsbCAtLT5cbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cIm1lcmdlZENvbmZpZy5zaG93Um93TnVtYmVyXCIgY2xhc3M9XCJyb3ctbnVtYmVyLWNlbGxcIiBcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc3RpY2t5LWxlZnQnOiAnbGVmdCcgfVwiXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgICAnd2lkdGgucHgnOiAzMCxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3N0aWNreScsXG4gICAgICAgICAgICAgICAgJ2xlZnQucHgnOiAwLFxuICAgICAgICAgICAgICAgICd6LWluZGV4JzogWkluZGV4LlNUSUNLWV9CT0RZX0NFTEwsXG4gICAgICAgICAgICAgICAgJ2hlaWdodC5weCc6IG1vZGUgPT09ICd2aXJ0dWFsJyA/IGdldFZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpIDogbnVsbFxuICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgIHt7Z2V0QWJzb2x1dGVSb3dJbmRleChyZWxhdGl2ZUluZGV4KSArIDF9fVxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJib2R5Q2VsbFRlbXBsYXRlOyBjb250ZXh0OiB7IFxuICAgICAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICAgICAgcm93SW5kZXg6IGdldEFic29sdXRlUm93SW5kZXgocmVsYXRpdmVJbmRleCksXG4gICAgICAgICAgICAgIG1vZGU6ICd2aXJ0dWFsJyxcbiAgICAgICAgICAgICAgcmVsYXRpdmVJbmRleDogcmVsYXRpdmVJbmRleFxuICAgICAgICAgICAgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gU3RhbmRhcmQgUm93cyAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZGUgPT09ICdzdGFuZGFyZCdcIj5cbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiB2aXNpYmxlQ2VsbEdyaWQ7IGxldCByb3dJbmRleCA9IGluZGV4XCIgW2F0dHIuZGF0YS1yb3ctaW5kZXhdPVwicm93SW5kZXhcIj5cbiAgICAgICAgICAgIDwhLS0gUm93IE51bWJlciBDZWxsIC0tPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwibWVyZ2VkQ29uZmlnLnNob3dSb3dOdW1iZXJcIiBjbGFzcz1cInJvdy1udW1iZXItY2VsbFwiIFxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzdGlja3ktbGVmdCc6ICdsZWZ0JyB9XCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgICd3aWR0aC5weCc6IDMwLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnc3RpY2t5JyxcbiAgICAgICAgICAgICAgICAnbGVmdC5weCc6IDAsXG4gICAgICAgICAgICAgICAgJ3otaW5kZXgnOiBaSW5kZXguU1RJQ0tZX0JPRFlfQ0VMTCxcbiAgICAgICAgICAgICAgICAnaGVpZ2h0LnB4JzogbW9kZSA9PT0gJ3ZpcnR1YWwnID8gZ2V0VmlydHVhbFNjcm9sbEl0ZW1TaXplKCkgOiBudWxsXG4gICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAge3tyb3dJbmRleCArIDF9fVxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJib2R5Q2VsbFRlbXBsYXRlOyBjb250ZXh0OiB7IFxuICAgICAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICAgICAgcm93SW5kZXg6IHJvd0luZGV4LFxuICAgICAgICAgICAgICBtb2RlOiAnc3RhbmRhcmQnXG4gICAgICAgICAgICB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cbiAgPCEtLSBSRVVTQUJMRSBCT0RZIENFTEwgVEVNUExBVEUgLS0+XG4gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPlxuICA8bmctdGVtcGxhdGUgI2JvZHlDZWxsVGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCIgbGV0LW1vZGU9XCJtb2RlXCIgbGV0LXJlbGF0aXZlSW5kZXg9XCJyZWxhdGl2ZUluZGV4XCI+XG4gICAgPCEtLSBEYXRhIENlbGxzIC0tPlxuICAgIDx0ZCBcbiAgICAgICpuZ0Zvcj1cImxldCBjZWxsIG9mIHJvdzsgbGV0IGNvbEluZGV4ID0gaW5kZXhcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnc3RpY2t5LWxlZnQnOiB2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0/LnN0aWNreSA9PT0gJ2xlZnQnLFxuICAgICAgICAnc3RpY2t5LXJpZ2h0JzogdmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdPy5zdGlja3kgPT09ICdyaWdodCcsXG4gICAgICAgICdzdGlja3ktcmlnaHQtZmlyc3QnOiB2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0/LnN0aWNreSA9PT0gJ3JpZ2h0JyAmJiB2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0/LmtleSAmJiBpc0ZpcnN0U3RpY2t5UmlnaHQodmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdLmtleSksXG4gICAgICAgICdhbGlnbi1jZW50ZXInOiB2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0/LmFsaWdubWVudCA9PT0gJ2NlbnRlcicsXG4gICAgICAgICdhbGlnbi1yaWdodCc6IHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8uYWxpZ25tZW50ID09PSAncmlnaHQnLFxuICAgICAgICAnY2VsbC1mb2N1c2VkJzogY2VsbC5pc0ZvY3VzZWQoKVxuICAgICAgfVwiXG4gICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgIHBvc2l0aW9uOiB2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0/LnN0aWNreSA/ICdzdGlja3knIDogbnVsbCxcbiAgICAgICAgJ2xlZnQucHgnOiB2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0/LnN0aWNreSA9PT0gJ2xlZnQnID8gKHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8uc3RpY2t5T2Zmc2V0IHx8IDApIDogbnVsbCxcbiAgICAgICAgJ3JpZ2h0LnB4JzogdmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdPy5zdGlja3kgPT09ICdyaWdodCcgPyAodmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdPy5zdGlja3lPZmZzZXQgfHwgMCkgOiBudWxsLFxuICAgICAgICAnei1pbmRleCc6IHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8uc3RpY2t5ID8gWkluZGV4LlNUSUNLWV9CT0RZX0NFTEwgOiBudWxsLFxuICAgICAgICAnd2lkdGgucHgnOiB2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0/LndpZHRoLFxuICAgICAgICAnaGVpZ2h0LnB4JzogbW9kZSA9PT0gJ3ZpcnR1YWwnID8gZ2V0VmlydHVhbFNjcm9sbEl0ZW1TaXplKCkgOiBudWxsXG4gICAgICB9XCJcbiAgICAgIChjbGljayk9XCJpc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSA/IG9uQ2VsbENsaWNrKHJvd0luZGV4LCBjb2xJbmRleCkgOiBudWxsXCI+XG4gICAgICBcbiAgICAgIDwhLS0gVmlydHVhbCBTY3JvbGwgQ2VsbCAtLT5cbiAgICAgIDxzdC1jZWxsIFxuICAgICAgICAqbmdJZj1cIm1vZGUgPT09ICd2aXJ0dWFsJ1wiXG4gICAgICAgIFtjZWxsXT1cImNlbGxcIiBcbiAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiY2VsbC5pc0ZvY3VzZWQoKSA/IDAgOiAtMVwiIFxuICAgICAgICBbZWRpdE1vZGVdPVwiZ2V0RWRpdE1vZGVGb3JDZWxscygpXCJcbiAgICAgICAgW3RhYmxlU3RhdGVdPVwiZ2V0QWN0aXZlVGFibGVTdGF0ZSgpXCJcbiAgICAgICAgW3RhYmxlQ29uZmlnXT1cIm1lcmdlZENvbmZpZ1wiXG4gICAgICAgIFtjb2x1bW5JbmRleF09XCJjb2xJbmRleFwiXG4gICAgICAgIChjZWxsRWRpdCk9XCJvbkNlbGxFZGl0KCRldmVudClcIiBcbiAgICAgICAgKGNlbGxTYXZlKT1cIm9uQ2VsbFNhdmUoJGV2ZW50KVwiXG4gICAgICAgIChjZWxsU2F2ZUFuZE5hdmlnYXRlKT1cIm9uQ2VsbFNhdmVBbmROYXZpZ2F0ZSgkZXZlbnQpXCIgXG4gICAgICAgIChjZWxsQ2FuY2VsKT1cIm9uQ2VsbENhbmNlbCgkZXZlbnQpXCJcbiAgICAgICAgKGNlbGxDaGFuZ2UpPVwiY2VsbENoYW5nZS5lbWl0KCRldmVudClcIj5cbiAgICAgIDwvc3QtY2VsbD5cblxuICAgICAgPCEtLSBTdGFuZGFyZCBDZWxsIC0tPlxuICAgICAgPHN0LWNlbGwgXG4gICAgICAgICpuZ0lmPVwibW9kZSA9PT0gJ3N0YW5kYXJkJ1wiXG4gICAgICAgIFtjZWxsXT1cImNlbGxcIiAgXG4gICAgICAgIFthdHRyLnRhYmluZGV4XT1cImNlbGwuaXNGb2N1c2VkKCkgPyAwIDogLTFcIlxuICAgICAgICBbdGFibGVTdGF0ZV09XCJnZXRBY3RpdmVUYWJsZVN0YXRlKClcIlxuICAgICAgICBbdGFibGVDb25maWddPVwibWVyZ2VkQ29uZmlnXCJcbiAgICAgICAgW2NvbHVtbkluZGV4XT1cImNvbEluZGV4XCJcbiAgICAgICAgKGNlbGxTYXZlKT1cIm9uQ2VsbFNhdmUoJGV2ZW50KVwiXG4gICAgICAgIChjZWxsQ2hhbmdlKT1cImNlbGxDaGFuZ2UuZW1pdCgkZXZlbnQpXCI+XG4gICAgICA8L3N0LWNlbGw+XG4gICAgPC90ZD5cbiAgICBcbiAgICA8IS0tIFJvdyBBY3Rpb25zIENlbGwgLS0+XG4gICAgPHRkIGNsYXNzPVwic2V0dGluZ3MtY29sdW1uXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ2hhcy1hY3Rpb25zJzogaGFzUm93QWN0aW9ucygpXG4gICAgICB9XCJcbiAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgcG9zaXRpb246IGhhc1Jvd0FjdGlvbnMoKSA/ICdzdGlja3knIDogbnVsbCxcbiAgICAgICAgJ3JpZ2h0LnB4JzogaGFzUm93QWN0aW9ucygpID8gMCA6IG51bGwsXG4gICAgICAgICd6LWluZGV4JzogaGFzUm93QWN0aW9ucygpID8gWkluZGV4LlNUSUNLWV9CT0RZX0NFTEwgOiBudWxsXG4gICAgICB9XCI+XG4gICAgICA8YnV0dG9uIFxuICAgICAgICAqbmdJZj1cImhhc1Jvd0FjdGlvbnMoKVwiXG4gICAgICAgIGNsYXNzPVwic2V0dGluZ3MtdHJpZ2dlclwiXG4gICAgICAgIChjbGljayk9XCJvcGVuUm93QWN0aW9uc0Ryb3Bkb3duKCRldmVudCwgZ2V0Um93RGF0YShyb3dJbmRleCksIHJvd0luZGV4KVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgYXJpYS1sYWJlbD1cIlJvdyBhY3Rpb25zXCI+XG4gICAgICAgIOKLr1xuICAgICAgPC9idXR0b24+XG4gICAgPC90ZD5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNza2VsZXRvbkxvYWRlcj5cbiAgPGRpdiBjbGFzcz1cImxpc3Qtcm93XCIgKm5nSWY9XCIobWVyZ2VkQ29uZmlnLnRhYmxlU2tlbGV0b24/LmVuYWJsZWQgfCBhc3luYylcIj5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpIG9mIHNrZWxldG9uQ29sdW1uc1wiIGNsYXNzPVwibGlzdC1jb250ZW50XCI+XG4gICAgICA8bmlsZS1za2VsZXRvbi1sb2FkZXIgdmFyaWFudD1cInRleHRcIiB3aWR0aD1cIjkwJVwiIGhlaWdodD1cIjE4XCIgKm5nRm9yPVwibGV0IGogb2Ygc2tlbGV0b25Sb3dzXCI+PC9uaWxlLXNrZWxldG9uLWxvYWRlcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPiJdfQ==
1387
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9yZW5kZXJlci9jb21wb25lbnRzL3N0LXRhYmxlL3N0LXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC10YWJsZS9zdC10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUErQyxTQUFTLEVBQUUsVUFBVSxFQUFpQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEssT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RCxPQUFPLEVBQWUsZ0JBQWdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV2RixPQUFPLEVBQWtFLFFBQVEsRUFBdUIsTUFBTSw0QkFBNEIsQ0FBQztBQUMzSSxPQUFPLEVBQUUsZUFBZSxFQUE0QixNQUFNLE1BQU0sQ0FBQztBQUNqRSxPQUFPLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFPM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFRekQsTUFBTSxPQUFPLGdCQUFnQjtJQThIM0IsWUFDVSxlQUEyQyxFQUMzQyxNQUErQixFQUMvQixvQkFBMEMsRUFDMUMsVUFBbUM7UUFIbkMsb0JBQWUsR0FBZixlQUFlLENBQTRCO1FBQzNDLFdBQU0sR0FBTixN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QUNyQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDaEMsQ0FBQzs7NkdBOWlEVSxnQkFBZ0I7aUdBQWhCLGdCQUFnQiw4eUJBNEhVLFVBQVUsa0RDcEpqRCxrOVhBOFJjOzJGRHRRRCxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsVUFBVTttTkFTWCxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLElBQUk7c0JBQVosS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBR0ksV0FBVztzQkFBcEIsTUFBTTtnQkFHRyxVQUFVO3NCQUFuQixNQUFNO2dCQUdHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUdHLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFHRyxXQUFXO3NCQUFwQixNQUFNO2dCQUdHLFNBQVM7c0JBQWxCLE1BQU07Z0JBR0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUdHLGFBQWE7c0JBQXRCLE1BQU07Z0JBR0UsY0FBYztzQkFBdEIsS0FBSztnQkEyRTZDLGNBQWM7c0JBQWhFLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQTY1Q2pELGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29sdW1uQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2NvbHVtbi1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IENlbGwgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2VsbC5jbGFzcyc7XG5pbXBvcnQgeyBUYWJsZVN0YXRlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXN0YXRlLmNsYXNzJztcbmltcG9ydCB7IFRhYmxlQ29uZmlnLCBtZXJnZVRhYmxlQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3RhYmxlLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGFibGVTdGF0ZUNoYW5nZUV2ZW50LCBDb2x1bW5SZXNpemVFdmVudCwgQ29sdW1uQWRkRXZlbnQsIENvbHVtbk1vdmVFdmVudCwgQ2VsbEZvY3VzUG9zaXRpb24sIERhdGFDaGFuZ2VFdmVudCB9IGZyb20gJy4uLy4uL21vZGVscy90YWJsZS10eXBlcyc7XG5pbXBvcnQgeyBDZWxsQ2hhbmdlRXZlbnQsIENlbGxTYXZlRXZlbnQsIENlbGxFZGl0RXZlbnQsIENlbGxDYW5jZWxFdmVudCwgRWRpdE1vZGUsIE5hdmlnYXRpb25EaXJlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY2VsbC10eXBlcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEpzb25TY2hlbWFWYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvanNvbi1zY2hlbWEtdmFsaWRhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2NoZW1hVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3NjaGVtYS12YWxpZGF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24tbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlydHVhbFNjcm9sbFNlcnZpY2UsIFZpcnR1YWxTY3JvbGxTdGF0ZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ZpcnR1YWwtc2Nyb2xsLnNlcnZpY2UnO1xuaW1wb3J0IHsgUm93QWN0aW9uLCBSb3dBY3Rpb25Db250ZXh0LCBSb3dBY3Rpb25FdmVudCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9yb3ctYWN0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb2x1bW5BY3Rpb24sIENvbHVtbkFjdGlvbkNvbnRleHQsIENvbHVtbkFjdGlvbkV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2NvbHVtbi1hY3Rpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFRhYmxlWkluZGV4IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3otaW5kZXguZW51bSc7XG5pbXBvcnQgeyBTb3J0RGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXR5cGVzJztcbmltcG9ydCB7IFRhYmxlVmFsaWRhdGlvblN0YXRlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXZhbGlkYXRpb24tc3RhdGUuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3QtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3QtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdC10YWJsZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFN0VGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgLy8gWi1JbmRleCBjb25zdGFudHMgZm9yIHRlbXBsYXRlIHVzZVxuICByZWFkb25seSBaSW5kZXggPSBUYWJsZVpJbmRleDtcbiAgXG4gIC8vIE5FVzogUHJpbWFyeSBjb25maWd1cmF0aW9uIGlucHV0XG4gIEBJbnB1dCgpIHRhYmxlQ29uZmlnITogVGFibGVDb25maWc7XG4gIFxuICAvLyBORVc6IFJhdyBkYXRhIGlucHV0IChhbHRlcm5hdGl2ZSB0byBjZWxsR3JpZClcbiAgQElucHV0KCkgZGF0YT86IGFueVtdO1xuICBcbiAgLy8gTkVXOiBPYnNlcnZhYmxlL0JlaGF2aW9yU3ViamVjdCBkYXRhIGlucHV0IChmb3IgcmVhY3RpdmUgZGF0YSBzdHJlYW1zKVxuICBASW5wdXQoKSBkYXRhJD86IE9ic2VydmFibGU8YW55W10+IHwgQmVoYXZpb3JTdWJqZWN0PGFueVtdPjtcbiAgXG4gIEBJbnB1dCgpIHRhYmxlU3RhdGU/OiBUYWJsZVN0YXRlO1xuICBcbiAgLy8gREVQUkVDQVRFRDogVXNlIHRhYmxlQ29uZmlnIGluc3RlYWRcbiAgQElucHV0KCkgZW5hYmxlU29ydGluZzogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGVuYWJsZUZpbHRlcmluZzogYm9vbGVhbiA9IHRydWU7XG4gIFxuICAvLyBORVc6IFN0YXRlIGNoYW5nZSBvdXRwdXRcbiAgQE91dHB1dCgpIHN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZVN0YXRlQ2hhbmdlRXZlbnQ+KCk7XG4gIFxuICAvLyBORVc6IERhdGEgY2hhbmdlIG91dHB1dCAoZm9yIGFzeW5jIGRhdGEgdXBkYXRlcylcbiAgQE91dHB1dCgpIGRhdGFDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFDaGFuZ2VFdmVudD4oKTtcbiAgXG4gIC8vIEVYSVNUSU5HOiBDZWxsIGFuZCBjb2x1bW4gZXZlbnRzXG4gIEBPdXRwdXQoKSBjZWxsRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbEVkaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNlbGxTYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxDZWxsU2F2ZUV2ZW50PigpO1xuICBAT3V0cHV0KCkgY2VsbENhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbENhbmNlbEV2ZW50PigpO1xuICBAT3V0cHV0KCkgY2VsbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbENoYW5nZUV2ZW50PigpO1xuICBAT3V0cHV0KCkgY29sdW1uUmVzaXplZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uUmVzaXplRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjb2x1bW5Nb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uTW92ZUV2ZW50PigpO1xuICBcbiAgLy8gTkVXOiBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gb3V0cHV0XG4gIEBPdXRwdXQoKSBjb25maWdWYWxpZGF0aW9uRXJyb3JzID0gbmV3IEV2ZW50RW1pdHRlcjxTY2hlbWFWYWxpZGF0aW9uRXJyb3JbXT4oKTtcbiAgXG4gIC8vIE5FVzogQ29sdW1uIG1hbmFnZW1lbnQgb3V0cHV0XG4gIEBPdXRwdXQoKSBjb2x1bW5BZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uQWRkRXZlbnQ+KCk7XG4gIFxuICAvLyBORVc6IFJvdyBhY3Rpb24gb3V0cHV0XG4gIEBPdXRwdXQoKSByb3dBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPFJvd0FjdGlvbkV2ZW50PigpO1xuICBcbiAgLy8gTkVXOiBWYWxpZGF0aW9uIHN0YXRlIGNoYW5nZSBvdXRwdXRcbiAgQE91dHB1dCgpIHZhbGlkYXRpb25TdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVWYWxpZGF0aW9uU3RhdGU+KCk7XG4gIFxuICAvLyBORVc6IFJlcXVlc3QgdG8gYWRkIGEgbmV3IHJvdyAoZW1pdHRlZCB3aGVuIG5hdmlnYXRpbmcgcGFzdCBsYXN0IHJvdyB3aXRoIGFkZFJvd09uTmF2aWdhdGVQYXN0RW5kIGVuYWJsZWQpXG4gIEBPdXRwdXQoKSByZXF1ZXN0QWRkUm93ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGZvY3VzQ29sdW1uPzogbnVtYmVyIH0+KCk7XG4gIFxuICAvLyBORVc6IE9wdGlvbmFsIHZhbGlkYXRpb24gZmxhZ1xuICBASW5wdXQoKSB2YWxpZGF0ZUNvbmZpZzogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLy8gSW50ZXJuYWwgc3RhdGVcbiAgcHJpdmF0ZSBpbnRlcm5hbFRhYmxlU3RhdGU/OiBUYWJsZVN0YXRlO1xuICBwcml2YXRlIGludGVybmFsQ2VsbEdyaWQ/OiBDZWxsPGFueT5bXVtdO1xuICBwcml2YXRlIHN0YXRlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGZvY3VzU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHZhbGlkYXRpb25TdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZGF0YVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSByZXF1ZXN0QWRkUm93U3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGludGVybmFsRGF0YSQ6IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gIHByaXZhdGUgcHJldmlvdXNEYXRhOiBhbnlbXSA9IFtdO1xuICBtZXJnZWRDb25maWchOiBUYWJsZUNvbmZpZztcbiAgXG4gIC8vIE1vZGFsIHN0YXRlXG4gIHB1YmxpYyBzaG93Q29sdW1uTW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8vIENhY2hlZCB2aXNpYmxlIGNvbHVtbnMgYW5kIGNlbGwgZ3JpZCB0byBwcmV2ZW50IHJlLWNyZWF0aW9uIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb25cbiAgcHVibGljIHZpc2libGVDb2x1bW5zOiBDb2x1bW5Db25maWc8YW55PltdID0gW107XG4gIHB1YmxpYyB2aXNpYmxlQ2VsbEdyaWQ6IENlbGw8YW55PltdW10gPSBbXTtcbiAgXG4gIC8vIFJvdyBhY3Rpb25zIGRyb3Bkb3duIHN0YXRlXG4gIHB1YmxpYyBkcm9wZG93blN0YXRlOiB7XG4gICAgaXNPcGVuOiBib29sZWFuO1xuICAgIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gICAgY29udGV4dDogUm93QWN0aW9uQ29udGV4dCB8IG51bGw7XG4gIH0gPSB7XG4gICAgaXNPcGVuOiBmYWxzZSxcbiAgICBwb3NpdGlvbjogeyB4OiAwLCB5OiAwIH0sXG4gICAgY29udGV4dDogbnVsbFxuICB9O1xuICBcbiAgcHVibGljIHNrZWxldG9uQ29sdW1ucz86IG51bWJlcltdO1xuICBwdWJsaWMgc2tlbGV0b25Sb3dzPzogbnVtYmVyW107XG5cbiAgLy8gQ29sdW1uIG1lbnUgZHJvcGRvd24gc3RhdGVcbiAgcHVibGljIGNvbHVtbk1lbnVTdGF0ZToge1xuICAgIGlzT3BlbjogYm9vbGVhbjtcbiAgICBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICAgIGNvbnRleHQ6IENvbHVtbkFjdGlvbkNvbnRleHQgfCBudWxsO1xuICB9ID0ge1xuICAgIGlzT3BlbjogZmFsc2UsXG4gICAgcG9zaXRpb246IHsgeDogMCwgeTogMCB9LFxuICAgIGNvbnRleHQ6IG51bGxcbiAgfTtcbiAgXG4gIC8vIFZpcnR1YWwgc2Nyb2xsIHByb3BlcnRpZXNcbiAgcHJpdmF0ZSBzY3JvbGxDb250YWluZXI/OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBzY3JvbGxTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgdmlydHVhbFNjcm9sbFN0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VmlydHVhbFNjcm9sbFN0YXRlIHwgbnVsbD4obnVsbCk7XG4gIFxuICAvLyBPYnNlcnZhYmxlIHN0cmVhbXMgZGVyaXZlZCBmcm9tIHZpcnR1YWwgc2Nyb2xsIHN0YXRlXG4gIHB1YmxpYyB2aXJ0dWFsU2Nyb2xsVG90YWxIZWlnaHQkOiBPYnNlcnZhYmxlPG51bWJlcj4gPSB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQucGlwZShcbiAgICBtYXAoc3RhdGUgPT4gc3RhdGU/LnRvdGFsSGVpZ2h0ID8/IDApLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgKTtcbiAgXG4gIHB1YmxpYyB2aXJ0dWFsU2Nyb2xsT2Zmc2V0WSQ6IE9ic2VydmFibGU8bnVtYmVyPiA9IHRoaXMudmlydHVhbFNjcm9sbFN0YXRlJC5waXBlKFxuICAgIG1hcChzdGF0ZSA9PiBzdGF0ZT8ub2Zmc2V0WSA/PyAwKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICk7XG5cbiAgcHVibGljIHZpcnR1YWxTY3JvbGxPZmZzZXRZTmVnJDogT2JzZXJ2YWJsZTxudW1iZXI+ID0gdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLnBpcGUoXG4gICAgbWFwKHN0YXRlID0+IE51bWJlcihzdGF0ZT8ub2Zmc2V0WSA/PyAwKSAqIC0xICksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICApO1xuICBcbiAgcHVibGljIHZpc2libGVSb3dzJDogT2JzZXJ2YWJsZTxDZWxsPGFueT5bXVtdPiA9IHRoaXMudmlydHVhbFNjcm9sbFN0YXRlJC5waXBlKFxuICAgIG1hcChzdGF0ZSA9PiB7XG4gICAgICBpZiAoIXN0YXRlKSByZXR1cm4gdGhpcy52aXNpYmxlQ2VsbEdyaWQ7XG4gICAgICBjb25zdCB7IHN0YXJ0SW5kZXgsIGVuZEluZGV4IH0gPSBzdGF0ZTtcbiAgICAgIHJldHVybiB0aGlzLnZpc2libGVDZWxsR3JpZC5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgfSlcbiAgKTtcbiAgXG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbFZpZXdwb3J0JywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHNjcm9sbFZpZXdwb3J0PzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIFxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNjaGVtYVZhbGlkYXRvcjogSnNvblNjaGVtYVZhbGlkYXRvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2dnZXI6IFZhbGlkYXRpb25Mb2dnZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdmlydHVhbFNjcm9sbFNlcnZpY2U6IFZpcnR1YWxTY3JvbGxTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBWYWxpZGF0ZSB0aGF0IGF0IGxlYXN0IHRhYmxlQ29uZmlnIG9yIGNvbHVtbnMgaXMgcHJvdmlkZWRcbiAgICBpZiAoIXRoaXMudGFibGVDb25maWcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRWl0aGVyIHRhYmxlQ29uZmlnIG9yIGNvbHVtbnMgbXVzdCBiZSBwcm92aWRlZCcpO1xuICAgIH1cbiAgICBcbiAgICAvLyBNZXJnZSBjb25maWcgd2l0aCBkZWZhdWx0c1xuICAgIGlmICh0aGlzLnRhYmxlQ29uZmlnKSB7XG4gICAgICB0aGlzLm1lcmdlZENvbmZpZyA9IG1lcmdlVGFibGVDb25maWcodGhpcy50YWJsZUNvbmZpZyk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb24gaWYgZW5hYmxlZFxuICAgICAgaWYgKHRoaXMudmFsaWRhdGVDb25maWcpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZUNvbmZpZ3VyYXRpb24odGhpcy5tZXJnZWRDb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBDcmVhdGUgb3IgdXNlIFRhYmxlU3RhdGVcbiAgICBpZiAoIXRoaXMudGFibGVTdGF0ZSkge1xuICAgICAgdGhpcy5jcmVhdGVJbnRlcm5hbFRhYmxlU3RhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3Vic2NyaWJlIHRvIGV4dGVybmFsIHRhYmxlU3RhdGUgY2hhbmdlc1xuICAgICAgdGhpcy5zdWJzY3JpYmVUb0V4dGVybmFsVGFibGVTdGF0ZSgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZXR1cCBkYXRhIHNvdXJjZSAoc3luYyBvciBhc3luYylcbiAgICB0aGlzLnNldHVwRGF0YVNvdXJjZSgpO1xuICAgIFxuICAgIC8vIENhbGN1bGF0ZSBzdGlja3kgb2Zmc2V0c1xuICAgIGNvbnN0IHJvd051bWJlcldpZHRoID0gdGhpcy5tZXJnZWRDb25maWcuc2hvd1Jvd051bWJlciA/IDMwIDogMDtcbiAgICBjb25zdCBzZXR0aW5nc0NvbHVtbldpZHRoID0gdGhpcy5oYXNSb3dBY3Rpb25zKCkgPyAyOCA6IDA7IC8vIFNldHRpbmdzIGNvbHVtbiBpcyB+MzJweCB3aWRlIHdoZW4gdmlzaWJsZVxuICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLmNhbGN1bGF0ZVN0aWNreU9mZnNldHMocm93TnVtYmVyV2lkdGgsIHNldHRpbmdzQ29sdW1uV2lkdGgpO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgdmlzaWJsZSBjb2x1bW5zIGFuZCBjZWxsIGdyaWRcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVEYXRhKCk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSB2aXJ0dWFsIHNjcm9sbCBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMuaXNWaXJ0dWFsU2Nyb2xsRW5hYmxlZCgpKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVWaXJ0dWFsU2Nyb2xsKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIEluaXRpYWxpemUga2V5Ym9hcmQgbmF2aWdhdGlvbiBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUtleWJvYXJkTmF2aWdhdGlvbigpO1xuICAgIH1cblxuICAgIHRoaXMuc2tlbGV0b25Db2x1bW5zID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdGhpcy5tZXJnZWRDb25maWcudGFibGVTa2VsZXRvbj8uY29sdW1ucyA/PyAxMCB9LCAoXywgaSkgPT4gaSk7XG4gICAgdGhpcy5za2VsZXRvblJvd3MgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0aGlzLm1lcmdlZENvbmZpZy50YWJsZVNrZWxldG9uPy5yb3dzID8/IDEwIH0sIChfLCBpKSA9PiBpKTtcbiAgfVxuICBcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIC8vIFNldHVwIHZpcnR1YWwgc2Nyb2xsIGFmdGVyIHZpZXcgaXMgcmVhZHlcbiAgICBpZiAodGhpcy5pc1ZpcnR1YWxTY3JvbGxFbmFibGVkKCkgJiYgdGhpcy5zY3JvbGxWaWV3cG9ydCkge1xuICAgICAgdGhpcy5zZXR1cFZpcnR1YWxTY3JvbGxMaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBWYWxpZGF0ZSBjb25maWd1cmF0aW9uIHdoZW4gdGFibGVDb25maWcgY2hhbmdlc1xuICAgIGlmIChjaGFuZ2VzWyd0YWJsZUNvbmZpZyddICYmICFjaGFuZ2VzWyd0YWJsZUNvbmZpZyddLmZpcnN0Q2hhbmdlICYmIHRoaXMudGFibGVDb25maWcpIHtcbiAgICAgIHRoaXMubWVyZ2VkQ29uZmlnID0gbWVyZ2VUYWJsZUNvbmZpZyh0aGlzLnRhYmxlQ29uZmlnKTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgY29uZmlndXJhdGlvbiBpZiBlbmFibGVkXG4gICAgICBpZiAodGhpcy52YWxpZGF0ZUNvbmZpZykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlQ29uZmlndXJhdGlvbih0aGlzLm1lcmdlZENvbmZpZyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSBpbnRlcm5hbCB0YWJsZSBzdGF0ZSB3aXRoIG5ldyBjb2x1bW5zIGlmIHVzaW5nIGludGVybmFsIHN0YXRlXG4gICAgICBpZiAodGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUudXBkYXRlQ29sdW1ucyh0aGlzLm1lcmdlZENvbmZpZy5jb2x1bW5zKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIHZpc2libGUgY29sdW1ucyBhbmQgY2VsbCBncmlkXG4gICAgICB0aGlzLnVwZGF0ZVZpc2libGVEYXRhKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlY3JlYXRlIGNlbGwgZ3JpZCB3aGVuIGRhdGEgY2hhbmdlcyAob25seSBpZiBub3QgdXNpbmcgZGF0YSQgT2JzZXJ2YWJsZSlcbiAgICBpZiAoY2hhbmdlc1snZGF0YSddICYmICFjaGFuZ2VzWydkYXRhJ10uZmlyc3RDaGFuZ2UgJiYgdGhpcy5kYXRhICYmICF0aGlzLmRhdGEkKSB7XG4gICAgICB0aGlzLmhhbmRsZVN5bmNEYXRhQ2hhbmdlKGNoYW5nZXNbJ2RhdGEnXS5wcmV2aW91c1ZhbHVlIHx8IFtdKTtcbiAgICB9XG4gICAgXG4gICAgLy8gSGFuZGxlIGRhdGEkIE9ic2VydmFibGUgaW5wdXQgY2hhbmdlc1xuICAgIGlmIChjaGFuZ2VzWydkYXRhJCddICYmICFjaGFuZ2VzWydkYXRhJCddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLnNldHVwRGF0YVNvdXJjZSgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBSZWNyZWF0ZSBjZWxsIGdyaWQgd2hlbiBjZWxsR3JpZCBjaGFuZ2VzXG4gICAgaWYgKGNoYW5nZXNbJ2NlbGxHcmlkJ10gJiYgIWNoYW5nZXNbJ2NlbGxHcmlkJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIC8vIENlbGwgZ3JpZCB3YXMgdXBkYXRlZCBleHRlcm5hbGx5LCBubyBuZWVkIHRvIHJlY3JlYXRlXG4gICAgICAvLyBKdXN0IHJlY2FsY3VsYXRlIHN0aWNreSBvZmZzZXRzIGlmIG5lZWRlZFxuICAgICAgaWYgKHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpKSB7XG4gICAgICAgIGNvbnN0IHJvd051bWJlcldpZHRoID0gdGhpcy5tZXJnZWRDb25maWcuc2hvd1Jvd051bWJlciA/IDMwIDogMDtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3NDb2x1bW5XaWR0aCA9IHRoaXMuaGFzUm93QWN0aW9ucygpID8gMzIgOiAwO1xuICAgICAgICB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKS5jYWxjdWxhdGVTdGlja3lPZmZzZXRzKHJvd051bWJlcldpZHRoLCBzZXR0aW5nc0NvbHVtbldpZHRoKTtcbiAgICAgIH1cbiAgICAgIC8vIFVwZGF0ZSB2aXNpYmxlIGNvbHVtbnMgYW5kIGNlbGwgZ3JpZFxuICAgICAgdGhpcy51cGRhdGVWaXNpYmxlRGF0YSgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBIYW5kbGUgdGFibGVTdGF0ZSBpbnB1dCBjaGFuZ2VzICh3aGVuIGV4dGVybmFsIHN0YXRlIGlzIHByb3ZpZGVkLCBlLmcuLCBpbiB3b3JrYm9vaylcbiAgICBpZiAoY2hhbmdlc1sndGFibGVTdGF0ZSddICYmICFjaGFuZ2VzWyd0YWJsZVN0YXRlJ10uZmlyc3RDaGFuZ2UgJiYgdGhpcy50YWJsZVN0YXRlKSB7XG4gICAgICAvLyBVbnN1YnNjcmliZSBmcm9tIGFsbCBvbGQgdGFibGVTdGF0ZSBvYnNlcnZhYmxlcyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuICAgICAgdGhpcy5zdGF0ZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMudmFsaWRhdGlvblN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuZm9jdXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICBcbiAgICAgIC8vIFJlc3Vic2NyaWJlIHRvIG5ldyB0YWJsZVN0YXRlJ3Mgb2JzZXJ2YWJsZXNcbiAgICAgIHRoaXMuc3Vic2NyaWJlVG9FeHRlcm5hbFRhYmxlU3RhdGUoKTtcbiAgICAgIFxuICAgICAgLy8gUmVpbml0aWFsaXplIGtleWJvYXJkIG5hdmlnYXRpb24gd2l0aCBuZXcgdGFibGVTdGF0ZVxuICAgICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplS2V5Ym9hcmROYXZpZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFJlY2FsY3VsYXRlIHZpcnR1YWwgc2Nyb2xsIHdoZW4gZGF0YSBjaGFuZ2VzXG4gICAgaWYgKChjaGFuZ2VzWydkYXRhJ10gfHwgY2hhbmdlc1snY2VsbEdyaWQnXSkgJiYgIWNoYW5nZXNbJ2RhdGEnXT8uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQudmFsdWU7XG4gICAgICAgIGlmIChjdXJyZW50U3RhdGUpIHtcbiAgICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHRoaXMudmlydHVhbFNjcm9sbFNlcnZpY2UuY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHtcbiAgICAgICAgICAgIHNjcm9sbFRvcDogY3VycmVudFN0YXRlLnNjcm9sbFRvcCxcbiAgICAgICAgICAgIHZpZXdwb3J0SGVpZ2h0OiB0aGlzLmdldFZpcnR1YWxTY3JvbGxWaWV3cG9ydEhlaWdodCgpLFxuICAgICAgICAgICAgdG90YWxJdGVtczogdGhpcy52aXNpYmxlQ2VsbEdyaWQubGVuZ3RoLFxuICAgICAgICAgICAgaXRlbVNpemU6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbEl0ZW1TaXplKCksXG4gICAgICAgICAgICBidWZmZXJTaXplOiB0aGlzLmdldFZpcnR1YWxTY3JvbGxCdWZmZXJTaXplKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQubmV4dChuZXdTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIGtleWJvYXJkIG5hdmlnYXRpb24gZGltZW5zaW9ucyBpZiBlbmFibGVkXG4gICAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSAmJiAoY2hhbmdlc1snZGF0YSddIHx8IGNoYW5nZXNbJ2NlbGxHcmlkJ10pKSB7XG4gICAgICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLnNldERpbWVuc2lvbnMoXG4gICAgICAgICAgdGhpcy52aXNpYmxlQ2VsbEdyaWQubGVuZ3RoLFxuICAgICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMubGVuZ3RoXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBpbnRlcm5hbCBUYWJsZVN0YXRlIGZyb20gY29uZmlnXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUludGVybmFsVGFibGVTdGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUgPSBuZXcgVGFibGVTdGF0ZShjb2x1bW5zLCB7XG4gICAgICBwYWdlU2l6ZTogdGhpcy5tZXJnZWRDb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemUsXG4gICAgICBpbml0aWFsUGFnZTogdGhpcy5tZXJnZWRDb25maWcuaW5pdGlhbFN0YXRlPy5wYWdlXG4gICAgfSk7XG4gICAgXG4gICAgLy8gU2V0IHRvdGFsIGl0ZW1zIGlmIHByb3ZpZGVkIGluIGNvbmZpZyAoZm9yIHNlcnZlci1zaWRlIHBhZ2luYXRpb24pXG4gICAgaWYgKHRoaXMubWVyZ2VkQ29uZmlnLnBhZ2luYXRpb24/LnRvdGFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUuc2V0VG90YWxJdGVtcyh0aGlzLm1lcmdlZENvbmZpZy5wYWdpbmF0aW9uLnRvdGFsSXRlbXMpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBcHBseSBpbml0aWFsIHNvcnQgaWYgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5tZXJnZWRDb25maWcuaW5pdGlhbFN0YXRlPy5zb3J0QnkpIHtcbiAgICAgIHRoaXMubWVyZ2VkQ29uZmlnLmluaXRpYWxTdGF0ZS5zb3J0QnkuZm9yRWFjaChzb3J0ID0+IHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUhLmFkZFNvcnRUb0NvbHVtbihzb3J0LmtleSwgc29ydC5kaXJlY3Rpb24pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFwcGx5IGluaXRpYWwgZmlsdGVycyBpZiBwcm92aWRlZFxuICAgIGlmICh0aGlzLm1lcmdlZENvbmZpZy5pbml0aWFsU3RhdGU/LmZpbHRlcnMpIHtcbiAgICAgIHRoaXMubWVyZ2VkQ29uZmlnLmluaXRpYWxTdGF0ZS5maWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUhLnNldEZpbHRlck9uQ29sdW1uKGZpbHRlci5rZXksIGZpbHRlci5vcGVyYXRvciwgZmlsdGVyLnZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBTdWJzY3JpYmUgdG8gaW50ZXJuYWwgc3RhdGUgY2hhbmdlcyBhbmQgcmUtZW1pdFxuICAgIHRoaXMuc3Vic2NyaWJlVG9JbnRlcm5hbFN0YXRlKCk7XG4gICAgXG4gICAgLy8gU3Vic2NyaWJlIHRvIHZhbGlkYXRpb24gc3RhdGUgY2hhbmdlcyBhbmQgcmUtZW1pdFxuICAgIHRoaXMuc3Vic2NyaWJlVG9WYWxpZGF0aW9uU3RhdGUoKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb1ZhbGlkYXRpb25TdGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuaW50ZXJuYWxUYWJsZVN0YXRlKSByZXR1cm47XG4gICAgdGhpcy52YWxpZGF0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUudGFibGVWYWxpZGF0aW9uU3RhdGUkXG4gICAgICAuc3Vic2NyaWJlKHN0YXRlID0+IHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RhdGVDaGFuZ2UuZW1pdChzdGF0ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9JbnRlcm5hbFN0YXRlKCkge1xuICAgIGlmICghdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUpIHJldHVybjtcbiAgICB0aGlzLnN0YXRlU3Vic2NyaXB0aW9uID0gdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGU/LnN0YXRlQ2hhbmdlJFxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2UuZW1pdChldmVudCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpc2libGUgY29sdW1ucyBhbmQgY2VsbCBncmlkIG9uIHZpc2liaWxpdHkgY2hhbmdlc1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NvbHVtbi12aXNpYmlsaXR5JyB8fCBldmVudC50eXBlID09PSAnY29sdW1uLWNvbmZpZycpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVZpc2libGVEYXRhKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBleHRlcm5hbCBUYWJsZVN0YXRlIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9FeHRlcm5hbFRhYmxlU3RhdGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRhYmxlU3RhdGUpIHJldHVybjtcbiAgICBcbiAgICB0aGlzLnN0YXRlU3Vic2NyaXB0aW9uID0gdGhpcy50YWJsZVN0YXRlLnN0YXRlQ2hhbmdlJFxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2UuZW1pdChldmVudCk7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgdmlzaWJsZSBjb2x1bW5zIGFuZCBjZWxsIGdyaWQgb24gdmlzaWJpbGl0eSBjaGFuZ2VzXG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnY29sdW1uLXZpc2liaWxpdHknIHx8IGV2ZW50LnR5cGUgPT09ICdjb2x1bW4tY29uZmlnJykge1xuICAgICAgICAgIHRoaXMudXBkYXRlVmlzaWJsZURhdGEoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgXG4gICAgLy8gU3Vic2NyaWJlIHRvIHZhbGlkYXRpb24gc3RhdGUgY2hhbmdlcyBhbmQgcmUtZW1pdFxuICAgdGhpcy5zdWJzY3JpYmVUb1ZhbGlkYXRpb25TdGF0ZSgpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ3JlYXRlIGNlbGwgZ3JpZCBmcm9tIHJhdyBkYXRhXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNlbGxHcmlkRnJvbURhdGEoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHJldHVybjtcbiAgICBcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgdGhpcy5pbnRlcm5hbENlbGxHcmlkID0gdGhpcy5kYXRhLm1hcCgocm93RGF0YSwgcm93SW5kZXgpID0+XG4gICAgICBjb2x1bW5zLm1hcChjb2x1bW4gPT4gXG4gICAgICAgIG5ldyBDZWxsKGNvbHVtbiwgcm93RGF0YVtjb2x1bW4ua2V5XSwgcm93RGF0YSwgcm93SW5kZXgpXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFNldHVwIGRhdGEgc291cmNlIC0gZWl0aGVyIHN5bmMgYXJyYXkgb3IgYXN5bmMgT2JzZXJ2YWJsZVxuICAgKiBIYW5kbGVzIGluaXRpYWxpemF0aW9uIGFuZCBzdWJzY3JpcHRpb24gdG8gZGF0YSBjaGFuZ2VzXG4gICAqL1xuICBwcml2YXRlIHNldHVwRGF0YVNvdXJjZSgpOiB2b2lkIHtcbiAgICAvLyBXYXJuIGlmIGJvdGggZGF0YSBhbmQgZGF0YSQgYXJlIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1N0VGFibGVDb21wb25lbnQ6IEJvdGggZGF0YSBhbmQgZGF0YSQgaW5wdXRzIGFyZSBwcm92aWRlZC4gVXNpbmcgZGF0YSQgKE9ic2VydmFibGUpIGFuZCBpZ25vcmluZyBkYXRhIGFycmF5LicpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDbGVhbiB1cCBleGlzdGluZyBzdWJzY3JpcHRpb25cbiAgICB0aGlzLmRhdGFTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgXG4gICAgLy8gUHJpb3JpdHk6IGRhdGEkIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBkYXRhXG4gICAgaWYgKHRoaXMuZGF0YSQpIHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlVG9EYXRhQ2hhbmdlcygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhKSB7XG4gICAgICAvLyBGb3Igc3luYyBkYXRhLCBlbWl0IG9uY2UgdGhyb3VnaCBpbnRlcm5hbCBvYnNlcnZhYmxlXG4gICAgICB0aGlzLnByZXZpb3VzRGF0YSA9IFtdO1xuICAgICAgdGhpcy5pbnRlcm5hbERhdGEkLm5leHQodGhpcy5kYXRhKTtcbiAgICAgIHRoaXMuc3Vic2NyaWJlVG9EYXRhQ2hhbmdlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBkYXRhIHByb3ZpZGVkLCBlbWl0IGVtcHR5IGFycmF5XG4gICAgICB0aGlzLnByZXZpb3VzRGF0YSA9IFtdO1xuICAgICAgdGhpcy5pbnRlcm5hbERhdGEkLm5leHQoW10pO1xuICAgICAgdGhpcy5zdWJzY3JpYmVUb0RhdGFDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIGRhdGEgY2hhbmdlcyAoZWl0aGVyIGZyb20gZGF0YSQgaW5wdXQgb3IgaW50ZXJuYWwgQmVoYXZpb3JTdWJqZWN0KVxuICAgKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0RhdGFDaGFuZ2VzKCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGFTb3VyY2UkID0gdGhpcy5kYXRhJCB8fCB0aGlzLmludGVybmFsRGF0YSQuYXNPYnNlcnZhYmxlKCk7XG4gICAgXG4gICAgdGhpcy5kYXRhU3Vic2NyaXB0aW9uID0gZGF0YVNvdXJjZSQuc3Vic2NyaWJlKG5ld0RhdGEgPT4ge1xuICAgICAgdGhpcy5oYW5kbGVEYXRhQ2hhbmdlKG5ld0RhdGEpO1xuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIGRhdGEgY2hhbmdlIGZyb20gT2JzZXJ2YWJsZSBlbWlzc2lvblxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVEYXRhQ2hhbmdlKG5ld0RhdGE6IGFueVtdKTogdm9pZCB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBzb3VyY2U6ICdzeW5jJyB8ICdhc3luYycgPSB0aGlzLmRhdGEkID8gJ2FzeW5jJyA6ICdzeW5jJztcbiAgICBcbiAgICAvLyBFbWl0IGRhdGEgY2hhbmdlIGV2ZW50XG4gICAgdGhpcy5kYXRhQ2hhbmdlLmVtaXQoe1xuICAgICAgcHJldmlvdXNEYXRhOiB0aGlzLnByZXZpb3VzRGF0YSxcbiAgICAgIGN1cnJlbnREYXRhOiBuZXdEYXRhLFxuICAgICAgdGltZXN0YW1wLFxuICAgICAgc291cmNlXG4gICAgfSk7XG4gICAgXG4gICAgLy8gVXBkYXRlIGRhdGEgcmVmZXJlbmNlXG4gICAgdGhpcy5kYXRhID0gbmV3RGF0YTtcbiAgICB0aGlzLnByZXZpb3VzRGF0YSA9IFsuLi5uZXdEYXRhXTtcbiAgICBcbiAgICAvLyBSZWNyZWF0ZSBjZWxsIGdyaWRcbiAgICB0aGlzLmNyZWF0ZUNlbGxHcmlkRnJvbURhdGEoKTtcbiAgICBcbiAgICAvLyBVcGRhdGUgdmlzaWJsZSBkYXRhXG4gICAgdGhpcy51cGRhdGVWaXNpYmxlRGF0YSgpO1xuICAgIFxuICAgIC8vIFJlY2FsY3VsYXRlIHZpcnR1YWwgc2Nyb2xsIGlmIGVuYWJsZWRcbiAgICBpZiAodGhpcy5pc1ZpcnR1YWxTY3JvbGxFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMudmlydHVhbFNjcm9sbFN0YXRlJC52YWx1ZTtcbiAgICAgIGlmIChjdXJyZW50U3RhdGUpIHtcbiAgICAgICAgY29uc3QgbmV3U3RhdGUgPSB0aGlzLnZpcnR1YWxTY3JvbGxTZXJ2aWNlLmNhbGN1bGF0ZVZpc2libGVSYW5nZSh7XG4gICAgICAgICAgc2Nyb2xsVG9wOiBjdXJyZW50U3RhdGUuc2Nyb2xsVG9wLFxuICAgICAgICAgIHZpZXdwb3J0SGVpZ2h0OiB0aGlzLmdldFZpcnR1YWxTY3JvbGxWaWV3cG9ydEhlaWdodCgpLFxuICAgICAgICAgIHRvdGFsSXRlbXM6IHRoaXMudmlzaWJsZUNlbGxHcmlkLmxlbmd0aCxcbiAgICAgICAgICBpdGVtU2l6ZTogdGhpcy5nZXRWaXJ0dWFsU2Nyb2xsSXRlbVNpemUoKSxcbiAgICAgICAgICBidWZmZXJTaXplOiB0aGlzLmdldFZpcnR1YWxTY3JvbGxCdWZmZXJTaXplKClcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudmlydHVhbFNjcm9sbFN0YXRlJC5uZXh0KG5ld1N0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIGtleWJvYXJkIG5hdmlnYXRpb24gZGltZW5zaW9ucyBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLnNldERpbWVuc2lvbnMoXG4gICAgICAgIHRoaXMudmlzaWJsZUNlbGxHcmlkLmxlbmd0aCxcbiAgICAgICAgdGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGhcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHN5bmMgZGF0YSBjaGFuZ2UgKGZyb20gQElucHV0KCkgZGF0YSBjaGFuZ2VzKVxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVTeW5jRGF0YUNoYW5nZShwcmV2aW91c0RhdGE6IGFueVtdKTogdm9pZCB7XG4gICAgdGhpcy5wcmV2aW91c0RhdGEgPSBwcmV2aW91c0RhdGE7XG4gICAgdGhpcy5pbnRlcm5hbERhdGEkLm5leHQodGhpcy5kYXRhIHx8IFtdKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBhY3RpdmUgVGFibGVTdGF0ZSAocHJvdmlkZWQgb3IgaW50ZXJuYWwpXG4gICAqL1xuICBnZXRBY3RpdmVUYWJsZVN0YXRlKCk6IFRhYmxlU3RhdGUge1xuICAgIHJldHVybiB0aGlzLnRhYmxlU3RhdGUgfHwgdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUhO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGFjdGl2ZSBjZWxsIGdyaWQgKHByb3ZpZGVkIG9yIGludGVybmFsKVxuICAgKi9cbiAgZ2V0QWN0aXZlQ2VsbEdyaWQoKTogQ2VsbDxhbnk+W11bXSB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxDZWxsR3JpZCB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdmlzaWJsZSBjZWxsIGdyaWQgKGZpbHRlcmVkIHRvIG9ubHkgaW5jbHVkZSB2aXNpYmxlIGNvbHVtbnMpXG4gICAqL1xuICBnZXRWaXNpYmxlQ2VsbEdyaWQoKTogQ2VsbDxhbnk+W11bXSB7XG4gICAgY29uc3QgYWxsQ29sdW1ucyA9IHRoaXMuZ2V0QWN0aXZlQ29sdW1ucygpO1xuICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy5nZXRWaXNpYmxlQ29sdW1ucygpO1xuICAgIGNvbnN0IHZpc2libGVDb2x1bW5LZXlzID0gbmV3IFNldCh2aXNpYmxlQ29sdW1ucy5tYXAoY29sID0+IGNvbC5rZXkpKTtcbiAgICBcbiAgICAvLyBHZXQgY29sdW1uIGluZGljZXMgZm9yIHZpc2libGUgY29sdW1uc1xuICAgIGNvbnN0IHZpc2libGVJbmRpY2VzID0gYWxsQ29sdW1uc1xuICAgICAgLm1hcCgoY29sLCBpbmRleCkgPT4gdmlzaWJsZUNvbHVtbktleXMuaGFzKGNvbC5rZXkpID8gaW5kZXggOiAtMSlcbiAgICAgIC5maWx0ZXIoaW5kZXggPT4gaW5kZXggIT09IC0xKTtcbiAgICBcbiAgICBjb25zdCBmdWxsR3JpZCA9IHRoaXMuZ2V0QWN0aXZlQ2VsbEdyaWQoKTtcbiAgICByZXR1cm4gZnVsbEdyaWQubWFwKHJvdyA9PiBcbiAgICAgIHZpc2libGVJbmRpY2VzLm1hcChpbmRleCA9PiByb3dbaW5kZXhdKS5maWx0ZXIoY2VsbCA9PiBjZWxsICE9PSB1bmRlZmluZWQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHZpc2libGUgY2VsbCBncmlkIGJhc2VkIG9uIGN1cnJlbnQgdmlzaWJpbGl0eSBhbmQgY29sdW1uIG9yZGVyXG4gICAqIENhbGxlZCB3aGVuIGRhdGEsIHZpc2liaWxpdHksIG9yIGNvbHVtbiBvcmRlciBjaGFuZ2VzXG4gICAqIFxuICAgKiBUaGlzIG1ldGhvZCBwcm9wZXJseSBoYW5kbGVzIGNvbHVtbiByZW9yZGVyaW5nIGJ5IG1hcHBpbmcgY2VsbHMgYmFzZWQgb25cbiAgICogY29sdW1uIGtleXMgcmF0aGVyIHRoYW4gaW5kaWNlcywgZW5zdXJpbmcgY2VsbHMgZm9sbG93IHRoZWlyIGNvbHVtbnMuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVZpc2libGVDZWxsR3JpZCgpOiB2b2lkIHtcbiAgICBjb25zdCBmdWxsR3JpZCA9IHRoaXMuZ2V0QWN0aXZlQ2VsbEdyaWQoKTtcbiAgICBcbiAgICAvLyBIYW5kbGUgZW1wdHkgZ3JpZFxuICAgIGlmICghZnVsbEdyaWQgfHwgZnVsbEdyaWQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnZpc2libGVDZWxsR3JpZCA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICAvLyBCdWlsZCBhIG1hcCBvZiBjb2x1bW5LZXkg4oaSIGNlbGxJbmRleCBmb3IgdGhlIGN1cnJlbnQgZ3JpZCBzdHJ1Y3R1cmVcbiAgICAvLyBUaGlzIGFsbG93cyB1cyB0byBmaW5kIGNlbGxzIGJ5IGNvbHVtbiBrZXkgcmVnYXJkbGVzcyBvZiB0aGVpciBjdXJyZW50IHBvc2l0aW9uXG4gICAgY29uc3Qga2V5VG9JbmRleE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgZnVsbEdyaWRbMF0/LmZvckVhY2goKGNlbGwsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoY2VsbCkge1xuICAgICAgICBjb25zdCBjb2x1bW5Db25maWcgPSBjZWxsLmdldENvbHVtbkNvbmZpZygpO1xuICAgICAgICBrZXlUb0luZGV4TWFwLnNldChjb2x1bW5Db25maWcua2V5LCBpbmRleCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLy8gUmVvcmRlciBjZWxscyB0byBtYXRjaCB0aGUgdmlzaWJsZUNvbHVtbnMgb3JkZXJcbiAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3aGVuIGNvbHVtbnMgYXJlIG1vdmVkLCB0aGUgY2VsbCBkYXRhIGZvbGxvd3NcbiAgICB0aGlzLnZpc2libGVDZWxsR3JpZCA9IGZ1bGxHcmlkLm1hcChyb3cgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZUNvbHVtbnNcbiAgICAgICAgLm1hcChjb2wgPT4ge1xuICAgICAgICAgIGNvbnN0IGNlbGxJbmRleCA9IGtleVRvSW5kZXhNYXAuZ2V0KGNvbC5rZXkpO1xuICAgICAgICAgIHJldHVybiBjZWxsSW5kZXggIT09IHVuZGVmaW5lZCA/IHJvd1tjZWxsSW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChjZWxsKTogY2VsbCBpcyBDZWxsPGFueT4gPT4gY2VsbCAhPT0gdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHZpc2libGUgY29sdW1ucyBiYXNlZCBvbiBjdXJyZW50IHZpc2liaWxpdHlcbiAgICogQ2FsbGVkIG9ubHkgd2hlbiB2aXNpYmlsaXR5IGFjdHVhbGx5IGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJsZUNvbHVtbnMoKTogdm9pZCB7XG4gICAgY29uc3QgYWxsQ29sdW1ucyA9IHRoaXMuZ2V0QWN0aXZlQ29sdW1ucygpO1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSBhbGxDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLnZpc2libGUgIT09IGZhbHNlKTtcbiAgICBcbiAgICAvLyBSZWNhbGN1bGF0ZSBzdGlja3kgb2Zmc2V0cyBmb3IgdmlzaWJsZSBjb2x1bW5zIG9ubHlcbiAgICB0aGlzLnJlY2FsY3VsYXRlVmlzaWJsZVN0aWNreU9mZnNldHModGhpcy52aXNpYmxlQ29sdW1ucyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGJvdGggdmlzaWJsZSBjb2x1bW5zIGFuZCBjZWxsIGdyaWRcbiAgICogQ2FsbCB0aGlzIHdoZW5ldmVyIGRhdGEgb3IgdmlzaWJpbGl0eSBjaGFuZ2VzXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVZpc2libGVEYXRhKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUNvbHVtbnMoKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVDZWxsR3JpZCgpO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGFjdGl2ZSBjb2x1bW5zIChmcm9tIGNvbmZpZyBvciBsZWdhY3kgaW5wdXQpXG4gICAqL1xuICBnZXRBY3RpdmVDb2x1bW5zKCk6IENvbHVtbkNvbmZpZzxhbnk+W10ge1xuICAgIHJldHVybiB0aGlzLm1lcmdlZENvbmZpZy5jb2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB2aXNpYmxlIGNvbHVtbnMgKGZpbHRlcmVkIGJ5IHZpc2liaWxpdHkgcHJvcGVydHkpXG4gICAqIEFsc28gcmVjYWxjdWxhdGVzIHN0aWNreSBvZmZzZXRzIGJhc2VkIG9uIHZpc2libGUgY29sdW1ucyBvbmx5XG4gICAqL1xuICBnZXRWaXNpYmxlQ29sdW1ucygpOiBDb2x1bW5Db25maWc8YW55PltdIHtcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSBhbGxDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLnZpc2libGUgIT09IGZhbHNlKTsgLy8gRGVmYXVsdCB0byB0cnVlIGlmIG5vdCBzZXRcbiAgICBcbiAgICAvLyBSZWNhbGN1bGF0ZSBzdGlja3kgb2Zmc2V0cyBmb3IgdmlzaWJsZSBjb2x1bW5zIG9ubHlcbiAgICB0aGlzLnJlY2FsY3VsYXRlVmlzaWJsZVN0aWNreU9mZnNldHModmlzaWJsZUNvbHVtbnMpO1xuICAgIFxuICAgIHJldHVybiB2aXNpYmxlQ29sdW1ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNhbGN1bGF0ZSBzdGlja3kgb2Zmc2V0cyBiYXNlZCBvbiB2aXNpYmxlIGNvbHVtbnMgb25seVxuICAgKiBUaGlzIGVuc3VyZXMgY29ycmVjdCBwb3NpdGlvbmluZyB3aGVuIGNvbHVtbnMgYXJlIGhpZGRlblxuICAgKi9cbiAgcHJpdmF0ZSByZWNhbGN1bGF0ZVZpc2libGVTdGlja3lPZmZzZXRzKHZpc2libGVDb2x1bW5zOiBDb2x1bW5Db25maWc8YW55PltdKTogdm9pZCB7XG4gICAgLy8gQ2FsY3VsYXRlIGxlZnQgc3RpY2t5IG9mZnNldHNcbiAgICAvLyBBY2NvdW50IGZvciByb3cgbnVtYmVyIGNvbHVtbiB3aWR0aCBpZiBzaG93blxuICAgIGxldCBsZWZ0T2Zmc2V0ID0gdGhpcy5tZXJnZWRDb25maWcuc2hvd1Jvd051bWJlciA/IDMwIDogMDtcbiAgICB2aXNpYmxlQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICBpZiAoY29sLnN0aWNreSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIChjb2wgYXMgYW55KS5zdGlja3lPZmZzZXQgPSBsZWZ0T2Zmc2V0O1xuICAgICAgICBsZWZ0T2Zmc2V0ICs9IChjb2wud2lkdGggYXMgbnVtYmVyKSB8fCAxMDA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgcmlnaHQgc3RpY2t5IG9mZnNldHNcbiAgICBsZXQgcmlnaHRPZmZzZXQgPSAwO1xuICAgIGZvciAobGV0IGkgPSB2aXNpYmxlQ29sdW1ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgY29sID0gdmlzaWJsZUNvbHVtbnNbaV07XG4gICAgICBpZiAoY29sLnN0aWNreSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAoY29sIGFzIGFueSkuc3RpY2t5T2Zmc2V0ID0gcmlnaHRPZmZzZXQ7XG4gICAgICAgIHJpZ2h0T2Zmc2V0ICs9IChjb2wud2lkdGggYXMgbnVtYmVyKSB8fCAxMDA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25DZWxsQ2hhbmdlKGV2ZW50OiBDZWxsQ2hhbmdlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNlbGxDaGFuZ2UuZW1pdChldmVudCk7XG4gIH1cblxuICBvbkNvbHVtblJlc2l6ZWQoZXZlbnQ6IENvbHVtblJlc2l6ZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gUmVjYWxjdWxhdGUgc3RpY2t5IG9mZnNldHMgYWZ0ZXIgcmVzaXplXG4gICAgY29uc3Qgcm93TnVtYmVyV2lkdGggPSB0aGlzLm1lcmdlZENvbmZpZy5zaG93Um93TnVtYmVyID8gMzAgOiAwO1xuICAgIGNvbnN0IHNldHRpbmdzQ29sdW1uV2lkdGggPSB0aGlzLmhhc1Jvd0FjdGlvbnMoKSA/IDMyIDogMDtcbiAgICB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKS5jYWxjdWxhdGVTdGlja3lPZmZzZXRzKHJvd051bWJlcldpZHRoLCBzZXR0aW5nc0NvbHVtbldpZHRoKTtcbiAgICBcbiAgICAvLyBFbWl0IHRvIHBhcmVudFxuICAgIHRoaXMuY29sdW1uUmVzaXplZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uQ29sdW1uTW92ZWQoZXZlbnQ6IHtjb2x1bW5LZXk6IHN0cmluZywgZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnfSk6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldEFjdGl2ZUNvbHVtbnMoKTtcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSBjb2x1bW5zLmZpbmRJbmRleChjID0+IGMua2V5ID09PSBldmVudC5jb2x1bW5LZXkpO1xuICAgIGlmIChjdXJyZW50SW5kZXggPT09IC0xKSByZXR1cm47XG4gICAgXG4gICAgLy8gQ2FsY3VsYXRlIHRhcmdldCBpbmRleFxuICAgIGNvbnN0IHRhcmdldEluZGV4ID0gZXZlbnQuZGlyZWN0aW9uID09PSAnbGVmdCcgXG4gICAgICA/IGN1cnJlbnRJbmRleCAtIDEgXG4gICAgICA6IGN1cnJlbnRJbmRleCArIDE7XG4gICAgXG4gICAgLy8gQ2hlY2sgYm91bmRzXG4gICAgaWYgKHRhcmdldEluZGV4IDwgMCB8fCB0YXJnZXRJbmRleCA+PSBjb2x1bW5zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICAvLyBTd2FwIGNvbHVtbnNcbiAgICBbY29sdW1uc1tjdXJyZW50SW5kZXhdLCBjb2x1bW5zW3RhcmdldEluZGV4XV0gPSBcbiAgICBbY29sdW1uc1t0YXJnZXRJbmRleF0sIGNvbHVtbnNbY3VycmVudEluZGV4XV07XG4gICAgXG4gICAgLy8gVXBkYXRlIFRhYmxlU3RhdGUgd2l0aCBuZXcgY29sdW1uIG9yZGVyXG4gICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkudXBkYXRlQ29sdW1ucyhjb2x1bW5zKTtcbiAgICB0aGlzLmNvbHVtbk1vdmVkLmVtaXQoe1xuICAgICAgY29sdW1uS2V5OiBldmVudC5jb2x1bW5LZXksXG4gICAgICBkaXJlY3Rpb246IGV2ZW50LmRpcmVjdGlvbixcbiAgICAgIG9sZEluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICBuZXdJbmRleDogdGFyZ2V0SW5kZXgsXG4gICAgICBjb2x1bW46IGNvbHVtbnNbY3VycmVudEluZGV4XVxuICAgIH0pO1xuICAgIC8vIEZvcmNlIHZpcnR1YWwgc2Nyb2xsIHRvIHJlLXJlbmRlciBieSByZS1lbWl0dGluZyBjdXJyZW50IHN0YXRlXG4gICAgLy8gVGhpcyBlbnN1cmVzIHZpc2libGVSb3dzJCBwaWNrcyB1cCB0aGUgdXBkYXRlZCB2aXNpYmxlQ2VsbEdyaWRcbiAgICBpZiAodGhpcy5pc1ZpcnR1YWxTY3JvbGxFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMudmlydHVhbFNjcm9sbFN0YXRlJC52YWx1ZTtcbiAgICAgIGlmIChjdXJyZW50U3RhdGUpIHtcbiAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLm5leHQoey4uLmN1cnJlbnRTdGF0ZX0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGNvbHVtbiB0byBwb3NpdGlvbiBqdXN0IGJlZm9yZSByaWdodCBzdGlja3kgY29sdW1ucyAodXNlZCB3aGVuIHBpbm5pbmcgcmlnaHQpXG4gICAqL1xuICBwcml2YXRlIG1vdmVDb2x1bW5Ub0VuZChjb2x1bW5LZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldEFjdGl2ZUNvbHVtbnMoKTtcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSBjb2x1bW5zLmZpbmRJbmRleChjID0+IGMua2V5ID09PSBjb2x1bW5LZXkpO1xuICAgIGlmIChjdXJyZW50SW5kZXggPT09IC0xKSByZXR1cm47XG4gICAgXG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHJpZ2h0LXN0aWNreSBjb2x1bW5cbiAgICBjb25zdCBmaXJzdFJpZ2h0U3RpY2t5SW5kZXggPSBjb2x1bW5zLmZpbmRJbmRleChjID0+IGMuc3RpY2t5ID09PSAncmlnaHQnKTtcbiAgICBcbiAgICAvLyBEZXRlcm1pbmUgdGFyZ2V0IGluZGV4OiBqdXN0IGJlZm9yZSBmaXJzdCByaWdodC1zdGlja3ksIG9yIGF0IGVuZCBpZiBub25lIGV4aXN0XG4gICAgY29uc3QgdGFyZ2V0SW5kZXggPSBmaXJzdFJpZ2h0U3RpY2t5SW5kZXggIT09IC0xID8gZmlyc3RSaWdodFN0aWNreUluZGV4IDogY29sdW1ucy5sZW5ndGg7XG4gICAgXG4gICAgLy8gSWYgYWxyZWFkeSBhdCB0YXJnZXQgcG9zaXRpb24sIG5vIG5lZWQgdG8gbW92ZVxuICAgIGlmIChjdXJyZW50SW5kZXggPT09IHRhcmdldEluZGV4IHx8IGN1cnJlbnRJbmRleCA9PT0gdGFyZ2V0SW5kZXggLSAxKSByZXR1cm47XG4gICAgXG4gICAgLy8gUmVtb3ZlIGNvbHVtbiBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICBjb25zdCBbY29sdW1uXSA9IGNvbHVtbnMuc3BsaWNlKGN1cnJlbnRJbmRleCwgMSk7XG4gICAgXG4gICAgLy8gQWRqdXN0IHRhcmdldCBpbmRleCBpZiB3ZSByZW1vdmVkIGFuIGVsZW1lbnQgYmVmb3JlIGl0XG4gICAgY29uc3QgYWRqdXN0ZWRUYXJnZXRJbmRleCA9IGN1cnJlbnRJbmRleCA8IHRhcmdldEluZGV4ID8gdGFyZ2V0SW5kZXggLSAxIDogdGFyZ2V0SW5kZXg7XG4gICAgXG4gICAgLy8gSW5zZXJ0IGF0IHRhcmdldCBwb3NpdGlvbiAoYmVmb3JlIGZpcnN0IHJpZ2h0LXN0aWNreSBjb2x1bW4sIG9yIGF0IGVuZClcbiAgICBjb2x1bW5zLnNwbGljZShhZGp1c3RlZFRhcmdldEluZGV4LCAwLCBjb2x1bW4pO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBUYWJsZVN0YXRlIHdpdGggbmV3IGNvbHVtbiBvcmRlclxuICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLnVwZGF0ZUNvbHVtbnMoY29sdW1ucyk7XG4gICAgXG4gICAgLy8gRm9yY2UgdmlydHVhbCBzY3JvbGwgdG8gcmUtcmVuZGVyXG4gICAgaWYgKHRoaXMuaXNWaXJ0dWFsU2Nyb2xsRW5hYmxlZCgpKSB7XG4gICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQudmFsdWU7XG4gICAgICBpZiAoY3VycmVudFN0YXRlKSB7XG4gICAgICAgIHRoaXMudmlydHVhbFNjcm9sbFN0YXRlJC5uZXh0KHsuLi5jdXJyZW50U3RhdGV9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1bXVsYXRpdmUgbGVmdCBvZmZzZXQgZm9yIGEgc3RpY2t5IGNvbHVtbiBvbiB0aGUgbGVmdCBzaWRlXG4gICAqL1xuICBnZXRTdGlja3lMZWZ0T2Zmc2V0KGNvbHVtbktleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgZm9yIChjb25zdCBjb2wgb2YgY29sdW1ucykge1xuICAgICAgaWYgKGNvbC5rZXkgPT09IGNvbHVtbktleSkgYnJlYWs7XG4gICAgICBpZiAoY29sLnN0aWNreSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIG9mZnNldCArPSAoY29sLndpZHRoIGFzIG51bWJlcikgfHwgMTAwO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdW11bGF0aXZlIHJpZ2h0IG9mZnNldCBmb3IgYSBzdGlja3kgY29sdW1uIG9uIHRoZSByaWdodCBzaWRlXG4gICAqL1xuICBnZXRTdGlja3lSaWdodE9mZnNldChjb2x1bW5LZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ2V0QWN0aXZlQ29sdW1ucygpO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGNvbnN0IGNvbEluZGV4ID0gY29sdW1ucy5maW5kSW5kZXgoYyA9PiBjLmtleSA9PT0gY29sdW1uS2V5KTtcbiAgICBmb3IgKGxldCBpID0gY29sSW5kZXggKyAxOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29sID0gY29sdW1uc1tpXTtcbiAgICAgIGlmIChjb2wuc3RpY2t5ID09PSAncmlnaHQnKSB7XG4gICAgICAgIG9mZnNldCArPSAoY29sLndpZHRoIGFzIG51bWJlcikgfHwgMTAwO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgdG9wIHBhZ2luYXRpb24gc2hvdWxkIGJlIHNob3duXG4gICAqL1xuICBzaG93VG9wUGFnaW5hdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZWRDb25maWcucGFnaW5hdGlvbj8uZW5hYmxlZCA9PSB0cnVlICYmXG4gICAgICAgICAgIHRoaXMubWVyZ2VkQ29uZmlnLnBhZ2luYXRpb24/LnNob3dUb3BDb250cm9scyA9PT0gdHJ1ZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIGJvdHRvbSBwYWdpbmF0aW9uIHNob3VsZCBiZSBzaG93blxuICAgKi9cbiAgc2hvd0JvdHRvbVBhZ2luYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VkQ29uZmlnLnBhZ2luYXRpb24/LmVuYWJsZWQgPT0gdHJ1ZSAmJlxuICAgICAgICAgICAodGhpcy5tZXJnZWRDb25maWcucGFnaW5hdGlvbj8uc2hvd0JvdHRvbUNvbnRyb2xzID8/IHRydWUpO1xuICB9XG4gIFxuICAvKipcbiAgICogVmFsaWRhdGUgdGFibGUgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0gY29uZmlnIFRhYmxlIGNvbmZpZ3VyYXRpb24gdG8gdmFsaWRhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVDb25maWd1cmF0aW9uKGNvbmZpZzogVGFibGVDb25maWcpOiB2b2lkIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNjaGVtYVZhbGlkYXRvci52YWxpZGF0ZShjb25maWcsIHRydWUsIGZhbHNlKTsgLy8gRGlzYWJsZSBsb2dnaW5nIGhlcmUsIHdlJ2xsIGxvZyBtYW51YWxseSB3aXRoIGNvbnRleHRcbiAgICBcbiAgICBpZiAoIXJlc3VsdC52YWxpZCAmJiByZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEVtaXQgdmFsaWRhdGlvbiBlcnJvcnNcbiAgICAgIHRoaXMuY29uZmlnVmFsaWRhdGlvbkVycm9ycy5lbWl0KHJlc3VsdC5lcnJvcnMpO1xuICAgICAgXG4gICAgICAvLyBMb2cgdmFsaWRhdGlvbiBlcnJvcnMgd2l0aCBjb250ZXh0XG4gICAgICBjb25zdCBjb25maWdTbmlwcGV0ID0gSlNPTi5zdHJpbmdpZnkoY29uZmlnLCBudWxsLCAyKS5zdWJzdHJpbmcoMCwgNTAwKTsgLy8gRmlyc3QgNTAwIGNoYXJzIG9mIGNvbmZpZ1xuICAgICAgdGhpcy5sb2dnZXIubG9nVmFsaWRhdGlvbkVycm9ycyhyZXN1bHQuZXJyb3JzLCAncmVuZGVyZXInLCB7XG4gICAgICAgIGNvbmZpZ1NuaXBwZXQ6IGNvbmZpZ1NuaXBwZXRcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBMb2cgd2FybmluZ3MgdG8gY29uc29sZSAoZG9uJ3QgYnJlYWsgcmVuZGVyaW5nKVxuICAgICAgY29uc29sZS53YXJuKCdTbWFydCBUYWJsZTogQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIGVycm9ycyBkZXRlY3RlZDonLCByZXN1bHQuZXJyb3JzKTtcbiAgICAgIHJlc3VsdC5lcnJvcnMuZm9yRWFjaChlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybihgICAtICR7ZXJyb3IuZmllbGQgfHwgZXJyb3IucGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBhZGQgY29sdW1uIGJ1dHRvbiBjbGlja1xuICAgKi9cbiAgb25BZGRDb2x1bW5DbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dDb2x1bW5Nb2RhbCA9IHRydWU7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgY29sdW1uIGNyZWF0ZWQgZnJvbSBtb2RhbFxuICAgKi9cbiAgb25Db2x1bW5DcmVhdGVkKGNvbHVtbjogQ29sdW1uQ29uZmlnKTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ2V0QWN0aXZlQ29sdW1ucygpO1xuICAgIGNvbnN0IGFkZEV2ZW50OiBDb2x1bW5BZGRFdmVudCA9IHtcbiAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgaW5kZXg6IGNvbHVtbnMubGVuZ3RoLFxuICAgICAgdG90YWxDb2x1bW5zOiBjb2x1bW5zLmxlbmd0aCArIDFcbiAgICB9O1xuICAgIFxuICAgIC8vIEVtaXQgdGhlIG5ldyBjb2x1bW4gdG8gcGFyZW50IGNvbXBvbmVudFxuICAgIHRoaXMuY29sdW1uQWRkZWQuZW1pdChhZGRFdmVudCk7XG4gICAgXG4gICAgLy8gQ2xvc2UgdGhlIG1vZGFsXG4gICAgdGhpcy5zaG93Q29sdW1uTW9kYWwgPSBmYWxzZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBtb2RhbCBjYW5jZWxsZWRcbiAgICovXG4gIG9uTW9kYWxDYW5jZWxsZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93Q29sdW1uTW9kYWwgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB2aXJ0dWFsIHNjcm9sbCBpcyBlbmFibGVkXG4gICAqL1xuICBpc1ZpcnR1YWxTY3JvbGxFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1lcmdlZENvbmZpZy5kaXNwbGF5Py52aXJ0dWFsU2Nyb2xsPy5lbmFibGVkID8/IGZhbHNlO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgY29sdW1uIGlzIHRoZSBmaXJzdCBzdGlja3ktcmlnaHQgY29sdW1uIChmb3Igc2hhZG93IHN0eWxpbmcpXG4gICAqL1xuICBpc0ZpcnN0U3RpY2t5UmlnaHQoY29sdW1uS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGlja3lSaWdodENvbHVtbnMgPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLnN0aWNreSA9PT0gJ3JpZ2h0JyAmJiAhY29sLmtleS5pbmNsdWRlcygnc2V0dGluZ3MnKSk7XG4gICAgcmV0dXJuIHN0aWNreVJpZ2h0Q29sdW1ucy5sZW5ndGggPiAwICYmIHN0aWNreVJpZ2h0Q29sdW1uc1swXS5rZXkgPT09IGNvbHVtbktleTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB2aXJ0dWFsIHNjcm9sbCBpdGVtIHNpemVcbiAgICovXG4gIGdldFZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1lcmdlZENvbmZpZy5kaXNwbGF5Py52aXJ0dWFsU2Nyb2xsPy5pdGVtU2l6ZSA/PyA0ODtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB2aWV3cG9ydCBoZWlnaHRcbiAgICovXG4gIGdldFZpcnR1YWxTY3JvbGxWaWV3cG9ydEhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1lcmdlZENvbmZpZy5kaXNwbGF5Py52aXJ0dWFsU2Nyb2xsPy52aWV3cG9ydEhlaWdodCA/PyA2MDA7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgYnVmZmVyIHNpemVcbiAgICovXG4gIGdldFZpcnR1YWxTY3JvbGxCdWZmZXJTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VkQ29uZmlnLmRpc3BsYXk/LnZpcnR1YWxTY3JvbGw/LmJ1ZmZlclNpemUgPz8gNTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdmlydHVhbCBzY3JvbGwgc3RhdGVcbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVZpcnR1YWxTY3JvbGwoKTogdm9pZCB7XG4gICAgY29uc3QgbmV3U3RhdGUgPSB0aGlzLnZpcnR1YWxTY3JvbGxTZXJ2aWNlLmNhbGN1bGF0ZVZpc2libGVSYW5nZSh7XG4gICAgICBzY3JvbGxUb3A6IDAsXG4gICAgICB2aWV3cG9ydEhlaWdodDogdGhpcy5nZXRWaXJ0dWFsU2Nyb2xsVmlld3BvcnRIZWlnaHQoKSxcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudmlzaWJsZUNlbGxHcmlkLmxlbmd0aCxcbiAgICAgIGl0ZW1TaXplOiB0aGlzLmdldFZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpLFxuICAgICAgYnVmZmVyU2l6ZTogdGhpcy5nZXRWaXJ0dWFsU2Nyb2xsQnVmZmVyU2l6ZSgpXG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLm5leHQobmV3U3RhdGUpO1xuICB9XG4gIFxuICAvKipcbiAgICogU2V0dXAgc2Nyb2xsIGV2ZW50IGxpc3RlbmVyXG4gICAqL1xuICBwcml2YXRlIHNldHVwVmlydHVhbFNjcm9sbExpc3RlbmVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zY3JvbGxWaWV3cG9ydCkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnNjcm9sbFZpZXdwb3J0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIgPSBlbGVtZW50O1xuICAgIFxuICAgIHRoaXMuc2Nyb2xsU3Vic2NyaXB0aW9uID0gdGhpcy52aXJ0dWFsU2Nyb2xsU2VydmljZVxuICAgICAgLmNyZWF0ZVNjcm9sbE9ic2VydmFibGUoZWxlbWVudClcbiAgICAgIC5zdWJzY3JpYmUoc2Nyb2xsVG9wID0+IHRoaXMub25WaXJ0dWFsU2Nyb2xsKHNjcm9sbFRvcCkpO1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHZpcnR1YWwgc2Nyb2xsIGV2ZW50XG4gICAqL1xuICBwcml2YXRlIG9uVmlydHVhbFNjcm9sbChzY3JvbGxUb3A6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG5ld1N0YXRlID0gdGhpcy52aXJ0dWFsU2Nyb2xsU2VydmljZS5jYWxjdWxhdGVWaXNpYmxlUmFuZ2Uoe1xuICAgICAgc2Nyb2xsVG9wLFxuICAgICAgdmlld3BvcnRIZWlnaHQ6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbFZpZXdwb3J0SGVpZ2h0KCksXG4gICAgICB0b3RhbEl0ZW1zOiB0aGlzLnZpc2libGVDZWxsR3JpZC5sZW5ndGgsXG4gICAgICBpdGVtU2l6ZTogdGhpcy5nZXRWaXJ0dWFsU2Nyb2xsSXRlbVNpemUoKSxcbiAgICAgIGJ1ZmZlclNpemU6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbEJ1ZmZlclNpemUoKVxuICAgIH0pO1xuICAgIFxuICAgIHRoaXMudmlydHVhbFNjcm9sbFN0YXRlJC5uZXh0KG5ld1N0YXRlKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCByb3cgaW5kZXggZm9yIHRyYWNraW5nXG4gICAqL1xuICBnZXRBYnNvbHV0ZVJvd0luZGV4KHJlbGF0aXZlSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLnZhbHVlO1xuICAgIGlmICghY3VycmVudFN0YXRlKSByZXR1cm4gcmVsYXRpdmVJbmRleDtcbiAgICByZXR1cm4gY3VycmVudFN0YXRlLnN0YXJ0SW5kZXggKyByZWxhdGl2ZUluZGV4O1xuICB9XG4gIFxuICAvKipcbiAgICogVHJhY2tCeSBmdW5jdGlvbiBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAqL1xuICB0cmFja0J5Um93SW5kZXggPSAoaW5kZXg6IG51bWJlciwgcm93OiBDZWxsPGFueT5bXSk6IG51bWJlciA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWJzb2x1dGVSb3dJbmRleChpbmRleCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTY3JvbGwgdG8gc3BlY2lmaWMgcm93IHByb2dyYW1tYXRpY2FsbHlcbiAgICovXG4gIHNjcm9sbFRvUm93KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2Nyb2xsQ29udGFpbmVyIHx8ICF0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHNjcm9sbFRvcCA9IGluZGV4ICogdGhpcy5nZXRWaXJ0dWFsU2Nyb2xsSXRlbVNpemUoKTtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiByb3cgYWN0aW9ucyBhcmUgZW5hYmxlZFxuICAgKi9cbiAgaGFzUm93QWN0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5tZXJnZWRDb25maWcuZmVhdHVyZXM/LnJvd01hbmFnZW1lbnQ/LmFjdGlvbnMgJiYgXG4gICAgICAgICAgICAgIHRoaXMubWVyZ2VkQ29uZmlnLmZlYXR1cmVzLnJvd01hbmFnZW1lbnQuYWN0aW9ucy5sZW5ndGggPiAwKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCByb3cgYWN0aW9ucyBmcm9tIGNvbmZpZ1xuICAgKi9cbiAgZ2V0Um93QWN0aW9ucygpOiBSb3dBY3Rpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VkQ29uZmlnLmZlYXR1cmVzPy5yb3dNYW5hZ2VtZW50Py5hY3Rpb25zIHx8IFtdO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHJvdyBkYXRhIGZyb20gY2VsbCBncmlkXG4gICAqL1xuICBnZXRSb3dEYXRhKHJvd0luZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IGNlbGxHcmlkID0gdGhpcy5nZXRBY3RpdmVDZWxsR3JpZCgpO1xuICAgIGlmICghY2VsbEdyaWQgfHwgcm93SW5kZXggPCAwIHx8IHJvd0luZGV4ID49IGNlbGxHcmlkLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHJvdyA9IGNlbGxHcmlkW3Jvd0luZGV4XTtcbiAgICBpZiAoIXJvdyB8fCByb3cubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgLy8gR2V0IHJhdyBkYXRhIGZyb20gZmlyc3QgY2VsbCAoYWxsIGNlbGxzIGluIGEgcm93IHNoYXJlIHRoZSBzYW1lIHJvd0RhdGEpXG4gICAgcmV0dXJuIHJvd1swXT8uZ2V0Um93RGF0YSgpIHx8IG51bGw7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBPcGVuIHJvdyBhY3Rpb25zIGRyb3Bkb3duXG4gICAqL1xuICBvcGVuUm93QWN0aW9uc0Ryb3Bkb3duKGV2ZW50OiBNb3VzZUV2ZW50LCByb3dEYXRhOiBhbnksIHJvd0luZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIFxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgcmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gKGJlbG93IHRoZSBidXR0b24gYnkgZGVmYXVsdClcbiAgICBjb25zdCBwb3NpdGlvbiA9IHtcbiAgICAgIHg6IHJlY3QubGVmdCxcbiAgICAgIHk6IHJlY3QuYm90dG9tICsgNCAvLyA0cHggZ2FwXG4gICAgfTtcbiAgICBcbiAgICAvLyBDcmVhdGUgY29udGV4dFxuICAgIGNvbnN0IGNvbnRleHQ6IFJvd0FjdGlvbkNvbnRleHQgPSB7XG4gICAgICByb3dEYXRhLFxuICAgICAgcm93SW5kZXgsXG4gICAgICBhY3Rpb25zOiB0aGlzLmdldFJvd0FjdGlvbnMoKVxuICAgIH07XG4gICAgXG4gICAgLy8gVXBkYXRlIGRyb3Bkb3duIHN0YXRlXG4gICAgdGhpcy5kcm9wZG93blN0YXRlID0ge1xuICAgICAgaXNPcGVuOiB0cnVlLFxuICAgICAgcG9zaXRpb24sXG4gICAgICBjb250ZXh0XG4gICAgfTtcbiAgICBcbiAgICAvLyBEaXNhYmxlIGJvZHkgc2Nyb2xsXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgIFxuICAgIC8vIElmIHZpcnR1YWwgc2Nyb2xsIGlzIGVuYWJsZWQsIGFkZCBzY3JvbGwgbGlzdGVuZXIgdG8gY2xvc2UgZHJvcGRvd25cbiAgICBpZiAodGhpcy5pc1ZpcnR1YWxTY3JvbGxFbmFibGVkKCkgJiYgdGhpcy5zY3JvbGxDb250YWluZXIpIHtcbiAgICAgIGNvbnN0IHNjcm9sbExpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmNsb3NlUm93QWN0aW9uc0Ryb3Bkb3duKCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyPy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxMaXN0ZW5lcik7XG4gICAgICB9O1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDbG9zZSByb3cgYWN0aW9ucyBkcm9wZG93blxuICAgKi9cbiAgY2xvc2VSb3dBY3Rpb25zRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5kcm9wZG93blN0YXRlID0ge1xuICAgICAgaXNPcGVuOiBmYWxzZSxcbiAgICAgIHBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgIGNvbnRleHQ6IG51bGxcbiAgICB9O1xuICAgIFxuICAgIC8vIFJlLWVuYWJsZSBib2R5IHNjcm9sbFxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSByb3cgYWN0aW9uIGNsaWNrZWRcbiAgICovXG4gIG9uUm93QWN0aW9uQ2xpY2tlZChldmVudDogUm93QWN0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBFeGVjdXRlIGFjdGlvbiBjYWxsYmFjayBpZiBwcm92aWRlZFxuICAgIGlmIChldmVudC5hY3Rpb24uYWN0aW9uKSB7XG4gICAgICBldmVudC5hY3Rpb24uYWN0aW9uKGV2ZW50LnJvd0RhdGEsIGV2ZW50LnJvd0luZGV4KTtcbiAgICB9XG4gICAgXG4gICAgLy8gRW1pdCBldmVudCB0byBwYXJlbnRcbiAgICB0aGlzLnJvd0FjdGlvbi5lbWl0KGV2ZW50KTtcbiAgICBcbiAgICAvLyBDbG9zZSBkcm9wZG93blxuICAgIHRoaXMuY2xvc2VSb3dBY3Rpb25zRHJvcGRvd24oKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ09MVU1OIE1FTlUgQUNUSU9OU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9wZW4gY29sdW1uIG1lbnUgZHJvcGRvd25cbiAgICovXG4gIG9wZW5Db2x1bW5NZW51KGV2ZW50OiBNb3VzZUV2ZW50LCBjb2x1bW46IENvbHVtbkNvbmZpZzxhbnk+LCBjb2x1bW5JbmRleDogbnVtYmVyLCBpc0ZpcnN0OiBib29sZWFuLCBpc0xhc3Q6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHBvc2l0aW9uIChiZWxvdyB0aGUgYnV0dG9uIGJ5IGRlZmF1bHQpXG4gICAgY29uc3QgcG9zaXRpb24gPSB7XG4gICAgICB4OiByZWN0LmxlZnQsXG4gICAgICB5OiByZWN0LmJvdHRvbSArIDQgLy8gNHB4IGdhcFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgY29udGV4dFxuICAgIGNvbnN0IGNvbnRleHQ6IENvbHVtbkFjdGlvbkNvbnRleHQgPSB7XG4gICAgICBjb2x1bW4sXG4gICAgICBjb2x1bW5JbmRleCxcbiAgICAgIGlzRmlyc3RDb2x1bW46IGlzRmlyc3QsXG4gICAgICBpc0xhc3RDb2x1bW46IGlzTGFzdCxcbiAgICAgIHRhYmxlU3RhdGU6IHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLFxuICAgICAgYWN0aW9uczogdGhpcy5nZXRDb2x1bW5BY3Rpb25zKGNvbHVtbiwgY29sdW1uSW5kZXgsIGlzRmlyc3QsIGlzTGFzdClcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIGNvbHVtbiBtZW51IHN0YXRlXG4gICAgdGhpcy5jb2x1bW5NZW51U3RhdGUgPSB7XG4gICAgICBpc09wZW46IHRydWUsXG4gICAgICBwb3NpdGlvbixcbiAgICAgIGNvbnRleHRcbiAgICB9O1xuXG4gICAgLy8gRGlzYWJsZSBib2R5IHNjcm9sbFxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblxuICAgIC8vIElmIHZpcnR1YWwgc2Nyb2xsIGlzIGVuYWJsZWQsIGFkZCBzY3JvbGwgbGlzdGVuZXIgdG8gY2xvc2UgZHJvcGRvd25cbiAgICBpZiAodGhpcy5pc1ZpcnR1YWxTY3JvbGxFbmFibGVkKCkgJiYgdGhpcy5zY3JvbGxDb250YWluZXIpIHtcbiAgICAgIGNvbnN0IHNjcm9sbExpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmNsb3NlQ29sdW1uTWVudSgpO1xuICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lcj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsTGlzdGVuZXIpO1xuICAgICAgfTtcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbExpc3RlbmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGNvbHVtbiBtZW51IGRyb3Bkb3duXG4gICAqL1xuICBjbG9zZUNvbHVtbk1lbnUoKTogdm9pZCB7XG4gICAgdGhpcy5jb2x1bW5NZW51U3RhdGUgPSB7XG4gICAgICBpc09wZW46IGZhbHNlLFxuICAgICAgcG9zaXRpb246IHsgeDogMCwgeTogMCB9LFxuICAgICAgY29udGV4dDogbnVsbFxuICAgIH07XG5cbiAgICAvLyBSZS1lbmFibGUgYm9keSBzY3JvbGxcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNvbHVtbiBhY3Rpb24gY2xpY2tlZFxuICAgKi9cbiAgb25Db2x1bW5BY3Rpb25DbGlja2VkKGV2ZW50OiBDb2x1bW5BY3Rpb25FdmVudCk6IHZvaWQge1xuICAgIC8vIEV4ZWN1dGUgYWN0aW9uIGNhbGxiYWNrIGlmIHByb3ZpZGVkXG4gICAgaWYgKGV2ZW50LmFjdGlvbi5hY3Rpb24pIHtcbiAgICAgIGV2ZW50LmFjdGlvbi5hY3Rpb24oZXZlbnQuY29sdW1uLCBldmVudC5jb2x1bW5JbmRleCk7XG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgY2xvc2UgbWVudSBpZiBpdCdzIGEgZmlsdGVyIGFjdGlvbiAoZmlsdGVyIG5lZWRzIG1lbnUgdG8gc3RheSBvcGVuKVxuICAgIGlmIChldmVudC5hY3Rpb24uaWQgPT09ICdmaWx0ZXInKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgZHJvcGRvd24gZm9yIG90aGVyIGFjdGlvbnNcbiAgICB0aGlzLmNsb3NlQ29sdW1uTWVudSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb2x1bW4gYWN0aW9ucyAoYnVpbHQtaW4gKyBjdXN0b20pXG4gICAqL1xuICBwcml2YXRlIGdldENvbHVtbkFjdGlvbnMoXG4gICAgY29sdW1uOiBDb2x1bW5Db25maWc8YW55PiwgXG4gICAgY29sdW1uSW5kZXg6IG51bWJlciwgXG4gICAgaXNGaXJzdDogYm9vbGVhbiwgXG4gICAgaXNMYXN0OiBib29sZWFuXG4gICk6IENvbHVtbkFjdGlvbltdIHtcbiAgICBjb25zdCBhY3Rpb25zOiBDb2x1bW5BY3Rpb25bXSA9IFtdO1xuICAgIFxuICAgIC8vIEFkZCBidWlsdC1pbiBhY3Rpb25zIGlmIGVuYWJsZWQgKGRlZmF1bHQ6IHRydWUpXG4gICAgY29uc3QgaW5jbHVkZUJ1aWx0SW4gPSBjb2x1bW4uaW5jbHVkZUJ1aWx0SW5BY3Rpb25zID8/IHRydWU7XG4gICAgaWYgKGluY2x1ZGVCdWlsdEluKSB7XG4gICAgICBhY3Rpb25zLnB1c2goLi4udGhpcy5nZXRCdWlsdEluQ29sdW1uQWN0aW9ucyhjb2x1bW4sIGNvbHVtbkluZGV4LCBpc0ZpcnN0LCBpc0xhc3QpKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQWRkIGN1c3RvbSBjb2x1bW4gYWN0aW9ucyBmcm9tIGNvbmZpZ1xuICAgIGlmIChjb2x1bW4uY29sdW1uQWN0aW9ucyAmJiBjb2x1bW4uY29sdW1uQWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBhY3Rpb25zLnB1c2goLi4uY29sdW1uLmNvbHVtbkFjdGlvbnMpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYWN0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYnVpbHQtaW4gY29sdW1uIGFjdGlvbnMgKHNvcnQsIGZpbHRlciwgcGluLCBtb3ZlKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRCdWlsdEluQ29sdW1uQWN0aW9ucyhcbiAgICBjb2x1bW46IENvbHVtbkNvbmZpZzxhbnk+LFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgaXNGaXJzdDogYm9vbGVhbixcbiAgICBpc0xhc3Q6IGJvb2xlYW5cbiAgKTogQ29sdW1uQWN0aW9uW10ge1xuICAgIGNvbnN0IHRhYmxlU3RhdGUgPSB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKTtcbiAgICBjb25zdCBhY3Rpb25zOiBDb2x1bW5BY3Rpb25bXSA9IFtdO1xuXG4gICAgLy8gU29ydCBhc2NlbmRpbmdcbiAgICBpZiAoY29sdW1uLnNvcnRhYmxlICE9PSBmYWxzZSkge1xuICAgICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgaWQ6ICdzb3J0LWFzYycsXG4gICAgICAgIGxhYmVsOiB0aGlzLmdldFNvcnRMYWJlbChjb2x1bW4sICdhc2MnKSxcbiAgICAgICAgaWNvbjogJ+KGkScsXG4gICAgICAgIGFjdGlvbjogKGNvbCkgPT4ge1xuICAgICAgICAgIHRhYmxlU3RhdGUuYWRkU29ydFRvQ29sdW1uKGNvbC5rZXksIFNvcnREaXJlY3Rpb24uQVNDKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBkZXNjZW5kaW5nXG4gICAgaWYgKGNvbHVtbi5zb3J0YWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgIGFjdGlvbnMucHVzaCh7XG4gICAgICAgIGlkOiAnc29ydC1kZXNjJyxcbiAgICAgICAgbGFiZWw6IHRoaXMuZ2V0U29ydExhYmVsKGNvbHVtbiwgJ2Rlc2MnKSxcbiAgICAgICAgaWNvbjogJ+KGkycsXG4gICAgICAgIGFjdGlvbjogKGNvbCkgPT4ge1xuICAgICAgICAgIHRhYmxlU3RhdGUuYWRkU29ydFRvQ29sdW1uKGNvbC5rZXksIFNvcnREaXJlY3Rpb24uREVTQyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENsZWFyIHNvcnQgKG9ubHkgc2hvdyBpZiBjdXJyZW50bHkgc29ydGVkKVxuICAgIGlmIChjb2x1bW4uc29ydGFibGUgIT09IGZhbHNlICYmIGNvbHVtbi5zb3J0RGlyZWN0aW9uICYmIGNvbHVtbi5zb3J0RGlyZWN0aW9uICE9PSBTb3J0RGlyZWN0aW9uLk5PTkUpIHtcbiAgICAgIGFjdGlvbnMucHVzaCh7XG4gICAgICAgIGlkOiAnY2xlYXItc29ydCcsXG4gICAgICAgIGxhYmVsOiAnQ2xlYXIgU29ydCcsXG4gICAgICAgIGljb246ICfinJUnLFxuICAgICAgICBhY3Rpb246IChjb2wpID0+IHtcbiAgICAgICAgICB0YWJsZVN0YXRlLmFkZFNvcnRUb0NvbHVtbihjb2wua2V5LCBTb3J0RGlyZWN0aW9uLk5PTkUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBGaWx0ZXJcbiAgICBpZiAoY29sdW1uLmZpbHRlcmFibGUgIT09IGZhbHNlKSB7XG4gICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogJ2ZpbHRlcicsXG4gICAgICAgIGxhYmVsOiAnRmlsdGVyJyxcbiAgICAgICAgaWNvbjogJ+KakScsXG4gICAgICAgIGFjdGlvbjogKCkgPT4ge1xuICAgICAgICAgIC8vIEZpbHRlciBhY3Rpb24gaGFuZGxlZCBieSBjb2x1bW4gbWVudSBjb21wb25lbnRcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUGluIExlZnQgKGlmIG5vdCBhbHJlYWR5IHBpbm5lZClcbiAgICBpZiAoY29sdW1uLnBpbm5hYmxlICE9PSBmYWxzZSAmJiBjb2x1bW4uc3RpY2t5ICE9PSAnbGVmdCcgJiYgY29sdW1uLnN0aWNreSAhPT0gJ3JpZ2h0Jykge1xuICAgICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgaWQ6ICdwaW4tbGVmdCcsXG4gICAgICAgIGxhYmVsOiAnUGluIExlZnQnLFxuICAgICAgICBpY29uOiAn8J+TjCcsXG4gICAgICAgIGFjdGlvbjogKGNvbCkgPT4ge1xuICAgICAgICAgIHRhYmxlU3RhdGUuc2V0U3RpY2t5Q29sdW1uKGNvbC5rZXksICdsZWZ0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFBpbiBSaWdodCAoaWYgbm90IGFscmVhZHkgcGlubmVkKVxuICAgIGlmIChjb2x1bW4ucGlubmFibGUgIT09IGZhbHNlICYmIGNvbHVtbi5zdGlja3kgIT09ICdsZWZ0JyAmJiBjb2x1bW4uc3RpY2t5ICE9PSAncmlnaHQnKSB7XG4gICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogJ3Bpbi1yaWdodCcsXG4gICAgICAgIGxhYmVsOiAnUGluIFJpZ2h0JyxcbiAgICAgICAgaWNvbjogJ/Cfk4wnLFxuICAgICAgICBhY3Rpb246IChjb2wpID0+IHtcbiAgICAgICAgICB0aGlzLm1vdmVDb2x1bW5Ub0VuZChjb2wua2V5KTtcbiAgICAgICAgICB0YWJsZVN0YXRlLnNldFN0aWNreUNvbHVtbihjb2wua2V5LCAncmlnaHQnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVW5waW4gKGlmIGN1cnJlbnRseSBwaW5uZWQpXG4gICAgaWYgKGNvbHVtbi5waW5uYWJsZSAhPT0gZmFsc2UgJiYgKGNvbHVtbi5zdGlja3kgPT09ICdsZWZ0JyB8fCBjb2x1bW4uc3RpY2t5ID09PSAncmlnaHQnKSkge1xuICAgICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgaWQ6ICd1bnBpbicsXG4gICAgICAgIGxhYmVsOiAnVW5waW4nLFxuICAgICAgICBpY29uOiAn8J+TjScsXG4gICAgICAgIGFjdGlvbjogKGNvbCkgPT4ge1xuICAgICAgICAgIHRhYmxlU3RhdGUuc2V0U3RpY2t5Q29sdW1uKGNvbC5rZXksIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTW92ZSBsZWZ0IChvbmx5IGlmIG1vdmFibGUgYW5kIG5vdCBwaW5uZWQpXG4gICAgaWYgKCFpc0ZpcnN0ICYmIGNvbHVtbi5tb3ZhYmxlICE9PSBmYWxzZSAmJiAhY29sdW1uLnN0aWNreSkge1xuICAgICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgaWQ6ICdtb3ZlLWxlZnQnLFxuICAgICAgICBsYWJlbDogJ01vdmUgTGVmdCcsXG4gICAgICAgIGljb246ICfihpAnLFxuICAgICAgICBhY3Rpb246IChjb2wpID0+IHtcbiAgICAgICAgICB0aGlzLm9uQ29sdW1uTW92ZWQoe1xuICAgICAgICAgICAgY29sdW1uS2V5OiBjb2wua2V5LFxuICAgICAgICAgICAgZGlyZWN0aW9uOiAnbGVmdCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTW92ZSByaWdodCAob25seSBpZiBtb3ZhYmxlIGFuZCBub3QgcGlubmVkKVxuICAgIGlmICghaXNMYXN0ICYmIGNvbHVtbi5tb3ZhYmxlICE9PSBmYWxzZSAmJiAhY29sdW1uLnN0aWNreSkge1xuICAgICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgaWQ6ICdtb3ZlLXJpZ2h0JyxcbiAgICAgICAgbGFiZWw6ICdNb3ZlIFJpZ2h0JyxcbiAgICAgICAgaWNvbjogJ+KGkicsXG4gICAgICAgIGFjdGlvbjogKGNvbCkgPT4ge1xuICAgICAgICAgIHRoaXMub25Db2x1bW5Nb3ZlZCh7XG4gICAgICAgICAgICBjb2x1bW5LZXk6IGNvbC5rZXksXG4gICAgICAgICAgICBkaXJlY3Rpb246ICdyaWdodCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvcnQgbGFiZWwgYmFzZWQgb24gY29sdW1uIGRhdGEgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTb3J0TGFiZWwoY29sdW1uOiBDb2x1bW5Db25maWc8YW55PiwgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSBjb2x1bW4uZGF0YVR5cGU7XG5cbiAgICBpZiAoZGF0YVR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gZGlyZWN0aW9uID09PSAnYXNjJyA/ICdTb3J0IDDihpI5JyA6ICdTb3J0IDnihpIwJztcbiAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09PSAnZGF0ZScpIHtcbiAgICAgIHJldHVybiBkaXJlY3Rpb24gPT09ICdhc2MnID8gJ1NvcnQgT2xkZXN0IEZpcnN0JyA6ICdTb3J0IE5ld2VzdCBGaXJzdCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkaXJlY3Rpb24gPT09ICdhc2MnID8gJ1NvcnQgQeKGklonIDogJ1NvcnQgWuKGkkEnO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gS0VZQk9BUkQgTkFWSUdBVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUga2V5Ym9hcmQgbmF2aWdhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplS2V5Ym9hcmROYXZpZ2F0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHRhYmxlU3RhdGUgPSB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKTtcbiAgICBcbiAgICB0YWJsZVN0YXRlLnNldERpbWVuc2lvbnMoXG4gICAgICB0aGlzLnZpc2libGVDZWxsR3JpZC5sZW5ndGgsXG4gICAgICB0aGlzLnZpc2libGVDb2x1bW5zLmxlbmd0aFxuICAgICk7XG4gICAgXG4gICAgLy8gU3Vic2NyaWJlIHRvIGZvY3VzIHBvc2l0aW9uIGNoYW5nZXNcbiAgICB0aGlzLmZvY3VzU3Vic2NyaXB0aW9uID0gdGFibGVTdGF0ZS5mb2N1c2VkQ2VsbFBvc2l0aW9uJC5zdWJzY3JpYmUocG9zaXRpb24gPT4ge1xuICAgICAgdGhpcy51cGRhdGVDZWxsRm9jdXNTdGF0ZXMocG9zaXRpb24pO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIFN1YnNjcmliZSB0byByZXF1ZXN0IGFkZCByb3cgZXZlbnRzICh3aGVuIG5hdmlnYXRpbmcgcGFzdCBsYXN0IHJvdylcbiAgICB0aGlzLnJlcXVlc3RBZGRSb3dTdWJzY3JpcHRpb24gPSB0YWJsZVN0YXRlLnJlcXVlc3RBZGRSb3ckLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICB0aGlzLnJlcXVlc3RBZGRSb3cuZW1pdChldmVudCk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gQXV0by1mb2N1cyBmaXJzdCBjZWxsIHRvIGVuYWJsZSBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gICAgaWYgKHRoaXMudmlzaWJsZUNlbGxHcmlkLmxlbmd0aCA+IDAgJiYgdGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGFibGVTdGF0ZS5mb2N1c0NlbGwoMCwgMCk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBVcGRhdGUgZm9jdXMgc3RhdGUgaW4gYWxsIGNlbGxzXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUNlbGxGb2N1c1N0YXRlcyhwb3NpdGlvbjogQ2VsbEZvY3VzUG9zaXRpb24gfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpc2libGVDZWxsR3JpZCkgcmV0dXJuO1xuICAgIFxuICAgIGZvciAobGV0IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCB0aGlzLnZpc2libGVDZWxsR3JpZC5sZW5ndGg7IHJvd0luZGV4KyspIHtcbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMudmlzaWJsZUNlbGxHcmlkW3Jvd0luZGV4XTtcbiAgICAgIGZvciAobGV0IGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCByb3cubGVuZ3RoOyBjb2xJbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGNlbGwgPSByb3dbY29sSW5kZXhdO1xuICAgICAgICBpZiAoIWNlbGwpIGNvbnRpbnVlO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgc2hvdWxkRm9jdXMgPSBwb3NpdGlvbiAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLnJvd0luZGV4ID09PSByb3dJbmRleCAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLmNvbHVtbkluZGV4ID09PSBjb2xJbmRleDtcbiAgICAgICAgXG4gICAgICAgIGlmIChzaG91bGRGb2N1cykge1xuICAgICAgICAgIGNlbGwuZm9jdXMoKTtcbiAgICAgICAgICAvLyBGb2N1cyB0aGUgYWN0dWFsIERPTSBlbGVtZW50XG4gICAgICAgICAgdGhpcy5mb2N1c1RkRWxlbWVudChyb3dJbmRleCwgY29sSW5kZXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNlbGwuYmx1cigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogRm9jdXMgdGhlIFREIGVsZW1lbnQgaW4gdGhlIERPTSBhbmQgc2Nyb2xsIGl0IGludG8gdmlldyxcbiAgICogYWNjb3VudGluZyBmb3Igc3RpY2t5IGNvbHVtbnMgb24gbGVmdCBhbmQgcmlnaHRcbiAgICovXG4gIHByaXZhdGUgZm9jdXNUZEVsZW1lbnQocm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGVuc3VyZSBET00gaGFzIHVwZGF0ZWRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIFVzZSBhYnNvbHV0ZSByb3cgaW5kZXggZm9yIHZpcnR1YWwgc2Nyb2xsIGNvbXBhdGliaWxpdHlcbiAgICAgIGNvbnN0IGFic29sdXRlUm93SW5kZXggPSB0aGlzLmdldEFic29sdXRlUm93SW5kZXgocm93SW5kZXgpO1xuICAgICAgLy8gUXVlcnkgd2l0aGluIHRoaXMgY29tcG9uZW50J3MgaG9zdCBlbGVtZW50IHRvIGF2b2lkIHNlbGVjdGluZyByb3dzIGZyb20gb3RoZXIgdGFibGVzXG4gICAgICBjb25zdCBob3N0RWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghaG9zdEVsZW1lbnQpIHJldHVybjtcbiAgICAgIFxuICAgICAgLy8gRmlyc3QsIGVuc3VyZSB0aGUgdGFibGUgY29udGFpbmVyIGhhcyBmb2N1cyBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvblxuICAgICAgLy8gVGhlIGtleWJvYXJkIG5hdmlnYXRpb24gZGlyZWN0aXZlIGxpc3RlbnMgb24gdGhlIC5zdC10YWJsZSBjb250YWluZXJcbiAgICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gaG9zdEVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN0LXRhYmxlJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKHRhYmxlQ29udGFpbmVyICYmIHR5cGVvZiB0YWJsZUNvbnRhaW5lci5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0YWJsZUNvbnRhaW5lci5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IHRyID0gaG9zdEVsZW1lbnQucXVlcnlTZWxlY3RvcihgdHJbZGF0YS1yb3ctaW5kZXg9XCIke2Fic29sdXRlUm93SW5kZXh9XCJdYCk7XG4gICAgICBpZiAodHIpIHtcbiAgICAgICAgY29uc3QgY2VsbHMgPSB0ci5xdWVyeVNlbGVjdG9yQWxsKCd0ZDpub3QoLnNldHRpbmdzLWNvbHVtbik6bm90KC5yb3ctbnVtYmVyLWNlbGwpJyk7XG4gICAgICAgIGNvbnN0IHRhcmdldENlbGwgPSBjZWxsc1tjb2xJbmRleF0gYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0YXJnZXRDZWxsICYmIHR5cGVvZiB0YXJnZXRDZWxsLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGFyZ2V0Q2VsbC5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgICAgICAgdGhpcy5zY3JvbGxDZWxsSW50b1ZpZXcodGFyZ2V0Q2VsbCwgY29sSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xsIGEgY2VsbCBpbnRvIHZpZXcsIGFjY291bnRpbmcgZm9yIHN0aWNreSBjb2x1bW5zXG4gICAqL1xuICBwcml2YXRlIHNjcm9sbENlbGxJbnRvVmlldyhjZWxsOiBIVE1MRWxlbWVudCwgY29sSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIHNjcm9sbCBjb250YWluZXJcbiAgICBjb25zdCBzY3JvbGxDb250YWluZXIgPSB0aGlzLmdldFNjcm9sbENvbnRhaW5lckVsZW1lbnQoKTtcbiAgICBpZiAoIXNjcm9sbENvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgY29uc3QgY2VsbFJlY3QgPSBjZWxsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBzY3JvbGxDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgc3RpY2t5IGNvbHVtbiB3aWR0aHNcbiAgICBjb25zdCB7IGxlZnRTdGlja3lXaWR0aCwgcmlnaHRTdGlja3lXaWR0aCB9ID0gdGhpcy5jYWxjdWxhdGVTdGlja3lXaWR0aHMoKTtcblxuICAgIC8vIENhbGN1bGF0ZSB2aXNpYmxlIGFyZWEgKGV4Y2x1ZGluZyBzdGlja3kgY29sdW1ucylcbiAgICBjb25zdCB2aXNpYmxlTGVmdCA9IGNvbnRhaW5lclJlY3QubGVmdCArIGxlZnRTdGlja3lXaWR0aDtcbiAgICBjb25zdCB2aXNpYmxlUmlnaHQgPSBjb250YWluZXJSZWN0LnJpZ2h0IC0gcmlnaHRTdGlja3lXaWR0aDtcbiAgICBjb25zdCB2aXNpYmxlVG9wID0gY29udGFpbmVyUmVjdC50b3A7XG4gICAgY29uc3QgdmlzaWJsZUJvdHRvbSA9IGNvbnRhaW5lclJlY3QuYm90dG9tO1xuXG4gICAgLy8gQ2hlY2sgaWYgY29sdW1uIGlzIHN0aWNreSAoZG9uJ3Qgc2Nyb2xsIGZvciBzdGlja3kgY29sdW1ucylcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLnZpc2libGVDb2x1bW5zW2NvbEluZGV4XTtcbiAgICBpZiAoY29sdW1uPy5zdGlja3kpIHtcbiAgICAgIC8vIEp1c3QgZW5zdXJlIHZlcnRpY2FsIHZpc2liaWxpdHkgZm9yIHN0aWNreSBjb2x1bW5zXG4gICAgICBpZiAoY2VsbFJlY3QudG9wIDwgdmlzaWJsZVRvcCkge1xuICAgICAgICBzY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wIC09ICh2aXNpYmxlVG9wIC0gY2VsbFJlY3QudG9wKTtcbiAgICAgIH0gZWxzZSBpZiAoY2VsbFJlY3QuYm90dG9tID4gdmlzaWJsZUJvdHRvbSkge1xuICAgICAgICBzY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wICs9IChjZWxsUmVjdC5ib3R0b20gLSB2aXNpYmxlQm90dG9tKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBjZWxsIGlzIGFscmVhZHkgZnVsbHkgdmlzaWJsZSBob3Jpem9udGFsbHkgKG5vIHNjcm9sbCBuZWVkZWQpXG4gICAgY29uc3QgaXNDZWxsRnVsbHlWaXNpYmxlSG9yaXpvbnRhbGx5ID0gY2VsbFJlY3QubGVmdCA+PSB2aXNpYmxlTGVmdCAmJiBjZWxsUmVjdC5yaWdodCA8PSB2aXNpYmxlUmlnaHQ7XG4gICAgXG4gICAgLy8gT25seSBzY3JvbGwgaG9yaXpvbnRhbGx5IGlmIGNlbGwgaXMgTk9UIGZ1bGx5IHZpc2libGVcbiAgICBpZiAoIWlzQ2VsbEZ1bGx5VmlzaWJsZUhvcml6b250YWxseSkge1xuICAgICAgaWYgKGNlbGxSZWN0LmxlZnQgPCB2aXNpYmxlTGVmdCkge1xuICAgICAgICAvLyBDZWxsIGlzIGhpZGRlbiBiZWhpbmQgbGVmdCBzdGlja3kgY29sdW1uc1xuICAgICAgICBzY3JvbGxDb250YWluZXIuc2Nyb2xsTGVmdCAtPSAodmlzaWJsZUxlZnQgLSBjZWxsUmVjdC5sZWZ0KTtcbiAgICAgIH0gZWxzZSBpZiAoY2VsbFJlY3QucmlnaHQgPiB2aXNpYmxlUmlnaHQpIHtcbiAgICAgICAgLy8gQ2VsbCBpcyBoaWRkZW4gYmVoaW5kIHJpZ2h0IHN0aWNreSBjb2x1bW5zXG4gICAgICAgIHNjcm9sbENvbnRhaW5lci5zY3JvbGxMZWZ0ICs9IChjZWxsUmVjdC5yaWdodCAtIHZpc2libGVSaWdodCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmVydGljYWwgc2Nyb2xsaW5nXG4gICAgaWYgKGNlbGxSZWN0LnRvcCA8IHZpc2libGVUb3ApIHtcbiAgICAgIHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AgLT0gKHZpc2libGVUb3AgLSBjZWxsUmVjdC50b3ApO1xuICAgIH0gZWxzZSBpZiAoY2VsbFJlY3QuYm90dG9tID4gdmlzaWJsZUJvdHRvbSkge1xuICAgICAgc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCArPSAoY2VsbFJlY3QuYm90dG9tIC0gdmlzaWJsZUJvdHRvbSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc2Nyb2xsIGNvbnRhaW5lciBlbGVtZW50XG4gICAqL1xuICBwcml2YXRlIGdldFNjcm9sbENvbnRhaW5lckVsZW1lbnQoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAvLyBQcmVmZXIgY2FjaGVkIGNvbnRhaW5lciBpZiBhbHJlYWR5IHJlc29sdmVkXG4gICAgaWYgKHRoaXMuc2Nyb2xsQ29udGFpbmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY3JvbGxDb250YWluZXI7XG4gICAgfVxuICAgIC8vIFZpcnR1YWwgc2Nyb2xsIHVzZXMgc2Nyb2xsVmlld3BvcnRcbiAgICBpZiAodGhpcy5pc1ZpcnR1YWxTY3JvbGxFbmFibGVkKCkgJiYgdGhpcy5zY3JvbGxWaWV3cG9ydD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIgPSB0aGlzLnNjcm9sbFZpZXdwb3J0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICByZXR1cm4gdGhpcy5zY3JvbGxDb250YWluZXI7XG4gICAgfVxuICAgIC8vIFN0YW5kYXJkIG1vZGUgdXNlcyAuc3QtdGFibGUgY29udGFpbmVyIHdpdGhpbiBUSElTIGNvbXBvbmVudCdzIGhvc3QgZWxlbWVudFxuICAgIC8vIFVzZSBlbGVtZW50UmVmIHRvIHF1ZXJ5IHdpdGhpbiB0aGUgY29tcG9uZW50IGluc3RlYWQgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvclxuICAgIC8vIHdoaWNoIHdvdWxkIHJldHVybiB0aGUgZmlyc3QgdGFibGUgb24gdGhlIHBhZ2VcbiAgICBjb25zdCBob3N0RWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoaG9zdEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gaG9zdEVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN0LXRhYmxlJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKHRhYmxlQ29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyID0gdGFibGVDb250YWluZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNjcm9sbENvbnRhaW5lciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0b3RhbCB3aWR0aCBvZiBzdGlja3kgY29sdW1ucyBvbiBsZWZ0IGFuZCByaWdodFxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVTdGlja3lXaWR0aHMoKTogeyBsZWZ0U3RpY2t5V2lkdGg6IG51bWJlcjsgcmlnaHRTdGlja3lXaWR0aDogbnVtYmVyIH0ge1xuICAgIGxldCBsZWZ0U3RpY2t5V2lkdGggPSAwO1xuICAgIGxldCByaWdodFN0aWNreVdpZHRoID0gMDtcblxuICAgIC8vIEFjY291bnQgZm9yIHJvdyBudW1iZXIgY29sdW1uIGlmIGVuYWJsZWRcbiAgICBpZiAodGhpcy5tZXJnZWRDb25maWcuc2hvd1Jvd051bWJlcikge1xuICAgICAgbGVmdFN0aWNreVdpZHRoICs9IDMwOyAvLyBSb3cgbnVtYmVyIGNvbHVtbiB3aWR0aFxuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBmcm9tIGNvbHVtbiBjb25maWdzXG4gICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy52aXNpYmxlQ29sdW1ucykge1xuICAgICAgaWYgKGNvbC5zdGlja3kgPT09ICdsZWZ0Jykge1xuICAgICAgICBsZWZ0U3RpY2t5V2lkdGggKz0gKGNvbC53aWR0aCBhcyBudW1iZXIpIHx8IDEwMDtcbiAgICAgIH0gZWxzZSBpZiAoY29sLnN0aWNreSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICByaWdodFN0aWNreVdpZHRoICs9IChjb2wud2lkdGggYXMgbnVtYmVyKSB8fCAxMDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWNjb3VudCBmb3Igc2V0dGluZ3MgY29sdW1uIG9ubHkgd2hlbiByb3cgYWN0aW9ucyBhcmUgZW5hYmxlZCAodXNlIGNvbnNpc3RlbnQgd2lkdGgpXG4gICAgY29uc3Qgc2V0dGluZ3NDb2x1bW5XaWR0aCA9IHRoaXMuaGFzUm93QWN0aW9ucygpID8gMzIgOiAwO1xuICAgIHJpZ2h0U3RpY2t5V2lkdGggKz0gc2V0dGluZ3NDb2x1bW5XaWR0aDtcblxuICAgIHJldHVybiB7IGxlZnRTdGlja3lXaWR0aCwgcmlnaHRTdGlja3lXaWR0aCB9O1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIGNlbGwgY2xpY2tcbiAgICovXG4gIG9uQ2VsbENsaWNrKHJvd0luZGV4OiBudW1iZXIsIGNvbHVtbkluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkpIHJldHVybjtcbiAgICB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKS5mb2N1c0NlbGwocm93SW5kZXgsIGNvbHVtbkluZGV4KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBjZWxsIGVudGVyaW5nIGVkaXQgbW9kZVxuICAgKi9cbiAgb25DZWxsRWRpdChldmVudDogQ2VsbEVkaXRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2VsbEVkaXQuZW1pdChldmVudCk7XG4gICAgXG4gICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IHJvd0luZGV4ID0gZXZlbnQuY2VsbC5nZXRSb3dJbmRleCgpO1xuICAgICAgY29uc3QgY29sdW1uS2V5ID0gZXZlbnQuY29sdW1uS2V5O1xuICAgICAgY29uc3QgY29sdW1uSW5kZXggPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbmRJbmRleChjb2wgPT4gY29sLmtleSA9PT0gY29sdW1uS2V5KTtcbiAgICAgIFxuICAgICAgaWYgKHJvd0luZGV4ICE9PSB1bmRlZmluZWQgJiYgY29sdW1uSW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKS5zZXRFZGl0aW5nQ2VsbChyb3dJbmRleCwgY29sdW1uSW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBjZWxsIHNhdmVcbiAgICovXG4gIG9uQ2VsbFNhdmUoZXZlbnQ6IENlbGxTYXZlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNlbGxTYXZlLmVtaXQoZXZlbnQpO1xuICAgIFxuICAgIGlmICh0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpKSB7XG4gICAgICB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKS5jbGVhckVkaXRpbmdDZWxsKCk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIGNlbGwgY2FuY2VsXG4gICAqL1xuICBvbkNlbGxDYW5jZWwoZXZlbnQ6IENlbGxDYW5jZWxFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2VsbENhbmNlbC5lbWl0KGV2ZW50KTtcbiAgICBcbiAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSkge1xuICAgICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkuY2xlYXJFZGl0aW5nQ2VsbCgpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBjZWxsIHNhdmUgd2l0aCBuYXZpZ2F0aW9uIChFeGNlbC1saWtlIGJlaGF2aW9yKVxuICAgKi9cbiAgb25DZWxsU2F2ZUFuZE5hdmlnYXRlKGV2ZW50OiB7ZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGRpcmVjdGlvbjogTmF2aWdhdGlvbkRpcmVjdGlvbn0pOiB2b2lkIHtcbiAgICAvLyBOYXZpZ2F0aW9uIGlzIGFscmVhZHkgaGFuZGxlZCBieSB0aGUgZGlyZWN0aXZlIGFmdGVyIHNhdmVcbiAgICAvLyBKdXN0IGVuc3VyZSBlZGl0aW5nIHN0YXRlIGlzIGNsZWFyZWRcbiAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSkge1xuICAgICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkuY2xlYXJFZGl0aW5nQ2VsbCgpO1xuICAgICAgLy8gTW92ZSBmb2N1cyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdGlvblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLm1vdmVGb2N1cyhldmVudC5kaXJlY3Rpb24pO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIGZvY3VzIG9uIHRhYmxlIGNvbnRhaW5lciAtIGZvY3VzIGZpcnN0IGNlbGwgaWYgbm8gY2VsbCBpcyBmb2N1c2VkXG4gICAqL1xuICBvblRhYmxlQ29udGFpbmVyRm9jdXMoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkpIHJldHVybjtcbiAgICBcbiAgICBjb25zdCB0YWJsZVN0YXRlID0gdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCk7XG4gICAgY29uc3QgY3VycmVudEZvY3VzID0gdGFibGVTdGF0ZS5nZXRGb2N1c2VkUG9zaXRpb24oKTtcbiAgICBcbiAgICAvLyBJZiBubyBjZWxsIGlzIGZvY3VzZWQsIGZvY3VzIHRoZSBmaXJzdCBjZWxsXG4gICAgaWYgKCFjdXJyZW50Rm9jdXMgJiYgdGhpcy52aXNpYmxlQ2VsbEdyaWQubGVuZ3RoID4gMCAmJiB0aGlzLnZpc2libGVDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRhYmxlU3RhdGUuZm9jdXNDZWxsKDAsIDApO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgZW5hYmxlZFxuICAgKi9cbiAgaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1lcmdlZENvbmZpZy5mZWF0dXJlcz8ua2V5Ym9hcmROYXZpZ2F0aW9uPy5lbmFibGVkID8/IGZhbHNlO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IEVkaXRNb2RlIGVudW0gdmFsdWUgZm9yIGNlbGxzXG4gICAqIEZvciBFeGNlbC1saWtlIHRhYmxlcyB3aXRoIGtleWJvYXJkIG5hdmlnYXRpb24sIHVzZSBFTlRFUiBtb2RlXG4gICAqIHdoaWNoIGFsbG93cyBhcnJvdyBrZXkgbmF2aWdhdGlvbiB3aXRob3V0IHRyaWdnZXJpbmcgZWRpdC5cbiAgICogRG91YmxlLWNsaWNrIHdpbGwgc3RpbGwgd29yayB0byBzdGFydCBlZGl0aW5nLlxuICAgKi9cbiAgZ2V0RWRpdE1vZGVGb3JDZWxscygpOiBFZGl0TW9kZSB7XG4gICAgLy8gSWYga2V5Ym9hcmQgbmF2aWdhdGlvbiBpcyBlbmFibGVkLCB1c2UgRU5URVIgbW9kZSBmb3IgRXhjZWwtbGlrZSBiZWhhdmlvclxuICAgIC8vIE90aGVyd2lzZSB1c2UgQ0xJQ0sgbW9kZSBmb3IgaW1tZWRpYXRlIGVkaXRpbmdcbiAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIEVkaXRNb2RlLkVOVEVSO1xuICAgIH1cbiAgICByZXR1cm4gRWRpdE1vZGUuQ0xJQ0s7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDbGVhciBmb2N1cyB3aGVuIGNsaWNraW5nIG91dHNpZGUgdGFibGVcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IHRhYmxlRWxlbWVudCA9IHRhcmdldC5jbG9zZXN0KCcuc3QtdGFibGUnKTtcbiAgICBcbiAgICBpZiAoIXRhYmxlRWxlbWVudCkge1xuICAgICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkuY2xlYXJGb2N1cygpO1xuICAgICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkuY2xlYXJFZGl0aW5nQ2VsbCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zY3JvbGxTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5mb2N1c1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnZhbGlkYXRpb25TdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kYXRhU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMucmVxdWVzdEFkZFJvd1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQuY29tcGxldGUoKTtcbiAgICB0aGlzLmludGVybmFsRGF0YSQuY29tcGxldGUoKTtcbiAgfVxuICBcbn1cblxuIiwiPCEtLSBUb3AgcGFnaW5hdGlvbiBjb250cm9scyAtLT5cbjxzdC1wYWdpbmF0aW9uIFxuICAqbmdJZj1cInNob3dUb3BQYWdpbmF0aW9uKCkgJiYgIShtZXJnZWRDb25maWcudGFibGVTa2VsZXRvbj8uZW5hYmxlZCB8IGFzeW5jKVwiIFxuICBbdGFibGVTdGF0ZV09XCJnZXRBY3RpdmVUYWJsZVN0YXRlKClcIlxuICBbdGFibGVDb25maWddPVwibWVyZ2VkQ29uZmlnXCJcbiAgcG9zaXRpb249XCJ0b3BcIj5cbjwvc3QtcGFnaW5hdGlvbj5cblxuPGRpdiBjbGFzcz1cInN0LXRhYmxlXCIgKm5nSWY9XCIhKG1lcmdlZENvbmZpZy50YWJsZVNrZWxldG9uPy5lbmFibGVkIHwgYXN5bmMpXCIgXG4gIFtuZ0NsYXNzXT1cIntcbiAgICAndmlydHVhbC1zY3JvbGwtZW5hYmxlZCc6IGlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSxcbiAgICAna2V5Ym9hcmQtbmF2aWdhdGlvbi1lbmFibGVkJzogaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKClcbiAgfVwiXG4gIFtuZ1N0eWxlXT1cIntcbiAgICAnbWF4LWhlaWdodC5weCc6ICFpc1ZpcnR1YWxTY3JvbGxFbmFibGVkKCkgPyBtZXJnZWRDb25maWcuZGlzcGxheT8ubWF4SGVpZ2h0IDogbnVsbFxuICB9XCJcbiAgc3RLZXlib2FyZE5hdmlnYXRpb25cbiAgW3RhYmxlU3RhdGVdPVwiZ2V0QWN0aXZlVGFibGVTdGF0ZSgpXCJcbiAgW2FkZFJvd09uTmF2aWdhdGVQYXN0RW5kXT1cIm1lcmdlZENvbmZpZy5mZWF0dXJlcz8ua2V5Ym9hcmROYXZpZ2F0aW9uPy5hZGRSb3dPbk5hdmlnYXRlUGFzdEVuZCB8fCBmYWxzZVwiXG4gIFthdHRyLnRhYmluZGV4XT1cImlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpID8gMCA6IC0xXCJcbiAgKGZvY3VzKT1cIm9uVGFibGVDb250YWluZXJGb2N1cygkZXZlbnQpXCJcbiAgW2F0dHIudGl0bGVdPVwiaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkgPyAnQ2xpY2sgYSBjZWxsIG9yIHByZXNzIFRhYiB0byBzdGFydCBrZXlib2FyZCBuYXZpZ2F0aW9uJyA6IG51bGxcIj5cbiAgPCEtLSBVbmlmaWVkIFRhYmxlIEFjdGlvbnMgTWVudSAtLT5cblxuICA8IS0tIFZpcnR1YWwgc2Nyb2xsIHZpZXdwb3J0IHdyYXBwZXIgLS0+XG4gIDxkaXYgY2xhc3M9XCJzdC1zY3JvbGwtdmlld3BvcnRcIiAjc2Nyb2xsVmlld3BvcnQgKm5nSWY9XCJpc1ZpcnR1YWxTY3JvbGxFbmFibGVkKClcIlxuICAgIFtuZ1N0eWxlXT1cInsgJ2hlaWdodC5weCc6IGdldFZpcnR1YWxTY3JvbGxWaWV3cG9ydEhlaWdodCgpIH1cIj5cblxuICAgIDwhLS0gU3BhY2VyIHRvIGNyZWF0ZSBzY3JvbGxhYmxlIGFyZWEgLS0+XG4gICAgPGRpdiBjbGFzcz1cInN0LXNjcm9sbC1zcGFjZXJcIiBbbmdTdHlsZV09XCJ7ICdoZWlnaHQucHgnOiB2aXJ0dWFsU2Nyb2xsVG90YWxIZWlnaHQkIHwgYXN5bmMgfVwiPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBUYWJsZSBwb3NpdGlvbmVyIHdpdGggdHJhbnNmb3JtIChpbnN0ZWFkIG9mIHRib2R5KSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwic3QtdGFibGUtcG9zaXRpb25lclwiIFtuZ1N0eWxlXT1cInsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgnICsgKHZpcnR1YWxTY3JvbGxPZmZzZXRZJCB8IGFzeW5jKSArICdweCknIH1cIj5cbiAgICAgIDwhLS0gVGFibGUgd2l0aCBvbmx5IHZpc2libGUgcm93cyAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZVRlbXBsYXRlOyBjb250ZXh0OiB7IFxuICAgICAgICBtb2RlOiAndmlydHVhbCcsXG4gICAgICAgIHRoZWFkU3R5bGU6IHsgdG9wOiAodmlydHVhbFNjcm9sbE9mZnNldFlOZWckIHwgYXN5bmMpICsgJ3B4JyB9XG4gICAgICB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICBcbiAgPCEtLSBTdGFuZGFyZCB0YWJsZSAod2hlbiB2aXJ0dWFsIHNjcm9sbCBkaXNhYmxlZCkgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNWaXJ0dWFsU2Nyb2xsRW5hYmxlZCgpXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlVGVtcGxhdGU7IGNvbnRleHQ6IHsgXG4gICAgICBtb2RlOiAnc3RhbmRhcmQnLFxuICAgICAgdGhlYWRTdHlsZTogbnVsbFxuICAgIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBTaGFyZWQgQ29sdW1uIE1lbnUgRHJvcGRvd24gLS0+XG4gIDxzdC1jb2x1bW4tbWVudS1kcm9wZG93biBcbiAgW2lzT3Blbl09XCJjb2x1bW5NZW51U3RhdGUuaXNPcGVuXCJcbiAgW3Bvc2l0aW9uXT1cImNvbHVtbk1lbnVTdGF0ZS5wb3NpdGlvblwiXG4gIFtjb250ZXh0XT1cImNvbHVtbk1lbnVTdGF0ZS5jb250ZXh0XCJcbiAgKGFjdGlvbkNsaWNrZWQpPVwib25Db2x1bW5BY3Rpb25DbGlja2VkKCRldmVudClcIlxuICAoY2xvc2VkKT1cImNsb3NlQ29sdW1uTWVudSgpXCI+XG4gIDwvc3QtY29sdW1uLW1lbnUtZHJvcGRvd24+XG48L2Rpdj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIihtZXJnZWRDb25maWcudGFibGVTa2VsZXRvbj8uZW5hYmxlZCB8IGFzeW5jKVwiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2tlbGV0b25Mb2FkZXJcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIFNoYXJlZCBSb3cgQWN0aW9ucyBEcm9wZG93biAtLT5cbjxzdC1yb3ctYWN0aW9ucy1kcm9wZG93biBbaXNPcGVuXT1cImRyb3Bkb3duU3RhdGUuaXNPcGVuXCIgW3Bvc2l0aW9uXT1cImRyb3Bkb3duU3RhdGUucG9zaXRpb25cIlxuICBbY29udGV4dF09XCJkcm9wZG93blN0YXRlLmNvbnRleHRcIiAoYWN0aW9uQ2xpY2tlZCk9XCJvblJvd0FjdGlvbkNsaWNrZWQoJGV2ZW50KVwiIChjbG9zZWQpPVwiY2xvc2VSb3dBY3Rpb25zRHJvcGRvd24oKVwiPlxuPC9zdC1yb3ctYWN0aW9ucy1kcm9wZG93bj5cblxuXG48IS0tIEJvdHRvbSBwYWdpbmF0aW9uIGNvbnRyb2xzIC0tPlxuPHN0LXBhZ2luYXRpb24gXG4gICpuZ0lmPVwic2hvd0JvdHRvbVBhZ2luYXRpb24oKSAmJiAhKG1lcmdlZENvbmZpZy50YWJsZVNrZWxldG9uPy5lbmFibGVkIHwgYXN5bmMpXCIgXG4gIFt0YWJsZVN0YXRlXT1cImdldEFjdGl2ZVRhYmxlU3RhdGUoKVwiXG4gIFt0YWJsZUNvbmZpZ109XCJtZXJnZWRDb25maWdcIlxuICBwb3NpdGlvbj1cImJvdHRvbVwiPlxuPC9zdC1wYWdpbmF0aW9uPlxuXG5cbiAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+XG4gIDwhLS0gUkVVU0FCTEUgVEFCTEUgVEVNUExBVEUgLS0+XG4gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPlxuICA8bmctdGVtcGxhdGUgI3RhYmxlVGVtcGxhdGUgbGV0LW1vZGU9XCJtb2RlXCIgbGV0LXRoZWFkU3R5bGU9XCJ0aGVhZFN0eWxlXCI+XG4gICAgPHRhYmxlIGNsYXNzPVwic3QtdGFibGUtZWxlbWVudFwiPlxuICAgICAgPCEtLSBUQUJMRSBIRUFERVIgLS0+XG4gICAgICA8dGhlYWQgW25nQ2xhc3NdPVwieyAnc3RpY2t5JzogbWVyZ2VkQ29uZmlnLmRpc3BsYXk/LnN0aWNreUhlYWRlciB9XCIgW25nU3R5bGVdPVwidGhlYWRTdHlsZVwiPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPCEtLSBSb3cgTnVtYmVyIEhlYWRlciAtLT5cbiAgICAgICAgICA8dGggKm5nSWY9XCJtZXJnZWRDb25maWcuc2hvd1Jvd051bWJlclwiIGNsYXNzPVwicm93LW51bWJlci1oZWFkZXIgaGVhZGVyLWNlbGwgc3RpY2t5LWxlZnRcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdzdGlja3knLFxuICAgICAgICAgICAgICAgICdsZWZ0LnB4JzogMCxcbiAgICAgICAgICAgICAgICAnei1pbmRleCc6IFpJbmRleC5TVElDS1lfSEVBREVSX0NFTEwsXG4gICAgICAgICAgICAgICAgJ3dpZHRoLnB4JzogMzBcbiAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgI1xuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPCEtLSBDb2x1bW4gSGVhZGVycyAtLT5cbiAgICAgICAgICA8dGggXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHZpc2libGVDb2x1bW5zOyBsZXQgY29sSW5kZXggPSBpbmRleDsgbGV0IGlzRmlyc3QgPSBmaXJzdDsgbGV0IGlzTGFzdCA9IGxhc3RcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAnaGVhZGVyLWNlbGwnOiBtb2RlID09PSAnc3RhbmRhcmQnLFxuICAgICAgICAgICAgICAnc3RpY2t5LWxlZnQnOiBjb2x1bW4uc3RpY2t5ID09PSAnbGVmdCcsXG4gICAgICAgICAgICAgICdzdGlja3ktcmlnaHQnOiBjb2x1bW4uc3RpY2t5ID09PSAncmlnaHQnLFxuICAgICAgICAgICAgICAnc3RpY2t5LXJpZ2h0LWZpcnN0JzogY29sdW1uLnN0aWNreSA9PT0gJ3JpZ2h0JyAmJiBpc0ZpcnN0U3RpY2t5UmlnaHQoY29sdW1uLmtleSksXG4gICAgICAgICAgICAgICdyZXNpemFibGUnOiBjb2x1bW4ucmVzaXphYmxlICE9PSBmYWxzZVxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgIHBvc2l0aW9uOiBjb2x1bW4uc3RpY2t5ID8gJ3N0aWNreScgOiBudWxsLFxuICAgICAgICAgICAgICAnbGVmdC5weCc6IGNvbHVtbi5zdGlja3kgPT09ICdsZWZ0JyA/IChjb2x1bW4uc3RpY2t5T2Zmc2V0IHx8IDApIDogbnVsbCxcbiAgICAgICAgICAgICAgJ3JpZ2h0LnB4JzogY29sdW1uLnN0aWNreSA9PT0gJ3JpZ2h0JyA/IChjb2x1bW4uc3RpY2t5T2Zmc2V0IHx8IDApIDogbnVsbCxcbiAgICAgICAgICAgICAgJ3otaW5kZXgnOiBjb2x1bW4uc3RpY2t5ID8gWkluZGV4LlNUSUNLWV9IRUFERVJfQ0VMTCA6IG51bGwsXG4gICAgICAgICAgICAgICd3aWR0aC5weCc6IGNvbHVtbi53aWR0aFxuICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8c3QtaGVhZGVyIFxuICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgIFtjb2x1bW5JbmRleF09XCJjb2xJbmRleFwiXG4gICAgICAgICAgICAgIFtpc0ZpcnN0Q29sdW1uXT1cImlzRmlyc3RcIlxuICAgICAgICAgICAgICBbaXNMYXN0Q29sdW1uXT1cImlzTGFzdFwiXG4gICAgICAgICAgICAgIFt0YWJsZVN0YXRlXT1cImdldEFjdGl2ZVRhYmxlU3RhdGUoKVwiXG4gICAgICAgICAgICAgIFtlbmFibGVTb3J0aW5nXT1cIm1lcmdlZENvbmZpZy5zb3J0aW5nPy5lbmFibGVkID8/IGVuYWJsZVNvcnRpbmdcIlxuICAgICAgICAgICAgICBbZW5hYmxlRmlsdGVyaW5nXT1cIm1lcmdlZENvbmZpZy5maWx0ZXJpbmc/LmVuYWJsZWQgPz8gZW5hYmxlRmlsdGVyaW5nXCJcbiAgICAgICAgICAgICAgKGNvbHVtbk1vdmVkKT1cIm9uQ29sdW1uTW92ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChtZW51Q2xpY2spPVwib3BlbkNvbHVtbk1lbnUoJGV2ZW50LCBjb2x1bW4sIGNvbEluZGV4LCBpc0ZpcnN0LCBpc0xhc3QpXCI+XG4gICAgICAgICAgICA8L3N0LWhlYWRlcj5cblxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgY2xhc3M9XCJyZXNpemUtaGFuZGxlXCIgXG4gICAgICAgICAgICAgIHN0Q29sdW1uUmVzaXplXG4gICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgKGNvbHVtblJlc2l6ZWQpPVwib25Db2x1bW5SZXNpemVkKCRldmVudClcIlxuICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5yZXNpemFibGUgIT09IGZhbHNlXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIFxuICAgICAgICAgIDwhLS0gU2V0dGluZ3MgQ29sdW1uIEhlYWRlciAtLT5cbiAgICAgICAgICA8dGggXG4gICAgICAgICAgICBjbGFzcz1cInNldHRpbmdzLWNvbHVtbiBzdGlja3ktcmlnaHRcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaGVhZGVyLWNlbGwnOiBtb2RlID09PSAnc3RhbmRhcmQnIH1cIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnei1pbmRleCc6IFpJbmRleC5TVElDS1lfSEVBREVSX0NFTEwgfVwiPlxuICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7ICdmbGV4LWNlbnRlcic6IG1vZGUgPT09ICd2aXJ0dWFsJywgJ2hlYWRlci1jb250ZW50JzogbW9kZSA9PT0gJ3N0YW5kYXJkJyB9XCI+XG4gICAgICAgICAgICAgIDxzdC10YWJsZS1hY3Rpb25zIFxuICAgICAgICAgICAgICAgIFt0YWJsZVN0YXRlXT1cImdldEFjdGl2ZVRhYmxlU3RhdGUoKVwiXG4gICAgICAgICAgICAgICAgW2FsbG93QWRkQ29sdW1uXT1cIm1lcmdlZENvbmZpZy5mZWF0dXJlcz8uY29sdW1uTWFuYWdlbWVudD8uYWxsb3dBZGQgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgIChhZGRDb2x1bW5DbGlja2VkKT1cIm9uQWRkQ29sdW1uQ2xpY2soKVwiPlxuICAgICAgICAgICAgICA8L3N0LXRhYmxlLWFjdGlvbnM+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cblxuICAgICAgPCEtLSBUQUJMRSBCT0RZIC0tPlxuICAgICAgPHRib2R5PlxuICAgICAgICA8IS0tIFZpcnR1YWwgU2Nyb2xsIFJvd3MgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlID09PSAndmlydHVhbCdcIj5cbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiB2aXNpYmxlUm93cyQgfCBhc3luYzsgbGV0IHJlbGF0aXZlSW5kZXggPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeVJvd0luZGV4XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtcm93LWluZGV4XT1cImdldEFic29sdXRlUm93SW5kZXgocmVsYXRpdmVJbmRleClcIj5cbiAgICAgICAgICAgIDwhLS0gUm93IE51bWJlciBDZWxsIC0tPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwibWVyZ2VkQ29uZmlnLnNob3dSb3dOdW1iZXJcIiBjbGFzcz1cInJvdy1udW1iZXItY2VsbFwiIFxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzdGlja3ktbGVmdCc6ICdsZWZ0JyB9XCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgICd3aWR0aC5weCc6IDMwLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnc3RpY2t5JyxcbiAgICAgICAgICAgICAgICAnbGVmdC5weCc6IDAsXG4gICAgICAgICAgICAgICAgJ3otaW5kZXgnOiBaSW5kZXguU1RJQ0tZX0JPRFlfQ0VMTCxcbiAgICAgICAgICAgICAgICAnaGVpZ2h0LnB4JzogbW9kZSA9PT0gJ3ZpcnR1YWwnID8gZ2V0VmlydHVhbFNjcm9sbEl0ZW1TaXplKCkgOiBudWxsXG4gICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAge3tnZXRBYnNvbHV0ZVJvd0luZGV4KHJlbGF0aXZlSW5kZXgpICsgMX19XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJvZHlDZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHsgXG4gICAgICAgICAgICAgIHJvdzogcm93LFxuICAgICAgICAgICAgICByb3dJbmRleDogZ2V0QWJzb2x1dGVSb3dJbmRleChyZWxhdGl2ZUluZGV4KSxcbiAgICAgICAgICAgICAgbW9kZTogJ3ZpcnR1YWwnLFxuICAgICAgICAgICAgICByZWxhdGl2ZUluZGV4OiByZWxhdGl2ZUluZGV4XG4gICAgICAgICAgICB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBTdGFuZGFyZCBSb3dzIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZSA9PT0gJ3N0YW5kYXJkJ1wiPlxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHZpc2libGVDZWxsR3JpZDsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIiBbYXR0ci5kYXRhLXJvdy1pbmRleF09XCJyb3dJbmRleFwiPlxuICAgICAgICAgICAgPCEtLSBSb3cgTnVtYmVyIENlbGwgLS0+XG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJtZXJnZWRDb25maWcuc2hvd1Jvd051bWJlclwiIGNsYXNzPVwicm93LW51bWJlci1jZWxsXCIgXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3N0aWNreS1sZWZ0JzogJ2xlZnQnIH1cIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgJ3dpZHRoLnB4JzogMzAsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdzdGlja3knLFxuICAgICAgICAgICAgICAgICdsZWZ0LnB4JzogMCxcbiAgICAgICAgICAgICAgICAnei1pbmRleCc6IFpJbmRleC5TVElDS1lfQk9EWV9DRUxMLFxuICAgICAgICAgICAgICAgICdoZWlnaHQucHgnOiBtb2RlID09PSAndmlydHVhbCcgPyBnZXRWaXJ0dWFsU2Nyb2xsSXRlbVNpemUoKSA6IG51bGxcbiAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICB7e3Jvd0luZGV4ICsgMX19XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJvZHlDZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHsgXG4gICAgICAgICAgICAgIHJvdzogcm93LFxuICAgICAgICAgICAgICByb3dJbmRleDogcm93SW5kZXgsXG4gICAgICAgICAgICAgIG1vZGU6ICdzdGFuZGFyZCdcbiAgICAgICAgICAgIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPlxuICA8IS0tIFJFVVNBQkxFIEJPRFkgQ0VMTCBURU1QTEFURSAtLT5cbiAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+XG4gIDxuZy10ZW1wbGF0ZSAjYm9keUNlbGxUZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIiBsZXQtbW9kZT1cIm1vZGVcIiBsZXQtcmVsYXRpdmVJbmRleD1cInJlbGF0aXZlSW5kZXhcIj5cbiAgICA8IS0tIERhdGEgQ2VsbHMgLS0+XG4gICAgPHRkIFxuICAgICAgKm5nRm9yPVwibGV0IGNlbGwgb2Ygcm93OyBsZXQgY29sSW5kZXggPSBpbmRleFwiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdzdGlja3ktbGVmdCc6IHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8uc3RpY2t5ID09PSAnbGVmdCcsXG4gICAgICAgICdzdGlja3ktcmlnaHQnOiB2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0/LnN0aWNreSA9PT0gJ3JpZ2h0JyxcbiAgICAgICAgJ3N0aWNreS1yaWdodC1maXJzdCc6IHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8uc3RpY2t5ID09PSAncmlnaHQnICYmIHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8ua2V5ICYmIGlzRmlyc3RTdGlja3lSaWdodCh2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0ua2V5KSxcbiAgICAgICAgJ2FsaWduLWNlbnRlcic6IHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8uYWxpZ25tZW50ID09PSAnY2VudGVyJyxcbiAgICAgICAgJ2FsaWduLXJpZ2h0JzogdmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdPy5hbGlnbm1lbnQgPT09ICdyaWdodCcsXG4gICAgICAgICdjZWxsLWZvY3VzZWQnOiBjZWxsLmlzRm9jdXNlZCgpXG4gICAgICB9XCJcbiAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgcG9zaXRpb246IHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8uc3RpY2t5ID8gJ3N0aWNreScgOiBudWxsLFxuICAgICAgICAnbGVmdC5weCc6IHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8uc3RpY2t5ID09PSAnbGVmdCcgPyAodmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdPy5zdGlja3lPZmZzZXQgfHwgMCkgOiBudWxsLFxuICAgICAgICAncmlnaHQucHgnOiB2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0/LnN0aWNreSA9PT0gJ3JpZ2h0JyA/ICh2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0/LnN0aWNreU9mZnNldCB8fCAwKSA6IG51bGwsXG4gICAgICAgICd6LWluZGV4JzogdmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdPy5zdGlja3kgPyBaSW5kZXguU1RJQ0tZX0JPRFlfQ0VMTCA6IG51bGwsXG4gICAgICAgICd3aWR0aC5weCc6IHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8ud2lkdGgsXG4gICAgICAgICdoZWlnaHQucHgnOiBtb2RlID09PSAndmlydHVhbCcgPyBnZXRWaXJ0dWFsU2Nyb2xsSXRlbVNpemUoKSA6IG51bGxcbiAgICAgIH1cIlxuICAgICAgKGNsaWNrKT1cImlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpID8gb25DZWxsQ2xpY2socm93SW5kZXgsIGNvbEluZGV4KSA6IG51bGxcIj5cbiAgICAgIFxuICAgICAgPCEtLSBWaXJ0dWFsIFNjcm9sbCBDZWxsIC0tPlxuICAgICAgPHN0LWNlbGwgXG4gICAgICAgICpuZ0lmPVwibW9kZSA9PT0gJ3ZpcnR1YWwnXCJcbiAgICAgICAgW2NlbGxdPVwiY2VsbFwiIFxuICAgICAgICBbYXR0ci50YWJpbmRleF09XCJjZWxsLmlzRm9jdXNlZCgpID8gMCA6IC0xXCIgXG4gICAgICAgIFtlZGl0TW9kZV09XCJnZXRFZGl0TW9kZUZvckNlbGxzKClcIlxuICAgICAgICBbdGFibGVTdGF0ZV09XCJnZXRBY3RpdmVUYWJsZVN0YXRlKClcIlxuICAgICAgICBbdGFibGVDb25maWddPVwibWVyZ2VkQ29uZmlnXCJcbiAgICAgICAgW2NvbHVtbkluZGV4XT1cImNvbEluZGV4XCJcbiAgICAgICAgKGNlbGxFZGl0KT1cIm9uQ2VsbEVkaXQoJGV2ZW50KVwiIFxuICAgICAgICAoY2VsbFNhdmUpPVwib25DZWxsU2F2ZSgkZXZlbnQpXCJcbiAgICAgICAgKGNlbGxTYXZlQW5kTmF2aWdhdGUpPVwib25DZWxsU2F2ZUFuZE5hdmlnYXRlKCRldmVudClcIiBcbiAgICAgICAgKGNlbGxDYW5jZWwpPVwib25DZWxsQ2FuY2VsKCRldmVudClcIlxuICAgICAgICAoY2VsbENoYW5nZSk9XCJjZWxsQ2hhbmdlLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgPC9zdC1jZWxsPlxuXG4gICAgICA8IS0tIFN0YW5kYXJkIENlbGwgLS0+XG4gICAgICA8c3QtY2VsbCBcbiAgICAgICAgKm5nSWY9XCJtb2RlID09PSAnc3RhbmRhcmQnXCJcbiAgICAgICAgW2NlbGxdPVwiY2VsbFwiICBcbiAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiY2VsbC5pc0ZvY3VzZWQoKSA/IDAgOiAtMVwiXG4gICAgICAgIFt0YWJsZVN0YXRlXT1cImdldEFjdGl2ZVRhYmxlU3RhdGUoKVwiXG4gICAgICAgIFt0YWJsZUNvbmZpZ109XCJtZXJnZWRDb25maWdcIlxuICAgICAgICBbY29sdW1uSW5kZXhdPVwiY29sSW5kZXhcIlxuICAgICAgICAoY2VsbFNhdmUpPVwib25DZWxsU2F2ZSgkZXZlbnQpXCJcbiAgICAgICAgKGNlbGxDaGFuZ2UpPVwiY2VsbENoYW5nZS5lbWl0KCRldmVudClcIj5cbiAgICAgIDwvc3QtY2VsbD5cbiAgICA8L3RkPlxuICAgIFxuICAgIDwhLS0gUm93IEFjdGlvbnMgQ2VsbCAtLT5cbiAgICA8dGQgY2xhc3M9XCJzZXR0aW5ncy1jb2x1bW5cIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnaGFzLWFjdGlvbnMnOiBoYXNSb3dBY3Rpb25zKClcbiAgICAgIH1cIlxuICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICBwb3NpdGlvbjogaGFzUm93QWN0aW9ucygpID8gJ3N0aWNreScgOiBudWxsLFxuICAgICAgICAncmlnaHQucHgnOiBoYXNSb3dBY3Rpb25zKCkgPyAwIDogbnVsbCxcbiAgICAgICAgJ3otaW5kZXgnOiBoYXNSb3dBY3Rpb25zKCkgPyBaSW5kZXguU1RJQ0tZX0JPRFlfQ0VMTCA6IG51bGxcbiAgICAgIH1cIj5cbiAgICAgIDxidXR0b24gXG4gICAgICAgICpuZ0lmPVwiaGFzUm93QWN0aW9ucygpXCJcbiAgICAgICAgY2xhc3M9XCJzZXR0aW5ncy10cmlnZ2VyXCJcbiAgICAgICAgKGNsaWNrKT1cIm9wZW5Sb3dBY3Rpb25zRHJvcGRvd24oJGV2ZW50LCBnZXRSb3dEYXRhKHJvd0luZGV4KSwgcm93SW5kZXgpXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICBhcmlhLWxhYmVsPVwiUm93IGFjdGlvbnNcIj5cbiAgICAgICAg4ouvXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L3RkPlxuICA8L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3NrZWxldG9uTG9hZGVyPlxuICA8ZGl2IGNsYXNzPVwibGlzdC1yb3dcIiAqbmdJZj1cIihtZXJnZWRDb25maWcudGFibGVTa2VsZXRvbj8uZW5hYmxlZCB8IGFzeW5jKVwiPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGkgb2Ygc2tlbGV0b25Db2x1bW5zXCIgY2xhc3M9XCJsaXN0LWNvbnRlbnRcIj5cbiAgICAgIDxuaWxlLXNrZWxldG9uLWxvYWRlciB2YXJpYW50PVwidGV4dFwiIHdpZHRoPVwiOTAlXCIgaGVpZ2h0PVwiMThcIiAqbmdGb3I9XCJsZXQgaiBvZiBza2VsZXRvblJvd3NcIj48L25pbGUtc2tlbGV0b24tbG9hZGVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19