tuain-ng-forms-lib 13.0.12 → 13.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/classes/forms/form.mjs +12 -10
- package/esm2020/lib/components/forms/basic-form.mjs +183 -75
- package/fesm2015/tuain-ng-forms-lib.mjs +212 -94
- package/fesm2015/tuain-ng-forms-lib.mjs.map +1 -1
- package/fesm2020/tuain-ng-forms-lib.mjs +193 -83
- package/fesm2020/tuain-ng-forms-lib.mjs.map +1 -1
- package/lib/classes/forms/form.d.ts +1 -1
- package/lib/components/forms/basic-form.d.ts +65 -33
- package/package.json +1 -1
|
@@ -18,6 +18,8 @@ export class BasicFormComponent {
|
|
|
18
18
|
this.fileMgmtServices = fileMgmtServices;
|
|
19
19
|
this._formStructure = null;
|
|
20
20
|
this._controlToken = null;
|
|
21
|
+
this._originToken = null;
|
|
22
|
+
this._formRoute = null;
|
|
21
23
|
this._definitionObtained = false;
|
|
22
24
|
// Eventos de acciones y campos
|
|
23
25
|
this._formSectionsActivate = {};
|
|
@@ -34,10 +36,18 @@ export class BasicFormComponent {
|
|
|
34
36
|
this._tableActionsFinish = {};
|
|
35
37
|
this._tableGetDataStart = {};
|
|
36
38
|
this._tableGetDataFinish = {};
|
|
39
|
+
this._actionServerError = [];
|
|
40
|
+
this._fieldServerError = [];
|
|
41
|
+
this._tableServerError = [];
|
|
37
42
|
this.inputDataFields = {};
|
|
38
43
|
this.extraData = {};
|
|
44
|
+
this.enabledSections = [];
|
|
45
|
+
this.name = null;
|
|
46
|
+
this.formSubject = null;
|
|
39
47
|
this._errorType = '';
|
|
40
48
|
this.errorCode = '';
|
|
49
|
+
this.errorFullCode = '';
|
|
50
|
+
this.errorName = '';
|
|
41
51
|
this.errorMessage = '';
|
|
42
52
|
this.errorDetail = '';
|
|
43
53
|
this.visible = false;
|
|
@@ -50,20 +60,20 @@ export class BasicFormComponent {
|
|
|
50
60
|
setTitle(title) { return this._formStructure?.setTitle(title); }
|
|
51
61
|
cleanData() { return this._formStructure?.cleanData(); }
|
|
52
62
|
getCurrentState() { return this._formStructure?.getCurrentState(); }
|
|
53
|
-
supportState(state) { return this._formStructure?.supportState(state); }
|
|
54
|
-
changeState(state) { return this._formStructure?.changeState(state); }
|
|
63
|
+
supportState(state) { return this._formStructure?.supportState(state ?? '') ?? false; }
|
|
64
|
+
changeState(state) { return this._formStructure?.changeState(state) ?? false; }
|
|
55
65
|
getStates() { return this._formStructure?.states; }
|
|
56
66
|
getImmutableElement(name) { return this._formStructure?.getImmutableElement(name); }
|
|
57
67
|
getExtraInfo(name) { return this._formStructure?.getExtraInfo(name); }
|
|
58
|
-
getFields() { return this._formStructure?.getFields(); }
|
|
59
|
-
getFieldNames() { return this._formStructure?.getFieldNames(); }
|
|
60
|
-
getField(code) { return this._formStructure?.getField(code); }
|
|
68
|
+
getFields() { return this._formStructure?.getFields() ?? null; }
|
|
69
|
+
getFieldNames() { return this._formStructure?.getFieldNames() ?? null; }
|
|
70
|
+
getField(code) { return this._formStructure?.getField(code) ?? null; }
|
|
61
71
|
enableField(code) { return this._formStructure?.enableField(code); }
|
|
62
72
|
disableField(code) { return this._formStructure?.disableField(code); }
|
|
63
|
-
getFieldValue(code) { return this._formStructure?.getFieldValue(code); }
|
|
73
|
+
getFieldValue(code) { return this._formStructure?.getFieldValue(code) ?? null; }
|
|
64
74
|
getFieldOptionText(code) { return this._formStructure?.getFieldOptionText(code); }
|
|
65
|
-
getFieldsValues(codes) { return this._formStructure?.getFieldsValues(codes); }
|
|
66
|
-
getFieldOptions(code) { return this._formStructure?.getFieldOptions(code); }
|
|
75
|
+
getFieldsValues(codes) { return this._formStructure?.getFieldsValues(codes) ?? null; }
|
|
76
|
+
getFieldOptions(code) { return this._formStructure?.getFieldOptions(code) ?? null; }
|
|
67
77
|
setFieldValue(code, value) { return this._formStructure?.setFieldValue(code, value); }
|
|
68
78
|
setFieldRequired(code, required) { return this._formStructure?.setFieldRequired(code, required); }
|
|
69
79
|
setFieldErrorMessage(code, errorMessage) { return this._formStructure?.setFieldErrorMessage(code, errorMessage); }
|
|
@@ -75,7 +85,7 @@ export class BasicFormComponent {
|
|
|
75
85
|
return this._formStructure?.setFieldOptions(code, optionsArray, idAttribute, nameAttribute);
|
|
76
86
|
}
|
|
77
87
|
getFieldSet(filterFunc, codes, secCode, subCode) {
|
|
78
|
-
return this._formStructure?.getFieldSet(filterFunc, codes, secCode, subCode);
|
|
88
|
+
return this._formStructure?.getFieldSet(filterFunc, codes ?? null, secCode ?? null, subCode ?? null);
|
|
79
89
|
}
|
|
80
90
|
applyOnFields(processFunc, codes, secCode, subCode) {
|
|
81
91
|
return this._formStructure?.applyOnFields(processFunc, codes, secCode, subCode);
|
|
@@ -90,7 +100,7 @@ export class BasicFormComponent {
|
|
|
90
100
|
return this._formStructure?.getRequiredFields(codes, secCode, subCode);
|
|
91
101
|
}
|
|
92
102
|
getRequiredEmptyFields(codes, secCode, subCode) {
|
|
93
|
-
return this._formStructure?.getRequiredEmptyFields(codes, secCode, subCode);
|
|
103
|
+
return this._formStructure?.getRequiredEmptyFields(codes, secCode, subCode) ?? null;
|
|
94
104
|
}
|
|
95
105
|
getChangedFields(codes, secCode, subCode) {
|
|
96
106
|
return this._formStructure?.getChangedFields(codes, secCode, subCode);
|
|
@@ -141,7 +151,7 @@ export class BasicFormComponent {
|
|
|
141
151
|
return this._formStructure?.getActionsByAttribute('location', HEADER);
|
|
142
152
|
}
|
|
143
153
|
getAction(actionCode) {
|
|
144
|
-
return this._formStructure?.getAction(actionCode);
|
|
154
|
+
return this._formStructure?.getAction(actionCode) ?? null;
|
|
145
155
|
}
|
|
146
156
|
showActions(actionArray) {
|
|
147
157
|
return this._formStructure?.showActions(actionArray);
|
|
@@ -168,16 +178,16 @@ export class BasicFormComponent {
|
|
|
168
178
|
return this._formStructure?.disableActions(code);
|
|
169
179
|
}
|
|
170
180
|
getSections() {
|
|
171
|
-
return this._formStructure?.getSections();
|
|
181
|
+
return this._formStructure?.getSections() ?? null;
|
|
172
182
|
}
|
|
173
183
|
activateSection(code) {
|
|
174
184
|
return this._formStructure?.activateSection(code);
|
|
175
185
|
}
|
|
176
186
|
getSectionsTitles() {
|
|
177
|
-
return this._formStructure?.getSections().map(sec => sec.title);
|
|
187
|
+
return this._formStructure?.getSections().map(sec => sec.title) ?? null;
|
|
178
188
|
}
|
|
179
189
|
getSection(code) {
|
|
180
|
-
return this._formStructure?.getSection(code);
|
|
190
|
+
return this._formStructure?.getSection(code) ?? null;
|
|
181
191
|
}
|
|
182
192
|
showSection(code) {
|
|
183
193
|
return this._formStructure?.showSections(code);
|
|
@@ -192,7 +202,7 @@ export class BasicFormComponent {
|
|
|
192
202
|
return this._formStructure?.hideSections(codes);
|
|
193
203
|
}
|
|
194
204
|
getSubSection(code, subCode) {
|
|
195
|
-
return this._formStructure?.getSubSection(code, subCode);
|
|
205
|
+
return this._formStructure?.getSubSection(code, subCode) ?? null;
|
|
196
206
|
}
|
|
197
207
|
showSubSection(code, subCode) {
|
|
198
208
|
return this._formStructure?.showSubSections(code, subCode);
|
|
@@ -207,10 +217,10 @@ export class BasicFormComponent {
|
|
|
207
217
|
return this._formStructure?.hideSubSections(code, subCodes);
|
|
208
218
|
}
|
|
209
219
|
getSectionActions(code) {
|
|
210
|
-
return this._formStructure?.getSectionActions(code);
|
|
220
|
+
return this._formStructure?.getSectionActions(code) ?? null;
|
|
211
221
|
}
|
|
212
222
|
getSectionActionNames(code) {
|
|
213
|
-
return this._formStructure?.getSectionActionNames(code);
|
|
223
|
+
return this._formStructure?.getSectionActionNames(code) ?? null;
|
|
214
224
|
}
|
|
215
225
|
getTables() {
|
|
216
226
|
return this._formStructure?.getTables();
|
|
@@ -225,7 +235,7 @@ export class BasicFormComponent {
|
|
|
225
235
|
return this._formStructure?.cleanTables(codes);
|
|
226
236
|
}
|
|
227
237
|
getTable(code) {
|
|
228
|
-
return this._formStructure?.getTable(code);
|
|
238
|
+
return this._formStructure?.getTable(code) ?? null;
|
|
229
239
|
}
|
|
230
240
|
showTable(code) {
|
|
231
241
|
return this._formStructure?.showTables(code);
|
|
@@ -245,6 +255,8 @@ export class BasicFormComponent {
|
|
|
245
255
|
cleanStart() {
|
|
246
256
|
this._errorType = '';
|
|
247
257
|
this.errorCode = '';
|
|
258
|
+
this.errorFullCode = '';
|
|
259
|
+
this.errorName = '';
|
|
248
260
|
this.errorMessage = '';
|
|
249
261
|
this.errorDetail = '';
|
|
250
262
|
this._formStructure = null;
|
|
@@ -270,22 +282,28 @@ export class BasicFormComponent {
|
|
|
270
282
|
this._tableActionsFinish = {};
|
|
271
283
|
this._tableGetDataStart = {};
|
|
272
284
|
this._tableGetDataFinish = {};
|
|
285
|
+
this._actionServerError = [];
|
|
286
|
+
this._fieldServerError = [];
|
|
287
|
+
this._tableServerError = [];
|
|
288
|
+
this.onActionServerError(() => this.displayActionServerError());
|
|
289
|
+
this.onValidationServerError(() => this.displayValidationServerError());
|
|
290
|
+
this.onTableServerError(() => this.displayTableServerError());
|
|
273
291
|
}
|
|
274
292
|
get formVisible() { return this.visible; }
|
|
275
293
|
get formManager() { return this; }
|
|
276
|
-
get formCode() { return this.name; }
|
|
294
|
+
get formCode() { return this.name ?? ''; }
|
|
277
295
|
set formCode(name) { this.name = name; }
|
|
278
296
|
get inServerProcess() { return this.busy; }
|
|
279
297
|
get form() { return this._formStructure; }
|
|
280
|
-
get state() { return this._formStructure?.state; }
|
|
281
|
-
get currentState() { return this._formStructure?.state; }
|
|
282
|
-
set currentState(state) { this
|
|
298
|
+
get state() { return this._formStructure?.state ?? null; }
|
|
299
|
+
get currentState() { return this._formStructure?.state ?? ''; }
|
|
300
|
+
set currentState(state) { this?._formStructure?.changeState(state); }
|
|
283
301
|
get immutableData() { return this._formStructure?.immutableData; }
|
|
284
302
|
get extraInfo() { return this._formStructure?.extraInfo; }
|
|
285
|
-
get visibleSections() { return this._formStructure?.visibleSections; }
|
|
286
|
-
get formRoute() { return this._formRoute; }
|
|
303
|
+
get visibleSections() { return this._formStructure?.visibleSections ?? null; }
|
|
304
|
+
get formRoute() { return this._formRoute ?? ''; }
|
|
287
305
|
set formRoute(route) { this._formRoute = route; }
|
|
288
|
-
get subject() { return this.formSubject; }
|
|
306
|
+
get subject() { return this.formSubject ?? ''; }
|
|
289
307
|
// Métodos virtuales
|
|
290
308
|
customPreProcessing() { }
|
|
291
309
|
customFormStart() { }
|
|
@@ -326,11 +344,11 @@ export class BasicFormComponent {
|
|
|
326
344
|
/**
|
|
327
345
|
* @deprecated Use subject
|
|
328
346
|
*/
|
|
329
|
-
getSubject() { return this.formSubject; }
|
|
347
|
+
getSubject() { return this.formSubject ?? ''; }
|
|
330
348
|
/**
|
|
331
349
|
* @deprecated Use subject
|
|
332
350
|
*/
|
|
333
|
-
getformSubject() { return this.
|
|
351
|
+
getformSubject() { return this.formSubject ?? ''; }
|
|
334
352
|
numSections() { return this._formStructure?.sections.length; }
|
|
335
353
|
subscribeAppEvent(eventName, callback) {
|
|
336
354
|
this._eventEmiter.subscribe(eventName, callback);
|
|
@@ -354,7 +372,7 @@ export class BasicFormComponent {
|
|
|
354
372
|
canGoBack() { return this._originToken !== null; }
|
|
355
373
|
goBack() { return this.formManagerService.backTo(); }
|
|
356
374
|
goBackForm() { return this.goBack(); }
|
|
357
|
-
getOriginDetail() { return this.formManagerService
|
|
375
|
+
getOriginDetail() { return this.formManagerService?.getFormInfo(this._originToken ?? ''); }
|
|
358
376
|
setError(errorType, errorMessage, errorDetail) {
|
|
359
377
|
this._errorType = errorType || '';
|
|
360
378
|
this.errorMessage = errorMessage || '';
|
|
@@ -364,6 +382,8 @@ export class BasicFormComponent {
|
|
|
364
382
|
getErrorType() { return this._errorType; }
|
|
365
383
|
getErrorMessage() { return this.errorMessage; }
|
|
366
384
|
getErrorDetail() { return this.errorDetail; }
|
|
385
|
+
getErrorName() { return this.errorName; }
|
|
386
|
+
getErrorFullCode() { return this.errorFullCode; }
|
|
367
387
|
getErrorCode() { return this._errorType; }
|
|
368
388
|
getFormParameter(name) {
|
|
369
389
|
return (name) ? (this.extraData?.[name] ?? null) : null;
|
|
@@ -383,7 +403,7 @@ export class BasicFormComponent {
|
|
|
383
403
|
return null;
|
|
384
404
|
}
|
|
385
405
|
subscribeSectionActivation() {
|
|
386
|
-
const formSections = this._formStructure
|
|
406
|
+
const formSections = this._formStructure?.sections;
|
|
387
407
|
const sectionNames = Object.keys(formSections);
|
|
388
408
|
for (let index = 0; index < sectionNames.length; index++) {
|
|
389
409
|
const sectionName = sectionNames[index];
|
|
@@ -393,7 +413,7 @@ export class BasicFormComponent {
|
|
|
393
413
|
}
|
|
394
414
|
}
|
|
395
415
|
subscribeFieldsSubjects() {
|
|
396
|
-
const formFields = this._formStructure
|
|
416
|
+
const formFields = this._formStructure?.getFields();
|
|
397
417
|
if (Array.isArray(formFields)) {
|
|
398
418
|
formFields.forEach(field => {
|
|
399
419
|
field.editionFinish.subscribe(event => {
|
|
@@ -409,7 +429,7 @@ export class BasicFormComponent {
|
|
|
409
429
|
}
|
|
410
430
|
}
|
|
411
431
|
subscribeActionSubjects() {
|
|
412
|
-
const formActions = this._formStructure
|
|
432
|
+
const formActions = this._formStructure?.getActions();
|
|
413
433
|
if (Array.isArray(formActions)) {
|
|
414
434
|
formActions.forEach(action => {
|
|
415
435
|
action.actionActivated.subscribe(code => this.startAction(code));
|
|
@@ -417,7 +437,7 @@ export class BasicFormComponent {
|
|
|
417
437
|
}
|
|
418
438
|
}
|
|
419
439
|
subscribeTableSubjects() {
|
|
420
|
-
const formTables = this._formStructure
|
|
440
|
+
const formTables = this._formStructure?.getTables();
|
|
421
441
|
if (Array.isArray(formTables)) {
|
|
422
442
|
formTables.forEach(table => {
|
|
423
443
|
table.inlineActionTrigger.subscribe(event => this.startTableAction(event));
|
|
@@ -438,18 +458,18 @@ export class BasicFormComponent {
|
|
|
438
458
|
const formDefinition = await this.formManagerService.getFormDefinition(this.name);
|
|
439
459
|
this.busy = false;
|
|
440
460
|
this._formStructure = new FormStructureAndData(formDefinition, this.formConfig);
|
|
441
|
-
this.fields = this._formStructure
|
|
442
|
-
this.actions = this._formStructure
|
|
443
|
-
this.sections = this._formStructure
|
|
461
|
+
this.fields = this._formStructure?.fields;
|
|
462
|
+
this.actions = this._formStructure?.actions;
|
|
463
|
+
this.sections = this._formStructure?.sections;
|
|
444
464
|
this._definitionObtained = true;
|
|
445
465
|
}
|
|
446
466
|
else {
|
|
447
467
|
this.cleanData();
|
|
448
468
|
}
|
|
449
469
|
if (!this.supportState(initialState)) {
|
|
450
|
-
initialState = this._formStructure
|
|
470
|
+
initialState = this._formStructure?.defaultState ?? null;
|
|
451
471
|
}
|
|
452
|
-
this._formStructure
|
|
472
|
+
this._formStructure?.changeState(initialState || this._formStructure?.defaultState);
|
|
453
473
|
const inputFieldNames = Object.keys(this.inputDataFields);
|
|
454
474
|
for (let index = 0; index < inputFieldNames.length; index++) {
|
|
455
475
|
const fieldCode = inputFieldNames[index];
|
|
@@ -459,7 +479,7 @@ export class BasicFormComponent {
|
|
|
459
479
|
const recordResponse = await this.requestFormAction(formActions.getData);
|
|
460
480
|
this.checkErrorRecordReceived(recordResponse);
|
|
461
481
|
this.visible = true;
|
|
462
|
-
this.enabledSections = this._formStructure?.visibleSections;
|
|
482
|
+
this.enabledSections = this._formStructure?.visibleSections ?? [];
|
|
463
483
|
this.subscribeSectionActivation();
|
|
464
484
|
this.subscribeFieldsSubjects();
|
|
465
485
|
this.subscribeActionSubjects();
|
|
@@ -472,6 +492,8 @@ export class BasicFormComponent {
|
|
|
472
492
|
return false;
|
|
473
493
|
}
|
|
474
494
|
this.errorCode = recordResponse.errorCode;
|
|
495
|
+
this.errorFullCode = recordResponse.errorFullCode;
|
|
496
|
+
this.errorName = recordResponse.errorName;
|
|
475
497
|
this.errorMessage = recordResponse.errorMessage;
|
|
476
498
|
this.errorDetail = recordResponse.errorDetail;
|
|
477
499
|
return true;
|
|
@@ -486,14 +508,16 @@ export class BasicFormComponent {
|
|
|
486
508
|
const actionDetail = {
|
|
487
509
|
formCode: this.name,
|
|
488
510
|
formSubject: this.formSubject,
|
|
489
|
-
currentMode: this._formStructure
|
|
511
|
+
currentMode: this._formStructure?.state,
|
|
490
512
|
actionCode,
|
|
491
513
|
actionSubject,
|
|
492
514
|
version: PAYLOAD_VERSION,
|
|
493
|
-
formData: this._formStructure
|
|
494
|
-
immutableData: this._formStructure
|
|
515
|
+
formData: this._formStructure?.getPayload(),
|
|
516
|
+
immutableData: this._formStructure?.immutableData,
|
|
495
517
|
};
|
|
496
518
|
this.errorCode = NO_ERROR;
|
|
519
|
+
this.errorFullCode = '';
|
|
520
|
+
this.errorName = '';
|
|
497
521
|
this.errorMessage = '';
|
|
498
522
|
this.errorDetail = '';
|
|
499
523
|
this.busy = true;
|
|
@@ -505,6 +529,8 @@ export class BasicFormComponent {
|
|
|
505
529
|
if (formActionResponse.hasError()) {
|
|
506
530
|
const error = formActionResponse.error;
|
|
507
531
|
this.errorCode = error.errorCode;
|
|
532
|
+
this.errorFullCode = error.errorFullCode;
|
|
533
|
+
this.errorName = error.errorName;
|
|
508
534
|
this.errorMessage = error.errorMessage;
|
|
509
535
|
this.errorDetail = error.errorDetail;
|
|
510
536
|
}
|
|
@@ -545,13 +571,36 @@ export class BasicFormComponent {
|
|
|
545
571
|
if (returnedFile && returnedFile.file) {
|
|
546
572
|
this.fileMgmtServices.saveFile(returnedFile.file, returnedFile.name, returnedFile.type);
|
|
547
573
|
}
|
|
548
|
-
this._formStructure
|
|
549
|
-
|
|
574
|
+
if (this._formStructure) {
|
|
575
|
+
this._formStructure.immutableData = immutableData;
|
|
576
|
+
this._formStructure.extraInfo = extraInfo;
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Manejo de event handlers para errores Server del formulario
|
|
581
|
+
*/
|
|
582
|
+
cleanActionServerError() {
|
|
583
|
+
this._actionServerError = [];
|
|
584
|
+
}
|
|
585
|
+
cleanFieldServerError() {
|
|
586
|
+
this._fieldServerError = [];
|
|
587
|
+
}
|
|
588
|
+
cleanTableServerError() {
|
|
589
|
+
this._tableServerError = [];
|
|
590
|
+
}
|
|
591
|
+
onActionServerError(callback, properties = null) {
|
|
592
|
+
this._actionServerError.push({ callback, properties });
|
|
593
|
+
}
|
|
594
|
+
onValidationServerError(callback, properties = null) {
|
|
595
|
+
this._fieldServerError.push({ callback, properties });
|
|
596
|
+
}
|
|
597
|
+
onTableServerError(callback, properties = null) {
|
|
598
|
+
this._tableServerError.push({ callback, properties });
|
|
550
599
|
}
|
|
551
600
|
/**
|
|
552
601
|
* Manejo de event handlers para acciones sobre el formulario
|
|
553
602
|
*/
|
|
554
|
-
|
|
603
|
+
onSectionActivation(codes, callback, properties = null) {
|
|
555
604
|
const sectionSet = (Array.isArray(codes)) ? codes : (codes ? [codes] : []);
|
|
556
605
|
sectionSet.forEach((sectionName) => {
|
|
557
606
|
if (!this._formSectionsActivate[sectionName]) {
|
|
@@ -560,7 +609,7 @@ export class BasicFormComponent {
|
|
|
560
609
|
this._formSectionsActivate[sectionName].push({ callback, properties });
|
|
561
610
|
});
|
|
562
611
|
}
|
|
563
|
-
|
|
612
|
+
onSectionInactivation(codes, callback, properties = null) {
|
|
564
613
|
const sectionSet = (Array.isArray(codes)) ? codes : (codes ? [codes] : []);
|
|
565
614
|
sectionSet.forEach((sectionName) => {
|
|
566
615
|
if (!this._formSectionsInactivate[sectionName]) {
|
|
@@ -569,7 +618,7 @@ export class BasicFormComponent {
|
|
|
569
618
|
this._formSectionsInactivate[sectionName].push({ callback, properties });
|
|
570
619
|
});
|
|
571
620
|
}
|
|
572
|
-
|
|
621
|
+
onActionStart(codes, callback, properties = null) {
|
|
573
622
|
const actionSet = (Array.isArray(codes)) ? codes : (codes ? [codes] : []);
|
|
574
623
|
actionSet.forEach((actionName) => {
|
|
575
624
|
if (!this._formActionsStart[actionName]) {
|
|
@@ -578,7 +627,7 @@ export class BasicFormComponent {
|
|
|
578
627
|
this._formActionsStart[actionName].push({ callback, properties });
|
|
579
628
|
});
|
|
580
629
|
}
|
|
581
|
-
|
|
630
|
+
onActionFinish(codes, callback, properties = null) {
|
|
582
631
|
const actionSet = (Array.isArray(codes)) ? codes : (codes ? [codes] : []);
|
|
583
632
|
actionSet.forEach((actionName) => {
|
|
584
633
|
if (!this._formActionsFinish[actionName]) {
|
|
@@ -588,7 +637,7 @@ export class BasicFormComponent {
|
|
|
588
637
|
});
|
|
589
638
|
}
|
|
590
639
|
async launchSectionActivation(code) {
|
|
591
|
-
const sectionObject = this._formStructure
|
|
640
|
+
const sectionObject = this._formStructure?.getSection(code);
|
|
592
641
|
if (!sectionObject) {
|
|
593
642
|
return;
|
|
594
643
|
}
|
|
@@ -601,7 +650,7 @@ export class BasicFormComponent {
|
|
|
601
650
|
}
|
|
602
651
|
}
|
|
603
652
|
async launchSectionInactivation(code) {
|
|
604
|
-
const sectionObject = this._formStructure
|
|
653
|
+
const sectionObject = this._formStructure?.getSection(code);
|
|
605
654
|
if (!sectionObject) {
|
|
606
655
|
return;
|
|
607
656
|
}
|
|
@@ -651,7 +700,10 @@ export class BasicFormComponent {
|
|
|
651
700
|
action.newState && this.changeState(action.newState);
|
|
652
701
|
}
|
|
653
702
|
else {
|
|
654
|
-
this.
|
|
703
|
+
for (let index = 0; index < this._actionServerError.length; index++) {
|
|
704
|
+
const { callback, properties } = this._actionServerError[index];
|
|
705
|
+
callback(action);
|
|
706
|
+
}
|
|
655
707
|
}
|
|
656
708
|
action.stop();
|
|
657
709
|
}
|
|
@@ -675,7 +727,7 @@ export class BasicFormComponent {
|
|
|
675
727
|
/**
|
|
676
728
|
* Manejadores de eventos para validaciones sobre campos
|
|
677
729
|
*/
|
|
678
|
-
|
|
730
|
+
onFieldInput(codes, callback, properties = null) {
|
|
679
731
|
const fieldSet = (Array.isArray(codes)) ? codes : (codes ? [codes] : []);
|
|
680
732
|
fieldSet.forEach((fieldCode) => {
|
|
681
733
|
if (!this._fieldInputValidation[fieldCode]) {
|
|
@@ -684,7 +736,7 @@ export class BasicFormComponent {
|
|
|
684
736
|
this._fieldInputValidation[fieldCode].push({ callback, properties });
|
|
685
737
|
});
|
|
686
738
|
}
|
|
687
|
-
|
|
739
|
+
onFieldValidationStart(codes, callback, properties = null) {
|
|
688
740
|
const fieldSet = (Array.isArray(codes)) ? codes : (codes ? [codes] : []);
|
|
689
741
|
fieldSet.forEach((fieldCode) => {
|
|
690
742
|
if (!this._fieldValidationsStart[fieldCode]) {
|
|
@@ -693,7 +745,7 @@ export class BasicFormComponent {
|
|
|
693
745
|
this._fieldValidationsStart[fieldCode].push({ callback, properties });
|
|
694
746
|
});
|
|
695
747
|
}
|
|
696
|
-
|
|
748
|
+
onFieldValidationFinish(codes, callback, properties = null) {
|
|
697
749
|
const fieldSet = (Array.isArray(codes)) ? codes : (codes ? [codes] : []);
|
|
698
750
|
fieldSet.forEach((fieldCode) => {
|
|
699
751
|
if (!this._fieldValidationsFinish[fieldCode]) {
|
|
@@ -749,6 +801,9 @@ export class BasicFormComponent {
|
|
|
749
801
|
? this.getField(inputField) : inputField;
|
|
750
802
|
let serverError = false;
|
|
751
803
|
let validationResult = true;
|
|
804
|
+
if (!fieldObj) {
|
|
805
|
+
return;
|
|
806
|
+
}
|
|
752
807
|
if (fieldObj.backend) {
|
|
753
808
|
fieldObj.validating = true;
|
|
754
809
|
validationResult = await this
|
|
@@ -757,9 +812,12 @@ export class BasicFormComponent {
|
|
|
757
812
|
}
|
|
758
813
|
await this.finishFieldValidation(fieldObj, validationResult, serverError);
|
|
759
814
|
if (serverError) {
|
|
760
|
-
fieldObj
|
|
761
|
-
fieldObj
|
|
762
|
-
this.
|
|
815
|
+
fieldObj?.setErrorCode(this.errorCode);
|
|
816
|
+
fieldObj?.setErrorMessage(this.errorMessage);
|
|
817
|
+
for (let index = 0; index < this._fieldServerError.length; index++) {
|
|
818
|
+
const { callback, properties } = this._fieldServerError[index];
|
|
819
|
+
callback(fieldObj);
|
|
820
|
+
}
|
|
763
821
|
}
|
|
764
822
|
fieldObj.validating = false;
|
|
765
823
|
}
|
|
@@ -783,7 +841,7 @@ export class BasicFormComponent {
|
|
|
783
841
|
/**
|
|
784
842
|
* Manejadores de eventos para acciones sobre Tablas
|
|
785
843
|
*/
|
|
786
|
-
|
|
844
|
+
onTableActionStart(code, actionCode, callback, properties = null) {
|
|
787
845
|
const tableObject = this.getTable(code);
|
|
788
846
|
if (!tableObject) {
|
|
789
847
|
return;
|
|
@@ -805,7 +863,7 @@ export class BasicFormComponent {
|
|
|
805
863
|
}
|
|
806
864
|
tableEventHandlers[actionCode].push({ callback, properties });
|
|
807
865
|
}
|
|
808
|
-
|
|
866
|
+
onTableActionFinish(code, actionCode, callback, properties = null) {
|
|
809
867
|
const tableObject = this.getTable(code);
|
|
810
868
|
if (!tableObject) {
|
|
811
869
|
return;
|
|
@@ -827,7 +885,7 @@ export class BasicFormComponent {
|
|
|
827
885
|
}
|
|
828
886
|
tableEventHandlers[actionCode].push({ callback, properties });
|
|
829
887
|
}
|
|
830
|
-
|
|
888
|
+
onTableSelectionStart(code, callback, properties = null) {
|
|
831
889
|
const tableObject = this.getTable(code);
|
|
832
890
|
if (!tableObject) {
|
|
833
891
|
return;
|
|
@@ -842,7 +900,7 @@ export class BasicFormComponent {
|
|
|
842
900
|
}
|
|
843
901
|
tableEventHandlers.push({ callback, properties });
|
|
844
902
|
}
|
|
845
|
-
|
|
903
|
+
onTableSelectionFinish(code, callback, properties = null) {
|
|
846
904
|
const tableObject = this.getTable(code);
|
|
847
905
|
if (!tableObject) {
|
|
848
906
|
return;
|
|
@@ -857,7 +915,7 @@ export class BasicFormComponent {
|
|
|
857
915
|
}
|
|
858
916
|
tableEventHandlers.push({ callback, properties });
|
|
859
917
|
}
|
|
860
|
-
|
|
918
|
+
onTableGetDataStart(code, callback, properties = null) {
|
|
861
919
|
const tableObject = this.getTable(code);
|
|
862
920
|
if (!tableObject) {
|
|
863
921
|
return;
|
|
@@ -872,7 +930,7 @@ export class BasicFormComponent {
|
|
|
872
930
|
}
|
|
873
931
|
tableEventHandlers.push({ callback, properties });
|
|
874
932
|
}
|
|
875
|
-
|
|
933
|
+
onTableGetDataFinish(code, callback, properties = null) {
|
|
876
934
|
const tableObject = this.getTable(code);
|
|
877
935
|
if (!tableObject) {
|
|
878
936
|
return;
|
|
@@ -944,7 +1002,10 @@ export class BasicFormComponent {
|
|
|
944
1002
|
action.newState && this.changeState(action.newState);
|
|
945
1003
|
}
|
|
946
1004
|
else {
|
|
947
|
-
this.
|
|
1005
|
+
for (let index = 0; index < this._tableServerError.length; index++) {
|
|
1006
|
+
const { callback, properties } = this._tableServerError[index];
|
|
1007
|
+
callback(tableObject);
|
|
1008
|
+
}
|
|
948
1009
|
}
|
|
949
1010
|
tableObject.freeWaiting();
|
|
950
1011
|
}
|
|
@@ -1268,8 +1329,8 @@ export class BasicFormComponent {
|
|
|
1268
1329
|
return false;
|
|
1269
1330
|
}
|
|
1270
1331
|
let validationError = false;
|
|
1271
|
-
const requiredEmptyFields = this.getRequiredEmptyFields(null, sectionCode);
|
|
1272
|
-
if (requiredEmptyFields
|
|
1332
|
+
const requiredEmptyFields = this.getRequiredEmptyFields(null, sectionCode) ?? [];
|
|
1333
|
+
if (requiredEmptyFields?.length > 0) {
|
|
1273
1334
|
validationError = true;
|
|
1274
1335
|
this.setError(this.formConfig.formStandardErrors.typeWarning, this.formConfig.formStandardErrors.validationTitle, this.formConfig.formStandardErrors.requiredFields);
|
|
1275
1336
|
this.tagFieldsWithError(this.formConfig.formStandardErrors.requiredField, requiredEmptyFields);
|
|
@@ -1279,13 +1340,15 @@ export class BasicFormComponent {
|
|
|
1279
1340
|
break;
|
|
1280
1341
|
}
|
|
1281
1342
|
}
|
|
1282
|
-
const validationIssueFields = this.getFieldsWithValidationIssues(null, sectionCode);
|
|
1343
|
+
const validationIssueFields = this.getFieldsWithValidationIssues(null, sectionCode) ?? [];
|
|
1283
1344
|
if (!validationError && validationIssueFields.length > 0) {
|
|
1284
1345
|
validationError = true;
|
|
1285
1346
|
this.setError(this.formConfig.formStandardErrors.typeWarning, this.formConfig.formStandardErrors.validationTitle, this.formConfig.formStandardErrors.validationFields);
|
|
1286
1347
|
for (const fieldCode of validationIssueFields) {
|
|
1287
1348
|
const validationIssueField = this.getField(fieldCode);
|
|
1288
|
-
validationIssueField
|
|
1349
|
+
if (validationIssueField) {
|
|
1350
|
+
validationIssueField.focus();
|
|
1351
|
+
}
|
|
1289
1352
|
break;
|
|
1290
1353
|
}
|
|
1291
1354
|
}
|
|
@@ -1293,14 +1356,59 @@ export class BasicFormComponent {
|
|
|
1293
1356
|
}
|
|
1294
1357
|
copyTableRecordToFields(tableObj, mappingTable = null) {
|
|
1295
1358
|
const tableObject = this.getTable(tableObj.tableCode);
|
|
1296
|
-
const tableRecord = tableObject
|
|
1297
|
-
const columnNames = tableObject
|
|
1298
|
-
|
|
1299
|
-
const
|
|
1300
|
-
|
|
1301
|
-
|
|
1359
|
+
const tableRecord = tableObject?.getTableRecord(tableObj.recordId);
|
|
1360
|
+
const columnNames = tableObject?.columnNames;
|
|
1361
|
+
if (tableRecord && columnNames) {
|
|
1362
|
+
for (const columnName of columnNames) {
|
|
1363
|
+
const columnValue = tableRecord.getFieldValue(columnName) ?? '';
|
|
1364
|
+
const fieldCode = mappingTable?.[columnName] ?? columnName;
|
|
1365
|
+
this.setFieldValue(fieldCode, columnValue);
|
|
1366
|
+
}
|
|
1367
|
+
return true;
|
|
1302
1368
|
}
|
|
1303
|
-
return
|
|
1369
|
+
return false;
|
|
1370
|
+
}
|
|
1371
|
+
/**
|
|
1372
|
+
* Métodos Legacy de compatibilidad hacia atrás
|
|
1373
|
+
*/
|
|
1374
|
+
addSectionActivation(codes, callback, properties = null) {
|
|
1375
|
+
return this.onSectionActivation(codes, callback, properties);
|
|
1376
|
+
}
|
|
1377
|
+
addSectionInactivation(codes, callback, properties = null) {
|
|
1378
|
+
return this.onSectionInactivation(codes, callback, properties);
|
|
1379
|
+
}
|
|
1380
|
+
addActionMethodStart(codes, callback, properties = null) {
|
|
1381
|
+
return this.onActionStart(codes, callback, properties);
|
|
1382
|
+
}
|
|
1383
|
+
addActionMethodFinish(codes, callback, properties = null) {
|
|
1384
|
+
return this.onActionFinish(codes, callback, properties);
|
|
1385
|
+
}
|
|
1386
|
+
addFieldInputValidation(codes, callback, properties = null) {
|
|
1387
|
+
return this.onFieldInput(codes, callback, properties);
|
|
1388
|
+
}
|
|
1389
|
+
addFieldValidationStart(codes, callback, properties = null) {
|
|
1390
|
+
return this.onFieldValidationStart(codes, callback, properties);
|
|
1391
|
+
}
|
|
1392
|
+
addFieldValidationFinish(codes, callback, properties = null) {
|
|
1393
|
+
return this.onFieldValidationFinish(codes, callback, properties);
|
|
1394
|
+
}
|
|
1395
|
+
addTableActionStart(code, actionCode, callback, properties = null) {
|
|
1396
|
+
return this.onTableActionStart(code, actionCode, callback, properties);
|
|
1397
|
+
}
|
|
1398
|
+
addTableActionFinish(code, actionCode, callback, properties = null) {
|
|
1399
|
+
return this.onTableActionFinish(code, actionCode, callback, properties);
|
|
1400
|
+
}
|
|
1401
|
+
addTableSelectionStart(code, callback, properties = null) {
|
|
1402
|
+
return this.onTableSelectionStart(code, callback, properties);
|
|
1403
|
+
}
|
|
1404
|
+
addTableSelectionFinish(code, callback, properties = null) {
|
|
1405
|
+
return this.onTableSelectionFinish(code, callback, properties);
|
|
1406
|
+
}
|
|
1407
|
+
addTableGetDataStart(code, callback, properties = null) {
|
|
1408
|
+
return this.onTableGetDataStart(code, callback, properties);
|
|
1409
|
+
}
|
|
1410
|
+
addTableGetDataFinish(code, callback, properties = null) {
|
|
1411
|
+
return this.onTableGetDataFinish(code, callback, properties);
|
|
1304
1412
|
}
|
|
1305
1413
|
}
|
|
1306
1414
|
BasicFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: BasicFormComponent, deps: [{ token: i1.LibFormManagerService }, { token: i2.LibEventManagerService }, { token: i3.LibFileManagementService }], target: i0.ɵɵFactoryTarget.Component });
|
|
@@ -1311,4 +1419,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImpor
|
|
|
1311
1419
|
template: `<ng-content></ng-content>`
|
|
1312
1420
|
}]
|
|
1313
1421
|
}], ctorParameters: function () { return [{ type: i1.LibFormManagerService }, { type: i2.LibEventManagerService }, { type: i3.LibFileManagementService }]; } });
|
|
1314
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWMtZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1YWluLW5nLWZvcm1zLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvYmFzaWMtZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSWhFLE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLG9DQUFvQyxDQUFDOzs7OztBQU9uRixNQUFNLGVBQWUsR0FBRyxtQkFBbUIsQ0FBQztBQUM1QyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUM7QUFDL0IsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDO0FBQy9CLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQztBQUVsQyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUM7QUFDMUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDO0FBS3RCLE1BQU0sT0FBTyxrQkFBa0I7SUE4TzdCLFlBQ1ksa0JBQXlDLEVBQ3pDLGFBQXFDLEVBQ3JDLGdCQUEwQztRQUYxQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXVCO1FBQ3pDLGtCQUFhLEdBQWIsYUFBYSxDQUF3QjtRQUNyQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQTBCO1FBaFA5QyxtQkFBYyxHQUF5QixJQUFJLENBQUM7UUFDNUMsa0JBQWEsR0FBVyxJQUFJLENBQUM7UUFHN0Isd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBQzdDLCtCQUErQjtRQUN2QiwwQkFBcUIsR0FBUSxFQUFFLENBQUM7UUFDaEMsNEJBQXVCLEdBQVEsRUFBRSxDQUFDO1FBQ2xDLHNCQUFpQixHQUFRLEVBQUUsQ0FBQztRQUM1Qix1QkFBa0IsR0FBUSxFQUFFLENBQUM7UUFDN0IsMEJBQXFCLEdBQVEs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QUMsVUFBVSxDQUFDLElBQUksVUFBVSxDQUFDO1lBQzNELElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1NBQzVDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOzsrR0E5ekNVLGtCQUFrQjttR0FBbEIsa0JBQWtCLG9EQUZuQiwyQkFBMkI7MkZBRTFCLGtCQUFrQjtrQkFIOUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsMkJBQTJCO2lCQUN0QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybVN0cnVjdHVyZUFuZERhdGEgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2Zvcm1zL2Zvcm0nO1xuaW1wb3J0IHsgTGliRm9ybU1hbmFnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZm9ybS1tYW5hZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGliRXZlbnRNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2V2ZW50LW1hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBMaWJGaWxlTWFuYWdlbWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maWxlLW1hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBmb3JtQWN0aW9ucywgTk9fRVJST1IsIEhFQURFUiB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZm9ybXMvZm9ybS5jb25zdGFudHMnO1xuaW1wb3J0IHsgRm9ybUFjdGlvbiB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZm9ybXMvYWN0aW9uJztcbmltcG9ydCB7IEZpZWxkRGVzY3JpcHRvciwgRmllbGRPcHRpb24gfSBmcm9tICcuLi8uLi9jbGFzc2VzL2Zvcm1zL2ZpZWxkJztcbmltcG9ydCB7IFJlY29yZFRhYmxlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9mb3Jtcy90YWJsZS90YWJsZSc7XG5pbXBvcnQgeyBSZWNvcmRGb3JtU2VjdGlvbiB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZm9ybXMvc2VjdGlvbic7XG5pbXBvcnQgeyBSZWNvcmRGb3JtU3ViU2VjdGlvbiB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZm9ybXMvc3Vic2VjdGlvbic7XG5cbmNvbnN0IFBBWUxPQURfVkVSU0lPTiA9ICdUVUFJTkVYQ0hBTkdFXzEuMCc7XG5jb25zdCBJTkxJTkVfQUNUSU9OID0gJ0lOTElORSc7XG5jb25zdCBHTE9CQUxfQUNUSU9OID0gJ0dMT0JBTCc7XG5jb25zdCBHRVRfREFUQV9BQ1RJT04gPSAnR0VUREFUQSc7XG5cbmNvbnN0IFNVQkpFQ1QgPSAnc3ViamVjdCc7XG5jb25zdCBUT0tFTiA9ICd0b2tlbic7XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gXG59KVxuZXhwb3J0IGNsYXNzIEJhc2ljRm9ybUNvbXBvbmVudCB7XG4gIHByaXZhdGUgX2Zvcm1TdHJ1Y3R1cmU6IEZvcm1TdHJ1Y3R1cmVBbmREYXRhID0gbnVsbDtcbiAgcHJpdmF0ZSBfY29udHJvbFRva2VuOiBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIF9vcmlnaW5Ub2tlbjogc3RyaW5nO1xuICBwcml2YXRlIF9mb3JtUm91dGU6IHN0cmluZztcbiAgcHJpdmF0ZSBfZGVmaW5pdGlvbk9idGFpbmVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIEV2ZW50b3MgZGUgYWNjaW9uZXMgeSBjYW1wb3NcbiAgcHJpdmF0ZSBfZm9ybVNlY3Rpb25zQWN0aXZhdGU6IGFueSA9IHt9O1xuICBwcml2YXRlIF9mb3JtU2VjdGlvbnNJbmFjdGl2YXRlOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBfZm9ybUFjdGlvbnNTdGFydDogYW55ID0ge307XG4gIHByaXZhdGUgX2Zvcm1BY3Rpb25zRmluaXNoOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBfZmllbGRJbnB1dFZhbGlkYXRpb246IGFueSA9IHt9O1xuICBwcml2YXRlIF9maWVsZFZhbGlkYXRpb25zU3RhcnQ6IGFueSA9IHt9O1xuICBwcml2YXRlIF9maWVsZFZhbGlkYXRpb25zRmluaXNoOiBhbnkgPSB7fTtcbiAgLy8gQ2FsbGJhY2sgZGUgYWNjaW9uZXMgZGUgdGFibGFzXG4gIHByaXZhdGUgX3RhYmxlU2VsZWN0aW9uc1N0YXJ0OiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBfdGFibGVTZWxlY3Rpb25zRmluaXNoOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBfdGFibGVBY3Rpb25zU3RhcnQ6IGFueSA9IHt9O1xuICBwcml2YXRlIF90YWJsZUFjdGlvbnNGaW5pc2g6IGFueSA9IHt9O1xuICBwcml2YXRlIF90YWJsZUdldERhdGFTdGFydDogYW55ID0ge307XG4gIHByaXZhdGUgX3RhYmxlR2V0RGF0YUZpbmlzaDogYW55ID0ge307XG5cbiAgcHJvdGVjdGVkIGlucHV0RGF0YUZpZWxkczogYW55ID0ge307XG4gIHByb3RlY3RlZCBleHRyYURhdGE6IGFueSA9IHt9O1xuICBwcm90ZWN0ZWQgX2V2ZW50RW1pdGVyOiBMaWJFdmVudE1hbmFnZXJTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgZW5hYmxlZFNlY3Rpb25zOiBSZWNvcmRGb3JtU2VjdGlvbltdO1xuXG5cbiAgZm9ybUNvbmZpZzogYW55O1xuICBuYW1lOiBzdHJpbmc7XG4gIGZvcm1TdWJqZWN0OiBzdHJpbmc7XG4gIF9lcnJvclR5cGU6IHN0cmluZyA9ICcnO1xuICBlcnJvckNvZGU6IHN0cmluZyA9ICcnO1xuICBlcnJvck1lc3NhZ2U6IHN0cmluZyA9ICcnO1xuICBlcnJvckRldGFpbDogc3RyaW5nID0gJyc7XG4gIHZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBmaWVsZHM6IGFueTtcbiAgYWN0aW9uczogYW55O1xuICBzZWN0aW9uczogYW55O1xuICBidXN5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgZ2V0VGl0bGUoKSB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRUaXRsZSgpOyB9XG4gIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpIHsgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNldFRpdGxlKHRpdGxlKTsgfVxuICBjbGVhbkRhdGEoKSB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5jbGVhbkRhdGEoKTsgfVxuICBnZXRDdXJyZW50U3RhdGUoKSB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRDdXJyZW50U3RhdGUoKTsgfVxuICBzdXBwb3J0U3RhdGUoc3RhdGU6IHN0cmluZykgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc3VwcG9ydFN0YXRlKHN0YXRlKTsgfVxuICBjaGFuZ2VTdGF0ZShzdGF0ZSkgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uY2hhbmdlU3RhdGUoc3RhdGUpOyB9XG4gIGdldFN0YXRlcygpIHsgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnN0YXRlczsgfVxuICBnZXRJbW11dGFibGVFbGVtZW50KG5hbWU6IHN0cmluZykgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0SW1tdXRhYmxlRWxlbWVudChuYW1lKTsgfVxuICBnZXRFeHRyYUluZm8obmFtZTogc3RyaW5nKSB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRFeHRyYUluZm8obmFtZSk7IH1cbiAgZ2V0RmllbGRzKCkgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0RmllbGRzKCk7IH1cbiAgZ2V0RmllbGROYW1lcygpIHsgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldEZpZWxkTmFtZXMoKTsgfVxuICBnZXRGaWVsZChjb2RlOiBzdHJpbmcpIHsgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldEZpZWxkKGNvZGUpOyB9XG4gIGVuYWJsZUZpZWxkKGNvZGU6IHN0cmluZykgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZW5hYmxlRmllbGQoY29kZSk7IH1cbiAgZGlzYWJsZUZpZWxkKGNvZGU6IHN0cmluZykgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZGlzYWJsZUZpZWxkKGNvZGUpOyB9XG4gIGdldEZpZWxkVmFsdWUoY29kZTogc3RyaW5nKTogYW55IHsgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldEZpZWxkVmFsdWUoY29kZSk7IH1cbiAgZ2V0RmllbGRPcHRpb25UZXh0KGNvZGU6IHN0cmluZyk6IGFueSB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRGaWVsZE9wdGlvblRleHQoY29kZSk7IH1cbiAgZ2V0RmllbGRzVmFsdWVzKGNvZGVzOiBzdHJpbmdbXSkgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0RmllbGRzVmFsdWVzKGNvZGVzKTsgfVxuICBnZXRGaWVsZE9wdGlvbnMoY29kZTogc3RyaW5nKTogRmllbGRPcHRpb25bXSB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRGaWVsZE9wdGlvbnMoY29kZSk7IH1cbiAgc2V0RmllbGRWYWx1ZShjb2RlOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHsgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNldEZpZWxkVmFsdWUoY29kZSwgdmFsdWUpOyB9XG4gIHNldEZpZWxkUmVxdWlyZWQoY29kZTogc3RyaW5nLCByZXF1aXJlZDogYm9vbGVhbikgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2V0RmllbGRSZXF1aXJlZChjb2RlLCByZXF1aXJlZCk7IH1cbiAgc2V0RmllbGRFcnJvck1lc3NhZ2UoY29kZTogc3RyaW5nLCBlcnJvck1lc3NhZ2U6IHN0cmluZykgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2V0RmllbGRFcnJvck1lc3NhZ2UoY29kZSwgZXJyb3JNZXNzYWdlKTsgfVxuICBzZXRGaWVsZEVycm9yKGNvZGU6IHN0cmluZywgZXJyb3JDb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgdHlwZT86IHN0cmluZykgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2V0RmllbGRFcnJvcihjb2RlLCBlcnJvckNvZGUsIG1lc3NhZ2UsIHR5cGUpOyB9XG4gIHNldEZpZWxkSW50cmluc2ljRXJyb3JNZXNzYWdlKGNvZGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNldEZpZWxkSW50cmluc2ljRXJyb3JNZXNzYWdlKGNvZGUsIG1lc3NhZ2UpO1xuICB9XG4gIHNldEZpZWxkT3B0aW9ucyhjb2RlLCBvcHRpb25zQXJyYXksIGlkQXR0cmlidXRlLCBuYW1lQXR0cmlidXRlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNldEZpZWxkT3B0aW9ucyhjb2RlLCBvcHRpb25zQXJyYXksIGlkQXR0cmlidXRlLCBuYW1lQXR0cmlidXRlKTtcbiAgfVxuICBnZXRGaWVsZFNldChmaWx0ZXJGdW5jPywgY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0RmllbGRTZXQoZmlsdGVyRnVuYywgY29kZXMsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG4gIGFwcGx5T25GaWVsZHMocHJvY2Vzc0Z1bmMsIGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmFwcGx5T25GaWVsZHMocHJvY2Vzc0Z1bmMsIGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBhcHBseVByb2Nlc3NUb0FsbEZpZWxkcyhwcm9jZXNzRnVuYykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5hcHBseU9uRmllbGRzKHByb2Nlc3NGdW5jKTtcbiAgfVxuICBjbGVhbkZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5jbGVhbkZpZWxkcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgZ2V0UmVxdWlyZWRGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0UmVxdWlyZWRGaWVsZHMoY29kZXMsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG4gIGdldFJlcXVpcmVkRW1wdHlGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0UmVxdWlyZWRFbXB0eUZpZWxkcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgZ2V0Q2hhbmdlZEZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRDaGFuZ2VkRmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBnZXRGaWVsZHNXaXRoVmFsaWRhdGlvbklzc3Vlcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRGaWVsZHNXaXRoVmFsaWRhdGlvbklzc3Vlcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgdGFnRmllbGRzV2l0aEVycm9yKGVycm9yTWVzc2FnZTogc3RyaW5nLCBjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy50YWdGaWVsZHNXaXRoRXJyb3IoZXJyb3JNZXNzYWdlLCBjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgY2xlYW5FcnJvckZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5jbGVhbkVycm9yRmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBzaG93TGFiZWxGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2hvd0xhYmVsRmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBoaWRlTGFiZWxGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uaGlkZUxhYmVsRmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBlbmFibGVGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZW5hYmxlRmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBkaXNhYmxlRmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmRpc2FibGVGaWVsZHMoY29kZXMsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZW5hYmxlRmllbGRzXG4gICAqL1xuICBlbmFibGVFZGl0RmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlRmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGRpc2FibGVGaWVsZHNcbiAgICovXG4gIGRpc2FibGVFZGl0RmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZUZpZWxkcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgc2hvd0ZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zaG93RmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBoaWRlRmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmhpZGVGaWVsZHMoY29kZXMsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG4gIGdldEFjdGlvbnNCeUF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldEFjdGlvbnNCeUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0SGVhZGVyQWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0QWN0aW9uc0J5QXR0cmlidXRlKCdsb2NhdGlvbicsIEhFQURFUik7XG4gIH1cbiAgZ2V0QWN0aW9uKGFjdGlvbkNvZGU6IHN0cmluZyk6IEZvcm1BY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRBY3Rpb24oYWN0aW9uQ29kZSk7XG4gIH1cbiAgc2hvd0FjdGlvbnMoYWN0aW9uQXJyYXkpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2hvd0FjdGlvbnMoYWN0aW9uQXJyYXkpO1xuICB9XG4gIGhpZGVBY3Rpb25zKGFjdGlvbkFycmF5KTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmhpZGVBY3Rpb25zKGFjdGlvbkFycmF5KTtcbiAgfVxuICBlbmFibGVBY3Rpb25zKGFjdGlvbkFycmF5KTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmVuYWJsZUFjdGlvbnMoYWN0aW9uQXJyYXkpO1xuICB9XG4gIGRpc2FibGVBY3Rpb25zKGFjdGlvbkFycmF5KTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmRpc2FibGVBY3Rpb25zKGFjdGlvbkFycmF5KTtcbiAgfVxuICBzaG93QWN0aW9uKGNvZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zaG93QWN0aW9ucyhjb2RlKTtcbiAgfVxuICBoaWRlQWN0aW9uKGNvZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5oaWRlQWN0aW9ucyhjb2RlKTtcbiAgfVxuICBlbmFibGVBY3Rpb24oY29kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmVuYWJsZUFjdGlvbnMoY29kZSk7XG4gIH1cbiAgZGlzYWJsZUFjdGlvbihjb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZGlzYWJsZUFjdGlvbnMoY29kZSk7XG4gIH1cbiAgZ2V0U2VjdGlvbnMoKTogUmVjb3JkRm9ybVNlY3Rpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldFNlY3Rpb25zKCk7XG4gIH1cbiAgYWN0aXZhdGVTZWN0aW9uKGNvZGUpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uYWN0aXZhdGVTZWN0aW9uKGNvZGUpO1xuICB9XG4gIGdldFNlY3Rpb25zVGl0bGVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0U2VjdGlvbnMoKS5tYXAoc2VjID0+IHNlYy50aXRsZSk7XG4gIH1cbiAgZ2V0U2VjdGlvbihjb2RlOiBzdHJpbmcpOiBSZWNvcmRGb3JtU2VjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldFNlY3Rpb24oY29kZSk7XG4gIH1cbiAgc2hvd1NlY3Rpb24oY29kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNob3dTZWN0aW9ucyhjb2RlKTtcbiAgfVxuICBoaWRlU2VjdGlvbihjb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uaGlkZVNlY3Rpb25zKGNvZGUpO1xuICB9XG4gIHNob3dTZWN0aW9ucyhjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2hvd1NlY3Rpb25zKGNvZGVzKTtcbiAgfVxuICBoaWRlU2VjdGlvbnMoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmhpZGVTZWN0aW9ucyhjb2Rlcyk7XG4gIH1cbiAgZ2V0U3ViU2VjdGlvbihjb2RlOiBzdHJpbmcsIHN1YkNvZGU6IHN0cmluZyk6IFJlY29yZEZvcm1TdWJTZWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0U3ViU2VjdGlvbihjb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBzaG93U3ViU2VjdGlvbihjb2RlOiBzdHJpbmcsIHN1YkNvZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zaG93U3ViU2VjdGlvbnMoY29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgaGlkZVN1YlNlY3Rpb24oY29kZTogc3RyaW5nLCBzdWJDb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uaGlkZVN1YlNlY3Rpb25zKGNvZGUsIHN1YkNvZGUpO1xuICB9XG4gIHNob3dTdWJTZWN0aW9ucyhjb2RlOiBzdHJpbmcsIHN1YkNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zaG93U3ViU2VjdGlvbnMoY29kZSwgc3ViQ29kZXMpO1xuICB9XG4gIGhpZGVTdWJTZWN0aW9ucyhjb2RlOiBzdHJpbmcsIHN1YkNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5oaWRlU3ViU2VjdGlvbnMoY29kZSwgc3ViQ29kZXMpO1xuICB9XG4gIGdldFNlY3Rpb25BY3Rpb25zKGNvZGU6IHN0cmluZyk6IEZvcm1BY3Rpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldFNlY3Rpb25BY3Rpb25zKGNvZGUpO1xuICB9XG4gIGdldFNlY3Rpb25BY3Rpb25OYW1lcyhjb2RlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldFNlY3Rpb25BY3Rpb25OYW1lcyhjb2RlKTtcbiAgfVxuXG4gIGdldFRhYmxlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0VGFibGVzKCk7XG4gIH1cbiAgc2hvd1RhYmxlcyhjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2hvd1RhYmxlcyhjb2Rlcyk7XG4gIH1cbiAgaGlkZVRhYmxlcyhjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uaGlkZVRhYmxlcyhjb2Rlcyk7XG4gIH1cbiAgY2xlYW5UYWJsZXMoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmNsZWFuVGFibGVzKGNvZGVzKTtcbiAgfVxuICBnZXRUYWJsZShjb2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0VGFibGUoY29kZSk7XG4gIH1cbiAgc2hvd1RhYmxlKGNvZGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zaG93VGFibGVzKGNvZGUpO1xuICB9XG4gIGhpZGVUYWJsZShjb2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uaGlkZVRhYmxlcyhjb2RlKTtcbiAgfVxuICBjbGVhblRhYmxlKGNvZGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRUYWJsZShjb2RlKT8uY2xlYW4oKTtcbiAgfVxuICBnZXRUYWJsZVJlY29yZChjb2RlOiBzdHJpbmcsIHJlY29yZElkOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0VGFibGVSZWNvcmQoY29kZSwgcmVjb3JkSWQpO1xuICB9XG5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZm9ybU1hbmFnZXJTZXJ2aWNlOiBMaWJGb3JtTWFuYWdlclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIF9ldmVudE1hbmFnZXI6IExpYkV2ZW50TWFuYWdlclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGZpbGVNZ210U2VydmljZXM6IExpYkZpbGVNYW5hZ2VtZW50U2VydmljZSkge1xuICAgIHRoaXMuX2V2ZW50RW1pdGVyID0gdGhpcy5fZXZlbnRNYW5hZ2VyO1xuICAgIHRoaXMuY2xlYW5TdGFydCgpO1xuICAgIHRoaXMuY3VzdG9tUHJlUHJvY2Vzc2luZygpO1xuICB9XG5cbiAgc2V0Q29uZmlnKGZvcm1Db25maWcpIHtcbiAgICB0aGlzLmZvcm1Db25maWcgPSBmb3JtQ29uZmlnO1xuICB9XG5cbiAgY2xlYW5TdGFydCgpIHtcbiAgICB0aGlzLl9lcnJvclR5cGUgPSAnJztcbiAgICB0aGlzLmVycm9yQ29kZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgdGhpcy5lcnJvckRldGFpbCA9ICcnO1xuICAgIHRoaXMuX2Zvcm1TdHJ1Y3R1cmUgPSBudWxsO1xuICAgIHRoaXMuZmllbGRzID0gbnVsbDtcbiAgICB0aGlzLmFjdGlvbnMgPSBudWxsO1xuICAgIHRoaXMuc2VjdGlvbnMgPSBudWxsO1xuICAgIHRoaXMuX2NvbnRyb2xUb2tlbiA9IG51bGw7XG4gICAgdGhpcy5pbnB1dERhdGFGaWVsZHMgPSB7fTtcbiAgICB0aGlzLl9kZWZpbml0aW9uT2J0YWluZWQgPSBmYWxzZTtcbiAgICAvLyBTZSBsaW1waWFuIGxvcyBtYW5lamFkb3JlcyBkZSBldmVudG9zXG4gICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5idXN5ID0gZmFsc2U7XG4gICAgdGhpcy5fZm9ybVNlY3Rpb25zQWN0aXZhdGUgPSB7fTtcbiAgICB0aGlzLl9mb3JtU2VjdGlvbnNJbmFjdGl2YXRlID0ge307XG4gICAgdGhpcy5fZm9ybUFjdGlvbnNTdGFydCA9IHt9O1xuICAgIHRoaXMuX2Zvcm1BY3Rpb25zRmluaXNoID0ge307XG4gICAgdGhpcy5fZmllbGRJbnB1dFZhbGlkYXRpb24gPSB7fTtcbiAgICB0aGlzLl9maWVsZFZhbGlkYXRpb25zU3RhcnQgPSB7fTtcbiAgICB0aGlzLl9maWVsZFZhbGlkYXRpb25zRmluaXNoID0ge307XG4gICAgdGhpcy5fdGFibGVTZWxlY3Rpb25zU3RhcnQgPSB7fTtcbiAgICB0aGlzLl90YWJsZVNlbGVjdGlvbnNGaW5pc2ggPSB7fTtcbiAgICB0aGlzLl90YWJsZUFjdGlvbnNTdGFydCA9IHt9O1xuICAgIHRoaXMuX3RhYmxlQWN0aW9uc0ZpbmlzaCA9IHt9O1xuICAgIHRoaXMuX3RhYmxlR2V0RGF0YVN0YXJ0ID0ge307XG4gICAgdGhpcy5fdGFibGVHZXREYXRhRmluaXNoID0ge307XG4gIH1cblxuICBnZXQgZm9ybVZpc2libGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnZpc2libGU7IH1cbiAgZ2V0IGZvcm1NYW5hZ2VyKCkgeyByZXR1cm4gdGhpczsgfVxuICBnZXQgZm9ybUNvZGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMubmFtZTsgfVxuICBzZXQgZm9ybUNvZGUobmFtZTogc3RyaW5nKSB7IHRoaXMubmFtZSA9IG5hbWU7IH1cbiAgZ2V0IGluU2VydmVyUHJvY2VzcygpIHsgcmV0dXJuIHRoaXMuYnVzeTsgfVxuICBnZXQgZm9ybSgpOiBGb3JtU3RydWN0dXJlQW5kRGF0YSB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlOyB9XG5cbiAgZ2V0IHN0YXRlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zdGF0ZTsgfVxuICBnZXQgY3VycmVudFN0YXRlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zdGF0ZTsgfVxuICBzZXQgY3VycmVudFN0YXRlKHN0YXRlOiBzdHJpbmcpIHsgdGhpcy5fZm9ybVN0cnVjdHVyZS5jaGFuZ2VTdGF0ZShzdGF0ZSk7IH1cbiAgZ2V0IGltbXV0YWJsZURhdGEoKTogYW55IHsgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmltbXV0YWJsZURhdGEgfVxuICBnZXQgZXh0cmFJbmZvKCk6IGFueSB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5leHRyYUluZm8gfVxuICBnZXQgdmlzaWJsZVNlY3Rpb25zKCk6IFJlY29yZEZvcm1TZWN0aW9uW10geyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8udmlzaWJsZVNlY3Rpb25zOyB9XG5cbiAgZ2V0IGZvcm1Sb3V0ZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fZm9ybVJvdXRlOyB9XG4gIHNldCBmb3JtUm91dGUocm91dGU6IHN0cmluZykgeyB0aGlzLl9mb3JtUm91dGUgPSByb3V0ZTsgfVxuXG4gIGdldCBzdWJqZWN0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmZvcm1TdWJqZWN0OyB9XG5cbiAgLy8gTcOpdG9kb3MgdmlydHVhbGVzXG4gIGN1c3RvbVByZVByb2Nlc3NpbmcoKSB7IH1cbiAgY3VzdG9tRm9ybVN0YXJ0KCkgeyB9XG4gIGRpc3BsYXlBY3Rpb25TZXJ2ZXJFcnJvcigpIHsgfVxuICBkaXNwbGF5VmFsaWRhdGlvblNlcnZlckVycm9yKCkgeyB9XG4gIGRpc3BsYXlUYWJsZVNlcnZlckVycm9yKCkgeyB9XG4gIHNob3dGaWVsZEluZm8oZmllbGRDb2RlPzogc3RyaW5nLCBkZXRhaWw/OiBhbnkpIHsgfVxuICBzaG93TW9kYWxEaWFsb2codGl0bGUsIGJvZHksIG9wdGlvbnMsIGNhbGxiYWNrPywgcGFyYW1zPykgeyB9XG4gIG9wZW5VcGxvYWREaWFsb2codGl0bGUsIGJvZHksIG9wdGlvbnMsIGNhbGxiYWNrPywgcGFyYW1zPykgeyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBzdXBwb3J0U3RhdGVcbiAgICovXG4gIHN1cHBvcnRNb2RlKHN0YXRlOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuc3VwcG9ydFN0YXRlKHN0YXRlKTsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0RmllbGRcbiAgICovXG4gIGdldEZpZWxkT2JqZWN0KGNvZGU6IHN0cmluZyk6IEZpZWxkRGVzY3JpcHRvciB7IHJldHVybiB0aGlzLmdldEZpZWxkKGNvZGUpOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBnZXRBY3Rpb25cbiAgICovXG4gIGdldEFjdGlvbk9iamVjdChjb2RlOiBzdHJpbmcpOiBGb3JtQWN0aW9uIHsgcmV0dXJuIHRoaXMuZ2V0QWN0aW9uKGNvZGUpOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBnZXRUYWJsZVxuICAgKi9cbiAgZ2V0VGFibGVPYmplY3QoY29kZTogc3RyaW5nKTogUmVjb3JkVGFibGUgeyByZXR1cm4gdGhpcy5nZXRUYWJsZShjb2RlKTsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0U2VjdGlvblxuICAgKi9cbiAgZ2V0U2VjdGlvbk9iamVjdChjb2RlOiBzdHJpbmcpOiBSZWNvcmRGb3JtU2VjdGlvbiB7IHJldHVybiB0aGlzLmdldFNlY3Rpb24oY29kZSk7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGNoYW5nZVN0YXRlXG4gICAqL1xuICBjaGFuZ2VGb3JtTW9kZShzdGF0ZTogc3RyaW5nKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmNoYW5nZVN0YXRlKHN0YXRlKTsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Ugc3ViamVjdFxuICAgKi9cbiAgZ2V0Rm9ybVN1YmplY3QoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuc3ViamVjdDsgfVxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHN1YmplY3RcbiAgICovXG4gIGdldFN1YmplY3QoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZm9ybVN1YmplY3Q7IH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBzdWJqZWN0XG4gICAqL1xuICBnZXRmb3JtU3ViamVjdCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCk7IH1cblxuXG4gIG51bVNlY3Rpb25zKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zZWN0aW9ucy5sZW5ndGg7IH1cblxuICBzdWJzY3JpYmVBcHBFdmVudChldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2spOiB2b2lkIHtcbiAgICB0aGlzLl9ldmVudEVtaXRlci5zdWJzY3JpYmUoZXZlbnROYW1lLCBjYWxsYmFjayk7XG4gIH1cblxuICBvcGVuRm9ybShuYW1lOiBzdHJpbmcsIGRhdGEgPSBudWxsLCBiYWNrRGF0YSA9IG51bGwsIGNsZWFuU3RhY2sgPSBmYWxzZSk6IHZvaWQge1xuICAgIGxldCBvcmlnaW4gPSBudWxsO1xuICAgIGlmICghY2xlYW5TdGFjaykge1xuICAgICAgb3JpZ2luID0geyAuLi5iYWNrRGF0YSwgbmFtZTogdGhpcy5uYW1lLCB1cmw6IHRoaXMuX2Zvcm1Sb3V0ZSwgdG9rZW46IHRoaXMuX2NvbnRyb2xUb2tlbiB9O1xuICAgICAgb3JpZ2luLnN1YmplY3QgPSBvcmlnaW4/LnN1YmplY3QgPz8gdGhpcy5mb3JtU3ViamVjdDtcbiAgICAgIG9yaWdpbi5zdGF0ZSA9IG9yaWdpbj8uc3RhdGUgPz8gdGhpcy5zdGF0ZTtcbiAgICAgIG9yaWdpbi5maWVsZHMgPSBvcmlnaW4/LmZpZWxkcyA/PyB7fTtcbiAgICAgIG9yaWdpbi5leHRyYSA9IG9yaWdpbj8uZXh0cmEgPz8ge307XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IHsgLi4uZGF0YSwgbmFtZSB9O1xuICAgIHRhcmdldC5zdWJqZWN0ID0gdGFyZ2V0Py5zdWJqZWN0ID8/IG51bGw7XG4gICAgdGFyZ2V0LnN0YXRlID0gdGFyZ2V0Py5zdGF0ZSA/PyBudWxsO1xuICAgIHRhcmdldC5maWVsZHMgPSB0YXJnZXQ/LmZpZWxkcyA/PyB7fTtcbiAgICB0YXJnZXQuZXh0cmEgPSB0YXJnZXQ/LmV4dHJhID8/IHt9O1xuICAgIHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlLm9wZW5Gb3JtKG9yaWdpbiwgdGFyZ2V0KTtcbiAgfVxuXG4gIGNhbkdvQmFjaygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX29yaWdpblRva2VuICE9PSBudWxsIH1cbiAgZ29CYWNrKCk6IHZvaWQgeyByZXR1cm4gdGhpcy5mb3JtTWFuYWdlclNlcnZpY2UuYmFja1RvKCk7IH1cbiAgZ29CYWNrRm9ybSgpOiB2b2lkIHsgcmV0dXJuIHRoaXMuZ29CYWNrKCk7IH1cbiAgZ2V0T3JpZ2luRGV0YWlsKCk6IGFueSB7IHJldHVybiB0aGlzLmZvcm1NYW5hZ2VyU2VydmljZS5nZXRGb3JtSW5mbyh0aGlzLl9vcmlnaW5Ub2tlbik7IH1cblxuICBzZXRFcnJvcihlcnJvclR5cGU6IHN0cmluZywgZXJyb3JNZXNzYWdlOiBzdHJpbmcsIGVycm9yRGV0YWlsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9lcnJvclR5cGUgPSBlcnJvclR5cGUgfHwgJyc7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UgfHwgJyc7XG4gICAgdGhpcy5lcnJvckRldGFpbCA9IGVycm9yRGV0YWlsIHx8ICcnO1xuICB9XG5cbiAgcmVzZXRFcnJvcigpOiB2b2lkIHsgdGhpcy5zZXRFcnJvcihudWxsLCBudWxsLCBudWxsKTsgfVxuICBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2Vycm9yVHlwZTsgfVxuICBnZXRFcnJvck1lc3NhZ2UoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZXJyb3JNZXNzYWdlOyB9XG4gIGdldEVycm9yRGV0YWlsKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmVycm9yRGV0YWlsOyB9XG4gIGdldEVycm9yQ29kZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fZXJyb3JUeXBlOyB9XG5cbiAgZ2V0Rm9ybVBhcmFtZXRlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAobmFtZSkgPyAodGhpcy5leHRyYURhdGE/LltuYW1lXSA/PyBudWxsKSA6IG51bGw7XG4gIH1cblxuICBwcmVvY2Vzc0lucHV0UGFyYW1zKHBhcmFtczogYW55KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdGhpcy5fY29udHJvbFRva2VuID0gcGFyYW1zPy5bVE9LRU5dID8/IG51bGw7XG4gICAgdGhpcy5mb3JtU3ViamVjdCA9IHBhcmFtcz8uW1NVQkpFQ1RdID8/IG51bGw7XG4gICAgY29uc3QgdG9rZW5JbmZvOiBhbnkgPSAodGhpcy5fY29udHJvbFRva2VuKSA/IHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlLmdldEZvcm1JbmZvKHRoaXMuX2NvbnRyb2xUb2tlbikgOiB7fTtcbiAgICBjb25zdCB7IHRva2VuLCBzdWJqZWN0LCBzdGF0ZSwgZmllbGRzLCBleHRyYSwgb3JpZ2luVG9rZW4gfSA9IHRva2VuSW5mbztcbiAgICBpZiAodG9rZW4gJiYgdGhpcy5fY29udHJvbFRva2VuID09PSB0b2tlbikge1xuICAgICAgdGhpcy5mb3JtU3ViamVjdCA9IHRoaXMuZm9ybVN1YmplY3QgPz8gc3ViamVjdCA/PyBudWxsO1xuICAgICAgdGhpcy5pbnB1dERhdGFGaWVsZHMgPSBmaWVsZHM7XG4gICAgICB0aGlzLmV4dHJhRGF0YSA9IGV4dHJhO1xuICAgICAgdGhpcy5fb3JpZ2luVG9rZW4gPSBvcmlnaW5Ub2tlbjtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdWJzY3JpYmVTZWN0aW9uQWN0aXZhdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtU2VjdGlvbnMgPSB0aGlzLl9mb3JtU3RydWN0dXJlLnNlY3Rpb25zO1xuICAgIGNvbnN0IHNlY3Rpb25OYW1lcyA9IE9iamVjdC5rZXlzKGZvcm1TZWN0aW9ucyk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNlY3Rpb25OYW1lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHNlY3Rpb25OYW1lID0gc2VjdGlvbk5hbWVzW2luZGV4XTtcbiAgICAgIGNvbnN0IHNlY3Rpb24gPSBmb3JtU2VjdGlvbnNbc2VjdGlvbk5hbWVdO1xuICAgICAgc2VjdGlvbi5hY3RpdmF0aW9uLnN1YnNjcmliZSgoY29kZTogc3RyaW5nKSA9PiB0aGlzLmxhdW5jaFNlY3Rpb25BY3RpdmF0aW9uKGNvZGUpKTtcbiAgICAgIHNlY3Rpb24uaW5hY3RpdmF0aW9uLnN1YnNjcmliZSgoY29kZTogc3RyaW5nKSA9PiB0aGlzLmxhdW5jaFNlY3Rpb25JbmFjdGl2YXRpb24oY29kZSkpO1xuICAgIH1cbiAgfVxuXG4gIHN1YnNjcmliZUZpZWxkc1N1YmplY3RzKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1GaWVsZHMgPSB0aGlzLl9mb3JtU3RydWN0dXJlLmdldEZpZWxkcygpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZvcm1GaWVsZHMpKSB7XG4gICAgICBmb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICBmaWVsZC5lZGl0aW9uRmluaXNoLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgY29uc3QgeyBjb2RlLCBpbnRyaW5zaWNWYWxpZGF0aW9uIH0gPSBldmVudDtcbiAgICAgICAgICB0aGlzLnN0YXJ0RmllbGRWYWxpZGF0aW9uKGNvZGUsIGludHJpbnNpY1ZhbGlkYXRpb24pO1xuICAgICAgICB9KTtcbiAgICAgICAgZmllbGQuZWRpdGlvblBhcnRpYWwuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCB7IGNvZGUsIGludHJpbnNpY1ZhbGlkYXRpb24gfSA9IGV2ZW50O1xuICAgICAgICAgIHRoaXMuc3RhcnRGaWVsZElucHV0VmFsaWRhdGlvbihjb2RlLCBpbnRyaW5zaWNWYWxpZGF0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZpZWxkLmRldGFpbFJlcXVlc3Quc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMuc2hvd0ZpZWxkSW5mbyhldmVudC5jb2RlLCBldmVudC5kZXRhaWwpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHN1YnNjcmliZUFjdGlvblN1YmplY3RzKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1BY3Rpb25zID0gdGhpcy5fZm9ybVN0cnVjdHVyZS5nZXRBY3Rpb25zKCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybUFjdGlvbnMpKSB7XG4gICAgICBmb3JtQWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgIGFjdGlvbi5hY3Rpb25BY3RpdmF0ZWQuc3Vic2NyaWJlKGNvZGUgPT4gdGhpcy5zdGFydEFjdGlvbihjb2RlKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzdWJzY3JpYmVUYWJsZVN1YmplY3RzKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1UYWJsZXMgPSB0aGlzLl9mb3JtU3RydWN0dXJlLmdldFRhYmxlcygpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZvcm1UYWJsZXMpKSB7XG4gICAgICBmb3JtVGFibGVzLmZvckVhY2godGFibGUgPT4ge1xuICAgICAgICB0YWJsZS5pbmxpbmVBY3Rpb25UcmlnZ2VyLnN1YnNjcmliZShldmVudCA9PiB0aGlzLnN0YXJ0VGFibGVBY3Rpb24oZXZlbnQpKTtcbiAgICAgICAgdGFibGUuZ2xvYmFsQWN0aW9uVHJpZ2dlci5zdWJzY3JpYmUoZXZlbnQgPT4gdGhpcy5zdGFydFRhYmxlR2xvYmFsQWN0aW9uKGV2ZW50KSk7XG4gICAgICAgIHRhYmxlLnJlY29yZFNlbGVjdGlvblRyaWdnZXIuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMuc3RhcnRUYWJsZVJlY29yZFNlbGVjdGlvbihldmVudCkpO1xuICAgICAgICB0YWJsZS5zZWxlY3Rpb25BY3Rpb25UcmlnZ2VyLnN1YnNjcmliZShldmVudCA9PiB0aGlzLnN0YXJ0VGFibGVTZWxlY3Rpb25BY3Rpb24oZXZlbnQpKTtcbiAgICAgICAgdGFibGUuZ2V0RGF0YVRyaWdnZXIuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMuc3RhcnRUYWJsZUdldERhdGEoZXZlbnQpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZvcm1Jbml0KHBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpbml0aWFsU3RhdGU6IHN0cmluZyA9IHRoaXMucHJlb2Nlc3NJbnB1dFBhcmFtcyhwYXJhbXMpO1xuICAgIGlmICghdGhpcy5uYW1lKSB7IHJldHVybjsgfVxuICAgIGlmICghdGhpcy5fZGVmaW5pdGlvbk9idGFpbmVkKSB7XG4gICAgICB0aGlzLmJ1c3kgPSB0cnVlO1xuICAgICAgY29uc3QgZm9ybURlZmluaXRpb24gPSBhd2FpdCB0aGlzLmZvcm1NYW5hZ2VyU2VydmljZS5nZXRGb3JtRGVmaW5pdGlvbih0aGlzLm5hbWUpO1xuICAgICAgdGhpcy5idXN5ID0gZmFsc2U7XG4gICAgICB0aGlzLl9mb3JtU3RydWN0dXJlID0gbmV3IEZvcm1TdHJ1Y3R1cmVBbmREYXRhKGZvcm1EZWZpbml0aW9uLCB0aGlzLmZvcm1Db25maWcpO1xuICAgICAgdGhpcy5maWVsZHMgPSB0aGlzLl9mb3JtU3RydWN0dXJlLmZpZWxkcztcbiAgICAgIHRoaXMuYWN0aW9ucyA9IHRoaXMuX2Zvcm1TdHJ1Y3R1cmUuYWN0aW9ucztcbiAgICAgIHRoaXMuc2VjdGlvbnMgPSB0aGlzLl9mb3JtU3RydWN0dXJlLnNlY3Rpb25zO1xuICAgICAgdGhpcy5fZGVmaW5pdGlvbk9idGFpbmVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGVhbkRhdGEoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnN1cHBvcnRTdGF0ZShpbml0aWFsU3RhdGUpKSB7XG4gICAgICBpbml0aWFsU3RhdGUgPSB0aGlzLl9mb3JtU3RydWN0dXJlLmRlZmF1bHRTdGF0ZTtcbiAgICB9XG4gICAgdGhpcy5fZm9ybVN0cnVjdHVyZS5jaGFuZ2VTdGF0ZShpbml0aWFsU3RhdGUgfHwgdGhpcy5fZm9ybVN0cnVjdHVyZS5kZWZhdWx0U3RhdGUpO1xuICAgIGNvbnN0IGlucHV0RmllbGROYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuaW5wdXREYXRhRmllbGRzKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgaW5wdXRGaWVsZE5hbWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgZmllbGRDb2RlID0gaW5wdXRGaWVsZE5hbWVzW2luZGV4XTtcbiAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSB0aGlzLmlucHV0RGF0YUZpZWxkc1tmaWVsZENvZGVdO1xuICAgICAgdGhpcy5zZXRGaWVsZFZhbHVlKGZpZWxkQ29kZSwgZmllbGRWYWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHJlY29yZFJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0Rm9ybUFjdGlvbihmb3JtQWN0aW9ucy5nZXREYXRhKTtcbiAgICB0aGlzLmNoZWNrRXJyb3JSZWNvcmRSZWNlaXZlZChyZWNvcmRSZXNwb25zZSk7XG4gICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmVuYWJsZWRTZWN0aW9ucyA9IHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnZpc2libGVTZWN0aW9ucztcbiAgICB0aGlzLnN1YnNjcmliZVNlY3Rpb25BY3RpdmF0aW9uKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVGaWVsZHNTdWJqZWN0cygpO1xuICAgIHRoaXMuc3Vic2NyaWJlQWN0aW9uU3ViamVjdHMoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRhYmxlU3ViamVjdHMoKTtcbiAgICB0aGlzLmN1c3RvbUZvcm1TdGFydCgpO1xuICB9XG5cbiAgY2hlY2tFcnJvclJlY29yZFJlY2VpdmVkKHJlY29yZFJlc3BvbnNlOiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGVycm9yIH0gPSByZWNvcmRSZXNwb25zZTtcbiAgICBpZiAoIWVycm9yKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHRoaXMuZXJyb3JDb2RlID0gcmVjb3JkUmVzcG9uc2UuZXJyb3JDb2RlO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gcmVjb3JkUmVzcG9uc2UuZXJyb3JNZXNzYWdlO1xuICAgIHRoaXMuZXJyb3JEZXRhaWwgPSByZWNvcmRSZXNwb25zZS5lcnJvckRldGFpbDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGVycm9yT2NjdXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuZXJyb3JDb2RlICE9PSBOT19FUlJPUik7XG4gIH1cblxuICAvKipcbiAgICogU29wb3J0ZSBtYW5lam8gZGUgZXZlbnRvcyBkZSBmb3JtdWxhcmlvXG4gICAqL1xuXG4gIGFzeW5jIHJlcXVlc3RGb3JtQWN0aW9uKGFjdGlvbkNvZGU6IHN0cmluZywgYWN0aW9uU3ViamVjdDogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGFjdGlvbkRldGFpbCA9IHtcbiAgICAgIGZvcm1Db2RlOiB0aGlzLm5hbWUsXG4gICAgICBmb3JtU3ViamVjdDogdGhpcy5mb3JtU3ViamVjdCxcbiAgICAgIGN1cnJlbnRNb2RlOiB0aGlzLl9mb3JtU3RydWN0dXJlLnN0YXRlLFxuICAgICAgYWN0aW9uQ29kZSxcbiAgICAgIGFjdGlvblN1YmplY3QsXG4gICAgICB2ZXJzaW9uOiBQQVlMT0FEX1ZFUlNJT04sXG4gICAgICBmb3JtRGF0YTogdGhpcy5fZm9ybVN0cnVjdHVyZS5nZXRQYXlsb2FkKCksXG4gICAgICBpbW11dGFibGVEYXRhOiB0aGlzLl9mb3JtU3RydWN0dXJlLmltbXV0YWJsZURhdGEsXG4gICAgfTtcbiAgICB0aGlzLmVycm9yQ29kZSA9IE5PX0VSUk9SO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgdGhpcy5lcnJvckRldGFpbCA9ICcnO1xuICAgIHRoaXMuYnVzeSA9IHRydWU7XG4gICAgY29uc3QgZm9ybUFjdGlvblJlc3BvbnNlOiBhbnkgPSBhd2FpdCB0aGlzLmZvcm1NYW5hZ2VyU2VydmljZS5leGVjU2VydmVyQWN0aW9uKGFjdGlvbkRldGFpbCk7XG4gICAgdGhpcy5idXN5ID0gZmFsc2U7XG4gICAgaWYgKGZvcm1BY3Rpb25SZXNwb25zZSAmJiBmb3JtQWN0aW9uUmVzcG9uc2UuZXJyb3IuZXJyb3JUeXBlKSB7XG4gICAgICBjb25zb2xlLmxvZygnRXhjZXBjacOzbiBubyBzb3BvcnRhZGEnKTtcbiAgICB9XG4gICAgaWYgKGZvcm1BY3Rpb25SZXNwb25zZS5oYXNFcnJvcigpKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGZvcm1BY3Rpb25SZXNwb25zZS5lcnJvcjtcbiAgICAgIHRoaXMuZXJyb3JDb2RlID0gZXJyb3IuZXJyb3JDb2RlO1xuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvci5lcnJvck1lc3NhZ2U7XG4gICAgICB0aGlzLmVycm9yRGV0YWlsID0gZXJyb3IuZXJyb3JEZXRhaWw7XG4gICAgfVxuICAgIGNvbnN0IGZvcm1SZXNwb25zZURhdGEgPSBmb3JtQWN0aW9uUmVzcG9uc2UuZ2V0RGF0YSgpO1xuICAgIHRoaXMudXBkYXRlRm9ybVdpdGhTZXJ2ZXJEYXRhKGZvcm1SZXNwb25zZURhdGEpO1xuICAgIHJldHVybiBmb3JtUmVzcG9uc2VEYXRhO1xuICB9XG5cbiAgdXBkYXRlRm9ybVdpdGhTZXJ2ZXJEYXRhKGZvcm1Db250ZW50OiBhbnkpIHtcbiAgICBjb25zdCB7XG4gICAgICBjdXJyZW50TW9kZSwgZm9ybVN1YmplY3QsIGFjdGlvbnMsIGZpZWxkcywgcmVjb3JkVGFibGVzLFxuICAgICAgcmV0dXJuZWRGaWxlLCBpbW11dGFibGVEYXRhLCBleHRyYUluZm8sXG4gICAgfSA9IGZvcm1Db250ZW50O1xuICAgIGN1cnJlbnRNb2RlICYmIHRoaXMuY2hhbmdlU3RhdGUoY3VycmVudE1vZGUpO1xuICAgIGlmIChmb3JtU3ViamVjdCkgeyB0aGlzLmZvcm1TdWJqZWN0ID0gZm9ybVN1YmplY3Q7IH1cbiAgICBpZiAoYWN0aW9ucyAmJiBhY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgY2hhbmdlZEFjdGlvbiBvZiBhY3Rpb25zKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbk9iamVjdCA9IHRoaXMuZ2V0QWN0aW9uKGNoYW5nZWRBY3Rpb24uYWN0aW9uQ29kZSk7XG4gICAgICAgIGlmIChhY3Rpb25PYmplY3QpIHsgYWN0aW9uT2JqZWN0LnVwZGF0ZUZyb21TZXJ2ZXIoY2hhbmdlZEFjdGlvbik7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBjaGFuZ2VkRmllbGQgb2YgZmllbGRzKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkT2JqZWN0ID0gdGhpcy5nZXRGaWVsZChjaGFuZ2VkRmllbGQuZmllbGRDb2RlKTtcbiAgICAgICAgaWYgKGZpZWxkT2JqZWN0KSB7XG4gICAgICAgICAgZmllbGRPYmplY3QudXBkYXRlRnJvbVNlcnZlcihjaGFuZ2VkRmllbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZWNvcmRUYWJsZXMgJiYgcmVjb3JkVGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgY2hhbmdlZFRhYmxlIG9mIHJlY29yZFRhYmxlcykge1xuICAgICAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUoY2hhbmdlZFRhYmxlLnRhYmxlQ29kZSk7XG4gICAgICAgIGlmICh0YWJsZU9iamVjdCkge1xuICAgICAgICAgIHRhYmxlT2JqZWN0LnVwZGF0ZUZyb21TZXJ2ZXIoY2hhbmdlZFRhYmxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmV0dXJuZWRGaWxlICYmIHJldHVybmVkRmlsZS5maWxlKSB7XG4gICAgICB0aGlzLmZpbGVNZ210U2VydmljZXMuc2F2ZUZpbGUocmV0dXJuZWRGaWxlLmZpbGUsIHJldHVybmVkRmlsZS5uYW1lLCByZXR1cm5lZEZpbGUudHlwZSk7XG4gICAgfVxuICAgIHRoaXMuX2Zvcm1TdHJ1Y3R1cmUuaW1tdXRhYmxlRGF0YSA9IGltbXV0YWJsZURhdGE7XG4gICAgdGhpcy5fZm9ybVN0cnVjdHVyZS5leHRyYUluZm8gPSBleHRyYUluZm87XG4gIH1cblxuICAvKipcbiAgICogTWFuZWpvIGRlIGV2ZW50IGhhbmRsZXJzIHBhcmEgYWNjaW9uZXMgc29icmUgZWwgZm9ybXVsYXJpb1xuICAgKi9cblxuICBhZGRTZWN0aW9uQWN0aXZhdGlvbihjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICBjb25zdCBzZWN0aW9uU2V0ID0gKEFycmF5LmlzQXJyYXkoY29kZXMpKSA/IGNvZGVzIDogKGNvZGVzID8gW2NvZGVzXSA6IFtdKTtcbiAgICBzZWN0aW9uU2V0LmZvckVhY2goKHNlY3Rpb25OYW1lKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2Zvcm1TZWN0aW9uc0FjdGl2YXRlW3NlY3Rpb25OYW1lXSkge1xuICAgICAgICB0aGlzLl9mb3JtU2VjdGlvbnNBY3RpdmF0ZVtzZWN0aW9uTmFtZV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2Zvcm1TZWN0aW9uc0FjdGl2YXRlW3NlY3Rpb25OYW1lXS5wdXNoKHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRTZWN0aW9uSW5hY3RpdmF0aW9uKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzID0gbnVsbCkge1xuICAgIGNvbnN0IHNlY3Rpb25TZXQgPSAoQXJyYXkuaXNBcnJheShjb2RlcykpID8gY29kZXMgOiAoY29kZXMgPyBbY29kZXNdIDogW10pO1xuICAgIHNlY3Rpb25TZXQuZm9yRWFjaCgoc2VjdGlvbk5hbWUpID0+IHtcbiAgICAgIGlmICghdGhpcy5fZm9ybVNlY3Rpb25zSW5hY3RpdmF0ZVtzZWN0aW9uTmFtZV0pIHtcbiAgICAgICAgdGhpcy5fZm9ybVNlY3Rpb25zSW5hY3RpdmF0ZVtzZWN0aW9uTmFtZV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2Zvcm1TZWN0aW9uc0luYWN0aXZhdGVbc2VjdGlvbk5hbWVdLnB1c2goeyBjYWxsYmFjaywgcHJvcGVydGllcyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEFjdGlvbk1ldGhvZFN0YXJ0KGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzID0gbnVsbCkge1xuICAgIGNvbnN0IGFjdGlvblNldCA9IChBcnJheS5pc0FycmF5KGNvZGVzKSkgPyBjb2RlcyA6IChjb2RlcyA/IFtjb2Rlc10gOiBbXSk7XG4gICAgYWN0aW9uU2V0LmZvckVhY2goKGFjdGlvbk5hbWUpID0+IHtcbiAgICAgIGlmICghdGhpcy5fZm9ybUFjdGlvbnNTdGFydFthY3Rpb25OYW1lXSkge1xuICAgICAgICB0aGlzLl9mb3JtQWN0aW9uc1N0YXJ0W2FjdGlvbk5hbWVdID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLl9mb3JtQWN0aW9uc1N0YXJ0W2FjdGlvbk5hbWVdLnB1c2goeyBjYWxsYmFjaywgcHJvcGVydGllcyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEFjdGlvbk1ldGhvZEZpbmlzaChjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICBjb25zdCBhY3Rpb25TZXQgPSAoQXJyYXkuaXNBcnJheShjb2RlcykpID8gY29kZXMgOiAoY29kZXMgPyBbY29kZXNdIDogW10pO1xuICAgIGFjdGlvblNldC5mb3JFYWNoKChhY3Rpb25OYW1lKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2Zvcm1BY3Rpb25zRmluaXNoW2FjdGlvbk5hbWVdKSB7XG4gICAgICAgIHRoaXMuX2Zvcm1BY3Rpb25zRmluaXNoW2FjdGlvbk5hbWVdID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLl9mb3JtQWN0aW9uc0ZpbmlzaFthY3Rpb25OYW1lXS5wdXNoKHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBsYXVuY2hTZWN0aW9uQWN0aXZhdGlvbihjb2RlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzZWN0aW9uT2JqZWN0ID0gdGhpcy5fZm9ybVN0cnVjdHVyZS5nZXRTZWN0aW9uKGNvZGUpO1xuICAgIGlmICghc2VjdGlvbk9iamVjdCkgeyByZXR1cm47IH1cbiAgICBjb25zdCBjbGllbnRTZWN0aW9uTWV0aG9kcyA9IHRoaXMuX2Zvcm1TZWN0aW9uc0FjdGl2YXRlW2NvZGVdO1xuICAgIGlmIChjbGllbnRTZWN0aW9uTWV0aG9kcykge1xuICAgICAgZm9yIChjb25zdCBjbGllbnRTZWN0aW9uTWV0aG9kIG9mIGNsaWVudFNlY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IGNsaWVudFNlY3Rpb25NZXRob2Q7XG4gICAgICAgIGNhbGxiYWNrKHNlY3Rpb25PYmplY3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGxhdW5jaFNlY3Rpb25JbmFjdGl2YXRpb24oY29kZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2VjdGlvbk9iamVjdCA9IHRoaXMuX2Zvcm1TdHJ1Y3R1cmUuZ2V0U2VjdGlvbihjb2RlKTtcbiAgICBpZiAoIXNlY3Rpb25PYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgY2xpZW50U2VjdGlvbk1ldGhvZHMgPSB0aGlzLl9mb3JtU2VjdGlvbnNJbmFjdGl2YXRlW2NvZGVdO1xuICAgIGlmIChjbGllbnRTZWN0aW9uTWV0aG9kcykge1xuICAgICAgZm9yIChjb25zdCBjbGllbnRTZWN0aW9uTWV0aG9kIG9mIGNsaWVudFNlY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IGNsaWVudFNlY3Rpb25NZXRob2Q7XG4gICAgICAgIGNhbGxiYWNrKHNlY3Rpb25PYmplY3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0QWN0aW9uKGNvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGlvbk9iamVjdCA9IHRoaXMuZ2V0QWN0aW9uKGNvZGUpO1xuICAgIGlmICghYWN0aW9uT2JqZWN0KSB7IHJldHVybjsgfVxuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGFjdGlvbk9iamVjdC5zdGFydCgpO1xuICAgIGNvbnN0IGNsaWVudEFjdGlvbk1ldGhvZHMgPSB0aGlzLl9mb3JtQWN0aW9uc1N0YXJ0W2NvZGVdO1xuICAgIGlmIChjbGllbnRBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgY2xpZW50QWN0aW9uTWV0aG9kIG9mIGNsaWVudEFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gY2xpZW50QWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjb250aW51ZUFjdGlvblByb21pc2UgPSBjYWxsYmFjayhhY3Rpb25PYmplY3QpO1xuICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNvbnRpbnVlQWN0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVBY3Rpb24gPSBjbGllbnRBY3Rpb25SZXN1bHRzLnJlZHVjZSgodG90YWwsIGN1cnIpID0+ICh0b3RhbCAmJiAoY3VyciAhPT0gZmFsc2UpKSwgdHJ1ZSk7XG4gICAgICBpZiAoIWNvbnRpbnVlQWN0aW9uKSB7XG4gICAgICAgIGFjdGlvbk9iamVjdC5zdG9wKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGFydFNlcnZlckFjdGlvbihhY3Rpb25PYmplY3QpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRTZXJ2ZXJBY3Rpb24oYWN0aW9uSW5wdXQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSAodHlwZW9mIGFjdGlvbklucHV0ID09PSAnc3RyaW5nJylcbiAgICAgID8gdGhpcy5nZXRBY3Rpb24oYWN0aW9uSW5wdXQpIDogYWN0aW9uSW5wdXQ7XG4gICAgbGV0IHNlcnZlckVycm9yID0gZmFsc2U7XG4gICAgbGV0IGFjdGlvblJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGFjdGlvbi5iYWNrZW5kKSB7XG4gICAgICBhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3RGb3JtQWN0aW9uKGFjdGlvbi5hY3Rpb25Db2RlKTtcbiAgICAgIHNlcnZlckVycm9yID0gISF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmZpbmlzaEFjdGlvbihhY3Rpb24sIGFjdGlvblJlc3VsdCwgc2VydmVyRXJyb3IpO1xuICAgIGlmICghc2VydmVyRXJyb3IpIHtcbiAgICAgIGFjdGlvbi5uZXdTdGF0ZSAmJiB0aGlzLmNoYW5nZVN0YXRlKGFjdGlvbi5uZXdTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcGxheUFjdGlvblNlcnZlckVycm9yKCk7XG4gICAgfVxuICAgIGFjdGlvbi5zdG9wKCk7XG4gIH1cblxuICBhc3luYyBmaW5pc2hBY3Rpb24oYWN0aW9uLCBhY3Rpb25SZXN1bHQsIHNlcnZlckVycm9yID0gZmFsc2UpIHtcbiAgICBjb25zdCBmaW5pc2hBY3Rpb25NZXRob2RzID0gdGhpcy5fZm9ybUFjdGlvbnNGaW5pc2hbYWN0aW9uLmFjdGlvbkNvZGVdO1xuICAgIGlmIChmaW5pc2hBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgY2xpZW50QWN0aW9uTWV0aG9kIG9mIGZpbmlzaEFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gY2xpZW50QWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjb250aW51ZU9uRXJyb3IgPSBwcm9wZXJ0aWVzPy5jb250aW51ZU9uRXJyb3IgPz8gZmFsc2U7XG4gICAgICAgIGlmICghc2VydmVyRXJyb3IgfHwgY29udGludWVPbkVycm9yKSB7XG4gICAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjYWxsYmFjayhhY3Rpb24sIGFjdGlvblJlc3VsdCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgY29tcGxldGVHbG9iYWxBY3Rpb24oYWN0aW9uOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydFNlcnZlckFjdGlvbihhY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmVqYWRvcmVzIGRlIGV2ZW50b3MgcGFyYSB2YWxpZGFjaW9uZXMgc29icmUgY2FtcG9zXG4gICAqL1xuXG4gIGFkZEZpZWxkSW5wdXRWYWxpZGF0aW9uKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzID0gbnVsbCkge1xuICAgIGNvbnN0IGZpZWxkU2V0ID0gKEFycmF5LmlzQXJyYXkoY29kZXMpKSA/IGNvZGVzIDogKGNvZGVzID8gW2NvZGVzXSA6IFtdKTtcbiAgICBmaWVsZFNldC5mb3JFYWNoKChmaWVsZENvZGUpID0+IHtcbiAgICAgIGlmICghdGhpcy5fZmllbGRJbnB1dFZhbGlkYXRpb25bZmllbGRDb2RlXSkge1xuICAgICAgICB0aGlzLl9maWVsZElucHV0VmFsaWRhdGlvbltmaWVsZENvZGVdID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLl9maWVsZElucHV0VmFsaWRhdGlvbltmaWVsZENvZGVdLnB1c2goeyBjYWxsYmFjaywgcHJvcGVydGllcyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEZpZWxkVmFsaWRhdGlvblN0YXJ0KGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzID0gbnVsbCkge1xuICAgIGNvbnN0IGZpZWxkU2V0ID0gKEFycmF5LmlzQXJyYXkoY29kZXMpKSA/IGNvZGVzIDogKGNvZGVzID8gW2NvZGVzXSA6IFtdKTtcbiAgICBmaWVsZFNldC5mb3JFYWNoKChmaWVsZENvZGUpID0+IHtcbiAgICAgIGlmICghdGhpcy5fZmllbGRWYWxpZGF0aW9uc1N0YXJ0W2ZpZWxkQ29kZV0pIHtcbiAgICAgICAgdGhpcy5fZmllbGRWYWxpZGF0aW9uc1N0YXJ0W2ZpZWxkQ29kZV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ZpZWxkVmFsaWRhdGlvbnNTdGFydFtmaWVsZENvZGVdLnB1c2goeyBjYWxsYmFjaywgcHJvcGVydGllcyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEZpZWxkVmFsaWRhdGlvbkZpbmlzaChjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICBjb25zdCBmaWVsZFNldCA9IChBcnJheS5pc0FycmF5KGNvZGVzKSkgPyBjb2RlcyA6IChjb2RlcyA/IFtjb2Rlc10gOiBbXSk7XG4gICAgZmllbGRTZXQuZm9yRWFjaCgoZmllbGRDb2RlKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2ZpZWxkVmFsaWRhdGlvbnNGaW5pc2hbZmllbGRDb2RlXSkge1xuICAgICAgICB0aGlzLl9maWVsZFZhbGlkYXRpb25zRmluaXNoW2ZpZWxkQ29kZV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ZpZWxkVmFsaWRhdGlvbnNGaW5pc2hbZmllbGRDb2RlXS5wdXNoKHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzdGFydEZpZWxkSW5wdXRWYWxpZGF0aW9uKGZpZWxkQ29kZTogc3RyaW5nLCBpbnRyaW5zaWNWYWxpZGF0aW9uOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGNvbnN0IGZpZWxkVG9WYWxpZGF0ZSA9IHRoaXMuZ2V0RmllbGQoZmllbGRDb2RlKTtcbiAgICBpZiAoIWZpZWxkVG9WYWxpZGF0ZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBmaWVsZFRvVmFsaWRhdGUucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IHZhbGlkYXRpb25DYWxsYmFja3MgPSB0aGlzLl9maWVsZElucHV0VmFsaWRhdGlvbltmaWVsZENvZGVdO1xuICAgIGlmICh2YWxpZGF0aW9uQ2FsbGJhY2tzKSB7XG4gICAgICBjb25zdCBjbGllbnRWYWxpZGF0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHZhbGlkYXRpb25NZXRob2Qgb2YgdmFsaWRhdGlvbkNhbGxiYWNrcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB2YWxpZGF0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjb250aW51ZVZhbGlkYXRpb25Qcm9taXNlID0gY2FsbGJhY2soZmllbGRUb1ZhbGlkYXRlKTtcbiAgICAgICAgY2xpZW50VmFsaWRhdGlvblByb21pc2VzLnB1c2goY29udGludWVWYWxpZGF0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRWYWxpZGF0aW9uUHJvbWlzZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0RmllbGRWYWxpZGF0aW9uKGZpZWxkQ29kZTogc3RyaW5nLCBpbnRyaW5zaWNWYWxpZGF0aW9uOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGNvbnN0IGZpZWxkVG9WYWxpZGF0ZSA9IHRoaXMuZ2V0RmllbGQoZmllbGRDb2RlKTtcbiAgICBpZiAoIWZpZWxkVG9WYWxpZGF0ZSkgeyByZXR1cm47IH1cbiAgICBmaWVsZFRvVmFsaWRhdGUucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IHZhbGlkYXRpb25DYWxsYmFja3MgPSB0aGlzLl9maWVsZFZhbGlkYXRpb25zU3RhcnRbZmllbGRDb2RlXTtcbiAgICBpZiAodmFsaWRhdGlvbkNhbGxiYWNrcykge1xuICAgICAgY29uc3QgY2xpZW50VmFsaWRhdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB2YWxpZGF0aW9uTWV0aG9kIG9mIHZhbGlkYXRpb25DYWxsYmFja3MpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdmFsaWRhdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY2xpZW50VmFsaWRhdGlvblByb21pc2UgPSBjYWxsYmFjayhmaWVsZFRvVmFsaWRhdGUpO1xuICAgICAgICBjbGllbnRWYWxpZGF0aW9uUHJvbWlzZXMucHVzaChjbGllbnRWYWxpZGF0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRWYWxpZGF0aW9uUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNsaWVudFZhbGlkYXRpb25Qcm9taXNlcyk7XG4gICAgICBjb25zdCBjb250aW51ZVZhbGlkYXRpb24gPSBjbGllbnRWYWxpZGF0aW9uUmVzdWx0cy5yZWR1Y2UoKHRvdGFsLCBjdXJyKSA9PiAodG90YWwgJiYgKGN1cnIgIT09IGZhbHNlKSksIHRydWUpO1xuICAgICAgaWYgKCFjb250aW51ZVZhbGlkYXRpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW50cmluc2ljVmFsaWRhdGlvbikge1xuICAgICAgdGhpcy5zdGFydFNlcnZlckZpZWxkVmFsaWRhdGlvbihmaWVsZFRvVmFsaWRhdGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0U2VydmVyRmllbGRWYWxpZGF0aW9uKGlucHV0RmllbGQ6IHN0cmluZyB8IEZpZWxkRGVzY3JpcHRvcikge1xuICAgIGNvbnN0IGZpZWxkT2JqID0gKHR5cGVvZiBpbnB1dEZpZWxkID09PSAnc3RyaW5nJylcbiAgICAgID8gdGhpcy5nZXRGaWVsZChpbnB1dEZpZWxkKSA6IGlucHV0RmllbGQ7XG4gICAgbGV0IHNlcnZlckVycm9yID0gZmFsc2U7XG4gICAgbGV0IHZhbGlkYXRpb25SZXN1bHQ6IGJvb2xlYW4gPSB0cnVlO1xuICAgIGlmIChmaWVsZE9iai5iYWNrZW5kKSB7XG4gICAgICBmaWVsZE9iai52YWxpZGF0aW5nID0gdHJ1ZTtcbiAgICAgIHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzXG4gICAgICAgIC5yZXF1ZXN0Rm9ybUFjdGlvbihmb3JtQWN0aW9ucy52YWxpZGF0ZSwgZmllbGRPYmouZmllbGRDb2RlKTtcbiAgICAgIHNlcnZlckVycm9yID0gISF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmZpbmlzaEZpZWxkVmFsaWRhdGlvbihmaWVsZE9iaiwgdmFsaWRhdGlvblJlc3VsdCwgc2VydmVyRXJyb3IpO1xuICAgIGlmIChzZXJ2ZXJFcnJvcikge1xuICAgICAgZmllbGRPYmouc2V0RXJyb3JDb2RlKHRoaXMuZXJyb3JDb2RlKTtcbiAgICAgIGZpZWxkT2JqLnNldEVycm9yTWVzc2FnZSh0aGlzLmVycm9yTWVzc2FnZSk7XG4gICAgICB0aGlzLmRpc3BsYXlWYWxpZGF0aW9uU2VydmVyRXJyb3IoKTtcbiAgICB9XG4gICAgZmllbGRPYmoudmFsaWRhdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoRmllbGRWYWxpZGF0aW9uKGZpZWxkT2JqZWN0OiBhbnksIHZhbGlkYXRpb25SZXN1bHQ6IGJvb2xlYW4sIHNlcnZlckVycm9yID0gZmFsc2UpIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uQ2FsbGJhY2tzID0gdGhpcy5fZmllbGRWYWxpZGF0aW9uc0ZpbmlzaFtmaWVsZE9iamVjdC5maWVsZENvZGVdO1xuICAgIGlmICh2YWxpZGF0aW9uQ2FsbGJhY2tzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdGlvbk1ldGhvZCBvZiB2YWxpZGF0aW9uQ2FsbGJhY2tzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHZhbGlkYXRpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNvbnRpbnVlT25FcnJvciA9IHByb3BlcnRpZXM/LmNvbnRpbnVlT25FcnJvciA/PyBmYWxzZTtcbiAgICAgICAgaWYgKCFzZXJ2ZXJFcnJvciB8fCBjb250aW51ZU9uRXJyb3IpIHtcbiAgICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNhbGxiYWNrKGZpZWxkT2JqZWN0LCB2YWxpZGF0aW9uUmVzdWx0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjb250aW51ZUZpZWxkVmFsaWRhdGlvbihmaWVsZENvZGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0U2VydmVyRmllbGRWYWxpZGF0aW9uKGZpZWxkQ29kZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFuZWphZG9yZXMgZGUgZXZlbnRvcyBwYXJhIGFjY2lvbmVzIHNvYnJlIFRhYmxhc1xuICAgKi9cblxuICBhZGRUYWJsZUFjdGlvblN0YXJ0KGNvZGU6IHN0cmluZywgYWN0aW9uQ29kZTogc3RyaW5nLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUoY29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmxpbmVBY3Rpb25PYmplY3QgPSB0YWJsZU9iamVjdC5nZXRBY3Rpb24oYWN0aW9uQ29kZSk7XG4gICAgaWYgKCFpbmxpbmVBY3Rpb25PYmplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHRhYmxlRXZlbnRIYW5kbGVyczogYW55O1xuICAgIGlmICh0aGlzLl90YWJsZUFjdGlvbnNTdGFydFtjb2RlXSkge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy5fdGFibGVBY3Rpb25zU3RhcnRbY29kZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHt9O1xuICAgICAgdGhpcy5fdGFibGVBY3Rpb25zU3RhcnRbY29kZV0gPSB0YWJsZUV2ZW50SGFuZGxlcnM7XG4gICAgfVxuICAgIGlmICghdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0gPSBbXTtcbiAgICB9XG4gICAgdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdLnB1c2goeyBjYWxsYmFjaywgcHJvcGVydGllcyB9KTtcbiAgfVxuXG4gIGFkZFRhYmxlQWN0aW9uRmluaXNoKGNvZGU6IHN0cmluZywgYWN0aW9uQ29kZTogc3RyaW5nLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUoY29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmxpbmVBY3Rpb25PYmplY3QgPSB0YWJsZU9iamVjdC5nZXRBY3Rpb24oYWN0aW9uQ29kZSk7XG4gICAgaWYgKCFpbmxpbmVBY3Rpb25PYmplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHRhYmxlRXZlbnRIYW5kbGVyczogYW55O1xuICAgIGlmICh0aGlzLl90YWJsZUFjdGlvbnNGaW5pc2hbY29kZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlQWN0aW9uc0ZpbmlzaFtjb2RlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0ge307XG4gICAgICB0aGlzLl90YWJsZUFjdGlvbnNGaW5pc2hbY29kZV0gPSB0YWJsZUV2ZW50SGFuZGxlcnM7XG4gICAgfVxuICAgIGlmICghdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0gPSBbXTtcbiAgICB9XG4gICAgdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdLnB1c2goeyBjYWxsYmFjaywgcHJvcGVydGllcyB9KTtcbiAgfVxuXG4gIGFkZFRhYmxlU2VsZWN0aW9uU3RhcnQoY29kZTogc3RyaW5nLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUoY29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkgeyByZXR1cm47IH1cbiAgICBsZXQgdGFibGVFdmVudEhhbmRsZXJzOiBhbnlbXTtcbiAgICBpZiAodGhpcy5fdGFibGVTZWxlY3Rpb25zU3RhcnRbY29kZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlU2VsZWN0aW9uc1N0YXJ0W2NvZGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSBbXTtcbiAgICAgIHRoaXMuX3RhYmxlU2VsZWN0aW9uc1N0YXJ0W2NvZGVdID0gdGFibGVFdmVudEhhbmRsZXJzO1xuICAgIH1cbiAgICB0YWJsZUV2ZW50SGFuZGxlcnMucHVzaCh7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgYWRkVGFibGVTZWxlY3Rpb25GaW5pc2goY29kZTogc3RyaW5nLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUoY29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkgeyByZXR1cm47IH1cbiAgICBsZXQgdGFibGVFdmVudEhhbmRsZXJzOiBhbnlbXTtcbiAgICBpZiAodGhpcy5fdGFibGVTZWxlY3Rpb25zRmluaXNoW2NvZGVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZVNlbGVjdGlvbnNGaW5pc2hbY29kZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IFtdO1xuICAgICAgdGhpcy5fdGFibGVTZWxlY3Rpb25zRmluaXNoW2NvZGVdID0gdGFibGVFdmVudEhhbmRsZXJzO1xuICAgIH1cbiAgICB0YWJsZUV2ZW50SGFuZGxlcnMucHVzaCh7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgYWRkVGFibGVHZXREYXRhU3RhcnQoY29kZTogc3RyaW5nLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUoY29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdGFibGVFdmVudEhhbmRsZXJzOiBhbnlbXTtcbiAgICBpZiAodGhpcy5fdGFibGVHZXREYXRhU3RhcnRbY29kZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlR2V0RGF0YVN0YXJ0W2NvZGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSBbXTtcbiAgICAgIHRoaXMuX3RhYmxlR2V0RGF0YVN0YXJ0W2NvZGVdID0gdGFibGVFdmVudEhhbmRsZXJzO1xuICAgIH1cbiAgICB0YWJsZUV2ZW50SGFuZGxlcnMucHVzaCh7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgYWRkVGFibGVHZXREYXRhRmluaXNoKGNvZGU6IHN0cmluZywgY2FsbGJhY2ssIHByb3BlcnRpZXMgPSBudWxsKSB7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKGNvZGUpO1xuICAgIGlmICghdGFibGVPYmplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHRhYmxlRXZlbnRIYW5kbGVyczogYW55O1xuICAgIGlmICh0aGlzLl90YWJsZUdldERhdGFGaW5pc2hbY29kZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlR2V0RGF0YUZpbmlzaFtjb2RlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0ge307XG4gICAgICB0aGlzLl90YWJsZUdldERhdGFGaW5pc2hbY29kZV0gPSB0YWJsZUV2ZW50SGFuZGxlcnM7XG4gICAgfVxuICAgIHRhYmxlRXZlbnRIYW5kbGVyc1tHRVRfREFUQV9BQ1RJT05dID0geyBjYWxsYmFjaywgcHJvcGVydGllcyB9O1xuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZUdsb2JhbEFjdGlvbih0YWJsZUFjdGlvbkV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgYWN0aW9uQ29kZSB9ID0gdGFibGVBY3Rpb25FdmVudDtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVDb2RlKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0IHx8ICFhY3Rpb25Db2RlKSB7IHJldHVybjsgfVxuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IGFjdGlvbiA9IHRhYmxlT2JqZWN0LmdldEFjdGlvbihhY3Rpb25Db2RlKTtcbiAgICBpZiAoIWFjdGlvbikgeyByZXR1cm47IH1cbiAgICBjb25zdCB0YWJsZUFjdGlvbkRldGFpbCA9IHtcbiAgICAgIHRhYmxlT2JqZWN0LFxuICAgICAgYWN0aW9uLFxuICAgICAgdGFibGVDb2RlLFxuICAgICAgYWN0aW9uQ29kZSxcbiAgICB9O1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlQWN0aW9uc1N0YXJ0W3RhYmxlQ29kZV07XG4gICAgY29uc3QgdGFibGVBY3Rpb25NZXRob2RzID0gKHRhYmxlRXZlbnRIYW5kbGVycykgPyB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0gOiBudWxsO1xuICAgIGlmICh0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGFibGVBY3Rpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2UgPSBjYWxsYmFjayh0YWJsZUFjdGlvbkRldGFpbCk7XG4gICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2xpZW50QWN0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVBY3Rpb24gPSBjbGllbnRBY3Rpb25SZXN1bHRzLnJlZHVjZSgodG90YWwsIGN1cnIpID0+ICh0b3RhbCAmJiAoY3VyciAhPT0gZmFsc2UpKSwgdHJ1ZSk7XG4gICAgICBpZiAoIWNvbnRpbnVlQWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGFydFRhYmxlU2VydmVyR2xvYmFsQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVTZXJ2ZXJHbG9iYWxBY3Rpb24odGFibGVBY3Rpb25EZXRhaWw6IGFueSkge1xuICAgIGNvbnN0IHsgdGFibGVPYmplY3QsIGFjdGlvbiwgdGFibGVDb2RlLCBhY3Rpb25Db2RlIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBpZiAoIXRhYmxlT2JqZWN0IHx8ICFhY3Rpb24pIHsgcmV0dXJuOyB9XG4gICAgdGFibGVPYmplY3QucHV0T25XYWl0KCk7XG4gICAgbGV0IHNlcnZlckVycm9yID0gZmFsc2U7XG4gICAgbGV0IGFjdGlvblJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGFjdGlvbi5iYWNrZW5kKSB7XG4gICAgICBjb25zdCBhY3Rpb25TdWJqZWN0ID0ge1xuICAgICAgICB0YWJsZUNvZGUsXG4gICAgICAgIGFjdGlvblR5cGU6IEdMT0JBTF9BQ1RJT04sXG4gICAgICAgIGFjdGlvbkNvZGVcbiAgICAgIH07XG4gICAgICBhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzXG4gICAgICAgIC5yZXF1ZXN0Rm9ybUFjdGlvbihmb3JtQWN0aW9ucy50YWJsZUFjdGlvbiwgYWN0aW9uU3ViamVjdCk7XG4gICAgICBzZXJ2ZXJFcnJvciA9ICEhdGhpcy5lcnJvck9jY3VyZWQoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5maW5pc2hUYWJsZUdsb2JhbEFjdGlvbih0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0LCBzZXJ2ZXJFcnJvcik7XG4gICAgaWYgKCFzZXJ2ZXJFcnJvcikge1xuICAgICAgYWN0aW9uLm5ld1N0YXRlICYmIHRoaXMuY2hhbmdlU3RhdGUoYWN0aW9uLm5ld1N0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNwbGF5VGFibGVTZXJ2ZXJFcnJvcigpO1xuICAgIH1cbiAgICB0YWJsZU9iamVjdC5mcmVlV2FpdGluZygpO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoVGFibGVHbG9iYWxBY3Rpb24odGFibGVBY3Rpb25EZXRhaWw6IGFueSwgYWN0aW9uUmVzdWx0LCBzZXJ2ZXJFcnJvciA9IGZhbHNlKSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUsIGFjdGlvbkNvZGUgfSA9IHRhYmxlQWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlQWN0aW9uc0ZpbmlzaFt0YWJsZUNvZGVdO1xuICAgIGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kcyA9ICh0YWJsZUV2ZW50SGFuZGxlcnMpID8gdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVBY3Rpb25NZXRob2Qgb2YgdGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHRhYmxlQWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjb250aW51ZU9uRXJyb3IgPSBwcm9wZXJ0aWVzPy5jb250aW51ZU9uRXJyb3IgPz8gZmFsc2U7XG4gICAgICAgIGlmICghc2VydmVyRXJyb3IgfHwgY29udGludWVPbkVycm9yKSB7XG4gICAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjYWxsYmFjayh0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydFRhYmxlQWN0aW9uKHRhYmxlQWN0aW9uRXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHsgdGFibGVDb2RlLCBhY3Rpb25Db2RlLCBhY3Rpb25EZXRhaWwgfSA9IHRhYmxlQWN0aW9uRXZlbnQ7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKHRhYmxlQ29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCB8fCAhYWN0aW9uQ29kZSkgeyByZXR1cm47IH1cbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICBjb25zdCB7IHJlY29yZElkLCByZWNvcmREYXRhIH0gPSBhY3Rpb25EZXRhaWw7XG4gICAgY29uc3QgYWN0aW9uID0gdGFibGVPYmplY3QuZ2V0QWN0aW9uKGFjdGlvbkNvZGUpO1xuICAgIGlmICghYWN0aW9uKSB7IHJldHVybjsgfVxuICAgIGNvbnN0IHRhYmxlQWN0aW9uRGV0YWlsID0ge1xuICAgICAgdGFibGVPYmplY3QsXG4gICAgICBhY3Rpb24sXG4gICAgICB0YWJsZUNvZGUsXG4gICAgICBhY3Rpb25Db2RlLFxuICAgICAgcmVjb3JkSWQsXG4gICAgICByZWNvcmREYXRhXG4gICAgfTtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNTdGFydFt0YWJsZUNvZGVdO1xuICAgIGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kcyA9ICh0YWJsZUV2ZW50SGFuZGxlcnMpID8gdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVBY3Rpb25NZXRob2Qgb2YgdGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHRhYmxlQWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlID0gY2FsbGJhY2sodGFibGVBY3Rpb25EZXRhaWwpO1xuICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNsaWVudEFjdGlvblByb21pc2UpO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlQWN0aW9uID0gY2xpZW50QWN0aW9uUmVzdWx0cy5yZWR1Y2UoKHRvdGFsLCBjdXJyKSA9PiAodG90YWwgJiYgKGN1cnIgIT09IGZhbHNlKSksIHRydWUpO1xuICAgICAgaWYgKCFjb250aW51ZUFjdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3RhcnRUYWJsZVNlcnZlckFjdGlvbih0YWJsZUFjdGlvbkRldGFpbCk7XG4gIH1cblxuICBhc3luYyBzdGFydFRhYmxlU2VydmVyQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsOiBhbnkpIHtcbiAgICBjb25zdCB7IHRhYmxlT2JqZWN0LCBhY3Rpb24sIHRhYmxlQ29kZSwgYWN0aW9uQ29kZSwgcmVjb3JkSWQsIHJlY29yZERhdGEgfSA9IHRhYmxlQWN0aW9uRGV0YWlsO1xuICAgIGlmICghdGFibGVPYmplY3QgfHwgIWFjdGlvbikgeyByZXR1cm47IH1cbiAgICB0YWJsZU9iamVjdC5wdXRPbldhaXQoKTtcbiAgICBsZXQgc2VydmVyRXJyb3IgPSBmYWxzZTtcbiAgICBsZXQgYWN0aW9uUmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoYWN0aW9uLmJhY2tlbmQpIHtcbiAgICAgIGNvbnN0IGFjdGlvblN1YmplY3QgPSB7XG4gICAgICAgIHRhYmxlQ29kZSxcbiAgICAgICAgYWN0aW9uVHlwZTogdGhpcy5mb3JtQ29uZmlnLnRhYmxlQWN0aW9ucy5pbmxpbmUsXG4gICAgICAgIGFjdGlvbkNvZGUsXG4gICAgICAgIHRhYmxlUmVjb3JkSWQ6IHJlY29yZElkLFxuICAgICAgICB0YWJsZVJlY29yZERhdGE6IHJlY29yZERhdGFcbiAgICAgIH07XG4gICAgICBhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzXG4gICAgICAgIC5yZXF1ZXN0Rm9ybUFjdGlvbihmb3JtQWN0aW9ucy50YWJsZUFjdGlvbiwgYWN0aW9uU3ViamVjdCk7XG4gICAgICBzZXJ2ZXJFcnJvciA9ICEhdGhpcy5lcnJvck9jY3VyZWQoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5maW5pc2hUYWJsZUFjdGlvbih0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0LCBzZXJ2ZXJFcnJvcik7XG4gICAgaWYgKCFzZXJ2ZXJFcnJvcikge1xuICAgICAgYWN0aW9uLm5ld1N0YXRlICYmIHRoaXMuY2hhbmdlU3RhdGUoYWN0aW9uLm5ld1N0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNwbGF5VGFibGVTZXJ2ZXJFcnJvcigpO1xuICAgIH1cbiAgICB0YWJsZU9iamVjdC5mcmVlV2FpdGluZygpO1xuICB9XG5cbiAgY29tcGxldGVJbmxpbmVBY3Rpb24odGFibGVBY3Rpb246IGFueSkge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0VGFibGVTZXJ2ZXJBY3Rpb24odGFibGVBY3Rpb24pO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoVGFibGVBY3Rpb24odGFibGVBY3Rpb25EZXRhaWw6IGFueSwgYWN0aW9uUmVzdWx0LCBzZXJ2ZXJFcnJvciA9IGZhbHNlKSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUsIGFjdGlvbkNvZGUgfSA9IHRhYmxlQWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlQWN0aW9uc0ZpbmlzaFt0YWJsZUNvZGVdO1xuICAgIGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kcyA9ICh0YWJsZUV2ZW50SGFuZGxlcnMpID8gdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVBY3Rpb25NZXRob2Qgb2YgdGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHRhYmxlQWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjb250aW51ZU9uRXJyb3IgPSBwcm9wZXJ0aWVzPy5jb250aW51ZU9uRXJyb3IgPz8gZmFsc2U7XG4gICAgICAgIGlmICghc2VydmVyRXJyb3IgfHwgY29udGludWVPbkVycm9yKSB7XG4gICAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjYWxsYmFjayh0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydFRhYmxlUmVjb3JkU2VsZWN0aW9uKHRhYmxlQWN0aW9uRXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHsgdGFibGVDb2RlLCBhY3Rpb25EZXRhaWwgfSA9IHRhYmxlQWN0aW9uRXZlbnQ7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKHRhYmxlQ29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkgeyByZXR1cm47IH1cbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICBjb25zdCB7IHJlY29yZElkLCByZWNvcmREYXRhIH0gPSBhY3Rpb25EZXRhaWw7XG4gICAgY29uc3QgdGFibGVTZWxlY3Rpb25EZXRhaWwgPSB7XG4gICAgICB0YWJsZU9iamVjdCxcbiAgICAgIHRhYmxlQ29kZSxcbiAgICAgIHJlY29yZElkLFxuICAgICAgcmVjb3JkRGF0YVxuICAgIH07XG4gICAgY29uc3QgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy5fdGFibGVTZWxlY3Rpb25zU3RhcnRbdGFibGVDb2RlXTtcbiAgICBpZiAodGFibGVFdmVudEhhbmRsZXJzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVTZWxlY3Rpb25NZXRob2Qgb2YgdGFibGVFdmVudEhhbmRsZXJzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHRhYmxlU2VsZWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlID0gY2FsbGJhY2sodGFibGVTZWxlY3Rpb25EZXRhaWwpO1xuICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNsaWVudEFjdGlvblByb21pc2UpO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlQWN0aW9uID0gY2xpZW50QWN0aW9uUmVzdWx0cy5yZWR1Y2UoKHRvdGFsLCBjdXJyKSA9PiAodG90YWwgJiYgKGN1cnIgIT09IGZhbHNlKSksIHRydWUpO1xuICAgICAgaWYgKCFjb250aW51ZUFjdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3RhcnRUYWJsZVNlcnZlclJlY29yZFNlbGVjdGlvbih0YWJsZVNlbGVjdGlvbkRldGFpbCk7XG4gIH1cblxuICBhc3luYyBzdGFydFRhYmxlU2VydmVyUmVjb3JkU2VsZWN0aW9uKHRhYmxlU2VsZWN0aW9uRGV0YWlsOiBhbnkpIHtcbiAgICBjb25zdCB7IHRhYmxlT2JqZWN0LCB0YWJsZUNvZGUsIHJlY29yZElkLCByZWNvcmREYXRhIH0gPSB0YWJsZVNlbGVjdGlvbkRldGFpbDtcbiAgICBpZiAoIXRhYmxlT2JqZWN0KSB7IHJldHVybjsgfVxuICAgIHRhYmxlT2JqZWN0LnB1dE9uV2FpdCgpO1xuICAgIGxldCBzZXJ2ZXJFcnJvciA9IGZhbHNlO1xuICAgIGxldCBhY3Rpb25SZXN1bHQgPSBudWxsO1xuICAgIGlmICh0YWJsZU9iamVjdC5zZWxlY3Rpb25CYWNrZW5kKSB7XG4gICAgICBjb25zdCBhY3Rpb25TdWJqZWN0OiBhbnkgPSB7XG4gICAgICAgIHRhYmxlQ29kZSxcbiAgICAgICAgYWN0aW9uVHlwZTogdGhpcy5mb3JtQ29uZmlnLnRhYmxlQWN0aW9ucy5yb3dTZWxlY3Rpb24sXG4gICAgICAgIGFjdGlvbkNvZGU6IG51bGwsXG4gICAgICAgIHRhYmxlUmVjb3JkSWQ6IHJlY29yZElkLFxuICAgICAgICB0YWJsZVJlY29yZERhdGE6IHJlY29yZERhdGFcbiAgICAgIH07XG4gICAgICBhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzXG4gICAgICAgIC5yZXF1ZXN0Rm9ybUFjdGlvbihmb3JtQWN0aW9ucy50YWJsZUFjdGlvbiwgYWN0aW9uU3ViamVjdCk7XG4gICAgICBzZXJ2ZXJFcnJvciA9ICEhdGhpcy5lcnJvck9jY3VyZWQoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5maW5pc2hUYWJsZVJlY29yZFNlbGVjdGlvbih0YWJsZVNlbGVjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0LCBzZXJ2ZXJFcnJvcik7XG4gICAgaWYgKHNlcnZlckVycm9yKSB7XG4gICAgICB0aGlzLmRpc3BsYXlUYWJsZVNlcnZlckVycm9yKCk7XG4gICAgfVxuICAgIHRhYmxlT2JqZWN0LmZyZWVXYWl0aW5nKCk7XG4gIH1cblxuICBhc3luYyBmaW5pc2hUYWJsZVJlY29yZFNlbGVjdGlvbih0YWJsZVNlbGVjdGlvbkRldGFpbDogYW55LCBhY3Rpb25SZXN1bHQsIHNlcnZlckVycm9yID0gZmFsc2UpIHtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSB9ID0gdGFibGVTZWxlY3Rpb25EZXRhaWw7XG4gICAgY29uc3QgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy5fdGFibGVTZWxlY3Rpb25zRmluaXNoW3RhYmxlQ29kZV07XG4gICAgaWYgKHRhYmxlRXZlbnRIYW5kbGVycykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRhYmxlU2VsZWN0aW9uTWV0aG9kIG9mIHRhYmxlRXZlbnRIYW5kbGVycykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB0YWJsZVNlbGVjdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY29udGludWVPbkVycm9yID0gcHJvcGVydGllcz8uY29udGludWVPbkVycm9yID8/IGZhbHNlO1xuICAgICAgICBpZiAoIXNlcnZlckVycm9yIHx8IGNvbnRpbnVlT25FcnJvcikge1xuICAgICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2FsbGJhY2sodGFibGVTZWxlY3Rpb25EZXRhaWwsIGFjdGlvblJlc3VsdCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZVNlbGVjdGlvbkFjdGlvbih0YWJsZUFjdGlvbkV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgYWN0aW9uQ29kZSwgYWN0aW9uRGV0YWlsIH0gPSB0YWJsZUFjdGlvbkV2ZW50O1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZSh0YWJsZUNvZGUpO1xuICAgIGlmICghdGFibGVPYmplY3QgfHwgIWFjdGlvbkNvZGUpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG4gICAgY29uc3QgeyBzZWxlY3RlZFJlY29yZHMgfSA9IGFjdGlvbkRldGFpbDtcbiAgICBjb25zdCBhY3Rpb24gPSB0YWJsZU9iamVjdC5nZXRBY3Rpb24oYWN0aW9uQ29kZSk7XG4gICAgaWYgKCFhY3Rpb24pIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgdGFibGVBY3Rpb25EZXRhaWwgPSB7XG4gICAgICB0YWJsZU9iamVjdCxcbiAgICAgIGFjdGlvbixcbiAgICAgIHRhYmxlQ29kZSxcbiAgICAgIGFjdGlvbkNvZGUsXG4gICAgICBzZWxlY3RlZFJlY29yZHNcbiAgICB9O1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlQWN0aW9uc1N0YXJ0W3RhYmxlQ29kZV07XG4gICAgY29uc3QgdGFibGVBY3Rpb25NZXRob2RzID0gKHRhYmxlRXZlbnRIYW5kbGVycykgPyB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0gOiBudWxsO1xuICAgIGlmICh0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGFibGVBY3Rpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2UgPSBjYWxsYmFjayh0YWJsZUFjdGlvbkRldGFpbCk7XG4gICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2xpZW50QWN0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVBY3Rpb24gPSBjbGllbnRBY3Rpb25SZXN1bHRzLnJlZHVjZSgodG90YWwsIGN1cnIpID0+ICh0b3RhbCAmJiAoY3VyciAhPT0gZmFsc2UpKSwgdHJ1ZSk7XG4gICAgICBpZiAoIWNvbnRpbnVlQWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGFydFRhYmxlU2VydmVyU2VsZWN0aW9uQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVTZXJ2ZXJTZWxlY3Rpb25BY3Rpb24odGFibGVBY3Rpb25EZXRhaWw6IGFueSkge1xuICAgIGNvbnN0IHsgdGFibGVPYmplY3QsIGFjdGlvbiwgdGFibGVDb2RlLCBhY3Rpb25Db2RlLCBzZWxlY3RlZFJlY29yZHMgfSA9IHRhYmxlQWN0aW9uRGV0YWlsO1xuICAgIGlmICghdGFibGVPYmplY3QgfHwgIWFjdGlvbikgeyByZXR1cm47IH1cbiAgICB0YWJsZU9iamVjdC5wdXRPbldhaXQoKTtcbiAgICBsZXQgc2VydmVyRXJyb3IgPSBmYWxzZTtcbiAgICBsZXQgYWN0aW9uUmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoYWN0aW9uLmJhY2tlbmQpIHtcbiAgICAgIGNvbnN0IGFjdGlvblN1YmplY3QgPSB7XG4gICAgICAgIHRhYmxlQ29kZSxcbiAgICAgICAgYWN0aW9uVHlwZTogdGhpcy5mb3JtQ29uZmlnLnRhYmxlQWN0aW9ucy5zZWxlY3Rpb24sXG4gICAgICAgIGFjdGlvbkNvZGUsXG4gICAgICAgIHNlbGVjdGVkUmVjb3Jkc1xuICAgICAgfTtcbiAgICAgIGFjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXNcbiAgICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKGZvcm1BY3Rpb25zLnRhYmxlQWN0aW9uLCBhY3Rpb25TdWJqZWN0KTtcbiAgICAgIHNlcnZlckVycm9yID0gISF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmZpbmlzaFRhYmxlU2VsZWN0aW9uQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQsIHNlcnZlckVycm9yKTtcbiAgICBpZiAoIXNlcnZlckVycm9yKSB7XG4gICAgICBhY3Rpb24ubmV3U3RhdGUgJiYgdGhpcy5jaGFuZ2VTdGF0ZShhY3Rpb24ubmV3U3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BsYXlUYWJsZVNlcnZlckVycm9yKCk7XG4gICAgfVxuICAgIHRhYmxlT2JqZWN0LmZyZWVXYWl0aW5nKCk7XG4gIH1cblxuICBhc3luYyBmaW5pc2hUYWJsZVNlbGVjdGlvbkFjdGlvbih0YWJsZUFjdGlvbkRldGFpbDogYW55LCBhY3Rpb25SZXN1bHQsIHNlcnZlckVycm9yID0gZmFsc2UpIHtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgYWN0aW9uQ29kZSB9ID0gdGFibGVBY3Rpb25EZXRhaWw7XG4gICAgY29uc3QgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy5fdGFibGVBY3Rpb25zRmluaXNoW3RhYmxlQ29kZV07XG4gICAgY29uc3QgdGFibGVBY3Rpb25NZXRob2RzID0gKHRhYmxlRXZlbnRIYW5kbGVycykgPyB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0gOiBudWxsO1xuICAgIGlmICh0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGFibGVBY3Rpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNvbnRpbnVlT25FcnJvciA9IHByb3BlcnRpZXM/LmNvbnRpbnVlT25FcnJvciA/PyBmYWxzZTtcbiAgICAgICAgaWYgKCFzZXJ2ZXJFcnJvciB8fCBjb250aW51ZU9uRXJyb3IpIHtcbiAgICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNhbGxiYWNrKHRhYmxlQWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVHZXREYXRhKHRhYmxlQWN0aW9uRXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHsgdGFibGVDb2RlIH0gPSB0YWJsZUFjdGlvbkV2ZW50O1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZSh0YWJsZUNvZGUpO1xuICAgIGNvbnN0IHRhYmxlQWN0aW9uRGV0YWlsID0ge1xuICAgICAgdGFibGVPYmplY3QsXG4gICAgICB0YWJsZUNvZGVcbiAgICB9O1xuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlR2V0RGF0YVN0YXJ0W3RhYmxlQ29kZV07XG4gICAgaWYgKHRhYmxlRXZlbnRIYW5kbGVycykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kIG9mIHRhYmxlRXZlbnRIYW5kbGVycykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB0YWJsZUFjdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZSA9IGNhbGxiYWNrKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjbGllbnRBY3Rpb25Qcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgICBjb25zdCBjb250aW51ZUFjdGlvbiA9IGNsaWVudEFjdGlvblJlc3VsdHMucmVkdWNlKCh0b3RhbCwgY3VycikgPT4gKHRvdGFsICYmIChjdXJyICE9PSBmYWxzZSkpLCB0cnVlKTtcbiAgICAgIGlmICghY29udGludWVBY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXJ0VGFibGVTZXJ2ZXJHZXREYXRhKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVTZXJ2ZXJHZXREYXRhKHRhYmxlQWN0aW9uRGV0YWlsOiBhbnkpIHtcbiAgICBjb25zdCB7IHRhYmxlT2JqZWN0LCB0YWJsZUNvZGUgfSA9IHRhYmxlQWN0aW9uRGV0YWlsO1xuICAgIHRhYmxlT2JqZWN0LnB1dE9uV2FpdCgpO1xuICAgIGxldCBzZXJ2ZXJFcnJvciA9IGZhbHNlO1xuICAgIGNvbnN0IGFjdGlvblN1YmplY3QgPSB7IHRhYmxlQ29kZSB9O1xuICAgIGNvbnN0IGFjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXNcbiAgICAgIC5yZXF1ZXN0Rm9ybUFjdGlvbihmb3JtQWN0aW9ucy5nZXRUYWJsZURhdGEsIGFjdGlvblN1YmplY3QpO1xuICAgIHNlcnZlckVycm9yID0gISF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIGF3YWl0IHRoaXMuZmluaXNoVGFibGVHZXREYXRhKHRhYmxlQWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQsIHNlcnZlckVycm9yKTtcbiAgICBpZiAoc2VydmVyRXJyb3IpIHtcbiAgICAgIHRoaXMuZGlzcGxheVRhYmxlU2VydmVyRXJyb3IoKTtcbiAgICB9XG4gICAgdGFibGVPYmplY3QuZnJlZVdhaXRpbmcoKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFRhYmxlR2V0RGF0YSh0YWJsZUFjdGlvbkRldGFpbDogYW55LCBhY3Rpb25SZXN1bHQsIHNlcnZlckVycm9yID0gZmFsc2UpIHtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgdGFibGVBY3Rpb25Db2RlIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNGaW5pc2hbdGFibGVDb2RlXTtcbiAgICBjb25zdCB0YWJsZUFjdGlvbk1ldGhvZHMgPSAodGFibGVFdmVudEhhbmRsZXJzKSA/IHRhYmxlRXZlbnRIYW5kbGVyc1t0YWJsZUFjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVBY3Rpb25NZXRob2Qgb2YgdGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHRhYmxlQWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjb250aW51ZU9uRXJyb3IgPSBwcm9wZXJ0aWVzPy5jb250aW51ZU9uRXJyb3IgPz8gZmFsc2U7XG4gICAgICAgIGlmICghc2VydmVyRXJyb3IgfHwgY29udGludWVPbkVycm9yKSB7XG4gICAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjYWxsYmFjayh0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICB9XG4gIH1cblxuICBjaGVja1NlY3Rpb25SZXF1aXJlZEZpZWxkcyhzZWN0aW9uQ29kZTogc3RyaW5nLCByZXFGaWVsZE1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmNsZWFuRXJyb3JGaWVsZHMobnVsbCwgc2VjdGlvbkNvZGUpO1xuICAgIGNvbnN0IHJlcXVpcmVkRmllbGRNZXNzYWdlID0gcmVxRmllbGRNZXNzYWdlID8/IHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMucmVxdWlyZWRGaWVsZFxuICAgIGNvbnN0IG51bUVycm9ycyA9IHRoaXMudGFnRmllbGRzV2l0aEVycm9yKHJlcXVpcmVkRmllbGRNZXNzYWdlLCB0aGlzLmdldFJlcXVpcmVkRW1wdHlGaWVsZHMobnVsbCwgc2VjdGlvbkNvZGUpKTtcbiAgICByZXR1cm4gKG51bUVycm9ycyA9PT0gMCk7XG4gIH1cblxuICB2YWxpZGF0ZVNlY3Rpb25Db25zaXN0ZW5jeShzZWN0aW9uQ29kZTogc3RyaW5nLCByZXFGaWVsZE1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICBjb25zdCBjb21wbGV0ZUZpZWxkcyA9IHRoaXMuY2hlY2tTZWN0aW9uUmVxdWlyZWRGaWVsZHMoc2VjdGlvbkNvZGUsIHJlcUZpZWxkTWVzc2FnZSk7XG4gICAgaWYgKCFjb21wbGV0ZUZpZWxkcykge1xuICAgICAgdGhpcy5zZXRFcnJvcih0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnR5cGVXYXJuaW5nLFxuICAgICAgICB0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnZhbGlkYXRpb25UaXRsZSxcbiAgICAgICAgdGhpcy5mb3JtQ29uZmlnLmZvcm1TdGFuZGFyZEVycm9ycy5yZXF1aXJlZEZpZWxkcyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCB2YWxpZGF0aW9uRXJyb3IgPSBmYWxzZTtcbiAgICBjb25zdCByZXF1aXJlZEVtcHR5RmllbGRzID0gdGhpcy5nZXRSZXF1aXJlZEVtcHR5RmllbGRzKG51bGwsIHNlY3Rpb25Db2RlKTtcbiAgICBpZiAocmVxdWlyZWRFbXB0eUZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICB2YWxpZGF0aW9uRXJyb3IgPSB0cnVlO1xuICAgICAgdGhpcy5zZXRFcnJvcih0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnR5cGVXYXJuaW5nLFxuICAgICAgICB0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnZhbGlkYXRpb25UaXRsZSxcbiAgICAgICAgdGhpcy5mb3JtQ29uZmlnLmZvcm1TdGFuZGFyZEVycm9ycy5yZXF1aXJlZEZpZWxkcyk7XG4gICAgICB0aGlzLnRhZ0ZpZWxkc1dpdGhFcnJvcih0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnJlcXVpcmVkRmllbGQsIHJlcXVpcmVkRW1wdHlGaWVsZHMpO1xuICAgICAgZm9yIChjb25zdCBmaWVsZENvZGUgb2YgcmVxdWlyZWRFbXB0eUZpZWxkcykge1xuICAgICAgICBjb25zdCByZXF1aXJlZEVtcHR5RmllbGQgPSB0aGlzLmdldEZpZWxkKGZpZWxkQ29kZSk7XG4gICAgICAgIHJlcXVpcmVkRW1wdHlGaWVsZD8uZm9jdXMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHZhbGlkYXRpb25Jc3N1ZUZpZWxkcyA9IHRoaXMuZ2V0RmllbGRzV2l0aFZhbGlkYXRpb25Jc3N1ZXMobnVsbCxcbiAgICAgIHNlY3Rpb25Db2RlKTtcbiAgICBpZiAoIXZhbGlkYXRpb25FcnJvciAmJiB2YWxpZGF0aW9uSXNzdWVGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgdmFsaWRhdGlvbkVycm9yID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2V0RXJyb3IodGhpcy5mb3JtQ29uZmlnLmZvcm1TdGFuZGFyZEVycm9ycy50eXBlV2FybmluZyxcbiAgICAgICAgdGhpcy5mb3JtQ29uZmlnLmZvcm1TdGFuZGFyZEVycm9ycy52YWxpZGF0aW9uVGl0bGUsXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMudmFsaWRhdGlvbkZpZWxkcyk7XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkQ29kZSBvZiB2YWxpZGF0aW9uSXNzdWVGaWVsZHMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbklzc3VlRmllbGQgPSB0aGlzLmdldEZpZWxkKGZpZWxkQ29kZSk7XG4gICAgICAgIHZhbGlkYXRpb25Jc3N1ZUZpZWxkLmZvY3VzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdGlvbkVycm9yO1xuICB9XG5cbiAgY29weVRhYmxlUmVjb3JkVG9GaWVsZHModGFibGVPYmo6IGFueSwgbWFwcGluZ1RhYmxlOiBhbnkgPSBudWxsKSB7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKHRhYmxlT2JqLnRhYmxlQ29kZSk7XG4gICAgY29uc3QgdGFibGVSZWNvcmQgPSB0YWJsZU9iamVjdC5nZXRUYWJsZVJlY29yZCh0YWJsZU9iai5yZWNvcmRJZCk7XG4gICAgY29uc3QgY29sdW1uTmFtZXMgPSB0YWJsZU9iamVjdC5jb2x1bW5OYW1lcztcbiAgICBmb3IgKGNvbnN0IGNvbHVtbk5hbWUgb2YgY29sdW1uTmFtZXMpIHtcbiAgICAgIGNvbnN0IGNvbHVtblZhbHVlID0gdGFibGVSZWNvcmQuZ2V0RmllbGRWYWx1ZShjb2x1bW5OYW1lKSA/PyAnJztcbiAgICAgIGNvbnN0IGZpZWxkQ29kZSA9IG1hcHBpbmdUYWJsZT8uW2NvbHVtbk5hbWVdID8/IGNvbHVtbk5hbWU7XG4gICAgICB0aGlzLnNldEZpZWxkVmFsdWUoZmllbGRDb2RlLCBjb2x1bW5WYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXX0=
|
|
1422
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWMtZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1YWluLW5nLWZvcm1zLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvYmFzaWMtZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSWhFLE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLG9DQUFvQyxDQUFDOzs7OztBQU9uRixNQUFNLGVBQWUsR0FBRyxtQkFBbUIsQ0FBQztBQUM1QyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUM7QUFDL0IsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDO0FBQy9CLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQztBQUVsQyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUM7QUFDMUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDO0FBS3RCLE1BQU0sT0FBTyxrQkFBa0I7SUFrUDdCLFlBQ1ksa0JBQXlDLEVBQ3pDLGFBQXFDLEVBQ3JDLGdCQUEwQztRQUYxQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXVCO1FBQ3pDLGtCQUFhLEdBQWIsYUFBYSxDQUF3QjtRQUNyQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQTBCO1FBcFA5QyxtQkFBYyxHQUFnQyxJQUFJLENBQUM7UUFDbkQsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBQ3BDLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxlQUFVLEdBQWtCLElBQUksQ0FBQztRQUNqQyx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFDN0MsK0JBQStCO1FBQ3ZCLDBCQUFxQixHQUFRLEVBQUUsQ0FBQztRQUNoQyw0QkFBdUIsR0FBUSxFQUFFLENBQUM7UUFDbEMsc0JBQWlCLEdBQVEs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Qy9ELENBQUM7OytHQTM3Q1Usa0JBQWtCO21HQUFsQixrQkFBa0Isb0RBRm5CLDJCQUEyQjsyRkFFMUIsa0JBQWtCO2tCQUg5QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwyQkFBMkI7aUJBQ3RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtU3RydWN0dXJlQW5kRGF0YSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZm9ybXMvZm9ybSc7XG5pbXBvcnQgeyBMaWJGb3JtTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mb3JtLW1hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBMaWJFdmVudE1hbmFnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXZlbnQtbWFuYWdlci5zZXJ2aWNlJztcbmltcG9ydCB7IExpYkZpbGVNYW5hZ2VtZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZpbGUtbWFuYWdlci5zZXJ2aWNlJztcbmltcG9ydCB7IGZvcm1BY3Rpb25zLCBOT19FUlJPUiwgSEVBREVSIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9mb3Jtcy9mb3JtLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBGb3JtQWN0aW9uIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9mb3Jtcy9hY3Rpb24nO1xuaW1wb3J0IHsgRmllbGREZXNjcmlwdG9yLCBGaWVsZE9wdGlvbiB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZm9ybXMvZmllbGQnO1xuaW1wb3J0IHsgUmVjb3JkVGFibGUgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2Zvcm1zL3RhYmxlL3RhYmxlJztcbmltcG9ydCB7IFJlY29yZEZvcm1TZWN0aW9uIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9mb3Jtcy9zZWN0aW9uJztcbmltcG9ydCB7IFJlY29yZEZvcm1TdWJTZWN0aW9uIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9mb3Jtcy9zdWJzZWN0aW9uJztcblxuY29uc3QgUEFZTE9BRF9WRVJTSU9OID0gJ1RVQUlORVhDSEFOR0VfMS4wJztcbmNvbnN0IElOTElORV9BQ1RJT04gPSAnSU5MSU5FJztcbmNvbnN0IEdMT0JBTF9BQ1RJT04gPSAnR0xPQkFMJztcbmNvbnN0IEdFVF9EQVRBX0FDVElPTiA9ICdHRVREQVRBJztcblxuY29uc3QgU1VCSkVDVCA9ICdzdWJqZWN0JztcbmNvbnN0IFRPS0VOID0gJ3Rva2VuJztcblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmBcbn0pXG5leHBvcnQgY2xhc3MgQmFzaWNGb3JtQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSBfZm9ybVN0cnVjdHVyZTogRm9ybVN0cnVjdHVyZUFuZERhdGEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfY29udHJvbFRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfb3JpZ2luVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9mb3JtUm91dGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9kZWZpbml0aW9uT2J0YWluZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gRXZlbnRvcyBkZSBhY2Npb25lcyB5IGNhbXBvc1xuICBwcml2YXRlIF9mb3JtU2VjdGlvbnNBY3RpdmF0ZTogYW55ID0ge307XG4gIHByaXZhdGUgX2Zvcm1TZWN0aW9uc0luYWN0aXZhdGU6IGFueSA9IHt9O1xuICBwcml2YXRlIF9mb3JtQWN0aW9uc1N0YXJ0OiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBfZm9ybUFjdGlvbnNGaW5pc2g6IGFueSA9IHt9O1xuICBwcml2YXRlIF9maWVsZElucHV0VmFsaWRhdGlvbjogYW55ID0ge307XG4gIHByaXZhdGUgX2ZpZWxkVmFsaWRhdGlvbnNTdGFydDogYW55ID0ge307XG4gIHByaXZhdGUgX2ZpZWxkVmFsaWRhdGlvbnNGaW5pc2g6IGFueSA9IHt9O1xuICAvLyBDYWxsYmFjayBkZSBhY2Npb25lcyBkZSB0YWJsYXNcbiAgcHJpdmF0ZSBfdGFibGVTZWxlY3Rpb25zU3RhcnQ6IGFueSA9IHt9O1xuICBwcml2YXRlIF90YWJsZVNlbGVjdGlvbnNGaW5pc2g6IGFueSA9IHt9O1xuICBwcml2YXRlIF90YWJsZUFjdGlvbnNTdGFydDogYW55ID0ge307XG4gIHByaXZhdGUgX3RhYmxlQWN0aW9uc0ZpbmlzaDogYW55ID0ge307XG4gIHByaXZhdGUgX3RhYmxlR2V0RGF0YVN0YXJ0OiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBfdGFibGVHZXREYXRhRmluaXNoOiBhbnkgPSB7fTtcblxuICBwcml2YXRlIF9hY3Rpb25TZXJ2ZXJFcnJvcjogYW55W10gPSBbXTtcbiAgcHJpdmF0ZSBfZmllbGRTZXJ2ZXJFcnJvcjogYW55W10gPSBbXTtcbiAgcHJpdmF0ZSBfdGFibGVTZXJ2ZXJFcnJvcjogYW55W10gPSBbXTtcblxuICBwcm90ZWN0ZWQgaW5wdXREYXRhRmllbGRzOiBhbnkgPSB7fTtcbiAgcHJvdGVjdGVkIGV4dHJhRGF0YTogYW55ID0ge307XG4gIHByb3RlY3RlZCBfZXZlbnRFbWl0ZXI6IExpYkV2ZW50TWFuYWdlclNlcnZpY2U7XG4gIHByb3RlY3RlZCBlbmFibGVkU2VjdGlvbnM6IFJlY29yZEZvcm1TZWN0aW9uW10gPSBbXTtcblxuICBmb3JtQ29uZmlnOiBhbnk7XG4gIG5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBmb3JtU3ViamVjdDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIF9lcnJvclR5cGU6IHN0cmluZyA9ICcnO1xuICBlcnJvckNvZGU6IHN0cmluZyA9ICcnO1xuICBlcnJvckZ1bGxDb2RlOiBzdHJpbmcgPSAnJztcbiAgZXJyb3JOYW1lOiBzdHJpbmcgPSAnJztcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgZXJyb3JEZXRhaWw6IHN0cmluZyA9ICcnO1xuICB2aXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZmllbGRzOiBhbnk7XG4gIGFjdGlvbnM6IGFueTtcbiAgc2VjdGlvbnM6IGFueTtcbiAgYnVzeTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldFRpdGxlKCkgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0VGl0bGUoKTsgfVxuICBzZXRUaXRsZSh0aXRsZTogc3RyaW5nKSB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zZXRUaXRsZSh0aXRsZSk7IH1cbiAgY2xlYW5EYXRhKCkgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uY2xlYW5EYXRhKCk7IH1cbiAgZ2V0Q3VycmVudFN0YXRlKCkgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0Q3VycmVudFN0YXRlKCk7IH1cbiAgc3VwcG9ydFN0YXRlKHN0YXRlOiBzdHJpbmcgfCBudWxsKSB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zdXBwb3J0U3RhdGUoc3RhdGUgPz8gJycpID8/IGZhbHNlOyB9XG4gIGNoYW5nZVN0YXRlKHN0YXRlKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5jaGFuZ2VTdGF0ZShzdGF0ZSkgPz8gZmFsc2U7IH1cbiAgZ2V0U3RhdGVzKCkgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc3RhdGVzOyB9XG4gIGdldEltbXV0YWJsZUVsZW1lbnQobmFtZTogc3RyaW5nKSB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRJbW11dGFibGVFbGVtZW50KG5hbWUpOyB9XG4gIGdldEV4dHJhSW5mbyhuYW1lOiBzdHJpbmcpIHsgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldEV4dHJhSW5mbyhuYW1lKTsgfVxuICBnZXRGaWVsZHMoKSB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRGaWVsZHMoKSA/PyBudWxsOyB9XG4gIGdldEZpZWxkTmFtZXMoKSB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRGaWVsZE5hbWVzKCkgPz8gbnVsbDsgfVxuICBnZXRGaWVsZChjb2RlOiBzdHJpbmcpIHsgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldEZpZWxkKGNvZGUpID8/IG51bGw7IH1cbiAgZW5hYmxlRmllbGQoY29kZTogc3RyaW5nKSB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5lbmFibGVGaWVsZChjb2RlKTsgfVxuICBkaXNhYmxlRmllbGQoY29kZTogc3RyaW5nKSB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5kaXNhYmxlRmllbGQoY29kZSk7IH1cbiAgZ2V0RmllbGRWYWx1ZShjb2RlOiBzdHJpbmcpOiBhbnkgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0RmllbGRWYWx1ZShjb2RlKSA/PyBudWxsOyB9XG4gIGdldEZpZWxkT3B0aW9uVGV4dChjb2RlOiBzdHJpbmcpOiBhbnkgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0RmllbGRPcHRpb25UZXh0KGNvZGUpOyB9XG4gIGdldEZpZWxkc1ZhbHVlcyhjb2Rlczogc3RyaW5nW10pIHsgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldEZpZWxkc1ZhbHVlcyhjb2RlcykgPz8gbnVsbDsgfVxuICBnZXRGaWVsZE9wdGlvbnMoY29kZTogc3RyaW5nKTogRmllbGRPcHRpb25bXSB8IG51bGwgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0RmllbGRPcHRpb25zKGNvZGUpID8/IG51bGw7IH1cbiAgc2V0RmllbGRWYWx1ZShjb2RlOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHsgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNldEZpZWxkVmFsdWUoY29kZSwgdmFsdWUpOyB9XG4gIHNldEZpZWxkUmVxdWlyZWQoY29kZTogc3RyaW5nLCByZXF1aXJlZDogYm9vbGVhbikgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2V0RmllbGRSZXF1aXJlZChjb2RlLCByZXF1aXJlZCk7IH1cbiAgc2V0RmllbGRFcnJvck1lc3NhZ2UoY29kZTogc3RyaW5nLCBlcnJvck1lc3NhZ2U6IHN0cmluZykgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2V0RmllbGRFcnJvck1lc3NhZ2UoY29kZSwgZXJyb3JNZXNzYWdlKTsgfVxuICBzZXRGaWVsZEVycm9yKGNvZGU6IHN0cmluZywgZXJyb3JDb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgdHlwZT86IHN0cmluZykgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2V0RmllbGRFcnJvcihjb2RlLCBlcnJvckNvZGUsIG1lc3NhZ2UsIHR5cGUpOyB9XG4gIHNldEZpZWxkSW50cmluc2ljRXJyb3JNZXNzYWdlKGNvZGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNldEZpZWxkSW50cmluc2ljRXJyb3JNZXNzYWdlKGNvZGUsIG1lc3NhZ2UpO1xuICB9XG4gIHNldEZpZWxkT3B0aW9ucyhjb2RlLCBvcHRpb25zQXJyYXksIGlkQXR0cmlidXRlLCBuYW1lQXR0cmlidXRlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNldEZpZWxkT3B0aW9ucyhjb2RlLCBvcHRpb25zQXJyYXksIGlkQXR0cmlidXRlLCBuYW1lQXR0cmlidXRlKTtcbiAgfVxuICBnZXRGaWVsZFNldChmaWx0ZXJGdW5jPywgY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcgfCBudWxsLCBzdWJDb2RlPzogc3RyaW5nIHwgbnVsbCkge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRGaWVsZFNldChmaWx0ZXJGdW5jLCBjb2RlcyA/PyBudWxsLCBzZWNDb2RlID8/IG51bGwsIHN1YkNvZGUgPz8gbnVsbCk7XG4gIH1cbiAgYXBwbHlPbkZpZWxkcyhwcm9jZXNzRnVuYywgY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uYXBwbHlPbkZpZWxkcyhwcm9jZXNzRnVuYywgY29kZXMsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG4gIGFwcGx5UHJvY2Vzc1RvQWxsRmllbGRzKHByb2Nlc3NGdW5jKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmFwcGx5T25GaWVsZHMocHJvY2Vzc0Z1bmMpO1xuICB9XG4gIGNsZWFuRmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmNsZWFuRmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBnZXRSZXF1aXJlZEZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRSZXF1aXJlZEZpZWxkcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgZ2V0UmVxdWlyZWRFbXB0eUZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRSZXF1aXJlZEVtcHR5RmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKSA/PyBudWxsO1xuICB9XG4gIGdldENoYW5nZWRGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0Q2hhbmdlZEZpZWxkcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgZ2V0RmllbGRzV2l0aFZhbGlkYXRpb25Jc3N1ZXMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0RmllbGRzV2l0aFZhbGlkYXRpb25Jc3N1ZXMoY29kZXMsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG4gIHRhZ0ZpZWxkc1dpdGhFcnJvcihlcnJvck1lc3NhZ2U6IHN0cmluZywgY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8udGFnRmllbGRzV2l0aEVycm9yKGVycm9yTWVzc2FnZSwgY29kZXMsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG4gIGNsZWFuRXJyb3JGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uY2xlYW5FcnJvckZpZWxkcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgc2hvd0xhYmVsRmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNob3dMYWJlbEZpZWxkcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgaGlkZUxhYmVsRmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmhpZGVMYWJlbEZpZWxkcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgZW5hYmxlRmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmVuYWJsZUZpZWxkcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgZGlzYWJsZUZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5kaXNhYmxlRmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGVuYWJsZUZpZWxkc1xuICAgKi9cbiAgZW5hYmxlRWRpdEZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmVuYWJsZUZpZWxkcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBkaXNhYmxlRmllbGRzXG4gICAqL1xuICBkaXNhYmxlRWRpdEZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVGaWVsZHMoY29kZXMsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG4gIHNob3dGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2hvd0ZpZWxkcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgaGlkZUZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5oaWRlRmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBnZXRBY3Rpb25zQnlBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRBY3Rpb25zQnlBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICB9XG4gIGdldEhlYWRlckFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldEFjdGlvbnNCeUF0dHJpYnV0ZSgnbG9jYXRpb24nLCBIRUFERVIpO1xuICB9XG4gIGdldEFjdGlvbihhY3Rpb25Db2RlOiBzdHJpbmcpOiBGb3JtQWN0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldEFjdGlvbihhY3Rpb25Db2RlKSA/PyBudWxsO1xuICB9XG4gIHNob3dBY3Rpb25zKGFjdGlvbkFycmF5KTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNob3dBY3Rpb25zKGFjdGlvbkFycmF5KTtcbiAgfVxuICBoaWRlQWN0aW9ucyhhY3Rpb25BcnJheSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5oaWRlQWN0aW9ucyhhY3Rpb25BcnJheSk7XG4gIH1cbiAgZW5hYmxlQWN0aW9ucyhhY3Rpb25BcnJheSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5lbmFibGVBY3Rpb25zKGFjdGlvbkFycmF5KTtcbiAgfVxuICBkaXNhYmxlQWN0aW9ucyhhY3Rpb25BcnJheSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5kaXNhYmxlQWN0aW9ucyhhY3Rpb25BcnJheSk7XG4gIH1cbiAgc2hvd0FjdGlvbihjb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2hvd0FjdGlvbnMoY29kZSk7XG4gIH1cbiAgaGlkZUFjdGlvbihjb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uaGlkZUFjdGlvbnMoY29kZSk7XG4gIH1cbiAgZW5hYmxlQWN0aW9uKGNvZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5lbmFibGVBY3Rpb25zKGNvZGUpO1xuICB9XG4gIGRpc2FibGVBY3Rpb24oY29kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmRpc2FibGVBY3Rpb25zKGNvZGUpO1xuICB9XG4gIGdldFNlY3Rpb25zKCk6IFJlY29yZEZvcm1TZWN0aW9uW10gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0U2VjdGlvbnMoKSA/PyBudWxsO1xuICB9XG4gIGFjdGl2YXRlU2VjdGlvbihjb2RlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmFjdGl2YXRlU2VjdGlvbihjb2RlKTtcbiAgfVxuICBnZXRTZWN0aW9uc1RpdGxlcygpOiBzdHJpbmdbXSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRTZWN0aW9ucygpLm1hcChzZWMgPT4gc2VjLnRpdGxlKSA/PyBudWxsO1xuICB9XG4gIGdldFNlY3Rpb24oY29kZTogc3RyaW5nKTogUmVjb3JkRm9ybVNlY3Rpb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0U2VjdGlvbihjb2RlKSA/PyBudWxsO1xuICB9XG4gIHNob3dTZWN0aW9uKGNvZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zaG93U2VjdGlvbnMoY29kZSk7XG4gIH1cbiAgaGlkZVNlY3Rpb24oY29kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmhpZGVTZWN0aW9ucyhjb2RlKTtcbiAgfVxuICBzaG93U2VjdGlvbnMoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNob3dTZWN0aW9ucyhjb2Rlcyk7XG4gIH1cbiAgaGlkZVNlY3Rpb25zKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5oaWRlU2VjdGlvbnMoY29kZXMpO1xuICB9XG4gIGdldFN1YlNlY3Rpb24oY29kZTogc3RyaW5nLCBzdWJDb2RlOiBzdHJpbmcpOiBSZWNvcmRGb3JtU3ViU2VjdGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRTdWJTZWN0aW9uKGNvZGUsIHN1YkNvZGUpID8/IG51bGw7XG4gIH1cbiAgc2hvd1N1YlNlY3Rpb24oY29kZTogc3RyaW5nLCBzdWJDb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2hvd1N1YlNlY3Rpb25zKGNvZGUsIHN1YkNvZGUpO1xuICB9XG4gIGhpZGVTdWJTZWN0aW9uKGNvZGU6IHN0cmluZywgc3ViQ29kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmhpZGVTdWJTZWN0aW9ucyhjb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBzaG93U3ViU2VjdGlvbnMoY29kZTogc3RyaW5nLCBzdWJDb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2hvd1N1YlNlY3Rpb25zKGNvZGUsIHN1YkNvZGVzKTtcbiAgfVxuICBoaWRlU3ViU2VjdGlvbnMoY29kZTogc3RyaW5nLCBzdWJDb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uaGlkZVN1YlNlY3Rpb25zKGNvZGUsIHN1YkNvZGVzKTtcbiAgfVxuICBnZXRTZWN0aW9uQWN0aW9ucyhjb2RlOiBzdHJpbmcpOiBGb3JtQWN0aW9uW10gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0U2VjdGlvbkFjdGlvbnMoY29kZSkgPz8gbnVsbDtcbiAgfVxuICBnZXRTZWN0aW9uQWN0aW9uTmFtZXMoY29kZTogc3RyaW5nKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0U2VjdGlvbkFjdGlvbk5hbWVzKGNvZGUpID8/IG51bGw7XG4gIH1cblxuICBnZXRUYWJsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldFRhYmxlcygpO1xuICB9XG4gIHNob3dUYWJsZXMoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNob3dUYWJsZXMoY29kZXMpO1xuICB9XG4gIGhpZGVUYWJsZXMoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmhpZGVUYWJsZXMoY29kZXMpO1xuICB9XG4gIGNsZWFuVGFibGVzKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5jbGVhblRhYmxlcyhjb2Rlcyk7XG4gIH1cbiAgZ2V0VGFibGUoY29kZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldFRhYmxlKGNvZGUpID8/IG51bGw7XG4gIH1cbiAgc2hvd1RhYmxlKGNvZGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zaG93VGFibGVzKGNvZGUpO1xuICB9XG4gIGhpZGVUYWJsZShjb2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uaGlkZVRhYmxlcyhjb2RlKTtcbiAgfVxuICBjbGVhblRhYmxlKGNvZGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRUYWJsZShjb2RlKT8uY2xlYW4oKTtcbiAgfVxuICBnZXRUYWJsZVJlY29yZChjb2RlOiBzdHJpbmcsIHJlY29yZElkOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0VGFibGVSZWNvcmQoY29kZSwgcmVjb3JkSWQpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGZvcm1NYW5hZ2VyU2VydmljZTogTGliRm9ybU1hbmFnZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBfZXZlbnRNYW5hZ2VyOiBMaWJFdmVudE1hbmFnZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBmaWxlTWdtdFNlcnZpY2VzOiBMaWJGaWxlTWFuYWdlbWVudFNlcnZpY2UpIHtcbiAgICB0aGlzLl9ldmVudEVtaXRlciA9IHRoaXMuX2V2ZW50TWFuYWdlcjtcbiAgICB0aGlzLmNsZWFuU3RhcnQoKTtcbiAgICB0aGlzLmN1c3RvbVByZVByb2Nlc3NpbmcoKTtcbiAgfVxuXG4gIHNldENvbmZpZyhmb3JtQ29uZmlnKSB7XG4gICAgdGhpcy5mb3JtQ29uZmlnID0gZm9ybUNvbmZpZztcbiAgfVxuXG4gIGNsZWFuU3RhcnQoKSB7XG4gICAgdGhpcy5fZXJyb3JUeXBlID0gJyc7XG4gICAgdGhpcy5lcnJvckNvZGUgPSAnJztcbiAgICB0aGlzLmVycm9yRnVsbENvZGUgPSAnJztcbiAgICB0aGlzLmVycm9yTmFtZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgdGhpcy5lcnJvckRldGFpbCA9ICcnO1xuICAgIHRoaXMuX2Zvcm1TdHJ1Y3R1cmUgPSBudWxsO1xuICAgIHRoaXMuZmllbGRzID0gbnVsbDtcbiAgICB0aGlzLmFjdGlvbnMgPSBudWxsO1xuICAgIHRoaXMuc2VjdGlvbnMgPSBudWxsO1xuICAgIHRoaXMuX2NvbnRyb2xUb2tlbiA9IG51bGw7XG4gICAgdGhpcy5pbnB1dERhdGFGaWVsZHMgPSB7fTtcbiAgICB0aGlzLl9kZWZpbml0aW9uT2J0YWluZWQgPSBmYWxzZTtcbiAgICAvLyBTZSBsaW1waWFuIGxvcyBtYW5lamFkb3JlcyBkZSBldmVudG9zXG4gICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5idXN5ID0gZmFsc2U7XG4gICAgdGhpcy5fZm9ybVNlY3Rpb25zQWN0aXZhdGUgPSB7fTtcbiAgICB0aGlzLl9mb3JtU2VjdGlvbnNJbmFjdGl2YXRlID0ge307XG4gICAgdGhpcy5fZm9ybUFjdGlvbnNTdGFydCA9IHt9O1xuICAgIHRoaXMuX2Zvcm1BY3Rpb25zRmluaXNoID0ge307XG4gICAgdGhpcy5fZmllbGRJbnB1dFZhbGlkYXRpb24gPSB7fTtcbiAgICB0aGlzLl9maWVsZFZhbGlkYXRpb25zU3RhcnQgPSB7fTtcbiAgICB0aGlzLl9maWVsZFZhbGlkYXRpb25zRmluaXNoID0ge307XG4gICAgdGhpcy5fdGFibGVTZWxlY3Rpb25zU3RhcnQgPSB7fTtcbiAgICB0aGlzLl90YWJsZVNlbGVjdGlvbnNGaW5pc2ggPSB7fTtcbiAgICB0aGlzLl90YWJsZUFjdGlvbnNTdGFydCA9IHt9O1xuICAgIHRoaXMuX3RhYmxlQWN0aW9uc0ZpbmlzaCA9IHt9O1xuICAgIHRoaXMuX3RhYmxlR2V0RGF0YVN0YXJ0ID0ge307XG4gICAgdGhpcy5fdGFibGVHZXREYXRhRmluaXNoID0ge307XG5cbiAgICB0aGlzLl9hY3Rpb25TZXJ2ZXJFcnJvciA9IFtdO1xuICAgIHRoaXMuX2ZpZWxkU2VydmVyRXJyb3IgPSBbXTtcbiAgICB0aGlzLl90YWJsZVNlcnZlckVycm9yID0gW107XG5cbiAgICB0aGlzLm9uQWN0aW9uU2VydmVyRXJyb3IoKCkgPT4gdGhpcy5kaXNwbGF5QWN0aW9uU2VydmVyRXJyb3IoKSk7XG4gICAgdGhpcy5vblZhbGlkYXRpb25TZXJ2ZXJFcnJvcigoKSA9PiB0aGlzLmRpc3BsYXlWYWxpZGF0aW9uU2VydmVyRXJyb3IoKSk7XG4gICAgdGhpcy5vblRhYmxlU2VydmVyRXJyb3IoKCkgPT4gdGhpcy5kaXNwbGF5VGFibGVTZXJ2ZXJFcnJvcigpKTtcbiAgfVxuXG4gIGdldCBmb3JtVmlzaWJsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMudmlzaWJsZTsgfVxuICBnZXQgZm9ybU1hbmFnZXIoKSB7IHJldHVybiB0aGlzOyB9XG4gIGdldCBmb3JtQ29kZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5uYW1lID8/ICcnOyB9XG4gIHNldCBmb3JtQ29kZShuYW1lOiBzdHJpbmcpIHsgdGhpcy5uYW1lID0gbmFtZTsgfVxuICBnZXQgaW5TZXJ2ZXJQcm9jZXNzKCkgeyByZXR1cm4gdGhpcy5idXN5OyB9XG4gIGdldCBmb3JtKCk6IEZvcm1TdHJ1Y3R1cmVBbmREYXRhIHwgbnVsbCB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlOyB9XG5cbiAgZ2V0IHN0YXRlKCk6IHN0cmluZyB8IG51bGwgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc3RhdGUgPz8gbnVsbDsgfVxuICBnZXQgY3VycmVudFN0YXRlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zdGF0ZSA/PyAnJzsgfVxuICBzZXQgY3VycmVudFN0YXRlKHN0YXRlOiBzdHJpbmcpIHsgdGhpcz8uX2Zvcm1TdHJ1Y3R1cmU/LmNoYW5nZVN0YXRlKHN0YXRlKTsgfVxuICBnZXQgaW1tdXRhYmxlRGF0YSgpOiBhbnkgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uaW1tdXRhYmxlRGF0YSB9XG4gIGdldCBleHRyYUluZm8oKTogYW55IHsgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmV4dHJhSW5mbyB9XG4gIGdldCB2aXNpYmxlU2VjdGlvbnMoKTogUmVjb3JkRm9ybVNlY3Rpb25bXSB8IG51bGwgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8udmlzaWJsZVNlY3Rpb25zID8/IG51bGw7IH1cblxuICBnZXQgZm9ybVJvdXRlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9mb3JtUm91dGUgPz8gJyc7IH1cbiAgc2V0IGZvcm1Sb3V0ZShyb3V0ZTogc3RyaW5nKSB7IHRoaXMuX2Zvcm1Sb3V0ZSA9IHJvdXRlOyB9XG5cbiAgZ2V0IHN1YmplY3QoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZm9ybVN1YmplY3QgPz8gJyc7IH1cblxuICAvLyBNw6l0b2RvcyB2aXJ0dWFsZXNcbiAgY3VzdG9tUHJlUHJvY2Vzc2luZygpIHsgfVxuICBjdXN0b21Gb3JtU3RhcnQoKSB7IH1cbiAgZGlzcGxheUFjdGlvblNlcnZlckVycm9yKCkgeyB9XG4gIGRpc3BsYXlWYWxpZGF0aW9uU2VydmVyRXJyb3IoKSB7IH1cbiAgZGlzcGxheVRhYmxlU2VydmVyRXJyb3IoKSB7IH1cbiAgc2hvd0ZpZWxkSW5mbyhmaWVsZENvZGU/OiBzdHJpbmcsIGRldGFpbD86IGFueSkgeyB9XG4gIHNob3dNb2RhbERpYWxvZyh0aXRsZSwgYm9keSwgb3B0aW9ucywgY2FsbGJhY2s/LCBwYXJhbXM/KSB7IH1cbiAgb3BlblVwbG9hZERpYWxvZyh0aXRsZSwgYm9keSwgb3B0aW9ucywgY2FsbGJhY2s/LCBwYXJhbXM/KSB7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHN1cHBvcnRTdGF0ZVxuICAgKi9cbiAgc3VwcG9ydE1vZGUoc3RhdGU6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5zdXBwb3J0U3RhdGUoc3RhdGUpOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBnZXRGaWVsZFxuICAgKi9cbiAgZ2V0RmllbGRPYmplY3QoY29kZTogc3RyaW5nKTogRmllbGREZXNjcmlwdG9yIHwgbnVsbCB7IHJldHVybiB0aGlzLmdldEZpZWxkKGNvZGUpOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBnZXRBY3Rpb25cbiAgICovXG4gIGdldEFjdGlvbk9iamVjdChjb2RlOiBzdHJpbmcpOiBGb3JtQWN0aW9uIHwgbnVsbCB7IHJldHVybiB0aGlzLmdldEFjdGlvbihjb2RlKTsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VGFibGVcbiAgICovXG4gIGdldFRhYmxlT2JqZWN0KGNvZGU6IHN0cmluZyk6IFJlY29yZFRhYmxlIHwgbnVsbCB7IHJldHVybiB0aGlzLmdldFRhYmxlKGNvZGUpOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBnZXRTZWN0aW9uXG4gICAqL1xuICBnZXRTZWN0aW9uT2JqZWN0KGNvZGU6IHN0cmluZyk6IFJlY29yZEZvcm1TZWN0aW9uIHwgbnVsbCB7IHJldHVybiB0aGlzLmdldFNlY3Rpb24oY29kZSk7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGNoYW5nZVN0YXRlXG4gICAqL1xuICBjaGFuZ2VGb3JtTW9kZShzdGF0ZTogc3RyaW5nKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmNoYW5nZVN0YXRlKHN0YXRlKTsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Ugc3ViamVjdFxuICAgKi9cbiAgZ2V0Rm9ybVN1YmplY3QoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuc3ViamVjdDsgfVxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHN1YmplY3RcbiAgICovXG4gIGdldFN1YmplY3QoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZm9ybVN1YmplY3QgPz8gJyc7IH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBzdWJqZWN0XG4gICAqL1xuICBnZXRmb3JtU3ViamVjdCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5mb3JtU3ViamVjdCA/PyAnJzsgfVxuXG5cbiAgbnVtU2VjdGlvbnMoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNlY3Rpb25zLmxlbmd0aDsgfVxuXG4gIHN1YnNjcmliZUFwcEV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjayk6IHZvaWQge1xuICAgIHRoaXMuX2V2ZW50RW1pdGVyLnN1YnNjcmliZShldmVudE5hbWUsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIG9wZW5Gb3JtKG5hbWU6IHN0cmluZywgZGF0YTogYW55ID0gbnVsbCwgYmFja0RhdGE6IGFueSA9IG51bGwsIGNsZWFuU3RhY2sgPSBmYWxzZSk6IHZvaWQge1xuICAgIGxldCBvcmlnaW46IGFueSA9IG51bGw7XG4gICAgaWYgKCFjbGVhblN0YWNrKSB7XG4gICAgICBvcmlnaW4gPSB7IC4uLmJhY2tEYXRhLCBuYW1lOiB0aGlzLm5hbWUsIHVybDogdGhpcy5fZm9ybVJvdXRlLCB0b2tlbjogdGhpcy5fY29udHJvbFRva2VuIH07XG4gICAgICBvcmlnaW4uc3ViamVjdCA9IG9yaWdpbj8uc3ViamVjdCA/PyB0aGlzLmZvcm1TdWJqZWN0O1xuICAgICAgb3JpZ2luLnN0YXRlID0gb3JpZ2luPy5zdGF0ZSA/PyB0aGlzLnN0YXRlO1xuICAgICAgb3JpZ2luLmZpZWxkcyA9IG9yaWdpbj8uZmllbGRzID8/IHt9O1xuICAgICAgb3JpZ2luLmV4dHJhID0gb3JpZ2luPy5leHRyYSA/PyB7fTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0geyAuLi5kYXRhLCBuYW1lIH07XG4gICAgdGFyZ2V0LnN1YmplY3QgPSB0YXJnZXQ/LnN1YmplY3QgPz8gbnVsbDtcbiAgICB0YXJnZXQuc3RhdGUgPSB0YXJnZXQ/LnN0YXRlID8/IG51bGw7XG4gICAgdGFyZ2V0LmZpZWxkcyA9IHRhcmdldD8uZmllbGRzID8/IHt9O1xuICAgIHRhcmdldC5leHRyYSA9IHRhcmdldD8uZXh0cmEgPz8ge307XG4gICAgdGhpcy5mb3JtTWFuYWdlclNlcnZpY2Uub3BlbkZvcm0ob3JpZ2luLCB0YXJnZXQpO1xuICB9XG5cbiAgY2FuR29CYWNrKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fb3JpZ2luVG9rZW4gIT09IG51bGwgfVxuICBnb0JhY2soKTogdm9pZCB7IHJldHVybiB0aGlzLmZvcm1NYW5hZ2VyU2VydmljZS5iYWNrVG8oKTsgfVxuICBnb0JhY2tGb3JtKCk6IHZvaWQgeyByZXR1cm4gdGhpcy5nb0JhY2soKTsgfVxuICBnZXRPcmlnaW5EZXRhaWwoKTogYW55IHsgcmV0dXJuIHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlPy5nZXRGb3JtSW5mbyh0aGlzLl9vcmlnaW5Ub2tlbiA/PyAnJyk7IH1cblxuICBzZXRFcnJvcihlcnJvclR5cGU6IHN0cmluZyB8IG51bGwsIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgbnVsbCwgZXJyb3JEZXRhaWw6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9lcnJvclR5cGUgPSBlcnJvclR5cGUgfHwgJyc7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UgfHwgJyc7XG4gICAgdGhpcy5lcnJvckRldGFpbCA9IGVycm9yRGV0YWlsIHx8ICcnO1xuICB9XG5cbiAgcmVzZXRFcnJvcigpOiB2b2lkIHsgdGhpcy5zZXRFcnJvcihudWxsLCBudWxsLCBudWxsKTsgfVxuICBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2Vycm9yVHlwZTsgfVxuICBnZXRFcnJvck1lc3NhZ2UoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZXJyb3JNZXNzYWdlOyB9XG4gIGdldEVycm9yRGV0YWlsKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmVycm9yRGV0YWlsOyB9XG4gIGdldEVycm9yTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5lcnJvck5hbWU7IH1cbiAgZ2V0RXJyb3JGdWxsQ29kZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5lcnJvckZ1bGxDb2RlOyB9XG4gIGdldEVycm9yQ29kZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fZXJyb3JUeXBlOyB9XG5cbiAgZ2V0Rm9ybVBhcmFtZXRlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAobmFtZSkgPyAodGhpcy5leHRyYURhdGE/LltuYW1lXSA/PyBudWxsKSA6IG51bGw7XG4gIH1cblxuICBwcmVvY2Vzc0lucHV0UGFyYW1zKHBhcmFtczogYW55KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdGhpcy5fY29udHJvbFRva2VuID0gcGFyYW1zPy5bVE9LRU5dID8/IG51bGw7XG4gICAgdGhpcy5mb3JtU3ViamVjdCA9IHBhcmFtcz8uW1NVQkpFQ1RdID8/IG51bGw7XG4gICAgY29uc3QgdG9rZW5JbmZvOiBhbnkgPSAodGhpcy5fY29udHJvbFRva2VuKSA/IHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlLmdldEZvcm1JbmZvKHRoaXMuX2NvbnRyb2xUb2tlbikgOiB7fTtcbiAgICBjb25zdCB7IHRva2VuLCBzdWJqZWN0LCBzdGF0ZSwgZmllbGRzLCBleHRyYSwgb3JpZ2luVG9rZW4gfSA9IHRva2VuSW5mbztcbiAgICBpZiAodG9rZW4gJiYgdGhpcy5fY29udHJvbFRva2VuID09PSB0b2tlbikge1xuICAgICAgdGhpcy5mb3JtU3ViamVjdCA9IHRoaXMuZm9ybVN1YmplY3QgPz8gc3ViamVjdCA/PyBudWxsO1xuICAgICAgdGhpcy5pbnB1dERhdGFGaWVsZHMgPSBmaWVsZHM7XG4gICAgICB0aGlzLmV4dHJhRGF0YSA9IGV4dHJhO1xuICAgICAgdGhpcy5fb3JpZ2luVG9rZW4gPSBvcmlnaW5Ub2tlbjtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdWJzY3JpYmVTZWN0aW9uQWN0aXZhdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtU2VjdGlvbnMgPSB0aGlzLl9mb3JtU3RydWN0dXJlPy5zZWN0aW9ucztcbiAgICBjb25zdCBzZWN0aW9uTmFtZXMgPSBPYmplY3Qua2V5cyhmb3JtU2VjdGlvbnMpO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzZWN0aW9uTmFtZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBzZWN0aW9uTmFtZSA9IHNlY3Rpb25OYW1lc1tpbmRleF07XG4gICAgICBjb25zdCBzZWN0aW9uID0gZm9ybVNlY3Rpb25zW3NlY3Rpb25OYW1lXTtcbiAgICAgIHNlY3Rpb24uYWN0aXZhdGlvbi5zdWJzY3JpYmUoKGNvZGU6IHN0cmluZykgPT4gdGhpcy5sYXVuY2hTZWN0aW9uQWN0aXZhdGlvbihjb2RlKSk7XG4gICAgICBzZWN0aW9uLmluYWN0aXZhdGlvbi5zdWJzY3JpYmUoKGNvZGU6IHN0cmluZykgPT4gdGhpcy5sYXVuY2hTZWN0aW9uSW5hY3RpdmF0aW9uKGNvZGUpKTtcbiAgICB9XG4gIH1cblxuICBzdWJzY3JpYmVGaWVsZHNTdWJqZWN0cygpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtRmllbGRzID0gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0RmllbGRzKCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybUZpZWxkcykpIHtcbiAgICAgIGZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgIGZpZWxkLmVkaXRpb25GaW5pc2guc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCB7IGNvZGUsIGludHJpbnNpY1ZhbGlkYXRpb24gfSA9IGV2ZW50O1xuICAgICAgICAgIHRoaXMuc3RhcnRGaWVsZFZhbGlkYXRpb24oY29kZSwgaW50cmluc2ljVmFsaWRhdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgICBmaWVsZC5lZGl0aW9uUGFydGlhbC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgY29kZSwgaW50cmluc2ljVmFsaWRhdGlvbiB9ID0gZXZlbnQ7XG4gICAgICAgICAgdGhpcy5zdGFydEZpZWxkSW5wdXRWYWxpZGF0aW9uKGNvZGUsIGludHJpbnNpY1ZhbGlkYXRpb24pO1xuICAgICAgICB9KTtcbiAgICAgICAgZmllbGQuZGV0YWlsUmVxdWVzdC5zdWJzY3JpYmUoZXZlbnQgPT4gdGhpcy5zaG93RmllbGRJbmZvKGV2ZW50LmNvZGUsIGV2ZW50LmRldGFpbCkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc3Vic2NyaWJlQWN0aW9uU3ViamVjdHMoKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybUFjdGlvbnMgPSB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRBY3Rpb25zKCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybUFjdGlvbnMpKSB7XG4gICAgICBmb3JtQWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgIGFjdGlvbi5hY3Rpb25BY3RpdmF0ZWQuc3Vic2NyaWJlKGNvZGUgPT4gdGhpcy5zdGFydEFjdGlvbihjb2RlKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzdWJzY3JpYmVUYWJsZVN1YmplY3RzKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1UYWJsZXMgPSB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRUYWJsZXMoKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JtVGFibGVzKSkge1xuICAgICAgZm9ybVRhYmxlcy5mb3JFYWNoKHRhYmxlID0+IHtcbiAgICAgICAgdGFibGUuaW5saW5lQWN0aW9uVHJpZ2dlci5zdWJzY3JpYmUoZXZlbnQgPT4gdGhpcy5zdGFydFRhYmxlQWN0aW9uKGV2ZW50KSk7XG4gICAgICAgIHRhYmxlLmdsb2JhbEFjdGlvblRyaWdnZXIuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMuc3RhcnRUYWJsZUdsb2JhbEFjdGlvbihldmVudCkpO1xuICAgICAgICB0YWJsZS5yZWNvcmRTZWxlY3Rpb25UcmlnZ2VyLnN1YnNjcmliZShldmVudCA9PiB0aGlzLnN0YXJ0VGFibGVSZWNvcmRTZWxlY3Rpb24oZXZlbnQpKTtcbiAgICAgICAgdGFibGUuc2VsZWN0aW9uQWN0aW9uVHJpZ2dlci5zdWJzY3JpYmUoZXZlbnQgPT4gdGhpcy5zdGFydFRhYmxlU2VsZWN0aW9uQWN0aW9uKGV2ZW50KSk7XG4gICAgICAgIHRhYmxlLmdldERhdGFUcmlnZ2VyLnN1YnNjcmliZShldmVudCA9PiB0aGlzLnN0YXJ0VGFibGVHZXREYXRhKGV2ZW50KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmb3JtSW5pdChwYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgaW5pdGlhbFN0YXRlOiBzdHJpbmcgfCBudWxsID0gdGhpcy5wcmVvY2Vzc0lucHV0UGFyYW1zKHBhcmFtcyk7XG4gICAgaWYgKCF0aGlzLm5hbWUpIHsgcmV0dXJuOyB9XG4gICAgaWYgKCF0aGlzLl9kZWZpbml0aW9uT2J0YWluZWQpIHtcbiAgICAgIHRoaXMuYnVzeSA9IHRydWU7XG4gICAgICBjb25zdCBmb3JtRGVmaW5pdGlvbiA9IGF3YWl0IHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlLmdldEZvcm1EZWZpbml0aW9uKHRoaXMubmFtZSk7XG4gICAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2Zvcm1TdHJ1Y3R1cmUgPSBuZXcgRm9ybVN0cnVjdHVyZUFuZERhdGEoZm9ybURlZmluaXRpb24sIHRoaXMuZm9ybUNvbmZpZyk7XG4gICAgICB0aGlzLmZpZWxkcyA9IHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmZpZWxkcztcbiAgICAgIHRoaXMuYWN0aW9ucyA9IHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmFjdGlvbnM7XG4gICAgICB0aGlzLnNlY3Rpb25zID0gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2VjdGlvbnM7XG4gICAgICB0aGlzLl9kZWZpbml0aW9uT2J0YWluZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsZWFuRGF0YSgpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc3VwcG9ydFN0YXRlKGluaXRpYWxTdGF0ZSkpIHtcbiAgICAgIGluaXRpYWxTdGF0ZSA9IHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmRlZmF1bHRTdGF0ZSA/PyBudWxsO1xuICAgIH1cbiAgICB0aGlzLl9mb3JtU3RydWN0dXJlPy5jaGFuZ2VTdGF0ZShpbml0aWFsU3RhdGUgfHwgdGhpcy5fZm9ybVN0cnVjdHVyZT8uZGVmYXVsdFN0YXRlKTtcbiAgICBjb25zdCBpbnB1dEZpZWxkTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmlucHV0RGF0YUZpZWxkcyk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGlucHV0RmllbGROYW1lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGZpZWxkQ29kZSA9IGlucHV0RmllbGROYW1lc1tpbmRleF07XG4gICAgICBjb25zdCBmaWVsZFZhbHVlID0gdGhpcy5pbnB1dERhdGFGaWVsZHNbZmllbGRDb2RlXTtcbiAgICAgIHRoaXMuc2V0RmllbGRWYWx1ZShmaWVsZENvZGUsIGZpZWxkVmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCByZWNvcmRSZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdEZvcm1BY3Rpb24oZm9ybUFjdGlvbnMuZ2V0RGF0YSk7XG4gICAgdGhpcy5jaGVja0Vycm9yUmVjb3JkUmVjZWl2ZWQocmVjb3JkUmVzcG9uc2UpO1xuICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy5lbmFibGVkU2VjdGlvbnMgPSB0aGlzLl9mb3JtU3RydWN0dXJlPy52aXNpYmxlU2VjdGlvbnMgPz8gW107XG4gICAgdGhpcy5zdWJzY3JpYmVTZWN0aW9uQWN0aXZhdGlvbigpO1xuICAgIHRoaXMuc3Vic2NyaWJlRmllbGRzU3ViamVjdHMoKTtcbiAgICB0aGlzLnN1YnNjcmliZUFjdGlvblN1YmplY3RzKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVUYWJsZVN1YmplY3RzKCk7XG4gICAgdGhpcy5jdXN0b21Gb3JtU3RhcnQoKTtcbiAgfVxuXG4gIGNoZWNrRXJyb3JSZWNvcmRSZWNlaXZlZChyZWNvcmRSZXNwb25zZTogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBlcnJvciB9ID0gcmVjb3JkUmVzcG9uc2U7XG4gICAgaWYgKCFlcnJvcikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB0aGlzLmVycm9yQ29kZSA9IHJlY29yZFJlc3BvbnNlLmVycm9yQ29kZTtcbiAgICB0aGlzLmVycm9yRnVsbENvZGUgPSByZWNvcmRSZXNwb25zZS5lcnJvckZ1bGxDb2RlO1xuICAgIHRoaXMuZXJyb3JOYW1lID0gcmVjb3JkUmVzcG9uc2UuZXJyb3JOYW1lO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gcmVjb3JkUmVzcG9uc2UuZXJyb3JNZXNzYWdlO1xuICAgIHRoaXMuZXJyb3JEZXRhaWwgPSByZWNvcmRSZXNwb25zZS5lcnJvckRldGFpbDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGVycm9yT2NjdXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuZXJyb3JDb2RlICE9PSBOT19FUlJPUik7XG4gIH1cblxuICAvKipcbiAgICogU29wb3J0ZSBtYW5lam8gZGUgZXZlbnRvcyBkZSBmb3JtdWxhcmlvXG4gICAqL1xuXG4gIGFzeW5jIHJlcXVlc3RGb3JtQWN0aW9uKGFjdGlvbkNvZGU6IHN0cmluZywgYWN0aW9uU3ViamVjdDogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGFjdGlvbkRldGFpbCA9IHtcbiAgICAgIGZvcm1Db2RlOiB0aGlzLm5hbWUsXG4gICAgICBmb3JtU3ViamVjdDogdGhpcy5mb3JtU3ViamVjdCxcbiAgICAgIGN1cnJlbnRNb2RlOiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zdGF0ZSxcbiAgICAgIGFjdGlvbkNvZGUsXG4gICAgICBhY3Rpb25TdWJqZWN0LFxuICAgICAgdmVyc2lvbjogUEFZTE9BRF9WRVJTSU9OLFxuICAgICAgZm9ybURhdGE6IHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldFBheWxvYWQoKSxcbiAgICAgIGltbXV0YWJsZURhdGE6IHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmltbXV0YWJsZURhdGEsXG4gICAgfTtcbiAgICB0aGlzLmVycm9yQ29kZSA9IE5PX0VSUk9SO1xuICAgIHRoaXMuZXJyb3JGdWxsQ29kZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JOYW1lID0gJyc7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICB0aGlzLmVycm9yRGV0YWlsID0gJyc7XG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICBjb25zdCBmb3JtQWN0aW9uUmVzcG9uc2U6IGFueSA9IGF3YWl0IHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlLmV4ZWNTZXJ2ZXJBY3Rpb24oYWN0aW9uRGV0YWlsKTtcbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgICBpZiAoZm9ybUFjdGlvblJlc3BvbnNlICYmIGZvcm1BY3Rpb25SZXNwb25zZS5lcnJvci5lcnJvclR5cGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdFeGNlcGNpw7NuIG5vIHNvcG9ydGFkYScpO1xuICAgIH1cbiAgICBpZiAoZm9ybUFjdGlvblJlc3BvbnNlLmhhc0Vycm9yKCkpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gZm9ybUFjdGlvblJlc3BvbnNlLmVycm9yO1xuICAgICAgdGhpcy5lcnJvckNvZGUgPSBlcnJvci5lcnJvckNvZGU7XG4gICAgICB0aGlzLmVycm9yRnVsbENvZGUgPSBlcnJvci5lcnJvckZ1bGxDb2RlO1xuICAgICAgdGhpcy5lcnJvck5hbWUgPSBlcnJvci5lcnJvck5hbWU7XG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9yLmVycm9yTWVzc2FnZTtcbiAgICAgIHRoaXMuZXJyb3JEZXRhaWwgPSBlcnJvci5lcnJvckRldGFpbDtcbiAgICB9XG4gICAgY29uc3QgZm9ybVJlc3BvbnNlRGF0YSA9IGZvcm1BY3Rpb25SZXNwb25zZS5nZXREYXRhKCk7XG4gICAgdGhpcy51cGRhdGVGb3JtV2l0aFNlcnZlckRhdGEoZm9ybVJlc3BvbnNlRGF0YSk7XG4gICAgcmV0dXJuIGZvcm1SZXNwb25zZURhdGE7XG4gIH1cblxuICB1cGRhdGVGb3JtV2l0aFNlcnZlckRhdGEoZm9ybUNvbnRlbnQ6IGFueSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGN1cnJlbnRNb2RlLCBmb3JtU3ViamVjdCwgYWN0aW9ucywgZmllbGRzLCByZWNvcmRUYWJsZXMsXG4gICAgICByZXR1cm5lZEZpbGUsIGltbXV0YWJsZURhdGEsIGV4dHJhSW5mbyxcbiAgICB9ID0gZm9ybUNvbnRlbnQ7XG4gICAgY3VycmVudE1vZGUgJiYgdGhpcy5jaGFuZ2VTdGF0ZShjdXJyZW50TW9kZSk7XG4gICAgaWYgKGZvcm1TdWJqZWN0KSB7IHRoaXMuZm9ybVN1YmplY3QgPSBmb3JtU3ViamVjdDsgfVxuICAgIGlmIChhY3Rpb25zICYmIGFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBjaGFuZ2VkQWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYWN0aW9uT2JqZWN0ID0gdGhpcy5nZXRBY3Rpb24oY2hhbmdlZEFjdGlvbi5hY3Rpb25Db2RlKTtcbiAgICAgICAgaWYgKGFjdGlvbk9iamVjdCkgeyBhY3Rpb25PYmplY3QudXBkYXRlRnJvbVNlcnZlcihjaGFuZ2VkQWN0aW9uKTsgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmllbGRzICYmIGZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZWRGaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgICAgY29uc3QgZmllbGRPYmplY3QgPSB0aGlzLmdldEZpZWxkKGNoYW5nZWRGaWVsZC5maWVsZENvZGUpO1xuICAgICAgICBpZiAoZmllbGRPYmplY3QpIHtcbiAgICAgICAgICBmaWVsZE9iamVjdC51cGRhdGVGcm9tU2VydmVyKGNoYW5nZWRGaWVsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlY29yZFRhYmxlcyAmJiByZWNvcmRUYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBjaGFuZ2VkVGFibGUgb2YgcmVjb3JkVGFibGVzKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZShjaGFuZ2VkVGFibGUudGFibGVDb2RlKTtcbiAgICAgICAgaWYgKHRhYmxlT2JqZWN0KSB7XG4gICAgICAgICAgdGFibGVPYmplY3QudXBkYXRlRnJvbVNlcnZlcihjaGFuZ2VkVGFibGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXR1cm5lZEZpbGUgJiYgcmV0dXJuZWRGaWxlLmZpbGUpIHtcbiAgICAgIHRoaXMuZmlsZU1nbXRTZXJ2aWNlcy5zYXZlRmlsZShyZXR1cm5lZEZpbGUuZmlsZSwgcmV0dXJuZWRGaWxlLm5hbWUsIHJldHVybmVkRmlsZS50eXBlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2Zvcm1TdHJ1Y3R1cmUpIHtcbiAgICAgIHRoaXMuX2Zvcm1TdHJ1Y3R1cmUuaW1tdXRhYmxlRGF0YSA9IGltbXV0YWJsZURhdGE7XG4gICAgICB0aGlzLl9mb3JtU3RydWN0dXJlLmV4dHJhSW5mbyA9IGV4dHJhSW5mbztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFuZWpvIGRlIGV2ZW50IGhhbmRsZXJzIHBhcmEgZXJyb3JlcyBTZXJ2ZXIgZGVsIGZvcm11bGFyaW9cbiAgICovXG5cbiAgY2xlYW5BY3Rpb25TZXJ2ZXJFcnJvcigpIHtcbiAgICB0aGlzLl9hY3Rpb25TZXJ2ZXJFcnJvciA9IFtdO1xuICB9XG5cbiAgY2xlYW5GaWVsZFNlcnZlckVycm9yKCkge1xuICAgIHRoaXMuX2ZpZWxkU2VydmVyRXJyb3IgPSBbXTtcbiAgfVxuXG4gIGNsZWFuVGFibGVTZXJ2ZXJFcnJvcigpIHtcbiAgICB0aGlzLl90YWJsZVNlcnZlckVycm9yID0gW107XG4gIH1cblxuICBvbkFjdGlvblNlcnZlckVycm9yKGNhbGxiYWNrLCBwcm9wZXJ0aWVzID0gbnVsbCkge1xuICAgIHRoaXMuX2FjdGlvblNlcnZlckVycm9yLnB1c2goeyBjYWxsYmFjaywgcHJvcGVydGllcyB9KTtcbiAgfVxuXG4gIG9uVmFsaWRhdGlvblNlcnZlckVycm9yKGNhbGxiYWNrLCBwcm9wZXJ0aWVzID0gbnVsbCkge1xuICAgIHRoaXMuX2ZpZWxkU2VydmVyRXJyb3IucHVzaCh7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgb25UYWJsZVNlcnZlckVycm9yKGNhbGxiYWNrLCBwcm9wZXJ0aWVzID0gbnVsbCkge1xuICAgIHRoaXMuX3RhYmxlU2VydmVyRXJyb3IucHVzaCh7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmVqbyBkZSBldmVudCBoYW5kbGVycyBwYXJhIGFjY2lvbmVzIHNvYnJlIGVsIGZvcm11bGFyaW9cbiAgICovXG5cbiAgb25TZWN0aW9uQWN0aXZhdGlvbihjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICBjb25zdCBzZWN0aW9uU2V0ID0gKEFycmF5LmlzQXJyYXkoY29kZXMpKSA/IGNvZGVzIDogKGNvZGVzID8gW2NvZGVzXSA6IFtdKTtcbiAgICBzZWN0aW9uU2V0LmZvckVhY2goKHNlY3Rpb25OYW1lKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2Zvcm1TZWN0aW9uc0FjdGl2YXRlW3NlY3Rpb25OYW1lXSkge1xuICAgICAgICB0aGlzLl9mb3JtU2VjdGlvbnNBY3RpdmF0ZVtzZWN0aW9uTmFtZV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2Zvcm1TZWN0aW9uc0FjdGl2YXRlW3NlY3Rpb25OYW1lXS5wdXNoKHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSk7XG4gICAgfSk7XG4gIH1cblxuICBvblNlY3Rpb25JbmFjdGl2YXRpb24oY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgY2FsbGJhY2ssIHByb3BlcnRpZXMgPSBudWxsKSB7XG4gICAgY29uc3Qgc2VjdGlvblNldCA9IChBcnJheS5pc0FycmF5KGNvZGVzKSkgPyBjb2RlcyA6IChjb2RlcyA/IFtjb2Rlc10gOiBbXSk7XG4gICAgc2VjdGlvblNldC5mb3JFYWNoKChzZWN0aW9uTmFtZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9mb3JtU2VjdGlvbnNJbmFjdGl2YXRlW3NlY3Rpb25OYW1lXSkge1xuICAgICAgICB0aGlzLl9mb3JtU2VjdGlvbnNJbmFjdGl2YXRlW3NlY3Rpb25OYW1lXSA9IFtdO1xuICAgICAgfVxuICAgICAgdGhpcy5fZm9ybVNlY3Rpb25zSW5hY3RpdmF0ZVtzZWN0aW9uTmFtZV0ucHVzaCh7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgb25BY3Rpb25TdGFydChjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICBjb25zdCBhY3Rpb25TZXQgPSAoQXJyYXkuaXNBcnJheShjb2RlcykpID8gY29kZXMgOiAoY29kZXMgPyBbY29kZXNdIDogW10pO1xuICAgIGFjdGlvblNldC5mb3JFYWNoKChhY3Rpb25OYW1lKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2Zvcm1BY3Rpb25zU3RhcnRbYWN0aW9uTmFtZV0pIHtcbiAgICAgICAgdGhpcy5fZm9ybUFjdGlvbnNTdGFydFthY3Rpb25OYW1lXSA9IFtdO1xuICAgICAgfVxuICAgICAgdGhpcy5fZm9ybUFjdGlvbnNTdGFydFthY3Rpb25OYW1lXS5wdXNoKHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSk7XG4gICAgfSk7XG4gIH1cblxuICBvbkFjdGlvbkZpbmlzaChjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICBjb25zdCBhY3Rpb25TZXQgPSAoQXJyYXkuaXNBcnJheShjb2RlcykpID8gY29kZXMgOiAoY29kZXMgPyBbY29kZXNdIDogW10pO1xuICAgIGFjdGlvblNldC5mb3JFYWNoKChhY3Rpb25OYW1lKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2Zvcm1BY3Rpb25zRmluaXNoW2FjdGlvbk5hbWVdKSB7XG4gICAgICAgIHRoaXMuX2Zvcm1BY3Rpb25zRmluaXNoW2FjdGlvbk5hbWVdID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLl9mb3JtQWN0aW9uc0ZpbmlzaFthY3Rpb25OYW1lXS5wdXNoKHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBsYXVuY2hTZWN0aW9uQWN0aXZhdGlvbihjb2RlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzZWN0aW9uT2JqZWN0ID0gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0U2VjdGlvbihjb2RlKTtcbiAgICBpZiAoIXNlY3Rpb25PYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgY2xpZW50U2VjdGlvbk1ldGhvZHMgPSB0aGlzLl9mb3JtU2VjdGlvbnNBY3RpdmF0ZVtjb2RlXTtcbiAgICBpZiAoY2xpZW50U2VjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGZvciAoY29uc3QgY2xpZW50U2VjdGlvbk1ldGhvZCBvZiBjbGllbnRTZWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSBjbGllbnRTZWN0aW9uTWV0aG9kO1xuICAgICAgICBjYWxsYmFjayhzZWN0aW9uT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBsYXVuY2hTZWN0aW9uSW5hY3RpdmF0aW9uKGNvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IHNlY3Rpb25PYmplY3QgPSB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRTZWN0aW9uKGNvZGUpO1xuICAgIGlmICghc2VjdGlvbk9iamVjdCkgeyByZXR1cm47IH1cbiAgICBjb25zdCBjbGllbnRTZWN0aW9uTWV0aG9kcyA9IHRoaXMuX2Zvcm1TZWN0aW9uc0luYWN0aXZhdGVbY29kZV07XG4gICAgaWYgKGNsaWVudFNlY3Rpb25NZXRob2RzKSB7XG4gICAgICBmb3IgKGNvbnN0IGNsaWVudFNlY3Rpb25NZXRob2Qgb2YgY2xpZW50U2VjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gY2xpZW50U2VjdGlvbk1ldGhvZDtcbiAgICAgICAgY2FsbGJhY2soc2VjdGlvbk9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRBY3Rpb24oY29kZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYWN0aW9uT2JqZWN0ID0gdGhpcy5nZXRBY3Rpb24oY29kZSk7XG4gICAgaWYgKCFhY3Rpb25PYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG4gICAgYWN0aW9uT2JqZWN0LnN0YXJ0KCk7XG4gICAgY29uc3QgY2xpZW50QWN0aW9uTWV0aG9kcyA9IHRoaXMuX2Zvcm1BY3Rpb25zU3RhcnRbY29kZV07XG4gICAgaWYgKGNsaWVudEFjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBjbGllbnRBY3Rpb25NZXRob2Qgb2YgY2xpZW50QWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSBjbGllbnRBY3Rpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNvbnRpbnVlQWN0aW9uUHJvbWlzZSA9IGNhbGxiYWNrKGFjdGlvbk9iamVjdCk7XG4gICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY29udGludWVBY3Rpb25Qcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgICBjb25zdCBjb250aW51ZUFjdGlvbiA9IGNsaWVudEFjdGlvblJlc3VsdHMucmVkdWNlKCh0b3RhbCwgY3VycikgPT4gKHRvdGFsICYmIChjdXJyICE9PSBmYWxzZSkpLCB0cnVlKTtcbiAgICAgIGlmICghY29udGludWVBY3Rpb24pIHtcbiAgICAgICAgYWN0aW9uT2JqZWN0LnN0b3AoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXJ0U2VydmVyQWN0aW9uKGFjdGlvbk9iamVjdCk7XG4gIH1cblxuICBhc3luYyBzdGFydFNlcnZlckFjdGlvbihhY3Rpb25JbnB1dCkge1xuICAgIGNvbnN0IGFjdGlvbiA9ICh0eXBlb2YgYWN0aW9uSW5wdXQgPT09ICdzdHJpbmcnKVxuICAgICAgPyB0aGlzLmdldEFjdGlvbihhY3Rpb25JbnB1dCkgOiBhY3Rpb25JbnB1dDtcbiAgICBsZXQgc2VydmVyRXJyb3IgPSBmYWxzZTtcbiAgICBsZXQgYWN0aW9uUmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoYWN0aW9uLmJhY2tlbmQpIHtcbiAgICAgIGFjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdEZvcm1BY3Rpb24oYWN0aW9uLmFjdGlvbkNvZGUpO1xuICAgICAgc2VydmVyRXJyb3IgPSAhIXRoaXMuZXJyb3JPY2N1cmVkKCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZmluaXNoQWN0aW9uKGFjdGlvbiwgYWN0aW9uUmVzdWx0LCBzZXJ2ZXJFcnJvcik7XG4gICAgaWYgKCFzZXJ2ZXJFcnJvcikge1xuICAgICAgYWN0aW9uLm5ld1N0YXRlICYmIHRoaXMuY2hhbmdlU3RhdGUoYWN0aW9uLm5ld1N0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX2FjdGlvblNlcnZlckVycm9yLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB0aGlzLl9hY3Rpb25TZXJ2ZXJFcnJvcltpbmRleF07XG4gICAgICAgIGNhbGxiYWNrKGFjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIGFjdGlvbi5zdG9wKCk7XG4gIH1cblxuICBhc3luYyBmaW5pc2hBY3Rpb24oYWN0aW9uLCBhY3Rpb25SZXN1bHQsIHNlcnZlckVycm9yID0gZmFsc2UpIHtcbiAgICBjb25zdCBmaW5pc2hBY3Rpb25NZXRob2RzID0gdGhpcy5fZm9ybUFjdGlvbnNGaW5pc2hbYWN0aW9uLmFjdGlvbkNvZGVdO1xuICAgIGlmIChmaW5pc2hBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgY2xpZW50QWN0aW9uTWV0aG9kIG9mIGZpbmlzaEFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gY2xpZW50QWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjb250aW51ZU9uRXJyb3IgPSBwcm9wZXJ0aWVzPy5jb250aW51ZU9uRXJyb3IgPz8gZmFsc2U7XG4gICAgICAgIGlmICghc2VydmVyRXJyb3IgfHwgY29udGludWVPbkVycm9yKSB7XG4gICAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjYWxsYmFjayhhY3Rpb24sIGFjdGlvblJlc3VsdCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgY29tcGxldGVHbG9iYWxBY3Rpb24oYWN0aW9uOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydFNlcnZlckFjdGlvbihhY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmVqYWRvcmVzIGRlIGV2ZW50b3MgcGFyYSB2YWxpZGFjaW9uZXMgc29icmUgY2FtcG9zXG4gICAqL1xuXG4gIG9uRmllbGRJbnB1dChjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICBjb25zdCBmaWVsZFNldCA9IChBcnJheS5pc0FycmF5KGNvZGVzKSkgPyBjb2RlcyA6IChjb2RlcyA/IFtjb2Rlc10gOiBbXSk7XG4gICAgZmllbGRTZXQuZm9yRWFjaCgoZmllbGRDb2RlKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2ZpZWxkSW5wdXRWYWxpZGF0aW9uW2ZpZWxkQ29kZV0pIHtcbiAgICAgICAgdGhpcy5fZmllbGRJbnB1dFZhbGlkYXRpb25bZmllbGRDb2RlXSA9IFtdO1xuICAgICAgfVxuICAgICAgdGhpcy5fZmllbGRJbnB1dFZhbGlkYXRpb25bZmllbGRDb2RlXS5wdXNoKHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSk7XG4gICAgfSk7XG4gIH1cblxuICBvbkZpZWxkVmFsaWRhdGlvblN0YXJ0KGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzID0gbnVsbCkge1xuICAgIGNvbnN0IGZpZWxkU2V0ID0gKEFycmF5LmlzQXJyYXkoY29kZXMpKSA/IGNvZGVzIDogKGNvZGVzID8gW2NvZGVzXSA6IFtdKTtcbiAgICBmaWVsZFNldC5mb3JFYWNoKChmaWVsZENvZGUpID0+IHtcbiAgICAgIGlmICghdGhpcy5fZmllbGRWYWxpZGF0aW9uc1N0YXJ0W2ZpZWxkQ29kZV0pIHtcbiAgICAgICAgdGhpcy5fZmllbGRWYWxpZGF0aW9uc1N0YXJ0W2ZpZWxkQ29kZV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ZpZWxkVmFsaWRhdGlvbnNTdGFydFtmaWVsZENvZGVdLnB1c2goeyBjYWxsYmFjaywgcHJvcGVydGllcyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uRmllbGRWYWxpZGF0aW9uRmluaXNoKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzID0gbnVsbCkge1xuICAgIGNvbnN0IGZpZWxkU2V0ID0gKEFycmF5LmlzQXJyYXkoY29kZXMpKSA/IGNvZGVzIDogKGNvZGVzID8gW2NvZGVzXSA6IFtdKTtcbiAgICBmaWVsZFNldC5mb3JFYWNoKChmaWVsZENvZGUpID0+IHtcbiAgICAgIGlmICghdGhpcy5fZmllbGRWYWxpZGF0aW9uc0ZpbmlzaFtmaWVsZENvZGVdKSB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVmFsaWRhdGlvbnNGaW5pc2hbZmllbGRDb2RlXSA9IFtdO1xuICAgICAgfVxuICAgICAgdGhpcy5fZmllbGRWYWxpZGF0aW9uc0ZpbmlzaFtmaWVsZENvZGVdLnB1c2goeyBjYWxsYmFjaywgcHJvcGVydGllcyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0RmllbGRJbnB1dFZhbGlkYXRpb24oZmllbGRDb2RlOiBzdHJpbmcsIGludHJpbnNpY1ZhbGlkYXRpb246IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgY29uc3QgZmllbGRUb1ZhbGlkYXRlID0gdGhpcy5nZXRGaWVsZChmaWVsZENvZGUpO1xuICAgIGlmICghZmllbGRUb1ZhbGlkYXRlKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGZpZWxkVG9WYWxpZGF0ZS5yZXNldEVycm9yKCk7XG4gICAgY29uc3QgdmFsaWRhdGlvbkNhbGxiYWNrcyA9IHRoaXMuX2ZpZWxkSW5wdXRWYWxpZGF0aW9uW2ZpZWxkQ29kZV07XG4gICAgaWYgKHZhbGlkYXRpb25DYWxsYmFja3MpIHtcbiAgICAgIGNvbnN0IGNsaWVudFZhbGlkYXRpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdGlvbk1ldGhvZCBvZiB2YWxpZGF0aW9uQ2FsbGJhY2tzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHZhbGlkYXRpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNvbnRpbnVlVmFsaWRhdGlvblByb21pc2UgPSBjYWxsYmFjayhmaWVsZFRvVmFsaWRhdGUpO1xuICAgICAgICBjbGllbnRWYWxpZGF0aW9uUHJvbWlzZXMucHVzaChjb250aW51ZVZhbGlkYXRpb25Qcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNsaWVudFZhbGlkYXRpb25Qcm9taXNlcyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRGaWVsZFZhbGlkYXRpb24oZmllbGRDb2RlOiBzdHJpbmcsIGludHJpbnNpY1ZhbGlkYXRpb246IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgY29uc3QgZmllbGRUb1ZhbGlkYXRlID0gdGhpcy5nZXRGaWVsZChmaWVsZENvZGUpO1xuICAgIGlmICghZmllbGRUb1ZhbGlkYXRlKSB7IHJldHVybjsgfVxuICAgIGZpZWxkVG9WYWxpZGF0ZS5yZXNldEVycm9yKCk7XG4gICAgY29uc3QgdmFsaWRhdGlvbkNhbGxiYWNrcyA9IHRoaXMuX2ZpZWxkVmFsaWRhdGlvbnNTdGFydFtmaWVsZENvZGVdO1xuICAgIGlmICh2YWxpZGF0aW9uQ2FsbGJhY2tzKSB7XG4gICAgICBjb25zdCBjbGllbnRWYWxpZGF0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHZhbGlkYXRpb25NZXRob2Qgb2YgdmFsaWRhdGlvbkNhbGxiYWNrcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB2YWxpZGF0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjbGllbnRWYWxpZGF0aW9uUHJvbWlzZSA9IGNhbGxiYWNrKGZpZWxkVG9WYWxpZGF0ZSk7XG4gICAgICAgIGNsaWVudFZhbGlkYXRpb25Qcm9taXNlcy5wdXNoKGNsaWVudFZhbGlkYXRpb25Qcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsaWVudFZhbGlkYXRpb25SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50VmFsaWRhdGlvblByb21pc2VzKTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlVmFsaWRhdGlvbiA9IGNsaWVudFZhbGlkYXRpb25SZXN1bHRzLnJlZHVjZSgodG90YWwsIGN1cnIpID0+ICh0b3RhbCAmJiAoY3VyciAhPT0gZmFsc2UpKSwgdHJ1ZSk7XG4gICAgICBpZiAoIWNvbnRpbnVlVmFsaWRhdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnRyaW5zaWNWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLnN0YXJ0U2VydmVyRmllbGRWYWxpZGF0aW9uKGZpZWxkVG9WYWxpZGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRTZXJ2ZXJGaWVsZFZhbGlkYXRpb24oaW5wdXRGaWVsZDogc3RyaW5nIHwgRmllbGREZXNjcmlwdG9yKSB7XG4gICAgY29uc3QgZmllbGRPYmo6IEZpZWxkRGVzY3JpcHRvciB8IG51bGwgPSAodHlwZW9mIGlucHV0RmllbGQgPT09ICdzdHJpbmcnKVxuICAgICAgPyB0aGlzLmdldEZpZWxkKGlucHV0RmllbGQpIDogaW5wdXRGaWVsZDtcbiAgICBsZXQgc2VydmVyRXJyb3IgPSBmYWxzZTtcbiAgICBsZXQgdmFsaWRhdGlvblJlc3VsdDogYm9vbGVhbiA9IHRydWU7XG4gICAgaWYgKCFmaWVsZE9iaikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZmllbGRPYmouYmFja2VuZCkge1xuICAgICAgZmllbGRPYmoudmFsaWRhdGluZyA9IHRydWU7XG4gICAgICB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpc1xuICAgICAgICAucmVxdWVzdEZvcm1BY3Rpb24oZm9ybUFjdGlvbnMudmFsaWRhdGUsIGZpZWxkT2JqLmZpZWxkQ29kZSk7XG4gICAgICBzZXJ2ZXJFcnJvciA9ICEhdGhpcy5lcnJvck9jY3VyZWQoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5maW5pc2hGaWVsZFZhbGlkYXRpb24oZmllbGRPYmosIHZhbGlkYXRpb25SZXN1bHQsIHNlcnZlckVycm9yKTtcbiAgICBpZiAoc2VydmVyRXJyb3IpIHtcbiAgICAgIGZpZWxkT2JqPy5zZXRFcnJvckNvZGUodGhpcy5lcnJvckNvZGUpO1xuICAgICAgZmllbGRPYmo/LnNldEVycm9yTWVzc2FnZSh0aGlzLmVycm9yTWVzc2FnZSk7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZmllbGRTZXJ2ZXJFcnJvci5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGhpcy5fZmllbGRTZXJ2ZXJFcnJvcltpbmRleF07XG4gICAgICAgIGNhbGxiYWNrKGZpZWxkT2JqKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZmllbGRPYmoudmFsaWRhdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoRmllbGRWYWxpZGF0aW9uKGZpZWxkT2JqZWN0OiBhbnksIHZhbGlkYXRpb25SZXN1bHQ6IGJvb2xlYW4sIHNlcnZlckVycm9yID0gZmFsc2UpIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uQ2FsbGJhY2tzID0gdGhpcy5fZmllbGRWYWxpZGF0aW9uc0ZpbmlzaFtmaWVsZE9iamVjdC5maWVsZENvZGVdO1xuICAgIGlmICh2YWxpZGF0aW9uQ2FsbGJhY2tzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdGlvbk1ldGhvZCBvZiB2YWxpZGF0aW9uQ2FsbGJhY2tzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHZhbGlkYXRpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNvbnRpbnVlT25FcnJvciA9IHByb3BlcnRpZXM/LmNvbnRpbnVlT25FcnJvciA/PyBmYWxzZTtcbiAgICAgICAgaWYgKCFzZXJ2ZXJFcnJvciB8fCBjb250aW51ZU9uRXJyb3IpIHtcbiAgICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNhbGxiYWNrKGZpZWxkT2JqZWN0LCB2YWxpZGF0aW9uUmVzdWx0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjb250aW51ZUZpZWxkVmFsaWRhdGlvbihmaWVsZENvZGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0U2VydmVyRmllbGRWYWxpZGF0aW9uKGZpZWxkQ29kZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFuZWphZG9yZXMgZGUgZXZlbnRvcyBwYXJhIGFjY2lvbmVzIHNvYnJlIFRhYmxhc1xuICAgKi9cblxuICBvblRhYmxlQWN0aW9uU3RhcnQoY29kZTogc3RyaW5nLCBhY3Rpb25Db2RlOiBzdHJpbmcsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzID0gbnVsbCkge1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZShjb2RlKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlubGluZUFjdGlvbk9iamVjdCA9IHRhYmxlT2JqZWN0LmdldEFjdGlvbihhY3Rpb25Db2RlKTtcbiAgICBpZiAoIWlubGluZUFjdGlvbk9iamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdGFibGVFdmVudEhhbmRsZXJzOiBhbnk7XG4gICAgaWYgKHRoaXMuX3RhYmxlQWN0aW9uc1N0YXJ0W2NvZGVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNTdGFydFtjb2RlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0ge307XG4gICAgICB0aGlzLl90YWJsZUFjdGlvbnNTdGFydFtjb2RlXSA9IHRhYmxlRXZlbnRIYW5kbGVycztcbiAgICB9XG4gICAgaWYgKCF0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSA9IFtdO1xuICAgIH1cbiAgICB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0ucHVzaCh7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgb25UYWJsZUFjdGlvbkZpbmlzaChjb2RlOiBzdHJpbmcsIGFjdGlvbkNvZGU6IHN0cmluZywgY2FsbGJhY2ssIHByb3BlcnRpZXMgPSBudWxsKSB7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKGNvZGUpO1xuICAgIGlmICghdGFibGVPYmplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5saW5lQWN0aW9uT2JqZWN0ID0gdGFibGVPYmplY3QuZ2V0QWN0aW9uKGFjdGlvbkNvZGUpO1xuICAgIGlmICghaW5saW5lQWN0aW9uT2JqZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB0YWJsZUV2ZW50SGFuZGxlcnM6IGFueTtcbiAgICBpZiAodGhpcy5fdGFibGVBY3Rpb25zRmluaXNoW2NvZGVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNGaW5pc2hbY29kZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHt9O1xuICAgICAgdGhpcy5fdGFibGVBY3Rpb25zRmluaXNoW2NvZGVdID0gdGFibGVFdmVudEhhbmRsZXJzO1xuICAgIH1cbiAgICBpZiAoIXRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSkge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdID0gW107XG4gICAgfVxuICAgIHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXS5wdXNoKHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSk7XG4gIH1cblxuICBvblRhYmxlU2VsZWN0aW9uU3RhcnQoY29kZTogc3RyaW5nLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUoY29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkgeyByZXR1cm47IH1cbiAgICBsZXQgdGFibGVFdmVudEhhbmRsZXJzOiBhbnlbXTtcbiAgICBpZiAodGhpcy5fdGFibGVTZWxlY3Rpb25zU3RhcnRbY29kZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlU2VsZWN0aW9uc1N0YXJ0W2NvZGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSBbXTtcbiAgICAgIHRoaXMuX3RhYmxlU2VsZWN0aW9uc1N0YXJ0W2NvZGVdID0gdGFibGVFdmVudEhhbmRsZXJzO1xuICAgIH1cbiAgICB0YWJsZUV2ZW50SGFuZGxlcnMucHVzaCh7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgb25UYWJsZVNlbGVjdGlvbkZpbmlzaChjb2RlOiBzdHJpbmcsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzID0gbnVsbCkge1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZShjb2RlKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0KSB7IHJldHVybjsgfVxuICAgIGxldCB0YWJsZUV2ZW50SGFuZGxlcnM6IGFueVtdO1xuICAgIGlmICh0aGlzLl90YWJsZVNlbGVjdGlvbnNGaW5pc2hbY29kZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlU2VsZWN0aW9uc0ZpbmlzaFtjb2RlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0gW107XG4gICAgICB0aGlzLl90YWJsZVNlbGVjdGlvbnNGaW5pc2hbY29kZV0gPSB0YWJsZUV2ZW50SGFuZGxlcnM7XG4gICAgfVxuICAgIHRhYmxlRXZlbnRIYW5kbGVycy5wdXNoKHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSk7XG4gIH1cblxuICBvblRhYmxlR2V0RGF0YVN0YXJ0KGNvZGU6IHN0cmluZywgY2FsbGJhY2ssIHByb3BlcnRpZXMgPSBudWxsKSB7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKGNvZGUpO1xuICAgIGlmICghdGFibGVPYmplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHRhYmxlRXZlbnRIYW5kbGVyczogYW55W107XG4gICAgaWYgKHRoaXMuX3RhYmxlR2V0RGF0YVN0YXJ0W2NvZGVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUdldERhdGFTdGFydFtjb2RlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0gW107XG4gICAgICB0aGlzLl90YWJsZUdldERhdGFTdGFydFtjb2RlXSA9IHRhYmxlRXZlbnRIYW5kbGVycztcbiAgICB9XG4gICAgdGFibGVFdmVudEhhbmRsZXJzLnB1c2goeyBjYWxsYmFjaywgcHJvcGVydGllcyB9KTtcbiAgfVxuXG4gIG9uVGFibGVHZXREYXRhRmluaXNoKGNvZGU6IHN0cmluZywgY2FsbGJhY2ssIHByb3BlcnRpZXMgPSBudWxsKSB7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKGNvZGUpO1xuICAgIGlmICghdGFibGVPYmplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHRhYmxlRXZlbnRIYW5kbGVyczogYW55O1xuICAgIGlmICh0aGlzLl90YWJsZUdldERhdGFGaW5pc2hbY29kZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlR2V0RGF0YUZpbmlzaFtjb2RlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0ge307XG4gICAgICB0aGlzLl90YWJsZUdldERhdGFGaW5pc2hbY29kZV0gPSB0YWJsZUV2ZW50SGFuZGxlcnM7XG4gICAgfVxuICAgIHRhYmxlRXZlbnRIYW5kbGVyc1tHRVRfREFUQV9BQ1RJT05dID0geyBjYWxsYmFjaywgcHJvcGVydGllcyB9O1xuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZUdsb2JhbEFjdGlvbih0YWJsZUFjdGlvbkV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgYWN0aW9uQ29kZSB9ID0gdGFibGVBY3Rpb25FdmVudDtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVDb2RlKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0IHx8ICFhY3Rpb25Db2RlKSB7IHJldHVybjsgfVxuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IGFjdGlvbiA9IHRhYmxlT2JqZWN0LmdldEFjdGlvbihhY3Rpb25Db2RlKTtcbiAgICBpZiAoIWFjdGlvbikgeyByZXR1cm47IH1cbiAgICBjb25zdCB0YWJsZUFjdGlvbkRldGFpbCA9IHtcbiAgICAgIHRhYmxlT2JqZWN0LFxuICAgICAgYWN0aW9uLFxuICAgICAgdGFibGVDb2RlLFxuICAgICAgYWN0aW9uQ29kZSxcbiAgICB9O1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlQWN0aW9uc1N0YXJ0W3RhYmxlQ29kZV07XG4gICAgY29uc3QgdGFibGVBY3Rpb25NZXRob2RzID0gKHRhYmxlRXZlbnRIYW5kbGVycykgPyB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0gOiBudWxsO1xuICAgIGlmICh0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGFibGVBY3Rpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2UgPSBjYWxsYmFjayh0YWJsZUFjdGlvbkRldGFpbCk7XG4gICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2xpZW50QWN0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVBY3Rpb24gPSBjbGllbnRBY3Rpb25SZXN1bHRzLnJlZHVjZSgodG90YWwsIGN1cnIpID0+ICh0b3RhbCAmJiAoY3VyciAhPT0gZmFsc2UpKSwgdHJ1ZSk7XG4gICAgICBpZiAoIWNvbnRpbnVlQWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGFydFRhYmxlU2VydmVyR2xvYmFsQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVTZXJ2ZXJHbG9iYWxBY3Rpb24odGFibGVBY3Rpb25EZXRhaWw6IGFueSkge1xuICAgIGNvbnN0IHsgdGFibGVPYmplY3QsIGFjdGlvbiwgdGFibGVDb2RlLCBhY3Rpb25Db2RlIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBpZiAoIXRhYmxlT2JqZWN0IHx8ICFhY3Rpb24pIHsgcmV0dXJuOyB9XG4gICAgdGFibGVPYmplY3QucHV0T25XYWl0KCk7XG4gICAgbGV0IHNlcnZlckVycm9yID0gZmFsc2U7XG4gICAgbGV0IGFjdGlvblJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGFjdGlvbi5iYWNrZW5kKSB7XG4gICAgICBjb25zdCBhY3Rpb25TdWJqZWN0ID0ge1xuICAgICAgICB0YWJsZUNvZGUsXG4gICAgICAgIGFjdGlvblR5cGU6IEdMT0JBTF9BQ1RJT04sXG4gICAgICAgIGFjdGlvbkNvZGVcbiAgICAgIH07XG4gICAgICBhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzXG4gICAgICAgIC5yZXF1ZXN0Rm9ybUFjdGlvbihmb3JtQWN0aW9ucy50YWJsZUFjdGlvbiwgYWN0aW9uU3ViamVjdCk7XG4gICAgICBzZXJ2ZXJFcnJvciA9ICEhdGhpcy5lcnJvck9jY3VyZWQoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5maW5pc2hUYWJsZUdsb2JhbEFjdGlvbih0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0LCBzZXJ2ZXJFcnJvcik7XG4gICAgaWYgKCFzZXJ2ZXJFcnJvcikge1xuICAgICAgYWN0aW9uLm5ld1N0YXRlICYmIHRoaXMuY2hhbmdlU3RhdGUoYWN0aW9uLm5ld1N0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX3RhYmxlU2VydmVyRXJyb3IubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHRoaXMuX3RhYmxlU2VydmVyRXJyb3JbaW5kZXhdO1xuICAgICAgICBjYWxsYmFjayh0YWJsZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRhYmxlT2JqZWN0LmZyZWVXYWl0aW5nKCk7XG4gIH1cblxuICBhc3luYyBmaW5pc2hUYWJsZUdsb2JhbEFjdGlvbih0YWJsZUFjdGlvbkRldGFpbDogYW55LCBhY3Rpb25SZXN1bHQsIHNlcnZlckVycm9yID0gZmFsc2UpIHtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgYWN0aW9uQ29kZSB9ID0gdGFibGVBY3Rpb25EZXRhaWw7XG4gICAgY29uc3QgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy5fdGFibGVBY3Rpb25zRmluaXNoW3RhYmxlQ29kZV07XG4gICAgY29uc3QgdGFibGVBY3Rpb25NZXRob2RzID0gKHRhYmxlRXZlbnRIYW5kbGVycykgPyB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0gOiBudWxsO1xuICAgIGlmICh0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGFibGVBY3Rpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNvbnRpbnVlT25FcnJvciA9IHByb3BlcnRpZXM/LmNvbnRpbnVlT25FcnJvciA/PyBmYWxzZTtcbiAgICAgICAgaWYgKCFzZXJ2ZXJFcnJvciB8fCBjb250aW51ZU9uRXJyb3IpIHtcbiAgICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNhbGxiYWNrKHRhYmxlQWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVBY3Rpb24odGFibGVBY3Rpb25FdmVudDogYW55KSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUsIGFjdGlvbkNvZGUsIGFjdGlvbkRldGFpbCB9ID0gdGFibGVBY3Rpb25FdmVudDtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVDb2RlKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0IHx8ICFhY3Rpb25Db2RlKSB7IHJldHVybjsgfVxuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IHsgcmVjb3JkSWQsIHJlY29yZERhdGEgfSA9IGFjdGlvbkRldGFpbDtcbiAgICBjb25zdCBhY3Rpb24gPSB0YWJsZU9iamVjdC5nZXRBY3Rpb24oYWN0aW9uQ29kZSk7XG4gICAgaWYgKCFhY3Rpb24pIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgdGFibGVBY3Rpb25EZXRhaWwgPSB7XG4gICAgICB0YWJsZU9iamVjdCxcbiAgICAgIGFjdGlvbixcbiAgICAgIHRhYmxlQ29kZSxcbiAgICAgIGFjdGlvbkNvZGUsXG4gICAgICByZWNvcmRJZCxcbiAgICAgIHJlY29yZERhdGFcbiAgICB9O1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlQWN0aW9uc1N0YXJ0W3RhYmxlQ29kZV07XG4gICAgY29uc3QgdGFibGVBY3Rpb25NZXRob2RzID0gKHRhYmxlRXZlbnRIYW5kbGVycykgPyB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0gOiBudWxsO1xuICAgIGlmICh0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGFibGVBY3Rpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2UgPSBjYWxsYmFjayh0YWJsZUFjdGlvbkRldGFpbCk7XG4gICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2xpZW50QWN0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVBY3Rpb24gPSBjbGllbnRBY3Rpb25SZXN1bHRzLnJlZHVjZSgodG90YWwsIGN1cnIpID0+ICh0b3RhbCAmJiAoY3VyciAhPT0gZmFsc2UpKSwgdHJ1ZSk7XG4gICAgICBpZiAoIWNvbnRpbnVlQWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGFydFRhYmxlU2VydmVyQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVTZXJ2ZXJBY3Rpb24odGFibGVBY3Rpb25EZXRhaWw6IGFueSkge1xuICAgIGNvbnN0IHsgdGFibGVPYmplY3QsIGFjdGlvbiwgdGFibGVDb2RlLCBhY3Rpb25Db2RlLCByZWNvcmRJZCwgcmVjb3JkRGF0YSB9ID0gdGFibGVBY3Rpb25EZXRhaWw7XG4gICAgaWYgKCF0YWJsZU9iamVjdCB8fCAhYWN0aW9uKSB7IHJldHVybjsgfVxuICAgIHRhYmxlT2JqZWN0LnB1dE9uV2FpdCgpO1xuICAgIGxldCBzZXJ2ZXJFcnJvciA9IGZhbHNlO1xuICAgIGxldCBhY3Rpb25SZXN1bHQgPSBudWxsO1xuICAgIGlmIChhY3Rpb24uYmFja2VuZCkge1xuICAgICAgY29uc3QgYWN0aW9uU3ViamVjdCA9IHtcbiAgICAgICAgdGFibGVDb2RlLFxuICAgICAgICBhY3Rpb25UeXBlOiB0aGlzLmZvcm1Db25maWcudGFibGVBY3Rpb25zLmlubGluZSxcbiAgICAgICAgYWN0aW9uQ29kZSxcbiAgICAgICAgdGFibGVSZWNvcmRJZDogcmVjb3JkSWQsXG4gICAgICAgIHRhYmxlUmVjb3JkRGF0YTogcmVjb3JkRGF0YVxuICAgICAgfTtcbiAgICAgIGFjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXNcbiAgICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKGZvcm1BY3Rpb25zLnRhYmxlQWN0aW9uLCBhY3Rpb25TdWJqZWN0KTtcbiAgICAgIHNlcnZlckVycm9yID0gISF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmZpbmlzaFRhYmxlQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQsIHNlcnZlckVycm9yKTtcbiAgICBpZiAoIXNlcnZlckVycm9yKSB7XG4gICAgICBhY3Rpb24ubmV3U3RhdGUgJiYgdGhpcy5jaGFuZ2VTdGF0ZShhY3Rpb24ubmV3U3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BsYXlUYWJsZVNlcnZlckVycm9yKCk7XG4gICAgfVxuICAgIHRhYmxlT2JqZWN0LmZyZWVXYWl0aW5nKCk7XG4gIH1cblxuICBjb21wbGV0ZUlubGluZUFjdGlvbih0YWJsZUFjdGlvbjogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRUYWJsZVNlcnZlckFjdGlvbih0YWJsZUFjdGlvbik7XG4gIH1cblxuICBhc3luYyBmaW5pc2hUYWJsZUFjdGlvbih0YWJsZUFjdGlvbkRldGFpbDogYW55LCBhY3Rpb25SZXN1bHQsIHNlcnZlckVycm9yID0gZmFsc2UpIHtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgYWN0aW9uQ29kZSB9ID0gdGFibGVBY3Rpb25EZXRhaWw7XG4gICAgY29uc3QgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy5fdGFibGVBY3Rpb25zRmluaXNoW3RhYmxlQ29kZV07XG4gICAgY29uc3QgdGFibGVBY3Rpb25NZXRob2RzID0gKHRhYmxlRXZlbnRIYW5kbGVycykgPyB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0gOiBudWxsO1xuICAgIGlmICh0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGFibGVBY3Rpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNvbnRpbnVlT25FcnJvciA9IHByb3BlcnRpZXM/LmNvbnRpbnVlT25FcnJvciA/PyBmYWxzZTtcbiAgICAgICAgaWYgKCFzZXJ2ZXJFcnJvciB8fCBjb250aW51ZU9uRXJyb3IpIHtcbiAgICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNhbGxiYWNrKHRhYmxlQWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVSZWNvcmRTZWxlY3Rpb24odGFibGVBY3Rpb25FdmVudDogYW55KSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUsIGFjdGlvbkRldGFpbCB9ID0gdGFibGVBY3Rpb25FdmVudDtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVDb2RlKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0KSB7IHJldHVybjsgfVxuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IHsgcmVjb3JkSWQsIHJlY29yZERhdGEgfSA9IGFjdGlvbkRldGFpbDtcbiAgICBjb25zdCB0YWJsZVNlbGVjdGlvbkRldGFpbCA9IHtcbiAgICAgIHRhYmxlT2JqZWN0LFxuICAgICAgdGFibGVDb2RlLFxuICAgICAgcmVjb3JkSWQsXG4gICAgICByZWNvcmREYXRhXG4gICAgfTtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZVNlbGVjdGlvbnNTdGFydFt0YWJsZUNvZGVdO1xuICAgIGlmICh0YWJsZUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZVNlbGVjdGlvbk1ldGhvZCBvZiB0YWJsZUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGFibGVTZWxlY3Rpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2UgPSBjYWxsYmFjayh0YWJsZVNlbGVjdGlvbkRldGFpbCk7XG4gICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2xpZW50QWN0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVBY3Rpb24gPSBjbGllbnRBY3Rpb25SZXN1bHRzLnJlZHVjZSgodG90YWwsIGN1cnIpID0+ICh0b3RhbCAmJiAoY3VyciAhPT0gZmFsc2UpKSwgdHJ1ZSk7XG4gICAgICBpZiAoIWNvbnRpbnVlQWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGFydFRhYmxlU2VydmVyUmVjb3JkU2VsZWN0aW9uKHRhYmxlU2VsZWN0aW9uRGV0YWlsKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVTZXJ2ZXJSZWNvcmRTZWxlY3Rpb24odGFibGVTZWxlY3Rpb25EZXRhaWw6IGFueSkge1xuICAgIGNvbnN0IHsgdGFibGVPYmplY3QsIHRhYmxlQ29kZSwgcmVjb3JkSWQsIHJlY29yZERhdGEgfSA9IHRhYmxlU2VsZWN0aW9uRGV0YWlsO1xuICAgIGlmICghdGFibGVPYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgdGFibGVPYmplY3QucHV0T25XYWl0KCk7XG4gICAgbGV0IHNlcnZlckVycm9yID0gZmFsc2U7XG4gICAgbGV0IGFjdGlvblJlc3VsdCA9IG51bGw7XG4gICAgaWYgKHRhYmxlT2JqZWN0LnNlbGVjdGlvbkJhY2tlbmQpIHtcbiAgICAgIGNvbnN0IGFjdGlvblN1YmplY3Q6IGFueSA9IHtcbiAgICAgICAgdGFibGVDb2RlLFxuICAgICAgICBhY3Rpb25UeXBlOiB0aGlzLmZvcm1Db25maWcudGFibGVBY3Rpb25zLnJvd1NlbGVjdGlvbixcbiAgICAgICAgYWN0aW9uQ29kZTogbnVsbCxcbiAgICAgICAgdGFibGVSZWNvcmRJZDogcmVjb3JkSWQsXG4gICAgICAgIHRhYmxlUmVjb3JkRGF0YTogcmVjb3JkRGF0YVxuICAgICAgfTtcbiAgICAgIGFjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXNcbiAgICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKGZvcm1BY3Rpb25zLnRhYmxlQWN0aW9uLCBhY3Rpb25TdWJqZWN0KTtcbiAgICAgIHNlcnZlckVycm9yID0gISF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmZpbmlzaFRhYmxlUmVjb3JkU2VsZWN0aW9uKHRhYmxlU2VsZWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQsIHNlcnZlckVycm9yKTtcbiAgICBpZiAoc2VydmVyRXJyb3IpIHtcbiAgICAgIHRoaXMuZGlzcGxheVRhYmxlU2VydmVyRXJyb3IoKTtcbiAgICB9XG4gICAgdGFibGVPYmplY3QuZnJlZVdhaXRpbmcoKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFRhYmxlUmVjb3JkU2VsZWN0aW9uKHRhYmxlU2VsZWN0aW9uRGV0YWlsOiBhbnksIGFjdGlvblJlc3VsdCwgc2VydmVyRXJyb3IgPSBmYWxzZSkge1xuICAgIGNvbnN0IHsgdGFibGVDb2RlIH0gPSB0YWJsZVNlbGVjdGlvbkRldGFpbDtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZVNlbGVjdGlvbnNGaW5pc2hbdGFibGVDb2RlXTtcbiAgICBpZiAodGFibGVFdmVudEhhbmRsZXJzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVTZWxlY3Rpb25NZXRob2Qgb2YgdGFibGVFdmVudEhhbmRsZXJzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHRhYmxlU2VsZWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjb250aW51ZU9uRXJyb3IgPSBwcm9wZXJ0aWVzPy5jb250aW51ZU9uRXJyb3IgPz8gZmFsc2U7XG4gICAgICAgIGlmICghc2VydmVyRXJyb3IgfHwgY29udGludWVPbkVycm9yKSB7XG4gICAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjYWxsYmFjayh0YWJsZVNlbGVjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydFRhYmxlU2VsZWN0aW9uQWN0aW9uKHRhYmxlQWN0aW9uRXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHsgdGFibGVDb2RlLCBhY3Rpb25Db2RlLCBhY3Rpb25EZXRhaWwgfSA9IHRhYmxlQWN0aW9uRXZlbnQ7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKHRhYmxlQ29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCB8fCAhYWN0aW9uQ29kZSkgeyByZXR1cm47IH1cbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICBjb25zdCB7IHNlbGVjdGVkUmVjb3JkcyB9ID0gYWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IGFjdGlvbiA9IHRhYmxlT2JqZWN0LmdldEFjdGlvbihhY3Rpb25Db2RlKTtcbiAgICBpZiAoIWFjdGlvbikgeyByZXR1cm47IH1cbiAgICBjb25zdCB0YWJsZUFjdGlvbkRldGFpbCA9IHtcbiAgICAgIHRhYmxlT2JqZWN0LFxuICAgICAgYWN0aW9uLFxuICAgICAgdGFibGVDb2RlLFxuICAgICAgYWN0aW9uQ29kZSxcbiAgICAgIHNlbGVjdGVkUmVjb3Jkc1xuICAgIH07XG4gICAgY29uc3QgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy5fdGFibGVBY3Rpb25zU3RhcnRbdGFibGVDb2RlXTtcbiAgICBjb25zdCB0YWJsZUFjdGlvbk1ldGhvZHMgPSAodGFibGVFdmVudEhhbmRsZXJzKSA/IHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSA6IG51bGw7XG4gICAgaWYgKHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kIG9mIHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB0YWJsZUFjdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZSA9IGNhbGxiYWNrKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjbGllbnRBY3Rpb25Qcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgICBjb25zdCBjb250aW51ZUFjdGlvbiA9IGNsaWVudEFjdGlvblJlc3VsdHMucmVkdWNlKCh0b3RhbCwgY3VycikgPT4gKHRvdGFsICYmIChjdXJyICE9PSBmYWxzZSkpLCB0cnVlKTtcbiAgICAgIGlmICghY29udGludWVBY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXJ0VGFibGVTZXJ2ZXJTZWxlY3Rpb25BY3Rpb24odGFibGVBY3Rpb25EZXRhaWwpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZVNlcnZlclNlbGVjdGlvbkFjdGlvbih0YWJsZUFjdGlvbkRldGFpbDogYW55KSB7XG4gICAgY29uc3QgeyB0YWJsZU9iamVjdCwgYWN0aW9uLCB0YWJsZUNvZGUsIGFjdGlvbkNvZGUsIHNlbGVjdGVkUmVjb3JkcyB9ID0gdGFibGVBY3Rpb25EZXRhaWw7XG4gICAgaWYgKCF0YWJsZU9iamVjdCB8fCAhYWN0aW9uKSB7IHJldHVybjsgfVxuICAgIHRhYmxlT2JqZWN0LnB1dE9uV2FpdCgpO1xuICAgIGxldCBzZXJ2ZXJFcnJvciA9IGZhbHNlO1xuICAgIGxldCBhY3Rpb25SZXN1bHQgPSBudWxsO1xuICAgIGlmIChhY3Rpb24uYmFja2VuZCkge1xuICAgICAgY29uc3QgYWN0aW9uU3ViamVjdCA9IHtcbiAgICAgICAgdGFibGVDb2RlLFxuICAgICAgICBhY3Rpb25UeXBlOiB0aGlzLmZvcm1Db25maWcudGFibGVBY3Rpb25zLnNlbGVjdGlvbixcbiAgICAgICAgYWN0aW9uQ29kZSxcbiAgICAgICAgc2VsZWN0ZWRSZWNvcmRzXG4gICAgICB9O1xuICAgICAgYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpc1xuICAgICAgICAucmVxdWVzdEZvcm1BY3Rpb24oZm9ybUFjdGlvbnMudGFibGVBY3Rpb24sIGFjdGlvblN1YmplY3QpO1xuICAgICAgc2VydmVyRXJyb3IgPSAhIXRoaXMuZXJyb3JPY2N1cmVkKCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZmluaXNoVGFibGVTZWxlY3Rpb25BY3Rpb24odGFibGVBY3Rpb25EZXRhaWwsIGFjdGlvblJlc3VsdCwgc2VydmVyRXJyb3IpO1xuICAgIGlmICghc2VydmVyRXJyb3IpIHtcbiAgICAgIGFjdGlvbi5uZXdTdGF0ZSAmJiB0aGlzLmNoYW5nZVN0YXRlKGFjdGlvbi5uZXdTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcGxheVRhYmxlU2VydmVyRXJyb3IoKTtcbiAgICB9XG4gICAgdGFibGVPYmplY3QuZnJlZVdhaXRpbmcoKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFRhYmxlU2VsZWN0aW9uQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsOiBhbnksIGFjdGlvblJlc3VsdCwgc2VydmVyRXJyb3IgPSBmYWxzZSkge1xuICAgIGNvbnN0IHsgdGFibGVDb2RlLCBhY3Rpb25Db2RlIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNGaW5pc2hbdGFibGVDb2RlXTtcbiAgICBjb25zdCB0YWJsZUFjdGlvbk1ldGhvZHMgPSAodGFibGVFdmVudEhhbmRsZXJzKSA/IHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSA6IG51bGw7XG4gICAgaWYgKHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kIG9mIHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB0YWJsZUFjdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY29udGludWVPbkVycm9yID0gcHJvcGVydGllcz8uY29udGludWVPbkVycm9yID8/IGZhbHNlO1xuICAgICAgICBpZiAoIXNlcnZlckVycm9yIHx8IGNvbnRpbnVlT25FcnJvcikge1xuICAgICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2FsbGJhY2sodGFibGVBY3Rpb25EZXRhaWwsIGFjdGlvblJlc3VsdCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZUdldERhdGEodGFibGVBY3Rpb25FdmVudDogYW55KSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUgfSA9IHRhYmxlQWN0aW9uRXZlbnQ7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKHRhYmxlQ29kZSk7XG4gICAgY29uc3QgdGFibGVBY3Rpb25EZXRhaWwgPSB7XG4gICAgICB0YWJsZU9iamVjdCxcbiAgICAgIHRhYmxlQ29kZVxuICAgIH07XG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG4gICAgY29uc3QgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy5fdGFibGVHZXREYXRhU3RhcnRbdGFibGVDb2RlXTtcbiAgICBpZiAodGFibGVFdmVudEhhbmRsZXJzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVBY3Rpb25NZXRob2Qgb2YgdGFibGVFdmVudEhhbmRsZXJzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHRhYmxlQWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlID0gY2FsbGJhY2sodGFibGVBY3Rpb25EZXRhaWwpO1xuICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNsaWVudEFjdGlvblByb21pc2UpO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlQWN0aW9uID0gY2xpZW50QWN0aW9uUmVzdWx0cy5yZWR1Y2UoKHRvdGFsLCBjdXJyKSA9PiAodG90YWwgJiYgKGN1cnIgIT09IGZhbHNlKSksIHRydWUpO1xuICAgICAgaWYgKCFjb250aW51ZUFjdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3RhcnRUYWJsZVNlcnZlckdldERhdGEodGFibGVBY3Rpb25EZXRhaWwpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZVNlcnZlckdldERhdGEodGFibGVBY3Rpb25EZXRhaWw6IGFueSkge1xuICAgIGNvbnN0IHsgdGFibGVPYmplY3QsIHRhYmxlQ29kZSB9ID0gdGFibGVBY3Rpb25EZXRhaWw7XG4gICAgdGFibGVPYmplY3QucHV0T25XYWl0KCk7XG4gICAgbGV0IHNlcnZlckVycm9yID0gZmFsc2U7XG4gICAgY29uc3QgYWN0aW9uU3ViamVjdCA9IHsgdGFibGVDb2RlIH07XG4gICAgY29uc3QgYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpc1xuICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKGZvcm1BY3Rpb25zLmdldFRhYmxlRGF0YSwgYWN0aW9uU3ViamVjdCk7XG4gICAgc2VydmVyRXJyb3IgPSAhIXRoaXMuZXJyb3JPY2N1cmVkKCk7XG4gICAgYXdhaXQgdGhpcy5maW5pc2hUYWJsZUdldERhdGEodGFibGVBY3Rpb25EZXRhaWwsIGFjdGlvblJlc3VsdCwgc2VydmVyRXJyb3IpO1xuICAgIGlmIChzZXJ2ZXJFcnJvcikge1xuICAgICAgdGhpcy5kaXNwbGF5VGFibGVTZXJ2ZXJFcnJvcigpO1xuICAgIH1cbiAgICB0YWJsZU9iamVjdC5mcmVlV2FpdGluZygpO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoVGFibGVHZXREYXRhKHRhYmxlQWN0aW9uRGV0YWlsOiBhbnksIGFjdGlvblJlc3VsdCwgc2VydmVyRXJyb3IgPSBmYWxzZSkge1xuICAgIGNvbnN0IHsgdGFibGVDb2RlLCB0YWJsZUFjdGlvbkNvZGUgfSA9IHRhYmxlQWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlQWN0aW9uc0ZpbmlzaFt0YWJsZUNvZGVdO1xuICAgIGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kcyA9ICh0YWJsZUV2ZW50SGFuZGxlcnMpID8gdGFibGVFdmVudEhhbmRsZXJzW3RhYmxlQWN0aW9uQ29kZV0gOiBudWxsO1xuICAgIGlmICh0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGFibGVBY3Rpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNvbnRpbnVlT25FcnJvciA9IHByb3BlcnRpZXM/LmNvbnRpbnVlT25FcnJvciA/PyBmYWxzZTtcbiAgICAgICAgaWYgKCFzZXJ2ZXJFcnJvciB8fCBjb250aW51ZU9uRXJyb3IpIHtcbiAgICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNhbGxiYWNrKHRhYmxlQWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrU2VjdGlvblJlcXVpcmVkRmllbGRzKHNlY3Rpb25Db2RlOiBzdHJpbmcsIHJlcUZpZWxkTWVzc2FnZT86IHN0cmluZykge1xuICAgIHRoaXMuY2xlYW5FcnJvckZpZWxkcyhudWxsLCBzZWN0aW9uQ29kZSk7XG4gICAgY29uc3QgcmVxdWlyZWRGaWVsZE1lc3NhZ2UgPSByZXFGaWVsZE1lc3NhZ2UgPz8gdGhpcy5mb3JtQ29uZmlnLmZvcm1TdGFuZGFyZEVycm9ycy5yZXF1aXJlZEZpZWxkXG4gICAgY29uc3QgbnVtRXJyb3JzID0gdGhpcy50YWdGaWVsZHNXaXRoRXJyb3IocmVxdWlyZWRGaWVsZE1lc3NhZ2UsIHRoaXMuZ2V0UmVxdWlyZWRFbXB0eUZpZWxkcyhudWxsLCBzZWN0aW9uQ29kZSkpO1xuICAgIHJldHVybiAobnVtRXJyb3JzID09PSAwKTtcbiAgfVxuXG4gIHZhbGlkYXRlU2VjdGlvbkNvbnNpc3RlbmN5KHNlY3Rpb25Db2RlOiBzdHJpbmcsIHJlcUZpZWxkTWVzc2FnZT86IHN0cmluZykge1xuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IGNvbXBsZXRlRmllbGRzID0gdGhpcy5jaGVja1NlY3Rpb25SZXF1aXJlZEZpZWxkcyhzZWN0aW9uQ29kZSwgcmVxRmllbGRNZXNzYWdlKTtcbiAgICBpZiAoIWNvbXBsZXRlRmllbGRzKSB7XG4gICAgICB0aGlzLnNldEVycm9yKHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMudHlwZVdhcm5pbmcsXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMudmFsaWRhdGlvblRpdGxlLFxuICAgICAgICB0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnJlcXVpcmVkRmllbGRzKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHZhbGlkYXRpb25FcnJvciA9IGZhbHNlO1xuICAgIGNvbnN0IHJlcXVpcmVkRW1wdHlGaWVsZHM6IGFueVtdID0gdGhpcy5nZXRSZXF1aXJlZEVtcHR5RmllbGRzKG51bGwsIHNlY3Rpb25Db2RlKSA/PyBbXTtcbiAgICBpZiAocmVxdWlyZWRFbXB0eUZpZWxkcz8ubGVuZ3RoID4gMCkge1xuICAgICAgdmFsaWRhdGlvbkVycm9yID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2V0RXJyb3IodGhpcy5mb3JtQ29uZmlnLmZvcm1TdGFuZGFyZEVycm9ycy50eXBlV2FybmluZyxcbiAgICAgICAgdGhpcy5mb3JtQ29uZmlnLmZvcm1TdGFuZGFyZEVycm9ycy52YWxpZGF0aW9uVGl0bGUsXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMucmVxdWlyZWRGaWVsZHMpO1xuICAgICAgdGhpcy50YWdGaWVsZHNXaXRoRXJyb3IodGhpcy5mb3JtQ29uZmlnLmZvcm1TdGFuZGFyZEVycm9ycy5yZXF1aXJlZEZpZWxkLCByZXF1aXJlZEVtcHR5RmllbGRzKTtcbiAgICAgIGZvciAoY29uc3QgZmllbGRDb2RlIG9mIHJlcXVpcmVkRW1wdHlGaWVsZHMpIHtcbiAgICAgICAgY29uc3QgcmVxdWlyZWRFbXB0eUZpZWxkID0gdGhpcy5nZXRGaWVsZChmaWVsZENvZGUpO1xuICAgICAgICByZXF1aXJlZEVtcHR5RmllbGQ/LmZvY3VzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB2YWxpZGF0aW9uSXNzdWVGaWVsZHM6IGFueVtdID0gdGhpcy5nZXRGaWVsZHNXaXRoVmFsaWRhdGlvbklzc3VlcyhudWxsLFxuICAgICAgc2VjdGlvbkNvZGUpID8/IFtdO1xuICAgIGlmICghdmFsaWRhdGlvbkVycm9yICYmIHZhbGlkYXRpb25Jc3N1ZUZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICB2YWxpZGF0aW9uRXJyb3IgPSB0cnVlO1xuICAgICAgdGhpcy5zZXRFcnJvcih0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnR5cGVXYXJuaW5nLFxuICAgICAgICB0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnZhbGlkYXRpb25UaXRsZSxcbiAgICAgICAgdGhpcy5mb3JtQ29uZmlnLmZvcm1TdGFuZGFyZEVycm9ycy52YWxpZGF0aW9uRmllbGRzKTtcbiAgICAgIGZvciAoY29uc3QgZmllbGRDb2RlIG9mIHZhbGlkYXRpb25Jc3N1ZUZpZWxkcykge1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uSXNzdWVGaWVsZCA9IHRoaXMuZ2V0RmllbGQoZmllbGRDb2RlKTtcbiAgICAgICAgaWYgKHZhbGlkYXRpb25Jc3N1ZUZpZWxkKSB7XG4gICAgICAgICAgdmFsaWRhdGlvbklzc3VlRmllbGQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRpb25FcnJvcjtcbiAgfVxuXG4gIGNvcHlUYWJsZVJlY29yZFRvRmllbGRzKHRhYmxlT2JqOiBhbnksIG1hcHBpbmdUYWJsZTogYW55ID0gbnVsbCkge1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZSh0YWJsZU9iai50YWJsZUNvZGUpO1xuICAgIGNvbnN0IHRhYmxlUmVjb3JkID0gdGFibGVPYmplY3Q/LmdldFRhYmxlUmVjb3JkKHRhYmxlT2JqLnJlY29yZElkKTtcbiAgICBjb25zdCBjb2x1bW5OYW1lcyA9IHRhYmxlT2JqZWN0Py5jb2x1bW5OYW1lcztcbiAgICBpZiAodGFibGVSZWNvcmQgJiYgY29sdW1uTmFtZXMpIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uTmFtZSBvZiBjb2x1bW5OYW1lcykge1xuICAgICAgICBjb25zdCBjb2x1bW5WYWx1ZSA9IHRhYmxlUmVjb3JkLmdldEZpZWxkVmFsdWUoY29sdW1uTmFtZSkgPz8gJyc7XG4gICAgICAgIGNvbnN0IGZpZWxkQ29kZSA9IG1hcHBpbmdUYWJsZT8uW2NvbHVtbk5hbWVdID8/IGNvbHVtbk5hbWU7XG4gICAgICAgIHRoaXMuc2V0RmllbGRWYWx1ZShmaWVsZENvZGUsIGNvbHVtblZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTcOpdG9kb3MgTGVnYWN5IGRlIGNvbXBhdGliaWxpZGFkIGhhY2lhIGF0csOhc1xuICAgKi9cblxuICBhZGRTZWN0aW9uQWN0aXZhdGlvbihjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5vblNlY3Rpb25BY3RpdmF0aW9uKGNvZGVzLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICBhZGRTZWN0aW9uSW5hY3RpdmF0aW9uKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLm9uU2VjdGlvbkluYWN0aXZhdGlvbihjb2RlcywgY2FsbGJhY2ssIHByb3BlcnRpZXMpO1xuICB9XG5cbiAgYWRkQWN0aW9uTWV0aG9kU3RhcnQoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgY2FsbGJhY2ssIHByb3BlcnRpZXMgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMub25BY3Rpb25TdGFydChjb2RlcywgY2FsbGJhY2ssIHByb3BlcnRpZXMpO1xuICB9XG5cbiAgYWRkQWN0aW9uTWV0aG9kRmluaXNoKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLm9uQWN0aW9uRmluaXNoKGNvZGVzLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICBhZGRGaWVsZElucHV0VmFsaWRhdGlvbihjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5vbkZpZWxkSW5wdXQoY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIGFkZEZpZWxkVmFsaWRhdGlvblN0YXJ0KGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLm9uRmllbGRWYWxpZGF0aW9uU3RhcnQoY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIGFkZEZpZWxkVmFsaWRhdGlvbkZpbmlzaChjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5vbkZpZWxkVmFsaWRhdGlvbkZpbmlzaChjb2RlcywgY2FsbGJhY2ssIHByb3BlcnRpZXMpO1xuICB9XG5cbiAgYWRkVGFibGVBY3Rpb25TdGFydChjb2RlOiBzdHJpbmcsIGFjdGlvbkNvZGU6IHN0cmluZywgY2FsbGJhY2ssIHByb3BlcnRpZXMgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMub25UYWJsZUFjdGlvblN0YXJ0KGNvZGUsIGFjdGlvbkNvZGUsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIGFkZFRhYmxlQWN0aW9uRmluaXNoKGNvZGU6IHN0cmluZywgYWN0aW9uQ29kZTogc3RyaW5nLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5vblRhYmxlQWN0aW9uRmluaXNoKGNvZGUsIGFjdGlvbkNvZGUsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIGFkZFRhYmxlU2VsZWN0aW9uU3RhcnQoY29kZTogc3RyaW5nLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5vblRhYmxlU2VsZWN0aW9uU3RhcnQoY29kZSwgY2FsbGJhY2ssIHByb3BlcnRpZXMpO1xuICB9XG5cbiAgYWRkVGFibGVTZWxlY3Rpb25GaW5pc2goY29kZTogc3RyaW5nLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5vblRhYmxlU2VsZWN0aW9uRmluaXNoKGNvZGUsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIGFkZFRhYmxlR2V0RGF0YVN0YXJ0KGNvZGU6IHN0cmluZywgY2FsbGJhY2ssIHByb3BlcnRpZXMgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMub25UYWJsZUdldERhdGFTdGFydChjb2RlLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICBhZGRUYWJsZUdldERhdGFGaW5pc2goY29kZTogc3RyaW5nLCBjYWxsYmFjaywgcHJvcGVydGllcyA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5vblRhYmxlR2V0RGF0YUZpbmlzaChjb2RlLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cbn1cbiJdfQ==
|