@dignite-ng/expand.file-explorer 3.0.0-rc.49 → 3.0.0-rc.50
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/dome/file-dome.component.mjs +2 -4
- package/esm2022/lib/components/file-edit/file-edit.component.mjs +33 -24
- package/esm2022/lib/components/file-modal/file-modal.component.mjs +16 -20
- package/esm2022/lib/components/file-modal-tree/file-modal-tree.component.mjs +15 -17
- package/esm2022/lib/components/file-picker/file-picker.component.mjs +14 -16
- package/esm2022/lib/file-explorer.module.mjs +24 -10
- package/esm2022/lib/pipe/format-file-size.pipe.mjs +35 -0
- package/esm2022/public-api.mjs +1 -3
- package/fesm2022/dignite-ng-expand.file-explorer.mjs +97 -114
- package/fesm2022/dignite-ng-expand.file-explorer.mjs.map +1 -1
- package/lib/components/dome/file-dome.component.d.ts +0 -1
- package/lib/components/file-edit/file-edit.component.d.ts +6 -4
- package/lib/components/file-modal/file-modal.component.d.ts +1 -4
- package/lib/components/file-modal-tree/file-modal-tree.component.d.ts +1 -3
- package/lib/components/file-picker/file-picker.component.d.ts +0 -3
- package/lib/file-explorer.module.d.ts +2 -1
- package/lib/pipe/format-file-size.pipe.d.ts +14 -0
- package/package.json +1 -1
- package/esm2022/lib/services/file-api.service.mjs +0 -68
- package/lib/services/file-api.service.d.ts +0 -14
|
@@ -5,7 +5,6 @@ import * as FileService from '../../proxy/dignite/file-explorer/files';
|
|
|
5
5
|
import { ConfirmationService, ToasterService } from '@abp/ng.theme.shared';
|
|
6
6
|
import { ListService, RestService, LocalizationService, LIST_QUERY_DEBOUNCE_TIME, } from '@abp/ng.core';
|
|
7
7
|
import { FileDescriptorService, } from '../../proxy/dignite/file-explorer/files';
|
|
8
|
-
import { FileApiService } from '../../services/file-api.service';
|
|
9
8
|
import { SelectionType } from '@swimlane/ngx-datatable';
|
|
10
9
|
import { FormControl, FormGroup, Validators } from '@angular/forms';
|
|
11
10
|
import { finalize } from 'rxjs';
|
|
@@ -13,20 +12,19 @@ import * as i0 from "@angular/core";
|
|
|
13
12
|
import * as i1 from "../../proxy/dignite/file-explorer/files";
|
|
14
13
|
import * as i2 from "@abp/ng.theme.shared";
|
|
15
14
|
import * as i3 from "@abp/ng.core";
|
|
16
|
-
import * as i4 from "
|
|
17
|
-
import * as i5 from "@angular/
|
|
18
|
-
import * as i6 from "@
|
|
19
|
-
import * as i7 from "@
|
|
20
|
-
import * as i8 from "
|
|
21
|
-
import * as i9 from "
|
|
22
|
-
import * as i10 from "../../
|
|
23
|
-
import * as i11 from "../../pipe/
|
|
15
|
+
import * as i4 from "@angular/forms";
|
|
16
|
+
import * as i5 from "@angular/common";
|
|
17
|
+
import * as i6 from "@swimlane/ngx-datatable";
|
|
18
|
+
import * as i7 from "@ngx-validate/core";
|
|
19
|
+
import * as i8 from "../file-modal-tree/file-modal-tree.component";
|
|
20
|
+
import * as i9 from "../../previews/file-preview.component";
|
|
21
|
+
import * as i10 from "../../pipe/get-directory-name.pipe";
|
|
22
|
+
import * as i11 from "../../pipe/format-file-size.pipe";
|
|
24
23
|
export class FileModalComponent {
|
|
25
|
-
constructor(_FileService, toaster, list,
|
|
24
|
+
constructor(_FileService, toaster, list, restService, confirmation, _LocalizationService) {
|
|
26
25
|
this._FileService = _FileService;
|
|
27
26
|
this.toaster = toaster;
|
|
28
27
|
this.list = list;
|
|
29
|
-
this._FileApiService = _FileApiService;
|
|
30
28
|
this.restService = restService;
|
|
31
29
|
this.confirmation = confirmation;
|
|
32
30
|
this._LocalizationService = _LocalizationService;
|
|
@@ -136,7 +134,7 @@ export class FileModalComponent {
|
|
|
136
134
|
}
|
|
137
135
|
/**模态框保存 */
|
|
138
136
|
modalSave() {
|
|
139
|
-
const selectedTablearr =
|
|
137
|
+
const selectedTablearr = structuredClone(this.selectedTable);
|
|
140
138
|
this.selectFilefn.emit(selectedTablearr);
|
|
141
139
|
this.ModalVisibleChange(false);
|
|
142
140
|
}
|
|
@@ -335,8 +333,6 @@ export class FileModalComponent {
|
|
|
335
333
|
: `${failedItems.length}个项删除失败`,
|
|
336
334
|
};
|
|
337
335
|
}
|
|
338
|
-
// 使用示例
|
|
339
|
-
async handleBatchDelete() { }
|
|
340
336
|
/**关闭文件状态弹窗 */
|
|
341
337
|
closeFileStatusModal() {
|
|
342
338
|
this.uploadPictureStatusList = [];
|
|
@@ -344,7 +340,7 @@ export class FileModalComponent {
|
|
|
344
340
|
ngOnChanges(changes) {
|
|
345
341
|
//Called before any other lifecycle hook. Use it to inject dependencies, but avoid any serious work here.
|
|
346
342
|
//Add '${implements OnChanges}' to the class.
|
|
347
|
-
this.selectedTable =
|
|
343
|
+
this.selectedTable = structuredClone(this.selectPickerFile);
|
|
348
344
|
}
|
|
349
345
|
/**表格分页切换 */
|
|
350
346
|
onPageChange(newArray) {
|
|
@@ -444,7 +440,7 @@ export class FileModalComponent {
|
|
|
444
440
|
this.newEditRow = '';
|
|
445
441
|
this.FileNameForm = undefined;
|
|
446
442
|
}
|
|
447
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: FileModalComponent, deps: [{ token: i1.FileDescriptorService }, { token: i2.ToasterService }, { token: i3.ListService }, { token:
|
|
443
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: FileModalComponent, deps: [{ token: i1.FileDescriptorService }, { token: i2.ToasterService }, { token: i3.ListService }, { token: i3.RestService }, { token: i2.ConfirmationService }, { token: i3.LocalizationService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
448
444
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.5", type: FileModalComponent, selector: "fe-file-modal", inputs: { fileContainerName: "fileContainerName", multiple: "multiple", limit: "limit", visible: "visible", selectPickerFile: "selectPickerFile" }, outputs: { visibleChange: "visibleChange", selectFilefn: "selectFilefn" }, providers: [
|
|
449
445
|
// [Required]
|
|
450
446
|
ListService,
|
|
@@ -452,7 +448,7 @@ export class FileModalComponent {
|
|
|
452
448
|
// Provide this token if you want a different debounce time.
|
|
453
449
|
// Default is 300. Cannot be 0. Any value below 100 is not recommended.
|
|
454
450
|
{ provide: LIST_QUERY_DEBOUNCE_TIME, useValue: 500 },
|
|
455
|
-
], usesOnChanges: true, ngImport: i0, template: "<abp-modal [(visible)]=\"ModalOpen\" (visibleChange)=\"ModalVisibleChange($event)\"\n [options]=\"{ size: 'xl', scrollable: false }\">\n <ng-template #abpHeader>\n <h3>{{'FileExplorer::FileExplorer' | abpLocalization}}</h3>\n </ng-template>\n <ng-template #abpBody>\n <div class=\"row file-explorer-modal-body file-modal\" *ngIf=\"ModalOpen\">\n <div class=\"col-3\" *ngIf=\"createDirectoryPermissionName\" style=\"overflow: auto; height: calc(100vh - 240px)\">\n <fe-file-modal-tree [theSelectedTreeNode]=\"_theSelectedTreeNode\" (nodeClick)=\"_nodeClick($event)\"\n (lookAllBtn)=\"lookAllFile()\" (treeNodeData)=\"treeNodeData($event)\"\n [fileContainerName]=\"_fileContainerName\"></fe-file-modal-tree>\n </div>\n <div [class]=\"createDirectoryPermissionName?'col-9':'col-12'\" style=\"height: calc(100vh - 240px)\">\n <div class=\"mb-3 d-flex justify-content-between align-items-center\">\n <div style=\"flex: 2\"><span *ngIf=\"selectedTable.length>1\" class=\"btn-link\"\n (click.stop)=\"onDeleteAllSelectFile()\" role=\"button\">{{'FileExplorer::Delete' | abpLocalization}}</span>\n </div>\n <div class=\"input-group form-file\" style=\"flex: 2\">\n <input type=\"file\" class=\"form-control\" #fileEdit [multiple]=\"_multiple\" (change)=\"getFileChange($event)\" />\n </div>\n </div>\n <div>\n <!-- [selectionType]=\"_multiple?SelectionType.checkbox:SelectionType.single\" -->\n <!-- [selectCheck]=\"selectCheck\" -->\n <ngx-datatable class=\"material container-height\" [rows]=\"data.items\" [list]=\"list\" columnMode=\"flex\"\n [headerHeight]=\"50\" [footerHeight]=\"50\" rowHeight=\"auto\" [scrollbarV]=\"true\" [virtualization]=\"false\"\n [externalPaging]=\"true\" [count]=\"data.totalCount\">\n <ngx-datatable-column [width]=\"50\" prop=\"id\" [sortable]=\"false\" [canAutoResize]=\"false\" [draggable]=\"false\"\n [resizeable]=\"false\">\n <ng-template ngx-datatable-header-template let-value=\"value\" let-allRowsSelected=\"allRowsSelected\"\n let-selectFn=\"selectFn\">\n <input type=\"checkbox\" class=\"form-check-input\" *ngIf=\"_multiple\" [checked]=\"isAllSelected\"\n (change)=\"onSelectAllFn($event,data.items)\" />\n </ng-template>\n <ng-template ngx-datatable-cell-template let-row=\"row\" let-value=\"value\">\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"selectedcheckbox(value)\"\n (change)=\"onCheckboxChangeFn($event,row,data.items)\" />\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [sortable]=\"false\" [flexGrow]=\"2\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <fe-file-preview [width]=\"'80px'\" [src]=\"row.url\" [name]=\"row.name\" [type]=\"row.mimeType\"\n [preview]=\"true\"></fe-file-preview>\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::FileName' | abpLocalization\" prop=\"name\" [sortable]=\"false\"\n [flexGrow]=\"4\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <div class=\"d-flex align-items-start titlehover\" *ngIf=\"newEditRow.id!==row.id\">\n <span class=\"me-2\">{{ value }}</span>\n <i class=\"fa fa-pencil-square-o\" role=\"button\" (click.stop)=\"onEditFileName(row)\" style=\"line-height:2;\" aria-hidden=\"true\"></i>\n </div>\n <div *ngIf=\"FileNameForm&&newEditRow.id===row.id\">\n <form [formGroup]=\"FileNameForm\" (ngSubmit)=\"onSubmitFileName($event)\">\n <div class=\"d-flex align-items-start\">\n <div class=\"me-2\">\n <input class=\"form-control \" type=\"text\" formControlName=\"fileName\">\n </div>\n <button class=\" btn btn-sm\" type=\"submit\">\n <i class=\"fa-spin fa fa-spinner\" *ngIf=\"isloading\"></i>\n <i class=\"fa fa-check\" aria-hidden=\"true\" *ngIf=\"!isloading\"></i></button>\n <button class=\" btn btn-sm\" (click.stop)=\"onCancelFileName(row)\"><i class=\"fa fa-times\" type=\"reset\" aria-hidden=\"true\"></i></button>\n \n </div>\n </form>\n </div>\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::FileSize' | abpLocalization\" prop=\"size\" [flexGrow]=\"1.5\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ _FileApiService.formatFileSize(value) }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::Directory' | abpLocalization\" prop=\"directoryId\"\n [sortable]=\"false\" [flexGrow]=\"1\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value|getDirectoryName:fileGroupList }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::CreationTime' | abpLocalization\" prop=\"creationTime\"\n [flexGrow]=\"2\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value | date : 'YYYY/MM/dd HH:mm:s' }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [flexGrow]=\"1\" [sortable]=\"false\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <button class=\"btn btn-sm btn-light p-0\" (click.stop)=\"deleteFile(row)\">\n <i class=\"fas fa-trash text-primary p-2\"></i>\n </button>\n </ng-template>\n </ngx-datatable-column>\n </ngx-datatable>\n </div>\n <div *ngIf=\"uploadPictureStatusList.length > 0\"\n class=\"position-fixed bottom-0 end-0 shadow-lg file-status-modal m-5\" style=\"border-radius: 10px\">\n <div class=\"card p-1\">\n <div class=\"card-header d-flex align-items-center justify-content-between p-0 py-1 border-bottom\">\n <div>{{'FileExplorer::UploadFiles' | abpLocalization}}</div>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click.stop)=\"closeFileStatusModal()\"></button>\n </div>\n <div class=\"card-body\">\n <table class=\"table\">\n <thead>\n <tr>\n <th scope=\"col\">{{'FileExplorer::FileName' | abpLocalization}}</th>\n <th scope=\"col\">{{'FileExplorer::FileSize' | abpLocalization}}</th>\n <th scope=\"col\"></th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of uploadPictureStatusList; let i = index\">\n <tr>\n <th scope=\"row\">\n <div>{{ item.name }}</div>\n <div class=\"form-text text-danger\" *ngIf=\"item.size > sizeLimit\">\n {{'FileExplorer::ExceedsMaximumSize' |\n abpLocalization:_FileApiService.formatFileSize(sizeLimit)}}\n </div>\n </th>\n <td>{{ item.fileSize }}</td>\n <td>\n <i *ngIf=\"item.status === 1\" class=\"fas fa-check text-primary\"></i>\n <i *ngIf=\"item.status === 2\" class=\"fas fa-times-circle text-danger\"></i>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n <ng-template #abpFooter>\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\n <abp-button iconClass=\"fa fa-check\" (click)=\"modalSave()\">{{'FileExplorer::Confirm' | abpLocalization}}\n @if(selectedTable.length>0){\n ({{selectedTable.length}})\n }\n </abp-button>\n </ng-template>\n</abp-modal>", styles: ["::ng-deep .file-modal .container-height{height:calc(100vh - 284px)}::ng-deep .file-modal .file-status-modal{background:#fff}::ng-deep .file-modal .file-status-modal .card-body{max-height:300px;overflow-y:auto}::ng-deep .file-modal .ngx-datatable.material.single-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.single-selection .datatable-body-row.active .datatable-row-group,::ng-deep .file-modal .ngx-datatable.material.multi-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.multi-selection .datatable-body-row.active .datatable-row-group,::ng-deep .file-modal .ngx-datatable.material.multi-click-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.multi-click-selection .datatable-body-row.active .datatable-row-group{background-color:transparent!important}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper{padding:0}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .ng-star-inserted[title]{padding:0 10px}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .custom-node{width:100%}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .selected{background-color:var(--lpx-brand)!important;color:var(--lpx-brand-text)}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected{background-color:transparent}::ng-deep .file-modal .ngx-datatable.fixed-header .datatable-header .datatable-header-inner .datatable-header-cell,::ng-deep .file-modal .ngx-datatable.material .datatable-body .datatable-body-row .datatable-body-cell{overflow:initial;line-break:anywhere}::ng-deep .file-modal input[type=checkbox]{cursor:pointer}::ng-deep .file-modal .titlehover i{display:none}::ng-deep .file-modal .titlehover:hover i{display:block}\n"], dependencies: [{ kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormSubmitDirective, selector: "form[ngSubmit][formGroup]", inputs: ["debounce", "notValidateOnSubmit", "markAsDirtyWhenSubmit"], outputs: ["ngSubmit"] }, { kind: "directive", type: i3.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "component", type: i7.DatatableComponent, selector: "ngx-datatable", inputs: ["targetMarkerTemplate", "rows", "groupRowsBy", "groupedRows", "columns", "selected", "scrollbarV", "scrollbarH", "rowHeight", "columnMode", "headerHeight", "footerHeight", "externalPaging", "externalSorting", "limit", "count", "offset", "loadingIndicator", "selectionType", "reorderable", "swapColumns", "sortType", "sorts", "cssClasses", "messages", "rowClass", "selectCheck", "displayCheck", "groupExpansionDefault", "trackByProp", "selectAllRowsOnPage", "virtualization", "treeFromRelation", "treeToRelation", "summaryRow", "summaryHeight", "summaryPosition", "rowIdentity"], outputs: ["scroll", "activate", "select", "sort", "page", "reorder", "resize", "tableContextmenu", "treeAction"] }, { kind: "directive", type: i7.DataTableColumnDirective, selector: "ngx-datatable-column", inputs: ["name", "prop", "frozenLeft", "frozenRight", "flexGrow", "resizeable", "comparator", "pipe", "sortable", "draggable", "canAutoResize", "minWidth", "width", "maxWidth", "checkboxable", "headerCheckboxable", "headerClass", "cellClass", "isTreeColumn", "treeLevelIndent", "summaryFunc", "summaryTemplate", "cellTemplate", "headerTemplate", "treeToggleTemplate"] }, { kind: "directive", type: i7.DataTableColumnHeaderDirective, selector: "[ngx-datatable-header-template]" }, { kind: "directive", type: i7.DataTableColumnCellDirective, selector: "[ngx-datatable-cell-template]" }, { kind: "directive", type: i8.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i8.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "directive", type: i2.NgxDatatableListDirective, selector: "ngx-datatable[list]", inputs: ["list"], exportAs: ["ngxDatatableList"] }, { kind: "component", type: i2.ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "component", type: i2.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: i2.ModalCloseDirective, selector: "[abpClose]" }, { kind: "component", type: i9.FileModalTreeComponent, selector: "fe-file-modal-tree", inputs: ["theSelectedTreeNode", "fileContainerName"], outputs: ["nodeClick", "treeNodeData", "lookAllBtn"] }, { kind: "component", type: i10.FilePreviewComponent, selector: "fe-file-preview", inputs: ["width", "src", "preview", "type", "name", "className"] }, { kind: "pipe", type: i6.DatePipe, name: "date" }, { kind: "pipe", type: i3.LocalizationPipe, name: "abpLocalization" }, { kind: "pipe", type: i11.GetDirectoryNamePipe, name: "getDirectoryName" }] }); }
|
|
451
|
+
], usesOnChanges: true, ngImport: i0, template: "<abp-modal [(visible)]=\"ModalOpen\" (visibleChange)=\"ModalVisibleChange($event)\"\n [options]=\"{ size: 'xl', scrollable: false }\">\n <ng-template #abpHeader>\n <h3>{{'FileExplorer::FileExplorer' | abpLocalization}}</h3>\n </ng-template>\n <ng-template #abpBody>\n <div class=\"row file-explorer-modal-body file-modal\" *ngIf=\"ModalOpen\">\n <div class=\"col-3\" *ngIf=\"createDirectoryPermissionName\" style=\"overflow: auto; height: calc(100vh - 240px)\">\n <fe-file-modal-tree [theSelectedTreeNode]=\"_theSelectedTreeNode\" (nodeClick)=\"_nodeClick($event)\"\n (lookAllBtn)=\"lookAllFile()\" (treeNodeData)=\"treeNodeData($event)\"\n [fileContainerName]=\"_fileContainerName\"></fe-file-modal-tree>\n </div>\n <div [class]=\"createDirectoryPermissionName?'col-9':'col-12'\" style=\"height: calc(100vh - 240px)\">\n <div class=\"mb-3 d-flex justify-content-between align-items-center\">\n <div style=\"flex: 2\"><span *ngIf=\"selectedTable.length>1\" class=\"btn-link\"\n (click.stop)=\"onDeleteAllSelectFile()\" role=\"button\">{{'FileExplorer::Delete' | abpLocalization}}</span>\n </div>\n <div class=\"input-group form-file\" style=\"flex: 2\">\n <input type=\"file\" class=\"form-control\" #fileEdit [multiple]=\"_multiple\" (change)=\"getFileChange($event)\" />\n </div>\n </div>\n <div>\n <!-- [selectionType]=\"_multiple?SelectionType.checkbox:SelectionType.single\" -->\n <!-- [selectCheck]=\"selectCheck\" -->\n <ngx-datatable class=\"material container-height\" [rows]=\"data.items\" [list]=\"list\" columnMode=\"flex\"\n [headerHeight]=\"50\" [footerHeight]=\"50\" rowHeight=\"auto\" [scrollbarV]=\"true\" [virtualization]=\"false\"\n [externalPaging]=\"true\" [count]=\"data.totalCount\">\n <ngx-datatable-column [width]=\"50\" prop=\"id\" [sortable]=\"false\" [canAutoResize]=\"false\" [draggable]=\"false\"\n [resizeable]=\"false\">\n <ng-template ngx-datatable-header-template let-value=\"value\" let-allRowsSelected=\"allRowsSelected\"\n let-selectFn=\"selectFn\">\n <input type=\"checkbox\" class=\"form-check-input\" *ngIf=\"_multiple\" [checked]=\"isAllSelected\"\n (change)=\"onSelectAllFn($event,data.items)\" />\n </ng-template>\n <ng-template ngx-datatable-cell-template let-row=\"row\" let-value=\"value\">\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"selectedcheckbox(value)\"\n (change)=\"onCheckboxChangeFn($event,row,data.items)\" />\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [sortable]=\"false\" [flexGrow]=\"2\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <fe-file-preview [width]=\"'80px'\" [src]=\"row.url\" [name]=\"row.name\" [type]=\"row.mimeType\"\n [preview]=\"true\"></fe-file-preview>\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::FileName' | abpLocalization\" prop=\"name\" [sortable]=\"false\"\n [flexGrow]=\"4\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <div class=\"d-flex align-items-start titlehover\" *ngIf=\"newEditRow.id!==row.id\">\n <span class=\"me-2\">{{ value }}</span>\n <i class=\"fa fa-pencil-square-o\" role=\"button\" (click.stop)=\"onEditFileName(row)\" style=\"line-height:2;\" aria-hidden=\"true\"></i>\n </div>\n <div *ngIf=\"FileNameForm&&newEditRow.id===row.id\">\n <form [formGroup]=\"FileNameForm\" (ngSubmit)=\"onSubmitFileName($event)\">\n <div class=\"d-flex align-items-start\">\n <div class=\"me-2\">\n <input class=\"form-control \" type=\"text\" formControlName=\"fileName\">\n </div>\n <button class=\" btn btn-sm\" type=\"submit\">\n <i class=\"fa-spin fa fa-spinner\" *ngIf=\"isloading\"></i>\n <i class=\"fa fa-check\" aria-hidden=\"true\" *ngIf=\"!isloading\"></i></button>\n <button class=\" btn btn-sm\" (click.stop)=\"onCancelFileName(row)\"><i class=\"fa fa-times\" type=\"reset\" aria-hidden=\"true\"></i></button>\n \n </div>\n </form>\n </div>\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::FileSize' | abpLocalization\" prop=\"size\" [flexGrow]=\"1.5\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{(value|formatFileSize) }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::Directory' | abpLocalization\" prop=\"directoryId\"\n [sortable]=\"false\" [flexGrow]=\"1\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value|getDirectoryName:fileGroupList }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::CreationTime' | abpLocalization\" prop=\"creationTime\"\n [flexGrow]=\"2\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value | date : 'YYYY/MM/dd HH:mm:s' }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [flexGrow]=\"1\" [sortable]=\"false\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <button class=\"btn btn-sm btn-light p-0\" (click.stop)=\"deleteFile(row)\">\n <i class=\"fas fa-trash text-primary p-2\"></i>\n </button>\n </ng-template>\n </ngx-datatable-column>\n </ngx-datatable>\n </div>\n <div *ngIf=\"uploadPictureStatusList.length > 0\"\n class=\"position-fixed bottom-0 end-0 shadow-lg file-status-modal m-5\" style=\"border-radius: 10px\">\n <div class=\"card p-1\">\n <div class=\"card-header d-flex align-items-center justify-content-between p-0 py-1 border-bottom\">\n <div>{{'FileExplorer::UploadFiles' | abpLocalization}}</div>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click.stop)=\"closeFileStatusModal()\"></button>\n </div>\n <div class=\"card-body\">\n <table class=\"table\">\n <thead>\n <tr>\n <th scope=\"col\">{{'FileExplorer::FileName' | abpLocalization}}</th>\n <th scope=\"col\">{{'FileExplorer::FileSize' | abpLocalization}}</th>\n <th scope=\"col\"></th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of uploadPictureStatusList; let i = index\">\n <tr>\n <th scope=\"row\">\n <div>{{ item.name }}</div>\n <div class=\"form-text text-danger\" *ngIf=\"item.size > sizeLimit\">\n {{'FileExplorer::ExceedsMaximumSize' |\n abpLocalization:(sizeLimit|formatFileSize)}}\n </div>\n </th>\n <td>{{ item.size | formatFileSize }}</td>\n <td>\n <i *ngIf=\"item.status === 1\" class=\"fas fa-check text-primary\"></i>\n <i *ngIf=\"item.status === 2\" class=\"fas fa-times-circle text-danger\"></i>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n <ng-template #abpFooter>\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\n <abp-button iconClass=\"fa fa-check\" (click)=\"modalSave()\">{{'FileExplorer::Confirm' | abpLocalization}}\n @if(selectedTable.length>0){\n ({{selectedTable.length}})\n }\n </abp-button>\n </ng-template>\n</abp-modal>", styles: ["::ng-deep .file-modal .container-height{height:calc(100vh - 284px)}::ng-deep .file-modal .file-status-modal{background:#fff}::ng-deep .file-modal .file-status-modal .card-body{max-height:300px;overflow-y:auto}::ng-deep .file-modal .ngx-datatable.material.single-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.single-selection .datatable-body-row.active .datatable-row-group,::ng-deep .file-modal .ngx-datatable.material.multi-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.multi-selection .datatable-body-row.active .datatable-row-group,::ng-deep .file-modal .ngx-datatable.material.multi-click-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.multi-click-selection .datatable-body-row.active .datatable-row-group{background-color:transparent!important}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper{padding:0}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .ng-star-inserted[title]{padding:0 10px}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .custom-node{width:100%}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .selected{background-color:var(--lpx-brand)!important;color:var(--lpx-brand-text)}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected{background-color:transparent}::ng-deep .file-modal .ngx-datatable.fixed-header .datatable-header .datatable-header-inner .datatable-header-cell,::ng-deep .file-modal .ngx-datatable.material .datatable-body .datatable-body-row .datatable-body-cell{overflow:initial;line-break:anywhere}::ng-deep .file-modal input[type=checkbox]{cursor:pointer}::ng-deep .file-modal .titlehover i{display:none}::ng-deep .file-modal .titlehover:hover i{display:block}\n"], dependencies: [{ kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormSubmitDirective, selector: "form[ngSubmit][formGroup]", inputs: ["debounce", "notValidateOnSubmit", "markAsDirtyWhenSubmit"], outputs: ["ngSubmit"] }, { kind: "directive", type: i3.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "component", type: i6.DatatableComponent, selector: "ngx-datatable", inputs: ["targetMarkerTemplate", "rows", "groupRowsBy", "groupedRows", "columns", "selected", "scrollbarV", "scrollbarH", "rowHeight", "columnMode", "headerHeight", "footerHeight", "externalPaging", "externalSorting", "limit", "count", "offset", "loadingIndicator", "selectionType", "reorderable", "swapColumns", "sortType", "sorts", "cssClasses", "messages", "rowClass", "selectCheck", "displayCheck", "groupExpansionDefault", "trackByProp", "selectAllRowsOnPage", "virtualization", "treeFromRelation", "treeToRelation", "summaryRow", "summaryHeight", "summaryPosition", "rowIdentity"], outputs: ["scroll", "activate", "select", "sort", "page", "reorder", "resize", "tableContextmenu", "treeAction"] }, { kind: "directive", type: i6.DataTableColumnDirective, selector: "ngx-datatable-column", inputs: ["name", "prop", "frozenLeft", "frozenRight", "flexGrow", "resizeable", "comparator", "pipe", "sortable", "draggable", "canAutoResize", "minWidth", "width", "maxWidth", "checkboxable", "headerCheckboxable", "headerClass", "cellClass", "isTreeColumn", "treeLevelIndent", "summaryFunc", "summaryTemplate", "cellTemplate", "headerTemplate", "treeToggleTemplate"] }, { kind: "directive", type: i6.DataTableColumnHeaderDirective, selector: "[ngx-datatable-header-template]" }, { kind: "directive", type: i6.DataTableColumnCellDirective, selector: "[ngx-datatable-cell-template]" }, { kind: "directive", type: i7.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i7.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "directive", type: i2.NgxDatatableListDirective, selector: "ngx-datatable[list]", inputs: ["list"], exportAs: ["ngxDatatableList"] }, { kind: "component", type: i2.ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "component", type: i2.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: i2.ModalCloseDirective, selector: "[abpClose]" }, { kind: "component", type: i8.FileModalTreeComponent, selector: "fe-file-modal-tree", inputs: ["theSelectedTreeNode", "fileContainerName"], outputs: ["nodeClick", "treeNodeData", "lookAllBtn"] }, { kind: "component", type: i9.FilePreviewComponent, selector: "fe-file-preview", inputs: ["width", "src", "preview", "type", "name", "className"] }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "pipe", type: i3.LocalizationPipe, name: "abpLocalization" }, { kind: "pipe", type: i10.GetDirectoryNamePipe, name: "getDirectoryName" }, { kind: "pipe", type: i11.FormatFileSizePipe, name: "formatFileSize" }] }); }
|
|
456
452
|
}
|
|
457
453
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: FileModalComponent, decorators: [{
|
|
458
454
|
type: Component,
|
|
@@ -463,8 +459,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImpor
|
|
|
463
459
|
// Provide this token if you want a different debounce time.
|
|
464
460
|
// Default is 300. Cannot be 0. Any value below 100 is not recommended.
|
|
465
461
|
{ provide: LIST_QUERY_DEBOUNCE_TIME, useValue: 500 },
|
|
466
|
-
], template: "<abp-modal [(visible)]=\"ModalOpen\" (visibleChange)=\"ModalVisibleChange($event)\"\n [options]=\"{ size: 'xl', scrollable: false }\">\n <ng-template #abpHeader>\n <h3>{{'FileExplorer::FileExplorer' | abpLocalization}}</h3>\n </ng-template>\n <ng-template #abpBody>\n <div class=\"row file-explorer-modal-body file-modal\" *ngIf=\"ModalOpen\">\n <div class=\"col-3\" *ngIf=\"createDirectoryPermissionName\" style=\"overflow: auto; height: calc(100vh - 240px)\">\n <fe-file-modal-tree [theSelectedTreeNode]=\"_theSelectedTreeNode\" (nodeClick)=\"_nodeClick($event)\"\n (lookAllBtn)=\"lookAllFile()\" (treeNodeData)=\"treeNodeData($event)\"\n [fileContainerName]=\"_fileContainerName\"></fe-file-modal-tree>\n </div>\n <div [class]=\"createDirectoryPermissionName?'col-9':'col-12'\" style=\"height: calc(100vh - 240px)\">\n <div class=\"mb-3 d-flex justify-content-between align-items-center\">\n <div style=\"flex: 2\"><span *ngIf=\"selectedTable.length>1\" class=\"btn-link\"\n (click.stop)=\"onDeleteAllSelectFile()\" role=\"button\">{{'FileExplorer::Delete' | abpLocalization}}</span>\n </div>\n <div class=\"input-group form-file\" style=\"flex: 2\">\n <input type=\"file\" class=\"form-control\" #fileEdit [multiple]=\"_multiple\" (change)=\"getFileChange($event)\" />\n </div>\n </div>\n <div>\n <!-- [selectionType]=\"_multiple?SelectionType.checkbox:SelectionType.single\" -->\n <!-- [selectCheck]=\"selectCheck\" -->\n <ngx-datatable class=\"material container-height\" [rows]=\"data.items\" [list]=\"list\" columnMode=\"flex\"\n [headerHeight]=\"50\" [footerHeight]=\"50\" rowHeight=\"auto\" [scrollbarV]=\"true\" [virtualization]=\"false\"\n [externalPaging]=\"true\" [count]=\"data.totalCount\">\n <ngx-datatable-column [width]=\"50\" prop=\"id\" [sortable]=\"false\" [canAutoResize]=\"false\" [draggable]=\"false\"\n [resizeable]=\"false\">\n <ng-template ngx-datatable-header-template let-value=\"value\" let-allRowsSelected=\"allRowsSelected\"\n let-selectFn=\"selectFn\">\n <input type=\"checkbox\" class=\"form-check-input\" *ngIf=\"_multiple\" [checked]=\"isAllSelected\"\n (change)=\"onSelectAllFn($event,data.items)\" />\n </ng-template>\n <ng-template ngx-datatable-cell-template let-row=\"row\" let-value=\"value\">\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"selectedcheckbox(value)\"\n (change)=\"onCheckboxChangeFn($event,row,data.items)\" />\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [sortable]=\"false\" [flexGrow]=\"2\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <fe-file-preview [width]=\"'80px'\" [src]=\"row.url\" [name]=\"row.name\" [type]=\"row.mimeType\"\n [preview]=\"true\"></fe-file-preview>\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::FileName' | abpLocalization\" prop=\"name\" [sortable]=\"false\"\n [flexGrow]=\"4\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <div class=\"d-flex align-items-start titlehover\" *ngIf=\"newEditRow.id!==row.id\">\n <span class=\"me-2\">{{ value }}</span>\n <i class=\"fa fa-pencil-square-o\" role=\"button\" (click.stop)=\"onEditFileName(row)\" style=\"line-height:2;\" aria-hidden=\"true\"></i>\n </div>\n <div *ngIf=\"FileNameForm&&newEditRow.id===row.id\">\n <form [formGroup]=\"FileNameForm\" (ngSubmit)=\"onSubmitFileName($event)\">\n <div class=\"d-flex align-items-start\">\n <div class=\"me-2\">\n <input class=\"form-control \" type=\"text\" formControlName=\"fileName\">\n </div>\n <button class=\" btn btn-sm\" type=\"submit\">\n <i class=\"fa-spin fa fa-spinner\" *ngIf=\"isloading\"></i>\n <i class=\"fa fa-check\" aria-hidden=\"true\" *ngIf=\"!isloading\"></i></button>\n <button class=\" btn btn-sm\" (click.stop)=\"onCancelFileName(row)\"><i class=\"fa fa-times\" type=\"reset\" aria-hidden=\"true\"></i></button>\n \n </div>\n </form>\n </div>\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::FileSize' | abpLocalization\" prop=\"size\" [flexGrow]=\"1.5\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ _FileApiService.formatFileSize(value) }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::Directory' | abpLocalization\" prop=\"directoryId\"\n [sortable]=\"false\" [flexGrow]=\"1\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value|getDirectoryName:fileGroupList }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::CreationTime' | abpLocalization\" prop=\"creationTime\"\n [flexGrow]=\"2\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value | date : 'YYYY/MM/dd HH:mm:s' }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [flexGrow]=\"1\" [sortable]=\"false\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <button class=\"btn btn-sm btn-light p-0\" (click.stop)=\"deleteFile(row)\">\n <i class=\"fas fa-trash text-primary p-2\"></i>\n </button>\n </ng-template>\n </ngx-datatable-column>\n </ngx-datatable>\n </div>\n <div *ngIf=\"uploadPictureStatusList.length > 0\"\n class=\"position-fixed bottom-0 end-0 shadow-lg file-status-modal m-5\" style=\"border-radius: 10px\">\n <div class=\"card p-1\">\n <div class=\"card-header d-flex align-items-center justify-content-between p-0 py-1 border-bottom\">\n <div>{{'FileExplorer::UploadFiles' | abpLocalization}}</div>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click.stop)=\"closeFileStatusModal()\"></button>\n </div>\n <div class=\"card-body\">\n <table class=\"table\">\n <thead>\n <tr>\n <th scope=\"col\">{{'FileExplorer::FileName' | abpLocalization}}</th>\n <th scope=\"col\">{{'FileExplorer::FileSize' | abpLocalization}}</th>\n <th scope=\"col\"></th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of uploadPictureStatusList; let i = index\">\n <tr>\n <th scope=\"row\">\n <div>{{ item.name }}</div>\n <div class=\"form-text text-danger\" *ngIf=\"item.size > sizeLimit\">\n {{'FileExplorer::ExceedsMaximumSize' |\n abpLocalization:_FileApiService.formatFileSize(sizeLimit)}}\n </div>\n </th>\n <td>{{ item.fileSize }}</td>\n <td>\n <i *ngIf=\"item.status === 1\" class=\"fas fa-check text-primary\"></i>\n <i *ngIf=\"item.status === 2\" class=\"fas fa-times-circle text-danger\"></i>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n <ng-template #abpFooter>\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\n <abp-button iconClass=\"fa fa-check\" (click)=\"modalSave()\">{{'FileExplorer::Confirm' | abpLocalization}}\n @if(selectedTable.length>0){\n ({{selectedTable.length}})\n }\n </abp-button>\n </ng-template>\n</abp-modal>", styles: ["::ng-deep .file-modal .container-height{height:calc(100vh - 284px)}::ng-deep .file-modal .file-status-modal{background:#fff}::ng-deep .file-modal .file-status-modal .card-body{max-height:300px;overflow-y:auto}::ng-deep .file-modal .ngx-datatable.material.single-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.single-selection .datatable-body-row.active .datatable-row-group,::ng-deep .file-modal .ngx-datatable.material.multi-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.multi-selection .datatable-body-row.active .datatable-row-group,::ng-deep .file-modal .ngx-datatable.material.multi-click-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.multi-click-selection .datatable-body-row.active .datatable-row-group{background-color:transparent!important}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper{padding:0}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .ng-star-inserted[title]{padding:0 10px}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .custom-node{width:100%}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .selected{background-color:var(--lpx-brand)!important;color:var(--lpx-brand-text)}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected{background-color:transparent}::ng-deep .file-modal .ngx-datatable.fixed-header .datatable-header .datatable-header-inner .datatable-header-cell,::ng-deep .file-modal .ngx-datatable.material .datatable-body .datatable-body-row .datatable-body-cell{overflow:initial;line-break:anywhere}::ng-deep .file-modal input[type=checkbox]{cursor:pointer}::ng-deep .file-modal .titlehover i{display:none}::ng-deep .file-modal .titlehover:hover i{display:block}\n"] }]
|
|
467
|
-
}], ctorParameters: () => [{ type: i1.FileDescriptorService }, { type: i2.ToasterService }, { type: i3.ListService }, { type:
|
|
462
|
+
], template: "<abp-modal [(visible)]=\"ModalOpen\" (visibleChange)=\"ModalVisibleChange($event)\"\n [options]=\"{ size: 'xl', scrollable: false }\">\n <ng-template #abpHeader>\n <h3>{{'FileExplorer::FileExplorer' | abpLocalization}}</h3>\n </ng-template>\n <ng-template #abpBody>\n <div class=\"row file-explorer-modal-body file-modal\" *ngIf=\"ModalOpen\">\n <div class=\"col-3\" *ngIf=\"createDirectoryPermissionName\" style=\"overflow: auto; height: calc(100vh - 240px)\">\n <fe-file-modal-tree [theSelectedTreeNode]=\"_theSelectedTreeNode\" (nodeClick)=\"_nodeClick($event)\"\n (lookAllBtn)=\"lookAllFile()\" (treeNodeData)=\"treeNodeData($event)\"\n [fileContainerName]=\"_fileContainerName\"></fe-file-modal-tree>\n </div>\n <div [class]=\"createDirectoryPermissionName?'col-9':'col-12'\" style=\"height: calc(100vh - 240px)\">\n <div class=\"mb-3 d-flex justify-content-between align-items-center\">\n <div style=\"flex: 2\"><span *ngIf=\"selectedTable.length>1\" class=\"btn-link\"\n (click.stop)=\"onDeleteAllSelectFile()\" role=\"button\">{{'FileExplorer::Delete' | abpLocalization}}</span>\n </div>\n <div class=\"input-group form-file\" style=\"flex: 2\">\n <input type=\"file\" class=\"form-control\" #fileEdit [multiple]=\"_multiple\" (change)=\"getFileChange($event)\" />\n </div>\n </div>\n <div>\n <!-- [selectionType]=\"_multiple?SelectionType.checkbox:SelectionType.single\" -->\n <!-- [selectCheck]=\"selectCheck\" -->\n <ngx-datatable class=\"material container-height\" [rows]=\"data.items\" [list]=\"list\" columnMode=\"flex\"\n [headerHeight]=\"50\" [footerHeight]=\"50\" rowHeight=\"auto\" [scrollbarV]=\"true\" [virtualization]=\"false\"\n [externalPaging]=\"true\" [count]=\"data.totalCount\">\n <ngx-datatable-column [width]=\"50\" prop=\"id\" [sortable]=\"false\" [canAutoResize]=\"false\" [draggable]=\"false\"\n [resizeable]=\"false\">\n <ng-template ngx-datatable-header-template let-value=\"value\" let-allRowsSelected=\"allRowsSelected\"\n let-selectFn=\"selectFn\">\n <input type=\"checkbox\" class=\"form-check-input\" *ngIf=\"_multiple\" [checked]=\"isAllSelected\"\n (change)=\"onSelectAllFn($event,data.items)\" />\n </ng-template>\n <ng-template ngx-datatable-cell-template let-row=\"row\" let-value=\"value\">\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"selectedcheckbox(value)\"\n (change)=\"onCheckboxChangeFn($event,row,data.items)\" />\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [sortable]=\"false\" [flexGrow]=\"2\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <fe-file-preview [width]=\"'80px'\" [src]=\"row.url\" [name]=\"row.name\" [type]=\"row.mimeType\"\n [preview]=\"true\"></fe-file-preview>\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::FileName' | abpLocalization\" prop=\"name\" [sortable]=\"false\"\n [flexGrow]=\"4\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <div class=\"d-flex align-items-start titlehover\" *ngIf=\"newEditRow.id!==row.id\">\n <span class=\"me-2\">{{ value }}</span>\n <i class=\"fa fa-pencil-square-o\" role=\"button\" (click.stop)=\"onEditFileName(row)\" style=\"line-height:2;\" aria-hidden=\"true\"></i>\n </div>\n <div *ngIf=\"FileNameForm&&newEditRow.id===row.id\">\n <form [formGroup]=\"FileNameForm\" (ngSubmit)=\"onSubmitFileName($event)\">\n <div class=\"d-flex align-items-start\">\n <div class=\"me-2\">\n <input class=\"form-control \" type=\"text\" formControlName=\"fileName\">\n </div>\n <button class=\" btn btn-sm\" type=\"submit\">\n <i class=\"fa-spin fa fa-spinner\" *ngIf=\"isloading\"></i>\n <i class=\"fa fa-check\" aria-hidden=\"true\" *ngIf=\"!isloading\"></i></button>\n <button class=\" btn btn-sm\" (click.stop)=\"onCancelFileName(row)\"><i class=\"fa fa-times\" type=\"reset\" aria-hidden=\"true\"></i></button>\n \n </div>\n </form>\n </div>\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::FileSize' | abpLocalization\" prop=\"size\" [flexGrow]=\"1.5\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{(value|formatFileSize) }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::Directory' | abpLocalization\" prop=\"directoryId\"\n [sortable]=\"false\" [flexGrow]=\"1\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value|getDirectoryName:fileGroupList }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::CreationTime' | abpLocalization\" prop=\"creationTime\"\n [flexGrow]=\"2\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value | date : 'YYYY/MM/dd HH:mm:s' }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [flexGrow]=\"1\" [sortable]=\"false\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <button class=\"btn btn-sm btn-light p-0\" (click.stop)=\"deleteFile(row)\">\n <i class=\"fas fa-trash text-primary p-2\"></i>\n </button>\n </ng-template>\n </ngx-datatable-column>\n </ngx-datatable>\n </div>\n <div *ngIf=\"uploadPictureStatusList.length > 0\"\n class=\"position-fixed bottom-0 end-0 shadow-lg file-status-modal m-5\" style=\"border-radius: 10px\">\n <div class=\"card p-1\">\n <div class=\"card-header d-flex align-items-center justify-content-between p-0 py-1 border-bottom\">\n <div>{{'FileExplorer::UploadFiles' | abpLocalization}}</div>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click.stop)=\"closeFileStatusModal()\"></button>\n </div>\n <div class=\"card-body\">\n <table class=\"table\">\n <thead>\n <tr>\n <th scope=\"col\">{{'FileExplorer::FileName' | abpLocalization}}</th>\n <th scope=\"col\">{{'FileExplorer::FileSize' | abpLocalization}}</th>\n <th scope=\"col\"></th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of uploadPictureStatusList; let i = index\">\n <tr>\n <th scope=\"row\">\n <div>{{ item.name }}</div>\n <div class=\"form-text text-danger\" *ngIf=\"item.size > sizeLimit\">\n {{'FileExplorer::ExceedsMaximumSize' |\n abpLocalization:(sizeLimit|formatFileSize)}}\n </div>\n </th>\n <td>{{ item.size | formatFileSize }}</td>\n <td>\n <i *ngIf=\"item.status === 1\" class=\"fas fa-check text-primary\"></i>\n <i *ngIf=\"item.status === 2\" class=\"fas fa-times-circle text-danger\"></i>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n <ng-template #abpFooter>\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\n <abp-button iconClass=\"fa fa-check\" (click)=\"modalSave()\">{{'FileExplorer::Confirm' | abpLocalization}}\n @if(selectedTable.length>0){\n ({{selectedTable.length}})\n }\n </abp-button>\n </ng-template>\n</abp-modal>", styles: ["::ng-deep .file-modal .container-height{height:calc(100vh - 284px)}::ng-deep .file-modal .file-status-modal{background:#fff}::ng-deep .file-modal .file-status-modal .card-body{max-height:300px;overflow-y:auto}::ng-deep .file-modal .ngx-datatable.material.single-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.single-selection .datatable-body-row.active .datatable-row-group,::ng-deep .file-modal .ngx-datatable.material.multi-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.multi-selection .datatable-body-row.active .datatable-row-group,::ng-deep .file-modal .ngx-datatable.material.multi-click-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.multi-click-selection .datatable-body-row.active .datatable-row-group{background-color:transparent!important}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper{padding:0}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .ng-star-inserted[title]{padding:0 10px}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .custom-node{width:100%}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .selected{background-color:var(--lpx-brand)!important;color:var(--lpx-brand-text)}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected{background-color:transparent}::ng-deep .file-modal .ngx-datatable.fixed-header .datatable-header .datatable-header-inner .datatable-header-cell,::ng-deep .file-modal .ngx-datatable.material .datatable-body .datatable-body-row .datatable-body-cell{overflow:initial;line-break:anywhere}::ng-deep .file-modal input[type=checkbox]{cursor:pointer}::ng-deep .file-modal .titlehover i{display:none}::ng-deep .file-modal .titlehover:hover i{display:block}\n"] }]
|
|
463
|
+
}], ctorParameters: () => [{ type: i1.FileDescriptorService }, { type: i2.ToasterService }, { type: i3.ListService }, { type: i3.RestService }, { type: i2.ConfirmationService }, { type: i3.LocalizationService }], propDecorators: { fileContainerName: [{
|
|
468
464
|
type: Input
|
|
469
465
|
}], multiple: [{
|
|
470
466
|
type: Input
|
|
@@ -479,4 +475,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImpor
|
|
|
479
475
|
}], selectPickerFile: [{
|
|
480
476
|
type: Input
|
|
481
477
|
}] } });
|
|
482
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9maWxlLWV4cGxvcmVyL3NyYy9saWIvY29tcG9uZW50cy9maWxlLW1vZGFsL2ZpbGUtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZmlsZS1leHBsb3Jlci9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1tb2RhbC9maWxlLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFEQUFxRDtBQUNyRCxzREFBc0Q7QUFDdEQsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFFTixNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLFdBQVcsTUFBTSx5Q0FBeUMsQ0FBQztBQUN2RSxPQUFPLEVBQWdCLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pGLE9BQU8sRUFHTCxXQUFXLEVBRVgsV0FBVyxFQUNYLG1CQUFtQixFQUNuQix3QkFBd0IsR0FDekIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUVMLHFCQUFxQixHQUV0QixNQUFNLHlDQUF5QyxDQUFDO0FBQ2pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7OztBQWVoQyxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLFlBQ1UsWUFBK0MsRUFDL0MsT0FBdUIsRUFDZixJQUFpQixFQUMxQixlQUErQixFQUM5QixXQUF3QixFQUN4QixZQUFpQyxFQUNqQyxvQkFBeUM7UUFOekMsaUJBQVksR0FBWixZQUFZLENBQW1DO1FBQy9DLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ2YsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUMxQixvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBcUI7UUFHM0MsMkJBQXNCLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFZL0QsYUFBYTtRQUNiLGtDQUE2QixHQUFXLElBQUksQ0FBQztRQVk3QyxVQUFVO1FBQ1YsY0FBUyxHQUFHLEtBQUssQ0FBQztRQU1sQjs7V0FFRztRQUNILGNBQVMsR0FBRyxPQUFPLENBQUM7UUFjcEIsYUFBYTtRQUNILGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUU3QyxpQkFBaUI7UUFDakIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQiw4QkFBOEI7UUFDOUIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQXNCbEIsNkJBQTZCO1FBQzdCLGVBQWU7UUFDZix5QkFBb0IsR0FBUSxFQUFFLENBQUM7UUFDL0IsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFlckIsa0JBQWtCO1FBQ2xCLGtCQUFhLEdBQVUsRUFBRSxDQUFDO1FBc0MxQix1QkFBdUI7UUFDdkIsNEJBQXVCLEdBQVUsRUFBRSxDQUFDO1FBZ0VwQyxZQUFZO1FBQ1osU0FBSSxHQUFzQztZQUN4QyxLQUFLLEVBQUUsRUFBRTtZQUNULFVBQVUsRUFBRSxDQUFDO1NBQ2QsQ0FBQztRQUVGLFlBQVk7UUFDWixZQUFPLEdBQUcsRUFBbUIsQ0FBQztRQUU5QixtQkFBbUI7UUFDbkIsa0JBQWEsR0FBRyxhQUFhLENBQUM7UUFFOUIsWUFBWTtRQUNGLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQW1IbkQsb0NBQW9DO1FBQ3BDLGVBQVUsR0FBRyxDQUFDLEtBQVUsRUFBRSxNQUE2QixFQUFFLEVBQUUsQ0FDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQ3RCO1lBQ0UsTUFBTSxFQUFFLE1BQU07WUFDZCxHQUFHLEVBQUUsMEJBQTBCO1lBQy9CLE1BQU0sRUFBRTtnQkFDTixhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7Z0JBQ2xDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtnQkFDeEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO2dCQUM5QixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7YUFDekI7WUFDRCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7U0FDakIsRUFDRCxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FDdkMsQ0FBQztRQUVKLG1CQUFtQjtRQUNuQixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQixvQkFBb0I7UUFDcEIsZ0JBQVcsR0FBUSxFQUFFLENBQUM7UUFDdEIsVUFBVTtRQUNWLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBZ0R0QixlQUFlO1FBQ2YscUJBQWdCLEdBQUcsRUFBRSxDQUFDLEVBQUU7WUFDdEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDO1FBY0YsY0FBYztRQUNkLGVBQVUsR0FBUSxFQUFFLENBQUM7UUFDckIsWUFBWTtRQUNaLGNBQVMsR0FBRyxLQUFLLENBQUM7SUFwYWYsQ0FBQztJQUdKLFlBQVk7SUFDWixxQkFBcUI7UUFDbkIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsc0JBQXNCO2lCQUN4Qiw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7aUJBQ3RELFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDZixJQUFJLENBQUMsNkJBQTZCLEdBQUcsR0FBRyxFQUFFLDZCQUE2QixDQUFDO2dCQUN4RSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQU1ELElBQ1csaUJBQWlCLENBQUMsQ0FBUztRQUNwQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ04sSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztZQUM1QixrQkFBa0I7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFJRCxJQUNXLFFBQVEsQ0FBQyxDQUFVO1FBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFNRCxJQUNXLEtBQUssQ0FBQyxDQUFTO1FBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxpQkFBaUI7SUFDakIsSUFDVyxPQUFPLENBQUMsQ0FBVTtRQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ04sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0lBV0QsZ0JBQWdCO0lBQ2hCLGtCQUFrQixDQUFDLEtBQUs7UUFDdEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLDZCQUE2QixHQUFHLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLENBQUM7WUFDbEMsT0FBTztRQUNULENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztJQUNYLFNBQVM7UUFDUCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBS0QsV0FBVztJQUNYLFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDO1lBQy9CLDhCQUE4QjtZQUM5QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQzNCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUdELGdCQUFnQjtJQUNoQixZQUFZLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNILGtCQUFrQixDQUFDLFdBQVc7UUFDNUIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWxCLFNBQVMsT0FBTyxDQUFDLEtBQUs7WUFDcEIsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsT0FBTztZQUVuQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixjQUFjO2dCQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBRXpCLHlCQUF5QjtnQkFDekIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQ2xELE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3pCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsZUFBZTtJQUNmLFVBQVUsQ0FBQyxLQUFLO1FBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBS0QsbUJBQW1CO0lBQ25CLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSztRQUN2QixNQUFNLEtBQUssR0FBQyxJQUFJLENBQUM7UUFDakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFDckMsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQzFCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDckMsU0FBUztZQUNYLENBQUM7WUFDRCxjQUFjLENBQUMsSUFBSSxDQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztpQkFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNWLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkMsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxVQUFVLEdBQUc7Z0JBQ2xCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQyxDQUFDLENBQ0wsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBRSxDQUFDLE9BQU8sRUFBQyxFQUFFO1lBQzNDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDakIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMzRSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsS0FBSyxDQUFDLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztnQkFDckMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ1gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBRUwsQ0FBQztJQUVELHVDQUF1QztJQUN2QyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsSUFBSTtRQUMvQixJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ3BDLElBQUksRUFBRSxJQUFJLElBQUk7Z0JBQUUsRUFBRSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGFBQWEsQ0FBQyxJQUFJO1FBQ2hCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNoQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQ2QsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsYUFBYSxFQUFFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQ3RDLFdBQVcsRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxJQUFJLEVBQUU7Z0JBQ2pELFFBQVEsRUFBRSxFQUFFO2FBQ2IsQ0FBQyxDQUFDLFNBQVMsQ0FDVixHQUFHLENBQUMsRUFBRTtnQkFDSixPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLENBQUMsRUFDRCxHQUFHLENBQUMsRUFBRTtnQkFDSixPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzNELENBQUMsQ0FDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBaUJELGlCQUFpQjtJQUNqQixXQUFXO1FBQ1QsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUEwQixFQUFFLEVBQUUsQ0FDN0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7WUFDeEIsR0FBRyxLQUFLO1lBQ1IsR0FBRyxJQUFJLENBQUMsT0FBTztZQUNmLGFBQWEsRUFBRSxJQUFJLENBQUMsa0JBQWtCO1lBQ3RDLFdBQVcsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRztTQUMzQyxDQUFDLENBQUM7UUFDTCxNQUFNLE9BQU8sR0FBRyxDQUFDLElBQXVDLEVBQUUsRUFBRTtZQUMxRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNqQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELHNCQUFzQjtJQUN0QixXQUFXO1FBQ1QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsVUFBVTtJQUNWLFVBQVUsQ0FBQyxJQUFJO1FBQ2IsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsQ0FBQztZQUM3RixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sY0FBYyxHQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDeEMsSUFBSSxDQUFDLGFBQWEsR0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYztJQUNkLHFCQUFxQjtRQUNuQixJQUFJLENBQUMsWUFBWTthQUNkLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDUixHQUFHLEVBQUUsRUFBRTtZQUNQLFlBQVksRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDO1NBQzVFLENBQUM7YUFDRCxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQTJCLEVBQUUsRUFBRTtZQUMvQyxJQUFJLE1BQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFDekMsSUFBSSxDQUFDO29CQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUMxRCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBQyxvQkFBb0IsQ0FBQyxDQUFBO29CQUN4QyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNoQixJQUFJLENBQUMsYUFBYSxHQUFDLEVBQUUsQ0FBQzt3QkFDdEIsZ0JBQWdCO29CQUNsQixDQUFDO3lCQUFNLENBQUM7d0JBQ04sUUFBUTt3QkFDUixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNoQixlQUFlO3dCQUNmLElBQUksQ0FBQyxhQUFhLEdBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQztvQkFFekMsQ0FBQztnQkFDSCxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsYUFBYTtnQkFDZixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsYUFBb0I7UUFDekMsbUJBQW1CO1FBQ25CLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDOUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FDekMsR0FBRyxFQUFFO29CQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEIsQ0FBQyxFQUNELEdBQUcsRUFBRTtvQkFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2YsQ0FBQyxDQUNGLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsV0FBVztRQUNYLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN6RCxTQUFTO1FBQ1QsTUFBTSxXQUFXLEdBQVUsRUFBRSxDQUFDO1FBQzlCLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdkIsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUNqQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsT0FBTyxFQUFFLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNqQyxXQUFXO1lBQ1gsT0FBTyxFQUNMLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsbUNBQW1DLENBQUM7Z0JBQ3hFLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLFFBQVE7U0FDcEMsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPO0lBQ1AsS0FBSyxDQUFDLGlCQUFpQixLQUFJLENBQUM7SUFFNUIsY0FBYztJQUNkLG9CQUFvQjtRQUNsQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUE2QkQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLHlHQUF5RztRQUN6Ryw2Q0FBNkM7UUFDN0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBQ0QsWUFBWTtJQUNaLFlBQVksQ0FBQyxRQUFRO1FBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDRCxZQUFZO0lBQ1osa0JBQWtCLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFZO1FBQ3pDLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ2pDLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNqRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sa0JBQWtCLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEUsQ0FBQztZQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUN2RSxDQUFDO2FBQU0sQ0FBQztZQUNOLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDOUIsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDckUsQ0FBQztJQUNELHNFQUFzRTtJQUN0RSxlQUFlLENBQUMsVUFBaUIsRUFBRSxnQkFBdUIsRUFBRTtRQUMxRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3pDLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFDRCxhQUFhO0lBQ2IsYUFBYSxDQUFDLEtBQVUsRUFBRSxLQUFZO1FBQ3BDLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUM1QyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekIsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxrQkFBa0IsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEYsQ0FBQzthQUFNLENBQUM7WUFDTixrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9GLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQzFDLElBQUksQ0FBQyxhQUFhLEdBQUcsa0JBQWtCLENBQUM7SUFDMUMsQ0FBQztJQU1ELGVBQWU7SUFDZixvQkFBb0IsQ0FBQyxLQUFLO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNuQixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ3hCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBT0Qsa0JBQWtCO0lBQ2xCLGdCQUFnQixDQUFDLEtBQUs7UUFDcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSztZQUFFLE9BQU87UUFDckMsSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVk7YUFDZCxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUNoQixJQUFJLEVBQUUsS0FBSyxDQUFDLFFBQVE7U0FDckIsQ0FBQzthQUNELElBQUksQ0FDSCxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQ0g7YUFDQSxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDZix5Q0FBeUM7WUFDekMsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN0QyxJQUFJLE9BQU8sQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDckMsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO29CQUM5QixNQUFNO2dCQUNSLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7WUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUM7WUFDM0YsbUJBQW1CO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUNELFVBQVU7SUFDVixjQUFjLENBQUMsR0FBRztRQUNoQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksU0FBUyxDQUFDO1lBQ2hDLFFBQVEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEQsRUFBRSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMvQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztZQUMzQixRQUFRLEVBQUUsR0FBRyxDQUFDLElBQUk7WUFDbEIsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFO1NBQ1gsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7SUFDeEIsQ0FBQztJQUNELFVBQVU7SUFDVixnQkFBZ0IsQ0FBQyxHQUFHO1FBQ2xCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO0lBQ2hDLENBQUM7OEdBNWRVLGtCQUFrQjtrR0FBbEIsa0JBQWtCLHVRQVRsQjtZQUNULGFBQWE7WUFDYixXQUFXO1lBQ1gsYUFBYTtZQUNiLDREQUE0RDtZQUM1RCx1RUFBdUU7WUFDdkUsRUFBRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtTQUNyRCwrQ0MzQ0gsNGlSQStJWTs7MkZEbEdDLGtCQUFrQjtrQkFkOUIsU0FBUzsrQkFFRSxlQUFlLGFBR2Q7d0JBQ1QsYUFBYTt3QkFDYixXQUFXO3dCQUNYLGFBQWE7d0JBQ2IsNERBQTREO3dCQUM1RCx1RUFBdUU7d0JBQ3ZFLEVBQUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7cUJBQ3JEOzRRQStCVSxpQkFBaUI7c0JBRDNCLEtBQUs7Z0JBV0ssUUFBUTtzQkFEbEIsS0FBSztnQkFVSyxLQUFLO3NCQURmLEtBQUs7Z0JBTUssT0FBTztzQkFEakIsS0FBSztnQkFTSSxhQUFhO3NCQUF0QixNQUFNO2dCQW1LRyxZQUFZO3NCQUFyQixNQUFNO2dCQTRJRSxnQkFBZ0I7c0JBQXhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgaW5qZWN0LFxuICBPbkNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgRmlsZVNlcnZpY2UgZnJvbSAnLi4vLi4vcHJveHkvZGlnbml0ZS9maWxlLWV4cGxvcmVyL2ZpbGVzJztcbmltcG9ydCB7IENvbmZpcm1hdGlvbiwgQ29uZmlybWF0aW9uU2VydmljZSwgVG9hc3RlclNlcnZpY2UgfSBmcm9tICdAYWJwL25nLnRoZW1lLnNoYXJlZCc7XG5pbXBvcnQge1xuICBQYWdlZFJlc3VsdER0byxcbiAgQUJQLFxuICBMaXN0U2VydmljZSxcbiAgUmVzdCxcbiAgUmVzdFNlcnZpY2UsXG4gIExvY2FsaXphdGlvblNlcnZpY2UsXG4gIExJU1RfUVVFUllfREVCT1VOQ0VfVElNRSxcbn0gZnJvbSAnQGFicC9uZy5jb3JlJztcbmltcG9ydCB7XG4gIEZpbGVEZXNjcmlwdG9yRHRvLFxuICBGaWxlRGVzY3JpcHRvclNlcnZpY2UsXG4gIEdldEZpbGVzSW5wdXQsXG59IGZyb20gJy4uLy4uL3Byb3h5L2RpZ25pdGUvZmlsZS1leHBsb3Jlci9maWxlcyc7XG5pbXBvcnQgeyBGaWxlQXBpU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZpbGUtYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uVHlwZSB9IGZyb20gJ0Bzd2ltbGFuZS9uZ3gtZGF0YXRhYmxlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSB9IGZyb20gJ3J4anMnO1xuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnZmUtZmlsZS1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWxlLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmlsZS1tb2RhbC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICAvLyBbUmVxdWlyZWRdXG4gICAgTGlzdFNlcnZpY2UsXG4gICAgLy8gW09wdGlvbmFsXVxuICAgIC8vIFByb3ZpZGUgdGhpcyB0b2tlbiBpZiB5b3Ugd2FudCBhIGRpZmZlcmVudCBkZWJvdW5jZSB0aW1lLlxuICAgIC8vIERlZmF1bHQgaXMgMzAwLiBDYW5ub3QgYmUgMC4gQW55IHZhbHVlIGJlbG93IDEwMCBpcyBub3QgcmVjb21tZW5kZWQuXG4gICAgeyBwcm92aWRlOiBMSVNUX1FVRVJZX0RFQk9VTkNFX1RJTUUsIHVzZVZhbHVlOiA1MDAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRmlsZU1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfRmlsZVNlcnZpY2U6IEZpbGVTZXJ2aWNlLkZpbGVEZXNjcmlwdG9yU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0ZXI6IFRvYXN0ZXJTZXJ2aWNlLFxuICAgIHB1YmxpYyByZWFkb25seSBsaXN0OiBMaXN0U2VydmljZSxcbiAgICBwdWJsaWMgX0ZpbGVBcGlTZXJ2aWNlOiBGaWxlQXBpU2VydmljZSxcbiAgICBwcml2YXRlIHJlc3RTZXJ2aWNlOiBSZXN0U2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpcm1hdGlvbjogQ29uZmlybWF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIF9Mb2NhbGl6YXRpb25TZXJ2aWNlOiBMb2NhbGl6YXRpb25TZXJ2aWNlLFxuICApIHt9XG5cbiAgcHJpdmF0ZSBfRmlsZURlc2NyaXB0b3JTZXJ2aWNlID0gaW5qZWN0KEZpbGVEZXNjcmlwdG9yU2VydmljZSk7XG4gIC8qKuiOt+WPluebruW9lemFjee9riAqL1xuICBnZXRGaWxlc0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuX0ZpbGVEZXNjcmlwdG9yU2VydmljZVxuICAgICAgICAuZ2V0RmlsZUNvbnRhaW5lckNvbmZpZ3VyYXRpb24odGhpcy5fZmlsZUNvbnRhaW5lck5hbWUpXG4gICAgICAgIC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZURpcmVjdG9yeVBlcm1pc3Npb25OYW1lID0gcmVzPy5jcmVhdGVEaXJlY3RvcnlQZXJtaXNzaW9uTmFtZTtcbiAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIC8qKuebruW9leeahOadg+mZkOWQjeensCAqL1xuICBjcmVhdGVEaXJlY3RvcnlQZXJtaXNzaW9uTmFtZTogc3RyaW5nID0gbnVsbDtcblxuICAvKirlm77niYflrrnlmaggKi9cbiAgX2ZpbGVDb250YWluZXJOYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZmlsZUNvbnRhaW5lck5hbWUodjogc3RyaW5nKSB7XG4gICAgaWYgKHYpIHtcbiAgICAgIHRoaXMuX2ZpbGVDb250YWluZXJOYW1lID0gdjtcbiAgICAgIC8vIHRoaXMubG9hZERhdGEoKVxuICAgIH1cbiAgfVxuXG4gIC8qKuaYr+WQpuWkmumAiSAqL1xuICBfbXVsdGlwbGUgPSBmYWxzZTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBtdWx0aXBsZSh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5fbXVsdGlwbGUgPSB2O1xuICB9XG5cbiAgLyoq5paH5Lu25aSn5bCP6ZmQ5Yi2XG4gICAqIEBwYXJhbSAxbWJcbiAgICovXG4gIHNpemVMaW1pdCA9IDEwNDg1NzY7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbGltaXQodjogbnVtYmVyKSB7XG4gICAgdGhpcy5zaXplTGltaXQgPSB2O1xuICB9XG4gIC8qKueItue7hOS7tuS8oOmAkueahOaooeaAgeahhueKtuaAgSAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHZpc2libGUodjogYm9vbGVhbikge1xuICAgIHRoaXMuTW9kYWxPcGVuID0gdjtcbiAgICBpZiAodikge1xuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKuaooeaAgeahhueKtuaAgeWbnuiwgyAqL1xuICBAT3V0cHV0KCkgdmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKirmqKHmgIHmoYYt54q25oCBLeaYr+WQpuaJk+W8gCAqL1xuICBNb2RhbE9wZW4gPSBmYWxzZTtcblxuICAvKirmqKHmgIHmoYYt57mB5b+Z54q25oCBLeeUqOS6juehruWumuaooeaAgeeahOe5geW/meeKtuaAgeaYr+WQpuS4uuecnyAqL1xuICBNb2RhbEJ1c3kgPSBmYWxzZTtcblxuICAvKirmqKHmgIHmoYYt54q25oCB5pS55Y+Y5Zue6LCDICovXG4gIE1vZGFsVmlzaWJsZUNoYW5nZShldmVudCkge1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgIHRoaXMuTW9kYWxPcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLk1vZGFsQnVzeSA9IGZhbHNlO1xuICAgICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQoZXZlbnQpO1xuICAgICAgdGhpcy5jcmVhdGVEaXJlY3RvcnlQZXJtaXNzaW9uTmFtZSA9ICcnO1xuICAgICAgdGhpcy5fdGhlU2VsZWN0ZWRUcmVlTm9kZSA9ICcnO1xuICAgICAgdGhpcy5zZWxlY3RlZFRhYmxlID0gW107XG4gICAgICB0aGlzLnVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0ID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLyoq5qih5oCB5qGG5L+d5a2YICovXG4gIG1vZGFsU2F2ZSgpIHtcbiAgICBjb25zdCBzZWxlY3RlZFRhYmxlYXJyID0gdGhpcy5fRmlsZUFwaVNlcnZpY2UuZGVlcENsb25lKHRoaXMuc2VsZWN0ZWRUYWJsZSk7XG4gICAgdGhpcy5zZWxlY3RGaWxlZm4uZW1pdChzZWxlY3RlZFRhYmxlYXJyKTtcbiAgICB0aGlzLk1vZGFsVmlzaWJsZUNoYW5nZShmYWxzZSk7XG4gIH1cbiAgLyoqZGlnbml0ZS1maWxlLW1vZGFsLXRyZWUgKi9cbiAgLyoq6YCJ5oup55qEdHJlZeiKgueCuSAqL1xuICBfdGhlU2VsZWN0ZWRUcmVlTm9kZTogYW55ID0gJyc7XG4gIGlzQ3JlYXRlTGlzdCA9IGZhbHNlO1xuICAvKirliJ3lp4vljJbmlbDmja4gKi9cbiAgbG9hZERhdGEoKSB7XG4gICAgaWYgKHRoaXMuTW9kYWxPcGVuICYmIHRoaXMuX2ZpbGVDb250YWluZXJOYW1lKSB7XG4gICAgICB0aGlzLmxpc3QubWF4UmVzdWx0Q291bnQgPSAxMDA7XG4gICAgICAvLyB0aGlzLmZpbHRlcnMuc2tpcENvdW50ID0gMDtcbiAgICAgIHRoaXMuZ2V0RmlsZXNDb25maWd1cmF0aW9uKCk7XG4gICAgICBpZiAoIXRoaXMuaXNDcmVhdGVMaXN0KSB7XG4gICAgICAgIHRoaXMuaG9va1RvUXVlcnkoKTtcbiAgICAgICAgdGhpcy5pc0NyZWF0ZUxpc3QgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5saXN0LmdldCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKiog5LuOdHJlZeiOt+WPluadpeeahOaVsOaNriAqL1xuICBmaWxlR3JvdXBMaXN0OiBhbnlbXSA9IFtdO1xuICAvKiog5LuOdHJlZeiOt+WPluaVsOaNriAqL1xuICB0cmVlTm9kZURhdGEoZXZlbnQpIHtcbiAgICB0aGlzLmZpbGVHcm91cExpc3QgPSB0aGlzLmZsYXR0ZW5OZXN0ZWRBcnJheShldmVudCk7XG4gIH1cbiAgLyoqXG4gICAqIOWwhuW1jOWll+aVsOe7hOaJgeW5s+WMllxuICAgKiBAcGFyYW0ge0FycmF5fSBuZXN0ZWRBcnJheSAtIOWMheWQq+W1jOWll2NoaWxkcmVu55qE5pWw57uEXG4gICAqIEByZXR1cm5zIHtBcnJheX0gLSDmiYHlubPljJblkI7nmoTmlbDnu4RcbiAgICovXG4gIGZsYXR0ZW5OZXN0ZWRBcnJheShuZXN0ZWRBcnJheSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgZnVuY3Rpb24gZmxhdHRlbihpdGVtcykge1xuICAgICAgaWYgKCFpdGVtcykgcmV0dXJuO1xuXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgLy8g5bCG5b2T5YmN6aG55re75Yqg5Yiw57uT5p6c5pWw57uEXG4gICAgICAgIHJlc3VsdC5wdXNoKHsgLi4uaXRlbSB9KTtcblxuICAgICAgICAvLyDlpoLmnpzmnIljaGlsZHJlbuWxnuaAp+S4lOaYr+aVsOe7hO+8jOmAkuW9kuWkhOeQhlxuICAgICAgICBpZiAoaXRlbS5jaGlsZHJlbiAmJiBBcnJheS5pc0FycmF5KGl0ZW0uY2hpbGRyZW4pKSB7XG4gICAgICAgICAgZmxhdHRlbihpdGVtLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZsYXR0ZW4obmVzdGVkQXJyYXkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKip0cmVlLeiKgueCuemAieaLqSAqL1xuICBfbm9kZUNsaWNrKGV2ZW50KSB7XG4gICAgdGhpcy5maWx0ZXJzLnNraXBDb3VudCA9IDA7XG4gICAgdGhpcy5fdGhlU2VsZWN0ZWRUcmVlTm9kZSA9IGV2ZW50O1xuICAgIHRoaXMubGlzdC5nZXQoKTtcbiAgfVxuXG4gIC8qKuWbvueJh+S4iuS8oC3opoHkuIrkvKDlm77niYfnmoTnirbmgIHmlofku7bliJfooaggKi9cbiAgdXBsb2FkUGljdHVyZVN0YXR1c0xpc3Q6IGFueVtdID0gW107XG5cbiAgLyoq5Zu+54mH5LiK5LygLeiOt+WPluaWh+S7tuS/oeaBr+aUueWPmCAqL1xuICBhc3luYyBnZXRGaWxlQ2hhbmdlKGV2ZW50KSB7XG4gICAgY29uc3QgX3RoYXQ9dGhpcztcbiAgICBjb25zdCBmaWxlcyA9IG5ldyBBcnJheSguLi5ldmVudC50YXJnZXQuZmlsZXMpO1xuICAgIHRoaXMudXBsb2FkUGljdHVyZVN0YXR1c0xpc3QgPSBmaWxlcztcbiAgICBjb25zdCB1cGxvYWRQcm9taXNlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgaWYgKGZpbGUuc2l6ZSA+IHRoaXMuc2l6ZUxpbWl0KSB7XG4gICAgICAgIHRoaXMuc2V0dXBsb2FkUGljdHVyZVN0YXR1cyhmaWxlLCAyKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB1cGxvYWRQcm9taXNlcy5wdXNoKFxuICAgICAgICB0aGlzLnVwbG9hZGluZ0ZpbGUoZmlsZSlcbiAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXR1cGxvYWRQaWN0dXJlU3RhdHVzKGZpbGUsIDEpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBsb2FkUGljdHVyZVN0YXR1cyhmaWxlLCAyKTtcbiAgICAgICAgICAgIHJldHVybiBlcnI7XG4gICAgICAgICAgfSksIC8vIOS/neivgeaJgOaciVByb21pc2Xpg71yZXNvbHZlXG4gICAgICApO1xuICAgIH1cbiAgICBQcm9taXNlLmFsbCh1cGxvYWRQcm9taXNlcykudGhlbiggKHJlc3VsdHMpPT4ge1xuICAgICAgX3RoYXQubGlzdC5nZXQoKTtcbiAgICAgIGNvbnN0IGlzU3VibWl0ID0gIV90aGF0LnVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0LnNvbWUoZWwgPT4gZWwuc3RhdHVzID09IDIpO1xuICAgICAgaWYgKGlzU3VibWl0KSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIF90aGF0LnVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0ID0gW107XG4gICAgICAgIH0sIDQwMDApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIH1cblxuICAvKirlm77niYfkuIrkvKAt6K6+572udXBsb2FkUGljdHVyZVN0YXR1c0xpc3TnmoTnirbmgIEgKi9cbiAgc2V0dXBsb2FkUGljdHVyZVN0YXR1cyhmaWxlLCB0eXBlKSB7XG4gICAgdGhpcy51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdC5tYXAoZWwgPT4ge1xuICAgICAgaWYgKGVsID09IGZpbGUpIGVsLnN0YXR1cyA9IHR5cGU7XG4gICAgfSk7XG4gIH1cblxuICAvKirlm77niYfkuIrkvKAt6YCS5b2S5oyJ6aG65bqP5LiK5LygICovXG4gIHVwbG9hZGluZ0ZpbGUoZmlsZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0cykgPT4ge1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUsIGZpbGUubmFtZSk7XG4gICAgICB0aGlzLmNyZWF0ZUZpbGUoe1xuICAgICAgICBmaWxlOiBmb3JtRGF0YSxcbiAgICAgICAgY29udGFpbmVyTmFtZTogdGhpcy5fZmlsZUNvbnRhaW5lck5hbWUsXG4gICAgICAgIGRpcmVjdG9yeUlkOiB0aGlzLl90aGVTZWxlY3RlZFRyZWVOb2RlPy5rZXkgfHwgJycsXG4gICAgICAgIGVudGl0eUlkOiAnJyxcbiAgICAgIH0pLnN1YnNjcmliZShcbiAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICByZXNvbHZlKHsgZmlsZTogZmlsZS5uYW1lLCBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlcyB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICByZWplY3RzKHsgZmlsZTogZmlsZS5uYW1lLCBzdGF0dXM6ICdmYWlsJywgZXJyb3I6IGVyciB9KTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKirmlofku7booajmoLwt5pWw5o2uKi9cbiAgZGF0YTogUGFnZWRSZXN1bHREdG88RmlsZURlc2NyaXB0b3JEdG8+ID0ge1xuICAgIGl0ZW1zOiBbXSxcbiAgICB0b3RhbENvdW50OiAwLFxuICB9O1xuXG4gIC8qKuaWh+S7tuihqOagvC3mnaHku7YqL1xuICBmaWx0ZXJzID0ge30gYXMgR2V0RmlsZXNJbnB1dDtcblxuICAvKirmlofku7booajmoLwt6KGo5qC86Ieq5bim6YCJ5oup57G75Z6LICovXG4gIFNlbGVjdGlvblR5cGUgPSBTZWxlY3Rpb25UeXBlO1xuXG4gIC8qKumAieaLqeaWh+S7tuWbnuiwgyAqL1xuICBAT3V0cHV0KCkgc2VsZWN0RmlsZWZuID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICAvKirmlofku7booajmoLwt6I635Y+W6KGo5qC85pWw5o2uICovXG4gIGhvb2tUb1F1ZXJ5KCkge1xuICAgIGNvbnN0IGdldERhdGEgPSAocXVlcnk6IEFCUC5QYWdlUXVlcnlQYXJhbXMpID0+XG4gICAgICB0aGlzLl9GaWxlU2VydmljZS5nZXRMaXN0KHtcbiAgICAgICAgLi4ucXVlcnksXG4gICAgICAgIC4uLnRoaXMuZmlsdGVycyxcbiAgICAgICAgY29udGFpbmVyTmFtZTogdGhpcy5fZmlsZUNvbnRhaW5lck5hbWUsXG4gICAgICAgIGRpcmVjdG9yeUlkOiB0aGlzLl90aGVTZWxlY3RlZFRyZWVOb2RlLmtleSxcbiAgICAgIH0pO1xuICAgIGNvbnN0IHNldERhdGEgPSAobGlzdDogUGFnZWRSZXN1bHREdG88RmlsZURlc2NyaXB0b3JEdG8+KSA9PiB7XG4gICAgICB0aGlzLmRhdGEgPSBsaXN0O1xuICAgICAgdGhpcy5vblBhZ2VDaGFuZ2UobGlzdC5pdGVtcyk7XG4gICAgfTtcbiAgICB0aGlzLmxpc3QuaG9va1RvUXVlcnkoZ2V0RGF0YSkuc3Vic2NyaWJlKHNldERhdGEpO1xuICB9XG5cbiAgLyoq5paH5Lu26KGo5qC8Leafpeeci+aJgOacieWIhue7hOeahOaWh+S7tuaVsOaNriAqL1xuICBsb29rQWxsRmlsZSgpIHtcbiAgICB0aGlzLmZpbHRlcnMuc2tpcENvdW50ID0gMDtcbiAgICB0aGlzLl90aGVTZWxlY3RlZFRyZWVOb2RlID0gJyc7XG4gICAgdGhpcy5saXN0LmdldCgpO1xuICB9XG5cbiAgLyoq5Yig6Zmk5Zu+54mHICovXG4gIGRlbGV0ZUZpbGUoZmlsZSkge1xuICAgIHRoaXMuX0ZpbGVTZXJ2aWNlLmRlbGV0ZShmaWxlLmlkKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgIHRoaXMudG9hc3Rlci5zdWNjZXNzKHRoaXMuX0xvY2FsaXphdGlvblNlcnZpY2UuaW5zdGFudChgRmlsZUV4cGxvcmVyOjpEZWxldGVkU3VjY2Vzc2Z1bGx5YCkpO1xuICAgICAgdGhpcy5saXN0LmdldCgpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRUYWJsZXM9dGhpcy5zZWxlY3RlZFRhYmxlO1xuICAgICAgdGhpcy5zZWxlY3RlZFRhYmxlPXNlbGVjdGVkVGFibGVzLmZpbHRlcihlbCA9PiBlbC5pZCAhPSBmaWxlLmlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKuWIoOmZpOaJgOaciemAieS4reWbvueJhyAqL1xuICBvbkRlbGV0ZUFsbFNlbGVjdEZpbGUoKSB7XG4gICAgdGhpcy5jb25maXJtYXRpb25cbiAgICAgIC53YXJuKCcnLCB7XG4gICAgICAgIGtleTogJycsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogdGhpcy5fTG9jYWxpemF0aW9uU2VydmljZS5pbnN0YW50KGBGaWxlRXhwbG9yZXI6OkFyZVlvdVN1cmVgKSxcbiAgICAgIH0pXG4gICAgICAuc3Vic2NyaWJlKGFzeW5jIChzdGF0dXM6IENvbmZpcm1hdGlvbi5TdGF0dXMpID0+IHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PSAnY29uZmlybScpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZFRhYmxlID0gdGhpcy5zZWxlY3RlZFRhYmxlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJhdGNoRGVsZXRlSXRlbXMoc2VsZWN0ZWRUYWJsZSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQsJ3Jlc3VsdHJlc3VsdHJlc3VsdCcpXG4gICAgICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgdGhpcy50b2FzdGVyLnN1Y2Nlc3MocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICB0aGlzLmxpc3QuZ2V0KCk7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZT1bXTtcbiAgICAgICAgICAgICAgLy8g5Y+v6IO96ZyA6KaB5Yi35paw6KGo5qC85oiW5pu05pawVUlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8v5Yig6Zmk5aSx6LSl55qE6aG5XG4gICAgICAgICAgICAgIHRoaXMubGlzdC5nZXQoKTtcbiAgICAgICAgICAgICAgLy8g5Y+v5Lul6YCJ5oup5bGV56S65aSx6LSl6aG55oiW6YeN6K+VXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZT0gcmVzdWx0LmZhaWxlZEl0ZW1zO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8v5om56YeP5Yig6Zmk6L+H56iL5Lit5Y+R55Sf6ZSZ6K+vXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmibnph4/liKDpmaTooajmoLzpoblcbiAgICogQHBhcmFtIHNlbGVjdGVkVGFibGUg6ZyA6KaB5Yig6Zmk55qE6KGo5qC86aG55pWw57uEXG4gICAqIEByZXR1cm5zIOWMheWQq+aIkOWKn+eKtuaAgeWSjOWksei0pemhueeahOe7k+aenOWvueixoVxuICAgKi9cbiAgYXN5bmMgYmF0Y2hEZWxldGVJdGVtcyhzZWxlY3RlZFRhYmxlOiBhbnlbXSkge1xuICAgIC8vIOWtmOWCqOaJgOacieWIoOmZpOivt+axgueahFByb21pc2VcbiAgICBjb25zdCBkZWxldGVQcm9taXNlcyA9IHNlbGVjdGVkVGFibGUubWFwKGl0ZW0gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fRmlsZVNlcnZpY2UuZGVsZXRlKGl0ZW0uaWQpLnN1YnNjcmliZShcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGl0ZW0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIOetieW+heaJgOacieivt+axguWujOaIkFxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoZGVsZXRlUHJvbWlzZXMpO1xuICAgIC8vIOaUtumbhuWksei0peeahOmhuVxuICAgIGNvbnN0IGZhaWxlZEl0ZW1zOiBhbnlbXSA9IFtdO1xuICAgIHJlc3VsdHMuZm9yRWFjaChyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgZmFpbGVkSXRlbXMucHVzaChyZXN1bHQucmVhc29uKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWlsZWRJdGVtcy5sZW5ndGggPT09IDAsXG4gICAgICBmYWlsZWRJdGVtcyxcbiAgICAgIG1lc3NhZ2U6XG4gICAgICAgIGZhaWxlZEl0ZW1zLmxlbmd0aCA9PT0gMFxuICAgICAgICAgID8gdGhpcy5fTG9jYWxpemF0aW9uU2VydmljZS5pbnN0YW50KGBGaWxlRXhwbG9yZXI6OkRlbGV0ZWRTdWNjZXNzZnVsbHlgKVxuICAgICAgICAgIDogYCR7ZmFpbGVkSXRlbXMubGVuZ3RofeS4qumhueWIoOmZpOWksei0pWAsXG4gICAgfTtcbiAgfVxuXG4gIC8vIOS9v+eUqOekuuS+i1xuICBhc3luYyBoYW5kbGVCYXRjaERlbGV0ZSgpIHt9XG5cbiAgLyoq5YWz6Zet5paH5Lu254q25oCB5by556qXICovXG4gIGNsb3NlRmlsZVN0YXR1c01vZGFsKCkge1xuICAgIHRoaXMudXBsb2FkUGljdHVyZVN0YXR1c0xpc3QgPSBbXTtcbiAgfVxuXG4gIC8qKuWIm+W7uuWbvueJh+eahOaOpeWPo++8jOS7o+eQhuS4reeahGZpbGXnsbvlnovkuI3ljLnphY3vvIzliIfmjaLkuLphbnnnsbvlnosgKi9cbiAgY3JlYXRlRmlsZSA9IChpbnB1dDogYW55LCBjb25maWc/OiBQYXJ0aWFsPFJlc3QuQ29uZmlnPikgPT5cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLnJlcXVlc3Q8YW55LCBGaWxlRGVzY3JpcHRvckR0bz4oXG4gICAgICB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICB1cmw6ICcvYXBpL2ZpbGUtZXhwbG9yZXIvZmlsZXMnLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBjb250YWluZXJOYW1lOiBpbnB1dC5jb250YWluZXJOYW1lLFxuICAgICAgICAgIGNlbGxOYW1lOiBpbnB1dC5jZWxsTmFtZSxcbiAgICAgICAgICBkaXJlY3RvcnlJZDogaW5wdXQuZGlyZWN0b3J5SWQsXG4gICAgICAgICAgZW50aXR5SWQ6IGlucHV0LmVudGl0eUlkLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBpbnB1dC5maWxlLFxuICAgICAgfSxcbiAgICAgIHsgYXBpTmFtZTogJ0ZpbGVFeHBsb3JlcicsIC4uLmNvbmZpZyB9LFxuICAgICk7XG5cbiAgLyoq5paH5Lu26KGo5qC8LemAieaLqeeahOihqOagvOaVsOaNrumhuSAqL1xuICBzZWxlY3RlZFRhYmxlID0gW107XG4gIC8qKuW9k+WJjemAieaLqeeahHRhYmxl6aG5IGlkICovXG4gIG5vd1NlbGVjdElkOiBhbnkgPSAnJztcbiAgLyoq5piv5ZCm5YWo6YCJICovXG4gIGlzQWxsU2VsZWN0ZWQgPSBmYWxzZTtcblxuICAvKirlt7LpgInlrprnmoTmlofku7YgKi9cbiAgQElucHV0KCkgc2VsZWN0UGlja2VyRmlsZTogYW55W107XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vQ2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgbGlmZWN5Y2xlIGhvb2suIFVzZSBpdCB0byBpbmplY3QgZGVwZW5kZW5jaWVzLCBidXQgYXZvaWQgYW55IHNlcmlvdXMgd29yayBoZXJlLlxuICAgIC8vQWRkICcke2ltcGxlbWVudHMgT25DaGFuZ2VzfScgdG8gdGhlIGNsYXNzLlxuICAgIHRoaXMuc2VsZWN0ZWRUYWJsZSA9IHRoaXMuX0ZpbGVBcGlTZXJ2aWNlLmRlZXBDbG9uZSh0aGlzLnNlbGVjdFBpY2tlckZpbGUpO1xuICB9XG4gIC8qKuihqOagvOWIhumhteWIh+aNoiAqL1xuICBvblBhZ2VDaGFuZ2UobmV3QXJyYXkpIHtcbiAgICB0aGlzLmlzQWxsU2VsZWN0ZWQgPSB0aGlzLmlzQWxsU2VsZWN0ZWRGbihuZXdBcnJheSwgdGhpcy5zZWxlY3RlZFRhYmxlKTtcbiAgfVxuICAvKirooYzpgInmi6nmoYbmlLnlj5ggKi9cbiAgb25DaGVja2JveENoYW5nZUZuKGV2ZW50LCByb3csIGFycmF5OiBhbnlbXSkge1xuICAgIGNvbnN0IHsgY2hlY2tlZCB9ID0gZXZlbnQudGFyZ2V0O1xuICAgIGxldCBzZWxlY3RlZFRhYmxlQXJyYXkgPSBbLi4udGhpcy5zZWxlY3RlZFRhYmxlXTtcbiAgICBpZiAodGhpcy5fbXVsdGlwbGUpIHtcbiAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgIHNlbGVjdGVkVGFibGVBcnJheS5wdXNoKHJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZFRhYmxlQXJyYXkgPSBzZWxlY3RlZFRhYmxlQXJyYXkuZmlsdGVyKGVsID0+IGVsLmlkICE9IHJvdy5pZCk7XG4gICAgICB9XG4gICAgICB0aGlzLmlzQWxsU2VsZWN0ZWQgPSB0aGlzLmlzQWxsU2VsZWN0ZWRGbihhcnJheSwgc2VsZWN0ZWRUYWJsZUFycmF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0ZWRUYWJsZUFycmF5Lmxlbmd0aCA9IDA7XG4gICAgICBzZWxlY3RlZFRhYmxlQXJyYXkgPSBjaGVja2VkID8gW3Jvd10gOiBbXTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZFRhYmxlID0gdGhpcy5yZW1vdmVEdXBsaWNhdGVzQnlJZChzZWxlY3RlZFRhYmxlQXJyYXkpO1xuICB9XG4gIC8qKuWmguaenHNlbGVjdGVkVGFibGVBcnJheeS4jeWQq2FycmF55Lit55qE5omA5pyJ6aG577yM5YiZ5bCGaXNBbGxTZWxlY3RlZOiuvuS4unRydWUs5ZCm5YiZ6K6+5Li6ZmFsc2UgKi9cbiAgaXNBbGxTZWxlY3RlZEZuKHRvbGFsQXJyYXk6IGFueVtdLCBzZWxlY3RlZEFycmF5OiBhbnlbXSA9IFtdKSB7XG4gICAgaWYgKHRvbGFsQXJyYXkubGVuZ3RoID09IDApIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdG9sYWxBcnJheS5ldmVyeShpdGVtID0+IHNlbGVjdGVkQXJyYXkuc29tZShlbCA9PiBlbC5pZCA9PT0gaXRlbS5pZCkpO1xuICB9XG4gIC8qKumAieaLqeW9k+WJjemhteWFqOmDqCAqL1xuICBvblNlbGVjdEFsbEZuKGV2ZW50OiBhbnksIGFycmF5OiBhbnlbXSkge1xuICAgIGxldCBzZWxlY3RlZFRhYmxlQXJyYXkgPSB0aGlzLnNlbGVjdGVkVGFibGU7XG4gICAgaWYgKGV2ZW50LnRhcmdldC5jaGVja2VkKSB7XG4gICAgICBzZWxlY3RlZFRhYmxlQXJyYXkgPSB0aGlzLnJlbW92ZUR1cGxpY2F0ZXNCeUlkKFsuLi5zZWxlY3RlZFRhYmxlQXJyYXksIC4uLmFycmF5XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGVkVGFibGVBcnJheSA9IHNlbGVjdGVkVGFibGVBcnJheS5maWx0ZXIoZWwgPT4gIWFycmF5LnNvbWUoaXRlbSA9PiBpdGVtLmlkID09PSBlbC5pZCkpO1xuICAgIH1cbiAgICB0aGlzLmlzQWxsU2VsZWN0ZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcbiAgICB0aGlzLnNlbGVjdGVkVGFibGUgPSBzZWxlY3RlZFRhYmxlQXJyYXk7XG4gIH1cblxuICAvKirliKTmlq1yb3fmmK/lkKbpgInkuK0gKi9cbiAgc2VsZWN0ZWRjaGVja2JveCA9IGlkID0+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRhYmxlLnNvbWUoZWwgPT4gZWwuaWQgPT09IGlkKTtcbiAgfTtcbiAgLyoq5Yig6Zmk5pWw57uE5Lit6YeN5aSN55qE6aG5ICovXG4gIHJlbW92ZUR1cGxpY2F0ZXNCeUlkKGFycmF5KSB7XG4gICAgY29uc3Qgc2VlbklkcyA9IHt9O1xuICAgIHJldHVybiBhcnJheS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBpZiAoIXNlZW5JZHNbaXRlbS5pZF0pIHtcbiAgICAgICAgc2Vlbklkc1tpdGVtLmlkXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG4gIC8qKueUqOS6jue8lui+keeahOihqOWNle+8jOWQjOaXtuWPquiDveaYvuekuue8lui+keS4gOS4qiAqL1xuICBGaWxlTmFtZUZvcm06IEZvcm1Hcm91cCB8IGFueTtcbiAgLyoq5b2T5YmN57yW6L6R55qEcm93ICovXG4gIG5ld0VkaXRSb3c6IGFueSA9ICcnO1xuICAvKirmmK/lkKbmraPlnKjliqDovb0gKi9cbiAgaXNsb2FkaW5nID0gZmFsc2U7XG4gIC8qKuaPkOS6pEZpbGVOYW1l57yW6L6RICovXG4gIG9uU3VibWl0RmlsZU5hbWUoZXZlbnQpIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuRmlsZU5hbWVGb3JtLnZhbHVlO1xuICAgIGlmICghdGhpcy5GaWxlTmFtZUZvcm0udmFsaWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc2xvYWRpbmcpIHJldHVybjtcbiAgICB0aGlzLmlzbG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5fRmlsZVNlcnZpY2VcbiAgICAgIC51cGRhdGUoaW5wdXQuaWQsIHtcbiAgICAgICAgbmFtZTogaW5wdXQuZmlsZU5hbWUsXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmlzbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgLy/pgJrov4flvZPliY1uZXdFZGl0Um9355qEaWQs5L+u5pS5ZGF0YS5pdGVtc+S4reWvueW6lOmhueeahG5hbWVcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMuZGF0YS5pdGVtcykge1xuICAgICAgICAgIGlmIChlbGVtZW50LmlkID09IHRoaXMubmV3RWRpdFJvdy5pZCkge1xuICAgICAgICAgICAgZWxlbWVudC5uYW1lID0gaW5wdXQuZmlsZU5hbWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLkZpbGVOYW1lRm9ybSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5uZXdFZGl0Um93ID0gJyc7XG4gICAgICAgIHRoaXMudG9hc3Rlci5zdWNjZXNzKHRoaXMuX0xvY2FsaXphdGlvblNlcnZpY2UuaW5zdGFudChgRmlsZUV4cGxvcmVyOjpTYXZlZFN1Y2Nlc3NmdWxseWApKTtcbiAgICAgICAgLy8gdGhpcy5saXN0LmdldCgpO1xuICAgICAgfSk7XG4gIH1cbiAgLyoq5omT5byA57yW6L6RICovXG4gIG9uRWRpdEZpbGVOYW1lKHJvdykge1xuICAgIHRoaXMuRmlsZU5hbWVGb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICBmaWxlTmFtZTogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgaWQ6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICB9KTtcbiAgICB0aGlzLkZpbGVOYW1lRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIGZpbGVOYW1lOiByb3cubmFtZSxcbiAgICAgIGlkOiByb3cuaWQsXG4gICAgfSk7XG4gICAgdGhpcy5uZXdFZGl0Um93ID0gcm93O1xuICB9XG4gIC8qKuWFs+mXree8lui+kSAqL1xuICBvbkNhbmNlbEZpbGVOYW1lKHJvdykge1xuICAgIHRoaXMubmV3RWRpdFJvdyA9ICcnO1xuICAgIHRoaXMuRmlsZU5hbWVGb3JtID0gdW5kZWZpbmVkO1xuICB9XG59XG4iLCI8YWJwLW1vZGFsIFsodmlzaWJsZSldPVwiTW9kYWxPcGVuXCIgKHZpc2libGVDaGFuZ2UpPVwiTW9kYWxWaXNpYmxlQ2hhbmdlKCRldmVudClcIlxuICBbb3B0aW9uc109XCJ7IHNpemU6ICd4bCcsIHNjcm9sbGFibGU6IGZhbHNlIH1cIj5cbiAgPG5nLXRlbXBsYXRlICNhYnBIZWFkZXI+XG4gICAgPGgzPnt7J0ZpbGVFeHBsb3Jlcjo6RmlsZUV4cGxvcmVyJyB8IGFicExvY2FsaXphdGlvbn19PC9oMz5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLXRlbXBsYXRlICNhYnBCb2R5PlxuICAgIDxkaXYgY2xhc3M9XCJyb3cgZmlsZS1leHBsb3Jlci1tb2RhbC1ib2R5IGZpbGUtbW9kYWxcIiAqbmdJZj1cIk1vZGFsT3BlblwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCIgKm5nSWY9XCJjcmVhdGVEaXJlY3RvcnlQZXJtaXNzaW9uTmFtZVwiIHN0eWxlPVwib3ZlcmZsb3c6IGF1dG87IGhlaWdodDogY2FsYygxMDB2aCAtIDI0MHB4KVwiPlxuICAgICAgICA8ZmUtZmlsZS1tb2RhbC10cmVlIFt0aGVTZWxlY3RlZFRyZWVOb2RlXT1cIl90aGVTZWxlY3RlZFRyZWVOb2RlXCIgKG5vZGVDbGljayk9XCJfbm9kZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgIChsb29rQWxsQnRuKT1cImxvb2tBbGxGaWxlKClcIiAodHJlZU5vZGVEYXRhKT1cInRyZWVOb2RlRGF0YSgkZXZlbnQpXCJcbiAgICAgICAgICBbZmlsZUNvbnRhaW5lck5hbWVdPVwiX2ZpbGVDb250YWluZXJOYW1lXCI+PC9mZS1maWxlLW1vZGFsLXRyZWU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgW2NsYXNzXT1cImNyZWF0ZURpcmVjdG9yeVBlcm1pc3Npb25OYW1lPydjb2wtOSc6J2NvbC0xMidcIiBzdHlsZT1cImhlaWdodDogY2FsYygxMDB2aCAtIDI0MHB4KVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDJcIj48c3BhbiAqbmdJZj1cInNlbGVjdGVkVGFibGUubGVuZ3RoPjFcIiBjbGFzcz1cImJ0bi1saW5rXCJcbiAgICAgICAgICAgICAgKGNsaWNrLnN0b3ApPVwib25EZWxldGVBbGxTZWxlY3RGaWxlKClcIiByb2xlPVwiYnV0dG9uXCI+e3snRmlsZUV4cGxvcmVyOjpEZWxldGUnIHwgYWJwTG9jYWxpemF0aW9ufX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGZvcm0tZmlsZVwiIHN0eWxlPVwiZmxleDogMlwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAjZmlsZUVkaXQgW211bHRpcGxlXT1cIl9tdWx0aXBsZVwiIChjaGFuZ2UpPVwiZ2V0RmlsZUNoYW5nZSgkZXZlbnQpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPCEtLSBbc2VsZWN0aW9uVHlwZV09XCJfbXVsdGlwbGU/U2VsZWN0aW9uVHlwZS5jaGVja2JveDpTZWxlY3Rpb25UeXBlLnNpbmdsZVwiIC0tPlxuICAgICAgICAgIDwhLS0gW3NlbGVjdENoZWNrXT1cInNlbGVjdENoZWNrXCIgLS0+XG4gICAgICAgICAgPG5neC1kYXRhdGFibGUgY2xhc3M9XCJtYXRlcmlhbCBjb250YWluZXItaGVpZ2h0XCIgW3Jvd3NdPVwiZGF0YS5pdGVtc1wiIFtsaXN0XT1cImxpc3RcIiBjb2x1bW5Nb2RlPVwiZmxleFwiXG4gICAgICAgICAgICBbaGVhZGVySGVpZ2h0XT1cIjUwXCIgW2Zvb3RlckhlaWdodF09XCI1MFwiIHJvd0hlaWdodD1cImF1dG9cIiBbc2Nyb2xsYmFyVl09XCJ0cnVlXCIgW3ZpcnR1YWxpemF0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtleHRlcm5hbFBhZ2luZ109XCJ0cnVlXCIgW2NvdW50XT1cImRhdGEudG90YWxDb3VudFwiPlxuICAgICAgICAgICAgPG5neC1kYXRhdGFibGUtY29sdW1uIFt3aWR0aF09XCI1MFwiIHByb3A9XCJpZFwiIFtzb3J0YWJsZV09XCJmYWxzZVwiIFtjYW5BdXRvUmVzaXplXT1cImZhbHNlXCIgW2RyYWdnYWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtyZXNpemVhYmxlXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ3gtZGF0YXRhYmxlLWhlYWRlci10ZW1wbGF0ZSBsZXQtdmFsdWU9XCJ2YWx1ZVwiIGxldC1hbGxSb3dzU2VsZWN0ZWQ9XCJhbGxSb3dzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIGxldC1zZWxlY3RGbj1cInNlbGVjdEZuXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiICpuZ0lmPVwiX211bHRpcGxlXCIgW2NoZWNrZWRdPVwiaXNBbGxTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU2VsZWN0QWxsRm4oJGV2ZW50LGRhdGEuaXRlbXMpXCIgLz5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5neC1kYXRhdGFibGUtY2VsbC10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgW2NoZWNrZWRdPVwic2VsZWN0ZWRjaGVja2JveCh2YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoZWNrYm94Q2hhbmdlRm4oJGV2ZW50LHJvdyxkYXRhLml0ZW1zKVwiIC8+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25neC1kYXRhdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgPG5neC1kYXRhdGFibGUtY29sdW1uIFtzb3J0YWJsZV09XCJmYWxzZVwiIFtmbGV4R3Jvd109XCIyXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPGZlLWZpbGUtcHJldmlldyBbd2lkdGhdPVwiJzgwcHgnXCIgW3NyY109XCJyb3cudXJsXCIgW25hbWVdPVwicm93Lm5hbWVcIiBbdHlwZV09XCJyb3cubWltZVR5cGVcIlxuICAgICAgICAgICAgICAgICAgW3ByZXZpZXddPVwidHJ1ZVwiPjwvZmUtZmlsZS1wcmV2aWV3PlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiBbbmFtZV09XCInRmlsZUV4cGxvcmVyOjpGaWxlTmFtZScgfCBhYnBMb2NhbGl6YXRpb25cIiBwcm9wPVwibmFtZVwiIFtzb3J0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtmbGV4R3Jvd109XCI0XCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCB0aXRsZWhvdmVyXCIgKm5nSWY9XCJuZXdFZGl0Um93LmlkIT09cm93LmlkXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTJcIj57eyB2YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGVuY2lsLXNxdWFyZS1vXCIgcm9sZT1cImJ1dHRvblwiIChjbGljay5zdG9wKT1cIm9uRWRpdEZpbGVOYW1lKHJvdylcIiBzdHlsZT1cImxpbmUtaGVpZ2h0OjI7XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJGaWxlTmFtZUZvcm0mJm5ld0VkaXRSb3cuaWQ9PT1yb3cuaWRcIj5cbiAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiRmlsZU5hbWVGb3JtXCIgKG5nU3VibWl0KT1cIm9uU3VibWl0RmlsZU5hbWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBcIiB0eXBlPVwidGV4dFwiICBmb3JtQ29udHJvbE5hbWU9XCJmaWxlTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIgYnRuIGJ0bi1zbVwiIHR5cGU9XCJzdWJtaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEtc3BpbiBmYSBmYS1zcGlubmVyXCIgKm5nSWY9XCJpc2xvYWRpbmdcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZWNrXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgKm5nSWY9XCIhaXNsb2FkaW5nXCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIgYnRuIGJ0bi1zbVwiIChjbGljay5zdG9wKT1cIm9uQ2FuY2VsRmlsZU5hbWUocm93KVwiPjxpIGNsYXNzPVwiZmEgZmEtdGltZXNcIiB0eXBlPVwicmVzZXRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiBbbmFtZV09XCInRmlsZUV4cGxvcmVyOjpGaWxlU2l6ZScgfCBhYnBMb2NhbGl6YXRpb25cIiBwcm9wPVwic2l6ZVwiIFtmbGV4R3Jvd109XCIxLjVcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiIG5neC1kYXRhdGFibGUtY2VsbC10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICB7eyBfRmlsZUFwaVNlcnZpY2UuZm9ybWF0RmlsZVNpemUodmFsdWUpIH19XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25neC1kYXRhdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgPG5neC1kYXRhdGFibGUtY29sdW1uIFtuYW1lXT1cIidGaWxlRXhwbG9yZXI6OkRpcmVjdG9yeScgfCBhYnBMb2NhbGl6YXRpb25cIiBwcm9wPVwiZGlyZWN0b3J5SWRcIlxuICAgICAgICAgICAgICBbc29ydGFibGVdPVwiZmFsc2VcIiBbZmxleEdyb3ddPVwiMVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCIgbmd4LWRhdGF0YWJsZS1jZWxsLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIHt7IHZhbHVlfGdldERpcmVjdG9yeU5hbWU6ZmlsZUdyb3VwTGlzdCB9fVxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiBbbmFtZV09XCInRmlsZUV4cGxvcmVyOjpDcmVhdGlvblRpbWUnIHwgYWJwTG9jYWxpemF0aW9uXCIgcHJvcD1cImNyZWF0aW9uVGltZVwiXG4gICAgICAgICAgICAgIFtmbGV4R3Jvd109XCIyXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAge3sgdmFsdWUgfCBkYXRlIDogJ1lZWVkvTU0vZGQgSEg6bW06cycgfX1cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmd4LWRhdGF0YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICA8bmd4LWRhdGF0YWJsZS1jb2x1bW4gW2ZsZXhHcm93XT1cIjFcIiBbc29ydGFibGVdPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiIG5neC1kYXRhdGFibGUtY2VsbC10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHQgcC0wXCIgKGNsaWNrLnN0b3ApPVwiZGVsZXRlRmlsZShyb3cpXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10cmFzaCB0ZXh0LXByaW1hcnkgcC0yXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICA8L25neC1kYXRhdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwidXBsb2FkUGljdHVyZVN0YXR1c0xpc3QubGVuZ3RoID4gMFwiXG4gICAgICAgICAgY2xhc3M9XCJwb3NpdGlvbi1maXhlZCBib3R0b20tMCBlbmQtMCBzaGFkb3ctbGcgZmlsZS1zdGF0dXMtbW9kYWwgICBtLTVcIiBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDEwcHhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHAtMCBweS0xIGJvcmRlci1ib3R0b21cIj5cbiAgICAgICAgICAgICAgPGRpdj57eydGaWxlRXhwbG9yZXI6OlVwbG9hZEZpbGVzJyB8IGFicExvY2FsaXphdGlvbn19PC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrLnN0b3ApPVwiY2xvc2VGaWxlU3RhdHVzTW9kYWwoKVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydGaWxlRXhwbG9yZXI6OkZpbGVOYW1lJyB8IGFicExvY2FsaXphdGlvbn19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snRmlsZUV4cGxvcmVyOjpGaWxlU2l6ZScgfCBhYnBMb2NhbGl6YXRpb259fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiB1cGxvYWRQaWN0dXJlU3RhdHVzTGlzdDsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IGl0ZW0ubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tdGV4dCB0ZXh0LWRhbmdlclwiICpuZ0lmPVwiaXRlbS5zaXplID4gc2l6ZUxpbWl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0ZpbGVFeHBsb3Jlcjo6RXhjZWVkc01heGltdW1TaXplJyB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFicExvY2FsaXphdGlvbjpfRmlsZUFwaVNlcnZpY2UuZm9ybWF0RmlsZVNpemUoc2l6ZUxpbWl0KX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBpdGVtLmZpbGVTaXplIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cIml0ZW0uc3RhdHVzID09PSAxXCIgY2xhc3M9XCJmYXMgZmEtY2hlY2sgdGV4dC1wcmltYXJ5XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJpdGVtLnN0YXR1cyA9PT0gMlwiIGNsYXNzPVwiZmFzIGZhLXRpbWVzLWNpcmNsZSB0ZXh0LWRhbmdlclwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUgI2FicEZvb3Rlcj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgYWJwQ2xvc2U+e3snQWJwVWk6OkNsb3NlJyB8IGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XG4gICAgPGFicC1idXR0b24gaWNvbkNsYXNzPVwiZmEgZmEtY2hlY2tcIiAoY2xpY2spPVwibW9kYWxTYXZlKClcIj57eydGaWxlRXhwbG9yZXI6OkNvbmZpcm0nIHwgYWJwTG9jYWxpemF0aW9ufX1cbiAgICAgIEBpZihzZWxlY3RlZFRhYmxlLmxlbmd0aD4wKXtcbiAgICAgICh7e3NlbGVjdGVkVGFibGUubGVuZ3RofX0pXG4gICAgICB9XG4gICAgPC9hYnAtYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuPC9hYnAtbW9kYWw+Il19
|
|
478
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9maWxlLWV4cGxvcmVyL3NyYy9saWIvY29tcG9uZW50cy9maWxlLW1vZGFsL2ZpbGUtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZmlsZS1leHBsb3Jlci9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1tb2RhbC9maWxlLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFEQUFxRDtBQUNyRCxzREFBc0Q7QUFDdEQsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFFTixNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLFdBQVcsTUFBTSx5Q0FBeUMsQ0FBQztBQUN2RSxPQUFPLEVBQWdCLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pGLE9BQU8sRUFHTCxXQUFXLEVBRVgsV0FBVyxFQUNYLG1CQUFtQixFQUNuQix3QkFBd0IsR0FDekIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUVMLHFCQUFxQixHQUV0QixNQUFNLHlDQUF5QyxDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7O0FBZWhDLE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsWUFDVSxZQUErQyxFQUMvQyxPQUF1QixFQUNmLElBQWlCLEVBQ3pCLFdBQXdCLEVBQ3hCLFlBQWlDLEVBQ2pDLG9CQUF5QztRQUx6QyxpQkFBWSxHQUFaLFlB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ZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBpbmplY3QsXG4gIE9uQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBGaWxlU2VydmljZSBmcm9tICcuLi8uLi9wcm94eS9kaWduaXRlL2ZpbGUtZXhwbG9yZXIvZmlsZXMnO1xuaW1wb3J0IHsgQ29uZmlybWF0aW9uLCBDb25maXJtYXRpb25TZXJ2aWNlLCBUb2FzdGVyU2VydmljZSB9IGZyb20gJ0BhYnAvbmcudGhlbWUuc2hhcmVkJztcbmltcG9ydCB7XG4gIFBhZ2VkUmVzdWx0RHRvLFxuICBBQlAsXG4gIExpc3RTZXJ2aWNlLFxuICBSZXN0LFxuICBSZXN0U2VydmljZSxcbiAgTG9jYWxpemF0aW9uU2VydmljZSxcbiAgTElTVF9RVUVSWV9ERUJPVU5DRV9USU1FLFxufSBmcm9tICdAYWJwL25nLmNvcmUnO1xuaW1wb3J0IHtcbiAgRmlsZURlc2NyaXB0b3JEdG8sXG4gIEZpbGVEZXNjcmlwdG9yU2VydmljZSxcbiAgR2V0RmlsZXNJbnB1dCxcbn0gZnJvbSAnLi4vLi4vcHJveHkvZGlnbml0ZS9maWxlLWV4cGxvcmVyL2ZpbGVzJztcbmltcG9ydCB7IFNlbGVjdGlvblR5cGUgfSBmcm9tICdAc3dpbWxhbmUvbmd4LWRhdGF0YWJsZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZmluYWxpemUgfSBmcm9tICdyeGpzJztcbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2ZlLWZpbGUtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGUtbW9kYWwuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgLy8gW1JlcXVpcmVkXVxuICAgIExpc3RTZXJ2aWNlLFxuICAgIC8vIFtPcHRpb25hbF1cbiAgICAvLyBQcm92aWRlIHRoaXMgdG9rZW4gaWYgeW91IHdhbnQgYSBkaWZmZXJlbnQgZGVib3VuY2UgdGltZS5cbiAgICAvLyBEZWZhdWx0IGlzIDMwMC4gQ2Fubm90IGJlIDAuIEFueSB2YWx1ZSBiZWxvdyAxMDAgaXMgbm90IHJlY29tbWVuZGVkLlxuICAgIHsgcHJvdmlkZTogTElTVF9RVUVSWV9ERUJPVU5DRV9USU1FLCB1c2VWYWx1ZTogNTAwIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX0ZpbGVTZXJ2aWNlOiBGaWxlU2VydmljZS5GaWxlRGVzY3JpcHRvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdGVyOiBUb2FzdGVyU2VydmljZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgbGlzdDogTGlzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZXN0U2VydmljZTogUmVzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maXJtYXRpb246IENvbmZpcm1hdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfTG9jYWxpemF0aW9uU2VydmljZTogTG9jYWxpemF0aW9uU2VydmljZSxcbiAgKSB7fVxuXG4gIHByaXZhdGUgX0ZpbGVEZXNjcmlwdG9yU2VydmljZSA9IGluamVjdChGaWxlRGVzY3JpcHRvclNlcnZpY2UpO1xuICAvKirojrflj5bnm67lvZXphY3nva4gKi9cbiAgZ2V0RmlsZXNDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLl9GaWxlRGVzY3JpcHRvclNlcnZpY2VcbiAgICAgICAgLmdldEZpbGVDb250YWluZXJDb25maWd1cmF0aW9uKHRoaXMuX2ZpbGVDb250YWluZXJOYW1lKVxuICAgICAgICAuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVEaXJlY3RvcnlQZXJtaXNzaW9uTmFtZSA9IHJlcz8uY3JlYXRlRGlyZWN0b3J5UGVybWlzc2lvbk5hbWU7XG4gICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAvKirnm67lvZXnmoTmnYPpmZDlkI3np7AgKi9cbiAgY3JlYXRlRGlyZWN0b3J5UGVybWlzc2lvbk5hbWU6IHN0cmluZyA9IG51bGw7XG5cbiAgLyoq5Zu+54mH5a655ZmoICovXG4gIF9maWxlQ29udGFpbmVyTmFtZTogc3RyaW5nO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGZpbGVDb250YWluZXJOYW1lKHY6IHN0cmluZykge1xuICAgIGlmICh2KSB7XG4gICAgICB0aGlzLl9maWxlQ29udGFpbmVyTmFtZSA9IHY7XG4gICAgICAvLyB0aGlzLmxvYWREYXRhKClcbiAgICB9XG4gIH1cblxuICAvKirmmK/lkKblpJrpgIkgKi9cbiAgX211bHRpcGxlID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbXVsdGlwbGUodjogYm9vbGVhbikge1xuICAgIHRoaXMuX211bHRpcGxlID0gdjtcbiAgfVxuXG4gIC8qKuaWh+S7tuWkp+Wwj+mZkOWItlxuICAgKiBAcGFyYW0gMW1iXG4gICAqL1xuICBzaXplTGltaXQgPSAxMDQ4NTc2O1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGxpbWl0KHY6IG51bWJlcikge1xuICAgIHRoaXMuc2l6ZUxpbWl0ID0gdjtcbiAgfVxuICAvKirniLbnu4Tku7bkvKDpgJLnmoTmqKHmgIHmoYbnirbmgIEgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCB2aXNpYmxlKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLk1vZGFsT3BlbiA9IHY7XG4gICAgaWYgKHYpIHtcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICB9XG4gIH1cblxuICAvKirmqKHmgIHmoYbnirbmgIHlm57osIMgKi9cbiAgQE91dHB1dCgpIHZpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoq5qih5oCB5qGGLeeKtuaAgS3mmK/lkKbmiZPlvIAgKi9cbiAgTW9kYWxPcGVuID0gZmFsc2U7XG5cbiAgLyoq5qih5oCB5qGGLee5geW/meeKtuaAgS3nlKjkuo7noa7lrprmqKHmgIHnmoTnuYHlv5nnirbmgIHmmK/lkKbkuLrnnJ8gKi9cbiAgTW9kYWxCdXN5ID0gZmFsc2U7XG5cbiAgLyoq5qih5oCB5qGGLeeKtuaAgeaUueWPmOWbnuiwgyAqL1xuICBNb2RhbFZpc2libGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICB0aGlzLk1vZGFsT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5Nb2RhbEJ1c3kgPSBmYWxzZTtcbiAgICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICAgIHRoaXMuY3JlYXRlRGlyZWN0b3J5UGVybWlzc2lvbk5hbWUgPSAnJztcbiAgICAgIHRoaXMuX3RoZVNlbGVjdGVkVHJlZU5vZGUgPSAnJztcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZSA9IFtdO1xuICAgICAgdGhpcy51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdCA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKuaooeaAgeahhuS/neWtmCAqL1xuICBtb2RhbFNhdmUoKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRUYWJsZWFyciA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLnNlbGVjdGVkVGFibGUpO1xuICAgIHRoaXMuc2VsZWN0RmlsZWZuLmVtaXQoc2VsZWN0ZWRUYWJsZWFycik7XG4gICAgdGhpcy5Nb2RhbFZpc2libGVDaGFuZ2UoZmFsc2UpO1xuICB9XG4gIC8qKmRpZ25pdGUtZmlsZS1tb2RhbC10cmVlICovXG4gIC8qKumAieaLqeeahHRyZWXoioLngrkgKi9cbiAgX3RoZVNlbGVjdGVkVHJlZU5vZGU6IGFueSA9ICcnO1xuICBpc0NyZWF0ZUxpc3QgPSBmYWxzZTtcbiAgLyoq5Yid5aeL5YyW5pWw5o2uICovXG4gIGxvYWREYXRhKCkge1xuICAgIGlmICh0aGlzLk1vZGFsT3BlbiAmJiB0aGlzLl9maWxlQ29udGFpbmVyTmFtZSkge1xuICAgICAgdGhpcy5saXN0Lm1heFJlc3VsdENvdW50ID0gMTAwO1xuICAgICAgLy8gdGhpcy5maWx0ZXJzLnNraXBDb3VudCA9IDA7XG4gICAgICB0aGlzLmdldEZpbGVzQ29uZmlndXJhdGlvbigpO1xuICAgICAgaWYgKCF0aGlzLmlzQ3JlYXRlTGlzdCkge1xuICAgICAgICB0aGlzLmhvb2tUb1F1ZXJ5KCk7XG4gICAgICAgIHRoaXMuaXNDcmVhdGVMaXN0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGlzdC5nZXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqIOS7jnRyZWXojrflj5bmnaXnmoTmlbDmja4gKi9cbiAgZmlsZUdyb3VwTGlzdDogYW55W10gPSBbXTtcbiAgLyoqIOS7jnRyZWXojrflj5bmlbDmja4gKi9cbiAgdHJlZU5vZGVEYXRhKGV2ZW50KSB7XG4gICAgdGhpcy5maWxlR3JvdXBMaXN0ID0gdGhpcy5mbGF0dGVuTmVzdGVkQXJyYXkoZXZlbnQpO1xuICB9XG4gIC8qKlxuICAgKiDlsIbltYzlpZfmlbDnu4TmiYHlubPljJZcbiAgICogQHBhcmFtIHtBcnJheX0gbmVzdGVkQXJyYXkgLSDljIXlkKvltYzlpZdjaGlsZHJlbueahOaVsOe7hFxuICAgKiBAcmV0dXJucyB7QXJyYXl9IC0g5omB5bmz5YyW5ZCO55qE5pWw57uEXG4gICAqL1xuICBmbGF0dGVuTmVzdGVkQXJyYXkobmVzdGVkQXJyYXkpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGZsYXR0ZW4oaXRlbXMpIHtcbiAgICAgIGlmICghaXRlbXMpIHJldHVybjtcblxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIC8vIOWwhuW9k+WJjemhuea3u+WKoOWIsOe7k+aenOaVsOe7hFxuICAgICAgICByZXN1bHQucHVzaCh7IC4uLml0ZW0gfSk7XG5cbiAgICAgICAgLy8g5aaC5p6c5pyJY2hpbGRyZW7lsZ7mgKfkuJTmmK/mlbDnu4TvvIzpgJLlvZLlpITnkIZcbiAgICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgQXJyYXkuaXNBcnJheShpdGVtLmNoaWxkcmVuKSkge1xuICAgICAgICAgIGZsYXR0ZW4oaXRlbS5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbGF0dGVuKG5lc3RlZEFycmF5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqdHJlZS3oioLngrnpgInmi6kgKi9cbiAgX25vZGVDbGljayhldmVudCkge1xuICAgIHRoaXMuZmlsdGVycy5za2lwQ291bnQgPSAwO1xuICAgIHRoaXMuX3RoZVNlbGVjdGVkVHJlZU5vZGUgPSBldmVudDtcbiAgICB0aGlzLmxpc3QuZ2V0KCk7XG4gIH1cblxuICAvKirlm77niYfkuIrkvKAt6KaB5LiK5Lyg5Zu+54mH55qE54q25oCB5paH5Lu25YiX6KGoICovXG4gIHVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0OiBhbnlbXSA9IFtdO1xuXG4gIC8qKuWbvueJh+S4iuS8oC3ojrflj5bmlofku7bkv6Hmga/mlLnlj5ggKi9cbiAgYXN5bmMgZ2V0RmlsZUNoYW5nZShldmVudCkge1xuICAgIGNvbnN0IF90aGF0PXRoaXM7XG4gICAgY29uc3QgZmlsZXMgPSBuZXcgQXJyYXkoLi4uZXZlbnQudGFyZ2V0LmZpbGVzKTtcbiAgICB0aGlzLnVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0ID0gZmlsZXM7XG4gICAgY29uc3QgdXBsb2FkUHJvbWlzZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGlmIChmaWxlLnNpemUgPiB0aGlzLnNpemVMaW1pdCkge1xuICAgICAgICB0aGlzLnNldHVwbG9hZFBpY3R1cmVTdGF0dXMoZmlsZSwgMik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdXBsb2FkUHJvbWlzZXMucHVzaChcbiAgICAgICAgdGhpcy51cGxvYWRpbmdGaWxlKGZpbGUpXG4gICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBsb2FkUGljdHVyZVN0YXR1cyhmaWxlLCAxKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwbG9hZFBpY3R1cmVTdGF0dXMoZmlsZSwgMik7XG4gICAgICAgICAgICByZXR1cm4gZXJyO1xuICAgICAgICAgIH0pLCAvLyDkv53or4HmiYDmnIlQcm9taXNl6YO9cmVzb2x2ZVxuICAgICAgKTtcbiAgICB9XG4gICAgUHJvbWlzZS5hbGwodXBsb2FkUHJvbWlzZXMpLnRoZW4oIChyZXN1bHRzKT0+IHtcbiAgICAgIF90aGF0Lmxpc3QuZ2V0KCk7XG4gICAgICBjb25zdCBpc1N1Ym1pdCA9ICFfdGhhdC51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdC5zb21lKGVsID0+IGVsLnN0YXR1cyA9PSAyKTtcbiAgICAgIGlmIChpc1N1Ym1pdCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBfdGhhdC51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdCA9IFtdO1xuICAgICAgICB9LCA0MDAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICB9XG5cbiAgLyoq5Zu+54mH5LiK5LygLeiuvue9rnVwbG9hZFBpY3R1cmVTdGF0dXNMaXN055qE54q25oCBICovXG4gIHNldHVwbG9hZFBpY3R1cmVTdGF0dXMoZmlsZSwgdHlwZSkge1xuICAgIHRoaXMudXBsb2FkUGljdHVyZVN0YXR1c0xpc3QubWFwKGVsID0+IHtcbiAgICAgIGlmIChlbCA9PSBmaWxlKSBlbC5zdGF0dXMgPSB0eXBlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoq5Zu+54mH5LiK5LygLemAkuW9kuaMiemhuuW6j+S4iuS8oCAqL1xuICB1cGxvYWRpbmdGaWxlKGZpbGUpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdHMpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlLCBmaWxlLm5hbWUpO1xuICAgICAgdGhpcy5jcmVhdGVGaWxlKHtcbiAgICAgICAgZmlsZTogZm9ybURhdGEsXG4gICAgICAgIGNvbnRhaW5lck5hbWU6IHRoaXMuX2ZpbGVDb250YWluZXJOYW1lLFxuICAgICAgICBkaXJlY3RvcnlJZDogdGhpcy5fdGhlU2VsZWN0ZWRUcmVlTm9kZT8ua2V5IHx8ICcnLFxuICAgICAgICBlbnRpdHlJZDogJycsXG4gICAgICB9KS5zdWJzY3JpYmUoXG4gICAgICAgIHJlcyA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSh7IGZpbGU6IGZpbGUubmFtZSwgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXMgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgcmVqZWN0cyh7IGZpbGU6IGZpbGUubmFtZSwgc3RhdHVzOiAnZmFpbCcsIGVycm9yOiBlcnIgfSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoq5paH5Lu26KGo5qC8LeaVsOaNriovXG4gIGRhdGE6IFBhZ2VkUmVzdWx0RHRvPEZpbGVEZXNjcmlwdG9yRHRvPiA9IHtcbiAgICBpdGVtczogW10sXG4gICAgdG90YWxDb3VudDogMCxcbiAgfTtcblxuICAvKirmlofku7booajmoLwt5p2h5Lu2Ki9cbiAgZmlsdGVycyA9IHt9IGFzIEdldEZpbGVzSW5wdXQ7XG5cbiAgLyoq5paH5Lu26KGo5qC8LeihqOagvOiHquW4pumAieaLqeexu+WeiyAqL1xuICBTZWxlY3Rpb25UeXBlID0gU2VsZWN0aW9uVHlwZTtcblxuICAvKirpgInmi6nmlofku7blm57osIMgKi9cbiAgQE91dHB1dCgpIHNlbGVjdEZpbGVmbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG5cbiAgLyoq5paH5Lu26KGo5qC8LeiOt+WPluihqOagvOaVsOaNriAqL1xuICBob29rVG9RdWVyeSgpIHtcbiAgICBjb25zdCBnZXREYXRhID0gKHF1ZXJ5OiBBQlAuUGFnZVF1ZXJ5UGFyYW1zKSA9PlxuICAgICAgdGhpcy5fRmlsZVNlcnZpY2UuZ2V0TGlzdCh7XG4gICAgICAgIC4uLnF1ZXJ5LFxuICAgICAgICAuLi50aGlzLmZpbHRlcnMsXG4gICAgICAgIGNvbnRhaW5lck5hbWU6IHRoaXMuX2ZpbGVDb250YWluZXJOYW1lLFxuICAgICAgICBkaXJlY3RvcnlJZDogdGhpcy5fdGhlU2VsZWN0ZWRUcmVlTm9kZS5rZXksXG4gICAgICB9KTtcbiAgICBjb25zdCBzZXREYXRhID0gKGxpc3Q6IFBhZ2VkUmVzdWx0RHRvPEZpbGVEZXNjcmlwdG9yRHRvPikgPT4ge1xuICAgICAgdGhpcy5kYXRhID0gbGlzdDtcbiAgICAgIHRoaXMub25QYWdlQ2hhbmdlKGxpc3QuaXRlbXMpO1xuICAgIH07XG4gICAgdGhpcy5saXN0Lmhvb2tUb1F1ZXJ5KGdldERhdGEpLnN1YnNjcmliZShzZXREYXRhKTtcbiAgfVxuXG4gIC8qKuaWh+S7tuihqOagvC3mn6XnnIvmiYDmnInliIbnu4TnmoTmlofku7bmlbDmja4gKi9cbiAgbG9va0FsbEZpbGUoKSB7XG4gICAgdGhpcy5maWx0ZXJzLnNraXBDb3VudCA9IDA7XG4gICAgdGhpcy5fdGhlU2VsZWN0ZWRUcmVlTm9kZSA9ICcnO1xuICAgIHRoaXMubGlzdC5nZXQoKTtcbiAgfVxuXG4gIC8qKuWIoOmZpOWbvueJhyAqL1xuICBkZWxldGVGaWxlKGZpbGUpIHtcbiAgICB0aGlzLl9GaWxlU2VydmljZS5kZWxldGUoZmlsZS5pZCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICB0aGlzLnRvYXN0ZXIuc3VjY2Vzcyh0aGlzLl9Mb2NhbGl6YXRpb25TZXJ2aWNlLmluc3RhbnQoYEZpbGVFeHBsb3Jlcjo6RGVsZXRlZFN1Y2Nlc3NmdWxseWApKTtcbiAgICAgIHRoaXMubGlzdC5nZXQoKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkVGFibGVzPXRoaXMuc2VsZWN0ZWRUYWJsZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZT1zZWxlY3RlZFRhYmxlcy5maWx0ZXIoZWwgPT4gZWwuaWQgIT0gZmlsZS5pZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKirliKDpmaTmiYDmnInpgInkuK3lm77niYcgKi9cbiAgb25EZWxldGVBbGxTZWxlY3RGaWxlKCkge1xuICAgIHRoaXMuY29uZmlybWF0aW9uXG4gICAgICAud2FybignJywge1xuICAgICAgICBrZXk6ICcnLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IHRoaXMuX0xvY2FsaXphdGlvblNlcnZpY2UuaW5zdGFudChgRmlsZUV4cGxvcmVyOjpBcmVZb3VTdXJlYCksXG4gICAgICB9KVxuICAgICAgLnN1YnNjcmliZShhc3luYyAoc3RhdHVzOiBDb25maXJtYXRpb24uU3RhdHVzKSA9PiB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gJ2NvbmZpcm0nKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYWJsZSA9IHRoaXMuc2VsZWN0ZWRUYWJsZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5iYXRjaERlbGV0ZUl0ZW1zKHNlbGVjdGVkVGFibGUpO1xuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LCdyZXN1bHRyZXN1bHRyZXN1bHQnKVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgIHRoaXMudG9hc3Rlci5zdWNjZXNzKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgdGhpcy5saXN0LmdldCgpO1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFibGU9W107XG4gICAgICAgICAgICAgIC8vIOWPr+iDvemcgOimgeWIt+aWsOihqOagvOaIluabtOaWsFVJXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvL+WIoOmZpOWksei0peeahOmhuVxuICAgICAgICAgICAgICB0aGlzLmxpc3QuZ2V0KCk7XG4gICAgICAgICAgICAgIC8vIOWPr+S7pemAieaLqeWxleekuuWksei0pemhueaIlumHjeivlVxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFibGU9IHJlc3VsdC5mYWlsZWRJdGVtcztcblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvL+aJuemHj+WIoOmZpOi/h+eoi+S4reWPkeeUn+mUmeivr1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5om56YeP5Yig6Zmk6KGo5qC86aG5XG4gICAqIEBwYXJhbSBzZWxlY3RlZFRhYmxlIOmcgOimgeWIoOmZpOeahOihqOagvOmhueaVsOe7hFxuICAgKiBAcmV0dXJucyDljIXlkKvmiJDlip/nirbmgIHlkozlpLHotKXpobnnmoTnu5Pmnpzlr7nosaFcbiAgICovXG4gIGFzeW5jIGJhdGNoRGVsZXRlSXRlbXMoc2VsZWN0ZWRUYWJsZTogYW55W10pIHtcbiAgICAvLyDlrZjlgqjmiYDmnInliKDpmaTor7fmsYLnmoRQcm9taXNlXG4gICAgY29uc3QgZGVsZXRlUHJvbWlzZXMgPSBzZWxlY3RlZFRhYmxlLm1hcChpdGVtID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuX0ZpbGVTZXJ2aWNlLmRlbGV0ZShpdGVtLmlkKS5zdWJzY3JpYmUoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChpdGVtKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyDnrYnlvoXmiYDmnInor7fmsYLlrozmiJBcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGRlbGV0ZVByb21pc2VzKTtcbiAgICAvLyDmlLbpm4blpLHotKXnmoTpoblcbiAgICBjb25zdCBmYWlsZWRJdGVtczogYW55W10gPSBbXTtcbiAgICByZXN1bHRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIGZhaWxlZEl0ZW1zLnB1c2gocmVzdWx0LnJlYXNvbik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFpbGVkSXRlbXMubGVuZ3RoID09PSAwLFxuICAgICAgZmFpbGVkSXRlbXMsXG4gICAgICBtZXNzYWdlOlxuICAgICAgICBmYWlsZWRJdGVtcy5sZW5ndGggPT09IDBcbiAgICAgICAgICA/IHRoaXMuX0xvY2FsaXphdGlvblNlcnZpY2UuaW5zdGFudChgRmlsZUV4cGxvcmVyOjpEZWxldGVkU3VjY2Vzc2Z1bGx5YClcbiAgICAgICAgICA6IGAke2ZhaWxlZEl0ZW1zLmxlbmd0aH3kuKrpobnliKDpmaTlpLHotKVgLFxuICAgIH07XG4gIH1cblxuXG4gIC8qKuWFs+mXreaWh+S7tueKtuaAgeW8ueeqlyAqL1xuICBjbG9zZUZpbGVTdGF0dXNNb2RhbCgpIHtcbiAgICB0aGlzLnVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0ID0gW107XG4gIH1cblxuICAvKirliJvlu7rlm77niYfnmoTmjqXlj6PvvIzku6PnkIbkuK3nmoRmaWxl57G75Z6L5LiN5Yy56YWN77yM5YiH5o2i5Li6YW5557G75Z6LICovXG4gIGNyZWF0ZUZpbGUgPSAoaW5wdXQ6IGFueSwgY29uZmlnPzogUGFydGlhbDxSZXN0LkNvbmZpZz4pID0+XG4gICAgdGhpcy5yZXN0U2VydmljZS5yZXF1ZXN0PGFueSwgRmlsZURlc2NyaXB0b3JEdG8+KFxuICAgICAge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgdXJsOiAnL2FwaS9maWxlLWV4cGxvcmVyL2ZpbGVzJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgY29udGFpbmVyTmFtZTogaW5wdXQuY29udGFpbmVyTmFtZSxcbiAgICAgICAgICBjZWxsTmFtZTogaW5wdXQuY2VsbE5hbWUsXG4gICAgICAgICAgZGlyZWN0b3J5SWQ6IGlucHV0LmRpcmVjdG9yeUlkLFxuICAgICAgICAgIGVudGl0eUlkOiBpbnB1dC5lbnRpdHlJZCxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogaW5wdXQuZmlsZSxcbiAgICAgIH0sXG4gICAgICB7IGFwaU5hbWU6ICdGaWxlRXhwbG9yZXInLCAuLi5jb25maWcgfSxcbiAgICApO1xuXG4gIC8qKuaWh+S7tuihqOagvC3pgInmi6nnmoTooajmoLzmlbDmja7pobkgKi9cbiAgc2VsZWN0ZWRUYWJsZSA9IFtdO1xuICAvKirlvZPliY3pgInmi6nnmoR0YWJsZemhuSBpZCAqL1xuICBub3dTZWxlY3RJZDogYW55ID0gJyc7XG4gIC8qKuaYr+WQpuWFqOmAiSAqL1xuICBpc0FsbFNlbGVjdGVkID0gZmFsc2U7XG5cbiAgLyoq5bey6YCJ5a6a55qE5paH5Lu2ICovXG4gIEBJbnB1dCgpIHNlbGVjdFBpY2tlckZpbGU6IGFueVtdO1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvL0NhbGxlZCBiZWZvcmUgYW55IG90aGVyIGxpZmVjeWNsZSBob29rLiBVc2UgaXQgdG8gaW5qZWN0IGRlcGVuZGVuY2llcywgYnV0IGF2b2lkIGFueSBzZXJpb3VzIHdvcmsgaGVyZS5cbiAgICAvL0FkZCAnJHtpbXBsZW1lbnRzIE9uQ2hhbmdlc30nIHRvIHRoZSBjbGFzcy5cbiAgICB0aGlzLnNlbGVjdGVkVGFibGUgPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5zZWxlY3RQaWNrZXJGaWxlKTtcbiAgfVxuICAvKirooajmoLzliIbpobXliIfmjaIgKi9cbiAgb25QYWdlQ2hhbmdlKG5ld0FycmF5KSB7XG4gICAgdGhpcy5pc0FsbFNlbGVjdGVkID0gdGhpcy5pc0FsbFNlbGVjdGVkRm4obmV3QXJyYXksIHRoaXMuc2VsZWN0ZWRUYWJsZSk7XG4gIH1cbiAgLyoq6KGM6YCJ5oup5qGG5pS55Y+YICovXG4gIG9uQ2hlY2tib3hDaGFuZ2VGbihldmVudCwgcm93LCBhcnJheTogYW55W10pIHtcbiAgICBjb25zdCB7IGNoZWNrZWQgfSA9IGV2ZW50LnRhcmdldDtcbiAgICBsZXQgc2VsZWN0ZWRUYWJsZUFycmF5ID0gWy4uLnRoaXMuc2VsZWN0ZWRUYWJsZV07XG4gICAgaWYgKHRoaXMuX211bHRpcGxlKSB7XG4gICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICBzZWxlY3RlZFRhYmxlQXJyYXkucHVzaChyb3cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWRUYWJsZUFycmF5ID0gc2VsZWN0ZWRUYWJsZUFycmF5LmZpbHRlcihlbCA9PiBlbC5pZCAhPSByb3cuaWQpO1xuICAgICAgfVxuICAgICAgdGhpcy5pc0FsbFNlbGVjdGVkID0gdGhpcy5pc0FsbFNlbGVjdGVkRm4oYXJyYXksIHNlbGVjdGVkVGFibGVBcnJheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGVkVGFibGVBcnJheS5sZW5ndGggPSAwO1xuICAgICAgc2VsZWN0ZWRUYWJsZUFycmF5ID0gY2hlY2tlZCA/IFtyb3ddIDogW107XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRUYWJsZSA9IHRoaXMucmVtb3ZlRHVwbGljYXRlc0J5SWQoc2VsZWN0ZWRUYWJsZUFycmF5KTtcbiAgfVxuICAvKirlpoLmnpxzZWxlY3RlZFRhYmxlQXJyYXnkuI3lkKthcnJheeS4reeahOaJgOaciemhue+8jOWImeWwhmlzQWxsU2VsZWN0ZWTorr7kuLp0cnVlLOWQpuWImeiuvuS4umZhbHNlICovXG4gIGlzQWxsU2VsZWN0ZWRGbih0b2xhbEFycmF5OiBhbnlbXSwgc2VsZWN0ZWRBcnJheTogYW55W10gPSBbXSkge1xuICAgIGlmICh0b2xhbEFycmF5Lmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRvbGFsQXJyYXkuZXZlcnkoaXRlbSA9PiBzZWxlY3RlZEFycmF5LnNvbWUoZWwgPT4gZWwuaWQgPT09IGl0ZW0uaWQpKTtcbiAgfVxuICAvKirpgInmi6nlvZPliY3pobXlhajpg6ggKi9cbiAgb25TZWxlY3RBbGxGbihldmVudDogYW55LCBhcnJheTogYW55W10pIHtcbiAgICBsZXQgc2VsZWN0ZWRUYWJsZUFycmF5ID0gdGhpcy5zZWxlY3RlZFRhYmxlO1xuICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgc2VsZWN0ZWRUYWJsZUFycmF5ID0gdGhpcy5yZW1vdmVEdXBsaWNhdGVzQnlJZChbLi4uc2VsZWN0ZWRUYWJsZUFycmF5LCAuLi5hcnJheV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3RlZFRhYmxlQXJyYXkgPSBzZWxlY3RlZFRhYmxlQXJyYXkuZmlsdGVyKGVsID0+ICFhcnJheS5zb21lKGl0ZW0gPT4gaXRlbS5pZCA9PT0gZWwuaWQpKTtcbiAgICB9XG4gICAgdGhpcy5pc0FsbFNlbGVjdGVkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XG4gICAgdGhpcy5zZWxlY3RlZFRhYmxlID0gc2VsZWN0ZWRUYWJsZUFycmF5O1xuICB9XG5cbiAgLyoq5Yik5patcm935piv5ZCm6YCJ5LitICovXG4gIHNlbGVjdGVkY2hlY2tib3ggPSBpZCA9PiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUYWJsZS5zb21lKGVsID0+IGVsLmlkID09PSBpZCk7XG4gIH07XG4gIC8qKuWIoOmZpOaVsOe7hOS4remHjeWkjeeahOmhuSAqL1xuICByZW1vdmVEdXBsaWNhdGVzQnlJZChhcnJheSkge1xuICAgIGNvbnN0IHNlZW5JZHMgPSB7fTtcbiAgICByZXR1cm4gYXJyYXkuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgaWYgKCFzZWVuSWRzW2l0ZW0uaWRdKSB7XG4gICAgICAgIHNlZW5JZHNbaXRlbS5pZF0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuICAvKirnlKjkuo7nvJbovpHnmoTooajljZXvvIzlkIzml7blj6rog73mmL7npLrnvJbovpHkuIDkuKogKi9cbiAgRmlsZU5hbWVGb3JtOiBGb3JtR3JvdXAgfCBhbnk7XG4gIC8qKuW9k+WJjee8lui+keeahHJvdyAqL1xuICBuZXdFZGl0Um93OiBhbnkgPSAnJztcbiAgLyoq5piv5ZCm5q2j5Zyo5Yqg6L29ICovXG4gIGlzbG9hZGluZyA9IGZhbHNlO1xuICAvKirmj5DkuqRGaWxlTmFtZee8lui+kSAqL1xuICBvblN1Ym1pdEZpbGVOYW1lKGV2ZW50KSB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLkZpbGVOYW1lRm9ybS52YWx1ZTtcbiAgICBpZiAoIXRoaXMuRmlsZU5hbWVGb3JtLnZhbGlkKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNsb2FkaW5nKSByZXR1cm47XG4gICAgdGhpcy5pc2xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuX0ZpbGVTZXJ2aWNlXG4gICAgICAudXBkYXRlKGlucHV0LmlkLCB7XG4gICAgICAgIG5hbWU6IGlucHV0LmZpbGVOYW1lLFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc2xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIC8v6YCa6L+H5b2T5YmNbmV3RWRpdFJvd+eahGlkLOS/ruaUuWRhdGEuaXRlbXPkuK3lr7nlupTpobnnmoRuYW1lXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLmRhdGEuaXRlbXMpIHtcbiAgICAgICAgICBpZiAoZWxlbWVudC5pZCA9PSB0aGlzLm5ld0VkaXRSb3cuaWQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQubmFtZSA9IGlucHV0LmZpbGVOYW1lO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5GaWxlTmFtZUZvcm0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubmV3RWRpdFJvdyA9ICcnO1xuICAgICAgICB0aGlzLnRvYXN0ZXIuc3VjY2Vzcyh0aGlzLl9Mb2NhbGl6YXRpb25TZXJ2aWNlLmluc3RhbnQoYEZpbGVFeHBsb3Jlcjo6U2F2ZWRTdWNjZXNzZnVsbHlgKSk7XG4gICAgICAgIC8vIHRoaXMubGlzdC5nZXQoKTtcbiAgICAgIH0pO1xuICB9XG4gIC8qKuaJk+W8gOe8lui+kSAqL1xuICBvbkVkaXRGaWxlTmFtZShyb3cpIHtcbiAgICB0aGlzLkZpbGVOYW1lRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgZmlsZU5hbWU6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIGlkOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgfSk7XG4gICAgdGhpcy5GaWxlTmFtZUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBmaWxlTmFtZTogcm93Lm5hbWUsXG4gICAgICBpZDogcm93LmlkLFxuICAgIH0pO1xuICAgIHRoaXMubmV3RWRpdFJvdyA9IHJvdztcbiAgfVxuICAvKirlhbPpl63nvJbovpEgKi9cbiAgb25DYW5jZWxGaWxlTmFtZShyb3cpIHtcbiAgICB0aGlzLm5ld0VkaXRSb3cgPSAnJztcbiAgICB0aGlzLkZpbGVOYW1lRm9ybSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiPGFicC1tb2RhbCBbKHZpc2libGUpXT1cIk1vZGFsT3BlblwiICh2aXNpYmxlQ2hhbmdlKT1cIk1vZGFsVmlzaWJsZUNoYW5nZSgkZXZlbnQpXCJcbiAgW29wdGlvbnNdPVwieyBzaXplOiAneGwnLCBzY3JvbGxhYmxlOiBmYWxzZSB9XCI+XG4gIDxuZy10ZW1wbGF0ZSAjYWJwSGVhZGVyPlxuICAgIDxoMz57eydGaWxlRXhwbG9yZXI6OkZpbGVFeHBsb3JlcicgfCBhYnBMb2NhbGl6YXRpb259fTwvaDM+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSAjYWJwQm9keT5cbiAgICA8ZGl2IGNsYXNzPVwicm93IGZpbGUtZXhwbG9yZXItbW9kYWwtYm9keSBmaWxlLW1vZGFsXCIgKm5nSWY9XCJNb2RhbE9wZW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiICpuZ0lmPVwiY3JlYXRlRGlyZWN0b3J5UGVybWlzc2lvbk5hbWVcIiBzdHlsZT1cIm92ZXJmbG93OiBhdXRvOyBoZWlnaHQ6IGNhbGMoMTAwdmggLSAyNDBweClcIj5cbiAgICAgICAgPGZlLWZpbGUtbW9kYWwtdHJlZSBbdGhlU2VsZWN0ZWRUcmVlTm9kZV09XCJfdGhlU2VsZWN0ZWRUcmVlTm9kZVwiIChub2RlQ2xpY2spPVwiX25vZGVDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAobG9va0FsbEJ0bik9XCJsb29rQWxsRmlsZSgpXCIgKHRyZWVOb2RlRGF0YSk9XCJ0cmVlTm9kZURhdGEoJGV2ZW50KVwiXG4gICAgICAgICAgW2ZpbGVDb250YWluZXJOYW1lXT1cIl9maWxlQ29udGFpbmVyTmFtZVwiPjwvZmUtZmlsZS1tb2RhbC10cmVlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IFtjbGFzc109XCJjcmVhdGVEaXJlY3RvcnlQZXJtaXNzaW9uTmFtZT8nY29sLTknOidjb2wtMTInXCIgc3R5bGU9XCJoZWlnaHQ6IGNhbGMoMTAwdmggLSAyNDBweClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAyXCI+PHNwYW4gKm5nSWY9XCJzZWxlY3RlZFRhYmxlLmxlbmd0aD4xXCIgY2xhc3M9XCJidG4tbGlua1wiXG4gICAgICAgICAgICAgIChjbGljay5zdG9wKT1cIm9uRGVsZXRlQWxsU2VsZWN0RmlsZSgpXCIgcm9sZT1cImJ1dHRvblwiPnt7J0ZpbGVFeHBsb3Jlcjo6RGVsZXRlJyB8IGFicExvY2FsaXphdGlvbn19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBmb3JtLWZpbGVcIiBzdHlsZT1cImZsZXg6IDJcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgI2ZpbGVFZGl0IFttdWx0aXBsZV09XCJfbXVsdGlwbGVcIiAoY2hhbmdlKT1cImdldEZpbGVDaGFuZ2UoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDwhLS0gW3NlbGVjdGlvblR5cGVdPVwiX211bHRpcGxlP1NlbGVjdGlvblR5cGUuY2hlY2tib3g6U2VsZWN0aW9uVHlwZS5zaW5nbGVcIiAtLT5cbiAgICAgICAgICA8IS0tIFtzZWxlY3RDaGVja109XCJzZWxlY3RDaGVja1wiIC0tPlxuICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlIGNsYXNzPVwibWF0ZXJpYWwgY29udGFpbmVyLWhlaWdodFwiIFtyb3dzXT1cImRhdGEuaXRlbXNcIiBbbGlzdF09XCJsaXN0XCIgY29sdW1uTW9kZT1cImZsZXhcIlxuICAgICAgICAgICAgW2hlYWRlckhlaWdodF09XCI1MFwiIFtmb290ZXJIZWlnaHRdPVwiNTBcIiByb3dIZWlnaHQ9XCJhdXRvXCIgW3Njcm9sbGJhclZdPVwidHJ1ZVwiIFt2aXJ0dWFsaXphdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICBbZXh0ZXJuYWxQYWdpbmddPVwidHJ1ZVwiIFtjb3VudF09XCJkYXRhLnRvdGFsQ291bnRcIj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiBbd2lkdGhdPVwiNTBcIiBwcm9wPVwiaWRcIiBbc29ydGFibGVdPVwiZmFsc2VcIiBbY2FuQXV0b1Jlc2l6ZV09XCJmYWxzZVwiIFtkcmFnZ2FibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbcmVzaXplYWJsZV09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmd4LWRhdGF0YWJsZS1oZWFkZXItdGVtcGxhdGUgbGV0LXZhbHVlPVwidmFsdWVcIiBsZXQtYWxsUm93c1NlbGVjdGVkPVwiYWxsUm93c1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBsZXQtc2VsZWN0Rm49XCJzZWxlY3RGblwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiAqbmdJZj1cIl9tdWx0aXBsZVwiIFtjaGVja2VkXT1cImlzQWxsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdEFsbEZuKCRldmVudCxkYXRhLml0ZW1zKVwiIC8+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIFtjaGVja2VkXT1cInNlbGVjdGVkY2hlY2tib3godmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGVja2JveENoYW5nZUZuKCRldmVudCxyb3csZGF0YS5pdGVtcylcIiAvPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiBbc29ydGFibGVdPVwiZmFsc2VcIiBbZmxleEdyb3ddPVwiMlwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCIgbmd4LWRhdGF0YWJsZS1jZWxsLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxmZS1maWxlLXByZXZpZXcgW3dpZHRoXT1cIic4MHB4J1wiIFtzcmNdPVwicm93LnVybFwiIFtuYW1lXT1cInJvdy5uYW1lXCIgW3R5cGVdPVwicm93Lm1pbWVUeXBlXCJcbiAgICAgICAgICAgICAgICAgIFtwcmV2aWV3XT1cInRydWVcIj48L2ZlLWZpbGUtcHJldmlldz5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmd4LWRhdGF0YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICA8bmd4LWRhdGF0YWJsZS1jb2x1bW4gW25hbWVdPVwiJ0ZpbGVFeHBsb3Jlcjo6RmlsZU5hbWUnIHwgYWJwTG9jYWxpemF0aW9uXCIgcHJvcD1cIm5hbWVcIiBbc29ydGFibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbZmxleEdyb3ddPVwiNFwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCIgbmd4LWRhdGF0YWJsZS1jZWxsLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQgdGl0bGVob3ZlclwiICpuZ0lmPVwibmV3RWRpdFJvdy5pZCE9PXJvdy5pZFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0yXCI+e3sgdmFsdWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBlbmNpbC1zcXVhcmUtb1wiIHJvbGU9XCJidXR0b25cIiAoY2xpY2suc3RvcCk9XCJvbkVkaXRGaWxlTmFtZShyb3cpXCIgc3R5bGU9XCJsaW5lLWhlaWdodDoyO1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiRmlsZU5hbWVGb3JtJiZuZXdFZGl0Um93LmlkPT09cm93LmlkXCI+XG4gICAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cIkZpbGVOYW1lRm9ybVwiIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdEZpbGVOYW1lKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgXCIgdHlwZT1cInRleHRcIiAgZm9ybUNvbnRyb2xOYW1lPVwiZmlsZU5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiIGJ0biBidG4tc21cIiB0eXBlPVwic3VibWl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhLXNwaW4gZmEgZmEtc3Bpbm5lclwiICpuZ0lmPVwiaXNsb2FkaW5nXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGVja1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiICpuZ0lmPVwiIWlzbG9hZGluZ1wiPjwvaT48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiIGJ0biBidG4tc21cIiAoY2xpY2suc3RvcCk9XCJvbkNhbmNlbEZpbGVOYW1lKHJvdylcIj48aSBjbGFzcz1cImZhIGZhLXRpbWVzXCIgdHlwZT1cInJlc2V0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmd4LWRhdGF0YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICA8bmd4LWRhdGF0YWJsZS1jb2x1bW4gW25hbWVdPVwiJ0ZpbGVFeHBsb3Jlcjo6RmlsZVNpemUnIHwgYWJwTG9jYWxpemF0aW9uXCIgcHJvcD1cInNpemVcIiBbZmxleEdyb3ddPVwiMS41XCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAge3sodmFsdWV8Zm9ybWF0RmlsZVNpemUpIH19XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25neC1kYXRhdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgPG5neC1kYXRhdGFibGUtY29sdW1uIFtuYW1lXT1cIidGaWxlRXhwbG9yZXI6OkRpcmVjdG9yeScgfCBhYnBMb2NhbGl6YXRpb25cIiBwcm9wPVwiZGlyZWN0b3J5SWRcIlxuICAgICAgICAgICAgICBbc29ydGFibGVdPVwiZmFsc2VcIiBbZmxleEdyb3ddPVwiMVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCIgbmd4LWRhdGF0YWJsZS1jZWxsLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIHt7IHZhbHVlfGdldERpcmVjdG9yeU5hbWU6ZmlsZUdyb3VwTGlzdCB9fVxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiBbbmFtZV09XCInRmlsZUV4cGxvcmVyOjpDcmVhdGlvblRpbWUnIHwgYWJwTG9jYWxpemF0aW9uXCIgcHJvcD1cImNyZWF0aW9uVGltZVwiXG4gICAgICAgICAgICAgIFtmbGV4R3Jvd109XCIyXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAge3sgdmFsdWUgfCBkYXRlIDogJ1lZWVkvTU0vZGQgSEg6bW06cycgfX1cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmd4LWRhdGF0YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICA8bmd4LWRhdGF0YWJsZS1jb2x1bW4gW2ZsZXhHcm93XT1cIjFcIiBbc29ydGFibGVdPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiIG5neC1kYXRhdGFibGUtY2VsbC10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHQgcC0wXCIgKGNsaWNrLnN0b3ApPVwiZGVsZXRlRmlsZShyb3cpXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10cmFzaCB0ZXh0LXByaW1hcnkgcC0yXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICA8L25neC1kYXRhdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwidXBsb2FkUGljdHVyZVN0YXR1c0xpc3QubGVuZ3RoID4gMFwiXG4gICAgICAgICAgY2xhc3M9XCJwb3NpdGlvbi1maXhlZCBib3R0b20tMCBlbmQtMCBzaGFkb3ctbGcgZmlsZS1zdGF0dXMtbW9kYWwgICBtLTVcIiBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDEwcHhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHAtMCBweS0xIGJvcmRlci1ib3R0b21cIj5cbiAgICAgICAgICAgICAgPGRpdj57eydGaWxlRXhwbG9yZXI6OlVwbG9hZEZpbGVzJyB8IGFicExvY2FsaXphdGlvbn19PC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrLnN0b3ApPVwiY2xvc2VGaWxlU3RhdHVzTW9kYWwoKVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydGaWxlRXhwbG9yZXI6OkZpbGVOYW1lJyB8IGFicExvY2FsaXphdGlvbn19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snRmlsZUV4cGxvcmVyOjpGaWxlU2l6ZScgfCBhYnBMb2NhbGl6YXRpb259fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiB1cGxvYWRQaWN0dXJlU3RhdHVzTGlzdDsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IGl0ZW0ubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tdGV4dCB0ZXh0LWRhbmdlclwiICpuZ0lmPVwiaXRlbS5zaXplID4gc2l6ZUxpbWl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0ZpbGVFeHBsb3Jlcjo6RXhjZWVkc01heGltdW1TaXplJyB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFicExvY2FsaXphdGlvbjooc2l6ZUxpbWl0fGZvcm1hdEZpbGVTaXplKX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBpdGVtLnNpemUgfCBmb3JtYXRGaWxlU2l6ZSB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJpdGVtLnN0YXR1cyA9PT0gMVwiIGNsYXNzPVwiZmFzIGZhLWNoZWNrIHRleHQtcHJpbWFyeVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiaXRlbS5zdGF0dXMgPT09IDJcIiBjbGFzcz1cImZhcyBmYS10aW1lcy1jaXJjbGUgdGV4dC1kYW5nZXJcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLXRlbXBsYXRlICNhYnBGb290ZXI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIGFicENsb3NlPnt7J0FicFVpOjpDbG9zZScgfCBhYnBMb2NhbGl6YXRpb259fTwvYnV0dG9uPlxuICAgIDxhYnAtYnV0dG9uIGljb25DbGFzcz1cImZhIGZhLWNoZWNrXCIgKGNsaWNrKT1cIm1vZGFsU2F2ZSgpXCI+e3snRmlsZUV4cGxvcmVyOjpDb25maXJtJyB8IGFicExvY2FsaXphdGlvbn19XG4gICAgICBAaWYoc2VsZWN0ZWRUYWJsZS5sZW5ndGg+MCl7XG4gICAgICAoe3tzZWxlY3RlZFRhYmxlLmxlbmd0aH19KVxuICAgICAgfVxuICAgIDwvYWJwLWJ1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvYWJwLW1vZGFsPiJdfQ==
|