tin-spa 2.13.2 → 2.13.4
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/esm2020/lib/classes/Classes.mjs +1 -1
- package/esm2020/lib/classes/TinCore.mjs +3 -2
- package/esm2020/lib/components/alert/alert.component.mjs +3 -3
- package/esm2020/lib/components/statuses/statuses.component.mjs +46 -0
- package/esm2020/lib/components/table/detailsDialog.component.mjs +24 -9
- package/esm2020/lib/components/table-internal/detailsDialog-internal.component.mjs +23 -8
- package/esm2020/lib/components/table-lite/detailsDialog-lite.component.mjs +27 -11
- package/esm2020/lib/tin-spa.module.mjs +6 -5
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/tin-spa.mjs +105 -21
- package/fesm2015/tin-spa.mjs.map +1 -1
- package/fesm2020/tin-spa.mjs +105 -21
- package/fesm2020/tin-spa.mjs.map +1 -1
- package/lib/classes/Classes.d.ts +17 -0
- package/lib/classes/TinCore.d.ts +1 -0
- package/lib/components/statuses/statuses.component.d.ts +12 -0
- package/lib/components/table/detailsDialog.component.d.ts +2 -1
- package/lib/components/table-internal/detailsDialog-internal.component.d.ts +2 -1
- package/lib/components/table-lite/detailsDialog-lite.component.d.ts +2 -1
- package/lib/tin-spa.module.d.ts +6 -5
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -24,8 +24,9 @@ import * as i18 from "../steps/steps.component";
|
|
|
24
24
|
import * as i19 from "../table-internal/table-internal.component";
|
|
25
25
|
import * as i20 from "../form/form.component";
|
|
26
26
|
import * as i21 from "../alert/alert.component";
|
|
27
|
-
import * as i22 from "
|
|
28
|
-
import * as i23 from "../../
|
|
27
|
+
import * as i22 from "../statuses/statuses.component";
|
|
28
|
+
import * as i23 from "../../pipes/camelToWords.pipe";
|
|
29
|
+
import * as i24 from "../../classes/Classes";
|
|
29
30
|
export class DetailsDialog {
|
|
30
31
|
constructor(breakpointObserver, loaderService, dataService, messageService, dialogRef, detailsConfig, buttonService, dialogService, authService, tableConfigService) {
|
|
31
32
|
this.breakpointObserver = breakpointObserver;
|
|
@@ -59,11 +60,12 @@ export class DetailsDialog {
|
|
|
59
60
|
});
|
|
60
61
|
}
|
|
61
62
|
ngOnInit() {
|
|
62
|
-
const { tableConfig, tableConfigs, formConfig, stepConfig, buttons } = DetailsDialogProcessor.initializeConfigs(this.detailsConfig);
|
|
63
|
+
const { tableConfig, tableConfigs, formConfig, stepConfig, statusConfig, buttons } = DetailsDialogProcessor.initializeConfigs(this.detailsConfig);
|
|
63
64
|
this.tableConfig = tableConfig;
|
|
64
65
|
this.tableConfigs = tableConfigs;
|
|
65
66
|
this.formConfig = formConfig;
|
|
66
67
|
this.stepConfig = stepConfig;
|
|
68
|
+
this.statusConfig = statusConfig;
|
|
67
69
|
this.buttons = buttons;
|
|
68
70
|
let resp = DetailsDialogProcessor.handleFormMode(this.detailsConfig, this.formConfig);
|
|
69
71
|
if (resp.loadByAction) {
|
|
@@ -336,10 +338,23 @@ export class DetailsDialog {
|
|
|
336
338
|
this.messageService.toast("Updated");
|
|
337
339
|
}
|
|
338
340
|
if (button.onSuccess) {
|
|
339
|
-
button.onSuccess(apiResponse, this.details);
|
|
341
|
+
button.onSuccess(apiResponse.data, this.details);
|
|
340
342
|
}
|
|
341
343
|
if (button.keepOpen) {
|
|
342
|
-
|
|
344
|
+
if (button.name === 'create' && apiResponse.data) {
|
|
345
|
+
this.details = apiResponse.data;
|
|
346
|
+
if (this.detailsConfig.heroField && apiResponse.data[this.detailsConfig.heroField]) {
|
|
347
|
+
this.detailsConfig.heroValue = apiResponse.data[this.detailsConfig.heroField];
|
|
348
|
+
this.formConfig.heroField = this.detailsConfig.heroField;
|
|
349
|
+
this.formConfig.heroValue = this.detailsConfig.heroValue;
|
|
350
|
+
}
|
|
351
|
+
this.formConfig.mode = 'edit';
|
|
352
|
+
this.setTitleAction();
|
|
353
|
+
this.isLoadComplete = true;
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
this.refreshData();
|
|
357
|
+
}
|
|
343
358
|
}
|
|
344
359
|
else {
|
|
345
360
|
this.dialogRef.close({ message: 'success', data: { ...apiResponse, data: button.name == 'create' ? apiResponse.data : this.details } });
|
|
@@ -360,15 +375,15 @@ export class DetailsDialog {
|
|
|
360
375
|
}
|
|
361
376
|
}
|
|
362
377
|
DetailsDialog.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DetailsDialog, deps: [{ token: i1.BreakpointObserver }, { token: i2.LoaderService }, { token: i3.DataServiceLib }, { token: i4.MessageService }, { token: i5.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i6.ButtonService }, { token: i7.DialogService }, { token: i8.AuthService }, { token: i9.TableConfigService }], target: i0.ɵɵFactoryTarget.Component });
|
|
363
|
-
DetailsDialog.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: DetailsDialog, selector: "spa-detailsDialog", outputs: { inputChange: "inputChange" }, ngImport: i0, template: "<div class=\"dialog-container\">\r\n\r\n <div class=\"dialog-content\">\r\n\r\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isProcessing && dataService.appConfig.progressLine\"></mat-progress-bar>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-2\">\r\n\r\n <div>\r\n <label style=\"font-size: 20px; font-weight:500;margin-bottom: 10px;\" >{{titleAction | titlecase}} {{formConfig?.title}}</label>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n\r\n <spa-check *ngIf=\"detailsConfig.autoRefreshConfig\" display=\"Auto Refresh\" [(value)]=\"autoRefreshEnabled\" (valueChange)=\"toggleAutoRefresh()\"></spa-check>\r\n\r\n <div *ngIf=\"formConfig.mode=='view' && editButton && testVisible(details,editButton.name)\">\r\n <button mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Edit\" color=\"primary\" (click)=\"setMode('edit')\" [disabled]=\"testDisabled(details,editButton.name)\"><mat-icon>edit</mat-icon></button>\r\n </div>\r\n\r\n <button [disabled]=\"isProcessing\" *ngIf=\"loadByAction\" mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Refresh\" color=\"primary\" (click)=\"loadData(formConfig.loadAction, detailsConfig.causeTableRefresh)\"><mat-icon class=\"refreshIcon\">cached</mat-icon></button>\r\n </div>\r\n\r\n </div>\r\n\r\n <mat-dialog-content class=\"mat-typography dialog-scroll-content\">\r\n\r\n <spa-steps *ngIf=\"stepConfig && details\" [config]=\"stepConfig\" [data]=\"details\"></spa-steps>\r\n\r\n <spa-alert [alertMessages]=\"formConfig.alertMessages\" [data]=\"details\"></spa-alert>\r\n\r\n <div class=\"tin-input\" style=\"font-size:14px\">\r\n\r\n <p *ngIf=\"formConfig && !details\"><em>Loading...</em></p>\r\n\r\n <spa-form *ngIf=\"formConfig && details\" [files]=\"files\" [data]=\"details\" [config]=\"formConfig\" (inputChange)=\"inputChanged($event)\">\r\n <ng-template #dynamicSelect let-field=\"field\" let-data=\"data\" let-testReadOnly=\"testReadOnly\" let-selectChanged=\"selectChanged\">\r\n <spa-select\r\n [display]=\"field.alias ?? field.name | camelToWords\"\r\n [width]=\"field.width\"\r\n [nullable]=\"field.nullable\"\r\n [options]=\"field.options\"\r\n [masterOptions]=\"field.masterOptions\"\r\n [masterField]=\"field.masterField\"\r\n [optionDisplay]=\"field.optionDisplay ?? 'name'\"\r\n [optionValue]=\"field.optionValue ?? 'value'\"\r\n [(value)]=\"data[field.name]\"\r\n [defaultFirstValue]=\"field.defaultFirstValue\"\r\n [readonly]=\"testReadOnly(field)\"\r\n [hint]=\"field.hint\"\r\n [detailsConfig]=\"field.detailsConfig\"\r\n [loadAction]=\"field.loadAction\"\r\n [loadIDField]=\"field.loadIDField\"\r\n [field]=\"field\"\r\n [data]=\"data\"\r\n [infoMessage]=\"field.infoMessage\"\r\n [copyContent]=\"field.copyContent\"\r\n (valueChange)=\"selectChanged(field)\"\r\n ></spa-select>\r\n </ng-template>\r\n </spa-form>\r\n\r\n\r\n <mat-tab-group *ngIf=\"tableConfigs\" (selectedTabChange)=\"onTabChange($event)\">\r\n\r\n <ng-container *ngFor=\"let tbl of tableConfigService.getVisibleTableConfigs(tableConfigs) ; let i = index\">\r\n <mat-tab *ngIf=\"testVisibleTab(tbl)\">\r\n\r\n <ng-template matTabLabel>\r\n <span>{{tbl.tabTitle ?? 'Untitled'}}</span>\r\n </ng-template>\r\n\r\n <spa-table-internal \r\n [config]=\"tbl\" \r\n [reload]=\"tableReload\" \r\n [inTab]=\"true\"\r\n [activeTab]=\"selectedTabIndex === i\"\r\n (actionSuccess)=\"tbl.causeFormRefresh ? loadData(formConfig.loadAction, false) : null\">\r\n </spa-table-internal>\r\n\r\n </mat-tab>\r\n </ng-container>\r\n\r\n </mat-tab-group>\r\n\r\n\r\n\r\n </div>\r\n\r\n </mat-dialog-content>\r\n\r\n\r\n </div>\r\n\r\n <mat-dialog-actions >\r\n\r\n <div>\r\n\r\n <button mat-raised-button [disabled]=\"isProcessing\" *ngIf=\"formConfig.mode=='create' && createButton\" color=\"primary\"\r\n (click)=\"create()\" cdkFocusInitial>{{createButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <button mat-raised-button [disabled]=\"isProcessing\" *ngIf=\"formConfig.mode=='edit' && editButton\" color=\"primary\"\r\n (click)=\"edit()\" cdkFocusInitial>{{editButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <ng-container *ngFor=\"let btn of extraButtons\">\r\n <button *ngIf=\"testVisible(details,btn.name)\" mat-stroked-button [disabled]=\"isProcessing || testDisabled(details,btn.name)\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\" (click)=\"custom(btn)\" cdkFocusInitial
|
|
378
|
+
DetailsDialog.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: DetailsDialog, selector: "spa-detailsDialog", outputs: { inputChange: "inputChange" }, ngImport: i0, template: "<div class=\"dialog-container\">\r\n\r\n <div class=\"dialog-content\">\r\n\r\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isProcessing && dataService.appConfig.progressLine\"></mat-progress-bar>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-2\">\r\n\r\n <div>\r\n <label style=\"font-size: 20px; font-weight:500;margin-bottom: 10px;\" >{{titleAction | titlecase}} {{formConfig?.title}}</label>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n\r\n <spa-check *ngIf=\"detailsConfig.autoRefreshConfig\" display=\"Auto Refresh\" [(value)]=\"autoRefreshEnabled\" (valueChange)=\"toggleAutoRefresh()\"></spa-check>\r\n\r\n <div *ngIf=\"formConfig.mode=='view' && editButton && testVisible(details,editButton.name)\">\r\n <button mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Edit\" color=\"primary\" (click)=\"setMode('edit')\" [disabled]=\"testDisabled(details,editButton.name)\"><mat-icon>edit</mat-icon></button>\r\n </div>\r\n\r\n <button [disabled]=\"isProcessing\" *ngIf=\"loadByAction\" mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Refresh\" color=\"primary\" (click)=\"loadData(formConfig.loadAction, detailsConfig.causeTableRefresh)\"><mat-icon class=\"refreshIcon\">cached</mat-icon></button>\r\n </div>\r\n\r\n </div>\r\n\r\n <mat-dialog-content class=\"mat-typography dialog-scroll-content\">\r\n\r\n <spa-steps *ngIf=\"stepConfig && details\" [config]=\"stepConfig\" [data]=\"details\"></spa-steps>\r\n\r\n <spa-statuses *ngIf=\"statusConfig && details\" [config]=\"statusConfig\" [data]=\"details\"></spa-statuses>\r\n\r\n <spa-alert [alertMessages]=\"formConfig.alertMessages\" [data]=\"details\"></spa-alert>\r\n\r\n <div class=\"tin-input\" style=\"font-size:14px\">\r\n\r\n <p *ngIf=\"formConfig && !details\"><em>Loading...</em></p>\r\n\r\n <spa-form *ngIf=\"formConfig && details\" [files]=\"files\" [data]=\"details\" [config]=\"formConfig\" (inputChange)=\"inputChanged($event)\">\r\n <ng-template #dynamicSelect let-field=\"field\" let-data=\"data\" let-testReadOnly=\"testReadOnly\" let-selectChanged=\"selectChanged\">\r\n <spa-select\r\n [display]=\"field.alias ?? field.name | camelToWords\"\r\n [width]=\"field.width\"\r\n [nullable]=\"field.nullable\"\r\n [options]=\"field.options\"\r\n [masterOptions]=\"field.masterOptions\"\r\n [masterField]=\"field.masterField\"\r\n [optionDisplay]=\"field.optionDisplay ?? 'name'\"\r\n [optionValue]=\"field.optionValue ?? 'value'\"\r\n [(value)]=\"data[field.name]\"\r\n [defaultFirstValue]=\"field.defaultFirstValue\"\r\n [readonly]=\"testReadOnly(field)\"\r\n [hint]=\"field.hint\"\r\n [detailsConfig]=\"field.detailsConfig\"\r\n [loadAction]=\"field.loadAction\"\r\n [loadIDField]=\"field.loadIDField\"\r\n [field]=\"field\"\r\n [data]=\"data\"\r\n [infoMessage]=\"field.infoMessage\"\r\n [copyContent]=\"field.copyContent\"\r\n (valueChange)=\"selectChanged(field)\"\r\n ></spa-select>\r\n </ng-template>\r\n </spa-form>\r\n\r\n\r\n <mat-tab-group *ngIf=\"tableConfigs\" (selectedTabChange)=\"onTabChange($event)\">\r\n\r\n <ng-container *ngFor=\"let tbl of tableConfigService.getVisibleTableConfigs(tableConfigs) ; let i = index\">\r\n <mat-tab *ngIf=\"testVisibleTab(tbl)\">\r\n\r\n <ng-template matTabLabel>\r\n <span>{{tbl.tabTitle ?? 'Untitled'}}</span>\r\n </ng-template>\r\n\r\n <spa-table-internal \r\n [config]=\"tbl\" \r\n [reload]=\"tableReload\" \r\n [inTab]=\"true\"\r\n [activeTab]=\"selectedTabIndex === i\"\r\n (actionSuccess)=\"tbl.causeFormRefresh ? loadData(formConfig.loadAction, false) : null\">\r\n </spa-table-internal>\r\n\r\n </mat-tab>\r\n </ng-container>\r\n\r\n </mat-tab-group>\r\n\r\n\r\n\r\n </div>\r\n\r\n </mat-dialog-content>\r\n\r\n\r\n </div>\r\n\r\n <mat-dialog-actions >\r\n\r\n <div>\r\n\r\n <button mat-raised-button [disabled]=\"isProcessing\" *ngIf=\"formConfig.mode=='create' && createButton\" color=\"primary\"\r\n (click)=\"create()\" cdkFocusInitial>{{createButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <button mat-raised-button [disabled]=\"isProcessing\" *ngIf=\"formConfig.mode=='edit' && editButton\" color=\"primary\"\r\n (click)=\"edit()\" cdkFocusInitial>{{editButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <ng-container *ngFor=\"let btn of extraButtons\">\r\n <button *ngIf=\"testVisible(details,btn.name)\" mat-stroked-button [disabled]=\"isProcessing || testDisabled(details,btn.name)\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\" (click)=\"custom(btn)\" cdkFocusInitial>\r\n <mat-icon *ngIf=\"btn.icon\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\">{{btn.icon.name}}</mat-icon>\r\n {{btn.display ?? btn.name | titlecase}}\r\n </button>\r\n </ng-container>\r\n\r\n <button mat-stroked-button color=\"primary\" (click)=\"close()\">Cancel</button>\r\n\r\n </div>\r\n\r\n <div class=\"col d-flex justify-content-end\" *ngIf=\"smallScreen\">\r\n <button mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Delete\" [disabled]=\"isProcessing\" style=\"color: red;\" (click)=\"delete()\" *ngIf=\"formConfig.mode!='create' && deleteButton\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n\r\n\r\n </mat-dialog-actions>\r\n\r\n\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n", styles: [".top{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:10px;margin-top:10px}.mat-mini-fab{width:32px;height:32px}.mat-mini-fab mat-icon{font-size:16px;margin-top:-3px}.mat-icon-button{width:32px;height:32px}.mat-icon-button mat-icon{font-size:20px;margin-top:-7px}.col-icon{margin-left:10px}.title{margin-top:10px;font-size:larger;font-weight:300}.make-gray{background-color:#e5e5e5}.right-padding{padding-right:10px}.action-buttons-container{display:flex;justify-content:flex-end;align-items:center}.refreshIcon{font-size:22px!important;margin-top:-7px!important}.dialog-container{display:flex;flex-direction:column;height:100%}.dialog-content{flex:1;display:flex;flex-direction:column}.dialog-scroll-content{flex:1;overflow-y:auto}mat-dialog-actions{flex-shrink:0}\n"], dependencies: [{ kind: "directive", type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i11.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i5.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i13.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i13.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i13.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "directive", type: i14.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i15.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i16.CheckComponent, selector: "spa-check", inputs: ["readonly", "display", "value", "infoMessage"], outputs: ["valueChange", "click", "check", "uncheck", "infoClick"] }, { kind: "component", type: i17.SelectComponent, selector: "spa-select", inputs: ["detailsConfig"] }, { kind: "component", type: i18.StepsComponent, selector: "spa-steps", inputs: ["value", "config", "data"] }, { kind: "component", type: i19.TableInternalComponent, selector: "spa-table-internal", inputs: ["data", "tileData", "config", "reload", "activeTab", "inTab"], outputs: ["dataLoad", "actionSuccess", "refreshClick", "searchClick", "createClick", "actionClick", "inputChange", "actionResponse"] }, { kind: "component", type: i20.FormComponent, selector: "spa-form", inputs: ["files", "data", "config"], outputs: ["buttonClick", "inputChange"] }, { kind: "component", type: i21.AlertComponent, selector: "spa-alert", inputs: ["alertMessages", "data"] }, { kind: "component", type: i22.StatusesComponent, selector: "spa-statuses", inputs: ["config", "data"] }, { kind: "pipe", type: i10.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i23.CamelToWordsPipe, name: "camelToWords" }] });
|
|
364
379
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DetailsDialog, decorators: [{
|
|
365
380
|
type: Component,
|
|
366
|
-
args: [{ selector: 'spa-detailsDialog', template: "<div class=\"dialog-container\">\r\n\r\n <div class=\"dialog-content\">\r\n\r\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isProcessing && dataService.appConfig.progressLine\"></mat-progress-bar>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-2\">\r\n\r\n <div>\r\n <label style=\"font-size: 20px; font-weight:500;margin-bottom: 10px;\" >{{titleAction | titlecase}} {{formConfig?.title}}</label>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n\r\n <spa-check *ngIf=\"detailsConfig.autoRefreshConfig\" display=\"Auto Refresh\" [(value)]=\"autoRefreshEnabled\" (valueChange)=\"toggleAutoRefresh()\"></spa-check>\r\n\r\n <div *ngIf=\"formConfig.mode=='view' && editButton && testVisible(details,editButton.name)\">\r\n <button mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Edit\" color=\"primary\" (click)=\"setMode('edit')\" [disabled]=\"testDisabled(details,editButton.name)\"><mat-icon>edit</mat-icon></button>\r\n </div>\r\n\r\n <button [disabled]=\"isProcessing\" *ngIf=\"loadByAction\" mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Refresh\" color=\"primary\" (click)=\"loadData(formConfig.loadAction, detailsConfig.causeTableRefresh)\"><mat-icon class=\"refreshIcon\">cached</mat-icon></button>\r\n </div>\r\n\r\n </div>\r\n\r\n <mat-dialog-content class=\"mat-typography dialog-scroll-content\">\r\n\r\n <spa-steps *ngIf=\"stepConfig && details\" [config]=\"stepConfig\" [data]=\"details\"></spa-steps>\r\n\r\n <spa-alert [alertMessages]=\"formConfig.alertMessages\" [data]=\"details\"></spa-alert>\r\n\r\n <div class=\"tin-input\" style=\"font-size:14px\">\r\n\r\n <p *ngIf=\"formConfig && !details\"><em>Loading...</em></p>\r\n\r\n <spa-form *ngIf=\"formConfig && details\" [files]=\"files\" [data]=\"details\" [config]=\"formConfig\" (inputChange)=\"inputChanged($event)\">\r\n <ng-template #dynamicSelect let-field=\"field\" let-data=\"data\" let-testReadOnly=\"testReadOnly\" let-selectChanged=\"selectChanged\">\r\n <spa-select\r\n [display]=\"field.alias ?? field.name | camelToWords\"\r\n [width]=\"field.width\"\r\n [nullable]=\"field.nullable\"\r\n [options]=\"field.options\"\r\n [masterOptions]=\"field.masterOptions\"\r\n [masterField]=\"field.masterField\"\r\n [optionDisplay]=\"field.optionDisplay ?? 'name'\"\r\n [optionValue]=\"field.optionValue ?? 'value'\"\r\n [(value)]=\"data[field.name]\"\r\n [defaultFirstValue]=\"field.defaultFirstValue\"\r\n [readonly]=\"testReadOnly(field)\"\r\n [hint]=\"field.hint\"\r\n [detailsConfig]=\"field.detailsConfig\"\r\n [loadAction]=\"field.loadAction\"\r\n [loadIDField]=\"field.loadIDField\"\r\n [field]=\"field\"\r\n [data]=\"data\"\r\n [infoMessage]=\"field.infoMessage\"\r\n [copyContent]=\"field.copyContent\"\r\n (valueChange)=\"selectChanged(field)\"\r\n ></spa-select>\r\n </ng-template>\r\n </spa-form>\r\n\r\n\r\n <mat-tab-group *ngIf=\"tableConfigs\" (selectedTabChange)=\"onTabChange($event)\">\r\n\r\n <ng-container *ngFor=\"let tbl of tableConfigService.getVisibleTableConfigs(tableConfigs) ; let i = index\">\r\n <mat-tab *ngIf=\"testVisibleTab(tbl)\">\r\n\r\n <ng-template matTabLabel>\r\n <span>{{tbl.tabTitle ?? 'Untitled'}}</span>\r\n </ng-template>\r\n\r\n <spa-table-internal \r\n [config]=\"tbl\" \r\n [reload]=\"tableReload\" \r\n [inTab]=\"true\"\r\n [activeTab]=\"selectedTabIndex === i\"\r\n (actionSuccess)=\"tbl.causeFormRefresh ? loadData(formConfig.loadAction, false) : null\">\r\n </spa-table-internal>\r\n\r\n </mat-tab>\r\n </ng-container>\r\n\r\n </mat-tab-group>\r\n\r\n\r\n\r\n </div>\r\n\r\n </mat-dialog-content>\r\n\r\n\r\n </div>\r\n\r\n <mat-dialog-actions >\r\n\r\n <div>\r\n\r\n <button mat-raised-button [disabled]=\"isProcessing\" *ngIf=\"formConfig.mode=='create' && createButton\" color=\"primary\"\r\n (click)=\"create()\" cdkFocusInitial>{{createButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <button mat-raised-button [disabled]=\"isProcessing\" *ngIf=\"formConfig.mode=='edit' && editButton\" color=\"primary\"\r\n (click)=\"edit()\" cdkFocusInitial>{{editButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <ng-container *ngFor=\"let btn of extraButtons\">\r\n <button *ngIf=\"testVisible(details,btn.name)\" mat-stroked-button [disabled]=\"isProcessing || testDisabled(details,btn.name)\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\" (click)=\"custom(btn)\" cdkFocusInitial
|
|
367
|
-
}], ctorParameters: function () { return [{ type: i1.BreakpointObserver }, { type: i2.LoaderService }, { type: i3.DataServiceLib }, { type: i4.MessageService }, { type: i5.MatDialogRef }, { type:
|
|
381
|
+
args: [{ selector: 'spa-detailsDialog', template: "<div class=\"dialog-container\">\r\n\r\n <div class=\"dialog-content\">\r\n\r\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isProcessing && dataService.appConfig.progressLine\"></mat-progress-bar>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-2\">\r\n\r\n <div>\r\n <label style=\"font-size: 20px; font-weight:500;margin-bottom: 10px;\" >{{titleAction | titlecase}} {{formConfig?.title}}</label>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n\r\n <spa-check *ngIf=\"detailsConfig.autoRefreshConfig\" display=\"Auto Refresh\" [(value)]=\"autoRefreshEnabled\" (valueChange)=\"toggleAutoRefresh()\"></spa-check>\r\n\r\n <div *ngIf=\"formConfig.mode=='view' && editButton && testVisible(details,editButton.name)\">\r\n <button mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Edit\" color=\"primary\" (click)=\"setMode('edit')\" [disabled]=\"testDisabled(details,editButton.name)\"><mat-icon>edit</mat-icon></button>\r\n </div>\r\n\r\n <button [disabled]=\"isProcessing\" *ngIf=\"loadByAction\" mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Refresh\" color=\"primary\" (click)=\"loadData(formConfig.loadAction, detailsConfig.causeTableRefresh)\"><mat-icon class=\"refreshIcon\">cached</mat-icon></button>\r\n </div>\r\n\r\n </div>\r\n\r\n <mat-dialog-content class=\"mat-typography dialog-scroll-content\">\r\n\r\n <spa-steps *ngIf=\"stepConfig && details\" [config]=\"stepConfig\" [data]=\"details\"></spa-steps>\r\n\r\n <spa-statuses *ngIf=\"statusConfig && details\" [config]=\"statusConfig\" [data]=\"details\"></spa-statuses>\r\n\r\n <spa-alert [alertMessages]=\"formConfig.alertMessages\" [data]=\"details\"></spa-alert>\r\n\r\n <div class=\"tin-input\" style=\"font-size:14px\">\r\n\r\n <p *ngIf=\"formConfig && !details\"><em>Loading...</em></p>\r\n\r\n <spa-form *ngIf=\"formConfig && details\" [files]=\"files\" [data]=\"details\" [config]=\"formConfig\" (inputChange)=\"inputChanged($event)\">\r\n <ng-template #dynamicSelect let-field=\"field\" let-data=\"data\" let-testReadOnly=\"testReadOnly\" let-selectChanged=\"selectChanged\">\r\n <spa-select\r\n [display]=\"field.alias ?? field.name | camelToWords\"\r\n [width]=\"field.width\"\r\n [nullable]=\"field.nullable\"\r\n [options]=\"field.options\"\r\n [masterOptions]=\"field.masterOptions\"\r\n [masterField]=\"field.masterField\"\r\n [optionDisplay]=\"field.optionDisplay ?? 'name'\"\r\n [optionValue]=\"field.optionValue ?? 'value'\"\r\n [(value)]=\"data[field.name]\"\r\n [defaultFirstValue]=\"field.defaultFirstValue\"\r\n [readonly]=\"testReadOnly(field)\"\r\n [hint]=\"field.hint\"\r\n [detailsConfig]=\"field.detailsConfig\"\r\n [loadAction]=\"field.loadAction\"\r\n [loadIDField]=\"field.loadIDField\"\r\n [field]=\"field\"\r\n [data]=\"data\"\r\n [infoMessage]=\"field.infoMessage\"\r\n [copyContent]=\"field.copyContent\"\r\n (valueChange)=\"selectChanged(field)\"\r\n ></spa-select>\r\n </ng-template>\r\n </spa-form>\r\n\r\n\r\n <mat-tab-group *ngIf=\"tableConfigs\" (selectedTabChange)=\"onTabChange($event)\">\r\n\r\n <ng-container *ngFor=\"let tbl of tableConfigService.getVisibleTableConfigs(tableConfigs) ; let i = index\">\r\n <mat-tab *ngIf=\"testVisibleTab(tbl)\">\r\n\r\n <ng-template matTabLabel>\r\n <span>{{tbl.tabTitle ?? 'Untitled'}}</span>\r\n </ng-template>\r\n\r\n <spa-table-internal \r\n [config]=\"tbl\" \r\n [reload]=\"tableReload\" \r\n [inTab]=\"true\"\r\n [activeTab]=\"selectedTabIndex === i\"\r\n (actionSuccess)=\"tbl.causeFormRefresh ? loadData(formConfig.loadAction, false) : null\">\r\n </spa-table-internal>\r\n\r\n </mat-tab>\r\n </ng-container>\r\n\r\n </mat-tab-group>\r\n\r\n\r\n\r\n </div>\r\n\r\n </mat-dialog-content>\r\n\r\n\r\n </div>\r\n\r\n <mat-dialog-actions >\r\n\r\n <div>\r\n\r\n <button mat-raised-button [disabled]=\"isProcessing\" *ngIf=\"formConfig.mode=='create' && createButton\" color=\"primary\"\r\n (click)=\"create()\" cdkFocusInitial>{{createButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <button mat-raised-button [disabled]=\"isProcessing\" *ngIf=\"formConfig.mode=='edit' && editButton\" color=\"primary\"\r\n (click)=\"edit()\" cdkFocusInitial>{{editButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <ng-container *ngFor=\"let btn of extraButtons\">\r\n <button *ngIf=\"testVisible(details,btn.name)\" mat-stroked-button [disabled]=\"isProcessing || testDisabled(details,btn.name)\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\" (click)=\"custom(btn)\" cdkFocusInitial>\r\n <mat-icon *ngIf=\"btn.icon\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\">{{btn.icon.name}}</mat-icon>\r\n {{btn.display ?? btn.name | titlecase}}\r\n </button>\r\n </ng-container>\r\n\r\n <button mat-stroked-button color=\"primary\" (click)=\"close()\">Cancel</button>\r\n\r\n </div>\r\n\r\n <div class=\"col d-flex justify-content-end\" *ngIf=\"smallScreen\">\r\n <button mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Delete\" [disabled]=\"isProcessing\" style=\"color: red;\" (click)=\"delete()\" *ngIf=\"formConfig.mode!='create' && deleteButton\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n\r\n\r\n </mat-dialog-actions>\r\n\r\n\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n", styles: [".top{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:10px;margin-top:10px}.mat-mini-fab{width:32px;height:32px}.mat-mini-fab mat-icon{font-size:16px;margin-top:-3px}.mat-icon-button{width:32px;height:32px}.mat-icon-button mat-icon{font-size:20px;margin-top:-7px}.col-icon{margin-left:10px}.title{margin-top:10px;font-size:larger;font-weight:300}.make-gray{background-color:#e5e5e5}.right-padding{padding-right:10px}.action-buttons-container{display:flex;justify-content:flex-end;align-items:center}.refreshIcon{font-size:22px!important;margin-top:-7px!important}.dialog-container{display:flex;flex-direction:column;height:100%}.dialog-content{flex:1;display:flex;flex-direction:column}.dialog-scroll-content{flex:1;overflow-y:auto}mat-dialog-actions{flex-shrink:0}\n"] }]
|
|
382
|
+
}], ctorParameters: function () { return [{ type: i1.BreakpointObserver }, { type: i2.LoaderService }, { type: i3.DataServiceLib }, { type: i4.MessageService }, { type: i5.MatDialogRef }, { type: i24.DetailsDialogConfig, decorators: [{
|
|
368
383
|
type: Inject,
|
|
369
384
|
args: [MAT_DIALOG_DATA]
|
|
370
385
|
}] }, { type: i6.ButtonService }, { type: i7.DialogService }, { type: i8.AuthService }, { type: i9.TableConfigService }]; }, propDecorators: { inputChange: [{
|
|
371
386
|
type: Output
|
|
372
387
|
}] } });
|
|
373
388
|
;
|
|
374
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsc0RpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90aW4tc3BhL3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9kZXRhaWxzRGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rpbi1zcGEvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL2RldGFpbHNEaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsZUFBZSxFQUFnQixNQUFNLDBCQUEwQixDQUFDO0FBSXpFLE9BQU8sRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUdyRSxPQUFPLEVBQUUsT0FBTyxFQUF3QixRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFZL0QsTUFBTSxPQUFPLGFBQWE7SUFFeEIsWUFBb0Isa0JBQXNDLEVBQVMsYUFBNEIsRUFBUSxXQUEyQixFQUFTLGNBQThCLEVBQy9KLFNBQXNDLEVBQWtDLGFBQWtDLEVBQVUsYUFBNEIsRUFDaEosYUFBNEIsRUFBVSxXQUF3QixFQUFTLGtCQUFzQztRQUZuRyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQVMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBUSxnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFBUyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDL0osY0FBUyxHQUFULFNBQVMsQ0FBNkI7UUFBa0Msa0JBQWEsR0FBYixhQUFhLENBQXFCO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDaEosa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxnQkFBVyxH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RUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDL0Q7SUFDSCxDQUFDOzswR0FoYVUsYUFBYSx5S0FHa0MsZUFBZTs4RkFIOUQsYUFBYSxrR0NyQjFCLGtwTEFrSUE7MkZEN0dhLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0UsbUJBQW1COzswQkFPc0IsTUFBTTsyQkFBQyxlQUFlOytKQXFGL0QsV0FBVztzQkFBcEIsTUFBTTs7QUEyVVIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5qZWN0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgRm9ybUNvbmZpZywgRmllbGQsIFRhYmxlQ29uZmlnLCBCdXR0b24sIERldGFpbHNEaWFsb2dDb25maWcsIEFjdGlvbiwgQXBpUmVzcG9uc2UsIFN0ZXBDb25maWcgfSBmcm9tICcuLi8uLi9jbGFzc2VzL0NsYXNzZXMnO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21lc3NhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IERhdGFTZXJ2aWNlTGliIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGF0YWxpYi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29yZSwgRGV0YWlsc0RpYWxvZ1Byb2Nlc3NvciB9IGZyb20gJy4uLy4uL2NsYXNzZXMvVGluQ29yZSc7XHJcbmltcG9ydCB7IExvYWRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sb2FkZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEJyZWFrcG9pbnRPYnNlcnZlciwgQnJlYWtwb2ludFN0YXRlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgY29uZmlnLCBpbnRlcnZhbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBCdXR0b25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYnV0dG9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGlhbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGguc2VydmljZSc7XHJcbmltcG9ydCB7IFRhYmxlQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RhYmxlLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWF0VGFiQ2hhbmdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc3BhLWRldGFpbHNEaWFsb2cnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kZXRhaWxzRGlhbG9nLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIERldGFpbHNEaWFsb2cgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYnJlYWtwb2ludE9ic2VydmVyOiBCcmVha3BvaW50T2JzZXJ2ZXIscHJpdmF0ZSBsb2FkZXJTZXJ2aWNlOiBMb2FkZXJTZXJ2aWNlLHB1YmxpYyBkYXRhU2VydmljZTogRGF0YVNlcnZpY2VMaWIscHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPERldGFpbHNEaWFsb2c+LCBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRldGFpbHNDb25maWc6IERldGFpbHNEaWFsb2dDb25maWcsIHByaXZhdGUgYnV0dG9uU2VydmljZTogQnV0dG9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSwgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsIHB1YmxpYyB0YWJsZUNvbmZpZ1NlcnZpY2U6IFRhYmxlQ29uZmlnU2VydmljZSlcclxuICB7XHJcbiAgICAvLyBkZXRlY3Qgc2NyZWVuIHNpemUgY2hhbmdlc1xyXG4gICAgdGhpcy5icmVha3BvaW50T2JzZXJ2ZXIub2JzZXJ2ZShbXCIobWF4LXdpZHRoOiA2MDBweClcIl0pLnN1YnNjcmliZSgocmVzdWx0OiBCcmVha3BvaW50U3RhdGUpID0+IHtcclxuXHJcbiAgICAgIGlmIChyZXN1bHQubWF0Y2hlcykge1xyXG4gICAgICAgIHRoaXMuc21hbGxTY3JlZW4gPSB0cnVlXHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICB0aGlzLnNtYWxsU2NyZWVuID0gZmFsc2VcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG4gICAgY29uc3QgeyB0YWJsZUNvbmZpZywgdGFibGVDb25maWdzLCBmb3JtQ29uZmlnLCBzdGVwQ29uZmlnLCBidXR0b25zIH0gPSBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yLmluaXRpYWxpemVDb25maWdzKHRoaXMuZGV0YWlsc0NvbmZpZyk7XHJcbiAgICB0aGlzLnRhYmxlQ29uZmlnID0gdGFibGVDb25maWc7XHJcbiAgICB0aGlzLnRhYmxlQ29uZmlncyA9IHRhYmxlQ29uZmlncztcclxuICAgIHRoaXMuZm9ybUNvbmZpZyA9IGZvcm1Db25maWc7XHJcbiAgICB0aGlzLnN0ZXBDb25maWcgPSBzdGVwQ29uZmlnO1xyXG4gICAgdGhpcy5idXR0b25zID0gYnV0dG9ucztcclxuXHJcbiAgICBsZXQgcmVzcCA9IERldGFpbHNEaWFsb2dQcm9jZXNzb3IuaGFuZGxlRm9ybU1vZGUodGhpcy5kZXRhaWxzQ29uZmlnLCB0aGlzLmZvcm1Db25maWcsKTtcclxuXHJcbiAgICBpZiAocmVzcC5sb2FkQnlBY3Rpb24pe1xyXG4gICAgICB0aGlzLmxvYWRCeUFjdGlvbiA9IHRydWU7XHJcbiAgICAgIGZvcm1Db25maWcubG9hZEFjdGlvbiA9IHJlc3AuYWN0aW9uO1xyXG4gICAgICB0aGlzLmxvYWREYXRhKHJlc3AuYWN0aW9uLCBmYWxzZSk7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5kZXRhaWxzID0gcmVzcC5kZXRhaWxzO1xyXG4gICAgICBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yLnNldEhlcm9WYWx1ZSh0aGlzLmRldGFpbHNDb25maWcsIHRoaXMuZGV0YWlscyk7XHJcbiAgICAgIHRoaXMubG9hZEJ5QWN0aW9uID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNMb2FkQ29tcGxldGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmlsZUZpZWxkID0gRGV0YWlsc0RpYWxvZ1Byb2Nlc3Nvci5zZXRGaWxlRmllbGQodGhpcy5mb3JtQ29uZmlnKTtcclxuXHJcbiAgICB0aGlzLmxvYWRlclNlcnZpY2UuaXNMb2FkaW5nLnN1YnNjcmliZSh4ID0+IHRoaXMuaXNQcm9jZXNzaW5nID0geCk7XHJcblxyXG4gICAgY29uc3QgeyBleHRyYUJ1dHRvbnMsIGNyZWF0ZUJ1dHRvbiwgZWRpdEJ1dHRvbiwgZGVsZXRlQnV0dG9uIH0gPSBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yLnNldHVwQnV0dG9ucyh0aGlzLmZvcm1Db25maWcsIHRoaXMuYnV0dG9ucyk7XHJcbiAgICB0aGlzLmV4dHJhQnV0dG9ucyA9IGV4dHJhQnV0dG9ucztcclxuICAgIHRoaXMuY3JlYXRlQnV0dG9uID0gY3JlYXRlQnV0dG9uO1xyXG4gICAgdGhpcy5lZGl0QnV0dG9uID0gZWRpdEJ1dHRvbjtcclxuICAgIHRoaXMuZGVsZXRlQnV0dG9uID0gZGVsZXRlQnV0dG9uO1xyXG5cclxuICAgIHRoaXMuc2V0VGl0bGVBY3Rpb24oKTtcclxuICAgIHRoaXMuaW5pdEF1dG9SZWZyZXNoKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAvLyBDbGVhbnVwIHN1YnNjcmlwdGlvbiBvbiBjb21wb25lbnQgZGVzdHJveVxyXG4gICAgdGhpcy5zdG9wQXV0b1JlZnJlc2goKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIGF1dG9SZWZyZXNoRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFxyXG4gIHRpdGxlQWN0aW9uID0gXCJWaWV3XCI7XHJcbiAgbG9hZEJ5QWN0aW9uID0gZmFsc2U7XHJcblxyXG4gIGV4dHJhQnV0dG9uczogQnV0dG9uW107XHJcbiAgYnV0dG9uczogQnV0dG9uW107XHJcbiAgY3JlYXRlQnV0dG9uOiBCdXR0b247XHJcbiAgZWRpdEJ1dHRvbjogQnV0dG9uO1xyXG4gIGRlbGV0ZUJ1dHRvbjogQnV0dG9uO1xyXG5cclxuICAvLyBtb2RlQnV0dG9uIDogQnV0dG9uXHJcbiAgZmlsZUZpZWxkOiBGaWVsZDtcclxuICBmaWxlczogYW55W10gPSBbXTtcclxuXHJcbiAgdGFibGVSZWxvYWQ6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICB0YWJsZUNvbmZpZzogVGFibGVDb25maWdcclxuICB0YWJsZUNvbmZpZ3MgOiBUYWJsZUNvbmZpZ1tdXHJcbiAgZGV0YWlsczogYW55XHJcbiAgZm9ybUNvbmZpZzogRm9ybUNvbmZpZztcclxuICBzdGVwQ29uZmlnIDogU3RlcENvbmZpZztcclxuICBzbWFsbFNjcmVlbiA9IGZhbHNlO1xyXG5cclxuICBpc0xvYWRDb21wbGV0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzUHJvY2Vzc2luZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgaW5wdXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHNlbGVjdGVkVGFiSW5kZXggPSAwO1xyXG4gIG9uVGFiQ2hhbmdlKGV2ZW50OiBNYXRUYWJDaGFuZ2VFdmVudCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gZXZlbnQuaW5kZXg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRBdXRvUmVmcmVzaCgpIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZGV0YWlsc0NvbmZpZy5hdXRvUmVmcmVzaENvbmZpZztcclxuICAgIGlmICghY29uZmlnKSByZXR1cm47XHJcblxyXG4gICAgLy8gU2V0IGluaXRpYWwgc3RhdGUgYmFzZWQgb24gZGVmYXVsdE9uIGNvbmZpZ3VyYXRpb25cclxuICAgIHRoaXMuYXV0b1JlZnJlc2hFbmFibGVkID0gY29uZmlnLmRlZmF1bHRPbiB8fCBmYWxzZTtcclxuXHJcbiAgICAvLyBTdGFydCBhdXRvLXJlZnJlc2ggaWYgZW5hYmxlZCBieSBkZWZhdWx0XHJcbiAgICBpZiAodGhpcy5hdXRvUmVmcmVzaEVuYWJsZWQpIHtcclxuICAgICAgdGhpcy5zdGFydEF1dG9SZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0QXV0b1JlZnJlc2goKSB7XHJcblxyXG4gICAgaWYgKCF0aGlzLmRldGFpbHNDb25maWcuYXV0b1JlZnJlc2hDb25maWcpIHJldHVybjtcclxuICAgIFxyXG4gICAgY29uc3QgcmVmcmVzaEludGVydmFsID0gdGhpcy5kZXRhaWxzQ29uZmlnLmF1dG9SZWZyZXNoQ29uZmlnLmludGVydmFsIHx8IDUwMDA7IC8vIERlZmF1bHQgdG8gNSBzZWNvbmRzXHJcbiAgICBcclxuICAgIC8vIENsZWFyIGFueSBleGlzdGluZyBzdWJzY3JpcHRpb25cclxuICAgIHRoaXMuc3RvcEF1dG9SZWZyZXNoKCk7XHJcbiAgICBcclxuICAgIC8vIENyZWF0ZSBuZXcgc3Vic2NyaXB0aW9uXHJcbiAgICB0aGlzLnJlZnJlc2hTdWJzY3JpcHRpb24gPSBpbnRlcnZhbChyZWZyZXNoSW50ZXJ2YWwpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmlzTG9hZENvbXBsZXRlICYmICF0aGlzLmlzUHJvY2Vzc2luZykge1xyXG4gICAgICAgIHRoaXMucmVmcmVzaERhdGEoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0b3BBdXRvUmVmcmVzaCgpIHtcclxuICAgIGlmICh0aGlzLnJlZnJlc2hTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5yZWZyZXNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHRoaXMucmVmcmVzaFN1YnNjcmlwdGlvbiA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVBdXRvUmVmcmVzaCgpIHtcclxuICAgIC8vIHRoaXMuYXV0b1JlZnJlc2hFbmFibGVkID0gIXRoaXMuYXV0b1JlZnJlc2hFbmFibGVkO1xyXG4gICAgXHJcbiAgICBpZiAodGhpcy5hdXRvUmVmcmVzaEVuYWJsZWQpIHtcclxuICAgICAgdGhpcy5zdGFydEF1dG9SZWZyZXNoKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0b3BBdXRvUmVmcmVzaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZERhdGEoYWN0aW9uOiBBY3Rpb24sIGNhdXNlVGFibGVzUmVsb2FkKSB7XHJcblxyXG4gICAgaWYgKGFjdGlvbiAmJiB0aGlzLmxvYWRCeUFjdGlvbikge1xyXG5cclxuICAgICAgdGhpcy5kYXRhU2VydmljZS5DYWxsQXBpKGFjdGlvbikuc3Vic2NyaWJlKChhcGlSZXNwb25zZTogQXBpUmVzcG9uc2UpID0+IHtcclxuXHJcbiAgICAgICAgaWYgKGFwaVJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgIHRoaXMuZGV0YWlscyA9IGFwaVJlc3BvbnNlLmRhdGFcclxuICAgICAgICAgIHRoaXMuaXNMb2FkQ29tcGxldGUgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gRGV0YWlsc0RpYWxvZ1Byb2Nlc3Nvci5zZXRIZXJvVmFsdWUodGhpcy5kZXRhaWxzQ29uZmlnLCB0aGlzLmRldGFpbHMpO1xyXG4gICAgICAgICAgaWYoY2F1c2VUYWJsZXNSZWxvYWQpIHRoaXMudGFibGVSZWxvYWQubmV4dCh0cnVlKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLmRldGFpbHNDb25maWcuYXV0b1JlZnJlc2hDb25maWc7XHJcbiAgICAgICAgICBpZiAodGhpcy5hdXRvUmVmcmVzaEVuYWJsZWQgJiYgY29uZmlnPy5zdG9wQ29uZGl0aW9uICYmIGNvbmZpZy5zdG9wQ29uZGl0aW9uKHRoaXMuZGV0YWlscykpIHtcclxuICAgICAgICAgICAgdGhpcy5hdXRvUmVmcmVzaEVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zdG9wQXV0b1JlZnJlc2goKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoXCJFcnJvcjogXCIgKyBhcGlSZXNwb25zZS5tZXNzYWdlKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5hdXRvUmVmcmVzaEVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5hdXRvUmVmcmVzaEVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zdG9wQXV0b1JlZnJlc2goKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBpbnB1dENoYW5nZWQoZXZlbnQpIHtcclxuICAgIHRoaXMuaW5wdXRDaGFuZ2UuZW1pdCh7IGZpZWxkOiBldmVudC5maWVsZCwgdmFsdWU6IGV2ZW50LnZhbHVlIH0pXHJcbiAgfVxyXG5cclxuXHJcbiAgc2V0TW9kZShuZXdNb2RlKXtcclxuICAgIHRoaXMuZm9ybUNvbmZpZy5tb2RlID0gbmV3TW9kZVxyXG4gICAgdGhpcy5zZXRUaXRsZUFjdGlvbigpXHJcbiAgfVxyXG5cclxuICBzZXRUaXRsZUFjdGlvbigpe1xyXG4gICAgaWYgKHRoaXMuZm9ybUNvbmZpZy5maXhlZFRpdGxlKSB7XHJcbiAgICAgIHRoaXMudGl0bGVBY3Rpb24gPSBcIlwiO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50aXRsZUFjdGlvbiA9IHRoaXMuYnV0dG9uU2VydmljZS5nZXRUaXRsZUFjdGlvbih0aGlzLmZvcm1Db25maWcubW9kZSwgdGhpcy5idXR0b25zKTtcclxuICB9XHJcblxyXG4gIGdldEJ1dHRvbihuYW1lOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0QnV0dG9uKHRoaXMuYnV0dG9ucywgbmFtZSk7XHJcbiAgfVxyXG5cclxuICB0ZXN0RGlzYWJsZWQocm93LCBidXR0b25OYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKGJ1dHRvbk5hbWUpO1xyXG5cclxuICAgIGlmICghYnV0dG9uKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgYnV0dG9uIHdpdGggY29tcG9uZW50J3MgZGV0YWlsc0NvbmZpZ1xyXG4gICAgY29uc3QgYnV0dG9uV2l0aENvbmZpZyA9IHtcclxuICAgICAgLi4uYnV0dG9uLFxyXG4gICAgICBkZXRhaWxzQ29uZmlnOiBidXR0b24uZGV0YWlsc0NvbmZpZyA/IHsgLi4uYnV0dG9uLmRldGFpbHNDb25maWcgfSA6IHRoaXMuZGV0YWlsc0NvbmZpZ1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5idXR0b25TZXJ2aWNlLnRlc3REaXNhYmxlZChidXR0b25XaXRoQ29uZmlnLCByb3cpO1xyXG4gIH1cclxuXHJcblxyXG4gIHRlc3RWaXNpYmxlKHJvdywgYnV0dG9uTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbihidXR0b25OYW1lKTtcclxuICAgIGlmICghYnV0dG9uKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgYnV0dG9uIHdpdGggY29tcG9uZW50J3MgZGV0YWlsc0NvbmZpZ1xyXG4gICAgY29uc3QgYnV0dG9uV2l0aENvbmZpZyA9IHtcclxuICAgICAgLi4uYnV0dG9uLFxyXG4gICAgICBkZXRhaWxzQ29uZmlnOiBidXR0b24uZGV0YWlsc0NvbmZpZyA/IHsgLi4uYnV0dG9uLmRldGFpbHNDb25maWcgfSA6IHRoaXMuZGV0YWlsc0NvbmZpZ1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5idXR0b25TZXJ2aWNlLnRlc3RWaXNpYmxlKGJ1dHRvbldpdGhDb25maWcsIHJvdylcclxuICB9XHJcblxyXG4gIHRlc3RWaXNpYmxlVGFiKHRibENvbmZpZzogVGFibGVDb25maWcpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAoIXRoaXMudGFibGVDb25maWdTZXJ2aWNlLmhhc1RhYmxlQWNjZXNzKHRibENvbmZpZykpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmJ1dHRvblNlcnZpY2UuaXNUYWJWaXNpYmxlKHRibENvbmZpZyk7XHJcbiAgfVxyXG5cclxuICBnZXRCdXR0b25Db2xvcihidXR0b246IEJ1dHRvbiwgcm93KSB7XHJcbiAgICByZXR1cm4gdGhpcy5idXR0b25TZXJ2aWNlLmdldEJ1dHRvbkNvbG9yKGJ1dHRvbiwgcm93KTtcclxuICB9XHJcblxyXG4gIGdldFZpc2libGVGaWVsZHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29uZmlnLmZpZWxkcz8uZmlsdGVyKHggPT4gQ29yZS50ZXN0VmlzaWJsZSh0aGlzLmZvcm1Db25maWcsIHRoaXMuZGV0YWlscywgeCwgdGhpcy5hdXRoU2VydmljZS5jdXJyZW50Um9sZVNvdXJjZS52YWx1ZSkpXHJcbiAgfVxyXG5cclxuXHJcbiAgY3JlYXRlKCkge1xyXG4gICAgdGhpcy5oYW5kbGVCdXR0b25BY3Rpb24oJ2NyZWF0ZScpO1xyXG4gIH1cclxuXHJcbiAgZWRpdCgpIHtcclxuICAgIHRoaXMuaGFuZGxlQnV0dG9uQWN0aW9uKCdlZGl0Jyk7XHJcbiAgfVxyXG5cclxuICBkZWxldGUoKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0QnV0dG9uKHRoaXMuYnV0dG9ucywgJ2RlbGV0ZScpO1xyXG4gICAgaWYgKCFidXR0b24pIHJldHVybjtcclxuXHJcbiAgICBsZXQgY29uZmlybU1lc3NhZ2UgPSB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0Q29uZmlybU1lc3NhZ2UoYnV0dG9uLCB0aGlzLmRldGFpbHMpO1xyXG4gICAgaWYgKCFjb25maXJtTWVzc2FnZSkge1xyXG4gICAgICBjb25maXJtTWVzc2FnZSA9IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlID9gO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuY29uZmlybShjb25maXJtTWVzc2FnZSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCA9PSBcInllc1wiKSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVCdXR0b25BY3Rpb24oJ2RlbGV0ZScpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBjdXN0b20oYnV0dG9uOiBCdXR0b24gKSB7XHJcbiAgICBpZiAoYnV0dG9uLmRpYWxvZyAmJiBidXR0b24uZGV0YWlsc0NvbmZpZykge1xyXG4gICAgICB0aGlzLm9wZW5OZXN0ZWREZXRhaWxzRGlhbG9nKGJ1dHRvbik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmhhbmRsZUJ1dHRvbkFjdGlvbihidXR0b24ubmFtZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9wZW5OZXN0ZWREZXRhaWxzRGlhbG9nKGJ1dHRvbjogQnV0dG9uKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW5Db25maWd1cmVkRGV0YWlsc0RpYWxvZyggYnV0dG9uLCB0aGlzLmRldGFpbHMsIERldGFpbHNEaWFsb2cgKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuXHJcbiAgICAgIGlmIChyZXN1bHQuYWN0aW9uID09PSAnaW5wdXRDaGFuZ2UnKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dENoYW5nZWQocmVzdWx0LmNoYW5nZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICYmIHJlc3VsdC5tZXNzYWdlID09PSAnc3VjY2VzcycpIHtcclxuICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaERhdGEoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtQ29uZmlnLmxvYWRBY3Rpb24pIHtcclxuICAgICAgdGhpcy5sb2FkRGF0YSh0aGlzLmZvcm1Db25maWcubG9hZEFjdGlvbiwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVCdXR0b25BY3Rpb24oYnV0dG9uTmFtZTogc3RyaW5nKSB7XHJcbiAgICBcclxuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKGJ1dHRvbk5hbWUpO1xyXG4gICAgaWYgKCFidXR0b24pIHJldHVybjtcclxuICAgXHJcblxyXG4gICAgaWYgKGJ1dHRvbi5vbkNsaWNrKSB7XHJcbiAgICAgIGJ1dHRvbi5vbkNsaWNrKHRoaXMuZGV0YWlscyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wcm9jZXNzQnV0dG9uQWN0aW9uKGJ1dHRvbik7XHJcbiAgfVxyXG5cclxuICBwcm9jZXNzQnV0dG9uQWN0aW9uKGJ1dHRvbiA6IEJ1dHRvbikge1xyXG4gICAgaWYgKCFidXR0b24uYWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHsgbWVzc2FnZTogJ2VtaXQnLCBkYXRhOiB0aGlzLmRldGFpbHMgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy52YWxpZGF0ZUZvcm0oKSkge1xyXG4gICAgICB0aGlzLmV4ZWN1dGVBY3Rpb24oYnV0dG9uLCB0aGlzLmRldGFpbHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2YWxpZGF0ZUZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdmFsaWRhdGlvblJlc3VsdCA9IENvcmUudmFsaWRhdGVPYmplY3QodGhpcy5nZXRWaXNpYmxlRmllbGRzKCksIHRoaXMuZGV0YWlscyk7XHJcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdCAhPT0gJycpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdCh2YWxpZGF0aW9uUmVzdWx0KTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpbGVzLmxlbmd0aCA8IDEgJiYgdGhpcy5maWxlRmllbGQ/LnJlcXVpcmVkICYmIHRoaXMuZm9ybUNvbmZpZy5tb2RlID09PSAnY3JlYXRlJykge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiUGxlYXNlIGF0dGFjaCBmaWxlKHMpXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVmFsaWRhdGUgY29tcG9zaXRlIGZpZWxkc1xyXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiB0aGlzLmdldFZpc2libGVGaWVsZHMoKSkge1xyXG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2NvbXBvc2l0ZScpIHtcclxuICAgICAgICB2YWxpZGF0aW9uUmVzdWx0ID0gQ29yZS52YWxpZGF0ZU9iamVjdChDb3JlLmdldFZpc2libGVTdWJmaWVsZHModGhpcy5mb3JtQ29uZmlnLCB0aGlzLmRldGFpbHMsIGZpZWxkLCB0aGlzLmF1dGhTZXJ2aWNlLmN1cnJlbnRSb2xlU291cmNlLnZhbHVlKSwgdGhpcy5kZXRhaWxzLCApO1xyXG4gICAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0ICE9PSAnJykge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdCh2YWxpZGF0aW9uUmVzdWx0KTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZUFjdGlvbkRhdGEoYnV0dG9uOiBCdXR0b24sIGRhdGE6IGFueSk6IGFueSB7XHJcbiAgICBpZiAodGhpcy5idXR0b25TZXJ2aWNlLmlzRm9ybUJ1dHRvbihidXR0b24pKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChgdXBsb2FkRmlsZSR7aX1gLCB0aGlzLmZpbGVzW2ldLCB0aGlzLmZpbGVzW2ldLm5hbWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGZvcm1EYXRhLmFwcGVuZChcImRhdGFcIiwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICByZXR1cm4gZm9ybURhdGE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXhlY3V0ZUFjdGlvbihidXR0b246IEJ1dHRvbiwgZGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBhY3Rpb25EYXRhID0gdGhpcy5wcmVwYXJlQWN0aW9uRGF0YShidXR0b24sIGRhdGEpO1xyXG5cclxuICAgIGlmIChidXR0b24uY29uZmlybSkge1xyXG4gICAgICBsZXQgY29uZmlybU1lc3NhZ2UgPSB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0Q29uZmlybU1lc3NhZ2UoYnV0dG9uLCB0aGlzLmRldGFpbHMpO1xyXG5cclxuICAgICAgaWYgKCFjb25maXJtTWVzc2FnZSAmJiBidXR0b24ubmFtZSA9PSAnZGVsZXRlJykge1xyXG4gICAgICAgIGNvbmZpcm1NZXNzYWdlID0gYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgP2A7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuY29uZmlybShjb25maXJtTWVzc2FnZSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0ID09IFwieWVzXCIpIHtcclxuICAgICAgICAgIHRoaXMucGVyZm9ybUFwaUNhbGwoYnV0dG9uLCBhY3Rpb25EYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucGVyZm9ybUFwaUNhbGwoYnV0dG9uLCBhY3Rpb25EYXRhKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBlcmZvcm1BcGlDYWxsKGJ1dHRvbjogQnV0dG9uLCBkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMuZGF0YVNlcnZpY2UuQ2FsbEFwaShidXR0b24uYWN0aW9uLCBkYXRhKS5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlOiBBcGlSZXNwb25zZSkgPT4ge1xyXG5cclxuICAgICAgaWYgKGFwaVJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuXHJcbiAgICAgICAgaWYgKGFwaVJlc3BvbnNlLm1lc3NhZ2UuaW5jbHVkZXMoXCJhcHByb3ZhbFwiKSB8fCBhcGlSZXNwb25zZS5tZXNzYWdlLmluY2x1ZGVzKFwiYXBwcm92ZVwiKSB8fCBhcGlSZXNwb25zZS5tZXNzYWdlLmluY2x1ZGVzKFwiZGVjbGluZVwiKSkge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChhcGlSZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGJ1dHRvbi5hY3Rpb24uc3VjY2Vzc01lc3NhZ2UpIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoYnV0dG9uLmFjdGlvbi5zdWNjZXNzTWVzc2FnZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChhcGlSZXNwb25zZS5tZXNzYWdlICE9IFwic3VjY2Vzc1wiICYmIGFwaVJlc3BvbnNlLm1lc3NhZ2UgIT0gXCJcIikge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChhcGlSZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIlVwZGF0ZWRcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYnV0dG9uLm9uU3VjY2Vzcykge1xyXG4gICAgICAgICAgYnV0dG9uLm9uU3VjY2VzcyhhcGlSZXNwb25zZSwgdGhpcy5kZXRhaWxzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChidXR0b24ua2VlcE9wZW4pIHtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaERhdGEoKTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHsgbWVzc2FnZTogJ3N1Y2Nlc3MnLCBkYXRhOiB7IC4uLmFwaVJlc3BvbnNlLCBkYXRhOiBidXR0b24ubmFtZSA9PSAnY3JlYXRlJyA/IGFwaVJlc3BvbnNlLmRhdGEgOiB0aGlzLmRldGFpbHMgIH0gfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiRXJyb3I6IFwiICsgYXBpUmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xvc2UoKXtcclxuICAgIGlmICh0aGlzLmRldGFpbHNDb25maWcucmVmcmVzaE9uQ2xvc2Upe1xyXG4gICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh7IG1lc3NhZ2U6ICdzdWNjZXNzJywgZGF0YTogdGhpcy5kZXRhaWxzIH0pO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHsgbWVzc2FnZTogJ2VtaXQnLCBkYXRhOiB0aGlzLmRldGFpbHMgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG5cclxufTtcclxuIiwiPGRpdiBjbGFzcz1cImRpYWxvZy1jb250YWluZXJcIj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImRpYWxvZy1jb250ZW50XCI+XHJcblxyXG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAqbmdJZj1cImlzUHJvY2Vzc2luZyAmJiBkYXRhU2VydmljZS5hcHBDb25maWcucHJvZ3Jlc3NMaW5lXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTJcIj5cclxuXHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4OyBmb250LXdlaWdodDo1MDA7bWFyZ2luLWJvdHRvbTogMTBweDtcIiA+e3t0aXRsZUFjdGlvbiB8IHRpdGxlY2FzZX19IHt7Zm9ybUNvbmZpZz8udGl0bGV9fTwvbGFiZWw+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuXHJcbiAgICAgICAgPHNwYS1jaGVjayAqbmdJZj1cImRldGFpbHNDb25maWcuYXV0b1JlZnJlc2hDb25maWdcIiBkaXNwbGF5PVwiQXV0byBSZWZyZXNoXCIgWyh2YWx1ZSldPVwiYXV0b1JlZnJlc2hFbmFibGVkXCIgKHZhbHVlQ2hhbmdlKT1cInRvZ2dsZUF1dG9SZWZyZXNoKClcIj48L3NwYS1jaGVjaz5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImZvcm1Db25maWcubW9kZT09J3ZpZXcnICYmIGVkaXRCdXR0b24gJiYgdGVzdFZpc2libGUoZGV0YWlscyxlZGl0QnV0dG9uLm5hbWUpXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIG1hdFRvb2x0aXA9XCJFZGl0XCIgY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cInNldE1vZGUoJ2VkaXQnKVwiIFtkaXNhYmxlZF09XCJ0ZXN0RGlzYWJsZWQoZGV0YWlscyxlZGl0QnV0dG9uLm5hbWUpXCI+PG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc1Byb2Nlc3NpbmdcIiAqbmdJZj1cImxvYWRCeUFjdGlvblwiIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIG1hdFRvb2x0aXA9XCJSZWZyZXNoXCIgY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImxvYWREYXRhKGZvcm1Db25maWcubG9hZEFjdGlvbiwgZGV0YWlsc0NvbmZpZy5jYXVzZVRhYmxlUmVmcmVzaClcIj48bWF0LWljb24gY2xhc3M9XCJyZWZyZXNoSWNvblwiPmNhY2hlZDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQgY2xhc3M9XCJtYXQtdHlwb2dyYXBoeSBkaWFsb2ctc2Nyb2xsLWNvbnRlbnRcIj5cclxuXHJcbiAgICAgIDxzcGEtc3RlcHMgKm5nSWY9XCJzdGVwQ29uZmlnICYmIGRldGFpbHNcIiBbY29uZmlnXT1cInN0ZXBDb25maWdcIiBbZGF0YV09XCJkZXRhaWxzXCI+PC9zcGEtc3RlcHM+XHJcblxyXG4gICAgICA8c3BhLWFsZXJ0IFthbGVydE1lc3NhZ2VzXT1cImZvcm1Db25maWcuYWxlcnRNZXNzYWdlc1wiIFtkYXRhXT1cImRldGFpbHNcIj48L3NwYS1hbGVydD5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0aW4taW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZToxNHB4XCI+XHJcblxyXG4gICAgICAgIDxwICpuZ0lmPVwiZm9ybUNvbmZpZyAmJiAhZGV0YWlsc1wiPjxlbT5Mb2FkaW5nLi4uPC9lbT48L3A+XHJcblxyXG4gICAgICAgIDxzcGEtZm9ybSAqbmdJZj1cImZvcm1Db25maWcgJiYgZGV0YWlsc1wiIFtmaWxlc109XCJmaWxlc1wiIFtkYXRhXT1cImRldGFpbHNcIiBbY29uZmlnXT1cImZvcm1Db25maWdcIiAoaW5wdXRDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKCRldmVudClcIj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZHluYW1pY1NlbGVjdCBsZXQtZmllbGQ9XCJmaWVsZFwiIGxldC1kYXRhPVwiZGF0YVwiIGxldC10ZXN0UmVhZE9ubHk9XCJ0ZXN0UmVhZE9ubHlcIiBsZXQtc2VsZWN0Q2hhbmdlZD1cInNlbGVjdENoYW5nZWRcIj5cclxuICAgICAgICAgICAgPHNwYS1zZWxlY3RcclxuICAgICAgICAgICAgICBbZGlzcGxheV09XCJmaWVsZC5hbGlhcyA/PyBmaWVsZC5uYW1lIHwgY2FtZWxUb1dvcmRzXCJcclxuICAgICAgICAgICAgICBbd2lkdGhdPVwiZmllbGQud2lkdGhcIlxyXG4gICAgICAgICAgICAgIFtudWxsYWJsZV09XCJmaWVsZC5udWxsYWJsZVwiXHJcbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZmllbGQub3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgW21hc3Rlck9wdGlvbnNdPVwiZmllbGQubWFzdGVyT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgW21hc3RlckZpZWxkXT1cImZpZWxkLm1hc3RlckZpZWxkXCJcclxuICAgICAgICAgICAgICBbb3B0aW9uRGlzcGxheV09XCJmaWVsZC5vcHRpb25EaXNwbGF5ID8/ICduYW1lJ1wiXHJcbiAgICAgICAgICAgICAgW29wdGlvblZhbHVlXT1cImZpZWxkLm9wdGlvblZhbHVlID8/ICd2YWx1ZSdcIlxyXG4gICAgICAgICAgICAgIFsodmFsdWUpXT1cImRhdGFbZmllbGQubmFtZV1cIlxyXG4gICAgICAgICAgICAgIFtkZWZhdWx0Rmlyc3RWYWx1ZV09XCJmaWVsZC5kZWZhdWx0Rmlyc3RWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInRlc3RSZWFkT25seShmaWVsZClcIlxyXG4gICAgICAgICAgICAgIFtoaW50XT1cImZpZWxkLmhpbnRcIlxyXG4gICAgICAgICAgICAgIFtkZXRhaWxzQ29uZmlnXT1cImZpZWxkLmRldGFpbHNDb25maWdcIlxyXG4gICAgICAgICAgICAgIFtsb2FkQWN0aW9uXT1cImZpZWxkLmxvYWRBY3Rpb25cIlxyXG4gICAgICAgICAgICAgIFtsb2FkSURGaWVsZF09XCJmaWVsZC5sb2FkSURGaWVsZFwiXHJcbiAgICAgICAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcclxuICAgICAgICAgICAgICBbZGF0YV09XCJkYXRhXCJcclxuICAgICAgICAgICAgICBbaW5mb01lc3NhZ2VdPVwiZmllbGQuaW5mb01lc3NhZ2VcIlxyXG4gICAgICAgICAgICAgIFtjb3B5Q29udGVudF09XCJmaWVsZC5jb3B5Q29udGVudFwiXHJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInNlbGVjdENoYW5nZWQoZmllbGQpXCJcclxuICAgICAgICAgICAgPjwvc3BhLXNlbGVjdD5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9zcGEtZm9ybT5cclxuXHJcblxyXG4gICAgICAgIDxtYXQtdGFiLWdyb3VwICpuZ0lmPVwidGFibGVDb25maWdzXCIgKHNlbGVjdGVkVGFiQ2hhbmdlKT1cIm9uVGFiQ2hhbmdlKCRldmVudClcIj5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0Ymwgb2YgdGFibGVDb25maWdTZXJ2aWNlLmdldFZpc2libGVUYWJsZUNvbmZpZ3ModGFibGVDb25maWdzKSA7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgPG1hdC10YWIgKm5nSWY9XCJ0ZXN0VmlzaWJsZVRhYih0YmwpXCI+XHJcblxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRUYWJMYWJlbD5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7dGJsLnRhYlRpdGxlID8/ICdVbnRpdGxlZCd9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8c3BhLXRhYmxlLWludGVybmFsIFxyXG4gICAgICAgICAgICAgICAgW2NvbmZpZ109XCJ0YmxcIiBcclxuICAgICAgICAgICAgICAgIFtyZWxvYWRdPVwidGFibGVSZWxvYWRcIiBcclxuICAgICAgICAgICAgICAgIFtpblRhYl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIFthY3RpdmVUYWJdPVwic2VsZWN0ZWRUYWJJbmRleCA9PT0gaVwiXHJcbiAgICAgICAgICAgICAgICAoYWN0aW9uU3VjY2Vzcyk9XCJ0YmwuY2F1c2VGb3JtUmVmcmVzaCA/IGxvYWREYXRhKGZvcm1Db25maWcubG9hZEFjdGlvbiwgZmFsc2UpIDogbnVsbFwiPlxyXG4gICAgICAgICAgICAgIDwvc3BhLXRhYmxlLWludGVybmFsPlxyXG5cclxuICAgICAgICAgICAgPC9tYXQtdGFiPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwvbWF0LXRhYi1ncm91cD5cclxuXHJcblxyXG5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XHJcblxyXG5cclxuICA8L2Rpdj5cclxuXHJcbiAgPG1hdC1kaWFsb2ctYWN0aW9ucyA+XHJcblxyXG4gICAgPGRpdj5cclxuXHJcbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gW2Rpc2FibGVkXT1cImlzUHJvY2Vzc2luZ1wiICpuZ0lmPVwiZm9ybUNvbmZpZy5tb2RlPT0nY3JlYXRlJyAmJiBjcmVhdGVCdXR0b25cIiBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgIChjbGljayk9XCJjcmVhdGUoKVwiIGNka0ZvY3VzSW5pdGlhbD57e2NyZWF0ZUJ1dHRvbi5kaXNwbGF5ID8/ICdTdWJtaXQnfX1cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIFtkaXNhYmxlZF09XCJpc1Byb2Nlc3NpbmdcIiAqbmdJZj1cImZvcm1Db25maWcubW9kZT09J2VkaXQnICYmIGVkaXRCdXR0b25cIiBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgIChjbGljayk9XCJlZGl0KClcIiBjZGtGb2N1c0luaXRpYWw+e3tlZGl0QnV0dG9uLmRpc3BsYXkgPz8gJ1N1Ym1pdCd9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ0biBvZiBleHRyYUJ1dHRvbnNcIj5cclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwidGVzdFZpc2libGUoZGV0YWlscyxidG4ubmFtZSlcIiBtYXQtc3Ryb2tlZC1idXR0b24gW2Rpc2FibGVkXT1cImlzUHJvY2Vzc2luZyB8fCB0ZXN0RGlzYWJsZWQoZGV0YWlscyxidG4ubmFtZSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzogZ2V0QnV0dG9uQ29sb3IoYnRuLCBkZXRhaWxzKX1cIiAoY2xpY2spPVwiY3VzdG9tKGJ0bilcIiBjZGtGb2N1c0luaXRpYWw+PG1hdC1pY29uIFtuZ1N0eWxlXT1cInsnY29sb3InOiBnZXRCdXR0b25Db2xvcihidG4sIGRldGFpbHMpfVwiPnt7YnRuLmljb24ubmFtZX19PC9tYXQtaWNvbj57e2J0bi5kaXNwbGF5ID8/IGJ0bi5uYW1lIHwgdGl0bGVjYXNlfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiY2xvc2UoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIiAqbmdJZj1cInNtYWxsU2NyZWVuXCI+XHJcbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgbWF0VG9vbHRpcD1cIkRlbGV0ZVwiIFtkaXNhYmxlZF09XCJpc1Byb2Nlc3NpbmdcIiBzdHlsZT1cImNvbG9yOiByZWQ7XCIgKGNsaWNrKT1cImRlbGV0ZSgpXCIgKm5nSWY9XCJmb3JtQ29uZmlnLm1vZGUhPSdjcmVhdGUnICAmJiBkZWxldGVCdXR0b25cIj48bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XHJcblxyXG5cclxuPC9kaXY+XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiJdfQ==
|
|
389
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsc0RpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90aW4tc3BhL3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9kZXRhaWxzRGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rpbi1zcGEvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL2RldGFpbHNEaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsZUFBZSxFQUFnQixNQUFNLDBCQUEwQixDQUFDO0FBSXpFLE9BQU8sRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUdyRSxPQUFPLEVBQUUsT0FBTyxFQUF3QixRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWS9ELE1BQU0sT0FBTyxhQUFhO0lBRXhCLFlBQW9CLGtCQUFzQyxFQUFTLGFBQTRCLEVBQVEsV0FBMkIsRUFBUyxjQUE4QixFQUMvSixTQUFzQyxFQUFrQyxhQUFrQyxFQUFVLGFBQTRCLEVBQ2hKLGFBQTRCLEVBQVUsV0FBd0IsRUFBUyxrQkFBc0M7UUFGbkcsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUFTLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQVEsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQVMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQy9KLGNBQVMsR0FBVCxTQUFTLENBQTZCO1FBQWtDLGtCQUFhLEdBQWIsYUFBYSxDQUFxQjtRQUFVLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ2hKLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBUyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBMER2SCx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFFcEMsZ0JBQVcsR0FBRyxNQUFNLENBQUM7UUFDckIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFVckIsVUFBSyxHQUFVLEVBQUUsQ0FBQztRQUVsQixnQkFBVyxHQUFxQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBUTlDLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBRXBCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRXBCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUUzQyxxQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUF0Rm5CLDZCQUE2QjtRQUM3QixJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQXVCLEVBQUUsRUFBRTtZQUU1RixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO2FBQ3hCO2lCQUFLO2dCQUNKLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO2FBQ3pCO1FBRUgsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUVOLE1BQU0sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxHQUFHLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsSixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUV2QixJQUFJLElBQUksR0FBRyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFFLENBQUM7UUFFdkYsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFDO1lBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLFVBQVUsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDbkM7YUFBSTtZQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM1QixzQkFBc0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FDNUI7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFdEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVuRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEdBQUcsc0JBQXNCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BJLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBRWpDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFFekIsQ0FBQztJQUVELFdBQVc7UUFDVCw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFrQ0QsV0FBVyxDQUFDLEtBQXdCO1FBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3RDLENBQUM7SUFFTyxlQUFlO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUM7UUFDcEQsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBRXBCLHFEQUFxRDtRQUNyRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUM7UUFFcEQsMkNBQTJDO1FBQzNDLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzNCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQjtRQUV0QixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUI7WUFBRSxPQUFPO1FBRWxELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxDQUFDLHVCQUF1QjtRQUV0RyxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXZCLDBCQUEwQjtRQUMxQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDbEUsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDN0MsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3BCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM1QixJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztTQUNqQztJQUNILENBQUM7SUFFRCxpQkFBaUI7UUFDZixzREFBc0Q7UUFFdEQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDekI7YUFBTTtZQUNMLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QjtJQUNILENBQUM7SUFFRCxRQUFRLENBQUMsTUFBYyxFQUFFLGlCQUFpQjtRQUV4QyxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBRS9CLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQXdCLEVBQUUsRUFBRTtnQkFFdEUsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFO29CQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUE7b0JBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO29CQUMzQix5RUFBeUU7b0JBQ3pFLElBQUcsaUJBQWlCO3dCQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUVsRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDO29CQUNwRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxNQUFNLEVBQUUsYUFBYSxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO3dCQUMxRixJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO3dCQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7cUJBQ3hCO2lCQUNGO3FCQUNHO29CQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBRTNELElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO3dCQUMzQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO3dCQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7cUJBQ3hCO2lCQUNGO1lBRUgsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUVILENBQUM7SUFFRCxZQUFZLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtJQUNuRSxDQUFDO0lBR0QsT0FBTyxDQUFDLE9BQU87UUFDYixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUE7UUFDOUIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO0lBQ3ZCLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRTtZQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUN0QixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQsU0FBUyxDQUFDLElBQVk7UUFDcEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxZQUFZLENBQUMsR0FBRyxFQUFFLFVBQWtCO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFMUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUUxQiw2REFBNkQ7UUFDN0QsTUFBTSxnQkFBZ0IsR0FBRztZQUN2QixHQUFHLE1BQU07WUFDVCxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWE7U0FDdkYsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUdELFdBQVcsQ0FBQyxHQUFHLEVBQUUsVUFBa0I7UUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRTFCLDZEQUE2RDtRQUM3RCxNQUFNLGdCQUFnQixHQUFHO1lBQ3ZCLEdBQUcsTUFBTTtZQUNULGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYTtTQUN2RixDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsY0FBYyxDQUFDLFNBQXNCO1FBRW5DLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3RELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxjQUFjLENBQUMsTUFBYyxFQUFFLEdBQUc7UUFDaEMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUMxSSxDQUFDO0lBR0QsTUFBTTtRQUNKLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBSTtRQUNGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTTtRQUNKLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBRXBCLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ25CLGNBQWMsR0FBRyxtQ0FBbUMsQ0FBQztTQUN0RDtRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQy9ELElBQUksTUFBTSxJQUFJLEtBQUssRUFBRTtnQkFDbkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ25DO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBR0QsTUFBTSxDQUFDLE1BQWM7UUFDbkIsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUU7WUFDekMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RDO2FBQU07WUFDTCxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUVPLHVCQUF1QixDQUFDLE1BQWM7UUFFNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFFdkcsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLGFBQWEsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDbEM7aUJBQU0sSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUNwQjtRQUVILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFdBQVc7UUFDakIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRTtZQUM5QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2pEO0lBQ0gsQ0FBQztJQUVELGtCQUFrQixDQUFDLFVBQWtCO1FBRW5DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBR3BCLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUNsQixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5QjtRQUVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsTUFBZTtRQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzlELE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMxQztJQUNILENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEYsSUFBSSxnQkFBZ0IsS0FBSyxFQUFFLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM1QyxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQzFGLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDbkQsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELDRCQUE0QjtRQUM1QixLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFO1lBQzNDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUU7Z0JBQzlCLGdCQUFnQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFHLENBQUM7Z0JBQ2pLLElBQUksZ0JBQWdCLEtBQUssRUFBRSxFQUFFO29CQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUM1QyxPQUFPLEtBQUssQ0FBQztpQkFDZDthQUNGO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxNQUFjLEVBQUUsSUFBUztRQUNqRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzNDLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7WUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMxQyxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3RFO1lBQ0QsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzlDLE9BQU8sUUFBUSxDQUFDO1NBQ2pCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sYUFBYSxDQUFDLE1BQWMsRUFBRSxJQUFTO1FBQzdDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFeEQsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ2xCLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVoRixJQUFJLENBQUMsY0FBYyxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksUUFBUSxFQUFFO2dCQUM5QyxjQUFjLEdBQUcsbUNBQW1DLENBQUM7YUFDdEQ7WUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDL0QsSUFBSSxNQUFNLElBQUksS0FBSyxFQUFFO29CQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztpQkFDekM7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUVKO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztTQUN6QztJQUVILENBQUM7SUFFTyxjQUFjLENBQUMsTUFBYyxFQUFFLElBQVM7UUFDOUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUF3QixFQUFFLEVBQUU7WUFFbkYsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFO2dCQUV2QixJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUNsSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ2hEO3FCQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUU7b0JBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7aUJBQ3pEO3FCQUFNLElBQUksV0FBVyxDQUFDLE9BQU8sSUFBSSxTQUFTLElBQUksV0FBVyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUU7b0JBQ3hFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDaEQ7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQ3RDO2dCQUVELElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRTtvQkFDcEIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDbEQ7Z0JBRUQsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO29CQUNuQixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUU7d0JBQ2hELElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQzt3QkFFaEMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUU7NEJBQ2xGLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQzs0QkFDOUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUM7NEJBQ3pELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO3lCQUMxRDt3QkFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7d0JBQzlCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7cUJBRTVCO3lCQUFNO3dCQUNMLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztxQkFDcEI7aUJBQ0Y7cUJBQUk7b0JBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRyxFQUFFLENBQUMsQ0FBQztpQkFDMUk7YUFFRjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzVEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUM7WUFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUNsRTthQUFJO1lBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUMvRDtJQUNILENBQUM7OzBHQWpiVSxhQUFhLHlLQUdrQyxlQUFlOzhGQUg5RCxhQUFhLGtHQ3JCMUIsMnpMQXNJQTsyRkRqSGEsYUFBYTtrQkFMekIsU0FBUzsrQkFDRSxtQkFBbUI7OzBCQU9zQixNQUFNOzJCQUFDLGVBQWU7K0pBdUYvRCxXQUFXO3NCQUFwQixNQUFNOztBQTBWUixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbmplY3QsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBGb3JtQ29uZmlnLCBGaWVsZCwgVGFibGVDb25maWcsIEJ1dHRvbiwgRGV0YWlsc0RpYWxvZ0NvbmZpZywgQWN0aW9uLCBBcGlSZXNwb25zZSwgU3RlcENvbmZpZywgU3RhdHVzQ29uZmlnIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9DbGFzc2VzJztcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tZXNzYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRhU2VydmljZUxpYiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGFsaWIuc2VydmljZSc7XHJcbmltcG9ydCB7IENvcmUsIERldGFpbHNEaWFsb2dQcm9jZXNzb3IgfSBmcm9tICcuLi8uLi9jbGFzc2VzL1RpbkNvcmUnO1xyXG5pbXBvcnQgeyBMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbG9hZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCcmVha3BvaW50T2JzZXJ2ZXIsIEJyZWFrcG9pbnRTdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbmZpZywgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQnV0dG9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2J1dHRvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUYWJsZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YWJsZS1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdFRhYkNoYW5nZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NwYS1kZXRhaWxzRGlhbG9nJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGV0YWlsc0RpYWxvZy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEZXRhaWxzRGlhbG9nIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJyZWFrcG9pbnRPYnNlcnZlcjogQnJlYWtwb2ludE9ic2VydmVyLHByaXZhdGUgbG9hZGVyU2VydmljZTogTG9hZGVyU2VydmljZSxwdWJsaWMgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlTGliLHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxEZXRhaWxzRGlhbG9nPiwgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkZXRhaWxzQ29uZmlnOiBEZXRhaWxzRGlhbG9nQ29uZmlnLCBwcml2YXRlIGJ1dHRvblNlcnZpY2U6IEJ1dHRvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLCBwdWJsaWMgdGFibGVDb25maWdTZXJ2aWNlOiBUYWJsZUNvbmZpZ1NlcnZpY2UpXHJcbiAge1xyXG4gICAgLy8gZGV0ZWN0IHNjcmVlbiBzaXplIGNoYW5nZXNcclxuICAgIHRoaXMuYnJlYWtwb2ludE9ic2VydmVyLm9ic2VydmUoW1wiKG1heC13aWR0aDogNjAwcHgpXCJdKS5zdWJzY3JpYmUoKHJlc3VsdDogQnJlYWtwb2ludFN0YXRlKSA9PiB7XHJcblxyXG4gICAgICBpZiAocmVzdWx0Lm1hdGNoZXMpIHtcclxuICAgICAgICB0aGlzLnNtYWxsU2NyZWVuID0gdHJ1ZVxyXG4gICAgICB9ZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zbWFsbFNjcmVlbiA9IGZhbHNlXHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICAgIGNvbnN0IHsgdGFibGVDb25maWcsIHRhYmxlQ29uZmlncywgZm9ybUNvbmZpZywgc3RlcENvbmZpZywgc3RhdHVzQ29uZmlnLCBidXR0b25zIH0gPSBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yLmluaXRpYWxpemVDb25maWdzKHRoaXMuZGV0YWlsc0NvbmZpZyk7XHJcbiAgICB0aGlzLnRhYmxlQ29uZmlnID0gdGFibGVDb25maWc7XHJcbiAgICB0aGlzLnRhYmxlQ29uZmlncyA9IHRhYmxlQ29uZmlncztcclxuICAgIHRoaXMuZm9ybUNvbmZpZyA9IGZvcm1Db25maWc7XHJcbiAgICB0aGlzLnN0ZXBDb25maWcgPSBzdGVwQ29uZmlnO1xyXG4gICAgdGhpcy5zdGF0dXNDb25maWcgPSBzdGF0dXNDb25maWc7XHJcbiAgICB0aGlzLmJ1dHRvbnMgPSBidXR0b25zO1xyXG5cclxuICAgIGxldCByZXNwID0gRGV0YWlsc0RpYWxvZ1Byb2Nlc3Nvci5oYW5kbGVGb3JtTW9kZSh0aGlzLmRldGFpbHNDb25maWcsIHRoaXMuZm9ybUNvbmZpZywpO1xyXG5cclxuICAgIGlmIChyZXNwLmxvYWRCeUFjdGlvbil7XHJcbiAgICAgIHRoaXMubG9hZEJ5QWN0aW9uID0gdHJ1ZTtcclxuICAgICAgZm9ybUNvbmZpZy5sb2FkQWN0aW9uID0gcmVzcC5hY3Rpb247XHJcbiAgICAgIHRoaXMubG9hZERhdGEocmVzcC5hY3Rpb24sIGZhbHNlKTtcclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLmRldGFpbHMgPSByZXNwLmRldGFpbHM7XHJcbiAgICAgIERldGFpbHNEaWFsb2dQcm9jZXNzb3Iuc2V0SGVyb1ZhbHVlKHRoaXMuZGV0YWlsc0NvbmZpZywgdGhpcy5kZXRhaWxzKTtcclxuICAgICAgdGhpcy5sb2FkQnlBY3Rpb24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5pc0xvYWRDb21wbGV0ZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5maWxlRmllbGQgPSBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yLnNldEZpbGVGaWVsZCh0aGlzLmZvcm1Db25maWcpO1xyXG5cclxuICAgIHRoaXMubG9hZGVyU2VydmljZS5pc0xvYWRpbmcuc3Vic2NyaWJlKHggPT4gdGhpcy5pc1Byb2Nlc3NpbmcgPSB4KTtcclxuXHJcbiAgICBjb25zdCB7IGV4dHJhQnV0dG9ucywgY3JlYXRlQnV0dG9uLCBlZGl0QnV0dG9uLCBkZWxldGVCdXR0b24gfSA9IERldGFpbHNEaWFsb2dQcm9jZXNzb3Iuc2V0dXBCdXR0b25zKHRoaXMuZm9ybUNvbmZpZywgdGhpcy5idXR0b25zKTtcclxuICAgIHRoaXMuZXh0cmFCdXR0b25zID0gZXh0cmFCdXR0b25zO1xyXG4gICAgdGhpcy5jcmVhdGVCdXR0b24gPSBjcmVhdGVCdXR0b247XHJcbiAgICB0aGlzLmVkaXRCdXR0b24gPSBlZGl0QnV0dG9uO1xyXG4gICAgdGhpcy5kZWxldGVCdXR0b24gPSBkZWxldGVCdXR0b247XHJcblxyXG4gICAgdGhpcy5zZXRUaXRsZUFjdGlvbigpO1xyXG4gICAgdGhpcy5pbml0QXV0b1JlZnJlc2goKTtcclxuXHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIC8vIENsZWFudXAgc3Vic2NyaXB0aW9uIG9uIGNvbXBvbmVudCBkZXN0cm95XHJcbiAgICB0aGlzLnN0b3BBdXRvUmVmcmVzaCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgYXV0b1JlZnJlc2hFbmFibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgXHJcbiAgdGl0bGVBY3Rpb24gPSBcIlZpZXdcIjtcclxuICBsb2FkQnlBY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgZXh0cmFCdXR0b25zOiBCdXR0b25bXTtcclxuICBidXR0b25zOiBCdXR0b25bXTtcclxuICBjcmVhdGVCdXR0b246IEJ1dHRvbjtcclxuICBlZGl0QnV0dG9uOiBCdXR0b247XHJcbiAgZGVsZXRlQnV0dG9uOiBCdXR0b247XHJcblxyXG4gIC8vIG1vZGVCdXR0b24gOiBCdXR0b25cclxuICBmaWxlRmllbGQ6IEZpZWxkO1xyXG4gIGZpbGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICB0YWJsZVJlbG9hZDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHRhYmxlQ29uZmlnOiBUYWJsZUNvbmZpZ1xyXG4gIHRhYmxlQ29uZmlncyA6IFRhYmxlQ29uZmlnW11cclxuICBkZXRhaWxzOiBhbnlcclxuICBmb3JtQ29uZmlnOiBGb3JtQ29uZmlnO1xyXG4gIHN0ZXBDb25maWcgOiBTdGVwQ29uZmlnO1xyXG4gIHN0YXR1c0NvbmZpZyA6IFN0YXR1c0NvbmZpZztcclxuICBzbWFsbFNjcmVlbiA9IGZhbHNlO1xyXG5cclxuICBpc0xvYWRDb21wbGV0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzUHJvY2Vzc2luZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgaW5wdXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHNlbGVjdGVkVGFiSW5kZXggPSAwO1xyXG4gIG9uVGFiQ2hhbmdlKGV2ZW50OiBNYXRUYWJDaGFuZ2VFdmVudCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gZXZlbnQuaW5kZXg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRBdXRvUmVmcmVzaCgpIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZGV0YWlsc0NvbmZpZy5hdXRvUmVmcmVzaENvbmZpZztcclxuICAgIGlmICghY29uZmlnKSByZXR1cm47XHJcblxyXG4gICAgLy8gU2V0IGluaXRpYWwgc3RhdGUgYmFzZWQgb24gZGVmYXVsdE9uIGNvbmZpZ3VyYXRpb25cclxuICAgIHRoaXMuYXV0b1JlZnJlc2hFbmFibGVkID0gY29uZmlnLmRlZmF1bHRPbiB8fCBmYWxzZTtcclxuXHJcbiAgICAvLyBTdGFydCBhdXRvLXJlZnJlc2ggaWYgZW5hYmxlZCBieSBkZWZhdWx0XHJcbiAgICBpZiAodGhpcy5hdXRvUmVmcmVzaEVuYWJsZWQpIHtcclxuICAgICAgdGhpcy5zdGFydEF1dG9SZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0QXV0b1JlZnJlc2goKSB7XHJcblxyXG4gICAgaWYgKCF0aGlzLmRldGFpbHNDb25maWcuYXV0b1JlZnJlc2hDb25maWcpIHJldHVybjtcclxuICAgIFxyXG4gICAgY29uc3QgcmVmcmVzaEludGVydmFsID0gdGhpcy5kZXRhaWxzQ29uZmlnLmF1dG9SZWZyZXNoQ29uZmlnLmludGVydmFsIHx8IDUwMDA7IC8vIERlZmF1bHQgdG8gNSBzZWNvbmRzXHJcbiAgICBcclxuICAgIC8vIENsZWFyIGFueSBleGlzdGluZyBzdWJzY3JpcHRpb25cclxuICAgIHRoaXMuc3RvcEF1dG9SZWZyZXNoKCk7XHJcbiAgICBcclxuICAgIC8vIENyZWF0ZSBuZXcgc3Vic2NyaXB0aW9uXHJcbiAgICB0aGlzLnJlZnJlc2hTdWJzY3JpcHRpb24gPSBpbnRlcnZhbChyZWZyZXNoSW50ZXJ2YWwpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmlzTG9hZENvbXBsZXRlICYmICF0aGlzLmlzUHJvY2Vzc2luZykge1xyXG4gICAgICAgIHRoaXMucmVmcmVzaERhdGEoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0b3BBdXRvUmVmcmVzaCgpIHtcclxuICAgIGlmICh0aGlzLnJlZnJlc2hTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5yZWZyZXNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHRoaXMucmVmcmVzaFN1YnNjcmlwdGlvbiA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVBdXRvUmVmcmVzaCgpIHtcclxuICAgIC8vIHRoaXMuYXV0b1JlZnJlc2hFbmFibGVkID0gIXRoaXMuYXV0b1JlZnJlc2hFbmFibGVkO1xyXG4gICAgXHJcbiAgICBpZiAodGhpcy5hdXRvUmVmcmVzaEVuYWJsZWQpIHtcclxuICAgICAgdGhpcy5zdGFydEF1dG9SZWZyZXNoKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0b3BBdXRvUmVmcmVzaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZERhdGEoYWN0aW9uOiBBY3Rpb24sIGNhdXNlVGFibGVzUmVsb2FkKSB7XHJcblxyXG4gICAgaWYgKGFjdGlvbiAmJiB0aGlzLmxvYWRCeUFjdGlvbikge1xyXG5cclxuICAgICAgdGhpcy5kYXRhU2VydmljZS5DYWxsQXBpKGFjdGlvbikuc3Vic2NyaWJlKChhcGlSZXNwb25zZTogQXBpUmVzcG9uc2UpID0+IHtcclxuXHJcbiAgICAgICAgaWYgKGFwaVJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgIHRoaXMuZGV0YWlscyA9IGFwaVJlc3BvbnNlLmRhdGFcclxuICAgICAgICAgIHRoaXMuaXNMb2FkQ29tcGxldGUgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gRGV0YWlsc0RpYWxvZ1Byb2Nlc3Nvci5zZXRIZXJvVmFsdWUodGhpcy5kZXRhaWxzQ29uZmlnLCB0aGlzLmRldGFpbHMpO1xyXG4gICAgICAgICAgaWYoY2F1c2VUYWJsZXNSZWxvYWQpIHRoaXMudGFibGVSZWxvYWQubmV4dCh0cnVlKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLmRldGFpbHNDb25maWcuYXV0b1JlZnJlc2hDb25maWc7XHJcbiAgICAgICAgICBpZiAodGhpcy5hdXRvUmVmcmVzaEVuYWJsZWQgJiYgY29uZmlnPy5zdG9wQ29uZGl0aW9uICYmIGNvbmZpZy5zdG9wQ29uZGl0aW9uKHRoaXMuZGV0YWlscykpIHtcclxuICAgICAgICAgICAgdGhpcy5hdXRvUmVmcmVzaEVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zdG9wQXV0b1JlZnJlc2goKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoXCJFcnJvcjogXCIgKyBhcGlSZXNwb25zZS5tZXNzYWdlKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5hdXRvUmVmcmVzaEVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5hdXRvUmVmcmVzaEVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zdG9wQXV0b1JlZnJlc2goKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBpbnB1dENoYW5nZWQoZXZlbnQpIHtcclxuICAgIHRoaXMuaW5wdXRDaGFuZ2UuZW1pdCh7IGZpZWxkOiBldmVudC5maWVsZCwgdmFsdWU6IGV2ZW50LnZhbHVlIH0pXHJcbiAgfVxyXG5cclxuXHJcbiAgc2V0TW9kZShuZXdNb2RlKXtcclxuICAgIHRoaXMuZm9ybUNvbmZpZy5tb2RlID0gbmV3TW9kZVxyXG4gICAgdGhpcy5zZXRUaXRsZUFjdGlvbigpXHJcbiAgfVxyXG5cclxuICBzZXRUaXRsZUFjdGlvbigpe1xyXG4gICAgaWYgKHRoaXMuZm9ybUNvbmZpZy5maXhlZFRpdGxlKSB7XHJcbiAgICAgIHRoaXMudGl0bGVBY3Rpb24gPSBcIlwiO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50aXRsZUFjdGlvbiA9IHRoaXMuYnV0dG9uU2VydmljZS5nZXRUaXRsZUFjdGlvbih0aGlzLmZvcm1Db25maWcubW9kZSwgdGhpcy5idXR0b25zKTtcclxuICB9XHJcblxyXG4gIGdldEJ1dHRvbihuYW1lOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0QnV0dG9uKHRoaXMuYnV0dG9ucywgbmFtZSk7XHJcbiAgfVxyXG5cclxuICB0ZXN0RGlzYWJsZWQocm93LCBidXR0b25OYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKGJ1dHRvbk5hbWUpO1xyXG5cclxuICAgIGlmICghYnV0dG9uKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgYnV0dG9uIHdpdGggY29tcG9uZW50J3MgZGV0YWlsc0NvbmZpZ1xyXG4gICAgY29uc3QgYnV0dG9uV2l0aENvbmZpZyA9IHtcclxuICAgICAgLi4uYnV0dG9uLFxyXG4gICAgICBkZXRhaWxzQ29uZmlnOiBidXR0b24uZGV0YWlsc0NvbmZpZyA/IHsgLi4uYnV0dG9uLmRldGFpbHNDb25maWcgfSA6IHRoaXMuZGV0YWlsc0NvbmZpZ1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5idXR0b25TZXJ2aWNlLnRlc3REaXNhYmxlZChidXR0b25XaXRoQ29uZmlnLCByb3cpO1xyXG4gIH1cclxuXHJcblxyXG4gIHRlc3RWaXNpYmxlKHJvdywgYnV0dG9uTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbihidXR0b25OYW1lKTtcclxuICAgIGlmICghYnV0dG9uKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgYnV0dG9uIHdpdGggY29tcG9uZW50J3MgZGV0YWlsc0NvbmZpZ1xyXG4gICAgY29uc3QgYnV0dG9uV2l0aENvbmZpZyA9IHtcclxuICAgICAgLi4uYnV0dG9uLFxyXG4gICAgICBkZXRhaWxzQ29uZmlnOiBidXR0b24uZGV0YWlsc0NvbmZpZyA/IHsgLi4uYnV0dG9uLmRldGFpbHNDb25maWcgfSA6IHRoaXMuZGV0YWlsc0NvbmZpZ1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5idXR0b25TZXJ2aWNlLnRlc3RWaXNpYmxlKGJ1dHRvbldpdGhDb25maWcsIHJvdylcclxuICB9XHJcblxyXG4gIHRlc3RWaXNpYmxlVGFiKHRibENvbmZpZzogVGFibGVDb25maWcpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAoIXRoaXMudGFibGVDb25maWdTZXJ2aWNlLmhhc1RhYmxlQWNjZXNzKHRibENvbmZpZykpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmJ1dHRvblNlcnZpY2UuaXNUYWJWaXNpYmxlKHRibENvbmZpZyk7XHJcbiAgfVxyXG5cclxuICBnZXRCdXR0b25Db2xvcihidXR0b246IEJ1dHRvbiwgcm93KSB7XHJcbiAgICByZXR1cm4gdGhpcy5idXR0b25TZXJ2aWNlLmdldEJ1dHRvbkNvbG9yKGJ1dHRvbiwgcm93KTtcclxuICB9XHJcblxyXG4gIGdldFZpc2libGVGaWVsZHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29uZmlnLmZpZWxkcz8uZmlsdGVyKHggPT4gQ29yZS50ZXN0VmlzaWJsZSh0aGlzLmZvcm1Db25maWcsIHRoaXMuZGV0YWlscywgeCwgdGhpcy5hdXRoU2VydmljZS5jdXJyZW50Um9sZVNvdXJjZS52YWx1ZSkpXHJcbiAgfVxyXG5cclxuXHJcbiAgY3JlYXRlKCkge1xyXG4gICAgdGhpcy5oYW5kbGVCdXR0b25BY3Rpb24oJ2NyZWF0ZScpO1xyXG4gIH1cclxuXHJcbiAgZWRpdCgpIHtcclxuICAgIHRoaXMuaGFuZGxlQnV0dG9uQWN0aW9uKCdlZGl0Jyk7XHJcbiAgfVxyXG5cclxuICBkZWxldGUoKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0QnV0dG9uKHRoaXMuYnV0dG9ucywgJ2RlbGV0ZScpO1xyXG4gICAgaWYgKCFidXR0b24pIHJldHVybjtcclxuXHJcbiAgICBsZXQgY29uZmlybU1lc3NhZ2UgPSB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0Q29uZmlybU1lc3NhZ2UoYnV0dG9uLCB0aGlzLmRldGFpbHMpO1xyXG4gICAgaWYgKCFjb25maXJtTWVzc2FnZSkge1xyXG4gICAgICBjb25maXJtTWVzc2FnZSA9IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlID9gO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuY29uZmlybShjb25maXJtTWVzc2FnZSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCA9PSBcInllc1wiKSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVCdXR0b25BY3Rpb24oJ2RlbGV0ZScpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBjdXN0b20oYnV0dG9uOiBCdXR0b24gKSB7XHJcbiAgICBpZiAoYnV0dG9uLmRpYWxvZyAmJiBidXR0b24uZGV0YWlsc0NvbmZpZykge1xyXG4gICAgICB0aGlzLm9wZW5OZXN0ZWREZXRhaWxzRGlhbG9nKGJ1dHRvbik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmhhbmRsZUJ1dHRvbkFjdGlvbihidXR0b24ubmFtZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9wZW5OZXN0ZWREZXRhaWxzRGlhbG9nKGJ1dHRvbjogQnV0dG9uKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW5Db25maWd1cmVkRGV0YWlsc0RpYWxvZyggYnV0dG9uLCB0aGlzLmRldGFpbHMsIERldGFpbHNEaWFsb2cgKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuXHJcbiAgICAgIGlmIChyZXN1bHQuYWN0aW9uID09PSAnaW5wdXRDaGFuZ2UnKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dENoYW5nZWQocmVzdWx0LmNoYW5nZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICYmIHJlc3VsdC5tZXNzYWdlID09PSAnc3VjY2VzcycpIHtcclxuICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaERhdGEoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtQ29uZmlnLmxvYWRBY3Rpb24pIHtcclxuICAgICAgdGhpcy5sb2FkRGF0YSh0aGlzLmZvcm1Db25maWcubG9hZEFjdGlvbiwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVCdXR0b25BY3Rpb24oYnV0dG9uTmFtZTogc3RyaW5nKSB7XHJcbiAgICBcclxuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKGJ1dHRvbk5hbWUpO1xyXG4gICAgaWYgKCFidXR0b24pIHJldHVybjtcclxuICAgXHJcblxyXG4gICAgaWYgKGJ1dHRvbi5vbkNsaWNrKSB7XHJcbiAgICAgIGJ1dHRvbi5vbkNsaWNrKHRoaXMuZGV0YWlscyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wcm9jZXNzQnV0dG9uQWN0aW9uKGJ1dHRvbik7XHJcbiAgfVxyXG5cclxuICBwcm9jZXNzQnV0dG9uQWN0aW9uKGJ1dHRvbiA6IEJ1dHRvbikge1xyXG4gICAgaWYgKCFidXR0b24uYWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHsgbWVzc2FnZTogJ2VtaXQnLCBkYXRhOiB0aGlzLmRldGFpbHMgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy52YWxpZGF0ZUZvcm0oKSkge1xyXG4gICAgICB0aGlzLmV4ZWN1dGVBY3Rpb24oYnV0dG9uLCB0aGlzLmRldGFpbHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2YWxpZGF0ZUZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdmFsaWRhdGlvblJlc3VsdCA9IENvcmUudmFsaWRhdGVPYmplY3QodGhpcy5nZXRWaXNpYmxlRmllbGRzKCksIHRoaXMuZGV0YWlscyk7XHJcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdCAhPT0gJycpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdCh2YWxpZGF0aW9uUmVzdWx0KTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpbGVzLmxlbmd0aCA8IDEgJiYgdGhpcy5maWxlRmllbGQ/LnJlcXVpcmVkICYmIHRoaXMuZm9ybUNvbmZpZy5tb2RlID09PSAnY3JlYXRlJykge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiUGxlYXNlIGF0dGFjaCBmaWxlKHMpXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVmFsaWRhdGUgY29tcG9zaXRlIGZpZWxkc1xyXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiB0aGlzLmdldFZpc2libGVGaWVsZHMoKSkge1xyXG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2NvbXBvc2l0ZScpIHtcclxuICAgICAgICB2YWxpZGF0aW9uUmVzdWx0ID0gQ29yZS52YWxpZGF0ZU9iamVjdChDb3JlLmdldFZpc2libGVTdWJmaWVsZHModGhpcy5mb3JtQ29uZmlnLCB0aGlzLmRldGFpbHMsIGZpZWxkLCB0aGlzLmF1dGhTZXJ2aWNlLmN1cnJlbnRSb2xlU291cmNlLnZhbHVlKSwgdGhpcy5kZXRhaWxzLCApO1xyXG4gICAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0ICE9PSAnJykge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdCh2YWxpZGF0aW9uUmVzdWx0KTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZUFjdGlvbkRhdGEoYnV0dG9uOiBCdXR0b24sIGRhdGE6IGFueSk6IGFueSB7XHJcbiAgICBpZiAodGhpcy5idXR0b25TZXJ2aWNlLmlzRm9ybUJ1dHRvbihidXR0b24pKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChgdXBsb2FkRmlsZSR7aX1gLCB0aGlzLmZpbGVzW2ldLCB0aGlzLmZpbGVzW2ldLm5hbWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGZvcm1EYXRhLmFwcGVuZChcImRhdGFcIiwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICByZXR1cm4gZm9ybURhdGE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXhlY3V0ZUFjdGlvbihidXR0b246IEJ1dHRvbiwgZGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBhY3Rpb25EYXRhID0gdGhpcy5wcmVwYXJlQWN0aW9uRGF0YShidXR0b24sIGRhdGEpO1xyXG5cclxuICAgIGlmIChidXR0b24uY29uZmlybSkge1xyXG4gICAgICBsZXQgY29uZmlybU1lc3NhZ2UgPSB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0Q29uZmlybU1lc3NhZ2UoYnV0dG9uLCB0aGlzLmRldGFpbHMpO1xyXG5cclxuICAgICAgaWYgKCFjb25maXJtTWVzc2FnZSAmJiBidXR0b24ubmFtZSA9PSAnZGVsZXRlJykge1xyXG4gICAgICAgIGNvbmZpcm1NZXNzYWdlID0gYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgP2A7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuY29uZmlybShjb25maXJtTWVzc2FnZSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0ID09IFwieWVzXCIpIHtcclxuICAgICAgICAgIHRoaXMucGVyZm9ybUFwaUNhbGwoYnV0dG9uLCBhY3Rpb25EYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucGVyZm9ybUFwaUNhbGwoYnV0dG9uLCBhY3Rpb25EYXRhKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBlcmZvcm1BcGlDYWxsKGJ1dHRvbjogQnV0dG9uLCBkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMuZGF0YVNlcnZpY2UuQ2FsbEFwaShidXR0b24uYWN0aW9uLCBkYXRhKS5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlOiBBcGlSZXNwb25zZSkgPT4ge1xyXG5cclxuICAgICAgaWYgKGFwaVJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuXHJcbiAgICAgICAgaWYgKGFwaVJlc3BvbnNlLm1lc3NhZ2UuaW5jbHVkZXMoXCJhcHByb3ZhbFwiKSB8fCBhcGlSZXNwb25zZS5tZXNzYWdlLmluY2x1ZGVzKFwiYXBwcm92ZVwiKSB8fCBhcGlSZXNwb25zZS5tZXNzYWdlLmluY2x1ZGVzKFwiZGVjbGluZVwiKSkge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChhcGlSZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGJ1dHRvbi5hY3Rpb24uc3VjY2Vzc01lc3NhZ2UpIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoYnV0dG9uLmFjdGlvbi5zdWNjZXNzTWVzc2FnZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChhcGlSZXNwb25zZS5tZXNzYWdlICE9IFwic3VjY2Vzc1wiICYmIGFwaVJlc3BvbnNlLm1lc3NhZ2UgIT0gXCJcIikge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChhcGlSZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIlVwZGF0ZWRcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYnV0dG9uLm9uU3VjY2Vzcykge1xyXG4gICAgICAgICAgYnV0dG9uLm9uU3VjY2VzcyhhcGlSZXNwb25zZS5kYXRhLCB0aGlzLmRldGFpbHMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGJ1dHRvbi5rZWVwT3Blbikge1xyXG4gICAgICAgICAgaWYgKGJ1dHRvbi5uYW1lID09PSAnY3JlYXRlJyAmJiBhcGlSZXNwb25zZS5kYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGV0YWlscyA9IGFwaVJlc3BvbnNlLmRhdGE7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodGhpcy5kZXRhaWxzQ29uZmlnLmhlcm9GaWVsZCAmJiBhcGlSZXNwb25zZS5kYXRhW3RoaXMuZGV0YWlsc0NvbmZpZy5oZXJvRmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5kZXRhaWxzQ29uZmlnLmhlcm9WYWx1ZSA9IGFwaVJlc3BvbnNlLmRhdGFbdGhpcy5kZXRhaWxzQ29uZmlnLmhlcm9GaWVsZF07XHJcbiAgICAgICAgICAgICAgdGhpcy5mb3JtQ29uZmlnLmhlcm9GaWVsZCA9IHRoaXMuZGV0YWlsc0NvbmZpZy5oZXJvRmllbGQ7XHJcbiAgICAgICAgICAgICAgdGhpcy5mb3JtQ29uZmlnLmhlcm9WYWx1ZSA9IHRoaXMuZGV0YWlsc0NvbmZpZy5oZXJvVmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbmZpZy5tb2RlID0gJ2VkaXQnO1xyXG4gICAgICAgICAgICB0aGlzLnNldFRpdGxlQWN0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkQ29tcGxldGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaERhdGEoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHsgbWVzc2FnZTogJ3N1Y2Nlc3MnLCBkYXRhOiB7IC4uLmFwaVJlc3BvbnNlLCBkYXRhOiBidXR0b24ubmFtZSA9PSAnY3JlYXRlJyA/IGFwaVJlc3BvbnNlLmRhdGEgOiB0aGlzLmRldGFpbHMgIH0gfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoXCJFcnJvcjogXCIgKyBhcGlSZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpe1xyXG4gICAgaWYgKHRoaXMuZGV0YWlsc0NvbmZpZy5yZWZyZXNoT25DbG9zZSl7XHJcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHsgbWVzc2FnZTogJ3N1Y2Nlc3MnLCBkYXRhOiB0aGlzLmRldGFpbHMgfSk7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoeyBtZXNzYWdlOiAnZW1pdCcsIGRhdGE6IHRoaXMuZGV0YWlscyB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcblxyXG59O1xyXG4iLCI8ZGl2IGNsYXNzPVwiZGlhbG9nLWNvbnRhaW5lclwiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWNvbnRlbnRcIj5cclxuXHJcbiAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiICpuZ0lmPVwiaXNQcm9jZXNzaW5nICYmIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5wcm9ncmVzc0xpbmVcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMlwiPlxyXG5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6IDIwcHg7IGZvbnQtd2VpZ2h0OjUwMDttYXJnaW4tYm90dG9tOiAxMHB4O1wiID57e3RpdGxlQWN0aW9uIHwgdGl0bGVjYXNlfX0ge3tmb3JtQ29uZmlnPy50aXRsZX19PC9sYWJlbD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG5cclxuICAgICAgICA8c3BhLWNoZWNrICpuZ0lmPVwiZGV0YWlsc0NvbmZpZy5hdXRvUmVmcmVzaENvbmZpZ1wiIGRpc3BsYXk9XCJBdXRvIFJlZnJlc2hcIiBbKHZhbHVlKV09XCJhdXRvUmVmcmVzaEVuYWJsZWRcIiAodmFsdWVDaGFuZ2UpPVwidG9nZ2xlQXV0b1JlZnJlc2goKVwiPjwvc3BhLWNoZWNrPlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZm9ybUNvbmZpZy5tb2RlPT0ndmlldycgJiYgZWRpdEJ1dHRvbiAmJiB0ZXN0VmlzaWJsZShkZXRhaWxzLGVkaXRCdXR0b24ubmFtZSlcIj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgbWF0VG9vbHRpcD1cIkVkaXRcIiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwic2V0TW9kZSgnZWRpdCcpXCIgW2Rpc2FibGVkXT1cInRlc3REaXNhYmxlZChkZXRhaWxzLGVkaXRCdXR0b24ubmFtZSlcIj48bWF0LWljb24+ZWRpdDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImlzUHJvY2Vzc2luZ1wiICpuZ0lmPVwibG9hZEJ5QWN0aW9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgbWF0VG9vbHRpcD1cIlJlZnJlc2hcIiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwibG9hZERhdGEoZm9ybUNvbmZpZy5sb2FkQWN0aW9uLCBkZXRhaWxzQ29uZmlnLmNhdXNlVGFibGVSZWZyZXNoKVwiPjxtYXQtaWNvbiBjbGFzcz1cInJlZnJlc2hJY29uXCI+Y2FjaGVkPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG1hdC1kaWFsb2ctY29udGVudCBjbGFzcz1cIm1hdC10eXBvZ3JhcGh5IGRpYWxvZy1zY3JvbGwtY29udGVudFwiPlxyXG5cclxuICAgICAgPHNwYS1zdGVwcyAqbmdJZj1cInN0ZXBDb25maWcgJiYgZGV0YWlsc1wiIFtjb25maWddPVwic3RlcENvbmZpZ1wiIFtkYXRhXT1cImRldGFpbHNcIj48L3NwYS1zdGVwcz5cclxuXHJcbiAgICAgIDxzcGEtc3RhdHVzZXMgKm5nSWY9XCJzdGF0dXNDb25maWcgJiYgZGV0YWlsc1wiIFtjb25maWddPVwic3RhdHVzQ29uZmlnXCIgW2RhdGFdPVwiZGV0YWlsc1wiPjwvc3BhLXN0YXR1c2VzPlxyXG5cclxuICAgICAgPHNwYS1hbGVydCBbYWxlcnRNZXNzYWdlc109XCJmb3JtQ29uZmlnLmFsZXJ0TWVzc2FnZXNcIiBbZGF0YV09XCJkZXRhaWxzXCI+PC9zcGEtYWxlcnQ+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwidGluLWlucHV0XCIgc3R5bGU9XCJmb250LXNpemU6MTRweFwiPlxyXG5cclxuICAgICAgICA8cCAqbmdJZj1cImZvcm1Db25maWcgJiYgIWRldGFpbHNcIj48ZW0+TG9hZGluZy4uLjwvZW0+PC9wPlxyXG5cclxuICAgICAgICA8c3BhLWZvcm0gKm5nSWY9XCJmb3JtQ29uZmlnICYmIGRldGFpbHNcIiBbZmlsZXNdPVwiZmlsZXNcIiBbZGF0YV09XCJkZXRhaWxzXCIgW2NvbmZpZ109XCJmb3JtQ29uZmlnXCIgKGlucHV0Q2hhbmdlKT1cImlucHV0Q2hhbmdlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2R5bmFtaWNTZWxlY3QgbGV0LWZpZWxkPVwiZmllbGRcIiBsZXQtZGF0YT1cImRhdGFcIiBsZXQtdGVzdFJlYWRPbmx5PVwidGVzdFJlYWRPbmx5XCIgbGV0LXNlbGVjdENoYW5nZWQ9XCJzZWxlY3RDaGFuZ2VkXCI+XHJcbiAgICAgICAgICAgIDxzcGEtc2VsZWN0XHJcbiAgICAgICAgICAgICAgW2Rpc3BsYXldPVwiZmllbGQuYWxpYXMgPz8gZmllbGQubmFtZSB8IGNhbWVsVG9Xb3Jkc1wiXHJcbiAgICAgICAgICAgICAgW3dpZHRoXT1cImZpZWxkLndpZHRoXCJcclxuICAgICAgICAgICAgICBbbnVsbGFibGVdPVwiZmllbGQubnVsbGFibGVcIlxyXG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cImZpZWxkLm9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgIFttYXN0ZXJPcHRpb25zXT1cImZpZWxkLm1hc3Rlck9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgIFttYXN0ZXJGaWVsZF09XCJmaWVsZC5tYXN0ZXJGaWVsZFwiXHJcbiAgICAgICAgICAgICAgW29wdGlvbkRpc3BsYXldPVwiZmllbGQub3B0aW9uRGlzcGxheSA/PyAnbmFtZSdcIlxyXG4gICAgICAgICAgICAgIFtvcHRpb25WYWx1ZV09XCJmaWVsZC5vcHRpb25WYWx1ZSA/PyAndmFsdWUnXCJcclxuICAgICAgICAgICAgICBbKHZhbHVlKV09XCJkYXRhW2ZpZWxkLm5hbWVdXCJcclxuICAgICAgICAgICAgICBbZGVmYXVsdEZpcnN0VmFsdWVdPVwiZmllbGQuZGVmYXVsdEZpcnN0VmFsdWVcIlxyXG4gICAgICAgICAgICAgIFtyZWFkb25seV09XCJ0ZXN0UmVhZE9ubHkoZmllbGQpXCJcclxuICAgICAgICAgICAgICBbaGludF09XCJmaWVsZC5oaW50XCJcclxuICAgICAgICAgICAgICBbZGV0YWlsc0NvbmZpZ109XCJmaWVsZC5kZXRhaWxzQ29uZmlnXCJcclxuICAgICAgICAgICAgICBbbG9hZEFjdGlvbl09XCJmaWVsZC5sb2FkQWN0aW9uXCJcclxuICAgICAgICAgICAgICBbbG9hZElERmllbGRdPVwiZmllbGQubG9hZElERmllbGRcIlxyXG4gICAgICAgICAgICAgIFtmaWVsZF09XCJmaWVsZFwiXHJcbiAgICAgICAgICAgICAgW2RhdGFdPVwiZGF0YVwiXHJcbiAgICAgICAgICAgICAgW2luZm9NZXNzYWdlXT1cImZpZWxkLmluZm9NZXNzYWdlXCJcclxuICAgICAgICAgICAgICBbY29weUNvbnRlbnRdPVwiZmllbGQuY29weUNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJzZWxlY3RDaGFuZ2VkKGZpZWxkKVwiXHJcbiAgICAgICAgICAgID48L3NwYS1zZWxlY3Q+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvc3BhLWZvcm0+XHJcblxyXG5cclxuICAgICAgICA8bWF0LXRhYi1ncm91cCAqbmdJZj1cInRhYmxlQ29uZmlnc1wiIChzZWxlY3RlZFRhYkNoYW5nZSk9XCJvblRhYkNoYW5nZSgkZXZlbnQpXCI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGJsIG9mIHRhYmxlQ29uZmlnU2VydmljZS5nZXRWaXNpYmxlVGFibGVDb25maWdzKHRhYmxlQ29uZmlncykgOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgIDxtYXQtdGFiICpuZ0lmPVwidGVzdFZpc2libGVUYWIodGJsKVwiPlxyXG5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0VGFiTGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj57e3RibC50YWJUaXRsZSA/PyAnVW50aXRsZWQnfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgPHNwYS10YWJsZS1pbnRlcm5hbCBcclxuICAgICAgICAgICAgICAgIFtjb25maWddPVwidGJsXCIgXHJcbiAgICAgICAgICAgICAgICBbcmVsb2FkXT1cInRhYmxlUmVsb2FkXCIgXHJcbiAgICAgICAgICAgICAgICBbaW5UYWJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbYWN0aXZlVGFiXT1cInNlbGVjdGVkVGFiSW5kZXggPT09IGlcIlxyXG4gICAgICAgICAgICAgICAgKGFjdGlvblN1Y2Nlc3MpPVwidGJsLmNhdXNlRm9ybVJlZnJlc2ggPyBsb2FkRGF0YShmb3JtQ29uZmlnLmxvYWRBY3Rpb24sIGZhbHNlKSA6IG51bGxcIj5cclxuICAgICAgICAgICAgICA8L3NwYS10YWJsZS1pbnRlcm5hbD5cclxuXHJcbiAgICAgICAgICAgIDwvbWF0LXRhYj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8L21hdC10YWItZ3JvdXA+XHJcblxyXG5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG4gIDxtYXQtZGlhbG9nLWFjdGlvbnMgPlxyXG5cclxuICAgIDxkaXY+XHJcblxyXG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIFtkaXNhYmxlZF09XCJpc1Byb2Nlc3NpbmdcIiAqbmdJZj1cImZvcm1Db25maWcubW9kZT09J2NyZWF0ZScgJiYgY3JlYXRlQnV0dG9uXCIgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAoY2xpY2spPVwiY3JlYXRlKClcIiBjZGtGb2N1c0luaXRpYWw+e3tjcmVhdGVCdXR0b24uZGlzcGxheSA/PyAnU3VibWl0J319XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNQcm9jZXNzaW5nXCIgKm5nSWY9XCJmb3JtQ29uZmlnLm1vZGU9PSdlZGl0JyAmJiBlZGl0QnV0dG9uXCIgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAoY2xpY2spPVwiZWRpdCgpXCIgY2RrRm9jdXNJbml0aWFsPnt7ZWRpdEJ1dHRvbi5kaXNwbGF5ID8/ICdTdWJtaXQnfX1cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBidG4gb2YgZXh0cmFCdXR0b25zXCI+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInRlc3RWaXNpYmxlKGRldGFpbHMsYnRuLm5hbWUpXCIgbWF0LXN0cm9rZWQtYnV0dG9uIFtkaXNhYmxlZF09XCJpc1Byb2Nlc3NpbmcgfHwgdGVzdERpc2FibGVkKGRldGFpbHMsYnRuLm5hbWUpXCIgW25nU3R5bGVdPVwieydjb2xvcic6IGdldEJ1dHRvbkNvbG9yKGJ0biwgZGV0YWlscyl9XCIgKGNsaWNrKT1cImN1c3RvbShidG4pXCIgY2RrRm9jdXNJbml0aWFsPlxyXG4gICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiYnRuLmljb25cIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzogZ2V0QnV0dG9uQ29sb3IoYnRuLCBkZXRhaWxzKX1cIj57e2J0bi5pY29uLm5hbWV9fTwvbWF0LWljb24+XHJcbiAgICAgICAgICB7e2J0bi5kaXNwbGF5ID8/IGJ0bi5uYW1lIHwgdGl0bGVjYXNlfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiY2xvc2UoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIiAqbmdJZj1cInNtYWxsU2NyZWVuXCI+XHJcbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgbWF0VG9vbHRpcD1cIkRlbGV0ZVwiIFtkaXNhYmxlZF09XCJpc1Byb2Nlc3NpbmdcIiBzdHlsZT1cImNvbG9yOiByZWQ7XCIgKGNsaWNrKT1cImRlbGV0ZSgpXCIgKm5nSWY9XCJmb3JtQ29uZmlnLm1vZGUhPSdjcmVhdGUnICAmJiBkZWxldGVCdXR0b25cIj48bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XHJcblxyXG5cclxuPC9kaXY+XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiJdfQ==
|