@rangertechnologies/ngnxt 2.1.248 → 2.1.249

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 (77) hide show
  1. package/esm2022/environments/version.mjs +2 -2
  2. package/esm2022/lib/components/button/nxt-button.component.mjs +2 -2
  3. package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +4 -2
  4. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +8 -6
  5. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +3 -3
  6. package/esm2022/lib/components/datatable/datatable.component.mjs +6 -7
  7. package/esm2022/lib/components/file-upload/file-upload.component.mjs +9 -9
  8. package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +26 -14
  9. package/esm2022/lib/components/pick-location/pick-location.component.mjs +5 -4
  10. package/esm2022/lib/components/search-box/search-box.component.mjs +10 -8
  11. package/esm2022/lib/nxt-app.module.mjs +4 -4
  12. package/esm2022/lib/pages/booklet/booklet.component.mjs +28 -56
  13. package/esm2022/lib/pages/builder/element/element.component.mjs +62 -10
  14. package/esm2022/lib/pages/builder/form/form.component.mjs +6 -3
  15. package/esm2022/lib/pages/builder/properties/properties.component.mjs +96 -15
  16. package/esm2022/lib/pages/builder/templates/templates.component.mjs +2 -2
  17. package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +2 -2
  18. package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +3 -3
  19. package/esm2022/lib/pages/questionbook/questionbook.component.mjs +12 -31
  20. package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +12 -8
  21. package/esm2022/lib/pipe/custom-translate.pipe.mjs +16 -10
  22. package/esm2022/lib/services/change/change.service.mjs +46 -0
  23. package/esm2022/lib/services/country/country.service.mjs +135 -0
  24. package/esm2022/lib/services/data/data.service.mjs +100 -0
  25. package/esm2022/lib/services/form-builder/form-builder.service.mjs +485 -0
  26. package/esm2022/lib/services/pdf-designer/pdf-designer.service.mjs +398 -0
  27. package/esm2022/lib/services/salesforce/salesforce.service.mjs +41 -0
  28. package/esm2022/lib/services/shared/shared.service.mjs +100 -0
  29. package/esm2022/lib/services/storage/storage.service.mjs +59 -0
  30. package/esm2022/lib/services/template/template.service.mjs +351 -0
  31. package/esm2022/lib/services/translation/translation.service.mjs +110 -0
  32. package/esm2022/public-api.mjs +2 -2
  33. package/fesm2022/rangertechnologies-ngnxt.mjs +1050 -813
  34. package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
  35. package/lib/components/button/nxt-button.component.d.ts +1 -1
  36. package/lib/components/custom-calendar/custom-calendar.component.d.ts +1 -1
  37. package/lib/components/custom-dropdown/custom-dropdown.component.d.ts +2 -2
  38. package/lib/components/custom-radio/custom-radio.component.d.ts +2 -2
  39. package/lib/components/datatable/datatable.component.d.ts +3 -3
  40. package/lib/components/file-upload/file-upload.component.d.ts +2 -2
  41. package/lib/components/nxt-input/nxt-input.component.d.ts +2 -2
  42. package/lib/components/search-box/search-box.component.d.ts +4 -4
  43. package/lib/nxt-app.module.d.ts +1 -1
  44. package/lib/pages/booklet/booklet.component.d.ts +9 -9
  45. package/lib/pages/builder/element/element.component.d.ts +10 -4
  46. package/lib/pages/builder/form/form.component.d.ts +2 -1
  47. package/lib/pages/builder/properties/properties.component.d.ts +8 -6
  48. package/lib/pages/builder/templates/templates.component.d.ts +1 -1
  49. package/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.d.ts +1 -1
  50. package/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.d.ts +2 -2
  51. package/lib/pages/questionbook/questionbook.component.d.ts +6 -8
  52. package/lib/pages/questionnaire/questionnaire.component.d.ts +6 -5
  53. package/lib/pipe/custom-translate.pipe.d.ts +2 -3
  54. package/lib/services/{form-builder.service.d.ts → form-builder/form-builder.service.d.ts} +2 -1
  55. package/lib/services/{pdf-designer.service.d.ts → pdf-designer/pdf-designer.service.d.ts} +1 -1
  56. package/lib/services/{storage.service.d.ts → storage/storage.service.d.ts} +2 -2
  57. package/lib/services/{translation.service.d.ts → translation/translation.service.d.ts} +11 -1
  58. package/package.json +1 -1
  59. package/public-api.d.ts +1 -1
  60. package/rangertechnologies-ngnxt-2.1.249.tgz +0 -0
  61. package/esm2022/lib/services/change.service.mjs +0 -46
  62. package/esm2022/lib/services/country.service.mjs +0 -135
  63. package/esm2022/lib/services/data.service.mjs +0 -100
  64. package/esm2022/lib/services/form-builder.service.mjs +0 -402
  65. package/esm2022/lib/services/pdf-designer.service.mjs +0 -398
  66. package/esm2022/lib/services/salesforce.service.mjs +0 -41
  67. package/esm2022/lib/services/shared.service.mjs +0 -100
  68. package/esm2022/lib/services/storage.service.mjs +0 -59
  69. package/esm2022/lib/services/template.service.mjs +0 -351
  70. package/esm2022/lib/services/translation.service.mjs +0 -61
  71. package/rangertechnologies-ngnxt-2.1.248.tgz +0 -0
  72. /package/lib/services/{change.service.d.ts → change/change.service.d.ts} +0 -0
  73. /package/lib/services/{country.service.d.ts → country/country.service.d.ts} +0 -0
  74. /package/lib/services/{data.service.d.ts → data/data.service.d.ts} +0 -0
  75. /package/lib/services/{salesforce.service.d.ts → salesforce/salesforce.service.d.ts} +0 -0
  76. /package/lib/services/{shared.service.d.ts → shared/shared.service.d.ts} +0 -0
  77. /package/lib/services/{template.service.d.ts → template/template.service.d.ts} +0 -0
@@ -2,14 +2,16 @@ import { Component, Input, Output, EventEmitter, ViewChild, } from "@angular/cor
2
2
  import { QuestionbookComponent } from "../questionbook/questionbook.component";
3
3
  import { CommonModule } from "@angular/common";
4
4
  import { FormsModule } from "@angular/forms";
5
+ import { NxtCustomTranslatePipe } from "../../pipe/custom-translate.pipe";
5
6
  import * as i0 from "@angular/core";
6
- import * as i1 from "../../services/salesforce.service";
7
- import * as i2 from "../../services/data.service";
8
- import * as i3 from "../../services/storage.service";
7
+ import * as i1 from "../../services/salesforce/salesforce.service";
8
+ import * as i2 from "../../services/data/data.service";
9
+ import * as i3 from "../../services/storage/storage.service";
9
10
  import * as i4 from "@angular/platform-browser";
10
- import * as i5 from "../../services/change.service";
11
+ import * as i5 from "../../services/change/change.service";
11
12
  import * as i6 from "@angular/common/http";
12
- import * as i7 from "@angular/common";
13
+ import * as i7 from "../../services/translation/translation.service";
14
+ import * as i8 from "@angular/common";
13
15
  export class BookletComponent {
14
16
  sfService;
15
17
  dataService;
@@ -17,6 +19,7 @@ export class BookletComponent {
17
19
  sanitizer;
18
20
  changeService;
19
21
  http;
22
+ translationService;
20
23
  bookletId;
21
24
  serv;
22
25
  tkn;
@@ -27,11 +30,12 @@ export class BookletComponent {
27
30
  dropdownDependentData;
28
31
  labelValue;
29
32
  token;
30
- languageCode; // VD 11Jun24 - translation changes
33
+ languageCode = 'en'; // VD 11Jun24 - translation changes
31
34
  fieldRestrictions; // VD 12Jun24 - field permission change
32
35
  from; // Form Builder dependent change
33
36
  apiUrl; // AP-16APR25 Input property to receive the API URL from the parent component
34
37
  isEdit; // AP-19MAY25 - Added isEdit input
38
+ direction = 'ltr';
35
39
  handleBookletActionEvent = new EventEmitter();
36
40
  handlePage = new EventEmitter();
37
41
  hadleDropDownDependent = new EventEmitter();
@@ -43,25 +47,23 @@ export class BookletComponent {
43
47
  abItem = {};
44
48
  actions = [];
45
49
  bookQuestionsMap = new Map();
46
- translateMap = new Map(); // VD 11Jun24 - translation changes
47
50
  sqOptions = new Map();
48
51
  isAnswerFlag = false;
49
52
  spinnerName;
50
53
  spinnerType;
51
- // HA 19DEC23 langDirection variable is created to assign the direction as class
52
- langDirection = 'ltr'; // HA 28DEC23 making ltr as default direction
53
54
  answerList = []; // HA 11-JAN-24 Answerlist to store the minimal value
54
55
  dataBind; // HA 18-JAN-24 To insert the endpoint value to the question
55
56
  allEvents = []; // VD 06Sep24 calendar changes
56
57
  //AP-19MAY25 - Accessing the QuestionbookComponent instance using ViewChild reference
57
58
  questionbookComponent;
58
- constructor(sfService, dataService, storageService, sanitizer, changeService, http) {
59
+ constructor(sfService, dataService, storageService, sanitizer, changeService, http, translationService) {
59
60
  this.sfService = sfService;
60
61
  this.dataService = dataService;
61
62
  this.storageService = storageService;
62
63
  this.sanitizer = sanitizer;
63
64
  this.changeService = changeService;
64
65
  this.http = http;
66
+ this.translationService = translationService;
65
67
  this.spinnerName = "sp1";
66
68
  this.spinnerType = "ball-spin-clockwise";
67
69
  }
@@ -70,6 +72,8 @@ export class BookletComponent {
70
72
  //AP-16APR25 // Get the dynamic API URL and pass it to the service method
71
73
  let apidata = this.apiUrl;
72
74
  this.dataService.apikey(apidata);
75
+ this.translationService.setLanguage(this.languageCode);
76
+ this.translationService.updateTranslations(this.bookletJSON.translationMap);
73
77
  }
74
78
  // VD NOV23 - update the json data when bookletId and bookletJSON changes
75
79
  ngOnChanges(simplechanges) {
@@ -88,6 +92,10 @@ export class BookletComponent {
88
92
  if (this.questionbookComponent) {
89
93
  this.questionbookComponent.processData();
90
94
  }
95
+ this.translationService.updateTranslations(this.bookletJSON.translationMap);
96
+ }
97
+ if (this.languageCode) {
98
+ this.translationService.setLanguage(this.languageCode);
91
99
  }
92
100
  }
93
101
  // AP-28MAY25 - Converts old action string (JSON) into a new model (array of action objects)
@@ -119,6 +127,7 @@ export class BookletComponent {
119
127
  }
120
128
  }
121
129
  else if (this.bookletJSON) {
130
+ this.translationService.updateTranslations(this.bookletJSON.translationMap);
122
131
  // Try to pass a value from Backend to differentiate the QuestionBook Read and AnswerBook Read
123
132
  this.isAnswerFlag = true;
124
133
  if (this.bookletJSON != null && this.bookletJSON != undefined && this.bookletJSON?.bookQuestionsMap) {
@@ -158,10 +167,6 @@ export class BookletComponent {
158
167
  value = this.bookletJSON?.records[0]?.id;
159
168
  this.bookQuestionsMap.set(value, this.bookletJSON?.questionbook);
160
169
  }
161
- // VD 20Jun24 - translation changes
162
- for (var value in this.bookletJSON?.translationMap) {
163
- this.translateMap.set(value, this.bookletJSON?.translationMap[value]);
164
- }
165
170
  // AP 23MAY25 - supports both stringified and object formats
166
171
  if (this.bookletJSON?.questionbook?.action != undefined && this.bookletJSON?.questionbook?.action != '') {
167
172
  this.actions = typeof this.bookletJSON?.questionbook.action === 'string'
@@ -169,16 +174,6 @@ export class BookletComponent {
169
174
  : this.bookletJSON?.questionbook.action;
170
175
  }
171
176
  }
172
- // HA 19DEC23 langDirection variable value assigning
173
- // RS 09DEC24 Changed keys
174
- if (this.bookletJSON?.questionbook?.style) {
175
- var style = typeof this.bookletJSON?.questionbook?.style === 'object' ? this.bookletJSON?.questionbook?.style : JSON.parse(this.bookletJSON?.questionbook?.style);
176
- this.langDirection = style?.direction;
177
- }
178
- else if (this.bookletJSON?.records && this.bookletJSON?.records[0]?.style) {
179
- var style = typeof this.bookletJSON?.records[0]?.style === 'object' ? this.bookletJSON?.records[0]?.style : JSON.parse(this.bookletJSON?.records[0]?.style);
180
- this.langDirection = style?.direction;
181
- }
182
177
  // HA 18-JAN-24 The condition is used for Bind-In Logic
183
178
  this.handleCompleteBooklet(this.bookletJSON);
184
179
  this.booklet = this.bookletJSON?.records;
@@ -220,10 +215,6 @@ export class BookletComponent {
220
215
  for (var value in response.bookQuestionsMap) {
221
216
  this.bookQuestionsMap.set(value, response.bookQuestionsMap[value]);
222
217
  }
223
- // VD 11Jun24 - translation changes
224
- for (var value in response.translationMap) {
225
- this.translateMap.set(value, response.translationMap[value]);
226
- }
227
218
  // VD 31NOV24 wrapper changes
228
219
  if (response.questionbook?.action != undefined) {
229
220
  this.actions = typeof response.questionbook?.action === 'string'
@@ -231,15 +222,6 @@ export class BookletComponent {
231
222
  : response.questionbook?.action;
232
223
  }
233
224
  }
234
- // HA 19DEC23 langDirection variable value assigning
235
- if (response?.questionbook?.style) {
236
- var style = typeof response?.questionbook?.style === 'object' ? response?.questionbook?.style : JSON.parse(response?.questionbook?.style);
237
- this.langDirection = style?.direction;
238
- }
239
- else if (response?.records[0]?.style) {
240
- var style = typeof response?.records[0]?.style === 'object' ? response?.records[0]?.style : JSON.parse(response?.records[0]?.style);
241
- this.langDirection = style?.direction;
242
- }
243
225
  };
244
226
  failureReadBooklet = (response) => {
245
227
  };
@@ -583,19 +565,6 @@ export class BookletComponent {
583
565
  }
584
566
  return questions;
585
567
  }
586
- // VD 11Jun24 - translation changes
587
- readTransQuestions(qbId) {
588
- let record = [];
589
- let translateRecord = this.translateMap.get(qbId);
590
- if (translateRecord && translateRecord.length > 0) {
591
- translateRecord.forEach(lanRec => {
592
- if (lanRec.languageCode == this.languageCode) {
593
- record = lanRec.fields;
594
- }
595
- });
596
- }
597
- return record;
598
- }
599
568
  getText(value) {
600
569
  var doc = new DOMParser().parseFromString(value, "text/html");
601
570
  return this.sanitizer.bypassSecurityTrustHtml(doc.documentElement.textContent);
@@ -614,17 +583,18 @@ export class BookletComponent {
614
583
  editChangeClick(action) {
615
584
  this.isEdit = true;
616
585
  }
617
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BookletComponent, deps: [{ token: i1.SalesforceService }, { token: i2.DataService }, { token: i3.StorageService }, { token: i4.DomSanitizer }, { token: i5.ChangeService }, { token: i6.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
618
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: BookletComponent, isStandalone: true, selector: "lib-booklet", inputs: { bookletId: "bookletId", serv: "serv", tkn: "tkn", bookletJSON: "bookletJSON", allIcons: "allIcons", themeColor: "themeColor", cdnIconURL: "cdnIconURL", dropdownDependentData: "dropdownDependentData", labelValue: "labelValue", token: "token", languageCode: "languageCode", fieldRestrictions: "fieldRestrictions", from: "from", apiUrl: "apiUrl", isEdit: "isEdit", dataBind: "dataBind" }, outputs: { handleBookletActionEvent: "handleBookletActionEvent", handlePage: "handlePage", hadleDropDownDependent: "hadleDropDownDependent", handleCalendarDate: "handleCalendarDate", handleCalendarEvent: "handleCalendarEvent" }, viewQueries: [{ propertyName: "questionbookComponent", first: true, predicate: ["questionbook"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Booklet Handling-->\n<!-- HA 19DEC23 For Direction -->\n<div *ngFor=\"let qb of booklet\" [ngClass]=\"langDirection\">\n <!-- MR Commented below code to ensure single JSON for UNCONDITIONAL Booklets -->\n <!-- RS 09DEC24 Changed keys-->\n <!-- <lib-questionnaire [serv]=\"serv\" [qbId]=\"qb.id\" [tkn]=\"tkn\"></lib-questionnaire> -->\n <!-- HA 28DEC23 Below If logic is to load from booklet -->\n <div *ngIf=\"qb.subQuestions; else elseBlock\">\n <div *ngFor=\"let ques of qb.subQuestions\" class=\"questiondiv1\">\n <div>\n <!-- HA 17JAN24 - Is title is enabled so that based on the boolean div will be visible -->\n <div *ngIf=\"ques.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(ques?.questionText)\" *ngIf=\"ques?.questionText && ques?.style?.showLabel !== false\" >\n {{ ques?.questionText }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!--VD 11Jun24 - translation changes-->\n <!--VD 06Sep24 calendar changes-->\n <!-- AP-14MAY25 - Added [dataBind] input binding -->\n <!-- AP-19MAY25 - Added [isEdit] binding --> \n <!-- //MSM10JUL25 allIcons, themeColor, cdnIconURL added for icon-selector-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\"\n [labelValue]=\"labelValue\"\n [questionItem]=\"ques\"\n [translatedQuestions]=\"readTransQuestions(qb.id)\"\n [questions]=\"readQuestions(qb.id)\"\n (handleDropDown)=\"getDropDown($event)\"\n (handleCalendarDate)=\"getCalendarDate($event)\"\n (handleCalendarEvent)=\"getCalendarEvent($event)\"\n (singleFieldChangeEmit) ='singleFieldChange($event)'\n [dataBind]=\"dataBind\"\n [isEdit]=\"isEdit\" \n [allIcons]=\"allIcons\"\n [themeColor]=\"themeColor\"\n [cdnIconURL]=\"cdnIconURL\"\n ></lib-questionbook>\n </div>\n </div>\n </div>\n <!-- HA 28DEC23 Below else logic is to load from books or questions -->\n <ng-template #elseBlock>\n <div class=\"questiondiv1\">\n <div>\n <div *ngIf=\"!qb.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(qb?.questionText)\" *ngIf=\"qb?.questionText && qb?.style?.showLabel !== false\" >\n {{ qb?.questionText }}\n {{ qb?.title }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!-- // VD 11Jun24 - translation changes-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" [labelValue]=\"labelValue\" [questionItem]=\"qb\" [translatedQuestions]=\"readTransQuestions(qb.id)\" [questions]=\"readQuestions(qb.id)\" (handleDropDown)=\"getDropDown($event)\"></lib-questionbook>\n </div>\n </div>\n </ng-template>\n\n <!-- RS 09DEC24 Changed keys-->\n <!-- Group Actions -->\n <!-- HA 19DEC23 For Direction -->\n <!-- AP 23MAY25 - Action Buttons: Dynamically positioned buttons with JSON-configured styles -->\n <div class=\"align-submit-row\" *ngIf=\"abItem?.status != 'Completed'\" [ngClass]=\"langDirection\"> <!-- position-relative removed in this tag-->\n <ng-container *ngFor=\"let action of actions; let i = index\">\n <div class=\"action-wrapper\"\n [style.width.px]=\"action.width || 100\"\n style=\"margin-right: 10px;\"> <!-- style=\"position: absolute; [style.left.%]=\"action.positionPercent || 0\" removed in this tag -->\n @if(!isEdit && action.name === 'Save'){\n <button \n (click)=\"editChangeClick(action)\" \n class=\"btn btn-primary fc-button nxtButton action-btn\"\n [style.--btn-bg]=\"action.bgColor\"\n [style.background-color]=\"action.bgColor || ''\"\n [style.color]=\"action.textColor || ''\"\n [style.border-radius.px]=\"action.borderRadius || 4\"\n style=\"width: 100%;\">\n Edit\n </button>\n }\n @else {\n <button \n (click)=\"handleBookletActionClick(action)\" \n class=\"btn btn-primary fc-button nxtButton action-btn\"\n [style.--btn-bg]=\"action.bgColor\"\n [style.background-color]=\"action.bgColor || ''\"\n [style.color]=\"action.textColor || ''\"\n [style.border-radius.px]=\"action.borderRadius || 4\"\n style=\"width: 100%;\">\n {{ action.name }}\n </button>\n }\n </div>\n </ng-container>\n </div>\n</div>", styles: [".align-submit-row{display:flex}.header-style{padding:15px;background:#f8f8f8;color:#898989;border:1px solid #e8e8e8;border-top-left-radius:5px;border-top-right-radius:5px;margin-left:0;justify-content:left;font-size:15px}.rtl{flex-direction:row-reverse}.action-btn{width:100%;height:40px;transition:all .3s ease}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: QuestionbookComponent, selector: "lib-questionbook", inputs: ["qbItem", "questionItem", "translatedQuestions", "questions", "errorFieldId", "labelValue", "token", "isEdit", "dropDownData", "dataBind", "allIcons", "themeColor", "cdnIconURL"], outputs: ["handleDropDown", "handleQuestion", "singleFieldChangeEmit", "hadleDropDownDependent", "handleCalendarDate", "handleCalendarEvent"] }] });
586
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BookletComponent, deps: [{ token: i1.SalesforceService }, { token: i2.DataService }, { token: i3.StorageService }, { token: i4.DomSanitizer }, { token: i5.ChangeService }, { token: i6.HttpClient }, { token: i7.TranslationService }], target: i0.ɵɵFactoryTarget.Component });
587
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: BookletComponent, isStandalone: true, selector: "lib-booklet", inputs: { bookletId: "bookletId", serv: "serv", tkn: "tkn", bookletJSON: "bookletJSON", allIcons: "allIcons", themeColor: "themeColor", cdnIconURL: "cdnIconURL", dropdownDependentData: "dropdownDependentData", labelValue: "labelValue", token: "token", languageCode: "languageCode", fieldRestrictions: "fieldRestrictions", from: "from", apiUrl: "apiUrl", isEdit: "isEdit", direction: "direction", dataBind: "dataBind" }, outputs: { handleBookletActionEvent: "handleBookletActionEvent", handlePage: "handlePage", hadleDropDownDependent: "hadleDropDownDependent", handleCalendarDate: "handleCalendarDate", handleCalendarEvent: "handleCalendarEvent" }, viewQueries: [{ propertyName: "questionbookComponent", first: true, predicate: ["questionbook"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Booklet Handling-->\n<!-- HA 19DEC23 For Direction -->\n<div *ngFor=\"let qb of booklet\" [dir]=\"direction\">\n <!-- MR Commented below code to ensure single JSON for UNCONDITIONAL Booklets -->\n <!-- RS 09DEC24 Changed keys-->\n <!-- <lib-questionnaire [serv]=\"serv\" [qbId]=\"qb.id\" [tkn]=\"tkn\"></lib-questionnaire> -->\n <!-- HA 28DEC23 Below If logic is to load from booklet -->\n <div *ngIf=\"qb.subQuestions; else elseBlock\">\n <div *ngFor=\"let ques of qb.subQuestions\" class=\"questiondiv1\">\n <div>\n <!-- HA 17JAN24 - Is title is enabled so that based on the boolean div will be visible -->\n <div *ngIf=\"ques.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(ques?.questionText)\" *ngIf=\"ques?.questionText && ques?.style?.showLabel !== false\" >\n {{ (ques.id+'.questionText') | nxtCustomTranslate : ques?.questionText }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!--VD 11Jun24 - translation changes-->\n <!--VD 06Sep24 calendar changes-->\n <!-- AP-14MAY25 - Added [dataBind] input binding -->\n <!-- AP-19MAY25 - Added [isEdit] binding --> \n <!-- //MSM10JUL25 allIcons, themeColor, cdnIconURL added for icon-selector-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\"\n [direction] = \"direction\"\n [labelValue]=\"labelValue\"\n [questionItem]=\"ques\"\n [questions]=\"readQuestions(qb.id)\"\n (handleDropDown)=\"getDropDown($event)\"\n (handleCalendarDate)=\"getCalendarDate($event)\"\n (handleCalendarEvent)=\"getCalendarEvent($event)\"\n (singleFieldChangeEmit) ='singleFieldChange($event)'\n [dataBind]=\"dataBind\"\n [isEdit]=\"isEdit\" \n [allIcons]=\"allIcons\"\n [themeColor]=\"themeColor\"\n [cdnIconURL]=\"cdnIconURL\"\n ></lib-questionbook>\n </div>\n </div>\n </div>\n <!-- HA 28DEC23 Below else logic is to load from books or questions -->\n <ng-template #elseBlock>\n <div class=\"questiondiv1\">\n <div>\n <div *ngIf=\"!qb.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(qb?.questionText)\" *ngIf=\"qb?.questionText && qb?.style?.showLabel !== false\" >\n {{ (qb.id+'.questionText') | nxtCustomTranslate : qb?.questionText}}\n {{ qb?.title }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!-- // VD 11Jun24 - translation changes-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" [labelValue]=\"labelValue\" [questionItem]=\"qb\" [questions]=\"readQuestions(qb.id)\" (handleDropDown)=\"getDropDown($event)\"></lib-questionbook>\n </div>\n </div>\n </ng-template>\n\n <!-- RS 09DEC24 Changed keys-->\n <!-- Group Actions -->\n <!-- HA 19DEC23 For Direction -->\n <!-- AP 23MAY25 - Action Buttons: Dynamically positioned buttons with JSON-configured styles -->\n <div class=\"align-submit-row\" *ngIf=\"abItem?.status != 'Completed'\" [dir]=\"direction\"> <!-- position-relative removed in this tag-->\n <ng-container *ngFor=\"let action of actions; let i = index\">\n <div class=\"action-wrapper\"\n [style.width.px]=\"action.width || 100\"\n style=\"margin-right: 10px;\"> <!-- style=\"position: absolute; [style.left.%]=\"action.positionPercent || 0\" removed in this tag -->\n @if(!isEdit && action.name === 'Save'){\n <button \n (click)=\"editChangeClick(action)\" \n class=\"btn btn-primary fc-button nxtButton action-btn\"\n [style.--btn-bg]=\"action.bgColor\"\n [style.background-color]=\"action.bgColor || ''\"\n [style.color]=\"action.textColor || ''\"\n [style.border-radius.px]=\"action.borderRadius || 4\"\n style=\"width: 100%;\">\n Edit\n </button>\n }\n @else {\n <button \n (click)=\"handleBookletActionClick(action)\" \n class=\"btn btn-primary fc-button nxtButton action-btn\"\n [style.--btn-bg]=\"action.bgColor\"\n [style.background-color]=\"action.bgColor || ''\"\n [style.color]=\"action.textColor || ''\"\n [style.border-radius.px]=\"action.borderRadius || 4\"\n style=\"width: 100%;\">\n {{ (action.id+'.name') | nxtCustomTranslate : action?.name}}\n </button>\n }\n </div>\n </ng-container>\n </div>\n</div>", styles: [".align-submit-row{display:flex}.header-style{padding:15px;background:#f8f8f8;color:#898989;border:1px solid #e8e8e8;border-top-left-radius:5px;border-top-right-radius:5px;margin-left:0;justify-content:left;font-size:15px}.rtl{flex-direction:row-reverse}.action-btn{width:100%;height:40px;transition:all .3s ease}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: QuestionbookComponent, selector: "lib-questionbook", inputs: ["qbItem", "questionItem", "questions", "errorFieldId", "labelValue", "token", "isEdit", "dropDownData", "dataBind", "allIcons", "themeColor", "cdnIconURL", "direction"], outputs: ["handleDropDown", "handleQuestion", "singleFieldChangeEmit", "hadleDropDownDependent", "handleCalendarDate", "handleCalendarEvent"] }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }] });
619
588
  }
620
589
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BookletComponent, decorators: [{
621
590
  type: Component,
622
591
  args: [{ selector: 'lib-booklet', standalone: true, imports: [
623
592
  CommonModule,
624
593
  FormsModule,
625
- QuestionbookComponent
626
- ], template: "<!-- Booklet Handling-->\n<!-- HA 19DEC23 For Direction -->\n<div *ngFor=\"let qb of booklet\" [ngClass]=\"langDirection\">\n <!-- MR Commented below code to ensure single JSON for UNCONDITIONAL Booklets -->\n <!-- RS 09DEC24 Changed keys-->\n <!-- <lib-questionnaire [serv]=\"serv\" [qbId]=\"qb.id\" [tkn]=\"tkn\"></lib-questionnaire> -->\n <!-- HA 28DEC23 Below If logic is to load from booklet -->\n <div *ngIf=\"qb.subQuestions; else elseBlock\">\n <div *ngFor=\"let ques of qb.subQuestions\" class=\"questiondiv1\">\n <div>\n <!-- HA 17JAN24 - Is title is enabled so that based on the boolean div will be visible -->\n <div *ngIf=\"ques.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(ques?.questionText)\" *ngIf=\"ques?.questionText && ques?.style?.showLabel !== false\" >\n {{ ques?.questionText }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!--VD 11Jun24 - translation changes-->\n <!--VD 06Sep24 calendar changes-->\n <!-- AP-14MAY25 - Added [dataBind] input binding -->\n <!-- AP-19MAY25 - Added [isEdit] binding --> \n <!-- //MSM10JUL25 allIcons, themeColor, cdnIconURL added for icon-selector-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\"\n [labelValue]=\"labelValue\"\n [questionItem]=\"ques\"\n [translatedQuestions]=\"readTransQuestions(qb.id)\"\n [questions]=\"readQuestions(qb.id)\"\n (handleDropDown)=\"getDropDown($event)\"\n (handleCalendarDate)=\"getCalendarDate($event)\"\n (handleCalendarEvent)=\"getCalendarEvent($event)\"\n (singleFieldChangeEmit) ='singleFieldChange($event)'\n [dataBind]=\"dataBind\"\n [isEdit]=\"isEdit\" \n [allIcons]=\"allIcons\"\n [themeColor]=\"themeColor\"\n [cdnIconURL]=\"cdnIconURL\"\n ></lib-questionbook>\n </div>\n </div>\n </div>\n <!-- HA 28DEC23 Below else logic is to load from books or questions -->\n <ng-template #elseBlock>\n <div class=\"questiondiv1\">\n <div>\n <div *ngIf=\"!qb.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(qb?.questionText)\" *ngIf=\"qb?.questionText && qb?.style?.showLabel !== false\" >\n {{ qb?.questionText }}\n {{ qb?.title }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!-- // VD 11Jun24 - translation changes-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" [labelValue]=\"labelValue\" [questionItem]=\"qb\" [translatedQuestions]=\"readTransQuestions(qb.id)\" [questions]=\"readQuestions(qb.id)\" (handleDropDown)=\"getDropDown($event)\"></lib-questionbook>\n </div>\n </div>\n </ng-template>\n\n <!-- RS 09DEC24 Changed keys-->\n <!-- Group Actions -->\n <!-- HA 19DEC23 For Direction -->\n <!-- AP 23MAY25 - Action Buttons: Dynamically positioned buttons with JSON-configured styles -->\n <div class=\"align-submit-row\" *ngIf=\"abItem?.status != 'Completed'\" [ngClass]=\"langDirection\"> <!-- position-relative removed in this tag-->\n <ng-container *ngFor=\"let action of actions; let i = index\">\n <div class=\"action-wrapper\"\n [style.width.px]=\"action.width || 100\"\n style=\"margin-right: 10px;\"> <!-- style=\"position: absolute; [style.left.%]=\"action.positionPercent || 0\" removed in this tag -->\n @if(!isEdit && action.name === 'Save'){\n <button \n (click)=\"editChangeClick(action)\" \n class=\"btn btn-primary fc-button nxtButton action-btn\"\n [style.--btn-bg]=\"action.bgColor\"\n [style.background-color]=\"action.bgColor || ''\"\n [style.color]=\"action.textColor || ''\"\n [style.border-radius.px]=\"action.borderRadius || 4\"\n style=\"width: 100%;\">\n Edit\n </button>\n }\n @else {\n <button \n (click)=\"handleBookletActionClick(action)\" \n class=\"btn btn-primary fc-button nxtButton action-btn\"\n [style.--btn-bg]=\"action.bgColor\"\n [style.background-color]=\"action.bgColor || ''\"\n [style.color]=\"action.textColor || ''\"\n [style.border-radius.px]=\"action.borderRadius || 4\"\n style=\"width: 100%;\">\n {{ action.name }}\n </button>\n }\n </div>\n </ng-container>\n </div>\n</div>", styles: [".align-submit-row{display:flex}.header-style{padding:15px;background:#f8f8f8;color:#898989;border:1px solid #e8e8e8;border-top-left-radius:5px;border-top-right-radius:5px;margin-left:0;justify-content:left;font-size:15px}.rtl{flex-direction:row-reverse}.action-btn{width:100%;height:40px;transition:all .3s ease}\n"] }]
627
- }], ctorParameters: () => [{ type: i1.SalesforceService }, { type: i2.DataService }, { type: i3.StorageService }, { type: i4.DomSanitizer }, { type: i5.ChangeService }, { type: i6.HttpClient }], propDecorators: { bookletId: [{
594
+ QuestionbookComponent,
595
+ NxtCustomTranslatePipe
596
+ ], template: "<!-- Booklet Handling-->\n<!-- HA 19DEC23 For Direction -->\n<div *ngFor=\"let qb of booklet\" [dir]=\"direction\">\n <!-- MR Commented below code to ensure single JSON for UNCONDITIONAL Booklets -->\n <!-- RS 09DEC24 Changed keys-->\n <!-- <lib-questionnaire [serv]=\"serv\" [qbId]=\"qb.id\" [tkn]=\"tkn\"></lib-questionnaire> -->\n <!-- HA 28DEC23 Below If logic is to load from booklet -->\n <div *ngIf=\"qb.subQuestions; else elseBlock\">\n <div *ngFor=\"let ques of qb.subQuestions\" class=\"questiondiv1\">\n <div>\n <!-- HA 17JAN24 - Is title is enabled so that based on the boolean div will be visible -->\n <div *ngIf=\"ques.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(ques?.questionText)\" *ngIf=\"ques?.questionText && ques?.style?.showLabel !== false\" >\n {{ (ques.id+'.questionText') | nxtCustomTranslate : ques?.questionText }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!--VD 11Jun24 - translation changes-->\n <!--VD 06Sep24 calendar changes-->\n <!-- AP-14MAY25 - Added [dataBind] input binding -->\n <!-- AP-19MAY25 - Added [isEdit] binding --> \n <!-- //MSM10JUL25 allIcons, themeColor, cdnIconURL added for icon-selector-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\"\n [direction] = \"direction\"\n [labelValue]=\"labelValue\"\n [questionItem]=\"ques\"\n [questions]=\"readQuestions(qb.id)\"\n (handleDropDown)=\"getDropDown($event)\"\n (handleCalendarDate)=\"getCalendarDate($event)\"\n (handleCalendarEvent)=\"getCalendarEvent($event)\"\n (singleFieldChangeEmit) ='singleFieldChange($event)'\n [dataBind]=\"dataBind\"\n [isEdit]=\"isEdit\" \n [allIcons]=\"allIcons\"\n [themeColor]=\"themeColor\"\n [cdnIconURL]=\"cdnIconURL\"\n ></lib-questionbook>\n </div>\n </div>\n </div>\n <!-- HA 28DEC23 Below else logic is to load from books or questions -->\n <ng-template #elseBlock>\n <div class=\"questiondiv1\">\n <div>\n <div *ngIf=\"!qb.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(qb?.questionText)\" *ngIf=\"qb?.questionText && qb?.style?.showLabel !== false\" >\n {{ (qb.id+'.questionText') | nxtCustomTranslate : qb?.questionText}}\n {{ qb?.title }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!-- // VD 11Jun24 - translation changes-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" [labelValue]=\"labelValue\" [questionItem]=\"qb\" [questions]=\"readQuestions(qb.id)\" (handleDropDown)=\"getDropDown($event)\"></lib-questionbook>\n </div>\n </div>\n </ng-template>\n\n <!-- RS 09DEC24 Changed keys-->\n <!-- Group Actions -->\n <!-- HA 19DEC23 For Direction -->\n <!-- AP 23MAY25 - Action Buttons: Dynamically positioned buttons with JSON-configured styles -->\n <div class=\"align-submit-row\" *ngIf=\"abItem?.status != 'Completed'\" [dir]=\"direction\"> <!-- position-relative removed in this tag-->\n <ng-container *ngFor=\"let action of actions; let i = index\">\n <div class=\"action-wrapper\"\n [style.width.px]=\"action.width || 100\"\n style=\"margin-right: 10px;\"> <!-- style=\"position: absolute; [style.left.%]=\"action.positionPercent || 0\" removed in this tag -->\n @if(!isEdit && action.name === 'Save'){\n <button \n (click)=\"editChangeClick(action)\" \n class=\"btn btn-primary fc-button nxtButton action-btn\"\n [style.--btn-bg]=\"action.bgColor\"\n [style.background-color]=\"action.bgColor || ''\"\n [style.color]=\"action.textColor || ''\"\n [style.border-radius.px]=\"action.borderRadius || 4\"\n style=\"width: 100%;\">\n Edit\n </button>\n }\n @else {\n <button \n (click)=\"handleBookletActionClick(action)\" \n class=\"btn btn-primary fc-button nxtButton action-btn\"\n [style.--btn-bg]=\"action.bgColor\"\n [style.background-color]=\"action.bgColor || ''\"\n [style.color]=\"action.textColor || ''\"\n [style.border-radius.px]=\"action.borderRadius || 4\"\n style=\"width: 100%;\">\n {{ (action.id+'.name') | nxtCustomTranslate : action?.name}}\n </button>\n }\n </div>\n </ng-container>\n </div>\n</div>", styles: [".align-submit-row{display:flex}.header-style{padding:15px;background:#f8f8f8;color:#898989;border:1px solid #e8e8e8;border-top-left-radius:5px;border-top-right-radius:5px;margin-left:0;justify-content:left;font-size:15px}.rtl{flex-direction:row-reverse}.action-btn{width:100%;height:40px;transition:all .3s ease}\n"] }]
597
+ }], ctorParameters: () => [{ type: i1.SalesforceService }, { type: i2.DataService }, { type: i3.StorageService }, { type: i4.DomSanitizer }, { type: i5.ChangeService }, { type: i6.HttpClient }, { type: i7.TranslationService }], propDecorators: { bookletId: [{
628
598
  type: Input
629
599
  }], serv: [{
630
600
  type: Input
@@ -654,6 +624,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
654
624
  type: Input
655
625
  }], isEdit: [{
656
626
  type: Input
627
+ }], direction: [{
628
+ type: Input
657
629
  }], handleBookletActionEvent: [{
658
630
  type: Output
659
631
  }], handlePage: [{
@@ -670,4 +642,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
670
642
  type: ViewChild,
671
643
  args: ['questionbook']
672
644
  }] } });
673
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va2xldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYm9va2xldC9ib29rbGV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9ib29rbGV0L2Jvb2tsZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFJVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFJWixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFZdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7O0FBYTdDLE1BQU0sT0FBTyxnQkFBZ0I7SUE0Q2pCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQWhERCxTQUFTLENBQVM7SUFDbEIsSUFBSSxDQUFTO0lBQ2IsR0FBRyxDQUFTO0lBQ1osV0FBVyxDQUFNO0lBQ2pCLFFBQVEsQ0FBTSxDQUFDLDBDQUEwQztJQUN6RCxVQUFVLENBQVMsQ0FBQywwQ0FBMEM7SUFDOUQsVUFBVSxDQUFTLENBQUMsMENBQTBDO0lBQzlELHFCQUFxQixDQUFNO0lBQzNCLFVBQVUsQ0FBUztJQUNuQixLQUFLLENBQVM7SUFDZCxZQUFZLENBQVMsQ0FBRSxtQ0FBbUM7SUFDMUQsaUJBQWlCLENBQU0sQ0FBQyx1Q0FBdUM7SUFDL0QsSUFBSSxDQUFNLENBQUMsZ0NBQWdDO0lBQzNDLE1BQU0sQ0FBTSxDQUFDLDZFQUE2RTtJQUMxRixNQUFNLENBQVcsQ0FBQyxrQ0FBa0M7SUFFbkQsd0JBQXdCLEdBQXNCLElBQUksWUFBWSxFQUFF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UUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUE7SUFDcEIsQ0FBQzt3R0FybkJVLGdCQUFnQjs0RkFBaEIsZ0JBQWdCLG8wQkN2QzdCLG93S0EyRk0sbVhEM0RGLFlBQVksNlZBQ1osV0FBVywrQkFDWCxxQkFBcUI7OzRGQUtaLGdCQUFnQjtrQkFYNUIsU0FBUzsrQkFDRSxhQUFhLGNBQ1gsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxxQkFBcUI7cUJBQ3RCOzZOQUtRLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFFSSx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBRUcsa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFnQkUsUUFBUTtzQkFBaEIsS0FBSztnQkFHcUIscUJBQXFCO3NCQUEvQyxTQUFTO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIEVsZW1lbnRSZWYsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFNhbGVzZm9yY2VTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3NhbGVzZm9yY2Uuc2VydmljZVwiO1xuaW1wb3J0IHsgRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFBhcmFtcyB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tIFwiQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlclwiO1xuaW1wb3J0IHsgQWN0aW9uTWV0YSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYWN0aW9uTWV0YSc7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi8uLi93cmFwcGVyXCI7XG5pbXBvcnQgeyBCb29rbGV0V3JhcHBlciB9IGZyb20gXCIuLi8uLi9tb2RlbC9ib29rbGV0V3JhcHBlclwiO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhbmdlU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9jaGFuZ2Uuc2VydmljZVwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBRdWVzdGlvbmJvb2tDb21wb25lbnQgfSBmcm9tIFwiLi4vcXVlc3Rpb25ib29rL3F1ZXN0aW9uYm9vay5jb21wb25lbnRcIjtcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1ib29rbGV0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBRdWVzdGlvbmJvb2tDb21wb25lbnRcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jvb2tsZXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ib29rbGV0LmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBCb29rbGV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgYm9va2xldElkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNlcnY6IHN0cmluZztcbiAgQElucHV0KCkgdGtuOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJvb2tsZXRKU09OOiBhbnk7XG4gIEBJbnB1dCgpIGFsbEljb25zOiBhbnk7IC8vTVNNMTBKVUwyNSBpY29uIHNlbGVjdG9yIGNvbXBvbmVudCBpbnB1dFxuICBASW5wdXQoKSB0aGVtZUNvbG9yOiBzdHJpbmc7IC8vTVNNMTBKVUwyNSBpY29uIHNlbGVjdG9yIGNvbXBvbmVudCBpbnB1dFxuICBASW5wdXQoKSBjZG5JY29uVVJMOiBzdHJpbmc7IC8vTVNNMTBKVUwyNSBpY29uIHNlbGVjdG9yIGNvbXBvbmVudCBpbnB1dFxuICBASW5wdXQoKSBkcm9wZG93bkRlcGVuZGVudERhdGE6IGFueTtcbiAgQElucHV0KCkgbGFiZWxWYWx1ZTogc3RyaW5nO1xuICBASW5wdXQoKSB0b2tlbjogc3RyaW5nO1xuICBASW5wdXQoKSBsYW5ndWFnZUNvZGU6IHN0cmluZzsgIC8vIFZEIDExSnVuMjQgLSB0cmFuc2xhdGlvbiBjaGFuZ2VzXG4gIEBJbnB1dCgpIGZpZWxkUmVzdHJpY3Rpb25zOiBhbnk7IC8vIFZEIDEySnVuMjQgLSBmaWVsZCBwZXJtaXNzaW9uIGNoYW5nZVxuICBASW5wdXQoKSBmcm9tOiBhbnk7IC8vIEZvcm0gQnVpbGRlciBkZXBlbmRlbnQgY2hhbmdlXG4gIEBJbnB1dCgpIGFwaVVybDogYW55OyAvLyBBUC0xNkFQUjI1IElucHV0IHByb3BlcnR5IHRvIHJlY2VpdmUgdGhlIEFQSSBVUkwgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudFxuICBASW5wdXQoKSBpc0VkaXQ6IGJvb2xlYW4gOyAvLyBBUC0xOU1BWTI1IC0gQWRkZWQgaXNFZGl0IGlucHV0XG5cbiAgQE91dHB1dCgpIGhhbmRsZUJvb2tsZXRBY3Rpb25FdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBoYW5kbGVQYWdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGhhZGxlRHJvcERvd25EZXBlbmRlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvLyBWRCAwNlNlcDI0IGNhbGVuZGFyIGNoYW5nZXNcbiAgQE91dHB1dCgpIGhhbmRsZUNhbGVuZGFyRGF0ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBoYW5kbGVDYWxlbmRhckV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgbnh0Qm9va2xldDogQm9va2xldFdyYXBwZXI7XG5cbiAgcHVibGljIGJvb2tsZXQ6IGFueVtdID0gW107XG4gIHB1YmxpYyBhYkl0ZW06IGFueSA9IHt9O1xuICBwdWJsaWMgYWN0aW9uczogQWN0aW9uTWV0YVtdID0gW107XG4gIHB1YmxpYyBib29rUXVlc3Rpb25zTWFwOiBhbnkgPSBuZXcgTWFwKCk7XG4gIHB1YmxpYyB0cmFuc2xhdGVNYXA6IGFueSA9IG5ldyBNYXAoKTsgIC8vIFZEIDExSnVuMjQgLSB0cmFuc2xhdGlvbiBjaGFuZ2VzXG4gIHByaXZhdGUgc3FPcHRpb25zOiBhbnkgPSBuZXcgTWFwKCk7XG4gIHB1YmxpYyBpc0Fuc3dlckZsYWc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHNwaW5uZXJOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBzcGlubmVyVHlwZTogc3RyaW5nO1xuICAvLyBIQSAxOURFQzIzIGxhbmdEaXJlY3Rpb24gdmFyaWFibGUgaXMgY3JlYXRlZCB0byBhc3NpZ24gdGhlIGRpcmVjdGlvbiBhcyBjbGFzc1xuICBsYW5nRGlyZWN0aW9uID0gJ2x0cic7IC8vIEhBIDI4REVDMjMgbWFraW5nIGx0ciBhcyBkZWZhdWx0IGRpcmVjdGlvblxuICBhbnN3ZXJMaXN0ID0gW107IC8vIEhBIDExLUpBTi0yNCBBbnN3ZXJsaXN0IHRvIHN0b3JlIHRoZSBtaW5pbWFsIHZhbHVlXG4gIEBJbnB1dCgpIGRhdGFCaW5kOiBhbnk7Ly8gSEEgMTgtSkFOLTI0IFRvIGluc2VydCB0aGUgZW5kcG9pbnQgdmFsdWUgdG8gdGhlIHF1ZXN0aW9uXG4gIGFsbEV2ZW50czogYW55W10gPSBbXTsgIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlc1xuICAvL0FQLTE5TUFZMjUgLSBBY2Nlc3NpbmcgdGhlIFF1ZXN0aW9uYm9va0NvbXBvbmVudCBpbnN0YW5jZSB1c2luZyBWaWV3Q2hpbGQgcmVmZXJlbmNlXG4gIEBWaWV3Q2hpbGQoJ3F1ZXN0aW9uYm9vaycpIHF1ZXN0aW9uYm9va0NvbXBvbmVudCE6IFF1ZXN0aW9uYm9va0NvbXBvbmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNmU2VydmljZTogU2FsZXNmb3JjZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIGNoYW5nZVNlcnZpY2U6IENoYW5nZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50XG4gICkge1xuICAgIHRoaXMuc3Bpbm5lck5hbWUgPSBcInNwMVwiO1xuICAgIHRoaXMuc3Bpbm5lclR5cGUgPSBcImJhbGwtc3Bpbi1jbG9ja3dpc2VcIjtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMucHJvY2Vzc0Jvb2tsZXQoKTtcbiAgICAvL0FQLTE2QVBSMjUgLy8gR2V0IHRoZSBkeW5hbWljIEFQSSBVUkwgYW5kIHBhc3MgaXQgdG8gdGhlIHNlcnZpY2UgbWV0aG9kXG4gICAgbGV0IGFwaWRhdGEgPSAgdGhpcy5hcGlVcmw7XG4gICAgdGhpcy5kYXRhU2VydmljZS5hcGlrZXkoYXBpZGF0YSk7XG4gIH1cbiAgLy8gVkQgTk9WMjMgLSB1cGRhdGUgdGhlIGpzb24gZGF0YSB3aGVuIGJvb2tsZXRJZCBhbmQgYm9va2xldEpTT04gY2hhbmdlc1xuICBuZ09uQ2hhbmdlcyhzaW1wbGVjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgLy8gSEEgMjNKQU4yNCBUbyBhdm9pZCB1bmRlZmluZWQgZXJyb3JcbiAgICBpZiAoc2ltcGxlY2hhbmdlc1snYm9va2xldElkJ10gfHwgKHNpbXBsZWNoYW5nZXNbJ2Jvb2tsZXRKU09OJ10gJiYgc2ltcGxlY2hhbmdlc1snYm9va2xldEpTT04nXS5jdXJyZW50VmFsdWUgIT0gbnVsbCkgfHwgKHNpbXBsZWNoYW5nZXNbJ2RhdGFCaW5kJ10gJiYgc2ltcGxlY2hhbmdlc1snZGF0YUJpbmQnXS5jdXJyZW50VmFsdWUgIT0gbnVsbCkpIHtcbiAgICAgIHRoaXMuYWxsRXZlbnRzID0gW107XG4gICAgICB0aGlzLnByb2Nlc3NCb29rbGV0KCk7XG4gICAgfVxuICAgIC8vQVAtMTlNQVkyNSAtIElmIGJvb2tsZXRKU09OIGlucHV0IGNoYW5nZXMsIHRyaWdnZXIgcHJvY2Vzc0RhdGEgb24gUXVlc3Rpb25ib29rQ29tcG9uZW50XG4gICAgaWYgKHNpbXBsZWNoYW5nZXNbJ2Jvb2tsZXRKU09OJ10pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHNpbXBsZWNoYW5nZXNbJ2Jvb2tsZXRKU09OJ10uY3VycmVudFZhbHVlO1xuICAgIC8vQVAtMjhNQVkyNSAtIElmIHRoZSBhY3Rpb24gaXMgYSBzdHJpbmcsIHVwZ3JhZGUgaXQgdG8gdGhlIG5ldyBhY3Rpb24gbW9kZWwgKGFycmF5IG9mIG9iamVjdHMpXG4gICAgICBpZiAoY3VycmVudFZhbHVlPy5xdWVzdGlvbmJvb2s/LmFjdGlvbiAmJiB0eXBlb2YgY3VycmVudFZhbHVlLnF1ZXN0aW9uYm9vay5hY3Rpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGN1cnJlbnRWYWx1ZS5xdWVzdGlvbmJvb2suYWN0aW9uID0gdGhpcy51cGdyYWRlQWN0aW9ucyhjdXJyZW50VmFsdWUucXVlc3Rpb25ib29rLmFjdGlvbik7XG4gICAgICB9ICBcbiAgICAgIGlmICh0aGlzLnF1ZXN0aW9uYm9va0NvbXBvbmVudCl7XG4gICAgICAgIHRoaXMucXVlc3Rpb25ib29rQ29tcG9uZW50LnByb2Nlc3NEYXRhKClcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gQVAtMjhNQVkyNSAtIENvbnZlcnRzIG9sZCBhY3Rpb24gc3RyaW5nIChKU09OKSBpbnRvIGEgbmV3IG1vZGVsIChhcnJheSBvZiBhY3Rpb24gb2JqZWN0cylcbiAgdXBncmFkZUFjdGlvbnMoYWN0aW9uU3RyaW5nOiBzdHJpbmcpOiBhbnlbXSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSB0byBwYXJzZSB0aGUgYWN0aW9uIHN0cmluZyB0byBKU09OXG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGFjdGlvblN0cmluZyk7XG4gIC8vIEFQLTI4TUFZMjUgSWYgcGFyc2VkIHJlc3VsdCBpcyBhbiBhcnJheSwgYXBwbHkgZGVmYXVsdCBzdHlsZXMgYW5kIGFkanVzdCBwb3NpdGlvblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VkLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBwb3NpdGlvblBlcmNlbnQ6IGl0ZW0ubmFtZSA9PT0gJ0NhbmNlbCcgPyAzIDogMTQsIC8vIFNldCBwb3NpdGlvbiBiYXNlZCBvbiBhY3Rpb24gbmFtZVxuICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgdGV4dENvbG9yOiAnI2ZmZmZmZicsXG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiA2LFxuICAgICAgICAgIGlkOiBpbmRleFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIkludmFsaWQgSlNPTiBhY3Rpb24gZm9ybWF0XCIsIGUpO1xuICAgIH1cbiAgXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcHJvY2Vzc0Jvb2tsZXQoKSB7IFxuICAgIGlmICh0aGlzLmJvb2tsZXRJZCkge1xuICAgICAgaWYgKHRoaXMuYm9va2xldElkLmxlbmd0aCA9PSAxOCkge1xuICAgICAgICB0aGlzLnJlYWRCb29rbGV0KHRoaXMuYm9va2xldElkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuYm9va2xldEpTT04pIHtcbiAgICAgIC8vIFRyeSB0byBwYXNzIGEgdmFsdWUgZnJvbSBCYWNrZW5kIHRvIGRpZmZlcmVudGlhdGUgdGhlIFF1ZXN0aW9uQm9vayBSZWFkIGFuZCBBbnN3ZXJCb29rIFJlYWRcbiAgICAgIHRoaXMuaXNBbnN3ZXJGbGFnID0gdHJ1ZTtcblxuICAgICAgaWYgKHRoaXMuYm9va2xldEpTT04gIT0gbnVsbCAmJiB0aGlzLmJvb2tsZXRKU09OICE9IHVuZGVmaW5lZCAmJiB0aGlzLmJvb2tsZXRKU09OPy5ib29rUXVlc3Rpb25zTWFwKSB7XG4gICAgICAgIC8vIFNLUzI4TUFSMjUgZ2V0IHRoZSBuZXN0ZWQgcmVmZXJlbmNlIHFiIFxuICAgICAgICBsZXQgdGVtcGJvb2sgPSB0aGlzLmJvb2tsZXRKU09OPy5ib29rUXVlc3Rpb25zTWFwW09iamVjdC5rZXlzKHRoaXMuYm9va2xldEpTT04/LmJvb2tRdWVzdGlvbnNNYXApWzBdXS5zdWJRdWVzdGlvbnM7XG4gICAgICAgIHRlbXBib29rLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBcImJvb2tcIiAmJiBlbGVtZW50Py5xYlJlZmVyZW5jZSkge1xuICAgICAgICAgICAgdGhpcy5nZXRSZWZRYkRhdGEoZWxlbWVudD8ucWJSZWZlcmVuY2UpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudFsncWJSZWZlcmVuY2VRdWVzdGlvbnMnXSA9IHJlc3BvbnNlOyAvLyBBc3NpZ24gcmVzcG9uc2UgdG8gcWJSZWZlcmVuY2VRdWVzdGlvbnNcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkFQSSBFcnJvcjpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYm9va2xldEpTT05bJ2Jvb2tRdWVzdGlvbnNNYXAnXVtPYmplY3Qua2V5cyh0aGlzLmJvb2tsZXRKU09OPy5ib29rUXVlc3Rpb25zTWFwKVswXV0uc3ViUXVlc3Rpb25zID0gdGVtcGJvb2tcbiAgICAgICAgLy8gU3RvcmluZyB0aGUgQVBJIHJlc3BvbnNlIGZvciBmdXR1cmUgdXNlXG4gICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZSh0aGlzLmJvb2tsZXRKU09OKTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJvY2VzcyB0aGUgU3ViIFF1ZXN0aW9uIE9wdGlvbnMgLSBUaGlzIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBib29rUXVlc3Rpb25zTWFwIGluIGZ1dHVyZVxuICAgICAgZm9yICh2YXIgc3EgaW4gdGhpcy5ib29rbGV0SlNPTj8uc3FPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3FPcHRpb25zLnNldChzcSwgdGhpcy5ib29rbGV0SlNPTj8uc3FPcHRpb25zW3NxXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgdGhlIFF1ZXN0aW9uc1xuICAgICAgLy8gSEEgMjhERUMyMyB0aGlzIGFwcGxpZXMgZm9yIGJvb2tsZXRcbiAgICAgIC8vIEhBIDE3SkFOMjQgQWRkZWQgdGVybmFyeSBvcGVyYXRvciB0byBhdm9pZCB1bmRlZmluZWQgc2NlbmFyaW9cbiAgICAgIC8vIEhBIDA5RkVCMjQgQWRkaW5nIGNvbmRpdGlvbiB0byBhdm9pZCB1bmRlZmluZWQgZXJyb3JcbiAgICAgIGlmICh0aGlzLmJvb2tsZXRKU09OPy5ib29rUXVlc3Rpb25zTWFwICYmIE9iamVjdC5rZXlzKHRoaXMuYm9va2xldEpTT04/LmJvb2tRdWVzdGlvbnNNYXApLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yICh2YXIgdmFsdWUgaW4gdGhpcy5ib29rbGV0SlNPTj8uYm9va1F1ZXN0aW9uc01hcCkge1xuICAgICAgICAgIHRoaXMuYm9va1F1ZXN0aW9uc01hcC5zZXQodmFsdWUsIHRoaXMuYm9va2xldEpTT04/LmJvb2tRdWVzdGlvbnNNYXBbdmFsdWVdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gSEEgMjhERUMyMyB0aGlzIGFwcGxpZXMgZm9yIGJvb2sgb3IgcXVlc3Rpb25zXG4gICAgICBlbHNlIGlmKHRoaXMuYm9va2xldEpTT04/LnJlY29yZHMpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJyc7XG4gICAgICAgIC8vIEhBIDA5RkVCMjQgQWRkZWQgdGVybmFyeVxuICAgICAgICAvLyBSUyAwOURFQzI0IENoYW5nZWQga2V5c1xuICAgICAgICB2YWx1ZSA9IHRoaXMuYm9va2xldEpTT04/LnJlY29yZHNbMF0/LmlkO1xuICAgICAgICB0aGlzLmJvb2tRdWVzdGlvbnNNYXAuc2V0KHZhbHVlLCB0aGlzLmJvb2tsZXRKU09OPy5xdWVzdGlvbmJvb2spO1xuICAgICAgfVxuXG4gICAgICAvLyBWRCAyMEp1bjI0IC0gdHJhbnNsYXRpb24gY2hhbmdlc1xuICAgICAgZm9yICh2YXIgdmFsdWUgaW4gdGhpcy5ib29rbGV0SlNPTj8udHJhbnNsYXRpb25NYXApIHtcbiAgICAgICAgdGhpcy50cmFuc2xhdGVNYXAuc2V0KHZhbHVlLCB0aGlzLmJvb2tsZXRKU09OPy50cmFuc2xhdGlvbk1hcFt2YWx1ZV0pO1xuICAgICAgfVxuICAgICAgLy8gQVAgMjNNQVkyNSAtIHN1cHBvcnRzIGJvdGggc3RyaW5naWZpZWQgYW5kIG9iamVjdCBmb3JtYXRzXG4gICAgICBpZiAodGhpcy5ib29rbGV0SlNPTj8ucXVlc3Rpb25ib29rPy5hY3Rpb24gIT0gdW5kZWZpbmVkICYmIHRoaXMuYm9va2xldEpTT04/LnF1ZXN0aW9uYm9vaz8uYWN0aW9uICE9ICcnKSB7XG4gICAgICAgIHRoaXMuYWN0aW9ucyA9IHR5cGVvZiB0aGlzLmJvb2tsZXRKU09OPy5xdWVzdGlvbmJvb2suYWN0aW9uID09PSAnc3RyaW5nJ1xuICAgICAgICA/IEpTT04ucGFyc2UodGhpcy5ib29rbGV0SlNPTj8ucXVlc3Rpb25ib29rLmFjdGlvbilcbiAgICAgICAgOiB0aGlzLmJvb2tsZXRKU09OPy5xdWVzdGlvbmJvb2suYWN0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBIQSAxOURFQzIzIGxhbmdEaXJlY3Rpb24gdmFyaWFibGUgdmFsdWUgYXNzaWduaW5nXG4gICAgLy8gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXNcbiAgICBpZiAodGhpcy5ib29rbGV0SlNPTj8ucXVlc3Rpb25ib29rPy5zdHlsZSkge1xuICAgICAgdmFyIHN0eWxlID0gdHlwZW9mIHRoaXMuYm9va2xldEpTT04/LnF1ZXN0aW9uYm9vaz8uc3R5bGUgPT09ICdvYmplY3QnID8gdGhpcy5ib29rbGV0SlNPTj8ucXVlc3Rpb25ib29rPy5zdHlsZSA6IEpTT04ucGFyc2UodGhpcy5ib29rbGV0SlNPTj8ucXVlc3Rpb25ib29rPy5zdHlsZSk7XG4gICAgICB0aGlzLmxhbmdEaXJlY3Rpb24gPSBzdHlsZT8uZGlyZWN0aW9uO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLmJvb2tsZXRKU09OPy5yZWNvcmRzICYmIHRoaXMuYm9va2xldEpTT04/LnJlY29yZHNbMF0/LnN0eWxlKSB7XG4gICAgICB2YXIgc3R5bGUgPSB0eXBlb2YgdGhpcy5ib29rbGV0SlNPTj8ucmVjb3Jkc1swXT8uc3R5bGUgPT09ICdvYmplY3QnID8gdGhpcy5ib29rbGV0SlNPTj8ucmVjb3Jkc1swXT8uc3R5bGUgOiBKU09OLnBhcnNlKHRoaXMuYm9va2xldEpTT04/LnJlY29yZHNbMF0/LnN0eWxlKTtcbiAgICAgIHRoaXMubGFuZ0RpcmVjdGlvbiA9IHN0eWxlPy5kaXJlY3Rpb247XG4gICAgfVxuXG4gICAgLy8gSEEgMTgtSkFOLTI0IFRoZSBjb25kaXRpb24gaXMgdXNlZCBmb3IgQmluZC1JbiBMb2dpYyBcbiAgICB0aGlzLmhhbmRsZUNvbXBsZXRlQm9va2xldCh0aGlzLmJvb2tsZXRKU09OKTtcbiAgICB0aGlzLmJvb2tsZXQgPSB0aGlzLmJvb2tsZXRKU09OPy5yZWNvcmRzO1xuICAgIHRoaXMuYWJJdGVtID0gdGhpcy5ib29rbGV0SlNPTj8uYW5zd2VyYm9vaztcbiAgfVxuICAvLyBWRCAxMkp1bjI0IC0gdHJhbnNsYXRpb24gY2hhbmdlc1xuICBwcml2YXRlIHJlYWRCb29rbGV0ID0gKHV1aWQ6IHN0cmluZykgPT4ge1xuICAgIGlmICh0aGlzLnNlcnYgPT0gXCJhcGlcIikge1xuICAgICAgdGhpcy5kYXRhU2VydmljZS5nZXRBUElEYXRhKFxuICAgICAgICB0aGlzLnRrbixcbiAgICAgICAgW1wiQm9va2xldFwiLCBcInJlYWRcIiwgdXVpZCwgdGhpcy5sYW5ndWFnZUNvZGVdLFxuICAgICAgICB0aGlzLnN1Y2Nlc3NSZWFkQm9va2xldCxcbiAgICAgICAgdGhpcy5mYWlsdXJlUmVhZEJvb2tsZXRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFZEIDMxTk9WMjQgcGFyYW0gY2hhbmdlcyB3aXRoIG5ldyBtZXRob2RcbiAgICAgIGxldCBwYXJhbU1hcCA9IHsgY3JlYXRlQW5zd2VyQm9va0ZsYWc6IGZhbHNlIH07XG4gICAgICBwYXJhbU1hcFsnY19fcWJfaWQnXSA9ICcnO1xuICAgICAgcGFyYW1NYXBbXCJjX19yZWNvcmRfaWRcIl0gPSAnJztcbiAgICAgIGxldCBwYXJhID0ge1xuICAgICAgICBkYXRhVHlwZTogXCJCb29rbGV0XCIsXG4gICAgICAgIG9wZXJhdGlvbjogXCJyZWFkXCIsXG4gICAgICAgIHBhcmFtMTogdXVpZCxcbiAgICAgICAgcGFyYW1KU09OOiBKU09OLnN0cmluZ2lmeShwYXJhbU1hcCksXG4gICAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGVcbiAgICAgIH1cbiAgICAgIHRoaXMuc2ZTZXJ2aWNlLnJlbW90ZUFjdGlvbihcbiAgICAgICAgXCJOeHRDb250cm9sbGVyLnByb2Nlc3NEYXRhXCIsXG4gICAgICAgIFtKU09OLnN0cmluZ2lmeShwYXJhKV0sXG4gICAgICAgIHRoaXMuc3VjY2Vzc1JlYWRCb29rbGV0LFxuICAgICAgICB0aGlzLmZhaWx1cmVSZWFkQm9va2xldFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN1Y2Nlc3NSZWFkQm9va2xldCA9IChyZXNwb25zZSkgPT4ge1xuICAgIGlmIChyZXNwb25zZSAhPSBudWxsIHx8IHJlc3BvbnNlICE9IHVuZGVmaW5lZCkge1xuICAgICAgLy8gU3RvcmluZyB0aGUgQVBJIHJlc3BvbnNlIGZvciBmdXR1cmUgdXNlXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUocmVzcG9uc2UpO1xuXG4gICAgICAvLyBUcnkgdG8gcGFzcyBhIHZhbHVlIGZyb20gQmFja2VuZCB0byBkaWZmZXJlbnRpYXRlIHRoZSBRdWVzdGlvbkJvb2sgUmVhZCBhbmQgQW5zd2VyQm9vayBSZWFkXG4gICAgICAvLyB0aGlzLmlzQW5zd2VyRmxhZyA9IHRydWU7XG5cbiAgICAgIHRoaXMuYm9va2xldCA9IHJlc3BvbnNlLnJlY29yZHM7XG4gICAgICB0aGlzLmFiSXRlbSA9IHJlc3BvbnNlLmFuc3dlcmJvb2s7XG5cbiAgICAgIC8vIFByb2Nlc3MgdGhlIFN1YiBRdWVzdGlvbiBPcHRpb25zIC0gVGhpcyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggYm9va1F1ZXN0aW9uc01hcCBpbiBmdXR1cmVcbiAgICAgIGZvciAodmFyIHNxIGluIHJlc3BvbnNlLnNxT3B0aW9ucykge1xuICAgICAgICB0aGlzLnNxT3B0aW9ucy5zZXQoc3EsIHJlc3BvbnNlLnNxT3B0aW9uc1tzcV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBRdWVzdGlvbnNcbiAgICAgIGZvciAodmFyIHZhbHVlIGluIHJlc3BvbnNlLmJvb2tRdWVzdGlvbnNNYXApIHtcbiAgICAgICAgdGhpcy5ib29rUXVlc3Rpb25zTWFwLnNldCh2YWx1ZSwgcmVzcG9uc2UuYm9va1F1ZXN0aW9uc01hcFt2YWx1ZV0pO1xuICAgICAgfVxuICAgICAgLy8gVkQgMTFKdW4yNCAtIHRyYW5zbGF0aW9uIGNoYW5nZXNcbiAgICAgIGZvciAodmFyIHZhbHVlIGluIHJlc3BvbnNlLnRyYW5zbGF0aW9uTWFwKSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlTWFwLnNldCh2YWx1ZSwgcmVzcG9uc2UudHJhbnNsYXRpb25NYXBbdmFsdWVdKTtcbiAgICAgIH1cbiAgICAgIC8vIFZEIDMxTk9WMjQgd3JhcHBlciBjaGFuZ2VzXG4gICAgICBpZiAocmVzcG9uc2UucXVlc3Rpb25ib29rPy5hY3Rpb24gIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuYWN0aW9ucyA9IHR5cGVvZiByZXNwb25zZS5xdWVzdGlvbmJvb2s/LmFjdGlvbiA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBKU09OLnBhcnNlKHJlc3BvbnNlLnF1ZXN0aW9uYm9vaz8uYWN0aW9uKVxuICAgICAgICA6IHJlc3BvbnNlLnF1ZXN0aW9uYm9vaz8uYWN0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBIQSAxOURFQzIzIGxhbmdEaXJlY3Rpb24gdmFyaWFibGUgdmFsdWUgYXNzaWduaW5nXG4gICAgaWYgKHJlc3BvbnNlPy5xdWVzdGlvbmJvb2s/LnN0eWxlKSB7XG4gICAgICB2YXIgc3R5bGUgPSB0eXBlb2YgcmVzcG9uc2U/LnF1ZXN0aW9uYm9vaz8uc3R5bGUgPT09ICdvYmplY3QnID8gcmVzcG9uc2U/LnF1ZXN0aW9uYm9vaz8uc3R5bGUgOiBKU09OLnBhcnNlKHJlc3BvbnNlPy5xdWVzdGlvbmJvb2s/LnN0eWxlKTtcbiAgICAgIHRoaXMubGFuZ0RpcmVjdGlvbiA9IHN0eWxlPy5kaXJlY3Rpb247XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlc3BvbnNlPy5yZWNvcmRzWzBdPy5zdHlsZSkge1xuICAgICAgdmFyIHN0eWxlID0gdHlwZW9mIHJlc3BvbnNlPy5yZWNvcmRzWzBdPy5zdHlsZSA9PT0gJ29iamVjdCcgPyByZXNwb25zZT8ucmVjb3Jkc1swXT8uc3R5bGUgOiBKU09OLnBhcnNlKHJlc3BvbnNlPy5yZWNvcmRzWzBdPy5zdHlsZSk7XG4gICAgICB0aGlzLmxhbmdEaXJlY3Rpb24gPSBzdHlsZT8uZGlyZWN0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmFpbHVyZVJlYWRCb29rbGV0ID0gKHJlc3BvbnNlKSA9PiB7XG5cbiAgfVxuICAvL1NLUzI4TUFSMjUgRnVuY3Rpb24gdG8gZmV0Y2ggcmVmcWIgZGF0YVxuICBnZXRSZWZRYkRhdGEocmVmcWJpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KGBodHRwczovL2Rldi1hcGkudmFsYXJoci5jb20vbnh0P25hbWU9JHtyZWZxYmlkfWApO1xuICB9XG4gIHNpbmdsZUZpZWxkQ2hhbmdlKGV2ZW50OiBhbnkpe1xuICAgIGxldCBhY3Rpb25CdXR0b25cbiAgICB0aGlzLmFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgaWYgKGFjdGlvbi5ldmVudHRvZW1pdCA9PT0gJ3N1Ym1pdCcpe1xuICAgICAgICBhY3Rpb25CdXR0b24gPSBhY3Rpb25cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmhhbmRsZUJvb2tsZXRBY3Rpb25DbGljayhhY3Rpb25CdXR0b24sZXZlbnQpXG4gIH1cbiAgaGFuZGxlQm9va2xldEFjdGlvbkNsaWNrKGFjdGlvbjogQWN0aW9uTWV0YSxxdWVzPzphbnkpIHtcbiAgICAvLyBIQSAxOUpBTjI0IEFjdGlvbiBjaGFuZ2VzXG4gICAgLy8gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXNcbiAgICB0aGlzLmFuc3dlckxpc3QgPSBbXTtcbiAgICB0aGlzLmRhdGFCaW5kID0gW107IC8vIEhBIDEyRkVCMjQgQ2xlYXJpbmcgZGF0YUJpbmQgdXBvbiBidXR0b24gYWN0aW9uIHNvIHRoYXQgZGF0YUJpbmQgdmFsdWUgd2lsbCBub3Qgb3ZlcnJpZGUgdGhlIGNoYW5nZWQgdmFsdWVcbiAgICBsZXQgZGF0YVRvUGFyZW50OmFueSA9IHt9O1xuICAgIGxldCB2YWxpZEZvcm0gPSB0cnVlOyAvLyBWRCAwMUF1ZzI0IC0gdmFsaWRhdGlvbiBjaGFuZ2VcbiAgICBsZXQgaXNQcmltYXJ5S2V5ID0gZmFsc2U7XG4gICAgbGV0IHByaW1hcnlLZXlFbGVtZW50OiBhbnk7XG4gICAgbGV0IGRlcGVuZGVudEVsZW1lbnRBcnJheSA6IGFueVtdID0gW107XG4gICAgLy8gSEEgMjJKQU4yNCB0aGlzIGNoYW5nZSB0byBtYWtlIGNsb3NlIGV2ZW50IHdvcmtcbiAgICBkYXRhVG9QYXJlbnRbJ2FjdGlvbiddID0gYWN0aW9uLmV2ZW50dG9lbWl0O1xuICAgIGlmICghKGFjdGlvbi5ldmVudHRvZW1pdCA9PT0gJ2Nsb3NlJyB8fCBhY3Rpb24uZXZlbnR0b2VtaXQgPT09ICdwcmludCcpKSB7XG4gICAgICAvLyBIQSAxOC1KQU4tMjQgU2VuZGluZyB0aGUgY29tcGxldGUganNvbiBkYXRhIGFsc28gXG4gICAgICBkYXRhVG9QYXJlbnRbJ2pzb25Cb29rJ10gPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldCgpO1xuICAgICAgLy8gSEEgMTdKQU4yNCBueHRJZCB0byBkYXRhUGFyZW50IG9iamVjdFxuICAgICAgaWYgKHRoaXMuYm9va2xldEpTT04pIHtcbiAgICAgICAgZGF0YVRvUGFyZW50WydueHRJZCddID0gT2JqZWN0LmtleXModGhpcy5ib29rbGV0SlNPTj8uYm9va1F1ZXN0aW9uc01hcClbMF07XG4gICAgICB9XG4gICAgICAvLyBIQSAxMS1KQU4tMjQgTWluaW1pemluZyB0aGUgdmFsdWUgd2hpY2ggaGFzIHRvIGJlIHBhc3NlZCB0byB0aGUgc2VydmVyXG4gICAgICB0aGlzLmhhbmRsZUNvbXBsZXRlQm9va2xldChkYXRhVG9QYXJlbnRbJ2pzb25Cb29rJ10pO1xuICAgICAgZGF0YVRvUGFyZW50WydkYXRhJ10gPSB0aGlzLmFuc3dlckxpc3QgPyB0aGlzLmFuc3dlckxpc3QgOiBkYXRhVG9QYXJlbnRbJ2RhdGEnXTtcbiAgICAgIC8vIHdoZW4gY2xpY2tpbmcgdGhlIHN1Ym1pdCBidXR0b24gdmFsaWRhdGluZyB0aGUgcmVxdWlyZWQgZmllbGRzXG4gICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YVRvUGFyZW50Wydqc29uQm9vayddLmJvb2tRdWVzdGlvbnNNYXApIHtcbiAgICAgICAgY29uc3QgY3VycmVudEJvb2sgPSBkYXRhVG9QYXJlbnRbJ2pzb25Cb29rJ10uYm9va1F1ZXN0aW9uc01hcFtrZXldO1xuICAgICAgICBjdXJyZW50Qm9vay5zdWJRdWVzdGlvbnMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICBpZiAoIWlzUHJpbWFyeUtleSkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQ/LnByaW1hcnlLZXkgPT09IHRydWUgJiYgZWxlbWVudD8uaW5wdXQgIT09IHVuZGVmaW5lZCAmJiBlbGVtZW50Py5pbnB1dCAhPT0gJycgJiYgZWxlbWVudD8uaW5wdXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgaXNQcmltYXJ5S2V5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcHJpbWFyeUtleUVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBWRCAwMUF1ZzI0IC0gdmFsaWRhdGlvbiBjaGFuZ2VcbiAgICAgICAgICBpZiAoZWxlbWVudC5pc09wdGlvbmFsICYmIGRhdGFUb1BhcmVudFsnYWN0aW9uJ10gPT0gJ3N1Ym1pdCcgJiYgKCFlbGVtZW50LmlucHV0IHx8IChBcnJheS5pc0FycmF5KGVsZW1lbnQuaW5wdXQpICYmIGVsZW1lbnQuaW5wdXQubGVuZ3RoID09PSAwKSkgJiYgIWVsZW1lbnQuaXNIaWRkZW4gJiYgZWxlbWVudC50eXBlICE9ICdMYWJlbCcgJiYgZWxlbWVudC50eXBlICE9ICdJbWFnZScpIHsgLy9TS1M1Tk9WMjUgXG4gICAgICAgICAgICBlbGVtZW50LmVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhbGlkRm9ybSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VTZXJ2aWNlLnN1Ym1pdENoYW5nZShlbGVtZW50LmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVkQgMDJBdWcyNCAtIGNsZWFyIGFjdGlvbiBjaGFuZ2VzXG4gICAgICAgICAgaWYgKGRhdGFUb1BhcmVudFsnYWN0aW9uJ10gPT0gJ2NsZWFyJykge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PSAnRHJvcGRvd24nIHx8IGVsZW1lbnQudHlwZSA9PSAnTG9jYXRpb24nIHx8IGVsZW1lbnQudHlwZSA9PSAnUmFkaW8nKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC50eXBlID09ICdGaWxlJykge1xuICAgICAgICAgICAgICBlbGVtZW50LmlucHV0ID0gW107XG4gICAgICAgICAgICB9IGVsc2UgaWYoZWxlbWVudC50eXBlID09PSBcIkJvb2xlYW5cIikgeyAvLyBTS1MyM0pVTjI1IGRlZmF1bHRseSBzZXQgdmFsdWUgZmFsc2VcbiAgICAgICAgICAgICBlbGVtZW50LmlucHV0ID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbGVtZW50LmlucHV0ID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYocXVlcz8uc3ViVGV4dD8uc291cmNlUXVlc3Rpb25JZCAhPT0gdW5kZWZpbmVkICYmIHF1ZXM/LnN1YlRleHQ/LnNvdXJjZVF1ZXN0aW9uSWQgIT09IG51bGwgJiYgcXVlcz8uc3ViVGV4dD8uc291cmNlUXVlc3Rpb25JZCAhPT0gJycgJiYgIXF1ZXM/LnN1YlRleHQ/LmlzRGVwZW5kZW50RmllbGQpIHtcblxuICAgICAgICB9IGVsc2UgaWYocXVlcz8uc3ViVGV4dD8uc291cmNlUXVlc3Rpb25JZCAhPT0gdW5kZWZpbmVkICYmIHF1ZXM/LnN1YlRleHQ/LnNvdXJjZVF1ZXN0aW9uSWQgIT09IG51bGwgJiYgcXVlcz8uc3ViVGV4dD8uc291cmNlUXVlc3Rpb25JZCAhPT0gJycgJiYgIHF1ZXM/LnN1YlRleHQ/LmlzRGVwZW5kZW50RmllbGQpe1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudEJvb2suc3ViUXVlc3Rpb25zLmZvckVhY2goZWxlID0+IHtcbiAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkoZWxlPy5zdWJUZXh0Py5zb3VyY2VRdWVzdGlvbklkKT8gZWxlPy5zdWJUZXh0Py5zb3VyY2VRdWVzdGlvbklkLmluY2x1ZGVzKHF1ZXM/LmlkKSA6IHF1ZXM/LmlkID09PSBlbGU/LnN1YlRleHQ/LnNvdXJjZVF1ZXN0aW9uSWQgKXtcbiAgICAgICAgICAgICAgZGVwZW5kZW50RWxlbWVudEFycmF5LnB1c2goZWxlLmlkKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gVkQgMTNNQVkyNCAtIHByaW50IFFSIGJ1dHRvbiBjaGFuZ2VzXG4gICAgaWYgKGFjdGlvbi5ldmVudHRvZW1pdCA9PT0gJ3ByaW50Jykge1xuICAgICAgZGF0YVRvUGFyZW50WydhY3Rpb25EYXRhJ10gPSBhY3Rpb25bJ2RhdGEnXTtcbiAgICB9XG4gICAgLy8gTVNNIDE3SlVOMjUgLSBDbG9zZSBidXR0b24gZXZlbnQgY2hhbmdlc1xuICAgIGlmIChhY3Rpb24uZXZlbnR0b2VtaXQgPT09ICdjbG9zZScgJiYgdGhpcy5pc0VkaXQpIHtcbiAgICAgIHRoaXMuaXNFZGl0ID0gZmFsc2U7XG4gICAgfVxuICAgIC8vIEhBIDIzSkFOMjQgVG8gY2FsbCB0aGUgYWN0aW9uIG9uIGFueSBldmVudFxuICAgIC8vICBWRCAwMUF1ZzI0IC0gdmFsaWRhdGlvbiBjaGFuZ2VcbiAgICBpZiAodmFsaWRGb3JtKSB7XG4gICAgICAvLyBTS1MxM0pVTjI1IHNpbmdsZSBmaWVsZCBjaGFuZ2UgZW1pdFxuICAgICAgaWYgKHF1ZXMgJiYgcXVlcy5zaW5nbGVGaWVsZENoYW5nZSkge1xuICAgICAgICBkYXRhVG9QYXJlbnQuZGF0YSA9IGRhdGFUb1BhcmVudC5kYXRhLmZpbHRlcigoaW5wdXREYXRhOiBhbnkpID0+IGlucHV0RGF0YS5pZCA9PT0gcXVlcy5pZCB8fCBpbnB1dERhdGEuaWQgPT09IHByaW1hcnlLZXlFbGVtZW50Py5pZCB8fCBkZXBlbmRlbnRFbGVtZW50QXJyYXkuaW5jbHVkZXMoaW5wdXREYXRhLmlkKSApO1xuICAgICAgfVxuICAgICAgaWYoaXNQcmltYXJ5S2V5KSB7XG4gICAgICAgIGRhdGFUb1BhcmVudC5hY3Rpb24gPSAgZGF0YVRvUGFyZW50LmFjdGlvbiA9PT0gJ3N1Ym1pdCcgPyAnc2F2ZScgOiAgZGF0YVRvUGFyZW50LmFjdGlvbjtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFuZGxlQm9va2xldEFjdGlvbkV2ZW50LmVtaXQoZGF0YVRvUGFyZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YVRvUGFyZW50WydhY3Rpb24nXSA9ICdlcnJvcic7XG4gICAgICB0aGlzLmhhbmRsZUJvb2tsZXRBY3Rpb25FdmVudC5lbWl0KGRhdGFUb1BhcmVudCk7XG4gICAgfVxuICB9XG5cbiAgLy8gSEEgMTgtSkFOLTI0IGhhbmRsZUNvbXBsZXRlQm9va2xldCBpcyB0byBzaW1wbGlmeSB0aGUgbG9naWNcbiAgaGFuZGxlQ29tcGxldGVCb29rbGV0KGNvbXBsZXRlQm9va2xldCkge1xuICAgIGlmIChPYmplY3Qua2V5cyhjb21wbGV0ZUJvb2tsZXQ/LmJvb2tRdWVzdGlvbnNNYXAgPz8ge30pLmxlbmd0aCA9PT0gMCkgeyAvLyBIQSAxMS1KQU4tMjQgSWYgY29uZGl0aW9uIHRvIGxvYWQgYm9va2xldFxuICAgICAgdGhpcy5oYW5kbGVCb29rKGNvbXBsZXRlQm9va2xldD8ucXVlc3Rpb25ib29rPy5zdWJRdWVzdGlvbnMpO1xuICAgIH1cbiAgICBlbHNlIHsgLy8gSEEgMTEtSkFOLTI0IFRvIGxvYWQgYm9vayBxdWVzdGlvbnNcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGNvbXBsZXRlQm9va2xldC5ib29rUXVlc3Rpb25zTWFwKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IGNvbXBsZXRlQm9va2xldC5ib29rUXVlc3Rpb25zTWFwW2tleV07XG4gICAgICAgIGlmICh2YWwudHlwZSA9PT0gJ0Jvb2snKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVCb29rKHZhbC5zdWJRdWVzdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMuaGFuZGxlUXVlcyh2YWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSEEgMTEtSkFOLTI0IGhhbmRsZUJvb2sgbG9hZHMgdGhlIEJvb2tcbiAgLy8gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXNcbiAgaGFuZGxlQm9vayhxdWVzTGlzdDogYW55KSB7XG4gICAgcXVlc0xpc3Q/LmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZiAoZWxlbWVudC50eXBlID09PSAnQm9vaycgJiYgZWxlbWVudC5xYlJlZmVyZW5jZVF1ZXN0aW9ucykge1xuICAgICAgICAvLyBIQSAyNEpBTjI0IEZldGNoaW5nIGZyb20gUUIgcmVmZXJlbmNlXG4gICAgICAgIHZhciBib29rID0gdHlwZW9mIGVsZW1lbnQucWJSZWZlcmVuY2VRdWVzdGlvbnMgPT09ICdvYmplY3QnID8gZWxlbWVudC5xYlJlZmVyZW5jZVF1ZXN0aW9ucyA6IEpTT04ucGFyc2UoZWxlbWVudC5xYlJlZmVyZW5jZVF1ZXN0aW9ucylcbiAgICAgICAgY29uc3QgZmlyc3RLZXkgPSBPYmplY3Qua2V5cyhib29rPy5ib29rUXVlc3Rpb25zTWFwIHx8IHt9KVswXTtcbiAgICAgICAgYm9vaz8uYm9va1F1ZXN0aW9uc01hcFtmaXJzdEtleV0/LnN1YlF1ZXN0aW9ucz8uZm9yRWFjaChxdWVzID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVF1ZXMocXVlcyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuaGFuZGxlUXVlcyhlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBWRCAxM1NlcDI0IC0gZGF0YWJpbmQgY2hhbmdlc1xuICAgIC8vIFZEIDIzIE9jdDI0IC0gZmlsZSB0eXBlIGNoYW5nZXNcbiAgICBpZiAodGhpcy5kYXRhQmluZCAmJiBPYmplY3Qua2V5cyh0aGlzLmRhdGFCaW5kKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNoYW5nZVNlcnZpY2UuZGF0YUNoYW5nZXMoJ2RhdGFCaW5kJyk7XG4gICAgfVxuICB9XG4gIC8vIFNLUzIwTUFSMjUgZmxhdHRlbmluZyBuZXN0ZWQgb2JqZWN0cywgbWFwcGluZyB2YWx1ZXMgdXNpbmcgIHJlZmVyZW5jZUZpZWxkXG4gIGZsYXR0ZW5PYmplY3Qob2JqOiBhbnksIHBhcmVudEtleSA9ICcnKTogYW55W10ge1xuICAgIGxldCByZXN1bHQ6IGFueVtdID0gW107XG4gIFxuICAgIGZvciAobGV0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgbGV0IG5ld0tleSA9IHBhcmVudEtleSA/IGAke3BhcmVudEtleX0uJHtrZXl9YCA6IGtleTtcbiAgXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKFtuZXdLZXksIHZhbF0pOyAvLyBJbmNsdWRlIGZ1bGwgYXJyYXlcbiAgXG4gICAgICAgIHZhbC5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5mbGF0dGVuT2JqZWN0KGl0ZW0sIGAke25ld0tleX1bJHtpbmRleH1dYCkpOyAvLyBGbGF0dGVuIG9iamVjdHMgaW4gYXJyYXlzXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFtgJHtuZXdLZXl9WyR7aW5kZXh9XWAsIGl0ZW1dKTsgLy8gU3RvcmUgcHJpbWl0aXZlIHZhbHVlcyBpbiBhcnJheXNcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goW25ld0tleSwgdmFsXSk7IC8vIEFsd2F5cyBpbmNsdWRlIGZ1bGwgb2JqZWN0XG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuZmxhdHRlbk9iamVjdCh2YWwsIG5ld0tleSkpOyAvLyBDb250aW51ZSBmbGF0dGVuaW5nXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQucHVzaChbbmV3S2V5LCB2YWxdKTsgLy8gU3RvcmUgcHJpbWl0aXZlIHZhbHVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgXG4gIC8vIFNLUzIwTUFSMjUgcmVmZXJlbmNlRmllbGQgc2V0IGxpa2UgdGhpc1xuICAvLyBuYW1lICAtLT4gbm9ybWFsXG4gIC8vIGl0ZW1zWzBdLm5hbWUgIC0tPiB2YWx1ZSBpbiBhIGFycmF5IHNldCBsaWtlIHRoaXNcbiAgLy8gYWRkcmVzc2VzLmxpbmUyICAtLS0+IGlmIHZhbHVlIGluIGEganNvbiBzZXQgbGlrZSB0aGlzXG4gIC8vIGFkZHJlc3Nlcy5saW5lNC5kZCAtLS0+IGlmIHZhbHVlIGluIGEgbmVzdGVkIGpzb24gc2V0IGxpa2UgdGhpc1xuXG4gIC8vIEhBIDExLUpBTi0yNCBoYW5kbGVRdWVzIHRvIGxvYWQgcXVlc3Rpb25cbiAgLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzXG4gIGhhbmRsZVF1ZXMocXVlczogYW55KSB7XG4gICAgLy8gSEEgMTktSkFOLTI0IElmIGNvbmRpdGlvbiBpcyBmb3IgYmluZC1pbiwgY29ycmVjdGlvblxuICAgIC8vIEhBIDA5RkVCMjQgQWRkaW5nIGNvbmRpdGlvbiB0byBhdm9pZCB1bmRlZmluZWQgZXJyb3JcbiAgICBpZiAodGhpcy5kYXRhQmluZCAmJiBPYmplY3Qua2V5cyh0aGlzLmRhdGFCaW5kKS5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgcmVzdWx0ID0gdGhpcy5mbGF0dGVuT2JqZWN0KHRoaXMuZGF0YUJpbmQpXG4gICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgIGZvciAobGV0IFtrZXksIHZhbF0gb2YgcmVzdWx0KSB7XG4gICAgICAgIGxldCB2YWx1ZTogYW55ID0gdmFsO1xuICAgICAgICBpZiAocXVlcy5yZWZlcmVuY2VGaWVsZCA9PT0ga2V5KSB7XG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgIGlmIChxdWVzLnR5cGUgPT09ICdEcm9wZG93bicgfHwgcXVlcy50eXBlID09PSAnUmFkaW8nKSB7XG4gICAgICAgICAgICB0aGlzLnNxT3B0aW9ucy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICBpZiAoZWxlbWVudFsncmVmZXJlbmNlRmllbGQnXSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudFsnaW5wdXQnXSA9IHF1ZXMuaW5wdXQgPSB2YWx1ZSB8fCBxdWVzLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICBlbGVtZW50WydzZWxlY3RlZFZhbHVlJ10gPSBxdWVzLnNlbGVjdGVkVmFsdWUgPSB2YWx1ZSB8fCBxdWVzLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEhBIDI0SkFOMjQgVG8gYmluZC1pbiBEYXRlIGFuZCBEYXRlVGltZVxuICAgICAgICAgIGVsc2UgaWYgKHF1ZXMudHlwZSA9PT0gJ0RhdGUnIHx8IHF1ZXMudHlwZSA9PSAnRGF0ZVRpbWUnKSB7XG4gICAgICAgICAgICBxdWVzLmlucHV0ID0gbmV3IERhdGUodmFsdWU/LnRvU3RyaW5nKCkpICB8fCBxdWVzLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSEEgMTJGRUIyNCBUbyBiaW5kLWluIExvY2F0aW9uIFR5cGVcbiAgICAgICAgICBlbHNlIGlmIChxdWVzLnR5cGUgPT09ICdMb2NhdGlvbicpIHtcbiAgICAgICAgICAgIHF1ZXMuaW5wdXQgPSB2YWx1ZSB8fCBxdWVzLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIHF1ZXMuc2VsZWN0ZWRWYWx1ZSA9IHZhbHVlWydhZGRyZXNzJ10gPyB2YWx1ZVsnYWRkcmVzcyddIDogdmFsdWUgfHwgcXVlcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlcyBmb3IgZGF0YSBiaW5kSW5cbiAgICAgICAgICBlbHNlIGlmIChxdWVzLnR5cGUgPT09ICdDYWxlbmRhcicpIHtcbiAgICAgICAgICAgIGxldCBlbnRyaWVzID0gdHlwZW9mIHF1ZXNbJ2ZpZWxkc01ldGEnXSA9PT0gJ29iamVjdCcgPyBxdWVzWydmaWVsZHNNZXRhJ10gOiBKU09OLnBhcnNlKHF1ZXNbJ2ZpZWxkc01ldGEnXSk7XG4gICAgICAgICAgICBpZiAoZW50cmllcykge1xuICAgICAgICAgICAgICBsZXQgcmVmZXJlbmNlUXVlc3Rpb25zID0gW107XG4gICAgICAgICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBlbnRyaWVzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5xdWVzdGlvblJlZmVyZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcVJlZmVyZW5jZSA9IEpTT04ucGFyc2UoZWxlbWVudC5xdWVzdGlvblJlZmVyZW5jZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZVF1ZXN0aW9ucy5wdXNoKHFSZWZlcmVuY2U/LnF1ZXN0aW9uKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlUXVlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2YWx1ZT8uZm9yRWFjaChjYWxlbmRhckFycmF5ID0+IHtcbiAgICAgICAgICAgICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoY2FsZW5kYXJBcnJheS5kYXRlKTtcbiAgICAgICAgICAgICAgICAgIGNhbGVuZGFyQXJyYXkuZW50cmllcy5mb3JFYWNoKGlucHV0RW50cnkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXRFbnRyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VRdWVzdGlvbnMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQucmVmZXJlbmNlRmllbGQgPT0gaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ0RhdGUnIHx8IGZpZWxkLnR5cGUgPT0gJ0RhdGVUaW1lJyB8fCBmaWVsZC50eXBlID09ICdUaW1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmlucHV0ID0gbmV3IERhdGUodj8udG9TdHJpbmcoKSkgfHwgcXVlcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gaWYgKGZpZWxkLnR5cGUgPT09ICdEcm9wZG93bicgfHwgZmllbGQudHlwZSA9PT0gJ1JhZGlvJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnNlbGVjdGVkVmFsdWUgPSB2O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmlucHV0ID0gdiAgfHwgcXVlcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaW5wdXQgPSB2IHx8IHF1ZXMuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudChkYXRlLCByZWZlcmVuY2VRdWVzdGlvbnMpOy8vU0tTIDI3U0VQMjQgZWFjaCBldmVudCBhZGRlZCB0byBhbGxFdmVudHMgYXJyYXlcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAvLyB0aGlzLmFkZEV2ZW50KGRhdGUscmVmZXJlbmNlUXVlc3Rpb25zKTsgLy90aGlzIGlzIG9ubHkgbGFzdCBldmVudCBhZGRlZCB0byBhbGxFdmVudHMgYXJyYXlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlcy5pbnB1dCA9IHRoaXMuYWxsRXZlbnRzLmxlbmd0aCA+IDAgPyB0aGlzLmFsbEV2ZW50cyA6ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBWRCAyMyBPY3QyNCAtIGZpbGUgdHlwZSBjaGFuZ2VzXG4gICAgICAgICAgZWxzZSBpZiAocXVlcy50eXBlID09PSAnRmlsZScpIHtcbiAgICAgICAgICAgIHF1ZXMuaW5wdXQgPSBbXTtcbiAgICAgICAgICAgIHF1ZXMuaW5wdXQgPSB2YWx1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYocXVlcy50eXBlID09PSBcIkJvb2xlYW5cIikgeyAvLyBTS1MyM0pVTjI1IGRlZmF1bHRseSBzZXQgdmFsdWUgZmFsc2VcbiAgICAgICAgICAgIHF1ZXMuaW5wdXQgPSB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnID8gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09ICd0cnVlJyA6IHR5cGVvZiBxdWVzLmRlZmF1bHRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyBxdWVzLmRlZmF1bHRWYWx1ZSA9PT0gdHJ1ZSB8fCBxdWVzLmRlZmF1bHRWYWx1ZSA9PT0gJ3RydWUnIDogZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHF1ZXMuaW5wdXQgPSB2YWx1ZSB8fCBxdWVzLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hbnN3ZXJMaXN0LnB1c2gocXVlcyk7IC8vIEhBIDEyRkVCMjQgVG8gZ2l2ZSB0aGUgdmFsdWUgZm9yIGRhdGFcbiAgICAgICAgICBicmVhazsgLy8gQVAtMDNKVU4yNSAtIE1hdGNoIGZvdW5kIGFuZCB2YWx1ZSBib3VuZDsgbm8gbmVlZCB0byBjb250aW51ZSB0aGUgbG9vcFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgIHF1ZXMudHlwZSA9PT0gJ0Jvb2xlYW4nID8gcXVlcy5pbnB1dCA9IGZhbHNlIDogcXVlcy5pbnB1dCA9IG51bGwgIC8vIFNLUzIzSlVOMjUgZGVmYXVsdGx5IHNldCB2YWx1ZSBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IHF1ZXN0aW9uID0ge307XG4gICAgICBxdWVzdGlvblsnaWQnXSA9IHF1ZXMuaWQ7XG4gICAgICBxdWVzdGlvblsnaW5wdXQnXSA9IHF1ZXMuaW5wdXQgfHwgcXVlcy5kZWZhdWx0VmFsdWUgIHx8IG51bGw7XG4gICAgICAvLyBIQSAxMkZFQjI0IFRvIGJpbmQtb3V0IExvY2F0aW9uIFR5cGVcbiAgICAgIGlmIChxdWVzLnR5cGUgPT09ICdMb2NhdGlvbicpIHtcbiAgICAgICAgcXVlc3Rpb25bJ2lucHV0J10gPSBxdWVzLmlucHV0ID8gcXVlcy5pbnB1dCA6IHF1ZXMuc2VsZWN0ZWRWYWx1ZSB8fCBudWxsO1xuICAgICAgfSBlbHNlIGlmIChxdWVzLnR5cGUgPT0gJ0ZpbGUnKSB7XG4gICAgICAgIC8vIFZEIDIzIE9jdDI0IC0gZmlsZSB0eXBlIGNoYW5nZXNcbiAgICAgICAgcXVlc3Rpb25bJ2lucHV0J10gPSBxdWVzLmlucHV0ID8gcXVlcy5pbnB1dCA6IHF1ZXMuZGVmYXVsdFZhbHVlIHx8IFtdO1xuICAgICAgfSAgZWxzZSBpZihxdWVzLnR5cGUgPT09IFwiQm9vbGVhblwiKSB7IC8vIFNLUzIzSlVOMjUgZGVmYXVsdGx5IHNldCB2YWx1ZSBmYWxzZVxuICAgICAgICBxdWVzdGlvblsnaW5wdXQnXSA9IHR5cGVvZiBxdWVzLmlucHV0ICE9PSAndW5kZWZpbmVkJyA/IHF1ZXMuaW5wdXQgPT09IHRydWUgfHwgcXVlcy5pbnB1dCA9PT0gJ3RydWUnIDogdHlwZW9mIHF1ZXMuZGVmYXVsdFZhbHVlICE9PSAndW5kZWZpbmVkJyA/IHF1ZXMuZGVmYXVsdFZhbHVlID09PSB0cnVlIHx8IHF1ZXMuZGVmYXVsdFZhbHVlID09PSAndHJ1ZScgOiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHF1ZXN0aW9uWyd0eXBlJ10gPSBxdWVzLnR5cGU7XG4gICAgICBxdWVzdGlvblsncXVlc3Rpb25OdW1iZXInXSA9IHF1ZXMucXVlc3Rpb25OdW1iZXI7XG4gICAgICBxdWVzdGlvblsncmVmZXJlbmNlRmllbGQnXSA9IHF1ZXM/LnJlZmVyZW5jZUZpZWxkO1xuICAgICAgcXVlc3Rpb25bJ3NlbGVjdGVkVmFsdWUnXSA9IHF1ZXM/LnNlbGVjdGVkVmFsdWU7ICAvLyBNUiAzMUpBTjI0IE5lZWQgdG8gcGFzcyB0aGUgc2VsZWN0ZWQgdmFsdWUgdG9vXG4gICAgICB0aGlzLmFuc3dlckxpc3QucHVzaChxdWVzdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzIGZvciBkYXRhIGJpbmRJblxuICBhZGRFdmVudChkYXk6IGFueSwgZW50cnlRdWVzKSB7XG4gICAgLy8gVHJhbnNmb3JtIG5ldyBlbnRyaWVzIGludG8gdGhlIGRlc2lyZWQgZm9ybWF0XG4gICAgY29uc3QgbmV3RW50cmllcyA9IGVudHJ5UXVlcy5yZWR1Y2UoKGFjYywgcSkgPT4ge1xuICAgICAgYWNjW3EuaWRdID0geyAuLi5xIH07XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcblxuICAgIC8vIEZpbmQgaWYgYW4gZXZlbnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoZSBnaXZlbiBkYXRlXG4gICAgY29uc3QgZXhpc3RpbmdFdmVudCA9IHRoaXMuYWxsRXZlbnRzLmZpbmQoZXZlbnQgPT4gZXZlbnQuZGF0ZS50b0RhdGVTdHJpbmcoKSA9PT0gZGF5LnRvRGF0ZVN0cmluZygpKTtcblxuICAgIGlmIChleGlzdGluZ0V2ZW50KSB7XG4gICAgICAvLyBJZiB0aGUgZXZlbnQgZXhpc3RzLCBwdXNoIHRoZSBuZXcgZW50cmllcyB0byB0aGUgZXhpc3RpbmcgZW50cmllc1xuICAgICAgY29uc3QgZXhpc3RpbmdFbnRyaWVzID0gZXhpc3RpbmdFdmVudC5lbnRyaWVzLm1hcChlbnRyeSA9PiAoeyAuLi5lbnRyeSB9KSk7XG4gICAgICBleGlzdGluZ0VudHJpZXMucHVzaChuZXdFbnRyaWVzKTtcbiAgICAgIGV4aXN0aW5nRXZlbnQuZW50cmllcyA9IGV4aXN0aW5nRW50cmllcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGV2ZW50IGlmIGl0IGRvZXNuJ3QgZXhpc3QgZm9yIHRoZSBnaXZlbiBkYXRlXG4gICAgICBjb25zdCBuZXdFdmVudCA9IHtcbiAgICAgICAgaWQ6ICdfJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KSxcbiAgICAgICAgZGF0ZTogZGF5LFxuICAgICAgICBlbnRyaWVzOiBbbmV3RW50cmllc10gLy8gV3JhcCB0aGUgbmV3IGVudHJpZXMgaW4gYW4gYXJyYXlcbiAgICAgIH07XG4gICAgICB0aGlzLmFsbEV2ZW50cy5wdXNoKG5ld0V2ZW50KTtcbiAgICB9XG4gIH1cblxuXG4gIHJlYWRRdWVzdGlvbnMocWJJZDogc3RyaW5nKSB7XG4gICAgbGV0IHF1ZXN0aW9ucyA9IFtdO1xuICAgIC8vIEhBIDMxLUpBTi0yNCBBZGRlZCB0ZXJuYXJ5IHRvIGF2b2lkIHVuZGVmaW5lZFxuICAgIGZvciAodmFyIHNxIGluIHRoaXMuYm9va1F1ZXN0aW9uc01hcD8uZ2V0KHFiSWQpPy5zdWJRdWVzdGlvbnMpIHtcbiAgICAgIC8vIEFQLTE0TUFZMjUgRXh0cmFjdGVkIHF1ZXN0aW9uIGZyb20gc3ViUXVlc3Rpb25zIGludG8gdmFyaWFibGUgJ3EnXG4gICAgICBsZXQgcTogYW55ID0gdGhpcy5ib29rUXVlc3Rpb25zTWFwPy5nZXQocWJJZCkuc3ViUXVlc3Rpb25zW3NxXTtcbiAgICAgIC8vIEhBIDA5RkVCMjQgaWYgcXVlc3Rpb24gaXMgdGhlcmUgcHJvY2Vzc1xuICAgICAgaWYgKHEpIHtcbiAgICAgICAgaWYgKChxLnR5cGUgPT0gJ0Ryb3Bkb3duJyB8fCBxLnR5cGUgPT0gJ1JhZGlvJykgJiYgdGhpcy5zcU9wdGlvbnMuZ2V0KHEuaWQpKSB7XG4gICAgICAgICAgcXVlc3Rpb25zLnB1c2godGhpcy5zcU9wdGlvbnMuZ2V0KHEuaWQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWVzdGlvbnMucHVzaChxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZEIDEySnVuMjQgZmllbGQgcGVybWlzaXNpb24gY2hhbmdlc1xuICAgIGlmICh0aGlzLmZpZWxkUmVzdHJpY3Rpb25zKSB7XG4gICAgICBjb25zdCBmaWVsZFJlc3RyaWN0aW9ucyA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXModGhpcy5maWVsZFJlc3RyaWN0aW9ucy5maWVsZHMpKTtcbiAgICAgIHF1ZXN0aW9ucy5mb3JFYWNoKHF1ZXMgPT4ge1xuICAgICAgICBjb25zdCByZXN0cmljdGlvbiA9IGZpZWxkUmVzdHJpY3Rpb25zLmdldChxdWVzLnVuaXF1ZUlkZW50aWZpZXIpO1xuXG4gICAgICAgIGlmIChyZXN0cmljdGlvbikge1xuICAgICAgICAgIHF1ZXMuaXNSZWFkT25seSA9IHJlc3RyaWN0aW9uID09PSAncmVhZE9ubHknO1xuICAgICAgICAgIHF1ZXMuaXNIaWRkZW4gPSByZXN0cmljdGlvbiA9PT0gJ2hpZGUnO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXN0aW9ucztcbiAgfVxuICAvLyBWRCAxMUp1bjI0IC0gdHJhbnNsYXRpb24gY2hhbmdlc1xuICByZWFkVHJhbnNRdWVzdGlvbnMocWJJZDogc3RyaW5nKSB7XG4gICAgbGV0IHJlY29yZCA9IFtdO1xuICAgIGxldCB0cmFuc2xhdGVSZWNvcmQgPSB0aGlzLnRyYW5zbGF0ZU1hcC5nZXQocWJJZCk7XG4gICAgaWYgKHRyYW5zbGF0ZVJlY29yZCAmJiB0cmFuc2xhdGVSZWNvcmQubGVuZ3RoID4gMCkge1xuICAgICAgdHJhbnNsYXRlUmVjb3JkLmZvckVhY2gobGFuUmVjID0+IHtcbiAgICAgICAgaWYgKGxhblJlYy5sYW5ndWFnZUNvZGUgPT0gdGhpcy5sYW5ndWFnZUNvZGUpIHtcbiAgICAgICAgICByZWNvcmQgPSBsYW5SZWMuZmllbGRzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9XG5cbiAgZ2V0VGV4dCh2YWx1ZSkge1xuICAgIHZhciBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHZhbHVlLCBcInRleHQvaHRtbFwiKTtcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoXG4gICAgICBkb2MuZG9jdW1lbnRFbGVtZW50LnRleHRDb250ZW50XG4gICAgKTtcbiAgfVxuICBnZXREcm9wRG93bihldmVudDogYW55KSB7XG4gICAgdGhpcy5oYWRsZURyb3BEb3duRGVwZW5kZW50LmVtaXQoZXZlbnQpO1xuICB9XG4gIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlc1xuICBnZXRDYWxlbmRhckRhdGUoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuaGFuZGxlQ2FsZW5kYXJEYXRlLmVtaXQoZXZlbnQpO1xuICB9XG4gIGdldENhbGVuZGFyRXZlbnQoZXZlbnQ6IGFueSkge1xuICAgIGV2ZW50W1wibnh0SWRcIl0gPSBPYmplY3Qua2V5cyh0aGlzLmJvb2tsZXRKU09OPy5ib29rUXVlc3Rpb25zTWFwKVswXTtcbiAgICB0aGlzLmhhbmRsZUNhbGVuZGFyRXZlbnQuZW1pdChldmVudCk7XG4gIH1cbiAgZWRpdENoYW5nZUNsaWNrKGFjdGlvbjogYW55KXtcbiAgICB0aGlzLmlzRWRpdCA9IHRydWVcbiAgfVxufVxuIiwiPCEtLSBCb29rbGV0IEhhbmRsaW5nLS0+XG48IS0tIEhBIDE5REVDMjMgRm9yIERpcmVjdGlvbiAtLT5cbjxkaXYgKm5nRm9yPVwibGV0IHFiIG9mIGJvb2tsZXRcIiBbbmdDbGFzc109XCJsYW5nRGlyZWN0aW9uXCI+XG4gICAgPCEtLSBNUiBDb21tZW50ZWQgYmVsb3cgY29kZSB0byBlbnN1cmUgc2luZ2xlIEpTT04gZm9yIFVOQ09ORElUSU9OQUwgQm9va2xldHMgLS0+XG4gICAgPCEtLSBSUyAwOURFQzI0IENoYW5nZWQga2V5cy0tPlxuICAgIDwhLS0gPGxpYi1xdWVzdGlvbm5haXJlIFtzZXJ2XT1cInNlcnZcIiBbcWJJZF09XCJxYi5pZFwiIFt0a25dPVwidGtuXCI+PC9saWItcXVlc3Rpb25uYWlyZT4gLS0+XG4gICAgPCEtLSBIQSAyOERFQzIzIEJlbG93IElmIGxvZ2ljIGlzIHRvIGxvYWQgZnJvbSBib29rbGV0ICAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwicWIuc3ViUXVlc3Rpb25zOyBlbHNlIGVsc2VCbG9ja1wiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBxdWVzIG9mIHFiLnN1YlF1ZXN0aW9uc1wiIGNsYXNzPVwicXVlc3Rpb25kaXYxXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gSEEgMTdKQU4yNCAtIElzIHRpdGxlIGlzIGVuYWJsZWQgc28gdGhhdCBiYXNlZCBvbiB0aGUgYm9vbGVhbiBkaXYgd2lsbCBiZSB2aXNpYmxlIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzLmlzVGl0bGVcIiBbY2xhc3NdPVwicWIuaXNTaGVuZ2VsID8gJ2hlYWRlci1zdHlsZScgOiAncXVlc3Rpb24tZi1zaXplIGFkZGl0aW9uYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gVkQgMDhOT1YyMyAtIHNob3dpbmcgbGFiZWwgd2hlbiBpdHMgYXZhaWxhYmxlLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJnZXRUZXh0KHF1ZXM/LnF1ZXN0aW9uVGV4dClcIiAqbmdJZj1cInF1ZXM/LnF1ZXN0aW9uVGV4dCAmJiBxdWVzPy5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHF1ZXM/LnF1ZXN0aW9uVGV4dCB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gPCEtLSBWRCAxOUpBTjI0IC0gZ2V0dGluZyB0b2tlbiBhcyBpbnB1dCAtLT4gPCEtLVZEIDExSnVuMjQgLSB0cmFuc2xhdGlvbiBjaGFuZ2VzLS0+XG4gICAgICAgICAgICAgICAgPCEtLVZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlcy0tPlxuICAgICAgICAgICAgICAgIDwhLS0gQVAtMTRNQVkyNSAtIEFkZGVkIFtkYXRhQmluZF0gaW5wdXQgYmluZGluZyAtLT5cbiAgICAgICAgICAgICAgICAgPCEtLSBBUC0xOU1BWTI1IC0gQWRkZWQgW2lzRWRpdF0gYmluZGluZyAtLT4gXG4gICAgICAgICAgICAgICAgICA8IS0tIC8vTVNNMTBKVUwyNSAgYWxsSWNvbnMsIHRoZW1lQ29sb3IsIGNkbkljb25VUkwgYWRkZWQgZm9yIGljb24tc2VsZWN0b3ItLT5cbiAgICAgICAgICAgICAgICA8bGliLXF1ZXN0aW9uYm9vayBbcWJJdGVtXT1cInFiXCIgW3Rva2VuXT1cInRva2VuXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxWYWx1ZV09XCJsYWJlbFZhbHVlXCJcbiAgICAgICAgICAgICAgICBbcXVlc3Rpb25JdGVtXT1cInF1ZXNcIlxuICAgICAgICAgICAgICAgIFt0cmFuc2xhdGVkUXVlc3Rpb25zXT1cInJlYWRUcmFuc1F1ZXN0aW9ucyhxYi5pZClcIlxuICAgICAgICAgICAgICAgIFtxdWVzdGlvbnNdPVwicmVhZFF1ZXN0aW9ucyhxYi5pZClcIlxuICAgICAgICAgICAgICAgIChoYW5kbGVEcm9wRG93bik9XCJnZXREcm9wRG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoaGFuZGxlQ2FsZW5kYXJEYXRlKT1cImdldENhbGVuZGFyRGF0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoaGFuZGxlQ2FsZW5kYXJFdmVudCk9XCJnZXRDYWxlbmRhckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChzaW5nbGVGaWVsZENoYW5nZUVtaXQpID0nc2luZ2xlRmllbGRDaGFuZ2UoJGV2ZW50KSdcbiAgICAgICAgICAgICAgICBbZGF0YUJpbmRdPVwiZGF0YUJpbmRcIlxuICAgICAgICAgICAgICAgIFtpc0VkaXRdPVwiaXNFZGl0XCIgXG4gICAgICAgICAgICAgICAgW2FsbEljb25zXT1cImFsbEljb25zXCJcbiAgICAgICAgICAgICAgICBbdGhlbWVDb2xvcl09XCJ0aGVtZUNvbG9yXCJcbiAgICAgICAgICAgICAgICBbY2RuSWNvblVSTF09XCJjZG5JY29uVVJMXCJcbiAgICAgICAgICAgICAgICA+PC9saWItcXVlc3Rpb25ib29rPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gSEEgMjhERUMyMyBCZWxvdyBlbHNlIGxvZ2ljIGlzIHRvIGxvYWQgZnJvbSBib29rcyBvciBxdWVzdGlvbnMgLS0+XG4gICAgPG5nLXRlbXBsYXRlICNlbHNlQmxvY2s+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJxdWVzdGlvbmRpdjFcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFxYi5pc1RpdGxlXCIgW2NsYXNzXT1cInFiLmlzU2hlbmdlbCA/ICdoZWFkZXItc3R5bGUnIDogJ3F1ZXN0aW9uLWYtc2l6ZSBhZGRpdGlvbmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIFZEIDA4Tk9WMjMgLSBzaG93aW5nIGxhYmVsIHdoZW4gaXRzIGF2YWlsYWJsZS0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiZ2V0VGV4dChxYj8ucXVlc3Rpb25UZXh0KVwiICpuZ0lmPVwicWI/LnF1ZXN0aW9uVGV4dCAmJiBxYj8uc3R5bGU/LnNob3dMYWJlbCAhPT0gZmFsc2VcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBxYj8ucXVlc3Rpb25UZXh0IH19XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBxYj8udGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+IDwhLS0gVkQgMTlKQU4yNCAtIGdldHRpbmcgdG9rZW4gYXMgaW5wdXQgLS0+IDwhLS0gIC8vIFZEIDExSnVuMjQgLSB0cmFuc2xhdGlvbiBjaGFuZ2VzLS0+XG4gICAgICAgICAgICAgICAgPGxpYi1xdWVzdGlvbmJvb2sgW3FiSXRlbV09XCJxYlwiIFt0b2tlbl09XCJ0b2tlblwiIFtsYWJlbFZhbHVlXT1cImxhYmVsVmFsdWVcIiBbcXVlc3Rpb25JdGVtXT1cInFiXCIgW3RyYW5zbGF0ZWRRdWVzdGlvbnNdPVwicmVhZFRyYW5zUXVlc3Rpb25zKHFiLmlkKVwiIFtxdWVzdGlvbnNdPVwicmVhZFF1ZXN0aW9ucyhxYi5pZClcIiAgKGhhbmRsZURyb3BEb3duKT1cImdldERyb3BEb3duKCRldmVudClcIj48L2xpYi1xdWVzdGlvbmJvb2s+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDwhLS0gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXMtLT5cbiAgICA8IS0tIEdyb3VwIEFjdGlvbnMgLS0+XG4gICAgPCEtLSBIQSAxOURFQzIzIEZvciBEaXJlY3Rpb24gLS0+XG4gICAgPCEtLSBBUCAyM01BWTI1IC0gQWN0aW9uIEJ1dHRvbnM6IER5bmFtaWNhbGx5IHBvc2l0aW9uZWQgYnV0dG9ucyB3aXRoIEpTT04tY29uZmlndXJlZCBzdHlsZXMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImFsaWduLXN1Ym1pdC1yb3dcIiAqbmdJZj1cImFiSXRlbT8uc3RhdHVzICE9ICdDb21wbGV0ZWQnXCIgW25nQ2xhc3NdPVwibGFuZ0RpcmVjdGlvblwiPiA8IS0tIHBvc2l0aW9uLXJlbGF0aXZlIHJlbW92ZWQgaW4gdGhpcyB0YWctLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBhY3Rpb25zOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJhY3Rpb24ud2lkdGggfHwgMTAwXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1yaWdodDogMTBweDtcIj4gIDwhLS0gc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IFtzdHlsZS5sZWZ0LiVdPVwiYWN0aW9uLnBvc2l0aW9uUGVyY2VudCB8fCAwXCIgIHJlbW92ZWQgaW4gdGhpcyB0YWcgLS0+XG4gICAgICAgICAgICAgICAgQGlmKCFpc0VkaXQgJiYgYWN0aW9uLm5hbWUgPT09ICdTYXZlJyl7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdENoYW5nZUNsaWNrKGFjdGlvbilcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGZjLWJ1dHRvbiBueHRCdXR0b24gYWN0aW9uLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuLS1idG4tYmddPVwiYWN0aW9uLmJnQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYWN0aW9uLmJnQ29sb3IgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImFjdGlvbi50ZXh0Q29sb3IgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlci1yYWRpdXMucHhdPVwiYWN0aW9uLmJvcmRlclJhZGl1cyB8fCA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBFZGl0XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQm9va2xldEFjdGlvbkNsaWNrKGFjdGlvbilcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGZjLWJ1dHRvbiBueHRCdXR0b24gYWN0aW9uLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuLS1idG4tYmddPVwiYWN0aW9uLmJnQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYWN0aW9uLmJnQ29sb3IgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImFjdGlvbi50ZXh0Q29sb3IgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlci1yYWRpdXMucHhdPVwiYWN0aW9uLmJvcmRlclJhZGl1cyB8fCA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBhY3Rpb24ubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
645
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va2xldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYm9va2xldC9ib29rbGV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9ib29rbGV0L2Jvb2tsZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFJVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFJWixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFRdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU03QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7Ozs7Ozs7OztBQWMxRSxNQUFNLE9BQU8sZ0JBQWdCO0lBMENqQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQS9DRCxTQUFTLENBQVM7SUFDbEIsSUFBSSxDQUFTO0lBQ2IsR0FBRyxDQUFTO0lBQ1osV0FBVyxDQUFNO0lBQ2pCLFFBQVEsQ0FBTSxDQUFDLDBDQUEwQztJQUN6RCxVQUFVLENBQVMsQ0FBQywwQ0FBMEM7SUFDOUQsVUFBVSxDQUFTLENBQUMsMENBQTBDO0lBQzlELHFCQUFxQixDQUFNO0lBQzNCLFVBQVUsQ0FBUztJQUNuQixLQUFLLENBQVM7SUFDZCxZQUFZLEdBQVcsSUFBSSxDQUFDLENBQUUsbUNBQW1DO0lBQ2pFLGlCQUFpQixDQUFNLENBQUMsdUNBQXVDO0lBQy9ELElBQUksQ0FBTSxDQUFDLGdDQUFnQztJQUMzQyxNQUFNLENBQU0sQ0FBQyw2RUFBNkU7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LHFCQUFxQjtzQkFBL0MsU0FBUzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIE9uQ2hhbmdlcyxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBFbGVtZW50UmVmLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XG5pbXBvcnQgeyBBY3Rpb25NZXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hY3Rpb25NZXRhJztcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uLy4uL3dyYXBwZXJcIjtcbmltcG9ydCB7IEJvb2tsZXRXcmFwcGVyIH0gZnJvbSBcIi4uLy4uL21vZGVsL2Jvb2tsZXRXcmFwcGVyXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7IFF1ZXN0aW9uYm9va0NvbXBvbmVudCB9IGZyb20gXCIuLi9xdWVzdGlvbmJvb2svcXVlc3Rpb25ib29rLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IFNhbGVzZm9yY2VTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3NhbGVzZm9yY2Uvc2FsZXNmb3JjZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBEYXRhU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9kYXRhL2RhdGEuc2VydmljZVwiO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc3RvcmFnZS9zdG9yYWdlLnNlcnZpY2VcIjtcbmltcG9ydCB7IENoYW5nZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvY2hhbmdlL2NoYW5nZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvdHJhbnNsYXRpb24vdHJhbnNsYXRpb24uc2VydmljZVwiO1xuaW1wb3J0IHsgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZSB9IGZyb20gXCIuLi8uLi9waXBlL2N1c3RvbS10cmFuc2xhdGUucGlwZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItYm9va2xldCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgUXVlc3Rpb25ib29rQ29tcG9uZW50LFxuICAgIE54dEN1c3RvbVRyYW5zbGF0ZVBpcGVcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jvb2tsZXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ib29rbGV0LmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBCb29rbGV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgYm9va2xldElkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNlcnY6IHN0cmluZztcbiAgQElucHV0KCkgdGtuOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJvb2tsZXRKU09OOiBhbnk7XG4gIEBJbnB1dCgpIGFsbEljb25zOiBhbnk7IC8vTVNNMTBKVUwyNSBpY29uIHNlbGVjdG9yIGNvbXBvbmVudCBpbnB1dFxuICBASW5wdXQoKSB0aGVtZUNvbG9yOiBzdHJpbmc7IC8vTVNNMTBKVUwyNSBpY29uIHNlbGVjdG9yIGNvbXBvbmVudCBpbnB1dFxuICBASW5wdXQoKSBjZG5JY29uVVJMOiBzdHJpbmc7IC8vTVNNMTBKVUwyNSBpY29uIHNlbGVjdG9yIGNvbXBvbmVudCBpbnB1dFxuICBASW5wdXQoKSBkcm9wZG93bkRlcGVuZGVudERhdGE6IGFueTtcbiAgQElucHV0KCkgbGFiZWxWYWx1ZTogc3RyaW5nO1xuICBASW5wdXQoKSB0b2tlbjogc3RyaW5nO1xuICBASW5wdXQoKSBsYW5ndWFnZUNvZGU6IHN0cmluZyA9ICdlbic7ICAvLyBWRCAxMUp1bjI0IC0gdHJhbnNsYXRpb24gY2hhbmdlc1xuICBASW5wdXQoKSBmaWVsZFJlc3RyaWN0aW9uczogYW55OyAvLyBWRCAxMkp1bjI0IC0gZmllbGQgcGVybWlzc2lvbiBjaGFuZ2VcbiAgQElucHV0KCkgZnJvbTogYW55OyAvLyBGb3JtIEJ1aWxkZXIgZGVwZW5kZW50IGNoYW5nZVxuICBASW5wdXQoKSBhcGlVcmw6IGFueTsgLy8gQVAtMTZBUFIyNSBJbnB1dCBwcm9wZXJ0eSB0byByZWNlaXZlIHRoZSBBUEkgVVJMIGZyb20gdGhlIHBhcmVudCBjb21wb25lbnRcbiAgQElucHV0KCkgaXNFZGl0OiBib29sZWFuIDsgLy8gQVAtMTlNQVkyNSAtIEFkZGVkIGlzRWRpdCBpbnB1dFxuICBASW5wdXQoKSBkaXJlY3Rpb24gPSAnbHRyJzsgXG5cbiAgQE91dHB1dCgpIGhhbmRsZUJvb2tsZXRBY3Rpb25FdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBoYW5kbGVQYWdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGhhZGxlRHJvcERvd25EZXBlbmRlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvLyBWRCAwNlNlcDI0IGNhbGVuZGFyIGNoYW5nZXNcbiAgQE91dHB1dCgpIGhhbmRsZUNhbGVuZGFyRGF0ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBoYW5kbGVDYWxlbmRhckV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgbnh0Qm9va2xldDogQm9va2xldFdyYXBwZXI7XG5cbiAgcHVibGljIGJvb2tsZXQ6IGFueVtdID0gW107XG4gIHB1YmxpYyBhYkl0ZW06IGFueSA9IHt9O1xuICBwdWJsaWMgYWN0aW9uczogQWN0aW9uTWV0YVtdID0gW107XG4gIHB1YmxpYyBib29rUXVlc3Rpb25zTWFwOiBhbnkgPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc3FPcHRpb25zOiBhbnkgPSBuZXcgTWFwKCk7XG4gIHB1YmxpYyBpc0Fuc3dlckZsYWc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHNwaW5uZXJOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBzcGlubmVyVHlwZTogc3RyaW5nO1xuICBhbnN3ZXJMaXN0ID0gW107IC8vIEhBIDExLUpBTi0yNCBBbnN3ZXJsaXN0IHRvIHN0b3JlIHRoZSBtaW5pbWFsIHZhbHVlXG4gIEBJbnB1dCgpIGRhdGFCaW5kOiBhbnk7Ly8gSEEgMTgtSkFOLTI0IFRvIGluc2VydCB0aGUgZW5kcG9pbnQgdmFsdWUgdG8gdGhlIHF1ZXN0aW9uXG4gIGFsbEV2ZW50czogYW55W10gPSBbXTsgIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlc1xuICAvL0FQLTE5TUFZMjUgLSBBY2Nlc3NpbmcgdGhlIFF1ZXN0aW9uYm9va0NvbXBvbmVudCBpbnN0YW5jZSB1c2luZyBWaWV3Q2hpbGQgcmVmZXJlbmNlXG4gIEBWaWV3Q2hpbGQoJ3F1ZXN0aW9uYm9vaycpIHF1ZXN0aW9uYm9va0NvbXBvbmVudCE6IFF1ZXN0aW9uYm9va0NvbXBvbmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNmU2VydmljZTogU2FsZXNmb3JjZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIGNoYW5nZVNlcnZpY2U6IENoYW5nZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgdHJhbnNsYXRpb25TZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5zcGlubmVyTmFtZSA9IFwic3AxXCI7XG4gICAgdGhpcy5zcGlubmVyVHlwZSA9IFwiYmFsbC1zcGluLWNsb2Nrd2lzZVwiO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5wcm9jZXNzQm9va2xldCgpO1xuICAgIC8vQVAtMTZBUFIyNSAvLyBHZXQgdGhlIGR5bmFtaWMgQVBJIFVSTCBhbmQgcGFzcyBpdCB0byB0aGUgc2VydmljZSBtZXRob2RcbiAgICBsZXQgYXBpZGF0YSA9ICB0aGlzLmFwaVVybDtcbiAgICB0aGlzLmRhdGFTZXJ2aWNlLmFwaWtleShhcGlkYXRhKTtcbiAgICB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5zZXRMYW5ndWFnZSh0aGlzLmxhbmd1YWdlQ29kZSlcbiAgICB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS51cGRhdGVUcmFuc2xhdGlvbnModGhpcy5ib29rbGV0SlNPTi50cmFuc2xhdGlvbk1hcClcbiAgfVxuICAvLyBWRCBOT1YyMyAtIHVwZGF0ZSB0aGUganNvbiBkYXRhIHdoZW4gYm9va2xldElkIGFuZCBib29rbGV0SlNPTiBjaGFuZ2VzXG4gIG5nT25DaGFuZ2VzKHNpbXBsZWNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAvLyBIQSAyM0pBTjI0IFRvIGF2b2lkIHVuZGVmaW5lZCBlcnJvclxuICAgIGlmIChzaW1wbGVjaGFuZ2VzWydib29rbGV0SWQnXSB8fCAoc2ltcGxlY2hhbmdlc1snYm9va2xldEpTT04nXSAmJiBzaW1wbGVjaGFuZ2VzWydib29rbGV0SlNPTiddLmN1cnJlbnRWYWx1ZSAhPSBudWxsKSB8fCAoc2ltcGxlY2hhbmdlc1snZGF0YUJpbmQnXSAmJiBzaW1wbGVjaGFuZ2VzWydkYXRhQmluZCddLmN1cnJlbnRWYWx1ZSAhPSBudWxsKSkge1xuICAgICAgdGhpcy5hbGxFdmVudHMgPSBbXTtcbiAgICAgIHRoaXMucHJvY2Vzc0Jvb2tsZXQoKTtcbiAgICB9XG4gICAgLy9BUC0xOU1BWTI1IC0gSWYgYm9va2xldEpTT04gaW5wdXQgY2hhbmdlcywgdHJpZ2dlciBwcm9jZXNzRGF0YSBvbiBRdWVzdGlvbmJvb2tDb21wb25lbnRcbiAgICBpZiAoc2ltcGxlY2hhbmdlc1snYm9va2xldEpTT04nXSkge1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gc2ltcGxlY2hhbmdlc1snYm9va2xldEpTT04nXS5jdXJyZW50VmFsdWU7XG4gICAgLy9BUC0yOE1BWTI1IC0gSWYgdGhlIGFjdGlvbiBpcyBhIHN0cmluZywgdXBncmFkZSBpdCB0byB0aGUgbmV3IGFjdGlvbiBtb2RlbCAoYXJyYXkgb2Ygb2JqZWN0cylcbiAgICAgIGlmIChjdXJyZW50VmFsdWU/LnF1ZXN0aW9uYm9vaz8uYWN0aW9uICYmIHR5cGVvZiBjdXJyZW50VmFsdWUucXVlc3Rpb25ib29rLmFjdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY3VycmVudFZhbHVlLnF1ZXN0aW9uYm9vay5hY3Rpb24gPSB0aGlzLnVwZ3JhZGVBY3Rpb25zKGN1cnJlbnRWYWx1ZS5xdWVzdGlvbmJvb2suYWN0aW9uKTtcbiAgICAgIH0gIFxuICAgICAgaWYgKHRoaXMucXVlc3Rpb25ib29rQ29tcG9uZW50KXtcbiAgICAgICAgdGhpcy5xdWVzdGlvbmJvb2tDb21wb25lbnQucHJvY2Vzc0RhdGEoKVxuICAgICAgfVxuICAgICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudXBkYXRlVHJhbnNsYXRpb25zKHRoaXMuYm9va2xldEpTT04udHJhbnNsYXRpb25NYXApXG4gICAgfVxuICAgIGlmKHRoaXMubGFuZ3VhZ2VDb2RlKXtcbiAgICAgIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnNldExhbmd1YWdlKHRoaXMubGFuZ3VhZ2VDb2RlKVxuICAgIH1cbiAgfVxuICAvLyBBUC0yOE1BWTI1IC0gQ29udmVydHMgb2xkIGFjdGlvbiBzdHJpbmcgKEpTT04pIGludG8gYSBuZXcgbW9kZWwgKGFycmF5IG9mIGFjdGlvbiBvYmplY3RzKVxuICB1cGdyYWRlQWN0aW9ucyhhY3Rpb25TdHJpbmc6IHN0cmluZyk6IGFueVtdIHtcbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IHRvIHBhcnNlIHRoZSBhY3Rpb24gc3RyaW5nIHRvIEpTT05cbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoYWN0aW9uU3RyaW5nKTtcbiAgLy8gQVAtMjhNQVkyNSBJZiBwYXJzZWQgcmVzdWx0IGlzIGFuIGFycmF5LCBhcHBseSBkZWZhdWx0IHN0eWxlcyBhbmQgYWRqdXN0IHBvc2l0aW9uXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJzZWQpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZWQubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgIHBvc2l0aW9uUGVyY2VudDogaXRlbS5uYW1lID09PSAnQ2FuY2VsJyA/IDMgOiAxNCwgLy8gU2V0IHBvc2l0aW9uIGJhc2VkIG9uIGFjdGlvbiBuYW1lXG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICB0ZXh0Q29sb3I6ICcjZmZmZmZmJyxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IDYsXG4gICAgICAgICAgaWQ6IGluZGV4XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiSW52YWxpZCBKU09OIGFjdGlvbiBmb3JtYXRcIiwgZSk7XG4gICAgfVxuICBcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBwcm9jZXNzQm9va2xldCgpIHsgXG4gICAgaWYgKHRoaXMuYm9va2xldElkKSB7XG4gICAgICBpZiAodGhpcy5ib29rbGV0SWQubGVuZ3RoID09IDE4KSB7XG4gICAgICAgIHRoaXMucmVhZEJvb2tsZXQodGhpcy5ib29rbGV0SWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5ib29rbGV0SlNPTikge1xuICAgICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudXBkYXRlVHJhbnNsYXRpb25zKHRoaXMuYm9va2xldEpTT04udHJhbnNsYXRpb25NYXApXG4gICAgICAvLyBUcnkgdG8gcGFzcyBhIHZhbHVlIGZyb20gQmFja2VuZCB0byBkaWZmZXJlbnRpYXRlIHRoZSBRdWVzdGlvbkJvb2sgUmVhZCBhbmQgQW5zd2VyQm9vayBSZWFkXG4gICAgICB0aGlzLmlzQW5zd2VyRmxhZyA9IHRydWU7XG5cbiAgICAgIGlmICh0aGlzLmJvb2tsZXRKU09OICE9IG51bGwgJiYgdGhpcy5ib29rbGV0SlNPTiAhPSB1bmRlZmluZWQgJiYgdGhpcy5ib29rbGV0SlNPTj8uYm9va1F1ZXN0aW9uc01hcCkge1xuICAgICAgICAvLyBTS1MyOE1BUjI1IGdldCB0aGUgbmVzdGVkIHJlZmVyZW5jZSBxYiBcbiAgICAgICAgbGV0IHRlbXBib29rID0gdGhpcy5ib29rbGV0SlNPTj8uYm9va1F1ZXN0aW9uc01hcFtPYmplY3Qua2V5cyh0aGlzLmJvb2tsZXRKU09OPy5ib29rUXVlc3Rpb25zTWFwKVswXV0uc3ViUXVlc3Rpb25zO1xuICAgICAgICB0ZW1wYm9vay5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJib29rXCIgJiYgZWxlbWVudD8ucWJSZWZlcmVuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0UmVmUWJEYXRhKGVsZW1lbnQ/LnFiUmVmZXJlbmNlKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRbJ3FiUmVmZXJlbmNlUXVlc3Rpb25zJ10gPSByZXNwb25zZTsgLy8gQXNzaWduIHJlc3BvbnNlIHRvIHFiUmVmZXJlbmNlUXVlc3Rpb25zXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBUEkgRXJyb3I6XCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmJvb2tsZXRKU09OWydib29rUXVlc3Rpb25zTWFwJ11bT2JqZWN0LmtleXModGhpcy5ib29rbGV0SlNPTj8uYm9va1F1ZXN0aW9uc01hcClbMF1dLnN1YlF1ZXN0aW9ucyA9IHRlbXBib29rXG4gICAgICAgIC8vIFN0b3JpbmcgdGhlIEFQSSByZXNwb25zZSBmb3IgZnV0dXJlIHVzZVxuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUodGhpcy5ib29rbGV0SlNPTik7XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgdGhlIFN1YiBRdWVzdGlvbiBPcHRpb25zIC0gVGhpcyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggYm9va1F1ZXN0aW9uc01hcCBpbiBmdXR1cmVcbiAgICAgIGZvciAodmFyIHNxIGluIHRoaXMuYm9va2xldEpTT04/LnNxT3B0aW9ucykge1xuICAgICAgICB0aGlzLnNxT3B0aW9ucy5zZXQoc3EsIHRoaXMuYm9va2xldEpTT04/LnNxT3B0aW9uc1tzcV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBRdWVzdGlvbnNcbiAgICAgIC8vIEhBIDI4REVDMjMgdGhpcyBhcHBsaWVzIGZvciBib29rbGV0XG4gICAgICAvLyBIQSAxN0pBTjI0IEFkZGVkIHRlcm5hcnkgb3BlcmF0b3IgdG8gYXZvaWQgdW5kZWZpbmVkIHNjZW5hcmlvXG4gICAgICAvLyBIQSAwOUZFQjI0IEFkZGluZyBjb25kaXRpb24gdG8gYXZvaWQgdW5kZWZpbmVkIGVycm9yXG4gICAgICBpZiAodGhpcy5ib29rbGV0SlNPTj8uYm9va1F1ZXN0aW9uc01hcCAmJiBPYmplY3Qua2V5cyh0aGlzLmJvb2tsZXRKU09OPy5ib29rUXVlc3Rpb25zTWFwKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAodmFyIHZhbHVlIGluIHRoaXMuYm9va2xldEpTT04/LmJvb2tRdWVzdGlvbnNNYXApIHtcbiAgICAgICAgICB0aGlzLmJvb2tRdWVzdGlvbnNNYXAuc2V0KHZhbHVlLCB0aGlzLmJvb2tsZXRKU09OPy5ib29rUXVlc3Rpb25zTWFwW3ZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEhBIDI4REVDMjMgdGhpcyBhcHBsaWVzIGZvciBib29rIG9yIHF1ZXN0aW9uc1xuICAgICAgZWxzZSBpZih0aGlzLmJvb2tsZXRKU09OPy5yZWNvcmRzKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgICAgICAvLyBIQSAwOUZFQjI0IEFkZGVkIHRlcm5hcnlcbiAgICAgICAgLy8gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXNcbiAgICAgICAgdmFsdWUgPSB0aGlzLmJvb2tsZXRKU09OPy5yZWNvcmRzWzBdPy5pZDtcbiAgICAgICAgdGhpcy5ib29rUXVlc3Rpb25zTWFwLnNldCh2YWx1ZSwgdGhpcy5ib29rbGV0SlNPTj8ucXVlc3Rpb25ib29rKTtcbiAgICAgIH1cbiAgICAgIC8vIEFQIDIzTUFZMjUgLSBzdXBwb3J0cyBib3RoIHN0cmluZ2lmaWVkIGFuZCBvYmplY3QgZm9ybWF0c1xuICAgICAgaWYgKHRoaXMuYm9va2xldEpTT04/LnF1ZXN0aW9uYm9vaz8uYWN0aW9uICE9IHVuZGVmaW5lZCAmJiB0aGlzLmJvb2tsZXRKU09OPy5xdWVzdGlvbmJvb2s/LmFjdGlvbiAhPSAnJykge1xuICAgICAgICB0aGlzLmFjdGlvbnMgPSB0eXBlb2YgdGhpcy5ib29rbGV0SlNPTj8ucXVlc3Rpb25ib29rLmFjdGlvbiA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBKU09OLnBhcnNlKHRoaXMuYm9va2xldEpTT04/LnF1ZXN0aW9uYm9vay5hY3Rpb24pXG4gICAgICAgIDogdGhpcy5ib29rbGV0SlNPTj8ucXVlc3Rpb25ib29rLmFjdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIQSAxOC1KQU4tMjQgVGhlIGNvbmRpdGlvbiBpcyB1c2VkIGZvciBCaW5kLUluIExvZ2ljIFxuICAgIHRoaXMuaGFuZGxlQ29tcGxldGVCb29rbGV0KHRoaXMuYm9va2xldEpTT04pO1xuICAgIHRoaXMuYm9va2xldCA9IHRoaXMuYm9va2xldEpTT04/LnJlY29yZHM7XG4gICAgdGhpcy5hYkl0ZW0gPSB0aGlzLmJvb2tsZXRKU09OPy5hbnN3ZXJib29rO1xuICB9XG4gIC8vIFZEIDEySnVuMjQgLSB0cmFuc2xhdGlvbiBjaGFuZ2VzXG4gIHByaXZhdGUgcmVhZEJvb2tsZXQgPSAodXVpZDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHRoaXMuc2VydiA9PSBcImFwaVwiKSB7XG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlLmdldEFQSURhdGEoXG4gICAgICAgIHRoaXMudGtuLFxuICAgICAgICBbXCJCb29rbGV0XCIsIFwicmVhZFwiLCB1dWlkLCB0aGlzLmxhbmd1YWdlQ29kZV0sXG4gICAgICAgIHRoaXMuc3VjY2Vzc1JlYWRCb29rbGV0LFxuICAgICAgICB0aGlzLmZhaWx1cmVSZWFkQm9va2xldFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVkQgMzFOT1YyNCBwYXJhbSBjaGFuZ2VzIHdpdGggbmV3IG1ldGhvZFxuICAgICAgbGV0IHBhcmFtTWFwID0geyBjcmVhdGVBbnN3ZXJCb29rRmxhZzogZmFsc2UgfTtcbiAgICAgIHBhcmFtTWFwWydjX19xYl9pZCddID0gJyc7XG4gICAgICBwYXJhbU1hcFtcImNfX3JlY29yZF9pZFwiXSA9ICcnO1xuICAgICAgbGV0IHBhcmEgPSB7XG4gICAgICAgIGRhdGFUeXBlOiBcIkJvb2tsZXRcIixcbiAgICAgICAgb3BlcmF0aW9uOiBcInJlYWRcIixcbiAgICAgICAgcGFyYW0xOiB1dWlkLFxuICAgICAgICBwYXJhbUpTT046IEpTT04uc3RyaW5naWZ5KHBhcmFtTWFwKSxcbiAgICAgICAgbGFuZ3VhZ2VDb2RlOiB0aGlzLmxhbmd1YWdlQ29kZVxuICAgICAgfVxuICAgICAgdGhpcy5zZlNlcnZpY2UucmVtb3RlQWN0aW9uKFxuICAgICAgICBcIk54dENvbnRyb2xsZXIucHJvY2Vzc0RhdGFcIixcbiAgICAgICAgW0pTT04uc3RyaW5naWZ5KHBhcmEpXSxcbiAgICAgICAgdGhpcy5zdWNjZXNzUmVhZEJvb2tsZXQsXG4gICAgICAgIHRoaXMuZmFpbHVyZVJlYWRCb29rbGV0XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3VjY2Vzc1JlYWRCb29rbGV0ID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKHJlc3BvbnNlICE9IG51bGwgfHwgcmVzcG9uc2UgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBTdG9yaW5nIHRoZSBBUEkgcmVzcG9uc2UgZm9yIGZ1dHVyZSB1c2VcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShyZXNwb25zZSk7XG5cbiAgICAgIC8vIFRyeSB0byBwYXNzIGEgdmFsdWUgZnJvbSBCYWNrZW5kIHRvIGRpZmZlcmVudGlhdGUgdGhlIFF1ZXN0aW9uQm9vayBSZWFkIGFuZCBBbnN3ZXJCb29rIFJlYWRcbiAgICAgIC8vIHRoaXMuaXNBbnN3ZXJGbGFnID0gdHJ1ZTtcblxuICAgICAgdGhpcy5ib29rbGV0ID0gcmVzcG9uc2UucmVjb3JkcztcbiAgICAgIHRoaXMuYWJJdGVtID0gcmVzcG9uc2UuYW5zd2VyYm9vaztcblxuICAgICAgLy8gUHJvY2VzcyB0aGUgU3ViIFF1ZXN0aW9uIE9wdGlvbnMgLSBUaGlzIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBib29rUXVlc3Rpb25zTWFwIGluIGZ1dHVyZVxuICAgICAgZm9yICh2YXIgc3EgaW4gcmVzcG9uc2Uuc3FPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3FPcHRpb25zLnNldChzcSwgcmVzcG9uc2Uuc3FPcHRpb25zW3NxXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgdGhlIFF1ZXN0aW9uc1xuICAgICAgZm9yICh2YXIgdmFsdWUgaW4gcmVzcG9uc2UuYm9va1F1ZXN0aW9uc01hcCkge1xuICAgICAgICB0aGlzLmJvb2tRdWVzdGlvbnNNYXAuc2V0KHZhbHVlLCByZXNwb25zZS5ib29rUXVlc3Rpb25zTWFwW3ZhbHVlXSk7XG4gICAgICB9XG4gICAgICAvLyBWRCAzMU5PVjI0IHdyYXBwZXIgY2hhbmdlc1xuICAgICAgaWYgKHJlc3BvbnNlLnF1ZXN0aW9uYm9vaz8uYWN0aW9uICE9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmFjdGlvbnMgPSB0eXBlb2YgcmVzcG9uc2UucXVlc3Rpb25ib29rPy5hY3Rpb24gPT09ICdzdHJpbmcnXG4gICAgICAgID8gSlNPTi5wYXJzZShyZXNwb25zZS5xdWVzdGlvbmJvb2s/LmFjdGlvbilcbiAgICAgICAgOiByZXNwb25zZS5xdWVzdGlvbmJvb2s/LmFjdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZhaWx1cmVSZWFkQm9va2xldCA9IChyZXNwb25zZSkgPT4ge1xuXG4gIH1cbiAgLy9TS1MyOE1BUjI1IEZ1bmN0aW9uIHRvIGZldGNoIHJlZnFiIGRhdGFcbiAgZ2V0UmVmUWJEYXRhKHJlZnFiaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihgaHR0cHM6Ly9kZXYtYXBpLnZhbGFyaHIuY29tL254dD9uYW1lPSR7cmVmcWJpZH1gKTtcbiAgfVxuICBzaW5nbGVGaWVsZENoYW5nZShldmVudDogYW55KXtcbiAgICBsZXQgYWN0aW9uQnV0dG9uXG4gICAgdGhpcy5hY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgIGlmIChhY3Rpb24uZXZlbnR0b2VtaXQgPT09ICdzdWJtaXQnKXtcbiAgICAgICAgYWN0aW9uQnV0dG9uID0gYWN0aW9uXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5oYW5kbGVCb29rbGV0QWN0aW9uQ2xpY2soYWN0aW9uQnV0dG9uLGV2ZW50KVxuICB9XG4gIGhhbmRsZUJvb2tsZXRBY3Rpb25DbGljayhhY3Rpb246IEFjdGlvbk1ldGEscXVlcz86YW55KSB7XG4gICAgLy8gSEEgMTlKQU4yNCBBY3Rpb24gY2hhbmdlc1xuICAgIC8vIFJTIDA5REVDMjQgQ2hhbmdlZCBrZXlzXG4gICAgdGhpcy5hbnN3ZXJMaXN0ID0gW107XG4gICAgdGhpcy5kYXRhQmluZCA9IFtdOyAvLyBIQSAxMkZFQjI0IENsZWFyaW5nIGRhdGFCaW5kIHVwb24gYnV0dG9uIGFjdGlvbiBzbyB0aGF0IGRhdGFCaW5kIHZhbHVlIHdpbGwgbm90IG92ZXJyaWRlIHRoZSBjaGFuZ2VkIHZhbHVlXG4gICAgbGV0IGRhdGFUb1BhcmVudDphbnkgPSB7fTtcbiAgICBsZXQgdmFsaWRGb3JtID0gdHJ1ZTsgLy8gVkQgMDFBdWcyNCAtIHZhbGlkYXRpb24gY2hhbmdlXG4gICAgbGV0IGlzUHJpbWFyeUtleSA9IGZhbHNlO1xuICAgIGxldCBwcmltYXJ5S2V5RWxlbWVudDogYW55O1xuICAgIGxldCBkZXBlbmRlbnRFbGVtZW50QXJyYXkgOiBhbnlbXSA9IFtdO1xuICAgIC8vIEhBIDIySkFOMjQgdGhpcyBjaGFuZ2UgdG8gbWFrZSBjbG9zZSBldmVudCB3b3JrXG4gICAgZGF0YVRvUGFyZW50WydhY3Rpb24nXSA9IGFjdGlvbi5ldmVudHRvZW1pdDtcbiAgICBpZiAoIShhY3Rpb24uZXZlbnR0b2VtaXQgPT09ICdjbG9zZScgfHwgYWN0aW9uLmV2ZW50dG9lbWl0ID09PSAncHJpbnQnKSkge1xuICAgICAgLy8gSEEgMTgtSkFOLTI0IFNlbmRpbmcgdGhlIGNvbXBsZXRlIGpzb24gZGF0YSBhbHNvIFxuICAgICAgZGF0YVRvUGFyZW50Wydqc29uQm9vayddID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXQoKTtcbiAgICAgIC8vIEhBIDE3SkFOMjQgbnh0SWQgdG8gZGF0YVBhcmVudCBvYmplY3RcbiAgICAgIGlmICh0aGlzLmJvb2tsZXRKU09OKSB7XG4gICAgICAgIGRhdGFUb1BhcmVudFsnbnh0SWQnXSA9IE9iamVjdC5rZXlzKHRoaXMuYm9va2xldEpTT04/LmJvb2tRdWVzdGlvbnNNYXApWzBdO1xuICAgICAgfVxuICAgICAgLy8gSEEgMTEtSkFOLTI0IE1pbmltaXppbmcgdGhlIHZhbHVlIHdoaWNoIGhhcyB0byBiZSBwYXNzZWQgdG8gdGhlIHNlcnZlclxuICAgICAgdGhpcy5oYW5kbGVDb21wbGV0ZUJvb2tsZXQoZGF0YVRvUGFyZW50Wydqc29uQm9vayddKTtcbiAgICAgIGRhdGFUb1BhcmVudFsnZGF0YSddID0gdGhpcy5hbnN3ZXJMaXN0ID8gdGhpcy5hbnN3ZXJMaXN0IDogZGF0YVRvUGFyZW50WydkYXRhJ107XG4gICAgICAvLyB3aGVuIGNsaWNraW5nIHRoZSBzdWJtaXQgYnV0dG9uIHZhbGlkYXRpbmcgdGhlIHJlcXVpcmVkIGZpZWxkc1xuICAgICAgZm9yIChsZXQga2V5IGluIGRhdGFUb1BhcmVudFsnanNvbkJvb2snXS5ib29rUXVlc3Rpb25zTWFwKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCb29rID0gZGF0YVRvUGFyZW50Wydqc29uQm9vayddLmJvb2tRdWVzdGlvbnNNYXBba2V5XTtcbiAgICAgICAgY3VycmVudEJvb2suc3ViUXVlc3Rpb25zLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgaWYgKCFpc1ByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Py5wcmltYXJ5S2V5ID09PSB0cnVlICYmIGVsZW1lbnQ/LmlucHV0ICE9PSB1bmRlZmluZWQgJiYgZWxlbWVudD8uaW5wdXQgIT09ICcnICYmIGVsZW1lbnQ/LmlucHV0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGlzUHJpbWFyeUtleSA9IHRydWU7XG4gICAgICAgICAgICAgIHByaW1hcnlLZXlFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVkQgMDFBdWcyNCAtIHZhbGlkYXRpb24gY2hhbmdlXG4gICAgICAgICAgaWYgKGVsZW1lbnQuaXNPcHRpb25hbCAmJiBkYXRhVG9QYXJlbnRbJ2FjdGlvbiddID09ICdzdWJtaXQnICYmICghZWxlbWVudC5pbnB1dCB8fCAoQXJyYXkuaXNBcnJheShlbGVtZW50LmlucHV0KSAmJiBlbGVtZW50LmlucHV0Lmxlbmd0aCA9PT0gMCkpICYmICFlbGVtZW50LmlzSGlkZGVuICYmIGVsZW1lbnQudHlwZSAhPSAnTGFiZWwnICYmIGVsZW1lbnQudHlwZSAhPSAnSW1hZ2UnKSB7IC8vU0tTNU5PVjI1IFxuICAgICAgICAgICAgZWxlbWVudC5lcnJvciA9IHRydWU7XG4gICAgICAgICAgICB2YWxpZEZvcm0gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlU2VydmljZS5zdWJtaXRDaGFuZ2UoZWxlbWVudC5pZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFZEIDAyQXVnMjQgLSBjbGVhciBhY3Rpb24gY2hhbmdlc1xuICAgICAgICAgIGlmIChkYXRhVG9QYXJlbnRbJ2FjdGlvbiddID09ICdjbGVhcicpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT0gJ0Ryb3Bkb3duJyB8fCBlbGVtZW50LnR5cGUgPT0gJ0xvY2F0aW9uJyB8fCBlbGVtZW50LnR5cGUgPT0gJ1JhZGlvJykge1xuICAgICAgICAgICAgICBlbGVtZW50LnNlbGVjdGVkVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQudHlwZSA9PSAnRmlsZScpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5pbnB1dCA9IFtdO1xuICAgICAgICAgICAgfSBlbHNlIGlmKGVsZW1lbnQudHlwZSA9PT0gXCJCb29sZWFuXCIpIHsgLy8gU0tTMjNKVU4yNSBkZWZhdWx0bHkgc2V0IHZhbHVlIGZhbHNlXG4gICAgICAgICAgICAgZWxlbWVudC5pbnB1dCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5pbnB1dCA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmKHF1ZXM/LnN1YlRleHQ/LnNvdXJjZVF1ZXN0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiBxdWVzPy5zdWJUZXh0Py5zb3VyY2VRdWVzdGlvbklkICE9PSBudWxsICYmIHF1ZXM/LnN1YlRleHQ/LnNvdXJjZVF1ZXN0aW9uSWQgIT09ICcnICYmICFxdWVzPy5zdWJUZXh0Py5pc0RlcGVuZGVudEZpZWxkKSB7XG5cbiAgICAgICAgfSBlbHNlIGlmKHF1ZXM/LnN1YlRleHQ/LnNvdXJjZVF1ZXN0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiBxdWVzPy5zdWJUZXh0Py5zb3VyY2VRdWVzdGlvbklkICE9PSBudWxsICYmIHF1ZXM/LnN1YlRleHQ/LnNvdXJjZVF1ZXN0aW9uSWQgIT09ICcnICYmICBxdWVzPy5zdWJUZXh0Py5pc0RlcGVuZGVudEZpZWxkKXtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnRCb29rLnN1YlF1ZXN0aW9ucy5mb3JFYWNoKGVsZSA9PiB7XG4gICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KGVsZT8uc3ViVGV4dD8uc291cmNlUXVlc3Rpb25JZCk/IGVsZT8uc3ViVGV4dD8uc291cmNlUXVlc3Rpb25JZC5pbmNsdWRlcyhxdWVzPy5pZCkgOiBxdWVzPy5pZCA9PT0gZWxlPy5zdWJUZXh0Py5zb3VyY2VRdWVzdGlvbklkICl7XG4gICAgICAgICAgICAgIGRlcGVuZGVudEVsZW1lbnRBcnJheS5wdXNoKGVsZS5pZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFZEIDEzTUFZMjQgLSBwcmludCBRUiBidXR0b24gY2hhbmdlc1xuICAgIGlmIChhY3Rpb24uZXZlbnR0b2VtaXQgPT09ICdwcmludCcpIHtcbiAgICAgIGRhdGFUb1BhcmVudFsnYWN0aW9uRGF0YSddID0gYWN0aW9uWydkYXRhJ107XG4gICAgfVxuICAgIC8vIE1TTSAxN0pVTjI1IC0gQ2xvc2UgYnV0dG9uIGV2ZW50IGNoYW5nZXNcbiAgICBpZiAoYWN0aW9uLmV2ZW50dG9lbWl0ID09PSAnY2xvc2UnICYmIHRoaXMuaXNFZGl0KSB7XG4gICAgICB0aGlzLmlzRWRpdCA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBIQSAyM0pBTjI0IFRvIGNhbGwgdGhlIGFjdGlvbiBvbiBhbnkgZXZlbnRcbiAgICAvLyAgVkQgMDFBdWcyNCAtIHZhbGlkYXRpb24gY2hhbmdlXG4gICAgaWYgKHZhbGlkRm9ybSkge1xuICAgICAgLy8gU0tTMTNKVU4yNSBzaW5nbGUgZmllbGQgY2hhbmdlIGVtaXRcbiAgICAgIGlmIChxdWVzICYmIHF1ZXMuc2luZ2xlRmllbGRDaGFuZ2UpIHtcbiAgICAgICAgZGF0YVRvUGFyZW50LmRhdGEgPSBkYXRhVG9QYXJlbnQuZGF0YS5maWx0ZXIoKGlucHV0RGF0YTogYW55KSA9PiBpbnB1dERhdGEuaWQgPT09IHF1ZXMuaWQgfHwgaW5wdXREYXRhLmlkID09PSBwcmltYXJ5S2V5RWxlbWVudD8uaWQgfHwgZGVwZW5kZW50RWxlbWVudEFycmF5LmluY2x1ZGVzKGlucHV0RGF0YS5pZCkgKTtcbiAgICAgIH1cbiAgICAgIGlmKGlzUHJpbWFyeUtleSkge1xuICAgICAgICBkYXRhVG9QYXJlbnQuYWN0aW9uID0gIGRhdGFUb1BhcmVudC5hY3Rpb24gPT09ICdzdWJtaXQnID8gJ3NhdmUnIDogIGRhdGFUb1BhcmVudC5hY3Rpb247XG4gICAgICB9XG4gICAgICB0aGlzLmhhbmRsZUJvb2tsZXRBY3Rpb25FdmVudC5lbWl0KGRhdGFUb1BhcmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGFUb1BhcmVudFsnYWN0aW9uJ10gPSAnZXJyb3InO1xuICAgICAgdGhpcy5oYW5kbGVCb29rbGV0QWN0aW9uRXZlbnQuZW1pdChkYXRhVG9QYXJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhBIDE4LUpBTi0yNCBoYW5kbGVDb21wbGV0ZUJvb2tsZXQgaXMgdG8gc2ltcGxpZnkgdGhlIGxvZ2ljXG4gIGhhbmRsZUNvbXBsZXRlQm9va2xldChjb21wbGV0ZUJvb2tsZXQpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoY29tcGxldGVCb29rbGV0Py5ib29rUXVlc3Rpb25zTWFwID8/IHt9KS5sZW5ndGggPT09IDApIHsgLy8gSEEgMTEtSkFOLTI0IElmIGNvbmRpdGlvbiB0byBsb2FkIGJvb2tsZXRcbiAgICAgIHRoaXMuaGFuZGxlQm9vayhjb21wbGV0ZUJvb2tsZXQ/LnF1ZXN0aW9uYm9vaz8uc3ViUXVlc3Rpb25zKTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIEhBIDExLUpBTi0yNCBUbyBsb2FkIGJvb2sgcXVlc3Rpb25zXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBjb21wbGV0ZUJvb2tsZXQuYm9va1F1ZXN0aW9uc01hcCkge1xuICAgICAgICBjb25zdCB2YWwgPSBjb21wbGV0ZUJvb2tsZXQuYm9va1F1ZXN0aW9uc01hcFtrZXldO1xuICAgICAgICBpZiAodmFsLnR5cGUgPT09ICdCb29rJykge1xuICAgICAgICAgIHRoaXMuaGFuZGxlQm9vayh2YWwuc3ViUXVlc3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVF1ZXModmFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEhBIDExLUpBTi0yNCBoYW5kbGVCb29rIGxvYWRzIHRoZSBCb29rXG4gIC8vIFJTIDA5REVDMjQgQ2hhbmdlZCBrZXlzXG4gIGhhbmRsZUJvb2socXVlc0xpc3Q6IGFueSkge1xuICAgIHF1ZXNMaXN0Py5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ0Jvb2snICYmIGVsZW1lbnQucWJSZWZlcmVuY2VRdWVzdGlvbnMpIHtcbiAgICAgICAgLy8gSEEgMjRKQU4yNCBGZXRjaGluZyBmcm9tIFFCIHJlZmVyZW5jZVxuICAgICAgICB2YXIgYm9vayA9IHR5cGVvZiBlbGVtZW50LnFiUmVmZXJlbmNlUXVlc3Rpb25zID09PSAnb2JqZWN0JyA/IGVsZW1lbnQucWJSZWZlcmVuY2VRdWVzdGlvbnMgOiBKU09OLnBhcnNlKGVsZW1lbnQucWJSZWZlcmVuY2VRdWVzdGlvbnMpXG4gICAgICAgIGNvbnN0IGZpcnN0S2V5ID0gT2JqZWN0LmtleXMoYm9vaz8uYm9va1F1ZXN0aW9uc01hcCB8fCB7fSlbMF07XG4gICAgICAgIGJvb2s/LmJvb2tRdWVzdGlvbnNNYXBbZmlyc3RLZXldPy5zdWJRdWVzdGlvbnM/LmZvckVhY2gocXVlcyA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVRdWVzKHF1ZXMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLmhhbmRsZVF1ZXMoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gVkQgMTNTZXAyNCAtIGRhdGFiaW5kIGNoYW5nZXNcbiAgICAvLyBWRCAyMyBPY3QyNCAtIGZpbGUgdHlwZSBjaGFuZ2VzXG4gICAgaWYgKHRoaXMuZGF0YUJpbmQgJiYgT2JqZWN0LmtleXModGhpcy5kYXRhQmluZCkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jaGFuZ2VTZXJ2aWNlLmRhdGFDaGFuZ2VzKCdkYXRhQmluZCcpO1xuICAgIH1cbiAgfVxuICAvLyBTS1MyME1BUjI1IGZsYXR0ZW5pbmcgbmVzdGVkIG9iamVjdHMsIG1hcHBpbmcgdmFsdWVzIHVzaW5nICByZWZlcmVuY2VGaWVsZFxuICBmbGF0dGVuT2JqZWN0KG9iajogYW55LCBwYXJlbnRLZXkgPSAnJyk6IGFueVtdIHtcbiAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IFtdO1xuICBcbiAgICBmb3IgKGxldCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIGxldCBuZXdLZXkgPSBwYXJlbnRLZXkgPyBgJHtwYXJlbnRLZXl9LiR7a2V5fWAgOiBrZXk7XG4gIFxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICByZXN1bHQucHVzaChbbmV3S2V5LCB2YWxdKTsgLy8gSW5jbHVkZSBmdWxsIGFycmF5XG4gIFxuICAgICAgICB2YWwuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmIGl0ZW0gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuZmxhdHRlbk9iamVjdChpdGVtLCBgJHtuZXdLZXl9WyR7aW5kZXh9XWApKTsgLy8gRmxhdHRlbiBvYmplY3RzIGluIGFycmF5c1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChbYCR7bmV3S2V5fVske2luZGV4fV1gLCBpdGVtXSk7IC8vIFN0b3JlIHByaW1pdGl2ZSB2YWx1ZXMgaW4gYXJyYXlzXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKFtuZXdLZXksIHZhbF0pOyAvLyBBbHdheXMgaW5jbHVkZSBmdWxsIG9iamVjdFxuICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLmZsYXR0ZW5PYmplY3QodmFsLCBuZXdLZXkpKTsgLy8gQ29udGludWUgZmxhdHRlbmluZ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LnB1c2goW25ld0tleSwgdmFsXSk7IC8vIFN0b3JlIHByaW1pdGl2ZSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIFxuICAvLyBTS1MyME1BUjI1IHJlZmVyZW5jZUZpZWxkIHNldCBsaWtlIHRoaXNcbiAgLy8gbmFtZSAgLS0+IG5vcm1hbFxuICAvLyBpdGVtc1swXS5uYW1lICAtLT4gdmFsdWUgaW4gYSBhcnJheSBzZXQgbGlrZSB0aGlzXG4gIC8vIGFkZHJlc3Nlcy5saW5lMiAgLS0tPiBpZiB2YWx1ZSBpbiBhIGpzb24gc2V0IGxpa2UgdGhpc1xuICAvLyBhZGRyZXNzZXMubGluZTQuZGQgLS0tPiBpZiB2YWx1ZSBpbiBhIG5lc3RlZCBqc29uIHNldCBsaWtlIHRoaXNcblxuICAvLyBIQSAxMS1KQU4tMjQgaGFuZGxlUXVlcyB0byBsb2FkIHF1ZXN0aW9uXG4gIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlc1xuICBoYW5kbGVRdWVzKHF1ZXM6IGFueSkge1xuICAgIC8vIEhBIDE5LUpBTi0yNCBJZiBjb25kaXRpb24gaXMgZm9yIGJpbmQtaW4sIGNvcnJlY3Rpb25cbiAgICAvLyBIQSAwOUZFQjI0IEFkZGluZyBjb25kaXRpb24gdG8gYXZvaWQgdW5kZWZpbmVkIGVycm9yXG4gICAgaWYgKHRoaXMuZGF0YUJpbmQgJiYgT2JqZWN0LmtleXModGhpcy5kYXRhQmluZCkubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuZmxhdHRlbk9iamVjdCh0aGlzLmRhdGFCaW5kKVxuICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBba2V5LCB2YWxdIG9mIHJlc3VsdCkge1xuICAgICAgICBsZXQgdmFsdWU6IGFueSA9IHZhbDtcbiAgICAgICAgaWYgKHF1ZXMucmVmZXJlbmNlRmllbGQgPT09IGtleSkge1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBpZiAocXVlcy50eXBlID09PSAnRHJvcGRvd24nIHx8IHF1ZXMudHlwZSA9PT0gJ1JhZGlvJykge1xuICAgICAgICAgICAgdGhpcy5zcU9wdGlvbnMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnRbJ3JlZmVyZW5jZUZpZWxkJ10gPT09IGtleSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRbJ2lucHV0J10gPSBxdWVzLmlucHV0ID0gdmFsdWUgfHwgcXVlcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgZWxlbWVudFsnc2VsZWN0ZWRWYWx1ZSddID0gcXVlcy5zZWxlY3RlZFZhbHVlID0gdmFsdWUgfHwgcXVlcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBIQSAyNEpBTjI0IFRvIGJpbmQtaW4gRGF0ZSBhbmQgRGF0ZVRpbWVcbiAgICAgICAgICBlbHNlIGlmIChxdWVzLnR5cGUgPT09ICdEYXRlJyB8fCBxdWVzLnR5cGUgPT0gJ0RhdGVUaW1lJykge1xuICAgICAgICAgICAgcXVlcy5pbnB1dCA9IG5ldyBEYXRlKHZhbHVlPy50b1N0cmluZygpKSAgfHwgcXVlcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEhBIDEyRkVCMjQgVG8gYmluZC1pbiBMb2NhdGlvbiBUeXBlXG4gICAgICAgICAgZWxzZSBpZiAocXVlcy50eXBlID09PSAnTG9jYXRpb24nKSB7XG4gICAgICAgICAgICBxdWVzLmlucHV0ID0gdmFsdWUgfHwgcXVlcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICBxdWVzLnNlbGVjdGVkVmFsdWUgPSB2YWx1ZVsnYWRkcmVzcyddID8gdmFsdWVbJ2FkZHJlc3MnXSA6IHZhbHVlIHx8IHF1ZXMuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBWRCAwNlNlcDI0IGNhbGVuZGFyIGNoYW5nZXMgZm9yIGRhdGEgYmluZEluXG4gICAgICAgICAgZWxzZSBpZiAocXVlcy50eXBlID09PSAnQ2FsZW5kYXInKSB7XG4gICAgICAgICAgICBsZXQgZW50cmllcyA9IHR5cGVvZiBxdWVzWydmaWVsZHNNZXRhJ10gPT09ICdvYmplY3QnID8gcXVlc1snZmllbGRzTWV0YSddIDogSlNPTi5wYXJzZShxdWVzWydmaWVsZHNNZXRhJ10pO1xuICAgICAgICAgICAgaWYgKGVudHJpZXMpIHtcbiAgICAgICAgICAgICAgbGV0IHJlZmVyZW5jZVF1ZXN0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZW50cmllcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucXVlc3Rpb25SZWZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHFSZWZlcmVuY2UgPSBKU09OLnBhcnNlKGVsZW1lbnQucXVlc3Rpb25SZWZlcmVuY2UpO1xuICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VRdWVzdGlvbnMucHVzaChxUmVmZXJlbmNlPy5xdWVzdGlvbik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZVF1ZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFsdWU/LmZvckVhY2goY2FsZW5kYXJBcnJheSA9PiB7XG4gICAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKGNhbGVuZGFyQXJyYXkuZGF0ZSk7XG4gICAgICAgICAgICAgICAgICBjYWxlbmRhckFycmF5LmVudHJpZXMuZm9yRWFjaChpbnB1dEVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGlucHV0RW50cnkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlUXVlc3Rpb25zLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnJlZmVyZW5jZUZpZWxkID09IGspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdEYXRlJyB8fCBmaWVsZC50eXBlID09ICdEYXRlVGltZScgfHwgZmllbGQudHlwZSA9PSAnVGltZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5pbnB1dCA9IG5ldyBEYXRlKHY/LnRvU3RyaW5nKCkpIHx8IHF1ZXMuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGlmIChmaWVsZC50eXBlID09PSAnRHJvcGRvd24nIHx8IGZpZWxkLnR5cGUgPT09ICdSYWRpbycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZWxlY3RlZFZhbHVlID0gdjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5pbnB1dCA9IHYgIHx8IHF1ZXMuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmlucHV0ID0gdiB8fCBxdWVzLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoZGF0ZSwgcmVmZXJlbmNlUXVlc3Rpb25zKTsvL1NLUyAyN1NFUDI0IGVhY2ggZXZlbnQgYWRkZWQgdG8gYWxsRXZlbnRzIGFycmF5XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgLy8gdGhpcy5hZGRFdmVudChkYXRlLHJlZmVyZW5jZVF1ZXN0aW9ucyk7IC8vdGhpcyBpcyBvbmx5IGxhc3QgZXZlbnQgYWRkZWQgdG8gYWxsRXZlbnRzIGFycmF5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXMuaW5wdXQgPSB0aGlzLmFsbEV2ZW50cy5sZW5ndGggPiAwID8gdGhpcy5hbGxFdmVudHMgOiAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVkQgMjMgT2N0MjQgLSBmaWxlIHR5cGUgY2hhbmdlc1xuICAgICAgICAgIGVsc2UgaWYgKHF1ZXMudHlwZSA9PT0gJ0ZpbGUnKSB7XG4gICAgICAgICAgICBxdWVzLmlucHV0ID0gW107XG4gICAgICAgICAgICBxdWVzLmlucHV0ID0gdmFsdWU7XG4gICAgICAgICAgfSBlbHNlIGlmKHF1ZXMudHlwZSA9PT0gXCJCb29sZWFuXCIpIHsgLy8gU0tTMjNKVU4yNSBkZWZhdWx0bHkgc2V0IHZhbHVlIGZhbHNlXG4gICAgICAgICAgICBxdWVzLmlucHV0ID0gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyA/IHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSAndHJ1ZScgOiB0eXBlb2YgcXVlcy5kZWZhdWx0VmFsdWUgIT09ICd1bmRlZmluZWQnID8gcXVlcy5kZWZhdWx0VmFsdWUgPT09IHRydWUgfHwgcXVlcy5kZWZhdWx0VmFsdWUgPT09ICd0cnVlJyA6IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBxdWVzLmlucHV0ID0gdmFsdWUgfHwgcXVlcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYW5zd2VyTGlzdC5wdXNoKHF1ZXMpOyAvLyBIQSAxMkZFQjI0IFRvIGdpdmUgdGhlIHZhbHVlIGZvciBkYXRhXG4gICAgICAgICAgYnJlYWs7IC8vIEFQLTAzSlVOMjUgLSBNYXRjaCBmb3VuZCBhbmQgdmFsdWUgYm91bmQ7IG5vIG5lZWQgdG8gY29udGludWUgdGhlIGxvb3BcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICBxdWVzLnR5cGUgPT09ICdCb29sZWFuJyA/IHF1ZXMuaW5wdXQgPSBmYWxzZSA6IHF1ZXMuaW5wdXQgPSBudWxsICAvLyBTS1MyM0pVTjI1IGRlZmF1bHRseSBzZXQgdmFsdWUgZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBxdWVzdGlvbiA9IHt9O1xuICAgICAgcXVlc3Rpb25bJ2lkJ10gPSBxdWVzLmlkO1xuICAgICAgcXVlc3Rpb25bJ2lucHV0J10gPSBxdWVzLmlucHV0IHx8IHF1ZXMuZGVmYXVsdFZhbHVlICB8fCBudWxsO1xuICAgICAgLy8gSEEgMTJGRUIyNCBUbyBiaW5kLW91dCBMb2NhdGlvbiBUeXBlXG4gICAgICBpZiAocXVlcy50eXBlID09PSAnTG9jYXRpb24nKSB7XG4gICAgICAgIHF1ZXN0aW9uWydpbnB1dCddID0gcXVlcy5pbnB1dCA/IHF1ZXMuaW5wdXQgOiBxdWVzLnNlbGVjdGVkVmFsdWUgfHwgbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAocXVlcy50eXBlID09ICdGaWxlJykge1xuICAgICAgICAvLyBWRCAyMyBPY3QyNCAtIGZpbGUgdHlwZSBjaGFuZ2VzXG4gICAgICAgIHF1ZXN0aW9uWydpbnB1dCddID0gcXVlcy5pbnB1dCA/IHF1ZXMuaW5wdXQgOiBxdWVzLmRlZmF1bHRWYWx1ZSB8fCBbXTtcbiAgICAgIH0gIGVsc2UgaWYocXVlcy50eXBlID09PSBcIkJvb2xlYW5cIikgeyAvLyBTS1MyM0pVTjI1IGRlZmF1bHRseSBzZXQgdmFsdWUgZmFsc2VcbiAgICAgICAgcXVlc3Rpb25bJ2lucHV0J10gPSB0eXBlb2YgcXVlcy5pbnB1dCAhPT0gJ3VuZGVmaW5lZCcgPyBxdWVzLmlucHV0ID09PSB0cnVlIHx8IHF1ZXMuaW5wdXQgPT09ICd0cnVlJyA6IHR5cGVvZiBxdWVzLmRlZmF1bHRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyBxdWVzLmRlZmF1bHRWYWx1ZSA9PT0gdHJ1ZSB8fCBxdWVzLmRlZmF1bHRWYWx1ZSA9PT0gJ3RydWUnIDogZmFsc2U7XG4gICAgICB9XG4gICAgICBxdWVzdGlvblsndHlwZSddID0gcXVlcy50eXBlO1xuICAgICAgcXVlc3Rpb25bJ3F1ZXN0aW9uTnVtYmVyJ10gPSBxdWVzLnF1ZXN0aW9uTnVtYmVyO1xuICAgICAgcXVlc3Rpb25bJ3JlZmVyZW5jZUZpZWxkJ10gPSBxdWVzPy5yZWZlcmVuY2VGaWVsZDtcbiAgICAgIHF1ZXN0aW9uWydzZWxlY3RlZFZhbHVlJ10gPSBxdWVzPy5zZWxlY3RlZFZhbHVlOyAgLy8gTVIgMzFKQU4yNCBOZWVkIHRvIHBhc3MgdGhlIHNlbGVjdGVkIHZhbHVlIHRvb1xuICAgICAgdGhpcy5hbnN3ZXJMaXN0LnB1c2gocXVlc3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlcyBmb3IgZGF0YSBiaW5kSW5cbiAgYWRkRXZlbnQoZGF5OiBhbnksIGVudHJ5UXVlcykge1xuICAgIC8vIFRyYW5zZm9ybSBuZXcgZW50cmllcyBpbnRvIHRoZSBkZXNpcmVkIGZvcm1hdFxuICAgIGNvbnN0IG5ld0VudHJpZXMgPSBlbnRyeVF1ZXMucmVkdWNlKChhY2MsIHEpID0+IHtcbiAgICAgIGFjY1txLmlkXSA9IHsgLi4ucSB9O1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICAvLyBGaW5kIGlmIGFuIGV2ZW50IGFscmVhZHkgZXhpc3RzIGZvciB0aGUgZ2l2ZW4gZGF0ZVxuICAgIGNvbnN0IGV4aXN0aW5nRXZlbnQgPSB0aGlzLmFsbEV2ZW50cy5maW5kKGV2ZW50ID0+IGV2ZW50LmRhdGUudG9EYXRlU3RyaW5nKCkgPT09IGRheS50b0RhdGVTdHJpbmcoKSk7XG5cbiAgICBpZiAoZXhpc3RpbmdFdmVudCkge1xuICAgICAgLy8gSWYgdGhlIGV2ZW50IGV4aXN0cywgcHVzaCB0aGUgbmV3IGVudHJpZXMgdG8gdGhlIGV4aXN0aW5nIGVudHJpZXNcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW50cmllcyA9IGV4aXN0aW5nRXZlbnQuZW50cmllcy5tYXAoZW50cnkgPT4gKHsgLi4uZW50cnkgfSkpO1xuICAgICAgZXhpc3RpbmdFbnRyaWVzLnB1c2gobmV3RW50cmllcyk7XG4gICAgICBleGlzdGluZ0V2ZW50LmVudHJpZXMgPSBleGlzdGluZ0VudHJpZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBldmVudCBpZiBpdCBkb2Vzbid0IGV4aXN0IGZvciB0aGUgZ2l2ZW4gZGF0ZVxuICAgICAgY29uc3QgbmV3RXZlbnQgPSB7XG4gICAgICAgIGlkOiAnXycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSksXG4gICAgICAgIGRhdGU6IGRheSxcbiAgICAgICAgZW50cmllczogW25ld0VudHJpZXNdIC8vIFdyYXAgdGhlIG5ldyBlbnRyaWVzIGluIGFuIGFycmF5XG4gICAgICB9O1xuICAgICAgdGhpcy5hbGxFdmVudHMucHVzaChuZXdFdmVudCk7XG4gICAgfVxuICB9XG5cblxuICByZWFkUXVlc3Rpb25zKHFiSWQ6IHN0cmluZykge1xuICAgIGxldCBxdWVzdGlvbnMgPSBbXTtcbiAgICAvLyBIQSAzMS1KQU4tMjQgQWRkZWQgdGVybmFyeSB0byBhdm9pZCB1bmRlZmluZWRcbiAgICBmb3IgKHZhciBzcSBpbiB0aGlzLmJvb2tRdWVzdGlvbnNNYXA/LmdldChxYklkKT8uc3ViUXVlc3Rpb25zKSB7XG4gICAgICAvLyBBUC0xNE1BWTI1IEV4dHJhY3RlZCBxdWVzdGlvbiBmcm9tIHN1YlF1ZXN0aW9ucyBpbnRvIHZhcmlhYmxlICdxJ1xuICAgICAgbGV0IHE6IGFueSA9IHRoaXMuYm9va1F1ZXN0aW9uc01hcD8uZ2V0KHFiSWQpLnN1YlF1ZXN0aW9uc1tzcV07XG4gICAgICAvLyBIQSAwOUZFQjI0IGlmIHF1ZXN0aW9uIGlzIHRoZXJlIHByb2Nlc3NcbiAgICAgIGlmIChxKSB7XG4gICAgICAgIGlmICgocS50eXBlID09ICdEcm9wZG93bicgfHwgcS50eXBlID09ICdSYWRpbycpICYmIHRoaXMuc3FPcHRpb25zLmdldChxLmlkKSkge1xuICAgICAgICAgIHF1ZXN0aW9ucy5wdXNoKHRoaXMuc3FPcHRpb25zLmdldChxLmlkKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcXVlc3Rpb25zLnB1c2gocSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWRCAxMkp1bjI0IGZpZWxkIHBlcm1pc2lzaW9uIGNoYW5nZXNcbiAgICBpZiAodGhpcy5maWVsZFJlc3RyaWN0aW9ucykge1xuICAgICAgY29uc3QgZmllbGRSZXN0cmljdGlvbnMgPSBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKHRoaXMuZmllbGRSZXN0cmljdGlvbnMuZmllbGRzKSk7XG4gICAgICBxdWVzdGlvbnMuZm9yRWFjaChxdWVzID0+IHtcbiAgICAgICAgY29uc3QgcmVzdHJpY3Rpb24gPSBmaWVsZFJlc3RyaWN0aW9ucy5nZXQocXVlcy51bmlxdWVJZGVudGlmaWVyKTtcblxuICAgICAgICBpZiAocmVzdHJpY3Rpb24pIHtcbiAgICAgICAgICBxdWVzLmlzUmVhZE9ubHkgPSByZXN0cmljdGlvbiA9PT0gJ3JlYWRPbmx5JztcbiAgICAgICAgICBxdWVzLmlzSGlkZGVuID0gcmVzdHJpY3Rpb24gPT09ICdoaWRlJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBxdWVzdGlvbnM7XG4gIH1cblxuICBnZXRUZXh0KHZhbHVlKSB7XG4gICAgdmFyIGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcodmFsdWUsIFwidGV4dC9odG1sXCIpO1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChcbiAgICAgIGRvYy5kb2N1bWVudEVsZW1lbnQudGV4dENvbnRlbnRcbiAgICApO1xuICB9XG4gIGdldERyb3BEb3duKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmhhZGxlRHJvcERvd25EZXBlbmRlbnQuZW1pdChldmVudCk7XG4gIH1cbiAgLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzXG4gIGdldENhbGVuZGFyRGF0ZShldmVudDogYW55KSB7XG4gICAgdGhpcy5oYW5kbGVDYWxlbmRhckRhdGUuZW1pdChldmVudCk7XG4gIH1cbiAgZ2V0Q2FsZW5kYXJFdmVudChldmVudDogYW55KSB7XG4gICAgZXZlbnRbXCJueHRJZFwiXSA9IE9iamVjdC5rZXlzKHRoaXMuYm9va2xldEpTT04/LmJvb2tRdWVzdGlvbnNNYXApWzBdO1xuICAgIHRoaXMuaGFuZGxlQ2FsZW5kYXJFdmVudC5lbWl0KGV2ZW50KTtcbiAgfVxuICBlZGl0Q2hhbmdlQ2xpY2soYWN0aW9uOiBhbnkpe1xuICAgIHRoaXMuaXNFZGl0ID0gdHJ1ZVxuICB9XG59XG4iLCI8IS0tIEJvb2tsZXQgSGFuZGxpbmctLT5cbjwhLS0gSEEgMTlERUMyMyBGb3IgRGlyZWN0aW9uIC0tPlxuPGRpdiAqbmdGb3I9XCJsZXQgcWIgb2YgYm9va2xldFwiIFtkaXJdPVwiZGlyZWN0aW9uXCI+XG4gICAgPCEtLSBNUiBDb21tZW50ZWQgYmVsb3cgY29kZSB0byBlbnN1cmUgc2luZ2xlIEpTT04gZm9yIFVOQ09ORElUSU9OQUwgQm9va2xldHMgLS0+XG4gICAgPCEtLSBSUyAwOURFQzI0IENoYW5nZWQga2V5cy0tPlxuICAgIDwhLS0gPGxpYi1xdWVzdGlvbm5haXJlIFtzZXJ2XT1cInNlcnZcIiBbcWJJZF09XCJxYi5pZFwiIFt0a25dPVwidGtuXCI+PC9saWItcXVlc3Rpb25uYWlyZT4gLS0+XG4gICAgPCEtLSBIQSAyOERFQzIzIEJlbG93IElmIGxvZ2ljIGlzIHRvIGxvYWQgZnJvbSBib29rbGV0ICAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwicWIuc3ViUXVlc3Rpb25zOyBlbHNlIGVsc2VCbG9ja1wiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBxdWVzIG9mIHFiLnN1YlF1ZXN0aW9uc1wiIGNsYXNzPVwicXVlc3Rpb25kaXYxXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gSEEgMTdKQU4yNCAtIElzIHRpdGxlIGlzIGVuYWJsZWQgc28gdGhhdCBiYXNlZCBvbiB0aGUgYm9vbGVhbiBkaXYgd2lsbCBiZSB2aXNpYmxlIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzLmlzVGl0bGVcIiBbY2xhc3NdPVwicWIuaXNTaGVuZ2VsID8gJ2hlYWRlci1zdHlsZScgOiAncXVlc3Rpb24tZi1zaXplIGFkZGl0aW9uYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gVkQgMDhOT1YyMyAtIHNob3dpbmcgbGFiZWwgd2hlbiBpdHMgYXZhaWxhYmxlLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJnZXRUZXh0KHF1ZXM/LnF1ZXN0aW9uVGV4dClcIiAqbmdJZj1cInF1ZXM/LnF1ZXN0aW9uVGV4dCAmJiBxdWVzPy5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IChxdWVzLmlkKycucXVlc3Rpb25UZXh0JykgfCBueHRDdXN0b21UcmFuc2xhdGUgOiBxdWVzPy5xdWVzdGlvblRleHQgIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PiA8IS0tIFZEIDE5SkFOMjQgLSBnZXR0aW5nIHRva2VuIGFzIGlucHV0IC0tPiA8IS0tVkQgMTFKdW4yNCAtIHRyYW5zbGF0aW9uIGNoYW5nZXMtLT5cbiAgICAgICAgICAgICAgICA8IS0tVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzLS0+XG4gICAgICAgICAgICAgICAgPCEtLSBBUC0xNE1BWTI1IC0gQWRkZWQgW2RhdGFCaW5kXSBpbnB1dCBiaW5kaW5nIC0tPlxuICAgICAgICAgICAgICAgICA8IS0tIEFQLTE5TUFZMjUgLSBBZGRlZCBbaXNFZGl0XSBiaW5kaW5nIC0tPiBcbiAgICAgICAgICAgICAgICAgIDwhLS0gLy9NU00xMEpVTDI1ICBhbGxJY29ucywgdGhlbWVDb2xvciwgY2RuSWNvblVSTCBhZGRlZCBmb3IgaWNvbi1zZWxlY3Rvci0tPlxuICAgICAgICAgICAgICAgIDxsaWItcXVlc3Rpb25ib29rIFtxYkl0ZW1dPVwicWJcIiBbdG9rZW5dPVwidG9rZW5cIlxuICAgICAgICAgICAgICAgIFtkaXJlY3Rpb25dID0gXCJkaXJlY3Rpb25cIlxuICAgICAgICAgICAgICAgIFtsYWJlbFZhbHVlXT1cImxhYmVsVmFsdWVcIlxuICAgICAgICAgICAgICAgIFtxdWVzdGlvbkl0ZW1dPVwicXVlc1wiXG4gICAgICAgICAgICAgICAgW3F1ZXN0aW9uc109XCJyZWFkUXVlc3Rpb25zKHFiLmlkKVwiXG4gICAgICAgICAgICAgICAgKGhhbmRsZURyb3BEb3duKT1cImdldERyb3BEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChoYW5kbGVDYWxlbmRhckRhdGUpPVwiZ2V0Q2FsZW5kYXJEYXRlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChoYW5kbGVDYWxlbmRhckV2ZW50KT1cImdldENhbGVuZGFyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHNpbmdsZUZpZWxkQ2hhbmdlRW1pdCkgPSdzaW5nbGVGaWVsZENoYW5nZSgkZXZlbnQpJ1xuICAgICAgICAgICAgICAgIFtkYXRhQmluZF09XCJkYXRhQmluZFwiXG4gICAgICAgICAgICAgICAgW2lzRWRpdF09XCJpc0VkaXRcIiBcbiAgICAgICAgICAgICAgICBbYWxsSWNvbnNdPVwiYWxsSWNvbnNcIlxuICAgICAgICAgICAgICAgIFt0aGVtZUNvbG9yXT1cInRoZW1lQ29sb3JcIlxuICAgICAgICAgICAgICAgIFtjZG5JY29uVVJMXT1cImNkbkljb25VUkxcIlxuICAgICAgICAgICAgICAgID48L2xpYi1xdWVzdGlvbmJvb2s+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBIQSAyOERFQzIzIEJlbG93IGVsc2UgbG9naWMgaXMgdG8gbG9hZCBmcm9tIGJvb2tzIG9yIHF1ZXN0aW9ucyAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2Vsc2VCbG9jaz5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1ZXN0aW9uZGl2MVwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXFiLmlzVGl0bGVcIiBbY2xhc3NdPVwicWIuaXNTaGVuZ2VsID8gJ2hlYWRlci1zdHlsZScgOiAncXVlc3Rpb24tZi1zaXplIGFkZGl0aW9uYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gVkQgMDhOT1YyMyAtIHNob3dpbmcgbGFiZWwgd2hlbiBpdHMgYXZhaWxhYmxlLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJnZXRUZXh0KHFiPy5xdWVzdGlvblRleHQpXCIgKm5nSWY9XCJxYj8ucXVlc3Rpb25UZXh0ICYmIHFiPy5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IChxYi5pZCsnLnF1ZXN0aW9uVGV4dCcpIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogcWI/LnF1ZXN0aW9uVGV4dH19XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBxYj8udGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+IDwhLS0gVkQgMTlKQU4yNCAtIGdldHRpbmcgdG9rZW4gYXMgaW5wdXQgLS0+IDwhLS0gIC8vIFZEIDExSnVuMjQgLSB0cmFuc2xhdGlvbiBjaGFuZ2VzLS0+XG4gICAgICAgICAgICAgICAgPGxpYi1xdWVzdGlvbmJvb2sgW3FiSXRlbV09XCJxYlwiIFt0b2tlbl09XCJ0b2tlblwiIFtsYWJlbFZhbHVlXT1cImxhYmVsVmFsdWVcIiBbcXVlc3Rpb25JdGVtXT1cInFiXCIgW3F1ZXN0aW9uc109XCJyZWFkUXVlc3Rpb25zKHFiLmlkKVwiICAoaGFuZGxlRHJvcERvd24pPVwiZ2V0RHJvcERvd24oJGV2ZW50KVwiPjwvbGliLXF1ZXN0aW9uYm9vaz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPCEtLSBSUyAwOURFQzI0IENoYW5nZWQga2V5cy0tPlxuICAgIDwhLS0gR3JvdXAgQWN0aW9ucyAtLT5cbiAgICA8IS0tIEhBIDE5REVDMjMgRm9yIERpcmVjdGlvbiAtLT5cbiAgICA8IS0tIEFQIDIzTUFZMjUgLSBBY3Rpb24gQnV0dG9uczogRHluYW1pY2FsbHkgcG9zaXRpb25lZCBidXR0b25zIHdpdGggSlNPTi1jb25maWd1cmVkIHN0eWxlcyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiYWxpZ24tc3VibWl0LXJvd1wiICpuZ0lmPVwiYWJJdGVtPy5zdGF0dXMgIT0gJ0NvbXBsZXRlZCdcIiBbZGlyXT1cImRpcmVjdGlvblwiPiA8IS0tIHBvc2l0aW9uLXJlbGF0aXZlIHJlbW92ZWQgaW4gdGhpcyB0YWctLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBhY3Rpb25zOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJhY3Rpb24ud2lkdGggfHwgMTAwXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1yaWdodDogMTBweDtcIj4gIDwhLS0gc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IFtzdHlsZS5sZWZ0LiVdPVwiYWN0aW9uLnBvc2l0aW9uUGVyY2VudCB8fCAwXCIgIHJlbW92ZWQgaW4gdGhpcyB0YWcgLS0+XG4gICAgICAgICAgICAgICAgQGlmKCFpc0VkaXQgJiYgYWN0aW9uLm5hbWUgPT09ICdTYXZlJyl7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdENoYW5nZUNsaWNrKGFjdGlvbilcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGZjLWJ1dHRvbiBueHRCdXR0b24gYWN0aW9uLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuLS1idG4tYmddPVwiYWN0aW9uLmJnQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYWN0aW9uLmJnQ29sb3IgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImFjdGlvbi50ZXh0Q29sb3IgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlci1yYWRpdXMucHhdPVwiYWN0aW9uLmJvcmRlclJhZGl1cyB8fCA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBFZGl0XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQm9va2xldEFjdGlvbkNsaWNrKGFjdGlvbilcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGZjLWJ1dHRvbiBueHRCdXR0b24gYWN0aW9uLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuLS1idG4tYmddPVwiYWN0aW9uLmJnQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYWN0aW9uLmJnQ29sb3IgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImFjdGlvbi50ZXh0Q29sb3IgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlci1yYWRpdXMucHhdPVwiYWN0aW9uLmJvcmRlclJhZGl1cyB8fCA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAoYWN0aW9uLmlkKycubmFtZScpIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogYWN0aW9uPy5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19