mmhglobal-dynamicform 2.34.0 → 2.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -0
- package/esm2020/lib/components/datalistingfieldbase.component.mjs +2 -2
- package/esm2020/lib/components/fieldbase.component.mjs +4 -1
- package/esm2020/lib/embed-components/input-field-addons/input-field-addons.component.mjs +1 -1
- package/esm2020/lib/kcard/kcard.component.mjs +1 -1
- package/esm2020/lib/services/main.service.mjs +2 -2
- package/esm2020/lib/services/zcomponent.debug.service.mjs +61 -53
- package/esm2020/lib/sfdatetimepicker/sfdatetimepicker.component.mjs +5 -3
- package/esm2020/lib/uiactionbutton/uiactionbutton.component.mjs +1 -1
- package/esm2020/lib/uibulletin/uibulletin.component.mjs +1 -1
- package/esm2020/lib/uicontent/uicontent.component.mjs +5 -3
- package/esm2020/lib/virtual-scroll/virtual-scroll.component.mjs +20 -3
- package/esm2020/lib/zbuttons/zbuttons.component.mjs +1 -1
- package/esm2020/lib/zcard/zcard.component.mjs +2 -2
- package/esm2020/lib/zdatetime/zdatetime.component.mjs +1 -1
- package/esm2020/lib/zform/zform.component.mjs +4 -3
- package/esm2020/lib/zgrid/container/zgrid-container.component.mjs +1 -1
- package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +139 -139
- package/esm2020/lib/zgrid/zgrid.component.mjs +57 -33
- package/esm2020/lib/zgrid/zgrid.service.mjs +62 -58
- package/esm2020/lib/zinput-container/zinput-container.component.mjs +2 -2
- package/esm2020/lib/zmodal/zmodal-mobile.component.mjs +1 -1
- package/esm2020/lib/zmodal/zmodal.component.mjs +1 -1
- package/esm2020/lib/zreport/zreport.component.mjs +11 -14
- package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +30 -23
- package/esm2020/lib/ztab/ztab.component.mjs +2 -2
- package/esm2020/lib/ztree/ztree.component.mjs +1 -1
- package/esm2020/lib/ztreelist/ztreelist.component.mjs +1 -1
- package/esm2020/lib/zudf/zudf.component.mjs +45 -10
- package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +1 -1
- package/fesm2015/mmhglobal-dynamicform.mjs +466 -377
- package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
- package/fesm2020/mmhglobal-dynamicform.mjs +445 -347
- package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
- package/lib/components/fieldbase.component.d.ts +1 -0
- package/lib/services/zcomponent.debug.service.d.ts +1 -0
- package/lib/sfdatetimepicker/sfdatetimepicker.component.d.ts +1 -0
- package/lib/uicontent/uicontent.component.d.ts +2 -0
- package/lib/virtual-scroll/virtual-scroll.component.d.ts +1 -0
- package/lib/zgrid/zgrid.binding.directive.d.ts +5 -6
- package/lib/zgrid/zgrid.component.d.ts +5 -3
- package/lib/zgrid/zgrid.service.d.ts +10 -16
- package/lib/zreport/zreport.component.d.ts +0 -1
- package/lib/zselectmultiple/zselectmultiple.component.d.ts +4 -1
- package/lib/zudf/zudf.component.d.ts +5 -2
- package/package.json +1 -1
|
@@ -3,12 +3,10 @@ import { Directive, Input, Inject } from "@angular/core";
|
|
|
3
3
|
/********** Ionic **********/
|
|
4
4
|
/********** Plugin **********/
|
|
5
5
|
import { of } from "rxjs";
|
|
6
|
-
import { switchMap, tap } from "rxjs/operators";
|
|
6
|
+
import { map, switchMap, tap } from "rxjs/operators";
|
|
7
7
|
import { DataBindingDirective, GridComponent } from "@progress/kendo-angular-grid";
|
|
8
|
-
/********** Component & Service **********/
|
|
9
|
-
import { GridSettingType, GridStateLogicType } from "./zgrid.service";
|
|
10
8
|
//import { MainService } from "../services/main.service";
|
|
11
|
-
import { ZComponentHelper,
|
|
9
|
+
import { ZComponentHelper, StateType } from "mmhglobal-zcore";
|
|
12
10
|
import * as i0 from "@angular/core";
|
|
13
11
|
import * as i1 from "mmhglobal-zcore";
|
|
14
12
|
import * as i2 from "./zgrid.service";
|
|
@@ -16,14 +14,15 @@ export class ZGridBindingDirective extends DataBindingDirective {
|
|
|
16
14
|
constructor(grid, // Injecting GridComponent provides access to the scope and context of the GridComponent.
|
|
17
15
|
webapiService, toastService,
|
|
18
16
|
//private mainService: MainService,
|
|
19
|
-
offlineDatabaseService
|
|
17
|
+
//private offlineDatabaseService: OfflineDatabaseService,
|
|
18
|
+
signalrService, gridService, loggingService, stateSettingService) {
|
|
20
19
|
super(grid);
|
|
21
20
|
this.webapiService = webapiService;
|
|
22
21
|
this.toastService = toastService;
|
|
23
|
-
this.offlineDatabaseService = offlineDatabaseService;
|
|
24
22
|
this.signalrService = signalrService;
|
|
25
23
|
this.gridService = gridService;
|
|
26
24
|
this.loggingService = loggingService;
|
|
25
|
+
this.stateSettingService = stateSettingService;
|
|
27
26
|
this.changeEvent = {
|
|
28
27
|
pageChanged: false,
|
|
29
28
|
filterChanged: false,
|
|
@@ -95,11 +94,24 @@ export class ZGridBindingDirective extends DataBindingDirective {
|
|
|
95
94
|
}
|
|
96
95
|
}
|
|
97
96
|
ngAfterViewInit() {
|
|
98
|
-
this.subscribeCacheDataChanges();
|
|
99
97
|
}
|
|
100
98
|
ngOnDestroy() {
|
|
101
99
|
super.ngOnDestroy();
|
|
102
100
|
}
|
|
101
|
+
retrieveGridStateCache(stateType, field) {
|
|
102
|
+
return this.gridService.getStateCache(stateType, field).pipe(map((settingCacheValue) => {
|
|
103
|
+
// If settingCacheValue is null or undefined, continue with a fallback value
|
|
104
|
+
return settingCacheValue;
|
|
105
|
+
}), tap((settingCacheValue) => {
|
|
106
|
+
if (settingCacheValue) {
|
|
107
|
+
const parsedJsonData = settingCacheValue;
|
|
108
|
+
if (parsedJsonData) {
|
|
109
|
+
this.gridSetting.gridState = parsedJsonData.gridState ?? this.gridSetting.gridState;
|
|
110
|
+
this.gridSetting.columnConfigurations = parsedJsonData.columnConfigurations ?? null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
103
115
|
setResourceUrl(resourceUrl) {
|
|
104
116
|
const array = resourceUrl.split("/api/");
|
|
105
117
|
if (!!array[1]) {
|
|
@@ -135,23 +147,19 @@ export class ZGridBindingDirective extends DataBindingDirective {
|
|
|
135
147
|
generateGridColumns() {
|
|
136
148
|
const columnFields$ = ZComponentHelper.getGroupValue(this.field.ColumnFields, this.grp);
|
|
137
149
|
if (columnFields$) {
|
|
138
|
-
columnFields$.pipe(
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const parsedJsonData = JSON.parse(decodeURIComponent(settingCacheValue));
|
|
145
|
-
if (parsedJsonData) {
|
|
146
|
-
columnsConfig = parsedJsonData.columnConfigurations ?? null;
|
|
147
|
-
this.gridSetting.gridState = parsedJsonData.gridState;
|
|
148
|
-
}
|
|
150
|
+
columnFields$.pipe(switchMap((data) => {
|
|
151
|
+
const gridStateLogic = this.gridService.getGridStateLogic(this.field);
|
|
152
|
+
if (gridStateLogic && gridStateLogic !== StateType.cachedDataSetting) {
|
|
153
|
+
return this.retrieveGridStateCache(StateType.savedSetting, this.field).pipe(map((state) => {
|
|
154
|
+
return data;
|
|
155
|
+
}));
|
|
149
156
|
}
|
|
157
|
+
return of(data);
|
|
158
|
+
}), tap((data) => {
|
|
150
159
|
this.gridSetting = {
|
|
151
160
|
...this.gridSetting,
|
|
152
161
|
columnField: data,
|
|
153
|
-
group: this.zgridbinding.group
|
|
154
|
-
columnConfigurations: columnsConfig
|
|
162
|
+
group: this.zgridbinding.group
|
|
155
163
|
};
|
|
156
164
|
ZComponentHelper.getGridColumns(this.gridSetting);
|
|
157
165
|
this.loggingService.debugLog('generated grid columns', this.gridSetting);
|
|
@@ -252,7 +260,7 @@ export class ZGridBindingDirective extends DataBindingDirective {
|
|
|
252
260
|
*/
|
|
253
261
|
getFilter() {
|
|
254
262
|
if (this.params.filters && this.field.Filters) {
|
|
255
|
-
// Combine 'params.filters' and 'field.Filters' using '&&' if both exist.
|
|
263
|
+
// Combine 'params.filters' and 'field.Filters' using '&&' if both exist.
|
|
256
264
|
this.params.filters = `${this.params.filters} && ${this.field.Filters}`;
|
|
257
265
|
}
|
|
258
266
|
else if (!this.params.filters && this.field.Filters) {
|
|
@@ -296,7 +304,7 @@ export class ZGridBindingDirective extends DataBindingDirective {
|
|
|
296
304
|
];
|
|
297
305
|
}
|
|
298
306
|
}
|
|
299
|
-
// Check if there are column filters in the grid state and append to filterparam
|
|
307
|
+
// Check if there are column filters in the grid state and append to filterparam
|
|
300
308
|
if (this.gridSetting.gridState?.filter?.filters) {
|
|
301
309
|
this.gridSetting.gridState.filter?.filters?.forEach((filter) => {
|
|
302
310
|
const filterParam = {
|
|
@@ -367,7 +375,7 @@ export class ZGridBindingDirective extends DataBindingDirective {
|
|
|
367
375
|
getGrantType() {
|
|
368
376
|
const grantType = this.field.GrantType;
|
|
369
377
|
// Check if 'grantType' is defined.
|
|
370
|
-
if (grantType) {
|
|
378
|
+
if (grantType != undefined) {
|
|
371
379
|
this.params.grantType = ZComponentHelper.getGroupValue(grantType.toString(), this.grp);
|
|
372
380
|
}
|
|
373
381
|
}
|
|
@@ -398,18 +406,19 @@ export class ZGridBindingDirective extends DataBindingDirective {
|
|
|
398
406
|
*/
|
|
399
407
|
getDataBinding(skipUseCache) {
|
|
400
408
|
this.grid.loading = true;
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
}
|
|
409
|
+
this.getGridData();
|
|
410
|
+
// const cacheInfo = this.zgridbinding.data.CacheInfo;
|
|
411
|
+
// if (!cacheInfo || skipUseCache) {
|
|
412
|
+
// this.getGridData();
|
|
413
|
+
// return;
|
|
414
|
+
// }
|
|
415
|
+
// if (cacheInfo) {
|
|
416
|
+
// const gridStateLogic = this.gridService.getGridStateLogic(this.field);
|
|
417
|
+
// if (gridStateLogic === GridStateLogicType.SettingOnly) {
|
|
418
|
+
// this.getGridData();
|
|
419
|
+
// return;
|
|
420
|
+
// }
|
|
421
|
+
// }
|
|
413
422
|
// comment out on 20241001. default to fetch the data from api instead of loading fromt he cache.
|
|
414
423
|
// if (!this.changeEvent.pageChanged && !this.changeEvent.sortChanged && !this.changeEvent.filterChanged) {
|
|
415
424
|
// const currentDataCacheInfo = this.gridService.generateCacheInfo(this.zgridbinding.data);
|
|
@@ -421,7 +430,7 @@ export class ZGridBindingDirective extends DataBindingDirective {
|
|
|
421
430
|
// }
|
|
422
431
|
// }
|
|
423
432
|
// else {
|
|
424
|
-
this.getGridData();
|
|
433
|
+
// this.getGridData();
|
|
425
434
|
// }
|
|
426
435
|
}
|
|
427
436
|
/**
|
|
@@ -440,7 +449,7 @@ export class ZGridBindingDirective extends DataBindingDirective {
|
|
|
440
449
|
this.params.pageNo = this.getPageNo(stateSkip, stateTake);
|
|
441
450
|
this.params.pageSize = stateTake;
|
|
442
451
|
if (this.field.ExternalPagination) {
|
|
443
|
-
// For POST method Page WebAPI
|
|
452
|
+
// For POST method Page WebAPI
|
|
444
453
|
this.webapiService
|
|
445
454
|
.postApi(this.paginationApiPostUrl, this.params, null, null, null, null, true)
|
|
446
455
|
.subscribe({
|
|
@@ -482,10 +491,9 @@ export class ZGridBindingDirective extends DataBindingDirective {
|
|
|
482
491
|
this.aggregateHandling(data.dataSet);
|
|
483
492
|
this.grid.data = { data: data.dataSet, total: data.totalCount };
|
|
484
493
|
if (!skipCacheData) {
|
|
485
|
-
const
|
|
486
|
-
if (
|
|
487
|
-
this.cacheGridData();
|
|
488
|
-
this.subscribeCacheDataChanges();
|
|
494
|
+
const stateLogic = this.gridService.getGridStateLogic(this.field);
|
|
495
|
+
if (stateLogic === StateType.cachedDataSetting || stateLogic === StateType.savedAndCachedDataSetting) {
|
|
496
|
+
this.cacheGridData(stateLogic);
|
|
489
497
|
}
|
|
490
498
|
}
|
|
491
499
|
this.grid.loading = false;
|
|
@@ -500,8 +508,8 @@ export class ZGridBindingDirective extends DataBindingDirective {
|
|
|
500
508
|
sortChanged: false
|
|
501
509
|
};
|
|
502
510
|
}
|
|
503
|
-
|
|
504
|
-
const
|
|
511
|
+
cacheGridData(stateLogic) {
|
|
512
|
+
const cacheName = this.stateSettingService.getStorageCacheKey(stateLogic, this.field);
|
|
505
513
|
const gridState = this.gridSetting.gridState;
|
|
506
514
|
const gridData = this.grid?.data || null;
|
|
507
515
|
if (!gridData['data']) {
|
|
@@ -509,18 +517,10 @@ export class ZGridBindingDirective extends DataBindingDirective {
|
|
|
509
517
|
}
|
|
510
518
|
const cacheInfo = this.zgridbinding.data.CacheInfo;
|
|
511
519
|
if (cacheInfo && !cacheInfo.DisableCacheData) {
|
|
512
|
-
|
|
513
|
-
const originalDataCacheInfo = this.gridService.generateCacheInfo(this.zgridbinding.data);
|
|
514
|
-
const result = await this.offlineDatabaseService.getItemByKey(originalDataCacheInfo, originalDataCacheInfo.offlineDatabaseKey);
|
|
520
|
+
const columnConfigurations = ZComponentHelper.getGridColumnsConfig(this.zgridbinding.gridSetting.columns);
|
|
515
521
|
let updatedData = [...gridData['data']];
|
|
516
522
|
let skipList = [gridState.skip];
|
|
517
523
|
let currentGridSkip = gridState.skip;
|
|
518
|
-
if (originalDataCacheInfo.appendPaginationData) {
|
|
519
|
-
if (result && !result.skipList.includes(currentGridSkip)) {
|
|
520
|
-
updatedData = [...result.data.dataSet, ...gridData['data']];
|
|
521
|
-
skipList = [...result.skipList, ...skipList];
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
524
|
const cacheGridData = {
|
|
525
525
|
data: {
|
|
526
526
|
dataSet: updatedData,
|
|
@@ -529,91 +529,91 @@ export class ZGridBindingDirective extends DataBindingDirective {
|
|
|
529
529
|
gridState: gridState,
|
|
530
530
|
skipList: skipList,
|
|
531
531
|
cacheDuration: cacheInfo.CacheDuration,
|
|
532
|
-
|
|
532
|
+
columnConfigurations: columnConfigurations
|
|
533
533
|
};
|
|
534
|
-
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
//"FeatureDevelopment|Competency"
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
}
|
|
534
|
+
sessionStorage.setItem(cacheName, JSON.stringify(cacheGridData));
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
//"FeatureDevelopment|Competency"
|
|
538
|
+
// commented out for future reference and re-develop.
|
|
539
|
+
// private async subscribeCacheDataChanges() {
|
|
540
|
+
// const cacheInfo = this.zgridbinding.data.CacheInfo;
|
|
541
|
+
// if (cacheInfo && !cacheInfo.DisableCacheData) {
|
|
542
|
+
// // cannot use main service here. will get circular error when build lib
|
|
543
|
+
// //this.mainService.joinProjectSignalR();
|
|
544
|
+
// const callBackFunction = `${cacheInfo.Name}_handleReceivedMessage`;
|
|
545
|
+
// // create and bind a function to be called back for the grid in the group trigger by signalR.
|
|
546
|
+
// if (!this.grp.signalRCallbackHandler) {
|
|
547
|
+
// this.grp.signalRCallbackHandler = {};
|
|
548
|
+
// }
|
|
549
|
+
// this.grp.signalRCallbackHandler[callBackFunction] = this.handleReceivedMessage.bind(this);
|
|
550
|
+
// const generatedCacheInfo = this.gridService.generateCacheInfo(this.zgridbinding.data);
|
|
551
|
+
// if (generatedCacheInfo.definedDatabase && generatedCacheInfo.definedTable) {
|
|
552
|
+
// generatedCacheInfo.definedDatabase.forEach(db => {
|
|
553
|
+
// generatedCacheInfo.definedTable.forEach(table => {
|
|
554
|
+
// const eventName = `${db}|${table}`;
|
|
555
|
+
// console.log(`Listening to event name: ${eventName}`);
|
|
556
|
+
// this.signalrService.subscribeToEvent(this.grp, `${eventName}`, `group.signalRCallbackHandler.${callBackFunction}`);
|
|
557
|
+
// });
|
|
558
|
+
// });
|
|
559
|
+
// }
|
|
560
|
+
// }
|
|
561
|
+
// }
|
|
562
|
+
// async handleReceivedMessage(group: ZGroup, result: any, eventName: string) {
|
|
563
|
+
// console.log(`The Signalr trigger has been detected. Now, proceed to update the cache and grid data.`);
|
|
564
|
+
// const responsedResult = JSON.parse(result);
|
|
565
|
+
// const actionType = responsedResult.Action;
|
|
566
|
+
// const responsedResultId = responsedResult['Id'];
|
|
567
|
+
// const tempParams = ZComponentHelper.deepClone(this.params);
|
|
568
|
+
// const currentDataCacheInfo = this.gridService.generateCacheInfo(this.zgridbinding.data);
|
|
569
|
+
// const currentData = await this.offlineDatabaseService.getItemByKey(currentDataCacheInfo, currentDataCacheInfo.offlineDatabaseKey);
|
|
570
|
+
// if (currentData) {
|
|
571
|
+
// tempParams.filters = `Id=${responsedResultId}`;
|
|
572
|
+
// if (actionType === ActionType.Delete) {
|
|
573
|
+
// currentData.data.dataSet = currentData.data.dataSet.filter(item => item.Id !== parseInt(responsedResultId));
|
|
574
|
+
// this.handleGetDataBindingComplete(currentData.data, true);
|
|
575
|
+
// await this.offlineDatabaseService.updateItem(currentDataCacheInfo, currentData);
|
|
576
|
+
// this.handleGetDataBindingComplete(currentData.data, true);
|
|
577
|
+
// console.log(`Item updated: ${currentData}`);
|
|
578
|
+
// }
|
|
579
|
+
// else {
|
|
580
|
+
// this.webapiService.postApi(this.paginationApiPostUrl, tempParams, null, null, null, null, true).subscribe(async resp => {
|
|
581
|
+
// const databaseRecord = resp.dataSet[0];
|
|
582
|
+
// if (databaseRecord) {
|
|
583
|
+
// if (actionType === ActionType.Update) {
|
|
584
|
+
// const indexToUpdate = currentData.data.dataSet.findIndex(item => item.Id === databaseRecord.Id);
|
|
585
|
+
// if (indexToUpdate !== -1) {
|
|
586
|
+
// // Create a new object with the updated name
|
|
587
|
+
// const updatedItem = { ...currentData.data.dataSet[indexToUpdate], ...databaseRecord };
|
|
588
|
+
// // Replace the old item with the updated one
|
|
589
|
+
// currentData.data.dataSet[indexToUpdate] = updatedItem;
|
|
590
|
+
// this.handleGetDataBindingComplete(currentData.data, true);
|
|
591
|
+
// await this.offlineDatabaseService.updateItem(currentDataCacheInfo, currentData);
|
|
592
|
+
// console.log(`Item updated: ${currentData}`);
|
|
593
|
+
// } else {
|
|
594
|
+
// console.log("Item not found with ID:", databaseRecord.Id);
|
|
595
|
+
// }
|
|
596
|
+
// }
|
|
597
|
+
// else if (actionType === ActionType.Add && currentData.gridState.skip < 20) {
|
|
598
|
+
// currentData.data.dataSet.unshift(databaseRecord);
|
|
599
|
+
// this.handleGetDataBindingComplete(currentData.data, true);
|
|
600
|
+
// await this.offlineDatabaseService.updateItem(currentDataCacheInfo, currentData);
|
|
601
|
+
// this.handleGetDataBindingComplete(currentData.data, true);
|
|
602
|
+
// console.log(`Item updated: ${currentData}`);
|
|
603
|
+
// }
|
|
604
|
+
// }
|
|
605
|
+
// else {
|
|
606
|
+
// // Unable to get data, refresh the whole grid data from API
|
|
607
|
+
// this.getGridData();
|
|
608
|
+
// }
|
|
609
|
+
// });
|
|
610
|
+
// }
|
|
611
|
+
// }
|
|
612
|
+
// else {
|
|
613
|
+
// // Unable to get from indexedDB straight get from API
|
|
614
|
+
// this.getGridData();
|
|
615
|
+
// }
|
|
616
|
+
// }
|
|
617
617
|
afterDataBinded(data) {
|
|
618
618
|
// allow to call back project page after data binded.
|
|
619
619
|
let bindedValue = this.zgridbinding.data['AfterDataBinded'];
|
|
@@ -837,7 +837,7 @@ export class ZGridBindingDirective extends DataBindingDirective {
|
|
|
837
837
|
this.loggingService.debugLog('generated grid columns', this.gridSetting);
|
|
838
838
|
}
|
|
839
839
|
}
|
|
840
|
-
ZGridBindingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZGridBindingDirective, deps: [{ token: GridComponent }, { token: i1.WebApiService }, { token: i1.ToastService }, { token: i1.
|
|
840
|
+
ZGridBindingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZGridBindingDirective, deps: [{ token: GridComponent }, { token: i1.WebApiService }, { token: i1.ToastService }, { token: i1.SignalrService }, { token: i2.ZGridService }, { token: i1.LoggingService }, { token: i1.StateSettingService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
841
841
|
ZGridBindingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.3", type: ZGridBindingDirective, selector: "[zgridbinding]", inputs: { zgridbinding: "zgridbinding" }, usesInheritance: true, ngImport: i0 });
|
|
842
842
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZGridBindingDirective, decorators: [{
|
|
843
843
|
type: Directive,
|
|
@@ -847,7 +847,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
|
|
|
847
847
|
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
848
848
|
type: Inject,
|
|
849
849
|
args: [GridComponent]
|
|
850
|
-
}] }, { type: i1.WebApiService }, { type: i1.ToastService }, { type: i1.
|
|
850
|
+
}] }, { type: i1.WebApiService }, { type: i1.ToastService }, { type: i1.SignalrService }, { type: i2.ZGridService }, { type: i1.LoggingService }, { type: i1.StateSettingService }]; }, propDecorators: { zgridbinding: [{
|
|
851
851
|
type: Input
|
|
852
852
|
}] } });
|
|
853
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemdyaWQuYmluZGluZy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96Z3JpZC96Z3JpZC5iaW5kaW5nLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBcUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1RSw2QkFBNkI7QUFFN0IsOEJBQThCO0FBQzlCLE9BQU8sRUFBdUIsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGFBQWEsRUFBeUMsTUFBTSw4QkFBOEIsQ0FBQztBQUcxSCwyQ0FBMkM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBZ0IsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRix5REFBeUQ7QUFDekQsT0FBTyxFQUNMLGdCQUFnQixFQUM2RCxVQUFVLEVBQ3hGLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFNekIsTUFBTSxPQUFPLHFCQUFzQixTQUFRLG9CQUFvQjtJQXdEN0QsWUFDeUIsSUFBSSxFQUFFLHlGQUF5RjtJQUM5RyxhQUE0QixFQUM1QixZQUEwQjtJQUNsQyxtQ0FBbUM7SUFDM0Isc0JBQThDLEVBQzlDLGNBQThCLEVBQzlCLFdBQXlCLEVBQ3pCLGNBQThCO1FBRXRDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQVJKLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBRTFCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxD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VTtZQUN0QixRQUFRLEVBQUUsUUFBUTtZQUNsQixXQUFXLEVBQUUsV0FBVztTQUN6QixDQUFDO1FBQ0YscUNBQXFDO1FBQ3JDLElBQUksUUFBUSxLQUFLLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsRUFBRTtZQUN0RSxPQUFPLFVBQVUsQ0FBQztTQUNuQjtRQUVELGdEQUFnRDtRQUNoRCxPQUFPLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM1QyxDQUFDO0lBRU8sU0FBUyxDQUFDLFNBQWlCLEVBQUUsU0FBaUI7UUFDcEQsT0FBTyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsZ0NBQWdDO0lBQ2hDLHlCQUF5QjtJQUN6QiwrREFBK0Q7SUFDL0QsaURBQWlEO0lBQ2pELHNDQUFzQztJQUUvQixVQUFVLENBQUMsT0FBYztRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7UUFDdkMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0UsQ0FBQzs7a0hBMzlCVSxxQkFBcUIsa0JBeUR0QixhQUFhO3NHQXpEWixxQkFBcUI7MkZBQXJCLHFCQUFxQjtrQkFIakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO2lCQUMzQjs7MEJBMERJLE1BQU07MkJBQUMsYUFBYTs2TkFsRGQsWUFBWTtzQkFBcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgRGlyZWN0aXZlLCBPbkluaXQsIE9uRGVzdHJveSwgSW5wdXQsIEluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIG9mIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHsgRGF0YUJpbmRpbmdEaXJlY3RpdmUsIEdyaWRDb21wb25lbnQsIERhdGFTdGF0ZUNoYW5nZUV2ZW50LCBQYWdlQ2hhbmdlRXZlbnQgfSBmcm9tIFwiQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZ3JpZFwiO1xyXG5pbXBvcnQgeyBTb3J0RGVzY3JpcHRvciwgRmlsdGVyRGVzY3JpcHRvciwgfSBmcm9tIFwiQHByb2dyZXNzL2tlbmRvLWRhdGEtcXVlcnlcIjtcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHsgR3JpZFNldHRpbmdUeXBlLCBHcmlkU3RhdGVMb2dpY1R5cGUsIFpHcmlkU2VydmljZSB9IGZyb20gXCIuL3pncmlkLnNlcnZpY2VcIjtcclxuLy9pbXBvcnQgeyBNYWluU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9tYWluLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtcclxuICBaQ29tcG9uZW50SGVscGVyLCBaRmllbGQsIFpHcmlkUG9zdEFwaVBhcmFtcyxcclxuICBXZWJBcGlTZXJ2aWNlLCBaR3JvdXAsIFRvYXN0U2VydmljZSwgT2ZmbGluZURhdGFiYXNlU2VydmljZSwgU2lnbmFsclNlcnZpY2UsIEFjdGlvblR5cGUsIFpHcmlkQ29sdW1uQ29uZmlncywgWkdyaWRTZXR0aW5ncywgTG9nZ2luZ1NlcnZpY2UsIFpHcmlkRmlsdGVyUGFyYW1zXHJcbn0gZnJvbSBcIm1taGdsb2JhbC16Y29yZVwiO1xyXG5cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiBcIlt6Z3JpZGJpbmRpbmddXCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBaR3JpZEJpbmRpbmdEaXJlY3RpdmUgZXh0ZW5kcyBEYXRhQmluZGluZ0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIGNoYW5nZUV2ZW50ID0ge1xyXG4gICAgcGFnZUNoYW5nZWQ6IGZhbHNlLFxyXG4gICAgZmlsdGVyQ2hhbmdlZDogZmFsc2UsXHJcbiAgICBzb3J0Q2hhbmdlZDogZmFsc2VcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHpncmlkYmluZGluZzoge1xyXG4gICAgZGF0YTogWkZpZWxkO1xyXG4gICAgZ3JvdXA6IFpHcm91cDtcclxuICAgIHBhcmFtczogWkdyaWRQb3N0QXBpUGFyYW1zO1xyXG4gICAgZ3JpZFN1YmplY3Q6IFN1YmplY3Q8YW55PjtcclxuICAgIGdyaWRTZXR0aW5nOiBaR3JpZFNldHRpbmdzO1xyXG4gIH07XHJcblxyXG4gIC8vc3RhdGU6IFN0YXRlID0ge1xyXG4gIC8vICBza2lwOiAwLFxyXG4gIC8vICB0YWtlOiAxMCxcclxuICAvL307XHJcblxyXG4gIC8vZ3JpZENvbHVtbnM6IGFueVtdID0gW107XHJcblxyXG4gIC8vdXNhYmxlQ29sdW1uczogYW55W10gPSBbXTtcclxuXHJcbiAgcmVzb3VyY2VVUkwgPSBudWxsO1xyXG5cclxuICBwYWdpbmF0aW9uQXBpUG9zdFVybCA9IG51bGw7XHJcblxyXG4gIGRhdGFTb3VyY2UgPSBudWxsO1xyXG5cclxuICBnZXQgZ3JpZFNldHRpbmcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcuZ3JpZFNldHRpbmc7XHJcbiAgfVxyXG4gIHNldCBncmlkU2V0dGluZyh2YWx1ZSkge1xyXG4gICAgdGhpcy56Z3JpZGJpbmRpbmcuZ3JpZFNldHRpbmcgPSB2YWx1ZTtcclxuICB9XHJcbiAgZ2V0IGZpZWxkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLmRhdGE7XHJcbiAgfVxyXG5cclxuICBnZXQgZ3JwKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLmdyb3VwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdyaWRTdWJqZWN0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLmdyaWRTdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhcmFtcygpOiBaR3JpZFBvc3RBcGlQYXJhbXMge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLnBhcmFtcztcclxuICB9XHJcblxyXG4gIGdldCBnZXREYXRhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZC5kYXRhO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KEdyaWRDb21wb25lbnQpIGdyaWQsIC8vIEluamVjdGluZyBHcmlkQ29tcG9uZW50IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgc2NvcGUgYW5kIGNvbnRleHQgb2YgdGhlIEdyaWRDb21wb25lbnQuXHJcbiAgICBwcml2YXRlIHdlYmFwaVNlcnZpY2U6IFdlYkFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgLy9wcml2YXRlIG1haW5TZXJ2aWNlOiBNYWluU2VydmljZSxcclxuICAgIHByaXZhdGUgb2ZmbGluZURhdGFiYXNlU2VydmljZTogT2ZmbGluZURhdGFiYXNlU2VydmljZSxcclxuICAgIHByaXZhdGUgc2lnbmFsclNlcnZpY2U6IFNpZ25hbHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBncmlkU2VydmljZTogWkdyaWRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsb2dnaW5nU2VydmljZTogTG9nZ2luZ1NlcnZpY2VcclxuICApIHtcclxuICAgIHN1cGVyKGdyaWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICB0aGlzLmdyaWQubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5maWVsZC5QYWdlU2l6ZSB8fCAyMDtcclxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuZmllbGQuRGF0YVNvdXJjZSA/PyBudWxsO1xyXG5cclxuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XHJcbiAgICAgIHRoaXMucmVzb3VyY2VVUkwgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgICAgdGhpcy5maWVsZC5SZXNvdXJjZVVSTCxcclxuICAgICAgICB0aGlzLmdycFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLnJlc291cmNlVVJMKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5OYW1lICE9PSBcIkFjdGl2aXR5TG9nR3JpZFwiKSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICAgIFwiTm8gaW5pdGlhbGlzZSBmb3IgRmllbGQuUmVzb3VyY2VVUkw6IFwiLFxyXG4gICAgICAgICAgICB0aGlzLmZpZWxkLlJlc291cmNlVVJMXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc2V0UmVzb3VyY2VVcmwodGhpcy5yZXNvdXJjZVVSTCk7XHJcblxyXG4gICAgICB0aGlzLnNldEZpbHRlclBhcmFtc0J5UGFyZW50UmVmSWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWVsZC5EaXNhYmxlR2VuZXJhdGVDb2x1bW5CeUZvcm0pIHtcclxuICAgICAgY29uc3QgY29sdW1uRmllbGRzID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHRoaXMuZmllbGQuQ29sdW1uRmllbGRzLCB0aGlzLmdycCk7XHJcblxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2x1bW5GaWVsZHMpKSB7XHJcbiAgICAgICAgdGhpcy5zZXRDb2x1bW5zKGNvbHVtbkZpZWxkcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmZpZWxkWydTa2lwTG9hZFJlc291cmNlVVJMRGF0YSddKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmdyaWRTdWJqZWN0Lm5leHQodGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5nZW5lcmF0ZUdyaWRDb2x1bW5zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLnN1YnNjcmliZUNhY2hlRGF0YUNoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0UmVzb3VyY2VVcmwocmVzb3VyY2VVcmw6IHN0cmluZykge1xyXG4gICAgY29uc3QgYXJyYXkgPSByZXNvdXJjZVVybC5zcGxpdChcIi9hcGkvXCIpO1xyXG4gICAgaWYgKCEhYXJyYXlbMV0pIHtcclxuICAgICAgYXJyYXlbMV0gPSBcIlBhZ2VcIiArIGFycmF5WzFdO1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsID0gYXJyYXkuam9pbihcIi9hcGkvXCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgYXJyID0gdGhpcy5yZXNvdXJjZVVSTC5zcGxpdChcIi9cIik7XHJcbiAgICAgIGFyclthcnIubGVuZ3RoIC0gMl0gPSBcIlBhZ2VcIiArIGFyclthcnIubGVuZ3RoIC0gMl07XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvbkFwaVBvc3RVcmwgPSBhcnIuam9pbihcIi9cIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEZpbHRlclBhcmFtc0J5UGFyZW50UmVmSWQoKSB7XHJcbiAgICAvLyBVc2UgZmllbGQgb3duIHJlZmVyZW5jZUlkIGlmIGF2YWlsYWJsZVxyXG4gICAgY29uc3QgcmVmSWQgPSB0aGlzLmdldEZpZWxkUmVmZXJlbmNlSWQoKSB8fCB0aGlzLmdycC5yZWZlcmVuY2VJZDtcclxuICAgIGNvbnN0IHJlZkZpZWxkID0gdGhpcy5maWVsZC5SZWZlcmVuY2VGaWVsZCB8fCB0aGlzLmdycC5wYXJlbnRSZWZlcmVuY2VGaWVsZDtcclxuICAgIGlmIChyZWZJZCAmJiByZWZGaWVsZCkge1xyXG4gICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHtcclxuICAgICAgICBrZXk6IHJlZkZpZWxkLFxyXG4gICAgICAgIG9wczogXCI9XCIsXHJcbiAgICAgICAgdmFsdWU6IHJlZklkLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLnB1c2goZmlsdGVyVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGaWVsZFJlZmVyZW5jZUlkKCkge1xyXG4gICAgbGV0IGZpZWxkUmVmZXJlbmNlSWQgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuZmllbGQuUmVmZXJlbmNlSWQpIHtcclxuICAgICAgZmllbGRSZWZlcmVuY2VJZCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgICB0aGlzLmZpZWxkLlJlZmVyZW5jZUlkLFxyXG4gICAgICAgIHRoaXMuZ3JwXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmllbGRSZWZlcmVuY2VJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZW5lcmF0ZUdyaWRDb2x1bW5zKCkge1xyXG4gICAgY29uc3QgY29sdW1uRmllbGRzJDogT2JzZXJ2YWJsZTxhbnk+ID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICB0aGlzLmZpZWxkLkNvbHVtbkZpZWxkcyxcclxuICAgICAgdGhpcy5ncnBcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGNvbHVtbkZpZWxkcyQpIHtcclxuICAgICAgY29sdW1uRmllbGRzJC5waXBlKFxyXG4gICAgICAgIHRhcCgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGNvbHVtbnNDb25maWcgPSBudWxsO1xyXG5cclxuICAgICAgICAgIC8vIE5vdGU6IE9idGFpbmluZyB0aGUgZ3JpZCBzdGF0ZSBpcyBkdXJpbmcgaW5pdGlhbGl6YXRpb247IGlmIG5vdCwgaXQgd2lsbCBwcmV2ZW50IHRoZSBncmlkIGZyb20gbG9hZGluZy5cclxuICAgICAgICAgIGNvbnN0IHNldHRpbmdDYWNoZU5hbWUgPSB0aGlzLmdyaWRTZXJ2aWNlLmdldEdyaWRTdGF0ZUNhY2hlU3RvcmFnZUtleShHcmlkU2V0dGluZ1R5cGUuU2F2ZWRTZXR0aW5nLCB0aGlzLmZpZWxkKTtcclxuICAgICAgICAgIGNvbnN0IHNldHRpbmdDYWNoZVZhbHVlID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShzZXR0aW5nQ2FjaGVOYW1lKTtcclxuICAgICAgICAgIGlmIChzZXR0aW5nQ2FjaGVWYWx1ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRKc29uRGF0YSA9IEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KHNldHRpbmdDYWNoZVZhbHVlKSkgYXMgWkdyaWRTZXR0aW5ncztcclxuICAgICAgICAgICAgaWYgKHBhcnNlZEpzb25EYXRhKSB7XHJcbiAgICAgICAgICAgICAgY29sdW1uc0NvbmZpZyA9IHBhcnNlZEpzb25EYXRhLmNvbHVtbkNvbmZpZ3VyYXRpb25zID8/IG51bGw7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUgPSBwYXJzZWRKc29uRGF0YS5ncmlkU3RhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmdyaWRTZXR0aW5nID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmdyaWRTZXR0aW5nLCAvLyBQcmVzZXJ2ZSBleGlzdGluZyBwcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgIGNvbHVtbkZpZWxkOiBkYXRhLFxyXG4gICAgICAgICAgICBncm91cDogdGhpcy56Z3JpZGJpbmRpbmcuZ3JvdXAsXHJcbiAgICAgICAgICAgIGNvbHVtbkNvbmZpZ3VyYXRpb25zOiBjb2x1bW5zQ29uZmlnXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgWkNvbXBvbmVudEhlbHBlci5nZXRHcmlkQ29sdW1ucyh0aGlzLmdyaWRTZXR0aW5nKTtcclxuICAgICAgICAgIHRoaXMubG9nZ2luZ1NlcnZpY2UuZGVidWdMb2coJ2dlbmVyYXRlZCBncmlkIGNvbHVtbnMnLCB0aGlzLmdyaWRTZXR0aW5nKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmdldEZpbHRlclBhcmFtc0NvbHVtbnMoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0RmlsdGVyKCk7XHJcbiAgICAgICAgICB0aGlzLmdldEZpbHRlclBhcmFtcygpO1xyXG4gICAgICAgICAgdGhpcy5nZXRTb3J0aW5nKCk7XHJcbiAgICAgICAgICB0aGlzLmdldEdyYW50VHlwZSgpO1xyXG4gICAgICAgICAgdGhpcy5zZXRIaWRkZW5Db2x1bW4odGhpcy5ncmlkU2V0dGluZy5jb2x1bW5Db25maWd1cmF0aW9ucyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5wYXJhbXMucmVmZXJJZCA9IHRoaXMuZ2V0RmllbGRSZWZlcmVuY2VJZCgpIHx8IHRoaXMuZ3JwLnJlZmVyZW5jZUlkIHx8IG51bGw7XHJcbiAgICAgICAgfSlcclxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmZpZWxkWydTa2lwTG9hZFJlc291cmNlVVJMRGF0YSddKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWQubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignRmFpbCB0byBnZW5lcmF0ZSBncmlkIGNvbHVtbiBmaWVsZHMuJyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuZmllbGQuQ29sdW1uRmllbGRzKTtcclxuICAgICAgY29uc29sZS5sb2codGhpcy5ncnApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNraXBMb2FkUmVzb3VyY2VVUkxEYXRhKHNldHRpbmdWYWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5maWVsZFsnU2tpcExvYWRSZXNvdXJjZVVSTERhdGEnXSA9ICFzZXR0aW5nVmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgdGhlIHRpdGxlIG9mIGEgY29sdW1uIGluIHRoZSBncmlkIHNldHRpbmcgYmFzZWQgb24gaXRzIHZhbHVlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbFZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xOYW1lIC0gVGhlIG5ldyB0aXRsZSBmb3IgdGhlIGNvbHVtbi5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgc2V0Q29sdW1uTmFtZShjb2xWYWx1ZTogc3RyaW5nLCBjb2xOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIEZpbmQgdGhlIGNvbHVtbiB3aXRoIHRoZSBtYXRjaGluZyBjb2xWYWx1ZS5cclxuICAgIGNvbnN0IGNvbHVtblRvVXBkYXRlID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoZmllbGQgPT4gZmllbGQuVmFsdWUgPT09IGNvbFZhbHVlKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgY29sdW1uIGlzIGZvdW5kLCB1cGRhdGUgaXRzIHRpdGxlIHByb3BlcnR5IHdpdGggY29sTmFtZS5cclxuICAgIGlmIChjb2x1bW5Ub1VwZGF0ZSkge1xyXG4gICAgICBjb2x1bW5Ub1VwZGF0ZS50aXRsZSA9IGNvbE5hbWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHZpc2liaWxpdHkgb2YgYSBjb2x1bW4gaW4gdGhlIGdyaWQgYmFzZWQgb24gaXRzIHZhbHVlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbFZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4gdG8gc2V0IHZpc2liaWxpdHkgZm9yLlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNWaXNpYmxlIC0gV2hldGhlciB0aGUgY29sdW1uIHNob3VsZCBiZSB2aXNpYmxlICh0cnVlKSBvciBoaWRkZW4gKGZhbHNlKS5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgc2V0Q29sdW1uVmlzaWJsZShjb2xWYWx1ZTogc3RyaW5nLCBpc1Zpc2libGU6IGJvb2xlYW4pIHtcclxuICAgIC8vIEZpbmQgdGhlIGNvbHVtbiB3aXRoIHRoZSBtYXRjaGluZyBjb2xWYWx1ZS5cclxuICAgIGNvbnN0IGNvbHVtblRvVXBkYXRlID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoZmllbGQgPT4gZmllbGQuVmFsdWUgPT09IGNvbFZhbHVlKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgY29sdW1uIGlzIGZvdW5kLCB1cGRhdGUgaXRzICdoaWRkZW4nIHByb3BlcnR5IGJhc2VkIG9uICdpc1Zpc2libGUnLlxyXG4gICAgaWYgKGNvbHVtblRvVXBkYXRlKSB7XHJcbiAgICAgIGNvbHVtblRvVXBkYXRlLmhpZGRlbiA9ICFpc1Zpc2libGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBmaWx0ZXIgcGFyYW1ldGVycyBmb3IgY29sdW1ucyBhbmQgc2V0IHRoZW0gaW4gdGhlICdwYXJhbXMnIG9iamVjdC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsdGVyUGFyYW1zQ29sdW1ucygpIHtcclxuICAgIC8vIENyZWF0ZSBhbiBhcnJheSB0byBzdG9yZSBjb2x1bW4gZmllbGRzLlxyXG4gICAgY29uc3QgY29sRmllbGRzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcblxyXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBncmlkIGNvbHVtbnMgdG8gYnVpbGQgY29sdW1uIGZpZWxkIHN0cmluZ3MuXHJcbiAgICB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgIGlmIChjb2x1bW4udmFsdWVFeHByKSB7XHJcbiAgICAgICAgLy8gSWYgJ3ZhbHVlRXhwcicgZXhpc3RzLCB1c2UgaXQgYXMgYW4gYWxpYXMgZm9yIHRoZSBmaWVsZC5cclxuICAgICAgICBjb2xGaWVsZHMucHVzaChjb2x1bW4udmFsdWVFeHByICsgXCIgYXMgXCIgKyBjb2x1bW4uZmllbGQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbEZpZWxkcy5wdXNoKGNvbHVtbi5maWVsZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIENoZWNrIGlmICdJZCcgaXMgaW4gdGhlIGNvbHVtbiBmaWVsZHM7IGlmIG5vdCwgYWRkIGl0LlxyXG4gICAgaWYgKGNvbEZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGlmIChjb2xGaWVsZHMuaW5kZXhPZihcIklkXCIpID09PSAtMSkge1xyXG4gICAgICAgIGNvbEZpZWxkcy5wdXNoKFwiSWRcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDcmVhdGUgYW4gYXJyYXkgdG8gdGVtcG9yYXJpbHkgc3RvcmUgdGhlIGdlbmVyYXRlZCBjb2x1bW4gZmllbGRzLlxyXG4gICAgY29uc3QgdG1wR3JpZENvbHVtbjogYW55W10gPSBbXTtcclxuICAgIHRtcEdyaWRDb2x1bW4ucHVzaChjb2xGaWVsZHMuam9pbihcIixcIikpO1xyXG5cclxuICAgIC8vIElmIHRoZXJlIGFyZSBnZW5lcmF0ZUhpZGRlbkNvbHVtbnMgaW4gdGhlIHNldHRpbmcsIGFkZCB0aGVtIHRvIHRoZSBhcnJheS5cclxuICAgIGlmICh0aGlzLmdyaWRTZXR0aW5nLmdlbmVyYXRlSGlkZGVuQ29sdW1ucz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0bXBHcmlkQ29sdW1uLnB1c2godGhpcy5ncmlkU2V0dGluZy5nZW5lcmF0ZUhpZGRlbkNvbHVtbnMuam9pbihcIixcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNldCB0aGUgJ3BhcmFtcy5jb2x1bW5zJyBwcm9wZXJ0eSB3aXRoIHRoZSBjb25jYXRlbmF0ZWQgY29sdW1uIGZpZWxkcy5cclxuICAgIHRoaXMucGFyYW1zLmNvbHVtbnMgPSB0bXBHcmlkQ29sdW1uLmpvaW4oXCIsXCIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSAncGFyYW1zLmZpbHRlcnMnIHByb3BlcnR5IGJhc2VkIG9uIHRoZSAnZmllbGQuRmlsdGVycycgcHJvcGVydHkuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbHRlcigpIHtcclxuICAgIGlmICh0aGlzLnBhcmFtcy5maWx0ZXJzICYmIHRoaXMuZmllbGQuRmlsdGVycykge1xyXG4gICAgICAvLyBDb21iaW5lICdwYXJhbXMuZmlsdGVycycgYW5kICdmaWVsZC5GaWx0ZXJzJyB1c2luZyAnJiYnIGlmIGJvdGggZXhpc3QuIFxyXG4gICAgICB0aGlzLnBhcmFtcy5maWx0ZXJzID0gYCR7dGhpcy5wYXJhbXMuZmlsdGVyc30gJiYgJHt0aGlzLmZpZWxkLkZpbHRlcnN9YDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCF0aGlzLnBhcmFtcy5maWx0ZXJzICYmIHRoaXMuZmllbGQuRmlsdGVycykge1xyXG4gICAgICAvLyBVc2UgJ2ZpZWxkLkZpbHRlcnMnIGRpcmVjdGx5IGlmICdwYXJhbXMuZmlsdGVycycgZG9lc24ndCBleGlzdC5cclxuICAgICAgdGhpcy5wYXJhbXMuZmlsdGVycyA9IHRoaXMuZmllbGQuRmlsdGVycztcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiAnZmllbGQuRmlsdGVycycgY29udGFpbnMgcmVmZXJlbmNlcyB0byAnZ3JvdXAuJyBhbmQgcmVwbGFjZSB0aGVtIHdpdGggYWN0dWFsIHZhbHVlcy5cclxuICAgIGlmICh0aGlzLmZpZWxkLkZpbHRlcnMgJiYgdGhpcy5maWVsZC5GaWx0ZXJzLnNwbGl0KFwiIFwiKS5zb21lKChlbGVtZW50KSA9PiBlbGVtZW50LnRyaW0oKS5zdGFydHNXaXRoKFwiZ3JvdXAuXCIpKSkge1xyXG4gICAgICBjb25zdCBmaWx0ZXJLZXlWYWxQYWlycyA9IHRoaXMuZmllbGQuRmlsdGVycy5zcGxpdChcIiBcIik7XHJcbiAgICAgIGNvbnN0IGdycFZhbHVlcyA9IGZpbHRlcktleVZhbFBhaXJzLmZpbHRlcigoZWxlbWVudCkgPT4gZWxlbWVudC50cmltKCkuc3RhcnRzV2l0aChcImdyb3VwLlwiKSk7XHJcblxyXG4gICAgICBncnBWYWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYWN0dWFsVmFsID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHZhbCwgdGhpcy5ncnApO1xyXG4gICAgICAgIHRoaXMucGFyYW1zLmZpbHRlcnMgPSB0aGlzLnBhcmFtcy5maWx0ZXJzLnJlcGxhY2UodmFsLCBhY3R1YWxWYWwpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgZmlsdGVyIHBhcmFtZXRlcnMgaW4gdGhlICdwYXJhbXMuZmlsdGVyUGFyYW1zJyBwcm9wZXJ0eSBiYXNlZCBvbiAnZmllbGRbJ0ZpbHRlclBhcmFtcyddJy4gZmlsdGVyUGFyYW1zID09PSB1c2VkIGZvciB0aGUgaW5wdXQgaW4gdGhlIGNvbHVtbiBmaWx0ZXIgYXQgdGhlIFVJLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJQYXJhbXMoKSB7XHJcbiAgICBjb25zdCBmaWx0ZXJQYXJhbXMgPSB0aGlzLmZpZWxkWydGaWx0ZXJQYXJhbXMnXTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIGZpbHRlciBwYXJhbWV0ZXJzIGlmIHVuZGVmaW5lZC5cclxuICAgIGlmICghdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWx0ZXJQYXJhbXMpIHtcclxuICAgICAgaWYgKGZpbHRlclBhcmFtcy5zdGFydHNXaXRoKFwiZ3JvdXAuXCIpKSB7XHJcbiAgICAgICAgLy8gSWYgJ2ZpbHRlclBhcmFtcycgc3RhcnRzIHdpdGggXCJncm91cC5cIiwgZXh0ZW5kIHRoZSBleGlzdGluZyBhcnJheS5cclxuICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSBbXHJcbiAgICAgICAgICAuLi50aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMsXHJcbiAgICAgICAgICAuLi5aQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoZmlsdGVyUGFyYW1zLCB0aGlzLmdycClcclxuICAgICAgICBdO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIElmICdmaWx0ZXJQYXJhbXMnIGRvZXMgbm90IHN0YXJ0IHdpdGggXCJncm91cC5cIiwgdXNlIGl0IGRpcmVjdGx5LlxyXG4gICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IFtcclxuICAgICAgICAgIC4uLnRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyxcclxuICAgICAgICAgIGZpbHRlclBhcmFtc1xyXG4gICAgICAgIF07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgY29sdW1uIGZpbHRlcnMgaW4gdGhlIGdyaWQgc3RhdGUgYW5kIGFwcGVuZCB0byBmaWx0ZXJwYXJhbSBcclxuICAgIGlmICh0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZT8uZmlsdGVyPy5maWx0ZXJzKSB7XHJcbiAgICAgIHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLmZpbHRlcj8uZmlsdGVycz8uZm9yRWFjaCgoZmlsdGVyOiBGaWx0ZXJEZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmlsdGVyUGFyYW0gPSB7XHJcbiAgICAgICAgICBrZXk6IGZpbHRlci5maWVsZCBhcyBzdHJpbmcsXHJcbiAgICAgICAgICBvcHM6IHRoaXMubWFwRmlsdGVyT3BlcmF0b3IoZmlsdGVyLm9wZXJhdG9yKSxcclxuICAgICAgICAgIHZhbHVlOiBmaWx0ZXIudmFsdWUgPT09IG51bGwgPyBcIlwiIDogZmlsdGVyLnZhbHVlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgYSBmaWx0ZXIgcGFyYW1ldGVyIHdpdGggdGhlIHNhbWUga2V5IGFscmVhZHkgZXhpc3RzLlxyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUGFyYW0gPSB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMuZmluZCgocGFyYW0pID0+IHBhcmFtLmtleSA9PT0gZmlsdGVyUGFyYW0ua2V5KTtcclxuICAgICAgICBpZiAoZXhpc3RpbmdQYXJhbSkge1xyXG4gICAgICAgICAgLy8gSWYgYSBmaWx0ZXIgcGFyYW1ldGVyIHdpdGggdGhlIHNhbWUga2V5IGV4aXN0cywgdXBkYXRlIGl0cyB2YWx1ZS5cclxuICAgICAgICAgIGV4aXN0aW5nUGFyYW0udmFsdWUgPSBmaWx0ZXJQYXJhbS52YWx1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gSWYgbm8gZmlsdGVyIHBhcmFtZXRlciB3aXRoIHRoZSBzYW1lIGtleSwgYWRkIGl0IHRvIHRoZSBmaWx0ZXIgcGFyYW1ldGVycy5cclxuICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKGZpbHRlclBhcmFtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBzb3J0aW5nIG9yZGVyIGluIHRoZSAncGFyYW1zLnNvcnRPcmRlcicgcHJvcGVydHkgYmFzZWQgb24gJ2ZpZWxkLlNvcnRPcmRlcicuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldFNvcnRpbmcoKSB7XHJcbiAgICBjb25zdCBzb3J0T3JkZXIgPSB0aGlzLmZpZWxkLlNvcnRPcmRlcjtcclxuXHJcbiAgICAvLyBDaGVjayBpZiAnc29ydE9yZGVyJyBpcyBkZWZpbmVkIGFuZCBzdGFydHMgd2l0aCBcImdyb3VwLlwiLlxyXG4gICAgaWYgKHNvcnRPcmRlciAmJiBzb3J0T3JkZXIuc3RhcnRzV2l0aChcImdyb3VwLlwiKSkge1xyXG4gICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXIgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoc29ydE9yZGVyLCB0aGlzLmdycCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gSWYgJ3NvcnRPcmRlcicgaXMgbm90IGRlZmluZWQgb3IgZG9lc24ndCBzdGFydCB3aXRoIFwiZ3JvdXAuXCIsIHVzZSBpdCBkaXJlY3RseS5cclxuICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVyID0gc29ydE9yZGVyO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBJbml0aWFsaXplIHNvcnQgcGFyYW1ldGVycyBpZiB1bmRlZmluZWQuXHJcbiAgICBpZiAoIXRoaXMucGFyYW1zLnNvcnRPcmRlcnMpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycyA9IFtdO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLnNvcnQpIHtcclxuICAgICAgdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUuc29ydC5mb3JFYWNoKChkZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IuZGlyKSB7XHJcbiAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0gZGVzY3JpcHRvci5maWVsZCk7XHJcbiAgICAgICAgICBjb25zdCBzb3J0Q29sdW1uTmFtZSA9IGZpZWxkLnZhbHVlRXhwciAhPT0gdW5kZWZpbmVkID8gZmllbGQudmFsdWVFeHByIDogZGVzY3JpcHRvci5maWVsZDtcclxuXHJcbiAgICAgICAgICAvLyBDaGVjayBpZiBhIHNvcnQgY29sdW1uIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy5cclxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nU29ydENvbHVtbkluZGV4ID0gdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzLmZpbmRJbmRleCgobmFtZSkgPT4gbmFtZSA9PT0gc29ydENvbHVtbk5hbWUpO1xyXG5cclxuICAgICAgICAgIGlmIChleGlzdGluZ1NvcnRDb2x1bW5JbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgLy8gSWYgYSBzb3J0IGNvbHVtbiB3aXRoIHRoZSBzYW1lIG5hbWUgZXhpc3RzLCB1cGRhdGUgaXRzIHNvcnQgb3JkZXIuXHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlcnNbZXhpc3RpbmdTb3J0Q29sdW1uSW5kZXhdID0gZGVzY3JpcHRvci5kaXI7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJZiBubyBzb3J0IGNvbHVtbiB3aXRoIHRoZSBzYW1lIG5hbWUsIGFkZCBpdCB0byB0aGUgc29ydCBjb2x1bW5zIGFuZCBzb3J0IG9yZGVycy5cclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzLnB1c2goc29ydENvbHVtbk5hbWUpO1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXJzLnB1c2goZGVzY3JpcHRvci5kaXIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGdyYW50IHR5cGUgaW4gdGhlICdwYXJhbXMuZ3JhbnRUeXBlJyBwcm9wZXJ0eSBiYXNlZCBvbiAnZmllbGQuR3JhbnRUeXBlJy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0R3JhbnRUeXBlKCkge1xyXG4gICAgY29uc3QgZ3JhbnRUeXBlID0gdGhpcy5maWVsZC5HcmFudFR5cGU7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgJ2dyYW50VHlwZScgaXMgZGVmaW5lZC5cclxuICAgIGlmIChncmFudFR5cGUpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuZ3JhbnRUeXBlID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGdyYW50VHlwZS50b1N0cmluZygpLCB0aGlzLmdycCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlICdoaWRkZW4nIHByb3BlcnR5IGZvciBjb2x1bW5zIGluICdncmlkU2V0dGluZycgYmFzZWQgb24gJ2NvbHVtbkNvbmZpZ3MnLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtaR3JpZENvbHVtbkNvbmZpZ3NbXX0gY29sdW1uQ29uZmlncyAtIFRoZSBjb2x1bW4gY29uZmlndXJhdGlvbiBzZXR0aW5ncy5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIHNldEhpZGRlbkNvbHVtbihjb2x1bW5Db25maWdzOiBaR3JpZENvbHVtbkNvbmZpZ3NbXSkge1xyXG4gICAgaWYgKHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucyAmJiBjb2x1bW5Db25maWdzKSB7XHJcbiAgICAgIC8vIEZpbHRlciBvdXQgaGlkZGVuIGNvbHVtbnMgaW4gJ2NvbHVtbkNvbmZpZ3MnLlxyXG4gICAgICBjb25zdCBoaWRkZW5Db2x1bW5zID0gY29sdW1uQ29uZmlncy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi5oaWRkZW4gPT09IHRydWUpO1xyXG5cclxuICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGhpZGRlbiBjb2x1bW5zIGFuZCB1cGRhdGUgJ2dyaWRTZXR0aW5nJyBhY2NvcmRpbmdseS5cclxuICAgICAgaGlkZGVuQ29sdW1ucy5mb3JFYWNoKGhpZGRlbkNvbHVtbiA9PiB7XHJcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoYyA9PiBjLmZpZWxkID09PSBoaWRkZW5Db2x1bW4uZmllbGQpO1xyXG4gICAgICAgIGlmIChjb2x1bW4pIHtcclxuICAgICAgICAgIGNvbHVtbi5oaWRkZW4gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZSBkYXRhIGZvciBkYXRhIGJpbmRpbmcuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNraXBVc2VDYWNoZSAtIFdoZXRoZXIgdG8gc2tpcCB1c2luZyBjYWNoZSBmb3IgZGF0YSByZXRyaWV2YWwuXHJcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XHJcbiAgICovXHJcbiAgcHVibGljIGdldERhdGFCaW5kaW5nKHNraXBVc2VDYWNoZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IGNhY2hlSW5mbyA9IHRoaXMuemdyaWRiaW5kaW5nLmRhdGEuQ2FjaGVJbmZvO1xyXG5cclxuICAgIGlmICghY2FjaGVJbmZvIHx8IHNraXBVc2VDYWNoZSkge1xyXG4gICAgICB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2FjaGVJbmZvKSB7XHJcbiAgICAgIGNvbnN0IGdyaWRTdGF0ZUxvZ2ljID0gdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkU3RhdGVMb2dpYyh0aGlzLmZpZWxkKTtcclxuICAgICAgaWYgKGdyaWRTdGF0ZUxvZ2ljID09PSBHcmlkU3RhdGVMb2dpY1R5cGUuU2V0dGluZ09ubHkpIHtcclxuICAgICAgICB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY29tbWVudCBvdXQgb24gMjAyNDEwMDEuIGRlZmF1bHQgdG8gZmV0Y2ggdGhlIGRhdGEgZnJvbSBhcGkgaW5zdGVhZCBvZiBsb2FkaW5nIGZyb210IGhlIGNhY2hlLlxyXG4gICAgLy8gaWYgKCF0aGlzLmNoYW5nZUV2ZW50LnBhZ2VDaGFuZ2VkICYmICF0aGlzLmNoYW5nZUV2ZW50LnNvcnRDaGFuZ2VkICYmICF0aGlzLmNoYW5nZUV2ZW50LmZpbHRlckNoYW5nZWQpIHtcclxuICAgIC8vICAgY29uc3QgY3VycmVudERhdGFDYWNoZUluZm8gPSB0aGlzLmdyaWRTZXJ2aWNlLmdlbmVyYXRlQ2FjaGVJbmZvKHRoaXMuemdyaWRiaW5kaW5nLmRhdGEpO1xyXG4gICAgLy8gICBjb25zdCByZXN1bHQgPSB0aGlzLm9mZmxpbmVEYXRhYmFzZVNlcnZpY2UuZ2V0SXRlbUJ5S2V5KGN1cnJlbnREYXRhQ2FjaGVJbmZvLCBjdXJyZW50RGF0YUNhY2hlSW5mby5vZmZsaW5lRGF0YWJhc2VLZXkpO1xyXG4gICAgLy8gICBpZiAocmVzdWx0KSB7XHJcbiAgICAvLyAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKHJlc3VsdC5kYXRhLCB0cnVlKTtcclxuICAgIC8vICAgfSBlbHNlIHtcclxuICAgIC8vICAgICB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuICAgIC8vIGVsc2Uge1xyXG4gICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmUgZ3JpZCBkYXRhLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRHcmlkRGF0YSgpIHtcclxuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XHJcbiAgICAgIGlmICghdGhpcy5wYWdpbmF0aW9uQXBpUG9zdFVybCkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignR3JpZCBwYWdpbmF0aW9uIEFQSSBVUkwgaXMgdW5kZWZpbmVkLicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc3RhdGVTa2lwID0gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUgPyB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS5za2lwIDogdGhpcy5zdGF0ZS5za2lwO1xyXG4gICAgICBjb25zdCBzdGF0ZVRha2UgPSB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZSA/IHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLnRha2UgOiB0aGlzLnN0YXRlLnRha2U7XHJcblxyXG4gICAgICB0aGlzLnBhcmFtcy5wYWdlTm8gPSB0aGlzLmdldFBhZ2VObyhzdGF0ZVNraXAsIHN0YXRlVGFrZSk7XHJcbiAgICAgIHRoaXMucGFyYW1zLnBhZ2VTaXplID0gc3RhdGVUYWtlO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZmllbGQuRXh0ZXJuYWxQYWdpbmF0aW9uKSB7XHJcbiAgICAgICAgLy8gRm9yIFBPU1QgbWV0aG9kIFBhZ2UgV2ViQVBJIFxyXG4gICAgICAgIHRoaXMud2ViYXBpU2VydmljZVxyXG4gICAgICAgICAgLnBvc3RBcGkodGhpcy5wYWdpbmF0aW9uQXBpUG9zdFVybCwgdGhpcy5wYXJhbXMsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIHRydWUpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKHJlc3ApID0+IHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShyZXNwKSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KFwiRXJyb3Igb2NjdXIgaW4gbG9hZGluZyB0aGUgZGF0YVwiLCBcIm1pZGRsZVwiLCBmYWxzZSwgMTUwMCwgXCJkYW5nZXJcIik7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gRm9yIEdFVCBtZXRob2RcclxuICAgICAgICB0aGlzLndlYmFwaVNlcnZpY2VcclxuICAgICAgICAgIC5nZXRBcGkodGhpcy5yZXNvdXJjZVVSTCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSBudWxsO1xyXG4gICAgICAgICAgICBsZXQgdG90YWxDb3VudCA9IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzcC5kYXRhU2V0KSB7XHJcbiAgICAgICAgICAgICAgZGF0YSA9IHJlc3AuZGF0YVNldDtcclxuICAgICAgICAgICAgICB0b3RhbENvdW50ID0gcmVzcC50b3RhbENvdW50O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRhdGEgPSByZXNwO1xyXG4gICAgICAgICAgICAgIHRvdGFsQ291bnQgPSByZXNwLmxlbmd0aDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKHsgZGF0YVNldDogZGF0YSwgdG90YWxDb3VudDogdG90YWxDb3VudCB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc3QgZGF0YVNldCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgICB0aGlzLmZpZWxkLkRhdGFTb3VyY2UsXHJcbiAgICAgICAgdGhpcy5ncnBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMuZGF0YSA9IGRhdGFTZXQ7XHJcbiAgICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZ3JpZFN1YmplY3QubmV4dCh0aGlzKTtcclxuICAgICAgdGhpcy5ub3RpZnlEYXRhQ2hhbmdlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoZGF0YTogYW55LCBza2lwQ2FjaGVEYXRhPzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5hZ2dyZWdhdGVIYW5kbGluZyhkYXRhLmRhdGFTZXQpO1xyXG4gICAgdGhpcy5ncmlkLmRhdGEgPSB7IGRhdGE6IGRhdGEuZGF0YVNldCwgdG90YWw6IGRhdGEudG90YWxDb3VudCB9O1xyXG4gICAgaWYgKCFza2lwQ2FjaGVEYXRhKSB7XHJcbiAgICAgIGNvbnN0IGdyaWRTdGF0ZUxvZ2ljID0gdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkU3RhdGVMb2dpYyh0aGlzLmZpZWxkKTtcclxuICAgICAgaWYgKGdyaWRTdGF0ZUxvZ2ljID09PSBHcmlkU3RhdGVMb2dpY1R5cGUuRGF0YUNhY2hlT25seSB8fCBncmlkU3RhdGVMb2dpYyA9PT0gR3JpZFN0YXRlTG9naWNUeXBlLlNldHRpbmdBbmREYXRhQ2FjaGUpIHtcclxuICAgICAgICB0aGlzLmNhY2hlR3JpZERhdGEoKTtcclxuICAgICAgICB0aGlzLnN1YnNjcmliZUNhY2hlRGF0YUNoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuYWZ0ZXJEYXRhQmluZGVkKGRhdGEpO1xyXG4gICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgdGhpcy5ub3RpZnlEYXRhQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0Q2hhbmdlRXZlbnRGbGFnKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VFdmVudCA9IHtcclxuICAgICAgcGFnZUNoYW5nZWQ6IGZhbHNlLFxyXG4gICAgICBmaWx0ZXJDaGFuZ2VkOiBmYWxzZSxcclxuICAgICAgc29ydENoYW5nZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNhY2hlR3JpZERhdGEoKSB7XHJcbiAgICBjb25zdCBtZSA9IHRoaXM7XHJcbiAgICBjb25zdCBncmlkU3RhdGUgPSB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZTtcclxuICAgIGNvbnN0IGdyaWREYXRhID0gdGhpcy5ncmlkPy5kYXRhIHx8IG51bGw7XHJcblxyXG4gICAgaWYgKCFncmlkRGF0YVsnZGF0YSddKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjYWNoZUluZm8gPSB0aGlzLnpncmlkYmluZGluZy5kYXRhLkNhY2hlSW5mbztcclxuXHJcbiAgICBpZiAoY2FjaGVJbmZvICYmICFjYWNoZUluZm8uRGlzYWJsZUNhY2hlRGF0YSkge1xyXG4gICAgICAvLyBrZWVwIG9yaWdpbmFsRGF0YSBcclxuICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhQ2FjaGVJbmZvID0gdGhpcy5ncmlkU2VydmljZS5nZW5lcmF0ZUNhY2hlSW5mbyh0aGlzLnpncmlkYmluZGluZy5kYXRhKTtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLmdldEl0ZW1CeUtleShvcmlnaW5hbERhdGFDYWNoZUluZm8sIG9yaWdpbmFsRGF0YUNhY2hlSW5mby5vZmZsaW5lRGF0YWJhc2VLZXkpO1xyXG4gICAgICBsZXQgdXBkYXRlZERhdGEgPSBbLi4uZ3JpZERhdGFbJ2RhdGEnXV07XHJcbiAgICAgIGxldCBza2lwTGlzdCA9IFtncmlkU3RhdGUuc2tpcF07XHJcbiAgICAgIGxldCBjdXJyZW50R3JpZFNraXAgPSBncmlkU3RhdGUuc2tpcDtcclxuXHJcbiAgICAgIGlmIChvcmlnaW5hbERhdGFDYWNoZUluZm8uYXBwZW5kUGFnaW5hdGlvbkRhdGEpIHtcclxuICAgICAgICBpZiAocmVzdWx0ICYmICFyZXN1bHQuc2tpcExpc3QuaW5jbHVkZXMoY3VycmVudEdyaWRTa2lwKSkge1xyXG4gICAgICAgICAgdXBkYXRlZERhdGEgPSBbLi4ucmVzdWx0LmRhdGEuZGF0YVNldCwgLi4uZ3JpZERhdGFbJ2RhdGEnXV07XHJcbiAgICAgICAgICBza2lwTGlzdCA9IFsuLi5yZXN1bHQuc2tpcExpc3QsIC4uLnNraXBMaXN0XTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGNhY2hlR3JpZERhdGEgPSB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgZGF0YVNldDogdXBkYXRlZERhdGEsXHJcbiAgICAgICAgICB0b3RhbENvdW50OiBncmlkRGF0YVsndG90YWwnXVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ3JpZFN0YXRlOiBncmlkU3RhdGUsXHJcbiAgICAgICAgc2tpcExpc3Q6IHNraXBMaXN0LFxyXG4gICAgICAgIGNhY2hlRHVyYXRpb246IGNhY2hlSW5mby5DYWNoZUR1cmF0aW9uLFxyXG4gICAgICAgIC8vY29sdW1uQ29uZmlndXJhdGlvbnM6IG1lLmdyaWQuY29sdW1ucyAvLyBieSBpbmNsdWRpbmcgdGhpcyBwcm9wZXJ0eSB3aWxsIGNhdXNlIGNpcmN1bGFyIHJlZmVyZW5jZSBlcnJvci4gXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS5hZGRJdGVtKG9yaWdpbmFsRGF0YUNhY2hlSW5mbywgY2FjaGVHcmlkRGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL1wiRmVhdHVyZURldmVsb3BtZW50fENvbXBldGVuY3lcIiBcclxuICBwcml2YXRlIGFzeW5jIHN1YnNjcmliZUNhY2hlRGF0YUNoYW5nZXMoKSB7XHJcbiAgICBjb25zdCBjYWNoZUluZm8gPSB0aGlzLnpncmlkYmluZGluZy5kYXRhLkNhY2hlSW5mbztcclxuXHJcbiAgICBpZiAoY2FjaGVJbmZvICYmICFjYWNoZUluZm8uRGlzYWJsZUNhY2hlRGF0YSkge1xyXG4gICAgICAvLyBjYW5ub3QgdXNlIG1haW4gc2VydmljZSBoZXJlLiB3aWxsIGdldCBjaXJjdWxhciBlcnJvciB3aGVuIGJ1aWxkIGxpYlxyXG4gICAgICAvL3RoaXMubWFpblNlcnZpY2Uuam9pblByb2plY3RTaWduYWxSKCk7XHJcblxyXG4gICAgICBjb25zdCBjYWxsQmFja0Z1bmN0aW9uID0gYCR7Y2FjaGVJbmZvLk5hbWV9X2hhbmRsZVJlY2VpdmVkTWVzc2FnZWA7XHJcblxyXG4gICAgICAvLyBjcmVhdGUgYW5kIGJpbmQgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYmFjayBmb3IgdGhlIGdyaWQgaW4gdGhlIGdyb3VwIHRyaWdnZXIgYnkgc2lnbmFsUi5cclxuICAgICAgaWYgKCF0aGlzLmdycC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyKSB7XHJcbiAgICAgICAgdGhpcy5ncnAuc2lnbmFsUkNhbGxiYWNrSGFuZGxlciA9IHt9O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZ3JwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXJbY2FsbEJhY2tGdW5jdGlvbl0gPSB0aGlzLmhhbmRsZVJlY2VpdmVkTWVzc2FnZS5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgY29uc3QgZ2VuZXJhdGVkQ2FjaGVJbmZvID0gdGhpcy5ncmlkU2VydmljZS5nZW5lcmF0ZUNhY2hlSW5mbyh0aGlzLnpncmlkYmluZGluZy5kYXRhKTtcclxuICAgICAgaWYgKGdlbmVyYXRlZENhY2hlSW5mby5kZWZpbmVkRGF0YWJhc2UgJiYgZ2VuZXJhdGVkQ2FjaGVJbmZvLmRlZmluZWRUYWJsZSkge1xyXG4gICAgICAgIGdlbmVyYXRlZENhY2hlSW5mby5kZWZpbmVkRGF0YWJhc2UuZm9yRWFjaChkYiA9PiB7XHJcbiAgICAgICAgICBnZW5lcmF0ZWRDYWNoZUluZm8uZGVmaW5lZFRhYmxlLmZvckVhY2godGFibGUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBgJHtkYn18JHt0YWJsZX1gO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgTGlzdGVuaW5nIHRvIGV2ZW50IG5hbWU6ICR7ZXZlbnROYW1lfWApO1xyXG4gICAgICAgICAgICB0aGlzLnNpZ25hbHJTZXJ2aWNlLnN1YnNjcmliZVRvRXZlbnQodGhpcy5ncnAsIGAke2V2ZW50TmFtZX1gLCBgZ3JvdXAuc2lnbmFsUkNhbGxiYWNrSGFuZGxlci4ke2NhbGxCYWNrRnVuY3Rpb259YCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgaGFuZGxlUmVjZWl2ZWRNZXNzYWdlKGdyb3VwOiBaR3JvdXAsIHJlc3VsdDogYW55LCBldmVudE5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc29sZS5sb2coYFRoZSBTaWduYWxyIHRyaWdnZXIgaGFzIGJlZW4gZGV0ZWN0ZWQuIE5vdywgcHJvY2VlZCB0byB1cGRhdGUgdGhlIGNhY2hlIGFuZCBncmlkIGRhdGEuYCk7XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2VkUmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xyXG4gICAgY29uc3QgYWN0aW9uVHlwZSA9IHJlc3BvbnNlZFJlc3VsdC5BY3Rpb247XHJcbiAgICBjb25zdCByZXNwb25zZWRSZXN1bHRJZCA9IHJlc3BvbnNlZFJlc3VsdFsnSWQnXTtcclxuICAgIGNvbnN0IHRlbXBQYXJhbXMgPSBaQ29tcG9uZW50SGVscGVyLmRlZXBDbG9uZSh0aGlzLnBhcmFtcyk7XHJcbiAgICBjb25zdCBjdXJyZW50RGF0YUNhY2hlSW5mbyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2VuZXJhdGVDYWNoZUluZm8odGhpcy56Z3JpZGJpbmRpbmcuZGF0YSk7XHJcbiAgICBjb25zdCBjdXJyZW50RGF0YSA9IGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS5nZXRJdGVtQnlLZXkoY3VycmVudERhdGFDYWNoZUluZm8sIGN1cnJlbnREYXRhQ2FjaGVJbmZvLm9mZmxpbmVEYXRhYmFzZUtleSk7XHJcblxyXG4gICAgaWYgKGN1cnJlbnREYXRhKSB7XHJcbiAgICAgIHRlbXBQYXJhbXMuZmlsdGVycyA9IGBJZD0ke3Jlc3BvbnNlZFJlc3VsdElkfWA7XHJcblxyXG4gICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQWN0aW9uVHlwZS5EZWxldGUpIHtcclxuICAgICAgICBjdXJyZW50RGF0YS5kYXRhLmRhdGFTZXQgPSBjdXJyZW50RGF0YS5kYXRhLmRhdGFTZXQuZmlsdGVyKGl0ZW0gPT4gaXRlbS5JZCAhPT0gcGFyc2VJbnQocmVzcG9uc2VkUmVzdWx0SWQpKTtcclxuXHJcbiAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS51cGRhdGVJdGVtKGN1cnJlbnREYXRhQ2FjaGVJbmZvLCBjdXJyZW50RGF0YSk7XHJcblxyXG4gICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShjdXJyZW50RGF0YS5kYXRhLCB0cnVlKTtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coYEl0ZW0gdXBkYXRlZDogJHtjdXJyZW50RGF0YX1gKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLndlYmFwaVNlcnZpY2UucG9zdEFwaSh0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsLCB0ZW1wUGFyYW1zLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCB0cnVlKS5zdWJzY3JpYmUoYXN5bmMgcmVzcCA9PiB7XHJcblxyXG4gICAgICAgICAgY29uc3QgZGF0YWJhc2VSZWNvcmQgPSByZXNwLmRhdGFTZXRbMF07XHJcblxyXG4gICAgICAgICAgaWYgKGRhdGFiYXNlUmVjb3JkKSB7XHJcbiAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBY3Rpb25UeXBlLlVwZGF0ZSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4VG9VcGRhdGUgPSBjdXJyZW50RGF0YS5kYXRhLmRhdGFTZXQuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5JZCA9PT0gZGF0YWJhc2VSZWNvcmQuSWQpO1xyXG4gICAgICAgICAgICAgIGlmIChpbmRleFRvVXBkYXRlICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IG9iamVjdCB3aXRoIHRoZSB1cGRhdGVkIG5hbWVcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRJdGVtID0geyAuLi5jdXJyZW50RGF0YS5kYXRhLmRhdGFTZXRbaW5kZXhUb1VwZGF0ZV0sIC4uLmRhdGFiYXNlUmVjb3JkIH07XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb2xkIGl0ZW0gd2l0aCB0aGUgdXBkYXRlZCBvbmVcclxuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldFtpbmRleFRvVXBkYXRlXSA9IHVwZGF0ZWRJdGVtO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShjdXJyZW50RGF0YS5kYXRhLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9mZmxpbmVEYXRhYmFzZVNlcnZpY2UudXBkYXRlSXRlbShjdXJyZW50RGF0YUNhY2hlSW5mbywgY3VycmVudERhdGEpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBJdGVtIHVwZGF0ZWQ6ICR7Y3VycmVudERhdGF9YCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSXRlbSBub3QgZm91bmQgd2l0aCBJRDpcIiwgZGF0YWJhc2VSZWNvcmQuSWQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChhY3Rpb25UeXBlID09PSBBY3Rpb25UeXBlLkFkZCAmJiBjdXJyZW50RGF0YS5ncmlkU3RhdGUuc2tpcCA8IDIwKSB7XHJcbiAgICAgICAgICAgICAgY3VycmVudERhdGEuZGF0YS5kYXRhU2V0LnVuc2hpZnQoZGF0YWJhc2VSZWNvcmQpO1xyXG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShjdXJyZW50RGF0YS5kYXRhLCB0cnVlKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9mZmxpbmVEYXRhYmFzZVNlcnZpY2UudXBkYXRlSXRlbShjdXJyZW50RGF0YUNhY2hlSW5mbywgY3VycmVudERhdGEpO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoY3VycmVudERhdGEuZGF0YSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBJdGVtIHVwZGF0ZWQ6ICR7Y3VycmVudERhdGF9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBVbmFibGUgdG8gZ2V0IGRhdGEsIHJlZnJlc2ggdGhlIHdob2xlIGdyaWQgZGF0YSBmcm9tIEFQSVxyXG4gICAgICAgICAgICB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBVbmFibGUgdG8gZ2V0IGZyb20gaW5kZXhlZERCIHN0cmFpZ2h0IGdldCBmcm9tIEFQSVxyXG4gICAgICB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyRGF0YUJpbmRlZChkYXRhKSB7XHJcbiAgICAvLyBhbGxvdyB0byBjYWxsIGJhY2sgcHJvamVjdCBwYWdlIGFmdGVyIGRhdGEgYmluZGVkLlxyXG4gICAgbGV0IGJpbmRlZFZhbHVlID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YVsnQWZ0ZXJEYXRhQmluZGVkJ107XHJcbiAgICBpZiAoYmluZGVkVmFsdWUpIHtcclxuICAgICAgY29uc3QgbWUgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzKTtcclxuICAgICAgbGV0IGNhbGxGdW5jO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSBiaW5kZWRWYWx1ZS5tYXRjaCgvXFxiXFwoLiovZ2kpO1xyXG4gICAgICAgIGlmIChwYXJhbXMpIHtcclxuICAgICAgICAgIGJpbmRlZFZhbHVlID0gYmluZGVkVmFsdWUucmVwbGFjZShwYXJhbXNbMF0sIFwiXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBiaW5kZWRWYWx1ZSA9IGJpbmRlZFZhbHVlLnJlcGxhY2UoJ21vZGFsR3JvdXAuJywgJ2dyb3VwLicpO1xyXG4gICAgICAgIGNhbGxGdW5jID0gZXZhbCgnbWUuemdyaWRiaW5kaW5nLicgKyBiaW5kZWRWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgXCJFcnJvciB3aGVuIGdldEdyb3VwVmFsdWU6IFwiLFxyXG4gICAgICAgICAgZXZlbnQudGFyZ2V0LFxyXG4gICAgICAgICAgXCIgPiBFcnJvcjogXCIsXHJcbiAgICAgICAgICBlcnJvclxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgIGNvbnN0IG5ld0Z1bmMgPSBjYWxsRnVuYy5iaW5kKG1lKTtcclxuICAgICAgICBuZXdGdW5jKGV2ZW50LCBtZS56Z3JpZGJpbmRpbmcuZGF0YSwgZGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhckRhdGEoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQuZGF0YSA9IHsgZGF0YTogW10sIHRvdGFsOiAwIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgY29sdW1uIGFnZ3JlZ2F0aW9uIGZvciB0aGUgZ2l2ZW4gZGF0YS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7YW55W119IGRhdGEgLSBUaGUgZGF0YSB0byBhZ2dyZWdhdGUuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZ2dyZWdhdGVIYW5kbGluZyhkYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGFnZ3JlZ2F0ZUNvbHVtbnMgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuYWdncmVnYXRlVHlwZSk7XHJcblxyXG4gICAgYWdncmVnYXRlQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIGNvbnN0IGZpZWxkID0gY29sLmZpZWxkO1xyXG4gICAgICBjb25zdCBhZ2dyZWdhdGVUeXBlID0gY29sLmFnZ3JlZ2F0ZVR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCc6JywgJycpO1xyXG5cclxuICAgICAgbGV0IGFnZ3JlZ2F0ZVZhbHVlID0gbnVsbDtcclxuICAgICAgc3dpdGNoIChhZ2dyZWdhdGVUeXBlKSB7XHJcbiAgICAgICAgY2FzZSBcInRvdGFsXCI6XHJcbiAgICAgICAgY2FzZSBcInN1bVwiOlxyXG4gICAgICAgICAgYWdncmVnYXRlVmFsdWUgPSBkYXRhLnJlZHVjZSgodG90YWwsIG5leHQpID0+IHRvdGFsICsgbmV4dFtmaWVsZF0sIDApO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcImF2ZXJhZ2VcIjpcclxuICAgICAgICAgIGFnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5yZWR1Y2UoKHRvdGFsLCBuZXh0KSA9PiB0b3RhbCArIG5leHRbZmllbGRdLCAwKSAvIGRhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcImNvdW50XCI6XHJcbiAgICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGRhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIm1heFwiOlxyXG4gICAgICAgICAgYWdncmVnYXRlVmFsdWUgPSBkYXRhLnJlZHVjZSgocCwgYykgPT4gcFtmaWVsZF0gPiBjW2ZpZWxkXSA/IHAgOiBjKVtmaWVsZF07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwibWluXCI6XHJcbiAgICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGRhdGEucmVkdWNlKChwLCBjKSA9PiBwW2ZpZWxkXSA8IGNbZmllbGRdID8gcCA6IGMpW2ZpZWxkXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb2wuYWdncmVnYXRlVmFsdWUgPSBhZ2dyZWdhdGVWYWx1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgYWdncmVnYXRlIHZhbHVlcyBmb3IgY29sdW1ucyB3aXRoIGFnZ3JlZ2F0ZSB0eXBlcy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYWdncmVnYXRlUmVzZXRWYWx1ZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGFnZ3JlZ2F0ZUNvbHVtbnMgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuYWdncmVnYXRlVHlwZSk7XHJcbiAgICBhZ2dyZWdhdGVDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgY29sLmFnZ3JlZ2F0ZVZhbHVlID0gMDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHBhZ2UgY2hhbmdlIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtQYWdlQ2hhbmdlRXZlbnR9IGV2ZW50IC0gVGhlIHBhZ2UgY2hhbmdlIGV2ZW50LlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBwYWdlQ2hhbmdlKGV2ZW50OiBQYWdlQ2hhbmdlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMucGFyYW1zLnBhZ2VObyA9IHRoaXMuZ2V0UGFnZU5vKGV2ZW50LnNraXAsIHRoaXMucGFyYW1zLnBhZ2VTaXplKTtcclxuICAgIHRoaXMuc3RhdGUuc2tpcCA9IGV2ZW50LnNraXA7XHJcbiAgICB0aGlzLmNoYW5nZUV2ZW50LnBhZ2VDaGFuZ2VkID0gdHJ1ZTtcclxuICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBzb3J0IGNoYW5nZSBldmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7U29ydERlc2NyaXB0b3JbXX0gc29ydCAtIFRoZSBzb3J0IGRlc2NyaXB0b3IgYXJyYXkuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHNvcnRDaGFuZ2Uoc29ydDogU29ydERlc2NyaXB0b3JbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5zb3J0ID0gc29ydDtcclxuICAgIHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcyA9IFtdO1xyXG4gICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycyA9IFtdO1xyXG5cclxuICAgIHNvcnQuZm9yRWFjaCgoZGVzY3JpcHRvcjogU29ydERlc2NyaXB0b3IpID0+IHtcclxuICAgICAgaWYgKGRlc2NyaXB0b3IuZGlyKSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycy5wdXNoKGRlc2NyaXB0b3IuZGlyKTtcclxuXHJcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGRlc2NyaXB0b3IuZmllbGQpO1xyXG4gICAgICAgIGNvbnN0IHNvcnRDb2x1bW5OYW1lID0gZmllbGQudmFsdWVFeHByICE9PSB1bmRlZmluZWQgPyBmaWVsZC52YWx1ZUV4cHIgOiBkZXNjcmlwdG9yLmZpZWxkO1xyXG5cclxuICAgICAgICB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMucHVzaChzb3J0Q29sdW1uTmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5jaGFuZ2VFdmVudC5zb3J0Q2hhbmdlZCA9IHRydWU7XHJcbiAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgZmlsdGVyIGNoYW5nZSBldmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7YW55fSBldmVudCAtIFRoZSBmaWx0ZXIgY2hhbmdlIGV2ZW50LlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBmaWx0ZXJDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5wYXJhbXMucGFnZU5vID0gMDtcclxuICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IFtdO1xyXG4gICAgdGhpcy5zZXRGaWx0ZXJQYXJhbXNCeVBhcmVudFJlZklkKCk7XHJcblxyXG4gICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LmZpbHRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBldmVudC5maWx0ZXJzLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKGNvbCA9PiBjb2wuZmllbGQgPT09IGl0ZW0uZmllbGQpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gaXRlbS52YWx1ZSA9PT0gbnVsbCA/IFwiXCIgOiBpdGVtLnZhbHVlO1xyXG5cclxuICAgICAgICBpZiAoaXRlbS5maWx0ZXJzKSB7XHJcbiAgICAgICAgICBpdGVtLmZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyOiBGaWx0ZXJEZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlclBhcmFtOiBaR3JpZEZpbHRlclBhcmFtcyA9IHtcclxuICAgICAgICAgICAgICBrZXk6IGZpbHRlci5maWVsZCBhcyBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgb3BzOiB0aGlzLm1hcEZpbHRlck9wZXJhdG9yKGZpbHRlci5vcGVyYXRvciksXHJcbiAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlci52YWx1ZSA9PT0gbnVsbCA/IFwiXCIgOiBmaWx0ZXIudmFsdWUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKGZpbHRlclBhcmFtKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGZpbHRlclBhcmFtOiBaR3JpZEZpbHRlclBhcmFtcyA9IHtcclxuICAgICAgICAgICAga2V5OiBpdGVtLmZpZWxkLFxyXG4gICAgICAgICAgICBvcHM6IHRoaXMubWFwRmlsdGVyT3BlcmF0b3IoaXRlbS5vcGVyYXRvciksXHJcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQudmFsdWVFeHByKSB7XHJcbiAgICAgICAgICAgIGZpbHRlclBhcmFtLmtleSA9IHRoaXMuemdyaWRiaW5kaW5nLmRhdGFbJ0ZpbHRlcldpdGhvdXRCcmFja2V0J10gPyBgJHtmaWVsZC52YWx1ZUV4cHJ9YCA6IGAoJHtmaWVsZC52YWx1ZUV4cHJ9KWA7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLnB1c2goZmlsdGVyUGFyYW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZmllbGQuR3JpZEZpbHRlckNvbmZpZ3VyYXRpb24/Lk9uQ2hhbmdlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiR3JpZEZpbHRlckNvbmZpZ3VyYXRpb24uT25DaGFuZ2UgdHJpZ2dlcmVkXCIpO1xyXG4gICAgICAvLyBVc2Ugc3dpdGNoTWFwIHRvIGhhbmRsZSB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvblxyXG4gICAgICBvZih0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMpLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChmaWx0ZXJQYXJhbXMpID0+IHtcclxuICAgICAgICAgIC8vIEdldCB0aGUgZnVuY3Rpb24gZXhwcmVzc2lvbiBmcm9tIHRoZSBjb25maWd1cmF0aW9uXHJcbiAgICAgICAgICBsZXQgZXhwcmVzc2lvbiA9IHRoaXMuZmllbGQuR3JpZEZpbHRlckNvbmZpZ3VyYXRpb24uT25DaGFuZ2U7XHJcblxyXG4gICAgICAgICAgLy8gUmVwbGFjZSAnbW9kYWxHcm91cC4nIHdpdGggJ2dyb3VwLicgYW5kICdncm91cC4nIHdpdGggJ2dycC4nXHJcbiAgICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5yZXBsYWNlKC9tb2RhbEdyb3VwXFwuL2csICdncm91cC4nKS5yZXBsYWNlKC9ncm91cFxcLi9nLCAnZ3JwLicpO1xyXG5cclxuICAgICAgICAgIC8vIEVuc3VyZSB0aGUgZXhwcmVzc2lvbiBzdGFydHMgd2l0aCAndGhpcy4nIHRvIGF2b2lkIGFjY2Vzc2luZyBnbG9iYWwgc2NvcGVcclxuICAgICAgICAgIGlmICghZXhwcmVzc2lvbi5zdGFydHNXaXRoKCd0aGlzLicpKSB7XHJcbiAgICAgICAgICAgIGV4cHJlc3Npb24gPSBgdGhpcy4ke2V4cHJlc3Npb259YDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBmdW5jID0gZXZhbChleHByZXNzaW9uKTtcclxuICAgICAgICAgIGlmICghZnVuYykge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmxvZyhgJHtleHByZXNzaW9ufSBub3QgZm91bmQgaW4gdGhpcyBzY29wZSBmb3IgJHt0aGlzLmZpZWxkLk5hbWV9IGdyaWQuYCk7XHJcblxyXG4gICAgICAgICAgICAvLyBTaW5jZSBmdW5jdGlvbiBub3QgZm91bmQsIHdlIHJldHVybiB0aGUgb3JpZ2luYWwgcGFyYW1zLlxyXG4gICAgICAgICAgICByZXR1cm4gb2YodGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBjYWxsRnVuYyA9IGZ1bmMuYmluZCh0aGlzLmdycCk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGNhbGxGdW5jKGZpbHRlclBhcmFtcyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKS5zdWJzY3JpYmUoKHVwZGF0ZWRGaWx0ZXJQYXJhbXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2codXBkYXRlZEZpbHRlclBhcmFtcyk7XHJcblxyXG4gICAgICAgIC8vIHVwZGF0ZSBmaWx0ZXJQYXJhbXNcclxuICAgICAgICBpZiAodXBkYXRlZEZpbHRlclBhcmFtcykge1xyXG4gICAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gdXBkYXRlZEZpbHRlclBhcmFtcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2hhbmdlRXZlbnQuZmlsdGVyQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBJZiB0aGVyZSBpcyBubyBHcmlkRmlsdGVyQ29uZmlndXJhdGlvbi5PbkNoYW5nZVxyXG4gICAgICB0aGlzLmNoYW5nZUV2ZW50LmZpbHRlckNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGF0YVN0YXRlQ2hhbmdlKHN0YXRlOiBEYXRhU3RhdGVDaGFuZ2VFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUgPSBzdGF0ZTtcclxuICAgIHRoaXMuYWdncmVnYXRlUmVzZXRWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFwIGZpbHRlciBvcGVyYXRvciB0byBpdHMgY29ycmVzcG9uZGluZyB2YWx1ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciAtIFRoZSBmaWx0ZXIgb3BlcmF0b3IuXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgbWFwcGVkIGZpbHRlciBvcGVyYXRvciB2YWx1ZS5cclxuICAgKi9cclxuICBwcml2YXRlIG1hcEZpbHRlck9wZXJhdG9yKG9wZXJhdG9yOiBhbnkpIHtcclxuICAgIGNvbnN0IG9wZXJhdG9yTWFwcGluZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XHJcbiAgICAgIFwiZXFcIjogXCJlcVwiLFxyXG4gICAgICBcIm5lcVwiOiBcIm5lcVwiLFxyXG4gICAgICBcImx0XCI6IFwibHRcIixcclxuICAgICAgXCJsdGVcIjogXCJsdGVcIixcclxuICAgICAgXCJndFwiOiBcImd0XCIsXHJcbiAgICAgIFwiZ3RlXCI6IFwiZ3RlXCIsXHJcbiAgICAgIFwic3RhcnRzd2l0aFwiOiBcInN0YXJ0c3dpdGhcIixcclxuICAgICAgXCJlbmRzd2l0aFwiOiBcImVuZHN3aXRoXCIsXHJcbiAgICAgIFwiaXNudWxsXCI6IFwiaXNudWxsXCIsXHJcbiAgICAgIFwiaXNub3RudWxsXCI6IFwiaXNub3RudWxsXCIsXHJcbiAgICB9O1xyXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZSBmb3IgXCJjb250YWluc1wiXHJcbiAgICBpZiAob3BlcmF0b3IgPT09IFwiY29udGFpbnNcIiAmJiAhdGhpcy5maWVsZFsnRmlsdGVyQ29udGFpbnNVc2luZ0VxdWFsJ10pIHtcclxuICAgICAgcmV0dXJuIFwiY29udGFpbnNcIjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm4gdGhlIG1hcHBlZCBvcGVyYXRvciBvciBkZWZhdWx0IHRvIFwiPT1cIlxyXG4gICAgcmV0dXJuIG9wZXJhdG9yTWFwcGluZ3Nbb3BlcmF0b3JdIHx8IFwiPT1cIjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UGFnZU5vKHN0YXRlU2tpcDogbnVtYmVyLCBzdGF0ZVRha2U6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHN0YXRlU2tpcCAvIHN0YXRlVGFrZTtcclxuICB9XHJcblxyXG4gIC8vIGNvbHVtbkZpZWxkID0gZGF0YTogQXJyYXk8WkZpZWxkPixcclxuICAvLyBjb2x1bW5zID0gZ3JpZENvbHVtbnM6IGFueVtdLFxyXG4gIC8vIGdyb3VwID0gZ3JvdXA6IFpHcm91cCxcclxuICAvLyBjb2x1bW5Db25maWd1cmF0aW9ucyA9IGdyaWRTZXR0aW5ncz86IFpHcmlkQ29sdW1uU2V0dGluZ3NbXSxcclxuICAvLyBnZW5lcmF0ZUhpZGRlbkNvbHVtbnMgPSB1c2FibGVDb2x1bW5zPzogYW55W10sXHJcbiAgLy8gZ3JpZEF0dHJpYnV0ZXMgPSBncmlkRmllbGQ/OiBaRmllbGRcclxuXHJcbiAgcHVibGljIHNldENvbHVtbnMoY29sdW1uczogYW55W10pIHtcclxuICAgIHRoaXMuZ3JpZFNldHRpbmcuY29sdW1uRmllbGQgPSBjb2x1bW5zO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5nZXRHcmlkQ29sdW1ucyh0aGlzLmdyaWRTZXR0aW5nKTtcclxuXHJcbiAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmRlYnVnTG9nKCdnZW5lcmF0ZWQgZ3JpZCBjb2x1bW5zJywgdGhpcy5ncmlkU2V0dGluZyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
853
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemdyaWQuYmluZGluZy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96Z3JpZC96Z3JpZC5iaW5kaW5nLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBcUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1RSw2QkFBNkI7QUFFN0IsOEJBQThCO0FBQzlCLE9BQU8sRUFBdUIsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQXlDLE1BQU0sOEJBQThCLENBQUM7QUFLMUgseURBQXlEO0FBQ3pELE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsU0FBUyxFQUNWLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFNekIsTUFBTSxPQUFPLHFCQUFzQixTQUFRLG9CQUFvQjtJQXdEN0QsWUFDeUIsSUFBSSxFQUFFLHlGQUF5RjtJQUM5RyxhQUE0QixFQUM1QixZQUEwQjtJQUNsQyxtQ0FBbUM7SUFDbkMseURBQXlEO0lBQ2pELGNBQThCLEVBQzlCLFdBQXlCLEVBQ3pCLGNBQThCLEVBQzlCLG1CQUF3QztRQUVoRCxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFUSixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUcxQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWM7UUFDekIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFoRTFDLGdCQUFXLEdB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QUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLEtBQUs7WUFDWixZQUFZLEVBQUUsWUFBWTtZQUMxQixVQUFVLEVBQUUsVUFBVTtZQUN0QixRQUFRLEVBQUUsUUFBUTtZQUNsQixXQUFXLEVBQUUsV0FBVztTQUN6QixDQUFDO1FBQ0YscUNBQXFDO1FBQ3JDLElBQUksUUFBUSxLQUFLLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsRUFBRTtZQUN0RSxPQUFPLFVBQVUsQ0FBQztTQUNuQjtRQUVELGdEQUFnRDtRQUNoRCxPQUFPLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM1QyxDQUFDO0lBRU8sU0FBUyxDQUFDLFNBQWlCLEVBQUUsU0FBaUI7UUFDcEQsT0FBTyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsZ0NBQWdDO0lBQ2hDLHlCQUF5QjtJQUN6QiwrREFBK0Q7SUFDL0QsaURBQWlEO0lBQ2pELHNDQUFzQztJQUUvQixVQUFVLENBQUMsT0FBYztRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7UUFDdkMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0UsQ0FBQzs7a0hBcitCVSxxQkFBcUIsa0JBeUR0QixhQUFhO3NHQXpEWixxQkFBcUI7MkZBQXJCLHFCQUFxQjtrQkFIakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO2lCQUMzQjs7MEJBMERJLE1BQU07MkJBQUMsYUFBYTswTkFsRGQsWUFBWTtzQkFBcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgRGlyZWN0aXZlLCBPbkluaXQsIE9uRGVzdHJveSwgSW5wdXQsIEluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIG9mIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBEYXRhQmluZGluZ0RpcmVjdGl2ZSwgR3JpZENvbXBvbmVudCwgRGF0YVN0YXRlQ2hhbmdlRXZlbnQsIFBhZ2VDaGFuZ2VFdmVudCB9IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1ncmlkXCI7XHJcbmltcG9ydCB7IFNvcnREZXNjcmlwdG9yLCBGaWx0ZXJEZXNjcmlwdG9yLCB9IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tZGF0YS1xdWVyeVwiO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBaR3JpZFNlcnZpY2UgfSBmcm9tIFwiLi96Z3JpZC5zZXJ2aWNlXCI7XHJcbi8vaW1wb3J0IHsgTWFpblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvbWFpbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7XHJcbiAgWkNvbXBvbmVudEhlbHBlciwgWkZpZWxkLCBaR3JpZFBvc3RBcGlQYXJhbXMsXHJcbiAgV2ViQXBpU2VydmljZSwgWkdyb3VwLCBUb2FzdFNlcnZpY2UsIFNpZ25hbHJTZXJ2aWNlLCBBY3Rpb25UeXBlLCBaR3JpZENvbHVtbkNvbmZpZ3MsIFpHcmlkU2V0dGluZ3MsIExvZ2dpbmdTZXJ2aWNlLCBaR3JpZEZpbHRlclBhcmFtcyxcclxuICBTdGF0ZVR5cGUsIFN0YXRlU2V0dGluZ1NlcnZpY2VcclxufSBmcm9tIFwibW1oZ2xvYmFsLXpjb3JlXCI7XHJcblxyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6IFwiW3pncmlkYmluZGluZ11cIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFpHcmlkQmluZGluZ0RpcmVjdGl2ZSBleHRlbmRzIERhdGFCaW5kaW5nRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgY2hhbmdlRXZlbnQgPSB7XHJcbiAgICBwYWdlQ2hhbmdlZDogZmFsc2UsXHJcbiAgICBmaWx0ZXJDaGFuZ2VkOiBmYWxzZSxcclxuICAgIHNvcnRDaGFuZ2VkOiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgemdyaWRiaW5kaW5nOiB7XHJcbiAgICBkYXRhOiBaRmllbGQ7XHJcbiAgICBncm91cDogWkdyb3VwO1xyXG4gICAgcGFyYW1zOiBaR3JpZFBvc3RBcGlQYXJhbXM7XHJcbiAgICBncmlkU3ViamVjdDogU3ViamVjdDxhbnk+O1xyXG4gICAgZ3JpZFNldHRpbmc6IFpHcmlkU2V0dGluZ3M7XHJcbiAgfTtcclxuXHJcbiAgLy9zdGF0ZTogU3RhdGUgPSB7XHJcbiAgLy8gIHNraXA6IDAsXHJcbiAgLy8gIHRha2U6IDEwLFxyXG4gIC8vfTtcclxuXHJcbiAgLy9ncmlkQ29sdW1uczogYW55W10gPSBbXTtcclxuXHJcbiAgLy91c2FibGVDb2x1bW5zOiBhbnlbXSA9IFtdO1xyXG5cclxuICByZXNvdXJjZVVSTCA9IG51bGw7XHJcblxyXG4gIHBhZ2luYXRpb25BcGlQb3N0VXJsID0gbnVsbDtcclxuXHJcbiAgZGF0YVNvdXJjZSA9IG51bGw7XHJcblxyXG4gIGdldCBncmlkU2V0dGluZygpIHtcclxuICAgIHJldHVybiB0aGlzLnpncmlkYmluZGluZy5ncmlkU2V0dGluZztcclxuICB9XHJcbiAgc2V0IGdyaWRTZXR0aW5nKHZhbHVlKSB7XHJcbiAgICB0aGlzLnpncmlkYmluZGluZy5ncmlkU2V0dGluZyA9IHZhbHVlO1xyXG4gIH1cclxuICBnZXQgZmllbGQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YTtcclxuICB9XHJcblxyXG4gIGdldCBncnAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcuZ3JvdXA7XHJcbiAgfVxyXG5cclxuICBnZXQgZ3JpZFN1YmplY3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcuZ3JpZFN1YmplY3Q7XHJcbiAgfVxyXG5cclxuICBnZXQgcGFyYW1zKCk6IFpHcmlkUG9zdEFwaVBhcmFtcyB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcucGFyYW1zO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdldERhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkLmRhdGE7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoR3JpZENvbXBvbmVudCkgZ3JpZCwgLy8gSW5qZWN0aW5nIEdyaWRDb21wb25lbnQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBzY29wZSBhbmQgY29udGV4dCBvZiB0aGUgR3JpZENvbXBvbmVudC5cclxuICAgIHByaXZhdGUgd2ViYXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgICAvL3ByaXZhdGUgbWFpblNlcnZpY2U6IE1haW5TZXJ2aWNlLFxyXG4gICAgLy9wcml2YXRlIG9mZmxpbmVEYXRhYmFzZVNlcnZpY2U6IE9mZmxpbmVEYXRhYmFzZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNpZ25hbHJTZXJ2aWNlOiBTaWduYWxyU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3JpZFNlcnZpY2U6IFpHcmlkU2VydmljZSxcclxuICAgIHByaXZhdGUgbG9nZ2luZ1NlcnZpY2U6IExvZ2dpbmdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdGF0ZVNldHRpbmdTZXJ2aWNlOiBTdGF0ZVNldHRpbmdTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcihncmlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcblxyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMuZmllbGQuUGFnZVNpemUgfHwgMjA7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSB0aGlzLmZpZWxkLkRhdGFTb3VyY2UgPz8gbnVsbDtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xyXG4gICAgICB0aGlzLnJlc291cmNlVVJMID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICAgIHRoaXMuZmllbGQuUmVzb3VyY2VVUkwsXHJcbiAgICAgICAgdGhpcy5ncnBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5yZXNvdXJjZVVSTCkge1xyXG4gICAgICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuemdyaWRiaW5kaW5nLmRhdGEuTmFtZSAhPT0gXCJBY3Rpdml0eUxvZ0dyaWRcIikge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgICBcIk5vIGluaXRpYWxpc2UgZm9yIEZpZWxkLlJlc291cmNlVVJMOiBcIixcclxuICAgICAgICAgICAgdGhpcy5maWVsZC5SZXNvdXJjZVVSTFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNldFJlc291cmNlVXJsKHRoaXMucmVzb3VyY2VVUkwpO1xyXG5cclxuICAgICAgdGhpcy5zZXRGaWx0ZXJQYXJhbXNCeVBhcmVudFJlZklkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZmllbGQuRGlzYWJsZUdlbmVyYXRlQ29sdW1uQnlGb3JtKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbkZpZWxkcyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh0aGlzLmZpZWxkLkNvbHVtbkZpZWxkcywgdGhpcy5ncnApO1xyXG5cclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sdW1uRmllbGRzKSkge1xyXG4gICAgICAgIHRoaXMuc2V0Q29sdW1ucyhjb2x1bW5GaWVsZHMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5maWVsZFsnU2tpcExvYWRSZXNvdXJjZVVSTERhdGEnXSkge1xyXG4gICAgICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVHcmlkQ29sdW1ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmV0cmlldmVHcmlkU3RhdGVDYWNoZShzdGF0ZVR5cGU6IFN0YXRlVHlwZSwgZmllbGQ6IFpGaWVsZCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkU2VydmljZS5nZXRTdGF0ZUNhY2hlKHN0YXRlVHlwZSwgZmllbGQpLnBpcGUoXHJcbiAgICAgIG1hcCgoc2V0dGluZ0NhY2hlVmFsdWUpID0+IHtcclxuICAgICAgICAvLyBJZiBzZXR0aW5nQ2FjaGVWYWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZCwgY29udGludWUgd2l0aCBhIGZhbGxiYWNrIHZhbHVlXHJcbiAgICAgICAgcmV0dXJuIHNldHRpbmdDYWNoZVZhbHVlO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKChzZXR0aW5nQ2FjaGVWYWx1ZSkgPT4ge1xyXG4gICAgICAgIGlmIChzZXR0aW5nQ2FjaGVWYWx1ZSkge1xyXG4gICAgICAgICAgY29uc3QgcGFyc2VkSnNvbkRhdGEgPSBzZXR0aW5nQ2FjaGVWYWx1ZSBhcyBaR3JpZFNldHRpbmdzO1xyXG4gICAgICAgICAgaWYgKHBhcnNlZEpzb25EYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlID0gcGFyc2VkSnNvbkRhdGEuZ3JpZFN0YXRlID8/IHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlO1xyXG4gICAgICAgICAgICB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbkNvbmZpZ3VyYXRpb25zID0gcGFyc2VkSnNvbkRhdGEuY29sdW1uQ29uZmlndXJhdGlvbnMgPz8gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFJlc291cmNlVXJsKHJlc291cmNlVXJsOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGFycmF5ID0gcmVzb3VyY2VVcmwuc3BsaXQoXCIvYXBpL1wiKTtcclxuICAgIGlmICghIWFycmF5WzFdKSB7XHJcbiAgICAgIGFycmF5WzFdID0gXCJQYWdlXCIgKyBhcnJheVsxXTtcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uQXBpUG9zdFVybCA9IGFycmF5LmpvaW4oXCIvYXBpL1wiKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGFyciA9IHRoaXMucmVzb3VyY2VVUkwuc3BsaXQoXCIvXCIpO1xyXG4gICAgICBhcnJbYXJyLmxlbmd0aCAtIDJdID0gXCJQYWdlXCIgKyBhcnJbYXJyLmxlbmd0aCAtIDJdO1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsID0gYXJyLmpvaW4oXCIvXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRGaWx0ZXJQYXJhbXNCeVBhcmVudFJlZklkKCkge1xyXG4gICAgLy8gVXNlIGZpZWxkIG93biByZWZlcmVuY2VJZCBpZiBhdmFpbGFibGVcclxuICAgIGNvbnN0IHJlZklkID0gdGhpcy5nZXRGaWVsZFJlZmVyZW5jZUlkKCkgfHwgdGhpcy5ncnAucmVmZXJlbmNlSWQ7XHJcbiAgICBjb25zdCByZWZGaWVsZCA9IHRoaXMuZmllbGQuUmVmZXJlbmNlRmllbGQgfHwgdGhpcy5ncnAucGFyZW50UmVmZXJlbmNlRmllbGQ7XHJcbiAgICBpZiAocmVmSWQgJiYgcmVmRmllbGQpIHtcclxuICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSB7XHJcbiAgICAgICAga2V5OiByZWZGaWVsZCxcclxuICAgICAgICBvcHM6IFwiPVwiLFxyXG4gICAgICAgIHZhbHVlOiByZWZJZCxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKGZpbHRlclZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RmllbGRSZWZlcmVuY2VJZCgpIHtcclxuICAgIGxldCBmaWVsZFJlZmVyZW5jZUlkID0gbnVsbDtcclxuICAgIGlmICh0aGlzLmZpZWxkLlJlZmVyZW5jZUlkKSB7XHJcbiAgICAgIGZpZWxkUmVmZXJlbmNlSWQgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgICAgdGhpcy5maWVsZC5SZWZlcmVuY2VJZCxcclxuICAgICAgICB0aGlzLmdycFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpZWxkUmVmZXJlbmNlSWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2VuZXJhdGVHcmlkQ29sdW1ucygpIHtcclxuICAgIGNvbnN0IGNvbHVtbkZpZWxkcyQ6IE9ic2VydmFibGU8YW55PiA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgdGhpcy5maWVsZC5Db2x1bW5GaWVsZHMsXHJcbiAgICAgIHRoaXMuZ3JwXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChjb2x1bW5GaWVsZHMkKSB7XHJcbiAgICAgIGNvbHVtbkZpZWxkcyQucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKGRhdGEpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGdyaWRTdGF0ZUxvZ2ljID0gdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkU3RhdGVMb2dpYyh0aGlzLmZpZWxkKTtcclxuXHJcbiAgICAgICAgICBpZiAoZ3JpZFN0YXRlTG9naWMgJiYgZ3JpZFN0YXRlTG9naWMgIT09IFN0YXRlVHlwZS5jYWNoZWREYXRhU2V0dGluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXRyaWV2ZUdyaWRTdGF0ZUNhY2hlKFN0YXRlVHlwZS5zYXZlZFNldHRpbmcsIHRoaXMuZmllbGQpLnBpcGUoXHJcbiAgICAgICAgICAgICAgbWFwKChzdGF0ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXR1cm4gb2YoZGF0YSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmdyaWRTZXR0aW5nID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmdyaWRTZXR0aW5nLCAvLyBQcmVzZXJ2ZSBleGlzdGluZyBwcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgIGNvbHVtbkZpZWxkOiBkYXRhLFxyXG4gICAgICAgICAgICBncm91cDogdGhpcy56Z3JpZGJpbmRpbmcuZ3JvdXBcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBaQ29tcG9uZW50SGVscGVyLmdldEdyaWRDb2x1bW5zKHRoaXMuZ3JpZFNldHRpbmcpO1xyXG4gICAgICAgICAgdGhpcy5sb2dnaW5nU2VydmljZS5kZWJ1Z0xvZygnZ2VuZXJhdGVkIGdyaWQgY29sdW1ucycsIHRoaXMuZ3JpZFNldHRpbmcpO1xyXG5cclxuICAgICAgICAgIHRoaXMuZ2V0RmlsdGVyUGFyYW1zQ29sdW1ucygpO1xyXG4gICAgICAgICAgdGhpcy5nZXRGaWx0ZXIoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0RmlsdGVyUGFyYW1zKCk7XHJcbiAgICAgICAgICB0aGlzLmdldFNvcnRpbmcoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0R3JhbnRUeXBlKCk7XHJcbiAgICAgICAgICB0aGlzLnNldEhpZGRlbkNvbHVtbih0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbkNvbmZpZ3VyYXRpb25zKTtcclxuXHJcbiAgICAgICAgICB0aGlzLnBhcmFtcy5yZWZlcklkID0gdGhpcy5nZXRGaWVsZFJlZmVyZW5jZUlkKCkgfHwgdGhpcy5ncnAucmVmZXJlbmNlSWQgfHwgbnVsbDtcclxuICAgICAgICB9KVxyXG4gICAgICApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmllbGRbJ1NraXBMb2FkUmVzb3VyY2VVUkxEYXRhJ10pIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmdyaWRTdWJqZWN0Lm5leHQodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdGYWlsIHRvIGdlbmVyYXRlIGdyaWQgY29sdW1uIGZpZWxkcy4nKTtcclxuICAgICAgY29uc29sZS5sb2codGhpcy5maWVsZC5Db2x1bW5GaWVsZHMpO1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmdycCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0U2tpcExvYWRSZXNvdXJjZVVSTERhdGEoc2V0dGluZ1ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpZWxkWydTa2lwTG9hZFJlc291cmNlVVJMRGF0YSddID0gIXNldHRpbmdWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgdGl0bGUgb2YgYSBjb2x1bW4gaW4gdGhlIGdyaWQgc2V0dGluZyBiYXNlZCBvbiBpdHMgdmFsdWUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sVmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbE5hbWUgLSBUaGUgbmV3IHRpdGxlIGZvciB0aGUgY29sdW1uLlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRDb2x1bW5OYW1lKGNvbFZhbHVlOiBzdHJpbmcsIGNvbE5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gRmluZCB0aGUgY29sdW1uIHdpdGggdGhlIG1hdGNoaW5nIGNvbFZhbHVlLlxyXG4gICAgY29uc3QgY29sdW1uVG9VcGRhdGUgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmluZChmaWVsZCA9PiBmaWVsZC5WYWx1ZSA9PT0gY29sVmFsdWUpO1xyXG5cclxuICAgIC8vIElmIHRoZSBjb2x1bW4gaXMgZm91bmQsIHVwZGF0ZSBpdHMgdGl0bGUgcHJvcGVydHkgd2l0aCBjb2xOYW1lLlxyXG4gICAgaWYgKGNvbHVtblRvVXBkYXRlKSB7XHJcbiAgICAgIGNvbHVtblRvVXBkYXRlLnRpdGxlID0gY29sTmFtZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgdmlzaWJpbGl0eSBvZiBhIGNvbHVtbiBpbiB0aGUgZ3JpZCBiYXNlZCBvbiBpdHMgdmFsdWUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sVmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGNvbHVtbiB0byBzZXQgdmlzaWJpbGl0eSBmb3IuXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBpc1Zpc2libGUgLSBXaGV0aGVyIHRoZSBjb2x1bW4gc2hvdWxkIGJlIHZpc2libGUgKHRydWUpIG9yIGhpZGRlbiAoZmFsc2UpLlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRDb2x1bW5WaXNpYmxlKGNvbFZhbHVlOiBzdHJpbmcsIGlzVmlzaWJsZTogYm9vbGVhbikge1xyXG4gICAgLy8gRmluZCB0aGUgY29sdW1uIHdpdGggdGhlIG1hdGNoaW5nIGNvbFZhbHVlLlxyXG4gICAgY29uc3QgY29sdW1uVG9VcGRhdGUgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmluZChmaWVsZCA9PiBmaWVsZC5WYWx1ZSA9PT0gY29sVmFsdWUpO1xyXG5cclxuICAgIC8vIElmIHRoZSBjb2x1bW4gaXMgZm91bmQsIHVwZGF0ZSBpdHMgJ2hpZGRlbicgcHJvcGVydHkgYmFzZWQgb24gJ2lzVmlzaWJsZScuXHJcbiAgICBpZiAoY29sdW1uVG9VcGRhdGUpIHtcclxuICAgICAgY29sdW1uVG9VcGRhdGUuaGlkZGVuID0gIWlzVmlzaWJsZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGZpbHRlciBwYXJhbWV0ZXJzIGZvciBjb2x1bW5zIGFuZCBzZXQgdGhlbSBpbiB0aGUgJ3BhcmFtcycgb2JqZWN0LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJQYXJhbXNDb2x1bW5zKCkge1xyXG4gICAgLy8gQ3JlYXRlIGFuIGFycmF5IHRvIHN0b3JlIGNvbHVtbiBmaWVsZHMuXHJcbiAgICBjb25zdCBjb2xGaWVsZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuXHJcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGdyaWQgY29sdW1ucyB0byBidWlsZCBjb2x1bW4gZmllbGQgc3RyaW5ncy5cclxuICAgIHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgaWYgKGNvbHVtbi52YWx1ZUV4cHIpIHtcclxuICAgICAgICAvLyBJZiAndmFsdWVFeHByJyBleGlzdHMsIHVzZSBpdCBhcyBhbiBhbGlhcyBmb3IgdGhlIGZpZWxkLlxyXG4gICAgICAgIGNvbEZpZWxkcy5wdXNoKGNvbHVtbi52YWx1ZUV4cHIgKyBcIiBhcyBcIiArIGNvbHVtbi5maWVsZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29sRmllbGRzLnB1c2goY29sdW1uLmZpZWxkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgJ0lkJyBpcyBpbiB0aGUgY29sdW1uIGZpZWxkczsgaWYgbm90LCBhZGQgaXQuXHJcbiAgICBpZiAoY29sRmllbGRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgaWYgKGNvbEZpZWxkcy5pbmRleE9mKFwiSWRcIikgPT09IC0xKSB7XHJcbiAgICAgICAgY29sRmllbGRzLnB1c2goXCJJZFwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENyZWF0ZSBhbiBhcnJheSB0byB0ZW1wb3JhcmlseSBzdG9yZSB0aGUgZ2VuZXJhdGVkIGNvbHVtbiBmaWVsZHMuXHJcbiAgICBjb25zdCB0bXBHcmlkQ29sdW1uOiBhbnlbXSA9IFtdO1xyXG4gICAgdG1wR3JpZENvbHVtbi5wdXNoKGNvbEZpZWxkcy5qb2luKFwiLFwiKSk7XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgYXJlIGdlbmVyYXRlSGlkZGVuQ29sdW1ucyBpbiB0aGUgc2V0dGluZywgYWRkIHRoZW0gdG8gdGhlIGFycmF5LlxyXG4gICAgaWYgKHRoaXMuZ3JpZFNldHRpbmcuZ2VuZXJhdGVIaWRkZW5Db2x1bW5zPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRtcEdyaWRDb2x1bW4ucHVzaCh0aGlzLmdyaWRTZXR0aW5nLmdlbmVyYXRlSGlkZGVuQ29sdW1ucy5qb2luKFwiLFwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2V0IHRoZSAncGFyYW1zLmNvbHVtbnMnIHByb3BlcnR5IHdpdGggdGhlIGNvbmNhdGVuYXRlZCBjb2x1bW4gZmllbGRzLlxyXG4gICAgdGhpcy5wYXJhbXMuY29sdW1ucyA9IHRtcEdyaWRDb2x1bW4uam9pbihcIixcIik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgdGhlICdwYXJhbXMuZmlsdGVycycgcHJvcGVydHkgYmFzZWQgb24gdGhlICdmaWVsZC5GaWx0ZXJzJyBwcm9wZXJ0eS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsdGVyKCkge1xyXG4gICAgaWYgKHRoaXMucGFyYW1zLmZpbHRlcnMgJiYgdGhpcy5maWVsZC5GaWx0ZXJzKSB7XHJcbiAgICAgIC8vIENvbWJpbmUgJ3BhcmFtcy5maWx0ZXJzJyBhbmQgJ2ZpZWxkLkZpbHRlcnMnIHVzaW5nICcmJicgaWYgYm90aCBleGlzdC5cclxuICAgICAgdGhpcy5wYXJhbXMuZmlsdGVycyA9IGAke3RoaXMucGFyYW1zLmZpbHRlcnN9ICYmICR7dGhpcy5maWVsZC5GaWx0ZXJzfWA7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghdGhpcy5wYXJhbXMuZmlsdGVycyAmJiB0aGlzLmZpZWxkLkZpbHRlcnMpIHtcclxuICAgICAgLy8gVXNlICdmaWVsZC5GaWx0ZXJzJyBkaXJlY3RseSBpZiAncGFyYW1zLmZpbHRlcnMnIGRvZXNuJ3QgZXhpc3QuXHJcbiAgICAgIHRoaXMucGFyYW1zLmZpbHRlcnMgPSB0aGlzLmZpZWxkLkZpbHRlcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgJ2ZpZWxkLkZpbHRlcnMnIGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gJ2dyb3VwLicgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIGFjdHVhbCB2YWx1ZXMuXHJcbiAgICBpZiAodGhpcy5maWVsZC5GaWx0ZXJzICYmIHRoaXMuZmllbGQuRmlsdGVycy5zcGxpdChcIiBcIikuc29tZSgoZWxlbWVudCkgPT4gZWxlbWVudC50cmltKCkuc3RhcnRzV2l0aChcImdyb3VwLlwiKSkpIHtcclxuICAgICAgY29uc3QgZmlsdGVyS2V5VmFsUGFpcnMgPSB0aGlzLmZpZWxkLkZpbHRlcnMuc3BsaXQoXCIgXCIpO1xyXG4gICAgICBjb25zdCBncnBWYWx1ZXMgPSBmaWx0ZXJLZXlWYWxQYWlycy5maWx0ZXIoKGVsZW1lbnQpID0+IGVsZW1lbnQudHJpbSgpLnN0YXJ0c1dpdGgoXCJncm91cC5cIikpO1xyXG5cclxuICAgICAgZ3JwVmFsdWVzLmZvckVhY2goKHZhbCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFjdHVhbFZhbCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh2YWwsIHRoaXMuZ3JwKTtcclxuICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJzID0gdGhpcy5wYXJhbXMuZmlsdGVycy5yZXBsYWNlKHZhbCwgYWN0dWFsVmFsKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGZpbHRlciBwYXJhbWV0ZXJzIGluIHRoZSAncGFyYW1zLmZpbHRlclBhcmFtcycgcHJvcGVydHkgYmFzZWQgb24gJ2ZpZWxkWydGaWx0ZXJQYXJhbXMnXScuIGZpbHRlclBhcmFtcyA9PT0gdXNlZCBmb3IgdGhlIGlucHV0IGluIHRoZSBjb2x1bW4gZmlsdGVyIGF0IHRoZSBVSS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsdGVyUGFyYW1zKCkge1xyXG4gICAgY29uc3QgZmlsdGVyUGFyYW1zID0gdGhpcy5maWVsZFsnRmlsdGVyUGFyYW1zJ107XHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBmaWx0ZXIgcGFyYW1ldGVycyBpZiB1bmRlZmluZWQuXHJcbiAgICBpZiAoIXRoaXMucGFyYW1zLmZpbHRlclBhcmFtcykge1xyXG4gICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmlsdGVyUGFyYW1zKSB7XHJcbiAgICAgIGlmIChmaWx0ZXJQYXJhbXMuc3RhcnRzV2l0aChcImdyb3VwLlwiKSkge1xyXG4gICAgICAgIC8vIElmICdmaWx0ZXJQYXJhbXMnIHN0YXJ0cyB3aXRoIFwiZ3JvdXAuXCIsIGV4dGVuZCB0aGUgZXhpc3RpbmcgYXJyYXkuXHJcbiAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gW1xyXG4gICAgICAgICAgLi4udGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLFxyXG4gICAgICAgICAgLi4uWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGZpbHRlclBhcmFtcywgdGhpcy5ncnApXHJcbiAgICAgICAgXTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBJZiAnZmlsdGVyUGFyYW1zJyBkb2VzIG5vdCBzdGFydCB3aXRoIFwiZ3JvdXAuXCIsIHVzZSBpdCBkaXJlY3RseS5cclxuICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSBbXHJcbiAgICAgICAgICAuLi50aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMsXHJcbiAgICAgICAgICBmaWx0ZXJQYXJhbXNcclxuICAgICAgICBdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGNvbHVtbiBmaWx0ZXJzIGluIHRoZSBncmlkIHN0YXRlIGFuZCBhcHBlbmQgdG8gZmlsdGVycGFyYW1cclxuICAgIGlmICh0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZT8uZmlsdGVyPy5maWx0ZXJzKSB7XHJcbiAgICAgIHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLmZpbHRlcj8uZmlsdGVycz8uZm9yRWFjaCgoZmlsdGVyOiBGaWx0ZXJEZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmlsdGVyUGFyYW0gPSB7XHJcbiAgICAgICAgICBrZXk6IGZpbHRlci5maWVsZCBhcyBzdHJpbmcsXHJcbiAgICAgICAgICBvcHM6IHRoaXMubWFwRmlsdGVyT3BlcmF0b3IoZmlsdGVyLm9wZXJhdG9yKSxcclxuICAgICAgICAgIHZhbHVlOiBmaWx0ZXIudmFsdWUgPT09IG51bGwgPyBcIlwiIDogZmlsdGVyLnZhbHVlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgYSBmaWx0ZXIgcGFyYW1ldGVyIHdpdGggdGhlIHNhbWUga2V5IGFscmVhZHkgZXhpc3RzLlxyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUGFyYW0gPSB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMuZmluZCgocGFyYW0pID0+IHBhcmFtLmtleSA9PT0gZmlsdGVyUGFyYW0ua2V5KTtcclxuICAgICAgICBpZiAoZXhpc3RpbmdQYXJhbSkge1xyXG4gICAgICAgICAgLy8gSWYgYSBmaWx0ZXIgcGFyYW1ldGVyIHdpdGggdGhlIHNhbWUga2V5IGV4aXN0cywgdXBkYXRlIGl0cyB2YWx1ZS5cclxuICAgICAgICAgIGV4aXN0aW5nUGFyYW0udmFsdWUgPSBmaWx0ZXJQYXJhbS52YWx1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gSWYgbm8gZmlsdGVyIHBhcmFtZXRlciB3aXRoIHRoZSBzYW1lIGtleSwgYWRkIGl0IHRvIHRoZSBmaWx0ZXIgcGFyYW1ldGVycy5cclxuICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKGZpbHRlclBhcmFtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBzb3J0aW5nIG9yZGVyIGluIHRoZSAncGFyYW1zLnNvcnRPcmRlcicgcHJvcGVydHkgYmFzZWQgb24gJ2ZpZWxkLlNvcnRPcmRlcicuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldFNvcnRpbmcoKSB7XHJcbiAgICBjb25zdCBzb3J0T3JkZXIgPSB0aGlzLmZpZWxkLlNvcnRPcmRlcjtcclxuXHJcbiAgICAvLyBDaGVjayBpZiAnc29ydE9yZGVyJyBpcyBkZWZpbmVkIGFuZCBzdGFydHMgd2l0aCBcImdyb3VwLlwiLlxyXG4gICAgaWYgKHNvcnRPcmRlciAmJiBzb3J0T3JkZXIuc3RhcnRzV2l0aChcImdyb3VwLlwiKSkge1xyXG4gICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXIgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoc29ydE9yZGVyLCB0aGlzLmdycCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gSWYgJ3NvcnRPcmRlcicgaXMgbm90IGRlZmluZWQgb3IgZG9lc24ndCBzdGFydCB3aXRoIFwiZ3JvdXAuXCIsIHVzZSBpdCBkaXJlY3RseS5cclxuICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVyID0gc29ydE9yZGVyO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBJbml0aWFsaXplIHNvcnQgcGFyYW1ldGVycyBpZiB1bmRlZmluZWQuXHJcbiAgICBpZiAoIXRoaXMucGFyYW1zLnNvcnRPcmRlcnMpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycyA9IFtdO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLnNvcnQpIHtcclxuICAgICAgdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUuc29ydC5mb3JFYWNoKChkZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IuZGlyKSB7XHJcbiAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0gZGVzY3JpcHRvci5maWVsZCk7XHJcbiAgICAgICAgICBjb25zdCBzb3J0Q29sdW1uTmFtZSA9IGZpZWxkLnZhbHVlRXhwciAhPT0gdW5kZWZpbmVkID8gZmllbGQudmFsdWVFeHByIDogZGVzY3JpcHRvci5maWVsZDtcclxuXHJcbiAgICAgICAgICAvLyBDaGVjayBpZiBhIHNvcnQgY29sdW1uIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy5cclxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nU29ydENvbHVtbkluZGV4ID0gdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzLmZpbmRJbmRleCgobmFtZSkgPT4gbmFtZSA9PT0gc29ydENvbHVtbk5hbWUpO1xyXG5cclxuICAgICAgICAgIGlmIChleGlzdGluZ1NvcnRDb2x1bW5JbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgLy8gSWYgYSBzb3J0IGNvbHVtbiB3aXRoIHRoZSBzYW1lIG5hbWUgZXhpc3RzLCB1cGRhdGUgaXRzIHNvcnQgb3JkZXIuXHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlcnNbZXhpc3RpbmdTb3J0Q29sdW1uSW5kZXhdID0gZGVzY3JpcHRvci5kaXI7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJZiBubyBzb3J0IGNvbHVtbiB3aXRoIHRoZSBzYW1lIG5hbWUsIGFkZCBpdCB0byB0aGUgc29ydCBjb2x1bW5zIGFuZCBzb3J0IG9yZGVycy5cclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzLnB1c2goc29ydENvbHVtbk5hbWUpO1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXJzLnB1c2goZGVzY3JpcHRvci5kaXIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGdyYW50IHR5cGUgaW4gdGhlICdwYXJhbXMuZ3JhbnRUeXBlJyBwcm9wZXJ0eSBiYXNlZCBvbiAnZmllbGQuR3JhbnRUeXBlJy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0R3JhbnRUeXBlKCkge1xyXG4gICAgY29uc3QgZ3JhbnRUeXBlID0gdGhpcy5maWVsZC5HcmFudFR5cGU7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgJ2dyYW50VHlwZScgaXMgZGVmaW5lZC5cclxuICAgIGlmIChncmFudFR5cGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLmdyYW50VHlwZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShncmFudFR5cGUudG9TdHJpbmcoKSwgdGhpcy5ncnApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSAnaGlkZGVuJyBwcm9wZXJ0eSBmb3IgY29sdW1ucyBpbiAnZ3JpZFNldHRpbmcnIGJhc2VkIG9uICdjb2x1bW5Db25maWdzJy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7WkdyaWRDb2x1bW5Db25maWdzW119IGNvbHVtbkNvbmZpZ3MgLSBUaGUgY29sdW1uIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRIaWRkZW5Db2x1bW4oY29sdW1uQ29uZmlnczogWkdyaWRDb2x1bW5Db25maWdzW10pIHtcclxuICAgIGlmICh0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMgJiYgY29sdW1uQ29uZmlncykge1xyXG4gICAgICAvLyBGaWx0ZXIgb3V0IGhpZGRlbiBjb2x1bW5zIGluICdjb2x1bW5Db25maWdzJy5cclxuICAgICAgY29uc3QgaGlkZGVuQ29sdW1ucyA9IGNvbHVtbkNvbmZpZ3MuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uaGlkZGVuID09PSB0cnVlKTtcclxuXHJcbiAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBoaWRkZW4gY29sdW1ucyBhbmQgdXBkYXRlICdncmlkU2V0dGluZycgYWNjb3JkaW5nbHkuXHJcbiAgICAgIGhpZGRlbkNvbHVtbnMuZm9yRWFjaChoaWRkZW5Db2x1bW4gPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKGMgPT4gYy5maWVsZCA9PT0gaGlkZGVuQ29sdW1uLmZpZWxkKTtcclxuICAgICAgICBpZiAoY29sdW1uKSB7XHJcbiAgICAgICAgICBjb2x1bW4uaGlkZGVuID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmUgZGF0YSBmb3IgZGF0YSBiaW5kaW5nLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBza2lwVXNlQ2FjaGUgLSBXaGV0aGVyIHRvIHNraXAgdXNpbmcgY2FjaGUgZm9yIGRhdGEgcmV0cmlldmFsLlxyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXREYXRhQmluZGluZyhza2lwVXNlQ2FjaGU/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmdyaWQubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmdldEdyaWREYXRhKCk7XHJcblxyXG4gICAgLy8gY29uc3QgY2FjaGVJbmZvID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5DYWNoZUluZm87XHJcblxyXG4gICAgLy8gaWYgKCFjYWNoZUluZm8gfHwgc2tpcFVzZUNhY2hlKSB7XHJcbiAgICAvLyAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgIC8vICAgcmV0dXJuO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIGlmIChjYWNoZUluZm8pIHtcclxuICAgIC8vICAgY29uc3QgZ3JpZFN0YXRlTG9naWMgPSB0aGlzLmdyaWRTZXJ2aWNlLmdldEdyaWRTdGF0ZUxvZ2ljKHRoaXMuZmllbGQpO1xyXG4gICAgLy8gICBpZiAoZ3JpZFN0YXRlTG9naWMgPT09IEdyaWRTdGF0ZUxvZ2ljVHlwZS5TZXR0aW5nT25seSkge1xyXG4gICAgLy8gICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgIC8vICAgICByZXR1cm47XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBjb21tZW50IG91dCBvbiAyMDI0MTAwMS4gZGVmYXVsdCB0byBmZXRjaCB0aGUgZGF0YSBmcm9tIGFwaSBpbnN0ZWFkIG9mIGxvYWRpbmcgZnJvbXQgaGUgY2FjaGUuXHJcbiAgICAvLyBpZiAoIXRoaXMuY2hhbmdlRXZlbnQucGFnZUNoYW5nZWQgJiYgIXRoaXMuY2hhbmdlRXZlbnQuc29ydENoYW5nZWQgJiYgIXRoaXMuY2hhbmdlRXZlbnQuZmlsdGVyQ2hhbmdlZCkge1xyXG4gICAgLy8gICBjb25zdCBjdXJyZW50RGF0YUNhY2hlSW5mbyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2VuZXJhdGVDYWNoZUluZm8odGhpcy56Z3JpZGJpbmRpbmcuZGF0YSk7XHJcbiAgICAvLyAgIGNvbnN0IHJlc3VsdCA9IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS5nZXRJdGVtQnlLZXkoY3VycmVudERhdGFDYWNoZUluZm8sIGN1cnJlbnREYXRhQ2FjaGVJbmZvLm9mZmxpbmVEYXRhYmFzZUtleSk7XHJcbiAgICAvLyAgIGlmIChyZXN1bHQpIHtcclxuICAgIC8vICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUocmVzdWx0LmRhdGEsIHRydWUpO1xyXG4gICAgLy8gICB9IGVsc2Uge1xyXG4gICAgLy8gICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gICAgLy8gZWxzZSB7XHJcbiAgICAvLyB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZSBncmlkIGRhdGEuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldEdyaWREYXRhKCkge1xyXG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UpIHtcclxuICAgICAgaWYgKCF0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdHcmlkIHBhZ2luYXRpb24gQVBJIFVSTCBpcyB1bmRlZmluZWQuJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBzdGF0ZVNraXAgPSB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZSA/IHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLnNraXAgOiB0aGlzLnN0YXRlLnNraXA7XHJcbiAgICAgIGNvbnN0IHN0YXRlVGFrZSA9IHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlID8gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUudGFrZSA6IHRoaXMuc3RhdGUudGFrZTtcclxuXHJcbiAgICAgIHRoaXMucGFyYW1zLnBhZ2VObyA9IHRoaXMuZ2V0UGFnZU5vKHN0YXRlU2tpcCwgc3RhdGVUYWtlKTtcclxuICAgICAgdGhpcy5wYXJhbXMucGFnZVNpemUgPSBzdGF0ZVRha2U7XHJcblxyXG4gICAgICBpZiAodGhpcy5maWVsZC5FeHRlcm5hbFBhZ2luYXRpb24pIHtcclxuICAgICAgICAvLyBGb3IgUE9TVCBtZXRob2QgUGFnZSBXZWJBUElcclxuICAgICAgICB0aGlzLndlYmFwaVNlcnZpY2VcclxuICAgICAgICAgIC5wb3N0QXBpKHRoaXMucGFnaW5hdGlvbkFwaVBvc3RVcmwsIHRoaXMucGFyYW1zLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCB0cnVlKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIG5leHQ6IChyZXNwKSA9PiB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUocmVzcCksXHJcbiAgICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyhcIkVycm9yIG9jY3VyIGluIGxvYWRpbmcgdGhlIGRhdGFcIiwgXCJtaWRkbGVcIiwgZmFsc2UsIDE1MDAsIFwiZGFuZ2VyXCIpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIEZvciBHRVQgbWV0aG9kXHJcbiAgICAgICAgdGhpcy53ZWJhcGlTZXJ2aWNlXHJcbiAgICAgICAgICAuZ2V0QXBpKHRoaXMucmVzb3VyY2VVUkwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIHRydWUpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBkYXRhID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IHRvdGFsQ291bnQgPSAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3AuZGF0YVNldCkge1xyXG4gICAgICAgICAgICAgIGRhdGEgPSByZXNwLmRhdGFTZXQ7XHJcbiAgICAgICAgICAgICAgdG90YWxDb3VudCA9IHJlc3AudG90YWxDb3VudDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBkYXRhID0gcmVzcDtcclxuICAgICAgICAgICAgICB0b3RhbENvdW50ID0gcmVzcC5sZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZSh7IGRhdGFTZXQ6IGRhdGEsIHRvdGFsQ291bnQ6IHRvdGFsQ291bnQgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnN0IGRhdGFTZXQgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgICAgdGhpcy5maWVsZC5EYXRhU291cmNlLFxyXG4gICAgICAgIHRoaXMuZ3JwXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLmRhdGEgPSBkYXRhU2V0O1xyXG4gICAgICB0aGlzLmdyaWQubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmdyaWRTdWJqZWN0Lm5leHQodGhpcyk7XHJcbiAgICAgIHRoaXMubm90aWZ5RGF0YUNoYW5nZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGRhdGE6IGFueSwgc2tpcENhY2hlRGF0YT86IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuYWdncmVnYXRlSGFuZGxpbmcoZGF0YS5kYXRhU2V0KTtcclxuICAgIHRoaXMuZ3JpZC5kYXRhID0geyBkYXRhOiBkYXRhLmRhdGFTZXQsIHRvdGFsOiBkYXRhLnRvdGFsQ291bnQgfTtcclxuICAgIGlmICghc2tpcENhY2hlRGF0YSkge1xyXG4gICAgICBjb25zdCBzdGF0ZUxvZ2ljID0gdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkU3RhdGVMb2dpYyh0aGlzLmZpZWxkKTtcclxuICAgICAgaWYgKHN0YXRlTG9naWMgPT09IFN0YXRlVHlwZS5jYWNoZWREYXRhU2V0dGluZyB8fCBzdGF0ZUxvZ2ljID09PSBTdGF0ZVR5cGUuc2F2ZWRBbmRDYWNoZWREYXRhU2V0dGluZykge1xyXG4gICAgICAgIHRoaXMuY2FjaGVHcmlkRGF0YShzdGF0ZUxvZ2ljKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuYWZ0ZXJEYXRhQmluZGVkKGRhdGEpO1xyXG4gICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgdGhpcy5ub3RpZnlEYXRhQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0Q2hhbmdlRXZlbnRGbGFnKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VFdmVudCA9IHtcclxuICAgICAgcGFnZUNoYW5nZWQ6IGZhbHNlLFxyXG4gICAgICBmaWx0ZXJDaGFuZ2VkOiBmYWxzZSxcclxuICAgICAgc29ydENoYW5nZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhY2hlR3JpZERhdGEoc3RhdGVMb2dpYzogU3RhdGVUeXBlKSB7XHJcbiAgICBjb25zdCBjYWNoZU5hbWUgPSB0aGlzLnN0YXRlU2V0dGluZ1NlcnZpY2UuZ2V0U3RvcmFnZUNhY2hlS2V5KHN0YXRlTG9naWMsIHRoaXMuZmllbGQpO1xyXG4gICAgY29uc3QgZ3JpZFN0YXRlID0gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGU7XHJcbiAgICBjb25zdCBncmlkRGF0YSA9IHRoaXMuZ3JpZD8uZGF0YSB8fCBudWxsO1xyXG5cclxuICAgIGlmICghZ3JpZERhdGFbJ2RhdGEnXSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2FjaGVJbmZvID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5DYWNoZUluZm87XHJcblxyXG4gICAgaWYgKGNhY2hlSW5mbyAmJiAhY2FjaGVJbmZvLkRpc2FibGVDYWNoZURhdGEpIHtcclxuICAgICAgY29uc3QgY29sdW1uQ29uZmlndXJhdGlvbnMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyaWRDb2x1bW5zQ29uZmlnKHRoaXMuemdyaWRiaW5kaW5nLmdyaWRTZXR0aW5nLmNvbHVtbnMpO1xyXG4gICAgICBsZXQgdXBkYXRlZERhdGEgPSBbLi4uZ3JpZERhdGFbJ2RhdGEnXV07XHJcbiAgICAgIGxldCBza2lwTGlzdCA9IFtncmlkU3RhdGUuc2tpcF07XHJcbiAgICAgIGxldCBjdXJyZW50R3JpZFNraXAgPSBncmlkU3RhdGUuc2tpcDtcclxuXHJcbiAgICAgIGNvbnN0IGNhY2hlR3JpZERhdGEgPSB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgZGF0YVNldDogdXBkYXRlZERhdGEsXHJcbiAgICAgICAgICB0b3RhbENvdW50OiBncmlkRGF0YVsndG90YWwnXVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ3JpZFN0YXRlOiBncmlkU3RhdGUsXHJcbiAgICAgICAgc2tpcExpc3Q6IHNraXBMaXN0LFxyXG4gICAgICAgIGNhY2hlRHVyYXRpb246IGNhY2hlSW5mby5DYWNoZUR1cmF0aW9uLFxyXG4gICAgICAgIGNvbHVtbkNvbmZpZ3VyYXRpb25zOiBjb2x1bW5Db25maWd1cmF0aW9uc1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGNhY2hlTmFtZSwgSlNPTi5zdHJpbmdpZnkoY2FjaGVHcmlkRGF0YSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9cIkZlYXR1cmVEZXZlbG9wbWVudHxDb21wZXRlbmN5XCJcclxuICAvLyBjb21tZW50ZWQgb3V0IGZvciBmdXR1cmUgcmVmZXJlbmNlIGFuZCByZS1kZXZlbG9wLlxyXG4gIC8vIHByaXZhdGUgYXN5bmMgc3Vic2NyaWJlQ2FjaGVEYXRhQ2hhbmdlcygpIHtcclxuICAvLyAgIGNvbnN0IGNhY2hlSW5mbyA9IHRoaXMuemdyaWRiaW5kaW5nLmRhdGEuQ2FjaGVJbmZvO1xyXG5cclxuICAvLyAgIGlmIChjYWNoZUluZm8gJiYgIWNhY2hlSW5mby5EaXNhYmxlQ2FjaGVEYXRhKSB7XHJcbiAgLy8gICAgIC8vIGNhbm5vdCB1c2UgbWFpbiBzZXJ2aWNlIGhlcmUuIHdpbGwgZ2V0IGNpcmN1bGFyIGVycm9yIHdoZW4gYnVpbGQgbGliXHJcbiAgLy8gICAgIC8vdGhpcy5tYWluU2VydmljZS5qb2luUHJvamVjdFNpZ25hbFIoKTtcclxuXHJcbiAgLy8gICAgIGNvbnN0IGNhbGxCYWNrRnVuY3Rpb24gPSBgJHtjYWNoZUluZm8uTmFtZX1faGFuZGxlUmVjZWl2ZWRNZXNzYWdlYDtcclxuXHJcbiAgLy8gICAgIC8vIGNyZWF0ZSBhbmQgYmluZCBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiYWNrIGZvciB0aGUgZ3JpZCBpbiB0aGUgZ3JvdXAgdHJpZ2dlciBieSBzaWduYWxSLlxyXG4gIC8vICAgICBpZiAoIXRoaXMuZ3JwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXIpIHtcclxuICAvLyAgICAgICB0aGlzLmdycC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyID0ge307XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgdGhpcy5ncnAuc2lnbmFsUkNhbGxiYWNrSGFuZGxlcltjYWxsQmFja0Z1bmN0aW9uXSA9IHRoaXMuaGFuZGxlUmVjZWl2ZWRNZXNzYWdlLmJpbmQodGhpcyk7XHJcblxyXG4gIC8vICAgICBjb25zdCBnZW5lcmF0ZWRDYWNoZUluZm8gPSB0aGlzLmdyaWRTZXJ2aWNlLmdlbmVyYXRlQ2FjaGVJbmZvKHRoaXMuemdyaWRiaW5kaW5nLmRhdGEpO1xyXG4gIC8vICAgICBpZiAoZ2VuZXJhdGVkQ2FjaGVJbmZvLmRlZmluZWREYXRhYmFzZSAmJiBnZW5lcmF0ZWRDYWNoZUluZm8uZGVmaW5lZFRhYmxlKSB7XHJcbiAgLy8gICAgICAgZ2VuZXJhdGVkQ2FjaGVJbmZvLmRlZmluZWREYXRhYmFzZS5mb3JFYWNoKGRiID0+IHtcclxuICAvLyAgICAgICAgIGdlbmVyYXRlZENhY2hlSW5mby5kZWZpbmVkVGFibGUuZm9yRWFjaCh0YWJsZSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGAke2RifXwke3RhYmxlfWA7XHJcbiAgLy8gICAgICAgICAgIGNvbnNvbGUubG9nKGBMaXN0ZW5pbmcgdG8gZXZlbnQgbmFtZTogJHtldmVudE5hbWV9YCk7XHJcbiAgLy8gICAgICAgICAgIHRoaXMuc2lnbmFsclNlcnZpY2Uuc3Vic2NyaWJlVG9FdmVudCh0aGlzLmdycCwgYCR7ZXZlbnROYW1lfWAsIGBncm91cC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyLiR7Y2FsbEJhY2tGdW5jdGlvbn1gKTtcclxuICAvLyAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBhc3luYyBoYW5kbGVSZWNlaXZlZE1lc3NhZ2UoZ3JvdXA6IFpHcm91cCwgcmVzdWx0OiBhbnksIGV2ZW50TmFtZTogc3RyaW5nKSB7XHJcbiAgLy8gICBjb25zb2xlLmxvZyhgVGhlIFNpZ25hbHIgdHJpZ2dlciBoYXMgYmVlbiBkZXRlY3RlZC4gTm93LCBwcm9jZWVkIHRvIHVwZGF0ZSB0aGUgY2FjaGUgYW5kIGdyaWQgZGF0YS5gKTtcclxuXHJcbiAgLy8gICBjb25zdCByZXNwb25zZWRSZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XHJcbiAgLy8gICBjb25zdCBhY3Rpb25UeXBlID0gcmVzcG9uc2VkUmVzdWx0LkFjdGlvbjtcclxuICAvLyAgIGNvbnN0IHJlc3BvbnNlZFJlc3VsdElkID0gcmVzcG9uc2VkUmVzdWx0WydJZCddO1xyXG4gIC8vICAgY29uc3QgdGVtcFBhcmFtcyA9IFpDb21wb25lbnRIZWxwZXIuZGVlcENsb25lKHRoaXMucGFyYW1zKTtcclxuICAvLyAgIGNvbnN0IGN1cnJlbnREYXRhQ2FjaGVJbmZvID0gdGhpcy5ncmlkU2VydmljZS5nZW5lcmF0ZUNhY2hlSW5mbyh0aGlzLnpncmlkYmluZGluZy5kYXRhKTtcclxuICAvLyAgIGNvbnN0IGN1cnJlbnREYXRhID0gYXdhaXQgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLmdldEl0ZW1CeUtleShjdXJyZW50RGF0YUNhY2hlSW5mbywgY3VycmVudERhdGFDYWNoZUluZm8ub2ZmbGluZURhdGFiYXNlS2V5KTtcclxuXHJcbiAgLy8gICBpZiAoY3VycmVudERhdGEpIHtcclxuICAvLyAgICAgdGVtcFBhcmFtcy5maWx0ZXJzID0gYElkPSR7cmVzcG9uc2VkUmVzdWx0SWR9YDtcclxuXHJcbiAgLy8gICAgIGlmIChhY3Rpb25UeXBlID09PSBBY3Rpb25UeXBlLkRlbGV0ZSkge1xyXG4gIC8vICAgICAgIGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldCA9IGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldC5maWx0ZXIoaXRlbSA9PiBpdGVtLklkICE9PSBwYXJzZUludChyZXNwb25zZWRSZXN1bHRJZCkpO1xyXG5cclxuICAvLyAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoY3VycmVudERhdGEuZGF0YSwgdHJ1ZSk7XHJcbiAgLy8gICAgICAgYXdhaXQgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLnVwZGF0ZUl0ZW0oY3VycmVudERhdGFDYWNoZUluZm8sIGN1cnJlbnREYXRhKTtcclxuXHJcbiAgLy8gICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG5cclxuICAvLyAgICAgICBjb25zb2xlLmxvZyhgSXRlbSB1cGRhdGVkOiAke2N1cnJlbnREYXRhfWApO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGVsc2Uge1xyXG4gIC8vICAgICAgIHRoaXMud2ViYXBpU2VydmljZS5wb3N0QXBpKHRoaXMucGFnaW5hdGlvbkFwaVBvc3RVcmwsIHRlbXBQYXJhbXMsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIHRydWUpLnN1YnNjcmliZShhc3luYyByZXNwID0+IHtcclxuXHJcbiAgLy8gICAgICAgICBjb25zdCBkYXRhYmFzZVJlY29yZCA9IHJlc3AuZGF0YVNldFswXTtcclxuXHJcbiAgLy8gICAgICAgICBpZiAoZGF0YWJhc2VSZWNvcmQpIHtcclxuICAvLyAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFjdGlvblR5cGUuVXBkYXRlKSB7XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgaW5kZXhUb1VwZGF0ZSA9IGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLklkID09PSBkYXRhYmFzZVJlY29yZC5JZCk7XHJcbiAgLy8gICAgICAgICAgICAgaWYgKGluZGV4VG9VcGRhdGUgIT09IC0xKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHVwZGF0ZWQgbmFtZVxyXG4gIC8vICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZEl0ZW0gPSB7IC4uLmN1cnJlbnREYXRhLmRhdGEuZGF0YVNldFtpbmRleFRvVXBkYXRlXSwgLi4uZGF0YWJhc2VSZWNvcmQgfTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBvbGQgaXRlbSB3aXRoIHRoZSB1cGRhdGVkIG9uZVxyXG4gIC8vICAgICAgICAgICAgICAgY3VycmVudERhdGEuZGF0YS5kYXRhU2V0W2luZGV4VG9VcGRhdGVdID0gdXBkYXRlZEl0ZW07XHJcblxyXG4gIC8vICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG5cclxuICAvLyAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS51cGRhdGVJdGVtKGN1cnJlbnREYXRhQ2FjaGVJbmZvLCBjdXJyZW50RGF0YSk7XHJcblxyXG4gIC8vICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEl0ZW0gdXBkYXRlZDogJHtjdXJyZW50RGF0YX1gKTtcclxuICAvLyAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJJdGVtIG5vdCBmb3VuZCB3aXRoIElEOlwiLCBkYXRhYmFzZVJlY29yZC5JZCk7XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIGVsc2UgaWYgKGFjdGlvblR5cGUgPT09IEFjdGlvblR5cGUuQWRkICYmIGN1cnJlbnREYXRhLmdyaWRTdGF0ZS5za2lwIDwgMjApIHtcclxuICAvLyAgICAgICAgICAgICBjdXJyZW50RGF0YS5kYXRhLmRhdGFTZXQudW5zaGlmdChkYXRhYmFzZVJlY29yZCk7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG4gIC8vICAgICAgICAgICAgIGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS51cGRhdGVJdGVtKGN1cnJlbnREYXRhQ2FjaGVJbmZvLCBjdXJyZW50RGF0YSk7XHJcblxyXG4gIC8vICAgICAgICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShjdXJyZW50RGF0YS5kYXRhLCB0cnVlKTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coYEl0ZW0gdXBkYXRlZDogJHtjdXJyZW50RGF0YX1gKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgZWxzZSB7XHJcbiAgLy8gICAgICAgICAgIC8vIFVuYWJsZSB0byBnZXQgZGF0YSwgcmVmcmVzaCB0aGUgd2hvbGUgZ3JpZCBkYXRhIGZyb20gQVBJXHJcbiAgLy8gICAgICAgICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9KTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgZWxzZSB7XHJcbiAgLy8gICAgIC8vIFVuYWJsZSB0byBnZXQgZnJvbSBpbmRleGVkREIgc3RyYWlnaHQgZ2V0IGZyb20gQVBJXHJcbiAgLy8gICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJEYXRhQmluZGVkKGRhdGEpIHtcclxuICAgIC8vIGFsbG93IHRvIGNhbGwgYmFjayBwcm9qZWN0IHBhZ2UgYWZ0ZXIgZGF0YSBiaW5kZWQuXHJcbiAgICBsZXQgYmluZGVkVmFsdWUgPSB0aGlzLnpncmlkYmluZGluZy5kYXRhWydBZnRlckRhdGFCaW5kZWQnXTtcclxuICAgIGlmIChiaW5kZWRWYWx1ZSkge1xyXG4gICAgICBjb25zdCBtZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMpO1xyXG4gICAgICBsZXQgY2FsbEZ1bmM7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IGJpbmRlZFZhbHVlLm1hdGNoKC9cXGJcXCguKi9naSk7XHJcbiAgICAgICAgaWYgKHBhcmFtcykge1xyXG4gICAgICAgICAgYmluZGVkVmFsdWUgPSBiaW5kZWRWYWx1ZS5yZXBsYWNlKHBhcmFtc1swXSwgXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJpbmRlZFZhbHVlID0gYmluZGVkVmFsdWUucmVwbGFjZSgnbW9kYWxHcm91cC4nLCAnZ3JvdXAuJyk7XHJcbiAgICAgICAgY2FsbEZ1bmMgPSBldmFsKCdtZS56Z3JpZGJpbmRpbmcuJyArIGJpbmRlZFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICBcIkVycm9yIHdoZW4gZ2V0R3JvdXBWYWx1ZTogXCIsXHJcbiAgICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgICBcIiA+IEVycm9yOiBcIixcclxuICAgICAgICAgIGVycm9yXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHR5cGVvZiBjYWxsRnVuYyA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgY29uc3QgbmV3RnVuYyA9IGNhbGxGdW5jLmJpbmQobWUpO1xyXG4gICAgICAgIG5ld0Z1bmMoZXZlbnQsIG1lLnpncmlkYmluZGluZy5kYXRhLCBkYXRhKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyRGF0YSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZC5kYXRhID0geyBkYXRhOiBbXSwgdG90YWw6IDAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBjb2x1bW4gYWdncmVnYXRpb24gZm9yIHRoZSBnaXZlbiBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHthbnlbXX0gZGF0YSAtIFRoZSBkYXRhIHRvIGFnZ3JlZ2F0ZS5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGFnZ3JlZ2F0ZUhhbmRsaW5nKGRhdGE6IGFueSkge1xyXG4gICAgY29uc3QgYWdncmVnYXRlQ29sdW1ucyA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5hZ2dyZWdhdGVUeXBlKTtcclxuXHJcbiAgICBhZ2dyZWdhdGVDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSBjb2wuZmllbGQ7XHJcbiAgICAgIGNvbnN0IGFnZ3JlZ2F0ZVR5cGUgPSBjb2wuYWdncmVnYXRlVHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJzonLCAnJyk7XHJcblxyXG4gICAgICBsZXQgYWdncmVnYXRlVmFsdWUgPSBudWxsO1xyXG4gICAgICBzd2l0Y2ggKGFnZ3JlZ2F0ZVR5cGUpIHtcclxuICAgICAgICBjYXNlIFwidG90YWxcIjpcclxuICAgICAgICBjYXNlIFwic3VtXCI6XHJcbiAgICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGRhdGEucmVkdWNlKCh0b3RhbCwgbmV4dCkgPT4gdG90YWwgKyBuZXh0W2ZpZWxkXSwgMCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiYXZlcmFnZVwiOlxyXG4gICAgICAgICAgYWdncmVnYXRlVmFsdWUgPSBkYXRhLnJlZHVjZSgodG90YWwsIG5leHQpID0+IHRvdGFsICsgbmV4dFtmaWVsZF0sIDApIC8gZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiY291bnRcIjpcclxuICAgICAgICAgIGFnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwibWF4XCI6XHJcbiAgICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGRhdGEucmVkdWNlKChwLCBjKSA9PiBwW2ZpZWxkXSA+IGNbZmllbGRdID8gcCA6IGMpW2ZpZWxkXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtaW5cIjpcclxuICAgICAgICAgIGFnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5yZWR1Y2UoKHAsIGMpID0+IHBbZmllbGRdIDwgY1tmaWVsZF0gPyBwIDogYylbZmllbGRdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbC5hZ2dyZWdhdGVWYWx1ZSA9IGFnZ3JlZ2F0ZVZhbHVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNldCBhZ2dyZWdhdGUgdmFsdWVzIGZvciBjb2x1bW5zIHdpdGggYWdncmVnYXRlIHR5cGVzLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZ2dyZWdhdGVSZXNldFZhbHVlKCk6IHZvaWQge1xyXG4gICAgY29uc3QgYWdncmVnYXRlQ29sdW1ucyA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5hZ2dyZWdhdGVUeXBlKTtcclxuICAgIGFnZ3JlZ2F0ZUNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICBjb2wuYWdncmVnYXRlVmFsdWUgPSAwO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgcGFnZSBjaGFuZ2UgZXZlbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1BhZ2VDaGFuZ2VFdmVudH0gZXZlbnQgLSBUaGUgcGFnZSBjaGFuZ2UgZXZlbnQuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHBhZ2VDaGFuZ2UoZXZlbnQ6IFBhZ2VDaGFuZ2VFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5wYXJhbXMucGFnZU5vID0gdGhpcy5nZXRQYWdlTm8oZXZlbnQuc2tpcCwgdGhpcy5wYXJhbXMucGFnZVNpemUpO1xyXG4gICAgdGhpcy5zdGF0ZS5za2lwID0gZXZlbnQuc2tpcDtcclxuICAgIHRoaXMuY2hhbmdlRXZlbnQucGFnZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHNvcnQgY2hhbmdlIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtTb3J0RGVzY3JpcHRvcltdfSBzb3J0IC0gVGhlIHNvcnQgZGVzY3JpcHRvciBhcnJheS5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgc29ydENoYW5nZShzb3J0OiBTb3J0RGVzY3JpcHRvcltdKTogdm9pZCB7XHJcbiAgICB0aGlzLnNvcnQgPSBzb3J0O1xyXG4gICAgdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzID0gW107XHJcbiAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXJzID0gW107XHJcblxyXG4gICAgc29ydC5mb3JFYWNoKChkZXNjcmlwdG9yOiBTb3J0RGVzY3JpcHRvcikgPT4ge1xyXG4gICAgICBpZiAoZGVzY3JpcHRvci5kaXIpIHtcclxuICAgICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXJzLnB1c2goZGVzY3JpcHRvci5kaXIpO1xyXG5cclxuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0gZGVzY3JpcHRvci5maWVsZCk7XHJcbiAgICAgICAgY29uc3Qgc29ydENvbHVtbk5hbWUgPSBmaWVsZC52YWx1ZUV4cHIgIT09IHVuZGVmaW5lZCA/IGZpZWxkLnZhbHVlRXhwciA6IGRlc2NyaXB0b3IuZmllbGQ7XHJcblxyXG4gICAgICAgIHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcy5wdXNoKHNvcnRDb2x1bW5OYW1lKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNoYW5nZUV2ZW50LnNvcnRDaGFuZ2VkID0gdHJ1ZTtcclxuICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBmaWx0ZXIgY2hhbmdlIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHthbnl9IGV2ZW50IC0gVGhlIGZpbHRlciBjaGFuZ2UgZXZlbnQuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIGZpbHRlckNoYW5nZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnBhcmFtcy5wYWdlTm8gPSAwO1xyXG4gICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gW107XHJcbiAgICB0aGlzLnNldEZpbHRlclBhcmFtc0J5UGFyZW50UmVmSWQoKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhldmVudCk7XHJcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQuZmlsdGVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGV2ZW50LmZpbHRlcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoY29sID0+IGNvbC5maWVsZCA9PT0gaXRlbS5maWVsZCk7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBpdGVtLnZhbHVlID09PSBudWxsID8gXCJcIiA6IGl0ZW0udmFsdWU7XHJcblxyXG4gICAgICAgIGlmIChpdGVtLmZpbHRlcnMpIHtcclxuICAgICAgICAgIGl0ZW0uZmlsdGVycy5mb3JFYWNoKChmaWx0ZXI6IEZpbHRlckRlc2NyaXB0b3IpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZmlsdGVyUGFyYW06IFpHcmlkRmlsdGVyUGFyYW1zID0ge1xyXG4gICAgICAgICAgICAgIGtleTogZmlsdGVyLmZpZWxkIGFzIHN0cmluZyxcclxuICAgICAgICAgICAgICBvcHM6IHRoaXMubWFwRmlsdGVyT3BlcmF0b3IoZmlsdGVyLm9wZXJhdG9yKSxcclxuICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyLnZhbHVlID09PSBudWxsID8gXCJcIiA6IGZpbHRlci52YWx1ZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLnB1c2goZmlsdGVyUGFyYW0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgZmlsdGVyUGFyYW06IFpHcmlkRmlsdGVyUGFyYW1zID0ge1xyXG4gICAgICAgICAgICBrZXk6IGl0ZW0uZmllbGQsXHJcbiAgICAgICAgICAgIG9wczogdGhpcy5tYXBGaWx0ZXJPcGVyYXRvcihpdGVtLm9wZXJhdG9yKSxcclxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC52YWx1ZUV4cHIpIHtcclxuICAgICAgICAgICAgZmlsdGVyUGFyYW0ua2V5ID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YVsnRmlsdGVyV2l0aG91dEJyYWNrZXQnXSA/IGAke2ZpZWxkLnZhbHVlRXhwcn1gIDogYCgke2ZpZWxkLnZhbHVlRXhwcn0pYDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMucHVzaChmaWx0ZXJQYXJhbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWVsZC5HcmlkRmlsdGVyQ29uZmlndXJhdGlvbj8uT25DaGFuZ2UpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJHcmlkRmlsdGVyQ29uZmlndXJhdGlvbi5PbkNoYW5nZSB0cmlnZ2VyZWRcIik7XHJcbiAgICAgIC8vIFVzZSBzd2l0Y2hNYXAgdG8gaGFuZGxlIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uXHJcbiAgICAgIG9mKHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcykucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKGZpbHRlclBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgLy8gR2V0IHRoZSBmdW5jdGlvbiBleHByZXNzaW9uIGZyb20gdGhlIGNvbmZpZ3VyYXRpb25cclxuICAgICAgICAgIGxldCBleHByZXNzaW9uID0gdGhpcy5maWVsZC5HcmlkRmlsdGVyQ29uZmlndXJhdGlvbi5PbkNoYW5nZTtcclxuXHJcbiAgICAgICAgICAvLyBSZXBsYWNlICdtb2RhbEdyb3VwLicgd2l0aCAnZ3JvdXAuJyBhbmQgJ2dyb3VwLicgd2l0aCAnZ3JwLidcclxuICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnJlcGxhY2UoL21vZGFsR3JvdXBcXC4vZywgJ2dyb3VwLicpLnJlcGxhY2UoL2dyb3VwXFwuL2csICdncnAuJyk7XHJcblxyXG4gICAgICAgICAgLy8gRW5zdXJlIHRoZSBleHByZXNzaW9uIHN0YXJ0cyB3aXRoICd0aGlzLicgdG8gYXZvaWQgYWNjZXNzaW5nIGdsb2JhbCBzY29wZVxyXG4gICAgICAgICAgaWYgKCFleHByZXNzaW9uLnN0YXJ0c1dpdGgoJ3RoaXMuJykpIHtcclxuICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGB0aGlzLiR7ZXhwcmVzc2lvbn1gO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGZ1bmMgPSBldmFsKGV4cHJlc3Npb24pO1xyXG4gICAgICAgICAgaWYgKCFmdW5jKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2luZ1NlcnZpY2UubG9nKGAke2V4cHJlc3Npb259IG5vdCBmb3VuZCBpbiB0aGlzIHNjb3BlIGZvciAke3RoaXMuZmllbGQuTmFtZX0gZ3JpZC5gKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNpbmNlIGZ1bmN0aW9uIG5vdCBmb3VuZCwgd2UgcmV0dXJuIHRoZSBvcmlnaW5hbCBwYXJhbXMuXHJcbiAgICAgICAgICAgIHJldHVybiBvZih0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGNhbGxGdW5jID0gZnVuYy5iaW5kKHRoaXMuZ3JwKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gY2FsbEZ1bmMoZmlsdGVyUGFyYW1zKTtcclxuICAgICAgICB9KVxyXG4gICAgICApLnN1YnNjcmliZSgodXBkYXRlZEZpbHRlclBhcmFtczogYW55W10pID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyh1cGRhdGVkRmlsdGVyUGFyYW1zKTtcclxuXHJcbiAgICAgICAgLy8gdXBkYXRlIGZpbHRlclBhcmFtc1xyXG4gICAgICAgIGlmICh1cGRhdGVkRmlsdGVyUGFyYW1zKSB7XHJcbiAgICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSB1cGRhdGVkRmlsdGVyUGFyYW1zO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jaGFuZ2VFdmVudC5maWx0ZXJDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIElmIHRoZXJlIGlzIG5vIEdyaWRGaWx0ZXJDb25maWd1cmF0aW9uLk9uQ2hhbmdlXHJcbiAgICAgIHRoaXMuY2hhbmdlRXZlbnQuZmlsdGVyQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkYXRhU3RhdGVDaGFuZ2Uoc3RhdGU6IERhdGFTdGF0ZUNoYW5nZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZSA9IHN0YXRlO1xyXG4gICAgdGhpcy5hZ2dyZWdhdGVSZXNldFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYXAgZmlsdGVyIG9wZXJhdG9yIHRvIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdG9yIC0gVGhlIGZpbHRlciBvcGVyYXRvci5cclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBtYXBwZWQgZmlsdGVyIG9wZXJhdG9yIHZhbHVlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgbWFwRmlsdGVyT3BlcmF0b3Iob3BlcmF0b3I6IGFueSkge1xyXG4gICAgY29uc3Qgb3BlcmF0b3JNYXBwaW5nczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcclxuICAgICAgXCJlcVwiOiBcImVxXCIsXHJcbiAgICAgIFwibmVxXCI6IFwibmVxXCIsXHJcbiAgICAgIFwibHRcIjogXCJsdFwiLFxyXG4gICAgICBcImx0ZVwiOiBcImx0ZVwiLFxyXG4gICAgICBcImd0XCI6IFwiZ3RcIixcclxuICAgICAgXCJndGVcIjogXCJndGVcIixcclxuICAgICAgXCJzdGFydHN3aXRoXCI6IFwic3RhcnRzd2l0aFwiLFxyXG4gICAgICBcImVuZHN3aXRoXCI6IFwiZW5kc3dpdGhcIixcclxuICAgICAgXCJpc251bGxcIjogXCJpc251bGxcIixcclxuICAgICAgXCJpc25vdG51bGxcIjogXCJpc25vdG51bGxcIixcclxuICAgIH07XHJcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBcImNvbnRhaW5zXCJcclxuICAgIGlmIChvcGVyYXRvciA9PT0gXCJjb250YWluc1wiICYmICF0aGlzLmZpZWxkWydGaWx0ZXJDb250YWluc1VzaW5nRXF1YWwnXSkge1xyXG4gICAgICByZXR1cm4gXCJjb250YWluc1wiO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldHVybiB0aGUgbWFwcGVkIG9wZXJhdG9yIG9yIGRlZmF1bHQgdG8gXCI9PVwiXHJcbiAgICByZXR1cm4gb3BlcmF0b3JNYXBwaW5nc1tvcGVyYXRvcl0gfHwgXCI9PVwiO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRQYWdlTm8oc3RhdGVTa2lwOiBudW1iZXIsIHN0YXRlVGFrZTogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gc3RhdGVTa2lwIC8gc3RhdGVUYWtlO1xyXG4gIH1cclxuXHJcbiAgLy8gY29sdW1uRmllbGQgPSBkYXRhOiBBcnJheTxaRmllbGQ+LFxyXG4gIC8vIGNvbHVtbnMgPSBncmlkQ29sdW1uczogYW55W10sXHJcbiAgLy8gZ3JvdXAgPSBncm91cDogWkdyb3VwLFxyXG4gIC8vIGNvbHVtbkNvbmZpZ3VyYXRpb25zID0gZ3JpZFNldHRpbmdzPzogWkdyaWRDb2x1bW5TZXR0aW5nc1tdLFxyXG4gIC8vIGdlbmVyYXRlSGlkZGVuQ29sdW1ucyA9IHVzYWJsZUNvbHVtbnM/OiBhbnlbXSxcclxuICAvLyBncmlkQXR0cmlidXRlcyA9IGdyaWRGaWVsZD86IFpGaWVsZFxyXG5cclxuICBwdWJsaWMgc2V0Q29sdW1ucyhjb2x1bW5zOiBhbnlbXSkge1xyXG4gICAgdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5GaWVsZCA9IGNvbHVtbnM7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLmdldEdyaWRDb2x1bW5zKHRoaXMuZ3JpZFNldHRpbmcpO1xyXG5cclxuICAgIHRoaXMubG9nZ2luZ1NlcnZpY2UuZGVidWdMb2coJ2dlbmVyYXRlZCBncmlkIGNvbHVtbnMnLCB0aGlzLmdyaWRTZXR0aW5nKTtcclxuICB9XHJcbn1cclxuIl19
|