mmhglobal-dynamicform 2.6.4 → 2.7.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.
@@ -1,13 +1,13 @@
1
1
  /********** Angular **********/
2
2
  import { Injectable } from '@angular/core';
3
+ import { HttpParams } from '@angular/common/http';
3
4
  import { NavigationStart, NavigationEnd, NavigationError } from '@angular/router';
4
5
  /********** Plugin **********/
5
6
  import { BehaviorSubject, of, forkJoin } from 'rxjs';
6
7
  import { tap, switchMap, map } from 'rxjs/operators';
7
- /********** Component & Service **********/
8
- import { MESSAGETYPE, ZComponentHelper, ZGroup, DefaultMessage, DefaultDialogTitle } from 'mmhglobal-zcore';
9
8
  import { ZmodalComponent } from '../zmodal/zmodal.component';
10
9
  import { ZmodalMobileComponent } from '../zmodal/zmodal-mobile.component';
10
+ import { MESSAGETYPE, ZComponentHelper, ZGroup, DefaultMessage, DefaultDialogTitle } from 'mmhglobal-zcore';
11
11
  import * as i0 from "@angular/core";
12
12
  import * as i1 from "@angular/router";
13
13
  import * as i2 from "@ionic/angular";
@@ -15,11 +15,13 @@ import * as i3 from "mmhglobal-zcore";
15
15
  import * as i4 from "./component-error-handler.service";
16
16
  import * as i5 from "mmhglobal-zmodal";
17
17
  import * as i6 from "./zcomponent.debug.service";
18
+ import * as i7 from "@progress/kendo-angular-dialog";
19
+ // import { ModalService } from '../zmodal/modal.service';
18
20
  // import { ZmodalPage } from '../zmodal/zmodal.page';
19
21
  // import { ZComponentHelper, ZComponentOutputEvent, ModalPageParams, ZGrid } from '../dynamicform/zcomponent.model';
20
22
  // import { ZGroup, ZField } from '../model/zgroup.model';
21
23
  export class MainService {
22
- constructor(router, activatedRoute, modalCtrl, navController, alertService, cacheService, fieldService, resourceApiService, componentErrorHandler, webApiService, zcoreService, modalService, storageService, debugService, translationService) {
24
+ constructor(router, activatedRoute, modalCtrl, navController, alertService, cacheService, fieldService, resourceApiService, componentErrorHandler, webApiService, zcoreService, modalService, storageService, debugService, translationService, signalr, dialogService, oauth2Service) {
23
25
  this.router = router;
24
26
  this.activatedRoute = activatedRoute;
25
27
  this.modalCtrl = modalCtrl;
@@ -35,6 +37,9 @@ export class MainService {
35
37
  this.storageService = storageService;
36
38
  this.debugService = debugService;
37
39
  this.translationService = translationService;
40
+ this.signalr = signalr;
41
+ this.dialogService = dialogService;
42
+ this.oauth2Service = oauth2Service;
38
43
  this.backNavigationPath = [];
39
44
  this.routeParam = [];
40
45
  this.NAVIGATION_PARAMS_STORAGE_KEY = 'routeParam';
@@ -43,6 +48,16 @@ export class MainService {
43
48
  this.NAVIGATED_RELOAD_GRID_STORAGE_KEY = 'navigatedReloadGrid';
44
49
  this.CLONE_NEW_MODEL_CACHE_KEY = 'cloneNewModel';
45
50
  this.secretKey = 'my-secret-key';
51
+ //#region for signalR alert
52
+ this.getListFieldName = (fieldName) => {
53
+ const params = new HttpParams().set("name", fieldName);
54
+ return this.oauth2Service.httpGet$(this.fieldService.downloadListFieldUrl, params).pipe(map(res => res.FieldElementMasterId), switchMap(id => this.oauth2Service.httpGet$(this.fieldService.downloadFormFieldUrl, { id })), map(res => res.Name));
55
+ };
56
+ this.clearFormListFields = () => {
57
+ this.fieldService.dataFormFields = {};
58
+ this.fieldService.dataListFields = {};
59
+ this.fieldService.dataListFieldItems = {};
60
+ };
46
61
  console.log('MainService constructor');
47
62
  this.environment = this.zcoreService.getEnvironment();
48
63
  this.oauthEnvironmentUrl = this.environment.e1OauthUrl + '/';
@@ -52,10 +67,7 @@ export class MainService {
52
67
  console.log(event);
53
68
  // Reset the routeParam,backNavigationPath and related sessionStorage current page is startup page
54
69
  if (this.getStartupPage() === event.url) {
55
- this.routeParam = [];
56
- this.backNavigationPath = [];
57
- this.storageService.set(this.NAVIGATION_PARAMS_STORAGE_KEY, JSON.stringify(this.routeParam));
58
- this.storageService.set(this.BACK_NAVIGATION_PATH_STORAGE_KEY, JSON.stringify(this.backNavigationPath));
70
+ this.resetRouteParam();
59
71
  }
60
72
  }
61
73
  if (event instanceof NavigationEnd) {
@@ -70,6 +82,13 @@ export class MainService {
70
82
  }
71
83
  });
72
84
  }
85
+ signalrGetEvent() {
86
+ return this.signalr.getEvent();
87
+ }
88
+ dialogOpen(options) {
89
+ return this.dialogService.open(options);
90
+ }
91
+ //#endregion
73
92
  startUp() {
74
93
  console.log('At main.service (StartUp) ...');
75
94
  }
@@ -371,6 +390,19 @@ export class MainService {
371
390
  }
372
391
  return false;
373
392
  }
393
+ navigateFromMenu(pageName) {
394
+ const { startUpPage } = this.environment;
395
+ this.setRouteParam([`${startUpPage}`]);
396
+ this.backNavigationPath.push(this.getStartupPage());
397
+ this.storageService.set(this.BACK_NAVIGATION_PATH_STORAGE_KEY, JSON.stringify([this.getStartupPage()]));
398
+ this.router.navigate([pageName], { replaceUrl: true });
399
+ }
400
+ resetRouteParam() {
401
+ this.routeParam = [];
402
+ this.backNavigationPath = [];
403
+ this.storageService.set(this.NAVIGATION_PARAMS_STORAGE_KEY, JSON.stringify(this.routeParam));
404
+ this.storageService.set(this.BACK_NAVIGATION_PATH_STORAGE_KEY, JSON.stringify(this.backNavigationPath));
405
+ }
374
406
  getNavigationParams() {
375
407
  this.routeParam = this.routeParam || [];
376
408
  if (this.routeParam.length === 0) {
@@ -472,6 +504,16 @@ export class MainService {
472
504
  this.tryUpdateGroupTrigger(false);
473
505
  const backNavigationPath = JSON.parse(sessionStorage.getItem(this.BACK_NAVIGATION_PATH_STORAGE_KEY));
474
506
  const backNavigationURL = group.backNavigationPage || backNavigationPath[backNavigationPath.length - 1];
507
+ //const backNavigationPathLastValue = backNavigationPath && backNavigationPath.length > 0 ? backNavigationPath[backNavigationPath.length - 1] : null;
508
+ // if navated by external(prefixed url) when close, direct go to menu/startu page
509
+ //const invalidSubstrings = ['?l=', '?f=', '?r=', '#'];
510
+ //const containsAny = (str, substrings) => {
511
+ // return substrings.some(substring => str.includes(substring));
512
+ //};
513
+ //if (containsAny(backNavigationPathLastValue, invalidSubstrings)) {
514
+ // await this.router.navigateByUrl(this.getStartupPage(), { replaceUrl: true });
515
+ //}
516
+ //else {
475
517
  if (!backNavigationURL) {
476
518
  console.error("Error navigating back to previous page: backNavigationURL is not set.");
477
519
  //throw new Error("BackNavigationPath not set.");
@@ -497,6 +539,7 @@ export class MainService {
497
539
  console.error(`Error navigating back to previous page: ${error.message}`);
498
540
  //throw error;
499
541
  }
542
+ //}
500
543
  }
501
544
  getStartupPage() {
502
545
  const { startUpPage } = this.environment;
@@ -553,8 +596,7 @@ export class MainService {
553
596
  group.isTriggered = false;
554
597
  }
555
598
  newModel(event, group) {
556
- of([])
557
- .pipe(switchMap((zmodel) => {
599
+ of([]).pipe(switchMap((zmodel) => {
558
600
  console.log("Before new, zModel:", zmodel);
559
601
  return this.beforeNewModel(group);
560
602
  }), tap(() => {
@@ -619,8 +661,7 @@ export class MainService {
619
661
  this.afterNewModel(group);
620
662
  }
621
663
  }
622
- }))
623
- .subscribe();
664
+ })).subscribe();
624
665
  }
625
666
  createModel(event, group) {
626
667
  const fg = group.form;
@@ -634,8 +675,7 @@ export class MainService {
634
675
  this.componentErrorHandler.showFormGroupErrorMessage(group, fg);
635
676
  return;
636
677
  }
637
- of(group.zModel)
638
- .pipe(switchMap((zmodel) => {
678
+ of(group.zModel).pipe(switchMap((zmodel) => {
639
679
  console.log("Before create, zModel:", zmodel);
640
680
  return this.beforeCreateModel(group);
641
681
  }), tap(() => {
@@ -645,9 +685,7 @@ export class MainService {
645
685
  }), switchMap(() => {
646
686
  const newModel = Object.assign({}, group.zModel);
647
687
  ZComponentHelper.removeNullFields(newModel);
648
- return this.webApiService
649
- .httpPost$(group.resourceURL, newModel)
650
- .pipe(tap((resp) => {
688
+ return this.webApiService.httpPost$(group.resourceURL, newModel).pipe(tap((resp) => {
651
689
  createModelres = resp;
652
690
  return resp;
653
691
  }), tap((res) => {
@@ -678,8 +716,7 @@ export class MainService {
678
716
  }
679
717
  // console.log("Done updateModel updated zModel:", fg.value);
680
718
  // this.toastService.show("Record is created successfully.");
681
- }))
682
- .subscribe();
719
+ })).subscribe();
683
720
  }
684
721
  updateModel(event, group) {
685
722
  this.updateModelObservable(event, group).subscribe();
@@ -694,14 +731,12 @@ export class MainService {
694
731
  }
695
732
  return of(false);
696
733
  }
697
- updateAPIObservable = updateAPIObservable || this.webApiService.httpPut$(group.resourceURL + "/" + group.zModel.Id, group.zModel)
698
- .pipe(tap((res) => {
734
+ updateAPIObservable = updateAPIObservable || this.webApiService.httpPut$(group.resourceURL + "/" + group.zModel.Id, group.zModel, false, event).pipe(tap((res) => {
699
735
  this.handleSuccess(res, resMessage);
700
736
  }
701
737
  //this.handleSuccess(res, "Record is updated successfully.")
702
738
  ));
703
- return of(group.zModel)
704
- .pipe(switchMap((zmodel) => {
739
+ return of(group.zModel).pipe(switchMap((zmodel) => {
705
740
  console.log("Before update, zModel:", zmodel);
706
741
  return this.beforeUpdateModel(group);
707
742
  }), tap(() => {
@@ -1086,14 +1121,14 @@ export class MainService {
1086
1121
  }
1087
1122
  }
1088
1123
  }
1089
- MainService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MainService, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.ModalController }, { token: i2.NavController }, { token: i3.AlertService }, { token: i3.CacheService }, { token: i3.FieldService }, { token: i3.ResourceApiService }, { token: i4.ComponentErrorHandlerService }, { token: i3.WebApiService }, { token: i3.ZCoreService }, { token: i5.ModalService }, { token: i3.StorageSessionService }, { token: i6.ZComponentDebugService }, { token: i3.TranslationService }], target: i0.ɵɵFactoryTarget.Injectable });
1124
+ MainService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MainService, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.ModalController }, { token: i2.NavController }, { token: i3.AlertService }, { token: i3.CacheService }, { token: i3.FieldService }, { token: i3.ResourceApiService }, { token: i4.ComponentErrorHandlerService }, { token: i3.WebApiService }, { token: i3.ZCoreService }, { token: i5.ModalService }, { token: i3.StorageSessionService }, { token: i6.ZComponentDebugService }, { token: i3.TranslationService }, { token: i3.SignalrService }, { token: i7.DialogService }, { token: i3.OAuth2Service }], target: i0.ɵɵFactoryTarget.Injectable });
1090
1125
  MainService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MainService, providedIn: 'root' });
1091
1126
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MainService, decorators: [{
1092
1127
  type: Injectable,
1093
1128
  args: [{
1094
1129
  providedIn: 'root',
1095
1130
  }]
1096
- }], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.ModalController }, { type: i2.NavController }, { type: i3.AlertService }, { type: i3.CacheService }, { type: i3.FieldService }, { type: i3.ResourceApiService }, { type: i4.ComponentErrorHandlerService }, { type: i3.WebApiService }, { type: i3.ZCoreService }, { type: i5.ModalService }, { type: i3.StorageSessionService }, { type: i6.ZComponentDebugService }, { type: i3.TranslationService }]; } });
1131
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.ModalController }, { type: i2.NavController }, { type: i3.AlertService }, { type: i3.CacheService }, { type: i3.FieldService }, { type: i3.ResourceApiService }, { type: i4.ComponentErrorHandlerService }, { type: i3.WebApiService }, { type: i3.ZCoreService }, { type: i5.ModalService }, { type: i3.StorageSessionService }, { type: i6.ZComponentDebugService }, { type: i3.TranslationService }, { type: i3.SignalrService }, { type: i7.DialogService }, { type: i3.OAuth2Service }]; } });
1097
1132
  export function refreshGrid(group) {
1098
1133
  const zgridControl = group["gridOptions"];
1099
1134
  if (zgridControl) {
@@ -1101,4 +1136,4 @@ export function refreshGrid(group) {
1101
1136
  }
1102
1137
  group.isTriggered = false;
1103
1138
  }
1104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvc2VydmljZXMvbWFpbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQW1ELE1BQU0saUJBQWlCLENBQUM7QUFLbkksOEJBQThCO0FBQzlCLE9BQU8sRUFBYyxlQUFlLEVBQWdCLEVBQUUsRUFBUSxRQUFRLEVBQWlCLE1BQU0sTUFBTSxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFRLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNELDJDQUEyQztBQUMzQyxPQUFPLEVBQ1EsV0FBVyxFQUFpQyxnQkFBZ0IsRUFFWixNQUFNLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUN4RyxNQUFNLGlCQUFpQixDQUFDO0FBSXpCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7QUFHMUUsc0RBQXNEO0FBRXRELHFIQUFxSDtBQUNySCwwREFBMEQ7QUFNMUQsTUFBTSxPQUFPLFdBQVc7SUFnQnRCLFlBQ1UsTUFBYyxFQUNkLGNBQThCLEVBQzlCLFNBQTBCLEVBQzFCLGFBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLFlBQTBCLEVBQzFCLFlBQTBCLEVBQzFCLGtCQUFzQyxFQUN0QyxxQkFBbUQsRUFDbkQsYUFBNEIsRUFDNUIsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsY0FBcUMsRUFDckMsWUFBb0MsRUFDcEMsa0JBQXNDO1FBZHRDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFD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QUp2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7QUFnekNELE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYTtJQUN2QyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFVLENBQUM7SUFDbkQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ3hCO0lBQ0QsS0FBSyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmF2aWdhdGlvblN0YXJ0LCBOYXZpZ2F0aW9uRW5kLCBOYXZpZ2F0aW9uRXJyb3IsIFJvdXRlciwgRXZlbnQsIEFjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uRXh0cmFzIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcbmltcG9ydCB7IE1vZGFsQ29udHJvbGxlciwgTmF2Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiwgb2YsIGZyb20sIGZvcmtKb2luLCBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRhcCwgc3dpdGNoTWFwLCB0YWtlLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7XHJcbiAgQWxlcnRCdXR0b24sIE1FU1NBR0VUWVBFLCBNb2RhbFBhZ2VQYXJhbXMsIEFsZXJ0U2VydmljZSwgWkNvbXBvbmVudEhlbHBlcixcclxuICBDYWNoZVNlcnZpY2UsIEZpZWxkU2VydmljZSwgUmVzb3VyY2VBcGlTZXJ2aWNlLCBUcmFuc2xhdGlvblNlcnZpY2UsIFdlYkFwaVNlcnZpY2UsIFN0b3JhZ2VTZXNzaW9uU2VydmljZSxcclxuICBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIFpDb21wb25lbnRTaXplLCBaQ29yZVNlcnZpY2UsIFpGaWVsZCwgWkdyb3VwLCBEZWZhdWx0TWVzc2FnZSwgRGVmYXVsdERpYWxvZ1RpdGxlXHJcbn0gZnJvbSAnbW1oZ2xvYmFsLXpjb3JlJztcclxuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlLCBNb2RhbFJlc3BvbnNlIH0gZnJvbSAnbW1oZ2xvYmFsLXptb2RhbCc7XHJcbi8vIGltcG9ydCB7IE1vZGFsU2VydmljZSB9IGZyb20gJy4uL3ptb2RhbC9tb2RhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgWkNvbXBvbmVudERlYnVnU2VydmljZSB9IGZyb20gJy4vemNvbXBvbmVudC5kZWJ1Zy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgWm1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vem1vZGFsL3ptb2RhbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBabW9kYWxNb2JpbGVDb21wb25lbnQgfSBmcm9tICcuLi96bW9kYWwvem1vZGFsLW1vYmlsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBaR3JpZCB9IGZyb20gJy4uL3pncmlkL3pncmlkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2UgfSBmcm9tICcuL2NvbXBvbmVudC1lcnJvci1oYW5kbGVyLnNlcnZpY2UnO1xyXG4vLyBpbXBvcnQgeyBabW9kYWxQYWdlIH0gZnJvbSAnLi4vem1vZGFsL3ptb2RhbC5wYWdlJztcclxuXHJcbi8vIGltcG9ydCB7IFpDb21wb25lbnRIZWxwZXIsIFpDb21wb25lbnRPdXRwdXRFdmVudCwgTW9kYWxQYWdlUGFyYW1zLCBaR3JpZCB9IGZyb20gJy4uL2R5bmFtaWNmb3JtL3pjb21wb25lbnQubW9kZWwnO1xyXG4vLyBpbXBvcnQgeyBaR3JvdXAsIFpGaWVsZCB9IGZyb20gJy4uL21vZGVsL3pncm91cC5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIE1haW5TZXJ2aWNlIHtcclxuICBwcml2YXRlIGdyb3VwOiBaR3JvdXA7XHJcbiAgcHJpdmF0ZSBvYXV0aEVudmlyb25tZW50VXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBlbnZpcm9ubWVudDtcclxuICBwcml2YXRlIGJhY2tOYXZpZ2F0aW9uUGF0aDogc3RyaW5nW10gPSBbXTtcclxuICBwcml2YXRlIHJvdXRlUGFyYW06IHN0cmluZ1tdID0gW107XHJcbiAgcHJpdmF0ZSBwcmV2aW91c1JvdXRlUGFyYW06IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSBOQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSA9ICdyb3V0ZVBhcmFtJztcclxuICBwcml2YXRlIFBSRVZJT1VTX1BBR0VfUk9VVEVfUEFSQU1fU1RPUkFHRV9LRVkgPSAncHJldmlvdXNQYWdlUm91dGVQYXJhbSc7XHJcbiAgcHJpdmF0ZSBCQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSA9ICdiYWNrTmF2aWdhdGlvblBhdGgnO1xyXG4gIHByaXZhdGUgTkFWSUdBVEVEX1JFTE9BRF9HUklEX1NUT1JBR0VfS0VZID0gJ25hdmlnYXRlZFJlbG9hZEdyaWQnO1xyXG4gIHByaXZhdGUgQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSA9ICdjbG9uZU5ld01vZGVsJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBzZWNyZXRLZXkgPSAnbXktc2VjcmV0LWtleSc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlcixcclxuICAgIHByaXZhdGUgbmF2Q29udHJvbGxlcjogTmF2Q29udHJvbGxlcixcclxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNhY2hlU2VydmljZTogQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmaWVsZFNlcnZpY2U6IEZpZWxkU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVzb3VyY2VBcGlTZXJ2aWNlOiBSZXNvdXJjZUFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudEVycm9ySGFuZGxlcjogQ29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgd2ViQXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgemNvcmVTZXJ2aWNlOiBaQ29yZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlc3Npb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkZWJ1Z1NlcnZpY2U6IFpDb21wb25lbnREZWJ1Z1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBjb25zb2xlLmxvZygnTWFpblNlcnZpY2UgY29uc3RydWN0b3InKTtcclxuICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0aGlzLnpjb3JlU2VydmljZS5nZXRFbnZpcm9ubWVudCgpO1xyXG4gICAgdGhpcy5vYXV0aEVudmlyb25tZW50VXJsID0gdGhpcy5lbnZpcm9ubWVudC5lMU9hdXRoVXJsICsgJy8nO1xyXG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSgoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkge1xyXG4gICAgICAgIC8vIFNob3cgcHJvZ3Jlc3Mgc3Bpbm5lciBvciBwcm9ncmVzcyBiYXJcclxuICAgICAgICBjb25zb2xlLmxvZyhldmVudCk7XHJcbiAgICAgICAgLy8gUmVzZXQgdGhlIHJvdXRlUGFyYW0sYmFja05hdmlnYXRpb25QYXRoIGFuZCByZWxhdGVkIHNlc3Npb25TdG9yYWdlIGN1cnJlbnQgcGFnZSBpcyBzdGFydHVwIHBhZ2VcclxuICAgICAgICBpZiAodGhpcy5nZXRTdGFydHVwUGFnZSgpID09PSBldmVudC51cmwpIHtcclxuICAgICAgICAgIHRoaXMucm91dGVQYXJhbSA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGggPSBbXTtcclxuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMucm91dGVQYXJhbSkpO1xyXG4gICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcclxuICAgICAgICAvLyBIaWRlIHByb2dyZXNzIHNwaW5uZXIgb3IgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRXJyb3IpIHtcclxuICAgICAgICAvLyBIaWRlIHByb2dyZXNzIHNwaW5uZXIgb3IgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgICAgLy8gUHJlc2VudCBlcnJvciB0byB1c2VyXHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQuZXJyb3IpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlTGFzdE5hdmlnYXRlUmVjb3JkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRVcCgpIHtcclxuICAgIGNvbnNvbGUubG9nKCdBdCBtYWluLnNlcnZpY2UgKFN0YXJ0VXApIC4uLicpO1xyXG4gIH1cclxuXHJcbiAgc2V0R3JvdXAoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgdGhpcy5ncm91cCA9IGdyb3VwO1xyXG4gICAgdGhpcy5maWVsZFNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgdGhpcy53ZWJBcGlTZXJ2aWNlLnNldEdyb3VwKGdyb3VwKTtcclxuICAgIHRoaXMuc2V0R3JvdXBGb3JEZWJ1Z2dlcihncm91cCk7XHJcbiAgfVxyXG5cclxuICBnZXRSZXNvdXJjZVNlcnZlckRhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UubG9hZERhdGEoKTtcclxuICB9XHJcblxyXG4gIGdldEdyb3VwRmllbGRzKFxyXG4gICAgY3RybE5hbWU6IHN0cmluZyxcclxuICAgIGZvcm1UeXBlOiBcIkxpc3RGaWVsZFwiIHwgXCJGb3JtRmllbGRcIixcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmllbGRTZXJ2aWNlLmdldEZvcm1GaWVsZENvZGUoXHJcbiAgICAgIGN0cmxOYW1lLFxyXG4gICAgICBmb3JtVHlwZSxcclxuICAgICAgZ3JvdXAsXHJcbiAgICAgIHByb3BlcnR5TmFtZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVHcm91cChcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBjdHJsTmFtZTogc3RyaW5nLFxyXG4gICAgcGFnZU5hbWU6IHN0cmluZyxcclxuICAgIG1lOiBhbnlcclxuICApOiBTdWJzY3JpcHRpb24ge1xyXG4gICAgaWYgKG1lLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICBtZS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGdyb3VwLnJlc291cmNlVVJMTmFtZSB8fCBjdHJsTmFtZTtcclxuICAgIGdyb3VwLnJlc291cmNlVVJMTmFtZSA9IHJlc291cmNlTmFtZTtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKGdyb3VwLCB7XHJcbiAgICAgIHJlc291cmNlVVJMOiB0aGlzLnJlc291cmNlQXBpU2VydmljZS5nZXRVUkwocmVzb3VyY2VOYW1lKSxcclxuICAgICAgZ3JpZENvbHVtbkZpZWxkczogdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShcclxuICAgICAgICBjdHJsTmFtZSxcclxuICAgICAgICBcIkZvcm1GaWVsZFwiLFxyXG4gICAgICAgIG51bGwsXHJcbiAgICAgICAgbnVsbFxyXG4gICAgICApLFxyXG4gICAgICBjdHJsU2NvcGU6IG1lLFxyXG4gICAgICBwYWdlTmFtZSxcclxuICAgICAgY3RybE5hbWUsXHJcbiAgICAgIC8vIGNyZWF0ZU1vZGVsVVJMOiBcIi9jcmVhdGVcIiArIGN0cmxOYW1lLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgIGVkaXRNb2RlbFVSTDogY3RybE5hbWUudG9Mb3dlckNhc2UoKSxcclxuICAgICAgLy8gbGlzdE1vZGVsVVJMOiBcIi9saXN0XCIgKyBjdHJsTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAvLyBmb3JtSGVhZGVyOiBcIi4uLlwiLFxyXG4gICAgICBpc0xvYWRpbmc6IHRydWUsXHJcbiAgICAgIGZpZWxkczogW10sXHJcbiAgICAgIHpNb2RlbDoge30sXHJcbiAgICAgIHpDb21wb25lbnRzOiB7fSxcclxuICAgICAgekRhdGE6IHt9LFxyXG4gICAgICBzdWJqZWN0OiBuZXcgQmVoYXZpb3JTdWJqZWN0PFpDb21wb25lbnRPdXRwdXRFdmVudD4obnVsbCksXHJcbiAgICAgIC8vIGZvcm06IG51bGwgYXMgRm9ybUdyb3VwLCAvLyByZW1vdmVkIGZvciBidWcgZml4LlxyXG4gICAgICBjYW5jZWxCdXR0b25OYW1lOiBcIkNsb3NlXCIsXHJcbiAgICAgIHpCdXR0b25zQ291bnQ6IDAsXHJcbiAgICAgIC8vIHRvcFJpZ2h0QWN0aW9uQnV0dG9uOiBbXSxcclxuICAgICAgLy8gb25BY3Rpb246IHRoaXMub25BY3Rpb24uYmluZCh0aGlzKSxcclxuICAgICAgYmFja05hdmlnYXRpb246IHRoaXMuYmFja05hdmlnYXRpb24uYmluZCh0aGlzKSxcclxuICAgICAgaGlzdG9yeUJhY2s6IHRoaXMuaGlzdG9yeUJhY2suYmluZCh0aGlzKSxcclxuICAgICAgcmVmcmVzaFBhZ2U6IHRoaXMucmVmcmVzaFBhZ2UuYmluZCh0aGlzKSxcclxuICAgICAgcmVmcmVzaEdyaWQ6IHRoaXMucmVmcmVzaEdyaWQuYmluZCh0aGlzKSxcclxuICAgICAgdXBkYXRlTW9kZWw6IHRoaXMudXBkYXRlTW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgY3JlYXRlTW9kZWw6IHRoaXMuY3JlYXRlTW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgY2xvbmVOZXdNb2RlbDogdGhpcy5jbG9uZU5ld01vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIGRlbGV0ZU1vZGVsOiB0aGlzLmRlbGV0ZU1vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIG5ld01vZGVsOiB0aGlzLm5ld01vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIC8vIHVwZGF0ZUVkaXRNb2RlOiB0aGlzLnVwZGF0ZUVkaXRNb2RlLmJpbmQodGhpcyksXHJcbiAgICAgIC8vIF9pc0RlYnVnZ2luZzogZW52aXJvbm1lbnQuZGVidWdTZXNzaW9uIHx8IGZhbHNlLFxyXG4gICAgICAvLyBfZGVidWc6IHtcclxuICAgICAgLy8gICB6RGF0YTogIHsgY29sbGVjdGVkQWN0aXZpdGllczogW10sIGFjdGl2aXR5Q291bnQ6IDAgfVxyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIGFmdGVyR2V0TW9kZWxTdWNjZXNzOiBudWxsLFxyXG4gICAgICAvLyBiZWZvcmVVcGRhdGVNb2RlbDogbnVsbCxcclxuICAgICAgLy8gaXNFZGl0OiBmYWxzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgbWUuc3Vic2NyaXB0aW9uID0gZ3JvdXAuc3ViamVjdC5zdWJzY3JpYmUoKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQpID0+XHJcbiAgICAgIHRoaXMuc3ViamVjdEV2ZW50KGV2ZW50LCBncm91cCwgbWUpXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBtZS5zdWJzY3JpcHRpb247XHJcbiAgfVxyXG5cclxuICBnZXRNb2RlbCQoZ3JvdXA6IFpHcm91cCwgaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCByZWNJZCA9IGlkIHx8IGdyb3VwLnJlZmVyZW5jZUlkO1xyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZVxyXG4gICAgICAuaHR0cEdldCQoZ3JvdXAucmVzb3VyY2VVUkwgKyBcIi9cIiArIHJlY0lkLCBudWxsKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgICAgZ3JvdXAuek1vZGVsID0gem1vZGVsO1xyXG4gICAgICAgICAgLy9pZiAoXHJcbiAgICAgICAgICAvLyAgZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGQgJiZcclxuICAgICAgICAgIC8vICBPYmplY3Qua2V5cyh6bW9kZWwpLmluZGV4T2YoZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGQpICE9PSAtMSAmJlxyXG4gICAgICAgICAgLy8gICFncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UuZW5kc1dpdGgoXCIuZWRpdFwiKVxyXG4gICAgICAgICAgLy8pIHtcclxuICAgICAgICAgIC8vICBncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UgPVxyXG4gICAgICAgICAgLy8gICAgZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlICtcclxuICAgICAgICAgIC8vICAgIFwiL1wiICtcclxuICAgICAgICAgIC8vICAgIHptb2RlbFtncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZF0udG9TdHJpbmcoKSArXHJcbiAgICAgICAgICAvLyAgICBcIi9lZGl0XCI7XHJcbiAgICAgICAgICAvL31cclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIGNhbkV4aXQoZm9ybTogRm9ybUdyb3VwKTogYm9vbGVhbiB8IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCFmb3JtIHx8ICFmb3JtLmRpcnR5KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmb3JtWydza2lwRGlydHlDaGVjayddKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmFsZXJ0U2VydmljZVxyXG4gICAgICAuc2hvdyhcIkRhdGEgbm90IHNhdmUgeWV0XCIsIFwiQXJlIHlvdSBzdXJlIHdhbnQgdG8gZGlzY2FyZCB0aGUgY2hhbmdlcz9cIiwgW1xyXG4gICAgICAgIFwiQ2FuY2VsXCIsXHJcbiAgICAgICAgXCJEaXNjYXJkIENoYW5nZXNcIixcclxuICAgICAgXSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcGx5ID09PSBcIkRpc2NhcmQgQ2hhbmdlc1wiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIC8vIGNvbnN0IHJlcGx5U3ViID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICAgIC8vIHRoaXMuYWxlcnRDdHJsXHJcbiAgICAvLyAgIC5jcmVhdGUoe1xyXG4gICAgLy8gICAgIGhlYWRlcjogXCJEYXRhIG5vdCBzYXZlIHlldFwiLFxyXG4gICAgLy8gICAgIC8vIHN1YkhlYWRlcjogJ1N1YkhlYWRlciBzdGF0ZW1lbnQgaGVyZScsXHJcbiAgICAvLyAgICAgbWVzc2FnZTogXCJBcmUgeW91IHN1cmUgd2FudCB0byBkaXNjYXJkIHRoZSBjaGFuZ2VzP1wiLFxyXG4gICAgLy8gICAgIGJ1dHRvbnM6IFtcclxuICAgIC8vICAgICAgIHtcclxuICAgIC8vICAgICAgICAgdGV4dDogXCJDYW5jZWxcIixcclxuICAgIC8vICAgICAgICAgcm9sZTogXCJjYW5jZWxcIixcclxuICAgIC8vICAgICAgICAgY3NzQ2xhc3M6IFwic2Vjb25kYXJ5XCIsXHJcbiAgICAvLyAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcclxuICAgIC8vICAgICAgICAgICByZXBseVN1Yi5uZXh0KGZhbHNlKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfSxcclxuICAgIC8vICAgICAgIHtcclxuICAgIC8vICAgICAgICAgdGV4dDogXCJEaXNjYXJkIENoYW5nZXNcIixcclxuICAgIC8vICAgICAgICAgY3NzQ2xhc3M6IFwid2FybmluZ1wiLFxyXG4gICAgLy8gICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgcmVwbHlTdWIubmV4dCh0cnVlKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIF1cclxuICAgIC8vICAgfSlcclxuICAgIC8vICAgLnRoZW4oYWxlcnRFbGVtZW50ID0+IHtcclxuICAgIC8vICAgICBhbGVydEVsZW1lbnQucHJlc2VudCgpO1xyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIHJldHVybiByZXBseVN1Yi5hc09ic2VydmFibGUoKS5waXBlKHRha2UoMSkpO1xyXG4gIH1cclxuXHJcbiAgLy8gYXN5bmMgb3Blbk1vZGFsRm9ybShtb2RhbFBhcmFtczogTW9kYWxQYWdlUGFyYW1zKSB7XHJcbiAgLy8gICAvLyBjb25zb2xlLmxvZyhcIm9wZW5Nb2RhbEZvcm1cIik7XHJcbiAgLy8gICBjb25zb2xlLmVycm9yKFxyXG4gIC8vICAgICBcIlBsZWFzZSB1c2UgTW9kYWxTZXJ2aWNlLnNob3cgaW5zdGVhZCBvZiBNYWluU2VydmljZS5vcGVuTW9kYWxGb3JtIVwiXHJcbiAgLy8gICApO1xyXG4gIC8vICAgLy8gY29uc3QgbW9kYWwgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KG1vZGFsUGFyYW1zLmNvbEZpZWxkcyQgfHwgbW9kYWxQYXJhbXMuY29udHJvbGxlck5hbWUsIG1vZGFsUGFyYW1zLnBhcmVudEdyb3VwLFxyXG4gIC8vICAgLy8gICBtb2RhbFBhcmFtcy5mb3JtSGVhZGVyLCBtb2RhbFBhcmFtcy56TW9kZWwsIG1vZGFsUGFyYW1zLnJlZmVySWQpO1xyXG4gIC8vICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xyXG4gIC8vICAgICBjb21wb25lbnQ6IFptb2RhbFBhZ2UsXHJcbiAgLy8gICAgIGJhY2tkcm9wRGlzbWlzczogdHJ1ZSxcclxuICAvLyAgICAgY29tcG9uZW50UHJvcHM6IHtcclxuICAvLyAgICAgICBtb2RhbFBhcmFtcyxcclxuICAvLyAgICAgfSxcclxuICAvLyAgIH0pO1xyXG4gIC8vICAgbW9kYWwucHJlc2VudCgpO1xyXG4gIC8vICAgcmV0dXJuIG1vZGFsO1xyXG4gIC8vICAgLy8gLm9uV2lsbERpc21pc3MoKHptb2RlbDogYW55KSA9PiB7XHJcbiAgLy8gICAvLyAgIHRoaXMuXHJcbiAgLy8gICAvLyB9KTtcclxuICAvLyB9XHJcblxyXG4gIGNsb3NlTW9kYWxGb3JtKGdyb3VwPzogWkdyb3VwKSB7XHJcbiAgICBpZiAoZ3JvdXAgJiYgZ3JvdXAuc3ViamVjdCkge1xyXG4gICAgICBncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6IFwiTW9kYWxTZXJ2aWNlLmNsb3NlXCIsXHJcbiAgICAgICAgdGFyZ2V0OiBcIm1vZGFsR3JvdXAubW9kYWxDYW5jZWwoKVwiXHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm1vZGFsQ3RybC5kaXNtaXNzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdWJqZWN0RXZlbnQoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnRhcmdldC5zdGFydHNXaXRoKFwibW9kYWxHcm91cC5cIikpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coXCI+PiBTdWJqZWN0RXZlbnRcIiwgZXZlbnQpO1xyXG4gICAgbGV0IGNhbGxGdW5jO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNhbGxGdW5jID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKFxyXG4gICAgICAgIGdyb3VwLmN0cmxTY29wZSxcclxuICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgZ3JvdXBcclxuICAgICAgKTtcclxuICAgICAgLy8gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGV2ZW50LlRhcmdldCwgZ3JvdXApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIFwiRXJyb3Igd2hlbiBnZXRHcm91cFZhbHVlOiBcIixcclxuICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgXCIgPiBFcnJvcjogXCIsXHJcbiAgICAgICAgZXJyb3JcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjYWxsRnVuYyhldmVudCk7XHJcbiAgICBpZiAodHlwZW9mIGNhbGxGdW5jID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgY29uc3QgbmV3RnVuYyA9IGNhbGxGdW5jLmJpbmQobWUpO1xyXG4gICAgICBuZXdGdW5jKGV2ZW50LCBncm91cCwgbWUpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUuZW5kc1dpdGgoXCJvbk5hdmlnYXRlVG9cIikpIHtcclxuICAgICAgICBjb25zdCBuVXJsID0gZXZlbnQudGFyZ2V0LnJlcGxhY2UoXCIvOmlkXCIsIFwiL1wiICsgZXZlbnQuZGF0YSk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW25VcmxdKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBcInpncmlkLWNlbGxDbGlja1wiKSB7XHJcbiAgICAgICAgLy8gKGNhbGxGdW5jLnN0YXJ0c1dpdGgoJ2VkaXQnKSkgeyAgemdyaWQtY2VsbENsaWNrXHJcbiAgICAgICAgY29uc3QgY05hbWUgPSBjYWxsRnVuYy5zbGljZSg0KTtcclxuICAgICAgICAvLyAvLyBkZWJ1Z2dlcjtcclxuICAgICAgICAvLyBjb25zdCBtb2RhbEdyb3VwUGFyYW06IE1vZGFsUGFnZVBhcmFtcyA9IHt9O1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5jb250cm9sbGVyTmFtZSA9IGNOYW1lO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5yZWZlcklkID0gZXZlbnQuZGF0YS5JZDtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0uY29sRmllbGRzJCA9IGV2ZW50LmNvbHVtbkZpZWxkcyQ7XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLnBhcmVudEdyb3VwID0gbWUuZ3JvdXA7XHJcblxyXG4gICAgICAgIC8vIHRoaXMub3Blbk1vZGFsRm9ybShtb2RhbEdyb3VwUGFyYW0pO1xyXG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLnNob3coXHJcbiAgICAgICAgICBldmVudC5jb2x1bW5GaWVsZHMkIHx8IGNOYW1lLFxyXG4gICAgICAgICAgZ3JvdXAsXHJcbiAgICAgICAgICBcIlwiLFxyXG4gICAgICAgICAge30sXHJcbiAgICAgICAgICBldmVudC5kYXRhLklkXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiemdyaWQtY2VsbENsaWNrXCIpIHtcclxuICAgICAgICBpZiAoY2FsbEZ1bmMubmF2aWdhdGVVcmwpIHtcclxuICAgICAgICAgIGNvbnN0IHVybCA9IGNhbGxGdW5jLm5hdmlnYXRlVXJsLnJlcGxhY2UoXCI6aWRcIiwgZXZlbnQuZGF0YS5JZCk7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBtb2RhbEdyb3VwUGFyYW06IE1vZGFsUGFnZVBhcmFtcyA9IHt9O1xyXG4gICAgICAgIG1vZGFsR3JvdXBQYXJhbS5jb250cm9sbGVyTmFtZSA9IGNhbGxGdW5jLmN0cmxOYW1lO1xyXG4gICAgICAgIG1vZGFsR3JvdXBQYXJhbS5yZWZlcklkID0gZXZlbnQuZGF0YS5JZDtcclxuICAgICAgICBtb2RhbEdyb3VwUGFyYW0uY29sRmllbGRzJCA9IGV2ZW50LmNvbHVtbkZpZWxkcyQ7XHJcbiAgICAgICAgbW9kYWxHcm91cFBhcmFtLnBhcmVudEdyb3VwID0gbWUuZ3JvdXA7XHJcbiAgICAgICAgbW9kYWxHcm91cFBhcmFtLmZvcm1IZWFkZXIgPSBjYWxsRnVuYy5mb3JtSGVhZGVyO1xyXG5cclxuICAgICAgICBpZiAoY2FsbEZ1bmMuZm9ybUhlYWRlcikge1xyXG4gICAgICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtKG1vZGFsR3JvdXBQYXJhbSk7XHJcbiAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5zaG93KFxyXG4gICAgICAgICAgICBldmVudC5jb2x1bW5GaWVsZHMkIHx8IGNhbGxGdW5jLmN0cmxOYW1lLFxyXG4gICAgICAgICAgICBncm91cCxcclxuICAgICAgICAgICAgY2FsbEZ1bmMuZm9ybUhlYWRlcixcclxuICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuSWRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgIFwiSW52YWxpZCBjYWxsRnVuYyB0eXBlOiBcIixcclxuICAgICAgICAgIGNhbGxGdW5jLFxyXG4gICAgICAgICAgXCIgZXZlbnQuVGFyZ2V0OiBcIixcclxuICAgICAgICAgIGV2ZW50LnRhcmdldFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtQnlDb21wb25lbnQoY2FsbEZ1bmMudHlwZSwgZXZlbnQuRGF0YS5JZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJGdW5jdGlvbiBub3QgZGVmaW5lZCBpbiBncm91cCBmb3I6IFwiLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICBcIiwgRXZlbnQ6IFwiLFxyXG4gICAgICAgIGV2ZW50XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTdWNjZXNzKHJlczogUmVzcG9uc2UgfCBhbnksIHN1Y2Nlc3NNc2c6IHN0cmluZyk6IFJlc3BvbnNlIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzICYmIHJlcy5Qcm9jZXNzaW5nU3RhdHVzKSB7XHJcbiAgICAgIGlmICh0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc0NyZWF0ZU1zZyB8fCB0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc1VwZGF0ZU1zZyB8fCB0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc0RlbGV0ZU1zZykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNldCBzZXNzaW9uc3RvcmFnZSB0byB0cmlnZ2VyIHVwZGF0ZSB1cG9uIGNyZWF0ZWRcclxuXHJcbiAgICAgIC8vIEFsZXJ0IHVzZXIgdXBkYXRlL3NhdmUgc3VjY2Vzc1xyXG4gICAgICB0aGlzLndlYkFwaVNlcnZpY2Uuc2hvd0h0dHBSZXNwb25zZU1lc3NhZ2UoTUVTU0FHRVRZUEUuU3VjY2Vzcywgc3VjY2Vzc01zZywgbnVsbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlVcGRhdGVHcm91cFRyaWdnZXIodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMuZ3JvdXAuaXNUcmlnZ2VyZWQgPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUVycm9yKHJlczogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaGFuZGxlRXJyb3IocmVzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByb3V0ZU5hdmlnYXRlKHBhZ2VOYW1lOiBzdHJpbmcsIHBhZ2VQYXJhbXM6IHN0cmluZ1tdLCByb3V0ZVJlbGF0aXZlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKHBhZ2VQYXJhbXMpO1xyXG4gICAgY29uc3Qgc25hcHNob3RVcmwgPSB0aGlzLmFjdGl2YXRlZFJvdXRlWydfcm91dGVyU3RhdGUnXS5zbmFwc2hvdC51cmwuc3BsaXQoJz8nKVswXTtcclxuICAgIGNvbnN0IHBhZ2VVcmwgPSByb3V0ZVJlbGF0aXZlID8gc25hcHNob3RVcmwgKyAnLycgKyBwYWdlTmFtZSA6IHBhZ2VOYW1lO1xyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtwYWdlVXJsXSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldE5hdmlnYXRpb25QYXJhbXModXJsUGFyYW1zOiBzdHJpbmdbXSkge1xyXG4gICAgLy8gSWYgaXQgaXMgbnVsbCBvciB1bmRlZmluZWRcclxuICAgIGlmICghdGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpIHtcclxuICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGggPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUluTGFzdEVsZW1lbnQodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgsIHRoaXMucm91dGVyLnVybCkpIHtcclxuICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGgucHVzaCh0aGlzLnJvdXRlci51cmwpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0Um91dGVQYXJhbSh1cmxQYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFJvdXRlUGFyYW0ocm91dGVQYXJhbXM6IHN0cmluZ1tdKSB7XHJcbiAgICAvLyBJZiBpdCBpcyBudWxsIG9yIHVuZGVmaW5lZFxyXG4gICAgaWYgKCF0aGlzLnJvdXRlUGFyYW0pIHtcclxuICAgICAgdGhpcy5yb3V0ZVBhcmFtID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRmlsdGVyIG91dCBhbnkgZW1wdHkgc3RyaW5nIHJvdXRlIHBhcmFtcyBhbmQgam9pbiB0aGVtIGludG8gYSBzaW5nbGUgc3RyaW5nXHJcbiAgICBjb25zdCBuZXdSb3V0ZVBhcmFtID0gJy8nICsgT2JqZWN0LnZhbHVlcyhyb3V0ZVBhcmFtcykuZmlsdGVyKGVsID0+IGVsICE9PSAnJykuam9pbignLycpO1xyXG5cclxuICAgIGlmICghdGhpcy5pc1ZhbHVlSW5MYXN0RWxlbWVudCh0aGlzLnJvdXRlUGFyYW0sIG5ld1JvdXRlUGFyYW0pKSB7XHJcbiAgICAgIGlmIChyb3V0ZVBhcmFtcykge1xyXG4gICAgICAgIC8vIENhcHR1cmUgdGhlIHByZXZpb3VzIHBhZ2UncyByb3V0ZSBwYXJhbSB0byBiZSB1c2VkIGZvciBiYWNrbmF2aWdhdGlvbiBjaGVja2luZ1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtID0gdGhpcy5yb3V0ZVBhcmFtW3RoaXMucm91dGVQYXJhbS5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIHJvdXRlIHBhcmFtIGV4aXN0cywgY2hlY2sgaWYgdGhlIGxhc3Qgc2VnbWVudCBpcyAnbmV3JyBvciAndXBkYXRlJ1xyXG4gICAgICAgIGlmICh0aGlzLnByZXZpb3VzUm91dGVQYXJhbSkge1xyXG4gICAgICAgICAgY29uc3QgcGFyYW1TZWdtZW50ID0gdGhpcy5wcmV2aW91c1JvdXRlUGFyYW0uc3BsaXQoXCIvXCIpO1xyXG4gICAgICAgICAgY29uc3QgYWN0aW9uU2VnbWVudCA9IHBhcmFtU2VnbWVudFtwYXJhbVNlZ21lbnQubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAvLyBJZiB0aGUgbGFzdCBzZWdtZW50IGlzICduZXcnIG9yICd1cGRhdGUnLCBzdG9yZSB0aGUgcHJldmlvdXMgcm91dGUgcGFyYW0gaW4gc2Vzc2lvbiBzdG9yYWdlXHJcbiAgICAgICAgICBpZiAoYWN0aW9uU2VnbWVudCA9PT0gJ25ldycgfHwgYWN0aW9uU2VnbWVudCA9PT0gJ2VkaXQnIHx8IGFjdGlvblNlZ21lbnQgPT09ICd1cGRhdGUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuUFJFVklPVVNfUEFHRV9ST1VURV9QQVJBTV9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5wcmV2aW91c1JvdXRlUGFyYW0pKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEFkZCB0aGUgbmV3IHJvdXRlIHBhcmFtIHRvIHRoZSByb3V0ZVBhcmFtIGFycmF5IGFuZCBzdG9yZSBpdCBpbiBzZXNzaW9uIHN0b3JhZ2VcclxuICAgICAgICB0aGlzLnJvdXRlUGFyYW0ucHVzaChuZXdSb3V0ZVBhcmFtKTtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLnJvdXRlUGFyYW0pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1ZhbHVlSW5MYXN0RWxlbWVudChhcnJheTogYW55W10sIHRhcmdldFZhbHVlOiBhbnkpIHtcclxuICAgIGlmIChhcnJheVthcnJheS5sZW5ndGggLSAxXSA9PT0gdGFyZ2V0VmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE5hdmlnYXRpb25QYXJhbXMoKTogYW55W10ge1xyXG4gICAgdGhpcy5yb3V0ZVBhcmFtID0gdGhpcy5yb3V0ZVBhcmFtIHx8IFtdO1xyXG5cclxuICAgIGlmICh0aGlzLnJvdXRlUGFyYW0ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGNvbnN0IHN0b3JlZFBhcmFtcyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5OQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSk7XHJcbiAgICAgIGlmIChzdG9yZWRQYXJhbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZVBhcmFtID0gSlNPTi5wYXJzZShzdG9yZWRQYXJhbXMpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIHN0b3JlZCByb3V0ZVBhcmFtOicsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmxvZygnTm8gc3RvcmVkIG5hdmlnYXRpb24gcGFyYW1zIGZvdW5kLicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnJvdXRlUGFyYW07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TmF2aWdhdGlvblBhcmVudFBhcmFtKCk6IGFueSB7XHJcbiAgICBjb25zdCBuYXZpZ2F0aW9uUGFyZW50UGFyYW1zID0gdGhpcy5nZXROYXZpZ2F0aW9uUGFyYW1zKCk7XHJcblxyXG4gICAgaWYgKG5hdmlnYXRpb25QYXJlbnRQYXJhbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gbmF2aWdhdGlvblBhcmVudFBhcmFtc1tuYXZpZ2F0aW9uUGFyZW50UGFyYW1zLmxlbmd0aCAtIDJdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUud2FybignTmF2aWdhdGlvbiBwYXJlbnQgcGFyYW1zIG5vdCBmb3VuZC4nKTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE5hdmlnYXRpb25DdXJyZW50UGFyYW0oKTogYW55IHtcclxuICAgIGNvbnN0IG5hdmlnYXRpb25DdXJyZW50UGFyYW1zID0gdGhpcy5nZXROYXZpZ2F0aW9uUGFyYW1zKCk7XHJcblxyXG4gICAgaWYgKG5hdmlnYXRpb25DdXJyZW50UGFyYW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIG5hdmlnYXRpb25DdXJyZW50UGFyYW1zW25hdmlnYXRpb25DdXJyZW50UGFyYW1zLmxlbmd0aCAtIDFdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUud2FybignTmF2aWdhdGlvbiBjdXJyZW50IHBhcmFtcyBub3QgZm91bmQuJyk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UHJldmlvdXNQYWdlUm91dGVQYXJhbSgpOiBhbnkge1xyXG4gICAgaWYgKHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gUmV0dXJuIHRoZSBjYWNoZWQgdmFsdWUgaWYgaXQgZXhpc3RzXHJcbiAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzUm91dGVQYXJhbTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwcmV2aW91c1JvdXRlUGFyYW1TdHIgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuUFJFVklPVVNfUEFHRV9ST1VURV9QQVJBTV9TVE9SQUdFX0tFWSk7XHJcbiAgICBpZiAocHJldmlvdXNSb3V0ZVBhcmFtU3RyKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNSb3V0ZVBhcmFtID0gSlNPTi5wYXJzZShwcmV2aW91c1JvdXRlUGFyYW1TdHIpO1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtID0gcHJldmlvdXNSb3V0ZVBhcmFtO1xyXG4gICAgICAgIHJldHVybiBwcmV2aW91c1JvdXRlUGFyYW07XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGBVbmFibGUgdG8gcGFyc2UgcHJldmlvdXMgcm91dGUgcGFyYW0gZnJvbSBzZXNzaW9uIHN0b3JhZ2U6ICR7ZXJyb3J9YCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignTm8gcHJldmlvdXMgcGFnZSByb3V0ZSBwYXJhbSBmb3VuZCBpbiBzZXNzaW9uIHN0b3JhZ2UuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlUHJldmlvdXNQYWdlUm91dGVQYXJhbSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlKHRoaXMuUFJFVklPVVNfUEFHRV9ST1VURV9QQVJBTV9TVE9SQUdFX0tFWSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlTGFzdE5hdmlnYXRlUmVjb3JkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZW1vdmVMYXN0TmF2aWdhdGlvblBhdGgoKTtcclxuICAgIHRoaXMucmVtb3ZlTGFzdFJvdXRlUGFyYW0oKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVMYXN0TmF2aWdhdGlvblBhdGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZKSB8fCBcIm51bGxcIik7XHJcbiAgICBpZiAodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpIHtcclxuICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGgucG9wKCk7XHJcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMuYmFja05hdmlnYXRpb25QYXRoKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJObyBiYWNrIG5hdmlnYXRpb24gcGF0aCBmb3VuZCBpbiBzZXNzaW9uLlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVMYXN0Um91dGVQYXJhbSgpOiB2b2lkIHtcclxuICAgIHRoaXMucm91dGVQYXJhbSA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZKSB8fCBcIm51bGxcIik7XHJcbiAgICBpZiAodGhpcy5yb3V0ZVBhcmFtKSB7XHJcbiAgICAgIHRoaXMucm91dGVQYXJhbS5wb3AoKTtcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5OQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5yb3V0ZVBhcmFtKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJyb3V0ZVBhcmFtIHNlc3Npb24gaXMgbnVsbC5cIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYmFja05hdmlnYXRpb24oZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgbWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGdyb3VwWydpc0VtYmVkZGVkUGFnZSddKSB7XHJcbiAgICAgIGdyb3VwWydpc1RyaWdnZXJlZCddID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2xvc2VDb250YWluZXJWaWV3KGdyb3VwKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChncm91cC5iZWZvcmVCYWNrTmF2aWdhdGlvblBhZ2UpIHtcclxuICAgICAgZ3JvdXAuYmVmb3JlQmFja05hdmlnYXRpb25QYWdlKGdyb3VwKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGVCYWNrVG9QcmV2aW91c1BhZ2UoZ3JvdXApO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGVCYWNrVG9QcmV2aW91c1BhZ2UoZ3JvdXApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBuYXZpZ2F0ZUJhY2tUb1ByZXZpb3VzUGFnZShncm91cDogWkdyb3VwKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcblxyXG4gICAgY29uc3QgYmFja05hdmlnYXRpb25QYXRoOiBzdHJpbmdbXSA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZKSk7XHJcbiAgICBjb25zdCBiYWNrTmF2aWdhdGlvblVSTCA9IGdyb3VwLmJhY2tOYXZpZ2F0aW9uUGFnZSB8fCBiYWNrTmF2aWdhdGlvblBhdGhbYmFja05hdmlnYXRpb25QYXRoLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgIGlmICghYmFja05hdmlnYXRpb25VUkwpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIG5hdmlnYXRpbmcgYmFjayB0byBwcmV2aW91cyBwYWdlOiBiYWNrTmF2aWdhdGlvblVSTCBpcyBub3Qgc2V0LlwiKTtcclxuICAgICAgLy90aHJvdyBuZXcgRXJyb3IoXCJCYWNrTmF2aWdhdGlvblBhdGggbm90IHNldC5cIik7XHJcbiAgICAgIGF3YWl0IHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwodGhpcy5nZXRTdGFydHVwUGFnZSgpLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UpIHtcclxuICAgICAgY29uc3QgcHJldmlvdXNSb3V0ZVBhcmFtID0gdGhpcy5nZXRQcmV2aW91c1BhZ2VSb3V0ZVBhcmFtKCk7XHJcbiAgICAgIGNvbnN0IHByZXZpb3VzQ3VycmVudFJvdXRlUGFyYW0gPSB0aGlzLmdldE5hdmlnYXRpb25DdXJyZW50UGFyYW0oKTtcclxuICAgICAgaWYgKHByZXZpb3VzUm91dGVQYXJhbSAmJiBwcmV2aW91c1JvdXRlUGFyYW0gPT09IHByZXZpb3VzQ3VycmVudFJvdXRlUGFyYW0pIHtcclxuICAgICAgICB0aGlzLnJlbW92ZVByZXZpb3VzUGFnZVJvdXRlUGFyYW0oKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlbW92ZUxhc3RSb3V0ZVBhcmFtKCk7XHJcbiAgICAgIHRoaXMucmVtb3ZlTGFzdE5hdmlnYXRpb25QYXRoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5OQVZJR0FURURfUkVMT0FEX0dSSURfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRydWUpKTtcclxuXHJcbiAgICBpZiAodGhpcy5jYWNoZVNlcnZpY2UuZ2V0Q2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKSkge1xyXG4gICAgICB0aGlzLmNhY2hlU2VydmljZS5jbGVhckNhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChiYWNrTmF2aWdhdGlvblVSTCwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgbmF2aWdhdGluZyBiYWNrIHRvIHByZXZpb3VzIHBhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKTtcclxuICAgICAgLy90aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U3RhcnR1cFBhZ2UoKSB7XHJcbiAgICBjb25zdCB7IHN0YXJ0VXBQYWdlIH0gPSB0aGlzLmVudmlyb25tZW50O1xyXG5cclxuICAgIC8vIENoZWNrIGlmIHRoZSBzdGFydHVwIHBhZ2Ugc3RhcnRzIHdpdGggYSB1bmRlcnNjb3JlLlxyXG4gICAgaWYgKHN0YXJ0VXBQYWdlLnN0YXJ0c1dpdGgoJ18nKSkge1xyXG4gICAgICByZXR1cm4gYC8ke3N0YXJ0VXBQYWdlLnNsaWNlKDEpfWA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgbm90LCBwcmVwZW5kIGEgZm9yd2FyZCBzbGFzaCBhbmQgcmV0dXJuLlxyXG4gICAgcmV0dXJuIGAvJHtzdGFydFVwUGFnZX1gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoaXN0b3J5QmFjaygpIHtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuXHJcbiAgICBpZiAodGhpcy5ncm91cFsnaXNFbWJlZGRlZFBhZ2UnXSkge1xyXG4gICAgICB0aGlzLmNsb3NlQ29udGFpbmVyVmlldyh0aGlzLmdyb3VwKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubmF2Q29udHJvbGxlci5wb3AoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoR3JpZChcclxuICAgIGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsXHJcbiAgICBncm91cDogWkdyb3VwLFxyXG4gICAgbWU6IGFueSxcclxuICAgIGdyaWRPcHRpb25OYW1lPzogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICBncmlkT3B0aW9uTmFtZSA9IGdyaWRPcHRpb25OYW1lIHx8IFwiZ3JpZE9wdGlvbnNcIjtcclxuICAgIGlmIChldmVudCAmJiBldmVudC50YXJnZXQpIHtcclxuICAgICAgY29uc3QgZ3JpZE9wdGlvbiA9IGV2ZW50LnRhcmdldFxyXG4gICAgICAgIC50cmltKClcclxuICAgICAgICAucmVwbGFjZShcIihcIiwgXCJcIilcclxuICAgICAgICAucmVwbGFjZShcIilcIiwgXCJcIilcclxuICAgICAgICAucmVwbGFjZShcImdyb3VwLnJlZnJlc2hHcmlkXCIsIFwiXCIpO1xyXG4gICAgICBpZiAoZ3JpZE9wdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZ3JpZE9wdGlvbk5hbWUgPSBncmlkT3B0aW9uO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgemdyaWRDb250cm9sID0gZ3JvdXBbZ3JpZE9wdGlvbk5hbWVdIGFzIFpHcmlkO1xyXG4gICAgaWYgKHpncmlkQ29udHJvbCkge1xyXG4gICAgICB6Z3JpZENvbnRyb2wuZ2V0RGF0YSgpO1xyXG4gICAgfVxyXG4gICAgZ3JvdXBbJ2lzVHJpZ2dlcmVkJ10gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaFBhZ2UoKSB7XHJcbiAgICBpZiAodGhpcy5ncm91cCkge1xyXG4gICAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBsb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgIC8vIHRoaXMucm91dGVyLnJvdXRlUmV1c2VTdHJhdGVneS5zaG91bGRSZXVzZVJvdXRlID0gKCkgPT4gZmFsc2U7XHJcbiAgICAvLyB0aGlzLnJvdXRlci5vblNhbWVVcmxOYXZpZ2F0aW9uID0gJ3JlbG9hZCc7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnUGF0aDogJywgdGhpcy5hY3RpdmF0ZWRSb3V0ZVsnX3JvdXRlclN0YXRlJ10uc25hcHNob3QudXJsKTtcclxuICAgIC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NybS9jdXN0b21lciddKTtcclxuICB9XHJcblxyXG4gIGdldENsb25lTmV3Q2FjaGVaTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgY2FjaGVaTW9kZWwgPSB0aGlzLmNhY2hlU2VydmljZS5nZXRDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVkpO1xyXG4gICAgaWYgKGNhY2hlWk1vZGVsKSB7XHJcbiAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmNsZWFyQ2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKTtcclxuICAgICAgZ3JvdXAuek1vZGVsID0gY2FjaGVaTW9kZWw7XHJcbiAgICAgIGdyb3VwLnpNb2RlbC5JZCA9IDA7XHJcbiAgICB9XHJcbiAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuZXdNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICBvZihbXSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIG5ldywgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlTmV3TW9kZWwoZ3JvdXApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcImN1cnJlbnQgdXJsOiBcIiwgdGhpcy5yb3V0ZXIudXJsKTtcclxuXHJcbiAgICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IGdyb3VwLnBhcmVudFJlZmVyZW5jZUlkIHx8IFwiMFwiO1xyXG4gICAgICAgICAgLy9jb25zdCBwYXRoU2VnbWVudCA9IHRoaXMucm91dGVyLnVybC5zcGxpdChcIi9cIik7XHJcbiAgICAgICAgICAvL2NvbnN0IGxhc3RTZWdtZW50ID0gcGF0aFNlZ21lbnRbcGF0aFNlZ21lbnQubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICBjb25zdCBjdXJyZW50TmF2aWdhdGlvblBhcmFtID0gdGhpcy5nZXROYXZpZ2F0aW9uQ3VycmVudFBhcmFtKCk7XHJcbiAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uU2VnbWVudHMgPSBjdXJyZW50TmF2aWdhdGlvblBhcmFtID8gY3VycmVudE5hdmlnYXRpb25QYXJhbS5zcGxpdCgnLycpIDogbnVsbDtcclxuICAgICAgICAgIGNvbnN0IGRlZmF1bHRBY3Rpb24gPSBncm91cC5pc0Nsb25lTmV3ID8gJ25ldycgOiAnZWRpdCc7XHJcbiAgICAgICAgICBjb25zdCBhY3Rpb25TZWdtZW50ID0gZ3JvdXAuaXNDbG9uZU5ldyA/IChuYXZpZ2F0aW9uU2VnbWVudHMgPyBuYXZpZ2F0aW9uU2VnbWVudHNbbmF2aWdhdGlvblNlZ21lbnRzLmxlbmd0aCAtIDFdIDogJ25ldycpIDogZGVmYXVsdEFjdGlvbjtcclxuXHJcbiAgICAgICAgICBpZiAoZ3JvdXAuaXNMaXN0Rm9ybSkge1xyXG4gICAgICAgICAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldE5hdmlnYXRpb25QYXJhbXMoW3JlZmVyZW5jZUlkLCAnbmV3J10pO1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbZ3JvdXAuZWRpdE1vZGVsVVJMXSwge1xyXG4gICAgICAgICAgICAgIHJlbGF0aXZlVG86IGdyb3VwLmN0cmxTY29wZS5hY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gU2NlbmFyaW8gMTogRnJvbSBMaXN0IE5ldyhhY3Rpb246IG5ldykgPT0+IENsZWFyIGZvcm1cclxuICAgICAgICAgICAgLy8gU2NlbmFyaW8gMjogRnJvbSBGb3JtIE5ldyhhY3Rpb246IG5ldykgPT0+IENsZWFyIGZvcm1cclxuICAgICAgICAgICAgLy8gU2NlbmFyaW8gMzogRnJvbSBGb3JtIE5ldyhhY3Rpb246IG5ldyksIGlzQ2xvbmVOZXcgPT0+IERPTlQgQ2xlYXIgZm9ybVxyXG4gICAgICAgICAgICAvLyBTY2VuYXJpbyA0OiBGcm9tIEZvcm0gTmV3KGFjdGlvbjogbmV3KSwgaXNDbG9uZU5ldywgU2F2ZSwgQ2xpY2sgTmV3ID09PiBDbGVhciBmb3JtIChXaGVuIENyZWF0ZU1vZGVsLCBuZWVkIGNoYW5nZSBpc0Nsb25lTmV3ID0gZmFsc2UpXHJcbiAgICAgICAgICAgIC8vIFNjZW5hcmlvIDU6IEZyb20gTGlzdCBvcGVuIHJlY29yZChhY3Rpb246IGVkaXQpLCBpc0Nsb25lTmV3ID09PiBET05UIENsZWFyIGZvcm1cclxuICAgICAgICAgICAgLy8gU2NlbmFyaW8gNjogRnJvbSBMaXN0IG9wZW4gcmVjb3JkKGFjdGlvbjogZWRpdCksIGlzQ2xvbmVOZXcsIFNhdmUsIENsaWNrIE5ldyA9PT4gQ2xlYXIgZm9ybSAoV2hlbiBVcGRhdGVNb2RlbCwgbmVlZCBjaGFuZ2UgaXNDbG9uZU5ldyA9IGZhbHNlKVxyXG4gICAgICAgICAgICAvLyBTY2VuYXJpbyA3OiBGcm9tIExpc3Qgb3BlbiByZWNvcmQoYWN0aW9uOiBlZGl0KSwgQ2xpY2sgTmV3ID09PiBDbGVhciBmb3JtXHJcbiAgICAgICAgICAgIC8vIFNjZW5hcmlvIDg6IEZyb20gTGlzdCBvcGVuIHJlY29yZChhY3Rpb246IGVkaXQpLCBDbGljayBOZXcsIFNhdmUsIGlzQ2xvbmVOZXcgPT0+IERPTlQgQ2xlYXIgZm9ybVxyXG5cclxuICAgICAgICAgICAgaWYgKGFjdGlvblNlZ21lbnQgPT09IFwiZWRpdFwiIHx8IGFjdGlvblNlZ21lbnQgPT09IFwibmV3XCIpIHtcclxuICAgICAgICAgICAgICBpZiAoIWdyb3VwLmlzQ2xvbmVOZXcpIHtcclxuICAgICAgICAgICAgICAgIGdyb3VwLnpNb2RlbCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgZ3JvdXAuZm9ybS5yZXNldCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgd29ya2Zsb3cgYnV0dG9uIGlmIHRoZSBUeXBlQ29kZSBpcyAnRlVOQ1RJT04nXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1R5cGVDb2RlRnVuY3Rpb24oZXZlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkV29ya2Zsb3dCdXR0b24oZ3JvdXAsIGV2ZW50LmRhdGEuekJ1dHRvbk5hbWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoYWN0aW9uU2VnbWVudCA9PT0gXCJlZGl0XCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNsZWFyIGNsb25lTmV3TW9kZWwgY2FjaGUoaWYgaGF2ZSlcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhY2hlU2VydmljZS5nZXRDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmNsZWFyQ2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuc2V0TmF2aWdhdGlvblBhcmFtcyhbcmVmZXJlbmNlSWQsICduZXcnXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxhc3RSb3V0ZVBhcmFtKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJvdXRlUGFyYW0oW3JlZmVyZW5jZUlkLCAnbmV3J10pO1xyXG5cclxuICAgICAgICAgICAgICAgIGdyb3VwLnpNb2RlbFtncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZF0gPSByZWZlcmVuY2VJZDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZ3JvdXAuaXNFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgZ3JvdXAuaXNOZXcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0TmF2aWdhdGlvblBhcmFtcyhbcmVmZXJlbmNlSWQsICduZXcnXSk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtncm91cC5lZGl0TW9kZWxVUkxdLCB7XHJcbiAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiBncm91cC5jdHJsU2NvcGUuYWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChncm91cC5pc0Nsb25lTmV3KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hZnRlckNsb25lTmV3TW9kZWwoZ3JvdXAsIGdyb3VwLnpNb2RlbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hZnRlck5ld01vZGVsKGdyb3VwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZU1vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGNvbnN0IGZnOiBGb3JtR3JvdXAgPSBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGNvbnN0IHJlc01lc3NhZ2UgPSBncm91cC5TdWNjZXNzQ3JlYXRlZE1lc3NhZ2UgfHwgXCJSZWNvcmQgaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuXCI7XHJcbiAgICBsZXQgY3JlYXRlTW9kZWxyZXMgPSBudWxsO1xyXG5cclxuICAgIGlmICghZmcuZGlydHkpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiRm9ybSBpcyBub3QgZGlydHkgaGVuY2UgcmVjb3JkIGlzIG5vdCBzYXZlLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZmcudmFsaWQpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRFcnJvckhhbmRsZXIuc2hvd0Zvcm1Hcm91cEVycm9yTWVzc2FnZShncm91cCwgZmcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgb2YoZ3JvdXAuek1vZGVsKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJCZWZvcmUgY3JlYXRlLCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5iZWZvcmVDcmVhdGVNb2RlbChncm91cCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIGlmICghdGhpcy5ncm91cC5za2lwQ3JlYXRlVXNpbmdGb3JtVmFsdWUpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIGZnLnZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbmV3TW9kZWwgPSBPYmplY3QuYXNzaWduKHt9LCBncm91cC56TW9kZWwpO1xyXG4gICAgICAgICAgWkNvbXBvbmVudEhlbHBlci5yZW1vdmVOdWxsRmllbGRzKG5ld01vZGVsKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5odHRwUG9zdCQoZ3JvdXAucmVzb3VyY2VVUkwsIG5ld01vZGVsKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgICAgIGNyZWF0ZU1vZGVscmVzID0gcmVzcDtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgIHRhcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgcmVzTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKHptb2RlbDogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkFmdGVyIGNyZWF0ZWQsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgIHRoaXMucGF0Y2hVcGRhdGVkek1vZGVsKGZnLCB6bW9kZWwsIGdyb3VwKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyQ3JlYXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICBpZiAoY3JlYXRlTW9kZWxyZXMuUHJvY2Vzc2luZ1N0YXR1cyA9PSBudWxsIHx8IGNyZWF0ZU1vZGVscmVzLlByb2Nlc3NpbmdTdGF0dXMgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBpZiAocmVzcCAmJiBncm91cC56TW9kZWwuSWQgIT09IDApIHtcclxuICAgICAgICAgICAgICBncm91cC5pc05ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGdyb3VwLmlzRWRpdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgZ3JvdXAuaXNDbG9uZU5ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgZ3JvdXAuY2FuY2VsQnV0dG9uTmFtZSA9IFwiQ2xvc2VcIjtcclxuICAgICAgICAgICAgICAvLyBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgcmVzcCk7XHJcbiAgICAgICAgICAgICAgLy8gZmcucGF0Y2hWYWx1ZShyZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBmZy5tYXJrQXNQcmlzdGluZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKChncm91cC5pc0Nsb3NlQWZ0ZXJTdWNjZXNzIHx8IGdyb3VwLmlzQ2xvc2VBZnRlckNyZWF0ZWQpICYmICFncm91cC5pc0Nsb25lTmV3KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvbihudWxsLCBncm91cCwgdGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZmcubWFya0FzRGlydHkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRG9uZSB1cGRhdGVNb2RlbCB1cGRhdGVkIHpNb2RlbDpcIiwgZmcudmFsdWUpO1xyXG4gICAgICAgICAgLy8gdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyhcIlJlY29yZCBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5cIik7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgdGhpcy51cGRhdGVNb2RlbE9ic2VydmFibGUoZXZlbnQsIGdyb3VwKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVNb2RlbE9ic2VydmFibGUoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgZm9ybTogRm9ybUdyb3VwID0gbnVsbCwgdXBkYXRlQVBJT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxhbnk+ID0gbnVsbCwgaXNTa2lwRGlydHkgPSBmYWxzZSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBmZyA9IGZvcm0gfHwgZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBjb25zdCByZXNNZXNzYWdlID0gZ3JvdXAuU3VjY2Vzc1VwZGF0ZWRNZXNzYWdlIHx8IFwiUmVjb3JkIGlzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiO1xyXG4gICAgbGV0IHVwZGF0ZU1vZGVscmVzID0gbnVsbDtcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNGb3JtRGlydHlBbmRWYWxpZChmZywgZ3JvdXAsIGlzU2tpcERpcnR5LCBldmVudCkpIHtcclxuICAgICAgaWYgKGlzU2tpcERpcnR5KSB7XHJcbiAgICAgICAgZmcubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlQVBJT2JzZXJ2YWJsZSA9IHVwZGF0ZUFQSU9ic2VydmFibGUgfHwgdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQdXQkKGdyb3VwLnJlc291cmNlVVJMICsgXCIvXCIgKyBncm91cC56TW9kZWwuSWQsIGdyb3VwLnpNb2RlbClcclxuICAgICAgLnBpcGUodGFwKChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3MocmVzLCByZXNNZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgXCJSZWNvcmQgaXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkuXCIpXHJcbiAgICAgICkpO1xyXG5cclxuICAgIHJldHVybiBvZihncm91cC56TW9kZWwpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSB1cGRhdGUsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFncm91cC5za2lwVXBkYXRlVXNpbmdGb3JtVmFsdWUpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIGZnLnZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZUFQSU9ic2VydmFibGU7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKChyZXNwOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWZ0ZXIgdXBkYXRlZCwgcmVzcG9uc2U6XCIsIHJlc3ApO1xyXG4gICAgICAgICAgdXBkYXRlTW9kZWxyZXMgPSByZXNwO1xyXG4gICAgICAgICAgZ3JvdXAuaXNDbG9uZU5ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5wYXRjaFVwZGF0ZWR6TW9kZWwoZmcsIHJlc3AsIGdyb3VwKTtcclxuICAgICAgICAgIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5hZnRlclVwZGF0ZU1vZGVsKGdyb3VwLCByZXNwKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICAgIGlmICh1cGRhdGVNb2RlbHJlcyAmJiB1cGRhdGVNb2RlbHJlcy5Qcm9jZXNzaW5nU3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGlmIChncm91cC5pc0Nsb3NlQWZ0ZXJTdWNjZXNzIHx8IGdyb3VwLmlzQ2xvc2VBZnRlclVwZGF0ZWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uKG51bGwsIGdyb3VwLCB0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9uZXMgYSBuZXcgbW9kZWwgZm9yIGEgWkdyb3VwIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBaQ29tcG9uZW50T3V0cHV0RXZlbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1pDb21wb25lbnRPdXRwdXRFdmVudH0gZXZlbnQgLSBUaGUgWkNvbXBvbmVudE91dHB1dEV2ZW50IHRyaWdnZXJpbmcgdGhlIGNsb25lLlxyXG4gICAqIEBwYXJhbSB7Wkdyb3VwfSBncm91cCAtIFRoZSBaR3JvdXAgdG8gY2xvbmUgdGhlIG5ldyBtb2RlbCBmb3IuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjbG9uZU5ld01vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIC8vIFNldCBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgbW9kZWwgaXMgYmVpbmcgY2xvbmVkXHJcbiAgICBncm91cC5pc0Nsb25lTmV3ID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBFeHRyYWN0IHRoZSBmdW5jdGlvbiB2YWx1ZSBmcm9tIHRoZSB0YXJnZXQgb2YgdGhlIGV2ZW50XHJcbiAgICBjb25zdCB7IHRhcmdldCB9ID0gZXZlbnQ7XHJcbiAgICBjb25zdCBmdW5jdGlvblZhbHVlID0gdGFyZ2V0Py5tYXRjaCgvXFwoKFteKV0rKVxcKS8pPy5bMV07XHJcblxyXG4gICAgLy8gSWYgdGhlIGZ1bmN0aW9uIHZhbHVlIGlzICd0cnVlJywgcmVzZXQgdGhlIGZvcm0gYW5kIG1vZGVsXHJcbiAgICBpZiAoZnVuY3Rpb25WYWx1ZSA9PT0gJ3RydWUnKSB7XHJcbiAgICAgIGdyb3VwLnpNb2RlbCA9IHt9O1xyXG4gICAgICBncm91cC5mb3JtLnJlc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGVmaW5lIHRoZSB2YWx1ZXMgZm9yIHRoZSBXRlMgbW9kZWxcclxuICAgIGNvbnN0IG5ld01vZGVsVmFsdWVzID0ge1xyXG4gICAgICBJZDogMCxcclxuICAgICAgV0ZTX0RvY3VtZW50SWQ6IG51bGwsXHJcbiAgICAgIFdGU19TdGF0dXNDb2RlOiBudWxsLFxyXG4gICAgICBXRlNfU3RhdHVzSWQ6IG51bGwsXHJcbiAgICAgIFdGU19TdGF0dXNOYW1lOiBudWxsLFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBBc3NpZ24gdGhlIFdGUyBtb2RlbCB2YWx1ZXMgdG8gdGhlIGZvcm0gdmFsdWUgYW5kIFpNb2RlbFxyXG4gICAgT2JqZWN0LmFzc2lnbihncm91cC5mb3JtLnZhbHVlLCBuZXdNb2RlbFZhbHVlcyk7XHJcbiAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgZ3JvdXAuZm9ybS52YWx1ZSk7XHJcblxyXG4gICAgLy8gUGF0Y2ggdGhlIGZvcm0gd2l0aCB0aGUgWk1vZGVsLCBtYXJrIGl0IGFzIGRpcnR5LCBhbmQgY2FjaGUgdGhlIFpNb2RlbFxyXG4gICAgY29uc3QgZmcgPSBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGZnLnBhdGNoVmFsdWUoZ3JvdXAuek1vZGVsKTtcclxuICAgIGZnLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB0aGlzLmNhY2hlU2VydmljZS5zZXRDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVksIGdyb3VwLnpNb2RlbCk7XHJcblxyXG4gICAgLy8gQ2FsbCB0aGUgbmV3TW9kZWwgZnVuY3Rpb24gZm9yIHRoZSBncm91cFxyXG4gICAgdGhpcy5uZXdNb2RlbChudWxsLCBncm91cCk7XHJcblxyXG4gICAgLy8gUmVsb2FkIHRoZSB3b3JrZmxvdyBidXR0b24gaWYgdGhlIFR5cGVDb2RlIGlzICdGVU5DVElPTidcclxuICAgIGlmICh0aGlzLmlzVHlwZUNvZGVGdW5jdGlvbihldmVudCkpIHtcclxuICAgICAgdGhpcy5yZWxvYWRXb3JrZmxvd0J1dHRvbihncm91cCwgZXZlbnQuZGF0YS56QnV0dG9uTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgdGhlIHRyaWdnZXIgZmxhZ1xyXG4gICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVsZXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgZmc6IEZvcm1Hcm91cCA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3QgcmVzTWVzc2FnZSA9IGdyb3VwLlN1Y2Nlc3NEZWxldGVkTWVzc2FnZSB8fCBcIlJlY29yZCBpcyBkZWxldGVkIHN1Y2Nlc3NmdWxseS5cIlxyXG5cclxuICAgIG9mKGdyb3VwLnpNb2RlbClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIGRlbGV0ZSwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3coXCJEZWxldGUgUmVjb3JkXCIsIFwiQXJlIHlvdSBzdXJlP1wiLFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgeyB0ZXh0OiBcIk5vXCIsIGNzc0NsYXNzOiBcInNlY29uZGFyeVwiIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICAgICAgICAgICAgeyB0ZXh0OiBcIlllc1wiLCBjc3NDbGFzczogXCJwcmltYXJ5XCIgfSBhcyBBbGVydEJ1dHRvblxyXG4gICAgICAgICAgICBdKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKHJlcGx5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGlmIChyZXBseSA9PT0gXCJZZXNcIikge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgZmcudmFsdWUpO1xyXG4gICAgICAgICAgICBncm91cC56TW9kZWwuRGlzYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgbGV0IHRlbXBSZXNwb25zZSA9IHt9O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgLmh0dHBQdXQkKGdyb3VwLnJlc291cmNlVVJMICsgXCIvXCIgKyBncm91cC56TW9kZWwuSWQsIGdyb3VwLnpNb2RlbClcclxuICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHRhcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHRlbXBSZXNwb25zZSA9IE9iamVjdC5hc3NpZ24oe30sIHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2VzcyhyZXMsIHJlc01lc3NhZ2UpXHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWZ0ZXIgZGVsZXRlZCwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hZnRlckRlbGV0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgICAgICAgLy90aGlzLmhpc3RvcnlCYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0ZW1wUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFJlc3BvbnNlWydQcm9jZXNzaW5nU3RhdHVzJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZnLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uKG51bGwsIGdyb3VwLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZ3JvdXAuek1vZGVsLkRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXRjaFVwZGF0ZWR6TW9kZWwoZmc6IEZvcm1Hcm91cCwgcmVzcDogYW55LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAocmVzcCkge1xyXG4gICAgICBpZiAocmVzcC5EYXRhKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIHJlc3AuRGF0YSk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0RGF0YSA9IHRoaXMucmVtb3ZlVGV4dEVkaXRvclZhbHVlRnJvbUZvcm1QYXRjaGluZyhyZXNwLkRhdGEsIGdyb3VwKTtcclxuICAgICAgICBmZy5wYXRjaFZhbHVlKHJlc3VsdERhdGEpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHJlc3BbXCJJZFwiXSkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCByZXNwKTtcclxuICAgICAgICBjb25zdCByZXN1bHREYXRhID0gdGhpcy5yZW1vdmVUZXh0RWRpdG9yVmFsdWVGcm9tRm9ybVBhdGNoaW5nKHJlc3AsIGdyb3VwKTtcclxuICAgICAgICBmZy5wYXRjaFZhbHVlKHJlc3VsdERhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ3JvdXAucmVmZXJlbmNlSWQgPSBncm91cC56TW9kZWwuSWQ7XHJcbiAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcbiAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG5cclxuICAgIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZVRleHRFZGl0b3JWYWx1ZUZyb21Gb3JtUGF0Y2hpbmcoZGF0YSwgZ3JvdXA6IFpHcm91cCk6IGFueSB7XHJcbiAgICBjb25zdCByZXN1bHREYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICBjb25zdCBhbGxGaWVsZHMgPSBaQ29tcG9uZW50SGVscGVyLmdldEZpZWxkTGlzdEZyb21GaWVsZHNXaXRob3V0SGllcmFyY2h5KGdyb3VwLmZpZWxkcyk7XHJcblxyXG4gICAgY29uc3QgdGV4dEVkaXRvcnMgPSBhbGxGaWVsZHMuZmlsdGVyKHggPT4geC5UeXBlID09PSAnenRleHRlZGl0b3InKTtcclxuICAgIGlmICh0ZXh0RWRpdG9ycyAmJiB0ZXh0RWRpdG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvciAoY29uc3QgY29tcCBvZiB0ZXh0RWRpdG9ycykge1xyXG4gICAgICAgIGRlbGV0ZSByZXN1bHREYXRhW2NvbXAuVmFsdWVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdERhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzVHlwZUNvZGVGdW5jdGlvbihldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50KSB7XHJcbiAgICByZXR1cm4gZXZlbnQ/LmRhdGE/LlR5cGVDb2RlID09PSAnRlVOQ1RJT04nO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWxvYWRXb3JrZmxvd0J1dHRvbihncm91cDogWkdyb3VwLCB6QnV0dG9uTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB3b3JrZmxvd0J1dHRvbnMgPSBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudChncm91cCwgYHp3b3JrZmxvd2J1dHRvbnNfJHt6QnV0dG9uTmFtZX1gKTtcclxuICAgIHdvcmtmbG93QnV0dG9ucz8uWydsb2FkQnV0dG9uJ10/LigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzRm9ybURpcnR5QW5kVmFsaWQoZmc6IEZvcm1Hcm91cCwgZ3JvdXA6IFpHcm91cCwgaXNTa2lwRGlydHkgPSBmYWxzZSwgZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFpc1NraXBEaXJ0eSAmJiAhZmcuZGlydHkpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiRm9ybSBpcyBub3QgZGlydHkgaGVuY2UgcmVjb3JkIGlzIG5vdCBzYXZlLlwiKTtcclxuICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50ICYmIGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YVtgRm9ybU5vdERpcnR5TWVzc2FnZWBdID8gZXZlbnQuZGF0YVtgRm9ybU5vdERpcnR5TWVzc2FnZWBdIDogRGVmYXVsdE1lc3NhZ2Uubm90RGlydHlNZXNzYWdlO1xyXG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zaG93T2theShEZWZhdWx0RGlhbG9nVGl0bGUubm90aGluZ1RvVXBkYXRlLCBtZXNzYWdlLCBbXCJjb2wtNVwiXSk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZnLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50RXJyb3JIYW5kbGVyLnNob3dGb3JtR3JvdXBFcnJvck1lc3NhZ2UoZ3JvdXAsIGZnKTtcclxuICAgICAgZmcubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICBmZy5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlVXBkYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVVcGRhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVVcGRhdGVNb2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlVXBkYXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVEZWxldGVNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZURlbGV0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZURlbGV0ZU1vZGVsIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVEZWxldGVNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJlZm9yZU5ld01vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlTmV3TW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlTmV3b2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlTmV3TW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVDcmVhdGVNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZUNyZWF0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZUNyZWF0ZU1vZGVsIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVDcmVhdGVNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBiZWZvcmVQYWdlSW5pdGlhbGlzZShncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZVBhZ2VJbml0aWFsaXNlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZVBhZ2VJbml0aWFsaXNlIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVQYWdlSW5pdGlhbGlzZShncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwOiBaR3JvdXApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC56TW9kZWwuSWQpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiek1vZGVsLklkIGlzIG5vdCBkZWZpbmVkXCIsIGdyb3VwLnpNb2RlbCk7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIGFmdGVyTmV3TW9kZWwoZ3JvdXA6IFpHcm91cCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyTmV3TW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJOZXdNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlck5ld01vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJDcmVhdGVNb2RlbChncm91cDogWkdyb3VwLCB6bW9kZWw6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyQ3JlYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJDcmVhdGVNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlckNyZWF0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlclVwZGF0ZU1vZGVsKGdyb3VwOiBaR3JvdXAsIHptb2RlbDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJVcGRhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlclVwZGF0ZU1vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyVXBkYXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyRGVsZXRlTW9kZWwoZ3JvdXA6IFpHcm91cCwgem1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlckRlbGV0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyRGVsZXRlTW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJEZWxldGVNb2RlbChncm91cCwgem1vZGVsKTtcclxuICB9XHJcblxyXG4gIGFmdGVyQ2xvbmVOZXdNb2RlbChncm91cDogWkdyb3VwLCB6bW9kZWw6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyQ2xvbmVOZXdNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckNsb25lTmV3TW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJDbG9uZU5ld01vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgYWZ0ZXJQYWdlSW5pdGlhbGlzZShncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyUGFnZUluaXRpYWxpc2UpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJQYWdlSW5pdGlhbGlzZSBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJQYWdlSW5pdGlhbGlzZShncm91cCk7XHJcbiAgfVxyXG5cclxuICAvLyBwcml2YXRlIG9uQWN0aW9uKGdyb3VwOiBaR3JvdXApIHtcclxuICAvLyAgIHRoaXMuYWN0aW9uU2hlZXRDdHJsXHJcbiAgLy8gICAgIC5jcmVhdGUoe1xyXG4gIC8vICAgICAgIGhlYWRlcjogXCJDaG9vc2UgYW4gQWN0aW9uXCIsXHJcbiAgLy8gICAgICAgYnV0dG9uczogZ3JvdXAudG9wUmlnaHRBY3Rpb25CdXR0b25cclxuICAvLyAgICAgfSlcclxuICAvLyAgICAgLnRoZW4oYWN0aW9uU2hlZXRFbCA9PiB7XHJcbiAgLy8gICAgICAgYWN0aW9uU2hlZXRFbC5wcmVzZW50KCk7XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0TW9kZWxWYWx1ZShwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgZ3JvdXA6IFpHcm91cCkge1xyXG4gIC8vICAgZ3JvdXAuek1vZGVsW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcclxuICAvLyAgIGlmIChncm91cC5pc0xvYWRpbmcpIHtcclxuICAvLyAgICAgcmV0dXJuO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgY29uc3QgZmcgPSBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAvLyAgIGlmICghZmcpIHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgLCBuby1kZWJ1Z2dlclxyXG4gIC8vICAgICBkZWJ1Z2dlcjtcclxuICAvLyAgIH1cclxuICAvLyAgIGNvbnN0IGZjID0gZmcuY29udHJvbHNbcHJvcGVydHlOYW1lXTtcclxuICAvLyAgIGlmICghZmMpIHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXJcclxuICAvLyAgICAgZGVidWdnZXI7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBmYy5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgLy8gICBmYy5tYXJrQXNEaXJ0eSgpO1xyXG4gIC8vIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNob3d6TW9kYWwoXHJcbiAgICBjb2xGaWVsZHMkOiBzdHJpbmcgfCBPYnNlcnZhYmxlPEFycmF5PFpGaWVsZD4+LFxyXG4gICAgcGFyZW50R3JvdXA6IFpHcm91cCxcclxuICAgIGZvcm1IZWFkZXI6IHN0cmluZyxcclxuICAgIHpNb2RlbD86IGFueSxcclxuICAgIHJlZmVySWQ/OiBzdHJpbmcsXHJcbiAgICBjb21wb25lbnRTaXplPzogWkNvbXBvbmVudFNpemUsXHJcbiAgICBza2lwSXNEaXJ0eUNoZWNrPzogYm9vbGVhbixcclxuICAgIHZhbGlkYXRlSXNSZXF1aXJlZD86IGJvb2xlYW5cclxuICApIHtcclxuICAgIGNvbnN0IG1vZGFsY29tcG9uZW50ID0gWm1vZGFsQ29tcG9uZW50O1xyXG4gICAgY29uc3QgbW9kYWxtb2JpbGVjb21wb25lbnQgPSBabW9kYWxNb2JpbGVDb21wb25lbnQ7XHJcblxyXG4gICAgaWYgKHBhcmVudEdyb3VwKSB7XHJcbiAgICAgIC8vIGRpc2FibGUgaXNUcmlnZ2VyZWQgYmVmb3JlIGRpc3BsYXkgdGhlIHBvcHVwLlxyXG4gICAgICBwYXJlbnRHcm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coY29sRmllbGRzJCwgcGFyZW50R3JvdXAsIGZvcm1IZWFkZXIsIG1vZGFsY29tcG9uZW50LCBtb2RhbG1vYmlsZWNvbXBvbmVudCwgek1vZGVsLCByZWZlcklkLCBjb21wb25lbnRTaXplLCBza2lwSXNEaXJ0eUNoZWNrLCB2YWxpZGF0ZUlzUmVxdWlyZWQpO1xyXG4gICAgLy9jb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coKTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgY29va2llU3RvcmVQb3N0KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyBmb3IgUG9zdCB0byBDb29raWVTdG9yZVxyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcImFwaS9Db29raWVTdG9yZXNcIjtcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVmFsdWUgPSB7XHJcbiAgICAgICdOYW1lJzogbmFtZSxcclxuICAgICAgJ1ZhbHVlJzogSlNPTi5zdHJpbmdpZnkodmFsdWUpXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFBvc3QkKGNvb2tpZVN0b3JlVVJMLCBjb29raWVTdG9yZVZhbHVlKS5waXBlKG1hcChyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJncmlkIGNvbmZpZyBzYXZlZChcIiArIHJlcy5zdGF0dXMgKyBcIik6IFwiLCByZXMpO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb29raWVTdG9yZUdldChuYW1lOiBzdHJpbmcsIGFjY2Vzc1Rva2VuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcImFwaS9Db29raWVTdG9yZXMvP25hbWU9XCIgKyBuYW1lO1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cEdldCQoY29va2llU3RvcmVVUkwsIHsgaGVhZGVyczogYWNjZXNzVG9rZW4gfSkucGlwZShtYXAocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb29raWVTdG9yZURlbGV0ZU11bHRpcGxlKG5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyBmb3IgUG9zdCB0byBDb29raWVTdG9yZVxyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcIkFkbWluL0RlbGV0ZU11bHRpcGxlQ29va2llc1wiO1xyXG4gICAgY29uc3QgY29va2llU3RvcmVWYWx1ZSA9IHtcclxuICAgICAgJ2NvbnRhaW5OYW1lJzogbmFtZVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQb3N0JChjb29raWVTdG9yZVVSTCwgY29va2llU3RvcmVWYWx1ZSkucGlwZShtYXAocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb0VsZW1lbnRCeUlkKGlkOiBzdHJpbmcsIGJlaGF2aW9yOiAnc21vb3RoJyB8ICdhdXRvJyA9ICdzbW9vdGgnKSB7XHJcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuICAgIGVsLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3IgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdHJhbnNsYXRpb25QYWdlRWxlbWVudChncm91cDogWkdyb3VwKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IG9ic0xpc3QgPSBuZXcgQXJyYXk8T2JzZXJ2YWJsZTxhbnk+PigpO1xyXG4gICAgaWYgKGdyb3VwLmZvcm1IZWFkZXIpIHtcclxuICAgICAgb2JzTGlzdC5wdXNoKHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLiR0cmFuc2xhdGVTaW5nbGVJdGVtKGdyb3VwLCBcImZvcm1IZWFkZXJcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChncm91cC5uYXZJdGVtcyAmJiBncm91cC5uYXZJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIG9ic0xpc3QucHVzaCh0aGlzLnRyYW5zbGF0aW9uU2VydmljZS4kdHJhbnNsYXRlSXRlbUxpc3QoZ3JvdXAubmF2SXRlbXMsIFwidGV4dFwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9ic0xpc3QubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcmtKb2luKG9ic0xpc3QpO1xyXG4gIH1cclxuXHJcbiAgLy8gI3JlZ2lvbiBERUNcclxuICBwdWJsaWMgYXN5bmMgbG9hZENvbnRhaW5lclZpZXcoZWxlbWVudENvbnRhaW5lcjogYW55LCBjb250YWluZXJQYWdlOiBhbnksIGRhdGE6IFpGaWVsZCwgZ3JvdXA/OiBaR3JvdXApIHtcclxuICAgIGlmICghZWxlbWVudENvbnRhaW5lcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkVsZW1lbnRDb250YWluZXIgaXMgbnVsbC5cIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbnRhaW5lclBhZ2UpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJDb250YWluZXJQYWdlIGlzIG51bGwuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgdmlld0NvbnRhaW5lclJlZiA9IGVsZW1lbnRDb250YWluZXIudmlld0NvbnRhaW5lclJlZjtcclxuICAgIHZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcclxuXHJcbiAgICBjb25zdCBlbWJlZGRlZGdyb3VwID0gbmV3IFpHcm91cCgpO1xyXG4gICAgdGhpcy5zZXRHcm91cEZvckRlYnVnZ2VyKGVtYmVkZGVkZ3JvdXApO1xyXG4gICAgY29uc3QgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PiA9IHZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbnRhaW5lclBhZ2UpO1xyXG5cclxuICAgIGVtYmVkZGVkZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTsgLy8gZW5hYmxlIGJhY2sgdGhlIGJ1dHRvbiBmb3IgdHJpZ2dlcmluZy5cclxuXHJcbiAgICAvLyBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZVtcImdyb3VwXCJdLCBncm91cCk7XHJcbiAgICBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZVtcImdyb3VwXCJdLCBlbWJlZGRlZGdyb3VwKTtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZVtcImdyb3VwXCJdLCB7IHBhcmVudEdyb3VwOiBncm91cCwgaXNFbWJlZGRlZFBhZ2U6IHRydWUsIGVsZW1lbnRDb250YWluZXI6IGVsZW1lbnRDb250YWluZXIsIENvbnRhaW5lckZvcm1BdXRvU2Nyb2xsOiBkYXRhLkNvbnRhaW5lckZvcm1BdXRvU2Nyb2xsIH0pO1xyXG5cclxuICAgIC8vIHRvZG86IGFkZCBpbiBwcm9wXHJcbiAgICBpZiAoZGF0YSAmJiBkYXRhLkNvbnRhaW5lckZvcm1BdXRvU2Nyb2xsKSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsVG9FbWJiZWRDb21wb25lbnRQYWdlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Nyb2xsVG9FbWJiZWRDb21wb25lbnRQYWdlKG1pbGxpU2Vjb25kczogbnVtYmVyID0gMTUwMCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgZW5kT2ZHcmlkRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlbmQtb2YtZ3JpZFwiKTtcclxuICAgIGNvbnN0IGVuZE9mR3JpZFBvc2l0aW9uSW5mbyA9IGVuZE9mR3JpZERpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHlDb29yID0gKGVuZE9mR3JpZFBvc2l0aW9uSW5mbz8ueSB8fCA2MzApIC0gMTA7XHJcblxyXG4gICAgY29uc3QgbWFpbklvbkNvbnRlbnQ6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaW9uLWNvbnRlbnQtbWFpbi1wYWdlXCIpO1xyXG4gICAgcmV0dXJuIG1haW5Jb25Db250ZW50LnNjcm9sbEJ5UG9pbnQoMCwgeUNvb3IsIG1pbGxpU2Vjb25kcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Nyb2xsVG9Ub3BPZlBhZ2UobWlsbGlTZWNvbmRzOiBudW1iZXIgPSAxNTAwKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBtYWluSW9uQ29udGVudDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpb24tY29udGVudC1tYWluLXBhZ2VcIik7XHJcbiAgICByZXR1cm4gbWFpbklvbkNvbnRlbnQuc2Nyb2xsVG9Qb2ludCgwLCAwLCBtaWxsaVNlY29uZHMpIGFzIFByb21pc2U8dm9pZD47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY2xvc2VDb250YWluZXJWaWV3KGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmIChncm91cFtgcGFyZW50R3JvdXBgXSAmJiBncm91cFtgcGFyZW50R3JvdXBgXVtgZTFDbG9zZUdyaWRDb250YWluZXJgXSAmJiB0eXBlb2YgZ3JvdXBbYHBhcmVudEdyb3VwYF1bYGUxQ2xvc2VHcmlkQ29udGFpbmVyYF0gPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICBncm91cFtgcGFyZW50R3JvdXBgXVtgZTFDbG9zZUdyaWRDb250YWluZXJgXShmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwcml2YXRlIHNldEdyb3VwRm9yRGVidWdnZXIoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgaXNEZWJ1Z2dpbmcgPSB0aGlzLnpjb3JlU2VydmljZS5pc0RlYnVnU2Vzc2lvbigpIHx8IGZhbHNlO1xyXG4gICAgaWYgKGlzRGVidWdnaW5nKSB7XHJcbiAgICAgIHRoaXMuZGVidWdTZXJ2aWNlLm9uSW5pdERlYnVnZ2VyKGdyb3VwKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZWZyZXNoR3JpZChncm91cDogWkdyb3VwKSB7XHJcbiAgY29uc3QgemdyaWRDb250cm9sID0gZ3JvdXBbXCJncmlkT3B0aW9uc1wiXSBhcyBaR3JpZDtcclxuICBpZiAoemdyaWRDb250cm9sKSB7XHJcbiAgICB6Z3JpZENvbnRyb2wuZ2V0RGF0YSgpO1xyXG4gIH1cclxuICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG59XHJcbiJdfQ==
1139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvc2VydmljZXMvbWFpbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFtRCxNQUFNLGlCQUFpQixDQUFDO0FBS25JLDhCQUE4QjtBQUM5QixPQUFPLEVBQWMsZUFBZSxFQUFnQixFQUFFLEVBQVEsUUFBUSxFQUE2QixNQUFNLE1BQU0sQ0FBQztBQUNoSCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBUSxHQUFHLEVBQWMsTUFBTSxnQkFBZ0IsQ0FBQztBQUt2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFJMUUsT0FBTyxFQUNRLFdBQVcsRUFBaUMsZ0JBQWdCLEVBRVosTUFBTSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFDeEcsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7O0FBQ3pCLDBEQUEwRDtBQUMxRCxzREFBc0Q7QUFFdEQscUhBQXFIO0FBQ3JILDBEQUEwRDtBQU0xRCxNQUFNLE9BQU8sV0FBVztJQWdCdEIsWUFDVSxNQUFjLEVBQ2QsY0FBOEIsRUFDOUIsU0FBMEIsRUFDMUIsYUFBNEIsRUFDNUIsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsa0JBQXNDLEVBQ3RDLHFCQUFtRCxFQUNuRCxhQUE0QixFQUM1QixZQUEwQixFQUMxQixZQUEwQixFQUMxQixjQUFxQyxFQUNyQyxZQUFv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O0lBQ0QsS0FBSyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgTmF2aWdhdGlvblN0YXJ0LCBOYXZpZ2F0aW9uRW5kLCBOYXZpZ2F0aW9uRXJyb3IsIFJvdXRlciwgRXZlbnQsIEFjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uRXh0cmFzIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcbmltcG9ydCB7IE1vZGFsQ29udHJvbGxlciwgTmF2Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiwgb2YsIGZyb20sIGZvcmtKb2luLCBSZXBsYXlTdWJqZWN0LCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRhcCwgc3dpdGNoTWFwLCB0YWtlLCBtYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IERpYWxvZ1JlZiwgRGlhbG9nU2VydmljZSwgRGlhbG9nU2V0dGluZ3MgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1kaWFsb2cnO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50RGVidWdTZXJ2aWNlIH0gZnJvbSAnLi96Y29tcG9uZW50LmRlYnVnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBabW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi96bW9kYWwvem1vZGFsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFptb2RhbE1vYmlsZUNvbXBvbmVudCB9IGZyb20gJy4uL3ptb2RhbC96bW9kYWwtbW9iaWxlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFpHcmlkIH0gZnJvbSAnLi4vemdyaWQvemdyaWQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZSB9IGZyb20gJy4vY29tcG9uZW50LWVycm9yLWhhbmRsZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE1vZGFsU2VydmljZSwgTW9kYWxSZXNwb25zZSB9IGZyb20gJ21taGdsb2JhbC16bW9kYWwnO1xyXG5pbXBvcnQge1xyXG4gIEFsZXJ0QnV0dG9uLCBNRVNTQUdFVFlQRSwgTW9kYWxQYWdlUGFyYW1zLCBBbGVydFNlcnZpY2UsIFpDb21wb25lbnRIZWxwZXIsXHJcbiAgQ2FjaGVTZXJ2aWNlLCBGaWVsZFNlcnZpY2UsIFJlc291cmNlQXBpU2VydmljZSwgVHJhbnNsYXRpb25TZXJ2aWNlLCBXZWJBcGlTZXJ2aWNlLCBTdG9yYWdlU2Vzc2lvblNlcnZpY2UsIE9BdXRoMlNlcnZpY2UsIFNpZ25hbHJTZXJ2aWNlLFxyXG4gIFpDb21wb25lbnRPdXRwdXRFdmVudCwgWkNvbXBvbmVudFNpemUsIFpDb3JlU2VydmljZSwgWkZpZWxkLCBaR3JvdXAsIERlZmF1bHRNZXNzYWdlLCBEZWZhdWx0RGlhbG9nVGl0bGUsIFB1c2hDaGFuZ2VFdmVudFxyXG59IGZyb20gJ21taGdsb2JhbC16Y29yZSc7XHJcbi8vIGltcG9ydCB7IE1vZGFsU2VydmljZSB9IGZyb20gJy4uL3ptb2RhbC9tb2RhbC5zZXJ2aWNlJztcclxuLy8gaW1wb3J0IHsgWm1vZGFsUGFnZSB9IGZyb20gJy4uL3ptb2RhbC96bW9kYWwucGFnZSc7XHJcblxyXG4vLyBpbXBvcnQgeyBaQ29tcG9uZW50SGVscGVyLCBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIE1vZGFsUGFnZVBhcmFtcywgWkdyaWQgfSBmcm9tICcuLi9keW5hbWljZm9ybS96Y29tcG9uZW50Lm1vZGVsJztcclxuLy8gaW1wb3J0IHsgWkdyb3VwLCBaRmllbGQgfSBmcm9tICcuLi9tb2RlbC96Z3JvdXAubW9kZWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBNYWluU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBncm91cDogWkdyb3VwO1xyXG4gIHByaXZhdGUgb2F1dGhFbnZpcm9ubWVudFVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgZW52aXJvbm1lbnQ7XHJcbiAgcHJpdmF0ZSBiYWNrTmF2aWdhdGlvblBhdGg6IHN0cmluZ1tdID0gW107XHJcbiAgcHJpdmF0ZSByb3V0ZVBhcmFtOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHByaXZhdGUgcHJldmlvdXNSb3V0ZVBhcmFtOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVkgPSAncm91dGVQYXJhbSc7XHJcbiAgcHJpdmF0ZSBQUkVWSU9VU19QQUdFX1JPVVRFX1BBUkFNX1NUT1JBR0VfS0VZID0gJ3ByZXZpb3VzUGFnZVJvdXRlUGFyYW0nO1xyXG4gIHByaXZhdGUgQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVkgPSAnYmFja05hdmlnYXRpb25QYXRoJztcclxuICBwcml2YXRlIE5BVklHQVRFRF9SRUxPQURfR1JJRF9TVE9SQUdFX0tFWSA9ICduYXZpZ2F0ZWRSZWxvYWRHcmlkJztcclxuICBwcml2YXRlIENMT05FX05FV19NT0RFTF9DQUNIRV9LRVkgPSAnY2xvbmVOZXdNb2RlbCc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjcmV0S2V5ID0gJ215LXNlY3JldC1rZXknO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgbW9kYWxDdHJsOiBNb2RhbENvbnRyb2xsZXIsXHJcbiAgICBwcml2YXRlIG5hdkNvbnRyb2xsZXI6IE5hdkNvbnRyb2xsZXIsXHJcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjYWNoZVNlcnZpY2U6IENhY2hlU2VydmljZSxcclxuICAgIHByaXZhdGUgZmllbGRTZXJ2aWNlOiBGaWVsZFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlc291cmNlQXBpU2VydmljZTogUmVzb3VyY2VBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb21wb25lbnRFcnJvckhhbmRsZXI6IENvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHdlYkFwaVNlcnZpY2U6IFdlYkFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHpjb3JlU2VydmljZTogWkNvcmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcclxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXNzaW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZGVidWdTZXJ2aWNlOiBaQ29tcG9uZW50RGVidWdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2U6IFRyYW5zbGF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgc2lnbmFscjogU2lnbmFsclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIG9hdXRoMlNlcnZpY2U6IE9BdXRoMlNlcnZpY2VcclxuICApIHtcclxuICAgIGNvbnNvbGUubG9nKCdNYWluU2VydmljZSBjb25zdHJ1Y3RvcicpO1xyXG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IHRoaXMuemNvcmVTZXJ2aWNlLmdldEVudmlyb25tZW50KCk7XHJcbiAgICB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgPSB0aGlzLmVudmlyb25tZW50LmUxT2F1dGhVcmwgKyAnLyc7XHJcbiAgICB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKChldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KSB7XHJcbiAgICAgICAgLy8gU2hvdyBwcm9ncmVzcyBzcGlubmVyIG9yIHByb2dyZXNzIGJhclxyXG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50KTtcclxuICAgICAgICAvLyBSZXNldCB0aGUgcm91dGVQYXJhbSxiYWNrTmF2aWdhdGlvblBhdGggYW5kIHJlbGF0ZWQgc2Vzc2lvblN0b3JhZ2UgY3VycmVudCBwYWdlIGlzIHN0YXJ0dXAgcGFnZVxyXG4gICAgICAgIGlmICh0aGlzLmdldFN0YXJ0dXBQYWdlKCkgPT09IGV2ZW50LnVybCkge1xyXG4gICAgICAgICAgdGhpcy5yZXNldFJvdXRlUGFyYW0oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcclxuICAgICAgICAvLyBIaWRlIHByb2dyZXNzIHNwaW5uZXIgb3IgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRXJyb3IpIHtcclxuICAgICAgICAvLyBIaWRlIHByb2dyZXNzIHNwaW5uZXIgb3IgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgICAgLy8gUHJlc2VudCBlcnJvciB0byB1c2VyXHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQuZXJyb3IpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlTGFzdE5hdmlnYXRlUmVjb3JkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIGZvciBzaWduYWxSIGFsZXJ0XHJcbiAgcHVibGljIGdldExpc3RGaWVsZE5hbWUgPSAoZmllbGROYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4gPT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKS5zZXQoXCJuYW1lXCIsIGZpZWxkTmFtZSk7XHJcbiAgICByZXR1cm4gdGhpcy5vYXV0aDJTZXJ2aWNlLmh0dHBHZXQkKHRoaXMuZmllbGRTZXJ2aWNlLmRvd25sb2FkTGlzdEZpZWxkVXJsLCBwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcChyZXMgPT4gKHJlcyBhcyBhbnkpLkZpZWxkRWxlbWVudE1hc3RlcklkKSxcclxuICAgICAgc3dpdGNoTWFwKGlkID0+IHRoaXMub2F1dGgyU2VydmljZS5odHRwR2V0JCh0aGlzLmZpZWxkU2VydmljZS5kb3dubG9hZEZvcm1GaWVsZFVybCwgeyBpZCB9KSksXHJcbiAgICAgIG1hcChyZXMgPT4gKHJlcyBhcyBhbnkpLk5hbWUgYXMgc3RyaW5nKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhckZvcm1MaXN0RmllbGRzID0gKCkgPT4ge1xyXG4gICAgdGhpcy5maWVsZFNlcnZpY2UuZGF0YUZvcm1GaWVsZHMgPSB7fTtcclxuICAgIHRoaXMuZmllbGRTZXJ2aWNlLmRhdGFMaXN0RmllbGRzID0ge307XHJcbiAgICB0aGlzLmZpZWxkU2VydmljZS5kYXRhTGlzdEZpZWxkSXRlbXMgPSB7fTtcclxuICB9XHJcblxyXG4gIHNpZ25hbHJHZXRFdmVudCgpOiBPYnNlcnZhYmxlPFB1c2hDaGFuZ2VFdmVudD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsci5nZXRFdmVudCgpO1xyXG4gIH1cclxuXHJcbiAgZGlhbG9nT3BlbihvcHRpb25zOiBEaWFsb2dTZXR0aW5ncyk6IERpYWxvZ1JlZiB7XHJcbiAgICByZXR1cm4gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4ob3B0aW9ucyk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBzdGFydFVwKCkge1xyXG4gICAgY29uc29sZS5sb2coJ0F0IG1haW4uc2VydmljZSAoU3RhcnRVcCkgLi4uJyk7XHJcbiAgfVxyXG5cclxuICBzZXRHcm91cChncm91cDogWkdyb3VwKSB7XHJcbiAgICB0aGlzLmdyb3VwID0gZ3JvdXA7XHJcbiAgICB0aGlzLmZpZWxkU2VydmljZS5zZXRHcm91cChncm91cCk7XHJcbiAgICB0aGlzLnJlc291cmNlQXBpU2VydmljZS5zZXRHcm91cChncm91cCk7XHJcbiAgICB0aGlzLndlYkFwaVNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgdGhpcy5zZXRHcm91cEZvckRlYnVnZ2VyKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIGdldFJlc291cmNlU2VydmVyRGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzLnJlc291cmNlQXBpU2VydmljZS5sb2FkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0R3JvdXBGaWVsZHMoXHJcbiAgICBjdHJsTmFtZTogc3RyaW5nLFxyXG4gICAgZm9ybVR5cGU6IFwiTGlzdEZpZWxkXCIgfCBcIkZvcm1GaWVsZFwiLFxyXG4gICAgZ3JvdXA6IFpHcm91cCxcclxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShcclxuICAgICAgY3RybE5hbWUsXHJcbiAgICAgIGZvcm1UeXBlLFxyXG4gICAgICBncm91cCxcclxuICAgICAgcHJvcGVydHlOYW1lXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZUdyb3VwKFxyXG4gICAgZ3JvdXA6IFpHcm91cCxcclxuICAgIGN0cmxOYW1lOiBzdHJpbmcsXHJcbiAgICBwYWdlTmFtZTogc3RyaW5nLFxyXG4gICAgbWU6IGFueVxyXG4gICk6IFN1YnNjcmlwdGlvbiB7XHJcbiAgICBpZiAobWUuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIG1lLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gZ3JvdXAucmVzb3VyY2VVUkxOYW1lIHx8IGN0cmxOYW1lO1xyXG4gICAgZ3JvdXAucmVzb3VyY2VVUkxOYW1lID0gcmVzb3VyY2VOYW1lO1xyXG5cclxuICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAsIHtcclxuICAgICAgcmVzb3VyY2VVUkw6IHRoaXMucmVzb3VyY2VBcGlTZXJ2aWNlLmdldFVSTChyZXNvdXJjZU5hbWUpLFxyXG4gICAgICBncmlkQ29sdW1uRmllbGRzOiB0aGlzLmZpZWxkU2VydmljZS5nZXRGb3JtRmllbGRDb2RlKFxyXG4gICAgICAgIGN0cmxOYW1lLFxyXG4gICAgICAgIFwiRm9ybUZpZWxkXCIsXHJcbiAgICAgICAgbnVsbCxcclxuICAgICAgICBudWxsXHJcbiAgICAgICksXHJcbiAgICAgIGN0cmxTY29wZTogbWUsXHJcbiAgICAgIHBhZ2VOYW1lLFxyXG4gICAgICBjdHJsTmFtZSxcclxuICAgICAgLy8gY3JlYXRlTW9kZWxVUkw6IFwiL2NyZWF0ZVwiICsgY3RybE5hbWUudG9Mb3dlckNhc2UoKSxcclxuICAgICAgZWRpdE1vZGVsVVJMOiBjdHJsTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAvLyBsaXN0TW9kZWxVUkw6IFwiL2xpc3RcIiArIGN0cmxOYW1lLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgIC8vIGZvcm1IZWFkZXI6IFwiLi4uXCIsXHJcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcclxuICAgICAgZmllbGRzOiBbXSxcclxuICAgICAgek1vZGVsOiB7fSxcclxuICAgICAgekNvbXBvbmVudHM6IHt9LFxyXG4gICAgICB6RGF0YToge30sXHJcbiAgICAgIHN1YmplY3Q6IG5ldyBCZWhhdmlvclN1YmplY3Q8WkNvbXBvbmVudE91dHB1dEV2ZW50PihudWxsKSxcclxuICAgICAgLy8gZm9ybTogbnVsbCBhcyBGb3JtR3JvdXAsIC8vIHJlbW92ZWQgZm9yIGJ1ZyBmaXguXHJcbiAgICAgIGNhbmNlbEJ1dHRvbk5hbWU6IFwiQ2xvc2VcIixcclxuICAgICAgekJ1dHRvbnNDb3VudDogMCxcclxuICAgICAgLy8gdG9wUmlnaHRBY3Rpb25CdXR0b246IFtdLFxyXG4gICAgICAvLyBvbkFjdGlvbjogdGhpcy5vbkFjdGlvbi5iaW5kKHRoaXMpLFxyXG4gICAgICBiYWNrTmF2aWdhdGlvbjogdGhpcy5iYWNrTmF2aWdhdGlvbi5iaW5kKHRoaXMpLFxyXG4gICAgICBoaXN0b3J5QmFjazogdGhpcy5oaXN0b3J5QmFjay5iaW5kKHRoaXMpLFxyXG4gICAgICByZWZyZXNoUGFnZTogdGhpcy5yZWZyZXNoUGFnZS5iaW5kKHRoaXMpLFxyXG4gICAgICByZWZyZXNoR3JpZDogdGhpcy5yZWZyZXNoR3JpZC5iaW5kKHRoaXMpLFxyXG4gICAgICB1cGRhdGVNb2RlbDogdGhpcy51cGRhdGVNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICBjcmVhdGVNb2RlbDogdGhpcy5jcmVhdGVNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICBjbG9uZU5ld01vZGVsOiB0aGlzLmNsb25lTmV3TW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgZGVsZXRlTW9kZWw6IHRoaXMuZGVsZXRlTW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgbmV3TW9kZWw6IHRoaXMubmV3TW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgLy8gdXBkYXRlRWRpdE1vZGU6IHRoaXMudXBkYXRlRWRpdE1vZGUuYmluZCh0aGlzKSxcclxuICAgICAgLy8gX2lzRGVidWdnaW5nOiBlbnZpcm9ubWVudC5kZWJ1Z1Nlc3Npb24gfHwgZmFsc2UsXHJcbiAgICAgIC8vIF9kZWJ1Zzoge1xyXG4gICAgICAvLyAgIHpEYXRhOiAgeyBjb2xsZWN0ZWRBY3Rpdml0aWVzOiBbXSwgYWN0aXZpdHlDb3VudDogMCB9XHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3M6IG51bGwsXHJcbiAgICAgIC8vIGJlZm9yZVVwZGF0ZU1vZGVsOiBudWxsLFxyXG4gICAgICAvLyBpc0VkaXQ6IGZhbHNlXHJcbiAgICB9KTtcclxuXHJcbiAgICBtZS5zdWJzY3JpcHRpb24gPSBncm91cC5zdWJqZWN0LnN1YnNjcmliZSgoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCkgPT5cclxuICAgICAgdGhpcy5zdWJqZWN0RXZlbnQoZXZlbnQsIGdyb3VwLCBtZSlcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIG1lLnN1YnNjcmlwdGlvbjtcclxuICB9XHJcblxyXG4gIGdldE1vZGVsJChncm91cDogWkdyb3VwLCBpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IHJlY0lkID0gaWQgfHwgZ3JvdXAucmVmZXJlbmNlSWQ7XHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgIC5odHRwR2V0JChncm91cC5yZXNvdXJjZVVSTCArIFwiL1wiICsgcmVjSWQsIG51bGwpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRhcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICBncm91cC56TW9kZWwgPSB6bW9kZWw7XHJcbiAgICAgICAgICAvL2lmIChcclxuICAgICAgICAgIC8vICBncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZCAmJlxyXG4gICAgICAgICAgLy8gIE9iamVjdC5rZXlzKHptb2RlbCkuaW5kZXhPZihncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZCkgIT09IC0xICYmXHJcbiAgICAgICAgICAvLyAgIWdyb3VwLmJhY2tOYXZpZ2F0aW9uUGFnZS5lbmRzV2l0aChcIi5lZGl0XCIpXHJcbiAgICAgICAgICAvLykge1xyXG4gICAgICAgICAgLy8gIGdyb3VwLmJhY2tOYXZpZ2F0aW9uUGFnZSA9XHJcbiAgICAgICAgICAvLyAgICBncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UgK1xyXG4gICAgICAgICAgLy8gICAgXCIvXCIgK1xyXG4gICAgICAgICAgLy8gICAgem1vZGVsW2dyb3VwLnBhcmVudFJlZmVyZW5jZUZpZWxkXS50b1N0cmluZygpICtcclxuICAgICAgICAgIC8vICAgIFwiL2VkaXRcIjtcclxuICAgICAgICAgIC8vfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZ3JvdXAuYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3MoZ3JvdXApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgY2FuRXhpdChmb3JtOiBGb3JtR3JvdXApOiBib29sZWFuIHwgT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIWZvcm0gfHwgIWZvcm0uZGlydHkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZvcm1bJ3NraXBEaXJ0eUNoZWNrJ10pIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYWxlcnRTZXJ2aWNlXHJcbiAgICAgIC5zaG93KFwiRGF0YSBub3Qgc2F2ZSB5ZXRcIiwgXCJBcmUgeW91IHN1cmUgd2FudCB0byBkaXNjYXJkIHRoZSBjaGFuZ2VzP1wiLCBbXHJcbiAgICAgICAgXCJDYW5jZWxcIixcclxuICAgICAgICBcIkRpc2NhcmQgQ2hhbmdlc1wiLFxyXG4gICAgICBdKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVwbHkgPT09IFwiRGlzY2FyZCBDaGFuZ2VzXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgLy8gY29uc3QgcmVwbHlTdWIgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gICAgLy8gdGhpcy5hbGVydEN0cmxcclxuICAgIC8vICAgLmNyZWF0ZSh7XHJcbiAgICAvLyAgICAgaGVhZGVyOiBcIkRhdGEgbm90IHNhdmUgeWV0XCIsXHJcbiAgICAvLyAgICAgLy8gc3ViSGVhZGVyOiAnU3ViSGVhZGVyIHN0YXRlbWVudCBoZXJlJyxcclxuICAgIC8vICAgICBtZXNzYWdlOiBcIkFyZSB5b3Ugc3VyZSB3YW50IHRvIGRpc2NhcmQgdGhlIGNoYW5nZXM/XCIsXHJcbiAgICAvLyAgICAgYnV0dG9uczogW1xyXG4gICAgLy8gICAgICAge1xyXG4gICAgLy8gICAgICAgICB0ZXh0OiBcIkNhbmNlbFwiLFxyXG4gICAgLy8gICAgICAgICByb2xlOiBcImNhbmNlbFwiLFxyXG4gICAgLy8gICAgICAgICBjc3NDbGFzczogXCJzZWNvbmRhcnlcIixcclxuICAgIC8vICAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xyXG4gICAgLy8gICAgICAgICAgIHJlcGx5U3ViLm5leHQoZmFsc2UpO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgICB9LFxyXG4gICAgLy8gICAgICAge1xyXG4gICAgLy8gICAgICAgICB0ZXh0OiBcIkRpc2NhcmQgQ2hhbmdlc1wiLFxyXG4gICAgLy8gICAgICAgICBjc3NDbGFzczogXCJ3YXJuaW5nXCIsXHJcbiAgICAvLyAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcclxuICAgIC8vICAgICAgICAgICByZXBseVN1Yi5uZXh0KHRydWUpO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgICB9XHJcbiAgICAvLyAgICAgXVxyXG4gICAgLy8gICB9KVxyXG4gICAgLy8gICAudGhlbihhbGVydEVsZW1lbnQgPT4ge1xyXG4gICAgLy8gICAgIGFsZXJ0RWxlbWVudC5wcmVzZW50KCk7XHJcbiAgICAvLyAgIH0pO1xyXG4gICAgLy8gcmV0dXJuIHJlcGx5U3ViLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZSgxKSk7XHJcbiAgfVxyXG5cclxuICAvLyBhc3luYyBvcGVuTW9kYWxGb3JtKG1vZGFsUGFyYW1zOiBNb2RhbFBhZ2VQYXJhbXMpIHtcclxuICAvLyAgIC8vIGNvbnNvbGUubG9nKFwib3Blbk1vZGFsRm9ybVwiKTtcclxuICAvLyAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgLy8gICAgIFwiUGxlYXNlIHVzZSBNb2RhbFNlcnZpY2Uuc2hvdyBpbnN0ZWFkIG9mIE1haW5TZXJ2aWNlLm9wZW5Nb2RhbEZvcm0hXCJcclxuICAvLyAgICk7XHJcbiAgLy8gICAvLyBjb25zdCBtb2RhbCA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3cobW9kYWxQYXJhbXMuY29sRmllbGRzJCB8fCBtb2RhbFBhcmFtcy5jb250cm9sbGVyTmFtZSwgbW9kYWxQYXJhbXMucGFyZW50R3JvdXAsXHJcbiAgLy8gICAvLyAgIG1vZGFsUGFyYW1zLmZvcm1IZWFkZXIsIG1vZGFsUGFyYW1zLnpNb2RlbCwgbW9kYWxQYXJhbXMucmVmZXJJZCk7XHJcbiAgLy8gICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxDdHJsLmNyZWF0ZSh7XHJcbiAgLy8gICAgIGNvbXBvbmVudDogWm1vZGFsUGFnZSxcclxuICAvLyAgICAgYmFja2Ryb3BEaXNtaXNzOiB0cnVlLFxyXG4gIC8vICAgICBjb21wb25lbnRQcm9wczoge1xyXG4gIC8vICAgICAgIG1vZGFsUGFyYW1zLFxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgfSk7XHJcbiAgLy8gICBtb2RhbC5wcmVzZW50KCk7XHJcbiAgLy8gICByZXR1cm4gbW9kYWw7XHJcbiAgLy8gICAvLyAub25XaWxsRGlzbWlzcygoem1vZGVsOiBhbnkpID0+IHtcclxuICAvLyAgIC8vICAgdGhpcy5cclxuICAvLyAgIC8vIH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgY2xvc2VNb2RhbEZvcm0oZ3JvdXA/OiBaR3JvdXApIHtcclxuICAgIGlmIChncm91cCAmJiBncm91cC5zdWJqZWN0KSB7XHJcbiAgICAgIGdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgICAgdHlwZTogXCJNb2RhbFNlcnZpY2UuY2xvc2VcIixcclxuICAgICAgICB0YXJnZXQ6IFwibW9kYWxHcm91cC5tb2RhbENhbmNlbCgpXCJcclxuICAgICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubW9kYWxDdHJsLmRpc21pc3MoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN1YmplY3RFdmVudChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwLCBtZTogYW55KSB7XHJcbiAgICBpZiAoIWV2ZW50IHx8ICFldmVudC50YXJnZXQgfHwgZXZlbnQudGFyZ2V0LnN0YXJ0c1dpdGgoXCJtb2RhbEdyb3VwLlwiKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcIj4+IFN1YmplY3RFdmVudFwiLCBldmVudCk7XHJcbiAgICBsZXQgY2FsbEZ1bmM7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY2FsbEZ1bmMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwoXHJcbiAgICAgICAgZ3JvdXAuY3RybFNjb3BlLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICBncm91cFxyXG4gICAgICApO1xyXG4gICAgICAvLyBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoZXZlbnQuVGFyZ2V0LCBncm91cCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJFcnJvciB3aGVuIGdldEdyb3VwVmFsdWU6IFwiLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICBcIiA+IEVycm9yOiBcIixcclxuICAgICAgICBlcnJvclxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNhbGxGdW5jKGV2ZW50KTtcclxuICAgIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICBjb25zdCBuZXdGdW5jID0gY2FsbEZ1bmMuYmluZChtZSk7XHJcbiAgICAgIG5ld0Z1bmMoZXZlbnQsIGdyb3VwLCBtZSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYWxsRnVuYyA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICBpZiAoZXZlbnQudHlwZS5lbmRzV2l0aChcIm9uTmF2aWdhdGVUb1wiKSkge1xyXG4gICAgICAgIGNvbnN0IG5VcmwgPSBldmVudC50YXJnZXQucmVwbGFjZShcIi86aWRcIiwgXCIvXCIgKyBldmVudC5kYXRhKTtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbblVybF0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiemdyaWQtY2VsbENsaWNrXCIpIHtcclxuICAgICAgICAvLyAoY2FsbEZ1bmMuc3RhcnRzV2l0aCgnZWRpdCcpKSB7ICB6Z3JpZC1jZWxsQ2xpY2tcclxuICAgICAgICBjb25zdCBjTmFtZSA9IGNhbGxGdW5jLnNsaWNlKDQpO1xyXG4gICAgICAgIC8vIC8vIGRlYnVnZ2VyO1xyXG4gICAgICAgIC8vIGNvbnN0IG1vZGFsR3JvdXBQYXJhbTogTW9kYWxQYWdlUGFyYW1zID0ge307XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLmNvbnRyb2xsZXJOYW1lID0gY05hbWU7XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLnJlZmVySWQgPSBldmVudC5kYXRhLklkO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5jb2xGaWVsZHMkID0gZXZlbnQuY29sdW1uRmllbGRzJDtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0ucGFyZW50R3JvdXAgPSBtZS5ncm91cDtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtKG1vZGFsR3JvdXBQYXJhbSk7XHJcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyhcclxuICAgICAgICAgIGV2ZW50LmNvbHVtbkZpZWxkcyQgfHwgY05hbWUsXHJcbiAgICAgICAgICBncm91cCxcclxuICAgICAgICAgIFwiXCIsXHJcbiAgICAgICAgICB7fSxcclxuICAgICAgICAgIGV2ZW50LmRhdGEuSWRcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYWxsRnVuYyA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJ6Z3JpZC1jZWxsQ2xpY2tcIikge1xyXG4gICAgICAgIGlmIChjYWxsRnVuYy5uYXZpZ2F0ZVVybCkge1xyXG4gICAgICAgICAgY29uc3QgdXJsID0gY2FsbEZ1bmMubmF2aWdhdGVVcmwucmVwbGFjZShcIjppZFwiLCBldmVudC5kYXRhLklkKTtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmxdKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1vZGFsR3JvdXBQYXJhbTogTW9kYWxQYWdlUGFyYW1zID0ge307XHJcbiAgICAgICAgbW9kYWxHcm91cFBhcmFtLmNvbnRyb2xsZXJOYW1lID0gY2FsbEZ1bmMuY3RybE5hbWU7XHJcbiAgICAgICAgbW9kYWxHcm91cFBhcmFtLnJlZmVySWQgPSBldmVudC5kYXRhLklkO1xyXG4gICAgICAgIG1vZGFsR3JvdXBQYXJhbS5jb2xGaWVsZHMkID0gZXZlbnQuY29sdW1uRmllbGRzJDtcclxuICAgICAgICBtb2RhbEdyb3VwUGFyYW0ucGFyZW50R3JvdXAgPSBtZS5ncm91cDtcclxuICAgICAgICBtb2RhbEdyb3VwUGFyYW0uZm9ybUhlYWRlciA9IGNhbGxGdW5jLmZvcm1IZWFkZXI7XHJcblxyXG4gICAgICAgIGlmIChjYWxsRnVuYy5mb3JtSGVhZGVyKSB7XHJcbiAgICAgICAgICAvLyB0aGlzLm9wZW5Nb2RhbEZvcm0obW9kYWxHcm91cFBhcmFtKTtcclxuICAgICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLnNob3coXHJcbiAgICAgICAgICAgIGV2ZW50LmNvbHVtbkZpZWxkcyQgfHwgY2FsbEZ1bmMuY3RybE5hbWUsXHJcbiAgICAgICAgICAgIGdyb3VwLFxyXG4gICAgICAgICAgICBjYWxsRnVuYy5mb3JtSGVhZGVyLFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5JZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgXCJJbnZhbGlkIGNhbGxGdW5jIHR5cGU6IFwiLFxyXG4gICAgICAgICAgY2FsbEZ1bmMsXHJcbiAgICAgICAgICBcIiBldmVudC5UYXJnZXQ6IFwiLFxyXG4gICAgICAgICAgZXZlbnQudGFyZ2V0XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICAvLyB0aGlzLm9wZW5Nb2RhbEZvcm1CeUNvbXBvbmVudChjYWxsRnVuYy50eXBlLCBldmVudC5EYXRhLklkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBcIkZ1bmN0aW9uIG5vdCBkZWZpbmVkIGluIGdyb3VwIGZvcjogXCIsXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LFxyXG4gICAgICAgIFwiLCBFdmVudDogXCIsXHJcbiAgICAgICAgZXZlbnRcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVN1Y2Nlc3MocmVzOiBSZXNwb25zZSB8IGFueSwgc3VjY2Vzc01zZzogc3RyaW5nKTogUmVzcG9uc2Uge1xyXG4gICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXMgJiYgcmVzLlByb2Nlc3NpbmdTdGF0dXMpIHtcclxuICAgICAgaWYgKHRoaXMuZ3JvdXA/LmRpc2FibGVTdWNjZXNzQ3JlYXRlTXNnIHx8IHRoaXMuZ3JvdXA/LmRpc2FibGVTdWNjZXNzVXBkYXRlTXNnIHx8IHRoaXMuZ3JvdXA/LmRpc2FibGVTdWNjZXNzRGVsZXRlTXNnKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2V0IHNlc3Npb25zdG9yYWdlIHRvIHRyaWdnZXIgdXBkYXRlIHVwb24gY3JlYXRlZFxyXG5cclxuICAgICAgLy8gQWxlcnQgdXNlciB1cGRhdGUvc2F2ZSBzdWNjZXNzXHJcbiAgICAgIHRoaXMud2ViQXBpU2VydmljZS5zaG93SHR0cFJlc3BvbnNlTWVzc2FnZShNRVNTQUdFVFlQRS5TdWNjZXNzLCBzdWNjZXNzTXNnLCBudWxsKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyeVVwZGF0ZUdyb3VwVHJpZ2dlcih2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgdGhpcy5ncm91cC5pc1RyaWdnZXJlZCA9IHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRXJyb3IocmVzOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5oYW5kbGVFcnJvcihyZXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJvdXRlTmF2aWdhdGUocGFnZU5hbWU6IHN0cmluZywgcGFnZVBhcmFtczogc3RyaW5nW10sIHJvdXRlUmVsYXRpdmU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICB0aGlzLnNldE5hdmlnYXRpb25QYXJhbXMocGFnZVBhcmFtcyk7XHJcbiAgICBjb25zdCBzbmFwc2hvdFVybCA9IHRoaXMuYWN0aXZhdGVkUm91dGVbJ19yb3V0ZXJTdGF0ZSddLnNuYXBzaG90LnVybC5zcGxpdCgnPycpWzBdO1xyXG4gICAgY29uc3QgcGFnZVVybCA9IHJvdXRlUmVsYXRpdmUgPyBzbmFwc2hvdFVybCArICcvJyArIHBhZ2VOYW1lIDogcGFnZU5hbWU7XHJcblxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3BhZ2VVcmxdLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TmF2aWdhdGlvblBhcmFtcyh1cmxQYXJhbXM6IHN0cmluZ1tdKSB7XHJcbiAgICAvLyBJZiBpdCBpcyBudWxsIG9yIHVuZGVmaW5lZFxyXG4gICAgaWYgKCF0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkge1xyXG4gICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5pc1ZhbHVlSW5MYXN0RWxlbWVudCh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCwgdGhpcy5yb3V0ZXIudXJsKSkge1xyXG4gICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aC5wdXNoKHRoaXMucm91dGVyLnVybCk7XHJcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMuYmFja05hdmlnYXRpb25QYXRoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXRSb3V0ZVBhcmFtKHVybFBhcmFtcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Um91dGVQYXJhbShyb3V0ZVBhcmFtczogc3RyaW5nW10pIHtcclxuICAgIC8vIElmIGl0IGlzIG51bGwgb3IgdW5kZWZpbmVkXHJcbiAgICBpZiAoIXRoaXMucm91dGVQYXJhbSkge1xyXG4gICAgICB0aGlzLnJvdXRlUGFyYW0gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGaWx0ZXIgb3V0IGFueSBlbXB0eSBzdHJpbmcgcm91dGUgcGFyYW1zIGFuZCBqb2luIHRoZW0gaW50byBhIHNpbmdsZSBzdHJpbmdcclxuICAgIGNvbnN0IG5ld1JvdXRlUGFyYW0gPSAnLycgKyBPYmplY3QudmFsdWVzKHJvdXRlUGFyYW1zKS5maWx0ZXIoZWwgPT4gZWwgIT09ICcnKS5qb2luKCcvJyk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzVmFsdWVJbkxhc3RFbGVtZW50KHRoaXMucm91dGVQYXJhbSwgbmV3Um91dGVQYXJhbSkpIHtcclxuICAgICAgaWYgKHJvdXRlUGFyYW1zKSB7XHJcbiAgICAgICAgLy8gQ2FwdHVyZSB0aGUgcHJldmlvdXMgcGFnZSdzIHJvdXRlIHBhcmFtIHRvIGJlIHVzZWQgZm9yIGJhY2tuYXZpZ2F0aW9uIGNoZWNraW5nXHJcbiAgICAgICAgdGhpcy5wcmV2aW91c1JvdXRlUGFyYW0gPSB0aGlzLnJvdXRlUGFyYW1bdGhpcy5yb3V0ZVBhcmFtLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXMgcm91dGUgcGFyYW0gZXhpc3RzLCBjaGVjayBpZiB0aGUgbGFzdCBzZWdtZW50IGlzICduZXcnIG9yICd1cGRhdGUnXHJcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtKSB7XHJcbiAgICAgICAgICBjb25zdCBwYXJhbVNlZ21lbnQgPSB0aGlzLnByZXZpb3VzUm91dGVQYXJhbS5zcGxpdChcIi9cIik7XHJcbiAgICAgICAgICBjb25zdCBhY3Rpb25TZWdtZW50ID0gcGFyYW1TZWdtZW50W3BhcmFtU2VnbWVudC5sZW5ndGggLSAxXTtcclxuICAgICAgICAgIC8vIElmIHRoZSBsYXN0IHNlZ21lbnQgaXMgJ25ldycgb3IgJ3VwZGF0ZScsIHN0b3JlIHRoZSBwcmV2aW91cyByb3V0ZSBwYXJhbSBpbiBzZXNzaW9uIHN0b3JhZ2VcclxuICAgICAgICAgIGlmIChhY3Rpb25TZWdtZW50ID09PSAnbmV3JyB8fCBhY3Rpb25TZWdtZW50ID09PSAnZWRpdCcgfHwgYWN0aW9uU2VnbWVudCA9PT0gJ3VwZGF0ZScpIHtcclxuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5QUkVWSU9VU19QQUdFX1JPVVRFX1BBUkFNX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLnByZXZpb3VzUm91dGVQYXJhbSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQWRkIHRoZSBuZXcgcm91dGUgcGFyYW0gdG8gdGhlIHJvdXRlUGFyYW0gYXJyYXkgYW5kIHN0b3JlIGl0IGluIHNlc3Npb24gc3RvcmFnZVxyXG4gICAgICAgIHRoaXMucm91dGVQYXJhbS5wdXNoKG5ld1JvdXRlUGFyYW0pO1xyXG4gICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMucm91dGVQYXJhbSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzVmFsdWVJbkxhc3RFbGVtZW50KGFycmF5OiBhbnlbXSwgdGFyZ2V0VmFsdWU6IGFueSkge1xyXG4gICAgaWYgKGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdID09PSB0YXJnZXRWYWx1ZSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuYXZpZ2F0ZUZyb21NZW51KHBhZ2VOYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHsgc3RhcnRVcFBhZ2UgfSA9IHRoaXMuZW52aXJvbm1lbnQ7XHJcbiAgICB0aGlzLnNldFJvdXRlUGFyYW0oW2Ake3N0YXJ0VXBQYWdlfWBdKTtcclxuICAgIHRoaXMuYmFja05hdmlnYXRpb25QYXRoLnB1c2godGhpcy5nZXRTdGFydHVwUGFnZSgpKTtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KFt0aGlzLmdldFN0YXJ0dXBQYWdlKCldKSk7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcGFnZU5hbWVdLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXRSb3V0ZVBhcmFtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yb3V0ZVBhcmFtID0gW107XHJcbiAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCA9IFtdO1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5OQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5yb3V0ZVBhcmFtKSk7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXROYXZpZ2F0aW9uUGFyYW1zKCk6IGFueVtdIHtcclxuICAgIHRoaXMucm91dGVQYXJhbSA9IHRoaXMucm91dGVQYXJhbSB8fCBbXTtcclxuXHJcbiAgICBpZiAodGhpcy5yb3V0ZVBhcmFtLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjb25zdCBzdG9yZWRQYXJhbXMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVkpO1xyXG4gICAgICBpZiAoc3RvcmVkUGFyYW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMucm91dGVQYXJhbSA9IEpTT04ucGFyc2Uoc3RvcmVkUGFyYW1zKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBzdG9yZWQgcm91dGVQYXJhbTonLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc29sZS5sb2coJ05vIHN0b3JlZCBuYXZpZ2F0aW9uIHBhcmFtcyBmb3VuZC4nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5yb3V0ZVBhcmFtO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE5hdmlnYXRpb25QYXJlbnRQYXJhbSgpOiBhbnkge1xyXG4gICAgY29uc3QgbmF2aWdhdGlvblBhcmVudFBhcmFtcyA9IHRoaXMuZ2V0TmF2aWdhdGlvblBhcmFtcygpO1xyXG5cclxuICAgIGlmIChuYXZpZ2F0aW9uUGFyZW50UGFyYW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIG5hdmlnYXRpb25QYXJlbnRQYXJhbXNbbmF2aWdhdGlvblBhcmVudFBhcmFtcy5sZW5ndGggLSAyXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLndhcm4oJ05hdmlnYXRpb24gcGFyZW50IHBhcmFtcyBub3QgZm91bmQuJyk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXROYXZpZ2F0aW9uQ3VycmVudFBhcmFtKCk6IGFueSB7XHJcbiAgICBjb25zdCBuYXZpZ2F0aW9uQ3VycmVudFBhcmFtcyA9IHRoaXMuZ2V0TmF2aWdhdGlvblBhcmFtcygpO1xyXG5cclxuICAgIGlmIChuYXZpZ2F0aW9uQ3VycmVudFBhcmFtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBuYXZpZ2F0aW9uQ3VycmVudFBhcmFtc1tuYXZpZ2F0aW9uQ3VycmVudFBhcmFtcy5sZW5ndGggLSAxXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLndhcm4oJ05hdmlnYXRpb24gY3VycmVudCBwYXJhbXMgbm90IGZvdW5kLicpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFByZXZpb3VzUGFnZVJvdXRlUGFyYW0oKTogYW55IHtcclxuICAgIGlmICh0aGlzLnByZXZpb3VzUm91dGVQYXJhbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIFJldHVybiB0aGUgY2FjaGVkIHZhbHVlIGlmIGl0IGV4aXN0c1xyXG4gICAgICByZXR1cm4gdGhpcy5wcmV2aW91c1JvdXRlUGFyYW07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcHJldmlvdXNSb3V0ZVBhcmFtU3RyID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlBSRVZJT1VTX1BBR0VfUk9VVEVfUEFSQU1fU1RPUkFHRV9LRVkpO1xyXG4gICAgaWYgKHByZXZpb3VzUm91dGVQYXJhbVN0cikge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzUm91dGVQYXJhbSA9IEpTT04ucGFyc2UocHJldmlvdXNSb3V0ZVBhcmFtU3RyKTtcclxuICAgICAgICB0aGlzLnByZXZpb3VzUm91dGVQYXJhbSA9IHByZXZpb3VzUm91dGVQYXJhbTtcclxuICAgICAgICByZXR1cm4gcHJldmlvdXNSb3V0ZVBhcmFtO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihgVW5hYmxlIHRvIHBhcnNlIHByZXZpb3VzIHJvdXRlIHBhcmFtIGZyb20gc2Vzc2lvbiBzdG9yYWdlOiAke2Vycm9yfWApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ05vIHByZXZpb3VzIHBhZ2Ugcm91dGUgcGFyYW0gZm91bmQgaW4gc2Vzc2lvbiBzdG9yYWdlLicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZVByZXZpb3VzUGFnZVJvdXRlUGFyYW0oKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnJlbW92ZSh0aGlzLlBSRVZJT1VTX1BBR0VfUk9VVEVfUEFSQU1fU1RPUkFHRV9LRVkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUxhc3ROYXZpZ2F0ZVJlY29yZCgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVtb3ZlTGFzdE5hdmlnYXRpb25QYXRoKCk7XHJcbiAgICB0aGlzLnJlbW92ZUxhc3RSb3V0ZVBhcmFtKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlTGFzdE5hdmlnYXRpb25QYXRoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGggPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSkgfHwgXCJudWxsXCIpO1xyXG4gICAgaWYgKHRoaXMuYmFja05hdmlnYXRpb25QYXRoKSB7XHJcbiAgICAgIHRoaXMuYmFja05hdmlnYXRpb25QYXRoLnBvcCgpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiTm8gYmFjayBuYXZpZ2F0aW9uIHBhdGggZm91bmQgaW4gc2Vzc2lvbi5cIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlTGFzdFJvdXRlUGFyYW0oKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvdXRlUGFyYW0gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5OQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSkgfHwgXCJudWxsXCIpO1xyXG4gICAgaWYgKHRoaXMucm91dGVQYXJhbSkge1xyXG4gICAgICB0aGlzLnJvdXRlUGFyYW0ucG9wKCk7XHJcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMucm91dGVQYXJhbSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKFwicm91dGVQYXJhbSBzZXNzaW9uIGlzIG51bGwuXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGJhY2tOYXZpZ2F0aW9uKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXAsIG1lOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChncm91cFsnaXNFbWJlZGRlZFBhZ2UnXSkge1xyXG4gICAgICBncm91cFsnaXNUcmlnZ2VyZWQnXSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmNsb3NlQ29udGFpbmVyVmlldyhncm91cCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZ3JvdXAuYmVmb3JlQmFja05hdmlnYXRpb25QYWdlKSB7XHJcbiAgICAgIGdyb3VwLmJlZm9yZUJhY2tOYXZpZ2F0aW9uUGFnZShncm91cCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRlQmFja1RvUHJldmlvdXNQYWdlKGdyb3VwKTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm5hdmlnYXRlQmFja1RvUHJldmlvdXNQYWdlKGdyb3VwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbmF2aWdhdGVCYWNrVG9QcmV2aW91c1BhZ2UoZ3JvdXA6IFpHcm91cCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG5cclxuICAgIGNvbnN0IGJhY2tOYXZpZ2F0aW9uUGF0aDogc3RyaW5nW10gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSkpO1xyXG4gICAgY29uc3QgYmFja05hdmlnYXRpb25VUkwgPSBncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UgfHwgYmFja05hdmlnYXRpb25QYXRoW2JhY2tOYXZpZ2F0aW9uUGF0aC5sZW5ndGggLSAxXTtcclxuICAgIC8vY29uc3QgYmFja05hdmlnYXRpb25QYXRoTGFzdFZhbHVlID0gYmFja05hdmlnYXRpb25QYXRoICYmIGJhY2tOYXZpZ2F0aW9uUGF0aC5sZW5ndGggPiAwID8gYmFja05hdmlnYXRpb25QYXRoW2JhY2tOYXZpZ2F0aW9uUGF0aC5sZW5ndGggLSAxXSA6IG51bGw7XHJcblxyXG4gICAgLy8gaWYgbmF2YXRlZCBieSBleHRlcm5hbChwcmVmaXhlZCB1cmwpIHdoZW4gY2xvc2UsIGRpcmVjdCBnbyB0byBtZW51L3N0YXJ0dSBwYWdlXHJcbiAgICAvL2NvbnN0IGludmFsaWRTdWJzdHJpbmdzID0gWyc/bD0nLCAnP2Y9JywgJz9yPScsICcjJ107XHJcbiAgICAvL2NvbnN0IGNvbnRhaW5zQW55ID0gKHN0ciwgc3Vic3RyaW5ncykgPT4ge1xyXG4gICAgLy8gIHJldHVybiBzdWJzdHJpbmdzLnNvbWUoc3Vic3RyaW5nID0+IHN0ci5pbmNsdWRlcyhzdWJzdHJpbmcpKTtcclxuICAgIC8vfTtcclxuICAgIC8vaWYgKGNvbnRhaW5zQW55KGJhY2tOYXZpZ2F0aW9uUGF0aExhc3RWYWx1ZSwgaW52YWxpZFN1YnN0cmluZ3MpKSB7XHJcbiAgICAvLyAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLmdldFN0YXJ0dXBQYWdlKCksIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcclxuICAgIC8vfVxyXG4gICAgLy9lbHNlIHtcclxuICAgIGlmICghYmFja05hdmlnYXRpb25VUkwpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIG5hdmlnYXRpbmcgYmFjayB0byBwcmV2aW91cyBwYWdlOiBiYWNrTmF2aWdhdGlvblVSTCBpcyBub3Qgc2V0LlwiKTtcclxuICAgICAgLy90aHJvdyBuZXcgRXJyb3IoXCJCYWNrTmF2aWdhdGlvblBhdGggbm90IHNldC5cIik7XHJcbiAgICAgIGF3YWl0IHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwodGhpcy5nZXRTdGFydHVwUGFnZSgpLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UpIHtcclxuICAgICAgY29uc3QgcHJldmlvdXNSb3V0ZVBhcmFtID0gdGhpcy5nZXRQcmV2aW91c1BhZ2VSb3V0ZVBhcmFtKCk7XHJcbiAgICAgIGNvbnN0IHByZXZpb3VzQ3VycmVudFJvdXRlUGFyYW0gPSB0aGlzLmdldE5hdmlnYXRpb25DdXJyZW50UGFyYW0oKTtcclxuICAgICAgaWYgKHByZXZpb3VzUm91dGVQYXJhbSAmJiBwcmV2aW91c1JvdXRlUGFyYW0gPT09IHByZXZpb3VzQ3VycmVudFJvdXRlUGFyYW0pIHtcclxuICAgICAgICB0aGlzLnJlbW92ZVByZXZpb3VzUGFnZVJvdXRlUGFyYW0oKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlbW92ZUxhc3RSb3V0ZVBhcmFtKCk7XHJcbiAgICAgIHRoaXMucmVtb3ZlTGFzdE5hdmlnYXRpb25QYXRoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5OQVZJR0FURURfUkVMT0FEX0dSSURfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRydWUpKTtcclxuXHJcbiAgICBpZiAodGhpcy5jYWNoZVNlcnZpY2UuZ2V0Q2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKSkge1xyXG4gICAgICB0aGlzLmNhY2hlU2VydmljZS5jbGVhckNhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChiYWNrTmF2aWdhdGlvblVSTCwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgbmF2aWdhdGluZyBiYWNrIHRvIHByZXZpb3VzIHBhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKTtcclxuICAgICAgLy90aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICAgIC8vfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFN0YXJ0dXBQYWdlKCkge1xyXG4gICAgY29uc3QgeyBzdGFydFVwUGFnZSB9ID0gdGhpcy5lbnZpcm9ubWVudDtcclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGUgc3RhcnR1cCBwYWdlIHN0YXJ0cyB3aXRoIGEgdW5kZXJzY29yZS5cclxuICAgIGlmIChzdGFydFVwUGFnZS5zdGFydHNXaXRoKCdfJykpIHtcclxuICAgICAgcmV0dXJuIGAvJHtzdGFydFVwUGFnZS5zbGljZSgxKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIG5vdCwgcHJlcGVuZCBhIGZvcndhcmQgc2xhc2ggYW5kIHJldHVybi5cclxuICAgIHJldHVybiBgLyR7c3RhcnRVcFBhZ2V9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGlzdG9yeUJhY2soKSB7XHJcbiAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JvdXBbJ2lzRW1iZWRkZWRQYWdlJ10pIHtcclxuICAgICAgdGhpcy5jbG9zZUNvbnRhaW5lclZpZXcodGhpcy5ncm91cCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm5hdkNvbnRyb2xsZXIucG9wKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaEdyaWQoXHJcbiAgICBldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LFxyXG4gICAgZ3JvdXA6IFpHcm91cCxcclxuICAgIG1lOiBhbnksXHJcbiAgICBncmlkT3B0aW9uTmFtZT86IHN0cmluZ1xyXG4gICkge1xyXG4gICAgZ3JpZE9wdGlvbk5hbWUgPSBncmlkT3B0aW9uTmFtZSB8fCBcImdyaWRPcHRpb25zXCI7XHJcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0KSB7XHJcbiAgICAgIGNvbnN0IGdyaWRPcHRpb24gPSBldmVudC50YXJnZXRcclxuICAgICAgICAudHJpbSgpXHJcbiAgICAgICAgLnJlcGxhY2UoXCIoXCIsIFwiXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoXCIpXCIsIFwiXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoXCJncm91cC5yZWZyZXNoR3JpZFwiLCBcIlwiKTtcclxuICAgICAgaWYgKGdyaWRPcHRpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGdyaWRPcHRpb25OYW1lID0gZ3JpZE9wdGlvbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHpncmlkQ29udHJvbCA9IGdyb3VwW2dyaWRPcHRpb25OYW1lXSBhcyBaR3JpZDtcclxuICAgIGlmICh6Z3JpZENvbnRyb2wpIHtcclxuICAgICAgemdyaWRDb250cm9sLmdldERhdGEoKTtcclxuICAgIH1cclxuICAgIGdyb3VwWydpc1RyaWdnZXJlZCddID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZnJlc2hQYWdlKCkge1xyXG4gICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgbG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAvLyB0aGlzLnJvdXRlci5yb3V0ZVJldXNlU3RyYXRlZ3kuc2hvdWxkUmV1c2VSb3V0ZSA9ICgpID0+IGZhbHNlO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIub25TYW1lVXJsTmF2aWdhdGlvbiA9ICdyZWxvYWQnO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ1BhdGg6ICcsIHRoaXMuYWN0aXZhdGVkUm91dGVbJ19yb3V0ZXJTdGF0ZSddLnNuYXBzaG90LnVybCk7XHJcbiAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9jcm0vY3VzdG9tZXInXSk7XHJcbiAgfVxyXG5cclxuICBnZXRDbG9uZU5ld0NhY2hlWk1vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGNvbnN0IGNhY2hlWk1vZGVsID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0Q2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKTtcclxuICAgIGlmIChjYWNoZVpNb2RlbCkge1xyXG4gICAgICB0aGlzLmNhY2hlU2VydmljZS5jbGVhckNhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSk7XHJcbiAgICAgIGdyb3VwLnpNb2RlbCA9IGNhY2hlWk1vZGVsO1xyXG4gICAgICBncm91cC56TW9kZWwuSWQgPSAwO1xyXG4gICAgfVxyXG4gICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbmV3TW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgb2YoW10pLnBpcGUoXHJcbiAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJCZWZvcmUgbmV3LCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlTmV3TW9kZWwoZ3JvdXApO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImN1cnJlbnQgdXJsOiBcIiwgdGhpcy5yb3V0ZXIudXJsKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSBncm91cC5wYXJlbnRSZWZlcmVuY2VJZCB8fCBcIjBcIjtcclxuICAgICAgICAvL2NvbnN0IHBhdGhTZWdtZW50ID0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KFwiL1wiKTtcclxuICAgICAgICAvL2NvbnN0IGxhc3RTZWdtZW50ID0gcGF0aFNlZ21lbnRbcGF0aFNlZ21lbnQubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgY29uc3QgY3VycmVudE5hdmlnYXRpb25QYXJhbSA9IHRoaXMuZ2V0TmF2aWdhdGlvbkN1cnJlbnRQYXJhbSgpO1xyXG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25TZWdtZW50cyA9IGN1cnJlbnROYXZpZ2F0aW9uUGFyYW0gPyBjdXJyZW50TmF2aWdhdGlvblBhcmFtLnNwbGl0KCcvJykgOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRBY3Rpb24gPSBncm91cC5pc0Nsb25lTmV3ID8gJ25ldycgOiAnZWRpdCc7XHJcbiAgICAgICAgY29uc3QgYWN0aW9uU2VnbWVudCA9IGdyb3VwLmlzQ2xvbmVOZXcgPyAobmF2aWdhdGlvblNlZ21lbnRzID8gbmF2aWdhdGlvblNlZ21lbnRzW25hdmlnYXRpb25TZWdtZW50cy5sZW5ndGggLSAxXSA6ICduZXcnKSA6IGRlZmF1bHRBY3Rpb247XHJcblxyXG4gICAgICAgIGlmIChncm91cC5pc0xpc3RGb3JtKSB7XHJcbiAgICAgICAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKFtyZWZlcmVuY2VJZCwgJ25ldyddKTtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtncm91cC5lZGl0TW9kZWxVUkxdLCB7XHJcbiAgICAgICAgICAgIHJlbGF0aXZlVG86IGdyb3VwLmN0cmxTY29wZS5hY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIFNjZW5hcmlvIDE6IEZyb20gTGlzdCBOZXcoYWN0aW9uOiBuZXcpID09PiBDbGVhciBmb3JtXHJcbiAgICAgICAgICAvLyBTY2VuYXJpbyAyOiBGcm9tIEZvcm0gTmV3KGFjdGlvbjogbmV3KSA9PT4gQ2xlYXIgZm9ybVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gMzogRnJvbSBGb3JtIE5ldyhhY3Rpb246IG5ldyksIGlzQ2xvbmVOZXcgPT0+IERPTlQgQ2xlYXIgZm9ybVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gNDogRnJvbSBGb3JtIE5ldyhhY3Rpb246IG5ldyksIGlzQ2xvbmVOZXcsIFNhdmUsIENsaWNrIE5ldyA9PT4gQ2xlYXIgZm9ybSAoV2hlbiBDcmVhdGVNb2RlbCwgbmVlZCBjaGFuZ2UgaXNDbG9uZU5ldyA9IGZhbHNlKVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gNTogRnJvbSBMaXN0IG9wZW4gcmVjb3JkKGFjdGlvbjogZWRpdCksIGlzQ2xvbmVOZXcgPT0+IERPTlQgQ2xlYXIgZm9ybVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gNjogRnJvbSBMaXN0IG9wZW4gcmVjb3JkKGFjdGlvbjogZWRpdCksIGlzQ2xvbmVOZXcsIFNhdmUsIENsaWNrIE5ldyA9PT4gQ2xlYXIgZm9ybSAoV2hlbiBVcGRhdGVNb2RlbCwgbmVlZCBjaGFuZ2UgaXNDbG9uZU5ldyA9IGZhbHNlKVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gNzogRnJvbSBMaXN0IG9wZW4gcmVjb3JkKGFjdGlvbjogZWRpdCksIENsaWNrIE5ldyA9PT4gQ2xlYXIgZm9ybVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gODogRnJvbSBMaXN0IG9wZW4gcmVjb3JkKGFjdGlvbjogZWRpdCksIENsaWNrIE5ldywgU2F2ZSwgaXNDbG9uZU5ldyA9PT4gRE9OVCBDbGVhciBmb3JtXHJcblxyXG4gICAgICAgICAgaWYgKGFjdGlvblNlZ21lbnQgPT09IFwiZWRpdFwiIHx8IGFjdGlvblNlZ21lbnQgPT09IFwibmV3XCIpIHtcclxuICAgICAgICAgICAgaWYgKCFncm91cC5pc0Nsb25lTmV3KSB7XHJcbiAgICAgICAgICAgICAgZ3JvdXAuek1vZGVsID0ge307XHJcbiAgICAgICAgICAgICAgZ3JvdXAuZm9ybS5yZXNldCgpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBSZWxvYWQgdGhlIHdvcmtmbG93IGJ1dHRvbiBpZiB0aGUgVHlwZUNvZGUgaXMgJ0ZVTkNUSU9OJ1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmlzVHlwZUNvZGVGdW5jdGlvbihldmVudCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkV29ya2Zsb3dCdXR0b24oZ3JvdXAsIGV2ZW50LmRhdGEuekJ1dHRvbk5hbWUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoYWN0aW9uU2VnbWVudCA9PT0gXCJlZGl0XCIpIHtcclxuICAgICAgICAgICAgICAvLyBjbGVhciBjbG9uZU5ld01vZGVsIGNhY2hlKGlmIGhhdmUpXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuY2FjaGVTZXJ2aWNlLmdldENhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmNsZWFyQ2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIC8vdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKFtyZWZlcmVuY2VJZCwgJ25ldyddKTtcclxuICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxhc3RSb3V0ZVBhcmFtKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRSb3V0ZVBhcmFtKFtyZWZlcmVuY2VJZCwgJ25ldyddKTtcclxuXHJcbiAgICAgICAgICAgICAgZ3JvdXAuek1vZGVsW2dyb3VwLnBhcmVudFJlZmVyZW5jZUZpZWxkXSA9IHJlZmVyZW5jZUlkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGdyb3VwLmlzRWRpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBncm91cC5pc05ldyA9IHRydWU7XHJcbiAgICAgICAgICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLnNldE5hdmlnYXRpb25QYXJhbXMoW3JlZmVyZW5jZUlkLCAnbmV3J10pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2dyb3VwLmVkaXRNb2RlbFVSTF0sIHtcclxuICAgICAgICAgICAgICByZWxhdGl2ZVRvOiBncm91cC5jdHJsU2NvcGUuYWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChncm91cC5pc0Nsb25lTmV3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJDbG9uZU5ld01vZGVsKGdyb3VwLCBncm91cC56TW9kZWwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJOZXdNb2RlbChncm91cCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjcmVhdGVNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICBjb25zdCBmZzogRm9ybUdyb3VwID0gZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBjb25zdCByZXNNZXNzYWdlID0gZ3JvdXAuU3VjY2Vzc0NyZWF0ZWRNZXNzYWdlIHx8IFwiUmVjb3JkIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LlwiO1xyXG4gICAgbGV0IGNyZWF0ZU1vZGVscmVzID0gbnVsbDtcclxuXHJcbiAgICBpZiAoIWZnLmRpcnR5KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIkZvcm0gaXMgbm90IGRpcnR5IGhlbmNlIHJlY29yZCBpcyBub3Qgc2F2ZS5cIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZnLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50RXJyb3JIYW5kbGVyLnNob3dGb3JtR3JvdXBFcnJvck1lc3NhZ2UoZ3JvdXAsIGZnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIG9mKGdyb3VwLnpNb2RlbCkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSBjcmVhdGUsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5iZWZvcmVDcmVhdGVNb2RlbChncm91cCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5ncm91cC5za2lwQ3JlYXRlVXNpbmdGb3JtVmFsdWUpIHtcclxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCBmZy52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICBjb25zdCBuZXdNb2RlbCA9IE9iamVjdC5hc3NpZ24oe30sIGdyb3VwLnpNb2RlbCk7XHJcbiAgICAgICAgWkNvbXBvbmVudEhlbHBlci5yZW1vdmVOdWxsRmllbGRzKG5ld01vZGVsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwUG9zdCQoZ3JvdXAucmVzb3VyY2VVUkwsIG5ld01vZGVsKS5waXBlKFxyXG4gICAgICAgICAgdGFwKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgIGNyZWF0ZU1vZGVscmVzID0gcmVzcDtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHRhcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVN1Y2Nlc3MocmVzLCByZXNNZXNzYWdlKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSksXHJcbiAgICAgIHN3aXRjaE1hcCgoem1vZGVsOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkFmdGVyIGNyZWF0ZWQsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICB0aGlzLnBhdGNoVXBkYXRlZHpNb2RlbChmZywgem1vZGVsLCBncm91cCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWZ0ZXJDcmVhdGVNb2RlbChncm91cCwgem1vZGVsKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgocmVzcCkgPT4ge1xyXG4gICAgICAgIGlmIChjcmVhdGVNb2RlbHJlcy5Qcm9jZXNzaW5nU3RhdHVzID09IG51bGwgfHwgY3JlYXRlTW9kZWxyZXMuUHJvY2Vzc2luZ1N0YXR1cyA9PSB0cnVlKSB7XHJcbiAgICAgICAgICBpZiAocmVzcCAmJiBncm91cC56TW9kZWwuSWQgIT09IDApIHtcclxuICAgICAgICAgICAgZ3JvdXAuaXNOZXcgPSBmYWxzZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNFZGl0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNDbG9uZU5ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBncm91cC5jYW5jZWxCdXR0b25OYW1lID0gXCJDbG9zZVwiO1xyXG4gICAgICAgICAgICAvLyBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgcmVzcCk7XHJcbiAgICAgICAgICAgIC8vIGZnLnBhdGNoVmFsdWUocmVzcCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBmZy5tYXJrQXNQcmlzdGluZSgpO1xyXG5cclxuICAgICAgICAgIGlmICgoZ3JvdXAuaXNDbG9zZUFmdGVyU3VjY2VzcyB8fCBncm91cC5pc0Nsb3NlQWZ0ZXJDcmVhdGVkKSAmJiAhZ3JvdXAuaXNDbG9uZU5ldykge1xyXG4gICAgICAgICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uKG51bGwsIGdyb3VwLCB0aGlzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBmZy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRvbmUgdXBkYXRlTW9kZWwgdXBkYXRlZCB6TW9kZWw6XCIsIGZnLnZhbHVlKTtcclxuICAgICAgICAvLyB0aGlzLnRvYXN0U2VydmljZS5zaG93KFwiUmVjb3JkIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LlwiKTtcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgdGhpcy51cGRhdGVNb2RlbE9ic2VydmFibGUoZXZlbnQsIGdyb3VwKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVNb2RlbE9ic2VydmFibGUoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgZm9ybTogRm9ybUdyb3VwID0gbnVsbCwgdXBkYXRlQVBJT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxhbnk+ID0gbnVsbCwgaXNTa2lwRGlydHkgPSBmYWxzZSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBmZyA9IGZvcm0gfHwgZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBjb25zdCByZXNNZXNzYWdlID0gZ3JvdXAuU3VjY2Vzc1VwZGF0ZWRNZXNzYWdlIHx8IFwiUmVjb3JkIGlzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiO1xyXG4gICAgbGV0IHVwZGF0ZU1vZGVscmVzID0gbnVsbDtcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNGb3JtRGlydHlBbmRWYWxpZChmZywgZ3JvdXAsIGlzU2tpcERpcnR5LCBldmVudCkpIHtcclxuICAgICAgaWYgKGlzU2tpcERpcnR5KSB7XHJcbiAgICAgICAgZmcubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlQVBJT2JzZXJ2YWJsZSA9IHVwZGF0ZUFQSU9ic2VydmFibGUgfHwgdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQdXQkKGdyb3VwLnJlc291cmNlVVJMICsgXCIvXCIgKyBncm91cC56TW9kZWwuSWQsIGdyb3VwLnpNb2RlbCwgZmFsc2UsIGV2ZW50KS5waXBlKFxyXG4gICAgICB0YXAoKHJlcykgPT4ge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlU3VjY2VzcyhyZXMsIHJlc01lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICAgICAgLy90aGlzLmhhbmRsZVN1Y2Nlc3MocmVzLCBcIlJlY29yZCBpcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5cIilcclxuICAgICAgKSk7XHJcblxyXG4gICAgcmV0dXJuIG9mKGdyb3VwLnpNb2RlbCkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSB1cGRhdGUsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5iZWZvcmVVcGRhdGVNb2RlbChncm91cCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIGlmICghZ3JvdXAuc2tpcFVwZGF0ZVVzaW5nRm9ybVZhbHVlKSB7XHJcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgZmcudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUFQSU9ic2VydmFibGU7XHJcbiAgICAgIH0pLFxyXG4gICAgICBzd2l0Y2hNYXAoKHJlc3A6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQWZ0ZXIgdXBkYXRlZCwgcmVzcG9uc2U6XCIsIHJlc3ApO1xyXG4gICAgICAgIHVwZGF0ZU1vZGVscmVzID0gcmVzcDtcclxuICAgICAgICBncm91cC5pc0Nsb25lTmV3ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5wYXRjaFVwZGF0ZWR6TW9kZWwoZmcsIHJlc3AsIGdyb3VwKTtcclxuICAgICAgICBmZy5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFmdGVyVXBkYXRlTW9kZWwoZ3JvdXAsIHJlc3ApO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKChyZXNwKSA9PiB7XHJcbiAgICAgICAgaWYgKHVwZGF0ZU1vZGVscmVzICYmIHVwZGF0ZU1vZGVscmVzLlByb2Nlc3NpbmdTdGF0dXMpIHtcclxuICAgICAgICAgIGlmIChncm91cC5pc0Nsb3NlQWZ0ZXJTdWNjZXNzIHx8IGdyb3VwLmlzQ2xvc2VBZnRlclVwZGF0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvbihudWxsLCBncm91cCwgdGhpcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsb25lcyBhIG5ldyBtb2RlbCBmb3IgYSBaR3JvdXAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIFpDb21wb25lbnRPdXRwdXRFdmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7WkNvbXBvbmVudE91dHB1dEV2ZW50fSBldmVudCAtIFRoZSBaQ29tcG9uZW50T3V0cHV0RXZlbnQgdHJpZ2dlcmluZyB0aGUgY2xvbmUuXHJcbiAgICogQHBhcmFtIHtaR3JvdXB9IGdyb3VwIC0gVGhlIFpHcm91cCB0byBjbG9uZSB0aGUgbmV3IG1vZGVsIGZvci5cclxuICAgKi9cclxuICBwcml2YXRlIGNsb25lTmV3TW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgLy8gU2V0IGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBtb2RlbCBpcyBiZWluZyBjbG9uZWRcclxuICAgIGdyb3VwLmlzQ2xvbmVOZXcgPSB0cnVlO1xyXG5cclxuICAgIC8vIEV4dHJhY3QgdGhlIGZ1bmN0aW9uIHZhbHVlIGZyb20gdGhlIHRhcmdldCBvZiB0aGUgZXZlbnRcclxuICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBldmVudDtcclxuICAgIGNvbnN0IGZ1bmN0aW9uVmFsdWUgPSB0YXJnZXQ/Lm1hdGNoKC9cXCgoW14pXSspXFwpLyk/LlsxXTtcclxuXHJcbiAgICAvLyBJZiB0aGUgZnVuY3Rpb24gdmFsdWUgaXMgJ3RydWUnLCByZXNldCB0aGUgZm9ybSBhbmQgbW9kZWxcclxuICAgIGlmIChmdW5jdGlvblZhbHVlID09PSAndHJ1ZScpIHtcclxuICAgICAgZ3JvdXAuek1vZGVsID0ge307XHJcbiAgICAgIGdyb3VwLmZvcm0ucmVzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEZWZpbmUgdGhlIHZhbHVlcyBmb3IgdGhlIFdGUyBtb2RlbFxyXG4gICAgY29uc3QgbmV3TW9kZWxWYWx1ZXMgPSB7XHJcbiAgICAgIElkOiAwLFxyXG4gICAgICBXRlNfRG9jdW1lbnRJZDogbnVsbCxcclxuICAgICAgV0ZTX1N0YXR1c0NvZGU6IG51bGwsXHJcbiAgICAgIFdGU19TdGF0dXNJZDogbnVsbCxcclxuICAgICAgV0ZTX1N0YXR1c05hbWU6IG51bGwsXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEFzc2lnbiB0aGUgV0ZTIG1vZGVsIHZhbHVlcyB0byB0aGUgZm9ybSB2YWx1ZSBhbmQgWk1vZGVsXHJcbiAgICBPYmplY3QuYXNzaWduKGdyb3VwLmZvcm0udmFsdWUsIG5ld01vZGVsVmFsdWVzKTtcclxuICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCBncm91cC5mb3JtLnZhbHVlKTtcclxuXHJcbiAgICAvLyBQYXRjaCB0aGUgZm9ybSB3aXRoIHRoZSBaTW9kZWwsIG1hcmsgaXQgYXMgZGlydHksIGFuZCBjYWNoZSB0aGUgWk1vZGVsXHJcbiAgICBjb25zdCBmZyA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgZmcucGF0Y2hWYWx1ZShncm91cC56TW9kZWwpO1xyXG4gICAgZmcubWFya0FzRGlydHkoKTtcclxuICAgIHRoaXMuY2FjaGVTZXJ2aWNlLnNldENhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSwgZ3JvdXAuek1vZGVsKTtcclxuXHJcbiAgICAvLyBDYWxsIHRoZSBuZXdNb2RlbCBmdW5jdGlvbiBmb3IgdGhlIGdyb3VwXHJcbiAgICB0aGlzLm5ld01vZGVsKG51bGwsIGdyb3VwKTtcclxuXHJcbiAgICAvLyBSZWxvYWQgdGhlIHdvcmtmbG93IGJ1dHRvbiBpZiB0aGUgVHlwZUNvZGUgaXMgJ0ZVTkNUSU9OJ1xyXG4gICAgaWYgKHRoaXMuaXNUeXBlQ29kZUZ1bmN0aW9uKGV2ZW50KSkge1xyXG4gICAgICB0aGlzLnJlbG9hZFdvcmtmbG93QnV0dG9uKGdyb3VwLCBldmVudC5kYXRhLnpCdXR0b25OYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDbGVhciB0aGUgdHJpZ2dlciBmbGFnXHJcbiAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZWxldGVNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICBjb25zdCBmZzogRm9ybUdyb3VwID0gZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBjb25zdCByZXNNZXNzYWdlID0gZ3JvdXAuU3VjY2Vzc0RlbGV0ZWRNZXNzYWdlIHx8IFwiUmVjb3JkIGlzIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LlwiXHJcblxyXG4gICAgb2YoZ3JvdXAuek1vZGVsKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJCZWZvcmUgZGVsZXRlLCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5iZWZvcmVEZWxldGVNb2RlbChncm91cCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5hbGVydFNlcnZpY2Uuc2hvdyhcIkRlbGV0ZSBSZWNvcmRcIiwgXCJBcmUgeW91IHN1cmU/XCIsXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICB7IHRleHQ6IFwiTm9cIiwgY3NzQ2xhc3M6IFwic2Vjb25kYXJ5XCIgfSBhcyBBbGVydEJ1dHRvbixcclxuICAgICAgICAgICAgICB7IHRleHQ6IFwiWWVzXCIsIGNzc0NsYXNzOiBcInByaW1hcnlcIiB9IGFzIEFsZXJ0QnV0dG9uXHJcbiAgICAgICAgICAgIF0pO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgocmVwbHk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcGx5ID09PSBcIlllc1wiKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCBmZy52YWx1ZSk7XHJcbiAgICAgICAgICAgIGdyb3VwLnpNb2RlbC5EaXNhYmxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBsZXQgdGVtcFJlc3BvbnNlID0ge307XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2VcclxuICAgICAgICAgICAgICAuaHR0cFB1dCQoZ3JvdXAucmVzb3VyY2VVUkwgKyBcIi9cIiArIGdyb3VwLnpNb2RlbC5JZCwgZ3JvdXAuek1vZGVsKVxyXG4gICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFwKChyZXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgdGVtcFJlc3BvbnNlID0gT2JqZWN0LmFzc2lnbih7fSwgcmVzKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgcmVzTWVzc2FnZSlcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJBZnRlciBkZWxldGVkLCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyRGVsZXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHRhcCgocmVzcCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAvL3RoaXMuaGlzdG9yeUJhY2soKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRlbXBSZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wUmVzcG9uc2VbJ1Byb2Nlc3NpbmdTdGF0dXMnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZmcucmVzZXQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFja05hdmlnYXRpb24obnVsbCwgZ3JvdXAsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBncm91cC56TW9kZWwuRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBhdGNoVXBkYXRlZHpNb2RlbChmZzogRm9ybUdyb3VwLCByZXNwOiBhbnksIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmIChyZXNwKSB7XHJcbiAgICAgIGlmIChyZXNwLkRhdGEpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgcmVzcC5EYXRhKTtcclxuICAgICAgICBjb25zdCByZXN1bHREYXRhID0gdGhpcy5yZW1vdmVUZXh0RWRpdG9yVmFsdWVGcm9tRm9ybVBhdGNoaW5nKHJlc3AuRGF0YSwgZ3JvdXApO1xyXG4gICAgICAgIGZnLnBhdGNoVmFsdWUocmVzdWx0RGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAocmVzcFtcIklkXCJdKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIHJlc3ApO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdERhdGEgPSB0aGlzLnJlbW92ZVRleHRFZGl0b3JWYWx1ZUZyb21Gb3JtUGF0Y2hpbmcocmVzcCwgZ3JvdXApO1xyXG4gICAgICAgIGZnLnBhdGNoVmFsdWUocmVzdWx0RGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBncm91cC5yZWZlcmVuY2VJZCA9IGdyb3VwLnpNb2RlbC5JZDtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcblxyXG4gICAgZmcubWFya0FzUHJpc3RpbmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlVGV4dEVkaXRvclZhbHVlRnJvbUZvcm1QYXRjaGluZyhkYXRhLCBncm91cDogWkdyb3VwKTogYW55IHtcclxuICAgIGNvbnN0IHJlc3VsdERhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgIGNvbnN0IGFsbEZpZWxkcyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0RmllbGRMaXN0RnJvbUZpZWxkc1dpdGhvdXRIaWVyYXJjaHkoZ3JvdXAuZmllbGRzKTtcclxuXHJcbiAgICBjb25zdCB0ZXh0RWRpdG9ycyA9IGFsbEZpZWxkcy5maWx0ZXIoeCA9PiB4LlR5cGUgPT09ICd6dGV4dGVkaXRvcicpO1xyXG4gICAgaWYgKHRleHRFZGl0b3JzICYmIHRleHRFZGl0b3JzLmxlbmd0aCA+IDApIHtcclxuICAgICAgZm9yIChjb25zdCBjb21wIG9mIHRleHRFZGl0b3JzKSB7XHJcbiAgICAgICAgZGVsZXRlIHJlc3VsdERhdGFbY29tcC5WYWx1ZV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0RGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNUeXBlQ29kZUZ1bmN0aW9uKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQpIHtcclxuICAgIHJldHVybiBldmVudD8uZGF0YT8uVHlwZUNvZGUgPT09ICdGVU5DVElPTic7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbG9hZFdvcmtmbG93QnV0dG9uKGdyb3VwOiBaR3JvdXAsIHpCdXR0b25OYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHdvcmtmbG93QnV0dG9ucyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50KGdyb3VwLCBgendvcmtmbG93YnV0dG9uc18ke3pCdXR0b25OYW1lfWApO1xyXG4gICAgd29ya2Zsb3dCdXR0b25zPy5bJ2xvYWRCdXR0b24nXT8uKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNGb3JtRGlydHlBbmRWYWxpZChmZzogRm9ybUdyb3VwLCBncm91cDogWkdyb3VwLCBpc1NraXBEaXJ0eSA9IGZhbHNlLCBldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWlzU2tpcERpcnR5ICYmICFmZy5kaXJ0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJGb3JtIGlzIG5vdCBkaXJ0eSBoZW5jZSByZWNvcmQgaXMgbm90IHNhdmUuXCIpO1xyXG4gICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQgJiYgZXZlbnQuZGF0YSAmJiBldmVudC5kYXRhW2BGb3JtTm90RGlydHlNZXNzYWdlYF0gPyBldmVudC5kYXRhW2BGb3JtTm90RGlydHlNZXNzYWdlYF0gOiBEZWZhdWx0TWVzc2FnZS5ub3REaXJ0eU1lc3NhZ2U7XHJcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3dPa2F5KERlZmF1bHREaWFsb2dUaXRsZS5ub3RoaW5nVG9VcGRhdGUsIG1lc3NhZ2UsIFtcImNvbC01XCJdKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZmcudmFsaWQpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRFcnJvckhhbmRsZXIuc2hvd0Zvcm1Hcm91cEVycm9yTWVzc2FnZShncm91cCwgZmcpO1xyXG4gICAgICBmZy5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIGZnLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVVcGRhdGVNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZVVwZGF0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZVVwZGF0ZU1vZGVsIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVVcGRhdGVNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJlZm9yZURlbGV0ZU1vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlRGVsZXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlRGVsZXRlTW9kZWwgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZURlbGV0ZU1vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlTmV3TW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVOZXdNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVOZXdvZGVsIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVOZXdNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJlZm9yZUNyZWF0ZU1vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlQ3JlYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlQ3JlYXRlTW9kZWwgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZUNyZWF0ZU1vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIGJlZm9yZVBhZ2VJbml0aWFsaXNlKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlUGFnZUluaXRpYWxpc2UpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlUGFnZUluaXRpYWxpc2UgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZVBhZ2VJbml0aWFsaXNlKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3MoZ3JvdXA6IFpHcm91cCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLnpNb2RlbC5JZCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJ6TW9kZWwuSWQgaXMgbm90IGRlZmluZWRcIiwgZ3JvdXAuek1vZGVsKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3MpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3MgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3MoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgYWZ0ZXJOZXdNb2RlbChncm91cDogWkdyb3VwKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJOZXdNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlck5ld01vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyTmV3TW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckNyZWF0ZU1vZGVsKGdyb3VwOiBaR3JvdXAsIHptb2RlbDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJDcmVhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckNyZWF0ZU1vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyQ3JlYXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyVXBkYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCwgem1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlclVwZGF0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyVXBkYXRlTW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJVcGRhdGVNb2RlbChncm91cCwgem1vZGVsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJEZWxldGVNb2RlbChncm91cDogWkdyb3VwLCB6bW9kZWw6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyRGVsZXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJEZWxldGVNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlckRlbGV0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgYWZ0ZXJDbG9uZU5ld01vZGVsKGdyb3VwOiBaR3JvdXAsIHptb2RlbDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJDbG9uZU5ld01vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyQ2xvbmVOZXdNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlckNsb25lTmV3TW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgfVxyXG5cclxuICBhZnRlclBhZ2VJbml0aWFsaXNlKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJQYWdlSW5pdGlhbGlzZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlclBhZ2VJbml0aWFsaXNlIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlclBhZ2VJbml0aWFsaXNlKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIC8vIHByaXZhdGUgb25BY3Rpb24oZ3JvdXA6IFpHcm91cCkge1xyXG4gIC8vICAgdGhpcy5hY3Rpb25TaGVldEN0cmxcclxuICAvLyAgICAgLmNyZWF0ZSh7XHJcbiAgLy8gICAgICAgaGVhZGVyOiBcIkNob29zZSBhbiBBY3Rpb25cIixcclxuICAvLyAgICAgICBidXR0b25zOiBncm91cC50b3BSaWdodEFjdGlvbkJ1dHRvblxyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgICAudGhlbihhY3Rpb25TaGVldEVsID0+IHtcclxuICAvLyAgICAgICBhY3Rpb25TaGVldEVsLnByZXNlbnQoKTtcclxuICAvLyAgICAgfSk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXRNb2RlbFZhbHVlKHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBncm91cDogWkdyb3VwKSB7XHJcbiAgLy8gICBncm91cC56TW9kZWxbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xyXG4gIC8vICAgaWYgKGdyb3VwLmlzTG9hZGluZykge1xyXG4gIC8vICAgICByZXR1cm47XHJcbiAgLy8gICB9XHJcbiAgLy8gICBjb25zdCBmZyA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gIC8vICAgaWYgKCFmZykge1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAsIG5vLWRlYnVnZ2VyXHJcbiAgLy8gICAgIGRlYnVnZ2VyO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgY29uc3QgZmMgPSBmZy5jb250cm9sc1twcm9wZXJ0eU5hbWVdO1xyXG4gIC8vICAgaWYgKCFmYykge1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlclxyXG4gIC8vICAgICBkZWJ1Z2dlcjtcclxuICAvLyAgIH1cclxuICAvLyAgIGZjLnNldFZhbHVlKHZhbHVlKTtcclxuICAvLyAgIGZjLm1hcmtBc0RpcnR5KCk7XHJcbiAgLy8gfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2hvd3pNb2RhbChcclxuICAgIGNvbEZpZWxkcyQ6IHN0cmluZyB8IE9ic2VydmFibGU8QXJyYXk8WkZpZWxkPj4sXHJcbiAgICBwYXJlbnRHcm91cDogWkdyb3VwLFxyXG4gICAgZm9ybUhlYWRlcjogc3RyaW5nLFxyXG4gICAgek1vZGVsPzogYW55LFxyXG4gICAgcmVmZXJJZD86IHN0cmluZyxcclxuICAgIGNvbXBvbmVudFNpemU/OiBaQ29tcG9uZW50U2l6ZSxcclxuICAgIHNraXBJc0RpcnR5Q2hlY2s/OiBib29sZWFuLFxyXG4gICAgdmFsaWRhdGVJc1JlcXVpcmVkPzogYm9vbGVhblxyXG4gICkge1xyXG4gICAgY29uc3QgbW9kYWxjb21wb25lbnQgPSBabW9kYWxDb21wb25lbnQ7XHJcbiAgICBjb25zdCBtb2RhbG1vYmlsZWNvbXBvbmVudCA9IFptb2RhbE1vYmlsZUNvbXBvbmVudDtcclxuXHJcbiAgICBpZiAocGFyZW50R3JvdXApIHtcclxuICAgICAgLy8gZGlzYWJsZSBpc1RyaWdnZXJlZCBiZWZvcmUgZGlzcGxheSB0aGUgcG9wdXAuXHJcbiAgICAgIHBhcmVudEdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyhjb2xGaWVsZHMkLCBwYXJlbnRHcm91cCwgZm9ybUhlYWRlciwgbW9kYWxjb21wb25lbnQsIG1vZGFsbW9iaWxlY29tcG9uZW50LCB6TW9kZWwsIHJlZmVySWQsIGNvbXBvbmVudFNpemUsIHNraXBJc0RpcnR5Q2hlY2ssIHZhbGlkYXRlSXNSZXF1aXJlZCk7XHJcbiAgICAvL2NvbnN0IG1vZGFsID0gYXdhaXQgdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdygpO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBjb29raWVTdG9yZVBvc3QobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIC8vIGZvciBQb3N0IHRvIENvb2tpZVN0b3JlXHJcbiAgICBjb25zdCBjb29raWVTdG9yZVVSTCA9IHRoaXMub2F1dGhFbnZpcm9ubWVudFVybCArIFwiYXBpL0Nvb2tpZVN0b3Jlc1wiO1xyXG4gICAgY29uc3QgY29va2llU3RvcmVWYWx1ZSA9IHtcclxuICAgICAgJ05hbWUnOiBuYW1lLFxyXG4gICAgICAnVmFsdWUnOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwUG9zdCQoY29va2llU3RvcmVVUkwsIGNvb2tpZVN0b3JlVmFsdWUpLnBpcGUobWFwKHJlcyA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImdyaWQgY29uZmlnIHNhdmVkKFwiICsgcmVzLnN0YXR1cyArIFwiKTogXCIsIHJlcyk7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvb2tpZVN0b3JlR2V0KG5hbWU6IHN0cmluZywgYWNjZXNzVG9rZW46IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBjb29raWVTdG9yZVVSTCA9IHRoaXMub2F1dGhFbnZpcm9ubWVudFVybCArIFwiYXBpL0Nvb2tpZVN0b3Jlcy8/bmFtZT1cIiArIG5hbWU7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwR2V0JChjb29raWVTdG9yZVVSTCwgeyBoZWFkZXJzOiBhY2Nlc3NUb2tlbiB9KS5waXBlKG1hcChyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvb2tpZVN0b3JlRGVsZXRlTXVsdGlwbGUobmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIC8vIGZvciBQb3N0IHRvIENvb2tpZVN0b3JlXHJcbiAgICBjb25zdCBjb29raWVTdG9yZVVSTCA9IHRoaXMub2F1dGhFbnZpcm9ubWVudFVybCArIFwiQWRtaW4vRGVsZXRlTXVsdGlwbGVDb29raWVzXCI7XHJcbiAgICBjb25zdCBjb29raWVTdG9yZVZhbHVlID0ge1xyXG4gICAgICAnY29udGFpbk5hbWUnOiBuYW1lXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFBvc3QkKGNvb2tpZVN0b3JlVVJMLCBjb29raWVTdG9yZVZhbHVlKS5waXBlKG1hcChyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNjcm9sbFRvRWxlbWVudEJ5SWQoaWQ6IHN0cmluZywgYmVoYXZpb3I6ICdzbW9vdGgnIHwgJ2F1dG8nID0gJ3Ntb290aCcpIHtcclxuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xyXG4gICAgZWwuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvciB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0cmFuc2xhdGlvblBhZ2VFbGVtZW50KGdyb3VwOiBaR3JvdXApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3Qgb2JzTGlzdCA9IG5ldyBBcnJheTxPYnNlcnZhYmxlPGFueT4+KCk7XHJcbiAgICBpZiAoZ3JvdXAuZm9ybUhlYWRlcikge1xyXG4gICAgICBvYnNMaXN0LnB1c2godGhpcy50cmFuc2xhdGlvblNlcnZpY2UuJHRyYW5zbGF0ZVNpbmdsZUl0ZW0oZ3JvdXAsIFwiZm9ybUhlYWRlclwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGdyb3VwLm5hdkl0ZW1zICYmIGdyb3VwLm5hdkl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgb2JzTGlzdC5wdXNoKHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLiR0cmFuc2xhdGVJdGVtTGlzdChncm91cC5uYXZJdGVtcywgXCJ0ZXh0XCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob2JzTGlzdC5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9ya0pvaW4ob2JzTGlzdCk7XHJcbiAgfVxyXG5cclxuICAvLyAjcmVnaW9uIERFQ1xyXG4gIHB1YmxpYyBhc3luYyBsb2FkQ29udGFpbmVyVmlldyhlbGVtZW50Q29udGFpbmVyOiBhbnksIGNvbnRhaW5lclBhZ2U6IGFueSwgZGF0YTogWkZpZWxkLCBncm91cD86IFpHcm91cCkge1xyXG4gICAgaWYgKCFlbGVtZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRWxlbWVudENvbnRhaW5lciBpcyBudWxsLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29udGFpbmVyUGFnZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkNvbnRhaW5lclBhZ2UgaXMgbnVsbC5cIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2aWV3Q29udGFpbmVyUmVmID0gZWxlbWVudENvbnRhaW5lci52aWV3Q29udGFpbmVyUmVmO1xyXG4gICAgdmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xyXG5cclxuICAgIGNvbnN0IGVtYmVkZGVkZ3JvdXAgPSBuZXcgWkdyb3VwKCk7XHJcbiAgICB0aGlzLnNldEdyb3VwRm9yRGVidWdnZXIoZW1iZWRkZWRncm91cCk7XHJcbiAgICBjb25zdCBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxhbnk+ID0gdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29udGFpbmVyUGFnZSk7XHJcblxyXG4gICAgZW1iZWRkZWRncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlOyAvLyBlbmFibGUgYmFjayB0aGUgYnV0dG9uIGZvciB0cmlnZ2VyaW5nLlxyXG5cclxuICAgIC8vIE9iamVjdC5hc3NpZ24oY29tcG9uZW50UmVmLmluc3RhbmNlW1wiZ3JvdXBcIl0sIGdyb3VwKTtcclxuICAgIE9iamVjdC5hc3NpZ24oY29tcG9uZW50UmVmLmluc3RhbmNlW1wiZ3JvdXBcIl0sIGVtYmVkZGVkZ3JvdXApO1xyXG5cclxuICAgIE9iamVjdC5hc3NpZ24oY29tcG9uZW50UmVmLmluc3RhbmNlW1wiZ3JvdXBcIl0sIHsgcGFyZW50R3JvdXA6IGdyb3VwLCBpc0VtYmVkZGVkUGFnZTogdHJ1ZSwgZWxlbWVudENvbnRhaW5lcjogZWxlbWVudENvbnRhaW5lciwgQ29udGFpbmVyRm9ybUF1dG9TY3JvbGw6IGRhdGEuQ29udGFpbmVyRm9ybUF1dG9TY3JvbGwgfSk7XHJcblxyXG4gICAgLy8gdG9kbzogYWRkIGluIHByb3BcclxuICAgIGlmIChkYXRhICYmIGRhdGEuQ29udGFpbmVyRm9ybUF1dG9TY3JvbGwpIHtcclxuICAgICAgdGhpcy5zY3JvbGxUb0VtYmJlZENvbXBvbmVudFBhZ2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb0VtYmJlZENvbXBvbmVudFBhZ2UobWlsbGlTZWNvbmRzOiBudW1iZXIgPSAxNTAwKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBlbmRPZkdyaWREaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVuZC1vZi1ncmlkXCIpO1xyXG4gICAgY29uc3QgZW5kT2ZHcmlkUG9zaXRpb25JbmZvID0gZW5kT2ZHcmlkRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3QgeUNvb3IgPSAoZW5kT2ZHcmlkUG9zaXRpb25JbmZvPy55IHx8IDYzMCkgLSAxMDtcclxuXHJcbiAgICBjb25zdCBtYWluSW9uQ29udGVudDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpb24tY29udGVudC1tYWluLXBhZ2VcIik7XHJcbiAgICByZXR1cm4gbWFpbklvbkNvbnRlbnQuc2Nyb2xsQnlQb2ludCgwLCB5Q29vciwgbWlsbGlTZWNvbmRzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb1RvcE9mUGFnZShtaWxsaVNlY29uZHM6IG51bWJlciA9IDE1MDApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1haW5Jb25Db250ZW50OiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImlvbi1jb250ZW50LW1haW4tcGFnZVwiKTtcclxuICAgIHJldHVybiBtYWluSW9uQ29udGVudC5zY3JvbGxUb1BvaW50KDAsIDAsIG1pbGxpU2Vjb25kcykgYXMgUHJvbWlzZTx2b2lkPjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjbG9zZUNvbnRhaW5lclZpZXcoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKGdyb3VwW2BwYXJlbnRHcm91cGBdICYmIGdyb3VwW2BwYXJlbnRHcm91cGBdW2BlMUNsb3NlR3JpZENvbnRhaW5lcmBdICYmIHR5cGVvZiBncm91cFtgcGFyZW50R3JvdXBgXVtgZTFDbG9zZUdyaWRDb250YWluZXJgXSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgIGdyb3VwW2BwYXJlbnRHcm91cGBdW2BlMUNsb3NlR3JpZENvbnRhaW5lcmBdKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHByaXZhdGUgc2V0R3JvdXBGb3JEZWJ1Z2dlcihncm91cDogWkdyb3VwKSB7XHJcbiAgICBjb25zdCBpc0RlYnVnZ2luZyA9IHRoaXMuemNvcmVTZXJ2aWNlLmlzRGVidWdTZXNzaW9uKCkgfHwgZmFsc2U7XHJcbiAgICBpZiAoaXNEZWJ1Z2dpbmcpIHtcclxuICAgICAgdGhpcy5kZWJ1Z1NlcnZpY2Uub25Jbml0RGVidWdnZXIoZ3JvdXApO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlZnJlc2hHcmlkKGdyb3VwOiBaR3JvdXApIHtcclxuICBjb25zdCB6Z3JpZENvbnRyb2wgPSBncm91cFtcImdyaWRPcHRpb25zXCJdIGFzIFpHcmlkO1xyXG4gIGlmICh6Z3JpZENvbnRyb2wpIHtcclxuICAgIHpncmlkQ29udHJvbC5nZXREYXRhKCk7XHJcbiAgfVxyXG4gIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbn1cclxuIl19