tin-spa 2.4.5 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/esm2020/lib/classes/Classes.mjs +5 -1
  2. package/esm2020/lib/classes/TinCore.mjs +28 -15
  3. package/esm2020/lib/components/alert/alert.component.mjs +11 -6
  4. package/esm2020/lib/components/email/email.component.mjs +19 -17
  5. package/esm2020/lib/components/form/form.component.mjs +17 -17
  6. package/esm2020/lib/components/label/label.component.mjs +3 -3
  7. package/esm2020/lib/components/list-dialog/list-dialog.component.mjs +1 -1
  8. package/esm2020/lib/components/option/option.component.mjs +32 -14
  9. package/esm2020/lib/components/page/page.component.mjs +9 -36
  10. package/esm2020/lib/components/search/search.component.mjs +10 -5
  11. package/esm2020/lib/components/select/select.component.mjs +33 -134
  12. package/esm2020/lib/components/select-common/select-common.component.mjs +135 -0
  13. package/esm2020/lib/components/select-internal/select-internal.component.mjs +47 -0
  14. package/esm2020/lib/components/select-lite/select-lite.component.mjs +13 -0
  15. package/esm2020/lib/components/steps/steps.component.mjs +33 -59
  16. package/esm2020/lib/components/suffix/suffix.component.mjs +71 -0
  17. package/esm2020/lib/components/table/detailsDialog.component.mjs +15 -11
  18. package/esm2020/lib/components/table/table.component.mjs +27 -62
  19. package/esm2020/lib/components/table-header/table-header.component.mjs +8 -6
  20. package/esm2020/lib/components/table-internal/detailsDialog-internal.component.mjs +18 -12
  21. package/esm2020/lib/components/table-internal/table-internal.component.mjs +31 -63
  22. package/esm2020/lib/components/table-lite/detailsDialog-lite.component.mjs +243 -0
  23. package/esm2020/lib/components/table-lite/table-lite.component.mjs +390 -0
  24. package/esm2020/lib/components/table-row/table-row.component.mjs +18 -4
  25. package/esm2020/lib/components/text/text.component.mjs +28 -36
  26. package/esm2020/lib/components/tiles/tiles.component.mjs +7 -2
  27. package/esm2020/lib/components/viewer/viewer.component.mjs +7 -3
  28. package/esm2020/lib/modules/admin/admin-routing.module.mjs +5 -1
  29. package/esm2020/lib/pages/accounts/accountDialog.component.mjs +1 -1
  30. package/esm2020/lib/pages/approvals/approvals.component.mjs +61 -0
  31. package/esm2020/lib/pages/approvals-config/approvals-config.component.mjs +89 -0
  32. package/esm2020/lib/pages/change-password/change-password.component.mjs +1 -1
  33. package/esm2020/lib/pages/create-account/create-account.component.mjs +1 -1
  34. package/esm2020/lib/pages/customers/customers.component.mjs +8 -8
  35. package/esm2020/lib/pages/departments/departments.component.mjs +1 -1
  36. package/esm2020/lib/pages/employees/employees.component.mjs +1 -1
  37. package/esm2020/lib/pages/inventory/inventory.component.mjs +1 -1
  38. package/esm2020/lib/pages/inventory/quantityDialog.component.mjs +1 -1
  39. package/esm2020/lib/pages/invitations-table/invitations-table.component.mjs +11 -10
  40. package/esm2020/lib/pages/login/login.component.mjs +1 -1
  41. package/esm2020/lib/pages/logs/logs.component.mjs +21 -22
  42. package/esm2020/lib/pages/membership/membership.component.mjs +15 -19
  43. package/esm2020/lib/pages/plans/plans.component.mjs +16 -19
  44. package/esm2020/lib/pages/positions/positions.component.mjs +3 -3
  45. package/esm2020/lib/pages/profile/profile.component.mjs +1 -1
  46. package/esm2020/lib/pages/recover-account/recover-account.component.mjs +1 -1
  47. package/esm2020/lib/pages/roles/addRoleDialog.component.mjs +2 -2
  48. package/esm2020/lib/pages/roles/roles.component.mjs +2 -2
  49. package/esm2020/lib/pages/signup/signup.component.mjs +1 -1
  50. package/esm2020/lib/pages/suppliers/suppliers.component.mjs +9 -9
  51. package/esm2020/lib/pages/tasks/tasks.component.mjs +9 -9
  52. package/esm2020/lib/pages/tenant-settings/tenant-settings.component.mjs +99 -71
  53. package/esm2020/lib/pages/tenants/tenants.component.mjs +8 -8
  54. package/esm2020/lib/pages/transactions/transactDialog.component.mjs +1 -1
  55. package/esm2020/lib/pages/transactions/transactions.component.mjs +1 -1
  56. package/esm2020/lib/pages/users/users.component.mjs +114 -92
  57. package/esm2020/lib/pages/welcome/welcome.component.mjs +8 -8
  58. package/esm2020/lib/select-context.directive.mjs +23 -0
  59. package/esm2020/lib/services/button.service.mjs +5 -6
  60. package/esm2020/lib/services/datalib.service.mjs +26 -15
  61. package/esm2020/lib/services/dialog.service.mjs +12 -1
  62. package/esm2020/lib/services/table-config.service.mjs +7 -3
  63. package/esm2020/lib/tin-spa.module.mjs +16 -9
  64. package/fesm2015/tin-spa.mjs +2867 -2017
  65. package/fesm2015/tin-spa.mjs.map +1 -1
  66. package/fesm2020/tin-spa.mjs +2881 -2030
  67. package/fesm2020/tin-spa.mjs.map +1 -1
  68. package/lib/classes/Classes.d.ts +18 -6
  69. package/lib/classes/TinCore.d.ts +1 -0
  70. package/lib/components/email/email.component.d.ts +4 -3
  71. package/lib/components/form/form.component.d.ts +4 -3
  72. package/lib/components/option/option.component.d.ts +8 -2
  73. package/lib/components/page/page.component.d.ts +2 -4
  74. package/lib/components/search/search.component.d.ts +3 -1
  75. package/lib/components/select/select.component.d.ts +9 -36
  76. package/lib/components/select-common/select-common.component.d.ts +42 -0
  77. package/lib/components/select-internal/select-internal.component.d.ts +17 -0
  78. package/lib/components/select-lite/select-lite.component.d.ts +6 -0
  79. package/lib/components/steps/steps.component.d.ts +9 -9
  80. package/lib/components/suffix/suffix.component.d.ts +23 -0
  81. package/lib/components/table/detailsDialog.component.d.ts +3 -2
  82. package/lib/components/table/table.component.d.ts +3 -2
  83. package/lib/components/table-header/table-header.component.d.ts +2 -1
  84. package/lib/components/table-internal/detailsDialog-internal.component.d.ts +3 -2
  85. package/lib/components/table-internal/table-internal.component.d.ts +3 -2
  86. package/lib/components/table-lite/detailsDialog-lite.component.d.ts +65 -0
  87. package/lib/components/table-lite/table-lite.component.d.ts +87 -0
  88. package/lib/components/table-row/table-row.component.d.ts +2 -0
  89. package/lib/components/text/text.component.d.ts +7 -7
  90. package/lib/components/tiles/tiles.component.d.ts +2 -1
  91. package/lib/pages/approvals/approvals.component.d.ts +11 -0
  92. package/lib/pages/approvals-config/approvals-config.component.d.ts +14 -0
  93. package/lib/pages/invitations-table/invitations-table.component.d.ts +1 -1
  94. package/lib/pages/logs/logs.component.d.ts +2 -6
  95. package/lib/pages/membership/membership.component.d.ts +2 -6
  96. package/lib/pages/plans/plans.component.d.ts +2 -6
  97. package/lib/pages/suppliers/suppliers.component.d.ts +1 -1
  98. package/lib/pages/tasks/tasks.component.d.ts +1 -1
  99. package/lib/pages/tenant-settings/tenant-settings.component.d.ts +10 -7
  100. package/lib/pages/tenants/tenants.component.d.ts +1 -1
  101. package/lib/pages/users/users.component.d.ts +8 -16
  102. package/lib/select-context.directive.d.ts +10 -0
  103. package/lib/services/button.service.d.ts +0 -1
  104. package/lib/services/datalib.service.d.ts +3 -1
  105. package/lib/services/table-config.service.d.ts +1 -1
  106. package/lib/tin-spa.module.d.ts +41 -34
  107. package/package.json +1 -1
  108. package/esm2020/lib/pages/invitations/invitations.component.mjs +0 -14
  109. package/esm2020/lib/pages/tenant-settings/inviteDialog.component.mjs +0 -60
  110. package/lib/pages/invitations/invitations.component.d.ts +0 -8
  111. package/lib/pages/tenant-settings/inviteDialog.component.d.ts +0 -28
@@ -13,11 +13,16 @@ import * as i7 from "../../services/dialog.service";
13
13
  import * as i8 from "@angular/common";
14
14
  import * as i9 from "@angular/material/button";
15
15
  import * as i10 from "@angular/material/icon";
16
- import * as i11 from "@angular/material/tooltip";
17
- import * as i12 from "@angular/material/progress-bar";
18
- import * as i13 from "../form/form.component";
19
- import * as i14 from "../alert/alert.component";
20
- import * as i15 from "../../classes/Classes";
16
+ import * as i11 from "@angular/material/tabs";
17
+ import * as i12 from "@angular/material/tooltip";
18
+ import * as i13 from "@angular/material/progress-bar";
19
+ import * as i14 from "../steps/steps.component";
20
+ import * as i15 from "../form/form.component";
21
+ import * as i16 from "../alert/alert.component";
22
+ import * as i17 from "../select-internal/select-internal.component";
23
+ import * as i18 from "../table-lite/table-lite.component";
24
+ import * as i19 from "../../pipes/camelToWords.pipe";
25
+ import * as i20 from "../../classes/Classes";
21
26
  export class DetailsDialogInternal {
22
27
  constructor(breakpointObserver, loaderService, dataService, messageService, dialogRef, detailsConfig, buttonService, dialogService) {
23
28
  this.breakpointObserver = breakpointObserver;
@@ -47,10 +52,11 @@ export class DetailsDialogInternal {
47
52
  });
48
53
  }
49
54
  ngOnInit() {
50
- const { tableConfig, tableConfigs, formConfig, buttons } = DetailsDialogProcessor.initializeConfigs(this.detailsConfig);
55
+ const { tableConfig, tableConfigs, formConfig, stepConfig, buttons } = DetailsDialogProcessor.initializeConfigs(this.detailsConfig);
51
56
  this.tableConfig = tableConfig;
52
57
  this.tableConfigs = tableConfigs;
53
58
  this.formConfig = formConfig;
59
+ this.stepConfig = stepConfig;
54
60
  this.buttons = buttons;
55
61
  let resp = DetailsDialogProcessor.handleFormMode(this.detailsConfig, this.formConfig);
56
62
  if (resp.loadByAction) {
@@ -108,7 +114,7 @@ export class DetailsDialogInternal {
108
114
  }
109
115
  testDisabled(row, buttonName) {
110
116
  const button = this.getButton(buttonName);
111
- return button ? this.buttonService.isButtonDisabled(button, row) : false;
117
+ return button ? this.buttonService.testDisabled(button, row) : false;
112
118
  }
113
119
  testVisible(row, buttonName) {
114
120
  const button = this.getButton(buttonName);
@@ -217,7 +223,7 @@ export class DetailsDialogInternal {
217
223
  this.dataService.CallApi(button.action, data).subscribe((apiResponse) => {
218
224
  if (apiResponse.success) {
219
225
  this.messageService.toast(button.action?.successMessage || defaultSuccessMessage);
220
- this.dialogRef.close({ message: 'success', data: this.details });
226
+ this.dialogRef.close({ message: 'success', data: { ...apiResponse, data: this.details } });
221
227
  }
222
228
  else {
223
229
  this.messageService.toast("Error: " + apiResponse.message);
@@ -226,15 +232,15 @@ export class DetailsDialogInternal {
226
232
  }
227
233
  }
228
234
  DetailsDialogInternal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DetailsDialogInternal, 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 }], target: i0.ɵɵFactoryTarget.Component });
229
- DetailsDialogInternal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: DetailsDialogInternal, selector: "app-viewModel-internal", 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 <div class=\"row d-flex align-items-center mt-0\">\r\n\r\n <div class=\"col\">\r\n <h2 mat-dialog-title>{{titleAction | titlecase}} {{formConfig?.title}}</h2>\r\n </div>\r\n\r\n <div class=\"col d-flex justify-content-end\">\r\n\r\n <div *ngIf=\"formConfig.mode=='view' && editButton && testVisible(details,editButton.name)\" class=\"col d-flex justify-content-end\">\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, true)\"><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-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)\"></spa-form>\r\n\r\n<!-- Unique to iternal no tables -->\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\" color=\"primary\" *ngIf=\"formConfig.mode=='create' && createButton\" (click)=\"create()\" cdkFocusInitial>{{createButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <button mat-raised-button [disabled]=\"isProcessing\" color=\"primary\" *ngIf=\"formConfig.mode=='edit' && editButton\" (click)=\"edit()\" cdkFocusInitial>{{editButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <ng-container *ngFor=\"let btn of extraButtons\">\r\n <button *ngIf=\"!smallScreen && testVisible(details,btn.name)\" mat-stroked-button [disabled]=\"isProcessing || testDisabled(details,btn.name)\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\" (click)=\"custom(btn)\" cdkFocusInitial><mat-icon [ngStyle]=\"{'color': getButtonColor(btn, details)}\">{{btn.icon.name}}</mat-icon>{{btn.display ?? btn.name | titlecase}}\r\n </button>\r\n </ng-container>\r\n\r\n <button mat-stroked-button color=\"primary\" mat-dialog-close>Cancel</button>\r\n\r\n </div>\r\n\r\n <div class=\"col d-flex justify-content-end\" *ngIf=\"smallScreen\">\r\n <ng-container *ngFor=\"let btn of extraButtons\">\r\n <button *ngIf=\"testVisible(details,btn.name)\" mat-icon-button matTooltipPosition=\"above\" [matTooltip]=\"btn.tip ?? btn.name | titlecase\" [disabled]=\"isProcessing || testDisabled(details,btn.name)\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\" (click)=\"custom(btn)\" cdkFocusInitial><mat-icon>{{btn.icon.name}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n\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", 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;overflow:hidden;display:flex;flex-direction:column}.dialog-scroll-content{flex:1;overflow-y:auto}mat-dialog-actions{flex-shrink:0}\n"], dependencies: [{ kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i9.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: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i5.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { 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: "directive", type: i11.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i12.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i13.FormComponent, selector: "spa-form", inputs: ["files", "data", "config"], outputs: ["buttonClick", "inputChange"] }, { kind: "component", type: i14.AlertComponent, selector: "spa-alert", inputs: ["alertMessages", "data"] }, { kind: "pipe", type: i8.TitleCasePipe, name: "titlecase" }] });
235
+ DetailsDialogInternal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: DetailsDialogInternal, selector: "spa-detailsDialog-internal", 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 <div class=\"row d-flex align-items-center mt-0\">\r\n\r\n <div class=\"col\">\r\n <h2 mat-dialog-title>{{titleAction | titlecase}} {{formConfig?.title}}</h2>\r\n </div>\r\n\r\n <div class=\"col d-flex justify-content-end\">\r\n\r\n <div *ngIf=\"formConfig.mode=='view' && editButton && testVisible(details,editButton.name)\" class=\"col d-flex justify-content-end\">\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, true)\"><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-internal\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 [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 [peekConfig]=\"field.peekConfig\"\r\n [loadAction]=\"field.loadAction\"\r\n [infoMessage]=\"field.infoMessage\"\r\n [copyContent]=\"field.copyContent\"\r\n (valueChange)=\"selectChanged(field)\"\r\n ></spa-select-internal>\r\n </ng-template>\r\n </spa-form>\r\n\r\n\r\n <mat-tab-group *ngIf=\"tableConfigs\">\r\n\r\n <ng-container *ngFor=\"let tbl of tableConfigs\">\r\n\r\n <mat-tab *ngIf=\"testVisibleTab(tbl)\">\r\n <ng-template matTabLabel>\r\n <span>{{tbl.title ?? 'Untitled'}}</span>\r\n </ng-template>\r\n\r\n <spa-table-lite [config]=\"tbl\" [hideTitle]=\"true\" [reload]=\"tableReload\" (dataLoad)=\"loadData(formConfig.loadAction, false)\"></spa-table-lite>\r\n\r\n </mat-tab>\r\n </ng-container>\r\n\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\" color=\"primary\" *ngIf=\"formConfig.mode=='create' && createButton\" (click)=\"create()\" cdkFocusInitial>{{createButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <button mat-raised-button [disabled]=\"isProcessing\" color=\"primary\" *ngIf=\"formConfig.mode=='edit' && editButton\" (click)=\"edit()\" cdkFocusInitial>{{editButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <ng-container *ngFor=\"let btn of extraButtons\">\r\n <button *ngIf=\"!smallScreen && testVisible(details,btn.name)\" mat-stroked-button [disabled]=\"isProcessing || testDisabled(details,btn.name)\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\" (click)=\"custom(btn)\" cdkFocusInitial><mat-icon [ngStyle]=\"{'color': getButtonColor(btn, details)}\">{{btn.icon.name}}</mat-icon>{{btn.display ?? btn.name | titlecase}}\r\n </button>\r\n </ng-container>\r\n\r\n <button mat-stroked-button color=\"primary\" mat-dialog-close>Cancel</button>\r\n\r\n </div>\r\n\r\n <div class=\"col d-flex justify-content-end\" *ngIf=\"smallScreen\">\r\n <ng-container *ngFor=\"let btn of extraButtons\">\r\n <button *ngIf=\"testVisible(details,btn.name)\" mat-icon-button matTooltipPosition=\"above\" [matTooltip]=\"btn.tip ?? btn.name | titlecase\" [disabled]=\"isProcessing || testDisabled(details,btn.name)\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\" (click)=\"custom(btn)\" cdkFocusInitial><mat-icon>{{btn.icon.name}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n\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;overflow:hidden;display:flex;flex-direction:column}.dialog-scroll-content{flex:1;overflow-y:auto}mat-dialog-actions{flex-shrink:0}\n"], dependencies: [{ kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i9.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: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i5.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { 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: i11.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i11.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i11.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "directive", type: i12.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i13.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i14.StepsComponent, selector: "spa-steps", inputs: ["value", "config", "data"] }, { kind: "component", type: i15.FormComponent, selector: "spa-form", inputs: ["files", "data", "config"], outputs: ["buttonClick", "inputChange"] }, { kind: "component", type: i16.AlertComponent, selector: "spa-alert", inputs: ["alertMessages", "data"] }, { kind: "component", type: i17.SelectInternalComponent, selector: "spa-select-internal", inputs: ["peekConfig"] }, { kind: "component", type: i18.TableLiteComponent, selector: "spa-table-lite", inputs: ["hideTitle", "data", "tileData", "config", "reload"], outputs: ["dataLoad", "refreshClick", "searchClick", "createClick", "actionClick", "inputChange", "actionResponse"] }, { kind: "pipe", type: i8.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i19.CamelToWordsPipe, name: "camelToWords" }] });
230
236
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DetailsDialogInternal, decorators: [{
231
237
  type: Component,
232
- args: [{ selector: 'app-viewModel-internal', 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 <div class=\"row d-flex align-items-center mt-0\">\r\n\r\n <div class=\"col\">\r\n <h2 mat-dialog-title>{{titleAction | titlecase}} {{formConfig?.title}}</h2>\r\n </div>\r\n\r\n <div class=\"col d-flex justify-content-end\">\r\n\r\n <div *ngIf=\"formConfig.mode=='view' && editButton && testVisible(details,editButton.name)\" class=\"col d-flex justify-content-end\">\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, true)\"><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-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)\"></spa-form>\r\n\r\n<!-- Unique to iternal no tables -->\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\" color=\"primary\" *ngIf=\"formConfig.mode=='create' && createButton\" (click)=\"create()\" cdkFocusInitial>{{createButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <button mat-raised-button [disabled]=\"isProcessing\" color=\"primary\" *ngIf=\"formConfig.mode=='edit' && editButton\" (click)=\"edit()\" cdkFocusInitial>{{editButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <ng-container *ngFor=\"let btn of extraButtons\">\r\n <button *ngIf=\"!smallScreen && testVisible(details,btn.name)\" mat-stroked-button [disabled]=\"isProcessing || testDisabled(details,btn.name)\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\" (click)=\"custom(btn)\" cdkFocusInitial><mat-icon [ngStyle]=\"{'color': getButtonColor(btn, details)}\">{{btn.icon.name}}</mat-icon>{{btn.display ?? btn.name | titlecase}}\r\n </button>\r\n </ng-container>\r\n\r\n <button mat-stroked-button color=\"primary\" mat-dialog-close>Cancel</button>\r\n\r\n </div>\r\n\r\n <div class=\"col d-flex justify-content-end\" *ngIf=\"smallScreen\">\r\n <ng-container *ngFor=\"let btn of extraButtons\">\r\n <button *ngIf=\"testVisible(details,btn.name)\" mat-icon-button matTooltipPosition=\"above\" [matTooltip]=\"btn.tip ?? btn.name | titlecase\" [disabled]=\"isProcessing || testDisabled(details,btn.name)\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\" (click)=\"custom(btn)\" cdkFocusInitial><mat-icon>{{btn.icon.name}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n\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", 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;overflow:hidden;display:flex;flex-direction:column}.dialog-scroll-content{flex:1;overflow-y:auto}mat-dialog-actions{flex-shrink:0}\n"] }]
233
- }], ctorParameters: function () { return [{ type: i1.BreakpointObserver }, { type: i2.LoaderService }, { type: i3.DataServiceLib }, { type: i4.MessageService }, { type: i5.MatDialogRef }, { type: i15.DetailsDialogConfig, decorators: [{
238
+ args: [{ selector: 'spa-detailsDialog-internal', 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 <div class=\"row d-flex align-items-center mt-0\">\r\n\r\n <div class=\"col\">\r\n <h2 mat-dialog-title>{{titleAction | titlecase}} {{formConfig?.title}}</h2>\r\n </div>\r\n\r\n <div class=\"col d-flex justify-content-end\">\r\n\r\n <div *ngIf=\"formConfig.mode=='view' && editButton && testVisible(details,editButton.name)\" class=\"col d-flex justify-content-end\">\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, true)\"><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-internal\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 [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 [peekConfig]=\"field.peekConfig\"\r\n [loadAction]=\"field.loadAction\"\r\n [infoMessage]=\"field.infoMessage\"\r\n [copyContent]=\"field.copyContent\"\r\n (valueChange)=\"selectChanged(field)\"\r\n ></spa-select-internal>\r\n </ng-template>\r\n </spa-form>\r\n\r\n\r\n <mat-tab-group *ngIf=\"tableConfigs\">\r\n\r\n <ng-container *ngFor=\"let tbl of tableConfigs\">\r\n\r\n <mat-tab *ngIf=\"testVisibleTab(tbl)\">\r\n <ng-template matTabLabel>\r\n <span>{{tbl.title ?? 'Untitled'}}</span>\r\n </ng-template>\r\n\r\n <spa-table-lite [config]=\"tbl\" [hideTitle]=\"true\" [reload]=\"tableReload\" (dataLoad)=\"loadData(formConfig.loadAction, false)\"></spa-table-lite>\r\n\r\n </mat-tab>\r\n </ng-container>\r\n\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\" color=\"primary\" *ngIf=\"formConfig.mode=='create' && createButton\" (click)=\"create()\" cdkFocusInitial>{{createButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <button mat-raised-button [disabled]=\"isProcessing\" color=\"primary\" *ngIf=\"formConfig.mode=='edit' && editButton\" (click)=\"edit()\" cdkFocusInitial>{{editButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <ng-container *ngFor=\"let btn of extraButtons\">\r\n <button *ngIf=\"!smallScreen && testVisible(details,btn.name)\" mat-stroked-button [disabled]=\"isProcessing || testDisabled(details,btn.name)\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\" (click)=\"custom(btn)\" cdkFocusInitial><mat-icon [ngStyle]=\"{'color': getButtonColor(btn, details)}\">{{btn.icon.name}}</mat-icon>{{btn.display ?? btn.name | titlecase}}\r\n </button>\r\n </ng-container>\r\n\r\n <button mat-stroked-button color=\"primary\" mat-dialog-close>Cancel</button>\r\n\r\n </div>\r\n\r\n <div class=\"col d-flex justify-content-end\" *ngIf=\"smallScreen\">\r\n <ng-container *ngFor=\"let btn of extraButtons\">\r\n <button *ngIf=\"testVisible(details,btn.name)\" mat-icon-button matTooltipPosition=\"above\" [matTooltip]=\"btn.tip ?? btn.name | titlecase\" [disabled]=\"isProcessing || testDisabled(details,btn.name)\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\" (click)=\"custom(btn)\" cdkFocusInitial><mat-icon>{{btn.icon.name}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n\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;overflow:hidden;display:flex;flex-direction:column}.dialog-scroll-content{flex:1;overflow-y:auto}mat-dialog-actions{flex-shrink:0}\n"] }]
239
+ }], ctorParameters: function () { return [{ type: i1.BreakpointObserver }, { type: i2.LoaderService }, { type: i3.DataServiceLib }, { type: i4.MessageService }, { type: i5.MatDialogRef }, { type: i20.DetailsDialogConfig, decorators: [{
234
240
  type: Inject,
235
241
  args: [MAT_DIALOG_DATA]
236
242
  }] }, { type: i6.ButtonService }, { type: i7.DialogService }]; }, propDecorators: { inputChange: [{
237
243
  type: Output
238
244
  }] } });
239
245
  ;
240
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsc0RpYWxvZy1pbnRlcm5hbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90aW4tc3BhL3NyYy9saWIvY29tcG9uZW50cy90YWJsZS1pbnRlcm5hbC9kZXRhaWxzRGlhbG9nLWludGVybmFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rpbi1zcGEvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlLWludGVybmFsL2RldGFpbHNEaWFsb2ctaW50ZXJuYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsZUFBZSxFQUFnQixNQUFNLDBCQUEwQixDQUFDO0FBTXpFLE9BQU8sRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUdyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQU0vQixNQUFNLE9BQU8scUJBQXFCO0lBRWhDLFlBQW9CLGtCQUFzQyxFQUFTLGFBQTRCLEVBQVEsV0FBMkIsRUFBUyxjQUE4QixFQUMvSixTQUE4QyxFQUFrQyxhQUFrQyxFQUFVLGFBQTRCLEVBQ3hKLGFBQTRCO1FBRmxCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFBUyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFRLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUFTLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUMvSixjQUFTLEdBQVQsU0FBUyxDQUFxQztRQUFrQyxrQkFBYSxHQUFiLGFBQWEsQ0FBcUI7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUN4SixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQWtEdEMs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QXdCOzswQkFPeUIsTUFBTTsyQkFBQyxlQUFlO29HQTJFdkUsV0FBVztzQkFBcEIsTUFBTTs7QUErTFIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5qZWN0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IEZvcm1Db25maWcsIEZpZWxkLCBUYWJsZUNvbmZpZywgQnV0dG9uLCBEZXRhaWxzRGlhbG9nQ29uZmlnLCBBY3Rpb24sIEFwaVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9DbGFzc2VzJztcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tZXNzYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRhU2VydmljZUxpYiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGFsaWIuc2VydmljZSc7XHJcbmltcG9ydCB7IExvYWRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sb2FkZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEJyZWFrcG9pbnRPYnNlcnZlciwgQnJlYWtwb2ludFN0YXRlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XHJcbmltcG9ydCB7IENvcmUsIERldGFpbHNEaWFsb2dQcm9jZXNzb3IgfSBmcm9tICcuLi8uLi9jbGFzc2VzL1RpbkNvcmUnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGlhbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCdXR0b25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYnV0dG9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXZpZXdNb2RlbC1pbnRlcm5hbCcsIC8vdW5pcSB0byBpbnRlcm5hbFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kZXRhaWxzRGlhbG9nLWludGVybmFsLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90YWJsZS1pbnRlcm5hbC5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIERldGFpbHNEaWFsb2dJbnRlcm5hbCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYnJlYWtwb2ludE9ic2VydmVyOiBCcmVha3BvaW50T2JzZXJ2ZXIscHJpdmF0ZSBsb2FkZXJTZXJ2aWNlOiBMb2FkZXJTZXJ2aWNlLHB1YmxpYyBkYXRhU2VydmljZTogRGF0YVNlcnZpY2VMaWIscHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPERldGFpbHNEaWFsb2dJbnRlcm5hbD4sIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGV0YWlsc0NvbmZpZzogRGV0YWlsc0RpYWxvZ0NvbmZpZywgcHJpdmF0ZSBidXR0b25TZXJ2aWNlOiBCdXR0b25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlKVxyXG4gIHtcclxuICAgIC8vIGRldGVjdCBzY3JlZW4gc2l6ZSBjaGFuZ2VzXHJcbiAgICB0aGlzLmJyZWFrcG9pbnRPYnNlcnZlci5vYnNlcnZlKFtcIihtYXgtd2lkdGg6IDYwMHB4KVwiXSkuc3Vic2NyaWJlKChyZXN1bHQ6IEJyZWFrcG9pbnRTdGF0ZSkgPT4ge1xyXG5cclxuICAgICAgaWYgKHJlc3VsdC5tYXRjaGVzKSB7XHJcbiAgICAgICAgdGhpcy5zbWFsbFNjcmVlbiA9IHRydWVcclxuICAgICAgfWVsc2Uge1xyXG4gICAgICAgIHRoaXMuc21hbGxTY3JlZW4gPSBmYWxzZVxyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgICBjb25zdCB7IHRhYmxlQ29uZmlnLCB0YWJsZUNvbmZpZ3MsIGZvcm1Db25maWcsIGJ1dHRvbnMgfSA9IERldGFpbHNEaWFsb2dQcm9jZXNzb3IuaW5pdGlhbGl6ZUNvbmZpZ3ModGhpcy5kZXRhaWxzQ29uZmlnKTtcclxuICAgIHRoaXMudGFibGVDb25maWcgPSB0YWJsZUNvbmZpZztcclxuICAgIHRoaXMudGFibGVDb25maWdzID0gdGFibGVDb25maWdzO1xyXG4gICAgdGhpcy5mb3JtQ29uZmlnID0gZm9ybUNvbmZpZztcclxuICAgIHRoaXMuYnV0dG9ucyA9IGJ1dHRvbnM7XHJcblxyXG4gICAgbGV0IHJlc3AgPSBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yLmhhbmRsZUZvcm1Nb2RlKHRoaXMuZGV0YWlsc0NvbmZpZywgdGhpcy5mb3JtQ29uZmlnLCk7XHJcblxyXG4gICAgaWYgKHJlc3AubG9hZEJ5QWN0aW9uKSB7XHJcbiAgICAgIHRoaXMubG9hZEJ5QWN0aW9uID0gdHJ1ZTtcclxuICAgICAgZm9ybUNvbmZpZy5sb2FkQWN0aW9uID0gcmVzcC5hY3Rpb247XHJcbiAgICAgIHRoaXMubG9hZERhdGEocmVzcC5hY3Rpb24sIGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGV0YWlscyA9IHJlc3AuZGV0YWlscztcclxuICAgICAgRGV0YWlsc0RpYWxvZ1Byb2Nlc3Nvci5zZXRIZXJvVmFsdWUodGhpcy5kZXRhaWxzQ29uZmlnLCB0aGlzLmRldGFpbHMpO1xyXG4gICAgICB0aGlzLmxvYWRCeUFjdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmlzTG9hZENvbXBsZXRlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbGVGaWVsZCA9IERldGFpbHNEaWFsb2dQcm9jZXNzb3Iuc2V0RmlsZUZpZWxkKHRoaXMuZm9ybUNvbmZpZyk7XHJcblxyXG4gICAgdGhpcy5sb2FkZXJTZXJ2aWNlLmlzTG9hZGluZy5zdWJzY3JpYmUoeCA9PiB0aGlzLmlzUHJvY2Vzc2luZyA9IHgpO1xyXG5cclxuICAgIGNvbnN0IHsgZXh0cmFCdXR0b25zLCBjcmVhdGVCdXR0b24sIGVkaXRCdXR0b24sIGRlbGV0ZUJ1dHRvbiB9ID0gRGV0YWlsc0RpYWxvZ1Byb2Nlc3Nvci5zZXR1cEJ1dHRvbnModGhpcy5mb3JtQ29uZmlnLCB0aGlzLmJ1dHRvbnMpO1xyXG4gICAgdGhpcy5leHRyYUJ1dHRvbnMgPSBleHRyYUJ1dHRvbnM7XHJcbiAgICB0aGlzLmNyZWF0ZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbjtcclxuICAgIHRoaXMuZWRpdEJ1dHRvbiA9IGVkaXRCdXR0b247XHJcbiAgICB0aGlzLmRlbGV0ZUJ1dHRvbiA9IGRlbGV0ZUJ1dHRvbjtcclxuXHJcbiAgICB0aGlzLnNldFRpdGxlQWN0aW9uKClcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgdGl0bGVBY3Rpb24gPSBcIlZpZXdcIjtcclxuICBsb2FkQnlBY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgZXh0cmFCdXR0b25zOiBCdXR0b25bXTtcclxuICBidXR0b25zOiBCdXR0b25bXTtcclxuICBjcmVhdGVCdXR0b246IEJ1dHRvbjtcclxuICBlZGl0QnV0dG9uOiBCdXR0b247XHJcbiAgZGVsZXRlQnV0dG9uOiBCdXR0b247XHJcblxyXG4gIC8vIG1vZGVCdXR0b24gOiBCdXR0b25cclxuICBmaWxlRmllbGQ6IEZpZWxkO1xyXG4gIGZpbGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICB0YWJsZVJlbG9hZDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHRhYmxlQ29uZmlnOiBUYWJsZUNvbmZpZ1xyXG4gIHRhYmxlQ29uZmlnc1xyXG4gIGRldGFpbHM6IGFueVxyXG4gIGZvcm1Db25maWc6IEZvcm1Db25maWc7XHJcbiAgc21hbGxTY3JlZW4gPSBmYWxzZTtcclxuXHJcbiAgaXNMb2FkQ29tcGxldGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1Byb2Nlc3Npbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIGlucHV0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuXHJcbiAgbG9hZERhdGEoYWN0aW9uOiBBY3Rpb24sIHJlbG9hZCkge1xyXG5cclxuICAgIGlmIChhY3Rpb24gJiYgdGhpcy5sb2FkQnlBY3Rpb24pIHtcclxuXHJcbiAgICAgIHRoaXMuZGF0YVNlcnZpY2UuQ2FsbEFwaShhY3Rpb24pLnN1YnNjcmliZSgoYXBpUmVzcG9uc2U6IEFwaVJlc3BvbnNlKSA9PiB7XHJcblxyXG4gICAgICAgIGlmIChhcGlSZXNwb25zZS5zdWNjZXNzKSB7XHJcbiAgICAgICAgICB0aGlzLmRldGFpbHMgPSBhcGlSZXNwb25zZS5kYXRhXHJcbiAgICAgICAgICB0aGlzLmlzTG9hZENvbXBsZXRlID0gdHJ1ZTtcclxuICAgICAgICAgIC8vIERldGFpbHNEaWFsb2dQcm9jZXNzb3Iuc2V0SGVyb1ZhbHVlKHRoaXMuZGV0YWlsc0NvbmZpZywgdGhpcy5kZXRhaWxzKTtcclxuICAgICAgICAgIGlmIChyZWxvYWQpIHRoaXMudGFibGVSZWxvYWQubmV4dCh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiRXJyb3I6IFwiICsgYXBpUmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgaW5wdXRDaGFuZ2VkKGV2ZW50KSB7XHJcbiAgICB0aGlzLmlucHV0Q2hhbmdlLmVtaXQoeyBmaWVsZDogZXZlbnQuZmllbGQsIHZhbHVlOiBldmVudC52YWx1ZSB9KVxyXG4gIH1cclxuXHJcblxyXG4gIHNldE1vZGUobmV3TW9kZSkge1xyXG4gICAgdGhpcy5mb3JtQ29uZmlnLm1vZGUgPSBuZXdNb2RlXHJcbiAgICB0aGlzLnNldFRpdGxlQWN0aW9uKClcclxuICB9XHJcblxyXG4gIHNldFRpdGxlQWN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuZm9ybUNvbmZpZy5maXhlZFRpdGxlKSB7XHJcbiAgICAgIHRoaXMudGl0bGVBY3Rpb24gPSBcIlwiO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50aXRsZUFjdGlvbiA9IHRoaXMuYnV0dG9uU2VydmljZS5nZXRUaXRsZUFjdGlvbih0aGlzLmZvcm1Db25maWcubW9kZSwgdGhpcy5idXR0b25zKTtcclxuICB9XHJcblxyXG4gIGdldEJ1dHRvbihuYW1lOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0QnV0dG9uKHRoaXMuYnV0dG9ucywgbmFtZSk7XHJcbiAgfVxyXG5cclxuICB0ZXN0RGlzYWJsZWQocm93LCBidXR0b25OYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKGJ1dHRvbk5hbWUpO1xyXG4gICAgcmV0dXJuIGJ1dHRvbiA/IHRoaXMuYnV0dG9uU2VydmljZS5pc0J1dHRvbkRpc2FibGVkKGJ1dHRvbiwgcm93KSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIHRlc3RWaXNpYmxlKHJvdywgYnV0dG9uTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbihidXR0b25OYW1lKTtcclxuICAgIHJldHVybiBidXR0b24gPyB0aGlzLmJ1dHRvblNlcnZpY2UuaXNCdXR0b25WaXNpYmxlKGJ1dHRvbiwgcm93LCB0aGlzLmlzTG9hZENvbXBsZXRlKSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdGVzdFZpc2libGVUYWIodGJsQ29uZmlnOiBUYWJsZUNvbmZpZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uU2VydmljZS5pc1RhYlZpc2libGUodGJsQ29uZmlnKTtcclxuICB9XHJcblxyXG4gIGdldEJ1dHRvbkNvbG9yKGJ1dHRvbjogQnV0dG9uLCByb3cpIHtcclxuICAgIHJldHVybiB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0QnV0dG9uQ29sb3IoYnV0dG9uLCByb3cpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VmlzaWJsZUZpZWxkcygpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWcuZmllbGRzPy5maWx0ZXIoeCA9PiBDb3JlLnRlc3RWaXNpYmxlKHRoaXMuZm9ybUNvbmZpZywgdGhpcy5kZXRhaWxzLCB4KSlcclxuICB9XHJcblxyXG5cclxuICBjcmVhdGUoKSB7XHJcbiAgICB0aGlzLmhhbmRsZUJ1dHRvbkFjdGlvbignY3JlYXRlJyk7XHJcbiAgfVxyXG5cclxuICBlZGl0KCkge1xyXG4gICAgdGhpcy5oYW5kbGVCdXR0b25BY3Rpb24oJ2VkaXQnKTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZSgpIHtcclxuICAgIHRoaXMuaGFuZGxlQnV0dG9uQWN0aW9uKCdkZWxldGUnKTtcclxuICB9XHJcblxyXG5cclxuICBjdXN0b20oYnV0dG9uOiBCdXR0b24pIHtcclxuICAgIGlmIChidXR0b24uZGlhbG9nICYmIGJ1dHRvbi5kZXRhaWxzQ29uZmlnKSB7XHJcbiAgICAgIHRoaXMub3Blbk5lc3RlZERldGFpbHNEaWFsb2coYnV0dG9uKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlQnV0dG9uQWN0aW9uKGJ1dHRvbi5uYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3Blbk5lc3RlZERldGFpbHNEaWFsb2coYnV0dG9uOiBCdXR0b24pOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbkNvbmZpZ3VyZWREZXRhaWxzRGlhbG9nKGJ1dHRvbi5uYW1lLCB0aGlzLmRldGFpbHMsIHRoaXMuZGV0YWlsc0NvbmZpZywgRGV0YWlsc0RpYWxvZ0ludGVybmFsKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuXHJcbiAgICAgIGlmIChyZXN1bHQuYWN0aW9uID09PSAnaW5wdXRDaGFuZ2UnKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dENoYW5nZWQocmVzdWx0LmNoYW5nZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICYmIHJlc3VsdC5tZXNzYWdlID09PSAnc3VjY2VzcycpIHtcclxuICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaERhdGEoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtQ29uZmlnLmxvYWRBY3Rpb24pIHtcclxuICAgICAgdGhpcy5sb2FkRGF0YSh0aGlzLmZvcm1Db25maWcubG9hZEFjdGlvbiwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgaGFuZGxlQnV0dG9uQWN0aW9uKGJ1dHRvbk5hbWU6IHN0cmluZykge1xyXG5cclxuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKGJ1dHRvbk5hbWUpO1xyXG4gICAgaWYgKCFidXR0b24pIHJldHVybjtcclxuXHJcbiAgICBpZiAoIWJ1dHRvbi5hY3Rpb24pIHtcclxuICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoeyBtZXNzYWdlOiAnZW1pdCcsIGRhdGE6IHRoaXMuZGV0YWlscyB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnZhbGlkYXRlRm9ybSgpKSB7XHJcbiAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbihidXR0b24sIHRoaXMuZGV0YWlscywgYnV0dG9uLmFjdGlvbj8uc3VjY2Vzc01lc3NhZ2UgfHwgXCJVcGRhdGVkXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2YWxpZGF0ZUZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdmFsaWRhdGlvblJlc3VsdCA9IENvcmUudmFsaWRhdGVPYmplY3QodGhpcy5nZXRWaXNpYmxlRmllbGRzKCksIHRoaXMuZGV0YWlscyk7XHJcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdCAhPT0gJycpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdCh2YWxpZGF0aW9uUmVzdWx0KTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpbGVzLmxlbmd0aCA8IDEgJiYgdGhpcy5maWxlRmllbGQ/LnJlcXVpcmVkICYmIHRoaXMuZm9ybUNvbmZpZy5tb2RlID09PSAnY3JlYXRlJykge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiUGxlYXNlIGF0dGFjaCBmaWxlKHMpXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVmFsaWRhdGUgY29tcG9zaXRlIGZpZWxkc1xyXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiB0aGlzLmdldFZpc2libGVGaWVsZHMoKSkge1xyXG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2NvbXBvc2l0ZScpIHtcclxuICAgICAgICB2YWxpZGF0aW9uUmVzdWx0ID0gQ29yZS52YWxpZGF0ZU9iamVjdChDb3JlLmdldFZpc2libGVTdWJmaWVsZHModGhpcy5mb3JtQ29uZmlnLCB0aGlzLmRldGFpbHMsIGZpZWxkKSwgdGhpcy5kZXRhaWxzKTtcclxuICAgICAgICBpZiAodmFsaWRhdGlvblJlc3VsdCAhPT0gJycpIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QodmFsaWRhdGlvblJlc3VsdCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZXBhcmVBY3Rpb25EYXRhKGJ1dHRvbjogQnV0dG9uLCBkYXRhOiBhbnkpOiBhbnkge1xyXG4gICAgaWYgKGJ1dHRvbi5hY3Rpb24/LmlzRm9ybURhdGEpIHtcclxuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGB1cGxvYWRGaWxlJHtpfWAsIHRoaXMuZmlsZXNbaV0sIHRoaXMuZmlsZXNbaV0ubmFtZSk7XHJcbiAgICAgIH1cclxuICAgICAgZm9ybURhdGEuYXBwZW5kKFwiZGF0YVwiLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgIHJldHVybiBmb3JtRGF0YTtcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBleGVjdXRlQWN0aW9uKGJ1dHRvbjogQnV0dG9uLCBkYXRhOiBhbnksIGRlZmF1bHRTdWNjZXNzTWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBhY3Rpb25EYXRhID0gdGhpcy5wcmVwYXJlQWN0aW9uRGF0YShidXR0b24sIGRhdGEpO1xyXG5cclxuICAgIGlmIChidXR0b24uY29uZmlybSkge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmNvbmZpcm0oYnV0dG9uLmNvbmZpcm0ubWVzc2FnZSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0ID09PSBcInllc1wiKSB7XHJcbiAgICAgICAgICB0aGlzLnBlcmZvcm1BcGlDYWxsKGJ1dHRvbiwgYWN0aW9uRGF0YSwgZGVmYXVsdFN1Y2Nlc3NNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wZXJmb3JtQXBpQ2FsbChidXR0b24sIGFjdGlvbkRhdGEsIGRlZmF1bHRTdWNjZXNzTWVzc2FnZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBlcmZvcm1BcGlDYWxsKGJ1dHRvbjogQnV0dG9uLCBkYXRhOiBhbnksIGRlZmF1bHRTdWNjZXNzTWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRhdGFTZXJ2aWNlLkNhbGxBcGkoYnV0dG9uLmFjdGlvbiwgZGF0YSkuc3Vic2NyaWJlKChhcGlSZXNwb25zZTogQXBpUmVzcG9uc2UpID0+IHtcclxuICAgICAgaWYgKGFwaVJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KGJ1dHRvbi5hY3Rpb24/LnN1Y2Nlc3NNZXNzYWdlIHx8IGRlZmF1bHRTdWNjZXNzTWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoeyBtZXNzYWdlOiAnc3VjY2VzcycsIGRhdGE6IHRoaXMuZGV0YWlscyB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiRXJyb3I6IFwiICsgYXBpUmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG59O1xyXG5cclxuXHJcblxyXG4iLCI8ZGl2IGNsYXNzPVwiZGlhbG9nLWNvbnRhaW5lclwiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWNvbnRlbnRcIj5cclxuXHJcbiAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiICpuZ0lmPVwiaXNQcm9jZXNzaW5nICYmIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5wcm9ncmVzc0xpbmVcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMFwiPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgIDxoMiBtYXQtZGlhbG9nLXRpdGxlPnt7dGl0bGVBY3Rpb24gfCB0aXRsZWNhc2V9fSB7e2Zvcm1Db25maWc/LnRpdGxlfX08L2gyPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImZvcm1Db25maWcubW9kZT09J3ZpZXcnICYmIGVkaXRCdXR0b24gJiYgdGVzdFZpc2libGUoZGV0YWlscyxlZGl0QnV0dG9uLm5hbWUpXCIgY2xhc3M9XCJjb2wgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgbWF0VG9vbHRpcD1cIkVkaXRcIiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwic2V0TW9kZSgnZWRpdCcpXCIgW2Rpc2FibGVkXT1cInRlc3REaXNhYmxlZChkZXRhaWxzLGVkaXRCdXR0b24ubmFtZSlcIj48bWF0LWljb24+ZWRpdDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImlzUHJvY2Vzc2luZ1wiICpuZ0lmPVwibG9hZEJ5QWN0aW9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgbWF0VG9vbHRpcD1cIlJlZnJlc2hcIiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwibG9hZERhdGEoZm9ybUNvbmZpZy5sb2FkQWN0aW9uLCB0cnVlKVwiPjxtYXQtaWNvbiBjbGFzcz1cInJlZnJlc2hJY29uXCI+Y2FjaGVkPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG1hdC1kaWFsb2ctY29udGVudCBjbGFzcz1cIm1hdC10eXBvZ3JhcGh5IGRpYWxvZy1zY3JvbGwtY29udGVudFwiPlxyXG5cclxuICAgICAgICAgIDxzcGEtYWxlcnQgW2FsZXJ0TWVzc2FnZXNdPVwiZm9ybUNvbmZpZy5hbGVydE1lc3NhZ2VzXCIgW2RhdGFdPVwiZGV0YWlsc1wiPjwvc3BhLWFsZXJ0PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInRpbi1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOjE0cHhcIj5cclxuXHJcbiAgICAgICAgPHAgKm5nSWY9XCJmb3JtQ29uZmlnICYmICFkZXRhaWxzXCI+PGVtPkxvYWRpbmcuLi48L2VtPjwvcD5cclxuXHJcbiAgICAgICAgPHNwYS1mb3JtICpuZ0lmPVwiZm9ybUNvbmZpZyAmJiBkZXRhaWxzXCIgW2ZpbGVzXT1cImZpbGVzXCIgW2RhdGFdPVwiZGV0YWlsc1wiIFtjb25maWddPVwiZm9ybUNvbmZpZ1wiIChpbnB1dENoYW5nZSk9XCJpbnB1dENoYW5nZWQoJGV2ZW50KVwiPjwvc3BhLWZvcm0+XHJcblxyXG48IS0tIFVuaXF1ZSB0byBpdGVybmFsIG5vIHRhYmxlcyAtLT5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG4gIDxtYXQtZGlhbG9nLWFjdGlvbnM+XHJcblxyXG4gICAgPGRpdj5cclxuXHJcbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gW2Rpc2FibGVkXT1cImlzUHJvY2Vzc2luZ1wiIGNvbG9yPVwicHJpbWFyeVwiICpuZ0lmPVwiZm9ybUNvbmZpZy5tb2RlPT0nY3JlYXRlJyAmJiBjcmVhdGVCdXR0b25cIiAoY2xpY2spPVwiY3JlYXRlKClcIiBjZGtGb2N1c0luaXRpYWw+e3tjcmVhdGVCdXR0b24uZGlzcGxheSA/PyAnU3VibWl0J319XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNQcm9jZXNzaW5nXCIgY29sb3I9XCJwcmltYXJ5XCIgKm5nSWY9XCJmb3JtQ29uZmlnLm1vZGU9PSdlZGl0JyAmJiBlZGl0QnV0dG9uXCIgKGNsaWNrKT1cImVkaXQoKVwiIGNka0ZvY3VzSW5pdGlhbD57e2VkaXRCdXR0b24uZGlzcGxheSA/PyAnU3VibWl0J319XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnRuIG9mIGV4dHJhQnV0dG9uc1wiPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCIhc21hbGxTY3JlZW4gJiYgdGVzdFZpc2libGUoZGV0YWlscyxidG4ubmFtZSlcIiBtYXQtc3Ryb2tlZC1idXR0b24gW2Rpc2FibGVkXT1cImlzUHJvY2Vzc2luZyB8fCB0ZXN0RGlzYWJsZWQoZGV0YWlscyxidG4ubmFtZSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzogZ2V0QnV0dG9uQ29sb3IoYnRuLCBkZXRhaWxzKX1cIiAoY2xpY2spPVwiY3VzdG9tKGJ0bilcIiBjZGtGb2N1c0luaXRpYWw+PG1hdC1pY29uIFtuZ1N0eWxlXT1cInsnY29sb3InOiBnZXRCdXR0b25Db2xvcihidG4sIGRldGFpbHMpfVwiPnt7YnRuLmljb24ubmFtZX19PC9tYXQtaWNvbj57e2J0bi5kaXNwbGF5ID8/IGJ0bi5uYW1lIHwgdGl0bGVjYXNlfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBtYXQtZGlhbG9nLWNsb3NlPkNhbmNlbDwvYnV0dG9uPlxyXG5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIiAqbmdJZj1cInNtYWxsU2NyZWVuXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ0biBvZiBleHRyYUJ1dHRvbnNcIj5cclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwidGVzdFZpc2libGUoZGV0YWlscyxidG4ubmFtZSlcIiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBbbWF0VG9vbHRpcF09XCJidG4udGlwID8/IGJ0bi5uYW1lIHwgdGl0bGVjYXNlXCIgW2Rpc2FibGVkXT1cImlzUHJvY2Vzc2luZyB8fCB0ZXN0RGlzYWJsZWQoZGV0YWlscyxidG4ubmFtZSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzogZ2V0QnV0dG9uQ29sb3IoYnRuLCBkZXRhaWxzKX1cIiAoY2xpY2spPVwiY3VzdG9tKGJ0bilcIiBjZGtGb2N1c0luaXRpYWw+PG1hdC1pY29uPnt7YnRuLmljb24ubmFtZX19PC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIG1hdFRvb2x0aXA9XCJEZWxldGVcIiBbZGlzYWJsZWRdPVwiaXNQcm9jZXNzaW5nXCIgc3R5bGU9XCJjb2xvcjogcmVkO1wiIChjbGljayk9XCJkZWxldGUoKVwiICpuZ0lmPVwiZm9ybUNvbmZpZy5tb2RlIT0nY3JlYXRlJyAgJiYgZGVsZXRlQnV0dG9uXCI+PG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG4gIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG5cclxuXHJcbjwvZGl2PlxyXG4iXX0=
246
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsc0RpYWxvZy1pbnRlcm5hbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90aW4tc3BhL3NyYy9saWIvY29tcG9uZW50cy90YWJsZS1pbnRlcm5hbC9kZXRhaWxzRGlhbG9nLWludGVybmFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rpbi1zcGEvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlLWludGVybmFsL2RldGFpbHNEaWFsb2ctaW50ZXJuYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsZUFBZSxFQUFnQixNQUFNLDBCQUEwQixDQUFDO0FBTXpFLE9BQU8sRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUdyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTS9CLE1BQU0sT0FBTyxxQkFBcUI7SUFFaEMsWUFBb0Isa0JBQXNDLEVBQVMsYUFBNEIsRUFBUSxXQUEyQixFQUFTLGNBQThCLEVBQy9KLFNBQThDLEVBQWtDLGFBQWtDLEVBQVUsYUFBNEIsRUFDeEosYUFBNEI7UUFGbEIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUFTLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQVEsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQVMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQy9KLGNBQVMsR0FBVCxTQUFTLENBQXFDO1FBQWtDLGtCQUFhLEdBQWIsYUFBYSxDQUFxQjtRQUFVLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ3hKLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBbUR0QyxnQkFBVyxHQUFHLE1BQU0sQ0FBQztRQUNyQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQVVyQixVQUFLLEdBQVUsRUFBRSxDQUFDO1FBRWxCLGdCQUFXLEdBQXFCLElBQUksT0FBTyxFQUFFLENBQUM7UUFPOUMsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFcEIsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFFcEIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBMUV6Qyw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUF1QixFQUFFLEVBQUU7WUFFNUYsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO2dCQUNsQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTthQUN4QjtpQkFBSztnQkFDSixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQTthQUN6QjtRQUVILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFFTixNQUFNLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNwSSxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUV2QixJQUFJLElBQUksR0FBRyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFFLENBQUM7UUFFdkYsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLFVBQVUsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDbkM7YUFBTTtZQUNMLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM1QixzQkFBc0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FDNUI7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFdEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVuRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEdBQUcsc0JBQXNCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BJLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBRWpDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtJQUV2QixDQUFDO0lBK0JELFFBQVEsQ0FBQyxNQUFjLEVBQUUsTUFBTTtRQUU3QixJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBRS9CLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQXdCLEVBQUUsRUFBRTtnQkFFdEUsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFO29CQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUE7b0JBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO29CQUMzQix5RUFBeUU7b0JBQ3pFLElBQUksTUFBTTt3QkFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDekM7cUJBQ0k7b0JBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDNUQ7WUFFSCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBRUgsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFLO1FBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ25FLENBQUM7SUFHRCxPQUFPLENBQUMsT0FBTztRQUNiLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQTtRQUM5QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUE7SUFDdkIsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFO1lBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFFRCxTQUFTLENBQUMsSUFBWTtRQUNwQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFHLEVBQUUsVUFBa0I7UUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDdkUsQ0FBQztJQUdELFdBQVcsQ0FBQyxHQUFHLEVBQUUsVUFBa0I7UUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUMvRixDQUFDO0lBRUQsY0FBYyxDQUFDLFNBQXNCO1FBQ25DLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUFjLEVBQUUsR0FBRztRQUNoQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2hHLENBQUM7SUFHRCxNQUFNO1FBQ0osSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFHRCxNQUFNLENBQUMsTUFBYztRQUNuQixJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRTtZQUN6QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdEM7YUFBTTtZQUNMLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRU8sdUJBQXVCLENBQUMsTUFBYztRQUU1QyxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLHFCQUFxQixDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBRXRJLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxhQUFhLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ2xDO2lCQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO2dCQUNqRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDcEI7UUFFSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxXQUFXO1FBQ2pCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNqRDtJQUNILENBQUM7SUFHRCxrQkFBa0IsQ0FBQyxVQUFrQjtRQUVuQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUVwQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzlELE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxjQUFjLElBQUksU0FBUyxDQUFDLENBQUM7U0FDdEY7SUFDSCxDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xGLElBQUksZ0JBQWdCLEtBQUssRUFBRSxFQUFFO1lBQzNCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDNUMsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUMxRixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQ25ELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCw0QkFBNEI7UUFDNUIsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTtZQUMzQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO2dCQUM5QixnQkFBZ0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNySCxJQUFJLGdCQUFnQixLQUFLLEVBQUUsRUFBRTtvQkFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDNUMsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7YUFDRjtTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8saUJBQWlCLENBQUMsTUFBYyxFQUFFLElBQVM7UUFDakQsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRTtZQUM3QixNQUFNLFFBQVEsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN0RTtZQUNELFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM5QyxPQUFPLFFBQVEsQ0FBQztTQUNqQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLGFBQWEsQ0FBQyxNQUFjLEVBQUUsSUFBUyxFQUFFLHFCQUE2QjtRQUM1RSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXhELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUNsQixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUN2RSxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7b0JBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO2lCQUNoRTtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1NBQ2hFO0lBQ0gsQ0FBQztJQUVPLGNBQWMsQ0FBQyxNQUFjLEVBQUUsSUFBUyxFQUFFLHFCQUE2QjtRQUM3RSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQXdCLEVBQUUsRUFBRTtZQUNuRixJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsY0FBYyxJQUFJLHFCQUFxQixDQUFDLENBQUM7Z0JBQ2xGLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBQyxHQUFHLFdBQVcsRUFBRSxJQUFJLEVBQUcsSUFBSSxDQUFDLE9BQU8sRUFBQyxFQUFFLENBQUMsQ0FBQzthQUMzRjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzVEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztrSEE1UVUscUJBQXFCLHlLQUdrQyxlQUFlO3NHQUh0RSxxQkFBcUIsMkdDakJsQyxrNUtBeUhBOzJGRHhHYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UsNEJBQTRCOzswQkFPcUIsTUFBTTsyQkFBQyxlQUFlO29HQTZFdkUsV0FBVztzQkFBcEIsTUFBTTs7QUErTFIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5qZWN0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IEZvcm1Db25maWcsIEZpZWxkLCBUYWJsZUNvbmZpZywgQnV0dG9uLCBEZXRhaWxzRGlhbG9nQ29uZmlnLCBBY3Rpb24sIEFwaVJlc3BvbnNlLCBTdGVwQ29uZmlnIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9DbGFzc2VzJztcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tZXNzYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRhU2VydmljZUxpYiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGFsaWIuc2VydmljZSc7XHJcbmltcG9ydCB7IExvYWRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sb2FkZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEJyZWFrcG9pbnRPYnNlcnZlciwgQnJlYWtwb2ludFN0YXRlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XHJcbmltcG9ydCB7IENvcmUsIERldGFpbHNEaWFsb2dQcm9jZXNzb3IgfSBmcm9tICcuLi8uLi9jbGFzc2VzL1RpbkNvcmUnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGlhbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCdXR0b25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYnV0dG9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc3BhLWRldGFpbHNEaWFsb2ctaW50ZXJuYWwnLCAvL3VuaXEgdG8gaW50ZXJuYWxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGV0YWlsc0RpYWxvZy1pbnRlcm5hbC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUtaW50ZXJuYWwuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEZXRhaWxzRGlhbG9nSW50ZXJuYWwgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJyZWFrcG9pbnRPYnNlcnZlcjogQnJlYWtwb2ludE9ic2VydmVyLHByaXZhdGUgbG9hZGVyU2VydmljZTogTG9hZGVyU2VydmljZSxwdWJsaWMgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlTGliLHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxEZXRhaWxzRGlhbG9nSW50ZXJuYWw+LCBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRldGFpbHNDb25maWc6IERldGFpbHNEaWFsb2dDb25maWcsIHByaXZhdGUgYnV0dG9uU2VydmljZTogQnV0dG9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSlcclxuICB7XHJcbiAgICAvLyBkZXRlY3Qgc2NyZWVuIHNpemUgY2hhbmdlc1xyXG4gICAgdGhpcy5icmVha3BvaW50T2JzZXJ2ZXIub2JzZXJ2ZShbXCIobWF4LXdpZHRoOiA2MDBweClcIl0pLnN1YnNjcmliZSgocmVzdWx0OiBCcmVha3BvaW50U3RhdGUpID0+IHtcclxuXHJcbiAgICAgIGlmIChyZXN1bHQubWF0Y2hlcykge1xyXG4gICAgICAgIHRoaXMuc21hbGxTY3JlZW4gPSB0cnVlXHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICB0aGlzLnNtYWxsU2NyZWVuID0gZmFsc2VcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG4gICAgY29uc3QgeyB0YWJsZUNvbmZpZywgdGFibGVDb25maWdzLCBmb3JtQ29uZmlnLCBzdGVwQ29uZmlnLCBidXR0b25zIH0gPSBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yLmluaXRpYWxpemVDb25maWdzKHRoaXMuZGV0YWlsc0NvbmZpZyk7XHJcbiAgICB0aGlzLnRhYmxlQ29uZmlnID0gdGFibGVDb25maWc7XHJcbiAgICB0aGlzLnRhYmxlQ29uZmlncyA9IHRhYmxlQ29uZmlncztcclxuICAgIHRoaXMuZm9ybUNvbmZpZyA9IGZvcm1Db25maWc7XHJcbiAgICB0aGlzLnN0ZXBDb25maWcgPSBzdGVwQ29uZmlnO1xyXG4gICAgdGhpcy5idXR0b25zID0gYnV0dG9ucztcclxuXHJcbiAgICBsZXQgcmVzcCA9IERldGFpbHNEaWFsb2dQcm9jZXNzb3IuaGFuZGxlRm9ybU1vZGUodGhpcy5kZXRhaWxzQ29uZmlnLCB0aGlzLmZvcm1Db25maWcsKTtcclxuXHJcbiAgICBpZiAocmVzcC5sb2FkQnlBY3Rpb24pIHtcclxuICAgICAgdGhpcy5sb2FkQnlBY3Rpb24gPSB0cnVlO1xyXG4gICAgICBmb3JtQ29uZmlnLmxvYWRBY3Rpb24gPSByZXNwLmFjdGlvbjtcclxuICAgICAgdGhpcy5sb2FkRGF0YShyZXNwLmFjdGlvbiwgZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kZXRhaWxzID0gcmVzcC5kZXRhaWxzO1xyXG4gICAgICBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yLnNldEhlcm9WYWx1ZSh0aGlzLmRldGFpbHNDb25maWcsIHRoaXMuZGV0YWlscyk7XHJcbiAgICAgIHRoaXMubG9hZEJ5QWN0aW9uID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNMb2FkQ29tcGxldGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmlsZUZpZWxkID0gRGV0YWlsc0RpYWxvZ1Byb2Nlc3Nvci5zZXRGaWxlRmllbGQodGhpcy5mb3JtQ29uZmlnKTtcclxuXHJcbiAgICB0aGlzLmxvYWRlclNlcnZpY2UuaXNMb2FkaW5nLnN1YnNjcmliZSh4ID0+IHRoaXMuaXNQcm9jZXNzaW5nID0geCk7XHJcblxyXG4gICAgY29uc3QgeyBleHRyYUJ1dHRvbnMsIGNyZWF0ZUJ1dHRvbiwgZWRpdEJ1dHRvbiwgZGVsZXRlQnV0dG9uIH0gPSBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yLnNldHVwQnV0dG9ucyh0aGlzLmZvcm1Db25maWcsIHRoaXMuYnV0dG9ucyk7XHJcbiAgICB0aGlzLmV4dHJhQnV0dG9ucyA9IGV4dHJhQnV0dG9ucztcclxuICAgIHRoaXMuY3JlYXRlQnV0dG9uID0gY3JlYXRlQnV0dG9uO1xyXG4gICAgdGhpcy5lZGl0QnV0dG9uID0gZWRpdEJ1dHRvbjtcclxuICAgIHRoaXMuZGVsZXRlQnV0dG9uID0gZGVsZXRlQnV0dG9uO1xyXG5cclxuICAgIHRoaXMuc2V0VGl0bGVBY3Rpb24oKVxyXG5cclxuICB9XHJcblxyXG5cclxuICB0aXRsZUFjdGlvbiA9IFwiVmlld1wiO1xyXG4gIGxvYWRCeUFjdGlvbiA9IGZhbHNlO1xyXG5cclxuICBleHRyYUJ1dHRvbnM6IEJ1dHRvbltdO1xyXG4gIGJ1dHRvbnM6IEJ1dHRvbltdO1xyXG4gIGNyZWF0ZUJ1dHRvbjogQnV0dG9uO1xyXG4gIGVkaXRCdXR0b246IEJ1dHRvbjtcclxuICBkZWxldGVCdXR0b246IEJ1dHRvbjtcclxuXHJcbiAgLy8gbW9kZUJ1dHRvbiA6IEJ1dHRvblxyXG4gIGZpbGVGaWVsZDogRmllbGQ7XHJcbiAgZmlsZXM6IGFueVtdID0gW107XHJcblxyXG4gIHRhYmxlUmVsb2FkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgdGFibGVDb25maWc6IFRhYmxlQ29uZmlnXHJcbiAgdGFibGVDb25maWdzXHJcbiAgZGV0YWlsczogYW55XHJcbiAgZm9ybUNvbmZpZzogRm9ybUNvbmZpZztcclxuICBzdGVwQ29uZmlnOiBTdGVwQ29uZmlnO1xyXG4gIHNtYWxsU2NyZWVuID0gZmFsc2U7XHJcblxyXG4gIGlzTG9hZENvbXBsZXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNQcm9jZXNzaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKSBpbnB1dENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcblxyXG4gIGxvYWREYXRhKGFjdGlvbjogQWN0aW9uLCByZWxvYWQpIHtcclxuXHJcbiAgICBpZiAoYWN0aW9uICYmIHRoaXMubG9hZEJ5QWN0aW9uKSB7XHJcblxyXG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlLkNhbGxBcGkoYWN0aW9uKS5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlOiBBcGlSZXNwb25zZSkgPT4ge1xyXG5cclxuICAgICAgICBpZiAoYXBpUmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgdGhpcy5kZXRhaWxzID0gYXBpUmVzcG9uc2UuZGF0YVxyXG4gICAgICAgICAgdGhpcy5pc0xvYWRDb21wbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgICAvLyBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yLnNldEhlcm9WYWx1ZSh0aGlzLmRldGFpbHNDb25maWcsIHRoaXMuZGV0YWlscyk7XHJcbiAgICAgICAgICBpZiAocmVsb2FkKSB0aGlzLnRhYmxlUmVsb2FkLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIkVycm9yOiBcIiArIGFwaVJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGlucHV0Q2hhbmdlZChldmVudCkge1xyXG4gICAgdGhpcy5pbnB1dENoYW5nZS5lbWl0KHsgZmllbGQ6IGV2ZW50LmZpZWxkLCB2YWx1ZTogZXZlbnQudmFsdWUgfSlcclxuICB9XHJcblxyXG5cclxuICBzZXRNb2RlKG5ld01vZGUpIHtcclxuICAgIHRoaXMuZm9ybUNvbmZpZy5tb2RlID0gbmV3TW9kZVxyXG4gICAgdGhpcy5zZXRUaXRsZUFjdGlvbigpXHJcbiAgfVxyXG5cclxuICBzZXRUaXRsZUFjdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmZvcm1Db25maWcuZml4ZWRUaXRsZSkge1xyXG4gICAgICB0aGlzLnRpdGxlQWN0aW9uID0gXCJcIjtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGl0bGVBY3Rpb24gPSB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0VGl0bGVBY3Rpb24odGhpcy5mb3JtQ29uZmlnLm1vZGUsIHRoaXMuYnV0dG9ucyk7XHJcbiAgfVxyXG5cclxuICBnZXRCdXR0b24obmFtZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5idXR0b25TZXJ2aWNlLmdldEJ1dHRvbih0aGlzLmJ1dHRvbnMsIG5hbWUpO1xyXG4gIH1cclxuXHJcbiAgdGVzdERpc2FibGVkKHJvdywgYnV0dG9uTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbihidXR0b25OYW1lKTtcclxuICAgIHJldHVybiBidXR0b24gPyB0aGlzLmJ1dHRvblNlcnZpY2UudGVzdERpc2FibGVkKGJ1dHRvbiwgcm93KSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIHRlc3RWaXNpYmxlKHJvdywgYnV0dG9uTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbihidXR0b25OYW1lKTtcclxuICAgIHJldHVybiBidXR0b24gPyB0aGlzLmJ1dHRvblNlcnZpY2UuaXNCdXR0b25WaXNpYmxlKGJ1dHRvbiwgcm93LCB0aGlzLmlzTG9hZENvbXBsZXRlKSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdGVzdFZpc2libGVUYWIodGJsQ29uZmlnOiBUYWJsZUNvbmZpZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uU2VydmljZS5pc1RhYlZpc2libGUodGJsQ29uZmlnKTtcclxuICB9XHJcblxyXG4gIGdldEJ1dHRvbkNvbG9yKGJ1dHRvbjogQnV0dG9uLCByb3cpIHtcclxuICAgIHJldHVybiB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0QnV0dG9uQ29sb3IoYnV0dG9uLCByb3cpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VmlzaWJsZUZpZWxkcygpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWcuZmllbGRzPy5maWx0ZXIoeCA9PiBDb3JlLnRlc3RWaXNpYmxlKHRoaXMuZm9ybUNvbmZpZywgdGhpcy5kZXRhaWxzLCB4KSlcclxuICB9XHJcblxyXG5cclxuICBjcmVhdGUoKSB7XHJcbiAgICB0aGlzLmhhbmRsZUJ1dHRvbkFjdGlvbignY3JlYXRlJyk7XHJcbiAgfVxyXG5cclxuICBlZGl0KCkge1xyXG4gICAgdGhpcy5oYW5kbGVCdXR0b25BY3Rpb24oJ2VkaXQnKTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZSgpIHtcclxuICAgIHRoaXMuaGFuZGxlQnV0dG9uQWN0aW9uKCdkZWxldGUnKTtcclxuICB9XHJcblxyXG5cclxuICBjdXN0b20oYnV0dG9uOiBCdXR0b24pIHtcclxuICAgIGlmIChidXR0b24uZGlhbG9nICYmIGJ1dHRvbi5kZXRhaWxzQ29uZmlnKSB7XHJcbiAgICAgIHRoaXMub3Blbk5lc3RlZERldGFpbHNEaWFsb2coYnV0dG9uKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlQnV0dG9uQWN0aW9uKGJ1dHRvbi5uYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3Blbk5lc3RlZERldGFpbHNEaWFsb2coYnV0dG9uOiBCdXR0b24pOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbkNvbmZpZ3VyZWREZXRhaWxzRGlhbG9nKGJ1dHRvbi5uYW1lLCB0aGlzLmRldGFpbHMsIHRoaXMuZGV0YWlsc0NvbmZpZywgRGV0YWlsc0RpYWxvZ0ludGVybmFsKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuXHJcbiAgICAgIGlmIChyZXN1bHQuYWN0aW9uID09PSAnaW5wdXRDaGFuZ2UnKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dENoYW5nZWQocmVzdWx0LmNoYW5nZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICYmIHJlc3VsdC5tZXNzYWdlID09PSAnc3VjY2VzcycpIHtcclxuICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaERhdGEoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtQ29uZmlnLmxvYWRBY3Rpb24pIHtcclxuICAgICAgdGhpcy5sb2FkRGF0YSh0aGlzLmZvcm1Db25maWcubG9hZEFjdGlvbiwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgaGFuZGxlQnV0dG9uQWN0aW9uKGJ1dHRvbk5hbWU6IHN0cmluZykge1xyXG5cclxuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKGJ1dHRvbk5hbWUpO1xyXG4gICAgaWYgKCFidXR0b24pIHJldHVybjtcclxuXHJcbiAgICBpZiAoIWJ1dHRvbi5hY3Rpb24pIHtcclxuICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoeyBtZXNzYWdlOiAnZW1pdCcsIGRhdGE6IHRoaXMuZGV0YWlscyB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnZhbGlkYXRlRm9ybSgpKSB7XHJcbiAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbihidXR0b24sIHRoaXMuZGV0YWlscywgYnV0dG9uLmFjdGlvbj8uc3VjY2Vzc01lc3NhZ2UgfHwgXCJVcGRhdGVkXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2YWxpZGF0ZUZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdmFsaWRhdGlvblJlc3VsdCA9IENvcmUudmFsaWRhdGVPYmplY3QodGhpcy5nZXRWaXNpYmxlRmllbGRzKCksIHRoaXMuZGV0YWlscyk7XHJcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdCAhPT0gJycpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdCh2YWxpZGF0aW9uUmVzdWx0KTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpbGVzLmxlbmd0aCA8IDEgJiYgdGhpcy5maWxlRmllbGQ/LnJlcXVpcmVkICYmIHRoaXMuZm9ybUNvbmZpZy5tb2RlID09PSAnY3JlYXRlJykge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiUGxlYXNlIGF0dGFjaCBmaWxlKHMpXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVmFsaWRhdGUgY29tcG9zaXRlIGZpZWxkc1xyXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiB0aGlzLmdldFZpc2libGVGaWVsZHMoKSkge1xyXG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2NvbXBvc2l0ZScpIHtcclxuICAgICAgICB2YWxpZGF0aW9uUmVzdWx0ID0gQ29yZS52YWxpZGF0ZU9iamVjdChDb3JlLmdldFZpc2libGVTdWJmaWVsZHModGhpcy5mb3JtQ29uZmlnLCB0aGlzLmRldGFpbHMsIGZpZWxkKSwgdGhpcy5kZXRhaWxzKTtcclxuICAgICAgICBpZiAodmFsaWRhdGlvblJlc3VsdCAhPT0gJycpIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QodmFsaWRhdGlvblJlc3VsdCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZXBhcmVBY3Rpb25EYXRhKGJ1dHRvbjogQnV0dG9uLCBkYXRhOiBhbnkpOiBhbnkge1xyXG4gICAgaWYgKGJ1dHRvbi5hY3Rpb24/LmlzRm9ybURhdGEpIHtcclxuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGB1cGxvYWRGaWxlJHtpfWAsIHRoaXMuZmlsZXNbaV0sIHRoaXMuZmlsZXNbaV0ubmFtZSk7XHJcbiAgICAgIH1cclxuICAgICAgZm9ybURhdGEuYXBwZW5kKFwiZGF0YVwiLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgIHJldHVybiBmb3JtRGF0YTtcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBleGVjdXRlQWN0aW9uKGJ1dHRvbjogQnV0dG9uLCBkYXRhOiBhbnksIGRlZmF1bHRTdWNjZXNzTWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBhY3Rpb25EYXRhID0gdGhpcy5wcmVwYXJlQWN0aW9uRGF0YShidXR0b24sIGRhdGEpO1xyXG5cclxuICAgIGlmIChidXR0b24uY29uZmlybSkge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmNvbmZpcm0oYnV0dG9uLmNvbmZpcm0ubWVzc2FnZSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0ID09PSBcInllc1wiKSB7XHJcbiAgICAgICAgICB0aGlzLnBlcmZvcm1BcGlDYWxsKGJ1dHRvbiwgYWN0aW9uRGF0YSwgZGVmYXVsdFN1Y2Nlc3NNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wZXJmb3JtQXBpQ2FsbChidXR0b24sIGFjdGlvbkRhdGEsIGRlZmF1bHRTdWNjZXNzTWVzc2FnZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBlcmZvcm1BcGlDYWxsKGJ1dHRvbjogQnV0dG9uLCBkYXRhOiBhbnksIGRlZmF1bHRTdWNjZXNzTWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRhdGFTZXJ2aWNlLkNhbGxBcGkoYnV0dG9uLmFjdGlvbiwgZGF0YSkuc3Vic2NyaWJlKChhcGlSZXNwb25zZTogQXBpUmVzcG9uc2UpID0+IHtcclxuICAgICAgaWYgKGFwaVJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KGJ1dHRvbi5hY3Rpb24/LnN1Y2Nlc3NNZXNzYWdlIHx8IGRlZmF1bHRTdWNjZXNzTWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoeyBtZXNzYWdlOiAnc3VjY2VzcycsIGRhdGE6IHsuLi5hcGlSZXNwb25zZSwgZGF0YSA6IHRoaXMuZGV0YWlsc30gfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIkVycm9yOiBcIiArIGFwaVJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxufTtcclxuXHJcblxyXG5cclxuIiwiPGRpdiBjbGFzcz1cImRpYWxvZy1jb250YWluZXJcIj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImRpYWxvZy1jb250ZW50XCI+XHJcblxyXG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAqbmdJZj1cImlzUHJvY2Vzc2luZyAmJiBkYXRhU2VydmljZS5hcHBDb25maWcucHJvZ3Jlc3NMaW5lXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG10LTBcIj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICA8aDIgbWF0LWRpYWxvZy10aXRsZT57e3RpdGxlQWN0aW9uIHwgdGl0bGVjYXNlfX0ge3tmb3JtQ29uZmlnPy50aXRsZX19PC9oMj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJmb3JtQ29uZmlnLm1vZGU9PSd2aWV3JyAmJiBlZGl0QnV0dG9uICYmIHRlc3RWaXNpYmxlKGRldGFpbHMsZWRpdEJ1dHRvbi5uYW1lKVwiIGNsYXNzPVwiY29sIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIG1hdFRvb2x0aXA9XCJFZGl0XCIgY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cInNldE1vZGUoJ2VkaXQnKVwiIFtkaXNhYmxlZF09XCJ0ZXN0RGlzYWJsZWQoZGV0YWlscyxlZGl0QnV0dG9uLm5hbWUpXCI+PG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc1Byb2Nlc3NpbmdcIiAqbmdJZj1cImxvYWRCeUFjdGlvblwiIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIG1hdFRvb2x0aXA9XCJSZWZyZXNoXCIgY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImxvYWREYXRhKGZvcm1Db25maWcubG9hZEFjdGlvbiwgdHJ1ZSlcIj48bWF0LWljb24gY2xhc3M9XCJyZWZyZXNoSWNvblwiPmNhY2hlZDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQgY2xhc3M9XCJtYXQtdHlwb2dyYXBoeSBkaWFsb2ctc2Nyb2xsLWNvbnRlbnRcIj5cclxuXHJcbiAgICAgIDxzcGEtc3RlcHMgKm5nSWY9XCJzdGVwQ29uZmlnICYmIGRldGFpbHNcIiBbY29uZmlnXT1cInN0ZXBDb25maWdcIiBbZGF0YV09XCJkZXRhaWxzXCI+PC9zcGEtc3RlcHM+XHJcblxyXG4gICAgICA8c3BhLWFsZXJ0IFthbGVydE1lc3NhZ2VzXT1cImZvcm1Db25maWcuYWxlcnRNZXNzYWdlc1wiIFtkYXRhXT1cImRldGFpbHNcIj48L3NwYS1hbGVydD5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0aW4taW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZToxNHB4XCI+XHJcblxyXG4gICAgICAgIDxwICpuZ0lmPVwiZm9ybUNvbmZpZyAmJiAhZGV0YWlsc1wiPjxlbT5Mb2FkaW5nLi4uPC9lbT48L3A+XHJcblxyXG4gICAgICAgIDxzcGEtZm9ybSAqbmdJZj1cImZvcm1Db25maWcgJiYgZGV0YWlsc1wiIFtmaWxlc109XCJmaWxlc1wiIFtkYXRhXT1cImRldGFpbHNcIiBbY29uZmlnXT1cImZvcm1Db25maWdcIiAoaW5wdXRDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKCRldmVudClcIj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZHluYW1pY1NlbGVjdCBsZXQtZmllbGQ9XCJmaWVsZFwiIGxldC1kYXRhPVwiZGF0YVwiIGxldC10ZXN0UmVhZE9ubHk9XCJ0ZXN0UmVhZE9ubHlcIiBsZXQtc2VsZWN0Q2hhbmdlZD1cInNlbGVjdENoYW5nZWRcIj5cclxuICAgICAgICAgICAgPHNwYS1zZWxlY3QtaW50ZXJuYWxcclxuICAgICAgICAgICAgICBbZGlzcGxheV09XCJmaWVsZC5hbGlhcyA/PyBmaWVsZC5uYW1lIHwgY2FtZWxUb1dvcmRzXCJcclxuICAgICAgICAgICAgICBbd2lkdGhdPVwiZmllbGQud2lkdGhcIlxyXG4gICAgICAgICAgICAgIFtudWxsYWJsZV09XCJmaWVsZC5udWxsYWJsZVwiXHJcbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZmllbGQub3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgW21hc3Rlck9wdGlvbnNdPVwiZmllbGQubWFzdGVyT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgW29wdGlvbkRpc3BsYXldPVwiZmllbGQub3B0aW9uRGlzcGxheSA/PyAnbmFtZSdcIlxyXG4gICAgICAgICAgICAgIFtvcHRpb25WYWx1ZV09XCJmaWVsZC5vcHRpb25WYWx1ZSA/PyAndmFsdWUnXCJcclxuICAgICAgICAgICAgICBbKHZhbHVlKV09XCJkYXRhW2ZpZWxkLm5hbWVdXCJcclxuICAgICAgICAgICAgICBbZGVmYXVsdEZpcnN0VmFsdWVdPVwiZmllbGQuZGVmYXVsdEZpcnN0VmFsdWVcIlxyXG4gICAgICAgICAgICAgIFtyZWFkb25seV09XCJ0ZXN0UmVhZE9ubHkoZmllbGQpXCJcclxuICAgICAgICAgICAgICBbaGludF09XCJmaWVsZC5oaW50XCJcclxuICAgICAgICAgICAgICBbcGVla0NvbmZpZ109XCJmaWVsZC5wZWVrQ29uZmlnXCJcclxuICAgICAgICAgICAgICBbbG9hZEFjdGlvbl09XCJmaWVsZC5sb2FkQWN0aW9uXCJcclxuICAgICAgICAgICAgICBbaW5mb01lc3NhZ2VdPVwiZmllbGQuaW5mb01lc3NhZ2VcIlxyXG4gICAgICAgICAgICAgIFtjb3B5Q29udGVudF09XCJmaWVsZC5jb3B5Q29udGVudFwiXHJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInNlbGVjdENoYW5nZWQoZmllbGQpXCJcclxuICAgICAgICAgICAgPjwvc3BhLXNlbGVjdC1pbnRlcm5hbD5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9zcGEtZm9ybT5cclxuXHJcblxyXG4gICAgICAgIDxtYXQtdGFiLWdyb3VwICpuZ0lmPVwidGFibGVDb25maWdzXCI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGJsIG9mIHRhYmxlQ29uZmlnc1wiPlxyXG5cclxuICAgICAgICAgICAgPG1hdC10YWIgKm5nSWY9XCJ0ZXN0VmlzaWJsZVRhYih0YmwpXCI+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdFRhYkxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+e3t0YmwudGl0bGUgPz8gJ1VudGl0bGVkJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDxzcGEtdGFibGUtbGl0ZSBbY29uZmlnXT1cInRibFwiIFtoaWRlVGl0bGVdPVwidHJ1ZVwiIFtyZWxvYWRdPVwidGFibGVSZWxvYWRcIiAoZGF0YUxvYWQpPVwibG9hZERhdGEoZm9ybUNvbmZpZy5sb2FkQWN0aW9uLCBmYWxzZSlcIj48L3NwYS10YWJsZS1saXRlPlxyXG5cclxuICAgICAgICAgICAgPC9tYXQtdGFiPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8L21hdC10YWItZ3JvdXA+XHJcblxyXG5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG4gIDxtYXQtZGlhbG9nLWFjdGlvbnMgPlxyXG5cclxuICAgIDxkaXY+XHJcblxyXG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIFtkaXNhYmxlZF09XCJpc1Byb2Nlc3NpbmdcIiBjb2xvcj1cInByaW1hcnlcIiAqbmdJZj1cImZvcm1Db25maWcubW9kZT09J2NyZWF0ZScgJiYgY3JlYXRlQnV0dG9uXCIgKGNsaWNrKT1cImNyZWF0ZSgpXCIgY2RrRm9jdXNJbml0aWFsPnt7Y3JlYXRlQnV0dG9uLmRpc3BsYXkgPz8gJ1N1Ym1pdCd9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gW2Rpc2FibGVkXT1cImlzUHJvY2Vzc2luZ1wiIGNvbG9yPVwicHJpbWFyeVwiICpuZ0lmPVwiZm9ybUNvbmZpZy5tb2RlPT0nZWRpdCcgJiYgZWRpdEJ1dHRvblwiIChjbGljayk9XCJlZGl0KClcIiBjZGtGb2N1c0luaXRpYWw+e3tlZGl0QnV0dG9uLmRpc3BsYXkgPz8gJ1N1Ym1pdCd9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ0biBvZiBleHRyYUJ1dHRvbnNcIj5cclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXNtYWxsU2NyZWVuICYmIHRlc3RWaXNpYmxlKGRldGFpbHMsYnRuLm5hbWUpXCIgbWF0LXN0cm9rZWQtYnV0dG9uIFtkaXNhYmxlZF09XCJpc1Byb2Nlc3NpbmcgfHwgdGVzdERpc2FibGVkKGRldGFpbHMsYnRuLm5hbWUpXCIgW25nU3R5bGVdPVwieydjb2xvcic6IGdldEJ1dHRvbkNvbG9yKGJ0biwgZGV0YWlscyl9XCIgKGNsaWNrKT1cImN1c3RvbShidG4pXCIgY2RrRm9jdXNJbml0aWFsPjxtYXQtaWNvbiBbbmdTdHlsZV09XCJ7J2NvbG9yJzogZ2V0QnV0dG9uQ29sb3IoYnRuLCBkZXRhaWxzKX1cIj57e2J0bi5pY29uLm5hbWV9fTwvbWF0LWljb24+e3tidG4uZGlzcGxheSA/PyBidG4ubmFtZSB8IHRpdGxlY2FzZX19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgbWF0LWRpYWxvZy1jbG9zZT5DYW5jZWw8L2J1dHRvbj5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCIgKm5nSWY9XCJzbWFsbFNjcmVlblwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBidG4gb2YgZXh0cmFCdXR0b25zXCI+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInRlc3RWaXNpYmxlKGRldGFpbHMsYnRuLm5hbWUpXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgW21hdFRvb2x0aXBdPVwiYnRuLnRpcCA/PyBidG4ubmFtZSB8IHRpdGxlY2FzZVwiIFtkaXNhYmxlZF09XCJpc1Byb2Nlc3NpbmcgfHwgdGVzdERpc2FibGVkKGRldGFpbHMsYnRuLm5hbWUpXCIgW25nU3R5bGVdPVwieydjb2xvcic6IGdldEJ1dHRvbkNvbG9yKGJ0biwgZGV0YWlscyl9XCIgKGNsaWNrKT1cImN1c3RvbShidG4pXCIgY2RrRm9jdXNJbml0aWFsPjxtYXQtaWNvbj57e2J0bi5pY29uLm5hbWV9fTwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBtYXRUb29sdGlwPVwiRGVsZXRlXCIgW2Rpc2FibGVkXT1cImlzUHJvY2Vzc2luZ1wiIHN0eWxlPVwiY29sb3I6IHJlZDtcIiAoY2xpY2spPVwiZGVsZXRlKClcIiAqbmdJZj1cImZvcm1Db25maWcubW9kZSE9J2NyZWF0ZScgICYmIGRlbGV0ZUJ1dHRvblwiPjxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG5cclxuICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cclxuXHJcblxyXG48L2Rpdj5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIl19