@churchillliving/se-ui-toolkit 6.54.255 → 6.54.256
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.
- package/esm2022/lib/components/base/grid/grid.component.mjs +3 -3
- package/esm2022/lib/components/shared/generate-file/generate-file.component.mjs +3 -3
- package/esm2022/lib/components/shared/generate-file/import-dialog/import-dialog.component.mjs +70 -25
- package/esm2022/lib/services/grid.service.mjs +10 -5
- package/fesm2022/churchillliving-se-ui-toolkit.mjs +173 -117
- package/fesm2022/churchillliving-se-ui-toolkit.mjs.map +1 -1
- package/lib/components/shared/generate-file/import-dialog/import-dialog.component.d.ts +6 -4
- package/lib/services/grid.service.d.ts +1 -1
- package/package.json +1 -1
|
@@ -3125,11 +3125,11 @@ export class GridComponent {
|
|
|
3125
3125
|
}
|
|
3126
3126
|
}
|
|
3127
3127
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: GridComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SystemConfigService }, { token: i2.DialogService }, { token: i3.FormService }, { token: i4.GridService }, { token: i5.AlertService }, { token: i6.AuthenticationService }, { token: i0.ElementRef }, { token: i7.DecimalPipe }, { token: i8.PageLoggerService }, { token: i9.HyperlinkService }, { token: i0.ChangeDetectorRef }, { token: i10.Router }, { token: i7.DatePipe }, { token: i0.NgZone }, { token: i11.ConfirmationService }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i12.RequestService }, { token: i2.DynamicDialogConfig, optional: true }, { token: i2.DynamicDialogRef, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3128
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: GridComponent, selector: "se-grid", inputs: { activeTestMode: "activeTestMode", selectedRows: "selectedRows", setGridRefreshTime: "setGridRefreshTime", addDataKeyValue: "addDataKeyValue", stopDialogClose: "stopDialogClose", showRefreshBtn: "showRefreshBtn", hideRefreshBtn: "hideRefreshBtn", horizontalScroll: "horizontalScroll", hideDeleteBtn: "hideDeleteBtn", hideEditBtn: "hideEditBtn", hideAddBtn: "hideAddBtn", loading: "loading", autoLoadData: "autoLoadData", rowStyle: "rowStyle", allowSelection: "allowSelection", selectionColumnWidth: "selectionColumnWidth", allowSelectionHeader: "allowSelectionHeader", hideGridSaveButton: "hideGridSaveButton", hideGridCancelButton: "hideGridCancelButton", allowExportToPdf: "allowExportToPdf", allowExportToExcel: "allowExportToExcel", setActionColumnAsFirst: "setActionColumnAsFirst", useInlineCRUD: "useInlineCRUD", rowActions: "rowActions", selectionType: "selectionType", dataKey: "dataKey", clearGridFilter: "clearGridFilter", searchGridFilter: "searchGridFilter", scrollable: "scrollable", scrollHeight: "scrollHeight", tableStyle: "tableStyle", wordWrap: "wordWrap", newGridRow: "newGridRow", filtering: "filtering", reportButtons: "reportButtons", rowHover: "rowHover", hideFilterOptions: "hideFilterOptions", setPaginationLength: "setPaginationLength", rows: "rows", globalFilterData: "globalFilterData", columns: "columns", permissions: "permissions", allowColumnToggle: "allowColumnToggle", hideFilter: "hideFilter", lookupFilters: "lookupFilters", pagination: "pagination", showCurrentPageReport: "showCurrentPageReport", totalRecords: "totalRecords", aggregatedResult: "aggregatedResult", showconfirmDialog: "showconfirmDialog", saveAllData: "saveAllData", defaultRows: "defaultRows", columnActions: "columnActions", useServerSideEvents: "useServerSideEvents", allowCaching: "allowCaching", allowPersistence: "allowPersistence", softCaching: "softCaching", editAllRows: "editAllRows", gridName: "gridName", autoResize: "autoResize", allowTextCopy: "allowTextCopy" }, outputs: { inlineRowCancel: "inlineRowCancel", rowsChange: "rowsChange", onRowClick: "onRowClick", onCheckBoxFilterClick: "onCheckBoxFilterClick", onRowCheckBox: "onRowCheckBox", onSortChange: "onSortChange", onFilterChange: "onFilterChange", onMultiSelectionChange: "onMultiSelectionChange", onApplyFilter: "onApplyFilter", isIncludedAllColumns: "isIncludedAllColumns", onServerSideEventChange: "onServerSideEventChange", onPageChange: "onPageChange", onRowUpdate: "onRowUpdate", onCancelAllRows: "onCancelAllRows", onRowDelete: "onRowDelete", onRowAdd: "onRowAdd", onGridRowActions: "onGridRowActions", onGridRowEdit: "onGridRowEdit", onGridRowAdd: "onGridRowAdd" }, host: { listeners: { "copy": "handleCopyOrCut($event)", "cut": "handleCopyOrCut($event)", "click": "onClick($event.target)", "window:beforeunload": "beforeunloadHandler($event)" } }, viewQueries: [{ propertyName: "panelOverlayViewContainer", first: true, predicate: ["viewContainerRef"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "table", first: true, predicate: ["dt"], descendants: true }, { propertyName: "gridRow", predicate: ["gridRow"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"grid-component-wrapper\">\n<p-confirmDialog [style]=\"{ width: '50vw' }\" *ngIf=\"useInlineCRUD\" key=\"handleInlineCRUD\"></p-confirmDialog>\n<p-confirmDialog class=\"grid-component-confirm-dialog\" *ngIf=\"columnActions.length > 0\"\n key=\"handlecolumnActions\"></p-confirmDialog>\n<div class=\"global-filter-buttons-wrapper\">\n\n <!-- button for apply value on Grid -->\n <button *ngIf=\"((filtering && !hideFilter ) || showFilterbtn)\" pButton type=\"button\" icon=\"pi pi-search\" (click)=\"applyGridFilterBtn()\"\n [class]=\"\n searchGridFilter ? 'p-button-success apply-filter-btn filter-btn' : 'hide-clear-filter-button apply-filter-btn filter-btn'\n \"></button>\n\n <!-- button for clear value on Grid -->\n <button *ngIf=\"((filtering && !hideFilter )|| showFilterbtn)\" pButton id=\"clearGridFilterValuesButton\" type=\"button\"\n icon=\"pi pi-replay\" (click)=\"cleargridFiltersValue()\" [class]=\"\n clearGridFilter ? 'filter-btn' : 'hide-clear-filter-button filter-btn'\n \" class='global-refresh global-btn'\n ></button>\n\n <!-- button for save all grid at once -->\n <button pButton *ngIf=\"editAllRows && editRowPermission\" id=\"saveAllGridValues\"\n icon=\"pi pi-check\" [label]=\"'Save'\"\n [class]=\"hideGridSaveButton ? 'hide-clear-filter-button save-all-grid' : 'ui-button-info save-all-grid'\" type=\"button\"\n (click)=\"saveAllRowsAtOnce()\"></button>\n\n <!-- button for cancel all grid at once -->\n <button pButton *ngIf=\"editAllRows && !hideGridCancelButton\" id=\"editBtnGlobalvalues\" type=\"button\" [label]=\"'Cancel'\"\n icon=\"pi pi-times\" class=\"ui-button-info\" (click)=\"cancelAllRowsAtOnce()\"></button>\n\n <!-- header Button for multiSelect on Grid -->\n <span *ngIf=\"allowColumnToggle\" observeCheckbox>\n <p-multiSelect [showToggleAll]=\"false\" optionDisabled=\"false\" [options]=\"selectedToggleColumns\" [(ngModel)]=\"selectedColumns\" optionLabel=\"header\"\n selectedItemsLabel=\"{0} columns selected\" class=\"grid-component-multiselect-header-button\" placeholder=\"Choose Columns\">\n </p-multiSelect>\n </span>\n\n <!-- header Button for Adding new Row on Grid -->\n <button pButton *ngIf=\"useInlineCRUD && addRowPermission && !hideAddBtn\" type=\"button\" [label]=\"'Add'\" pAddRow\n [table]=\"componentTableRef\" [newRow]=\"newGridRow\" [id]=\"dataKey\" pTooltip=\"Add New Row\" tooltipPosition=\"bottom\"\n icon=\"pi pi-plus\" [class]=\"'ui-button-info global-add-btn'+gridName\" (click)=\"addNewRow(newGridRow, true)\" pRipple></button>\n\n \n <!-- header Button for Excel File on Grid -->\n <button *ngIf=\"allowExportToExcel\" type=\"button\" pButton icon=\"pi pi-file-excel\" (click)=\"exportExcel()\"\n class=\"p-button-success\" pTooltip=\"Export to Excel\" tooltipPosition=\"bottom\" pRipple></button>\n\n<!-- header Button for PDF File on Grid -->\n<button *ngIf=\"allowExportToPdf\" type=\"button\" pButton icon=\"pi pi-file-pdf\" (click)=\"exportPdf()\"\n class=\"p-button-warning mr-2 ml-2\" pTooltip=\"Export to Pdf\" tooltipPosition=\"bottom\" pRipple></button>\n\n <!-- <div *ngFor=\"let reportButton of reportButtons\" class=\"ui-button-info mr-2 ml-2\">\n <se-generate-report-btn *ngIf =\"!reportButton.hidden\"[repId]=\"reportButton.reportId\" [label]=\"reportButton.label\" [params]=\"reportButton.params\"\n [showDialog]=\"reportButton.showDialog\"></se-generate-report-btn>\n </div> -->\n\n <ng-content></ng-content>\n\n <ng-container *ngFor=\"let reportButton of reportButtons\">\n <se-generate-report-btn *ngIf =\"!reportButton.hidden\"[repInfo]=\"reportButton\" [label]=\"reportButton.label\" [params]=\"reportButton.params\" [icon]=\"reportButton.icon\" [class]=\"reportButton.class\"\n [showDialog]=\"reportButton.showDialog\" [reportType]=\" reportButton.reportType\" [reportHeader]=\"reportButton.reportHeader\" [reportFooter]=\"reportButton.reportFooter\"></se-generate-report-btn>\n </ng-container>\n\n</div>\n\n <p-table *ngIf=\"!isGridHidden\" id=\"my-table\" [value]=\"rowsData\" [columns]=\"selectedColumns\" sortMode=\"multiple\"\n [lazy]=\"useServerSideEvents\" [paginator]=\"pagination\" [alwaysShowPaginator]=\"pagination && totalRecords > 0\" \n [class]=\"' grid-component-main-table ' + (pagination || !rowsData.length ? ' pagination ' : '') + (tableStyle.includes('width') ? ' hasTableWidthStyle ' : '') + (autoResize ? '' : 'table-layout-auto') \"\n (onColResize)=\"onColumnResize($event,dt)\" [resizableColumns]=\"true\"\n responsiveLayout=\"scroll\" columnResizeMode=\"expand\"\n [rows]=\"defaultRows\" [totalRecords]=\"totalRecords\" [rowsPerPageOptions]=\"setPaginationLength\"\n [showCurrentPageReport]=\"showCurrentPageReport\" currentPageReportTemplate=\"Showing {first} to {last} of {{\n totalRecords\n }} entries\" [loading]=\"!setGridRefreshTime ? loading : false\"\n (onSort)=\"sortDisabled ?? handleSortChange($event)\" (onFilter)=\"handleFilterChange($event)\"\n (onLazyLoad)=\"autoLoadData ? handleServerSideEvents($event, dt) : ''\" (onPage)=\"gridService.columnFocusedOut ? showConfirmation($event) : handleServerSidePagination($event)\" #dt\n [dataKey]=\"dataKey\" [(selection)]=\"selectedRows\" selectionMode=\"multiple\" [scrollable]=\"scrollable\" \n [tableStyle]=\"tableStyle\"\n [scrollHeight]=\"scrollHeight\"\n editMode=\"row\" [editingRowKeys]=\"editingRowKeys\" [rowHover]=\"rowHover\"\n [ngClass]=\"setClassaAndId(dt)\">\n\n <div *ngIf=\"rowActions.length > 0 && rowActions.length > 0\" class=\"flex justify-content-end\">\n <span *ngFor=\"let rowAction of rowActions\">\n <button pButton type=\"button\" [label]=\"rowAction.title\" [class]=\"rowAction.class\"\n (click)=\"rowAction.onClick(selectedRows)\"></button>\n </span>\n </div>\n\n <!-- header columns on Grid -->\n <ng-template pTemplate=\"header\" let-cols>\n <tr>\n <th pResizableColumn *ngIf=\"allowSelection && selectionType === 'multiple'\" class=\"grid-component-selection\" id=\"{{allowSelectionHeader}}\">\n <span class=\"th-content-wrapper\">\n <div class=\"grid-component-table-header-inner-div-2\n table-header-inner-div div-last-inner-html-is-icon\">\n <span class=\"flex-grow-1\"> {{allowSelectionHeader}} </span>\n <p-tableHeaderCheckbox *ngIf=\"selectionType === 'multiple'\" binary=\"true\"\n (click)=\"multiCheckBoxOnclick(rowsData, $event)\"></p-tableHeaderCheckbox>\n </div>\n </span>\n </th>\n <th pResizableColumn *ngIf=\"allowSelection && selectionType === 'single'\" id=\"Select\"\n data-title-element=\"self\" class=\"grid-component-selection\">\n Select\n </th>\n <th pResizableColumn id=\"Actions\"\n *ngIf=\"setActionColumnAsFirst && !disabledSaveBtn && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn' \" data-title-element=\"self\" >\n Actions\n </th>\n <th pResizableColumn *ngFor=\"let column of cols\" [style.width]=\"column?.columnWidth ? column?.columnWidth+'px' : column?.customWidth+'px'\" id=\"{{column.header}}\" [pSortableColumn]=\"column.field\"\n [class]=\"column.type === 'boolean' ? 'checkbox-th' : ''\"\n [pSortableColumnDisabled]=\"sortDisabled && useServerSideEvents ? true : column.sorting === false\"\n class=\"column?.type === 'multiple' ? 'grid-component-select-th-column-type-multiple' : ''\">\n <span class=\"th-content-wrapper\">\n <div class=\"grid-component-table-header-inner-div-1 table-header-inner-div div-last-inner-html-is-icon\"> \n <span [attr.data-title-element]=\"'self'\" [class]=\"'flex-grow-1'\" >{{ column.header }}\n <span *ngIf=\"column.isRequired\" class=\"grid-component required-star\">*</span>\n </span>\n <p-sortIcon *ngIf=\"column.sorting !== false && column?.type !== 'multiple'\"\n [field]=\"column.field\"></p-sortIcon>\n </div>\n </span>\n </th>\n <th pResizableColumn id=\"Actions\"\n *ngIf=\"!setActionColumnAsFirst && !disabledSaveBtn && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\" data-title-element=\"self\" >Actions</th>\n </tr>\n <tr *ngIf=\"filtering && !hideFilter\">\n <th pResizableColumn *ngIf=\"allowSelection\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></th>\n <th pResizableColumn *ngIf=\"setActionColumnAsFirst && !disabledSaveBtn && useInlineCRUD\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">\n </th>\n <th pResizableColumn *ngFor=\"let column of cols\" [style.width]=\"column?.columnWidth ? column?.columnWidth+'px' : column?.customWidth+'px'\" id=\"{{column.header}}\" [ngSwitch]=\"column?.filter?.type\" \n [class]=\"hideFilterOptions ? 'hide-table-filter temp' : 'temp'\">\n <span *ngIf=\"column.filtering !== false\" [class]=\"column.filter?.showFilter ? '' : 'hide-filter-icon'\">\n <!-- Text input on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [type]=\"'text'\" [field]=\"column.field\" *ngSwitchCase=\"'input'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <input type=\"text\" [(ngModel)]=\"column.filterValue\" [class]=\"column?.field?.toLowerCase()\" (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n (blur)=\"setFilterFocusOut(column, filter, $event)\"\n (keyup)=\"removingFilters($event, column);backspaceEvent($event, column)\" pInputText />\n </ng-template>\n </p-columnFilter>\n\n <!-- Numeric input on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [type]=\"'numeric'\" [field]=\"column.field\" *ngSwitchCase=\"'numeric_input'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-inputNumber [(ngModel)]=\"column.filterValue\" [class]=\"column?.field?.toLowerCase()\" (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n (onBlur)=\"setFilterFocusOut(column, filter, $event)\"\n (keyup)=\"removingFilters($event, column);backspaceEvent($event, column)\"></p-inputNumber>\n </ng-template>\n </p-columnFilter>\n\n <!-- lookup input on Header For Filter-->\n <p-columnFilter\n class=\"no-filter-icon\"\n [type]=\"'text'\"\n [field]=\"column.field\"\n *ngSwitchCase=\"'lookup_input'\"\n >\n <ng-template\n pTemplate=\"filter\"\n let-value\n let-filter=\"filterCallback\"\n >\n <div class=\"close-icon-wrapper grid-component lookup-filter-wrapper\">\n <div class=\"lookup-filter-input-wrapper\"> \n <input\n [id]=\"column.field?.toLowerCase() + '_filter'\"\n class=\"grid-component lookup-filter\"\n autocomplete=\"off\"\n type=\"text\"\n [(ngModel)]=\"column.filterValue\"\n (click)=\"setFilterLookup(column)\"\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n (blur)=\"setFilterFocusOut(column, filter, $event)\"\n (keyup)=\"removingFilters($event, column);backspaceEvent($event, column)\"\n pInputText\n />\n </div> \n <div class=\"direct-wrapper-close-icon-lookup\">\n <button\n *ngIf=\"column.filterValue\"\n icon=\"pi pi-times\"\n pButton\n type=\"button\"\n (click)=\"lookupClearValue(column)\">\n </button>\n </div>\n </div>\n </ng-template>\n </p-columnFilter>\n\n <!-- checkbox on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" type=\"boolean\" [field]=\"column.field\" *ngSwitchCase=\"'checkbox'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-checkbox [binary]=\"true\" [disabled]=\"column.disabled\" [(ngModel)]=\"column.filterValue\"\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n (onChange)=\"setFilterFocusOut(column, filter, $event)\" (click)=\"clickCheckBoxFilter(column)\"\n (keydown)=\"backspaceEvent($event, column)\">\n </p-checkbox>\n </ng-template>\n </p-columnFilter>\n\n <!-- multiSelect on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [field]=\"column.field\" matchMode=\"in\" [showMenu]=\"false\" *ngSwitchCase=\"'multi-select'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-multiSelect [(ngModel)]=\"column.filterValue\" [options]=\"column.filter.data || []\" \n [appendTo]=\"'body'\" [name]=\"column.field\"\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n [optionValue]=\"column.optionValue\"\n [optionLabel]=\"column.optionLabel\"\n (onChange)=\"setFilterFocusOut(column, filter, $event)\" \n (keydown)=\"backspaceEvent($event, column)\">\n \n </p-multiSelect>\n </ng-template>\n </p-columnFilter>\n\n <!-- dropdown on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [field]=\"column.field\" matchMode=\"in\" [showMenu]=\"false\" *ngSwitchCase=\"'dropdown'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-dropdown [showClear]=\"true\" [placeholder]=\"'Select'\" [filter]=\"column.allowSearch\"\n [(ngModel)]=\"column.filterValue\" (keyup.enter)=\"applyDropdownFilter(filter, $event)\"\n [options]=\"column.filter.data || []\"\n (onChange)=\"searchDropdownFilter(filter, $event, column)\"></p-dropdown>\n </ng-template>\n </p-columnFilter>\n\n <!-- calendar on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [field]=\"column.field\" matchMode=\"in\" [showMenu]=\"false\" *ngSwitchCase=\"'calendar'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-calendar [placeholder]=\"'Select-Date'\" [(ngModel)]=\"column.filterValue\"\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\" appendTo=\"body\" (onSelect)=\"selectDate(column)\"\n [inputId]=\"column.field\" hourFormat=\"12\" (keyup.backspace)=\"removeNullCalendar(column, filter, $event)\"\n [showButtonBar]=\"true\" (onClose)=\"setFilterFocusOut(column, filter, $event)\"\n (keydown)=\"backspaceEvent($event, column)\" (onClearClick)=\"backspaceEvent($event, column)\">\n </p-calendar>\n </ng-template>\n </p-columnFilter>\n\n <!-- Default Filter For Header -->\n <p-columnFilter class=\"no-filter-icon\" [type]=\"\n column.type && column.type !== 'link' ? column.type : 'text'\n \" [field]=\"column.field\" display=\"menu\" *ngSwitchDefault>\n </p-columnFilter>\n </span>\n </th>\n <th pResizableColumn\n *ngIf=\"!setActionColumnAsFirst && !disabledSaveBtn && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></th>\n </tr>\n </ng-template>\n\n <!-- Body columns on Grid -->\n <ng-template pTemplate=\"body\" let-row let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr \n [style]=\"rowStyle\"\n [ngClass]=\"row?.highlightrow ? 'highlighted-row' : ''\"\n [class]=\"wordWrap ? 'p-selectable-row wordWrapTrue' : 'wordWrapFalse p-selectable-row'\" (click)=\"selectedRowRecord = row\"\n [pEditableRow]=\"row\" #gridRow [id]=\"row[dataKey]\">\n <td *ngIf=\"allowSelection\" class=\"grid-component-selection\">\n <p-tableRadioButton [value]=\"row\" *ngIf=\"selectionType === 'single'\"\n (click)=\"multiCheckBoxOnclick(row , $event, true)\"></p-tableRadioButton>\n <p-tableCheckbox [value]=\"row\" *ngIf=\"selectionType === 'multiple'\"\n (click)=\"multiCheckBoxOnclick(row, $event)\"></p-tableCheckbox>\n </td>\n\n <!-- first actions column -->\n <td *ngIf=\"setActionColumnAsFirst && columnActions.length > 0\">\n <span class=\"action-btn\" *ngFor=\"let action of columnActions\">\n <i [title]=\"action.tooltip\" [class]=\"action.icon\" (click)=\"handleActionClick($event, action, row)\"></i>\n </span>\n </td>\n <td *ngIf=\"setActionColumnAsFirst && useInlineCRUD && (deleteRowPermission || editRowPermission)\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"\n [ngClass]=\"disabledSaveBtn ? 'hide-clear-filter-button' : ''\">\n <span class=\"setActionColumnWidth\">\n <se-grid-row-actions [editing]=\"editing\" [editRowPermission]=\"editRowPermission\"\n [deleteRowPermission]=\"deleteRowPermission\" [hideDeleteBtn]=\"hideDeleteBtn\" [hideEditBtn]=\"hideEditBtn\"\n [row]=\"row\" (onRowEditInitBtn)=\"onRowEditInit($event)\" (deleteRecordBtn)=\"deleteRecord($event)\"\n (onRowEditSaveBtn)=\"onRowEditSave($event)\" (onRowEditCancelBtn)=\"onRowEditCancel($event, ri)\"\n [editAllRows]=\"editAllRows\">\n </se-grid-row-actions>\n </span>\n </td>\n\n <!-- Grid Rows Data Bindings Start -->\n <td *ngFor=\"let column of selectedColumns\" [ngSwitch]=\"column.type\" [style]=\"column.style \" \n (mouseenter)=\"(column.hoverData && column.hoverData.component) && addDynamicPanelOverlayComponent(column.hoverData, overlayPanel, $event, row)\"\n (mouseleave)=\"(column.hoverData && column.hoverData.component) && mouseLeaveEvent(overlayPanel)\"\n >\n <span class=\"td-content-wrapper\" [style]=\"column.style\">\n\n <!-- Boolean column on Grid -->\n <span *ngSwitchCase=\"'boolean'\"\n >\n <td *ngIf=\"!editing && row[column.field + '_obj']?.show != false\">\n <p-checkbox \n [disabled]=\"!column.allowEdit ?? true\" [binary]=\"true\" (click)=\"onClickEvent(column, row)\"\n (ngModelChange)=\"checkBoxChangeEvent($event, column, row)\" (blur)=\"onFocusOutEvent(column, row)\" \n [(ngModel)]=\" \n row[column.field] &&\n (row[column.field].toString() === '1' ||\n row[column.field].toString().toLowerCase() === 'true' ||\n row[column.field].toString().toLowerCase() === 'y'||\n ( row[column.field].text && (row[column.field]?.text?.toString() === '1' ||\n row[column.field]?.text?.toString()?.toLowerCase() === 'true' ||\n row[column.field]?.text?.toString()?.toLowerCase() === 'y')))\n ? Checked\n : unChecked\n \">\n </p-checkbox>\n </td>\n <td *ngIf=\"editing\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <!-- for edit checkBox -->\n <p-checkbox (click)=\"onClickEvent(column, row)\" (ngModelChange)=\"checkBoxChangeEvent($event, column, row)\"\n [disabled]=\"allowDisabled(column,row)\" [binary]=\"true\" [(ngModel)]=\"\n row[column.field] && \n (row[column.field].toString() === '1' ||\n row[column.field].toString().toLowerCase() === 'true' ||\n row[column.field].toString().toLowerCase() === 'y' ||\n ( row[column.field].text && (row[column.field]?.text?.toString() === '1' ||\n row[column.field]?.text?.toString()?.toLowerCase() === 'true' ||\n row[column.field]?.text?.toString()?.toLowerCase() === 'y')))\n ? editModeChecked\n : editModeunCkecked\n \" (blur)=\"onFocusOutEvent(column, row)\"></p-checkbox>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ row[column.field] }}\n </ng-template>\n </p-cellEditor>\n </td>\n </span>\n\n <!-- link column on Grid -->\n <span [attr.data-title-element]=\"column.hoverData ? null : 'a,input'\" *ngSwitchCase=\"'link'\">\n <!-- link column for HyperLink Case -->\n <span *ngIf=\"column.allowSave === false\">\n <span *ngIf=\"column.target !== '_self'\" [style]=\"column.style\"\n [attr.data-title-element]=\"column.hoverData ? null : 'a'\"\n class=\"custom-link\"\n [class]=\"allowDisabled(column,row) ? 'disabled-link' : ''\">\n\n <a class=\"d-inline\" [href]=\"column.disabled?'':row[column.field + '_obj']?.hyperlink\" target=\"_blank\">\n <i *ngIf=\"column.icon &&!row[column.field+'_obj']?.hideFieldValue; else noIcon\" [class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n <span (click)=\"column?.onClick ? onClickEvent(column, row) : ''\">\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </span>\n </ng-template>\n </a>\n \n </span>\n <span *ngIf=\"column.target === '_self'\" [style]=\"column.style\"\n [attr.data-title-element]=\"column.hoverData ? null : 'a'\" class=\"custom-link\"\n [class]=\" allowDisabled(column,row) ? 'disabled-link' : ''\">\n\n <a class=\"d-inline\" [href]=\"column.disabled?'':row[column.field + '_obj']?.hyperlink\" [target]='column.target'>\n <i *ngIf=\"column.icon &&!row[column.field+'_obj']?.hideFieldValue; else noIcon\" [class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n <span (click)=\"column?.onClick ? onClickEvent(column, row) : ''\">\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </span>\n </ng-template>\n </a>\n\n </span>\n </span>\n <!-- link column for Edit Case -->\n <span *ngIf=\"column.allowSave || column.allowSave === undefined\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <span\n *ngIf=\"(column.editable === true ) && (column.editLink === true )\">\n <input *ngIf=\"!row.isNew\" pInputText (click)=\"column?.onClick ? onClickEvent(column, row) : ''\" type=\"text\"\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"row[column.field + '_obj']?.hideFieldValue ? '' : row[column.field + '_obj']?.displayText ? row[column.field + '_obj']?.displayText : column.displayText ? column.displayText : row[column.field]\"\n (blur)=\"onFocusOutEvent(column, row)\"\n (change)=\"onChangeEvent(column, row)\" />\n <input pInputText *ngIf=\"row.isNew\" type=\"text\" (click)=\"column?.onClick ? onClickEvent(column, row) : ''\"\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ? row[column.field+'_obj']?.displayField : row[column.field]\"\n (blur)=\"onFocusOutEvent(column, row)\"\n (change)=\"onChangeEvent(column, row)\" />\n </span>\n <!-- <span *ngIf=\"column.editable === false|| column.editable === undefined\" >\n <a class=\"custom-link\" (click)=\"onClickEvent(column, row)\" [href]=\"row[column.field + '_obj']?.hyperlink\" [target]='column.target'\n [class]=\"allowDisabled(column,row) ? 'disabled-link' : ''\">\n <i *ngIf=\"column.icon && !row[column.field+'_obj']?.hideFieldValue; else noIcon\"[class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </ng-template>\n \n </a>\n </span> -->\n <span *ngIf=\"(column.editLink === false|| column.editLink === undefined)&&(column.editable === false|| column.editable === undefined)\">\n <a class=\"d-inline\" [href]=\"row[column.field + '_obj']?.hyperlink\" [target]=\"column.target ? column.target : '_blank'\"\n [class]=\"column.editable === false ? '' : allowDisabled(column,row) ? 'disabled-link' : ''\">\n <i *ngIf=\"column.icon && !row[column.field+'_obj']?.hideFieldValue; else noIcon\"[class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n <span (click)=\"column?.onClick ? onClickEvent(column, row) : ''\">\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </span> \n </ng-template>\n \n </a>\n </span>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span [style]=\"column.style\" class=\"custom-link\" [class]=\"column.editable === false || allowDisabled(column,row) ? 'disabled-link' : ''\">\n <a class=\"d-inline\" [href]=\"column.disabled?'':row[column.field + '_obj']?.hyperlink\" [target]=\"column.target ? column.target : '_blank'\"\n >\n <i *ngIf=\"column.icon&& !row[column.field+'_obj']?.hideFieldValue; else noIcon\" [title]=\"column.header\" [class]=\"column.icon\"></i>\n <ng-template #noIcon>\n <span (click)=\"column?.onClick ? onClickEvent(column, row) : ''\">\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </span>\n </ng-template>\n </a>\n\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n </span>\n\n <!-- Iframe column on Grid -->\n <span *ngSwitchCase=\"'iframe'\">\n <span class=\"custom-link\" (click)=\"gridIFrame(column, row[column.field + '_obj']?.hyperlink, row)\" [title]=\"\n row[column.field + '_obj'] &&\n (row[column.field + '_obj'].displayText === null || row[column.field + '_obj'].displayText === '')\n ? row[column.field] : row[column.field + '_obj']?.displayText\n ? row[column.field + '_obj'].displayText\n : column.displayText\n ? column.displayText\n : row[column.field]\n\n \"\n > \n <i *ngIf=\"column.icon; else noIcon\"[class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n {{\n row[column.field + '_obj'] &&\n (row[column.field + '_obj'].displayText === null || row[column.field + '_obj'].displayText === '')\n ? row[column.field] : row[column.field + '_obj']?.displayText\n ? row[column.field + '_obj'].displayText\n : column.displayText ? column.displayText : row[column.field]\n }}\n </ng-template>\n </span>\n </span>\n\n <!-- dialog column on Grid -->\n <span *ngSwitchCase=\"'dialog'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <span\n *ngIf=\"column?.filter?.type !== 'calendar' && !row?.hidegridbtn\" \n \n >\n <span *ngIf=\"column.editable === true && !row[column.field+'_obj']?.hideFieldValue\">\n <input [attr.data-title-element]=\"column.hoverData ? null : 'self'\"\n readonly\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\n type=\"text\"\n pInputText\n (click)=\"selectLookupField(column, row)\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ?\n row[row[column.field+'_obj']?.displayField?.toLowerCase()] : \n row[column.field]\"\n [name]=\"row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"\n (blur)=\"onFocusOutEvent(column, row)\"\n />\n \n </span>\n <span [attr.data-title-element]=\"column.hoverData ? null : 'self'\"\n *ngIf=\"column.editable === false || column.editable === undefined\n \" class=\"custom-link\" [style]=\"column.style\"\n [class]=\"\n allowDisabled(column,row) ? 'disabled-link' : ''\n \" (click)=\"openGridDialog(column, row, $event)\">\n <i *ngIf=\"(column.icon || row[column.field+'_obj']?.icon) && !row[column.field+'_obj']?.hideFieldValue ; else noIcon\"\n [class]=\"row[column.field+'_obj']?.icon ? row[column.field+'_obj']?.icon : column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>{{ (!column.displayText && row.isNew ) || row[column.field+'_obj']?.hideFieldValue ? '' : setConditionBaseValue(row, column)\n }}</ng-template>\n </span>\n </span>\n <span *ngIf=\"column?.filter?.type === 'calendar' && column.editable === true\" [attr.data-title-element]=\"column.hoverData ? null : 'input'\">\n <p-calendar [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" (onClose)=\"onFocusOutEvent(column, row)\"\n [minDate]=\"column.minDate\" [maxDate]=\"column.maxDate\"\n [appendTo]=\"'body'\" hourFormat=\"12\" [showTime]=\"column.showTime\" (click)=\"onClickEvent(column, row)\"\n [timeOnly]=\"column.timeOnly\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ?\n row[row[column.field+'_obj']?.displayField.toLowerCase()] : row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"></p-calendar>\n </span>\n <span *ngIf=\"column?.filter?.type === 'calendar' && !column.editable\" class=\"custom-link\"\n [class]=\"row.disabled || allowDisabled(column,row) ? 'disabled-link' : ''\"\n (click)=\"openGridDialog(column, row, $event)\"\n >{{ row[column.field+'_obj']?.hideFieldValue ? '' : setConditionBaseValue(row, column) }}\n </span>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span class=\"custom-link\" [style]=\"column.style\"\n [class]=\"row.disabled || allowDisabled(column,row) ? 'disabled-link' : ''\"\n (click)=\"openGridDialog(column, row, $event)\"\n [attr.data-title-element]=\"column.hoverData ? null : 'self'\">\n <i *ngIf=\"(column.icon || row[column.field+'_obj']?.icon) && !row[column.field+'_obj']?.hideFieldValue ; else noIcon\"[title]=\"column.header\" [class]=\"row[column.field+'_obj']?.icon ? row[column.field+'_obj']?.icon : column.icon\"></i>\n <ng-template #noIcon>{{ row[column.field+'_obj']?.hideFieldValue ? '' : setConditionBaseValue(row, column) }}</ng-template>\n <!-- {{ setConditionBaseValue(row, column) }}\n *ngIf=\"!row[column.field + '_secondType'] && !row.hidegridbtn\" -->\n\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- test -->\n <!-- lookup Input column on Grid -->\n <span *ngSwitchCase=\"'lookup_input'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <div class=\"close-icon-wrapper\">\n <input [attr.data-title-element]=\"column.hoverData ? null : 'self'\" readonly type=\"text\"\n [(ngModel)]=\"row?.isNew || row?.isnew ? typeOf(row[column.field]) === 'object' ? row[column.field]?.text : row[column.field] : row[column.field+'_obj']?.displayField ? row[row[column.field+'_obj']?.displayField?.toLowerCase()] :\n typeOf(row[column.field+'_obj']?.text) === 'object' && row[column.field+'_obj']?.text?.hasOwnProperty('text') ? row[column.field+'_obj']?.text?.text : \n column.displayField ? row[column.displayField?.toLowerCase()] : row[column.field]\n \"\n (keyup.tab)=\"selectLookupField(column, row)\" [disabled]=\"allowDisabled(column,row)\"\n (click)=\"selectLookupField(column, row)\" [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : 'prime-input'\" (blur)=\"onFocusOutEvent(column, row)\" />\n <div *ngIf=\"!allowDisabled(column,row)\"><button *ngIf=\"row[column.field] && typeOf(row[column.field]) === 'object'\n ? row[column.field].text\n : row[column.field] && !column.disabled\" icon=\"pi pi-times\" pButton type=\"button\"\n (click)=\"lookupClearValue(column,row)\"></button></div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"output\" >\n <span *ngIf=\"column.linkId\" >\n <a [attr.data-title-element]=\"column.hoverData ? null : 'self'\" [href]=\"row[column.field + '_obj']?.hyperlink\" [target]=\"column.target === '_self' ? '' : '_blank'\">\n {{\n setLookupReadOnlyValue(row, column)\n }}\n </a>\n </span>\n <span [attr.data-title-element]=\"column.hoverData ? null : 'self'\" *ngIf=\"!column.linkId\" [style]=\"column.style\" [class]=\"column.component && column.editLink === true ? 'custom-link' : ''\"\n (click)=\"openLookupHyperlink(column, row)\" >\n {{\n setLookupReadOnlyValue(row, column)\n }}\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- Numeric Input column on Grid -->\n <span *ngSwitchCase=\"'numeric'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <!-- for Currency && Decimal && Percent -->\n <span [attr.data-title-element]=\"column.hoverData ? null : 'input'\" class=\"input-number\">\n <p-inputNumber [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" [class]=\"\n row[column.field.toLowerCase()+'_obj']?.errorMessage\n ? 'ng-invalid ng-dirty'\n : 'form-control'\n \" [showButtons]=\"false\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ? row[row[column.field+'_obj']?.displayField?.toLowerCase()] : row[column.field]\" [name]=\"column.field\"\n [disabled]=\"allowDisabled(column,row)\" (onFocus)=\"onFocusEvent(column, row)\"\n (onBlur)=\"onFocusOutEvent(column, row)\" [mode]=\"\n column.format &&\n column.format.type === 'currency'\n ? 'currency'\n : 'decimal'\n \" [currency]=\"\n column.format &&\n column.format.type === 'currency' &&\n column.format.formatParams &&\n column.format.formatParams.currency\n ? column.format.formatParams.currency\n : 'USD'\n \" [locale]=\"\n column.format &&\n column.format.type === 'currency' &&\n column.format.formatParams &&\n column.format.formatParams.locale\n ? column.format.formatParams.locale\n : 'en-US'\n \" [minFractionDigits]=\"column.format ? setNumericMinMxFraction(column) : '0'\"\n [maxFractionDigits]=\"column.format ? setNumericMinMxFraction(column) : '0'\" [suffix]=\"\n column.format &&\n column.format.type === 'percent' && \n '%'\n \n \">\n </p-inputNumber>\n </span>\n <ng-template #locked_field><span *ngIf=\"!row.isNew\" [attr.data-title-element]=\"column.hoverData ? null : 'self'\">\n {{ row[column.field] }}\n </span></ng-template>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span [attr.data-title-element]=\"column.hoverData ? null : 'self'\"> \n \n {{\n setNumericFormat(column, row)\n }}\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- Button column on Grid -->\n <span *ngSwitchCase=\"'add_button'\">\n <div>\n <button *ngIf=\"!row.hidegridbtn\" pButton type=\"button\" \n [icon]=\"row[column.field+'_obj']?.icon ? row[column.field+'_obj']?.icon : column.icon\"\n [name]=\"column.header\" class=\"merge-btn\" [disabled]=\"allowDisabled(column,row)\"\n [label]=\"row[column.field+'_obj']?.displayText ? row[column.field+'_obj']?.displayText : column.value\"\n class=\"grid-component-grid-add-btn\" (click)=\"onClickButton(column, row)\"></button>\n </div>\n </span> \n \n <!-- Generate File Button column on Grid -->\n <span *ngSwitchCase=\"'generate_file_button'\">\n <div>\n <se-generate-import-file\n [label]=\"row[column.field+'_obj']?.displayText ? row[column.field+'_obj']?.displayText : column.value\"\n [icon]=\"row[column.field+'_obj']?.icon ? row[column.field+'_obj']?.icon : column.icon\"\n [dialogData]=\"column.data\"\n [selectedRow]=\"row\"\n ></se-generate-import-file>\n </div>\n </span> \n\n <!-- Date column on Grid -->\n <!-- calendar selector -->\n <span *ngSwitchCase=\"'date'\" \n [attr.data-title-element]=\"column.hoverData? null: editAllRows ? 'input' : 'self' \" \n >\n <p-cellEditor>\n <ng-template pTemplate=\"input\" >\n <p-calendar\n [minDate]=\"column.minDate\" [maxDate]=\"column.maxDate\"\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty ' + column.field + row[dataKey] : column.field + row[dataKey]\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" (onClose)=\"onFocusOutEvent(column, row)\"\n [appendTo]=\"'body'\" hourFormat=\"12\" [defaultDate]=\"defaultDate\"\n [stepMinute]=\"column.minutesInterval ? column.minutesInterval : 1\" [showTime]=\"column.showTime\"\n [timeOnly]=\"column.timeOnly\" [dateFormat]=\"column.format ? column.format.type : calendarFormat\"\n (keyup)=\"calendarInputValue(column, row)\" (onShow)=\"onClickEvent(column, row)\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ? row[column.field+'_obj']?.displayField : row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"\n [showButtonBar]=\"!column.timeOnly\"></p-calendar>\n </ng-template>\n <ng-template pTemplate=\"output\" >\n {{ setConditionBaseValue(row,column) }}\n </ng-template>\n </p-cellEditor>\n </span>\n\n\n <span *ngSwitchDefault>\n <span [ngSwitch]=\"column.type\">\n <!-- Dropdown column on Grid -->\n <span *ngSwitchCase=\"'dropdown'\" [class]=\"dropdownInput ? '' : 'output-dropdown'\"\n [attr.data-title-element]=\" column.hoverData? null: editAllRows ? '.p-dropdown-label' : 'self'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-dropdown *ngIf=\"!row[column.field+'_obj']?.hidden\" [options]=\"\n row[column.field?.toLowerCase()+'_data']\n ? row[column.field?.toLowerCase()+'_data']\n : column.data\n \"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField?.toLowerCase() ? row[row[column.field+'_obj']?.displayField.toLowerCase()] : row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\" [placeholder]=\"row[column.displayField]\n ? row[column.displayField]\n : row[column.field] ? row[column.field] : 'Select'\" [showClear]=\"row[column.field] ? true : false\"\n [optionLabel]=\"column.optionLabel\" (click)=\"onClickEvent(column, row)\"\n [optionValue]=\"column.optionValue\" [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" (blur)=\"onFocusOutEvent(column, row)\"\n (onChange)=\"onChangeEvent(column, row)\" [filter]=\"column.allowSearch\"></p-dropdown>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span *ngIf=\"!row[column.field+'_obj']?.hidden\">\n {{\n setDropdwonReadOnlyValue(row, column)\n }}\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- MultiSelect column on Grid -->\n <!-- [(ngModel)]=\"row[column.field+'_obj']?.displayField?.toLowerCase() ? row[row[column.field+'_obj']?.displayField.toLowerCase()] :\n row[column.field]\" -->\n <span *ngSwitchCase=\"'multi-select'\" [attr.data-title-element]=\"column.hoverData ? null : '.p-multiselect-label'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-multiSelect [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" type=\"text\"\n [(ngModel)]=\"row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"\n [options]=\"column.data\" [optionLabel]=\"column.optionLabel\" [optionValue]=\"column.optionValue\"\n (onChange)=\"onChangeEvent(column, row)\" (onPanelShow)=\"showOption(column, row)\"\n (click)=\"onClickEvent(column, row)\" [appendTo]=\"'body'\" (blur)=\"onFocusOutEvent(column, row)\">\n </p-multiSelect>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span [attr.data-title-element]=\"column.hoverData ? null : 'self'\" >\n {{\n row[column.displayField]\n ? row[column.displayField] :\n setMultiSelectData(column, row[column.field])\n }}\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"'AutoComplete'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-autoComplete \n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" \n [name]=\"column.header\"\n [suggestions]=\"column.data\" \n (onSelect)=\"autoCompleteSelectedValue(row, column, $event)\"\n [field]=\"column.optionLabel ? column.optionLabel?.toLowerCase() : column.displayField ? column.displayField?.toLowerCase() : column.field?.toLowerCase()\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ? row[row[column.field+'_obj']?.displayField.toLowerCase()] :\n typeOf(row[column.field]) === 'object' && row[column.field]?.text ?\n row[column.field]?.text :\n row[column.field]\"\n [dropdown]=\"column.showOption\" \n (ngModelChange)=\"onChangeEvent(column, row)\"\n (click)=\"onClickEvent(column, row)\" \n (completeMethod)=\"autoSearch($event, column, row)\"\n (onBlur)=\"onFocusOutEvent(column, row, $event)\" \n [disabled]=\"allowDisabled(column,row)\" \n [multiple]=\"true\"\n (keydown.enter)=\"onAutoCompleteKeyEnterEvent($event, column, row)\">\n </p-autoComplete>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span *ngIf=\"row[column.field] && row[column.field][0] && row[column.field][0][column.displayField]\">\n <span *ngFor=\"let value of row[column.field]; let i = index\">\n {{ row[column.field] && row[column.field].length > 1 ? row[column.field].length -1 === i ?\n value[column.displayField] : value[column.displayField] + ';' : value[column.displayField] }}\n </span>\n </span>\n <span *ngIf=\"row[column.field] && row[column.field][0] && row[column.field][0][column.field] && !column.displayField\">\n <span *ngFor=\"let value of row[column.field]; let i = index\">\n {{ row[column.field] && row[column.field].length > 1 ? row[column.field].length -1 === i ?\n value[column.field] : value[column.field] + ';' : value[column.field] }}\n </span>\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n <!-- Add Generate Report Button -->\n <span *ngSwitchCase=\"'report'\">\n <p-cellEditor>\n <ng-template pTemplate=\"output\">\n <se-generate-report-btn [repInfo]=\"setReportName(column, row)\" [label]=\"column.label\"\n [params]=\"setReportParams(column, row)\" [class]=\"column.class\" [showDialog]=\"column.showDialog\"\n [icon]=\"column.icon\" [reportType]=\"column.reportType\"></se-generate-report-btn>\n </ng-template>\n <ng-template pTemplate=\"input\">\n <se-generate-report-btn [repInfo]=\"setReportName(column, row)\" [label]=\"column.label\"\n [params]=\"setReportParams(column, row)\" [icon]=\"column.icon\" [class]=\"column.class\"\n [showDialog]=\"column.showDialog\" [reportType]=\"column.reportType\"></se-generate-report-btn>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <span *ngSwitchDefault [attr.data-title-element]=\"column.hoverData ? null : 'input'\">\n <!-- Input column on Grid -->\n <p-cellEditor> \n <ng-template pTemplate=\"input\">\n <span [style]=\"column.style ? column.style : 'display:flex'\">\n <input [type]=\"row[column.field+'_obj']?.textType?row[column.field+'_obj']?.textType:column.textType?column.textType:'text'\" \n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : 'prime-input'\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\n [(ngModel)]=\"row.undefined ? '' : allowDisabled(column,row) && row[column.displayField] ?\n row[column.displayField] : row[column.field+'_obj'] && row[column.field+'_obj'].value ? row[column.field+'_obj'].value : row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"\n (blur)=\"onFocusOutEvent(column, row)\" (change)=\"onChangeEvent(column, row)\"\n (click)=\"onClickButton(column, row)\" *ngIf=\"column.field !== dataKey; else locked_field\" />\n <span style=\"float:right\" *ngIf=\"column.format=='password'\">\n <i [class]=\"row[column.field+'_obj']?(row[column.field+'_obj'].textType=='password'?'pi pi-eye':'pi pi-eye-slash'):column.textType=='password'?'pi pi-eye':'pi pi-eye-slash'\"\n (click)=\"changePasswordType(column, row)\" [title]=\"column.header\"></i>\n </span> \n </span>\n <ng-template #locked_field><span *ngIf=\"!row.isNew\" [attr.data-title-element]=\"column.hoverData ? null : 'self'\">\n {{ row[column.field] }}\n </span></ng-template>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span [style]=\"column.style ? column.style : 'display:flex'\">\n <span (click)=\"onClickEvent(column, row)\" [attr.data-title-element]=\"column.hoverData ? null : 'self' \" \n [class]=\"row[column.field+'_obj']?.textType ?(row[column.field+'_obj']?.textType=='password' ?'password':'') :column.textType=='password'?'password':''\">\n {{ setTextBoxReadOnlyValue(row, column) }} \n </span>\n <span style=\"float:right\" *ngIf=\"column.format=='password'\">\n <i [class]=\"row[column.field+'_obj']?(row[column.field+'_obj'].textType=='password'?'pi pi-eye':'pi pi-eye-slash'):column.textType=='password'?'pi pi-eye':'pi pi-eye-slash'\"\n [title]=\"column.header\" (click)=\"changePasswordType(column, row)\"></i>\n </span>\n </span>\n </ng-template>\n \n </p-cellEditor>\n </span>\n </span>\n </span>\n \n </span>\n </td>\n <!-- Grid Rows Data Bindings End -->\n\n <!-- Action column on Grid -->\n <td *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && columnActions.length > 0\"\n class=\"for-buttons\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">\n <span class=\"action-btn\" *ngFor=\"let action of columnActions\">\n <i [title]=\"action.tooltip\" [class]=\"action.icon\" (click)=\"handleActionClick($event, action, row)\"></i>\n </span>\n </td>\n <td\n *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && useInlineCRUD && (deleteRowPermission || editRowPermission)\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"\n class=\"for-buttons\"\n [ngClass]=\"disabledSaveBtn ? 'hide-clear-filter-button' : ''\">\n <span class='setActionColumnWidth'>\n <se-grid-row-actions [editing]=\"editing\" [editRowPermission]=\"editRowPermission\"\n [deleteRowPermission]=\"deleteRowPermission\" [hideDeleteBtn]=\"hideDeleteBtn\" [hideEditBtn]=\"hideEditBtn\"\n [row]=\"row\" (onRowEditInitBtn)=\"onRowEditInit($event)\" (deleteRecordBtn)=\"deleteRecord($event)\"\n (onRowEditSaveBtn)=\"onRowEditSave($event)\" (onRowEditCancelBtn)=\"onRowEditCancel($event, ri)\"\n [editAllRows]=\"editAllRows\">\n </se-grid-row-actions>\n </span>\n </td>\n </tr>\n </ng-template>\n\n <!-- Footer columns on Grid -->\n <ng-template pTemplate=\"footer\">\n <tr *ngIf=\"aggregateFooter\">\n <td\n *ngIf=\"setActionColumnAsFirst && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></td>\n <td *ngIf=\"allowSelection\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></td>\n <td *ngFor=\"let outerColumn of selectedColumns\" class=\"grid-component-outer-column\" [style]=\"outerColumn.style\">\n <div *ngFor=\"let innerColumn of selectedColumns\">\n <div *ngFor=\"let aggr of innerColumn?.aggregate\">\n <div\n *ngIf=\"aggr.aggrValue?.length && ((!aggr.displayField && innerColumn.field?.toLowerCase() === outerColumn.field?.toLowerCase()) ||\n aggr.displayField && aggr.displayField?.toLowerCase() === outerColumn.field?.toLowerCase())\">\n <div [innerHTML]=\"aggr.aggrValue\">\n </div>\n </div>\n </div> \n </div>\n </td>\n <td\n *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && useInlineCRUD && (deleteRowPermission || editRowPermission)\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"\n [ngClass]=\"disabledSaveBtn ? 'hide-clear-filter-button' : ''\"></td>\n </tr>\n </ng-template>\n\n <!-- Footer for Empty Message columns on Grid -->\n <ng-template pTemplate=\"emptymessage\">\n <tr class=\"grid-component no-records-found\">\n <td [attr.colspan]=\"selectedColumns?.length + 1\">{{totalRecords==0? 'No records found':''}}</td>\n </tr>\n </ng-template>\n </p-table> \n <p-overlayPanel\n [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>", styles: [":host ::ng-deep .table-layout-auto table{table-layout:auto;width:-moz-max-content!important;width:max-content!important}:host ::ng-deep .table-layout-auto .p-datatable-resizable-table>.p-datatable-thead>tr>th{min-width:100px}:host ::ng-deep .prime-input{font-family:Roboto;font-size:12px;color:#484848;background:#ffffff;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:3px;border:none}:host ::ng-deep .prime-input:focus{outline:none;border-color:transparent;box-shadow:0 0 0 2px #0003}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-top:28px;margin-left:18px}:host ::ng-deep .p-multiselect{max-width:100%}:host ::ng-deep .password{-webkit-text-security:disc}:host ::ng-deep .p-calendar .p-inputtext{width:100%}:host ::ng-deep .column-filter-clear-button{display:none}:host ::ng-deep .apply-filter-btn{float:unset!important}:host ::ng-deep .hide-table-filter .pi-filter:before{display:none}:host ::ng-deep .hide-table-filter .p-column-filter-menu-button,:host ::ng-deep .hide-table-filter .p-column-filter-clear-button{display:none!important}:host ::ng-deep .hide-filter-icon .column-filter-menu-button{display:none}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.custom-link{color:#205dcf;font-size:12px}.custom-link:not(.disabled-link){cursor:pointer}.mr-2{margin-right:10px;display:block}.highlighted-row{background-color:#dee2e6!important}.hide-clear-filter-button{display:none!important}:host ::ng-deep .p-datatable-resizable-table>.p-datatable-thead>tr>th{overflow:visible!important}:host ::ng-deep .p-multiselect .p-multiselect-trigger{top:6px}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i7.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i13.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i11.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i13.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i13.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "component", type: i13.CellEditor, selector: "p-cellEditor" }, { kind: "component", type: i13.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i13.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i13.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i13.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i13.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "component", type: i13.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping", "showButtons"] }, { kind: "directive", type: i14.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i15.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove"] }, { kind: "directive", type: i16.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i16.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i16.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i17.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "overlayDirection", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i18.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "directive", type: i19.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i20.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "trueValue", "falseValue"], outputs: ["onChange"] }, { kind: "directive", type: i21.Ripple, selector: "[pRipple]" }, { kind: "directive", type: i22.InputText, selector: "[pInputText]" }, { kind: "component", type: i23.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "itemSize"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "component", type: i24.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "component", type: i25.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i26.OverlayPanel, selector: "p-overlayPanel", inputs: ["dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i27.GridRowActionsComponent, selector: "se-grid-row-actions", inputs: ["editing", "editRowPermission", "deleteRowPermission", "hideDeleteBtn", "hideEditBtn", "editAllRows", "row"], outputs: ["onRowEditInitBtn", "deleteRecordBtn", "onRowEditSaveBtn", "onRowEditCancelBtn"] }, { kind: "directive", type: i28.AddRowDirective, selector: "[pAddRow]", inputs: ["table", "newRow", "id"] }, { kind: "directive", type: i29.ObserveCheckboxDirective, selector: "[observeCheckbox]" }, { kind: "component", type: i30.GenerateReportBtnComponent, selector: "se-generate-report-btn", inputs: ["repInfo", "mappedFields", "label", "icon", "params", "class", "reportHeader", "reportFooter", "reportType", "showDialog", "form"] }, { kind: "component", type: i31.GenerateFileComponent, selector: "se-generate-import-file", inputs: ["label", "icon", "showDialog", "dialogData", "selectedRow"] }] }); }
|
|
3128
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: GridComponent, selector: "se-grid", inputs: { activeTestMode: "activeTestMode", selectedRows: "selectedRows", setGridRefreshTime: "setGridRefreshTime", addDataKeyValue: "addDataKeyValue", stopDialogClose: "stopDialogClose", showRefreshBtn: "showRefreshBtn", hideRefreshBtn: "hideRefreshBtn", horizontalScroll: "horizontalScroll", hideDeleteBtn: "hideDeleteBtn", hideEditBtn: "hideEditBtn", hideAddBtn: "hideAddBtn", loading: "loading", autoLoadData: "autoLoadData", rowStyle: "rowStyle", allowSelection: "allowSelection", selectionColumnWidth: "selectionColumnWidth", allowSelectionHeader: "allowSelectionHeader", hideGridSaveButton: "hideGridSaveButton", hideGridCancelButton: "hideGridCancelButton", allowExportToPdf: "allowExportToPdf", allowExportToExcel: "allowExportToExcel", setActionColumnAsFirst: "setActionColumnAsFirst", useInlineCRUD: "useInlineCRUD", rowActions: "rowActions", selectionType: "selectionType", dataKey: "dataKey", clearGridFilter: "clearGridFilter", searchGridFilter: "searchGridFilter", scrollable: "scrollable", scrollHeight: "scrollHeight", tableStyle: "tableStyle", wordWrap: "wordWrap", newGridRow: "newGridRow", filtering: "filtering", reportButtons: "reportButtons", rowHover: "rowHover", hideFilterOptions: "hideFilterOptions", setPaginationLength: "setPaginationLength", rows: "rows", globalFilterData: "globalFilterData", columns: "columns", permissions: "permissions", allowColumnToggle: "allowColumnToggle", hideFilter: "hideFilter", lookupFilters: "lookupFilters", pagination: "pagination", showCurrentPageReport: "showCurrentPageReport", totalRecords: "totalRecords", aggregatedResult: "aggregatedResult", showconfirmDialog: "showconfirmDialog", saveAllData: "saveAllData", defaultRows: "defaultRows", columnActions: "columnActions", useServerSideEvents: "useServerSideEvents", allowCaching: "allowCaching", allowPersistence: "allowPersistence", softCaching: "softCaching", editAllRows: "editAllRows", gridName: "gridName", autoResize: "autoResize", allowTextCopy: "allowTextCopy" }, outputs: { inlineRowCancel: "inlineRowCancel", rowsChange: "rowsChange", onRowClick: "onRowClick", onCheckBoxFilterClick: "onCheckBoxFilterClick", onRowCheckBox: "onRowCheckBox", onSortChange: "onSortChange", onFilterChange: "onFilterChange", onMultiSelectionChange: "onMultiSelectionChange", onApplyFilter: "onApplyFilter", isIncludedAllColumns: "isIncludedAllColumns", onServerSideEventChange: "onServerSideEventChange", onPageChange: "onPageChange", onRowUpdate: "onRowUpdate", onCancelAllRows: "onCancelAllRows", onRowDelete: "onRowDelete", onRowAdd: "onRowAdd", onGridRowActions: "onGridRowActions", onGridRowEdit: "onGridRowEdit", onGridRowAdd: "onGridRowAdd" }, host: { listeners: { "copy": "handleCopyOrCut($event)", "cut": "handleCopyOrCut($event)", "click": "onClick($event.target)", "window:beforeunload": "beforeunloadHandler($event)" } }, viewQueries: [{ propertyName: "panelOverlayViewContainer", first: true, predicate: ["viewContainerRef"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "table", first: true, predicate: ["dt"], descendants: true }, { propertyName: "gridRow", predicate: ["gridRow"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"grid-component-wrapper\">\n<p-confirmDialog [style]=\"{ width: '50vw' }\" *ngIf=\"useInlineCRUD\" key=\"handleInlineCRUD\"></p-confirmDialog>\n<p-confirmDialog class=\"grid-component-confirm-dialog\" *ngIf=\"columnActions.length > 0\"\n key=\"handlecolumnActions\"></p-confirmDialog>\n<div class=\"global-filter-buttons-wrapper\">\n\n <!-- button for apply value on Grid -->\n <button *ngIf=\"((filtering && !hideFilter ) || showFilterbtn)\" pButton type=\"button\" icon=\"pi pi-search\" (click)=\"applyGridFilterBtn()\"\n [class]=\"\n searchGridFilter ? 'p-button-success apply-filter-btn filter-btn' : 'hide-clear-filter-button apply-filter-btn filter-btn'\n \"></button>\n\n <!-- button for clear value on Grid -->\n <button *ngIf=\"((filtering && !hideFilter )|| showFilterbtn)\" pButton id=\"clearGridFilterValuesButton\" type=\"button\"\n icon=\"pi pi-replay\" (click)=\"cleargridFiltersValue()\" [class]=\"\n clearGridFilter ? 'filter-btn' : 'hide-clear-filter-button filter-btn'\n \" class='global-refresh global-btn'\n ></button>\n\n <!-- button for save all grid at once -->\n <button pButton *ngIf=\"editAllRows && editRowPermission\" id=\"saveAllGridValues\"\n icon=\"pi pi-check\" [label]=\"'Save'\"\n [class]=\"hideGridSaveButton ? 'hide-clear-filter-button save-all-grid' : 'ui-button-info save-all-grid'\" type=\"button\"\n (click)=\"saveAllRowsAtOnce()\"></button>\n\n <!-- button for cancel all grid at once -->\n <button pButton *ngIf=\"editAllRows && !hideGridCancelButton\" id=\"editBtnGlobalvalues\" type=\"button\" [label]=\"'Cancel'\"\n icon=\"pi pi-times\" class=\"ui-button-info\" (click)=\"cancelAllRowsAtOnce()\"></button>\n\n <!-- header Button for multiSelect on Grid -->\n <span *ngIf=\"allowColumnToggle\" observeCheckbox>\n <p-multiSelect [showToggleAll]=\"false\" optionDisabled=\"false\" [options]=\"selectedToggleColumns\" [(ngModel)]=\"selectedColumns\" optionLabel=\"header\"\n selectedItemsLabel=\"{0} columns selected\" class=\"grid-component-multiselect-header-button\" placeholder=\"Choose Columns\">\n </p-multiSelect>\n </span>\n\n <!-- header Button for Adding new Row on Grid -->\n <button pButton *ngIf=\"useInlineCRUD && addRowPermission && !hideAddBtn\" type=\"button\" [label]=\"'Add'\" pAddRow\n [table]=\"componentTableRef\" [newRow]=\"newGridRow\" [id]=\"dataKey\" pTooltip=\"Add New Row\" tooltipPosition=\"bottom\"\n icon=\"pi pi-plus\" [class]=\"'ui-button-info global-add-btn'+gridName\" (click)=\"addNewRow(newGridRow, true)\" pRipple></button>\n\n \n <!-- header Button for Excel File on Grid -->\n <button *ngIf=\"allowExportToExcel\" type=\"button\" pButton icon=\"pi pi-file-excel\" (click)=\"exportExcel()\"\n class=\"p-button-success\" pTooltip=\"Export to Excel\" tooltipPosition=\"bottom\" pRipple></button>\n\n<!-- header Button for PDF File on Grid -->\n<button *ngIf=\"allowExportToPdf\" type=\"button\" pButton icon=\"pi pi-file-pdf\" (click)=\"exportPdf()\"\n class=\"p-button-warning mr-2 ml-2\" pTooltip=\"Export to Pdf\" tooltipPosition=\"bottom\" pRipple></button>\n\n <!-- <div *ngFor=\"let reportButton of reportButtons\" class=\"ui-button-info mr-2 ml-2\">\n <se-generate-report-btn *ngIf =\"!reportButton.hidden\"[repId]=\"reportButton.reportId\" [label]=\"reportButton.label\" [params]=\"reportButton.params\"\n [showDialog]=\"reportButton.showDialog\"></se-generate-report-btn>\n </div> -->\n\n <ng-content></ng-content>\n\n <ng-container *ngFor=\"let reportButton of reportButtons\">\n <se-generate-report-btn *ngIf =\"!reportButton.hidden\"[repInfo]=\"reportButton\" [label]=\"reportButton.label\" [params]=\"reportButton.params\" [icon]=\"reportButton.icon\" [class]=\"reportButton.class\"\n [showDialog]=\"reportButton.showDialog\" [reportType]=\" reportButton.reportType\" [reportHeader]=\"reportButton.reportHeader\" [reportFooter]=\"reportButton.reportFooter\"></se-generate-report-btn>\n </ng-container>\n\n</div>\n\n <p-table *ngIf=\"!isGridHidden\" id=\"my-table\" [value]=\"rowsData\" [columns]=\"selectedColumns\" sortMode=\"multiple\"\n [lazy]=\"useServerSideEvents\" [paginator]=\"pagination\" [alwaysShowPaginator]=\"pagination && totalRecords > 0\" \n [class]=\"' grid-component-main-table ' + (pagination || !rowsData.length ? ' pagination ' : '') + (tableStyle.includes('width') ? ' hasTableWidthStyle ' : '') + (autoResize ? '' : 'table-layout-auto') \"\n (onColResize)=\"onColumnResize($event,dt)\" [resizableColumns]=\"true\"\n responsiveLayout=\"scroll\" columnResizeMode=\"expand\"\n [rows]=\"defaultRows\" [totalRecords]=\"totalRecords\" [rowsPerPageOptions]=\"setPaginationLength\"\n [showCurrentPageReport]=\"showCurrentPageReport\" currentPageReportTemplate=\"Showing {first} to {last} of {{\n totalRecords\n }} entries\" [loading]=\"!setGridRefreshTime ? loading : false\"\n (onSort)=\"sortDisabled ?? handleSortChange($event)\" (onFilter)=\"handleFilterChange($event)\"\n (onLazyLoad)=\"autoLoadData ? handleServerSideEvents($event, dt) : ''\" (onPage)=\"gridService.columnFocusedOut ? showConfirmation($event) : handleServerSidePagination($event)\" #dt\n [dataKey]=\"dataKey\" [(selection)]=\"selectedRows\" selectionMode=\"multiple\" [scrollable]=\"scrollable\" \n [tableStyle]=\"tableStyle\"\n [scrollHeight]=\"scrollHeight\"\n editMode=\"row\" [editingRowKeys]=\"editingRowKeys\" [rowHover]=\"rowHover\"\n [ngClass]=\"setClassaAndId(dt)\">\n\n <div *ngIf=\"rowActions.length > 0 && rowActions.length > 0\" class=\"flex justify-content-end\">\n <span *ngFor=\"let rowAction of rowActions\">\n <button pButton type=\"button\" [label]=\"rowAction.title\" [class]=\"rowAction.class\"\n (click)=\"rowAction.onClick(selectedRows)\"></button>\n </span>\n </div>\n\n <!-- header columns on Grid -->\n <ng-template pTemplate=\"header\" let-cols>\n <tr>\n <th pResizableColumn *ngIf=\"allowSelection && selectionType === 'multiple'\" class=\"grid-component-selection\" id=\"{{allowSelectionHeader}}\">\n <span class=\"th-content-wrapper\">\n <div class=\"grid-component-table-header-inner-div-2\n table-header-inner-div div-last-inner-html-is-icon\">\n <span class=\"flex-grow-1\"> {{allowSelectionHeader}} </span>\n <p-tableHeaderCheckbox *ngIf=\"selectionType === 'multiple'\" binary=\"true\"\n (click)=\"multiCheckBoxOnclick(rowsData, $event)\"></p-tableHeaderCheckbox>\n </div>\n </span>\n </th>\n <th pResizableColumn *ngIf=\"allowSelection && selectionType === 'single'\" id=\"Select\"\n data-title-element=\"self\" class=\"grid-component-selection\">\n Select\n </th>\n <th pResizableColumn id=\"Actions\"\n *ngIf=\"setActionColumnAsFirst && !disabledSaveBtn && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn' \" data-title-element=\"self\" >\n Actions\n </th>\n <th pResizableColumn *ngFor=\"let column of cols\" [style.width]=\"column?.columnWidth ? column?.columnWidth+'px' : column?.customWidth+'px'\" id=\"{{column.header}}\" [pSortableColumn]=\"column.field\"\n [class]=\"column.type === 'boolean' ? 'checkbox-th' : ''\"\n [pSortableColumnDisabled]=\"sortDisabled && useServerSideEvents ? true : column.sorting === false\"\n class=\"column?.type === 'multiple' ? 'grid-component-select-th-column-type-multiple' : ''\">\n <span class=\"th-content-wrapper\">\n <div class=\"grid-component-table-header-inner-div-1 table-header-inner-div div-last-inner-html-is-icon\"> \n <span [attr.data-title-element]=\"'self'\" [class]=\"'flex-grow-1'\" >{{ column.header }}\n <span *ngIf=\"column.isRequired\" class=\"grid-component required-star\">*</span>\n </span>\n <p-sortIcon *ngIf=\"column.sorting !== false && column?.type !== 'multiple'\"\n [field]=\"column.field\"></p-sortIcon>\n </div>\n </span>\n </th>\n <th pResizableColumn id=\"Actions\"\n *ngIf=\"!setActionColumnAsFirst && !disabledSaveBtn && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\" data-title-element=\"self\" >Actions</th>\n </tr>\n <tr *ngIf=\"filtering && !hideFilter\">\n <th pResizableColumn *ngIf=\"allowSelection\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></th>\n <th pResizableColumn *ngIf=\"setActionColumnAsFirst && !disabledSaveBtn && useInlineCRUD\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">\n </th>\n <th pResizableColumn *ngFor=\"let column of cols\" [style.width]=\"column?.columnWidth ? column?.columnWidth+'px' : column?.customWidth+'px'\" id=\"{{column.header}}\" [ngSwitch]=\"column?.filter?.type\" \n [class]=\"hideFilterOptions ? 'hide-table-filter temp' : 'temp'\">\n <span *ngIf=\"column.filtering !== false\" [class]=\"column.filter?.showFilter ? '' : 'hide-filter-icon'\">\n <!-- Text input on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [type]=\"'text'\" [field]=\"column.field\" *ngSwitchCase=\"'input'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <input type=\"text\" [(ngModel)]=\"column.filterValue\" [class]=\"column?.field?.toLowerCase()\" (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n (blur)=\"setFilterFocusOut(column, filter, $event)\"\n (keyup)=\"removingFilters($event, column);backspaceEvent($event, column)\" pInputText />\n </ng-template>\n </p-columnFilter>\n\n <!-- Numeric input on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [type]=\"'numeric'\" [field]=\"column.field\" *ngSwitchCase=\"'numeric_input'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-inputNumber [(ngModel)]=\"column.filterValue\" [class]=\"column?.field?.toLowerCase()\" (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n (onBlur)=\"setFilterFocusOut(column, filter, $event)\"\n (keyup)=\"removingFilters($event, column);backspaceEvent($event, column)\"></p-inputNumber>\n </ng-template>\n </p-columnFilter>\n\n <!-- lookup input on Header For Filter-->\n <p-columnFilter\n class=\"no-filter-icon\"\n [type]=\"'text'\"\n [field]=\"column.field\"\n *ngSwitchCase=\"'lookup_input'\"\n >\n <ng-template\n pTemplate=\"filter\"\n let-value\n let-filter=\"filterCallback\"\n >\n <div class=\"close-icon-wrapper grid-component lookup-filter-wrapper\">\n <div class=\"lookup-filter-input-wrapper\"> \n <input\n [id]=\"column.field?.toLowerCase() + '_filter'\"\n class=\"grid-component lookup-filter\"\n autocomplete=\"off\"\n type=\"text\"\n [(ngModel)]=\"column.filterValue\"\n (click)=\"setFilterLookup(column)\"\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n (blur)=\"setFilterFocusOut(column, filter, $event)\"\n (keyup)=\"removingFilters($event, column);backspaceEvent($event, column)\"\n pInputText\n />\n </div> \n <div class=\"direct-wrapper-close-icon-lookup\">\n <button\n *ngIf=\"column.filterValue\"\n icon=\"pi pi-times\"\n pButton\n type=\"button\"\n (click)=\"lookupClearValue(column)\">\n </button>\n </div>\n </div>\n </ng-template>\n </p-columnFilter>\n\n <!-- checkbox on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" type=\"boolean\" [field]=\"column.field\" *ngSwitchCase=\"'checkbox'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-checkbox [binary]=\"true\" [disabled]=\"column.disabled\" [(ngModel)]=\"column.filterValue\"\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n (onChange)=\"setFilterFocusOut(column, filter, $event)\" (click)=\"clickCheckBoxFilter(column)\"\n (keydown)=\"backspaceEvent($event, column)\">\n </p-checkbox>\n </ng-template>\n </p-columnFilter>\n\n <!-- multiSelect on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [field]=\"column.field\" matchMode=\"in\" [showMenu]=\"false\" *ngSwitchCase=\"'multi-select'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-multiSelect [(ngModel)]=\"column.filterValue\" [options]=\"column.filter.data || []\" \n [appendTo]=\"'body'\" [name]=\"column.field\"\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n [optionValue]=\"column.optionValue\"\n [optionLabel]=\"column.optionLabel\"\n (onChange)=\"setFilterFocusOut(column, filter, $event)\" \n (keydown)=\"backspaceEvent($event, column)\">\n \n </p-multiSelect>\n </ng-template>\n </p-columnFilter>\n\n <!-- dropdown on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [field]=\"column.field\" matchMode=\"in\" [showMenu]=\"false\" *ngSwitchCase=\"'dropdown'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-dropdown [showClear]=\"true\" [placeholder]=\"'Select'\" [filter]=\"column.allowSearch\"\n [(ngModel)]=\"column.filterValue\" (keyup.enter)=\"applyDropdownFilter(filter, $event)\"\n [options]=\"column.filter.data || []\"\n (onChange)=\"searchDropdownFilter(filter, $event, column)\"></p-dropdown>\n </ng-template>\n </p-columnFilter>\n\n <!-- calendar on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [field]=\"column.field\" matchMode=\"in\" [showMenu]=\"false\" *ngSwitchCase=\"'calendar'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-calendar [placeholder]=\"'Select-Date'\" [(ngModel)]=\"column.filterValue\"\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\" appendTo=\"body\" (onSelect)=\"selectDate(column)\"\n [inputId]=\"column.field\" hourFormat=\"12\" (keyup.backspace)=\"removeNullCalendar(column, filter, $event)\"\n [showButtonBar]=\"true\" (onClose)=\"setFilterFocusOut(column, filter, $event)\"\n (keydown)=\"backspaceEvent($event, column)\" (onClearClick)=\"backspaceEvent($event, column)\">\n </p-calendar>\n </ng-template>\n </p-columnFilter>\n\n <!-- Default Filter For Header -->\n <p-columnFilter class=\"no-filter-icon\" [type]=\"\n column.type && column.type !== 'link' ? column.type : 'text'\n \" [field]=\"column.field\" display=\"menu\" *ngSwitchDefault>\n </p-columnFilter>\n </span>\n </th>\n <th pResizableColumn\n *ngIf=\"!setActionColumnAsFirst && !disabledSaveBtn && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></th>\n </tr>\n </ng-template>\n\n <!-- Body columns on Grid -->\n <ng-template pTemplate=\"body\" let-row let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr \n [style]=\"rowStyle\"\n [ngClass]=\"row?.highlightrow ? 'highlighted-row' : ''\"\n [class]=\"wordWrap ? 'p-selectable-row wordWrapTrue' : 'wordWrapFalse p-selectable-row'\" (click)=\"selectedRowRecord = row\"\n [pEditableRow]=\"row\" #gridRow [id]=\"row[dataKey]\">\n <td *ngIf=\"allowSelection\" class=\"grid-component-selection\">\n <p-tableRadioButton [value]=\"row\" *ngIf=\"selectionType === 'single'\"\n (click)=\"multiCheckBoxOnclick(row , $event, true)\"></p-tableRadioButton>\n <p-tableCheckbox [value]=\"row\" *ngIf=\"selectionType === 'multiple'\"\n (click)=\"multiCheckBoxOnclick(row, $event)\"></p-tableCheckbox>\n </td>\n\n <!-- first actions column -->\n <td *ngIf=\"setActionColumnAsFirst && columnActions.length > 0\">\n <span class=\"action-btn\" *ngFor=\"let action of columnActions\">\n <i [title]=\"action.tooltip\" [class]=\"action.icon\" (click)=\"handleActionClick($event, action, row)\"></i>\n </span>\n </td>\n <td *ngIf=\"setActionColumnAsFirst && useInlineCRUD && (deleteRowPermission || editRowPermission)\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"\n [ngClass]=\"disabledSaveBtn ? 'hide-clear-filter-button' : ''\">\n <span class=\"setActionColumnWidth\">\n <se-grid-row-actions [editing]=\"editing\" [editRowPermission]=\"editRowPermission\"\n [deleteRowPermission]=\"deleteRowPermission\" [hideDeleteBtn]=\"hideDeleteBtn\" [hideEditBtn]=\"hideEditBtn\"\n [row]=\"row\" (onRowEditInitBtn)=\"onRowEditInit($event)\" (deleteRecordBtn)=\"deleteRecord($event)\"\n (onRowEditSaveBtn)=\"onRowEditSave($event)\" (onRowEditCancelBtn)=\"onRowEditCancel($event, ri)\"\n [editAllRows]=\"editAllRows\">\n </se-grid-row-actions>\n </span>\n </td>\n\n <!-- Grid Rows Data Bindings Start -->\n <td *ngFor=\"let column of selectedColumns\" [ngSwitch]=\"column.type\" [style]=\"column.style \" \n (mouseenter)=\"(column.hoverData && column.hoverData.component) && addDynamicPanelOverlayComponent(column.hoverData, overlayPanel, $event, row)\"\n (mouseleave)=\"(column.hoverData && column.hoverData.component) && mouseLeaveEvent(overlayPanel)\"\n >\n <span class=\"td-content-wrapper\" [style]=\"column.style\">\n\n <!-- Boolean column on Grid -->\n <span *ngSwitchCase=\"'boolean'\"\n >\n <td *ngIf=\"!editing && row[column.field + '_obj']?.show != false\">\n <p-checkbox \n [disabled]=\"!column.allowEdit ?? true\" [binary]=\"true\" (click)=\"onClickEvent(column, row)\"\n (ngModelChange)=\"checkBoxChangeEvent($event, column, row)\" (blur)=\"onFocusOutEvent(column, row)\" \n [(ngModel)]=\" \n row[column.field] &&\n (row[column.field].toString() === '1' ||\n row[column.field].toString().toLowerCase() === 'true' ||\n row[column.field].toString().toLowerCase() === 'y'||\n ( row[column.field].text && (row[column.field]?.text?.toString() === '1' ||\n row[column.field]?.text?.toString()?.toLowerCase() === 'true' ||\n row[column.field]?.text?.toString()?.toLowerCase() === 'y')))\n ? Checked\n : unChecked\n \">\n </p-checkbox>\n </td>\n <td *ngIf=\"editing\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <!-- for edit checkBox -->\n <p-checkbox (click)=\"onClickEvent(column, row)\" (ngModelChange)=\"checkBoxChangeEvent($event, column, row)\"\n [disabled]=\"allowDisabled(column,row)\" [binary]=\"true\" [(ngModel)]=\"\n row[column.field] && \n (row[column.field].toString() === '1' ||\n row[column.field].toString().toLowerCase() === 'true' ||\n row[column.field].toString().toLowerCase() === 'y' ||\n ( row[column.field].text && (row[column.field]?.text?.toString() === '1' ||\n row[column.field]?.text?.toString()?.toLowerCase() === 'true' ||\n row[column.field]?.text?.toString()?.toLowerCase() === 'y')))\n ? editModeChecked\n : editModeunCkecked\n \" (blur)=\"onFocusOutEvent(column, row)\"></p-checkbox>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ row[column.field] }}\n </ng-template>\n </p-cellEditor>\n </td>\n </span>\n\n <!-- link column on Grid -->\n <span [attr.data-title-element]=\"column.hoverData ? null : 'a,input'\" *ngSwitchCase=\"'link'\">\n <!-- link column for HyperLink Case -->\n <span *ngIf=\"column.allowSave === false\">\n <span *ngIf=\"column.target !== '_self'\" [style]=\"column.style\"\n [attr.data-title-element]=\"column.hoverData ? null : 'a'\"\n class=\"custom-link\"\n [class]=\"allowDisabled(column,row) ? 'disabled-link' : ''\">\n\n <a class=\"d-inline\" [href]=\"column.disabled?'':row[column.field + '_obj']?.hyperlink\" target=\"_blank\">\n <i *ngIf=\"column.icon &&!row[column.field+'_obj']?.hideFieldValue; else noIcon\" [class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n <span (click)=\"column?.onClick ? onClickEvent(column, row) : ''\">\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </span>\n </ng-template>\n </a>\n \n </span>\n <span *ngIf=\"column.target === '_self'\" [style]=\"column.style\"\n [attr.data-title-element]=\"column.hoverData ? null : 'a'\" class=\"custom-link\"\n [class]=\" allowDisabled(column,row) ? 'disabled-link' : ''\">\n\n <a class=\"d-inline\" [href]=\"column.disabled?'':row[column.field + '_obj']?.hyperlink\" [target]='column.target'>\n <i *ngIf=\"column.icon &&!row[column.field+'_obj']?.hideFieldValue; else noIcon\" [class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n <span (click)=\"column?.onClick ? onClickEvent(column, row) : ''\">\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </span>\n </ng-template>\n </a>\n\n </span>\n </span>\n <!-- link column for Edit Case -->\n <span *ngIf=\"column.allowSave || column.allowSave === undefined\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <span\n *ngIf=\"(column.editable === true ) && (column.editLink === true )\">\n <input *ngIf=\"!row.isNew\" pInputText (click)=\"column?.onClick ? onClickEvent(column, row) : ''\" type=\"text\"\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"row[column.field + '_obj']?.hideFieldValue ? '' : row[column.field + '_obj']?.displayText ? row[column.field + '_obj']?.displayText : column.displayText ? column.displayText : row[column.field]\"\n (blur)=\"onFocusOutEvent(column, row)\"\n (change)=\"onChangeEvent(column, row)\" />\n <input pInputText *ngIf=\"row.isNew\" type=\"text\" (click)=\"column?.onClick ? onClickEvent(column, row) : ''\"\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ? row[column.field+'_obj']?.displayField : row[column.field]\"\n (blur)=\"onFocusOutEvent(column, row)\"\n (change)=\"onChangeEvent(column, row)\" />\n </span>\n <!-- <span *ngIf=\"column.editable === false|| column.editable === undefined\" >\n <a class=\"custom-link\" (click)=\"onClickEvent(column, row)\" [href]=\"row[column.field + '_obj']?.hyperlink\" [target]='column.target'\n [class]=\"allowDisabled(column,row) ? 'disabled-link' : ''\">\n <i *ngIf=\"column.icon && !row[column.field+'_obj']?.hideFieldValue; else noIcon\"[class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </ng-template>\n \n </a>\n </span> -->\n <span *ngIf=\"(column.editLink === false|| column.editLink === undefined)&&(column.editable === false|| column.editable === undefined)\">\n <a class=\"d-inline\" [href]=\"row[column.field + '_obj']?.hyperlink\" [target]=\"column.target ? column.target : '_blank'\"\n [class]=\"column.editable === false ? '' : allowDisabled(column,row) ? 'disabled-link' : ''\">\n <i *ngIf=\"column.icon && !row[column.field+'_obj']?.hideFieldValue; else noIcon\"[class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n <span (click)=\"column?.onClick ? onClickEvent(column, row) : ''\">\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </span> \n </ng-template>\n \n </a>\n </span>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span [style]=\"column.style\" class=\"custom-link\" [class]=\"column.editable === false || allowDisabled(column,row) ? 'disabled-link' : ''\">\n <a class=\"d-inline\" [href]=\"column.disabled?'':row[column.field + '_obj']?.hyperlink\" [target]=\"column.target ? column.target : '_blank'\"\n >\n <i *ngIf=\"column.icon&& !row[column.field+'_obj']?.hideFieldValue; else noIcon\" [title]=\"column.header\" [class]=\"column.icon\"></i>\n <ng-template #noIcon>\n <span (click)=\"column?.onClick ? onClickEvent(column, row) : ''\">\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </span>\n </ng-template>\n </a>\n\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n </span>\n\n <!-- Iframe column on Grid -->\n <span *ngSwitchCase=\"'iframe'\">\n <span class=\"custom-link\" (click)=\"gridIFrame(column, row[column.field + '_obj']?.hyperlink, row)\" [title]=\"\n row[column.field + '_obj'] &&\n (row[column.field + '_obj'].displayText === null || row[column.field + '_obj'].displayText === '')\n ? row[column.field] : row[column.field + '_obj']?.displayText\n ? row[column.field + '_obj'].displayText\n : column.displayText\n ? column.displayText\n : row[column.field]\n\n \"\n > \n <i *ngIf=\"column.icon; else noIcon\"[class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n {{\n row[column.field + '_obj'] &&\n (row[column.field + '_obj'].displayText === null || row[column.field + '_obj'].displayText === '')\n ? row[column.field] : row[column.field + '_obj']?.displayText\n ? row[column.field + '_obj'].displayText\n : column.displayText ? column.displayText : row[column.field]\n }}\n </ng-template>\n </span>\n </span>\n\n <!-- dialog column on Grid -->\n <span *ngSwitchCase=\"'dialog'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <span\n *ngIf=\"column?.filter?.type !== 'calendar' && !row?.hidegridbtn\" \n \n >\n <span *ngIf=\"column.editable === true && !row[column.field+'_obj']?.hideFieldValue\">\n <input [attr.data-title-element]=\"column.hoverData ? null : 'self'\"\n readonly\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\n type=\"text\"\n pInputText\n (click)=\"selectLookupField(column, row)\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ?\n row[row[column.field+'_obj']?.displayField?.toLowerCase()] : \n row[column.field]\"\n [name]=\"row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"\n (blur)=\"onFocusOutEvent(column, row)\"\n />\n \n </span>\n <span [attr.data-title-element]=\"column.hoverData ? null : 'self'\"\n *ngIf=\"column.editable === false || column.editable === undefined\n \" class=\"custom-link\" [style]=\"column.style\"\n [class]=\"\n allowDisabled(column,row) ? 'disabled-link' : ''\n \" (click)=\"openGridDialog(column, row, $event)\">\n <i *ngIf=\"(column.icon || row[column.field+'_obj']?.icon) && !row[column.field+'_obj']?.hideFieldValue ; else noIcon\"\n [class]=\"row[column.field+'_obj']?.icon ? row[column.field+'_obj']?.icon : column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>{{ (!column.displayText && row.isNew ) || row[column.field+'_obj']?.hideFieldValue ? '' : setConditionBaseValue(row, column)\n }}</ng-template>\n </span>\n </span>\n <span *ngIf=\"column?.filter?.type === 'calendar' && column.editable === true\" [attr.data-title-element]=\"column.hoverData ? null : 'input'\">\n <p-calendar [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" (onClose)=\"onFocusOutEvent(column, row)\"\n [minDate]=\"column.minDate\" [maxDate]=\"column.maxDate\"\n [appendTo]=\"'body'\" hourFormat=\"12\" [showTime]=\"column.showTime\" (click)=\"onClickEvent(column, row)\"\n [timeOnly]=\"column.timeOnly\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ?\n row[row[column.field+'_obj']?.displayField.toLowerCase()] : row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"></p-calendar>\n </span>\n <span *ngIf=\"column?.filter?.type === 'calendar' && !column.editable\" class=\"custom-link\"\n [class]=\"row.disabled || allowDisabled(column,row) ? 'disabled-link' : ''\"\n (click)=\"openGridDialog(column, row, $event)\"\n >{{ row[column.field+'_obj']?.hideFieldValue ? '' : setConditionBaseValue(row, column) }}\n </span>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span class=\"custom-link\" [style]=\"column.style\"\n [class]=\"row.disabled || allowDisabled(column,row) ? 'disabled-link' : ''\"\n (click)=\"openGridDialog(column, row, $event)\"\n [attr.data-title-element]=\"column.hoverData ? null : 'self'\">\n <i *ngIf=\"(column.icon || row[column.field+'_obj']?.icon) && !row[column.field+'_obj']?.hideFieldValue ; else noIcon\"[title]=\"column.header\" [class]=\"row[column.field+'_obj']?.icon ? row[column.field+'_obj']?.icon : column.icon\"></i>\n <ng-template #noIcon>{{ row[column.field+'_obj']?.hideFieldValue ? '' : setConditionBaseValue(row, column) }}</ng-template>\n <!-- {{ setConditionBaseValue(row, column) }}\n *ngIf=\"!row[column.field + '_secondType'] && !row.hidegridbtn\" -->\n\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- test -->\n <!-- lookup Input column on Grid -->\n <span *ngSwitchCase=\"'lookup_input'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <div class=\"close-icon-wrapper\">\n <input [attr.data-title-element]=\"column.hoverData ? null : 'self'\" readonly type=\"text\"\n [(ngModel)]=\"row?.isNew || row?.isnew ? typeOf(row[column.field]) === 'object' ? row[column.field]?.text : row[column.field] : row[column.field+'_obj']?.displayField ? row[row[column.field+'_obj']?.displayField?.toLowerCase()] :\n typeOf(row[column.field+'_obj']?.text) === 'object' && row[column.field+'_obj']?.text?.hasOwnProperty('text') ? row[column.field+'_obj']?.text?.text : \n column.displayField ? row[column.displayField?.toLowerCase()] : row[column.field]\n \"\n (keyup.tab)=\"selectLookupField(column, row)\" [disabled]=\"allowDisabled(column,row)\"\n (click)=\"selectLookupField(column, row)\" [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : 'prime-input'\" (blur)=\"onFocusOutEvent(column, row)\" />\n <div *ngIf=\"!allowDisabled(column,row)\"><button *ngIf=\"row[column.field] && typeOf(row[column.field]) === 'object'\n ? row[column.field].text\n : row[column.field] && !column.disabled\" icon=\"pi pi-times\" pButton type=\"button\"\n (click)=\"lookupClearValue(column,row)\"></button></div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"output\" >\n <span *ngIf=\"column.linkId\" >\n <a [attr.data-title-element]=\"column.hoverData ? null : 'self'\" [href]=\"row[column.field + '_obj']?.hyperlink\" [target]=\"column.target === '_self' ? '' : '_blank'\">\n {{\n setLookupReadOnlyValue(row, column)\n }}\n </a>\n </span>\n <span [attr.data-title-element]=\"column.hoverData ? null : 'self'\" *ngIf=\"!column.linkId\" [style]=\"column.style\" [class]=\"column.component && column.editLink === true ? 'custom-link' : ''\"\n (click)=\"openLookupHyperlink(column, row)\" >\n {{\n setLookupReadOnlyValue(row, column)\n }}\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- Numeric Input column on Grid -->\n <span *ngSwitchCase=\"'numeric'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <!-- for Currency && Decimal && Percent -->\n <span [attr.data-title-element]=\"column.hoverData ? null : 'input'\" class=\"input-number\">\n <p-inputNumber [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" [class]=\"\n row[column.field.toLowerCase()+'_obj']?.errorMessage\n ? 'ng-invalid ng-dirty'\n : 'form-control'\n \" [showButtons]=\"false\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ? row[row[column.field+'_obj']?.displayField?.toLowerCase()] : row[column.field]\" [name]=\"column.field\"\n [disabled]=\"allowDisabled(column,row)\" (onFocus)=\"onFocusEvent(column, row)\"\n (onBlur)=\"onFocusOutEvent(column, row)\" [mode]=\"\n column.format &&\n column.format.type === 'currency'\n ? 'currency'\n : 'decimal'\n \" [currency]=\"\n column.format &&\n column.format.type === 'currency' &&\n column.format.formatParams &&\n column.format.formatParams.currency\n ? column.format.formatParams.currency\n : 'USD'\n \" [locale]=\"\n column.format &&\n column.format.type === 'currency' &&\n column.format.formatParams &&\n column.format.formatParams.locale\n ? column.format.formatParams.locale\n : 'en-US'\n \" [minFractionDigits]=\"column.format ? setNumericMinMxFraction(column) : '0'\"\n [maxFractionDigits]=\"column.format ? setNumericMinMxFraction(column) : '0'\" [suffix]=\"\n column.format &&\n column.format.type === 'percent' && \n '%'\n \n \">\n </p-inputNumber>\n </span>\n <ng-template #locked_field><span *ngIf=\"!row.isNew\" [attr.data-title-element]=\"column.hoverData ? null : 'self'\">\n {{ row[column.field] }}\n </span></ng-template>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span [attr.data-title-element]=\"column.hoverData ? null : 'self'\"> \n \n {{\n setNumericFormat(column, row)\n }}\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- Button column on Grid -->\n <span *ngSwitchCase=\"'add_button'\">\n <div>\n <button *ngIf=\"!row.hidegridbtn\" pButton type=\"button\" \n [icon]=\"row[column.field+'_obj']?.icon ? row[column.field+'_obj']?.icon : column.icon\"\n [name]=\"column.header\" class=\"merge-btn\" [disabled]=\"allowDisabled(column,row)\"\n [label]=\"row[column.field+'_obj']?.displayText ? row[column.field+'_obj']?.displayText : column.value\"\n class=\"grid-component-grid-add-btn\" (click)=\"onClickButton(column, row)\"></button>\n </div>\n </span> \n \n <!-- Generate File Button column on Grid -->\n <span *ngSwitchCase=\"'generate_file_button'\">\n <se-generate-import-file\n [label]=\"row[column.field+'_obj']?.displayText ? row[column.field+'_obj']?.displayText : column.value\"\n [icon]=\"row[column.field+'_obj']?.icon ? row[column.field+'_obj']?.icon : column.icon\"\n [dialogData]=\"column.data\"\n [selectedRow]=\"row\"\n ></se-generate-import-file>\n </span> \n\n <!-- Date column on Grid -->\n <!-- calendar selector -->\n <span *ngSwitchCase=\"'date'\" \n [attr.data-title-element]=\"column.hoverData? null: editAllRows ? 'input' : 'self' \" \n >\n <p-cellEditor>\n <ng-template pTemplate=\"input\" >\n <p-calendar\n [minDate]=\"column.minDate\" [maxDate]=\"column.maxDate\"\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty ' + column.field + row[dataKey] : column.field + row[dataKey]\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" (onClose)=\"onFocusOutEvent(column, row)\"\n [appendTo]=\"'body'\" hourFormat=\"12\" [defaultDate]=\"defaultDate\"\n [stepMinute]=\"column.minutesInterval ? column.minutesInterval : 1\" [showTime]=\"column.showTime\"\n [timeOnly]=\"column.timeOnly\" [dateFormat]=\"column.format ? column.format.type : calendarFormat\"\n (keyup)=\"calendarInputValue(column, row)\" (onShow)=\"onClickEvent(column, row)\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ? row[column.field+'_obj']?.displayField : row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"\n [showButtonBar]=\"!column.timeOnly\"></p-calendar>\n </ng-template>\n <ng-template pTemplate=\"output\" >\n {{ setConditionBaseValue(row,column) }}\n </ng-template>\n </p-cellEditor>\n </span>\n\n\n <span *ngSwitchDefault>\n <span [ngSwitch]=\"column.type\">\n <!-- Dropdown column on Grid -->\n <span *ngSwitchCase=\"'dropdown'\" [class]=\"dropdownInput ? '' : 'output-dropdown'\"\n [attr.data-title-element]=\" column.hoverData? null: editAllRows ? '.p-dropdown-label' : 'self'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-dropdown *ngIf=\"!row[column.field+'_obj']?.hidden\" [options]=\"\n row[column.field?.toLowerCase()+'_data']\n ? row[column.field?.toLowerCase()+'_data']\n : column.data\n \"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField?.toLowerCase() ? row[row[column.field+'_obj']?.displayField.toLowerCase()] : row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\" [placeholder]=\"row[column.displayField]\n ? row[column.displayField]\n : row[column.field] ? row[column.field] : 'Select'\" [showClear]=\"row[column.field] ? true : false\"\n [optionLabel]=\"column.optionLabel\" (click)=\"onClickEvent(column, row)\"\n [optionValue]=\"column.optionValue\" [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" (blur)=\"onFocusOutEvent(column, row)\"\n (onChange)=\"onChangeEvent(column, row)\" [filter]=\"column.allowSearch\"></p-dropdown>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span *ngIf=\"!row[column.field+'_obj']?.hidden\">\n {{\n setDropdwonReadOnlyValue(row, column)\n }}\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- MultiSelect column on Grid -->\n <!-- [(ngModel)]=\"row[column.field+'_obj']?.displayField?.toLowerCase() ? row[row[column.field+'_obj']?.displayField.toLowerCase()] :\n row[column.field]\" -->\n <span *ngSwitchCase=\"'multi-select'\" [attr.data-title-element]=\"column.hoverData ? null : '.p-multiselect-label'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-multiSelect [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" type=\"text\"\n [(ngModel)]=\"row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"\n [options]=\"column.data\" [optionLabel]=\"column.optionLabel\" [optionValue]=\"column.optionValue\"\n (onChange)=\"onChangeEvent(column, row)\" (onPanelShow)=\"showOption(column, row)\"\n (click)=\"onClickEvent(column, row)\" [appendTo]=\"'body'\" (blur)=\"onFocusOutEvent(column, row)\">\n </p-multiSelect>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span [attr.data-title-element]=\"column.hoverData ? null : 'self'\" >\n {{\n row[column.displayField]\n ? row[column.displayField] :\n setMultiSelectData(column, row[column.field])\n }}\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"'AutoComplete'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-autoComplete \n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" \n [name]=\"column.header\"\n [suggestions]=\"column.data\" \n (onSelect)=\"autoCompleteSelectedValue(row, column, $event)\"\n [field]=\"column.optionLabel ? column.optionLabel?.toLowerCase() : column.displayField ? column.displayField?.toLowerCase() : column.field?.toLowerCase()\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ? row[row[column.field+'_obj']?.displayField.toLowerCase()] :\n typeOf(row[column.field]) === 'object' && row[column.field]?.text ?\n row[column.field]?.text :\n row[column.field]\"\n [dropdown]=\"column.showOption\" \n (ngModelChange)=\"onChangeEvent(column, row)\"\n (click)=\"onClickEvent(column, row)\" \n (completeMethod)=\"autoSearch($event, column, row)\"\n (onBlur)=\"onFocusOutEvent(column, row, $event)\" \n [disabled]=\"allowDisabled(column,row)\" \n [multiple]=\"true\"\n (keydown.enter)=\"onAutoCompleteKeyEnterEvent($event, column, row)\">\n </p-autoComplete>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span *ngIf=\"row[column.field] && row[column.field][0] && row[column.field][0][column.displayField]\">\n <span *ngFor=\"let value of row[column.field]; let i = index\">\n {{ row[column.field] && row[column.field].length > 1 ? row[column.field].length -1 === i ?\n value[column.displayField] : value[column.displayField] + ';' : value[column.displayField] }}\n </span>\n </span>\n <span *ngIf=\"row[column.field] && row[column.field][0] && row[column.field][0][column.field] && !column.displayField\">\n <span *ngFor=\"let value of row[column.field]; let i = index\">\n {{ row[column.field] && row[column.field].length > 1 ? row[column.field].length -1 === i ?\n value[column.field] : value[column.field] + ';' : value[column.field] }}\n </span>\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n <!-- Add Generate Report Button -->\n <span *ngSwitchCase=\"'report'\">\n <p-cellEditor>\n <ng-template pTemplate=\"output\">\n <se-generate-report-btn [repInfo]=\"setReportName(column, row)\" [label]=\"column.label\"\n [params]=\"setReportParams(column, row)\" [class]=\"column.class\" [showDialog]=\"column.showDialog\"\n [icon]=\"column.icon\" [reportType]=\"column.reportType\"></se-generate-report-btn>\n </ng-template>\n <ng-template pTemplate=\"input\">\n <se-generate-report-btn [repInfo]=\"setReportName(column, row)\" [label]=\"column.label\"\n [params]=\"setReportParams(column, row)\" [icon]=\"column.icon\" [class]=\"column.class\"\n [showDialog]=\"column.showDialog\" [reportType]=\"column.reportType\"></se-generate-report-btn>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <span *ngSwitchDefault [attr.data-title-element]=\"column.hoverData ? null : 'input'\">\n <!-- Input column on Grid -->\n <p-cellEditor> \n <ng-template pTemplate=\"input\">\n <span [style]=\"column.style ? column.style : 'display:flex'\">\n <input [type]=\"row[column.field+'_obj']?.textType?row[column.field+'_obj']?.textType:column.textType?column.textType:'text'\" \n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : 'prime-input'\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\n [(ngModel)]=\"row.undefined ? '' : allowDisabled(column,row) && row[column.displayField] ?\n row[column.displayField] : row[column.field+'_obj'] && row[column.field+'_obj'].value ? row[column.field+'_obj'].value : row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"\n (blur)=\"onFocusOutEvent(column, row)\" (change)=\"onChangeEvent(column, row)\"\n (click)=\"onClickButton(column, row)\" *ngIf=\"column.field !== dataKey; else locked_field\" />\n <span style=\"float:right\" *ngIf=\"column.format=='password'\">\n <i [class]=\"row[column.field+'_obj']?(row[column.field+'_obj'].textType=='password'?'pi pi-eye':'pi pi-eye-slash'):column.textType=='password'?'pi pi-eye':'pi pi-eye-slash'\"\n (click)=\"changePasswordType(column, row)\" [title]=\"column.header\"></i>\n </span> \n </span>\n <ng-template #locked_field><span *ngIf=\"!row.isNew\" [attr.data-title-element]=\"column.hoverData ? null : 'self'\">\n {{ row[column.field] }}\n </span></ng-template>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span [style]=\"column.style ? column.style : 'display:flex'\">\n <span (click)=\"onClickEvent(column, row)\" [attr.data-title-element]=\"column.hoverData ? null : 'self' \" \n [class]=\"row[column.field+'_obj']?.textType ?(row[column.field+'_obj']?.textType=='password' ?'password':'') :column.textType=='password'?'password':''\">\n {{ setTextBoxReadOnlyValue(row, column) }} \n </span>\n <span style=\"float:right\" *ngIf=\"column.format=='password'\">\n <i [class]=\"row[column.field+'_obj']?(row[column.field+'_obj'].textType=='password'?'pi pi-eye':'pi pi-eye-slash'):column.textType=='password'?'pi pi-eye':'pi pi-eye-slash'\"\n [title]=\"column.header\" (click)=\"changePasswordType(column, row)\"></i>\n </span>\n </span>\n </ng-template>\n \n </p-cellEditor>\n </span>\n </span>\n </span>\n \n </span>\n </td>\n <!-- Grid Rows Data Bindings End -->\n\n <!-- Action column on Grid -->\n <td *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && columnActions.length > 0\"\n class=\"for-buttons\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">\n <span class=\"action-btn\" *ngFor=\"let action of columnActions\">\n <i [title]=\"action.tooltip\" [class]=\"action.icon\" (click)=\"handleActionClick($event, action, row)\"></i>\n </span>\n </td>\n <td\n *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && useInlineCRUD && (deleteRowPermission || editRowPermission)\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"\n class=\"for-buttons\"\n [ngClass]=\"disabledSaveBtn ? 'hide-clear-filter-button' : ''\">\n <span class='setActionColumnWidth'>\n <se-grid-row-actions [editing]=\"editing\" [editRowPermission]=\"editRowPermission\"\n [deleteRowPermission]=\"deleteRowPermission\" [hideDeleteBtn]=\"hideDeleteBtn\" [hideEditBtn]=\"hideEditBtn\"\n [row]=\"row\" (onRowEditInitBtn)=\"onRowEditInit($event)\" (deleteRecordBtn)=\"deleteRecord($event)\"\n (onRowEditSaveBtn)=\"onRowEditSave($event)\" (onRowEditCancelBtn)=\"onRowEditCancel($event, ri)\"\n [editAllRows]=\"editAllRows\">\n </se-grid-row-actions>\n </span>\n </td>\n </tr>\n </ng-template>\n\n <!-- Footer columns on Grid -->\n <ng-template pTemplate=\"footer\">\n <tr *ngIf=\"aggregateFooter\">\n <td\n *ngIf=\"setActionColumnAsFirst && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></td>\n <td *ngIf=\"allowSelection\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></td>\n <td *ngFor=\"let outerColumn of selectedColumns\" class=\"grid-component-outer-column\" [style]=\"outerColumn.style\">\n <div *ngFor=\"let innerColumn of selectedColumns\">\n <div *ngFor=\"let aggr of innerColumn?.aggregate\">\n <div\n *ngIf=\"aggr.aggrValue?.length && ((!aggr.displayField && innerColumn.field?.toLowerCase() === outerColumn.field?.toLowerCase()) ||\n aggr.displayField && aggr.displayField?.toLowerCase() === outerColumn.field?.toLowerCase())\">\n <div [innerHTML]=\"aggr.aggrValue\">\n </div>\n </div>\n </div> \n </div>\n </td>\n <td\n *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && useInlineCRUD && (deleteRowPermission || editRowPermission)\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"\n [ngClass]=\"disabledSaveBtn ? 'hide-clear-filter-button' : ''\"></td>\n </tr>\n </ng-template>\n\n <!-- Footer for Empty Message columns on Grid -->\n <ng-template pTemplate=\"emptymessage\">\n <tr class=\"grid-component no-records-found\">\n <td [attr.colspan]=\"selectedColumns?.length + 1\">{{totalRecords==0? 'No records found':''}}</td>\n </tr>\n </ng-template>\n </p-table> \n <p-overlayPanel\n [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>", styles: [":host ::ng-deep .table-layout-auto table{table-layout:auto;width:-moz-max-content!important;width:max-content!important}:host ::ng-deep .table-layout-auto .p-datatable-resizable-table>.p-datatable-thead>tr>th{min-width:100px}:host ::ng-deep .prime-input{font-family:Roboto;font-size:12px;color:#484848;background:#ffffff;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:3px;border:none}:host ::ng-deep .prime-input:focus{outline:none;border-color:transparent;box-shadow:0 0 0 2px #0003}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-top:28px;margin-left:18px}:host ::ng-deep .p-multiselect{max-width:100%}:host ::ng-deep .password{-webkit-text-security:disc}:host ::ng-deep .p-calendar .p-inputtext{width:100%}:host ::ng-deep .column-filter-clear-button{display:none}:host ::ng-deep .apply-filter-btn{float:unset!important}:host ::ng-deep .hide-table-filter .pi-filter:before{display:none}:host ::ng-deep .hide-table-filter .p-column-filter-menu-button,:host ::ng-deep .hide-table-filter .p-column-filter-clear-button{display:none!important}:host ::ng-deep .hide-filter-icon .column-filter-menu-button{display:none}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.custom-link{color:#205dcf;font-size:12px}.custom-link:not(.disabled-link){cursor:pointer}.mr-2{margin-right:10px;display:block}.highlighted-row{background-color:#dee2e6!important}.hide-clear-filter-button{display:none!important}:host ::ng-deep .p-datatable-resizable-table>.p-datatable-thead>tr>th{overflow:visible!important}:host ::ng-deep .p-multiselect .p-multiselect-trigger{top:6px}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i7.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i13.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i11.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i13.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i13.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "component", type: i13.CellEditor, selector: "p-cellEditor" }, { kind: "component", type: i13.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i13.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i13.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i13.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i13.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "component", type: i13.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping", "showButtons"] }, { kind: "directive", type: i14.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i15.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove"] }, { kind: "directive", type: i16.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i16.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i16.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i17.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "overlayDirection", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i18.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "directive", type: i19.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i20.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "trueValue", "falseValue"], outputs: ["onChange"] }, { kind: "directive", type: i21.Ripple, selector: "[pRipple]" }, { kind: "directive", type: i22.InputText, selector: "[pInputText]" }, { kind: "component", type: i23.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "itemSize"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "component", type: i24.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "component", type: i25.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i26.OverlayPanel, selector: "p-overlayPanel", inputs: ["dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i27.GridRowActionsComponent, selector: "se-grid-row-actions", inputs: ["editing", "editRowPermission", "deleteRowPermission", "hideDeleteBtn", "hideEditBtn", "editAllRows", "row"], outputs: ["onRowEditInitBtn", "deleteRecordBtn", "onRowEditSaveBtn", "onRowEditCancelBtn"] }, { kind: "directive", type: i28.AddRowDirective, selector: "[pAddRow]", inputs: ["table", "newRow", "id"] }, { kind: "directive", type: i29.ObserveCheckboxDirective, selector: "[observeCheckbox]" }, { kind: "component", type: i30.GenerateReportBtnComponent, selector: "se-generate-report-btn", inputs: ["repInfo", "mappedFields", "label", "icon", "params", "class", "reportHeader", "reportFooter", "reportType", "showDialog", "form"] }, { kind: "component", type: i31.GenerateFileComponent, selector: "se-generate-import-file", inputs: ["label", "icon", "showDialog", "dialogData", "selectedRow"] }] }); }
|
|
3129
3129
|
}
|
|
3130
3130
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: GridComponent, decorators: [{
|
|
3131
3131
|
type: Component,
|
|
3132
|
-
args: [{ selector: 'se-grid', template: "<div class=\"grid-component-wrapper\">\n<p-confirmDialog [style]=\"{ width: '50vw' }\" *ngIf=\"useInlineCRUD\" key=\"handleInlineCRUD\"></p-confirmDialog>\n<p-confirmDialog class=\"grid-component-confirm-dialog\" *ngIf=\"columnActions.length > 0\"\n key=\"handlecolumnActions\"></p-confirmDialog>\n<div class=\"global-filter-buttons-wrapper\">\n\n <!-- button for apply value on Grid -->\n <button *ngIf=\"((filtering && !hideFilter ) || showFilterbtn)\" pButton type=\"button\" icon=\"pi pi-search\" (click)=\"applyGridFilterBtn()\"\n [class]=\"\n searchGridFilter ? 'p-button-success apply-filter-btn filter-btn' : 'hide-clear-filter-button apply-filter-btn filter-btn'\n \"></button>\n\n <!-- button for clear value on Grid -->\n <button *ngIf=\"((filtering && !hideFilter )|| showFilterbtn)\" pButton id=\"clearGridFilterValuesButton\" type=\"button\"\n icon=\"pi pi-replay\" (click)=\"cleargridFiltersValue()\" [class]=\"\n clearGridFilter ? 'filter-btn' : 'hide-clear-filter-button filter-btn'\n \" class='global-refresh global-btn'\n ></button>\n\n <!-- button for save all grid at once -->\n <button pButton *ngIf=\"editAllRows && editRowPermission\" id=\"saveAllGridValues\"\n icon=\"pi pi-check\" [label]=\"'Save'\"\n [class]=\"hideGridSaveButton ? 'hide-clear-filter-button save-all-grid' : 'ui-button-info save-all-grid'\" type=\"button\"\n (click)=\"saveAllRowsAtOnce()\"></button>\n\n <!-- button for cancel all grid at once -->\n <button pButton *ngIf=\"editAllRows && !hideGridCancelButton\" id=\"editBtnGlobalvalues\" type=\"button\" [label]=\"'Cancel'\"\n icon=\"pi pi-times\" class=\"ui-button-info\" (click)=\"cancelAllRowsAtOnce()\"></button>\n\n <!-- header Button for multiSelect on Grid -->\n <span *ngIf=\"allowColumnToggle\" observeCheckbox>\n <p-multiSelect [showToggleAll]=\"false\" optionDisabled=\"false\" [options]=\"selectedToggleColumns\" [(ngModel)]=\"selectedColumns\" optionLabel=\"header\"\n selectedItemsLabel=\"{0} columns selected\" class=\"grid-component-multiselect-header-button\" placeholder=\"Choose Columns\">\n </p-multiSelect>\n </span>\n\n <!-- header Button for Adding new Row on Grid -->\n <button pButton *ngIf=\"useInlineCRUD && addRowPermission && !hideAddBtn\" type=\"button\" [label]=\"'Add'\" pAddRow\n [table]=\"componentTableRef\" [newRow]=\"newGridRow\" [id]=\"dataKey\" pTooltip=\"Add New Row\" tooltipPosition=\"bottom\"\n icon=\"pi pi-plus\" [class]=\"'ui-button-info global-add-btn'+gridName\" (click)=\"addNewRow(newGridRow, true)\" pRipple></button>\n\n \n <!-- header Button for Excel File on Grid -->\n <button *ngIf=\"allowExportToExcel\" type=\"button\" pButton icon=\"pi pi-file-excel\" (click)=\"exportExcel()\"\n class=\"p-button-success\" pTooltip=\"Export to Excel\" tooltipPosition=\"bottom\" pRipple></button>\n\n<!-- header Button for PDF File on Grid -->\n<button *ngIf=\"allowExportToPdf\" type=\"button\" pButton icon=\"pi pi-file-pdf\" (click)=\"exportPdf()\"\n class=\"p-button-warning mr-2 ml-2\" pTooltip=\"Export to Pdf\" tooltipPosition=\"bottom\" pRipple></button>\n\n <!-- <div *ngFor=\"let reportButton of reportButtons\" class=\"ui-button-info mr-2 ml-2\">\n <se-generate-report-btn *ngIf =\"!reportButton.hidden\"[repId]=\"reportButton.reportId\" [label]=\"reportButton.label\" [params]=\"reportButton.params\"\n [showDialog]=\"reportButton.showDialog\"></se-generate-report-btn>\n </div> -->\n\n <ng-content></ng-content>\n\n <ng-container *ngFor=\"let reportButton of reportButtons\">\n <se-generate-report-btn *ngIf =\"!reportButton.hidden\"[repInfo]=\"reportButton\" [label]=\"reportButton.label\" [params]=\"reportButton.params\" [icon]=\"reportButton.icon\" [class]=\"reportButton.class\"\n [showDialog]=\"reportButton.showDialog\" [reportType]=\" reportButton.reportType\" [reportHeader]=\"reportButton.reportHeader\" [reportFooter]=\"reportButton.reportFooter\"></se-generate-report-btn>\n </ng-container>\n\n</div>\n\n <p-table *ngIf=\"!isGridHidden\" id=\"my-table\" [value]=\"rowsData\" [columns]=\"selectedColumns\" sortMode=\"multiple\"\n [lazy]=\"useServerSideEvents\" [paginator]=\"pagination\" [alwaysShowPaginator]=\"pagination && totalRecords > 0\" \n [class]=\"' grid-component-main-table ' + (pagination || !rowsData.length ? ' pagination ' : '') + (tableStyle.includes('width') ? ' hasTableWidthStyle ' : '') + (autoResize ? '' : 'table-layout-auto') \"\n (onColResize)=\"onColumnResize($event,dt)\" [resizableColumns]=\"true\"\n responsiveLayout=\"scroll\" columnResizeMode=\"expand\"\n [rows]=\"defaultRows\" [totalRecords]=\"totalRecords\" [rowsPerPageOptions]=\"setPaginationLength\"\n [showCurrentPageReport]=\"showCurrentPageReport\" currentPageReportTemplate=\"Showing {first} to {last} of {{\n totalRecords\n }} entries\" [loading]=\"!setGridRefreshTime ? loading : false\"\n (onSort)=\"sortDisabled ?? handleSortChange($event)\" (onFilter)=\"handleFilterChange($event)\"\n (onLazyLoad)=\"autoLoadData ? handleServerSideEvents($event, dt) : ''\" (onPage)=\"gridService.columnFocusedOut ? showConfirmation($event) : handleServerSidePagination($event)\" #dt\n [dataKey]=\"dataKey\" [(selection)]=\"selectedRows\" selectionMode=\"multiple\" [scrollable]=\"scrollable\" \n [tableStyle]=\"tableStyle\"\n [scrollHeight]=\"scrollHeight\"\n editMode=\"row\" [editingRowKeys]=\"editingRowKeys\" [rowHover]=\"rowHover\"\n [ngClass]=\"setClassaAndId(dt)\">\n\n <div *ngIf=\"rowActions.length > 0 && rowActions.length > 0\" class=\"flex justify-content-end\">\n <span *ngFor=\"let rowAction of rowActions\">\n <button pButton type=\"button\" [label]=\"rowAction.title\" [class]=\"rowAction.class\"\n (click)=\"rowAction.onClick(selectedRows)\"></button>\n </span>\n </div>\n\n <!-- header columns on Grid -->\n <ng-template pTemplate=\"header\" let-cols>\n <tr>\n <th pResizableColumn *ngIf=\"allowSelection && selectionType === 'multiple'\" class=\"grid-component-selection\" id=\"{{allowSelectionHeader}}\">\n <span class=\"th-content-wrapper\">\n <div class=\"grid-component-table-header-inner-div-2\n table-header-inner-div div-last-inner-html-is-icon\">\n <span class=\"flex-grow-1\"> {{allowSelectionHeader}} </span>\n <p-tableHeaderCheckbox *ngIf=\"selectionType === 'multiple'\" binary=\"true\"\n (click)=\"multiCheckBoxOnclick(rowsData, $event)\"></p-tableHeaderCheckbox>\n </div>\n </span>\n </th>\n <th pResizableColumn *ngIf=\"allowSelection && selectionType === 'single'\" id=\"Select\"\n data-title-element=\"self\" class=\"grid-component-selection\">\n Select\n </th>\n <th pResizableColumn id=\"Actions\"\n *ngIf=\"setActionColumnAsFirst && !disabledSaveBtn && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn' \" data-title-element=\"self\" >\n Actions\n </th>\n <th pResizableColumn *ngFor=\"let column of cols\" [style.width]=\"column?.columnWidth ? column?.columnWidth+'px' : column?.customWidth+'px'\" id=\"{{column.header}}\" [pSortableColumn]=\"column.field\"\n [class]=\"column.type === 'boolean' ? 'checkbox-th' : ''\"\n [pSortableColumnDisabled]=\"sortDisabled && useServerSideEvents ? true : column.sorting === false\"\n class=\"column?.type === 'multiple' ? 'grid-component-select-th-column-type-multiple' : ''\">\n <span class=\"th-content-wrapper\">\n <div class=\"grid-component-table-header-inner-div-1 table-header-inner-div div-last-inner-html-is-icon\"> \n <span [attr.data-title-element]=\"'self'\" [class]=\"'flex-grow-1'\" >{{ column.header }}\n <span *ngIf=\"column.isRequired\" class=\"grid-component required-star\">*</span>\n </span>\n <p-sortIcon *ngIf=\"column.sorting !== false && column?.type !== 'multiple'\"\n [field]=\"column.field\"></p-sortIcon>\n </div>\n </span>\n </th>\n <th pResizableColumn id=\"Actions\"\n *ngIf=\"!setActionColumnAsFirst && !disabledSaveBtn && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\" data-title-element=\"self\" >Actions</th>\n </tr>\n <tr *ngIf=\"filtering && !hideFilter\">\n <th pResizableColumn *ngIf=\"allowSelection\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></th>\n <th pResizableColumn *ngIf=\"setActionColumnAsFirst && !disabledSaveBtn && useInlineCRUD\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">\n </th>\n <th pResizableColumn *ngFor=\"let column of cols\" [style.width]=\"column?.columnWidth ? column?.columnWidth+'px' : column?.customWidth+'px'\" id=\"{{column.header}}\" [ngSwitch]=\"column?.filter?.type\" \n [class]=\"hideFilterOptions ? 'hide-table-filter temp' : 'temp'\">\n <span *ngIf=\"column.filtering !== false\" [class]=\"column.filter?.showFilter ? '' : 'hide-filter-icon'\">\n <!-- Text input on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [type]=\"'text'\" [field]=\"column.field\" *ngSwitchCase=\"'input'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <input type=\"text\" [(ngModel)]=\"column.filterValue\" [class]=\"column?.field?.toLowerCase()\" (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n (blur)=\"setFilterFocusOut(column, filter, $event)\"\n (keyup)=\"removingFilters($event, column);backspaceEvent($event, column)\" pInputText />\n </ng-template>\n </p-columnFilter>\n\n <!-- Numeric input on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [type]=\"'numeric'\" [field]=\"column.field\" *ngSwitchCase=\"'numeric_input'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-inputNumber [(ngModel)]=\"column.filterValue\" [class]=\"column?.field?.toLowerCase()\" (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n (onBlur)=\"setFilterFocusOut(column, filter, $event)\"\n (keyup)=\"removingFilters($event, column);backspaceEvent($event, column)\"></p-inputNumber>\n </ng-template>\n </p-columnFilter>\n\n <!-- lookup input on Header For Filter-->\n <p-columnFilter\n class=\"no-filter-icon\"\n [type]=\"'text'\"\n [field]=\"column.field\"\n *ngSwitchCase=\"'lookup_input'\"\n >\n <ng-template\n pTemplate=\"filter\"\n let-value\n let-filter=\"filterCallback\"\n >\n <div class=\"close-icon-wrapper grid-component lookup-filter-wrapper\">\n <div class=\"lookup-filter-input-wrapper\"> \n <input\n [id]=\"column.field?.toLowerCase() + '_filter'\"\n class=\"grid-component lookup-filter\"\n autocomplete=\"off\"\n type=\"text\"\n [(ngModel)]=\"column.filterValue\"\n (click)=\"setFilterLookup(column)\"\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n (blur)=\"setFilterFocusOut(column, filter, $event)\"\n (keyup)=\"removingFilters($event, column);backspaceEvent($event, column)\"\n pInputText\n />\n </div> \n <div class=\"direct-wrapper-close-icon-lookup\">\n <button\n *ngIf=\"column.filterValue\"\n icon=\"pi pi-times\"\n pButton\n type=\"button\"\n (click)=\"lookupClearValue(column)\">\n </button>\n </div>\n </div>\n </ng-template>\n </p-columnFilter>\n\n <!-- checkbox on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" type=\"boolean\" [field]=\"column.field\" *ngSwitchCase=\"'checkbox'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-checkbox [binary]=\"true\" [disabled]=\"column.disabled\" [(ngModel)]=\"column.filterValue\"\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n (onChange)=\"setFilterFocusOut(column, filter, $event)\" (click)=\"clickCheckBoxFilter(column)\"\n (keydown)=\"backspaceEvent($event, column)\">\n </p-checkbox>\n </ng-template>\n </p-columnFilter>\n\n <!-- multiSelect on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [field]=\"column.field\" matchMode=\"in\" [showMenu]=\"false\" *ngSwitchCase=\"'multi-select'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-multiSelect [(ngModel)]=\"column.filterValue\" [options]=\"column.filter.data || []\" \n [appendTo]=\"'body'\" [name]=\"column.field\"\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n [optionValue]=\"column.optionValue\"\n [optionLabel]=\"column.optionLabel\"\n (onChange)=\"setFilterFocusOut(column, filter, $event)\" \n (keydown)=\"backspaceEvent($event, column)\">\n \n </p-multiSelect>\n </ng-template>\n </p-columnFilter>\n\n <!-- dropdown on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [field]=\"column.field\" matchMode=\"in\" [showMenu]=\"false\" *ngSwitchCase=\"'dropdown'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-dropdown [showClear]=\"true\" [placeholder]=\"'Select'\" [filter]=\"column.allowSearch\"\n [(ngModel)]=\"column.filterValue\" (keyup.enter)=\"applyDropdownFilter(filter, $event)\"\n [options]=\"column.filter.data || []\"\n (onChange)=\"searchDropdownFilter(filter, $event, column)\"></p-dropdown>\n </ng-template>\n </p-columnFilter>\n\n <!-- calendar on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [field]=\"column.field\" matchMode=\"in\" [showMenu]=\"false\" *ngSwitchCase=\"'calendar'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-calendar [placeholder]=\"'Select-Date'\" [(ngModel)]=\"column.filterValue\"\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\" appendTo=\"body\" (onSelect)=\"selectDate(column)\"\n [inputId]=\"column.field\" hourFormat=\"12\" (keyup.backspace)=\"removeNullCalendar(column, filter, $event)\"\n [showButtonBar]=\"true\" (onClose)=\"setFilterFocusOut(column, filter, $event)\"\n (keydown)=\"backspaceEvent($event, column)\" (onClearClick)=\"backspaceEvent($event, column)\">\n </p-calendar>\n </ng-template>\n </p-columnFilter>\n\n <!-- Default Filter For Header -->\n <p-columnFilter class=\"no-filter-icon\" [type]=\"\n column.type && column.type !== 'link' ? column.type : 'text'\n \" [field]=\"column.field\" display=\"menu\" *ngSwitchDefault>\n </p-columnFilter>\n </span>\n </th>\n <th pResizableColumn\n *ngIf=\"!setActionColumnAsFirst && !disabledSaveBtn && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></th>\n </tr>\n </ng-template>\n\n <!-- Body columns on Grid -->\n <ng-template pTemplate=\"body\" let-row let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr \n [style]=\"rowStyle\"\n [ngClass]=\"row?.highlightrow ? 'highlighted-row' : ''\"\n [class]=\"wordWrap ? 'p-selectable-row wordWrapTrue' : 'wordWrapFalse p-selectable-row'\" (click)=\"selectedRowRecord = row\"\n [pEditableRow]=\"row\" #gridRow [id]=\"row[dataKey]\">\n <td *ngIf=\"allowSelection\" class=\"grid-component-selection\">\n <p-tableRadioButton [value]=\"row\" *ngIf=\"selectionType === 'single'\"\n (click)=\"multiCheckBoxOnclick(row , $event, true)\"></p-tableRadioButton>\n <p-tableCheckbox [value]=\"row\" *ngIf=\"selectionType === 'multiple'\"\n (click)=\"multiCheckBoxOnclick(row, $event)\"></p-tableCheckbox>\n </td>\n\n <!-- first actions column -->\n <td *ngIf=\"setActionColumnAsFirst && columnActions.length > 0\">\n <span class=\"action-btn\" *ngFor=\"let action of columnActions\">\n <i [title]=\"action.tooltip\" [class]=\"action.icon\" (click)=\"handleActionClick($event, action, row)\"></i>\n </span>\n </td>\n <td *ngIf=\"setActionColumnAsFirst && useInlineCRUD && (deleteRowPermission || editRowPermission)\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"\n [ngClass]=\"disabledSaveBtn ? 'hide-clear-filter-button' : ''\">\n <span class=\"setActionColumnWidth\">\n <se-grid-row-actions [editing]=\"editing\" [editRowPermission]=\"editRowPermission\"\n [deleteRowPermission]=\"deleteRowPermission\" [hideDeleteBtn]=\"hideDeleteBtn\" [hideEditBtn]=\"hideEditBtn\"\n [row]=\"row\" (onRowEditInitBtn)=\"onRowEditInit($event)\" (deleteRecordBtn)=\"deleteRecord($event)\"\n (onRowEditSaveBtn)=\"onRowEditSave($event)\" (onRowEditCancelBtn)=\"onRowEditCancel($event, ri)\"\n [editAllRows]=\"editAllRows\">\n </se-grid-row-actions>\n </span>\n </td>\n\n <!-- Grid Rows Data Bindings Start -->\n <td *ngFor=\"let column of selectedColumns\" [ngSwitch]=\"column.type\" [style]=\"column.style \" \n (mouseenter)=\"(column.hoverData && column.hoverData.component) && addDynamicPanelOverlayComponent(column.hoverData, overlayPanel, $event, row)\"\n (mouseleave)=\"(column.hoverData && column.hoverData.component) && mouseLeaveEvent(overlayPanel)\"\n >\n <span class=\"td-content-wrapper\" [style]=\"column.style\">\n\n <!-- Boolean column on Grid -->\n <span *ngSwitchCase=\"'boolean'\"\n >\n <td *ngIf=\"!editing && row[column.field + '_obj']?.show != false\">\n <p-checkbox \n [disabled]=\"!column.allowEdit ?? true\" [binary]=\"true\" (click)=\"onClickEvent(column, row)\"\n (ngModelChange)=\"checkBoxChangeEvent($event, column, row)\" (blur)=\"onFocusOutEvent(column, row)\" \n [(ngModel)]=\" \n row[column.field] &&\n (row[column.field].toString() === '1' ||\n row[column.field].toString().toLowerCase() === 'true' ||\n row[column.field].toString().toLowerCase() === 'y'||\n ( row[column.field].text && (row[column.field]?.text?.toString() === '1' ||\n row[column.field]?.text?.toString()?.toLowerCase() === 'true' ||\n row[column.field]?.text?.toString()?.toLowerCase() === 'y')))\n ? Checked\n : unChecked\n \">\n </p-checkbox>\n </td>\n <td *ngIf=\"editing\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <!-- for edit checkBox -->\n <p-checkbox (click)=\"onClickEvent(column, row)\" (ngModelChange)=\"checkBoxChangeEvent($event, column, row)\"\n [disabled]=\"allowDisabled(column,row)\" [binary]=\"true\" [(ngModel)]=\"\n row[column.field] && \n (row[column.field].toString() === '1' ||\n row[column.field].toString().toLowerCase() === 'true' ||\n row[column.field].toString().toLowerCase() === 'y' ||\n ( row[column.field].text && (row[column.field]?.text?.toString() === '1' ||\n row[column.field]?.text?.toString()?.toLowerCase() === 'true' ||\n row[column.field]?.text?.toString()?.toLowerCase() === 'y')))\n ? editModeChecked\n : editModeunCkecked\n \" (blur)=\"onFocusOutEvent(column, row)\"></p-checkbox>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ row[column.field] }}\n </ng-template>\n </p-cellEditor>\n </td>\n </span>\n\n <!-- link column on Grid -->\n <span [attr.data-title-element]=\"column.hoverData ? null : 'a,input'\" *ngSwitchCase=\"'link'\">\n <!-- link column for HyperLink Case -->\n <span *ngIf=\"column.allowSave === false\">\n <span *ngIf=\"column.target !== '_self'\" [style]=\"column.style\"\n [attr.data-title-element]=\"column.hoverData ? null : 'a'\"\n class=\"custom-link\"\n [class]=\"allowDisabled(column,row) ? 'disabled-link' : ''\">\n\n <a class=\"d-inline\" [href]=\"column.disabled?'':row[column.field + '_obj']?.hyperlink\" target=\"_blank\">\n <i *ngIf=\"column.icon &&!row[column.field+'_obj']?.hideFieldValue; else noIcon\" [class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n <span (click)=\"column?.onClick ? onClickEvent(column, row) : ''\">\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </span>\n </ng-template>\n </a>\n \n </span>\n <span *ngIf=\"column.target === '_self'\" [style]=\"column.style\"\n [attr.data-title-element]=\"column.hoverData ? null : 'a'\" class=\"custom-link\"\n [class]=\" allowDisabled(column,row) ? 'disabled-link' : ''\">\n\n <a class=\"d-inline\" [href]=\"column.disabled?'':row[column.field + '_obj']?.hyperlink\" [target]='column.target'>\n <i *ngIf=\"column.icon &&!row[column.field+'_obj']?.hideFieldValue; else noIcon\" [class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n <span (click)=\"column?.onClick ? onClickEvent(column, row) : ''\">\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </span>\n </ng-template>\n </a>\n\n </span>\n </span>\n <!-- link column for Edit Case -->\n <span *ngIf=\"column.allowSave || column.allowSave === undefined\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <span\n *ngIf=\"(column.editable === true ) && (column.editLink === true )\">\n <input *ngIf=\"!row.isNew\" pInputText (click)=\"column?.onClick ? onClickEvent(column, row) : ''\" type=\"text\"\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"row[column.field + '_obj']?.hideFieldValue ? '' : row[column.field + '_obj']?.displayText ? row[column.field + '_obj']?.displayText : column.displayText ? column.displayText : row[column.field]\"\n (blur)=\"onFocusOutEvent(column, row)\"\n (change)=\"onChangeEvent(column, row)\" />\n <input pInputText *ngIf=\"row.isNew\" type=\"text\" (click)=\"column?.onClick ? onClickEvent(column, row) : ''\"\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ? row[column.field+'_obj']?.displayField : row[column.field]\"\n (blur)=\"onFocusOutEvent(column, row)\"\n (change)=\"onChangeEvent(column, row)\" />\n </span>\n <!-- <span *ngIf=\"column.editable === false|| column.editable === undefined\" >\n <a class=\"custom-link\" (click)=\"onClickEvent(column, row)\" [href]=\"row[column.field + '_obj']?.hyperlink\" [target]='column.target'\n [class]=\"allowDisabled(column,row) ? 'disabled-link' : ''\">\n <i *ngIf=\"column.icon && !row[column.field+'_obj']?.hideFieldValue; else noIcon\"[class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </ng-template>\n \n </a>\n </span> -->\n <span *ngIf=\"(column.editLink === false|| column.editLink === undefined)&&(column.editable === false|| column.editable === undefined)\">\n <a class=\"d-inline\" [href]=\"row[column.field + '_obj']?.hyperlink\" [target]=\"column.target ? column.target : '_blank'\"\n [class]=\"column.editable === false ? '' : allowDisabled(column,row) ? 'disabled-link' : ''\">\n <i *ngIf=\"column.icon && !row[column.field+'_obj']?.hideFieldValue; else noIcon\"[class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n <span (click)=\"column?.onClick ? onClickEvent(column, row) : ''\">\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </span> \n </ng-template>\n \n </a>\n </span>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span [style]=\"column.style\" class=\"custom-link\" [class]=\"column.editable === false || allowDisabled(column,row) ? 'disabled-link' : ''\">\n <a class=\"d-inline\" [href]=\"column.disabled?'':row[column.field + '_obj']?.hyperlink\" [target]=\"column.target ? column.target : '_blank'\"\n >\n <i *ngIf=\"column.icon&& !row[column.field+'_obj']?.hideFieldValue; else noIcon\" [title]=\"column.header\" [class]=\"column.icon\"></i>\n <ng-template #noIcon>\n <span (click)=\"column?.onClick ? onClickEvent(column, row) : ''\">\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </span>\n </ng-template>\n </a>\n\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n </span>\n\n <!-- Iframe column on Grid -->\n <span *ngSwitchCase=\"'iframe'\">\n <span class=\"custom-link\" (click)=\"gridIFrame(column, row[column.field + '_obj']?.hyperlink, row)\" [title]=\"\n row[column.field + '_obj'] &&\n (row[column.field + '_obj'].displayText === null || row[column.field + '_obj'].displayText === '')\n ? row[column.field] : row[column.field + '_obj']?.displayText\n ? row[column.field + '_obj'].displayText\n : column.displayText\n ? column.displayText\n : row[column.field]\n\n \"\n > \n <i *ngIf=\"column.icon; else noIcon\"[class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n {{\n row[column.field + '_obj'] &&\n (row[column.field + '_obj'].displayText === null || row[column.field + '_obj'].displayText === '')\n ? row[column.field] : row[column.field + '_obj']?.displayText\n ? row[column.field + '_obj'].displayText\n : column.displayText ? column.displayText : row[column.field]\n }}\n </ng-template>\n </span>\n </span>\n\n <!-- dialog column on Grid -->\n <span *ngSwitchCase=\"'dialog'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <span\n *ngIf=\"column?.filter?.type !== 'calendar' && !row?.hidegridbtn\" \n \n >\n <span *ngIf=\"column.editable === true && !row[column.field+'_obj']?.hideFieldValue\">\n <input [attr.data-title-element]=\"column.hoverData ? null : 'self'\"\n readonly\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\n type=\"text\"\n pInputText\n (click)=\"selectLookupField(column, row)\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ?\n row[row[column.field+'_obj']?.displayField?.toLowerCase()] : \n row[column.field]\"\n [name]=\"row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"\n (blur)=\"onFocusOutEvent(column, row)\"\n />\n \n </span>\n <span [attr.data-title-element]=\"column.hoverData ? null : 'self'\"\n *ngIf=\"column.editable === false || column.editable === undefined\n \" class=\"custom-link\" [style]=\"column.style\"\n [class]=\"\n allowDisabled(column,row) ? 'disabled-link' : ''\n \" (click)=\"openGridDialog(column, row, $event)\">\n <i *ngIf=\"(column.icon || row[column.field+'_obj']?.icon) && !row[column.field+'_obj']?.hideFieldValue ; else noIcon\"\n [class]=\"row[column.field+'_obj']?.icon ? row[column.field+'_obj']?.icon : column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>{{ (!column.displayText && row.isNew ) || row[column.field+'_obj']?.hideFieldValue ? '' : setConditionBaseValue(row, column)\n }}</ng-template>\n </span>\n </span>\n <span *ngIf=\"column?.filter?.type === 'calendar' && column.editable === true\" [attr.data-title-element]=\"column.hoverData ? null : 'input'\">\n <p-calendar [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" (onClose)=\"onFocusOutEvent(column, row)\"\n [minDate]=\"column.minDate\" [maxDate]=\"column.maxDate\"\n [appendTo]=\"'body'\" hourFormat=\"12\" [showTime]=\"column.showTime\" (click)=\"onClickEvent(column, row)\"\n [timeOnly]=\"column.timeOnly\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ?\n row[row[column.field+'_obj']?.displayField.toLowerCase()] : row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"></p-calendar>\n </span>\n <span *ngIf=\"column?.filter?.type === 'calendar' && !column.editable\" class=\"custom-link\"\n [class]=\"row.disabled || allowDisabled(column,row) ? 'disabled-link' : ''\"\n (click)=\"openGridDialog(column, row, $event)\"\n >{{ row[column.field+'_obj']?.hideFieldValue ? '' : setConditionBaseValue(row, column) }}\n </span>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span class=\"custom-link\" [style]=\"column.style\"\n [class]=\"row.disabled || allowDisabled(column,row) ? 'disabled-link' : ''\"\n (click)=\"openGridDialog(column, row, $event)\"\n [attr.data-title-element]=\"column.hoverData ? null : 'self'\">\n <i *ngIf=\"(column.icon || row[column.field+'_obj']?.icon) && !row[column.field+'_obj']?.hideFieldValue ; else noIcon\"[title]=\"column.header\" [class]=\"row[column.field+'_obj']?.icon ? row[column.field+'_obj']?.icon : column.icon\"></i>\n <ng-template #noIcon>{{ row[column.field+'_obj']?.hideFieldValue ? '' : setConditionBaseValue(row, column) }}</ng-template>\n <!-- {{ setConditionBaseValue(row, column) }}\n *ngIf=\"!row[column.field + '_secondType'] && !row.hidegridbtn\" -->\n\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- test -->\n <!-- lookup Input column on Grid -->\n <span *ngSwitchCase=\"'lookup_input'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <div class=\"close-icon-wrapper\">\n <input [attr.data-title-element]=\"column.hoverData ? null : 'self'\" readonly type=\"text\"\n [(ngModel)]=\"row?.isNew || row?.isnew ? typeOf(row[column.field]) === 'object' ? row[column.field]?.text : row[column.field] : row[column.field+'_obj']?.displayField ? row[row[column.field+'_obj']?.displayField?.toLowerCase()] :\n typeOf(row[column.field+'_obj']?.text) === 'object' && row[column.field+'_obj']?.text?.hasOwnProperty('text') ? row[column.field+'_obj']?.text?.text : \n column.displayField ? row[column.displayField?.toLowerCase()] : row[column.field]\n \"\n (keyup.tab)=\"selectLookupField(column, row)\" [disabled]=\"allowDisabled(column,row)\"\n (click)=\"selectLookupField(column, row)\" [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : 'prime-input'\" (blur)=\"onFocusOutEvent(column, row)\" />\n <div *ngIf=\"!allowDisabled(column,row)\"><button *ngIf=\"row[column.field] && typeOf(row[column.field]) === 'object'\n ? row[column.field].text\n : row[column.field] && !column.disabled\" icon=\"pi pi-times\" pButton type=\"button\"\n (click)=\"lookupClearValue(column,row)\"></button></div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"output\" >\n <span *ngIf=\"column.linkId\" >\n <a [attr.data-title-element]=\"column.hoverData ? null : 'self'\" [href]=\"row[column.field + '_obj']?.hyperlink\" [target]=\"column.target === '_self' ? '' : '_blank'\">\n {{\n setLookupReadOnlyValue(row, column)\n }}\n </a>\n </span>\n <span [attr.data-title-element]=\"column.hoverData ? null : 'self'\" *ngIf=\"!column.linkId\" [style]=\"column.style\" [class]=\"column.component && column.editLink === true ? 'custom-link' : ''\"\n (click)=\"openLookupHyperlink(column, row)\" >\n {{\n setLookupReadOnlyValue(row, column)\n }}\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- Numeric Input column on Grid -->\n <span *ngSwitchCase=\"'numeric'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <!-- for Currency && Decimal && Percent -->\n <span [attr.data-title-element]=\"column.hoverData ? null : 'input'\" class=\"input-number\">\n <p-inputNumber [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" [class]=\"\n row[column.field.toLowerCase()+'_obj']?.errorMessage\n ? 'ng-invalid ng-dirty'\n : 'form-control'\n \" [showButtons]=\"false\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ? row[row[column.field+'_obj']?.displayField?.toLowerCase()] : row[column.field]\" [name]=\"column.field\"\n [disabled]=\"allowDisabled(column,row)\" (onFocus)=\"onFocusEvent(column, row)\"\n (onBlur)=\"onFocusOutEvent(column, row)\" [mode]=\"\n column.format &&\n column.format.type === 'currency'\n ? 'currency'\n : 'decimal'\n \" [currency]=\"\n column.format &&\n column.format.type === 'currency' &&\n column.format.formatParams &&\n column.format.formatParams.currency\n ? column.format.formatParams.currency\n : 'USD'\n \" [locale]=\"\n column.format &&\n column.format.type === 'currency' &&\n column.format.formatParams &&\n column.format.formatParams.locale\n ? column.format.formatParams.locale\n : 'en-US'\n \" [minFractionDigits]=\"column.format ? setNumericMinMxFraction(column) : '0'\"\n [maxFractionDigits]=\"column.format ? setNumericMinMxFraction(column) : '0'\" [suffix]=\"\n column.format &&\n column.format.type === 'percent' && \n '%'\n \n \">\n </p-inputNumber>\n </span>\n <ng-template #locked_field><span *ngIf=\"!row.isNew\" [attr.data-title-element]=\"column.hoverData ? null : 'self'\">\n {{ row[column.field] }}\n </span></ng-template>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span [attr.data-title-element]=\"column.hoverData ? null : 'self'\"> \n \n {{\n setNumericFormat(column, row)\n }}\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- Button column on Grid -->\n <span *ngSwitchCase=\"'add_button'\">\n <div>\n <button *ngIf=\"!row.hidegridbtn\" pButton type=\"button\" \n [icon]=\"row[column.field+'_obj']?.icon ? row[column.field+'_obj']?.icon : column.icon\"\n [name]=\"column.header\" class=\"merge-btn\" [disabled]=\"allowDisabled(column,row)\"\n [label]=\"row[column.field+'_obj']?.displayText ? row[column.field+'_obj']?.displayText : column.value\"\n class=\"grid-component-grid-add-btn\" (click)=\"onClickButton(column, row)\"></button>\n </div>\n </span> \n \n <!-- Generate File Button column on Grid -->\n <span *ngSwitchCase=\"'generate_file_button'\">\n <div>\n <se-generate-import-file\n [label]=\"row[column.field+'_obj']?.displayText ? row[column.field+'_obj']?.displayText : column.value\"\n [icon]=\"row[column.field+'_obj']?.icon ? row[column.field+'_obj']?.icon : column.icon\"\n [dialogData]=\"column.data\"\n [selectedRow]=\"row\"\n ></se-generate-import-file>\n </div>\n </span> \n\n <!-- Date column on Grid -->\n <!-- calendar selector -->\n <span *ngSwitchCase=\"'date'\" \n [attr.data-title-element]=\"column.hoverData? null: editAllRows ? 'input' : 'self' \" \n >\n <p-cellEditor>\n <ng-template pTemplate=\"input\" >\n <p-calendar\n [minDate]=\"column.minDate\" [maxDate]=\"column.maxDate\"\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty ' + column.field + row[dataKey] : column.field + row[dataKey]\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" (onClose)=\"onFocusOutEvent(column, row)\"\n [appendTo]=\"'body'\" hourFormat=\"12\" [defaultDate]=\"defaultDate\"\n [stepMinute]=\"column.minutesInterval ? column.minutesInterval : 1\" [showTime]=\"column.showTime\"\n [timeOnly]=\"column.timeOnly\" [dateFormat]=\"column.format ? column.format.type : calendarFormat\"\n (keyup)=\"calendarInputValue(column, row)\" (onShow)=\"onClickEvent(column, row)\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ? row[column.field+'_obj']?.displayField : row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"\n [showButtonBar]=\"!column.timeOnly\"></p-calendar>\n </ng-template>\n <ng-template pTemplate=\"output\" >\n {{ setConditionBaseValue(row,column) }}\n </ng-template>\n </p-cellEditor>\n </span>\n\n\n <span *ngSwitchDefault>\n <span [ngSwitch]=\"column.type\">\n <!-- Dropdown column on Grid -->\n <span *ngSwitchCase=\"'dropdown'\" [class]=\"dropdownInput ? '' : 'output-dropdown'\"\n [attr.data-title-element]=\" column.hoverData? null: editAllRows ? '.p-dropdown-label' : 'self'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-dropdown *ngIf=\"!row[column.field+'_obj']?.hidden\" [options]=\"\n row[column.field?.toLowerCase()+'_data']\n ? row[column.field?.toLowerCase()+'_data']\n : column.data\n \"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField?.toLowerCase() ? row[row[column.field+'_obj']?.displayField.toLowerCase()] : row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\" [placeholder]=\"row[column.displayField]\n ? row[column.displayField]\n : row[column.field] ? row[column.field] : 'Select'\" [showClear]=\"row[column.field] ? true : false\"\n [optionLabel]=\"column.optionLabel\" (click)=\"onClickEvent(column, row)\"\n [optionValue]=\"column.optionValue\" [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" (blur)=\"onFocusOutEvent(column, row)\"\n (onChange)=\"onChangeEvent(column, row)\" [filter]=\"column.allowSearch\"></p-dropdown>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span *ngIf=\"!row[column.field+'_obj']?.hidden\">\n {{\n setDropdwonReadOnlyValue(row, column)\n }}\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- MultiSelect column on Grid -->\n <!-- [(ngModel)]=\"row[column.field+'_obj']?.displayField?.toLowerCase() ? row[row[column.field+'_obj']?.displayField.toLowerCase()] :\n row[column.field]\" -->\n <span *ngSwitchCase=\"'multi-select'\" [attr.data-title-element]=\"column.hoverData ? null : '.p-multiselect-label'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-multiSelect [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" type=\"text\"\n [(ngModel)]=\"row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"\n [options]=\"column.data\" [optionLabel]=\"column.optionLabel\" [optionValue]=\"column.optionValue\"\n (onChange)=\"onChangeEvent(column, row)\" (onPanelShow)=\"showOption(column, row)\"\n (click)=\"onClickEvent(column, row)\" [appendTo]=\"'body'\" (blur)=\"onFocusOutEvent(column, row)\">\n </p-multiSelect>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span [attr.data-title-element]=\"column.hoverData ? null : 'self'\" >\n {{\n row[column.displayField]\n ? row[column.displayField] :\n setMultiSelectData(column, row[column.field])\n }}\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"'AutoComplete'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-autoComplete \n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" \n [name]=\"column.header\"\n [suggestions]=\"column.data\" \n (onSelect)=\"autoCompleteSelectedValue(row, column, $event)\"\n [field]=\"column.optionLabel ? column.optionLabel?.toLowerCase() : column.displayField ? column.displayField?.toLowerCase() : column.field?.toLowerCase()\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ? row[row[column.field+'_obj']?.displayField.toLowerCase()] :\n typeOf(row[column.field]) === 'object' && row[column.field]?.text ?\n row[column.field]?.text :\n row[column.field]\"\n [dropdown]=\"column.showOption\" \n (ngModelChange)=\"onChangeEvent(column, row)\"\n (click)=\"onClickEvent(column, row)\" \n (completeMethod)=\"autoSearch($event, column, row)\"\n (onBlur)=\"onFocusOutEvent(column, row, $event)\" \n [disabled]=\"allowDisabled(column,row)\" \n [multiple]=\"true\"\n (keydown.enter)=\"onAutoCompleteKeyEnterEvent($event, column, row)\">\n </p-autoComplete>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span *ngIf=\"row[column.field] && row[column.field][0] && row[column.field][0][column.displayField]\">\n <span *ngFor=\"let value of row[column.field]; let i = index\">\n {{ row[column.field] && row[column.field].length > 1 ? row[column.field].length -1 === i ?\n value[column.displayField] : value[column.displayField] + ';' : value[column.displayField] }}\n </span>\n </span>\n <span *ngIf=\"row[column.field] && row[column.field][0] && row[column.field][0][column.field] && !column.displayField\">\n <span *ngFor=\"let value of row[column.field]; let i = index\">\n {{ row[column.field] && row[column.field].length > 1 ? row[column.field].length -1 === i ?\n value[column.field] : value[column.field] + ';' : value[column.field] }}\n </span>\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n <!-- Add Generate Report Button -->\n <span *ngSwitchCase=\"'report'\">\n <p-cellEditor>\n <ng-template pTemplate=\"output\">\n <se-generate-report-btn [repInfo]=\"setReportName(column, row)\" [label]=\"column.label\"\n [params]=\"setReportParams(column, row)\" [class]=\"column.class\" [showDialog]=\"column.showDialog\"\n [icon]=\"column.icon\" [reportType]=\"column.reportType\"></se-generate-report-btn>\n </ng-template>\n <ng-template pTemplate=\"input\">\n <se-generate-report-btn [repInfo]=\"setReportName(column, row)\" [label]=\"column.label\"\n [params]=\"setReportParams(column, row)\" [icon]=\"column.icon\" [class]=\"column.class\"\n [showDialog]=\"column.showDialog\" [reportType]=\"column.reportType\"></se-generate-report-btn>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <span *ngSwitchDefault [attr.data-title-element]=\"column.hoverData ? null : 'input'\">\n <!-- Input column on Grid -->\n <p-cellEditor> \n <ng-template pTemplate=\"input\">\n <span [style]=\"column.style ? column.style : 'display:flex'\">\n <input [type]=\"row[column.field+'_obj']?.textType?row[column.field+'_obj']?.textType:column.textType?column.textType:'text'\" \n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : 'prime-input'\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\n [(ngModel)]=\"row.undefined ? '' : allowDisabled(column,row) && row[column.displayField] ?\n row[column.displayField] : row[column.field+'_obj'] && row[column.field+'_obj'].value ? row[column.field+'_obj'].value : row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"\n (blur)=\"onFocusOutEvent(column, row)\" (change)=\"onChangeEvent(column, row)\"\n (click)=\"onClickButton(column, row)\" *ngIf=\"column.field !== dataKey; else locked_field\" />\n <span style=\"float:right\" *ngIf=\"column.format=='password'\">\n <i [class]=\"row[column.field+'_obj']?(row[column.field+'_obj'].textType=='password'?'pi pi-eye':'pi pi-eye-slash'):column.textType=='password'?'pi pi-eye':'pi pi-eye-slash'\"\n (click)=\"changePasswordType(column, row)\" [title]=\"column.header\"></i>\n </span> \n </span>\n <ng-template #locked_field><span *ngIf=\"!row.isNew\" [attr.data-title-element]=\"column.hoverData ? null : 'self'\">\n {{ row[column.field] }}\n </span></ng-template>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span [style]=\"column.style ? column.style : 'display:flex'\">\n <span (click)=\"onClickEvent(column, row)\" [attr.data-title-element]=\"column.hoverData ? null : 'self' \" \n [class]=\"row[column.field+'_obj']?.textType ?(row[column.field+'_obj']?.textType=='password' ?'password':'') :column.textType=='password'?'password':''\">\n {{ setTextBoxReadOnlyValue(row, column) }} \n </span>\n <span style=\"float:right\" *ngIf=\"column.format=='password'\">\n <i [class]=\"row[column.field+'_obj']?(row[column.field+'_obj'].textType=='password'?'pi pi-eye':'pi pi-eye-slash'):column.textType=='password'?'pi pi-eye':'pi pi-eye-slash'\"\n [title]=\"column.header\" (click)=\"changePasswordType(column, row)\"></i>\n </span>\n </span>\n </ng-template>\n \n </p-cellEditor>\n </span>\n </span>\n </span>\n \n </span>\n </td>\n <!-- Grid Rows Data Bindings End -->\n\n <!-- Action column on Grid -->\n <td *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && columnActions.length > 0\"\n class=\"for-buttons\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">\n <span class=\"action-btn\" *ngFor=\"let action of columnActions\">\n <i [title]=\"action.tooltip\" [class]=\"action.icon\" (click)=\"handleActionClick($event, action, row)\"></i>\n </span>\n </td>\n <td\n *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && useInlineCRUD && (deleteRowPermission || editRowPermission)\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"\n class=\"for-buttons\"\n [ngClass]=\"disabledSaveBtn ? 'hide-clear-filter-button' : ''\">\n <span class='setActionColumnWidth'>\n <se-grid-row-actions [editing]=\"editing\" [editRowPermission]=\"editRowPermission\"\n [deleteRowPermission]=\"deleteRowPermission\" [hideDeleteBtn]=\"hideDeleteBtn\" [hideEditBtn]=\"hideEditBtn\"\n [row]=\"row\" (onRowEditInitBtn)=\"onRowEditInit($event)\" (deleteRecordBtn)=\"deleteRecord($event)\"\n (onRowEditSaveBtn)=\"onRowEditSave($event)\" (onRowEditCancelBtn)=\"onRowEditCancel($event, ri)\"\n [editAllRows]=\"editAllRows\">\n </se-grid-row-actions>\n </span>\n </td>\n </tr>\n </ng-template>\n\n <!-- Footer columns on Grid -->\n <ng-template pTemplate=\"footer\">\n <tr *ngIf=\"aggregateFooter\">\n <td\n *ngIf=\"setActionColumnAsFirst && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></td>\n <td *ngIf=\"allowSelection\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></td>\n <td *ngFor=\"let outerColumn of selectedColumns\" class=\"grid-component-outer-column\" [style]=\"outerColumn.style\">\n <div *ngFor=\"let innerColumn of selectedColumns\">\n <div *ngFor=\"let aggr of innerColumn?.aggregate\">\n <div\n *ngIf=\"aggr.aggrValue?.length && ((!aggr.displayField && innerColumn.field?.toLowerCase() === outerColumn.field?.toLowerCase()) ||\n aggr.displayField && aggr.displayField?.toLowerCase() === outerColumn.field?.toLowerCase())\">\n <div [innerHTML]=\"aggr.aggrValue\">\n </div>\n </div>\n </div> \n </div>\n </td>\n <td\n *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && useInlineCRUD && (deleteRowPermission || editRowPermission)\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"\n [ngClass]=\"disabledSaveBtn ? 'hide-clear-filter-button' : ''\"></td>\n </tr>\n </ng-template>\n\n <!-- Footer for Empty Message columns on Grid -->\n <ng-template pTemplate=\"emptymessage\">\n <tr class=\"grid-component no-records-found\">\n <td [attr.colspan]=\"selectedColumns?.length + 1\">{{totalRecords==0? 'No records found':''}}</td>\n </tr>\n </ng-template>\n </p-table> \n <p-overlayPanel\n [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>", styles: [":host ::ng-deep .table-layout-auto table{table-layout:auto;width:-moz-max-content!important;width:max-content!important}:host ::ng-deep .table-layout-auto .p-datatable-resizable-table>.p-datatable-thead>tr>th{min-width:100px}:host ::ng-deep .prime-input{font-family:Roboto;font-size:12px;color:#484848;background:#ffffff;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:3px;border:none}:host ::ng-deep .prime-input:focus{outline:none;border-color:transparent;box-shadow:0 0 0 2px #0003}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-top:28px;margin-left:18px}:host ::ng-deep .p-multiselect{max-width:100%}:host ::ng-deep .password{-webkit-text-security:disc}:host ::ng-deep .p-calendar .p-inputtext{width:100%}:host ::ng-deep .column-filter-clear-button{display:none}:host ::ng-deep .apply-filter-btn{float:unset!important}:host ::ng-deep .hide-table-filter .pi-filter:before{display:none}:host ::ng-deep .hide-table-filter .p-column-filter-menu-button,:host ::ng-deep .hide-table-filter .p-column-filter-clear-button{display:none!important}:host ::ng-deep .hide-filter-icon .column-filter-menu-button{display:none}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.custom-link{color:#205dcf;font-size:12px}.custom-link:not(.disabled-link){cursor:pointer}.mr-2{margin-right:10px;display:block}.highlighted-row{background-color:#dee2e6!important}.hide-clear-filter-button{display:none!important}:host ::ng-deep .p-datatable-resizable-table>.p-datatable-thead>tr>th{overflow:visible!important}:host ::ng-deep .p-multiselect .p-multiselect-trigger{top:6px}\n"] }]
|
|
3132
|
+
args: [{ selector: 'se-grid', template: "<div class=\"grid-component-wrapper\">\n<p-confirmDialog [style]=\"{ width: '50vw' }\" *ngIf=\"useInlineCRUD\" key=\"handleInlineCRUD\"></p-confirmDialog>\n<p-confirmDialog class=\"grid-component-confirm-dialog\" *ngIf=\"columnActions.length > 0\"\n key=\"handlecolumnActions\"></p-confirmDialog>\n<div class=\"global-filter-buttons-wrapper\">\n\n <!-- button for apply value on Grid -->\n <button *ngIf=\"((filtering && !hideFilter ) || showFilterbtn)\" pButton type=\"button\" icon=\"pi pi-search\" (click)=\"applyGridFilterBtn()\"\n [class]=\"\n searchGridFilter ? 'p-button-success apply-filter-btn filter-btn' : 'hide-clear-filter-button apply-filter-btn filter-btn'\n \"></button>\n\n <!-- button for clear value on Grid -->\n <button *ngIf=\"((filtering && !hideFilter )|| showFilterbtn)\" pButton id=\"clearGridFilterValuesButton\" type=\"button\"\n icon=\"pi pi-replay\" (click)=\"cleargridFiltersValue()\" [class]=\"\n clearGridFilter ? 'filter-btn' : 'hide-clear-filter-button filter-btn'\n \" class='global-refresh global-btn'\n ></button>\n\n <!-- button for save all grid at once -->\n <button pButton *ngIf=\"editAllRows && editRowPermission\" id=\"saveAllGridValues\"\n icon=\"pi pi-check\" [label]=\"'Save'\"\n [class]=\"hideGridSaveButton ? 'hide-clear-filter-button save-all-grid' : 'ui-button-info save-all-grid'\" type=\"button\"\n (click)=\"saveAllRowsAtOnce()\"></button>\n\n <!-- button for cancel all grid at once -->\n <button pButton *ngIf=\"editAllRows && !hideGridCancelButton\" id=\"editBtnGlobalvalues\" type=\"button\" [label]=\"'Cancel'\"\n icon=\"pi pi-times\" class=\"ui-button-info\" (click)=\"cancelAllRowsAtOnce()\"></button>\n\n <!-- header Button for multiSelect on Grid -->\n <span *ngIf=\"allowColumnToggle\" observeCheckbox>\n <p-multiSelect [showToggleAll]=\"false\" optionDisabled=\"false\" [options]=\"selectedToggleColumns\" [(ngModel)]=\"selectedColumns\" optionLabel=\"header\"\n selectedItemsLabel=\"{0} columns selected\" class=\"grid-component-multiselect-header-button\" placeholder=\"Choose Columns\">\n </p-multiSelect>\n </span>\n\n <!-- header Button for Adding new Row on Grid -->\n <button pButton *ngIf=\"useInlineCRUD && addRowPermission && !hideAddBtn\" type=\"button\" [label]=\"'Add'\" pAddRow\n [table]=\"componentTableRef\" [newRow]=\"newGridRow\" [id]=\"dataKey\" pTooltip=\"Add New Row\" tooltipPosition=\"bottom\"\n icon=\"pi pi-plus\" [class]=\"'ui-button-info global-add-btn'+gridName\" (click)=\"addNewRow(newGridRow, true)\" pRipple></button>\n\n \n <!-- header Button for Excel File on Grid -->\n <button *ngIf=\"allowExportToExcel\" type=\"button\" pButton icon=\"pi pi-file-excel\" (click)=\"exportExcel()\"\n class=\"p-button-success\" pTooltip=\"Export to Excel\" tooltipPosition=\"bottom\" pRipple></button>\n\n<!-- header Button for PDF File on Grid -->\n<button *ngIf=\"allowExportToPdf\" type=\"button\" pButton icon=\"pi pi-file-pdf\" (click)=\"exportPdf()\"\n class=\"p-button-warning mr-2 ml-2\" pTooltip=\"Export to Pdf\" tooltipPosition=\"bottom\" pRipple></button>\n\n <!-- <div *ngFor=\"let reportButton of reportButtons\" class=\"ui-button-info mr-2 ml-2\">\n <se-generate-report-btn *ngIf =\"!reportButton.hidden\"[repId]=\"reportButton.reportId\" [label]=\"reportButton.label\" [params]=\"reportButton.params\"\n [showDialog]=\"reportButton.showDialog\"></se-generate-report-btn>\n </div> -->\n\n <ng-content></ng-content>\n\n <ng-container *ngFor=\"let reportButton of reportButtons\">\n <se-generate-report-btn *ngIf =\"!reportButton.hidden\"[repInfo]=\"reportButton\" [label]=\"reportButton.label\" [params]=\"reportButton.params\" [icon]=\"reportButton.icon\" [class]=\"reportButton.class\"\n [showDialog]=\"reportButton.showDialog\" [reportType]=\" reportButton.reportType\" [reportHeader]=\"reportButton.reportHeader\" [reportFooter]=\"reportButton.reportFooter\"></se-generate-report-btn>\n </ng-container>\n\n</div>\n\n <p-table *ngIf=\"!isGridHidden\" id=\"my-table\" [value]=\"rowsData\" [columns]=\"selectedColumns\" sortMode=\"multiple\"\n [lazy]=\"useServerSideEvents\" [paginator]=\"pagination\" [alwaysShowPaginator]=\"pagination && totalRecords > 0\" \n [class]=\"' grid-component-main-table ' + (pagination || !rowsData.length ? ' pagination ' : '') + (tableStyle.includes('width') ? ' hasTableWidthStyle ' : '') + (autoResize ? '' : 'table-layout-auto') \"\n (onColResize)=\"onColumnResize($event,dt)\" [resizableColumns]=\"true\"\n responsiveLayout=\"scroll\" columnResizeMode=\"expand\"\n [rows]=\"defaultRows\" [totalRecords]=\"totalRecords\" [rowsPerPageOptions]=\"setPaginationLength\"\n [showCurrentPageReport]=\"showCurrentPageReport\" currentPageReportTemplate=\"Showing {first} to {last} of {{\n totalRecords\n }} entries\" [loading]=\"!setGridRefreshTime ? loading : false\"\n (onSort)=\"sortDisabled ?? handleSortChange($event)\" (onFilter)=\"handleFilterChange($event)\"\n (onLazyLoad)=\"autoLoadData ? handleServerSideEvents($event, dt) : ''\" (onPage)=\"gridService.columnFocusedOut ? showConfirmation($event) : handleServerSidePagination($event)\" #dt\n [dataKey]=\"dataKey\" [(selection)]=\"selectedRows\" selectionMode=\"multiple\" [scrollable]=\"scrollable\" \n [tableStyle]=\"tableStyle\"\n [scrollHeight]=\"scrollHeight\"\n editMode=\"row\" [editingRowKeys]=\"editingRowKeys\" [rowHover]=\"rowHover\"\n [ngClass]=\"setClassaAndId(dt)\">\n\n <div *ngIf=\"rowActions.length > 0 && rowActions.length > 0\" class=\"flex justify-content-end\">\n <span *ngFor=\"let rowAction of rowActions\">\n <button pButton type=\"button\" [label]=\"rowAction.title\" [class]=\"rowAction.class\"\n (click)=\"rowAction.onClick(selectedRows)\"></button>\n </span>\n </div>\n\n <!-- header columns on Grid -->\n <ng-template pTemplate=\"header\" let-cols>\n <tr>\n <th pResizableColumn *ngIf=\"allowSelection && selectionType === 'multiple'\" class=\"grid-component-selection\" id=\"{{allowSelectionHeader}}\">\n <span class=\"th-content-wrapper\">\n <div class=\"grid-component-table-header-inner-div-2\n table-header-inner-div div-last-inner-html-is-icon\">\n <span class=\"flex-grow-1\"> {{allowSelectionHeader}} </span>\n <p-tableHeaderCheckbox *ngIf=\"selectionType === 'multiple'\" binary=\"true\"\n (click)=\"multiCheckBoxOnclick(rowsData, $event)\"></p-tableHeaderCheckbox>\n </div>\n </span>\n </th>\n <th pResizableColumn *ngIf=\"allowSelection && selectionType === 'single'\" id=\"Select\"\n data-title-element=\"self\" class=\"grid-component-selection\">\n Select\n </th>\n <th pResizableColumn id=\"Actions\"\n *ngIf=\"setActionColumnAsFirst && !disabledSaveBtn && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn' \" data-title-element=\"self\" >\n Actions\n </th>\n <th pResizableColumn *ngFor=\"let column of cols\" [style.width]=\"column?.columnWidth ? column?.columnWidth+'px' : column?.customWidth+'px'\" id=\"{{column.header}}\" [pSortableColumn]=\"column.field\"\n [class]=\"column.type === 'boolean' ? 'checkbox-th' : ''\"\n [pSortableColumnDisabled]=\"sortDisabled && useServerSideEvents ? true : column.sorting === false\"\n class=\"column?.type === 'multiple' ? 'grid-component-select-th-column-type-multiple' : ''\">\n <span class=\"th-content-wrapper\">\n <div class=\"grid-component-table-header-inner-div-1 table-header-inner-div div-last-inner-html-is-icon\"> \n <span [attr.data-title-element]=\"'self'\" [class]=\"'flex-grow-1'\" >{{ column.header }}\n <span *ngIf=\"column.isRequired\" class=\"grid-component required-star\">*</span>\n </span>\n <p-sortIcon *ngIf=\"column.sorting !== false && column?.type !== 'multiple'\"\n [field]=\"column.field\"></p-sortIcon>\n </div>\n </span>\n </th>\n <th pResizableColumn id=\"Actions\"\n *ngIf=\"!setActionColumnAsFirst && !disabledSaveBtn && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\" data-title-element=\"self\" >Actions</th>\n </tr>\n <tr *ngIf=\"filtering && !hideFilter\">\n <th pResizableColumn *ngIf=\"allowSelection\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></th>\n <th pResizableColumn *ngIf=\"setActionColumnAsFirst && !disabledSaveBtn && useInlineCRUD\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">\n </th>\n <th pResizableColumn *ngFor=\"let column of cols\" [style.width]=\"column?.columnWidth ? column?.columnWidth+'px' : column?.customWidth+'px'\" id=\"{{column.header}}\" [ngSwitch]=\"column?.filter?.type\" \n [class]=\"hideFilterOptions ? 'hide-table-filter temp' : 'temp'\">\n <span *ngIf=\"column.filtering !== false\" [class]=\"column.filter?.showFilter ? '' : 'hide-filter-icon'\">\n <!-- Text input on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [type]=\"'text'\" [field]=\"column.field\" *ngSwitchCase=\"'input'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <input type=\"text\" [(ngModel)]=\"column.filterValue\" [class]=\"column?.field?.toLowerCase()\" (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n (blur)=\"setFilterFocusOut(column, filter, $event)\"\n (keyup)=\"removingFilters($event, column);backspaceEvent($event, column)\" pInputText />\n </ng-template>\n </p-columnFilter>\n\n <!-- Numeric input on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [type]=\"'numeric'\" [field]=\"column.field\" *ngSwitchCase=\"'numeric_input'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-inputNumber [(ngModel)]=\"column.filterValue\" [class]=\"column?.field?.toLowerCase()\" (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n (onBlur)=\"setFilterFocusOut(column, filter, $event)\"\n (keyup)=\"removingFilters($event, column);backspaceEvent($event, column)\"></p-inputNumber>\n </ng-template>\n </p-columnFilter>\n\n <!-- lookup input on Header For Filter-->\n <p-columnFilter\n class=\"no-filter-icon\"\n [type]=\"'text'\"\n [field]=\"column.field\"\n *ngSwitchCase=\"'lookup_input'\"\n >\n <ng-template\n pTemplate=\"filter\"\n let-value\n let-filter=\"filterCallback\"\n >\n <div class=\"close-icon-wrapper grid-component lookup-filter-wrapper\">\n <div class=\"lookup-filter-input-wrapper\"> \n <input\n [id]=\"column.field?.toLowerCase() + '_filter'\"\n class=\"grid-component lookup-filter\"\n autocomplete=\"off\"\n type=\"text\"\n [(ngModel)]=\"column.filterValue\"\n (click)=\"setFilterLookup(column)\"\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n (blur)=\"setFilterFocusOut(column, filter, $event)\"\n (keyup)=\"removingFilters($event, column);backspaceEvent($event, column)\"\n pInputText\n />\n </div> \n <div class=\"direct-wrapper-close-icon-lookup\">\n <button\n *ngIf=\"column.filterValue\"\n icon=\"pi pi-times\"\n pButton\n type=\"button\"\n (click)=\"lookupClearValue(column)\">\n </button>\n </div>\n </div>\n </ng-template>\n </p-columnFilter>\n\n <!-- checkbox on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" type=\"boolean\" [field]=\"column.field\" *ngSwitchCase=\"'checkbox'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-checkbox [binary]=\"true\" [disabled]=\"column.disabled\" [(ngModel)]=\"column.filterValue\"\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n (onChange)=\"setFilterFocusOut(column, filter, $event)\" (click)=\"clickCheckBoxFilter(column)\"\n (keydown)=\"backspaceEvent($event, column)\">\n </p-checkbox>\n </ng-template>\n </p-columnFilter>\n\n <!-- multiSelect on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [field]=\"column.field\" matchMode=\"in\" [showMenu]=\"false\" *ngSwitchCase=\"'multi-select'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-multiSelect [(ngModel)]=\"column.filterValue\" [options]=\"column.filter.data || []\" \n [appendTo]=\"'body'\" [name]=\"column.field\"\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\"\n [optionValue]=\"column.optionValue\"\n [optionLabel]=\"column.optionLabel\"\n (onChange)=\"setFilterFocusOut(column, filter, $event)\" \n (keydown)=\"backspaceEvent($event, column)\">\n \n </p-multiSelect>\n </ng-template>\n </p-columnFilter>\n\n <!-- dropdown on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [field]=\"column.field\" matchMode=\"in\" [showMenu]=\"false\" *ngSwitchCase=\"'dropdown'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-dropdown [showClear]=\"true\" [placeholder]=\"'Select'\" [filter]=\"column.allowSearch\"\n [(ngModel)]=\"column.filterValue\" (keyup.enter)=\"applyDropdownFilter(filter, $event)\"\n [options]=\"column.filter.data || []\"\n (onChange)=\"searchDropdownFilter(filter, $event, column)\"></p-dropdown>\n </ng-template>\n </p-columnFilter>\n\n <!-- calendar on Header For Filter-->\n <p-columnFilter class=\"no-filter-icon\" [field]=\"column.field\" matchMode=\"in\" [showMenu]=\"false\" *ngSwitchCase=\"'calendar'\">\n <ng-template pTemplate=\"filter\" let-value let-filter=\"filterCallback\">\n <p-calendar [placeholder]=\"'Select-Date'\" [(ngModel)]=\"column.filterValue\"\n (keyup.enter)=\"applyEnterEvent(filter, $event, column)\" appendTo=\"body\" (onSelect)=\"selectDate(column)\"\n [inputId]=\"column.field\" hourFormat=\"12\" (keyup.backspace)=\"removeNullCalendar(column, filter, $event)\"\n [showButtonBar]=\"true\" (onClose)=\"setFilterFocusOut(column, filter, $event)\"\n (keydown)=\"backspaceEvent($event, column)\" (onClearClick)=\"backspaceEvent($event, column)\">\n </p-calendar>\n </ng-template>\n </p-columnFilter>\n\n <!-- Default Filter For Header -->\n <p-columnFilter class=\"no-filter-icon\" [type]=\"\n column.type && column.type !== 'link' ? column.type : 'text'\n \" [field]=\"column.field\" display=\"menu\" *ngSwitchDefault>\n </p-columnFilter>\n </span>\n </th>\n <th pResizableColumn\n *ngIf=\"!setActionColumnAsFirst && !disabledSaveBtn && columns?.length > 0 && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></th>\n </tr>\n </ng-template>\n\n <!-- Body columns on Grid -->\n <ng-template pTemplate=\"body\" let-row let-editing=\"editing\" let-ri=\"rowIndex\">\n <tr \n [style]=\"rowStyle\"\n [ngClass]=\"row?.highlightrow ? 'highlighted-row' : ''\"\n [class]=\"wordWrap ? 'p-selectable-row wordWrapTrue' : 'wordWrapFalse p-selectable-row'\" (click)=\"selectedRowRecord = row\"\n [pEditableRow]=\"row\" #gridRow [id]=\"row[dataKey]\">\n <td *ngIf=\"allowSelection\" class=\"grid-component-selection\">\n <p-tableRadioButton [value]=\"row\" *ngIf=\"selectionType === 'single'\"\n (click)=\"multiCheckBoxOnclick(row , $event, true)\"></p-tableRadioButton>\n <p-tableCheckbox [value]=\"row\" *ngIf=\"selectionType === 'multiple'\"\n (click)=\"multiCheckBoxOnclick(row, $event)\"></p-tableCheckbox>\n </td>\n\n <!-- first actions column -->\n <td *ngIf=\"setActionColumnAsFirst && columnActions.length > 0\">\n <span class=\"action-btn\" *ngFor=\"let action of columnActions\">\n <i [title]=\"action.tooltip\" [class]=\"action.icon\" (click)=\"handleActionClick($event, action, row)\"></i>\n </span>\n </td>\n <td *ngIf=\"setActionColumnAsFirst && useInlineCRUD && (deleteRowPermission || editRowPermission)\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"\n [ngClass]=\"disabledSaveBtn ? 'hide-clear-filter-button' : ''\">\n <span class=\"setActionColumnWidth\">\n <se-grid-row-actions [editing]=\"editing\" [editRowPermission]=\"editRowPermission\"\n [deleteRowPermission]=\"deleteRowPermission\" [hideDeleteBtn]=\"hideDeleteBtn\" [hideEditBtn]=\"hideEditBtn\"\n [row]=\"row\" (onRowEditInitBtn)=\"onRowEditInit($event)\" (deleteRecordBtn)=\"deleteRecord($event)\"\n (onRowEditSaveBtn)=\"onRowEditSave($event)\" (onRowEditCancelBtn)=\"onRowEditCancel($event, ri)\"\n [editAllRows]=\"editAllRows\">\n </se-grid-row-actions>\n </span>\n </td>\n\n <!-- Grid Rows Data Bindings Start -->\n <td *ngFor=\"let column of selectedColumns\" [ngSwitch]=\"column.type\" [style]=\"column.style \" \n (mouseenter)=\"(column.hoverData && column.hoverData.component) && addDynamicPanelOverlayComponent(column.hoverData, overlayPanel, $event, row)\"\n (mouseleave)=\"(column.hoverData && column.hoverData.component) && mouseLeaveEvent(overlayPanel)\"\n >\n <span class=\"td-content-wrapper\" [style]=\"column.style\">\n\n <!-- Boolean column on Grid -->\n <span *ngSwitchCase=\"'boolean'\"\n >\n <td *ngIf=\"!editing && row[column.field + '_obj']?.show != false\">\n <p-checkbox \n [disabled]=\"!column.allowEdit ?? true\" [binary]=\"true\" (click)=\"onClickEvent(column, row)\"\n (ngModelChange)=\"checkBoxChangeEvent($event, column, row)\" (blur)=\"onFocusOutEvent(column, row)\" \n [(ngModel)]=\" \n row[column.field] &&\n (row[column.field].toString() === '1' ||\n row[column.field].toString().toLowerCase() === 'true' ||\n row[column.field].toString().toLowerCase() === 'y'||\n ( row[column.field].text && (row[column.field]?.text?.toString() === '1' ||\n row[column.field]?.text?.toString()?.toLowerCase() === 'true' ||\n row[column.field]?.text?.toString()?.toLowerCase() === 'y')))\n ? Checked\n : unChecked\n \">\n </p-checkbox>\n </td>\n <td *ngIf=\"editing\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <!-- for edit checkBox -->\n <p-checkbox (click)=\"onClickEvent(column, row)\" (ngModelChange)=\"checkBoxChangeEvent($event, column, row)\"\n [disabled]=\"allowDisabled(column,row)\" [binary]=\"true\" [(ngModel)]=\"\n row[column.field] && \n (row[column.field].toString() === '1' ||\n row[column.field].toString().toLowerCase() === 'true' ||\n row[column.field].toString().toLowerCase() === 'y' ||\n ( row[column.field].text && (row[column.field]?.text?.toString() === '1' ||\n row[column.field]?.text?.toString()?.toLowerCase() === 'true' ||\n row[column.field]?.text?.toString()?.toLowerCase() === 'y')))\n ? editModeChecked\n : editModeunCkecked\n \" (blur)=\"onFocusOutEvent(column, row)\"></p-checkbox>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ row[column.field] }}\n </ng-template>\n </p-cellEditor>\n </td>\n </span>\n\n <!-- link column on Grid -->\n <span [attr.data-title-element]=\"column.hoverData ? null : 'a,input'\" *ngSwitchCase=\"'link'\">\n <!-- link column for HyperLink Case -->\n <span *ngIf=\"column.allowSave === false\">\n <span *ngIf=\"column.target !== '_self'\" [style]=\"column.style\"\n [attr.data-title-element]=\"column.hoverData ? null : 'a'\"\n class=\"custom-link\"\n [class]=\"allowDisabled(column,row) ? 'disabled-link' : ''\">\n\n <a class=\"d-inline\" [href]=\"column.disabled?'':row[column.field + '_obj']?.hyperlink\" target=\"_blank\">\n <i *ngIf=\"column.icon &&!row[column.field+'_obj']?.hideFieldValue; else noIcon\" [class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n <span (click)=\"column?.onClick ? onClickEvent(column, row) : ''\">\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </span>\n </ng-template>\n </a>\n \n </span>\n <span *ngIf=\"column.target === '_self'\" [style]=\"column.style\"\n [attr.data-title-element]=\"column.hoverData ? null : 'a'\" class=\"custom-link\"\n [class]=\" allowDisabled(column,row) ? 'disabled-link' : ''\">\n\n <a class=\"d-inline\" [href]=\"column.disabled?'':row[column.field + '_obj']?.hyperlink\" [target]='column.target'>\n <i *ngIf=\"column.icon &&!row[column.field+'_obj']?.hideFieldValue; else noIcon\" [class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n <span (click)=\"column?.onClick ? onClickEvent(column, row) : ''\">\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </span>\n </ng-template>\n </a>\n\n </span>\n </span>\n <!-- link column for Edit Case -->\n <span *ngIf=\"column.allowSave || column.allowSave === undefined\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <span\n *ngIf=\"(column.editable === true ) && (column.editLink === true )\">\n <input *ngIf=\"!row.isNew\" pInputText (click)=\"column?.onClick ? onClickEvent(column, row) : ''\" type=\"text\"\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"row[column.field + '_obj']?.hideFieldValue ? '' : row[column.field + '_obj']?.displayText ? row[column.field + '_obj']?.displayText : column.displayText ? column.displayText : row[column.field]\"\n (blur)=\"onFocusOutEvent(column, row)\"\n (change)=\"onChangeEvent(column, row)\" />\n <input pInputText *ngIf=\"row.isNew\" type=\"text\" (click)=\"column?.onClick ? onClickEvent(column, row) : ''\"\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ? row[column.field+'_obj']?.displayField : row[column.field]\"\n (blur)=\"onFocusOutEvent(column, row)\"\n (change)=\"onChangeEvent(column, row)\" />\n </span>\n <!-- <span *ngIf=\"column.editable === false|| column.editable === undefined\" >\n <a class=\"custom-link\" (click)=\"onClickEvent(column, row)\" [href]=\"row[column.field + '_obj']?.hyperlink\" [target]='column.target'\n [class]=\"allowDisabled(column,row) ? 'disabled-link' : ''\">\n <i *ngIf=\"column.icon && !row[column.field+'_obj']?.hideFieldValue; else noIcon\"[class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </ng-template>\n \n </a>\n </span> -->\n <span *ngIf=\"(column.editLink === false|| column.editLink === undefined)&&(column.editable === false|| column.editable === undefined)\">\n <a class=\"d-inline\" [href]=\"row[column.field + '_obj']?.hyperlink\" [target]=\"column.target ? column.target : '_blank'\"\n [class]=\"column.editable === false ? '' : allowDisabled(column,row) ? 'disabled-link' : ''\">\n <i *ngIf=\"column.icon && !row[column.field+'_obj']?.hideFieldValue; else noIcon\"[class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n <span (click)=\"column?.onClick ? onClickEvent(column, row) : ''\">\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </span> \n </ng-template>\n \n </a>\n </span>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span [style]=\"column.style\" class=\"custom-link\" [class]=\"column.editable === false || allowDisabled(column,row) ? 'disabled-link' : ''\">\n <a class=\"d-inline\" [href]=\"column.disabled?'':row[column.field + '_obj']?.hyperlink\" [target]=\"column.target ? column.target : '_blank'\"\n >\n <i *ngIf=\"column.icon&& !row[column.field+'_obj']?.hideFieldValue; else noIcon\" [title]=\"column.header\" [class]=\"column.icon\"></i>\n <ng-template #noIcon>\n <span (click)=\"column?.onClick ? onClickEvent(column, row) : ''\">\n {{\n row[column.field+'_obj']?.hideFieldValue?'':\n setConditionBaseValue(row, column)\n }}\n </span>\n </ng-template>\n </a>\n\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n </span>\n\n <!-- Iframe column on Grid -->\n <span *ngSwitchCase=\"'iframe'\">\n <span class=\"custom-link\" (click)=\"gridIFrame(column, row[column.field + '_obj']?.hyperlink, row)\" [title]=\"\n row[column.field + '_obj'] &&\n (row[column.field + '_obj'].displayText === null || row[column.field + '_obj'].displayText === '')\n ? row[column.field] : row[column.field + '_obj']?.displayText\n ? row[column.field + '_obj'].displayText\n : column.displayText\n ? column.displayText\n : row[column.field]\n\n \"\n > \n <i *ngIf=\"column.icon; else noIcon\"[class]=\"column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>\n {{\n row[column.field + '_obj'] &&\n (row[column.field + '_obj'].displayText === null || row[column.field + '_obj'].displayText === '')\n ? row[column.field] : row[column.field + '_obj']?.displayText\n ? row[column.field + '_obj'].displayText\n : column.displayText ? column.displayText : row[column.field]\n }}\n </ng-template>\n </span>\n </span>\n\n <!-- dialog column on Grid -->\n <span *ngSwitchCase=\"'dialog'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <span\n *ngIf=\"column?.filter?.type !== 'calendar' && !row?.hidegridbtn\" \n \n >\n <span *ngIf=\"column.editable === true && !row[column.field+'_obj']?.hideFieldValue\">\n <input [attr.data-title-element]=\"column.hoverData ? null : 'self'\"\n readonly\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\n type=\"text\"\n pInputText\n (click)=\"selectLookupField(column, row)\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ?\n row[row[column.field+'_obj']?.displayField?.toLowerCase()] : \n row[column.field]\"\n [name]=\"row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"\n (blur)=\"onFocusOutEvent(column, row)\"\n />\n \n </span>\n <span [attr.data-title-element]=\"column.hoverData ? null : 'self'\"\n *ngIf=\"column.editable === false || column.editable === undefined\n \" class=\"custom-link\" [style]=\"column.style\"\n [class]=\"\n allowDisabled(column,row) ? 'disabled-link' : ''\n \" (click)=\"openGridDialog(column, row, $event)\">\n <i *ngIf=\"(column.icon || row[column.field+'_obj']?.icon) && !row[column.field+'_obj']?.hideFieldValue ; else noIcon\"\n [class]=\"row[column.field+'_obj']?.icon ? row[column.field+'_obj']?.icon : column.icon\" [title]=\"column.header\"></i>\n <ng-template #noIcon>{{ (!column.displayText && row.isNew ) || row[column.field+'_obj']?.hideFieldValue ? '' : setConditionBaseValue(row, column)\n }}</ng-template>\n </span>\n </span>\n <span *ngIf=\"column?.filter?.type === 'calendar' && column.editable === true\" [attr.data-title-element]=\"column.hoverData ? null : 'input'\">\n <p-calendar [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" (onClose)=\"onFocusOutEvent(column, row)\"\n [minDate]=\"column.minDate\" [maxDate]=\"column.maxDate\"\n [appendTo]=\"'body'\" hourFormat=\"12\" [showTime]=\"column.showTime\" (click)=\"onClickEvent(column, row)\"\n [timeOnly]=\"column.timeOnly\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ?\n row[row[column.field+'_obj']?.displayField.toLowerCase()] : row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"></p-calendar>\n </span>\n <span *ngIf=\"column?.filter?.type === 'calendar' && !column.editable\" class=\"custom-link\"\n [class]=\"row.disabled || allowDisabled(column,row) ? 'disabled-link' : ''\"\n (click)=\"openGridDialog(column, row, $event)\"\n >{{ row[column.field+'_obj']?.hideFieldValue ? '' : setConditionBaseValue(row, column) }}\n </span>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span class=\"custom-link\" [style]=\"column.style\"\n [class]=\"row.disabled || allowDisabled(column,row) ? 'disabled-link' : ''\"\n (click)=\"openGridDialog(column, row, $event)\"\n [attr.data-title-element]=\"column.hoverData ? null : 'self'\">\n <i *ngIf=\"(column.icon || row[column.field+'_obj']?.icon) && !row[column.field+'_obj']?.hideFieldValue ; else noIcon\"[title]=\"column.header\" [class]=\"row[column.field+'_obj']?.icon ? row[column.field+'_obj']?.icon : column.icon\"></i>\n <ng-template #noIcon>{{ row[column.field+'_obj']?.hideFieldValue ? '' : setConditionBaseValue(row, column) }}</ng-template>\n <!-- {{ setConditionBaseValue(row, column) }}\n *ngIf=\"!row[column.field + '_secondType'] && !row.hidegridbtn\" -->\n\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- test -->\n <!-- lookup Input column on Grid -->\n <span *ngSwitchCase=\"'lookup_input'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <div class=\"close-icon-wrapper\">\n <input [attr.data-title-element]=\"column.hoverData ? null : 'self'\" readonly type=\"text\"\n [(ngModel)]=\"row?.isNew || row?.isnew ? typeOf(row[column.field]) === 'object' ? row[column.field]?.text : row[column.field] : row[column.field+'_obj']?.displayField ? row[row[column.field+'_obj']?.displayField?.toLowerCase()] :\n typeOf(row[column.field+'_obj']?.text) === 'object' && row[column.field+'_obj']?.text?.hasOwnProperty('text') ? row[column.field+'_obj']?.text?.text : \n column.displayField ? row[column.displayField?.toLowerCase()] : row[column.field]\n \"\n (keyup.tab)=\"selectLookupField(column, row)\" [disabled]=\"allowDisabled(column,row)\"\n (click)=\"selectLookupField(column, row)\" [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : 'prime-input'\" (blur)=\"onFocusOutEvent(column, row)\" />\n <div *ngIf=\"!allowDisabled(column,row)\"><button *ngIf=\"row[column.field] && typeOf(row[column.field]) === 'object'\n ? row[column.field].text\n : row[column.field] && !column.disabled\" icon=\"pi pi-times\" pButton type=\"button\"\n (click)=\"lookupClearValue(column,row)\"></button></div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"output\" >\n <span *ngIf=\"column.linkId\" >\n <a [attr.data-title-element]=\"column.hoverData ? null : 'self'\" [href]=\"row[column.field + '_obj']?.hyperlink\" [target]=\"column.target === '_self' ? '' : '_blank'\">\n {{\n setLookupReadOnlyValue(row, column)\n }}\n </a>\n </span>\n <span [attr.data-title-element]=\"column.hoverData ? null : 'self'\" *ngIf=\"!column.linkId\" [style]=\"column.style\" [class]=\"column.component && column.editLink === true ? 'custom-link' : ''\"\n (click)=\"openLookupHyperlink(column, row)\" >\n {{\n setLookupReadOnlyValue(row, column)\n }}\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- Numeric Input column on Grid -->\n <span *ngSwitchCase=\"'numeric'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <!-- for Currency && Decimal && Percent -->\n <span [attr.data-title-element]=\"column.hoverData ? null : 'input'\" class=\"input-number\">\n <p-inputNumber [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" [class]=\"\n row[column.field.toLowerCase()+'_obj']?.errorMessage\n ? 'ng-invalid ng-dirty'\n : 'form-control'\n \" [showButtons]=\"false\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ? row[row[column.field+'_obj']?.displayField?.toLowerCase()] : row[column.field]\" [name]=\"column.field\"\n [disabled]=\"allowDisabled(column,row)\" (onFocus)=\"onFocusEvent(column, row)\"\n (onBlur)=\"onFocusOutEvent(column, row)\" [mode]=\"\n column.format &&\n column.format.type === 'currency'\n ? 'currency'\n : 'decimal'\n \" [currency]=\"\n column.format &&\n column.format.type === 'currency' &&\n column.format.formatParams &&\n column.format.formatParams.currency\n ? column.format.formatParams.currency\n : 'USD'\n \" [locale]=\"\n column.format &&\n column.format.type === 'currency' &&\n column.format.formatParams &&\n column.format.formatParams.locale\n ? column.format.formatParams.locale\n : 'en-US'\n \" [minFractionDigits]=\"column.format ? setNumericMinMxFraction(column) : '0'\"\n [maxFractionDigits]=\"column.format ? setNumericMinMxFraction(column) : '0'\" [suffix]=\"\n column.format &&\n column.format.type === 'percent' && \n '%'\n \n \">\n </p-inputNumber>\n </span>\n <ng-template #locked_field><span *ngIf=\"!row.isNew\" [attr.data-title-element]=\"column.hoverData ? null : 'self'\">\n {{ row[column.field] }}\n </span></ng-template>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span [attr.data-title-element]=\"column.hoverData ? null : 'self'\"> \n \n {{\n setNumericFormat(column, row)\n }}\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- Button column on Grid -->\n <span *ngSwitchCase=\"'add_button'\">\n <div>\n <button *ngIf=\"!row.hidegridbtn\" pButton type=\"button\" \n [icon]=\"row[column.field+'_obj']?.icon ? row[column.field+'_obj']?.icon : column.icon\"\n [name]=\"column.header\" class=\"merge-btn\" [disabled]=\"allowDisabled(column,row)\"\n [label]=\"row[column.field+'_obj']?.displayText ? row[column.field+'_obj']?.displayText : column.value\"\n class=\"grid-component-grid-add-btn\" (click)=\"onClickButton(column, row)\"></button>\n </div>\n </span> \n \n <!-- Generate File Button column on Grid -->\n <span *ngSwitchCase=\"'generate_file_button'\">\n <se-generate-import-file\n [label]=\"row[column.field+'_obj']?.displayText ? row[column.field+'_obj']?.displayText : column.value\"\n [icon]=\"row[column.field+'_obj']?.icon ? row[column.field+'_obj']?.icon : column.icon\"\n [dialogData]=\"column.data\"\n [selectedRow]=\"row\"\n ></se-generate-import-file>\n </span> \n\n <!-- Date column on Grid -->\n <!-- calendar selector -->\n <span *ngSwitchCase=\"'date'\" \n [attr.data-title-element]=\"column.hoverData? null: editAllRows ? 'input' : 'self' \" \n >\n <p-cellEditor>\n <ng-template pTemplate=\"input\" >\n <p-calendar\n [minDate]=\"column.minDate\" [maxDate]=\"column.maxDate\"\n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty ' + column.field + row[dataKey] : column.field + row[dataKey]\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" (onClose)=\"onFocusOutEvent(column, row)\"\n [appendTo]=\"'body'\" hourFormat=\"12\" [defaultDate]=\"defaultDate\"\n [stepMinute]=\"column.minutesInterval ? column.minutesInterval : 1\" [showTime]=\"column.showTime\"\n [timeOnly]=\"column.timeOnly\" [dateFormat]=\"column.format ? column.format.type : calendarFormat\"\n (keyup)=\"calendarInputValue(column, row)\" (onShow)=\"onClickEvent(column, row)\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ? row[column.field+'_obj']?.displayField : row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"\n [showButtonBar]=\"!column.timeOnly\"></p-calendar>\n </ng-template>\n <ng-template pTemplate=\"output\" >\n {{ setConditionBaseValue(row,column) }}\n </ng-template>\n </p-cellEditor>\n </span>\n\n\n <span *ngSwitchDefault>\n <span [ngSwitch]=\"column.type\">\n <!-- Dropdown column on Grid -->\n <span *ngSwitchCase=\"'dropdown'\" [class]=\"dropdownInput ? '' : 'output-dropdown'\"\n [attr.data-title-element]=\" column.hoverData? null: editAllRows ? '.p-dropdown-label' : 'self'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-dropdown *ngIf=\"!row[column.field+'_obj']?.hidden\" [options]=\"\n row[column.field?.toLowerCase()+'_data']\n ? row[column.field?.toLowerCase()+'_data']\n : column.data\n \"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField?.toLowerCase() ? row[row[column.field+'_obj']?.displayField.toLowerCase()] : row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\" [placeholder]=\"row[column.displayField]\n ? row[column.displayField]\n : row[column.field] ? row[column.field] : 'Select'\" [showClear]=\"row[column.field] ? true : false\"\n [optionLabel]=\"column.optionLabel\" (click)=\"onClickEvent(column, row)\"\n [optionValue]=\"column.optionValue\" [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" (blur)=\"onFocusOutEvent(column, row)\"\n (onChange)=\"onChangeEvent(column, row)\" [filter]=\"column.allowSearch\"></p-dropdown>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span *ngIf=\"!row[column.field+'_obj']?.hidden\">\n {{\n setDropdwonReadOnlyValue(row, column)\n }}\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- MultiSelect column on Grid -->\n <!-- [(ngModel)]=\"row[column.field+'_obj']?.displayField?.toLowerCase() ? row[row[column.field+'_obj']?.displayField.toLowerCase()] :\n row[column.field]\" -->\n <span *ngSwitchCase=\"'multi-select'\" [attr.data-title-element]=\"column.hoverData ? null : '.p-multiselect-label'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-multiSelect [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" type=\"text\"\n [(ngModel)]=\"row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"\n [options]=\"column.data\" [optionLabel]=\"column.optionLabel\" [optionValue]=\"column.optionValue\"\n (onChange)=\"onChangeEvent(column, row)\" (onPanelShow)=\"showOption(column, row)\"\n (click)=\"onClickEvent(column, row)\" [appendTo]=\"'body'\" (blur)=\"onFocusOutEvent(column, row)\">\n </p-multiSelect>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span [attr.data-title-element]=\"column.hoverData ? null : 'self'\" >\n {{\n row[column.displayField]\n ? row[column.displayField] :\n setMultiSelectData(column, row[column.field])\n }}\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"'AutoComplete'\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-autoComplete \n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\" \n [name]=\"column.header\"\n [suggestions]=\"column.data\" \n (onSelect)=\"autoCompleteSelectedValue(row, column, $event)\"\n [field]=\"column.optionLabel ? column.optionLabel?.toLowerCase() : column.displayField ? column.displayField?.toLowerCase() : column.field?.toLowerCase()\"\n [(ngModel)]=\"row[column.field+'_obj']?.displayField ? row[row[column.field+'_obj']?.displayField.toLowerCase()] :\n typeOf(row[column.field]) === 'object' && row[column.field]?.text ?\n row[column.field]?.text :\n row[column.field]\"\n [dropdown]=\"column.showOption\" \n (ngModelChange)=\"onChangeEvent(column, row)\"\n (click)=\"onClickEvent(column, row)\" \n (completeMethod)=\"autoSearch($event, column, row)\"\n (onBlur)=\"onFocusOutEvent(column, row, $event)\" \n [disabled]=\"allowDisabled(column,row)\" \n [multiple]=\"true\"\n (keydown.enter)=\"onAutoCompleteKeyEnterEvent($event, column, row)\">\n </p-autoComplete>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span *ngIf=\"row[column.field] && row[column.field][0] && row[column.field][0][column.displayField]\">\n <span *ngFor=\"let value of row[column.field]; let i = index\">\n {{ row[column.field] && row[column.field].length > 1 ? row[column.field].length -1 === i ?\n value[column.displayField] : value[column.displayField] + ';' : value[column.displayField] }}\n </span>\n </span>\n <span *ngIf=\"row[column.field] && row[column.field][0] && row[column.field][0][column.field] && !column.displayField\">\n <span *ngFor=\"let value of row[column.field]; let i = index\">\n {{ row[column.field] && row[column.field].length > 1 ? row[column.field].length -1 === i ?\n value[column.field] : value[column.field] + ';' : value[column.field] }}\n </span>\n </span>\n </ng-template>\n </p-cellEditor>\n </span>\n <!-- Add Generate Report Button -->\n <span *ngSwitchCase=\"'report'\">\n <p-cellEditor>\n <ng-template pTemplate=\"output\">\n <se-generate-report-btn [repInfo]=\"setReportName(column, row)\" [label]=\"column.label\"\n [params]=\"setReportParams(column, row)\" [class]=\"column.class\" [showDialog]=\"column.showDialog\"\n [icon]=\"column.icon\" [reportType]=\"column.reportType\"></se-generate-report-btn>\n </ng-template>\n <ng-template pTemplate=\"input\">\n <se-generate-report-btn [repInfo]=\"setReportName(column, row)\" [label]=\"column.label\"\n [params]=\"setReportParams(column, row)\" [icon]=\"column.icon\" [class]=\"column.class\"\n [showDialog]=\"column.showDialog\" [reportType]=\"column.reportType\"></se-generate-report-btn>\n </ng-template>\n </p-cellEditor>\n </span>\n\n <span *ngSwitchDefault [attr.data-title-element]=\"column.hoverData ? null : 'input'\">\n <!-- Input column on Grid -->\n <p-cellEditor> \n <ng-template pTemplate=\"input\">\n <span [style]=\"column.style ? column.style : 'display:flex'\">\n <input [type]=\"row[column.field+'_obj']?.textType?row[column.field+'_obj']?.textType:column.textType?column.textType:'text'\" \n [class]=\"row[column.field.toLowerCase()+'_obj']?.errorMessage ? 'ng-invalid ng-dirty' : 'prime-input'\"\n [id]=\"allowDisabled(column,row) ? 'hide-border' : ''\"\n [(ngModel)]=\"row.undefined ? '' : allowDisabled(column,row) && row[column.displayField] ?\n row[column.displayField] : row[column.field+'_obj'] && row[column.field+'_obj'].value ? row[column.field+'_obj'].value : row[column.field]\"\n [disabled]=\"allowDisabled(column,row)\"\n (blur)=\"onFocusOutEvent(column, row)\" (change)=\"onChangeEvent(column, row)\"\n (click)=\"onClickButton(column, row)\" *ngIf=\"column.field !== dataKey; else locked_field\" />\n <span style=\"float:right\" *ngIf=\"column.format=='password'\">\n <i [class]=\"row[column.field+'_obj']?(row[column.field+'_obj'].textType=='password'?'pi pi-eye':'pi pi-eye-slash'):column.textType=='password'?'pi pi-eye':'pi pi-eye-slash'\"\n (click)=\"changePasswordType(column, row)\" [title]=\"column.header\"></i>\n </span> \n </span>\n <ng-template #locked_field><span *ngIf=\"!row.isNew\" [attr.data-title-element]=\"column.hoverData ? null : 'self'\">\n {{ row[column.field] }}\n </span></ng-template>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <span [style]=\"column.style ? column.style : 'display:flex'\">\n <span (click)=\"onClickEvent(column, row)\" [attr.data-title-element]=\"column.hoverData ? null : 'self' \" \n [class]=\"row[column.field+'_obj']?.textType ?(row[column.field+'_obj']?.textType=='password' ?'password':'') :column.textType=='password'?'password':''\">\n {{ setTextBoxReadOnlyValue(row, column) }} \n </span>\n <span style=\"float:right\" *ngIf=\"column.format=='password'\">\n <i [class]=\"row[column.field+'_obj']?(row[column.field+'_obj'].textType=='password'?'pi pi-eye':'pi pi-eye-slash'):column.textType=='password'?'pi pi-eye':'pi pi-eye-slash'\"\n [title]=\"column.header\" (click)=\"changePasswordType(column, row)\"></i>\n </span>\n </span>\n </ng-template>\n \n </p-cellEditor>\n </span>\n </span>\n </span>\n \n </span>\n </td>\n <!-- Grid Rows Data Bindings End -->\n\n <!-- Action column on Grid -->\n <td *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && columnActions.length > 0\"\n class=\"for-buttons\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\">\n <span class=\"action-btn\" *ngFor=\"let action of columnActions\">\n <i [title]=\"action.tooltip\" [class]=\"action.icon\" (click)=\"handleActionClick($event, action, row)\"></i>\n </span>\n </td>\n <td\n *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && useInlineCRUD && (deleteRowPermission || editRowPermission)\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"\n class=\"for-buttons\"\n [ngClass]=\"disabledSaveBtn ? 'hide-clear-filter-button' : ''\">\n <span class='setActionColumnWidth'>\n <se-grid-row-actions [editing]=\"editing\" [editRowPermission]=\"editRowPermission\"\n [deleteRowPermission]=\"deleteRowPermission\" [hideDeleteBtn]=\"hideDeleteBtn\" [hideEditBtn]=\"hideEditBtn\"\n [row]=\"row\" (onRowEditInitBtn)=\"onRowEditInit($event)\" (deleteRecordBtn)=\"deleteRecord($event)\"\n (onRowEditSaveBtn)=\"onRowEditSave($event)\" (onRowEditCancelBtn)=\"onRowEditCancel($event, ri)\"\n [editAllRows]=\"editAllRows\">\n </se-grid-row-actions>\n </span>\n </td>\n </tr>\n </ng-template>\n\n <!-- Footer columns on Grid -->\n <ng-template pTemplate=\"footer\">\n <tr *ngIf=\"aggregateFooter\">\n <td\n *ngIf=\"setActionColumnAsFirst && (columnActions.length > 0 || (useInlineCRUD && (deleteRowPermission || editRowPermission)))\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></td>\n <td *ngIf=\"allowSelection\" [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"></td>\n <td *ngFor=\"let outerColumn of selectedColumns\" class=\"grid-component-outer-column\" [style]=\"outerColumn.style\">\n <div *ngFor=\"let innerColumn of selectedColumns\">\n <div *ngFor=\"let aggr of innerColumn?.aggregate\">\n <div\n *ngIf=\"aggr.aggrValue?.length && ((!aggr.displayField && innerColumn.field?.toLowerCase() === outerColumn.field?.toLowerCase()) ||\n aggr.displayField && aggr.displayField?.toLowerCase() === outerColumn.field?.toLowerCase())\">\n <div [innerHTML]=\"aggr.aggrValue\">\n </div>\n </div>\n </div> \n </div>\n </td>\n <td\n *ngIf=\"!setActionColumnAsFirst && columns?.length > 0 && useInlineCRUD && (deleteRowPermission || editRowPermission)\"\n [class]=\"inEditMode ? 'three-action-btn' : 'two-action-btn'\"\n [ngClass]=\"disabledSaveBtn ? 'hide-clear-filter-button' : ''\"></td>\n </tr>\n </ng-template>\n\n <!-- Footer for Empty Message columns on Grid -->\n <ng-template pTemplate=\"emptymessage\">\n <tr class=\"grid-component no-records-found\">\n <td [attr.colspan]=\"selectedColumns?.length + 1\">{{totalRecords==0? 'No records found':''}}</td>\n </tr>\n </ng-template>\n </p-table> \n <p-overlayPanel\n [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>", styles: [":host ::ng-deep .table-layout-auto table{table-layout:auto;width:-moz-max-content!important;width:max-content!important}:host ::ng-deep .table-layout-auto .p-datatable-resizable-table>.p-datatable-thead>tr>th{min-width:100px}:host ::ng-deep .prime-input{font-family:Roboto;font-size:12px;color:#484848;background:#ffffff;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:3px;border:none}:host ::ng-deep .prime-input:focus{outline:none;border-color:transparent;box-shadow:0 0 0 2px #0003}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-top:28px;margin-left:18px}:host ::ng-deep .p-multiselect{max-width:100%}:host ::ng-deep .password{-webkit-text-security:disc}:host ::ng-deep .p-calendar .p-inputtext{width:100%}:host ::ng-deep .column-filter-clear-button{display:none}:host ::ng-deep .apply-filter-btn{float:unset!important}:host ::ng-deep .hide-table-filter .pi-filter:before{display:none}:host ::ng-deep .hide-table-filter .p-column-filter-menu-button,:host ::ng-deep .hide-table-filter .p-column-filter-clear-button{display:none!important}:host ::ng-deep .hide-filter-icon .column-filter-menu-button{display:none}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.custom-link{color:#205dcf;font-size:12px}.custom-link:not(.disabled-link){cursor:pointer}.mr-2{margin-right:10px;display:block}.highlighted-row{background-color:#dee2e6!important}.hide-clear-filter-button{display:none!important}:host ::ng-deep .p-datatable-resizable-table>.p-datatable-thead>tr>th{overflow:visible!important}:host ::ng-deep .p-multiselect .p-multiselect-trigger{top:6px}\n"] }]
|
|
3133
3133
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.SystemConfigService }, { type: i2.DialogService }, { type: i3.FormService }, { type: i4.GridService }, { type: i5.AlertService }, { type: i6.AuthenticationService }, { type: i0.ElementRef }, { type: i7.DecimalPipe }, { type: i8.PageLoggerService }, { type: i9.HyperlinkService }, { type: i0.ChangeDetectorRef }, { type: i10.Router }, { type: i7.DatePipe }, { type: i0.NgZone }, { type: i11.ConfirmationService }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i12.RequestService }, { type: i2.DynamicDialogConfig, decorators: [{
|
|
3134
3134
|
type: Optional
|
|
3135
3135
|
}] }, { type: i2.DynamicDialogRef, decorators: [{
|
|
@@ -3316,4 +3316,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImpor
|
|
|
3316
3316
|
type: HostListener,
|
|
3317
3317
|
args: ['window:beforeunload', ['$event']]
|
|
3318
3318
|
}] } });
|
|
3319
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2dyaWQvZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2dyaWQvZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUdaLFFBQVEsRUFFUixZQUFZLEVBR1osU0FBUyxFQUNULFlBQVksRUFFWixnQkFBZ0IsR0FJakIsTUFBTSxlQUFlLENBQUM7QUFRdkIsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFTTCxrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLGtCQUFrQixFQUVsQixjQUFjLEVBQ2QsZUFBZSxFQUVmLGNBQWMsRUFDZCxxQkFBcUIsRUFFckIsVUFBVSxFQUNWLGdCQUFnQixHQUVqQixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQWUsTUFBTSxpQ0FBaUMsQ0FBQztBQUcvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFbE0sT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE9BQU8sRUFBRSxPQUFPLEVBQWdCLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUl2RCxPQUFPLEVBQVMsSUFBSSxFQUFFLFNB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WUFBWSxFQUFFLFdBQVcsRUFBRTtnQkFDdkQsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7Z0JBQzlELENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztvQkFDdkMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUN4QyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDO3dCQUN0SyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQzdGLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtZQUNsRCxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7UUFDL0MsSUFBSSxVQUFVLEdBQUcsWUFBWSxFQUFFLFVBQVUsQ0FBQztRQUMxQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFO1lBQzFC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QU0sQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7WUFDdEwsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1lBQ25MLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUN0TCxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7WUFDL0wsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FB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TUFBTTtnQkFHRyxlQUFlO3NCQUF4QixNQUFNO2dCQUdHLFdBQVc7c0JBQXBCLE1BQU07Z0JBR0csUUFBUTtzQkFBakIsTUFBTTtnQkFHRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBR0UsWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdJLGFBQWE7c0JBQXRCLE1BQU07Z0JBR0csWUFBWTtzQkFBckIsTUFBTTtnQkFFRSxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFxS04sZUFBZTtzQkFGZCxZQUFZO3VCQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQzs7c0JBQy9CLFlBQVk7dUJBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVFXLE9BQU87c0JBQWhELFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsZUFBZSxDQUFDO2dCQVF4QyxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMscUJBQXFCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgT25DaGFuZ2VzLFxuICBPcHRpb25hbCxcbiAgRWxlbWVudFJlZixcbiAgVmlld0NoaWxkcmVuLFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgSG9zdExpc3RlbmVyLFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIE5nWm9uZSxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgUmVuZGVyZXIyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQge1xuICBEeW5hbWljRGlhbG9nUmVmLFxuICBEeW5hbWljRGlhbG9nQ29uZmlnLFxuICBEaWFsb2dTZXJ2aWNlLFxuICBEeW5hbWljRGlhbG9nQ29tcG9uZW50LFxufSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xuaW1wb3J0IGpzUERGIGZyb20gJ2pzcGRmJztcbmltcG9ydCB7IEdyaWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIElHcmlkQ29sdW1uLFxuICBJR3JpZFNvcnQsXG4gIElHcmlkU2VydmVyU2lkZUV2ZW50LFxuICBJR3JpZFBhZ2luYXRpb25FdmVudCxcbiAgSUdsb2JhbEZpbHRlcixcbiAgSUdyaWRGaWx0ZXIsXG4gIElHcmlkQ29sdW1uQWN0aW9uLFxuICBJR3JpZFJvd0FjdGlvbixcbiAgRUdyaWRTZWxlY3Rpb25UeXBlLFxuICBFR3JpZENvbHVtblR5cGUsXG4gIEVHcmlkU29ydERpcmVjdGlvbixcbiAgSUdyaWREYXRhRXhwb3J0LFxuICBFR3JpZEFnZ3JlZ2F0ZSxcbiAgRUdyaWRGb3JtYXRUeXBlLFxuICBJR3JpZEZpbHRlckluZm8sXG4gIEVHcmlkVmFsaWRhdG9yLFxuICBHcmlkRmlsdGVyQ29udHJvbFR5cGUsXG4gIHVzZXJTZXR0aW5nLFxuICBFR3JpZEV4Y2VsLFxuICBFR3JpZFJvd1Byb3BOYW1lLFxuICBJR3JpZFJlcG9ydEJ0bixcbn0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dyaWQubW9kZWwnO1xuaW1wb3J0IHsgRVBlcm1pc3Npb25UeXBlLCBJUGVybWlzc2lvbiB9IGZyb20gJy4uLy4uLy4uL21vZGVscy91c2VyLWluZm8ubW9kZWwnO1xuaW1wb3J0IHsgQXV0aGVudGljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aGVudGljYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hbGVydC5zZXJ2aWNlJztcbmltcG9ydCB7IElmcmFtZUNvbXBvbmVudCB9IGZyb20gJy4uL2lmcmFtZS9pZnJhbWUuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVQaXBlLCBEZWNpbWFsUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBhdXRvU2V0TG9va3VwRGF0YSwgY2hhbmdlQ29sdW1uc1N0YXRlLCBjdXJyZW50VXJsLCBkcmFnZ2FibGVEaWFsb2csIG9iakNvbnZlcnRUb0xvd2VyLCBzZXREaWFsb2dSZXNwb25zZSwgc2V0TWludXRlc0ludGVydmFsLCBzZXRUaW1lSW5EYXRlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0aWVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tICdwcmltZW5nL3RhYmxlJztcbmltcG9ydCB7IEVGb3JtYXRUeXBlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2Zvcm0ubW9kZWwnO1xuaW1wb3J0IHsgUGFnZUxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wYWdlLWxvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBIeXBlcmxpbmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaHlwZXJsaW5rLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9mb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgZGVsYXksIHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vbGliL3NlcnZpY2VzL3JlcXVlc3Quc2VydmljZSc7XG5pbXBvcnQgeyBSZXF1ZXN0RHRvIH0gZnJvbSAncHJvamVjdHMvc2UtdWktdG9vbGtpdC9zcmMvbGliL21vZGVscy9yZXF1ZXN0Lm1vZGVsJztcbmltcG9ydCB7IFN5c3RlbUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zeXN0ZW0tY29uZmlnLnNlcnZpY2UnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2UtZ3JpZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ3JpZC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBHcmlkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ3ZpZXdDb250YWluZXJSZWYnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICBwdWJsaWMgcGFuZWxPdmVybGF5Vmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZlxuXG4gIEBWaWV3Q2hpbGRyZW4oJ2dyaWRSb3cnKSBncmlkUm93OiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBPdXRwdXQoKSBpbmxpbmVSb3dDYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIGdyaWRTZXR0aW5nOiBhbnk7XG4gIHNlYXJjaGJ0bklkID0gJ3NlYXJjaEdsb2JhbEZpbHRlckJ0bic7XG4gIGN1cnJlbnRQYWdlOiBudW1iZXIgPSAwO1xuICBQYWdlQ2hhbmdlOiBib29sZWFuO1xuICBASW5wdXQoKSBzZXQgYWN0aXZlVGVzdE1vZGUodmFsOiBhbnkpIHtcbiAgICBpZiAodmFsID09PSB0cnVlKSB7XG4gICAgICBkZWJ1Z2dlcjtcbiAgICB9XG4gIH1cbiAgc2VydmVyRmlsdGVyczogSUdyaWRTZXJ2ZXJTaWRlRXZlbnQgPSB7fTtcbiAgcm93c0RhdGE6IGFueVtdID0gW107XG4gIGdyaWRJZDogc3RyaW5nID0gJyc7XG4gIHJvd3NEYXRhQ29weTogYW55W10gPSBbXTtcbiAgbnVtZXJpY1ZhbHVlOiBhbnkgPSB7fVxuICByb2xlczogc3RyaW5nW10gPSBbXTtcbiAgaXNDb2x1bW5IaWRkZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgcm93Q2xpY2tEYXRhOiBJR3JpZENvbHVtbjtcbiAgY29tcG9uZW50VGFibGVSZWY6IGFueTtcbiAgbG9va3VwRmlsdGVyT2JqOiBhbnk7XG4gIGNoZWNrbGlzdDogYW55W10gPSBbXVxuICBsb29rdXBCbHVyOiBib29sZWFuID0gdHJ1ZTtcbiAgZ2xvYmFsRmlsdGVyc0FycmF5OiBhbnlbXSA9IFtdO1xuICBjaGVja0FjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBjYWxlbmRhclByZXZpb3VzVmFsdWU6IHN0cmluZyA9ICcnO1xuICBncmlkRmlsdGVyT2JqOiBJR3JpZEZpbHRlckluZm87XG4gIGRlZmF1bHREYXRlOiBhbnk7XG4gIG92ZXJsYXlQYW5lbFN0eWxlOiB7fTtcbiAgZ3JpZGZpbHRlcjogYW55O1xuICBkcm9wRG93bkZpbHRlcjogYW55ID0ge307XG4gIGRyb3Bkb3duSW5wdXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2F2ZUFsbFJlY29yZDogYm9vbGVhbiA9IGZhbHNlO1xuICBnZW5lcmF0ZVJvd3NEYXRhQ29weTogYm9vbGVhbiA9IHRydWU7XG4gIGVkaXRBbGxSZWNvcmQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2FuY2VsQWxsUmVjb3JkczogYm9vbGVhbiA9IGZhbHNlO1xuICBhZGROZXdSb3dDaGVjazogYm9vbGVhbiA9IGZhbHNlO1xuICBpbkVkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIHNhdmVSZWNvcmRBcnJheTogYW55W10gPSBbXTtcbiAgZGlzYWJsZWRTYXZlQnRuOiBib29sZWFuID0gZmFsc2U7XG4gIGlzQ2hlY2tCb3hDaGFuZ2VFdmVudENhbGxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1NlbGVjdGVkQWxsUm93czogYm9vbGVhbiA9IGZhbHNlO1xuICBDaGVja2VkOiBib29sZWFuID0gdHJ1ZVxuICB1bkNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICBlZGl0TW9kZUNoZWNrZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBlZGl0TW9kZXVuQ2tlY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBjYWxlbmRhckZvcm1hdDogc3RyaW5nID0gXCJtbS9kZC95eVwiXG4gIHNldERyb3Bkb3duRmlsdGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgcmVsb2FkUGFnZTogU3Vic2NyaXB0aW9uO1xuICBzZXREcm9wZG93bmRhdGFWYWx1ZTogYm9vbGVhbiA9IHRydWU7XG4gIHNob3dGaWx0ZXJidG46IGJvb2xlYW4gPSBmYWxzZTtcbiAgZGlhbG9nUmVmOiBhbnlcbiAgdXNlclNldHRpbmc6IHVzZXJTZXR0aW5nID0ge307XG4gIHJvd1VwZGF0ZUNoYW5nZTogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1NlcnZlclNpZGVFdmVudEluaXRhbFRyaWdnZXJlZCA9IG5ldyBTdWJqZWN0KClcblxuICAvL2FwcGx5IEFkZC9EZWxldGUvRWRpdCBwcm9wIGZvciB0aGUgZ3JpZCBwZXJtaXNzaW9uXG4gIGFkZFJvd1Blcm1pc3Npb246IGJvb2xlYW4gPSB0cnVlO1xuICBkZWxldGVSb3dQZXJtaXNzaW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgZWRpdFJvd1Blcm1pc3Npb246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vIEFwcGx5IHByb3Agc2V0QWdncmVnYXRlRm9vdGVyIG9uIEZvb3RlciBvZiB0aGUgVGFibGUgZm9yIGFnZ3JlZ2F0ZS5cbiAgc2V0QWdncmVnYXRlRm9vdGVyOiBzdHJpbmcgPSAnJztcbiAgXG4gIHByaXZhdGUgY2xpY2tUaW1lb3V0OiBib29sZWFuID0gZmFsc2U7XG4gIC8vIEJvb2xlYW4gcHJvcCB0byBhbGxvdyBIaWRlIEFnZ3JlZ2F0ZSBGb290ZXIgV2hlbiBBZ2dyZWdhdGUgbm90IEFwcGx5IG9uIFRhYmxlLlxuICBhZ2dyZWdhdGVGb290ZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBNYWludGFpbnMgcHJldmlvdXMgc3RhdGUgb2Ygcm93cyBiZWluZyBlZGl0ZWRcbiAgZWRpdFJvd3NSZWNvcmRzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIC8vIE1haW50YWlucyByZWNvcmQgb2Ygcm93cyBiZWluZyBlZGl0ZWRcbiAgZWRpdGluZ1Jvd0tleXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgY3VycmVudFVybDogc3RyaW5nID0gY3VycmVudFVybCgpO1xuICBvbkNsaWNrRXZlbnRUcmlnZ2VyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIHJlbWFpbmluZ1Jvd3NEYXRhOmFueVtdID0gW107XG4gIFxuICBAVmlld0NoaWxkKCdkdCcpIHRhYmxlOiBUYWJsZTtcblxuICAvLyBTZWxlY3RzIGl0ZW1zIGluIHRoZSBncmlkIGJhc2VkIG9uIHBhc3NlZCBvbiBkYXRhXG4gIEBJbnB1dCgpIHNlbGVjdGVkUm93czogYW55ID0gW107XG5cbiAgQElucHV0KCkgc2V0R3JpZFJlZnJlc2hUaW1lOiBudW1iZXIgPSAwO1xuXG4gIEBJbnB1dCgpIGFkZERhdGFLZXlWYWx1ZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHN0b3BEaWFsb2dDbG9zZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZ2xvYmFsRGF0YTogSUdyaWRGaWx0ZXJbXSA9IFtdO1xuXG4gIHNvcnREaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGVkaXRBbGxyb3dzQXRPbmVUaW1lOiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKSBwdWJsaWMgc2hvd1JlZnJlc2hCdG46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBwdWJsaWMgaGlkZVJlZnJlc2hCdG46IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vIFN0b3JlcyBzZWxlY3RlZCBjb2x1bW5zXG4gIHByaXZhdGUgX3NlbGVjdGVkQ29sdW1uczogSUdyaWRDb2x1bW5bXSA9IFtdO1xuICBzZWxlY3RlZFRvZ2dsZUNvbHVtbnM6IElHcmlkQ29sdW1uW10gPSBbXTtcbiAgXG4gIHZpc2libGVDb2x1bW5zOiBJR3JpZENvbHVtbltdID0gW107XG4gIC8vIEJvb2xlYW4gcHJvcCB0byBhbGxvdyBob3Jpem9udGFsIFNjcm9sbCBvbiBUYWJsZS5cbiAgQElucHV0KCkgaG9yaXpvbnRhbFNjcm9sbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIEJvb2xlYW4gcHJvcCB0byBoaWRlIHRoZSBkZWxldGUgcm93IGJ1dHRvbi5cbiAgQElucHV0KCkgaGlkZURlbGV0ZUJ0biA9IGZhbHNlO1xuXG4gIC8vIEJvb2xlYW4gcHJvcCB0byBoaWRlIHRoZSBlZGl0IHJvdyBidXR0b24uXG4gIEBJbnB1dCgpIGhpZGVFZGl0QnRuID0gZmFsc2U7XG5cbiAgLy8gQm9vbGVhbiBwcm9wIHRvIGhpZGUgdGhlIGFkZCByb3cgYnV0dG9uLlxuICBASW5wdXQoKSBoaWRlQWRkQnRuID0gZmFsc2U7XG5cbiAgLy8gUHJvcCB0byBoYW5kbGUgbG9hZGVyIG9mIGdyaWRcbiAgQElucHV0KCkgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcblxuICAvL3RoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBoYW5kbGUgc2VydmVyIHNpZGUgZXZlbnQgYnkgZGVmYXVsdCBpdCBpcyB0cnVlIHdoZW4gaXQgZmFsc2Ugc2VydmVyIHNpZGUgZXZlbnQgd2lsbCBub3QgYmUgY2FsbGVkXG4gIEBJbnB1dCgpIGF1dG9Mb2FkRGF0YTogYm9vbGVhbiA9IHRydWU7XG5cblxuICAvL3RhYmxlIHJvdyBzdHlsZXNcbiAgQElucHV0KCkgcm93U3R5bGU6IHN0cmluZztcblxuICAvLyBCb29sZWFuIHByb3AgdG8gY2hlY2sgd2hlcmUgc2VsZWN0ZWQgaXMgYWxsb3dlZCBvciBub3QuXG4gIEBJbnB1dCgpIGFsbG93U2VsZWN0aW9uID0gZmFsc2U7XG5cbiAgLy8gU2V0IGNvbHVtbiB3aWR0aCBvZiBzZWxlY3RlZCByb3cuXG4gIEBJbnB1dCgpIHNlbGVjdGlvbkNvbHVtbldpZHRoOiBzdHJpbmcgPSAnODBweCc7XG5cbiAgLy8gc2V0IHNlbGVjdGlvbiBjaGVja0JveCBoZWFkZXJcbiAgQElucHV0KCkgYWxsb3dTZWxlY3Rpb25IZWFkZXI6IHN0cmluZyA9ICcnO1xuXG4gIC8vIEJvb2xlYW4gcHJvcCB0byBoaWRlIHRoZSBzYXZlIGJ1dHRvbiBvbiB0b3Agb2YgZ3JpZC5cbiAgQElucHV0KCkgaGlkZUdyaWRTYXZlQnV0dG9uID0gZmFsc2U7XG5cbiAgLy8gQm9vbGVhbiBwcm9wIHRvIGhpZGUgdGhlIHNhdmUgYnV0dG9uIG9uIHRvcCBvZiBncmlkLlxuICBASW5wdXQoKSBoaWRlR3JpZENhbmNlbEJ1dHRvbiA9IGZhbHNlO1xuXG4gIC8vIEJvb2xlYW4gcHJvcCB0byBhbGxvdyBleHBvcnQgdG8gcGRmLlxuICBASW5wdXQoKSBhbGxvd0V4cG9ydFRvUGRmID0gZmFsc2U7XG5cbiAgLy8gQm9vbGVhbiBwcm9wIHRvIGFsbG93IGV4cG9ydCB0byBleGNlbC5cbiAgQElucHV0KCkgYWxsb3dFeHBvcnRUb0V4Y2VsID0gZmFsc2U7XG5cbiAgLy8gQm9vbGVhbiBwcm9wIHRvIHNldCB0aGUgYWN0aW9uIGNvbHVtbiBhcyBmaXJzdCBjb2x1bW4uXG4gIEBJbnB1dCgpIHNldEFjdGlvbkNvbHVtbkFzRmlyc3QgPSBmYWxzZTtcblxuICAvLyBJZiB0cnVlLCBlbmFibGVzIG9wdGlvbnMgdG8gcGVyZm9ybSBDUlVEIHVzaW5nIGlubGluZSByb3cgZnVuY3Rpb25hbGl0eVxuICBASW5wdXQoKSB1c2VJbmxpbmVDUlVEID0gZmFsc2U7XG5cbiAgLy8gQXJyYXkgb2Ygcm93IGFjdGlvbnNcbiAgQElucHV0KCkgcm93QWN0aW9uczogSUdyaWRSb3dBY3Rpb25bXSA9IFtdO1xuXG4gIC8vIFNldHMgc2VsZWN0aW9uIHR5cGUgaS5lOiBzaW5nbGUvbXVsdGlwbGUgc2VsZWN0aW9uXG4gIEBJbnB1dCgpIHNlbGVjdGlvblR5cGU6IEVHcmlkU2VsZWN0aW9uVHlwZSA9IEVHcmlkU2VsZWN0aW9uVHlwZS5TSU5HTEU7XG5cbiAgLy8gVW5pcXVlIGtleSByZXF1aXJlcyBmb3IgYnVpbHQtaW4gcm93IHNlbGVjdGlvbiBvZiBwcmltZU5nIGdyaWRcbiAgQElucHV0KCkgZGF0YUtleTogc3RyaW5nID0gJ3RlbXBfaWQnO1xuXG4gIC8vIEZsYWcgZm9yIGNsZWFyIGZpbHRlciB2YWx1ZXMgYnV0dG9uXG4gIEBJbnB1dCgpIGNsZWFyR3JpZEZpbHRlciA9IHRydWU7XG5cbiAgLy8gRmxhZyBmb3Igc2VhcmNoIGZpbHRlciB2YWx1ZXMgYnV0dG9uXG4gIEBJbnB1dCgpIHNlYXJjaEdyaWRGaWx0ZXIgPSB0cnVlO1xuXG4gIC8vIEZsYWcgaW4gY2FzZSB0YWJsZSBpcyBzY3JvbGxhYmxlXG4gIEBJbnB1dCgpIHNjcm9sbGFibGUgPSB0cnVlO1xuXG4gIC8vIFNldHMgc2Nyb2xsIGhlaWdodCBmb3IgdGhlIHRhYmxlXG4gIEBJbnB1dCgpIHNjcm9sbEhlaWdodCA9ICc4MHZoJztcblxuICAvLyBUYWJsZSBzdHlsZVxuICBASW5wdXQoKSB0YWJsZVN0eWxlID0gJyc7XG5cbiAgLy8gQm9vbGVhbiBwcm9wIHRvIGFsbG93IHRvIHdyYXAgb3IgdW5XcmFwIHRoZSBncmlkLlxuICBASW5wdXQoKSB3b3JkV3JhcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIG5ld0dyaWRSb3c6IGFueSA9IHt9O1xuXG4gIEBJbnB1dCgpIGZpbHRlcmluZyA9IHRydWU7XG5cbiAgQElucHV0KCkgcmVwb3J0QnV0dG9uczogYW55W10gPSBbXTtcblxuICBASW5wdXQoKSByb3dIb3ZlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGhpZGVGaWx0ZXJPcHRpb25zOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyBTZXRzIHBhZ2VuYXRpb24gZm9yIHRoZSB0YWJsZSBEYXRhLlxuICBASW5wdXQoKSBzZXRQYWdpbmF0aW9uTGVuZ3RoOiBhbnlbXSA9IFs1LCAxMCwgMTUsIHsgc2hvd0FsbDogJ0FsbCcgfV07XG5cbiAgLy8gc2V0IHRoZSBjaGFuZ2UgaW4gdGhlIHJvd0RhdGFcbiAgQE91dHB1dCgpIHJvd3NDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKipcbiAgICogU3RvcHMgdGhlIGxvYWRlciBhbmQgc2V0cyB0aGUgZGF0YSB0byBncmlkXG4gICAqIENsZWFycyB0aGUgZWRpdGluZyBzdGFja1xuICAgKiBTY3JvbGxzIHRvIHNlbGVjdGVkIGVsZW1lbnQgaWYgc2VsZWN0aW9uIGZvdW5kXG4gICAqL1xuICBASW5wdXQoKSBzZXQgcm93cyhkYXRhOiBhbnlbXSkge1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIGlmICghdGhpcy5yb3dVcGRhdGVDaGFuZ2UpIHtcbiAgICAgIGlmICghdGhpcy5pc0NoZWNrQm94Q2hhbmdlRXZlbnRDYWxsZWQpIHtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGFLZXkpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YUtleSA9ICd0ZW1wX2lkJztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgcm93c0RhdGEgPSB0aGlzLmdyaWRTZXJ2aWNlLnNldERhdGFGaWVsZHMoZGF0YSwgdGhpcy5kYXRhS2V5KTtcbiAgICAgICAgICBpZiAoZGF0YT8ubGVuZ3RoID4gNDAgJiYgIXRoaXMucGFnaW5hdGlvbiAmJiAhdGhpcy5ncmlkU2VydmljZT8ucm93VXBkYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBpbml0aWFsaXplRGF0YSA9IFsuLi5yb3dzRGF0YV07XG4gICAgICAgICAgICB0aGlzLnJvd3NEYXRhID0gaW5pdGlhbGl6ZURhdGEuc3BsaWNlKDAsIDQwKTtcbiAgICAgICAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1haW5pbmdSb3dzRGF0YSA9IFsuLi5yb3dzRGF0YV07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29sdW1ucyAmJiB0aGlzLmNvbHVtbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1ucz8uZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4/LmFnZ3JlZ2F0ZT8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWdncmVnYXRlVGV4dChjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm93c0RhdGEgPSByb3dzRGF0YTtcbiAgICAgICAgICAgIHRoaXMucmVtYWluaW5nUm93c0RhdGEgPSBbLi4ucm93c0RhdGFdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmVkaXRSb3dzUmVjb3JkcyA9IHt9O1xuXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSb3dzICYmIHRoaXMuZ3JpZFJvdz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50UmVmID0gdGhpcy5ncmlkUm93LmZpbmQoXG4gICAgICAgICAgICAgICh4KSA9PiB4Lm5hdGl2ZUVsZW1lbnQuaWQgPT09IHRoaXMuc2VsZWN0ZWRSb3dzW3RoaXMuZGF0YUtleV1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRSZWYgJiZcbiAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxUYWJsZVJvd0VsZW1lbnRcbiAgICAgICAgICAgICAgKS5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvL21hbmlwdWxhdGUgY2hlY2tib3ggc3RyaW5nIHZhbHVlIHRvIHRydWUgYW5kIGZhbHNlLlxuICAgICAgICAgIHRoaXMuY2hhbmdlQ2hlY2tib3hTdHJpbmdWYWx1ZSgpO1xuICAgICAgICAgIHRoaXMuc2V0TnVtZXJpY1ZhbHVlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucm93c0RhdGEgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEdsb2JhbCBmaWx0ZXIgc2VydmVyIHJlcXVlc3RcbiAgQElucHV0KCkgc2V0IGdsb2JhbEZpbHRlckRhdGEoZ2xvYmFsRmlsdGVyczogSUdsb2JhbEZpbHRlcltdKSB7XG4gICAgdGhpcy5nbG9iYWxEYXRhID0gdGhpcy5ncmlkU2VydmljZVxuICAgICAgLnByZXBhcmVHbG9iYWxGaWx0ZXJzKGdsb2JhbEZpbHRlcnMpXG4gICAgICA/LmZpbHRlcigoeCkgPT4geD8udmFsdWUgIT09IGZhbHNlKTtcbiAgICBjb25zdCBzZXJ2ZXJGaWx0ZXJWYWx1ZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuc2VydmVyRmlsdGVycykpO1xuICAgIHNlcnZlckZpbHRlclZhbHVlcy5maWx0ZXJzID0gdGhpcy5zZXJ2ZXJGaWx0ZXJzLmZpbHRlcnNcbiAgICAgID8gdGhpcy5zZXJ2ZXJGaWx0ZXJzLmZpbHRlcnMuY29uY2F0KHRoaXMuZ2xvYmFsRGF0YSlcbiAgICAgIDogdGhpcy5nbG9iYWxEYXRhO1xuXG4gICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdhcHBseUZpbHRlcicpID09PSAnZmFsc2UnKSB7XG4gICAgICB0aGlzLmdsb2JhbEZpbHRlcnNBcnJheSA9IHRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5Py5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5nbG9iYWxGaWx0ZXJzQXJyYXkuY29uY2F0KFsuLi5zZXJ2ZXJGaWx0ZXJWYWx1ZXMuZmlsdGVyc10pXG4gICAgICAgIDogdGhpcy5nbG9iYWxGaWx0ZXJzQXJyYXk7XG4gICAgfVxuICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYXBwbHlGaWx0ZXInKSA9PT0gJ3RydWUnKSB7XG4gICAgICBnbG9iYWxGaWx0ZXJzLmZvckVhY2goKGdsb2JhbEZpbHRlcikgPT4ge1xuICAgICAgICB0aGlzLmdsb2JhbEZpbHRlcnNBcnJheS5mb3JFYWNoKChmaWx0ZXJBcnJheSkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGZpbHRlckFycmF5LmZpZWxkID09PSBnbG9iYWxGaWx0ZXIuZmllbGQgJiZcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci52YWx1ZSAmJlxuICAgICAgICAgICAgZmlsdGVyQXJyYXkudmFsdWUgIT09IGdsb2JhbEZpbHRlci52YWx1ZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlsdGVyQXJyYXkudmFsdWUgPSBnbG9iYWxGaWx0ZXIudmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGZpbmRJbmRleCA9IHRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5LmZpbmRJbmRleChcbiAgICAgICAgICAgIChpbmRleCkgPT4gaW5kZXguZmllbGQgPT09IGdsb2JhbEZpbHRlci5maWVsZCAmJiAhZ2xvYmFsRmlsdGVyLnZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZmluZEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJzQXJyYXkuc3BsaWNlKGZpbmRJbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlLy90aGlzLmF1dG9Mb2FkRGF0YTtcbiAgICAgIGlmICh0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgfHwgdGhpcy5hdXRvTG9hZERhdGEpIHtcbiAgICAgICAgdGhpcy5vbkFwcGx5RmlsdGVyLmVtaXQoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmdsb2JhbEZpbHRlcnNBcnJheSAmJiB0aGlzLmdsb2JhbEZpbHRlcnNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNlcnZlckZpbHRlclZhbHVlcy5maWx0ZXJzID0gc2VydmVyRmlsdGVyVmFsdWVzLmZpbHRlcnMuY29uY2F0KFxuICAgICAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzZXJ2ZXJGaWx0ZXJWYWx1ZXMuZmlsdGVycyA9IEFycmF5LmZyb20oXG4gICAgICAgIG5ldyBTZXQoXG4gICAgICAgICAgc2VydmVyRmlsdGVyVmFsdWVzLmZpbHRlcnNcbiAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgIC5tYXAoKGZpbHRlcjogYW55KSA9PiBmaWx0ZXIuZmllbGQpXG4gICAgICAgIClcbiAgICAgICkubWFwKChmaWVsZCkgPT4ge1xuICAgICAgICByZXR1cm4gc2VydmVyRmlsdGVyVmFsdWVzLmZpbHRlcnMuZmluZCgoeDogYW55KSA9PiB4LmZpZWxkID09PSBmaWVsZCk7XG4gICAgICB9KTtcbiAgICAgIHNlcnZlckZpbHRlclZhbHVlcy5maWx0ZXJzID0gc2VydmVyRmlsdGVyVmFsdWVzLmZpbHRlcnMuZmlsdGVyKFxuICAgICAgICAob2JqOiBhbnkpID0+XG4gICAgICAgICAgb2JqPy52YWx1ZSAmJiBvYmoudmFsdWU/LnRvU3RyaW5nKCk/Lmxlbmd0aCA+IDAgJiYgb2JqLmZpZWxkXG4gICAgICApO1xuICAgICAgdGhpcy5ncmlkU2VydmljZS5zb2Z0Q2FjaGluZ0ZpbHRlcnNbdGhpcy5jb21wb25lbnRUYWJsZVJlZj8uaWQgKyB0aGlzLmN1cnJlbnRVcmxdID0gc2VydmVyRmlsdGVyVmFsdWVzO1xuICAgICAgaWYgKHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCB8fCB0aGlzLmF1dG9Mb2FkRGF0YSA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBzZXR0aW5nIHBhZ2luYXRpb24gcGFnZSBhcyBmaXJzdFxuICAgICAgICBzZXJ2ZXJGaWx0ZXJWYWx1ZXMucGFnZSA9IDE7XG4gICAgICAgIHRoaXMuYXV0b0xvYWREYXRhID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFJvd3MgJiYgdGhpcy5wYWdpbmF0aW9uKSB7XG4gICAgICAgICAgc2VydmVyRmlsdGVyVmFsdWVzLnBhZ2VTaXplID0gdGhpcy5kZWZhdWx0Um93cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ncmlkU2VydmljZS5hcHBseUZpbHRlckV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5zZXR1cEVudGVyTGlzdGVuZXIoKVxuICAgICAgICAgIHRoaXMuaXNDaGVja0JveENoYW5nZUV2ZW50Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5vblNlcnZlclNpZGVFdmVudENoYW5nZS5lbWl0KHNlcnZlckZpbHRlclZhbHVlcyk7XG4gICAgICAgICAgdGhpcy5lZGl0aW5nUm93S2V5cyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdhcHBseUZpbHRlcicpO1xuICAgICAgICAvLyBzZXR0aW5nIHBhZ2luYXRpb24gcGFnZSBudW1iZXIgVUlcbiAgICAgICAgdGhpcy50YWJsZS5fZmlyc3QgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzZXR1cEVudGVyTGlzdGVuZXIoKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLmhhbmRsZUtleVVwKTtcbiAgfVxuICBoYW5kbGVLZXlVcCA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIGNvbnN0IGZvY3VzZWRFbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGlmIChmb2N1c2VkRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZm9jdXNlZEVsZW1lbnQudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2VsZWN0Um9vdEVsZW1lbnQoZm9jdXNlZEVsZW1lbnQpLmJsdXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gSW5wdXQgZGVjb3JhdG9yIHRvIHJlY2VpdmUgY29sdW1ucyB0byBiZSBkaXNwbGF5ZWQgaW4gaGVhZGVyXG4gIEBJbnB1dCgpIGNvbHVtbnM6IElHcmlkQ29sdW1uW10gPSBbXTtcblxuICBASW5wdXQoKSBwZXJtaXNzaW9uczogSVBlcm1pc3Npb25bXSA9IFtdO1xuXG4gIC8vIE9wdGlvbmFsIHByb3AgdG8gaGFuZGxlIHRvZ2dsaW5nIG9mIGNvbHVtbnNcbiAgQElucHV0KCkgYWxsb3dDb2x1bW5Ub2dnbGUgPSBmYWxzZTtcblxuICAvLyBPcHRpb25hbCBwcm9wIHRvIGhpZGUgZmlsdGVyaW5nIG9mIGNvbHVtbnNcbiAgQElucHV0KCkgaGlkZUZpbHRlciA9IGZhbHNlO1xuXG4gIC8vIE9wdGlvbmFsIHByb3AgdG8gaGFuZGxlIGxvb2t1cCBmaWx0ZXJzXG4gIEBJbnB1dCgpIGxvb2t1cEZpbHRlcnMgPSBmYWxzZTtcblxuICAvLyBPcHRpb25hbCBwcm9wIHRvIGhhbmRsZSBwYWdpbmF0aW9uXG4gIEBJbnB1dCgpIHBhZ2luYXRpb24gPSBmYWxzZTtcblxuICAvLyBPcHRpb25hbCBwcm9wIHRvIGhhbmRsZSBzaG93IEN1cnJlbnRQYWdlIFJlcG9ydFxuICBASW5wdXQoKSBzaG93Q3VycmVudFBhZ2VSZXBvcnQgPSBmYWxzZTtcblxuICAvLyBEaXNwbGF5cyB0b3RhbCBudW1iZXIgb2YgcmVjb3Jkc1xuICBASW5wdXQoKSB0b3RhbFJlY29yZHMgPSAwO1xuXG4gIC8vIERpc3BsYXlzIGFnZ3JlZ2F0ZSB0aGF0IGZldGNoIGZyb20gcmVjb3Jkc1xuICBASW5wdXQoKSBhZ2dyZWdhdGVkUmVzdWx0OiBhbnlbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIHNob3djb25maXJtRGlhbG9nOiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKSBzYXZlQWxsRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIFNldHMgbnVtYmVyIG9mIHJvd3MgdG8gYmUgc2hvd24gdGhlIGdyaWRcbiAgQElucHV0KCkgZGVmYXVsdFJvd3M6IG51bWJlciA9IDA7XG5cbiAgQElucHV0KCkgY29sdW1uQWN0aW9uczogSUdyaWRDb2x1bW5BY3Rpb25bXSA9IFtdO1xuXG4gIC8vIERlY2lkZXMgdGhlIGdyaWQncyBiZWhhdmlvciBlaXRoZXIgZm9yIGNsaWVudCBzaWRlIG9yIHNlcnZlciBzaWRlIGV2ZW50c1xuICBASW5wdXQoKSB1c2VTZXJ2ZXJTaWRlRXZlbnRzID0gZmFsc2U7XG5cbiAgLy8gT3V0cHV0IGV2ZW50IHRvIGhhbmRsZSByb3cgY2xpY2tcbiAgQE91dHB1dCgpIG9uUm93Q2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8vIE91dHB1dCBldmVudCBlbWl0IHdoZW4gY2xpY2sgb24gZ3JpZCBjaGVja2JveCBmaWx0ZXJcbiAgQE91dHB1dCgpIG9uQ2hlY2tCb3hGaWx0ZXJDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLy8gT3V0cHV0IGV2ZW50IHRvIGhhbmRsZSByb3cgQ2hlY2tCb3hcbiAgQE91dHB1dCgpIG9uUm93Q2hlY2tCb3g6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8vIE91dHB1dCBldmVudCB0byB0cmlnZ2VyIG9uIHNvcnQgY2hhbmdlXG4gIEBPdXRwdXQoKSBvblNvcnRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJR3JpZFNvcnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8vIE91dHB1dCBldmVudCB0byB0cmlnZ2VyIG9uIGZpbHRlciBjaGFuZ2VcbiAgQE91dHB1dCgpIG9uRmlsdGVyQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvLyBPdXRwdXQgZXZlbnQgdG8gaW52b2tlIHRoZSBtdWx0aVNlbGVjdGlvbiBjbGljayBldmVudFxuICBAT3V0cHV0KCkgb25NdWx0aVNlbGVjdGlvbkNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLy8gQ2FsbHMgd2hlbmV2ZXIgYSBncmlkIGFuZCBnbG9iYWxGaWx0ZXJzIGNhbGxlZFxuICBAT3V0cHV0KCkgb25BcHBseUZpbHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLy9zZXQgaGVhZGVyIGNoZWNrYm94IHZhbHVlIGZvciBnZXR0aW5nIGFsbCBjb2x1bW5zIG9uIHN0YXkgYWRtaW5cbiAgQE91dHB1dCgpIGlzSW5jbHVkZWRBbGxDb2x1bW5zOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvLyBDYWxscyB3aGVuZXZlciBhIGxhenkgZXZlbnQgaXMgZGlzcGF0Y2hlZFxuICBAT3V0cHV0KClcbiAgb25TZXJ2ZXJTaWRlRXZlbnRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJR3JpZFNlcnZlclNpZGVFdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvLyBPdXRwdXQgZXZlbnQgdG8gdHJpZ2dlciBvbiBwYWdpbmF0aW9uXG4gIEBPdXRwdXQoKVxuICBvblBhZ2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJR3JpZFBhZ2luYXRpb25FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLy8gRGlzcGF0Y2ggb3V0cHV0IGV2ZW50IHRyaWdnZXIgb24gZWRpdCByb3dcbiAgQE91dHB1dCgpIG9uUm93VXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8vIERpc3BhdGNoIG91dHB1dCBldmVudCB0cmlnZ2VyIGNhbmNlbCBhbGwgcm93c1xuICBAT3V0cHV0KCkgb25DYW5jZWxBbGxSb3dzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8vIERpc3BhdGNoIG91dHB1dCBldmVudCB0cmlnZ2VyIG9uIGRlbGV0ZSByb3dcbiAgQE91dHB1dCgpIG9uUm93RGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8vRGlzcGF0Y2ggb3V0cHV0IGV2ZW50IHRyaWdnZXIgb24gYWRkIHJvd1xuICBAT3V0cHV0KCkgb25Sb3dBZGQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLy9EaXNwYXRjaCBvdXRwdXQgZXZlbnQgdHJpZ2dlciBvbiBhZGQsIHVwZGF0ZSBhbmQgZGVsZXRlIHJvd1xuICBAT3V0cHV0KCkgb25HcmlkUm93QWN0aW9ucyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvLyBzZXQgcHJvcGVydHkgYWxsb3dDYWNoaW5nIGZvciBMb2NhbFN0b3JhZ2VcbiAgQElucHV0KCkgYWxsb3dDYWNoaW5nOiBib29sZWFuO1xuXG4gIC8vc2V0IE11bHRpc2VsZWN0IFRvZ2dsZSBDb2x1bW5zXG4gIEBJbnB1dCgpIGFsbG93UGVyc2lzdGVuY2U6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vIHNldCBwcm9wZXJ0eSBzb2Z0Q2FjaGluZyBmb3Igc2V0dGluZyB0aGUgdmFsdWVzIG9mIGdyaWRGaWx0ZXJcbiAgQElucHV0KCkgc29mdENhY2hpbmc6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpIGVkaXRBbGxSb3dzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gc2V0IHRoZSByb3cgV2hlbiBFZGl0IHRoZSByb3cgb24gR3JpZFxuICBAT3V0cHV0KCkgb25HcmlkUm93RWRpdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvLyBzZXQgdGhlIHJvdyBXaGVuIGFkZGluZyB0aGUgbmV3IFJvdyBvbiBHcmlkXG4gIEBPdXRwdXQoKSBvbkdyaWRSb3dBZGQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQElucHV0KCkgZ3JpZE5hbWU6IHN0cmluZyA9ICcnO1xuICBpc0dyaWRIaWRkZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgYXV0b1Jlc2l6ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBhbGxvd1RleHRDb3B5OiBib29sZWFuID0gZmFsc2U7XG5cblxuICByb3dzUGVyUGFnZU9wdGlvbnM6IGFueVtdID0gWzUsIDEwLCAxNSwgeyBzaG93QWxsOiAnQWxsJyB9XTtcbiAgY3VzdG9tV2lkdGhDb2x1bW5zOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gIHNlbGVjdGVkUm93UmVjb3JkOmFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBTeXN0ZW1Db25maWdTZXJ2aWNlLFxuICAgIHB1YmxpYyBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybVNlcnZpY2U6IEZvcm1TZXJ2aWNlLFxuICAgIHB1YmxpYyBncmlkU2VydmljZTogR3JpZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoZW50aWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHB1YmxpYyBkZWNpbWFsUGlwZTogRGVjaW1hbFBpcGUsXG4gICAgcHJpdmF0ZSBwYWdlTG9nZ2VyU2VydmljZTogUGFnZUxvZ2dlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBoeXBlcmxpbmtTZXJ2aWNlOiBIeXBlcmxpbmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwdWJsaWMgY29uZmlybWF0aW9uU2VydmljZTogQ29uZmlybWF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSByZXF1ZXN0U2VydmljZSA6IFJlcXVlc3RTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHB1YmxpYyBjb25maWc6IER5bmFtaWNEaWFsb2dDb25maWcsXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIHJlZjogRHluYW1pY0RpYWxvZ1JlZlxuICApIHsgfVxuXG4gIGNvbnNvbGVMb2cobWVzc2FnZTogYW55KSB7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG4gIH1cblxuICBtb3VzZUxlYXZlRXZlbnQob3ZlcmxheVBhbmVsKXtcbiAgICBvdmVybGF5UGFuZWwuaGlkZSgpO1xuICB9IFxuICBvbkNvbHVtblJlc2l6ZShldmVudDogYW55LGR0KSB7XG4gICAgaWYoZHQ/LmVsPy5uYXRpdmVFbGVtZW50Py5pZCl7XG4gICAgICB0aGlzLmdyaWRJZCA9IGR0LmVsLm5hdGl2ZUVsZW1lbnQuaWQ7XG4gICAgfVxuICAgIGNvbnN0IG5ld1dpZHRoID0gZXZlbnQuZWxlbWVudC5jbGllbnRXaWR0aCArIDI7XG4gICAgbGV0IGNvbHVtbkhlYWRlciA9IGV2ZW50Py5lbGVtZW50Py5pZD8udG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoY29sdW1uSGVhZGVyKSB7XG4gICAgICBsZXQgaW5kZXg6IGFueSA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZpbmRJbmRleCgoY29sdW1uKSA9PiBjb2x1bW4uaGVhZGVyPy50b0xvd2VyQ2FzZSgpID09IGNvbHVtbkhlYWRlcik7XG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICBpZiAobmV3V2lkdGgpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uc1tpbmRleF1bJ2N1c3RvbVdpZHRoJ10gPSBwYXJzZUludChuZXdXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zYXZlQ29sdW1uV2lkdGhzKCk7XG4gIH1cbiAgc2F2ZUNvbHVtbldpZHRocyh0b2dnbGVDb2x1bW5zOiBhbnlbXSA9IFtdKSB7XG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICBpZiAoY29sdW1uLmZpZWxkICYmIGNvbHVtbi5jdXN0b21XaWR0aCkge1xuICAgICAgICB0aGlzLmN1c3RvbVdpZHRoQ29sdW1uc1tjb2x1bW4uZmllbGRdID0gY29sdW1uLmN1c3RvbVdpZHRoO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHNlbGVjdGVkRmllbGRzID0gdG9nZ2xlQ29sdW1ucz8ubGVuZ3RoID4gMCA/IHRvZ2dsZUNvbHVtbnMgOiB0aGlzLl9zZWxlY3RlZENvbHVtbnMubWFwKCh4KSA9PiB4LmZpZWxkKTtcbiAgICB0aGlzLnNldE11bHRpU2VsZWN0VG9nZ2xlQ29sdW1uKHNlbGVjdGVkRmllbGRzKTtcbiAgfVxuICBsb2FkQ29sdW1uV2lkdGhzKCkge1xuICAgIGxldCBjdXJyZW50VXNlckluZm8gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdDdXJyZW50VXNlckluZm8nKSk7XG4gICAgaWYgKGN1cnJlbnRVc2VySW5mbyAmJiBjdXJyZW50VXNlckluZm8ucGFnZVNldHRpbmcpIHtcbiAgICAgIGxldCBwYWdlU2V0dGluZ3MgPSBKU09OLnBhcnNlKGN1cnJlbnRVc2VySW5mby5wYWdlU2V0dGluZylcbiAgICAgIHBhZ2VTZXR0aW5ncy5wYWdlU2V0dGluZ3MubWFwKHBhZ2UgPT4ge1xuICAgICAgICBpZiAocGFnZS51cmwgPT09IHRoaXMucm91dGVyLnVybCkge1xuICAgICAgICAgIHBhZ2UuZ3JpZFNldHRpbmdzLm1hcChncmlkU2V0dGluZyA9PiB7XG4gICAgICAgICAgICBpZiAoZ3JpZFNldHRpbmcuZ3JpZElkID09PSB0aGlzLmdyaWRJZCAmJiBncmlkU2V0dGluZz8uY3VzdG9tQ29sdW1uc1dpZHRoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbHVtbnNXaWR0aEtleXMgPSBPYmplY3Qua2V5cyhncmlkU2V0dGluZz8uY3VzdG9tQ29sdW1uc1dpZHRoKTtcbiAgICAgICAgICAgICAgY29sdW1uc1dpZHRoS2V5cy5mb3JFYWNoKChjb2x1bW5LZXk6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb2x1bW5zLmZpbmRJbmRleCgoc2VsZWN0ZWRDb2x1bW4pID0+IHNlbGVjdGVkQ29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpID09PSBjb2x1bW5LZXk/LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbnNbaW5kZXhdWydjdXN0b21XaWR0aCddID0gZ3JpZFNldHRpbmc/LmN1c3RvbUNvbHVtbnNXaWR0aFtjb2x1bW5LZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGFkZER5bmFtaWNQYW5lbE92ZXJsYXlDb21wb25lbnQoaG92ZXJEYXRhOiBhbnksIG92ZXJsYXlQYW5lbDogYW55LCBldmVudDogYW55LCByb3c6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHsgLi4uaG92ZXJEYXRhLmRhdGEgfTtcbiAgICAgIGNvbnN0IGRhdGFLZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gICAgICBjb25zdCByb3dLZXlzID0gT2JqZWN0LmtleXMocm93KTtcbiAgICAgIGlmKGRhdGFLZXlzPy5sZW5ndGg+MCAmJiByb3dLZXlzPy5sZW5ndGggPiAwKXtcbiAgICAgICAgZGF0YUtleXMuZm9yRWFjaChrZXk9PntcbiAgICAgICAgICB2YXIgdmFsdWU9ZGF0YVtrZXldO1xuICAgICAgICAgIGlmKHZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCd7JykmJnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCd9Jykpe1xuICAgICAgICAgICAgdmFsdWU9dmFsdWUucmVwbGFjZShcIntcIixcIlwiKS5yZXBsYWNlKFwifVwiLFwiXCIpO1xuICAgICAgICAgICAgbGV0IHJvd0tleT1yb3dLZXlzPy5maW5kKCh4KSA9PiB4Py50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICB2YXIgY29ycmVjdFZhbHVlPXJvd1tyb3dLZXldO1xuICAgICAgICAgICAgZGF0YVtrZXldPWNvcnJlY3RWYWx1ZTtcbiAgICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaEtleSA9IHJvd0tleXMuZmluZCgoeCkgPT4geD8udG9Mb3dlckNhc2UoKSA9PT0ga2V5Py50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIGlmKG1hdGNoS2V5JiYgIWRhdGFba2V5XSl7XG4gICAgICAgICAgICAgIGRhdGFba2V5XT1yb3dbbWF0Y2hLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaG92ZXJEYXRhPy5zdHlsZSA/IHRoaXMub3ZlcmxheVBhbmVsU3R5bGUgPSBob3ZlckRhdGEuc3R5bGUgOiBcIlwiO1xuICAgICAgdGhpcy5wYW5lbE92ZXJsYXlWaWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWY6IGFueSA9IHRoaXMucGFuZWxPdmVybGF5Vmlld0NvbnRhaW5lcj8uY3JlYXRlQ29tcG9uZW50KGhvdmVyRGF0YS5jb21wb25lbnQpO1xuICAgICAgaWYgKGhvdmVyRGF0YS5kYXRhKSB7XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jb25maWcgPSBbXTtcbiAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmNvbmZpZy5kYXRhID0gZGF0YTtcbiAgICAgIH1cbiAgICAgIG92ZXJsYXlQYW5lbC5zaG93KGV2ZW50KTtcbiAgICB9KTtcblxuICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vICAgY29uc3QgZGF0YSA9IHsgLi4uaG92ZXJEYXRhLmRhdGEgfTtcbiAgICAvLyAgIGNvbnN0IGRhdGFLZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gICAgLy8gICBjb25zdCByb3dLZXlzID0gT2JqZWN0LmtleXMocm93KTtcbiAgICAvLyAgIGlmKGRhdGFLZXlzPy5sZW5ndGg+MCAmJiByb3dLZXlzPy5sZW5ndGggPiAwKXtcbiAgICAvLyAgICAgZGF0YUtleXMuZm9yRWFjaChrZXk9PntcbiAgICAvLyAgICAgICB2YXIgdmFsdWU9ZGF0YVtrZXldO1xuICAgIC8vICAgICAgIGlmKHZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCd7JykmJnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCd9Jykpe1xuICAgIC8vICAgICAgICAgdmFsdWU9dmFsdWUucmVwbGFjZShcIntcIixcIlwiKS5yZXBsYWNlKFwifVwiLFwiXCIpO1xuICAgIC8vICAgICAgICAgbGV0IHJvd0tleT1yb3dLZXlzPy5maW5kKCh4KSA9PiB4Py50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSk7XG4gICAgLy8gICAgICAgICB2YXIgY29ycmVjdFZhbHVlPXJvd1tyb3dLZXldO1xuICAgIC8vICAgICAgICAgZGF0YVtrZXldPWNvcnJlY3RWYWx1ZTtcbiAgICAvLyAgICAgICB9ZWxzZSB7XG4gICAgLy8gICAgICAgICBjb25zdCBtYXRjaEtleSA9IHJvd0tleXMuZmluZCgoeCkgPT4geD8udG9Mb3dlckNhc2UoKSA9PT0ga2V5Py50b0xvd2VyQ2FzZSgpKTtcbiAgICAvLyAgICAgICAgIGlmKG1hdGNoS2V5JiYgIWRhdGFba2V5XSl7XG4gICAgLy8gICAgICAgICAgIGRhdGFba2V5XT1yb3dbbWF0Y2hLZXldO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgfSlcbiAgICAvLyAgIH1cblxuICAgIC8vICAgaG92ZXJEYXRhPy5zdHlsZSA/IHRoaXMub3ZlcmxheVBhbmVsU3R5bGUgPSBob3ZlckRhdGEuc3R5bGUgOiBcIlwiO1xuICAgIC8vICAgdGhpcy5wYW5lbE92ZXJsYXlWaWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgLy8gICBjb25zdCBjb21wb25lbnRSZWY6IGFueSA9IHRoaXMucGFuZWxPdmVybGF5Vmlld0NvbnRhaW5lcj8uY3JlYXRlQ29tcG9uZW50KGhvdmVyRGF0YS5jb21wb25lbnQpO1xuICAgIC8vICAgaWYgKGhvdmVyRGF0YS5kYXRhKSB7XG4gICAgLy8gICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jb25maWcgPSBbXTtcbiAgICAvLyAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmNvbmZpZy5kYXRhID0gZGF0YTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIG92ZXJsYXlQYW5lbC5zaG93KGV2ZW50KTtcbiAgICAvLyB9LCAxMDAwKTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZENvbHVtbnMoKTogSUdyaWRDb2x1bW5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkQ29sdW1ucztcbiAgfVxuXG4gIHNldCBzZWxlY3RlZENvbHVtbnModmFsOiBJR3JpZENvbHVtbltdKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zPy5maWx0ZXIoKGNvbCkgPT4gdmFsLmluY2x1ZGVzKGNvbCkpO1xuICAgIGlmICh0aGlzLmFsbG93UGVyc2lzdGVuY2UgJiYgdGhpcy5hbGxvd0NvbHVtblRvZ2dsZSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRGaWVsZHMgPSB2YWwubWFwKCh4KSA9PiB4LmZpZWxkKTtcbiAgICAgIHRoaXMuc2F2ZUNvbHVtbldpZHRocyhzZWxlY3RlZEZpZWxkcyk7XG4gICAgfVxuICB9XG4gIC8vIHVuYWJsZSB0byBhbGxvdyB1c2VyIHRvIGNvcHkgdGV4dCBmcm9tIGdyaWQgd2hlbiB0aGlzLmFsbG93VGV4dENvcHkgaXMgc2V0IHRvIGZhbHNlLlxuICBASG9zdExpc3RlbmVyKCdjb3B5JywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignY3V0JywgWyckZXZlbnQnXSlcbiAgaGFuZGxlQ29weU9yQ3V0KGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuICAgIGlmICghdGhpcy5hbGxvd1RleHRDb3B5KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9XG4gIFxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50LnRhcmdldCddKSBvbkNsaWNrKGV2ZW50KSB7XG4gICAgaWYoIXRoaXMuZWRpdEFsbFJvd3MgJiYgIXRoaXMuaW5FZGl0TW9kZSAmJiB0aGlzLnNlbGVjdGVkUm93UmVjb3JkKXtcbiAgICAgIHRoaXMuaGFuZGxlUm93Q2xpY2sodGhpcy5zZWxlY3RlZFJvd1JlY29yZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gYnJvd3NlciBjbG9zZSBldmVudFxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6YmVmb3JldW5sb2FkJywgWyckZXZlbnQnXSlcbiAgYmVmb3JldW5sb2FkSGFuZGxlcihldmVudDogYW55KSB7XG4gICAgaWYgKHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXNzaWdubWVudCBvZiBzZWxlY3RlZCBjb2x1bW5zIG9uIHBhZ2UgbG9hZFxuICAgKi9cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5ncmlkU2VydmljZS5pbmNyZW1lbnRDYWxscygpO1xuICAgIGlmICh0aGlzLmdyaWRTZXJ2aWNlLmdldE51bWJlck9mQ2FsbHMoKSA9PT0gMSkge1xuICAgICAgdGhpcy5zZWFyY2hidG5JZCA9ICdzZWFyY2hHbG9iYWxGaWx0ZXJCdG4nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlYXJjaGJ0bklkID0gYEZpbHRlcl8ke2N1cnJlbnRVcmwoKX1fJHt0aGlzLmdyaWRTZXJ2aWNlLmdldE51bWJlck9mQ2FsbHMoKX1gO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZXRHcmlkUmVmcmVzaFRpbWUpIHtcbiAgICAgIHRoaXMucmVmcmVzaEdyaWQoKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMub25Sb3dVcGRhdGU/Lm9ic2VydmVycz8ubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMuaGlkZUVkaXRCdG4gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVkaXRBbGxSb3dzICYmIHRoaXMub25Sb3dEZWxldGUub2JzZXJ2ZXJzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmRpc2FibGVkU2F2ZUJ0biA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5jb21wb25lbnRUYWJsZVJlZiA9IHRoaXMudGFibGU7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnJvd3NDaGFuZ2UuZW1pdCh0aGlzLnJvd3NEYXRhKTtcbiAgICB9KTtcblxuICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vICAgdGhpcy5zZXROdW1lcmljVmFsdWVzKCk7XG4gICAgLy8gfSwgNTAwKTtcbiAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAvLyAgIGlmICh0aGlzLnJvd3NDaGFuZ2Uub2JzZXJ2ZXJzPy5sZW5ndGgpIHtcbiAgICAvLyAgICAgdGhpcy5yb3dzQ2hhbmdlLmVtaXQodGhpcy5yb3dzRGF0YSk7XG4gICAgLy8gICB9XG4gICAgLy8gfSwgMjAwMCk7XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGxldCBmaWx0ZXJzID0gMTAwMDtcbiAgICB0aGlzLmNvbXBvbmVudFRhYmxlUmVmID0gdGhpcy50YWJsZTtcbiAgICBsZXQgZmlsdGVyOiBTdWJzY3JpcHRpb24gPSBpbnRlcnZhbChmaWx0ZXJzKS5zdWJzY3JpYmUoKHgpID0+IHtcbiAgICAgIGZpbHRlcnMgPSAwO1xuICAgICAgZmlsdGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICBjb25zdCBmaWx0ZXJDb2x1bW4gPSB0aGlzLmNvbHVtbnM/LmZpbmQoKGNvbHVtbikgPT4gIXRoaXMuaGlkZUZpbHRlciAmJiAhY29sdW1uPy5oaWRkZW4gJiYgY29sdW1uPy5maWx0ZXIgJiYgKGNvbHVtbj8uZmlsdGVyaW5nID09PSB0cnVlIHx8IGNvbHVtbj8uZmlsdGVyaW5nID09PSB1bmRlZmluZWQpKTtcbiAgICAgIGNvbnN0IGxvb2t1cE1vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxvb2t1cC1tb2RlbCcpO1xuICAgICAgY29uc3QgZmlsdGVyRmllbGQ6IGFueSA9IGxvb2t1cE1vZGFsPy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGZpbHRlckNvbHVtbj8uZmllbGQ/LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgY29uc3QgZmlsdGVyRmllbGRzOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGZpbHRlckNvbHVtbj8uZmllbGQ/LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgaWYgKGZpbHRlckZpZWxkIHx8IGZpbHRlckZpZWxkcykge1xuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyRmllbGQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgZmlsdGVyRmllbGRbMF0/LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsdGVyRmllbGRzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGZpbHRlckZpZWxkc1swXT8uZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldEZvY3VzT3V0VG9maWx0ZXJzKCkge1xuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29uc3QgY29sdW1uRmlsdGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnAtY29sdW1uLWZpbHRlcicpXG4gICAgICBpZihjb2x1bW5GaWx0ZXIpe1xuICAgICAgICAgIGNvbnN0IGlucHV0ID0gY29sdW1uRmlsdGVyWzBdLmNoaWxkcmVuWzBdLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JylcbiAgICAgICAgICBpZihpbnB1dCl7XG4gICAgICAgICAgICAgIGlucHV0LmZvY3VzKClcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnJlZnJlc2hHcmlkVGVybWluYXRvcigpO1xuICB9XG5cbiAgLy8gc2V0IE11bHRpc2VsZWN0IFRvZ2dsZSBDb2x1bW4gLy9cbiAgc2V0TXVsdGlTZWxlY3RUb2dnbGVDb2x1bW4oc2VsZWN0ZWRGaWVsZHM6IGFueVtdID0gW10pIHtcbiAgICBpZiAodGhpcy51c2VyU2V0dGluZz8ucGFnZVNldHRpbmdzPy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtYXRjaFVybCA9IHRoaXMudXNlclNldHRpbmc/LnBhZ2VTZXR0aW5ncz8uZmluZEluZGV4KChwYWdlKSA9PiBwYWdlPy51cmwgPT09IHRoaXMucm91dGVyLnVybClcbiAgICAgIGlmIChtYXRjaFVybCA+IC0xKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoR3JpZCA9IHRoaXMudXNlclNldHRpbmc/LnBhZ2VTZXR0aW5nc1ttYXRjaFVybF0/LmdyaWRTZXR0aW5ncz8uZmluZEluZGV4KChncmlkU2V0dGluZykgPT4gZ3JpZFNldHRpbmc/LmdyaWRJZCA9PT0gdGhpcy5jb21wb25lbnRUYWJsZVJlZj8uaWQpO1xuICAgICAgICBpZiAobWF0Y2hHcmlkID4gLTEpIHtcbiAgICAgICAgICB0aGlzLnVzZXJTZXR0aW5nPy5wYWdlU2V0dGluZ3NbbWF0Y2hVcmxdPy5ncmlkU2V0dGluZ3Muc3BsaWNlKG1hdGNoR3JpZCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0Z3JpZFNldHRpbmdzKHNlbGVjdGVkRmllbGRzLCBtYXRjaFVybCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXNlclNldHRpbmcucGFnZVNldHRpbmdzID0gW107XG4gICAgICB0aGlzLnNldGdyaWRTZXR0aW5ncyhzZWxlY3RlZEZpZWxkcyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U2VsZWN0ZWRDb2xGcm9tTG9jYWxTdHJvcmFnZShzZWxlY3RlZENvbHVtbikge1xuICAgIGxldCBhcnIgPSBbXTtcbiAgICBpZiAoc2VsZWN0ZWRDb2x1bW4gJiYgc2VsZWN0ZWRDb2x1bW4/LnBhZ2VTZXR0aW5ncz8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbWF0Y2hVcmwgPSBzZWxlY3RlZENvbHVtbj8ucGFnZVNldHRpbmdzPy5maW5kSW5kZXgoKHBhZ2UpID0+IHBhZ2U/LnVybCA9PT0gdGhpcy5yb3V0ZXIudXJsKVxuICAgICAgaWYgKG1hdGNoVXJsID4gLTEpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hHcmlkID0gc2VsZWN0ZWRDb2x1bW4/LnBhZ2VTZXR0aW5nc1ttYXRjaFVybF0/LmdyaWRTZXR0aW5ncz8uZmluZCgoZ3JpZFNldHRpbmcpID0+IGdyaWRTZXR0aW5nPy5ncmlkSWQgPT09IHRoaXMuZ3JpZElkKTtcbiAgICAgICAgaWYgKG1hdGNoR3JpZCAmJiBtYXRjaEdyaWQuc2VsZWN0ZWRDb2x1bW5zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgaWYgKG1hdGNoR3JpZC5zZWxlY3RlZENvbHVtbnMuc29tZSgoZmllbGROYW1lKSA9PiBmaWVsZE5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IGNvbHVtbj8uZmllbGQ/LnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgIGFyci5wdXNoKGNvbHVtbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhcnI/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBzZXRncmlkU2V0dGluZ3Moc2VsZWN0ZWRGaWVsZHM6IGFueSwgbWF0Y2hVcmw/OiBhbnkpIHtcbiAgICBpZiAoc2VsZWN0ZWRGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGdyaWRTZXR0aW5nczogYW55W10gPSBbXTtcbiAgICAgIGdyaWRTZXR0aW5ncy5wdXNoKHtcbiAgICAgICAgZ3JpZElkOiB0aGlzLmdyaWRJZCxcbiAgICAgICAgc2VsZWN0ZWRDb2x1bW5zOiBzZWxlY3RlZEZpZWxkcyxcbiAgICAgICAgY3VzdG9tQ29sdW1uc1dpZHRoOiB0aGlzLmN1c3RvbVdpZHRoQ29sdW1ucyxcbiAgICAgIH0pXG4gICAgICBjb25zdCBwYWdlU2V0dGluZyA9IHtcbiAgICAgICAgdXJsOiB0aGlzLnJvdXRlci51cmwsXG4gICAgICAgIGdyaWRTZXR0aW5nczogZ3JpZFNldHRpbmdzLFxuICAgICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKVxuICAgICAgfVxuICAgICAgdGhpcy51c2VyU2V0dGluZy5sYXN0VXBkYXRlZCA9IG5ldyBEYXRlKCk7XG4gICAgICBpZiAobWF0Y2hVcmwgPiAtMSkge1xuICAgICAgICB0aGlzLnVzZXJTZXR0aW5nLnBhZ2VTZXR0aW5nc1ttYXRjaFVybF0gPSBwYWdlU2V0dGluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXNlclNldHRpbmcucGFnZVNldHRpbmdzLnB1c2gocGFnZVNldHRpbmcpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFnZUluZm8gPSBKU09OLnN0cmluZ2lmeSh0aGlzLnVzZXJTZXR0aW5nKTtcbiAgICAgIGNoYW5nZUNvbHVtbnNTdGF0ZSh7IHBhZ2VTZXR0aW5nOiBwYWdlSW5mbyB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBhcHBseSB1c2VyIHJvbGUgcGVybWlzc2lvbnMgb24gZ3JpZCBjb2x1bW5zXG4gIGFwcGx5Q29sdW1uc1Blcm1pc3Npb25zKCkge1xuICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcbiAgICAgIGxldCB0b3RhbEZpZWxkczogbnVtYmVyID0gMDtcbiAgICAgIGxldCBoaWRkZW5GaWVsZHM6IG51bWJlciA9IDA7XG5cbiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IElHcmlkQ29sdW1uKSA9PiB7XG4gICAgICAgIGxldCBwZXJtaXNzaW9uczogSVBlcm1pc3Npb25bXSA9IGNvbHVtbi5wZXJtaXNzaW9ucztcbiAgICAgICAgbGV0IGhhc1ZhbGlkRWRpdFBlcm1pc3Npb24gPSBmYWxzZTtcblxuICAgICAgICBpZiAocGVybWlzc2lvbnMgJiYgcGVybWlzc2lvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb24pID0+IHtcbiAgICAgICAgICAgIGxldCBpc1ZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbi5yb2xlcyAmJiBwZXJtaXNzaW9uLnJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgcGVybWlzc2lvbi5yb2xlcy5mb3JFYWNoKChyb2xlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkICYmIHRoaXMucm9sZXMgJiYgdGhpcy5yb2xlcy5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLlZJRVcgJiZcbiAgICAgICAgICAgICAgICAhaGFzVmFsaWRFZGl0UGVybWlzc2lvblxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgY29sdW1uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgY29sdW1uLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkVESVQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgaGFzVmFsaWRFZGl0UGVybWlzc2lvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBjb2x1bW4uaGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICBjb2x1bW4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0b3RhbEZpZWxkcysrO1xuICAgICAgICBpZiAoY29sdW1uLmhpZGRlbikge1xuICAgICAgICAgIGhpZGRlbkZpZWxkcysrO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5pc0NvbHVtbkhpZGRlbiA9IHRvdGFsRmllbGRzID4gMCAmJiB0b3RhbEZpZWxkcyA9PT0gaGlkZGVuRmllbGRzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFwcGx5IGdsb2JhbCBwZXJtaXNzaW9ucyBvbiBlbnRpcmUgZ3JpZFxuICBhcHBseUdyaWRQZXJtaXNzaW9ucygpIHtcbiAgICBpZiAodGhpcy5wZXJtaXNzaW9ucyAmJiB0aGlzLnBlcm1pc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBoYXNWYWxpZEVkaXRQZXJtaXNzaW9uID0gZmFsc2U7XG5cbiAgICAgIC8vIGNoZWNrIGlmIGFueSBjb2x1bW4gaGFzIGFueSBwZXJtaXNzaW9uXG4gICAgICBsZXQgaGFzQ29sdW1uUGVybWlzc2lvbnMgPSB0aGlzLmNvbHVtbnM/LnNvbWUoXG4gICAgICAgICh4KSA9PiB4Py5wZXJtaXNzaW9ucyAmJiB4LnBlcm1pc3Npb25zLmxlbmd0aCA+IDBcbiAgICAgICk7XG5cbiAgICAgIHRoaXMucGVybWlzc2lvbnMuZm9yRWFjaCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgICBsZXQgaXNWYWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgICAgIHBlcm1pc3Npb24ucm9sZXMuZm9yRWFjaCgocm9sZSkgPT4ge1xuICAgICAgICAgIGlmICghaXNWYWxpZCAmJiB0aGlzLnJvbGVzICYmIHRoaXMucm9sZXMuaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkNSVUQgJiYgIWlzVmFsaWQpIHtcbiAgICAgICAgICB0aGlzLnVzZUlubGluZUNSVUQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICBwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5WSUVXICYmXG4gICAgICAgICAgIWhhc1ZhbGlkRWRpdFBlcm1pc3Npb25cbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy51c2VJbmxpbmVDUlVEID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoIWlzVmFsaWQgJiYgIWhhc0NvbHVtblBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgICB0aGlzLmlzR3JpZEhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnVzZUlubGluZUNSVUQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGVybWlzc2lvbi50eXBlID09PSBFUGVybWlzc2lvblR5cGUuRURJVCAmJiAhaXNWYWxpZCkge1xuICAgICAgICAgIHRoaXMuaXNHcmlkSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgaGFzVmFsaWRFZGl0UGVybWlzc2lvbiA9IHRydWU7XG4gICAgICAgICAgdGhpcy5lZGl0Um93UGVybWlzc2lvbiA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkRFTEVURSAmJiAhaXNWYWxpZCkge1xuICAgICAgICAgIHRoaXMuZGVsZXRlUm93UGVybWlzc2lvbiA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkFERFJPVyAmJiAhaXNWYWxpZCkge1xuICAgICAgICAgIHRoaXMuYWRkUm93UGVybWlzc2lvbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMub25Sb3dBZGQub2JzZXJ2ZXJzLmxlbmd0aCA9PSAwKSB0aGlzLmFkZFJvd1Blcm1pc3Npb24gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5vblJvd0RlbGV0ZS5vYnNlcnZlcnMubGVuZ3RoID09IDApIHRoaXMuZGVsZXRlUm93UGVybWlzc2lvbiA9IGZhbHNlO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucmVtYWluaW5nUm93c0RhdGE/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLnJvd3NEYXRhID0gWy4uLnRoaXMucmVtYWluaW5nUm93c0RhdGFdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBpZiAoIXRoaXMuaXNDaGVja0JveENoYW5nZUV2ZW50Q2FsbGVkICYmICF0aGlzLmdyaWRTZXJ2aWNlLnJvd1VwZGF0ZSkge1xuICAgICAgdGhpcy5zZXRHcmlkSWQoKVxuICAgICAgdGhpcy5jb21wb25lbnRUYWJsZVJlZiA9IHRoaXMudGFibGU7XG4gICAgICBsZXQgZ2V0U2VsZWN0ZWRDb2wgPSBbXVxuICAgICAgaWYgKHRoaXMuYWxsb3dDYWNoaW5nICE9PSBmYWxzZSAmJiB0aGlzLnBhZ2luYXRpb24pIHtcbiAgICAgICAgdGhpcy5hbGxvd0NhY2hpbmcgPSB0aGlzLnBhZ2luYXRpb247XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdTZXRGaWx0ZXJzLScgKyB0aGlzLmNvbXBvbmVudFRhYmxlUmVmPy5pZCArIHRoaXMuY3VycmVudFVybCk7XG4gICAgICB9XG4gICAgICAvLyBhZGQgZGVmYXVsdFJvdyBpbiBwYWdpbmF0aW9uIGFycmF5XG4gICAgICBpZiAoIXRoaXMuc2V0UGFnaW5hdGlvbkxlbmd0aC5pbmNsdWRlcyh0aGlzLmRlZmF1bHRSb3dzKSkge1xuICAgICAgICB0aGlzLnNldFBhZ2luYXRpb25MZW5ndGgudW5zaGlmdCh0aGlzLmRlZmF1bHRSb3dzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0NvbHVtbnM6IGJvb2xlYW4gPSB0aGlzLmNvbHVtbnMgJiYgdGhpcy5jb2x1bW5zLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoaGFzQ29sdW1ucykge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmdyaWRTZXJ2aWNlLnNldENvbHVtbkZpZWxkcyh0aGlzLmNvbHVtbnMpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkVG9nZ2xlQ29sdW1ucyA9IHRoaXMuY29sdW1ucz8uZmlsdGVyKCh4KSA9PiAheC5oaWRkZW4pO1xuICAgICAgICBjb25zdCBjdXJyZW50VXNlckluZm8gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdDdXJyZW50VXNlckluZm8nKSk7XG4gICAgICAgIC8vc2V0IGdldFNlbGVjdGVkQ29sIGNvbHVtbnMgZm9yIHRvZ2dsZUNvdWxtbiBcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dQZXJzaXN0ZW5jZSAmJiB0aGlzLmFsbG93Q29sdW1uVG9nZ2xlKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRVc2VySW5mbyAmJiBjdXJyZW50VXNlckluZm8ucGFnZVNldHRpbmcpIHtcbiAgICAgICAgICAgIGdldFNlbGVjdGVkQ29sID0gdGhpcy5nZXRTZWxlY3RlZENvbEZyb21Mb2NhbFN0cm9yYWdlKEpTT04ucGFyc2UoY3VycmVudFVzZXJJbmZvLnBhZ2VTZXR0aW5nKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucm9sZXMgPSB0aGlzLmF1dGhTZXJ2aWNlLmdldFVzZXJSb2xlcygpO1xuXG4gICAgICAgIC8vIGFwcGx5IHVzZXIgcm9sZSBwZXJtaXNzaW9ucyBvbiBncmlkIGNvbHVtbnNcbiAgICAgICAgdGhpcy5hcHBseUNvbHVtbnNQZXJtaXNzaW9ucygpO1xuXG4gICAgICAgIC8vIGFwcGx5IGdsb2JhbCBwZXJtaXNzaW9ucyBvbiBlbnRpcmUgZ3JpZFxuICAgICAgICB0aGlzLmFwcGx5R3JpZFBlcm1pc3Npb25zKCk7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucz8uZmlsdGVyKCh4KSA9PiAoeC5zaG93ID09PSB0cnVlIHx8IHguc2hvdyA9PT0gdW5kZWZpbmVkKSAmJiAheC5oaWRkZW4pO1xuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgLy9sb2FkIGNvbHVtbiB3aXRkdGggb24gcGFnZSByZWxvYWRcbiAgICAgICAgdGhpcy5sb2FkQ29sdW1uV2lkdGhzKCk7XG4gICAgICAgIGlmKHRoaXMucm93c0RhdGEubGVuZ3RoID4gMCl7XG4gICAgICAgICAgdGhpcy5mb3JtU2VydmljZS5zZXRUb29sdGlwKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVja2luZyBmaWx0ZXIgZXhpc3Qgb3Igbm90XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuX3NlbGVjdGVkQ29sdW1ucy5zb21lKFxuICAgICAgICAgIChjb2x1bW4pID0+IGNvbHVtbi5maWx0ZXJpbmcgPT09IHVuZGVmaW5lZCB8fCBjb2x1bW4uZmlsdGVyaW5nID09PSB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChmaWx0ZXIgPT09IGZhbHNlKSB7XG4gICAgICAgICAgdGhpcy5oaWRlRmlsdGVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlsdGVyRm9jdXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbjogYW55KSA9PiB7XG4gICAgICAgICAgLy8gc2V0IGlzUmVxdWlyZWQgdHJ1ZSBmb3IgcmVxdWlyZWQgY29sdW1uIHRvIHNob3cgYXN0cmljIGluIGNvbHVtbiBoZWFkZXJcbiAgICAgICAgICBpZiAoY29sdW1uLnZhbGlkYXRpb25zPy5maW5kKHZhbGlkYXRpb24gPT4gdmFsaWRhdGlvbi50eXBlID09IEVHcmlkVmFsaWRhdG9yLlJFUVVJUkVEKSkge1xuICAgICAgICAgICAgY29sdW1uLmlzUmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBzZXQgbnVtZXJpYyBudWxsIG9yIHVuZGVmaW5lIGRhdGEgZGVmYXVsdCB2YWx1ZVxuICAgICAgICAgIGlmICgoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5OVU1FUklDIHx8IGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuQk9PTEVBTiB8fCBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLlRFWFQgfHwgY29sdW1uLnR5cGUgPT09IHVuZGVmaW5lZCB8fCBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkRBVEUgfHwgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EUk9QRE9XTikgJiYgY29sdW1uLnZhbHVlICYmIHRoaXMucm93c0RhdGE/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjb2x1bW4udmFsdWUgJiYgKHJvd1tjb2x1bW4uZmllbGRdID09PSBudWxsIHx8IHJvd1tjb2x1bW4uZmllbGRdID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPSByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8udmFsdWUgPyByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8udmFsdWUgOiBjb2x1bW4udmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vc2V0IHRleHRUeXBlIGZvciBhIGNvbHVtbiB0aGF0IGlzIGZvcm1hdHRlZCB0byBiZSBhIHBhc3N3b3JkXG4gICAgICAgICAgaWYgKGNvbHVtbi5mb3JtYXQgPT0gJ3Bhc3N3b3JkJyAmJiAoIWNvbHVtbi50ZXh0VHlwZSB8fCBjb2x1bW4udGV4dFR5cGUgIT09ICd0ZXh0JykpIHtcbiAgICAgICAgICAgIGNvbHVtbi50ZXh0VHlwZSA9ICdwYXNzd29yZCc7XG4gICAgICAgICAgfSBlbHNlIGNvbHVtbi50ZXh0VHlwZSA9ICd0ZXh0JztcbiAgICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB0aW1lIGludG8gdGhlIGRhdGVcbiAgICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EQVRFKSB7XG4gICAgICAgICAgICBpZiAoY29sdW1uLnRpbWVPbmx5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gJiZcbiAgICAgICAgICAgICAgICAgIChyb3dbY29sdW1uLmZpZWxkXS50b1N0cmluZygpLmluY2x1ZGVzKCdQTScpIHx8XG4gICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0FNJykpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHNldFRpbWVJbkRhdGUocm93W2NvbHVtbi5maWVsZF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFjb2x1bW4ubWludXRlc0ludGVydmFsKSB7XG4gICAgICAgICAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocm93W2NvbHVtbi5maWVsZF0pIHtcbiAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gbmV3IERhdGUocm93W2NvbHVtbi5maWVsZF0gYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuaGlkZUZpbHRlciAmJiBjb2x1bW4uZmlsdGVyVmFsdWUgJiYgY29sdW1uLmZpbHRlciAmJiBjb2x1bW4uZmlsdGVyaW5nICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgLy8gc2V0IGZpbHRlciB2YWx1ZVxuICAgICAgICAgICAgICB0aGlzLnNldEZpbHRlckZvY3VzT3V0KGNvbHVtbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc2V0IERpc3BsYXlUZXh0IHdoZW4gdmFsdWUgaXMgaW4gY3VybHkgYnJhY2tldHMuXG4gICAgICAgICAgdGhpcy5zZXREaXNwbGF5VGV4dFZhbHVlKGNvbHVtbik7XG5cbiAgICAgICAgICAvL0FnZ3JlZ2F0ZSBzY2VuYXJpb1xuICAgICAgICAgIGlmIChjb2x1bW4uYWdncmVnYXRlICYmIGNvbHVtbi5hZ2dyZWdhdGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hZ2dyZWdhdGVGb290ZXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRBZ2dyZWdhdGVUZXh0KGNvbHVtbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHNlYXJjaEZpbHRlcnM7XG4gICAgICAgICAgaWYgKCF0aGlzLnNvZnRDYWNoaW5nICYmIHRoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkKSB7XG4gICAgICAgICAgICBzZWFyY2hGaWx0ZXJzID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ1NldEZpbHRlcnMtJyArIHRoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkICsgdGhpcy5jdXJyZW50VXJsKSBhcyBhbnlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbXBvbmVudFRhYmxlUmVmPy5pZCkge1xuICAgICAgICAgICAgc2VhcmNoRmlsdGVycyA9IHRoaXMuZ3JpZFNlcnZpY2Uuc29mdENhY2hpbmdGaWx0ZXJzW3RoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkICsgdGhpcy5jdXJyZW50VXJsXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuaGlkZUZpbHRlciAmJlxuICAgICAgICAgICAgc2VhcmNoRmlsdGVycyAmJlxuICAgICAgICAgICAgc2VhcmNoRmlsdGVycy5maWx0ZXJzICYmXG4gICAgICAgICAgICBzZWFyY2hGaWx0ZXJzLmZpbHRlcnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHNlYXJjaEZpbHRlcnMuZmlsdGVycy5mb3JFYWNoKCh4OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHguZmllbGQgPT09IGNvbHVtbi5maWVsZCkge1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4/LmZpbHRlcj8udHlwZSA9PT0gJ2NhbGVuZGFyJyAmJiB4LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICBjb2x1bW4uZmlsdGVyVmFsdWUgPSBuZXcgRGF0ZSh0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh4LnZhbHVlLCAnTU0tZGQtWVknKSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5NVUxUSVNFTEVDVCAmJiAhQXJyYXkuaXNBcnJheSh4LnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgY29sdW1uLmZpbHRlclZhbHVlID0geC52YWx1ZT8uc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHgudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5maWx0ZXJWYWx1ZSA9IHgudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gY29udmVydGluZyBkaXNwbGF5RmllbGQgdG9Mb3dlcmNhc2VcbiAgICAgICAgICBpZiAoY29sdW1uLmRpc3BsYXlGaWVsZCkge1xuICAgICAgICAgICAgY29sdW1uLmRpc3BsYXlGaWVsZCA9IGNvbHVtbi5kaXNwbGF5RmllbGQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gc2V0IEF1dG9Db21wbGV0ZSBEYXRhXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5BVVRPQ09NUExFVEUgJiZcbiAgICAgICAgICAgIHRoaXMucm93c0RhdGEgJiZcbiAgICAgICAgICAgIHRoaXMucm93c0RhdGE/Lmxlbmd0aCA+IDBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHRoYXQgY29udGFpbnMgY29tbWEgaW50byBhcnJheXNcbiAgICAgICAgICAgICAgaWYgKHJvd1tjb2x1bW4uZmllbGRdPy50b1N0cmluZygpLmluY2x1ZGVzKCc7JykpIHtcbiAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHJvd1tjb2x1bW4uZmllbGRdXG4gICAgICAgICAgICAgICAgICA/LnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgIC5zcGxpdCgnOycpXG4gICAgICAgICAgICAgICAgICA/Lm1hcCgodmFsdWU6IGFueSkgPT4gKHsgW2NvbHVtbi5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCldOiByb3dbY29sdW1uLmRpc3BsYXlGaWVsZF0sIFtjb2x1bW4ub3B0aW9uTGFiZWw/LnRvTG93ZXJDYXNlKCldOiB2YWx1ZSwgW2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKV06IHZhbHVlIH0pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBrZXk6IGFueSA9IE9iamVjdC5rZXlzKHJvdykuZmluZCgoeCkgPT4geCA9PT0gY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAvLyBjb252ZXJ0IHNpbXBsZSBzdHJpbmcgaW50byBhcnJheVxuICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocm93W2tleV0pICYmIHJvd1trZXldKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5kaXNwbGF5RmllbGQpIHtcbiAgICAgICAgICAgICAgICAgIHJvd1trZXldID0gW3sgW2NvbHVtbi5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCldOiByb3dbY29sdW1uLmRpc3BsYXlGaWVsZF0sIFtjb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCldOiByb3dba2V5XSB9XTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5vcHRpb25MYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICByb3dba2V5XSA9IFt7IFtjb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCldOiByb3dba2V5XSwgW2NvbHVtbi5vcHRpb25MYWJlbD8udG9Mb3dlckNhc2UoKV06IHJvd1trZXldIH1dO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcm93W2tleV0gPSBbeyBbY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpXTogcm93W2tleV0gfV07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvL3doZW4gd2UgYWRkIGEgbmV3IHJvdywgaXQgc2V0IHRoZSBkZWZhdWx0IHZhbHVlXG4gICAgICAgICAgaWYgKGNvbHVtbi52YWx1ZSkge1xuICAgICAgICAgICAgbGV0IGtleSA9IE9iamVjdC5rZXlzKHRoaXMubmV3R3JpZFJvdykuZmluZCgoeCkgPT4geD8udG9Mb3dlckNhc2UoKSA9PT0gY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgdGhpcy5uZXdHcmlkUm93W2NvbHVtbi5maWVsZF0gPSBjb2x1bW4udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5hbGxvd1BlcnNpc3RlbmNlICYmIGdldFNlbGVjdGVkQ29sPy5sZW5ndGggPiAwICYmIHRoaXMuYWxsb3dDb2x1bW5Ub2dnbGUpIHtcbiAgICAgICAgICB0aGlzLnNldFNlbGVjdENvbHVtbnMoZ2V0U2VsZWN0ZWRDb2wpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0U2VsZWN0Q29sdW1ucyh0aGlzLmNvbHVtbnMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdsb2JhbEZpbHRlckJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2VhcmNoYnRuSWQpO1xuICAgICAgICBpZiAoZ2xvYmFsRmlsdGVyQnRuKSB7XG4gICAgICAgICAgdGhpcy5zaG93RmlsdGVyYnRuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlLnJvd3MpIHtcbiAgICAgICAgICBjb25zdCBjbGFzc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoaWdobGlnaHRlZC1yb3cnKTtcbiAgICAgICAgICBpZiAoY2xhc3NFbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNsYXNzRWxlbWVudFswXS5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0QWxsUm93cyAmJiB0aGlzLnJvd3NEYXRhPy5sZW5ndGggPiAwICYmIHRoaXMuY29sdW1ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdEFsbFJvd3NBdE9uY2UoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0RHJvcGRvd25kYXRhVmFsdWUgPSB0cnVlO1xuICAgICAgY29uc3QgZ2xvYmFsU2VhcmNoYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dsb2JhbFNlYXJjaGJ0bicpO1xuICAgICAgaWYgKGdsb2JhbFNlYXJjaGJ0bikge1xuICAgICAgICB0aGlzLnNlYXJjaEdyaWRGaWx0ZXIgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnJvd3NEYXRhPy5sZW5ndGggPiAwICYmIHRoaXMuZ2VuZXJhdGVSb3dzRGF0YUNvcHkpIHtcbiAgICAgICAgdGhpcy5yb3dzRGF0YUNvcHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMucm93c0RhdGEpKTtcbiAgICAgIH1cbiAgICAgIGlmKCF0aGlzLnN0b3BEaWFsb2dDbG9zZSl7XG4gICAgICAgIHRoaXMuZGVmYXVsdFJvd0NsaWNrKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucm93VXBkYXRlQ2hhbmdlID0gZmFsc2U7XG4gICAgdGhpcy5pc0NoZWNrQm94Q2hhbmdlRXZlbnRDYWxsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHNldEdyaWRJZCgpe1xuICAgIGxldCB0YWJsZXMgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdwLXRhYmxlJyk7XG4gICAgICBpZiAodGFibGVzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRhYmxlcy5mb3JFYWNoKCh0YWJsZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICB0YWJsZS5zZXRBdHRyaWJ1dGUoJ2lkJywgdGhpcy5jdXJyZW50VXJsK2luZGV4KTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgfVxuICBzZXRTZWxlY3RDb2x1bW5zKGNvbHVtbnMpIHtcbiAgICB0aGlzLl9zZWxlY3RlZENvbHVtbnMgPSBbXTtcbiAgICBjb2x1bW5zPy5mb3JFYWNoKCh4LCBpKSA9PiB7XG4gICAgICBpZiAoKHguc2hvdyA9PT0gdHJ1ZSB8fCB4LnNob3cgPT09IHVuZGVmaW5lZCkgJiYgIXguaGlkZGVuKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ29sdW1uc1tpXSkge1xuICAgICAgICAgIHgudmFsdWUgPSB0aGlzLnNlbGVjdGVkQ29sdW1uc1tpXS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZWxlY3RlZENvbHVtbnMucHVzaCh4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGF1dG9Db21wbGV0ZVNlbGVjdGVkVmFsdWUocm93OiBhbnksIGNvbHVtbjogSUdyaWRDb2x1bW4sIHZhbHVlKSB7XG4gICAgaWYgKGNvbHVtbi5vcHRpb25MYWJlbCkge1xuICAgICAgY29uc3QgdmFsdWVLZXkgPSBjb2x1bW4ub3B0aW9uVmFsdWUgPyBjb2x1bW4ub3B0aW9uVmFsdWUgOiBjb2x1bW4uZmllbGQ7XG4gICAgICByb3dbY29sdW1uLmZpZWxkXSA9IFsuLi5yb3dbY29sdW1uLmZpZWxkXSwge1xuICAgICAgICBbY29sdW1uLm9wdGlvbkxhYmVsPy50b0xvd2VyQ2FzZSgpXTogdmFsdWVbY29sdW1uLm9wdGlvbkxhYmVsPy50b0xvd2VyQ2FzZSgpXSwgW3ZhbHVlS2V5Py50b0xvd2VyQ2FzZSgpXTogdmFsdWVbdmFsdWVLZXk/LnRvTG93ZXJDYXNlKCldLFxuICAgICAgICBbY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpXTogdmFsdWVbdmFsdWVLZXk/LnRvTG93ZXJDYXNlKCldXG4gICAgICB9XTtcbiAgICAgIGNvbnN0IGluZGV4ID0gcm93W2NvbHVtbi5maWVsZF0/LmZpbmRJbmRleCgoeCkgPT4gSlNPTi5zdHJpbmdpZnkoeCkgPT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICByb3dbY29sdW1uLmZpZWxkXS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHNldCBEaXNwbGF5VGV4dCB3aGVuIHZhbHVlIGlzIGluIGN1cmx5IGJyYWNrZXRzLlxuICBzZXREaXNwbGF5VGV4dFZhbHVlKGNvbHVtbjogSUdyaWRDb2x1bW4pIHtcbiAgICB0aGlzLnJvd3NEYXRhPy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5MSU5LIHx8XG4gICAgICAgIEVHcmlkQ29sdW1uVHlwZS5ESUFMT0cgfHxcbiAgICAgICAgRUdyaWRDb2x1bW5UeXBlLklGUkFNRVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ107XG4gICAgICAgIGlmIChjb2x1bW4uZGlzcGxheVRleHQgJiYgY29sdW1uLmRpc3BsYXlUZXh0LmluY2x1ZGVzKCd7JykpIHtcbiAgICAgICAgICBjb25zdCBkaXNwbGF5VGV4dCA9IGNvbHVtbi5kaXNwbGF5VGV4dFxuICAgICAgICAgICAgLnJlcGxhY2UoJ3snLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKCd9JywgJycpO1xuICAgICAgICAgIGlmIChkaXNwbGF5VGV4dCAmJiBmaWVsZCkge1xuICAgICAgICAgICAgZmllbGQuZGlzcGxheVRleHQgPSByb3dbZGlzcGxheVRleHQudG9Mb3dlckNhc2UoKV07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi5kaXNwbGF5VGV4dCAmJiBmaWVsZCkge1xuICAgICAgICAgIGZpZWxkLmRpc3BsYXlUZXh0ID0gY29sdW1uLmRpc3BsYXlUZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXROdW1lcmljTWluTXhGcmFjdGlvbihjb2x1bW46IGFueSkge1xuICAgIGxldCBkaWdpdEluZm8gPSAnMic7XG4gICAgaWYgKGNvbHVtbj8uZm9ybWF0LnR5cGUgPT09ICdwZXJjZW50JyAmJiAhY29sdW1uPy5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbykge1xuICAgICAgZGlnaXRJbmZvID0gJzAnXG4gICAgfSBlbHNlIGlmIChjb2x1bW4/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvKSB7XG4gICAgICBkaWdpdEluZm8gPSBjb2x1bW4uZm9ybWF0LmZvcm1hdFBhcmFtcy5kaWdpdHNJbmZvO1xuICAgIH1cbiAgICByZXR1cm4gZGlnaXRJbmZvO1xuICB9XG5cbiAgLy8gc2V0IHRoZSBmb3JtYXQgb2YgY3VycmVuY3kgJiYgbnVtYmVyICYmIGRlY2ltYWwgJiYgcGVyY2VudFxuICBzZXROdW1lcmljRm9ybWF0KGNvbHVtbjogYW55LCByb3c6IGFueSkge1xuICAgIHJvdyA9IG9iakNvbnZlcnRUb0xvd2VyKHJvdyk7XG4gICAgbGV0IHZhbHVlOiBhbnkgPSByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlzcGxheVRleHRcbiAgICAgID8gcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlUZXh0XG4gICAgICA6IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKClcbiAgICAgICAgPyByb3dbcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV1cbiAgICAgICAgOiByb3dbY29sdW1uLmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV1cbiAgICAgICAgICA/IHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkLnRvTG93ZXJDYXNlKCldXG4gICAgICAgICAgOiAocm93W2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSArICdfb2JqJ10/LnRleHQgfHwgcm93W2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSArICdfb2JqJ10/LnRleHQgPT09IDAgfHwgcm93W2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSArICdfb2JqJ10/LnRleHQgPT09IG51bGwpXG4gICAgICAgICAgICA/IHJvd1tjb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy50ZXh0IDogcm93W2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKHRoaXMudHlwZU9mKHZhbHVlKSA9PT0gJ251bWJlcicgJiYgdmFsdWUgPT09IDApIHtcbiAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgbGV0IGZvcm1hdFBhcmFtcyA9IGNvbHVtbi5mb3JtYXQ/LmZvcm1hdFBhcmFtcztcbiAgICBsZXQgZGlnaXRzSW5mbyA9IGZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbztcbiAgICBpZiAoY29sdW1uLmZvcm1hdCAmJiB2YWx1ZSkge1xuICAgICAgc3dpdGNoIChjb2x1bW4uZm9ybWF0Py50eXBlKSB7XG4gICAgICAgIGNhc2UgRUdyaWRGb3JtYXRUeXBlLkNVUlJFTkNZOlxuICAgICAgICAgIHZhbHVlID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KFxuICAgICAgICAgICAgZm9ybWF0UGFyYW1zPy5sb2NhbGUgPyBmb3JtYXRQYXJhbXMubG9jYWxlIDogJ2VuLVVTJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3R5bGU6ICdjdXJyZW5jeScsXG4gICAgICAgICAgICAgIGN1cnJlbmN5OiBmb3JtYXRQYXJhbXM/LmN1cnJlbmN5ID8gZm9ybWF0UGFyYW1zLmN1cnJlbmN5IDogJ1VTRCcsXG4gICAgICAgICAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogZGlnaXRzSW5mbyA/IGRpZ2l0c0luZm8gOiAnMicsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKT8uZm9ybWF0KHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBFR3JpZEZvcm1hdFR5cGUuREVDSU1BTDpcbiAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpLnRvRml4ZWQoZGlnaXRzSW5mbyA/IGRpZ2l0c0luZm8gOiAnMicpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEVHcmlkRm9ybWF0VHlwZS5QRVJDRU5UOlxuICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyAnJSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vQ2hhbmdlIGRyb3Bkb3duIHZsdWUgYmFzZWQgb24gb3B0aW9uIGxhYmVsIGFuZCBvcHRpb252YWx1ZVxuICBzZXREcm9wZG93blZhbHVlKGNvbHVtbjogSUdyaWRDb2x1bW4sIHNlbGVjdGVkUm93PzogYW55LCBjaGFuZ2U/OiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMucm93c0RhdGEgJiYgdGhpcy5yb3dzRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJvd3NEYXRhLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMocm93KT8uZmluZCgoa2V5KSA9PiBrZXkgPT09IGNvbHVtbi5maWVsZCkpIHtcbiAgICAgICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgICAgICBjb2x1bW4ub3B0aW9uTGFiZWwgPSBjb2x1bW4ub3B0aW9uTGFiZWxcbiAgICAgICAgICAgICAgPyBjb2x1bW4ub3B0aW9uTGFiZWxcbiAgICAgICAgICAgICAgOiAnbGFiZWwnO1xuICAgICAgICAgICAgY29sdW1uLm9wdGlvblZhbHVlID0gY29sdW1uLm9wdGlvblZhbHVlXG4gICAgICAgICAgICAgID8gY29sdW1uLm9wdGlvblZhbHVlXG4gICAgICAgICAgICAgIDogJ3ZhbHVlJztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBjb2x1bW4uZGF0YT8uZmluZChcbiAgICAgICAgICAgIChyZWNvcmQ6IGFueSkgPT5cbiAgICAgICAgICAgICAgcmVjb3JkW2NvbHVtbi5vcHRpb25WYWx1ZV0/LnRvU3RyaW5nKCkgPT09XG4gICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdPy50b1N0cmluZygpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBlZGl0ZWRSb3cgPSBzZWxlY3RlZFJvdyAmJiBPYmplY3Qua2V5cyhzZWxlY3RlZFJvdykubGVuZ3RoID4gMCA/IHNlbGVjdGVkUm93W3RoaXMuZGF0YUtleV0gPT09IHJvd1t0aGlzLmRhdGFLZXldIDogZmFsc2U7XG4gICAgICAgICAgaWYgKHZhbHVlICYmIGVkaXRlZFJvdykge1xuICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPSB2YWx1ZVtjb2x1bW4ub3B0aW9uVmFsdWVdO1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgY2hhbmdlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPSB2YWx1ZVtjb2x1bW4ub3B0aW9uTGFiZWxdO1xuICAgICAgICAgICAgaWYocm93W2NvbHVtbi5maWVsZCsnX29iaiddKXtcbiAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZCsnX29iaiddWydvcHRpb25WYWx1ZSddID0gdmFsdWVbY29sdW1uLm9wdGlvblZhbHVlXTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10gPSB7b3B0aW9uVmFsdWU6ICB2YWx1ZVtjb2x1bW4ub3B0aW9uVmFsdWVdfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vbWFuaXB1bGF0ZSBjaGVja2JveCBzdHJpbmcgdmFsdWUgdG8gdHJ1ZSBhbmQgZmFsc2UuXG4gIGNoYW5nZUNoZWNrYm94U3RyaW5nVmFsdWUoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb2x1bW5zICYmXG4gICAgICB0aGlzLnJvd3NEYXRhICYmXG4gICAgICB0aGlzLnJvd3NEYXRhLmxlbmd0aCA+IDAgJiZcbiAgICAgIHRoaXMuY29sdW1ucy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRFJPUERPV04gJiYgdGhpcy5zZXREcm9wZG93bmRhdGFWYWx1ZSkge1xuICAgICAgICAgIHRoaXMuc2V0RHJvcGRvd25WYWx1ZShjb2x1bW4sIHt9LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb3dzRGF0YS5mb3JFYWNoKChyb3c6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkJPT0xFQU4pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKHR5cGVvZiAocm93W2NvbHVtbi5maWVsZF0gPT09ICdzdHJpbmcnKSAmJlxuICAgICAgICAgICAgICAgIChyb3dbY29sdW1uLmZpZWxkXSA9PT0gJzEnIHx8IHJvd1tjb2x1bW4uZmllbGRdID09PSAnMCcpKSB8fFxuICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9PT0gJ1knIHx8XG4gICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID09PSAnTidcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9XG4gICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPT09ICcxJyB8fCByb3dbY29sdW1uLmZpZWxkXSA9PT0gJ1knXG4gICAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcm93RGF0YVxuICAgKiBQYXNzZXMgZGF0YSBvZiBjbGlja2VkIHJvdyB0byBwYXJlbnRcbiAgICovXG4gIGhhbmRsZVJvd0NsaWNrKHJvd0RhdGE6IGFueSkge1xuICAgIHRoaXMucm93Q2xpY2tEYXRhID0gcm93RGF0YTtcbiAgICBpZiAoIXRoaXMuZWRpdEFsbFJvd3MpIHtcbiAgICAgIHRoaXMub25Sb3dDbGljay5lbWl0KHJvd0RhdGEpO1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd1JlY29yZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvLyBpbnZva2Ugb25Sb3dDbGljayBldmVudCB3aGVuIG9ubHkgb25lIHJlY29yZCBleGlzdDtcbiAgZGVmYXVsdFJvd0NsaWNrKCl7XG4gICAgbGV0IGRpYWxvZ0V4aXN0OiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdwLWRpYWxvZycpO1xuICAgIGlmKHRoaXMuY29sdW1ucz8ubGVuZ3RoID4gMCAmJiB0aGlzLnJvd3NEYXRhICYmIHRoaXMucm93c0RhdGEubGVuZ3RoID09PSAxICYmIHRoaXMub25Sb3dDbGljay5vYnNlcnZlcnM/Lmxlbmd0aCAmJiB0aGlzLmdyaWRTZXJ2aWNlLnVzZXJTZWFyY2hlZCAmJiBkaWFsb2dFeGlzdC5sZW5ndGgpe1xuICAgICAgICB0aGlzLmdyaWRTZXJ2aWNlLnVzZXJTZWFyY2hlZD0gZmFsc2U7XG4gICAgICAgIHRoaXMuaGFuZGxlUm93Q2xpY2sodGhpcy5yb3dzRGF0YVswXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBjb2x1bW5EYXRhXG4gICAqIFBhc3NlcyBzb3J0aW5nIGluZm9ybWF0aW9uIHRvIHBhcmVudCBvbiBzb3J0IGNoYW5nZVxuICAgKi9cbiAgaGFuZGxlU29ydENoYW5nZShldmVudDogYW55KSB7XG4gICAgbGV0IHNvcnREaXJlY3Rpb24gPSBudWxsO1xuICAgIGxldCBzb3J0RmllbGQ6IHN0cmluZyA9ICcnO1xuICAgIGlmIChldmVudC5tdWx0aXNvcnRtZXRhICYmIGV2ZW50Lm11bHRpc29ydG1ldGFbMF0ub3JkZXIpIHtcbiAgICAgIHNvcnREaXJlY3Rpb24gPVxuICAgICAgICBldmVudC5tdWx0aXNvcnRtZXRhWzBdLm9yZGVyID09IDFcbiAgICAgICAgICA/IEVHcmlkU29ydERpcmVjdGlvbi5BU0NcbiAgICAgICAgICA6IEVHcmlkU29ydERpcmVjdGlvbi5ERVNDO1xuICAgICAgc29ydEZpZWxkID0gZXZlbnQubXVsdGlzb3J0bWV0YVswXS5maWVsZDtcbiAgICB9XG4gICAgbGV0IHNvcnRzOiBJR3JpZFNvcnQgPSB7XG4gICAgICBmaWVsZDogc29ydEZpZWxkLFxuICAgICAgZGlyZWN0aW9uOiBzb3J0RGlyZWN0aW9uIGFzIEVHcmlkU29ydERpcmVjdGlvbixcbiAgICAgIHByaW9yaXR5OiAwLFxuICAgIH07XG4gICAgdGhpcy5vblNvcnRDaGFuZ2UuZW1pdChzb3J0cyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIFBhc3NlcyBhcHBsaWVkIGZpbHRlcnMgdG8gcGFyZW50IG9uIGZpbHRlciBjaGFuZ2VcbiAgICovXG4gIGhhbmRsZUZpbHRlckNoYW5nZShldmVudDogYW55KSB7XG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGZpbHRlcjogYW55KSA9PiB7XG4gICAgICBpZiAoIWV2ZW50LmZpbHRlcnNbZmlsdGVyLmZpZWxkXT8udmFsdWUgJiYgIWZpbHRlci52YWx1ZSkge1xuICAgICAgICBmaWx0ZXIudmFsdWUgPSAnJztcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm9uRmlsdGVyQ2hhbmdlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCA6IEV2ZW50XG4gICAqIEBwYXJhbSBjb2x1bW5BY3Rpb24gOiBJR3JpZENvbHVtbkFjdGlvblxuICAgKiBAcGFyYW0gcm93IDogYW55XG4gICAqIFN0b3AgdGhlIGNsaWNrIGV2ZW50IHByb3BhZ2F0aW9uIHRvIHBhcmVudFxuICAgKiBDYWxsYmFja3MgdGhlIHJvdyBkYXRhIHRvIHBhcmVudFxuICAgKi9cblxuICAvKipcbiAgICogaW52b2tlIG9uQ2xpY2sgZXZlbnQgJiBvcGVuIElmcmFtZSBpbiBncmlkXG4gICAqL1xuICBncmlkSUZyYW1lKGNvbHVtbjogYW55LCByb3dzOiBhbnksIHJvdzogYW55KSB7XG4gICAgdGhpcy5vbkNsaWNrRXZlbnQoY29sdW1uLCByb3cpO1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKElmcmFtZUNvbXBvbmVudCwge1xuICAgICAgaGVhZGVyOiBjb2x1bW4uaGVhZGVyLFxuICAgICAgd2lkdGg6ICc4MCUnLFxuICAgICAgaGVpZ2h0OiAnODAlJyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdmFsdWU6IHJvd3MsXG4gICAgICAgIGlGcmFtZUlkOiBjb2x1bW4uZGlzcGxheVRleHQgPyBjb2x1bW4uZGlzcGxheVRleHQgOiBjb2x1bW4uZmllbGQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjb2x1bW4uY29tcG9uZW50Py5uYW1lO1xuICAgIGlmIChjb21wb25lbnROYW1lKSB7XG4gICAgICB0aGlzLnBhZ2VMb2dnZXJTZXJ2aWNlLnNhdmVQYWdlTG9nZ2VySW5mbyh0aGlzLnJvdXRlci51cmw/LnN1YnN0cmluZygxKSwgY29tcG9uZW50TmFtZSk7XG4gICAgfVxuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgZHJhZ2dhYmxlRGlhbG9nKGNvbHVtbj8uZmllbGQgPyBjb2x1bW4/LmZpZWxkIDogY29sdW1uPy5oZWFkZXIpXG4gICAgfSk7XG4gICAgcmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIGlmIChyZXMgJiYgY29sdW1uLm9uUmV0dXJuKSB7XG4gICAgICAgIGNvbHVtbi5vblJldHVybihyZXMpO1xuICAgICAgfSBlbHNlIGlmIChyZXMgJiYgY29sdW1uLm9uQ2hhbmdlKSB7XG4gICAgICAgIGNvbHVtbi5vbkNoYW5nZShyZXMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYWRkTmV3Um93KHJvdzogYW55LCBhZGRSb3c6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMucmVmcmVzaEdyaWRUZXJtaW5hdG9yKClcbiAgICB0aGlzLmNvbXBvbmVudFRhYmxlUmVmID0gdGhpcy50YWJsZTtcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbHVtbi5maWx0ZXIgJiZcbiAgICAgICAgY29sdW1uLmNvbXBvbmVudCAmJlxuICAgICAgICBjb2x1bW4uZmlsdGVyLnR5cGUgPT09ICdjYWxlbmRhcidcbiAgICAgICkge1xuICAgICAgICBpZiAoYWRkUm93KSB7XG4gICAgICAgICAgdGhpcy5yb3dzRGF0YVswXVtjb2x1bW4uZmllbGQgKyAnX3NlY29uZFR5cGUnXSA9IEVHcmlkQ29sdW1uVHlwZS5EQVRFO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQgKyAnX3NlY29uZFR5cGUnXSA9IEVHcmlkQ29sdW1uVHlwZS5EQVRFO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29sdW1uLmFnZ3JlZ2F0ZSAmJiBjb2x1bW4uYWdncmVnYXRlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5hZ2dyZWdhdGVGb290ZXIgPSB0cnVlO1xuICAgICAgICB0aGlzLnNldEFnZ3JlZ2F0ZVRleHQoY29sdW1uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJvd0NsaWNrRGF0YSA9IHJvdztcbiAgICB0aGlzLmFkZE5ld1Jvd0NoZWNrID0gdHJ1ZTtcbiAgICB0aGlzLmRyb3Bkb3duSW5wdXQgPSBmYWxzZTtcbiAgICB0aGlzLnNvcnREaXNhYmxlZCA9IHRydWU7XG4gICAgdGhpcy5yb3dzQ2hhbmdlLmVtaXQodGhpcy5yb3dzRGF0YSk7XG4gICAgdGhpcy5vbkdyaWRSb3dBZGQuZW1pdChyb3cpO1xuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gRGlhbG9nIGluIGdyaWRcbiAgICovXG4gIG9wZW5HcmlkRGlhbG9nKGNvbHVtbjogSUdyaWRDb2x1bW4gfCBhbnksIHJvdzogYW55LCBldmVudD86IGFueSkge1xuICAgIGNvbnN0IGRhdGFQYXJhbXMgPSBjb2x1bW4uZGF0YT8uZGF0YSA/IGNvbHVtbi5kYXRhPy5kYXRhIDoge307XG4gICAgaWYgKChldmVudCAmJiBldmVudC5jdHJsS2V5KSB8fCBjb2x1bW4ub3BlbkluTmV3VGFiKSB7XG4gICAgICB0aGlzLmh5cGVybGlua1NlcnZpY2Uub3BlbkRpYWxvZ0luTmV3VGFiKGNvbHVtbi5jb21wb25lbnQsIGRhdGFQYXJhbXMsIHJvdyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5vcGVuQ29tcG9uZW50SW5EaWFsb2coY29sdW1uLCByb3cpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5Db21wb25lbnRJbkRpYWxvZyhjb2x1bW46IElHcmlkQ29sdW1uIHwgYW55LCByb3c6IGFueSkge1xuICAgIHZhciBpc0Rpc2FibGVkID0gY29sdW1uLmRpc2FibGVkXG4gICAgICA/IHRydWVcbiAgICAgIDogcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc2FibGVkXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IGZhbHNlO1xuICAgIHRoaXMub25DbGlja0V2ZW50KGNvbHVtbiwgcm93KTtcbiAgICAgIGxldCBkYXRhOiBhbnkgPSB7fTtcbiAgICAgIGRhdGEgPSB7IC4uLmNvbHVtbj8uZGF0YSB9O1xuICAgICAgdGhpcy5yb3dDbGlja0RhdGEgPSByb3c7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmRhdGEgJiYgcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10gJiYgcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/Lm1hdGNoRGF0YSkge1xuICAgICAgICBkYXRhLmRhdGEgPSByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlhbG9nRGF0YT8uZGF0YSA/IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5kaWFsb2dEYXRhLmRhdGEgOiByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlhbG9nRGF0YTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbHVtbi5jb21wb25lbnQgJiYgdGhpcy5yb3dDbGlja0RhdGEgJiYgIWlzRGlzYWJsZWQpIHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBkYXRhLmRhdGEgPSBhdXRvU2V0TG9va3VwRGF0YShcbiAgICAgICAgICAgIGRhdGEuZGF0YSxcbiAgICAgICAgICAgIHRoaXMucm93Q2xpY2tEYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvYmpGaWVsZCA9IGNvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSArIFwiX29ialwiO1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKHJvd1tvYmpGaWVsZF0gJiYgcm93W29iakZpZWxkXT8uY29tcG9uZW50ID8gcm93W29iakZpZWxkXT8uY29tcG9uZW50IDogY29sdW1uLmNvbXBvbmVudCwgZGF0YSk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmRpYWxvZ1JlZlsnZGlhbG9nQ2xvc2UnXSA9IHRoaXMuZGlhbG9nUmVmLmNsb3NlO1xuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlID0gdGhpcy5pbnRlcmNlcHREaWFsb2dDbG9zZS5iaW5kKHRoaXMpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyAgIHRoaXMuZGlhbG9nUmVmWydkaWFsb2dDbG9zZSddID0gdGhpcy5kaWFsb2dSZWYuY2xvc2U7XG4gICAgICAgIC8vICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UgPSB0aGlzLmludGVyY2VwdERpYWxvZ0Nsb3NlLmJpbmQodGhpcyk7XG4gICAgICAgIC8vIH0sIDgwMCk7XG5cbiAgICAgICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHRoaXMuZGlhbG9nUmVmKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbHVtbi5jb21wb25lbnQ/Lm5hbWU7XG4gICAgICAgIGlmIChjb21wb25lbnROYW1lKSB7XG4gICAgICAgICAgdGhpcy5wYWdlTG9nZ2VyU2VydmljZS5zYXZlUGFnZUxvZ2dlckluZm8odGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSksIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgZHJhZ2dhYmxlRGlhbG9nKGNvbHVtbj8uZmllbGQgPyBjb2x1bW4/LmZpZWxkIDogY29sdW1uPy5oZWFkZXIpXG4gICAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YSAmJiBjb2x1bW4ub25SZXR1cm4pIHtcbiAgICAgICAgICAgIGNvbHVtbi5vblJldHVybihkYXRhLCB0aGlzLnJvd0NsaWNrRGF0YSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmJyb3dzZXJDbG9zZUV2ZW50KHRydWUpO1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5vbkNoYW5nZSkge1xuICAgICAgICAgICAgICBjb2x1bW4ub25DaGFuZ2UoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgfVxuXG4gIGJyb3dzZXJDbG9zZUV2ZW50KGV2ZW50OiBib29sZWFuID0gZmFsc2UpIHtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgPSBldmVudDtcbiAgfVxuXG4gIHNldE11bHRpU2VsZWN0RGF0YShjb2x1bW46IElHcmlkQ29sdW1uLCBzZWxlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICBpZiAoc2VsZWN0ZWRWYWx1ZSAmJiBjb2x1bW4udHlwZSA9PSBFR3JpZENvbHVtblR5cGUuTVVMVElTRUxFQ1QpIHtcbiAgICAgIGlmIChzZWxlY3RlZFZhbHVlICYmIHNlbGVjdGVkVmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcsJykpIHtcbiAgICAgICAgc2VsZWN0ZWRWYWx1ZSA9IHNlbGVjdGVkVmFsdWU/LnRvU3RyaW5nKCk/LnNwbGl0KCcsJyk/Lm1hcCgodmFsdWUpID0+IGNvbHVtbi5kYXRhPy5maW5kKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZT8udG9TdHJpbmcoKSA9PT0gdmFsdWU/LnRvU3RyaW5nKCkpPy5sYWJlbCk/LnRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZFZhbHVlID0gY29sdW1uLmRhdGE/LmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlPy50b1N0cmluZygpID09PSBzZWxlY3RlZFZhbHVlPy50b1N0cmluZygpKT8ubGFiZWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3RlZFZhbHVlO1xuICB9XG5cbiAgc2V0VGV4dEJveFJlYWRPbmx5VmFsdWUocm93OiBhbnksIGNvbHVtbjogYW55KSB7XG4gICAgbGV0IHZhbHVlOiBhbnk7XG4gICAgaWYgKGNvbHVtbi5kaXNwbGF5VGV4dCkge1xuICAgICAgdmFsdWUgPSBjb2x1bW4uZGlzcGxheVRleHQ7XG4gICAgfSBlbHNlIGlmIChyb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlzcGxheVRleHQpIHtcbiAgICAgIHZhbHVlID0gcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlUZXh0O1xuICAgIH0gZWxzZSBpZiAocm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlGaWVsZCkge1xuICAgICAgdmFsdWUgPSByb3dbcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV07XG4gICAgfSBlbHNlIGlmIChjb2x1bW4uZGlzcGxheUZpZWxkKSB7XG4gICAgICB2YWx1ZSA9IHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkPy50b0xvd2VyQ2FzZSgpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSByb3dbY29sdW1uLmZpZWxkXTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBjb25kaXRpb25hbCBiYXNlIHZhbHVlIGFuZCB0aXRsZVxuICAgKi9cbiAgc2V0Q29uZGl0aW9uQmFzZVZhbHVlKHJvdzogYW55LCBjb2x1bW46IGFueSkge1xuICAgIGRlbGV0ZSByb3dbJ3VuZGVmaW5lZCddO1xuICAgIGxldCB2YWx1ZTogYW55O1xuICAgIGlmIChjb2x1bW4udHlwZSA9PSBFR3JpZENvbHVtblR5cGUuREFURSkge1xuICAgICAgbGV0IG5ld1ZhbHVlOiBhbnk7XG4gICAgICBpZiAodHlwZW9mIChyb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXSkgPT09IFwib2JqZWN0XCIgJiYgcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10pIHtcbiAgICAgICAgbmV3VmFsdWUgPSByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlzcGxheVRleHRcbiAgICAgICAgICA/IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5kaXNwbGF5VGV4dFxuICAgICAgICAgIDogcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgPyByb3dbcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV1cbiAgICAgICAgICAgIDogcm93W2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSArICdfb2JqJ10/LnRleHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1ZhbHVlID0gcm93W2NvbHVtbi5maWVsZF07XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdWYWx1ZSkge1xuICAgICAgICBpZiAoY29sdW1uLnRpbWVPbmx5KSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLnNldFRpbWVGb3JtYXQobmV3VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBmb3JtYXQgPSB0aGlzLnNldEZvcm1hdChjb2x1bW4pO1xuICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0obmV3VmFsdWU/LnRvU3RyaW5nKCkgPT09IFwiSW52YWxpZCBEYXRlXCIgPyBudWxsIDogbmV3VmFsdWUsIGZvcm1hdCA/IGZvcm1hdCA6IGNvbHVtbi5zaG93VGltZSA/IFwiTU0vZGQvWVlZWSwgaDptbSBhXCIgOiBcIk1NL2RkL1lZWVlcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPVxuICAgICAgICByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlzcGxheVRleHRcbiAgICAgICAgICA/IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5mb3JtYXQgPyB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShyb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXS5kaXNwbGF5VGV4dCwgdGhpcy5zZXRGb3JtYXQoY29sdW1uKSkgOlxuICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlUZXh0XG4gICAgICAgICAgOiByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlzcGxheUZpZWxkPy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICA/IHJvd1tyb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlzcGxheUZpZWxkPy50b0xvd2VyQ2FzZSgpXVxuICAgICAgICAgICAgOiByb3dbY29sdW1uLmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV1cbiAgICAgICAgICAgICAgPyByb3dbY29sdW1uLmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV1cbiAgICAgICAgICAgICAgOiByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXSAmJlxuICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLmRpc3BsYXlUZXh0ID09PSBudWxsICYmIGNvbHVtbi50eXBlICE9PSBFR3JpZENvbHVtblR5cGUuRElBTE9HXG4gICAgICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgICAgIDogcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlUZXh0XG4gICAgICAgICAgICAgICAgICA/XG4gICAgICAgICAgICAgICAgICBjb2x1bW4/LmZpbHRlcj8udHlwZSA9PT0gJ2NhbGVuZGFyJyAmJiBjb2x1bW4udGltZU9ubHkgJiYgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5ESUFMT0cgP1xuICAgICAgICAgICAgICAgICAgICAocm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10uZGlzcGxheVRleHQudG9TdHJpbmcoKS5pbmNsdWRlcygnQU0nKSB8fCByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXS5kaXNwbGF5VGV4dC50b1N0cmluZygpLmluY2x1ZGVzKCdQTScpKSA/XG4gICAgICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10uZGlzcGxheVRleHQgOiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShyb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXS5kaXNwbGF5VGV4dCwgJ2hoOm1tIGEnKVxuICAgICAgICAgICAgICAgICAgICA6IGNvbHVtbi5mb3JtYXQgPyB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShyb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXS5kaXNwbGF5VGV4dCwgdGhpcy5zZXRGb3JtYXQoY29sdW1uKSkgOiByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXS5kaXNwbGF5VGV4dFxuICAgICAgICAgICAgICAgICAgOiBjb2x1bW4uZm9ybWF0ID8gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0ocm93W2NvbHVtbi5maWVsZF0sIHRoaXMuc2V0Rm9ybWF0KGNvbHVtbikpXG4gICAgICAgICAgICAgICAgICAgIDpcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmRpc3BsYXlUZXh0XG4gICAgICAgICAgICAgICAgICAgICAgPyBjb2x1bW4uZGlzcGxheVRleHRcbiAgICAgICAgICAgICAgICAgICAgICA6IGNvbHVtbi5pY29uID8gY29sdW1uLmhlYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF07XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHNldEZvcm1hdChjb2x1bW4pIHtcbiAgICBsZXQgZm9ybWF0ID0gJyc7XG4gICAgaWYgKGNvbHVtbj8uZm9ybWF0KSB7XG4gICAgICBjb2x1bW4uZm9ybWF0ID0gY29sdW1uLmZvcm1hdD8udHlwZSA/IGNvbHVtbi5mb3JtYXQudHlwZSA6IGNvbHVtbi5mb3JtYXQ7XG4gICAgICBzd2l0Y2ggKGNvbHVtbi5mb3JtYXQpIHtcbiAgICAgICAgY2FzZSBFR3JpZEZvcm1hdFR5cGUuU01BTExEQVRFOiB7XG4gICAgICAgICAgZm9ybWF0ID0gJ01NL2RkL3l5JztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIEVHcmlkRm9ybWF0VHlwZS5TSE9SVERBVEU6IHtcbiAgICAgICAgICBmb3JtYXQgPSAnTU0vZGQveXl5eSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBFR3JpZEZvcm1hdFR5cGUuTUVESVVNREFURToge1xuICAgICAgICAgIGZvcm1hdCA9ICdNIGQsIHl5JztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIEVHcmlkRm9ybWF0VHlwZS5MT05HREFURToge1xuICAgICAgICAgIGZvcm1hdCA9ICdNTS9kZC9ZWSwgaDptbSBhJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIEVHcmlkRm9ybWF0VHlwZS5QRVJJT0Q6IHtcbiAgICAgICAgICBmb3JtYXQgPSAnTU0veXknO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBmb3JtYXQgPSBjb2x1bW4uZm9ybWF0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXRcbiAgfVxuXG4gIHNldERyb3Bkd29uUmVhZE9ubHlWYWx1ZShyb3c6IGFueSwgY29sdW1uOiBhbnkpIHtcbiAgICBkZWxldGUgcm93Wyd1bmRlZmluZWQnXTtcbiAgICBjb25zdCB2YWx1ZSA9IHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkXVxuICAgICAgPyByb3dbY29sdW1uLmRpc3BsYXlGaWVsZF1cbiAgICAgIDogY29sdW1uLmRhdGE/LmZpbmQoZHJvcGRvd25WYWwgPT4gZHJvcGRvd25WYWw/LnZhbHVlID09IHJvd1tjb2x1bW4uZmllbGRdKVxuICAgICAgICA/IGNvbHVtbi5kYXRhPy5maW5kKGRyb3Bkb3duVmFsID0+IGRyb3Bkb3duVmFsPy52YWx1ZSA9PSByb3dbY29sdW1uLmZpZWxkXSk/LmxhYmVsXG4gICAgICAgIDogcm93W2NvbHVtbi5maWVsZF07XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cblxuICAvKipcbiAgICogb3BlbiBEZWxldGUgQ29uZmlybWF0aW9uIGRpYWxvZyB3aGVuIGNsaWNrIG9uIGRlbGV0ZSBpY29uIGluIEFjdGlvbiBjb2x1bW5cbiAgICovXG4gIGhhbmRsZUFjdGlvbkNsaWNrKGV2ZW50OiBFdmVudCwgY29sdW1uQWN0aW9uOiBJR3JpZENvbHVtbkFjdGlvbiwgcm93OiBhbnkpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoY29sdW1uQWN0aW9uLnRvb2x0aXAudG9Mb3dlckNhc2UoKSA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgIGlmIChjb2x1bW5BY3Rpb24uY29uZmlybURpYWxvZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29sdW1uQWN0aW9uLm9uQ2xpY2socm93KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgICAgICBtZXNzYWdlOiAnQXJlIHlvdSBzdXJlIHRoYXQgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgcmVjb3JkPycsXG4gICAgICAgICAgaGVhZGVyOiAnRGVsZXRlIENvbmZpcm1hdGlvbicsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJyxcbiAgICAgICAgICBrZXk6ICdoYW5kbGVjb2x1bW5BY3Rpb25zJyxcbiAgICAgICAgICBhY2NlcHQ6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbHVtbkFjdGlvbi5vbkNsaWNrKHJvdyk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY2xvc2UoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlamVjdDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNsb3NlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbHVtbkFjdGlvbi5vbkNsaWNrKHJvdyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCA6IExhenlMb2FkRXZlbnRcbiAgICogVHJpZ2dlcnMgZXZlcnl0aW1lIGEgc2VydmVyIHNpZGUgZmlsdGVyIGlzIHRyaWdnZXJcbiAgICovXG4gIGhhbmRsZVNlcnZlclNpZGVFdmVudHMoZXZlbnQ6IGFueSwgZHQ6IGFueSA9ICcnKSB7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmlzU2VydmVyU2lkZUV2ZW50SW5pdGFsVHJpZ2dlcmVkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb2x1bW5zPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRHcmlkSWQoKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZGZpbHRlciA9IGV2ZW50O1xuICBcbiAgICAgICAgICAgIGlmIChkdD8uZWw/Lm5hdGl2ZUVsZW1lbnQ/LmlkKSB7XG4gICAgICAgICAgICAgIHRoaXMuZ3JpZElkID0gZHQuZWwubmF0aXZlRWxlbWVudC5pZDtcbiAgICAgICAgICAgIH1cbiAgXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENvbHVtbnMgJiYgdGhpcy5zZWxlY3RlZENvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5mb3JFYWNoKCh4OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZmlsdGVyc1t4LmZpZWxkXSkge1xuICAgICAgICAgICAgICAgICAgZXZlbnQuZmlsdGVyc1t4LmZpZWxkXS52YWx1ZSA9IHgudHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLk1VTFRJU0VMRUNUID8geC5maWx0ZXJWYWx1ZT8udG9TdHJpbmcoKSA6IHguZmlsdGVyVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0aGlzLmF1dG9Mb2FkRGF0YTtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyRmlsdGVycyA9IHtcbiAgICAgICAgICAgICAgZmlsdGVyczogdGhpcy5sb29rdXBGaWx0ZXJzXG4gICAgICAgICAgICAgICAgPyB0aGlzLmdyaWRTZXJ2aWNlLmdldEdyaWRGaWx0ZXJzKGV2ZW50LCB0aGlzLnNlbGVjdGVkQ29sdW1ucylcbiAgICAgICAgICAgICAgICA6IHRoaXMuZ3JpZFNlcnZpY2UucHJlcGFyZUJhc2ljRmlsdGVycyhldmVudCwgdGhpcy5zZWxlY3RlZENvbHVtbnMpLFxuICAgICAgICAgICAgICBzb3J0czogdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkU29ydHMoZXZlbnQsIHRoaXMuc2VsZWN0ZWRDb2x1bW5zKSxcbiAgICAgICAgICAgICAgLi4uKHRoaXMucGFnaW5hdGlvbiAmJiB7XG4gICAgICAgICAgICAgICAgcGFnZTogdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkUGFnaW5hdGlvbihldmVudCksXG4gICAgICAgICAgICAgICAgcGFnZVNpemU6IGV2ZW50LnJvd3MgfHwgMTAsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfTtcbiAgXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHRoaXMuc2VydmVyRmlsdGVycz8uZmlsdGVycyAmJlxuICAgICAgICAgICAgICB0aGlzLnNlcnZlckZpbHRlcnM/LmZpbHRlcnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAodGhpcy5hbGxvd0NhY2hpbmcgfHwgdGhpcy5zb2Z0Q2FjaGluZylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuc29mdENhY2hpbmcgJiYgdGhpcy5jb21wb25lbnRUYWJsZVJlZj8uaWQpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnU2V0RmlsdGVycy0nICsgdGhpcy5jb21wb25lbnRUYWJsZVJlZj8uaWQgKyB0aGlzLmN1cnJlbnRVcmwsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VydmVyRmlsdGVycykpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkU2VydmljZS5zb2Z0Q2FjaGluZ0ZpbHRlcnNbdGhpcy5jb21wb25lbnRUYWJsZVJlZj8uaWQgKyB0aGlzLmN1cnJlbnRVcmxdID0gdGhpcy5zZXJ2ZXJGaWx0ZXJzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmdyaWRTZXJ2aWNlLnNvZnRDYWNoaW5nRmlsdGVyc1t0aGlzLmNvbXBvbmVudFRhYmxlUmVmPy5pZCArIHRoaXMuY3VycmVudFVybF0gPSB7fTtcbiAgICAgICAgICAgIH1cbiAgXG4gICAgICAgICAgICBjb25zdCBzZXJ2ZXJGaWx0ZXJWYWx1ZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuc2VydmVyRmlsdGVycykpO1xuICAgICAgICAgICAgc2VydmVyRmlsdGVyVmFsdWVzLmZpbHRlcnMgPSAodGhpcy5zZXJ2ZXJGaWx0ZXJzLmZpbHRlcnMgfHwgW10pLmNvbmNhdCh0aGlzLmdsb2JhbERhdGEpO1xuICBcbiAgICAgICAgICAgIHRoaXMuaXNDaGVja0JveENoYW5nZUV2ZW50Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmdyaWRTZXJ2aWNlLnJvd1VwZGF0ZSA9IGZhbHNlO1xuICBcbiAgICAgICAgICAgIGxldCBjb250YWluc0VtcHR5RmllbGQgPSB0cnVlO1xuICAgICAgICAgICAgd2hpbGUgKGNvbnRhaW5zRW1wdHlGaWVsZCkge1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNlcnZlckZpbHRlclZhbHVlcy5maWx0ZXJzLmZpbmRJbmRleCgoZmlsdGVyKSA9PiAhZmlsdGVyLmZpZWxkKTtcbiAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBzZXJ2ZXJGaWx0ZXJWYWx1ZXMuZmlsdGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5zRW1wdHlGaWVsZCA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gIFxuICAgICAgICAgICAgdGhpcy5vblNlcnZlclNpZGVFdmVudENoYW5nZS5lbWl0KHNlcnZlckZpbHRlclZhbHVlcyk7XG4gICAgICAgICAgICB0aGlzLmlzU2VydmVyU2lkZUV2ZW50SW5pdGFsVHJpZ2dlcmVkLm5leHQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cbiAgXG5cblxuLy9zZXQgZ3JpZCBpZCBvbiBwYWdlIGxvYWQgZm9yIGxvYWQgY29sdW1uIHdpZHRoc1xuICBzZXRDbGFzc2FBbmRJZChkdDphbnkpe1xuICAgIGlmKGR0Py5lbD8ubmF0aXZlRWxlbWVudD8uaWQpe1xuICAgICAgdGhpcy5ncmlkSWQgPSBkdC5lbC5uYXRpdmVFbGVtZW50LmlkO1xuICAgIH1cbiAgICBpZih0aGlzLmhvcml6b250YWxTY3JvbGwpe1xuICAgICAgcmV0dXJuIHsnaG9yaXpvbnRhbC1zY3JvbGwnOnRydWV9XG4gICAgfWVsc2V7XG4gICAgICByZXR1cm4geydob3Jpem9udGFsLXNjcm9sbCc6ZmFsc2V9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBldmVudFxuICAgKiBQYXNzZXMgYXBwbGllZCBwYWdpbmF0aW9uIHRvIHBhcmVudCBvbiBwYWdlIGNoYW5nZVxuICAgKi9cbiAgaGFuZGxlU2VydmVyU2lkZVBhZ2luYXRpb24oZXZlbnQ6IElHcmlkUGFnaW5hdGlvbkV2ZW50KSB7XG4gICAgdGhpcy5lZGl0aW5nUm93S2V5cyA9IHt9O1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBldmVudC5maXJzdDtcbiAgICB0aGlzLlBhZ2VDaGFuZ2UgPSB0cnVlO1xuICAgIHRoaXMub25QYWdlQ2hhbmdlLmVtaXQoZXZlbnQpO1xuXG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMudXNlU2VydmVyU2lkZUV2ZW50cyAmJiB0aGlzLnBhZ2luYXRpb24gJiYgdGhpcy5kZWZhdWx0Um93cyAmJiB0aGlzLmVkaXRBbGxSb3dzICYmIHRoaXMucm93c0RhdGE/Lmxlbmd0aCA+IDAgJiYgdGhpcy5jb2x1bW5zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5lZGl0QWxsUm93c0F0T25jZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHNlbGVjdGVkUm93KHJvdzogYW55KSB7XG4gICAgdGhpcy5vblJvd0NoZWNrQm94LmVtaXQocm93KTtcbiAgfVxuXG4gIC8vIHNldCB0aW1lIGZvcm1hdFxuICBzZXRUaW1lRm9ybWF0KGRhdGU6IGFueSkge1xuICAgIGxldCB2YWx1ZTogYW55ID0gJyc7XG4gICAgaWYgKGRhdGU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0FNJykgfHwgZGF0ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnUE0nKSkge1xuICAgICAgdmFsdWUgPSBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGUsICdoaDptbSBhJyk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vb3BlbiBoeXBlcmxpbmsgaW4gZWRpdCBjYXNlXG4gIG9wZW5MaW5rKHVybDogYW55KSB7XG4gICAgaWYgKHVybCkge1xuICAgICAgY29uc3QgbGluazogYW55ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgbGluay5ocmVmID0gdXJsO1xuICAgICAgbGluay50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgIGxpbmsuY2xpY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJvd1xuICAgKiBTZXRzIHZhbHVlcyB0byBlZGl0YWJsZSByb3dcbiAgICogUm93J3MgZGF0YSBpcyBwcmVzZXZlZCB0byBwcmV2ZW50IG11dGF0aW9uXG4gICAqIFJvdyBkYXRhS2V5IGlzIHByZXNlcnZlZCB0byBrZWVwIHRoZSByb3cgdW5pcXVlIGFuZCBpbiBlZGl0YWJsZSBzdGF0ZSBhcyBsb25nIGFzIG5vdCBzYXZlZFxuICAgKi9cblxuICByZWZyZXNoR3JpZFRlcm1pbmF0b3IoKSB7XG4gICAgaWYgKHRoaXMuc2V0R3JpZFJlZnJlc2hUaW1lKSB7XG4gICAgICB0aGlzLnJlbG9hZFBhZ2U/LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgb25Sb3dFZGl0SW5pdChyb3c6IGFueSkge1xuICAgIHRoaXMucmVmcmVzaEdyaWRUZXJtaW5hdG9yKClcbiAgICBsZXQgc2VsZWN0ZWRSb3cgPSB7IC4uLnJvdyB9O1xuICAgIE9iamVjdC5lbnRyaWVzKHNlbGVjdGVkUm93KS5mb3JFYWNoKChba2V5LCB2YWx1ZV06IGFueSkgPT4ge1xuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbDogYW55KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNldERyb3Bkb3duRmlsdGVyKSB7XG4gICAgICAgICAgdGhpcy5zZXREcm9wZG93bkZpbHRlclZhbHVlKGNvbCwgcm93LCBrZXkpO1xuICAgICAgICAgIHRoaXMuc2V0RHJvcGRvd25GaWx0ZXIgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgdGhlIGF1dG9Db21wbGV0ZSBWYWx1ZSBpbiBlZGl0IG1vZGVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbC50eXBlID09PSBFR3JpZENvbHVtblR5cGUuQVVUT0NPTVBMRVRFICYmXG4gICAgICAgICAgY29sLmZpZWxkPy50b0xvd2VyQ2FzZSgpID09PSBrZXk/LnRvTG93ZXJDYXNlKCkgJiZcbiAgICAgICAgICB2YWx1ZSAmJlxuICAgICAgICAgIHZhbHVlLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGNvbC5kaXNwbGF5RmllbGQpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkUm93W2NvbC5maWVsZF0uZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICAgIHJvd1tjb2wuZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX3RlbXAnXSA9IHJvd1tjb2wuZGlzcGxheUZpZWxkXTtcbiAgICAgICAgICAgICAgcm93W2NvbC5kaXNwbGF5RmllbGRdID0gcm93W2NvbC5maWVsZF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IG5ld1ZhbHVlID0gdmFsdWUubWFwKCh4OiBhbnkpID0+IHhbY29sLmRpc3BsYXlGaWVsZF0pO1xuICAgICAgICAgIGlmIChuZXdWYWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJzsnKSkge1xuICAgICAgICAgICAgcm93W2NvbC5maWVsZF0gPSBuZXdWYWx1ZVxuICAgICAgICAgICAgICA/LnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgPy5yZXBsYWNlQWxsKCc7JywgJywnKVxuICAgICAgICAgICAgICA/LnNwbGl0KCcsJylcbiAgICAgICAgICAgICAgPy5tYXAoKHg6IGFueSkgPT4gKHsgW2NvbC5kaXNwbGF5RmllbGQgPyBjb2wuZGlzcGxheUZpZWxkIDogY29sLmZpZWxkXTogeCwgW2NvbC5maWVsZCArICdfdGVtcCddOiB2YWx1ZVswXVtjb2wuZmllbGRdIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EUk9QRE9XTikge1xuICAgICAgICAgIGxldCBvcHRpb24gPSBjb2w/LmRhdGE/LmZpbmQoXG4gICAgICAgICAgICAoeDogYW55KSA9PiB4LmxhYmVsID09PSByb3dbY29sLmZpZWxkXT8udG9TdHJpbmcoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgICAgcm93W2NvbC5maWVsZF0gPSBvcHRpb24udmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb2wudHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLk1VTFRJU0VMRUNUKSB7XG4gICAgICAgICAgcm93W2NvbC5maWVsZF0gPSB0aGlzLnNldE11bHRpU2VsZWN0VmFsdWUoY29sLCByb3cpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbC5maWVsZD8udG9Mb3dlckNhc2UoKSA9PT0ga2V5Py50b0xvd2VyQ2FzZSgpICYmXG4gICAgICAgICAgY29sLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EQVRFXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChyb3dbY29sLmZpZWxkXSAhPT0gbnVsbCAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHJvd1trZXkgKyAnX29iaiddICYmIE9iamVjdC5rZXlzKHJvd1trZXkgKyAnX29iaiddKT8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICByb3dba2V5ICsgJ19vYmonXS50ZXh0ID0gbmV3IERhdGUodmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJvd1trZXldID0gbmV3IERhdGUodmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBjaGVjayB0aGUgTWludXRlcyBwYXR0ZXJuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGNvbC5zaG93VGltZSB8fCBjb2wudGltZU9ubHkpICYmXG4gICAgICAgICAgICBjb2wubWludXRlc0ludGVydmFsICYmXG4gICAgICAgICAgICByb3dba2V5XVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcm93W2tleV0gPSBuZXcgRGF0ZShzZXRNaW51dGVzSW50ZXJ2YWwocm93W2tleV0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbC50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRElBTE9HICYmXG4gICAgICAgICAgY29sLmZpbHRlcj8udHlwZSA9PT0gJ2NhbGVuZGFyJyAmJlxuICAgICAgICAgIGNvbC5maWVsZC50b0xvd2VyQ2FzZSgpID09PSBrZXkudG9Mb3dlckNhc2UoKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJvd1tjb2wuZmllbGRdID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29sLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5MSU5LICYmXG4gICAgICAgICAgY29sLmZpZWxkPy50b0xvd2VyQ2FzZSgpID09PSBrZXk/LnRvTG93ZXJDYXNlKCkgJiZcbiAgICAgICAgICAoY29sLmFsbG93U2F2ZSA9PT0gdHJ1ZSB8fCBjb2wuYWxsb3dTYXZlID09PSB1bmRlZmluZWQpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChjb2wuZWRpdExpbmsgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJvd1trZXldID0gcm93W2NvbC5maWVsZCArICdfb2JqJ10/Lmh5cGVybGluaztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbC5lZGl0TGluayA9PT0gZmFsc2UgfHwgY29sLmVkaXRMaW5rID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJvd1trZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuZWRpdFJvd3NSZWNvcmRzW3Jvd1t0aGlzLmRhdGFLZXldXSA9IHsgLi4ucm93IH07XG4gICAgdGhpcy5lZGl0aW5nUm93S2V5c1tyb3dbdGhpcy5kYXRhS2V5XV0gPSB0cnVlO1xuICAgIHRoaXMuY2hlY2tBY3Rpb24gPSB0cnVlO1xuICAgIHRoaXMuZHJvcGRvd25JbnB1dCA9IHRydWU7XG4gICAgdGhpcy5yb3dDbGlja0RhdGEgPSByb3c7XG4gICAgdGhpcy5pbkVkaXRNb2RlID0gdHJ1ZTtcbiAgICB0aGlzLnJvd1VwZGF0ZUNoYW5nZSA9IGZhbHNlO1xuICAgIHRoaXMuY2FuY2VsQWxsUmVjb3JkcyA9IGZhbHNlO1xuICAgIHRoaXMuc2F2ZUFsbFJlY29yZCA9IGZhbHNlO1xuICAgIHRoaXMuc29ydERpc2FibGVkID0gdHJ1ZTtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLnJvd1VwZGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMub25HcmlkUm93RWRpdC5lbWl0KHJvdyk7XG4gIH1cblxuICB0eXBlT2YodmFsdWU6IGFueSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogc2V0IGRyb3Bkb3duIGZpbHRlciB2YWx1ZVxuICAgKi9cbiAgc2V0RHJvcGRvd25GaWx0ZXJWYWx1ZShjb2w6IGFueSwgcm93OiBhbnksIGtleTogc3RyaW5nKSB7XG4gICAgaWYgKGNvbC50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRFJPUERPV04gJiYgY29sLmRyb3BEb3duUHJvcCkge1xuICAgICAgaWYgKE9iamVjdC52YWx1ZXMoY29sKS5zb21lKCh2YWx1ZSkgPT4gdmFsdWUgPT0ga2V5KSkge1xuICAgICAgICBsZXQgb2JqID0gY29sLmRyb3BEb3duUHJvcDtcbiAgICAgICAgbGV0IG5ld0ZpbHRlcnM6IGFueSA9IFtdO1xuICAgICAgICBpZiAob2JqLmZpbHRlcnMgJiYgb2JqLmZpbHRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG9iai5maWx0ZXJzLmZvckVhY2goKGZpbHRlcjogYW55KSA9PiB7XG4gICAgICAgICAgICBsZXQgbmV3RmlsdGVyID0geyAuLi5maWx0ZXIgfTtcbiAgICAgICAgICAgIGxldCBmaWx0ZXJLZXkgPSBPYmplY3Qua2V5cyhyb3cpLmZpbmQoKGtleSkgPT4ge1xuICAgICAgICAgICAgICBsZXQgbWF0Y2hLZXk6IHN0cmluZyA9ICcnO1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZmlsdGVyLnZhbHVlPy5pbmNsdWRlcygneycpICYmXG4gICAgICAgICAgICAgICAga2V5LnRvTG93ZXJDYXNlKCkgPT09XG4gICAgICAgICAgICAgICAgZmlsdGVyLnZhbHVlXG4gICAgICAgICAgICAgICAgICA/LnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgID8udG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJ3snLCAnJylcbiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCd9JywgJycpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG1hdGNoS2V5ID0ga2V5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBtYXRjaEtleTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGZpbHRlcktleSkge1xuICAgICAgICAgICAgICBuZXdGaWx0ZXIudmFsdWUgPSByb3dbZmlsdGVyS2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0ZpbHRlcnMucHVzaChuZXdGaWx0ZXIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ncmlkU2VydmljZS5zZXREcm9wZG93bkRhdGEoXG4gICAgICAgICAgY29sLFxuICAgICAgICAgIG9iai51bmlxdWVLZXksXG4gICAgICAgICAgb2JqLnZhbHVlUHJvcCxcbiAgICAgICAgICBvYmoubGFiZWxQcm9wLFxuICAgICAgICAgIG5ld0ZpbHRlcnMsXG4gICAgICAgICAgcm93XG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IG9wdGlvbiA9IGNvbC5kYXRhLmZpbmQoXG4gICAgICAgICAgKHg6IGFueSkgPT4geC5sYWJlbCA9PT0gcm93W2NvbC5maWVsZF0/LnRvU3RyaW5nKClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgIHJvd1tjb2wuZmllbGRdID0gb3B0aW9uLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSByb3dcbiAgICogUGFzc2VzIHRoZSBlZGl0ZWQgb3IgbmV3bHkgY3JlYXRlZCBkYXRhIHRvIHBhcmVudFxuICAgKiBJbiBjYXNlIG9mIG5ld2x5IGNyZWF0ZWQgZGF0YSwgZGF0YUtleSBhbmQgaXNOZXcgcHJvcCBpcyByZW1vdmVkXG4gICAqL1xuICBvblJvd0VkaXRTYXZlKHNlbGVjdGVkUm93OiBhbnkpIHtcbiAgICBsZXQgYXV0b21Db21wbGV0ZVRlbXBEYXRhID0gW107XG4gICAgbGV0IGxvb2t1cEluZm86IGFueSA9IHt9O1xuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goKGNvbHVtbjogYW55KSA9PiB7XG4gICAgICBkZWxldGUgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkICsgJy1kYXRhJ107XG4gICAgICBkZWxldGUgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkICsgJ19zZWNvbmRUeXBlJ107XG4gICAgICBpZiAoXG4gICAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTE9PS1VQX0lOUFVUICYmXG4gICAgICAgIChjb2x1bW4uYWxsb3dTYXZlID09PSB0cnVlIHx8IGNvbHVtbi5hbGxvd1NhdmUgPT09IHVuZGVmaW5lZClcbiAgICAgICkge1xuICAgICAgICBpZiAodHlwZW9mIChzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdID0gc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXT8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LnRleHQpIHtcbiAgICAgICAgICBsb29rdXBJbmZvW2NvbHVtbi5maWVsZF0gPSBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLnRleHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbHVtbi5mb3JtYXR0ZXIpIHtcbiAgICAgICAgbGV0IHZhbHVlOiBhbnkgPSBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdO1xuICAgICAgICBpZiAoY29sdW1uLmZvcm1hdHRlciA9PT0gJ2NoYXInKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PT0gdHJ1ZSA/ICdZJyA6ICdOJztcbiAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4uZm9ybWF0dGVyID09PSAnbnVtZXJpYycpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09PSB0cnVlID8gJzEnIDogJzAnO1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdGVkUm93ID0geyAuLi5zZWxlY3RlZFJvdywgW2NvbHVtbi5maWVsZF06IHZhbHVlIH07XG4gICAgICB9XG5cbiAgICAgIC8vY29udmVydCBkcm9wRG93biBvcHRpb25MYWJlbCBpbnRvIG9wdGlvblZhbHVlXG4gICAgICBpZiAoXG4gICAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRFJPUERPV04gJiYgY29sdW1uLmRhdGE/Lmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICBjb25zdCBvcHRpb25MYWJlbCA9IGNvbHVtbi5kYXRhLmZpbmQoKHJlY29yZCkgPT4gcmVjb3JkWydsYWJlbCddPy50b0xvd2VyQ2FzZSgpID09PSBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdPy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKG9wdGlvbkxhYmVsPy52YWx1ZSkge1xuICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSBvcHRpb25MYWJlbC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvL2NvbnZlcnQgZGF0ZSBpbnRvIHRpbWUgZm9ybWF0XG4gICAgICBpZiAoXG4gICAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuREFURVxuICAgICAgKSB7IFxuICAgICAgICBpZiAoY29sdW1uLnRpbWVPbmx5ICYmIGNvbHVtbi5zYXZlQXNTdHJpbmcgJiYgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSkge1xuICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdLCAnaGg6bW0gYScpO1xuICAgICAgICB9ZWxzZSBpZiAoY29sdW1uLnRpbWVPbmx5ICYmICFjb2x1bW4uc2F2ZUFzU3RyaW5nICYmIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0pIHtcbiAgICAgICAgICBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSwgJ3l5eXktTU0tZGQgSEg6bW06c3MnKTtcbiAgICAgICAgfSBlbHNlIGlmICghY29sdW1uLnRpbWVPbmx5ICYmIChjb2x1bW4uc2hvd1RpbWUgfHwgY29sdW1uLmZvcm1hdCA9PT0gRUdyaWRGb3JtYXRUeXBlLkxPTkdEQVRFKSkge1xuICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdLCAneXl5eS1NTS1kZCBISDptbTpzcycpO1xuICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gJiYgIWNvbHVtbi50aW1lT25seSkge1xuICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSBuZXcgRGF0ZShzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdKT8udG9Mb2NhbGVEYXRlU3RyaW5nKFwiZW4tVVNcIilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gaWYgYWxsb3dDYWxjdWxhdGU9dHJ1ZSwgZGl2aWRlIHRoZSBwZXJjZW50IGJ5IDEwMFxuICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTlVNRVJJQykge1xuICAgICAgICBpZiAodGhpcy5udW1lcmljVmFsdWUpIHtcbiAgICAgICAgICB0aGlzLm51bWVyaWNWYWx1ZSA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlnaXRzSW5mbyA9IGNvbHVtbj8uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm87XG4gICAgICAgIGlmIChjb2x1bW4uZm9ybWF0Py50eXBlID09PSAncGVyY2VudCcpIHtcbiAgICAgICAgICBpZiAoY29sdW1uLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5hbGxvd0NhbGN1bGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgY2FsY3VsYXRlZFZhbHVlID0gc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJy4nKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSBjYWxjdWxhdGVkVmFsdWUgPyBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdIDogc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSAvIDEwMDtcbiAgICAgICAgICAgIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSBwYXJzZUZsb2F0KChzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdIC8gMTAwKT8udG9TdHJpbmcoKSkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvL2NvbnZlcnQgbXVsdGlzZWxlY3QgYXJyYXkgaW50byBzdHJpbmdcbiAgICAgIGlmIChcbiAgICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5NVUxUSVNFTEVDVCAmJiBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdXG4gICAgICApIHtcbiAgICAgICAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSA9IHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0/LnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNhdmluZyBBdXRvQ29tcGxldGUgRGF0YVxuICAgICAgaWYgKFxuICAgICAgICBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkFVVE9DT01QTEVURSAmJlxuICAgICAgICBjb2x1bW4uZGlzcGxheUZpZWxkICYmXG4gICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0/Lmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICBhdXRvbUNvbXBsZXRlVGVtcERhdGEgPSBbLi4uc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXV07XG4gICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdPy5tYXAoKHJvdykgPT4gY29sdW1uPy5vcHRpb25WYWx1ZSAmJiByb3dbY29sdW1uLm9wdGlvblZhbHVlPy50b0xvd2VyQ2FzZSgpXSA/XG4gICAgICAgICAgcm93W2NvbHVtbi5vcHRpb25WYWx1ZT8udG9Mb3dlckNhc2UoKV0gOiByb3dbY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpXSk/LnRvU3RyaW5nKCk/LnJlcGxhY2VBbGwoJywnLCAnOycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IHJvdzogYW55ID0geyAuLi5zZWxlY3RlZFJvdyB9O1xuICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMocm93KTtcbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGtleS5pbmNsdWRlcygnX29iaicpKSB7XG4gICAgICAgIGxldCBvYmo6IGFueSA9IHJvd1trZXldXG4gICAgICAgIGlmICh0aGlzLmNoZWNrQWN0aW9uID09PSBmYWxzZSAmJiBvYmo/LnR5cGUgJiYgKG9iai50eXBlID09PSAnbGluaycgfHwgb2JqLnR5cGUgPT09ICdpZnJhbWUnIHx8IG9iai50eXBlID09PSAnZGlhbG9nJykpIHtcbiAgICAgICAgICByb3cgPSB7IC4uLnJvdywgW2tleS5zcGxpdCgnXycpWzBdXTogcm93W2tleV0uZGlzcGxheVRleHQgfTtcbiAgICAgICAgICB0aGlzLmNoZWNrQWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIG9iaiAmJiAob2JqLnR5cGUgPT09ICdsaW5rJyB8fCBvYmoudHlwZSA9PT0gJ2lmcmFtZScgfHwgb2JqLnR5cGUgPT09ICdkaWFsb2cnKSkge1xuICAgICAgICAgIHJvdyA9IHsgLi4ucm93LCBba2V5LnNwbGl0KCdfJylbMF1dOiByb3dba2V5XS5kaXNwbGF5VGV4dCB9O1xuICAgICAgICAgIGRlbGV0ZSByb3dba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIGp1c3QgZW1pdCB0aG9zZSBmaWVsZHMgd2hvIGV4aXN0IGluIHRoZSB0YWJsZVxuICAgICAqL1xuICAgIHJvdyA9IHRoaXMuZ3JpZFNlcnZpY2Uuc2V0Um93VmFsdWUocm93KTtcbiAgICAvL29uc29sZS5sb2coJ3JvdyBpbiBzYXZlJywgcm93KVxuICAgIGxldCBvYmo6IGFueSA9IHt9O1xuICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IGFueSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAoY29sdW1uLmFsbG93U2F2ZSA9PT0gdHJ1ZSB8fCBjb2x1bW4uYWxsb3dTYXZlID09PSB1bmRlZmluZWQgfHwgdGhpcy5zYXZlQWxsRGF0YSlcbiAgICAgICkge1xuICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IHJvd1tjb2x1bW4uZmllbGRdO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5ESUFMT0cgJiZcbiAgICAgICAgICBjb2x1bW4uZmlsdGVyPy50eXBlID09PSAnY2FsZW5kYXInXG4gICAgICAgICkge1xuICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oXG4gICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSxcbiAgICAgICAgICAgICd5eXl5LU1NLWRkVDAwOjAwOjAwLjAwMFonXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vU2V0IERlY2ltYWwgRnJhY3Rpb24gVmFsdWVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbHVtbi5mb3JtYXQgJiZcbiAgICAgICAgICBjb2x1bW4uZm9ybWF0LnR5cGUgPT09IEVGb3JtYXRUeXBlLkRFQ0lNQUwgJiZcbiAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSAmJlxuICAgICAgICAgICFyb3dbY29sdW1uLmZpZWxkXS50b1N0cmluZygpLmluY2x1ZGVzKCcuJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGV0IGRpZ2l0c0luZm8gPSAnLjAwJztcbiAgICAgICAgICBsZXQgemVybyA9ICcwJztcbiAgICAgICAgICBjb25zdCBmb3JtYXRQYXJhbXMgPSBjb2x1bW4uZm9ybWF0Py5mb3JtYXRQYXJhbXM7XG4gICAgICAgICAgY29uc3QgZnJhY0RpZ2l0cyA9IGNvbHVtbj8uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm87XG4gICAgICAgICAgaWYgKGZyYWNEaWdpdHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZnJhY0RpZ2l0czsgaSsrKSB7XG4gICAgICAgICAgICAgIHplcm8gPSB6ZXJvICsgJzAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlnaXRzSW5mbyA9ICcuJyArIHplcm87XG4gICAgICAgICAgfVxuICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gcm93W2NvbHVtbi5maWVsZF0gKyBkaWdpdHNJbmZvO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICByb3cuaXNOZXcgfHwgcm93LmlzbmV3ICYmXG4gICAgICAgIChjb2x1bW4uYWxsb3dTYXZlID09PSBmYWxzZSB8fCBjb2x1bW4uZWRpdGFibGUgPT09IGZhbHNlIHx8ICF0aGlzLnNhdmVBbGxEYXRhKVxuICAgICAgKSB7XG4gICAgICAgIGRlbGV0ZSByb3dbY29sdW1uLmZpZWxkXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkZWxldGUgc2VsZWN0ZWRSb3dbJ3VuZGVmaW5lZCddO1xuICAgIHRoaXMuZ3JpZFNlcnZpY2UuY2hlY2tWYWxpZGl0eSh0aGlzLmNvbHVtbnMsIHJvdyk7XG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMuZ3JpZFZhbGlkYXRpb24odGhpcy5jb2x1bW5zLCByb3cpO1xuICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAvLyBzZXQgdGhlIGdyaWQgdXBkYXRlZC9pbnNlcnRlZCBkYXRhXG4gICAgICB0aGlzLnJvd0FjdGlvbkV2ZW50cyhzZWxlY3RlZFJvdyk7XG4gICAgICB0aGlzLmJyb3dzZXJDbG9zZUV2ZW50KGZhbHNlKTtcbiAgICAgIGlmIChyb3cuaXNOZXcgfHwgcm93LmlzbmV3KSB7XG4gICAgICAgIGxldCB7IGlzTmV3LCBpc25ldywgLi4ubmV3Um93T2JqIH0gPSByb3c7XG4gICAgICAgIG5ld1Jvd09iaiA9IHRoaXMuZ3JpZFNlcnZpY2UucmVtb3ZlRXh0cmFOZXdSb3dPYmoobmV3Um93T2JqLCB0aGlzLmNvbHVtbnMpO1xuICAgICAgICBpZiAoIXRoaXMuYWRkRGF0YUtleVZhbHVlKSB7XG4gICAgICAgICAgZGVsZXRlIG5ld1Jvd09ialt0aGlzLmRhdGFLZXldO1xuICAgICAgICB9XG4gICAgICAgIG5ld1Jvd09iaiA9IHRoaXMuc2V0Um93c0RhdGEobmV3Um93T2JqKTtcbiAgICAgICAgaWYgKHRoaXMuc2F2ZUFsbFJlY29yZCkge1xuICAgICAgICAgIHRoaXMuc2F2ZVJlY29yZEFycmF5LnB1c2gobmV3Um93T2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uUm93QWRkLmVtaXQobmV3Um93T2JqKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuc2F2ZUFsbFJlY29yZCkge1xuICAgICAgICAgIHRoaXMuc2F2ZVJlY29yZEFycmF5LnB1c2gob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5jaGVja2xpc3QubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHRoaXMub25Sb3dVcGRhdGUuZW1pdCh0aGlzLnNldFJvd3NEYXRhKHRoaXMuY2hlY2tsaXN0KSk7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uUm93VXBkYXRlLmVtaXQob2JqKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuZWRpdGluZ1Jvd0tleXNbcm93W3RoaXMuZGF0YUtleV1dID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAgIGlmIChjb2x1bW4uZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZC50b0xvd2VyQ2FzZSgpICsgJ19vYmonXSkge1xuICAgICAgICAgICAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkgKyAnX29iaiddID0geyAuLi5zZWxlY3RlZFJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLCBlcnJvck1lc3NhZ2U6IGNvbHVtbi5lcnJvck1lc3NhZ2UgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkgKyAnX29iaiddID0geyBlcnJvck1lc3NhZ2U6IGNvbHVtbi5lcnJvck1lc3NhZ2UgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICB0aGlzLmVkaXRpbmdSb3dLZXlzW3Jvd1t0aGlzLmRhdGFLZXldXSA9IHRydWU7XG4gICAgfVxuICAgIC8vIGlmIGFsbCByb3dzIGluIHJlYWQgb25seSBtb2RlIHRoZW4gc2hvdyBlZGl0QWxsUm93cyBidXR0b24uICAgIFxuICAgIGlmIChPYmplY3QudmFsdWVzKHRoaXMuZWRpdGluZ1Jvd0tleXMpLmV2ZXJ5KCh2YWx1ZSkgPT4gIXZhbHVlKSkge1xuICAgICAgdGhpcy5pbkVkaXRNb2RlID0gZmFsc2U7XG4gICAgICB0aGlzLnNvcnREaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5mb3JFYWNoKChjb2x1bW46IGFueSkgPT4ge1xuICAgICAgLy8gY29udmVydCBkYXRlIGludG8gdGltZVxuICAgICAgaWYgKFxuICAgICAgICBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdICYmXG4gICAgICAgIChzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdPy50b1N0cmluZygpPy5pbmNsdWRlcygnUE0nKSB8fFxuICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCdBTScpKVxuICAgICAgKSB7XG4gICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSBzZXRUaW1lSW5EYXRlKHJvd1tjb2x1bW4uZmllbGRdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTlVNRVJJQykge1xuICAgICAgICBjb25zdCBkaWdpdHNJbmZvID0gY29sdW1uPy5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbztcbiAgICAgICAgaWYgKGNvbHVtbi5mb3JtYXQ/LnR5cGUgPT09ICdwZXJjZW50Jykge1xuICAgICAgICAgIGlmIChjb2x1bW4uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmFsbG93Q2FsY3VsYXRlKSB7XG4gICAgICAgICAgICBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdID0gcGFyc2VGbG9hdCgoc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSAqIDEwMCk/LnRvU3RyaW5nKCkpLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdID0gc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSAqIDEwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuQVVUT0NPTVBMRVRFICYmXG4gICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF1cbiAgICAgICkge1xuICAgICAgICAvLyBzZXQgYXV0b2NvbXBlbGV0IGFycmF5IGRhdGEgYWZ0ZXIgc2F2ZSByb3dcbiAgICAgICAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSA9IGF1dG9tQ29tcGxldGVUZW1wRGF0YTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTE9PS1VQX0lOUFVUICYmXG4gICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gJiYgKGNvbHVtbi5hbGxvd1NhdmUgPT09IHRydWUgfHwgY29sdW1uLmFsbG93U2F2ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgKSB7XG4gICAgICAgIC8vIHNldCBMT09LVVBfSU5QVVQgZGF0YSBhZnRlciBzYXZlIHJvd1xuICAgICAgICBpZiAobG9va3VwSW5mb1tjb2x1bW4uZmllbGRdKSB7XG4gICAgICAgICAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSA9IGxvb2t1cEluZm9bY29sdW1uLmZpZWxkXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EUk9QRE9XTiAmJlxuICAgICAgICBjb2x1bW4ub3B0aW9uTGFiZWwgJiZcbiAgICAgICAgY29sdW1uLm9wdGlvblZhbHVlXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zZXREcm9wZG93blZhbHVlKGNvbHVtbiwgc2VsZWN0ZWRSb3cpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuYWRkTmV3Um93Q2hlY2sgPSBmYWxzZTtcbiAgICBpZiAoT2JqZWN0LnZhbHVlcyh0aGlzLmVkaXRpbmdSb3dLZXlzKS5ldmVyeSgodmFsdWUpID0+ICF2YWx1ZSkgJiYgdGhpcy5zZXRHcmlkUmVmcmVzaFRpbWUpIHtcbiAgICAgIHRoaXMucmVmcmVzaEdyaWQoKTtcbiAgICB9XG4gICAgdGhpcy5pc0NoZWNrQm94Q2hhbmdlRXZlbnRDYWxsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLnJvd1VwZGF0ZSA9IGZhbHNlO1xuICB9XG5cbiAgLy8gY2hlY2sgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkXG4gIGdyaWRWYWxpZGF0aW9uKGNvbHVtbnM6IGFueSwgcm93OiBhbnksIHNpbmdsZUNlbGw6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGlmIChzaW5nbGVDZWxsID09IHRydWUpIHtcbiAgICAgIGNvbHVtbnMgPSBbeyAuLi5jb2x1bW5zIH1dXG4gICAgfVxuICAgIGlmICghdGhpcy5ncmlkU2VydmljZS5jaGVja1ZhbGlkaXR5KGNvbHVtbnMsIHJvdywgc2luZ2xlQ2VsbCkpIHtcbiAgICAgIGxldCBlcnJvck1lc3NhZ2VEZXRhaWxzOiBzdHJpbmcgPSAnJztcbiAgICAgIGNvbHVtbnM/LmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICBpZiAoY29sdW1uLmVycm9yTWVzc2FnZSkge1xuICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMgPSBlcnJvck1lc3NhZ2VEZXRhaWxzID8gZXJyb3JNZXNzYWdlRGV0YWlscyArICcgLCAnICsgY29sdW1uLmVycm9yTWVzc2FnZSA6IGNvbHVtbi5lcnJvck1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBsZXQgaXNSZXF1aXJlZCA9IGNvbHVtbnMuc29tZShcbiAgICAgICAgKGNvbHVtbjogYW55KSA9PiBjb2x1bW4uZXJyb3JNZXNzYWdlICYmICFyb3dbY29sdW1uLmZpZWxkXVxuICAgICAgKTtcbiAgICAgIGlmIChpc1JlcXVpcmVkICYmICFzaW5nbGVDZWxsKSB7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmVycm9yKFxuICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMsXG4gICAgICAgICAgNTAwMCxcbiAgICAgICAgICAnUkVRVUlSRUQgRklFTEQnXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihlcnJvck1lc3NhZ2VEZXRhaWxzLCA1MDAwLCAnSU5WQUxJRCBGSUVMRCcpO1xuICAgICAgICBpZiAoc2luZ2xlQ2VsbCkge1xuICAgICAgICAgIHRoaXMuc2V0RXJyb3JDZWxsKGNvbHVtbnNbMF0sIHJvdylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2luZ2xlQ2VsbCkge1xuICAgICAgICB0aGlzLnNldEVycm9yQ2VsbChjb2x1bW5zWzBdLCByb3cpXG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgc2V0RXJyb3JDZWxsKGNvbHVtbiwgcm93KSB7XG4gICAgaWYgKGNvbHVtbi5lcnJvck1lc3NhZ2UpIHtcbiAgICAgIGlmIChyb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkgKyAnX29iaiddKSB7XG4gICAgICAgIHJvd1tjb2x1bW4uZmllbGQudG9Mb3dlckNhc2UoKSArICdfb2JqJ10gPSB7IC4uLnJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLCBlcnJvck1lc3NhZ2U6IGNvbHVtbi5lcnJvck1lc3NhZ2UgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvd1tjb2x1bW4uZmllbGQudG9Mb3dlckNhc2UoKSArICdfb2JqJ10gPSB7IGVycm9yTWVzc2FnZTogY29sdW1uLmVycm9yTWVzc2FnZSB9O1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChyb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkgKyAnX29iaiddKSB7XG4gICAgICAgIGRlbGV0ZSByb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkgKyAnX29iaiddLmVycm9yTWVzc2FnZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJvdyA6IGFueVxuICAgKiBAcGFyYW0gaW5kZXggOiBudW1iZXJcbiAgICogQ2xlYXJzIG91dCB0aGUgZWRpdCByb3cgYW5kIHJlcGxhY2Ugd2l0aCByZWFkYWJsZSBvbmVcbiAgICovXG4gIG9uUm93RWRpdENhbmNlbChyb3c6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgIGxldCByb3dJbkVkaXRNb2RlOiBib29sZWFuID0gT2JqZWN0LnZhbHVlcyh0aGlzLmVkaXRpbmdSb3dLZXlzKS5ldmVyeSgodmFsdWUpID0+ICF2YWx1ZSk7XG4gICAgaWYgKHJvdz8uaXNOZXcpIHtcbiAgICAgIHRoaXMucm93c0RhdGEuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb3dzRGF0YVtpbmRleF0gPSB0aGlzLmVkaXRSb3dzUmVjb3Jkc1tyb3dbdGhpcy5kYXRhS2V5XV07XG4gICAgICBkZWxldGUgdGhpcy5lZGl0Um93c1JlY29yZHNbcm93W3RoaXMuZGF0YUtleV1dO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5lZGl0aW5nUm93S2V5c1tyb3dbdGhpcy5kYXRhS2V5XV07XG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRFJPUERPV04pIHtcbiAgICAgICAgdGhpcy5zZXREcm9wZG93blZhbHVlKGNvbHVtbiwgcm93KTtcbiAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5MT09LVVBfSU5QVVQgJiYgY29sdW1uLmRpc3BsYXlGaWVsZCkge1xuICAgICAgICB0aGlzLnJvd3NEYXRhW2luZGV4XVtjb2x1bW4uZmllbGRdID0gcm93W2NvbHVtbi5maWVsZF0/LnZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuaW5FZGl0TW9kZSA9IGZhbHNlO1xuICAgIGlmIChyb3dJbkVkaXRNb2RlKSB7XG4gICAgICB0aGlzLnNvcnREaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmFkZE5ld1Jvd0NoZWNrID0gZmFsc2U7XG4gICAgdGhpcy5yb3dVcGRhdGVDaGFuZ2UgPSBmYWxzZTtcbiAgICB0aGlzLmlubGluZVJvd0NhbmNlbC5lbWl0KHJvdyk7XG4gICAgICBpZiAocm93SW5FZGl0TW9kZSAmJiB0aGlzLnNldEdyaWRSZWZyZXNoVGltZSkge1xuICAgICAgICB0aGlzLnJlZnJlc2hHcmlkKCk7XG4gICAgICB9XG4gIH1cblxuICAvKipcbiAgICogXG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSByb3dcbiAgICogU2VuZHMgdGhlIHJvdyBwYXlsb2FkIHRvIHBhcmVudCBmb3IgZGVsZXRpb25zXG4gICAqL1xuXG4gIC8qKlxuICAqc2V0IHRoZSBncmlkRGF0YSBvbiByb3cgYWN0aW9ucyBldmVudHNcbiAgKi9cbiAgcm93QWN0aW9uRXZlbnRzKHJvd0luZm8sIGRlbGV0ZVJvdzogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgbGV0IGFjdGlvbjogc3RyaW5nID0gJyc7XG4gICAgbGV0IGdyaWRSb3dzRGF0YTogYW55W10gPSBbLi4udGhpcy5yb3dzRGF0YV07XG4gICAgY29uc3QgaW5kZXggPSBncmlkUm93c0RhdGEuZmluZEluZGV4KChyb3dEYXRhKSA9PiByb3dJbmZvW3RoaXMuZGF0YUtleV0gPT09IHJvd0RhdGFbdGhpcy5kYXRhS2V5XSk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIGlmIChkZWxldGVSb3cpIHtcbiAgICAgICAgZ3JpZFJvd3NEYXRhLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMucm93c0RhdGEgPSBbLi4uZ3JpZFJvd3NEYXRhXTtcbiAgICAgICAgYWN0aW9uID0gJ2RlbGV0ZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5hZGROZXdSb3dDaGVjaykge1xuICAgICAgICAgIGFjdGlvbiA9ICdpbnNlcnQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjdGlvbiA9ICd1cGRhdGUnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9uR3JpZFJvd0FjdGlvbnMub2JzZXJ2ZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIHJvd0luZm9bJ3Jvd0FjdGlvbiddID0gYWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGdyaWRSb3dzRGF0YVtpbmRleF0gPSByb3dJbmZvO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmdlbmVyYXRlUm93c0RhdGFDb3B5ID0gZmFsc2U7XG4gICAgdGhpcy5yb3dVcGRhdGVDaGFuZ2UgPSBmYWxzZTtcbiAgICB0aGlzLnJvd3NDaGFuZ2UuZW1pdCh0aGlzLnJvd3NEYXRhKTtcbiAgICB0aGlzLm9uR3JpZFJvd0FjdGlvbnMuZW1pdChncmlkUm93c0RhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gRGVsZXRlIGNvbmZpcm1hdGlvbiBkaWFsb2cgd2hlbiB0cnlpbmcgdG8gZGVsZXRlIHJvd1xuICAgKi9cbiAgZGVsZXRlUmVjb3JkKHJvdzogYW55KSB7XG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xuICAgICAgbWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB0aGF0IHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHJlY29yZD8nLFxuICAgICAgaGVhZGVyOiAnRGVsZXRlIENvbmZpcm1hdGlvbicsXG4gICAgICBpY29uOiAncGkgcGktZXhjbGFtYXRpb24tdHJpYW5nbGUnLFxuICAgICAga2V5OiAnaGFuZGxlSW5saW5lQ1JVRCcsXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudXNlU2VydmVyU2lkZUV2ZW50cykge1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0IHRoZSBncmlkIGRlbGV0ZWQgZGF0YSBcbiAgICAgICAgdGhpcy5yb3dBY3Rpb25FdmVudHMocm93LCB0cnVlKTtcbiAgICAgICAgdGhpcy5vblJvd0RlbGV0ZS5lbWl0KHJvdyk7XG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jbG9zZSgpO1xuICAgICAgICB0aGlzLmluRWRpdE1vZGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgcmVqZWN0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jbG9zZSgpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBzZXQgZGlzYWJsZWQgdGhlIGNvbnRyb2xcbiAgICovXG4gIGFsbG93RGlzYWJsZWQoY29sdW1uOiBhbnksIHJvdzogYW55KTogYm9vbGVhbiB7XG4gICAgbGV0IHZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gICAgaWYgKHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddICYmIHR5cGVvZiAocm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10pID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKFxuICAgICAgICBPYmplY3Qua2V5cyhyb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXSk/LmluY2x1ZGVzKCdkaXNhYmxlZCcpICYmIHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5kaXNhYmxlZCA9PT0gdHJ1ZVxuICAgICAgKSB7XG4gICAgICAgIHZhbHVlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbHVtbi5kaXNhYmxlZCApIHtcbiAgICAgIHZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIHNldCBhZ2dyZWdhdGUgaW4gZ3JpZCBmb290ZXJcbiAgICovXG4gIHNldEFnZ3JlZ2F0ZVRleHQoY29sdW1uOiBJR3JpZENvbHVtbikge1xuICAgIGlmIChjb2x1bW4/LmFnZ3JlZ2F0ZSkge1xuICAgICAgY29sdW1uLmFnZ3JlZ2F0ZS5mb3JFYWNoKChjb2w6IGFueSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5yb3dzRGF0YSAmJiB0aGlzLnJvd3NEYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsZXQgY29sdW1uVHlwZTogRUdyaWRBZ2dyZWdhdGUgPSBjb2wudHlwZTtcbiAgICAgICAgICBpZiAoY29sdW1uVHlwZSA9PT0gRUdyaWRBZ2dyZWdhdGUuQ09VTlQpIHtcbiAgICAgICAgICAgIGxldCBjb3VudCA9IHRoaXMucm93c0RhdGEubGVuZ3RoO1xuICAgICAgICAgICAgY291bnQgPSB0aGlzLnNldEZldGNoQWdncmVnYXRlZFZhbHVlKGNvbHVtbiwgY291bnQsIDEpO1xuICAgICAgICAgICAgY29sLmFnZ3JWYWx1ZSA9IHRoaXMuc2V0QWdncmVnYXRlRm9vdGVyVGV4dChjb2wsIGNvdW50LCAnQ291bnQnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb2x1bW5UeXBlID09PSBFR3JpZEFnZ3JlZ2F0ZS5TVU0gfHxcbiAgICAgICAgICAgIGNvbHVtblR5cGUgPT09IEVHcmlkQWdncmVnYXRlLkFWRVJBR0VcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbFZhbHVlczogbnVtYmVyW10gPSB0aGlzLmdldENvbHVtblZhbHVlcyhjb2x1bW4pO1xuICAgICAgICAgICAgaWYgKGNvbFZhbHVlcyAmJiBjb2xWYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBsZXQgc3VtID0gY29sVmFsdWVzLnJlZHVjZSgoYWNjLCBjdXIpID0+IGFjYyArIGN1ciwgMCk7XG4gICAgICAgICAgICAgIGlmIChjb2x1bW5UeXBlID09PSBFR3JpZEFnZ3JlZ2F0ZS5TVU0pIHtcbiAgICAgICAgICAgICAgICBzdW0gPSB0aGlzLnNldEZldGNoQWdncmVnYXRlZFZhbHVlKGNvbHVtbiwgc3VtLCAyKTtcbiAgICAgICAgICAgICAgICBjb2wuYWdnclZhbHVlID0gdGhpcy5zZXRBZ2dyZWdhdGVGb290ZXJUZXh0KGNvbCwgc3VtLCAnU3VtJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGNvbHVtblR5cGUgPT09IEVHcmlkQWdncmVnYXRlLkFWRVJBR0UpIHtcbiAgICAgICAgICAgICAgICBsZXQgYXZlcmFnZSA9IHN1bSAvIGNvbFZhbHVlcy5sZW5ndGggfHwgMDtcbiAgICAgICAgICAgICAgICBhdmVyYWdlID0gdGhpcy5zZXRGZXRjaEFnZ3JlZ2F0ZWRWYWx1ZShjb2x1bW4sIHN1bSwgMyk7XG4gICAgICAgICAgICAgICAgY29sLmFnZ3JWYWx1ZSA9IHRoaXMuc2V0QWdncmVnYXRlRm9vdGVyVGV4dChcbiAgICAgICAgICAgICAgICAgIGNvbCxcbiAgICAgICAgICAgICAgICAgIGF2ZXJhZ2UsXG4gICAgICAgICAgICAgICAgICAnQXZnJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29sLmFnZ3JWYWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBzZXQgdGhlIGFnZ3JlZ2F0YWlvbiB2YWx1ZSB0aGF0IGNvbWluZyBmcm9tIGZldGNoXG4gIHNldEZldGNoQWdncmVnYXRlZFZhbHVlKGNvbHVtbiwgYWdncmVnYXRlVmFsdWUsIGFnZ3JlZ2F0ZUFjdGlvbikge1xuICAgIGlmICh0aGlzLmFnZ3JlZ2F0ZWRSZXN1bHQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGFnZ3JlZ2F0ZWRDb2x1bW4gPSB0aGlzLmFnZ3JlZ2F0ZWRSZXN1bHQuZmluZCgoYWdncmVnYXRlKSA9PiBhZ2dyZWdhdGUuZmllbGQ/LnRvTG93ZXJDYXNlKCkgPT09IGNvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSAmJiBhZ2dyZWdhdGUuYWdncmVnYXRpb25PcGVyYXRpb24gPT09IGFnZ3JlZ2F0ZUFjdGlvbik7XG4gICAgICBpZiAoYWdncmVnYXRlZENvbHVtbikge1xuICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGFnZ3JlZ2F0ZWRDb2x1bW4/LnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWdncmVnYXRlVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogc2V0IGdyaWQgQWdncmVnYXRlIHZhbHVlc1xuICAgKi9cbiAgc2V0QWdncmVnYXRlRm9vdGVyVGV4dChjb2x1bW46IGFueSwgdmFsdWU6IG51bWJlciwgZGVmYXVsdENhcHRpb246IHN0cmluZykge1xuICAgIGNvbnN0IGlzRGVjaW1hbEZvcm1hdDogYm9vbGVhbiA9IGNvbHVtbi5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJztcbiAgICBjb25zdCBkaWdpdHNJbmZvID0gY29sdW1uLmZvcm1hdD8uZGlnaXRzSW5mbztcbiAgICBjb25zdCBjYXB0aW9uOiBzdHJpbmcgPVxuICAgICAgY29sdW1uLmNhcHRpb24/Lmxlbmd0aCA+IDAgPyBjb2x1bW4uY2FwdGlvbiA6IGRlZmF1bHRDYXB0aW9uO1xuXG4gICAgY29uc3QgZGVjaW1hbFBvaW50ID0gaXNEZWNpbWFsRm9ybWF0XG4gICAgICA/IHZhbHVlPy50b0ZpeGVkKGRpZ2l0c0luZm8gPyBkaWdpdHNJbmZvIDogMilcbiAgICAgIDogdmFsdWU/LnRvRml4ZWQoMCk7XG4gICAgcmV0dXJuIGAke2NhcHRpb259ICR7ZGVjaW1hbFBvaW50XG4gICAgICAudG9TdHJpbmcoKVxuICAgICAgLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csICcsJyl9IDwvYnI+YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgZGVjaW1hdCBhbmQgbnVtZXJpYyB2YWx1ZXNcbiAgICovXG4gIHNldE51bWVyaWNWYWx1ZXMoKSB7XG4gICAgaWYgKHRoaXMuY29sdW1ucz8ubGVuZ3RoID4gMCAmJiB0aGlzLnJvd3NEYXRhPy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTlVNRVJJQykge1xuICAgICAgICAgIGNvbnN0IGRpZ2l0c0luZm8gPSBjb2x1bW4/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvO1xuICAgICAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICBpZiAoY29sdW1uPy5mb3JtYXQ/LnR5cGUgPT09ICdwZXJjZW50JyAmJiByb3dbY29sdW1uLmZpZWxkXSkge1xuICAgICAgICAgICAgICBpZiAoY29sdW1uLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5hbGxvd0NhbGN1bGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHBhcnNlRmxvYXQoKHJvd1tjb2x1bW4uZmllbGRdICogMTAwKT8udG9TdHJpbmcoKSkudG9GaXhlZChkaWdpdHNJbmZvKTsgICAgICAgICAvL1RIRVNFIENPTU1FTlRFRCBPVVQgTElORVMgU0hPVUxEIFJVTiBPTiBTQVZFXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gcm93W2NvbHVtbi5maWVsZF0gKiAxMDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZ2l0c0luZm8pIHtcbiAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHBhcnNlRmxvYXQocm93W2NvbHVtbi5maWVsZF0pLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJyAmJiByb3dbY29sdW1uLmZpZWxkXSkge1xuICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHBhcnNlRmxvYXQocm93W2NvbHVtbi5maWVsZF0pLnRvRml4ZWQoZGlnaXRzSW5mbyA/IGRpZ2l0c0luZm8gOiAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZ2V0IGNvbHVtbiB2YWx1ZSBiYXNlZCBvbiBjb2x1bW4gZmllbGRcbiAgICovXG4gIGdldENvbHVtblZhbHVlcyhjb2x1bW46IElHcmlkQ29sdW1uKSB7XG4gICAgbGV0IGFycjogYW55ID0gW107XG4gICAgdGhpcy5yb3dzRGF0YS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMocm93KTtcbiAgICAgIGtleXMubWFwKChrZXkpID0+IHtcbiAgICAgICAgaWYgKGNvbHVtbi5maWVsZCA9PT0ga2V5KSB7XG4gICAgICAgICAgYXJyLnB1c2gocm93W2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gYXJyO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEV4cG9ydCB0byBQREZcbiAgICovXG4gIGV4cG9ydFBkZigpIHtcbiAgICB2YXIgZXhwb3J0RGF0YSA9IHRoaXMuc2V0RXhwb3J0RGF0YShbLi4udGhpcy5yb3dzRGF0YV0sIHRydWUpO1xuICAgIGxldCBkb2MgPSBuZXcganNQREYoJ3AnLCAncHQnKTtcbiAgICBkb2MudGFibGUoMSwgMSwgZXhwb3J0RGF0YS5yb3dzLCBleHBvcnREYXRhLmhlYWRpbmdzLCB7IGF1dG9TaXplOiB0cnVlIH0pO1xuICAgIGRvYy5zYXZlKCdFeHBvcnQucGRmJyk7XG4gIH1cblxuICAvKipcbiAgICogIFN1Yi1mdW5jdGlvbiB0byBzZXQgcm93cyBmb3IgZXhwb3J0IHRvIFBkZiwgYW5kIEV4Y2VsXG4gICAqIEByb3dzIHBhcmFtIGZvciByb3dzXG4gICAqIEBpc0V4Y2VsIHBhcmFtIGZvciBleHBvcnQgdG8gZXhjZWwgaW5kaWNhdGlvblxuICAgKi9cbiAgc2V0RXhwb3J0RGF0YShyb3dzOiBhbnlbXSA9IFtdLCBpc1BkZjogYm9vbGVhbiA9IGZhbHNlKTogSUdyaWREYXRhRXhwb3J0IHtcbiAgICBjb25zdCBoZWFkaW5nczogYW55ID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uZmllbGQpO1xuICAgIHJvd3MuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICBmb3IgKHZhciBwcm9wIGluIHJvdykge1xuICAgICAgICBpZiAoIWhlYWRpbmdzLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgZGVsZXRlIHJvd1twcm9wXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQZGYpIHtcbiAgICAgICAgICByb3dbcHJvcF0gPVxuICAgICAgICAgICAgIXJvd1twcm9wXSAmJiB0eXBlb2Ygcm93W3Byb3BdICE9PSAnYm9vbGVhbidcbiAgICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgICA6IHJvd1twcm9wXS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcm93cywgaGVhZGluZ3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBFeHBvcnQgdG8gRXhjZWxcbiAgICovXG4gIGV4cG9ydEV4Y2VsKCkge1xuICAgIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuZXhwb3J0VG9FeGNlbD8udW5pcXVlS2V5KSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5nZXRVc2Vyc0RhdGEoKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGxldCByb3dzID0gdGhpcy5ncmlkU2VydmljZS5zZXREYXRhRmllbGRzKHJlc3BvbnNlPy5yZWNvcmRzKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXhwb3J0RmlsZShyb3dzKTtcbiAgICAgIH0sXG4gICAgICAgICh7IGVycm9yIH0pID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hcGlFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwb3J0RmlsZSh0aGlzLnJvd3NEYXRhKTtcbiAgICB9XG4gIH1cblxuICBleHBvcnRGaWxlKHJlY29yZHMpIHtcbiAgICBsZXQgYXJyOiBhbnkgPSBbXTtcbiAgICByZWNvcmRzLmZvckVhY2goKHJvdzogYW55KSA9PiB7XG4gICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goKGNvbHVtbjogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGdyaWRIZWFkZXIgPSBjb2x1bW4uaGVhZGVyO1xuICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5MSU5LKSB7XG4gICAgICAgICAgY29uc3QgbGlua09iaiA9IHJvd1tjb2x1bW4uZGlzcGxheVRleHQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddO1xuICAgICAgICAgIG9ialtncmlkSGVhZGVyXSA9IHJvd1tjb2x1bW4uZmllbGRdICsgJ3wnICsgbGlua09iaj8uaHlwZXJsaW5rO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9ialtncmlkSGVhZGVyXSA9IHJvd1tjb2x1bW4uZmllbGRdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFyci5wdXNoKG9iaik7XG4gICAgfSk7XG4gICAgdGhpcy5ncmlkU2VydmljZS5leHBvcnRFeGNlbChhcnIsIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLCBFR3JpZEV4Y2VsLkVYUE9SVCk7XG4gIH1cbiAgZ2V0VXNlcnNEYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RTZXJ2aWNlLmdldDxhbnlbXSwgUmVxdWVzdER0bz4oJy9EYXRhL0ZldGNoJywge1xuICAgICAgdW5pcXVlS2V5OiB0aGlzLmNvbmZpZ1NlcnZpY2UuZXhwb3J0VG9FeGNlbD8udW5pcXVlS2V5LFxuICAgICAgZmlsdGVyczogdGhpcy5jb25maWdTZXJ2aWNlLmV4cG9ydFRvRXhjZWw/LmZpbHRlcnMsXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqc2V0IGNvbmZpZyBkYXRhIG9mIGxvb2t1cCBjb250cm9sIGRpYWxvZ1xuICAgKi9cbiAgc2V0TG9va3VwRGlhbG9nQ29uZmlnKHJvdzogYW55LCBjb2x1bW46IGFueSwgZGF0YTogYW55KSB7XG4gICAgbGV0IHNlbGVjdGlvbjogc3RyaW5nID0gJyc7XG4gICAgaWYgKHJvd1tjb2x1bW4uZmllbGRdICYmIHR5cGVvZiByb3dbY29sdW1uLmZpZWxkXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHNlbGVjdGlvbiA9IHJvd1tjb2x1bW4uZmllbGRdLnRleHQ7XG4gICAgfSBlbHNlIGlmIChjb2x1bW4uZGlzcGxheUZpZWxkICYmIHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkXSkge1xuICAgICAgc2VsZWN0aW9uID0gcm93W2NvbHVtbi5kaXNwbGF5RmllbGRdO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3Rpb24gPSByb3dbY29sdW1uLmZpZWxkXTtcbiAgICB9XG5cbiAgICBpZiAoY29sdW1uLmZpZWxkICYmIHR5cGVvZiByb3dbY29sdW1uLmZpZWxkXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IG5ld1JvdyA9IHsgLi4ucm93IH07XG4gICAgICBuZXdSb3dbY29sdW1uLmZpZWxkXSA9IG5ld1Jvd1tjb2x1bW4uZmllbGRdPy52YWx1ZTtcbiAgICAgIHJvdyA9IHsgLi4ubmV3Um93IH07XG4gICAgfVxuXG4gICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTE9PS1VQX0lOUFVUICYmIGRhdGEpIHtcbiAgICAgIGxldCBvYmogPSBhdXRvU2V0TG9va3VwRGF0YShkYXRhLCByb3cpO1xuICAgICAgcm93W2NvbHVtbi5maWVsZCArICctZGF0YSddID0gb2JqO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcm93RGF0YTogcm93W2NvbHVtbi5maWVsZCArICctZGF0YSddLFxuICAgICAgc2VsZWN0aW9uOiBzZWxlY3Rpb24sXG4gICAgICBjb2x1bW46IGNvbHVtbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gbGluayBvbiBsb29rdXBDb250cm9sIGNvbnRyb2wgaW4gcmVhZCBvbmx5IG1vZGUgd2hlbiBlZGl0TGluayBzZXQgdHJ1ZVxuICAgKi9cbiAgb3Blbkxvb2t1cEh5cGVybGluayhjb2x1bW46IElHcmlkQ29sdW1uLCByb3c6IGFueSkge1xuICAgIGlmIChjb2x1bW4uZWRpdExpbmsgPT09IHRydWUgJiYgY29sdW1uLmNvbXBvbmVudCkge1xuICAgICAgbGV0IG9iajogYW55ID0gdGhpcy5zZXRMb29rdXBEaWFsb2dDb25maWcocm93LCBjb2x1bW4sIGNvbHVtbi5kYXRhPy5kYXRhKTtcbiAgICAgIG9ialsnY29tcG9uZW50J10gPSBjb2x1bW4uY29tcG9uZW50O1xuICAgICAgY29uc3QgcmVmID0gdGhpcy5vcGVuTG9va3VwRGlhbG9nKG9iaik7XG4gICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGRyYWdnYWJsZURpYWxvZyhjb2x1bW4/LmZpZWxkID8gY29sdW1uPy5maWVsZCA6IGNvbHVtbj8uaGVhZGVyKVxuICAgICAgfSk7XG4gICAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICBpZiAocmVzICYmIGNvbHVtbi5vblJldHVybikge1xuICAgICAgICAgIGNvbHVtbi5vblJldHVybihyZXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBsb29rdXAgRGlhbG9nXG4gICAqL1xuICBvcGVuTG9va3VwRGlhbG9nKGNvbHVtbj86IGFueSwgcm93OiBhbnkgPSB7fSkge1xuICAgIHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgIGNvbnN0IGNvbHVtbkRhdGEgPSBjb2x1bW4uY29sdW1uPy5sb29rdXBDb250cm9sPy5kYXRhID8gY29sdW1uLmNvbHVtbi5sb29rdXBDb250cm9sLmRhdGEgOiBjb2x1bW4uY29sdW1uLmRhdGE7XG4gICAgaWYgKHJvd1tjb2x1bW4uY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpICsgJ19vYmonXT8ubG9va3VwQ29udHJvbCkge1xuICAgICAgcm93W2NvbHVtbi5jb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5kYXRhPy5oZWFkZXIgPyBjb2x1bW5EYXRhLmhlYWRlciA9IHJvd1tjb2x1bW4uY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpICsgJ19vYmonXT8ubG9va3VwQ29udHJvbD8uZGF0YT8uaGVhZGVyIDogJydcbiAgICAgIHJvd1tjb2x1bW4uY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpICsgJ19vYmonXT8ubG9va3VwQ29udHJvbD8uZGF0YT8ud2lkdGggPyBjb2x1bW5EYXRhLndpZHRoID0gcm93W2NvbHVtbi5jb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5kYXRhPy53aWR0aCA6ICcnXG4gICAgICByb3dbY29sdW1uLmNvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSArICdfb2JqJ10/Lmxvb2t1cENvbnRyb2w/LmRhdGE/LmhlaWdodCA/IGNvbHVtbkRhdGEuaGVpZ2h0ID0gcm93W2NvbHVtbi5jb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5kYXRhPy5oZWlnaHQgOiAnJ1xuICAgICAgcm93W2NvbHVtbi5jb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5kYXRhPy52YWx1ZVByb3AgPyBjb2x1bW5EYXRhLnZhbHVlUHJvcCA9IHJvd1tjb2x1bW4uY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpICsgJ19vYmonXT8ubG9va3VwQ29udHJvbD8uZGF0YT8udmFsdWVQcm9wIDogXCJcIlxuICAgICAgcm93W2NvbHVtbi5jb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5kYXRhPy5sYWJlbFByb3AgPyBjb2x1bW5EYXRhLmxhYmVsUHJvcCA9IHJvd1tjb2x1bW4uY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpICsgJ19vYmonXT8ubG9va3VwQ29udHJvbD8uZGF0YT8ubGFiZWxQcm9wIDogXCJcIlxuICAgICAgcm93W2NvbHVtbi5jb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5kYXRhPy5kYXRhID8gY29sdW1uRGF0YS5kYXRhID0gcm93W2NvbHVtbi5jb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5kYXRhPy5kYXRhIDogJydcbiAgICB9XG5cbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKGNvbHVtbi5jb21wb25lbnQsIHtcbiAgICAgIC4uLmNvbHVtbkRhdGEsXG4gICAgICBzdHlsZUNsYXNzOiAnbG9va3VwLW1vZGVsJyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgc2VsZWN0aW9uOiBjb2x1bW4uc2VsZWN0aW9uLFxuICAgICAgICBmaWVsZDogY29sdW1uLmNvbHVtbi5maWVsZCxcbiAgICAgICAgbGFiZWxQcm9wOiBjb2x1bW4uY29sdW1uLmxvb2t1cENvbnRyb2w/LmRhdGE/LmxhYmVsUHJvcCxcbiAgICAgICAgLi4uY29sdW1uLnJvd0RhdGEsXG5cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmWydkaWFsb2dDbG9zZSddID0gdGhpcy5kaWFsb2dSZWYuY2xvc2U7XG4gICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSA9IHRoaXMuaW50ZXJjZXB0RGlhbG9nQ2xvc2UuYmluZCh0aGlzKTtcbiAgICB9KTtcblxuICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vICAgdGhpcy5kaWFsb2dSZWZbJ2RpYWxvZ0Nsb3NlJ10gPSB0aGlzLmRpYWxvZ1JlZi5jbG9zZTtcbiAgICAvLyAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlID0gdGhpcy5pbnRlcmNlcHREaWFsb2dDbG9zZS5iaW5kKHRoaXMpO1xuICAgIC8vIH0sIDgwMCk7XG5cbiAgICB0aGlzLnNldER5bmFtaWNEaWFsb2dSZWYodGhpcy5kaWFsb2dSZWYpO1xuICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSByb3dbY29sdW1uLmNvbHVtbi5maWVsZF0/Lm5hbWU7XG4gICAgaWYgKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpLCBjb21wb25lbnROYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGlhbG9nUmVmO1xuICB9XG4gIFxuICBpbnRlcmNlcHREaWFsb2dDbG9zZShldmVudDogYW55KSB7XG4gICAgbGV0IGdyaWRTYXZlSW5EaWFsb2c6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3AtZGlhbG9nJyk7XG4gICAgaWYgKGdyaWRTYXZlSW5EaWFsb2c/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZvcm1TYXZlQnV0dG9uID0gZ3JpZFNhdmVJbkRpYWxvZ1swXT8ucXVlcnlTZWxlY3RvcignLmZvcm0tc2F2ZS1idXR0b24nKTtcbiAgICAgIGNvbnN0IGdyaWRTYXZlQWxsQnV0dG9uID0gZ3JpZFNhdmVJbkRpYWxvZ1swXT8ucXVlcnlTZWxlY3RvcignLnNhdmUtYWxsLWdyaWQnKTtcbiAgICAgIGlmICgoZm9ybVNhdmVCdXR0b24gfHwgZ3JpZFNhdmVBbGxCdXR0b24pICYmICh0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgfHwgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQpKSB7XG4gICAgICAgIGlmIChjb25maXJtKFwiWW91IHdpbGwgbG9zZSBjaGFuZ2VzIG5vdCBzYXZlZCBvbiBwYWdlLiBXb3VsZCB5b3UgbGlrZSB0byBjb250aW51ZT9cIikgPT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmPy5kaWFsb2dDbG9zZShldmVudCk7XG4gICAgICAgICAgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1lbHNle1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZj8uZGlhbG9nQ2xvc2UoZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHNldCBkaWFsb2cgcmVmIHdoZW4gcG9wdXAgb3BlblxuICBzZXREeW5hbWljRGlhbG9nUmVmKHJlZikge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5kaWFsb2dDb21wb25lbnRSZWZNYXAuZ2V0KHJlZik7XG4gICAgY29uc3QgZHluYW1pY0NvbXBvbmVudCA9IGRpYWxvZ1JlZj8uaW5zdGFuY2UgYXMgRHluYW1pY0RpYWxvZ0NvbXBvbmVudDtcbiAgICBjb25zdCBhcmlhTGFiZWxsZWRCeSA9IGR5bmFtaWNDb21wb25lbnQuZ2V0QXJpYUxhYmVsbGVkQnkoKTtcbiAgICBkeW5hbWljQ29tcG9uZW50LmdldEFyaWFMYWJlbGxlZEJ5ID0gKCkgPT4gYXJpYUxhYmVsbGVkQnk7XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBkaWFsb2cgb24gbG9va3VwQ29udHJvbCBmaWVsZFxuICAgKi9cbiAgc2VsZWN0TG9va3VwRmllbGQoY29sdW1uOiBhbnksIHJvdz86IGFueSkge1xuICAgIHRoaXMub25DbGlja0V2ZW50KGNvbHVtbiwgcm93KTtcbiAgICBsZXQgb2JqOiBhbnkgPSB0aGlzLnNldExvb2t1cERpYWxvZ0NvbmZpZyhcbiAgICAgIHJvdyxcbiAgICAgIGNvbHVtbixcbiAgICAgIHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5kYXRhPy5kYXRhXG4gICAgICAgID8gcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/Lmxvb2t1cENvbnRyb2w/LmRhdGE/LmRhdGEgOiBjb2x1bW4/Lmxvb2t1cENvbnRyb2w/LmRhdGE/LmRhdGFcbiAgICApO1xuXG4gICAgb2JqWydjb21wb25lbnQnXSA9IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5jb21wb25lbnQgPyByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8ubG9va3VwQ29udHJvbD8uY29tcG9uZW50IDogY29sdW1uLmxvb2t1cENvbnRyb2w/LmNvbXBvbmVudDtcbiAgICBjb25zdCByZWYgPSB0aGlzLm9wZW5Mb29rdXBEaWFsb2cob2JqLCByb3cpO1xuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgZHJhZ2dhYmxlRGlhbG9nKGNvbHVtbj8uZmllbGQgPyBjb2x1bW4/LmZpZWxkIDogY29sdW1uPy5oZWFkZXIpXG4gICAgfSk7XG4gICAgcmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKFxuICAgICAgKHJlcykgPT4ge1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgdGhpcy5ncmlkU2VydmljZS51c2VyU2VhcmNoZWQ9ZmFsc2U7XG4gICAgICAgICAgbGV0IHZhbHVlID0gc2V0RGlhbG9nUmVzcG9uc2UoXG4gICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgICBjb2x1bW4ubG9va3VwQ29udHJvbCxcbiAgICAgICAgICAgIHJlc1xuICAgICAgICAgICk7XG4gICAgICAgICAgcmVzID0gb2JqQ29udmVydFRvTG93ZXIocmVzKTtcbiAgICAgICAgICBsZXQgbGFiZWxQcm9wID0gY29sdW1uPy5sb29rdXBDb250cm9sPy5kYXRhPy5sYWJlbFByb3A/LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgbGV0IHZhbHVlUHJvcCA9IGNvbHVtbj8ubG9va3VwQ29udHJvbD8uZGF0YT8udmFsdWVQcm9wPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGxldCBjb2x1bW5GaWVsZCA9IGNvbHVtbj8uZmllbGQ/LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKGNvbHVtbi5kaXNwbGF5RmllbGQpIHtcbiAgICAgICAgICAgIGlmIChyb3c/Lmhhc093blByb3BlcnR5KGNvbHVtbi5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgIHJvd1tjb2x1bW5GaWVsZF0gPSByZXNbdmFsdWVQcm9wID8gdmFsdWVQcm9wIDogY29sdW1uRmllbGRdO1xuICAgICAgICAgICAgICByb3dbY29sdW1uLmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV0gPSByZXNbbGFiZWxQcm9wID8gbGFiZWxQcm9wIDogY29sdW1uLmRpc3BsYXlGaWVsZC50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJvd1tjb2x1bW5GaWVsZF0gPSB7XG4gICAgICAgICAgICAgICAgdGV4dDogcmVzW2xhYmVsUHJvcCA/IGxhYmVsUHJvcCA6IGNvbHVtbi5kaXNwbGF5RmllbGQudG9Mb3dlckNhc2UoKV0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IHJlc1t2YWx1ZVByb3AgPyB2YWx1ZVByb3AgOiBjb2x1bW5GaWVsZF0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHZhbHVlLnZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZVsnZmllbGQnXSA9IGNvbHVtbkZpZWxkO1xuICAgICAgICAgICAgaWYgKGxhYmVsUHJvcCB8fCB2YWx1ZVByb3ApIHtcbiAgICAgICAgICAgICAgcm93W2NvbHVtbkZpZWxkXSA9IHtcbiAgICAgICAgICAgICAgICB0ZXh0OiByZXNbbGFiZWxQcm9wID8gbGFiZWxQcm9wIDogcmVzW2xhYmVsUHJvcF1dLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXNbdmFsdWVQcm9wID8gdmFsdWVQcm9wIDogcmVzW2xhYmVsUHJvcF1dLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcm93W2NvbHVtbkZpZWxkXSA9IHZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobGFiZWxQcm9wIHx8IHZhbHVlUHJvcCkge1xuICAgICAgICAgICAgICByb3dbY29sdW1uRmllbGRdID0ge1xuICAgICAgICAgICAgICAgIHRleHQ6IHJlc1tsYWJlbFByb3AgPyBsYWJlbFByb3AgOiB2YWx1ZVByb3AgPyB2YWx1ZVByb3AgOiByZXNbY29sdW1uRmllbGRdXSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcmVzW3ZhbHVlUHJvcCA/IHZhbHVlUHJvcCA6IHJlc1tjb2x1bW5GaWVsZF1dLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcm93W2NvbHVtbkZpZWxkXSA9IHJlc1tjb2x1bW5GaWVsZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgKHJvd1tjb2x1bW4uZmllbGRdKSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddID0geyAuLi5yb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXSwgdGV4dDogcm93W2NvbHVtbi5maWVsZF0gfTtcbiAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHJvd1tjb2x1bW4uZmllbGRdPy52YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4uZGlzcGxheUZpZWxkKSB7XG4gICAgICAgICAgaWYgKHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddKSB7XG4gICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXSA9IHsgLi4ucm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10sIHRleHQ6IHsgdGV4dDogcm93W2NvbHVtbi5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCldLCB2YWx1ZTogcm93W2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKV0gfSB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXSA9IHsgdGV4dDogeyB0ZXh0OiByb3dbY29sdW1uLmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV0sIHZhbHVlOiByb3dbY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpXSB9IH07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJlcykge1xuICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddID0geyAuLi5yb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXSwgdGV4dDogeyB0ZXh0OiByZXNbY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpXSwgdmFsdWU6IHJlc1tjb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCldIH0gfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sdW1uLm9uUmV0dXJuKSB7XG4gICAgICAgICAgY29sdW1uLm9uUmV0dXJuKHJlcywgcm93KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm93W2NvbHVtbi5maWVsZF0gIT09IG9iai5zZWxlY3Rpb24pIHtcbiAgICAgICAgICB0aGlzLmJyb3dzZXJDbG9zZUV2ZW50KHRydWUpO1xuICAgICAgICAgIGlmIChjb2x1bW4ub25DaGFuZ2UpIHtcbiAgICAgICAgICAgIGNvbHVtbi5vbkNoYW5nZShyb3cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICh7IGVycm9yIH0pID0+IHtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBzZXRGaWx0ZXJMb29rdXAoY29sdW1uOiBhbnkpIHtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLnNldExvb2tVcEZpbHRlcihjb2x1bW4sIHRoaXMuZGlhbG9nU2VydmljZSk7XG4gIH1cblxuICAvLyBzZXQgbG9va3VwIHZhbHVlIHRoYXQgZGlzcGxheSBpbiByZWFkT25seU1vZGVcbiAgc2V0TG9va3VwUmVhZE9ubHlWYWx1ZShyb3csIGNvbHVtbikge1xuICAgIGxldCB2YWx1ZSA9ICcnO1xuICAgIGlmICh0eXBlb2YgKHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy50ZXh0KSA9PT0gXCJvYmplY3RcIiAmJiByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8udGV4dCAmJiAocm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LnRleHQpPy5oYXNPd25Qcm9wZXJ0eSgndGV4dCcpKSB7XG4gICAgICB2YWx1ZSA9IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy50ZXh0LnRleHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gcm93W2NvbHVtbi5maWVsZF07XG4gICAgICBpZiAoY29sdW1uLmRpc3BsYXlGaWVsZCkge1xuICAgICAgICB2YWx1ZSA9IHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gcm93W2NvbHVtbi5maWVsZF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vIENoZWNrIGNhbGVuZGFyIHZhbHVlIGlzIGNoYW5nZWQgb3Igbm90XG4gIGNhbGVuZGFyQ2hhbmdlRXZlbnQoY29sdW1uOiBhbnksIHJvdzogYW55KSB7XG4gICAgbGV0IHZhbHVlQ2hhbmdlOiBib29sZWFuID0gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgY29sdW1uLnRpbWVPbmx5ICYmXG4gICAgICB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShyb3dbY29sdW1uLmZpZWxkXSwgJ2hoOm1tIGEnKSAhPT1cbiAgICAgIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHRoaXMuY2FsZW5kYXJQcmV2aW91c1ZhbHVlLCAnaGg6bW0gYScpXG4gICAgKSB7XG4gICAgICB2YWx1ZUNoYW5nZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGNvbHVtbi5zaG93VGltZSAmJlxuICAgICAgdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0ocm93W2NvbHVtbi5maWVsZF0sICd5eXl5LU1NLWRkIGhoOm1tJykgIT09XG4gICAgICB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh0aGlzLmNhbGVuZGFyUHJldmlvdXNWYWx1ZSwgJ3l5eXktTU0tZGQgaGg6bW0nKVxuICAgICkge1xuICAgICAgdmFsdWVDaGFuZ2UgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShyb3dbY29sdW1uLmZpZWxkXSwgJ3l5eXktTU0tZGQnKSAhPT1cbiAgICAgIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHRoaXMuY2FsZW5kYXJQcmV2aW91c1ZhbHVlLCAneXl5eS1NTS1kZCcpXG4gICAgKSB7XG4gICAgICB2YWx1ZUNoYW5nZSA9IHRydWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZUNoYW5nZSkge1xuICAgICAgdGhpcy5icm93c2VyQ2xvc2VFdmVudCh0cnVlKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVSb3dzRGF0YUNvcHkgPSBmYWxzZTtcbiAgICAgIHRoaXMucm93VXBkYXRlQ2hhbmdlID0gdHJ1ZTtcblxuICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnJvd3NDaGFuZ2UuZW1pdCh0aGlzLnJvd3NEYXRhKTtcbiAgICAgIH0pO1xuICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyAgIHRoaXMucm93c0NoYW5nZS5lbWl0KHRoaXMucm93c0RhdGEpO1xuICAgICAgLy8gfSwgMjUwKTtcbiAgICAgIGlmIChjb2x1bW4ub25DaGFuZ2UpIHtcbiAgICAgICAgY29sdW1uLm9uQ2hhbmdlKHJvdyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2FsZW5kYXJQcmV2aW91c1ZhbHVlID0gJyc7XG4gIH1cblxuICBzZXRBdXRvQ29tcGxldGV2YWx1ZU9uVHlwZShjb2x1bW46IGFueSwgcm93OiBhbnksIGV2ZW50OiBhbnkgPSBbXSkge1xuICAgIGxldCB2YWx1ZSA9IGV2ZW50Py50YXJnZXQ/LnZhbHVlO1xuICAgIGxldCBmaWVsZCA9IGNvbHVtbj8uZmllbGQ/LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuQVVUT0NPTVBMRVRFICYmIHZhbHVlICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3QgdmFsdWVLZXkgPSBjb2x1bW4ub3B0aW9uVmFsdWUgPyBjb2x1bW4ub3B0aW9uVmFsdWUgOiBmaWVsZDtcbiAgICAgIGNvbnN0IGxhYmVsS2V5ID0gY29sdW1uLm9wdGlvbkxhYmVsID8gY29sdW1uLm9wdGlvbkxhYmVsIDogY29sdW1uLmRpc3BsYXlGaWVsZCA/IGNvbHVtbi5kaXNwbGF5RmllbGQgOiBmaWVsZDtcbiAgICAgIGlmKHJvd1tmaWVsZF0/Lmxlbmd0aCA+IDApe1xuICAgICAgICBjb25zdCBhbHJlYWR5RXhpc3QgPSByb3dbZmllbGRdPy5maW5kKChyb3dJbmZvKT0+IHJvd0luZm9bZmllbGRdID09PSB2YWx1ZSk7XG4gICAgICAgIGlmKCFhbHJlYWR5RXhpc3Qpe1xuICAgICAgICAgIHJvd1tmaWVsZF0gPSBbLi4ucm93W2ZpZWxkXSwgeyBbbGFiZWxLZXk/LnRvTG93ZXJDYXNlKCldOiB2YWx1ZSwgW3ZhbHVlS2V5Py50b0xvd2VyQ2FzZSgpXTogdmFsdWUsIFtmaWVsZD8udG9Mb3dlckNhc2UoKV06IHZhbHVlIH1dO1xuICAgICAgICB9XG4gICAgICB9ZWxzZXtcbiAgICAgICAgcm93W2ZpZWxkXSA9IFt7IFtsYWJlbEtleT8udG9Mb3dlckNhc2UoKV06IHZhbHVlLCBbdmFsdWVLZXk/LnRvTG93ZXJDYXNlKCldOiB2YWx1ZSwgW2ZpZWxkPy50b0xvd2VyQ2FzZSgpXTogdmFsdWUgfV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmKGV2ZW50Py50YXJnZXQ/LnZhbHVlKXtcbiAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnO1xuICAgIH1cbiAgICBcbiAgfVxuICBcbiAgb25BdXRvQ29tcGxldGVLZXlFbnRlckV2ZW50KGUsIGNvbHVtbiwgcm93KSB7XG4gICAgaWYgKGNvbHVtbi50eXBlID09IEVHcmlkQ29sdW1uVHlwZS5BVVRPQ09NUExFVEUpIHtcbiAgICAgIGlmIChjb2x1bW4uYWxsb3dBdXRvQ29tcGxldGVTYXZlICYmIGUudGFyZ2V0LnZhbHVlICYmICFjb2x1bW4uZGF0YT8ubGVuZ3RoKSB7XG4gICAgICAgIC8vL2NoZWNrIHRoZSBjb3JyZWN0IGZvcm1hdCBpZiBkYXRhLmNvbnRhaW5zIGN1eiBpdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHdpdGggb2JqZWN0cy5cbiAgICAgICAgaWYgKGNvbmZpcm0oYERvIHlvdSB3YW50IHRvIGFkZCAke2UudGFyZ2V0LnZhbHVlfSB0byB0aGUgc2VsZWN0aW9uP2ApKSB7XG4gICAgICAgICAgaWYgKGNvbHVtbi51bmlxdWVLZXkpIHtcbiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gdGhpcy5ncmlkU2VydmljZVxuICAgICAgICAgICAgICAuYWRkQXV0b0NvbXBsZXRlVmFsdWUoY29sdW1uLnVuaXF1ZUtleSwgZS50YXJnZXQudmFsdWUsIGNvbHVtbiwgcm93KVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLm9uUmV0dXJuKSB7XG4gICAgICAgICAgICAgICAgICBjb2x1bW4ub25SZXR1cm4oZS50YXJnZXQudmFsdWUsIGNvbHVtbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgb25Gb2N1c0V2ZW50KGNvbHVtbjogSUdyaWRDb2x1bW4sIHJvdzogYW55KSB7XG4gICAgdGhpcy5udW1lcmljVmFsdWVbY29sdW1uLmZpZWxkXSA9IHJvd1tjb2x1bW4uZmllbGRdXG4gIH1cblxuICBvbkZvY3VzT3V0RXZlbnQoY29sdW1uOiBJR3JpZENvbHVtbiwgcm93OiBhbnksIGV2ZW50OiBhbnkgPScnKSB7XG4gICAgdGhpcy5zZXRBdXRvQ29tcGxldGV2YWx1ZU9uVHlwZShjb2x1bW4sIHJvdywgZXZlbnQpXG4gICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTlVNRVJJQyAmJiB0aGlzLm51bWVyaWNWYWx1ZVtjb2x1bW4uZmllbGRdICE9PSByb3dbY29sdW1uLmZpZWxkXSkge1xuICAgICAgdGhpcy5vbkNoYW5nZUV2ZW50KGNvbHVtbiwgcm93KVxuICAgIH1cbiAgICBpZiAoY29sdW1uLnR5cGUgIT09IEVHcmlkQ29sdW1uVHlwZS5BVVRPQ09NUExFVEUgfHwgKCFjb2x1bW4uYWxsb3dBdXRvQ29tcGxldGVTYXZlKSkge1xuICAgICAgdGhpcy5ncmlkU2VydmljZS5jaGVja1ZhbGlkaXR5KFtjb2x1bW5dLCByb3cpO1xuICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuREFURSkge1xuICAgICAgICB0aGlzLmNhbGVuZGFyQ2hhbmdlRXZlbnQoY29sdW1uLCByb3cpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbHVtbi5vbkZvY3VzT3V0KSB7XG4gICAgICAgIGNvbHVtbi5vbkZvY3VzT3V0KHJvdyk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBjb2x1bW4ub25SZXR1cm4gJiZcbiAgICAgICAgY29sdW1uLnR5cGUgIT09IEVHcmlkQ29sdW1uVHlwZS5MT09LVVBfSU5QVVRcbiAgICAgICkge1xuICAgICAgICBjb2x1bW4ub25SZXR1cm4ocm93KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pc0NoZWNrQm94Q2hhbmdlRXZlbnRDYWxsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLnJvd1VwZGF0ZSA9IGZhbHNlO1xuICB9XG5cbiAgc2V0UmVwb3J0TmFtZShjb2x1bW46IElHcmlkUmVwb3J0QnRuLCByb3c6IGFueSkge1xuICAgIGxldCByZXBvcnQ6IGFueSA9ICcnO1xuICAgIGlmIChjb2x1bW4ucmVwb3J0SWQpIHtcbiAgICAgIHJlcG9ydCA9IGNvbHVtbi5yZXBvcnRJZDtcbiAgICB9IGVsc2UgaWYgKHJvd1tjb2x1bW4/LmxhYmVsPy50b0xvd2VyQ2FzZSgpICsgJ19vYmonXSAmJiByb3dbY29sdW1uPy5sYWJlbD8udG9Mb3dlckNhc2UoKSArICdfb2JqJ10/LnJlcG9ydE5hbWUpIHtcbiAgICAgIHJlcG9ydCA9IHJvd1tjb2x1bW4/LmxhYmVsPy50b0xvd2VyQ2FzZSgpICsgJ19vYmonXT8ucmVwb3J0TmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVwb3J0ID0gY29sdW1uLnJlcG9ydE5hbWU7XG4gICAgfVxuICAgIHJldHVybiByZXBvcnQ7XG4gIH1cblxuICBzZXRSZXBvcnRQYXJhbXMoY29sdW1uOiBJR3JpZFJlcG9ydEJ0biwgcm93OiBhbnkpIHtcbiAgICBsZXQgcmVwb3J0UGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgIGlmIChyb3dbY29sdW1uPy5sYWJlbD8udG9Mb3dlckNhc2UoKSArICdfb2JqJ10gJiYgcm93W2NvbHVtbj8ubGFiZWw/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5yZXBvcnRQYXJhbSkge1xuICAgICAgcmVwb3J0UGFyYW1zID0gcm93W2NvbHVtbj8ubGFiZWw/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5yZXBvcnRQYXJhbTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVwb3J0UGFyYW1zID0gY29sdW1uLnBhcmFtcztcbiAgICB9XG4gICAgcmV0dXJuIHJlcG9ydFBhcmFtcztcbiAgfVxuXG4gIHNldEZpbHRlckZvY3VzT3V0KGNvbDogYW55LCBmaWx0ZXI/OiBhbnksIGV2ZW50PzogYW55KSB7XG4gICAgdGhpcy5zZXRHcmlkRmlsdGVyKGNvbCwgZmlsdGVyLCBldmVudCk7XG4gIH1cbiAgc2V0R3JpZEZpbHRlcihjb2w6IElHcmlkQ29sdW1uLCBmaWx0ZXI/OiBhbnksIGV2ZW50PzogYW55KSB7XG4gICAgdGhpcy5ncmlkRmlsdGVyT2JqID0geyBjb2x1bW46IGNvbCwgZmlsdGVyOiBmaWx0ZXIsIGV2ZW50OiBldmVudCB9O1xuICAgIGNvbnN0IG5ld0NvbHVtbjogYW55ID0geyAuLi5jb2wgfTtcbiAgICAvL2NoYW5nZSBmaWx0ZXIgY2FsZW5kYXIgZm9ybWF0XG4gICAgaWYgKG5ld0NvbHVtbi50eXBlID09PSAnZGF0ZScgJiYgbmV3Q29sdW1uLmZpbHRlclZhbHVlICYmIG5ld0NvbHVtbi5maWx0ZXI/LnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5DQUxFTkRBUikge1xuICAgICAgbmV3Q29sdW1uLmZpbHRlclZhbHVlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oXG4gICAgICAgIGNvbC5maWx0ZXJWYWx1ZS50b1N0cmluZygpLnRyaW0oKSxcbiAgICAgICAgJ3l5eXktTU0tZGQnXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlck9iaihuZXdDb2x1bW4pO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBseUZpbHRlcicsIEpTT04uc3RyaW5naWZ5KGZhbHNlKSk7XG4gIH1cblxuICBmaWx0ZXJPYmooY29sOiBhbnkpIHtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICBmaWVsZDogY29sLmZpZWxkLFxuICAgICAgbWF0Y2hNb2RlOiBjb2wubWF0Y2hNb2RlID8gY29sLm1hdGNoTW9kZSA6ICdzdGFydHNXaXRoJyxcbiAgICAgIG9wZXJhdG9yOiBjb2wub3BlcmF0b3IgPyBjb2wub3BlcmF0b3IgOiAnYW5kJyxcbiAgICAgIHRhYmxlQWxpYXM6IGNvbC50YWJsZUFsaWFzID8gY29sLnRhYmxlQWxpYXMgOiAnJyxcbiAgICAgIHZhbHVlOiBjb2wudHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLk1VTFRJU0VMRUNUID8gY29sLmZpbHRlclZhbHVlLnRvU3RyaW5nKCkgOiBjb2wuZmlsdGVyVmFsdWUsXG4gICAgfTtcbiAgICB0aGlzLmdsb2JhbEZpbHRlcnNBcnJheS5wdXNoKG9iaik7XG4gIH1cblxuICBhcHBseUVudGVyRXZlbnQoZmlsdGVyOiBhbnksIGV2ZW50OiBhbnksIGNvbHVtbjogYW55KSB7XG4gICAgdGhpcy5ncmlkU2VydmljZS51c2VyU2VhcmNoZWQ9dHJ1ZTtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgPSB0cnVlO1xuICAgIHRoaXMucm93VXBkYXRlQ2hhbmdlID0gZmFsc2U7XG4gICAgdGhpcy5hdXRvTG9hZERhdGEgPSB0cnVlO1xuICAgIC8vdGhpcy5sb2FkaW5nPXRydWU7XG4gICAgdGhpcy5vbkFwcGx5RmlsdGVyLmVtaXQoKTtcbiAgICB0aGlzLmZpbHRlck9iaihjb2x1bW4pO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBseUZpbHRlcicsIEpTT04uc3RyaW5naWZ5KHRydWUpKTtcbiAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5NVUxUSVNFTEVDVCkge1xuICAgICAgZmlsdGVyKGNvbHVtbj8uZmlsdGVyVmFsdWU/LnRvU3RyaW5nKCkpXG4gICAgfSBlbHNlIGlmIChjb2x1bW4/LmZpbHRlcj8udHlwZSA9PT0gdGhpcy5kcm9wRG93bkZpbHRlcj8uY29sdW1uPy5maWx0ZXI/LnR5cGUpIHtcbiAgICAgIHRoaXMuZHJvcERvd25GaWx0ZXIuZmlsdGVyKHRoaXMuZHJvcERvd25GaWx0ZXIuZXZlbnQudGFyZ2V0KTtcbiAgICB9IGVsc2UgaWYgKGZpbHRlciAmJiBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkJPT0xFQU4gJiYgY29sdW1uPy5maWx0ZXI/LnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5DSEVDS0JPWCAmJiBjb2x1bW4uZmlsdGVyaW5nICE9PSBmYWxzZSkge1xuICAgICAgZmlsdGVyKGV2ZW50Py5jaGVja2VkKTtcbiAgICB9IGVsc2UgaWYgKGZpbHRlcikge1xuICAgICAgZmlsdGVyKGV2ZW50Py50YXJnZXQ/LnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVOdWxsQ2FsZW5kYXIoY29sdW1uOiBJR3JpZENvbHVtbiwgZmlsdGVyOiBhbnksIGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoY29sdW1uLmZpbHRlclZhbHVlID09PSBudWxsKSB7XG4gICAgICB0aGlzLnJlbW92ZU51bGxGaWx0ZXJzKGNvbHVtbik7XG4gICAgICB0aGlzLnNldEZpbHRlckZvY3VzT3V0KGNvbHVtbiwgZmlsdGVyLCBldmVudCk7XG4gICAgfVxuICB9XG5cbiAgYmFja3NwYWNlRXZlbnQoZXZlbnQ6IGFueSwgY29sdW1uOiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICBldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnICYmXG4gICAgICAoY29sdW1uLmZpbHRlclZhbHVlPy50b1N0cmluZygpLmxlbmd0aCA9PT0gMSB8fFxuICAgICAgICBjb2x1bW4uZmlsdGVyVmFsdWU/LnRvU3RyaW5nKCkgPT09ICcnIHx8XG4gICAgICAgIGNvbHVtbi5maWx0ZXJWYWx1ZSA9PT0gbnVsbClcbiAgICApIHtcbiAgICAgIHRoaXMucmVtb3ZlTnVsbEZpbHRlcnMoY29sdW1uKTtcbiAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuREFURSAmJiBjb2x1bW4uZmlsdGVyVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMucmVtb3ZlTnVsbEZpbHRlcnMoY29sdW1uKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVOdWxsRmlsdGVycyhjb2x1bW46IGFueSkge1xuICAgIGlmICh0aGlzLmdsb2JhbEZpbHRlcnNBcnJheSAmJiB0aGlzLmdsb2JhbEZpbHRlcnNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgYXJyID0gWy4uLnRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5XTtcbiAgICAgIGxldCBpbmRleCA9IGFyci5maW5kSW5kZXgoKGkpID0+IGkuZmllbGQgPT09IGNvbHVtbi5maWVsZCk7XG4gICAgICBhcnIuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5ID0gYXJyO1xuICAgIH1cbiAgICBsZXQgaW5kZXggPSB0aGlzLnNlcnZlckZpbHRlcnMuZmlsdGVycy5maW5kSW5kZXgoKGkpID0+IHtpLmZpZWxkID09PSBjb2x1bW4uZmllbGR9KVxuICAgIHRoaXMuc2VydmVyRmlsdGVycy5maWx0ZXJzPy5zcGxpY2UoaW5kZXgsMSlcbiAgfVxuXG4gIC8vIFJlbW92aW5nIEhlYWRlciBGaWx0ZXIgVmFsdWUgdXNpbmcgQmFja3NwYWNlIGtleSBFdmVudCBvciBEZWxldGUga2V5IEV2ZW50LlxuICByZW1vdmluZ0ZpbHRlcnMoZXZlbnQ6IGFueSwgY29sdW1uOiBJR3JpZENvbHVtbikge1xuICAgIGlmIChcbiAgICAgIChldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnIHx8IGV2ZW50LmtleSA9PT0gJ0RlbGV0ZScpICYmXG4gICAgICBjb2x1bW4uZmlsdGVyVmFsdWU/LnRvU3RyaW5nKCkubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICBsZXQgc2VhcmNoRmlsdGVycztcbiAgICAgIGlmICghdGhpcy5zb2Z0Q2FjaGluZyAmJiB0aGlzLmNvbXBvbmVudFRhYmxlUmVmPy5pZCkge1xuICAgICAgICBzZWFyY2hGaWx0ZXJzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnU2V0RmlsdGVycy0nICsgdGhpcy5jb21wb25lbnRUYWJsZVJlZj8uaWQgKyB0aGlzLmN1cnJlbnRVcmwpIGFzIGFueSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkKSB7XG4gICAgICAgIHNlYXJjaEZpbHRlcnMgPSB0aGlzLmdyaWRTZXJ2aWNlLnNvZnRDYWNoaW5nRmlsdGVyc1t0aGlzLmNvbXBvbmVudFRhYmxlUmVmPy5pZCArIHRoaXMuY3VycmVudFVybF07XG4gICAgICB9XG4gICAgICBpZiAoc2VhcmNoRmlsdGVycyAmJiBzZWFyY2hGaWx0ZXJzLmZpbHRlcnMpIHtcbiAgICAgICAgaWYgKHNlYXJjaEZpbHRlcnMuZmlsdGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbGV0IGluZGV4ID0gc2VhcmNoRmlsdGVycy5maWx0ZXJzLmZpbmRJbmRleChcbiAgICAgICAgICAgICh4OiBhbnkpID0+IHguZmllbGQgPT09IGNvbHVtbi5maWVsZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGlmIChzZWFyY2hGaWx0ZXJzLmZpbHRlcnMubGVuZ3RoID09PSAxICYmIHRoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkKSB7XG4gICAgICAgICAgICAgIHRoaXMuZ3JpZFNlcnZpY2Uuc29mdENhY2hpbmdGaWx0ZXJzW3RoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkICsgdGhpcy5jdXJyZW50VXJsXSA9IFtdO1xuICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnU2V0RmlsdGVycy0nICsgdGhpcy5jb21wb25lbnRUYWJsZVJlZj8uaWQgKyB0aGlzLmN1cnJlbnRVcmwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VhcmNoRmlsdGVycy5maWx0ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgIGlmICghdGhpcy5zb2Z0Q2FjaGluZyAmJiB0aGlzLmNvbXBvbmVudFRhYmxlUmVmPy5pZCkge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdTZXRGaWx0ZXJzLScgKyB0aGlzLmNvbXBvbmVudFRhYmxlUmVmPy5pZCArIHRoaXMuY3VycmVudFVybCwgSlNPTi5zdHJpbmdpZnkoc2VhcmNoRmlsdGVycykpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkU2VydmljZS5zb2Z0Q2FjaGluZ0ZpbHRlcnNbdGhpcy5jb21wb25lbnRUYWJsZVJlZj8uaWQgKyB0aGlzLmN1cnJlbnRVcmxdID0gc2VhcmNoRmlsdGVycztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBDbGljayBCdXR0b24gRXZlbnQgb24gR3JpZC5cbiAgb25DbGlja0J1dHRvbihjb2x1bW46IGFueSwgcm93OiBhbnkpIHtcbiAgICB0aGlzLm9wZW5HcmlkRGlhbG9nKGNvbHVtbiwgcm93KTtcbiAgfVxuXG4gIC8vIEludm9rZSBvbkNsaWNrIEV2ZW50LlxuICBvbkNsaWNrRXZlbnQoY29sdW1uOiBhbnksIHJvdzogYW55KSB7XG4gICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTElOSyAmJiAoY29sdW1uLmVkaXRMaW5rID09PSBmYWxzZSB8fCBjb2x1bW4uZWRpdExpbmsgPT09IHVuZGVmaW5lZCkgJiYgY29sdW1uLmVkaXRhYmxlICE9PSB0cnVlICYmIGNvbHVtbi5kaXNhYmxlZCAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5vbkNsaWNrRXZlbnRUcmlnZ2VyZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBpZihjb2x1bW4udHlwZT09PUVHcmlkQ29sdW1uVHlwZS5ESUFMT0cgJiYgcm93W2NvbHVtbi5maWVsZF0pe1xuICAgIC8vICAgdGhpcy5vcGVuR3JpZERpYWxvZyhjb2x1bW4scm93KVxuICAgIC8vIH1cbiAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EQVRFICYmIHJvd1tjb2x1bW4uZmllbGRdKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyUHJldmlvdXNWYWx1ZSA9IHJvd1tjb2x1bW4uZmllbGRdO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAhcm93W2NvbHVtbi5maWVsZF0gJiZcbiAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuREFURSAmJlxuICAgICAgKGNvbHVtbi5zaG93VGltZSB8fCBjb2x1bW4udGltZU9ubHkpICYmXG4gICAgICBjb2x1bW4ubWludXRlc0ludGVydmFsXG4gICAgKSB7XG4gICAgICB0aGlzLmRlZmF1bHREYXRlID0gbmV3IERhdGUoc2V0TWludXRlc0ludGVydmFsKG5ldyBEYXRlKCkpKTtcbiAgICB9XG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4ub25DbGljayAmJiBjb2x1bW4uZGlzYWJsZWQgIT09IHRydWUgJiYgKHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5hY3Rpb24/LmRpc2FibGVkICE9PSB0cnVlIHx8ICByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlzYWJsZWQgIT09IHRydWUpKSB7XG4gICAgICBjb2x1bW4ub25DbGljayhyb3cpO1xuICAgIH1cbiAgfVxuXG4gIHNldE11bHRpU2VsZWN0VmFsdWUoY29sdW1uLCByb3cpIHtcbiAgICBpZiAocm93W2NvbHVtbi5maWVsZF0gJiYgIUFycmF5LmlzQXJyYXkocm93W2NvbHVtbi5maWVsZF0pKSB7XG4gICAgICBpZiAodHlwZW9mIChyb3dbY29sdW1uLmZpZWxkXSkgPT09IFwic3RyaW5nXCIgJiYgIXJvd1tjb2x1bW4uZmllbGRdPy5pbmNsdWRlcygnLCcpKSB7XG4gICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gW3Jvd1tjb2x1bW4uZmllbGRdXTtcbiAgICAgIH0gZWxzZSBpZiAocm93W2NvbHVtbi5maWVsZF0/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcsJykpIHtcbiAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPSByb3dbY29sdW1uLmZpZWxkXT8uc3BsaXQoJywnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd1tjb2x1bW4uZmllbGRdO1xuICB9XG5cbiAgLy8gc2V0IHRoZSBzZWxlY3QgdmFsdWUgb2YgbXVsdGktc2VsZWN0XG4gIHNob3dPcHRpb24oY29sdW1uLCByb3cpIHtcbiAgICByb3dbY29sdW1uLmZpZWxkXSA9IHRoaXMuc2V0TXVsdGlTZWxlY3RWYWx1ZShjb2x1bW4sIHJvdyk7XG4gIH1cblxuICBvbkNsZWFyVmFsdWUoY29sdW1uLCByb3cpIHtcbiAgICBpZiAoY29sdW1uPy50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRFJPUERPV04gJiYgIXJvd1tjb2x1bW4uZmllbGRdKSB7XG4gICAgICByb3dbY29sdW1uLmZpZWxkXSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gSW52b2tlIG9uQ2hhbmdlIEV2ZW50XG4gIG9uQ2hhbmdlRXZlbnQoY29sdW1uOiBhbnksIHJvdzogYW55KSB7XG4gICAgLy8gc2V0IGRyb3Bkb3duIGRpc3BsYXlGaWVsZCB2YWx1ZSBiYXNlIG9uIG9wdGlvbkxhYmVsICYgb3B0aW9uVmFsdWUuXG4gICAgdGhpcy5ncmlkVmFsaWRhdGlvbihjb2x1bW4sIHJvdywgdHJ1ZSlcbiAgICB0aGlzLmRpc3BsYXlGaWVsZERyb3Bkb3duVmFsdWUoY29sdW1uLCByb3cpO1xuICAgIHRoaXMub25DbGVhclZhbHVlKGNvbHVtbiwgcm93KTtcbiAgICB0aGlzLmJyb3dzZXJDbG9zZUV2ZW50KHRydWUpO1xuICAgIHRoaXMucm93VXBkYXRlQ2hhbmdlID0gdHJ1ZTtcbiAgICBpZiAoY29sdW1uLm9uQ2hhbmdlKSB7XG4gICAgICBjb2x1bW4ub25DaGFuZ2Uocm93KTtcbiAgICB9XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub25DbGlja0V2ZW50VHJpZ2dlcmVkID09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLnJvd3NDaGFuZ2UuZW1pdCh0aGlzLnJvd3NEYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLnNldERyb3Bkb3duZGF0YVZhbHVlID0gZmFsc2VcbiAgICB0aGlzLmlzQ2hlY2tCb3hDaGFuZ2VFdmVudENhbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuZ3JpZFNlcnZpY2Uucm93VXBkYXRlID0gZmFsc2U7XG4gICAgdGhpcy5nZW5lcmF0ZVJvd3NEYXRhQ29weSA9IGZhbHNlXG4gICAgaWYgKGNvbHVtbi5hZ2dyZWdhdGUgJiYgY29sdW1uLmFnZ3JlZ2F0ZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmFnZ3JlZ2F0ZUZvb3RlciA9IHRydWU7XG4gICAgICB0aGlzLnNldEFnZ3JlZ2F0ZVRleHQoY29sdW1uKTtcbiAgICB9XG4gIH1cblxuICBjaGVja0JveENoYW5nZUV2ZW50KGV2ZW50OiBhbnksIGNvbHVtbjogSUdyaWRDb2x1bW4sIHJvdykge1xuICAgIHJvd1tjb2x1bW4uZmllbGRdID0gZXZlbnQ7XG4gICAgaWYgKHRoaXMucm93c0NoYW5nZS5vYnNlcnZlcnM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5pc0NoZWNrQm94Q2hhbmdlRXZlbnRDYWxsZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmdyaWRTZXJ2aWNlLnJvd1VwZGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuZ2VuZXJhdGVSb3dzRGF0YUNvcHkgPSBmYWxzZVxuICAgIHRoaXMucm93VXBkYXRlQ2hhbmdlID0gdHJ1ZVxuICAgIHRoaXMucm93c0NoYW5nZS5lbWl0KHRoaXMucm93c0RhdGEpO1xuICB9XG5cbiAgLy8gc2V0IGRyb3Bkb3duIGRpc3BsYXlGaWVsZCB2YWx1ZSBiYXNlIG9uIG9wdGlvbkxhYmVsICYgb3B0aW9uVmFsdWUuXG4gIGRpc3BsYXlGaWVsZERyb3Bkb3duVmFsdWUoY29sdW1uOiBhbnksIHJvdzogYW55KSB7XG4gICAgaWYgKFxuICAgICAgY29sdW1uPy50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRFJPUERPV04gJiZcbiAgICAgIGNvbHVtbi5kaXNwbGF5RmllbGQgJiZcbiAgICAgIGNvbHVtbi5kaXNwbGF5RmllbGQ/Lmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGNvbnN0IGtleTogYW55ID0gT2JqZWN0LmtleXMocm93KT8uZmluZChcbiAgICAgICAgKHJvd0luZm8pID0+XG4gICAgICAgICAgcm93SW5mbz8udG9Mb3dlckNhc2UoKSA9PT0gY29sdW1uLmRpc3BsYXlGaWVsZC50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgICAgY29uc3QgZGlzcGxheUZpZWxkVmFsdWUgPSBjb2x1bW4uZGF0YS5maW5kKFxuICAgICAgICAocmVjb3JkOiBhbnkpID0+XG4gICAgICAgICAgcmVjb3JkW2NvbHVtbi5vcHRpb25WYWx1ZV0/LnRvU3RyaW5nKCkgPT09XG4gICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0/LnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgICBpZiAoa2V5ICYmIGRpc3BsYXlGaWVsZFZhbHVlKSB7XG4gICAgICAgIHJvd1trZXldID0gZGlzcGxheUZpZWxkVmFsdWVbY29sdW1uLm9wdGlvbkxhYmVsXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBZGQgYXV0b1NlYXJjaCBvbiBHcmlkLlxuICBhdXRvU2VhcmNoKGV2ZW50OiBhbnksIGNvbHVtbjogYW55LCByb3c6IGFueSkge1xuICAgIGlmIChldmVudCAmJiBjb2x1bW4gJiYgcm93KSB7XG4gICAgICBjb2x1bW4ub25SZXR1cm4oZXZlbnQucXVlcnksIGNvbHVtbiwgcm93KTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWZyZXNoIGdyaWRcbiAgcmVmcmVzaEdyaWQoKSB7XG4gICAgdGhpcy5yZWxvYWRQYWdlID0gaW50ZXJ2YWwodGhpcy5zZXRHcmlkUmVmcmVzaFRpbWUpLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZ3JpZGZpbHRlciA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5ncmlkZmlsdGVyID0geyBmaWx0ZXJzOiBbXSwgc29ydHM6IFtdIH07XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZXRHcmlkUmVmcmVzaFRpbWUpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVTZXJ2ZXJTaWRlRXZlbnRzKHRoaXMuZ3JpZGZpbHRlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBSZW1vdmUgRmlsdGVyVmFsdWVzXG4gIGNsZWFyZ3JpZEZpbHRlcnNWYWx1ZSgpIHtcbiAgICBjb25zdCBnbG9iYWxGaWx0ZXJDbGVhclZhbHVlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAnY2xlYXJHbG9iYWxGaWx0ZXJCdG4nXG4gICAgKTtcbiAgICBpZiAoZ2xvYmFsRmlsdGVyQ2xlYXJWYWx1ZUJ0bikge1xuICAgICAgZ2xvYmFsRmlsdGVyQ2xlYXJWYWx1ZUJ0bi5jbGljaygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RlZENvbHVtbnMgJiYgdGhpcy5zZWxlY3RlZENvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZXJ2ZXJGaWx0ZXJzLmZpbHRlcnMgPSBbXTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICBjb2wuZmlsdGVyVmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbHRlck9iaihjb2wpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZWRpdEFsbFJvd3NBdE9uY2UoKSB7XG4gICAgaWYgKHRoaXMuZWRpdFJvd1Blcm1pc3Npb24pIHtcbiAgICAgIGlmICh0aGlzLmdldENsYXNzRm9yRWRpdEFsbFJvd3MoJ2VkaXRSb3cnKSkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkJPT0xFQU4gJiYgKGNvbHVtbi5maWx0ZXJpbmcgPT09IHRydWUgfHwgY29sdW1uLmZpbHRlcmluZyA9PT0gdW5kZWZpbmVkKSkpIHtcbiAgICAgICAgICB0aGlzLmVkaXRBbGxSZWNvcmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc29ydERpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzYXZlQWxsUm93c0F0T25jZSgpIHtcbiAgICB0aGlzLmdldENsYXNzRm9yRWRpdEFsbFJvd3MoJ3NhdmVSb3cnKTtcbiAgfVxuXG4gIC8vIHJlc2V0IHRoZSBncmlkIHJvd3NWYWx1ZSB0byBvcmlnbmFsIHZhbHVlc1xuICBjYW5jZWxBbGxSb3dzQXRPbmNlKCkge1xuICAgIHRoaXMucm93c0RhdGEgPSBbLi4udGhpcy5yb3dzRGF0YUNvcHldO1xuICAgIHRoaXMucm93c0RhdGFDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnJvd3NEYXRhKSk7XG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnM/LmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuREFURSkge1xuICAgICAgICB0aGlzLnJvd3NEYXRhPy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICBpZiAocm93W2NvbHVtbi5maWVsZF0pIHtcbiAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gbmV3IERhdGUocm93W2NvbHVtbi5maWVsZF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgIH0pO1xuICAgIGlmICh0aGlzLmNvbHVtbnM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICBpZiAoY29sdW1uLmFnZ3JlZ2F0ZSAmJiBjb2x1bW4uYWdncmVnYXRlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmFnZ3JlZ2F0ZUZvb3RlciA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zZXRBZ2dyZWdhdGVUZXh0KGNvbHVtbik7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHRoaXMub25DYW5jZWxBbGxSb3dzLmVtaXQodGhpcy5yb3dzRGF0YSk7XG4gIH1cbiAgZ2V0Q2xhc3NGb3JFZGl0QWxsUm93cyhjbGFzc05hbWU6IHN0cmluZyA9ICcnKSB7XG4gICAgbGV0IHN1Y2Nlc3M6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBpZiAoY2xhc3NOYW1lID09PSAnZWRpdFJvdycpIHtcbiAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICB0aGlzLm9uUm93RWRpdEluaXQocm93KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGdldEJ0bnM6IGFueSA9IHRoaXMuZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudD8uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWUpO1xuICAgIGlmIChnZXRCdG5zICYmIGdldEJ0bnMubGVuZ3RoID4gMCkge1xuICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgICBpZiAoY2xhc3NOYW1lID09PSAnc2F2ZVJvdycpIHtcbiAgICAgICAgdGhpcy5lZGl0QWxsUmVjb3JkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2F2ZUFsbFJlY29yZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJlY29yZHMkID0gW107XG4gICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBnZXRCdG5zKSB7XG4gICAgICAgICAgICBjb25zdCByb3dTYXZlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICBpdGVtLmNsaWNrKCk7XG4gICAgICAgICAgICAgIHJlc29sdmUoaXRlbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlY29yZHMkLnB1c2gocm93U2F2ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFByb21pc2UuYWxsKHJlY29yZHMkKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5vblJvd1VwZGF0ZS5lbWl0KHRoaXMuc2V0Um93c0RhdGEodGhpcy5jaGVja2xpc3QpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUm93c0RhdGFDb3B5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGhpcy5vblJvd1VwZGF0ZS5lbWl0KHRoaXMuc2F2ZVJlY29yZEFycmF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2F2ZVJlY29yZEFycmF5ID0gW107XG4gICAgICAgICAgICB0aGlzLmVkaXRBbGxSb3dzQXRPbmNlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNhdmVBbGxSZWNvcmQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSAnY2FuY2VsUm93Jykge1xuICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgZ2V0QnRucykge1xuICAgICAgICAgICAgICBpdGVtLmNsaWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzO1xuICB9XG5cbiAgLy9Gb2N1c2VkIGNhbGVuZGFyIGlucHV0IG9uIHNlbGVjdCBkYXRlXG4gIHNlbGVjdERhdGUoY29sdW1uOiBhbnkpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb2x1bW4uZmllbGQpPy5mb2N1cygpO1xuICB9XG5cbiAgLy9hcHBseSBmaWx0ZXIgb24gZ3JpZCB3aGVuIHNlYXJjaCBidG4gY2xpY2tlZFxuICBhcHBseUdyaWRGaWx0ZXJCdG4oKSB7XG4gICAgIHRoaXMuZ3JpZFNlcnZpY2UudXNlclNlYXJjaGVkPXRydWU7XG4gICAgIHRoaXMuaXNDaGVja0JveENoYW5nZUV2ZW50Q2FsbGVkID0gZmFsc2U7XG4gICAgIHRoaXMuZ3JpZFNlcnZpY2Uucm93VXBkYXRlID0gZmFsc2U7XG4gICAgIHRoaXMucm93VXBkYXRlQ2hhbmdlID0gZmFsc2U7XG4gICAgIGxldCBmaWx0ZXJJbkRpYWxvZzogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncC1kaWFsb2cnKTtcbiAgICAgbGV0IGdsb2JhbEZpbHRlckFwcGx5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZWFyY2hidG5JZCk7XG4gICAgIGlmIChmaWx0ZXJJbkRpYWxvZyAmJiBmaWx0ZXJJbkRpYWxvZy5sZW5ndGggPiAwKSB7XG4gICAgICAgY29uc3QgZ2xvYmFsU2VhcmNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZWFyY2hidG5JZCk7XG4gICAgICAgaWYgKGdsb2JhbFNlYXJjaEJ0bikge1xuICAgICAgICAgZ2xvYmFsU2VhcmNoQnRuLmNsaWNrKCk7XG4gICAgICAgfSBlbHNlIGlmICh0aGlzLmdyaWRGaWx0ZXJPYmogJiYgT2JqZWN0LmtleXModGhpcy5ncmlkRmlsdGVyT2JqKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICB0aGlzLmFwcGx5RW50ZXJFdmVudChcbiAgICAgICAgICAgdGhpcy5ncmlkRmlsdGVyT2JqLmZpbHRlcixcbiAgICAgICAgICAgdGhpcy5ncmlkRmlsdGVyT2JqLmV2ZW50LFxuICAgICAgICAgICB0aGlzLmdyaWRGaWx0ZXJPYmouY29sdW1uXG4gICAgICAgICApO1xuICAgICAgIH1cbiAgICAgfSBlbHNlIGlmIChnbG9iYWxGaWx0ZXJBcHBseUJ0bikge1xuICAgICAgIGdsb2JhbEZpbHRlckFwcGx5QnRuLmNsaWNrKCk7XG4gICAgIH0gZWxzZSB7XG4gICAgICAgaWYgKHRoaXMuZ3JpZEZpbHRlck9iaiAmJiBPYmplY3Qua2V5cyh0aGlzLmdyaWRGaWx0ZXJPYmopLmxlbmd0aCA+IDApIHtcbiAgICAgICAgIHRoaXMuYXBwbHlFbnRlckV2ZW50KFxuICAgICAgICAgICB0aGlzLmdyaWRGaWx0ZXJPYmouZmlsdGVyLFxuICAgICAgICAgICB0aGlzLmdyaWRGaWx0ZXJPYmouZXZlbnQsXG4gICAgICAgICAgIHRoaXMuZ3JpZEZpbHRlck9iai5jb2x1bW5cbiAgICAgICAgICk7XG4gICAgICAgfVxuICAgICB9XG4gICAgICB0aGlzLmNoZWNrbGlzdCA9IFtdO1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd3MgPSBbXTtcbiAgIH1cblxuICAvLyBpbnZva2UgbXVsdGlTZWxlY3Rpb24gY2xpY2sgZXZlbnRcbiAgbXVsdGlDaGVja0JveE9uY2xpY2socm93SW5mbzogYW55LCBldmVudDogYW55LCBzaW5nbGVTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICghc2luZ2xlU2VsZWN0aW9uKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dJbmZvKSAmJiByb3dJbmZvPy5sZW5ndGggPiAwICYmIGV2ZW50Py50YXJnZXQ/LmFyaWFDaGVja2VkICYmIGV2ZW50Py50YXJnZXQ/LmFyaWFDaGVja2VkPy50b1N0cmluZygpID09PSBcInRydWVcIikge1xuICAgICAgICB0aGlzLmNoZWNrbGlzdCA9IFsuLi5yb3dJbmZvXTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyb3dJbmZvKSAmJiAoZXZlbnQ/LnRhcmdldD8uYXJpYUNoZWNrZWQgPT0gbnVsbCB8fCBldmVudD8udGFyZ2V0Py5hcmlhQ2hlY2tlZD8udG9TdHJpbmcoKSA9PT0gXCJmYWxzZVwiKSkge1xuICAgICAgICB0aGlzLmNoZWNrbGlzdCA9IFtdO1xuICAgICAgfVxuICAgICAgY29uc3QgYWxyZWFkeUV4aXN0ID0gdGhpcy5jaGVja2xpc3Quc29tZSgocm93KSA9PiByb3dbdGhpcy5kYXRhS2V5XSA9PSByb3dJbmZvW3RoaXMuZGF0YUtleV0pO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJvd0luZm8pICYmIGV2ZW50Py50YXJnZXQ/LmFyaWFDaGVja2VkICYmICFhbHJlYWR5RXhpc3QpIHtcbiAgICAgICAgdGhpcy5jaGVja2xpc3QucHVzaChyb3dJbmZvKTtcbiAgICAgIH0gZWxzZSBpZiAoYWxyZWFkeUV4aXN0ICYmIChldmVudD8udGFyZ2V0Py5hcmlhQ2hlY2tlZCA9PSBudWxsIHx8IGV2ZW50Py50YXJnZXQ/LmFyaWFDaGVja2VkID09PSBcImZhbHNlXCIpKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmNoZWNrbGlzdC5maW5kSW5kZXgoKHJvdykgPT4gcm93W3RoaXMuZGF0YUtleV0gPT0gcm93SW5mb1t0aGlzLmRhdGFLZXldKTtcbiAgICAgICAgICB0aGlzLmNoZWNrbGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoZWNrbGlzdCA9IFtyb3dJbmZvXVxuICAgIH1cbiAgICB0aGlzLm9uTXVsdGlTZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLnNldFJvd3NEYXRhKHRoaXMuY2hlY2tsaXN0KSk7XG4gIH1cblxuICBzZXRSb3dzRGF0YShyb3dzRGF0YSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJvd3NEYXRhKSkge1xuICAgICAgcm93c0RhdGEuZm9yRWFjaCgocm93OiBhbnkpID0+IHtcbiAgICAgICAgcm93ID0gdGhpcy5yZW1vdmVSb3dPYmoocm93KTtcbiAgICAgICAgcm93ID0gdGhpcy5ncmlkU2VydmljZS5zZXRSb3dWYWx1ZShyb3cpO1xuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgcm93c0RhdGEgPSB0aGlzLnJlbW92ZVJvd09iaihyb3dzRGF0YSk7XG4gICAgICByb3dzRGF0YSA9IHRoaXMuZ3JpZFNlcnZpY2Uuc2V0Um93VmFsdWUocm93c0RhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gcm93c0RhdGE7XG4gIH1cblxuICByZW1vdmVSb3dPYmoocm93OiBhbnkpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocm93KTtcbiAgICBpZiAoa2V5cz8ubGVuZ3RoID4gMCkge1xuICAgICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnX29iaicpKSB7XG4gICAgICAgICAgZGVsZXRlIHJvd1trZXldO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcm93O1xuICB9XG5cbiAgYXBwbHlEcm9wZG93bkZpbHRlcihmaWx0ZXI6IGFueSwgZXZlbnQ6IGFueSkge1xuICAgIGZpbHRlcihldmVudC50YXJnZXQpO1xuICB9XG5cbiAgc2VhcmNoRHJvcGRvd25GaWx0ZXIoZmlsdGVyOiBhbnksIGV2ZW50OiBhbnksIGNvbHVtbjogYW55KSB7XG4gICAgdGhpcy5zZXRGaWx0ZXJGb2N1c091dChjb2x1bW4sIGZpbHRlciwgZXZlbnQpO1xuICAgIHRoaXMuZHJvcERvd25GaWx0ZXIgPSB7IGZpbHRlcjogZmlsdGVyLCBldmVudDogZXZlbnQsIGNvbHVtbjogY29sdW1uIH07XG4gICAgLy8gaWYgKGNvbHVtbi5hbGxvd1NlYXJjaCAhPT0gdHJ1ZSkge1xuICAgIC8vICAgdGhpcy5hcHBseURyb3Bkb3duRmlsdGVyKGZpbHRlciwgZXZlbnQpO1xuICAgIC8vIH1cbiAgfVxuXG4gIGxvb2t1cENsZWFyVmFsdWUoY29sdW1uOiBJR3JpZENvbHVtbiwgcm93PzogYW55KSB7XG4gICAgaWYgKHJvdykge1xuICAgICAgY29sdW1uLmRpc3BsYXlGaWVsZCA/IHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkXSA9ICcnIDogJydcbiAgICAgIHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy50ZXh0ID8gcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10udGV4dCA9ICcnIDogJydcbiAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbHVtbi5maWx0ZXJWYWx1ZSA9ICcnO1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmNvbHVtbnMuZmluZEluZGV4KChjb2wpID0+IGNvbC5maWVsZD8udG9Mb3dlckNhc2UoKSA9PT0gY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIHRoaXMuY29sdW1uc1tpbmRleF0uZmlsdGVyVmFsdWUgPSAnJztcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0RmlsdGVyRm9jdXNPdXQoY29sdW1uKTtcbiAgICB9XG4gICAgdGhpcy5icm93c2VyQ2xvc2VFdmVudCh0cnVlKTtcbiAgICBpZiAoY29sdW1uLm9uQ2hhbmdlKSB7XG4gICAgICBjb2x1bW4ub25DaGFuZ2Uocm93KTtcbiAgICB9XG4gIH1cblxuICAvLyBpbnZva2Ugd2hlbiBjbGljayBoZWFkZXIgY2hlY2tib3ggZmlsdGVyXG4gIGNsaWNrQ2hlY2tCb3hGaWx0ZXIoY29sdW1uOiBJR3JpZENvbHVtbikge1xuICAgIGlmICh0aGlzLmVkaXRBbGxSZWNvcmQgfHwgY29sdW1uLmFsbG93RWRpdCkge1xuICAgICAgaWYgKFxuICAgICAgICBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkJPT0xFQU5cbiAgICAgICAgJiZcbiAgICAgICAgY29sdW1uPy5maWx0ZXI/LnR5cGUgPT09ICdjaGVja2JveCcgJiYgY29sdW1uLmZpbHRlcmluZyAhPSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgaWYgKHJvd1tjb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5kaXNhYmxlZCAhPT0gdHJ1ZSAmJiAhY29sdW1uLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpXSA9IGNvbHVtbi5maWx0ZXJWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5yb3dzQ2hhbmdlLm9ic2VydmVycz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmlzQ2hlY2tCb3hDaGFuZ2VFdmVudENhbGxlZCA9IHRydWU7XG4gICAgICB0aGlzLnJvd3NDaGFuZ2UuZW1pdCh0aGlzLnJvd3NEYXRhKTtcbiAgICB9XG4gICAgdGhpcy5vbkNoZWNrQm94RmlsdGVyQ2xpY2suZW1pdChjb2x1bW4pO1xuICB9XG4gIC8vc2V0IGhlYWRlciBjaGVja2JveCB2YWx1ZSBmb3IgZ2V0dGluZyBhbGwgY29sdW1ucyBvbiBzdGF5IGFkbWluXG4gIHNldEhlYWRlckNoZWNrQm94VmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMuaXNJbmNsdWRlZEFsbENvbHVtbnMuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICAvLyBzZXQgY2FsZW5kYXIgMiBPciA0IGRpZ2l0IHllYXIgZm9ybWF0XG4gIGNhbGVuZGFySW5wdXRWYWx1ZShjb2x1bW46IGFueSwgcm93OiBhbnkpIHtcbiAgICBpZighY29sdW1uLnRpbWVPbmx5KXtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY29sdW1uLmZpZWxkICsgcm93W3RoaXMuZGF0YUtleV0pWzBdPy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsICh2YWw6IGFueSkgPT4ge1xuICAgICAgaWYgKCF2YWw/LnRhcmdldD8udmFsdWU/LmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgaWYgKHZhbD8udGFyZ2V0Py52YWx1ZT8ubGVuZ3RoID09IDggfHwgY29sdW1uPy5mb3JtYXQ/LnR5cGUgPT09IEVHcmlkRm9ybWF0VHlwZS5TSE9SVERBVEUpIHtcbiAgICAgICAgICB2YWwudGFyZ2V0LnZhbHVlID0gdmFsPy50YXJnZXQ/LnZhbHVlPy5yZXBsYWNlKC8oXFxkezJ9KShcXGR7Mn0pKFxcZHs0fSkvLCAnJDEvJDIvJDMnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWw/LnRhcmdldD8udmFsdWU/Lmxlbmd0aCA9PSA2KSB7XG4gICAgICAgICAgdmFsLnRhcmdldC52YWx1ZSA9IHZhbD8udGFyZ2V0Py52YWx1ZT8ucmVwbGFjZSgvKFxcZHsyfSkoPz1cXGQpL2csICckMS8nKTtcbiAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHZhbC50YXJnZXQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHllYXIgPSB2YWw/LnRhcmdldD8udmFsdWU/LnRvU3RyaW5nKCk/LnNwbGl0KCcvJylbMl07XG4gICAgICBpZiAoeWVhciAmJiB5ZWFyLmxlbmd0aCA9PSA0KSB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJGb3JtYXQgPSAnbW0vZGQveXknO1xuICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IG5ldyBEYXRlKHZhbD8udGFyZ2V0Py52YWx1ZSk/LnRvTG9jYWxlRGF0ZVN0cmluZyhcImVuLVVTXCIpO1xuICAgICAgfSBlbHNlIGlmICh5ZWFyICYmIHllYXIubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJGb3JtYXQgPSAnbW0vZGQveSc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgfVxuICAgIFxuICB9XG4gIGNoYW5nZVBhc3N3b3JkVHlwZShjb2x1bW4sIHJvdyl7XG4gICAgdmFyIHRleHRUeXBlPXJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8ocm93W2NvbHVtbi5maWVsZCsnX29iaiddLnRleHRUeXBlPT0ncGFzc3dvcmQnPyd0ZXh0JzoncGFzc3dvcmQnKTpjb2x1bW4udGV4dFR5cGU9PSdwYXNzd29yZCc/J3RleHQnOidwYXNzd29yZCc7XG4gICAgdGhpcy5ncmlkU2VydmljZS5zZXRHcmlkUm93UHJvcFZhbHVlKHJvdywgW3twcm9wTmFtZTpFR3JpZFJvd1Byb3BOYW1lLlRFWFRUWVBFLCBwcm9wVmFsdWU6dGV4dFR5cGUsIGZpZWxkOmNvbHVtbi5maWVsZH1dKTtcbiAgIFxuICB9XG5cbiAgc2hvd0NvbmZpcm1hdGlvbihldmVudDogSUdyaWRQYWdpbmF0aW9uRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuUGFnZUNoYW5nZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IGV2ZW50LmZpcnN0IC8gZXZlbnQucm93cztcbiAgICB9XG4gICAgaWYgKGNvbmZpcm0oXCJZb3Ugd2lsbCBsb3NlIGNoYW5nZXMgbm90IHNhdmVkIG9uIHBhZ2UuIFdvdWxkIHlvdSBsaWtlIHRvIGNvbnRpbnVlP1wiKSA9PSB0cnVlKSB7XG4gICAgICB0aGlzLmhhbmRsZVNlcnZlclNpZGVQYWdpbmF0aW9uKGV2ZW50KTtcbiAgICAgIHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLlBhZ2VDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMudGFibGUuZmlyc3QgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGFibGUuZmlyc3QgPSBNYXRoLmZsb29yKHRoaXMuY3VycmVudFBhZ2UgLyBldmVudC5yb3dzKTtcbiAgICAgICAgICAgIHRoaXMudGFibGUucm93cyA9IGV2ZW50LnJvd3M7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxufSIsIjxkaXYgY2xhc3M9XCJncmlkLWNvbXBvbmVudC13cmFwcGVyXCI+XG48cC1jb25maXJtRGlhbG9nIFtzdHlsZV09XCJ7IHdpZHRoOiAnNTB2dycgfVwiICpuZ0lmPVwidXNlSW5saW5lQ1JVRFwiIGtleT1cImhhbmRsZUlubGluZUNSVURcIj48L3AtY29uZmlybURpYWxvZz5cbjxwLWNvbmZpcm1EaWFsb2cgY2xhc3M9XCJncmlkLWNvbXBvbmVudC1jb25maXJtLWRpYWxvZ1wiICpuZ0lmPVwiY29sdW1uQWN0aW9ucy5sZW5ndGggPiAwXCJcbiAga2V5PVwiaGFuZGxlY29sdW1uQWN0aW9uc1wiPjwvcC1jb25maXJtRGlhbG9nPlxuPGRpdiBjbGFzcz1cImdsb2JhbC1maWx0ZXItYnV0dG9ucy13cmFwcGVyXCI+XG5cbiAgPCEtLSBidXR0b24gZm9yIGFwcGx5IHZhbHVlIG9uIEdyaWQgLS0+XG4gIDxidXR0b24gKm5nSWY9XCIoKGZpbHRlcmluZyAmJiAhaGlkZUZpbHRlciApIHx8IHNob3dGaWx0ZXJidG4pXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLXNlYXJjaFwiIChjbGljayk9XCJhcHBseUdyaWRGaWx0ZXJCdG4oKVwiXG4gICAgW2NsYXNzXT1cIlxuICBzZWFyY2hHcmlkRmlsdGVyID8gJ3AtYnV0dG9uLXN1Y2Nlc3MgYXBwbHktZmlsdGVyLWJ0biBmaWx0ZXItYnRuJyA6ICdoaWRlLWNsZWFyLWZpbHRlci1idXR0b24gYXBwbHktZmlsdGVyLWJ0biBmaWx0ZXItYnRuJ1xuICBcIj48L2J1dHRvbj5cblxuICA8IS0tIGJ1dHRvbiBmb3IgY2xlYXIgdmFsdWUgb24gR3JpZCAtLT5cbiAgPGJ1dHRvbiAqbmdJZj1cIigoZmlsdGVyaW5nICYmICFoaWRlRmlsdGVyICl8fCBzaG93RmlsdGVyYnRuKVwiIHBCdXR0b24gaWQ9XCJjbGVhckdyaWRGaWx0ZXJWYWx1ZXNCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCJcbiAgICBpY29uPVwicGkgcGktcmVwbGF5XCIgKGNsaWNrKT1cImNsZWFyZ3JpZEZpbHRlcnNWYWx1ZSgpXCIgW2NsYXNzXT1cIlxuICAgICAgY2xlYXJHcmlkRmlsdGVyID8gJ2ZpbHRlci1idG4nIDogJ2hpZGUtY2xlYXItZmlsdGVyLWJ1dHRvbiBmaWx0ZXItYnRuJ1xuICAgICAgXCIgY2xhc3M9J2dsb2JhbC1yZWZyZXNoIGdsb2JhbC1idG4nXG4gICAgPjwvYnV0dG9uPlxuXG4gIDwhLS0gYnV0dG9uIGZvciBzYXZlIGFsbCBncmlkIGF0IG9uY2UgLS0+XG4gIDxidXR0b24gcEJ1dHRvbiAqbmdJZj1cImVkaXRBbGxSb3dzICYmIGVkaXRSb3dQZXJtaXNzaW9uXCIgaWQ9XCJzYXZlQWxsR3JpZFZhbHVlc1wiXG4gICAgaWNvbj1cInBpIHBpLWNoZWNrXCIgW2xhYmVsXT1cIidTYXZlJ1wiXG4gICAgW2NsYXNzXT1cImhpZGVHcmlkU2F2ZUJ1dHRvbiA/ICdoaWRlLWNsZWFyLWZpbHRlci1idXR0b24gc2F2ZS1hbGwtZ3JpZCcgOiAndWktYnV0dG9uLWluZm8gc2F2ZS1hbGwtZ3JpZCdcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwic2F2ZUFsbFJvd3NBdE9uY2UoKVwiPjwvYnV0dG9uPlxuXG4gIDwhLS0gYnV0dG9uIGZvciBjYW5jZWwgYWxsIGdyaWQgYXQgb25jZSAtLT5cbiAgPGJ1dHRvbiBwQnV0dG9uICpuZ0lmPVwiZWRpdEFsbFJvd3MgJiYgIWhpZGVHcmlkQ2FuY2VsQnV0dG9uXCIgaWQ9XCJlZGl0QnRuR2xvYmFsdmFsdWVzXCIgdHlwZT1cImJ1dHRvblwiIFtsYWJlbF09XCInQ2FuY2VsJ1wiXG4gICAgaWNvbj1cInBpIHBpLXRpbWVzXCIgY2xhc3M9XCJ1aS1idXR0b24taW5mb1wiIChjbGljayk9XCJjYW5jZWxBbGxSb3dzQXRPbmNlKClcIj48L2J1dHRvbj5cblxuICA8IS0tIGhlYWRlciBCdXR0b24gZm9yIG11bHRpU2VsZWN0IG9uIEdyaWQgLS0+XG4gIDxzcGFuICpuZ0lmPVwiYWxsb3dDb2x1bW5Ub2dnbGVcIiBvYnNlcnZlQ2hlY2tib3g+XG4gICAgPHAtbXVsdGlTZWxlY3QgIFtzaG93VG9nZ2xlQWxsXT1cImZhbHNlXCIgb3B0aW9uRGlzYWJsZWQ9XCJmYWxzZVwiIFtvcHRpb25zXT1cInNlbGVjdGVkVG9nZ2xlQ29sdW1uc1wiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRDb2x1bW5zXCIgb3B0aW9uTGFiZWw9XCJoZWFkZXJcIlxuICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IGNvbHVtbnMgc2VsZWN0ZWRcIiAgY2xhc3M9XCJncmlkLWNvbXBvbmVudC1tdWx0aXNlbGVjdC1oZWFkZXItYnV0dG9uXCIgcGxhY2Vob2xkZXI9XCJDaG9vc2UgQ29sdW1uc1wiPlxuICAgIDwvcC1tdWx0aVNlbGVjdD5cbiAgPC9zcGFuPlxuXG4gIDwhLS0gaGVhZGVyIEJ1dHRvbiBmb3IgQWRkaW5nIG5ldyBSb3cgb24gR3JpZCAtLT5cbiAgPGJ1dHRvbiBwQnV0dG9uICpuZ0lmPVwidXNlSW5saW5lQ1JVRCAmJiBhZGRSb3dQZXJtaXNzaW9uICYmICFoaWRlQWRkQnRuXCIgdHlwZT1cImJ1dHRvblwiIFtsYWJlbF09XCInQWRkJ1wiIHBBZGRSb3dcbiAgICBbdGFibGVdPVwiY29tcG9uZW50VGFibGVSZWZcIiBbbmV3Um93XT1cIm5ld0dyaWRSb3dcIiBbaWRdPVwiZGF0YUtleVwiIHBUb29sdGlwPVwiQWRkIE5ldyBSb3dcIiB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgIGljb249XCJwaSBwaS1wbHVzXCIgW2NsYXNzXT1cIid1aS1idXR0b24taW5mbyBnbG9iYWwtYWRkLWJ0bicrZ3JpZE5hbWVcIiAoY2xpY2spPVwiYWRkTmV3Um93KG5ld0dyaWRSb3csIHRydWUpXCIgcFJpcHBsZT48L2J1dHRvbj5cblxuICAgIFxuICA8IS0tIGhlYWRlciBCdXR0b24gZm9yIEV4Y2VsIEZpbGUgb24gR3JpZCAtLT5cbiAgPGJ1dHRvbiAqbmdJZj1cImFsbG93RXhwb3J0VG9FeGNlbFwiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGljb249XCJwaSBwaS1maWxlLWV4Y2VsXCIgKGNsaWNrKT1cImV4cG9ydEV4Y2VsKClcIlxuICBjbGFzcz1cInAtYnV0dG9uLXN1Y2Nlc3NcIiBwVG9vbHRpcD1cIkV4cG9ydCB0byBFeGNlbFwiIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiIHBSaXBwbGU+PC9idXR0b24+XG5cbjwhLS0gaGVhZGVyIEJ1dHRvbiBmb3IgUERGIEZpbGUgb24gR3JpZCAtLT5cbjxidXR0b24gKm5nSWY9XCJhbGxvd0V4cG9ydFRvUGRmXCIgdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gaWNvbj1cInBpIHBpLWZpbGUtcGRmXCIgKGNsaWNrKT1cImV4cG9ydFBkZigpXCJcbiAgY2xhc3M9XCJwLWJ1dHRvbi13YXJuaW5nIG1yLTIgbWwtMlwiIHBUb29sdGlwPVwiRXhwb3J0IHRvIFBkZlwiIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiIHBSaXBwbGU+PC9idXR0b24+XG5cbiAgPCEtLSA8ZGl2ICpuZ0Zvcj1cImxldCByZXBvcnRCdXR0b24gb2YgcmVwb3J0QnV0dG9uc1wiIGNsYXNzPVwidWktYnV0dG9uLWluZm8gbXItMiBtbC0yXCI+XG4gICAgPHNlLWdlbmVyYXRlLXJlcG9ydC1idG4gKm5nSWYgPVwiIXJlcG9ydEJ1dHRvbi5oaWRkZW5cIltyZXBJZF09XCJyZXBvcnRCdXR0b24ucmVwb3J0SWRcIiBbbGFiZWxdPVwicmVwb3J0QnV0dG9uLmxhYmVsXCIgW3BhcmFtc109XCJyZXBvcnRCdXR0b24ucGFyYW1zXCJcbiAgICAgIFtzaG93RGlhbG9nXT1cInJlcG9ydEJ1dHRvbi5zaG93RGlhbG9nXCI+PC9zZS1nZW5lcmF0ZS1yZXBvcnQtYnRuPlxuICA8L2Rpdj4gLS0+XG5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG4gIDxuZy1jb250YWluZXIgICpuZ0Zvcj1cImxldCByZXBvcnRCdXR0b24gb2YgcmVwb3J0QnV0dG9uc1wiPlxuICAgIDxzZS1nZW5lcmF0ZS1yZXBvcnQtYnRuICpuZ0lmID1cIiFyZXBvcnRCdXR0b24uaGlkZGVuXCJbcmVwSW5mb109XCJyZXBvcnRCdXR0b25cIiBbbGFiZWxdPVwicmVwb3J0QnV0dG9uLmxhYmVsXCIgW3BhcmFtc109XCJyZXBvcnRCdXR0b24ucGFyYW1zXCIgW2ljb25dPVwicmVwb3J0QnV0dG9uLmljb25cIiBbY2xhc3NdPVwicmVwb3J0QnV0dG9uLmNsYXNzXCJcbiAgICBbc2hvd0RpYWxvZ109XCJyZXBvcnRCdXR0b24uc2hvd0RpYWxvZ1wiIFtyZXBvcnRUeXBlXT1cIiByZXBvcnRCdXR0b24ucmVwb3J0VHlwZVwiIFtyZXBvcnRIZWFkZXJdPVwicmVwb3J0QnV0dG9uLnJlcG9ydEhlYWRlclwiIFtyZXBvcnRGb290ZXJdPVwicmVwb3J0QnV0dG9uLnJlcG9ydEZvb3RlclwiPjwvc2UtZ2VuZXJhdGUtcmVwb3J0LWJ0bj5cbiAgPC9uZy1jb250YWluZXI+XG5cbjwvZGl2PlxuXG4gIDxwLXRhYmxlICpuZ0lmPVwiIWlzR3JpZEhpZGRlblwiIGlkPVwibXktdGFibGVcIiBbdmFsdWVdPVwicm93c0RhdGFcIiBbY29sdW1uc109XCJzZWxlY3RlZENvbHVtbnNcIiBzb3J0TW9kZT1cIm11bHRpcGxlXCJcbiAgICBbbGF6eV09XCJ1c2VTZXJ2ZXJTaWRlRXZlbnRzXCIgW3BhZ2luYXRvcl09XCJwYWdpbmF0aW9uXCIgW2Fsd2F5c1Nob3dQYWdpbmF0b3JdPVwicGFnaW5hdGlvbiAmJiB0b3RhbFJlY29yZHMgPiAwXCIgXG4gICAgW2NsYXNzXT1cIicgZ3JpZC1jb21wb25lbnQtbWFpbi10YWJsZSAnICsgKHBhZ2luYXRpb24gfHwgIXJvd3NEYXRhLmxlbmd0aCA/ICcgcGFnaW5hdGlvbiAnIDogJycpICsgKHRhYmxlU3R5bGUuaW5jbHVkZXMoJ3dpZHRoJykgPyAnIGhhc1RhYmxlV2lkdGhTdHlsZSAnIDogJycpICsgKGF1dG9SZXNpemUgPyAnJyA6ICd0YWJsZS1sYXlvdXQtYXV0bycpIFwiXG4gICAgKG9uQ29sUmVzaXplKT1cIm9uQ29sdW1uUmVzaXplKCRldmVudCxkdClcIiBbcmVzaXphYmxlQ29sdW1uc109XCJ0cnVlXCJcbiAgICAgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIGNvbHVtblJlc2l6ZU1vZGU9XCJleHBhbmRcIlxuICAgIFtyb3dzXT1cImRlZmF1bHRSb3dzXCIgW3RvdGFsUmVjb3Jkc109XCJ0b3RhbFJlY29yZHNcIiBbcm93c1BlclBhZ2VPcHRpb25zXT1cInNldFBhZ2luYXRpb25MZW5ndGhcIlxuICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwic2hvd0N1cnJlbnRQYWdlUmVwb3J0XCIgY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZT1cIlNob3dpbmcge2ZpcnN0fSB0byB7bGFzdH0gb2Yge3tcbiAgICAgIHRvdGFsUmVjb3Jkc1xuICAgIH19IGVudHJpZXNcIiBbbG9hZGluZ109XCIhc2V0R3JpZFJlZnJlc2hUaW1lID8gbG9hZGluZyA6IGZhbHNlXCJcbiAgICAob25Tb3J0KT1cInNvcnREaXNhYmxlZCA/PyBoYW5kbGVTb3J0Q2hhbmdlKCRldmVudClcIiAob25GaWx0ZXIpPVwiaGFuZGxlRmlsdGVyQ2hhbmdlKCRldmVudClcIlxuICAgIChvbkxhenlMb2FkKT1cImF1dG9Mb2FkRGF0YSA/IGhhbmRsZVNlcnZlclNpZGVFdmVudHMoJGV2ZW50LCBkdCkgOiAnJ1wiIChvblBhZ2UpPVwiZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA/IHNob3dDb25maXJtYXRpb24oJGV2ZW50KSA6IGhhbmRsZVNlcnZlclNpZGVQYWdpbmF0aW9uKCRldmVudClcIiAjZHRcbiAgICBbZGF0YUtleV09XCJkYXRhS2V5XCIgWyhzZWxlY3Rpb24pXT1cInNlbGVjdGVkUm93c1wiIHNlbGVjdGlvbk1vZGU9XCJtdWx0aXBsZVwiIFtzY3JvbGxhYmxlXT1cInNjcm9sbGFibGVcIiBcbiAgICBbdGFibGVTdHlsZV09XCJ0YWJsZVN0eWxlXCJcbiAgICBbc2Nyb2xsSGVpZ2h0XT1cInNjcm9sbEhlaWdodFwiXG4gICAgZWRpdE1vZGU9XCJyb3dcIiBbZWRpdGluZ1Jvd0tleXNdPVwiZWRpdGluZ1Jvd0tleXNcIiBbcm93SG92ZXJdPVwicm93SG92ZXJcIlxuICAgIFtuZ0NsYXNzXT1cInNldENsYXNzYUFuZElkKGR0KVwiPlxuXG4gICAgPGRpdiAqbmdJZj1cInJvd0FjdGlvbnMubGVuZ3RoID4gMCAmJiByb3dBY3Rpb25zLmxlbmd0aCA+IDBcIiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IHJvd0FjdGlvbiBvZiByb3dBY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b24gcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2xhYmVsXT1cInJvd0FjdGlvbi50aXRsZVwiIFtjbGFzc109XCJyb3dBY3Rpb24uY2xhc3NcIlxuICAgICAgICAgIChjbGljayk9XCJyb3dBY3Rpb24ub25DbGljayhzZWxlY3RlZFJvd3MpXCI+PC9idXR0b24+XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIGhlYWRlciBjb2x1bW5zIG9uIEdyaWQgLS0+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2xzPlxuICAgICAgPHRyPlxuICAgICAgICA8dGggcFJlc2l6YWJsZUNvbHVtbiAqbmdJZj1cImFsbG93U2VsZWN0aW9uICYmIHNlbGVjdGlvblR5cGUgPT09ICdtdWx0aXBsZSdcIiBjbGFzcz1cImdyaWQtY29tcG9uZW50LXNlbGVjdGlvblwiIGlkPVwie3thbGxvd1NlbGVjdGlvbkhlYWRlcn19XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aC1jb250ZW50LXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWNvbXBvbmVudC10YWJsZS1oZWFkZXItaW5uZXItZGl2LTJcbiAgICAgICAgICAgICAgICAgIHRhYmxlLWhlYWRlci1pbm5lci1kaXYgZGl2LWxhc3QtaW5uZXItaHRtbC1pcy1pY29uXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC1ncm93LTFcIj4ge3thbGxvd1NlbGVjdGlvbkhlYWRlcn19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveCAqbmdJZj1cInNlbGVjdGlvblR5cGUgPT09ICdtdWx0aXBsZSdcIiBiaW5hcnk9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibXVsdGlDaGVja0JveE9uY2xpY2socm93c0RhdGEsICRldmVudClcIj48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRoIHBSZXNpemFibGVDb2x1bW4gKm5nSWY9XCJhbGxvd1NlbGVjdGlvbiAmJiBzZWxlY3Rpb25UeXBlID09PSAnc2luZ2xlJ1wiIGlkPVwiU2VsZWN0XCJcbiAgICAgICAgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiIGNsYXNzPVwiZ3JpZC1jb21wb25lbnQtc2VsZWN0aW9uXCI+XG4gICAgICAgICAgU2VsZWN0XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uIGlkPVwiQWN0aW9uc1wiXG4gICAgICAgICAgKm5nSWY9XCJzZXRBY3Rpb25Db2x1bW5Bc0ZpcnN0ICYmICFkaXNhYmxlZFNhdmVCdG4gJiYgY29sdW1ucz8ubGVuZ3RoID4gMCAmJiAoY29sdW1uQWN0aW9ucy5sZW5ndGggPiAwIHx8ICh1c2VJbmxpbmVDUlVEICYmIChkZWxldGVSb3dQZXJtaXNzaW9uIHx8IGVkaXRSb3dQZXJtaXNzaW9uKSkpXCJcbiAgICAgICAgICBbY2xhc3NdPVwiaW5FZGl0TW9kZSA/ICd0aHJlZS1hY3Rpb24tYnRuJyA6ICd0d28tYWN0aW9uLWJ0bicgXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiID5cbiAgICAgICAgICBBY3Rpb25zXG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sc1wiIFtzdHlsZS53aWR0aF09XCJjb2x1bW4/LmNvbHVtbldpZHRoID8gY29sdW1uPy5jb2x1bW5XaWR0aCsncHgnIDogY29sdW1uPy5jdXN0b21XaWR0aCsncHgnXCIgaWQ9XCJ7e2NvbHVtbi5oZWFkZXJ9fVwiIFtwU29ydGFibGVDb2x1bW5dPVwiY29sdW1uLmZpZWxkXCJcbiAgICAgICAgICBbY2xhc3NdPVwiY29sdW1uLnR5cGUgPT09ICdib29sZWFuJyA/ICdjaGVja2JveC10aCcgOiAnJ1wiXG4gICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbkRpc2FibGVkXT1cInNvcnREaXNhYmxlZCAmJiB1c2VTZXJ2ZXJTaWRlRXZlbnRzID8gdHJ1ZSA6IGNvbHVtbi5zb3J0aW5nID09PSBmYWxzZVwiXG4gICAgICAgICAgY2xhc3M9XCJjb2x1bW4/LnR5cGUgPT09ICdtdWx0aXBsZScgPyAnZ3JpZC1jb21wb25lbnQtc2VsZWN0LXRoLWNvbHVtbi10eXBlLW11bHRpcGxlJyA6ICcnXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aC1jb250ZW50LXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWNvbXBvbmVudC10YWJsZS1oZWFkZXItaW5uZXItZGl2LTEgdGFibGUtaGVhZGVyLWlubmVyLWRpdiBkaXYtbGFzdC1pbm5lci1odG1sLWlzLWljb25cIj4gICAgICAgIFxuICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5kYXRhLXRpdGxlLWVsZW1lbnRdPVwiJ3NlbGYnXCIgIFtjbGFzc109XCInZmxleC1ncm93LTEnXCIgPnt7IGNvbHVtbi5oZWFkZXIgfX1cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbHVtbi5pc1JlcXVpcmVkXCIgY2xhc3M9XCJncmlkLWNvbXBvbmVudCByZXF1aXJlZC1zdGFyXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8cC1zb3J0SWNvbiAqbmdJZj1cImNvbHVtbi5zb3J0aW5nICE9PSBmYWxzZSAmJiBjb2x1bW4/LnR5cGUgIT09ICdtdWx0aXBsZSdcIlxuICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2x1bW4uZmllbGRcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGggcFJlc2l6YWJsZUNvbHVtbiBpZD1cIkFjdGlvbnNcIlxuICAgICAgICAgICpuZ0lmPVwiIXNldEFjdGlvbkNvbHVtbkFzRmlyc3QgJiYgIWRpc2FibGVkU2F2ZUJ0biAmJiBjb2x1bW5zPy5sZW5ndGggPiAwICYmIChjb2x1bW5BY3Rpb25zLmxlbmd0aCA+IDAgfHwgKHVzZUlubGluZUNSVUQgJiYgKGRlbGV0ZVJvd1Blcm1pc3Npb24gfHwgZWRpdFJvd1Blcm1pc3Npb24pKSlcIlxuICAgICAgICAgIFtjbGFzc109XCJpbkVkaXRNb2RlID8gJ3RocmVlLWFjdGlvbi1idG4nIDogJ3R3by1hY3Rpb24tYnRuJ1wiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIiA+QWN0aW9uczwvdGg+XG4gICAgICA8L3RyPlxuICAgICAgPHRyICpuZ0lmPVwiZmlsdGVyaW5nICYmICFoaWRlRmlsdGVyXCI+XG4gICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uICpuZ0lmPVwiYWxsb3dTZWxlY3Rpb25cIiBbY2xhc3NdPVwiaW5FZGl0TW9kZSA/ICd0aHJlZS1hY3Rpb24tYnRuJyA6ICd0d28tYWN0aW9uLWJ0bidcIj48L3RoPlxuICAgICAgICA8dGggcFJlc2l6YWJsZUNvbHVtbiAqbmdJZj1cInNldEFjdGlvbkNvbHVtbkFzRmlyc3QgJiYgIWRpc2FibGVkU2F2ZUJ0biAmJiB1c2VJbmxpbmVDUlVEXCJcbiAgICAgICAgICBbY2xhc3NdPVwiaW5FZGl0TW9kZSA/ICd0aHJlZS1hY3Rpb24tYnRuJyA6ICd0d28tYWN0aW9uLWJ0bidcIj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRoIHBSZXNpemFibGVDb2x1bW4gKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2xzXCIgW3N0eWxlLndpZHRoXT1cImNvbHVtbj8uY29sdW1uV2lkdGggPyBjb2x1bW4/LmNvbHVtbldpZHRoKydweCcgOiBjb2x1bW4/LmN1c3RvbVdpZHRoKydweCdcIiBpZD1cInt7Y29sdW1uLmhlYWRlcn19XCIgW25nU3dpdGNoXT1cImNvbHVtbj8uZmlsdGVyPy50eXBlXCIgXG4gICAgICAgICAgW2NsYXNzXT1cImhpZGVGaWx0ZXJPcHRpb25zID8gJ2hpZGUtdGFibGUtZmlsdGVyIHRlbXAnIDogJ3RlbXAnXCI+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb2x1bW4uZmlsdGVyaW5nICE9PSBmYWxzZVwiIFtjbGFzc109XCJjb2x1bW4uZmlsdGVyPy5zaG93RmlsdGVyID8gJycgOiAnaGlkZS1maWx0ZXItaWNvbidcIj5cbiAgICAgICAgICAgIDwhLS0gVGV4dCBpbnB1dCBvbiBIZWFkZXIgRm9yIEZpbHRlci0tPlxuICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyIGNsYXNzPVwibm8tZmlsdGVyLWljb25cIiBbdHlwZV09XCIndGV4dCdcIiBbZmllbGRdPVwiY29sdW1uLmZpZWxkXCIgKm5nU3dpdGNoQ2FzZT1cIidpbnB1dCdcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiIGxldC12YWx1ZSBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNvbHVtbi5maWx0ZXJWYWx1ZVwiIFtjbGFzc109XCJjb2x1bW4/LmZpZWxkPy50b0xvd2VyQ2FzZSgpXCIgKGtleXVwLmVudGVyKT1cImFwcGx5RW50ZXJFdmVudChmaWx0ZXIsICRldmVudCwgY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAoYmx1cik9XCJzZXRGaWx0ZXJGb2N1c091dChjb2x1bW4sIGZpbHRlciwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoa2V5dXApPVwicmVtb3ZpbmdGaWx0ZXJzKCRldmVudCwgY29sdW1uKTtiYWNrc3BhY2VFdmVudCgkZXZlbnQsIGNvbHVtbilcIiBwSW5wdXRUZXh0IC8+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3AtY29sdW1uRmlsdGVyPlxuXG4gICAgICAgICAgICA8IS0tIE51bWVyaWMgaW5wdXQgb24gSGVhZGVyIEZvciBGaWx0ZXItLT5cbiAgICAgICAgICAgIDxwLWNvbHVtbkZpbHRlciBjbGFzcz1cIm5vLWZpbHRlci1pY29uXCIgW3R5cGVdPVwiJ251bWVyaWMnXCIgW2ZpZWxkXT1cImNvbHVtbi5maWVsZFwiICpuZ1N3aXRjaENhc2U9XCInbnVtZXJpY19pbnB1dCdcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiIGxldC12YWx1ZSBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIj5cbiAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBbKG5nTW9kZWwpXT1cImNvbHVtbi5maWx0ZXJWYWx1ZVwiIFtjbGFzc109XCJjb2x1bW4/LmZpZWxkPy50b0xvd2VyQ2FzZSgpXCIgKGtleXVwLmVudGVyKT1cImFwcGx5RW50ZXJFdmVudChmaWx0ZXIsICRldmVudCwgY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAob25CbHVyKT1cInNldEZpbHRlckZvY3VzT3V0KGNvbHVtbiwgZmlsdGVyLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJyZW1vdmluZ0ZpbHRlcnMoJGV2ZW50LCBjb2x1bW4pO2JhY2tzcGFjZUV2ZW50KCRldmVudCwgY29sdW1uKVwiPjwvcC1pbnB1dE51bWJlcj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XG5cbiAgICAgICAgICAgICAgPCEtLSBsb29rdXAgaW5wdXQgb24gSGVhZGVyIEZvciBGaWx0ZXItLT5cbiAgICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJuby1maWx0ZXItaWNvblwiXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgICBbZmllbGRdPVwiY29sdW1uLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2xvb2t1cF9pbnB1dCdcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICBwVGVtcGxhdGU9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgICAgICAgICBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbG9zZS1pY29uLXdyYXBwZXIgZ3JpZC1jb21wb25lbnQgbG9va3VwLWZpbHRlci13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb29rdXAtZmlsdGVyLWlucHV0LXdyYXBwZXJcIj4gXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJjb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX2ZpbHRlcidcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JpZC1jb21wb25lbnQgbG9va3VwLWZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW4uZmlsdGVyVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRGaWx0ZXJMb29rdXAoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImFwcGx5RW50ZXJFdmVudChmaWx0ZXIsICRldmVudCwgY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwic2V0RmlsdGVyRm9jdXNPdXQoY29sdW1uLCBmaWx0ZXIsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJyZW1vdmluZ0ZpbHRlcnMoJGV2ZW50LCBjb2x1bW4pO2JhY2tzcGFjZUV2ZW50KCRldmVudCwgY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgcElucHV0VGV4dFxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gIFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlyZWN0LXdyYXBwZXItY2xvc2UtaWNvbi1sb29rdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5maWx0ZXJWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibG9va3VwQ2xlYXJWYWx1ZShjb2x1bW4pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cblxuICAgICAgICAgICAgPCEtLSBjaGVja2JveCBvbiBIZWFkZXIgRm9yIEZpbHRlci0tPlxuICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyIGNsYXNzPVwibm8tZmlsdGVyLWljb25cIiB0eXBlPVwiYm9vbGVhblwiIFtmaWVsZF09XCJjb2x1bW4uZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ2NoZWNrYm94J1wiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZmlsdGVyXCIgbGV0LXZhbHVlIGxldC1maWx0ZXI9XCJmaWx0ZXJDYWxsYmFja1wiPlxuICAgICAgICAgICAgICAgIDxwLWNoZWNrYm94IFtiaW5hcnldPVwidHJ1ZVwiIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWRcIiBbKG5nTW9kZWwpXT1cImNvbHVtbi5maWx0ZXJWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlFbnRlckV2ZW50KGZpbHRlciwgJGV2ZW50LCBjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJzZXRGaWx0ZXJGb2N1c091dChjb2x1bW4sIGZpbHRlciwgJGV2ZW50KVwiIChjbGljayk9XCJjbGlja0NoZWNrQm94RmlsdGVyKGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiYmFja3NwYWNlRXZlbnQoJGV2ZW50LCBjb2x1bW4pXCI+XG4gICAgICAgICAgICAgICAgPC9wLWNoZWNrYm94PlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cblxuICAgICAgICAgICAgPCEtLSBtdWx0aVNlbGVjdCBvbiBIZWFkZXIgRm9yIEZpbHRlci0tPlxuICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyIGNsYXNzPVwibm8tZmlsdGVyLWljb25cIiBbZmllbGRdPVwiY29sdW1uLmZpZWxkXCIgbWF0Y2hNb2RlPVwiaW5cIiBbc2hvd01lbnVdPVwiZmFsc2VcIiAqbmdTd2l0Y2hDYXNlPVwiJ211bHRpLXNlbGVjdCdcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiIGxldC12YWx1ZSBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIj5cbiAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCBbKG5nTW9kZWwpXT1cImNvbHVtbi5maWx0ZXJWYWx1ZVwiIFtvcHRpb25zXT1cImNvbHVtbi5maWx0ZXIuZGF0YSB8fCBbXVwiIFxuICAgICAgICAgICAgICAgIFthcHBlbmRUb109XCInYm9keSdcIiBbbmFtZV09XCJjb2x1bW4uZmllbGRcIlxuICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUVudGVyRXZlbnQoZmlsdGVyLCAkZXZlbnQsIGNvbHVtbilcIlxuICAgICAgICAgICAgICAgIFtvcHRpb25WYWx1ZV09XCJjb2x1bW4ub3B0aW9uVmFsdWVcIlxuICAgICAgICAgICAgICAgICBbb3B0aW9uTGFiZWxdPVwiY29sdW1uLm9wdGlvbkxhYmVsXCJcbiAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJzZXRGaWx0ZXJGb2N1c091dChjb2x1bW4sIGZpbHRlciwgJGV2ZW50KVwiIFxuICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiYmFja3NwYWNlRXZlbnQoJGV2ZW50LCBjb2x1bW4pXCI+XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3AtY29sdW1uRmlsdGVyPlxuXG4gICAgICAgICAgICA8IS0tIGRyb3Bkb3duIG9uIEhlYWRlciBGb3IgRmlsdGVyLS0+XG4gICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXIgY2xhc3M9XCJuby1maWx0ZXItaWNvblwiIFtmaWVsZF09XCJjb2x1bW4uZmllbGRcIiBtYXRjaE1vZGU9XCJpblwiIFtzaG93TWVudV09XCJmYWxzZVwiICpuZ1N3aXRjaENhc2U9XCInZHJvcGRvd24nXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmaWx0ZXJcIiBsZXQtdmFsdWUgbGV0LWZpbHRlcj1cImZpbHRlckNhbGxiYWNrXCI+XG4gICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW3Nob3dDbGVhcl09XCJ0cnVlXCIgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QnXCIgW2ZpbHRlcl09XCJjb2x1bW4uYWxsb3dTZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW4uZmlsdGVyVmFsdWVcIiAoa2V5dXAuZW50ZXIpPVwiYXBwbHlEcm9wZG93bkZpbHRlcihmaWx0ZXIsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiY29sdW1uLmZpbHRlci5kYXRhIHx8IFtdXCJcbiAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJzZWFyY2hEcm9wZG93bkZpbHRlcihmaWx0ZXIsICRldmVudCwgY29sdW1uKVwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XG5cbiAgICAgICAgICAgIDwhLS0gY2FsZW5kYXIgb24gSGVhZGVyIEZvciBGaWx0ZXItLT5cbiAgICAgICAgICAgIDxwLWNvbHVtbkZpbHRlciBjbGFzcz1cIm5vLWZpbHRlci1pY29uXCIgW2ZpZWxkXT1cImNvbHVtbi5maWVsZFwiIG1hdGNoTW9kZT1cImluXCIgW3Nob3dNZW51XT1cImZhbHNlXCIgKm5nU3dpdGNoQ2FzZT1cIidjYWxlbmRhcidcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiIGxldC12YWx1ZSBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIj5cbiAgICAgICAgICAgICAgICA8cC1jYWxlbmRhciBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdC1EYXRlJ1wiIFsobmdNb2RlbCldPVwiY29sdW1uLmZpbHRlclZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUVudGVyRXZlbnQoZmlsdGVyLCAkZXZlbnQsIGNvbHVtbilcIiBhcHBlbmRUbz1cImJvZHlcIiAob25TZWxlY3QpPVwic2VsZWN0RGF0ZShjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgIFtpbnB1dElkXT1cImNvbHVtbi5maWVsZFwiIGhvdXJGb3JtYXQ9XCIxMlwiIChrZXl1cC5iYWNrc3BhY2UpPVwicmVtb3ZlTnVsbENhbGVuZGFyKGNvbHVtbiwgZmlsdGVyLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIFtzaG93QnV0dG9uQmFyXT1cInRydWVcIiAob25DbG9zZSk9XCJzZXRGaWx0ZXJGb2N1c091dChjb2x1bW4sIGZpbHRlciwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJiYWNrc3BhY2VFdmVudCgkZXZlbnQsIGNvbHVtbilcIiAob25DbGVhckNsaWNrKT1cImJhY2tzcGFjZUV2ZW50KCRldmVudCwgY29sdW1uKVwiPlxuICAgICAgICAgICAgICAgIDwvcC1jYWxlbmRhcj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XG5cbiAgICAgICAgICAgIDwhLS0gRGVmYXVsdCBGaWx0ZXIgRm9yIEhlYWRlciAgLS0+XG4gICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXIgY2xhc3M9XCJuby1maWx0ZXItaWNvblwiIFt0eXBlXT1cIlxuICAgICAgICAgICAgICAgIGNvbHVtbi50eXBlICYmIGNvbHVtbi50eXBlICE9PSAnbGluaycgPyBjb2x1bW4udHlwZSA6ICd0ZXh0J1xuICAgICAgICAgICAgICBcIiBbZmllbGRdPVwiY29sdW1uLmZpZWxkXCIgZGlzcGxheT1cIm1lbnVcIiAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uXG4gICAgICAgICAgKm5nSWY9XCIhc2V0QWN0aW9uQ29sdW1uQXNGaXJzdCAmJiAhZGlzYWJsZWRTYXZlQnRuICYmIGNvbHVtbnM/Lmxlbmd0aCA+IDAgJiYgKGNvbHVtbkFjdGlvbnMubGVuZ3RoID4gMCB8fCAodXNlSW5saW5lQ1JVRCAmJiAoZGVsZXRlUm93UGVybWlzc2lvbiB8fCBlZGl0Um93UGVybWlzc2lvbikpKVwiXG4gICAgICAgICAgW2NsYXNzXT1cImluRWRpdE1vZGUgPyAndGhyZWUtYWN0aW9uLWJ0bicgOiAndHdvLWFjdGlvbi1idG4nXCI+PC90aD5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDwhLS0gQm9keSBjb2x1bW5zIG9uIEdyaWQgLS0+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93IGxldC1lZGl0aW5nPVwiZWRpdGluZ1wiIGxldC1yaT1cInJvd0luZGV4XCI+XG4gICAgICA8dHIgXG4gICAgICBbc3R5bGVdPVwicm93U3R5bGVcIlxuICAgICAgW25nQ2xhc3NdPVwicm93Py5oaWdobGlnaHRyb3cgPyAnaGlnaGxpZ2h0ZWQtcm93JyA6ICcnXCJcbiAgICAgICAgW2NsYXNzXT1cIndvcmRXcmFwID8gJ3Atc2VsZWN0YWJsZS1yb3cgd29yZFdyYXBUcnVlJyA6ICd3b3JkV3JhcEZhbHNlIHAtc2VsZWN0YWJsZS1yb3cnXCIgKGNsaWNrKT1cInNlbGVjdGVkUm93UmVjb3JkID0gcm93XCJcbiAgICAgICAgW3BFZGl0YWJsZVJvd109XCJyb3dcIiAjZ3JpZFJvdyBbaWRdPVwicm93W2RhdGFLZXldXCI+XG4gICAgICAgIDx0ZCAqbmdJZj1cImFsbG93U2VsZWN0aW9uXCIgY2xhc3M9XCJncmlkLWNvbXBvbmVudC1zZWxlY3Rpb25cIj5cbiAgICAgICAgICA8cC10YWJsZVJhZGlvQnV0dG9uIFt2YWx1ZV09XCJyb3dcIiAqbmdJZj1cInNlbGVjdGlvblR5cGUgPT09ICdzaW5nbGUnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJtdWx0aUNoZWNrQm94T25jbGljayhyb3cgLCAkZXZlbnQsIHRydWUpXCI+PC9wLXRhYmxlUmFkaW9CdXR0b24+XG4gICAgICAgICAgPHAtdGFibGVDaGVja2JveCBbdmFsdWVdPVwicm93XCIgKm5nSWY9XCJzZWxlY3Rpb25UeXBlID09PSAnbXVsdGlwbGUnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJtdWx0aUNoZWNrQm94T25jbGljayhyb3csICRldmVudClcIj48L3AtdGFibGVDaGVja2JveD5cbiAgICAgICAgPC90ZD5cblxuICAgICAgICA8IS0tIGZpcnN0IGFjdGlvbnMgY29sdW1uIC0tPlxuICAgICAgICA8dGQgKm5nSWY9XCJzZXRBY3Rpb25Db2x1bW5Bc0ZpcnN0ICYmIGNvbHVtbkFjdGlvbnMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWN0aW9uLWJ0blwiICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgY29sdW1uQWN0aW9uc1wiPlxuICAgICAgICAgICAgPGkgW3RpdGxlXT1cImFjdGlvbi50b29sdGlwXCIgW2NsYXNzXT1cImFjdGlvbi5pY29uXCIgKGNsaWNrKT1cImhhbmRsZUFjdGlvbkNsaWNrKCRldmVudCwgYWN0aW9uLCByb3cpXCI+PC9pPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkICpuZ0lmPVwic2V0QWN0aW9uQ29sdW1uQXNGaXJzdCAmJiB1c2VJbmxpbmVDUlVEICYmIChkZWxldGVSb3dQZXJtaXNzaW9uIHx8IGVkaXRSb3dQZXJtaXNzaW9uKVwiXG4gICAgICAgICAgW2NsYXNzXT1cImluRWRpdE1vZGUgPyAndGhyZWUtYWN0aW9uLWJ0bicgOiAndHdvLWFjdGlvbi1idG4nXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJkaXNhYmxlZFNhdmVCdG4gPyAnaGlkZS1jbGVhci1maWx0ZXItYnV0dG9uJyA6ICcnXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXRBY3Rpb25Db2x1bW5XaWR0aFwiPlxuICAgICAgICAgICAgPHNlLWdyaWQtcm93LWFjdGlvbnMgW2VkaXRpbmddPVwiZWRpdGluZ1wiIFtlZGl0Um93UGVybWlzc2lvbl09XCJlZGl0Um93UGVybWlzc2lvblwiXG4gICAgICAgICAgICAgIFtkZWxldGVSb3dQZXJtaXNzaW9uXT1cImRlbGV0ZVJvd1Blcm1pc3Npb25cIiBbaGlkZURlbGV0ZUJ0bl09XCJoaWRlRGVsZXRlQnRuXCIgW2hpZGVFZGl0QnRuXT1cImhpZGVFZGl0QnRuXCJcbiAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIiAob25Sb3dFZGl0SW5pdEJ0bik9XCJvblJvd0VkaXRJbml0KCRldmVudClcIiAoZGVsZXRlUmVjb3JkQnRuKT1cImRlbGV0ZVJlY29yZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9uUm93RWRpdFNhdmVCdG4pPVwib25Sb3dFZGl0U2F2ZSgkZXZlbnQpXCIgKG9uUm93RWRpdENhbmNlbEJ0bik9XCJvblJvd0VkaXRDYW5jZWwoJGV2ZW50LCByaSlcIlxuICAgICAgICAgICAgICBbZWRpdEFsbFJvd3NdPVwiZWRpdEFsbFJvd3NcIj5cbiAgICAgICAgICAgIDwvc2UtZ3JpZC1yb3ctYWN0aW9ucz5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG5cbiAgICAgICAgPCEtLSBHcmlkIFJvd3MgRGF0YSBCaW5kaW5ncyBTdGFydCAtLT5cbiAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2x1bW4gb2Ygc2VsZWN0ZWRDb2x1bW5zXCIgW25nU3dpdGNoXT1cImNvbHVtbi50eXBlXCIgW3N0eWxlXT1cImNvbHVtbi5zdHlsZSBcIiBcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwiKGNvbHVtbi5ob3ZlckRhdGEgJiYgY29sdW1uLmhvdmVyRGF0YS5jb21wb25lbnQpICYmIGFkZER5bmFtaWNQYW5lbE92ZXJsYXlDb21wb25lbnQoY29sdW1uLmhvdmVyRGF0YSwgb3ZlcmxheVBhbmVsLCAkZXZlbnQsIHJvdylcIlxuICAgICAgICAobW91c2VsZWF2ZSk9XCIoY29sdW1uLmhvdmVyRGF0YSAmJiBjb2x1bW4uaG92ZXJEYXRhLmNvbXBvbmVudCkgICYmIG1vdXNlTGVhdmVFdmVudChvdmVybGF5UGFuZWwpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGQtY29udGVudC13cmFwcGVyXCIgW3N0eWxlXT1cImNvbHVtbi5zdHlsZVwiPlxuXG4gICAgICAgICAgPCEtLSBCb29sZWFuIGNvbHVtbiBvbiBHcmlkIC0tPlxuICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInYm9vbGVhbidcIlxuICAgICAgICAgID5cbiAgICAgICAgPHRkICpuZ0lmPVwiIWVkaXRpbmcgJiYgcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LnNob3cgIT0gZmFsc2VcIj5cbiAgICAgICAgICA8cC1jaGVja2JveCBcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvbHVtbi5hbGxvd0VkaXQgPz8gdHJ1ZVwiIFtiaW5hcnldPVwidHJ1ZVwiIChjbGljayk9XCJvbkNsaWNrRXZlbnQoY29sdW1uLCByb3cpXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoZWNrQm94Q2hhbmdlRXZlbnQoJGV2ZW50LCBjb2x1bW4sIHJvdylcIiAoYmx1cik9XCJvbkZvY3VzT3V0RXZlbnQoY29sdW1uLCByb3cpXCIgXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cIiBcbiAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gJiZcbiAgICAgICAgICAgICAgKHJvd1tjb2x1bW4uZmllbGRdLnRvU3RyaW5nKCkgPT09ICcxJyB8fFxuICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnIHx8XG4gICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09PSAneSd8fFxuICAgICAgICAgICAgICAgICggcm93W2NvbHVtbi5maWVsZF0udGV4dCAmJiAocm93W2NvbHVtbi5maWVsZF0/LnRleHQ/LnRvU3RyaW5nKCkgPT09ICcxJyB8fFxuICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdPy50ZXh0Py50b1N0cmluZygpPy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScgfHxcbiAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXT8udGV4dD8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSA9PT0gJ3knKSkpXG4gICAgICAgICAgICAgICAgICA/IENoZWNrZWRcbiAgICAgICAgICAgICAgICAgIDogdW5DaGVja2VkXG4gICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgPC9wLWNoZWNrYm94PlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgKm5nSWY9XCJlZGl0aW5nXCI+XG4gICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICA8IS0tIGZvciBlZGl0IGNoZWNrQm94IC0tPlxuICAgICAgICAgICAgICA8cC1jaGVja2JveCAoY2xpY2spPVwib25DbGlja0V2ZW50KGNvbHVtbiwgcm93KVwiIChuZ01vZGVsQ2hhbmdlKT1cImNoZWNrQm94Q2hhbmdlRXZlbnQoJGV2ZW50LCBjb2x1bW4sIHJvdylcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpXCIgW2JpbmFyeV09XCJ0cnVlXCIgWyhuZ01vZGVsKV09XCJcbiAgICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gJiYgICBcbiAgICAgICAgICAgICAgICAgICAgKHJvd1tjb2x1bW4uZmllbGRdLnRvU3RyaW5nKCkgPT09ICcxJyB8fFxuICAgICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09PSAneScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAoIHJvd1tjb2x1bW4uZmllbGRdLnRleHQgJiYgKHJvd1tjb2x1bW4uZmllbGRdPy50ZXh0Py50b1N0cmluZygpID09PSAnMScgfHxcbiAgICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXT8udGV4dD8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0/LnRleHQ/LnRvU3RyaW5nKCk/LnRvTG93ZXJDYXNlKCkgPT09ICd5JykpKVxuICAgICAgICAgICAgICAgICAgICAgID8gZWRpdE1vZGVDaGVja2VkXG4gICAgICAgICAgICAgICAgICAgICAgOiBlZGl0TW9kZXVuQ2tlY2tlZFxuICAgICAgICAgICAgICAgICAgXCIgKGJsdXIpPVwib25Gb2N1c091dEV2ZW50KGNvbHVtbiwgcm93KVwiPjwvcC1jaGVja2JveD5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgIHt7IHJvd1tjb2x1bW4uZmllbGRdIH19XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPCEtLSBsaW5rIGNvbHVtbiBvbiBHcmlkIC0tPlxuICAgICAgICA8c3BhbiBbYXR0ci5kYXRhLXRpdGxlLWVsZW1lbnRdPVwiY29sdW1uLmhvdmVyRGF0YSA/IG51bGwgOiAnYSxpbnB1dCdcIiAgKm5nU3dpdGNoQ2FzZT1cIidsaW5rJ1wiPlxuICAgICAgICAgIDwhLS0gbGluayBjb2x1bW4gZm9yIEh5cGVyTGluayBDYXNlIC0tPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sdW1uLmFsbG93U2F2ZSA9PT0gZmFsc2VcIj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sdW1uLnRhcmdldCAhPT0gJ19zZWxmJ1wiIFtzdHlsZV09XCJjb2x1bW4uc3R5bGVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10aXRsZS1lbGVtZW50XT1cImNvbHVtbi5ob3ZlckRhdGEgPyBudWxsIDogJ2EnXCJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLWxpbmtcIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KSA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXCI+XG5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwiZC1pbmxpbmVcIiBbaHJlZl09XCJjb2x1bW4uZGlzYWJsZWQ/Jyc6cm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/Lmh5cGVybGlua1wiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiY29sdW1uLmljb24gJiYhcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5oaWRlRmllbGRWYWx1ZTsgZWxzZSBub0ljb25cIiBbY2xhc3NdPVwiY29sdW1uLmljb25cIiBbdGl0bGVdPVwiY29sdW1uLmhlYWRlclwiPjwvaT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vSWNvbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJjb2x1bW4/Lm9uQ2xpY2sgPyBvbkNsaWNrRXZlbnQoY29sdW1uLCByb3cpIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmhpZGVGaWVsZFZhbHVlPycnOlxuICAgICAgICAgICAgICAgICAgICAgIHNldENvbmRpdGlvbkJhc2VWYWx1ZShyb3csIGNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgIFxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb2x1bW4udGFyZ2V0ID09PSAnX3NlbGYnXCIgW3N0eWxlXT1cImNvbHVtbi5zdHlsZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRpdGxlLWVsZW1lbnRdPVwiY29sdW1uLmhvdmVyRGF0YSA/IG51bGwgOiAnYSdcIiBjbGFzcz1cImN1c3RvbS1saW5rXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cIiBhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcIj5cblxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImQtaW5saW5lXCIgW2hyZWZdPVwiY29sdW1uLmRpc2FibGVkPycnOnJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5oeXBlcmxpbmtcIiBbdGFyZ2V0XT0nY29sdW1uLnRhcmdldCc+XG4gICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiFyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmhpZGVGaWVsZFZhbHVlOyBlbHNlIG5vSWNvblwiIFtjbGFzc109XCJjb2x1bW4uaWNvblwiIFt0aXRsZV09XCJjb2x1bW4uaGVhZGVyXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JY29uPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cImNvbHVtbj8ub25DbGljayA/IG9uQ2xpY2tFdmVudChjb2x1bW4sIHJvdykgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaGlkZUZpZWxkVmFsdWU/Jyc6XG4gICAgICAgICAgICAgICAgICAgICAgc2V0Q29uZGl0aW9uQmFzZVZhbHVlKHJvdywgY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2E+XG5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPCEtLSBsaW5rIGNvbHVtbiBmb3IgRWRpdCBDYXNlIC0tPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sdW1uLmFsbG93U2F2ZSB8fCBjb2x1bW4uYWxsb3dTYXZlID09PSB1bmRlZmluZWRcIj5cbiAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIihjb2x1bW4uZWRpdGFibGUgPT09IHRydWUgKSAmJiAoY29sdW1uLmVkaXRMaW5rID09PSB0cnVlIClcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIiFyb3cuaXNOZXdcIiBwSW5wdXRUZXh0IChjbGljayk9XCJjb2x1bW4/Lm9uQ2xpY2sgPyBvbkNsaWNrRXZlbnQoY29sdW1uLCByb3cpIDogJydcIiB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJyb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkrJ19vYmonXT8uZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5oaWRlRmllbGRWYWx1ZSA/ICcnIDogcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlUZXh0ID8gcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlUZXh0IDogY29sdW1uLmRpc3BsYXlUZXh0ID8gY29sdW1uLmRpc3BsYXlUZXh0IDogcm93W2NvbHVtbi5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25Gb2N1c091dEV2ZW50KGNvbHVtbiwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2VFdmVudChjb2x1bW4sIHJvdylcIiAvPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgKm5nSWY9XCJyb3cuaXNOZXdcIiB0eXBlPVwidGV4dFwiIChjbGljayk9XCJjb2x1bW4/Lm9uQ2xpY2sgPyBvbkNsaWNrRXZlbnQoY29sdW1uLCByb3cpIDogJydcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwicm93W2NvbHVtbi5maWVsZC50b0xvd2VyQ2FzZSgpKydfb2JqJ10/LmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5JyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmRpc3BsYXlGaWVsZCA/IHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uZGlzcGxheUZpZWxkIDogcm93W2NvbHVtbi5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25Gb2N1c091dEV2ZW50KGNvbHVtbiwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2VFdmVudChjb2x1bW4sIHJvdylcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8IS0tIDxzcGFuICpuZ0lmPVwiY29sdW1uLmVkaXRhYmxlID09PSBmYWxzZXx8IGNvbHVtbi5lZGl0YWJsZSA9PT0gdW5kZWZpbmVkXCIgPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiY3VzdG9tLWxpbmtcIiAoY2xpY2spPVwib25DbGlja0V2ZW50KGNvbHVtbiwgcm93KVwiIFtocmVmXT1cInJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5oeXBlcmxpbmtcIiBbdGFyZ2V0XT0nY29sdW1uLnRhcmdldCdcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcIj5cbiAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiY29sdW1uLmljb24gJiYgIXJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaGlkZUZpZWxkVmFsdWU7IGVsc2Ugbm9JY29uXCJbY2xhc3NdPVwiY29sdW1uLmljb25cIiBbdGl0bGVdPVwiY29sdW1uLmhlYWRlclwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JY29uPlxuICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5oaWRlRmllbGRWYWx1ZT8nJzpcbiAgICAgICAgICAgICAgICAgICAgc2V0Q29uZGl0aW9uQmFzZVZhbHVlKHJvdywgY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9zcGFuPiAtLT5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIihjb2x1bW4uZWRpdExpbmsgPT09IGZhbHNlfHwgY29sdW1uLmVkaXRMaW5rID09PSB1bmRlZmluZWQpJiYoY29sdW1uLmVkaXRhYmxlID09PSBmYWxzZXx8IGNvbHVtbi5lZGl0YWJsZSA9PT0gdW5kZWZpbmVkKVwiPlxuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkLWlubGluZVwiIFtocmVmXT1cInJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5oeXBlcmxpbmtcIiBbdGFyZ2V0XT1cImNvbHVtbi50YXJnZXQgPyBjb2x1bW4udGFyZ2V0IDogJ19ibGFuaydcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sdW1uLmVkaXRhYmxlID09PSBmYWxzZSA/ICcnIDogYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KSA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiY29sdW1uLmljb24gJiYgIXJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaGlkZUZpZWxkVmFsdWU7IGVsc2Ugbm9JY29uXCJbY2xhc3NdPVwiY29sdW1uLmljb25cIiBbdGl0bGVdPVwiY29sdW1uLmhlYWRlclwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0ljb24+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cImNvbHVtbj8ub25DbGljayA/IG9uQ2xpY2tFdmVudChjb2x1bW4sIHJvdykgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaGlkZUZpZWxkVmFsdWU/Jyc6XG4gICAgICAgICAgICAgICAgICAgICAgc2V0Q29uZGl0aW9uQmFzZVZhbHVlKHJvdywgY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPiBcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGVdPVwiY29sdW1uLnN0eWxlXCIgIGNsYXNzPVwiY3VzdG9tLWxpbmtcIiAgW2NsYXNzXT1cImNvbHVtbi5lZGl0YWJsZSA9PT0gZmFsc2UgfHwgYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KSA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImQtaW5saW5lXCIgW2hyZWZdPVwiY29sdW1uLmRpc2FibGVkPycnOnJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5oeXBlcmxpbmtcIiBbdGFyZ2V0XT1cImNvbHVtbi50YXJnZXQgPyBjb2x1bW4udGFyZ2V0IDogJ19ibGFuaydcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjb2x1bW4uaWNvbiYmICFyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmhpZGVGaWVsZFZhbHVlOyBlbHNlIG5vSWNvblwiIFt0aXRsZV09XCJjb2x1bW4uaGVhZGVyXCIgW2NsYXNzXT1cImNvbHVtbi5pY29uXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vSWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAoY2xpY2spPVwiY29sdW1uPy5vbkNsaWNrID8gb25DbGlja0V2ZW50KGNvbHVtbiwgcm93KSA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaGlkZUZpZWxkVmFsdWU/Jyc6XG4gICAgICAgICAgICAgICAgICAgICAgc2V0Q29uZGl0aW9uQmFzZVZhbHVlKHJvdywgY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvYT5cblxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDwhLS0gSWZyYW1lIGNvbHVtbiBvbiBHcmlkIC0tPlxuICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2lmcmFtZSdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1c3RvbS1saW5rXCIgKGNsaWNrKT1cImdyaWRJRnJhbWUoY29sdW1uLCByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uaHlwZXJsaW5rLCByb3cpXCIgW3RpdGxlXT1cIlxuICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddICYmXG4gICAgICAgICAgICAgICAgKHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLmRpc3BsYXlUZXh0ID09PSBudWxsIHx8IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLmRpc3BsYXlUZXh0ID09PSAnJylcbiAgICAgICAgICAgICAgICAgID8gcm93W2NvbHVtbi5maWVsZF0gOiByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlzcGxheVRleHRcbiAgICAgICAgICAgICAgICAgID8gcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10uZGlzcGxheVRleHRcbiAgICAgICAgICAgICAgICAgIDogY29sdW1uLmRpc3BsYXlUZXh0XG4gICAgICAgICAgICAgICAgICA/IGNvbHVtbi5kaXNwbGF5VGV4dFxuICAgICAgICAgICAgICAgICAgOiByb3dbY29sdW1uLmZpZWxkXVxuXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+ICBcbiAgICAgICAgICAgIDxpICpuZ0lmPVwiY29sdW1uLmljb247IGVsc2Ugbm9JY29uXCJbY2xhc3NdPVwiY29sdW1uLmljb25cIiBbdGl0bGVdPVwiY29sdW1uLmhlYWRlclwiPjwvaT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JY29uPlxuICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10gJiZcbiAgICAgICAgICAgICAgKHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLmRpc3BsYXlUZXh0ID09PSBudWxsIHx8IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLmRpc3BsYXlUZXh0ID09PSAnJylcbiAgICAgICAgICAgICAgPyByb3dbY29sdW1uLmZpZWxkXSA6IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5kaXNwbGF5VGV4dFxuICAgICAgICAgICAgICA/IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLmRpc3BsYXlUZXh0XG4gICAgICAgICAgICAgIDogY29sdW1uLmRpc3BsYXlUZXh0ID8gY29sdW1uLmRpc3BsYXlUZXh0IDogcm93W2NvbHVtbi5maWVsZF1cbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgIDwhLS0gZGlhbG9nIGNvbHVtbiBvbiBHcmlkIC0tPlxuICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZGlhbG9nJ1wiPlxuICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uPy5maWx0ZXI/LnR5cGUgIT09ICdjYWxlbmRhcicgJiYgIXJvdz8uaGlkZWdyaWRidG5cIiBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sdW1uLmVkaXRhYmxlID09PSB0cnVlICYmICFyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmhpZGVGaWVsZFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbYXR0ci5kYXRhLXRpdGxlLWVsZW1lbnRdPVwiY29sdW1uLmhvdmVyRGF0YSA/IG51bGwgOiAnc2VsZidcIlxuICAgICAgICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJyb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkrJ19vYmonXT8uZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpID8gJ2hpZGUtYm9yZGVyJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgcElucHV0VGV4dFxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RMb29rdXBGaWVsZChjb2x1bW4sIHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5RmllbGQgP1xuICAgICAgICAgICAgICAgICAgICAgIHJvd1tyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV0gOiBcbiAgICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwicm93W2NvbHVtbi5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJvbkZvY3VzT3V0RXZlbnQoY29sdW1uLCByb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5kYXRhLXRpdGxlLWVsZW1lbnRdPVwiY29sdW1uLmhvdmVyRGF0YSA/IG51bGwgOiAnc2VsZidcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5lZGl0YWJsZSA9PT0gZmFsc2UgfHwgY29sdW1uLmVkaXRhYmxlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgXCIgY2xhc3M9XCJjdXN0b20tbGlua1wiIFtzdHlsZV09XCJjb2x1bW4uc3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgIGFsbG93RGlzYWJsZWQoY29sdW1uLHJvdykgPyAnZGlzYWJsZWQtbGluaycgOiAnJ1xuICAgICAgICAgICAgICAgICAgICBcIiAoY2xpY2spPVwib3BlbkdyaWREaWFsb2coY29sdW1uLCByb3csICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiKGNvbHVtbi5pY29uIHx8IHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaWNvbikgJiYgIXJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaGlkZUZpZWxkVmFsdWUgOyBlbHNlIG5vSWNvblwiXG4gICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cInJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaWNvbiA/IHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaWNvbiA6IGNvbHVtbi5pY29uXCIgW3RpdGxlXT1cImNvbHVtbi5oZWFkZXJcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vSWNvbj57eyAoIWNvbHVtbi5kaXNwbGF5VGV4dCAmJiByb3cuaXNOZXcgKSB8fCByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmhpZGVGaWVsZFZhbHVlID8gJycgOiBzZXRDb25kaXRpb25CYXNlVmFsdWUocm93LCBjb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgIH19PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb2x1bW4/LmZpbHRlcj8udHlwZSA9PT0gJ2NhbGVuZGFyJyAmJiBjb2x1bW4uZWRpdGFibGUgPT09IHRydWVcIiBbYXR0ci5kYXRhLXRpdGxlLWVsZW1lbnRdPVwiY29sdW1uLmhvdmVyRGF0YSA/IG51bGwgOiAnaW5wdXQnXCI+XG4gICAgICAgICAgICAgICAgPHAtY2FsZW5kYXIgW2NsYXNzXT1cInJvd1tjb2x1bW4uZmllbGQudG9Mb3dlckNhc2UoKSsnX29iaiddPy5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICBbaWRdPVwiYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KSA/ICdoaWRlLWJvcmRlcicgOiAnJ1wiIChvbkNsb3NlKT1cIm9uRm9jdXNPdXRFdmVudChjb2x1bW4sIHJvdylcIlxuICAgICAgICAgICAgICAgICAgW21pbkRhdGVdPVwiY29sdW1uLm1pbkRhdGVcIiBbbWF4RGF0ZV09XCJjb2x1bW4ubWF4RGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwiJ2JvZHknXCIgaG91ckZvcm1hdD1cIjEyXCIgW3Nob3dUaW1lXT1cImNvbHVtbi5zaG93VGltZVwiIChjbGljayk9XCJvbkNsaWNrRXZlbnQoY29sdW1uLCByb3cpXCJcbiAgICAgICAgICAgICAgICAgIFt0aW1lT25seV09XCJjb2x1bW4udGltZU9ubHlcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmRpc3BsYXlGaWVsZCA/XG4gICAgICAgICAgICAgICAgICAgIHJvd1tyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmRpc3BsYXlGaWVsZC50b0xvd2VyQ2FzZSgpXSA6IHJvd1tjb2x1bW4uZmllbGRdXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpXCI+PC9wLWNhbGVuZGFyPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sdW1uPy5maWx0ZXI/LnR5cGUgPT09ICdjYWxlbmRhcicgJiYgIWNvbHVtbi5lZGl0YWJsZVwiIGNsYXNzPVwiY3VzdG9tLWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwicm93LmRpc2FibGVkICAgfHwgYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KSA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5HcmlkRGlhbG9nKGNvbHVtbiwgcm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPnt7IHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaGlkZUZpZWxkVmFsdWUgPyAnJyA6IHNldENvbmRpdGlvbkJhc2VWYWx1ZShyb3csIGNvbHVtbikgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1c3RvbS1saW5rXCIgW3N0eWxlXT1cImNvbHVtbi5zdHlsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJyb3cuZGlzYWJsZWQgICB8fCBhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkdyaWREaWFsb2coY29sdW1uLCByb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGl0bGUtZWxlbWVudF09XCJjb2x1bW4uaG92ZXJEYXRhID8gbnVsbCA6ICdzZWxmJ1wiPlxuICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCIoY29sdW1uLmljb24gfHwgcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5pY29uKSAmJiAhcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5oaWRlRmllbGRWYWx1ZSA7IGVsc2Ugbm9JY29uXCJbdGl0bGVdPVwiY29sdW1uLmhlYWRlclwiIFtjbGFzc109XCJyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/Lmljb24gPyByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/Lmljb24gOiBjb2x1bW4uaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0ljb24+e3sgcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5oaWRlRmllbGRWYWx1ZSA/ICcnIDogc2V0Q29uZGl0aW9uQmFzZVZhbHVlKHJvdywgY29sdW1uKSB9fTwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPCEtLSB7eyBzZXRDb25kaXRpb25CYXNlVmFsdWUocm93LCBjb2x1bW4pIH19XG4gICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhcm93W2NvbHVtbi5maWVsZCArICdfc2Vjb25kVHlwZSddICYmICFyb3cuaGlkZWdyaWRidG5cIiAtLT5cblxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPCEtLSB0ZXN0IC0tPlxuICAgICAgICA8IS0tIGxvb2t1cCBJbnB1dCBjb2x1bW4gb24gR3JpZCAtLT5cbiAgICAgICAgPHNwYW4gICAqbmdTd2l0Y2hDYXNlPVwiJ2xvb2t1cF9pbnB1dCdcIj5cbiAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICAgIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbG9zZS1pY29uLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgW2F0dHIuZGF0YS10aXRsZS1lbGVtZW50XT1cImNvbHVtbi5ob3ZlckRhdGEgPyBudWxsIDogJ3NlbGYnXCIgcmVhZG9ubHkgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3c/LmlzTmV3IHx8IHJvdz8uaXNuZXcgPyB0eXBlT2Yocm93W2NvbHVtbi5maWVsZF0pID09PSAnb2JqZWN0JyA/IHJvd1tjb2x1bW4uZmllbGRdPy50ZXh0IDogcm93W2NvbHVtbi5maWVsZF0gOiByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmRpc3BsYXlGaWVsZCAgPyByb3dbcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCldIDpcbiAgICAgICAgICAgICAgICAgIHR5cGVPZihyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LnRleHQpID09PSAnb2JqZWN0JyAmJiByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LnRleHQ/Lmhhc093blByb3BlcnR5KCd0ZXh0JykgPyByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LnRleHQ/LnRleHQgOiBcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5kaXNwbGF5RmllbGQgPyByb3dbY29sdW1uLmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV0gOiByb3dbY29sdW1uLmZpZWxkXVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIChrZXl1cC50YWIpPVwic2VsZWN0TG9va3VwRmllbGQoY29sdW1uLCByb3cpXCIgW2Rpc2FibGVkXT1cImFsbG93RGlzYWJsZWQoY29sdW1uLHJvdylcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdExvb2t1cEZpZWxkKGNvbHVtbiwgcm93KVwiIFtpZF09XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpID8gJ2hpZGUtYm9yZGVyJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJyb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkrJ19vYmonXT8uZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJ3ByaW1lLWlucHV0J1wiIChibHVyKT1cIm9uRm9jdXNPdXRFdmVudChjb2x1bW4sIHJvdylcIiAvPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KVwiPjxidXR0b24gKm5nSWY9XCJyb3dbY29sdW1uLmZpZWxkXSAmJiB0eXBlT2Yocm93W2NvbHVtbi5maWVsZF0pID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgICAgICAgPyByb3dbY29sdW1uLmZpZWxkXS50ZXh0XG4gICAgICAgICAgICAgICAgICA6IHJvd1tjb2x1bW4uZmllbGRdICYmICFjb2x1bW4uZGlzYWJsZWRcIiBpY29uPVwicGkgcGktdGltZXNcIiBwQnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibG9va3VwQ2xlYXJWYWx1ZShjb2x1bW4scm93KVwiPjwvYnV0dG9uPjwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCIgPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbHVtbi5saW5rSWRcIiA+XG4gICAgICAgICAgICAgICAgPGEgW2F0dHIuZGF0YS10aXRsZS1lbGVtZW50XT1cImNvbHVtbi5ob3ZlckRhdGEgPyBudWxsIDogJ3NlbGYnXCIgW2hyZWZdPVwicm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/Lmh5cGVybGlua1wiIFt0YXJnZXRdPVwiY29sdW1uLnRhcmdldCA9PT0gJ19zZWxmJyA/ICcnIDogICdfYmxhbmsnXCI+XG4gICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICBzZXRMb29rdXBSZWFkT25seVZhbHVlKHJvdywgY29sdW1uKVxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuZGF0YS10aXRsZS1lbGVtZW50XT1cImNvbHVtbi5ob3ZlckRhdGEgPyBudWxsIDogJ3NlbGYnXCIgKm5nSWY9XCIhY29sdW1uLmxpbmtJZFwiIFtzdHlsZV09XCJjb2x1bW4uc3R5bGVcIiBbY2xhc3NdPVwiY29sdW1uLmNvbXBvbmVudCAmJiBjb2x1bW4uZWRpdExpbmsgPT09IHRydWUgPyAnY3VzdG9tLWxpbmsnIDogJydcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuTG9va3VwSHlwZXJsaW5rKGNvbHVtbiwgcm93KVwiICAgPlxuICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICBzZXRMb29rdXBSZWFkT25seVZhbHVlKHJvdywgY29sdW1uKVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8IS0tIE51bWVyaWMgSW5wdXQgY29sdW1uIG9uIEdyaWQgLS0+XG4gICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInbnVtZXJpYydcIj5cbiAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgIDwhLS0gZm9yIEN1cnJlbmN5ICYmIERlY2ltYWwgJiYgUGVyY2VudCAtLT5cbiAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuZGF0YS10aXRsZS1lbGVtZW50XT1cImNvbHVtbi5ob3ZlckRhdGEgPyBudWxsIDogJ2lucHV0J1wiIGNsYXNzPVwiaW5wdXQtbnVtYmVyXCI+XG4gICAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgW2lkXT1cImFsbG93RGlzYWJsZWQoY29sdW1uLHJvdykgPyAnaGlkZS1ib3JkZXInIDogJydcIiBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZC50b0xvd2VyQ2FzZSgpKydfb2JqJ10/LmVycm9yTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmctaW52YWxpZCBuZy1kaXJ0eSdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2Zvcm0tY29udHJvbCdcbiAgICAgICAgICAgICAgICAgICAgXCIgW3Nob3dCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5RmllbGQgPyByb3dbcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCldIDogcm93W2NvbHVtbi5maWVsZF1cIiBbbmFtZV09XCJjb2x1bW4uZmllbGRcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFsbG93RGlzYWJsZWQoY29sdW1uLHJvdylcIiAob25Gb2N1cyk9XCJvbkZvY3VzRXZlbnQoY29sdW1uLCByb3cpXCJcbiAgICAgICAgICAgICAgICAgIChvbkJsdXIpPVwib25Gb2N1c091dEV2ZW50KGNvbHVtbiwgcm93KVwiIFttb2RlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5mb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZm9ybWF0LnR5cGUgPT09ICdjdXJyZW5jeSdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2N1cnJlbmN5J1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnZGVjaW1hbCdcbiAgICAgICAgICAgICAgICAgICAgXCIgW2N1cnJlbmN5XT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5mb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZm9ybWF0LnR5cGUgPT09ICdjdXJyZW5jeScgJiZcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZm9ybWF0LmZvcm1hdFBhcmFtcyAmJlxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5mb3JtYXQuZm9ybWF0UGFyYW1zLmN1cnJlbmN5XG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNvbHVtbi5mb3JtYXQuZm9ybWF0UGFyYW1zLmN1cnJlbmN5XG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdVU0QnXG4gICAgICAgICAgICAgICAgICAgIFwiIFtsb2NhbGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmZvcm1hdCAmJlxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5mb3JtYXQudHlwZSA9PT0gJ2N1cnJlbmN5JyAmJlxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5mb3JtYXQuZm9ybWF0UGFyYW1zICYmXG4gICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmZvcm1hdC5mb3JtYXRQYXJhbXMubG9jYWxlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNvbHVtbi5mb3JtYXQuZm9ybWF0UGFyYW1zLmxvY2FsZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnZW4tVVMnXG4gICAgICAgICAgICAgICAgICAgIFwiIFttaW5GcmFjdGlvbkRpZ2l0c109XCJjb2x1bW4uZm9ybWF0ID8gc2V0TnVtZXJpY01pbk14RnJhY3Rpb24oY29sdW1uKSA6ICcwJ1wiXG4gICAgICAgICAgICAgICAgICBbbWF4RnJhY3Rpb25EaWdpdHNdPVwiY29sdW1uLmZvcm1hdCA/IHNldE51bWVyaWNNaW5NeEZyYWN0aW9uKGNvbHVtbikgOiAnMCdcIiBbc3VmZml4XT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5mb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZm9ybWF0LnR5cGUgPT09ICdwZXJjZW50JyAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICclJ1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgIDwvcC1pbnB1dE51bWJlcj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xvY2tlZF9maWVsZD48c3BhbiAqbmdJZj1cIiFyb3cuaXNOZXdcIiAgW2F0dHIuZGF0YS10aXRsZS1lbGVtZW50XT1cImNvbHVtbi5ob3ZlckRhdGEgPyBudWxsIDogJ3NlbGYnXCI+XG4gICAgICAgICAgICAgICAgICB7eyByb3dbY29sdW1uLmZpZWxkXSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cbiAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLmRhdGEtdGl0bGUtZWxlbWVudF09XCJjb2x1bW4uaG92ZXJEYXRhID8gbnVsbCA6ICdzZWxmJ1wiPiBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgIHNldE51bWVyaWNGb3JtYXQoY29sdW1uLCByb3cpXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDwhLS0gQnV0dG9uIGNvbHVtbiBvbiBHcmlkIC0tPlxuICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2FkZF9idXR0b24nXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhcm93LmhpZGVncmlkYnRuXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICAgIFtpY29uXT1cInJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaWNvbiA/IHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaWNvbiA6IGNvbHVtbi5pY29uXCJcbiAgICAgICAgICAgICAgW25hbWVdPVwiY29sdW1uLmhlYWRlclwiIGNsYXNzPVwibWVyZ2UtYnRuXCIgW2Rpc2FibGVkXT1cImFsbG93RGlzYWJsZWQoY29sdW1uLHJvdylcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwicm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5VGV4dCA/IHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uZGlzcGxheVRleHQgOiBjb2x1bW4udmFsdWVcIlxuICAgICAgICAgICAgICBjbGFzcz1cImdyaWQtY29tcG9uZW50LWdyaWQtYWRkLWJ0blwiIChjbGljayk9XCJvbkNsaWNrQnV0dG9uKGNvbHVtbiwgcm93KVwiPjwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NwYW4+IFxuICAgICAgICBcbiAgICAgICAgPCEtLSBHZW5lcmF0ZSBGaWxlIEJ1dHRvbiBjb2x1bW4gb24gR3JpZCAtLT5cbiAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidnZW5lcmF0ZV9maWxlX2J1dHRvbidcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHNlLWdlbmVyYXRlLWltcG9ydC1maWxlXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmRpc3BsYXlUZXh0ID8gcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5VGV4dCA6IGNvbHVtbi52YWx1ZVwiXG4gICAgICAgICAgICAgIFtpY29uXT1cInJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaWNvbiA/IHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaWNvbiA6IGNvbHVtbi5pY29uXCJcbiAgICAgICAgICAgICAgW2RpYWxvZ0RhdGFdPVwiY29sdW1uLmRhdGFcIlxuICAgICAgICAgICAgICBbc2VsZWN0ZWRSb3ddPVwicm93XCJcbiAgICAgICAgICAgID48L3NlLWdlbmVyYXRlLWltcG9ydC1maWxlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NwYW4+IFxuXG4gICAgICAgIDwhLS0gRGF0ZSBjb2x1bW4gb24gR3JpZCAtLT5cbiAgICAgICAgPCEtLSBjYWxlbmRhciBzZWxlY3RvciAtLT5cbiAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiIFxuICAgICAgICBbYXR0ci5kYXRhLXRpdGxlLWVsZW1lbnRdPVwiY29sdW1uLmhvdmVyRGF0YT8gbnVsbDogZWRpdEFsbFJvd3MgPyAnaW5wdXQnIDogJ3NlbGYnIFwiIFxuICAgICAgICA+XG4gICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiID5cbiAgICAgICAgICAgICAgPHAtY2FsZW5kYXJcbiAgICAgICAgICAgICAgICBbbWluRGF0ZV09XCJjb2x1bW4ubWluRGF0ZVwiIFttYXhEYXRlXT1cImNvbHVtbi5tYXhEYXRlXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwicm93W2NvbHVtbi5maWVsZC50b0xvd2VyQ2FzZSgpKydfb2JqJ10/LmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5ICcgKyBjb2x1bW4uZmllbGQgKyByb3dbZGF0YUtleV0gOiBjb2x1bW4uZmllbGQgKyByb3dbZGF0YUtleV1cIlxuICAgICAgICAgICAgICAgIFtpZF09XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpID8gJ2hpZGUtYm9yZGVyJyA6ICcnXCIgKG9uQ2xvc2UpPVwib25Gb2N1c091dEV2ZW50KGNvbHVtbiwgcm93KVwiXG4gICAgICAgICAgICAgICAgW2FwcGVuZFRvXT1cIidib2R5J1wiIGhvdXJGb3JtYXQ9XCIxMlwiIFtkZWZhdWx0RGF0ZV09XCJkZWZhdWx0RGF0ZVwiXG4gICAgICAgICAgICAgICAgW3N0ZXBNaW51dGVdPVwiY29sdW1uLm1pbnV0ZXNJbnRlcnZhbCA/IGNvbHVtbi5taW51dGVzSW50ZXJ2YWwgOiAxXCIgW3Nob3dUaW1lXT1cImNvbHVtbi5zaG93VGltZVwiXG4gICAgICAgICAgICAgICAgW3RpbWVPbmx5XT1cImNvbHVtbi50aW1lT25seVwiIFtkYXRlRm9ybWF0XT1cImNvbHVtbi5mb3JtYXQgPyBjb2x1bW4uZm9ybWF0LnR5cGUgOiBjYWxlbmRhckZvcm1hdFwiXG4gICAgICAgICAgICAgICAgKGtleXVwKT1cImNhbGVuZGFySW5wdXRWYWx1ZShjb2x1bW4sIHJvdylcIiAob25TaG93KT1cIm9uQ2xpY2tFdmVudChjb2x1bW4sIHJvdylcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5RmllbGQgPyByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmRpc3BsYXlGaWVsZCA6IHJvd1tjb2x1bW4uZmllbGRdXCJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpXCJcbiAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbkJhcl09XCIhY29sdW1uLnRpbWVPbmx5XCI+PC9wLWNhbGVuZGFyPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIiA+XG4gICAgICAgICAgICAgIHt7IHNldENvbmRpdGlvbkJhc2VWYWx1ZShyb3csY29sdW1uKSB9fVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgPC9zcGFuPlxuXG5cbiAgICAgICAgPHNwYW4gKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICA8c3BhbiBbbmdTd2l0Y2hdPVwiY29sdW1uLnR5cGVcIj5cbiAgICAgICAgICAgIDwhLS0gRHJvcGRvd24gY29sdW1uIG9uIEdyaWQgLS0+XG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2Ryb3Bkb3duJ1wiIFtjbGFzc109XCJkcm9wZG93bklucHV0ID8gJycgOiAnb3V0cHV0LWRyb3Bkb3duJ1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRpdGxlLWVsZW1lbnRdPVwiIGNvbHVtbi5ob3ZlckRhdGE/IG51bGw6IGVkaXRBbGxSb3dzID8gJy5wLWRyb3Bkb3duLWxhYmVsJyA6ICdzZWxmJ1wiPlxuICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gKm5nSWY9XCIhcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5oaWRkZW5cIiBbb3B0aW9uc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkrJ19kYXRhJ11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyByb3dbY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpKydfZGF0YSddXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogY29sdW1uLmRhdGFcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uZGlzcGxheUZpZWxkPy50b0xvd2VyQ2FzZSgpID8gcm93W3Jvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uZGlzcGxheUZpZWxkLnRvTG93ZXJDYXNlKCldIDogcm93W2NvbHVtbi5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KVwiIFtwbGFjZWhvbGRlcl09XCJyb3dbY29sdW1uLmRpc3BsYXlGaWVsZF1cbiAgICAgICAgICAgICAgICAgICAgICA/IHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkXVxuICAgICAgICAgICAgICAgICAgICAgIDogcm93W2NvbHVtbi5maWVsZF0gPyByb3dbY29sdW1uLmZpZWxkXSA6ICdTZWxlY3QnXCIgW3Nob3dDbGVhcl09XCJyb3dbY29sdW1uLmZpZWxkXSA/IHRydWUgOiBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJjb2x1bW4ub3B0aW9uTGFiZWxcIiAoY2xpY2spPVwib25DbGlja0V2ZW50KGNvbHVtbiwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25WYWx1ZV09XCJjb2x1bW4ub3B0aW9uVmFsdWVcIiBbY2xhc3NdPVwicm93W2NvbHVtbi5maWVsZC50b0xvd2VyQ2FzZSgpKydfb2JqJ10/LmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5JyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cImFsbG93RGlzYWJsZWQoY29sdW1uLHJvdykgPyAnaGlkZS1ib3JkZXInIDogJydcIiAoYmx1cik9XCJvbkZvY3VzT3V0RXZlbnQoY29sdW1uLCByb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoY29sdW1uLCByb3cpXCIgW2ZpbHRlcl09XCJjb2x1bW4uYWxsb3dTZWFyY2hcIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICBzZXREcm9wZHdvblJlYWRPbmx5VmFsdWUocm93LCBjb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgIDwhLS0gTXVsdGlTZWxlY3QgY29sdW1uIG9uIEdyaWQgLS0+XG4gICAgICAgICAgICA8IS0tIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCkgPyByb3dbcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5RmllbGQudG9Mb3dlckNhc2UoKV0gOlxuICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF1cIiAtLT5cbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInbXVsdGktc2VsZWN0J1wiIFthdHRyLmRhdGEtdGl0bGUtZWxlbWVudF09XCJjb2x1bW4uaG92ZXJEYXRhID8gbnVsbCA6ICcucC1tdWx0aXNlbGVjdC1sYWJlbCdcIj5cbiAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0IFtjbGFzc109XCJyb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkrJ19vYmonXT8uZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgICAgICAgICAgICBbaWRdPVwiYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KSA/ICdoaWRlLWJvcmRlcicgOiAnJ1wiIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmZpZWxkXVwiXG4gICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KVwiXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbHVtbi5kYXRhXCIgW29wdGlvbkxhYmVsXT1cImNvbHVtbi5vcHRpb25MYWJlbFwiIFtvcHRpb25WYWx1ZV09XCJjb2x1bW4ub3B0aW9uVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChjb2x1bW4sIHJvdylcIiAob25QYW5lbFNob3cpPVwic2hvd09wdGlvbihjb2x1bW4sIHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGlja0V2ZW50KGNvbHVtbiwgcm93KVwiIFthcHBlbmRUb109XCInYm9keSdcIiAoYmx1cik9XCJvbkZvY3VzT3V0RXZlbnQoY29sdW1uLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAgW2F0dHIuZGF0YS10aXRsZS1lbGVtZW50XT1cImNvbHVtbi5ob3ZlckRhdGEgPyBudWxsIDogJ3NlbGYnXCIgPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmRpc3BsYXlGaWVsZF1cbiAgICAgICAgICAgICAgICAgICAgPyByb3dbY29sdW1uLmRpc3BsYXlGaWVsZF0gOlxuICAgICAgICAgICAgICAgICAgICBzZXRNdWx0aVNlbGVjdERhdGEoY29sdW1uLCByb3dbY29sdW1uLmZpZWxkXSlcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgPCEtLSBBdXRvQ29tcGxldGUgU2VhcmNoIC0tPlxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidBdXRvQ29tcGxldGUnXCI+XG4gICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICA8cC1hdXRvQ29tcGxldGUgXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJyb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkrJ19vYmonXT8uZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgICAgICAgICAgICBbaWRdPVwiYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KSA/ICdoaWRlLWJvcmRlcicgOiAnJ1wiIFxuICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJjb2x1bW4uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW3N1Z2dlc3Rpb25zXT1cImNvbHVtbi5kYXRhXCIgXG4gICAgICAgICAgICAgICAgICAgIChvblNlbGVjdCk9XCJhdXRvQ29tcGxldGVTZWxlY3RlZFZhbHVlKHJvdywgY29sdW1uLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImNvbHVtbi5vcHRpb25MYWJlbCA/IGNvbHVtbi5vcHRpb25MYWJlbD8udG9Mb3dlckNhc2UoKSA6IGNvbHVtbi5kaXNwbGF5RmllbGQgPyBjb2x1bW4uZGlzcGxheUZpZWxkPy50b0xvd2VyQ2FzZSgpIDogY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmRpc3BsYXlGaWVsZCA/IHJvd1tyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmRpc3BsYXlGaWVsZC50b0xvd2VyQ2FzZSgpXSA6XG4gICAgICAgICAgICAgICAgICAgIHR5cGVPZihyb3dbY29sdW1uLmZpZWxkXSkgPT09ICdvYmplY3QnICYmIHJvd1tjb2x1bW4uZmllbGRdPy50ZXh0ID9cbiAgICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0/LnRleHQgOlxuICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXVwiXG4gICAgICAgICAgICAgICAgICAgIFtkcm9wZG93bl09XCJjb2x1bW4uc2hvd09wdGlvblwiIFxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGNvbHVtbiwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrRXZlbnQoY29sdW1uLCByb3cpXCIgXG4gICAgICAgICAgICAgICAgICAgIChjb21wbGV0ZU1ldGhvZCk9XCJhdXRvU2VhcmNoKCRldmVudCwgY29sdW1uLCByb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uQmx1cik9XCJvbkZvY3VzT3V0RXZlbnQoY29sdW1uLCByb3csICRldmVudClcIiBcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFsbG93RGlzYWJsZWQoY29sdW1uLHJvdylcIiBcbiAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvbkF1dG9Db21wbGV0ZUtleUVudGVyRXZlbnQoJGV2ZW50LCBjb2x1bW4sIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgIDwvcC1hdXRvQ29tcGxldGU+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd1tjb2x1bW4uZmllbGRdICYmIHJvd1tjb2x1bW4uZmllbGRdWzBdICYmICByb3dbY29sdW1uLmZpZWxkXVswXVtjb2x1bW4uZGlzcGxheUZpZWxkXVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgdmFsdWUgb2Ygcm93W2NvbHVtbi5maWVsZF07IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyByb3dbY29sdW1uLmZpZWxkXSAmJiByb3dbY29sdW1uLmZpZWxkXS5sZW5ndGggPiAxID8gcm93W2NvbHVtbi5maWVsZF0ubGVuZ3RoIC0xID09PSBpID9cbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtjb2x1bW4uZGlzcGxheUZpZWxkXSA6IHZhbHVlW2NvbHVtbi5kaXNwbGF5RmllbGRdICsgJzsnIDogdmFsdWVbY29sdW1uLmRpc3BsYXlGaWVsZF0gfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3dbY29sdW1uLmZpZWxkXSAmJiByb3dbY29sdW1uLmZpZWxkXVswXSAmJiAgcm93W2NvbHVtbi5maWVsZF1bMF1bY29sdW1uLmZpZWxkXSAmJiAhY29sdW1uLmRpc3BsYXlGaWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgdmFsdWUgb2Ygcm93W2NvbHVtbi5maWVsZF07IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyByb3dbY29sdW1uLmZpZWxkXSAmJiByb3dbY29sdW1uLmZpZWxkXS5sZW5ndGggPiAxID8gcm93W2NvbHVtbi5maWVsZF0ubGVuZ3RoIC0xID09PSBpID9cbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtjb2x1bW4uZmllbGRdIDogdmFsdWVbY29sdW1uLmZpZWxkXSArICc7JyA6IHZhbHVlW2NvbHVtbi5maWVsZF0gfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPCEtLSBBZGQgR2VuZXJhdGUgUmVwb3J0IEJ1dHRvbiAtLT5cbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCIncmVwb3J0J1wiPlxuICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cbiAgICAgICAgICAgICAgICAgIDxzZS1nZW5lcmF0ZS1yZXBvcnQtYnRuIFtyZXBJbmZvXT1cInNldFJlcG9ydE5hbWUoY29sdW1uLCByb3cpXCIgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgIFtwYXJhbXNdPVwic2V0UmVwb3J0UGFyYW1zKGNvbHVtbiwgcm93KVwiIFtjbGFzc109XCJjb2x1bW4uY2xhc3NcIiBbc2hvd0RpYWxvZ109XCJjb2x1bW4uc2hvd0RpYWxvZ1wiXG4gICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImNvbHVtbi5pY29uXCIgW3JlcG9ydFR5cGVdPVwiY29sdW1uLnJlcG9ydFR5cGVcIj48L3NlLWdlbmVyYXRlLXJlcG9ydC1idG4+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgIDxzZS1nZW5lcmF0ZS1yZXBvcnQtYnRuIFtyZXBJbmZvXT1cInNldFJlcG9ydE5hbWUoY29sdW1uLCByb3cpXCIgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgIFtwYXJhbXNdPVwic2V0UmVwb3J0UGFyYW1zKGNvbHVtbiwgcm93KVwiIFtpY29uXT1cImNvbHVtbi5pY29uXCIgW2NsYXNzXT1cImNvbHVtbi5jbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgIFtzaG93RGlhbG9nXT1cImNvbHVtbi5zaG93RGlhbG9nXCIgW3JlcG9ydFR5cGVdPVwiY29sdW1uLnJlcG9ydFR5cGVcIj48L3NlLWdlbmVyYXRlLXJlcG9ydC1idG4+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaERlZmF1bHQgIFthdHRyLmRhdGEtdGl0bGUtZWxlbWVudF09XCJjb2x1bW4uaG92ZXJEYXRhID8gbnVsbCA6ICdpbnB1dCdcIj5cbiAgICAgICAgICAgICAgPCEtLSBJbnB1dCBjb2x1bW4gb24gR3JpZCAtLT5cbiAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj4gICAgICBcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtzdHlsZV09XCJjb2x1bW4uc3R5bGUgPyBjb2x1bW4uc3R5bGUgOiAnZGlzcGxheTpmbGV4J1wiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IFt0eXBlXT1cInJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8udGV4dFR5cGU/cm93W2NvbHVtbi5maWVsZCsnX29iaiddPy50ZXh0VHlwZTpjb2x1bW4udGV4dFR5cGU/Y29sdW1uLnRleHRUeXBlOid0ZXh0J1wiIFxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cInJvd1tjb2x1bW4uZmllbGQudG9Mb3dlckNhc2UoKSsnX29iaiddPy5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAncHJpbWUtaW5wdXQnXCJcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cImFsbG93RGlzYWJsZWQoY29sdW1uLHJvdykgPyAnaGlkZS1ib3JkZXInIDogJydcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy51bmRlZmluZWQgPyAnJyA6IGFsbG93RGlzYWJsZWQoY29sdW1uLHJvdykgJiYgcm93W2NvbHVtbi5kaXNwbGF5RmllbGRdID9cbiAgICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkXSA6IHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXSAmJiByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10udmFsdWUgPyByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10udmFsdWUgOiByb3dbY29sdW1uLmZpZWxkXVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25Gb2N1c091dEV2ZW50KGNvbHVtbiwgcm93KVwiIChjaGFuZ2UpPVwib25DaGFuZ2VFdmVudChjb2x1bW4sIHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGlja0J1dHRvbihjb2x1bW4sIHJvdylcIiAqbmdJZj1cImNvbHVtbi5maWVsZCAhPT0gZGF0YUtleTsgZWxzZSBsb2NrZWRfZmllbGRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsb2F0OnJpZ2h0XCIgKm5nSWY9XCJjb2x1bW4uZm9ybWF0PT0ncGFzc3dvcmQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgIFtjbGFzc109XCJyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/KHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXS50ZXh0VHlwZT09J3Bhc3N3b3JkJz8ncGkgcGktZXllJzoncGkgcGktZXllLXNsYXNoJyk6Y29sdW1uLnRleHRUeXBlPT0ncGFzc3dvcmQnPydwaSBwaS1leWUnOidwaSBwaS1leWUtc2xhc2gnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VQYXNzd29yZFR5cGUoY29sdW1uLCByb3cpXCIgW3RpdGxlXT1cImNvbHVtbi5oZWFkZXJcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4gXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xvY2tlZF9maWVsZD48c3BhbiAqbmdJZj1cIiFyb3cuaXNOZXdcIiAgW2F0dHIuZGF0YS10aXRsZS1lbGVtZW50XT1cImNvbHVtbi5ob3ZlckRhdGEgPyBudWxsIDogJ3NlbGYnXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgcm93W2NvbHVtbi5maWVsZF0gfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGVdPVwiY29sdW1uLnN0eWxlID8gY29sdW1uLnN0eWxlIDogJ2Rpc3BsYXk6ZmxleCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cIm9uQ2xpY2tFdmVudChjb2x1bW4sIHJvdylcIiBbYXR0ci5kYXRhLXRpdGxlLWVsZW1lbnRdPVwiY29sdW1uLmhvdmVyRGF0YSA/IG51bGwgOiAnc2VsZicgXCIgXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cInJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8udGV4dFR5cGUgPyhyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LnRleHRUeXBlPT0ncGFzc3dvcmQnICA/J3Bhc3N3b3JkJzonJykgOmNvbHVtbi50ZXh0VHlwZT09J3Bhc3N3b3JkJz8ncGFzc3dvcmQnOicnXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgc2V0VGV4dEJveFJlYWRPbmx5VmFsdWUocm93LCBjb2x1bW4pIH19IFxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZmxvYXQ6cmlnaHRcIiAqbmdJZj1cImNvbHVtbi5mb3JtYXQ9PSdwYXNzd29yZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwicm93W2NvbHVtbi5maWVsZCsnX29iaiddPyhyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10udGV4dFR5cGU9PSdwYXNzd29yZCc/J3BpIHBpLWV5ZSc6J3BpIHBpLWV5ZS1zbGFzaCcpOmNvbHVtbi50ZXh0VHlwZT09J3Bhc3N3b3JkJz8ncGkgcGktZXllJzoncGkgcGktZXllLXNsYXNoJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImNvbHVtbi5oZWFkZXJcIiAoY2xpY2spPVwiY2hhbmdlUGFzc3dvcmRUeXBlKGNvbHVtbiwgcm93KVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8IS0tIEdyaWQgUm93cyBEYXRhIEJpbmRpbmdzIEVuZCAtLT5cblxuICAgICAgICA8IS0tIEFjdGlvbiBjb2x1bW4gb24gR3JpZCAtLT5cbiAgICAgICAgPHRkICpuZ0lmPVwiIXNldEFjdGlvbkNvbHVtbkFzRmlyc3QgJiYgY29sdW1ucz8ubGVuZ3RoID4gMCAmJiBjb2x1bW5BY3Rpb25zLmxlbmd0aCA+IDBcIlxuICAgICAgICAgIGNsYXNzPVwiZm9yLWJ1dHRvbnNcIlxuICAgICAgICAgIFtjbGFzc109XCJpbkVkaXRNb2RlID8gJ3RocmVlLWFjdGlvbi1idG4nIDogJ3R3by1hY3Rpb24tYnRuJ1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWN0aW9uLWJ0blwiICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgY29sdW1uQWN0aW9uc1wiPlxuICAgICAgICAgICAgPGkgW3RpdGxlXT1cImFjdGlvbi50b29sdGlwXCIgW2NsYXNzXT1cImFjdGlvbi5pY29uXCIgKGNsaWNrKT1cImhhbmRsZUFjdGlvbkNsaWNrKCRldmVudCwgYWN0aW9uLCByb3cpXCI+PC9pPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkXG4gICAgICAgICAgKm5nSWY9XCIhc2V0QWN0aW9uQ29sdW1uQXNGaXJzdCAmJiBjb2x1bW5zPy5sZW5ndGggPiAwICYmIHVzZUlubGluZUNSVUQgJiYgKGRlbGV0ZVJvd1Blcm1pc3Npb24gfHwgZWRpdFJvd1Blcm1pc3Npb24pXCJcbiAgICAgICAgICBbY2xhc3NdPVwiaW5FZGl0TW9kZSA/ICd0aHJlZS1hY3Rpb24tYnRuJyA6ICd0d28tYWN0aW9uLWJ0bidcIlxuICAgICAgICAgIGNsYXNzPVwiZm9yLWJ1dHRvbnNcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImRpc2FibGVkU2F2ZUJ0biA/ICdoaWRlLWNsZWFyLWZpbHRlci1idXR0b24nIDogJydcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz0nc2V0QWN0aW9uQ29sdW1uV2lkdGgnPlxuICAgICAgICAgICAgPHNlLWdyaWQtcm93LWFjdGlvbnMgW2VkaXRpbmddPVwiZWRpdGluZ1wiIFtlZGl0Um93UGVybWlzc2lvbl09XCJlZGl0Um93UGVybWlzc2lvblwiXG4gICAgICAgICAgICAgIFtkZWxldGVSb3dQZXJtaXNzaW9uXT1cImRlbGV0ZVJvd1Blcm1pc3Npb25cIiBbaGlkZURlbGV0ZUJ0bl09XCJoaWRlRGVsZXRlQnRuXCIgW2hpZGVFZGl0QnRuXT1cImhpZGVFZGl0QnRuXCJcbiAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIiAob25Sb3dFZGl0SW5pdEJ0bik9XCJvblJvd0VkaXRJbml0KCRldmVudClcIiAoZGVsZXRlUmVjb3JkQnRuKT1cImRlbGV0ZVJlY29yZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9uUm93RWRpdFNhdmVCdG4pPVwib25Sb3dFZGl0U2F2ZSgkZXZlbnQpXCIgKG9uUm93RWRpdENhbmNlbEJ0bik9XCJvblJvd0VkaXRDYW5jZWwoJGV2ZW50LCByaSlcIlxuICAgICAgICAgICAgICBbZWRpdEFsbFJvd3NdPVwiZWRpdEFsbFJvd3NcIj5cbiAgICAgICAgICAgIDwvc2UtZ3JpZC1yb3ctYWN0aW9ucz5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIEZvb3RlciBjb2x1bW5zIG9uIEdyaWQgLS0+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiPlxuICAgICAgPHRyICpuZ0lmPVwiYWdncmVnYXRlRm9vdGVyXCI+XG4gICAgICAgIDx0ZFxuICAgICAgICAgICpuZ0lmPVwic2V0QWN0aW9uQ29sdW1uQXNGaXJzdCAmJiAoY29sdW1uQWN0aW9ucy5sZW5ndGggPiAwIHx8ICh1c2VJbmxpbmVDUlVEICYmIChkZWxldGVSb3dQZXJtaXNzaW9uIHx8IGVkaXRSb3dQZXJtaXNzaW9uKSkpXCJcbiAgICAgICAgICBbY2xhc3NdPVwiaW5FZGl0TW9kZSA/ICd0aHJlZS1hY3Rpb24tYnRuJyA6ICd0d28tYWN0aW9uLWJ0bidcIj48L3RkPlxuICAgICAgICA8dGQgKm5nSWY9XCJhbGxvd1NlbGVjdGlvblwiIFtjbGFzc109XCJpbkVkaXRNb2RlID8gJ3RocmVlLWFjdGlvbi1idG4nIDogJ3R3by1hY3Rpb24tYnRuJ1wiPjwvdGQ+XG4gICAgICAgIDx0ZCAqbmdGb3I9XCJsZXQgb3V0ZXJDb2x1bW4gb2Ygc2VsZWN0ZWRDb2x1bW5zXCIgY2xhc3M9XCJncmlkLWNvbXBvbmVudC1vdXRlci1jb2x1bW5cIiBbc3R5bGVdPVwib3V0ZXJDb2x1bW4uc3R5bGVcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpbm5lckNvbHVtbiBvZiBzZWxlY3RlZENvbHVtbnNcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGFnZ3Igb2YgaW5uZXJDb2x1bW4/LmFnZ3JlZ2F0ZVwiPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJhZ2dyLmFnZ3JWYWx1ZT8ubGVuZ3RoICYmICgoIWFnZ3IuZGlzcGxheUZpZWxkICYmIGlubmVyQ29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpID09PSBvdXRlckNvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSkgfHxcbiAgICAgICAgICAgICAgICAgIGFnZ3IuZGlzcGxheUZpZWxkICYmIGFnZ3IuZGlzcGxheUZpZWxkPy50b0xvd2VyQ2FzZSgpID09PSBvdXRlckNvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiYWdnci5hZ2dyVmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj4gIFxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGRcbiAgICAgICAgICAqbmdJZj1cIiFzZXRBY3Rpb25Db2x1bW5Bc0ZpcnN0ICYmIGNvbHVtbnM/Lmxlbmd0aCA+IDAgJiYgdXNlSW5saW5lQ1JVRCAmJiAoZGVsZXRlUm93UGVybWlzc2lvbiB8fCBlZGl0Um93UGVybWlzc2lvbilcIlxuICAgICAgICAgIFtjbGFzc109XCJpbkVkaXRNb2RlID8gJ3RocmVlLWFjdGlvbi1idG4nIDogJ3R3by1hY3Rpb24tYnRuJ1wiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZGlzYWJsZWRTYXZlQnRuID8gJ2hpZGUtY2xlYXItZmlsdGVyLWJ1dHRvbicgOiAnJ1wiPjwvdGQ+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIEZvb3RlciBmb3IgRW1wdHkgTWVzc2FnZSBjb2x1bW5zIG9uIEdyaWQgLS0+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgPHRyIGNsYXNzPVwiZ3JpZC1jb21wb25lbnQgbm8tcmVjb3Jkcy1mb3VuZFwiPlxuICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJzZWxlY3RlZENvbHVtbnM/Lmxlbmd0aCArIDFcIj57e3RvdGFsUmVjb3Jkcz09MD8gJ05vIHJlY29yZHMgZm91bmQnOicnfX08L3RkPlxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L3AtdGFibGU+ICBcbiAgPHAtb3ZlcmxheVBhbmVsXG4gIFtzdHlsZV09XCJvdmVybGF5UGFuZWxTdHlsZVwiICNvdmVybGF5UGFuZWw+XG4gICAgPG5nLWNvbnRhaW5lciAjdmlld0NvbnRhaW5lclJlZj48L25nLWNvbnRhaW5lcj5cbiAgPC9wLW92ZXJsYXlQYW5lbD5cbjwvZGl2PiJdfQ==
|
|
3319
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2dyaWQvZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2dyaWQvZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUdaLFFBQVEsRUFFUixZQUFZLEVBR1osU0FBUyxFQUNULFlBQVksRUFFWixnQkFBZ0IsR0FJakIsTUFBTSxlQUFlLENBQUM7QUFRdkIsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFTTCxrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLGtCQUFrQixFQUVsQixjQUFjLEVBQ2QsZUFBZSxFQUVmLGNBQWMsRUFDZCxxQkFBcUIsRUFFckIsVUFBVSxFQUNWLGdCQUFnQixHQUVqQixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQWUsTUFBTSxpQ0FBaUMsQ0FBQztBQUcvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFbE0sT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE9BQU8sRUFBRSxPQUFPLEVBQWdCLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUl2RCxPQUFPLEVBQVMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTeEQsTUFBTSxPQUFPLGFBQWE7SUFVeEIsSUFBYSxjQUFjLENBQUMsR0FBUTtRQUNsQyxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDaEIsUUFBUSxDQUFDO1NBQ1Y7SUFDSCxDQUFDO0lBd0xEOzs7O09BSUc7SUFDSCxJQUFhLElBQUksQ0FBQyxJQUFXO1FBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUU7Z0JBQ3JDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTt3QkFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7cUJBQzFCO29CQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3BFLElBQUksSUFBSSxFQUFFLE1BQU0sR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUU7d0JBQ3pFLE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQzt3QkFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFROzZCQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsOENBQThDOzZCQUM1RCxTQUFTLENBQUMsR0FBRyxFQUFFOzRCQUNkLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7NEJBQ3ZDLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0NBQzVDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7b0NBQy9CLElBQUksTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dDQUNqQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7cUNBQy9CO2dDQUNILENBQUMsQ0FBQyxDQUFBOzZCQUNIO3dCQUNILENBQUMsQ0FBQyxDQUFDO3FCQUNOO3lCQUFNO3dCQUNMLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO3dCQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO3FCQUN4QztvQkFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztvQkFFMUIsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDakQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDMUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUM5RCxDQUFDO3dCQUNGLGtCQUFrQjs0QkFFZCxrQkFBa0IsQ0FBQyxhQUNwQixDQUFDLGNBQWMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO3FCQUM1QztvQkFFRCxxREFBcUQ7b0JBQ3JELElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO29CQUNqQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztpQkFDekI7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7aUJBQ3BCO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsSUFBYSxnQkFBZ0IsQ0FBQyxhQUE4QjtRQUMxRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXO2FBQy9CLG9CQUFvQixDQUFDLGFBQWEsQ0FBQztZQUNwQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQztRQUN0QyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUMxRSxrQkFBa0IsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPO1lBQ3JELENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNwRCxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUVwQixJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssT0FBTyxFQUFFO1lBQ25ELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxHQUFHLENBQUM7Z0JBQzNELENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDakUsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztTQUM3QjtRQUNELElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxNQUFNLEVBQUU7WUFDbEQsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO2dCQUNyQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7b0JBQzlDLElBQ0UsV0FBVyxDQUFDLEtBQUssS0FBSyxZQUFZLENBQUMsS0FBSzt3QkFDeEMsWUFBWSxDQUFDLEtBQUs7d0JBQ2xCLFdBQVcsQ0FBQyxLQUFLLEtBQUssWUFBWSxDQUFDLEtBQUssRUFDeEM7d0JBQ0EsV0FBVyxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO3FCQUN4QztvQkFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUNqRCxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxZQUFZLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FDckUsQ0FBQztvQkFDRixJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRTt3QkFDcEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQzlDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQSxDQUFBLG9CQUFvQjtZQUN2QyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDMUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUMzQjtZQUNELElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNqRSxrQkFBa0IsQ0FBQyxPQUFPLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDNUQsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO2FBQ0g7WUFDRCxrQkFBa0IsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDckMsSUFBSSxHQUFHLENBQ0wsa0JBQWtCLENBQUMsT0FBTztpQkFDdkIsT0FBTyxFQUFFO2lCQUNULEdBQUcsQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUN0QyxDQUNGLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2QsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO1lBQ3hFLENBQUMsQ0FBQyxDQUFDO1lBQ0gsa0JBQWtCLENBQUMsT0FBTyxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQzVELENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FDWCxHQUFHLEVBQUUsS0FBSyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsTUFBTSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUMvRCxDQUFDO1lBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxrQkFBa0IsQ0FBQztZQUN2RyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLEVBQUU7Z0JBQ25FLG1DQUFtQztnQkFDbkMsa0JBQWtCLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUN2QyxrQkFBa0IsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztpQkFDaEQ7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFO29CQUNyQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtvQkFDekIsSUFBSSxDQUFDLDJCQUEyQixHQUFHLEtBQUssQ0FBQztvQkFDekMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztpQkFDMUI7Z0JBQ0QsWUFBWSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDdkMsb0NBQW9DO2dCQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7YUFDdkI7U0FDRjtJQUNILENBQUM7SUFDRCxrQkFBa0I7UUFDaEIsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQTJIRCxZQUNVLEdBQXNCLEVBQ3RCLGFBQWtDLEVBQ25DLGFBQTRCLEVBQzNCLFdBQXdCLEVBQ3pCLFdBQXdCLEVBQ3ZCLFlBQTBCLEVBQzFCLFdBQWtDLEVBQ2xDLFVBQXNCLEVBQ3ZCLFdBQXdCLEVBQ3ZCLGlCQUFvQyxFQUNwQyxnQkFBa0MsRUFDbEMsRUFBcUIsRUFDckIsTUFBYyxFQUNkLFFBQWtCLEVBQ2xCLE1BQWMsRUFDZixtQkFBd0MsRUFDdkMsRUFBYyxFQUNkLFFBQW1CLEVBQ25CLGNBQStCLEVBQ3BCLE1BQTJCLEVBQzNCLEdBQXFCO1FBcEJoQyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixrQkFBYSxHQUFiLGFBQWEsQ0FBcUI7UUFDbkMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDM0IsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDekIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDdkIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsZ0JBQVcsR0FBWCxXQUFXLENBQXVCO1FBQ2xDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdkIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDdkIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3ZDLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLG1CQUFjLEdBQWQsY0FBYyxDQUFpQjtRQUNwQixXQUFNLEdBQU4sTUFBTSxDQUFxQjtRQUMzQixRQUFHLEdBQUgsR0FBRyxDQUFrQjtRQXRkaEMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRS9DLGdCQUFXLEdBQUcsdUJBQXVCLENBQUM7UUFDdEMsZ0JBQVcsR0FBVyxDQUFDLENBQUM7UUFPeEIsa0JBQWEsR0FBeUIsRUFBRSxDQUFDO1FBQ3pDLGFBQVEsR0FBVSxFQUFFLENBQUM7UUFDckIsV0FBTSxHQUFXLEVBQUUsQ0FBQztRQUNwQixpQkFBWSxHQUFVLEVBQUUsQ0FBQztRQUN6QixpQkFBWSxHQUFRLEVBQUUsQ0FBQTtRQUN0QixVQUFLLEdBQWEsRUFBRSxDQUFDO1FBQ3JCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBSWhDLGNBQVMsR0FBVSxFQUFFLENBQUE7UUFDckIsZUFBVSxHQUFZLElBQUksQ0FBQztRQUMzQix1QkFBa0IsR0FBVSxFQUFFLENBQUM7UUFDL0IsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDN0IsMEJBQXFCLEdBQVcsRUFBRSxDQUFDO1FBS25DLG1CQUFjLEdBQVEsRUFBRSxDQUFDO1FBQ3pCLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQy9CLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQy9CLHlCQUFvQixHQUFZLElBQUksQ0FBQztRQUNyQyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUMvQixxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixvQkFBZSxHQUFVLEVBQUUsQ0FBQztRQUM1QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNqQyxnQ0FBMkIsR0FBWSxLQUFLLENBQUM7UUFDN0Msc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQ25DLFlBQU8sR0FBWSxJQUFJLENBQUE7UUFDdkIsY0FBUyxHQUFZLEtBQUssQ0FBQTtRQUMxQixvQkFBZSxHQUFZLElBQUksQ0FBQztRQUNoQyxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMsbUJBQWMsR0FBVyxVQUFVLENBQUE7UUFDbkMsc0JBQWlCLEdBQVksSUFBSSxDQUFDO1FBRWxDLHlCQUFvQixHQUFZLElBQUksQ0FBQztRQUNyQyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUUvQixnQkFBVyxHQUFnQixFQUFFLENBQUM7UUFDOUIsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMscUNBQWdDLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtRQUVoRCxvREFBb0Q7UUFDcEQscUJBQWdCLEdBQVksSUFBSSxDQUFDO1FBQ2pDLHdCQUFtQixHQUFZLElBQUksQ0FBQztRQUNwQyxzQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFFbEMsc0VBQXNFO1FBQ3RFLHVCQUFrQixHQUFXLEVBQUUsQ0FBQztRQUV4QixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUN0QyxpRkFBaUY7UUFDakYsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFFakMsZ0RBQWdEO1FBQ2hELG9CQUFlLEdBQTJCLEVBQUUsQ0FBQztRQUM3Qyx3Q0FBd0M7UUFDeEMsbUJBQWMsR0FBMkIsRUFBRSxDQUFDO1FBQzVDLGVBQVUsR0FBVyxVQUFVLEVBQUUsQ0FBQztRQUNsQywwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFFdkMsc0JBQWlCLEdBQVMsRUFBRSxDQUFDO1FBSTdCLG9EQUFvRDtRQUMzQyxpQkFBWSxHQUFRLEVBQUUsQ0FBQztRQUV2Qix1QkFBa0IsR0FBVyxDQUFDLENBQUM7UUFFL0Isb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFFeEIsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFFbEMsZUFBVSxHQUFrQixFQUFFLENBQUM7UUFFdkMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFFOUIseUJBQW9CLEdBQVksSUFBSSxDQUFDO1FBRXJCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBRWhDLG1CQUFjLEdBQVksSUFBSSxDQUFDO1FBRS9DLDBCQUEwQjtRQUNsQixxQkFBZ0IsR0FBa0IsRUFBRSxDQUFDO1FBQzdDLDBCQUFxQixHQUFrQixFQUFFLENBQUM7UUFFMUMsbUJBQWMsR0FBa0IsRUFBRSxDQUFDO1FBQ25DLG9EQUFvRDtRQUMzQyxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFFM0MsOENBQThDO1FBQ3JDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBRS9CLDRDQUE0QztRQUNuQyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUU3QiwyQ0FBMkM7UUFDbEMsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUU1QixnQ0FBZ0M7UUFDaEIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVoQyw0SEFBNEg7UUFDbkgsaUJBQVksR0FBWSxJQUFJLENBQUM7UUFNdEMsMERBQTBEO1FBQ2pELG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBRWhDLG9DQUFvQztRQUMzQix5QkFBb0IsR0FBVyxNQUFNLENBQUM7UUFFL0MsZ0NBQWdDO1FBQ3ZCLHlCQUFvQixHQUFXLEVBQUUsQ0FBQztRQUUzQyx1REFBdUQ7UUFDOUMsdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBRXBDLHVEQUF1RDtRQUM5Qyx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFFdEMsdUNBQXVDO1FBQzlCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUVsQyx5Q0FBeUM7UUFDaEMsdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBRXBDLHlEQUF5RDtRQUNoRCwyQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFFeEMsMEVBQTBFO1FBQ2pFLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBRS9CLHVCQUF1QjtRQUNkLGVBQVUsR0FBcUIsRUFBRSxDQUFDO1FBRTNDLHFEQUFxRDtRQUM1QyxrQkFBYSxHQUF1QixrQkFBa0IsQ0FBQyxNQUFNLENBQUM7UUFFdkUsaUVBQWlFO1FBQ3hELFlBQU8sR0FBVyxTQUFTLENBQUM7UUFFckMsc0NBQXNDO1FBQzdCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBRWhDLHVDQUF1QztRQUM5QixxQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFFakMsbUNBQW1DO1FBQzFCLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFFM0IsbUNBQW1DO1FBQzFCLGlCQUFZLEdBQUcsTUFBTSxDQUFDO1FBRS9CLGNBQWM7UUFDTCxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRXpCLG9EQUFvRDtRQUMzQyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBRTFCLGVBQVUsR0FBUSxFQUFFLENBQUM7UUFFckIsY0FBUyxHQUFHLElBQUksQ0FBQztRQUVqQixrQkFBYSxHQUFVLEVBQUUsQ0FBQztRQUUxQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBRTFCLHNCQUFpQixHQUFZLElBQUksQ0FBQztRQUUzQyxzQ0FBc0M7UUFDN0Isd0JBQW1CLEdBQVUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRXRFLGdDQUFnQztRQUN0QixlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUF1STdELGdCQUFXLEdBQUcsQ0FBQyxLQUFvQixFQUFFLEVBQUU7WUFDckMsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLE9BQU8sRUFBRTtnQkFDekIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztnQkFDekUsSUFBSSxjQUFjLFlBQVksZ0JBQWdCLElBQUksY0FBYyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7b0JBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQ3hEO2FBQ0Y7UUFDSCxDQUFDLENBQUM7UUFFRiwrREFBK0Q7UUFDdEQsWUFBTyxHQUFrQixFQUFFLENBQUM7UUFFNUIsZ0JBQVcsR0FBa0IsRUFBRSxDQUFDO1FBRXpDLDhDQUE4QztRQUNyQyxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFFbkMsNkNBQTZDO1FBQ3BDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFNUIseUNBQXlDO1FBQ2hDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBRS9CLHFDQUFxQztRQUM1QixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRTVCLGtEQUFrRDtRQUN6QywwQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFFdkMsbUNBQW1DO1FBQzFCLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBRTFCLDZDQUE2QztRQUNwQyxxQkFBZ0IsR0FBVSxFQUFFLENBQUM7UUFFN0Isc0JBQWlCLEdBQVksSUFBSSxDQUFDO1FBRWxDLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRXRDLDJDQUEyQztRQUNsQyxnQkFBVyxHQUFXLENBQUMsQ0FBQztRQUV4QixrQkFBYSxHQUF3QixFQUFFLENBQUM7UUFFakQsMkVBQTJFO1FBQ2xFLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUVyQyxtQ0FBbUM7UUFDekIsZUFBVSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRTdELHVEQUF1RDtRQUM3QywwQkFBcUIsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV4RSxzQ0FBc0M7UUFDNUIsa0JBQWEsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVoRSx5Q0FBeUM7UUFDL0IsaUJBQVksR0FBNEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVyRSwyQ0FBMkM7UUFDakMsbUJBQWMsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVqRSx3REFBd0Q7UUFDOUMsMkJBQXNCLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFekUsaURBQWlEO1FBQ3ZDLGtCQUFhLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFaEUsaUVBQWlFO1FBQ3ZELHlCQUFvQixHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXZFLDRDQUE0QztRQUU1Qyw0QkFBdUIsR0FDckIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVyQix3Q0FBd0M7UUFFeEMsaUJBQVksR0FBdUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV0RSw0Q0FBNEM7UUFDbEMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRTNDLGdEQUFnRDtRQUN0QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFL0MsOENBQThDO1FBQ3BDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUUzQywwQ0FBMEM7UUFDaEMsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFeEMsNkRBQTZEO1FBQ25ELHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFLaEQsZ0NBQWdDO1FBQ3ZCLHFCQUFnQixHQUFZLElBQUksQ0FBQztRQUUxQyxnRUFBZ0U7UUFDdkQsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUFFNUIsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFdEMsd0NBQXdDO1FBQzlCLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUU3Qyw4Q0FBOEM7UUFDcEMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRW5DLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDL0IsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDckIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUd4Qyx1QkFBa0IsR0FBVSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDNUQsdUJBQWtCLEdBQThCLEVBQUUsQ0FBQztJQXlCL0MsQ0FBQztJQUVMLFVBQVUsQ0FBQyxPQUFZO1FBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELGVBQWUsQ0FBQyxZQUFZO1FBQzFCLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBQ0QsY0FBYyxDQUFDLEtBQVUsRUFBQyxFQUFFO1FBQzFCLElBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFDO1lBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1NBQ3RDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLElBQUksWUFBWSxHQUFHLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3JELElBQUksWUFBWSxFQUFFO1lBQ2hCLElBQUksS0FBSyxHQUFRLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUFDO1lBQzFHLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNkLElBQUksUUFBUSxFQUFFO29CQUNaLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUNqRTthQUNGO1NBQ0Y7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsZ0JBQXVCLEVBQUU7UUFDeEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN0QyxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtnQkFDdEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO2FBQzVEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLGNBQWMsR0FBRyxhQUFhLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0csSUFBSSxDQUFDLDBCQUEwQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxnQkFBZ0I7UUFDZCxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1FBQzFFLElBQUksZUFBZSxJQUFJLGVBQWUsQ0FBQyxXQUFXLEVBQUU7WUFDbEQsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDMUQsWUFBWSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ25DLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtvQkFDaEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUU7d0JBQ2xDLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLFdBQVcsRUFBRSxrQkFBa0IsRUFBRTs0QkFDekUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDOzRCQUN0RSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtnQ0FDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0NBQzNILElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFO29DQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsV0FBVyxFQUFFLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO2lDQUNqRjs0QkFDSCxDQUFDLENBQUMsQ0FBQTt5QkFDSDtvQkFDSCxDQUFDLENBQUMsQ0FBQTtpQkFDSDtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLCtCQUErQixDQUFDLFNBQWMsRUFBRSxZQUFpQixFQUFFLEtBQVUsRUFBRSxHQUFRO1FBQzNGLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTthQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsOENBQThDO2FBQzVELFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxNQUFNLElBQUksR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25DLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxJQUFHLFFBQVEsRUFBRSxNQUFNLEdBQUMsQ0FBQyxJQUFJLE9BQU8sRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFDO2dCQUMzQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQSxFQUFFO29CQUNwQixJQUFJLEtBQUssR0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3BCLElBQUcsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFDO3dCQUNsRSxLQUFLLEdBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBQyxFQUFFLENBQUMsQ0FBQzt3QkFDNUMsSUFBSSxNQUFNLEdBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxLQUFLLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO3dCQUN2RixJQUFJLFlBQVksR0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBQyxZQUFZLENBQUM7cUJBQ3hCO3lCQUFLO3dCQUNKLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQzt3QkFDOUUsSUFBRyxRQUFRLElBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUM7NEJBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7eUJBQ3pCO3FCQUNGO2dCQUNILENBQUMsQ0FBQyxDQUFBO2FBQ0g7WUFFRCxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QyxNQUFNLFlBQVksR0FBUSxJQUFJLENBQUMseUJBQXlCLEVBQUUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvRixJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUU7Z0JBQ2xCLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztnQkFDbEMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQzthQUMxQztZQUNELFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxxQkFBcUI7UUFDckIsd0NBQXdDO1FBQ3hDLHdDQUF3QztRQUN4QyxzQ0FBc0M7UUFDdEMsbURBQW1EO1FBQ25ELDhCQUE4QjtRQUM5Qiw2QkFBNkI7UUFDN0IsOEVBQThFO1FBQzlFLHVEQUF1RDtRQUN2RCxrR0FBa0c7UUFDbEcsd0NBQXdDO1FBQ3hDLGtDQUFrQztRQUNsQyxnQkFBZ0I7UUFDaEIseUZBQXlGO1FBQ3pGLHFDQUFxQztRQUNyQyxxQ0FBcUM7UUFDckMsWUFBWTtRQUNaLFVBQVU7UUFDVixTQUFTO1FBQ1QsTUFBTTtRQUVOLHNFQUFzRTtRQUN0RSw0Q0FBNEM7UUFDNUMsb0dBQW9HO1FBQ3BHLDBCQUEwQjtRQUMxQix5Q0FBeUM7UUFDekMsZ0RBQWdEO1FBQ2hELE1BQU07UUFDTiw4QkFBOEI7UUFDOUIsWUFBWTtJQUNkLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksZUFBZSxDQUFDLEdBQWtCO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUNuRCxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3ZDO0lBQ0gsQ0FBQztJQUNELHVGQUF1RjtJQUd2RixlQUFlLENBQUMsS0FBcUI7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdkIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFeUMsT0FBTyxDQUFDLEtBQUs7UUFDckQsSUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBQztZQUNqRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQztJQUVELHNCQUFzQjtJQUV0QixtQkFBbUIsQ0FBQyxLQUFVO1FBQzVCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRTtZQUNyQyxPQUFPLEtBQUssQ0FBQztTQUNkO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbEMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQzdDLElBQUksQ0FBQyxXQUFXLEdBQUcsdUJBQXVCLENBQUM7U0FDNUM7YUFBTTtZQUNMLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQztTQUNwRjtRQUNELElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzNCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNwQjtRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztTQUN6QjtRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQzlELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1NBQzdCO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO2FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyw4Q0FBOEM7YUFDNUQsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUVILHFCQUFxQjtRQUNyQiw2QkFBNkI7UUFDN0IsV0FBVztRQUNYLHFCQUFxQjtRQUNyQiw2Q0FBNkM7UUFDN0MsMkNBQTJDO1FBQzNDLE1BQU07UUFDTixZQUFZO0lBQ2QsQ0FBQztJQUNELGVBQWU7UUFDYixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEMsSUFBSSxNQUFNLEdBQWlCLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUMzRCxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ1osTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxLQUFLLElBQUksSUFBSSxNQUFNLEVBQUUsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDOUssTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1RCxNQUFNLFdBQVcsR0FBUSxXQUFXLEVBQUUsc0JBQXNCLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ2pHLE1BQU0sWUFBWSxHQUFRLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDOUYsSUFBSSxXQUFXLElBQUksWUFBWSxFQUFFO2dCQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7cUJBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ2IsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDZCxJQUFJLFdBQVcsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUMzQixXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7cUJBQ3pCO29CQUNELElBQUksWUFBWSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQzVCLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztxQkFDMUI7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDTjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7YUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDhDQUE4QzthQUM1RCxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLENBQUE7WUFDbEUsSUFBRyxZQUFZLEVBQUM7Z0JBQ1osTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBQ2hFLElBQUcsS0FBSyxFQUFDO29CQUNMLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQTtpQkFDaEI7YUFDSjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsbUNBQW1DO0lBQ25DLDBCQUEwQixDQUFDLGlCQUF3QixFQUFFO1FBQ25ELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM5QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNuRyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDakIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVyxFQUFFLE1BQU0sS0FBSyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3pKLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFO29CQUNsQixJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDN0U7YUFDRjtZQUNELElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ2hEO2FBQU07WUFDTCxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUN0QztJQUNILENBQUM7SUFFRCwrQkFBK0IsQ0FBQyxjQUFjO1FBQzVDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksY0FBYyxJQUFJLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM5RCxNQUFNLFFBQVEsR0FBRyxjQUFjLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2pHLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNqQixNQUFNLFNBQVMsR0FBRyxjQUFjLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsRUFBRSxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNuSSxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsZUFBZSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3RELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7d0JBQzlCLElBQUksU0FBUyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUU7NEJBQzVHLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7eUJBQ2pCO29CQUNILENBQUMsQ0FBQyxDQUFBO2lCQUNIO2FBQ0Y7U0FDRjtRQUNELElBQUksR0FBRyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkIsT0FBTyxHQUFHLENBQUM7U0FDWjthQUFNO1lBQ0wsT0FBTyxFQUFFLENBQUM7U0FDWDtJQUNILENBQUM7SUFFRCxlQUFlLENBQUMsY0FBbUIsRUFBRSxRQUFjO1FBQ2pELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0IsSUFBSSxZQUFZLEdBQVUsRUFBRSxDQUFDO1lBQzdCLFlBQVksQ0FBQyxJQUFJLENBQUM7Z0JBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsZUFBZSxFQUFFLGNBQWM7Z0JBQy9CLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7YUFDNUMsQ0FBQyxDQUFBO1lBQ0YsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUc7Z0JBQ3BCLFlBQVksRUFBRSxZQUFZO2dCQUMxQixXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUU7YUFDeEIsQ0FBQTtZQUNELElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDMUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsQ0FBQzthQUN2RDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDakQ7WUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNsRCxrQkFBa0IsQ0FBQyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQy9DO0lBQ0gsQ0FBQztJQUVELDhDQUE4QztJQUM5Qyx1QkFBdUI7UUFDckIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksV0FBVyxHQUFXLENBQUMsQ0FBQztZQUM1QixJQUFJLFlBQVksR0FBVyxDQUFDLENBQUM7WUFFN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFtQixFQUFFLEVBQUU7Z0JBQzNDLElBQUksV0FBVyxHQUFrQixNQUFNLENBQUMsV0FBVyxDQUFDO2dCQUNwRCxJQUFJLHNCQUFzQixHQUFHLEtBQUssQ0FBQztnQkFFbkMsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3pDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTt3QkFDakMsSUFBSSxPQUFPLEdBQVksS0FBSyxDQUFDO3dCQUM3QixJQUFJLFVBQVUsQ0FBQyxLQUFLLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUNuRCxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dDQUNoQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7b0NBQ3ZELE9BQU8sR0FBRyxJQUFJLENBQUM7aUNBQ2hCOzRCQUNILENBQUMsQ0FBQyxDQUFDOzRCQUNILElBQ0UsVUFBVSxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsSUFBSTtnQ0FDeEMsQ0FBQyxzQkFBc0IsRUFDdkI7Z0NBQ0EsSUFBSSxPQUFPLEVBQUU7b0NBQ1gsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7aUNBQ3hCO3FDQUFNO29DQUNMLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2lDQUN0Qjs2QkFDRjtpQ0FBTSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLElBQUksRUFBRTtnQ0FDbkQsSUFBSSxPQUFPLEVBQUU7b0NBQ1gsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO29DQUM5QixNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztvQ0FDdEIsTUFBTSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7aUNBQ3pCOzZCQUNGO3lCQUNGO29CQUNILENBQUMsQ0FBQyxDQUFDO2lCQUNKO2dCQUNELFdBQVcsRUFBRSxDQUFDO2dCQUNkLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtvQkFDakIsWUFBWSxFQUFFLENBQUM7aUJBQ2hCO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsR0FBRyxDQUFDLElBQUksV0FBVyxLQUFLLFlBQVksQ0FBQztTQUN2RTtJQUNILENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsb0JBQW9CO1FBQ2xCLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkQsSUFBSSxzQkFBc0IsR0FBRyxLQUFLLENBQUM7WUFFbkMseUNBQXlDO1lBQ3pDLElBQUksb0JBQW9CLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQzNDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsV0FBVyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDbEQsQ0FBQztZQUVGLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7Z0JBQ3RDLElBQUksT0FBTyxHQUFZLEtBQUssQ0FBQztnQkFFN0IsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDaEMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUN2RCxPQUFPLEdBQUcsSUFBSSxDQUFDO3FCQUNoQjtnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFFSCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDeEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7aUJBQzVCO3FCQUNJLElBQ0gsVUFBVSxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsSUFBSTtvQkFDeEMsQ0FBQyxzQkFBc0IsRUFDdkI7b0JBQ0EsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7b0JBQzFCLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsRUFBRTt3QkFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7d0JBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO3FCQUM1QjtpQkFDRjtxQkFBTSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDL0QsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7b0JBQzFCLHNCQUFzQixHQUFHLElBQUksQ0FBQztvQkFDOUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztpQkFDaEM7cUJBQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ2pFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7aUJBQ2xDO3FCQUFNLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUNqRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO2lCQUMvQjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUN2RSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQUUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztJQUMvRSxDQUFDO0lBRUQsV0FBVyxDQUFDLE1BQXFCO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTthQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2IsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQzdDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLDJCQUEyQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUU7WUFDcEUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1lBQ2hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3BDLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQTtZQUN2QixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2xELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUNyQztpQkFBTSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLEVBQUU7Z0JBQ3JDLFlBQVksQ0FBQyxVQUFVLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3ZGO1lBQ0QscUNBQXFDO1lBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDeEQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDcEQ7WUFDRCxNQUFNLFVBQVUsR0FBWSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNwRSxJQUFJLFVBQVUsRUFBRTtnQkFDZCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDNUUsOENBQThDO2dCQUM5QyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7b0JBQ25ELElBQUksZUFBZSxJQUFJLGVBQWUsQ0FBQyxXQUFXLEVBQUU7d0JBQ2xELGNBQWMsR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztxQkFDaEc7aUJBQ0Y7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUU3Qyw4Q0FBOEM7Z0JBQzlDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUUvQiwwQ0FBMEM7Z0JBQzFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDNUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDeEIsbUNBQW1DO2dCQUNuQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDeEIsSUFBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7b0JBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7aUJBQy9CO2dCQUVELCtCQUErQjtnQkFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FDdkMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUN4RSxDQUFDO2dCQUNGLElBQUksTUFBTSxLQUFLLEtBQUssRUFBRTtvQkFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7aUJBQ3hCO2dCQUNELElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztnQkFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtvQkFDbkMsMEVBQTBFO29CQUMxRSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLEVBQUU7d0JBQ3RGLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO3FCQUMxQjtvQkFDRCxrREFBa0Q7b0JBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQzlSLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7NEJBQzVCLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxDQUFDLEVBQUU7Z0NBQ25GLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7NkJBQzFHO3dCQUNILENBQUMsQ0FBQyxDQUFBO3FCQUNIO29CQUNELDhEQUE4RDtvQkFDOUQsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLFVBQVUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxFQUFFO3dCQUNuRixNQUFNLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztxQkFDOUI7O3dCQUFNLE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO29CQUNoQyxvQ0FBb0M7b0JBQ3BDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsSUFBSSxFQUFFO3dCQUN4QyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFOzRCQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dDQUM1QixJQUNFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO29DQUNqQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzt3Q0FDMUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDOUM7b0NBQ0EsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2lDQUN0RDs0QkFDSCxDQUFDLENBQUMsQ0FBQzt5QkFDSjs2QkFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRTs0QkFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQ0FDakMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO29DQUNyQixHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFXLENBQUMsQ0FBQztpQ0FDM0Q7NEJBQ0gsQ0FBQyxDQUFDLENBQUM7eUJBQ0o7cUJBQ0Y7b0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO3dCQUN6RixtQkFBbUI7d0JBQ2pCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDbEM7b0JBRUQsbURBQW1EO29CQUNuRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBRWpDLG9CQUFvQjtvQkFDcEIsSUFBSSxNQUFNLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDbkQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7d0JBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDL0I7b0JBRUQsSUFBSSxhQUFhLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLEVBQUU7d0JBQ25ELGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUN4QixZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQVEsQ0FDMUYsQ0FBQztxQkFDSDt5QkFBTSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLEVBQUU7d0JBQ3JDLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUNuRztvQkFDRCxJQUNFLENBQUMsSUFBSSxDQUFDLFVBQVU7d0JBQ2hCLGFBQWE7d0JBQ2IsYUFBYSxDQUFDLE9BQU87d0JBQ3JCLGFBQWEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFDakM7d0JBQ0EsYUFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTs0QkFDdkMsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUU7Z0NBQzVCLElBQUksTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEtBQUssVUFBVSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7b0NBQ2xELE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQVcsQ0FBQyxDQUFDO2lDQUN2RjtxQ0FBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLFdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO29DQUNqRixNQUFNLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lDQUMxQztxQ0FBTSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7b0NBQ2xCLE1BQU0sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztpQ0FDOUI7NkJBQ0Y7d0JBQ0gsQ0FBQyxDQUFDLENBQUM7cUJBQ0o7b0JBQ0Qsc0NBQXNDO29CQUN0QyxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7d0JBQ3ZCLE1BQU0sQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztxQkFDekQ7b0JBQ0Qsd0JBQXdCO29CQUN4QixJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLFlBQVk7d0JBQzVDLElBQUksQ0FBQyxRQUFRO3dCQUNiLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFDekI7d0JBQ0EsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTs0QkFDNUIsaURBQWlEOzRCQUNqRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dDQUMvQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO29DQUNuQyxFQUFFLFFBQVEsRUFBRTtxQ0FDWCxLQUFLLENBQUMsR0FBRyxDQUFDO29DQUNYLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDOzZCQUNqTDs0QkFDRCxNQUFNLEdBQUcsR0FBUSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQzs0QkFDaEYsbUNBQW1DOzRCQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0NBQ3hDLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRTtvQ0FDdkIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7aUNBQzFIO3FDQUFNO29DQUNMLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTt3Q0FDdEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztxQ0FDekc7eUNBQU07d0NBQ0wsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3FDQUMxRDtpQ0FDRjs2QkFDRjt3QkFDSCxDQUFDLENBQUMsQ0FBQztxQkFDSjtvQkFFRCxpREFBaUQ7b0JBQ2pELElBQUksTUFBTSxDQUFDLEtBQUssRUFBRTt3QkFDaEIsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFBO3dCQUNwRyxJQUFJLENBQUMsR0FBRyxFQUFFOzRCQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7eUJBQzlDO3FCQUNGO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUVILElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLGNBQWMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtvQkFDakYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUN2QztxQkFBTTtvQkFDTCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNyQztnQkFDRCxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxlQUFlLEVBQUU7b0JBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2lCQUMzQjtnQkFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7b0JBQ2YsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLENBQUM7b0JBQ3hFLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQzNCLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztxQkFDbEM7b0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO3lCQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUNiLFNBQVMsQ0FBQyxHQUFHLEVBQUU7d0JBQ2QsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7NEJBQzdFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO3lCQUMxQjtvQkFDSCxDQUFDLENBQUMsQ0FBQztpQkFDTjthQUNGO1lBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztZQUNqQyxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDbkUsSUFBSSxlQUFlLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7YUFDL0I7WUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQzFELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQy9EO1lBQ0QsSUFBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUN4QjtTQUNGO1FBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLDJCQUEyQixHQUFHLEtBQUssQ0FBQztJQUMzQyxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksTUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDOUIsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsRCxDQUFDLENBQUMsQ0FBQTtTQUNIO0lBQ0wsQ0FBQztJQUNELGdCQUFnQixDQUFDLE9BQU87UUFDdEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMzQixPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtnQkFDMUQsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUMzQixDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2lCQUN6QztnQkFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9CO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQseUJBQXlCLENBQUMsR0FBUSxFQUFFLE1BQW1CLEVBQUUsS0FBSztRQUM1RCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7WUFDdEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUN4RSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUN6QyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQztvQkFDeEksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQztpQkFDOUQsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQy9GLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNwQztJQUNILENBQUM7SUFFRCxtREFBbUQ7SUFDbkQsbUJBQW1CLENBQUMsTUFBbUI7UUFDckMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM3QixJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLElBQUk7Z0JBQ3BDLGVBQWUsQ0FBQyxNQUFNO2dCQUN0QixlQUFlLENBQUMsTUFBTSxFQUN0QjtnQkFDQSxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQztnQkFDekMsSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUMxRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVzt5QkFDbkMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7eUJBQ2hCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ3BCLElBQUksV0FBVyxJQUFJLEtBQUssRUFBRTt3QkFDeEIsS0FBSyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7cUJBQ3BEO2lCQUNGO3FCQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsSUFBSSxLQUFLLEVBQUU7b0JBQ3RDLEtBQUssQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztpQkFDeEM7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHVCQUF1QixDQUFDLE1BQVc7UUFDakMsSUFBSSxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ3BCLElBQUksTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFO1lBQ2xGLFNBQVMsR0FBRyxHQUFHLENBQUE7U0FDaEI7YUFBTSxJQUFJLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRTtZQUNuRCxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1NBQ25EO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELDZEQUE2RDtJQUM3RCxnQkFBZ0IsQ0FBQyxNQUFXLEVBQUUsR0FBUTtRQUNwQyxHQUFHLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxLQUFLLEdBQVEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEVBQUUsV0FBVztZQUN0RCxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEVBQUUsV0FBVztZQUN6QyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRTtnQkFDdkQsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7Z0JBQzlELENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztvQkFDdkMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUN4QyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDO3dCQUN0SyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQzdGLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtZQUNsRCxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7UUFDL0MsSUFBSSxVQUFVLEdBQUcsWUFBWSxFQUFFLFVBQVUsQ0FBQztRQUMxQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFO1lBQzFC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QU0sQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7WUFDdEwsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1lBQ25MLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUN0TCxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7WUFDL0wsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FB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TUFBTTtnQkFHRyxlQUFlO3NCQUF4QixNQUFNO2dCQUdHLFdBQVc7c0JBQXBCLE1BQU07Z0JBR0csUUFBUTtzQkFBakIsTUFBTTtnQkFHRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBR0UsWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdJLGFBQWE7c0JBQXRCLE1BQU07Z0JBR0csWUFBWTtzQkFBckIsTUFBTTtnQkFFRSxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFxS04sZUFBZTtzQkFGZCxZQUFZO3VCQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQzs7c0JBQy9CLFlBQVk7dUJBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVFXLE9BQU87c0JBQWhELFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsZUFBZSxDQUFDO2dCQVF4QyxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMscUJBQXFCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgT25DaGFuZ2VzLFxuICBPcHRpb25hbCxcbiAgRWxlbWVudFJlZixcbiAgVmlld0NoaWxkcmVuLFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgSG9zdExpc3RlbmVyLFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIE5nWm9uZSxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgUmVuZGVyZXIyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQge1xuICBEeW5hbWljRGlhbG9nUmVmLFxuICBEeW5hbWljRGlhbG9nQ29uZmlnLFxuICBEaWFsb2dTZXJ2aWNlLFxuICBEeW5hbWljRGlhbG9nQ29tcG9uZW50LFxufSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xuaW1wb3J0IGpzUERGIGZyb20gJ2pzcGRmJztcbmltcG9ydCB7IEdyaWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIElHcmlkQ29sdW1uLFxuICBJR3JpZFNvcnQsXG4gIElHcmlkU2VydmVyU2lkZUV2ZW50LFxuICBJR3JpZFBhZ2luYXRpb25FdmVudCxcbiAgSUdsb2JhbEZpbHRlcixcbiAgSUdyaWRGaWx0ZXIsXG4gIElHcmlkQ29sdW1uQWN0aW9uLFxuICBJR3JpZFJvd0FjdGlvbixcbiAgRUdyaWRTZWxlY3Rpb25UeXBlLFxuICBFR3JpZENvbHVtblR5cGUsXG4gIEVHcmlkU29ydERpcmVjdGlvbixcbiAgSUdyaWREYXRhRXhwb3J0LFxuICBFR3JpZEFnZ3JlZ2F0ZSxcbiAgRUdyaWRGb3JtYXRUeXBlLFxuICBJR3JpZEZpbHRlckluZm8sXG4gIEVHcmlkVmFsaWRhdG9yLFxuICBHcmlkRmlsdGVyQ29udHJvbFR5cGUsXG4gIHVzZXJTZXR0aW5nLFxuICBFR3JpZEV4Y2VsLFxuICBFR3JpZFJvd1Byb3BOYW1lLFxuICBJR3JpZFJlcG9ydEJ0bixcbn0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dyaWQubW9kZWwnO1xuaW1wb3J0IHsgRVBlcm1pc3Npb25UeXBlLCBJUGVybWlzc2lvbiB9IGZyb20gJy4uLy4uLy4uL21vZGVscy91c2VyLWluZm8ubW9kZWwnO1xuaW1wb3J0IHsgQXV0aGVudGljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aGVudGljYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hbGVydC5zZXJ2aWNlJztcbmltcG9ydCB7IElmcmFtZUNvbXBvbmVudCB9IGZyb20gJy4uL2lmcmFtZS9pZnJhbWUuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVQaXBlLCBEZWNpbWFsUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBhdXRvU2V0TG9va3VwRGF0YSwgY2hhbmdlQ29sdW1uc1N0YXRlLCBjdXJyZW50VXJsLCBkcmFnZ2FibGVEaWFsb2csIG9iakNvbnZlcnRUb0xvd2VyLCBzZXREaWFsb2dSZXNwb25zZSwgc2V0TWludXRlc0ludGVydmFsLCBzZXRUaW1lSW5EYXRlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0aWVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tICdwcmltZW5nL3RhYmxlJztcbmltcG9ydCB7IEVGb3JtYXRUeXBlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2Zvcm0ubW9kZWwnO1xuaW1wb3J0IHsgUGFnZUxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wYWdlLWxvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBIeXBlcmxpbmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaHlwZXJsaW5rLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9mb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgZGVsYXksIHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vbGliL3NlcnZpY2VzL3JlcXVlc3Quc2VydmljZSc7XG5pbXBvcnQgeyBSZXF1ZXN0RHRvIH0gZnJvbSAncHJvamVjdHMvc2UtdWktdG9vbGtpdC9zcmMvbGliL21vZGVscy9yZXF1ZXN0Lm1vZGVsJztcbmltcG9ydCB7IFN5c3RlbUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zeXN0ZW0tY29uZmlnLnNlcnZpY2UnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2UtZ3JpZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ3JpZC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBHcmlkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ3ZpZXdDb250YWluZXJSZWYnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICBwdWJsaWMgcGFuZWxPdmVybGF5Vmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZlxuXG4gIEBWaWV3Q2hpbGRyZW4oJ2dyaWRSb3cnKSBncmlkUm93OiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBPdXRwdXQoKSBpbmxpbmVSb3dDYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIGdyaWRTZXR0aW5nOiBhbnk7XG4gIHNlYXJjaGJ0bklkID0gJ3NlYXJjaEdsb2JhbEZpbHRlckJ0bic7XG4gIGN1cnJlbnRQYWdlOiBudW1iZXIgPSAwO1xuICBQYWdlQ2hhbmdlOiBib29sZWFuO1xuICBASW5wdXQoKSBzZXQgYWN0aXZlVGVzdE1vZGUodmFsOiBhbnkpIHtcbiAgICBpZiAodmFsID09PSB0cnVlKSB7XG4gICAgICBkZWJ1Z2dlcjtcbiAgICB9XG4gIH1cbiAgc2VydmVyRmlsdGVyczogSUdyaWRTZXJ2ZXJTaWRlRXZlbnQgPSB7fTtcbiAgcm93c0RhdGE6IGFueVtdID0gW107XG4gIGdyaWRJZDogc3RyaW5nID0gJyc7XG4gIHJvd3NEYXRhQ29weTogYW55W10gPSBbXTtcbiAgbnVtZXJpY1ZhbHVlOiBhbnkgPSB7fVxuICByb2xlczogc3RyaW5nW10gPSBbXTtcbiAgaXNDb2x1bW5IaWRkZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgcm93Q2xpY2tEYXRhOiBJR3JpZENvbHVtbjtcbiAgY29tcG9uZW50VGFibGVSZWY6IGFueTtcbiAgbG9va3VwRmlsdGVyT2JqOiBhbnk7XG4gIGNoZWNrbGlzdDogYW55W10gPSBbXVxuICBsb29rdXBCbHVyOiBib29sZWFuID0gdHJ1ZTtcbiAgZ2xvYmFsRmlsdGVyc0FycmF5OiBhbnlbXSA9IFtdO1xuICBjaGVja0FjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBjYWxlbmRhclByZXZpb3VzVmFsdWU6IHN0cmluZyA9ICcnO1xuICBncmlkRmlsdGVyT2JqOiBJR3JpZEZpbHRlckluZm87XG4gIGRlZmF1bHREYXRlOiBhbnk7XG4gIG92ZXJsYXlQYW5lbFN0eWxlOiB7fTtcbiAgZ3JpZGZpbHRlcjogYW55O1xuICBkcm9wRG93bkZpbHRlcjogYW55ID0ge307XG4gIGRyb3Bkb3duSW5wdXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2F2ZUFsbFJlY29yZDogYm9vbGVhbiA9IGZhbHNlO1xuICBnZW5lcmF0ZVJvd3NEYXRhQ29weTogYm9vbGVhbiA9IHRydWU7XG4gIGVkaXRBbGxSZWNvcmQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2FuY2VsQWxsUmVjb3JkczogYm9vbGVhbiA9IGZhbHNlO1xuICBhZGROZXdSb3dDaGVjazogYm9vbGVhbiA9IGZhbHNlO1xuICBpbkVkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIHNhdmVSZWNvcmRBcnJheTogYW55W10gPSBbXTtcbiAgZGlzYWJsZWRTYXZlQnRuOiBib29sZWFuID0gZmFsc2U7XG4gIGlzQ2hlY2tCb3hDaGFuZ2VFdmVudENhbGxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1NlbGVjdGVkQWxsUm93czogYm9vbGVhbiA9IGZhbHNlO1xuICBDaGVja2VkOiBib29sZWFuID0gdHJ1ZVxuICB1bkNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICBlZGl0TW9kZUNoZWNrZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBlZGl0TW9kZXVuQ2tlY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBjYWxlbmRhckZvcm1hdDogc3RyaW5nID0gXCJtbS9kZC95eVwiXG4gIHNldERyb3Bkb3duRmlsdGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgcmVsb2FkUGFnZTogU3Vic2NyaXB0aW9uO1xuICBzZXREcm9wZG93bmRhdGFWYWx1ZTogYm9vbGVhbiA9IHRydWU7XG4gIHNob3dGaWx0ZXJidG46IGJvb2xlYW4gPSBmYWxzZTtcbiAgZGlhbG9nUmVmOiBhbnlcbiAgdXNlclNldHRpbmc6IHVzZXJTZXR0aW5nID0ge307XG4gIHJvd1VwZGF0ZUNoYW5nZTogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1NlcnZlclNpZGVFdmVudEluaXRhbFRyaWdnZXJlZCA9IG5ldyBTdWJqZWN0KClcblxuICAvL2FwcGx5IEFkZC9EZWxldGUvRWRpdCBwcm9wIGZvciB0aGUgZ3JpZCBwZXJtaXNzaW9uXG4gIGFkZFJvd1Blcm1pc3Npb246IGJvb2xlYW4gPSB0cnVlO1xuICBkZWxldGVSb3dQZXJtaXNzaW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgZWRpdFJvd1Blcm1pc3Npb246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vIEFwcGx5IHByb3Agc2V0QWdncmVnYXRlRm9vdGVyIG9uIEZvb3RlciBvZiB0aGUgVGFibGUgZm9yIGFnZ3JlZ2F0ZS5cbiAgc2V0QWdncmVnYXRlRm9vdGVyOiBzdHJpbmcgPSAnJztcbiAgXG4gIHByaXZhdGUgY2xpY2tUaW1lb3V0OiBib29sZWFuID0gZmFsc2U7XG4gIC8vIEJvb2xlYW4gcHJvcCB0byBhbGxvdyBIaWRlIEFnZ3JlZ2F0ZSBGb290ZXIgV2hlbiBBZ2dyZWdhdGUgbm90IEFwcGx5IG9uIFRhYmxlLlxuICBhZ2dyZWdhdGVGb290ZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBNYWludGFpbnMgcHJldmlvdXMgc3RhdGUgb2Ygcm93cyBiZWluZyBlZGl0ZWRcbiAgZWRpdFJvd3NSZWNvcmRzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIC8vIE1haW50YWlucyByZWNvcmQgb2Ygcm93cyBiZWluZyBlZGl0ZWRcbiAgZWRpdGluZ1Jvd0tleXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgY3VycmVudFVybDogc3RyaW5nID0gY3VycmVudFVybCgpO1xuICBvbkNsaWNrRXZlbnRUcmlnZ2VyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIHJlbWFpbmluZ1Jvd3NEYXRhOmFueVtdID0gW107XG4gIFxuICBAVmlld0NoaWxkKCdkdCcpIHRhYmxlOiBUYWJsZTtcblxuICAvLyBTZWxlY3RzIGl0ZW1zIGluIHRoZSBncmlkIGJhc2VkIG9uIHBhc3NlZCBvbiBkYXRhXG4gIEBJbnB1dCgpIHNlbGVjdGVkUm93czogYW55ID0gW107XG5cbiAgQElucHV0KCkgc2V0R3JpZFJlZnJlc2hUaW1lOiBudW1iZXIgPSAwO1xuXG4gIEBJbnB1dCgpIGFkZERhdGFLZXlWYWx1ZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHN0b3BEaWFsb2dDbG9zZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZ2xvYmFsRGF0YTogSUdyaWRGaWx0ZXJbXSA9IFtdO1xuXG4gIHNvcnREaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGVkaXRBbGxyb3dzQXRPbmVUaW1lOiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKSBwdWJsaWMgc2hvd1JlZnJlc2hCdG46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBwdWJsaWMgaGlkZVJlZnJlc2hCdG46IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vIFN0b3JlcyBzZWxlY3RlZCBjb2x1bW5zXG4gIHByaXZhdGUgX3NlbGVjdGVkQ29sdW1uczogSUdyaWRDb2x1bW5bXSA9IFtdO1xuICBzZWxlY3RlZFRvZ2dsZUNvbHVtbnM6IElHcmlkQ29sdW1uW10gPSBbXTtcbiAgXG4gIHZpc2libGVDb2x1bW5zOiBJR3JpZENvbHVtbltdID0gW107XG4gIC8vIEJvb2xlYW4gcHJvcCB0byBhbGxvdyBob3Jpem9udGFsIFNjcm9sbCBvbiBUYWJsZS5cbiAgQElucHV0KCkgaG9yaXpvbnRhbFNjcm9sbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIEJvb2xlYW4gcHJvcCB0byBoaWRlIHRoZSBkZWxldGUgcm93IGJ1dHRvbi5cbiAgQElucHV0KCkgaGlkZURlbGV0ZUJ0biA9IGZhbHNlO1xuXG4gIC8vIEJvb2xlYW4gcHJvcCB0byBoaWRlIHRoZSBlZGl0IHJvdyBidXR0b24uXG4gIEBJbnB1dCgpIGhpZGVFZGl0QnRuID0gZmFsc2U7XG5cbiAgLy8gQm9vbGVhbiBwcm9wIHRvIGhpZGUgdGhlIGFkZCByb3cgYnV0dG9uLlxuICBASW5wdXQoKSBoaWRlQWRkQnRuID0gZmFsc2U7XG5cbiAgLy8gUHJvcCB0byBoYW5kbGUgbG9hZGVyIG9mIGdyaWRcbiAgQElucHV0KCkgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcblxuICAvL3RoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBoYW5kbGUgc2VydmVyIHNpZGUgZXZlbnQgYnkgZGVmYXVsdCBpdCBpcyB0cnVlIHdoZW4gaXQgZmFsc2Ugc2VydmVyIHNpZGUgZXZlbnQgd2lsbCBub3QgYmUgY2FsbGVkXG4gIEBJbnB1dCgpIGF1dG9Mb2FkRGF0YTogYm9vbGVhbiA9IHRydWU7XG5cblxuICAvL3RhYmxlIHJvdyBzdHlsZXNcbiAgQElucHV0KCkgcm93U3R5bGU6IHN0cmluZztcblxuICAvLyBCb29sZWFuIHByb3AgdG8gY2hlY2sgd2hlcmUgc2VsZWN0ZWQgaXMgYWxsb3dlZCBvciBub3QuXG4gIEBJbnB1dCgpIGFsbG93U2VsZWN0aW9uID0gZmFsc2U7XG5cbiAgLy8gU2V0IGNvbHVtbiB3aWR0aCBvZiBzZWxlY3RlZCByb3cuXG4gIEBJbnB1dCgpIHNlbGVjdGlvbkNvbHVtbldpZHRoOiBzdHJpbmcgPSAnODBweCc7XG5cbiAgLy8gc2V0IHNlbGVjdGlvbiBjaGVja0JveCBoZWFkZXJcbiAgQElucHV0KCkgYWxsb3dTZWxlY3Rpb25IZWFkZXI6IHN0cmluZyA9ICcnO1xuXG4gIC8vIEJvb2xlYW4gcHJvcCB0byBoaWRlIHRoZSBzYXZlIGJ1dHRvbiBvbiB0b3Agb2YgZ3JpZC5cbiAgQElucHV0KCkgaGlkZUdyaWRTYXZlQnV0dG9uID0gZmFsc2U7XG5cbiAgLy8gQm9vbGVhbiBwcm9wIHRvIGhpZGUgdGhlIHNhdmUgYnV0dG9uIG9uIHRvcCBvZiBncmlkLlxuICBASW5wdXQoKSBoaWRlR3JpZENhbmNlbEJ1dHRvbiA9IGZhbHNlO1xuXG4gIC8vIEJvb2xlYW4gcHJvcCB0byBhbGxvdyBleHBvcnQgdG8gcGRmLlxuICBASW5wdXQoKSBhbGxvd0V4cG9ydFRvUGRmID0gZmFsc2U7XG5cbiAgLy8gQm9vbGVhbiBwcm9wIHRvIGFsbG93IGV4cG9ydCB0byBleGNlbC5cbiAgQElucHV0KCkgYWxsb3dFeHBvcnRUb0V4Y2VsID0gZmFsc2U7XG5cbiAgLy8gQm9vbGVhbiBwcm9wIHRvIHNldCB0aGUgYWN0aW9uIGNvbHVtbiBhcyBmaXJzdCBjb2x1bW4uXG4gIEBJbnB1dCgpIHNldEFjdGlvbkNvbHVtbkFzRmlyc3QgPSBmYWxzZTtcblxuICAvLyBJZiB0cnVlLCBlbmFibGVzIG9wdGlvbnMgdG8gcGVyZm9ybSBDUlVEIHVzaW5nIGlubGluZSByb3cgZnVuY3Rpb25hbGl0eVxuICBASW5wdXQoKSB1c2VJbmxpbmVDUlVEID0gZmFsc2U7XG5cbiAgLy8gQXJyYXkgb2Ygcm93IGFjdGlvbnNcbiAgQElucHV0KCkgcm93QWN0aW9uczogSUdyaWRSb3dBY3Rpb25bXSA9IFtdO1xuXG4gIC8vIFNldHMgc2VsZWN0aW9uIHR5cGUgaS5lOiBzaW5nbGUvbXVsdGlwbGUgc2VsZWN0aW9uXG4gIEBJbnB1dCgpIHNlbGVjdGlvblR5cGU6IEVHcmlkU2VsZWN0aW9uVHlwZSA9IEVHcmlkU2VsZWN0aW9uVHlwZS5TSU5HTEU7XG5cbiAgLy8gVW5pcXVlIGtleSByZXF1aXJlcyBmb3IgYnVpbHQtaW4gcm93IHNlbGVjdGlvbiBvZiBwcmltZU5nIGdyaWRcbiAgQElucHV0KCkgZGF0YUtleTogc3RyaW5nID0gJ3RlbXBfaWQnO1xuXG4gIC8vIEZsYWcgZm9yIGNsZWFyIGZpbHRlciB2YWx1ZXMgYnV0dG9uXG4gIEBJbnB1dCgpIGNsZWFyR3JpZEZpbHRlciA9IHRydWU7XG5cbiAgLy8gRmxhZyBmb3Igc2VhcmNoIGZpbHRlciB2YWx1ZXMgYnV0dG9uXG4gIEBJbnB1dCgpIHNlYXJjaEdyaWRGaWx0ZXIgPSB0cnVlO1xuXG4gIC8vIEZsYWcgaW4gY2FzZSB0YWJsZSBpcyBzY3JvbGxhYmxlXG4gIEBJbnB1dCgpIHNjcm9sbGFibGUgPSB0cnVlO1xuXG4gIC8vIFNldHMgc2Nyb2xsIGhlaWdodCBmb3IgdGhlIHRhYmxlXG4gIEBJbnB1dCgpIHNjcm9sbEhlaWdodCA9ICc4MHZoJztcblxuICAvLyBUYWJsZSBzdHlsZVxuICBASW5wdXQoKSB0YWJsZVN0eWxlID0gJyc7XG5cbiAgLy8gQm9vbGVhbiBwcm9wIHRvIGFsbG93IHRvIHdyYXAgb3IgdW5XcmFwIHRoZSBncmlkLlxuICBASW5wdXQoKSB3b3JkV3JhcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIG5ld0dyaWRSb3c6IGFueSA9IHt9O1xuXG4gIEBJbnB1dCgpIGZpbHRlcmluZyA9IHRydWU7XG5cbiAgQElucHV0KCkgcmVwb3J0QnV0dG9uczogYW55W10gPSBbXTtcblxuICBASW5wdXQoKSByb3dIb3ZlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGhpZGVGaWx0ZXJPcHRpb25zOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyBTZXRzIHBhZ2VuYXRpb24gZm9yIHRoZSB0YWJsZSBEYXRhLlxuICBASW5wdXQoKSBzZXRQYWdpbmF0aW9uTGVuZ3RoOiBhbnlbXSA9IFs1LCAxMCwgMTUsIHsgc2hvd0FsbDogJ0FsbCcgfV07XG5cbiAgLy8gc2V0IHRoZSBjaGFuZ2UgaW4gdGhlIHJvd0RhdGFcbiAgQE91dHB1dCgpIHJvd3NDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKipcbiAgICogU3RvcHMgdGhlIGxvYWRlciBhbmQgc2V0cyB0aGUgZGF0YSB0byBncmlkXG4gICAqIENsZWFycyB0aGUgZWRpdGluZyBzdGFja1xuICAgKiBTY3JvbGxzIHRvIHNlbGVjdGVkIGVsZW1lbnQgaWYgc2VsZWN0aW9uIGZvdW5kXG4gICAqL1xuICBASW5wdXQoKSBzZXQgcm93cyhkYXRhOiBhbnlbXSkge1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIGlmICghdGhpcy5yb3dVcGRhdGVDaGFuZ2UpIHtcbiAgICAgIGlmICghdGhpcy5pc0NoZWNrQm94Q2hhbmdlRXZlbnRDYWxsZWQpIHtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGFLZXkpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YUtleSA9ICd0ZW1wX2lkJztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgcm93c0RhdGEgPSB0aGlzLmdyaWRTZXJ2aWNlLnNldERhdGFGaWVsZHMoZGF0YSwgdGhpcy5kYXRhS2V5KTtcbiAgICAgICAgICBpZiAoZGF0YT8ubGVuZ3RoID4gNDAgJiYgIXRoaXMucGFnaW5hdGlvbiAmJiAhdGhpcy5ncmlkU2VydmljZT8ucm93VXBkYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBpbml0aWFsaXplRGF0YSA9IFsuLi5yb3dzRGF0YV07XG4gICAgICAgICAgICB0aGlzLnJvd3NEYXRhID0gaW5pdGlhbGl6ZURhdGEuc3BsaWNlKDAsIDQwKTtcbiAgICAgICAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1haW5pbmdSb3dzRGF0YSA9IFsuLi5yb3dzRGF0YV07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29sdW1ucyAmJiB0aGlzLmNvbHVtbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1ucz8uZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4/LmFnZ3JlZ2F0ZT8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWdncmVnYXRlVGV4dChjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm93c0RhdGEgPSByb3dzRGF0YTtcbiAgICAgICAgICAgIHRoaXMucmVtYWluaW5nUm93c0RhdGEgPSBbLi4ucm93c0RhdGFdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmVkaXRSb3dzUmVjb3JkcyA9IHt9O1xuXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSb3dzICYmIHRoaXMuZ3JpZFJvdz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50UmVmID0gdGhpcy5ncmlkUm93LmZpbmQoXG4gICAgICAgICAgICAgICh4KSA9PiB4Lm5hdGl2ZUVsZW1lbnQuaWQgPT09IHRoaXMuc2VsZWN0ZWRSb3dzW3RoaXMuZGF0YUtleV1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRSZWYgJiZcbiAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxUYWJsZVJvd0VsZW1lbnRcbiAgICAgICAgICAgICAgKS5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvL21hbmlwdWxhdGUgY2hlY2tib3ggc3RyaW5nIHZhbHVlIHRvIHRydWUgYW5kIGZhbHNlLlxuICAgICAgICAgIHRoaXMuY2hhbmdlQ2hlY2tib3hTdHJpbmdWYWx1ZSgpO1xuICAgICAgICAgIHRoaXMuc2V0TnVtZXJpY1ZhbHVlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucm93c0RhdGEgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEdsb2JhbCBmaWx0ZXIgc2VydmVyIHJlcXVlc3RcbiAgQElucHV0KCkgc2V0IGdsb2JhbEZpbHRlckRhdGEoZ2xvYmFsRmlsdGVyczogSUdsb2JhbEZpbHRlcltdKSB7XG4gICAgdGhpcy5nbG9iYWxEYXRhID0gdGhpcy5ncmlkU2VydmljZVxuICAgICAgLnByZXBhcmVHbG9iYWxGaWx0ZXJzKGdsb2JhbEZpbHRlcnMpXG4gICAgICA/LmZpbHRlcigoeCkgPT4geD8udmFsdWUgIT09IGZhbHNlKTtcbiAgICBjb25zdCBzZXJ2ZXJGaWx0ZXJWYWx1ZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuc2VydmVyRmlsdGVycykpO1xuICAgIHNlcnZlckZpbHRlclZhbHVlcy5maWx0ZXJzID0gdGhpcy5zZXJ2ZXJGaWx0ZXJzLmZpbHRlcnNcbiAgICAgID8gdGhpcy5zZXJ2ZXJGaWx0ZXJzLmZpbHRlcnMuY29uY2F0KHRoaXMuZ2xvYmFsRGF0YSlcbiAgICAgIDogdGhpcy5nbG9iYWxEYXRhO1xuXG4gICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdhcHBseUZpbHRlcicpID09PSAnZmFsc2UnKSB7XG4gICAgICB0aGlzLmdsb2JhbEZpbHRlcnNBcnJheSA9IHRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5Py5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5nbG9iYWxGaWx0ZXJzQXJyYXkuY29uY2F0KFsuLi5zZXJ2ZXJGaWx0ZXJWYWx1ZXMuZmlsdGVyc10pXG4gICAgICAgIDogdGhpcy5nbG9iYWxGaWx0ZXJzQXJyYXk7XG4gICAgfVxuICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYXBwbHlGaWx0ZXInKSA9PT0gJ3RydWUnKSB7XG4gICAgICBnbG9iYWxGaWx0ZXJzLmZvckVhY2goKGdsb2JhbEZpbHRlcikgPT4ge1xuICAgICAgICB0aGlzLmdsb2JhbEZpbHRlcnNBcnJheS5mb3JFYWNoKChmaWx0ZXJBcnJheSkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGZpbHRlckFycmF5LmZpZWxkID09PSBnbG9iYWxGaWx0ZXIuZmllbGQgJiZcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci52YWx1ZSAmJlxuICAgICAgICAgICAgZmlsdGVyQXJyYXkudmFsdWUgIT09IGdsb2JhbEZpbHRlci52YWx1ZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlsdGVyQXJyYXkudmFsdWUgPSBnbG9iYWxGaWx0ZXIudmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGZpbmRJbmRleCA9IHRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5LmZpbmRJbmRleChcbiAgICAgICAgICAgIChpbmRleCkgPT4gaW5kZXguZmllbGQgPT09IGdsb2JhbEZpbHRlci5maWVsZCAmJiAhZ2xvYmFsRmlsdGVyLnZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZmluZEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJzQXJyYXkuc3BsaWNlKGZpbmRJbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlLy90aGlzLmF1dG9Mb2FkRGF0YTtcbiAgICAgIGlmICh0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgfHwgdGhpcy5hdXRvTG9hZERhdGEpIHtcbiAgICAgICAgdGhpcy5vbkFwcGx5RmlsdGVyLmVtaXQoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmdsb2JhbEZpbHRlcnNBcnJheSAmJiB0aGlzLmdsb2JhbEZpbHRlcnNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNlcnZlckZpbHRlclZhbHVlcy5maWx0ZXJzID0gc2VydmVyRmlsdGVyVmFsdWVzLmZpbHRlcnMuY29uY2F0KFxuICAgICAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzZXJ2ZXJGaWx0ZXJWYWx1ZXMuZmlsdGVycyA9IEFycmF5LmZyb20oXG4gICAgICAgIG5ldyBTZXQoXG4gICAgICAgICAgc2VydmVyRmlsdGVyVmFsdWVzLmZpbHRlcnNcbiAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgIC5tYXAoKGZpbHRlcjogYW55KSA9PiBmaWx0ZXIuZmllbGQpXG4gICAgICAgIClcbiAgICAgICkubWFwKChmaWVsZCkgPT4ge1xuICAgICAgICByZXR1cm4gc2VydmVyRmlsdGVyVmFsdWVzLmZpbHRlcnMuZmluZCgoeDogYW55KSA9PiB4LmZpZWxkID09PSBmaWVsZCk7XG4gICAgICB9KTtcbiAgICAgIHNlcnZlckZpbHRlclZhbHVlcy5maWx0ZXJzID0gc2VydmVyRmlsdGVyVmFsdWVzLmZpbHRlcnMuZmlsdGVyKFxuICAgICAgICAob2JqOiBhbnkpID0+XG4gICAgICAgICAgb2JqPy52YWx1ZSAmJiBvYmoudmFsdWU/LnRvU3RyaW5nKCk/Lmxlbmd0aCA+IDAgJiYgb2JqLmZpZWxkXG4gICAgICApO1xuICAgICAgdGhpcy5ncmlkU2VydmljZS5zb2Z0Q2FjaGluZ0ZpbHRlcnNbdGhpcy5jb21wb25lbnRUYWJsZVJlZj8uaWQgKyB0aGlzLmN1cnJlbnRVcmxdID0gc2VydmVyRmlsdGVyVmFsdWVzO1xuICAgICAgaWYgKHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCB8fCB0aGlzLmF1dG9Mb2FkRGF0YSA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBzZXR0aW5nIHBhZ2luYXRpb24gcGFnZSBhcyBmaXJzdFxuICAgICAgICBzZXJ2ZXJGaWx0ZXJWYWx1ZXMucGFnZSA9IDE7XG4gICAgICAgIHRoaXMuYXV0b0xvYWREYXRhID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFJvd3MgJiYgdGhpcy5wYWdpbmF0aW9uKSB7XG4gICAgICAgICAgc2VydmVyRmlsdGVyVmFsdWVzLnBhZ2VTaXplID0gdGhpcy5kZWZhdWx0Um93cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ncmlkU2VydmljZS5hcHBseUZpbHRlckV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5zZXR1cEVudGVyTGlzdGVuZXIoKVxuICAgICAgICAgIHRoaXMuaXNDaGVja0JveENoYW5nZUV2ZW50Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5vblNlcnZlclNpZGVFdmVudENoYW5nZS5lbWl0KHNlcnZlckZpbHRlclZhbHVlcyk7XG4gICAgICAgICAgdGhpcy5lZGl0aW5nUm93S2V5cyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdhcHBseUZpbHRlcicpO1xuICAgICAgICAvLyBzZXR0aW5nIHBhZ2luYXRpb24gcGFnZSBudW1iZXIgVUlcbiAgICAgICAgdGhpcy50YWJsZS5fZmlyc3QgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzZXR1cEVudGVyTGlzdGVuZXIoKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLmhhbmRsZUtleVVwKTtcbiAgfVxuICBoYW5kbGVLZXlVcCA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIGNvbnN0IGZvY3VzZWRFbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGlmIChmb2N1c2VkRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZm9jdXNlZEVsZW1lbnQudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2VsZWN0Um9vdEVsZW1lbnQoZm9jdXNlZEVsZW1lbnQpLmJsdXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gSW5wdXQgZGVjb3JhdG9yIHRvIHJlY2VpdmUgY29sdW1ucyB0byBiZSBkaXNwbGF5ZWQgaW4gaGVhZGVyXG4gIEBJbnB1dCgpIGNvbHVtbnM6IElHcmlkQ29sdW1uW10gPSBbXTtcblxuICBASW5wdXQoKSBwZXJtaXNzaW9uczogSVBlcm1pc3Npb25bXSA9IFtdO1xuXG4gIC8vIE9wdGlvbmFsIHByb3AgdG8gaGFuZGxlIHRvZ2dsaW5nIG9mIGNvbHVtbnNcbiAgQElucHV0KCkgYWxsb3dDb2x1bW5Ub2dnbGUgPSBmYWxzZTtcblxuICAvLyBPcHRpb25hbCBwcm9wIHRvIGhpZGUgZmlsdGVyaW5nIG9mIGNvbHVtbnNcbiAgQElucHV0KCkgaGlkZUZpbHRlciA9IGZhbHNlO1xuXG4gIC8vIE9wdGlvbmFsIHByb3AgdG8gaGFuZGxlIGxvb2t1cCBmaWx0ZXJzXG4gIEBJbnB1dCgpIGxvb2t1cEZpbHRlcnMgPSBmYWxzZTtcblxuICAvLyBPcHRpb25hbCBwcm9wIHRvIGhhbmRsZSBwYWdpbmF0aW9uXG4gIEBJbnB1dCgpIHBhZ2luYXRpb24gPSBmYWxzZTtcblxuICAvLyBPcHRpb25hbCBwcm9wIHRvIGhhbmRsZSBzaG93IEN1cnJlbnRQYWdlIFJlcG9ydFxuICBASW5wdXQoKSBzaG93Q3VycmVudFBhZ2VSZXBvcnQgPSBmYWxzZTtcblxuICAvLyBEaXNwbGF5cyB0b3RhbCBudW1iZXIgb2YgcmVjb3Jkc1xuICBASW5wdXQoKSB0b3RhbFJlY29yZHMgPSAwO1xuXG4gIC8vIERpc3BsYXlzIGFnZ3JlZ2F0ZSB0aGF0IGZldGNoIGZyb20gcmVjb3Jkc1xuICBASW5wdXQoKSBhZ2dyZWdhdGVkUmVzdWx0OiBhbnlbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIHNob3djb25maXJtRGlhbG9nOiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKSBzYXZlQWxsRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIFNldHMgbnVtYmVyIG9mIHJvd3MgdG8gYmUgc2hvd24gdGhlIGdyaWRcbiAgQElucHV0KCkgZGVmYXVsdFJvd3M6IG51bWJlciA9IDA7XG5cbiAgQElucHV0KCkgY29sdW1uQWN0aW9uczogSUdyaWRDb2x1bW5BY3Rpb25bXSA9IFtdO1xuXG4gIC8vIERlY2lkZXMgdGhlIGdyaWQncyBiZWhhdmlvciBlaXRoZXIgZm9yIGNsaWVudCBzaWRlIG9yIHNlcnZlciBzaWRlIGV2ZW50c1xuICBASW5wdXQoKSB1c2VTZXJ2ZXJTaWRlRXZlbnRzID0gZmFsc2U7XG5cbiAgLy8gT3V0cHV0IGV2ZW50IHRvIGhhbmRsZSByb3cgY2xpY2tcbiAgQE91dHB1dCgpIG9uUm93Q2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8vIE91dHB1dCBldmVudCBlbWl0IHdoZW4gY2xpY2sgb24gZ3JpZCBjaGVja2JveCBmaWx0ZXJcbiAgQE91dHB1dCgpIG9uQ2hlY2tCb3hGaWx0ZXJDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLy8gT3V0cHV0IGV2ZW50IHRvIGhhbmRsZSByb3cgQ2hlY2tCb3hcbiAgQE91dHB1dCgpIG9uUm93Q2hlY2tCb3g6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8vIE91dHB1dCBldmVudCB0byB0cmlnZ2VyIG9uIHNvcnQgY2hhbmdlXG4gIEBPdXRwdXQoKSBvblNvcnRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJR3JpZFNvcnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8vIE91dHB1dCBldmVudCB0byB0cmlnZ2VyIG9uIGZpbHRlciBjaGFuZ2VcbiAgQE91dHB1dCgpIG9uRmlsdGVyQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvLyBPdXRwdXQgZXZlbnQgdG8gaW52b2tlIHRoZSBtdWx0aVNlbGVjdGlvbiBjbGljayBldmVudFxuICBAT3V0cHV0KCkgb25NdWx0aVNlbGVjdGlvbkNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLy8gQ2FsbHMgd2hlbmV2ZXIgYSBncmlkIGFuZCBnbG9iYWxGaWx0ZXJzIGNhbGxlZFxuICBAT3V0cHV0KCkgb25BcHBseUZpbHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLy9zZXQgaGVhZGVyIGNoZWNrYm94IHZhbHVlIGZvciBnZXR0aW5nIGFsbCBjb2x1bW5zIG9uIHN0YXkgYWRtaW5cbiAgQE91dHB1dCgpIGlzSW5jbHVkZWRBbGxDb2x1bW5zOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvLyBDYWxscyB3aGVuZXZlciBhIGxhenkgZXZlbnQgaXMgZGlzcGF0Y2hlZFxuICBAT3V0cHV0KClcbiAgb25TZXJ2ZXJTaWRlRXZlbnRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJR3JpZFNlcnZlclNpZGVFdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvLyBPdXRwdXQgZXZlbnQgdG8gdHJpZ2dlciBvbiBwYWdpbmF0aW9uXG4gIEBPdXRwdXQoKVxuICBvblBhZ2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJR3JpZFBhZ2luYXRpb25FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLy8gRGlzcGF0Y2ggb3V0cHV0IGV2ZW50IHRyaWdnZXIgb24gZWRpdCByb3dcbiAgQE91dHB1dCgpIG9uUm93VXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8vIERpc3BhdGNoIG91dHB1dCBldmVudCB0cmlnZ2VyIGNhbmNlbCBhbGwgcm93c1xuICBAT3V0cHV0KCkgb25DYW5jZWxBbGxSb3dzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8vIERpc3BhdGNoIG91dHB1dCBldmVudCB0cmlnZ2VyIG9uIGRlbGV0ZSByb3dcbiAgQE91dHB1dCgpIG9uUm93RGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8vRGlzcGF0Y2ggb3V0cHV0IGV2ZW50IHRyaWdnZXIgb24gYWRkIHJvd1xuICBAT3V0cHV0KCkgb25Sb3dBZGQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLy9EaXNwYXRjaCBvdXRwdXQgZXZlbnQgdHJpZ2dlciBvbiBhZGQsIHVwZGF0ZSBhbmQgZGVsZXRlIHJvd1xuICBAT3V0cHV0KCkgb25HcmlkUm93QWN0aW9ucyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvLyBzZXQgcHJvcGVydHkgYWxsb3dDYWNoaW5nIGZvciBMb2NhbFN0b3JhZ2VcbiAgQElucHV0KCkgYWxsb3dDYWNoaW5nOiBib29sZWFuO1xuXG4gIC8vc2V0IE11bHRpc2VsZWN0IFRvZ2dsZSBDb2x1bW5zXG4gIEBJbnB1dCgpIGFsbG93UGVyc2lzdGVuY2U6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vIHNldCBwcm9wZXJ0eSBzb2Z0Q2FjaGluZyBmb3Igc2V0dGluZyB0aGUgdmFsdWVzIG9mIGdyaWRGaWx0ZXJcbiAgQElucHV0KCkgc29mdENhY2hpbmc6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpIGVkaXRBbGxSb3dzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gc2V0IHRoZSByb3cgV2hlbiBFZGl0IHRoZSByb3cgb24gR3JpZFxuICBAT3V0cHV0KCkgb25HcmlkUm93RWRpdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvLyBzZXQgdGhlIHJvdyBXaGVuIGFkZGluZyB0aGUgbmV3IFJvdyBvbiBHcmlkXG4gIEBPdXRwdXQoKSBvbkdyaWRSb3dBZGQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQElucHV0KCkgZ3JpZE5hbWU6IHN0cmluZyA9ICcnO1xuICBpc0dyaWRIaWRkZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgYXV0b1Jlc2l6ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBhbGxvd1RleHRDb3B5OiBib29sZWFuID0gZmFsc2U7XG5cblxuICByb3dzUGVyUGFnZU9wdGlvbnM6IGFueVtdID0gWzUsIDEwLCAxNSwgeyBzaG93QWxsOiAnQWxsJyB9XTtcbiAgY3VzdG9tV2lkdGhDb2x1bW5zOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gIHNlbGVjdGVkUm93UmVjb3JkOmFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBTeXN0ZW1Db25maWdTZXJ2aWNlLFxuICAgIHB1YmxpYyBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybVNlcnZpY2U6IEZvcm1TZXJ2aWNlLFxuICAgIHB1YmxpYyBncmlkU2VydmljZTogR3JpZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoZW50aWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHB1YmxpYyBkZWNpbWFsUGlwZTogRGVjaW1hbFBpcGUsXG4gICAgcHJpdmF0ZSBwYWdlTG9nZ2VyU2VydmljZTogUGFnZUxvZ2dlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBoeXBlcmxpbmtTZXJ2aWNlOiBIeXBlcmxpbmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwdWJsaWMgY29uZmlybWF0aW9uU2VydmljZTogQ29uZmlybWF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSByZXF1ZXN0U2VydmljZSA6IFJlcXVlc3RTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHB1YmxpYyBjb25maWc6IER5bmFtaWNEaWFsb2dDb25maWcsXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIHJlZjogRHluYW1pY0RpYWxvZ1JlZlxuICApIHsgfVxuXG4gIGNvbnNvbGVMb2cobWVzc2FnZTogYW55KSB7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG4gIH1cblxuICBtb3VzZUxlYXZlRXZlbnQob3ZlcmxheVBhbmVsKXtcbiAgICBvdmVybGF5UGFuZWwuaGlkZSgpO1xuICB9IFxuICBvbkNvbHVtblJlc2l6ZShldmVudDogYW55LGR0KSB7XG4gICAgaWYoZHQ/LmVsPy5uYXRpdmVFbGVtZW50Py5pZCl7XG4gICAgICB0aGlzLmdyaWRJZCA9IGR0LmVsLm5hdGl2ZUVsZW1lbnQuaWQ7XG4gICAgfVxuICAgIGNvbnN0IG5ld1dpZHRoID0gZXZlbnQuZWxlbWVudC5jbGllbnRXaWR0aCArIDI7XG4gICAgbGV0IGNvbHVtbkhlYWRlciA9IGV2ZW50Py5lbGVtZW50Py5pZD8udG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoY29sdW1uSGVhZGVyKSB7XG4gICAgICBsZXQgaW5kZXg6IGFueSA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZpbmRJbmRleCgoY29sdW1uKSA9PiBjb2x1bW4uaGVhZGVyPy50b0xvd2VyQ2FzZSgpID09IGNvbHVtbkhlYWRlcik7XG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICBpZiAobmV3V2lkdGgpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uc1tpbmRleF1bJ2N1c3RvbVdpZHRoJ10gPSBwYXJzZUludChuZXdXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zYXZlQ29sdW1uV2lkdGhzKCk7XG4gIH1cbiAgc2F2ZUNvbHVtbldpZHRocyh0b2dnbGVDb2x1bW5zOiBhbnlbXSA9IFtdKSB7XG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICBpZiAoY29sdW1uLmZpZWxkICYmIGNvbHVtbi5jdXN0b21XaWR0aCkge1xuICAgICAgICB0aGlzLmN1c3RvbVdpZHRoQ29sdW1uc1tjb2x1bW4uZmllbGRdID0gY29sdW1uLmN1c3RvbVdpZHRoO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHNlbGVjdGVkRmllbGRzID0gdG9nZ2xlQ29sdW1ucz8ubGVuZ3RoID4gMCA/IHRvZ2dsZUNvbHVtbnMgOiB0aGlzLl9zZWxlY3RlZENvbHVtbnMubWFwKCh4KSA9PiB4LmZpZWxkKTtcbiAgICB0aGlzLnNldE11bHRpU2VsZWN0VG9nZ2xlQ29sdW1uKHNlbGVjdGVkRmllbGRzKTtcbiAgfVxuICBsb2FkQ29sdW1uV2lkdGhzKCkge1xuICAgIGxldCBjdXJyZW50VXNlckluZm8gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdDdXJyZW50VXNlckluZm8nKSk7XG4gICAgaWYgKGN1cnJlbnRVc2VySW5mbyAmJiBjdXJyZW50VXNlckluZm8ucGFnZVNldHRpbmcpIHtcbiAgICAgIGxldCBwYWdlU2V0dGluZ3MgPSBKU09OLnBhcnNlKGN1cnJlbnRVc2VySW5mby5wYWdlU2V0dGluZylcbiAgICAgIHBhZ2VTZXR0aW5ncy5wYWdlU2V0dGluZ3MubWFwKHBhZ2UgPT4ge1xuICAgICAgICBpZiAocGFnZS51cmwgPT09IHRoaXMucm91dGVyLnVybCkge1xuICAgICAgICAgIHBhZ2UuZ3JpZFNldHRpbmdzLm1hcChncmlkU2V0dGluZyA9PiB7XG4gICAgICAgICAgICBpZiAoZ3JpZFNldHRpbmcuZ3JpZElkID09PSB0aGlzLmdyaWRJZCAmJiBncmlkU2V0dGluZz8uY3VzdG9tQ29sdW1uc1dpZHRoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbHVtbnNXaWR0aEtleXMgPSBPYmplY3Qua2V5cyhncmlkU2V0dGluZz8uY3VzdG9tQ29sdW1uc1dpZHRoKTtcbiAgICAgICAgICAgICAgY29sdW1uc1dpZHRoS2V5cy5mb3JFYWNoKChjb2x1bW5LZXk6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb2x1bW5zLmZpbmRJbmRleCgoc2VsZWN0ZWRDb2x1bW4pID0+IHNlbGVjdGVkQ29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpID09PSBjb2x1bW5LZXk/LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbnNbaW5kZXhdWydjdXN0b21XaWR0aCddID0gZ3JpZFNldHRpbmc/LmN1c3RvbUNvbHVtbnNXaWR0aFtjb2x1bW5LZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGFkZER5bmFtaWNQYW5lbE92ZXJsYXlDb21wb25lbnQoaG92ZXJEYXRhOiBhbnksIG92ZXJsYXlQYW5lbDogYW55LCBldmVudDogYW55LCByb3c6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHsgLi4uaG92ZXJEYXRhLmRhdGEgfTtcbiAgICAgIGNvbnN0IGRhdGFLZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gICAgICBjb25zdCByb3dLZXlzID0gT2JqZWN0LmtleXMocm93KTtcbiAgICAgIGlmKGRhdGFLZXlzPy5sZW5ndGg+MCAmJiByb3dLZXlzPy5sZW5ndGggPiAwKXtcbiAgICAgICAgZGF0YUtleXMuZm9yRWFjaChrZXk9PntcbiAgICAgICAgICB2YXIgdmFsdWU9ZGF0YVtrZXldO1xuICAgICAgICAgIGlmKHZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCd7JykmJnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCd9Jykpe1xuICAgICAgICAgICAgdmFsdWU9dmFsdWUucmVwbGFjZShcIntcIixcIlwiKS5yZXBsYWNlKFwifVwiLFwiXCIpO1xuICAgICAgICAgICAgbGV0IHJvd0tleT1yb3dLZXlzPy5maW5kKCh4KSA9PiB4Py50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICB2YXIgY29ycmVjdFZhbHVlPXJvd1tyb3dLZXldO1xuICAgICAgICAgICAgZGF0YVtrZXldPWNvcnJlY3RWYWx1ZTtcbiAgICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaEtleSA9IHJvd0tleXMuZmluZCgoeCkgPT4geD8udG9Mb3dlckNhc2UoKSA9PT0ga2V5Py50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIGlmKG1hdGNoS2V5JiYgIWRhdGFba2V5XSl7XG4gICAgICAgICAgICAgIGRhdGFba2V5XT1yb3dbbWF0Y2hLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaG92ZXJEYXRhPy5zdHlsZSA/IHRoaXMub3ZlcmxheVBhbmVsU3R5bGUgPSBob3ZlckRhdGEuc3R5bGUgOiBcIlwiO1xuICAgICAgdGhpcy5wYW5lbE92ZXJsYXlWaWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWY6IGFueSA9IHRoaXMucGFuZWxPdmVybGF5Vmlld0NvbnRhaW5lcj8uY3JlYXRlQ29tcG9uZW50KGhvdmVyRGF0YS5jb21wb25lbnQpO1xuICAgICAgaWYgKGhvdmVyRGF0YS5kYXRhKSB7XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jb25maWcgPSBbXTtcbiAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmNvbmZpZy5kYXRhID0gZGF0YTtcbiAgICAgIH1cbiAgICAgIG92ZXJsYXlQYW5lbC5zaG93KGV2ZW50KTtcbiAgICB9KTtcblxuICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vICAgY29uc3QgZGF0YSA9IHsgLi4uaG92ZXJEYXRhLmRhdGEgfTtcbiAgICAvLyAgIGNvbnN0IGRhdGFLZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gICAgLy8gICBjb25zdCByb3dLZXlzID0gT2JqZWN0LmtleXMocm93KTtcbiAgICAvLyAgIGlmKGRhdGFLZXlzPy5sZW5ndGg+MCAmJiByb3dLZXlzPy5sZW5ndGggPiAwKXtcbiAgICAvLyAgICAgZGF0YUtleXMuZm9yRWFjaChrZXk9PntcbiAgICAvLyAgICAgICB2YXIgdmFsdWU9ZGF0YVtrZXldO1xuICAgIC8vICAgICAgIGlmKHZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCd7JykmJnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCd9Jykpe1xuICAgIC8vICAgICAgICAgdmFsdWU9dmFsdWUucmVwbGFjZShcIntcIixcIlwiKS5yZXBsYWNlKFwifVwiLFwiXCIpO1xuICAgIC8vICAgICAgICAgbGV0IHJvd0tleT1yb3dLZXlzPy5maW5kKCh4KSA9PiB4Py50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSk7XG4gICAgLy8gICAgICAgICB2YXIgY29ycmVjdFZhbHVlPXJvd1tyb3dLZXldO1xuICAgIC8vICAgICAgICAgZGF0YVtrZXldPWNvcnJlY3RWYWx1ZTtcbiAgICAvLyAgICAgICB9ZWxzZSB7XG4gICAgLy8gICAgICAgICBjb25zdCBtYXRjaEtleSA9IHJvd0tleXMuZmluZCgoeCkgPT4geD8udG9Mb3dlckNhc2UoKSA9PT0ga2V5Py50b0xvd2VyQ2FzZSgpKTtcbiAgICAvLyAgICAgICAgIGlmKG1hdGNoS2V5JiYgIWRhdGFba2V5XSl7XG4gICAgLy8gICAgICAgICAgIGRhdGFba2V5XT1yb3dbbWF0Y2hLZXldO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgfSlcbiAgICAvLyAgIH1cblxuICAgIC8vICAgaG92ZXJEYXRhPy5zdHlsZSA/IHRoaXMub3ZlcmxheVBhbmVsU3R5bGUgPSBob3ZlckRhdGEuc3R5bGUgOiBcIlwiO1xuICAgIC8vICAgdGhpcy5wYW5lbE92ZXJsYXlWaWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgLy8gICBjb25zdCBjb21wb25lbnRSZWY6IGFueSA9IHRoaXMucGFuZWxPdmVybGF5Vmlld0NvbnRhaW5lcj8uY3JlYXRlQ29tcG9uZW50KGhvdmVyRGF0YS5jb21wb25lbnQpO1xuICAgIC8vICAgaWYgKGhvdmVyRGF0YS5kYXRhKSB7XG4gICAgLy8gICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jb25maWcgPSBbXTtcbiAgICAvLyAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmNvbmZpZy5kYXRhID0gZGF0YTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIG92ZXJsYXlQYW5lbC5zaG93KGV2ZW50KTtcbiAgICAvLyB9LCAxMDAwKTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZENvbHVtbnMoKTogSUdyaWRDb2x1bW5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkQ29sdW1ucztcbiAgfVxuXG4gIHNldCBzZWxlY3RlZENvbHVtbnModmFsOiBJR3JpZENvbHVtbltdKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zPy5maWx0ZXIoKGNvbCkgPT4gdmFsLmluY2x1ZGVzKGNvbCkpO1xuICAgIGlmICh0aGlzLmFsbG93UGVyc2lzdGVuY2UgJiYgdGhpcy5hbGxvd0NvbHVtblRvZ2dsZSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRGaWVsZHMgPSB2YWwubWFwKCh4KSA9PiB4LmZpZWxkKTtcbiAgICAgIHRoaXMuc2F2ZUNvbHVtbldpZHRocyhzZWxlY3RlZEZpZWxkcyk7XG4gICAgfVxuICB9XG4gIC8vIHVuYWJsZSB0byBhbGxvdyB1c2VyIHRvIGNvcHkgdGV4dCBmcm9tIGdyaWQgd2hlbiB0aGlzLmFsbG93VGV4dENvcHkgaXMgc2V0IHRvIGZhbHNlLlxuICBASG9zdExpc3RlbmVyKCdjb3B5JywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignY3V0JywgWyckZXZlbnQnXSlcbiAgaGFuZGxlQ29weU9yQ3V0KGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuICAgIGlmICghdGhpcy5hbGxvd1RleHRDb3B5KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9XG4gIFxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50LnRhcmdldCddKSBvbkNsaWNrKGV2ZW50KSB7XG4gICAgaWYoIXRoaXMuZWRpdEFsbFJvd3MgJiYgIXRoaXMuaW5FZGl0TW9kZSAmJiB0aGlzLnNlbGVjdGVkUm93UmVjb3JkKXtcbiAgICAgIHRoaXMuaGFuZGxlUm93Q2xpY2sodGhpcy5zZWxlY3RlZFJvd1JlY29yZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gYnJvd3NlciBjbG9zZSBldmVudFxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6YmVmb3JldW5sb2FkJywgWyckZXZlbnQnXSlcbiAgYmVmb3JldW5sb2FkSGFuZGxlcihldmVudDogYW55KSB7XG4gICAgaWYgKHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXNzaWdubWVudCBvZiBzZWxlY3RlZCBjb2x1bW5zIG9uIHBhZ2UgbG9hZFxuICAgKi9cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5ncmlkU2VydmljZS5pbmNyZW1lbnRDYWxscygpO1xuICAgIGlmICh0aGlzLmdyaWRTZXJ2aWNlLmdldE51bWJlck9mQ2FsbHMoKSA9PT0gMSkge1xuICAgICAgdGhpcy5zZWFyY2hidG5JZCA9ICdzZWFyY2hHbG9iYWxGaWx0ZXJCdG4nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlYXJjaGJ0bklkID0gYEZpbHRlcl8ke2N1cnJlbnRVcmwoKX1fJHt0aGlzLmdyaWRTZXJ2aWNlLmdldE51bWJlck9mQ2FsbHMoKX1gO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZXRHcmlkUmVmcmVzaFRpbWUpIHtcbiAgICAgIHRoaXMucmVmcmVzaEdyaWQoKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMub25Sb3dVcGRhdGU/Lm9ic2VydmVycz8ubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMuaGlkZUVkaXRCdG4gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVkaXRBbGxSb3dzICYmIHRoaXMub25Sb3dEZWxldGUub2JzZXJ2ZXJzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmRpc2FibGVkU2F2ZUJ0biA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5jb21wb25lbnRUYWJsZVJlZiA9IHRoaXMudGFibGU7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnJvd3NDaGFuZ2UuZW1pdCh0aGlzLnJvd3NEYXRhKTtcbiAgICB9KTtcblxuICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vICAgdGhpcy5zZXROdW1lcmljVmFsdWVzKCk7XG4gICAgLy8gfSwgNTAwKTtcbiAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAvLyAgIGlmICh0aGlzLnJvd3NDaGFuZ2Uub2JzZXJ2ZXJzPy5sZW5ndGgpIHtcbiAgICAvLyAgICAgdGhpcy5yb3dzQ2hhbmdlLmVtaXQodGhpcy5yb3dzRGF0YSk7XG4gICAgLy8gICB9XG4gICAgLy8gfSwgMjAwMCk7XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGxldCBmaWx0ZXJzID0gMTAwMDtcbiAgICB0aGlzLmNvbXBvbmVudFRhYmxlUmVmID0gdGhpcy50YWJsZTtcbiAgICBsZXQgZmlsdGVyOiBTdWJzY3JpcHRpb24gPSBpbnRlcnZhbChmaWx0ZXJzKS5zdWJzY3JpYmUoKHgpID0+IHtcbiAgICAgIGZpbHRlcnMgPSAwO1xuICAgICAgZmlsdGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICBjb25zdCBmaWx0ZXJDb2x1bW4gPSB0aGlzLmNvbHVtbnM/LmZpbmQoKGNvbHVtbikgPT4gIXRoaXMuaGlkZUZpbHRlciAmJiAhY29sdW1uPy5oaWRkZW4gJiYgY29sdW1uPy5maWx0ZXIgJiYgKGNvbHVtbj8uZmlsdGVyaW5nID09PSB0cnVlIHx8IGNvbHVtbj8uZmlsdGVyaW5nID09PSB1bmRlZmluZWQpKTtcbiAgICAgIGNvbnN0IGxvb2t1cE1vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxvb2t1cC1tb2RlbCcpO1xuICAgICAgY29uc3QgZmlsdGVyRmllbGQ6IGFueSA9IGxvb2t1cE1vZGFsPy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGZpbHRlckNvbHVtbj8uZmllbGQ/LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgY29uc3QgZmlsdGVyRmllbGRzOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGZpbHRlckNvbHVtbj8uZmllbGQ/LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgaWYgKGZpbHRlckZpZWxkIHx8IGZpbHRlckZpZWxkcykge1xuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyRmllbGQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgZmlsdGVyRmllbGRbMF0/LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsdGVyRmllbGRzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGZpbHRlckZpZWxkc1swXT8uZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldEZvY3VzT3V0VG9maWx0ZXJzKCkge1xuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29uc3QgY29sdW1uRmlsdGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnAtY29sdW1uLWZpbHRlcicpXG4gICAgICBpZihjb2x1bW5GaWx0ZXIpe1xuICAgICAgICAgIGNvbnN0IGlucHV0ID0gY29sdW1uRmlsdGVyWzBdLmNoaWxkcmVuWzBdLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JylcbiAgICAgICAgICBpZihpbnB1dCl7XG4gICAgICAgICAgICAgIGlucHV0LmZvY3VzKClcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnJlZnJlc2hHcmlkVGVybWluYXRvcigpO1xuICB9XG5cbiAgLy8gc2V0IE11bHRpc2VsZWN0IFRvZ2dsZSBDb2x1bW4gLy9cbiAgc2V0TXVsdGlTZWxlY3RUb2dnbGVDb2x1bW4oc2VsZWN0ZWRGaWVsZHM6IGFueVtdID0gW10pIHtcbiAgICBpZiAodGhpcy51c2VyU2V0dGluZz8ucGFnZVNldHRpbmdzPy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtYXRjaFVybCA9IHRoaXMudXNlclNldHRpbmc/LnBhZ2VTZXR0aW5ncz8uZmluZEluZGV4KChwYWdlKSA9PiBwYWdlPy51cmwgPT09IHRoaXMucm91dGVyLnVybClcbiAgICAgIGlmIChtYXRjaFVybCA+IC0xKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoR3JpZCA9IHRoaXMudXNlclNldHRpbmc/LnBhZ2VTZXR0aW5nc1ttYXRjaFVybF0/LmdyaWRTZXR0aW5ncz8uZmluZEluZGV4KChncmlkU2V0dGluZykgPT4gZ3JpZFNldHRpbmc/LmdyaWRJZCA9PT0gdGhpcy5jb21wb25lbnRUYWJsZVJlZj8uaWQpO1xuICAgICAgICBpZiAobWF0Y2hHcmlkID4gLTEpIHtcbiAgICAgICAgICB0aGlzLnVzZXJTZXR0aW5nPy5wYWdlU2V0dGluZ3NbbWF0Y2hVcmxdPy5ncmlkU2V0dGluZ3Muc3BsaWNlKG1hdGNoR3JpZCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0Z3JpZFNldHRpbmdzKHNlbGVjdGVkRmllbGRzLCBtYXRjaFVybCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXNlclNldHRpbmcucGFnZVNldHRpbmdzID0gW107XG4gICAgICB0aGlzLnNldGdyaWRTZXR0aW5ncyhzZWxlY3RlZEZpZWxkcyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U2VsZWN0ZWRDb2xGcm9tTG9jYWxTdHJvcmFnZShzZWxlY3RlZENvbHVtbikge1xuICAgIGxldCBhcnIgPSBbXTtcbiAgICBpZiAoc2VsZWN0ZWRDb2x1bW4gJiYgc2VsZWN0ZWRDb2x1bW4/LnBhZ2VTZXR0aW5ncz8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbWF0Y2hVcmwgPSBzZWxlY3RlZENvbHVtbj8ucGFnZVNldHRpbmdzPy5maW5kSW5kZXgoKHBhZ2UpID0+IHBhZ2U/LnVybCA9PT0gdGhpcy5yb3V0ZXIudXJsKVxuICAgICAgaWYgKG1hdGNoVXJsID4gLTEpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hHcmlkID0gc2VsZWN0ZWRDb2x1bW4/LnBhZ2VTZXR0aW5nc1ttYXRjaFVybF0/LmdyaWRTZXR0aW5ncz8uZmluZCgoZ3JpZFNldHRpbmcpID0+IGdyaWRTZXR0aW5nPy5ncmlkSWQgPT09IHRoaXMuZ3JpZElkKTtcbiAgICAgICAgaWYgKG1hdGNoR3JpZCAmJiBtYXRjaEdyaWQuc2VsZWN0ZWRDb2x1bW5zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgaWYgKG1hdGNoR3JpZC5zZWxlY3RlZENvbHVtbnMuc29tZSgoZmllbGROYW1lKSA9PiBmaWVsZE5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IGNvbHVtbj8uZmllbGQ/LnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgIGFyci5wdXNoKGNvbHVtbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhcnI/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBzZXRncmlkU2V0dGluZ3Moc2VsZWN0ZWRGaWVsZHM6IGFueSwgbWF0Y2hVcmw/OiBhbnkpIHtcbiAgICBpZiAoc2VsZWN0ZWRGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGdyaWRTZXR0aW5nczogYW55W10gPSBbXTtcbiAgICAgIGdyaWRTZXR0aW5ncy5wdXNoKHtcbiAgICAgICAgZ3JpZElkOiB0aGlzLmdyaWRJZCxcbiAgICAgICAgc2VsZWN0ZWRDb2x1bW5zOiBzZWxlY3RlZEZpZWxkcyxcbiAgICAgICAgY3VzdG9tQ29sdW1uc1dpZHRoOiB0aGlzLmN1c3RvbVdpZHRoQ29sdW1ucyxcbiAgICAgIH0pXG4gICAgICBjb25zdCBwYWdlU2V0dGluZyA9IHtcbiAgICAgICAgdXJsOiB0aGlzLnJvdXRlci51cmwsXG4gICAgICAgIGdyaWRTZXR0aW5nczogZ3JpZFNldHRpbmdzLFxuICAgICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKVxuICAgICAgfVxuICAgICAgdGhpcy51c2VyU2V0dGluZy5sYXN0VXBkYXRlZCA9IG5ldyBEYXRlKCk7XG4gICAgICBpZiAobWF0Y2hVcmwgPiAtMSkge1xuICAgICAgICB0aGlzLnVzZXJTZXR0aW5nLnBhZ2VTZXR0aW5nc1ttYXRjaFVybF0gPSBwYWdlU2V0dGluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXNlclNldHRpbmcucGFnZVNldHRpbmdzLnB1c2gocGFnZVNldHRpbmcpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFnZUluZm8gPSBKU09OLnN0cmluZ2lmeSh0aGlzLnVzZXJTZXR0aW5nKTtcbiAgICAgIGNoYW5nZUNvbHVtbnNTdGF0ZSh7IHBhZ2VTZXR0aW5nOiBwYWdlSW5mbyB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBhcHBseSB1c2VyIHJvbGUgcGVybWlzc2lvbnMgb24gZ3JpZCBjb2x1bW5zXG4gIGFwcGx5Q29sdW1uc1Blcm1pc3Npb25zKCkge1xuICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcbiAgICAgIGxldCB0b3RhbEZpZWxkczogbnVtYmVyID0gMDtcbiAgICAgIGxldCBoaWRkZW5GaWVsZHM6IG51bWJlciA9IDA7XG5cbiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IElHcmlkQ29sdW1uKSA9PiB7XG4gICAgICAgIGxldCBwZXJtaXNzaW9uczogSVBlcm1pc3Npb25bXSA9IGNvbHVtbi5wZXJtaXNzaW9ucztcbiAgICAgICAgbGV0IGhhc1ZhbGlkRWRpdFBlcm1pc3Npb24gPSBmYWxzZTtcblxuICAgICAgICBpZiAocGVybWlzc2lvbnMgJiYgcGVybWlzc2lvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb24pID0+IHtcbiAgICAgICAgICAgIGxldCBpc1ZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbi5yb2xlcyAmJiBwZXJtaXNzaW9uLnJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgcGVybWlzc2lvbi5yb2xlcy5mb3JFYWNoKChyb2xlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkICYmIHRoaXMucm9sZXMgJiYgdGhpcy5yb2xlcy5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLlZJRVcgJiZcbiAgICAgICAgICAgICAgICAhaGFzVmFsaWRFZGl0UGVybWlzc2lvblxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgY29sdW1uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgY29sdW1uLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkVESVQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgaGFzVmFsaWRFZGl0UGVybWlzc2lvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBjb2x1bW4uaGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICBjb2x1bW4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0b3RhbEZpZWxkcysrO1xuICAgICAgICBpZiAoY29sdW1uLmhpZGRlbikge1xuICAgICAgICAgIGhpZGRlbkZpZWxkcysrO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5pc0NvbHVtbkhpZGRlbiA9IHRvdGFsRmllbGRzID4gMCAmJiB0b3RhbEZpZWxkcyA9PT0gaGlkZGVuRmllbGRzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFwcGx5IGdsb2JhbCBwZXJtaXNzaW9ucyBvbiBlbnRpcmUgZ3JpZFxuICBhcHBseUdyaWRQZXJtaXNzaW9ucygpIHtcbiAgICBpZiAodGhpcy5wZXJtaXNzaW9ucyAmJiB0aGlzLnBlcm1pc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBoYXNWYWxpZEVkaXRQZXJtaXNzaW9uID0gZmFsc2U7XG5cbiAgICAgIC8vIGNoZWNrIGlmIGFueSBjb2x1bW4gaGFzIGFueSBwZXJtaXNzaW9uXG4gICAgICBsZXQgaGFzQ29sdW1uUGVybWlzc2lvbnMgPSB0aGlzLmNvbHVtbnM/LnNvbWUoXG4gICAgICAgICh4KSA9PiB4Py5wZXJtaXNzaW9ucyAmJiB4LnBlcm1pc3Npb25zLmxlbmd0aCA+IDBcbiAgICAgICk7XG5cbiAgICAgIHRoaXMucGVybWlzc2lvbnMuZm9yRWFjaCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgICBsZXQgaXNWYWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgICAgIHBlcm1pc3Npb24ucm9sZXMuZm9yRWFjaCgocm9sZSkgPT4ge1xuICAgICAgICAgIGlmICghaXNWYWxpZCAmJiB0aGlzLnJvbGVzICYmIHRoaXMucm9sZXMuaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkNSVUQgJiYgIWlzVmFsaWQpIHtcbiAgICAgICAgICB0aGlzLnVzZUlubGluZUNSVUQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICBwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5WSUVXICYmXG4gICAgICAgICAgIWhhc1ZhbGlkRWRpdFBlcm1pc3Npb25cbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy51c2VJbmxpbmVDUlVEID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoIWlzVmFsaWQgJiYgIWhhc0NvbHVtblBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgICB0aGlzLmlzR3JpZEhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnVzZUlubGluZUNSVUQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGVybWlzc2lvbi50eXBlID09PSBFUGVybWlzc2lvblR5cGUuRURJVCAmJiAhaXNWYWxpZCkge1xuICAgICAgICAgIHRoaXMuaXNHcmlkSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgaGFzVmFsaWRFZGl0UGVybWlzc2lvbiA9IHRydWU7XG4gICAgICAgICAgdGhpcy5lZGl0Um93UGVybWlzc2lvbiA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkRFTEVURSAmJiAhaXNWYWxpZCkge1xuICAgICAgICAgIHRoaXMuZGVsZXRlUm93UGVybWlzc2lvbiA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkFERFJPVyAmJiAhaXNWYWxpZCkge1xuICAgICAgICAgIHRoaXMuYWRkUm93UGVybWlzc2lvbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMub25Sb3dBZGQub2JzZXJ2ZXJzLmxlbmd0aCA9PSAwKSB0aGlzLmFkZFJvd1Blcm1pc3Npb24gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5vblJvd0RlbGV0ZS5vYnNlcnZlcnMubGVuZ3RoID09IDApIHRoaXMuZGVsZXRlUm93UGVybWlzc2lvbiA9IGZhbHNlO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucmVtYWluaW5nUm93c0RhdGE/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLnJvd3NEYXRhID0gWy4uLnRoaXMucmVtYWluaW5nUm93c0RhdGFdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBpZiAoIXRoaXMuaXNDaGVja0JveENoYW5nZUV2ZW50Q2FsbGVkICYmICF0aGlzLmdyaWRTZXJ2aWNlLnJvd1VwZGF0ZSkge1xuICAgICAgdGhpcy5zZXRHcmlkSWQoKVxuICAgICAgdGhpcy5jb21wb25lbnRUYWJsZVJlZiA9IHRoaXMudGFibGU7XG4gICAgICBsZXQgZ2V0U2VsZWN0ZWRDb2wgPSBbXVxuICAgICAgaWYgKHRoaXMuYWxsb3dDYWNoaW5nICE9PSBmYWxzZSAmJiB0aGlzLnBhZ2luYXRpb24pIHtcbiAgICAgICAgdGhpcy5hbGxvd0NhY2hpbmcgPSB0aGlzLnBhZ2luYXRpb247XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdTZXRGaWx0ZXJzLScgKyB0aGlzLmNvbXBvbmVudFRhYmxlUmVmPy5pZCArIHRoaXMuY3VycmVudFVybCk7XG4gICAgICB9XG4gICAgICAvLyBhZGQgZGVmYXVsdFJvdyBpbiBwYWdpbmF0aW9uIGFycmF5XG4gICAgICBpZiAoIXRoaXMuc2V0UGFnaW5hdGlvbkxlbmd0aC5pbmNsdWRlcyh0aGlzLmRlZmF1bHRSb3dzKSkge1xuICAgICAgICB0aGlzLnNldFBhZ2luYXRpb25MZW5ndGgudW5zaGlmdCh0aGlzLmRlZmF1bHRSb3dzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0NvbHVtbnM6IGJvb2xlYW4gPSB0aGlzLmNvbHVtbnMgJiYgdGhpcy5jb2x1bW5zLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoaGFzQ29sdW1ucykge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmdyaWRTZXJ2aWNlLnNldENvbHVtbkZpZWxkcyh0aGlzLmNvbHVtbnMpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkVG9nZ2xlQ29sdW1ucyA9IHRoaXMuY29sdW1ucz8uZmlsdGVyKCh4KSA9PiAheC5oaWRkZW4pO1xuICAgICAgICBjb25zdCBjdXJyZW50VXNlckluZm8gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdDdXJyZW50VXNlckluZm8nKSk7XG4gICAgICAgIC8vc2V0IGdldFNlbGVjdGVkQ29sIGNvbHVtbnMgZm9yIHRvZ2dsZUNvdWxtbiBcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dQZXJzaXN0ZW5jZSAmJiB0aGlzLmFsbG93Q29sdW1uVG9nZ2xlKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRVc2VySW5mbyAmJiBjdXJyZW50VXNlckluZm8ucGFnZVNldHRpbmcpIHtcbiAgICAgICAgICAgIGdldFNlbGVjdGVkQ29sID0gdGhpcy5nZXRTZWxlY3RlZENvbEZyb21Mb2NhbFN0cm9yYWdlKEpTT04ucGFyc2UoY3VycmVudFVzZXJJbmZvLnBhZ2VTZXR0aW5nKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucm9sZXMgPSB0aGlzLmF1dGhTZXJ2aWNlLmdldFVzZXJSb2xlcygpO1xuXG4gICAgICAgIC8vIGFwcGx5IHVzZXIgcm9sZSBwZXJtaXNzaW9ucyBvbiBncmlkIGNvbHVtbnNcbiAgICAgICAgdGhpcy5hcHBseUNvbHVtbnNQZXJtaXNzaW9ucygpO1xuXG4gICAgICAgIC8vIGFwcGx5IGdsb2JhbCBwZXJtaXNzaW9ucyBvbiBlbnRpcmUgZ3JpZFxuICAgICAgICB0aGlzLmFwcGx5R3JpZFBlcm1pc3Npb25zKCk7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucz8uZmlsdGVyKCh4KSA9PiAoeC5zaG93ID09PSB0cnVlIHx8IHguc2hvdyA9PT0gdW5kZWZpbmVkKSAmJiAheC5oaWRkZW4pO1xuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgLy9sb2FkIGNvbHVtbiB3aXRkdGggb24gcGFnZSByZWxvYWRcbiAgICAgICAgdGhpcy5sb2FkQ29sdW1uV2lkdGhzKCk7XG4gICAgICAgIGlmKHRoaXMucm93c0RhdGEubGVuZ3RoID4gMCl7XG4gICAgICAgICAgdGhpcy5mb3JtU2VydmljZS5zZXRUb29sdGlwKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVja2luZyBmaWx0ZXIgZXhpc3Qgb3Igbm90XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuX3NlbGVjdGVkQ29sdW1ucy5zb21lKFxuICAgICAgICAgIChjb2x1bW4pID0+IGNvbHVtbi5maWx0ZXJpbmcgPT09IHVuZGVmaW5lZCB8fCBjb2x1bW4uZmlsdGVyaW5nID09PSB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChmaWx0ZXIgPT09IGZhbHNlKSB7XG4gICAgICAgICAgdGhpcy5oaWRlRmlsdGVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlsdGVyRm9jdXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbjogYW55KSA9PiB7XG4gICAgICAgICAgLy8gc2V0IGlzUmVxdWlyZWQgdHJ1ZSBmb3IgcmVxdWlyZWQgY29sdW1uIHRvIHNob3cgYXN0cmljIGluIGNvbHVtbiBoZWFkZXJcbiAgICAgICAgICBpZiAoY29sdW1uLnZhbGlkYXRpb25zPy5maW5kKHZhbGlkYXRpb24gPT4gdmFsaWRhdGlvbi50eXBlID09IEVHcmlkVmFsaWRhdG9yLlJFUVVJUkVEKSkge1xuICAgICAgICAgICAgY29sdW1uLmlzUmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBzZXQgbnVtZXJpYyBudWxsIG9yIHVuZGVmaW5lIGRhdGEgZGVmYXVsdCB2YWx1ZVxuICAgICAgICAgIGlmICgoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5OVU1FUklDIHx8IGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuQk9PTEVBTiB8fCBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLlRFWFQgfHwgY29sdW1uLnR5cGUgPT09IHVuZGVmaW5lZCB8fCBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkRBVEUgfHwgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EUk9QRE9XTikgJiYgY29sdW1uLnZhbHVlICYmIHRoaXMucm93c0RhdGE/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjb2x1bW4udmFsdWUgJiYgKHJvd1tjb2x1bW4uZmllbGRdID09PSBudWxsIHx8IHJvd1tjb2x1bW4uZmllbGRdID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPSByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8udmFsdWUgPyByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8udmFsdWUgOiBjb2x1bW4udmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vc2V0IHRleHRUeXBlIGZvciBhIGNvbHVtbiB0aGF0IGlzIGZvcm1hdHRlZCB0byBiZSBhIHBhc3N3b3JkXG4gICAgICAgICAgaWYgKGNvbHVtbi5mb3JtYXQgPT0gJ3Bhc3N3b3JkJyAmJiAoIWNvbHVtbi50ZXh0VHlwZSB8fCBjb2x1bW4udGV4dFR5cGUgIT09ICd0ZXh0JykpIHtcbiAgICAgICAgICAgIGNvbHVtbi50ZXh0VHlwZSA9ICdwYXNzd29yZCc7XG4gICAgICAgICAgfSBlbHNlIGNvbHVtbi50ZXh0VHlwZSA9ICd0ZXh0JztcbiAgICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB0aW1lIGludG8gdGhlIGRhdGVcbiAgICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EQVRFKSB7XG4gICAgICAgICAgICBpZiAoY29sdW1uLnRpbWVPbmx5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gJiZcbiAgICAgICAgICAgICAgICAgIChyb3dbY29sdW1uLmZpZWxkXS50b1N0cmluZygpLmluY2x1ZGVzKCdQTScpIHx8XG4gICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0FNJykpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHNldFRpbWVJbkRhdGUocm93W2NvbHVtbi5maWVsZF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFjb2x1bW4ubWludXRlc0ludGVydmFsKSB7XG4gICAgICAgICAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocm93W2NvbHVtbi5maWVsZF0pIHtcbiAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gbmV3IERhdGUocm93W2NvbHVtbi5maWVsZF0gYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuaGlkZUZpbHRlciAmJiBjb2x1bW4uZmlsdGVyVmFsdWUgJiYgY29sdW1uLmZpbHRlciAmJiBjb2x1bW4uZmlsdGVyaW5nICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgLy8gc2V0IGZpbHRlciB2YWx1ZVxuICAgICAgICAgICAgICB0aGlzLnNldEZpbHRlckZvY3VzT3V0KGNvbHVtbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc2V0IERpc3BsYXlUZXh0IHdoZW4gdmFsdWUgaXMgaW4gY3VybHkgYnJhY2tldHMuXG4gICAgICAgICAgdGhpcy5zZXREaXNwbGF5VGV4dFZhbHVlKGNvbHVtbik7XG5cbiAgICAgICAgICAvL0FnZ3JlZ2F0ZSBzY2VuYXJpb1xuICAgICAgICAgIGlmIChjb2x1bW4uYWdncmVnYXRlICYmIGNvbHVtbi5hZ2dyZWdhdGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hZ2dyZWdhdGVGb290ZXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRBZ2dyZWdhdGVUZXh0KGNvbHVtbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHNlYXJjaEZpbHRlcnM7XG4gICAgICAgICAgaWYgKCF0aGlzLnNvZnRDYWNoaW5nICYmIHRoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkKSB7XG4gICAgICAgICAgICBzZWFyY2hGaWx0ZXJzID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ1NldEZpbHRlcnMtJyArIHRoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkICsgdGhpcy5jdXJyZW50VXJsKSBhcyBhbnlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbXBvbmVudFRhYmxlUmVmPy5pZCkge1xuICAgICAgICAgICAgc2VhcmNoRmlsdGVycyA9IHRoaXMuZ3JpZFNlcnZpY2Uuc29mdENhY2hpbmdGaWx0ZXJzW3RoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkICsgdGhpcy5jdXJyZW50VXJsXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuaGlkZUZpbHRlciAmJlxuICAgICAgICAgICAgc2VhcmNoRmlsdGVycyAmJlxuICAgICAgICAgICAgc2VhcmNoRmlsdGVycy5maWx0ZXJzICYmXG4gICAgICAgICAgICBzZWFyY2hGaWx0ZXJzLmZpbHRlcnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHNlYXJjaEZpbHRlcnMuZmlsdGVycy5mb3JFYWNoKCh4OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHguZmllbGQgPT09IGNvbHVtbi5maWVsZCkge1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4/LmZpbHRlcj8udHlwZSA9PT0gJ2NhbGVuZGFyJyAmJiB4LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICBjb2x1bW4uZmlsdGVyVmFsdWUgPSBuZXcgRGF0ZSh0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh4LnZhbHVlLCAnTU0tZGQtWVknKSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5NVUxUSVNFTEVDVCAmJiAhQXJyYXkuaXNBcnJheSh4LnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgY29sdW1uLmZpbHRlclZhbHVlID0geC52YWx1ZT8uc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHgudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5maWx0ZXJWYWx1ZSA9IHgudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gY29udmVydGluZyBkaXNwbGF5RmllbGQgdG9Mb3dlcmNhc2VcbiAgICAgICAgICBpZiAoY29sdW1uLmRpc3BsYXlGaWVsZCkge1xuICAgICAgICAgICAgY29sdW1uLmRpc3BsYXlGaWVsZCA9IGNvbHVtbi5kaXNwbGF5RmllbGQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gc2V0IEF1dG9Db21wbGV0ZSBEYXRhXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5BVVRPQ09NUExFVEUgJiZcbiAgICAgICAgICAgIHRoaXMucm93c0RhdGEgJiZcbiAgICAgICAgICAgIHRoaXMucm93c0RhdGE/Lmxlbmd0aCA+IDBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHRoYXQgY29udGFpbnMgY29tbWEgaW50byBhcnJheXNcbiAgICAgICAgICAgICAgaWYgKHJvd1tjb2x1bW4uZmllbGRdPy50b1N0cmluZygpLmluY2x1ZGVzKCc7JykpIHtcbiAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHJvd1tjb2x1bW4uZmllbGRdXG4gICAgICAgICAgICAgICAgICA/LnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgIC5zcGxpdCgnOycpXG4gICAgICAgICAgICAgICAgICA/Lm1hcCgodmFsdWU6IGFueSkgPT4gKHsgW2NvbHVtbi5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCldOiByb3dbY29sdW1uLmRpc3BsYXlGaWVsZF0sIFtjb2x1bW4ub3B0aW9uTGFiZWw/LnRvTG93ZXJDYXNlKCldOiB2YWx1ZSwgW2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKV06IHZhbHVlIH0pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBrZXk6IGFueSA9IE9iamVjdC5rZXlzKHJvdykuZmluZCgoeCkgPT4geCA9PT0gY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAvLyBjb252ZXJ0IHNpbXBsZSBzdHJpbmcgaW50byBhcnJheVxuICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocm93W2tleV0pICYmIHJvd1trZXldKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5kaXNwbGF5RmllbGQpIHtcbiAgICAgICAgICAgICAgICAgIHJvd1trZXldID0gW3sgW2NvbHVtbi5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCldOiByb3dbY29sdW1uLmRpc3BsYXlGaWVsZF0sIFtjb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCldOiByb3dba2V5XSB9XTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5vcHRpb25MYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICByb3dba2V5XSA9IFt7IFtjb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCldOiByb3dba2V5XSwgW2NvbHVtbi5vcHRpb25MYWJlbD8udG9Mb3dlckNhc2UoKV06IHJvd1trZXldIH1dO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcm93W2tleV0gPSBbeyBbY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpXTogcm93W2tleV0gfV07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvL3doZW4gd2UgYWRkIGEgbmV3IHJvdywgaXQgc2V0IHRoZSBkZWZhdWx0IHZhbHVlXG4gICAgICAgICAgaWYgKGNvbHVtbi52YWx1ZSkge1xuICAgICAgICAgICAgbGV0IGtleSA9IE9iamVjdC5rZXlzKHRoaXMubmV3R3JpZFJvdykuZmluZCgoeCkgPT4geD8udG9Mb3dlckNhc2UoKSA9PT0gY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgdGhpcy5uZXdHcmlkUm93W2NvbHVtbi5maWVsZF0gPSBjb2x1bW4udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5hbGxvd1BlcnNpc3RlbmNlICYmIGdldFNlbGVjdGVkQ29sPy5sZW5ndGggPiAwICYmIHRoaXMuYWxsb3dDb2x1bW5Ub2dnbGUpIHtcbiAgICAgICAgICB0aGlzLnNldFNlbGVjdENvbHVtbnMoZ2V0U2VsZWN0ZWRDb2wpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0U2VsZWN0Q29sdW1ucyh0aGlzLmNvbHVtbnMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdsb2JhbEZpbHRlckJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2VhcmNoYnRuSWQpO1xuICAgICAgICBpZiAoZ2xvYmFsRmlsdGVyQnRuKSB7XG4gICAgICAgICAgdGhpcy5zaG93RmlsdGVyYnRuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlLnJvd3MpIHtcbiAgICAgICAgICBjb25zdCBjbGFzc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoaWdobGlnaHRlZC1yb3cnKTtcbiAgICAgICAgICBpZiAoY2xhc3NFbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNsYXNzRWxlbWVudFswXS5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0QWxsUm93cyAmJiB0aGlzLnJvd3NEYXRhPy5sZW5ndGggPiAwICYmIHRoaXMuY29sdW1ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdEFsbFJvd3NBdE9uY2UoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0RHJvcGRvd25kYXRhVmFsdWUgPSB0cnVlO1xuICAgICAgY29uc3QgZ2xvYmFsU2VhcmNoYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dsb2JhbFNlYXJjaGJ0bicpO1xuICAgICAgaWYgKGdsb2JhbFNlYXJjaGJ0bikge1xuICAgICAgICB0aGlzLnNlYXJjaEdyaWRGaWx0ZXIgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnJvd3NEYXRhPy5sZW5ndGggPiAwICYmIHRoaXMuZ2VuZXJhdGVSb3dzRGF0YUNvcHkpIHtcbiAgICAgICAgdGhpcy5yb3dzRGF0YUNvcHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMucm93c0RhdGEpKTtcbiAgICAgIH1cbiAgICAgIGlmKCF0aGlzLnN0b3BEaWFsb2dDbG9zZSl7XG4gICAgICAgIHRoaXMuZGVmYXVsdFJvd0NsaWNrKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucm93VXBkYXRlQ2hhbmdlID0gZmFsc2U7XG4gICAgdGhpcy5pc0NoZWNrQm94Q2hhbmdlRXZlbnRDYWxsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHNldEdyaWRJZCgpe1xuICAgIGxldCB0YWJsZXMgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdwLXRhYmxlJyk7XG4gICAgICBpZiAodGFibGVzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRhYmxlcy5mb3JFYWNoKCh0YWJsZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICB0YWJsZS5zZXRBdHRyaWJ1dGUoJ2lkJywgdGhpcy5jdXJyZW50VXJsK2luZGV4KTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgfVxuICBzZXRTZWxlY3RDb2x1bW5zKGNvbHVtbnMpIHtcbiAgICB0aGlzLl9zZWxlY3RlZENvbHVtbnMgPSBbXTtcbiAgICBjb2x1bW5zPy5mb3JFYWNoKCh4LCBpKSA9PiB7XG4gICAgICBpZiAoKHguc2hvdyA9PT0gdHJ1ZSB8fCB4LnNob3cgPT09IHVuZGVmaW5lZCkgJiYgIXguaGlkZGVuKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ29sdW1uc1tpXSkge1xuICAgICAgICAgIHgudmFsdWUgPSB0aGlzLnNlbGVjdGVkQ29sdW1uc1tpXS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZWxlY3RlZENvbHVtbnMucHVzaCh4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGF1dG9Db21wbGV0ZVNlbGVjdGVkVmFsdWUocm93OiBhbnksIGNvbHVtbjogSUdyaWRDb2x1bW4sIHZhbHVlKSB7XG4gICAgaWYgKGNvbHVtbi5vcHRpb25MYWJlbCkge1xuICAgICAgY29uc3QgdmFsdWVLZXkgPSBjb2x1bW4ub3B0aW9uVmFsdWUgPyBjb2x1bW4ub3B0aW9uVmFsdWUgOiBjb2x1bW4uZmllbGQ7XG4gICAgICByb3dbY29sdW1uLmZpZWxkXSA9IFsuLi5yb3dbY29sdW1uLmZpZWxkXSwge1xuICAgICAgICBbY29sdW1uLm9wdGlvbkxhYmVsPy50b0xvd2VyQ2FzZSgpXTogdmFsdWVbY29sdW1uLm9wdGlvbkxhYmVsPy50b0xvd2VyQ2FzZSgpXSwgW3ZhbHVlS2V5Py50b0xvd2VyQ2FzZSgpXTogdmFsdWVbdmFsdWVLZXk/LnRvTG93ZXJDYXNlKCldLFxuICAgICAgICBbY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpXTogdmFsdWVbdmFsdWVLZXk/LnRvTG93ZXJDYXNlKCldXG4gICAgICB9XTtcbiAgICAgIGNvbnN0IGluZGV4ID0gcm93W2NvbHVtbi5maWVsZF0/LmZpbmRJbmRleCgoeCkgPT4gSlNPTi5zdHJpbmdpZnkoeCkgPT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICByb3dbY29sdW1uLmZpZWxkXS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHNldCBEaXNwbGF5VGV4dCB3aGVuIHZhbHVlIGlzIGluIGN1cmx5IGJyYWNrZXRzLlxuICBzZXREaXNwbGF5VGV4dFZhbHVlKGNvbHVtbjogSUdyaWRDb2x1bW4pIHtcbiAgICB0aGlzLnJvd3NEYXRhPy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5MSU5LIHx8XG4gICAgICAgIEVHcmlkQ29sdW1uVHlwZS5ESUFMT0cgfHxcbiAgICAgICAgRUdyaWRDb2x1bW5UeXBlLklGUkFNRVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ107XG4gICAgICAgIGlmIChjb2x1bW4uZGlzcGxheVRleHQgJiYgY29sdW1uLmRpc3BsYXlUZXh0LmluY2x1ZGVzKCd7JykpIHtcbiAgICAgICAgICBjb25zdCBkaXNwbGF5VGV4dCA9IGNvbHVtbi5kaXNwbGF5VGV4dFxuICAgICAgICAgICAgLnJlcGxhY2UoJ3snLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKCd9JywgJycpO1xuICAgICAgICAgIGlmIChkaXNwbGF5VGV4dCAmJiBmaWVsZCkge1xuICAgICAgICAgICAgZmllbGQuZGlzcGxheVRleHQgPSByb3dbZGlzcGxheVRleHQudG9Mb3dlckNhc2UoKV07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi5kaXNwbGF5VGV4dCAmJiBmaWVsZCkge1xuICAgICAgICAgIGZpZWxkLmRpc3BsYXlUZXh0ID0gY29sdW1uLmRpc3BsYXlUZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXROdW1lcmljTWluTXhGcmFjdGlvbihjb2x1bW46IGFueSkge1xuICAgIGxldCBkaWdpdEluZm8gPSAnMic7XG4gICAgaWYgKGNvbHVtbj8uZm9ybWF0LnR5cGUgPT09ICdwZXJjZW50JyAmJiAhY29sdW1uPy5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbykge1xuICAgICAgZGlnaXRJbmZvID0gJzAnXG4gICAgfSBlbHNlIGlmIChjb2x1bW4/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvKSB7XG4gICAgICBkaWdpdEluZm8gPSBjb2x1bW4uZm9ybWF0LmZvcm1hdFBhcmFtcy5kaWdpdHNJbmZvO1xuICAgIH1cbiAgICByZXR1cm4gZGlnaXRJbmZvO1xuICB9XG5cbiAgLy8gc2V0IHRoZSBmb3JtYXQgb2YgY3VycmVuY3kgJiYgbnVtYmVyICYmIGRlY2ltYWwgJiYgcGVyY2VudFxuICBzZXROdW1lcmljRm9ybWF0KGNvbHVtbjogYW55LCByb3c6IGFueSkge1xuICAgIHJvdyA9IG9iakNvbnZlcnRUb0xvd2VyKHJvdyk7XG4gICAgbGV0IHZhbHVlOiBhbnkgPSByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlzcGxheVRleHRcbiAgICAgID8gcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlUZXh0XG4gICAgICA6IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKClcbiAgICAgICAgPyByb3dbcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV1cbiAgICAgICAgOiByb3dbY29sdW1uLmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV1cbiAgICAgICAgICA/IHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkLnRvTG93ZXJDYXNlKCldXG4gICAgICAgICAgOiAocm93W2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSArICdfb2JqJ10/LnRleHQgfHwgcm93W2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSArICdfb2JqJ10/LnRleHQgPT09IDAgfHwgcm93W2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSArICdfb2JqJ10/LnRleHQgPT09IG51bGwpXG4gICAgICAgICAgICA/IHJvd1tjb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy50ZXh0IDogcm93W2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKHRoaXMudHlwZU9mKHZhbHVlKSA9PT0gJ251bWJlcicgJiYgdmFsdWUgPT09IDApIHtcbiAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgbGV0IGZvcm1hdFBhcmFtcyA9IGNvbHVtbi5mb3JtYXQ/LmZvcm1hdFBhcmFtcztcbiAgICBsZXQgZGlnaXRzSW5mbyA9IGZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbztcbiAgICBpZiAoY29sdW1uLmZvcm1hdCAmJiB2YWx1ZSkge1xuICAgICAgc3dpdGNoIChjb2x1bW4uZm9ybWF0Py50eXBlKSB7XG4gICAgICAgIGNhc2UgRUdyaWRGb3JtYXRUeXBlLkNVUlJFTkNZOlxuICAgICAgICAgIHZhbHVlID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KFxuICAgICAgICAgICAgZm9ybWF0UGFyYW1zPy5sb2NhbGUgPyBmb3JtYXRQYXJhbXMubG9jYWxlIDogJ2VuLVVTJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3R5bGU6ICdjdXJyZW5jeScsXG4gICAgICAgICAgICAgIGN1cnJlbmN5OiBmb3JtYXRQYXJhbXM/LmN1cnJlbmN5ID8gZm9ybWF0UGFyYW1zLmN1cnJlbmN5IDogJ1VTRCcsXG4gICAgICAgICAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogZGlnaXRzSW5mbyA/IGRpZ2l0c0luZm8gOiAnMicsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKT8uZm9ybWF0KHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBFR3JpZEZvcm1hdFR5cGUuREVDSU1BTDpcbiAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpLnRvRml4ZWQoZGlnaXRzSW5mbyA/IGRpZ2l0c0luZm8gOiAnMicpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEVHcmlkRm9ybWF0VHlwZS5QRVJDRU5UOlxuICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyAnJSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vQ2hhbmdlIGRyb3Bkb3duIHZsdWUgYmFzZWQgb24gb3B0aW9uIGxhYmVsIGFuZCBvcHRpb252YWx1ZVxuICBzZXREcm9wZG93blZhbHVlKGNvbHVtbjogSUdyaWRDb2x1bW4sIHNlbGVjdGVkUm93PzogYW55LCBjaGFuZ2U/OiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMucm93c0RhdGEgJiYgdGhpcy5yb3dzRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJvd3NEYXRhLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMocm93KT8uZmluZCgoa2V5KSA9PiBrZXkgPT09IGNvbHVtbi5maWVsZCkpIHtcbiAgICAgICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgICAgICBjb2x1bW4ub3B0aW9uTGFiZWwgPSBjb2x1bW4ub3B0aW9uTGFiZWxcbiAgICAgICAgICAgICAgPyBjb2x1bW4ub3B0aW9uTGFiZWxcbiAgICAgICAgICAgICAgOiAnbGFiZWwnO1xuICAgICAgICAgICAgY29sdW1uLm9wdGlvblZhbHVlID0gY29sdW1uLm9wdGlvblZhbHVlXG4gICAgICAgICAgICAgID8gY29sdW1uLm9wdGlvblZhbHVlXG4gICAgICAgICAgICAgIDogJ3ZhbHVlJztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBjb2x1bW4uZGF0YT8uZmluZChcbiAgICAgICAgICAgIChyZWNvcmQ6IGFueSkgPT5cbiAgICAgICAgICAgICAgcmVjb3JkW2NvbHVtbi5vcHRpb25WYWx1ZV0/LnRvU3RyaW5nKCkgPT09XG4gICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdPy50b1N0cmluZygpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBlZGl0ZWRSb3cgPSBzZWxlY3RlZFJvdyAmJiBPYmplY3Qua2V5cyhzZWxlY3RlZFJvdykubGVuZ3RoID4gMCA/IHNlbGVjdGVkUm93W3RoaXMuZGF0YUtleV0gPT09IHJvd1t0aGlzLmRhdGFLZXldIDogZmFsc2U7XG4gICAgICAgICAgaWYgKHZhbHVlICYmIGVkaXRlZFJvdykge1xuICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPSB2YWx1ZVtjb2x1bW4ub3B0aW9uVmFsdWVdO1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgY2hhbmdlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPSB2YWx1ZVtjb2x1bW4ub3B0aW9uTGFiZWxdO1xuICAgICAgICAgICAgaWYocm93W2NvbHVtbi5maWVsZCsnX29iaiddKXtcbiAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZCsnX29iaiddWydvcHRpb25WYWx1ZSddID0gdmFsdWVbY29sdW1uLm9wdGlvblZhbHVlXTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10gPSB7b3B0aW9uVmFsdWU6ICB2YWx1ZVtjb2x1bW4ub3B0aW9uVmFsdWVdfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vbWFuaXB1bGF0ZSBjaGVja2JveCBzdHJpbmcgdmFsdWUgdG8gdHJ1ZSBhbmQgZmFsc2UuXG4gIGNoYW5nZUNoZWNrYm94U3RyaW5nVmFsdWUoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb2x1bW5zICYmXG4gICAgICB0aGlzLnJvd3NEYXRhICYmXG4gICAgICB0aGlzLnJvd3NEYXRhLmxlbmd0aCA+IDAgJiZcbiAgICAgIHRoaXMuY29sdW1ucy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRFJPUERPV04gJiYgdGhpcy5zZXREcm9wZG93bmRhdGFWYWx1ZSkge1xuICAgICAgICAgIHRoaXMuc2V0RHJvcGRvd25WYWx1ZShjb2x1bW4sIHt9LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb3dzRGF0YS5mb3JFYWNoKChyb3c6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkJPT0xFQU4pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKHR5cGVvZiAocm93W2NvbHVtbi5maWVsZF0gPT09ICdzdHJpbmcnKSAmJlxuICAgICAgICAgICAgICAgIChyb3dbY29sdW1uLmZpZWxkXSA9PT0gJzEnIHx8IHJvd1tjb2x1bW4uZmllbGRdID09PSAnMCcpKSB8fFxuICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9PT0gJ1knIHx8XG4gICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID09PSAnTidcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9XG4gICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPT09ICcxJyB8fCByb3dbY29sdW1uLmZpZWxkXSA9PT0gJ1knXG4gICAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcm93RGF0YVxuICAgKiBQYXNzZXMgZGF0YSBvZiBjbGlja2VkIHJvdyB0byBwYXJlbnRcbiAgICovXG4gIGhhbmRsZVJvd0NsaWNrKHJvd0RhdGE6IGFueSkge1xuICAgIHRoaXMucm93Q2xpY2tEYXRhID0gcm93RGF0YTtcbiAgICBpZiAoIXRoaXMuZWRpdEFsbFJvd3MpIHtcbiAgICAgIHRoaXMub25Sb3dDbGljay5lbWl0KHJvd0RhdGEpO1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd1JlY29yZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvLyBpbnZva2Ugb25Sb3dDbGljayBldmVudCB3aGVuIG9ubHkgb25lIHJlY29yZCBleGlzdDtcbiAgZGVmYXVsdFJvd0NsaWNrKCl7XG4gICAgbGV0IGRpYWxvZ0V4aXN0OiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdwLWRpYWxvZycpO1xuICAgIGlmKHRoaXMuY29sdW1ucz8ubGVuZ3RoID4gMCAmJiB0aGlzLnJvd3NEYXRhICYmIHRoaXMucm93c0RhdGEubGVuZ3RoID09PSAxICYmIHRoaXMub25Sb3dDbGljay5vYnNlcnZlcnM/Lmxlbmd0aCAmJiB0aGlzLmdyaWRTZXJ2aWNlLnVzZXJTZWFyY2hlZCAmJiBkaWFsb2dFeGlzdC5sZW5ndGgpe1xuICAgICAgICB0aGlzLmdyaWRTZXJ2aWNlLnVzZXJTZWFyY2hlZD0gZmFsc2U7XG4gICAgICAgIHRoaXMuaGFuZGxlUm93Q2xpY2sodGhpcy5yb3dzRGF0YVswXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBjb2x1bW5EYXRhXG4gICAqIFBhc3NlcyBzb3J0aW5nIGluZm9ybWF0aW9uIHRvIHBhcmVudCBvbiBzb3J0IGNoYW5nZVxuICAgKi9cbiAgaGFuZGxlU29ydENoYW5nZShldmVudDogYW55KSB7XG4gICAgbGV0IHNvcnREaXJlY3Rpb24gPSBudWxsO1xuICAgIGxldCBzb3J0RmllbGQ6IHN0cmluZyA9ICcnO1xuICAgIGlmIChldmVudC5tdWx0aXNvcnRtZXRhICYmIGV2ZW50Lm11bHRpc29ydG1ldGFbMF0ub3JkZXIpIHtcbiAgICAgIHNvcnREaXJlY3Rpb24gPVxuICAgICAgICBldmVudC5tdWx0aXNvcnRtZXRhWzBdLm9yZGVyID09IDFcbiAgICAgICAgICA/IEVHcmlkU29ydERpcmVjdGlvbi5BU0NcbiAgICAgICAgICA6IEVHcmlkU29ydERpcmVjdGlvbi5ERVNDO1xuICAgICAgc29ydEZpZWxkID0gZXZlbnQubXVsdGlzb3J0bWV0YVswXS5maWVsZDtcbiAgICB9XG4gICAgbGV0IHNvcnRzOiBJR3JpZFNvcnQgPSB7XG4gICAgICBmaWVsZDogc29ydEZpZWxkLFxuICAgICAgZGlyZWN0aW9uOiBzb3J0RGlyZWN0aW9uIGFzIEVHcmlkU29ydERpcmVjdGlvbixcbiAgICAgIHByaW9yaXR5OiAwLFxuICAgIH07XG4gICAgdGhpcy5vblNvcnRDaGFuZ2UuZW1pdChzb3J0cyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIFBhc3NlcyBhcHBsaWVkIGZpbHRlcnMgdG8gcGFyZW50IG9uIGZpbHRlciBjaGFuZ2VcbiAgICovXG4gIGhhbmRsZUZpbHRlckNoYW5nZShldmVudDogYW55KSB7XG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGZpbHRlcjogYW55KSA9PiB7XG4gICAgICBpZiAoIWV2ZW50LmZpbHRlcnNbZmlsdGVyLmZpZWxkXT8udmFsdWUgJiYgIWZpbHRlci52YWx1ZSkge1xuICAgICAgICBmaWx0ZXIudmFsdWUgPSAnJztcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm9uRmlsdGVyQ2hhbmdlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCA6IEV2ZW50XG4gICAqIEBwYXJhbSBjb2x1bW5BY3Rpb24gOiBJR3JpZENvbHVtbkFjdGlvblxuICAgKiBAcGFyYW0gcm93IDogYW55XG4gICAqIFN0b3AgdGhlIGNsaWNrIGV2ZW50IHByb3BhZ2F0aW9uIHRvIHBhcmVudFxuICAgKiBDYWxsYmFja3MgdGhlIHJvdyBkYXRhIHRvIHBhcmVudFxuICAgKi9cblxuICAvKipcbiAgICogaW52b2tlIG9uQ2xpY2sgZXZlbnQgJiBvcGVuIElmcmFtZSBpbiBncmlkXG4gICAqL1xuICBncmlkSUZyYW1lKGNvbHVtbjogYW55LCByb3dzOiBhbnksIHJvdzogYW55KSB7XG4gICAgdGhpcy5vbkNsaWNrRXZlbnQoY29sdW1uLCByb3cpO1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKElmcmFtZUNvbXBvbmVudCwge1xuICAgICAgaGVhZGVyOiBjb2x1bW4uaGVhZGVyLFxuICAgICAgd2lkdGg6ICc4MCUnLFxuICAgICAgaGVpZ2h0OiAnODAlJyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdmFsdWU6IHJvd3MsXG4gICAgICAgIGlGcmFtZUlkOiBjb2x1bW4uZGlzcGxheVRleHQgPyBjb2x1bW4uZGlzcGxheVRleHQgOiBjb2x1bW4uZmllbGQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjb2x1bW4uY29tcG9uZW50Py5uYW1lO1xuICAgIGlmIChjb21wb25lbnROYW1lKSB7XG4gICAgICB0aGlzLnBhZ2VMb2dnZXJTZXJ2aWNlLnNhdmVQYWdlTG9nZ2VySW5mbyh0aGlzLnJvdXRlci51cmw/LnN1YnN0cmluZygxKSwgY29tcG9uZW50TmFtZSk7XG4gICAgfVxuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgZHJhZ2dhYmxlRGlhbG9nKGNvbHVtbj8uZmllbGQgPyBjb2x1bW4/LmZpZWxkIDogY29sdW1uPy5oZWFkZXIpXG4gICAgfSk7XG4gICAgcmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIGlmIChyZXMgJiYgY29sdW1uLm9uUmV0dXJuKSB7XG4gICAgICAgIGNvbHVtbi5vblJldHVybihyZXMpO1xuICAgICAgfSBlbHNlIGlmIChyZXMgJiYgY29sdW1uLm9uQ2hhbmdlKSB7XG4gICAgICAgIGNvbHVtbi5vbkNoYW5nZShyZXMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYWRkTmV3Um93KHJvdzogYW55LCBhZGRSb3c6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMucmVmcmVzaEdyaWRUZXJtaW5hdG9yKClcbiAgICB0aGlzLmNvbXBvbmVudFRhYmxlUmVmID0gdGhpcy50YWJsZTtcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbHVtbi5maWx0ZXIgJiZcbiAgICAgICAgY29sdW1uLmNvbXBvbmVudCAmJlxuICAgICAgICBjb2x1bW4uZmlsdGVyLnR5cGUgPT09ICdjYWxlbmRhcidcbiAgICAgICkge1xuICAgICAgICBpZiAoYWRkUm93KSB7XG4gICAgICAgICAgdGhpcy5yb3dzRGF0YVswXVtjb2x1bW4uZmllbGQgKyAnX3NlY29uZFR5cGUnXSA9IEVHcmlkQ29sdW1uVHlwZS5EQVRFO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQgKyAnX3NlY29uZFR5cGUnXSA9IEVHcmlkQ29sdW1uVHlwZS5EQVRFO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29sdW1uLmFnZ3JlZ2F0ZSAmJiBjb2x1bW4uYWdncmVnYXRlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5hZ2dyZWdhdGVGb290ZXIgPSB0cnVlO1xuICAgICAgICB0aGlzLnNldEFnZ3JlZ2F0ZVRleHQoY29sdW1uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJvd0NsaWNrRGF0YSA9IHJvdztcbiAgICB0aGlzLmFkZE5ld1Jvd0NoZWNrID0gdHJ1ZTtcbiAgICB0aGlzLmRyb3Bkb3duSW5wdXQgPSBmYWxzZTtcbiAgICB0aGlzLnNvcnREaXNhYmxlZCA9IHRydWU7XG4gICAgdGhpcy5yb3dzQ2hhbmdlLmVtaXQodGhpcy5yb3dzRGF0YSk7XG4gICAgdGhpcy5vbkdyaWRSb3dBZGQuZW1pdChyb3cpO1xuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gRGlhbG9nIGluIGdyaWRcbiAgICovXG4gIG9wZW5HcmlkRGlhbG9nKGNvbHVtbjogSUdyaWRDb2x1bW4gfCBhbnksIHJvdzogYW55LCBldmVudD86IGFueSkge1xuICAgIGNvbnN0IGRhdGFQYXJhbXMgPSBjb2x1bW4uZGF0YT8uZGF0YSA/IGNvbHVtbi5kYXRhPy5kYXRhIDoge307XG4gICAgaWYgKChldmVudCAmJiBldmVudC5jdHJsS2V5KSB8fCBjb2x1bW4ub3BlbkluTmV3VGFiKSB7XG4gICAgICB0aGlzLmh5cGVybGlua1NlcnZpY2Uub3BlbkRpYWxvZ0luTmV3VGFiKGNvbHVtbi5jb21wb25lbnQsIGRhdGFQYXJhbXMsIHJvdyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5vcGVuQ29tcG9uZW50SW5EaWFsb2coY29sdW1uLCByb3cpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5Db21wb25lbnRJbkRpYWxvZyhjb2x1bW46IElHcmlkQ29sdW1uIHwgYW55LCByb3c6IGFueSkge1xuICAgIHZhciBpc0Rpc2FibGVkID0gY29sdW1uLmRpc2FibGVkXG4gICAgICA/IHRydWVcbiAgICAgIDogcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc2FibGVkXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IGZhbHNlO1xuICAgIHRoaXMub25DbGlja0V2ZW50KGNvbHVtbiwgcm93KTtcbiAgICAgIGxldCBkYXRhOiBhbnkgPSB7fTtcbiAgICAgIGRhdGEgPSB7IC4uLmNvbHVtbj8uZGF0YSB9O1xuICAgICAgdGhpcy5yb3dDbGlja0RhdGEgPSByb3c7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmRhdGEgJiYgcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10gJiYgcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/Lm1hdGNoRGF0YSkge1xuICAgICAgICBkYXRhLmRhdGEgPSByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlhbG9nRGF0YT8uZGF0YSA/IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5kaWFsb2dEYXRhLmRhdGEgOiByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlhbG9nRGF0YTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbHVtbi5jb21wb25lbnQgJiYgdGhpcy5yb3dDbGlja0RhdGEgJiYgIWlzRGlzYWJsZWQpIHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBkYXRhLmRhdGEgPSBhdXRvU2V0TG9va3VwRGF0YShcbiAgICAgICAgICAgIGRhdGEuZGF0YSxcbiAgICAgICAgICAgIHRoaXMucm93Q2xpY2tEYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvYmpGaWVsZCA9IGNvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSArIFwiX29ialwiO1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKHJvd1tvYmpGaWVsZF0gJiYgcm93W29iakZpZWxkXT8uY29tcG9uZW50ID8gcm93W29iakZpZWxkXT8uY29tcG9uZW50IDogY29sdW1uLmNvbXBvbmVudCwgZGF0YSk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmRpYWxvZ1JlZlsnZGlhbG9nQ2xvc2UnXSA9IHRoaXMuZGlhbG9nUmVmLmNsb3NlO1xuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlID0gdGhpcy5pbnRlcmNlcHREaWFsb2dDbG9zZS5iaW5kKHRoaXMpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyAgIHRoaXMuZGlhbG9nUmVmWydkaWFsb2dDbG9zZSddID0gdGhpcy5kaWFsb2dSZWYuY2xvc2U7XG4gICAgICAgIC8vICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UgPSB0aGlzLmludGVyY2VwdERpYWxvZ0Nsb3NlLmJpbmQodGhpcyk7XG4gICAgICAgIC8vIH0sIDgwMCk7XG5cbiAgICAgICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHRoaXMuZGlhbG9nUmVmKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbHVtbi5jb21wb25lbnQ/Lm5hbWU7XG4gICAgICAgIGlmIChjb21wb25lbnROYW1lKSB7XG4gICAgICAgICAgdGhpcy5wYWdlTG9nZ2VyU2VydmljZS5zYXZlUGFnZUxvZ2dlckluZm8odGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSksIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgZHJhZ2dhYmxlRGlhbG9nKGNvbHVtbj8uZmllbGQgPyBjb2x1bW4/LmZpZWxkIDogY29sdW1uPy5oZWFkZXIpXG4gICAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YSAmJiBjb2x1bW4ub25SZXR1cm4pIHtcbiAgICAgICAgICAgIGNvbHVtbi5vblJldHVybihkYXRhLCB0aGlzLnJvd0NsaWNrRGF0YSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmJyb3dzZXJDbG9zZUV2ZW50KHRydWUpO1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5vbkNoYW5nZSkge1xuICAgICAgICAgICAgICBjb2x1bW4ub25DaGFuZ2UoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgfVxuXG4gIGJyb3dzZXJDbG9zZUV2ZW50KGV2ZW50OiBib29sZWFuID0gZmFsc2UpIHtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgPSBldmVudDtcbiAgfVxuXG4gIHNldE11bHRpU2VsZWN0RGF0YShjb2x1bW46IElHcmlkQ29sdW1uLCBzZWxlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICBpZiAoc2VsZWN0ZWRWYWx1ZSAmJiBjb2x1bW4udHlwZSA9PSBFR3JpZENvbHVtblR5cGUuTVVMVElTRUxFQ1QpIHtcbiAgICAgIGlmIChzZWxlY3RlZFZhbHVlICYmIHNlbGVjdGVkVmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcsJykpIHtcbiAgICAgICAgc2VsZWN0ZWRWYWx1ZSA9IHNlbGVjdGVkVmFsdWU/LnRvU3RyaW5nKCk/LnNwbGl0KCcsJyk/Lm1hcCgodmFsdWUpID0+IGNvbHVtbi5kYXRhPy5maW5kKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZT8udG9TdHJpbmcoKSA9PT0gdmFsdWU/LnRvU3RyaW5nKCkpPy5sYWJlbCk/LnRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZFZhbHVlID0gY29sdW1uLmRhdGE/LmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlPy50b1N0cmluZygpID09PSBzZWxlY3RlZFZhbHVlPy50b1N0cmluZygpKT8ubGFiZWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3RlZFZhbHVlO1xuICB9XG5cbiAgc2V0VGV4dEJveFJlYWRPbmx5VmFsdWUocm93OiBhbnksIGNvbHVtbjogYW55KSB7XG4gICAgbGV0IHZhbHVlOiBhbnk7XG4gICAgaWYgKGNvbHVtbi5kaXNwbGF5VGV4dCkge1xuICAgICAgdmFsdWUgPSBjb2x1bW4uZGlzcGxheVRleHQ7XG4gICAgfSBlbHNlIGlmIChyb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlzcGxheVRleHQpIHtcbiAgICAgIHZhbHVlID0gcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlUZXh0O1xuICAgIH0gZWxzZSBpZiAocm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlGaWVsZCkge1xuICAgICAgdmFsdWUgPSByb3dbcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV07XG4gICAgfSBlbHNlIGlmIChjb2x1bW4uZGlzcGxheUZpZWxkKSB7XG4gICAgICB2YWx1ZSA9IHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkPy50b0xvd2VyQ2FzZSgpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSByb3dbY29sdW1uLmZpZWxkXTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBjb25kaXRpb25hbCBiYXNlIHZhbHVlIGFuZCB0aXRsZVxuICAgKi9cbiAgc2V0Q29uZGl0aW9uQmFzZVZhbHVlKHJvdzogYW55LCBjb2x1bW46IGFueSkge1xuICAgIGRlbGV0ZSByb3dbJ3VuZGVmaW5lZCddO1xuICAgIGxldCB2YWx1ZTogYW55O1xuICAgIGlmIChjb2x1bW4udHlwZSA9PSBFR3JpZENvbHVtblR5cGUuREFURSkge1xuICAgICAgbGV0IG5ld1ZhbHVlOiBhbnk7XG4gICAgICBpZiAodHlwZW9mIChyb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXSkgPT09IFwib2JqZWN0XCIgJiYgcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10pIHtcbiAgICAgICAgbmV3VmFsdWUgPSByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlzcGxheVRleHRcbiAgICAgICAgICA/IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5kaXNwbGF5VGV4dFxuICAgICAgICAgIDogcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgPyByb3dbcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV1cbiAgICAgICAgICAgIDogcm93W2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSArICdfb2JqJ10/LnRleHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1ZhbHVlID0gcm93W2NvbHVtbi5maWVsZF07XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdWYWx1ZSkge1xuICAgICAgICBpZiAoY29sdW1uLnRpbWVPbmx5KSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLnNldFRpbWVGb3JtYXQobmV3VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBmb3JtYXQgPSB0aGlzLnNldEZvcm1hdChjb2x1bW4pO1xuICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0obmV3VmFsdWU/LnRvU3RyaW5nKCkgPT09IFwiSW52YWxpZCBEYXRlXCIgPyBudWxsIDogbmV3VmFsdWUsIGZvcm1hdCA/IGZvcm1hdCA6IGNvbHVtbi5zaG93VGltZSA/IFwiTU0vZGQvWVlZWSwgaDptbSBhXCIgOiBcIk1NL2RkL1lZWVlcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPVxuICAgICAgICByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlzcGxheVRleHRcbiAgICAgICAgICA/IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5mb3JtYXQgPyB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShyb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXS5kaXNwbGF5VGV4dCwgdGhpcy5zZXRGb3JtYXQoY29sdW1uKSkgOlxuICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlUZXh0XG4gICAgICAgICAgOiByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlzcGxheUZpZWxkPy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICA/IHJvd1tyb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlzcGxheUZpZWxkPy50b0xvd2VyQ2FzZSgpXVxuICAgICAgICAgICAgOiByb3dbY29sdW1uLmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV1cbiAgICAgICAgICAgICAgPyByb3dbY29sdW1uLmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV1cbiAgICAgICAgICAgICAgOiByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXSAmJlxuICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLmRpc3BsYXlUZXh0ID09PSBudWxsICYmIGNvbHVtbi50eXBlICE9PSBFR3JpZENvbHVtblR5cGUuRElBTE9HXG4gICAgICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgICAgIDogcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlUZXh0XG4gICAgICAgICAgICAgICAgICA/XG4gICAgICAgICAgICAgICAgICBjb2x1bW4/LmZpbHRlcj8udHlwZSA9PT0gJ2NhbGVuZGFyJyAmJiBjb2x1bW4udGltZU9ubHkgJiYgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5ESUFMT0cgP1xuICAgICAgICAgICAgICAgICAgICAocm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10uZGlzcGxheVRleHQudG9TdHJpbmcoKS5pbmNsdWRlcygnQU0nKSB8fCByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXS5kaXNwbGF5VGV4dC50b1N0cmluZygpLmluY2x1ZGVzKCdQTScpKSA/XG4gICAgICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10uZGlzcGxheVRleHQgOiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShyb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXS5kaXNwbGF5VGV4dCwgJ2hoOm1tIGEnKVxuICAgICAgICAgICAgICAgICAgICA6IGNvbHVtbi5mb3JtYXQgPyB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShyb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXS5kaXNwbGF5VGV4dCwgdGhpcy5zZXRGb3JtYXQoY29sdW1uKSkgOiByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXS5kaXNwbGF5VGV4dFxuICAgICAgICAgICAgICAgICAgOiBjb2x1bW4uZm9ybWF0ID8gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0ocm93W2NvbHVtbi5maWVsZF0sIHRoaXMuc2V0Rm9ybWF0KGNvbHVtbikpXG4gICAgICAgICAgICAgICAgICAgIDpcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmRpc3BsYXlUZXh0XG4gICAgICAgICAgICAgICAgICAgICAgPyBjb2x1bW4uZGlzcGxheVRleHRcbiAgICAgICAgICAgICAgICAgICAgICA6IGNvbHVtbi5pY29uID8gY29sdW1uLmhlYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF07XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHNldEZvcm1hdChjb2x1bW4pIHtcbiAgICBsZXQgZm9ybWF0ID0gJyc7XG4gICAgaWYgKGNvbHVtbj8uZm9ybWF0KSB7XG4gICAgICBjb2x1bW4uZm9ybWF0ID0gY29sdW1uLmZvcm1hdD8udHlwZSA/IGNvbHVtbi5mb3JtYXQudHlwZSA6IGNvbHVtbi5mb3JtYXQ7XG4gICAgICBzd2l0Y2ggKGNvbHVtbi5mb3JtYXQpIHtcbiAgICAgICAgY2FzZSBFR3JpZEZvcm1hdFR5cGUuU01BTExEQVRFOiB7XG4gICAgICAgICAgZm9ybWF0ID0gJ01NL2RkL3l5JztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIEVHcmlkRm9ybWF0VHlwZS5TSE9SVERBVEU6IHtcbiAgICAgICAgICBmb3JtYXQgPSAnTU0vZGQveXl5eSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBFR3JpZEZvcm1hdFR5cGUuTUVESVVNREFURToge1xuICAgICAgICAgIGZvcm1hdCA9ICdNIGQsIHl5JztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIEVHcmlkRm9ybWF0VHlwZS5MT05HREFURToge1xuICAgICAgICAgIGZvcm1hdCA9ICdNTS9kZC9ZWSwgaDptbSBhJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIEVHcmlkRm9ybWF0VHlwZS5QRVJJT0Q6IHtcbiAgICAgICAgICBmb3JtYXQgPSAnTU0veXknO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBmb3JtYXQgPSBjb2x1bW4uZm9ybWF0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXRcbiAgfVxuXG4gIHNldERyb3Bkd29uUmVhZE9ubHlWYWx1ZShyb3c6IGFueSwgY29sdW1uOiBhbnkpIHtcbiAgICBkZWxldGUgcm93Wyd1bmRlZmluZWQnXTtcbiAgICBjb25zdCB2YWx1ZSA9IHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkXVxuICAgICAgPyByb3dbY29sdW1uLmRpc3BsYXlGaWVsZF1cbiAgICAgIDogY29sdW1uLmRhdGE/LmZpbmQoZHJvcGRvd25WYWwgPT4gZHJvcGRvd25WYWw/LnZhbHVlID09IHJvd1tjb2x1bW4uZmllbGRdKVxuICAgICAgICA/IGNvbHVtbi5kYXRhPy5maW5kKGRyb3Bkb3duVmFsID0+IGRyb3Bkb3duVmFsPy52YWx1ZSA9PSByb3dbY29sdW1uLmZpZWxkXSk/LmxhYmVsXG4gICAgICAgIDogcm93W2NvbHVtbi5maWVsZF07XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cblxuICAvKipcbiAgICogb3BlbiBEZWxldGUgQ29uZmlybWF0aW9uIGRpYWxvZyB3aGVuIGNsaWNrIG9uIGRlbGV0ZSBpY29uIGluIEFjdGlvbiBjb2x1bW5cbiAgICovXG4gIGhhbmRsZUFjdGlvbkNsaWNrKGV2ZW50OiBFdmVudCwgY29sdW1uQWN0aW9uOiBJR3JpZENvbHVtbkFjdGlvbiwgcm93OiBhbnkpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoY29sdW1uQWN0aW9uLnRvb2x0aXAudG9Mb3dlckNhc2UoKSA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgIGlmIChjb2x1bW5BY3Rpb24uY29uZmlybURpYWxvZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29sdW1uQWN0aW9uLm9uQ2xpY2socm93KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgICAgICBtZXNzYWdlOiAnQXJlIHlvdSBzdXJlIHRoYXQgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgcmVjb3JkPycsXG4gICAgICAgICAgaGVhZGVyOiAnRGVsZXRlIENvbmZpcm1hdGlvbicsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJyxcbiAgICAgICAgICBrZXk6ICdoYW5kbGVjb2x1bW5BY3Rpb25zJyxcbiAgICAgICAgICBhY2NlcHQ6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbHVtbkFjdGlvbi5vbkNsaWNrKHJvdyk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY2xvc2UoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlamVjdDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNsb3NlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbHVtbkFjdGlvbi5vbkNsaWNrKHJvdyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCA6IExhenlMb2FkRXZlbnRcbiAgICogVHJpZ2dlcnMgZXZlcnl0aW1lIGEgc2VydmVyIHNpZGUgZmlsdGVyIGlzIHRyaWdnZXJcbiAgICovXG4gIGhhbmRsZVNlcnZlclNpZGVFdmVudHMoZXZlbnQ6IGFueSwgZHQ6IGFueSA9ICcnKSB7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmlzU2VydmVyU2lkZUV2ZW50SW5pdGFsVHJpZ2dlcmVkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb2x1bW5zPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRHcmlkSWQoKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZGZpbHRlciA9IGV2ZW50O1xuICBcbiAgICAgICAgICAgIGlmIChkdD8uZWw/Lm5hdGl2ZUVsZW1lbnQ/LmlkKSB7XG4gICAgICAgICAgICAgIHRoaXMuZ3JpZElkID0gZHQuZWwubmF0aXZlRWxlbWVudC5pZDtcbiAgICAgICAgICAgIH1cbiAgXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENvbHVtbnMgJiYgdGhpcy5zZWxlY3RlZENvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5mb3JFYWNoKCh4OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZmlsdGVyc1t4LmZpZWxkXSkge1xuICAgICAgICAgICAgICAgICAgZXZlbnQuZmlsdGVyc1t4LmZpZWxkXS52YWx1ZSA9IHgudHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLk1VTFRJU0VMRUNUID8geC5maWx0ZXJWYWx1ZT8udG9TdHJpbmcoKSA6IHguZmlsdGVyVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0aGlzLmF1dG9Mb2FkRGF0YTtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyRmlsdGVycyA9IHtcbiAgICAgICAgICAgICAgZmlsdGVyczogdGhpcy5sb29rdXBGaWx0ZXJzXG4gICAgICAgICAgICAgICAgPyB0aGlzLmdyaWRTZXJ2aWNlLmdldEdyaWRGaWx0ZXJzKGV2ZW50LCB0aGlzLnNlbGVjdGVkQ29sdW1ucylcbiAgICAgICAgICAgICAgICA6IHRoaXMuZ3JpZFNlcnZpY2UucHJlcGFyZUJhc2ljRmlsdGVycyhldmVudCwgdGhpcy5zZWxlY3RlZENvbHVtbnMpLFxuICAgICAgICAgICAgICBzb3J0czogdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkU29ydHMoZXZlbnQsIHRoaXMuc2VsZWN0ZWRDb2x1bW5zKSxcbiAgICAgICAgICAgICAgLi4uKHRoaXMucGFnaW5hdGlvbiAmJiB7XG4gICAgICAgICAgICAgICAgcGFnZTogdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkUGFnaW5hdGlvbihldmVudCksXG4gICAgICAgICAgICAgICAgcGFnZVNpemU6IGV2ZW50LnJvd3MgfHwgMTAsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfTtcbiAgXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHRoaXMuc2VydmVyRmlsdGVycz8uZmlsdGVycyAmJlxuICAgICAgICAgICAgICB0aGlzLnNlcnZlckZpbHRlcnM/LmZpbHRlcnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAodGhpcy5hbGxvd0NhY2hpbmcgfHwgdGhpcy5zb2Z0Q2FjaGluZylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuc29mdENhY2hpbmcgJiYgdGhpcy5jb21wb25lbnRUYWJsZVJlZj8uaWQpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnU2V0RmlsdGVycy0nICsgdGhpcy5jb21wb25lbnRUYWJsZVJlZj8uaWQgKyB0aGlzLmN1cnJlbnRVcmwsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VydmVyRmlsdGVycykpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkU2VydmljZS5zb2Z0Q2FjaGluZ0ZpbHRlcnNbdGhpcy5jb21wb25lbnRUYWJsZVJlZj8uaWQgKyB0aGlzLmN1cnJlbnRVcmxdID0gdGhpcy5zZXJ2ZXJGaWx0ZXJzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmdyaWRTZXJ2aWNlLnNvZnRDYWNoaW5nRmlsdGVyc1t0aGlzLmNvbXBvbmVudFRhYmxlUmVmPy5pZCArIHRoaXMuY3VycmVudFVybF0gPSB7fTtcbiAgICAgICAgICAgIH1cbiAgXG4gICAgICAgICAgICBjb25zdCBzZXJ2ZXJGaWx0ZXJWYWx1ZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuc2VydmVyRmlsdGVycykpO1xuICAgICAgICAgICAgc2VydmVyRmlsdGVyVmFsdWVzLmZpbHRlcnMgPSAodGhpcy5zZXJ2ZXJGaWx0ZXJzLmZpbHRlcnMgfHwgW10pLmNvbmNhdCh0aGlzLmdsb2JhbERhdGEpO1xuICBcbiAgICAgICAgICAgIHRoaXMuaXNDaGVja0JveENoYW5nZUV2ZW50Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmdyaWRTZXJ2aWNlLnJvd1VwZGF0ZSA9IGZhbHNlO1xuICBcbiAgICAgICAgICAgIGxldCBjb250YWluc0VtcHR5RmllbGQgPSB0cnVlO1xuICAgICAgICAgICAgd2hpbGUgKGNvbnRhaW5zRW1wdHlGaWVsZCkge1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNlcnZlckZpbHRlclZhbHVlcy5maWx0ZXJzLmZpbmRJbmRleCgoZmlsdGVyKSA9PiAhZmlsdGVyLmZpZWxkKTtcbiAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBzZXJ2ZXJGaWx0ZXJWYWx1ZXMuZmlsdGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5zRW1wdHlGaWVsZCA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gIFxuICAgICAgICAgICAgdGhpcy5vblNlcnZlclNpZGVFdmVudENoYW5nZS5lbWl0KHNlcnZlckZpbHRlclZhbHVlcyk7XG4gICAgICAgICAgICB0aGlzLmlzU2VydmVyU2lkZUV2ZW50SW5pdGFsVHJpZ2dlcmVkLm5leHQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cbiAgXG5cblxuLy9zZXQgZ3JpZCBpZCBvbiBwYWdlIGxvYWQgZm9yIGxvYWQgY29sdW1uIHdpZHRoc1xuICBzZXRDbGFzc2FBbmRJZChkdDphbnkpe1xuICAgIGlmKGR0Py5lbD8ubmF0aXZlRWxlbWVudD8uaWQpe1xuICAgICAgdGhpcy5ncmlkSWQgPSBkdC5lbC5uYXRpdmVFbGVtZW50LmlkO1xuICAgIH1cbiAgICBpZih0aGlzLmhvcml6b250YWxTY3JvbGwpe1xuICAgICAgcmV0dXJuIHsnaG9yaXpvbnRhbC1zY3JvbGwnOnRydWV9XG4gICAgfWVsc2V7XG4gICAgICByZXR1cm4geydob3Jpem9udGFsLXNjcm9sbCc6ZmFsc2V9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBldmVudFxuICAgKiBQYXNzZXMgYXBwbGllZCBwYWdpbmF0aW9uIHRvIHBhcmVudCBvbiBwYWdlIGNoYW5nZVxuICAgKi9cbiAgaGFuZGxlU2VydmVyU2lkZVBhZ2luYXRpb24oZXZlbnQ6IElHcmlkUGFnaW5hdGlvbkV2ZW50KSB7XG4gICAgdGhpcy5lZGl0aW5nUm93S2V5cyA9IHt9O1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBldmVudC5maXJzdDtcbiAgICB0aGlzLlBhZ2VDaGFuZ2UgPSB0cnVlO1xuICAgIHRoaXMub25QYWdlQ2hhbmdlLmVtaXQoZXZlbnQpO1xuXG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMudXNlU2VydmVyU2lkZUV2ZW50cyAmJiB0aGlzLnBhZ2luYXRpb24gJiYgdGhpcy5kZWZhdWx0Um93cyAmJiB0aGlzLmVkaXRBbGxSb3dzICYmIHRoaXMucm93c0RhdGE/Lmxlbmd0aCA+IDAgJiYgdGhpcy5jb2x1bW5zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5lZGl0QWxsUm93c0F0T25jZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHNlbGVjdGVkUm93KHJvdzogYW55KSB7XG4gICAgdGhpcy5vblJvd0NoZWNrQm94LmVtaXQocm93KTtcbiAgfVxuXG4gIC8vIHNldCB0aW1lIGZvcm1hdFxuICBzZXRUaW1lRm9ybWF0KGRhdGU6IGFueSkge1xuICAgIGxldCB2YWx1ZTogYW55ID0gJyc7XG4gICAgaWYgKGRhdGU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0FNJykgfHwgZGF0ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnUE0nKSkge1xuICAgICAgdmFsdWUgPSBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGUsICdoaDptbSBhJyk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vb3BlbiBoeXBlcmxpbmsgaW4gZWRpdCBjYXNlXG4gIG9wZW5MaW5rKHVybDogYW55KSB7XG4gICAgaWYgKHVybCkge1xuICAgICAgY29uc3QgbGluazogYW55ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgbGluay5ocmVmID0gdXJsO1xuICAgICAgbGluay50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgIGxpbmsuY2xpY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJvd1xuICAgKiBTZXRzIHZhbHVlcyB0byBlZGl0YWJsZSByb3dcbiAgICogUm93J3MgZGF0YSBpcyBwcmVzZXZlZCB0byBwcmV2ZW50IG11dGF0aW9uXG4gICAqIFJvdyBkYXRhS2V5IGlzIHByZXNlcnZlZCB0byBrZWVwIHRoZSByb3cgdW5pcXVlIGFuZCBpbiBlZGl0YWJsZSBzdGF0ZSBhcyBsb25nIGFzIG5vdCBzYXZlZFxuICAgKi9cblxuICByZWZyZXNoR3JpZFRlcm1pbmF0b3IoKSB7XG4gICAgaWYgKHRoaXMuc2V0R3JpZFJlZnJlc2hUaW1lKSB7XG4gICAgICB0aGlzLnJlbG9hZFBhZ2U/LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgb25Sb3dFZGl0SW5pdChyb3c6IGFueSkge1xuICAgIHRoaXMucmVmcmVzaEdyaWRUZXJtaW5hdG9yKClcbiAgICBsZXQgc2VsZWN0ZWRSb3cgPSB7IC4uLnJvdyB9O1xuICAgIE9iamVjdC5lbnRyaWVzKHNlbGVjdGVkUm93KS5mb3JFYWNoKChba2V5LCB2YWx1ZV06IGFueSkgPT4ge1xuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbDogYW55KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNldERyb3Bkb3duRmlsdGVyKSB7XG4gICAgICAgICAgdGhpcy5zZXREcm9wZG93bkZpbHRlclZhbHVlKGNvbCwgcm93LCBrZXkpO1xuICAgICAgICAgIHRoaXMuc2V0RHJvcGRvd25GaWx0ZXIgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgdGhlIGF1dG9Db21wbGV0ZSBWYWx1ZSBpbiBlZGl0IG1vZGVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbC50eXBlID09PSBFR3JpZENvbHVtblR5cGUuQVVUT0NPTVBMRVRFICYmXG4gICAgICAgICAgY29sLmZpZWxkPy50b0xvd2VyQ2FzZSgpID09PSBrZXk/LnRvTG93ZXJDYXNlKCkgJiZcbiAgICAgICAgICB2YWx1ZSAmJlxuICAgICAgICAgIHZhbHVlLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGNvbC5kaXNwbGF5RmllbGQpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkUm93W2NvbC5maWVsZF0uZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICAgIHJvd1tjb2wuZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX3RlbXAnXSA9IHJvd1tjb2wuZGlzcGxheUZpZWxkXTtcbiAgICAgICAgICAgICAgcm93W2NvbC5kaXNwbGF5RmllbGRdID0gcm93W2NvbC5maWVsZF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IG5ld1ZhbHVlID0gdmFsdWUubWFwKCh4OiBhbnkpID0+IHhbY29sLmRpc3BsYXlGaWVsZF0pO1xuICAgICAgICAgIGlmIChuZXdWYWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJzsnKSkge1xuICAgICAgICAgICAgcm93W2NvbC5maWVsZF0gPSBuZXdWYWx1ZVxuICAgICAgICAgICAgICA/LnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgPy5yZXBsYWNlQWxsKCc7JywgJywnKVxuICAgICAgICAgICAgICA/LnNwbGl0KCcsJylcbiAgICAgICAgICAgICAgPy5tYXAoKHg6IGFueSkgPT4gKHsgW2NvbC5kaXNwbGF5RmllbGQgPyBjb2wuZGlzcGxheUZpZWxkIDogY29sLmZpZWxkXTogeCwgW2NvbC5maWVsZCArICdfdGVtcCddOiB2YWx1ZVswXVtjb2wuZmllbGRdIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EUk9QRE9XTikge1xuICAgICAgICAgIGxldCBvcHRpb24gPSBjb2w/LmRhdGE/LmZpbmQoXG4gICAgICAgICAgICAoeDogYW55KSA9PiB4LmxhYmVsID09PSByb3dbY29sLmZpZWxkXT8udG9TdHJpbmcoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgICAgcm93W2NvbC5maWVsZF0gPSBvcHRpb24udmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb2wudHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLk1VTFRJU0VMRUNUKSB7XG4gICAgICAgICAgcm93W2NvbC5maWVsZF0gPSB0aGlzLnNldE11bHRpU2VsZWN0VmFsdWUoY29sLCByb3cpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbC5maWVsZD8udG9Mb3dlckNhc2UoKSA9PT0ga2V5Py50b0xvd2VyQ2FzZSgpICYmXG4gICAgICAgICAgY29sLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EQVRFXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChyb3dbY29sLmZpZWxkXSAhPT0gbnVsbCAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHJvd1trZXkgKyAnX29iaiddICYmIE9iamVjdC5rZXlzKHJvd1trZXkgKyAnX29iaiddKT8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICByb3dba2V5ICsgJ19vYmonXS50ZXh0ID0gbmV3IERhdGUodmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJvd1trZXldID0gbmV3IERhdGUodmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBjaGVjayB0aGUgTWludXRlcyBwYXR0ZXJuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGNvbC5zaG93VGltZSB8fCBjb2wudGltZU9ubHkpICYmXG4gICAgICAgICAgICBjb2wubWludXRlc0ludGVydmFsICYmXG4gICAgICAgICAgICByb3dba2V5XVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcm93W2tleV0gPSBuZXcgRGF0ZShzZXRNaW51dGVzSW50ZXJ2YWwocm93W2tleV0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbC50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRElBTE9HICYmXG4gICAgICAgICAgY29sLmZpbHRlcj8udHlwZSA9PT0gJ2NhbGVuZGFyJyAmJlxuICAgICAgICAgIGNvbC5maWVsZC50b0xvd2VyQ2FzZSgpID09PSBrZXkudG9Mb3dlckNhc2UoKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJvd1tjb2wuZmllbGRdID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29sLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5MSU5LICYmXG4gICAgICAgICAgY29sLmZpZWxkPy50b0xvd2VyQ2FzZSgpID09PSBrZXk/LnRvTG93ZXJDYXNlKCkgJiZcbiAgICAgICAgICAoY29sLmFsbG93U2F2ZSA9PT0gdHJ1ZSB8fCBjb2wuYWxsb3dTYXZlID09PSB1bmRlZmluZWQpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChjb2wuZWRpdExpbmsgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJvd1trZXldID0gcm93W2NvbC5maWVsZCArICdfb2JqJ10/Lmh5cGVybGluaztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbC5lZGl0TGluayA9PT0gZmFsc2UgfHwgY29sLmVkaXRMaW5rID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJvd1trZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuZWRpdFJvd3NSZWNvcmRzW3Jvd1t0aGlzLmRhdGFLZXldXSA9IHsgLi4ucm93IH07XG4gICAgdGhpcy5lZGl0aW5nUm93S2V5c1tyb3dbdGhpcy5kYXRhS2V5XV0gPSB0cnVlO1xuICAgIHRoaXMuY2hlY2tBY3Rpb24gPSB0cnVlO1xuICAgIHRoaXMuZHJvcGRvd25JbnB1dCA9IHRydWU7XG4gICAgdGhpcy5yb3dDbGlja0RhdGEgPSByb3c7XG4gICAgdGhpcy5pbkVkaXRNb2RlID0gdHJ1ZTtcbiAgICB0aGlzLnJvd1VwZGF0ZUNoYW5nZSA9IGZhbHNlO1xuICAgIHRoaXMuY2FuY2VsQWxsUmVjb3JkcyA9IGZhbHNlO1xuICAgIHRoaXMuc2F2ZUFsbFJlY29yZCA9IGZhbHNlO1xuICAgIHRoaXMuc29ydERpc2FibGVkID0gdHJ1ZTtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLnJvd1VwZGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMub25HcmlkUm93RWRpdC5lbWl0KHJvdyk7XG4gIH1cblxuICB0eXBlT2YodmFsdWU6IGFueSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogc2V0IGRyb3Bkb3duIGZpbHRlciB2YWx1ZVxuICAgKi9cbiAgc2V0RHJvcGRvd25GaWx0ZXJWYWx1ZShjb2w6IGFueSwgcm93OiBhbnksIGtleTogc3RyaW5nKSB7XG4gICAgaWYgKGNvbC50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRFJPUERPV04gJiYgY29sLmRyb3BEb3duUHJvcCkge1xuICAgICAgaWYgKE9iamVjdC52YWx1ZXMoY29sKS5zb21lKCh2YWx1ZSkgPT4gdmFsdWUgPT0ga2V5KSkge1xuICAgICAgICBsZXQgb2JqID0gY29sLmRyb3BEb3duUHJvcDtcbiAgICAgICAgbGV0IG5ld0ZpbHRlcnM6IGFueSA9IFtdO1xuICAgICAgICBpZiAob2JqLmZpbHRlcnMgJiYgb2JqLmZpbHRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG9iai5maWx0ZXJzLmZvckVhY2goKGZpbHRlcjogYW55KSA9PiB7XG4gICAgICAgICAgICBsZXQgbmV3RmlsdGVyID0geyAuLi5maWx0ZXIgfTtcbiAgICAgICAgICAgIGxldCBmaWx0ZXJLZXkgPSBPYmplY3Qua2V5cyhyb3cpLmZpbmQoKGtleSkgPT4ge1xuICAgICAgICAgICAgICBsZXQgbWF0Y2hLZXk6IHN0cmluZyA9ICcnO1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZmlsdGVyLnZhbHVlPy5pbmNsdWRlcygneycpICYmXG4gICAgICAgICAgICAgICAga2V5LnRvTG93ZXJDYXNlKCkgPT09XG4gICAgICAgICAgICAgICAgZmlsdGVyLnZhbHVlXG4gICAgICAgICAgICAgICAgICA/LnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgID8udG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJ3snLCAnJylcbiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCd9JywgJycpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG1hdGNoS2V5ID0ga2V5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBtYXRjaEtleTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGZpbHRlcktleSkge1xuICAgICAgICAgICAgICBuZXdGaWx0ZXIudmFsdWUgPSByb3dbZmlsdGVyS2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0ZpbHRlcnMucHVzaChuZXdGaWx0ZXIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ncmlkU2VydmljZS5zZXREcm9wZG93bkRhdGEoXG4gICAgICAgICAgY29sLFxuICAgICAgICAgIG9iai51bmlxdWVLZXksXG4gICAgICAgICAgb2JqLnZhbHVlUHJvcCxcbiAgICAgICAgICBvYmoubGFiZWxQcm9wLFxuICAgICAgICAgIG5ld0ZpbHRlcnMsXG4gICAgICAgICAgcm93XG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IG9wdGlvbiA9IGNvbC5kYXRhLmZpbmQoXG4gICAgICAgICAgKHg6IGFueSkgPT4geC5sYWJlbCA9PT0gcm93W2NvbC5maWVsZF0/LnRvU3RyaW5nKClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgIHJvd1tjb2wuZmllbGRdID0gb3B0aW9uLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSByb3dcbiAgICogUGFzc2VzIHRoZSBlZGl0ZWQgb3IgbmV3bHkgY3JlYXRlZCBkYXRhIHRvIHBhcmVudFxuICAgKiBJbiBjYXNlIG9mIG5ld2x5IGNyZWF0ZWQgZGF0YSwgZGF0YUtleSBhbmQgaXNOZXcgcHJvcCBpcyByZW1vdmVkXG4gICAqL1xuICBvblJvd0VkaXRTYXZlKHNlbGVjdGVkUm93OiBhbnkpIHtcbiAgICBsZXQgYXV0b21Db21wbGV0ZVRlbXBEYXRhID0gW107XG4gICAgbGV0IGxvb2t1cEluZm86IGFueSA9IHt9O1xuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goKGNvbHVtbjogYW55KSA9PiB7XG4gICAgICBkZWxldGUgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkICsgJy1kYXRhJ107XG4gICAgICBkZWxldGUgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkICsgJ19zZWNvbmRUeXBlJ107XG4gICAgICBpZiAoXG4gICAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTE9PS1VQX0lOUFVUICYmXG4gICAgICAgIChjb2x1bW4uYWxsb3dTYXZlID09PSB0cnVlIHx8IGNvbHVtbi5hbGxvd1NhdmUgPT09IHVuZGVmaW5lZClcbiAgICAgICkge1xuICAgICAgICBpZiAodHlwZW9mIChzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdID0gc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXT8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LnRleHQpIHtcbiAgICAgICAgICBsb29rdXBJbmZvW2NvbHVtbi5maWVsZF0gPSBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLnRleHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbHVtbi5mb3JtYXR0ZXIpIHtcbiAgICAgICAgbGV0IHZhbHVlOiBhbnkgPSBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdO1xuICAgICAgICBpZiAoY29sdW1uLmZvcm1hdHRlciA9PT0gJ2NoYXInKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PT0gdHJ1ZSA/ICdZJyA6ICdOJztcbiAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4uZm9ybWF0dGVyID09PSAnbnVtZXJpYycpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09PSB0cnVlID8gJzEnIDogJzAnO1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdGVkUm93ID0geyAuLi5zZWxlY3RlZFJvdywgW2NvbHVtbi5maWVsZF06IHZhbHVlIH07XG4gICAgICB9XG5cbiAgICAgIC8vY29udmVydCBkcm9wRG93biBvcHRpb25MYWJlbCBpbnRvIG9wdGlvblZhbHVlXG4gICAgICBpZiAoXG4gICAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRFJPUERPV04gJiYgY29sdW1uLmRhdGE/Lmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICBjb25zdCBvcHRpb25MYWJlbCA9IGNvbHVtbi5kYXRhLmZpbmQoKHJlY29yZCkgPT4gcmVjb3JkWydsYWJlbCddPy50b0xvd2VyQ2FzZSgpID09PSBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdPy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKG9wdGlvbkxhYmVsPy52YWx1ZSkge1xuICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSBvcHRpb25MYWJlbC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvL2NvbnZlcnQgZGF0ZSBpbnRvIHRpbWUgZm9ybWF0XG4gICAgICBpZiAoXG4gICAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuREFURVxuICAgICAgKSB7IFxuICAgICAgICBpZiAoY29sdW1uLnRpbWVPbmx5ICYmIGNvbHVtbi5zYXZlQXNTdHJpbmcgJiYgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSkge1xuICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdLCAnaGg6bW0gYScpO1xuICAgICAgICB9ZWxzZSBpZiAoY29sdW1uLnRpbWVPbmx5ICYmICFjb2x1bW4uc2F2ZUFzU3RyaW5nICYmIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0pIHtcbiAgICAgICAgICBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSwgJ3l5eXktTU0tZGQgSEg6bW06c3MnKTtcbiAgICAgICAgfSBlbHNlIGlmICghY29sdW1uLnRpbWVPbmx5ICYmIChjb2x1bW4uc2hvd1RpbWUgfHwgY29sdW1uLmZvcm1hdCA9PT0gRUdyaWRGb3JtYXRUeXBlLkxPTkdEQVRFKSkge1xuICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdLCAneXl5eS1NTS1kZCBISDptbTpzcycpO1xuICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gJiYgIWNvbHVtbi50aW1lT25seSkge1xuICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSBuZXcgRGF0ZShzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdKT8udG9Mb2NhbGVEYXRlU3RyaW5nKFwiZW4tVVNcIilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gaWYgYWxsb3dDYWxjdWxhdGU9dHJ1ZSwgZGl2aWRlIHRoZSBwZXJjZW50IGJ5IDEwMFxuICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTlVNRVJJQykge1xuICAgICAgICBpZiAodGhpcy5udW1lcmljVmFsdWUpIHtcbiAgICAgICAgICB0aGlzLm51bWVyaWNWYWx1ZSA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlnaXRzSW5mbyA9IGNvbHVtbj8uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm87XG4gICAgICAgIGlmIChjb2x1bW4uZm9ybWF0Py50eXBlID09PSAncGVyY2VudCcpIHtcbiAgICAgICAgICBpZiAoY29sdW1uLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5hbGxvd0NhbGN1bGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgY2FsY3VsYXRlZFZhbHVlID0gc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJy4nKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSBjYWxjdWxhdGVkVmFsdWUgPyBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdIDogc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSAvIDEwMDtcbiAgICAgICAgICAgIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSBwYXJzZUZsb2F0KChzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdIC8gMTAwKT8udG9TdHJpbmcoKSkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvL2NvbnZlcnQgbXVsdGlzZWxlY3QgYXJyYXkgaW50byBzdHJpbmdcbiAgICAgIGlmIChcbiAgICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5NVUxUSVNFTEVDVCAmJiBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdXG4gICAgICApIHtcbiAgICAgICAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSA9IHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0/LnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNhdmluZyBBdXRvQ29tcGxldGUgRGF0YVxuICAgICAgaWYgKFxuICAgICAgICBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkFVVE9DT01QTEVURSAmJlxuICAgICAgICBjb2x1bW4uZGlzcGxheUZpZWxkICYmXG4gICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0/Lmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICBhdXRvbUNvbXBsZXRlVGVtcERhdGEgPSBbLi4uc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXV07XG4gICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdPy5tYXAoKHJvdykgPT4gY29sdW1uPy5vcHRpb25WYWx1ZSAmJiByb3dbY29sdW1uLm9wdGlvblZhbHVlPy50b0xvd2VyQ2FzZSgpXSA/XG4gICAgICAgICAgcm93W2NvbHVtbi5vcHRpb25WYWx1ZT8udG9Mb3dlckNhc2UoKV0gOiByb3dbY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpXSk/LnRvU3RyaW5nKCk/LnJlcGxhY2VBbGwoJywnLCAnOycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IHJvdzogYW55ID0geyAuLi5zZWxlY3RlZFJvdyB9O1xuICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMocm93KTtcbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGtleS5pbmNsdWRlcygnX29iaicpKSB7XG4gICAgICAgIGxldCBvYmo6IGFueSA9IHJvd1trZXldXG4gICAgICAgIGlmICh0aGlzLmNoZWNrQWN0aW9uID09PSBmYWxzZSAmJiBvYmo/LnR5cGUgJiYgKG9iai50eXBlID09PSAnbGluaycgfHwgb2JqLnR5cGUgPT09ICdpZnJhbWUnIHx8IG9iai50eXBlID09PSAnZGlhbG9nJykpIHtcbiAgICAgICAgICByb3cgPSB7IC4uLnJvdywgW2tleS5zcGxpdCgnXycpWzBdXTogcm93W2tleV0uZGlzcGxheVRleHQgfTtcbiAgICAgICAgICB0aGlzLmNoZWNrQWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIG9iaiAmJiAob2JqLnR5cGUgPT09ICdsaW5rJyB8fCBvYmoudHlwZSA9PT0gJ2lmcmFtZScgfHwgb2JqLnR5cGUgPT09ICdkaWFsb2cnKSkge1xuICAgICAgICAgIHJvdyA9IHsgLi4ucm93LCBba2V5LnNwbGl0KCdfJylbMF1dOiByb3dba2V5XS5kaXNwbGF5VGV4dCB9O1xuICAgICAgICAgIGRlbGV0ZSByb3dba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIGp1c3QgZW1pdCB0aG9zZSBmaWVsZHMgd2hvIGV4aXN0IGluIHRoZSB0YWJsZVxuICAgICAqL1xuICAgIHJvdyA9IHRoaXMuZ3JpZFNlcnZpY2Uuc2V0Um93VmFsdWUocm93KTtcbiAgICAvL29uc29sZS5sb2coJ3JvdyBpbiBzYXZlJywgcm93KVxuICAgIGxldCBvYmo6IGFueSA9IHt9O1xuICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IGFueSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAoY29sdW1uLmFsbG93U2F2ZSA9PT0gdHJ1ZSB8fCBjb2x1bW4uYWxsb3dTYXZlID09PSB1bmRlZmluZWQgfHwgdGhpcy5zYXZlQWxsRGF0YSlcbiAgICAgICkge1xuICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IHJvd1tjb2x1bW4uZmllbGRdO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5ESUFMT0cgJiZcbiAgICAgICAgICBjb2x1bW4uZmlsdGVyPy50eXBlID09PSAnY2FsZW5kYXInXG4gICAgICAgICkge1xuICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oXG4gICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSxcbiAgICAgICAgICAgICd5eXl5LU1NLWRkVDAwOjAwOjAwLjAwMFonXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vU2V0IERlY2ltYWwgRnJhY3Rpb24gVmFsdWVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbHVtbi5mb3JtYXQgJiZcbiAgICAgICAgICBjb2x1bW4uZm9ybWF0LnR5cGUgPT09IEVGb3JtYXRUeXBlLkRFQ0lNQUwgJiZcbiAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSAmJlxuICAgICAgICAgICFyb3dbY29sdW1uLmZpZWxkXS50b1N0cmluZygpLmluY2x1ZGVzKCcuJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGV0IGRpZ2l0c0luZm8gPSAnLjAwJztcbiAgICAgICAgICBsZXQgemVybyA9ICcwJztcbiAgICAgICAgICBjb25zdCBmb3JtYXRQYXJhbXMgPSBjb2x1bW4uZm9ybWF0Py5mb3JtYXRQYXJhbXM7XG4gICAgICAgICAgY29uc3QgZnJhY0RpZ2l0cyA9IGNvbHVtbj8uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm87XG4gICAgICAgICAgaWYgKGZyYWNEaWdpdHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZnJhY0RpZ2l0czsgaSsrKSB7XG4gICAgICAgICAgICAgIHplcm8gPSB6ZXJvICsgJzAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlnaXRzSW5mbyA9ICcuJyArIHplcm87XG4gICAgICAgICAgfVxuICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gcm93W2NvbHVtbi5maWVsZF0gKyBkaWdpdHNJbmZvO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICByb3cuaXNOZXcgfHwgcm93LmlzbmV3ICYmXG4gICAgICAgIChjb2x1bW4uYWxsb3dTYXZlID09PSBmYWxzZSB8fCBjb2x1bW4uZWRpdGFibGUgPT09IGZhbHNlIHx8ICF0aGlzLnNhdmVBbGxEYXRhKVxuICAgICAgKSB7XG4gICAgICAgIGRlbGV0ZSByb3dbY29sdW1uLmZpZWxkXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkZWxldGUgc2VsZWN0ZWRSb3dbJ3VuZGVmaW5lZCddO1xuICAgIHRoaXMuZ3JpZFNlcnZpY2UuY2hlY2tWYWxpZGl0eSh0aGlzLmNvbHVtbnMsIHJvdyk7XG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMuZ3JpZFZhbGlkYXRpb24odGhpcy5jb2x1bW5zLCByb3cpO1xuICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAvLyBzZXQgdGhlIGdyaWQgdXBkYXRlZC9pbnNlcnRlZCBkYXRhXG4gICAgICB0aGlzLnJvd0FjdGlvbkV2ZW50cyhzZWxlY3RlZFJvdyk7XG4gICAgICB0aGlzLmJyb3dzZXJDbG9zZUV2ZW50KGZhbHNlKTtcbiAgICAgIGlmIChyb3cuaXNOZXcgfHwgcm93LmlzbmV3KSB7XG4gICAgICAgIGxldCB7IGlzTmV3LCBpc25ldywgLi4ubmV3Um93T2JqIH0gPSByb3c7XG4gICAgICAgIG5ld1Jvd09iaiA9IHRoaXMuZ3JpZFNlcnZpY2UucmVtb3ZlRXh0cmFOZXdSb3dPYmoobmV3Um93T2JqLCB0aGlzLmNvbHVtbnMpO1xuICAgICAgICBpZiAoIXRoaXMuYWRkRGF0YUtleVZhbHVlKSB7XG4gICAgICAgICAgZGVsZXRlIG5ld1Jvd09ialt0aGlzLmRhdGFLZXldO1xuICAgICAgICB9XG4gICAgICAgIG5ld1Jvd09iaiA9IHRoaXMuc2V0Um93c0RhdGEobmV3Um93T2JqKTtcbiAgICAgICAgaWYgKHRoaXMuc2F2ZUFsbFJlY29yZCkge1xuICAgICAgICAgIHRoaXMuc2F2ZVJlY29yZEFycmF5LnB1c2gobmV3Um93T2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uUm93QWRkLmVtaXQobmV3Um93T2JqKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuc2F2ZUFsbFJlY29yZCkge1xuICAgICAgICAgIHRoaXMuc2F2ZVJlY29yZEFycmF5LnB1c2gob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5jaGVja2xpc3QubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHRoaXMub25Sb3dVcGRhdGUuZW1pdCh0aGlzLnNldFJvd3NEYXRhKHRoaXMuY2hlY2tsaXN0KSk7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uUm93VXBkYXRlLmVtaXQob2JqKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuZWRpdGluZ1Jvd0tleXNbcm93W3RoaXMuZGF0YUtleV1dID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAgIGlmIChjb2x1bW4uZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZC50b0xvd2VyQ2FzZSgpICsgJ19vYmonXSkge1xuICAgICAgICAgICAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkgKyAnX29iaiddID0geyAuLi5zZWxlY3RlZFJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLCBlcnJvck1lc3NhZ2U6IGNvbHVtbi5lcnJvck1lc3NhZ2UgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkgKyAnX29iaiddID0geyBlcnJvck1lc3NhZ2U6IGNvbHVtbi5lcnJvck1lc3NhZ2UgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICB0aGlzLmVkaXRpbmdSb3dLZXlzW3Jvd1t0aGlzLmRhdGFLZXldXSA9IHRydWU7XG4gICAgfVxuICAgIC8vIGlmIGFsbCByb3dzIGluIHJlYWQgb25seSBtb2RlIHRoZW4gc2hvdyBlZGl0QWxsUm93cyBidXR0b24uICAgIFxuICAgIGlmIChPYmplY3QudmFsdWVzKHRoaXMuZWRpdGluZ1Jvd0tleXMpLmV2ZXJ5KCh2YWx1ZSkgPT4gIXZhbHVlKSkge1xuICAgICAgdGhpcy5pbkVkaXRNb2RlID0gZmFsc2U7XG4gICAgICB0aGlzLnNvcnREaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5mb3JFYWNoKChjb2x1bW46IGFueSkgPT4ge1xuICAgICAgLy8gY29udmVydCBkYXRlIGludG8gdGltZVxuICAgICAgaWYgKFxuICAgICAgICBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdICYmXG4gICAgICAgIChzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdPy50b1N0cmluZygpPy5pbmNsdWRlcygnUE0nKSB8fFxuICAgICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCdBTScpKVxuICAgICAgKSB7XG4gICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gPSBzZXRUaW1lSW5EYXRlKHJvd1tjb2x1bW4uZmllbGRdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTlVNRVJJQykge1xuICAgICAgICBjb25zdCBkaWdpdHNJbmZvID0gY29sdW1uPy5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbztcbiAgICAgICAgaWYgKGNvbHVtbi5mb3JtYXQ/LnR5cGUgPT09ICdwZXJjZW50Jykge1xuICAgICAgICAgIGlmIChjb2x1bW4uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmFsbG93Q2FsY3VsYXRlKSB7XG4gICAgICAgICAgICBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdID0gcGFyc2VGbG9hdCgoc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSAqIDEwMCk/LnRvU3RyaW5nKCkpLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxlY3RlZFJvd1tjb2x1bW4uZmllbGRdID0gc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSAqIDEwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuQVVUT0NPTVBMRVRFICYmXG4gICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF1cbiAgICAgICkge1xuICAgICAgICAvLyBzZXQgYXV0b2NvbXBlbGV0IGFycmF5IGRhdGEgYWZ0ZXIgc2F2ZSByb3dcbiAgICAgICAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSA9IGF1dG9tQ29tcGxldGVUZW1wRGF0YTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTE9PS1VQX0lOUFVUICYmXG4gICAgICAgIHNlbGVjdGVkUm93W2NvbHVtbi5maWVsZF0gJiYgKGNvbHVtbi5hbGxvd1NhdmUgPT09IHRydWUgfHwgY29sdW1uLmFsbG93U2F2ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgKSB7XG4gICAgICAgIC8vIHNldCBMT09LVVBfSU5QVVQgZGF0YSBhZnRlciBzYXZlIHJvd1xuICAgICAgICBpZiAobG9va3VwSW5mb1tjb2x1bW4uZmllbGRdKSB7XG4gICAgICAgICAgc2VsZWN0ZWRSb3dbY29sdW1uLmZpZWxkXSA9IGxvb2t1cEluZm9bY29sdW1uLmZpZWxkXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EUk9QRE9XTiAmJlxuICAgICAgICBjb2x1bW4ub3B0aW9uTGFiZWwgJiZcbiAgICAgICAgY29sdW1uLm9wdGlvblZhbHVlXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zZXREcm9wZG93blZhbHVlKGNvbHVtbiwgc2VsZWN0ZWRSb3cpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuYWRkTmV3Um93Q2hlY2sgPSBmYWxzZTtcbiAgICBpZiAoT2JqZWN0LnZhbHVlcyh0aGlzLmVkaXRpbmdSb3dLZXlzKS5ldmVyeSgodmFsdWUpID0+ICF2YWx1ZSkgJiYgdGhpcy5zZXRHcmlkUmVmcmVzaFRpbWUpIHtcbiAgICAgIHRoaXMucmVmcmVzaEdyaWQoKTtcbiAgICB9XG4gICAgdGhpcy5pc0NoZWNrQm94Q2hhbmdlRXZlbnRDYWxsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLnJvd1VwZGF0ZSA9IGZhbHNlO1xuICB9XG5cbiAgLy8gY2hlY2sgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkXG4gIGdyaWRWYWxpZGF0aW9uKGNvbHVtbnM6IGFueSwgcm93OiBhbnksIHNpbmdsZUNlbGw6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGlmIChzaW5nbGVDZWxsID09IHRydWUpIHtcbiAgICAgIGNvbHVtbnMgPSBbeyAuLi5jb2x1bW5zIH1dXG4gICAgfVxuICAgIGlmICghdGhpcy5ncmlkU2VydmljZS5jaGVja1ZhbGlkaXR5KGNvbHVtbnMsIHJvdywgc2luZ2xlQ2VsbCkpIHtcbiAgICAgIGxldCBlcnJvck1lc3NhZ2VEZXRhaWxzOiBzdHJpbmcgPSAnJztcbiAgICAgIGNvbHVtbnM/LmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICBpZiAoY29sdW1uLmVycm9yTWVzc2FnZSkge1xuICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMgPSBlcnJvck1lc3NhZ2VEZXRhaWxzID8gZXJyb3JNZXNzYWdlRGV0YWlscyArICcgLCAnICsgY29sdW1uLmVycm9yTWVzc2FnZSA6IGNvbHVtbi5lcnJvck1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBsZXQgaXNSZXF1aXJlZCA9IGNvbHVtbnMuc29tZShcbiAgICAgICAgKGNvbHVtbjogYW55KSA9PiBjb2x1bW4uZXJyb3JNZXNzYWdlICYmICFyb3dbY29sdW1uLmZpZWxkXVxuICAgICAgKTtcbiAgICAgIGlmIChpc1JlcXVpcmVkICYmICFzaW5nbGVDZWxsKSB7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmVycm9yKFxuICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMsXG4gICAgICAgICAgNTAwMCxcbiAgICAgICAgICAnUkVRVUlSRUQgRklFTEQnXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihlcnJvck1lc3NhZ2VEZXRhaWxzLCA1MDAwLCAnSU5WQUxJRCBGSUVMRCcpO1xuICAgICAgICBpZiAoc2luZ2xlQ2VsbCkge1xuICAgICAgICAgIHRoaXMuc2V0RXJyb3JDZWxsKGNvbHVtbnNbMF0sIHJvdylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2luZ2xlQ2VsbCkge1xuICAgICAgICB0aGlzLnNldEVycm9yQ2VsbChjb2x1bW5zWzBdLCByb3cpXG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgc2V0RXJyb3JDZWxsKGNvbHVtbiwgcm93KSB7XG4gICAgaWYgKGNvbHVtbi5lcnJvck1lc3NhZ2UpIHtcbiAgICAgIGlmIChyb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkgKyAnX29iaiddKSB7XG4gICAgICAgIHJvd1tjb2x1bW4uZmllbGQudG9Mb3dlckNhc2UoKSArICdfb2JqJ10gPSB7IC4uLnJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLCBlcnJvck1lc3NhZ2U6IGNvbHVtbi5lcnJvck1lc3NhZ2UgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvd1tjb2x1bW4uZmllbGQudG9Mb3dlckNhc2UoKSArICdfb2JqJ10gPSB7IGVycm9yTWVzc2FnZTogY29sdW1uLmVycm9yTWVzc2FnZSB9O1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChyb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkgKyAnX29iaiddKSB7XG4gICAgICAgIGRlbGV0ZSByb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkgKyAnX29iaiddLmVycm9yTWVzc2FnZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJvdyA6IGFueVxuICAgKiBAcGFyYW0gaW5kZXggOiBudW1iZXJcbiAgICogQ2xlYXJzIG91dCB0aGUgZWRpdCByb3cgYW5kIHJlcGxhY2Ugd2l0aCByZWFkYWJsZSBvbmVcbiAgICovXG4gIG9uUm93RWRpdENhbmNlbChyb3c6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgIGxldCByb3dJbkVkaXRNb2RlOiBib29sZWFuID0gT2JqZWN0LnZhbHVlcyh0aGlzLmVkaXRpbmdSb3dLZXlzKS5ldmVyeSgodmFsdWUpID0+ICF2YWx1ZSk7XG4gICAgaWYgKHJvdz8uaXNOZXcpIHtcbiAgICAgIHRoaXMucm93c0RhdGEuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb3dzRGF0YVtpbmRleF0gPSB0aGlzLmVkaXRSb3dzUmVjb3Jkc1tyb3dbdGhpcy5kYXRhS2V5XV07XG4gICAgICBkZWxldGUgdGhpcy5lZGl0Um93c1JlY29yZHNbcm93W3RoaXMuZGF0YUtleV1dO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5lZGl0aW5nUm93S2V5c1tyb3dbdGhpcy5kYXRhS2V5XV07XG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRFJPUERPV04pIHtcbiAgICAgICAgdGhpcy5zZXREcm9wZG93blZhbHVlKGNvbHVtbiwgcm93KTtcbiAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5MT09LVVBfSU5QVVQgJiYgY29sdW1uLmRpc3BsYXlGaWVsZCkge1xuICAgICAgICB0aGlzLnJvd3NEYXRhW2luZGV4XVtjb2x1bW4uZmllbGRdID0gcm93W2NvbHVtbi5maWVsZF0/LnZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuaW5FZGl0TW9kZSA9IGZhbHNlO1xuICAgIGlmIChyb3dJbkVkaXRNb2RlKSB7XG4gICAgICB0aGlzLnNvcnREaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmFkZE5ld1Jvd0NoZWNrID0gZmFsc2U7XG4gICAgdGhpcy5yb3dVcGRhdGVDaGFuZ2UgPSBmYWxzZTtcbiAgICB0aGlzLmlubGluZVJvd0NhbmNlbC5lbWl0KHJvdyk7XG4gICAgICBpZiAocm93SW5FZGl0TW9kZSAmJiB0aGlzLnNldEdyaWRSZWZyZXNoVGltZSkge1xuICAgICAgICB0aGlzLnJlZnJlc2hHcmlkKCk7XG4gICAgICB9XG4gIH1cblxuICAvKipcbiAgICogXG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSByb3dcbiAgICogU2VuZHMgdGhlIHJvdyBwYXlsb2FkIHRvIHBhcmVudCBmb3IgZGVsZXRpb25zXG4gICAqL1xuXG4gIC8qKlxuICAqc2V0IHRoZSBncmlkRGF0YSBvbiByb3cgYWN0aW9ucyBldmVudHNcbiAgKi9cbiAgcm93QWN0aW9uRXZlbnRzKHJvd0luZm8sIGRlbGV0ZVJvdzogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgbGV0IGFjdGlvbjogc3RyaW5nID0gJyc7XG4gICAgbGV0IGdyaWRSb3dzRGF0YTogYW55W10gPSBbLi4udGhpcy5yb3dzRGF0YV07XG4gICAgY29uc3QgaW5kZXggPSBncmlkUm93c0RhdGEuZmluZEluZGV4KChyb3dEYXRhKSA9PiByb3dJbmZvW3RoaXMuZGF0YUtleV0gPT09IHJvd0RhdGFbdGhpcy5kYXRhS2V5XSk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIGlmIChkZWxldGVSb3cpIHtcbiAgICAgICAgZ3JpZFJvd3NEYXRhLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMucm93c0RhdGEgPSBbLi4uZ3JpZFJvd3NEYXRhXTtcbiAgICAgICAgYWN0aW9uID0gJ2RlbGV0ZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5hZGROZXdSb3dDaGVjaykge1xuICAgICAgICAgIGFjdGlvbiA9ICdpbnNlcnQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjdGlvbiA9ICd1cGRhdGUnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9uR3JpZFJvd0FjdGlvbnMub2JzZXJ2ZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIHJvd0luZm9bJ3Jvd0FjdGlvbiddID0gYWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGdyaWRSb3dzRGF0YVtpbmRleF0gPSByb3dJbmZvO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmdlbmVyYXRlUm93c0RhdGFDb3B5ID0gZmFsc2U7XG4gICAgdGhpcy5yb3dVcGRhdGVDaGFuZ2UgPSBmYWxzZTtcbiAgICB0aGlzLnJvd3NDaGFuZ2UuZW1pdCh0aGlzLnJvd3NEYXRhKTtcbiAgICB0aGlzLm9uR3JpZFJvd0FjdGlvbnMuZW1pdChncmlkUm93c0RhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gRGVsZXRlIGNvbmZpcm1hdGlvbiBkaWFsb2cgd2hlbiB0cnlpbmcgdG8gZGVsZXRlIHJvd1xuICAgKi9cbiAgZGVsZXRlUmVjb3JkKHJvdzogYW55KSB7XG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xuICAgICAgbWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB0aGF0IHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHJlY29yZD8nLFxuICAgICAgaGVhZGVyOiAnRGVsZXRlIENvbmZpcm1hdGlvbicsXG4gICAgICBpY29uOiAncGkgcGktZXhjbGFtYXRpb24tdHJpYW5nbGUnLFxuICAgICAga2V5OiAnaGFuZGxlSW5saW5lQ1JVRCcsXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudXNlU2VydmVyU2lkZUV2ZW50cykge1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0IHRoZSBncmlkIGRlbGV0ZWQgZGF0YSBcbiAgICAgICAgdGhpcy5yb3dBY3Rpb25FdmVudHMocm93LCB0cnVlKTtcbiAgICAgICAgdGhpcy5vblJvd0RlbGV0ZS5lbWl0KHJvdyk7XG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jbG9zZSgpO1xuICAgICAgICB0aGlzLmluRWRpdE1vZGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgcmVqZWN0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jbG9zZSgpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBzZXQgZGlzYWJsZWQgdGhlIGNvbnRyb2xcbiAgICovXG4gIGFsbG93RGlzYWJsZWQoY29sdW1uOiBhbnksIHJvdzogYW55KTogYm9vbGVhbiB7XG4gICAgbGV0IHZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gICAgaWYgKHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddICYmIHR5cGVvZiAocm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10pID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKFxuICAgICAgICBPYmplY3Qua2V5cyhyb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXSk/LmluY2x1ZGVzKCdkaXNhYmxlZCcpICYmIHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5kaXNhYmxlZCA9PT0gdHJ1ZVxuICAgICAgKSB7XG4gICAgICAgIHZhbHVlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbHVtbi5kaXNhYmxlZCApIHtcbiAgICAgIHZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIHNldCBhZ2dyZWdhdGUgaW4gZ3JpZCBmb290ZXJcbiAgICovXG4gIHNldEFnZ3JlZ2F0ZVRleHQoY29sdW1uOiBJR3JpZENvbHVtbikge1xuICAgIGlmIChjb2x1bW4/LmFnZ3JlZ2F0ZSkge1xuICAgICAgY29sdW1uLmFnZ3JlZ2F0ZS5mb3JFYWNoKChjb2w6IGFueSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5yb3dzRGF0YSAmJiB0aGlzLnJvd3NEYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsZXQgY29sdW1uVHlwZTogRUdyaWRBZ2dyZWdhdGUgPSBjb2wudHlwZTtcbiAgICAgICAgICBpZiAoY29sdW1uVHlwZSA9PT0gRUdyaWRBZ2dyZWdhdGUuQ09VTlQpIHtcbiAgICAgICAgICAgIGxldCBjb3VudCA9IHRoaXMucm93c0RhdGEubGVuZ3RoO1xuICAgICAgICAgICAgY291bnQgPSB0aGlzLnNldEZldGNoQWdncmVnYXRlZFZhbHVlKGNvbHVtbiwgY291bnQsIDEpO1xuICAgICAgICAgICAgY29sLmFnZ3JWYWx1ZSA9IHRoaXMuc2V0QWdncmVnYXRlRm9vdGVyVGV4dChjb2wsIGNvdW50LCAnQ291bnQnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb2x1bW5UeXBlID09PSBFR3JpZEFnZ3JlZ2F0ZS5TVU0gfHxcbiAgICAgICAgICAgIGNvbHVtblR5cGUgPT09IEVHcmlkQWdncmVnYXRlLkFWRVJBR0VcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbFZhbHVlczogbnVtYmVyW10gPSB0aGlzLmdldENvbHVtblZhbHVlcyhjb2x1bW4pO1xuICAgICAgICAgICAgaWYgKGNvbFZhbHVlcyAmJiBjb2xWYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBsZXQgc3VtID0gY29sVmFsdWVzLnJlZHVjZSgoYWNjLCBjdXIpID0+IGFjYyArIGN1ciwgMCk7XG4gICAgICAgICAgICAgIGlmIChjb2x1bW5UeXBlID09PSBFR3JpZEFnZ3JlZ2F0ZS5TVU0pIHtcbiAgICAgICAgICAgICAgICBzdW0gPSB0aGlzLnNldEZldGNoQWdncmVnYXRlZFZhbHVlKGNvbHVtbiwgc3VtLCAyKTtcbiAgICAgICAgICAgICAgICBjb2wuYWdnclZhbHVlID0gdGhpcy5zZXRBZ2dyZWdhdGVGb290ZXJUZXh0KGNvbCwgc3VtLCAnU3VtJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGNvbHVtblR5cGUgPT09IEVHcmlkQWdncmVnYXRlLkFWRVJBR0UpIHtcbiAgICAgICAgICAgICAgICBsZXQgYXZlcmFnZSA9IHN1bSAvIGNvbFZhbHVlcy5sZW5ndGggfHwgMDtcbiAgICAgICAgICAgICAgICBhdmVyYWdlID0gdGhpcy5zZXRGZXRjaEFnZ3JlZ2F0ZWRWYWx1ZShjb2x1bW4sIHN1bSwgMyk7XG4gICAgICAgICAgICAgICAgY29sLmFnZ3JWYWx1ZSA9IHRoaXMuc2V0QWdncmVnYXRlRm9vdGVyVGV4dChcbiAgICAgICAgICAgICAgICAgIGNvbCxcbiAgICAgICAgICAgICAgICAgIGF2ZXJhZ2UsXG4gICAgICAgICAgICAgICAgICAnQXZnJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29sLmFnZ3JWYWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBzZXQgdGhlIGFnZ3JlZ2F0YWlvbiB2YWx1ZSB0aGF0IGNvbWluZyBmcm9tIGZldGNoXG4gIHNldEZldGNoQWdncmVnYXRlZFZhbHVlKGNvbHVtbiwgYWdncmVnYXRlVmFsdWUsIGFnZ3JlZ2F0ZUFjdGlvbikge1xuICAgIGlmICh0aGlzLmFnZ3JlZ2F0ZWRSZXN1bHQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGFnZ3JlZ2F0ZWRDb2x1bW4gPSB0aGlzLmFnZ3JlZ2F0ZWRSZXN1bHQuZmluZCgoYWdncmVnYXRlKSA9PiBhZ2dyZWdhdGUuZmllbGQ/LnRvTG93ZXJDYXNlKCkgPT09IGNvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSAmJiBhZ2dyZWdhdGUuYWdncmVnYXRpb25PcGVyYXRpb24gPT09IGFnZ3JlZ2F0ZUFjdGlvbik7XG4gICAgICBpZiAoYWdncmVnYXRlZENvbHVtbikge1xuICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGFnZ3JlZ2F0ZWRDb2x1bW4/LnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWdncmVnYXRlVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogc2V0IGdyaWQgQWdncmVnYXRlIHZhbHVlc1xuICAgKi9cbiAgc2V0QWdncmVnYXRlRm9vdGVyVGV4dChjb2x1bW46IGFueSwgdmFsdWU6IG51bWJlciwgZGVmYXVsdENhcHRpb246IHN0cmluZykge1xuICAgIGNvbnN0IGlzRGVjaW1hbEZvcm1hdDogYm9vbGVhbiA9IGNvbHVtbi5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJztcbiAgICBjb25zdCBkaWdpdHNJbmZvID0gY29sdW1uLmZvcm1hdD8uZGlnaXRzSW5mbztcbiAgICBjb25zdCBjYXB0aW9uOiBzdHJpbmcgPVxuICAgICAgY29sdW1uLmNhcHRpb24/Lmxlbmd0aCA+IDAgPyBjb2x1bW4uY2FwdGlvbiA6IGRlZmF1bHRDYXB0aW9uO1xuXG4gICAgY29uc3QgZGVjaW1hbFBvaW50ID0gaXNEZWNpbWFsRm9ybWF0XG4gICAgICA/IHZhbHVlPy50b0ZpeGVkKGRpZ2l0c0luZm8gPyBkaWdpdHNJbmZvIDogMilcbiAgICAgIDogdmFsdWU/LnRvRml4ZWQoMCk7XG4gICAgcmV0dXJuIGAke2NhcHRpb259ICR7ZGVjaW1hbFBvaW50XG4gICAgICAudG9TdHJpbmcoKVxuICAgICAgLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csICcsJyl9IDwvYnI+YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgZGVjaW1hdCBhbmQgbnVtZXJpYyB2YWx1ZXNcbiAgICovXG4gIHNldE51bWVyaWNWYWx1ZXMoKSB7XG4gICAgaWYgKHRoaXMuY29sdW1ucz8ubGVuZ3RoID4gMCAmJiB0aGlzLnJvd3NEYXRhPy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTlVNRVJJQykge1xuICAgICAgICAgIGNvbnN0IGRpZ2l0c0luZm8gPSBjb2x1bW4/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvO1xuICAgICAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICBpZiAoY29sdW1uPy5mb3JtYXQ/LnR5cGUgPT09ICdwZXJjZW50JyAmJiByb3dbY29sdW1uLmZpZWxkXSkge1xuICAgICAgICAgICAgICBpZiAoY29sdW1uLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5hbGxvd0NhbGN1bGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHBhcnNlRmxvYXQoKHJvd1tjb2x1bW4uZmllbGRdICogMTAwKT8udG9TdHJpbmcoKSkudG9GaXhlZChkaWdpdHNJbmZvKTsgICAgICAgICAvL1RIRVNFIENPTU1FTlRFRCBPVVQgTElORVMgU0hPVUxEIFJVTiBPTiBTQVZFXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gcm93W2NvbHVtbi5maWVsZF0gKiAxMDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZ2l0c0luZm8pIHtcbiAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHBhcnNlRmxvYXQocm93W2NvbHVtbi5maWVsZF0pLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJyAmJiByb3dbY29sdW1uLmZpZWxkXSkge1xuICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHBhcnNlRmxvYXQocm93W2NvbHVtbi5maWVsZF0pLnRvRml4ZWQoZGlnaXRzSW5mbyA/IGRpZ2l0c0luZm8gOiAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZ2V0IGNvbHVtbiB2YWx1ZSBiYXNlZCBvbiBjb2x1bW4gZmllbGRcbiAgICovXG4gIGdldENvbHVtblZhbHVlcyhjb2x1bW46IElHcmlkQ29sdW1uKSB7XG4gICAgbGV0IGFycjogYW55ID0gW107XG4gICAgdGhpcy5yb3dzRGF0YS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMocm93KTtcbiAgICAgIGtleXMubWFwKChrZXkpID0+IHtcbiAgICAgICAgaWYgKGNvbHVtbi5maWVsZCA9PT0ga2V5KSB7XG4gICAgICAgICAgYXJyLnB1c2gocm93W2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gYXJyO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEV4cG9ydCB0byBQREZcbiAgICovXG4gIGV4cG9ydFBkZigpIHtcbiAgICB2YXIgZXhwb3J0RGF0YSA9IHRoaXMuc2V0RXhwb3J0RGF0YShbLi4udGhpcy5yb3dzRGF0YV0sIHRydWUpO1xuICAgIGxldCBkb2MgPSBuZXcganNQREYoJ3AnLCAncHQnKTtcbiAgICBkb2MudGFibGUoMSwgMSwgZXhwb3J0RGF0YS5yb3dzLCBleHBvcnREYXRhLmhlYWRpbmdzLCB7IGF1dG9TaXplOiB0cnVlIH0pO1xuICAgIGRvYy5zYXZlKCdFeHBvcnQucGRmJyk7XG4gIH1cblxuICAvKipcbiAgICogIFN1Yi1mdW5jdGlvbiB0byBzZXQgcm93cyBmb3IgZXhwb3J0IHRvIFBkZiwgYW5kIEV4Y2VsXG4gICAqIEByb3dzIHBhcmFtIGZvciByb3dzXG4gICAqIEBpc0V4Y2VsIHBhcmFtIGZvciBleHBvcnQgdG8gZXhjZWwgaW5kaWNhdGlvblxuICAgKi9cbiAgc2V0RXhwb3J0RGF0YShyb3dzOiBhbnlbXSA9IFtdLCBpc1BkZjogYm9vbGVhbiA9IGZhbHNlKTogSUdyaWREYXRhRXhwb3J0IHtcbiAgICBjb25zdCBoZWFkaW5nczogYW55ID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uZmllbGQpO1xuICAgIHJvd3MuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICBmb3IgKHZhciBwcm9wIGluIHJvdykge1xuICAgICAgICBpZiAoIWhlYWRpbmdzLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgZGVsZXRlIHJvd1twcm9wXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQZGYpIHtcbiAgICAgICAgICByb3dbcHJvcF0gPVxuICAgICAgICAgICAgIXJvd1twcm9wXSAmJiB0eXBlb2Ygcm93W3Byb3BdICE9PSAnYm9vbGVhbidcbiAgICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgICA6IHJvd1twcm9wXS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcm93cywgaGVhZGluZ3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBFeHBvcnQgdG8gRXhjZWxcbiAgICovXG4gIGV4cG9ydEV4Y2VsKCkge1xuICAgIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuZXhwb3J0VG9FeGNlbD8udW5pcXVlS2V5KSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5nZXRVc2Vyc0RhdGEoKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGxldCByb3dzID0gdGhpcy5ncmlkU2VydmljZS5zZXREYXRhRmllbGRzKHJlc3BvbnNlPy5yZWNvcmRzKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXhwb3J0RmlsZShyb3dzKTtcbiAgICAgIH0sXG4gICAgICAgICh7IGVycm9yIH0pID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hcGlFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwb3J0RmlsZSh0aGlzLnJvd3NEYXRhKTtcbiAgICB9XG4gIH1cblxuICBleHBvcnRGaWxlKHJlY29yZHMpIHtcbiAgICBsZXQgYXJyOiBhbnkgPSBbXTtcbiAgICByZWNvcmRzLmZvckVhY2goKHJvdzogYW55KSA9PiB7XG4gICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goKGNvbHVtbjogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGdyaWRIZWFkZXIgPSBjb2x1bW4uaGVhZGVyO1xuICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5MSU5LKSB7XG4gICAgICAgICAgY29uc3QgbGlua09iaiA9IHJvd1tjb2x1bW4uZGlzcGxheVRleHQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddO1xuICAgICAgICAgIG9ialtncmlkSGVhZGVyXSA9IHJvd1tjb2x1bW4uZmllbGRdICsgJ3wnICsgbGlua09iaj8uaHlwZXJsaW5rO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9ialtncmlkSGVhZGVyXSA9IHJvd1tjb2x1bW4uZmllbGRdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFyci5wdXNoKG9iaik7XG4gICAgfSk7XG4gICAgdGhpcy5ncmlkU2VydmljZS5leHBvcnRFeGNlbChhcnIsIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLCBFR3JpZEV4Y2VsLkVYUE9SVCk7XG4gIH1cbiAgZ2V0VXNlcnNEYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RTZXJ2aWNlLmdldDxhbnlbXSwgUmVxdWVzdER0bz4oJy9EYXRhL0ZldGNoJywge1xuICAgICAgdW5pcXVlS2V5OiB0aGlzLmNvbmZpZ1NlcnZpY2UuZXhwb3J0VG9FeGNlbD8udW5pcXVlS2V5LFxuICAgICAgZmlsdGVyczogdGhpcy5jb25maWdTZXJ2aWNlLmV4cG9ydFRvRXhjZWw/LmZpbHRlcnMsXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqc2V0IGNvbmZpZyBkYXRhIG9mIGxvb2t1cCBjb250cm9sIGRpYWxvZ1xuICAgKi9cbiAgc2V0TG9va3VwRGlhbG9nQ29uZmlnKHJvdzogYW55LCBjb2x1bW46IGFueSwgZGF0YTogYW55KSB7XG4gICAgbGV0IHNlbGVjdGlvbjogc3RyaW5nID0gJyc7XG4gICAgaWYgKHJvd1tjb2x1bW4uZmllbGRdICYmIHR5cGVvZiByb3dbY29sdW1uLmZpZWxkXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHNlbGVjdGlvbiA9IHJvd1tjb2x1bW4uZmllbGRdLnRleHQ7XG4gICAgfSBlbHNlIGlmIChjb2x1bW4uZGlzcGxheUZpZWxkICYmIHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkXSkge1xuICAgICAgc2VsZWN0aW9uID0gcm93W2NvbHVtbi5kaXNwbGF5RmllbGRdO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3Rpb24gPSByb3dbY29sdW1uLmZpZWxkXTtcbiAgICB9XG5cbiAgICBpZiAoY29sdW1uLmZpZWxkICYmIHR5cGVvZiByb3dbY29sdW1uLmZpZWxkXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IG5ld1JvdyA9IHsgLi4ucm93IH07XG4gICAgICBuZXdSb3dbY29sdW1uLmZpZWxkXSA9IG5ld1Jvd1tjb2x1bW4uZmllbGRdPy52YWx1ZTtcbiAgICAgIHJvdyA9IHsgLi4ubmV3Um93IH07XG4gICAgfVxuXG4gICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTE9PS1VQX0lOUFVUICYmIGRhdGEpIHtcbiAgICAgIGxldCBvYmogPSBhdXRvU2V0TG9va3VwRGF0YShkYXRhLCByb3cpO1xuICAgICAgcm93W2NvbHVtbi5maWVsZCArICctZGF0YSddID0gb2JqO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcm93RGF0YTogcm93W2NvbHVtbi5maWVsZCArICctZGF0YSddLFxuICAgICAgc2VsZWN0aW9uOiBzZWxlY3Rpb24sXG4gICAgICBjb2x1bW46IGNvbHVtbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gbGluayBvbiBsb29rdXBDb250cm9sIGNvbnRyb2wgaW4gcmVhZCBvbmx5IG1vZGUgd2hlbiBlZGl0TGluayBzZXQgdHJ1ZVxuICAgKi9cbiAgb3Blbkxvb2t1cEh5cGVybGluayhjb2x1bW46IElHcmlkQ29sdW1uLCByb3c6IGFueSkge1xuICAgIGlmIChjb2x1bW4uZWRpdExpbmsgPT09IHRydWUgJiYgY29sdW1uLmNvbXBvbmVudCkge1xuICAgICAgbGV0IG9iajogYW55ID0gdGhpcy5zZXRMb29rdXBEaWFsb2dDb25maWcocm93LCBjb2x1bW4sIGNvbHVtbi5kYXRhPy5kYXRhKTtcbiAgICAgIG9ialsnY29tcG9uZW50J10gPSBjb2x1bW4uY29tcG9uZW50O1xuICAgICAgY29uc3QgcmVmID0gdGhpcy5vcGVuTG9va3VwRGlhbG9nKG9iaik7XG4gICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGRyYWdnYWJsZURpYWxvZyhjb2x1bW4/LmZpZWxkID8gY29sdW1uPy5maWVsZCA6IGNvbHVtbj8uaGVhZGVyKVxuICAgICAgfSk7XG4gICAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICBpZiAocmVzICYmIGNvbHVtbi5vblJldHVybikge1xuICAgICAgICAgIGNvbHVtbi5vblJldHVybihyZXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBsb29rdXAgRGlhbG9nXG4gICAqL1xuICBvcGVuTG9va3VwRGlhbG9nKGNvbHVtbj86IGFueSwgcm93OiBhbnkgPSB7fSkge1xuICAgIHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgIGNvbnN0IGNvbHVtbkRhdGEgPSBjb2x1bW4uY29sdW1uPy5sb29rdXBDb250cm9sPy5kYXRhID8gY29sdW1uLmNvbHVtbi5sb29rdXBDb250cm9sLmRhdGEgOiBjb2x1bW4uY29sdW1uLmRhdGE7XG4gICAgaWYgKHJvd1tjb2x1bW4uY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpICsgJ19vYmonXT8ubG9va3VwQ29udHJvbCkge1xuICAgICAgcm93W2NvbHVtbi5jb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5kYXRhPy5oZWFkZXIgPyBjb2x1bW5EYXRhLmhlYWRlciA9IHJvd1tjb2x1bW4uY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpICsgJ19vYmonXT8ubG9va3VwQ29udHJvbD8uZGF0YT8uaGVhZGVyIDogJydcbiAgICAgIHJvd1tjb2x1bW4uY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpICsgJ19vYmonXT8ubG9va3VwQ29udHJvbD8uZGF0YT8ud2lkdGggPyBjb2x1bW5EYXRhLndpZHRoID0gcm93W2NvbHVtbi5jb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5kYXRhPy53aWR0aCA6ICcnXG4gICAgICByb3dbY29sdW1uLmNvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSArICdfb2JqJ10/Lmxvb2t1cENvbnRyb2w/LmRhdGE/LmhlaWdodCA/IGNvbHVtbkRhdGEuaGVpZ2h0ID0gcm93W2NvbHVtbi5jb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5kYXRhPy5oZWlnaHQgOiAnJ1xuICAgICAgcm93W2NvbHVtbi5jb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5kYXRhPy52YWx1ZVByb3AgPyBjb2x1bW5EYXRhLnZhbHVlUHJvcCA9IHJvd1tjb2x1bW4uY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpICsgJ19vYmonXT8ubG9va3VwQ29udHJvbD8uZGF0YT8udmFsdWVQcm9wIDogXCJcIlxuICAgICAgcm93W2NvbHVtbi5jb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5kYXRhPy5sYWJlbFByb3AgPyBjb2x1bW5EYXRhLmxhYmVsUHJvcCA9IHJvd1tjb2x1bW4uY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpICsgJ19vYmonXT8ubG9va3VwQ29udHJvbD8uZGF0YT8ubGFiZWxQcm9wIDogXCJcIlxuICAgICAgcm93W2NvbHVtbi5jb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5kYXRhPy5kYXRhID8gY29sdW1uRGF0YS5kYXRhID0gcm93W2NvbHVtbi5jb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5kYXRhPy5kYXRhIDogJydcbiAgICB9XG5cbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKGNvbHVtbi5jb21wb25lbnQsIHtcbiAgICAgIC4uLmNvbHVtbkRhdGEsXG4gICAgICBzdHlsZUNsYXNzOiAnbG9va3VwLW1vZGVsJyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgc2VsZWN0aW9uOiBjb2x1bW4uc2VsZWN0aW9uLFxuICAgICAgICBmaWVsZDogY29sdW1uLmNvbHVtbi5maWVsZCxcbiAgICAgICAgbGFiZWxQcm9wOiBjb2x1bW4uY29sdW1uLmxvb2t1cENvbnRyb2w/LmRhdGE/LmxhYmVsUHJvcCxcbiAgICAgICAgLi4uY29sdW1uLnJvd0RhdGEsXG5cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmWydkaWFsb2dDbG9zZSddID0gdGhpcy5kaWFsb2dSZWYuY2xvc2U7XG4gICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSA9IHRoaXMuaW50ZXJjZXB0RGlhbG9nQ2xvc2UuYmluZCh0aGlzKTtcbiAgICB9KTtcblxuICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vICAgdGhpcy5kaWFsb2dSZWZbJ2RpYWxvZ0Nsb3NlJ10gPSB0aGlzLmRpYWxvZ1JlZi5jbG9zZTtcbiAgICAvLyAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlID0gdGhpcy5pbnRlcmNlcHREaWFsb2dDbG9zZS5iaW5kKHRoaXMpO1xuICAgIC8vIH0sIDgwMCk7XG5cbiAgICB0aGlzLnNldER5bmFtaWNEaWFsb2dSZWYodGhpcy5kaWFsb2dSZWYpO1xuICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSByb3dbY29sdW1uLmNvbHVtbi5maWVsZF0/Lm5hbWU7XG4gICAgaWYgKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpLCBjb21wb25lbnROYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGlhbG9nUmVmO1xuICB9XG4gIFxuICBpbnRlcmNlcHREaWFsb2dDbG9zZShldmVudDogYW55KSB7XG4gICAgbGV0IGdyaWRTYXZlSW5EaWFsb2c6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3AtZGlhbG9nJyk7XG4gICAgaWYgKGdyaWRTYXZlSW5EaWFsb2c/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZvcm1TYXZlQnV0dG9uID0gZ3JpZFNhdmVJbkRpYWxvZ1swXT8ucXVlcnlTZWxlY3RvcignLmZvcm0tc2F2ZS1idXR0b24nKTtcbiAgICAgIGNvbnN0IGdyaWRTYXZlQWxsQnV0dG9uID0gZ3JpZFNhdmVJbkRpYWxvZ1swXT8ucXVlcnlTZWxlY3RvcignLnNhdmUtYWxsLWdyaWQnKTtcbiAgICAgIGlmICgoZm9ybVNhdmVCdXR0b24gfHwgZ3JpZFNhdmVBbGxCdXR0b24pICYmICh0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgfHwgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQpKSB7XG4gICAgICAgIGlmIChjb25maXJtKFwiWW91IHdpbGwgbG9zZSBjaGFuZ2VzIG5vdCBzYXZlZCBvbiBwYWdlLiBXb3VsZCB5b3UgbGlrZSB0byBjb250aW51ZT9cIikgPT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmPy5kaWFsb2dDbG9zZShldmVudCk7XG4gICAgICAgICAgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1lbHNle1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZj8uZGlhbG9nQ2xvc2UoZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHNldCBkaWFsb2cgcmVmIHdoZW4gcG9wdXAgb3BlblxuICBzZXREeW5hbWljRGlhbG9nUmVmKHJlZikge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5kaWFsb2dDb21wb25lbnRSZWZNYXAuZ2V0KHJlZik7XG4gICAgY29uc3QgZHluYW1pY0NvbXBvbmVudCA9IGRpYWxvZ1JlZj8uaW5zdGFuY2UgYXMgRHluYW1pY0RpYWxvZ0NvbXBvbmVudDtcbiAgICBjb25zdCBhcmlhTGFiZWxsZWRCeSA9IGR5bmFtaWNDb21wb25lbnQuZ2V0QXJpYUxhYmVsbGVkQnkoKTtcbiAgICBkeW5hbWljQ29tcG9uZW50LmdldEFyaWFMYWJlbGxlZEJ5ID0gKCkgPT4gYXJpYUxhYmVsbGVkQnk7XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBkaWFsb2cgb24gbG9va3VwQ29udHJvbCBmaWVsZFxuICAgKi9cbiAgc2VsZWN0TG9va3VwRmllbGQoY29sdW1uOiBhbnksIHJvdz86IGFueSkge1xuICAgIHRoaXMub25DbGlja0V2ZW50KGNvbHVtbiwgcm93KTtcbiAgICBsZXQgb2JqOiBhbnkgPSB0aGlzLnNldExvb2t1cERpYWxvZ0NvbmZpZyhcbiAgICAgIHJvdyxcbiAgICAgIGNvbHVtbixcbiAgICAgIHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5kYXRhPy5kYXRhXG4gICAgICAgID8gcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/Lmxvb2t1cENvbnRyb2w/LmRhdGE/LmRhdGEgOiBjb2x1bW4/Lmxvb2t1cENvbnRyb2w/LmRhdGE/LmRhdGFcbiAgICApO1xuXG4gICAgb2JqWydjb21wb25lbnQnXSA9IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5sb29rdXBDb250cm9sPy5jb21wb25lbnQgPyByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8ubG9va3VwQ29udHJvbD8uY29tcG9uZW50IDogY29sdW1uLmxvb2t1cENvbnRyb2w/LmNvbXBvbmVudDtcbiAgICBjb25zdCByZWYgPSB0aGlzLm9wZW5Mb29rdXBEaWFsb2cob2JqLCByb3cpO1xuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgZHJhZ2dhYmxlRGlhbG9nKGNvbHVtbj8uZmllbGQgPyBjb2x1bW4/LmZpZWxkIDogY29sdW1uPy5oZWFkZXIpXG4gICAgfSk7XG4gICAgcmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKFxuICAgICAgKHJlcykgPT4ge1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgdGhpcy5ncmlkU2VydmljZS51c2VyU2VhcmNoZWQ9ZmFsc2U7XG4gICAgICAgICAgbGV0IHZhbHVlID0gc2V0RGlhbG9nUmVzcG9uc2UoXG4gICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgICBjb2x1bW4ubG9va3VwQ29udHJvbCxcbiAgICAgICAgICAgIHJlc1xuICAgICAgICAgICk7XG4gICAgICAgICAgcmVzID0gb2JqQ29udmVydFRvTG93ZXIocmVzKTtcbiAgICAgICAgICBsZXQgbGFiZWxQcm9wID0gY29sdW1uPy5sb29rdXBDb250cm9sPy5kYXRhPy5sYWJlbFByb3A/LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgbGV0IHZhbHVlUHJvcCA9IGNvbHVtbj8ubG9va3VwQ29udHJvbD8uZGF0YT8udmFsdWVQcm9wPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGxldCBjb2x1bW5GaWVsZCA9IGNvbHVtbj8uZmllbGQ/LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKGNvbHVtbi5kaXNwbGF5RmllbGQpIHtcbiAgICAgICAgICAgIGlmIChyb3c/Lmhhc093blByb3BlcnR5KGNvbHVtbi5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgIHJvd1tjb2x1bW5GaWVsZF0gPSByZXNbdmFsdWVQcm9wID8gdmFsdWVQcm9wIDogY29sdW1uRmllbGRdO1xuICAgICAgICAgICAgICByb3dbY29sdW1uLmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV0gPSByZXNbbGFiZWxQcm9wID8gbGFiZWxQcm9wIDogY29sdW1uLmRpc3BsYXlGaWVsZC50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJvd1tjb2x1bW5GaWVsZF0gPSB7XG4gICAgICAgICAgICAgICAgdGV4dDogcmVzW2xhYmVsUHJvcCA/IGxhYmVsUHJvcCA6IGNvbHVtbi5kaXNwbGF5RmllbGQudG9Mb3dlckNhc2UoKV0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IHJlc1t2YWx1ZVByb3AgPyB2YWx1ZVByb3AgOiBjb2x1bW5GaWVsZF0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHZhbHVlLnZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZVsnZmllbGQnXSA9IGNvbHVtbkZpZWxkO1xuICAgICAgICAgICAgaWYgKGxhYmVsUHJvcCB8fCB2YWx1ZVByb3ApIHtcbiAgICAgICAgICAgICAgcm93W2NvbHVtbkZpZWxkXSA9IHtcbiAgICAgICAgICAgICAgICB0ZXh0OiByZXNbbGFiZWxQcm9wID8gbGFiZWxQcm9wIDogcmVzW2xhYmVsUHJvcF1dLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXNbdmFsdWVQcm9wID8gdmFsdWVQcm9wIDogcmVzW2xhYmVsUHJvcF1dLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcm93W2NvbHVtbkZpZWxkXSA9IHZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobGFiZWxQcm9wIHx8IHZhbHVlUHJvcCkge1xuICAgICAgICAgICAgICByb3dbY29sdW1uRmllbGRdID0ge1xuICAgICAgICAgICAgICAgIHRleHQ6IHJlc1tsYWJlbFByb3AgPyBsYWJlbFByb3AgOiB2YWx1ZVByb3AgPyB2YWx1ZVByb3AgOiByZXNbY29sdW1uRmllbGRdXSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcmVzW3ZhbHVlUHJvcCA/IHZhbHVlUHJvcCA6IHJlc1tjb2x1bW5GaWVsZF1dLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcm93W2NvbHVtbkZpZWxkXSA9IHJlc1tjb2x1bW5GaWVsZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgKHJvd1tjb2x1bW4uZmllbGRdKSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddID0geyAuLi5yb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXSwgdGV4dDogcm93W2NvbHVtbi5maWVsZF0gfTtcbiAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHJvd1tjb2x1bW4uZmllbGRdPy52YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4uZGlzcGxheUZpZWxkKSB7XG4gICAgICAgICAgaWYgKHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddKSB7XG4gICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXSA9IHsgLi4ucm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10sIHRleHQ6IHsgdGV4dDogcm93W2NvbHVtbi5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCldLCB2YWx1ZTogcm93W2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKV0gfSB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXSA9IHsgdGV4dDogeyB0ZXh0OiByb3dbY29sdW1uLmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV0sIHZhbHVlOiByb3dbY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpXSB9IH07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJlcykge1xuICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddID0geyAuLi5yb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXSwgdGV4dDogeyB0ZXh0OiByZXNbY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpXSwgdmFsdWU6IHJlc1tjb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCldIH0gfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sdW1uLm9uUmV0dXJuKSB7XG4gICAgICAgICAgY29sdW1uLm9uUmV0dXJuKHJlcywgcm93KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm93W2NvbHVtbi5maWVsZF0gIT09IG9iai5zZWxlY3Rpb24pIHtcbiAgICAgICAgICB0aGlzLmJyb3dzZXJDbG9zZUV2ZW50KHRydWUpO1xuICAgICAgICAgIGlmIChjb2x1bW4ub25DaGFuZ2UpIHtcbiAgICAgICAgICAgIGNvbHVtbi5vbkNoYW5nZShyb3cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICh7IGVycm9yIH0pID0+IHtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBzZXRGaWx0ZXJMb29rdXAoY29sdW1uOiBhbnkpIHtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLnNldExvb2tVcEZpbHRlcihjb2x1bW4sIHRoaXMuZGlhbG9nU2VydmljZSk7XG4gIH1cblxuICAvLyBzZXQgbG9va3VwIHZhbHVlIHRoYXQgZGlzcGxheSBpbiByZWFkT25seU1vZGVcbiAgc2V0TG9va3VwUmVhZE9ubHlWYWx1ZShyb3csIGNvbHVtbikge1xuICAgIGxldCB2YWx1ZSA9ICcnO1xuICAgIGlmICh0eXBlb2YgKHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy50ZXh0KSA9PT0gXCJvYmplY3RcIiAmJiByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8udGV4dCAmJiAocm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LnRleHQpPy5oYXNPd25Qcm9wZXJ0eSgndGV4dCcpKSB7XG4gICAgICB2YWx1ZSA9IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy50ZXh0LnRleHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gcm93W2NvbHVtbi5maWVsZF07XG4gICAgICBpZiAoY29sdW1uLmRpc3BsYXlGaWVsZCkge1xuICAgICAgICB2YWx1ZSA9IHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gcm93W2NvbHVtbi5maWVsZF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vIENoZWNrIGNhbGVuZGFyIHZhbHVlIGlzIGNoYW5nZWQgb3Igbm90XG4gIGNhbGVuZGFyQ2hhbmdlRXZlbnQoY29sdW1uOiBhbnksIHJvdzogYW55KSB7XG4gICAgbGV0IHZhbHVlQ2hhbmdlOiBib29sZWFuID0gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgY29sdW1uLnRpbWVPbmx5ICYmXG4gICAgICB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShyb3dbY29sdW1uLmZpZWxkXSwgJ2hoOm1tIGEnKSAhPT1cbiAgICAgIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHRoaXMuY2FsZW5kYXJQcmV2aW91c1ZhbHVlLCAnaGg6bW0gYScpXG4gICAgKSB7XG4gICAgICB2YWx1ZUNoYW5nZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGNvbHVtbi5zaG93VGltZSAmJlxuICAgICAgdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0ocm93W2NvbHVtbi5maWVsZF0sICd5eXl5LU1NLWRkIGhoOm1tJykgIT09XG4gICAgICB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh0aGlzLmNhbGVuZGFyUHJldmlvdXNWYWx1ZSwgJ3l5eXktTU0tZGQgaGg6bW0nKVxuICAgICkge1xuICAgICAgdmFsdWVDaGFuZ2UgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShyb3dbY29sdW1uLmZpZWxkXSwgJ3l5eXktTU0tZGQnKSAhPT1cbiAgICAgIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHRoaXMuY2FsZW5kYXJQcmV2aW91c1ZhbHVlLCAneXl5eS1NTS1kZCcpXG4gICAgKSB7XG4gICAgICB2YWx1ZUNoYW5nZSA9IHRydWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZUNoYW5nZSkge1xuICAgICAgdGhpcy5icm93c2VyQ2xvc2VFdmVudCh0cnVlKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVSb3dzRGF0YUNvcHkgPSBmYWxzZTtcbiAgICAgIHRoaXMucm93VXBkYXRlQ2hhbmdlID0gdHJ1ZTtcblxuICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnJvd3NDaGFuZ2UuZW1pdCh0aGlzLnJvd3NEYXRhKTtcbiAgICAgIH0pO1xuICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyAgIHRoaXMucm93c0NoYW5nZS5lbWl0KHRoaXMucm93c0RhdGEpO1xuICAgICAgLy8gfSwgMjUwKTtcbiAgICAgIGlmIChjb2x1bW4ub25DaGFuZ2UpIHtcbiAgICAgICAgY29sdW1uLm9uQ2hhbmdlKHJvdyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2FsZW5kYXJQcmV2aW91c1ZhbHVlID0gJyc7XG4gIH1cblxuICBzZXRBdXRvQ29tcGxldGV2YWx1ZU9uVHlwZShjb2x1bW46IGFueSwgcm93OiBhbnksIGV2ZW50OiBhbnkgPSBbXSkge1xuICAgIGxldCB2YWx1ZSA9IGV2ZW50Py50YXJnZXQ/LnZhbHVlO1xuICAgIGxldCBmaWVsZCA9IGNvbHVtbj8uZmllbGQ/LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuQVVUT0NPTVBMRVRFICYmIHZhbHVlICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3QgdmFsdWVLZXkgPSBjb2x1bW4ub3B0aW9uVmFsdWUgPyBjb2x1bW4ub3B0aW9uVmFsdWUgOiBmaWVsZDtcbiAgICAgIGNvbnN0IGxhYmVsS2V5ID0gY29sdW1uLm9wdGlvbkxhYmVsID8gY29sdW1uLm9wdGlvbkxhYmVsIDogY29sdW1uLmRpc3BsYXlGaWVsZCA/IGNvbHVtbi5kaXNwbGF5RmllbGQgOiBmaWVsZDtcbiAgICAgIGlmKHJvd1tmaWVsZF0/Lmxlbmd0aCA+IDApe1xuICAgICAgICBjb25zdCBhbHJlYWR5RXhpc3QgPSByb3dbZmllbGRdPy5maW5kKChyb3dJbmZvKT0+IHJvd0luZm9bZmllbGRdID09PSB2YWx1ZSk7XG4gICAgICAgIGlmKCFhbHJlYWR5RXhpc3Qpe1xuICAgICAgICAgIHJvd1tmaWVsZF0gPSBbLi4ucm93W2ZpZWxkXSwgeyBbbGFiZWxLZXk/LnRvTG93ZXJDYXNlKCldOiB2YWx1ZSwgW3ZhbHVlS2V5Py50b0xvd2VyQ2FzZSgpXTogdmFsdWUsIFtmaWVsZD8udG9Mb3dlckNhc2UoKV06IHZhbHVlIH1dO1xuICAgICAgICB9XG4gICAgICB9ZWxzZXtcbiAgICAgICAgcm93W2ZpZWxkXSA9IFt7IFtsYWJlbEtleT8udG9Mb3dlckNhc2UoKV06IHZhbHVlLCBbdmFsdWVLZXk/LnRvTG93ZXJDYXNlKCldOiB2YWx1ZSwgW2ZpZWxkPy50b0xvd2VyQ2FzZSgpXTogdmFsdWUgfV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmKGV2ZW50Py50YXJnZXQ/LnZhbHVlKXtcbiAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnO1xuICAgIH1cbiAgICBcbiAgfVxuICBcbiAgb25BdXRvQ29tcGxldGVLZXlFbnRlckV2ZW50KGUsIGNvbHVtbiwgcm93KSB7XG4gICAgaWYgKGNvbHVtbi50eXBlID09IEVHcmlkQ29sdW1uVHlwZS5BVVRPQ09NUExFVEUpIHtcbiAgICAgIGlmIChjb2x1bW4uYWxsb3dBdXRvQ29tcGxldGVTYXZlICYmIGUudGFyZ2V0LnZhbHVlICYmICFjb2x1bW4uZGF0YT8ubGVuZ3RoKSB7XG4gICAgICAgIC8vL2NoZWNrIHRoZSBjb3JyZWN0IGZvcm1hdCBpZiBkYXRhLmNvbnRhaW5zIGN1eiBpdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHdpdGggb2JqZWN0cy5cbiAgICAgICAgaWYgKGNvbmZpcm0oYERvIHlvdSB3YW50IHRvIGFkZCAke2UudGFyZ2V0LnZhbHVlfSB0byB0aGUgc2VsZWN0aW9uP2ApKSB7XG4gICAgICAgICAgaWYgKGNvbHVtbi51bmlxdWVLZXkpIHtcbiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gdGhpcy5ncmlkU2VydmljZVxuICAgICAgICAgICAgICAuYWRkQXV0b0NvbXBsZXRlVmFsdWUoY29sdW1uLnVuaXF1ZUtleSwgZS50YXJnZXQudmFsdWUsIGNvbHVtbiwgcm93KVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLm9uUmV0dXJuKSB7XG4gICAgICAgICAgICAgICAgICBjb2x1bW4ub25SZXR1cm4oZS50YXJnZXQudmFsdWUsIGNvbHVtbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgb25Gb2N1c0V2ZW50KGNvbHVtbjogSUdyaWRDb2x1bW4sIHJvdzogYW55KSB7XG4gICAgdGhpcy5udW1lcmljVmFsdWVbY29sdW1uLmZpZWxkXSA9IHJvd1tjb2x1bW4uZmllbGRdXG4gIH1cblxuICBvbkZvY3VzT3V0RXZlbnQoY29sdW1uOiBJR3JpZENvbHVtbiwgcm93OiBhbnksIGV2ZW50OiBhbnkgPScnKSB7XG4gICAgdGhpcy5zZXRBdXRvQ29tcGxldGV2YWx1ZU9uVHlwZShjb2x1bW4sIHJvdywgZXZlbnQpXG4gICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTlVNRVJJQyAmJiB0aGlzLm51bWVyaWNWYWx1ZVtjb2x1bW4uZmllbGRdICE9PSByb3dbY29sdW1uLmZpZWxkXSkge1xuICAgICAgdGhpcy5vbkNoYW5nZUV2ZW50KGNvbHVtbiwgcm93KVxuICAgIH1cbiAgICBpZiAoY29sdW1uLnR5cGUgIT09IEVHcmlkQ29sdW1uVHlwZS5BVVRPQ09NUExFVEUgfHwgKCFjb2x1bW4uYWxsb3dBdXRvQ29tcGxldGVTYXZlKSkge1xuICAgICAgdGhpcy5ncmlkU2VydmljZS5jaGVja1ZhbGlkaXR5KFtjb2x1bW5dLCByb3cpO1xuICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuREFURSkge1xuICAgICAgICB0aGlzLmNhbGVuZGFyQ2hhbmdlRXZlbnQoY29sdW1uLCByb3cpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbHVtbi5vbkZvY3VzT3V0KSB7XG4gICAgICAgIGNvbHVtbi5vbkZvY3VzT3V0KHJvdyk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBjb2x1bW4ub25SZXR1cm4gJiZcbiAgICAgICAgY29sdW1uLnR5cGUgIT09IEVHcmlkQ29sdW1uVHlwZS5MT09LVVBfSU5QVVRcbiAgICAgICkge1xuICAgICAgICBjb2x1bW4ub25SZXR1cm4ocm93KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pc0NoZWNrQm94Q2hhbmdlRXZlbnRDYWxsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLnJvd1VwZGF0ZSA9IGZhbHNlO1xuICB9XG5cbiAgc2V0UmVwb3J0TmFtZShjb2x1bW46IElHcmlkUmVwb3J0QnRuLCByb3c6IGFueSkge1xuICAgIGxldCByZXBvcnQ6IGFueSA9ICcnO1xuICAgIGlmIChjb2x1bW4ucmVwb3J0SWQpIHtcbiAgICAgIHJlcG9ydCA9IGNvbHVtbi5yZXBvcnRJZDtcbiAgICB9IGVsc2UgaWYgKHJvd1tjb2x1bW4/LmxhYmVsPy50b0xvd2VyQ2FzZSgpICsgJ19vYmonXSAmJiByb3dbY29sdW1uPy5sYWJlbD8udG9Mb3dlckNhc2UoKSArICdfb2JqJ10/LnJlcG9ydE5hbWUpIHtcbiAgICAgIHJlcG9ydCA9IHJvd1tjb2x1bW4/LmxhYmVsPy50b0xvd2VyQ2FzZSgpICsgJ19vYmonXT8ucmVwb3J0TmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVwb3J0ID0gY29sdW1uLnJlcG9ydE5hbWU7XG4gICAgfVxuICAgIHJldHVybiByZXBvcnQ7XG4gIH1cblxuICBzZXRSZXBvcnRQYXJhbXMoY29sdW1uOiBJR3JpZFJlcG9ydEJ0biwgcm93OiBhbnkpIHtcbiAgICBsZXQgcmVwb3J0UGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgIGlmIChyb3dbY29sdW1uPy5sYWJlbD8udG9Mb3dlckNhc2UoKSArICdfb2JqJ10gJiYgcm93W2NvbHVtbj8ubGFiZWw/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5yZXBvcnRQYXJhbSkge1xuICAgICAgcmVwb3J0UGFyYW1zID0gcm93W2NvbHVtbj8ubGFiZWw/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5yZXBvcnRQYXJhbTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVwb3J0UGFyYW1zID0gY29sdW1uLnBhcmFtcztcbiAgICB9XG4gICAgcmV0dXJuIHJlcG9ydFBhcmFtcztcbiAgfVxuXG4gIHNldEZpbHRlckZvY3VzT3V0KGNvbDogYW55LCBmaWx0ZXI/OiBhbnksIGV2ZW50PzogYW55KSB7XG4gICAgdGhpcy5zZXRHcmlkRmlsdGVyKGNvbCwgZmlsdGVyLCBldmVudCk7XG4gIH1cbiAgc2V0R3JpZEZpbHRlcihjb2w6IElHcmlkQ29sdW1uLCBmaWx0ZXI/OiBhbnksIGV2ZW50PzogYW55KSB7XG4gICAgdGhpcy5ncmlkRmlsdGVyT2JqID0geyBjb2x1bW46IGNvbCwgZmlsdGVyOiBmaWx0ZXIsIGV2ZW50OiBldmVudCB9O1xuICAgIGNvbnN0IG5ld0NvbHVtbjogYW55ID0geyAuLi5jb2wgfTtcbiAgICAvL2NoYW5nZSBmaWx0ZXIgY2FsZW5kYXIgZm9ybWF0XG4gICAgaWYgKG5ld0NvbHVtbi50eXBlID09PSAnZGF0ZScgJiYgbmV3Q29sdW1uLmZpbHRlclZhbHVlICYmIG5ld0NvbHVtbi5maWx0ZXI/LnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5DQUxFTkRBUikge1xuICAgICAgbmV3Q29sdW1uLmZpbHRlclZhbHVlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oXG4gICAgICAgIGNvbC5maWx0ZXJWYWx1ZS50b1N0cmluZygpLnRyaW0oKSxcbiAgICAgICAgJ3l5eXktTU0tZGQnXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlck9iaihuZXdDb2x1bW4pO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBseUZpbHRlcicsIEpTT04uc3RyaW5naWZ5KGZhbHNlKSk7XG4gIH1cblxuICBmaWx0ZXJPYmooY29sOiBhbnkpIHtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICBmaWVsZDogY29sLmZpZWxkLFxuICAgICAgbWF0Y2hNb2RlOiBjb2wubWF0Y2hNb2RlID8gY29sLm1hdGNoTW9kZSA6ICdzdGFydHNXaXRoJyxcbiAgICAgIG9wZXJhdG9yOiBjb2wub3BlcmF0b3IgPyBjb2wub3BlcmF0b3IgOiAnYW5kJyxcbiAgICAgIHRhYmxlQWxpYXM6IGNvbC50YWJsZUFsaWFzID8gY29sLnRhYmxlQWxpYXMgOiAnJyxcbiAgICAgIHZhbHVlOiBjb2wudHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLk1VTFRJU0VMRUNUID8gY29sLmZpbHRlclZhbHVlLnRvU3RyaW5nKCkgOiBjb2wuZmlsdGVyVmFsdWUsXG4gICAgfTtcbiAgICB0aGlzLmdsb2JhbEZpbHRlcnNBcnJheS5wdXNoKG9iaik7XG4gIH1cblxuICBhcHBseUVudGVyRXZlbnQoZmlsdGVyOiBhbnksIGV2ZW50OiBhbnksIGNvbHVtbjogYW55KSB7XG4gICAgdGhpcy5ncmlkU2VydmljZS51c2VyU2VhcmNoZWQ9dHJ1ZTtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgPSB0cnVlO1xuICAgIHRoaXMucm93VXBkYXRlQ2hhbmdlID0gZmFsc2U7XG4gICAgdGhpcy5hdXRvTG9hZERhdGEgPSB0cnVlO1xuICAgIC8vdGhpcy5sb2FkaW5nPXRydWU7XG4gICAgdGhpcy5vbkFwcGx5RmlsdGVyLmVtaXQoKTtcbiAgICB0aGlzLmZpbHRlck9iaihjb2x1bW4pO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBseUZpbHRlcicsIEpTT04uc3RyaW5naWZ5KHRydWUpKTtcbiAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5NVUxUSVNFTEVDVCkge1xuICAgICAgZmlsdGVyKGNvbHVtbj8uZmlsdGVyVmFsdWU/LnRvU3RyaW5nKCkpXG4gICAgfSBlbHNlIGlmIChjb2x1bW4/LmZpbHRlcj8udHlwZSA9PT0gdGhpcy5kcm9wRG93bkZpbHRlcj8uY29sdW1uPy5maWx0ZXI/LnR5cGUpIHtcbiAgICAgIHRoaXMuZHJvcERvd25GaWx0ZXIuZmlsdGVyKHRoaXMuZHJvcERvd25GaWx0ZXIuZXZlbnQudGFyZ2V0KTtcbiAgICB9IGVsc2UgaWYgKGZpbHRlciAmJiBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkJPT0xFQU4gJiYgY29sdW1uPy5maWx0ZXI/LnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5DSEVDS0JPWCAmJiBjb2x1bW4uZmlsdGVyaW5nICE9PSBmYWxzZSkge1xuICAgICAgZmlsdGVyKGV2ZW50Py5jaGVja2VkKTtcbiAgICB9IGVsc2UgaWYgKGZpbHRlcikge1xuICAgICAgZmlsdGVyKGV2ZW50Py50YXJnZXQ/LnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVOdWxsQ2FsZW5kYXIoY29sdW1uOiBJR3JpZENvbHVtbiwgZmlsdGVyOiBhbnksIGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoY29sdW1uLmZpbHRlclZhbHVlID09PSBudWxsKSB7XG4gICAgICB0aGlzLnJlbW92ZU51bGxGaWx0ZXJzKGNvbHVtbik7XG4gICAgICB0aGlzLnNldEZpbHRlckZvY3VzT3V0KGNvbHVtbiwgZmlsdGVyLCBldmVudCk7XG4gICAgfVxuICB9XG5cbiAgYmFja3NwYWNlRXZlbnQoZXZlbnQ6IGFueSwgY29sdW1uOiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICBldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnICYmXG4gICAgICAoY29sdW1uLmZpbHRlclZhbHVlPy50b1N0cmluZygpLmxlbmd0aCA9PT0gMSB8fFxuICAgICAgICBjb2x1bW4uZmlsdGVyVmFsdWU/LnRvU3RyaW5nKCkgPT09ICcnIHx8XG4gICAgICAgIGNvbHVtbi5maWx0ZXJWYWx1ZSA9PT0gbnVsbClcbiAgICApIHtcbiAgICAgIHRoaXMucmVtb3ZlTnVsbEZpbHRlcnMoY29sdW1uKTtcbiAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuREFURSAmJiBjb2x1bW4uZmlsdGVyVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMucmVtb3ZlTnVsbEZpbHRlcnMoY29sdW1uKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVOdWxsRmlsdGVycyhjb2x1bW46IGFueSkge1xuICAgIGlmICh0aGlzLmdsb2JhbEZpbHRlcnNBcnJheSAmJiB0aGlzLmdsb2JhbEZpbHRlcnNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgYXJyID0gWy4uLnRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5XTtcbiAgICAgIGxldCBpbmRleCA9IGFyci5maW5kSW5kZXgoKGkpID0+IGkuZmllbGQgPT09IGNvbHVtbi5maWVsZCk7XG4gICAgICBhcnIuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyc0FycmF5ID0gYXJyO1xuICAgIH1cbiAgICBsZXQgaW5kZXggPSB0aGlzLnNlcnZlckZpbHRlcnMuZmlsdGVycy5maW5kSW5kZXgoKGkpID0+IHtpLmZpZWxkID09PSBjb2x1bW4uZmllbGR9KVxuICAgIHRoaXMuc2VydmVyRmlsdGVycy5maWx0ZXJzPy5zcGxpY2UoaW5kZXgsMSlcbiAgfVxuXG4gIC8vIFJlbW92aW5nIEhlYWRlciBGaWx0ZXIgVmFsdWUgdXNpbmcgQmFja3NwYWNlIGtleSBFdmVudCBvciBEZWxldGUga2V5IEV2ZW50LlxuICByZW1vdmluZ0ZpbHRlcnMoZXZlbnQ6IGFueSwgY29sdW1uOiBJR3JpZENvbHVtbikge1xuICAgIGlmIChcbiAgICAgIChldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnIHx8IGV2ZW50LmtleSA9PT0gJ0RlbGV0ZScpICYmXG4gICAgICBjb2x1bW4uZmlsdGVyVmFsdWU/LnRvU3RyaW5nKCkubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICBsZXQgc2VhcmNoRmlsdGVycztcbiAgICAgIGlmICghdGhpcy5zb2Z0Q2FjaGluZyAmJiB0aGlzLmNvbXBvbmVudFRhYmxlUmVmPy5pZCkge1xuICAgICAgICBzZWFyY2hGaWx0ZXJzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnU2V0RmlsdGVycy0nICsgdGhpcy5jb21wb25lbnRUYWJsZVJlZj8uaWQgKyB0aGlzLmN1cnJlbnRVcmwpIGFzIGFueSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkKSB7XG4gICAgICAgIHNlYXJjaEZpbHRlcnMgPSB0aGlzLmdyaWRTZXJ2aWNlLnNvZnRDYWNoaW5nRmlsdGVyc1t0aGlzLmNvbXBvbmVudFRhYmxlUmVmPy5pZCArIHRoaXMuY3VycmVudFVybF07XG4gICAgICB9XG4gICAgICBpZiAoc2VhcmNoRmlsdGVycyAmJiBzZWFyY2hGaWx0ZXJzLmZpbHRlcnMpIHtcbiAgICAgICAgaWYgKHNlYXJjaEZpbHRlcnMuZmlsdGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbGV0IGluZGV4ID0gc2VhcmNoRmlsdGVycy5maWx0ZXJzLmZpbmRJbmRleChcbiAgICAgICAgICAgICh4OiBhbnkpID0+IHguZmllbGQgPT09IGNvbHVtbi5maWVsZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGlmIChzZWFyY2hGaWx0ZXJzLmZpbHRlcnMubGVuZ3RoID09PSAxICYmIHRoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkKSB7XG4gICAgICAgICAgICAgIHRoaXMuZ3JpZFNlcnZpY2Uuc29mdENhY2hpbmdGaWx0ZXJzW3RoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkICsgdGhpcy5jdXJyZW50VXJsXSA9IFtdO1xuICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnU2V0RmlsdGVycy0nICsgdGhpcy5jb21wb25lbnRUYWJsZVJlZj8uaWQgKyB0aGlzLmN1cnJlbnRVcmwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VhcmNoRmlsdGVycy5maWx0ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgIGlmICghdGhpcy5zb2Z0Q2FjaGluZyAmJiB0aGlzLmNvbXBvbmVudFRhYmxlUmVmPy5pZCkge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdTZXRGaWx0ZXJzLScgKyB0aGlzLmNvbXBvbmVudFRhYmxlUmVmPy5pZCArIHRoaXMuY3VycmVudFVybCwgSlNPTi5zdHJpbmdpZnkoc2VhcmNoRmlsdGVycykpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29tcG9uZW50VGFibGVSZWY/LmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkU2VydmljZS5zb2Z0Q2FjaGluZ0ZpbHRlcnNbdGhpcy5jb21wb25lbnRUYWJsZVJlZj8uaWQgKyB0aGlzLmN1cnJlbnRVcmxdID0gc2VhcmNoRmlsdGVycztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBDbGljayBCdXR0b24gRXZlbnQgb24gR3JpZC5cbiAgb25DbGlja0J1dHRvbihjb2x1bW46IGFueSwgcm93OiBhbnkpIHtcbiAgICB0aGlzLm9wZW5HcmlkRGlhbG9nKGNvbHVtbiwgcm93KTtcbiAgfVxuXG4gIC8vIEludm9rZSBvbkNsaWNrIEV2ZW50LlxuICBvbkNsaWNrRXZlbnQoY29sdW1uOiBhbnksIHJvdzogYW55KSB7XG4gICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuTElOSyAmJiAoY29sdW1uLmVkaXRMaW5rID09PSBmYWxzZSB8fCBjb2x1bW4uZWRpdExpbmsgPT09IHVuZGVmaW5lZCkgJiYgY29sdW1uLmVkaXRhYmxlICE9PSB0cnVlICYmIGNvbHVtbi5kaXNhYmxlZCAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5vbkNsaWNrRXZlbnRUcmlnZ2VyZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBpZihjb2x1bW4udHlwZT09PUVHcmlkQ29sdW1uVHlwZS5ESUFMT0cgJiYgcm93W2NvbHVtbi5maWVsZF0pe1xuICAgIC8vICAgdGhpcy5vcGVuR3JpZERpYWxvZyhjb2x1bW4scm93KVxuICAgIC8vIH1cbiAgICBpZiAoY29sdW1uLnR5cGUgPT09IEVHcmlkQ29sdW1uVHlwZS5EQVRFICYmIHJvd1tjb2x1bW4uZmllbGRdKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyUHJldmlvdXNWYWx1ZSA9IHJvd1tjb2x1bW4uZmllbGRdO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAhcm93W2NvbHVtbi5maWVsZF0gJiZcbiAgICAgIGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuREFURSAmJlxuICAgICAgKGNvbHVtbi5zaG93VGltZSB8fCBjb2x1bW4udGltZU9ubHkpICYmXG4gICAgICBjb2x1bW4ubWludXRlc0ludGVydmFsXG4gICAgKSB7XG4gICAgICB0aGlzLmRlZmF1bHREYXRlID0gbmV3IERhdGUoc2V0TWludXRlc0ludGVydmFsKG5ldyBEYXRlKCkpKTtcbiAgICB9XG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4ub25DbGljayAmJiBjb2x1bW4uZGlzYWJsZWQgIT09IHRydWUgJiYgKHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5hY3Rpb24/LmRpc2FibGVkICE9PSB0cnVlIHx8ICByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlzYWJsZWQgIT09IHRydWUpKSB7XG4gICAgICBjb2x1bW4ub25DbGljayhyb3cpO1xuICAgIH1cbiAgfVxuXG4gIHNldE11bHRpU2VsZWN0VmFsdWUoY29sdW1uLCByb3cpIHtcbiAgICBpZiAocm93W2NvbHVtbi5maWVsZF0gJiYgIUFycmF5LmlzQXJyYXkocm93W2NvbHVtbi5maWVsZF0pKSB7XG4gICAgICBpZiAodHlwZW9mIChyb3dbY29sdW1uLmZpZWxkXSkgPT09IFwic3RyaW5nXCIgJiYgIXJvd1tjb2x1bW4uZmllbGRdPy5pbmNsdWRlcygnLCcpKSB7XG4gICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gW3Jvd1tjb2x1bW4uZmllbGRdXTtcbiAgICAgIH0gZWxzZSBpZiAocm93W2NvbHVtbi5maWVsZF0/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcsJykpIHtcbiAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gPSByb3dbY29sdW1uLmZpZWxkXT8uc3BsaXQoJywnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd1tjb2x1bW4uZmllbGRdO1xuICB9XG5cbiAgLy8gc2V0IHRoZSBzZWxlY3QgdmFsdWUgb2YgbXVsdGktc2VsZWN0XG4gIHNob3dPcHRpb24oY29sdW1uLCByb3cpIHtcbiAgICByb3dbY29sdW1uLmZpZWxkXSA9IHRoaXMuc2V0TXVsdGlTZWxlY3RWYWx1ZShjb2x1bW4sIHJvdyk7XG4gIH1cblxuICBvbkNsZWFyVmFsdWUoY29sdW1uLCByb3cpIHtcbiAgICBpZiAoY29sdW1uPy50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRFJPUERPV04gJiYgIXJvd1tjb2x1bW4uZmllbGRdKSB7XG4gICAgICByb3dbY29sdW1uLmZpZWxkXSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gSW52b2tlIG9uQ2hhbmdlIEV2ZW50XG4gIG9uQ2hhbmdlRXZlbnQoY29sdW1uOiBhbnksIHJvdzogYW55KSB7XG4gICAgLy8gc2V0IGRyb3Bkb3duIGRpc3BsYXlGaWVsZCB2YWx1ZSBiYXNlIG9uIG9wdGlvbkxhYmVsICYgb3B0aW9uVmFsdWUuXG4gICAgdGhpcy5ncmlkVmFsaWRhdGlvbihjb2x1bW4sIHJvdywgdHJ1ZSlcbiAgICB0aGlzLmRpc3BsYXlGaWVsZERyb3Bkb3duVmFsdWUoY29sdW1uLCByb3cpO1xuICAgIHRoaXMub25DbGVhclZhbHVlKGNvbHVtbiwgcm93KTtcbiAgICB0aGlzLmJyb3dzZXJDbG9zZUV2ZW50KHRydWUpO1xuICAgIHRoaXMucm93VXBkYXRlQ2hhbmdlID0gdHJ1ZTtcbiAgICBpZiAoY29sdW1uLm9uQ2hhbmdlKSB7XG4gICAgICBjb2x1bW4ub25DaGFuZ2Uocm93KTtcbiAgICB9XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub25DbGlja0V2ZW50VHJpZ2dlcmVkID09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLnJvd3NDaGFuZ2UuZW1pdCh0aGlzLnJvd3NEYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLnNldERyb3Bkb3duZGF0YVZhbHVlID0gZmFsc2VcbiAgICB0aGlzLmlzQ2hlY2tCb3hDaGFuZ2VFdmVudENhbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuZ3JpZFNlcnZpY2Uucm93VXBkYXRlID0gZmFsc2U7XG4gICAgdGhpcy5nZW5lcmF0ZVJvd3NEYXRhQ29weSA9IGZhbHNlXG4gICAgaWYgKGNvbHVtbi5hZ2dyZWdhdGUgJiYgY29sdW1uLmFnZ3JlZ2F0ZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmFnZ3JlZ2F0ZUZvb3RlciA9IHRydWU7XG4gICAgICB0aGlzLnNldEFnZ3JlZ2F0ZVRleHQoY29sdW1uKTtcbiAgICB9XG4gIH1cblxuICBjaGVja0JveENoYW5nZUV2ZW50KGV2ZW50OiBhbnksIGNvbHVtbjogSUdyaWRDb2x1bW4sIHJvdykge1xuICAgIHJvd1tjb2x1bW4uZmllbGRdID0gZXZlbnQ7XG4gICAgaWYgKHRoaXMucm93c0NoYW5nZS5vYnNlcnZlcnM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5pc0NoZWNrQm94Q2hhbmdlRXZlbnRDYWxsZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmdyaWRTZXJ2aWNlLnJvd1VwZGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuZ2VuZXJhdGVSb3dzRGF0YUNvcHkgPSBmYWxzZVxuICAgIHRoaXMucm93VXBkYXRlQ2hhbmdlID0gdHJ1ZVxuICAgIHRoaXMucm93c0NoYW5nZS5lbWl0KHRoaXMucm93c0RhdGEpO1xuICB9XG5cbiAgLy8gc2V0IGRyb3Bkb3duIGRpc3BsYXlGaWVsZCB2YWx1ZSBiYXNlIG9uIG9wdGlvbkxhYmVsICYgb3B0aW9uVmFsdWUuXG4gIGRpc3BsYXlGaWVsZERyb3Bkb3duVmFsdWUoY29sdW1uOiBhbnksIHJvdzogYW55KSB7XG4gICAgaWYgKFxuICAgICAgY29sdW1uPy50eXBlID09PSBFR3JpZENvbHVtblR5cGUuRFJPUERPV04gJiZcbiAgICAgIGNvbHVtbi5kaXNwbGF5RmllbGQgJiZcbiAgICAgIGNvbHVtbi5kaXNwbGF5RmllbGQ/Lmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGNvbnN0IGtleTogYW55ID0gT2JqZWN0LmtleXMocm93KT8uZmluZChcbiAgICAgICAgKHJvd0luZm8pID0+XG4gICAgICAgICAgcm93SW5mbz8udG9Mb3dlckNhc2UoKSA9PT0gY29sdW1uLmRpc3BsYXlGaWVsZC50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgICAgY29uc3QgZGlzcGxheUZpZWxkVmFsdWUgPSBjb2x1bW4uZGF0YS5maW5kKFxuICAgICAgICAocmVjb3JkOiBhbnkpID0+XG4gICAgICAgICAgcmVjb3JkW2NvbHVtbi5vcHRpb25WYWx1ZV0/LnRvU3RyaW5nKCkgPT09XG4gICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0/LnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgICBpZiAoa2V5ICYmIGRpc3BsYXlGaWVsZFZhbHVlKSB7XG4gICAgICAgIHJvd1trZXldID0gZGlzcGxheUZpZWxkVmFsdWVbY29sdW1uLm9wdGlvbkxhYmVsXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBZGQgYXV0b1NlYXJjaCBvbiBHcmlkLlxuICBhdXRvU2VhcmNoKGV2ZW50OiBhbnksIGNvbHVtbjogYW55LCByb3c6IGFueSkge1xuICAgIGlmIChldmVudCAmJiBjb2x1bW4gJiYgcm93KSB7XG4gICAgICBjb2x1bW4ub25SZXR1cm4oZXZlbnQucXVlcnksIGNvbHVtbiwgcm93KTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWZyZXNoIGdyaWRcbiAgcmVmcmVzaEdyaWQoKSB7XG4gICAgdGhpcy5yZWxvYWRQYWdlID0gaW50ZXJ2YWwodGhpcy5zZXRHcmlkUmVmcmVzaFRpbWUpLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZ3JpZGZpbHRlciA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5ncmlkZmlsdGVyID0geyBmaWx0ZXJzOiBbXSwgc29ydHM6IFtdIH07XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZXRHcmlkUmVmcmVzaFRpbWUpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVTZXJ2ZXJTaWRlRXZlbnRzKHRoaXMuZ3JpZGZpbHRlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBSZW1vdmUgRmlsdGVyVmFsdWVzXG4gIGNsZWFyZ3JpZEZpbHRlcnNWYWx1ZSgpIHtcbiAgICBjb25zdCBnbG9iYWxGaWx0ZXJDbGVhclZhbHVlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAnY2xlYXJHbG9iYWxGaWx0ZXJCdG4nXG4gICAgKTtcbiAgICBpZiAoZ2xvYmFsRmlsdGVyQ2xlYXJWYWx1ZUJ0bikge1xuICAgICAgZ2xvYmFsRmlsdGVyQ2xlYXJWYWx1ZUJ0bi5jbGljaygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RlZENvbHVtbnMgJiYgdGhpcy5zZWxlY3RlZENvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZXJ2ZXJGaWx0ZXJzLmZpbHRlcnMgPSBbXTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICBjb2wuZmlsdGVyVmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbHRlck9iaihjb2wpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZWRpdEFsbFJvd3NBdE9uY2UoKSB7XG4gICAgaWYgKHRoaXMuZWRpdFJvd1Blcm1pc3Npb24pIHtcbiAgICAgIGlmICh0aGlzLmdldENsYXNzRm9yRWRpdEFsbFJvd3MoJ2VkaXRSb3cnKSkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkJPT0xFQU4gJiYgKGNvbHVtbi5maWx0ZXJpbmcgPT09IHRydWUgfHwgY29sdW1uLmZpbHRlcmluZyA9PT0gdW5kZWZpbmVkKSkpIHtcbiAgICAgICAgICB0aGlzLmVkaXRBbGxSZWNvcmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc29ydERpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzYXZlQWxsUm93c0F0T25jZSgpIHtcbiAgICB0aGlzLmdldENsYXNzRm9yRWRpdEFsbFJvd3MoJ3NhdmVSb3cnKTtcbiAgfVxuXG4gIC8vIHJlc2V0IHRoZSBncmlkIHJvd3NWYWx1ZSB0byBvcmlnbmFsIHZhbHVlc1xuICBjYW5jZWxBbGxSb3dzQXRPbmNlKCkge1xuICAgIHRoaXMucm93c0RhdGEgPSBbLi4udGhpcy5yb3dzRGF0YUNvcHldO1xuICAgIHRoaXMucm93c0RhdGFDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnJvd3NEYXRhKSk7XG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnM/LmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBFR3JpZENvbHVtblR5cGUuREFURSkge1xuICAgICAgICB0aGlzLnJvd3NEYXRhPy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICBpZiAocm93W2NvbHVtbi5maWVsZF0pIHtcbiAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gbmV3IERhdGUocm93W2NvbHVtbi5maWVsZF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgIH0pO1xuICAgIGlmICh0aGlzLmNvbHVtbnM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICBpZiAoY29sdW1uLmFnZ3JlZ2F0ZSAmJiBjb2x1bW4uYWdncmVnYXRlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmFnZ3JlZ2F0ZUZvb3RlciA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zZXRBZ2dyZWdhdGVUZXh0KGNvbHVtbik7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHRoaXMub25DYW5jZWxBbGxSb3dzLmVtaXQodGhpcy5yb3dzRGF0YSk7XG4gIH1cbiAgZ2V0Q2xhc3NGb3JFZGl0QWxsUm93cyhjbGFzc05hbWU6IHN0cmluZyA9ICcnKSB7XG4gICAgbGV0IHN1Y2Nlc3M6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBpZiAoY2xhc3NOYW1lID09PSAnZWRpdFJvdycpIHtcbiAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICB0aGlzLm9uUm93RWRpdEluaXQocm93KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGdldEJ0bnM6IGFueSA9IHRoaXMuZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudD8uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWUpO1xuICAgIGlmIChnZXRCdG5zICYmIGdldEJ0bnMubGVuZ3RoID4gMCkge1xuICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgICBpZiAoY2xhc3NOYW1lID09PSAnc2F2ZVJvdycpIHtcbiAgICAgICAgdGhpcy5lZGl0QWxsUmVjb3JkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2F2ZUFsbFJlY29yZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJlY29yZHMkID0gW107XG4gICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBnZXRCdG5zKSB7XG4gICAgICAgICAgICBjb25zdCByb3dTYXZlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICBpdGVtLmNsaWNrKCk7XG4gICAgICAgICAgICAgIHJlc29sdmUoaXRlbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlY29yZHMkLnB1c2gocm93U2F2ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFByb21pc2UuYWxsKHJlY29yZHMkKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5vblJvd1VwZGF0ZS5lbWl0KHRoaXMuc2V0Um93c0RhdGEodGhpcy5jaGVja2xpc3QpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUm93c0RhdGFDb3B5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGhpcy5vblJvd1VwZGF0ZS5lbWl0KHRoaXMuc2F2ZVJlY29yZEFycmF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2F2ZVJlY29yZEFycmF5ID0gW107XG4gICAgICAgICAgICB0aGlzLmVkaXRBbGxSb3dzQXRPbmNlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNhdmVBbGxSZWNvcmQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSAnY2FuY2VsUm93Jykge1xuICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgZ2V0QnRucykge1xuICAgICAgICAgICAgICBpdGVtLmNsaWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzO1xuICB9XG5cbiAgLy9Gb2N1c2VkIGNhbGVuZGFyIGlucHV0IG9uIHNlbGVjdCBkYXRlXG4gIHNlbGVjdERhdGUoY29sdW1uOiBhbnkpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb2x1bW4uZmllbGQpPy5mb2N1cygpO1xuICB9XG5cbiAgLy9hcHBseSBmaWx0ZXIgb24gZ3JpZCB3aGVuIHNlYXJjaCBidG4gY2xpY2tlZFxuICBhcHBseUdyaWRGaWx0ZXJCdG4oKSB7XG4gICAgIHRoaXMuZ3JpZFNlcnZpY2UudXNlclNlYXJjaGVkPXRydWU7XG4gICAgIHRoaXMuaXNDaGVja0JveENoYW5nZUV2ZW50Q2FsbGVkID0gZmFsc2U7XG4gICAgIHRoaXMuZ3JpZFNlcnZpY2Uucm93VXBkYXRlID0gZmFsc2U7XG4gICAgIHRoaXMucm93VXBkYXRlQ2hhbmdlID0gZmFsc2U7XG4gICAgIGxldCBmaWx0ZXJJbkRpYWxvZzogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncC1kaWFsb2cnKTtcbiAgICAgbGV0IGdsb2JhbEZpbHRlckFwcGx5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZWFyY2hidG5JZCk7XG4gICAgIGlmIChmaWx0ZXJJbkRpYWxvZyAmJiBmaWx0ZXJJbkRpYWxvZy5sZW5ndGggPiAwKSB7XG4gICAgICAgY29uc3QgZ2xvYmFsU2VhcmNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZWFyY2hidG5JZCk7XG4gICAgICAgaWYgKGdsb2JhbFNlYXJjaEJ0bikge1xuICAgICAgICAgZ2xvYmFsU2VhcmNoQnRuLmNsaWNrKCk7XG4gICAgICAgfSBlbHNlIGlmICh0aGlzLmdyaWRGaWx0ZXJPYmogJiYgT2JqZWN0LmtleXModGhpcy5ncmlkRmlsdGVyT2JqKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICB0aGlzLmFwcGx5RW50ZXJFdmVudChcbiAgICAgICAgICAgdGhpcy5ncmlkRmlsdGVyT2JqLmZpbHRlcixcbiAgICAgICAgICAgdGhpcy5ncmlkRmlsdGVyT2JqLmV2ZW50LFxuICAgICAgICAgICB0aGlzLmdyaWRGaWx0ZXJPYmouY29sdW1uXG4gICAgICAgICApO1xuICAgICAgIH1cbiAgICAgfSBlbHNlIGlmIChnbG9iYWxGaWx0ZXJBcHBseUJ0bikge1xuICAgICAgIGdsb2JhbEZpbHRlckFwcGx5QnRuLmNsaWNrKCk7XG4gICAgIH0gZWxzZSB7XG4gICAgICAgaWYgKHRoaXMuZ3JpZEZpbHRlck9iaiAmJiBPYmplY3Qua2V5cyh0aGlzLmdyaWRGaWx0ZXJPYmopLmxlbmd0aCA+IDApIHtcbiAgICAgICAgIHRoaXMuYXBwbHlFbnRlckV2ZW50KFxuICAgICAgICAgICB0aGlzLmdyaWRGaWx0ZXJPYmouZmlsdGVyLFxuICAgICAgICAgICB0aGlzLmdyaWRGaWx0ZXJPYmouZXZlbnQsXG4gICAgICAgICAgIHRoaXMuZ3JpZEZpbHRlck9iai5jb2x1bW5cbiAgICAgICAgICk7XG4gICAgICAgfVxuICAgICB9XG4gICAgICB0aGlzLmNoZWNrbGlzdCA9IFtdO1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd3MgPSBbXTtcbiAgIH1cblxuICAvLyBpbnZva2UgbXVsdGlTZWxlY3Rpb24gY2xpY2sgZXZlbnRcbiAgbXVsdGlDaGVja0JveE9uY2xpY2socm93SW5mbzogYW55LCBldmVudDogYW55LCBzaW5nbGVTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICghc2luZ2xlU2VsZWN0aW9uKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dJbmZvKSAmJiByb3dJbmZvPy5sZW5ndGggPiAwICYmIGV2ZW50Py50YXJnZXQ/LmFyaWFDaGVja2VkICYmIGV2ZW50Py50YXJnZXQ/LmFyaWFDaGVja2VkPy50b1N0cmluZygpID09PSBcInRydWVcIikge1xuICAgICAgICB0aGlzLmNoZWNrbGlzdCA9IFsuLi5yb3dJbmZvXTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyb3dJbmZvKSAmJiAoZXZlbnQ/LnRhcmdldD8uYXJpYUNoZWNrZWQgPT0gbnVsbCB8fCBldmVudD8udGFyZ2V0Py5hcmlhQ2hlY2tlZD8udG9TdHJpbmcoKSA9PT0gXCJmYWxzZVwiKSkge1xuICAgICAgICB0aGlzLmNoZWNrbGlzdCA9IFtdO1xuICAgICAgfVxuICAgICAgY29uc3QgYWxyZWFkeUV4aXN0ID0gdGhpcy5jaGVja2xpc3Quc29tZSgocm93KSA9PiByb3dbdGhpcy5kYXRhS2V5XSA9PSByb3dJbmZvW3RoaXMuZGF0YUtleV0pO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJvd0luZm8pICYmIGV2ZW50Py50YXJnZXQ/LmFyaWFDaGVja2VkICYmICFhbHJlYWR5RXhpc3QpIHtcbiAgICAgICAgdGhpcy5jaGVja2xpc3QucHVzaChyb3dJbmZvKTtcbiAgICAgIH0gZWxzZSBpZiAoYWxyZWFkeUV4aXN0ICYmIChldmVudD8udGFyZ2V0Py5hcmlhQ2hlY2tlZCA9PSBudWxsIHx8IGV2ZW50Py50YXJnZXQ/LmFyaWFDaGVja2VkID09PSBcImZhbHNlXCIpKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmNoZWNrbGlzdC5maW5kSW5kZXgoKHJvdykgPT4gcm93W3RoaXMuZGF0YUtleV0gPT0gcm93SW5mb1t0aGlzLmRhdGFLZXldKTtcbiAgICAgICAgICB0aGlzLmNoZWNrbGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoZWNrbGlzdCA9IFtyb3dJbmZvXVxuICAgIH1cbiAgICB0aGlzLm9uTXVsdGlTZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLnNldFJvd3NEYXRhKHRoaXMuY2hlY2tsaXN0KSk7XG4gIH1cblxuICBzZXRSb3dzRGF0YShyb3dzRGF0YSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJvd3NEYXRhKSkge1xuICAgICAgcm93c0RhdGEuZm9yRWFjaCgocm93OiBhbnkpID0+IHtcbiAgICAgICAgcm93ID0gdGhpcy5yZW1vdmVSb3dPYmoocm93KTtcbiAgICAgICAgcm93ID0gdGhpcy5ncmlkU2VydmljZS5zZXRSb3dWYWx1ZShyb3cpO1xuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgcm93c0RhdGEgPSB0aGlzLnJlbW92ZVJvd09iaihyb3dzRGF0YSk7XG4gICAgICByb3dzRGF0YSA9IHRoaXMuZ3JpZFNlcnZpY2Uuc2V0Um93VmFsdWUocm93c0RhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gcm93c0RhdGE7XG4gIH1cblxuICByZW1vdmVSb3dPYmoocm93OiBhbnkpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocm93KTtcbiAgICBpZiAoa2V5cz8ubGVuZ3RoID4gMCkge1xuICAgICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnX29iaicpKSB7XG4gICAgICAgICAgZGVsZXRlIHJvd1trZXldO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcm93O1xuICB9XG5cbiAgYXBwbHlEcm9wZG93bkZpbHRlcihmaWx0ZXI6IGFueSwgZXZlbnQ6IGFueSkge1xuICAgIGZpbHRlcihldmVudC50YXJnZXQpO1xuICB9XG5cbiAgc2VhcmNoRHJvcGRvd25GaWx0ZXIoZmlsdGVyOiBhbnksIGV2ZW50OiBhbnksIGNvbHVtbjogYW55KSB7XG4gICAgdGhpcy5zZXRGaWx0ZXJGb2N1c091dChjb2x1bW4sIGZpbHRlciwgZXZlbnQpO1xuICAgIHRoaXMuZHJvcERvd25GaWx0ZXIgPSB7IGZpbHRlcjogZmlsdGVyLCBldmVudDogZXZlbnQsIGNvbHVtbjogY29sdW1uIH07XG4gICAgLy8gaWYgKGNvbHVtbi5hbGxvd1NlYXJjaCAhPT0gdHJ1ZSkge1xuICAgIC8vICAgdGhpcy5hcHBseURyb3Bkb3duRmlsdGVyKGZpbHRlciwgZXZlbnQpO1xuICAgIC8vIH1cbiAgfVxuXG4gIGxvb2t1cENsZWFyVmFsdWUoY29sdW1uOiBJR3JpZENvbHVtbiwgcm93PzogYW55KSB7XG4gICAgaWYgKHJvdykge1xuICAgICAgY29sdW1uLmRpc3BsYXlGaWVsZCA/IHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkXSA9ICcnIDogJydcbiAgICAgIHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy50ZXh0ID8gcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10udGV4dCA9ICcnIDogJydcbiAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbHVtbi5maWx0ZXJWYWx1ZSA9ICcnO1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmNvbHVtbnMuZmluZEluZGV4KChjb2wpID0+IGNvbC5maWVsZD8udG9Mb3dlckNhc2UoKSA9PT0gY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIHRoaXMuY29sdW1uc1tpbmRleF0uZmlsdGVyVmFsdWUgPSAnJztcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0RmlsdGVyRm9jdXNPdXQoY29sdW1uKTtcbiAgICB9XG4gICAgdGhpcy5icm93c2VyQ2xvc2VFdmVudCh0cnVlKTtcbiAgICBpZiAoY29sdW1uLm9uQ2hhbmdlKSB7XG4gICAgICBjb2x1bW4ub25DaGFuZ2Uocm93KTtcbiAgICB9XG4gIH1cblxuICAvLyBpbnZva2Ugd2hlbiBjbGljayBoZWFkZXIgY2hlY2tib3ggZmlsdGVyXG4gIGNsaWNrQ2hlY2tCb3hGaWx0ZXIoY29sdW1uOiBJR3JpZENvbHVtbikge1xuICAgIGlmICh0aGlzLmVkaXRBbGxSZWNvcmQgfHwgY29sdW1uLmFsbG93RWRpdCkge1xuICAgICAgaWYgKFxuICAgICAgICBjb2x1bW4udHlwZSA9PT0gRUdyaWRDb2x1bW5UeXBlLkJPT0xFQU5cbiAgICAgICAgJiZcbiAgICAgICAgY29sdW1uPy5maWx0ZXI/LnR5cGUgPT09ICdjaGVja2JveCcgJiYgY29sdW1uLmZpbHRlcmluZyAhPSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucm93c0RhdGEuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgaWYgKHJvd1tjb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX29iaiddPy5kaXNhYmxlZCAhPT0gdHJ1ZSAmJiAhY29sdW1uLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpXSA9IGNvbHVtbi5maWx0ZXJWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5yb3dzQ2hhbmdlLm9ic2VydmVycz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmlzQ2hlY2tCb3hDaGFuZ2VFdmVudENhbGxlZCA9IHRydWU7XG4gICAgICB0aGlzLnJvd3NDaGFuZ2UuZW1pdCh0aGlzLnJvd3NEYXRhKTtcbiAgICB9XG4gICAgdGhpcy5vbkNoZWNrQm94RmlsdGVyQ2xpY2suZW1pdChjb2x1bW4pO1xuICB9XG4gIC8vc2V0IGhlYWRlciBjaGVja2JveCB2YWx1ZSBmb3IgZ2V0dGluZyBhbGwgY29sdW1ucyBvbiBzdGF5IGFkbWluXG4gIHNldEhlYWRlckNoZWNrQm94VmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMuaXNJbmNsdWRlZEFsbENvbHVtbnMuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICAvLyBzZXQgY2FsZW5kYXIgMiBPciA0IGRpZ2l0IHllYXIgZm9ybWF0XG4gIGNhbGVuZGFySW5wdXRWYWx1ZShjb2x1bW46IGFueSwgcm93OiBhbnkpIHtcbiAgICBpZighY29sdW1uLnRpbWVPbmx5KXtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY29sdW1uLmZpZWxkICsgcm93W3RoaXMuZGF0YUtleV0pWzBdPy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsICh2YWw6IGFueSkgPT4ge1xuICAgICAgaWYgKCF2YWw/LnRhcmdldD8udmFsdWU/LmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgaWYgKHZhbD8udGFyZ2V0Py52YWx1ZT8ubGVuZ3RoID09IDggfHwgY29sdW1uPy5mb3JtYXQ/LnR5cGUgPT09IEVHcmlkRm9ybWF0VHlwZS5TSE9SVERBVEUpIHtcbiAgICAgICAgICB2YWwudGFyZ2V0LnZhbHVlID0gdmFsPy50YXJnZXQ/LnZhbHVlPy5yZXBsYWNlKC8oXFxkezJ9KShcXGR7Mn0pKFxcZHs0fSkvLCAnJDEvJDIvJDMnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWw/LnRhcmdldD8udmFsdWU/Lmxlbmd0aCA9PSA2KSB7XG4gICAgICAgICAgdmFsLnRhcmdldC52YWx1ZSA9IHZhbD8udGFyZ2V0Py52YWx1ZT8ucmVwbGFjZSgvKFxcZHsyfSkoPz1cXGQpL2csICckMS8nKTtcbiAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IHZhbC50YXJnZXQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHllYXIgPSB2YWw/LnRhcmdldD8udmFsdWU/LnRvU3RyaW5nKCk/LnNwbGl0KCcvJylbMl07XG4gICAgICBpZiAoeWVhciAmJiB5ZWFyLmxlbmd0aCA9PSA0KSB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJGb3JtYXQgPSAnbW0vZGQveXknO1xuICAgICAgICByb3dbY29sdW1uLmZpZWxkXSA9IG5ldyBEYXRlKHZhbD8udGFyZ2V0Py52YWx1ZSk/LnRvTG9jYWxlRGF0ZVN0cmluZyhcImVuLVVTXCIpO1xuICAgICAgfSBlbHNlIGlmICh5ZWFyICYmIHllYXIubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJGb3JtYXQgPSAnbW0vZGQveSc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgfVxuICAgIFxuICB9XG4gIGNoYW5nZVBhc3N3b3JkVHlwZShjb2x1bW4sIHJvdyl7XG4gICAgdmFyIHRleHRUeXBlPXJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8ocm93W2NvbHVtbi5maWVsZCsnX29iaiddLnRleHRUeXBlPT0ncGFzc3dvcmQnPyd0ZXh0JzoncGFzc3dvcmQnKTpjb2x1bW4udGV4dFR5cGU9PSdwYXNzd29yZCc/J3RleHQnOidwYXNzd29yZCc7XG4gICAgdGhpcy5ncmlkU2VydmljZS5zZXRHcmlkUm93UHJvcFZhbHVlKHJvdywgW3twcm9wTmFtZTpFR3JpZFJvd1Byb3BOYW1lLlRFWFRUWVBFLCBwcm9wVmFsdWU6dGV4dFR5cGUsIGZpZWxkOmNvbHVtbi5maWVsZH1dKTtcbiAgIFxuICB9XG5cbiAgc2hvd0NvbmZpcm1hdGlvbihldmVudDogSUdyaWRQYWdpbmF0aW9uRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuUGFnZUNoYW5nZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IGV2ZW50LmZpcnN0IC8gZXZlbnQucm93cztcbiAgICB9XG4gICAgaWYgKGNvbmZpcm0oXCJZb3Ugd2lsbCBsb3NlIGNoYW5nZXMgbm90IHNhdmVkIG9uIHBhZ2UuIFdvdWxkIHlvdSBsaWtlIHRvIGNvbnRpbnVlP1wiKSA9PSB0cnVlKSB7XG4gICAgICB0aGlzLmhhbmRsZVNlcnZlclNpZGVQYWdpbmF0aW9uKGV2ZW50KTtcbiAgICAgIHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLlBhZ2VDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMudGFibGUuZmlyc3QgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGFibGUuZmlyc3QgPSBNYXRoLmZsb29yKHRoaXMuY3VycmVudFBhZ2UgLyBldmVudC5yb3dzKTtcbiAgICAgICAgICAgIHRoaXMudGFibGUucm93cyA9IGV2ZW50LnJvd3M7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxufSIsIjxkaXYgY2xhc3M9XCJncmlkLWNvbXBvbmVudC13cmFwcGVyXCI+XG48cC1jb25maXJtRGlhbG9nIFtzdHlsZV09XCJ7IHdpZHRoOiAnNTB2dycgfVwiICpuZ0lmPVwidXNlSW5saW5lQ1JVRFwiIGtleT1cImhhbmRsZUlubGluZUNSVURcIj48L3AtY29uZmlybURpYWxvZz5cbjxwLWNvbmZpcm1EaWFsb2cgY2xhc3M9XCJncmlkLWNvbXBvbmVudC1jb25maXJtLWRpYWxvZ1wiICpuZ0lmPVwiY29sdW1uQWN0aW9ucy5sZW5ndGggPiAwXCJcbiAga2V5PVwiaGFuZGxlY29sdW1uQWN0aW9uc1wiPjwvcC1jb25maXJtRGlhbG9nPlxuPGRpdiBjbGFzcz1cImdsb2JhbC1maWx0ZXItYnV0dG9ucy13cmFwcGVyXCI+XG5cbiAgPCEtLSBidXR0b24gZm9yIGFwcGx5IHZhbHVlIG9uIEdyaWQgLS0+XG4gIDxidXR0b24gKm5nSWY9XCIoKGZpbHRlcmluZyAmJiAhaGlkZUZpbHRlciApIHx8IHNob3dGaWx0ZXJidG4pXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLXNlYXJjaFwiIChjbGljayk9XCJhcHBseUdyaWRGaWx0ZXJCdG4oKVwiXG4gICAgW2NsYXNzXT1cIlxuICBzZWFyY2hHcmlkRmlsdGVyID8gJ3AtYnV0dG9uLXN1Y2Nlc3MgYXBwbHktZmlsdGVyLWJ0biBmaWx0ZXItYnRuJyA6ICdoaWRlLWNsZWFyLWZpbHRlci1idXR0b24gYXBwbHktZmlsdGVyLWJ0biBmaWx0ZXItYnRuJ1xuICBcIj48L2J1dHRvbj5cblxuICA8IS0tIGJ1dHRvbiBmb3IgY2xlYXIgdmFsdWUgb24gR3JpZCAtLT5cbiAgPGJ1dHRvbiAqbmdJZj1cIigoZmlsdGVyaW5nICYmICFoaWRlRmlsdGVyICl8fCBzaG93RmlsdGVyYnRuKVwiIHBCdXR0b24gaWQ9XCJjbGVhckdyaWRGaWx0ZXJWYWx1ZXNCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCJcbiAgICBpY29uPVwicGkgcGktcmVwbGF5XCIgKGNsaWNrKT1cImNsZWFyZ3JpZEZpbHRlcnNWYWx1ZSgpXCIgW2NsYXNzXT1cIlxuICAgICAgY2xlYXJHcmlkRmlsdGVyID8gJ2ZpbHRlci1idG4nIDogJ2hpZGUtY2xlYXItZmlsdGVyLWJ1dHRvbiBmaWx0ZXItYnRuJ1xuICAgICAgXCIgY2xhc3M9J2dsb2JhbC1yZWZyZXNoIGdsb2JhbC1idG4nXG4gICAgPjwvYnV0dG9uPlxuXG4gIDwhLS0gYnV0dG9uIGZvciBzYXZlIGFsbCBncmlkIGF0IG9uY2UgLS0+XG4gIDxidXR0b24gcEJ1dHRvbiAqbmdJZj1cImVkaXRBbGxSb3dzICYmIGVkaXRSb3dQZXJtaXNzaW9uXCIgaWQ9XCJzYXZlQWxsR3JpZFZhbHVlc1wiXG4gICAgaWNvbj1cInBpIHBpLWNoZWNrXCIgW2xhYmVsXT1cIidTYXZlJ1wiXG4gICAgW2NsYXNzXT1cImhpZGVHcmlkU2F2ZUJ1dHRvbiA/ICdoaWRlLWNsZWFyLWZpbHRlci1idXR0b24gc2F2ZS1hbGwtZ3JpZCcgOiAndWktYnV0dG9uLWluZm8gc2F2ZS1hbGwtZ3JpZCdcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwic2F2ZUFsbFJvd3NBdE9uY2UoKVwiPjwvYnV0dG9uPlxuXG4gIDwhLS0gYnV0dG9uIGZvciBjYW5jZWwgYWxsIGdyaWQgYXQgb25jZSAtLT5cbiAgPGJ1dHRvbiBwQnV0dG9uICpuZ0lmPVwiZWRpdEFsbFJvd3MgJiYgIWhpZGVHcmlkQ2FuY2VsQnV0dG9uXCIgaWQ9XCJlZGl0QnRuR2xvYmFsdmFsdWVzXCIgdHlwZT1cImJ1dHRvblwiIFtsYWJlbF09XCInQ2FuY2VsJ1wiXG4gICAgaWNvbj1cInBpIHBpLXRpbWVzXCIgY2xhc3M9XCJ1aS1idXR0b24taW5mb1wiIChjbGljayk9XCJjYW5jZWxBbGxSb3dzQXRPbmNlKClcIj48L2J1dHRvbj5cblxuICA8IS0tIGhlYWRlciBCdXR0b24gZm9yIG11bHRpU2VsZWN0IG9uIEdyaWQgLS0+XG4gIDxzcGFuICpuZ0lmPVwiYWxsb3dDb2x1bW5Ub2dnbGVcIiBvYnNlcnZlQ2hlY2tib3g+XG4gICAgPHAtbXVsdGlTZWxlY3QgIFtzaG93VG9nZ2xlQWxsXT1cImZhbHNlXCIgb3B0aW9uRGlzYWJsZWQ9XCJmYWxzZVwiIFtvcHRpb25zXT1cInNlbGVjdGVkVG9nZ2xlQ29sdW1uc1wiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRDb2x1bW5zXCIgb3B0aW9uTGFiZWw9XCJoZWFkZXJcIlxuICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IGNvbHVtbnMgc2VsZWN0ZWRcIiAgY2xhc3M9XCJncmlkLWNvbXBvbmVudC1tdWx0aXNlbGVjdC1oZWFkZXItYnV0dG9uXCIgcGxhY2Vob2xkZXI9XCJDaG9vc2UgQ29sdW1uc1wiPlxuICAgIDwvcC1tdWx0aVNlbGVjdD5cbiAgPC9zcGFuPlxuXG4gIDwhLS0gaGVhZGVyIEJ1dHRvbiBmb3IgQWRkaW5nIG5ldyBSb3cgb24gR3JpZCAtLT5cbiAgPGJ1dHRvbiBwQnV0dG9uICpuZ0lmPVwidXNlSW5saW5lQ1JVRCAmJiBhZGRSb3dQZXJtaXNzaW9uICYmICFoaWRlQWRkQnRuXCIgdHlwZT1cImJ1dHRvblwiIFtsYWJlbF09XCInQWRkJ1wiIHBBZGRSb3dcbiAgICBbdGFibGVdPVwiY29tcG9uZW50VGFibGVSZWZcIiBbbmV3Um93XT1cIm5ld0dyaWRSb3dcIiBbaWRdPVwiZGF0YUtleVwiIHBUb29sdGlwPVwiQWRkIE5ldyBSb3dcIiB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgIGljb249XCJwaSBwaS1wbHVzXCIgW2NsYXNzXT1cIid1aS1idXR0b24taW5mbyBnbG9iYWwtYWRkLWJ0bicrZ3JpZE5hbWVcIiAoY2xpY2spPVwiYWRkTmV3Um93KG5ld0dyaWRSb3csIHRydWUpXCIgcFJpcHBsZT48L2J1dHRvbj5cblxuICAgIFxuICA8IS0tIGhlYWRlciBCdXR0b24gZm9yIEV4Y2VsIEZpbGUgb24gR3JpZCAtLT5cbiAgPGJ1dHRvbiAqbmdJZj1cImFsbG93RXhwb3J0VG9FeGNlbFwiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGljb249XCJwaSBwaS1maWxlLWV4Y2VsXCIgKGNsaWNrKT1cImV4cG9ydEV4Y2VsKClcIlxuICBjbGFzcz1cInAtYnV0dG9uLXN1Y2Nlc3NcIiBwVG9vbHRpcD1cIkV4cG9ydCB0byBFeGNlbFwiIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiIHBSaXBwbGU+PC9idXR0b24+XG5cbjwhLS0gaGVhZGVyIEJ1dHRvbiBmb3IgUERGIEZpbGUgb24gR3JpZCAtLT5cbjxidXR0b24gKm5nSWY9XCJhbGxvd0V4cG9ydFRvUGRmXCIgdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gaWNvbj1cInBpIHBpLWZpbGUtcGRmXCIgKGNsaWNrKT1cImV4cG9ydFBkZigpXCJcbiAgY2xhc3M9XCJwLWJ1dHRvbi13YXJuaW5nIG1yLTIgbWwtMlwiIHBUb29sdGlwPVwiRXhwb3J0IHRvIFBkZlwiIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiIHBSaXBwbGU+PC9idXR0b24+XG5cbiAgPCEtLSA8ZGl2ICpuZ0Zvcj1cImxldCByZXBvcnRCdXR0b24gb2YgcmVwb3J0QnV0dG9uc1wiIGNsYXNzPVwidWktYnV0dG9uLWluZm8gbXItMiBtbC0yXCI+XG4gICAgPHNlLWdlbmVyYXRlLXJlcG9ydC1idG4gKm5nSWYgPVwiIXJlcG9ydEJ1dHRvbi5oaWRkZW5cIltyZXBJZF09XCJyZXBvcnRCdXR0b24ucmVwb3J0SWRcIiBbbGFiZWxdPVwicmVwb3J0QnV0dG9uLmxhYmVsXCIgW3BhcmFtc109XCJyZXBvcnRCdXR0b24ucGFyYW1zXCJcbiAgICAgIFtzaG93RGlhbG9nXT1cInJlcG9ydEJ1dHRvbi5zaG93RGlhbG9nXCI+PC9zZS1nZW5lcmF0ZS1yZXBvcnQtYnRuPlxuICA8L2Rpdj4gLS0+XG5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG4gIDxuZy1jb250YWluZXIgICpuZ0Zvcj1cImxldCByZXBvcnRCdXR0b24gb2YgcmVwb3J0QnV0dG9uc1wiPlxuICAgIDxzZS1nZW5lcmF0ZS1yZXBvcnQtYnRuICpuZ0lmID1cIiFyZXBvcnRCdXR0b24uaGlkZGVuXCJbcmVwSW5mb109XCJyZXBvcnRCdXR0b25cIiBbbGFiZWxdPVwicmVwb3J0QnV0dG9uLmxhYmVsXCIgW3BhcmFtc109XCJyZXBvcnRCdXR0b24ucGFyYW1zXCIgW2ljb25dPVwicmVwb3J0QnV0dG9uLmljb25cIiBbY2xhc3NdPVwicmVwb3J0QnV0dG9uLmNsYXNzXCJcbiAgICBbc2hvd0RpYWxvZ109XCJyZXBvcnRCdXR0b24uc2hvd0RpYWxvZ1wiIFtyZXBvcnRUeXBlXT1cIiByZXBvcnRCdXR0b24ucmVwb3J0VHlwZVwiIFtyZXBvcnRIZWFkZXJdPVwicmVwb3J0QnV0dG9uLnJlcG9ydEhlYWRlclwiIFtyZXBvcnRGb290ZXJdPVwicmVwb3J0QnV0dG9uLnJlcG9ydEZvb3RlclwiPjwvc2UtZ2VuZXJhdGUtcmVwb3J0LWJ0bj5cbiAgPC9uZy1jb250YWluZXI+XG5cbjwvZGl2PlxuXG4gIDxwLXRhYmxlICpuZ0lmPVwiIWlzR3JpZEhpZGRlblwiIGlkPVwibXktdGFibGVcIiBbdmFsdWVdPVwicm93c0RhdGFcIiBbY29sdW1uc109XCJzZWxlY3RlZENvbHVtbnNcIiBzb3J0TW9kZT1cIm11bHRpcGxlXCJcbiAgICBbbGF6eV09XCJ1c2VTZXJ2ZXJTaWRlRXZlbnRzXCIgW3BhZ2luYXRvcl09XCJwYWdpbmF0aW9uXCIgW2Fsd2F5c1Nob3dQYWdpbmF0b3JdPVwicGFnaW5hdGlvbiAmJiB0b3RhbFJlY29yZHMgPiAwXCIgXG4gICAgW2NsYXNzXT1cIicgZ3JpZC1jb21wb25lbnQtbWFpbi10YWJsZSAnICsgKHBhZ2luYXRpb24gfHwgIXJvd3NEYXRhLmxlbmd0aCA/ICcgcGFnaW5hdGlvbiAnIDogJycpICsgKHRhYmxlU3R5bGUuaW5jbHVkZXMoJ3dpZHRoJykgPyAnIGhhc1RhYmxlV2lkdGhTdHlsZSAnIDogJycpICsgKGF1dG9SZXNpemUgPyAnJyA6ICd0YWJsZS1sYXlvdXQtYXV0bycpIFwiXG4gICAgKG9uQ29sUmVzaXplKT1cIm9uQ29sdW1uUmVzaXplKCRldmVudCxkdClcIiBbcmVzaXphYmxlQ29sdW1uc109XCJ0cnVlXCJcbiAgICAgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIGNvbHVtblJlc2l6ZU1vZGU9XCJleHBhbmRcIlxuICAgIFtyb3dzXT1cImRlZmF1bHRSb3dzXCIgW3RvdGFsUmVjb3Jkc109XCJ0b3RhbFJlY29yZHNcIiBbcm93c1BlclBhZ2VPcHRpb25zXT1cInNldFBhZ2luYXRpb25MZW5ndGhcIlxuICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwic2hvd0N1cnJlbnRQYWdlUmVwb3J0XCIgY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZT1cIlNob3dpbmcge2ZpcnN0fSB0byB7bGFzdH0gb2Yge3tcbiAgICAgIHRvdGFsUmVjb3Jkc1xuICAgIH19IGVudHJpZXNcIiBbbG9hZGluZ109XCIhc2V0R3JpZFJlZnJlc2hUaW1lID8gbG9hZGluZyA6IGZhbHNlXCJcbiAgICAob25Tb3J0KT1cInNvcnREaXNhYmxlZCA/PyBoYW5kbGVTb3J0Q2hhbmdlKCRldmVudClcIiAob25GaWx0ZXIpPVwiaGFuZGxlRmlsdGVyQ2hhbmdlKCRldmVudClcIlxuICAgIChvbkxhenlMb2FkKT1cImF1dG9Mb2FkRGF0YSA/IGhhbmRsZVNlcnZlclNpZGVFdmVudHMoJGV2ZW50LCBkdCkgOiAnJ1wiIChvblBhZ2UpPVwiZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA/IHNob3dDb25maXJtYXRpb24oJGV2ZW50KSA6IGhhbmRsZVNlcnZlclNpZGVQYWdpbmF0aW9uKCRldmVudClcIiAjZHRcbiAgICBbZGF0YUtleV09XCJkYXRhS2V5XCIgWyhzZWxlY3Rpb24pXT1cInNlbGVjdGVkUm93c1wiIHNlbGVjdGlvbk1vZGU9XCJtdWx0aXBsZVwiIFtzY3JvbGxhYmxlXT1cInNjcm9sbGFibGVcIiBcbiAgICBbdGFibGVTdHlsZV09XCJ0YWJsZVN0eWxlXCJcbiAgICBbc2Nyb2xsSGVpZ2h0XT1cInNjcm9sbEhlaWdodFwiXG4gICAgZWRpdE1vZGU9XCJyb3dcIiBbZWRpdGluZ1Jvd0tleXNdPVwiZWRpdGluZ1Jvd0tleXNcIiBbcm93SG92ZXJdPVwicm93SG92ZXJcIlxuICAgIFtuZ0NsYXNzXT1cInNldENsYXNzYUFuZElkKGR0KVwiPlxuXG4gICAgPGRpdiAqbmdJZj1cInJvd0FjdGlvbnMubGVuZ3RoID4gMCAmJiByb3dBY3Rpb25zLmxlbmd0aCA+IDBcIiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IHJvd0FjdGlvbiBvZiByb3dBY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b24gcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2xhYmVsXT1cInJvd0FjdGlvbi50aXRsZVwiIFtjbGFzc109XCJyb3dBY3Rpb24uY2xhc3NcIlxuICAgICAgICAgIChjbGljayk9XCJyb3dBY3Rpb24ub25DbGljayhzZWxlY3RlZFJvd3MpXCI+PC9idXR0b24+XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIGhlYWRlciBjb2x1bW5zIG9uIEdyaWQgLS0+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2xzPlxuICAgICAgPHRyPlxuICAgICAgICA8dGggcFJlc2l6YWJsZUNvbHVtbiAqbmdJZj1cImFsbG93U2VsZWN0aW9uICYmIHNlbGVjdGlvblR5cGUgPT09ICdtdWx0aXBsZSdcIiBjbGFzcz1cImdyaWQtY29tcG9uZW50LXNlbGVjdGlvblwiIGlkPVwie3thbGxvd1NlbGVjdGlvbkhlYWRlcn19XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aC1jb250ZW50LXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWNvbXBvbmVudC10YWJsZS1oZWFkZXItaW5uZXItZGl2LTJcbiAgICAgICAgICAgICAgICAgIHRhYmxlLWhlYWRlci1pbm5lci1kaXYgZGl2LWxhc3QtaW5uZXItaHRtbC1pcy1pY29uXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC1ncm93LTFcIj4ge3thbGxvd1NlbGVjdGlvbkhlYWRlcn19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveCAqbmdJZj1cInNlbGVjdGlvblR5cGUgPT09ICdtdWx0aXBsZSdcIiBiaW5hcnk9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibXVsdGlDaGVja0JveE9uY2xpY2socm93c0RhdGEsICRldmVudClcIj48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRoIHBSZXNpemFibGVDb2x1bW4gKm5nSWY9XCJhbGxvd1NlbGVjdGlvbiAmJiBzZWxlY3Rpb25UeXBlID09PSAnc2luZ2xlJ1wiIGlkPVwiU2VsZWN0XCJcbiAgICAgICAgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiIGNsYXNzPVwiZ3JpZC1jb21wb25lbnQtc2VsZWN0aW9uXCI+XG4gICAgICAgICAgU2VsZWN0XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uIGlkPVwiQWN0aW9uc1wiXG4gICAgICAgICAgKm5nSWY9XCJzZXRBY3Rpb25Db2x1bW5Bc0ZpcnN0ICYmICFkaXNhYmxlZFNhdmVCdG4gJiYgY29sdW1ucz8ubGVuZ3RoID4gMCAmJiAoY29sdW1uQWN0aW9ucy5sZW5ndGggPiAwIHx8ICh1c2VJbmxpbmVDUlVEICYmIChkZWxldGVSb3dQZXJtaXNzaW9uIHx8IGVkaXRSb3dQZXJtaXNzaW9uKSkpXCJcbiAgICAgICAgICBbY2xhc3NdPVwiaW5FZGl0TW9kZSA/ICd0aHJlZS1hY3Rpb24tYnRuJyA6ICd0d28tYWN0aW9uLWJ0bicgXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiID5cbiAgICAgICAgICBBY3Rpb25zXG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sc1wiIFtzdHlsZS53aWR0aF09XCJjb2x1bW4/LmNvbHVtbldpZHRoID8gY29sdW1uPy5jb2x1bW5XaWR0aCsncHgnIDogY29sdW1uPy5jdXN0b21XaWR0aCsncHgnXCIgaWQ9XCJ7e2NvbHVtbi5oZWFkZXJ9fVwiIFtwU29ydGFibGVDb2x1bW5dPVwiY29sdW1uLmZpZWxkXCJcbiAgICAgICAgICBbY2xhc3NdPVwiY29sdW1uLnR5cGUgPT09ICdib29sZWFuJyA/ICdjaGVja2JveC10aCcgOiAnJ1wiXG4gICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbkRpc2FibGVkXT1cInNvcnREaXNhYmxlZCAmJiB1c2VTZXJ2ZXJTaWRlRXZlbnRzID8gdHJ1ZSA6IGNvbHVtbi5zb3J0aW5nID09PSBmYWxzZVwiXG4gICAgICAgICAgY2xhc3M9XCJjb2x1bW4/LnR5cGUgPT09ICdtdWx0aXBsZScgPyAnZ3JpZC1jb21wb25lbnQtc2VsZWN0LXRoLWNvbHVtbi10eXBlLW11bHRpcGxlJyA6ICcnXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aC1jb250ZW50LXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWNvbXBvbmVudC10YWJsZS1oZWFkZXItaW5uZXItZGl2LTEgdGFibGUtaGVhZGVyLWlubmVyLWRpdiBkaXYtbGFzdC1pbm5lci1odG1sLWlzLWljb25cIj4gICAgICAgIFxuICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5kYXRhLXRpdGxlLWVsZW1lbnRdPVwiJ3NlbGYnXCIgIFtjbGFzc109XCInZmxleC1ncm93LTEnXCIgPnt7IGNvbHVtbi5oZWFkZXIgfX1cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbHVtbi5pc1JlcXVpcmVkXCIgY2xhc3M9XCJncmlkLWNvbXBvbmVudCByZXF1aXJlZC1zdGFyXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8cC1zb3J0SWNvbiAqbmdJZj1cImNvbHVtbi5zb3J0aW5nICE9PSBmYWxzZSAmJiBjb2x1bW4/LnR5cGUgIT09ICdtdWx0aXBsZSdcIlxuICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2x1bW4uZmllbGRcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGggcFJlc2l6YWJsZUNvbHVtbiBpZD1cIkFjdGlvbnNcIlxuICAgICAgICAgICpuZ0lmPVwiIXNldEFjdGlvbkNvbHVtbkFzRmlyc3QgJiYgIWRpc2FibGVkU2F2ZUJ0biAmJiBjb2x1bW5zPy5sZW5ndGggPiAwICYmIChjb2x1bW5BY3Rpb25zLmxlbmd0aCA+IDAgfHwgKHVzZUlubGluZUNSVUQgJiYgKGRlbGV0ZVJvd1Blcm1pc3Npb24gfHwgZWRpdFJvd1Blcm1pc3Npb24pKSlcIlxuICAgICAgICAgIFtjbGFzc109XCJpbkVkaXRNb2RlID8gJ3RocmVlLWFjdGlvbi1idG4nIDogJ3R3by1hY3Rpb24tYnRuJ1wiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIiA+QWN0aW9uczwvdGg+XG4gICAgICA8L3RyPlxuICAgICAgPHRyICpuZ0lmPVwiZmlsdGVyaW5nICYmICFoaWRlRmlsdGVyXCI+XG4gICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uICpuZ0lmPVwiYWxsb3dTZWxlY3Rpb25cIiBbY2xhc3NdPVwiaW5FZGl0TW9kZSA/ICd0aHJlZS1hY3Rpb24tYnRuJyA6ICd0d28tYWN0aW9uLWJ0bidcIj48L3RoPlxuICAgICAgICA8dGggcFJlc2l6YWJsZUNvbHVtbiAqbmdJZj1cInNldEFjdGlvbkNvbHVtbkFzRmlyc3QgJiYgIWRpc2FibGVkU2F2ZUJ0biAmJiB1c2VJbmxpbmVDUlVEXCJcbiAgICAgICAgICBbY2xhc3NdPVwiaW5FZGl0TW9kZSA/ICd0aHJlZS1hY3Rpb24tYnRuJyA6ICd0d28tYWN0aW9uLWJ0bidcIj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRoIHBSZXNpemFibGVDb2x1bW4gKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2xzXCIgW3N0eWxlLndpZHRoXT1cImNvbHVtbj8uY29sdW1uV2lkdGggPyBjb2x1bW4/LmNvbHVtbldpZHRoKydweCcgOiBjb2x1bW4/LmN1c3RvbVdpZHRoKydweCdcIiBpZD1cInt7Y29sdW1uLmhlYWRlcn19XCIgW25nU3dpdGNoXT1cImNvbHVtbj8uZmlsdGVyPy50eXBlXCIgXG4gICAgICAgICAgW2NsYXNzXT1cImhpZGVGaWx0ZXJPcHRpb25zID8gJ2hpZGUtdGFibGUtZmlsdGVyIHRlbXAnIDogJ3RlbXAnXCI+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb2x1bW4uZmlsdGVyaW5nICE9PSBmYWxzZVwiIFtjbGFzc109XCJjb2x1bW4uZmlsdGVyPy5zaG93RmlsdGVyID8gJycgOiAnaGlkZS1maWx0ZXItaWNvbidcIj5cbiAgICAgICAgICAgIDwhLS0gVGV4dCBpbnB1dCBvbiBIZWFkZXIgRm9yIEZpbHRlci0tPlxuICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyIGNsYXNzPVwibm8tZmlsdGVyLWljb25cIiBbdHlwZV09XCIndGV4dCdcIiBbZmllbGRdPVwiY29sdW1uLmZpZWxkXCIgKm5nU3dpdGNoQ2FzZT1cIidpbnB1dCdcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiIGxldC12YWx1ZSBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNvbHVtbi5maWx0ZXJWYWx1ZVwiIFtjbGFzc109XCJjb2x1bW4/LmZpZWxkPy50b0xvd2VyQ2FzZSgpXCIgKGtleXVwLmVudGVyKT1cImFwcGx5RW50ZXJFdmVudChmaWx0ZXIsICRldmVudCwgY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAoYmx1cik9XCJzZXRGaWx0ZXJGb2N1c091dChjb2x1bW4sIGZpbHRlciwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoa2V5dXApPVwicmVtb3ZpbmdGaWx0ZXJzKCRldmVudCwgY29sdW1uKTtiYWNrc3BhY2VFdmVudCgkZXZlbnQsIGNvbHVtbilcIiBwSW5wdXRUZXh0IC8+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3AtY29sdW1uRmlsdGVyPlxuXG4gICAgICAgICAgICA8IS0tIE51bWVyaWMgaW5wdXQgb24gSGVhZGVyIEZvciBGaWx0ZXItLT5cbiAgICAgICAgICAgIDxwLWNvbHVtbkZpbHRlciBjbGFzcz1cIm5vLWZpbHRlci1pY29uXCIgW3R5cGVdPVwiJ251bWVyaWMnXCIgW2ZpZWxkXT1cImNvbHVtbi5maWVsZFwiICpuZ1N3aXRjaENhc2U9XCInbnVtZXJpY19pbnB1dCdcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiIGxldC12YWx1ZSBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIj5cbiAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBbKG5nTW9kZWwpXT1cImNvbHVtbi5maWx0ZXJWYWx1ZVwiIFtjbGFzc109XCJjb2x1bW4/LmZpZWxkPy50b0xvd2VyQ2FzZSgpXCIgKGtleXVwLmVudGVyKT1cImFwcGx5RW50ZXJFdmVudChmaWx0ZXIsICRldmVudCwgY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAob25CbHVyKT1cInNldEZpbHRlckZvY3VzT3V0KGNvbHVtbiwgZmlsdGVyLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJyZW1vdmluZ0ZpbHRlcnMoJGV2ZW50LCBjb2x1bW4pO2JhY2tzcGFjZUV2ZW50KCRldmVudCwgY29sdW1uKVwiPjwvcC1pbnB1dE51bWJlcj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XG5cbiAgICAgICAgICAgICAgPCEtLSBsb29rdXAgaW5wdXQgb24gSGVhZGVyIEZvciBGaWx0ZXItLT5cbiAgICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJuby1maWx0ZXItaWNvblwiXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgICBbZmllbGRdPVwiY29sdW1uLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2xvb2t1cF9pbnB1dCdcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICBwVGVtcGxhdGU9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgICAgICAgICBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbG9zZS1pY29uLXdyYXBwZXIgZ3JpZC1jb21wb25lbnQgbG9va3VwLWZpbHRlci13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb29rdXAtZmlsdGVyLWlucHV0LXdyYXBwZXJcIj4gXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJjb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkgKyAnX2ZpbHRlcidcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JpZC1jb21wb25lbnQgbG9va3VwLWZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW4uZmlsdGVyVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRGaWx0ZXJMb29rdXAoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImFwcGx5RW50ZXJFdmVudChmaWx0ZXIsICRldmVudCwgY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwic2V0RmlsdGVyRm9jdXNPdXQoY29sdW1uLCBmaWx0ZXIsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJyZW1vdmluZ0ZpbHRlcnMoJGV2ZW50LCBjb2x1bW4pO2JhY2tzcGFjZUV2ZW50KCRldmVudCwgY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgcElucHV0VGV4dFxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gIFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlyZWN0LXdyYXBwZXItY2xvc2UtaWNvbi1sb29rdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5maWx0ZXJWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibG9va3VwQ2xlYXJWYWx1ZShjb2x1bW4pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cblxuICAgICAgICAgICAgPCEtLSBjaGVja2JveCBvbiBIZWFkZXIgRm9yIEZpbHRlci0tPlxuICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyIGNsYXNzPVwibm8tZmlsdGVyLWljb25cIiB0eXBlPVwiYm9vbGVhblwiIFtmaWVsZF09XCJjb2x1bW4uZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ2NoZWNrYm94J1wiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZmlsdGVyXCIgbGV0LXZhbHVlIGxldC1maWx0ZXI9XCJmaWx0ZXJDYWxsYmFja1wiPlxuICAgICAgICAgICAgICAgIDxwLWNoZWNrYm94IFtiaW5hcnldPVwidHJ1ZVwiIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWRcIiBbKG5nTW9kZWwpXT1cImNvbHVtbi5maWx0ZXJWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlFbnRlckV2ZW50KGZpbHRlciwgJGV2ZW50LCBjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJzZXRGaWx0ZXJGb2N1c091dChjb2x1bW4sIGZpbHRlciwgJGV2ZW50KVwiIChjbGljayk9XCJjbGlja0NoZWNrQm94RmlsdGVyKGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiYmFja3NwYWNlRXZlbnQoJGV2ZW50LCBjb2x1bW4pXCI+XG4gICAgICAgICAgICAgICAgPC9wLWNoZWNrYm94PlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cblxuICAgICAgICAgICAgPCEtLSBtdWx0aVNlbGVjdCBvbiBIZWFkZXIgRm9yIEZpbHRlci0tPlxuICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyIGNsYXNzPVwibm8tZmlsdGVyLWljb25cIiBbZmllbGRdPVwiY29sdW1uLmZpZWxkXCIgbWF0Y2hNb2RlPVwiaW5cIiBbc2hvd01lbnVdPVwiZmFsc2VcIiAqbmdTd2l0Y2hDYXNlPVwiJ211bHRpLXNlbGVjdCdcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiIGxldC12YWx1ZSBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIj5cbiAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCBbKG5nTW9kZWwpXT1cImNvbHVtbi5maWx0ZXJWYWx1ZVwiIFtvcHRpb25zXT1cImNvbHVtbi5maWx0ZXIuZGF0YSB8fCBbXVwiIFxuICAgICAgICAgICAgICAgIFthcHBlbmRUb109XCInYm9keSdcIiBbbmFtZV09XCJjb2x1bW4uZmllbGRcIlxuICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUVudGVyRXZlbnQoZmlsdGVyLCAkZXZlbnQsIGNvbHVtbilcIlxuICAgICAgICAgICAgICAgIFtvcHRpb25WYWx1ZV09XCJjb2x1bW4ub3B0aW9uVmFsdWVcIlxuICAgICAgICAgICAgICAgICBbb3B0aW9uTGFiZWxdPVwiY29sdW1uLm9wdGlvbkxhYmVsXCJcbiAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJzZXRGaWx0ZXJGb2N1c091dChjb2x1bW4sIGZpbHRlciwgJGV2ZW50KVwiIFxuICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiYmFja3NwYWNlRXZlbnQoJGV2ZW50LCBjb2x1bW4pXCI+XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3AtY29sdW1uRmlsdGVyPlxuXG4gICAgICAgICAgICA8IS0tIGRyb3Bkb3duIG9uIEhlYWRlciBGb3IgRmlsdGVyLS0+XG4gICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXIgY2xhc3M9XCJuby1maWx0ZXItaWNvblwiIFtmaWVsZF09XCJjb2x1bW4uZmllbGRcIiBtYXRjaE1vZGU9XCJpblwiIFtzaG93TWVudV09XCJmYWxzZVwiICpuZ1N3aXRjaENhc2U9XCInZHJvcGRvd24nXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmaWx0ZXJcIiBsZXQtdmFsdWUgbGV0LWZpbHRlcj1cImZpbHRlckNhbGxiYWNrXCI+XG4gICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW3Nob3dDbGVhcl09XCJ0cnVlXCIgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QnXCIgW2ZpbHRlcl09XCJjb2x1bW4uYWxsb3dTZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW4uZmlsdGVyVmFsdWVcIiAoa2V5dXAuZW50ZXIpPVwiYXBwbHlEcm9wZG93bkZpbHRlcihmaWx0ZXIsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiY29sdW1uLmZpbHRlci5kYXRhIHx8IFtdXCJcbiAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJzZWFyY2hEcm9wZG93bkZpbHRlcihmaWx0ZXIsICRldmVudCwgY29sdW1uKVwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XG5cbiAgICAgICAgICAgIDwhLS0gY2FsZW5kYXIgb24gSGVhZGVyIEZvciBGaWx0ZXItLT5cbiAgICAgICAgICAgIDxwLWNvbHVtbkZpbHRlciBjbGFzcz1cIm5vLWZpbHRlci1pY29uXCIgW2ZpZWxkXT1cImNvbHVtbi5maWVsZFwiIG1hdGNoTW9kZT1cImluXCIgW3Nob3dNZW51XT1cImZhbHNlXCIgKm5nU3dpdGNoQ2FzZT1cIidjYWxlbmRhcidcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiIGxldC12YWx1ZSBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIj5cbiAgICAgICAgICAgICAgICA8cC1jYWxlbmRhciBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdC1EYXRlJ1wiIFsobmdNb2RlbCldPVwiY29sdW1uLmZpbHRlclZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUVudGVyRXZlbnQoZmlsdGVyLCAkZXZlbnQsIGNvbHVtbilcIiBhcHBlbmRUbz1cImJvZHlcIiAob25TZWxlY3QpPVwic2VsZWN0RGF0ZShjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgIFtpbnB1dElkXT1cImNvbHVtbi5maWVsZFwiIGhvdXJGb3JtYXQ9XCIxMlwiIChrZXl1cC5iYWNrc3BhY2UpPVwicmVtb3ZlTnVsbENhbGVuZGFyKGNvbHVtbiwgZmlsdGVyLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIFtzaG93QnV0dG9uQmFyXT1cInRydWVcIiAob25DbG9zZSk9XCJzZXRGaWx0ZXJGb2N1c091dChjb2x1bW4sIGZpbHRlciwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJiYWNrc3BhY2VFdmVudCgkZXZlbnQsIGNvbHVtbilcIiAob25DbGVhckNsaWNrKT1cImJhY2tzcGFjZUV2ZW50KCRldmVudCwgY29sdW1uKVwiPlxuICAgICAgICAgICAgICAgIDwvcC1jYWxlbmRhcj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XG5cbiAgICAgICAgICAgIDwhLS0gRGVmYXVsdCBGaWx0ZXIgRm9yIEhlYWRlciAgLS0+XG4gICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXIgY2xhc3M9XCJuby1maWx0ZXItaWNvblwiIFt0eXBlXT1cIlxuICAgICAgICAgICAgICAgIGNvbHVtbi50eXBlICYmIGNvbHVtbi50eXBlICE9PSAnbGluaycgPyBjb2x1bW4udHlwZSA6ICd0ZXh0J1xuICAgICAgICAgICAgICBcIiBbZmllbGRdPVwiY29sdW1uLmZpZWxkXCIgZGlzcGxheT1cIm1lbnVcIiAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uXG4gICAgICAgICAgKm5nSWY9XCIhc2V0QWN0aW9uQ29sdW1uQXNGaXJzdCAmJiAhZGlzYWJsZWRTYXZlQnRuICYmIGNvbHVtbnM/Lmxlbmd0aCA+IDAgJiYgKGNvbHVtbkFjdGlvbnMubGVuZ3RoID4gMCB8fCAodXNlSW5saW5lQ1JVRCAmJiAoZGVsZXRlUm93UGVybWlzc2lvbiB8fCBlZGl0Um93UGVybWlzc2lvbikpKVwiXG4gICAgICAgICAgW2NsYXNzXT1cImluRWRpdE1vZGUgPyAndGhyZWUtYWN0aW9uLWJ0bicgOiAndHdvLWFjdGlvbi1idG4nXCI+PC90aD5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDwhLS0gQm9keSBjb2x1bW5zIG9uIEdyaWQgLS0+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93IGxldC1lZGl0aW5nPVwiZWRpdGluZ1wiIGxldC1yaT1cInJvd0luZGV4XCI+XG4gICAgICA8dHIgXG4gICAgICBbc3R5bGVdPVwicm93U3R5bGVcIlxuICAgICAgW25nQ2xhc3NdPVwicm93Py5oaWdobGlnaHRyb3cgPyAnaGlnaGxpZ2h0ZWQtcm93JyA6ICcnXCJcbiAgICAgICAgW2NsYXNzXT1cIndvcmRXcmFwID8gJ3Atc2VsZWN0YWJsZS1yb3cgd29yZFdyYXBUcnVlJyA6ICd3b3JkV3JhcEZhbHNlIHAtc2VsZWN0YWJsZS1yb3cnXCIgKGNsaWNrKT1cInNlbGVjdGVkUm93UmVjb3JkID0gcm93XCJcbiAgICAgICAgW3BFZGl0YWJsZVJvd109XCJyb3dcIiAjZ3JpZFJvdyBbaWRdPVwicm93W2RhdGFLZXldXCI+XG4gICAgICAgIDx0ZCAqbmdJZj1cImFsbG93U2VsZWN0aW9uXCIgY2xhc3M9XCJncmlkLWNvbXBvbmVudC1zZWxlY3Rpb25cIj5cbiAgICAgICAgICA8cC10YWJsZVJhZGlvQnV0dG9uIFt2YWx1ZV09XCJyb3dcIiAqbmdJZj1cInNlbGVjdGlvblR5cGUgPT09ICdzaW5nbGUnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJtdWx0aUNoZWNrQm94T25jbGljayhyb3cgLCAkZXZlbnQsIHRydWUpXCI+PC9wLXRhYmxlUmFkaW9CdXR0b24+XG4gICAgICAgICAgPHAtdGFibGVDaGVja2JveCBbdmFsdWVdPVwicm93XCIgKm5nSWY9XCJzZWxlY3Rpb25UeXBlID09PSAnbXVsdGlwbGUnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJtdWx0aUNoZWNrQm94T25jbGljayhyb3csICRldmVudClcIj48L3AtdGFibGVDaGVja2JveD5cbiAgICAgICAgPC90ZD5cblxuICAgICAgICA8IS0tIGZpcnN0IGFjdGlvbnMgY29sdW1uIC0tPlxuICAgICAgICA8dGQgKm5nSWY9XCJzZXRBY3Rpb25Db2x1bW5Bc0ZpcnN0ICYmIGNvbHVtbkFjdGlvbnMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWN0aW9uLWJ0blwiICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgY29sdW1uQWN0aW9uc1wiPlxuICAgICAgICAgICAgPGkgW3RpdGxlXT1cImFjdGlvbi50b29sdGlwXCIgW2NsYXNzXT1cImFjdGlvbi5pY29uXCIgKGNsaWNrKT1cImhhbmRsZUFjdGlvbkNsaWNrKCRldmVudCwgYWN0aW9uLCByb3cpXCI+PC9pPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkICpuZ0lmPVwic2V0QWN0aW9uQ29sdW1uQXNGaXJzdCAmJiB1c2VJbmxpbmVDUlVEICYmIChkZWxldGVSb3dQZXJtaXNzaW9uIHx8IGVkaXRSb3dQZXJtaXNzaW9uKVwiXG4gICAgICAgICAgW2NsYXNzXT1cImluRWRpdE1vZGUgPyAndGhyZWUtYWN0aW9uLWJ0bicgOiAndHdvLWFjdGlvbi1idG4nXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJkaXNhYmxlZFNhdmVCdG4gPyAnaGlkZS1jbGVhci1maWx0ZXItYnV0dG9uJyA6ICcnXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXRBY3Rpb25Db2x1bW5XaWR0aFwiPlxuICAgICAgICAgICAgPHNlLWdyaWQtcm93LWFjdGlvbnMgW2VkaXRpbmddPVwiZWRpdGluZ1wiIFtlZGl0Um93UGVybWlzc2lvbl09XCJlZGl0Um93UGVybWlzc2lvblwiXG4gICAgICAgICAgICAgIFtkZWxldGVSb3dQZXJtaXNzaW9uXT1cImRlbGV0ZVJvd1Blcm1pc3Npb25cIiBbaGlkZURlbGV0ZUJ0bl09XCJoaWRlRGVsZXRlQnRuXCIgW2hpZGVFZGl0QnRuXT1cImhpZGVFZGl0QnRuXCJcbiAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIiAob25Sb3dFZGl0SW5pdEJ0bik9XCJvblJvd0VkaXRJbml0KCRldmVudClcIiAoZGVsZXRlUmVjb3JkQnRuKT1cImRlbGV0ZVJlY29yZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9uUm93RWRpdFNhdmVCdG4pPVwib25Sb3dFZGl0U2F2ZSgkZXZlbnQpXCIgKG9uUm93RWRpdENhbmNlbEJ0bik9XCJvblJvd0VkaXRDYW5jZWwoJGV2ZW50LCByaSlcIlxuICAgICAgICAgICAgICBbZWRpdEFsbFJvd3NdPVwiZWRpdEFsbFJvd3NcIj5cbiAgICAgICAgICAgIDwvc2UtZ3JpZC1yb3ctYWN0aW9ucz5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG5cbiAgICAgICAgPCEtLSBHcmlkIFJvd3MgRGF0YSBCaW5kaW5ncyBTdGFydCAtLT5cbiAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2x1bW4gb2Ygc2VsZWN0ZWRDb2x1bW5zXCIgW25nU3dpdGNoXT1cImNvbHVtbi50eXBlXCIgW3N0eWxlXT1cImNvbHVtbi5zdHlsZSBcIiBcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwiKGNvbHVtbi5ob3ZlckRhdGEgJiYgY29sdW1uLmhvdmVyRGF0YS5jb21wb25lbnQpICYmIGFkZER5bmFtaWNQYW5lbE92ZXJsYXlDb21wb25lbnQoY29sdW1uLmhvdmVyRGF0YSwgb3ZlcmxheVBhbmVsLCAkZXZlbnQsIHJvdylcIlxuICAgICAgICAobW91c2VsZWF2ZSk9XCIoY29sdW1uLmhvdmVyRGF0YSAmJiBjb2x1bW4uaG92ZXJEYXRhLmNvbXBvbmVudCkgICYmIG1vdXNlTGVhdmVFdmVudChvdmVybGF5UGFuZWwpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGQtY29udGVudC13cmFwcGVyXCIgW3N0eWxlXT1cImNvbHVtbi5zdHlsZVwiPlxuXG4gICAgICAgICAgPCEtLSBCb29sZWFuIGNvbHVtbiBvbiBHcmlkIC0tPlxuICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInYm9vbGVhbidcIlxuICAgICAgICAgID5cbiAgICAgICAgPHRkICpuZ0lmPVwiIWVkaXRpbmcgJiYgcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LnNob3cgIT0gZmFsc2VcIj5cbiAgICAgICAgICA8cC1jaGVja2JveCBcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvbHVtbi5hbGxvd0VkaXQgPz8gdHJ1ZVwiIFtiaW5hcnldPVwidHJ1ZVwiIChjbGljayk9XCJvbkNsaWNrRXZlbnQoY29sdW1uLCByb3cpXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoZWNrQm94Q2hhbmdlRXZlbnQoJGV2ZW50LCBjb2x1bW4sIHJvdylcIiAoYmx1cik9XCJvbkZvY3VzT3V0RXZlbnQoY29sdW1uLCByb3cpXCIgXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cIiBcbiAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gJiZcbiAgICAgICAgICAgICAgKHJvd1tjb2x1bW4uZmllbGRdLnRvU3RyaW5nKCkgPT09ICcxJyB8fFxuICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnIHx8XG4gICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09PSAneSd8fFxuICAgICAgICAgICAgICAgICggcm93W2NvbHVtbi5maWVsZF0udGV4dCAmJiAocm93W2NvbHVtbi5maWVsZF0/LnRleHQ/LnRvU3RyaW5nKCkgPT09ICcxJyB8fFxuICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdPy50ZXh0Py50b1N0cmluZygpPy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScgfHxcbiAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXT8udGV4dD8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSA9PT0gJ3knKSkpXG4gICAgICAgICAgICAgICAgICA/IENoZWNrZWRcbiAgICAgICAgICAgICAgICAgIDogdW5DaGVja2VkXG4gICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgPC9wLWNoZWNrYm94PlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgKm5nSWY9XCJlZGl0aW5nXCI+XG4gICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICA8IS0tIGZvciBlZGl0IGNoZWNrQm94IC0tPlxuICAgICAgICAgICAgICA8cC1jaGVja2JveCAoY2xpY2spPVwib25DbGlja0V2ZW50KGNvbHVtbiwgcm93KVwiIChuZ01vZGVsQ2hhbmdlKT1cImNoZWNrQm94Q2hhbmdlRXZlbnQoJGV2ZW50LCBjb2x1bW4sIHJvdylcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpXCIgW2JpbmFyeV09XCJ0cnVlXCIgWyhuZ01vZGVsKV09XCJcbiAgICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0gJiYgICBcbiAgICAgICAgICAgICAgICAgICAgKHJvd1tjb2x1bW4uZmllbGRdLnRvU3RyaW5nKCkgPT09ICcxJyB8fFxuICAgICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09PSAneScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAoIHJvd1tjb2x1bW4uZmllbGRdLnRleHQgJiYgKHJvd1tjb2x1bW4uZmllbGRdPy50ZXh0Py50b1N0cmluZygpID09PSAnMScgfHxcbiAgICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXT8udGV4dD8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF0/LnRleHQ/LnRvU3RyaW5nKCk/LnRvTG93ZXJDYXNlKCkgPT09ICd5JykpKVxuICAgICAgICAgICAgICAgICAgICAgID8gZWRpdE1vZGVDaGVja2VkXG4gICAgICAgICAgICAgICAgICAgICAgOiBlZGl0TW9kZXVuQ2tlY2tlZFxuICAgICAgICAgICAgICAgICAgXCIgKGJsdXIpPVwib25Gb2N1c091dEV2ZW50KGNvbHVtbiwgcm93KVwiPjwvcC1jaGVja2JveD5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgIHt7IHJvd1tjb2x1bW4uZmllbGRdIH19XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPCEtLSBsaW5rIGNvbHVtbiBvbiBHcmlkIC0tPlxuICAgICAgICA8c3BhbiBbYXR0ci5kYXRhLXRpdGxlLWVsZW1lbnRdPVwiY29sdW1uLmhvdmVyRGF0YSA/IG51bGwgOiAnYSxpbnB1dCdcIiAgKm5nU3dpdGNoQ2FzZT1cIidsaW5rJ1wiPlxuICAgICAgICAgIDwhLS0gbGluayBjb2x1bW4gZm9yIEh5cGVyTGluayBDYXNlIC0tPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sdW1uLmFsbG93U2F2ZSA9PT0gZmFsc2VcIj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sdW1uLnRhcmdldCAhPT0gJ19zZWxmJ1wiIFtzdHlsZV09XCJjb2x1bW4uc3R5bGVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10aXRsZS1lbGVtZW50XT1cImNvbHVtbi5ob3ZlckRhdGEgPyBudWxsIDogJ2EnXCJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLWxpbmtcIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KSA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXCI+XG5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwiZC1pbmxpbmVcIiBbaHJlZl09XCJjb2x1bW4uZGlzYWJsZWQ/Jyc6cm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/Lmh5cGVybGlua1wiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiY29sdW1uLmljb24gJiYhcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5oaWRlRmllbGRWYWx1ZTsgZWxzZSBub0ljb25cIiBbY2xhc3NdPVwiY29sdW1uLmljb25cIiBbdGl0bGVdPVwiY29sdW1uLmhlYWRlclwiPjwvaT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vSWNvbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJjb2x1bW4/Lm9uQ2xpY2sgPyBvbkNsaWNrRXZlbnQoY29sdW1uLCByb3cpIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmhpZGVGaWVsZFZhbHVlPycnOlxuICAgICAgICAgICAgICAgICAgICAgIHNldENvbmRpdGlvbkJhc2VWYWx1ZShyb3csIGNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgIFxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb2x1bW4udGFyZ2V0ID09PSAnX3NlbGYnXCIgW3N0eWxlXT1cImNvbHVtbi5zdHlsZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRpdGxlLWVsZW1lbnRdPVwiY29sdW1uLmhvdmVyRGF0YSA/IG51bGwgOiAnYSdcIiBjbGFzcz1cImN1c3RvbS1saW5rXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cIiBhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcIj5cblxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImQtaW5saW5lXCIgW2hyZWZdPVwiY29sdW1uLmRpc2FibGVkPycnOnJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5oeXBlcmxpbmtcIiBbdGFyZ2V0XT0nY29sdW1uLnRhcmdldCc+XG4gICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiFyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmhpZGVGaWVsZFZhbHVlOyBlbHNlIG5vSWNvblwiIFtjbGFzc109XCJjb2x1bW4uaWNvblwiIFt0aXRsZV09XCJjb2x1bW4uaGVhZGVyXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JY29uPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cImNvbHVtbj8ub25DbGljayA/IG9uQ2xpY2tFdmVudChjb2x1bW4sIHJvdykgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaGlkZUZpZWxkVmFsdWU/Jyc6XG4gICAgICAgICAgICAgICAgICAgICAgc2V0Q29uZGl0aW9uQmFzZVZhbHVlKHJvdywgY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2E+XG5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPCEtLSBsaW5rIGNvbHVtbiBmb3IgRWRpdCBDYXNlIC0tPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sdW1uLmFsbG93U2F2ZSB8fCBjb2x1bW4uYWxsb3dTYXZlID09PSB1bmRlZmluZWRcIj5cbiAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIihjb2x1bW4uZWRpdGFibGUgPT09IHRydWUgKSAmJiAoY29sdW1uLmVkaXRMaW5rID09PSB0cnVlIClcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIiFyb3cuaXNOZXdcIiBwSW5wdXRUZXh0IChjbGljayk9XCJjb2x1bW4/Lm9uQ2xpY2sgPyBvbkNsaWNrRXZlbnQoY29sdW1uLCByb3cpIDogJydcIiB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJyb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkrJ19vYmonXT8uZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5oaWRlRmllbGRWYWx1ZSA/ICcnIDogcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlUZXh0ID8gcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/LmRpc3BsYXlUZXh0IDogY29sdW1uLmRpc3BsYXlUZXh0ID8gY29sdW1uLmRpc3BsYXlUZXh0IDogcm93W2NvbHVtbi5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25Gb2N1c091dEV2ZW50KGNvbHVtbiwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2VFdmVudChjb2x1bW4sIHJvdylcIiAvPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgKm5nSWY9XCJyb3cuaXNOZXdcIiB0eXBlPVwidGV4dFwiIChjbGljayk9XCJjb2x1bW4/Lm9uQ2xpY2sgPyBvbkNsaWNrRXZlbnQoY29sdW1uLCByb3cpIDogJydcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwicm93W2NvbHVtbi5maWVsZC50b0xvd2VyQ2FzZSgpKydfb2JqJ10/LmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5JyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmRpc3BsYXlGaWVsZCA/IHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uZGlzcGxheUZpZWxkIDogcm93W2NvbHVtbi5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25Gb2N1c091dEV2ZW50KGNvbHVtbiwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2VFdmVudChjb2x1bW4sIHJvdylcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8IS0tIDxzcGFuICpuZ0lmPVwiY29sdW1uLmVkaXRhYmxlID09PSBmYWxzZXx8IGNvbHVtbi5lZGl0YWJsZSA9PT0gdW5kZWZpbmVkXCIgPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiY3VzdG9tLWxpbmtcIiAoY2xpY2spPVwib25DbGlja0V2ZW50KGNvbHVtbiwgcm93KVwiIFtocmVmXT1cInJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5oeXBlcmxpbmtcIiBbdGFyZ2V0XT0nY29sdW1uLnRhcmdldCdcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcIj5cbiAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiY29sdW1uLmljb24gJiYgIXJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaGlkZUZpZWxkVmFsdWU7IGVsc2Ugbm9JY29uXCJbY2xhc3NdPVwiY29sdW1uLmljb25cIiBbdGl0bGVdPVwiY29sdW1uLmhlYWRlclwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JY29uPlxuICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5oaWRlRmllbGRWYWx1ZT8nJzpcbiAgICAgICAgICAgICAgICAgICAgc2V0Q29uZGl0aW9uQmFzZVZhbHVlKHJvdywgY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9zcGFuPiAtLT5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIihjb2x1bW4uZWRpdExpbmsgPT09IGZhbHNlfHwgY29sdW1uLmVkaXRMaW5rID09PSB1bmRlZmluZWQpJiYoY29sdW1uLmVkaXRhYmxlID09PSBmYWxzZXx8IGNvbHVtbi5lZGl0YWJsZSA9PT0gdW5kZWZpbmVkKVwiPlxuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkLWlubGluZVwiIFtocmVmXT1cInJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5oeXBlcmxpbmtcIiBbdGFyZ2V0XT1cImNvbHVtbi50YXJnZXQgPyBjb2x1bW4udGFyZ2V0IDogJ19ibGFuaydcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sdW1uLmVkaXRhYmxlID09PSBmYWxzZSA/ICcnIDogYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KSA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiY29sdW1uLmljb24gJiYgIXJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaGlkZUZpZWxkVmFsdWU7IGVsc2Ugbm9JY29uXCJbY2xhc3NdPVwiY29sdW1uLmljb25cIiBbdGl0bGVdPVwiY29sdW1uLmhlYWRlclwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0ljb24+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cImNvbHVtbj8ub25DbGljayA/IG9uQ2xpY2tFdmVudChjb2x1bW4sIHJvdykgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaGlkZUZpZWxkVmFsdWU/Jyc6XG4gICAgICAgICAgICAgICAgICAgICAgc2V0Q29uZGl0aW9uQmFzZVZhbHVlKHJvdywgY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPiBcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGVdPVwiY29sdW1uLnN0eWxlXCIgIGNsYXNzPVwiY3VzdG9tLWxpbmtcIiAgW2NsYXNzXT1cImNvbHVtbi5lZGl0YWJsZSA9PT0gZmFsc2UgfHwgYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KSA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImQtaW5saW5lXCIgW2hyZWZdPVwiY29sdW1uLmRpc2FibGVkPycnOnJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5oeXBlcmxpbmtcIiBbdGFyZ2V0XT1cImNvbHVtbi50YXJnZXQgPyBjb2x1bW4udGFyZ2V0IDogJ19ibGFuaydcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjb2x1bW4uaWNvbiYmICFyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmhpZGVGaWVsZFZhbHVlOyBlbHNlIG5vSWNvblwiIFt0aXRsZV09XCJjb2x1bW4uaGVhZGVyXCIgW2NsYXNzXT1cImNvbHVtbi5pY29uXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vSWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAoY2xpY2spPVwiY29sdW1uPy5vbkNsaWNrID8gb25DbGlja0V2ZW50KGNvbHVtbiwgcm93KSA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaGlkZUZpZWxkVmFsdWU/Jyc6XG4gICAgICAgICAgICAgICAgICAgICAgc2V0Q29uZGl0aW9uQmFzZVZhbHVlKHJvdywgY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvYT5cblxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDwhLS0gSWZyYW1lIGNvbHVtbiBvbiBHcmlkIC0tPlxuICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2lmcmFtZSdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1c3RvbS1saW5rXCIgKGNsaWNrKT1cImdyaWRJRnJhbWUoY29sdW1uLCByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uaHlwZXJsaW5rLCByb3cpXCIgW3RpdGxlXT1cIlxuICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddICYmXG4gICAgICAgICAgICAgICAgKHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLmRpc3BsYXlUZXh0ID09PSBudWxsIHx8IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLmRpc3BsYXlUZXh0ID09PSAnJylcbiAgICAgICAgICAgICAgICAgID8gcm93W2NvbHVtbi5maWVsZF0gOiByb3dbY29sdW1uLmZpZWxkICsgJ19vYmonXT8uZGlzcGxheVRleHRcbiAgICAgICAgICAgICAgICAgID8gcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10uZGlzcGxheVRleHRcbiAgICAgICAgICAgICAgICAgIDogY29sdW1uLmRpc3BsYXlUZXh0XG4gICAgICAgICAgICAgICAgICA/IGNvbHVtbi5kaXNwbGF5VGV4dFxuICAgICAgICAgICAgICAgICAgOiByb3dbY29sdW1uLmZpZWxkXVxuXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+ICBcbiAgICAgICAgICAgIDxpICpuZ0lmPVwiY29sdW1uLmljb247IGVsc2Ugbm9JY29uXCJbY2xhc3NdPVwiY29sdW1uLmljb25cIiBbdGl0bGVdPVwiY29sdW1uLmhlYWRlclwiPjwvaT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JY29uPlxuICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10gJiZcbiAgICAgICAgICAgICAgKHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLmRpc3BsYXlUZXh0ID09PSBudWxsIHx8IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLmRpc3BsYXlUZXh0ID09PSAnJylcbiAgICAgICAgICAgICAgPyByb3dbY29sdW1uLmZpZWxkXSA6IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddPy5kaXNwbGF5VGV4dFxuICAgICAgICAgICAgICA/IHJvd1tjb2x1bW4uZmllbGQgKyAnX29iaiddLmRpc3BsYXlUZXh0XG4gICAgICAgICAgICAgIDogY29sdW1uLmRpc3BsYXlUZXh0ID8gY29sdW1uLmRpc3BsYXlUZXh0IDogcm93W2NvbHVtbi5maWVsZF1cbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgIDwhLS0gZGlhbG9nIGNvbHVtbiBvbiBHcmlkIC0tPlxuICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZGlhbG9nJ1wiPlxuICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uPy5maWx0ZXI/LnR5cGUgIT09ICdjYWxlbmRhcicgJiYgIXJvdz8uaGlkZWdyaWRidG5cIiBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sdW1uLmVkaXRhYmxlID09PSB0cnVlICYmICFyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmhpZGVGaWVsZFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbYXR0ci5kYXRhLXRpdGxlLWVsZW1lbnRdPVwiY29sdW1uLmhvdmVyRGF0YSA/IG51bGwgOiAnc2VsZidcIlxuICAgICAgICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJyb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkrJ19vYmonXT8uZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpID8gJ2hpZGUtYm9yZGVyJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgcElucHV0VGV4dFxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RMb29rdXBGaWVsZChjb2x1bW4sIHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5RmllbGQgP1xuICAgICAgICAgICAgICAgICAgICAgIHJvd1tyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV0gOiBcbiAgICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkXVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwicm93W2NvbHVtbi5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJvbkZvY3VzT3V0RXZlbnQoY29sdW1uLCByb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5kYXRhLXRpdGxlLWVsZW1lbnRdPVwiY29sdW1uLmhvdmVyRGF0YSA/IG51bGwgOiAnc2VsZidcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5lZGl0YWJsZSA9PT0gZmFsc2UgfHwgY29sdW1uLmVkaXRhYmxlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgXCIgY2xhc3M9XCJjdXN0b20tbGlua1wiIFtzdHlsZV09XCJjb2x1bW4uc3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgIGFsbG93RGlzYWJsZWQoY29sdW1uLHJvdykgPyAnZGlzYWJsZWQtbGluaycgOiAnJ1xuICAgICAgICAgICAgICAgICAgICBcIiAoY2xpY2spPVwib3BlbkdyaWREaWFsb2coY29sdW1uLCByb3csICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiKGNvbHVtbi5pY29uIHx8IHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaWNvbikgJiYgIXJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaGlkZUZpZWxkVmFsdWUgOyBlbHNlIG5vSWNvblwiXG4gICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cInJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaWNvbiA/IHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaWNvbiA6IGNvbHVtbi5pY29uXCIgW3RpdGxlXT1cImNvbHVtbi5oZWFkZXJcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vSWNvbj57eyAoIWNvbHVtbi5kaXNwbGF5VGV4dCAmJiByb3cuaXNOZXcgKSB8fCByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmhpZGVGaWVsZFZhbHVlID8gJycgOiBzZXRDb25kaXRpb25CYXNlVmFsdWUocm93LCBjb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgIH19PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb2x1bW4/LmZpbHRlcj8udHlwZSA9PT0gJ2NhbGVuZGFyJyAmJiBjb2x1bW4uZWRpdGFibGUgPT09IHRydWVcIiBbYXR0ci5kYXRhLXRpdGxlLWVsZW1lbnRdPVwiY29sdW1uLmhvdmVyRGF0YSA/IG51bGwgOiAnaW5wdXQnXCI+XG4gICAgICAgICAgICAgICAgPHAtY2FsZW5kYXIgW2NsYXNzXT1cInJvd1tjb2x1bW4uZmllbGQudG9Mb3dlckNhc2UoKSsnX29iaiddPy5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICBbaWRdPVwiYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KSA/ICdoaWRlLWJvcmRlcicgOiAnJ1wiIChvbkNsb3NlKT1cIm9uRm9jdXNPdXRFdmVudChjb2x1bW4sIHJvdylcIlxuICAgICAgICAgICAgICAgICAgW21pbkRhdGVdPVwiY29sdW1uLm1pbkRhdGVcIiBbbWF4RGF0ZV09XCJjb2x1bW4ubWF4RGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwiJ2JvZHknXCIgaG91ckZvcm1hdD1cIjEyXCIgW3Nob3dUaW1lXT1cImNvbHVtbi5zaG93VGltZVwiIChjbGljayk9XCJvbkNsaWNrRXZlbnQoY29sdW1uLCByb3cpXCJcbiAgICAgICAgICAgICAgICAgIFt0aW1lT25seV09XCJjb2x1bW4udGltZU9ubHlcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmRpc3BsYXlGaWVsZCA/XG4gICAgICAgICAgICAgICAgICAgIHJvd1tyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmRpc3BsYXlGaWVsZC50b0xvd2VyQ2FzZSgpXSA6IHJvd1tjb2x1bW4uZmllbGRdXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpXCI+PC9wLWNhbGVuZGFyPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sdW1uPy5maWx0ZXI/LnR5cGUgPT09ICdjYWxlbmRhcicgJiYgIWNvbHVtbi5lZGl0YWJsZVwiIGNsYXNzPVwiY3VzdG9tLWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwicm93LmRpc2FibGVkICAgfHwgYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KSA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5HcmlkRGlhbG9nKGNvbHVtbiwgcm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPnt7IHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaGlkZUZpZWxkVmFsdWUgPyAnJyA6IHNldENvbmRpdGlvbkJhc2VWYWx1ZShyb3csIGNvbHVtbikgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1c3RvbS1saW5rXCIgW3N0eWxlXT1cImNvbHVtbi5zdHlsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJyb3cuZGlzYWJsZWQgICB8fCBhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkdyaWREaWFsb2coY29sdW1uLCByb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGl0bGUtZWxlbWVudF09XCJjb2x1bW4uaG92ZXJEYXRhID8gbnVsbCA6ICdzZWxmJ1wiPlxuICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCIoY29sdW1uLmljb24gfHwgcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5pY29uKSAmJiAhcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5oaWRlRmllbGRWYWx1ZSA7IGVsc2Ugbm9JY29uXCJbdGl0bGVdPVwiY29sdW1uLmhlYWRlclwiIFtjbGFzc109XCJyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/Lmljb24gPyByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/Lmljb24gOiBjb2x1bW4uaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0ljb24+e3sgcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5oaWRlRmllbGRWYWx1ZSA/ICcnIDogc2V0Q29uZGl0aW9uQmFzZVZhbHVlKHJvdywgY29sdW1uKSB9fTwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPCEtLSB7eyBzZXRDb25kaXRpb25CYXNlVmFsdWUocm93LCBjb2x1bW4pIH19XG4gICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhcm93W2NvbHVtbi5maWVsZCArICdfc2Vjb25kVHlwZSddICYmICFyb3cuaGlkZWdyaWRidG5cIiAtLT5cblxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPCEtLSB0ZXN0IC0tPlxuICAgICAgICA8IS0tIGxvb2t1cCBJbnB1dCBjb2x1bW4gb24gR3JpZCAtLT5cbiAgICAgICAgPHNwYW4gICAqbmdTd2l0Y2hDYXNlPVwiJ2xvb2t1cF9pbnB1dCdcIj5cbiAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICAgIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbG9zZS1pY29uLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgW2F0dHIuZGF0YS10aXRsZS1lbGVtZW50XT1cImNvbHVtbi5ob3ZlckRhdGEgPyBudWxsIDogJ3NlbGYnXCIgcmVhZG9ubHkgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3c/LmlzTmV3IHx8IHJvdz8uaXNuZXcgPyB0eXBlT2Yocm93W2NvbHVtbi5maWVsZF0pID09PSAnb2JqZWN0JyA/IHJvd1tjb2x1bW4uZmllbGRdPy50ZXh0IDogcm93W2NvbHVtbi5maWVsZF0gOiByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmRpc3BsYXlGaWVsZCAgPyByb3dbcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCldIDpcbiAgICAgICAgICAgICAgICAgIHR5cGVPZihyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LnRleHQpID09PSAnb2JqZWN0JyAmJiByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LnRleHQ/Lmhhc093blByb3BlcnR5KCd0ZXh0JykgPyByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LnRleHQ/LnRleHQgOiBcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5kaXNwbGF5RmllbGQgPyByb3dbY29sdW1uLmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKV0gOiByb3dbY29sdW1uLmZpZWxkXVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIChrZXl1cC50YWIpPVwic2VsZWN0TG9va3VwRmllbGQoY29sdW1uLCByb3cpXCIgW2Rpc2FibGVkXT1cImFsbG93RGlzYWJsZWQoY29sdW1uLHJvdylcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdExvb2t1cEZpZWxkKGNvbHVtbiwgcm93KVwiIFtpZF09XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpID8gJ2hpZGUtYm9yZGVyJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJyb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkrJ19vYmonXT8uZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJ3ByaW1lLWlucHV0J1wiIChibHVyKT1cIm9uRm9jdXNPdXRFdmVudChjb2x1bW4sIHJvdylcIiAvPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KVwiPjxidXR0b24gKm5nSWY9XCJyb3dbY29sdW1uLmZpZWxkXSAmJiB0eXBlT2Yocm93W2NvbHVtbi5maWVsZF0pID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgICAgICAgPyByb3dbY29sdW1uLmZpZWxkXS50ZXh0XG4gICAgICAgICAgICAgICAgICA6IHJvd1tjb2x1bW4uZmllbGRdICYmICFjb2x1bW4uZGlzYWJsZWRcIiBpY29uPVwicGkgcGktdGltZXNcIiBwQnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibG9va3VwQ2xlYXJWYWx1ZShjb2x1bW4scm93KVwiPjwvYnV0dG9uPjwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCIgPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbHVtbi5saW5rSWRcIiA+XG4gICAgICAgICAgICAgICAgPGEgW2F0dHIuZGF0YS10aXRsZS1lbGVtZW50XT1cImNvbHVtbi5ob3ZlckRhdGEgPyBudWxsIDogJ3NlbGYnXCIgW2hyZWZdPVwicm93W2NvbHVtbi5maWVsZCArICdfb2JqJ10/Lmh5cGVybGlua1wiIFt0YXJnZXRdPVwiY29sdW1uLnRhcmdldCA9PT0gJ19zZWxmJyA/ICcnIDogICdfYmxhbmsnXCI+XG4gICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICBzZXRMb29rdXBSZWFkT25seVZhbHVlKHJvdywgY29sdW1uKVxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuZGF0YS10aXRsZS1lbGVtZW50XT1cImNvbHVtbi5ob3ZlckRhdGEgPyBudWxsIDogJ3NlbGYnXCIgKm5nSWY9XCIhY29sdW1uLmxpbmtJZFwiIFtzdHlsZV09XCJjb2x1bW4uc3R5bGVcIiBbY2xhc3NdPVwiY29sdW1uLmNvbXBvbmVudCAmJiBjb2x1bW4uZWRpdExpbmsgPT09IHRydWUgPyAnY3VzdG9tLWxpbmsnIDogJydcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuTG9va3VwSHlwZXJsaW5rKGNvbHVtbiwgcm93KVwiICAgPlxuICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICBzZXRMb29rdXBSZWFkT25seVZhbHVlKHJvdywgY29sdW1uKVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8IS0tIE51bWVyaWMgSW5wdXQgY29sdW1uIG9uIEdyaWQgLS0+XG4gICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInbnVtZXJpYydcIj5cbiAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgIDwhLS0gZm9yIEN1cnJlbmN5ICYmIERlY2ltYWwgJiYgUGVyY2VudCAtLT5cbiAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuZGF0YS10aXRsZS1lbGVtZW50XT1cImNvbHVtbi5ob3ZlckRhdGEgPyBudWxsIDogJ2lucHV0J1wiIGNsYXNzPVwiaW5wdXQtbnVtYmVyXCI+XG4gICAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgW2lkXT1cImFsbG93RGlzYWJsZWQoY29sdW1uLHJvdykgPyAnaGlkZS1ib3JkZXInIDogJydcIiBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZC50b0xvd2VyQ2FzZSgpKydfb2JqJ10/LmVycm9yTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmctaW52YWxpZCBuZy1kaXJ0eSdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2Zvcm0tY29udHJvbCdcbiAgICAgICAgICAgICAgICAgICAgXCIgW3Nob3dCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5RmllbGQgPyByb3dbcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5RmllbGQ/LnRvTG93ZXJDYXNlKCldIDogcm93W2NvbHVtbi5maWVsZF1cIiBbbmFtZV09XCJjb2x1bW4uZmllbGRcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFsbG93RGlzYWJsZWQoY29sdW1uLHJvdylcIiAob25Gb2N1cyk9XCJvbkZvY3VzRXZlbnQoY29sdW1uLCByb3cpXCJcbiAgICAgICAgICAgICAgICAgIChvbkJsdXIpPVwib25Gb2N1c091dEV2ZW50KGNvbHVtbiwgcm93KVwiIFttb2RlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5mb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZm9ybWF0LnR5cGUgPT09ICdjdXJyZW5jeSdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2N1cnJlbmN5J1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnZGVjaW1hbCdcbiAgICAgICAgICAgICAgICAgICAgXCIgW2N1cnJlbmN5XT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5mb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZm9ybWF0LnR5cGUgPT09ICdjdXJyZW5jeScgJiZcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZm9ybWF0LmZvcm1hdFBhcmFtcyAmJlxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5mb3JtYXQuZm9ybWF0UGFyYW1zLmN1cnJlbmN5XG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNvbHVtbi5mb3JtYXQuZm9ybWF0UGFyYW1zLmN1cnJlbmN5XG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdVU0QnXG4gICAgICAgICAgICAgICAgICAgIFwiIFtsb2NhbGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmZvcm1hdCAmJlxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5mb3JtYXQudHlwZSA9PT0gJ2N1cnJlbmN5JyAmJlxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5mb3JtYXQuZm9ybWF0UGFyYW1zICYmXG4gICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmZvcm1hdC5mb3JtYXRQYXJhbXMubG9jYWxlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNvbHVtbi5mb3JtYXQuZm9ybWF0UGFyYW1zLmxvY2FsZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnZW4tVVMnXG4gICAgICAgICAgICAgICAgICAgIFwiIFttaW5GcmFjdGlvbkRpZ2l0c109XCJjb2x1bW4uZm9ybWF0ID8gc2V0TnVtZXJpY01pbk14RnJhY3Rpb24oY29sdW1uKSA6ICcwJ1wiXG4gICAgICAgICAgICAgICAgICBbbWF4RnJhY3Rpb25EaWdpdHNdPVwiY29sdW1uLmZvcm1hdCA/IHNldE51bWVyaWNNaW5NeEZyYWN0aW9uKGNvbHVtbikgOiAnMCdcIiBbc3VmZml4XT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5mb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZm9ybWF0LnR5cGUgPT09ICdwZXJjZW50JyAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICclJ1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgIDwvcC1pbnB1dE51bWJlcj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xvY2tlZF9maWVsZD48c3BhbiAqbmdJZj1cIiFyb3cuaXNOZXdcIiAgW2F0dHIuZGF0YS10aXRsZS1lbGVtZW50XT1cImNvbHVtbi5ob3ZlckRhdGEgPyBudWxsIDogJ3NlbGYnXCI+XG4gICAgICAgICAgICAgICAgICB7eyByb3dbY29sdW1uLmZpZWxkXSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cbiAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLmRhdGEtdGl0bGUtZWxlbWVudF09XCJjb2x1bW4uaG92ZXJEYXRhID8gbnVsbCA6ICdzZWxmJ1wiPiBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgIHNldE51bWVyaWNGb3JtYXQoY29sdW1uLCByb3cpXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDwhLS0gQnV0dG9uIGNvbHVtbiBvbiBHcmlkIC0tPlxuICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2FkZF9idXR0b24nXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhcm93LmhpZGVncmlkYnRuXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICAgIFtpY29uXT1cInJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaWNvbiA/IHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaWNvbiA6IGNvbHVtbi5pY29uXCJcbiAgICAgICAgICAgICAgW25hbWVdPVwiY29sdW1uLmhlYWRlclwiIGNsYXNzPVwibWVyZ2UtYnRuXCIgW2Rpc2FibGVkXT1cImFsbG93RGlzYWJsZWQoY29sdW1uLHJvdylcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwicm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5VGV4dCA/IHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uZGlzcGxheVRleHQgOiBjb2x1bW4udmFsdWVcIlxuICAgICAgICAgICAgICBjbGFzcz1cImdyaWQtY29tcG9uZW50LWdyaWQtYWRkLWJ0blwiIChjbGljayk9XCJvbkNsaWNrQnV0dG9uKGNvbHVtbiwgcm93KVwiPjwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NwYW4+IFxuICAgICAgICBcbiAgICAgICAgPCEtLSBHZW5lcmF0ZSBGaWxlIEJ1dHRvbiBjb2x1bW4gb24gR3JpZCAtLT5cbiAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidnZW5lcmF0ZV9maWxlX2J1dHRvbidcIj5cbiAgICAgICAgICAgIDxzZS1nZW5lcmF0ZS1pbXBvcnQtZmlsZVxuICAgICAgICAgICAgICBbbGFiZWxdPVwicm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5VGV4dCA/IHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uZGlzcGxheVRleHQgOiBjb2x1bW4udmFsdWVcIlxuICAgICAgICAgICAgICBbaWNvbl09XCJyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/Lmljb24gPyByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/Lmljb24gOiBjb2x1bW4uaWNvblwiXG4gICAgICAgICAgICAgIFtkaWFsb2dEYXRhXT1cImNvbHVtbi5kYXRhXCJcbiAgICAgICAgICAgICAgW3NlbGVjdGVkUm93XT1cInJvd1wiXG4gICAgICAgICAgICA+PC9zZS1nZW5lcmF0ZS1pbXBvcnQtZmlsZT5cbiAgICAgICAgPC9zcGFuPiBcblxuICAgICAgICA8IS0tIERhdGUgY29sdW1uIG9uIEdyaWQgLS0+XG4gICAgICAgIDwhLS0gY2FsZW5kYXIgc2VsZWN0b3IgLS0+XG4gICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIiBcbiAgICAgICAgW2F0dHIuZGF0YS10aXRsZS1lbGVtZW50XT1cImNvbHVtbi5ob3ZlckRhdGE/IG51bGw6IGVkaXRBbGxSb3dzID8gJ2lucHV0JyA6ICdzZWxmJyBcIiBcbiAgICAgICAgPlxuICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIiA+XG4gICAgICAgICAgICAgIDxwLWNhbGVuZGFyXG4gICAgICAgICAgICAgICAgW21pbkRhdGVdPVwiY29sdW1uLm1pbkRhdGVcIiBbbWF4RGF0ZV09XCJjb2x1bW4ubWF4RGF0ZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cInJvd1tjb2x1bW4uZmllbGQudG9Mb3dlckNhc2UoKSsnX29iaiddPy5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eSAnICsgY29sdW1uLmZpZWxkICsgcm93W2RhdGFLZXldIDogY29sdW1uLmZpZWxkICsgcm93W2RhdGFLZXldXCJcbiAgICAgICAgICAgICAgICBbaWRdPVwiYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KSA/ICdoaWRlLWJvcmRlcicgOiAnJ1wiIChvbkNsb3NlKT1cIm9uRm9jdXNPdXRFdmVudChjb2x1bW4sIHJvdylcIlxuICAgICAgICAgICAgICAgIFthcHBlbmRUb109XCInYm9keSdcIiBob3VyRm9ybWF0PVwiMTJcIiBbZGVmYXVsdERhdGVdPVwiZGVmYXVsdERhdGVcIlxuICAgICAgICAgICAgICAgIFtzdGVwTWludXRlXT1cImNvbHVtbi5taW51dGVzSW50ZXJ2YWwgPyBjb2x1bW4ubWludXRlc0ludGVydmFsIDogMVwiIFtzaG93VGltZV09XCJjb2x1bW4uc2hvd1RpbWVcIlxuICAgICAgICAgICAgICAgIFt0aW1lT25seV09XCJjb2x1bW4udGltZU9ubHlcIiBbZGF0ZUZvcm1hdF09XCJjb2x1bW4uZm9ybWF0ID8gY29sdW1uLmZvcm1hdC50eXBlIDogY2FsZW5kYXJGb3JtYXRcIlxuICAgICAgICAgICAgICAgIChrZXl1cCk9XCJjYWxlbmRhcklucHV0VmFsdWUoY29sdW1uLCByb3cpXCIgKG9uU2hvdyk9XCJvbkNsaWNrRXZlbnQoY29sdW1uLCByb3cpXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uZGlzcGxheUZpZWxkID8gcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5RmllbGQgOiByb3dbY29sdW1uLmZpZWxkXVwiXG4gICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KVwiXG4gICAgICAgICAgICAgICAgW3Nob3dCdXR0b25CYXJdPVwiIWNvbHVtbi50aW1lT25seVwiPjwvcC1jYWxlbmRhcj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCIgPlxuICAgICAgICAgICAgICB7eyBzZXRDb25kaXRpb25CYXNlVmFsdWUocm93LGNvbHVtbikgfX1cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgIDwvc3Bhbj5cblxuXG4gICAgICAgIDxzcGFuICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgICAgPHNwYW4gW25nU3dpdGNoXT1cImNvbHVtbi50eXBlXCI+XG4gICAgICAgICAgICA8IS0tIERyb3Bkb3duIGNvbHVtbiBvbiBHcmlkIC0tPlxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidkcm9wZG93bidcIiBbY2xhc3NdPVwiZHJvcGRvd25JbnB1dCA/ICcnIDogJ291dHB1dC1kcm9wZG93bidcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10aXRsZS1lbGVtZW50XT1cIiBjb2x1bW4uaG92ZXJEYXRhPyBudWxsOiBlZGl0QWxsUm93cyA/ICcucC1kcm9wZG93bi1sYWJlbCcgOiAnc2VsZidcIj5cbiAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duICpuZ0lmPVwiIXJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uaGlkZGVuXCIgW29wdGlvbnNdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmZpZWxkPy50b0xvd2VyQ2FzZSgpKydfZGF0YSddXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gcm93W2NvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSsnX2RhdGEnXVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbHVtbi5kYXRhXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKSA/IHJvd1tyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LmRpc3BsYXlGaWVsZC50b0xvd2VyQ2FzZSgpXSA6IHJvd1tjb2x1bW4uZmllbGRdXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFsbG93RGlzYWJsZWQoY29sdW1uLHJvdylcIiBbcGxhY2Vob2xkZXJdPVwicm93W2NvbHVtbi5kaXNwbGF5RmllbGRdXG4gICAgICAgICAgICAgICAgICAgICAgPyByb3dbY29sdW1uLmRpc3BsYXlGaWVsZF1cbiAgICAgICAgICAgICAgICAgICAgICA6IHJvd1tjb2x1bW4uZmllbGRdID8gcm93W2NvbHVtbi5maWVsZF0gOiAnU2VsZWN0J1wiIFtzaG93Q2xlYXJdPVwicm93W2NvbHVtbi5maWVsZF0gPyB0cnVlIDogZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbb3B0aW9uTGFiZWxdPVwiY29sdW1uLm9wdGlvbkxhYmVsXCIgKGNsaWNrKT1cIm9uQ2xpY2tFdmVudChjb2x1bW4sIHJvdylcIlxuICAgICAgICAgICAgICAgICAgICBbb3B0aW9uVmFsdWVdPVwiY29sdW1uLm9wdGlvblZhbHVlXCIgW2NsYXNzXT1cInJvd1tjb2x1bW4uZmllbGQudG9Mb3dlckNhc2UoKSsnX29iaiddPy5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpID8gJ2hpZGUtYm9yZGVyJyA6ICcnXCIgKGJsdXIpPVwib25Gb2N1c091dEV2ZW50KGNvbHVtbiwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGNvbHVtbiwgcm93KVwiIFtmaWx0ZXJdPVwiY29sdW1uLmFsbG93U2VhcmNoXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgc2V0RHJvcGR3b25SZWFkT25seVZhbHVlKHJvdywgY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICA8IS0tIE11bHRpU2VsZWN0IGNvbHVtbiBvbiBHcmlkIC0tPlxuICAgICAgICAgICAgPCEtLSBbKG5nTW9kZWwpXT1cInJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uZGlzcGxheUZpZWxkPy50b0xvd2VyQ2FzZSgpID8gcm93W3Jvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8uZGlzcGxheUZpZWxkLnRvTG93ZXJDYXNlKCldIDpcbiAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdXCIgLS0+XG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ211bHRpLXNlbGVjdCdcIiBbYXR0ci5kYXRhLXRpdGxlLWVsZW1lbnRdPVwiY29sdW1uLmhvdmVyRGF0YSA/IG51bGwgOiAnLnAtbXVsdGlzZWxlY3QtbGFiZWwnXCI+XG4gICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCBbY2xhc3NdPVwicm93W2NvbHVtbi5maWVsZC50b0xvd2VyQ2FzZSgpKydfb2JqJ10/LmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5JyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cImFsbG93RGlzYWJsZWQoY29sdW1uLHJvdykgPyAnaGlkZS1ib3JkZXInIDogJydcIiB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFsbG93RGlzYWJsZWQoY29sdW1uLHJvdylcIlxuICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb2x1bW4uZGF0YVwiIFtvcHRpb25MYWJlbF09XCJjb2x1bW4ub3B0aW9uTGFiZWxcIiBbb3B0aW9uVmFsdWVdPVwiY29sdW1uLm9wdGlvblZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoY29sdW1uLCByb3cpXCIgKG9uUGFuZWxTaG93KT1cInNob3dPcHRpb24oY29sdW1uLCByb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tFdmVudChjb2x1bW4sIHJvdylcIiBbYXBwZW5kVG9dPVwiJ2JvZHknXCIgKGJsdXIpPVwib25Gb2N1c091dEV2ZW50KGNvbHVtbiwgcm93KVwiPlxuICAgICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gIFthdHRyLmRhdGEtdGl0bGUtZWxlbWVudF09XCJjb2x1bW4uaG92ZXJEYXRhID8gbnVsbCA6ICdzZWxmJ1wiID5cbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5kaXNwbGF5RmllbGRdXG4gICAgICAgICAgICAgICAgICAgID8gcm93W2NvbHVtbi5kaXNwbGF5RmllbGRdIDpcbiAgICAgICAgICAgICAgICAgICAgc2V0TXVsdGlTZWxlY3REYXRhKGNvbHVtbiwgcm93W2NvbHVtbi5maWVsZF0pXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgIDwhLS0gQXV0b0NvbXBsZXRlIFNlYXJjaCAtLT5cbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInQXV0b0NvbXBsZXRlJ1wiPlxuICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgPHAtYXV0b0NvbXBsZXRlIFxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwicm93W2NvbHVtbi5maWVsZC50b0xvd2VyQ2FzZSgpKydfb2JqJ10/LmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5JyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cImFsbG93RGlzYWJsZWQoY29sdW1uLHJvdykgPyAnaGlkZS1ib3JkZXInIDogJydcIiBcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiY29sdW1uLmhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtzdWdnZXN0aW9uc109XCJjb2x1bW4uZGF0YVwiIFxuICAgICAgICAgICAgICAgICAgICAob25TZWxlY3QpPVwiYXV0b0NvbXBsZXRlU2VsZWN0ZWRWYWx1ZShyb3csIGNvbHVtbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2x1bW4ub3B0aW9uTGFiZWwgPyBjb2x1bW4ub3B0aW9uTGFiZWw/LnRvTG93ZXJDYXNlKCkgOiBjb2x1bW4uZGlzcGxheUZpZWxkID8gY29sdW1uLmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKSA6IGNvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5RmllbGQgPyByb3dbcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy5kaXNwbGF5RmllbGQudG9Mb3dlckNhc2UoKV0gOlxuICAgICAgICAgICAgICAgICAgICB0eXBlT2Yocm93W2NvbHVtbi5maWVsZF0pID09PSAnb2JqZWN0JyAmJiByb3dbY29sdW1uLmZpZWxkXT8udGV4dCA/XG4gICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZmllbGRdPy50ZXh0IDpcbiAgICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICBbZHJvcGRvd25dPVwiY29sdW1uLnNob3dPcHRpb25cIiBcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2VFdmVudChjb2x1bW4sIHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGlja0V2ZW50KGNvbHVtbiwgcm93KVwiIFxuICAgICAgICAgICAgICAgICAgICAoY29tcGxldGVNZXRob2QpPVwiYXV0b1NlYXJjaCgkZXZlbnQsIGNvbHVtbiwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgIChvbkJsdXIpPVwib25Gb2N1c091dEV2ZW50KGNvbHVtbiwgcm93LCAkZXZlbnQpXCIgXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpXCIgXG4gICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25BdXRvQ29tcGxldGVLZXlFbnRlckV2ZW50KCRldmVudCwgY29sdW1uLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICA8L3AtYXV0b0NvbXBsZXRlPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3dbY29sdW1uLmZpZWxkXSAmJiByb3dbY29sdW1uLmZpZWxkXVswXSAmJiAgcm93W2NvbHVtbi5maWVsZF1bMF1bY29sdW1uLmRpc3BsYXlGaWVsZF1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IHZhbHVlIG9mIHJvd1tjb2x1bW4uZmllbGRdOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgcm93W2NvbHVtbi5maWVsZF0gJiYgcm93W2NvbHVtbi5maWVsZF0ubGVuZ3RoID4gMSA/IHJvd1tjb2x1bW4uZmllbGRdLmxlbmd0aCAtMSA9PT0gaSA/XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWVbY29sdW1uLmRpc3BsYXlGaWVsZF0gOiB2YWx1ZVtjb2x1bW4uZGlzcGxheUZpZWxkXSArICc7JyA6IHZhbHVlW2NvbHVtbi5kaXNwbGF5RmllbGRdIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93W2NvbHVtbi5maWVsZF0gJiYgcm93W2NvbHVtbi5maWVsZF1bMF0gJiYgIHJvd1tjb2x1bW4uZmllbGRdWzBdW2NvbHVtbi5maWVsZF0gJiYgIWNvbHVtbi5kaXNwbGF5RmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IHZhbHVlIG9mIHJvd1tjb2x1bW4uZmllbGRdOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgcm93W2NvbHVtbi5maWVsZF0gJiYgcm93W2NvbHVtbi5maWVsZF0ubGVuZ3RoID4gMSA/IHJvd1tjb2x1bW4uZmllbGRdLmxlbmd0aCAtMSA9PT0gaSA/XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWVbY29sdW1uLmZpZWxkXSA6IHZhbHVlW2NvbHVtbi5maWVsZF0gKyAnOycgOiB2YWx1ZVtjb2x1bW4uZmllbGRdIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwhLS0gQWRkIEdlbmVyYXRlIFJlcG9ydCBCdXR0b24gLS0+XG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3JlcG9ydCdcIj5cbiAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICA8c2UtZ2VuZXJhdGUtcmVwb3J0LWJ0biBbcmVwSW5mb109XCJzZXRSZXBvcnROYW1lKGNvbHVtbiwgcm93KVwiIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBbcGFyYW1zXT1cInNldFJlcG9ydFBhcmFtcyhjb2x1bW4sIHJvdylcIiBbY2xhc3NdPVwiY29sdW1uLmNsYXNzXCIgW3Nob3dEaWFsb2ddPVwiY29sdW1uLnNob3dEaWFsb2dcIlxuICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJjb2x1bW4uaWNvblwiIFtyZXBvcnRUeXBlXT1cImNvbHVtbi5yZXBvcnRUeXBlXCI+PC9zZS1nZW5lcmF0ZS1yZXBvcnQtYnRuPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICA8c2UtZ2VuZXJhdGUtcmVwb3J0LWJ0biBbcmVwSW5mb109XCJzZXRSZXBvcnROYW1lKGNvbHVtbiwgcm93KVwiIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBbcGFyYW1zXT1cInNldFJlcG9ydFBhcmFtcyhjb2x1bW4sIHJvdylcIiBbaWNvbl09XCJjb2x1bW4uaWNvblwiIFtjbGFzc109XCJjb2x1bW4uY2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd0RpYWxvZ109XCJjb2x1bW4uc2hvd0RpYWxvZ1wiIFtyZXBvcnRUeXBlXT1cImNvbHVtbi5yZXBvcnRUeXBlXCI+PC9zZS1nZW5lcmF0ZS1yZXBvcnQtYnRuPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hEZWZhdWx0ICBbYXR0ci5kYXRhLXRpdGxlLWVsZW1lbnRdPVwiY29sdW1uLmhvdmVyRGF0YSA/IG51bGwgOiAnaW5wdXQnXCI+XG4gICAgICAgICAgICAgIDwhLS0gSW5wdXQgY29sdW1uIG9uIEdyaWQgLS0+XG4gICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+ICAgICAgXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGVdPVwiY29sdW1uLnN0eWxlID8gY29sdW1uLnN0eWxlIDogJ2Rpc3BsYXk6ZmxleCdcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBbdHlwZV09XCJyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LnRleHRUeXBlP3Jvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8udGV4dFR5cGU6Y29sdW1uLnRleHRUeXBlP2NvbHVtbi50ZXh0VHlwZTondGV4dCdcIiBcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJyb3dbY29sdW1uLmZpZWxkLnRvTG93ZXJDYXNlKCkrJ19vYmonXT8uZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJ3ByaW1lLWlucHV0J1wiXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCJhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpID8gJ2hpZGUtYm9yZGVyJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cudW5kZWZpbmVkID8gJycgOiBhbGxvd0Rpc2FibGVkKGNvbHVtbixyb3cpICYmIHJvd1tjb2x1bW4uZGlzcGxheUZpZWxkXSA/XG4gICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmRpc3BsYXlGaWVsZF0gOiByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10gJiYgcm93W2NvbHVtbi5maWVsZCsnX29iaiddLnZhbHVlID8gcm93W2NvbHVtbi5maWVsZCsnX29iaiddLnZhbHVlIDogcm93W2NvbHVtbi5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWxsb3dEaXNhYmxlZChjb2x1bW4scm93KVwiXG4gICAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uRm9jdXNPdXRFdmVudChjb2x1bW4sIHJvdylcIiAoY2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoY29sdW1uLCByb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tCdXR0b24oY29sdW1uLCByb3cpXCIgKm5nSWY9XCJjb2x1bW4uZmllbGQgIT09IGRhdGFLZXk7IGVsc2UgbG9ja2VkX2ZpZWxkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmbG9hdDpyaWdodFwiICpuZ0lmPVwiY29sdW1uLmZvcm1hdD09J3Bhc3N3b3JkJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpICBbY2xhc3NdPVwicm93W2NvbHVtbi5maWVsZCsnX29iaiddPyhyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10udGV4dFR5cGU9PSdwYXNzd29yZCc/J3BpIHBpLWV5ZSc6J3BpIHBpLWV5ZS1zbGFzaCcpOmNvbHVtbi50ZXh0VHlwZT09J3Bhc3N3b3JkJz8ncGkgcGktZXllJzoncGkgcGktZXllLXNsYXNoJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlUGFzc3dvcmRUeXBlKGNvbHVtbiwgcm93KVwiIFt0aXRsZV09XCJjb2x1bW4uaGVhZGVyXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+IFxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsb2NrZWRfZmllbGQ+PHNwYW4gKm5nSWY9XCIhcm93LmlzTmV3XCIgIFthdHRyLmRhdGEtdGl0bGUtZWxlbWVudF09XCJjb2x1bW4uaG92ZXJEYXRhID8gbnVsbCA6ICdzZWxmJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IHJvd1tjb2x1bW4uZmllbGRdIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW3N0eWxlXT1cImNvbHVtbi5zdHlsZSA/IGNvbHVtbi5zdHlsZSA6ICdkaXNwbGF5OmZsZXgnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJvbkNsaWNrRXZlbnQoY29sdW1uLCByb3cpXCIgW2F0dHIuZGF0YS10aXRsZS1lbGVtZW50XT1cImNvbHVtbi5ob3ZlckRhdGEgPyBudWxsIDogJ3NlbGYnIFwiIFxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJyb3dbY29sdW1uLmZpZWxkKydfb2JqJ10/LnRleHRUeXBlID8ocm93W2NvbHVtbi5maWVsZCsnX29iaiddPy50ZXh0VHlwZT09J3Bhc3N3b3JkJyAgPydwYXNzd29yZCc6JycpIDpjb2x1bW4udGV4dFR5cGU9PSdwYXNzd29yZCc/J3Bhc3N3b3JkJzonJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IHNldFRleHRCb3hSZWFkT25seVZhbHVlKHJvdywgY29sdW1uKSB9fSBcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsb2F0OnJpZ2h0XCIgKm5nSWY9XCJjb2x1bW4uZm9ybWF0PT0ncGFzc3dvcmQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cInJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8ocm93W2NvbHVtbi5maWVsZCsnX29iaiddLnRleHRUeXBlPT0ncGFzc3dvcmQnPydwaSBwaS1leWUnOidwaSBwaS1leWUtc2xhc2gnKTpjb2x1bW4udGV4dFR5cGU9PSdwYXNzd29yZCc/J3BpIHBpLWV5ZSc6J3BpIHBpLWV5ZS1zbGFzaCdcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJjb2x1bW4uaGVhZGVyXCIgKGNsaWNrKT1cImNoYW5nZVBhc3N3b3JkVHlwZShjb2x1bW4sIHJvdylcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIFxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPCEtLSBHcmlkIFJvd3MgRGF0YSBCaW5kaW5ncyBFbmQgLS0+XG5cbiAgICAgICAgPCEtLSBBY3Rpb24gY29sdW1uIG9uIEdyaWQgLS0+XG4gICAgICAgIDx0ZCAqbmdJZj1cIiFzZXRBY3Rpb25Db2x1bW5Bc0ZpcnN0ICYmIGNvbHVtbnM/Lmxlbmd0aCA+IDAgJiYgY29sdW1uQWN0aW9ucy5sZW5ndGggPiAwXCJcbiAgICAgICAgICBjbGFzcz1cImZvci1idXR0b25zXCJcbiAgICAgICAgICBbY2xhc3NdPVwiaW5FZGl0TW9kZSA/ICd0aHJlZS1hY3Rpb24tYnRuJyA6ICd0d28tYWN0aW9uLWJ0bidcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImFjdGlvbi1idG5cIiAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGNvbHVtbkFjdGlvbnNcIj5cbiAgICAgICAgICAgIDxpIFt0aXRsZV09XCJhY3Rpb24udG9vbHRpcFwiIFtjbGFzc109XCJhY3Rpb24uaWNvblwiIChjbGljayk9XCJoYW5kbGVBY3Rpb25DbGljaygkZXZlbnQsIGFjdGlvbiwgcm93KVwiPjwvaT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZFxuICAgICAgICAgICpuZ0lmPVwiIXNldEFjdGlvbkNvbHVtbkFzRmlyc3QgJiYgY29sdW1ucz8ubGVuZ3RoID4gMCAmJiB1c2VJbmxpbmVDUlVEICYmIChkZWxldGVSb3dQZXJtaXNzaW9uIHx8IGVkaXRSb3dQZXJtaXNzaW9uKVwiXG4gICAgICAgICAgW2NsYXNzXT1cImluRWRpdE1vZGUgPyAndGhyZWUtYWN0aW9uLWJ0bicgOiAndHdvLWFjdGlvbi1idG4nXCJcbiAgICAgICAgICBjbGFzcz1cImZvci1idXR0b25zXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJkaXNhYmxlZFNhdmVCdG4gPyAnaGlkZS1jbGVhci1maWx0ZXItYnV0dG9uJyA6ICcnXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9J3NldEFjdGlvbkNvbHVtbldpZHRoJz5cbiAgICAgICAgICAgIDxzZS1ncmlkLXJvdy1hY3Rpb25zIFtlZGl0aW5nXT1cImVkaXRpbmdcIiBbZWRpdFJvd1Blcm1pc3Npb25dPVwiZWRpdFJvd1Blcm1pc3Npb25cIlxuICAgICAgICAgICAgICBbZGVsZXRlUm93UGVybWlzc2lvbl09XCJkZWxldGVSb3dQZXJtaXNzaW9uXCIgW2hpZGVEZWxldGVCdG5dPVwiaGlkZURlbGV0ZUJ0blwiIFtoaWRlRWRpdEJ0bl09XCJoaWRlRWRpdEJ0blwiXG4gICAgICAgICAgICAgIFtyb3ddPVwicm93XCIgKG9uUm93RWRpdEluaXRCdG4pPVwib25Sb3dFZGl0SW5pdCgkZXZlbnQpXCIgKGRlbGV0ZVJlY29yZEJ0bik9XCJkZWxldGVSZWNvcmQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvblJvd0VkaXRTYXZlQnRuKT1cIm9uUm93RWRpdFNhdmUoJGV2ZW50KVwiIChvblJvd0VkaXRDYW5jZWxCdG4pPVwib25Sb3dFZGl0Q2FuY2VsKCRldmVudCwgcmkpXCJcbiAgICAgICAgICAgICAgW2VkaXRBbGxSb3dzXT1cImVkaXRBbGxSb3dzXCI+XG4gICAgICAgICAgICA8L3NlLWdyaWQtcm93LWFjdGlvbnM+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPCEtLSBGb290ZXIgY29sdW1ucyBvbiBHcmlkIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cbiAgICAgIDx0ciAqbmdJZj1cImFnZ3JlZ2F0ZUZvb3RlclwiPlxuICAgICAgICA8dGRcbiAgICAgICAgICAqbmdJZj1cInNldEFjdGlvbkNvbHVtbkFzRmlyc3QgJiYgKGNvbHVtbkFjdGlvbnMubGVuZ3RoID4gMCB8fCAodXNlSW5saW5lQ1JVRCAmJiAoZGVsZXRlUm93UGVybWlzc2lvbiB8fCBlZGl0Um93UGVybWlzc2lvbikpKVwiXG4gICAgICAgICAgW2NsYXNzXT1cImluRWRpdE1vZGUgPyAndGhyZWUtYWN0aW9uLWJ0bicgOiAndHdvLWFjdGlvbi1idG4nXCI+PC90ZD5cbiAgICAgICAgPHRkICpuZ0lmPVwiYWxsb3dTZWxlY3Rpb25cIiBbY2xhc3NdPVwiaW5FZGl0TW9kZSA/ICd0aHJlZS1hY3Rpb24tYnRuJyA6ICd0d28tYWN0aW9uLWJ0bidcIj48L3RkPlxuICAgICAgICA8dGQgKm5nRm9yPVwibGV0IG91dGVyQ29sdW1uIG9mIHNlbGVjdGVkQ29sdW1uc1wiIGNsYXNzPVwiZ3JpZC1jb21wb25lbnQtb3V0ZXItY29sdW1uXCIgW3N0eWxlXT1cIm91dGVyQ29sdW1uLnN0eWxlXCI+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaW5uZXJDb2x1bW4gb2Ygc2VsZWN0ZWRDb2x1bW5zXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBhZ2dyIG9mIGlubmVyQ29sdW1uPy5hZ2dyZWdhdGVcIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYWdnci5hZ2dyVmFsdWU/Lmxlbmd0aCAmJiAoKCFhZ2dyLmRpc3BsYXlGaWVsZCAmJiBpbm5lckNvbHVtbi5maWVsZD8udG9Mb3dlckNhc2UoKSA9PT0gb3V0ZXJDb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkpIHx8XG4gICAgICAgICAgICAgICAgICBhZ2dyLmRpc3BsYXlGaWVsZCAmJiBhZ2dyLmRpc3BsYXlGaWVsZD8udG9Mb3dlckNhc2UoKSA9PT0gb3V0ZXJDb2x1bW4uZmllbGQ/LnRvTG93ZXJDYXNlKCkpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cImFnZ3IuYWdnclZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+ICBcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkXG4gICAgICAgICAgKm5nSWY9XCIhc2V0QWN0aW9uQ29sdW1uQXNGaXJzdCAmJiBjb2x1bW5zPy5sZW5ndGggPiAwICYmIHVzZUlubGluZUNSVUQgJiYgKGRlbGV0ZVJvd1Blcm1pc3Npb24gfHwgZWRpdFJvd1Blcm1pc3Npb24pXCJcbiAgICAgICAgICBbY2xhc3NdPVwiaW5FZGl0TW9kZSA/ICd0aHJlZS1hY3Rpb24tYnRuJyA6ICd0d28tYWN0aW9uLWJ0bidcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImRpc2FibGVkU2F2ZUJ0biA/ICdoaWRlLWNsZWFyLWZpbHRlci1idXR0b24nIDogJydcIj48L3RkPlxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPCEtLSBGb290ZXIgZm9yIEVtcHR5IE1lc3NhZ2UgY29sdW1ucyBvbiBHcmlkIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cbiAgICAgIDx0ciBjbGFzcz1cImdyaWQtY29tcG9uZW50IG5vLXJlY29yZHMtZm91bmRcIj5cbiAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwic2VsZWN0ZWRDb2x1bW5zPy5sZW5ndGggKyAxXCI+e3t0b3RhbFJlY29yZHM9PTA/ICdObyByZWNvcmRzIGZvdW5kJzonJ319PC90ZD5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9wLXRhYmxlPiAgXG4gIDxwLW92ZXJsYXlQYW5lbFxuICBbc3R5bGVdPVwib3ZlcmxheVBhbmVsU3R5bGVcIiAjb3ZlcmxheVBhbmVsPlxuICAgIDxuZy1jb250YWluZXIgI3ZpZXdDb250YWluZXJSZWY+PC9uZy1jb250YWluZXI+XG4gIDwvcC1vdmVybGF5UGFuZWw+XG48L2Rpdj4iXX0=
|