@ohioepa/oepa-ui-lib 2.0.18 → 2.0.19

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.
@@ -19,6 +19,7 @@ import * as i16 from "./oepa-table-cell-icon-classname.pipe";
19
19
  import * as i17 from "./oepa-table-cell-img-src.pipe";
20
20
  export class TableComponent {
21
21
  sanitizer;
22
+ elementRef;
22
23
  tableService;
23
24
  tableExportService;
24
25
  fileUtilService;
@@ -30,7 +31,8 @@ export class TableComponent {
30
31
  exportVisibleOnly = false;
31
32
  /** True if any action dropdown is open */
32
33
  isAnyActionDropdownOpen = false;
33
- actionDropdownOpenChange = new EventEmitter();
34
+ /** Dynamic spacer height used to avoid clipping inside expansion panels */
35
+ actionFillerHeight = 0;
34
36
  dataColumns = [];
35
37
  hiddenColumns = [];
36
38
  columnHeaders = [];
@@ -53,6 +55,7 @@ export class TableComponent {
53
55
  currentPage = 1;
54
56
  paginationOn = true;
55
57
  tableId = '';
58
+ addActionFiller = false;
56
59
  set config(conf) {
57
60
  if (!conf.className) {
58
61
  conf.className = 'table-striped table-bordered';
@@ -105,8 +108,30 @@ export class TableComponent {
105
108
  }
106
109
  /** Called when any oepa-action-btn dropdown open/close changes */
107
110
  onDropdownOpenChange(isOpen) {
108
- this.isAnyActionDropdownOpen = isOpen;
109
- this.actionDropdownOpenChange.emit(isOpen);
111
+ // Wait for DOM class updates from dropdown directive before measuring.
112
+ setTimeout(() => this.updateDropdownFillerState());
113
+ }
114
+ updateDropdownFillerState() {
115
+ const host = this.elementRef.nativeElement;
116
+ const openMenus = Array.from(host.querySelectorAll('.oepa-action-menu.show'));
117
+ this.isAnyActionDropdownOpen = openMenus.length > 0;
118
+ if (!this.addActionFiller || !this.isAnyActionDropdownOpen) {
119
+ this.actionFillerHeight = 0;
120
+ return;
121
+ }
122
+ const panelContent = host.closest('.mat-expansion-panel-content');
123
+ let maxOverflow = 0;
124
+ openMenus.forEach((menu) => {
125
+ const menuRect = menu.getBoundingClientRect();
126
+ const overflow = panelContent
127
+ ? menuRect.bottom - panelContent.getBoundingClientRect().bottom
128
+ : menuRect.bottom - window.innerHeight;
129
+ if (overflow > maxOverflow) {
130
+ maxOverflow = overflow;
131
+ }
132
+ });
133
+ // Add small cushion so border/shadow are fully visible.
134
+ this.actionFillerHeight = Math.max(0, Math.ceil(maxOverflow) + 16);
110
135
  }
111
136
  initializeHiddenColumns(complexHeader) {
112
137
  this.visibleColumnCount = 0;
@@ -148,8 +173,9 @@ export class TableComponent {
148
173
  return this._data.map(x => Object.assign({}, x));
149
174
  }
150
175
  totalRow;
151
- constructor(sanitizer, tableService, tableExportService, fileUtilService) {
176
+ constructor(sanitizer, elementRef, tableService, tableExportService, fileUtilService) {
152
177
  this.sanitizer = sanitizer;
178
+ this.elementRef = elementRef;
153
179
  this.tableService = tableService;
154
180
  this.tableExportService = tableExportService;
155
181
  this.fileUtilService = fileUtilService;
@@ -736,7 +762,7 @@ export class TableComponent {
736
762
  convertToTable(template) {
737
763
  let oepaTable = undefined;
738
764
  if (template.component === TableComponent) {
739
- const table = new TableComponent(this.sanitizer, this.tableService, this.tableExportService, this.fileUtilService);
765
+ const table = new TableComponent(this.sanitizer, this.elementRef, this.tableService, this.tableExportService, this.fileUtilService);
740
766
  if (template.inputs && template.inputs.length > 0) {
741
767
  template.inputs.forEach((input) => {
742
768
  if (input.name === 'config') {
@@ -776,15 +802,15 @@ export class TableComponent {
776
802
  onCustomBtnClick() {
777
803
  this.customBtnClicked.emit();
778
804
  }
779
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableComponent, deps: [{ token: i1.DomSanitizer }, { token: i2.TableService }, { token: i3.TableExportService }, { token: i4.OepaFileUtilService }], target: i0.ɵɵFactoryTarget.Component });
780
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TableComponent, selector: "oepa-table", inputs: { tableId: "tableId", config: "config", complexHeader: "complexHeader", header: "header", customBtnLabel: "customBtnLabel", customBtnVisible: "customBtnVisible", customBtnEnabled: "customBtnEnabled", data: "data", totalRow: "totalRow" }, outputs: { actionDropdownOpenChange: "actionDropdownOpenChange", cellClicked: "cellClicked", actionClicked: "actionClicked", rowSelected: "rowSelected", customBtnClicked: "customBtnClicked" }, ngImport: i0, template: "<!-- Unhide select input - only visible if one or more columns are hidden -->\n\n<form *ngIf=\"hiddenColumns.length > 0\" aria-label=\"Show hidden columns\">\n <div class=\"row mb-2\">\n <label class=\"col-sm-2 col-form-label\" [for]=\"tableId+'_UnhideColumnSelect'\">Show Hidden Columns:</label>\n <div class=\"col-sm-4\">\n <select class=\"form-select\" (change)=\"unhideColumn($any($event).target.value)\" [id]=\"tableId+'_UnhideColumnSelect'\" aria-label=\"Select column to unhide\">\n <option value=\"\">Choose a column</option>\n <option *ngFor=\"let col of hiddenColumns\" [value]=\"col.id\">{{col.title}}</option>\n </select>\n </div>\n </div>\n</form>\n<!-- This is the table -->\n<div [ngClass]=\"config.divClassName || ''\">\n<table *ngIf=\"!config.hideTable\" class=\"table dataTable\" [ngClass]=\"config.className || ''\" role=\"table\" style=\"width: 100%;\" aria-label=\"Data table\">\n\n<!-- This is the table header -->\n<thead>\n <!-- There may be multiple header rows -->\n <tr *ngFor=\"let hdr of headerRows; let hr=index;\" role=\"row\">\n <!-- Details indicator column (if data has details) -->\n <th *ngIf=\"dataHasDetails && hr === 0\" [rowSpan]=\"headerRows.length\" class=\"detail-indicator-col\" scope=\"col\">\n <span class=\"sr-only\">Row details</span>\n <button type=\"button\" class=\"btn btn-link p-0\" (click)=\"toggleAllDetails()\" [id]=\"tableId+'_ShowAllDetailsLink'\" [attr.aria-pressed]=\"showAllDetails\" [attr.aria-label]=\"(showAllDetails ? 'Hide' : 'Show') + ' details for all rows'\">\n <i class=\"bi\" [ngClass]=\"{'bi-chevron-down': showAllDetails, 'bi-chevron-right': !showAllDetails}\" aria-hidden=\"true\"></i>\n </button>\n </th>\n <ng-template ngFor let-column [ngForOf]=\"hdr.columns\" let-c=\"index\">\n <!-- Header cell -->\n <th *ngIf=\"!column.hidden\" [ngClass]=\"column.className || ''\" [colSpan]=\"column.colspan || 1\" [rowSpan]=\"column.rowspan || 1\" scope=\"col\">\n <!-- Select all Rows Checkbox -->\n <div class=\"text-center\">\n <input *ngIf=\"column.selectColumn\" type=\"checkbox\" [checked]=\"allRowsSelected\" (change)=\"toggleAllRowsSelection()\" [attr.aria-label]=\"'Select all rows'\">\n\n <!-- Header cell text with sort capability (if specified) -->\n <span [oepaTableSorting]=\"true\" [column]=\"column\" [tableId]=\"tableId\" (sortChanged)=\"onSortChanged($event)\" [id]=\"tableId+'_SortColumnLink_'+column.id\" tabindex=\"0\" role=\"button\" [attr.aria-label]=\"'Sort by ' + column.title\">\n <span *ngIf=\"column.sort\"><i class=\"pull-left bi\" [ngClass]=\"{'bi-chevron-down': column.sort === 'desc', 'bi-chevron-up': column.sort === 'asc'}\" aria-hidden=\"true\"></i>\n <sup *ngIf=\"column?.sortIndex || 0 > 1\">{{column.sortIndex}}</sup></span>\n {{column.title}}\n </span>\n <!-- button to allow column to be hidden (if specified) -->\n <button *ngIf=\"column.hidden === false\" type=\"button\" class=\"btn-close float-end\" aria-label=\"Hide column\" (click)=\"hideColumn(column)\"\n [id]=\"tableId+'_HideColumnLink'+'_'+column.id\">\n </button>\n\n </div>\n <!-- column filter (if specified) -->\n <div *ngIf=\"((rows && rows.length > 0) || !noFilters()) && column.filterable\" >\n <input [oepaTableFiltering]=\"{ filterString: '', columnId: column.id }\" [tableId]=\"tableId\" class=\"form-control input-sm\" (tableChanged)=\"onFilterChanged($event)\"\n [id]=\"tableId+'_FilterColumn_'+column.id\" [attr.aria-label]=\"'Filter for ' + column.title\" />\n </div>\n </th>\n </ng-template>\n </tr>\n</thead>\n\n<!-- This is the table body -->\n<tbody>\n <ng-template ngFor let-row [ngForOf]=\"rows\" let-r=\"index\">\n <!-- Data Row -->\n <tr>\n <td *ngIf=\"dataHasDetails\">\n <!-- Detail icon (if specified) -->\n <span *ngIf=\"row.showDetail === true || row.showDetail === false\">\n <i *ngIf=\"row.detailIconClassName\" [ngClass]=\"row.detailIconClassName\" aria-hidden=\"true\"></i>\n <button type=\"button\" class=\"btn btn-link p-0\" (click)=\"toggleRowDetail(row)\" [id]=\"tableId+'_ShowDetailLink_'+r\" [attr.aria-pressed]=\"row.showDetail\" [attr.aria-label]=\"(row.showDetail ? 'Hide' : 'Show') + ' details for this row'\">\n <i class=\"bi\" [ngClass]=\"{'bi-chevron-down': row.showDetail, 'bi-chevron-right': !row.showDetail}\" aria-hidden=\"true\"></i>\n </button>\n </span>\n </td>\n <!-- If row is a divider, it spans the whole table -->\n <!-- <td *ngIf=\"row.isDivider\" [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\" [ngClass]=\"row.dividerClassName || 'oepa-table-gray'\">&nbsp;</td> -->\n <!-- Data Rows -->\n <ng-template *ngIf=\"!row.isDivider\" ngFor let-col [ngForOf]=\"dataColumns\" let-i=\"index\">\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0\" ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <!-- Data Cell -->\n <div *ngIf=\"!col.actionColumn && !col.selectColumn && !col.singleSelectColumn\">\n <!-- Template for popover 1 -->\n <ng-template #popoverTemplate>\n <div *ngIf=\"row.popover\">\n <cml-template [templateInfo]=\"row.popover.content\"></cml-template>\n </div>\n </ng-template>\n <!-- Popover 1 icon (if specified) -->\n <span *ngIf=\"row.popover && i === (row.popoverColumnIndex || 0) && row.popover\" tabindex=\"0\" [popoverTitle]=\"row.popover.title\" [popover]=\"popoverTemplate\"\n [containerClass]=\"row.popover.containerClass\" placement=\"right\" [triggers]=\"row.popover.trigger || 'mouseenter:mouseleave'\">\n <i [ngClass]=\"row.popover.className\" [id]=\"tableId+'_PopoverLink_'+r\"></i>\n </span>\n\n <!-- Template for popover 2 -->\n <ng-template #popover2Template>\n <div *ngIf=\"row.popover2\">\n <cml-template [templateInfo]=\"row.popover2.content\"></cml-template>\n </div>\n </ng-template>\n <!-- Popover 2 icon (if specified) -->\n <span *ngIf=\"i === (row.popover2ColumnIndex || 0) && row.popover2\" tabindex=\"0\" [popoverTitle]=\"row.popover2.title\" [popover]=\"popover2Template\"\n [containerClass]=\"row.popover2.containerClass\" placement=\"right\" [triggers]=\"row.popover2.trigger || 'mouseenter:mouseleave'\">\n <i [ngClass]=\"row.popover2.className\" [id]=\"tableId+'_Popover2Link_'+r\"></i>\n </span>\n\n <!-- Template for popover 3 -->\n <ng-template #popover3Template>\n <div *ngIf=\"row.popover3\">\n <cml-template [templateInfo]=\"row.popover3.content\"></cml-template>\n </div>\n </ng-template>\n <!-- Popover 3 icon (if specified) -->\n <span *ngIf=\"i === (row.popover3ColumnIndex || 0) && row.popover3\" tabindex=\"0\" [popoverTitle]=\"row.popover3.title\" [popover]=\"popover3Template\"\n [containerClass]=\"row.popover3.containerClass\" placement=\"right\" [triggers]=\"row.popover3.trigger || 'mouseenter:mouseleave'\">\n <i [ngClass]=\"row.popover3.className\" [id]=\"tableId+'_Popover3Link_'+r\"></i>\n </span>\n\n \n <!-- <div *ngIf=\"row|cellInnerHTML:col\" [innerHTML]=\"row|cellInnerHTML:col\"></div>\n <span *ngIf=\"!(row|cellInnerHTML:col)\">{{row|cellValue:col}}</span> -->\n\n <!-- If col is hyperlink, display data as a hyperlink -->\n <a *ngIf=\"col.hyperlink\" href=\"javascript:void(0);\" (click)=\"cellClick(row, col.id)\" [id]=\"tableId+'_CellClick_'+r+'_'+i\" tabindex=\"0\" role=\"button\" [attr.aria-label]=\"'Activate ' + (col.title || 'cell')\">\n <span *ngIf=\"!(row|cellInnerHTML:col)\">\n <i [ngClass]=\"row|cellIconClassname:col\" aria-hidden=\"true\"></i>\n <span *ngIf=\"row|cellImgSrc:col\"><img [src]=\"row|cellImgSrc:col\" alt=\"\"/></span>\n {{row|cellValue:col}}\n </span>\n <div *ngIf=\"row|cellInnerHTML:col\" [innerHTML]=\"row|cellInnerHTML:col\"></div>\n </a>\n <!-- If col is NOT hyperlink, just display data -->\n <span *ngIf=\"!col.hyperlink\">\n <span *ngIf=\"!(row|cellInnerHTML:col)\">\n <i ngClass=\"{{row|cellIconClassname:col || ''}}\" aria-hidden=\"true\"></i>\n <span *ngIf=\"row|cellImgSrc:col\"><img [src]=\"row|cellImgSrc:col\" alt=\"\"/></span>\n {{row|cellValue:col}}\n </span>\n <div *ngIf=\"row|cellInnerHTML:col\" [innerHTML]=\"row|cellInnerHTML:col\"></div>\n </span>\n </div>\n <!-- Select Cell -->\n <div *ngIf=\"col.selectColumn\" class=\"text-center\">\n <input [id]=\"tableId+'_'+r\" type=\"checkbox\" [disabled]=\"!row.selectable\" [checked]=\"row.selected\" (change)=\"toggleRowSelection(row)\" [attr.aria-label]=\"'Select row ' + (r+1)\">\n </div>\n <!-- Single Select Cell -->\n <div *ngIf=\"col.singleSelectColumn\" class=\"text-center\">\n <input [id]=\"tableId+'_singleSelect_'+r\" type=\"radio\" [disabled]=\"!row.selectable\" [checked]=\"row.selected\" (change)=\"singleRowSelection(row)\" [attr.aria-label]=\"'Select row ' + (r+1)\">\n </div>\n <!-- Action Button Cell -->\n <div *ngIf=\"col.actionColumn && row.actions\">\n <oepa-action-btn [actions]=\"row.actions\" [data]=\"row.dataSource\" (actionClicked)=\"onActionClick($event)\" [btnId]=\"tableId+'_'+r\" (dropdownOpenChange)=\"onDropdownOpenChange($event)\"></oepa-action-btn>\n </div>\n </td>\n </ng-template>\n </tr>\n\n <!-- Detail Row -->\n <tr *ngIf=\"row.showDetail\" class=\"table-info\">\n <td [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\">\n <cml-template [templateInfo]=\"row.detail\"></cml-template>\n </td>\n </tr>\n </ng-template>\n <tr *ngIf=\"totalRow\">\n <td *ngIf=\"dataHasDetails\">\n </td>\n <ng-template ngFor let-totalCol [ngForOf]=\"dataColumns\">\n <td *ngIf=\"!totalCol.hidden\" ngClass=\"{{totalRow|cellClassname:totalCol || ''}}\">\n <div>\n <span><i ngClass=\"{{totalRow|cellIconClassname:totalCol || ''}}\"></i>{{totalRow|cellValue:totalCol}}</span>\n </div>\n </td>\n </ng-template>\n </tr>\n</tbody>\n</table>\n</div>\n<!-- Table footer -->\n<form *ngIf=\"!config.hideFooter || (data && pageInfo.itemsPerPage < data.length)\" class=\"form-horizontal\">\n<div class=\"form-group row text-right\">\n <!-- Table-wide filter -->\n <div class=\"col-sm-4\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <input *ngIf=\"!config.hideGlobalFilter\" placeholder=\"Filter all columns\" [oepaTableFiltering]=\"{ filterString: '' }\" [tableId]=\"tableId\" class=\"form-control input-sm\" (tableChanged)=\"onFilterChanged($event)\"\n [id]=\"tableId+'_FilterAllColumnsInput'\" aria-label=\"Filter all columns in table\" type=\"search\" />\n </div>\n <div class=\"col-sm-6\">\n <span *ngIf=\"config.showRowCountInFooter && _data && _data.length > 0\">\n {{_data.length}}&nbsp;total rows\n </span>\n </div>\n </div>\n </div>\n <!-- Export Buttons -->\n <div class=\"col-sm-4 d-flex justify-content-center\">\n <div class=\"row\">\n <div class=\"col-sm-12 text-center\">\n <button type=\"button\" *ngIf=\"config.exportToExcel\" class=\"btn btn-primary mr-1\" (click)=\"exportToExcel()\" [id]=\"tableId+'_ExportToExcelBtn'\" aria-label=\"Export to Excel\">Export to Excel</button>\n <button type=\"button\" *ngIf=\"config.exportToHTML\" class=\"btn btn-primary mr-1\" (click)=\"exportToHTML()\" [id]=\"tableId+'_ExportToHTMLBtn'\" aria-label=\"Export to HTML\">Export to HTML</button>\n <button *ngIf=\"customBtnVisible\" type=\"button\" class=\"btn btn-primary mr-1\" (click)=\"onCustomBtnClick()\" [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled\" [attr.aria-label]=\"customBtnLabel\">{{customBtnLabel}}</button>\n </div>\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"col-sm-12 text-center\">\n <span>Export only visible data:&nbsp;\n <input type=\"checkbox\" [checked]=\"exportVisibleOnly\" (click)=\"toggleExportVisibleOnly()\" id=\"exportVisibleOnlyCheckbox\" aria-label=\"Export only visible data\"/>\n </span>\n </div>\n </div>\n </div>\n <!-- Pagination -->\n <div *ngIf=\"!config.disablePagination\" class=\"col-sm-4 d-flex justify-content-end\">\n <pagination *ngIf=\"paginationOn\" class=\"pagination-sm\" [totalItems]=\"pageInfo.length\" [itemsPerPage]=\"pageInfo.itemsPerPage\" [maxSize]=\"pageInfo.maxSize\"\n [(ngModel)]=\"currentPage\" name=\"currentTablePage\"\n [boundaryLinks]=\"true\" [rotate]=\"false\" (pageChanged)=\"onPageChanged($event)\" (numPages)=\"pageInfo.numPages = $event\"\n aria-label=\"Table pagination\">\n </pagination>\n &nbsp;\n <button (click)=\"togglePagingation()\" type=\"button\" class=\"btn btn-default btn-sm mr-1\" [attr.aria-label]=\"paginationOn ? 'Show All Rows' : 'Restore Pagination'\">{{ paginationOn ? 'Show All Rows' : 'Restore Pagination'}}</button>\n </div>\n</div>\n</form>", styles: [".pagination{margin:0}th.oepa-table-header-center{text-align:center}.oepa-table-bold{font-weight:700}.oepa-table-italic{font-style:italic}.oepa-table-line-through{text-decoration:line-through}.oepa-table-gray{background-color:#ddd}td.oepa-undeline-cell{border-bottom:1pt solid black}.detail-indicator-col{width:30px}.action-btn-col{width:90px}.select-col{width:20px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i7.PaginationComponent, selector: "pagination", inputs: ["align", "maxSize", "boundaryLinks", "directionLinks", "firstText", "previousText", "nextText", "lastText", "rotate", "pageBtnClass", "disabled", "customPageTemplate", "customNextTemplate", "customPreviousTemplate", "customFirstTemplate", "customLastTemplate", "itemsPerPage", "totalItems"], outputs: ["numPages", "pageChanged"] }, { kind: "directive", type: i8.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: i4.OepaTemplateComponent, selector: "cml-template", inputs: ["templateInfo"] }, { kind: "component", type: i9.ActionBtnComponent, selector: "oepa-action-btn", inputs: ["label", "btnId", "data", "actions", "normalSize", "dropup"], outputs: ["dropdownOpenChange", "actionClicked"] }, { kind: "directive", type: i10.OepaTableSortingDirective, selector: "[oepaTableSorting]", inputs: ["tableId", "oepaTableSorting", "column"], outputs: ["sortChanged"] }, { kind: "directive", type: i11.OepaTableFilteringDirective, selector: "[oepaTableFiltering]", inputs: ["oepaTableFiltering", "tableId"], outputs: ["tableChanged"] }, { kind: "pipe", type: i12.OepaTableCellInnerHtmlPipe, name: "cellInnerHTML" }, { kind: "pipe", type: i13.OepaTableCellColSpanPipe, name: "cellColspan" }, { kind: "pipe", type: i14.OepaTableCellValuePipe, name: "cellValue" }, { kind: "pipe", type: i15.OepaTableCellClassnamePipe, name: "cellClassname" }, { kind: "pipe", type: i16.OepaTableCellIconClassnamePipe, name: "cellIconClassname" }, { kind: "pipe", type: i17.OepaTableCellImgSrcPipe, name: "cellImgSrc" }] });
805
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableComponent, deps: [{ token: i1.DomSanitizer }, { token: i0.ElementRef }, { token: i2.TableService }, { token: i3.TableExportService }, { token: i4.OepaFileUtilService }], target: i0.ɵɵFactoryTarget.Component });
806
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TableComponent, selector: "oepa-table", inputs: { tableId: "tableId", addActionFiller: "addActionFiller", config: "config", complexHeader: "complexHeader", header: "header", customBtnLabel: "customBtnLabel", customBtnVisible: "customBtnVisible", customBtnEnabled: "customBtnEnabled", data: "data", totalRow: "totalRow" }, outputs: { cellClicked: "cellClicked", actionClicked: "actionClicked", rowSelected: "rowSelected", customBtnClicked: "customBtnClicked" }, ngImport: i0, template: "<!-- Unhide select input - only visible if one or more columns are hidden -->\n\n<form *ngIf=\"hiddenColumns.length > 0\" aria-label=\"Show hidden columns\">\n <div class=\"row mb-2\">\n <label class=\"col-sm-2 col-form-label\" [for]=\"tableId+'_UnhideColumnSelect'\">Show Hidden Columns:</label>\n <div class=\"col-sm-4\">\n <select class=\"form-select\" (change)=\"unhideColumn($any($event).target.value)\" [id]=\"tableId+'_UnhideColumnSelect'\" aria-label=\"Select column to unhide\">\n <option value=\"\">Choose a column</option>\n <option *ngFor=\"let col of hiddenColumns\" [value]=\"col.id\">{{col.title}}</option>\n </select>\n </div>\n </div>\n</form>\n<!-- This is the table -->\n<div [ngClass]=\"config.divClassName || ''\">\n<table *ngIf=\"!config.hideTable\" class=\"table dataTable\" [ngClass]=\"config.className || ''\" role=\"table\" style=\"width: 100%;\" aria-label=\"Data table\">\n\n<!-- This is the table header -->\n<thead>\n <!-- There may be multiple header rows -->\n <tr *ngFor=\"let hdr of headerRows; let hr=index;\" role=\"row\">\n <!-- Details indicator column (if data has details) -->\n <th *ngIf=\"dataHasDetails && hr === 0\" [rowSpan]=\"headerRows.length\" class=\"detail-indicator-col\" scope=\"col\">\n <span class=\"sr-only\">Row details</span>\n <button type=\"button\" class=\"btn btn-link p-0\" (click)=\"toggleAllDetails()\" [id]=\"tableId+'_ShowAllDetailsLink'\" [attr.aria-pressed]=\"showAllDetails\" [attr.aria-label]=\"(showAllDetails ? 'Hide' : 'Show') + ' details for all rows'\">\n <i class=\"bi\" [ngClass]=\"{'bi-chevron-down': showAllDetails, 'bi-chevron-right': !showAllDetails}\" aria-hidden=\"true\"></i>\n </button>\n </th>\n <ng-template ngFor let-column [ngForOf]=\"hdr.columns\" let-c=\"index\">\n <!-- Header cell -->\n <th *ngIf=\"!column.hidden\" [ngClass]=\"column.className || ''\" [colSpan]=\"column.colspan || 1\" [rowSpan]=\"column.rowspan || 1\" scope=\"col\">\n <!-- Select all Rows Checkbox -->\n <div class=\"text-center\">\n <input *ngIf=\"column.selectColumn\" type=\"checkbox\" [checked]=\"allRowsSelected\" (change)=\"toggleAllRowsSelection()\" [attr.aria-label]=\"'Select all rows'\">\n\n <!-- Header cell text with sort capability (if specified) -->\n <span [oepaTableSorting]=\"true\" [column]=\"column\" [tableId]=\"tableId\" (sortChanged)=\"onSortChanged($event)\" [id]=\"tableId+'_SortColumnLink_'+column.id\" tabindex=\"0\" role=\"button\" [attr.aria-label]=\"'Sort by ' + column.title\">\n <span *ngIf=\"column.sort\"><i class=\"pull-left bi\" [ngClass]=\"{'bi-chevron-down': column.sort === 'desc', 'bi-chevron-up': column.sort === 'asc'}\" aria-hidden=\"true\"></i>\n <sup *ngIf=\"column?.sortIndex || 0 > 1\">{{column.sortIndex}}</sup></span>\n {{column.title}}\n </span>\n <!-- button to allow column to be hidden (if specified) -->\n <button *ngIf=\"column.hidden === false\" type=\"button\" class=\"btn-close float-end\" aria-label=\"Hide column\" (click)=\"hideColumn(column)\"\n [id]=\"tableId+'_HideColumnLink'+'_'+column.id\">\n </button>\n\n </div>\n <!-- column filter (if specified) -->\n <div *ngIf=\"((rows && rows.length > 0) || !noFilters()) && column.filterable\" >\n <input [oepaTableFiltering]=\"{ filterString: '', columnId: column.id }\" [tableId]=\"tableId\" class=\"form-control input-sm\" (tableChanged)=\"onFilterChanged($event)\"\n [id]=\"tableId+'_FilterColumn_'+column.id\" [attr.aria-label]=\"'Filter for ' + column.title\" />\n </div>\n </th>\n </ng-template>\n </tr>\n</thead>\n\n<!-- This is the table body -->\n<tbody>\n <ng-template ngFor let-row [ngForOf]=\"rows\" let-r=\"index\">\n <!-- Data Row -->\n <tr>\n <td *ngIf=\"dataHasDetails\">\n <!-- Detail icon (if specified) -->\n <span *ngIf=\"row.showDetail === true || row.showDetail === false\">\n <i *ngIf=\"row.detailIconClassName\" [ngClass]=\"row.detailIconClassName\" aria-hidden=\"true\"></i>\n <button type=\"button\" class=\"btn btn-link p-0\" (click)=\"toggleRowDetail(row)\" [id]=\"tableId+'_ShowDetailLink_'+r\" [attr.aria-pressed]=\"row.showDetail\" [attr.aria-label]=\"(row.showDetail ? 'Hide' : 'Show') + ' details for this row'\">\n <i class=\"bi\" [ngClass]=\"{'bi-chevron-down': row.showDetail, 'bi-chevron-right': !row.showDetail}\" aria-hidden=\"true\"></i>\n </button>\n </span>\n </td>\n <!-- If row is a divider, it spans the whole table -->\n <!-- <td *ngIf=\"row.isDivider\" [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\" [ngClass]=\"row.dividerClassName || 'oepa-table-gray'\">&nbsp;</td> -->\n <!-- Data Rows -->\n <ng-template *ngIf=\"!row.isDivider\" ngFor let-col [ngForOf]=\"dataColumns\" let-i=\"index\">\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0\" ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <!-- Data Cell -->\n <div *ngIf=\"!col.actionColumn && !col.selectColumn && !col.singleSelectColumn\">\n <!-- Template for popover 1 -->\n <ng-template #popoverTemplate>\n <div *ngIf=\"row.popover\">\n <cml-template [templateInfo]=\"row.popover.content\"></cml-template>\n </div>\n </ng-template>\n <!-- Popover 1 icon (if specified) -->\n <span *ngIf=\"row.popover && i === (row.popoverColumnIndex || 0) && row.popover\" tabindex=\"0\" [popoverTitle]=\"row.popover.title\" [popover]=\"popoverTemplate\"\n [containerClass]=\"row.popover.containerClass\" placement=\"right\" [triggers]=\"row.popover.trigger || 'mouseenter:mouseleave'\">\n <i [ngClass]=\"row.popover.className\" [id]=\"tableId+'_PopoverLink_'+r\"></i>\n </span>\n\n <!-- Template for popover 2 -->\n <ng-template #popover2Template>\n <div *ngIf=\"row.popover2\">\n <cml-template [templateInfo]=\"row.popover2.content\"></cml-template>\n </div>\n </ng-template>\n <!-- Popover 2 icon (if specified) -->\n <span *ngIf=\"i === (row.popover2ColumnIndex || 0) && row.popover2\" tabindex=\"0\" [popoverTitle]=\"row.popover2.title\" [popover]=\"popover2Template\"\n [containerClass]=\"row.popover2.containerClass\" placement=\"right\" [triggers]=\"row.popover2.trigger || 'mouseenter:mouseleave'\">\n <i [ngClass]=\"row.popover2.className\" [id]=\"tableId+'_Popover2Link_'+r\"></i>\n </span>\n\n <!-- Template for popover 3 -->\n <ng-template #popover3Template>\n <div *ngIf=\"row.popover3\">\n <cml-template [templateInfo]=\"row.popover3.content\"></cml-template>\n </div>\n </ng-template>\n <!-- Popover 3 icon (if specified) -->\n <span *ngIf=\"i === (row.popover3ColumnIndex || 0) && row.popover3\" tabindex=\"0\" [popoverTitle]=\"row.popover3.title\" [popover]=\"popover3Template\"\n [containerClass]=\"row.popover3.containerClass\" placement=\"right\" [triggers]=\"row.popover3.trigger || 'mouseenter:mouseleave'\">\n <i [ngClass]=\"row.popover3.className\" [id]=\"tableId+'_Popover3Link_'+r\"></i>\n </span>\n\n \n <!-- <div *ngIf=\"row|cellInnerHTML:col\" [innerHTML]=\"row|cellInnerHTML:col\"></div>\n <span *ngIf=\"!(row|cellInnerHTML:col)\">{{row|cellValue:col}}</span> -->\n\n <!-- If col is hyperlink, display data as a hyperlink -->\n <a *ngIf=\"col.hyperlink\" href=\"javascript:void(0);\" (click)=\"cellClick(row, col.id)\" [id]=\"tableId+'_CellClick_'+r+'_'+i\" tabindex=\"0\" role=\"button\" [attr.aria-label]=\"'Activate ' + (col.title || 'cell')\">\n <span *ngIf=\"!(row|cellInnerHTML:col)\">\n <i [ngClass]=\"row|cellIconClassname:col\" aria-hidden=\"true\"></i>\n <span *ngIf=\"row|cellImgSrc:col\"><img [src]=\"row|cellImgSrc:col\" alt=\"\"/></span>\n {{row|cellValue:col}}\n </span>\n <div *ngIf=\"row|cellInnerHTML:col\" [innerHTML]=\"row|cellInnerHTML:col\"></div>\n </a>\n <!-- If col is NOT hyperlink, just display data -->\n <span *ngIf=\"!col.hyperlink\">\n <span *ngIf=\"!(row|cellInnerHTML:col)\">\n <i ngClass=\"{{row|cellIconClassname:col || ''}}\" aria-hidden=\"true\"></i>\n <span *ngIf=\"row|cellImgSrc:col\"><img [src]=\"row|cellImgSrc:col\" alt=\"\"/></span>\n {{row|cellValue:col}}\n </span>\n <div *ngIf=\"row|cellInnerHTML:col\" [innerHTML]=\"row|cellInnerHTML:col\"></div>\n </span>\n </div>\n <!-- Select Cell -->\n <div *ngIf=\"col.selectColumn\" class=\"text-center\">\n <input [id]=\"tableId+'_'+r\" type=\"checkbox\" [disabled]=\"!row.selectable\" [checked]=\"row.selected\" (change)=\"toggleRowSelection(row)\" [attr.aria-label]=\"'Select row ' + (r+1)\">\n </div>\n <!-- Single Select Cell -->\n <div *ngIf=\"col.singleSelectColumn\" class=\"text-center\">\n <input [id]=\"tableId+'_singleSelect_'+r\" type=\"radio\" [disabled]=\"!row.selectable\" [checked]=\"row.selected\" (change)=\"singleRowSelection(row)\" [attr.aria-label]=\"'Select row ' + (r+1)\">\n </div>\n <!-- Action Button Cell -->\n <div *ngIf=\"col.actionColumn && row.actions\">\n <oepa-action-btn [actions]=\"row.actions\" [data]=\"row.dataSource\" (actionClicked)=\"onActionClick($event)\" [btnId]=\"tableId+'_'+r\" (dropdownOpenChange)=\"onDropdownOpenChange($event)\"></oepa-action-btn>\n </div>\n </td>\n </ng-template>\n </tr>\n\n <!-- Detail Row -->\n <tr *ngIf=\"row.showDetail\" class=\"table-info\">\n <td [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\">\n <cml-template [templateInfo]=\"row.detail\"></cml-template>\n </td>\n </tr>\n </ng-template>\n <tr *ngIf=\"totalRow\">\n <td *ngIf=\"dataHasDetails\">\n </td>\n <ng-template ngFor let-totalCol [ngForOf]=\"dataColumns\">\n <td *ngIf=\"!totalCol.hidden\" ngClass=\"{{totalRow|cellClassname:totalCol || ''}}\">\n <div>\n <span><i ngClass=\"{{totalRow|cellIconClassname:totalCol || ''}}\"></i>{{totalRow|cellValue:totalCol}}</span>\n </div>\n </td>\n </ng-template>\n </tr>\n</tbody>\n</table>\n</div>\n<!-- Table footer -->\n<form *ngIf=\"!config.hideFooter || (data && pageInfo.itemsPerPage < data.length)\" class=\"form-horizontal\">\n<div class=\"form-group row text-right\">\n <!-- Table-wide filter -->\n <div class=\"col-sm-4\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <input *ngIf=\"!config.hideGlobalFilter\" placeholder=\"Filter all columns\" [oepaTableFiltering]=\"{ filterString: '' }\" [tableId]=\"tableId\" class=\"form-control input-sm\" (tableChanged)=\"onFilterChanged($event)\"\n [id]=\"tableId+'_FilterAllColumnsInput'\" aria-label=\"Filter all columns in table\" type=\"search\" />\n </div>\n <div class=\"col-sm-6\">\n <span *ngIf=\"config.showRowCountInFooter && _data && _data.length > 0\">\n {{_data.length}}&nbsp;total rows\n </span>\n </div>\n </div>\n </div>\n <!-- Export Buttons -->\n <div class=\"col-sm-4 d-flex justify-content-center\">\n <div class=\"row\">\n <div class=\"col-sm-12 text-center\">\n <button type=\"button\" *ngIf=\"config.exportToExcel\" class=\"btn btn-primary mr-1\" (click)=\"exportToExcel()\" [id]=\"tableId+'_ExportToExcelBtn'\" aria-label=\"Export to Excel\">Export to Excel</button>\n <button type=\"button\" *ngIf=\"config.exportToHTML\" class=\"btn btn-primary mr-1\" (click)=\"exportToHTML()\" [id]=\"tableId+'_ExportToHTMLBtn'\" aria-label=\"Export to HTML\">Export to HTML</button>\n <button *ngIf=\"customBtnVisible\" type=\"button\" class=\"btn btn-primary mr-1\" (click)=\"onCustomBtnClick()\" [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled\" [attr.aria-label]=\"customBtnLabel\">{{customBtnLabel}}</button>\n </div>\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"col-sm-12 text-center\">\n <span>Export only visible data:&nbsp;\n <input type=\"checkbox\" [checked]=\"exportVisibleOnly\" (click)=\"toggleExportVisibleOnly()\" id=\"exportVisibleOnlyCheckbox\" aria-label=\"Export only visible data\"/>\n </span>\n </div>\n </div>\n </div>\n <!-- Pagination -->\n <div *ngIf=\"!config.disablePagination\" class=\"col-sm-4 d-flex justify-content-end\">\n <pagination *ngIf=\"paginationOn\" class=\"pagination-sm\" [totalItems]=\"pageInfo.length\" [itemsPerPage]=\"pageInfo.itemsPerPage\" [maxSize]=\"pageInfo.maxSize\"\n [(ngModel)]=\"currentPage\" name=\"currentTablePage\"\n [boundaryLinks]=\"true\" [rotate]=\"false\" (pageChanged)=\"onPageChanged($event)\" (numPages)=\"pageInfo.numPages = $event\"\n aria-label=\"Table pagination\">\n </pagination>\n &nbsp;\n <button (click)=\"togglePagingation()\" type=\"button\" class=\"btn btn-default btn-sm mr-1\" [attr.aria-label]=\"paginationOn ? 'Show All Rows' : 'Restore Pagination'\">{{ paginationOn ? 'Show All Rows' : 'Restore Pagination'}}</button>\n </div>\n</div>\n</form>\n<div class=\"expansion-filler\" *ngIf=\"addActionFiller && isAnyActionDropdownOpen\" [style.height.px]=\"actionFillerHeight\"></div>", styles: [".pagination{margin:0}th.oepa-table-header-center{text-align:center}.oepa-table-bold{font-weight:700}.oepa-table-italic{font-style:italic}.oepa-table-line-through{text-decoration:line-through}.oepa-table-gray{background-color:#ddd}td.oepa-undeline-cell{border-bottom:1pt solid black}.detail-indicator-col{width:30px}.action-btn-col{width:90px}.select-col{width:20px}.tall-expansion-panel .mat-expansion-panel-content{min-height:700px;padding-bottom:96px}.expansion-filler{width:100%;pointer-events:none;background:transparent}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i7.PaginationComponent, selector: "pagination", inputs: ["align", "maxSize", "boundaryLinks", "directionLinks", "firstText", "previousText", "nextText", "lastText", "rotate", "pageBtnClass", "disabled", "customPageTemplate", "customNextTemplate", "customPreviousTemplate", "customFirstTemplate", "customLastTemplate", "itemsPerPage", "totalItems"], outputs: ["numPages", "pageChanged"] }, { kind: "directive", type: i8.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: i4.OepaTemplateComponent, selector: "cml-template", inputs: ["templateInfo"] }, { kind: "component", type: i9.ActionBtnComponent, selector: "oepa-action-btn", inputs: ["label", "btnId", "data", "actions", "normalSize", "dropup"], outputs: ["dropdownOpenChange", "actionClicked"] }, { kind: "directive", type: i10.OepaTableSortingDirective, selector: "[oepaTableSorting]", inputs: ["tableId", "oepaTableSorting", "column"], outputs: ["sortChanged"] }, { kind: "directive", type: i11.OepaTableFilteringDirective, selector: "[oepaTableFiltering]", inputs: ["oepaTableFiltering", "tableId"], outputs: ["tableChanged"] }, { kind: "pipe", type: i12.OepaTableCellInnerHtmlPipe, name: "cellInnerHTML" }, { kind: "pipe", type: i13.OepaTableCellColSpanPipe, name: "cellColspan" }, { kind: "pipe", type: i14.OepaTableCellValuePipe, name: "cellValue" }, { kind: "pipe", type: i15.OepaTableCellClassnamePipe, name: "cellClassname" }, { kind: "pipe", type: i16.OepaTableCellIconClassnamePipe, name: "cellIconClassname" }, { kind: "pipe", type: i17.OepaTableCellImgSrcPipe, name: "cellImgSrc" }] });
781
807
  }
782
808
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableComponent, decorators: [{
783
809
  type: Component,
784
- args: [{ selector: 'oepa-table', template: "<!-- Unhide select input - only visible if one or more columns are hidden -->\n\n<form *ngIf=\"hiddenColumns.length > 0\" aria-label=\"Show hidden columns\">\n <div class=\"row mb-2\">\n <label class=\"col-sm-2 col-form-label\" [for]=\"tableId+'_UnhideColumnSelect'\">Show Hidden Columns:</label>\n <div class=\"col-sm-4\">\n <select class=\"form-select\" (change)=\"unhideColumn($any($event).target.value)\" [id]=\"tableId+'_UnhideColumnSelect'\" aria-label=\"Select column to unhide\">\n <option value=\"\">Choose a column</option>\n <option *ngFor=\"let col of hiddenColumns\" [value]=\"col.id\">{{col.title}}</option>\n </select>\n </div>\n </div>\n</form>\n<!-- This is the table -->\n<div [ngClass]=\"config.divClassName || ''\">\n<table *ngIf=\"!config.hideTable\" class=\"table dataTable\" [ngClass]=\"config.className || ''\" role=\"table\" style=\"width: 100%;\" aria-label=\"Data table\">\n\n<!-- This is the table header -->\n<thead>\n <!-- There may be multiple header rows -->\n <tr *ngFor=\"let hdr of headerRows; let hr=index;\" role=\"row\">\n <!-- Details indicator column (if data has details) -->\n <th *ngIf=\"dataHasDetails && hr === 0\" [rowSpan]=\"headerRows.length\" class=\"detail-indicator-col\" scope=\"col\">\n <span class=\"sr-only\">Row details</span>\n <button type=\"button\" class=\"btn btn-link p-0\" (click)=\"toggleAllDetails()\" [id]=\"tableId+'_ShowAllDetailsLink'\" [attr.aria-pressed]=\"showAllDetails\" [attr.aria-label]=\"(showAllDetails ? 'Hide' : 'Show') + ' details for all rows'\">\n <i class=\"bi\" [ngClass]=\"{'bi-chevron-down': showAllDetails, 'bi-chevron-right': !showAllDetails}\" aria-hidden=\"true\"></i>\n </button>\n </th>\n <ng-template ngFor let-column [ngForOf]=\"hdr.columns\" let-c=\"index\">\n <!-- Header cell -->\n <th *ngIf=\"!column.hidden\" [ngClass]=\"column.className || ''\" [colSpan]=\"column.colspan || 1\" [rowSpan]=\"column.rowspan || 1\" scope=\"col\">\n <!-- Select all Rows Checkbox -->\n <div class=\"text-center\">\n <input *ngIf=\"column.selectColumn\" type=\"checkbox\" [checked]=\"allRowsSelected\" (change)=\"toggleAllRowsSelection()\" [attr.aria-label]=\"'Select all rows'\">\n\n <!-- Header cell text with sort capability (if specified) -->\n <span [oepaTableSorting]=\"true\" [column]=\"column\" [tableId]=\"tableId\" (sortChanged)=\"onSortChanged($event)\" [id]=\"tableId+'_SortColumnLink_'+column.id\" tabindex=\"0\" role=\"button\" [attr.aria-label]=\"'Sort by ' + column.title\">\n <span *ngIf=\"column.sort\"><i class=\"pull-left bi\" [ngClass]=\"{'bi-chevron-down': column.sort === 'desc', 'bi-chevron-up': column.sort === 'asc'}\" aria-hidden=\"true\"></i>\n <sup *ngIf=\"column?.sortIndex || 0 > 1\">{{column.sortIndex}}</sup></span>\n {{column.title}}\n </span>\n <!-- button to allow column to be hidden (if specified) -->\n <button *ngIf=\"column.hidden === false\" type=\"button\" class=\"btn-close float-end\" aria-label=\"Hide column\" (click)=\"hideColumn(column)\"\n [id]=\"tableId+'_HideColumnLink'+'_'+column.id\">\n </button>\n\n </div>\n <!-- column filter (if specified) -->\n <div *ngIf=\"((rows && rows.length > 0) || !noFilters()) && column.filterable\" >\n <input [oepaTableFiltering]=\"{ filterString: '', columnId: column.id }\" [tableId]=\"tableId\" class=\"form-control input-sm\" (tableChanged)=\"onFilterChanged($event)\"\n [id]=\"tableId+'_FilterColumn_'+column.id\" [attr.aria-label]=\"'Filter for ' + column.title\" />\n </div>\n </th>\n </ng-template>\n </tr>\n</thead>\n\n<!-- This is the table body -->\n<tbody>\n <ng-template ngFor let-row [ngForOf]=\"rows\" let-r=\"index\">\n <!-- Data Row -->\n <tr>\n <td *ngIf=\"dataHasDetails\">\n <!-- Detail icon (if specified) -->\n <span *ngIf=\"row.showDetail === true || row.showDetail === false\">\n <i *ngIf=\"row.detailIconClassName\" [ngClass]=\"row.detailIconClassName\" aria-hidden=\"true\"></i>\n <button type=\"button\" class=\"btn btn-link p-0\" (click)=\"toggleRowDetail(row)\" [id]=\"tableId+'_ShowDetailLink_'+r\" [attr.aria-pressed]=\"row.showDetail\" [attr.aria-label]=\"(row.showDetail ? 'Hide' : 'Show') + ' details for this row'\">\n <i class=\"bi\" [ngClass]=\"{'bi-chevron-down': row.showDetail, 'bi-chevron-right': !row.showDetail}\" aria-hidden=\"true\"></i>\n </button>\n </span>\n </td>\n <!-- If row is a divider, it spans the whole table -->\n <!-- <td *ngIf=\"row.isDivider\" [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\" [ngClass]=\"row.dividerClassName || 'oepa-table-gray'\">&nbsp;</td> -->\n <!-- Data Rows -->\n <ng-template *ngIf=\"!row.isDivider\" ngFor let-col [ngForOf]=\"dataColumns\" let-i=\"index\">\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0\" ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <!-- Data Cell -->\n <div *ngIf=\"!col.actionColumn && !col.selectColumn && !col.singleSelectColumn\">\n <!-- Template for popover 1 -->\n <ng-template #popoverTemplate>\n <div *ngIf=\"row.popover\">\n <cml-template [templateInfo]=\"row.popover.content\"></cml-template>\n </div>\n </ng-template>\n <!-- Popover 1 icon (if specified) -->\n <span *ngIf=\"row.popover && i === (row.popoverColumnIndex || 0) && row.popover\" tabindex=\"0\" [popoverTitle]=\"row.popover.title\" [popover]=\"popoverTemplate\"\n [containerClass]=\"row.popover.containerClass\" placement=\"right\" [triggers]=\"row.popover.trigger || 'mouseenter:mouseleave'\">\n <i [ngClass]=\"row.popover.className\" [id]=\"tableId+'_PopoverLink_'+r\"></i>\n </span>\n\n <!-- Template for popover 2 -->\n <ng-template #popover2Template>\n <div *ngIf=\"row.popover2\">\n <cml-template [templateInfo]=\"row.popover2.content\"></cml-template>\n </div>\n </ng-template>\n <!-- Popover 2 icon (if specified) -->\n <span *ngIf=\"i === (row.popover2ColumnIndex || 0) && row.popover2\" tabindex=\"0\" [popoverTitle]=\"row.popover2.title\" [popover]=\"popover2Template\"\n [containerClass]=\"row.popover2.containerClass\" placement=\"right\" [triggers]=\"row.popover2.trigger || 'mouseenter:mouseleave'\">\n <i [ngClass]=\"row.popover2.className\" [id]=\"tableId+'_Popover2Link_'+r\"></i>\n </span>\n\n <!-- Template for popover 3 -->\n <ng-template #popover3Template>\n <div *ngIf=\"row.popover3\">\n <cml-template [templateInfo]=\"row.popover3.content\"></cml-template>\n </div>\n </ng-template>\n <!-- Popover 3 icon (if specified) -->\n <span *ngIf=\"i === (row.popover3ColumnIndex || 0) && row.popover3\" tabindex=\"0\" [popoverTitle]=\"row.popover3.title\" [popover]=\"popover3Template\"\n [containerClass]=\"row.popover3.containerClass\" placement=\"right\" [triggers]=\"row.popover3.trigger || 'mouseenter:mouseleave'\">\n <i [ngClass]=\"row.popover3.className\" [id]=\"tableId+'_Popover3Link_'+r\"></i>\n </span>\n\n \n <!-- <div *ngIf=\"row|cellInnerHTML:col\" [innerHTML]=\"row|cellInnerHTML:col\"></div>\n <span *ngIf=\"!(row|cellInnerHTML:col)\">{{row|cellValue:col}}</span> -->\n\n <!-- If col is hyperlink, display data as a hyperlink -->\n <a *ngIf=\"col.hyperlink\" href=\"javascript:void(0);\" (click)=\"cellClick(row, col.id)\" [id]=\"tableId+'_CellClick_'+r+'_'+i\" tabindex=\"0\" role=\"button\" [attr.aria-label]=\"'Activate ' + (col.title || 'cell')\">\n <span *ngIf=\"!(row|cellInnerHTML:col)\">\n <i [ngClass]=\"row|cellIconClassname:col\" aria-hidden=\"true\"></i>\n <span *ngIf=\"row|cellImgSrc:col\"><img [src]=\"row|cellImgSrc:col\" alt=\"\"/></span>\n {{row|cellValue:col}}\n </span>\n <div *ngIf=\"row|cellInnerHTML:col\" [innerHTML]=\"row|cellInnerHTML:col\"></div>\n </a>\n <!-- If col is NOT hyperlink, just display data -->\n <span *ngIf=\"!col.hyperlink\">\n <span *ngIf=\"!(row|cellInnerHTML:col)\">\n <i ngClass=\"{{row|cellIconClassname:col || ''}}\" aria-hidden=\"true\"></i>\n <span *ngIf=\"row|cellImgSrc:col\"><img [src]=\"row|cellImgSrc:col\" alt=\"\"/></span>\n {{row|cellValue:col}}\n </span>\n <div *ngIf=\"row|cellInnerHTML:col\" [innerHTML]=\"row|cellInnerHTML:col\"></div>\n </span>\n </div>\n <!-- Select Cell -->\n <div *ngIf=\"col.selectColumn\" class=\"text-center\">\n <input [id]=\"tableId+'_'+r\" type=\"checkbox\" [disabled]=\"!row.selectable\" [checked]=\"row.selected\" (change)=\"toggleRowSelection(row)\" [attr.aria-label]=\"'Select row ' + (r+1)\">\n </div>\n <!-- Single Select Cell -->\n <div *ngIf=\"col.singleSelectColumn\" class=\"text-center\">\n <input [id]=\"tableId+'_singleSelect_'+r\" type=\"radio\" [disabled]=\"!row.selectable\" [checked]=\"row.selected\" (change)=\"singleRowSelection(row)\" [attr.aria-label]=\"'Select row ' + (r+1)\">\n </div>\n <!-- Action Button Cell -->\n <div *ngIf=\"col.actionColumn && row.actions\">\n <oepa-action-btn [actions]=\"row.actions\" [data]=\"row.dataSource\" (actionClicked)=\"onActionClick($event)\" [btnId]=\"tableId+'_'+r\" (dropdownOpenChange)=\"onDropdownOpenChange($event)\"></oepa-action-btn>\n </div>\n </td>\n </ng-template>\n </tr>\n\n <!-- Detail Row -->\n <tr *ngIf=\"row.showDetail\" class=\"table-info\">\n <td [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\">\n <cml-template [templateInfo]=\"row.detail\"></cml-template>\n </td>\n </tr>\n </ng-template>\n <tr *ngIf=\"totalRow\">\n <td *ngIf=\"dataHasDetails\">\n </td>\n <ng-template ngFor let-totalCol [ngForOf]=\"dataColumns\">\n <td *ngIf=\"!totalCol.hidden\" ngClass=\"{{totalRow|cellClassname:totalCol || ''}}\">\n <div>\n <span><i ngClass=\"{{totalRow|cellIconClassname:totalCol || ''}}\"></i>{{totalRow|cellValue:totalCol}}</span>\n </div>\n </td>\n </ng-template>\n </tr>\n</tbody>\n</table>\n</div>\n<!-- Table footer -->\n<form *ngIf=\"!config.hideFooter || (data && pageInfo.itemsPerPage < data.length)\" class=\"form-horizontal\">\n<div class=\"form-group row text-right\">\n <!-- Table-wide filter -->\n <div class=\"col-sm-4\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <input *ngIf=\"!config.hideGlobalFilter\" placeholder=\"Filter all columns\" [oepaTableFiltering]=\"{ filterString: '' }\" [tableId]=\"tableId\" class=\"form-control input-sm\" (tableChanged)=\"onFilterChanged($event)\"\n [id]=\"tableId+'_FilterAllColumnsInput'\" aria-label=\"Filter all columns in table\" type=\"search\" />\n </div>\n <div class=\"col-sm-6\">\n <span *ngIf=\"config.showRowCountInFooter && _data && _data.length > 0\">\n {{_data.length}}&nbsp;total rows\n </span>\n </div>\n </div>\n </div>\n <!-- Export Buttons -->\n <div class=\"col-sm-4 d-flex justify-content-center\">\n <div class=\"row\">\n <div class=\"col-sm-12 text-center\">\n <button type=\"button\" *ngIf=\"config.exportToExcel\" class=\"btn btn-primary mr-1\" (click)=\"exportToExcel()\" [id]=\"tableId+'_ExportToExcelBtn'\" aria-label=\"Export to Excel\">Export to Excel</button>\n <button type=\"button\" *ngIf=\"config.exportToHTML\" class=\"btn btn-primary mr-1\" (click)=\"exportToHTML()\" [id]=\"tableId+'_ExportToHTMLBtn'\" aria-label=\"Export to HTML\">Export to HTML</button>\n <button *ngIf=\"customBtnVisible\" type=\"button\" class=\"btn btn-primary mr-1\" (click)=\"onCustomBtnClick()\" [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled\" [attr.aria-label]=\"customBtnLabel\">{{customBtnLabel}}</button>\n </div>\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"col-sm-12 text-center\">\n <span>Export only visible data:&nbsp;\n <input type=\"checkbox\" [checked]=\"exportVisibleOnly\" (click)=\"toggleExportVisibleOnly()\" id=\"exportVisibleOnlyCheckbox\" aria-label=\"Export only visible data\"/>\n </span>\n </div>\n </div>\n </div>\n <!-- Pagination -->\n <div *ngIf=\"!config.disablePagination\" class=\"col-sm-4 d-flex justify-content-end\">\n <pagination *ngIf=\"paginationOn\" class=\"pagination-sm\" [totalItems]=\"pageInfo.length\" [itemsPerPage]=\"pageInfo.itemsPerPage\" [maxSize]=\"pageInfo.maxSize\"\n [(ngModel)]=\"currentPage\" name=\"currentTablePage\"\n [boundaryLinks]=\"true\" [rotate]=\"false\" (pageChanged)=\"onPageChanged($event)\" (numPages)=\"pageInfo.numPages = $event\"\n aria-label=\"Table pagination\">\n </pagination>\n &nbsp;\n <button (click)=\"togglePagingation()\" type=\"button\" class=\"btn btn-default btn-sm mr-1\" [attr.aria-label]=\"paginationOn ? 'Show All Rows' : 'Restore Pagination'\">{{ paginationOn ? 'Show All Rows' : 'Restore Pagination'}}</button>\n </div>\n</div>\n</form>", styles: [".pagination{margin:0}th.oepa-table-header-center{text-align:center}.oepa-table-bold{font-weight:700}.oepa-table-italic{font-style:italic}.oepa-table-line-through{text-decoration:line-through}.oepa-table-gray{background-color:#ddd}td.oepa-undeline-cell{border-bottom:1pt solid black}.detail-indicator-col{width:30px}.action-btn-col{width:90px}.select-col{width:20px}\n"] }]
785
- }], ctorParameters: () => [{ type: i1.DomSanitizer }, { type: i2.TableService }, { type: i3.TableExportService }, { type: i4.OepaFileUtilService }], propDecorators: { actionDropdownOpenChange: [{
786
- type: Output
787
- }], tableId: [{
810
+ args: [{ selector: 'oepa-table', template: "<!-- Unhide select input - only visible if one or more columns are hidden -->\n\n<form *ngIf=\"hiddenColumns.length > 0\" aria-label=\"Show hidden columns\">\n <div class=\"row mb-2\">\n <label class=\"col-sm-2 col-form-label\" [for]=\"tableId+'_UnhideColumnSelect'\">Show Hidden Columns:</label>\n <div class=\"col-sm-4\">\n <select class=\"form-select\" (change)=\"unhideColumn($any($event).target.value)\" [id]=\"tableId+'_UnhideColumnSelect'\" aria-label=\"Select column to unhide\">\n <option value=\"\">Choose a column</option>\n <option *ngFor=\"let col of hiddenColumns\" [value]=\"col.id\">{{col.title}}</option>\n </select>\n </div>\n </div>\n</form>\n<!-- This is the table -->\n<div [ngClass]=\"config.divClassName || ''\">\n<table *ngIf=\"!config.hideTable\" class=\"table dataTable\" [ngClass]=\"config.className || ''\" role=\"table\" style=\"width: 100%;\" aria-label=\"Data table\">\n\n<!-- This is the table header -->\n<thead>\n <!-- There may be multiple header rows -->\n <tr *ngFor=\"let hdr of headerRows; let hr=index;\" role=\"row\">\n <!-- Details indicator column (if data has details) -->\n <th *ngIf=\"dataHasDetails && hr === 0\" [rowSpan]=\"headerRows.length\" class=\"detail-indicator-col\" scope=\"col\">\n <span class=\"sr-only\">Row details</span>\n <button type=\"button\" class=\"btn btn-link p-0\" (click)=\"toggleAllDetails()\" [id]=\"tableId+'_ShowAllDetailsLink'\" [attr.aria-pressed]=\"showAllDetails\" [attr.aria-label]=\"(showAllDetails ? 'Hide' : 'Show') + ' details for all rows'\">\n <i class=\"bi\" [ngClass]=\"{'bi-chevron-down': showAllDetails, 'bi-chevron-right': !showAllDetails}\" aria-hidden=\"true\"></i>\n </button>\n </th>\n <ng-template ngFor let-column [ngForOf]=\"hdr.columns\" let-c=\"index\">\n <!-- Header cell -->\n <th *ngIf=\"!column.hidden\" [ngClass]=\"column.className || ''\" [colSpan]=\"column.colspan || 1\" [rowSpan]=\"column.rowspan || 1\" scope=\"col\">\n <!-- Select all Rows Checkbox -->\n <div class=\"text-center\">\n <input *ngIf=\"column.selectColumn\" type=\"checkbox\" [checked]=\"allRowsSelected\" (change)=\"toggleAllRowsSelection()\" [attr.aria-label]=\"'Select all rows'\">\n\n <!-- Header cell text with sort capability (if specified) -->\n <span [oepaTableSorting]=\"true\" [column]=\"column\" [tableId]=\"tableId\" (sortChanged)=\"onSortChanged($event)\" [id]=\"tableId+'_SortColumnLink_'+column.id\" tabindex=\"0\" role=\"button\" [attr.aria-label]=\"'Sort by ' + column.title\">\n <span *ngIf=\"column.sort\"><i class=\"pull-left bi\" [ngClass]=\"{'bi-chevron-down': column.sort === 'desc', 'bi-chevron-up': column.sort === 'asc'}\" aria-hidden=\"true\"></i>\n <sup *ngIf=\"column?.sortIndex || 0 > 1\">{{column.sortIndex}}</sup></span>\n {{column.title}}\n </span>\n <!-- button to allow column to be hidden (if specified) -->\n <button *ngIf=\"column.hidden === false\" type=\"button\" class=\"btn-close float-end\" aria-label=\"Hide column\" (click)=\"hideColumn(column)\"\n [id]=\"tableId+'_HideColumnLink'+'_'+column.id\">\n </button>\n\n </div>\n <!-- column filter (if specified) -->\n <div *ngIf=\"((rows && rows.length > 0) || !noFilters()) && column.filterable\" >\n <input [oepaTableFiltering]=\"{ filterString: '', columnId: column.id }\" [tableId]=\"tableId\" class=\"form-control input-sm\" (tableChanged)=\"onFilterChanged($event)\"\n [id]=\"tableId+'_FilterColumn_'+column.id\" [attr.aria-label]=\"'Filter for ' + column.title\" />\n </div>\n </th>\n </ng-template>\n </tr>\n</thead>\n\n<!-- This is the table body -->\n<tbody>\n <ng-template ngFor let-row [ngForOf]=\"rows\" let-r=\"index\">\n <!-- Data Row -->\n <tr>\n <td *ngIf=\"dataHasDetails\">\n <!-- Detail icon (if specified) -->\n <span *ngIf=\"row.showDetail === true || row.showDetail === false\">\n <i *ngIf=\"row.detailIconClassName\" [ngClass]=\"row.detailIconClassName\" aria-hidden=\"true\"></i>\n <button type=\"button\" class=\"btn btn-link p-0\" (click)=\"toggleRowDetail(row)\" [id]=\"tableId+'_ShowDetailLink_'+r\" [attr.aria-pressed]=\"row.showDetail\" [attr.aria-label]=\"(row.showDetail ? 'Hide' : 'Show') + ' details for this row'\">\n <i class=\"bi\" [ngClass]=\"{'bi-chevron-down': row.showDetail, 'bi-chevron-right': !row.showDetail}\" aria-hidden=\"true\"></i>\n </button>\n </span>\n </td>\n <!-- If row is a divider, it spans the whole table -->\n <!-- <td *ngIf=\"row.isDivider\" [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\" [ngClass]=\"row.dividerClassName || 'oepa-table-gray'\">&nbsp;</td> -->\n <!-- Data Rows -->\n <ng-template *ngIf=\"!row.isDivider\" ngFor let-col [ngForOf]=\"dataColumns\" let-i=\"index\">\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0\" ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <!-- Data Cell -->\n <div *ngIf=\"!col.actionColumn && !col.selectColumn && !col.singleSelectColumn\">\n <!-- Template for popover 1 -->\n <ng-template #popoverTemplate>\n <div *ngIf=\"row.popover\">\n <cml-template [templateInfo]=\"row.popover.content\"></cml-template>\n </div>\n </ng-template>\n <!-- Popover 1 icon (if specified) -->\n <span *ngIf=\"row.popover && i === (row.popoverColumnIndex || 0) && row.popover\" tabindex=\"0\" [popoverTitle]=\"row.popover.title\" [popover]=\"popoverTemplate\"\n [containerClass]=\"row.popover.containerClass\" placement=\"right\" [triggers]=\"row.popover.trigger || 'mouseenter:mouseleave'\">\n <i [ngClass]=\"row.popover.className\" [id]=\"tableId+'_PopoverLink_'+r\"></i>\n </span>\n\n <!-- Template for popover 2 -->\n <ng-template #popover2Template>\n <div *ngIf=\"row.popover2\">\n <cml-template [templateInfo]=\"row.popover2.content\"></cml-template>\n </div>\n </ng-template>\n <!-- Popover 2 icon (if specified) -->\n <span *ngIf=\"i === (row.popover2ColumnIndex || 0) && row.popover2\" tabindex=\"0\" [popoverTitle]=\"row.popover2.title\" [popover]=\"popover2Template\"\n [containerClass]=\"row.popover2.containerClass\" placement=\"right\" [triggers]=\"row.popover2.trigger || 'mouseenter:mouseleave'\">\n <i [ngClass]=\"row.popover2.className\" [id]=\"tableId+'_Popover2Link_'+r\"></i>\n </span>\n\n <!-- Template for popover 3 -->\n <ng-template #popover3Template>\n <div *ngIf=\"row.popover3\">\n <cml-template [templateInfo]=\"row.popover3.content\"></cml-template>\n </div>\n </ng-template>\n <!-- Popover 3 icon (if specified) -->\n <span *ngIf=\"i === (row.popover3ColumnIndex || 0) && row.popover3\" tabindex=\"0\" [popoverTitle]=\"row.popover3.title\" [popover]=\"popover3Template\"\n [containerClass]=\"row.popover3.containerClass\" placement=\"right\" [triggers]=\"row.popover3.trigger || 'mouseenter:mouseleave'\">\n <i [ngClass]=\"row.popover3.className\" [id]=\"tableId+'_Popover3Link_'+r\"></i>\n </span>\n\n \n <!-- <div *ngIf=\"row|cellInnerHTML:col\" [innerHTML]=\"row|cellInnerHTML:col\"></div>\n <span *ngIf=\"!(row|cellInnerHTML:col)\">{{row|cellValue:col}}</span> -->\n\n <!-- If col is hyperlink, display data as a hyperlink -->\n <a *ngIf=\"col.hyperlink\" href=\"javascript:void(0);\" (click)=\"cellClick(row, col.id)\" [id]=\"tableId+'_CellClick_'+r+'_'+i\" tabindex=\"0\" role=\"button\" [attr.aria-label]=\"'Activate ' + (col.title || 'cell')\">\n <span *ngIf=\"!(row|cellInnerHTML:col)\">\n <i [ngClass]=\"row|cellIconClassname:col\" aria-hidden=\"true\"></i>\n <span *ngIf=\"row|cellImgSrc:col\"><img [src]=\"row|cellImgSrc:col\" alt=\"\"/></span>\n {{row|cellValue:col}}\n </span>\n <div *ngIf=\"row|cellInnerHTML:col\" [innerHTML]=\"row|cellInnerHTML:col\"></div>\n </a>\n <!-- If col is NOT hyperlink, just display data -->\n <span *ngIf=\"!col.hyperlink\">\n <span *ngIf=\"!(row|cellInnerHTML:col)\">\n <i ngClass=\"{{row|cellIconClassname:col || ''}}\" aria-hidden=\"true\"></i>\n <span *ngIf=\"row|cellImgSrc:col\"><img [src]=\"row|cellImgSrc:col\" alt=\"\"/></span>\n {{row|cellValue:col}}\n </span>\n <div *ngIf=\"row|cellInnerHTML:col\" [innerHTML]=\"row|cellInnerHTML:col\"></div>\n </span>\n </div>\n <!-- Select Cell -->\n <div *ngIf=\"col.selectColumn\" class=\"text-center\">\n <input [id]=\"tableId+'_'+r\" type=\"checkbox\" [disabled]=\"!row.selectable\" [checked]=\"row.selected\" (change)=\"toggleRowSelection(row)\" [attr.aria-label]=\"'Select row ' + (r+1)\">\n </div>\n <!-- Single Select Cell -->\n <div *ngIf=\"col.singleSelectColumn\" class=\"text-center\">\n <input [id]=\"tableId+'_singleSelect_'+r\" type=\"radio\" [disabled]=\"!row.selectable\" [checked]=\"row.selected\" (change)=\"singleRowSelection(row)\" [attr.aria-label]=\"'Select row ' + (r+1)\">\n </div>\n <!-- Action Button Cell -->\n <div *ngIf=\"col.actionColumn && row.actions\">\n <oepa-action-btn [actions]=\"row.actions\" [data]=\"row.dataSource\" (actionClicked)=\"onActionClick($event)\" [btnId]=\"tableId+'_'+r\" (dropdownOpenChange)=\"onDropdownOpenChange($event)\"></oepa-action-btn>\n </div>\n </td>\n </ng-template>\n </tr>\n\n <!-- Detail Row -->\n <tr *ngIf=\"row.showDetail\" class=\"table-info\">\n <td [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\">\n <cml-template [templateInfo]=\"row.detail\"></cml-template>\n </td>\n </tr>\n </ng-template>\n <tr *ngIf=\"totalRow\">\n <td *ngIf=\"dataHasDetails\">\n </td>\n <ng-template ngFor let-totalCol [ngForOf]=\"dataColumns\">\n <td *ngIf=\"!totalCol.hidden\" ngClass=\"{{totalRow|cellClassname:totalCol || ''}}\">\n <div>\n <span><i ngClass=\"{{totalRow|cellIconClassname:totalCol || ''}}\"></i>{{totalRow|cellValue:totalCol}}</span>\n </div>\n </td>\n </ng-template>\n </tr>\n</tbody>\n</table>\n</div>\n<!-- Table footer -->\n<form *ngIf=\"!config.hideFooter || (data && pageInfo.itemsPerPage < data.length)\" class=\"form-horizontal\">\n<div class=\"form-group row text-right\">\n <!-- Table-wide filter -->\n <div class=\"col-sm-4\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <input *ngIf=\"!config.hideGlobalFilter\" placeholder=\"Filter all columns\" [oepaTableFiltering]=\"{ filterString: '' }\" [tableId]=\"tableId\" class=\"form-control input-sm\" (tableChanged)=\"onFilterChanged($event)\"\n [id]=\"tableId+'_FilterAllColumnsInput'\" aria-label=\"Filter all columns in table\" type=\"search\" />\n </div>\n <div class=\"col-sm-6\">\n <span *ngIf=\"config.showRowCountInFooter && _data && _data.length > 0\">\n {{_data.length}}&nbsp;total rows\n </span>\n </div>\n </div>\n </div>\n <!-- Export Buttons -->\n <div class=\"col-sm-4 d-flex justify-content-center\">\n <div class=\"row\">\n <div class=\"col-sm-12 text-center\">\n <button type=\"button\" *ngIf=\"config.exportToExcel\" class=\"btn btn-primary mr-1\" (click)=\"exportToExcel()\" [id]=\"tableId+'_ExportToExcelBtn'\" aria-label=\"Export to Excel\">Export to Excel</button>\n <button type=\"button\" *ngIf=\"config.exportToHTML\" class=\"btn btn-primary mr-1\" (click)=\"exportToHTML()\" [id]=\"tableId+'_ExportToHTMLBtn'\" aria-label=\"Export to HTML\">Export to HTML</button>\n <button *ngIf=\"customBtnVisible\" type=\"button\" class=\"btn btn-primary mr-1\" (click)=\"onCustomBtnClick()\" [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled\" [attr.aria-label]=\"customBtnLabel\">{{customBtnLabel}}</button>\n </div>\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"col-sm-12 text-center\">\n <span>Export only visible data:&nbsp;\n <input type=\"checkbox\" [checked]=\"exportVisibleOnly\" (click)=\"toggleExportVisibleOnly()\" id=\"exportVisibleOnlyCheckbox\" aria-label=\"Export only visible data\"/>\n </span>\n </div>\n </div>\n </div>\n <!-- Pagination -->\n <div *ngIf=\"!config.disablePagination\" class=\"col-sm-4 d-flex justify-content-end\">\n <pagination *ngIf=\"paginationOn\" class=\"pagination-sm\" [totalItems]=\"pageInfo.length\" [itemsPerPage]=\"pageInfo.itemsPerPage\" [maxSize]=\"pageInfo.maxSize\"\n [(ngModel)]=\"currentPage\" name=\"currentTablePage\"\n [boundaryLinks]=\"true\" [rotate]=\"false\" (pageChanged)=\"onPageChanged($event)\" (numPages)=\"pageInfo.numPages = $event\"\n aria-label=\"Table pagination\">\n </pagination>\n &nbsp;\n <button (click)=\"togglePagingation()\" type=\"button\" class=\"btn btn-default btn-sm mr-1\" [attr.aria-label]=\"paginationOn ? 'Show All Rows' : 'Restore Pagination'\">{{ paginationOn ? 'Show All Rows' : 'Restore Pagination'}}</button>\n </div>\n</div>\n</form>\n<div class=\"expansion-filler\" *ngIf=\"addActionFiller && isAnyActionDropdownOpen\" [style.height.px]=\"actionFillerHeight\"></div>", styles: [".pagination{margin:0}th.oepa-table-header-center{text-align:center}.oepa-table-bold{font-weight:700}.oepa-table-italic{font-style:italic}.oepa-table-line-through{text-decoration:line-through}.oepa-table-gray{background-color:#ddd}td.oepa-undeline-cell{border-bottom:1pt solid black}.detail-indicator-col{width:30px}.action-btn-col{width:90px}.select-col{width:20px}.tall-expansion-panel .mat-expansion-panel-content{min-height:700px;padding-bottom:96px}.expansion-filler{width:100%;pointer-events:none;background:transparent}\n"] }]
811
+ }], ctorParameters: () => [{ type: i1.DomSanitizer }, { type: i0.ElementRef }, { type: i2.TableService }, { type: i3.TableExportService }, { type: i4.OepaFileUtilService }], propDecorators: { tableId: [{
812
+ type: Input
813
+ }], addActionFiller: [{
788
814
  type: Input
789
815
  }], config: [{
790
816
  type: Input
@@ -811,4 +837,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
811
837
  }], totalRow: [{
812
838
  type: Input
813
839
  }] } });
814
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2VwYS11aS1saWIvc3JjL2xpYi90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyQi9FLE1BQU0sT0FBTyxjQUFjO0lBcUpFO0lBQ2pCO0lBQ0E7SUFDQTtJQXZKSCxhQUFhLEdBQVksS0FBSyxDQUFDO0lBQy9CLFVBQVUsR0FBMkIsRUFBRSxDQUFDO0lBQ3hDLElBQUksR0FBd0IsRUFBRSxDQUFDO0lBQy9CLGtCQUFrQixHQUFHLENBQUMsQ0FBQztJQUN2QixjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLGlCQUFpQixHQUF3QixLQUFLLENBQUM7SUFFdEQsMENBQTBDO0lBQ25DLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUM3Qix3QkFBd0IsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBRTFELFdBQVcsR0FBMkIsRUFBRSxDQUFDO0lBQ3pDLGFBQWEsR0FBMkIsRUFBRSxDQUFDO0lBQzNDLGFBQWEsR0FBa0IsRUFBRSxDQUFDO0lBQ2xDLEtBQUssR0FBd0IsRUFBRSxDQUFDO0lBQy9CLE9BQU8sR0FBb0IsRUFBRSxDQUFDO0lBQzlCLGNBQWMsR0FBMkIsQ0FBQztZQUNoRCxZQUFZLEVBQUUsRUFBRTtZQUNoQixRQUFRLEVBQUUsU0FBUztTQUNwQixDQUFDLENBQUM7SUFFSSxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFFdkIsZUFBZSxHQUFHLEtBQUssQ0FB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U0FBUzsrQkFDRSxZQUFZOytLQWNaLHdCQUF3QjtzQkFBakMsTUFBTTtnQkEyQkUsT0FBTztzQkFBZixLQUFLO2dCQUdLLE1BQU07c0JBRGhCLEtBQUs7Z0JBb0JLLGFBQWE7c0JBRHZCLEtBQUs7Z0JBY0ssTUFBTTtzQkFEaEIsS0FBSztnQkFXRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR1csV0FBVztzQkFBM0IsTUFBTTtnQkFDVSxhQUFhO3NCQUE3QixNQUFNO2dCQUNVLFdBQVc7c0JBQTNCLE1BQU07Z0JBQ1UsZ0JBQWdCO3NCQUFoQyxNQUFNO2dCQW1DSSxJQUFJO3NCQURkLEtBQUs7Z0JBdUJHLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmltcG9ydCB7IE9lcGFUYWJsZSB9IGZyb20gJy4vb2VwYS10YWJsZSc7XG5pbXBvcnQgeyBPZXBhVGFibGVDb25maWcgfSBmcm9tICcuL29lcGEtdGFibGUtY29uZmlnJztcbmltcG9ydCB7IE9lcGFUYWJsZUhlYWRlciB9IGZyb20gJy4vb2VwYS10YWJsZS1oZWFkZXInO1xuaW1wb3J0IHsgT2VwYVRhYmxlQ29sdW1uIH0gZnJvbSAnLi9vZXBhLXRhYmxlLWNvbHVtbic7XG5pbXBvcnQgeyBPZXBhVGFibGVSb3cgfSBmcm9tICcuL29lcGEtdGFibGUtcm93JztcbmltcG9ydCB7IE9lcGFUYWJsZUNlbGwgfSBmcm9tICcuL29lcGEtdGFibGUtY2VsbCc7XG5pbXBvcnQgeyBPZXBhVGFibGVGaWx0ZXIgfSBmcm9tICcuL29lcGEtdGFibGUtZmlsdGVyJztcbmltcG9ydCB7IE9lcGFUYWJsZVBhZ2VJbmZvIH0gZnJvbSAnLi9vZXBhLXRhYmxlLXBhZ2UtaW5mbyc7XG5pbXBvcnQgeyBPZXBhVGFibGVDZWxsQ2xpY2tFdmVudCB9IGZyb20gJy4vb2VwYS10YWJsZS1jZWxsLWNsaWNrLWV2ZW50JztcblxuaW1wb3J0IHsgT2VwYUFjdGlvbkV2ZW50IH0gZnJvbSAnLi4vYWN0aW9uLWJ0bi9vZXBhLWFjdGlvbi1ldmVudCc7XG5cbmltcG9ydCB7IFRhYmxlRXhwb3J0U2VydmljZSB9IGZyb20gJy4vdGFibGUtZXhwb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgT2VwYVRlbXBsYXRlSW5mbyB9IGZyb20gJ0BvaGlvZXBhL29lcGEtY29tbW9uLWxpYic7XG5pbXBvcnQgeyBUYWJsZVNlcnZpY2UgfSBmcm9tICcuL3RhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2VwYVRhYmxlU29ydENyaXRlcmlvbiB9IGZyb20gJy4vb2VwYS10YWJsZS1zb3J0LWNyaXRlcmlvbic7XG5pbXBvcnQgeyBQYWdlQ2hhbmdlZEV2ZW50IH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9wYWdpbmF0aW9uJztcbmltcG9ydCB7IE9lcGFGaWxlVXRpbFNlcnZpY2UgfSBmcm9tICdAb2hpb2VwYS9vZXBhLWNvbW1vbi1saWInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvZXBhLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHVibGljIHNob3dGaWx0ZXJSb3c6IEJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGhlYWRlclJvd3M6IEFycmF5PE9lcGFUYWJsZUhlYWRlcj4gPSBbXTtcbiAgcHVibGljIHJvd3M6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSBbXTtcbiAgcHVibGljIHZpc2libGVDb2x1bW5Db3VudCA9IDA7XG4gIHB1YmxpYyBhbGxDb2x1bW5Db3VudCA9IDA7XG4gIHB1YmxpYyBleHBvcnRWaXNpYmxlT25seTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlO1xuXG4gIC8qKiBUcnVlIGlmIGFueSBhY3Rpb24gZHJvcGRvd24gaXMgb3BlbiAqL1xuICBwdWJsaWMgaXNBbnlBY3Rpb25Ecm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIGFjdGlvbkRyb3Bkb3duT3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBwdWJsaWMgZGF0YUNvbHVtbnM6IEFycmF5PE9lcGFUYWJsZUNvbHVtbj4gPSBbXTtcbiAgcHVibGljIGhpZGRlbkNvbHVtbnM6IEFycmF5PE9lcGFUYWJsZUNvbHVtbj4gPSBbXTtcbiAgcHVibGljIGNvbHVtbkhlYWRlcnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgcHVibGljIF9kYXRhOiBBcnJheTxPZXBhVGFibGVSb3c+ID0gW107XG4gIHByaXZhdGUgX2NvbmZpZzogT2VwYVRhYmxlQ29uZmlnID0ge307XG4gIHByaXZhdGUgY3VycmVudEZpbHRlcnM6IEFycmF5PE9lcGFUYWJsZUZpbHRlcj4gPSBbe1xuICAgIGZpbHRlclN0cmluZzogJycsXG4gICAgY29sdW1uSWQ6IHVuZGVmaW5lZFxuICB9XTtcblxuICBwdWJsaWMgZGF0YUhhc0RldGFpbHMgPSBmYWxzZTtcbiAgcHVibGljIHNob3dBbGxEZXRhaWxzID0gZmFsc2U7XG5cbiAgcHVibGljIGFsbFJvd3NTZWxlY3RlZCA9IGZhbHNlO1xuXG4gIHB1YmxpYyBwYWdlSW5mbzogT2VwYVRhYmxlUGFnZUluZm8gPSB7XG4gICAgcGFnZTogMSxcbiAgICBpdGVtc1BlclBhZ2U6IDEwLFxuICAgIG1heFNpemU6IDUsXG4gICAgbnVtUGFnZXM6IDEsXG4gICAgbGVuZ3RoOiAwXG4gIH07XG4gIHB1YmxpYyBjdXJyZW50UGFnZSA9IDE7XG4gIHB1YmxpYyBwYWdpbmF0aW9uT24gPSB0cnVlO1xuXG4gIEBJbnB1dCgpIHRhYmxlSWQgPSAnJztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGNvbmZpZyhjb25mOiBPZXBhVGFibGVDb25maWcpIHtcbiAgICBpZiAoIWNvbmYuY2xhc3NOYW1lKSB7XG4gICAgICBjb25mLmNsYXNzTmFtZSA9ICd0YWJsZS1zdHJpcGVkIHRhYmxlLWJvcmRlcmVkJztcbiAgICB9XG4gICAgaWYgKGNvbmYuY2xhc3NOYW1lcykge1xuICAgICAgY29uZi5jbGFzc05hbWUgPSBjb25mLmNsYXNzTmFtZXMuam9pbignICcpO1xuICAgIH1cbiAgICBpZiAoY29uZi5yb3dzUGVyUGFnZSkge1xuICAgICAgdGhpcy5wYWdlSW5mby5pdGVtc1BlclBhZ2UgPSBjb25mLnJvd3NQZXJQYWdlO1xuICAgIH1cbiAgICB0aGlzLmV4cG9ydFZpc2libGVPbmx5ID0gY29uZi5leHBvcnRWaXNpYmxlT25seTtcbiAgICB0aGlzLl9jb25maWcgPSBjb25mO1xuICB9XG5cbiAgcHVibGljIGdldCBjb25maWcoKTogT2VwYVRhYmxlQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBjb21wbGV4SGVhZGVyKGhkcnM6IEFycmF5PE9lcGFUYWJsZUhlYWRlcj4pIHtcbiAgICB0aGlzLnJlc2V0SGVhZGVycygpO1xuICAgIGlmIChoZHJzICYmIGhkcnMubGVuZ3RoKSB7XG4gICAgICBoZHJzLmZvckVhY2goKGhkcjogT2VwYVRhYmxlSGVhZGVyKSA9PiB7XG4gICAgICAgIHRoaXMuaGVhZGVyUm93cy5wdXNoKHRoaXMuZXh0cmFjdElubmVyQ29sdW1ucyhoZHIuY29sdW1ucykpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNvbHVtbkhlYWRlcnMgPSB0aGlzLmV4dHJhY3RDb2x1bW5IZWFkZXJzKHRoaXMuaGVhZGVyUm93cyk7XG4gICAgICB0aGlzLmRhdGFDb2x1bW5zID0gdGhpcy5leHRyYWN0RGF0YUNvbHVtbnModGhpcy5oZWFkZXJSb3dzKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUhpZGRlbkNvbHVtbnModHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBoZWFkZXIoaGRyOiBPZXBhVGFibGVIZWFkZXIpIHtcbiAgICB0aGlzLnJlc2V0SGVhZGVycygpO1xuICAgIGlmIChoZHIuY29sdW1ucyAmJiBoZHIuY29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmhlYWRlclJvd3MucHVzaCh0aGlzLmV4dHJhY3RJbm5lckNvbHVtbnMoaGRyLmNvbHVtbnMpKTtcbiAgICB9XG4gICAgdGhpcy5jb2x1bW5IZWFkZXJzID0gdGhpcy5leHRyYWN0Q29sdW1uSGVhZGVycyh0aGlzLmhlYWRlclJvd3MpO1xuICAgIHRoaXMuZGF0YUNvbHVtbnMgPSB0aGlzLmV4dHJhY3REYXRhQ29sdW1ucyh0aGlzLmhlYWRlclJvd3MpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUhpZGRlbkNvbHVtbnMoZmFsc2UpO1xuICB9XG5cbiAgQElucHV0KCkgY3VzdG9tQnRuTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgY3VzdG9tQnRuVmlzaWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBjdXN0b21CdG5FbmFibGVkID0gZmFsc2U7XG5cbiAgLy8gT3V0cHV0cyAoRXZlbnRzKVxuICBAT3V0cHV0KCkgcHVibGljIGNlbGxDbGlja2VkOiBFdmVudEVtaXR0ZXI8T2VwYVRhYmxlQ2VsbENsaWNrRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIGFjdGlvbkNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxPZXBhQWN0aW9uRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIHJvd1NlbGVjdGVkOiBFdmVudEVtaXR0ZXI8QXJyYXk8T2VwYVRhYmxlUm93Pj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgY3VzdG9tQnRuQ2xpY2tlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHByaXZhdGUgcmVzZXRIZWFkZXJzKCkge1xuICAgIHRoaXMuaGVhZGVyUm93cyA9IFtdO1xuICAgIHRoaXMuY29sdW1uSGVhZGVycyA9IFtdO1xuICAgIHRoaXMuZGF0YUNvbHVtbnMgPSBbXTtcbiAgICB0aGlzLmhpZGRlbkNvbHVtbnMgPSBbXTtcbiAgfVxuXG4gIC8qKiBDYWxsZWQgd2hlbiBhbnkgb2VwYS1hY3Rpb24tYnRuIGRyb3Bkb3duIG9wZW4vY2xvc2UgY2hhbmdlcyAqL1xuICBvbkRyb3Bkb3duT3BlbkNoYW5nZShpc09wZW46IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzQW55QWN0aW9uRHJvcGRvd25PcGVuID0gaXNPcGVuO1xuICAgIHRoaXMuYWN0aW9uRHJvcGRvd25PcGVuQ2hhbmdlLmVtaXQoaXNPcGVuKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUhpZGRlbkNvbHVtbnMoY29tcGxleEhlYWRlcjogYm9vbGVhbikge1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbkNvdW50ID0gMDtcbiAgICB0aGlzLmFsbENvbHVtbkNvdW50ID0gMDtcbiAgICB0aGlzLmRhdGFDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgaWYgKGNvbXBsZXhIZWFkZXIgJiYgKGNvbHVtbj8uaGlkZGVuID09PSB0cnVlIHx8IGNvbHVtbj8uaGlkZGVuID09PSBmYWxzZSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignZGlzYWJsaW5nIGhpZGRlbiBhdHRyaWJ1dGUgZm9yIGNvbHVtbjogJyArIGNvbHVtbi5pZCArXG4gICAgICAgICAgJy4gSGlkZGVuIGNvbHVtbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGNvbXBsZXggaGVhZGVycyAoeWV0KS4nKTtcbiAgICAgICAgY29sdW1uLmhpZGRlbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy52aXNpYmxlQ29sdW1uQ291bnQrKztcbiAgICAgIH0gZWxzZSBpZiAoY29sdW1uPy5oaWRkZW4gPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5oaWRkZW5Db2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbkNvdW50Kys7XG4gICAgICB9XG4gICAgICB0aGlzLmFsbENvbHVtbkNvdW50Kys7XG4gICAgfSk7XG4gICAgLy8gY29uc29sZS5sb2coJ3Zpc2libGVDb2x1bW5Db3VudCA9ICcgKyB0aGlzLnZpc2libGVDb2x1bW5Db3VudCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRhdGEodmFsdWVzOiBBcnJheTxPZXBhVGFibGVSb3c+KSB7XG4gICAgaWYgKCF0aGlzLl9kYXRhIHx8IHRoaXMuX2RhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9kYXRhID0gdGhpcy50YWJsZVNlcnZpY2UuZ2V0RGF0YSh0aGlzLnRhYmxlSWQpIHx8IFtdO1xuICAgIH1cbiAgICBpZiAodmFsdWVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZXNbaV0ucHJpdmF0ZUlkID0gaTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9kYXRhICYmIHRoaXMuX2RhdGEubGVuZ3RoICE9PSB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmNsZWFyUGFnZUluZm8odGhpcy50YWJsZUlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9kYXRhID0gdmFsdWVzO1xuICAgIHRoaXMudGFibGVTZXJ2aWNlLnNldERhdGEodGhpcy50YWJsZUlkLCB0aGlzLl9kYXRhKTtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGEoKTogQXJyYXk8T2VwYVRhYmxlUm93PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEubWFwKHggPT4gT2JqZWN0LmFzc2lnbih7fSwgeCkpO1xuICB9XG5cbiAgQElucHV0KCkgdG90YWxSb3c6IE9lcGFUYWJsZVJvdyB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIHRhYmxlU2VydmljZTogVGFibGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGFibGVFeHBvcnRTZXJ2aWNlOiBUYWJsZUV4cG9ydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmaWxlVXRpbFNlcnZpY2U6IE9lcGFGaWxlVXRpbFNlcnZpY2UpIHtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucGFnaW5hdGlvbk9uID0gIXRoaXMuX2NvbmZpZy5kaXNhYmxlUGFnaW5hdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdElubmVyQ29sdW1ucyhpbm5lcjogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPik6IE9lcGFUYWJsZUhlYWRlciB7XG4gICAgY29uc3QgaGVhZGVyOiBPZXBhVGFibGVIZWFkZXIgPSB7IGNvbHVtbnM6IFtdIH07XG4gICAgaW5uZXIuZm9yRWFjaCgodmFsdWU6IE9lcGFUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgY29sdW1uID0gaGVhZGVyLmNvbHVtbnMuZmluZCgoY29sOiBPZXBhVGFibGVDb2x1bW4pID0+IGNvbC5pZCA9PT0gdmFsdWUuaWQpO1xuICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAvLyBvdmVyd3JpdGUgcmVwZWF0ZWQgY29sdW1uXG4gICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoIWNvbHVtbikge1xuICAgICAgICBoZWFkZXIuY29sdW1ucy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaGVhZGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0Q29sdW1uSGVhZGVycyhoZWFkZXJSb3dzOiBBcnJheTxPZXBhVGFibGVIZWFkZXI+KTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3QgaGVhZGVyczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGxldCByb3dJbmRleCA9IDA7XG4gICAgY29uc3QgY2hpbGRDb2x1bW5zOiBhbnkgPSB7fTtcbiAgICBoZWFkZXJSb3dzLmZvckVhY2goKGhkcjogT2VwYVRhYmxlSGVhZGVyKSA9PiB7XG4gICAgICBsZXQgY29sSW5kZXggPSAwO1xuICAgICAgaGRyLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBPZXBhVGFibGVDb2x1bW4pID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3Jvd0luZGV4PScgKyByb3dJbmRleCArICcsIGNvbEluZGV4PScgKyBjb2xJbmRleCArICcsIGNvbHVtbj0nICsgSlNPTi5zdHJpbmdpZnkoY29sdW1uKSk7XG4gICAgICAgIGlmIChyb3dJbmRleCA9PT0gMCkge1xuICAgICAgICAgIGhlYWRlcnMucHVzaChjb2x1bW4udGl0bGUpO1xuICAgICAgICAgIGlmIChjb2x1bW4uY29sc3Bhbikge1xuICAgICAgICAgICAgZm9yIChsZXQgY291bnQgPSAxOyBjb3VudCA8IGNvbHVtbi5jb2xzcGFuOyBjb3VudCsrKSB7XG4gICAgICAgICAgICAgIGhlYWRlcnMucHVzaCgnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb2x1bW4ucm93c3Bhbikge1xuICAgICAgICAgICAgY2hpbGRDb2x1bW5zW2NvbEluZGV4XSA9IGNvbHVtbi5yb3dzcGFuIC0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2hpbGUgKGNoaWxkQ29sdW1uc1tjb2xJbmRleF0gJiYgY2hpbGRDb2x1bW5zW2NvbEluZGV4XSA+IDApIHtcbiAgICAgICAgICAgIGNoaWxkQ29sdW1uc1tjb2xJbmRleF0tLTtcbiAgICAgICAgICAgIGNvbEluZGV4Kys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhlYWRlcnNbY29sSW5kZXhdICs9ICcgJyArIGNvbHVtbi50aXRsZTtcbiAgICAgICAgICBpZiAoY29sdW1uLmNvbHNwYW4pIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNvdW50ID0gMTsgY291bnQgPCBjb2x1bW4uY29sc3BhbjsgY291bnQrKykge1xuICAgICAgICAgICAgICBjb2xJbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb2xJbmRleCsrO1xuICAgICAgfSk7XG4gICAgICByb3dJbmRleCsrO1xuICAgIH0pO1xuICAgIC8vIGNvbnNvbGUubG9nKCdoZWFkZXJzID0gJyArIEpTT04uc3RyaW5naWZ5KGhlYWRlcnMpKTtcbiAgICByZXR1cm4gaGVhZGVycztcbiAgfVxuXG5cbiAgcHJpdmF0ZSBleHRyYWN0RGF0YUNvbHVtbnMoaGVhZGVyUm93czogQXJyYXk8T2VwYVRhYmxlSGVhZGVyPik6IEFycmF5PE9lcGFUYWJsZUNvbHVtbj4ge1xuICAgIGNvbnN0IGRhdGFDb2x1bW5zOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+ID0gW107XG4gICAgbGV0IHJvd0luZGV4ID0gMDtcbiAgICBjb25zdCBjaGlsZENvbHVtbnM6YW55ID0ge307XG4gICAgaGVhZGVyUm93cy5mb3JFYWNoKChoZHI6IE9lcGFUYWJsZUhlYWRlcikgPT4ge1xuICAgICAgbGV0IGNvbEluZGV4ID0gMDtcbiAgICAgIGhkci5jb2x1bW5zLmZvckVhY2goKGNvbHVtbjogT2VwYVRhYmxlQ29sdW1uKSA9PiB7XG4gICAgICAgIGlmIChyb3dJbmRleCA9PT0gMCkge1xuICAgICAgICAgIGlmIChjb2x1bW4uY29sc3BhbiAmJiBjb2x1bW4uY29sc3BhbiA+IDEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNvdW50ID0gMDsgY291bnQgPCBjb2x1bW4uY29sc3BhbjsgY291bnQrKykge1xuICAgICAgICAgICAgICBkYXRhQ29sdW1ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICAgICAgdGl0bGU6ICcnXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29sSW5kZXggKz0gKGNvbHVtbi5jb2xzcGFuIC0gMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGFDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW4ucm93c3Bhbikge1xuICAgICAgICAgICAgICBjaGlsZENvbHVtbnNbY29sSW5kZXhdID0gY29sdW1uLnJvd3NwYW4gLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3aGlsZSAoY2hpbGRDb2x1bW5zW2NvbEluZGV4XSAmJiBjaGlsZENvbHVtbnNbY29sSW5kZXhdID4gMCkge1xuICAgICAgICAgICAgY2hpbGRDb2x1bW5zW2NvbEluZGV4XS0tO1xuICAgICAgICAgICAgY29sSW5kZXgrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbHVtbi5jb2xzcGFuICYmIGNvbHVtbi5jb2xzcGFuID4gMSkge1xuICAgICAgICAgICAgY29sSW5kZXggKz0gKGNvbHVtbi5jb2xzcGFuIC0gMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGFDb2x1bW5zW2NvbEluZGV4XSA9IGNvbHVtbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29sSW5kZXgrKztcbiAgICAgIH0pO1xuICAgICAgcm93SW5kZXgrKztcbiAgICB9KTtcbiAgICAvLyBjb25zb2xlLmxvZygnZGF0YUNvbHVtbnMgPSAnICsgSlNPTi5zdHJpbmdpZnkoZGF0YUNvbHVtbnMpKTtcbiAgICByZXR1cm4gZGF0YUNvbHVtbnM7XG4gIH1cblxuICBwdWJsaWMgc2FuaXRpemUoaHRtbDogc3RyaW5nKTogU2FmZUh0bWwge1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChodG1sKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0byBzZWUgaWYgYW55IGZpbHRlcnMgYXJlIHNldFxuICAgKi9cbiAgcHVibGljIG5vRmlsdGVycygpOiBib29sZWFuIHtcbiAgICBsZXQgbm9GaWx0ZXJzID0gdHJ1ZTtcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgIGlmIChmaWx0ZXIuZmlsdGVyU3RyaW5nICYmIGZpbHRlci5maWx0ZXJTdHJpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICBub0ZpbHRlcnMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbm9GaWx0ZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBnbG9iYWwgZmlsdGVyIHN0cmluZyAoaWYgYW55KSBhcyBhIFJlZ0V4cFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRHbG9iYWxGaWx0ZXIoKTogUmVnRXhwIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgcmVnRXhwOiBSZWdFeHAgfCB1bmRlZmluZWQ7XG4gICAgdGhpcy5jdXJyZW50RmlsdGVycy5mb3JFYWNoKGZpbHRlciA9PiB7XG4gICAgICBpZiAoIWZpbHRlci5jb2x1bW5JZCAmJiBmaWx0ZXIuZmlsdGVyU3RyaW5nICYmIGZpbHRlci5maWx0ZXJTdHJpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICByZWdFeHAgPSBuZXcgUmVnRXhwKGZpbHRlci5maWx0ZXJTdHJpbmcsICdpJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlZ0V4cDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZmlsdGVyIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbiAoaWYgYW55KSBhcyBhIFJlZ0V4cC5cbiAgICogQHBhcmFtIGNvbHVtbklkXG4gICAqL1xuICBwcml2YXRlIGdldEZpbHRlckZvckNvbHVtbihjb2x1bW5JZDogc3RyaW5nKTogUmVnRXhwIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgcmVnRXhwOiBSZWdFeHAgfCB1bmRlZmluZWQ7XG4gICAgdGhpcy5jdXJyZW50RmlsdGVycy5mb3JFYWNoKGZpbHRlciA9PiB7XG4gICAgICBpZiAoZmlsdGVyLmNvbHVtbklkID09PSBjb2x1bW5JZCAmJiBmaWx0ZXIuZmlsdGVyU3RyaW5nICYmIGZpbHRlci5maWx0ZXJTdHJpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICByZWdFeHAgPSBuZXcgUmVnRXhwKGZpbHRlci5maWx0ZXJTdHJpbmcsICdpJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlZ0V4cDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgdGhlIHRhYmxlIGRhdGEgcHJvdmlkZWQgYnkgdGhlIGdsb2JhbCBvciBjb2x1bW4tc3BlY2lmaWNcbiAgICogZmlsdGVycyBzZXQgaW4gdGhlIFVJLlxuICAgKiBAcGFyYW0gZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJEYXRhKGRhdGE6IEFycmF5PE9lcGFUYWJsZVJvdz4pOiBBcnJheTxPZXBhVGFibGVSb3c+IHtcbiAgICAvLyBkb24ndCBhdHRlbXB0IGZpbHRlcmluZyBpZiB0aGVyZSBhcmUgbm8gZmlsdGVycyBzZXRcbiAgICBpZiAodGhpcy5ub0ZpbHRlcnMoKSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGxldCBmaWx0ZXJlZERhdGE6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSBkYXRhO1xuICAgIGNvbnN0IHRlbXBBcnJheTogQXJyYXk8T2VwYVRhYmxlUm93PiA9IFtdO1xuICAgIGZpbHRlcmVkRGF0YS5mb3JFYWNoKChyb3c6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgbGV0IGZsYWcgPSB0aGlzLmZpbHRlckJ5Q29sdW1uRmlsdGVycyhyb3cpO1xuICAgICAgaWYgKGZsYWcpIHtcbiAgICAgICAgZmxhZyA9IHRoaXMuZmlsdGVyQnlHbG9iYWxGaWx0ZXIocm93KTtcbiAgICAgIH1cbiAgICAgIGlmIChmbGFnIHx8IHJvdy5pc0RpdmlkZXIpIHtcbiAgICAgICAgdGVtcEFycmF5LnB1c2gocm93KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmaWx0ZXJlZERhdGEgPSB0ZW1wQXJyYXk7XG4gICAgcmV0dXJuIGZpbHRlcmVkRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0IGlmIHJvdyBtYXRjaGVzIGFueSBvZiB0aGUgY29sdW1ubiBmaWx0ZXJzIHRoYXQgbWF5IGJlIHNldC5cbiAgICogQHBhcmFtIHJvd1xuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJCeUNvbHVtbkZpbHRlcnMocm93OiBPZXBhVGFibGVSb3cpOiBib29sZWFuIHtcbiAgICBsZXQgZmxhZyA9IHRydWU7XG4gICAgcm93LmNlbGxzLmZvckVhY2goKGNlbGw6IE9lcGFUYWJsZUNlbGwpID0+IHtcbiAgICAgIGNvbnN0IHJlZ0V4cCA9IHRoaXMuZ2V0RmlsdGVyRm9yQ29sdW1uKGNlbGwuaWQpO1xuICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBjZWxsLmZpbHRlclZhbHVlIHx8IGNlbGwudmFsdWUgfHwgJyc7XG4gICAgICBpZiAocmVnRXhwICYmIGZpbHRlclZhbHVlICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZmlsdGVyVmFsdWUudG9TdHJpbmcoKS5tYXRjaChyZWdFeHApO1xuICAgICAgICBmbGFnID0gZmxhZyAmJiAocmVzdWx0ICE9PSBudWxsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmxhZztcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0IGlmIHJvdyBtYXRjaGVzIHRoZSBnbG9iYWwgZmlsdGVyXG4gICAqIEBwYXJhbSByb3dcbiAgICovXG4gIHByaXZhdGUgZmlsdGVyQnlHbG9iYWxGaWx0ZXIocm93OiBPZXBhVGFibGVSb3cpOiBib29sZWFuIHtcbiAgICBsZXQgZmxhZyA9IHRydWU7XG4gICAgY29uc3QgcmVnRXhwID0gdGhpcy5nZXRHbG9iYWxGaWx0ZXIoKTtcbiAgICBpZiAocmVnRXhwKSB7XG4gICAgICBmbGFnID0gZmFsc2U7XG4gICAgICByb3cuY2VsbHMuZm9yRWFjaCgoY2VsbDogT2VwYVRhYmxlQ2VsbCkgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IGNlbGwuZmlsdGVyVmFsdWUgfHwgY2VsbC52YWx1ZTtcbiAgICAgICAgaWYgKGZpbHRlclZhbHVlICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBmaWx0ZXJWYWx1ZS50b1N0cmluZygpLm1hdGNoKHJlZ0V4cCk7XG4gICAgICAgICAgZmxhZyA9IGZsYWcgfHwgKHJlc3VsdCAhPT0gbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZmxhZztcbiAgfVxuXG4gIHB1YmxpYyBoaWRlQ29sdW1uKGNvbHVtbjogT2VwYVRhYmxlQ29sdW1uKSB7XG4gICAgdGhpcy5oaWRkZW5Db2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICBjb2x1bW4uaGlkZGVuID0gdHJ1ZTtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5Db3VudC0tO1xuICB9XG5cbiAgcHVibGljIHVuaGlkZUNvbHVtbihjb2x1bW5JZDogc3RyaW5nKSB7XG4gICAgY29uc3QgaGlkZGVuQ29sczogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPiA9IFtdO1xuICAgIHRoaXMuaGlkZGVuQ29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGlmIChjb2wuaWQgIT09IGNvbHVtbklkKSB7XG4gICAgICAgIGhpZGRlbkNvbHMucHVzaChjb2wpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sLmhpZGRlbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuaGlkZGVuQ29sdW1ucyA9IGhpZGRlbkNvbHM7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1uQ291bnQrKztcbiAgfVxuXG4gIHByaXZhdGUgc29ydERhdGEoZGF0YTogQXJyYXk8T2VwYVRhYmxlUm93Pik6IEFycmF5PE9lcGFUYWJsZVJvdz4ge1xuICAgIGxldCBzb3J0Q3JpdGVyaWE6IGFueSA9IHRoaXMudGFibGVTZXJ2aWNlLmdldFNvcnRDcml0ZXJpYSh0aGlzLnRhYmxlSWQpIHx8IFtdO1xuICAgIGlmIChzb3J0Q3JpdGVyaWEubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHRoaXMucmVzZXRDb2x1bW5Tb3J0SW5kZXhlcyhzb3J0Q3JpdGVyaWEpO1xuXG4gICAgcmV0dXJuIGRhdGEuc29ydCgocHJldmlvdXM6IE9lcGFUYWJsZVJvdywgY3VycmVudDogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICBsZXQgc29ydEluZGV4ID0gMDtcbiAgICAgIGxldCBzb3J0UmVzdWx0ID0gMDtcbiAgICAgIHdoaWxlIChzb3J0SW5kZXggPCBzb3J0Q3JpdGVyaWEubGVuZ3RoICYmIHNvcnRSZXN1bHQgPT09IDApIHtcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLmdldFJvd1NvcnRWYWx1ZShwcmV2aW91cywgc29ydENyaXRlcmlhW3NvcnRJbmRleF0uY29sdW1uSWQpO1xuICAgICAgICBsZXQgY3VyciA9IHRoaXMuZ2V0Um93U29ydFZhbHVlKGN1cnJlbnQsIHNvcnRDcml0ZXJpYVtzb3J0SW5kZXhdLmNvbHVtbklkKTtcbiAgICAgICAgaWYgKHByZXYgPiBjdXJyKSB7XG4gICAgICAgICAgc29ydFJlc3VsdCA9ICAoc29ydENyaXRlcmlhW3NvcnRJbmRleF0uc29ydCA9PT0gJ2Rlc2MnID8gLTEgOiAxKTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmV2IDwgY3Vycikge1xuICAgICAgICAgIHNvcnRSZXN1bHQgPSAgKHNvcnRDcml0ZXJpYVtzb3J0SW5kZXhdLnNvcnQgPT09ICdhc2MnID8gLTEgOiAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb3J0UmVzdWx0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBzb3J0SW5kZXgrKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBzb3J0UmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlc2V0Q29sdW1uU29ydEluZGV4ZXMoc29ydENyaXRlcmlhOiBPZXBhVGFibGVTb3J0Q3JpdGVyaW9uW10pIHtcbiAgICBpZiAoc29ydENyaXRlcmlhICYmIHNvcnRDcml0ZXJpYS5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGxldCBpPTA7IGk8c29ydENyaXRlcmlhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZGF0YUNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW4/LmlkID09PSBzb3J0Q3JpdGVyaWFbaV0uY29sdW1uSWQpIHtcbiAgICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgY29sdW1uLnNvcnRJbmRleCA9IGkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZGlzcGxheSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGNlbGwuXG4gICAqIEBwYXJhbSByb3dcbiAgICogQHBhcmFtIGNvbHVtbklkXG4gICAqL1xuICBwdWJsaWMgZ2V0Um93VmFsdWUocm93OiBPZXBhVGFibGVSb3csIGNvbHVtbklkOiBzdHJpbmcpOiBhbnkge1xuICAgIGxldCB2YWx1ZTogYW55O1xuICAgIHJvdy5jZWxscy5mb3JFYWNoKChjZWxsOiBPZXBhVGFibGVDZWxsKSA9PiB7XG4gICAgICBpZiAoY2VsbC5pZCA9PT0gY29sdW1uSWQpIHtcbiAgICAgICAgdmFsdWUgPSBjZWxsLnZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcm93IFJldHJpZXZlIHRoZSBzb3J0IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgY2VsbCAod2lsbCBkZWZhdWx0IHRvIGRpc3BsYXkgdmFsdWUgaWYgc29ydFxuICAgKiB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkKS5cbiAgICogQHBhcmFtIGNvbHVtbklkXG4gICAqL1xuICBwdWJsaWMgZ2V0Um93U29ydFZhbHVlKHJvdzogT2VwYVRhYmxlUm93LCBjb2x1bW5JZDogc3RyaW5nKTogYW55IHtcbiAgICBsZXQgdmFsdWU6IGFueTtcbiAgICByb3cuY2VsbHMuZm9yRWFjaCgoY2VsbDogT2VwYVRhYmxlQ2VsbCkgPT4ge1xuICAgICAgaWYgKGNlbGwuaWQgPT09IGNvbHVtbklkKSB7XG4gICAgICAgIGlmIChjZWxsLnNvcnRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGNlbGwuc29ydFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFsdWUgPSBjZWxsLnNvcnRWYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IGNlbGwudmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSB2YWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlUGFnZShkYXRhOiBBcnJheTxPZXBhVGFibGVSb3c+ID0gdGhpcy5kYXRhKTogQXJyYXk8T2VwYVRhYmxlUm93PiB7XG4gICAgaWYgKCF0aGlzLnBhZ2luYXRpb25Pbikge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlUGFnZSgpO1xuICAgIGNvbnN0IHN0YXJ0ID0gKHRoaXMucGFnZUluZm8ucGFnZSAtIDEpICogdGhpcy5wYWdlSW5mby5pdGVtc1BlclBhZ2U7XG4gICAgY29uc3QgZW5kID0gdGhpcy5wYWdlSW5mby5pdGVtc1BlclBhZ2UgPiAtMSA/IChzdGFydCArIHRoaXMucGFnZUluZm8uaXRlbXNQZXJQYWdlKSA6IGRhdGEubGVuZ3RoO1xuICAgIC8vIG5vdCBzdXJlIHdoeSwgYnV0IG1heFNpemUgd2FzIGdldHRpbmcgbG9zdC4gUmVzZXQgaXQgaGVyZSB0byBwcmV2ZW50IHdlaXJkbmVzcy5cbiAgICB0aGlzLnBhZ2VJbmZvLm1heFNpemUgPSA1O1xuICAgIHJldHVybiBkYXRhLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZVBhZ2luZ2F0aW9uKCkge1xuICAgIHRoaXMucGFnaW5hdGlvbk9uID0gIXRoaXMucGFnaW5hdGlvbk9uO1xuICAgIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkZpbHRlckNoYW5nZWQoZmlsdGVyOiBPZXBhVGFibGVGaWx0ZXIpIHtcbiAgICBjb25zdCBtYXRjaEZpbHRlciA9IHRoaXMuY3VycmVudEZpbHRlcnMuZmluZCgoZikgPT4ge1xuICAgICAgcmV0dXJuIGYuY29sdW1uSWQgPT09IGZpbHRlci5jb2x1bW5JZDtcbiAgICB9KTtcbiAgICBpZiAoIW1hdGNoRmlsdGVyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRGaWx0ZXJzLnB1c2goZmlsdGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWF0Y2hGaWx0ZXIuZmlsdGVyU3RyaW5nID0gZmlsdGVyLmZpbHRlclN0cmluZztcbiAgICB9XG4gICAgdGhpcy51cGRhdGVUYWJsZSh0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBvblNvcnRDaGFuZ2VkKGNvbHVtbjogT2VwYVRhYmxlQ29sdW1uKSB7XG4gICAgdGhpcy50YWJsZVNlcnZpY2Uuc2V0U29ydCh0aGlzLnRhYmxlSWQsIGNvbHVtbik7XG4gICAgdGhpcy51cGRhdGVUYWJsZSgpO1xuICB9XG5cbiAgcHVibGljIG9uUGFnZUNoYW5nZWQocGFnZUV2ZW50OiBQYWdlQ2hhbmdlZEV2ZW50KSB7XG4gICAgdGhpcy5wYWdlSW5mbyA9IHtcbiAgICAgIHBhZ2U6IHBhZ2VFdmVudC5wYWdlLFxuICAgICAgaXRlbXNQZXJQYWdlOiBwYWdlRXZlbnQuaXRlbXNQZXJQYWdlLFxuICAgICAgbWF4U2l6ZTogdGhpcy5wYWdlSW5mby5tYXhTaXplLFxuICAgICAgbGVuZ3RoOiB0aGlzLnBhZ2VJbmZvLmxlbmd0aCxcbiAgICAgIG51bVBhZ2VzOiB0aGlzLnBhZ2VJbmZvLm51bVBhZ2VzXG4gICAgfVxuICAgIHRoaXMudGFibGVTZXJ2aWNlLnNldFBhZ2UodGhpcy50YWJsZUlkLCBwYWdlRXZlbnQucGFnZSk7XG4gICAgdGhpcy51cGRhdGVUYWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUYWJsZShjbGVhclNlbGN0ZWRSb3dzOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBmaWx0ZXJlZERhdGEgPSB0aGlzLmZpbHRlckRhdGEodGhpcy5kYXRhKTtcbiAgICBjb25zdCBzb3J0ZWREYXRhID0gdGhpcy5zb3J0RGF0YShmaWx0ZXJlZERhdGEpO1xuICAgIHRoaXMucm93cyA9IHRoaXMuY2hhbmdlUGFnZShzb3J0ZWREYXRhKTtcbiAgICB0aGlzLnBhZ2VJbmZvLmxlbmd0aCA9IHNvcnRlZERhdGEubGVuZ3RoO1xuICAgIHRoaXMuYWxsUm93c1NlbGVjdGVkID0gZmFsc2U7XG4gICAgaWYgKGNsZWFyU2VsY3RlZFJvd3MpIHtcbiAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdChbXSk7XG4gICAgfVxuICAgIHRoaXMuZGF0YUhhc0RldGFpbHMgPSB0aGlzLmNoZWNrRm9yRGV0YWlscyh0aGlzLnJvd3MpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYWdlKCkge1xuICAgIGNvbnN0IHNhdmVkUGFnZU51bWJlciA9IHRoaXMudGFibGVTZXJ2aWNlLmdldFBhZ2UodGhpcy50YWJsZUlkKTtcbiAgICBpZiAoc2F2ZWRQYWdlTnVtYmVyICYmIHRoaXMucGFnZUluZm8ucGFnZSAhPT0gc2F2ZWRQYWdlTnVtYmVyKSB7XG4gICAgICB0aGlzLnBhZ2VJbmZvLnBhZ2UgPSBzYXZlZFBhZ2VOdW1iZXI7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5wYWdlSW5mby5wYWdlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tGb3JEZXRhaWxzKGRhdGE6IEFycmF5PE9lcGFUYWJsZVJvdz4pOiBib29sZWFuIHtcbiAgICBsZXQgaGFzRGV0YWlscyA9IGZhbHNlO1xuICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoKSB7XG4gICAgICBkYXRhLmZvckVhY2goKHJvdzogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICAgIGlmIChyb3cuc2hvd0RldGFpbCA9PT0gdHJ1ZSB8fCByb3cuc2hvd0RldGFpbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBoYXNEZXRhaWxzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBoYXNEZXRhaWxzO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUFsbERldGFpbHMoKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ3RvZ2dsZUFsbERldGFpbHMuLi4nKTtcbiAgICB0aGlzLnNob3dBbGxEZXRhaWxzID0gIXRoaXMuc2hvd0FsbERldGFpbHM7XG4gICAgLy8gY29uc29sZS5sb2coJ3Nob3dBbGxEZXRhaWxzID0gJyArIHRoaXMuc2hvd0FsbERldGFpbHMpO1xuICAgIGlmICh0aGlzLl9kYXRhICYmIHRoaXMuX2RhdGEubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9kYXRhLmZvckVhY2goKHJvdzogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICAgIGlmIChyb3cuc2hvd0RldGFpbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcm93LnNob3dEZXRhaWwgPSB0aGlzLnNob3dBbGxEZXRhaWxzO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZXR0aW5nIGRldGFpbHMgZm9yIHJvdyB0byAnICsgdGhpcy5zaG93QWxsRGV0YWlscyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVRhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlUm93RGV0YWlsKHRvZ2dsZVJvdzogT2VwYVRhYmxlUm93KSB7XG4gICAgaWYgKHRvZ2dsZVJvdyAmJiB0aGlzLl9kYXRhICYmIHRoaXMuX2RhdGEubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9kYXRhLmZvckVhY2goKHJvdzogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdURVNUOiAnICsgSlNPTi5zdHJpbmdpZnkocm93LmRhdGFTb3VyY2UpICsgJyA9PT0gJyArIEpTT04uc3RyaW5naWZ5KHRvZ2dsZVJvdy5kYXRhU291cmNlKSk7XG4gICAgICAgIGlmIChyb3cuZGF0YVNvdXJjZSA9PT0gdG9nZ2xlUm93LmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnISEhIE1BVENIICEhIScpO1xuICAgICAgICAgIHJvdy5zaG93RGV0YWlsID0gIXRvZ2dsZVJvdy5zaG93RGV0YWlsO1xuICAgICAgICAgIHRvZ2dsZVJvdy5zaG93RGV0YWlsID0gcm93LnNob3dEZXRhaWw7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ3Nob3cgZGV0YWlsID0gJyArIHJvdy5zaG93RGV0YWlsICsgJyBmb3Igcm93OiAnICsgSlNPTi5zdHJpbmdpZnkocm93LmRhdGFTb3VyY2UpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyB0aGlzLl9kYXRhID0gdGhpcy5fZGF0YS5zcGxpY2UoMCk7XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKCd0b2dnbGVSb3dEZXRhaWwuLi4nKTtcbiAgICAvLyB0aGlzLmR1bXBEZXRhaWxSb3dzKCk7XG4gIH1cblxuICBwdWJsaWMgaXNBY3Rpb25Db2x1bW4oY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIGNvbnNvbGUubG9nKCdpc0FjdGlvbkNvbHVtbiAnICsgY29sdW1uSWQpO1xuICAgIGxldCBhY3Rpb25Db2x1bW4gPSBmYWxzZTtcbiAgICB0aGlzLmhlYWRlclJvd3MuZm9yRWFjaCgoaGRyOiBPZXBhVGFibGVIZWFkZXIpID0+IHtcbiAgICAgIGhkci5jb2x1bW5zLmZvckVhY2goKGNvbHVtbjogT2VwYVRhYmxlQ29sdW1uKSA9PiB7XG4gICAgICAgIGlmIChjb2x1bW4uaWQgPT09IGNvbHVtbklkKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ3Rlc3QgYWN0aW9uIGNvbHVtbjogJyArIGNvbHVtbi5pZCArICcgLSAnICsgY29sdW1uLmFjdGlvbkNvbHVtbik7XG4gICAgICAgICAgYWN0aW9uQ29sdW1uID0gY29sdW1uLmFjdGlvbkNvbHVtbiB8fCBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGlvbkNvbHVtbjtcbiAgfVxuXG4gIHB1YmxpYyBpc0NvbHVtbkhpZGRlbihjb2x1bW5JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gY29uc29sZS5sb2coJ2lzQ29sdW1uSGlkZGVuICcgKyBjb2x1bW5JZCk7XG4gICAgbGV0IGhpZGRlbiA9IGZhbHNlO1xuICAgIHRoaXMuaGVhZGVyUm93cy5mb3JFYWNoKChoZHI6IE9lcGFUYWJsZUhlYWRlcikgPT4ge1xuICAgICAgaGRyLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBPZXBhVGFibGVDb2x1bW4pID0+IHtcbiAgICAgICAgaWYgKGNvbHVtbi5pZCA9PT0gY29sdW1uSWQpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygndGVzdCBoaWRkZW4gY29sdW1uOiAnICsgY29sdW1uLmlkICsgJyAtICcgKyBjb2x1bW4uaGlkZGVuKTtcbiAgICAgICAgICBoaWRkZW4gPSBjb2x1bW4uaGlkZGVuIHx8IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gaGlkZGVuO1xuICB9XG5cbiAgcHVibGljIGdldEhpZGRlbkNvbHVtbnMoKTogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPiB7XG4gICAgY29uc3QgY29sdW1uczogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPiA9IFtdO1xuICAgIHRoaXMuaGVhZGVyUm93cy5mb3JFYWNoKChoZHI6IE9lcGFUYWJsZUhlYWRlcikgPT4ge1xuICAgICAgaGRyLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBPZXBhVGFibGVDb2x1bW4pID0+IHtcbiAgICAgICAgaWYgKGNvbHVtbi5oaWRkZW4pIHtcbiAgICAgICAgICBjb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2VsbENsYXNzTmFtZShyb3c6IE9lcGFUYWJsZVJvdywgY29sdW1uSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdDogc3RyaW5nIHwgdW5kZWZpbmVkID0gJyc7XG4gICAgcm93LmNlbGxzLmZvckVhY2goKGNlbGw6IE9lcGFUYWJsZUNlbGwpID0+IHtcbiAgICAgIGlmIChjZWxsLmlkID09PSBjb2x1bW5JZCkge1xuICAgICAgICByZXN1bHQgPSBjZWxsLmNsYXNzTmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGdldENlbGxDb2xTcGFuKHJvdzogT2VwYVRhYmxlUm93LCBjb2x1bW5JZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzdWx0OiBudW1iZXIgfCB1bmRlZmluZWQgPSAxO1xuICAgIHJvdy5jZWxscy5mb3JFYWNoKChjZWxsOiBPZXBhVGFibGVDZWxsKSA9PiB7XG4gICAgICBpZiAoY2VsbC5pZCA9PT0gY29sdW1uSWQpIHtcbiAgICAgICAgcmVzdWx0ID0gY2VsbC5jb2xTcGFuIHx8IDAgPj0wID8gY2VsbC5jb2xTcGFuIDogMTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGdldENlbGxJY29uQ2xhc3NOYW1lKHJvdzogT2VwYVRhYmxlUm93LCBjb2x1bW5JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSAnJztcbiAgICByb3cuY2VsbHMuZm9yRWFjaCgoY2VsbDogT2VwYVRhYmxlQ2VsbCkgPT4ge1xuICAgICAgaWYgKGNlbGwuaWQgPT09IGNvbHVtbklkKSB7XG4gICAgICAgIHJlc3VsdCA9IGNlbGwuaWNvbkNsYXNzTmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGdldENlbGxJbWdTcmMocm93OiBPZXBhVGFibGVSb3csIGNvbHVtbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9ICcnO1xuICAgIHJvdy5jZWxscy5mb3JFYWNoKChjZWxsOiBPZXBhVGFibGVDZWxsKSA9PiB7XG4gICAgICBpZiAoY2VsbC5pZCA9PT0gY29sdW1uSWQpIHtcbiAgICAgICAgcmVzdWx0ID0gY2VsbC5pbWdTcmM7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDZWxsSW5uZXJIVE1MKHJvdzogT2VwYVRhYmxlUm93LCBjb2x1bW5JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSAnJztcbiAgICByb3cuY2VsbHMuZm9yRWFjaCgoY2VsbDogT2VwYVRhYmxlQ2VsbCkgPT4ge1xuICAgICAgaWYgKGNlbGwuaWQgPT09IGNvbHVtbklkKSB7XG4gICAgICAgIHJlc3VsdCA9IGNlbGwuaW5uZXJIVE1MO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgY2VsbENsaWNrKHJvdzogT2VwYVRhYmxlUm93LCBjb2x1bW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFJvd1ZhbHVlKHJvdywgY29sdW1uSWQpO1xuICAgIHRoaXMuY2VsbENsaWNrZWQuZW1pdCh7IHJvdywgY29sdW1uSWQsIHZhbHVlIH0pO1xuICB9XG5cbiAgcHVibGljIG9uQWN0aW9uQ2xpY2soZXZlbnQ6IE9lcGFBY3Rpb25FdmVudCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aW9uQ2xpY2tlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVBbGxSb3dzU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93czogQXJyYXk8T2VwYVRhYmxlUm93PiA9IFtdO1xuICAgIHRoaXMuYWxsUm93c1NlbGVjdGVkID0gIXRoaXMuYWxsUm93c1NlbGVjdGVkO1xuICAgIC8vIGRlc2VsZWN0IGFsbCByb3dzXG4gICAgdGhpcy5fZGF0YS5mb3JFYWNoKChyOiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgIHIuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB9KTtcbiAgICAvLyBzZWxlY3Qgb25seSB2aXNpYmxlIHJvd3NcbiAgICB0aGlzLnJvd3MuZm9yRWFjaCgocjogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICBpZiAoci5zZWxlY3RhYmxlKSB7XG4gICAgICAgIHIuc2VsZWN0ZWQgPSB0aGlzLmFsbFJvd3NTZWxlY3RlZDtcbiAgICAgIH1cbiAgICAgIGlmIChyLnNlbGVjdGVkKSB7XG4gICAgICAgIHNlbGVjdGVkUm93cy5wdXNoKHIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucm93cy5zbGljZSgpO1xuICAgIC8vIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoc2VsZWN0ZWRSb3dzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVSb3dTZWxlY3Rpb24ocm93OiBPZXBhVGFibGVSb3cpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFJvd3M6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSBbXTtcbiAgICByb3cuc2VsZWN0ZWQgPSAhcm93LnNlbGVjdGVkO1xuICAgIHRoaXMucm93cy5mb3JFYWNoKChkcjogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICBpZiAocm93LnByaXZhdGVJZCA9PT0gZHIucHJpdmF0ZUlkKSB7XG4gICAgICAgIGRyLnNlbGVjdGVkID0gcm93LnNlbGVjdGVkO1xuICAgICAgfVxuICAgICAgaWYgKGRyLnNlbGVjdGVkKSB7XG4gICAgICAgIHNlbGVjdGVkUm93cy5wdXNoKGRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWxsUm93c1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yb3dzLnNsaWNlKCk7XG4gICAgLy8gdGhpcy51cGRhdGVUYWJsZSgpO1xuICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdChzZWxlY3RlZFJvd3MpO1xuICB9XG5cbiAgcHVibGljIHNpbmdsZVJvd1NlbGVjdGlvbihyb3c6IE9lcGFUYWJsZVJvdyk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93czogQXJyYXk8T2VwYVRhYmxlUm93PiA9IFtdO1xuICAgIHJvdy5zZWxlY3RlZCA9ICFyb3cuc2VsZWN0ZWQ7XG4gICAgLy8gYWRkIHJvdyB0byBzZWxlY3RlZCByb3dzIGlmIGl0IGlzIHNlbGVjdGVkXG4gICAgaWYgKHJvdy5zZWxlY3RlZCkge1xuICAgICAgc2VsZWN0ZWRSb3dzLnB1c2gocm93KTtcbiAgICB9XG4gICAgLy8gdW5zZWxlY3QgYW55IG90aGVyIHJvdyB0aGF0IG1heSBiZSBzZWxlY3RlZFxuICAgIHRoaXMuX2RhdGEuZm9yRWFjaCgoZHI6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgaWYgKHJvdy5wcml2YXRlSWQgPT09IGRyLnByaXZhdGVJZCkge1xuICAgICAgICBkci5zZWxlY3RlZCA9IHJvdy5zZWxlY3RlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yb3dzLnNsaWNlKCk7XG4gICAgdGhpcy51cGRhdGVUYWJsZSgpO1xuICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdChzZWxlY3RlZFJvd3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlUm93c0ZvckV4cG9ydChyb3dzOiBBcnJheTxPZXBhVGFibGVSb3c+KTogQXJyYXk8T2VwYVRhYmxlUm93PiB7XG4gICAgY29uc3QgcmVzdWx0OiBBcnJheTxPZXBhVGFibGVSb3c+ID0gW107XG4gICAgLy8gY29uc29sZS5sb2coJ3ByZXBhcmVSb3dzRm9yRXhwb3J0Li4uJyk7XG4gICAgLy8gdGhpcy5kdW1wRGV0YWlsUm93cygpO1xuICAgIGlmIChyb3dzICYmIHJvd3MubGVuZ3RoKSB7XG4gICAgICByb3dzLmZvckVhY2goKHJvdzogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdzaG93RGV0YWlsID0gJyArIHJvdy5zaG93RGV0YWlsICsgJyAnICsgSlNPTi5zdHJpbmdpZnkocm93LmNlbGxzKSk7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBjZWxsczogcm93LmNlbGxzLFxuICAgICAgICAgIGFjdGlvbnM6IHJvdy5hY3Rpb25zLFxuICAgICAgICAgIHNob3dEZXRhaWw6IHJvdy5zaG93RGV0YWlsLFxuICAgICAgICAgIHN1YlRhYmxlOiByb3cuZGV0YWlsID8gdGhpcy5jb252ZXJ0VG9UYWJsZShyb3cuZGV0YWlsKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBpc0RpdmlkZXI6IHJvdy5pc0RpdmlkZXIsXG4gICAgICAgICAgZGl2aWRlckNsYXNzTmFtZTogcm93LmRpdmlkZXJDbGFzc05hbWVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnYXRoZXJUYWJsZURhdGEocm93czogT2VwYVRhYmxlUm93W10pOiBPZXBhVGFibGUge1xuICAgIC8vIGNvbnNvbGUubG9nKCdnYXRoZXJUYWJsZURhdGEuLi4nKTtcbiAgICAvLyB0aGlzLmR1bXBEZXRhaWxSb3dzKCk7XG4gICAgY29uc3Qgb2VwYVRhYmxlOiBPZXBhVGFibGUgPSB7fTtcbiAgICBvZXBhVGFibGUuaGVhZGVyUm93cyA9IHRoaXMuaGVhZGVyUm93cztcbiAgICBvZXBhVGFibGUuYWxsRGF0YVJvd3MgPSB0aGlzLnByZXBhcmVSb3dzRm9yRXhwb3J0KHJvd3MpO1xuICAgIG9lcGFUYWJsZS5zaG93QWxsRGV0YWlscyA9IHRoaXMuc2hvd0FsbERldGFpbHM7XG4gICAgb2VwYVRhYmxlLmNsYXNzTmFtZSA9IHRoaXMuX2NvbmZpZy5jbGFzc05hbWU7XG4gICAgb2VwYVRhYmxlLnZpc2libGVDb2x1bW5Db3VudCA9IHRoaXMudmlzaWJsZUNvbHVtbkNvdW50O1xuICAgIG9lcGFUYWJsZS5hbGxDb2x1bW5Db3VudCA9IHRoaXMuYWxsQ29sdW1uQ291bnQ7XG4gICAgcmV0dXJuIG9lcGFUYWJsZTtcbiAgfVxuXG4gIHByaXZhdGUgZHVtcERldGFpbFJvd3MoKSB7XG4gICAgY29uc29sZS5sb2coJ2R1bXBEZXRhaWxSb3dzIC0gVG90YWwgcm93czogJyArIHRoaXMuX2RhdGEubGVuZ3RoKTtcbiAgICB0aGlzLl9kYXRhLmZvckVhY2goKHJvdzogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICBpZiAocm93LnNob3dEZXRhaWwpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1NIT1cgREVUQUlMOiAnICsgSlNPTi5zdHJpbmdpZnkocm93LmRhdGFTb3VyY2UpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjb252ZXJ0VG9UYWJsZSh0ZW1wbGF0ZTogT2VwYVRlbXBsYXRlSW5mbyk6IE9lcGFUYWJsZSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IG9lcGFUYWJsZTogT2VwYVRhYmxlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmICh0ZW1wbGF0ZS5jb21wb25lbnQgPT09IFRhYmxlQ29tcG9uZW50KSB7XG4gICAgICBjb25zdCB0YWJsZTogVGFibGVDb21wb25lbnQgPSBuZXcgVGFibGVDb21wb25lbnQodGhpcy5zYW5pdGl6ZXIsIHRoaXMudGFibGVTZXJ2aWNlLCB0aGlzLnRhYmxlRXhwb3J0U2VydmljZSwgdGhpcy5maWxlVXRpbFNlcnZpY2UpO1xuICAgICAgaWYgKHRlbXBsYXRlLmlucHV0cyAmJiB0ZW1wbGF0ZS5pbnB1dHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0ZW1wbGF0ZS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgICAgICBpZiAoaW5wdXQubmFtZSA9PT0gJ2NvbmZpZycpIHtcbiAgICAgICAgICAgIHRhYmxlLmNvbmZpZyA9IGlucHV0LnZhbHVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQubmFtZSA9PT0gJ2NvbXBsZXhIZWFkZXInKSB7XG4gICAgICAgICAgICB0YWJsZS5jb21wbGV4SGVhZGVyID0gaW5wdXQudmFsdWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5uYW1lID09PSAnaGVhZGVyJykge1xuICAgICAgICAgICAgdGFibGUuaGVhZGVyID0gaW5wdXQudmFsdWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5uYW1lID09PSAnZGF0YScpIHtcbiAgICAgICAgICAgIHRhYmxlLmRhdGEgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBvZXBhVGFibGUgPSB0YWJsZS5nYXRoZXJUYWJsZURhdGEodGFibGUuZGF0YSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZXBhVGFibGU7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlRXhwb3J0VmlzaWJsZU9ubHkoKSB7XG4gICAgdGhpcy5leHBvcnRWaXNpYmxlT25seSA9ICF0aGlzLmV4cG9ydFZpc2libGVPbmx5O1xuICB9XG5cbiAgcHVibGljIGV4cG9ydFRvRXhjZWwoKSB7XG4gICAgY29uc3QgZXhwb3J0VGFibGU6IE9lcGFUYWJsZSA9IHRoaXMuZ2F0aGVyVGFibGVEYXRhKHRoaXMuZXhwb3J0VmlzaWJsZU9ubHkgPyB0aGlzLnJvd3MgOiB0aGlzLl9kYXRhKTtcblxuICAgIHRoaXMudGFibGVFeHBvcnRTZXJ2aWNlLmRvd25sb2FkRXhjZWwoZXhwb3J0VGFibGUsIHRoaXMuX2NvbmZpZykuc3Vic2NyaWJlKFxuICAgICAgZGF0YSA9PiB7XG4gICAgICAgIHRoaXMuZmlsZVV0aWxTZXJ2aWNlLmRvd25sb2FkRmlsZShkYXRhLCAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJyk7XG4gICAgICB9LFxuICAgICAgZXJyb3IgPT4gY29uc29sZS5sb2coZXJyb3IpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBleHBvcnRUb0hUTUwoKSB7XG4gICAgY29uc3QgZXhwb3J0VGFibGU6IE9lcGFUYWJsZSA9IHRoaXMuZ2F0aGVyVGFibGVEYXRhKHRoaXMuZXhwb3J0VmlzaWJsZU9ubHkgPyB0aGlzLnJvd3MgOiB0aGlzLl9kYXRhKTtcblxuICAgIC8vIGZvciBub3csIGFsd2F5cyBlbWJlZCBzdWItdGFibGVzICBpbiBIVE1MIHZpZXcuXG4gICAgdGhpcy50YWJsZUV4cG9ydFNlcnZpY2UuZG93bmxvYWRIVE1MKGV4cG9ydFRhYmxlLCB0aGlzLl9jb25maWcpLnN1YnNjcmliZShcbiAgICAgIGRhdGEgPT4ge1xuICAgICAgICB0aGlzLmZpbGVVdGlsU2VydmljZS5kb3dubG9hZEZpbGUoZGF0YSwgJ3RleHQvaHRtbCcpO1xuICAgICAgfSxcbiAgICAgIGVycm9yID0+IGNvbnNvbGUubG9nKGVycm9yKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgb25DdXN0b21CdG5DbGljaygpIHtcbiAgICB0aGlzLmN1c3RvbUJ0bkNsaWNrZWQuZW1pdCgpO1xuICB9XG5cbn1cbiIsIjwhLS0gVW5oaWRlIHNlbGVjdCBpbnB1dCAtIG9ubHkgdmlzaWJsZSBpZiBvbmUgb3IgbW9yZSBjb2x1bW5zIGFyZSBoaWRkZW4gLS0+XG5cbjxmb3JtICpuZ0lmPVwiaGlkZGVuQ29sdW1ucy5sZW5ndGggPiAwXCIgYXJpYS1sYWJlbD1cIlNob3cgaGlkZGVuIGNvbHVtbnNcIj5cbiAgPGRpdiBjbGFzcz1cInJvdyBtYi0yXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29sLWZvcm0tbGFiZWxcIiBbZm9yXT1cInRhYmxlSWQrJ19VbmhpZGVDb2x1bW5TZWxlY3QnXCI+U2hvdyBIaWRkZW4gQ29sdW1uczo8L2xhYmVsPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxuICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgKGNoYW5nZSk9XCJ1bmhpZGVDb2x1bW4oJGFueSgkZXZlbnQpLnRhcmdldC52YWx1ZSlcIiBbaWRdPVwidGFibGVJZCsnX1VuaGlkZUNvbHVtblNlbGVjdCdcIiBhcmlhLWxhYmVsPVwiU2VsZWN0IGNvbHVtbiB0byB1bmhpZGVcIj5cbiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkNob29zZSBhIGNvbHVtbjwvb3B0aW9uPlxuICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb2wgb2YgaGlkZGVuQ29sdW1uc1wiIFt2YWx1ZV09XCJjb2wuaWRcIj57e2NvbC50aXRsZX19PC9vcHRpb24+XG4gICAgICA8L3NlbGVjdD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Zvcm0+XG48IS0tIFRoaXMgaXMgdGhlIHRhYmxlIC0tPlxuPGRpdiBbbmdDbGFzc109XCJjb25maWcuZGl2Q2xhc3NOYW1lIHx8ICcnXCI+XG48dGFibGUgKm5nSWY9XCIhY29uZmlnLmhpZGVUYWJsZVwiIGNsYXNzPVwidGFibGUgZGF0YVRhYmxlXCIgW25nQ2xhc3NdPVwiY29uZmlnLmNsYXNzTmFtZSB8fCAnJ1wiIHJvbGU9XCJ0YWJsZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgYXJpYS1sYWJlbD1cIkRhdGEgdGFibGVcIj5cblxuPCEtLSBUaGlzIGlzIHRoZSB0YWJsZSBoZWFkZXIgLS0+XG48dGhlYWQ+XG4gIDwhLS0gVGhlcmUgbWF5IGJlIG11bHRpcGxlIGhlYWRlciByb3dzIC0tPlxuICA8dHIgKm5nRm9yPVwibGV0IGhkciBvZiBoZWFkZXJSb3dzOyBsZXQgaHI9aW5kZXg7XCIgcm9sZT1cInJvd1wiPlxuICAgIDwhLS0gRGV0YWlscyBpbmRpY2F0b3IgY29sdW1uIChpZiBkYXRhIGhhcyBkZXRhaWxzKSAtLT5cbiAgICA8dGggKm5nSWY9XCJkYXRhSGFzRGV0YWlscyAmJiBociA9PT0gMFwiIFtyb3dTcGFuXT1cImhlYWRlclJvd3MubGVuZ3RoXCIgY2xhc3M9XCJkZXRhaWwtaW5kaWNhdG9yLWNvbFwiIHNjb3BlPVwiY29sXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5Sb3cgZGV0YWlsczwvc3Bhbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rIHAtMFwiIChjbGljayk9XCJ0b2dnbGVBbGxEZXRhaWxzKClcIiBbaWRdPVwidGFibGVJZCsnX1Nob3dBbGxEZXRhaWxzTGluaydcIiBbYXR0ci5hcmlhLXByZXNzZWRdPVwic2hvd0FsbERldGFpbHNcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIihzaG93QWxsRGV0YWlscyA/ICdIaWRlJyA6ICdTaG93JykgKyAnIGRldGFpbHMgZm9yIGFsbCByb3dzJ1wiPlxuICAgICAgICA8aSBjbGFzcz1cImJpXCIgW25nQ2xhc3NdPVwieydiaS1jaGV2cm9uLWRvd24nOiBzaG93QWxsRGV0YWlscywgJ2JpLWNoZXZyb24tcmlnaHQnOiAhc2hvd0FsbERldGFpbHN9XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC90aD5cbiAgICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWNvbHVtbiBbbmdGb3JPZl09XCJoZHIuY29sdW1uc1wiIGxldC1jPVwiaW5kZXhcIj5cbiAgICAgIDwhLS0gSGVhZGVyIGNlbGwgLS0+XG4gICAgICA8dGggKm5nSWY9XCIhY29sdW1uLmhpZGRlblwiIFtuZ0NsYXNzXT1cImNvbHVtbi5jbGFzc05hbWUgfHwgJydcIiBbY29sU3Bhbl09XCJjb2x1bW4uY29sc3BhbiB8fCAxXCIgW3Jvd1NwYW5dPVwiY29sdW1uLnJvd3NwYW4gfHwgMVwiIHNjb3BlPVwiY29sXCI+XG4gICAgICAgIDwhLS0gU2VsZWN0IGFsbCBSb3dzIENoZWNrYm94IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJjb2x1bW4uc2VsZWN0Q29sdW1uXCIgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiYWxsUm93c1NlbGVjdGVkXCIgKGNoYW5nZSk9XCJ0b2dnbGVBbGxSb3dzU2VsZWN0aW9uKClcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidTZWxlY3QgYWxsIHJvd3MnXCI+XG5cbiAgICAgICAgICA8IS0tIEhlYWRlciBjZWxsIHRleHQgd2l0aCBzb3J0IGNhcGFiaWxpdHkgKGlmIHNwZWNpZmllZCkgLS0+XG4gICAgICAgICAgPHNwYW4gW29lcGFUYWJsZVNvcnRpbmddPVwidHJ1ZVwiIFtjb2x1bW5dPVwiY29sdW1uXCIgW3RhYmxlSWRdPVwidGFibGVJZFwiIChzb3J0Q2hhbmdlZCk9XCJvblNvcnRDaGFuZ2VkKCRldmVudClcIiBbaWRdPVwidGFibGVJZCsnX1NvcnRDb2x1bW5MaW5rXycrY29sdW1uLmlkXCIgdGFiaW5kZXg9XCIwXCIgcm9sZT1cImJ1dHRvblwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NvcnQgYnkgJyArIGNvbHVtbi50aXRsZVwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb2x1bW4uc29ydFwiPjxpIGNsYXNzPVwicHVsbC1sZWZ0IGJpXCIgW25nQ2xhc3NdPVwieydiaS1jaGV2cm9uLWRvd24nOiBjb2x1bW4uc29ydCA9PT0gJ2Rlc2MnLCAnYmktY2hldnJvbi11cCc6IGNvbHVtbi5zb3J0ID09PSAnYXNjJ31cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8c3VwICpuZ0lmPVwiY29sdW1uPy5zb3J0SW5kZXggfHwgMCA+IDFcIj57e2NvbHVtbi5zb3J0SW5kZXh9fTwvc3VwPjwvc3Bhbj5cbiAgICAgICAgICAgIHt7Y29sdW1uLnRpdGxlfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPCEtLSBidXR0b24gdG8gYWxsb3cgY29sdW1uIHRvIGJlIGhpZGRlbiAoaWYgc3BlY2lmaWVkKSAtLT5cbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiY29sdW1uLmhpZGRlbiA9PT0gZmFsc2VcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UgZmxvYXQtZW5kXCIgYXJpYS1sYWJlbD1cIkhpZGUgY29sdW1uXCIgKGNsaWNrKT1cImhpZGVDb2x1bW4oY29sdW1uKVwiXG4gICAgICAgICAgICBbaWRdPVwidGFibGVJZCsnX0hpZGVDb2x1bW5MaW5rJysnXycrY29sdW1uLmlkXCI+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gY29sdW1uIGZpbHRlciAoaWYgc3BlY2lmaWVkKSAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIigocm93cyAmJiByb3dzLmxlbmd0aCA+IDApIHx8ICFub0ZpbHRlcnMoKSkgJiYgY29sdW1uLmZpbHRlcmFibGVcIiA+XG4gICAgICAgICAgPGlucHV0IFtvZXBhVGFibGVGaWx0ZXJpbmddPVwieyBmaWx0ZXJTdHJpbmc6ICcnLCBjb2x1bW5JZDogY29sdW1uLmlkIH1cIiBbdGFibGVJZF09XCJ0YWJsZUlkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgaW5wdXQtc21cIiAodGFibGVDaGFuZ2VkKT1cIm9uRmlsdGVyQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtpZF09XCJ0YWJsZUlkKydfRmlsdGVyQ29sdW1uXycrY29sdW1uLmlkXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInRmlsdGVyIGZvciAnICsgY29sdW1uLnRpdGxlXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RoPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvdHI+XG48L3RoZWFkPlxuXG48IS0tIFRoaXMgaXMgdGhlIHRhYmxlIGJvZHkgLS0+XG48dGJvZHk+XG4gIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtcm93IFtuZ0Zvck9mXT1cInJvd3NcIiBsZXQtcj1cImluZGV4XCI+XG4gICAgPCEtLSBEYXRhIFJvdyAtLT5cbiAgICA8dHI+XG4gICAgICA8dGQgKm5nSWY9XCJkYXRhSGFzRGV0YWlsc1wiPlxuICAgICAgICA8IS0tIERldGFpbCBpY29uIChpZiBzcGVjaWZpZWQpIC0tPlxuICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy5zaG93RGV0YWlsID09PSB0cnVlIHx8IHJvdy5zaG93RGV0YWlsID09PSBmYWxzZVwiPlxuICAgICAgICAgIDxpICpuZ0lmPVwicm93LmRldGFpbEljb25DbGFzc05hbWVcIiBbbmdDbGFzc109XCJyb3cuZGV0YWlsSWNvbkNsYXNzTmFtZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGluayBwLTBcIiAoY2xpY2spPVwidG9nZ2xlUm93RGV0YWlsKHJvdylcIiBbaWRdPVwidGFibGVJZCsnX1Nob3dEZXRhaWxMaW5rXycrclwiIFthdHRyLmFyaWEtcHJlc3NlZF09XCJyb3cuc2hvd0RldGFpbFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiKHJvdy5zaG93RGV0YWlsID8gJ0hpZGUnIDogJ1Nob3cnKSArICcgZGV0YWlscyBmb3IgdGhpcyByb3cnXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImJpXCIgW25nQ2xhc3NdPVwieydiaS1jaGV2cm9uLWRvd24nOiByb3cuc2hvd0RldGFpbCwgJ2JpLWNoZXZyb24tcmlnaHQnOiAhcm93LnNob3dEZXRhaWx9XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3RkPlxuICAgICAgPCEtLSBJZiByb3cgaXMgYSBkaXZpZGVyLCBpdCBzcGFucyB0aGUgd2hvbGUgdGFibGUgLS0+XG4gICAgICA8IS0tIDx0ZCAqbmdJZj1cInJvdy5pc0RpdmlkZXJcIiBbY29sU3Bhbl09XCJ2aXNpYmxlQ29sdW1uQ291bnQgKyAoZGF0YUhhc0RldGFpbHMgPyAxIDogMClcIiBbbmdDbGFzc109XCJyb3cuZGl2aWRlckNsYXNzTmFtZSB8fCAnb2VwYS10YWJsZS1ncmF5J1wiPiZuYnNwOzwvdGQ+IC0tPlxuICAgICAgPCEtLSBEYXRhIFJvd3MgLS0+XG4gICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCIhcm93LmlzRGl2aWRlclwiIG5nRm9yIGxldC1jb2wgW25nRm9yT2ZdPVwiZGF0YUNvbHVtbnNcIiBsZXQtaT1cImluZGV4XCI+XG4gICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaGlkZGVuICYmIChyb3d8Y2VsbENvbHNwYW46Y29sKSA+IDBcIiBuZ0NsYXNzPVwie3tyb3d8Y2VsbENsYXNzbmFtZTpjb2wgfHwgJyd9fVwiIFtjb2xTcGFuXT1cInJvd3xjZWxsQ29sc3Bhbjpjb2xcIj5cbiAgICAgICAgICA8IS0tIERhdGEgQ2VsbCAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNvbC5hY3Rpb25Db2x1bW4gJiYgIWNvbC5zZWxlY3RDb2x1bW4gJiYgIWNvbC5zaW5nbGVTZWxlY3RDb2x1bW5cIj5cbiAgICAgICAgICAgIDwhLS0gVGVtcGxhdGUgZm9yIHBvcG92ZXIgMSAtLT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcG9wb3ZlclRlbXBsYXRlPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93LnBvcG92ZXJcIj5cbiAgICAgICAgICAgICAgICA8Y21sLXRlbXBsYXRlIFt0ZW1wbGF0ZUluZm9dPVwicm93LnBvcG92ZXIuY29udGVudFwiPjwvY21sLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8IS0tIFBvcG92ZXIgMSBpY29uIChpZiBzcGVjaWZpZWQpIC0tPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cucG9wb3ZlciAmJiBpID09PSAocm93LnBvcG92ZXJDb2x1bW5JbmRleCB8fCAwKSAmJiByb3cucG9wb3ZlclwiIHRhYmluZGV4PVwiMFwiIFtwb3BvdmVyVGl0bGVdPVwicm93LnBvcG92ZXIudGl0bGVcIiBbcG9wb3Zlcl09XCJwb3BvdmVyVGVtcGxhdGVcIlxuICAgICAgICAgICAgICBbY29udGFpbmVyQ2xhc3NdPVwicm93LnBvcG92ZXIuY29udGFpbmVyQ2xhc3NcIiBwbGFjZW1lbnQ9XCJyaWdodFwiIFt0cmlnZ2Vyc109XCJyb3cucG9wb3Zlci50cmlnZ2VyIHx8ICdtb3VzZWVudGVyOm1vdXNlbGVhdmUnXCI+XG4gICAgICAgICAgICAgIDxpIFtuZ0NsYXNzXT1cInJvdy5wb3BvdmVyLmNsYXNzTmFtZVwiIFtpZF09XCJ0YWJsZUlkKydfUG9wb3ZlckxpbmtfJytyXCI+PC9pPlxuICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICA8IS0tIFRlbXBsYXRlIGZvciBwb3BvdmVyIDIgLS0+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BvcG92ZXIyVGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3cucG9wb3ZlcjJcIj5cbiAgICAgICAgICAgICAgICA8Y21sLXRlbXBsYXRlIFt0ZW1wbGF0ZUluZm9dPVwicm93LnBvcG92ZXIyLmNvbnRlbnRcIj48L2NtbC10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPCEtLSBQb3BvdmVyIDIgaWNvbiAoaWYgc3BlY2lmaWVkKSAtLT5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaSA9PT0gKHJvdy5wb3BvdmVyMkNvbHVtbkluZGV4IHx8IDApICYmIHJvdy5wb3BvdmVyMlwiIHRhYmluZGV4PVwiMFwiIFtwb3BvdmVyVGl0bGVdPVwicm93LnBvcG92ZXIyLnRpdGxlXCIgW3BvcG92ZXJdPVwicG9wb3ZlcjJUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgIFtjb250YWluZXJDbGFzc109XCJyb3cucG9wb3ZlcjIuY29udGFpbmVyQ2xhc3NcIiBwbGFjZW1lbnQ9XCJyaWdodFwiIFt0cmlnZ2Vyc109XCJyb3cucG9wb3ZlcjIudHJpZ2dlciB8fCAnbW91c2VlbnRlcjptb3VzZWxlYXZlJ1wiPlxuICAgICAgICAgICAgICA8aSBbbmdDbGFzc109XCJyb3cucG9wb3ZlcjIuY2xhc3NOYW1lXCIgW2lkXT1cInRhYmxlSWQrJ19Qb3BvdmVyMkxpbmtfJytyXCI+PC9pPlxuICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICA8IS0tIFRlbXBsYXRlIGZvciBwb3BvdmVyIDMgLS0+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BvcG92ZXIzVGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3cucG9wb3ZlcjNcIj5cbiAgICAgICAgICAgICAgICA8Y21sLXRlbXBsYXRlIFt0ZW1wbGF0ZUluZm9dPVwicm93LnBvcG92ZXIzLmNvbnRlbnRcIj48L2NtbC10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPCEtLSBQb3BvdmVyIDMgaWNvbiAoaWYgc3BlY2lmaWVkKSAtLT5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaSA9PT0gKHJvdy5wb3BvdmVyM0NvbHVtbkluZGV4IHx8IDApICYmIHJvdy5wb3BvdmVyM1wiIHRhYmluZGV4PVwiMFwiIFtwb3BvdmVyVGl0bGVdPVwicm93LnBvcG92ZXIzLnRpdGxlXCIgW3BvcG92ZXJdPVwicG9wb3ZlcjNUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgIFtjb250YWluZXJDbGFzc109XCJyb3cucG9wb3ZlcjMuY29udGFpbmVyQ2xhc3NcIiBwbGFjZW1lbnQ9XCJyaWdodFwiIFt0cmlnZ2Vyc109XCJyb3cucG9wb3ZlcjMudHJpZ2dlciB8fCAnbW91c2VlbnRlcjptb3VzZWxlYXZlJ1wiPlxuICAgICAgICAgICAgICA8aSBbbmdDbGFzc109XCJyb3cucG9wb3ZlcjMuY2xhc3NOYW1lXCIgW2lkXT1cInRhYmxlSWQrJ19Qb3BvdmVyM0xpbmtfJytyXCI+PC9pPlxuICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cInJvd3xjZWxsSW5uZXJIVE1MOmNvbFwiIFtpbm5lckhUTUxdPVwicm93fGNlbGxJbm5lckhUTUw6Y29sXCI+PC9kaXY+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiEocm93fGNlbGxJbm5lckhUTUw6Y29sKVwiPnt7cm93fGNlbGxWYWx1ZTpjb2x9fTwvc3Bhbj4gLS0+XG5cbiAgICAgICAgICAgIDwhLS0gSWYgY29sIGlzIGh5cGVybGluaywgZGlzcGxheSBkYXRhIGFzIGEgaHlwZXJsaW5rIC0tPlxuICAgICAgICAgICAgPGEgKm5nSWY9XCJjb2wuaHlwZXJsaW5rXCIgIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCIgKGNsaWNrKT1cImNlbGxDbGljayhyb3csIGNvbC5pZClcIiBbaWRdPVwidGFibGVJZCsnX0NlbGxDbGlja18nK3IrJ18nK2lcIiB0YWJpbmRleD1cIjBcIiByb2xlPVwiYnV0dG9uXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInQWN0aXZhdGUgJyArIChjb2wudGl0bGUgfHwgJ2NlbGwnKVwiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiEocm93fGNlbGxJbm5lckhUTUw6Y29sKVwiPlxuICAgICAgICAgICAgICAgIDxpIFtuZ0NsYXNzXT1cInJvd3xjZWxsSWNvbkNsYXNzbmFtZTpjb2xcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3d8Y2VsbEltZ1NyYzpjb2xcIj48aW1nIFtzcmNdPVwicm93fGNlbGxJbWdTcmM6Y29sXCIgYWx0PVwiXCIvPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICB7e3Jvd3xjZWxsVmFsdWU6Y29sfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93fGNlbGxJbm5lckhUTUw6Y29sXCIgW2lubmVySFRNTF09XCJyb3d8Y2VsbElubmVySFRNTDpjb2xcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwhLS0gSWYgY29sIGlzIE5PVCBoeXBlcmxpbmssIGp1c3QgZGlzcGxheSBkYXRhIC0tPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhY29sLmh5cGVybGlua1wiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiEocm93fGNlbGxJbm5lckhUTUw6Y29sKVwiPlxuICAgICAgICAgICAgICAgIDxpIG5nQ2xhc3M9XCJ7e3Jvd3xjZWxsSWNvbkNsYXNzbmFtZTpjb2wgfHwgJyd9fVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd3xjZWxsSW1nU3JjOmNvbFwiPjxpbWcgW3NyY109XCJyb3d8Y2VsbEltZ1NyYzpjb2xcIiBhbHQ9XCJcIi8+PC9zcGFuPlxuICAgICAgICAgICAgICAgIHt7cm93fGNlbGxWYWx1ZTpjb2x9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3d8Y2VsbElubmVySFRNTDpjb2xcIiBbaW5uZXJIVE1MXT1cInJvd3xjZWxsSW5uZXJIVE1MOmNvbFwiPjwvZGl2PlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gU2VsZWN0IENlbGwgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC5zZWxlY3RDb2x1bW5cIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICA8aW5wdXQgW2lkXT1cInRhYmxlSWQrJ18nK3JcIiB0eXBlPVwiY2hlY2tib3hcIiBbZGlzYWJsZWRdPVwiIXJvdy5zZWxlY3RhYmxlXCIgW2NoZWNrZWRdPVwicm93LnNlbGVjdGVkXCIgKGNoYW5nZSk9XCJ0b2dnbGVSb3dTZWxlY3Rpb24ocm93KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjdCByb3cgJyArIChyKzEpXCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBTaW5nbGUgU2VsZWN0IENlbGwgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC5zaW5nbGVTZWxlY3RDb2x1bW5cIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICA8aW5wdXQgW2lkXT1cInRhYmxlSWQrJ19zaW5nbGVTZWxlY3RfJytyXCIgdHlwZT1cInJhZGlvXCIgW2Rpc2FibGVkXT1cIiFyb3cuc2VsZWN0YWJsZVwiIFtjaGVja2VkXT1cInJvdy5zZWxlY3RlZFwiIChjaGFuZ2UpPVwic2luZ2xlUm93U2VsZWN0aW9uKHJvdylcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidTZWxlY3Qgcm93ICcgKyAocisxKVwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gQWN0aW9uIEJ1dHRvbiBDZWxsIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuYWN0aW9uQ29sdW1uICYmIHJvdy5hY3Rpb25zXCI+XG4gICAgICAgICAgICA8b2VwYS1hY3Rpb24tYnRuIFthY3Rpb25zXT1cInJvdy5hY3Rpb25zXCIgW2RhdGFdPVwicm93LmRhdGFTb3VyY2VcIiAgKGFjdGlvbkNsaWNrZWQpPVwib25BY3Rpb25DbGljaygkZXZlbnQpXCIgW2J0bklkXT1cInRhYmxlSWQrJ18nK3JcIiAoZHJvcGRvd25PcGVuQ2hhbmdlKT1cIm9uRHJvcGRvd25PcGVuQ2hhbmdlKCRldmVudClcIj48L29lcGEtYWN0aW9uLWJ0bj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC90cj5cblxuICAgIDwhLS0gRGV0YWlsIFJvdyAtLT5cbiAgICA8dHIgKm5nSWY9XCJyb3cuc2hvd0RldGFpbFwiIGNsYXNzPVwidGFibGUtaW5mb1wiPlxuICAgICAgPHRkIFtjb2xTcGFuXT1cInZpc2libGVDb2x1bW5Db3VudCArIChkYXRhSGFzRGV0YWlscyA/IDEgOiAwKVwiPlxuICAgICAgICA8Y21sLXRlbXBsYXRlIFt0ZW1wbGF0ZUluZm9dPVwicm93LmRldGFpbFwiPjwvY21sLXRlbXBsYXRlPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICA8L25nLXRlbXBsYXRlPlxuICA8dHIgKm5nSWY9XCJ0b3RhbFJvd1wiPlxuICAgIDx0ZCAqbmdJZj1cImRhdGFIYXNEZXRhaWxzXCI+XG4gICAgPC90ZD5cbiAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtdG90YWxDb2wgW25nRm9yT2ZdPVwiZGF0YUNvbHVtbnNcIj5cbiAgICAgICAgICA8dGQgKm5nSWY9XCIhdG90YWxDb2wuaGlkZGVuXCIgbmdDbGFzcz1cInt7dG90YWxSb3d8Y2VsbENsYXNzbmFtZTp0b3RhbENvbCB8fCAnJ319XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgPHNwYW4+PGkgbmdDbGFzcz1cInt7dG90YWxSb3d8Y2VsbEljb25DbGFzc25hbWU6dG90YWxDb2wgfHwgJyd9fVwiPjwvaT57e3RvdGFsUm93fGNlbGxWYWx1ZTp0b3RhbENvbH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvdHI+XG48L3Rib2R5PlxuPC90YWJsZT5cbjwvZGl2PlxuPCEtLSBUYWJsZSBmb290ZXIgLS0+XG48Zm9ybSAqbmdJZj1cIiFjb25maWcuaGlkZUZvb3RlciB8fCAoZGF0YSAmJiBwYWdlSW5mby5pdGVtc1BlclBhZ2UgPCBkYXRhLmxlbmd0aClcIiBjbGFzcz1cImZvcm0taG9yaXpvbnRhbFwiPlxuPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93IHRleHQtcmlnaHRcIj5cbiAgPCEtLSBUYWJsZS13aWRlIGZpbHRlciAtLT5cbiAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCI+XG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgIDxpbnB1dCAqbmdJZj1cIiFjb25maWcuaGlkZUdsb2JhbEZpbHRlclwiIHBsYWNlaG9sZGVyPVwiRmlsdGVyIGFsbCBjb2x1bW5zXCIgW29lcGFUYWJsZUZpbHRlcmluZ109XCJ7IGZpbHRlclN0cmluZzogJycgfVwiIFt0YWJsZUlkXT1cInRhYmxlSWRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBpbnB1dC1zbVwiICh0YWJsZUNoYW5nZWQpPVwib25GaWx0ZXJDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgIFtpZF09XCJ0YWJsZUlkKydfRmlsdGVyQWxsQ29sdW1uc0lucHV0J1wiIGFyaWEtbGFiZWw9XCJGaWx0ZXIgYWxsIGNvbHVtbnMgaW4gdGFibGVcIiB0eXBlPVwic2VhcmNoXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiY29uZmlnLnNob3dSb3dDb3VudEluRm9vdGVyICYmIF9kYXRhICYmIF9kYXRhLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICB7e19kYXRhLmxlbmd0aH19Jm5ic3A7dG90YWwgcm93c1xuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDwhLS0gRXhwb3J0IEJ1dHRvbnMgLS0+XG4gIDxkaXYgY2xhc3M9XCJjb2wtc20tNCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJjb25maWcuZXhwb3J0VG9FeGNlbFwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1yLTFcIiAoY2xpY2spPVwiZXhwb3J0VG9FeGNlbCgpXCIgW2lkXT1cInRhYmxlSWQrJ19FeHBvcnRUb0V4Y2VsQnRuJ1wiIGFyaWEtbGFiZWw9XCJFeHBvcnQgdG8gRXhjZWxcIj5FeHBvcnQgdG8gRXhjZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJjb25maWcuZXhwb3J0VG9IVE1MXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXItMVwiIChjbGljayk9XCJleHBvcnRUb0hUTUwoKVwiIFtpZF09XCJ0YWJsZUlkKydfRXhwb3J0VG9IVE1MQnRuJ1wiIGFyaWEtbGFiZWw9XCJFeHBvcnQgdG8gSFRNTFwiPkV4cG9ydCB0byBIVE1MPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJjdXN0b21CdG5WaXNpYmxlXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1yLTFcIiAoY2xpY2spPVwib25DdXN0b21CdG5DbGljaygpXCIgW2lkXT1cInRhYmxlSWQrJ19DdXN0b21CdG4nXCIgW2Rpc2FibGVkXT1cIiFjdXN0b21CdG5FbmFibGVkXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJjdXN0b21CdG5MYWJlbFwiPnt7Y3VzdG9tQnRuTGFiZWx9fTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnLmV4cG9ydFRvRXhjZWwgfHwgY29uZmlnLmV4cG9ydFRvSFRNTFwiIGNsYXNzPVwiY29sLXNtLTEyIHRleHQtY2VudGVyXCI+XG4gICAgICAgIDxzcGFuPkV4cG9ydCBvbmx5IHZpc2libGUgZGF0YTombmJzcDtcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiZXhwb3J0VmlzaWJsZU9ubHlcIiAoY2xpY2spPVwidG9nZ2xlRXhwb3J0VmlzaWJsZU9ubHkoKVwiIGlkPVwiZXhwb3J0VmlzaWJsZU9ubHlDaGVja2JveFwiIGFyaWEtbGFiZWw9XCJFeHBvcnQgb25seSB2aXNpYmxlIGRhdGFcIi8+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPCEtLSBQYWdpbmF0aW9uIC0tPlxuICA8ZGl2ICpuZ0lmPVwiIWNvbmZpZy5kaXNhYmxlUGFnaW5hdGlvblwiIGNsYXNzPVwiY29sLXNtLTQgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICA8cGFnaW5hdGlvbiAqbmdJZj1cInBhZ2luYXRpb25PblwiIGNsYXNzPVwicGFnaW5hdGlvbi1zbVwiIFt0b3RhbEl0ZW1zXT1cInBhZ2VJbmZvLmxlbmd0aFwiIFtpdGVtc1BlclBhZ2VdPVwicGFnZUluZm8uaXRlbXNQZXJQYWdlXCIgW21heFNpemVdPVwicGFnZUluZm8ubWF4U2l6ZVwiXG4gICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnRQYWdlXCIgbmFtZT1cImN1cnJlbnRUYWJsZVBhZ2VcIlxuICAgICAgW2JvdW5kYXJ5TGlua3NdPVwidHJ1ZVwiIFtyb3RhdGVdPVwiZmFsc2VcIiAocGFnZUNoYW5nZWQpPVwib25QYWdlQ2hhbmdlZCgkZXZlbnQpXCIgKG51bVBhZ2VzKT1cInBhZ2VJbmZvLm51bVBhZ2VzID0gJGV2ZW50XCJcbiAgICAgIGFyaWEtbGFiZWw9XCJUYWJsZSBwYWdpbmF0aW9uXCI+XG4gICAgPC9wYWdpbmF0aW9uPlxuICAgICZuYnNwO1xuICAgIDxidXR0b24gKGNsaWNrKT1cInRvZ2dsZVBhZ2luZ2F0aW9uKClcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIG1yLTFcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInBhZ2luYXRpb25PbiA/ICdTaG93IEFsbCBSb3dzJyA6ICdSZXN0b3JlIFBhZ2luYXRpb24nXCI+e3sgcGFnaW5hdGlvbk9uID8gJ1Nob3cgQWxsIFJvd3MnIDogJ1Jlc3RvcmUgUGFnaW5hdGlvbid9fTwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuPC9mb3JtPiJdfQ==
840
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2VwYS11aS1saWIvc3JjL2xpYi90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyQjNGLE1BQU0sT0FBTyxjQUFjO0lBbUxFO0lBQ2pCO0lBQ0E7SUFDQTtJQUNBO0lBdExILGFBQWEsR0FBWSxLQUFLLENBQUM7SUFDL0IsVUFBVSxHQUEyQixFQUFFLENBQUM7SUFDeEMsSUFBSSxHQUF3QixFQUFFLENBQUM7SUFDL0Isa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDbkIsaUJBQWlCLEdBQXdCLEtBQUssQ0FBQztJQUV0RCwwQ0FBMEM7SUFDbkMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLDJFQUEyRTtJQUNwRSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7SUFFdkIsV0FBVyxHQUEyQixFQUFFLENBQUM7SUFDekMsYUFBYSxHQUEyQixFQUFFLENBQUM7SUFDM0MsYUFBYSxHQUFrQixFQUFFLENBQUM7SUFDbEMsS0FBSyxHQUF3QixFQUFFLENBQUM7SUFDL0IsT0FBTyxHQUFvQixFQUFFLENBQUM7SUFDOUIsY0FBYyxHQUEyQixDQUFDO1lBQ2hELFlBQVksRUFBRSxFQUFFO1lBQ2hCLFFBQVEsRUFBRSxTQUFTO1NBQ3BCLENBQUMsQ0FBQztJQUVJLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUV2QixlQUFlLEdBQUcs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SUFDL0IsQ0FBQzt3R0FsMUJVLGNBQWM7NEZBQWQsY0FBYyx1ZEMzQjNCLGdoYkEwTjhIOzs0RkQvTGpILGNBQWM7a0JBTDFCLFNBQVM7K0JBQ0UsWUFBWTt3TUEwQ2IsT0FBTztzQkFBZixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBR0ssTUFBTTtzQkFEaEIsS0FBSztnQkFvQkssYUFBYTtzQkFEdkIsS0FBSztnQkFjSyxNQUFNO3NCQURoQixLQUFLO2dCQVdHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHVyxXQUFXO3NCQUEzQixNQUFNO2dCQUNVLGFBQWE7c0JBQTdCLE1BQU07Z0JBQ1UsV0FBVztzQkFBM0IsTUFBTTtnQkFDVSxnQkFBZ0I7c0JBQWhDLE1BQU07Z0JBK0RJLElBQUk7c0JBRGQsS0FBSztnQkF1QkcsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcblxuaW1wb3J0IHsgT2VwYVRhYmxlIH0gZnJvbSAnLi9vZXBhLXRhYmxlJztcbmltcG9ydCB7IE9lcGFUYWJsZUNvbmZpZyB9IGZyb20gJy4vb2VwYS10YWJsZS1jb25maWcnO1xuaW1wb3J0IHsgT2VwYVRhYmxlSGVhZGVyIH0gZnJvbSAnLi9vZXBhLXRhYmxlLWhlYWRlcic7XG5pbXBvcnQgeyBPZXBhVGFibGVDb2x1bW4gfSBmcm9tICcuL29lcGEtdGFibGUtY29sdW1uJztcbmltcG9ydCB7IE9lcGFUYWJsZVJvdyB9IGZyb20gJy4vb2VwYS10YWJsZS1yb3cnO1xuaW1wb3J0IHsgT2VwYVRhYmxlQ2VsbCB9IGZyb20gJy4vb2VwYS10YWJsZS1jZWxsJztcbmltcG9ydCB7IE9lcGFUYWJsZUZpbHRlciB9IGZyb20gJy4vb2VwYS10YWJsZS1maWx0ZXInO1xuaW1wb3J0IHsgT2VwYVRhYmxlUGFnZUluZm8gfSBmcm9tICcuL29lcGEtdGFibGUtcGFnZS1pbmZvJztcbmltcG9ydCB7IE9lcGFUYWJsZUNlbGxDbGlja0V2ZW50IH0gZnJvbSAnLi9vZXBhLXRhYmxlLWNlbGwtY2xpY2stZXZlbnQnO1xuXG5pbXBvcnQgeyBPZXBhQWN0aW9uRXZlbnQgfSBmcm9tICcuLi9hY3Rpb24tYnRuL29lcGEtYWN0aW9uLWV2ZW50JztcblxuaW1wb3J0IHsgVGFibGVFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi90YWJsZS1leHBvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBPZXBhVGVtcGxhdGVJbmZvIH0gZnJvbSAnQG9oaW9lcGEvb2VwYS1jb21tb24tbGliJztcbmltcG9ydCB7IFRhYmxlU2VydmljZSB9IGZyb20gJy4vdGFibGUuc2VydmljZSc7XG5pbXBvcnQgeyBPZXBhVGFibGVTb3J0Q3JpdGVyaW9uIH0gZnJvbSAnLi9vZXBhLXRhYmxlLXNvcnQtY3JpdGVyaW9uJztcbmltcG9ydCB7IFBhZ2VDaGFuZ2VkRXZlbnQgfSBmcm9tICduZ3gtYm9vdHN0cmFwL3BhZ2luYXRpb24nO1xuaW1wb3J0IHsgT2VwYUZpbGVVdGlsU2VydmljZSB9IGZyb20gJ0BvaGlvZXBhL29lcGEtY29tbW9uLWxpYic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29lcGEtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwdWJsaWMgc2hvd0ZpbHRlclJvdzogQm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaGVhZGVyUm93czogQXJyYXk8T2VwYVRhYmxlSGVhZGVyPiA9IFtdO1xuICBwdWJsaWMgcm93czogQXJyYXk8T2VwYVRhYmxlUm93PiA9IFtdO1xuICBwdWJsaWMgdmlzaWJsZUNvbHVtbkNvdW50ID0gMDtcbiAgcHVibGljIGFsbENvbHVtbkNvdW50ID0gMDtcbiAgcHVibGljIGV4cG9ydFZpc2libGVPbmx5OiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2U7XG5cbiAgLyoqIFRydWUgaWYgYW55IGFjdGlvbiBkcm9wZG93biBpcyBvcGVuICovXG4gIHB1YmxpYyBpc0FueUFjdGlvbkRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAvKiogRHluYW1pYyBzcGFjZXIgaGVpZ2h0IHVzZWQgdG8gYXZvaWQgY2xpcHBpbmcgaW5zaWRlIGV4cGFuc2lvbiBwYW5lbHMgKi9cbiAgcHVibGljIGFjdGlvbkZpbGxlckhlaWdodCA9IDA7XG5cbiAgcHVibGljIGRhdGFDb2x1bW5zOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+ID0gW107XG4gIHB1YmxpYyBoaWRkZW5Db2x1bW5zOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+ID0gW107XG4gIHB1YmxpYyBjb2x1bW5IZWFkZXJzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIHB1YmxpYyBfZGF0YTogQXJyYXk8T2VwYVRhYmxlUm93PiA9IFtdO1xuICBwcml2YXRlIF9jb25maWc6IE9lcGFUYWJsZUNvbmZpZyA9IHt9O1xuICBwcml2YXRlIGN1cnJlbnRGaWx0ZXJzOiBBcnJheTxPZXBhVGFibGVGaWx0ZXI+ID0gW3tcbiAgICBmaWx0ZXJTdHJpbmc6ICcnLFxuICAgIGNvbHVtbklkOiB1bmRlZmluZWRcbiAgfV07XG5cbiAgcHVibGljIGRhdGFIYXNEZXRhaWxzID0gZmFsc2U7XG4gIHB1YmxpYyBzaG93QWxsRGV0YWlscyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBhbGxSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcblxuICBwdWJsaWMgcGFnZUluZm86IE9lcGFUYWJsZVBhZ2VJbmZvID0ge1xuICAgIHBhZ2U6IDEsXG4gICAgaXRlbXNQZXJQYWdlOiAxMCxcbiAgICBtYXhTaXplOiA1LFxuICAgIG51bVBhZ2VzOiAxLFxuICAgIGxlbmd0aDogMFxuICB9O1xuICBwdWJsaWMgY3VycmVudFBhZ2UgPSAxO1xuICBwdWJsaWMgcGFnaW5hdGlvbk9uID0gdHJ1ZTtcblxuICBASW5wdXQoKSB0YWJsZUlkID0gJyc7XG4gIEBJbnB1dCgpIGFkZEFjdGlvbkZpbGxlciA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgY29uZmlnKGNvbmY6IE9lcGFUYWJsZUNvbmZpZykge1xuICAgIGlmICghY29uZi5jbGFzc05hbWUpIHtcbiAgICAgIGNvbmYuY2xhc3NOYW1lID0gJ3RhYmxlLXN0cmlwZWQgdGFibGUtYm9yZGVyZWQnO1xuICAgIH1cbiAgICBpZiAoY29uZi5jbGFzc05hbWVzKSB7XG4gICAgICBjb25mLmNsYXNzTmFtZSA9IGNvbmYuY2xhc3NOYW1lcy5qb2luKCcgJyk7XG4gICAgfVxuICAgIGlmIChjb25mLnJvd3NQZXJQYWdlKSB7XG4gICAgICB0aGlzLnBhZ2VJbmZvLml0ZW1zUGVyUGFnZSA9IGNvbmYucm93c1BlclBhZ2U7XG4gICAgfVxuICAgIHRoaXMuZXhwb3J0VmlzaWJsZU9ubHkgPSBjb25mLmV4cG9ydFZpc2libGVPbmx5O1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmY7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbmZpZygpOiBPZXBhVGFibGVDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGNvbXBsZXhIZWFkZXIoaGRyczogQXJyYXk8T2VwYVRhYmxlSGVhZGVyPikge1xuICAgIHRoaXMucmVzZXRIZWFkZXJzKCk7XG4gICAgaWYgKGhkcnMgJiYgaGRycy5sZW5ndGgpIHtcbiAgICAgIGhkcnMuZm9yRWFjaCgoaGRyOiBPZXBhVGFibGVIZWFkZXIpID0+IHtcbiAgICAgICAgdGhpcy5oZWFkZXJSb3dzLnB1c2godGhpcy5leHRyYWN0SW5uZXJDb2x1bW5zKGhkci5jb2x1bW5zKSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY29sdW1uSGVhZGVycyA9IHRoaXMuZXh0cmFjdENvbHVtbkhlYWRlcnModGhpcy5oZWFkZXJSb3dzKTtcbiAgICAgIHRoaXMuZGF0YUNvbHVtbnMgPSB0aGlzLmV4dHJhY3REYXRhQ29sdW1ucyh0aGlzLmhlYWRlclJvd3MpO1xuICAgICAgdGhpcy5pbml0aWFsaXplSGlkZGVuQ29sdW1ucyh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGhlYWRlcihoZHI6IE9lcGFUYWJsZUhlYWRlcikge1xuICAgIHRoaXMucmVzZXRIZWFkZXJzKCk7XG4gICAgaWYgKGhkci5jb2x1bW5zICYmIGhkci5jb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaGVhZGVyUm93cy5wdXNoKHRoaXMuZXh0cmFjdElubmVyQ29sdW1ucyhoZHIuY29sdW1ucykpO1xuICAgIH1cbiAgICB0aGlzLmNvbHVtbkhlYWRlcnMgPSB0aGlzLmV4dHJhY3RDb2x1bW5IZWFkZXJzKHRoaXMuaGVhZGVyUm93cyk7XG4gICAgdGhpcy5kYXRhQ29sdW1ucyA9IHRoaXMuZXh0cmFjdERhdGFDb2x1bW5zKHRoaXMuaGVhZGVyUm93cyk7XG4gICAgdGhpcy5pbml0aWFsaXplSGlkZGVuQ29sdW1ucyhmYWxzZSk7XG4gIH1cblxuICBASW5wdXQoKSBjdXN0b21CdG5MYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBASW5wdXQoKSBjdXN0b21CdG5WaXNpYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGN1c3RvbUJ0bkVuYWJsZWQgPSBmYWxzZTtcblxuICAvLyBPdXRwdXRzIChFdmVudHMpXG4gIEBPdXRwdXQoKSBwdWJsaWMgY2VsbENsaWNrZWQ6IEV2ZW50RW1pdHRlcjxPZXBhVGFibGVDZWxsQ2xpY2tFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgYWN0aW9uQ2xpY2tlZDogRXZlbnRFbWl0dGVyPE9lcGFBY3Rpb25FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgcm93U2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxBcnJheTxPZXBhVGFibGVSb3c+PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBjdXN0b21CdG5DbGlja2VkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJpdmF0ZSByZXNldEhlYWRlcnMoKSB7XG4gICAgdGhpcy5oZWFkZXJSb3dzID0gW107XG4gICAgdGhpcy5jb2x1bW5IZWFkZXJzID0gW107XG4gICAgdGhpcy5kYXRhQ29sdW1ucyA9IFtdO1xuICAgIHRoaXMuaGlkZGVuQ29sdW1ucyA9IFtdO1xuICB9XG5cbiAgLyoqIENhbGxlZCB3aGVuIGFueSBvZXBhLWFjdGlvbi1idG4gZHJvcGRvd24gb3Blbi9jbG9zZSBjaGFuZ2VzICovXG4gIG9uRHJvcGRvd25PcGVuQ2hhbmdlKGlzT3BlbjogYm9vbGVhbikge1xuICAgIC8vIFdhaXQgZm9yIERPTSBjbGFzcyB1cGRhdGVzIGZyb20gZHJvcGRvd24gZGlyZWN0aXZlIGJlZm9yZSBtZWFzdXJpbmcuXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZURyb3Bkb3duRmlsbGVyU3RhdGUoKSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURyb3Bkb3duRmlsbGVyU3RhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IG9wZW5NZW51cyA9IEFycmF5LmZyb20oaG9zdC5xdWVyeVNlbGVjdG9yQWxsKCcub2VwYS1hY3Rpb24tbWVudS5zaG93JykpIGFzIEhUTUxFbGVtZW50W107XG4gICAgdGhpcy5pc0FueUFjdGlvbkRyb3Bkb3duT3BlbiA9IG9wZW5NZW51cy5sZW5ndGggPiAwO1xuXG4gICAgaWYgKCF0aGlzLmFkZEFjdGlvbkZpbGxlciB8fCAhdGhpcy5pc0FueUFjdGlvbkRyb3Bkb3duT3Blbikge1xuICAgICAgdGhpcy5hY3Rpb25GaWxsZXJIZWlnaHQgPSAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhbmVsQ29udGVudCA9IGhvc3QuY2xvc2VzdCgnLm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBsZXQgbWF4T3ZlcmZsb3cgPSAwO1xuXG4gICAgb3Blbk1lbnVzLmZvckVhY2goKG1lbnUpID0+IHtcbiAgICAgIGNvbnN0IG1lbnVSZWN0ID0gbWVudS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IG92ZXJmbG93ID0gcGFuZWxDb250ZW50XG4gICAgICAgID8gbWVudVJlY3QuYm90dG9tIC0gcGFuZWxDb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbVxuICAgICAgICA6IG1lbnVSZWN0LmJvdHRvbSAtIHdpbmRvdy5pbm5lckhlaWdodDtcblxuICAgICAgaWYgKG92ZXJmbG93ID4gbWF4T3ZlcmZsb3cpIHtcbiAgICAgICAgbWF4T3ZlcmZsb3cgPSBvdmVyZmxvdztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEFkZCBzbWFsbCBjdXNoaW9uIHNvIGJvcmRlci9zaGFkb3cgYXJlIGZ1bGx5IHZpc2libGUuXG4gICAgdGhpcy5hY3Rpb25GaWxsZXJIZWlnaHQgPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwobWF4T3ZlcmZsb3cpICsgMTYpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplSGlkZGVuQ29sdW1ucyhjb21wbGV4SGVhZGVyOiBib29sZWFuKSB7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1uQ291bnQgPSAwO1xuICAgIHRoaXMuYWxsQ29sdW1uQ291bnQgPSAwO1xuICAgIHRoaXMuZGF0YUNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICBpZiAoY29tcGxleEhlYWRlciAmJiAoY29sdW1uPy5oaWRkZW4gPT09IHRydWUgfHwgY29sdW1uPy5oaWRkZW4gPT09IGZhbHNlKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdkaXNhYmxpbmcgaGlkZGVuIGF0dHJpYnV0ZSBmb3IgY29sdW1uOiAnICsgY29sdW1uLmlkICtcbiAgICAgICAgICAnLiBIaWRkZW4gY29sdW1ucyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgY29tcGxleCBoZWFkZXJzICh5ZXQpLicpO1xuICAgICAgICBjb2x1bW4uaGlkZGVuID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5Db3VudCsrO1xuICAgICAgfSBlbHNlIGlmIChjb2x1bW4/LmhpZGRlbiA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLmhpZGRlbkNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52aXNpYmxlQ29sdW1uQ291bnQrKztcbiAgICAgIH1cbiAgICAgIHRoaXMuYWxsQ29sdW1uQ291bnQrKztcbiAgICB9KTtcbiAgICAvLyBjb25zb2xlLmxvZygndmlzaWJsZUNvbHVtbkNvdW50ID0gJyArIHRoaXMudmlzaWJsZUNvbHVtbkNvdW50KTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGF0YSh2YWx1ZXM6IEFycmF5PE9lcGFUYWJsZVJvdz4pIHtcbiAgICBpZiAoIXRoaXMuX2RhdGEgfHwgdGhpcy5fZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX2RhdGEgPSB0aGlzLnRhYmxlU2VydmljZS5nZXREYXRhKHRoaXMudGFibGVJZCkgfHwgW107XG4gICAgfVxuICAgIGlmICh2YWx1ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlc1tpXS5wcml2YXRlSWQgPSBpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2RhdGEgJiYgdGhpcy5fZGF0YS5sZW5ndGggIT09IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UuY2xlYXJQYWdlSW5mbyh0aGlzLnRhYmxlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2RhdGEgPSB2YWx1ZXM7XG4gICAgdGhpcy50YWJsZVNlcnZpY2Uuc2V0RGF0YSh0aGlzLnRhYmxlSWQsIHRoaXMuX2RhdGEpO1xuICAgIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBBcnJheTxPZXBhVGFibGVSb3c+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5tYXAoeCA9PiBPYmplY3QuYXNzaWduKHt9LCB4KSk7XG4gIH1cblxuICBASW5wdXQoKSB0b3RhbFJvdzogT2VwYVRhYmxlUm93IHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSB0YWJsZVNlcnZpY2U6IFRhYmxlU2VydmljZSxcbiAgICBwcml2YXRlIHRhYmxlRXhwb3J0U2VydmljZTogVGFibGVFeHBvcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmlsZVV0aWxTZXJ2aWNlOiBPZXBhRmlsZVV0aWxTZXJ2aWNlKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnBhZ2luYXRpb25PbiA9ICF0aGlzLl9jb25maWcuZGlzYWJsZVBhZ2luYXRpb247XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RJbm5lckNvbHVtbnMoaW5uZXI6IEFycmF5PE9lcGFUYWJsZUNvbHVtbj4pOiBPZXBhVGFibGVIZWFkZXIge1xuICAgIGNvbnN0IGhlYWRlcjogT2VwYVRhYmxlSGVhZGVyID0geyBjb2x1bW5zOiBbXSB9O1xuICAgIGlubmVyLmZvckVhY2goKHZhbHVlOiBPZXBhVGFibGVDb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGhlYWRlci5jb2x1bW5zLmZpbmQoKGNvbDogT2VwYVRhYmxlQ29sdW1uKSA9PiBjb2wuaWQgPT09IHZhbHVlLmlkKTtcbiAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgLy8gb3ZlcndyaXRlIHJlcGVhdGVkIGNvbHVtblxuICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbiwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgaGVhZGVyLmNvbHVtbnMucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGhlYWRlcjtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdENvbHVtbkhlYWRlcnMoaGVhZGVyUm93czogQXJyYXk8T2VwYVRhYmxlSGVhZGVyPik6IEFycmF5PHN0cmluZz4ge1xuICAgIGNvbnN0IGhlYWRlcnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBsZXQgcm93SW5kZXggPSAwO1xuICAgIGNvbnN0IGNoaWxkQ29sdW1uczogYW55ID0ge307XG4gICAgaGVhZGVyUm93cy5mb3JFYWNoKChoZHI6IE9lcGFUYWJsZUhlYWRlcikgPT4ge1xuICAgICAgbGV0IGNvbEluZGV4ID0gMDtcbiAgICAgIGhkci5jb2x1bW5zLmZvckVhY2goKGNvbHVtbjogT2VwYVRhYmxlQ29sdW1uKSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdyb3dJbmRleD0nICsgcm93SW5kZXggKyAnLCBjb2xJbmRleD0nICsgY29sSW5kZXggKyAnLCBjb2x1bW49JyArIEpTT04uc3RyaW5naWZ5KGNvbHVtbikpO1xuICAgICAgICBpZiAocm93SW5kZXggPT09IDApIHtcbiAgICAgICAgICBoZWFkZXJzLnB1c2goY29sdW1uLnRpdGxlKTtcbiAgICAgICAgICBpZiAoY29sdW1uLmNvbHNwYW4pIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNvdW50ID0gMTsgY291bnQgPCBjb2x1bW4uY29sc3BhbjsgY291bnQrKykge1xuICAgICAgICAgICAgICBoZWFkZXJzLnB1c2goJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29sdW1uLnJvd3NwYW4pIHtcbiAgICAgICAgICAgIGNoaWxkQ29sdW1uc1tjb2xJbmRleF0gPSBjb2x1bW4ucm93c3BhbiAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdoaWxlIChjaGlsZENvbHVtbnNbY29sSW5kZXhdICYmIGNoaWxkQ29sdW1uc1tjb2xJbmRleF0gPiAwKSB7XG4gICAgICAgICAgICBjaGlsZENvbHVtbnNbY29sSW5kZXhdLS07XG4gICAgICAgICAgICBjb2xJbmRleCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoZWFkZXJzW2NvbEluZGV4XSArPSAnICcgKyBjb2x1bW4udGl0bGU7XG4gICAgICAgICAgaWYgKGNvbHVtbi5jb2xzcGFuKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjb3VudCA9IDE7IGNvdW50IDwgY29sdW1uLmNvbHNwYW47IGNvdW50KyspIHtcbiAgICAgICAgICAgICAgY29sSW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29sSW5kZXgrKztcbiAgICAgIH0pO1xuICAgICAgcm93SW5kZXgrKztcbiAgICB9KTtcbiAgICAvLyBjb25zb2xlLmxvZygnaGVhZGVycyA9ICcgKyBKU09OLnN0cmluZ2lmeShoZWFkZXJzKSk7XG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuXG4gIHByaXZhdGUgZXh0cmFjdERhdGFDb2x1bW5zKGhlYWRlclJvd3M6IEFycmF5PE9lcGFUYWJsZUhlYWRlcj4pOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+IHtcbiAgICBjb25zdCBkYXRhQ29sdW1uczogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPiA9IFtdO1xuICAgIGxldCByb3dJbmRleCA9IDA7XG4gICAgY29uc3QgY2hpbGRDb2x1bW5zOmFueSA9IHt9O1xuICAgIGhlYWRlclJvd3MuZm9yRWFjaCgoaGRyOiBPZXBhVGFibGVIZWFkZXIpID0+IHtcbiAgICAgIGxldCBjb2xJbmRleCA9IDA7XG4gICAgICBoZHIuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IE9lcGFUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgICBpZiAocm93SW5kZXggPT09IDApIHtcbiAgICAgICAgICBpZiAoY29sdW1uLmNvbHNwYW4gJiYgY29sdW1uLmNvbHNwYW4gPiAxKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjb3VudCA9IDA7IGNvdW50IDwgY29sdW1uLmNvbHNwYW47IGNvdW50KyspIHtcbiAgICAgICAgICAgICAgZGF0YUNvbHVtbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnJ1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbEluZGV4ICs9IChjb2x1bW4uY29sc3BhbiAtIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRhQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICBpZiAoY29sdW1uLnJvd3NwYW4pIHtcbiAgICAgICAgICAgICAgY2hpbGRDb2x1bW5zW2NvbEluZGV4XSA9IGNvbHVtbi5yb3dzcGFuIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2hpbGUgKGNoaWxkQ29sdW1uc1tjb2xJbmRleF0gJiYgY2hpbGRDb2x1bW5zW2NvbEluZGV4XSA+IDApIHtcbiAgICAgICAgICAgIGNoaWxkQ29sdW1uc1tjb2xJbmRleF0tLTtcbiAgICAgICAgICAgIGNvbEluZGV4Kys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb2x1bW4uY29sc3BhbiAmJiBjb2x1bW4uY29sc3BhbiA+IDEpIHtcbiAgICAgICAgICAgIGNvbEluZGV4ICs9IChjb2x1bW4uY29sc3BhbiAtIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRhQ29sdW1uc1tjb2xJbmRleF0gPSBjb2x1bW47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbEluZGV4Kys7XG4gICAgICB9KTtcbiAgICAgIHJvd0luZGV4Kys7XG4gICAgfSk7XG4gICAgLy8gY29uc29sZS5sb2coJ2RhdGFDb2x1bW5zID0gJyArIEpTT04uc3RyaW5naWZ5KGRhdGFDb2x1bW5zKSk7XG4gICAgcmV0dXJuIGRhdGFDb2x1bW5zO1xuICB9XG5cbiAgcHVibGljIHNhbml0aXplKGh0bWw6IHN0cmluZyk6IFNhZmVIdG1sIHtcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoaHRtbCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdG8gc2VlIGlmIGFueSBmaWx0ZXJzIGFyZSBzZXRcbiAgICovXG4gIHB1YmxpYyBub0ZpbHRlcnMoKTogYm9vbGVhbiB7XG4gICAgbGV0IG5vRmlsdGVycyA9IHRydWU7XG4gICAgdGhpcy5jdXJyZW50RmlsdGVycy5mb3JFYWNoKGZpbHRlciA9PiB7XG4gICAgICBpZiAoZmlsdGVyLmZpbHRlclN0cmluZyAmJiBmaWx0ZXIuZmlsdGVyU3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbm9GaWx0ZXJzID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG5vRmlsdGVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZ2xvYmFsIGZpbHRlciBzdHJpbmcgKGlmIGFueSkgYXMgYSBSZWdFeHBcbiAgICovXG4gIHByaXZhdGUgZ2V0R2xvYmFsRmlsdGVyKCk6IFJlZ0V4cCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHJlZ0V4cDogUmVnRXhwIHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudEZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgaWYgKCFmaWx0ZXIuY29sdW1uSWQgJiYgZmlsdGVyLmZpbHRlclN0cmluZyAmJiBmaWx0ZXIuZmlsdGVyU3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVnRXhwID0gbmV3IFJlZ0V4cChmaWx0ZXIuZmlsdGVyU3RyaW5nLCAnaScpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZWdFeHA7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGZpbHRlciBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4gKGlmIGFueSkgYXMgYSBSZWdFeHAuXG4gICAqIEBwYXJhbSBjb2x1bW5JZFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRGaWx0ZXJGb3JDb2x1bW4oY29sdW1uSWQ6IHN0cmluZyk6IFJlZ0V4cCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHJlZ0V4cDogUmVnRXhwIHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudEZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgaWYgKGZpbHRlci5jb2x1bW5JZCA9PT0gY29sdW1uSWQgJiYgZmlsdGVyLmZpbHRlclN0cmluZyAmJiBmaWx0ZXIuZmlsdGVyU3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVnRXhwID0gbmV3IFJlZ0V4cChmaWx0ZXIuZmlsdGVyU3RyaW5nLCAnaScpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZWdFeHA7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIHRoZSB0YWJsZSBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBnbG9iYWwgb3IgY29sdW1uLXNwZWNpZmljXG4gICAqIGZpbHRlcnMgc2V0IGluIHRoZSBVSS5cbiAgICogQHBhcmFtIGRhdGFcbiAgICovXG4gIHByaXZhdGUgZmlsdGVyRGF0YShkYXRhOiBBcnJheTxPZXBhVGFibGVSb3c+KTogQXJyYXk8T2VwYVRhYmxlUm93PiB7XG4gICAgLy8gZG9uJ3QgYXR0ZW1wdCBmaWx0ZXJpbmcgaWYgdGhlcmUgYXJlIG5vIGZpbHRlcnMgc2V0XG4gICAgaWYgKHRoaXMubm9GaWx0ZXJzKCkpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBsZXQgZmlsdGVyZWREYXRhOiBBcnJheTxPZXBhVGFibGVSb3c+ID0gZGF0YTtcbiAgICBjb25zdCB0ZW1wQXJyYXk6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSBbXTtcbiAgICBmaWx0ZXJlZERhdGEuZm9yRWFjaCgocm93OiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgIGxldCBmbGFnID0gdGhpcy5maWx0ZXJCeUNvbHVtbkZpbHRlcnMocm93KTtcbiAgICAgIGlmIChmbGFnKSB7XG4gICAgICAgIGZsYWcgPSB0aGlzLmZpbHRlckJ5R2xvYmFsRmlsdGVyKHJvdyk7XG4gICAgICB9XG4gICAgICBpZiAoZmxhZyB8fCByb3cuaXNEaXZpZGVyKSB7XG4gICAgICAgIHRlbXBBcnJheS5wdXNoKHJvdyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZmlsdGVyZWREYXRhID0gdGVtcEFycmF5O1xuICAgIHJldHVybiBmaWx0ZXJlZERhdGE7XG4gIH1cblxuICAvKipcbiAgICogVGVzdCBpZiByb3cgbWF0Y2hlcyBhbnkgb2YgdGhlIGNvbHVtbm4gZmlsdGVycyB0aGF0IG1heSBiZSBzZXQuXG4gICAqIEBwYXJhbSByb3dcbiAgICovXG4gIHByaXZhdGUgZmlsdGVyQnlDb2x1bW5GaWx0ZXJzKHJvdzogT2VwYVRhYmxlUm93KTogYm9vbGVhbiB7XG4gICAgbGV0IGZsYWcgPSB0cnVlO1xuICAgIHJvdy5jZWxscy5mb3JFYWNoKChjZWxsOiBPZXBhVGFibGVDZWxsKSA9PiB7XG4gICAgICBjb25zdCByZWdFeHAgPSB0aGlzLmdldEZpbHRlckZvckNvbHVtbihjZWxsLmlkKTtcbiAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gY2VsbC5maWx0ZXJWYWx1ZSB8fCBjZWxsLnZhbHVlIHx8ICcnO1xuICAgICAgaWYgKHJlZ0V4cCAmJiBmaWx0ZXJWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGZpbHRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGZpbHRlclZhbHVlLnRvU3RyaW5nKCkubWF0Y2gocmVnRXhwKTtcbiAgICAgICAgZmxhZyA9IGZsYWcgJiYgKHJlc3VsdCAhPT0gbnVsbCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZsYWc7XG4gIH1cblxuICAvKipcbiAgICogVGVzdCBpZiByb3cgbWF0Y2hlcyB0aGUgZ2xvYmFsIGZpbHRlclxuICAgKiBAcGFyYW0gcm93XG4gICAqL1xuICBwcml2YXRlIGZpbHRlckJ5R2xvYmFsRmlsdGVyKHJvdzogT2VwYVRhYmxlUm93KTogYm9vbGVhbiB7XG4gICAgbGV0IGZsYWcgPSB0cnVlO1xuICAgIGNvbnN0IHJlZ0V4cCA9IHRoaXMuZ2V0R2xvYmFsRmlsdGVyKCk7XG4gICAgaWYgKHJlZ0V4cCkge1xuICAgICAgZmxhZyA9IGZhbHNlO1xuICAgICAgcm93LmNlbGxzLmZvckVhY2goKGNlbGw6IE9lcGFUYWJsZUNlbGwpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBjZWxsLmZpbHRlclZhbHVlIHx8IGNlbGwudmFsdWU7XG4gICAgICAgIGlmIChmaWx0ZXJWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGZpbHRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmlsdGVyVmFsdWUudG9TdHJpbmcoKS5tYXRjaChyZWdFeHApO1xuICAgICAgICAgIGZsYWcgPSBmbGFnIHx8IChyZXN1bHQgIT09IG51bGwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZsYWc7XG4gIH1cblxuICBwdWJsaWMgaGlkZUNvbHVtbihjb2x1bW46IE9lcGFUYWJsZUNvbHVtbikge1xuICAgIHRoaXMuaGlkZGVuQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgY29sdW1uLmhpZGRlbiA9IHRydWU7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1uQ291bnQtLTtcbiAgfVxuXG4gIHB1YmxpYyB1bmhpZGVDb2x1bW4oY29sdW1uSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGhpZGRlbkNvbHM6IEFycmF5PE9lcGFUYWJsZUNvbHVtbj4gPSBbXTtcbiAgICB0aGlzLmhpZGRlbkNvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICBpZiAoY29sLmlkICE9PSBjb2x1bW5JZCkge1xuICAgICAgICBoaWRkZW5Db2xzLnB1c2goY29sKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbC5oaWRkZW4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmhpZGRlbkNvbHVtbnMgPSBoaWRkZW5Db2xzO1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbkNvdW50Kys7XG4gIH1cblxuICBwcml2YXRlIHNvcnREYXRhKGRhdGE6IEFycmF5PE9lcGFUYWJsZVJvdz4pOiBBcnJheTxPZXBhVGFibGVSb3c+IHtcbiAgICBsZXQgc29ydENyaXRlcmlhOiBhbnkgPSB0aGlzLnRhYmxlU2VydmljZS5nZXRTb3J0Q3JpdGVyaWEodGhpcy50YWJsZUlkKSB8fCBbXTtcbiAgICBpZiAoc29ydENyaXRlcmlhLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc2V0Q29sdW1uU29ydEluZGV4ZXMoc29ydENyaXRlcmlhKTtcblxuICAgIHJldHVybiBkYXRhLnNvcnQoKHByZXZpb3VzOiBPZXBhVGFibGVSb3csIGN1cnJlbnQ6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgbGV0IHNvcnRJbmRleCA9IDA7XG4gICAgICBsZXQgc29ydFJlc3VsdCA9IDA7XG4gICAgICB3aGlsZSAoc29ydEluZGV4IDwgc29ydENyaXRlcmlhLmxlbmd0aCAmJiBzb3J0UmVzdWx0ID09PSAwKSB7XG4gICAgICAgIGxldCBwcmV2ID0gdGhpcy5nZXRSb3dTb3J0VmFsdWUocHJldmlvdXMsIHNvcnRDcml0ZXJpYVtzb3J0SW5kZXhdLmNvbHVtbklkKTtcbiAgICAgICAgbGV0IGN1cnIgPSB0aGlzLmdldFJvd1NvcnRWYWx1ZShjdXJyZW50LCBzb3J0Q3JpdGVyaWFbc29ydEluZGV4XS5jb2x1bW5JZCk7XG4gICAgICAgIGlmIChwcmV2ID4gY3Vycikge1xuICAgICAgICAgIHNvcnRSZXN1bHQgPSAgKHNvcnRDcml0ZXJpYVtzb3J0SW5kZXhdLnNvcnQgPT09ICdkZXNjJyA/IC0xIDogMSk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldiA8IGN1cnIpIHtcbiAgICAgICAgICBzb3J0UmVzdWx0ID0gIChzb3J0Q3JpdGVyaWFbc29ydEluZGV4XS5zb3J0ID09PSAnYXNjJyA/IC0xIDogMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc29ydFJlc3VsdCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgc29ydEluZGV4Kys7XG4gICAgICB9XG4gICAgICByZXR1cm4gc29ydFJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldENvbHVtblNvcnRJbmRleGVzKHNvcnRDcml0ZXJpYTogT2VwYVRhYmxlU29ydENyaXRlcmlvbltdKSB7XG4gICAgaWYgKHNvcnRDcml0ZXJpYSAmJiBzb3J0Q3JpdGVyaWEubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChsZXQgaT0wOyBpPHNvcnRDcml0ZXJpYS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmRhdGFDb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcbiAgICAgICAgICBpZiAoY29sdW1uPy5pZCA9PT0gc29ydENyaXRlcmlhW2ldLmNvbHVtbklkKSB7XG4gICAgICAgICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgIGNvbHVtbi5zb3J0SW5kZXggPSBpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGRpc3BsYXkgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBjZWxsLlxuICAgKiBAcGFyYW0gcm93XG4gICAqIEBwYXJhbSBjb2x1bW5JZFxuICAgKi9cbiAgcHVibGljIGdldFJvd1ZhbHVlKHJvdzogT2VwYVRhYmxlUm93LCBjb2x1bW5JZDogc3RyaW5nKTogYW55IHtcbiAgICBsZXQgdmFsdWU6IGFueTtcbiAgICByb3cuY2VsbHMuZm9yRWFjaCgoY2VsbDogT2VwYVRhYmxlQ2VsbCkgPT4ge1xuICAgICAgaWYgKGNlbGwuaWQgPT09IGNvbHVtbklkKSB7XG4gICAgICAgIHZhbHVlID0gY2VsbC52YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJvdyBSZXRyaWV2ZSB0aGUgc29ydCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGNlbGwgKHdpbGwgZGVmYXVsdCB0byBkaXNwbGF5IHZhbHVlIGlmIHNvcnRcbiAgICogdmFsdWUgaXMgbm90IHNwZWNpZmllZCkuXG4gICAqIEBwYXJhbSBjb2x1bW5JZFxuICAgKi9cbiAgcHVibGljIGdldFJvd1NvcnRWYWx1ZShyb3c6IE9lcGFUYWJsZVJvdywgY29sdW1uSWQ6IHN0cmluZyk6IGFueSB7XG4gICAgbGV0IHZhbHVlOiBhbnk7XG4gICAgcm93LmNlbGxzLmZvckVhY2goKGNlbGw6IE9lcGFUYWJsZUNlbGwpID0+IHtcbiAgICAgIGlmIChjZWxsLmlkID09PSBjb2x1bW5JZCkge1xuICAgICAgICBpZiAoY2VsbC5zb3J0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBjZWxsLnNvcnRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhbHVlID0gY2VsbC5zb3J0VmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSBjZWxsLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVBhZ2UoZGF0YTogQXJyYXk8T2VwYVRhYmxlUm93PiA9IHRoaXMuZGF0YSk6IEFycmF5PE9lcGFUYWJsZVJvdz4ge1xuICAgIGlmICghdGhpcy5wYWdpbmF0aW9uT24pIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVBhZ2UoKTtcbiAgICBjb25zdCBzdGFydCA9ICh0aGlzLnBhZ2VJbmZvLnBhZ2UgLSAxKSAqIHRoaXMucGFnZUluZm8uaXRlbXNQZXJQYWdlO1xuICAgIGNvbnN0IGVuZCA9IHRoaXMucGFnZUluZm8uaXRlbXNQZXJQYWdlID4gLTEgPyAoc3RhcnQgKyB0aGlzLnBhZ2VJbmZvLml0ZW1zUGVyUGFnZSkgOiBkYXRhLmxlbmd0aDtcbiAgICAvLyBub3Qgc3VyZSB3aHksIGJ1dCBtYXhTaXplIHdhcyBnZXR0aW5nIGxvc3QuIFJlc2V0IGl0IGhlcmUgdG8gcHJldmVudCB3ZWlyZG5lc3MuXG4gICAgdGhpcy5wYWdlSW5mby5tYXhTaXplID0gNTtcbiAgICByZXR1cm4gZGF0YS5zbGljZShzdGFydCwgZW5kKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVQYWdpbmdhdGlvbigpIHtcbiAgICB0aGlzLnBhZ2luYXRpb25PbiA9ICF0aGlzLnBhZ2luYXRpb25PbjtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgb25GaWx0ZXJDaGFuZ2VkKGZpbHRlcjogT2VwYVRhYmxlRmlsdGVyKSB7XG4gICAgY29uc3QgbWF0Y2hGaWx0ZXIgPSB0aGlzLmN1cnJlbnRGaWx0ZXJzLmZpbmQoKGYpID0+IHtcbiAgICAgIHJldHVybiBmLmNvbHVtbklkID09PSBmaWx0ZXIuY29sdW1uSWQ7XG4gICAgfSk7XG4gICAgaWYgKCFtYXRjaEZpbHRlcikge1xuICAgICAgdGhpcy5jdXJyZW50RmlsdGVycy5wdXNoKGZpbHRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hdGNoRmlsdGVyLmZpbHRlclN0cmluZyA9IGZpbHRlci5maWx0ZXJTdHJpbmc7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVGFibGUodHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgb25Tb3J0Q2hhbmdlZChjb2x1bW46IE9lcGFUYWJsZUNvbHVtbikge1xuICAgIHRoaXMudGFibGVTZXJ2aWNlLnNldFNvcnQodGhpcy50YWJsZUlkLCBjb2x1bW4pO1xuICAgIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBvblBhZ2VDaGFuZ2VkKHBhZ2VFdmVudDogUGFnZUNoYW5nZWRFdmVudCkge1xuICAgIHRoaXMucGFnZUluZm8gPSB7XG4gICAgICBwYWdlOiBwYWdlRXZlbnQucGFnZSxcbiAgICAgIGl0ZW1zUGVyUGFnZTogcGFnZUV2ZW50Lml0ZW1zUGVyUGFnZSxcbiAgICAgIG1heFNpemU6IHRoaXMucGFnZUluZm8ubWF4U2l6ZSxcbiAgICAgIGxlbmd0aDogdGhpcy5wYWdlSW5mby5sZW5ndGgsXG4gICAgICBudW1QYWdlczogdGhpcy5wYWdlSW5mby5udW1QYWdlc1xuICAgIH1cbiAgICB0aGlzLnRhYmxlU2VydmljZS5zZXRQYWdlKHRoaXMudGFibGVJZCwgcGFnZUV2ZW50LnBhZ2UpO1xuICAgIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVGFibGUoY2xlYXJTZWxjdGVkUm93czogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgZmlsdGVyZWREYXRhID0gdGhpcy5maWx0ZXJEYXRhKHRoaXMuZGF0YSk7XG4gICAgY29uc3Qgc29ydGVkRGF0YSA9IHRoaXMuc29ydERhdGEoZmlsdGVyZWREYXRhKTtcbiAgICB0aGlzLnJvd3MgPSB0aGlzLmNoYW5nZVBhZ2Uoc29ydGVkRGF0YSk7XG4gICAgdGhpcy5wYWdlSW5mby5sZW5ndGggPSBzb3J0ZWREYXRhLmxlbmd0aDtcbiAgICB0aGlzLmFsbFJvd3NTZWxlY3RlZCA9IGZhbHNlO1xuICAgIGlmIChjbGVhclNlbGN0ZWRSb3dzKSB7XG4gICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoW10pO1xuICAgIH1cbiAgICB0aGlzLmRhdGFIYXNEZXRhaWxzID0gdGhpcy5jaGVja0ZvckRldGFpbHModGhpcy5yb3dzKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFnZSgpIHtcbiAgICBjb25zdCBzYXZlZFBhZ2VOdW1iZXIgPSB0aGlzLnRhYmxlU2VydmljZS5nZXRQYWdlKHRoaXMudGFibGVJZCk7XG4gICAgaWYgKHNhdmVkUGFnZU51bWJlciAmJiB0aGlzLnBhZ2VJbmZvLnBhZ2UgIT09IHNhdmVkUGFnZU51bWJlcikge1xuICAgICAgdGhpcy5wYWdlSW5mby5wYWdlID0gc2F2ZWRQYWdlTnVtYmVyO1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMucGFnZUluZm8ucGFnZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRm9yRGV0YWlscyhkYXRhOiBBcnJheTxPZXBhVGFibGVSb3c+KTogYm9vbGVhbiB7XG4gICAgbGV0IGhhc0RldGFpbHMgPSBmYWxzZTtcbiAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCkge1xuICAgICAgZGF0YS5mb3JFYWNoKChyb3c6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgICBpZiAocm93LnNob3dEZXRhaWwgPT09IHRydWUgfHwgcm93LnNob3dEZXRhaWwgPT09IGZhbHNlKSB7XG4gICAgICAgICAgaGFzRGV0YWlscyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaGFzRGV0YWlscztcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVBbGxEZXRhaWxzKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCd0b2dnbGVBbGxEZXRhaWxzLi4uJyk7XG4gICAgdGhpcy5zaG93QWxsRGV0YWlscyA9ICF0aGlzLnNob3dBbGxEZXRhaWxzO1xuICAgIC8vIGNvbnNvbGUubG9nKCdzaG93QWxsRGV0YWlscyA9ICcgKyB0aGlzLnNob3dBbGxEZXRhaWxzKTtcbiAgICBpZiAodGhpcy5fZGF0YSAmJiB0aGlzLl9kYXRhLmxlbmd0aCkge1xuICAgICAgdGhpcy5fZGF0YS5mb3JFYWNoKChyb3c6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgICBpZiAocm93LnNob3dEZXRhaWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJvdy5zaG93RGV0YWlsID0gdGhpcy5zaG93QWxsRGV0YWlscztcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnc2V0dGluZyBkZXRhaWxzIGZvciByb3cgdG8gJyArIHRoaXMuc2hvd0FsbERldGFpbHMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVUYWJsZSgpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZVJvd0RldGFpbCh0b2dnbGVSb3c6IE9lcGFUYWJsZVJvdykge1xuICAgIGlmICh0b2dnbGVSb3cgJiYgdGhpcy5fZGF0YSAmJiB0aGlzLl9kYXRhLmxlbmd0aCkge1xuICAgICAgdGhpcy5fZGF0YS5mb3JFYWNoKChyb3c6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnVEVTVDogJyArIEpTT04uc3RyaW5naWZ5KHJvdy5kYXRhU291cmNlKSArICcgPT09ICcgKyBKU09OLnN0cmluZ2lmeSh0b2dnbGVSb3cuZGF0YVNvdXJjZSkpO1xuICAgICAgICBpZiAocm93LmRhdGFTb3VyY2UgPT09IHRvZ2dsZVJvdy5kYXRhU291cmNlKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJyEhISBNQVRDSCAhISEnKTtcbiAgICAgICAgICByb3cuc2hvd0RldGFpbCA9ICF0b2dnbGVSb3cuc2hvd0RldGFpbDtcbiAgICAgICAgICB0b2dnbGVSb3cuc2hvd0RldGFpbCA9IHJvdy5zaG93RGV0YWlsO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdzaG93IGRldGFpbCA9ICcgKyByb3cuc2hvd0RldGFpbCArICcgZm9yIHJvdzogJyArIEpTT04uc3RyaW5naWZ5KHJvdy5kYXRhU291cmNlKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gdGhpcy5fZGF0YSA9IHRoaXMuX2RhdGEuc3BsaWNlKDApO1xuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZygndG9nZ2xlUm93RGV0YWlsLi4uJyk7XG4gICAgLy8gdGhpcy5kdW1wRGV0YWlsUm93cygpO1xuICB9XG5cbiAgcHVibGljIGlzQWN0aW9uQ29sdW1uKGNvbHVtbklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBjb25zb2xlLmxvZygnaXNBY3Rpb25Db2x1bW4gJyArIGNvbHVtbklkKTtcbiAgICBsZXQgYWN0aW9uQ29sdW1uID0gZmFsc2U7XG4gICAgdGhpcy5oZWFkZXJSb3dzLmZvckVhY2goKGhkcjogT2VwYVRhYmxlSGVhZGVyKSA9PiB7XG4gICAgICBoZHIuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IE9lcGFUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgICBpZiAoY29sdW1uLmlkID09PSBjb2x1bW5JZCkge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd0ZXN0IGFjdGlvbiBjb2x1bW46ICcgKyBjb2x1bW4uaWQgKyAnIC0gJyArIGNvbHVtbi5hY3Rpb25Db2x1bW4pO1xuICAgICAgICAgIGFjdGlvbkNvbHVtbiA9IGNvbHVtbi5hY3Rpb25Db2x1bW4gfHwgZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBhY3Rpb25Db2x1bW47XG4gIH1cblxuICBwdWJsaWMgaXNDb2x1bW5IaWRkZW4oY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIGNvbnNvbGUubG9nKCdpc0NvbHVtbkhpZGRlbiAnICsgY29sdW1uSWQpO1xuICAgIGxldCBoaWRkZW4gPSBmYWxzZTtcbiAgICB0aGlzLmhlYWRlclJvd3MuZm9yRWFjaCgoaGRyOiBPZXBhVGFibGVIZWFkZXIpID0+IHtcbiAgICAgIGhkci5jb2x1bW5zLmZvckVhY2goKGNvbHVtbjogT2VwYVRhYmxlQ29sdW1uKSA9PiB7XG4gICAgICAgIGlmIChjb2x1bW4uaWQgPT09IGNvbHVtbklkKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ3Rlc3QgaGlkZGVuIGNvbHVtbjogJyArIGNvbHVtbi5pZCArICcgLSAnICsgY29sdW1uLmhpZGRlbik7XG4gICAgICAgICAgaGlkZGVuID0gY29sdW1uLmhpZGRlbiB8fCBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGhpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWRkZW5Db2x1bW5zKCk6IEFycmF5PE9lcGFUYWJsZUNvbHVtbj4ge1xuICAgIGNvbnN0IGNvbHVtbnM6IEFycmF5PE9lcGFUYWJsZUNvbHVtbj4gPSBbXTtcbiAgICB0aGlzLmhlYWRlclJvd3MuZm9yRWFjaCgoaGRyOiBPZXBhVGFibGVIZWFkZXIpID0+IHtcbiAgICAgIGhkci5jb2x1bW5zLmZvckVhY2goKGNvbHVtbjogT2VwYVRhYmxlQ29sdW1uKSA9PiB7XG4gICAgICAgIGlmIChjb2x1bW4uaGlkZGVuKSB7XG4gICAgICAgICAgY29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG5cbiAgcHVibGljIGdldENlbGxDbGFzc05hbWUocm93OiBPZXBhVGFibGVSb3csIGNvbHVtbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9ICcnO1xuICAgIHJvdy5jZWxscy5mb3JFYWNoKChjZWxsOiBPZXBhVGFibGVDZWxsKSA9PiB7XG4gICAgICBpZiAoY2VsbC5pZCA9PT0gY29sdW1uSWQpIHtcbiAgICAgICAgcmVzdWx0ID0gY2VsbC5jbGFzc05hbWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDZWxsQ29sU3Bhbihyb3c6IE9lcGFUYWJsZVJvdywgY29sdW1uSWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IHJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMTtcbiAgICByb3cuY2VsbHMuZm9yRWFjaCgoY2VsbDogT2VwYVRhYmxlQ2VsbCkgPT4ge1xuICAgICAgaWYgKGNlbGwuaWQgPT09IGNvbHVtbklkKSB7XG4gICAgICAgIHJlc3VsdCA9IGNlbGwuY29sU3BhbiB8fCAwID49MCA/IGNlbGwuY29sU3BhbiA6IDE7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDZWxsSWNvbkNsYXNzTmFtZShyb3c6IE9lcGFUYWJsZVJvdywgY29sdW1uSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdDogc3RyaW5nIHwgdW5kZWZpbmVkID0gJyc7XG4gICAgcm93LmNlbGxzLmZvckVhY2goKGNlbGw6IE9lcGFUYWJsZUNlbGwpID0+IHtcbiAgICAgIGlmIChjZWxsLmlkID09PSBjb2x1bW5JZCkge1xuICAgICAgICByZXN1bHQgPSBjZWxsLmljb25DbGFzc05hbWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDZWxsSW1nU3JjKHJvdzogT2VwYVRhYmxlUm93LCBjb2x1bW5JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSAnJztcbiAgICByb3cuY2VsbHMuZm9yRWFjaCgoY2VsbDogT2VwYVRhYmxlQ2VsbCkgPT4ge1xuICAgICAgaWYgKGNlbGwuaWQgPT09IGNvbHVtbklkKSB7XG4gICAgICAgIHJlc3VsdCA9IGNlbGwuaW1nU3JjO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2VsbElubmVySFRNTChyb3c6IE9lcGFUYWJsZVJvdywgY29sdW1uSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdDogc3RyaW5nIHwgdW5kZWZpbmVkID0gJyc7XG4gICAgcm93LmNlbGxzLmZvckVhY2goKGNlbGw6IE9lcGFUYWJsZUNlbGwpID0+IHtcbiAgICAgIGlmIChjZWxsLmlkID09PSBjb2x1bW5JZCkge1xuICAgICAgICByZXN1bHQgPSBjZWxsLmlubmVySFRNTDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGNlbGxDbGljayhyb3c6IE9lcGFUYWJsZVJvdywgY29sdW1uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRSb3dWYWx1ZShyb3csIGNvbHVtbklkKTtcbiAgICB0aGlzLmNlbGxDbGlja2VkLmVtaXQoeyByb3csIGNvbHVtbklkLCB2YWx1ZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkFjdGlvbkNsaWNrKGV2ZW50OiBPZXBhQWN0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGlvbkNsaWNrZWQuZW1pdChldmVudCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlQWxsUm93c1NlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFJvd3M6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSBbXTtcbiAgICB0aGlzLmFsbFJvd3NTZWxlY3RlZCA9ICF0aGlzLmFsbFJvd3NTZWxlY3RlZDtcbiAgICAvLyBkZXNlbGVjdCBhbGwgcm93c1xuICAgIHRoaXMuX2RhdGEuZm9yRWFjaCgocjogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICByLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgfSk7XG4gICAgLy8gc2VsZWN0IG9ubHkgdmlzaWJsZSByb3dzXG4gICAgdGhpcy5yb3dzLmZvckVhY2goKHI6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgaWYgKHIuc2VsZWN0YWJsZSkge1xuICAgICAgICByLnNlbGVjdGVkID0gdGhpcy5hbGxSb3dzU2VsZWN0ZWQ7XG4gICAgICB9XG4gICAgICBpZiAoci5zZWxlY3RlZCkge1xuICAgICAgICBzZWxlY3RlZFJvd3MucHVzaChyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJvd3Muc2xpY2UoKTtcbiAgICAvLyB0aGlzLnVwZGF0ZVRhYmxlKCk7XG4gICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHNlbGVjdGVkUm93cyk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlUm93U2VsZWN0aW9uKHJvdzogT2VwYVRhYmxlUm93KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzOiBBcnJheTxPZXBhVGFibGVSb3c+ID0gW107XG4gICAgcm93LnNlbGVjdGVkID0gIXJvdy5zZWxlY3RlZDtcbiAgICB0aGlzLnJvd3MuZm9yRWFjaCgoZHI6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgaWYgKHJvdy5wcml2YXRlSWQgPT09IGRyLnByaXZhdGVJZCkge1xuICAgICAgICBkci5zZWxlY3RlZCA9IHJvdy5zZWxlY3RlZDtcbiAgICAgIH1cbiAgICAgIGlmIChkci5zZWxlY3RlZCkge1xuICAgICAgICBzZWxlY3RlZFJvd3MucHVzaChkcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFsbFJvd3NTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucm93cy5zbGljZSgpO1xuICAgIC8vIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoc2VsZWN0ZWRSb3dzKTtcbiAgfVxuXG4gIHB1YmxpYyBzaW5nbGVSb3dTZWxlY3Rpb24ocm93OiBPZXBhVGFibGVSb3cpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFJvd3M6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSBbXTtcbiAgICByb3cuc2VsZWN0ZWQgPSAhcm93LnNlbGVjdGVkO1xuICAgIC8vIGFkZCByb3cgdG8gc2VsZWN0ZWQgcm93cyBpZiBpdCBpcyBzZWxlY3RlZFxuICAgIGlmIChyb3cuc2VsZWN0ZWQpIHtcbiAgICAgIHNlbGVjdGVkUm93cy5wdXNoKHJvdyk7XG4gICAgfVxuICAgIC8vIHVuc2VsZWN0IGFueSBvdGhlciByb3cgdGhhdCBtYXkgYmUgc2VsZWN0ZWRcbiAgICB0aGlzLl9kYXRhLmZvckVhY2goKGRyOiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgIGlmIChyb3cucHJpdmF0ZUlkID09PSBkci5wcml2YXRlSWQpIHtcbiAgICAgICAgZHIuc2VsZWN0ZWQgPSByb3cuc2VsZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkci5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucm93cy5zbGljZSgpO1xuICAgIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoc2VsZWN0ZWRSb3dzKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVJvd3NGb3JFeHBvcnQocm93czogQXJyYXk8T2VwYVRhYmxlUm93Pik6IEFycmF5PE9lcGFUYWJsZVJvdz4ge1xuICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8T2VwYVRhYmxlUm93PiA9IFtdO1xuICAgIC8vIGNvbnNvbGUubG9nKCdwcmVwYXJlUm93c0ZvckV4cG9ydC4uLicpO1xuICAgIC8vIHRoaXMuZHVtcERldGFpbFJvd3MoKTtcbiAgICBpZiAocm93cyAmJiByb3dzLmxlbmd0aCkge1xuICAgICAgcm93cy5mb3JFYWNoKChyb3c6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnc2hvd0RldGFpbCA9ICcgKyByb3cuc2hvd0RldGFpbCArICcgJyArIEpTT04uc3RyaW5naWZ5KHJvdy5jZWxscykpO1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgY2VsbHM6IHJvdy5jZWxscyxcbiAgICAgICAgICBhY3Rpb25zOiByb3cuYWN0aW9ucyxcbiAgICAgICAgICBzaG93RGV0YWlsOiByb3cuc2hvd0RldGFpbCxcbiAgICAgICAgICBzdWJUYWJsZTogcm93LmRldGFpbCA/IHRoaXMuY29udmVydFRvVGFibGUocm93LmRldGFpbCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgaXNEaXZpZGVyOiByb3cuaXNEaXZpZGVyLFxuICAgICAgICAgIGRpdmlkZXJDbGFzc05hbWU6IHJvdy5kaXZpZGVyQ2xhc3NOYW1lXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgZ2F0aGVyVGFibGVEYXRhKHJvd3M6IE9lcGFUYWJsZVJvd1tdKTogT2VwYVRhYmxlIHtcbiAgICAvLyBjb25zb2xlLmxvZygnZ2F0aGVyVGFibGVEYXRhLi4uJyk7XG4gICAgLy8gdGhpcy5kdW1wRGV0YWlsUm93cygpO1xuICAgIGNvbnN0IG9lcGFUYWJsZTogT2VwYVRhYmxlID0ge307XG4gICAgb2VwYVRhYmxlLmhlYWRlclJvd3MgPSB0aGlzLmhlYWRlclJvd3M7XG4gICAgb2VwYVRhYmxlLmFsbERhdGFSb3dzID0gdGhpcy5wcmVwYXJlUm93c0ZvckV4cG9ydChyb3dzKTtcbiAgICBvZXBhVGFibGUuc2hvd0FsbERldGFpbHMgPSB0aGlzLnNob3dBbGxEZXRhaWxzO1xuICAgIG9lcGFUYWJsZS5jbGFzc05hbWUgPSB0aGlzLl9jb25maWcuY2xhc3NOYW1lO1xuICAgIG9lcGFUYWJsZS52aXNpYmxlQ29sdW1uQ291bnQgPSB0aGlzLnZpc2libGVDb2x1bW5Db3VudDtcbiAgICBvZXBhVGFibGUuYWxsQ29sdW1uQ291bnQgPSB0aGlzLmFsbENvbHVtbkNvdW50O1xuICAgIHJldHVybiBvZXBhVGFibGU7XG4gIH1cblxuICBwcml2YXRlIGR1bXBEZXRhaWxSb3dzKCkge1xuICAgIGNvbnNvbGUubG9nKCdkdW1wRGV0YWlsUm93cyAtIFRvdGFsIHJvd3M6ICcgKyB0aGlzLl9kYXRhLmxlbmd0aCk7XG4gICAgdGhpcy5fZGF0YS5mb3JFYWNoKChyb3c6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgaWYgKHJvdy5zaG93RGV0YWlsKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTSE9XIERFVEFJTDogJyArIEpTT04uc3RyaW5naWZ5KHJvdy5kYXRhU291cmNlKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY29udmVydFRvVGFibGUodGVtcGxhdGU6IE9lcGFUZW1wbGF0ZUluZm8pOiBPZXBhVGFibGUgfCB1bmRlZmluZWQge1xuICAgIGxldCBvZXBhVGFibGU6IE9lcGFUYWJsZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAodGVtcGxhdGUuY29tcG9uZW50ID09PSBUYWJsZUNvbXBvbmVudCkge1xuICAgICAgY29uc3QgdGFibGU6IFRhYmxlQ29tcG9uZW50ID0gbmV3IFRhYmxlQ29tcG9uZW50KHRoaXMuc2FuaXRpemVyLCB0aGlzLmVsZW1lbnRSZWYsIHRoaXMudGFibGVTZXJ2aWNlLCB0aGlzLnRhYmxlRXhwb3J0U2VydmljZSwgdGhpcy5maWxlVXRpbFNlcnZpY2UpO1xuICAgICAgaWYgKHRlbXBsYXRlLmlucHV0cyAmJiB0ZW1wbGF0ZS5pbnB1dHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0ZW1wbGF0ZS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgICAgICBpZiAoaW5wdXQubmFtZSA9PT0gJ2NvbmZpZycpIHtcbiAgICAgICAgICAgIHRhYmxlLmNvbmZpZyA9IGlucHV0LnZhbHVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQubmFtZSA9PT0gJ2NvbXBsZXhIZWFkZXInKSB7XG4gICAgICAgICAgICB0YWJsZS5jb21wbGV4SGVhZGVyID0gaW5wdXQudmFsdWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5uYW1lID09PSAnaGVhZGVyJykge1xuICAgICAgICAgICAgdGFibGUuaGVhZGVyID0gaW5wdXQudmFsdWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5uYW1lID09PSAnZGF0YScpIHtcbiAgICAgICAgICAgIHRhYmxlLmRhdGEgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBvZXBhVGFibGUgPSB0YWJsZS5nYXRoZXJUYWJsZURhdGEodGFibGUuZGF0YSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZXBhVGFibGU7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlRXhwb3J0VmlzaWJsZU9ubHkoKSB7XG4gICAgdGhpcy5leHBvcnRWaXNpYmxlT25seSA9ICF0aGlzLmV4cG9ydFZpc2libGVPbmx5O1xuICB9XG5cbiAgcHVibGljIGV4cG9ydFRvRXhjZWwoKSB7XG4gICAgY29uc3QgZXhwb3J0VGFibGU6IE9lcGFUYWJsZSA9IHRoaXMuZ2F0aGVyVGFibGVEYXRhKHRoaXMuZXhwb3J0VmlzaWJsZU9ubHkgPyB0aGlzLnJvd3MgOiB0aGlzLl9kYXRhKTtcblxuICAgIHRoaXMudGFibGVFeHBvcnRTZXJ2aWNlLmRvd25sb2FkRXhjZWwoZXhwb3J0VGFibGUsIHRoaXMuX2NvbmZpZykuc3Vic2NyaWJlKFxuICAgICAgZGF0YSA9PiB7XG4gICAgICAgIHRoaXMuZmlsZVV0aWxTZXJ2aWNlLmRvd25sb2FkRmlsZShkYXRhLCAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJyk7XG4gICAgICB9LFxuICAgICAgZXJyb3IgPT4gY29uc29sZS5sb2coZXJyb3IpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBleHBvcnRUb0hUTUwoKSB7XG4gICAgY29uc3QgZXhwb3J0VGFibGU6IE9lcGFUYWJsZSA9IHRoaXMuZ2F0aGVyVGFibGVEYXRhKHRoaXMuZXhwb3J0VmlzaWJsZU9ubHkgPyB0aGlzLnJvd3MgOiB0aGlzLl9kYXRhKTtcblxuICAgIC8vIGZvciBub3csIGFsd2F5cyBlbWJlZCBzdWItdGFibGVzICBpbiBIVE1MIHZpZXcuXG4gICAgdGhpcy50YWJsZUV4cG9ydFNlcnZpY2UuZG93bmxvYWRIVE1MKGV4cG9ydFRhYmxlLCB0aGlzLl9jb25maWcpLnN1YnNjcmliZShcbiAgICAgIGRhdGEgPT4ge1xuICAgICAgICB0aGlzLmZpbGVVdGlsU2VydmljZS5kb3dubG9hZEZpbGUoZGF0YSwgJ3RleHQvaHRtbCcpO1xuICAgICAgfSxcbiAgICAgIGVycm9yID0+IGNvbnNvbGUubG9nKGVycm9yKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgb25DdXN0b21CdG5DbGljaygpIHtcbiAgICB0aGlzLmN1c3RvbUJ0bkNsaWNrZWQuZW1pdCgpO1xuICB9XG5cbn1cbiIsIjwhLS0gVW5oaWRlIHNlbGVjdCBpbnB1dCAtIG9ubHkgdmlzaWJsZSBpZiBvbmUgb3IgbW9yZSBjb2x1bW5zIGFyZSBoaWRkZW4gLS0+XG5cbjxmb3JtICpuZ0lmPVwiaGlkZGVuQ29sdW1ucy5sZW5ndGggPiAwXCIgYXJpYS1sYWJlbD1cIlNob3cgaGlkZGVuIGNvbHVtbnNcIj5cbiAgPGRpdiBjbGFzcz1cInJvdyBtYi0yXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29sLWZvcm0tbGFiZWxcIiBbZm9yXT1cInRhYmxlSWQrJ19VbmhpZGVDb2x1bW5TZWxlY3QnXCI+U2hvdyBIaWRkZW4gQ29sdW1uczo8L2xhYmVsPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxuICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgKGNoYW5nZSk9XCJ1bmhpZGVDb2x1bW4oJGFueSgkZXZlbnQpLnRhcmdldC52YWx1ZSlcIiBbaWRdPVwidGFibGVJZCsnX1VuaGlkZUNvbHVtblNlbGVjdCdcIiBhcmlhLWxhYmVsPVwiU2VsZWN0IGNvbHVtbiB0byB1bmhpZGVcIj5cbiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkNob29zZSBhIGNvbHVtbjwvb3B0aW9uPlxuICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb2wgb2YgaGlkZGVuQ29sdW1uc1wiIFt2YWx1ZV09XCJjb2wuaWRcIj57e2NvbC50aXRsZX19PC9vcHRpb24+XG4gICAgICA8L3NlbGVjdD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Zvcm0+XG48IS0tIFRoaXMgaXMgdGhlIHRhYmxlIC0tPlxuPGRpdiBbbmdDbGFzc109XCJjb25maWcuZGl2Q2xhc3NOYW1lIHx8ICcnXCI+XG48dGFibGUgKm5nSWY9XCIhY29uZmlnLmhpZGVUYWJsZVwiIGNsYXNzPVwidGFibGUgZGF0YVRhYmxlXCIgW25nQ2xhc3NdPVwiY29uZmlnLmNsYXNzTmFtZSB8fCAnJ1wiIHJvbGU9XCJ0YWJsZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgYXJpYS1sYWJlbD1cIkRhdGEgdGFibGVcIj5cblxuPCEtLSBUaGlzIGlzIHRoZSB0YWJsZSBoZWFkZXIgLS0+XG48dGhlYWQ+XG4gIDwhLS0gVGhlcmUgbWF5IGJlIG11bHRpcGxlIGhlYWRlciByb3dzIC0tPlxuICA8dHIgKm5nRm9yPVwibGV0IGhkciBvZiBoZWFkZXJSb3dzOyBsZXQgaHI9aW5kZXg7XCIgcm9sZT1cInJvd1wiPlxuICAgIDwhLS0gRGV0YWlscyBpbmRpY2F0b3IgY29sdW1uIChpZiBkYXRhIGhhcyBkZXRhaWxzKSAtLT5cbiAgICA8dGggKm5nSWY9XCJkYXRhSGFzRGV0YWlscyAmJiBociA9PT0gMFwiIFtyb3dTcGFuXT1cImhlYWRlclJvd3MubGVuZ3RoXCIgY2xhc3M9XCJkZXRhaWwtaW5kaWNhdG9yLWNvbFwiIHNjb3BlPVwiY29sXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5Sb3cgZGV0YWlsczwvc3Bhbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rIHAtMFwiIChjbGljayk9XCJ0b2dnbGVBbGxEZXRhaWxzKClcIiBbaWRdPVwidGFibGVJZCsnX1Nob3dBbGxEZXRhaWxzTGluaydcIiBbYXR0ci5hcmlhLXByZXNzZWRdPVwic2hvd0FsbERldGFpbHNcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIihzaG93QWxsRGV0YWlscyA/ICdIaWRlJyA6ICdTaG93JykgKyAnIGRldGFpbHMgZm9yIGFsbCByb3dzJ1wiPlxuICAgICAgICA8aSBjbGFzcz1cImJpXCIgW25nQ2xhc3NdPVwieydiaS1jaGV2cm9uLWRvd24nOiBzaG93QWxsRGV0YWlscywgJ2JpLWNoZXZyb24tcmlnaHQnOiAhc2hvd0FsbERldGFpbHN9XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC90aD5cbiAgICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWNvbHVtbiBbbmdGb3JPZl09XCJoZHIuY29sdW1uc1wiIGxldC1jPVwiaW5kZXhcIj5cbiAgICAgIDwhLS0gSGVhZGVyIGNlbGwgLS0+XG4gICAgICA8dGggKm5nSWY9XCIhY29sdW1uLmhpZGRlblwiIFtuZ0NsYXNzXT1cImNvbHVtbi5jbGFzc05hbWUgfHwgJydcIiBbY29sU3Bhbl09XCJjb2x1bW4uY29sc3BhbiB8fCAxXCIgW3Jvd1NwYW5dPVwiY29sdW1uLnJvd3NwYW4gfHwgMVwiIHNjb3BlPVwiY29sXCI+XG4gICAgICAgIDwhLS0gU2VsZWN0IGFsbCBSb3dzIENoZWNrYm94IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJjb2x1bW4uc2VsZWN0Q29sdW1uXCIgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiYWxsUm93c1NlbGVjdGVkXCIgKGNoYW5nZSk9XCJ0b2dnbGVBbGxSb3dzU2VsZWN0aW9uKClcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidTZWxlY3QgYWxsIHJvd3MnXCI+XG5cbiAgICAgICAgICA8IS0tIEhlYWRlciBjZWxsIHRleHQgd2l0aCBzb3J0IGNhcGFiaWxpdHkgKGlmIHNwZWNpZmllZCkgLS0+XG4gICAgICAgICAgPHNwYW4gW29lcGFUYWJsZVNvcnRpbmddPVwidHJ1ZVwiIFtjb2x1bW5dPVwiY29sdW1uXCIgW3RhYmxlSWRdPVwidGFibGVJZFwiIChzb3J0Q2hhbmdlZCk9XCJvblNvcnRDaGFuZ2VkKCRldmVudClcIiBbaWRdPVwidGFibGVJZCsnX1NvcnRDb2x1bW5MaW5rXycrY29sdW1uLmlkXCIgdGFiaW5kZXg9XCIwXCIgcm9sZT1cImJ1dHRvblwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NvcnQgYnkgJyArIGNvbHVtbi50aXRsZVwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb2x1bW4uc29ydFwiPjxpIGNsYXNzPVwicHVsbC1sZWZ0IGJpXCIgW25nQ2xhc3NdPVwieydiaS1jaGV2cm9uLWRvd24nOiBjb2x1bW4uc29ydCA9PT0gJ2Rlc2MnLCAnYmktY2hldnJvbi11cCc6IGNvbHVtbi5zb3J0ID09PSAnYXNjJ31cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8c3VwICpuZ0lmPVwiY29sdW1uPy5zb3J0SW5kZXggfHwgMCA+IDFcIj57e2NvbHVtbi5zb3J0SW5kZXh9fTwvc3VwPjwvc3Bhbj5cbiAgICAgICAgICAgIHt7Y29sdW1uLnRpdGxlfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPCEtLSBidXR0b24gdG8gYWxsb3cgY29sdW1uIHRvIGJlIGhpZGRlbiAoaWYgc3BlY2lmaWVkKSAtLT5cbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiY29sdW1uLmhpZGRlbiA9PT0gZmFsc2VcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UgZmxvYXQtZW5kXCIgYXJpYS1sYWJlbD1cIkhpZGUgY29sdW1uXCIgKGNsaWNrKT1cImhpZGVDb2x1bW4oY29sdW1uKVwiXG4gICAgICAgICAgICBbaWRdPVwidGFibGVJZCsnX0hpZGVDb2x1bW5MaW5rJysnXycrY29sdW1uLmlkXCI+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gY29sdW1uIGZpbHRlciAoaWYgc3BlY2lmaWVkKSAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIigocm93cyAmJiByb3dzLmxlbmd0aCA+IDApIHx8ICFub0ZpbHRlcnMoKSkgJiYgY29sdW1uLmZpbHRlcmFibGVcIiA+XG4gICAgICAgICAgPGlucHV0IFtvZXBhVGFibGVGaWx0ZXJpbmddPVwieyBmaWx0ZXJTdHJpbmc6ICcnLCBjb2x1bW5JZDogY29sdW1uLmlkIH1cIiBbdGFibGVJZF09XCJ0YWJsZUlkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgaW5wdXQtc21cIiAodGFibGVDaGFuZ2VkKT1cIm9uRmlsdGVyQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtpZF09XCJ0YWJsZUlkKydfRmlsdGVyQ29sdW1uXycrY29sdW1uLmlkXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInRmlsdGVyIGZvciAnICsgY29sdW1uLnRpdGxlXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RoPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvdHI+XG48L3RoZWFkPlxuXG48IS0tIFRoaXMgaXMgdGhlIHRhYmxlIGJvZHkgLS0+XG48dGJvZHk+XG4gIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtcm93IFtuZ0Zvck9mXT1cInJvd3NcIiBsZXQtcj1cImluZGV4XCI+XG4gICAgPCEtLSBEYXRhIFJvdyAtLT5cbiAgICA8dHI+XG4gICAgICA8dGQgKm5nSWY9XCJkYXRhSGFzRGV0YWlsc1wiPlxuICAgICAgICA8IS0tIERldGFpbCBpY29uIChpZiBzcGVjaWZpZWQpIC0tPlxuICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy5zaG93RGV0YWlsID09PSB0cnVlIHx8IHJvdy5zaG93RGV0YWlsID09PSBmYWxzZVwiPlxuICAgICAgICAgIDxpICpuZ0lmPVwicm93LmRldGFpbEljb25DbGFzc05hbWVcIiBbbmdDbGFzc109XCJyb3cuZGV0YWlsSWNvbkNsYXNzTmFtZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGluayBwLTBcIiAoY2xpY2spPVwidG9nZ2xlUm93RGV0YWlsKHJvdylcIiBbaWRdPVwidGFibGVJZCsnX1Nob3dEZXRhaWxMaW5rXycrclwiIFthdHRyLmFyaWEtcHJlc3NlZF09XCJyb3cuc2hvd0RldGFpbFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiKHJvdy5zaG93RGV0YWlsID8gJ0hpZGUnIDogJ1Nob3cnKSArICcgZGV0YWlscyBmb3IgdGhpcyByb3cnXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImJpXCIgW25nQ2xhc3NdPVwieydiaS1jaGV2cm9uLWRvd24nOiByb3cuc2hvd0RldGFpbCwgJ2JpLWNoZXZyb24tcmlnaHQnOiAhcm93LnNob3dEZXRhaWx9XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3RkPlxuICAgICAgPCEtLSBJZiByb3cgaXMgYSBkaXZpZGVyLCBpdCBzcGFucyB0aGUgd2hvbGUgdGFibGUgLS0+XG4gICAgICA8IS0tIDx0ZCAqbmdJZj1cInJvdy5pc0RpdmlkZXJcIiBbY29sU3Bhbl09XCJ2aXNpYmxlQ29sdW1uQ291bnQgKyAoZGF0YUhhc0RldGFpbHMgPyAxIDogMClcIiBbbmdDbGFzc109XCJyb3cuZGl2aWRlckNsYXNzTmFtZSB8fCAnb2VwYS10YWJsZS1ncmF5J1wiPiZuYnNwOzwvdGQ+IC0tPlxuICAgICAgPCEtLSBEYXRhIFJvd3MgLS0+XG4gICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCIhcm93LmlzRGl2aWRlclwiIG5nRm9yIGxldC1jb2wgW25nRm9yT2ZdPVwiZGF0YUNvbHVtbnNcIiBsZXQtaT1cImluZGV4XCI+XG4gICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaGlkZGVuICYmIChyb3d8Y2VsbENvbHNwYW46Y29sKSA+IDBcIiBuZ0NsYXNzPVwie3tyb3d8Y2VsbENsYXNzbmFtZTpjb2wgfHwgJyd9fVwiIFtjb2xTcGFuXT1cInJvd3xjZWxsQ29sc3Bhbjpjb2xcIj5cbiAgICAgICAgICA8IS0tIERhdGEgQ2VsbCAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNvbC5hY3Rpb25Db2x1bW4gJiYgIWNvbC5zZWxlY3RDb2x1bW4gJiYgIWNvbC5zaW5nbGVTZWxlY3RDb2x1bW5cIj5cbiAgICAgICAgICAgIDwhLS0gVGVtcGxhdGUgZm9yIHBvcG92ZXIgMSAtLT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcG9wb3ZlclRlbXBsYXRlPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93LnBvcG92ZXJcIj5cbiAgICAgICAgICAgICAgICA8Y21sLXRlbXBsYXRlIFt0ZW1wbGF0ZUluZm9dPVwicm93LnBvcG92ZXIuY29udGVudFwiPjwvY21sLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8IS0tIFBvcG92ZXIgMSBpY29uIChpZiBzcGVjaWZpZWQpIC0tPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cucG9wb3ZlciAmJiBpID09PSAocm93LnBvcG92ZXJDb2x1bW5JbmRleCB8fCAwKSAmJiByb3cucG9wb3ZlclwiIHRhYmluZGV4PVwiMFwiIFtwb3BvdmVyVGl0bGVdPVwicm93LnBvcG92ZXIudGl0bGVcIiBbcG9wb3Zlcl09XCJwb3BvdmVyVGVtcGxhdGVcIlxuICAgICAgICAgICAgICBbY29udGFpbmVyQ2xhc3NdPVwicm93LnBvcG92ZXIuY29udGFpbmVyQ2xhc3NcIiBwbGFjZW1lbnQ9XCJyaWdodFwiIFt0cmlnZ2Vyc109XCJyb3cucG9wb3Zlci50cmlnZ2VyIHx8ICdtb3VzZWVudGVyOm1vdXNlbGVhdmUnXCI+XG4gICAgICAgICAgICAgIDxpIFtuZ0NsYXNzXT1cInJvdy5wb3BvdmVyLmNsYXNzTmFtZVwiIFtpZF09XCJ0YWJsZUlkKydfUG9wb3ZlckxpbmtfJytyXCI+PC9pPlxuICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICA8IS0tIFRlbXBsYXRlIGZvciBwb3BvdmVyIDIgLS0+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BvcG92ZXIyVGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3cucG9wb3ZlcjJcIj5cbiAgICAgICAgICAgICAgICA8Y21sLXRlbXBsYXRlIFt0ZW1wbGF0ZUluZm9dPVwicm93LnBvcG92ZXIyLmNvbnRlbnRcIj48L2NtbC10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPCEtLSBQb3BvdmVyIDIgaWNvbiAoaWYgc3BlY2lmaWVkKSAtLT5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaSA9PT0gKHJvdy5wb3BvdmVyMkNvbHVtbkluZGV4IHx8IDApICYmIHJvdy5wb3BvdmVyMlwiIHRhYmluZGV4PVwiMFwiIFtwb3BvdmVyVGl0bGVdPVwicm93LnBvcG92ZXIyLnRpdGxlXCIgW3BvcG92ZXJdPVwicG9wb3ZlcjJUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgIFtjb250YWluZXJDbGFzc109XCJyb3cucG9wb3ZlcjIuY29udGFpbmVyQ2xhc3NcIiBwbGFjZW1lbnQ9XCJyaWdodFwiIFt0cmlnZ2Vyc109XCJyb3cucG9wb3ZlcjIudHJpZ2dlciB8fCAnbW91c2VlbnRlcjptb3VzZWxlYXZlJ1wiPlxuICAgICAgICAgICAgICA8aSBbbmdDbGFzc109XCJyb3cucG9wb3ZlcjIuY2xhc3NOYW1lXCIgW2lkXT1cInRhYmxlSWQrJ19Qb3BvdmVyMkxpbmtfJytyXCI+PC9pPlxuICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICA8IS0tIFRlbXBsYXRlIGZvciBwb3BvdmVyIDMgLS0+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BvcG92ZXIzVGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3cucG9wb3ZlcjNcIj5cbiAgICAgICAgICAgICAgICA8Y21sLXRlbXBsYXRlIFt0ZW1wbGF0ZUluZm9dPVwicm93LnBvcG92ZXIzLmNvbnRlbnRcIj48L2NtbC10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPCEtLSBQb3BvdmVyIDMgaWNvbiAoaWYgc3BlY2lmaWVkKSAtLT5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaSA9PT0gKHJvdy5wb3BvdmVyM0NvbHVtbkluZGV4IHx8IDApICYmIHJvdy5wb3BvdmVyM1wiIHRhYmluZGV4PVwiMFwiIFtwb3BvdmVyVGl0bGVdPVwicm93LnBvcG92ZXIzLnRpdGxlXCIgW3BvcG92ZXJdPVwicG9wb3ZlcjNUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgIFtjb250YWluZXJDbGFzc109XCJyb3cucG9wb3ZlcjMuY29udGFpbmVyQ2xhc3NcIiBwbGFjZW1lbnQ9XCJyaWdodFwiIFt0cmlnZ2Vyc109XCJyb3cucG9wb3ZlcjMudHJpZ2dlciB8fCAnbW91c2VlbnRlcjptb3VzZWxlYXZlJ1wiPlxuICAgICAgICAgICAgICA8aSBbbmdDbGFzc109XCJyb3cucG9wb3ZlcjMuY2xhc3NOYW1lXCIgW2lkXT1cInRhYmxlSWQrJ19Qb3BvdmVyM0xpbmtfJytyXCI+PC9pPlxuICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cInJvd3xjZWxsSW5uZXJIVE1MOmNvbFwiIFtpbm5lckhUTUxdPVwicm93fGNlbGxJbm5lckhUTUw6Y29sXCI+PC9kaXY+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiEocm93fGNlbGxJbm5lckhUTUw6Y29sKVwiPnt7cm93fGNlbGxWYWx1ZTpjb2x9fTwvc3Bhbj4gLS0+XG5cbiAgICAgICAgICAgIDwhLS0gSWYgY29sIGlzIGh5cGVybGluaywgZGlzcGxheSBkYXRhIGFzIGEgaHlwZXJsaW5rIC0tPlxuICAgICAgICAgICAgPGEgKm5nSWY9XCJjb2wuaHlwZXJsaW5rXCIgIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCIgKGNsaWNrKT1cImNlbGxDbGljayhyb3csIGNvbC5pZClcIiBbaWRdPVwidGFibGVJZCsnX0NlbGxDbGlja18nK3IrJ18nK2lcIiB0YWJpbmRleD1cIjBcIiByb2xlPVwiYnV0dG9uXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInQWN0aXZhdGUgJyArIChjb2wudGl0bGUgfHwgJ2NlbGwnKVwiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiEocm93fGNlbGxJbm5lckhUTUw6Y29sKVwiPlxuICAgICAgICAgICAgICAgIDxpIFtuZ0NsYXNzXT1cInJvd3xjZWxsSWNvbkNsYXNzbmFtZTpjb2xcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3d8Y2VsbEltZ1NyYzpjb2xcIj48aW1nIFtzcmNdPVwicm93fGNlbGxJbWdTcmM6Y29sXCIgYWx0PVwiXCIvPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICB7e3Jvd3xjZWxsVmFsdWU6Y29sfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93fGNlbGxJbm5lckhUTUw6Y29sXCIgW2lubmVySFRNTF09XCJyb3d8Y2VsbElubmVySFRNTDpjb2xcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwhLS0gSWYgY29sIGlzIE5PVCBoeXBlcmxpbmssIGp1c3QgZGlzcGxheSBkYXRhIC0tPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhY29sLmh5cGVybGlua1wiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiEocm93fGNlbGxJbm5lckhUTUw6Y29sKVwiPlxuICAgICAgICAgICAgICAgIDxpIG5nQ2xhc3M9XCJ7e3Jvd3xjZWxsSWNvbkNsYXNzbmFtZTpjb2wgfHwgJyd9fVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd3xjZWxsSW1nU3JjOmNvbFwiPjxpbWcgW3NyY109XCJyb3d8Y2VsbEltZ1NyYzpjb2xcIiBhbHQ9XCJcIi8+PC9zcGFuPlxuICAgICAgICAgICAgICAgIHt7cm93fGNlbGxWYWx1ZTpjb2x9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3d8Y2VsbElubmVySFRNTDpjb2xcIiBbaW5uZXJIVE1MXT1cInJvd3xjZWxsSW5uZXJIVE1MOmNvbFwiPjwvZGl2PlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gU2VsZWN0IENlbGwgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC5zZWxlY3RDb2x1bW5cIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICA8aW5wdXQgW2lkXT1cInRhYmxlSWQrJ18nK3JcIiB0eXBlPVwiY2hlY2tib3hcIiBbZGlzYWJsZWRdPVwiIXJvdy5zZWxlY3RhYmxlXCIgW2NoZWNrZWRdPVwicm93LnNlbGVjdGVkXCIgKGNoYW5nZSk9XCJ0b2dnbGVSb3dTZWxlY3Rpb24ocm93KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjdCByb3cgJyArIChyKzEpXCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBTaW5nbGUgU2VsZWN0IENlbGwgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC5zaW5nbGVTZWxlY3RDb2x1bW5cIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICA8aW5wdXQgW2lkXT1cInRhYmxlSWQrJ19zaW5nbGVTZWxlY3RfJytyXCIgdHlwZT1cInJhZGlvXCIgW2Rpc2FibGVkXT1cIiFyb3cuc2VsZWN0YWJsZVwiIFtjaGVja2VkXT1cInJvdy5zZWxlY3RlZFwiIChjaGFuZ2UpPVwic2luZ2xlUm93U2VsZWN0aW9uKHJvdylcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidTZWxlY3Qgcm93ICcgKyAocisxKVwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gQWN0aW9uIEJ1dHRvbiBDZWxsIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuYWN0aW9uQ29sdW1uICYmIHJvdy5hY3Rpb25zXCI+XG4gICAgICAgICAgICA8b2VwYS1hY3Rpb24tYnRuIFthY3Rpb25zXT1cInJvdy5hY3Rpb25zXCIgW2RhdGFdPVwicm93LmRhdGFTb3VyY2VcIiAgKGFjdGlvbkNsaWNrZWQpPVwib25BY3Rpb25DbGljaygkZXZlbnQpXCIgW2J0bklkXT1cInRhYmxlSWQrJ18nK3JcIiAoZHJvcGRvd25PcGVuQ2hhbmdlKT1cIm9uRHJvcGRvd25PcGVuQ2hhbmdlKCRldmVudClcIj48L29lcGEtYWN0aW9uLWJ0bj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC90cj5cblxuICAgIDwhLS0gRGV0YWlsIFJvdyAtLT5cbiAgICA8dHIgKm5nSWY9XCJyb3cuc2hvd0RldGFpbFwiIGNsYXNzPVwidGFibGUtaW5mb1wiPlxuICAgICAgPHRkIFtjb2xTcGFuXT1cInZpc2libGVDb2x1bW5Db3VudCArIChkYXRhSGFzRGV0YWlscyA/IDEgOiAwKVwiPlxuICAgICAgICA8Y21sLXRlbXBsYXRlIFt0ZW1wbGF0ZUluZm9dPVwicm93LmRldGFpbFwiPjwvY21sLXRlbXBsYXRlPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICA8L25nLXRlbXBsYXRlPlxuICA8dHIgKm5nSWY9XCJ0b3RhbFJvd1wiPlxuICAgIDx0ZCAqbmdJZj1cImRhdGFIYXNEZXRhaWxzXCI+XG4gICAgPC90ZD5cbiAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtdG90YWxDb2wgW25nRm9yT2ZdPVwiZGF0YUNvbHVtbnNcIj5cbiAgICAgICAgICA8dGQgKm5nSWY9XCIhdG90YWxDb2wuaGlkZGVuXCIgbmdDbGFzcz1cInt7dG90YWxSb3d8Y2VsbENsYXNzbmFtZTp0b3RhbENvbCB8fCAnJ319XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgPHNwYW4+PGkgbmdDbGFzcz1cInt7dG90YWxSb3d8Y2VsbEljb25DbGFzc25hbWU6dG90YWxDb2wgfHwgJyd9fVwiPjwvaT57e3RvdGFsUm93fGNlbGxWYWx1ZTp0b3RhbENvbH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvdHI+XG48L3Rib2R5PlxuPC90YWJsZT5cbjwvZGl2PlxuPCEtLSBUYWJsZSBmb290ZXIgLS0+XG48Zm9ybSAqbmdJZj1cIiFjb25maWcuaGlkZUZvb3RlciB8fCAoZGF0YSAmJiBwYWdlSW5mby5pdGVtc1BlclBhZ2UgPCBkYXRhLmxlbmd0aClcIiBjbGFzcz1cImZvcm0taG9yaXpvbnRhbFwiPlxuPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93IHRleHQtcmlnaHRcIj5cbiAgPCEtLSBUYWJsZS13aWRlIGZpbHRlciAtLT5cbiAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCI+XG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgIDxpbnB1dCAqbmdJZj1cIiFjb25maWcuaGlkZUdsb2JhbEZpbHRlclwiIHBsYWNlaG9sZGVyPVwiRmlsdGVyIGFsbCBjb2x1bW5zXCIgW29lcGFUYWJsZUZpbHRlcmluZ109XCJ7IGZpbHRlclN0cmluZzogJycgfVwiIFt0YWJsZUlkXT1cInRhYmxlSWRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBpbnB1dC1zbVwiICh0YWJsZUNoYW5nZWQpPVwib25GaWx0ZXJDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgIFtpZF09XCJ0YWJsZUlkKydfRmlsdGVyQWxsQ29sdW1uc0lucHV0J1wiIGFyaWEtbGFiZWw9XCJGaWx0ZXIgYWxsIGNvbHVtbnMgaW4gdGFibGVcIiB0eXBlPVwic2VhcmNoXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiY29uZmlnLnNob3dSb3dDb3VudEluRm9vdGVyICYmIF9kYXRhICYmIF9kYXRhLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICB7e19kYXRhLmxlbmd0aH19Jm5ic3A7dG90YWwgcm93c1xuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDwhLS0gRXhwb3J0IEJ1dHRvbnMgLS0+XG4gIDxkaXYgY2xhc3M9XCJjb2wtc20tNCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJjb25maWcuZXhwb3J0VG9FeGNlbFwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1yLTFcIiAoY2xpY2spPVwiZXhwb3J0VG9FeGNlbCgpXCIgW2lkXT1cInRhYmxlSWQrJ19FeHBvcnRUb0V4Y2VsQnRuJ1wiIGFyaWEtbGFiZWw9XCJFeHBvcnQgdG8gRXhjZWxcIj5FeHBvcnQgdG8gRXhjZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJjb25maWcuZXhwb3J0VG9IVE1MXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXItMVwiIChjbGljayk9XCJleHBvcnRUb0hUTUwoKVwiIFtpZF09XCJ0YWJsZUlkKydfRXhwb3J0VG9IVE1MQnRuJ1wiIGFyaWEtbGFiZWw9XCJFeHBvcnQgdG8gSFRNTFwiPkV4cG9ydCB0byBIVE1MPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJjdXN0b21CdG5WaXNpYmxlXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1yLTFcIiAoY2xpY2spPVwib25DdXN0b21CdG5DbGljaygpXCIgW2lkXT1cInRhYmxlSWQrJ19DdXN0b21CdG4nXCIgW2Rpc2FibGVkXT1cIiFjdXN0b21CdG5FbmFibGVkXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJjdXN0b21CdG5MYWJlbFwiPnt7Y3VzdG9tQnRuTGFiZWx9fTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnLmV4cG9ydFRvRXhjZWwgfHwgY29uZmlnLmV4cG9ydFRvSFRNTFwiIGNsYXNzPVwiY29sLXNtLTEyIHRleHQtY2VudGVyXCI+XG4gICAgICAgIDxzcGFuPkV4cG9ydCBvbmx5IHZpc2libGUgZGF0YTombmJzcDtcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiZXhwb3J0VmlzaWJsZU9ubHlcIiAoY2xpY2spPVwidG9nZ2xlRXhwb3J0VmlzaWJsZU9ubHkoKVwiIGlkPVwiZXhwb3J0VmlzaWJsZU9ubHlDaGVja2JveFwiIGFyaWEtbGFiZWw9XCJFeHBvcnQgb25seSB2aXNpYmxlIGRhdGFcIi8+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPCEtLSBQYWdpbmF0aW9uIC0tPlxuICA8ZGl2ICpuZ0lmPVwiIWNvbmZpZy5kaXNhYmxlUGFnaW5hdGlvblwiIGNsYXNzPVwiY29sLXNtLTQgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICA8cGFnaW5hdGlvbiAqbmdJZj1cInBhZ2luYXRpb25PblwiIGNsYXNzPVwicGFnaW5hdGlvbi1zbVwiIFt0b3RhbEl0ZW1zXT1cInBhZ2VJbmZvLmxlbmd0aFwiIFtpdGVtc1BlclBhZ2VdPVwicGFnZUluZm8uaXRlbXNQZXJQYWdlXCIgW21heFNpemVdPVwicGFnZUluZm8ubWF4U2l6ZVwiXG4gICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnRQYWdlXCIgbmFtZT1cImN1cnJlbnRUYWJsZVBhZ2VcIlxuICAgICAgW2JvdW5kYXJ5TGlua3NdPVwidHJ1ZVwiIFtyb3RhdGVdPVwiZmFsc2VcIiAocGFnZUNoYW5nZWQpPVwib25QYWdlQ2hhbmdlZCgkZXZlbnQpXCIgKG51bVBhZ2VzKT1cInBhZ2VJbmZvLm51bVBhZ2VzID0gJGV2ZW50XCJcbiAgICAgIGFyaWEtbGFiZWw9XCJUYWJsZSBwYWdpbmF0aW9uXCI+XG4gICAgPC9wYWdpbmF0aW9uPlxuICAgICZuYnNwO1xuICAgIDxidXR0b24gKGNsaWNrKT1cInRvZ2dsZVBhZ2luZ2F0aW9uKClcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIG1yLTFcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInBhZ2luYXRpb25PbiA/ICdTaG93IEFsbCBSb3dzJyA6ICdSZXN0b3JlIFBhZ2luYXRpb24nXCI+e3sgcGFnaW5hdGlvbk9uID8gJ1Nob3cgQWxsIFJvd3MnIDogJ1Jlc3RvcmUgUGFnaW5hdGlvbid9fTwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuPC9mb3JtPlxuPGRpdiBjbGFzcz1cImV4cGFuc2lvbi1maWxsZXJcIiAqbmdJZj1cImFkZEFjdGlvbkZpbGxlciAmJiBpc0FueUFjdGlvbkRyb3Bkb3duT3BlblwiIFtzdHlsZS5oZWlnaHQucHhdPVwiYWN0aW9uRmlsbGVySGVpZ2h0XCI+PC9kaXY+Il19