@yibozhang/pro-table 16.1.3 → 16.1.5

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.
@@ -101,6 +101,8 @@ export class ProTableComponent {
101
101
  _autoCompleteDataSources = {};
102
102
  // 控制表格显示状态,用于重新挂载
103
103
  _showTable = true;
104
+ // 动态列加载完成标志,默认 true(无动态列时直接显示)
105
+ _columnsReady = true;
104
106
  // 防抖定时器,用于窗口大小调整
105
107
  resizeDebounce;
106
108
  onWindowResize() {
@@ -148,6 +150,7 @@ export class ProTableComponent {
148
150
  }
149
151
  }
150
152
  async ngOnInit() {
153
+ console.log('aaa');
151
154
  this._searchParams = {};
152
155
  this.formateInnerColumns(this.columns);
153
156
  await this.setSearchParams(this.columns);
@@ -156,6 +159,9 @@ export class ProTableComponent {
156
159
  if (this.autoTriggerRequest) {
157
160
  this.handleQuery();
158
161
  }
162
+ if (this.tableName && this.columnRemote) {
163
+ this._columnsReady = false;
164
+ }
159
165
  this.queryDynamicColumns();
160
166
  }
161
167
  ngAfterContentInit() {
@@ -166,35 +172,40 @@ export class ProTableComponent {
166
172
  async queryDynamicColumns() {
167
173
  if (!this.tableName || !this.columnRemote)
168
174
  return;
169
- const res = await this.fetchRemoteColumns();
170
- if (!res)
171
- return;
172
- if (res.code === 0) {
173
- const _tabColumn = res.data.tabColumn.map((item) => {
174
- return {
175
- title: item.header,
176
- prop: item.field,
177
- sortName: item.sortName,
178
- hideInTable: !item.isShow,
179
- };
180
- });
181
- this._serverColumns = _tabColumn.filter((col) => this.columns.some((localCol) => localCol.prop === col.prop));
182
- this.updateTableColumns(this._serverColumns);
183
- }
184
- else if (res.code === 10) {
185
- // 如果未设置接口返回,需要默认调用一次修改函数初始化数据
186
- const initColumns = this.columns
187
- .filter((col) => !col.auxiliaryColumn)
188
- .map((column) => ({
189
- field: column.prop,
190
- isShow: true,
191
- header: column.title,
192
- sortName: column.sortName || null,
193
- }));
194
- const initRes = await this.persistRemoteColumns(initColumns);
195
- if (initRes) {
196
- this.queryDynamicColumns();
175
+ try {
176
+ const res = await this.fetchRemoteColumns();
177
+ if (!res)
178
+ return;
179
+ if (res.code === 0) {
180
+ const _tabColumn = res.data.tabColumn.map((item) => {
181
+ return {
182
+ title: item.header,
183
+ prop: item.field,
184
+ sortName: item.sortName,
185
+ hideInTable: !item.isShow,
186
+ };
187
+ });
188
+ this._serverColumns = _tabColumn.filter((col) => this.columns.some((localCol) => localCol.prop === col.prop));
189
+ this.updateTableColumns(this._serverColumns);
197
190
  }
191
+ else if (res.code === 10) {
192
+ // 如果未设置接口返回,需要默认调用一次修改函数初始化数据
193
+ const initColumns = this.columns
194
+ .filter((col) => !col.auxiliaryColumn)
195
+ .map((column) => ({
196
+ field: column.prop,
197
+ isShow: true,
198
+ header: column.title,
199
+ sortName: column.sortName || null,
200
+ }));
201
+ const initRes = await this.persistRemoteColumns(initColumns);
202
+ if (initRes) {
203
+ await this.queryDynamicColumns();
204
+ }
205
+ }
206
+ }
207
+ finally {
208
+ this._columnsReady = true;
198
209
  }
199
210
  }
200
211
  formateInnerColumns(columns) {
@@ -978,11 +989,11 @@ export class ProTableComponent {
978
989
  return `pro-table-${fieldName}-form-item`;
979
990
  }
980
991
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProTableComponent, deps: [{ token: PRO_TABLE_COLUMN_REMOTE, optional: true }], target: i0.ɵɵFactoryTarget.Component });
981
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ProTableComponent, selector: "app-pro-table", inputs: { showSearchBtn: "showSearchBtn", showClearBtn: "showClearBtn", title: "title", tableName: "tableName", multiRow: "multiRow", columns: "columns", showSearchBar: "showSearchBar", showActionBar: "showActionBar", confirmBtnText: "confirmBtnText", clearBtnText: "clearBtnText", labelWidth: "labelWidth", labelAlign: "labelAlign", formItemWidth: "formItemWidth", dataSource: "dataSource", bordered: "bordered", outerBordered: "outerBordered", showPagination: "showPagination", frontPagination: "frontPagination", scroll: "scroll", request: "request", summaryData: "summaryData", sortMode: "sortMode", showColumnSetting: "showColumnSetting", multipleSort: "multipleSort", showCheckbox: "showCheckbox", rowDisabled: "rowDisabled", rerenderOnResize: "rerenderOnResize", autoTriggerRequest: "autoTriggerRequest", customTableRender: "customTableRender" }, outputs: { onRowClick: "onRowClick", onRowDbClick: "onRowDbClick", onValuesChange: "onValuesChange", onResetFormBeforeReload: "onResetFormBeforeReload" }, host: { listeners: { "window:resize": "onWindowResize()" } }, queries: [{ propertyName: "actionBarTpl", first: true, predicate: ["actionBar"], descendants: true }, { propertyName: "imgActionBarTpl", first: true, predicate: ["ImgActionBar"], descendants: true }, { propertyName: "allTemplates", predicate: TemplateRef }], ngImport: i0, template: "<app-page-container\r\n [title]=\"title\"\r\n [showHeader]=\"showSearchBar\"\r\n ngClass=\"pro-table-container\"\r\n>\r\n <ng-template #header>\r\n <app-table-search-bar\r\n *ngIf=\"showSearchBar\"\r\n [labelWidth]=\"labelWidth\"\r\n [labelAlign]=\"labelAlign\"\r\n [formItemWidth]=\"formItemWidth\"\r\n >\r\n <ng-template #leftContent>\r\n <nz-form-item\r\n *ngFor=\"let column of _searchFiledColumns\"\r\n [ngClass]=\"getFormItemClassName(column)\"\r\n >\r\n <nz-form-label *ngIf=\"!getFieldProps(column).hideLabel\" nzNoColon>\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49label\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customLabelRender &&\r\n getLabelTemplate(column.customLabelRender);\r\n else defaultLabel\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"getLabelTemplate(column.customLabelRender)\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: column,\r\n column: column,\r\n fieldProps: getFieldProps(column)\r\n }\"\r\n >\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultLabel>\r\n {{ getFieldProps(column).label || column.title }}\r\n </ng-template>\r\n </nz-form-label>\r\n <nz-form-control *ngIf=\"column.valueType === 'input'\">\r\n <input\r\n nz-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [placeholder]=\"getFieldProps(column).placeHolder\"\r\n [disabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n />\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputPlate'\">\r\n <app-plate-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n ></app-plate-input>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'select'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzOptions]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n >\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'selectMultiple'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzOptions]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n nzMode=\"multiple\"\r\n [nzMaxTagCount]=\"2\"\r\n [nzMaxTagPlaceholder]=\"nzMaxTagPlaceholder\"\r\n [nzCustomTemplate]=\"defaultTemplate\"\r\n >\r\n <ng-template #nzMaxTagPlaceholder>\r\n +\r\n {{\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n ?.length\r\n }}\r\n </ng-template>\r\n <ng-template #defaultTemplate let-selected>\r\n {{ selected.nzLabel.length > 4 ? selected.nzLabel.substring(0, 4) + '...' : selected.nzLabel }}\r\n </ng-template>\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'date'\">\r\n <nz-date-picker\r\n [nzShowTime]=\"getFieldProps(column).showTime\"\r\n [nzFormat]=\"getFieldProps(column).format\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzMode]=\"getFieldProps(column).mode\"\r\n ></nz-date-picker>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'checkbox'\">\r\n <nz-checkbox-group\r\n [class]=\"\r\n getFieldProps(column).noStyle\r\n ? 'pro-table-checkboxgroup-nostyle'\r\n : ''\r\n \"\r\n [(ngModel)]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n (ngModelChange)=\"\r\n handleFieldCheckBoxChange(\r\n $event,\r\n getFieldProps(column).name || column.prop\r\n )\r\n \"\r\n ></nz-checkbox-group>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'autoComplete'\">\r\n <input\r\n nz-input\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column)?.name || column.prop]\r\n \"\r\n (input)=\"handleAutoCompleteInput($event, column)\"\r\n [nzAutocomplete]=\"auto\"\r\n [disabled]=\"getFieldProps(column)?.disabled\"\r\n [placeholder]=\"getFieldProps(column)?.placeHolder\"\r\n />\r\n <nz-autocomplete\r\n [nzBackfill]=\"getFieldProps(column).backFill\"\r\n [nzDefaultActiveFirstOption]=\"\r\n getFieldProps(column).defaultActiveFirstOption\r\n \"\r\n [nzWidth]=\"getFieldProps(column).width\"\r\n #auto\r\n >\r\n <nz-auto-option\r\n *ngFor=\"let option of getAutoCompleteDataSource(column)\"\r\n [nzValue]=\"\r\n getFieldProps(column).returnFullData ? option : option.value\r\n \"\r\n [nzLabel]=\"option.label\"\r\n [nzDisabled]=\"option.disabled\"\r\n >\r\n {{ option.label }}\r\n </nz-auto-option>\r\n </nz-autocomplete>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'custom'\">\r\n <app-dynamic-search-field\r\n [component]=\"getFieldProps(column).component\"\r\n [value]=\"_searchParams[getFieldProps(column).name || column.prop]\"\r\n [props]=\"getFieldProps(column)\"\r\n (valueChange)=\"\r\n setFieldValue(getFieldProps(column).name || column.prop, $event)\r\n \"\r\n ></app-dynamic-search-field>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputNumber'\">\r\n <nz-input-number\r\n [style.width]=\"'100%'\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzFormatter]=\"getFieldProps(column).formatterPercent\"\r\n [nzParser]=\"getFieldProps(column).parserPercent\"\r\n ></nz-input-number>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </ng-template>\r\n <ng-template #actionTextBtn>\r\n <nz-space [nzSize]=\"4\">\r\n <ng-template nzSpaceItem *ngIf=\"showSearchBtn\">\r\n <button nz-button nzType=\"primary\" (click)=\"handleSearch()\">\r\n {{ confirmBtnText }}\r\n </button>\r\n </ng-template>\r\n <ng-template nzSpaceItem *ngIf=\"showClearBtn\">\r\n <button nz-button (click)=\"handleResetForm()\">\r\n {{ clearBtnText }}\r\n </button>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n <ng-template #actionImgBtn>\r\n <nz-space>\r\n <ng-container *ngTemplateOutlet=\"imgActionBarTpl\"></ng-container>\r\n <ng-template nzSpaceItem class=\"setting-space-item\" *ngIf=\"showColumnSetting\">\r\n <span nz-tooltip nzTooltipTitle=\"\u8BBE\u7F6E\u5B57\u6BB5\">\r\n <app-colmuns-setting\r\n [columns]=\"columns\"\r\n [selectedColumns]=\"_serverColumns\"\r\n [tableName]=\"tableName\"\r\n (afterConfirm)=\"handleColumnsSettingConfirm()\"\r\n ></app-colmuns-setting>\r\n </span>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n </app-table-search-bar>\r\n </ng-template>\r\n\r\n <ng-template #body>\r\n <div class=\"mb-4\">\r\n <ng-container *ngIf=\"showActionBar\">\r\n <ng-container *ngTemplateOutlet=\"actionBarTpl\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"customTableRender\">\r\n <ng-container *ngTemplateOutlet=\"customTableRender\"></ng-container>\r\n </ng-container>\r\n <nz-table\r\n *ngIf=\"!customTableRender && _showTable\"\r\n #dynamicTable\r\n nzSize=\"small\"\r\n nzShowSizeChanger\r\n [nzBordered]=\"bordered\"\r\n [nzOuterBordered]=\"outerBordered\"\r\n [nzData]=\"dataSource\"\r\n [nzPageIndex]=\"_pageInfo.pageIndex\"\r\n [nzPageSize]=\"_pageInfo.pageSize\"\r\n [nzTotal]=\"_pageInfo.total\"\r\n [nzPageSizeOptions]=\"_pageInfo.pageSizeOptions\"\r\n [nzShowPagination]=\"showPagination\"\r\n [nzShowTotal]=\"totalTemplate\"\r\n [nzLoading]=\"_loading\"\r\n [nzFrontPagination]=\"frontPagination\"\r\n [nzScroll]=\"scroll\"\r\n (nzPageIndexChange)=\"handlePageIndexChange($event)\"\r\n (nzPageSizeChange)=\"handlePageSizeChange($event)\"\r\n >\r\n <thead>\r\n <tr>\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <th\r\n *ngIf=\"showCheckbox\"\r\n [nzWidth]=\"'50px'\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center\"\r\n [(nzChecked)]=\"_checkedAll\"\r\n [nzIndeterminate]=\"_indeterminate\"\r\n (nzCheckedChange)=\"toggleCheckAll($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></th>\r\n <th\r\n *ngFor=\"let column of _columns\"\r\n [nzWidth]=\"column.width\"\r\n [nzAlign]=\"column.align\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n [nzShowSort]=\"!!column.sorter\"\r\n [nzSortOrder]=\"getSortOrder(column.prop)\"\r\n (nzSortOrderChange)=\"onSortChange(column.prop, $event)\"\r\n >\r\n {{ column.title }}\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <tr\r\n style=\"cursor: pointer\"\r\n *ngFor=\"let data; let i = index; of: dynamicTable.data\"\r\n [ngClass]=\"{\r\n 'ant-table-custom-row-selected': !!getTableRowChecked(data),\r\n 'ant-table-custom-row-even': i % 2 === 0,\r\n 'ant-table-custom-row-odd': i % 2 !== 0\r\n }\"\r\n (click)=\"handleTableRowClick(data)\"\r\n (dblclick)=\"handleTableRowDbClick(data)\"\r\n >\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center; width: 50px\"\r\n [(nzChecked)]=\"data.checked\"\r\n [nzDisabled]=\"isRowDisabled(data)\"\r\n (nzCheckedChange)=\"handleRowCheckedChange(data, $event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column of _columns\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n [nzAlign]=\"column.align\"\r\n [ngClass]=\"{\r\n 'pro-nowrap': true\r\n }\"\r\n >\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customRender && getTemplate(column.customRender);\r\n let template\r\n \"\r\n >\r\n <ng-template\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: data,\r\n data: data,\r\n column: column,\r\n index: i,\r\n pageInfo: _pageInfo\r\n }\"\r\n >\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- \u9ED8\u8BA4\u6E32\u67D3\u903B\u8F91 -->\r\n <ng-container\r\n *ngIf=\"!column.customRender || !getTemplate(column.customRender)\"\r\n >\r\n <ng-container *ngIf=\"column.ellipsis\">\r\n <div\r\n class=\"pro-ellipsis\"\r\n [title]=\"data[column.prop]\"\r\n [ngStyle]=\"{\r\n width: 'calc(' + column.width + ' - 25px)'\r\n }\"\r\n >\r\n {{ data[column.prop] }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!column.ellipsis\">\r\n {{ data[column.prop] }}\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"summaryData && _pageInfo.total > 0\">\r\n <!-- \u6C47\u603B\u884C\u7684\u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF0C\u4F46\u4E3A\u7A7A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column; let i = index; of: _columns\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n [nzAlign]=\"column.align\"\r\n >\r\n <span *ngIf=\"i === 0\">\u603B\u8BA1</span>\r\n <ng-container *ngIf=\"i !== 0 && column.summary\">\r\n {{\r\n column.summary?.format\r\n ? column.summary?.format(\r\n summaryData[column.summary?.name || column.prop]\r\n )\r\n : summaryData[column.summary?.name || column.prop]\r\n }}\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <ng-template #totalTemplate let-total\r\n >\u5171 {{ _pageInfo.total }} \u6761\u8BB0\u5F55</ng-template\r\n >\r\n </nz-table>\r\n </ng-template>\r\n</app-page-container>\r\n", styles: [".pro-ellipsis{overflow:hidden;text-overflow:ellipsis}.pro-nowrap{white-space:nowrap}::ng-deep .setting-space-item{margin-right:0!important}::ng-deep .pro-table-checkboxgroup-nostyle{white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body table{border-collapse:separate;border-spacing:0}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important;white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:first-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:first-child{border-left:none!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th{border-top:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:last-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:last-child{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr:last-child>td{border-bottom:1px solid #e8e8e8!important}::ng-deep .table-search-bar-left .ant-form-item{margin-bottom:4px}::ng-deep .table-search-bar-left .ant-form-item .ant-form-item-label>label{color:#5a5a5a}::ng-deep .pro-table-container .page-container-body{padding:8px 0 0!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i3.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "component", type: i4.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i4.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i4.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { kind: "component", type: i5.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzStatus", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzPlacement", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzSelectOnTab", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { kind: "component", type: i6.NzSpaceComponent, selector: "nz-space, [nz-space]", inputs: ["nzDirection", "nzAlign", "nzSplit", "nzWrap", "nzSize"], exportAs: ["NzSpace"] }, { kind: "directive", type: i6.NzSpaceItemDirective, selector: "[nzSpaceItem]" }, { kind: "directive", type: i7.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i8.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i9.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i10.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "component", type: i11.PageContainerComponent, selector: "app-page-container", inputs: ["title", "showHeader"] }, { kind: "component", type: i12.TableSearchBarComponent, selector: "app-table-search-bar", inputs: ["leftColSpan", "rightColSpan", "labelWidth", "labelAlign", "formItemWidth"] }, { kind: "component", type: i13.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "component", type: i13.NzThAddOnComponent, selector: "th[nzColumnKey], th[nzSortFn], th[nzSortOrder], th[nzFilters], th[nzShowSort], th[nzShowFilter], th[nzCustomFilter]", inputs: ["nzColumnKey", "nzFilterMultiple", "nzSortOrder", "nzSortPriority", "nzSortDirections", "nzFilters", "nzSortFn", "nzFilterFn", "nzShowSort", "nzShowFilter", "nzCustomFilter"], outputs: ["nzCheckedChange", "nzSortOrderChange", "nzFilterChange"] }, { kind: "directive", type: i13.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i13.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i13.NzTdAddOnComponent, selector: "td[nzChecked], td[nzDisabled], td[nzIndeterminate], td[nzIndentSize], td[nzExpand], td[nzShowExpand], td[nzShowCheckbox]", inputs: ["nzChecked", "nzDisabled", "nzIndeterminate", "nzIndentSize", "nzShowExpand", "nzShowCheckbox", "nzExpand"], outputs: ["nzCheckedChange", "nzExpandChange"] }, { kind: "component", type: i13.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i13.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i13.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i13.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "directive", type: i13.NzCellAlignDirective, selector: "th[nzAlign],td[nzAlign]", inputs: ["nzAlign"] }, { kind: "component", type: i13.NzThSelectionComponent, selector: "th[nzSelections],th[nzChecked],th[nzShowCheckbox],th[nzShowRowSelection]", inputs: ["nzSelections", "nzChecked", "nzDisabled", "nzIndeterminate", "nzShowCheckbox", "nzShowRowSelection"], outputs: ["nzCheckedChange"] }, { kind: "component", type: i14.PlateInputComponent, selector: "app-plate-input" }, { kind: "component", type: i15.NzDatePickerComponent, selector: "nz-date-picker,nz-week-picker,nz-month-picker,nz-year-picker,nz-range-picker", inputs: ["nzAllowClear", "nzAutoFocus", "nzDisabled", "nzBorderless", "nzInputReadOnly", "nzInline", "nzOpen", "nzDisabledDate", "nzLocale", "nzPlaceHolder", "nzPopupStyle", "nzDropdownClassName", "nzSize", "nzStatus", "nzFormat", "nzDateRender", "nzDisabledTime", "nzRenderExtraFooter", "nzShowToday", "nzMode", "nzShowNow", "nzRanges", "nzDefaultPickerValue", "nzSeparator", "nzSuffixIcon", "nzBackdrop", "nzId", "nzPlacement", "nzShowWeekNumber", "nzShowTime"], outputs: ["nzOnPanelChange", "nzOnCalendarChange", "nzOnOk", "nzOnOpenChange"], exportAs: ["nzDatePicker"] }, { kind: "component", type: i16.NzCheckboxGroupComponent, selector: "nz-checkbox-group", inputs: ["nzDisabled"], exportAs: ["nzCheckboxGroup"] }, { kind: "component", type: i17.NzAutocompleteComponent, selector: "nz-autocomplete", inputs: ["nzWidth", "nzOverlayClassName", "nzOverlayStyle", "nzDefaultActiveFirstOption", "nzBackfill", "compareWith", "nzDataSource"], outputs: ["selectionChange"], exportAs: ["nzAutocomplete"] }, { kind: "component", type: i17.NzAutocompleteOptionComponent, selector: "nz-auto-option", inputs: ["nzValue", "nzLabel", "nzDisabled"], outputs: ["selectionChange", "mouseEntered"], exportAs: ["nzAutoOption"] }, { kind: "directive", type: i17.NzAutocompleteTriggerDirective, selector: "input[nzAutocomplete], textarea[nzAutocomplete]", inputs: ["nzAutocomplete"], exportAs: ["nzAutocompleteTrigger"] }, { kind: "component", type: i18.NzInputNumberComponent, selector: "nz-input-number", inputs: ["nzSize", "nzMin", "nzMax", "nzParser", "nzPrecision", "nzPrecisionMode", "nzPlaceHolder", "nzStatus", "nzStep", "nzInputMode", "nzId", "nzDisabled", "nzReadOnly", "nzAutoFocus", "nzBorderless", "nzFormatter"], outputs: ["nzBlur", "nzFocus"], exportAs: ["nzInputNumber"] }, { kind: "directive", type: i19.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "component", type: i20.ColmunsSettingComponent, selector: "app-colmuns-setting", inputs: ["columns", "selectedColumns", "tableName"], outputs: ["afterConfirm"] }, { kind: "component", type: i21.DynamicSearchFieldComponent, selector: "app-dynamic-search-field", inputs: ["component", "value", "props"], outputs: ["valueChange"] }] });
992
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ProTableComponent, selector: "app-pro-table", inputs: { showSearchBtn: "showSearchBtn", showClearBtn: "showClearBtn", title: "title", tableName: "tableName", multiRow: "multiRow", columns: "columns", showSearchBar: "showSearchBar", showActionBar: "showActionBar", confirmBtnText: "confirmBtnText", clearBtnText: "clearBtnText", labelWidth: "labelWidth", labelAlign: "labelAlign", formItemWidth: "formItemWidth", dataSource: "dataSource", bordered: "bordered", outerBordered: "outerBordered", showPagination: "showPagination", frontPagination: "frontPagination", scroll: "scroll", request: "request", summaryData: "summaryData", sortMode: "sortMode", showColumnSetting: "showColumnSetting", multipleSort: "multipleSort", showCheckbox: "showCheckbox", rowDisabled: "rowDisabled", rerenderOnResize: "rerenderOnResize", autoTriggerRequest: "autoTriggerRequest", customTableRender: "customTableRender" }, outputs: { onRowClick: "onRowClick", onRowDbClick: "onRowDbClick", onValuesChange: "onValuesChange", onResetFormBeforeReload: "onResetFormBeforeReload" }, host: { listeners: { "window:resize": "onWindowResize()" } }, queries: [{ propertyName: "actionBarTpl", first: true, predicate: ["actionBar"], descendants: true }, { propertyName: "imgActionBarTpl", first: true, predicate: ["ImgActionBar"], descendants: true }, { propertyName: "allTemplates", predicate: TemplateRef }], ngImport: i0, template: "<app-page-container\r\n [title]=\"title\"\r\n [showHeader]=\"showSearchBar\"\r\n ngClass=\"pro-table-container\"\r\n>\r\n <ng-template #header>\r\n <app-table-search-bar\r\n *ngIf=\"showSearchBar\"\r\n [labelWidth]=\"labelWidth\"\r\n [labelAlign]=\"labelAlign\"\r\n [formItemWidth]=\"formItemWidth\"\r\n >\r\n <ng-template #leftContent>\r\n <nz-form-item\r\n *ngFor=\"let column of _searchFiledColumns\"\r\n [ngClass]=\"getFormItemClassName(column)\"\r\n >\r\n <nz-form-label *ngIf=\"!getFieldProps(column).hideLabel\" nzNoColon>\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49label\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customLabelRender &&\r\n getLabelTemplate(column.customLabelRender);\r\n else defaultLabel\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"getLabelTemplate(column.customLabelRender)\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: column,\r\n column: column,\r\n fieldProps: getFieldProps(column)\r\n }\"\r\n >\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultLabel>\r\n {{ getFieldProps(column).label || column.title }}\r\n </ng-template>\r\n </nz-form-label>\r\n <nz-form-control *ngIf=\"column.valueType === 'input'\">\r\n <input\r\n nz-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [placeholder]=\"getFieldProps(column).placeHolder\"\r\n [disabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n />\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputPlate'\">\r\n <app-plate-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n ></app-plate-input>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'select'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzOptions]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n >\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'selectMultiple'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzOptions]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n nzMode=\"multiple\"\r\n [nzMaxTagCount]=\"2\"\r\n [nzMaxTagPlaceholder]=\"nzMaxTagPlaceholder\"\r\n [nzCustomTemplate]=\"defaultTemplate\"\r\n >\r\n <ng-template #nzMaxTagPlaceholder>\r\n +\r\n {{\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n ?.length\r\n }}\r\n </ng-template>\r\n <ng-template #defaultTemplate let-selected>\r\n {{ selected.nzLabel.length > 4 ? selected.nzLabel.substring(0, 4) + '...' : selected.nzLabel }}\r\n </ng-template>\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'date'\">\r\n <nz-date-picker\r\n [nzShowTime]=\"getFieldProps(column).showTime\"\r\n [nzFormat]=\"getFieldProps(column).format\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzMode]=\"getFieldProps(column).mode\"\r\n ></nz-date-picker>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'checkbox'\">\r\n <nz-checkbox-group\r\n [class]=\"\r\n getFieldProps(column).noStyle\r\n ? 'pro-table-checkboxgroup-nostyle'\r\n : ''\r\n \"\r\n [(ngModel)]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n (ngModelChange)=\"\r\n handleFieldCheckBoxChange(\r\n $event,\r\n getFieldProps(column).name || column.prop\r\n )\r\n \"\r\n ></nz-checkbox-group>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'autoComplete'\">\r\n <input\r\n nz-input\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column)?.name || column.prop]\r\n \"\r\n (input)=\"handleAutoCompleteInput($event, column)\"\r\n [nzAutocomplete]=\"auto\"\r\n [disabled]=\"getFieldProps(column)?.disabled\"\r\n [placeholder]=\"getFieldProps(column)?.placeHolder\"\r\n />\r\n <nz-autocomplete\r\n [nzBackfill]=\"getFieldProps(column).backFill\"\r\n [nzDefaultActiveFirstOption]=\"\r\n getFieldProps(column).defaultActiveFirstOption\r\n \"\r\n [nzWidth]=\"getFieldProps(column).width\"\r\n #auto\r\n >\r\n <nz-auto-option\r\n *ngFor=\"let option of getAutoCompleteDataSource(column)\"\r\n [nzValue]=\"\r\n getFieldProps(column).returnFullData ? option : option.value\r\n \"\r\n [nzLabel]=\"option.label\"\r\n [nzDisabled]=\"option.disabled\"\r\n >\r\n {{ option.label }}\r\n </nz-auto-option>\r\n </nz-autocomplete>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'custom'\">\r\n <app-dynamic-search-field\r\n [component]=\"getFieldProps(column).component\"\r\n [value]=\"_searchParams[getFieldProps(column).name || column.prop]\"\r\n [props]=\"getFieldProps(column)\"\r\n (valueChange)=\"\r\n setFieldValue(getFieldProps(column).name || column.prop, $event)\r\n \"\r\n ></app-dynamic-search-field>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputNumber'\">\r\n <nz-input-number\r\n [style.width]=\"'100%'\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzFormatter]=\"getFieldProps(column).formatterPercent\"\r\n [nzParser]=\"getFieldProps(column).parserPercent\"\r\n ></nz-input-number>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </ng-template>\r\n <ng-template #actionTextBtn>\r\n <nz-space [nzSize]=\"4\">\r\n <ng-template nzSpaceItem *ngIf=\"showSearchBtn\">\r\n <button nz-button nzType=\"primary\" (click)=\"handleSearch()\">\r\n {{ confirmBtnText }}\r\n </button>\r\n </ng-template>\r\n <ng-template nzSpaceItem *ngIf=\"showClearBtn\">\r\n <button nz-button (click)=\"handleResetForm()\">\r\n {{ clearBtnText }}\r\n </button>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n <ng-template #actionImgBtn>\r\n <nz-space>\r\n <ng-container *ngTemplateOutlet=\"imgActionBarTpl\"></ng-container>\r\n <ng-template nzSpaceItem class=\"setting-space-item\" *ngIf=\"showColumnSetting\">\r\n <span nz-tooltip nzTooltipTitle=\"\u8BBE\u7F6E\u5B57\u6BB5\">\r\n <app-colmuns-setting\r\n [columns]=\"columns\"\r\n [selectedColumns]=\"_serverColumns\"\r\n [tableName]=\"tableName\"\r\n (afterConfirm)=\"handleColumnsSettingConfirm()\"\r\n ></app-colmuns-setting>\r\n </span>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n </app-table-search-bar>\r\n </ng-template>\r\n\r\n <ng-template #body>\r\n <div class=\"mb-4\">\r\n <ng-container *ngIf=\"showActionBar\">\r\n <ng-container *ngTemplateOutlet=\"actionBarTpl\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"customTableRender\">\r\n <ng-container *ngTemplateOutlet=\"customTableRender\"></ng-container>\r\n </ng-container>\r\n <nz-table\r\n *ngIf=\"!customTableRender && _showTable && _columnsReady\"\r\n #dynamicTable\r\n nzSize=\"small\"\r\n nzShowSizeChanger\r\n [nzBordered]=\"bordered\"\r\n [nzOuterBordered]=\"outerBordered\"\r\n [nzData]=\"dataSource\"\r\n [nzPageIndex]=\"_pageInfo.pageIndex\"\r\n [nzPageSize]=\"_pageInfo.pageSize\"\r\n [nzTotal]=\"_pageInfo.total\"\r\n [nzPageSizeOptions]=\"_pageInfo.pageSizeOptions\"\r\n [nzShowPagination]=\"showPagination\"\r\n [nzShowTotal]=\"totalTemplate\"\r\n [nzLoading]=\"_loading\"\r\n [nzFrontPagination]=\"frontPagination\"\r\n [nzScroll]=\"scroll\"\r\n (nzPageIndexChange)=\"handlePageIndexChange($event)\"\r\n (nzPageSizeChange)=\"handlePageSizeChange($event)\"\r\n >\r\n <thead>\r\n <tr>\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <th\r\n *ngIf=\"showCheckbox\"\r\n [nzWidth]=\"'50px'\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center\"\r\n [(nzChecked)]=\"_checkedAll\"\r\n [nzIndeterminate]=\"_indeterminate\"\r\n (nzCheckedChange)=\"toggleCheckAll($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></th>\r\n <th\r\n *ngFor=\"let column of _columns\"\r\n [nzWidth]=\"column.width\"\r\n [nzAlign]=\"column.align\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n [nzShowSort]=\"!!column.sorter\"\r\n [nzSortOrder]=\"getSortOrder(column.prop)\"\r\n (nzSortOrderChange)=\"onSortChange(column.prop, $event)\"\r\n >\r\n {{ column.title }}\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <tr\r\n style=\"cursor: pointer\"\r\n *ngFor=\"let data; let i = index; of: dynamicTable.data\"\r\n [ngClass]=\"{\r\n 'ant-table-custom-row-selected': !!getTableRowChecked(data),\r\n 'ant-table-custom-row-even': i % 2 === 0,\r\n 'ant-table-custom-row-odd': i % 2 !== 0\r\n }\"\r\n (click)=\"handleTableRowClick(data)\"\r\n (dblclick)=\"handleTableRowDbClick(data)\"\r\n >\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center; width: 50px\"\r\n [(nzChecked)]=\"data.checked\"\r\n [nzDisabled]=\"isRowDisabled(data)\"\r\n (nzCheckedChange)=\"handleRowCheckedChange(data, $event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column of _columns\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n [nzAlign]=\"column.align\"\r\n [ngClass]=\"{\r\n 'pro-nowrap': true\r\n }\"\r\n >\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customRender && getTemplate(column.customRender);\r\n let template\r\n \"\r\n >\r\n <ng-template\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: data,\r\n data: data,\r\n column: column,\r\n index: i,\r\n pageInfo: _pageInfo\r\n }\"\r\n >\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- \u9ED8\u8BA4\u6E32\u67D3\u903B\u8F91 -->\r\n <ng-container\r\n *ngIf=\"!column.customRender || !getTemplate(column.customRender)\"\r\n >\r\n <ng-container *ngIf=\"column.ellipsis\">\r\n <div\r\n class=\"pro-ellipsis\"\r\n [title]=\"data[column.prop]\"\r\n [ngStyle]=\"{\r\n width: 'calc(' + column.width + ' - 25px)'\r\n }\"\r\n >\r\n {{ data[column.prop] }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!column.ellipsis\">\r\n {{ data[column.prop] }}\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"summaryData && _pageInfo.total > 0\">\r\n <!-- \u6C47\u603B\u884C\u7684\u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF0C\u4F46\u4E3A\u7A7A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column; let i = index; of: _columns\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n [nzAlign]=\"column.align\"\r\n >\r\n <span *ngIf=\"i === 0\">\u603B\u8BA1</span>\r\n <ng-container *ngIf=\"i !== 0 && column.summary\">\r\n {{\r\n column.summary?.format\r\n ? column.summary?.format(\r\n summaryData[column.summary?.name || column.prop]\r\n )\r\n : summaryData[column.summary?.name || column.prop]\r\n }}\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <ng-template #totalTemplate let-total\r\n >\u5171 {{ _pageInfo.total }} \u6761\u8BB0\u5F55</ng-template\r\n >\r\n </nz-table>\r\n </ng-template>\r\n</app-page-container>\r\n", styles: [".pro-ellipsis{overflow:hidden;text-overflow:ellipsis}.pro-nowrap{white-space:nowrap}::ng-deep .setting-space-item{margin-right:0!important}::ng-deep .pro-table-checkboxgroup-nostyle{white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body table{border-collapse:separate;border-spacing:0}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important;white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:first-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:first-child{border-left:none!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th{border-top:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:last-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:last-child{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr:last-child>td{border-bottom:1px solid #e8e8e8!important}::ng-deep .table-search-bar-left .ant-form-item{margin-bottom:4px}::ng-deep .table-search-bar-left .ant-form-item .ant-form-item-label>label{color:#5a5a5a}::ng-deep .pro-table-container .page-container-body{padding:8px 0 0!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i3.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "component", type: i4.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i4.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i4.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { kind: "component", type: i5.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzStatus", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzPlacement", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzSelectOnTab", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { kind: "component", type: i6.NzSpaceComponent, selector: "nz-space, [nz-space]", inputs: ["nzDirection", "nzAlign", "nzSplit", "nzWrap", "nzSize"], exportAs: ["NzSpace"] }, { kind: "directive", type: i6.NzSpaceItemDirective, selector: "[nzSpaceItem]" }, { kind: "directive", type: i7.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i8.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i9.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i10.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "component", type: i11.PageContainerComponent, selector: "app-page-container", inputs: ["title", "showHeader"] }, { kind: "component", type: i12.TableSearchBarComponent, selector: "app-table-search-bar", inputs: ["leftColSpan", "rightColSpan", "labelWidth", "labelAlign", "formItemWidth"] }, { kind: "component", type: i13.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "component", type: i13.NzThAddOnComponent, selector: "th[nzColumnKey], th[nzSortFn], th[nzSortOrder], th[nzFilters], th[nzShowSort], th[nzShowFilter], th[nzCustomFilter]", inputs: ["nzColumnKey", "nzFilterMultiple", "nzSortOrder", "nzSortPriority", "nzSortDirections", "nzFilters", "nzSortFn", "nzFilterFn", "nzShowSort", "nzShowFilter", "nzCustomFilter"], outputs: ["nzCheckedChange", "nzSortOrderChange", "nzFilterChange"] }, { kind: "directive", type: i13.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i13.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i13.NzTdAddOnComponent, selector: "td[nzChecked], td[nzDisabled], td[nzIndeterminate], td[nzIndentSize], td[nzExpand], td[nzShowExpand], td[nzShowCheckbox]", inputs: ["nzChecked", "nzDisabled", "nzIndeterminate", "nzIndentSize", "nzShowExpand", "nzShowCheckbox", "nzExpand"], outputs: ["nzCheckedChange", "nzExpandChange"] }, { kind: "component", type: i13.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i13.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i13.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i13.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "directive", type: i13.NzCellAlignDirective, selector: "th[nzAlign],td[nzAlign]", inputs: ["nzAlign"] }, { kind: "component", type: i13.NzThSelectionComponent, selector: "th[nzSelections],th[nzChecked],th[nzShowCheckbox],th[nzShowRowSelection]", inputs: ["nzSelections", "nzChecked", "nzDisabled", "nzIndeterminate", "nzShowCheckbox", "nzShowRowSelection"], outputs: ["nzCheckedChange"] }, { kind: "component", type: i14.PlateInputComponent, selector: "app-plate-input" }, { kind: "component", type: i15.NzDatePickerComponent, selector: "nz-date-picker,nz-week-picker,nz-month-picker,nz-year-picker,nz-range-picker", inputs: ["nzAllowClear", "nzAutoFocus", "nzDisabled", "nzBorderless", "nzInputReadOnly", "nzInline", "nzOpen", "nzDisabledDate", "nzLocale", "nzPlaceHolder", "nzPopupStyle", "nzDropdownClassName", "nzSize", "nzStatus", "nzFormat", "nzDateRender", "nzDisabledTime", "nzRenderExtraFooter", "nzShowToday", "nzMode", "nzShowNow", "nzRanges", "nzDefaultPickerValue", "nzSeparator", "nzSuffixIcon", "nzBackdrop", "nzId", "nzPlacement", "nzShowWeekNumber", "nzShowTime"], outputs: ["nzOnPanelChange", "nzOnCalendarChange", "nzOnOk", "nzOnOpenChange"], exportAs: ["nzDatePicker"] }, { kind: "component", type: i16.NzCheckboxGroupComponent, selector: "nz-checkbox-group", inputs: ["nzDisabled"], exportAs: ["nzCheckboxGroup"] }, { kind: "component", type: i17.NzAutocompleteComponent, selector: "nz-autocomplete", inputs: ["nzWidth", "nzOverlayClassName", "nzOverlayStyle", "nzDefaultActiveFirstOption", "nzBackfill", "compareWith", "nzDataSource"], outputs: ["selectionChange"], exportAs: ["nzAutocomplete"] }, { kind: "component", type: i17.NzAutocompleteOptionComponent, selector: "nz-auto-option", inputs: ["nzValue", "nzLabel", "nzDisabled"], outputs: ["selectionChange", "mouseEntered"], exportAs: ["nzAutoOption"] }, { kind: "directive", type: i17.NzAutocompleteTriggerDirective, selector: "input[nzAutocomplete], textarea[nzAutocomplete]", inputs: ["nzAutocomplete"], exportAs: ["nzAutocompleteTrigger"] }, { kind: "component", type: i18.NzInputNumberComponent, selector: "nz-input-number", inputs: ["nzSize", "nzMin", "nzMax", "nzParser", "nzPrecision", "nzPrecisionMode", "nzPlaceHolder", "nzStatus", "nzStep", "nzInputMode", "nzId", "nzDisabled", "nzReadOnly", "nzAutoFocus", "nzBorderless", "nzFormatter"], outputs: ["nzBlur", "nzFocus"], exportAs: ["nzInputNumber"] }, { kind: "directive", type: i19.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "component", type: i20.ColmunsSettingComponent, selector: "app-colmuns-setting", inputs: ["columns", "selectedColumns", "tableName"], outputs: ["afterConfirm"] }, { kind: "component", type: i21.DynamicSearchFieldComponent, selector: "app-dynamic-search-field", inputs: ["component", "value", "props"], outputs: ["valueChange"] }] });
982
993
  }
983
994
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProTableComponent, decorators: [{
984
995
  type: Component,
985
- args: [{ selector: "app-pro-table", template: "<app-page-container\r\n [title]=\"title\"\r\n [showHeader]=\"showSearchBar\"\r\n ngClass=\"pro-table-container\"\r\n>\r\n <ng-template #header>\r\n <app-table-search-bar\r\n *ngIf=\"showSearchBar\"\r\n [labelWidth]=\"labelWidth\"\r\n [labelAlign]=\"labelAlign\"\r\n [formItemWidth]=\"formItemWidth\"\r\n >\r\n <ng-template #leftContent>\r\n <nz-form-item\r\n *ngFor=\"let column of _searchFiledColumns\"\r\n [ngClass]=\"getFormItemClassName(column)\"\r\n >\r\n <nz-form-label *ngIf=\"!getFieldProps(column).hideLabel\" nzNoColon>\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49label\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customLabelRender &&\r\n getLabelTemplate(column.customLabelRender);\r\n else defaultLabel\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"getLabelTemplate(column.customLabelRender)\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: column,\r\n column: column,\r\n fieldProps: getFieldProps(column)\r\n }\"\r\n >\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultLabel>\r\n {{ getFieldProps(column).label || column.title }}\r\n </ng-template>\r\n </nz-form-label>\r\n <nz-form-control *ngIf=\"column.valueType === 'input'\">\r\n <input\r\n nz-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [placeholder]=\"getFieldProps(column).placeHolder\"\r\n [disabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n />\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputPlate'\">\r\n <app-plate-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n ></app-plate-input>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'select'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzOptions]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n >\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'selectMultiple'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzOptions]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n nzMode=\"multiple\"\r\n [nzMaxTagCount]=\"2\"\r\n [nzMaxTagPlaceholder]=\"nzMaxTagPlaceholder\"\r\n [nzCustomTemplate]=\"defaultTemplate\"\r\n >\r\n <ng-template #nzMaxTagPlaceholder>\r\n +\r\n {{\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n ?.length\r\n }}\r\n </ng-template>\r\n <ng-template #defaultTemplate let-selected>\r\n {{ selected.nzLabel.length > 4 ? selected.nzLabel.substring(0, 4) + '...' : selected.nzLabel }}\r\n </ng-template>\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'date'\">\r\n <nz-date-picker\r\n [nzShowTime]=\"getFieldProps(column).showTime\"\r\n [nzFormat]=\"getFieldProps(column).format\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzMode]=\"getFieldProps(column).mode\"\r\n ></nz-date-picker>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'checkbox'\">\r\n <nz-checkbox-group\r\n [class]=\"\r\n getFieldProps(column).noStyle\r\n ? 'pro-table-checkboxgroup-nostyle'\r\n : ''\r\n \"\r\n [(ngModel)]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n (ngModelChange)=\"\r\n handleFieldCheckBoxChange(\r\n $event,\r\n getFieldProps(column).name || column.prop\r\n )\r\n \"\r\n ></nz-checkbox-group>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'autoComplete'\">\r\n <input\r\n nz-input\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column)?.name || column.prop]\r\n \"\r\n (input)=\"handleAutoCompleteInput($event, column)\"\r\n [nzAutocomplete]=\"auto\"\r\n [disabled]=\"getFieldProps(column)?.disabled\"\r\n [placeholder]=\"getFieldProps(column)?.placeHolder\"\r\n />\r\n <nz-autocomplete\r\n [nzBackfill]=\"getFieldProps(column).backFill\"\r\n [nzDefaultActiveFirstOption]=\"\r\n getFieldProps(column).defaultActiveFirstOption\r\n \"\r\n [nzWidth]=\"getFieldProps(column).width\"\r\n #auto\r\n >\r\n <nz-auto-option\r\n *ngFor=\"let option of getAutoCompleteDataSource(column)\"\r\n [nzValue]=\"\r\n getFieldProps(column).returnFullData ? option : option.value\r\n \"\r\n [nzLabel]=\"option.label\"\r\n [nzDisabled]=\"option.disabled\"\r\n >\r\n {{ option.label }}\r\n </nz-auto-option>\r\n </nz-autocomplete>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'custom'\">\r\n <app-dynamic-search-field\r\n [component]=\"getFieldProps(column).component\"\r\n [value]=\"_searchParams[getFieldProps(column).name || column.prop]\"\r\n [props]=\"getFieldProps(column)\"\r\n (valueChange)=\"\r\n setFieldValue(getFieldProps(column).name || column.prop, $event)\r\n \"\r\n ></app-dynamic-search-field>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputNumber'\">\r\n <nz-input-number\r\n [style.width]=\"'100%'\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzFormatter]=\"getFieldProps(column).formatterPercent\"\r\n [nzParser]=\"getFieldProps(column).parserPercent\"\r\n ></nz-input-number>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </ng-template>\r\n <ng-template #actionTextBtn>\r\n <nz-space [nzSize]=\"4\">\r\n <ng-template nzSpaceItem *ngIf=\"showSearchBtn\">\r\n <button nz-button nzType=\"primary\" (click)=\"handleSearch()\">\r\n {{ confirmBtnText }}\r\n </button>\r\n </ng-template>\r\n <ng-template nzSpaceItem *ngIf=\"showClearBtn\">\r\n <button nz-button (click)=\"handleResetForm()\">\r\n {{ clearBtnText }}\r\n </button>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n <ng-template #actionImgBtn>\r\n <nz-space>\r\n <ng-container *ngTemplateOutlet=\"imgActionBarTpl\"></ng-container>\r\n <ng-template nzSpaceItem class=\"setting-space-item\" *ngIf=\"showColumnSetting\">\r\n <span nz-tooltip nzTooltipTitle=\"\u8BBE\u7F6E\u5B57\u6BB5\">\r\n <app-colmuns-setting\r\n [columns]=\"columns\"\r\n [selectedColumns]=\"_serverColumns\"\r\n [tableName]=\"tableName\"\r\n (afterConfirm)=\"handleColumnsSettingConfirm()\"\r\n ></app-colmuns-setting>\r\n </span>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n </app-table-search-bar>\r\n </ng-template>\r\n\r\n <ng-template #body>\r\n <div class=\"mb-4\">\r\n <ng-container *ngIf=\"showActionBar\">\r\n <ng-container *ngTemplateOutlet=\"actionBarTpl\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"customTableRender\">\r\n <ng-container *ngTemplateOutlet=\"customTableRender\"></ng-container>\r\n </ng-container>\r\n <nz-table\r\n *ngIf=\"!customTableRender && _showTable\"\r\n #dynamicTable\r\n nzSize=\"small\"\r\n nzShowSizeChanger\r\n [nzBordered]=\"bordered\"\r\n [nzOuterBordered]=\"outerBordered\"\r\n [nzData]=\"dataSource\"\r\n [nzPageIndex]=\"_pageInfo.pageIndex\"\r\n [nzPageSize]=\"_pageInfo.pageSize\"\r\n [nzTotal]=\"_pageInfo.total\"\r\n [nzPageSizeOptions]=\"_pageInfo.pageSizeOptions\"\r\n [nzShowPagination]=\"showPagination\"\r\n [nzShowTotal]=\"totalTemplate\"\r\n [nzLoading]=\"_loading\"\r\n [nzFrontPagination]=\"frontPagination\"\r\n [nzScroll]=\"scroll\"\r\n (nzPageIndexChange)=\"handlePageIndexChange($event)\"\r\n (nzPageSizeChange)=\"handlePageSizeChange($event)\"\r\n >\r\n <thead>\r\n <tr>\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <th\r\n *ngIf=\"showCheckbox\"\r\n [nzWidth]=\"'50px'\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center\"\r\n [(nzChecked)]=\"_checkedAll\"\r\n [nzIndeterminate]=\"_indeterminate\"\r\n (nzCheckedChange)=\"toggleCheckAll($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></th>\r\n <th\r\n *ngFor=\"let column of _columns\"\r\n [nzWidth]=\"column.width\"\r\n [nzAlign]=\"column.align\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n [nzShowSort]=\"!!column.sorter\"\r\n [nzSortOrder]=\"getSortOrder(column.prop)\"\r\n (nzSortOrderChange)=\"onSortChange(column.prop, $event)\"\r\n >\r\n {{ column.title }}\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <tr\r\n style=\"cursor: pointer\"\r\n *ngFor=\"let data; let i = index; of: dynamicTable.data\"\r\n [ngClass]=\"{\r\n 'ant-table-custom-row-selected': !!getTableRowChecked(data),\r\n 'ant-table-custom-row-even': i % 2 === 0,\r\n 'ant-table-custom-row-odd': i % 2 !== 0\r\n }\"\r\n (click)=\"handleTableRowClick(data)\"\r\n (dblclick)=\"handleTableRowDbClick(data)\"\r\n >\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center; width: 50px\"\r\n [(nzChecked)]=\"data.checked\"\r\n [nzDisabled]=\"isRowDisabled(data)\"\r\n (nzCheckedChange)=\"handleRowCheckedChange(data, $event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column of _columns\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n [nzAlign]=\"column.align\"\r\n [ngClass]=\"{\r\n 'pro-nowrap': true\r\n }\"\r\n >\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customRender && getTemplate(column.customRender);\r\n let template\r\n \"\r\n >\r\n <ng-template\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: data,\r\n data: data,\r\n column: column,\r\n index: i,\r\n pageInfo: _pageInfo\r\n }\"\r\n >\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- \u9ED8\u8BA4\u6E32\u67D3\u903B\u8F91 -->\r\n <ng-container\r\n *ngIf=\"!column.customRender || !getTemplate(column.customRender)\"\r\n >\r\n <ng-container *ngIf=\"column.ellipsis\">\r\n <div\r\n class=\"pro-ellipsis\"\r\n [title]=\"data[column.prop]\"\r\n [ngStyle]=\"{\r\n width: 'calc(' + column.width + ' - 25px)'\r\n }\"\r\n >\r\n {{ data[column.prop] }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!column.ellipsis\">\r\n {{ data[column.prop] }}\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"summaryData && _pageInfo.total > 0\">\r\n <!-- \u6C47\u603B\u884C\u7684\u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF0C\u4F46\u4E3A\u7A7A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column; let i = index; of: _columns\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n [nzAlign]=\"column.align\"\r\n >\r\n <span *ngIf=\"i === 0\">\u603B\u8BA1</span>\r\n <ng-container *ngIf=\"i !== 0 && column.summary\">\r\n {{\r\n column.summary?.format\r\n ? column.summary?.format(\r\n summaryData[column.summary?.name || column.prop]\r\n )\r\n : summaryData[column.summary?.name || column.prop]\r\n }}\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <ng-template #totalTemplate let-total\r\n >\u5171 {{ _pageInfo.total }} \u6761\u8BB0\u5F55</ng-template\r\n >\r\n </nz-table>\r\n </ng-template>\r\n</app-page-container>\r\n", styles: [".pro-ellipsis{overflow:hidden;text-overflow:ellipsis}.pro-nowrap{white-space:nowrap}::ng-deep .setting-space-item{margin-right:0!important}::ng-deep .pro-table-checkboxgroup-nostyle{white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body table{border-collapse:separate;border-spacing:0}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important;white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:first-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:first-child{border-left:none!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th{border-top:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:last-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:last-child{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr:last-child>td{border-bottom:1px solid #e8e8e8!important}::ng-deep .table-search-bar-left .ant-form-item{margin-bottom:4px}::ng-deep .table-search-bar-left .ant-form-item .ant-form-item-label>label{color:#5a5a5a}::ng-deep .pro-table-container .page-container-body{padding:8px 0 0!important}\n"] }]
996
+ args: [{ selector: "app-pro-table", template: "<app-page-container\r\n [title]=\"title\"\r\n [showHeader]=\"showSearchBar\"\r\n ngClass=\"pro-table-container\"\r\n>\r\n <ng-template #header>\r\n <app-table-search-bar\r\n *ngIf=\"showSearchBar\"\r\n [labelWidth]=\"labelWidth\"\r\n [labelAlign]=\"labelAlign\"\r\n [formItemWidth]=\"formItemWidth\"\r\n >\r\n <ng-template #leftContent>\r\n <nz-form-item\r\n *ngFor=\"let column of _searchFiledColumns\"\r\n [ngClass]=\"getFormItemClassName(column)\"\r\n >\r\n <nz-form-label *ngIf=\"!getFieldProps(column).hideLabel\" nzNoColon>\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49label\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customLabelRender &&\r\n getLabelTemplate(column.customLabelRender);\r\n else defaultLabel\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"getLabelTemplate(column.customLabelRender)\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: column,\r\n column: column,\r\n fieldProps: getFieldProps(column)\r\n }\"\r\n >\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultLabel>\r\n {{ getFieldProps(column).label || column.title }}\r\n </ng-template>\r\n </nz-form-label>\r\n <nz-form-control *ngIf=\"column.valueType === 'input'\">\r\n <input\r\n nz-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [placeholder]=\"getFieldProps(column).placeHolder\"\r\n [disabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n />\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputPlate'\">\r\n <app-plate-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n ></app-plate-input>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'select'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzOptions]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n >\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'selectMultiple'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzOptions]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n nzMode=\"multiple\"\r\n [nzMaxTagCount]=\"2\"\r\n [nzMaxTagPlaceholder]=\"nzMaxTagPlaceholder\"\r\n [nzCustomTemplate]=\"defaultTemplate\"\r\n >\r\n <ng-template #nzMaxTagPlaceholder>\r\n +\r\n {{\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n ?.length\r\n }}\r\n </ng-template>\r\n <ng-template #defaultTemplate let-selected>\r\n {{ selected.nzLabel.length > 4 ? selected.nzLabel.substring(0, 4) + '...' : selected.nzLabel }}\r\n </ng-template>\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'date'\">\r\n <nz-date-picker\r\n [nzShowTime]=\"getFieldProps(column).showTime\"\r\n [nzFormat]=\"getFieldProps(column).format\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzMode]=\"getFieldProps(column).mode\"\r\n ></nz-date-picker>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'checkbox'\">\r\n <nz-checkbox-group\r\n [class]=\"\r\n getFieldProps(column).noStyle\r\n ? 'pro-table-checkboxgroup-nostyle'\r\n : ''\r\n \"\r\n [(ngModel)]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n (ngModelChange)=\"\r\n handleFieldCheckBoxChange(\r\n $event,\r\n getFieldProps(column).name || column.prop\r\n )\r\n \"\r\n ></nz-checkbox-group>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'autoComplete'\">\r\n <input\r\n nz-input\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column)?.name || column.prop]\r\n \"\r\n (input)=\"handleAutoCompleteInput($event, column)\"\r\n [nzAutocomplete]=\"auto\"\r\n [disabled]=\"getFieldProps(column)?.disabled\"\r\n [placeholder]=\"getFieldProps(column)?.placeHolder\"\r\n />\r\n <nz-autocomplete\r\n [nzBackfill]=\"getFieldProps(column).backFill\"\r\n [nzDefaultActiveFirstOption]=\"\r\n getFieldProps(column).defaultActiveFirstOption\r\n \"\r\n [nzWidth]=\"getFieldProps(column).width\"\r\n #auto\r\n >\r\n <nz-auto-option\r\n *ngFor=\"let option of getAutoCompleteDataSource(column)\"\r\n [nzValue]=\"\r\n getFieldProps(column).returnFullData ? option : option.value\r\n \"\r\n [nzLabel]=\"option.label\"\r\n [nzDisabled]=\"option.disabled\"\r\n >\r\n {{ option.label }}\r\n </nz-auto-option>\r\n </nz-autocomplete>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'custom'\">\r\n <app-dynamic-search-field\r\n [component]=\"getFieldProps(column).component\"\r\n [value]=\"_searchParams[getFieldProps(column).name || column.prop]\"\r\n [props]=\"getFieldProps(column)\"\r\n (valueChange)=\"\r\n setFieldValue(getFieldProps(column).name || column.prop, $event)\r\n \"\r\n ></app-dynamic-search-field>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputNumber'\">\r\n <nz-input-number\r\n [style.width]=\"'100%'\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzFormatter]=\"getFieldProps(column).formatterPercent\"\r\n [nzParser]=\"getFieldProps(column).parserPercent\"\r\n ></nz-input-number>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </ng-template>\r\n <ng-template #actionTextBtn>\r\n <nz-space [nzSize]=\"4\">\r\n <ng-template nzSpaceItem *ngIf=\"showSearchBtn\">\r\n <button nz-button nzType=\"primary\" (click)=\"handleSearch()\">\r\n {{ confirmBtnText }}\r\n </button>\r\n </ng-template>\r\n <ng-template nzSpaceItem *ngIf=\"showClearBtn\">\r\n <button nz-button (click)=\"handleResetForm()\">\r\n {{ clearBtnText }}\r\n </button>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n <ng-template #actionImgBtn>\r\n <nz-space>\r\n <ng-container *ngTemplateOutlet=\"imgActionBarTpl\"></ng-container>\r\n <ng-template nzSpaceItem class=\"setting-space-item\" *ngIf=\"showColumnSetting\">\r\n <span nz-tooltip nzTooltipTitle=\"\u8BBE\u7F6E\u5B57\u6BB5\">\r\n <app-colmuns-setting\r\n [columns]=\"columns\"\r\n [selectedColumns]=\"_serverColumns\"\r\n [tableName]=\"tableName\"\r\n (afterConfirm)=\"handleColumnsSettingConfirm()\"\r\n ></app-colmuns-setting>\r\n </span>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n </app-table-search-bar>\r\n </ng-template>\r\n\r\n <ng-template #body>\r\n <div class=\"mb-4\">\r\n <ng-container *ngIf=\"showActionBar\">\r\n <ng-container *ngTemplateOutlet=\"actionBarTpl\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"customTableRender\">\r\n <ng-container *ngTemplateOutlet=\"customTableRender\"></ng-container>\r\n </ng-container>\r\n <nz-table\r\n *ngIf=\"!customTableRender && _showTable && _columnsReady\"\r\n #dynamicTable\r\n nzSize=\"small\"\r\n nzShowSizeChanger\r\n [nzBordered]=\"bordered\"\r\n [nzOuterBordered]=\"outerBordered\"\r\n [nzData]=\"dataSource\"\r\n [nzPageIndex]=\"_pageInfo.pageIndex\"\r\n [nzPageSize]=\"_pageInfo.pageSize\"\r\n [nzTotal]=\"_pageInfo.total\"\r\n [nzPageSizeOptions]=\"_pageInfo.pageSizeOptions\"\r\n [nzShowPagination]=\"showPagination\"\r\n [nzShowTotal]=\"totalTemplate\"\r\n [nzLoading]=\"_loading\"\r\n [nzFrontPagination]=\"frontPagination\"\r\n [nzScroll]=\"scroll\"\r\n (nzPageIndexChange)=\"handlePageIndexChange($event)\"\r\n (nzPageSizeChange)=\"handlePageSizeChange($event)\"\r\n >\r\n <thead>\r\n <tr>\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <th\r\n *ngIf=\"showCheckbox\"\r\n [nzWidth]=\"'50px'\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center\"\r\n [(nzChecked)]=\"_checkedAll\"\r\n [nzIndeterminate]=\"_indeterminate\"\r\n (nzCheckedChange)=\"toggleCheckAll($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></th>\r\n <th\r\n *ngFor=\"let column of _columns\"\r\n [nzWidth]=\"column.width\"\r\n [nzAlign]=\"column.align\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n [nzShowSort]=\"!!column.sorter\"\r\n [nzSortOrder]=\"getSortOrder(column.prop)\"\r\n (nzSortOrderChange)=\"onSortChange(column.prop, $event)\"\r\n >\r\n {{ column.title }}\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <tr\r\n style=\"cursor: pointer\"\r\n *ngFor=\"let data; let i = index; of: dynamicTable.data\"\r\n [ngClass]=\"{\r\n 'ant-table-custom-row-selected': !!getTableRowChecked(data),\r\n 'ant-table-custom-row-even': i % 2 === 0,\r\n 'ant-table-custom-row-odd': i % 2 !== 0\r\n }\"\r\n (click)=\"handleTableRowClick(data)\"\r\n (dblclick)=\"handleTableRowDbClick(data)\"\r\n >\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center; width: 50px\"\r\n [(nzChecked)]=\"data.checked\"\r\n [nzDisabled]=\"isRowDisabled(data)\"\r\n (nzCheckedChange)=\"handleRowCheckedChange(data, $event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column of _columns\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n [nzAlign]=\"column.align\"\r\n [ngClass]=\"{\r\n 'pro-nowrap': true\r\n }\"\r\n >\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customRender && getTemplate(column.customRender);\r\n let template\r\n \"\r\n >\r\n <ng-template\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: data,\r\n data: data,\r\n column: column,\r\n index: i,\r\n pageInfo: _pageInfo\r\n }\"\r\n >\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- \u9ED8\u8BA4\u6E32\u67D3\u903B\u8F91 -->\r\n <ng-container\r\n *ngIf=\"!column.customRender || !getTemplate(column.customRender)\"\r\n >\r\n <ng-container *ngIf=\"column.ellipsis\">\r\n <div\r\n class=\"pro-ellipsis\"\r\n [title]=\"data[column.prop]\"\r\n [ngStyle]=\"{\r\n width: 'calc(' + column.width + ' - 25px)'\r\n }\"\r\n >\r\n {{ data[column.prop] }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!column.ellipsis\">\r\n {{ data[column.prop] }}\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"summaryData && _pageInfo.total > 0\">\r\n <!-- \u6C47\u603B\u884C\u7684\u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF0C\u4F46\u4E3A\u7A7A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column; let i = index; of: _columns\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n [nzAlign]=\"column.align\"\r\n >\r\n <span *ngIf=\"i === 0\">\u603B\u8BA1</span>\r\n <ng-container *ngIf=\"i !== 0 && column.summary\">\r\n {{\r\n column.summary?.format\r\n ? column.summary?.format(\r\n summaryData[column.summary?.name || column.prop]\r\n )\r\n : summaryData[column.summary?.name || column.prop]\r\n }}\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <ng-template #totalTemplate let-total\r\n >\u5171 {{ _pageInfo.total }} \u6761\u8BB0\u5F55</ng-template\r\n >\r\n </nz-table>\r\n </ng-template>\r\n</app-page-container>\r\n", styles: [".pro-ellipsis{overflow:hidden;text-overflow:ellipsis}.pro-nowrap{white-space:nowrap}::ng-deep .setting-space-item{margin-right:0!important}::ng-deep .pro-table-checkboxgroup-nostyle{white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body table{border-collapse:separate;border-spacing:0}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important;white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:first-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:first-child{border-left:none!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th{border-top:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:last-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:last-child{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr:last-child>td{border-bottom:1px solid #e8e8e8!important}::ng-deep .table-search-bar-left .ant-form-item{margin-bottom:4px}::ng-deep .table-search-bar-left .ant-form-item .ant-form-item-label>label{color:#5a5a5a}::ng-deep .pro-table-container .page-container-body{padding:8px 0 0!important}\n"] }]
986
997
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
987
998
  type: Optional
988
999
  }, {
@@ -1067,4 +1078,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1067
1078
  type: HostListener,
1068
1079
  args: ["window:resize"]
1069
1080
  }] } });
1070
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byby10YWJsZS9zcmMvbGliL3Byby10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm8tdGFibGUvc3JjL2xpYi9wcm8tdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFXLE1BQU0sV0FBVyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVdoRixPQUFPLEVBQUUsdUJBQXVCLEVBQStCLE1BQU0sVUFBVSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU9uRCxNQUFNLE9BQU8saUJBQWlCO0lBeUpsQjtJQXhKRCxhQUFhLEdBQVksSUFBSSxDQUFDO0lBRTlCLFlBQVksR0FBWSxJQUFJLENBQUM7SUFFN0IsS0FBSyxHQUFrQixJQUFJLENBQUM7SUFFNUIsU0FBUyxHQUFXLEVBQUUsQ0FBQztJQUV2QixRQUFRLEdBQVksS0FBSyxDQUFDO0lBRTFCLE9BQU8sR0FBcUIsRUFBRSxDQUFDO0lBRS9CLGFBQWEsR0FBWSxJQUFJLENBQUM7SUFFOUIsYUFBYSxHQUFZLElBQUksQ0FBQztJQUU5QixjQUFjLEdBQVcsSUFBSSxDQUFDO0lBRTlCLFlBQVksR0FBVyxJQUFJLENBQUM7SUFFNUIsVUFBVSxHQUFXLE1BQU0sQ0FBQztJ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TUFBTTtnQkFFb0IsWUFBWTtzQkFBdEMsWUFBWTt1QkFBQyxXQUFXO2dCQUVLLGVBQWU7c0JBQTVDLFlBQVk7dUJBQUMsY0FBYztnQkFFRSxZQUFZO3NCQUF6QyxlQUFlO3VCQUFDLFdBQVc7Z0JBNEQ1QixjQUFjO3NCQURiLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJDb250ZW50SW5pdCxcclxuICBDb21wb25lbnQsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBUZW1wbGF0ZVJlZixcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBjbG9uZURlZXAsIGhhc0luLCBpc05pbCwgZGVib3VuY2UsIGlzRXF1YWwgfSBmcm9tIFwibG9kYXNoLWVzXCI7XHJcbmltcG9ydCB7IFBST19UQUJMRV9ERUZBVUxUX0NPTFVNTiwgUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHtcclxuICBBdXRvQ29tcGxldGVGaWVsZFByb3BzLFxyXG4gIENoZWNrYm94RmllbGRQcm9wcyxcclxuICBPcHRpb25zVHlwZSxcclxuICBQcm9UYWJsZUNvbHVtbixcclxuICBQcm9UYWJsZVBhZ2VJbmZvLFxyXG4gIFByb1RhYmxlUmVxdWVzdFJlc3VsdCxcclxuICBQcm9UYWJsZVZhbHVlc0NoYW5nZSxcclxuICBTZWxlY3RGaWVsZFByb3BzLFxyXG59IGZyb20gXCIuL3R5cGVcIjtcclxuaW1wb3J0IHsgUFJPX1RBQkxFX0NPTFVNTl9SRU1PVEUsIFByb1RhYmxlUmVtb3RlQ29sdW1uU2VydmljZSB9IGZyb20gXCIuL3Rva2Vuc1wiO1xyXG5pbXBvcnQgeyBpc09ic2VydmFibGUsIGxhc3RWYWx1ZUZyb20gfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiYXBwLXByby10YWJsZVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vcHJvLXRhYmxlLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL3Byby10YWJsZS5jb21wb25lbnQubGVzc1wiXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFByb1RhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcclxuICBASW5wdXQoKSBzaG93U2VhcmNoQnRuOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgc2hvd0NsZWFyQnRuOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBASW5wdXQoKSB0YWJsZU5hbWU6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIEBJbnB1dCgpIG11bHRpUm93OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkgc2hvd1NlYXJjaEJhcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dBY3Rpb25CYXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBjb25maXJtQnRuVGV4dDogc3RyaW5nID0gXCLmn6Xor6JcIjtcclxuXHJcbiAgQElucHV0KCkgY2xlYXJCdG5UZXh0OiBzdHJpbmcgPSBcIua4heepulwiO1xyXG5cclxuICBASW5wdXQoKSBsYWJlbFdpZHRoOiBzdHJpbmcgPSBcIjkwcHhcIjtcclxuXHJcbiAgQElucHV0KCkgbGFiZWxBbGlnbjogc3RyaW5nID0gXCJyaWdodFwiO1xyXG5cclxuICBASW5wdXQoKSBmb3JtSXRlbVdpZHRoOiBzdHJpbmcgPSBcIjMzMHB4XCI7XHJcblxyXG4gIEBJbnB1dCgpIGRhdGFTb3VyY2U6IGFueVtdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIGJvcmRlcmVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgb3V0ZXJCb3JkZXJlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dQYWdpbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgZnJvbnRQYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHNjcm9sbDogeyB4Pzogc3RyaW5nIHwgbnVtYmVyOyB5Pzogc3RyaW5nIHwgbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQElucHV0KCkgcmVxdWVzdDogKHBhcmFtczogYW55KSA9PiBQcm9taXNlPFByb1RhYmxlUmVxdWVzdFJlc3VsdD47XHJcblxyXG4gIEBJbnB1dCgpIHN1bW1hcnlEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8vIOaOkuW6j+aooeW8j++8mmxvY2FsIOacrOWcsOaOkuW6j++8m3NlcnZlciDlnKjnur/mjpLluo/vvIjmj5DkuqTnu5nmjqXlj6PvvIlcclxuICBASW5wdXQoKSBzb3J0TW9kZTogXCJsb2NhbFwiIHwgXCJzZXJ2ZXJcIiA9IFwibG9jYWxcIjtcclxuXHJcbiAgQElucHV0KCkgc2hvd0NvbHVtblNldHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8g5piv5ZCm5byA5ZCv5aSa5YiX5o6S5bqP77yI6buY6K6k5Y2V5YiX77yJXHJcbiAgQElucHV0KCkgbXVsdGlwbGVTb3J0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dDaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyDliKTmlq3ooYzmmK/lkKbnpoHnlKjnmoTlh73mlbBcclxuICBASW5wdXQoKSByb3dEaXNhYmxlZDogKGRhdGE6IGFueSkgPT4gYm9vbGVhbiA9ICgpID0+IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSByZXJlbmRlck9uUmVzaXplOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8g5piv5ZCm6Ieq5Yqo6Kem5Y+R6K+35rGCXHJcbiAgQElucHV0KCkgYXV0b1RyaWdnZXJSZXF1ZXN0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgY3VzdG9tVGFibGVSZW5kZXI/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBAT3V0cHV0KCkgb25Sb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25Sb3dEYkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBvblZhbHVlc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvVGFibGVWYWx1ZXNDaGFuZ2U+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBvblJlc2V0Rm9ybUJlZm9yZVJlbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAQ29udGVudENoaWxkKFwiYWN0aW9uQmFyXCIpIGFjdGlvbkJhclRwbCE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoXCJJbWdBY3Rpb25CYXJcIikgaW1nQWN0aW9uQmFyVHBsITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZVJlZikgYWxsVGVtcGxhdGVzITogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPGFueT4+O1xyXG5cclxuICBwcml2YXRlIF9zYXZlZFNlYXJjaFBhcmFtczogYW55ID0ge307XHJcblxyXG4gIC8vIOWtmOWCqOaJgOacieiHquWumuS5ieaooeadv+eahOW8leeUqFxyXG4gIHByaXZhdGUgY3VzdG9tVGVtcGxhdGVzID0gbmV3IE1hcDxzdHJpbmcsIFRlbXBsYXRlUmVmPGFueT4+KCk7XHJcblxyXG4gIC8vIOiusOW9leWQhOWIl+aOkuW6j+eKtuaAge+8midhc2NlbmQnIHwgJ2Rlc2NlbmQnIHwgbnVsbFxyXG5cclxuICBwcml2YXRlIF9zb3J0TWFwOiBSZWNvcmQ8c3RyaW5nLCBcImFzY2VuZFwiIHwgXCJkZXNjZW5kXCIgfCBudWxsPiA9IHt9O1xyXG5cclxuICAvLyDorrDlvZXlpJrliJfmjpLluo/nmoTkvJjlhYjnuqfvvIjlkI7orr7nva7nmoTkvJjlhYjvvIlcclxuICBwcml2YXRlIF9zb3J0UHJpb3JpdHk6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIC8vIOWtmOWCqOavj+S4qiBhdXRvQ29tcGxldGUg5a2X5q6155qE6Ziy5oqW5Ye95pWwXHJcbiAgcHJpdmF0ZSBfYXV0b0NvbXBsZXRlRGVib3VuY2VNYXA6IE1hcDxzdHJpbmcsIChldmVudDogRXZlbnQpID0+IHZvaWQ+ID1cclxuICAgIG5ldyBNYXAoKTtcclxuXHJcblxyXG4gIF9jb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcblxyXG4gIC8vIOetm+mAieihqOWNleaVsOaNruWtmOWCqFxyXG4gIF9zZWFyY2hQYXJhbXM6IGFueSA9IHt9O1xyXG5cclxuICAvLyDnrZvpgInooajljZVsaXN05riy5p+T5pWw5o2uXHJcbiAgX3NlYXJjaEZpbGVkQ29sdW1uczogUHJvVGFibGVDb2x1bW5bXSA9IFtdO1xyXG5cclxuICBfcGFnZUluZm86IFByb1RhYmxlUGFnZUluZm8gPSB7XHJcbiAgICBwYWdlSW5kZXg6IDEsXHJcbiAgICBwYWdlU2l6ZTogMTUsXHJcbiAgICB0b3RhbDogMTAwLFxyXG4gICAgcGFnZVNpemVPcHRpb25zOiBbMTAsIDE1LCAyMCwgNTAsIDEwMCwgNTAwLCAxMDAwXSxcclxuICB9O1xyXG5cclxuICBfbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBfc2VsZWN0ZWRUYWJsZVJvdzogYW55ID0gbnVsbDtcclxuXHJcbiAgLy8g6YCJ5Lit55qE6KGM5pWw5o2u77yI55So5LqO5aSN6YCJ5qGG6YCJ5oup77yJLSDkv53nlZnnlKjkuo7lhbzlrrnmgKdcclxuICBfc2VsZWN0ZWRSb3dzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAvLyDlhajpgInnirbmgIFcclxuICBfY2hlY2tlZEFsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyDljYrpgInnirbmgIHvvIjpg6jliIbpgInkuK3vvIlcclxuICBfaW5kZXRlcm1pbmF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyDov5znqItjb2x1bW5zXHJcbiAgX3NlcnZlckNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgLy8g5a2Y5YKoIGF1dG9Db21wbGV0ZSDlrZfmrrXnmoTmlbDmja7mupBcclxuICBfYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIGFueVtdPiA9IHt9O1xyXG5cclxuICAvLyDmjqfliLbooajmoLzmmL7npLrnirbmgIHvvIznlKjkuo7ph43mlrDmjILovb1cclxuICBfc2hvd1RhYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8g6Ziy5oqW5a6a5pe25Zmo77yM55So5LqO56qX5Y+j5aSn5bCP6LCD5pW0XHJcbiAgcHJpdmF0ZSByZXNpemVEZWJvdW5jZTogYW55O1xyXG5cclxuICBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiKVxyXG4gIG9uV2luZG93UmVzaXplKCkge1xyXG4gICAgaWYgKCF0aGlzLnJlcmVuZGVyT25SZXNpemUpIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5yZXNpemVEZWJvdW5jZSkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXNpemVEZWJvdW5jZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXNpemVEZWJvdW5jZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAvLyDpgJrov4cgbmdJZiDph43mlrDmjILovb3ooajmoLxcclxuICAgICAgdGhpcy5fc2hvd1RhYmxlID0gZmFsc2U7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX3Nob3dUYWJsZSA9IHRydWU7XHJcbiAgICAgIH0sIDApO1xyXG4gICAgfSwgMTUwKTtcclxuICB9XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBAT3B0aW9uYWwoKVxyXG4gICAgQEluamVjdChQUk9fVEFCTEVfQ09MVU1OX1JFTU9URSlcclxuICAgIHByaXZhdGUgY29sdW1uUmVtb3RlOiBQcm9UYWJsZVJlbW90ZUNvbHVtblNlcnZpY2UgfCBudWxsLFxyXG4gICkge31cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFJlbW90ZUNvbHVtbnMoKSB7XHJcbiAgICBpZiAoIXRoaXMuY29sdW1uUmVtb3RlPy5nZXRDb2wgfHwgIXRoaXMudGFibGVOYW1lKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jb2x1bW5SZW1vdGUuZ2V0Q29sKHRoaXMudGFibGVOYW1lLCB0aGlzLm11bHRpUm93KTtcclxuICAgICAgcmV0dXJuIHJlcztcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwZXJzaXN0UmVtb3RlQ29sdW1ucyhjb2x1bW5zOiBhbnlbXSkge1xyXG4gICAgaWYgKCF0aGlzLmNvbHVtblJlbW90ZT8uc2V0Q29sIHx8ICF0aGlzLnRhYmxlTmFtZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29sdW1uUmVtb3RlLnNldENvbChcclxuICAgICAgICB0aGlzLnRhYmxlTmFtZSxcclxuICAgICAgICBjb2x1bW5zLFxyXG4gICAgICAgIHRoaXMubXVsdGlSb3csXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChyZXN1bHQgJiYgaXNPYnNlcnZhYmxlKHJlc3VsdCkpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgbGFzdFZhbHVlRnJvbShyZXN1bHQpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4geyAgICBcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtcyA9IHt9O1xyXG4gICAgdGhpcy5mb3JtYXRlSW5uZXJDb2x1bW5zKHRoaXMuY29sdW1ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnNldFNlYXJjaFBhcmFtcyh0aGlzLmNvbHVtbnMpO1xyXG5cclxuICAgIC8vIOS9v+eUqCBQcm94eSDljIXoo4UgX3NlYXJjaFBhcmFtc++8jOaLpuaIquihqOWNlemhueWAvOWPmOWMluW5tuWQkeWkluWPkeWHuuS6i+S7tlxyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zID0gdGhpcy5jcmVhdGVTZWFyY2hQYXJhbXNQcm94eSh0aGlzLl9zZWFyY2hQYXJhbXMpO1xyXG4gICAgaWYgKHRoaXMuYXV0b1RyaWdnZXJSZXF1ZXN0KSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICAgIH1cclxuICAgIHRoaXMucXVlcnlEeW5hbWljQ29sdW1ucygpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xyXG4gICAgLy8g6Ieq5Yqo5rOo5YaM5omA5pyJ6Ieq5a6a5LmJ5qih5p2/XHJcbiAgICAvLyDms6jmhI/vvJrmraTml7bmiYDmnIkgQ29udGVudENoaWxkIOWSjCBDb250ZW50Q2hpbGRyZW4g6YO95bey5Yid5aeL5YyW5a6M5oiQXHJcbiAgICB0aGlzLmF1dG9SZWdpc3RlclRlbXBsYXRlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBxdWVyeUR5bmFtaWNDb2x1bW5zKCkge1xyXG4gICAgaWYgKCF0aGlzLnRhYmxlTmFtZSB8fCAhdGhpcy5jb2x1bW5SZW1vdGUpIHJldHVybjtcclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZmV0Y2hSZW1vdGVDb2x1bW5zKCk7XHJcbiAgICBpZiAoIXJlcykgcmV0dXJuO1xyXG4gICAgaWYgKHJlcy5jb2RlID09PSAwKSB7XHJcbiAgICAgIGNvbnN0IF90YWJDb2x1bW4gPSByZXMuZGF0YS50YWJDb2x1bW4ubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHRpdGxlOiBpdGVtLmhlYWRlcixcclxuICAgICAgICAgIHByb3A6IGl0ZW0uZmllbGQsXHJcbiAgICAgICAgICBzb3J0TmFtZTogaXRlbS5zb3J0TmFtZSxcclxuICAgICAgICAgIGhpZGVJblRhYmxlOiAhaXRlbS5pc1Nob3csXHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuX3NlcnZlckNvbHVtbnMgPSBfdGFiQ29sdW1uLmZpbHRlcigoY29sKSA9PlxyXG4gICAgICAgIHRoaXMuY29sdW1ucy5zb21lKChsb2NhbENvbCkgPT4gbG9jYWxDb2wucHJvcCA9PT0gY29sLnByb3ApLFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRhYmxlQ29sdW1ucyh0aGlzLl9zZXJ2ZXJDb2x1bW5zKTtcclxuICAgIH0gZWxzZSBpZiAocmVzLmNvZGUgPT09IDEwKSB7XHJcbiAgICAgIC8vIOWmguaenOacquiuvue9ruaOpeWPo+i/lOWbnu+8jOmcgOimgem7mOiupOiwg+eUqOS4gOasoeS/ruaUueWHveaVsOWIneWni+WMluaVsOaNrlxyXG4gICAgICBjb25zdCBpbml0Q29sdW1ucyA9IHRoaXMuY29sdW1uc1xyXG4gICAgICAgIC5maWx0ZXIoKGNvbCkgPT4gIWNvbC5hdXhpbGlhcnlDb2x1bW4pXHJcbiAgICAgICAgLm1hcCgoY29sdW1uKSA9PiAoe1xyXG4gICAgICAgICAgZmllbGQ6IGNvbHVtbi5wcm9wLFxyXG4gICAgICAgICAgaXNTaG93OiB0cnVlLFxyXG4gICAgICAgICAgaGVhZGVyOiBjb2x1bW4udGl0bGUsXHJcbiAgICAgICAgICBzb3J0TmFtZTogY29sdW1uLnNvcnROYW1lIHx8IG51bGwsXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICBjb25zdCBpbml0UmVzID0gYXdhaXQgdGhpcy5wZXJzaXN0UmVtb3RlQ29sdW1ucyhpbml0Q29sdW1ucyk7XHJcbiAgICAgIGlmIChpbml0UmVzKSB7XHJcbiAgICAgICAgdGhpcy5xdWVyeUR5bmFtaWNDb2x1bW5zKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0ZUlubmVyQ29sdW1ucyhjb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdKSB7XHJcbiAgICB0aGlzLl9jb2x1bW5zID0gY29sdW1uc1xyXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5oaWRlSW5UYWJsZSlcclxuICAgICAgLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7IC4uLlBST19UQUJMRV9ERUZBVUxUX0NPTFVNTiwgLi4uaXRlbSB9IGFzIFByb1RhYmxlQ29sdW1uO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOiHquWKqOazqOWGjOaooeadv+eahOaWueazlVxyXG4gIHByaXZhdGUgYXV0b1JlZ2lzdGVyVGVtcGxhdGVzKCkge1xyXG4gICAgLy8g6I635Y+W5omA5pyJ5qih5p2/XHJcbiAgICBjb25zdCBhbGxUZW1wbGF0ZXNBcnJheSA9IHRoaXMuYWxsVGVtcGxhdGVzLnRvQXJyYXkoKTtcclxuXHJcbiAgICAvLyDojrflj5bmiYDmnInpnIDopoHoh6rlrprkuYnmqKHmnb/nmoTliJdcclxuICAgIGNvbnN0IGNvbHVtbnNXaXRoQ3VzdG9tUmVuZGVyID0gdGhpcy5fY29sdW1ucy5maWx0ZXIoXHJcbiAgICAgIChjb2wpID0+IGNvbC5jdXN0b21SZW5kZXIsXHJcbiAgICApO1xyXG5cclxuICAgIC8vIOiOt+WPluaJgOaciemcgOimgeiHquWumuS5iWxhYmVs5qih5p2/55qE5YiX77yI5L2/55So5Y6f5aeLY29sdW1uc++8jOehruS/nemhuuW6j+ato+ehru+8iVxyXG4gICAgY29uc3QgY29sdW1uc1dpdGhDdXN0b21MYWJlbCA9IHRoaXMuY29sdW1ucy5maWx0ZXIoXHJcbiAgICAgIChjb2wpID0+IGNvbC5jdXN0b21MYWJlbFJlbmRlcixcclxuICAgICk7XHJcblxyXG4gICAgLy8g6K6h566X6ZyA6KaB55qE5qih5p2/5oC75pWwXHJcbiAgICBjb25zdCBjdXN0b21SZW5kZXJDb3VudCA9IGNvbHVtbnNXaXRoQ3VzdG9tUmVuZGVyLmxlbmd0aDtcclxuICAgIGNvbnN0IHRvdGFsTmVlZGVkVGVtcGxhdGVzID1cclxuICAgICAgY3VzdG9tUmVuZGVyQ291bnQgKyBjb2x1bW5zV2l0aEN1c3RvbUxhYmVsLmxlbmd0aDtcclxuXHJcbiAgICAvLyDor4bliKvlubbmjpLpmaTnibnmrormqKHmnb/vvIhhY3Rpb25CYXIg5ZKMIGltZ0FjdGlvbkJhcu+8iVxyXG4gICAgY29uc3Qgc3BlY2lhbFRlbXBsYXRlSW5kaWNlcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xyXG5cclxuICAgIC8vIOWwneivleaJvuWIsCBhY3Rpb25CYXJUcGwg5ZyoIGFsbFRlbXBsYXRlc0FycmF5IOS4reeahOS9jee9rlxyXG4gICAgaWYgKHRoaXMuYWN0aW9uQmFyVHBsKSB7XHJcbiAgICAgIGNvbnN0IGFjdGlvbkJhckluZGV4ID0gdGhpcy5maW5kVGVtcGxhdGVJbmRleChcclxuICAgICAgICBhbGxUZW1wbGF0ZXNBcnJheSxcclxuICAgICAgICB0aGlzLmFjdGlvbkJhclRwbCxcclxuICAgICAgKTtcclxuICAgICAgaWYgKGFjdGlvbkJhckluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIHNwZWNpYWxUZW1wbGF0ZUluZGljZXMuYWRkKGFjdGlvbkJhckluZGV4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOWwneivleaJvuWIsCBpbWdBY3Rpb25CYXJUcGwg5ZyoIGFsbFRlbXBsYXRlc0FycmF5IOS4reeahOS9jee9rlxyXG4gICAgaWYgKHRoaXMuaW1nQWN0aW9uQmFyVHBsKSB7XHJcbiAgICAgIGNvbnN0IGltZ0FjdGlvbkJhckluZGV4ID0gdGhpcy5maW5kVGVtcGxhdGVJbmRleChcclxuICAgICAgICBhbGxUZW1wbGF0ZXNBcnJheSxcclxuICAgICAgICB0aGlzLmltZ0FjdGlvbkJhclRwbCxcclxuICAgICAgKTtcclxuICAgICAgaWYgKGltZ0FjdGlvbkJhckluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIHNwZWNpYWxUZW1wbGF0ZUluZGljZXMuYWRkKGltZ0FjdGlvbkJhckluZGV4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOWmguaenOaXoOazlemAmui/h+W8leeUqOaJvuWIsOeJueauiuaooeadv++8jOS9v+eUqOWkh+eUqOetlueVpVxyXG4gICAgLy8g5aSH55So562W55Wl77ya5YGH6K6+5pyA5ZCO55qE5qih5p2/5piv54m55q6K5qih5p2/XHJcbiAgICBjb25zdCBzcGVjaWFsVGVtcGxhdGVDb3VudCA9XHJcbiAgICAgICh0aGlzLmFjdGlvbkJhclRwbCA/IDEgOiAwKSArICh0aGlzLmltZ0FjdGlvbkJhclRwbCA/IDEgOiAwKTtcclxuICAgIGlmIChzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLnNpemUgPT09IDAgJiYgc3BlY2lhbFRlbXBsYXRlQ291bnQgPiAwKSB7XHJcbiAgICAgIGZvciAoXHJcbiAgICAgICAgbGV0IGkgPSBhbGxUZW1wbGF0ZXNBcnJheS5sZW5ndGggLSBzcGVjaWFsVGVtcGxhdGVDb3VudDtcclxuICAgICAgICBpIDwgYWxsVGVtcGxhdGVzQXJyYXkubGVuZ3RoO1xyXG4gICAgICAgIGkrK1xyXG4gICAgICApIHtcclxuICAgICAgICBzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmFkZChpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOaPkOWPluWIl+aooeadv++8iOaOkumZpOeJueauiuaooeadv++8iVxyXG4gICAgY29uc3QgY29sdW1uVGVtcGxhdGVzOiBUZW1wbGF0ZVJlZjxhbnk+W10gPSBbXTtcclxuICAgIGFsbFRlbXBsYXRlc0FycmF5LmZvckVhY2goKHRwbCwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKCFzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmhhcyhpbmRleCkpIHtcclxuICAgICAgICBjb2x1bW5UZW1wbGF0ZXMucHVzaCh0cGwpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDpqozor4HmqKHmnb/mlbDph49cclxuICAgIGlmIChjb2x1bW5UZW1wbGF0ZXMubGVuZ3RoICE9PSB0b3RhbE5lZWRlZFRlbXBsYXRlcykge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFByb1RhYmxlOiDmqKHmnb/mlbDph4/kuI3ljLnphY3vvIHpnIDopoEgJHt0b3RhbE5lZWRlZFRlbXBsYXRlc30g5Liq5YiX5qih5p2/77yM5a6e6ZmF5pyJICR7Y29sdW1uVGVtcGxhdGVzLmxlbmd0aH0g5Liq44CC6K+35qOA5p+lIGN1c3RvbVJlbmRlciDlkowgY3VzdG9tTGFiZWxSZW5kZXIg6YWN572u44CCYCxcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDms6jlhozoh6rlrprkuYnmuLLmn5PmqKHmnb9cclxuICAgIGNvbHVtbnNXaXRoQ3VzdG9tUmVuZGVyLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcclxuICAgICAgY29uc3QgdGVtcGxhdGVOYW1lID0gY29sdW1uLmN1c3RvbVJlbmRlciE7XHJcbiAgICAgIGlmIChpbmRleCA8IGNvbHVtblRlbXBsYXRlcy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlcy5zZXQodGVtcGxhdGVOYW1lLCBjb2x1bW5UZW1wbGF0ZXNbaW5kZXhdKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgYFByb1RhYmxlOiDmnKrmib7liLDmqKHmnb8gXCIke3RlbXBsYXRlTmFtZX1cIu+8jOe0ouW8lSAke2luZGV4fSDotoXlh7rojIPlm7RgLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIOazqOWGjOiHquWumuS5iWxhYmVs5qih5p2/77yI5LuOIGN1c3RvbVJlbmRlckNvdW50IOS5i+WQjuW8gOWni++8iVxyXG4gICAgY29sdW1uc1dpdGhDdXN0b21MYWJlbC5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRlbXBsYXRlTmFtZSA9IGNvbHVtbi5jdXN0b21MYWJlbFJlbmRlciE7XHJcbiAgICAgIGNvbnN0IHRlbXBsYXRlSW5kZXggPSBjdXN0b21SZW5kZXJDb3VudCArIGluZGV4O1xyXG4gICAgICBpZiAodGVtcGxhdGVJbmRleCA8IGNvbHVtblRlbXBsYXRlcy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlcy5zZXQodGVtcGxhdGVOYW1lLCBjb2x1bW5UZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICBgUHJvVGFibGU6IOacquaJvuWIsGxhYmVs5qih5p2/IFwiJHt0ZW1wbGF0ZU5hbWV9XCLvvIzntKLlvJUgJHt0ZW1wbGF0ZUluZGV4fSDotoXlh7rojIPlm7RgLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g5bCd6K+V5Zyo5pWw57uE5Lit5om+5Yiw5qih5p2/55qE57Si5byV77yI5L2/55So5aSa56eN5q+U6L6D5pa55byP77yJXHJcbiAgcHJpdmF0ZSBmaW5kVGVtcGxhdGVJbmRleChcclxuICAgIHRlbXBsYXRlczogVGVtcGxhdGVSZWY8YW55PltdLFxyXG4gICAgdGFyZ2V0OiBUZW1wbGF0ZVJlZjxhbnk+LFxyXG4gICk6IG51bWJlciB7XHJcbiAgICAvLyDmlrnms5Ux77ya5byV55So55u4562J5oCnXHJcbiAgICBsZXQgaW5kZXggPSB0ZW1wbGF0ZXMuaW5kZXhPZih0YXJnZXQpO1xyXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgcmV0dXJuIGluZGV4O1xyXG5cclxuICAgIC8vIOaWueazlTLvvJrpgJrov4cgZWxlbWVudFJlZiDmr5TovoNcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnRSZWYgPSAodGFyZ2V0IGFzIGFueSkuZWxlbWVudFJlZjtcclxuICAgICAgaWYgKHRhcmdldEVsZW1lbnRSZWYpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbXBsYXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgdHBsRWxlbWVudFJlZiA9ICh0ZW1wbGF0ZXNbaV0gYXMgYW55KS5lbGVtZW50UmVmO1xyXG4gICAgICAgICAgaWYgKHRwbEVsZW1lbnRSZWYgPT09IHRhcmdldEVsZW1lbnRSZWYpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIOW/veeVpemUmeivr1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOaWueazlTPvvJrpgJrov4cgQW5ndWxhciDlhoXpg6jlsZ7mgKfmr5TovoNcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHRhcmdldENvbnRhaW5lciA9ICh0YXJnZXQgYXMgYW55KS5fZGVjbGFyYXRpb25UQ29udGFpbmVyO1xyXG4gICAgICBpZiAodGFyZ2V0Q29udGFpbmVyKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IHRwbENvbnRhaW5lciA9ICh0ZW1wbGF0ZXNbaV0gYXMgYW55KS5fZGVjbGFyYXRpb25UQ29udGFpbmVyO1xyXG4gICAgICAgICAgaWYgKHRwbENvbnRhaW5lciA9PT0gdGFyZ2V0Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyDlv73nlaXplJnor69cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG5cclxuICAvLyDorr7nva7nrZvpgInooajljZXpu5jorqTlsZ7mgKdcclxuICBwcml2YXRlIHNldFNlYXJjaEZvcm1EZWZhdWx0UHJvcChjb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdKSB7XHJcbiAgICBjb2x1bW5zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKGl0ZW0udmFsdWVUeXBlKSB7XHJcbiAgICAgICAgaWYgKGl0ZW0uZmllbGRQcm9wcykge1xyXG4gICAgICAgICAgaXRlbS5maWVsZFByb3BzID0ge1xyXG4gICAgICAgICAgICAuLi5QUk9fVEFCTEVfREVGQVVMVF9QUk9QU1tpdGVtLnZhbHVlVHlwZV0sXHJcbiAgICAgICAgICAgIC4uLml0ZW0uZmllbGRQcm9wcyxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGl0ZW0uZmllbGRQcm9wcyA9IHsgLi4uUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbaXRlbS52YWx1ZVR5cGVdIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOWKqOaAgeiuvue9rk9wdGlvbnNcclxuICBwcml2YXRlIHNldFNlbGVjdFJlcXVlc3QoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgY29sdW1ucy5tYXAoYXN5bmMgKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKGl0ZW0uZmllbGRQcm9wcyAmJiBoYXNJbihpdGVtLmZpZWxkUHJvcHMsIFwicmVxdWVzdFwiKSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgKFxyXG4gICAgICAgICAgICBpdGVtLmZpZWxkUHJvcHMgYXMgU2VsZWN0RmllbGRQcm9wc1xyXG4gICAgICAgICAgKS5yZXF1ZXN0Py4oKTtcclxuICAgICAgICAgIChpdGVtLmZpZWxkUHJvcHMgYXMgU2VsZWN0RmllbGRQcm9wcykub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIChpdGVtLmZpZWxkUHJvcHMgYXMgU2VsZWN0RmllbGRQcm9wcykub3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNldFNlYXJjaFBhcmFtcyhjb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdKSB7XHJcbiAgICB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMgPSBbXTtcclxuICAgIGNvbHVtbnNcclxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZsYWcgPSAhaXRlbS5oaWRlSW5TZWFyY2ggJiYgaXRlbS52YWx1ZVR5cGU7XHJcbiAgICAgICAgaWYgKGZsYWcpIHtcclxuICAgICAgICAgIHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5wdXNoKGNsb25lRGVlcChpdGVtKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbGFnO1xyXG4gICAgICB9KVxyXG4gICAgICAuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gY29sdW1uLmZpZWxkUHJvcHM/Lm5hbWUgfHwgY29sdW1uLnByb3A7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IFBST19UQUJMRV9ERUZBVUxUX1BST1BTW2NvbHVtbi52YWx1ZVR5cGVdLnZhbHVlO1xyXG5cclxuICAgICAgICAvLyDlr7nkuo5jaGVja2JveOexu+Wei++8jOS7jm9wdGlvbnPkuK3mib7lh7pjaGVja2Vk5Li6dHJ1ZeeahOmhueS9nOS4uum7mOiupOWAvFxyXG4gICAgICAgIGlmIChjb2x1bW4udmFsdWVUeXBlID09PSBcImNoZWNrYm94XCIpIHtcclxuICAgICAgICAgIGNvbnN0IGNoZWNrZWRWYWx1ZXMgPSAoY29sdW1uLmZpZWxkUHJvcHM/Lm9wdGlvbnMgfHwgW10pXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKG9wdDogT3B0aW9uc1R5cGUpID0+IG9wdC5jaGVja2VkKVxyXG4gICAgICAgICAgICAubWFwKChvcHQ6IE9wdGlvbnNUeXBlKSA9PiBvcHQudmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPVxyXG4gICAgICAgICAgICBjaGVja2VkVmFsdWVzLmxlbmd0aCA+IDAgPyBjaGVja2VkVmFsdWVzIDogZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba2V5XSA9IGNvbHVtbi5maWVsZFByb3BzPy52YWx1ZSB8fCBkZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDliJ3lp4vljJYgYXV0b0NvbXBsZXRlIOaVsOaNrua6kFxyXG4gICAgICAgIGlmIChjb2x1bW4udmFsdWVUeXBlID09PSBcImF1dG9Db21wbGV0ZVwiKSB7XHJcbiAgICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1trZXldID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAvLyDmoLnmja7liJfnmoQgb3JkZXIg5a2X5q616L+b6KGM5o6S5bqP77yM5pyq6K6+572uIG9yZGVyIOeahOaUvuWcqOacgOWQjlxyXG4gICAgdGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGFPcmRlciA9IGlzTmlsKGE/Lm9yZGVyKSA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogYS5vcmRlcjtcclxuICAgICAgY29uc3QgYk9yZGVyID0gaXNOaWwoYj8ub3JkZXIpID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgOiBiLm9yZGVyO1xyXG4gICAgICBpZiAoYU9yZGVyID09PSBiT3JkZXIpIHJldHVybiAwO1xyXG4gICAgICByZXR1cm4gYU9yZGVyIC0gYk9yZGVyO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZXRTZWFyY2hGb3JtRGVmYXVsdFByb3AodGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zKTtcclxuXHJcbiAgICAvLyDlubblj5HliqDovb3miYDmnInpnIDopoHlvILmraXojrflj5bnmoTpgInpoblcclxuICAgIHRoaXMuc2V0U2VsZWN0UmVxdWVzdCh0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVUYWJsZUNvbHVtbnMoaW5qZWN0Q29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgLy8g6L+c56iL5YiX55u05o6l5L2c5Li65p2l5rqQ77yM6L+H5ruk5o6J5pys5Zyw5LiN5a2Y5Zyo55qE5YiX77yM5bm25LuO5pys5Zyw5YiX6KGl5YWF5riy5p+T6YWN572uXHJcbiAgICBjb25zdCByZW1vdGVDb2x1bW5zID0gaW5qZWN0Q29sdW1uc1xyXG4gICAgICAuZmlsdGVyKChpbmplY3RDb2wpID0+XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLnByb3AgPT09IGluamVjdENvbC5wcm9wKSxcclxuICAgICAgKVxyXG4gICAgICAubWFwKChpbmplY3RDb2wpID0+IHtcclxuICAgICAgICBjb25zdCBsb2NhbENvbCA9IHRoaXMuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5wcm9wID09PSBpbmplY3RDb2wucHJvcCk7XHJcbiAgICAgICAgcmV0dXJuIHsgLi4ubG9jYWxDb2wsIC4uLmluamVjdENvbCB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAvLyDovoXliqnliJflj5boh6rmnKzlnLDvvIzkv53mjIHlnKjljp/lp4vkvY3nva7vvIjpppbpg6ggLyDlsL7pg6jvvIlcclxuICAgIGNvbnN0IGZpcnN0Tm9uQXV4SW5kZXggPSB0aGlzLmNvbHVtbnMuZmluZEluZGV4KFxyXG4gICAgICAoYykgPT4gIWMuYXV4aWxpYXJ5Q29sdW1uLFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGxhc3ROb25BdXhJbmRleCA9XHJcbiAgICAgIHRoaXMuY29sdW1ucy5sZW5ndGggLVxyXG4gICAgICAxIC1cclxuICAgICAgWy4uLnRoaXMuY29sdW1uc10ucmV2ZXJzZSgpLmZpbmRJbmRleCgoYykgPT4gIWMuYXV4aWxpYXJ5Q29sdW1uKTtcclxuICAgIGNvbnN0IGhlYWRBdXhpbGlhcnkgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKFxyXG4gICAgICAoY29sLCBpKSA9PiBjb2wuYXV4aWxpYXJ5Q29sdW1uICYmIGkgPCBmaXJzdE5vbkF1eEluZGV4LFxyXG4gICAgKTtcclxuICAgIGNvbnN0IHRhaWxBdXhpbGlhcnkgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKFxyXG4gICAgICAoY29sLCBpKSA9PiBjb2wuYXV4aWxpYXJ5Q29sdW1uICYmIGkgPiBsYXN0Tm9uQXV4SW5kZXgsXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuZm9ybWF0ZUlubmVyQ29sdW1ucyhbLi4uaGVhZEF1eGlsaWFyeSwgLi4ucmVtb3RlQ29sdW1ucywgLi4udGFpbEF1eGlsaWFyeV0pO1xyXG4gIH1cclxuXHJcbiAgLy8g6YCa6L+HIFByb3h5IOebkeWQrCBfc2VhcmNoUGFyYW1zIOeahOWxnuaAp+WPmOabtFxyXG4gIHByaXZhdGUgY3JlYXRlU2VhcmNoUGFyYW1zUHJveHkodGFyZ2V0OiBhbnkpIHtcclxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgY29uc3QgaGFuZGxlcjogUHJveHlIYW5kbGVyPGFueT4gPSB7XHJcbiAgICAgIHNldChvYmo6IGFueSwgcHJvcDogc3RyaW5nIHwgc3ltYm9sLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHByb3ApO1xyXG4gICAgICAgIGNvbnN0IG9sZFZhbCA9IG9ialtrZXldO1xyXG4gICAgICAgIGlmIChvbGRWYWwgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9ialtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHNlbGYub25WYWx1ZXNDaGFuZ2UuZW1pdCh7XHJcbiAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgdmFsdWUsXHJcbiAgICAgICAgICAgIHBhcmFtczogc2VsZi5nZXRTZWFyY2hQYXJhbXMoKSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhckVtcHR5U2VhcmNoUGFyYW1zKCkge1xyXG4gICAgY29uc3QgY2xvbmVTZWFyY2hQYXJhbXMgPSBjbG9uZURlZXAodGhpcy5fc2VhcmNoUGFyYW1zKTtcclxuICAgIHJldHVybiBjbG9uZVNlYXJjaFBhcmFtcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRTZXJ2ZXJTb3J0UGF5bG9hZCgpIHtcclxuICAgIC8vIOaehOW7uua/gOa0u+aOkuW6j+mbhuWQiO+8iOaMieS8mOWFiOe6p+S7juS9juWIsOmrmO+8jOacq+WwvuS8mOWFiO+8iVxyXG4gICAgY29uc3QgYWN0aXZlS2V5cyA9IHRoaXMuX3NvcnRQcmlvcml0eS5maWx0ZXIoKGspID0+ICEhdGhpcy5fc29ydE1hcFtrXSk7XHJcbiAgICBpZiAoYWN0aXZlS2V5cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xyXG4gICAgY29uc3Qgc29ydHMgPSBhY3RpdmVLZXlzLm1hcCgoZmllbGQpID0+IHtcclxuICAgICAgLy8g5p+l5om+5a+55bqU55qE5YiX6YWN572u77yM5LyY5YWI5L2/55Soc29ydE5hbWXlrZfmrrVcclxuICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5fY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5wcm9wID09PSBmaWVsZCk7XHJcbiAgICAgIGNvbnN0IHNvcnRGaWVsZCA9IGNvbHVtbj8uc29ydE5hbWUgfHwgZmllbGQ7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZmllbGQ6IHNvcnRGaWVsZCxcclxuICAgICAgICBvcmRlcjogdGhpcy5fc29ydE1hcFtmaWVsZF0hLFxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgICBpZiAodGhpcy5tdWx0aXBsZVNvcnQpIHtcclxuICAgICAgcmV0dXJuIHNvcnRzOyAvLyDku6XmlbDnu4TlvaLlvI/mj5DkuqTlpJrliJfmjpLluo9cclxuICAgIH1cclxuICAgIGNvbnN0IFtmaXJzdF0gPSBzb3J0cztcclxuICAgIHJldHVybiBmaXJzdDsgLy8g5YW85a655Y2V5YiX57uT5p6EIHsgZmllbGQsIG9yZGVyIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc29ydERhdGFTb3VyY2VJblBsYWNlKCkge1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuZGF0YVNvdXJjZSkgfHwgdGhpcy5kYXRhU291cmNlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgY29uc3QgYWN0aXZlS2V5cyA9IHRoaXMuX3NvcnRQcmlvcml0eS5maWx0ZXIoKGspID0+ICEhdGhpcy5fc29ydE1hcFtrXSk7XHJcbiAgICBpZiAoYWN0aXZlS2V5cy5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcbiAgICAvLyDlpI3liLbkuIDku73kvJjlhYjnuqfvvIzku47liY3liLDlkI7kvJjlhYjnuqfku47kvY7liLDpq5jvvIjmnIDlkI7orr7nva7nmoTlrZfmrrXkvJjlhYjvvIlcclxuICAgIGNvbnN0IGtleXNJblByaW9yaXR5ID0gWy4uLmFjdGl2ZUtleXNdO1xyXG4gICAgdGhpcy5kYXRhU291cmNlLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XHJcbiAgICAgIGZvciAobGV0IGkgPSBrZXlzSW5Qcmlvcml0eS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIGNvbnN0IGZpZWxkID0ga2V5c0luUHJpb3JpdHlbaV07XHJcbiAgICAgICAgY29uc3Qgb3JkZXIgPSB0aGlzLl9zb3J0TWFwW2ZpZWxkXSE7XHJcbiAgICAgICAgY29uc3QgYXYgPSBhPy5bZmllbGRdO1xyXG4gICAgICAgIGNvbnN0IGJ2ID0gYj8uW2ZpZWxkXTtcclxuICAgICAgICBjb25zdCBjbXAgPSB0aGlzLmNvbXBhcmVWYWx1ZXMoYXYsIGJ2KTtcclxuICAgICAgICBpZiAoY21wICE9PSAwKSByZXR1cm4gb3JkZXIgPT09IFwiYXNjZW5kXCIgPyBjbXAgOiAtY21wO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXBhcmVWYWx1ZXMoYVZhbDogYW55LCBiVmFsOiBhbnkpOiBudW1iZXIge1xyXG4gICAgaWYgKGFWYWwgPT0gbnVsbCAmJiBiVmFsID09IG51bGwpIHJldHVybiAwO1xyXG4gICAgaWYgKGFWYWwgPT0gbnVsbCkgcmV0dXJuIC0xO1xyXG4gICAgaWYgKGJWYWwgPT0gbnVsbCkgcmV0dXJuIDE7XHJcbiAgICBpZiAoYVZhbCBpbnN0YW5jZW9mIERhdGUgJiYgYlZhbCBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgcmV0dXJuIGFWYWwuZ2V0VGltZSgpIC0gYlZhbC5nZXRUaW1lKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGFWYWwgPT09IFwiYm9vbGVhblwiICYmIHR5cGVvZiBiVmFsID09PSBcImJvb2xlYW5cIikge1xyXG4gICAgICByZXR1cm4gYVZhbCA9PT0gYlZhbCA/IDAgOiBhVmFsID8gMSA6IC0xO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBhVmFsID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBiVmFsID09PSBcIm51bWJlclwiKSB7XHJcbiAgICAgIHJldHVybiBhVmFsIC0gYlZhbDtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgYVZhbCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgYlZhbCA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICByZXR1cm4gYVZhbC5sb2NhbGVDb21wYXJlKGJWYWwpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYU51bSA9IE51bWJlcihhVmFsKTtcclxuICAgIGNvbnN0IGJOdW0gPSBOdW1iZXIoYlZhbCk7XHJcbiAgICBpZiAoIWlzTmFOKGFOdW0pICYmICFpc05hTihiTnVtKSkgcmV0dXJuIGFOdW0gLSBiTnVtO1xyXG4gICAgcmV0dXJuIFN0cmluZyhhVmFsKS5sb2NhbGVDb21wYXJlKFN0cmluZyhiVmFsKSk7XHJcbiAgfVxyXG5cclxuICAvLyDmiafooYwgYXV0b0NvbXBsZXRlIOaVsOaNrua6kOafpeivou+8iOWunumZheaJp+ihjOmAu+i+ke+8iVxyXG4gIHByaXZhdGUgZXhlY3V0ZUF1dG9Db21wbGV0ZURhdGFTb3VyY2UoZXZlbnQ6IEV2ZW50LCBjb2x1bW46IFByb1RhYmxlQ29sdW1uKSB7XHJcbiAgICBjb25zdCBmaWVsZEtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgKGNvbHVtbi5maWVsZFByb3BzIGFzIEF1dG9Db21wbGV0ZUZpZWxkUHJvcHMpLmRhdGFTb3VyY2UgJiZcclxuICAgICAgdHlwZW9mIChjb2x1bW4uZmllbGRQcm9wcyBhcyBBdXRvQ29tcGxldGVGaWVsZFByb3BzKS5kYXRhU291cmNlID09PVxyXG4gICAgICAgIFwiZnVuY3Rpb25cIlxyXG4gICAgKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKGNvbHVtbi5maWVsZFByb3BzIGFzIEF1dG9Db21wbGV0ZUZpZWxkUHJvcHMpLmRhdGFTb3VyY2UoXHJcbiAgICAgICAgICBldmVudCxcclxuICAgICAgICApO1xyXG4gICAgICAgIC8vIOWmguaenOi/lOWbnueahOaYryBQcm9taXNl77yM5aSE55CG5byC5q2l57uT5p6cXHJcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgIHJlc3VsdFxyXG4gICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2ZpZWxkS2V5XSA9IGRhdGEgfHwgW107XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQXV0b0NvbXBsZXRlIGRhdGFTb3VyY2UgZXJyb3I6XCIsIGVycm9yKTtcclxuICAgICAgICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gPSBbXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIOWQjOatpei/lOWbnue7k+aenFxyXG4gICAgICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNbZmllbGRLZXldID0gcmVzdWx0IHx8IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiQXV0b0NvbXBsZXRlIGRhdGFTb3VyY2UgZXJyb3I6XCIsIGVycm9yKTtcclxuICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gPSBbXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNlYXJjaFBhcmFtcyhvcHRpb25zPzoge1xyXG4gICAgdXNlU2F2ZWQ/OiBib29sZWFuOyAvLyDkvb/nlKjmnIDov5HkuIDmrKHmn6Xor6Lmj5DkuqTnmoTlj4LmlbDvvIzpu5jorqTkuLogZmFsc2XvvJtmYWxzZSDkuLrlvZPliY3ooajljZXlgLxcclxuICB9KTogYW55IHtcclxuICAgIGNvbnN0IHsgdXNlU2F2ZWQgPSBmYWxzZSB9ID0gb3B0aW9ucyB8fCB7fTtcclxuICAgIGNvbnN0IHJhd1BhcmFtcyA9IHVzZVNhdmVkID8gdGhpcy5fc2F2ZWRTZWFyY2hQYXJhbXMgOiB0aGlzLl9zZWFyY2hQYXJhbXM7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBjbG9uZURlZXAocmF3UGFyYW1zIHx8IHt9KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBwYXJhbXMsXHJcbiAgICAgIHBhZ2VJbmZvOiB7XHJcbiAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXgsXHJcbiAgICAgICAgcGFnZVNpemU6IHRoaXMuX3BhZ2VJbmZvLnBhZ2VTaXplLFxyXG4gICAgICB9LFxyXG4gICAgICAvLyDlnKjnur/mjpLluo/mqKHlvI/vvJrmiormjpLluo/lr7nosaHmj5DkuqTnu5nmjqXlj6NcclxuICAgICAgLi4uKHRoaXMuc29ydE1vZGUgPT09IFwic2VydmVyXCJcclxuICAgICAgICA/IHsgc29ydDogdGhpcy5idWlsZFNlcnZlclNvcnRQYXlsb2FkKCkgfVxyXG4gICAgICAgIDoge30pLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWxvYWQoYWZ0ZXJEZWxldGU/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KGFmdGVyRGVsZXRlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRGaWVsZHNWYWx1ZShmaWVsZHM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgIE9iamVjdC5rZXlzKGZpZWxkcykuZm9yRWFjaCgoaykgPT4ge1xyXG4gICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba10gPSBmaWVsZHNba107IC8vIOS/neeVmSBQcm94ee+8jOmAkOmhuei1i+WAvOinpuWPkeaLpuaIqlxyXG5cclxuICAgICAgLy8gY2hlY2tib3gg57G75Z6L6ZyA6KaB5ZCM5q2l5pu05pawIG9wdGlvbnMg55qEIGNoZWNrZWQg54q25oCB77yM5ZCm5YiZIFVJIOS4jeS8muWTjeW6lFxyXG4gICAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMuZmluZChcclxuICAgICAgICAoaXRlbSkgPT4gKGl0ZW0uZmllbGRQcm9wcz8ubmFtZSB8fCBpdGVtLnByb3ApID09PSBrLFxyXG4gICAgICApO1xyXG4gICAgICBpZiAodGFyZ2V0Q29sdW1uPy52YWx1ZVR5cGUgPT09IFwiY2hlY2tib3hcIikge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlczogYW55W10gPSBBcnJheS5pc0FycmF5KGZpZWxkc1trXSkgPyBmaWVsZHNba10gOiBbXTtcclxuICAgICAgICBjb25zdCB0YXJnZXRGaWVsZFByb3BzID0gdGFyZ2V0Q29sdW1uLmZpZWxkUHJvcHMgYXMgQ2hlY2tib3hGaWVsZFByb3BzO1xyXG4gICAgICAgIGlmICh0YXJnZXRGaWVsZFByb3BzPy5vcHRpb25zKSB7XHJcbiAgICAgICAgICB0YXJnZXRGaWVsZFByb3BzLm9wdGlvbnMgPSB0YXJnZXRGaWVsZFByb3BzLm9wdGlvbnMubWFwKFxyXG4gICAgICAgICAgICAoaXRlbTogT3B0aW9uc1R5cGUpID0+ICh7XHJcbiAgICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgICBjaGVja2VkOiB2YWx1ZXMuaW5jbHVkZXMoaXRlbS52YWx1ZSksXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEZpZWxkVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtc1trZXldID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZFJvdygpIHtcclxuICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNldENvbHVtbnMoXHJcbiAgICBjb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdLFxyXG4gICAgb3B0aW9ucz86IHtcclxuICAgICAgcmVsb2FkPzogYm9vbGVhbjsgLy8g5piv5ZCm6YeN5paw5Yqg6L295pWw5o2u77yM6buY6K6k5Li6IGZhbHNlXHJcbiAgICB9LFxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8g5pu05pawIGNvbHVtbnMg6L6T5YWl5bGe5oCnXHJcbiAgICB0aGlzLmNvbHVtbnMgPSBjbG9uZURlZXAoY29sdW1ucyk7XHJcblxyXG4gICAgLy8g6YeN5paw5qC85byP5YyW5YaF6YOo5YiXXHJcbiAgICB0aGlzLmZvcm1hdGVJbm5lckNvbHVtbnModGhpcy5jb2x1bW5zKTtcclxuXHJcbiAgICAvLyDph43mlrDorr7nva7mkJzntKLlj4LmlbDvvIjlvILmraXmk43kvZzvvIlcclxuICAgIC8vIOWFiOa4heepuuaXp+eahOaQnOe0ouWPguaVsO+8jOmBv+WFjeaXp+aVsOaNruaui+eVmVxyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zID0ge307XHJcbiAgICBhd2FpdCB0aGlzLnNldFNlYXJjaFBhcmFtcyh0aGlzLmNvbHVtbnMpO1xyXG5cclxuICAgIC8vIOmHjeaWsOWIm+W7uiBQcm94ee+8jOehruS/neihqOWNlemhueWAvOWPmOWMluiDveato+W4uOinpuWPkeS6i+S7tlxyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zID0gdGhpcy5jcmVhdGVTZWFyY2hQYXJhbXNQcm94eSh0aGlzLl9zZWFyY2hQYXJhbXMpO1xyXG5cclxuICAgIC8vIOmHjeaWsOazqOWGjOaooeadv++8iOWmguaenOe7hOS7tuW3sue7j+WIneWni+WMluWujOaIkO+8iVxyXG4gICAgaWYgKHRoaXMuYWxsVGVtcGxhdGVzKSB7XHJcbiAgICAgIHRoaXMuYXV0b1JlZ2lzdGVyVGVtcGxhdGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c6K6+572u5LqGIHJlbG9hZCDpgInpobnkuLogdHJ1Ze+8jOWImemHjeaWsOafpeivouaVsOaNrlxyXG4gICAgaWYgKG9wdGlvbnM/LnJlbG9hZCA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRSb3dEYXRhPFQgPSBhbnk+KCk6IFQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkVGFibGVSb3c7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q2hlY2tlZFJvd3M8VCA9IGFueT4oKTogVFtdIHtcclxuICAgIGlmICghdGhpcy5zaG93Q2hlY2tib3gpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgLy8g6L+U5Zue5b2T5YmN5pWw5o2u5rqQ5Lit5omA5pyJIGNoZWNrZWQg5Li6IHRydWUg55qE6aG5XHJcbiAgICAvLyDms6jmhI/vvJrlpoLmnpzpnIDopoHojrflj5bmiYDmnInpobXnmoTpgInkuK3pobnvvIzpnIDopoHpgY3ljobmiYDmnInmlbDmja7mupDmiJbkvb/nlKggX3NlbGVjdGVkUm93SWRzXHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmZpbHRlcigocm93KSA9PiByb3cuY2hlY2tlZCA9PT0gdHJ1ZSkgYXMgVFtdO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W5oyH5a6a5ZCN56ew55qE5qih5p2/XHJcbiAgZ2V0VGVtcGxhdGUobmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xyXG4gICAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLmN1c3RvbVRlbXBsYXRlcy5nZXQobmFtZSkgfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIGdldFRvb2xUaXBUZXh0VmFsdWUoY29sdW1uOiBQcm9UYWJsZUNvbHVtbiwgZGF0YTogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGtleSA9XHJcbiAgICAgIGNvbHVtbi5jdXN0b21SZW5kZXIgJiYgdGhpcy5nZXRUZW1wbGF0ZShjb2x1bW4uY3VzdG9tUmVuZGVyKVxyXG4gICAgICAgID8gXCJcIlxyXG4gICAgICAgIDogY29sdW1uLmVsbGlwc2lzXHJcbiAgICAgICAgICA/IGNvbHVtbi5wcm9wXHJcbiAgICAgICAgICA6IFwiXCI7XHJcbiAgICByZXR1cm4gIWtleSA/IFwiXCIgOiBkYXRhW2tleV07XHJcbiAgfVxyXG5cclxuICBnZXRUYWJsZVJvd0NoZWNrZWQoZGF0YTogYW55KSB7XHJcbiAgICAvLyDlkK/nlKjlpI3pgInmoYbml7bvvJrooYzpq5jkuq7lupTkuI7lpI3pgInmoYbpgInkuK3nirbmgIHkuIDoh7TvvIjmlK/mjIHlpJrpgInvvIlcclxuICAgIGlmICh0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pc1Jvd0NoZWNrZWQoZGF0YSk7XHJcbiAgICB9XHJcbiAgICAvLyDmnKrlkK/nlKjlpI3pgInmoYbml7bvvJrku43nhLbkvb/nlKjljZXpgInooYzpq5jkuq5cclxuICAgIGlmICghdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdykgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuX3NlbGVjdGVkVGFibGVSb3cpID09PSBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxuICB9XHJcblxyXG4gIC8vIOajgOafpeihjOaYr+WQpuiiq+emgeeUqFxyXG4gIGlzUm93RGlzYWJsZWQoZGF0YTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NoZWNrYm94KSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dEaXNhYmxlZCA/IHRoaXMucm93RGlzYWJsZWQoZGF0YSkgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIOajgOafpeihjOaYr+WQpuiiq+WkjemAieahhumAieS4re+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIGlzUm93Q2hlY2tlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5zaG93Q2hlY2tib3gpIHJldHVybiBmYWxzZTtcclxuICAgIC8vIOebtOaOpeivu+WPluaVsOaNruWvueixoeeahCBjaGVja2VkIOWxnuaAp1xyXG4gICAgcmV0dXJuIGRhdGEuY2hlY2tlZCA9PT0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIOWIh+aNouihjOeahOmAieS4reeKtuaAge+8iOaVsOaNrumpseWKqOaooeW8j++8jOS/neeVmeeUqOS6juWFvOWuue+8iVxyXG4gIHRvZ2dsZVJvd0NoZWNrZWQoZGF0YTogYW55LCBjaGVja2VkOiBib29sZWFuLCBldmVudD86IEV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIOmYu+atouS6i+S7tuWGkuazoe+8jOmBv+WFjeinpuWPkeihjOeCueWHu1xyXG4gICAgfVxyXG4gICAgLy8g5aaC5p6c6KGM6KKr56aB55So77yM5LiN5YWB6K645YiH5o2i6YCJ5Lit54q25oCBXHJcbiAgICBpZiAodGhpcy5pc1Jvd0Rpc2FibGVkKGRhdGEpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyDnm7TmjqXorr7nva7mlbDmja7lr7nosaHnmoQgY2hlY2tlZCDlsZ7mgKdcclxuICAgIGRhdGEuY2hlY2tlZCA9IGNoZWNrZWQ7XHJcblxyXG4gICAgLy8g5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd3PvvIjnlKjkuo7lhbzlrrnmgKfvvIlcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fc2VsZWN0ZWRSb3dzLmZpbmRJbmRleCgocm93KSA9PlxyXG4gICAgICB0aGlzLmlzU2FtZVJvdyhyb3csIGRhdGEpLFxyXG4gICAgKTtcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd3MucHVzaChkYXRhKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDli77pgInlpI3pgInmoYbml7blkIzmraXorr7nva7pq5jkuq7pgInkuK3ooYxcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IGRhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93cy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOiLpeW9k+WJjemrmOS6ruihjOS4uuivpeihjO+8jOWImeWPlua2iOmrmOS6rlxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyAmJlxyXG4gICAgICAgIHRoaXMuaXNTYW1lUm93KHRoaXMuX3NlbGVjdGVkVGFibGVSb3csIGRhdGEpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g5pu05paw5YWo6YCJ54q25oCB77yI5pWw5o2u6amx5Yqo5qih5byP77yJXHJcbiAgdXBkYXRlQ2hlY2tBbGxTdGF0dXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NoZWNrYm94IHx8ICFBcnJheS5pc0FycmF5KHRoaXMuZGF0YVNvdXJjZSkpIHtcclxuICAgICAgdGhpcy5fY2hlY2tlZEFsbCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9pbmRldGVybWluYXRlID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIOWPquiuoeeul+WPr+eUqOeahOihjO+8iOacquemgeeUqOeahOihjO+8iVxyXG4gICAgY29uc3QgYXZhaWxhYmxlUm93cyA9IHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIoXHJcbiAgICAgIChyb3cpID0+ICF0aGlzLmlzUm93RGlzYWJsZWQocm93KSxcclxuICAgICk7XHJcbiAgICAvLyDln7rkuo7mlbDmja7lr7nosaHnmoQgY2hlY2tlZCDlsZ7mgKforqHnrpdcclxuICAgIGNvbnN0IGNoZWNrZWRDb3VudCA9IGF2YWlsYWJsZVJvd3MuZmlsdGVyKFxyXG4gICAgICAocm93KSA9PiByb3cuY2hlY2tlZCA9PT0gdHJ1ZSxcclxuICAgICkubGVuZ3RoO1xyXG4gICAgY29uc3QgdG90YWxDb3VudCA9IGF2YWlsYWJsZVJvd3MubGVuZ3RoO1xyXG4gICAgdGhpcy5fY2hlY2tlZEFsbCA9XHJcbiAgICAgIHRvdGFsQ291bnQgPiAwICYmIGNoZWNrZWRDb3VudCA+IDAgJiYgY2hlY2tlZENvdW50ID09PSB0b3RhbENvdW50O1xyXG4gICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGNoZWNrZWRDb3VudCA+IDAgJiYgY2hlY2tlZENvdW50IDwgdG90YWxDb3VudDtcclxuICB9XHJcblxyXG4gIC8vIOWFqOmAiS/lj5bmtojlhajpgInvvIjmlbDmja7pqbHliqjmqKHlvI/vvIlcclxuICB0b2dnbGVDaGVja0FsbChjaGVja2VkOiBib29sZWFuLCBldmVudD86IEV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5Y+q5aSE55CG5Y+v55So55qE6KGM77yI5pyq56aB55So55qE6KGM77yJXHJcbiAgICBjb25zdCBhdmFpbGFibGVSb3dzID0gdGhpcy5kYXRhU291cmNlLmZpbHRlcihcclxuICAgICAgKHJvdykgPT4gIXRoaXMuaXNSb3dEaXNhYmxlZChyb3cpLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyDmibnph4/orr7nva4gY2hlY2tlZCDlsZ7mgKdcclxuICAgIGF2YWlsYWJsZVJvd3MuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgIHJvdy5jaGVja2VkID0gY2hlY2tlZDtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIOWQjOatpeabtOaWsCBfc2VsZWN0ZWRSb3dz77yI55So5LqO5YW85a655oCn77yJXHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd3MgPSBbLi4uYXZhaWxhYmxlUm93c107XHJcbiAgICAgIC8vIOWQjOatpeiuvue9rumrmOS6rumAieS4reihjOS4uuesrOS4gOadoeWPr+mAieaVsOaNrlxyXG4gICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID1cclxuICAgICAgICBhdmFpbGFibGVSb3dzLmxlbmd0aCA+IDAgPyBhdmFpbGFibGVSb3dzWzBdIDogbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93cyA9IFtdO1xyXG4gICAgICAvLyDlj5bmtojpq5jkuq5cclxuICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W6YCJ5Lit55qE6KGM5pWw5o2u77yI5L+d55WZ55So5LqO5YW85a655oCn77yJXHJcbiAgZ2V0U2VsZWN0ZWRSb3dzKCk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLmdldENoZWNrZWRSb3dzKCk7XHJcbiAgfVxyXG5cclxuICAvLyDlpITnkIbooYwgY2hlY2tib3gg5Y+Y5YyW5LqL5Lu277yI5pWw5o2u6amx5Yqo5qih5byP77yJXHJcbiAgaGFuZGxlUm93Q2hlY2tlZENoYW5nZShkYXRhOiBhbnksIGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzUm93RGlzYWJsZWQoZGF0YSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOaVsOaNruWvueixoeeahCBjaGVja2VkIOWxnuaAp+W3sue7j+mAmui/h+WPjOWQkee7keWumuiHquWKqOabtOaWsFxyXG4gICAgLy8g6L+Z6YeM5Y+q6ZyA6KaB5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd3NcclxuXHJcbiAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93c++8iOeUqOS6juWFvOWuueaAp++8iVxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZFJvd3MuZmluZEluZGV4KChyb3cpID0+XHJcbiAgICAgIHRoaXMuaXNTYW1lUm93KHJvdywgZGF0YSksXHJcbiAgICApO1xyXG4gICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93cy5wdXNoKGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOWLvumAieWkjemAieahhuaXtuWQjOatpeiuvue9rumrmOS6rumAieS4reihjFxyXG4gICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gZGF0YTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8g6Iul5b2T5YmN6auY5Lqu6KGM5Li66K+l6KGM77yM5YiZ5Y+W5raI6auY5LquXHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ICYmXHJcbiAgICAgICAgdGhpcy5pc1NhbWVSb3codGhpcy5fc2VsZWN0ZWRUYWJsZVJvdywgZGF0YSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDmm7TmlrDlhajpgInnirbmgIFcclxuICAgIHRoaXMudXBkYXRlQ2hlY2tBbGxTdGF0dXMoKTtcclxuICB9XHJcblxyXG4gIC8vIOWIt+aWsOWFqOmAieeKtuaAge+8iOeUqOS6juWFtuS7luWcuuaZr++8iVxyXG4gIHJlZnJlc2hDaGVja0FsbFN0YXR1cygpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlQ2hlY2tBbGxTdGF0dXMoKTtcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPluihjOeahOWUr+S4gOagh+ivhu+8iOeUqOS6jui3qOmhtemAieS4re+8iVxyXG4gIHByaXZhdGUgZ2V0Um93SWQoZGF0YTogYW55KTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiBkYXRhLmlkID8/IGRhdGEua2V5ID8/IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8vIOWIpOaWreS4pOihjOaYr+WQpuS4uuWQjOS4gOihjFxyXG4gIHByaXZhdGUgaXNTYW1lUm93KHJvdzE6IGFueSwgcm93MjogYW55KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBpZDEgPSB0aGlzLmdldFJvd0lkKHJvdzEpO1xyXG4gICAgY29uc3QgaWQyID0gdGhpcy5nZXRSb3dJZChyb3cyKTtcclxuXHJcbiAgICBpZiAoaWQxICE9PSB1bmRlZmluZWQgJiYgaWQyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIGlkMSA9PT0gaWQyO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZhbGxiYWNrIOWIsCBKU09OIOavlOi+g1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJvdzEpID09PSBKU09OLnN0cmluZ2lmeShyb3cyKTtcclxuICB9XHJcblxyXG4gIC8vIOa4heepuumAieS4reeahOihjO+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIGNsZWFyU2VsZWN0ZWRSb3dzKCkge1xyXG4gICAgLy8g5riF56m65b2T5YmN5pWw5o2u5rqQ5Lit5omA5pyJ6aG555qEIGNoZWNrZWQg54q25oCBXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpKSB7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgICByb3cuY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9zZWxlY3RlZFJvd3MgPSBbXTtcclxuICAgIHRoaXMuX2NoZWNrZWRBbGwgPSBmYWxzZTtcclxuICAgIHRoaXMuX2luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcclxuICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRmllbGRDaGVja0JveENoYW5nZShjaGVja0JveE9wdGlvbnM6IE9wdGlvbnNUeXBlW10sIGtleTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNldEZpZWxkc1ZhbHVlKHtcclxuICAgICAgW2tleV06IGNoZWNrQm94T3B0aW9uc1xyXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uY2hlY2tlZClcclxuICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLnZhbHVlKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlU2VhcmNoKCkge1xyXG4gICAgdGhpcy5fc2F2ZWRTZWFyY2hQYXJhbXMgPSB0aGlzLmNsZWFyRW1wdHlTZWFyY2hQYXJhbXMoKTtcclxuICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA9IDE7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVSZXNldEZvcm0oKSB7XHJcbiAgICBPYmplY3Qua2V5cyh0aGlzLl9zZWFyY2hQYXJhbXMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMuZmluZCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoaXRlbS5maWVsZFByb3BzPy5uYW1lIHx8IGl0ZW0ucHJvcCkgPT09IGtleTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyDlr7nkuo5jaGVja2JveOexu+Wei++8jOmcgOimgeeJueauiuWkhOeQhum7mOiupOWAvFxyXG4gICAgICBpZiAodGFyZ2V0Q29sdW1uPy52YWx1ZVR5cGUgPT09IFwiY2hlY2tib3hcIikge1xyXG4gICAgICAgIC8vIOS7juWOn+Wni2NvbHVtbnPphY3nva7kuK3ojrflj5bliJ3lp4vphY3nva7vvIzku6Xnoa7kv53kvb/nlKjmraPnoa7nmoTpu5jorqTlgLxcclxuICAgICAgICBjb25zdCBvcmlnaW5hbENvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gKGl0ZW0uZmllbGRQcm9wcz8ubmFtZSB8fCBpdGVtLnByb3ApID09PSBrZXk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIOS7juWOn+Wni29wdGlvbnPkuK3mib7lh7pjaGVja2Vk5Li6dHJ1ZeeahOmhueS9nOS4uum7mOiupOWAvFxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRmllbGRQcm9wcyA9IG9yaWdpbmFsQ29sdW1uPy5maWVsZFByb3BzIGFzXHJcbiAgICAgICAgICB8IENoZWNrYm94RmllbGRQcm9wc1xyXG4gICAgICAgICAgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgY2hlY2tlZFZhbHVlcyA9IChvcmlnaW5hbEZpZWxkUHJvcHM/Lm9wdGlvbnMgfHwgW10pXHJcbiAgICAgICAgICAuZmlsdGVyKChvcHQ6IE9wdGlvbnNUeXBlKSA9PiBvcHQuY2hlY2tlZClcclxuICAgICAgICAgIC5tYXAoKG9wdDogT3B0aW9uc1R5cGUpID0+IG9wdC52YWx1ZSk7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID1cclxuICAgICAgICAgIGNoZWNrZWRWYWx1ZXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICA/IGNoZWNrZWRWYWx1ZXNcclxuICAgICAgICAgICAgOiBQUk9fVEFCTEVfREVGQVVMVF9QUk9QU1t0YXJnZXRDb2x1bW4udmFsdWVUeXBlXS52YWx1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPSBkZWZhdWx0VmFsdWU7XHJcblxyXG4gICAgICAgIC8vIOagueaNrum7mOiupOWAvOaBouWkjW9wdGlvbnPnmoRjaGVja2Vk54q25oCB77yM5L2/55So5Y6f5aeLb3B0aW9uc+eahOe7k+aehFxyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGRlZmF1bHRWYWx1ZSkgPyBkZWZhdWx0VmFsdWUgOiBbXTtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbE9wdGlvbnMgPSBvcmlnaW5hbEZpZWxkUHJvcHM/Lm9wdGlvbnMgfHwgW107XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0RmllbGRQcm9wcyA9IHRhcmdldENvbHVtbi5maWVsZFByb3BzIGFzIENoZWNrYm94RmllbGRQcm9wcztcclxuICAgICAgICB0YXJnZXRGaWVsZFByb3BzLm9wdGlvbnMgPSBvcmlnaW5hbE9wdGlvbnMubWFwKChpdGVtOiBPcHRpb25zVHlwZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgY2hlY2tlZDogZGVmYXVsdFZhbHVlcy5pbmNsdWRlcyhpdGVtLnZhbHVlKSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPSB0YXJnZXRDb2x1bW4/LmZpZWxkUHJvcHNcclxuICAgICAgICAgID8gdGFyZ2V0Q29sdW1uPy5maWVsZFByb3BzLnZhbHVlIHx8XHJcbiAgICAgICAgICAgIFBST19UQUJMRV9ERUZBVUxUX1BST1BTW3RhcmdldENvbHVtbi52YWx1ZVR5cGVdLnZhbHVlXHJcbiAgICAgICAgICA6IFBST19UQUJMRV9ERUZBVUxUX1BST1BTW3RhcmdldENvbHVtbi52YWx1ZVR5cGVdLnZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9zYXZlZFNlYXJjaFBhcmFtcyA9IHt9O1xyXG4gICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMub25SZXNldEZvcm1CZWZvcmVSZWxvYWQuZW1pdCgpO1xyXG4gICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlUGFnZUluZGV4Q2hhbmdlKHBhZ2VJbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSBwYWdlSW5kZXg7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQYWdlU2l6ZUNoYW5nZShwYWdlU2l6ZTogYW55KSB7XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlU2l6ZSA9IHBhZ2VTaXplO1xyXG4gICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGhhbmRsZVF1ZXJ5KGFmdGVyRGVsZXRlPzogYm9vbGVhbikge1xyXG4gICAgLy8g5Yig6Zmk5ZCO5Yi35paw5LiU5b2T5YmN6aG15LuF5Ymp5LiA5p2h6K6w5b2V5pe277yM6Iul5LiN5Zyo56ys5LiA6aG15YiZ5YWI5Zue6YCA5LiA6aG1XHJcbiAgICBpZiAoXHJcbiAgICAgIGFmdGVyRGVsZXRlICYmXHJcbiAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5kYXRhU291cmNlKSAmJlxyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UubGVuZ3RoID09PSAxICYmXHJcbiAgICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA+IDFcclxuICAgICkge1xyXG4gICAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggLSAxO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2xvYWRpbmcgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMucmVxdWVzdCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCh7XHJcbiAgICAgICAgICBwYXJhbXM6IHRoaXMuY2xlYXJFbXB0eVNlYXJjaFBhcmFtcygpLFxyXG4gICAgICAgICAgcGFnZUluZm86IHtcclxuICAgICAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXgsXHJcbiAgICAgICAgICAgIHBhZ2VTaXplOiB0aGlzLl9wYWdlSW5mby5wYWdlU2l6ZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAvLyDlnKjnur/mjpLluo/mqKHlvI/vvJrmiormjpLluo/lr7nosaHmj5DkuqTnu5nmjqXlj6NcclxuICAgICAgICAgIC4uLih0aGlzLnNvcnRNb2RlID09PSBcInNlcnZlclwiXHJcbiAgICAgICAgICAgID8geyBzb3J0OiB0aGlzLmJ1aWxkU2VydmVyU29ydFBheWxvYWQoKSB9XHJcbiAgICAgICAgICAgIDoge30pLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyDmn6Xor6LlkI7pu5jorqTkuI3kv53nlZnot6jpobXpgInkuK3nirbmgIHvvJrmr4/mrKHov5Tlm57nmoTmlbDmja7lnYfliJ3lp4vljJbkuLrmnKrpgInkuK1cclxuICAgICAgICBpZiAodGhpcy5zaG93Q2hlY2tib3gpIHtcclxuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IChyZXN1bHQuZGF0YSB8fCBbXSkubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgICBjaGVja2VkOiBmYWxzZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSByZXN1bHQuZGF0YSB8fCBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc3VtbWFyeURhdGEgPSByZXN1bHQuc3VtbWFyeURhdGEgfHwgbnVsbDtcclxuICAgICAgICAvLyDmnKzlnLDmjpLluo/mqKHlvI/vvJrmi7/liLDmlbDmja7lkI7lnKjliY3nq6/mjpLluo9cclxuICAgICAgICBpZiAodGhpcy5zb3J0TW9kZSA9PT0gXCJsb2NhbFwiKSB7XHJcbiAgICAgICAgICB0aGlzLnNvcnREYXRhU291cmNlSW5QbGFjZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9wYWdlSW5mby50b3RhbCA9IHJlc3VsdC50b3RhbCB8fCAwO1xyXG4gICAgICAgIC8vIOWPlua2iOi3qOmhteWkmumAie+8muafpeivouWQjua4heepuumAieS4reeKtuaAgVxyXG4gICAgICAgIGlmICh0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGVkUm93cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwi5p+l6K+i5aSx6LSlOlwiLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gW107XHJcbiAgICAgICAgdGhpcy5fcGFnZUluZm8udG90YWwgPSAwO1xyXG4gICAgICAgIHRoaXMuc3VtbWFyeURhdGEgPSBudWxsO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIHRoaXMuX2xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKFwi5pyq5o+Q5L6bIF9yZXF1ZXN0IOWbnuiwg+WHveaVsFwiKTtcclxuICAgICAgdGhpcy5fbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6Kem5Y+R5YiX5o6S5bqP5Y+Y5pu0XHJcbiAgb25Tb3J0Q2hhbmdlKHNvcnRLZXk6IHN0cmluZywgc29ydE9yZGVyOiBcImFzY2VuZFwiIHwgXCJkZXNjZW5kXCIgfCBudWxsKSB7XHJcbiAgICAvLyDljZXliJfmjpLluo/vvJrph43nva7lhbblroPliJfvvJvlpJrliJfmjpLluo/vvJrkv53nlZnlhbblroPliJdcclxuICAgIGlmICghdGhpcy5tdWx0aXBsZVNvcnQpIHtcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5fc29ydE1hcCkuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKGtleSAhPT0gc29ydEtleSkgdGhpcy5fc29ydE1hcFtrZXldID0gbnVsbDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9zb3J0TWFwW3NvcnRLZXldID0gc29ydE9yZGVyO1xyXG5cclxuICAgIC8vIOe7tOaKpOS8mOWFiOe6p+mYn+WIl++8muacieW6j+WIl+S4lOmdnuepuiAtPiDnva7kuo7mnKvlsL7vvJvkuLrnqbogLT4g56e76ZmkXHJcbiAgICB0aGlzLl9zb3J0UHJpb3JpdHkgPSB0aGlzLl9zb3J0UHJpb3JpdHkuZmlsdGVyKChrKSA9PiBrICE9PSBzb3J0S2V5KTtcclxuICAgIGlmIChzb3J0T3JkZXIpIHtcclxuICAgICAgdGhpcy5fc29ydFByaW9yaXR5LnB1c2goc29ydEtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc29ydE1vZGUgPT09IFwibG9jYWxcIikge1xyXG4gICAgICB0aGlzLnNvcnREYXRhU291cmNlSW5QbGFjZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5Zyo57q/5o6S5bqP77ya6YeN5paw6K+35rGCXHJcbiAgICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFNvcnRPcmRlcihzb3J0S2V5OiBzdHJpbmcpOiBcImFzY2VuZFwiIHwgXCJkZXNjZW5kXCIgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9zb3J0TWFwW3NvcnRLZXldIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVUYWJsZVJvd0NsaWNrKGRhdGE6IGFueSkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IGRhdGE7XHJcbiAgICBpZiAodGhpcy5zaG93Q2hlY2tib3ggJiYgIXRoaXMuaXNSb3dEaXNhYmxlZChkYXRhKSkge1xyXG4gICAgICAvLyDlhYjmuIXnqbrmiYDmnInpgInkuK3ooYxcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzID0gW107XHJcbiAgICAgIGNvbnN0IG5leHRDaGVja2VkID0gIXRoaXMuaXNSb3dDaGVja2VkKGRhdGEpO1xyXG4gICAgICB0aGlzLnRvZ2dsZVJvd0NoZWNrZWQoZGF0YSwgbmV4dENoZWNrZWQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vblJvd0NsaWNrLmVtaXQodGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVUYWJsZVJvd0RiQ2xpY2soZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gZGF0YTtcclxuICAgIHRoaXMub25Sb3dEYkNsaWNrLmVtaXQodGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVDb2x1bW5zU2V0dGluZ0NvbmZpcm0oKSB7XHJcbiAgICB0aGlzLnF1ZXJ5RHluYW1pY0NvbHVtbnMoKTtcclxuICB9XHJcblxyXG4gIC8vIOWkhOeQhiBhdXRvQ29tcGxldGUg6L6T5YWl5LqL5Lu277yI5bim6Ziy5oqW77yJXHJcbiAgaGFuZGxlQXV0b0NvbXBsZXRlSW5wdXQoZXZlbnQ6IEV2ZW50LCBjb2x1bW46IFByb1RhYmxlQ29sdW1uKSB7XHJcbiAgICBjb25zdCBmaWVsZEtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG5cclxuICAgIC8vIOWmguaenOivpeWtl+autei/mOayoeaciemYsuaKluWHveaVsO+8jOWIm+W7uuS4gOS4qlxyXG4gICAgaWYgKCF0aGlzLl9hdXRvQ29tcGxldGVEZWJvdW5jZU1hcC5oYXMoZmllbGRLZXkpKSB7XHJcbiAgICAgIGNvbnN0IGRlYm91bmNlZEZuID0gZGVib3VuY2UoKGV2dDogRXZlbnQpID0+IHtcclxuICAgICAgICAvLyDph43mlrDmn6Xmib7lr7nlupTnmoQgY29sdW1u77yM56Gu5L+d5L2/55So5pyA5paw55qE6YWN572uXHJcbiAgICAgICAgY29uc3QgY3VycmVudENvbHVtbiA9IHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5maW5kKFxyXG4gICAgICAgICAgKGNvbCkgPT4gKGNvbC5maWVsZFByb3BzPy5uYW1lIHx8IGNvbC5wcm9wKSA9PT0gZmllbGRLZXksXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoY3VycmVudENvbHVtbikge1xyXG4gICAgICAgICAgdGhpcy5leGVjdXRlQXV0b0NvbXBsZXRlRGF0YVNvdXJjZShldnQsIGN1cnJlbnRDb2x1bW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgMzAwKTsgLy8gMzAwbXMg6Ziy5oqW5bu26L+fXHJcbiAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURlYm91bmNlTWFwLnNldChmaWVsZEtleSwgZGVib3VuY2VkRm4pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOiwg+eUqOmYsuaKluWHveaVsFxyXG4gICAgY29uc3QgZGVib3VuY2VkRm4gPSB0aGlzLl9hdXRvQ29tcGxldGVEZWJvdW5jZU1hcC5nZXQoZmllbGRLZXkpO1xyXG4gICAgaWYgKGRlYm91bmNlZEZuKSB7XHJcbiAgICAgIGRlYm91bmNlZEZuKGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOiOt+WPliBhdXRvQ29tcGxldGUg55qE5pWw5o2u5rqQXHJcbiAgZ2V0QXV0b0NvbXBsZXRlRGF0YVNvdXJjZShjb2x1bW46IFByb1RhYmxlQ29sdW1uKTogYW55W10ge1xyXG4gICAgY29uc3QgZmllbGRLZXkgPSBjb2x1bW4uZmllbGRQcm9wcz8ubmFtZSB8fCBjb2x1bW4ucHJvcDtcclxuICAgIHJldHVybiB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gfHwgW107XHJcbiAgfVxyXG5cclxuICBnZXRGaWVsZFByb3BzKGNvbHVtbjogUHJvVGFibGVDb2x1bW4pOiBhbnkge1xyXG4gICAgcmV0dXJuIGNvbHVtbi5maWVsZFByb3BzO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W5oyH5a6a5ZCN56ew55qEbGFiZWzmqKHmnb9cclxuICBnZXRMYWJlbFRlbXBsYXRlKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcclxuICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gdGhpcy5jdXN0b21UZW1wbGF0ZXMuZ2V0KG5hbWUpIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5YgZm9ybS1pdGVtIOeahOWKqOaAgeexu+WQjVxyXG4gIGdldEZvcm1JdGVtQ2xhc3NOYW1lKGNvbHVtbjogUHJvVGFibGVDb2x1bW4pOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZmllbGROYW1lID0gdGhpcy5nZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcDtcclxuICAgIHJldHVybiBgcHJvLXRhYmxlLSR7ZmllbGROYW1lfS1mb3JtLWl0ZW1gO1xyXG4gIH1cclxufVxyXG4iLCI8YXBwLXBhZ2UtY29udGFpbmVyXHJcbiAgW3RpdGxlXT1cInRpdGxlXCJcclxuICBbc2hvd0hlYWRlcl09XCJzaG93U2VhcmNoQmFyXCJcclxuICBuZ0NsYXNzPVwicHJvLXRhYmxlLWNvbnRhaW5lclwiXHJcbj5cclxuICA8bmctdGVtcGxhdGUgI2hlYWRlcj5cclxuICAgIDxhcHAtdGFibGUtc2VhcmNoLWJhclxyXG4gICAgICAqbmdJZj1cInNob3dTZWFyY2hCYXJcIlxyXG4gICAgICBbbGFiZWxXaWR0aF09XCJsYWJlbFdpZHRoXCJcclxuICAgICAgW2xhYmVsQWxpZ25dPVwibGFiZWxBbGlnblwiXHJcbiAgICAgIFtmb3JtSXRlbVdpZHRoXT1cImZvcm1JdGVtV2lkdGhcIlxyXG4gICAgPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2xlZnRDb250ZW50PlxyXG4gICAgICAgIDxuei1mb3JtLWl0ZW1cclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgX3NlYXJjaEZpbGVkQ29sdW1uc1wiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRGb3JtSXRlbUNsYXNzTmFtZShjb2x1bW4pXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bnotZm9ybS1sYWJlbCAqbmdJZj1cIiFnZXRGaWVsZFByb3BzKGNvbHVtbikuaGlkZUxhYmVsXCIgbnpOb0NvbG9uPlxyXG4gICAgICAgICAgICA8IS0tIOajgOafpeaYr+WQpuacieiHquWumuS5iWxhYmVs5qih5p2/IC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgIGNvbHVtbi5jdXN0b21MYWJlbFJlbmRlciAmJlxyXG4gICAgICAgICAgICAgICAgICBnZXRMYWJlbFRlbXBsYXRlKGNvbHVtbi5jdXN0b21MYWJlbFJlbmRlcik7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGRlZmF1bHRMYWJlbFxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRMYWJlbFRlbXBsYXRlKGNvbHVtbi5jdXN0b21MYWJlbFJlbmRlcilcIlxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcclxuICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBjb2x1bW4sXHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxyXG4gICAgICAgICAgICAgICAgICBmaWVsZFByb3BzOiBnZXRGaWVsZFByb3BzKGNvbHVtbilcclxuICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExhYmVsPlxyXG4gICAgICAgICAgICAgIHt7IGdldEZpZWxkUHJvcHMoY29sdW1uKS5sYWJlbCB8fCBjb2x1bW4udGl0bGUgfX1cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvbnotZm9ybS1sYWJlbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnaW5wdXQnXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIG56LWlucHV0XHJcbiAgICAgICAgICAgICAgW25hbWVdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikucGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiXHJcbiAgICAgICAgICAgICAgICBfc2VhcmNoUGFyYW1zW2dldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnaW5wdXRQbGF0ZSdcIj5cclxuICAgICAgICAgICAgPGFwcC1wbGF0ZS1pbnB1dFxyXG4gICAgICAgICAgICAgIFtuYW1lXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIlxyXG4gICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+PC9hcHAtcGxhdGUtaW5wdXQ+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnc2VsZWN0J1wiPlxyXG4gICAgICAgICAgICA8bnotc2VsZWN0XHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJcclxuICAgICAgICAgICAgICAgIF9zZWFyY2hQYXJhbXNbZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbbnpBbGxvd0NsZWFyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5hbGxvd0NsZWFyXCJcclxuICAgICAgICAgICAgICBbbnpQbGFjZUhvbGRlcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikucGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtuYW1lXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXCJcclxuICAgICAgICAgICAgICBbbnpPcHRpb25zXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5vcHRpb25zXCJcclxuICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvbnotc2VsZWN0PlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ3NlbGVjdE11bHRpcGxlJ1wiPlxyXG4gICAgICAgICAgICA8bnotc2VsZWN0XHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJcclxuICAgICAgICAgICAgICAgIF9zZWFyY2hQYXJhbXNbZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbbnpBbGxvd0NsZWFyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5hbGxvd0NsZWFyXCJcclxuICAgICAgICAgICAgICBbbnpQbGFjZUhvbGRlcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikucGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtuYW1lXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXCJcclxuICAgICAgICAgICAgICBbbnpPcHRpb25zXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5vcHRpb25zXCJcclxuICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIG56TW9kZT1cIm11bHRpcGxlXCJcclxuICAgICAgICAgICAgICBbbnpNYXhUYWdDb3VudF09XCIyXCJcclxuICAgICAgICAgICAgICBbbnpNYXhUYWdQbGFjZWhvbGRlcl09XCJuek1heFRhZ1BsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICBbbnpDdXN0b21UZW1wbGF0ZV09XCJkZWZhdWx0VGVtcGxhdGVcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNuek1heFRhZ1BsYWNlaG9sZGVyPlxyXG4gICAgICAgICAgICAgICAgK1xyXG4gICAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICAgICAgICA/Lmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRlbXBsYXRlIGxldC1zZWxlY3RlZD5cclxuICAgICAgICAgICAgICAgIHt7IHNlbGVjdGVkLm56TGFiZWwubGVuZ3RoID4gNCA/IHNlbGVjdGVkLm56TGFiZWwuc3Vic3RyaW5nKDAsIDQpICsgJy4uLicgOiBzZWxlY3RlZC5uekxhYmVsIH19XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9uei1zZWxlY3Q+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnZGF0ZSdcIj5cclxuICAgICAgICAgICAgPG56LWRhdGUtcGlja2VyXHJcbiAgICAgICAgICAgICAgW256U2hvd1RpbWVdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLnNob3dUaW1lXCJcclxuICAgICAgICAgICAgICBbbnpGb3JtYXRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmZvcm1hdFwiXHJcbiAgICAgICAgICAgICAgW256UGxhY2VIb2xkZXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLnBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICBbbnpBbGxvd0NsZWFyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5hbGxvd0NsZWFyXCJcclxuICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiXHJcbiAgICAgICAgICAgICAgICBfc2VhcmNoUGFyYW1zW2dldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW256TW9kZV09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikubW9kZVwiXHJcbiAgICAgICAgICAgID48L256LWRhdGUtcGlja2VyPlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ2NoZWNrYm94J1wiPlxyXG4gICAgICAgICAgICA8bnotY2hlY2tib3gtZ3JvdXBcclxuICAgICAgICAgICAgICBbY2xhc3NdPVwiXHJcbiAgICAgICAgICAgICAgICBnZXRGaWVsZFByb3BzKGNvbHVtbikubm9TdHlsZVxyXG4gICAgICAgICAgICAgICAgICA/ICdwcm8tdGFibGUtY2hlY2tib3hncm91cC1ub3N0eWxlJ1xyXG4gICAgICAgICAgICAgICAgICA6ICcnXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5vcHRpb25zXCJcclxuICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxyXG4gICAgICAgICAgICAgICAgaGFuZGxlRmllbGRDaGVja0JveENoYW5nZShcclxuICAgICAgICAgICAgICAgICAgJGV2ZW50LFxyXG4gICAgICAgICAgICAgICAgICBnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID48L256LWNoZWNrYm94LWdyb3VwPlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ2F1dG9Db21wbGV0ZSdcIj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgbnotaW5wdXRcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIlxyXG4gICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbik/Lm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwiaGFuZGxlQXV0b0NvbXBsZXRlSW5wdXQoJGV2ZW50LCBjb2x1bW4pXCJcclxuICAgICAgICAgICAgICBbbnpBdXRvY29tcGxldGVdPVwiYXV0b1wiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKT8uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbik/LnBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPG56LWF1dG9jb21wbGV0ZVxyXG4gICAgICAgICAgICAgIFtuekJhY2tmaWxsXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5iYWNrRmlsbFwiXHJcbiAgICAgICAgICAgICAgW256RGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uXT1cIlxyXG4gICAgICAgICAgICAgICAgZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvblxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW256V2lkdGhdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLndpZHRoXCJcclxuICAgICAgICAgICAgICAjYXV0b1xyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG56LWF1dG8tb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGdldEF1dG9Db21wbGV0ZURhdGFTb3VyY2UoY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICBbbnpWYWx1ZV09XCJcclxuICAgICAgICAgICAgICAgICAgZ2V0RmllbGRQcm9wcyhjb2x1bW4pLnJldHVybkZ1bGxEYXRhID8gb3B0aW9uIDogb3B0aW9uLnZhbHVlXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgW256TGFiZWxdPVwib3B0aW9uLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgIFtuekRpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3sgb3B0aW9uLmxhYmVsIH19XHJcbiAgICAgICAgICAgICAgPC9uei1hdXRvLW9wdGlvbj5cclxuICAgICAgICAgICAgPC9uei1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnY3VzdG9tJ1wiPlxyXG4gICAgICAgICAgICA8YXBwLWR5bmFtaWMtc2VhcmNoLWZpZWxkXHJcbiAgICAgICAgICAgICAgW2NvbXBvbmVudF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICBbdmFsdWVdPVwiX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cIlxyXG4gICAgICAgICAgICAgIFtwcm9wc109XCJnZXRGaWVsZFByb3BzKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJcclxuICAgICAgICAgICAgICAgIHNldEZpZWxkVmFsdWUoZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3AsICRldmVudClcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+PC9hcHAtZHluYW1pYy1zZWFyY2gtZmllbGQ+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnaW5wdXROdW1iZXInXCI+XHJcbiAgICAgICAgICAgIDxuei1pbnB1dC1udW1iZXJcclxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiJzEwMCUnXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIlxyXG4gICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtuelBsYWNlSG9sZGVyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5wbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICBbbnpGb3JtYXR0ZXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmZvcm1hdHRlclBlcmNlbnRcIlxyXG4gICAgICAgICAgICAgIFtuelBhcnNlcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikucGFyc2VyUGVyY2VudFwiXHJcbiAgICAgICAgICAgID48L256LWlucHV0LW51bWJlcj5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgIDwvbnotZm9ybS1pdGVtPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2FjdGlvblRleHRCdG4+XHJcbiAgICAgICAgPG56LXNwYWNlIFtuelNpemVdPVwiNFwiPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIG56U3BhY2VJdGVtICpuZ0lmPVwic2hvd1NlYXJjaEJ0blwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG56LWJ1dHRvbiBuelR5cGU9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImhhbmRsZVNlYXJjaCgpXCI+XHJcbiAgICAgICAgICAgICAge3sgY29uZmlybUJ0blRleHQgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIG56U3BhY2VJdGVtICpuZ0lmPVwic2hvd0NsZWFyQnRuXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbnotYnV0dG9uIChjbGljayk9XCJoYW5kbGVSZXNldEZvcm0oKVwiPlxyXG4gICAgICAgICAgICAgIHt7IGNsZWFyQnRuVGV4dCB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9uei1zcGFjZT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlICNhY3Rpb25JbWdCdG4+XHJcbiAgICAgICAgPG56LXNwYWNlPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImltZ0FjdGlvbkJhclRwbFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIG56U3BhY2VJdGVtIGNsYXNzPVwic2V0dGluZy1zcGFjZS1pdGVtXCIgKm5nSWY9XCJzaG93Q29sdW1uU2V0dGluZ1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBuei10b29sdGlwIG56VG9vbHRpcFRpdGxlPVwi6K6+572u5a2X5q61XCI+XHJcbiAgICAgICAgICAgICAgPGFwcC1jb2xtdW5zLXNldHRpbmdcclxuICAgICAgICAgICAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgICAgW3NlbGVjdGVkQ29sdW1uc109XCJfc2VydmVyQ29sdW1uc1wiXHJcbiAgICAgICAgICAgICAgICBbdGFibGVOYW1lXT1cInRhYmxlTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAoYWZ0ZXJDb25maXJtKT1cImhhbmRsZUNvbHVtbnNTZXR0aW5nQ29uZmlybSgpXCJcclxuICAgICAgICAgICAgICA+PC9hcHAtY29sbXVucy1zZXR0aW5nPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbnotc3BhY2U+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2FwcC10YWJsZS1zZWFyY2gtYmFyPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSAjYm9keT5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93QWN0aW9uQmFyXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFjdGlvbkJhclRwbFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1c3RvbVRhYmxlUmVuZGVyXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UYWJsZVJlbmRlclwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bnotdGFibGVcclxuICAgICAgKm5nSWY9XCIhY3VzdG9tVGFibGVSZW5kZXIgJiYgX3Nob3dUYWJsZVwiXHJcbiAgICAgICNkeW5hbWljVGFibGVcclxuICAgICAgbnpTaXplPVwic21hbGxcIlxyXG4gICAgICBuelNob3dTaXplQ2hhbmdlclxyXG4gICAgICBbbnpCb3JkZXJlZF09XCJib3JkZXJlZFwiXHJcbiAgICAgIFtuek91dGVyQm9yZGVyZWRdPVwib3V0ZXJCb3JkZXJlZFwiXHJcbiAgICAgIFtuekRhdGFdPVwiZGF0YVNvdXJjZVwiXHJcbiAgICAgIFtuelBhZ2VJbmRleF09XCJfcGFnZUluZm8ucGFnZUluZGV4XCJcclxuICAgICAgW256UGFnZVNpemVdPVwiX3BhZ2VJbmZvLnBhZ2VTaXplXCJcclxuICAgICAgW256VG90YWxdPVwiX3BhZ2VJbmZvLnRvdGFsXCJcclxuICAgICAgW256UGFnZVNpemVPcHRpb25zXT1cIl9wYWdlSW5mby5wYWdlU2l6ZU9wdGlvbnNcIlxyXG4gICAgICBbbnpTaG93UGFnaW5hdGlvbl09XCJzaG93UGFnaW5hdGlvblwiXHJcbiAgICAgIFtuelNob3dUb3RhbF09XCJ0b3RhbFRlbXBsYXRlXCJcclxuICAgICAgW256TG9hZGluZ109XCJfbG9hZGluZ1wiXHJcbiAgICAgIFtuekZyb250UGFnaW5hdGlvbl09XCJmcm9udFBhZ2luYXRpb25cIlxyXG4gICAgICBbbnpTY3JvbGxdPVwic2Nyb2xsXCJcclxuICAgICAgKG56UGFnZUluZGV4Q2hhbmdlKT1cImhhbmRsZVBhZ2VJbmRleENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgKG56UGFnZVNpemVDaGFuZ2UpPVwiaGFuZGxlUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICA+XHJcbiAgICAgIDx0aGVhZD5cclxuICAgICAgICA8dHI+XHJcbiAgICAgICAgICA8IS0tIOWkjemAieahhuWIl++8iOW9kyBzaG93Q2hlY2tib3g9dHJ1ZSDml7bmmL7npLrvvIkgLS0+XHJcbiAgICAgICAgICA8dGhcclxuICAgICAgICAgICAgKm5nSWY9XCJzaG93Q2hlY2tib3hcIlxyXG4gICAgICAgICAgICBbbnpXaWR0aF09XCInNTBweCdcIlxyXG4gICAgICAgICAgICBbbnpBbGlnbl09XCInY2VudGVyJ1wiXHJcbiAgICAgICAgICAgIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyXCJcclxuICAgICAgICAgICAgWyhuekNoZWNrZWQpXT1cIl9jaGVja2VkQWxsXCJcclxuICAgICAgICAgICAgW256SW5kZXRlcm1pbmF0ZV09XCJfaW5kZXRlcm1pbmF0ZVwiXHJcbiAgICAgICAgICAgIChuekNoZWNrZWRDaGFuZ2UpPVwidG9nZ2xlQ2hlY2tBbGwoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgPjwvdGg+XHJcbiAgICAgICAgICA8dGhcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBfY29sdW1uc1wiXHJcbiAgICAgICAgICAgIFtueldpZHRoXT1cImNvbHVtbi53aWR0aFwiXHJcbiAgICAgICAgICAgIFtuekFsaWduXT1cImNvbHVtbi5hbGlnblwiXHJcbiAgICAgICAgICAgIFtuekxlZnRdPVwiY29sdW1uLmZpeGVkTGVmdFwiXHJcbiAgICAgICAgICAgIFtuelJpZ2h0XT1cImNvbHVtbi5maXhlZFJpZ2h0XCJcclxuICAgICAgICAgICAgW256U2hvd1NvcnRdPVwiISFjb2x1bW4uc29ydGVyXCJcclxuICAgICAgICAgICAgW256U29ydE9yZGVyXT1cImdldFNvcnRPcmRlcihjb2x1bW4ucHJvcClcIlxyXG4gICAgICAgICAgICAobnpTb3J0T3JkZXJDaGFuZ2UpPVwib25Tb3J0Q2hhbmdlKGNvbHVtbi5wcm9wLCAkZXZlbnQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgY29sdW1uLnRpdGxlIH19XHJcbiAgICAgICAgICA8L3RoPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvdGhlYWQ+XHJcblxyXG4gICAgICA8dGJvZHk+XHJcbiAgICAgICAgPHRyXHJcbiAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF0YTsgbGV0IGkgPSBpbmRleDsgb2Y6IGR5bmFtaWNUYWJsZS5kYXRhXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgJ2FudC10YWJsZS1jdXN0b20tcm93LXNlbGVjdGVkJzogISFnZXRUYWJsZVJvd0NoZWNrZWQoZGF0YSksXHJcbiAgICAgICAgICAgICdhbnQtdGFibGUtY3VzdG9tLXJvdy1ldmVuJzogaSAlIDIgPT09IDAsXHJcbiAgICAgICAgICAgICdhbnQtdGFibGUtY3VzdG9tLXJvdy1vZGQnOiBpICUgMiAhPT0gMFxyXG4gICAgICAgICAgfVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlVGFibGVSb3dDbGljayhkYXRhKVwiXHJcbiAgICAgICAgICAoZGJsY2xpY2spPVwiaGFuZGxlVGFibGVSb3dEYkNsaWNrKGRhdGEpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8IS0tIOWkjemAieahhuWIl++8iOW9kyBzaG93Q2hlY2tib3g9dHJ1ZSDml7bmmL7npLrvvIkgLS0+XHJcbiAgICAgICAgICA8dGRcclxuICAgICAgICAgICAgKm5nSWY9XCJzaG93Q2hlY2tib3hcIlxyXG4gICAgICAgICAgICBbbnpBbGlnbl09XCInY2VudGVyJ1wiXHJcbiAgICAgICAgICAgIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyB3aWR0aDogNTBweFwiXHJcbiAgICAgICAgICAgIFsobnpDaGVja2VkKV09XCJkYXRhLmNoZWNrZWRcIlxyXG4gICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJpc1Jvd0Rpc2FibGVkKGRhdGEpXCJcclxuICAgICAgICAgICAgKG56Q2hlY2tlZENoYW5nZSk9XCJoYW5kbGVSb3dDaGVja2VkQ2hhbmdlKGRhdGEsICRldmVudClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgID48L3RkPlxyXG4gICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgX2NvbHVtbnNcIlxyXG4gICAgICAgICAgICBbbnpMZWZ0XT1cImNvbHVtbi5maXhlZExlZnRcIlxyXG4gICAgICAgICAgICBbbnpSaWdodF09XCJjb2x1bW4uZml4ZWRSaWdodFwiXHJcbiAgICAgICAgICAgIFtuekFsaWduXT1cImNvbHVtbi5hbGlnblwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAncHJvLW5vd3JhcCc6IHRydWVcclxuICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwhLS0g5qOA5p+l5piv5ZCm5pyJ6Ieq5a6a5LmJ5qih5p2/IC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgIGNvbHVtbi5jdXN0b21SZW5kZXIgJiYgZ2V0VGVtcGxhdGUoY29sdW1uLmN1c3RvbVJlbmRlcik7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGVtcGxhdGVcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xyXG4gICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxyXG4gICAgICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICAgICAgcGFnZUluZm86IF9wYWdlSW5mb1xyXG4gICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPCEtLSDpu5jorqTmuLLmn5PpgLvovpEgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdJZj1cIiFjb2x1bW4uY3VzdG9tUmVuZGVyIHx8ICFnZXRUZW1wbGF0ZShjb2x1bW4uY3VzdG9tUmVuZGVyKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLmVsbGlwc2lzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvLWVsbGlwc2lzXCJcclxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImRhdGFbY29sdW1uLnByb3BdXCJcclxuICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnY2FsYygnICsgY29sdW1uLndpZHRoICsgJyAtIDI1cHgpJ1xyXG4gICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAge3sgZGF0YVtjb2x1bW4ucHJvcF0gfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sdW1uLmVsbGlwc2lzXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBkYXRhW2NvbHVtbi5wcm9wXSB9fVxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgICA8dHIgKm5nSWY9XCJzdW1tYXJ5RGF0YSAmJiBfcGFnZUluZm8udG90YWwgPiAwXCI+XHJcbiAgICAgICAgICA8IS0tIOaxh+aAu+ihjOeahOWkjemAieahhuWIl++8iOW9kyBzaG93Q2hlY2tib3g9dHJ1ZSDml7bmmL7npLrvvIzkvYbkuLrnqbrvvIkgLS0+XHJcbiAgICAgICAgICA8dGRcclxuICAgICAgICAgICAgKm5nSWY9XCJzaG93Q2hlY2tib3hcIlxyXG4gICAgICAgICAgICBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkOyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZThlOGU4XCJcclxuICAgICAgICAgID48L3RkPlxyXG4gICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW47IGxldCBpID0gaW5kZXg7IG9mOiBfY29sdW1uc1wiXHJcbiAgICAgICAgICAgIFtuekxlZnRdPVwiY29sdW1uLmZpeGVkTGVmdFwiXHJcbiAgICAgICAgICAgIFtuelJpZ2h0XT1cImNvbHVtbi5maXhlZFJpZ2h0XCJcclxuICAgICAgICAgICAgc3R5bGU9XCJmb250LXdlaWdodDogYm9sZDsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2U4ZThlOFwiXHJcbiAgICAgICAgICAgIFtuekFsaWduXT1cImNvbHVtbi5hbGlnblwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaSA9PT0gMFwiPuaAu+iuoTwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImkgIT09IDAgJiYgY29sdW1uLnN1bW1hcnlcIj5cclxuICAgICAgICAgICAgICB7e1xyXG4gICAgICAgICAgICAgICAgY29sdW1uLnN1bW1hcnk/LmZvcm1hdFxyXG4gICAgICAgICAgICAgICAgICA/IGNvbHVtbi5zdW1tYXJ5Py5mb3JtYXQoXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5RGF0YVtjb2x1bW4uc3VtbWFyeT8ubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgIDogc3VtbWFyeURhdGFbY29sdW1uLnN1bW1hcnk/Lm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjdG90YWxUZW1wbGF0ZSBsZXQtdG90YWxcclxuICAgICAgICA+5YWxIHt7IF9wYWdlSW5mby50b3RhbCB9fSDmnaHorrDlvZU8L25nLXRlbXBsYXRlXHJcbiAgICAgID5cclxuICAgIDwvbnotdGFibGU+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuPC9hcHAtcGFnZS1jb250YWluZXI+XHJcbiJdfQ==
1081
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byby10YWJsZS9zcmMvbGliL3Byby10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm8tdGFibGUvc3JjL2xpYi9wcm8tdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFXLE1BQU0sV0FBVyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVdoRixPQUFPLEVBQUUsdUJBQXVCLEVBQStCLE1BQU0sVUFBVSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU9uRCxNQUFNLE9BQU8saUJBQWlCO0lBNEpsQjtJQTNKRCxhQUFhLEdBQVksSUFBSSxDQUFDO0lBRTlCLFlBQVksR0FBWSxJQUFJLENBQUM7SUFFN0IsS0FBSyxHQUFrQixJQUFJLENBQUM7SUFFNUIsU0FBUyxHQUFXLEVBQUUsQ0FBQztJQUV2QixRQUFRLEdBQVksS0FBSyxDQUFDO0lBRTFCLE9BQU8sR0FBcUIsRUFBRSxDQUFDO0lBRS9CLGFBQWEsR0FBWSxJQUFJLENBQUM7SUFFOUIsYUFBYSxHQUFZLElBQUksQ0FBQztJQUU5QixjQUFjLEdBQVcsSUFBSSxDQUFDO0lBRTlCLFlBQVksR0FBVyxJQUFJLENBQUM7SUFFNUIsVUFBVSxHQUFXLE1BQU0sQ0FBQztJ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QkFBaUI7c0JBQXpCLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFFRyxZQUFZO3NCQUFyQixNQUFNO2dCQUVHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRUcsdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUVvQixZQUFZO3NCQUF0QyxZQUFZO3VCQUFDLFdBQVc7Z0JBRUssZUFBZTtzQkFBNUMsWUFBWTt1QkFBQyxjQUFjO2dCQUVFLFlBQVk7c0JBQXpDLGVBQWU7dUJBQUMsV0FBVztnQkErRDVCLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlckNvbnRlbnRJbml0LFxyXG4gIENvbXBvbmVudCxcclxuICBDb250ZW50Q2hpbGQsXHJcbiAgQ29udGVudENoaWxkcmVuLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBPcHRpb25hbCxcclxuICBPdXRwdXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IGNsb25lRGVlcCwgaGFzSW4sIGlzTmlsLCBkZWJvdW5jZSwgaXNFcXVhbCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcclxuaW1wb3J0IHsgUFJPX1RBQkxFX0RFRkFVTFRfQ09MVU1OLCBQUk9fVEFCTEVfREVGQVVMVF9QUk9QUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQge1xyXG4gIEF1dG9Db21wbGV0ZUZpZWxkUHJvcHMsXHJcbiAgQ2hlY2tib3hGaWVsZFByb3BzLFxyXG4gIE9wdGlvbnNUeXBlLFxyXG4gIFByb1RhYmxlQ29sdW1uLFxyXG4gIFByb1RhYmxlUGFnZUluZm8sXHJcbiAgUHJvVGFibGVSZXF1ZXN0UmVzdWx0LFxyXG4gIFByb1RhYmxlVmFsdWVzQ2hhbmdlLFxyXG4gIFNlbGVjdEZpZWxkUHJvcHMsXHJcbn0gZnJvbSBcIi4vdHlwZVwiO1xyXG5pbXBvcnQgeyBQUk9fVEFCTEVfQ09MVU1OX1JFTU9URSwgUHJvVGFibGVSZW1vdGVDb2x1bW5TZXJ2aWNlIH0gZnJvbSBcIi4vdG9rZW5zXCI7XHJcbmltcG9ydCB7IGlzT2JzZXJ2YWJsZSwgbGFzdFZhbHVlRnJvbSB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtcHJvLXRhYmxlXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9wcm8tdGFibGUuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybHM6IFtcIi4vcHJvLXRhYmxlLmNvbXBvbmVudC5sZXNzXCJdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQge1xyXG4gIEBJbnB1dCgpIHNob3dTZWFyY2hCdG46IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBzaG93Q2xlYXJCdG46IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpIHRhYmxlTmFtZTogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgQElucHV0KCkgbXVsdGlSb3c6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBzaG93U2VhcmNoQmFyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgc2hvd0FjdGlvbkJhcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIGNvbmZpcm1CdG5UZXh0OiBzdHJpbmcgPSBcIuafpeivolwiO1xyXG5cclxuICBASW5wdXQoKSBjbGVhckJ0blRleHQ6IHN0cmluZyA9IFwi5riF56m6XCI7XHJcblxyXG4gIEBJbnB1dCgpIGxhYmVsV2lkdGg6IHN0cmluZyA9IFwiOTBweFwiO1xyXG5cclxuICBASW5wdXQoKSBsYWJlbEFsaWduOiBzdHJpbmcgPSBcInJpZ2h0XCI7XHJcblxyXG4gIEBJbnB1dCgpIGZvcm1JdGVtV2lkdGg6IHN0cmluZyA9IFwiMzMwcHhcIjtcclxuXHJcbiAgQElucHV0KCkgZGF0YVNvdXJjZTogYW55W10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkgYm9yZGVyZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBvdXRlckJvcmRlcmVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgc2hvd1BhZ2luYXRpb246IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBmcm9udFBhZ2luYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgc2Nyb2xsOiB7IHg/OiBzdHJpbmcgfCBudW1iZXI7IHk/OiBzdHJpbmcgfCBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBASW5wdXQoKSByZXF1ZXN0OiAocGFyYW1zOiBhbnkpID0+IFByb21pc2U8UHJvVGFibGVSZXF1ZXN0UmVzdWx0PjtcclxuXHJcbiAgQElucHV0KCkgc3VtbWFyeURhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLy8g5o6S5bqP5qih5byP77yabG9jYWwg5pys5Zyw5o6S5bqP77ybc2VydmVyIOWcqOe6v+aOkuW6j++8iOaPkOS6pOe7meaOpeWPo++8iVxyXG4gIEBJbnB1dCgpIHNvcnRNb2RlOiBcImxvY2FsXCIgfCBcInNlcnZlclwiID0gXCJsb2NhbFwiO1xyXG5cclxuICBASW5wdXQoKSBzaG93Q29sdW1uU2V0dGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyDmmK/lkKblvIDlkK/lpJrliJfmjpLluo/vvIjpu5jorqTljZXliJfvvIlcclxuICBASW5wdXQoKSBtdWx0aXBsZVNvcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgc2hvd0NoZWNrYm94OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIOWIpOaWreihjOaYr+WQpuemgeeUqOeahOWHveaVsFxyXG4gIEBJbnB1dCgpIHJvd0Rpc2FibGVkOiAoZGF0YTogYW55KSA9PiBib29sZWFuID0gKCkgPT4gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHJlcmVuZGVyT25SZXNpemU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvLyDmmK/lkKboh6rliqjop6blj5Hor7fmsYJcclxuICBASW5wdXQoKSBhdXRvVHJpZ2dlclJlcXVlc3Q6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBjdXN0b21UYWJsZVJlbmRlcj86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIEBPdXRwdXQoKSBvblJvd0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBvblJvd0RiQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIG9uVmFsdWVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQcm9UYWJsZVZhbHVlc0NoYW5nZT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIG9uUmVzZXRGb3JtQmVmb3JlUmVsb2FkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoXCJhY3Rpb25CYXJcIikgYWN0aW9uQmFyVHBsITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChcIkltZ0FjdGlvbkJhclwiKSBpbWdBY3Rpb25CYXJUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlUmVmKSBhbGxUZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XHJcblxyXG4gIHByaXZhdGUgX3NhdmVkU2VhcmNoUGFyYW1zOiBhbnkgPSB7fTtcclxuXHJcbiAgLy8g5a2Y5YKo5omA5pyJ6Ieq5a6a5LmJ5qih5p2/55qE5byV55SoXHJcbiAgcHJpdmF0ZSBjdXN0b21UZW1wbGF0ZXMgPSBuZXcgTWFwPHN0cmluZywgVGVtcGxhdGVSZWY8YW55Pj4oKTtcclxuXHJcbiAgLy8g6K6w5b2V5ZCE5YiX5o6S5bqP54q25oCB77yaJ2FzY2VuZCcgfCAnZGVzY2VuZCcgfCBudWxsXHJcblxyXG4gIHByaXZhdGUgX3NvcnRNYXA6IFJlY29yZDxzdHJpbmcsIFwiYXNjZW5kXCIgfCBcImRlc2NlbmRcIiB8IG51bGw+ID0ge307XHJcblxyXG4gIC8vIOiusOW9leWkmuWIl+aOkuW6j+eahOS8mOWFiOe6p++8iOWQjuiuvue9rueahOS8mOWFiO+8iVxyXG4gIHByaXZhdGUgX3NvcnRQcmlvcml0eTogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgLy8g5a2Y5YKo5q+P5LiqIGF1dG9Db21wbGV0ZSDlrZfmrrXnmoTpmLLmipblh73mlbBcclxuICBwcml2YXRlIF9hdXRvQ29tcGxldGVEZWJvdW5jZU1hcDogTWFwPHN0cmluZywgKGV2ZW50OiBFdmVudCkgPT4gdm9pZD4gPVxyXG4gICAgbmV3IE1hcCgpO1xyXG5cclxuXHJcbiAgX2NvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgLy8g562b6YCJ6KGo5Y2V5pWw5o2u5a2Y5YKoXHJcbiAgX3NlYXJjaFBhcmFtczogYW55ID0ge307XHJcblxyXG4gIC8vIOetm+mAieihqOWNlWxpc3TmuLLmn5PmlbDmja5cclxuICBfc2VhcmNoRmlsZWRDb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcblxyXG4gIF9wYWdlSW5mbzogUHJvVGFibGVQYWdlSW5mbyA9IHtcclxuICAgIHBhZ2VJbmRleDogMSxcclxuICAgIHBhZ2VTaXplOiAxNSxcclxuICAgIHRvdGFsOiAxMDAsXHJcbiAgICBwYWdlU2l6ZU9wdGlvbnM6IFsxMCwgMTUsIDIwLCA1MCwgMTAwLCA1MDAsIDEwMDBdLFxyXG4gIH07XHJcblxyXG4gIF9sb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIF9zZWxlY3RlZFRhYmxlUm93OiBhbnkgPSBudWxsO1xyXG5cclxuICAvLyDpgInkuK3nmoTooYzmlbDmja7vvIjnlKjkuo7lpI3pgInmoYbpgInmi6nvvIktIOS/neeVmeeUqOS6juWFvOWuueaAp1xyXG4gIF9zZWxlY3RlZFJvd3M6IGFueVtdID0gW107XHJcblxyXG4gIC8vIOWFqOmAieeKtuaAgVxyXG4gIF9jaGVja2VkQWxsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIOWNiumAieeKtuaAge+8iOmDqOWIhumAieS4re+8iVxyXG4gIF9pbmRldGVybWluYXRlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIOi/nOeoi2NvbHVtbnNcclxuICBfc2VydmVyQ29sdW1uczogUHJvVGFibGVDb2x1bW5bXSA9IFtdO1xyXG5cclxuICAvLyDlrZjlgqggYXV0b0NvbXBsZXRlIOWtl+auteeahOaVsOaNrua6kFxyXG4gIF9hdXRvQ29tcGxldGVEYXRhU291cmNlczogUmVjb3JkPHN0cmluZywgYW55W10+ID0ge307XHJcblxyXG4gIC8vIOaOp+WItuihqOagvOaYvuekuueKtuaAge+8jOeUqOS6jumHjeaWsOaMgui9vVxyXG4gIF9zaG93VGFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvLyDliqjmgIHliJfliqDovb3lrozmiJDmoIflv5fvvIzpu5jorqQgdHJ1Ze+8iOaXoOWKqOaAgeWIl+aXtuebtOaOpeaYvuekuu+8iVxyXG4gIF9jb2x1bW5zUmVhZHk6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvLyDpmLLmipblrprml7blmajvvIznlKjkuo7nqpflj6PlpKflsI/osIPmlbRcclxuICBwcml2YXRlIHJlc2l6ZURlYm91bmNlOiBhbnk7XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6cmVzaXplXCIpXHJcbiAgb25XaW5kb3dSZXNpemUoKSB7XHJcbiAgICBpZiAoIXRoaXMucmVyZW5kZXJPblJlc2l6ZSkgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLnJlc2l6ZURlYm91bmNlKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZURlYm91bmNlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlc2l6ZURlYm91bmNlID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIC8vIOmAmui/hyBuZ0lmIOmHjeaWsOaMgui9veihqOagvFxyXG4gICAgICB0aGlzLl9zaG93VGFibGUgPSBmYWxzZTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fc2hvd1RhYmxlID0gdHJ1ZTtcclxuICAgICAgfSwgMCk7XHJcbiAgICB9LCAxNTApO1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBPcHRpb25hbCgpXHJcbiAgICBASW5qZWN0KFBST19UQUJMRV9DT0xVTU5fUkVNT1RFKVxyXG4gICAgcHJpdmF0ZSBjb2x1bW5SZW1vdGU6IFByb1RhYmxlUmVtb3RlQ29sdW1uU2VydmljZSB8IG51bGwsXHJcbiAgKSB7fVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGZldGNoUmVtb3RlQ29sdW1ucygpIHtcclxuICAgIGlmICghdGhpcy5jb2x1bW5SZW1vdGU/LmdldENvbCB8fCAhdGhpcy50YWJsZU5hbWUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNvbHVtblJlbW90ZS5nZXRDb2wodGhpcy50YWJsZU5hbWUsIHRoaXMubXVsdGlSb3cpO1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHBlcnNpc3RSZW1vdGVDb2x1bW5zKGNvbHVtbnM6IGFueVtdKSB7XHJcbiAgICBpZiAoIXRoaXMuY29sdW1uUmVtb3RlPy5zZXRDb2wgfHwgIXRoaXMudGFibGVOYW1lKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb2x1bW5SZW1vdGUuc2V0Q29sKFxyXG4gICAgICAgIHRoaXMudGFibGVOYW1lLFxyXG4gICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgdGhpcy5tdWx0aVJvdyxcclxuICAgICAgKTtcclxuICAgICAgaWYgKHJlc3VsdCAmJiBpc09ic2VydmFibGUocmVzdWx0KSkge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCBsYXN0VmFsdWVGcm9tKHJlc3VsdCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7ICAgXHJcbiAgICBjb25zb2xlLmxvZygnYWFhJyk7XHJcbiAgICB0aGlzLl9zZWFyY2hQYXJhbXMgPSB7fTtcclxuICAgIHRoaXMuZm9ybWF0ZUlubmVyQ29sdW1ucyh0aGlzLmNvbHVtbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5zZXRTZWFyY2hQYXJhbXModGhpcy5jb2x1bW5zKTtcclxuXHJcbiAgICAvLyDkvb/nlKggUHJveHkg5YyF6KOFIF9zZWFyY2hQYXJhbXPvvIzmi6bmiKrooajljZXpobnlgLzlj5jljJblubblkJHlpJblj5Hlh7rkuovku7ZcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtcyA9IHRoaXMuY3JlYXRlU2VhcmNoUGFyYW1zUHJveHkodGhpcy5fc2VhcmNoUGFyYW1zKTtcclxuICAgIGlmICh0aGlzLmF1dG9UcmlnZ2VyUmVxdWVzdCkge1xyXG4gICAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50YWJsZU5hbWUgJiYgdGhpcy5jb2x1bW5SZW1vdGUpIHtcclxuICAgICAgdGhpcy5fY29sdW1uc1JlYWR5ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLnF1ZXJ5RHluYW1pY0NvbHVtbnMoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuICAgIC8vIOiHquWKqOazqOWGjOaJgOacieiHquWumuS5ieaooeadv1xyXG4gICAgLy8g5rOo5oSP77ya5q2k5pe25omA5pyJIENvbnRlbnRDaGlsZCDlkowgQ29udGVudENoaWxkcmVuIOmDveW3suWIneWni+WMluWujOaIkFxyXG4gICAgdGhpcy5hdXRvUmVnaXN0ZXJUZW1wbGF0ZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcXVlcnlEeW5hbWljQ29sdW1ucygpIHtcclxuICAgIGlmICghdGhpcy50YWJsZU5hbWUgfHwgIXRoaXMuY29sdW1uUmVtb3RlKSByZXR1cm47XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmZldGNoUmVtb3RlQ29sdW1ucygpO1xyXG4gICAgICBpZiAoIXJlcykgcmV0dXJuO1xyXG4gICAgICBpZiAocmVzLmNvZGUgPT09IDApIHtcclxuICAgICAgICBjb25zdCBfdGFiQ29sdW1uID0gcmVzLmRhdGEudGFiQ29sdW1uLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0uaGVhZGVyLFxyXG4gICAgICAgICAgICBwcm9wOiBpdGVtLmZpZWxkLFxyXG4gICAgICAgICAgICBzb3J0TmFtZTogaXRlbS5zb3J0TmFtZSxcclxuICAgICAgICAgICAgaGlkZUluVGFibGU6ICFpdGVtLmlzU2hvdyxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fc2VydmVyQ29sdW1ucyA9IF90YWJDb2x1bW4uZmlsdGVyKChjb2wpID0+XHJcbiAgICAgICAgICB0aGlzLmNvbHVtbnMuc29tZSgobG9jYWxDb2wpID0+IGxvY2FsQ29sLnByb3AgPT09IGNvbC5wcm9wKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVGFibGVDb2x1bW5zKHRoaXMuX3NlcnZlckNvbHVtbnMpO1xyXG4gICAgICB9IGVsc2UgaWYgKHJlcy5jb2RlID09PSAxMCkge1xyXG4gICAgICAgIC8vIOWmguaenOacquiuvue9ruaOpeWPo+i/lOWbnu+8jOmcgOimgem7mOiupOiwg+eUqOS4gOasoeS/ruaUueWHveaVsOWIneWni+WMluaVsOaNrlxyXG4gICAgICAgIGNvbnN0IGluaXRDb2x1bW5zID0gdGhpcy5jb2x1bW5zXHJcbiAgICAgICAgICAuZmlsdGVyKChjb2wpID0+ICFjb2wuYXV4aWxpYXJ5Q29sdW1uKVxyXG4gICAgICAgICAgLm1hcCgoY29sdW1uKSA9PiAoe1xyXG4gICAgICAgICAgICBmaWVsZDogY29sdW1uLnByb3AsXHJcbiAgICAgICAgICAgIGlzU2hvdzogdHJ1ZSxcclxuICAgICAgICAgICAgaGVhZGVyOiBjb2x1bW4udGl0bGUsXHJcbiAgICAgICAgICAgIHNvcnROYW1lOiBjb2x1bW4uc29ydE5hbWUgfHwgbnVsbCxcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgICBjb25zdCBpbml0UmVzID0gYXdhaXQgdGhpcy5wZXJzaXN0UmVtb3RlQ29sdW1ucyhpbml0Q29sdW1ucyk7XHJcbiAgICAgICAgaWYgKGluaXRSZXMpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMucXVlcnlEeW5hbWljQ29sdW1ucygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5fY29sdW1uc1JlYWR5ID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0ZUlubmVyQ29sdW1ucyhjb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdKSB7XHJcbiAgICB0aGlzLl9jb2x1bW5zID0gY29sdW1uc1xyXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5oaWRlSW5UYWJsZSlcclxuICAgICAgLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7IC4uLlBST19UQUJMRV9ERUZBVUxUX0NPTFVNTiwgLi4uaXRlbSB9IGFzIFByb1RhYmxlQ29sdW1uO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOiHquWKqOazqOWGjOaooeadv+eahOaWueazlVxyXG4gIHByaXZhdGUgYXV0b1JlZ2lzdGVyVGVtcGxhdGVzKCkge1xyXG4gICAgLy8g6I635Y+W5omA5pyJ5qih5p2/XHJcbiAgICBjb25zdCBhbGxUZW1wbGF0ZXNBcnJheSA9IHRoaXMuYWxsVGVtcGxhdGVzLnRvQXJyYXkoKTtcclxuXHJcbiAgICAvLyDojrflj5bmiYDmnInpnIDopoHoh6rlrprkuYnmqKHmnb/nmoTliJdcclxuICAgIGNvbnN0IGNvbHVtbnNXaXRoQ3VzdG9tUmVuZGVyID0gdGhpcy5fY29sdW1ucy5maWx0ZXIoXHJcbiAgICAgIChjb2wpID0+IGNvbC5jdXN0b21SZW5kZXIsXHJcbiAgICApO1xyXG5cclxuICAgIC8vIOiOt+WPluaJgOaciemcgOimgeiHquWumuS5iWxhYmVs5qih5p2/55qE5YiX77yI5L2/55So5Y6f5aeLY29sdW1uc++8jOehruS/nemhuuW6j+ato+ehru+8iVxyXG4gICAgY29uc3QgY29sdW1uc1dpdGhDdXN0b21MYWJlbCA9IHRoaXMuY29sdW1ucy5maWx0ZXIoXHJcbiAgICAgIChjb2wpID0+IGNvbC5jdXN0b21MYWJlbFJlbmRlcixcclxuICAgICk7XHJcblxyXG4gICAgLy8g6K6h566X6ZyA6KaB55qE5qih5p2/5oC75pWwXHJcbiAgICBjb25zdCBjdXN0b21SZW5kZXJDb3VudCA9IGNvbHVtbnNXaXRoQ3VzdG9tUmVuZGVyLmxlbmd0aDtcclxuICAgIGNvbnN0IHRvdGFsTmVlZGVkVGVtcGxhdGVzID1cclxuICAgICAgY3VzdG9tUmVuZGVyQ291bnQgKyBjb2x1bW5zV2l0aEN1c3RvbUxhYmVsLmxlbmd0aDtcclxuXHJcbiAgICAvLyDor4bliKvlubbmjpLpmaTnibnmrormqKHmnb/vvIhhY3Rpb25CYXIg5ZKMIGltZ0FjdGlvbkJhcu+8iVxyXG4gICAgY29uc3Qgc3BlY2lhbFRlbXBsYXRlSW5kaWNlcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xyXG5cclxuICAgIC8vIOWwneivleaJvuWIsCBhY3Rpb25CYXJUcGwg5ZyoIGFsbFRlbXBsYXRlc0FycmF5IOS4reeahOS9jee9rlxyXG4gICAgaWYgKHRoaXMuYWN0aW9uQmFyVHBsKSB7XHJcbiAgICAgIGNvbnN0IGFjdGlvbkJhckluZGV4ID0gdGhpcy5maW5kVGVtcGxhdGVJbmRleChcclxuICAgICAgICBhbGxUZW1wbGF0ZXNBcnJheSxcclxuICAgICAgICB0aGlzLmFjdGlvbkJhclRwbCxcclxuICAgICAgKTtcclxuICAgICAgaWYgKGFjdGlvbkJhckluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIHNwZWNpYWxUZW1wbGF0ZUluZGljZXMuYWRkKGFjdGlvbkJhckluZGV4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOWwneivleaJvuWIsCBpbWdBY3Rpb25CYXJUcGwg5ZyoIGFsbFRlbXBsYXRlc0FycmF5IOS4reeahOS9jee9rlxyXG4gICAgaWYgKHRoaXMuaW1nQWN0aW9uQmFyVHBsKSB7XHJcbiAgICAgIGNvbnN0IGltZ0FjdGlvbkJhckluZGV4ID0gdGhpcy5maW5kVGVtcGxhdGVJbmRleChcclxuICAgICAgICBhbGxUZW1wbGF0ZXNBcnJheSxcclxuICAgICAgICB0aGlzLmltZ0FjdGlvbkJhclRwbCxcclxuICAgICAgKTtcclxuICAgICAgaWYgKGltZ0FjdGlvbkJhckluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIHNwZWNpYWxUZW1wbGF0ZUluZGljZXMuYWRkKGltZ0FjdGlvbkJhckluZGV4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOWmguaenOaXoOazlemAmui/h+W8leeUqOaJvuWIsOeJueauiuaooeadv++8jOS9v+eUqOWkh+eUqOetlueVpVxyXG4gICAgLy8g5aSH55So562W55Wl77ya5YGH6K6+5pyA5ZCO55qE5qih5p2/5piv54m55q6K5qih5p2/XHJcbiAgICBjb25zdCBzcGVjaWFsVGVtcGxhdGVDb3VudCA9XHJcbiAgICAgICh0aGlzLmFjdGlvbkJhclRwbCA/IDEgOiAwKSArICh0aGlzLmltZ0FjdGlvbkJhclRwbCA/IDEgOiAwKTtcclxuICAgIGlmIChzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLnNpemUgPT09IDAgJiYgc3BlY2lhbFRlbXBsYXRlQ291bnQgPiAwKSB7XHJcbiAgICAgIGZvciAoXHJcbiAgICAgICAgbGV0IGkgPSBhbGxUZW1wbGF0ZXNBcnJheS5sZW5ndGggLSBzcGVjaWFsVGVtcGxhdGVDb3VudDtcclxuICAgICAgICBpIDwgYWxsVGVtcGxhdGVzQXJyYXkubGVuZ3RoO1xyXG4gICAgICAgIGkrK1xyXG4gICAgICApIHtcclxuICAgICAgICBzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmFkZChpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOaPkOWPluWIl+aooeadv++8iOaOkumZpOeJueauiuaooeadv++8iVxyXG4gICAgY29uc3QgY29sdW1uVGVtcGxhdGVzOiBUZW1wbGF0ZVJlZjxhbnk+W10gPSBbXTtcclxuICAgIGFsbFRlbXBsYXRlc0FycmF5LmZvckVhY2goKHRwbCwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKCFzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmhhcyhpbmRleCkpIHtcclxuICAgICAgICBjb2x1bW5UZW1wbGF0ZXMucHVzaCh0cGwpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDpqozor4HmqKHmnb/mlbDph49cclxuICAgIGlmIChjb2x1bW5UZW1wbGF0ZXMubGVuZ3RoICE9PSB0b3RhbE5lZWRlZFRlbXBsYXRlcykge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFByb1RhYmxlOiDmqKHmnb/mlbDph4/kuI3ljLnphY3vvIHpnIDopoEgJHt0b3RhbE5lZWRlZFRlbXBsYXRlc30g5Liq5YiX5qih5p2/77yM5a6e6ZmF5pyJICR7Y29sdW1uVGVtcGxhdGVzLmxlbmd0aH0g5Liq44CC6K+35qOA5p+lIGN1c3RvbVJlbmRlciDlkowgY3VzdG9tTGFiZWxSZW5kZXIg6YWN572u44CCYCxcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDms6jlhozoh6rlrprkuYnmuLLmn5PmqKHmnb9cclxuICAgIGNvbHVtbnNXaXRoQ3VzdG9tUmVuZGVyLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcclxuICAgICAgY29uc3QgdGVtcGxhdGVOYW1lID0gY29sdW1uLmN1c3RvbVJlbmRlciE7XHJcbiAgICAgIGlmIChpbmRleCA8IGNvbHVtblRlbXBsYXRlcy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlcy5zZXQodGVtcGxhdGVOYW1lLCBjb2x1bW5UZW1wbGF0ZXNbaW5kZXhdKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgYFByb1RhYmxlOiDmnKrmib7liLDmqKHmnb8gXCIke3RlbXBsYXRlTmFtZX1cIu+8jOe0ouW8lSAke2luZGV4fSDotoXlh7rojIPlm7RgLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIOazqOWGjOiHquWumuS5iWxhYmVs5qih5p2/77yI5LuOIGN1c3RvbVJlbmRlckNvdW50IOS5i+WQjuW8gOWni++8iVxyXG4gICAgY29sdW1uc1dpdGhDdXN0b21MYWJlbC5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRlbXBsYXRlTmFtZSA9IGNvbHVtbi5jdXN0b21MYWJlbFJlbmRlciE7XHJcbiAgICAgIGNvbnN0IHRlbXBsYXRlSW5kZXggPSBjdXN0b21SZW5kZXJDb3VudCArIGluZGV4O1xyXG4gICAgICBpZiAodGVtcGxhdGVJbmRleCA8IGNvbHVtblRlbXBsYXRlcy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlcy5zZXQodGVtcGxhdGVOYW1lLCBjb2x1bW5UZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICBgUHJvVGFibGU6IOacquaJvuWIsGxhYmVs5qih5p2/IFwiJHt0ZW1wbGF0ZU5hbWV9XCLvvIzntKLlvJUgJHt0ZW1wbGF0ZUluZGV4fSDotoXlh7rojIPlm7RgLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g5bCd6K+V5Zyo5pWw57uE5Lit5om+5Yiw5qih5p2/55qE57Si5byV77yI5L2/55So5aSa56eN5q+U6L6D5pa55byP77yJXHJcbiAgcHJpdmF0ZSBmaW5kVGVtcGxhdGVJbmRleChcclxuICAgIHRlbXBsYXRlczogVGVtcGxhdGVSZWY8YW55PltdLFxyXG4gICAgdGFyZ2V0OiBUZW1wbGF0ZVJlZjxhbnk+LFxyXG4gICk6IG51bWJlciB7XHJcbiAgICAvLyDmlrnms5Ux77ya5byV55So55u4562J5oCnXHJcbiAgICBsZXQgaW5kZXggPSB0ZW1wbGF0ZXMuaW5kZXhPZih0YXJnZXQpO1xyXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgcmV0dXJuIGluZGV4O1xyXG5cclxuICAgIC8vIOaWueazlTLvvJrpgJrov4cgZWxlbWVudFJlZiDmr5TovoNcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnRSZWYgPSAodGFyZ2V0IGFzIGFueSkuZWxlbWVudFJlZjtcclxuICAgICAgaWYgKHRhcmdldEVsZW1lbnRSZWYpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbXBsYXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgdHBsRWxlbWVudFJlZiA9ICh0ZW1wbGF0ZXNbaV0gYXMgYW55KS5lbGVtZW50UmVmO1xyXG4gICAgICAgICAgaWYgKHRwbEVsZW1lbnRSZWYgPT09IHRhcmdldEVsZW1lbnRSZWYpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIOW/veeVpemUmeivr1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOaWueazlTPvvJrpgJrov4cgQW5ndWxhciDlhoXpg6jlsZ7mgKfmr5TovoNcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHRhcmdldENvbnRhaW5lciA9ICh0YXJnZXQgYXMgYW55KS5fZGVjbGFyYXRpb25UQ29udGFpbmVyO1xyXG4gICAgICBpZiAodGFyZ2V0Q29udGFpbmVyKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IHRwbENvbnRhaW5lciA9ICh0ZW1wbGF0ZXNbaV0gYXMgYW55KS5fZGVjbGFyYXRpb25UQ29udGFpbmVyO1xyXG4gICAgICAgICAgaWYgKHRwbENvbnRhaW5lciA9PT0gdGFyZ2V0Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyDlv73nlaXplJnor69cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG5cclxuICAvLyDorr7nva7nrZvpgInooajljZXpu5jorqTlsZ7mgKdcclxuICBwcml2YXRlIHNldFNlYXJjaEZvcm1EZWZhdWx0UHJvcChjb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdKSB7XHJcbiAgICBjb2x1bW5zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKGl0ZW0udmFsdWVUeXBlKSB7XHJcbiAgICAgICAgaWYgKGl0ZW0uZmllbGRQcm9wcykge1xyXG4gICAgICAgICAgaXRlbS5maWVsZFByb3BzID0ge1xyXG4gICAgICAgICAgICAuLi5QUk9fVEFCTEVfREVGQVVMVF9QUk9QU1tpdGVtLnZhbHVlVHlwZV0sXHJcbiAgICAgICAgICAgIC4uLml0ZW0uZmllbGRQcm9wcyxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGl0ZW0uZmllbGRQcm9wcyA9IHsgLi4uUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbaXRlbS52YWx1ZVR5cGVdIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOWKqOaAgeiuvue9rk9wdGlvbnNcclxuICBwcml2YXRlIHNldFNlbGVjdFJlcXVlc3QoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgY29sdW1ucy5tYXAoYXN5bmMgKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKGl0ZW0uZmllbGRQcm9wcyAmJiBoYXNJbihpdGVtLmZpZWxkUHJvcHMsIFwicmVxdWVzdFwiKSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgKFxyXG4gICAgICAgICAgICBpdGVtLmZpZWxkUHJvcHMgYXMgU2VsZWN0RmllbGRQcm9wc1xyXG4gICAgICAgICAgKS5yZXF1ZXN0Py4oKTtcclxuICAgICAgICAgIChpdGVtLmZpZWxkUHJvcHMgYXMgU2VsZWN0RmllbGRQcm9wcykub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIChpdGVtLmZpZWxkUHJvcHMgYXMgU2VsZWN0RmllbGRQcm9wcykub3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNldFNlYXJjaFBhcmFtcyhjb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdKSB7XHJcbiAgICB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMgPSBbXTtcclxuICAgIGNvbHVtbnNcclxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZsYWcgPSAhaXRlbS5oaWRlSW5TZWFyY2ggJiYgaXRlbS52YWx1ZVR5cGU7XHJcbiAgICAgICAgaWYgKGZsYWcpIHtcclxuICAgICAgICAgIHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5wdXNoKGNsb25lRGVlcChpdGVtKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbGFnO1xyXG4gICAgICB9KVxyXG4gICAgICAuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gY29sdW1uLmZpZWxkUHJvcHM/Lm5hbWUgfHwgY29sdW1uLnByb3A7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IFBST19UQUJMRV9ERUZBVUxUX1BST1BTW2NvbHVtbi52YWx1ZVR5cGVdLnZhbHVlO1xyXG5cclxuICAgICAgICAvLyDlr7nkuo5jaGVja2JveOexu+Wei++8jOS7jm9wdGlvbnPkuK3mib7lh7pjaGVja2Vk5Li6dHJ1ZeeahOmhueS9nOS4uum7mOiupOWAvFxyXG4gICAgICAgIGlmIChjb2x1bW4udmFsdWVUeXBlID09PSBcImNoZWNrYm94XCIpIHtcclxuICAgICAgICAgIGNvbnN0IGNoZWNrZWRWYWx1ZXMgPSAoY29sdW1uLmZpZWxkUHJvcHM/Lm9wdGlvbnMgfHwgW10pXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKG9wdDogT3B0aW9uc1R5cGUpID0+IG9wdC5jaGVja2VkKVxyXG4gICAgICAgICAgICAubWFwKChvcHQ6IE9wdGlvbnNUeXBlKSA9PiBvcHQudmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPVxyXG4gICAgICAgICAgICBjaGVja2VkVmFsdWVzLmxlbmd0aCA+IDAgPyBjaGVja2VkVmFsdWVzIDogZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba2V5XSA9IGNvbHVtbi5maWVsZFByb3BzPy52YWx1ZSB8fCBkZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDliJ3lp4vljJYgYXV0b0NvbXBsZXRlIOaVsOaNrua6kFxyXG4gICAgICAgIGlmIChjb2x1bW4udmFsdWVUeXBlID09PSBcImF1dG9Db21wbGV0ZVwiKSB7XHJcbiAgICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1trZXldID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAvLyDmoLnmja7liJfnmoQgb3JkZXIg5a2X5q616L+b6KGM5o6S5bqP77yM5pyq6K6+572uIG9yZGVyIOeahOaUvuWcqOacgOWQjlxyXG4gICAgdGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGFPcmRlciA9IGlzTmlsKGE/Lm9yZGVyKSA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogYS5vcmRlcjtcclxuICAgICAgY29uc3QgYk9yZGVyID0gaXNOaWwoYj8ub3JkZXIpID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgOiBiLm9yZGVyO1xyXG4gICAgICBpZiAoYU9yZGVyID09PSBiT3JkZXIpIHJldHVybiAwO1xyXG4gICAgICByZXR1cm4gYU9yZGVyIC0gYk9yZGVyO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZXRTZWFyY2hGb3JtRGVmYXVsdFByb3AodGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zKTtcclxuXHJcbiAgICAvLyDlubblj5HliqDovb3miYDmnInpnIDopoHlvILmraXojrflj5bnmoTpgInpoblcclxuICAgIHRoaXMuc2V0U2VsZWN0UmVxdWVzdCh0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVUYWJsZUNvbHVtbnMoaW5qZWN0Q29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgLy8g6L+c56iL5YiX55u05o6l5L2c5Li65p2l5rqQ77yM6L+H5ruk5o6J5pys5Zyw5LiN5a2Y5Zyo55qE5YiX77yM5bm25LuO5pys5Zyw5YiX6KGl5YWF5riy5p+T6YWN572uXHJcbiAgICBjb25zdCByZW1vdGVDb2x1bW5zID0gaW5qZWN0Q29sdW1uc1xyXG4gICAgICAuZmlsdGVyKChpbmplY3RDb2wpID0+XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLnByb3AgPT09IGluamVjdENvbC5wcm9wKSxcclxuICAgICAgKVxyXG4gICAgICAubWFwKChpbmplY3RDb2wpID0+IHtcclxuICAgICAgICBjb25zdCBsb2NhbENvbCA9IHRoaXMuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5wcm9wID09PSBpbmplY3RDb2wucHJvcCk7XHJcbiAgICAgICAgcmV0dXJuIHsgLi4ubG9jYWxDb2wsIC4uLmluamVjdENvbCB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAvLyDovoXliqnliJflj5boh6rmnKzlnLDvvIzkv53mjIHlnKjljp/lp4vkvY3nva7vvIjpppbpg6ggLyDlsL7pg6jvvIlcclxuICAgIGNvbnN0IGZpcnN0Tm9uQXV4SW5kZXggPSB0aGlzLmNvbHVtbnMuZmluZEluZGV4KFxyXG4gICAgICAoYykgPT4gIWMuYXV4aWxpYXJ5Q29sdW1uLFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGxhc3ROb25BdXhJbmRleCA9XHJcbiAgICAgIHRoaXMuY29sdW1ucy5sZW5ndGggLVxyXG4gICAgICAxIC1cclxuICAgICAgWy4uLnRoaXMuY29sdW1uc10ucmV2ZXJzZSgpLmZpbmRJbmRleCgoYykgPT4gIWMuYXV4aWxpYXJ5Q29sdW1uKTtcclxuICAgIGNvbnN0IGhlYWRBdXhpbGlhcnkgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKFxyXG4gICAgICAoY29sLCBpKSA9PiBjb2wuYXV4aWxpYXJ5Q29sdW1uICYmIGkgPCBmaXJzdE5vbkF1eEluZGV4LFxyXG4gICAgKTtcclxuICAgIGNvbnN0IHRhaWxBdXhpbGlhcnkgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKFxyXG4gICAgICAoY29sLCBpKSA9PiBjb2wuYXV4aWxpYXJ5Q29sdW1uICYmIGkgPiBsYXN0Tm9uQXV4SW5kZXgsXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuZm9ybWF0ZUlubmVyQ29sdW1ucyhbLi4uaGVhZEF1eGlsaWFyeSwgLi4ucmVtb3RlQ29sdW1ucywgLi4udGFpbEF1eGlsaWFyeV0pO1xyXG4gIH1cclxuXHJcbiAgLy8g6YCa6L+HIFByb3h5IOebkeWQrCBfc2VhcmNoUGFyYW1zIOeahOWxnuaAp+WPmOabtFxyXG4gIHByaXZhdGUgY3JlYXRlU2VhcmNoUGFyYW1zUHJveHkodGFyZ2V0OiBhbnkpIHtcclxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgY29uc3QgaGFuZGxlcjogUHJveHlIYW5kbGVyPGFueT4gPSB7XHJcbiAgICAgIHNldChvYmo6IGFueSwgcHJvcDogc3RyaW5nIHwgc3ltYm9sLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHByb3ApO1xyXG4gICAgICAgIGNvbnN0IG9sZFZhbCA9IG9ialtrZXldO1xyXG4gICAgICAgIGlmIChvbGRWYWwgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9ialtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHNlbGYub25WYWx1ZXNDaGFuZ2UuZW1pdCh7XHJcbiAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgdmFsdWUsXHJcbiAgICAgICAgICAgIHBhcmFtczogc2VsZi5nZXRTZWFyY2hQYXJhbXMoKSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhckVtcHR5U2VhcmNoUGFyYW1zKCkge1xyXG4gICAgY29uc3QgY2xvbmVTZWFyY2hQYXJhbXMgPSBjbG9uZURlZXAodGhpcy5fc2VhcmNoUGFyYW1zKTtcclxuICAgIHJldHVybiBjbG9uZVNlYXJjaFBhcmFtcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRTZXJ2ZXJTb3J0UGF5bG9hZCgpIHtcclxuICAgIC8vIOaehOW7uua/gOa0u+aOkuW6j+mbhuWQiO+8iOaMieS8mOWFiOe6p+S7juS9juWIsOmrmO+8jOacq+WwvuS8mOWFiO+8iVxyXG4gICAgY29uc3QgYWN0aXZlS2V5cyA9IHRoaXMuX3NvcnRQcmlvcml0eS5maWx0ZXIoKGspID0+ICEhdGhpcy5fc29ydE1hcFtrXSk7XHJcbiAgICBpZiAoYWN0aXZlS2V5cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xyXG4gICAgY29uc3Qgc29ydHMgPSBhY3RpdmVLZXlzLm1hcCgoZmllbGQpID0+IHtcclxuICAgICAgLy8g5p+l5om+5a+55bqU55qE5YiX6YWN572u77yM5LyY5YWI5L2/55Soc29ydE5hbWXlrZfmrrVcclxuICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5fY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5wcm9wID09PSBmaWVsZCk7XHJcbiAgICAgIGNvbnN0IHNvcnRGaWVsZCA9IGNvbHVtbj8uc29ydE5hbWUgfHwgZmllbGQ7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZmllbGQ6IHNvcnRGaWVsZCxcclxuICAgICAgICBvcmRlcjogdGhpcy5fc29ydE1hcFtmaWVsZF0hLFxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgICBpZiAodGhpcy5tdWx0aXBsZVNvcnQpIHtcclxuICAgICAgcmV0dXJuIHNvcnRzOyAvLyDku6XmlbDnu4TlvaLlvI/mj5DkuqTlpJrliJfmjpLluo9cclxuICAgIH1cclxuICAgIGNvbnN0IFtmaXJzdF0gPSBzb3J0cztcclxuICAgIHJldHVybiBmaXJzdDsgLy8g5YW85a655Y2V5YiX57uT5p6EIHsgZmllbGQsIG9yZGVyIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc29ydERhdGFTb3VyY2VJblBsYWNlKCkge1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuZGF0YVNvdXJjZSkgfHwgdGhpcy5kYXRhU291cmNlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgY29uc3QgYWN0aXZlS2V5cyA9IHRoaXMuX3NvcnRQcmlvcml0eS5maWx0ZXIoKGspID0+ICEhdGhpcy5fc29ydE1hcFtrXSk7XHJcbiAgICBpZiAoYWN0aXZlS2V5cy5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcbiAgICAvLyDlpI3liLbkuIDku73kvJjlhYjnuqfvvIzku47liY3liLDlkI7kvJjlhYjnuqfku47kvY7liLDpq5jvvIjmnIDlkI7orr7nva7nmoTlrZfmrrXkvJjlhYjvvIlcclxuICAgIGNvbnN0IGtleXNJblByaW9yaXR5ID0gWy4uLmFjdGl2ZUtleXNdO1xyXG4gICAgdGhpcy5kYXRhU291cmNlLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XHJcbiAgICAgIGZvciAobGV0IGkgPSBrZXlzSW5Qcmlvcml0eS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIGNvbnN0IGZpZWxkID0ga2V5c0luUHJpb3JpdHlbaV07XHJcbiAgICAgICAgY29uc3Qgb3JkZXIgPSB0aGlzLl9zb3J0TWFwW2ZpZWxkXSE7XHJcbiAgICAgICAgY29uc3QgYXYgPSBhPy5bZmllbGRdO1xyXG4gICAgICAgIGNvbnN0IGJ2ID0gYj8uW2ZpZWxkXTtcclxuICAgICAgICBjb25zdCBjbXAgPSB0aGlzLmNvbXBhcmVWYWx1ZXMoYXYsIGJ2KTtcclxuICAgICAgICBpZiAoY21wICE9PSAwKSByZXR1cm4gb3JkZXIgPT09IFwiYXNjZW5kXCIgPyBjbXAgOiAtY21wO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXBhcmVWYWx1ZXMoYVZhbDogYW55LCBiVmFsOiBhbnkpOiBudW1iZXIge1xyXG4gICAgaWYgKGFWYWwgPT0gbnVsbCAmJiBiVmFsID09IG51bGwpIHJldHVybiAwO1xyXG4gICAgaWYgKGFWYWwgPT0gbnVsbCkgcmV0dXJuIC0xO1xyXG4gICAgaWYgKGJWYWwgPT0gbnVsbCkgcmV0dXJuIDE7XHJcbiAgICBpZiAoYVZhbCBpbnN0YW5jZW9mIERhdGUgJiYgYlZhbCBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgcmV0dXJuIGFWYWwuZ2V0VGltZSgpIC0gYlZhbC5nZXRUaW1lKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGFWYWwgPT09IFwiYm9vbGVhblwiICYmIHR5cGVvZiBiVmFsID09PSBcImJvb2xlYW5cIikge1xyXG4gICAgICByZXR1cm4gYVZhbCA9PT0gYlZhbCA/IDAgOiBhVmFsID8gMSA6IC0xO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBhVmFsID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBiVmFsID09PSBcIm51bWJlclwiKSB7XHJcbiAgICAgIHJldHVybiBhVmFsIC0gYlZhbDtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgYVZhbCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgYlZhbCA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICByZXR1cm4gYVZhbC5sb2NhbGVDb21wYXJlKGJWYWwpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYU51bSA9IE51bWJlcihhVmFsKTtcclxuICAgIGNvbnN0IGJOdW0gPSBOdW1iZXIoYlZhbCk7XHJcbiAgICBpZiAoIWlzTmFOKGFOdW0pICYmICFpc05hTihiTnVtKSkgcmV0dXJuIGFOdW0gLSBiTnVtO1xyXG4gICAgcmV0dXJuIFN0cmluZyhhVmFsKS5sb2NhbGVDb21wYXJlKFN0cmluZyhiVmFsKSk7XHJcbiAgfVxyXG5cclxuICAvLyDmiafooYwgYXV0b0NvbXBsZXRlIOaVsOaNrua6kOafpeivou+8iOWunumZheaJp+ihjOmAu+i+ke+8iVxyXG4gIHByaXZhdGUgZXhlY3V0ZUF1dG9Db21wbGV0ZURhdGFTb3VyY2UoZXZlbnQ6IEV2ZW50LCBjb2x1bW46IFByb1RhYmxlQ29sdW1uKSB7XHJcbiAgICBjb25zdCBmaWVsZEtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgKGNvbHVtbi5maWVsZFByb3BzIGFzIEF1dG9Db21wbGV0ZUZpZWxkUHJvcHMpLmRhdGFTb3VyY2UgJiZcclxuICAgICAgdHlwZW9mIChjb2x1bW4uZmllbGRQcm9wcyBhcyBBdXRvQ29tcGxldGVGaWVsZFByb3BzKS5kYXRhU291cmNlID09PVxyXG4gICAgICAgIFwiZnVuY3Rpb25cIlxyXG4gICAgKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKGNvbHVtbi5maWVsZFByb3BzIGFzIEF1dG9Db21wbGV0ZUZpZWxkUHJvcHMpLmRhdGFTb3VyY2UoXHJcbiAgICAgICAgICBldmVudCxcclxuICAgICAgICApO1xyXG4gICAgICAgIC8vIOWmguaenOi/lOWbnueahOaYryBQcm9taXNl77yM5aSE55CG5byC5q2l57uT5p6cXHJcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgIHJlc3VsdFxyXG4gICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2ZpZWxkS2V5XSA9IGRhdGEgfHwgW107XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQXV0b0NvbXBsZXRlIGRhdGFTb3VyY2UgZXJyb3I6XCIsIGVycm9yKTtcclxuICAgICAgICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gPSBbXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIOWQjOatpei/lOWbnue7k+aenFxyXG4gICAgICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNbZmllbGRLZXldID0gcmVzdWx0IHx8IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiQXV0b0NvbXBsZXRlIGRhdGFTb3VyY2UgZXJyb3I6XCIsIGVycm9yKTtcclxuICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gPSBbXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNlYXJjaFBhcmFtcyhvcHRpb25zPzoge1xyXG4gICAgdXNlU2F2ZWQ/OiBib29sZWFuOyAvLyDkvb/nlKjmnIDov5HkuIDmrKHmn6Xor6Lmj5DkuqTnmoTlj4LmlbDvvIzpu5jorqTkuLogZmFsc2XvvJtmYWxzZSDkuLrlvZPliY3ooajljZXlgLxcclxuICB9KTogYW55IHtcclxuICAgIGNvbnN0IHsgdXNlU2F2ZWQgPSBmYWxzZSB9ID0gb3B0aW9ucyB8fCB7fTtcclxuICAgIGNvbnN0IHJhd1BhcmFtcyA9IHVzZVNhdmVkID8gdGhpcy5fc2F2ZWRTZWFyY2hQYXJhbXMgOiB0aGlzLl9zZWFyY2hQYXJhbXM7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBjbG9uZURlZXAocmF3UGFyYW1zIHx8IHt9KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBwYXJhbXMsXHJcbiAgICAgIHBhZ2VJbmZvOiB7XHJcbiAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXgsXHJcbiAgICAgICAgcGFnZVNpemU6IHRoaXMuX3BhZ2VJbmZvLnBhZ2VTaXplLFxyXG4gICAgICB9LFxyXG4gICAgICAvLyDlnKjnur/mjpLluo/mqKHlvI/vvJrmiormjpLluo/lr7nosaHmj5DkuqTnu5nmjqXlj6NcclxuICAgICAgLi4uKHRoaXMuc29ydE1vZGUgPT09IFwic2VydmVyXCJcclxuICAgICAgICA/IHsgc29ydDogdGhpcy5idWlsZFNlcnZlclNvcnRQYXlsb2FkKCkgfVxyXG4gICAgICAgIDoge30pLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWxvYWQoYWZ0ZXJEZWxldGU/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KGFmdGVyRGVsZXRlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRGaWVsZHNWYWx1ZShmaWVsZHM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgIE9iamVjdC5rZXlzKGZpZWxkcykuZm9yRWFjaCgoaykgPT4ge1xyXG4gICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba10gPSBmaWVsZHNba107IC8vIOS/neeVmSBQcm94ee+8jOmAkOmhuei1i+WAvOinpuWPkeaLpuaIqlxyXG5cclxuICAgICAgLy8gY2hlY2tib3gg57G75Z6L6ZyA6KaB5ZCM5q2l5pu05pawIG9wdGlvbnMg55qEIGNoZWNrZWQg54q25oCB77yM5ZCm5YiZIFVJIOS4jeS8muWTjeW6lFxyXG4gICAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMuZmluZChcclxuICAgICAgICAoaXRlbSkgPT4gKGl0ZW0uZmllbGRQcm9wcz8ubmFtZSB8fCBpdGVtLnByb3ApID09PSBrLFxyXG4gICAgICApO1xyXG4gICAgICBpZiAodGFyZ2V0Q29sdW1uPy52YWx1ZVR5cGUgPT09IFwiY2hlY2tib3hcIikge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlczogYW55W10gPSBBcnJheS5pc0FycmF5KGZpZWxkc1trXSkgPyBmaWVsZHNba10gOiBbXTtcclxuICAgICAgICBjb25zdCB0YXJnZXRGaWVsZFByb3BzID0gdGFyZ2V0Q29sdW1uLmZpZWxkUHJvcHMgYXMgQ2hlY2tib3hGaWVsZFByb3BzO1xyXG4gICAgICAgIGlmICh0YXJnZXRGaWVsZFByb3BzPy5vcHRpb25zKSB7XHJcbiAgICAgICAgICB0YXJnZXRGaWVsZFByb3BzLm9wdGlvbnMgPSB0YXJnZXRGaWVsZFByb3BzLm9wdGlvbnMubWFwKFxyXG4gICAgICAgICAgICAoaXRlbTogT3B0aW9uc1R5cGUpID0+ICh7XHJcbiAgICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgICBjaGVja2VkOiB2YWx1ZXMuaW5jbHVkZXMoaXRlbS52YWx1ZSksXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEZpZWxkVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtc1trZXldID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZFJvdygpIHtcclxuICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNldENvbHVtbnMoXHJcbiAgICBjb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdLFxyXG4gICAgb3B0aW9ucz86IHtcclxuICAgICAgcmVsb2FkPzogYm9vbGVhbjsgLy8g5piv5ZCm6YeN5paw5Yqg6L295pWw5o2u77yM6buY6K6k5Li6IGZhbHNlXHJcbiAgICB9LFxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8g5pu05pawIGNvbHVtbnMg6L6T5YWl5bGe5oCnXHJcbiAgICB0aGlzLmNvbHVtbnMgPSBjbG9uZURlZXAoY29sdW1ucyk7XHJcblxyXG4gICAgLy8g6YeN5paw5qC85byP5YyW5YaF6YOo5YiXXHJcbiAgICB0aGlzLmZvcm1hdGVJbm5lckNvbHVtbnModGhpcy5jb2x1bW5zKTtcclxuXHJcbiAgICAvLyDph43mlrDorr7nva7mkJzntKLlj4LmlbDvvIjlvILmraXmk43kvZzvvIlcclxuICAgIC8vIOWFiOa4heepuuaXp+eahOaQnOe0ouWPguaVsO+8jOmBv+WFjeaXp+aVsOaNruaui+eVmVxyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zID0ge307XHJcbiAgICBhd2FpdCB0aGlzLnNldFNlYXJjaFBhcmFtcyh0aGlzLmNvbHVtbnMpO1xyXG5cclxuICAgIC8vIOmHjeaWsOWIm+W7uiBQcm94ee+8jOehruS/neihqOWNlemhueWAvOWPmOWMluiDveato+W4uOinpuWPkeS6i+S7tlxyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zID0gdGhpcy5jcmVhdGVTZWFyY2hQYXJhbXNQcm94eSh0aGlzLl9zZWFyY2hQYXJhbXMpO1xyXG5cclxuICAgIC8vIOmHjeaWsOazqOWGjOaooeadv++8iOWmguaenOe7hOS7tuW3sue7j+WIneWni+WMluWujOaIkO+8iVxyXG4gICAgaWYgKHRoaXMuYWxsVGVtcGxhdGVzKSB7XHJcbiAgICAgIHRoaXMuYXV0b1JlZ2lzdGVyVGVtcGxhdGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c6K6+572u5LqGIHJlbG9hZCDpgInpobnkuLogdHJ1Ze+8jOWImemHjeaWsOafpeivouaVsOaNrlxyXG4gICAgaWYgKG9wdGlvbnM/LnJlbG9hZCA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRSb3dEYXRhPFQgPSBhbnk+KCk6IFQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkVGFibGVSb3c7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q2hlY2tlZFJvd3M8VCA9IGFueT4oKTogVFtdIHtcclxuICAgIGlmICghdGhpcy5zaG93Q2hlY2tib3gpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgLy8g6L+U5Zue5b2T5YmN5pWw5o2u5rqQ5Lit5omA5pyJIGNoZWNrZWQg5Li6IHRydWUg55qE6aG5XHJcbiAgICAvLyDms6jmhI/vvJrlpoLmnpzpnIDopoHojrflj5bmiYDmnInpobXnmoTpgInkuK3pobnvvIzpnIDopoHpgY3ljobmiYDmnInmlbDmja7mupDmiJbkvb/nlKggX3NlbGVjdGVkUm93SWRzXHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmZpbHRlcigocm93KSA9PiByb3cuY2hlY2tlZCA9PT0gdHJ1ZSkgYXMgVFtdO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W5oyH5a6a5ZCN56ew55qE5qih5p2/XHJcbiAgZ2V0VGVtcGxhdGUobmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xyXG4gICAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLmN1c3RvbVRlbXBsYXRlcy5nZXQobmFtZSkgfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIGdldFRvb2xUaXBUZXh0VmFsdWUoY29sdW1uOiBQcm9UYWJsZUNvbHVtbiwgZGF0YTogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGtleSA9XHJcbiAgICAgIGNvbHVtbi5jdXN0b21SZW5kZXIgJiYgdGhpcy5nZXRUZW1wbGF0ZShjb2x1bW4uY3VzdG9tUmVuZGVyKVxyXG4gICAgICAgID8gXCJcIlxyXG4gICAgICAgIDogY29sdW1uLmVsbGlwc2lzXHJcbiAgICAgICAgICA/IGNvbHVtbi5wcm9wXHJcbiAgICAgICAgICA6IFwiXCI7XHJcbiAgICByZXR1cm4gIWtleSA/IFwiXCIgOiBkYXRhW2tleV07XHJcbiAgfVxyXG5cclxuICBnZXRUYWJsZVJvd0NoZWNrZWQoZGF0YTogYW55KSB7XHJcbiAgICAvLyDlkK/nlKjlpI3pgInmoYbml7bvvJrooYzpq5jkuq7lupTkuI7lpI3pgInmoYbpgInkuK3nirbmgIHkuIDoh7TvvIjmlK/mjIHlpJrpgInvvIlcclxuICAgIGlmICh0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pc1Jvd0NoZWNrZWQoZGF0YSk7XHJcbiAgICB9XHJcbiAgICAvLyDmnKrlkK/nlKjlpI3pgInmoYbml7bvvJrku43nhLbkvb/nlKjljZXpgInooYzpq5jkuq5cclxuICAgIGlmICghdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdykgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuX3NlbGVjdGVkVGFibGVSb3cpID09PSBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxuICB9XHJcblxyXG4gIC8vIOajgOafpeihjOaYr+WQpuiiq+emgeeUqFxyXG4gIGlzUm93RGlzYWJsZWQoZGF0YTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NoZWNrYm94KSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dEaXNhYmxlZCA/IHRoaXMucm93RGlzYWJsZWQoZGF0YSkgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIOajgOafpeihjOaYr+WQpuiiq+WkjemAieahhumAieS4re+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIGlzUm93Q2hlY2tlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5zaG93Q2hlY2tib3gpIHJldHVybiBmYWxzZTtcclxuICAgIC8vIOebtOaOpeivu+WPluaVsOaNruWvueixoeeahCBjaGVja2VkIOWxnuaAp1xyXG4gICAgcmV0dXJuIGRhdGEuY2hlY2tlZCA9PT0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIOWIh+aNouihjOeahOmAieS4reeKtuaAge+8iOaVsOaNrumpseWKqOaooeW8j++8jOS/neeVmeeUqOS6juWFvOWuue+8iVxyXG4gIHRvZ2dsZVJvd0NoZWNrZWQoZGF0YTogYW55LCBjaGVja2VkOiBib29sZWFuLCBldmVudD86IEV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIOmYu+atouS6i+S7tuWGkuazoe+8jOmBv+WFjeinpuWPkeihjOeCueWHu1xyXG4gICAgfVxyXG4gICAgLy8g5aaC5p6c6KGM6KKr56aB55So77yM5LiN5YWB6K645YiH5o2i6YCJ5Lit54q25oCBXHJcbiAgICBpZiAodGhpcy5pc1Jvd0Rpc2FibGVkKGRhdGEpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyDnm7TmjqXorr7nva7mlbDmja7lr7nosaHnmoQgY2hlY2tlZCDlsZ7mgKdcclxuICAgIGRhdGEuY2hlY2tlZCA9IGNoZWNrZWQ7XHJcblxyXG4gICAgLy8g5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd3PvvIjnlKjkuo7lhbzlrrnmgKfvvIlcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fc2VsZWN0ZWRSb3dzLmZpbmRJbmRleCgocm93KSA9PlxyXG4gICAgICB0aGlzLmlzU2FtZVJvdyhyb3csIGRhdGEpLFxyXG4gICAgKTtcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd3MucHVzaChkYXRhKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDli77pgInlpI3pgInmoYbml7blkIzmraXorr7nva7pq5jkuq7pgInkuK3ooYxcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IGRhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93cy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOiLpeW9k+WJjemrmOS6ruihjOS4uuivpeihjO+8jOWImeWPlua2iOmrmOS6rlxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyAmJlxyXG4gICAgICAgIHRoaXMuaXNTYW1lUm93KHRoaXMuX3NlbGVjdGVkVGFibGVSb3csIGRhdGEpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g5pu05paw5YWo6YCJ54q25oCB77yI5pWw5o2u6amx5Yqo5qih5byP77yJXHJcbiAgdXBkYXRlQ2hlY2tBbGxTdGF0dXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NoZWNrYm94IHx8ICFBcnJheS5pc0FycmF5KHRoaXMuZGF0YVNvdXJjZSkpIHtcclxuICAgICAgdGhpcy5fY2hlY2tlZEFsbCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9pbmRldGVybWluYXRlID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIOWPquiuoeeul+WPr+eUqOeahOihjO+8iOacquemgeeUqOeahOihjO+8iVxyXG4gICAgY29uc3QgYXZhaWxhYmxlUm93cyA9IHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIoXHJcbiAgICAgIChyb3cpID0+ICF0aGlzLmlzUm93RGlzYWJsZWQocm93KSxcclxuICAgICk7XHJcbiAgICAvLyDln7rkuo7mlbDmja7lr7nosaHnmoQgY2hlY2tlZCDlsZ7mgKforqHnrpdcclxuICAgIGNvbnN0IGNoZWNrZWRDb3VudCA9IGF2YWlsYWJsZVJvd3MuZmlsdGVyKFxyXG4gICAgICAocm93KSA9PiByb3cuY2hlY2tlZCA9PT0gdHJ1ZSxcclxuICAgICkubGVuZ3RoO1xyXG4gICAgY29uc3QgdG90YWxDb3VudCA9IGF2YWlsYWJsZVJvd3MubGVuZ3RoO1xyXG4gICAgdGhpcy5fY2hlY2tlZEFsbCA9XHJcbiAgICAgIHRvdGFsQ291bnQgPiAwICYmIGNoZWNrZWRDb3VudCA+IDAgJiYgY2hlY2tlZENvdW50ID09PSB0b3RhbENvdW50O1xyXG4gICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGNoZWNrZWRDb3VudCA+IDAgJiYgY2hlY2tlZENvdW50IDwgdG90YWxDb3VudDtcclxuICB9XHJcblxyXG4gIC8vIOWFqOmAiS/lj5bmtojlhajpgInvvIjmlbDmja7pqbHliqjmqKHlvI/vvIlcclxuICB0b2dnbGVDaGVja0FsbChjaGVja2VkOiBib29sZWFuLCBldmVudD86IEV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5Y+q5aSE55CG5Y+v55So55qE6KGM77yI5pyq56aB55So55qE6KGM77yJXHJcbiAgICBjb25zdCBhdmFpbGFibGVSb3dzID0gdGhpcy5kYXRhU291cmNlLmZpbHRlcihcclxuICAgICAgKHJvdykgPT4gIXRoaXMuaXNSb3dEaXNhYmxlZChyb3cpLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyDmibnph4/orr7nva4gY2hlY2tlZCDlsZ7mgKdcclxuICAgIGF2YWlsYWJsZVJvd3MuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgIHJvdy5jaGVja2VkID0gY2hlY2tlZDtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIOWQjOatpeabtOaWsCBfc2VsZWN0ZWRSb3dz77yI55So5LqO5YW85a655oCn77yJXHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd3MgPSBbLi4uYXZhaWxhYmxlUm93c107XHJcbiAgICAgIC8vIOWQjOatpeiuvue9rumrmOS6rumAieS4reihjOS4uuesrOS4gOadoeWPr+mAieaVsOaNrlxyXG4gICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID1cclxuICAgICAgICBhdmFpbGFibGVSb3dzLmxlbmd0aCA+IDAgPyBhdmFpbGFibGVSb3dzWzBdIDogbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93cyA9IFtdO1xyXG4gICAgICAvLyDlj5bmtojpq5jkuq5cclxuICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W6YCJ5Lit55qE6KGM5pWw5o2u77yI5L+d55WZ55So5LqO5YW85a655oCn77yJXHJcbiAgZ2V0U2VsZWN0ZWRSb3dzKCk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLmdldENoZWNrZWRSb3dzKCk7XHJcbiAgfVxyXG5cclxuICAvLyDlpITnkIbooYwgY2hlY2tib3gg5Y+Y5YyW5LqL5Lu277yI5pWw5o2u6amx5Yqo5qih5byP77yJXHJcbiAgaGFuZGxlUm93Q2hlY2tlZENoYW5nZShkYXRhOiBhbnksIGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzUm93RGlzYWJsZWQoZGF0YSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOaVsOaNruWvueixoeeahCBjaGVja2VkIOWxnuaAp+W3sue7j+mAmui/h+WPjOWQkee7keWumuiHquWKqOabtOaWsFxyXG4gICAgLy8g6L+Z6YeM5Y+q6ZyA6KaB5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd3NcclxuXHJcbiAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93c++8iOeUqOS6juWFvOWuueaAp++8iVxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZFJvd3MuZmluZEluZGV4KChyb3cpID0+XHJcbiAgICAgIHRoaXMuaXNTYW1lUm93KHJvdywgZGF0YSksXHJcbiAgICApO1xyXG4gICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93cy5wdXNoKGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOWLvumAieWkjemAieahhuaXtuWQjOatpeiuvue9rumrmOS6rumAieS4reihjFxyXG4gICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gZGF0YTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8g6Iul5b2T5YmN6auY5Lqu6KGM5Li66K+l6KGM77yM5YiZ5Y+W5raI6auY5LquXHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ICYmXHJcbiAgICAgICAgdGhpcy5pc1NhbWVSb3codGhpcy5fc2VsZWN0ZWRUYWJsZVJvdywgZGF0YSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDmm7TmlrDlhajpgInnirbmgIFcclxuICAgIHRoaXMudXBkYXRlQ2hlY2tBbGxTdGF0dXMoKTtcclxuICB9XHJcblxyXG4gIC8vIOWIt+aWsOWFqOmAieeKtuaAge+8iOeUqOS6juWFtuS7luWcuuaZr++8iVxyXG4gIHJlZnJlc2hDaGVja0FsbFN0YXR1cygpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlQ2hlY2tBbGxTdGF0dXMoKTtcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPluihjOeahOWUr+S4gOagh+ivhu+8iOeUqOS6jui3qOmhtemAieS4re+8iVxyXG4gIHByaXZhdGUgZ2V0Um93SWQoZGF0YTogYW55KTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiBkYXRhLmlkID8/IGRhdGEua2V5ID8/IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8vIOWIpOaWreS4pOihjOaYr+WQpuS4uuWQjOS4gOihjFxyXG4gIHByaXZhdGUgaXNTYW1lUm93KHJvdzE6IGFueSwgcm93MjogYW55KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBpZDEgPSB0aGlzLmdldFJvd0lkKHJvdzEpO1xyXG4gICAgY29uc3QgaWQyID0gdGhpcy5nZXRSb3dJZChyb3cyKTtcclxuXHJcbiAgICBpZiAoaWQxICE9PSB1bmRlZmluZWQgJiYgaWQyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIGlkMSA9PT0gaWQyO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZhbGxiYWNrIOWIsCBKU09OIOavlOi+g1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJvdzEpID09PSBKU09OLnN0cmluZ2lmeShyb3cyKTtcclxuICB9XHJcblxyXG4gIC8vIOa4heepuumAieS4reeahOihjO+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIGNsZWFyU2VsZWN0ZWRSb3dzKCkge1xyXG4gICAgLy8g5riF56m65b2T5YmN5pWw5o2u5rqQ5Lit5omA5pyJ6aG555qEIGNoZWNrZWQg54q25oCBXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpKSB7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgICByb3cuY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9zZWxlY3RlZFJvd3MgPSBbXTtcclxuICAgIHRoaXMuX2NoZWNrZWRBbGwgPSBmYWxzZTtcclxuICAgIHRoaXMuX2luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcclxuICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRmllbGRDaGVja0JveENoYW5nZShjaGVja0JveE9wdGlvbnM6IE9wdGlvbnNUeXBlW10sIGtleTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNldEZpZWxkc1ZhbHVlKHtcclxuICAgICAgW2tleV06IGNoZWNrQm94T3B0aW9uc1xyXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uY2hlY2tlZClcclxuICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLnZhbHVlKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlU2VhcmNoKCkge1xyXG4gICAgdGhpcy5fc2F2ZWRTZWFyY2hQYXJhbXMgPSB0aGlzLmNsZWFyRW1wdHlTZWFyY2hQYXJhbXMoKTtcclxuICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA9IDE7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVSZXNldEZvcm0oKSB7XHJcbiAgICBPYmplY3Qua2V5cyh0aGlzLl9zZWFyY2hQYXJhbXMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMuZmluZCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoaXRlbS5maWVsZFByb3BzPy5uYW1lIHx8IGl0ZW0ucHJvcCkgPT09IGtleTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyDlr7nkuo5jaGVja2JveOexu+Wei++8jOmcgOimgeeJueauiuWkhOeQhum7mOiupOWAvFxyXG4gICAgICBpZiAodGFyZ2V0Q29sdW1uPy52YWx1ZVR5cGUgPT09IFwiY2hlY2tib3hcIikge1xyXG4gICAgICAgIC8vIOS7juWOn+Wni2NvbHVtbnPphY3nva7kuK3ojrflj5bliJ3lp4vphY3nva7vvIzku6Xnoa7kv53kvb/nlKjmraPnoa7nmoTpu5jorqTlgLxcclxuICAgICAgICBjb25zdCBvcmlnaW5hbENvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gKGl0ZW0uZmllbGRQcm9wcz8ubmFtZSB8fCBpdGVtLnByb3ApID09PSBrZXk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIOS7juWOn+Wni29wdGlvbnPkuK3mib7lh7pjaGVja2Vk5Li6dHJ1ZeeahOmhueS9nOS4uum7mOiupOWAvFxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRmllbGRQcm9wcyA9IG9yaWdpbmFsQ29sdW1uPy5maWVsZFByb3BzIGFzXHJcbiAgICAgICAgICB8IENoZWNrYm94RmllbGRQcm9wc1xyXG4gICAgICAgICAgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgY2hlY2tlZFZhbHVlcyA9IChvcmlnaW5hbEZpZWxkUHJvcHM/Lm9wdGlvbnMgfHwgW10pXHJcbiAgICAgICAgICAuZmlsdGVyKChvcHQ6IE9wdGlvbnNUeXBlKSA9PiBvcHQuY2hlY2tlZClcclxuICAgICAgICAgIC5tYXAoKG9wdDogT3B0aW9uc1R5cGUpID0+IG9wdC52YWx1ZSk7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID1cclxuICAgICAgICAgIGNoZWNrZWRWYWx1ZXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICA/IGNoZWNrZWRWYWx1ZXNcclxuICAgICAgICAgICAgOiBQUk9fVEFCTEVfREVGQVVMVF9QUk9QU1t0YXJnZXRDb2x1bW4udmFsdWVUeXBlXS52YWx1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPSBkZWZhdWx0VmFsdWU7XHJcblxyXG4gICAgICAgIC8vIOagueaNrum7mOiupOWAvOaBouWkjW9wdGlvbnPnmoRjaGVja2Vk54q25oCB77yM5L2/55So5Y6f5aeLb3B0aW9uc+eahOe7k+aehFxyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGRlZmF1bHRWYWx1ZSkgPyBkZWZhdWx0VmFsdWUgOiBbXTtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbE9wdGlvbnMgPSBvcmlnaW5hbEZpZWxkUHJvcHM/Lm9wdGlvbnMgfHwgW107XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0RmllbGRQcm9wcyA9IHRhcmdldENvbHVtbi5maWVsZFByb3BzIGFzIENoZWNrYm94RmllbGRQcm9wcztcclxuICAgICAgICB0YXJnZXRGaWVsZFByb3BzLm9wdGlvbnMgPSBvcmlnaW5hbE9wdGlvbnMubWFwKChpdGVtOiBPcHRpb25zVHlwZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgY2hlY2tlZDogZGVmYXVsdFZhbHVlcy5pbmNsdWRlcyhpdGVtLnZhbHVlKSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPSB0YXJnZXRDb2x1bW4/LmZpZWxkUHJvcHNcclxuICAgICAgICAgID8gdGFyZ2V0Q29sdW1uPy5maWVsZFByb3BzLnZhbHVlIHx8XHJcbiAgICAgICAgICAgIFBST19UQUJMRV9ERUZBVUxUX1BST1BTW3RhcmdldENvbHVtbi52YWx1ZVR5cGVdLnZhbHVlXHJcbiAgICAgICAgICA6IFBST19UQUJMRV9ERUZBVUxUX1BST1BTW3RhcmdldENvbHVtbi52YWx1ZVR5cGVdLnZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9zYXZlZFNlYXJjaFBhcmFtcyA9IHt9O1xyXG4gICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMub25SZXNldEZvcm1CZWZvcmVSZWxvYWQuZW1pdCgpO1xyXG4gICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlUGFnZUluZGV4Q2hhbmdlKHBhZ2VJbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSBwYWdlSW5kZXg7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQYWdlU2l6ZUNoYW5nZShwYWdlU2l6ZTogYW55KSB7XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlU2l6ZSA9IHBhZ2VTaXplO1xyXG4gICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGhhbmRsZVF1ZXJ5KGFmdGVyRGVsZXRlPzogYm9vbGVhbikge1xyXG4gICAgLy8g5Yig6Zmk5ZCO5Yi35paw5LiU5b2T5YmN6aG15LuF5Ymp5LiA5p2h6K6w5b2V5pe277yM6Iul5LiN5Zyo56ys5LiA6aG15YiZ5YWI5Zue6YCA5LiA6aG1XHJcbiAgICBpZiAoXHJcbiAgICAgIGFmdGVyRGVsZXRlICYmXHJcbiAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5kYXRhU291cmNlKSAmJlxyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UubGVuZ3RoID09PSAxICYmXHJcbiAgICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA+IDFcclxuICAgICkge1xyXG4gICAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggLSAxO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2xvYWRpbmcgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMucmVxdWVzdCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCh7XHJcbiAgICAgICAgICBwYXJhbXM6IHRoaXMuY2xlYXJFbXB0eVNlYXJjaFBhcmFtcygpLFxyXG4gICAgICAgICAgcGFnZUluZm86IHtcclxuICAgICAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXgsXHJcbiAgICAgICAgICAgIHBhZ2VTaXplOiB0aGlzLl9wYWdlSW5mby5wYWdlU2l6ZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAvLyDlnKjnur/mjpLluo/mqKHlvI/vvJrmiormjpLluo/lr7nosaHmj5DkuqTnu5nmjqXlj6NcclxuICAgICAgICAgIC4uLih0aGlzLnNvcnRNb2RlID09PSBcInNlcnZlclwiXHJcbiAgICAgICAgICAgID8geyBzb3J0OiB0aGlzLmJ1aWxkU2VydmVyU29ydFBheWxvYWQoKSB9XHJcbiAgICAgICAgICAgIDoge30pLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyDmn6Xor6LlkI7pu5jorqTkuI3kv53nlZnot6jpobXpgInkuK3nirbmgIHvvJrmr4/mrKHov5Tlm57nmoTmlbDmja7lnYfliJ3lp4vljJbkuLrmnKrpgInkuK1cclxuICAgICAgICBpZiAodGhpcy5zaG93Q2hlY2tib3gpIHtcclxuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IChyZXN1bHQuZGF0YSB8fCBbXSkubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgICBjaGVja2VkOiBmYWxzZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSByZXN1bHQuZGF0YSB8fCBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc3VtbWFyeURhdGEgPSByZXN1bHQuc3VtbWFyeURhdGEgfHwgbnVsbDtcclxuICAgICAgICAvLyDmnKzlnLDmjpLluo/mqKHlvI/vvJrmi7/liLDmlbDmja7lkI7lnKjliY3nq6/mjpLluo9cclxuICAgICAgICBpZiAodGhpcy5zb3J0TW9kZSA9PT0gXCJsb2NhbFwiKSB7XHJcbiAgICAgICAgICB0aGlzLnNvcnREYXRhU291cmNlSW5QbGFjZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9wYWdlSW5mby50b3RhbCA9IHJlc3VsdC50b3RhbCB8fCAwO1xyXG4gICAgICAgIC8vIOWPlua2iOi3qOmhteWkmumAie+8muafpeivouWQjua4heepuumAieS4reeKtuaAgVxyXG4gICAgICAgIGlmICh0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGVkUm93cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwi5p+l6K+i5aSx6LSlOlwiLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gW107XHJcbiAgICAgICAgdGhpcy5fcGFnZUluZm8udG90YWwgPSAwO1xyXG4gICAgICAgIHRoaXMuc3VtbWFyeURhdGEgPSBudWxsO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIHRoaXMuX2xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKFwi5pyq5o+Q5L6bIF9yZXF1ZXN0IOWbnuiwg+WHveaVsFwiKTtcclxuICAgICAgdGhpcy5fbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6Kem5Y+R5YiX5o6S5bqP5Y+Y5pu0XHJcbiAgb25Tb3J0Q2hhbmdlKHNvcnRLZXk6IHN0cmluZywgc29ydE9yZGVyOiBcImFzY2VuZFwiIHwgXCJkZXNjZW5kXCIgfCBudWxsKSB7XHJcbiAgICAvLyDljZXliJfmjpLluo/vvJrph43nva7lhbblroPliJfvvJvlpJrliJfmjpLluo/vvJrkv53nlZnlhbblroPliJdcclxuICAgIGlmICghdGhpcy5tdWx0aXBsZVNvcnQpIHtcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5fc29ydE1hcCkuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKGtleSAhPT0gc29ydEtleSkgdGhpcy5fc29ydE1hcFtrZXldID0gbnVsbDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9zb3J0TWFwW3NvcnRLZXldID0gc29ydE9yZGVyO1xyXG5cclxuICAgIC8vIOe7tOaKpOS8mOWFiOe6p+mYn+WIl++8muacieW6j+WIl+S4lOmdnuepuiAtPiDnva7kuo7mnKvlsL7vvJvkuLrnqbogLT4g56e76ZmkXHJcbiAgICB0aGlzLl9zb3J0UHJpb3JpdHkgPSB0aGlzLl9zb3J0UHJpb3JpdHkuZmlsdGVyKChrKSA9PiBrICE9PSBzb3J0S2V5KTtcclxuICAgIGlmIChzb3J0T3JkZXIpIHtcclxuICAgICAgdGhpcy5fc29ydFByaW9yaXR5LnB1c2goc29ydEtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc29ydE1vZGUgPT09IFwibG9jYWxcIikge1xyXG4gICAgICB0aGlzLnNvcnREYXRhU291cmNlSW5QbGFjZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5Zyo57q/5o6S5bqP77ya6YeN5paw6K+35rGCXHJcbiAgICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFNvcnRPcmRlcihzb3J0S2V5OiBzdHJpbmcpOiBcImFzY2VuZFwiIHwgXCJkZXNjZW5kXCIgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9zb3J0TWFwW3NvcnRLZXldIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVUYWJsZVJvd0NsaWNrKGRhdGE6IGFueSkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IGRhdGE7XHJcbiAgICBpZiAodGhpcy5zaG93Q2hlY2tib3ggJiYgIXRoaXMuaXNSb3dEaXNhYmxlZChkYXRhKSkge1xyXG4gICAgICAvLyDlhYjmuIXnqbrmiYDmnInpgInkuK3ooYxcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzID0gW107XHJcbiAgICAgIGNvbnN0IG5leHRDaGVja2VkID0gIXRoaXMuaXNSb3dDaGVja2VkKGRhdGEpO1xyXG4gICAgICB0aGlzLnRvZ2dsZVJvd0NoZWNrZWQoZGF0YSwgbmV4dENoZWNrZWQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vblJvd0NsaWNrLmVtaXQodGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVUYWJsZVJvd0RiQ2xpY2soZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gZGF0YTtcclxuICAgIHRoaXMub25Sb3dEYkNsaWNrLmVtaXQodGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVDb2x1bW5zU2V0dGluZ0NvbmZpcm0oKSB7XHJcbiAgICB0aGlzLnF1ZXJ5RHluYW1pY0NvbHVtbnMoKTtcclxuICB9XHJcblxyXG4gIC8vIOWkhOeQhiBhdXRvQ29tcGxldGUg6L6T5YWl5LqL5Lu277yI5bim6Ziy5oqW77yJXHJcbiAgaGFuZGxlQXV0b0NvbXBsZXRlSW5wdXQoZXZlbnQ6IEV2ZW50LCBjb2x1bW46IFByb1RhYmxlQ29sdW1uKSB7XHJcbiAgICBjb25zdCBmaWVsZEtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG5cclxuICAgIC8vIOWmguaenOivpeWtl+autei/mOayoeaciemYsuaKluWHveaVsO+8jOWIm+W7uuS4gOS4qlxyXG4gICAgaWYgKCF0aGlzLl9hdXRvQ29tcGxldGVEZWJvdW5jZU1hcC5oYXMoZmllbGRLZXkpKSB7XHJcbiAgICAgIGNvbnN0IGRlYm91bmNlZEZuID0gZGVib3VuY2UoKGV2dDogRXZlbnQpID0+IHtcclxuICAgICAgICAvLyDph43mlrDmn6Xmib7lr7nlupTnmoQgY29sdW1u77yM56Gu5L+d5L2/55So5pyA5paw55qE6YWN572uXHJcbiAgICAgICAgY29uc3QgY3VycmVudENvbHVtbiA9IHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5maW5kKFxyXG4gICAgICAgICAgKGNvbCkgPT4gKGNvbC5maWVsZFByb3BzPy5uYW1lIHx8IGNvbC5wcm9wKSA9PT0gZmllbGRLZXksXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoY3VycmVudENvbHVtbikge1xyXG4gICAgICAgICAgdGhpcy5leGVjdXRlQXV0b0NvbXBsZXRlRGF0YVNvdXJjZShldnQsIGN1cnJlbnRDb2x1bW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgMzAwKTsgLy8gMzAwbXMg6Ziy5oqW5bu26L+fXHJcbiAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURlYm91bmNlTWFwLnNldChmaWVsZEtleSwgZGVib3VuY2VkRm4pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOiwg+eUqOmYsuaKluWHveaVsFxyXG4gICAgY29uc3QgZGVib3VuY2VkRm4gPSB0aGlzLl9hdXRvQ29tcGxldGVEZWJvdW5jZU1hcC5nZXQoZmllbGRLZXkpO1xyXG4gICAgaWYgKGRlYm91bmNlZEZuKSB7XHJcbiAgICAgIGRlYm91bmNlZEZuKGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOiOt+WPliBhdXRvQ29tcGxldGUg55qE5pWw5o2u5rqQXHJcbiAgZ2V0QXV0b0NvbXBsZXRlRGF0YVNvdXJjZShjb2x1bW46IFByb1RhYmxlQ29sdW1uKTogYW55W10ge1xyXG4gICAgY29uc3QgZmllbGRLZXkgPSBjb2x1bW4uZmllbGRQcm9wcz8ubmFtZSB8fCBjb2x1bW4ucHJvcDtcclxuICAgIHJldHVybiB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gfHwgW107XHJcbiAgfVxyXG5cclxuICBnZXRGaWVsZFByb3BzKGNvbHVtbjogUHJvVGFibGVDb2x1bW4pOiBhbnkge1xyXG4gICAgcmV0dXJuIGNvbHVtbi5maWVsZFByb3BzO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W5oyH5a6a5ZCN56ew55qEbGFiZWzmqKHmnb9cclxuICBnZXRMYWJlbFRlbXBsYXRlKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcclxuICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gdGhpcy5jdXN0b21UZW1wbGF0ZXMuZ2V0KG5hbWUpIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5YgZm9ybS1pdGVtIOeahOWKqOaAgeexu+WQjVxyXG4gIGdldEZvcm1JdGVtQ2xhc3NOYW1lKGNvbHVtbjogUHJvVGFibGVDb2x1bW4pOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZmllbGROYW1lID0gdGhpcy5nZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcDtcclxuICAgIHJldHVybiBgcHJvLXRhYmxlLSR7ZmllbGROYW1lfS1mb3JtLWl0ZW1gO1xyXG4gIH1cclxufVxyXG4iLCI8YXBwLXBhZ2UtY29udGFpbmVyXHJcbiAgW3RpdGxlXT1cInRpdGxlXCJcclxuICBbc2hvd0hlYWRlcl09XCJzaG93U2VhcmNoQmFyXCJcclxuICBuZ0NsYXNzPVwicHJvLXRhYmxlLWNvbnRhaW5lclwiXHJcbj5cclxuICA8bmctdGVtcGxhdGUgI2hlYWRlcj5cclxuICAgIDxhcHAtdGFibGUtc2VhcmNoLWJhclxyXG4gICAgICAqbmdJZj1cInNob3dTZWFyY2hCYXJcIlxyXG4gICAgICBbbGFiZWxXaWR0aF09XCJsYWJlbFdpZHRoXCJcclxuICAgICAgW2xhYmVsQWxpZ25dPVwibGFiZWxBbGlnblwiXHJcbiAgICAgIFtmb3JtSXRlbVdpZHRoXT1cImZvcm1JdGVtV2lkdGhcIlxyXG4gICAgPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2xlZnRDb250ZW50PlxyXG4gICAgICAgIDxuei1mb3JtLWl0ZW1cclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgX3NlYXJjaEZpbGVkQ29sdW1uc1wiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRGb3JtSXRlbUNsYXNzTmFtZShjb2x1bW4pXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bnotZm9ybS1sYWJlbCAqbmdJZj1cIiFnZXRGaWVsZFByb3BzKGNvbHVtbikuaGlkZUxhYmVsXCIgbnpOb0NvbG9uPlxyXG4gICAgICAgICAgICA8IS0tIOajgOafpeaYr+WQpuacieiHquWumuS5iWxhYmVs5qih5p2/IC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgIGNvbHVtbi5jdXN0b21MYWJlbFJlbmRlciAmJlxyXG4gICAgICAgICAgICAgICAgICBnZXRMYWJlbFRlbXBsYXRlKGNvbHVtbi5jdXN0b21MYWJlbFJlbmRlcik7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGRlZmF1bHRMYWJlbFxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRMYWJlbFRlbXBsYXRlKGNvbHVtbi5jdXN0b21MYWJlbFJlbmRlcilcIlxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcclxuICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBjb2x1bW4sXHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxyXG4gICAgICAgICAgICAgICAgICBmaWVsZFByb3BzOiBnZXRGaWVsZFByb3BzKGNvbHVtbilcclxuICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExhYmVsPlxyXG4gICAgICAgICAgICAgIHt7IGdldEZpZWxkUHJvcHMoY29sdW1uKS5sYWJlbCB8fCBjb2x1bW4udGl0bGUgfX1cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvbnotZm9ybS1sYWJlbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnaW5wdXQnXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIG56LWlucHV0XHJcbiAgICAgICAgICAgICAgW25hbWVdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikucGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiXHJcbiAgICAgICAgICAgICAgICBfc2VhcmNoUGFyYW1zW2dldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnaW5wdXRQbGF0ZSdcIj5cclxuICAgICAgICAgICAgPGFwcC1wbGF0ZS1pbnB1dFxyXG4gICAgICAgICAgICAgIFtuYW1lXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIlxyXG4gICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+PC9hcHAtcGxhdGUtaW5wdXQ+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnc2VsZWN0J1wiPlxyXG4gICAgICAgICAgICA8bnotc2VsZWN0XHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJcclxuICAgICAgICAgICAgICAgIF9zZWFyY2hQYXJhbXNbZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbbnpBbGxvd0NsZWFyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5hbGxvd0NsZWFyXCJcclxuICAgICAgICAgICAgICBbbnpQbGFjZUhvbGRlcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikucGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtuYW1lXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXCJcclxuICAgICAgICAgICAgICBbbnpPcHRpb25zXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5vcHRpb25zXCJcclxuICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvbnotc2VsZWN0PlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ3NlbGVjdE11bHRpcGxlJ1wiPlxyXG4gICAgICAgICAgICA8bnotc2VsZWN0XHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJcclxuICAgICAgICAgICAgICAgIF9zZWFyY2hQYXJhbXNbZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbbnpBbGxvd0NsZWFyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5hbGxvd0NsZWFyXCJcclxuICAgICAgICAgICAgICBbbnpQbGFjZUhvbGRlcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikucGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtuYW1lXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXCJcclxuICAgICAgICAgICAgICBbbnpPcHRpb25zXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5vcHRpb25zXCJcclxuICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIG56TW9kZT1cIm11bHRpcGxlXCJcclxuICAgICAgICAgICAgICBbbnpNYXhUYWdDb3VudF09XCIyXCJcclxuICAgICAgICAgICAgICBbbnpNYXhUYWdQbGFjZWhvbGRlcl09XCJuek1heFRhZ1BsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICBbbnpDdXN0b21UZW1wbGF0ZV09XCJkZWZhdWx0VGVtcGxhdGVcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNuek1heFRhZ1BsYWNlaG9sZGVyPlxyXG4gICAgICAgICAgICAgICAgK1xyXG4gICAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICAgICAgICA/Lmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRlbXBsYXRlIGxldC1zZWxlY3RlZD5cclxuICAgICAgICAgICAgICAgIHt7IHNlbGVjdGVkLm56TGFiZWwubGVuZ3RoID4gNCA/IHNlbGVjdGVkLm56TGFiZWwuc3Vic3RyaW5nKDAsIDQpICsgJy4uLicgOiBzZWxlY3RlZC5uekxhYmVsIH19XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9uei1zZWxlY3Q+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnZGF0ZSdcIj5cclxuICAgICAgICAgICAgPG56LWRhdGUtcGlja2VyXHJcbiAgICAgICAgICAgICAgW256U2hvd1RpbWVdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLnNob3dUaW1lXCJcclxuICAgICAgICAgICAgICBbbnpGb3JtYXRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmZvcm1hdFwiXHJcbiAgICAgICAgICAgICAgW256UGxhY2VIb2xkZXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLnBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICBbbnpBbGxvd0NsZWFyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5hbGxvd0NsZWFyXCJcclxuICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiXHJcbiAgICAgICAgICAgICAgICBfc2VhcmNoUGFyYW1zW2dldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW256TW9kZV09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikubW9kZVwiXHJcbiAgICAgICAgICAgID48L256LWRhdGUtcGlja2VyPlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ2NoZWNrYm94J1wiPlxyXG4gICAgICAgICAgICA8bnotY2hlY2tib3gtZ3JvdXBcclxuICAgICAgICAgICAgICBbY2xhc3NdPVwiXHJcbiAgICAgICAgICAgICAgICBnZXRGaWVsZFByb3BzKGNvbHVtbikubm9TdHlsZVxyXG4gICAgICAgICAgICAgICAgICA/ICdwcm8tdGFibGUtY2hlY2tib3hncm91cC1ub3N0eWxlJ1xyXG4gICAgICAgICAgICAgICAgICA6ICcnXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5vcHRpb25zXCJcclxuICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxyXG4gICAgICAgICAgICAgICAgaGFuZGxlRmllbGRDaGVja0JveENoYW5nZShcclxuICAgICAgICAgICAgICAgICAgJGV2ZW50LFxyXG4gICAgICAgICAgICAgICAgICBnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID48L256LWNoZWNrYm94LWdyb3VwPlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ2F1dG9Db21wbGV0ZSdcIj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgbnotaW5wdXRcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIlxyXG4gICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbik/Lm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwiaGFuZGxlQXV0b0NvbXBsZXRlSW5wdXQoJGV2ZW50LCBjb2x1bW4pXCJcclxuICAgICAgICAgICAgICBbbnpBdXRvY29tcGxldGVdPVwiYXV0b1wiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKT8uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbik/LnBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPG56LWF1dG9jb21wbGV0ZVxyXG4gICAgICAgICAgICAgIFtuekJhY2tmaWxsXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5iYWNrRmlsbFwiXHJcbiAgICAgICAgICAgICAgW256RGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uXT1cIlxyXG4gICAgICAgICAgICAgICAgZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvblxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW256V2lkdGhdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLndpZHRoXCJcclxuICAgICAgICAgICAgICAjYXV0b1xyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG56LWF1dG8tb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGdldEF1dG9Db21wbGV0ZURhdGFTb3VyY2UoY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICBbbnpWYWx1ZV09XCJcclxuICAgICAgICAgICAgICAgICAgZ2V0RmllbGRQcm9wcyhjb2x1bW4pLnJldHVybkZ1bGxEYXRhID8gb3B0aW9uIDogb3B0aW9uLnZhbHVlXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgW256TGFiZWxdPVwib3B0aW9uLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgIFtuekRpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3sgb3B0aW9uLmxhYmVsIH19XHJcbiAgICAgICAgICAgICAgPC9uei1hdXRvLW9wdGlvbj5cclxuICAgICAgICAgICAgPC9uei1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnY3VzdG9tJ1wiPlxyXG4gICAgICAgICAgICA8YXBwLWR5bmFtaWMtc2VhcmNoLWZpZWxkXHJcbiAgICAgICAgICAgICAgW2NvbXBvbmVudF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICBbdmFsdWVdPVwiX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cIlxyXG4gICAgICAgICAgICAgIFtwcm9wc109XCJnZXRGaWVsZFByb3BzKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJcclxuICAgICAgICAgICAgICAgIHNldEZpZWxkVmFsdWUoZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3AsICRldmVudClcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+PC9hcHAtZHluYW1pYy1zZWFyY2gtZmllbGQ+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnaW5wdXROdW1iZXInXCI+XHJcbiAgICAgICAgICAgIDxuei1pbnB1dC1udW1iZXJcclxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiJzEwMCUnXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIlxyXG4gICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtuelBsYWNlSG9sZGVyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5wbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICBbbnpGb3JtYXR0ZXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmZvcm1hdHRlclBlcmNlbnRcIlxyXG4gICAgICAgICAgICAgIFtuelBhcnNlcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikucGFyc2VyUGVyY2VudFwiXHJcbiAgICAgICAgICAgID48L256LWlucHV0LW51bWJlcj5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgIDwvbnotZm9ybS1pdGVtPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2FjdGlvblRleHRCdG4+XHJcbiAgICAgICAgPG56LXNwYWNlIFtuelNpemVdPVwiNFwiPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIG56U3BhY2VJdGVtICpuZ0lmPVwic2hvd1NlYXJjaEJ0blwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG56LWJ1dHRvbiBuelR5cGU9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImhhbmRsZVNlYXJjaCgpXCI+XHJcbiAgICAgICAgICAgICAge3sgY29uZmlybUJ0blRleHQgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIG56U3BhY2VJdGVtICpuZ0lmPVwic2hvd0NsZWFyQnRuXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbnotYnV0dG9uIChjbGljayk9XCJoYW5kbGVSZXNldEZvcm0oKVwiPlxyXG4gICAgICAgICAgICAgIHt7IGNsZWFyQnRuVGV4dCB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9uei1zcGFjZT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlICNhY3Rpb25JbWdCdG4+XHJcbiAgICAgICAgPG56LXNwYWNlPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImltZ0FjdGlvbkJhclRwbFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIG56U3BhY2VJdGVtIGNsYXNzPVwic2V0dGluZy1zcGFjZS1pdGVtXCIgKm5nSWY9XCJzaG93Q29sdW1uU2V0dGluZ1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBuei10b29sdGlwIG56VG9vbHRpcFRpdGxlPVwi6K6+572u5a2X5q61XCI+XHJcbiAgICAgICAgICAgICAgPGFwcC1jb2xtdW5zLXNldHRpbmdcclxuICAgICAgICAgICAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgICAgW3NlbGVjdGVkQ29sdW1uc109XCJfc2VydmVyQ29sdW1uc1wiXHJcbiAgICAgICAgICAgICAgICBbdGFibGVOYW1lXT1cInRhYmxlTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAoYWZ0ZXJDb25maXJtKT1cImhhbmRsZUNvbHVtbnNTZXR0aW5nQ29uZmlybSgpXCJcclxuICAgICAgICAgICAgICA+PC9hcHAtY29sbXVucy1zZXR0aW5nPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbnotc3BhY2U+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2FwcC10YWJsZS1zZWFyY2gtYmFyPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSAjYm9keT5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93QWN0aW9uQmFyXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFjdGlvbkJhclRwbFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1c3RvbVRhYmxlUmVuZGVyXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UYWJsZVJlbmRlclwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bnotdGFibGVcclxuICAgICAgKm5nSWY9XCIhY3VzdG9tVGFibGVSZW5kZXIgJiYgX3Nob3dUYWJsZSAmJiBfY29sdW1uc1JlYWR5XCJcclxuICAgICAgI2R5bmFtaWNUYWJsZVxyXG4gICAgICBuelNpemU9XCJzbWFsbFwiXHJcbiAgICAgIG56U2hvd1NpemVDaGFuZ2VyXHJcbiAgICAgIFtuekJvcmRlcmVkXT1cImJvcmRlcmVkXCJcclxuICAgICAgW256T3V0ZXJCb3JkZXJlZF09XCJvdXRlckJvcmRlcmVkXCJcclxuICAgICAgW256RGF0YV09XCJkYXRhU291cmNlXCJcclxuICAgICAgW256UGFnZUluZGV4XT1cIl9wYWdlSW5mby5wYWdlSW5kZXhcIlxyXG4gICAgICBbbnpQYWdlU2l6ZV09XCJfcGFnZUluZm8ucGFnZVNpemVcIlxyXG4gICAgICBbbnpUb3RhbF09XCJfcGFnZUluZm8udG90YWxcIlxyXG4gICAgICBbbnpQYWdlU2l6ZU9wdGlvbnNdPVwiX3BhZ2VJbmZvLnBhZ2VTaXplT3B0aW9uc1wiXHJcbiAgICAgIFtuelNob3dQYWdpbmF0aW9uXT1cInNob3dQYWdpbmF0aW9uXCJcclxuICAgICAgW256U2hvd1RvdGFsXT1cInRvdGFsVGVtcGxhdGVcIlxyXG4gICAgICBbbnpMb2FkaW5nXT1cIl9sb2FkaW5nXCJcclxuICAgICAgW256RnJvbnRQYWdpbmF0aW9uXT1cImZyb250UGFnaW5hdGlvblwiXHJcbiAgICAgIFtuelNjcm9sbF09XCJzY3JvbGxcIlxyXG4gICAgICAobnpQYWdlSW5kZXhDaGFuZ2UpPVwiaGFuZGxlUGFnZUluZGV4Q2hhbmdlKCRldmVudClcIlxyXG4gICAgICAobnpQYWdlU2l6ZUNoYW5nZSk9XCJoYW5kbGVQYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgID5cclxuICAgICAgPHRoZWFkPlxyXG4gICAgICAgIDx0cj5cclxuICAgICAgICAgIDwhLS0g5aSN6YCJ5qGG5YiX77yI5b2TIHNob3dDaGVja2JveD10cnVlIOaXtuaYvuekuu+8iSAtLT5cclxuICAgICAgICAgIDx0aFxyXG4gICAgICAgICAgICAqbmdJZj1cInNob3dDaGVja2JveFwiXHJcbiAgICAgICAgICAgIFtueldpZHRoXT1cIic1MHB4J1wiXHJcbiAgICAgICAgICAgIFtuekFsaWduXT1cIidjZW50ZXInXCJcclxuICAgICAgICAgICAgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXJcIlxyXG4gICAgICAgICAgICBbKG56Q2hlY2tlZCldPVwiX2NoZWNrZWRBbGxcIlxyXG4gICAgICAgICAgICBbbnpJbmRldGVybWluYXRlXT1cIl9pbmRldGVybWluYXRlXCJcclxuICAgICAgICAgICAgKG56Q2hlY2tlZENoYW5nZSk9XCJ0b2dnbGVDaGVja0FsbCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICA+PC90aD5cclxuICAgICAgICAgIDx0aFxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIF9jb2x1bW5zXCJcclxuICAgICAgICAgICAgW256V2lkdGhdPVwiY29sdW1uLndpZHRoXCJcclxuICAgICAgICAgICAgW256QWxpZ25dPVwiY29sdW1uLmFsaWduXCJcclxuICAgICAgICAgICAgW256TGVmdF09XCJjb2x1bW4uZml4ZWRMZWZ0XCJcclxuICAgICAgICAgICAgW256UmlnaHRdPVwiY29sdW1uLmZpeGVkUmlnaHRcIlxyXG4gICAgICAgICAgICBbbnpTaG93U29ydF09XCIhIWNvbHVtbi5zb3J0ZXJcIlxyXG4gICAgICAgICAgICBbbnpTb3J0T3JkZXJdPVwiZ2V0U29ydE9yZGVyKGNvbHVtbi5wcm9wKVwiXHJcbiAgICAgICAgICAgIChuelNvcnRPcmRlckNoYW5nZSk9XCJvblNvcnRDaGFuZ2UoY29sdW1uLnByb3AsICRldmVudClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBjb2x1bW4udGl0bGUgfX1cclxuICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC90aGVhZD5cclxuXHJcbiAgICAgIDx0Ym9keT5cclxuICAgICAgICA8dHJcclxuICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCJcclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBkYXRhOyBsZXQgaSA9IGluZGV4OyBvZjogZHluYW1pY1RhYmxlLmRhdGFcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAnYW50LXRhYmxlLWN1c3RvbS1yb3ctc2VsZWN0ZWQnOiAhIWdldFRhYmxlUm93Q2hlY2tlZChkYXRhKSxcclxuICAgICAgICAgICAgJ2FudC10YWJsZS1jdXN0b20tcm93LWV2ZW4nOiBpICUgMiA9PT0gMCxcclxuICAgICAgICAgICAgJ2FudC10YWJsZS1jdXN0b20tcm93LW9kZCc6IGkgJSAyICE9PSAwXHJcbiAgICAgICAgICB9XCJcclxuICAgICAgICAgIChjbGljayk9XCJoYW5kbGVUYWJsZVJvd0NsaWNrKGRhdGEpXCJcclxuICAgICAgICAgIChkYmxjbGljayk9XCJoYW5kbGVUYWJsZVJvd0RiQ2xpY2soZGF0YSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDwhLS0g5aSN6YCJ5qGG5YiX77yI5b2TIHNob3dDaGVja2JveD10cnVlIOaXtuaYvuekuu+8iSAtLT5cclxuICAgICAgICAgIDx0ZFxyXG4gICAgICAgICAgICAqbmdJZj1cInNob3dDaGVja2JveFwiXHJcbiAgICAgICAgICAgIFtuekFsaWduXT1cIidjZW50ZXInXCJcclxuICAgICAgICAgICAgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IHdpZHRoOiA1MHB4XCJcclxuICAgICAgICAgICAgWyhuekNoZWNrZWQpXT1cImRhdGEuY2hlY2tlZFwiXHJcbiAgICAgICAgICAgIFtuekRpc2FibGVkXT1cImlzUm93RGlzYWJsZWQoZGF0YSlcIlxyXG4gICAgICAgICAgICAobnpDaGVja2VkQ2hhbmdlKT1cImhhbmRsZVJvd0NoZWNrZWRDaGFuZ2UoZGF0YSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgPjwvdGQ+XHJcbiAgICAgICAgICA8dGRcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBfY29sdW1uc1wiXHJcbiAgICAgICAgICAgIFtuekxlZnRdPVwiY29sdW1uLmZpeGVkTGVmdFwiXHJcbiAgICAgICAgICAgIFtuelJpZ2h0XT1cImNvbHVtbi5maXhlZFJpZ2h0XCJcclxuICAgICAgICAgICAgW256QWxpZ25dPVwiY29sdW1uLmFsaWduXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICdwcm8tbm93cmFwJzogdHJ1ZVxyXG4gICAgICAgICAgICB9XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPCEtLSDmo4Dmn6XmmK/lkKbmnInoh6rlrprkuYnmqKHmnb8gLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgY29sdW1uLmN1c3RvbVJlbmRlciAmJiBnZXRUZW1wbGF0ZShjb2x1bW4uY3VzdG9tUmVuZGVyKTtcclxuICAgICAgICAgICAgICAgIGxldCB0ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogZGF0YSxcclxuICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sXHJcbiAgICAgICAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICAgICAgICBwYWdlSW5mbzogX3BhZ2VJbmZvXHJcbiAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8IS0tIOm7mOiupOa4suafk+mAu+i+kSAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWNvbHVtbi5jdXN0b21SZW5kZXIgfHwgIWdldFRlbXBsYXRlKGNvbHVtbi5jdXN0b21SZW5kZXIpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4uZWxsaXBzaXNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcm8tZWxsaXBzaXNcIlxyXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZGF0YVtjb2x1bW4ucHJvcF1cIlxyXG4gICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICdjYWxjKCcgKyBjb2x1bW4ud2lkdGggKyAnIC0gMjVweCknXHJcbiAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICB7eyBkYXRhW2NvbHVtbi5wcm9wXSB9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2x1bW4uZWxsaXBzaXNcIj5cclxuICAgICAgICAgICAgICAgIHt7IGRhdGFbY29sdW1uLnByb3BdIH19XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICAgIDx0ciAqbmdJZj1cInN1bW1hcnlEYXRhICYmIF9wYWdlSW5mby50b3RhbCA+IDBcIj5cclxuICAgICAgICAgIDwhLS0g5rGH5oC76KGM55qE5aSN6YCJ5qGG5YiX77yI5b2TIHNob3dDaGVja2JveD10cnVlIOaXtuaYvuekuu+8jOS9huS4uuepuu+8iSAtLT5cclxuICAgICAgICAgIDx0ZFxyXG4gICAgICAgICAgICAqbmdJZj1cInNob3dDaGVja2JveFwiXHJcbiAgICAgICAgICAgIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGQ7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlOGU4ZThcIlxyXG4gICAgICAgICAgPjwvdGQ+XHJcbiAgICAgICAgICA8dGRcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbjsgbGV0IGkgPSBpbmRleDsgb2Y6IF9jb2x1bW5zXCJcclxuICAgICAgICAgICAgW256TGVmdF09XCJjb2x1bW4uZml4ZWRMZWZ0XCJcclxuICAgICAgICAgICAgW256UmlnaHRdPVwiY29sdW1uLmZpeGVkUmlnaHRcIlxyXG4gICAgICAgICAgICBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkOyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZThlOGU4XCJcclxuICAgICAgICAgICAgW256QWxpZ25dPVwiY29sdW1uLmFsaWduXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpID09PSAwXCI+5oC76K6hPC9zcGFuPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaSAhPT0gMCAmJiBjb2x1bW4uc3VtbWFyeVwiPlxyXG4gICAgICAgICAgICAgIHt7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW4uc3VtbWFyeT8uZm9ybWF0XHJcbiAgICAgICAgICAgICAgICAgID8gY29sdW1uLnN1bW1hcnk/LmZvcm1hdChcclxuICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlEYXRhW2NvbHVtbi5zdW1tYXJ5Py5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgOiBzdW1tYXJ5RGF0YVtjb2x1bW4uc3VtbWFyeT8ubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC90Ym9keT5cclxuICAgICAgPG5nLXRlbXBsYXRlICN0b3RhbFRlbXBsYXRlIGxldC10b3RhbFxyXG4gICAgICAgID7lhbEge3sgX3BhZ2VJbmZvLnRvdGFsIH19IOadoeiusOW9lTwvbmctdGVtcGxhdGVcclxuICAgICAgPlxyXG4gICAgPC9uei10YWJsZT5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L2FwcC1wYWdlLWNvbnRhaW5lcj5cclxuIl19