@yibozhang/pro-table 11.0.2 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -885,8 +885,9 @@ export class ProTableComponent {
885
885
  });
886
886
  }
887
887
  else {
888
- this._searchParams[key] = (targetColumn === null || targetColumn === void 0 ? void 0 : targetColumn.fieldProps) ? (targetColumn === null || targetColumn === void 0 ? void 0 : targetColumn.fieldProps.value) ||
889
- PRO_TABLE_DEFAULT_PROPS[targetColumn.valueType].value
888
+ this._searchParams[key] = (targetColumn === null || targetColumn === void 0 ? void 0 : targetColumn.fieldProps)
889
+ ? (targetColumn === null || targetColumn === void 0 ? void 0 : targetColumn.fieldProps.value) ||
890
+ PRO_TABLE_DEFAULT_PROPS[targetColumn.valueType].value
890
891
  : PRO_TABLE_DEFAULT_PROPS[targetColumn.valueType].value;
891
892
  }
892
893
  });
@@ -1074,8 +1075,8 @@ export class ProTableComponent {
1074
1075
  ProTableComponent.decorators = [
1075
1076
  { type: Component, args: [{
1076
1077
  selector: "app-pro-table",
1077
- 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 >\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 <nz-space-item *ngIf=\"showSearchBtn\">\r\n <button nz-button nzType=\"primary\" (click)=\"handleSearch()\">\r\n {{ confirmBtnText }}\r\n </button>\r\n </nz-space-item>\r\n <nz-space-item *ngIf=\"showClearBtn\">\r\n <button nz-button (click)=\"handleResetForm()\">\r\n {{ clearBtnText }}\r\n </button>\r\n </nz-space-item>\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 <nz-space-item 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 </nz-space-item>\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\"\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",
1078
- 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-tbody>tr>td:first-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th: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,::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-tbody>tr>td:last-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th: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}"]
1078
+ 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 >\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\"\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",
1079
+ 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"]
1079
1080
  },] }
1080
1081
  ];
1081
1082
  ProTableComponent.ctorParameters = () => [
@@ -1118,4 +1119,4 @@ ProTableComponent.propDecorators = {
1118
1119
  imgActionBarTpl: [{ type: ContentChild, args: ["ImgActionBar",] }],
1119
1120
  allTemplates: [{ type: ContentChildren, args: [TemplateRef,] }]
1120
1121
  };
1121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byby10YWJsZS9zcmMvbGliL3Byby10YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN2RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFXaEYsT0FBTyxFQUFFLHVCQUF1QixFQUErQixNQUFNLFVBQVUsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBT3BDLE1BQU0sT0FBTyxpQkFBaUI7SUFtSTVCLFlBR1UsWUFBZ0Q7UUFBaEQsaUJBQVksR0FBWixZQUFZLENBQW9DO1FBcklqRCxrQkFBYSxHQUFZLElBQUksQ0FBQztRQUU5QixpQkFBWSxHQUFZLElBQUksQ0FBQztRQUU3QixVQUFLLEdBQWtCLElBQUksQ0FBQztRQUU1QixjQUFTLEdBQVcsRUFBRSxDQUFDO1FBRXZCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFMUIsWUFBTyxHQUFxQixFQUFFLENBQUM7UUFFL0Isa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFFOUIsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFFOUIsbUJBQWMsR0FBVyxJQUFJLENBQUM7UUFFOUIsaUJBQVksR0FBVyxJQUFJLENBQUM7UUFFNUIsZUFBVSxHQUFXLE1BQU0sQ0FBQztRQUU1QixlQUFVLEdBQVcsT0FBTyxDQUFDO1FBRTdCLGtCQUFhLEdBQVcs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SztnQ0FFTCxLQUFLOzJCQUdMLEtBQUs7MkJBRUwsS0FBSzswQkFHTCxLQUFLO2lDQUdMLEtBQUs7Z0NBRUwsS0FBSzt5QkFFTCxNQUFNOzJCQUVOLE1BQU07NkJBRU4sTUFBTTtzQ0FFTixNQUFNOzJCQUVOLFlBQVksU0FBQyxXQUFXOzhCQUV4QixZQUFZLFNBQUMsY0FBYzsyQkFFM0IsZUFBZSxTQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyQ29udGVudEluaXQsXHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbnRlbnRDaGlsZCxcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBUZW1wbGF0ZVJlZixcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBjbG9uZURlZXAsIGhhc0luLCBpc05pbCwgZGVib3VuY2UsIGlzRXF1YWwgfSBmcm9tIFwibG9kYXNoLWVzXCI7XHJcbmltcG9ydCB7IFBST19UQUJMRV9ERUZBVUxUX0NPTFVNTiwgUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHtcclxuICBBdXRvQ29tcGxldGVGaWVsZFByb3BzLFxyXG4gIENoZWNrYm94RmllbGRQcm9wcyxcclxuICBPcHRpb25zVHlwZSxcclxuICBQcm9UYWJsZUNvbHVtbixcclxuICBQcm9UYWJsZVBhZ2VJbmZvLFxyXG4gIFByb1RhYmxlUmVxdWVzdFJlc3VsdCxcclxuICBQcm9UYWJsZVZhbHVlc0NoYW5nZSxcclxuICBTZWxlY3RGaWVsZFByb3BzLFxyXG59IGZyb20gXCIuL3R5cGVcIjtcclxuaW1wb3J0IHsgUFJPX1RBQkxFX0NPTFVNTl9SRU1PVEUsIFByb1RhYmxlUmVtb3RlQ29sdW1uU2VydmljZSB9IGZyb20gXCIuL3Rva2Vuc1wiO1xyXG5pbXBvcnQgeyBpc09ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiYXBwLXByby10YWJsZVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vcHJvLXRhYmxlLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL3Byby10YWJsZS5jb21wb25lbnQubGVzc1wiXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFByb1RhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcclxuICBASW5wdXQoKSBzaG93U2VhcmNoQnRuOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgc2hvd0NsZWFyQnRuOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBASW5wdXQoKSB0YWJsZU5hbWU6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIEBJbnB1dCgpIG11bHRpUm93OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkgc2hvd1NlYXJjaEJhcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dBY3Rpb25CYXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBjb25maXJtQnRuVGV4dDogc3RyaW5nID0gXCLmn6Xor6JcIjtcclxuXHJcbiAgQElucHV0KCkgY2xlYXJCdG5UZXh0OiBzdHJpbmcgPSBcIua4heepulwiO1xyXG5cclxuICBASW5wdXQoKSBsYWJlbFdpZHRoOiBzdHJpbmcgPSBcIjkwcHhcIjtcclxuXHJcbiAgQElucHV0KCkgbGFiZWxBbGlnbjogc3RyaW5nID0gXCJyaWdodFwiO1xyXG5cclxuICBASW5wdXQoKSBmb3JtSXRlbVdpZHRoOiBzdHJpbmcgPSBcIjI3MHB4XCI7XHJcblxyXG4gIEBJbnB1dCgpIGRhdGFTb3VyY2U6IGFueVtdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIGJvcmRlcmVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgb3V0ZXJCb3JkZXJlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dQYWdpbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgZnJvbnRQYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHNjcm9sbDogeyB4Pzogc3RyaW5nIHwgbnVtYmVyOyB5Pzogc3RyaW5nIHwgbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQElucHV0KCkgcmVxdWVzdDogKHBhcmFtczogYW55KSA9PiBQcm9taXNlPFByb1RhYmxlUmVxdWVzdFJlc3VsdD47XHJcblxyXG4gIEBJbnB1dCgpIHN1bW1hcnlEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8vIOaOkuW6j+aooeW8j++8mmxvY2FsIOacrOWcsOaOkuW6j++8m3NlcnZlciDlnKjnur/mjpLluo/vvIjmj5DkuqTnu5nmjqXlj6PvvIlcclxuICBASW5wdXQoKSBzb3J0TW9kZTogXCJsb2NhbFwiIHwgXCJzZXJ2ZXJcIiA9IFwibG9jYWxcIjtcclxuXHJcbiAgQElucHV0KCkgc2hvd0NvbHVtblNldHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8g5piv5ZCm5byA5ZCv5aSa5YiX5o6S5bqP77yI6buY6K6k5Y2V5YiX77yJXHJcbiAgQElucHV0KCkgbXVsdGlwbGVTb3J0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dDaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyDliKTmlq3ooYzmmK/lkKbnpoHnlKjnmoTlh73mlbBcclxuICBASW5wdXQoKSByb3dEaXNhYmxlZDogKGRhdGE6IGFueSkgPT4gYm9vbGVhbiA9ICgpID0+IGZhbHNlO1xyXG5cclxuICAvLyDmmK/lkKboh6rliqjop6blj5Hor7fmsYJcclxuICBASW5wdXQoKSBhdXRvVHJpZ2dlclJlcXVlc3Q6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBjdXN0b21UYWJsZVJlbmRlcj86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIEBPdXRwdXQoKSBvblJvd0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBvblJvd0RiQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIG9uVmFsdWVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQcm9UYWJsZVZhbHVlc0NoYW5nZT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIG9uUmVzZXRGb3JtQmVmb3JlUmVsb2FkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoXCJhY3Rpb25CYXJcIikgYWN0aW9uQmFyVHBsITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChcIkltZ0FjdGlvbkJhclwiKSBpbWdBY3Rpb25CYXJUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlUmVmKSBhbGxUZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XHJcblxyXG4gIHByaXZhdGUgX3NhdmVkU2VhcmNoUGFyYW1zOiBhbnkgPSB7fTtcclxuXHJcbiAgLy8g5a2Y5YKo5omA5pyJ6Ieq5a6a5LmJ5qih5p2/55qE5byV55SoXHJcbiAgcHJpdmF0ZSBjdXN0b21UZW1wbGF0ZXMgPSBuZXcgTWFwPHN0cmluZywgVGVtcGxhdGVSZWY8YW55Pj4oKTtcclxuXHJcbiAgLy8g6K6w5b2V5ZCE5YiX5o6S5bqP54q25oCB77yaJ2FzY2VuZCcgfCAnZGVzY2VuZCcgfCBudWxsXHJcblxyXG4gIHByaXZhdGUgX3NvcnRNYXA6IFJlY29yZDxzdHJpbmcsIFwiYXNjZW5kXCIgfCBcImRlc2NlbmRcIiB8IG51bGw+ID0ge307XHJcblxyXG4gIC8vIOiusOW9leWkmuWIl+aOkuW6j+eahOS8mOWFiOe6p++8iOWQjuiuvue9rueahOS8mOWFiO+8iVxyXG4gIHByaXZhdGUgX3NvcnRQcmlvcml0eTogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgLy8g5a2Y5YKo5q+P5LiqIGF1dG9Db21wbGV0ZSDlrZfmrrXnmoTpmLLmipblh73mlbBcclxuICBwcml2YXRlIF9hdXRvQ29tcGxldGVEZWJvdW5jZU1hcDogTWFwPHN0cmluZywgKGV2ZW50OiBFdmVudCkgPT4gdm9pZD4gPVxyXG4gICAgbmV3IE1hcCgpO1xyXG5cclxuICAvLyDku4XlnKjliJ3lp4vljJbml7bov5DooYzliJfphY3nva7pooTmo4Dmn6XvvIzpgb/lhY3lkI7nu63osIPnlKjph43lpI3op6blj5FcclxuICBwcml2YXRlIF9wcmVDaGVja0RvbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgX2NvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgLy8g562b6YCJ6KGo5Y2V5pWw5o2u5a2Y5YKoXHJcbiAgX3NlYXJjaFBhcmFtczogYW55ID0ge307XHJcblxyXG4gIC8vIOetm+mAieihqOWNlWxpc3TmuLLmn5PmlbDmja5cclxuICBfc2VhcmNoRmlsZWRDb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcblxyXG4gIF9wYWdlSW5mbzogUHJvVGFibGVQYWdlSW5mbyA9IHtcclxuICAgIHBhZ2VJbmRleDogMSxcclxuICAgIHBhZ2VTaXplOiAxNSxcclxuICAgIHRvdGFsOiAxMDAsXHJcbiAgICBwYWdlU2l6ZU9wdGlvbnM6IFsxMCwgMTUsIDIwLCA1MCwgMTAwLCA1MDAsIDEwMDBdLFxyXG4gIH07XHJcblxyXG4gIF9sb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIF9zZWxlY3RlZFRhYmxlUm93OiBhbnkgPSBudWxsO1xyXG5cclxuICAvLyDpgInkuK3nmoTooYzmlbDmja7vvIjnlKjkuo7lpI3pgInmoYbpgInmi6nvvIktIOS/neeVmeeUqOS6juWFvOWuueaAp1xyXG4gIF9zZWxlY3RlZFJvd3M6IGFueVtdID0gW107XHJcblxyXG4gIC8vIOS9v+eUqCBTZXQg5a2Y5YKo6YCJ5Lit6aG555qEIElE77yM5pSv5oyB6Leo6aG16YCJ5LitXHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSb3dJZHMgPSBuZXcgU2V0PHN0cmluZyB8IG51bWJlcj4oKTtcclxuXHJcbiAgLy8g5YWo6YCJ54q25oCBXHJcbiAgX2NoZWNrZWRBbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8g5Y2K6YCJ54q25oCB77yI6YOo5YiG6YCJ5Lit77yJXHJcbiAgX2luZGV0ZXJtaW5hdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8g6L+c56iLY29sdW1uc1xyXG4gIF9zZXJ2ZXJDb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcblxyXG4gIC8vIOWtmOWCqCBhdXRvQ29tcGxldGUg5a2X5q6155qE5pWw5o2u5rqQXHJcbiAgX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBhbnlbXT4gPSB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBAT3B0aW9uYWwoKVxyXG4gICAgQEluamVjdChQUk9fVEFCTEVfQ09MVU1OX1JFTU9URSlcclxuICAgIHByaXZhdGUgY29sdW1uUmVtb3RlOiBQcm9UYWJsZVJlbW90ZUNvbHVtblNlcnZpY2UgfCBudWxsXHJcbiAgKSB7fVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGZldGNoUmVtb3RlQ29sdW1ucygpIHtcclxuICAgIGlmICghdGhpcy5jb2x1bW5SZW1vdGU/LmdldENvbCB8fCAhdGhpcy50YWJsZU5hbWUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNvbHVtblJlbW90ZS5nZXRDb2wodGhpcy50YWJsZU5hbWUsIHRoaXMubXVsdGlSb3cpO1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHBlcnNpc3RSZW1vdGVDb2x1bW5zKGNvbHVtbnM6IGFueVtdKSB7XHJcbiAgICBpZiAoIXRoaXMuY29sdW1uUmVtb3RlPy5zZXRDb2wgfHwgIXRoaXMudGFibGVOYW1lKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb2x1bW5SZW1vdGUuc2V0Q29sKFxyXG4gICAgICAgIHRoaXMudGFibGVOYW1lLFxyXG4gICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgdGhpcy5tdWx0aVJvd1xyXG4gICAgICApO1xyXG4gICAgICBpZiAocmVzdWx0ICYmIGlzT2JzZXJ2YWJsZShyZXN1bHQpKSB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3VsdC50b1Byb21pc2UoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtcyA9IHt9O1xyXG4gICAgdGhpcy5mb3JtYXRlSW5uZXJDb2x1bW5zKHRoaXMuY29sdW1ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnNldFNlYXJjaFBhcmFtcyh0aGlzLmNvbHVtbnMpO1xyXG5cclxuICAgIC8vIOS9v+eUqCBQcm94eSDljIXoo4UgX3NlYXJjaFBhcmFtc++8jOaLpuaIquihqOWNlemhueWAvOWPmOWMluW5tuWQkeWkluWPkeWHuuS6i+S7tlxyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zID0gdGhpcy5jcmVhdGVTZWFyY2hQYXJhbXNQcm94eSh0aGlzLl9zZWFyY2hQYXJhbXMpO1xyXG4gICAgaWYgKHRoaXMuYXV0b1RyaWdnZXJSZXF1ZXN0KSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICAgIH1cclxuICAgIHRoaXMucXVlcnlEeW5hbWljQ29sdW1ucygpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xyXG4gICAgLy8g6Ieq5Yqo5rOo5YaM5omA5pyJ6Ieq5a6a5LmJ5qih5p2/XHJcbiAgICAvLyDms6jmhI/vvJrmraTml7bmiYDmnIkgQ29udGVudENoaWxkIOWSjCBDb250ZW50Q2hpbGRyZW4g6YO95bey5Yid5aeL5YyW5a6M5oiQXHJcbiAgICB0aGlzLmF1dG9SZWdpc3RlclRlbXBsYXRlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwcmVDaGVja1NlcnZlckNvbHVtbnMoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmZldGNoUmVtb3RlQ29sdW1ucygpO1xyXG4gICAgaWYgKCFyZXMpIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IGluaXRDb2x1bW5zID0gdGhpcy5jb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gIWNvbC5hdXhpbGlhcnlDb2x1bW4pXHJcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBmaWVsZDogY29sdW1uLnByb3AsXHJcbiAgICAgICAgICBpc1Nob3c6ICFjb2x1bW4uaGlkZUluVGFibGUsIC8vIOm7mOiupOWFqOmDqOaYvuekulxyXG4gICAgICAgICAgaGVhZGVyOiBjb2x1bW4udGl0bGUsXHJcbiAgICAgICAgICBzb3J0TmFtZTogY29sdW1uLnNvcnROYW1lIHx8IG51bGwsXHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICBpZiAocmVzLmNvZGUgPT09IDApIHtcclxuICAgICAgaWYgKCFpc0VxdWFsKHJlcy5kYXRhLnRhYkNvbHVtbiwgaW5pdENvbHVtbnMpKSB7XHJcbiAgICAgICAgY29uc3QgaW5pdFJlcyA9IGF3YWl0IHRoaXMucGVyc2lzdFJlbW90ZUNvbHVtbnMoaW5pdENvbHVtbnMpO1xyXG4gICAgICAgIGlmIChpbml0UmVzKSB7XHJcbiAgICAgICAgICB0aGlzLnF1ZXJ5RHluYW1pY0NvbHVtbnMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIuS4gOiHtFwiKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBxdWVyeUR5bmFtaWNDb2x1bW5zKCkge1xyXG4gICAgaWYgKCF0aGlzLnRhYmxlTmFtZSB8fCAhdGhpcy5jb2x1bW5SZW1vdGUpIHJldHVybjtcclxuICAgIGlmICghdGhpcy5fcHJlQ2hlY2tEb25lKSB7XHJcbiAgICAgIGNvbnN0IGNoZWNrUmVzdWx0ID0gYXdhaXQgdGhpcy5wcmVDaGVja1NlcnZlckNvbHVtbnMoKTtcclxuICAgICAgdGhpcy5fcHJlQ2hlY2tEb25lID0gdHJ1ZTtcclxuICAgICAgaWYgKCFjaGVja1Jlc3VsdCkgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5mZXRjaFJlbW90ZUNvbHVtbnMoKTtcclxuICAgIGlmICghcmVzKSByZXR1cm47XHJcbiAgICBpZiAocmVzLmNvZGUgPT09IDApIHtcclxuICAgICAgY29uc3QgX3RhYkNvbHVtbiA9IHJlcy5kYXRhLnRhYkNvbHVtbi5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgdGl0bGU6IGl0ZW0uaGVhZGVyLFxyXG4gICAgICAgICAgcHJvcDogaXRlbS5maWVsZCxcclxuICAgICAgICAgIHNvcnROYW1lOiBpdGVtLnNvcnROYW1lLFxyXG4gICAgICAgICAgaGlkZUluVGFibGU6ICFpdGVtLmlzU2hvdyxcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5fc2VydmVyQ29sdW1ucyA9IF90YWJDb2x1bW47XHJcbiAgICAgIHRoaXMudXBkYXRlVGFibGVDb2x1bW5zKF90YWJDb2x1bW4pO1xyXG4gICAgfSBlbHNlIGlmIChyZXMuY29kZSA9PT0gMTApIHtcclxuICAgICAgLy8g5aaC5p6c5pyq6K6+572u5o6l5Y+j6L+U5Zue77yM6ZyA6KaB6buY6K6k6LCD55So5LiA5qyh5L+u5pS55Ye95pWw5Yid5aeL5YyW5pWw5o2uXHJcbiAgICAgIGNvbnN0IGluaXRDb2x1bW5zID0gdGhpcy5jb2x1bW5zXHJcbiAgICAgICAgLmZpbHRlcigoY29sKSA9PiAhY29sLmF1eGlsaWFyeUNvbHVtbilcclxuICAgICAgICAubWFwKChjb2x1bW4pID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGZpZWxkOiBjb2x1bW4ucHJvcCxcclxuICAgICAgICAgICAgaXNTaG93OiB0cnVlLCAvLyDpu5jorqTlhajpg6jmmL7npLpcclxuICAgICAgICAgICAgaGVhZGVyOiBjb2x1bW4udGl0bGUsXHJcbiAgICAgICAgICAgIHNvcnROYW1lOiBjb2x1bW4uc29ydE5hbWUgfHwgbnVsbCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAvLyDosIPnlKjkv67mlLnmjqXlj6PliJ3lp4vljJbmlbDmja5cclxuICAgICAgY29uc3QgaW5pdFJlcyA9IGF3YWl0IHRoaXMucGVyc2lzdFJlbW90ZUNvbHVtbnMoaW5pdENvbHVtbnMpO1xyXG4gICAgICBpZiAoaW5pdFJlcykge1xyXG4gICAgICAgIHRoaXMucXVlcnlEeW5hbWljQ29sdW1ucygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdGVJbm5lckNvbHVtbnMoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgdGhpcy5fY29sdW1ucyA9IGNvbHVtbnNcclxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaGlkZUluVGFibGUpXHJcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICByZXR1cm4geyAuLi5QUk9fVEFCTEVfREVGQVVMVF9DT0xVTU4sIC4uLml0ZW0gfSBhcyBQcm9UYWJsZUNvbHVtbjtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDoh6rliqjms6jlhozmqKHmnb/nmoTmlrnms5VcclxuICBwcml2YXRlIGF1dG9SZWdpc3RlclRlbXBsYXRlcygpIHtcclxuICAgIC8vIOiOt+WPluaJgOacieaooeadv1xyXG4gICAgY29uc3QgYWxsVGVtcGxhdGVzQXJyYXkgPSB0aGlzLmFsbFRlbXBsYXRlcy50b0FycmF5KCk7XHJcblxyXG4gICAgLy8g6I635Y+W5omA5pyJ6ZyA6KaB6Ieq5a6a5LmJ5qih5p2/55qE5YiXXHJcbiAgICBjb25zdCBjb2x1bW5zV2l0aEN1c3RvbVJlbmRlciA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKFxyXG4gICAgICAoY29sKSA9PiBjb2wuY3VzdG9tUmVuZGVyXHJcbiAgICApO1xyXG5cclxuICAgIC8vIOiOt+WPluaJgOaciemcgOimgeiHquWumuS5iWxhYmVs5qih5p2/55qE5YiX77yI5L2/55So5Y6f5aeLY29sdW1uc++8jOehruS/nemhuuW6j+ato+ehru+8iVxyXG4gICAgY29uc3QgY29sdW1uc1dpdGhDdXN0b21MYWJlbCA9IHRoaXMuY29sdW1ucy5maWx0ZXIoXHJcbiAgICAgIChjb2wpID0+IGNvbC5jdXN0b21MYWJlbFJlbmRlclxyXG4gICAgKTtcclxuXHJcbiAgICAvLyDorqHnrpfpnIDopoHnmoTmqKHmnb/mgLvmlbBcclxuICAgIGNvbnN0IGN1c3RvbVJlbmRlckNvdW50ID0gY29sdW1uc1dpdGhDdXN0b21SZW5kZXIubGVuZ3RoO1xyXG4gICAgY29uc3QgdG90YWxOZWVkZWRUZW1wbGF0ZXMgPSBjdXN0b21SZW5kZXJDb3VudCArIGNvbHVtbnNXaXRoQ3VzdG9tTGFiZWwubGVuZ3RoO1xyXG5cclxuICAgIC8vIOivhuWIq+W5tuaOkumZpOeJueauiuaooeadv++8iGFjdGlvbkJhciDlkowgaW1nQWN0aW9uQmFy77yJXHJcbiAgICBjb25zdCBzcGVjaWFsVGVtcGxhdGVJbmRpY2VzID0gbmV3IFNldDxudW1iZXI+KCk7XHJcbiAgICBcclxuICAgIC8vIOWwneivleaJvuWIsCBhY3Rpb25CYXJUcGwg5ZyoIGFsbFRlbXBsYXRlc0FycmF5IOS4reeahOS9jee9rlxyXG4gICAgaWYgKHRoaXMuYWN0aW9uQmFyVHBsKSB7XHJcbiAgICAgIGNvbnN0IGFjdGlvbkJhckluZGV4ID0gdGhpcy5maW5kVGVtcGxhdGVJbmRleChhbGxUZW1wbGF0ZXNBcnJheSwgdGhpcy5hY3Rpb25CYXJUcGwpO1xyXG4gICAgICBpZiAoYWN0aW9uQmFySW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgc3BlY2lhbFRlbXBsYXRlSW5kaWNlcy5hZGQoYWN0aW9uQmFySW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIOWwneivleaJvuWIsCBpbWdBY3Rpb25CYXJUcGwg5ZyoIGFsbFRlbXBsYXRlc0FycmF5IOS4reeahOS9jee9rlxyXG4gICAgaWYgKHRoaXMuaW1nQWN0aW9uQmFyVHBsKSB7XHJcbiAgICAgIGNvbnN0IGltZ0FjdGlvbkJhckluZGV4ID0gdGhpcy5maW5kVGVtcGxhdGVJbmRleChhbGxUZW1wbGF0ZXNBcnJheSwgdGhpcy5pbWdBY3Rpb25CYXJUcGwpO1xyXG4gICAgICBpZiAoaW1nQWN0aW9uQmFySW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgc3BlY2lhbFRlbXBsYXRlSW5kaWNlcy5hZGQoaW1nQWN0aW9uQmFySW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c5peg5rOV6YCa6L+H5byV55So5om+5Yiw54m55q6K5qih5p2/77yM5L2/55So5aSH55So562W55WlXHJcbiAgICAvLyDlpIfnlKjnrZbnlaXvvJrlgYforr7mnIDlkI7nmoTmqKHmnb/mmK/nibnmrormqKHmnb9cclxuICAgIGNvbnN0IHNwZWNpYWxUZW1wbGF0ZUNvdW50ID0gKHRoaXMuYWN0aW9uQmFyVHBsID8gMSA6IDApICsgKHRoaXMuaW1nQWN0aW9uQmFyVHBsID8gMSA6IDApO1xyXG4gICAgaWYgKHNwZWNpYWxUZW1wbGF0ZUluZGljZXMuc2l6ZSA9PT0gMCAmJiBzcGVjaWFsVGVtcGxhdGVDb3VudCA+IDApIHtcclxuICAgICAgZm9yIChsZXQgaSA9IGFsbFRlbXBsYXRlc0FycmF5Lmxlbmd0aCAtIHNwZWNpYWxUZW1wbGF0ZUNvdW50OyBpIDwgYWxsVGVtcGxhdGVzQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmFkZChpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOaPkOWPluWIl+aooeadv++8iOaOkumZpOeJueauiuaooeadv++8iVxyXG4gICAgY29uc3QgY29sdW1uVGVtcGxhdGVzOiBUZW1wbGF0ZVJlZjxhbnk+W10gPSBbXTtcclxuICAgIGFsbFRlbXBsYXRlc0FycmF5LmZvckVhY2goKHRwbCwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKCFzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmhhcyhpbmRleCkpIHtcclxuICAgICAgICBjb2x1bW5UZW1wbGF0ZXMucHVzaCh0cGwpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDpqozor4HmqKHmnb/mlbDph49cclxuICAgIGlmIChjb2x1bW5UZW1wbGF0ZXMubGVuZ3RoICE9PSB0b3RhbE5lZWRlZFRlbXBsYXRlcykge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFByb1RhYmxlOiDmqKHmnb/mlbDph4/kuI3ljLnphY3vvIHpnIDopoEgJHt0b3RhbE5lZWRlZFRlbXBsYXRlc30g5Liq5YiX5qih5p2/77yM5a6e6ZmF5pyJICR7Y29sdW1uVGVtcGxhdGVzLmxlbmd0aH0g5Liq44CC6K+35qOA5p+lIGN1c3RvbVJlbmRlciDlkowgY3VzdG9tTGFiZWxSZW5kZXIg6YWN572u44CCYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOazqOWGjOiHquWumuS5iea4suafk+aooeadv1xyXG4gICAgY29sdW1uc1dpdGhDdXN0b21SZW5kZXIuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xyXG4gICAgICBjb25zdCB0ZW1wbGF0ZU5hbWUgPSBjb2x1bW4uY3VzdG9tUmVuZGVyITtcclxuICAgICAgaWYgKGluZGV4IDwgY29sdW1uVGVtcGxhdGVzLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzLnNldCh0ZW1wbGF0ZU5hbWUsIGNvbHVtblRlbXBsYXRlc1tpbmRleF0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFByb1RhYmxlOiDmnKrmib7liLDmqKHmnb8gXCIke3RlbXBsYXRlTmFtZX1cIu+8jOe0ouW8lSAke2luZGV4fSDotoXlh7rojIPlm7RgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g5rOo5YaM6Ieq5a6a5LmJbGFiZWzmqKHmnb/vvIjku44gY3VzdG9tUmVuZGVyQ291bnQg5LmL5ZCO5byA5aeL77yJXHJcbiAgICBjb2x1bW5zV2l0aEN1c3RvbUxhYmVsLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcclxuICAgICAgY29uc3QgdGVtcGxhdGVOYW1lID0gY29sdW1uLmN1c3RvbUxhYmVsUmVuZGVyITtcclxuICAgICAgY29uc3QgdGVtcGxhdGVJbmRleCA9IGN1c3RvbVJlbmRlckNvdW50ICsgaW5kZXg7XHJcbiAgICAgIGlmICh0ZW1wbGF0ZUluZGV4IDwgY29sdW1uVGVtcGxhdGVzLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzLnNldCh0ZW1wbGF0ZU5hbWUsIGNvbHVtblRlbXBsYXRlc1t0ZW1wbGF0ZUluZGV4XSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgUHJvVGFibGU6IOacquaJvuWIsGxhYmVs5qih5p2/IFwiJHt0ZW1wbGF0ZU5hbWV9XCLvvIzntKLlvJUgJHt0ZW1wbGF0ZUluZGV4fSDotoXlh7rojIPlm7RgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDlsJ3or5XlnKjmlbDnu4TkuK3mib7liLDmqKHmnb/nmoTntKLlvJXvvIjkvb/nlKjlpJrnp43mr5TovoPmlrnlvI/vvIlcclxuICBwcml2YXRlIGZpbmRUZW1wbGF0ZUluZGV4KHRlbXBsYXRlczogVGVtcGxhdGVSZWY8YW55PltdLCB0YXJnZXQ6IFRlbXBsYXRlUmVmPGFueT4pOiBudW1iZXIge1xyXG4gICAgLy8g5pa55rOVMe+8muW8leeUqOebuOetieaAp1xyXG4gICAgbGV0IGluZGV4ID0gdGVtcGxhdGVzLmluZGV4T2YodGFyZ2V0KTtcclxuICAgIGlmIChpbmRleCAhPT0gLTEpIHJldHVybiBpbmRleDtcclxuXHJcbiAgICAvLyDmlrnms5Uy77ya6YCa6L+HIGVsZW1lbnRSZWYg5q+U6L6DXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB0YXJnZXRFbGVtZW50UmVmID0gKHRhcmdldCBhcyBhbnkpLmVsZW1lbnRSZWY7XHJcbiAgICAgIGlmICh0YXJnZXRFbGVtZW50UmVmKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IHRwbEVsZW1lbnRSZWYgPSAodGVtcGxhdGVzW2ldIGFzIGFueSkuZWxlbWVudFJlZjtcclxuICAgICAgICAgIGlmICh0cGxFbGVtZW50UmVmID09PSB0YXJnZXRFbGVtZW50UmVmKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyDlv73nlaXplJnor69cclxuICAgIH1cclxuXHJcbiAgICAvLyDmlrnms5Uz77ya6YCa6L+HIEFuZ3VsYXIg5YaF6YOo5bGe5oCn5q+U6L6DXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB0YXJnZXRDb250YWluZXIgPSAodGFyZ2V0IGFzIGFueSkuX2RlY2xhcmF0aW9uVENvbnRhaW5lcjtcclxuICAgICAgaWYgKHRhcmdldENvbnRhaW5lcikge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVtcGxhdGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCB0cGxDb250YWluZXIgPSAodGVtcGxhdGVzW2ldIGFzIGFueSkuX2RlY2xhcmF0aW9uVENvbnRhaW5lcjtcclxuICAgICAgICAgIGlmICh0cGxDb250YWluZXIgPT09IHRhcmdldENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8g5b+955Wl6ZSZ6K+vXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxuXHJcbiAgLy8g6K6+572u562b6YCJ6KGo5Y2V6buY6K6k5bGe5oCnXHJcbiAgcHJpdmF0ZSBzZXRTZWFyY2hGb3JtRGVmYXVsdFByb3AoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgY29sdW1ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLnZhbHVlVHlwZSkge1xyXG4gICAgICAgIGlmIChpdGVtLmZpZWxkUHJvcHMpIHtcclxuICAgICAgICAgIGl0ZW0uZmllbGRQcm9wcyA9IHtcclxuICAgICAgICAgICAgLi4uUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbaXRlbS52YWx1ZVR5cGVdLFxyXG4gICAgICAgICAgICAuLi5pdGVtLmZpZWxkUHJvcHMsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpdGVtLmZpZWxkUHJvcHMgPSB7IC4uLlBST19UQUJMRV9ERUZBVUxUX1BST1BTW2l0ZW0udmFsdWVUeXBlXSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDliqjmgIHorr7nva5PcHRpb25zXHJcbiAgcHJpdmF0ZSBzZXRTZWxlY3RSZXF1ZXN0KGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10pIHtcclxuICAgIGNvbHVtbnMubWFwKGFzeW5jIChpdGVtKSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLmZpZWxkUHJvcHMgJiYgaGFzSW4oaXRlbS5maWVsZFByb3BzLCBcInJlcXVlc3RcIikpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IChcclxuICAgICAgICAgICAgaXRlbS5maWVsZFByb3BzIGFzIFNlbGVjdEZpZWxkUHJvcHNcclxuICAgICAgICAgICkucmVxdWVzdD8uKCk7XHJcbiAgICAgICAgICAoaXRlbS5maWVsZFByb3BzIGFzIFNlbGVjdEZpZWxkUHJvcHMpLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAoaXRlbS5maWVsZFByb3BzIGFzIFNlbGVjdEZpZWxkUHJvcHMpLm9wdGlvbnMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzZXRTZWFyY2hQYXJhbXMoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgdGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zID0gW107XHJcbiAgICBjb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcclxuICAgICAgICBjb25zdCBmbGFnID0gIWl0ZW0uaGlkZUluU2VhcmNoICYmIGl0ZW0udmFsdWVUeXBlO1xyXG4gICAgICAgIGlmIChmbGFnKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMucHVzaChjbG9uZURlZXAoaXRlbSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZztcclxuICAgICAgfSlcclxuICAgICAgLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG4gICAgICAgIGxldCBkZWZhdWx0VmFsdWUgPSBQUk9fVEFCTEVfREVGQVVMVF9QUk9QU1tjb2x1bW4udmFsdWVUeXBlXS52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8g5a+55LqOY2hlY2tib3jnsbvlnovvvIzku45vcHRpb25z5Lit5om+5Ye6Y2hlY2tlZOS4unRydWXnmoTpobnkvZzkuLrpu5jorqTlgLxcclxuICAgICAgICBpZiAoY29sdW1uLnZhbHVlVHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XHJcbiAgICAgICAgICBjb25zdCBjaGVja2VkVmFsdWVzID0gKGNvbHVtbi5maWVsZFByb3BzPy5vcHRpb25zIHx8IFtdKVxyXG4gICAgICAgICAgICAuZmlsdGVyKChvcHQ6IE9wdGlvbnNUeXBlKSA9PiBvcHQuY2hlY2tlZClcclxuICAgICAgICAgICAgLm1hcCgob3B0OiBPcHRpb25zVHlwZSkgPT4gb3B0LnZhbHVlKTtcclxuICAgICAgICAgIHRoaXMuX3NlYXJjaFBhcmFtc1trZXldID1cclxuICAgICAgICAgICAgY2hlY2tlZFZhbHVlcy5sZW5ndGggPiAwID8gY2hlY2tlZFZhbHVlcyA6IGRlZmF1bHRWYWx1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPSBjb2x1bW4uZmllbGRQcm9wcz8udmFsdWUgfHwgZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5Yid5aeL5YyWIGF1dG9Db21wbGV0ZSDmlbDmja7mupBcclxuICAgICAgICBpZiAoY29sdW1uLnZhbHVlVHlwZSA9PT0gXCJhdXRvQ29tcGxldGVcIikge1xyXG4gICAgICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNba2V5XSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgLy8g5qC55o2u5YiX55qEIG9yZGVyIOWtl+autei/m+ihjOaOkuW6j++8jOacquiuvue9riBvcmRlciDnmoTmlL7lnKjmnIDlkI5cclxuICAgIHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBhT3JkZXIgPSBpc05pbChhPy5vcmRlcikgPyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA6IGEub3JkZXI7XHJcbiAgICAgIGNvbnN0IGJPcmRlciA9IGlzTmlsKGI/Lm9yZGVyKSA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogYi5vcmRlcjtcclxuICAgICAgaWYgKGFPcmRlciA9PT0gYk9yZGVyKSByZXR1cm4gMDtcclxuICAgICAgcmV0dXJuIGFPcmRlciAtIGJPcmRlcjtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2V0U2VhcmNoRm9ybURlZmF1bHRQcm9wKHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucyk7XHJcblxyXG4gICAgLy8g5bm25Y+R5Yqg6L295omA5pyJ6ZyA6KaB5byC5q2l6I635Y+W55qE6YCJ6aG5XHJcbiAgICB0aGlzLnNldFNlbGVjdFJlcXVlc3QodGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlVGFibGVDb2x1bW5zKGluamVjdENvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10pIHtcclxuICAgIC8vIDEuIOS9v+eUqOacgOWOn+Wni+eahGNvbHVtbnPkvZzkuLrmlbDmja7mupDvvIznoa7kv53ovoXliqnliJflrozlhajkuI3lj5flvbHlk41cclxuICAgIGNvbnN0IG9yaWdpbmFsQ29sdW1ucyA9IGNsb25lRGVlcCh0aGlzLmNvbHVtbnMpO1xyXG5cclxuICAgIC8vIDIuIOWkhOeQhuWtl+auteaYoOWwhO+8iOWmguaenOaPkOS+m+S6hmZpZWxkc+WPguaVsO+8iVxyXG4gICAgbGV0IHByb2Nlc3NlZEluamVjdENvbHVtbnMgPSBpbmplY3RDb2x1bW5zO1xyXG5cclxuICAgIC8vIDMuIOWIhuemu+i+heWKqeWIl+WSjOmdnui+heWKqeWIl++8iOS9v+eUqOWOn+Wni+aVsOaNru+8iVxyXG4gICAgY29uc3Qgbm9uQXV4aWxpYXJ5Q29sdW1ucyA9IG9yaWdpbmFsQ29sdW1ucy5maWx0ZXIoXHJcbiAgICAgIChjb2wpID0+ICFjb2wuYXV4aWxpYXJ5Q29sdW1uXHJcbiAgICApO1xyXG5cclxuICAgIC8vIDQuIOaMieeFp2luamVjdENvbHVtbnPnmoTpobrluo/ph43mlrDmjpLliJfpnZ7ovoXliqnliJdcclxuICAgIGNvbnN0IHJlb3JkZXJlZE5vbkF1eGlsaWFyeUNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10gPSBbXTtcclxuICAgIGNvbnN0IHJlbWFpbmluZ05vbkF1eGlsaWFyeUNvbHVtbnMgPSBbLi4ubm9uQXV4aWxpYXJ5Q29sdW1uc107IC8vIOWkjeWItuS4gOS7veeUqOS6juafpeaJvuWSjOenu+mZpFxyXG5cclxuICAgIHByb2Nlc3NlZEluamVjdENvbHVtbnMuZm9yRWFjaCgoaW5qZWN0Q29sKSA9PiB7XHJcbiAgICAgIC8vIOafpeaJvumdnui+heWKqeWIl+S4reWvueW6lOeahOS4i+agh1xyXG4gICAgICBjb25zdCBleGlzdGluZ0NvbEluZGV4ID0gcmVtYWluaW5nTm9uQXV4aWxpYXJ5Q29sdW1ucy5maW5kSW5kZXgoXHJcbiAgICAgICAgKGNvbCkgPT4gY29sLnByb3AgPT09IGluamVjdENvbC5wcm9wXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChleGlzdGluZ0NvbEluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIC8vIOWmguaenOaJvuWIsOebuOWQjOWIl++8jOeUqGluamVjdENvbHVtbnPkuK3nmoTlsZ7mgKfopobnm5bljp/lp4tjb2x1bW5z5Lit55qE5bGe5oCnXHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDb2wgPSByZW1haW5pbmdOb25BdXhpbGlhcnlDb2x1bW5zW2V4aXN0aW5nQ29sSW5kZXhdO1xyXG5cclxuICAgICAgICBjb25zdCB1cGRhdGVkQ29sID0geyAuLi5leGlzdGluZ0NvbCwgLi4uaW5qZWN0Q29sIH07XHJcbiAgICAgICAgcmVvcmRlcmVkTm9uQXV4aWxpYXJ5Q29sdW1ucy5wdXNoKHVwZGF0ZWRDb2wpO1xyXG4gICAgICAgIC8vIOS7juWJqeS9meaVsOe7hOS4reenu+mZpO+8jOmBv+WFjemHjeWkjVxyXG4gICAgICAgIHJlbWFpbmluZ05vbkF1eGlsaWFyeUNvbHVtbnMuc3BsaWNlKGV4aXN0aW5nQ29sSW5kZXgsIDEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIOWmguaenOayoeaJvuWIsOWvueW6lOeahOWIl++8jOebtOaOpea3u+WKoGluamVjdENvbHVtbnPkuK3nmoTliJdcclxuICAgICAgICByZW9yZGVyZWROb25BdXhpbGlhcnlDb2x1bW5zLnB1c2goaW5qZWN0Q29sKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gNS4g5aSE55CG5Ymp5L2Z55qE5Y6f5aeLY29sdW1uc+S4reeahOmdnui+heWKqeWIl++8iOWcqGluamVjdENvbHVtbnPkuK3mnKrlh7rnjrDnmoTliJfvvIlcclxuICAgIC8vIOi/meS6m+WIl+W6lOivpeiiq+makOiXj++8iOiuvue9rmhpZGVJblRhYmxl5Li6dHJ1Ze+8iVxyXG4gICAgcmVtYWluaW5nTm9uQXV4aWxpYXJ5Q29sdW1ucy5mb3JFYWNoKChyZW1haW5pbmdDb2wpID0+IHtcclxuICAgICAgY29uc3QgaGlkZGVuQ29sID0geyAuLi5yZW1haW5pbmdDb2wsIGhpZGVJblRhYmxlOiB0cnVlIH07XHJcbiAgICAgIHJlb3JkZXJlZE5vbkF1eGlsaWFyeUNvbHVtbnMucHVzaChoaWRkZW5Db2wpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gNi4g5oyJ54Wn5Y6f5aeLY29sdW1uc+eahOmhuuW6j+mHjeaWsOe7hOWQiO+8muS/neaMgei+heWKqeWIl+eahOWOn+Wni+S9jee9ruWSjOWxnuaAp1xyXG4gICAgY29uc3QgZmluYWxDb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcbiAgICBsZXQgbm9uQXV4aWxpYXJ5SW5kZXggPSAwO1xyXG4gICAgbGV0IGF1eGlsaWFyeUluZGV4ID0gMDtcclxuXHJcbiAgICBvcmlnaW5hbENvbHVtbnMuZm9yRWFjaCgob3JpZ2luYWxDb2wpID0+IHtcclxuICAgICAgaWYgKG9yaWdpbmFsQ29sLmF1eGlsaWFyeUNvbHVtbikge1xyXG4gICAgICAgIC8vIOWmguaenOaYr+i+heWKqeWIl++8jOS9v+eUqOWOn+Wni+WIl+aVsOaNru+8jOWujOWFqOS4jei/m+ihjOS7u+S9leS/ruaUuVxyXG4gICAgICAgIGZpbmFsQ29sdW1ucy5wdXNoKG9yaWdpbmFsQ29sKTtcclxuICAgICAgICBhdXhpbGlhcnlJbmRleCsrO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIOWmguaenOaYr+mdnui+heWKqeWIl++8jOS9v+eUqOmHjeaWsOaOkuW6j+WQjueahOWIl++8jOS9huS/neeVmeWOn+Wni+WIl+eahOaJgOacieWxnuaAp1xyXG4gICAgICAgIGNvbnN0IHJlb3JkZXJlZENvbCA9IHJlb3JkZXJlZE5vbkF1eGlsaWFyeUNvbHVtbnNbbm9uQXV4aWxpYXJ5SW5kZXhdO1xyXG4gICAgICAgIGlmIChyZW9yZGVyZWRDb2wpIHtcclxuICAgICAgICAgIC8vIOWQiOW5tuWOn+Wni+WIl+WSjOmHjeaWsOaOkuW6j+WQjueahOWIl++8jOehruS/neS/neeVmeaJgOacieWOn+Wni+WxnuaAp1xyXG4gICAgICAgICAgY29uc3QgbWVyZ2VkQ29sID0geyAuLi5vcmlnaW5hbENvbCwgLi4ucmVvcmRlcmVkQ29sIH07XHJcbiAgICAgICAgICBmaW5hbENvbHVtbnMucHVzaChtZXJnZWRDb2wpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyDlpoLmnpzph43mlrDmjpLluo/lkI7nmoTliJfkuI3lrZjlnKjvvIzkvb/nlKjljp/lp4vliJdcclxuICAgICAgICAgIGZpbmFsQ29sdW1ucy5wdXNoKG9yaWdpbmFsQ29sKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbm9uQXV4aWxpYXJ5SW5kZXgrKztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZvcm1hdGVJbm5lckNvbHVtbnMoZmluYWxDb2x1bW5zKTtcclxuICB9XHJcblxyXG4gIC8vIOmAmui/hyBQcm94eSDnm5HlkKwgX3NlYXJjaFBhcmFtcyDnmoTlsZ7mgKflj5jmm7RcclxuICBwcml2YXRlIGNyZWF0ZVNlYXJjaFBhcmFtc1Byb3h5KHRhcmdldDogYW55KSB7XHJcbiAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgIGNvbnN0IGhhbmRsZXI6IFByb3h5SGFuZGxlcjxhbnk+ID0ge1xyXG4gICAgICBzZXQob2JqOiBhbnksIHByb3A6IHN0cmluZyB8IHN5bWJvbCwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwcm9wKTtcclxuICAgICAgICBjb25zdCBvbGRWYWwgPSBvYmpba2V5XTtcclxuICAgICAgICBpZiAob2xkVmFsID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBzZWxmLm9uVmFsdWVzQ2hhbmdlLmVtaXQoe1xyXG4gICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgIHZhbHVlLFxyXG4gICAgICAgICAgICBwYXJhbXM6IHNlbGYuZ2V0U2VhcmNoUGFyYW1zKCksXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7fVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJFbXB0eVNlYXJjaFBhcmFtcygpIHtcclxuICAgIGNvbnN0IGNsb25lU2VhcmNoUGFyYW1zID0gY2xvbmVEZWVwKHRoaXMuX3NlYXJjaFBhcmFtcyk7XHJcbiAgICByZXR1cm4gY2xvbmVTZWFyY2hQYXJhbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkU2VydmVyU29ydFBheWxvYWQoKSB7XHJcbiAgICAvLyDmnoTlu7rmv4DmtLvmjpLluo/pm4blkIjvvIjmjInkvJjlhYjnuqfku47kvY7liLDpq5jvvIzmnKvlsL7kvJjlhYjvvIlcclxuICAgIGNvbnN0IGFjdGl2ZUtleXMgPSB0aGlzLl9zb3J0UHJpb3JpdHkuZmlsdGVyKChrKSA9PiAhIXRoaXMuX3NvcnRNYXBba10pO1xyXG4gICAgaWYgKGFjdGl2ZUtleXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgIGNvbnN0IHNvcnRzID0gYWN0aXZlS2V5cy5tYXAoKGZpZWxkKSA9PiB7XHJcbiAgICAgIC8vIOafpeaJvuWvueW6lOeahOWIl+mFjee9ru+8jOS8mOWFiOS9v+eUqHNvcnROYW1l5a2X5q61XHJcbiAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuX2NvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wucHJvcCA9PT0gZmllbGQpO1xyXG4gICAgICBjb25zdCBzb3J0RmllbGQgPSBjb2x1bW4/LnNvcnROYW1lIHx8IGZpZWxkO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGZpZWxkOiBzb3J0RmllbGQsXHJcbiAgICAgICAgb3JkZXI6IHRoaXMuX3NvcnRNYXBbZmllbGRdISxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMubXVsdGlwbGVTb3J0KSB7XHJcbiAgICAgIHJldHVybiBzb3J0czsgLy8g5Lul5pWw57uE5b2i5byP5o+Q5Lqk5aSa5YiX5o6S5bqPXHJcbiAgICB9XHJcbiAgICBjb25zdCBbZmlyc3RdID0gc29ydHM7XHJcbiAgICByZXR1cm4gZmlyc3Q7IC8vIOWFvOWuueWNleWIl+e7k+aehCB7IGZpZWxkLCBvcmRlciB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNvcnREYXRhU291cmNlSW5QbGFjZSgpIHtcclxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpIHx8IHRoaXMuZGF0YVNvdXJjZS5sZW5ndGggPT09IDApIHJldHVybjtcclxuICAgIGNvbnN0IGFjdGl2ZUtleXMgPSB0aGlzLl9zb3J0UHJpb3JpdHkuZmlsdGVyKChrKSA9PiAhIXRoaXMuX3NvcnRNYXBba10pO1xyXG4gICAgaWYgKGFjdGl2ZUtleXMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgLy8g5aSN5Yi25LiA5Lu95LyY5YWI57qn77yM5LuO5YmN5Yiw5ZCO5LyY5YWI57qn5LuO5L2O5Yiw6auY77yI5pyA5ZCO6K6+572u55qE5a2X5q615LyY5YWI77yJXHJcbiAgICBjb25zdCBrZXlzSW5Qcmlvcml0eSA9IFsuLi5hY3RpdmVLZXlzXTtcclxuICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICBmb3IgKGxldCBpID0ga2V5c0luUHJpb3JpdHkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IGtleXNJblByaW9yaXR5W2ldO1xyXG4gICAgICAgIGNvbnN0IG9yZGVyID0gdGhpcy5fc29ydE1hcFtmaWVsZF0hO1xyXG4gICAgICAgIGNvbnN0IGF2ID0gYT8uW2ZpZWxkXTtcclxuICAgICAgICBjb25zdCBidiA9IGI/LltmaWVsZF07XHJcbiAgICAgICAgY29uc3QgY21wID0gdGhpcy5jb21wYXJlVmFsdWVzKGF2LCBidik7XHJcbiAgICAgICAgaWYgKGNtcCAhPT0gMCkgcmV0dXJuIG9yZGVyID09PSBcImFzY2VuZFwiID8gY21wIDogLWNtcDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wYXJlVmFsdWVzKGFWYWw6IGFueSwgYlZhbDogYW55KTogbnVtYmVyIHtcclxuICAgIGlmIChhVmFsID09IG51bGwgJiYgYlZhbCA9PSBudWxsKSByZXR1cm4gMDtcclxuICAgIGlmIChhVmFsID09IG51bGwpIHJldHVybiAtMTtcclxuICAgIGlmIChiVmFsID09IG51bGwpIHJldHVybiAxO1xyXG4gICAgaWYgKGFWYWwgaW5zdGFuY2VvZiBEYXRlICYmIGJWYWwgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgIHJldHVybiBhVmFsLmdldFRpbWUoKSAtIGJWYWwuZ2V0VGltZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBhVmFsID09PSBcImJvb2xlYW5cIiAmJiB0eXBlb2YgYlZhbCA9PT0gXCJib29sZWFuXCIpIHtcclxuICAgICAgcmV0dXJuIGFWYWwgPT09IGJWYWwgPyAwIDogYVZhbCA/IDEgOiAtMTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgYVZhbCA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgYlZhbCA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICByZXR1cm4gYVZhbCAtIGJWYWw7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGFWYWwgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIGJWYWwgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgcmV0dXJuIGFWYWwubG9jYWxlQ29tcGFyZShiVmFsKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGFOdW0gPSBOdW1iZXIoYVZhbCk7XHJcbiAgICBjb25zdCBiTnVtID0gTnVtYmVyKGJWYWwpO1xyXG4gICAgaWYgKCFpc05hTihhTnVtKSAmJiAhaXNOYU4oYk51bSkpIHJldHVybiBhTnVtIC0gYk51bTtcclxuICAgIHJldHVybiBTdHJpbmcoYVZhbCkubG9jYWxlQ29tcGFyZShTdHJpbmcoYlZhbCkpO1xyXG4gIH1cclxuXHJcbiAgLy8g5omn6KGMIGF1dG9Db21wbGV0ZSDmlbDmja7mupDmn6Xor6LvvIjlrp7pmYXmiafooYzpgLvovpHvvIlcclxuICBwcml2YXRlIGV4ZWN1dGVBdXRvQ29tcGxldGVEYXRhU291cmNlKGV2ZW50OiBFdmVudCwgY29sdW1uOiBQcm9UYWJsZUNvbHVtbikge1xyXG4gICAgY29uc3QgZmllbGRLZXkgPSBjb2x1bW4uZmllbGRQcm9wcz8ubmFtZSB8fCBjb2x1bW4ucHJvcDtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIChjb2x1bW4uZmllbGRQcm9wcyBhcyBBdXRvQ29tcGxldGVGaWVsZFByb3BzKS5kYXRhU291cmNlICYmXHJcbiAgICAgIHR5cGVvZiAoY29sdW1uLmZpZWxkUHJvcHMgYXMgQXV0b0NvbXBsZXRlRmllbGRQcm9wcykuZGF0YVNvdXJjZSA9PT1cclxuICAgICAgICBcImZ1bmN0aW9uXCJcclxuICAgICkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IChjb2x1bW4uZmllbGRQcm9wcyBhcyBBdXRvQ29tcGxldGVGaWVsZFByb3BzKS5kYXRhU291cmNlKFxyXG4gICAgICAgICAgZXZlbnRcclxuICAgICAgICApO1xyXG4gICAgICAgIC8vIOWmguaenOi/lOWbnueahOaYryBQcm9taXNl77yM5aSE55CG5byC5q2l57uT5p6cXHJcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgIHJlc3VsdFxyXG4gICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2ZpZWxkS2V5XSA9IGRhdGEgfHwgW107XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQXV0b0NvbXBsZXRlIGRhdGFTb3VyY2UgZXJyb3I6XCIsIGVycm9yKTtcclxuICAgICAgICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gPSBbXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIOWQjOatpei/lOWbnue7k+aenFxyXG4gICAgICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNbZmllbGRLZXldID0gcmVzdWx0IHx8IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiQXV0b0NvbXBsZXRlIGRhdGFTb3VyY2UgZXJyb3I6XCIsIGVycm9yKTtcclxuICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gPSBbXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNlYXJjaFBhcmFtcyhvcHRpb25zPzoge1xyXG4gICAgdXNlU2F2ZWQ/OiBib29sZWFuOyAvLyDkvb/nlKjmnIDov5HkuIDmrKHmn6Xor6Lmj5DkuqTnmoTlj4LmlbDvvIzpu5jorqTkuLogZmFsc2XvvJtmYWxzZSDkuLrlvZPliY3ooajljZXlgLxcclxuICB9KTogYW55IHtcclxuICAgIGNvbnN0IHsgdXNlU2F2ZWQgPSBmYWxzZSB9ID0gb3B0aW9ucyB8fCB7fTtcclxuICAgIGNvbnN0IHJhd1BhcmFtcyA9IHVzZVNhdmVkID8gdGhpcy5fc2F2ZWRTZWFyY2hQYXJhbXMgOiB0aGlzLl9zZWFyY2hQYXJhbXM7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBjbG9uZURlZXAocmF3UGFyYW1zIHx8IHt9KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBwYXJhbXMsXHJcbiAgICAgIHBhZ2VJbmZvOiB7XHJcbiAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXgsXHJcbiAgICAgICAgcGFnZVNpemU6IHRoaXMuX3BhZ2VJbmZvLnBhZ2VTaXplLFxyXG4gICAgICB9LFxyXG4gICAgICAvLyDlnKjnur/mjpLluo/mqKHlvI/vvJrmiormjpLluo/lr7nosaHmj5DkuqTnu5nmjqXlj6NcclxuICAgICAgLi4uKHRoaXMuc29ydE1vZGUgPT09IFwic2VydmVyXCJcclxuICAgICAgICA/IHsgc29ydDogdGhpcy5idWlsZFNlcnZlclNvcnRQYXlsb2FkKCkgfVxyXG4gICAgICAgIDoge30pLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWxvYWQoYWZ0ZXJEZWxldGU/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KGFmdGVyRGVsZXRlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRGaWVsZHNWYWx1ZShmaWVsZHM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgIE9iamVjdC5rZXlzKGZpZWxkcykuZm9yRWFjaCgoaykgPT4ge1xyXG4gICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba10gPSBmaWVsZHNba107IC8vIOS/neeVmSBQcm94ee+8jOmAkOmhuei1i+WAvOinpuWPkeaLpuaIqlxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RmllbGRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkUm93KCkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0Q29sdW1ucyhcclxuICAgIGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10sXHJcbiAgICBvcHRpb25zPzoge1xyXG4gICAgICByZWxvYWQ/OiBib29sZWFuOyAvLyDmmK/lkKbph43mlrDliqDovb3mlbDmja7vvIzpu5jorqTkuLogZmFsc2VcclxuICAgIH1cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIOabtOaWsCBjb2x1bW5zIOi+k+WFpeWxnuaAp1xyXG4gICAgdGhpcy5jb2x1bW5zID0gY2xvbmVEZWVwKGNvbHVtbnMpO1xyXG5cclxuICAgIC8vIOmHjeaWsOagvOW8j+WMluWGhemDqOWIl1xyXG4gICAgdGhpcy5mb3JtYXRlSW5uZXJDb2x1bW5zKHRoaXMuY29sdW1ucyk7XHJcblxyXG4gICAgLy8g6YeN5paw6K6+572u5pCc57Si5Y+C5pWw77yI5byC5q2l5pON5L2c77yJXHJcbiAgICAvLyDlhYjmuIXnqbrml6fnmoTmkJzntKLlj4LmlbDvvIzpgb/lhY3ml6fmlbDmja7mrovnlZlcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtcyA9IHt9O1xyXG4gICAgYXdhaXQgdGhpcy5zZXRTZWFyY2hQYXJhbXModGhpcy5jb2x1bW5zKTtcclxuXHJcbiAgICAvLyDph43mlrDliJvlu7ogUHJveHnvvIznoa7kv53ooajljZXpobnlgLzlj5jljJbog73mraPluLjop6blj5Hkuovku7ZcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtcyA9IHRoaXMuY3JlYXRlU2VhcmNoUGFyYW1zUHJveHkodGhpcy5fc2VhcmNoUGFyYW1zKTtcclxuXHJcbiAgICAvLyDph43mlrDms6jlhozmqKHmnb/vvIjlpoLmnpznu4Tku7blt7Lnu4/liJ3lp4vljJblrozmiJDvvIlcclxuICAgIGlmICh0aGlzLmFsbFRlbXBsYXRlcykge1xyXG4gICAgICB0aGlzLmF1dG9SZWdpc3RlclRlbXBsYXRlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWmguaenOiuvue9ruS6hiByZWxvYWQg6YCJ6aG55Li6IHRydWXvvIzliJnph43mlrDmn6Xor6LmlbDmja5cclxuICAgIGlmIChvcHRpb25zPy5yZWxvYWQgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNlbGVjdGVkUm93RGF0YTxUID0gYW55PigpOiBUIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFRhYmxlUm93O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENoZWNrZWRSb3dzPFQgPSBhbnk+KCk6IFRbXSB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NoZWNrYm94KSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIC8vIOi/lOWbnuW9k+WJjeaVsOaNrua6kOS4reaJgOaciSBjaGVja2VkIOS4uiB0cnVlIOeahOmhuVxyXG4gICAgLy8g5rOo5oSP77ya5aaC5p6c6ZyA6KaB6I635Y+W5omA5pyJ6aG155qE6YCJ5Lit6aG577yM6ZyA6KaB6YGN5Y6G5omA5pyJ5pWw5o2u5rqQ5oiW5L2/55SoIF9zZWxlY3RlZFJvd0lkc1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIoKHJvdykgPT4gcm93LmNoZWNrZWQgPT09IHRydWUpIGFzIFRbXTtcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPluaMh+WumuWQjeensOeahOaooeadv1xyXG4gIGdldFRlbXBsYXRlKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcclxuICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gdGhpcy5jdXN0b21UZW1wbGF0ZXMuZ2V0KG5hbWUpIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRUb29sVGlwVGV4dFZhbHVlKGNvbHVtbjogUHJvVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBrZXkgPVxyXG4gICAgICBjb2x1bW4uY3VzdG9tUmVuZGVyICYmIHRoaXMuZ2V0VGVtcGxhdGUoY29sdW1uLmN1c3RvbVJlbmRlcilcclxuICAgICAgICA/IFwiXCJcclxuICAgICAgICA6IGNvbHVtbi5lbGxpcHNpc1xyXG4gICAgICAgID8gY29sdW1uLnByb3BcclxuICAgICAgICA6IFwiXCI7XHJcbiAgICByZXR1cm4gIWtleSA/IFwiXCIgOiBkYXRhW2tleV07XHJcbiAgfVxyXG5cclxuICBnZXRUYWJsZVJvd0NoZWNrZWQoZGF0YTogYW55KSB7XHJcbiAgICAvLyDlkK/nlKjlpI3pgInmoYbml7bvvJrooYzpq5jkuq7lupTkuI7lpI3pgInmoYbpgInkuK3nirbmgIHkuIDoh7TvvIjmlK/mjIHlpJrpgInvvIlcclxuICAgIGlmICh0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pc1Jvd0NoZWNrZWQoZGF0YSk7XHJcbiAgICB9XHJcbiAgICAvLyDmnKrlkK/nlKjlpI3pgInmoYbml7bvvJrku43nhLbkvb/nlKjljZXpgInooYzpq5jkuq5cclxuICAgIGlmICghdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdykgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuX3NlbGVjdGVkVGFibGVSb3cpID09PSBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxuICB9XHJcblxyXG4gIC8vIOajgOafpeihjOaYr+WQpuiiq+emgeeUqFxyXG4gIGlzUm93RGlzYWJsZWQoZGF0YTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NoZWNrYm94KSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dEaXNhYmxlZCA/IHRoaXMucm93RGlzYWJsZWQoZGF0YSkgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIOajgOafpeihjOaYr+WQpuiiq+WkjemAieahhumAieS4re+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIGlzUm93Q2hlY2tlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5zaG93Q2hlY2tib3gpIHJldHVybiBmYWxzZTtcclxuICAgIC8vIOebtOaOpeivu+WPluaVsOaNruWvueixoeeahCBjaGVja2VkIOWxnuaAp1xyXG4gICAgcmV0dXJuIGRhdGEuY2hlY2tlZCA9PT0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIOWIh+aNouihjOeahOmAieS4reeKtuaAge+8iOaVsOaNrumpseWKqOaooeW8j++8jOS/neeVmeeUqOS6juWFvOWuue+8iVxyXG4gIHRvZ2dsZVJvd0NoZWNrZWQoZGF0YTogYW55LCBjaGVja2VkOiBib29sZWFuLCBldmVudD86IEV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIOmYu+atouS6i+S7tuWGkuazoe+8jOmBv+WFjeinpuWPkeihjOeCueWHu1xyXG4gICAgfVxyXG4gICAgLy8g5aaC5p6c6KGM6KKr56aB55So77yM5LiN5YWB6K645YiH5o2i6YCJ5Lit54q25oCBXHJcbiAgICBpZiAodGhpcy5pc1Jvd0Rpc2FibGVkKGRhdGEpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyDnm7TmjqXorr7nva7mlbDmja7lr7nosaHnmoQgY2hlY2tlZCDlsZ7mgKdcclxuICAgIGRhdGEuY2hlY2tlZCA9IGNoZWNrZWQ7XHJcblxyXG4gICAgLy8g5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd0lkc++8iOeUqOS6jui3qOmhtemAieS4re+8iVxyXG4gICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGRhdGEpO1xyXG4gICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5hZGQoaWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLmRlbGV0ZShpZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93c++8iOeUqOS6juWFvOWuueaAp++8iVxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZFJvd3MuZmluZEluZGV4KChyb3cpID0+XHJcbiAgICAgIHRoaXMuaXNTYW1lUm93KHJvdywgZGF0YSlcclxuICAgICk7XHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzLnB1c2goZGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8g5Yu+6YCJ5aSN6YCJ5qGG5pe25ZCM5q2l6K6+572u6auY5Lqu6YCJ5Lit6KGMXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBkYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd3Muc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDoi6XlvZPliY3pq5jkuq7ooYzkuLror6XooYzvvIzliJnlj5bmtojpq5jkuq5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgJiZcclxuICAgICAgICB0aGlzLmlzU2FtZVJvdyh0aGlzLl9zZWxlY3RlZFRhYmxlUm93LCBkYXRhKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlQ2hlY2tBbGxTdGF0dXMoKTtcclxuICB9XHJcblxyXG4gIC8vIOabtOaWsOWFqOmAieeKtuaAge+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIHVwZGF0ZUNoZWNrQWxsU3RhdHVzKCkge1xyXG4gICAgaWYgKCF0aGlzLnNob3dDaGVja2JveCB8fCAhQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpKSB7XHJcbiAgICAgIHRoaXMuX2NoZWNrZWRBbGwgPSBmYWxzZTtcclxuICAgICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyDlj6rorqHnrpflj6/nlKjnmoTooYzvvIjmnKrnpoHnlKjnmoTooYzvvIlcclxuICAgIGNvbnN0IGF2YWlsYWJsZVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyKFxyXG4gICAgICAocm93KSA9PiAhdGhpcy5pc1Jvd0Rpc2FibGVkKHJvdylcclxuICAgICk7XHJcbiAgICAvLyDln7rkuo7mlbDmja7lr7nosaHnmoQgY2hlY2tlZCDlsZ7mgKforqHnrpdcclxuICAgIGNvbnN0IGNoZWNrZWRDb3VudCA9IGF2YWlsYWJsZVJvd3MuZmlsdGVyKFxyXG4gICAgICAocm93KSA9PiByb3cuY2hlY2tlZCA9PT0gdHJ1ZVxyXG4gICAgKS5sZW5ndGg7XHJcbiAgICBjb25zdCB0b3RhbENvdW50ID0gYXZhaWxhYmxlUm93cy5sZW5ndGg7XHJcbiAgICB0aGlzLl9jaGVja2VkQWxsID1cclxuICAgICAgdG90YWxDb3VudCA+IDAgJiYgY2hlY2tlZENvdW50ID4gMCAmJiBjaGVja2VkQ291bnQgPT09IHRvdGFsQ291bnQ7XHJcbiAgICB0aGlzLl9pbmRldGVybWluYXRlID0gY2hlY2tlZENvdW50ID4gMCAmJiBjaGVja2VkQ291bnQgPCB0b3RhbENvdW50O1xyXG4gIH1cclxuXHJcbiAgLy8g5YWo6YCJL+WPlua2iOWFqOmAie+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIHRvZ2dsZUNoZWNrQWxsKGNoZWNrZWQ6IGJvb2xlYW4sIGV2ZW50PzogRXZlbnQpIHtcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlj6rlpITnkIblj6/nlKjnmoTooYzvvIjmnKrnpoHnlKjnmoTooYzvvIlcclxuICAgIGNvbnN0IGF2YWlsYWJsZVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyKFxyXG4gICAgICAocm93KSA9PiAhdGhpcy5pc1Jvd0Rpc2FibGVkKHJvdylcclxuICAgICk7XHJcblxyXG4gICAgLy8g5om56YeP6K6+572uIGNoZWNrZWQg5bGe5oCnXHJcbiAgICBhdmFpbGFibGVSb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICByb3cuY2hlY2tlZCA9IGNoZWNrZWQ7XHJcblxyXG4gICAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93SWRz77yI55So5LqO6Leo6aG16YCJ5Lit77yJXHJcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChyb3cpO1xyXG4gICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5hZGQoaWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5kZWxldGUoaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd3PvvIjnlKjkuo7lhbzlrrnmgKfvvIlcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93cyA9IFsuLi5hdmFpbGFibGVSb3dzXTtcclxuICAgICAgLy8g5ZCM5q2l6K6+572u6auY5Lqu6YCJ5Lit6KGM5Li656ys5LiA5p2h5Y+v6YCJ5pWw5o2uXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPVxyXG4gICAgICAgIGF2YWlsYWJsZVJvd3MubGVuZ3RoID4gMCA/IGF2YWlsYWJsZVJvd3NbMF0gOiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzID0gW107XHJcbiAgICAgIC8vIOWPlua2iOmrmOS6rlxyXG4gICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZUNoZWNrQWxsU3RhdHVzKCk7XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5bpgInkuK3nmoTooYzmlbDmja7vvIjkv53nlZnnlKjkuo7lhbzlrrnmgKfvvIlcclxuICBnZXRTZWxlY3RlZFJvd3MoKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hlY2tlZFJvd3MoKTtcclxuICB9XHJcblxyXG4gIC8vIOWkhOeQhuihjCBjaGVja2JveCDlj5jljJbkuovku7bvvIjmlbDmja7pqbHliqjmqKHlvI/vvIlcclxuICBoYW5kbGVSb3dDaGVja2VkQ2hhbmdlKGRhdGE6IGFueSwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNSb3dEaXNhYmxlZChkYXRhKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5pWw5o2u5a+56LGh55qEIGNoZWNrZWQg5bGe5oCn5bey57uP6YCa6L+H5Y+M5ZCR57uR5a6a6Ieq5Yqo5pu05pawXHJcbiAgICAvLyDov5nph4zlj6rpnIDopoHlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93SWRzIOWSjCBfc2VsZWN0ZWRSb3dzXHJcblxyXG4gICAgLy8g5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd0lkc++8iOeUqOS6jui3qOmhtemAieS4re+8iVxyXG4gICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGRhdGEpO1xyXG4gICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5hZGQoaWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLmRlbGV0ZShpZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93c++8iOeUqOS6juWFvOWuueaAp++8iVxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZFJvd3MuZmluZEluZGV4KChyb3cpID0+XHJcbiAgICAgIHRoaXMuaXNTYW1lUm93KHJvdywgZGF0YSlcclxuICAgICk7XHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzLnB1c2goZGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8g5Yu+6YCJ5aSN6YCJ5qGG5pe25ZCM5q2l6K6+572u6auY5Lqu6YCJ5Lit6KGMXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBkYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd3Muc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDoi6XlvZPliY3pq5jkuq7ooYzkuLror6XooYzvvIzliJnlj5bmtojpq5jkuq5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgJiZcclxuICAgICAgICB0aGlzLmlzU2FtZVJvdyh0aGlzLl9zZWxlY3RlZFRhYmxlUm93LCBkYXRhKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOabtOaWsOWFqOmAieeKtuaAgVxyXG4gICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yi35paw5YWo6YCJ54q25oCB77yI55So5LqO5YW25LuW5Zy65pmv77yJXHJcbiAgcmVmcmVzaENoZWNrQWxsU3RhdHVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W6KGM55qE5ZSv5LiA5qCH6K+G77yI55So5LqO6Leo6aG16YCJ5Lit77yJXHJcbiAgcHJpdmF0ZSBnZXRSb3dJZChkYXRhOiBhbnkpOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIGRhdGEuaWQgPz8gZGF0YS5rZXkgPz8gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yik5pat5Lik6KGM5piv5ZCm5Li65ZCM5LiA6KGMXHJcbiAgcHJpdmF0ZSBpc1NhbWVSb3cocm93MTogYW55LCByb3cyOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGlkMSA9IHRoaXMuZ2V0Um93SWQocm93MSk7XHJcbiAgICBjb25zdCBpZDIgPSB0aGlzLmdldFJvd0lkKHJvdzIpO1xyXG5cclxuICAgIGlmIChpZDEgIT09IHVuZGVmaW5lZCAmJiBpZDIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gaWQxID09PSBpZDI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZmFsbGJhY2sg5YiwIEpTT04g5q+U6L6DXHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocm93MSkgPT09IEpTT04uc3RyaW5naWZ5KHJvdzIpO1xyXG4gIH1cclxuXHJcbiAgLy8g5riF56m66YCJ5Lit55qE6KGM77yI5pWw5o2u6amx5Yqo5qih5byP77yJXHJcbiAgY2xlYXJTZWxlY3RlZFJvd3MoKSB7XHJcbiAgICAvLyDmuIXnqbrlvZPliY3mlbDmja7mupDkuK3miYDmnInpobnnmoQgY2hlY2tlZCDnirbmgIFcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YVNvdXJjZSkpIHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICAgIHJvdy5jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOa4heepuumAieS4rembhuWQiFxyXG4gICAgdGhpcy5fc2VsZWN0ZWRSb3dJZHMuY2xlYXIoKTtcclxuICAgIHRoaXMuX3NlbGVjdGVkUm93cyA9IFtdO1xyXG4gICAgdGhpcy5fY2hlY2tlZEFsbCA9IGZhbHNlO1xyXG4gICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVGaWVsZENoZWNrQm94Q2hhbmdlKGNoZWNrQm94T3B0aW9uczogT3B0aW9uc1R5cGVbXSwga2V5OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2V0RmllbGRzVmFsdWUoe1xyXG4gICAgICBba2V5XTogY2hlY2tCb3hPcHRpb25zXHJcbiAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5jaGVja2VkKVxyXG4gICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0udmFsdWUpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTZWFyY2goKSB7XHJcbiAgICB0aGlzLl9zYXZlZFNlYXJjaFBhcmFtcyA9IHRoaXMuY2xlYXJFbXB0eVNlYXJjaFBhcmFtcygpO1xyXG4gICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVJlc2V0Rm9ybSgpIHtcclxuICAgIE9iamVjdC5rZXlzKHRoaXMuX3NlYXJjaFBhcmFtcykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhcmdldENvbHVtbiA9IHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5maW5kKChpdGVtKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIChpdGVtLmZpZWxkUHJvcHM/Lm5hbWUgfHwgaXRlbS5wcm9wKSA9PT0ga2V5O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIOWvueS6jmNoZWNrYm9457G75Z6L77yM6ZyA6KaB54m55q6K5aSE55CG6buY6K6k5YC8XHJcbiAgICAgIGlmICh0YXJnZXRDb2x1bW4/LnZhbHVlVHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XHJcbiAgICAgICAgLy8g5LuO5Y6f5aeLY29sdW1uc+mFjee9ruS4reiOt+WPluWIneWni+mFjee9ru+8jOS7peehruS/neS9v+eUqOato+ehrueahOm7mOiupOWAvFxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHJldHVybiAoaXRlbS5maWVsZFByb3BzPy5uYW1lIHx8IGl0ZW0ucHJvcCkgPT09IGtleTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8g5LuO5Y6f5aeLb3B0aW9uc+S4reaJvuWHumNoZWNrZWTkuLp0cnVl55qE6aG55L2c5Li66buY6K6k5YC8XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxGaWVsZFByb3BzID0gb3JpZ2luYWxDb2x1bW4/LmZpZWxkUHJvcHMgYXNcclxuICAgICAgICAgIHwgQ2hlY2tib3hGaWVsZFByb3BzXHJcbiAgICAgICAgICB8IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBjaGVja2VkVmFsdWVzID0gKG9yaWdpbmFsRmllbGRQcm9wcz8ub3B0aW9ucyB8fCBbXSlcclxuICAgICAgICAgIC5maWx0ZXIoKG9wdDogT3B0aW9uc1R5cGUpID0+IG9wdC5jaGVja2VkKVxyXG4gICAgICAgICAgLm1hcCgob3B0OiBPcHRpb25zVHlwZSkgPT4gb3B0LnZhbHVlKTtcclxuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPVxyXG4gICAgICAgICAgY2hlY2tlZFZhbHVlcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgID8gY2hlY2tlZFZhbHVlc1xyXG4gICAgICAgICAgICA6IFBST19UQUJMRV9ERUZBVUxUX1BST1BTW3RhcmdldENvbHVtbi52YWx1ZVR5cGVdLnZhbHVlO1xyXG5cclxuICAgICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba2V5XSA9IGRlZmF1bHRWYWx1ZTtcclxuXHJcbiAgICAgICAgLy8g5qC55o2u6buY6K6k5YC85oGi5aSNb3B0aW9uc+eahGNoZWNrZWTnirbmgIHvvIzkvb/nlKjljp/lp4tvcHRpb25z55qE57uT5p6EXHJcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IEFycmF5LmlzQXJyYXkoZGVmYXVsdFZhbHVlKSA/IGRlZmF1bHRWYWx1ZSA6IFtdO1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsT3B0aW9ucyA9IG9yaWdpbmFsRmllbGRQcm9wcz8ub3B0aW9ucyB8fCBbXTtcclxuICAgICAgICBjb25zdCB0YXJnZXRGaWVsZFByb3BzID0gdGFyZ2V0Q29sdW1uLmZpZWxkUHJvcHMgYXMgQ2hlY2tib3hGaWVsZFByb3BzO1xyXG4gICAgICAgIHRhcmdldEZpZWxkUHJvcHMub3B0aW9ucyA9IG9yaWdpbmFsT3B0aW9ucy5tYXAoKGl0ZW06IE9wdGlvbnNUeXBlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgICBjaGVja2VkOiBkZWZhdWx0VmFsdWVzLmluY2x1ZGVzKGl0ZW0udmFsdWUpLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba2V5XSA9IHRhcmdldENvbHVtbj8uZmllbGRQcm9wc1xyXG4gICAgICAgICAgPyB0YXJnZXRDb2x1bW4/LmZpZWxkUHJvcHMudmFsdWUgfHxcclxuICAgICAgICAgICAgUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbdGFyZ2V0Q29sdW1uLnZhbHVlVHlwZV0udmFsdWVcclxuICAgICAgICAgIDogUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbdGFyZ2V0Q29sdW1uLnZhbHVlVHlwZV0udmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX3NhdmVkU2VhcmNoUGFyYW1zID0ge307XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSAxO1xyXG4gICAgdGhpcy5vblJlc2V0Rm9ybUJlZm9yZVJlbG9hZC5lbWl0KCk7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQYWdlSW5kZXhDaGFuZ2UocGFnZUluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcclxuICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVBhZ2VTaXplQ2hhbmdlKHBhZ2VTaXplOiBhbnkpIHtcclxuICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VTaXplID0gcGFnZVNpemU7XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSAxO1xyXG4gICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaGFuZGxlUXVlcnkoYWZ0ZXJEZWxldGU/OiBib29sZWFuKSB7XHJcbiAgICAvLyDliKDpmaTlkI7liLfmlrDkuJTlvZPliY3pobXku4XliankuIDmnaHorrDlvZXml7bvvIzoi6XkuI3lnKjnrKzkuIDpobXliJnlhYjlm57pgIDkuIDpobVcclxuICAgIGlmIChcclxuICAgICAgYWZ0ZXJEZWxldGUgJiZcclxuICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpICYmXHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5sZW5ndGggPT09IDEgJiZcclxuICAgICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID4gMVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA9IHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCAtIDE7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5L+d5a2Y5Yig6Zmk5YmN55qE5pWw5o2u5rqQ77yI55So5LqO5Yig6Zmk5ZCO5p+l6K+i5pe256e76Zmk6KKr5Yig6Zmk6aG555qE6YCJ5Lit54q25oCB77yJXHJcbiAgICBjb25zdCBwcmV2aW91c0RhdGFTb3VyY2UgPVxyXG4gICAgICBhZnRlckRlbGV0ZSAmJiB0aGlzLnNob3dDaGVja2JveCA/IFsuLi50aGlzLmRhdGFTb3VyY2VdIDogW107XHJcblxyXG4gICAgdGhpcy5fbG9hZGluZyA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5yZXF1ZXN0KSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHtcclxuICAgICAgICAgIHBhcmFtczogdGhpcy5jbGVhckVtcHR5U2VhcmNoUGFyYW1zKCksXHJcbiAgICAgICAgICBwYWdlSW5mbzoge1xyXG4gICAgICAgICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCxcclxuICAgICAgICAgICAgcGFnZVNpemU6IHRoaXMuX3BhZ2VJbmZvLnBhZ2VTaXplLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIC8vIOWcqOe6v+aOkuW6j+aooeW8j++8muaKiuaOkuW6j+WvueixoeaPkOS6pOe7meaOpeWPo1xyXG4gICAgICAgICAgLi4uKHRoaXMuc29ydE1vZGUgPT09IFwic2VydmVyXCJcclxuICAgICAgICAgICAgPyB7IHNvcnQ6IHRoaXMuYnVpbGRTZXJ2ZXJTb3J0UGF5bG9hZCgpIH1cclxuICAgICAgICAgICAgOiB7fSksXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIOiHquWKqOazqOWFpSBjaGVja2VkIOWtl+aute+8jOaUr+aMgei3qOmhtemAieS4rVxyXG4gICAgICAgIGlmICh0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gKHJlc3VsdC5kYXRhIHx8IFtdKS5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGl0ZW0pO1xyXG4gICAgICAgICAgICAvLyDlpoLmnpzmlbDmja7lt7LmnIkgY2hlY2tlZCDlsZ7mgKfvvIzkv53nlZnvvJvlkKbliJnmoLnmja4gX3NlbGVjdGVkUm93SWRzIOWIpOaWrVxyXG4gICAgICAgICAgICBjb25zdCBjaGVja2VkID1cclxuICAgICAgICAgICAgICBpdGVtLmNoZWNrZWQgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgPyBpdGVtLmNoZWNrZWRcclxuICAgICAgICAgICAgICAgIDogaWQgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9zZWxlY3RlZFJvd0lkcy5oYXMoaWQpXHJcbiAgICAgICAgICAgICAgICA6IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICAgICAgY2hlY2tlZDogY2hlY2tlZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIC8vIOWIoOmZpOWQjuafpeivou+8muenu+mZpOiiq+WIoOmZpOmhueeahOmAieS4reeKtuaAgVxyXG4gICAgICAgICAgaWYgKGFmdGVyRGVsZXRlICYmIHByZXZpb3VzRGF0YVNvdXJjZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGFJZHMgPSBuZXcgU2V0KFxyXG4gICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5tYXAoKGl0ZW0pID0+IHRoaXMuZ2V0Um93SWQoaXRlbSkpXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAvLyDpgY3ljobkuYvliY3nmoTmlbDmja7mupDvvIzlpoLmnpzkuI3lnKjmlrDmlbDmja7mupDkuK3vvIzor7TmmI7ooqvliKDpmaTkuobvvIzpnIDopoHmuIXpmaTlhbbpgInkuK3nirbmgIFcclxuICAgICAgICAgICAgcHJldmlvdXNEYXRhU291cmNlLmZvckVhY2goKG9sZEl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBvbGRJZCA9IHRoaXMuZ2V0Um93SWQob2xkSXRlbSk7XHJcbiAgICAgICAgICAgICAgaWYgKG9sZElkICE9PSB1bmRlZmluZWQgJiYgIW5ld0RhdGFJZHMuaGFzKG9sZElkKSkge1xyXG4gICAgICAgICAgICAgICAgLy8g6KKr5Yig6Zmk55qE6aG577yM5LuO6YCJ5Lit6ZuG5ZCI5Lit56e76ZmkXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5kZWxldGUob2xkSWQpO1xyXG4gICAgICAgICAgICAgICAgLy8g5aaC5p6c5pWw5o2u5a+56LGh6L+Y5Zyo5YW25LuW5Zyw5pa55byV55So77yM5riF6Zmk5YW26YCJ5Lit54q25oCBXHJcbiAgICAgICAgICAgICAgICBpZiAob2xkSXRlbS5jaGVja2VkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgb2xkSXRlbS5jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gcmVzdWx0LmRhdGEgfHwgW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN1bW1hcnlEYXRhID0gcmVzdWx0LnN1bW1hcnlEYXRhIHx8IG51bGw7XHJcbiAgICAgICAgLy8g5pys5Zyw5o6S5bqP5qih5byP77ya5ou/5Yiw5pWw5o2u5ZCO5Zyo5YmN56uv5o6S5bqPXHJcbiAgICAgICAgaWYgKHRoaXMuc29ydE1vZGUgPT09IFwibG9jYWxcIikge1xyXG4gICAgICAgICAgdGhpcy5zb3J0RGF0YVNvdXJjZUluUGxhY2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcGFnZUluZm8udG90YWwgPSByZXN1bHQudG90YWwgfHwgMDtcclxuICAgICAgICAvLyDmm7TmlrDlhajpgInnirbmgIFcclxuICAgICAgICBpZiAodGhpcy5zaG93Q2hlY2tib3gpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlQ2hlY2tBbGxTdGF0dXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIuafpeivouWksei0pTpcIiwgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IFtdO1xyXG4gICAgICAgIHRoaXMuX3BhZ2VJbmZvLnRvdGFsID0gMDtcclxuICAgICAgICB0aGlzLnN1bW1hcnlEYXRhID0gbnVsbDtcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICB0aGlzLl9sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIuacquaPkOS+myBfcmVxdWVzdCDlm57osIPlh73mlbBcIik7XHJcbiAgICAgIHRoaXMuX2xvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIOS4jeWGjeiwg+eUqCBjbGVhclNlbGVjdGVkUm93cygp77yM5L+d55WZ6Leo6aG16YCJ5Lit54q25oCBXHJcbiAgfVxyXG5cclxuICAvLyDop6blj5HliJfmjpLluo/lj5jmm7RcclxuICBvblNvcnRDaGFuZ2Uoc29ydEtleTogc3RyaW5nLCBzb3J0T3JkZXI6IFwiYXNjZW5kXCIgfCBcImRlc2NlbmRcIiB8IG51bGwpIHtcclxuICAgIC8vIOWNleWIl+aOkuW6j++8mumHjee9ruWFtuWug+WIl++8m+WkmuWIl+aOkuW6j++8muS/neeVmeWFtuWug+WIl1xyXG4gICAgaWYgKCF0aGlzLm11bHRpcGxlU29ydCkge1xyXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLl9zb3J0TWFwKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICBpZiAoa2V5ICE9PSBzb3J0S2V5KSB0aGlzLl9zb3J0TWFwW2tleV0gPSBudWxsO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuX3NvcnRNYXBbc29ydEtleV0gPSBzb3J0T3JkZXI7XHJcblxyXG4gICAgLy8g57u05oqk5LyY5YWI57qn6Zif5YiX77ya5pyJ5bqP5YiX5LiU6Z2e56m6IC0+IOe9ruS6juacq+Wwvu+8m+S4uuepuiAtPiDnp7vpmaRcclxuICAgIHRoaXMuX3NvcnRQcmlvcml0eSA9IHRoaXMuX3NvcnRQcmlvcml0eS5maWx0ZXIoKGspID0+IGsgIT09IHNvcnRLZXkpO1xyXG4gICAgaWYgKHNvcnRPcmRlcikge1xyXG4gICAgICB0aGlzLl9zb3J0UHJpb3JpdHkucHVzaChzb3J0S2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zb3J0TW9kZSA9PT0gXCJsb2NhbFwiKSB7XHJcbiAgICAgIHRoaXMuc29ydERhdGFTb3VyY2VJblBsYWNlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyDlnKjnur/mjpLluo/vvJrph43mlrDor7fmsYJcclxuICAgICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U29ydE9yZGVyKHNvcnRLZXk6IHN0cmluZyk6IFwiYXNjZW5kXCIgfCBcImRlc2NlbmRcIiB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NvcnRNYXBbc29ydEtleV0gfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIGhhbmRsZVRhYmxlUm93Q2xpY2soZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gZGF0YTtcclxuICAgIC8vIOWmguaenOW8gOWQr+S6huWkjemAieahhu+8jOeCueWHu+ihjOaXtuWPqumAieS4reeCueWHu+ihjO+8iOWmguaenOihjOacquiiq+emgeeUqO+8iVxyXG4gICAgaWYgKHRoaXMuc2hvd0NoZWNrYm94ICYmICF0aGlzLmlzUm93RGlzYWJsZWQoZGF0YSkpIHtcclxuICAgICAgLy8g5YWI5riF56m65omA5pyJ6YCJ5Lit6KGMXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93cyA9IFtdO1xyXG4gICAgICAvLyDlj6rpgInkuK3lvZPliY3ngrnlh7vnmoTooYxcclxuICAgICAgdGhpcy50b2dnbGVSb3dDaGVja2VkKGRhdGEsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vblJvd0NsaWNrLmVtaXQodGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVUYWJsZVJvd0RiQ2xpY2soZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gZGF0YTtcclxuICAgIHRoaXMub25Sb3dEYkNsaWNrLmVtaXQodGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVDb2x1bW5zU2V0dGluZ0NvbmZpcm0oKSB7XHJcbiAgICB0aGlzLnF1ZXJ5RHluYW1pY0NvbHVtbnMoKTtcclxuICB9XHJcblxyXG4gIC8vIOWkhOeQhiBhdXRvQ29tcGxldGUg6L6T5YWl5LqL5Lu277yI5bim6Ziy5oqW77yJXHJcbiAgaGFuZGxlQXV0b0NvbXBsZXRlSW5wdXQoZXZlbnQ6IEV2ZW50LCBjb2x1bW46IFByb1RhYmxlQ29sdW1uKSB7XHJcbiAgICBjb25zdCBmaWVsZEtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG5cclxuICAgIC8vIOWmguaenOivpeWtl+autei/mOayoeaciemYsuaKluWHveaVsO+8jOWIm+W7uuS4gOS4qlxyXG4gICAgaWYgKCF0aGlzLl9hdXRvQ29tcGxldGVEZWJvdW5jZU1hcC5oYXMoZmllbGRLZXkpKSB7XHJcbiAgICAgIGNvbnN0IGRlYm91bmNlZEZuID0gZGVib3VuY2UoKGV2dDogRXZlbnQpID0+IHtcclxuICAgICAgICAvLyDph43mlrDmn6Xmib7lr7nlupTnmoQgY29sdW1u77yM56Gu5L+d5L2/55So5pyA5paw55qE6YWN572uXHJcbiAgICAgICAgY29uc3QgY3VycmVudENvbHVtbiA9IHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5maW5kKFxyXG4gICAgICAgICAgKGNvbCkgPT4gKGNvbC5maWVsZFByb3BzPy5uYW1lIHx8IGNvbC5wcm9wKSA9PT0gZmllbGRLZXlcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChjdXJyZW50Q29sdW1uKSB7XHJcbiAgICAgICAgICB0aGlzLmV4ZWN1dGVBdXRvQ29tcGxldGVEYXRhU291cmNlKGV2dCwgY3VycmVudENvbHVtbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAzMDApOyAvLyAzMDBtcyDpmLLmipblu7bov59cclxuICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGVib3VuY2VNYXAuc2V0KGZpZWxkS2V5LCBkZWJvdW5jZWRGbik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g6LCD55So6Ziy5oqW5Ye95pWwXHJcbiAgICBjb25zdCBkZWJvdW5jZWRGbiA9IHRoaXMuX2F1dG9Db21wbGV0ZURlYm91bmNlTWFwLmdldChmaWVsZEtleSk7XHJcbiAgICBpZiAoZGVib3VuY2VkRm4pIHtcclxuICAgICAgZGVib3VuY2VkRm4oZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+WIGF1dG9Db21wbGV0ZSDnmoTmlbDmja7mupBcclxuICBnZXRBdXRvQ29tcGxldGVEYXRhU291cmNlKGNvbHVtbjogUHJvVGFibGVDb2x1bW4pOiBhbnlbXSB7XHJcbiAgICBjb25zdCBmaWVsZEtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG4gICAgcmV0dXJuIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2ZpZWxkS2V5XSB8fCBbXTtcclxuICB9XHJcblxyXG4gIGdldEZpZWxkUHJvcHMoY29sdW1uOiBQcm9UYWJsZUNvbHVtbik6IGFueSB7XHJcbiAgICByZXR1cm4gY29sdW1uLmZpZWxkUHJvcHM7XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5bmjIflrprlkI3np7DnmoRsYWJlbOaooeadv1xyXG4gIGdldExhYmVsVGVtcGxhdGUobmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xyXG4gICAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLmN1c3RvbVRlbXBsYXRlcy5nZXQobmFtZSkgfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPliBmb3JtLWl0ZW0g55qE5Yqo5oCB57G75ZCNXHJcbiAgZ2V0Rm9ybUl0ZW1DbGFzc05hbWUoY29sdW1uOiBQcm9UYWJsZUNvbHVtbik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBmaWVsZE5hbWUgPSB0aGlzLmdldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG4gICAgcmV0dXJuIGBwcm8tdGFibGUtJHtmaWVsZE5hbWV9LWZvcm0taXRlbWA7XHJcbiAgfVxyXG59XHJcbiJdfQ==
1122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byby10YWJsZS9zcmMvbGliL3Byby10YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN2RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFXaEYsT0FBTyxFQUFFLHVCQUF1QixFQUErQixNQUFNLFVBQVUsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBT3BDLE1BQU0sT0FBTyxpQkFBaUI7SUFtSTVCLFlBR1UsWUFBZ0Q7UUFBaEQsaUJBQVksR0FBWixZQUFZLENBQW9DO1FBcklqRCxrQkFBYSxHQUFZLElBQUksQ0FBQztRQUU5QixpQkFBWSxHQUFZLElBQUksQ0FBQztRQUU3QixVQUFLLEdBQWtCLElBQUksQ0FBQztRQUU1QixjQUFTLEdBQVcsRUFBRSxDQUFDO1FBRXZCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFMUIsWUFBTyxHQUFxQixFQUFFLENBQUM7UUFFL0Isa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFFOUIsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFFOUIsbUJBQWMsR0FBVyxJQUFJLENBQUM7UUFFOUIsaUJBQVksR0FBVyxJQUFJLENBQUM7UUFFNUIsZUFBVSxHQUFXLE1BQU0sQ0FBQztRQUU1QixlQUFVLEdBQVcsT0FBTyxDQUFDO1FBRTdCLGtCQUFhLEdBQVcs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QUFLO3VCQUVMLEtBQUs7NEJBRUwsS0FBSzs2QkFFTCxLQUFLOzhCQUVMLEtBQUs7cUJBRUwsS0FBSztzQkFFTCxLQUFLOzBCQUVMLEtBQUs7dUJBR0wsS0FBSztnQ0FFTCxLQUFLOzJCQUdMLEtBQUs7MkJBRUwsS0FBSzswQkFHTCxLQUFLO2lDQUdMLEtBQUs7Z0NBRUwsS0FBSzt5QkFFTCxNQUFNOzJCQUVOLE1BQU07NkJBRU4sTUFBTTtzQ0FFTixNQUFNOzJCQUVOLFlBQVksU0FBQyxXQUFXOzhCQUV4QixZQUFZLFNBQUMsY0FBYzsyQkFFM0IsZUFBZSxTQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyQ29udGVudEluaXQsXHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbnRlbnRDaGlsZCxcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBUZW1wbGF0ZVJlZixcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBjbG9uZURlZXAsIGhhc0luLCBpc05pbCwgZGVib3VuY2UsIGlzRXF1YWwgfSBmcm9tIFwibG9kYXNoLWVzXCI7XHJcbmltcG9ydCB7IFBST19UQUJMRV9ERUZBVUxUX0NPTFVNTiwgUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHtcclxuICBBdXRvQ29tcGxldGVGaWVsZFByb3BzLFxyXG4gIENoZWNrYm94RmllbGRQcm9wcyxcclxuICBPcHRpb25zVHlwZSxcclxuICBQcm9UYWJsZUNvbHVtbixcclxuICBQcm9UYWJsZVBhZ2VJbmZvLFxyXG4gIFByb1RhYmxlUmVxdWVzdFJlc3VsdCxcclxuICBQcm9UYWJsZVZhbHVlc0NoYW5nZSxcclxuICBTZWxlY3RGaWVsZFByb3BzLFxyXG59IGZyb20gXCIuL3R5cGVcIjtcclxuaW1wb3J0IHsgUFJPX1RBQkxFX0NPTFVNTl9SRU1PVEUsIFByb1RhYmxlUmVtb3RlQ29sdW1uU2VydmljZSB9IGZyb20gXCIuL3Rva2Vuc1wiO1xyXG5pbXBvcnQgeyBpc09ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiYXBwLXByby10YWJsZVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vcHJvLXRhYmxlLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL3Byby10YWJsZS5jb21wb25lbnQubGVzc1wiXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFByb1RhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcclxuICBASW5wdXQoKSBzaG93U2VhcmNoQnRuOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgc2hvd0NsZWFyQnRuOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBASW5wdXQoKSB0YWJsZU5hbWU6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIEBJbnB1dCgpIG11bHRpUm93OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkgc2hvd1NlYXJjaEJhcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dBY3Rpb25CYXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBjb25maXJtQnRuVGV4dDogc3RyaW5nID0gXCLmn6Xor6JcIjtcclxuXHJcbiAgQElucHV0KCkgY2xlYXJCdG5UZXh0OiBzdHJpbmcgPSBcIua4heepulwiO1xyXG5cclxuICBASW5wdXQoKSBsYWJlbFdpZHRoOiBzdHJpbmcgPSBcIjkwcHhcIjtcclxuXHJcbiAgQElucHV0KCkgbGFiZWxBbGlnbjogc3RyaW5nID0gXCJyaWdodFwiO1xyXG5cclxuICBASW5wdXQoKSBmb3JtSXRlbVdpZHRoOiBzdHJpbmcgPSBcIjI3MHB4XCI7XHJcblxyXG4gIEBJbnB1dCgpIGRhdGFTb3VyY2U6IGFueVtdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIGJvcmRlcmVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgb3V0ZXJCb3JkZXJlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dQYWdpbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgZnJvbnRQYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHNjcm9sbDogeyB4Pzogc3RyaW5nIHwgbnVtYmVyOyB5Pzogc3RyaW5nIHwgbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQElucHV0KCkgcmVxdWVzdDogKHBhcmFtczogYW55KSA9PiBQcm9taXNlPFByb1RhYmxlUmVxdWVzdFJlc3VsdD47XHJcblxyXG4gIEBJbnB1dCgpIHN1bW1hcnlEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8vIOaOkuW6j+aooeW8j++8mmxvY2FsIOacrOWcsOaOkuW6j++8m3NlcnZlciDlnKjnur/mjpLluo/vvIjmj5DkuqTnu5nmjqXlj6PvvIlcclxuICBASW5wdXQoKSBzb3J0TW9kZTogXCJsb2NhbFwiIHwgXCJzZXJ2ZXJcIiA9IFwibG9jYWxcIjtcclxuXHJcbiAgQElucHV0KCkgc2hvd0NvbHVtblNldHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8g5piv5ZCm5byA5ZCv5aSa5YiX5o6S5bqP77yI6buY6K6k5Y2V5YiX77yJXHJcbiAgQElucHV0KCkgbXVsdGlwbGVTb3J0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dDaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyDliKTmlq3ooYzmmK/lkKbnpoHnlKjnmoTlh73mlbBcclxuICBASW5wdXQoKSByb3dEaXNhYmxlZDogKGRhdGE6IGFueSkgPT4gYm9vbGVhbiA9ICgpID0+IGZhbHNlO1xyXG5cclxuICAvLyDmmK/lkKboh6rliqjop6blj5Hor7fmsYJcclxuICBASW5wdXQoKSBhdXRvVHJpZ2dlclJlcXVlc3Q6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBjdXN0b21UYWJsZVJlbmRlcj86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIEBPdXRwdXQoKSBvblJvd0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBvblJvd0RiQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIG9uVmFsdWVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQcm9UYWJsZVZhbHVlc0NoYW5nZT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIG9uUmVzZXRGb3JtQmVmb3JlUmVsb2FkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoXCJhY3Rpb25CYXJcIikgYWN0aW9uQmFyVHBsITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChcIkltZ0FjdGlvbkJhclwiKSBpbWdBY3Rpb25CYXJUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlUmVmKSBhbGxUZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XHJcblxyXG4gIHByaXZhdGUgX3NhdmVkU2VhcmNoUGFyYW1zOiBhbnkgPSB7fTtcclxuXHJcbiAgLy8g5a2Y5YKo5omA5pyJ6Ieq5a6a5LmJ5qih5p2/55qE5byV55SoXHJcbiAgcHJpdmF0ZSBjdXN0b21UZW1wbGF0ZXMgPSBuZXcgTWFwPHN0cmluZywgVGVtcGxhdGVSZWY8YW55Pj4oKTtcclxuXHJcbiAgLy8g6K6w5b2V5ZCE5YiX5o6S5bqP54q25oCB77yaJ2FzY2VuZCcgfCAnZGVzY2VuZCcgfCBudWxsXHJcblxyXG4gIHByaXZhdGUgX3NvcnRNYXA6IFJlY29yZDxzdHJpbmcsIFwiYXNjZW5kXCIgfCBcImRlc2NlbmRcIiB8IG51bGw+ID0ge307XHJcblxyXG4gIC8vIOiusOW9leWkmuWIl+aOkuW6j+eahOS8mOWFiOe6p++8iOWQjuiuvue9rueahOS8mOWFiO+8iVxyXG4gIHByaXZhdGUgX3NvcnRQcmlvcml0eTogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgLy8g5a2Y5YKo5q+P5LiqIGF1dG9Db21wbGV0ZSDlrZfmrrXnmoTpmLLmipblh73mlbBcclxuICBwcml2YXRlIF9hdXRvQ29tcGxldGVEZWJvdW5jZU1hcDogTWFwPHN0cmluZywgKGV2ZW50OiBFdmVudCkgPT4gdm9pZD4gPVxyXG4gICAgbmV3IE1hcCgpO1xyXG5cclxuICAvLyDku4XlnKjliJ3lp4vljJbml7bov5DooYzliJfphY3nva7pooTmo4Dmn6XvvIzpgb/lhY3lkI7nu63osIPnlKjph43lpI3op6blj5FcclxuICBwcml2YXRlIF9wcmVDaGVja0RvbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgX2NvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgLy8g562b6YCJ6KGo5Y2V5pWw5o2u5a2Y5YKoXHJcbiAgX3NlYXJjaFBhcmFtczogYW55ID0ge307XHJcblxyXG4gIC8vIOetm+mAieihqOWNlWxpc3TmuLLmn5PmlbDmja5cclxuICBfc2VhcmNoRmlsZWRDb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcblxyXG4gIF9wYWdlSW5mbzogUHJvVGFibGVQYWdlSW5mbyA9IHtcclxuICAgIHBhZ2VJbmRleDogMSxcclxuICAgIHBhZ2VTaXplOiAxNSxcclxuICAgIHRvdGFsOiAxMDAsXHJcbiAgICBwYWdlU2l6ZU9wdGlvbnM6IFsxMCwgMTUsIDIwLCA1MCwgMTAwLCA1MDAsIDEwMDBdLFxyXG4gIH07XHJcblxyXG4gIF9sb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIF9zZWxlY3RlZFRhYmxlUm93OiBhbnkgPSBudWxsO1xyXG5cclxuICAvLyDpgInkuK3nmoTooYzmlbDmja7vvIjnlKjkuo7lpI3pgInmoYbpgInmi6nvvIktIOS/neeVmeeUqOS6juWFvOWuueaAp1xyXG4gIF9zZWxlY3RlZFJvd3M6IGFueVtdID0gW107XHJcblxyXG4gIC8vIOS9v+eUqCBTZXQg5a2Y5YKo6YCJ5Lit6aG555qEIElE77yM5pSv5oyB6Leo6aG16YCJ5LitXHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSb3dJZHMgPSBuZXcgU2V0PHN0cmluZyB8IG51bWJlcj4oKTtcclxuXHJcbiAgLy8g5YWo6YCJ54q25oCBXHJcbiAgX2NoZWNrZWRBbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8g5Y2K6YCJ54q25oCB77yI6YOo5YiG6YCJ5Lit77yJXHJcbiAgX2luZGV0ZXJtaW5hdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8g6L+c56iLY29sdW1uc1xyXG4gIF9zZXJ2ZXJDb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcblxyXG4gIC8vIOWtmOWCqCBhdXRvQ29tcGxldGUg5a2X5q6155qE5pWw5o2u5rqQXHJcbiAgX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBhbnlbXT4gPSB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBAT3B0aW9uYWwoKVxyXG4gICAgQEluamVjdChQUk9fVEFCTEVfQ09MVU1OX1JFTU9URSlcclxuICAgIHByaXZhdGUgY29sdW1uUmVtb3RlOiBQcm9UYWJsZVJlbW90ZUNvbHVtblNlcnZpY2UgfCBudWxsXHJcbiAgKSB7fVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGZldGNoUmVtb3RlQ29sdW1ucygpIHtcclxuICAgIGlmICghdGhpcy5jb2x1bW5SZW1vdGU/LmdldENvbCB8fCAhdGhpcy50YWJsZU5hbWUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNvbHVtblJlbW90ZS5nZXRDb2wodGhpcy50YWJsZU5hbWUsIHRoaXMubXVsdGlSb3cpO1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHBlcnNpc3RSZW1vdGVDb2x1bW5zKGNvbHVtbnM6IGFueVtdKSB7XHJcbiAgICBpZiAoIXRoaXMuY29sdW1uUmVtb3RlPy5zZXRDb2wgfHwgIXRoaXMudGFibGVOYW1lKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb2x1bW5SZW1vdGUuc2V0Q29sKFxyXG4gICAgICAgIHRoaXMudGFibGVOYW1lLFxyXG4gICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgdGhpcy5tdWx0aVJvd1xyXG4gICAgICApO1xyXG4gICAgICBpZiAocmVzdWx0ICYmIGlzT2JzZXJ2YWJsZShyZXN1bHQpKSB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3VsdC50b1Byb21pc2UoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtcyA9IHt9O1xyXG4gICAgdGhpcy5mb3JtYXRlSW5uZXJDb2x1bW5zKHRoaXMuY29sdW1ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnNldFNlYXJjaFBhcmFtcyh0aGlzLmNvbHVtbnMpO1xyXG5cclxuICAgIC8vIOS9v+eUqCBQcm94eSDljIXoo4UgX3NlYXJjaFBhcmFtc++8jOaLpuaIquihqOWNlemhueWAvOWPmOWMluW5tuWQkeWkluWPkeWHuuS6i+S7tlxyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zID0gdGhpcy5jcmVhdGVTZWFyY2hQYXJhbXNQcm94eSh0aGlzLl9zZWFyY2hQYXJhbXMpO1xyXG4gICAgaWYgKHRoaXMuYXV0b1RyaWdnZXJSZXF1ZXN0KSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICAgIH1cclxuICAgIHRoaXMucXVlcnlEeW5hbWljQ29sdW1ucygpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xyXG4gICAgLy8g6Ieq5Yqo5rOo5YaM5omA5pyJ6Ieq5a6a5LmJ5qih5p2/XHJcbiAgICAvLyDms6jmhI/vvJrmraTml7bmiYDmnIkgQ29udGVudENoaWxkIOWSjCBDb250ZW50Q2hpbGRyZW4g6YO95bey5Yid5aeL5YyW5a6M5oiQXHJcbiAgICB0aGlzLmF1dG9SZWdpc3RlclRlbXBsYXRlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwcmVDaGVja1NlcnZlckNvbHVtbnMoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmZldGNoUmVtb3RlQ29sdW1ucygpO1xyXG4gICAgaWYgKCFyZXMpIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IGluaXRDb2x1bW5zID0gdGhpcy5jb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gIWNvbC5hdXhpbGlhcnlDb2x1bW4pXHJcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBmaWVsZDogY29sdW1uLnByb3AsXHJcbiAgICAgICAgICBpc1Nob3c6ICFjb2x1bW4uaGlkZUluVGFibGUsIC8vIOm7mOiupOWFqOmDqOaYvuekulxyXG4gICAgICAgICAgaGVhZGVyOiBjb2x1bW4udGl0bGUsXHJcbiAgICAgICAgICBzb3J0TmFtZTogY29sdW1uLnNvcnROYW1lIHx8IG51bGwsXHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICBpZiAocmVzLmNvZGUgPT09IDApIHtcclxuICAgICAgaWYgKCFpc0VxdWFsKHJlcy5kYXRhLnRhYkNvbHVtbiwgaW5pdENvbHVtbnMpKSB7XHJcbiAgICAgICAgY29uc3QgaW5pdFJlcyA9IGF3YWl0IHRoaXMucGVyc2lzdFJlbW90ZUNvbHVtbnMoaW5pdENvbHVtbnMpO1xyXG4gICAgICAgIGlmIChpbml0UmVzKSB7XHJcbiAgICAgICAgICB0aGlzLnF1ZXJ5RHluYW1pY0NvbHVtbnMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIuS4gOiHtFwiKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBxdWVyeUR5bmFtaWNDb2x1bW5zKCkge1xyXG4gICAgaWYgKCF0aGlzLnRhYmxlTmFtZSB8fCAhdGhpcy5jb2x1bW5SZW1vdGUpIHJldHVybjtcclxuICAgIGlmICghdGhpcy5fcHJlQ2hlY2tEb25lKSB7XHJcbiAgICAgIGNvbnN0IGNoZWNrUmVzdWx0ID0gYXdhaXQgdGhpcy5wcmVDaGVja1NlcnZlckNvbHVtbnMoKTtcclxuICAgICAgdGhpcy5fcHJlQ2hlY2tEb25lID0gdHJ1ZTtcclxuICAgICAgaWYgKCFjaGVja1Jlc3VsdCkgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5mZXRjaFJlbW90ZUNvbHVtbnMoKTtcclxuICAgIGlmICghcmVzKSByZXR1cm47XHJcbiAgICBpZiAocmVzLmNvZGUgPT09IDApIHtcclxuICAgICAgY29uc3QgX3RhYkNvbHVtbiA9IHJlcy5kYXRhLnRhYkNvbHVtbi5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgdGl0bGU6IGl0ZW0uaGVhZGVyLFxyXG4gICAgICAgICAgcHJvcDogaXRlbS5maWVsZCxcclxuICAgICAgICAgIHNvcnROYW1lOiBpdGVtLnNvcnROYW1lLFxyXG4gICAgICAgICAgaGlkZUluVGFibGU6ICFpdGVtLmlzU2hvdyxcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5fc2VydmVyQ29sdW1ucyA9IF90YWJDb2x1bW47XHJcbiAgICAgIHRoaXMudXBkYXRlVGFibGVDb2x1bW5zKF90YWJDb2x1bW4pO1xyXG4gICAgfSBlbHNlIGlmIChyZXMuY29kZSA9PT0gMTApIHtcclxuICAgICAgLy8g5aaC5p6c5pyq6K6+572u5o6l5Y+j6L+U5Zue77yM6ZyA6KaB6buY6K6k6LCD55So5LiA5qyh5L+u5pS55Ye95pWw5Yid5aeL5YyW5pWw5o2uXHJcbiAgICAgIGNvbnN0IGluaXRDb2x1bW5zID0gdGhpcy5jb2x1bW5zXHJcbiAgICAgICAgLmZpbHRlcigoY29sKSA9PiAhY29sLmF1eGlsaWFyeUNvbHVtbilcclxuICAgICAgICAubWFwKChjb2x1bW4pID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGZpZWxkOiBjb2x1bW4ucHJvcCxcclxuICAgICAgICAgICAgaXNTaG93OiB0cnVlLCAvLyDpu5jorqTlhajpg6jmmL7npLpcclxuICAgICAgICAgICAgaGVhZGVyOiBjb2x1bW4udGl0bGUsXHJcbiAgICAgICAgICAgIHNvcnROYW1lOiBjb2x1bW4uc29ydE5hbWUgfHwgbnVsbCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAvLyDosIPnlKjkv67mlLnmjqXlj6PliJ3lp4vljJbmlbDmja5cclxuICAgICAgY29uc3QgaW5pdFJlcyA9IGF3YWl0IHRoaXMucGVyc2lzdFJlbW90ZUNvbHVtbnMoaW5pdENvbHVtbnMpO1xyXG4gICAgICBpZiAoaW5pdFJlcykge1xyXG4gICAgICAgIHRoaXMucXVlcnlEeW5hbWljQ29sdW1ucygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdGVJbm5lckNvbHVtbnMoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgdGhpcy5fY29sdW1ucyA9IGNvbHVtbnNcclxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaGlkZUluVGFibGUpXHJcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICByZXR1cm4geyAuLi5QUk9fVEFCTEVfREVGQVVMVF9DT0xVTU4sIC4uLml0ZW0gfSBhcyBQcm9UYWJsZUNvbHVtbjtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDoh6rliqjms6jlhozmqKHmnb/nmoTmlrnms5VcclxuICBwcml2YXRlIGF1dG9SZWdpc3RlclRlbXBsYXRlcygpIHtcclxuICAgIC8vIOiOt+WPluaJgOacieaooeadv1xyXG4gICAgY29uc3QgYWxsVGVtcGxhdGVzQXJyYXkgPSB0aGlzLmFsbFRlbXBsYXRlcy50b0FycmF5KCk7XHJcblxyXG4gICAgLy8g6I635Y+W5omA5pyJ6ZyA6KaB6Ieq5a6a5LmJ5qih5p2/55qE5YiXXHJcbiAgICBjb25zdCBjb2x1bW5zV2l0aEN1c3RvbVJlbmRlciA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKFxyXG4gICAgICAoY29sKSA9PiBjb2wuY3VzdG9tUmVuZGVyXHJcbiAgICApO1xyXG5cclxuICAgIC8vIOiOt+WPluaJgOaciemcgOimgeiHquWumuS5iWxhYmVs5qih5p2/55qE5YiX77yI5L2/55So5Y6f5aeLY29sdW1uc++8jOehruS/nemhuuW6j+ato+ehru+8iVxyXG4gICAgY29uc3QgY29sdW1uc1dpdGhDdXN0b21MYWJlbCA9IHRoaXMuY29sdW1ucy5maWx0ZXIoXHJcbiAgICAgIChjb2wpID0+IGNvbC5jdXN0b21MYWJlbFJlbmRlclxyXG4gICAgKTtcclxuXHJcbiAgICAvLyDorqHnrpfpnIDopoHnmoTmqKHmnb/mgLvmlbBcclxuICAgIGNvbnN0IGN1c3RvbVJlbmRlckNvdW50ID0gY29sdW1uc1dpdGhDdXN0b21SZW5kZXIubGVuZ3RoO1xyXG4gICAgY29uc3QgdG90YWxOZWVkZWRUZW1wbGF0ZXMgPSBjdXN0b21SZW5kZXJDb3VudCArIGNvbHVtbnNXaXRoQ3VzdG9tTGFiZWwubGVuZ3RoO1xyXG5cclxuICAgIC8vIOivhuWIq+W5tuaOkumZpOeJueauiuaooeadv++8iGFjdGlvbkJhciDlkowgaW1nQWN0aW9uQmFy77yJXHJcbiAgICBjb25zdCBzcGVjaWFsVGVtcGxhdGVJbmRpY2VzID0gbmV3IFNldDxudW1iZXI+KCk7XHJcbiAgICBcclxuICAgIC8vIOWwneivleaJvuWIsCBhY3Rpb25CYXJUcGwg5ZyoIGFsbFRlbXBsYXRlc0FycmF5IOS4reeahOS9jee9rlxyXG4gICAgaWYgKHRoaXMuYWN0aW9uQmFyVHBsKSB7XHJcbiAgICAgIGNvbnN0IGFjdGlvbkJhckluZGV4ID0gdGhpcy5maW5kVGVtcGxhdGVJbmRleChhbGxUZW1wbGF0ZXNBcnJheSwgdGhpcy5hY3Rpb25CYXJUcGwpO1xyXG4gICAgICBpZiAoYWN0aW9uQmFySW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgc3BlY2lhbFRlbXBsYXRlSW5kaWNlcy5hZGQoYWN0aW9uQmFySW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIOWwneivleaJvuWIsCBpbWdBY3Rpb25CYXJUcGwg5ZyoIGFsbFRlbXBsYXRlc0FycmF5IOS4reeahOS9jee9rlxyXG4gICAgaWYgKHRoaXMuaW1nQWN0aW9uQmFyVHBsKSB7XHJcbiAgICAgIGNvbnN0IGltZ0FjdGlvbkJhckluZGV4ID0gdGhpcy5maW5kVGVtcGxhdGVJbmRleChhbGxUZW1wbGF0ZXNBcnJheSwgdGhpcy5pbWdBY3Rpb25CYXJUcGwpO1xyXG4gICAgICBpZiAoaW1nQWN0aW9uQmFySW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgc3BlY2lhbFRlbXBsYXRlSW5kaWNlcy5hZGQoaW1nQWN0aW9uQmFySW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c5peg5rOV6YCa6L+H5byV55So5om+5Yiw54m55q6K5qih5p2/77yM5L2/55So5aSH55So562W55WlXHJcbiAgICAvLyDlpIfnlKjnrZbnlaXvvJrlgYforr7mnIDlkI7nmoTmqKHmnb/mmK/nibnmrormqKHmnb9cclxuICAgIGNvbnN0IHNwZWNpYWxUZW1wbGF0ZUNvdW50ID0gKHRoaXMuYWN0aW9uQmFyVHBsID8gMSA6IDApICsgKHRoaXMuaW1nQWN0aW9uQmFyVHBsID8gMSA6IDApO1xyXG4gICAgaWYgKHNwZWNpYWxUZW1wbGF0ZUluZGljZXMuc2l6ZSA9PT0gMCAmJiBzcGVjaWFsVGVtcGxhdGVDb3VudCA+IDApIHtcclxuICAgICAgZm9yIChsZXQgaSA9IGFsbFRlbXBsYXRlc0FycmF5Lmxlbmd0aCAtIHNwZWNpYWxUZW1wbGF0ZUNvdW50OyBpIDwgYWxsVGVtcGxhdGVzQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmFkZChpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOaPkOWPluWIl+aooeadv++8iOaOkumZpOeJueauiuaooeadv++8iVxyXG4gICAgY29uc3QgY29sdW1uVGVtcGxhdGVzOiBUZW1wbGF0ZVJlZjxhbnk+W10gPSBbXTtcclxuICAgIGFsbFRlbXBsYXRlc0FycmF5LmZvckVhY2goKHRwbCwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKCFzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmhhcyhpbmRleCkpIHtcclxuICAgICAgICBjb2x1bW5UZW1wbGF0ZXMucHVzaCh0cGwpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDpqozor4HmqKHmnb/mlbDph49cclxuICAgIGlmIChjb2x1bW5UZW1wbGF0ZXMubGVuZ3RoICE9PSB0b3RhbE5lZWRlZFRlbXBsYXRlcykge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFByb1RhYmxlOiDmqKHmnb/mlbDph4/kuI3ljLnphY3vvIHpnIDopoEgJHt0b3RhbE5lZWRlZFRlbXBsYXRlc30g5Liq5YiX5qih5p2/77yM5a6e6ZmF5pyJICR7Y29sdW1uVGVtcGxhdGVzLmxlbmd0aH0g5Liq44CC6K+35qOA5p+lIGN1c3RvbVJlbmRlciDlkowgY3VzdG9tTGFiZWxSZW5kZXIg6YWN572u44CCYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOazqOWGjOiHquWumuS5iea4suafk+aooeadv1xyXG4gICAgY29sdW1uc1dpdGhDdXN0b21SZW5kZXIuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xyXG4gICAgICBjb25zdCB0ZW1wbGF0ZU5hbWUgPSBjb2x1bW4uY3VzdG9tUmVuZGVyITtcclxuICAgICAgaWYgKGluZGV4IDwgY29sdW1uVGVtcGxhdGVzLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzLnNldCh0ZW1wbGF0ZU5hbWUsIGNvbHVtblRlbXBsYXRlc1tpbmRleF0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFByb1RhYmxlOiDmnKrmib7liLDmqKHmnb8gXCIke3RlbXBsYXRlTmFtZX1cIu+8jOe0ouW8lSAke2luZGV4fSDotoXlh7rojIPlm7RgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g5rOo5YaM6Ieq5a6a5LmJbGFiZWzmqKHmnb/vvIjku44gY3VzdG9tUmVuZGVyQ291bnQg5LmL5ZCO5byA5aeL77yJXHJcbiAgICBjb2x1bW5zV2l0aEN1c3RvbUxhYmVsLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcclxuICAgICAgY29uc3QgdGVtcGxhdGVOYW1lID0gY29sdW1uLmN1c3RvbUxhYmVsUmVuZGVyITtcclxuICAgICAgY29uc3QgdGVtcGxhdGVJbmRleCA9IGN1c3RvbVJlbmRlckNvdW50ICsgaW5kZXg7XHJcbiAgICAgIGlmICh0ZW1wbGF0ZUluZGV4IDwgY29sdW1uVGVtcGxhdGVzLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzLnNldCh0ZW1wbGF0ZU5hbWUsIGNvbHVtblRlbXBsYXRlc1t0ZW1wbGF0ZUluZGV4XSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgUHJvVGFibGU6IOacquaJvuWIsGxhYmVs5qih5p2/IFwiJHt0ZW1wbGF0ZU5hbWV9XCLvvIzntKLlvJUgJHt0ZW1wbGF0ZUluZGV4fSDotoXlh7rojIPlm7RgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDlsJ3or5XlnKjmlbDnu4TkuK3mib7liLDmqKHmnb/nmoTntKLlvJXvvIjkvb/nlKjlpJrnp43mr5TovoPmlrnlvI/vvIlcclxuICBwcml2YXRlIGZpbmRUZW1wbGF0ZUluZGV4KHRlbXBsYXRlczogVGVtcGxhdGVSZWY8YW55PltdLCB0YXJnZXQ6IFRlbXBsYXRlUmVmPGFueT4pOiBudW1iZXIge1xyXG4gICAgLy8g5pa55rOVMe+8muW8leeUqOebuOetieaAp1xyXG4gICAgbGV0IGluZGV4ID0gdGVtcGxhdGVzLmluZGV4T2YodGFyZ2V0KTtcclxuICAgIGlmIChpbmRleCAhPT0gLTEpIHJldHVybiBpbmRleDtcclxuXHJcbiAgICAvLyDmlrnms5Uy77ya6YCa6L+HIGVsZW1lbnRSZWYg5q+U6L6DXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB0YXJnZXRFbGVtZW50UmVmID0gKHRhcmdldCBhcyBhbnkpLmVsZW1lbnRSZWY7XHJcbiAgICAgIGlmICh0YXJnZXRFbGVtZW50UmVmKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IHRwbEVsZW1lbnRSZWYgPSAodGVtcGxhdGVzW2ldIGFzIGFueSkuZWxlbWVudFJlZjtcclxuICAgICAgICAgIGlmICh0cGxFbGVtZW50UmVmID09PSB0YXJnZXRFbGVtZW50UmVmKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyDlv73nlaXplJnor69cclxuICAgIH1cclxuXHJcbiAgICAvLyDmlrnms5Uz77ya6YCa6L+HIEFuZ3VsYXIg5YaF6YOo5bGe5oCn5q+U6L6DXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB0YXJnZXRDb250YWluZXIgPSAodGFyZ2V0IGFzIGFueSkuX2RlY2xhcmF0aW9uVENvbnRhaW5lcjtcclxuICAgICAgaWYgKHRhcmdldENvbnRhaW5lcikge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVtcGxhdGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCB0cGxDb250YWluZXIgPSAodGVtcGxhdGVzW2ldIGFzIGFueSkuX2RlY2xhcmF0aW9uVENvbnRhaW5lcjtcclxuICAgICAgICAgIGlmICh0cGxDb250YWluZXIgPT09IHRhcmdldENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8g5b+955Wl6ZSZ6K+vXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxuXHJcbiAgLy8g6K6+572u562b6YCJ6KGo5Y2V6buY6K6k5bGe5oCnXHJcbiAgcHJpdmF0ZSBzZXRTZWFyY2hGb3JtRGVmYXVsdFByb3AoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgY29sdW1ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLnZhbHVlVHlwZSkge1xyXG4gICAgICAgIGlmIChpdGVtLmZpZWxkUHJvcHMpIHtcclxuICAgICAgICAgIGl0ZW0uZmllbGRQcm9wcyA9IHtcclxuICAgICAgICAgICAgLi4uUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbaXRlbS52YWx1ZVR5cGVdLFxyXG4gICAgICAgICAgICAuLi5pdGVtLmZpZWxkUHJvcHMsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpdGVtLmZpZWxkUHJvcHMgPSB7IC4uLlBST19UQUJMRV9ERUZBVUxUX1BST1BTW2l0ZW0udmFsdWVUeXBlXSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDliqjmgIHorr7nva5PcHRpb25zXHJcbiAgcHJpdmF0ZSBzZXRTZWxlY3RSZXF1ZXN0KGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10pIHtcclxuICAgIGNvbHVtbnMubWFwKGFzeW5jIChpdGVtKSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLmZpZWxkUHJvcHMgJiYgaGFzSW4oaXRlbS5maWVsZFByb3BzLCBcInJlcXVlc3RcIikpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IChcclxuICAgICAgICAgICAgaXRlbS5maWVsZFByb3BzIGFzIFNlbGVjdEZpZWxkUHJvcHNcclxuICAgICAgICAgICkucmVxdWVzdD8uKCk7XHJcbiAgICAgICAgICAoaXRlbS5maWVsZFByb3BzIGFzIFNlbGVjdEZpZWxkUHJvcHMpLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAoaXRlbS5maWVsZFByb3BzIGFzIFNlbGVjdEZpZWxkUHJvcHMpLm9wdGlvbnMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzZXRTZWFyY2hQYXJhbXMoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgdGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zID0gW107XHJcbiAgICBjb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcclxuICAgICAgICBjb25zdCBmbGFnID0gIWl0ZW0uaGlkZUluU2VhcmNoICYmIGl0ZW0udmFsdWVUeXBlO1xyXG4gICAgICAgIGlmIChmbGFnKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMucHVzaChjbG9uZURlZXAoaXRlbSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZztcclxuICAgICAgfSlcclxuICAgICAgLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG4gICAgICAgIGxldCBkZWZhdWx0VmFsdWUgPSBQUk9fVEFCTEVfREVGQVVMVF9QUk9QU1tjb2x1bW4udmFsdWVUeXBlXS52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8g5a+55LqOY2hlY2tib3jnsbvlnovvvIzku45vcHRpb25z5Lit5om+5Ye6Y2hlY2tlZOS4unRydWXnmoTpobnkvZzkuLrpu5jorqTlgLxcclxuICAgICAgICBpZiAoY29sdW1uLnZhbHVlVHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XHJcbiAgICAgICAgICBjb25zdCBjaGVja2VkVmFsdWVzID0gKGNvbHVtbi5maWVsZFByb3BzPy5vcHRpb25zIHx8IFtdKVxyXG4gICAgICAgICAgICAuZmlsdGVyKChvcHQ6IE9wdGlvbnNUeXBlKSA9PiBvcHQuY2hlY2tlZClcclxuICAgICAgICAgICAgLm1hcCgob3B0OiBPcHRpb25zVHlwZSkgPT4gb3B0LnZhbHVlKTtcclxuICAgICAgICAgIHRoaXMuX3NlYXJjaFBhcmFtc1trZXldID1cclxuICAgICAgICAgICAgY2hlY2tlZFZhbHVlcy5sZW5ndGggPiAwID8gY2hlY2tlZFZhbHVlcyA6IGRlZmF1bHRWYWx1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPSBjb2x1bW4uZmllbGRQcm9wcz8udmFsdWUgfHwgZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5Yid5aeL5YyWIGF1dG9Db21wbGV0ZSDmlbDmja7mupBcclxuICAgICAgICBpZiAoY29sdW1uLnZhbHVlVHlwZSA9PT0gXCJhdXRvQ29tcGxldGVcIikge1xyXG4gICAgICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNba2V5XSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgLy8g5qC55o2u5YiX55qEIG9yZGVyIOWtl+autei/m+ihjOaOkuW6j++8jOacquiuvue9riBvcmRlciDnmoTmlL7lnKjmnIDlkI5cclxuICAgIHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBhT3JkZXIgPSBpc05pbChhPy5vcmRlcikgPyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA6IGEub3JkZXI7XHJcbiAgICAgIGNvbnN0IGJPcmRlciA9IGlzTmlsKGI/Lm9yZGVyKSA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogYi5vcmRlcjtcclxuICAgICAgaWYgKGFPcmRlciA9PT0gYk9yZGVyKSByZXR1cm4gMDtcclxuICAgICAgcmV0dXJuIGFPcmRlciAtIGJPcmRlcjtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2V0U2VhcmNoRm9ybURlZmF1bHRQcm9wKHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucyk7XHJcblxyXG4gICAgLy8g5bm25Y+R5Yqg6L295omA5pyJ6ZyA6KaB5byC5q2l6I635Y+W55qE6YCJ6aG5XHJcbiAgICB0aGlzLnNldFNlbGVjdFJlcXVlc3QodGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlVGFibGVDb2x1bW5zKGluamVjdENvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10pIHtcclxuICAgIC8vIDEuIOS9v+eUqOacgOWOn+Wni+eahGNvbHVtbnPkvZzkuLrmlbDmja7mupDvvIznoa7kv53ovoXliqnliJflrozlhajkuI3lj5flvbHlk41cclxuICAgIGNvbnN0IG9yaWdpbmFsQ29sdW1ucyA9IGNsb25lRGVlcCh0aGlzLmNvbHVtbnMpO1xyXG5cclxuICAgIC8vIDIuIOWkhOeQhuWtl+auteaYoOWwhO+8iOWmguaenOaPkOS+m+S6hmZpZWxkc+WPguaVsO+8iVxyXG4gICAgbGV0IHByb2Nlc3NlZEluamVjdENvbHVtbnMgPSBpbmplY3RDb2x1bW5zO1xyXG5cclxuICAgIC8vIDMuIOWIhuemu+i+heWKqeWIl+WSjOmdnui+heWKqeWIl++8iOS9v+eUqOWOn+Wni+aVsOaNru+8iVxyXG4gICAgY29uc3Qgbm9uQXV4aWxpYXJ5Q29sdW1ucyA9IG9yaWdpbmFsQ29sdW1ucy5maWx0ZXIoXHJcbiAgICAgIChjb2wpID0+ICFjb2wuYXV4aWxpYXJ5Q29sdW1uXHJcbiAgICApO1xyXG5cclxuICAgIC8vIDQuIOaMieeFp2luamVjdENvbHVtbnPnmoTpobrluo/ph43mlrDmjpLliJfpnZ7ovoXliqnliJdcclxuICAgIGNvbnN0IHJlb3JkZXJlZE5vbkF1eGlsaWFyeUNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10gPSBbXTtcclxuICAgIGNvbnN0IHJlbWFpbmluZ05vbkF1eGlsaWFyeUNvbHVtbnMgPSBbLi4ubm9uQXV4aWxpYXJ5Q29sdW1uc107IC8vIOWkjeWItuS4gOS7veeUqOS6juafpeaJvuWSjOenu+mZpFxyXG5cclxuICAgIHByb2Nlc3NlZEluamVjdENvbHVtbnMuZm9yRWFjaCgoaW5qZWN0Q29sKSA9PiB7XHJcbiAgICAgIC8vIOafpeaJvumdnui+heWKqeWIl+S4reWvueW6lOeahOS4i+agh1xyXG4gICAgICBjb25zdCBleGlzdGluZ0NvbEluZGV4ID0gcmVtYWluaW5nTm9uQXV4aWxpYXJ5Q29sdW1ucy5maW5kSW5kZXgoXHJcbiAgICAgICAgKGNvbCkgPT4gY29sLnByb3AgPT09IGluamVjdENvbC5wcm9wXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChleGlzdGluZ0NvbEluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIC8vIOWmguaenOaJvuWIsOebuOWQjOWIl++8jOeUqGluamVjdENvbHVtbnPkuK3nmoTlsZ7mgKfopobnm5bljp/lp4tjb2x1bW5z5Lit55qE5bGe5oCnXHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDb2wgPSByZW1haW5pbmdOb25BdXhpbGlhcnlDb2x1bW5zW2V4aXN0aW5nQ29sSW5kZXhdO1xyXG5cclxuICAgICAgICBjb25zdCB1cGRhdGVkQ29sID0geyAuLi5leGlzdGluZ0NvbCwgLi4uaW5qZWN0Q29sIH07XHJcbiAgICAgICAgcmVvcmRlcmVkTm9uQXV4aWxpYXJ5Q29sdW1ucy5wdXNoKHVwZGF0ZWRDb2wpO1xyXG4gICAgICAgIC8vIOS7juWJqeS9meaVsOe7hOS4reenu+mZpO+8jOmBv+WFjemHjeWkjVxyXG4gICAgICAgIHJlbWFpbmluZ05vbkF1eGlsaWFyeUNvbHVtbnMuc3BsaWNlKGV4aXN0aW5nQ29sSW5kZXgsIDEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIOWmguaenOayoeaJvuWIsOWvueW6lOeahOWIl++8jOebtOaOpea3u+WKoGluamVjdENvbHVtbnPkuK3nmoTliJdcclxuICAgICAgICByZW9yZGVyZWROb25BdXhpbGlhcnlDb2x1bW5zLnB1c2goaW5qZWN0Q29sKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gNS4g5aSE55CG5Ymp5L2Z55qE5Y6f5aeLY29sdW1uc+S4reeahOmdnui+heWKqeWIl++8iOWcqGluamVjdENvbHVtbnPkuK3mnKrlh7rnjrDnmoTliJfvvIlcclxuICAgIC8vIOi/meS6m+WIl+W6lOivpeiiq+makOiXj++8iOiuvue9rmhpZGVJblRhYmxl5Li6dHJ1Ze+8iVxyXG4gICAgcmVtYWluaW5nTm9uQXV4aWxpYXJ5Q29sdW1ucy5mb3JFYWNoKChyZW1haW5pbmdDb2wpID0+IHtcclxuICAgICAgY29uc3QgaGlkZGVuQ29sID0geyAuLi5yZW1haW5pbmdDb2wsIGhpZGVJblRhYmxlOiB0cnVlIH07XHJcbiAgICAgIHJlb3JkZXJlZE5vbkF1eGlsaWFyeUNvbHVtbnMucHVzaChoaWRkZW5Db2wpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gNi4g5oyJ54Wn5Y6f5aeLY29sdW1uc+eahOmhuuW6j+mHjeaWsOe7hOWQiO+8muS/neaMgei+heWKqeWIl+eahOWOn+Wni+S9jee9ruWSjOWxnuaAp1xyXG4gICAgY29uc3QgZmluYWxDb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcbiAgICBsZXQgbm9uQXV4aWxpYXJ5SW5kZXggPSAwO1xyXG4gICAgbGV0IGF1eGlsaWFyeUluZGV4ID0gMDtcclxuXHJcbiAgICBvcmlnaW5hbENvbHVtbnMuZm9yRWFjaCgob3JpZ2luYWxDb2wpID0+IHtcclxuICAgICAgaWYgKG9yaWdpbmFsQ29sLmF1eGlsaWFyeUNvbHVtbikge1xyXG4gICAgICAgIC8vIOWmguaenOaYr+i+heWKqeWIl++8jOS9v+eUqOWOn+Wni+WIl+aVsOaNru+8jOWujOWFqOS4jei/m+ihjOS7u+S9leS/ruaUuVxyXG4gICAgICAgIGZpbmFsQ29sdW1ucy5wdXNoKG9yaWdpbmFsQ29sKTtcclxuICAgICAgICBhdXhpbGlhcnlJbmRleCsrO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIOWmguaenOaYr+mdnui+heWKqeWIl++8jOS9v+eUqOmHjeaWsOaOkuW6j+WQjueahOWIl++8jOS9huS/neeVmeWOn+Wni+WIl+eahOaJgOacieWxnuaAp1xyXG4gICAgICAgIGNvbnN0IHJlb3JkZXJlZENvbCA9IHJlb3JkZXJlZE5vbkF1eGlsaWFyeUNvbHVtbnNbbm9uQXV4aWxpYXJ5SW5kZXhdO1xyXG4gICAgICAgIGlmIChyZW9yZGVyZWRDb2wpIHtcclxuICAgICAgICAgIC8vIOWQiOW5tuWOn+Wni+WIl+WSjOmHjeaWsOaOkuW6j+WQjueahOWIl++8jOehruS/neS/neeVmeaJgOacieWOn+Wni+WxnuaAp1xyXG4gICAgICAgICAgY29uc3QgbWVyZ2VkQ29sID0geyAuLi5vcmlnaW5hbENvbCwgLi4ucmVvcmRlcmVkQ29sIH07XHJcbiAgICAgICAgICBmaW5hbENvbHVtbnMucHVzaChtZXJnZWRDb2wpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyDlpoLmnpzph43mlrDmjpLluo/lkI7nmoTliJfkuI3lrZjlnKjvvIzkvb/nlKjljp/lp4vliJdcclxuICAgICAgICAgIGZpbmFsQ29sdW1ucy5wdXNoKG9yaWdpbmFsQ29sKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbm9uQXV4aWxpYXJ5SW5kZXgrKztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZvcm1hdGVJbm5lckNvbHVtbnMoZmluYWxDb2x1bW5zKTtcclxuICB9XHJcblxyXG4gIC8vIOmAmui/hyBQcm94eSDnm5HlkKwgX3NlYXJjaFBhcmFtcyDnmoTlsZ7mgKflj5jmm7RcclxuICBwcml2YXRlIGNyZWF0ZVNlYXJjaFBhcmFtc1Byb3h5KHRhcmdldDogYW55KSB7XHJcbiAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgIGNvbnN0IGhhbmRsZXI6IFByb3h5SGFuZGxlcjxhbnk+ID0ge1xyXG4gICAgICBzZXQob2JqOiBhbnksIHByb3A6IHN0cmluZyB8IHN5bWJvbCwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwcm9wKTtcclxuICAgICAgICBjb25zdCBvbGRWYWwgPSBvYmpba2V5XTtcclxuICAgICAgICBpZiAob2xkVmFsID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBzZWxmLm9uVmFsdWVzQ2hhbmdlLmVtaXQoe1xyXG4gICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgIHZhbHVlLFxyXG4gICAgICAgICAgICBwYXJhbXM6IHNlbGYuZ2V0U2VhcmNoUGFyYW1zKCksXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7fVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJFbXB0eVNlYXJjaFBhcmFtcygpIHtcclxuICAgIGNvbnN0IGNsb25lU2VhcmNoUGFyYW1zID0gY2xvbmVEZWVwKHRoaXMuX3NlYXJjaFBhcmFtcyk7XHJcbiAgICByZXR1cm4gY2xvbmVTZWFyY2hQYXJhbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkU2VydmVyU29ydFBheWxvYWQoKSB7XHJcbiAgICAvLyDmnoTlu7rmv4DmtLvmjpLluo/pm4blkIjvvIjmjInkvJjlhYjnuqfku47kvY7liLDpq5jvvIzmnKvlsL7kvJjlhYjvvIlcclxuICAgIGNvbnN0IGFjdGl2ZUtleXMgPSB0aGlzLl9zb3J0UHJpb3JpdHkuZmlsdGVyKChrKSA9PiAhIXRoaXMuX3NvcnRNYXBba10pO1xyXG4gICAgaWYgKGFjdGl2ZUtleXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgIGNvbnN0IHNvcnRzID0gYWN0aXZlS2V5cy5tYXAoKGZpZWxkKSA9PiB7XHJcbiAgICAgIC8vIOafpeaJvuWvueW6lOeahOWIl+mFjee9ru+8jOS8mOWFiOS9v+eUqHNvcnROYW1l5a2X5q61XHJcbiAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuX2NvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wucHJvcCA9PT0gZmllbGQpO1xyXG4gICAgICBjb25zdCBzb3J0RmllbGQgPSBjb2x1bW4/LnNvcnROYW1lIHx8IGZpZWxkO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGZpZWxkOiBzb3J0RmllbGQsXHJcbiAgICAgICAgb3JkZXI6IHRoaXMuX3NvcnRNYXBbZmllbGRdISxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMubXVsdGlwbGVTb3J0KSB7XHJcbiAgICAgIHJldHVybiBzb3J0czsgLy8g5Lul5pWw57uE5b2i5byP5o+Q5Lqk5aSa5YiX5o6S5bqPXHJcbiAgICB9XHJcbiAgICBjb25zdCBbZmlyc3RdID0gc29ydHM7XHJcbiAgICByZXR1cm4gZmlyc3Q7IC8vIOWFvOWuueWNleWIl+e7k+aehCB7IGZpZWxkLCBvcmRlciB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNvcnREYXRhU291cmNlSW5QbGFjZSgpIHtcclxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpIHx8IHRoaXMuZGF0YVNvdXJjZS5sZW5ndGggPT09IDApIHJldHVybjtcclxuICAgIGNvbnN0IGFjdGl2ZUtleXMgPSB0aGlzLl9zb3J0UHJpb3JpdHkuZmlsdGVyKChrKSA9PiAhIXRoaXMuX3NvcnRNYXBba10pO1xyXG4gICAgaWYgKGFjdGl2ZUtleXMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgLy8g5aSN5Yi25LiA5Lu95LyY5YWI57qn77yM5LuO5YmN5Yiw5ZCO5LyY5YWI57qn5LuO5L2O5Yiw6auY77yI5pyA5ZCO6K6+572u55qE5a2X5q615LyY5YWI77yJXHJcbiAgICBjb25zdCBrZXlzSW5Qcmlvcml0eSA9IFsuLi5hY3RpdmVLZXlzXTtcclxuICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICBmb3IgKGxldCBpID0ga2V5c0luUHJpb3JpdHkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IGtleXNJblByaW9yaXR5W2ldO1xyXG4gICAgICAgIGNvbnN0IG9yZGVyID0gdGhpcy5fc29ydE1hcFtmaWVsZF0hO1xyXG4gICAgICAgIGNvbnN0IGF2ID0gYT8uW2ZpZWxkXTtcclxuICAgICAgICBjb25zdCBidiA9IGI/LltmaWVsZF07XHJcbiAgICAgICAgY29uc3QgY21wID0gdGhpcy5jb21wYXJlVmFsdWVzKGF2LCBidik7XHJcbiAgICAgICAgaWYgKGNtcCAhPT0gMCkgcmV0dXJuIG9yZGVyID09PSBcImFzY2VuZFwiID8gY21wIDogLWNtcDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wYXJlVmFsdWVzKGFWYWw6IGFueSwgYlZhbDogYW55KTogbnVtYmVyIHtcclxuICAgIGlmIChhVmFsID09IG51bGwgJiYgYlZhbCA9PSBudWxsKSByZXR1cm4gMDtcclxuICAgIGlmIChhVmFsID09IG51bGwpIHJldHVybiAtMTtcclxuICAgIGlmIChiVmFsID09IG51bGwpIHJldHVybiAxO1xyXG4gICAgaWYgKGFWYWwgaW5zdGFuY2VvZiBEYXRlICYmIGJWYWwgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgIHJldHVybiBhVmFsLmdldFRpbWUoKSAtIGJWYWwuZ2V0VGltZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBhVmFsID09PSBcImJvb2xlYW5cIiAmJiB0eXBlb2YgYlZhbCA9PT0gXCJib29sZWFuXCIpIHtcclxuICAgICAgcmV0dXJuIGFWYWwgPT09IGJWYWwgPyAwIDogYVZhbCA/IDEgOiAtMTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgYVZhbCA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgYlZhbCA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICByZXR1cm4gYVZhbCAtIGJWYWw7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGFWYWwgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIGJWYWwgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgcmV0dXJuIGFWYWwubG9jYWxlQ29tcGFyZShiVmFsKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGFOdW0gPSBOdW1iZXIoYVZhbCk7XHJcbiAgICBjb25zdCBiTnVtID0gTnVtYmVyKGJWYWwpO1xyXG4gICAgaWYgKCFpc05hTihhTnVtKSAmJiAhaXNOYU4oYk51bSkpIHJldHVybiBhTnVtIC0gYk51bTtcclxuICAgIHJldHVybiBTdHJpbmcoYVZhbCkubG9jYWxlQ29tcGFyZShTdHJpbmcoYlZhbCkpO1xyXG4gIH1cclxuXHJcbiAgLy8g5omn6KGMIGF1dG9Db21wbGV0ZSDmlbDmja7mupDmn6Xor6LvvIjlrp7pmYXmiafooYzpgLvovpHvvIlcclxuICBwcml2YXRlIGV4ZWN1dGVBdXRvQ29tcGxldGVEYXRhU291cmNlKGV2ZW50OiBFdmVudCwgY29sdW1uOiBQcm9UYWJsZUNvbHVtbikge1xyXG4gICAgY29uc3QgZmllbGRLZXkgPSBjb2x1bW4uZmllbGRQcm9wcz8ubmFtZSB8fCBjb2x1bW4ucHJvcDtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIChjb2x1bW4uZmllbGRQcm9wcyBhcyBBdXRvQ29tcGxldGVGaWVsZFByb3BzKS5kYXRhU291cmNlICYmXHJcbiAgICAgIHR5cGVvZiAoY29sdW1uLmZpZWxkUHJvcHMgYXMgQXV0b0NvbXBsZXRlRmllbGRQcm9wcykuZGF0YVNvdXJjZSA9PT1cclxuICAgICAgICBcImZ1bmN0aW9uXCJcclxuICAgICkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IChjb2x1bW4uZmllbGRQcm9wcyBhcyBBdXRvQ29tcGxldGVGaWVsZFByb3BzKS5kYXRhU291cmNlKFxyXG4gICAgICAgICAgZXZlbnRcclxuICAgICAgICApO1xyXG4gICAgICAgIC8vIOWmguaenOi/lOWbnueahOaYryBQcm9taXNl77yM5aSE55CG5byC5q2l57uT5p6cXHJcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgIHJlc3VsdFxyXG4gICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2ZpZWxkS2V5XSA9IGRhdGEgfHwgW107XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQXV0b0NvbXBsZXRlIGRhdGFTb3VyY2UgZXJyb3I6XCIsIGVycm9yKTtcclxuICAgICAgICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gPSBbXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIOWQjOatpei/lOWbnue7k+aenFxyXG4gICAgICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNbZmllbGRLZXldID0gcmVzdWx0IHx8IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiQXV0b0NvbXBsZXRlIGRhdGFTb3VyY2UgZXJyb3I6XCIsIGVycm9yKTtcclxuICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gPSBbXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNlYXJjaFBhcmFtcyhvcHRpb25zPzoge1xyXG4gICAgdXNlU2F2ZWQ/OiBib29sZWFuOyAvLyDkvb/nlKjmnIDov5HkuIDmrKHmn6Xor6Lmj5DkuqTnmoTlj4LmlbDvvIzpu5jorqTkuLogZmFsc2XvvJtmYWxzZSDkuLrlvZPliY3ooajljZXlgLxcclxuICB9KTogYW55IHtcclxuICAgIGNvbnN0IHsgdXNlU2F2ZWQgPSBmYWxzZSB9ID0gb3B0aW9ucyB8fCB7fTtcclxuICAgIGNvbnN0IHJhd1BhcmFtcyA9IHVzZVNhdmVkID8gdGhpcy5fc2F2ZWRTZWFyY2hQYXJhbXMgOiB0aGlzLl9zZWFyY2hQYXJhbXM7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBjbG9uZURlZXAocmF3UGFyYW1zIHx8IHt9KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBwYXJhbXMsXHJcbiAgICAgIHBhZ2VJbmZvOiB7XHJcbiAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXgsXHJcbiAgICAgICAgcGFnZVNpemU6IHRoaXMuX3BhZ2VJbmZvLnBhZ2VTaXplLFxyXG4gICAgICB9LFxyXG4gICAgICAvLyDlnKjnur/mjpLluo/mqKHlvI/vvJrmiormjpLluo/lr7nosaHmj5DkuqTnu5nmjqXlj6NcclxuICAgICAgLi4uKHRoaXMuc29ydE1vZGUgPT09IFwic2VydmVyXCJcclxuICAgICAgICA/IHsgc29ydDogdGhpcy5idWlsZFNlcnZlclNvcnRQYXlsb2FkKCkgfVxyXG4gICAgICAgIDoge30pLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWxvYWQoYWZ0ZXJEZWxldGU/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KGFmdGVyRGVsZXRlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRGaWVsZHNWYWx1ZShmaWVsZHM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgIE9iamVjdC5rZXlzKGZpZWxkcykuZm9yRWFjaCgoaykgPT4ge1xyXG4gICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba10gPSBmaWVsZHNba107IC8vIOS/neeVmSBQcm94ee+8jOmAkOmhuei1i+WAvOinpuWPkeaLpuaIqlxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RmllbGRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkUm93KCkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0Q29sdW1ucyhcclxuICAgIGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10sXHJcbiAgICBvcHRpb25zPzoge1xyXG4gICAgICByZWxvYWQ/OiBib29sZWFuOyAvLyDmmK/lkKbph43mlrDliqDovb3mlbDmja7vvIzpu5jorqTkuLogZmFsc2VcclxuICAgIH1cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIOabtOaWsCBjb2x1bW5zIOi+k+WFpeWxnuaAp1xyXG4gICAgdGhpcy5jb2x1bW5zID0gY2xvbmVEZWVwKGNvbHVtbnMpO1xyXG5cclxuICAgIC8vIOmHjeaWsOagvOW8j+WMluWGhemDqOWIl1xyXG4gICAgdGhpcy5mb3JtYXRlSW5uZXJDb2x1bW5zKHRoaXMuY29sdW1ucyk7XHJcblxyXG4gICAgLy8g6YeN5paw6K6+572u5pCc57Si5Y+C5pWw77yI5byC5q2l5pON5L2c77yJXHJcbiAgICAvLyDlhYjmuIXnqbrml6fnmoTmkJzntKLlj4LmlbDvvIzpgb/lhY3ml6fmlbDmja7mrovnlZlcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtcyA9IHt9O1xyXG4gICAgYXdhaXQgdGhpcy5zZXRTZWFyY2hQYXJhbXModGhpcy5jb2x1bW5zKTtcclxuXHJcbiAgICAvLyDph43mlrDliJvlu7ogUHJveHnvvIznoa7kv53ooajljZXpobnlgLzlj5jljJbog73mraPluLjop6blj5Hkuovku7ZcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtcyA9IHRoaXMuY3JlYXRlU2VhcmNoUGFyYW1zUHJveHkodGhpcy5fc2VhcmNoUGFyYW1zKTtcclxuXHJcbiAgICAvLyDph43mlrDms6jlhozmqKHmnb/vvIjlpoLmnpznu4Tku7blt7Lnu4/liJ3lp4vljJblrozmiJDvvIlcclxuICAgIGlmICh0aGlzLmFsbFRlbXBsYXRlcykge1xyXG4gICAgICB0aGlzLmF1dG9SZWdpc3RlclRlbXBsYXRlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWmguaenOiuvue9ruS6hiByZWxvYWQg6YCJ6aG55Li6IHRydWXvvIzliJnph43mlrDmn6Xor6LmlbDmja5cclxuICAgIGlmIChvcHRpb25zPy5yZWxvYWQgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNlbGVjdGVkUm93RGF0YTxUID0gYW55PigpOiBUIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFRhYmxlUm93O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENoZWNrZWRSb3dzPFQgPSBhbnk+KCk6IFRbXSB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NoZWNrYm94KSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIC8vIOi/lOWbnuW9k+WJjeaVsOaNrua6kOS4reaJgOaciSBjaGVja2VkIOS4uiB0cnVlIOeahOmhuVxyXG4gICAgLy8g5rOo5oSP77ya5aaC5p6c6ZyA6KaB6I635Y+W5omA5pyJ6aG155qE6YCJ5Lit6aG577yM6ZyA6KaB6YGN5Y6G5omA5pyJ5pWw5o2u5rqQ5oiW5L2/55SoIF9zZWxlY3RlZFJvd0lkc1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIoKHJvdykgPT4gcm93LmNoZWNrZWQgPT09IHRydWUpIGFzIFRbXTtcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPluaMh+WumuWQjeensOeahOaooeadv1xyXG4gIGdldFRlbXBsYXRlKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcclxuICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gdGhpcy5jdXN0b21UZW1wbGF0ZXMuZ2V0KG5hbWUpIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRUb29sVGlwVGV4dFZhbHVlKGNvbHVtbjogUHJvVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBrZXkgPVxyXG4gICAgICBjb2x1bW4uY3VzdG9tUmVuZGVyICYmIHRoaXMuZ2V0VGVtcGxhdGUoY29sdW1uLmN1c3RvbVJlbmRlcilcclxuICAgICAgICA/IFwiXCJcclxuICAgICAgICA6IGNvbHVtbi5lbGxpcHNpc1xyXG4gICAgICAgID8gY29sdW1uLnByb3BcclxuICAgICAgICA6IFwiXCI7XHJcbiAgICByZXR1cm4gIWtleSA/IFwiXCIgOiBkYXRhW2tleV07XHJcbiAgfVxyXG5cclxuICBnZXRUYWJsZVJvd0NoZWNrZWQoZGF0YTogYW55KSB7XHJcbiAgICAvLyDlkK/nlKjlpI3pgInmoYbml7bvvJrooYzpq5jkuq7lupTkuI7lpI3pgInmoYbpgInkuK3nirbmgIHkuIDoh7TvvIjmlK/mjIHlpJrpgInvvIlcclxuICAgIGlmICh0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pc1Jvd0NoZWNrZWQoZGF0YSk7XHJcbiAgICB9XHJcbiAgICAvLyDmnKrlkK/nlKjlpI3pgInmoYbml7bvvJrku43nhLbkvb/nlKjljZXpgInooYzpq5jkuq5cclxuICAgIGlmICghdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdykgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuX3NlbGVjdGVkVGFibGVSb3cpID09PSBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxuICB9XHJcblxyXG4gIC8vIOajgOafpeihjOaYr+WQpuiiq+emgeeUqFxyXG4gIGlzUm93RGlzYWJsZWQoZGF0YTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NoZWNrYm94KSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dEaXNhYmxlZCA/IHRoaXMucm93RGlzYWJsZWQoZGF0YSkgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIOajgOafpeihjOaYr+WQpuiiq+WkjemAieahhumAieS4re+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIGlzUm93Q2hlY2tlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5zaG93Q2hlY2tib3gpIHJldHVybiBmYWxzZTtcclxuICAgIC8vIOebtOaOpeivu+WPluaVsOaNruWvueixoeeahCBjaGVja2VkIOWxnuaAp1xyXG4gICAgcmV0dXJuIGRhdGEuY2hlY2tlZCA9PT0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIOWIh+aNouihjOeahOmAieS4reeKtuaAge+8iOaVsOaNrumpseWKqOaooeW8j++8jOS/neeVmeeUqOS6juWFvOWuue+8iVxyXG4gIHRvZ2dsZVJvd0NoZWNrZWQoZGF0YTogYW55LCBjaGVja2VkOiBib29sZWFuLCBldmVudD86IEV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIOmYu+atouS6i+S7tuWGkuazoe+8jOmBv+WFjeinpuWPkeihjOeCueWHu1xyXG4gICAgfVxyXG4gICAgLy8g5aaC5p6c6KGM6KKr56aB55So77yM5LiN5YWB6K645YiH5o2i6YCJ5Lit54q25oCBXHJcbiAgICBpZiAodGhpcy5pc1Jvd0Rpc2FibGVkKGRhdGEpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyDnm7TmjqXorr7nva7mlbDmja7lr7nosaHnmoQgY2hlY2tlZCDlsZ7mgKdcclxuICAgIGRhdGEuY2hlY2tlZCA9IGNoZWNrZWQ7XHJcblxyXG4gICAgLy8g5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd0lkc++8iOeUqOS6jui3qOmhtemAieS4re+8iVxyXG4gICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGRhdGEpO1xyXG4gICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5hZGQoaWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLmRlbGV0ZShpZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93c++8iOeUqOS6juWFvOWuueaAp++8iVxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZFJvd3MuZmluZEluZGV4KChyb3cpID0+XHJcbiAgICAgIHRoaXMuaXNTYW1lUm93KHJvdywgZGF0YSlcclxuICAgICk7XHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzLnB1c2goZGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8g5Yu+6YCJ5aSN6YCJ5qGG5pe25ZCM5q2l6K6+572u6auY5Lqu6YCJ5Lit6KGMXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBkYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd3Muc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDoi6XlvZPliY3pq5jkuq7ooYzkuLror6XooYzvvIzliJnlj5bmtojpq5jkuq5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgJiZcclxuICAgICAgICB0aGlzLmlzU2FtZVJvdyh0aGlzLl9zZWxlY3RlZFRhYmxlUm93LCBkYXRhKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlQ2hlY2tBbGxTdGF0dXMoKTtcclxuICB9XHJcblxyXG4gIC8vIOabtOaWsOWFqOmAieeKtuaAge+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIHVwZGF0ZUNoZWNrQWxsU3RhdHVzKCkge1xyXG4gICAgaWYgKCF0aGlzLnNob3dDaGVja2JveCB8fCAhQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpKSB7XHJcbiAgICAgIHRoaXMuX2NoZWNrZWRBbGwgPSBmYWxzZTtcclxuICAgICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyDlj6rorqHnrpflj6/nlKjnmoTooYzvvIjmnKrnpoHnlKjnmoTooYzvvIlcclxuICAgIGNvbnN0IGF2YWlsYWJsZVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyKFxyXG4gICAgICAocm93KSA9PiAhdGhpcy5pc1Jvd0Rpc2FibGVkKHJvdylcclxuICAgICk7XHJcbiAgICAvLyDln7rkuo7mlbDmja7lr7nosaHnmoQgY2hlY2tlZCDlsZ7mgKforqHnrpdcclxuICAgIGNvbnN0IGNoZWNrZWRDb3VudCA9IGF2YWlsYWJsZVJvd3MuZmlsdGVyKFxyXG4gICAgICAocm93KSA9PiByb3cuY2hlY2tlZCA9PT0gdHJ1ZVxyXG4gICAgKS5sZW5ndGg7XHJcbiAgICBjb25zdCB0b3RhbENvdW50ID0gYXZhaWxhYmxlUm93cy5sZW5ndGg7XHJcbiAgICB0aGlzLl9jaGVja2VkQWxsID1cclxuICAgICAgdG90YWxDb3VudCA+IDAgJiYgY2hlY2tlZENvdW50ID4gMCAmJiBjaGVja2VkQ291bnQgPT09IHRvdGFsQ291bnQ7XHJcbiAgICB0aGlzLl9pbmRldGVybWluYXRlID0gY2hlY2tlZENvdW50ID4gMCAmJiBjaGVja2VkQ291bnQgPCB0b3RhbENvdW50O1xyXG4gIH1cclxuXHJcbiAgLy8g5YWo6YCJL+WPlua2iOWFqOmAie+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIHRvZ2dsZUNoZWNrQWxsKGNoZWNrZWQ6IGJvb2xlYW4sIGV2ZW50PzogRXZlbnQpIHtcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlj6rlpITnkIblj6/nlKjnmoTooYzvvIjmnKrnpoHnlKjnmoTooYzvvIlcclxuICAgIGNvbnN0IGF2YWlsYWJsZVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyKFxyXG4gICAgICAocm93KSA9PiAhdGhpcy5pc1Jvd0Rpc2FibGVkKHJvdylcclxuICAgICk7XHJcblxyXG4gICAgLy8g5om56YeP6K6+572uIGNoZWNrZWQg5bGe5oCnXHJcbiAgICBhdmFpbGFibGVSb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICByb3cuY2hlY2tlZCA9IGNoZWNrZWQ7XHJcblxyXG4gICAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93SWRz77yI55So5LqO6Leo6aG16YCJ5Lit77yJXHJcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChyb3cpO1xyXG4gICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5hZGQoaWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5kZWxldGUoaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd3PvvIjnlKjkuo7lhbzlrrnmgKfvvIlcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93cyA9IFsuLi5hdmFpbGFibGVSb3dzXTtcclxuICAgICAgLy8g5ZCM5q2l6K6+572u6auY5Lqu6YCJ5Lit6KGM5Li656ys5LiA5p2h5Y+v6YCJ5pWw5o2uXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPVxyXG4gICAgICAgIGF2YWlsYWJsZVJvd3MubGVuZ3RoID4gMCA/IGF2YWlsYWJsZVJvd3NbMF0gOiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzID0gW107XHJcbiAgICAgIC8vIOWPlua2iOmrmOS6rlxyXG4gICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZUNoZWNrQWxsU3RhdHVzKCk7XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5bpgInkuK3nmoTooYzmlbDmja7vvIjkv53nlZnnlKjkuo7lhbzlrrnmgKfvvIlcclxuICBnZXRTZWxlY3RlZFJvd3MoKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hlY2tlZFJvd3MoKTtcclxuICB9XHJcblxyXG4gIC8vIOWkhOeQhuihjCBjaGVja2JveCDlj5jljJbkuovku7bvvIjmlbDmja7pqbHliqjmqKHlvI/vvIlcclxuICBoYW5kbGVSb3dDaGVja2VkQ2hhbmdlKGRhdGE6IGFueSwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNSb3dEaXNhYmxlZChkYXRhKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5pWw5o2u5a+56LGh55qEIGNoZWNrZWQg5bGe5oCn5bey57uP6YCa6L+H5Y+M5ZCR57uR5a6a6Ieq5Yqo5pu05pawXHJcbiAgICAvLyDov5nph4zlj6rpnIDopoHlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93SWRzIOWSjCBfc2VsZWN0ZWRSb3dzXHJcblxyXG4gICAgLy8g5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd0lkc++8iOeUqOS6jui3qOmhtemAieS4re+8iVxyXG4gICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGRhdGEpO1xyXG4gICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5hZGQoaWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLmRlbGV0ZShpZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93c++8iOeUqOS6juWFvOWuueaAp++8iVxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZFJvd3MuZmluZEluZGV4KChyb3cpID0+XHJcbiAgICAgIHRoaXMuaXNTYW1lUm93KHJvdywgZGF0YSlcclxuICAgICk7XHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzLnB1c2goZGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8g5Yu+6YCJ5aSN6YCJ5qGG5pe25ZCM5q2l6K6+572u6auY5Lqu6YCJ5Lit6KGMXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBkYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd3Muc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDoi6XlvZPliY3pq5jkuq7ooYzkuLror6XooYzvvIzliJnlj5bmtojpq5jkuq5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgJiZcclxuICAgICAgICB0aGlzLmlzU2FtZVJvdyh0aGlzLl9zZWxlY3RlZFRhYmxlUm93LCBkYXRhKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOabtOaWsOWFqOmAieeKtuaAgVxyXG4gICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yi35paw5YWo6YCJ54q25oCB77yI55So5LqO5YW25LuW5Zy65pmv77yJXHJcbiAgcmVmcmVzaENoZWNrQWxsU3RhdHVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W6KGM55qE5ZSv5LiA5qCH6K+G77yI55So5LqO6Leo6aG16YCJ5Lit77yJXHJcbiAgcHJpdmF0ZSBnZXRSb3dJZChkYXRhOiBhbnkpOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIGRhdGEuaWQgPz8gZGF0YS5rZXkgPz8gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yik5pat5Lik6KGM5piv5ZCm5Li65ZCM5LiA6KGMXHJcbiAgcHJpdmF0ZSBpc1NhbWVSb3cocm93MTogYW55LCByb3cyOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGlkMSA9IHRoaXMuZ2V0Um93SWQocm93MSk7XHJcbiAgICBjb25zdCBpZDIgPSB0aGlzLmdldFJvd0lkKHJvdzIpO1xyXG5cclxuICAgIGlmIChpZDEgIT09IHVuZGVmaW5lZCAmJiBpZDIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gaWQxID09PSBpZDI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZmFsbGJhY2sg5YiwIEpTT04g5q+U6L6DXHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocm93MSkgPT09IEpTT04uc3RyaW5naWZ5KHJvdzIpO1xyXG4gIH1cclxuXHJcbiAgLy8g5riF56m66YCJ5Lit55qE6KGM77yI5pWw5o2u6amx5Yqo5qih5byP77yJXHJcbiAgY2xlYXJTZWxlY3RlZFJvd3MoKSB7XHJcbiAgICAvLyDmuIXnqbrlvZPliY3mlbDmja7mupDkuK3miYDmnInpobnnmoQgY2hlY2tlZCDnirbmgIFcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YVNvdXJjZSkpIHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICAgIHJvdy5jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOa4heepuumAieS4rembhuWQiFxyXG4gICAgdGhpcy5fc2VsZWN0ZWRSb3dJZHMuY2xlYXIoKTtcclxuICAgIHRoaXMuX3NlbGVjdGVkUm93cyA9IFtdO1xyXG4gICAgdGhpcy5fY2hlY2tlZEFsbCA9IGZhbHNlO1xyXG4gICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVGaWVsZENoZWNrQm94Q2hhbmdlKGNoZWNrQm94T3B0aW9uczogT3B0aW9uc1R5cGVbXSwga2V5OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2V0RmllbGRzVmFsdWUoe1xyXG4gICAgICBba2V5XTogY2hlY2tCb3hPcHRpb25zXHJcbiAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5jaGVja2VkKVxyXG4gICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0udmFsdWUpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTZWFyY2goKSB7XHJcbiAgICB0aGlzLl9zYXZlZFNlYXJjaFBhcmFtcyA9IHRoaXMuY2xlYXJFbXB0eVNlYXJjaFBhcmFtcygpO1xyXG4gICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVJlc2V0Rm9ybSgpIHtcclxuICAgIE9iamVjdC5rZXlzKHRoaXMuX3NlYXJjaFBhcmFtcykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhcmdldENvbHVtbiA9IHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5maW5kKChpdGVtKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIChpdGVtLmZpZWxkUHJvcHM/Lm5hbWUgfHwgaXRlbS5wcm9wKSA9PT0ga2V5O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIOWvueS6jmNoZWNrYm9457G75Z6L77yM6ZyA6KaB54m55q6K5aSE55CG6buY6K6k5YC8XHJcbiAgICAgIGlmICh0YXJnZXRDb2x1bW4/LnZhbHVlVHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XHJcbiAgICAgICAgLy8g5LuO5Y6f5aeLY29sdW1uc+mFjee9ruS4reiOt+WPluWIneWni+mFjee9ru+8jOS7peehruS/neS9v+eUqOato+ehrueahOm7mOiupOWAvFxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHJldHVybiAoaXRlbS5maWVsZFByb3BzPy5uYW1lIHx8IGl0ZW0ucHJvcCkgPT09IGtleTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8g5LuO5Y6f5aeLb3B0aW9uc+S4reaJvuWHumNoZWNrZWTkuLp0cnVl55qE6aG55L2c5Li66buY6K6k5YC8XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxGaWVsZFByb3BzID0gb3JpZ2luYWxDb2x1bW4/LmZpZWxkUHJvcHMgYXNcclxuICAgICAgICAgIHwgQ2hlY2tib3hGaWVsZFByb3BzXHJcbiAgICAgICAgICB8IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBjaGVja2VkVmFsdWVzID0gKG9yaWdpbmFsRmllbGRQcm9wcz8ub3B0aW9ucyB8fCBbXSlcclxuICAgICAgICAgIC5maWx0ZXIoKG9wdDogT3B0aW9uc1R5cGUpID0+IG9wdC5jaGVja2VkKVxyXG4gICAgICAgICAgLm1hcCgob3B0OiBPcHRpb25zVHlwZSkgPT4gb3B0LnZhbHVlKTtcclxuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPVxyXG4gICAgICAgICAgY2hlY2tlZFZhbHVlcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgID8gY2hlY2tlZFZhbHVlc1xyXG4gICAgICAgICAgICA6IFBST19UQUJMRV9ERUZBVUxUX1BST1BTW3RhcmdldENvbHVtbi52YWx1ZVR5cGVdLnZhbHVlO1xyXG5cclxuICAgICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba2V5XSA9IGRlZmF1bHRWYWx1ZTtcclxuXHJcbiAgICAgICAgLy8g5qC55o2u6buY6K6k5YC85oGi5aSNb3B0aW9uc+eahGNoZWNrZWTnirbmgIHvvIzkvb/nlKjljp/lp4tvcHRpb25z55qE57uT5p6EXHJcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IEFycmF5LmlzQXJyYXkoZGVmYXVsdFZhbHVlKSA/IGRlZmF1bHRWYWx1ZSA6IFtdO1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsT3B0aW9ucyA9IG9yaWdpbmFsRmllbGRQcm9wcz8ub3B0aW9ucyB8fCBbXTtcclxuICAgICAgICBjb25zdCB0YXJnZXRGaWVsZFByb3BzID0gdGFyZ2V0Q29sdW1uLmZpZWxkUHJvcHMgYXMgQ2hlY2tib3hGaWVsZFByb3BzO1xyXG4gICAgICAgIHRhcmdldEZpZWxkUHJvcHMub3B0aW9ucyA9IG9yaWdpbmFsT3B0aW9ucy5tYXAoKGl0ZW06IE9wdGlvbnNUeXBlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgICBjaGVja2VkOiBkZWZhdWx0VmFsdWVzLmluY2x1ZGVzKGl0ZW0udmFsdWUpLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba2V5XSA9IHRhcmdldENvbHVtbj8uZmllbGRQcm9wc1xyXG4gICAgICAgICAgPyB0YXJnZXRDb2x1bW4/LmZpZWxkUHJvcHMudmFsdWUgfHxcclxuICAgICAgICAgICAgUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbdGFyZ2V0Q29sdW1uLnZhbHVlVHlwZV0udmFsdWVcclxuICAgICAgICAgIDogUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbdGFyZ2V0Q29sdW1uLnZhbHVlVHlwZV0udmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX3NhdmVkU2VhcmNoUGFyYW1zID0ge307XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSAxO1xyXG4gICAgdGhpcy5vblJlc2V0Rm9ybUJlZm9yZVJlbG9hZC5lbWl0KCk7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQYWdlSW5kZXhDaGFuZ2UocGFnZUluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcclxuICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVBhZ2VTaXplQ2hhbmdlKHBhZ2VTaXplOiBhbnkpIHtcclxuICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VTaXplID0gcGFnZVNpemU7XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSAxO1xyXG4gICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaGFuZGxlUXVlcnkoYWZ0ZXJEZWxldGU/OiBib29sZWFuKSB7XHJcbiAgICAvLyDliKDpmaTlkI7liLfmlrDkuJTlvZPliY3pobXku4XliankuIDmnaHorrDlvZXml7bvvIzoi6XkuI3lnKjnrKzkuIDpobXliJnlhYjlm57pgIDkuIDpobVcclxuICAgIGlmIChcclxuICAgICAgYWZ0ZXJEZWxldGUgJiZcclxuICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpICYmXHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5sZW5ndGggPT09IDEgJiZcclxuICAgICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID4gMVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA9IHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCAtIDE7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5L+d5a2Y5Yig6Zmk5YmN55qE5pWw5o2u5rqQ77yI55So5LqO5Yig6Zmk5ZCO5p+l6K+i5pe256e76Zmk6KKr5Yig6Zmk6aG555qE6YCJ5Lit54q25oCB77yJXHJcbiAgICBjb25zdCBwcmV2aW91c0RhdGFTb3VyY2UgPVxyXG4gICAgICBhZnRlckRlbGV0ZSAmJiB0aGlzLnNob3dDaGVja2JveCA/IFsuLi50aGlzLmRhdGFTb3VyY2VdIDogW107XHJcblxyXG4gICAgdGhpcy5fbG9hZGluZyA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5yZXF1ZXN0KSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHtcclxuICAgICAgICAgIHBhcmFtczogdGhpcy5jbGVhckVtcHR5U2VhcmNoUGFyYW1zKCksXHJcbiAgICAgICAgICBwYWdlSW5mbzoge1xyXG4gICAgICAgICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCxcclxuICAgICAgICAgICAgcGFnZVNpemU6IHRoaXMuX3BhZ2VJbmZvLnBhZ2VTaXplLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIC8vIOWcqOe6v+aOkuW6j+aooeW8j++8muaKiuaOkuW6j+WvueixoeaPkOS6pOe7meaOpeWPo1xyXG4gICAgICAgICAgLi4uKHRoaXMuc29ydE1vZGUgPT09IFwic2VydmVyXCJcclxuICAgICAgICAgICAgPyB7IHNvcnQ6IHRoaXMuYnVpbGRTZXJ2ZXJTb3J0UGF5bG9hZCgpIH1cclxuICAgICAgICAgICAgOiB7fSksXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIOiHquWKqOazqOWFpSBjaGVja2VkIOWtl+aute+8jOaUr+aMgei3qOmhtemAieS4rVxyXG4gICAgICAgIGlmICh0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gKHJlc3VsdC5kYXRhIHx8IFtdKS5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGl0ZW0pO1xyXG4gICAgICAgICAgICAvLyDlpoLmnpzmlbDmja7lt7LmnIkgY2hlY2tlZCDlsZ7mgKfvvIzkv53nlZnvvJvlkKbliJnmoLnmja4gX3NlbGVjdGVkUm93SWRzIOWIpOaWrVxyXG4gICAgICAgICAgICBjb25zdCBjaGVja2VkID1cclxuICAgICAgICAgICAgICBpdGVtLmNoZWNrZWQgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgPyBpdGVtLmNoZWNrZWRcclxuICAgICAgICAgICAgICAgIDogaWQgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9zZWxlY3RlZFJvd0lkcy5oYXMoaWQpXHJcbiAgICAgICAgICAgICAgICA6IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICAgICAgY2hlY2tlZDogY2hlY2tlZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIC8vIOWIoOmZpOWQjuafpeivou+8muenu+mZpOiiq+WIoOmZpOmhueeahOmAieS4reeKtuaAgVxyXG4gICAgICAgICAgaWYgKGFmdGVyRGVsZXRlICYmIHByZXZpb3VzRGF0YVNvdXJjZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGFJZHMgPSBuZXcgU2V0KFxyXG4gICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5tYXAoKGl0ZW0pID0+IHRoaXMuZ2V0Um93SWQoaXRlbSkpXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAvLyDpgY3ljobkuYvliY3nmoTmlbDmja7mupDvvIzlpoLmnpzkuI3lnKjmlrDmlbDmja7mupDkuK3vvIzor7TmmI7ooqvliKDpmaTkuobvvIzpnIDopoHmuIXpmaTlhbbpgInkuK3nirbmgIFcclxuICAgICAgICAgICAgcHJldmlvdXNEYXRhU291cmNlLmZvckVhY2goKG9sZEl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBvbGRJZCA9IHRoaXMuZ2V0Um93SWQob2xkSXRlbSk7XHJcbiAgICAgICAgICAgICAgaWYgKG9sZElkICE9PSB1bmRlZmluZWQgJiYgIW5ld0RhdGFJZHMuaGFzKG9sZElkKSkge1xyXG4gICAgICAgICAgICAgICAgLy8g6KKr5Yig6Zmk55qE6aG577yM5LuO6YCJ5Lit6ZuG5ZCI5Lit56e76ZmkXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5kZWxldGUob2xkSWQpO1xyXG4gICAgICAgICAgICAgICAgLy8g5aaC5p6c5pWw5o2u5a+56LGh6L+Y5Zyo5YW25LuW5Zyw5pa55byV55So77yM5riF6Zmk5YW26YCJ5Lit54q25oCBXHJcbiAgICAgICAgICAgICAgICBpZiAob2xkSXRlbS5jaGVja2VkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgb2xkSXRlbS5jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gcmVzdWx0LmRhdGEgfHwgW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN1bW1hcnlEYXRhID0gcmVzdWx0LnN1bW1hcnlEYXRhIHx8IG51bGw7XHJcbiAgICAgICAgLy8g5pys5Zyw5o6S5bqP5qih5byP77ya5ou/5Yiw5pWw5o2u5ZCO5Zyo5YmN56uv5o6S5bqPXHJcbiAgICAgICAgaWYgKHRoaXMuc29ydE1vZGUgPT09IFwibG9jYWxcIikge1xyXG4gICAgICAgICAgdGhpcy5zb3J0RGF0YVNvdXJjZUluUGxhY2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcGFnZUluZm8udG90YWwgPSByZXN1bHQudG90YWwgfHwgMDtcclxuICAgICAgICAvLyDmm7TmlrDlhajpgInnirbmgIFcclxuICAgICAgICBpZiAodGhpcy5zaG93Q2hlY2tib3gpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlQ2hlY2tBbGxTdGF0dXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIuafpeivouWksei0pTpcIiwgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IFtdO1xyXG4gICAgICAgIHRoaXMuX3BhZ2VJbmZvLnRvdGFsID0gMDtcclxuICAgICAgICB0aGlzLnN1bW1hcnlEYXRhID0gbnVsbDtcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICB0aGlzLl9sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIuacquaPkOS+myBfcmVxdWVzdCDlm57osIPlh73mlbBcIik7XHJcbiAgICAgIHRoaXMuX2xvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIOS4jeWGjeiwg+eUqCBjbGVhclNlbGVjdGVkUm93cygp77yM5L+d55WZ6Leo6aG16YCJ5Lit54q25oCBXHJcbiAgfVxyXG5cclxuICAvLyDop6blj5HliJfmjpLluo/lj5jmm7RcclxuICBvblNvcnRDaGFuZ2Uoc29ydEtleTogc3RyaW5nLCBzb3J0T3JkZXI6IFwiYXNjZW5kXCIgfCBcImRlc2NlbmRcIiB8IG51bGwpIHtcclxuICAgIC8vIOWNleWIl+aOkuW6j++8mumHjee9ruWFtuWug+WIl++8m+WkmuWIl+aOkuW6j++8muS/neeVmeWFtuWug+WIl1xyXG4gICAgaWYgKCF0aGlzLm11bHRpcGxlU29ydCkge1xyXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLl9zb3J0TWFwKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICBpZiAoa2V5ICE9PSBzb3J0S2V5KSB0aGlzLl9zb3J0TWFwW2tleV0gPSBudWxsO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuX3NvcnRNYXBbc29ydEtleV0gPSBzb3J0T3JkZXI7XHJcblxyXG4gICAgLy8g57u05oqk5LyY5YWI57qn6Zif5YiX77ya5pyJ5bqP5YiX5LiU6Z2e56m6IC0+IOe9ruS6juacq+Wwvu+8m+S4uuepuiAtPiDnp7vpmaRcclxuICAgIHRoaXMuX3NvcnRQcmlvcml0eSA9IHRoaXMuX3NvcnRQcmlvcml0eS5maWx0ZXIoKGspID0+IGsgIT09IHNvcnRLZXkpO1xyXG4gICAgaWYgKHNvcnRPcmRlcikge1xyXG4gICAgICB0aGlzLl9zb3J0UHJpb3JpdHkucHVzaChzb3J0S2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zb3J0TW9kZSA9PT0gXCJsb2NhbFwiKSB7XHJcbiAgICAgIHRoaXMuc29ydERhdGFTb3VyY2VJblBsYWNlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyDlnKjnur/mjpLluo/vvJrph43mlrDor7fmsYJcclxuICAgICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U29ydE9yZGVyKHNvcnRLZXk6IHN0cmluZyk6IFwiYXNjZW5kXCIgfCBcImRlc2NlbmRcIiB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NvcnRNYXBbc29ydEtleV0gfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIGhhbmRsZVRhYmxlUm93Q2xpY2soZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gZGF0YTtcclxuICAgIC8vIOWmguaenOW8gOWQr+S6huWkjemAieahhu+8jOeCueWHu+ihjOaXtuWPqumAieS4reeCueWHu+ihjO+8iOWmguaenOihjOacquiiq+emgeeUqO+8iVxyXG4gICAgaWYgKHRoaXMuc2hvd0NoZWNrYm94ICYmICF0aGlzLmlzUm93RGlzYWJsZWQoZGF0YSkpIHtcclxuICAgICAgLy8g5YWI5riF56m65omA5pyJ6YCJ5Lit6KGMXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93cyA9IFtdO1xyXG4gICAgICAvLyDlj6rpgInkuK3lvZPliY3ngrnlh7vnmoTooYxcclxuICAgICAgdGhpcy50b2dnbGVSb3dDaGVja2VkKGRhdGEsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vblJvd0NsaWNrLmVtaXQodGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVUYWJsZVJvd0RiQ2xpY2soZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gZGF0YTtcclxuICAgIHRoaXMub25Sb3dEYkNsaWNrLmVtaXQodGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVDb2x1bW5zU2V0dGluZ0NvbmZpcm0oKSB7XHJcbiAgICB0aGlzLnF1ZXJ5RHluYW1pY0NvbHVtbnMoKTtcclxuICB9XHJcblxyXG4gIC8vIOWkhOeQhiBhdXRvQ29tcGxldGUg6L6T5YWl5LqL5Lu277yI5bim6Ziy5oqW77yJXHJcbiAgaGFuZGxlQXV0b0NvbXBsZXRlSW5wdXQoZXZlbnQ6IEV2ZW50LCBjb2x1bW46IFByb1RhYmxlQ29sdW1uKSB7XHJcbiAgICBjb25zdCBmaWVsZEtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG5cclxuICAgIC8vIOWmguaenOivpeWtl+autei/mOayoeaciemYsuaKluWHveaVsO+8jOWIm+W7uuS4gOS4qlxyXG4gICAgaWYgKCF0aGlzLl9hdXRvQ29tcGxldGVEZWJvdW5jZU1hcC5oYXMoZmllbGRLZXkpKSB7XHJcbiAgICAgIGNvbnN0IGRlYm91bmNlZEZuID0gZGVib3VuY2UoKGV2dDogRXZlbnQpID0+IHtcclxuICAgICAgICAvLyDph43mlrDmn6Xmib7lr7nlupTnmoQgY29sdW1u77yM56Gu5L+d5L2/55So5pyA5paw55qE6YWN572uXHJcbiAgICAgICAgY29uc3QgY3VycmVudENvbHVtbiA9IHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5maW5kKFxyXG4gICAgICAgICAgKGNvbCkgPT4gKGNvbC5maWVsZFByb3BzPy5uYW1lIHx8IGNvbC5wcm9wKSA9PT0gZmllbGRLZXlcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChjdXJyZW50Q29sdW1uKSB7XHJcbiAgICAgICAgICB0aGlzLmV4ZWN1dGVBdXRvQ29tcGxldGVEYXRhU291cmNlKGV2dCwgY3VycmVudENvbHVtbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAzMDApOyAvLyAzMDBtcyDpmLLmipblu7bov59cclxuICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGVib3VuY2VNYXAuc2V0KGZpZWxkS2V5LCBkZWJvdW5jZWRGbik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g6LCD55So6Ziy5oqW5Ye95pWwXHJcbiAgICBjb25zdCBkZWJvdW5jZWRGbiA9IHRoaXMuX2F1dG9Db21wbGV0ZURlYm91bmNlTWFwLmdldChmaWVsZEtleSk7XHJcbiAgICBpZiAoZGVib3VuY2VkRm4pIHtcclxuICAgICAgZGVib3VuY2VkRm4oZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+WIGF1dG9Db21wbGV0ZSDnmoTmlbDmja7mupBcclxuICBnZXRBdXRvQ29tcGxldGVEYXRhU291cmNlKGNvbHVtbjogUHJvVGFibGVDb2x1bW4pOiBhbnlbXSB7XHJcbiAgICBjb25zdCBmaWVsZEtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG4gICAgcmV0dXJuIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2ZpZWxkS2V5XSB8fCBbXTtcclxuICB9XHJcblxyXG4gIGdldEZpZWxkUHJvcHMoY29sdW1uOiBQcm9UYWJsZUNvbHVtbik6IGFueSB7XHJcbiAgICByZXR1cm4gY29sdW1uLmZpZWxkUHJvcHM7XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5bmjIflrprlkI3np7DnmoRsYWJlbOaooeadv1xyXG4gIGdldExhYmVsVGVtcGxhdGUobmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xyXG4gICAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLmN1c3RvbVRlbXBsYXRlcy5nZXQobmFtZSkgfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPliBmb3JtLWl0ZW0g55qE5Yqo5oCB57G75ZCNXHJcbiAgZ2V0Rm9ybUl0ZW1DbGFzc05hbWUoY29sdW1uOiBQcm9UYWJsZUNvbHVtbik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBmaWVsZE5hbWUgPSB0aGlzLmdldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG4gICAgcmV0dXJuIGBwcm8tdGFibGUtJHtmaWVsZE5hbWV9LWZvcm0taXRlbWA7XHJcbiAgfVxyXG59XHJcbiJdfQ==