@qbs-origin/origin-form 0.8.0 → 0.8.3

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,9 +1,9 @@
1
- import { Component, EventEmitter, Input, Output, ViewChildren, } from '@angular/core';
1
+ import { Component, EventEmitter, Input, Output, ViewChildren } from '@angular/core';
2
2
  import { FormControl, FormGroup } from '@angular/forms';
3
- import { FormlyField, } from '@ngx-formly/core';
4
- import { Subject, firstValueFrom, startWith, pairwise, debounceTime, switchMap, catchError, of, takeUntil, map, Subscription, } from 'rxjs';
3
+ import { FormlyField } from '@ngx-formly/core';
4
+ import { Subject, firstValueFrom, startWith, pairwise, catchError, of, takeUntil, map, Subscription, from } from 'rxjs';
5
5
  import { LabelKeys } from './enums/label.keys';
6
- import { FluxType, DimensionType, StepControlType, ManualInputControlType, } from './models/forms.model';
6
+ import { FluxType, DimensionType, StepControlType, ManualInputControlType } from './models/forms.model';
7
7
  import { EnvironmentType } from './others/environment-type';
8
8
  import { Utils } from './others/utils';
9
9
  import { ModelPopulationHelper } from './model-population.helper';
@@ -79,33 +79,33 @@ export class CollectorFormComponent {
79
79
  language: 'English',
80
80
  code: 'en',
81
81
  type: 'US',
82
- icon: FLAG_ICONS.en,
82
+ icon: FLAG_ICONS.en
83
83
  },
84
84
  {
85
85
  language: 'Romana',
86
86
  code: 'ro',
87
- icon: FLAG_ICONS.ro,
87
+ icon: FLAG_ICONS.ro
88
88
  },
89
89
  {
90
90
  language: 'Deutsch',
91
91
  code: 'de',
92
- icon: FLAG_ICONS.de,
92
+ icon: FLAG_ICONS.de
93
93
  },
94
94
  {
95
95
  language: 'Français',
96
96
  code: 'fr',
97
- icon: FLAG_ICONS.fr,
97
+ icon: FLAG_ICONS.fr
98
98
  },
99
99
  {
100
100
  language: 'Italiano',
101
101
  code: 'it',
102
- icon: FLAG_ICONS.it,
102
+ icon: FLAG_ICONS.it
103
103
  },
104
104
  {
105
105
  language: 'Español',
106
106
  code: 'es',
107
- icon: FLAG_ICONS.es,
108
- },
107
+ icon: FLAG_ICONS.es
108
+ }
109
109
  ];
110
110
  this._self = this;
111
111
  this.loadingMessage = null;
@@ -186,6 +186,8 @@ export class CollectorFormComponent {
186
186
  }
187
187
  if (this.appModel) {
188
188
  await this.initAsync();
189
+ // Execute any action/status steps that appear before the first visible step
190
+ await this.executeLeadingActionSteps();
189
191
  }
190
192
  }
191
193
  async ngOnChanges(changes) {
@@ -224,6 +226,8 @@ export class CollectorFormComponent {
224
226
  }
225
227
  }
226
228
  await this.initAsync();
229
+ // Execute any action/status steps that appear before the first visible step
230
+ await this.executeLeadingActionSteps();
227
231
  }
228
232
  catch (error) {
229
233
  }
@@ -291,7 +295,8 @@ export class CollectorFormComponent {
291
295
  this.formlyPresentationFields = [];
292
296
  this.model = {};
293
297
  this.form = new FormGroup({});
294
- if (this.fillData) {
298
+ // Populate control IDs with values if fillData or initFlowValues exist
299
+ if (this.fillData || this.initFlowValues) {
295
300
  this.populateControlIdsWithValueDictionary();
296
301
  }
297
302
  // Initialize model with default values if no fillData
@@ -300,7 +305,6 @@ export class CollectorFormComponent {
300
305
  }
301
306
  else {
302
307
  this.populateModelWithFillData(this.fillData);
303
- this.populateControlIdsWithValueDictionary();
304
308
  }
305
309
  this.form.patchValue(this.model);
306
310
  await this.buildFormlyConfigAsync();
@@ -366,33 +370,49 @@ export class CollectorFormComponent {
366
370
  }
367
371
  populateControlIdsWithValueDictionary() {
368
372
  var currentLanguageId = this.getCurrentLanguageId();
369
- const controlIdsWithValues = this.fillData.flux
370
- .flatMap((step) => step.sections.flatMap((section) => section.controls
371
- .filter((control) => control.controlId && control.fillValue)
372
- .map((control) => ({
373
- controlId: control.controlId,
374
- fillValue: control.fillValue,
375
- fillValueId: control.fillValueId,
376
- }))))
377
- .reduce((dictionary, { controlId, fillValue, fillValueId }) => {
378
- if (fillValueId) {
379
- for (const [key, dict] of this.dictionaryMap.entries()) {
380
- const value = dict.values?.find((v) => v.id == fillValueId);
381
- if (value) {
382
- const translation = value.valueTranslations.find((t) => t.languageId == currentLanguageId);
383
- if (translation) {
384
- dictionary[controlId] = translation.value;
385
- break;
373
+ // Build dictionary from fillData.flux if available, otherwise start empty
374
+ const controlIdsWithValues = this.fillData?.flux
375
+ ? this.fillData.flux
376
+ .flatMap((step) => step.sections.flatMap((section) => section.controls
377
+ .filter((control) => control.controlId && control.fillValue)
378
+ .map((control) => ({
379
+ controlId: control.controlId,
380
+ fillValue: control.fillValue,
381
+ fillValueId: control.fillValueId
382
+ }))))
383
+ .reduce((dictionary, { controlId, fillValue, fillValueId }) => {
384
+ if (fillValueId) {
385
+ for (const [key, dict] of this.dictionaryMap.entries()) {
386
+ const value = dict.values?.find((v) => v.id == fillValueId);
387
+ if (value) {
388
+ const translation = value.valueTranslations.find((t) => t.languageId == currentLanguageId);
389
+ if (translation) {
390
+ dictionary[controlId] = translation.value;
391
+ break;
392
+ }
386
393
  }
387
394
  }
388
395
  }
396
+ else {
397
+ dictionary[controlId] = fillValue;
398
+ }
399
+ return dictionary;
400
+ }, {})
401
+ : {};
402
+ // Get initFlowValues from fillData or from direct input (this.initFlowValues)
403
+ let initFlowValues = this.fillData?.initFlowValues;
404
+ // If not in fillData, try to parse from direct initFlowValues input
405
+ if (!initFlowValues && this.initFlowValues) {
406
+ try {
407
+ initFlowValues =
408
+ typeof this.initFlowValues === 'string'
409
+ ? JSON.parse(this.initFlowValues)
410
+ : this.initFlowValues;
389
411
  }
390
- else {
391
- dictionary[controlId] = fillValue;
412
+ catch (e) {
413
+ console.warn('Failed to parse initFlowValues:', e);
392
414
  }
393
- return dictionary;
394
- }, {});
395
- const initFlowValues = this.fillData?.initFlowValues;
415
+ }
396
416
  const addInitFlowValues = (node, pathParts) => {
397
417
  if (node === null || node === undefined) {
398
418
  if (pathParts.length > 0) {
@@ -416,6 +436,51 @@ export class CollectorFormComponent {
416
436
  if (initFlowValues !== null && initFlowValues !== undefined) {
417
437
  addInitFlowValues(initFlowValues, []);
418
438
  }
439
+ // Add inherited fields from parent app
440
+ const inheritedFields = this.fillData?.inheritedFields;
441
+ if (inheritedFields && typeof inheritedFields === 'object') {
442
+ for (const [key, value] of Object.entries(inheritedFields)) {
443
+ let resolvedValue;
444
+ if (typeof value === 'object' &&
445
+ value !== null &&
446
+ !Array.isArray(value) &&
447
+ value.dictionaryUUID) {
448
+ // Enriched format: handle multi-select and single-select
449
+ const enriched = value;
450
+ const fillValueIds = enriched.fillValueIds;
451
+ if (Array.isArray(fillValueIds) && fillValueIds.length > 0) {
452
+ // Multi-select: look up each ID in dictionaryMap for translated display
453
+ const currentLanguageId = this.getCurrentLanguageId();
454
+ const displayValues = [];
455
+ for (const valueId of fillValueIds) {
456
+ const numericId = typeof valueId === 'string' ? parseInt(valueId, 10) : valueId;
457
+ for (const [, dict] of this.dictionaryMap.entries()) {
458
+ const dv = dict.values?.find((v) => v.id === numericId);
459
+ if (dv) {
460
+ const translation = dv.valueTranslations?.find((t) => t.languageId == currentLanguageId);
461
+ displayValues.push(translation?.value || dv.name);
462
+ break;
463
+ }
464
+ }
465
+ }
466
+ resolvedValue = displayValues.length > 0
467
+ ? displayValues.join(', ')
468
+ : (enriched.fillValue ?? String(value));
469
+ }
470
+ else {
471
+ // Single-select
472
+ resolvedValue = enriched.fillValue ?? String(value);
473
+ }
474
+ }
475
+ else {
476
+ resolvedValue = value;
477
+ }
478
+ controlIdsWithValues[`inherited_${key}`] = resolvedValue;
479
+ if (controlIdsWithValues[key] === undefined) {
480
+ controlIdsWithValues[key] = resolvedValue;
481
+ }
482
+ }
483
+ }
419
484
  this.controlIdsWithValues = controlIdsWithValues;
420
485
  }
421
486
  getCurrentLanguageId() {
@@ -434,7 +499,7 @@ export class CollectorFormComponent {
434
499
  showProgressBar: this.generalData.showProgressBar &&
435
500
  this.generalData.showAllSteps == false
436
501
  ? true
437
- : false,
502
+ : false
438
503
  };
439
504
  this.formlyAllSteps = await this.buildFormlyFieldGroupAsync();
440
505
  var hasDictionaryDependentSteps = this.formlyAllSteps.some((f) => f.props?.['dependentDictionary']?.isDictionaryDependent);
@@ -461,7 +526,7 @@ export class CollectorFormComponent {
461
526
  display: this.display,
462
527
  designConfig: {
463
528
  buttonsVerticalPosition: this.appModel.design.buttonsVerticalPosition,
464
- buttonsHorizontalPosition: this.appModel.design.buttonsHorizontalPosition,
529
+ buttonsHorizontalPosition: this.appModel.design.buttonsHorizontalPosition
465
530
  },
466
531
  stepsSettings: this.stepsSettings,
467
532
  metaData: this.fillData?.metadata,
@@ -474,10 +539,10 @@ export class CollectorFormComponent {
474
539
  hasActionSteps: this.flux.some((step) => this.actionStepHandler.isActionStep(step)), // Indicate if there are action steps
475
540
  completionEvent: () => this.onCompletion(),
476
541
  onSelectedPageChanging: (index) => this.onSelectedPageChanging(index),
477
- onSelectedPageChanged: (index) => this.onSelectedPageChanged(index),
542
+ onSelectedPageChanged: (index) => this.onSelectedPageChanged(index)
478
543
  },
479
- fieldGroup: formlyFilteredSteps,
480
- },
544
+ fieldGroup: formlyFilteredSteps
545
+ }
481
546
  ];
482
547
  // For display mode, populate values immediately after config is built
483
548
  if (this.showDisplayMode && this.formlyConfig[0]?.fieldGroup) {
@@ -502,7 +567,8 @@ export class CollectorFormComponent {
502
567
  let actionsExecuted = false;
503
568
  if (toIndex > fromIndex) {
504
569
  console.log('➡️ Moving forward - executing action steps after current step');
505
- actionsExecuted = await this.executeActionStepsAfterCurrentStep(fromIndex);
570
+ actionsExecuted =
571
+ await this.executeActionStepsAfterCurrentStep(fromIndex);
506
572
  }
507
573
  else if (toIndex < fromIndex) {
508
574
  console.log('⬅️ Moving backward - no action execution needed');
@@ -571,6 +637,35 @@ export class CollectorFormComponent {
571
637
  return false;
572
638
  }
573
639
  }
640
+ async executeLeadingActionSteps() {
641
+ if (!this.appDataUuid || !this.flux || this.flux.length === 0) {
642
+ return;
643
+ }
644
+ const leadingActionSteps = this.actionStepHandler.getActionStepsBeforeFirstVisibleStep(this.flux);
645
+ if (leadingActionSteps.length === 0) {
646
+ return;
647
+ }
648
+ console.log(`🎬 Executing ${leadingActionSteps.length} leading action steps before first visible step`);
649
+ this.isLoading = true;
650
+ try {
651
+ const result = await this.actionStepHandler.executeActionSteps(leadingActionSteps, this.appDataUuid, (step) => {
652
+ const loadingMessage = Utils.findTranslationInfo('loadingMessageTranslations', step.translations, this.currentLanguageIso);
653
+ this.loadingMessage = loadingMessage || null;
654
+ });
655
+ if (result.success) {
656
+ console.log('✅ Leading action steps executed successfully');
657
+ }
658
+ else {
659
+ console.error('❌ Leading action steps failed:', result.error);
660
+ }
661
+ }
662
+ catch (error) {
663
+ console.error('❌ Error executing leading action steps:', error);
664
+ }
665
+ finally {
666
+ this.loadingMessage = null;
667
+ }
668
+ }
574
669
  onSelectedPageChanged(index) {
575
670
  if (this.formlyConfig[0].fieldGroup) {
576
671
  var selectedPage = this.formlyConfig[0].fieldGroup[index];
@@ -595,11 +690,15 @@ export class CollectorFormComponent {
595
690
  // Multiple selection - show values with comma
596
691
  const valueIdsArray = found.fillValueIds || found.fillvalueids || found.FillValueIds;
597
692
  const valuesArray = found.fillValues || found.fillvalues || found.FillValues;
598
- if (valueIdsArray && Array.isArray(valueIdsArray) && valueIdsArray.length > 0) {
693
+ if (valueIdsArray &&
694
+ Array.isArray(valueIdsArray) &&
695
+ valueIdsArray.length > 0) {
599
696
  const currentLanguageId = this.getCurrentLanguageId();
600
697
  const displayValues = [];
601
698
  for (const valueId of valueIdsArray) {
602
- const numericValueId = typeof valueId === 'string' ? parseInt(valueId, 10) : valueId;
699
+ const numericValueId = typeof valueId === 'string'
700
+ ? parseInt(valueId, 10)
701
+ : valueId;
603
702
  for (const [key, dict] of this.dictionaryMap.entries()) {
604
703
  const value = dict.values?.find((v) => v.id === numericValueId);
605
704
  if (value) {
@@ -613,7 +712,9 @@ export class CollectorFormComponent {
613
712
  fg.defaultValue = displayValues.join(', ');
614
713
  }
615
714
  }
616
- else if (valuesArray && Array.isArray(valuesArray) && valuesArray.length > 0) {
715
+ else if (valuesArray &&
716
+ Array.isArray(valuesArray) &&
717
+ valuesArray.length > 0) {
617
718
  // Fallback: use fillValues array directly
618
719
  fg.defaultValue = valuesArray.join(', ');
619
720
  }
@@ -635,8 +736,20 @@ export class CollectorFormComponent {
635
736
  }
636
737
  }
637
738
  else {
638
- const val = this.findInApiCallsResponses(associatedControlId);
639
- fg.defaultValue = val;
739
+ // Check controlIdsWithValues for initFlowValues
740
+ let initFlowValue = this.controlIdsWithValues?.[associatedControlId];
741
+ if (initFlowValue !== undefined) {
742
+ if (typeof initFlowValue === 'object' &&
743
+ initFlowValue !== null &&
744
+ initFlowValue.fillValue !== undefined) {
745
+ initFlowValue = initFlowValue.fillValue;
746
+ }
747
+ fg.defaultValue = initFlowValue;
748
+ }
749
+ else {
750
+ const val = this.findInApiCallsResponses(associatedControlId);
751
+ fg.defaultValue = val;
752
+ }
640
753
  }
641
754
  }
642
755
  }
@@ -733,9 +846,9 @@ export class CollectorFormComponent {
733
846
  description: step.name,
734
847
  buttons: this.constructButtons(step.buttons),
735
848
  dependentDictionary: step.dependentDictionary,
736
- stepId: step.identifier,
849
+ stepId: step.identifier
737
850
  },
738
- fieldGroup: await this.buildSectionsFieldGroupAsync(step, step.sections),
851
+ fieldGroup: await this.buildSectionsFieldGroupAsync(step, step.sections)
739
852
  };
740
853
  if (step.translations) {
741
854
  stepFormlyConfig.props['label'] = Utils.findTranslationInfo('name', step.translations, this.currentLanguageIso);
@@ -776,9 +889,9 @@ export class CollectorFormComponent {
776
889
  props: {
777
890
  label: step.name,
778
891
  buttons: this.constructButtons(step.buttons),
779
- fluxType: step.type,
892
+ fluxType: step.type
780
893
  },
781
- fieldGroup: [],
894
+ fieldGroup: []
782
895
  };
783
896
  this.setStepBaseProps(step, formlyConfig);
784
897
  var fieldConfig = this.createFormlySystemFieldConfig(step);
@@ -823,8 +936,8 @@ export class CollectorFormComponent {
823
936
  if (event === 'success') {
824
937
  await this.stepperGoNextAsync();
825
938
  }
826
- },
827
- },
939
+ }
940
+ }
828
941
  };
829
942
  }
830
943
  CreateDownloadDocsFieldConfig(controlData) {
@@ -836,8 +949,8 @@ export class CollectorFormComponent {
836
949
  controlData: controlData,
837
950
  env: this.env,
838
951
  documentsData: this.appModel.documents,
839
- langIso: this.currentLanguageIso,
840
- },
952
+ langIso: this.currentLanguageIso
953
+ }
841
954
  };
842
955
  }
843
956
  CreateViewDocsFieldConfig(controlData) {
@@ -849,8 +962,8 @@ export class CollectorFormComponent {
849
962
  controlData: controlData,
850
963
  env: this.env,
851
964
  documentsData: this.appModel.documents,
852
- langIso: this.currentLanguageIso,
853
- },
965
+ langIso: this.currentLanguageIso
966
+ }
854
967
  };
855
968
  }
856
969
  CreateUploadDocsFieldConfig(controlData) {
@@ -862,8 +975,8 @@ export class CollectorFormComponent {
862
975
  controlData: controlData,
863
976
  env: this.env,
864
977
  documentsData: this.appModel.documents,
865
- langIso: this.currentLanguageIso,
866
- },
978
+ langIso: this.currentLanguageIso
979
+ }
867
980
  };
868
981
  }
869
982
  CreateGenerateDocsFieldConfig(step) {
@@ -879,8 +992,8 @@ export class CollectorFormComponent {
879
992
  if (event === 'success') {
880
993
  await this.stepperGoNextAsync();
881
994
  }
882
- },
883
- },
995
+ }
996
+ }
884
997
  };
885
998
  }
886
999
  async stepperGoNextAsync() {
@@ -905,8 +1018,8 @@ export class CollectorFormComponent {
905
1018
  dataUrlId: this.dataUrlId,
906
1019
  stepData: step,
907
1020
  labels: labels,
908
- langIso: this.currentLanguageIso,
909
- },
1021
+ langIso: this.currentLanguageIso
1022
+ }
910
1023
  };
911
1024
  }
912
1025
  CreateIdScanFieldConfig(step) {
@@ -925,8 +1038,8 @@ export class CollectorFormComponent {
925
1038
  appDataId: this.appDataUuid || Utils.generateUUID(),
926
1039
  appId: this.appModel.applicationUuid,
927
1040
  errorMessages: errorMessages,
928
- event: (event) => this.onIdScanCompleted(event, step),
929
- },
1041
+ event: (event) => this.onIdScanCompleted(event, step)
1042
+ }
930
1043
  };
931
1044
  }
932
1045
  CreateKycFieldConfig(step) {
@@ -949,8 +1062,8 @@ export class CollectorFormComponent {
949
1062
  ectCompleted: async () => {
950
1063
  this.loadingMessage = translatedLoadingMessage;
951
1064
  await this.originFormSignalrHandlerService.initiateKycProcessing(this.appDataUuid);
952
- },
953
- },
1065
+ }
1066
+ }
954
1067
  };
955
1068
  }
956
1069
  CreatePhoneEmailFieldConfig(step) {
@@ -964,8 +1077,8 @@ export class CollectorFormComponent {
964
1077
  if (event === 'success') {
965
1078
  await this.stepperGoNextAsync();
966
1079
  }
967
- },
968
- },
1080
+ }
1081
+ }
969
1082
  };
970
1083
  }
971
1084
  CreateViewOfferFieldConfig(step) {
@@ -977,8 +1090,8 @@ export class CollectorFormComponent {
977
1090
  env: this.env,
978
1091
  appModel: this.appModel,
979
1092
  langIso: this.currentLanguageIso,
980
- event: (event) => this.onOfferSelected(event, step),
981
- },
1093
+ event: (event) => this.onOfferSelected(event, step)
1094
+ }
982
1095
  };
983
1096
  }
984
1097
  CreatePauseFieldConfig(step) {
@@ -991,8 +1104,8 @@ export class CollectorFormComponent {
991
1104
  stepData: step,
992
1105
  env: this.env,
993
1106
  appModel: this.appModel,
994
- langIso: this.currentLanguageIso,
995
- },
1107
+ langIso: this.currentLanguageIso
1108
+ }
996
1109
  };
997
1110
  }
998
1111
  CreateOpenBankingFieldConfig(step) {
@@ -1013,10 +1126,10 @@ export class CollectorFormComponent {
1013
1126
  waitingMessage: Utils.findTranslation(step.config?.waitingMessageTranslations || [], this.currentLanguageIso),
1014
1127
  consentErrorMessage: Utils.findTranslation(step.config?.consentErrorMessageTranslations || [], this.currentLanguageIso),
1015
1128
  completionMessage: Utils.findTranslation(step.config?.completionMessageTranslations || [], this.currentLanguageIso),
1016
- retryButtonLabel: Utils.findTranslation(step.config?.retryButtonLabelTranslations || [], this.currentLanguageIso),
1129
+ retryButtonLabel: Utils.findTranslation(step.config?.retryButtonLabelTranslations || [], this.currentLanguageIso)
1017
1130
  },
1018
- event: (event) => this.onOpenBankingEvent(event, step),
1019
- },
1131
+ event: (event) => this.onOpenBankingEvent(event, step)
1132
+ }
1020
1133
  };
1021
1134
  }
1022
1135
  CreateStatusFieldConfig(step) {
@@ -1026,8 +1139,8 @@ export class CollectorFormComponent {
1026
1139
  config: step.config,
1027
1140
  stepData: step,
1028
1141
  appDataId: this.appDataUuid,
1029
- appId: this.appModel.applicationUuid,
1030
- },
1142
+ appId: this.appModel.applicationUuid
1143
+ }
1031
1144
  };
1032
1145
  }
1033
1146
  createFormlySystemFieldConfig(step) {
@@ -1101,8 +1214,8 @@ export class CollectorFormComponent {
1101
1214
  if (c.controlId) {
1102
1215
  const value = {
1103
1216
  [c.controlId]: {
1104
- value: c.fillValue,
1105
- },
1217
+ value: c.fillValue
1218
+ }
1106
1219
  };
1107
1220
  if (this.form.contains(c.controlId)) {
1108
1221
  this.form.patchValue(value);
@@ -1123,7 +1236,7 @@ export class CollectorFormComponent {
1123
1236
  if (formlyStepField) {
1124
1237
  formlyStepField.props = {
1125
1238
  ...formlyStepField.props,
1126
- buttonsDisabled: false,
1239
+ buttonsDisabled: false
1127
1240
  };
1128
1241
  this.updateFormlyConfig();
1129
1242
  this.formlyConfigUpdated.emit();
@@ -1150,8 +1263,8 @@ export class CollectorFormComponent {
1150
1263
  type: 'separator',
1151
1264
  props: {
1152
1265
  title: section.translations?.find((t) => t.languageIso === this.currentLanguageIso)?.value ?? '',
1153
- design: this.design,
1154
- },
1266
+ design: this.design
1267
+ }
1155
1268
  };
1156
1269
  }
1157
1270
  if (section.showSectionSeparator) {
@@ -1160,8 +1273,8 @@ export class CollectorFormComponent {
1160
1273
  type: 'separator',
1161
1274
  props: {
1162
1275
  ...separatorFormlyConfig.props,
1163
- showSeparator: section.showSectionSeparator,
1164
- },
1276
+ showSeparator: section.showSectionSeparator
1277
+ }
1165
1278
  };
1166
1279
  }
1167
1280
  if (section.dependentDictionary) {
@@ -1173,10 +1286,10 @@ export class CollectorFormComponent {
1173
1286
  props: {
1174
1287
  label: section.title,
1175
1288
  description: section.translations?.find((t) => t.languageIso === this.currentLanguageIso)?.value ?? '',
1176
- design: this.design,
1289
+ design: this.design
1177
1290
  },
1178
1291
  fieldGroup: await this.buildControlsFieldGroupAsync(step, section.controls || [], section.presentationControls || []),
1179
- fieldGroupClassName: 'display-flex',
1292
+ fieldGroupClassName: 'display-flex'
1180
1293
  };
1181
1294
  if (section.dependentDictionary) {
1182
1295
  this.attachToDependentDictionaryIfNecessary(section.dependentDictionary, sectionFormlyConfig);
@@ -1194,7 +1307,7 @@ export class CollectorFormComponent {
1194
1307
  // buttons: this.constructButtons(step.buttons),
1195
1308
  // dependentDictionary: step.dependentDictionary,
1196
1309
  },
1197
- fieldGroup: await this.buildSectionsFieldGroupAsync(undefined, this.display.sections),
1310
+ fieldGroup: await this.buildSectionsFieldGroupAsync(undefined, this.display.sections)
1198
1311
  };
1199
1312
  }
1200
1313
  return stepFormlyConfig;
@@ -1235,8 +1348,8 @@ export class CollectorFormComponent {
1235
1348
  props: {
1236
1349
  label: '',
1237
1350
  disabled: true,
1238
- hide: true,
1239
- },
1351
+ hide: true
1352
+ }
1240
1353
  };
1241
1354
  }
1242
1355
  async buildControlsFieldGroupAsync(step, controls, presentationControls) {
@@ -1360,7 +1473,7 @@ export class CollectorFormComponent {
1360
1473
  '.component-checkbox',
1361
1474
  '.component-radio',
1362
1475
  '.component-date',
1363
- '.component-data',
1476
+ '.component-data'
1364
1477
  ];
1365
1478
  let formlyConfig = this.getDefaultFormlyFieldConfig(control, initialType, pattern, componentStyleKey, componentsToExcludeFromStyle);
1366
1479
  //control.specificControlData.type === 3 is email
@@ -1391,7 +1504,7 @@ export class CollectorFormComponent {
1391
1504
  case ManualInputControlType.DateTime:
1392
1505
  formlyConfig.type = 'datepicker';
1393
1506
  formlyConfig.props = {
1394
- readonly: true,
1507
+ readonly: true
1395
1508
  };
1396
1509
  componentStyleKey = '.component-date';
1397
1510
  break;
@@ -1486,40 +1599,40 @@ export class CollectorFormComponent {
1486
1599
  }
1487
1600
  return true;
1488
1601
  },
1489
- message: emailErrorLabelValue,
1490
- },
1602
+ message: emailErrorLabelValue
1603
+ }
1491
1604
  };
1492
1605
  }
1493
1606
  addApiValidators(formlyConfig, control) {
1494
- formlyConfig.asyncValidators = {
1607
+ const throughApiValidation = Utils.findErrorTranslationValueOrDefault(control.errorsTranslations, this.currentLanguageIso, 'throughApiValidation');
1608
+ formlyConfig.validators = {
1495
1609
  validateThroughApi: {
1496
- expression: (cont) => {
1497
- return (cont.valueChanges.pipe(debounceTime(500), switchMap(() => {
1498
- const apiValidationMethod = control.specificControlData.apiValidationMethod;
1499
- const bodyValue = this.appModel.partners
1500
- .flatMap((p) => p.partnerSettings.partnerMethodsApi)
1501
- .find((p) => p.methodId === apiValidationMethod)
1502
- ?.bodyConfiguration.bodyMapFields;
1503
- const fieldMap = bodyValue?.reduce((acc, f) => {
1504
- if (f.fluxFieldId === control.identifier) {
1505
- acc[f.partnerField] = cont.value || '';
1506
- }
1507
- else {
1508
- acc[f.partnerField] = '';
1509
- }
1510
- return acc;
1511
- }, {}) || {};
1512
- const dataRequest = {
1513
- appId: this.appModel.applicationId,
1514
- apiId: apiValidationMethod,
1515
- data: JSON.stringify(fieldMap),
1516
- };
1517
- return this.validateMethodApi(dataRequest).pipe(catchError(() => of(false)));
1518
- })) || 'ssssssssssssssss');
1610
+ expression: async (cont) => {
1611
+ if (!cont.value) {
1612
+ return of(null);
1613
+ }
1614
+ const apiValidationMethod = control.specificControlData.apiValidationMethod;
1615
+ const dataRequest = {
1616
+ appDataId: this.appDataUuid,
1617
+ apiMethodId: apiValidationMethod,
1618
+ controlIdentifier: control.identifier
1619
+ };
1620
+ var response = await this.validateMethodApi(dataRequest);
1621
+ if (response === false) {
1622
+ cont.setErrors({ validateThroughApi: true });
1623
+ return false;
1624
+ }
1625
+ return true;
1519
1626
  },
1520
- message: 'Validation failed.',
1521
- },
1627
+ message: throughApiValidation
1628
+ }
1522
1629
  };
1630
+ if (formlyConfig.validation) {
1631
+ formlyConfig.validation.messages = {
1632
+ ...formlyConfig.validation.messages,
1633
+ validateThroughApi: throughApiValidation
1634
+ };
1635
+ }
1523
1636
  }
1524
1637
  getDefaultFormlyFieldConfig(control, type, pattern, componentStyleKey, componentsToExcludeFromStyle) {
1525
1638
  const currentLanguageId = Utils.findLanguageIdByIso(this.availableLanguages, this.currentLanguageIso);
@@ -1536,16 +1649,16 @@ export class CollectorFormComponent {
1536
1649
  attributes: {
1537
1650
  style: componentsToExcludeFromStyle.find((c) => c === componentStyleKey)
1538
1651
  ? ''
1539
- : componentStyleKey,
1652
+ : componentStyleKey
1540
1653
  },
1541
1654
  autosize: true,
1542
1655
  options: [{}],
1543
1656
  fieldGroup: [],
1544
- autoDimension: control.autoDimension,
1657
+ autoDimension: control.autoDimension
1545
1658
  },
1546
1659
  expressions: {},
1547
1660
  hooks: {},
1548
- validators: {},
1661
+ validators: {}
1549
1662
  };
1550
1663
  formlyConfig.validation = {};
1551
1664
  if (control.specificControlData?.isMandatory && formlyConfig.props) {
@@ -1553,7 +1666,7 @@ export class CollectorFormComponent {
1553
1666
  formlyConfig.props.required = control.specificControlData?.isMandatory;
1554
1667
  formlyConfig.validation.messages = {
1555
1668
  ...formlyConfig.validation?.messages,
1556
- required: requiredMessage,
1669
+ required: requiredMessage
1557
1670
  };
1558
1671
  }
1559
1672
  if (control.type === StepControlType.Dictionary &&
@@ -1564,7 +1677,7 @@ export class CollectorFormComponent {
1564
1677
  formlyConfig.props.required = control.specificControlData?.isMandatory;
1565
1678
  formlyConfig.validation.messages = {
1566
1679
  ...formlyConfig.validation?.messages,
1567
- required: requiredMessage,
1680
+ required: requiredMessage
1568
1681
  };
1569
1682
  }
1570
1683
  let simpleValidationMessage = '';
@@ -1576,14 +1689,14 @@ export class CollectorFormComponent {
1576
1689
  formlyConfig.props.min = control.specificControlData.minValue;
1577
1690
  formlyConfig.validation.messages = {
1578
1691
  ...formlyConfig.validation?.messages,
1579
- min: simpleValidationMessage,
1692
+ min: simpleValidationMessage
1580
1693
  };
1581
1694
  }
1582
1695
  if (control.specificControlData?.maxValue?.toString()) {
1583
1696
  formlyConfig.props.max = control.specificControlData.maxValue;
1584
1697
  formlyConfig.validation.messages = {
1585
1698
  ...formlyConfig.validation?.messages,
1586
- max: simpleValidationMessage,
1699
+ max: simpleValidationMessage
1587
1700
  };
1588
1701
  }
1589
1702
  }
@@ -1606,12 +1719,12 @@ export class CollectorFormComponent {
1606
1719
  }
1607
1720
  },
1608
1721
  message: simpleValidationMessage ||
1609
- 'Value does not match the required pattern',
1610
- },
1722
+ 'Value does not match the required pattern'
1723
+ }
1611
1724
  };
1612
1725
  formlyConfig.validation.messages = {
1613
1726
  ...formlyConfig.validation?.messages,
1614
- pattern: simpleValidationMessage,
1727
+ pattern: simpleValidationMessage
1615
1728
  };
1616
1729
  }
1617
1730
  // Apply maxLength validation if maxCharacters is defined
@@ -1620,7 +1733,7 @@ export class CollectorFormComponent {
1620
1733
  control.specificControlData?.maxCharacters;
1621
1734
  formlyConfig.validation.messages = {
1622
1735
  ...formlyConfig.validation?.messages,
1623
- maxLength: simpleValidationMessage,
1736
+ maxLength: simpleValidationMessage
1624
1737
  };
1625
1738
  }
1626
1739
  if (control.specificControlData?.allowOnlyFuture ||
@@ -1647,12 +1760,12 @@ export class CollectorFormComponent {
1647
1760
  },
1648
1761
  message: (error, field) => {
1649
1762
  return simpleValidationMessage;
1650
- },
1651
- },
1763
+ }
1764
+ }
1652
1765
  };
1653
1766
  formlyConfig.validators = {
1654
1767
  ...formlyConfig.validators,
1655
- ...checkDateValidation,
1768
+ ...checkDateValidation
1656
1769
  };
1657
1770
  }
1658
1771
  }
@@ -1675,8 +1788,8 @@ export class CollectorFormComponent {
1675
1788
  }
1676
1789
  return true;
1677
1790
  },
1678
- message: phoneErrorLabelValue,
1679
- },
1791
+ message: phoneErrorLabelValue
1792
+ }
1680
1793
  };
1681
1794
  }
1682
1795
  if (control.specificControlData?.type === 2) {
@@ -1698,12 +1811,12 @@ export class CollectorFormComponent {
1698
1811
  if (simpleValidationMessage === '')
1699
1812
  return 'Please enter a valid date';
1700
1813
  return simpleValidationMessage;
1701
- },
1702
- },
1814
+ }
1815
+ }
1703
1816
  };
1704
1817
  formlyConfig.validators = {
1705
1818
  ...formlyConfig.validators,
1706
- ...checkDate2Validation,
1819
+ ...checkDate2Validation
1707
1820
  };
1708
1821
  }
1709
1822
  return formlyConfig;
@@ -1750,18 +1863,30 @@ export class CollectorFormComponent {
1750
1863
  case 'boolean':
1751
1864
  formlyConfig.defaultValue = fillValue ? '&check;' : '&cross;';
1752
1865
  break;
1753
- default:
1754
- if (fillValue?.name) {
1866
+ case 'object':
1867
+ // Enriched inherited dictionary format: extract fillValue for display
1868
+ if (fillValue.fillValue !== undefined) {
1869
+ formlyConfig.defaultValue = fillValue.fillValue;
1870
+ }
1871
+ else if (fillValue.name) {
1755
1872
  formlyConfig.defaultValue = fillValue.name;
1756
1873
  }
1757
1874
  else {
1758
- formlyConfig.defaultValue = fillValue;
1875
+ formlyConfig.defaultValue = JSON.stringify(fillValue);
1759
1876
  }
1760
1877
  break;
1878
+ default:
1879
+ formlyConfig.defaultValue = fillValue;
1880
+ break;
1761
1881
  }
1762
1882
  }
1763
1883
  }
1764
1884
  }
1885
+ // Ensure type is set for presentation controls
1886
+ if (!formlyConfig.type) {
1887
+ formlyConfig.type = 'formly-paragraph';
1888
+ formlyConfig.className = 'component-text-field';
1889
+ }
1765
1890
  formlyConfig.id = control.identifier;
1766
1891
  formlyConfig.props['isDisplayMode'] = true;
1767
1892
  formlyConfig.props['collectionControlIdentifier'] =
@@ -1802,7 +1927,7 @@ export class CollectorFormComponent {
1802
1927
  hide: (field) => {
1803
1928
  const shouldShow = this.shouldShowDependentField(parentKey, dependentValueIds, this.model);
1804
1929
  return !shouldShow;
1805
- },
1930
+ }
1806
1931
  };
1807
1932
  }
1808
1933
  }
@@ -1829,7 +1954,7 @@ export class CollectorFormComponent {
1829
1954
  if (filteredValues.length > 0) {
1830
1955
  const newDictionary = {
1831
1956
  ...dictionary,
1832
- values: filteredValues,
1957
+ values: filteredValues
1833
1958
  };
1834
1959
  newDictionaries.push(newDictionary);
1835
1960
  }
@@ -2009,7 +2134,7 @@ export class CollectorFormComponent {
2009
2134
  value: value,
2010
2135
  label: Utils.findValueTranslation(value.valueTranslations, currentLanguageId) || value.name,
2011
2136
  currentLanguageIso: this.currentLanguageIso,
2012
- relatedDictionariesTranslations: dictionaryControlData.relatedDictionariesTranslations,
2137
+ relatedDictionariesTranslations: dictionaryControlData.relatedDictionariesTranslations
2013
2138
  }));
2014
2139
  options.props['selectedRelatedDictionaries'] =
2015
2140
  dictionaryControlData.selectedRelatedDictionaries || [];
@@ -2080,14 +2205,14 @@ export class CollectorFormComponent {
2080
2205
  currentLanguageId: currentLanguageId,
2081
2206
  required: true,
2082
2207
  attributes: {
2083
- style: this.styleObjectToStringExceptBackground(this.design[`.font-list`] || {}),
2208
+ style: this.styleObjectToStringExceptBackground(this.design[`.font-list`] || {})
2084
2209
  },
2085
2210
  options: referenceDictionary.values?.map((value) => ({
2086
2211
  value: value,
2087
2212
  label: Utils.findValueTranslation(value.valueTranslations, currentLanguageId) || value.name,
2088
- currentLanguageIso: this.currentLanguageIso,
2089
- })),
2090
- },
2213
+ currentLanguageIso: this.currentLanguageIso
2214
+ }))
2215
+ }
2091
2216
  };
2092
2217
  if (referenceDictionary.defaultValueId) {
2093
2218
  const defaultVal = this.findAndMapDefaultValue(referenceDictionary, referenceDictionary.defaultValueId);
@@ -2103,9 +2228,10 @@ export class CollectorFormComponent {
2103
2228
  if (parentIndex !== -1) {
2104
2229
  const endIndex = this.findLastChildIndex(parentFieldGroup, parentIndex);
2105
2230
  const percentageToAdd = this.getExistingPercentage(parentFieldGroup, parentIndex);
2106
- newField.className = percentageToAdd === 0
2107
- ? parentDictionaryField.className
2108
- : this.getPercentageClassName(percentageToAdd);
2231
+ newField.className =
2232
+ percentageToAdd === 0
2233
+ ? parentDictionaryField.className
2234
+ : this.getPercentageClassName(percentageToAdd);
2109
2235
  parentFieldGroup.splice(endIndex + 1, 0, newField);
2110
2236
  const classNameToAdd = type === 'radio' ? ` component-radio` : ` component-data`;
2111
2237
  newField.className += classNameToAdd;
@@ -2186,12 +2312,12 @@ export class CollectorFormComponent {
2186
2312
  preloadedDictionaries: this.dictionaryMap,
2187
2313
  options: childDictionary.values?.map((value) => ({
2188
2314
  value: value.id,
2189
- label: value.name,
2315
+ label: value.name
2190
2316
  })),
2191
2317
  required: true,
2192
2318
  attributes: {
2193
- style: this.styleObjectToStringExceptBackground(this.design[`.font-list`] || {}),
2194
- },
2319
+ style: this.styleObjectToStringExceptBackground(this.design[`.font-list`] || {})
2320
+ }
2195
2321
  },
2196
2322
  hooks: {
2197
2323
  onInit: (field) => {
@@ -2213,8 +2339,8 @@ export class CollectorFormComponent {
2213
2339
  unsubscribe$.next();
2214
2340
  unsubscribe$.complete();
2215
2341
  };
2216
- },
2217
- },
2342
+ }
2343
+ }
2218
2344
  };
2219
2345
  const parentFieldGroup = parentDictionaryField.parent
2220
2346
  ? parentDictionaryField.parent.fieldGroup
@@ -2386,7 +2512,7 @@ export class CollectorFormComponent {
2386
2512
  return buttonsConfig.map((button) => ({
2387
2513
  type: button.value.toLowerCase(),
2388
2514
  label: button.translations?.[this.currentLanguageIso] || button.value,
2389
- styleKey: `.button-${button.value.toLowerCase()}`,
2515
+ styleKey: `.button-${button.value.toLowerCase()}`
2390
2516
  }));
2391
2517
  }
2392
2518
  styleObjectToStringExceptBackground(styleObj) {
@@ -2395,17 +2521,16 @@ export class CollectorFormComponent {
2395
2521
  .map(([key, value]) => `${key}: ${value}`)
2396
2522
  .join('; ');
2397
2523
  }
2398
- validateMethodApi(data) {
2399
- if (data.apiId === undefined || data.appId === undefined) {
2400
- return of(false);
2524
+ async validateMethodApi(data) {
2525
+ if (data.apiMethodId === undefined) {
2526
+ return false;
2401
2527
  }
2402
- return this.applicationDataService.validateApi(data).pipe(map((response) => {
2403
- console.log('API validation response:', response);
2404
- return !!response;
2528
+ var apiResponse = from(this.applicationDataService.validateApi(data)).pipe(map((obs) => {
2529
+ return !!obs;
2405
2530
  }), catchError((error) => {
2406
- console.error('Error validating ' + data.data, error);
2407
2531
  return of(false);
2408
2532
  }));
2533
+ return firstValueFrom(apiResponse);
2409
2534
  }
2410
2535
  /**
2411
2536
  * Public method to clear the saving after actions state
@@ -2464,4 +2589,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
2464
2589
  }], completionEvent: [{
2465
2590
  type: Output
2466
2591
  }] } });
2467
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JpZ2luLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9vcmlnaW4tZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9vcmlnaW4tZm9ybS9zcmMvbGliL29yaWdpbi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBSU4sWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxXQUFXLEdBR1osTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsT0FBTyxFQUNQLGNBQWMsRUFDZCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNWLEVBQUUsRUFDRixTQUFTLEVBRVQsR0FBRyxFQUNILFlBQVksR0FDYixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU8vQyxPQUFPLEVBS0wsUUFBUSxFQUNSLGFBQWEsRUFDYixlQUFlLEVBQ2Ysc0JBQXNCLEdBR3ZCLE1BQU0sc0JBQXNCLENBQUM7QUFLOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBWSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVVqRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQVFsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUEwRSx1QkFBdUIsRUFBeUIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3SixP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Q0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQzsrR0FuckdVLHNCQUFzQjttR0FBdEIsc0JBQXNCLG1wQkFDbkIsV0FBVyxxRUNyRjNCLGd1Q0F3Q0E7OzRGRDRDYSxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0UsaUJBQWlCO3VmQUtBLFlBQVk7c0JBQXRDLFlBQVk7dUJBQUMsV0FBVztnQkFHaEIsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFjSSxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBGb3JtbHlGaWVsZCxcbiAgRm9ybWx5RmllbGRDb25maWcsXG4gIEZvcm1seUZvcm1PcHRpb25zLFxufSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7XG4gIFN1YmplY3QsXG4gIGZpcnN0VmFsdWVGcm9tLFxuICBzdGFydFdpdGgsXG4gIHBhaXJ3aXNlLFxuICBkZWJvdW5jZVRpbWUsXG4gIHN3aXRjaE1hcCxcbiAgY2F0Y2hFcnJvcixcbiAgb2YsXG4gIHRha2VVbnRpbCxcbiAgT2JzZXJ2YWJsZSxcbiAgbWFwLFxuICBTdWJzY3JpcHRpb24sXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTGFiZWxLZXlzIH0gZnJvbSAnLi9lbnVtcy9sYWJlbC5rZXlzJztcbmltcG9ydCB7IEFwaVZhbGlkYXRlUmVxdWVzdCB9IGZyb20gJy4vbW9kZWxzL2FwcGxpY2F0aW9uLm1vZGVsJztcbmltcG9ydCB7XG4gIERpY3Rpb25hcnlEdG8sXG4gIERpY3Rpb25hcnlWYWx1ZSxcbiAgRGljdGlvbmFyeVZhbHVlRHRvLFxufSBmcm9tICcuL21vZGVscy9kaWN0aW9uYXJ5Lm1vZGVsJztcbmltcG9ydCB7XG4gIEZvcm1Nb2RlbCxcbiAgRGlzcGxheU1vZGVsLFxuICBHZW5lcmFsRGF0YU1vZGVsLFxuICBTdGVwc1NldHRpbmdzLFxuICBGbHV4VHlwZSxcbiAgRGltZW5zaW9uVHlwZSxcbiAgU3RlcENvbnRyb2xUeXBlLFxuICBNYW51YWxJbnB1dENvbnRyb2xUeXBlLFxuICBQcmVzZW50YXRpb25QYXJhZ3JhcGhDb250cm9sLFxuICBEaWN0aW9uYXJ5Q29udHJvbERhdGEsXG59IGZyb20gJy4vbW9kZWxzL2Zvcm1zLm1vZGVsJztcbmltcG9ydCB7IExhYmVsSW5mbywgVHJhbnNsYXRpb25JbmZvIH0gZnJvbSAnLi9tb2RlbHMvbGFiZWwtaW5mby5tb2RlbCc7XG5pbXBvcnQgeyBMYWJlbCB9IGZyb20gJy4vbW9kZWxzL2xhYmVsLm1vZGVsJztcbmltcG9ydCB7IExhbmd1YWdlIH0gZnJvbSAnLi9tb2RlbHMvbGFuZ3VhZ2UubW9kZWwnO1xuaW1wb3J0IHsgRGljdGlvbmFyeUxhYmVsSW5mbyB9IGZyb20gJy4vb3RoZXJzL2RpY3Rpb25hcnktbGFiZWwtaW5mbyc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudFR5cGUgfSBmcm9tICcuL290aGVycy9lbnZpcm9ubWVudC10eXBlJztcbmltcG9ydCB7IENzc1J1bGVzLCBVdGlscyB9IGZyb20gJy4vb3RoZXJzL3V0aWxzJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uRGF0YVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2FwcGxpY2F0aW9uRGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IExhYmVsU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvbGFiZWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJveHlTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9wcm94eS5zZXJ2aWNlJztcbmltcG9ydCB7IERpY3Rpb25hcnlTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9kaWN0aW9uYXJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9sYW5ndWFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9yaWdpbkZvcm1BdXRoU2VydmljZSB9IGZyb20gJy4vb3JpZ2luLWZvcm0tYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEZvcm1zU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZm9ybXMuc2VydmljZSc7XG5pbXBvcnQgeyBJbnB1dENvbmZpZyB9IGZyb20gJy4vb3JpZ2luLWZvcm0tY29uZmlnLm1vZGVsJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL290aGVycy9jb25maWctc2VydmljZSc7XG5pbXBvcnQgeyBNb2RlbFBvcHVsYXRpb25IZWxwZXIgfSBmcm9tICcuL21vZGVsLXBvcHVsYXRpb24uaGVscGVyJztcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdHJhbnNsYXRpb24uc2VydmljZSc7XG5pbXBvcnQge1xuICBPcGVyYXRpb25SZXN1bHQsXG4gIE9yaWdpbkZvcm1TaWduYWxySGFuZGxlclNlcnZpY2UsXG59IGZyb20gJy4vc2VydmljZXMvb3JpZ2luLWZvcm0tc2lnbmFsci1oYW5kbGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aW9uU3RlcEhhbmRsZXIgfSBmcm9tICcuL2FjdGlvbi1zdGVwLWhhbmRsZXInO1xuaW1wb3J0IHsgU2Nyb2xsVG9FcnJvclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3Njcm9sbC10by1lcnJvci5zZXJ2aWNlJztcbmltcG9ydCB7IEZvcm1Dc3NIZWxwZXIgfSBmcm9tICcuL2Zvcm0tY3NzLmhlbHBlcic7XG5pbXBvcnQgeyBCYXNlQ29udHJvbCwgQ29udHJvbERhdGEsIERlcGVuZGVudERpY3Rpb25hcnlEYXRhLCBQcmVzZW50YXRpb25Db250cm9sLCBQcmVzZW50YXRpb25Db250cm9sVHlwZSwgU2VjdGlvbkRhdGEsIFN0ZXBEYXRhIH0gZnJvbSAnLi9tb2RlbHMvZmx1eC5tb2RlbCc7XG5pbXBvcnQgeyBGTEFHX0lDT05TIH0gZnJvbSAnLi9mbGFnLWljb25zJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLW9yaWdpbi1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL29yaWdpbi1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vb3JpZ2luLWZvcm0uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29sbGVjdG9yRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZHJlbihGb3JtbHlGaWVsZCkgZm9ybWx5RmllbGRzOiBRdWVyeUxpc3Q8Rm9ybWx5RmllbGQ+O1xuICBcbiAgLy90aGVzZSBhcmUgc3BlY2lmaWMgdG8gdGhlIGxpYlxuICBASW5wdXQoKSBjb25maWdDb21wb25lbnQ6IElucHV0Q29uZmlnIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBjb25maWdVdWlkITogc3RyaW5nO1xuICBASW5wdXQoKSBjdXJyZW50U3RlcElkOiBzdHJpbmc7XG4gIC8vZW5kIHNwZWNpZmljIHRvIGxpYlxuXG4gIEBJbnB1dCgpIGFwcE1vZGVsOiBGb3JtTW9kZWw7XG4gIEBJbnB1dCgpIHNpZ25CYXNlVXJsOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGN1cnJlbnRMYW5ndWFnZUlzbzogc3RyaW5nO1xuICBASW5wdXQoKSBmaWxsRGF0YTogYW55O1xuICBASW5wdXQoKSBpbml0Rmxvd1ZhbHVlczogc3RyaW5nO1xuICBASW5wdXQoKSBlbnY6IHN0cmluZztcbiAgQElucHV0KCkgc2hvd0Rpc3BsYXlNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dMYW5ndWFnZVNlbGVjdG9yOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgaXNEZW1vTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0RlYnVnOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFwcERhdGFVdWlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJsb2NrUHJldmlvdXNTdGVwOiBib29sZWFuO1xuICBASW5wdXQoKSBkYXRhVXJsSWQ6IHN0cmluZztcbiAgQElucHV0KCkgbm9CdXR0b25zSW5WaWV3OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgZmx1eDogU3RlcERhdGFbXTtcbiAgcHJpdmF0ZSBkaXNwbGF5OiBEaXNwbGF5TW9kZWw7XG4gIHByaXZhdGUgZGVzaWduOiBDc3NSdWxlcztcbiAgcHJpdmF0ZSBnZW5lcmFsRGF0YTogR2VuZXJhbERhdGFNb2RlbDtcbiAgcHJpdmF0ZSBsYWJlbHM6IExhYmVsW107XG4gIHByaXZhdGUgc3RlcERpY3Rpb25hcnlEZXBlbmRlbnRJZHM6IHN0cmluZ1tdO1xuICBwcml2YXRlIGF2YWlsYWJsZUxhbmd1YWdlczogTGFuZ3VhZ2VbXTtcbiAgcHJpdmF0ZSBzdGVwc1NldHRpbmdzOiBTdGVwc1NldHRpbmdzO1xuICBmb3JtbHlDb25maWdVcGRhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICB2aXNpYmxlRmllbGRzVXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBmb3JtbHlVcGRhdGVBbmRHb05leHQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgZm9ybWx5R29OZXh0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIEBPdXRwdXQoKSBjb21wbGV0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgZm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICBmb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXTtcbiAgZm9ybWx5QWxsU3RlcHM6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXTtcbiAgYWN0aXZlU3RlcCA9IDA7XG4gIG1vZGVsOiBhbnk7XG4gIG9wdGlvbnM6IEZvcm1seUZvcm1PcHRpb25zID0ge307XG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XG5cbiAgZGljdGlvbmFyeU1hcDogTWFwPHN0cmluZywgRGljdGlvbmFyeUR0bz4gPSBuZXcgTWFwKCk7XG4gIGRpY3Rpb25hcnlJZFRvVXVpZE1hcDogTWFwPG51bWJlciwgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgZ2VuZXJhbERhdGFLZXlzID0gTGFiZWxLZXlzLmFwcENvbmZpZ0VkaXQuZ2VuZXJhbERhdGE7XG4gIHByaXZhdGUgZmllbGRVbnN1YnNjcmliZVN1YmplY3RzOiBTdWJqZWN0PHZvaWQ+W10gPSBbXTtcbiAgcHJpdmF0ZSBjb2xsZWN0b3JIYW5kbGVyU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIC8vIEFjdGlvbiBzdGVwIGV4ZWN1dGlvbiBzdGF0ZVxuICBwcml2YXRlIGlzRXhlY3V0aW5nQWN0aW9ucyA9IGZhbHNlO1xuICBwcml2YXRlIGFjdGlvblN0ZXBTdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHB1YmxpYyBpc1NhdmluZ0FmdGVyQWN0aW9ucyA9IGZhbHNlOyAvLyBNYWtlIHRoaXMgcHVibGljIHNvIHN0ZXBwZXIgY2FuIGFjY2VzcyBpdFxuXG4gIC8vIGlkZW50aWZpY2F0aW9uIGt5YyBjb21wb25lbnRcbiAgcHVibGljIGt5Y0FwaVVybDogc3RyaW5nO1xuICBwdWJsaWMga3ljT3JkZXJJZDogc3RyaW5nO1xuICBwdWJsaWMga3ljVG9rZW46IHN0cmluZztcbiAgcHVibGljIGt5Y0Vudjogc3RyaW5nO1xuICBwdWJsaWMga3ljUmVkaXJlY3RJZDogc3RyaW5nO1xuICBwdWJsaWMga3ljUGhvbmVOdW1iZXI6IHN0cmluZyA9ICcnO1xuICBwdWJsaWMga3ljTGFuZ0lzbzogc3RyaW5nID0gJyc7XG4gIHB1YmxpYyBreWNTaG93Q2l0aXplbnNoaXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGt5Y1Njcm9sbE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gZW5kIGlkZW50aWZpY2F0aW9uIGt5YyBjb21wb25lbnRcbiAgcHVibGljIGxhbmd1YWdlRmxhZ3M6IGFueVtdID0gW1xuICAgIHtcbiAgICAgIGxhbmd1YWdlOiAnRW5nbGlzaCcsXG4gICAgICBjb2RlOiAnZW4nLFxuICAgICAgdHlwZTogJ1VTJyxcbiAgICAgIGljb246IEZMQUdfSUNPTlMuZW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBsYW5ndWFnZTogJ1JvbWFuYScsXG4gICAgICBjb2RlOiAncm8nLFxuICAgICAgaWNvbjogRkxBR19JQ09OUy5ybyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhbmd1YWdlOiAnRGV1dHNjaCcsXG4gICAgICBjb2RlOiAnZGUnLFxuICAgICAgaWNvbjogRkxBR19JQ09OUy5kZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhbmd1YWdlOiAnRnJhbsOnYWlzJyxcbiAgICAgIGNvZGU6ICdmcicsXG4gICAgICBpY29uOiBGTEFHX0lDT05TLmZyLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFuZ3VhZ2U6ICdJdGFsaWFubycsXG4gICAgICBjb2RlOiAnaXQnLFxuICAgICAgaWNvbjogRkxBR19JQ09OUy5pdCxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhbmd1YWdlOiAnRXNwYcOxb2wnLFxuICAgICAgY29kZTogJ2VzJyxcbiAgICAgIGljb246IEZMQUdfSUNPTlMuZXMsXG4gICAgfSxcbiAgXTtcbiAgZm9ybWx5Q29sbGVjdGluZ0ZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXTtcbiAgZm9ybWx5UHJlc2VudGF0aW9uRmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdO1xuICBjb250cm9sSWRzV2l0aFZhbHVlczogYW55O1xuICBfc2VsZiA9IHRoaXM7XG5cbiAgXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2VydmljZTogRGljdGlvbmFyeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByb3h5OiBQcm94eVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYWJlbFNlcnZpY2U6IExhYmVsU2VydmljZSxcbiAgICBwcml2YXRlIGFwcGxpY2F0aW9uRGF0YVNlcnZpY2U6IEFwcGxpY2F0aW9uRGF0YVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYW5nU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IE9yaWdpbkZvcm1BdXRoU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1zU2VydmljZTogRm9ybXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgb3JpZ2luRm9ybVNpZ25hbHJIYW5kbGVyU2VydmljZTogT3JpZ2luRm9ybVNpZ25hbHJIYW5kbGVyU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGlvblN0ZXBIYW5kbGVyOiBBY3Rpb25TdGVwSGFuZGxlcixcbiAgICBwcml2YXRlIHNjcm9sbFRvRXJyb3JTZXJ2aWNlOiBTY3JvbGxUb0Vycm9yU2VydmljZVxuICApIHtcbiAgICB0aGlzLmt5Y0FwaVVybCA9IHByb3h5LmFwaVVSTDtcbiAgICB0aGlzLmt5Y09yZGVySWQgPSBwcm94eS5vcmRlcklEITtcbiAgICB0aGlzLmt5Y1Rva2VuID0gcHJveHkudG9rZW47XG4gICAgdGhpcy5reWNFbnYgPSBwcm94eS5lbnY7XG5cbiAgICB0aGlzLmt5Y0xhbmdJc28gPSBwcm94eS5sYW5nSXNvO1xuICAgIGNvbnN0IGlzTG9hZGluZ1N1YiA9XG4gICAgICB0aGlzLm9yaWdpbkZvcm1TaWduYWxySGFuZGxlclNlcnZpY2UuaXNMb2FkaW5nJC5zdWJzY3JpYmUoKGxvYWRpbmcpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNMb2FkaW5nICE9PSBsb2FkaW5nKSB7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBsb2FkaW5nO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB0aGlzLmNvbGxlY3RvckhhbmRsZXJTdWJzY3JpcHRpb25zLmFkZChpc0xvYWRpbmdTdWIpO1xuXG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkNvbXBsZXRlZFN1YiA9XG4gICAgICB0aGlzLm9yaWdpbkZvcm1TaWduYWxySGFuZGxlclNlcnZpY2Uub3BlcmF0aW9uQ29tcGxldGVkJC5zdWJzY3JpYmUoXG4gICAgICAgIGFzeW5jIChyZXN1bHQ6IE9wZXJhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQub3BlcmF0aW9uSWRlbnRpZmllciA9PT0gJ0tZQ19QUk9DRVNTSU5HJykge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICdLWUMgUHJvY2Vzc2luZyBzdWNjZXNzZnVsbHkgY29tcGxldGVkICh2aWEgSGFuZGxlciBTZXJ2aWNlKTonLFxuICAgICAgICAgICAgICAgIHJlc3VsdC5kYXRhXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChyZXN1bHQuZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsbERhdGEgPSBKU09OLnBhcnNlKHJlc3VsdC5kYXRhLmZpbGxEYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcHVsYXRlTW9kZWxXaXRoRmlsbERhdGEodGhpcy5maWxsRGF0YSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aGlzLmZvcm1seVVwZGF0ZUFuZEdvTmV4dC5lbWl0KHt9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ0tZQyBQcm9jZXNzaW5nIGZhaWxlZCAodmlhIEhhbmRsZXIgU2VydmljZSk6JyxcbiAgICAgICAgICAgICAgICByZXN1bHQuZXJyb3JcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgdGhpcy5jb2xsZWN0b3JIYW5kbGVyU3Vic2NyaXB0aW9ucy5hZGQob3BlcmF0aW9uQ29tcGxldGVkU3ViKTtcblxuICAgIC8vIFN1YnNjcmliZSB0byBhY3Rpb24gc3RlcCBleGVjdXRpb24gZXZlbnRzXG4gICAgY29uc3QgYWN0aW9uRXhlY3V0aW5nU3ViID1cbiAgICAgIHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuYWN0aW9uRXhlY3V0aW5nJC5zdWJzY3JpYmUoKGV4ZWN1dGluZykgPT4ge1xuICAgICAgICB0aGlzLmlzRXhlY3V0aW5nQWN0aW9ucyA9IGV4ZWN1dGluZztcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBleGVjdXRpbmc7XG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgdGhpcy5hY3Rpb25TdGVwU3Vic2NyaXB0aW9ucy5hZGQoYWN0aW9uRXhlY3V0aW5nU3ViKTtcblxuICAgIGNvbnN0IGFjdGlvbkNvbXBsZXRlZFN1YiA9XG4gICAgICB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmFjdGlvbkNvbXBsZXRlZCQuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ/CfjqwgQWN0aW9uIHN0ZXAgY29tcGxldGVkOicsIHJlc3VsdCk7XG4gICAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgQWN0aW9uIHN0ZXAgZmFpbGVkOicsIHJlc3VsdC5lcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgYXV0by1wcm9ncmVzcyBoZXJlIGFzIGl0J3MgaGFuZGxlZCBpbiBleGVjdXRlQWN0aW9uU3RlcHNCZWZvcmVNb3ZpbmdcbiAgICAgIH0pO1xuICAgIHRoaXMuYWN0aW9uU3RlcFN1YnNjcmlwdGlvbnMuYWRkKGFjdGlvbkNvbXBsZXRlZFN1Yik7XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5kYXRhVXJsSWQpIHtcbiAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5hcHBsaWNhdGlvbkRhdGFTZXJ2aWNlLmdldERhdGFVcmwodGhpcy5kYXRhVXJsSWQpXG4gICAgICApO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmNvbmZpZ1V1aWQgPSByZXN1bHQuYXBwSWQ7XG4gICAgICAgIHRoaXMuYXBwRGF0YVV1aWQgPSByZXN1bHQuYXBwRGF0YUlkO1xuICAgICAgICB0aGlzLmVudiA9IHJlc3VsdC5lbnY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYXBwRGF0YVV1aWQgJiYgdGhpcy5jdXJyZW50U3RlcElkKSB7XG4gICAgICB0aGlzLmFwcGxpY2F0aW9uRGF0YVNlcnZpY2Uuc2V0Q3VycmVudFN0ZXAoXG4gICAgICAgIHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIHRoaXMuY3VycmVudFN0ZXBJZFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYXBwRGF0YVV1aWQpIHtcbiAgICAgIHRoaXMuYXBwRGF0YVV1aWQgPSBVdGlscy5nZW5lcmF0ZVVVSUQoKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbmZpZ0NvbXBvbmVudCAmJlxuICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuVG9rZW4gJiZcbiAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlJlZnJlc2hUb2tlblxuICAgICkge1xuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLnVwZGF0ZUNvbmZpZ0Zyb21JbnB1dCh0aGlzLmNvbmZpZ0NvbXBvbmVudCk7XG4gICAgICBhd2FpdCB0aGlzLmF1dGhTZXJ2aWNlLnNldFRva2VucyhcbiAgICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuVG9rZW4sXG4gICAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlJlZnJlc2hUb2tlblxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyB8fCB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMubGFuZ1NlcnZpY2UuZ2V0TGFuZ3VhZ2VzKCkpLnRoZW4oKGxpc3QpID0+IHtcbiAgICAgICAgaWYgKGxpc3QgJiYgbGlzdC5pdGVtcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzID0gbGlzdC5pdGVtcztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMubG9hZEFwcERhdGEoKTtcbiAgICBpZiAoIXRoaXMuY3VycmVudExhbmd1YWdlSXNvICYmIHRoaXMuYXBwTW9kZWwpIHtcbiAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvID0gdGhpcy5hcHBNb2RlbC5nZW5lcmFsRGF0YS5kZWZhdWx0TGFuZ3VhZ2U7XG4gICAgfVxuICAgIGlmICh0aGlzLmFwcE1vZGVsKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRBc3luYygpO1xuICAgIH1cbiAgfVxuXG4gYXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChjaGFuZ2VzWydjb25maWdDb21wb25lbnQnXSAmJiAhY2hhbmdlc1snY29uZmlnQ29tcG9uZW50J10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5jb25maWdDb21wb25lbnQgJiZcbiAgICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuVG9rZW4gJiZcbiAgICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuUmVmcmVzaFRva2VuXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLnVwZGF0ZUNvbmZpZ0Zyb21JbnB1dCh0aGlzLmNvbmZpZ0NvbXBvbmVudCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYXV0aFNlcnZpY2Uuc2V0VG9rZW5zKFxuICAgICAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlRva2VuLFxuICAgICAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlJlZnJlc2hUb2tlblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzWydjdXJyZW50TGFuZ3VhZ2VJc28nXSAmJlxuICAgICAgIWNoYW5nZXNbJ2N1cnJlbnRMYW5ndWFnZUlzbyddLmZpcnN0Q2hhbmdlXG4gICAgKSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMpIHtcbiAgICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmxhbmdTZXJ2aWNlLmdldExhbmd1YWdlcygpKS50aGVuKChsaXN0KSA9PiB7XG4gICAgICAgICAgICBpZiAobGlzdCAmJiBsaXN0Lml0ZW1zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzID0gbGlzdC5pdGVtcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hcHBEYXRhVXVpZCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBhcHBEYXRhID0gYXdhaXQgdGhpcy5hcHBsaWNhdGlvbkRhdGFTZXJ2aWNlLmdldFN0ZXBzKFxuICAgICAgICAgICAgICB0aGlzLmFwcERhdGFVdWlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGFwcERhdGEgJiYgYXBwRGF0YS5maWxsRGF0YSkge1xuICAgICAgICAgICAgICB0aGlzLmZpbGxEYXRhID0gSlNPTi5wYXJzZShhcHBEYXRhLmZpbGxEYXRhKTtcbiAgICAgICAgICAgICAgdGhpcy5ibG9ja1ByZXZpb3VzU3RlcCA9IGFwcERhdGEuYmxvY2tQcmV2aW91c1N0ZXA7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmZpbGxEYXRhLm1ldGFkYXRhLmxhbmd1YWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28gPSB0aGlzLmZpbGxEYXRhLm1ldGFkYXRhLmxhbmd1YWdlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJldHJpZXZpbmcgYXBwIGRhdGEnLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdEFzeW5jKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2FkQXBwRGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiB7IGNvbmZpZ3VyYXRpb246IGFueTsgZmlsbERhdGE/OiBhbnkgfSA9XG4gICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICAgIHRoaXMuZm9ybXNTZXJ2aWNlLmxvYWRGb3JtQnlVdWlkKHRoaXMuY29uZmlnVXVpZCwgdGhpcy5lbnYpXG4gICAgICAgICk7XG4gICAgICB0aGlzLmFwcE1vZGVsID0gSlNPTi5wYXJzZShyZXNwb25zZS5jb25maWd1cmF0aW9uKTtcbiAgICAgIHRoaXMuZmlsbERhdGEgPSByZXNwb25zZS5maWxsRGF0YSA/IEpTT04ucGFyc2UocmVzcG9uc2UuZmlsbERhdGEpIDogbnVsbDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBmb3JtIGRhdGEnLCBlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tQWxsRmllbGRzKCk7XG4gICAgYXdhaXQgdGhpcy5idWlsZEZvcm1seUFzeW5jKCk7XG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUmVmZXJlbmNlRmllbGRzKHRoaXMuZm9ybWx5Q29uZmlnKTtcbiAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgIHRoaXMuZm9ybWx5Q29uZmlnVXBkYXRlZC5lbWl0KCk7XG4gICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwdWJsaWMgYXBwbGljYXRpb25MYW5ndWFnZXMoKTogTGFuZ3VhZ2VbXSB7XG4gICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzPy5maWx0ZXIoKGEpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmFwcE1vZGVsPy5nZW5lcmFsRGF0YT8ubGFuZ3VhZ2VzPy5pbmRleE9mKGEuaXNvKSA+PSAwO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJldHVybkZMYWcobGFuZ3VhZ2U6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmxhbmd1YWdlRmxhZ3MuZmluZCgobCkgPT4gbC5jb2RlID09IGxhbmd1YWdlKT8uaWNvbjtcbiAgfVxuXG4gIGNoYW5nZUxhbmd1YWdlKCRldmVudDogc3RyaW5nKSB7XG4gICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28gPSAkZXZlbnQ7XG4gICAgdGhpcy5hcHBsaWNhdGlvbkRhdGFTZXJ2aWNlXG4gICAgICAuY2hhbmdlTGFuZ3VhZ2UodGhpcy5hcHBEYXRhVXVpZCwgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28pXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5pbml0QXN5bmMoKTtcbiAgfVxuICBnZXRMYW5ndWFnZU5hbWUobGFuZ3VhZ2VJc286IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcy5maW5kKFxuICAgICAgKGxhbmcpID0+IGxhbmcuaXNvID09PSBsYW5ndWFnZUlzb1xuICAgICk7XG4gICAgcmV0dXJuIGxhbmd1YWdlID8gbGFuZ3VhZ2UubmFtZSA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEZvcm1seUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbykge1xuICAgICAgYXdhaXQgdGhpcy5nZXRMYWJlbHMoKTtcbiAgICB9XG5cbiAgICAvLyBTVEVQIDE6IEluaXRpYWxpemUgZmx1eCBhbmQgb3RoZXIgcHJvcGVydGllcyBmaXJzdFxuICAgIHRoaXMuZmx1eCA9IHRoaXMuYXBwTW9kZWwuZmx1eDtcbiAgICB0aGlzLmRpc3BsYXkgPSB0aGlzLmFwcE1vZGVsLmRpc3BsYXk7XG4gICAgdGhpcy5kZXNpZ24gPSB0aGlzLmFwcE1vZGVsLmdlbmVyYXRlZENzcztcbiAgICB0aGlzLmdlbmVyYWxEYXRhID0gdGhpcy5hcHBNb2RlbC5nZW5lcmFsRGF0YTtcbiAgICB0aGlzLmFkZFJlbmRlcmVkQ3NzKCk7XG5cbiAgICAvLyBTVEVQIDI6IExvYWQgQUxMIGRpY3Rpb25hcmllcyB1cGZyb250IChub3cgdGhhdCBmbHV4IGlzIGluaXRpYWxpemVkKVxuICAgIGF3YWl0IHRoaXMubG9hZEFsbFJlcXVpcmVkRGljdGlvbmFyaWVzKCk7XG5cbiAgICAvLyBTVEVQIDM6IENvbnRpbnVlIHdpdGggZXhpc3RpbmcgZm9ybSBidWlsZGluZyBsb2dpY1xuICAgIHRoaXMuZm9ybWx5Q29uZmlnID0gW107XG4gICAgdGhpcy5mb3JtbHlDb2xsZWN0aW5nRmllbGRzID0gW107XG4gICAgdGhpcy5mb3JtbHlQcmVzZW50YXRpb25GaWVsZHMgPSBbXTtcbiAgICB0aGlzLm1vZGVsID0ge307XG4gICAgdGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XG5cbiAgICBpZiAodGhpcy5maWxsRGF0YSkge1xuICAgICAgdGhpcy5wb3B1bGF0ZUNvbnRyb2xJZHNXaXRoVmFsdWVEaWN0aW9uYXJ5KCk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBtb2RlbCB3aXRoIGRlZmF1bHQgdmFsdWVzIGlmIG5vIGZpbGxEYXRhXG4gICAgaWYgKCF0aGlzLmZpbGxEYXRhKSB7XG4gICAgICB0aGlzLm1vZGVsID0gTW9kZWxQb3B1bGF0aW9uSGVscGVyLmFwcGx5RGVmYXVsdHNUb01vZGVsKFxuICAgICAgICB0aGlzLmZsdXgsXG4gICAgICAgIHRoaXMuZGljdGlvbmFyeU1hcCxcbiAgICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucG9wdWxhdGVNb2RlbFdpdGhGaWxsRGF0YSh0aGlzLmZpbGxEYXRhKTtcbiAgICAgIHRoaXMucG9wdWxhdGVDb250cm9sSWRzV2l0aFZhbHVlRGljdGlvbmFyeSgpO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHRoaXMubW9kZWwpO1xuICAgIGF3YWl0IHRoaXMuYnVpbGRGb3JtbHlDb25maWdBc3luYygpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSByZWZlcmVuY2VzIGZvciBkZWZhdWx0IHZhbHVlc1xuICAgIGlmICghdGhpcy5maWxsRGF0YSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUmVmZXJlbmNlRmllbGRzKHRoaXMuZm9ybWx5Q29uZmlnKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShzdGFydFdpdGgobnVsbCksIHBhaXJ3aXNlKCkpXG4gICAgICAuc3Vic2NyaWJlKChbcHJldiwgbmV4dF06IFthbnksIGFueV0pID0+XG4gICAgICAgIHRoaXMuaGFuZGxlRm9ybVZhbHVlQ2hhbmdlKFtwcmV2LCBuZXh0XSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZvcm1WYWx1ZUNoYW5nZShbcHJldiwgbmV4dF06IFthbnksIGFueV0pIHtcbiAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2VJZCA9IFV0aWxzLmZpbmRMYW5ndWFnZUlkQnlJc28oXG4gICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXh0KSB7XG4gICAgICBpZiAobmV4dFtrZXldPy52YWx1ZVRyYW5zbGF0aW9ucykge1xuICAgICAgICB2YXIgcyA9IEpTT04uc3RyaW5naWZ5KG5leHRba2V5XSk7XG4gICAgICAgIHZhciByZXBsYWNlZCA9IHMucmVwbGFjZSgvXCJ2YWx1ZVRyYW5zbGF0aW9uc1wiOi9nLCAnXCJ0cmFuc2xhdGlvbnNcIjonKTtcbiAgICAgICAgbmV4dFtrZXldID0gSlNPTi5wYXJzZShyZXBsYWNlZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZm9ybWx5UHJlc2VudGF0aW9uRmllbGRzLmZpbHRlcihcbiAgICAgICAgKGkpID0+IGkucHJvcHMgJiYgaS5wcm9wc1snY29sbGVjdGlvbkNvbnRyb2xJZGVudGlmaWVyJ10gPT09IGtleVxuICAgICAgKTtcbiAgICAgIGlmIChmaWVsZHMgJiYgZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgbGV0IHZhbHVlID0gJyc7XG4gICAgICAgICAgc3dpdGNoICh0eXBlb2YgbmV4dFtrZXldKSB7XG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgICAgdmFsdWUgPSBuZXh0W2tleV0gPyAnJmNoZWNrOycgOiAnJmNyb3NzOyc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBpZiAobmV4dFtrZXldPy50cmFuc2xhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IG5leHRba2V5XS50cmFuc2xhdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICh0cmFuc2xhdGlvbjogeyBsYW5ndWFnZUlkOiBhbnkgfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24ubGFuZ3VhZ2VJZCA9PT0gY3VycmVudExhbmd1YWdlSWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdHJhbnNsYXRpb24gPyB0cmFuc2xhdGlvbi52YWx1ZSA6IG51bGw7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBuZXh0W2tleV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkLmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0ZXBEaWN0aW9uYXJ5RGVwZW5kZW50SWRzLmZpbmQoKGEpID0+IGEgPT0ga2V5KSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmV4dFtrZXldPy5pZCAmJlxuICAgICAgICAgIChwcmV2ID09IG51bGwgfHwgcHJldltrZXldPy5pZCAhPT0gbmV4dFtrZXldPy5pZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5mb3JtbHlDb25maWdbMF0uZmllbGRHcm91cCA9IHRoaXMuZ2V0Rm9ybWx5RmlsdGVyZWRTdGVwcygpO1xuICAgICAgICAgIHZhciBmaWx0ZXJlZFN0ZXBzSWRlbnRpZmllcnMgPSB0aGlzLmZvcm1seUNvbmZpZ1swXS5maWVsZEdyb3VwLm1hcChcbiAgICAgICAgICAgIChmKSA9PiBmLnByb3BzPy5bJ3N0ZXBJZCddXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB2aXNpYmxlU3RlcHMgPSB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmZpbHRlclZpc2libGVTdGVwcyhcbiAgICAgICAgICAgIHRoaXMuZmx1eCxcbiAgICAgICAgICAgIGZpbHRlcmVkU3RlcHNJZGVudGlmaWVyc1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy51cGRhdGVGb3JtbHlDb25maWcoKTtcbiAgICAgICAgICB0aGlzLnZpc2libGVGaWVsZHNVcGRhdGVkLmVtaXQodmlzaWJsZVN0ZXBzKTtcbiAgICAgICAgICB0aGlzLmZvcm1seUNvbmZpZ1VwZGF0ZWQuZW1pdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYWJlbHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLmxhYmVsU2VydmljZVxuICAgICAgICAuZ2V0TGFiZWxzKHRoaXMuY3VycmVudExhbmd1YWdlSXNvLCBmYWxzZSlcbiAgICAgICAgLnN1YnNjcmliZSgobCkgPT4ge1xuICAgICAgICAgIHRoaXMubGFiZWxzID0gbDtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3B1bGF0ZUNvbnRyb2xJZHNXaXRoVmFsdWVEaWN0aW9uYXJ5KCkge1xuICAgIHZhciBjdXJyZW50TGFuZ3VhZ2VJZCA9IHRoaXMuZ2V0Q3VycmVudExhbmd1YWdlSWQoKTtcbiAgICBjb25zdCBjb250cm9sSWRzV2l0aFZhbHVlcyA9IHRoaXMuZmlsbERhdGEuZmx1eFxuICAgICAgLmZsYXRNYXAoKHN0ZXA6IHsgc2VjdGlvbnM6IHsgY29udHJvbHM6IGFueVtdIH1bXSB9KSA9PlxuICAgICAgICBzdGVwLnNlY3Rpb25zLmZsYXRNYXAoKHNlY3Rpb246IHsgY29udHJvbHM6IGFueVtdIH0pID0+XG4gICAgICAgICAgc2VjdGlvbi5jb250cm9sc1xuICAgICAgICAgICAgLmZpbHRlcigoY29udHJvbCkgPT4gY29udHJvbC5jb250cm9sSWQgJiYgY29udHJvbC5maWxsVmFsdWUpXG4gICAgICAgICAgICAubWFwKChjb250cm9sKSA9PiAoe1xuICAgICAgICAgICAgICBjb250cm9sSWQ6IGNvbnRyb2wuY29udHJvbElkLFxuICAgICAgICAgICAgICBmaWxsVmFsdWU6IGNvbnRyb2wuZmlsbFZhbHVlLFxuICAgICAgICAgICAgICBmaWxsVmFsdWVJZDogY29udHJvbC5maWxsVmFsdWVJZCxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoXG4gICAgICAgICAgZGljdGlvbmFyeTogeyBbeDogc3RyaW5nXTogYW55IH0sXG4gICAgICAgICAgeyBjb250cm9sSWQsIGZpbGxWYWx1ZSwgZmlsbFZhbHVlSWQgfTogYW55XG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIGlmIChmaWxsVmFsdWVJZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCBkaWN0XSBvZiB0aGlzLmRpY3Rpb25hcnlNYXAuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGljdC52YWx1ZXM/LmZpbmQoKHYpID0+IHYuaWQgPT0gZmlsbFZhbHVlSWQpO1xuICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHZhbHVlLnZhbHVlVHJhbnNsYXRpb25zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAodCkgPT4gdC5sYW5ndWFnZUlkID09IGN1cnJlbnRMYW5ndWFnZUlkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcnlbY29udHJvbElkXSA9IHRyYW5zbGF0aW9uLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpY3Rpb25hcnlbY29udHJvbElkXSA9IGZpbGxWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRpY3Rpb25hcnk7XG4gICAgICAgIH0sXG4gICAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICk7XG5cbiAgICBjb25zdCBpbml0Rmxvd1ZhbHVlcyA9IHRoaXMuZmlsbERhdGE/LmluaXRGbG93VmFsdWVzO1xuICAgIGNvbnN0IGFkZEluaXRGbG93VmFsdWVzID0gKG5vZGU6IGFueSwgcGF0aFBhcnRzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChwYXRoUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnRyb2xJZHNXaXRoVmFsdWVzW2Bpbml0Rmxvd1ZhbHVlc18ke3BhdGhQYXJ0cy5qb2luKCdfJyl9YF0gPSAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICAgIG5vZGUuZm9yRWFjaCgoY2hpbGQsIGlkeCkgPT5cbiAgICAgICAgICBhZGRJbml0Rmxvd1ZhbHVlcyhjaGlsZCwgWy4uLnBhdGhQYXJ0cywgU3RyaW5nKGlkeCldKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgT2JqZWN0LmtleXMobm9kZSkuZm9yRWFjaCgoaykgPT5cbiAgICAgICAgICBhZGRJbml0Rmxvd1ZhbHVlcyhub2RlW2tdLCBbLi4ucGF0aFBhcnRzLCBrXSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocGF0aFBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29udHJvbElkc1dpdGhWYWx1ZXNbYGluaXRGbG93VmFsdWVzXyR7cGF0aFBhcnRzLmpvaW4oJ18nKX1gXSA9XG4gICAgICAgICAgU3RyaW5nKG5vZGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoaW5pdEZsb3dWYWx1ZXMgIT09IG51bGwgJiYgaW5pdEZsb3dWYWx1ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWRkSW5pdEZsb3dWYWx1ZXMoaW5pdEZsb3dWYWx1ZXMsIFtdKTtcbiAgICB9XG4gICAgdGhpcy5jb250cm9sSWRzV2l0aFZhbHVlcyA9IGNvbnRyb2xJZHNXaXRoVmFsdWVzO1xuICB9XG4gIHByaXZhdGUgZ2V0Q3VycmVudExhbmd1YWdlSWQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2VJZCA9IFV0aWxzLmZpbmRMYW5ndWFnZUlkQnlJc28oXG4gICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgKTtcbiAgICByZXR1cm4gY3VycmVudExhbmd1YWdlSWQ7XG4gIH1cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEZvcm1seUNvbmZpZ0FzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RlcHNTZXR0aW5ncyA9IHtcbiAgICAgIHNob3dDb3VudGVyOiB0aGlzLnNob3dEaXNwbGF5TW9kZVxuICAgICAgICA/IGZhbHNlXG4gICAgICAgIDogdGhpcy5nZW5lcmFsRGF0YS5zaG93Q291bnRlclN0ZXAsXG4gICAgICBzaG93TGFiZWxzOiB0aGlzLnNob3dEaXNwbGF5TW9kZSA/IGZhbHNlIDogdGhpcy5nZW5lcmFsRGF0YS5zaG93TmFtZVN0ZXAsXG4gICAgICBzaG93QWxsU3RlcHM6IHRoaXMuc2hvd0Rpc3BsYXlNb2RlXG4gICAgICAgID8gZmFsc2VcbiAgICAgICAgOiB0aGlzLmdlbmVyYWxEYXRhLnNob3dBbGxTdGVwcyxcbiAgICAgIHNob3dQcm9ncmVzc0JhcjpcbiAgICAgICAgdGhpcy5nZW5lcmFsRGF0YS5zaG93UHJvZ3Jlc3NCYXIgJiZcbiAgICAgICAgICB0aGlzLmdlbmVyYWxEYXRhLnNob3dBbGxTdGVwcyA9PSBmYWxzZVxuICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgIDogZmFsc2UsXG4gICAgfTtcblxuICAgIHRoaXMuZm9ybWx5QWxsU3RlcHMgPSBhd2FpdCB0aGlzLmJ1aWxkRm9ybWx5RmllbGRHcm91cEFzeW5jKCk7XG4gICAgdmFyIGhhc0RpY3Rpb25hcnlEZXBlbmRlbnRTdGVwcyA9IHRoaXMuZm9ybWx5QWxsU3RlcHMuc29tZShcbiAgICAgIChmKSA9PiBmLnByb3BzPy5bJ2RlcGVuZGVudERpY3Rpb25hcnknXT8uaXNEaWN0aW9uYXJ5RGVwZW5kZW50XG4gICAgKTtcblxuICAgIHZhciBmb3JtbHlGaWx0ZXJlZFN0ZXBzID0gdGhpcy5nZXRGb3JtbHlGaWx0ZXJlZFN0ZXBzKCk7XG4gICAgdmFyIGZpbHRlcmVkU3RlcHNJZGVudGlmaWVycyA9IGZvcm1seUZpbHRlcmVkU3RlcHMubWFwKFxuICAgICAgKGYpID0+IGYucHJvcHM/Llsnc3RlcElkJ11cbiAgICApO1xuICAgIC8vIEdldCB2aXNpYmxlIHN0ZXBzIGZvciBhY2N1cmF0ZSBzdGVwIGNvdW50aW5nXG4gICAgY29uc3QgdmlzaWJsZVN0ZXBzID0gdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5maWx0ZXJWaXNpYmxlU3RlcHModGhpcy5mbHV4KTtcbiAgICBjb25zdCBmaWx0ZXJlZFZpc2libGVTdGVwcyA9IHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZmlsdGVyVmlzaWJsZVN0ZXBzKFxuICAgICAgdGhpcy5mbHV4LFxuICAgICAgZmlsdGVyZWRTdGVwc0lkZW50aWZpZXJzXG4gICAgKTtcblxuICAgIHRoaXMuZm9ybWx5Q29uZmlnID0gW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnc3RlcHBlcicsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmZpbGxEYXRhXG4gICAgICAgICAgICA/IHRoaXMuZmlsbERhdGE/Lm1ldGFkYXRhPy5hcHBEYXRhSWRcbiAgICAgICAgICAgIDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgICBkZXNpZ246IHRoaXMuZGVzaWduLFxuICAgICAgICAgIGFwcGxpY2F0aW9uSWQ6IHRoaXMuYXBwTW9kZWwuYXBwbGljYXRpb25VdWlkLFxuICAgICAgICAgIGZsdXg6IHZpc2libGVTdGVwcywgLy8gUGFzcyBvbmx5IHZpc2libGUgc3RlcHMgdG8gc3RlcHBlclxuICAgICAgICAgIGZpbHRlcmVkRmx1eDogZmlsdGVyZWRWaXNpYmxlU3RlcHMsXG4gICAgICAgICAgaXNEaXNwbGF5TW9kZTogdGhpcy5zaG93RGlzcGxheU1vZGUsXG4gICAgICAgICAgZmlsbERhdGE6IHRoaXMuZmlsbERhdGEsXG4gICAgICAgICAgaW5pdEZsb3dWYWx1ZXM6IHRoaXMuaW5pdEZsb3dWYWx1ZXMsXG4gICAgICAgICAgZGVmYXVsdExhbmd1YWdlOiB0aGlzLmFwcE1vZGVsLmdlbmVyYWxEYXRhLmRlZmF1bHRMYW5ndWFnZSxcbiAgICAgICAgICBkaXNwbGF5OiB0aGlzLmRpc3BsYXksXG4gICAgICAgICAgZGVzaWduQ29uZmlnOiB7XG4gICAgICAgICAgICBidXR0b25zVmVydGljYWxQb3NpdGlvbjpcbiAgICAgICAgICAgICAgdGhpcy5hcHBNb2RlbC5kZXNpZ24uYnV0dG9uc1ZlcnRpY2FsUG9zaXRpb24sXG4gICAgICAgICAgICBidXR0b25zSG9yaXpvbnRhbFBvc2l0aW9uOlxuICAgICAgICAgICAgICB0aGlzLmFwcE1vZGVsLmRlc2lnbi5idXR0b25zSG9yaXpvbnRhbFBvc2l0aW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RlcHNTZXR0aW5nczogdGhpcy5zdGVwc1NldHRpbmdzLFxuICAgICAgICAgIG1ldGFEYXRhOiB0aGlzLmZpbGxEYXRhPy5tZXRhZGF0YSxcbiAgICAgICAgICBkZW1vTW9kZTogdGhpcy5pc0RlbW9Nb2RlLFxuICAgICAgICAgIGlzRGVidWc6IHRoaXMuaXNEZWJ1ZyxcbiAgICAgICAgICBub0J1dHRvbnNJblZpZXc6IHRoaXMubm9CdXR0b25zSW5WaWV3LFxuICAgICAgICAgIGJsb2NrUHJldmlvdXNTdGVwOiB0aGlzLmJsb2NrUHJldmlvdXNTdGVwLFxuICAgICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgICAgaGFzRGljdGlvbmFyeURlcGVuZGVudFN0ZXBzOiBoYXNEaWN0aW9uYXJ5RGVwZW5kZW50U3RlcHMsXG4gICAgICAgICAgaGFzQWN0aW9uU3RlcHM6IHRoaXMuZmx1eC5zb21lKChzdGVwKSA9PlxuICAgICAgICAgICAgdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5pc0FjdGlvblN0ZXAoc3RlcClcbiAgICAgICAgICApLCAvLyBJbmRpY2F0ZSBpZiB0aGVyZSBhcmUgYWN0aW9uIHN0ZXBzXG4gICAgICAgICAgY29tcGxldGlvbkV2ZW50OiAoKSA9PiB0aGlzLm9uQ29tcGxldGlvbigpLFxuICAgICAgICAgIG9uU2VsZWN0ZWRQYWdlQ2hhbmdpbmc6IChpbmRleDogbnVtYmVyKSA9PlxuICAgICAgICAgICAgdGhpcy5vblNlbGVjdGVkUGFnZUNoYW5naW5nKGluZGV4KSxcbiAgICAgICAgICBvblNlbGVjdGVkUGFnZUNoYW5nZWQ6IChpbmRleDogbnVtYmVyKSA9PlxuICAgICAgICAgICAgdGhpcy5vblNlbGVjdGVkUGFnZUNoYW5nZWQoaW5kZXgpLFxuICAgICAgICB9LFxuICAgICAgICBmaWVsZEdyb3VwOiBmb3JtbHlGaWx0ZXJlZFN0ZXBzLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgLy8gRm9yIGRpc3BsYXkgbW9kZSwgcG9wdWxhdGUgdmFsdWVzIGltbWVkaWF0ZWx5IGFmdGVyIGNvbmZpZyBpcyBidWlsdFxuICAgIGlmICh0aGlzLnNob3dEaXNwbGF5TW9kZSAmJiB0aGlzLmZvcm1seUNvbmZpZ1swXT8uZmllbGRHcm91cCkge1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHRoaXMuZm9ybWx5Q29uZmlnWzBdLmZpZWxkR3JvdXApIHtcbiAgICAgICAgdGhpcy5zZXRQcmVzZW50YXRpb25Db250cm9sVmFsdWVzUmVjdXJzaXZlbHkoc3RlcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvblNlbGVjdGVkUGFnZUNoYW5naW5nKHN0ZXBUcmFuc2l0aW9uOiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgZnJvbUluZGV4OiBudW1iZXI7XG4gICAgbGV0IHRvSW5kZXg6IG51bWJlcjtcbiAgICBsZXQgY2FsbGJhY2s6ICgpID0+IHZvaWQgPSAoKSA9PiB7IH07XG5cbiAgICBpZiAodHlwZW9mIHN0ZXBUcmFuc2l0aW9uID09PSAnbnVtYmVyJykge1xuICAgICAgdG9JbmRleCA9IHN0ZXBUcmFuc2l0aW9uO1xuICAgICAgZnJvbUluZGV4ID0gdGhpcy5hY3RpdmVTdGVwO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcm9tSW5kZXggPSBzdGVwVHJhbnNpdGlvbi5mcm9tO1xuICAgICAgdG9JbmRleCA9IHN0ZXBUcmFuc2l0aW9uLnRvO1xuICAgICAgY2FsbGJhY2sgPSBzdGVwVHJhbnNpdGlvbi5jYWxsYmFjayB8fCAoKCkgPT4geyB9KTtcbiAgICB9XG5cbiAgICBsZXQgYWN0aW9uc0V4ZWN1dGVkID0gZmFsc2U7XG5cbiAgICBpZiAodG9JbmRleCA+IGZyb21JbmRleCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICfinqHvuI8gTW92aW5nIGZvcndhcmQgLSBleGVjdXRpbmcgYWN0aW9uIHN0ZXBzIGFmdGVyIGN1cnJlbnQgc3RlcCdcbiAgICAgICk7XG4gICAgICBhY3Rpb25zRXhlY3V0ZWQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBY3Rpb25TdGVwc0FmdGVyQ3VycmVudFN0ZXAoXG4gICAgICAgIGZyb21JbmRleFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHRvSW5kZXggPCBmcm9tSW5kZXgpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfirIXvuI8gTW92aW5nIGJhY2t3YXJkIC0gbm8gYWN0aW9uIGV4ZWN1dGlvbiBuZWVkZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ/CflIQgU3RheWluZyBvbiBzYW1lIHN0ZXAgLSBubyBhY3Rpb24gZXhlY3V0aW9uIG5lZWRlZCcpO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aXZlU3RlcCA9IHRvSW5kZXg7XG5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvbnNFeGVjdXRlZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUFjdGlvblN0ZXBzQWZ0ZXJDdXJyZW50U3RlcChcbiAgICBjdXJyZW50U3RlcEluZGV4OiBudW1iZXJcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuaXNFeGVjdXRpbmdBY3Rpb25zKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IGZpbHRlcmVkU3RlcHMgPSB0aGlzLmZsdXguZmlsdGVyKChzKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHMuZGVwZW5kZW50RGljdGlvbmFyeSAmJlxuICAgICAgICBzLmRlcGVuZGVudERpY3Rpb25hcnkuaXNEaWN0aW9uYXJ5RGVwZW5kZW50XG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbW9kZWxWYWx1ZSA9IHRoaXMubW9kZWxbcy5kZXBlbmRlbnREaWN0aW9uYXJ5LmRpY3Rpb25hcnlDb250cm9sSWRlbnRpZmllcl07XG4gICAgICAgIC8vIFNraXAgZGVwZW5kZW5jeSBjaGVjayBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uIChhcnJheSlcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobW9kZWxWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gbW9kZWxWYWx1ZT8uaWQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzZWxlY3RlZFZhbHVlICYmXG4gICAgICAgICAgcy5kZXBlbmRlbnREaWN0aW9uYXJ5LmRlcGVuZGVudFZhbHVlSWRzLmluY2x1ZGVzKHNlbGVjdGVkVmFsdWUpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgYWN0aW9uU3RlcHMgPSB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmdldEFjdGlvblN0ZXBzQXRJbmRleChcbiAgICAgIGZpbHRlcmVkU3RlcHMsXG4gICAgICBjdXJyZW50U3RlcEluZGV4XG4gICAgKTtcblxuICAgIGlmIChhY3Rpb25TdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5hcHBEYXRhVXVpZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgc2F2aW5nIGZsYWcgYmVmb3JlIHN0YXJ0aW5nIGFjdGlvbnNcbiAgICAgIHRoaXMuaXNTYXZpbmdBZnRlckFjdGlvbnMgPSB0cnVlO1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmV4ZWN1dGVBY3Rpb25TdGVwcyhcbiAgICAgICAgYWN0aW9uU3RlcHMsXG4gICAgICAgIHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIChzdGVwKSA9PiB7XG4gICAgICAgICAgY29uc3QgbG9hZGluZ01lc3NhZ2UgPSBVdGlscy5maW5kVHJhbnNsYXRpb25JbmZvKFxuICAgICAgICAgICAgJ2xvYWRpbmdNZXNzYWdlVHJhbnNsYXRpb25zJyxcbiAgICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2UgPSBsb2FkaW5nTWVzc2FnZSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ+KchSBBY3Rpb24gc3RlcHMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgIC8vIEtlZXAgbG9hZGluZyBzdGF0ZSB0cnVlIC0gaXQgd2lsbCBiZSBjbGVhcmVkIGFmdGVyIHNhdmVBcHBEYXRhU3RlcCBjb21wbGV0ZXNcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgQWN0aW9uIHN0ZXBzIGV4ZWN1dGlvbiBmYWlsZWQ6JywgcmVzdWx0LmVycm9yKTtcbiAgICAgICAgdGhpcy5pc1NhdmluZ0FmdGVyQWN0aW9ucyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBFcnJvciBleGVjdXRpbmcgYWN0aW9uIHN0ZXBzOicsIGVycm9yKTtcbiAgICAgIHRoaXMuaXNTYXZpbmdBZnRlckFjdGlvbnMgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblNlbGVjdGVkUGFnZUNoYW5nZWQoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmZvcm1seUNvbmZpZ1swXS5maWVsZEdyb3VwKSB7XG4gICAgICB2YXIgc2VsZWN0ZWRQYWdlID0gdGhpcy5mb3JtbHlDb25maWdbMF0uZmllbGRHcm91cFtpbmRleF07XG4gICAgICB0aGlzLnNldFByZXNlbnRhdGlvbkNvbnRyb2xWYWx1ZXNSZWN1cnNpdmVseShzZWxlY3RlZFBhZ2UpO1xuXG4gICAgICBNb2RlbFBvcHVsYXRpb25IZWxwZXIuYXBwbHlQcmVjb21wbGV0aW9uVG9Nb2RlbCh0aGlzLm1vZGVsLCB0aGlzLmZsdXgpO1xuICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUodGhpcy5tb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcmVzZW50YXRpb25Db250cm9sVmFsdWVzUmVjdXJzaXZlbHkoZmM/OiBhbnkpIHtcbiAgICBmYz8uZmllbGRHcm91cD8uZm9yRWFjaCgoZmc6IGFueSkgPT4ge1xuICAgICAgaWYgKGZnLnByb3BzICYmIGZnLnByb3BzWydpc0Rpc3BsYXlNb2RlJ10gPT09IHRydWUpIHtcbiAgICAgICAgdmFyIG1ldGhvZEZpZWxkSWQgPSBmZy5wcm9wc1snYXBpTWV0aG9kRmllbGRJZCddO1xuICAgICAgICBpZiAobWV0aG9kRmllbGRJZCkge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZmluZEluQXBpQ2FsbHNSZXNwb25zZXMobWV0aG9kRmllbGRJZCk7XG4gICAgICAgICAgZmcuZGVmYXVsdFZhbHVlID0gdmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBhc3NvY2lhdGVkQ29udHJvbElkID0gZmcucHJvcHNbJ2NvbGxlY3Rpb25Db250cm9sSWRlbnRpZmllciddO1xuICAgICAgICAgIGlmIChhc3NvY2lhdGVkQ29udHJvbElkKSB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZCA9XG4gICAgICAgICAgICAgIHRoaXMuZmluZENvbnRyb2xJbkZpbGxEYXRhQ29udHJvbHMoYXNzb2NpYXRlZENvbnRyb2xJZCk7XG4gICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgLy8gTXVsdGlwbGUgc2VsZWN0aW9uIC0gc2hvdyB2YWx1ZXMgd2l0aCBjb21tYVxuICAgICAgICAgICAgICBjb25zdCB2YWx1ZUlkc0FycmF5ID0gZm91bmQuZmlsbFZhbHVlSWRzIHx8IGZvdW5kLmZpbGx2YWx1ZWlkcyB8fCBmb3VuZC5GaWxsVmFsdWVJZHM7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlc0FycmF5ID0gZm91bmQuZmlsbFZhbHVlcyB8fCBmb3VuZC5maWxsdmFsdWVzIHx8IGZvdW5kLkZpbGxWYWx1ZXM7XG5cbiAgICAgICAgICAgICAgaWYgKHZhbHVlSWRzQXJyYXkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZUlkc0FycmF5KSAmJiB2YWx1ZUlkc0FycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2VJZCA9IHRoaXMuZ2V0Q3VycmVudExhbmd1YWdlSWQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWVJZCBvZiB2YWx1ZUlkc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBudW1lcmljVmFsdWVJZCA9IHR5cGVvZiB2YWx1ZUlkID09PSAnc3RyaW5nJyA/IHBhcnNlSW50KHZhbHVlSWQsIDEwKSA6IHZhbHVlSWQ7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRpY3RdIG9mIHRoaXMuZGljdGlvbmFyeU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkaWN0LnZhbHVlcz8uZmluZCgodikgPT4gdi5pZCA9PT0gbnVtZXJpY1ZhbHVlSWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHZhbHVlLnZhbHVlVHJhbnNsYXRpb25zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAodCkgPT4gdC5sYW5ndWFnZUlkID09IGN1cnJlbnRMYW5ndWFnZUlkXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWVzLnB1c2godHJhbnNsYXRpb24/LnZhbHVlIHx8IHZhbHVlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5VmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IGRpc3BsYXlWYWx1ZXMuam9pbignLCAnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVzQXJyYXkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZXNBcnJheSkgJiYgdmFsdWVzQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiB1c2UgZmlsbFZhbHVlcyBhcnJheSBkaXJlY3RseVxuICAgICAgICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IHZhbHVlc0FycmF5LmpvaW4oJywgJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm91bmQuZmlsbFZhbHVlSWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2VJZCA9IHRoaXMuZ2V0Q3VycmVudExhbmd1YWdlSWQoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRpY3RdIG9mIHRoaXMuZGljdGlvbmFyeU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGljdC52YWx1ZXM/LmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICh2KSA9PiB2LmlkID09IGZvdW5kLmZpbGxWYWx1ZUlkXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdmFsdWUudmFsdWVUcmFuc2xhdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAodCkgPT4gdC5sYW5ndWFnZUlkID09IGN1cnJlbnRMYW5ndWFnZUlkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IHRyYW5zbGF0aW9uLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IGZvdW5kLmZpbGxWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5maW5kSW5BcGlDYWxsc1Jlc3BvbnNlcyhhc3NvY2lhdGVkQ29udHJvbElkKTtcbiAgICAgICAgICAgICAgZmcuZGVmYXVsdFZhbHVlID0gdmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRQcmVzZW50YXRpb25Db250cm9sVmFsdWVzUmVjdXJzaXZlbHkoZmcpO1xuICAgICAgfVxuICAgICAgaWYgKGZnLnByb3BzWydjZHInXSkge1xuICAgICAgICBmZy5wcm9wc1snY2RyJ10uZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQ29udHJvbEluRmlsbERhdGFDb250cm9scyhjb250cm9sSWQ6IHN0cmluZyk6IGFueSB7XG4gICAgbGV0IGNvbnRyb2xEYXRhOiBhbnkgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuZmlsbERhdGEpIHtcbiAgICAgIHRoaXMuZmlsbERhdGEuZmx1eD8uZm9yRWFjaCgoZjogYW55KSA9PiB7XG4gICAgICAgIGlmICghY29udHJvbERhdGEpIHtcbiAgICAgICAgICBmLnNlY3Rpb25zPy5mb3JFYWNoKChzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmICghY29udHJvbERhdGEpIHtcbiAgICAgICAgICAgICAgY29udHJvbERhdGEgPSBzLmNvbnRyb2xzPy5maW5kKFxuICAgICAgICAgICAgICAgIChjOiBhbnkpID0+IGMuY29udHJvbElkID09PSBjb250cm9sSWRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGNvbnRyb2xEYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xEYXRhO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbERhdGE7XG4gIH1cblxuICBwcml2YXRlIGZpbmRJbkFwaUNhbGxzUmVzcG9uc2VzKGZpZWxkSWQ6IHN0cmluZyk6IGFueSB7XG4gICAgbGV0IGZvdW5kVmFsdWU6IGFueSA9IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5maWxsRGF0YSkge1xuICAgICAgdGhpcy5maWxsRGF0YS5BUElDYWxscz8uZm9yRWFjaCgoYXBpOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFmb3VuZFZhbHVlKSB7XG4gICAgICAgICAgYXBpLk1ldGhvZHM/LmZvckVhY2goKG06IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFmb3VuZFZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gbS5GaWVsZHM/LltmaWVsZElkXTtcbiAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgZm91bmRWYWx1ZSA9IGZvdW5kO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZm91bmRWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rm9ybWx5RmlsdGVyZWRTdGVwcygpIHtcbiAgICBsZXQgc3RlcHMgPSB0aGlzLmZvcm1seUFsbFN0ZXBzLmZpbHRlcigocykgPT4ge1xuICAgICAgaWYgKHMucHJvcHMgJiYgcy5wcm9wc1snZGVwZW5kZW50RGljdGlvbmFyeSddKSB7XG4gICAgICAgIGNvbnN0IGRlcERpY3QgPSBzLnByb3BzW1xuICAgICAgICAgICdkZXBlbmRlbnREaWN0aW9uYXJ5J1xuICAgICAgICBdIGFzIERlcGVuZGVudERpY3Rpb25hcnlEYXRhO1xuICAgICAgICBpZiAoZGVwRGljdCAmJiBkZXBEaWN0LmlzRGljdGlvbmFyeURlcGVuZGVudCkge1xuICAgICAgICAgIGNvbnN0IG1vZGVsVmFsdWUgPSB0aGlzLm1vZGVsW2RlcERpY3QuZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyXTtcbiAgICAgICAgICAvLyBTa2lwIGRlcGVuZGVuY3kgY2hlY2sgZm9yIG11bHRpcGxlIHNlbGVjdGlvbiAoYXJyYXkpXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobW9kZWxWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gbW9kZWxWYWx1ZT8uaWQ7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZSAmJlxuICAgICAgICAgICAgZGVwRGljdC5kZXBlbmRlbnRWYWx1ZUlkcy5pbmNsdWRlcyhzZWxlY3RlZFZhbHVlKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3RlcHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkRm9ybWx5RmllbGRHcm91cEFzeW5jKCk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWdbXT4ge1xuICAgIHRoaXMuc3RlcERpY3Rpb25hcnlEZXBlbmRlbnRJZHMgPSBbXTtcbiAgICBpZiAodGhpcy5zaG93RGlzcGxheU1vZGUpIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSBhd2FpdCB0aGlzLmJ1aWREaXNwbGF5U3RlcCgpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbc3RlcF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaWx0ZXIgb3V0IGFjdGlvbiBzdGVwcyBmcm9tIHZpc2libGUgc3RlcHNcbiAgICAgIGNvbnN0IHZpc2libGVTdGVwcyA9IHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZmlsdGVyVmlzaWJsZVN0ZXBzKHRoaXMuZmx1eCk7XG4gICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHZpc2libGVTdGVwcy5tYXAoKHN0ZXApID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZEZvcm1seUZpZWxkQ29uZmlnQXN5bmMoc3RlcCk7XG4gICAgICAgIH0pID8/IFtdXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRGb3JtbHlGaWVsZENvbmZpZ0FzeW5jKFxuICAgIHN0ZXA6IFN0ZXBEYXRhXG4gICk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWc+IHtcbiAgICBsZXQgc3RlcEZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7fTtcblxuICAgIGlmIChzdGVwLnR5cGUgIT09IEZsdXhUeXBlLkN1c3RvbSAmJiBzdGVwLnR5cGUgIT09IEZsdXhUeXBlLkZpbmFsKSB7XG4gICAgICBzdGVwRm9ybWx5Q29uZmlnID0gYXdhaXQgdGhpcy5idWlsZFN5c3RlbUZpZWxkRm9ybWx5Q29uZmlnKHN0ZXApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGVwRm9ybWx5Q29uZmlnID0ge1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIGxhYmVsOiBzdGVwLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHN0ZXAubmFtZSxcbiAgICAgICAgICBidXR0b25zOiB0aGlzLmNvbnN0cnVjdEJ1dHRvbnMoc3RlcC5idXR0b25zKSxcbiAgICAgICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5OiBzdGVwLmRlcGVuZGVudERpY3Rpb25hcnksXG4gICAgICAgICAgc3RlcElkOiBzdGVwLmlkZW50aWZpZXIsXG4gICAgICAgIH0sXG4gICAgICAgIGZpZWxkR3JvdXA6IGF3YWl0IHRoaXMuYnVpbGRTZWN0aW9uc0ZpZWxkR3JvdXBBc3luYyhcbiAgICAgICAgICBzdGVwLFxuICAgICAgICAgIHN0ZXAuc2VjdGlvbnNcbiAgICAgICAgKSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChzdGVwLnRyYW5zbGF0aW9ucykge1xuICAgICAgICBzdGVwRm9ybWx5Q29uZmlnLnByb3BzIVsnbGFiZWwnXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgJ25hbWUnLFxuICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG4gICAgICAgIHN0ZXBGb3JtbHlDb25maWcucHJvcHMhWydkZXNjcmlwdGlvbiddID0gVXRpbHMuZmluZFRyYW5zbGF0aW9uSW5mbyhcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0ZXBGb3JtbHlDb25maWcgJiYgc3RlcEZvcm1seUNvbmZpZy5wcm9wcykge1xuICAgICAgdGhpcy5zZXRTdGVwQmFzZVByb3BzKHN0ZXAsIHN0ZXBGb3JtbHlDb25maWcpO1xuICAgIH1cbiAgICBpZiAoc3RlcC5kZXBlbmRlbnREaWN0aW9uYXJ5Py5pc0RpY3Rpb25hcnlEZXBlbmRlbnQpIHtcbiAgICAgIHRoaXMuc3RlcERpY3Rpb25hcnlEZXBlbmRlbnRJZHMucHVzaChcbiAgICAgICAgc3RlcC5kZXBlbmRlbnREaWN0aW9uYXJ5LmRpY3Rpb25hcnlDb250cm9sSWRlbnRpZmllclxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBGb3JtbHlDb25maWc7XG4gIH1cblxuICB0cmlnZ2VyQ29tcG9uZW50VXBkYXRlKGNvbnRyb2xJZDogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zZXRGb3JtbHlGaWVsZFZhbHVlKHRoaXMuZm9ybWx5QWxsU3RlcHMsIGNvbnRyb2xJZCwgdmFsdWUpO1xuICB9XG5cbiAgc2V0Rm9ybWx5RmllbGRWYWx1ZShcbiAgICBmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10gfCB1bmRlZmluZWQsXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWZpZWxkcykgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZC5rZXkgPT09IGtleSkge1xuICAgICAgICBpZiAoZmllbGQuZm9ybUNvbnRyb2wpIHtcbiAgICAgICAgICBmaWVsZC5mb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpZWxkLmZpZWxkR3JvdXAgJiYgQXJyYXkuaXNBcnJheShmaWVsZC5maWVsZEdyb3VwKSkge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuc2V0Rm9ybWx5RmllbGRWYWx1ZShmaWVsZC5maWVsZEdyb3VwLCBrZXksIHZhbHVlKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkU3lzdGVtRmllbGRGb3JtbHlDb25maWcoXG4gICAgc3RlcDogU3RlcERhdGFcbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZz4ge1xuICAgIGNvbnN0IGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7XG4gICAgICBwcm9wczoge1xuICAgICAgICBsYWJlbDogc3RlcC5uYW1lLFxuICAgICAgICBidXR0b25zOiB0aGlzLmNvbnN0cnVjdEJ1dHRvbnMoc3RlcC5idXR0b25zKSxcbiAgICAgICAgZmx1eFR5cGU6IHN0ZXAudHlwZSxcbiAgICAgIH0sXG4gICAgICBmaWVsZEdyb3VwOiBbXSxcbiAgICB9O1xuXG4gICAgdGhpcy5zZXRTdGVwQmFzZVByb3BzKHN0ZXAsIGZvcm1seUNvbmZpZyk7XG4gICAgdmFyIGZpZWxkQ29uZmlnID0gdGhpcy5jcmVhdGVGb3JtbHlTeXN0ZW1GaWVsZENvbmZpZyhzdGVwKTtcblxuICAgIGlmIChmaWVsZENvbmZpZykge1xuICAgICAgaWYgKHN0ZXAudHJhbnNsYXRpb25zKSB7XG4gICAgICAgIGxldCBsYWJlbHM6IGFueSA9IHt9O1xuICAgICAgICBzdGVwLnRyYW5zbGF0aW9ucy5mb3JFYWNoKCh0cjogVHJhbnNsYXRpb25JbmZvKSA9PiB7XG4gICAgICAgICAgbGFiZWxzW3RyLm5hbWVdID0gVXRpbHMuZmluZFRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgdHIudmFsdWVzLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgZmllbGRDb25maWcucHJvcHMhWydsYWJlbHMnXSA9IGxhYmVscztcbiAgICAgICAgZmllbGRDb25maWcucHJvcHMhWyduYW1lJ10gPSBVdGlscy5maW5kVHJhbnNsYXRpb25JbmZvKFxuICAgICAgICAgICduYW1lJyxcbiAgICAgICAgICBzdGVwLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApO1xuICAgICAgICBmaWVsZENvbmZpZy5wcm9wcyFbJ2Rlc2NyaXB0aW9uJ10gPSBVdGlscy5maW5kVHJhbnNsYXRpb25JbmZvKFxuICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgc3RlcC50cmFuc2xhdGlvbnMsXG4gICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKTtcbiAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnbGFiZWwnXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgJ25hbWUnLFxuICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG4gICAgICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2Rlc2NyaXB0aW9uJ10gPSBVdGlscy5maW5kVHJhbnNsYXRpb25JbmZvKFxuICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgc3RlcC50cmFuc2xhdGlvbnMsXG4gICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGZpZWxkQ29uZmlnLnByb3BzIVsnc3RlcHNTZXR0aW5ncyddID0gdGhpcy5zdGVwc1NldHRpbmdzO1xuICAgICAgZm9ybWx5Q29uZmlnLmZpZWxkR3JvdXAhLnB1c2goZmllbGRDb25maWcpO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtbHlDb25maWc7XG4gIH1cblxuICBwcml2YXRlIHNldFN0ZXBCYXNlUHJvcHMoc3RlcDogU3RlcERhdGEsIGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcpIHtcbiAgICBpZiAoZm9ybWx5Q29uZmlnLnByb3BzKSB7XG4gICAgICBmb3JtbHlDb25maWcucHJvcHNbJ25hbWUnXSA9IHN0ZXAubmFtZTtcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wc1snZmx1eFR5cGUnXSA9IHN0ZXAudHlwZTtcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wc1snc3RlcElkJ10gPSBzdGVwLmlkZW50aWZpZXI7XG4gICAgICBmb3JtbHlDb25maWcucHJvcHNbJ2lzVmlzaWJsZSddID0gc3RlcC5pc1Zpc2libGU7XG4gICAgICBmb3JtbHlDb25maWcucHJvcHNbJ2RlcGVuZGVudERpY3Rpb25hcnknXSA9IHN0ZXAuZGVwZW5kZW50RGljdGlvbmFyeTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZVNpZ25GaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1zaWduLWNvbXBvbmVudCcsXG4gICAgICBwcm9wczoge1xuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIHN0ZXBEYXRhOiBzdGVwLFxuICAgICAgICBkZXNpZ246IHRoaXMuZGVzaWduLFxuICAgICAgICBlbnY6IHRoaXMuZW52LFxuICAgICAgICBmbHV4OiB0aGlzLmZsdXgsXG4gICAgICAgIHBhcmVudEZvcm06IHRoaXMuZm9ybSxcbiAgICAgICAgZ2V0TW9kZWw6ICgpID0+IHRoaXMubW9kZWwsXG4gICAgICAgIGV2ZW50OiBhc3luYyAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChldmVudCA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0ZXBwZXJHb05leHRBc3luYygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlRG93bmxvYWREb2NzRmllbGRDb25maWcoXG4gICAgY29udHJvbERhdGE6IEJhc2VDb250cm9sXG4gICk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1kb3dubG9hZC1kb2N1bWVudHMtY29tcG9uZW50JyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGFwcElkOiB0aGlzLmFwcE1vZGVsLmFwcGxpY2F0aW9uVXVpZCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBjb250cm9sRGF0YTogY29udHJvbERhdGEsXG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGRvY3VtZW50c0RhdGE6IHRoaXMuYXBwTW9kZWwuZG9jdW1lbnRzLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlVmlld0RvY3NGaWVsZENvbmZpZyhcbiAgICBjb250cm9sRGF0YTogQmFzZUNvbnRyb2xcbiAgKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXZpZXctZG9jdW1lbnRzLWNvbXBvbmVudCcsXG4gICAgICBwcm9wczoge1xuICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgY29udHJvbERhdGE6IGNvbnRyb2xEYXRhLFxuICAgICAgICBlbnY6IHRoaXMuZW52LFxuICAgICAgICBkb2N1bWVudHNEYXRhOiB0aGlzLmFwcE1vZGVsLmRvY3VtZW50cyxcbiAgICAgICAgbGFuZ0lzbzogdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZVVwbG9hZERvY3NGaWVsZENvbmZpZyhcbiAgICBjb250cm9sRGF0YTogQmFzZUNvbnRyb2xcbiAgKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXVwbG9hZC1kb2N1bWVudHMtY29tcG9uZW50JyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGFwcElkOiB0aGlzLmFwcE1vZGVsLmFwcGxpY2F0aW9uVXVpZCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBjb250cm9sRGF0YTogY29udHJvbERhdGEsXG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGRvY3VtZW50c0RhdGE6IHRoaXMuYXBwTW9kZWwuZG9jdW1lbnRzLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlR2VuZXJhdGVEb2NzRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktZ2VuZXJhdGUtZG9jdW1lbnRzLWNvbXBvbmVudCcsXG4gICAgICBwcm9wczoge1xuICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGRvY3VtZW50c0RhdGE6IHRoaXMuYXBwTW9kZWwuZG9jdW1lbnRzLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgZXZlbnQ6IGFzeW5jIChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50ID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RlcHBlckdvTmV4dEFzeW5jKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc3RlcHBlckdvTmV4dEFzeW5jKCkge1xuICAgIGNvbnN0IHN0ZXBwZXJDb21wb25lbnQgPSB0aGlzLmZvcm1seUNvbmZpZ1swXS5wcm9wcyFbJ2NvbXBvbmVudCddO1xuICAgIGlmIChzdGVwcGVyQ29tcG9uZW50ICYmIHN0ZXBwZXJDb21wb25lbnQubmF2aWdhdGVOZXh0QXN5bmMpIHtcbiAgICAgIGF3YWl0IHN0ZXBwZXJDb21wb25lbnQubmF2aWdhdGVOZXh0QXN5bmMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZUVucm9sbENhcmRGaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICBsZXQgbGFiZWxzOiBhbnkgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhzdGVwLmNvbmZpZykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoa2V5LmVuZHNXaXRoKCdMYWJlbCcpKSB7XG4gICAgICAgIGxhYmVsc1trZXldID1cbiAgICAgICAgICBzdGVwPy5jb25maWdba2V5XT8uZmluZChcbiAgICAgICAgICAgIChpOiB7IGxhbmd1YWdlSXNvOiBzdHJpbmcgfSkgPT5cbiAgICAgICAgICAgICAgaS5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApPy52YWx1ZSA/PyAnJztcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1lbnJvbC1jYXJkLWNvbXBvbmVudCcsXG4gICAgICBwcm9wczoge1xuICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgZGF0YVVybElkOiB0aGlzLmRhdGFVcmxJZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGxhYmVsczogbGFiZWxzLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICBwcml2YXRlIENyZWF0ZUlkU2NhbkZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIGxldCBlcnJvck1lc3NhZ2VzOiBhbnkgPSB7fTtcblxuICAgIGlmIChzdGVwLmVycm9yc1RyYW5zbGF0aW9ucykge1xuICAgICAgc3RlcC5lcnJvcnNUcmFuc2xhdGlvbnMuZm9yRWFjaCgoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICBlcnJvck1lc3NhZ2VzW2Vycm9yLmNvZGVdID0gVXRpbHMuZmluZFRyYW5zbGF0aW9uKFxuICAgICAgICAgIGVycm9yLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktc2Nhbi1pZCcsXG4gICAgICBwcm9wczoge1xuICAgICAgICBjb25maWc6IHN0ZXAuY29uZmlnLFxuICAgICAgICBzdGVwVHlwZTogc3RlcC50eXBlLFxuICAgICAgICBzdGVwSWQ6IHN0ZXAuaWRlbnRpZmllcixcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkIHx8IFV0aWxzLmdlbmVyYXRlVVVJRCgpLFxuICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICAgIGVycm9yTWVzc2FnZXM6IGVycm9yTWVzc2FnZXMsXG4gICAgICAgIGV2ZW50OiAoZXZlbnQ6IGFueSkgPT4gdGhpcy5vbklkU2NhbkNvbXBsZXRlZChldmVudCwgc3RlcCksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZUt5Y0ZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIGNvbnN0IGxvYWRpbmdNc2dUcmFuc2xhdGlvbnMgPSBzdGVwLnRyYW5zbGF0aW9ucz8uZmluZChcbiAgICAgICh0OiBhbnkpID0+IHQubmFtZSA9PT0gJ2xvYWRpbmdNZXNzYWdlVHJhbnNsYXRpb25zJ1xuICAgICk7XG5cbiAgICBjb25zdCB0cmFuc2xhdGVkTG9hZGluZ01lc3NhZ2UgPVxuICAgICAgbG9hZGluZ01zZ1RyYW5zbGF0aW9ucz8udmFsdWVzPy5maW5kKFxuICAgICAgICAodjogYW55KSA9PiB2Lmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgKT8udmFsdWUgfHwgJyc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1pZGVudGlmaWNhdGlvbi1jb21wb25lbnQnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgdG9rZW46IHRoaXMua3ljVG9rZW4sXG4gICAgICAgIGFwaV91cmw6IHRoaXMua3ljQXBpVXJsLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIGVudjogJ0RPQ0tFUicsIC8vIENvbnNpZGVyIG1ha2luZyB0aGlzIGR5bmFtaWMgaWYgbmVlZGVkXG4gICAgICAgIHJlZGlyZWN0X2lkOiB0aGlzLmt5Y1JlZGlyZWN0SWQsXG4gICAgICAgIHBob25lX251bWJlcjogJycsXG4gICAgICAgIGxhbmdfaXNvOiB0aGlzLmt5Y0xhbmdJc28sXG4gICAgICAgIHNob3dfY2l0aXplbnNoaXBfc2VsZWN0b3I6IHRoaXMua3ljU2hvd0NpdGl6ZW5zaGlwLFxuICAgICAgICBzY3JvbGxfbW9kZTogdGhpcy5reWNTY3JvbGxNb2RlLFxuICAgICAgICBtYXhSZXRyaWVzOiBzdGVwLmNvbmZpZz8ubWF4S3ljUmV0cmllcyA/PyAzLFxuICAgICAgICBsb2FkaW5nTWVzc2FnZTogdHJhbnNsYXRlZExvYWRpbmdNZXNzYWdlLFxuICAgICAgICBlY3RDb21wbGV0ZWQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdNZXNzYWdlID0gdHJhbnNsYXRlZExvYWRpbmdNZXNzYWdlO1xuICAgICAgICAgIGF3YWl0IHRoaXMub3JpZ2luRm9ybVNpZ25hbHJIYW5kbGVyU2VydmljZS5pbml0aWF0ZUt5Y1Byb2Nlc3NpbmcoXG4gICAgICAgICAgICB0aGlzLmFwcERhdGFVdWlkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlUGhvbmVFbWFpbEZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXZhbGlkYXRlLWNvbnRhY3QtaW5mbycsXG4gICAgICBwcm9wczoge1xuICAgICAgICBzdGVwRGF0YTogc3RlcCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBkZXNpZ246IHRoaXMuZGVzaWduLFxuICAgICAgICBldmVudDogYXN5bmMgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQgPT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGVwcGVyR29OZXh0QXN5bmMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZVZpZXdPZmZlckZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXZpZXctb2ZmZXJzJyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGFwcE1vZGVsOiB0aGlzLmFwcE1vZGVsLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgZXZlbnQ6IChldmVudDogYW55KSA9PiB0aGlzLm9uT2ZmZXJTZWxlY3RlZChldmVudCwgc3RlcCksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZVBhdXNlRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktZmllbGQtcGF1c2UnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgaWRlbnRpZmllcjogc3RlcC5pZGVudGlmaWVyLFxuICAgICAgICBjb25maWc6IHN0ZXAuY29uZmlnLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIHN0ZXBEYXRhOiBzdGVwLFxuICAgICAgICBlbnY6IHRoaXMuZW52LFxuICAgICAgICBhcHBNb2RlbDogdGhpcy5hcHBNb2RlbCxcbiAgICAgICAgbGFuZ0lzbzogdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZU9wZW5CYW5raW5nRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgLy8gUGFzcyB0aGUgZnVsbCBzdGVwIGRhdGEgd2hpY2ggaW5jbHVkZXMgYWxsIHRyYW5zbGF0aW9uc1xuICAgIC8vIFRoZSBjb21wb25lbnQgd2lsbCBleHRyYWN0IHdoYXQgaXQgbmVlZHMgYmFzZWQgb24gY3VycmVudCBsYW5ndWFnZVxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LW9wZW4tYmFua2luZycsXG4gICAgICBwcm9wczoge1xuICAgICAgICBpZGVudGlmaWVyOiBzdGVwLmlkZW50aWZpZXIsXG4gICAgICAgIGNvbmZpZzogc3RlcC5jb25maWcsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsIC8vIFRoaXMgY29udGFpbnMgdGhlIGZ1bGwgdHJhbnNsYXRpb25zIGFycmF5XG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGFwcE1vZGVsOiB0aGlzLmFwcE1vZGVsLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgbGFiZWxzOiB7XG4gICAgICAgICAgaW5pdGlhbE1lc3NhZ2U6IFV0aWxzLmZpbmRUcmFuc2xhdGlvbihcbiAgICAgICAgICAgIHN0ZXAuY29uZmlnPy5pbml0aWFsTWVzc2FnZVRyYW5zbGF0aW9ucyB8fCBbXSxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKSxcbiAgICAgICAgICB3YWl0aW5nTWVzc2FnZTogVXRpbHMuZmluZFRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgc3RlcC5jb25maWc/LndhaXRpbmdNZXNzYWdlVHJhbnNsYXRpb25zIHx8IFtdLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApLFxuICAgICAgICAgIGNvbnNlbnRFcnJvck1lc3NhZ2U6IFV0aWxzLmZpbmRUcmFuc2xhdGlvbihcbiAgICAgICAgICAgIHN0ZXAuY29uZmlnPy5jb25zZW50RXJyb3JNZXNzYWdlVHJhbnNsYXRpb25zIHx8IFtdLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApLFxuICAgICAgICAgIGNvbXBsZXRpb25NZXNzYWdlOiBVdGlscy5maW5kVHJhbnNsYXRpb24oXG4gICAgICAgICAgICBzdGVwLmNvbmZpZz8uY29tcGxldGlvbk1lc3NhZ2VUcmFuc2xhdGlvbnMgfHwgW10sXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICksXG4gICAgICAgICAgcmV0cnlCdXR0b25MYWJlbDogVXRpbHMuZmluZFRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgc3RlcC5jb25maWc/LnJldHJ5QnV0dG9uTGFiZWxUcmFuc2xhdGlvbnMgfHwgW10sXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIGV2ZW50OiAoZXZlbnQ6IGFueSkgPT4gdGhpcy5vbk9wZW5CYW5raW5nRXZlbnQoZXZlbnQsIHN0ZXApLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVTdGF0dXNGaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1zdGF0dXMnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgY29uZmlnOiBzdGVwLmNvbmZpZyxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgYXBwSWQ6IHRoaXMuYXBwTW9kZWwuYXBwbGljYXRpb25VdWlkLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtbHlTeXN0ZW1GaWVsZENvbmZpZyhcbiAgICBzdGVwOiBTdGVwRGF0YVxuICApOiBGb3JtbHlGaWVsZENvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoIChzdGVwLnR5cGUpIHtcbiAgICAgIGNhc2UgRmx1eFR5cGUuS3ljOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlS3ljRmllbGRDb25maWcoc3RlcCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZsdXhUeXBlLkVtYWlsOlxuICAgICAgY2FzZSBGbHV4VHlwZS5QaG9uZToge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVQaG9uZUVtYWlsRmllbGRDb25maWcoc3RlcCk7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLkFjdGlvbjoge1xuICAgICAgICAvLyBBY3Rpb24gc3RlcHMgYXJlIG5vdyBoYW5kbGVkIGF1dG9tYXRpY2FsbHkgYnkgQWN0aW9uU3RlcEhhbmRsZXJcbiAgICAgICAgLy8gVGhleSBzaG91bGQgbm90IGFwcGVhciBhcyB2aXNpYmxlIGZvcm1seSBjb21wb25lbnRzXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLklkU2Nhbjoge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVJZFNjYW5GaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuR2VuZXJhdGVEb2N1bWVudDoge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVHZW5lcmF0ZURvY3NGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuU2lnbjoge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVTaWduRmllbGRDb25maWcoc3RlcCk7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLlZpZXdPZmZlcjoge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVWaWV3T2ZmZXJGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuU3RhdHVzOiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZVN0YXR1c0ZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5FVVBMQVRFU0M6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlRW5yb2xsQ2FyZEZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5ORVRPUElBOiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZUVucm9sbENhcmRGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuUGF1c2U6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlUGF1c2VGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuT3BlbkJhbmtpbmc6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlT3BlbkJhbmtpbmdGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIG9uT2ZmZXJTZWxlY3RlZChvZmZlcklkOiBhbnksIHN0ZXA6IFN0ZXBEYXRhKSB7XG4gICAgdGhpcy5mb3JtbHlVcGRhdGVBbmRHb05leHQuZW1pdCh7IHNlbGVjdGVkT2ZmZXJJZDogb2ZmZXJJZCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25TaWduRXZlbnQoZXZlbnQ6IGFueSwgc3RlcDogU3RlcERhdGEpIHtcbiAgICBjb25zb2xlLmxvZygnU2lnbiBldmVudCByZWNlaXZlZDonLCBldmVudCk7XG4gICAgdGhpcy51cGRhdGVTdGVwQnV0dG9uU3RhdGUoc3RlcCk7XG4gIH1cblxuICBwcml2YXRlIG9uT3BlbkJhbmtpbmdFdmVudChldmVudDogYW55LCBzdGVwOiBTdGVwRGF0YSkge1xuICAgIGNvbnNvbGUubG9nKCdPcGVuQmFua2luZyBldmVudCByZWNlaXZlZDonLCBldmVudCk7XG4gICAgaWYgKGV2ZW50ID09PSAnc3VjY2VzcycpIHtcbiAgICAgIC8vIE9wZW4gQmFua2luZyBmbG93IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiAgICAgIHRoaXMudXBkYXRlU3RlcEJ1dHRvblN0YXRlKHN0ZXApO1xuICAgICAgLy8gQXV0by1wcm9jZWVkIHRvIG5leHQgc3RlcFxuICAgICAgdGhpcy5mb3JtbHlVcGRhdGVBbmRHb05leHQuZW1pdCh7fSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbklkU2NhbkNvbXBsZXRlZChldmVudDogYW55LCBzdGVwOiBTdGVwRGF0YSkge1xuICAgIGNvbnNvbGUubG9nKCdTaWduIGV2ZW50IHJlY2VpdmVkOicsIGV2ZW50KTtcbiAgICBjb25zdCBmaWxsRGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZmlsbERhdGEpO1xuICAgIGNvbnN0IHN0ZXBGaWxsRGF0YSA9IGZpbGxEYXRhLmZsdXguZmluZChcbiAgICAgIChzOiB7IHN0ZXBJZDogc3RyaW5nIH0pID0+IHMuc3RlcElkID09IHN0ZXAuaWRlbnRpZmllclxuICAgICk7XG4gICAgc3RlcEZpbGxEYXRhLnNlY3Rpb25zLmZvckVhY2goXG4gICAgICAoczoge1xuICAgICAgICBjb250cm9sczoge1xuICAgICAgICAgIGNvbnRyb2xJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGZpbGxWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICB9W107XG4gICAgICB9KSA9PiB7XG4gICAgICAgIHMuY29udHJvbHMuZm9yRWFjaChcbiAgICAgICAgICAoYzoge1xuICAgICAgICAgICAgY29udHJvbElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBmaWxsVmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoYy5jb250cm9sSWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB7XG4gICAgICAgICAgICAgICAgW2MuY29udHJvbElkXToge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IGMuZmlsbFZhbHVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybS5jb250YWlucyhjLmNvbnRyb2xJZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woYy5jb250cm9sSWQsIG5ldyBGb3JtQ29udHJvbChjLmZpbGxWYWx1ZSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLnVwZGF0ZVN0ZXBCdXR0b25TdGF0ZShzdGVwKTtcbiAgfVxuXG4gIHVwZGF0ZVN0ZXBCdXR0b25TdGF0ZShzdGVwOiBTdGVwRGF0YSkge1xuICAgIGxldCBmb3JtbHlTdGVwRmllbGQgPSB0aGlzLmZvcm1seUNvbmZpZ1swXS5maWVsZEdyb3VwPy5maW5kKChmaWVsZCkgPT5cbiAgICAgIGZpZWxkLmZpZWxkR3JvdXA/LmZpbmQoKGYpID0+IGYucHJvcHM/Llsnc3RlcElkJ10gPT09IHN0ZXAuaWRlbnRpZmllcilcbiAgICApO1xuXG4gICAgaWYgKCFmb3JtbHlTdGVwRmllbGQpIHtcbiAgICAgIGZvcm1seVN0ZXBGaWVsZCA9IHRoaXMuZm9ybWx5Q29uZmlnWzBdLmZpZWxkR3JvdXA/LmZpbmQoXG4gICAgICAgIChmaWVsZCkgPT4gZmllbGQucHJvcHM/Llsnc3RlcElkJ10gPT09IHN0ZXAuaWRlbnRpZmllclxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZm9ybWx5U3RlcEZpZWxkKSB7XG4gICAgICBmb3JtbHlTdGVwRmllbGQucHJvcHMgPSB7XG4gICAgICAgIC4uLmZvcm1seVN0ZXBGaWVsZC5wcm9wcyxcbiAgICAgICAgYnV0dG9uc0Rpc2FibGVkOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgICAgdGhpcy5mb3JtbHlDb25maWdVcGRhdGVkLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFJlbmRlcmVkQ3NzKCkge1xuICAgIGNvbnN0IHN0eWxlU3RyaW5nID0gRm9ybUNzc0hlbHBlci5jb252ZXJ0VG9TdHlsZVN0cmluZyhcbiAgICAgIHRoaXMuZGVzaWduLFxuICAgICAgdGhpcy5zaG93RGlzcGxheU1vZGVcbiAgICApO1xuXG4gICAgY29uc3Qgc3R5bGVFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlRWxlbWVudC5pZCA9ICdyZW5kZXJlZC1jc3MnO1xuICAgIGNvbnN0IHJlbmRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZW5kZXJlZC1jc3MnKTtcbiAgICBpZiAocmVuZEVsKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKGRvY3VtZW50LmJvZHksIHJlbmRFbCk7XG4gICAgfVxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoXG4gICAgICBzdHlsZUVsZW1lbnQsXG4gICAgICB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQoVXRpbHMucmVtb3ZlTmV3TGluZXMoc3R5bGVTdHJpbmcpKVxuICAgICk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5ib2R5LCBzdHlsZUVsZW1lbnQpO1xuICB9XG5cbiAgYXN5bmMgYnVpbGRTZWN0aW9uc0ZpZWxkR3JvdXBBc3luYyhcbiAgICBzdGVwOiBTdGVwRGF0YSB8IHVuZGVmaW5lZCxcbiAgICBzZWN0aW9uczogU2VjdGlvbkRhdGFbXVxuICApOiBQcm9taXNlPEZvcm1seUZpZWxkQ29uZmlnW10+IHtcbiAgICBjb25zdCBzdGVwU2VjdGlvbnM6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgc2VjdGlvbnMgJiYgaW5kZXggPCBzZWN0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHNlY3Rpb24gPSBzZWN0aW9uc1tpbmRleF07XG4gICAgICBsZXQgc2VwYXJhdG9yRm9ybWx5Q29uZmlnOiBhbnkgPSB7fTtcbiAgICAgIGlmIChzZWN0aW9uLnNob3dTZWN0aW9uVGl0bGUpIHtcbiAgICAgICAgc2VwYXJhdG9yRm9ybWx5Q29uZmlnID0ge1xuICAgICAgICAgIHR5cGU6ICdzZXBhcmF0b3InLFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICB0aXRsZTpcbiAgICAgICAgICAgICAgc2VjdGlvbi50cmFuc2xhdGlvbnM/LmZpbmQoXG4gICAgICAgICAgICAgICAgKHQ6IGFueSkgPT4gdC5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICAgICAgKT8udmFsdWUgPz8gJycsXG5cbiAgICAgICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ24sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlY3Rpb24uc2hvd1NlY3Rpb25TZXBhcmF0b3IpIHtcbiAgICAgICAgc2VwYXJhdG9yRm9ybWx5Q29uZmlnID0ge1xuICAgICAgICAgIC4uLnNlcGFyYXRvckZvcm1seUNvbmZpZyxcbiAgICAgICAgICB0eXBlOiAnc2VwYXJhdG9yJyxcbiAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgLi4uc2VwYXJhdG9yRm9ybWx5Q29uZmlnLnByb3BzLFxuICAgICAgICAgICAgc2hvd1NlcGFyYXRvcjogc2VjdGlvbi5zaG93U2VjdGlvblNlcGFyYXRvcixcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VjdGlvbi5kZXBlbmRlbnREaWN0aW9uYXJ5KSB7XG4gICAgICAgIHRoaXMuYXR0YWNoVG9EZXBlbmRlbnREaWN0aW9uYXJ5SWZOZWNlc3NhcnkoXG4gICAgICAgICAgc2VjdGlvbi5kZXBlbmRlbnREaWN0aW9uYXJ5LFxuICAgICAgICAgIHNlcGFyYXRvckZvcm1seUNvbmZpZ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc3RlcFNlY3Rpb25zLnB1c2goc2VwYXJhdG9yRm9ybWx5Q29uZmlnKTtcblxuICAgICAgY29uc3Qgc2VjdGlvbkZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7XG4gICAgICAgIHR5cGU6ICdjdXN0b20tc2VjdGlvbicsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgbGFiZWw6IHNlY3Rpb24udGl0bGUsXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICBzZWN0aW9uLnRyYW5zbGF0aW9ucz8uZmluZChcbiAgICAgICAgICAgICAgKHQ6IGFueSkgPT4gdC5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICAgICk/LnZhbHVlID8/ICcnLFxuICAgICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ24sXG4gICAgICAgIH0sXG4gICAgICAgIGZpZWxkR3JvdXA6IGF3YWl0IHRoaXMuYnVpbGRDb250cm9sc0ZpZWxkR3JvdXBBc3luYyhcbiAgICAgICAgICBzdGVwLFxuICAgICAgICAgIHNlY3Rpb24uY29udHJvbHMgfHwgW10sXG4gICAgICAgICAgc2VjdGlvbi5wcmVzZW50YXRpb25Db250cm9scyB8fCBbXVxuICAgICAgICApLFxuICAgICAgICBmaWVsZEdyb3VwQ2xhc3NOYW1lOiAnZGlzcGxheS1mbGV4JyxcbiAgICAgIH07XG4gICAgICBpZiAoc2VjdGlvbi5kZXBlbmRlbnREaWN0aW9uYXJ5KSB7XG4gICAgICAgIHRoaXMuYXR0YWNoVG9EZXBlbmRlbnREaWN0aW9uYXJ5SWZOZWNlc3NhcnkoXG4gICAgICAgICAgc2VjdGlvbi5kZXBlbmRlbnREaWN0aW9uYXJ5LFxuICAgICAgICAgIHNlY3Rpb25Gb3JtbHlDb25maWdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgc3RlcFNlY3Rpb25zLnB1c2goc2VjdGlvbkZvcm1seUNvbmZpZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0ZXBTZWN0aW9ucztcbiAgfVxuXG4gIGFzeW5jIGJ1aWREaXNwbGF5U3RlcCgpOiBQcm9taXNlPEZvcm1seUZpZWxkQ29uZmlnPiB7XG4gICAgbGV0IHN0ZXBGb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnID0ge307XG4gICAgaWYgKHRoaXMuZGlzcGxheT8uc2VjdGlvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHN0ZXBGb3JtbHlDb25maWcgPSB7XG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgLy8gbGFiZWw6IHN0ZXAubmFtZSxcbiAgICAgICAgICAvLyBidXR0b25zOiB0aGlzLmNvbnN0cnVjdEJ1dHRvbnMoc3RlcC5idXR0b25zKSxcbiAgICAgICAgICAvLyAgZGVwZW5kZW50RGljdGlvbmFyeTogc3RlcC5kZXBlbmRlbnREaWN0aW9uYXJ5LFxuICAgICAgICB9LFxuICAgICAgICBmaWVsZEdyb3VwOiBhd2FpdCB0aGlzLmJ1aWxkU2VjdGlvbnNGaWVsZEdyb3VwQXN5bmMoXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHRoaXMuZGlzcGxheS5zZWN0aW9uc1xuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBGb3JtbHlDb25maWc7XG4gIH1cblxuICBhZGROZXdSb3dUb0Zvcm1GaWVsZHNJZk5lY2Vzc2FyeShcbiAgICBmaWVsZEdyb3VwOiBGb3JtbHlGaWVsZENvbmZpZ1tdLFxuICAgIG5ld1JvdzogRm9ybWx5RmllbGRDb25maWdcbiAgKSB7XG4gICAgaWYgKG5ld1Jvdy5maWVsZEdyb3VwICYmIG5ld1Jvdy5maWVsZEdyb3VwLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlRm9ybUZpZWxkc1dpZHRoKG5ld1Jvdy5maWVsZEdyb3VwKTtcbiAgICAgIGZpZWxkR3JvdXAucHVzaChuZXdSb3cpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGN1bGF0ZUZvcm1GaWVsZHNXaWR0aChmb3JtRmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdKSB7XG4gICAgY29uc3QgY29sV2lkdGhQZXJJdGVtID0gMTIgLyBmb3JtRmllbGRzLmxlbmd0aDtcbiAgICBmb3JtRmllbGRzLmZvckVhY2goKGYpID0+IHtcbiAgICAgIGYuY2xhc3NOYW1lID0gJ2NvbC0nICsgY29sV2lkdGhQZXJJdGVtO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0UGVyY2VudGFnZUNsYXNzTmFtZShwZXJjZW50YWdlRGltZW5zaW9uOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRvdGFsQ29sdW1ucyA9IDEyOyAvLyAxMi1jb2x1bW4gZ3JpZFxuICAgIGNvbnN0IHNwYW4gPSBNYXRoLnJvdW5kKChwZXJjZW50YWdlRGltZW5zaW9uIC8gMTAwKSAqIHRvdGFsQ29sdW1ucyk7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gYHBlcmNlbnRhZ2Utd2lkdGgtJHtzcGFufWA7XG5cbiAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNsYXNzTmFtZSkpIHtcbiAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHN0eWxlLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgc3R5bGUuaWQgPSBjbGFzc05hbWU7XG4gICAgICBzdHlsZS5pbm5lckhUTUwgPSBgXG4gICAgICAgIC4ke2NsYXNzTmFtZX0ge1xuICAgICAgICAgIGdyaWQtY29sdW1uOiBzcGFuICR7c3Bhbn07XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzTmFtZTtcbiAgfVxuXG4gIGNyZWF0ZUZpbGxlckNvbnRyb2woc3BhbjogbnVtYmVyKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAncm93LWZpbGxlcicsXG4gICAgICBjbGFzc05hbWU6IGBwZXJjZW50YWdlLXdpZHRoLSR7c3Bhbn1gLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgaGlkZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRDb250cm9sc0ZpZWxkR3JvdXBBc3luYyhcbiAgICBzdGVwOiBTdGVwRGF0YSB8IHVuZGVmaW5lZCxcbiAgICBjb250cm9sczogQ29udHJvbERhdGFbXSxcbiAgICBwcmVzZW50YXRpb25Db250cm9sczogUHJlc2VudGF0aW9uQ29udHJvbFtdXG4gICk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWdbXT4ge1xuICAgIGNvbnN0IHJlc3VsdDogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xuICAgIGxldCByb3dJdGVtczogKENvbnRyb2xEYXRhIHwgUHJlc2VudGF0aW9uQ29udHJvbClbXSA9IFtdO1xuICAgIGNvbnRyb2xzID0gY29udHJvbHMuZmlsdGVyKChjKSA9PiAhYy5pc09ubHlGb3JDb25maWcpO1xuXG4gICAgLy8gRmlsdGVyIG91dCBjb250cm9scyB0aGF0IGFyZSBpbmNvbXBsZXRlXG4gICAgY29udHJvbHMgPSBjb250cm9scy5maWx0ZXIoKGMpID0+IHtcbiAgICAgIC8vIFNraXAgY29udHJvbHMgdGhhdCBhcmUgbWlzc2luZyBlc3NlbnRpYWwgZGF0YVxuICAgICAgaWYgKFxuICAgICAgICBjLnR5cGUgPT09IFN0ZXBDb250cm9sVHlwZS5EaWN0aW9uYXJ5ICYmXG4gICAgICAgICFjLnNwZWNpZmljQ29udHJvbERhdGE/LmRpY3Rpb25hcnlVVUlEXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvY2Vzc1JvdyA9IGFzeW5jIChcbiAgICAgIGl0ZW1zOiAoQ29udHJvbERhdGEgfCBQcmVzZW50YXRpb25Db250cm9sKVtdXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXTtcbiAgICAgIGNvbnN0IHRvdGFsID0gMTI7XG4gICAgICBjb25zdCBidWlsdDogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xuICAgICAgY29uc3QgYXV0bzoge1xuICAgICAgICBjOiBDb250cm9sRGF0YSB8IFByZXNlbnRhdGlvbkNvbnRyb2w7XG4gICAgICAgIGY6IEZvcm1seUZpZWxkQ29uZmlnO1xuICAgICAgfVtdID0gW107XG4gICAgICBsZXQgdXNlZCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGkgb2YgaXRlbXMpIHtcbiAgICAgICAgaWYgKCdjb2xsZWN0aW9uQ29udHJvbElkZW50aWZpZXInIGluIGkgPT09IHRydWUpIHtcbiAgICAgICAgICBidWlsdC5wdXNoKFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5idWlsZFByZXNlbnRhdGlvbkZvcm1GaWVsZEFzeW5jKFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICBpIGFzIFByZXNlbnRhdGlvbkNvbnRyb2xcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCdhcGlNZXRob2RJZCcgaW4gaSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGJ1aWx0LnB1c2goXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmJ1aWxkQXBpTWV0aG9kRm9ybUZpZWxkQXN5bmMoXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIGkgYXMgUHJlc2VudGF0aW9uQ29udHJvbFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVpbHQucHVzaChhd2FpdCB0aGlzLmJ1aWxkRm9ybUZpZWxkQXN5bmMoc3RlcCwgaSBhcyBDb250cm9sRGF0YSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGMgPSBpdGVtc1tpXTtcbiAgICAgICAgY29uc3QgZiA9IGJ1aWx0W2ldO1xuICAgICAgICBpZiAoYy5kaW1lbnNpb25UeXBlID09PSBEaW1lbnNpb25UeXBlLlBlcmNlbnRhZ2UpIHtcbiAgICAgICAgICBpZiAoYy5hdXRvRGltZW5zaW9uKSB7XG4gICAgICAgICAgICBhdXRvLnB1c2goeyBjLCBmIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzID0gTWF0aC5yb3VuZCgoYy5kaW1lbnNpb24gLyAxMDApICogdG90YWwpO1xuICAgICAgICAgICAgdXNlZCArPSBzO1xuICAgICAgICAgICAgY29uc3QgcGVyY2VudGFnZUNsYXNzID0gdGhpcy5nZXRQZXJjZW50YWdlQ2xhc3NOYW1lKGMuZGltZW5zaW9uKTtcbiAgICAgICAgICAgIGYuY2xhc3NOYW1lID0gYCR7Zi5jbGFzc05hbWV9ICR7cGVyY2VudGFnZUNsYXNzfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGMuZGltZW5zaW9uVHlwZSA9PT0gRGltZW5zaW9uVHlwZS5QaXhlbHMpIHtcbiAgICAgICAgICBjb25zdCBzID0gTWF0aC5yb3VuZCgoYy5kaW1lbnNpb24gLyB3aW5kb3cuaW5uZXJXaWR0aCkgKiB0b3RhbCk7XG4gICAgICAgICAgdXNlZCArPSBzO1xuICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2VDbGFzcyA9IHRoaXMuZ2V0UGVyY2VudGFnZUNsYXNzTmFtZShcbiAgICAgICAgICAgIChzIC8gdG90YWwpICogMTAwXG4gICAgICAgICAgKTtcbiAgICAgICAgICBmLmNsYXNzTmFtZSA9IGAke2YuY2xhc3NOYW1lfSAke3BlcmNlbnRhZ2VDbGFzc31gO1xuICAgICAgICB9IGVsc2UgaWYgKGMuYXV0b0RpbWVuc2lvbikge1xuICAgICAgICAgIGF1dG8ucHVzaCh7IGMsIGYgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXNlZCArPSAxO1xuICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2VDbGFzcyA9IHRoaXMuZ2V0UGVyY2VudGFnZUNsYXNzTmFtZShcbiAgICAgICAgICAgICgxIC8gdG90YWwpICogMTAwXG4gICAgICAgICAgKTtcbiAgICAgICAgICBmLmNsYXNzTmFtZSA9IGAke2YuY2xhc3NOYW1lfSAke3BlcmNlbnRhZ2VDbGFzc31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCByZW0gPSB0b3RhbCAtIHVzZWQ7XG4gICAgICBpZiAoYXV0by5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHNoYXJlID0gTWF0aC5tYXgoTWF0aC5mbG9vcihyZW0gLyBhdXRvLmxlbmd0aCksIDEpO1xuICAgICAgICBmb3IgKGNvbnN0IGEgb2YgYXV0bykge1xuICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2VDbGFzcyA9IHRoaXMuZ2V0UGVyY2VudGFnZUNsYXNzTmFtZShcbiAgICAgICAgICAgIChzaGFyZSAvIHRvdGFsKSAqIDEwMFxuICAgICAgICAgICk7XG4gICAgICAgICAgYS5mLmNsYXNzTmFtZSA9IGAke2EuZi5jbGFzc05hbWV9ICR7cGVyY2VudGFnZUNsYXNzfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZpZWxkcy5wdXNoKC4uLmJ1aWx0KTtcbiAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgWy4uLmNvbnRyb2xzLCAuLi5wcmVzZW50YXRpb25Db250cm9sc10pIHtcbiAgICAgIGlmIChcbiAgICAgICAgKCd0eXBlJyBpbiBjICYmIGMudHlwZSA9PT0gU3RlcENvbnRyb2xUeXBlLk5ld1JvdykgfHxcbiAgICAgICAgYy50eXBlID09IFByZXNlbnRhdGlvbkNvbnRyb2xUeXBlLk5ld1Jvd1xuICAgICAgKSB7XG4gICAgICAgIGlmIChyb3dJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goLi4uKGF3YWl0IHByb2Nlc3NSb3cocm93SXRlbXMpKSk7XG4gICAgICAgICAgcm93SXRlbXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm93SXRlbXMucHVzaChjKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJvd0l0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLihhd2FpdCBwcm9jZXNzUm93KHJvd0l0ZW1zKSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZ2V0UGl4ZWxDbGFzc05hbWUocGl4ZWxEaW1lbnNpb246IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gYHBpeGVsLXdpZHRoLSR7cGl4ZWxEaW1lbnNpb259YDtcbiAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNsYXNzTmFtZSkpIHtcbiAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHN0eWxlLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgc3R5bGUuaWQgPSBjbGFzc05hbWU7XG4gICAgICBzdHlsZS5pbm5lckhUTUwgPSBgXG4gICAgICAgIC4ke2NsYXNzTmFtZX0ge1xuICAgICAgICAgIHdpZHRoOiAke3BpeGVsRGltZW5zaW9ufXB4O1xuICAgICAgICB9XG4gICAgICBgO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWU7XG4gIH1cblxuICBhc3luYyBidWlsZEZvcm1GaWVsZEFzeW5jKFxuICAgIHN0ZXA6IFN0ZXBEYXRhIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRyb2w6IENvbnRyb2xEYXRhXG4gICk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWc+IHtcbiAgICBsZXQgaW5pdGlhbFR5cGUgPSAnaW5wdXQnOyAvLyBEZWZhdWx0IHR5cGVcbiAgICBsZXQgY29tcG9uZW50U3R5bGVLZXkgPSBgLmNvbXBvbmVudC10ZXh0LWZpZWxkYDsgLy8gRGVmYXVsdCBzdHlsZSBmb3IgdGV4dCBpbnB1dFxuICAgIGNvbnN0IGJhc2VTdHlsZSA9IHRoaXMuZGVzaWduW2AuZm9udC0ke2luaXRpYWxUeXBlfWBdIHx8IHt9O1xuICAgIGNvbnN0IGNvbnRyb2xTdHlsZVN0cmluZyA9XG4gICAgICB0aGlzLnN0eWxlT2JqZWN0VG9TdHJpbmdFeGNlcHRCYWNrZ3JvdW5kKGJhc2VTdHlsZSk7XG4gICAgbGV0IHBhdHRlcm4gPSAnJztcbiAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5hbGxvd2VkQ2hhcmFjdGVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGF0dGVybiA9IG5ldyBSZWdFeHAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhLmFsbG93ZWRDaGFyYWN0ZXJzKVxuICAgICAgICAgIC5zb3VyY2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2luY29ycmVjdCByZWdleCBwYXR0ZXJuJywgZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcG9uZW50c1RvRXhjbHVkZUZyb21TdHlsZSA9IFtcbiAgICAgICcuY29tcG9uZW50LXRleHQtZmllbGQnLFxuICAgICAgJy5jb21wb25lbnQtY2hlY2tib3gnLFxuICAgICAgJy5jb21wb25lbnQtcmFkaW8nLFxuICAgICAgJy5jb21wb25lbnQtZGF0ZScsXG4gICAgICAnLmNvbXBvbmVudC1kYXRhJyxcbiAgICBdO1xuICAgIGxldCBmb3JtbHlDb25maWcgPSB0aGlzLmdldERlZmF1bHRGb3JtbHlGaWVsZENvbmZpZyhcbiAgICAgIGNvbnRyb2wsXG4gICAgICBpbml0aWFsVHlwZSxcbiAgICAgIHBhdHRlcm4sXG4gICAgICBjb21wb25lbnRTdHlsZUtleSxcbiAgICAgIGNvbXBvbmVudHNUb0V4Y2x1ZGVGcm9tU3R5bGVcbiAgICApO1xuICAgIC8vY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhLnR5cGUgPT09IDMgIGlzIGVtYWlsXG4gICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8udHlwZSA9PT0gMykge1xuICAgICAgdGhpcy5hZGRWYWxpZGF0b3JzKGZvcm1seUNvbmZpZywgY29udHJvbCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNBcGlWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLmFkZEFwaVZhbGlkYXRvcnMoZm9ybWx5Q29uZmlnLCBjb250cm9sKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbnRyb2wudHlwZSkge1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQ6IC8vIFRleHRcbiAgICAgICAgdmFyIHN1YlR5cGUgPSBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGFcbiAgICAgICAgICA/LnR5cGUgYXMgTWFudWFsSW5wdXRDb250cm9sVHlwZTtcbiAgICAgICAgc3dpdGNoIChzdWJUeXBlKSB7XG4gICAgICAgICAgY2FzZSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLk51bWVyaWM6XG4gICAgICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdudW1iZXInO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE1hbnVhbElucHV0Q29udHJvbFR5cGUuRW1haWw6XG4gICAgICAgICAgY2FzZSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlRleHQ6XG4gICAgICAgICAgY2FzZSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlBob25lOlxuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnaW5wdXQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlRleHRBcmVhOlxuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnaW5wdXQnO1xuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnYXV0b3NpemUnXSA9IGZhbHNlO1xuICAgICAgICAgICAgY29tcG9uZW50U3R5bGVLZXkgPSAnLmNvbXBvbmVudC10ZXh0LWZpZWxkJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgTWFudWFsSW5wdXRDb250cm9sVHlwZS5EYXRlVGltZTpcbiAgICAgICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2RhdGVwaWNrZXInO1xuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzID0ge1xuICAgICAgICAgICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb21wb25lbnRTdHlsZUtleSA9ICcuY29tcG9uZW50LWRhdGUnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2lucHV0JztcbiAgICAgICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID0gJy5jb21wb25lbnQtdGV4dC1maWVsZCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RlcENvbnRyb2xUeXBlLlBhcmFncmFwaDogLy8gUGFyYWdyYXBoXG4gICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2Zvcm1seS1wYXJhZ3JhcGgnO1xuICAgICAgICBjb21wb25lbnRTdHlsZUtleSA9ICcuY29tcG9uZW50LXRleHQtZmllbGQnO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWREZXNjcmlwdGlvbiA9XG4gICAgICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5kZXNjcmlwdGlvblRyYW5zbGF0aW9ucz8uZmluZChcbiAgICAgICAgICAgIChkOiB7IGxhbmd1YWdlSXNvOiBzdHJpbmcgfSkgPT5cbiAgICAgICAgICAgICAgZC5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApPy52YWx1ZSB8fCAnJztcbiAgICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IHRyYW5zbGF0ZWREZXNjcmlwdGlvbjtcblxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RlcENvbnRyb2xUeXBlLkNoZWNrQm94OiAvLyBDaGVja2JveFxuICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdmb3JtbHktY2hlY2tib3gnO1xuICAgICAgICBjb21wb25lbnRTdHlsZUtleSA9ICcuY29tcG9uZW50LWNoZWNrYm94JztcbiAgICAgICAgdmFyIGNoZWNrZWQgPSBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmNoZWNrZWQgPz8gZmFsc2U7XG4gICAgICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2NoZWNrZWQnXSA9IGNoZWNrZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuRGljdGlvbmFyeTogLy8gRGljdGlvbmFyeSAoZHJvcGRvd24pXG4gICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID1cbiAgICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEuc2hvd0FzUmFkaW9CdXR0b25zTGlzdCA9PT0gdHJ1ZVxuICAgICAgICAgICAgPyAnLmNvbXBvbmVudC1yYWRpbydcbiAgICAgICAgICAgIDogJy5jb21wb25lbnQtZGF0YSc7XG4gICAgICAgIGF3YWl0IHRoaXMuY29uc3RydWN0RGljdGlvbmFyeShjb250cm9sLCBmb3JtbHlDb25maWcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RlcENvbnRyb2xUeXBlLkJ1dHRvbnM6XG4gICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuRmx1eEluZm86XG4gICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuRG93bmxvYWREb2N1bWVudHM6XG4gICAgICAgIGZvcm1seUNvbmZpZyA9IHRoaXMuQ3JlYXRlRG93bmxvYWREb2NzRmllbGRDb25maWcoY29udHJvbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuVmlld0RvY3VtZW50czpcbiAgICAgICAgZm9ybWx5Q29uZmlnID0gdGhpcy5DcmVhdGVWaWV3RG9jc0ZpZWxkQ29uZmlnKGNvbnRyb2wpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RlcENvbnRyb2xUeXBlLlVwbG9hZERvY3VtZW50czpcbiAgICAgICAgZm9ybWx5Q29uZmlnID0gdGhpcy5DcmVhdGVVcGxvYWREb2NzRmllbGRDb25maWcoY29udHJvbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuTmV3Um93OiAvLyBOZXcgUm93XG4gICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnaW5wdXQnO1xuICAgICAgICBjb21wb25lbnRTdHlsZUtleSA9ICcuY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgIH1cbiAgICBmb3JtbHlDb25maWcuY2xhc3NOYW1lID0gY29tcG9uZW50U3R5bGVLZXkuc3Vic3RyaW5nKDEpO1xuXG4gICAgaWYgKCFjb21wb25lbnRzVG9FeGNsdWRlRnJvbVN0eWxlLmZpbmQoKGMpID0+IGMgPT09IGNvbXBvbmVudFN0eWxlS2V5KSkge1xuICAgICAgaWYgKHRoaXMuZGVzaWduW2NvbXBvbmVudFN0eWxlS2V5XSkge1xuICAgICAgICBmb3JtbHlDb25maWcucHJvcHMhLmF0dHJpYnV0ZXMhWydzdHlsZSddICs9XG4gICAgICAgICAgJzsnICtcbiAgICAgICAgICB0aGlzLnN0eWxlT2JqZWN0VG9TdHJpbmdFeGNlcHRCYWNrZ3JvdW5kKFxuICAgICAgICAgICAgdGhpcy5kZXNpZ25bY29tcG9uZW50U3R5bGVLZXldXG4gICAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgbGFiZWwgc3R5bGVzXG4gICAgICBjb25zdCBsYWJlbFN0eWxlS2V5ID0gYCR7Y29tcG9uZW50U3R5bGVLZXl9LWxhYmVsYDtcbiAgICAgIGlmICh0aGlzLmRlc2lnbltsYWJlbFN0eWxlS2V5XSkge1xuICAgICAgICBmb3JtbHlDb25maWcucHJvcHMhLmF0dHJpYnV0ZXMhWydzdHlsZSddICs9XG4gICAgICAgICAgJzsnICtcbiAgICAgICAgICB0aGlzLnN0eWxlT2JqZWN0VG9TdHJpbmdFeGNlcHRCYWNrZ3JvdW5kKFxuICAgICAgICAgICAgdGhpcy5kZXNpZ25bY29tcG9uZW50U3R5bGVLZXldXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbnRyb2wuZGVwZW5kZW50RGljdGlvbmFyeSkge1xuICAgICAgdGhpcy5hdHRhY2hUb0RlcGVuZGVudERpY3Rpb25hcnlJZk5lY2Vzc2FyeShcbiAgICAgICAgY29udHJvbC5kZXBlbmRlbnREaWN0aW9uYXJ5LFxuICAgICAgICBmb3JtbHlDb25maWdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IHRyYW5zbGF0ZWRUaXRsZSA9IGNvbnRyb2wudHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgKGQ6IHsgbGFuZ3VhZ2VJc286IHN0cmluZyB9KSA9PiBkLmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICk/LnZhbHVlO1xuICAgIGlmICghdHJhbnNsYXRlZFRpdGxlKSB7XG4gICAgICB0cmFuc2xhdGVkVGl0bGUgPSBjb250cm9sLnRpdGxlO1xuICAgIH1cbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydsYWJlbCddID0gdHJhbnNsYXRlZFRpdGxlO1xuXG4gICAgdGhpcy5mb3JtbHlDb2xsZWN0aW5nRmllbGRzLnB1c2goZm9ybWx5Q29uZmlnKTtcblxuICAgIHJldHVybiBmb3JtbHlDb25maWc7XG4gIH1cblxuICBhZGRWYWxpZGF0b3JzKGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcsIGNvbnRyb2w6IENvbnRyb2xEYXRhKSB7XG4gICAgdmFyIGVtYWlsRXJyb3JMYWJlbCA9IHRoaXMuZmx1eD8uZmluZChcbiAgICAgIChmKSA9PiBmPy5jb25maWc/LmNvbXBvbmVudENvbGxlY3RlZCA9PT0gY29udHJvbD8uaWRlbnRpZmllclxuICAgICk/LmNvbmZpZz8uZW1haWxFcnJvckxhYmVsO1xuICAgIHZhciBlbWFpbEVycm9yTGFiZWxWYWx1ZSA9ICcnO1xuICAgIGlmIChlbWFpbEVycm9yTGFiZWwgIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KGVtYWlsRXJyb3JMYWJlbCkpIHtcbiAgICAgIGVtYWlsRXJyb3JMYWJlbFZhbHVlID1cbiAgICAgICAgKGVtYWlsRXJyb3JMYWJlbCBhcyBMYWJlbEluZm9bXSkuZmluZChcbiAgICAgICAgICAobCkgPT4gbC5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKT8udmFsdWUgPz8gJyc7XG4gICAgfVxuXG4gICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRvcnMgPSB7XG4gICAgICBlbWFpbFZhbGlkOiB7XG4gICAgICAgIGV4cHJlc3Npb246IChjb250OiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbnQudmFsdWU7XG4gICAgICAgICAgY29uc3QgZW1haWxQYXR0ZXJuID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXFxcLlthLXpBLVpdezIsfSQnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodmFsdWUgJiYgIWVtYWlsUGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgY29udC5zZXRFcnJvcnMoeyBpbnZhbGlkRW1haWw6IHRydWUgfSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBtZXNzYWdlOiBlbWFpbEVycm9yTGFiZWxWYWx1ZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGFkZEFwaVZhbGlkYXRvcnMoZm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZywgY29udHJvbDogQ29udHJvbERhdGEpIHtcbiAgICBmb3JtbHlDb25maWcuYXN5bmNWYWxpZGF0b3JzID0ge1xuICAgICAgdmFsaWRhdGVUaHJvdWdoQXBpOiB7XG4gICAgICAgIGV4cHJlc3Npb246IChjb250OiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY29udC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDUwMCksXG4gICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXBpVmFsaWRhdGlvbk1ldGhvZCA9XG4gICAgICAgICAgICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEuYXBpVmFsaWRhdGlvbk1ldGhvZDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHlWYWx1ZSA9IHRoaXMuYXBwTW9kZWwucGFydG5lcnNcbiAgICAgICAgICAgICAgICAgIC5mbGF0TWFwKChwKSA9PiBwLnBhcnRuZXJTZXR0aW5ncy5wYXJ0bmVyTWV0aG9kc0FwaSlcbiAgICAgICAgICAgICAgICAgIC5maW5kKChwKSA9PiBwLm1ldGhvZElkID09PSBhcGlWYWxpZGF0aW9uTWV0aG9kKVxuICAgICAgICAgICAgICAgICAgPy5ib2R5Q29uZmlndXJhdGlvbi5ib2R5TWFwRmllbGRzO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGRNYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPVxuICAgICAgICAgICAgICAgICAgYm9keVZhbHVlPy5yZWR1Y2UoKGFjYzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSwgZikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZi5mbHV4RmllbGRJZCA9PT0gY29udHJvbC5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYWNjW2YucGFydG5lckZpZWxkXSA9IGNvbnQudmFsdWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgYWNjW2YucGFydG5lckZpZWxkXSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICAgICAgICB9LCB7fSkgfHwge307XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhUmVxdWVzdDogQXBpVmFsaWRhdGVSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwTW9kZWwuYXBwbGljYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgIGFwaUlkOiBhcGlWYWxpZGF0aW9uTWV0aG9kLFxuICAgICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZmllbGRNYXApLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZU1ldGhvZEFwaShkYXRhUmVxdWVzdCkucGlwZShcbiAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoZmFsc2UpKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApIHx8ICdzc3Nzc3Nzc3Nzc3Nzc3NzJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lc3NhZ2U6ICdWYWxpZGF0aW9uIGZhaWxlZC4nLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0RGVmYXVsdEZvcm1seUZpZWxkQ29uZmlnKFxuICAgIGNvbnRyb2w6IENvbnRyb2xEYXRhLFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBwYXR0ZXJuOiBzdHJpbmcsXG4gICAgY29tcG9uZW50U3R5bGVLZXk6IHN0cmluZyxcbiAgICBjb21wb25lbnRzVG9FeGNsdWRlRnJvbVN0eWxlOiBzdHJpbmdbXVxuICApOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgY29uc3QgY3VycmVudExhbmd1YWdlSWQgPSBVdGlscy5maW5kTGFuZ3VhZ2VJZEJ5SXNvKFxuICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMsXG4gICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICk7XG5cbiAgICBsZXQgZm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogY29udHJvbC5pZGVudGlmaWVyIHx8IGNvbnRyb2wudGl0bGUsXG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgY3VycmVudExhbmd1YWdlSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgY3VycmVudExhbmd1YWdlSWQ6IGN1cnJlbnRMYW5ndWFnZUlkLFxuICAgICAgICBsYWJlbDpcbiAgICAgICAgICBjb250cm9sLnRyYW5zbGF0aW9ucz8uZmluZChcbiAgICAgICAgICAgICh0OiB7IGxhbmd1YWdlSXNvOiBzdHJpbmcgfSkgPT5cbiAgICAgICAgICAgICAgdC5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApPy52YWx1ZSB8fCAnJyxcblxuICAgICAgICB0aXRsZTpcbiAgICAgICAgICBjb250cm9sLnRyYW5zbGF0aW9ucz8uZmluZChcbiAgICAgICAgICAgICh0OiB7IGxhbmd1YWdlSXNvOiBzdHJpbmcgfSkgPT5cbiAgICAgICAgICAgICAgdC5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApPy52YWx1ZSB8fCAnJyxcbiAgICAgICAgZGVzaWduOiB0aGlzLmRlc2lnbixcbiAgICAgICAgcmVxdWlyZWQ6IGNvbnRyb2wuaXNNYW5kYXRvcnksXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBzdHlsZTogY29tcG9uZW50c1RvRXhjbHVkZUZyb21TdHlsZS5maW5kKFxuICAgICAgICAgICAgKGMpID0+IGMgPT09IGNvbXBvbmVudFN0eWxlS2V5XG4gICAgICAgICAgKVxuICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgOiBjb21wb25lbnRTdHlsZUtleSxcbiAgICAgICAgfSxcbiAgICAgICAgYXV0b3NpemU6IHRydWUsXG4gICAgICAgIG9wdGlvbnM6IFt7fV0sXG4gICAgICAgIGZpZWxkR3JvdXA6IFtdLFxuICAgICAgICBhdXRvRGltZW5zaW9uOiBjb250cm9sLmF1dG9EaW1lbnNpb24sXG4gICAgICB9LFxuICAgICAgZXhwcmVzc2lvbnM6IHt9LFxuICAgICAgaG9va3M6IHt9LFxuICAgICAgdmFsaWRhdG9yczoge30sXG4gICAgfTtcbiAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbiA9IHt9O1xuXG4gICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNNYW5kYXRvcnkgJiYgZm9ybWx5Q29uZmlnLnByb3BzKSB7XG4gICAgICB2YXIgcmVxdWlyZWRNZXNzYWdlID0gVXRpbHMuZmluZEVycm9yVHJhbnNsYXRpb25WYWx1ZU9yRGVmYXVsdChcbiAgICAgICAgY29udHJvbC5lcnJvcnNUcmFuc2xhdGlvbnMsXG4gICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICAnaXNNYW5kYXRvcnlWYWxpZGF0aW9uJ1xuICAgICAgKTtcblxuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzLnJlcXVpcmVkID0gY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc01hbmRhdG9yeTtcbiAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0aW9uLm1lc3NhZ2VzID0ge1xuICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdGlvbj8ubWVzc2FnZXMsXG4gICAgICAgIHJlcXVpcmVkOiByZXF1aXJlZE1lc3NhZ2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNvbnRyb2wudHlwZSA9PT0gU3RlcENvbnRyb2xUeXBlLkRpY3Rpb25hcnkgJiZcbiAgICAgIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNNYW5kYXRvcnkgJiZcbiAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zICYmXG4gICAgICBmb3JtbHlDb25maWcucHJvcHNcbiAgICApIHtcbiAgICAgIHZhciByZXF1aXJlZE1lc3NhZ2UgPSBVdGlscy5maW5kRXJyb3JUcmFuc2xhdGlvblZhbHVlT3JEZWZhdWx0KFxuICAgICAgICBjb250cm9sLmVycm9yc1RyYW5zbGF0aW9ucyxcbiAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgICdpc01hbmRhdG9yeSdcbiAgICAgICk7XG5cbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wcy5yZXF1aXJlZCA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNNYW5kYXRvcnk7XG4gICAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbi5tZXNzYWdlcyA9IHtcbiAgICAgICAgLi4uZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24/Lm1lc3NhZ2VzLFxuICAgICAgICByZXF1aXJlZDogcmVxdWlyZWRNZXNzYWdlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UgPSAnJztcbiAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc1NpbXBsZVZhbGlkYXRpb24gJiYgZm9ybWx5Q29uZmlnLnByb3BzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNTaW1wbGVWYWxpZGF0aW9uICYmXG4gICAgICAgIGZvcm1seUNvbmZpZy5wcm9wc1xuICAgICAgKSB7XG4gICAgICAgIHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlID0gVXRpbHMuZmluZEVycm9yVHJhbnNsYXRpb25WYWx1ZU9yRGVmYXVsdChcbiAgICAgICAgICBjb250cm9sLmVycm9yc1RyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgICAnc2ltcGxlVmFsaWRhdGlvbidcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5taW5WYWx1ZT8udG9TdHJpbmcoKSkge1xuICAgICAgICAgIGZvcm1seUNvbmZpZy5wcm9wcy5taW4gPSBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEubWluVmFsdWU7XG4gICAgICAgICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24ubWVzc2FnZXMgPSB7XG4gICAgICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdGlvbj8ubWVzc2FnZXMsXG4gICAgICAgICAgICBtaW46IHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5tYXhWYWx1ZT8udG9TdHJpbmcoKSkge1xuICAgICAgICAgIGZvcm1seUNvbmZpZy5wcm9wcy5tYXggPSBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEubWF4VmFsdWU7XG4gICAgICAgICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24ubWVzc2FnZXMgPSB7XG4gICAgICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdGlvbj8ubWVzc2FnZXMsXG4gICAgICAgICAgICBtYXg6IHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcGF0dGVybiB2YWxpZGF0aW9uIGlmIGFsbG93ZWRDaGFyYWN0ZXJzIGlzIGRlZmluZWRcbiAgICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93ZWRDaGFyYWN0ZXJzKSB7XG4gICAgICAgIHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlID0gc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UgPVxuICAgICAgICAgIFV0aWxzLmZpbmRFcnJvclRyYW5zbGF0aW9uVmFsdWVPckRlZmF1bHQoXG4gICAgICAgICAgICBjb250cm9sLmVycm9yc1RyYW5zbGF0aW9ucyxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICAgICAgJ3NpbXBsZVZhbGlkYXRpb24nXG4gICAgICAgICAgKTtcblxuICAgICAgICBmb3JtbHlDb25maWcudmFsaWRhdG9ycyA9IHtcbiAgICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdG9ycyxcbiAgICAgICAgICBjdXN0b21QYXR0ZXJuOiB7XG4gICAgICAgICAgICBleHByZXNzaW9uOiAoYzogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghYy52YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZWdleC50ZXN0KGMudmFsdWUpO1xuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSB8fFxuICAgICAgICAgICAgICAnVmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIHJlcXVpcmVkIHBhdHRlcm4nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24ubWVzc2FnZXMgPSB7XG4gICAgICAgICAgLi4uZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24/Lm1lc3NhZ2VzLFxuICAgICAgICAgIHBhdHRlcm46IHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBtYXhMZW5ndGggdmFsaWRhdGlvbiBpZiBtYXhDaGFyYWN0ZXJzIGlzIGRlZmluZWRcbiAgICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/Lm1heENoYXJhY3RlcnMpIHtcbiAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzLm1heExlbmd0aCA9XG4gICAgICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5tYXhDaGFyYWN0ZXJzO1xuICAgICAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbi5tZXNzYWdlcyA9IHtcbiAgICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdGlvbj8ubWVzc2FnZXMsXG4gICAgICAgICAgbWF4TGVuZ3RoOiBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5hbGxvd09ubHlGdXR1cmUgfHxcbiAgICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5hbGxvd09ubHlQYXN0XG4gICAgICApIHtcbiAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZGF0ZXBpY2tlcic7XG4gICAgICAgIGNvbnN0IGNoZWNrRGF0ZVZhbGlkYXRpb24gPSB7XG4gICAgICAgICAgY2hlY2tEYXRlOiB7XG4gICAgICAgICAgICBleHByZXNzaW9uOiAoYzogQWJzdHJhY3RDb250cm9sLCBmaWVsZDogRm9ybWx5RmllbGRDb25maWcpID0+IHtcbiAgICAgICAgICAgICAgc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgIFV0aWxzLmZpbmRFcnJvclRyYW5zbGF0aW9uVmFsdWVPckRlZmF1bHQoXG4gICAgICAgICAgICAgICAgICBjb250cm9sLmVycm9yc1RyYW5zbGF0aW9ucyxcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICAgICAgICAgICAgJ3NpbXBsZVZhbGlkYXRpb24nXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgIGN1cnJlbnREYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuXG4gICAgICAgICAgICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93T25seUZ1dHVyZSkge1xuICAgICAgICAgICAgICAgIGlmICghYy52YWx1ZSB8fCBjLnZhbHVlID09PSAnJykgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGMudmFsdWUgPiBjdXJyZW50RGF0ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5hbGxvd09ubHlQYXN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjLnZhbHVlIHx8IGMudmFsdWUgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYy52YWx1ZSA8IGN1cnJlbnREYXRlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IChlcnJvcjogYW55LCBmaWVsZDogRm9ybWx5RmllbGRDb25maWcpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBmb3JtbHlDb25maWcudmFsaWRhdG9ycyA9IHtcbiAgICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdG9ycyxcbiAgICAgICAgICAuLi5jaGVja0RhdGVWYWxpZGF0aW9uLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhLnR5cGUgPT09IDQgIGlzIHBob25lXG4gICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8udHlwZSA9PT0gNCkge1xuICAgICAgdmFyIHBob25lRXJyb3JMYWJlbCA9IHRoaXMuZmx1eD8uZmluZChcbiAgICAgICAgKGYpID0+IGY/LmNvbmZpZz8uY29tcG9uZW50Q29sbGVjdGVkID09PSBjb250cm9sPy5pZGVudGlmaWVyXG4gICAgICApPy5jb25maWc/LnBob25lRXJyb3JMYWJlbDtcbiAgICAgIHZhciBwaG9uZUVycm9yTGFiZWxWYWx1ZSA9ICcnO1xuICAgICAgaWYgKHBob25lRXJyb3JMYWJlbCAhPSBudWxsICYmIEFycmF5LmlzQXJyYXkocGhvbmVFcnJvckxhYmVsKSkge1xuICAgICAgICBwaG9uZUVycm9yTGFiZWxWYWx1ZSA9XG4gICAgICAgICAgKHBob25lRXJyb3JMYWJlbCBhcyBMYWJlbEluZm9bXSkuZmluZChcbiAgICAgICAgICAgIChsKSA9PiBsLmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICk/LnZhbHVlID8/ICcnO1xuICAgICAgfVxuXG4gICAgICBmb3JtbHlDb25maWcudmFsaWRhdG9ycyA9IHtcbiAgICAgICAgcGhvbmVWYWxpZDoge1xuICAgICAgICAgIGV4cHJlc3Npb246IChjb250OiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29udC52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IHBob25lUGF0dGVybiA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICdeKFxcXFwrNHwpPygwN1swLThdezF9WzAtOV17MX18MDJbMC05XXsyfXwwM1swLTldezJ9KXsxfT8oXFxcXHN8XFxcXC58LSk/KFswLTldezN9KFxcXFxzfFxcXFwufC18KSl7Mn0kJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiAhcGhvbmVQYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGNvbnQuc2V0RXJyb3JzKHsgaW52YWxpZFBob25lTnVtYmVyOiB0cnVlIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lc3NhZ2U6IHBob25lRXJyb3JMYWJlbFZhbHVlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy50eXBlID09PSAyKSB7XG4gICAgICBjb25zdCBjaGVja0RhdGUyVmFsaWRhdGlvbiA9IHtcbiAgICAgICAgY2hlY2tEYXRlMjoge1xuICAgICAgICAgIGV4cHJlc3Npb246IChjOiBBYnN0cmFjdENvbnRyb2wsIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgICAgdmFyIGRhdGVWYWx1ZSA9IGMudmFsdWU7XG4gICAgICAgICAgICBpZiAoIWRhdGVWYWx1ZSAmJiBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmlzTWFuZGF0b3J5KSB7XG4gICAgICAgICAgICAgIHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlID1cbiAgICAgICAgICAgICAgICBVdGlscy5maW5kRXJyb3JUcmFuc2xhdGlvblZhbHVlT3JEZWZhdWx0KFxuICAgICAgICAgICAgICAgICAgY29udHJvbC5lcnJvcnNUcmFuc2xhdGlvbnMsXG4gICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgICAgICAgICAgICdpc01hbmRhdG9yeVZhbGlkYXRpb24nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBpc05hTihEYXRlLnBhcnNlKGRhdGVWYWx1ZSkpICYmXG4gICAgICAgICAgICAgIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNNYW5kYXRvcnlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lc3NhZ2U6IChlcnJvcjogYW55LCBmaWVsZDogRm9ybWx5RmllbGRDb25maWcpID0+IHtcbiAgICAgICAgICAgIGlmIChzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSA9PT0gJycpXG4gICAgICAgICAgICAgIHJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZSc7XG5cbiAgICAgICAgICAgIHJldHVybiBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0b3JzID0ge1xuICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdG9ycyxcbiAgICAgICAgLi4uY2hlY2tEYXRlMlZhbGlkYXRpb24sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtbHlDb25maWc7XG4gIH1cblxuICBhc3luYyBidWlsZFByZXNlbnRhdGlvbkZvcm1GaWVsZEFzeW5jKFxuICAgIHN0ZXA6IFN0ZXBEYXRhIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRyb2w6IFByZXNlbnRhdGlvbkNvbnRyb2xcbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZz4ge1xuICAgIGxldCBmb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnID0geyBwcm9wczoge30gfTtcblxuICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2Zvcm1seS1wYXJhZ3JhcGgnO1xuICAgIGZvcm1seUNvbmZpZy5jbGFzc05hbWUgPSAnY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2Rlc2lnbiddID0gdGhpcy5hcHBNb2RlbC5nZW5lcmF0ZWRDc3M7XG5cbiAgICB2YXIgdHJhbnNsYXRlZFRpdGxlID1cbiAgICAgIGNvbnRyb2wudHJhbnNsYXRpb25zLmZpbmQoKGQpID0+IGQubGFuZ3VhZ2VJc28gPT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28pXG4gICAgICAgID8udmFsdWUgPz9cbiAgICAgIGNvbnRyb2wudGl0bGUgPz9cbiAgICAgICcnO1xuXG4gICAgaWYgKGNvbnRyb2wudHlwZSA9PSBQcmVzZW50YXRpb25Db250cm9sVHlwZS5QYXJhZ3JhcGgpIHtcbiAgICAgIGNvbnN0IHBhcmFncmFwaENvbnRyb2wgPSBjb250cm9sIGFzIFByZXNlbnRhdGlvblBhcmFncmFwaENvbnRyb2w7XG5cbiAgICAgIHZhciB0cmFuc2xhdGVkRGVzY3JpcHRpb24gPVxuICAgICAgICBwYXJhZ3JhcGhDb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEuZGVzY3JpcHRpb25UcmFuc2xhdGlvbnMuZmluZChcbiAgICAgICAgICAoZDogYW55KSA9PiBkLmxhbmd1YWdlSXNvID09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk/LnZhbHVlID8/ICcnO1xuICAgICAgdmFyIHRyYW5zbGF0ZWRQYXJhZ3JhcGhUaXRsZSA9XG4gICAgICAgIHBhcmFncmFwaENvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS50ZXh0LmZpbmQoXG4gICAgICAgICAgKGQ6IGFueSkgPT4gZC5sYW5ndWFnZUlzbyA9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApPy52YWx1ZSA/PyAnJztcblxuICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IHRyYW5zbGF0ZWREZXNjcmlwdGlvbjtcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ3RyYW5zbGF0ZWREZXNjcmlwdGlvbiddID0gdHJhbnNsYXRlZERlc2NyaXB0aW9uO1xuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsndHJhbnNsYXRlZFBhcmFncmFwaFRpdGxlJ10gPVxuICAgICAgICB0cmFuc2xhdGVkUGFyYWdyYXBoVGl0bGU7XG4gICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdmb3JtbHktcGFyYWdyYXBoJztcbiAgICAgIGZvcm1seUNvbmZpZy5jbGFzc05hbWUgPSAnY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgIH0gZWxzZSBpZiAoY29udHJvbC50eXBlID09IFByZXNlbnRhdGlvbkNvbnRyb2xUeXBlLkRvd25sb2FkKSB7XG4gICAgICBmb3JtbHlDb25maWcgPSB0aGlzLkNyZWF0ZURvd25sb2FkRG9jc0ZpZWxkQ29uZmlnKGNvbnRyb2wpO1xuICAgIH0gZWxzZSBpZiAoY29udHJvbC50eXBlID09IFByZXNlbnRhdGlvbkNvbnRyb2xUeXBlLlZpZXcpIHtcbiAgICAgIGZvcm1seUNvbmZpZyA9IHRoaXMuQ3JlYXRlVmlld0RvY3NGaWVsZENvbmZpZyhjb250cm9sKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRyb2wudHlwZSA9PSBQcmVzZW50YXRpb25Db250cm9sVHlwZS5TdGF0dXMpIHtcbiAgICAgIGxldCBzdGF0dXNOYW1lID1cbiAgICAgICAgdGhpcy5hcHBNb2RlbC5zdGF0dXNlcy5maW5kKFxuICAgICAgICAgIChzKSA9PiBzLmlkID09PSB0aGlzLmZpbGxEYXRhPy5tZXRhZGF0YS5zdGF0dXNJZFxuICAgICAgICApPy5uYW1lIHx8ICdubyBzdGF0dXMgbmFtZSc7XG5cbiAgICAgIGZvcm1seUNvbmZpZy5kZWZhdWx0VmFsdWUgPSBzdGF0dXNOYW1lO1xuICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZm9ybWx5LXBhcmFncmFwaCc7XG4gICAgICBmb3JtbHlDb25maWcuY2xhc3NOYW1lID0gJ2NvbXBvbmVudC10ZXh0LWZpZWxkJztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKFxuICAgICAgICBjb250cm9sLnR5cGUgPT0gUHJlc2VudGF0aW9uQ29udHJvbFR5cGUuRmx1eENvbXBvbmVudCAmJlxuICAgICAgICB0aGlzLmNvbnRyb2xJZHNXaXRoVmFsdWVzICYmXG4gICAgICAgIGNvbnRyb2wuY29sbGVjdGlvbkNvbnRyb2xJZGVudGlmaWVyXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZmlsbFZhbHVlID1cbiAgICAgICAgICB0aGlzLmNvbnRyb2xJZHNXaXRoVmFsdWVzW2NvbnRyb2wuY29sbGVjdGlvbkNvbnRyb2xJZGVudGlmaWVyXTtcbiAgICAgICAgaWYgKGZpbGxWYWx1ZSkge1xuICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGZpbGxWYWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAgIGZvcm1seUNvbmZpZy5kZWZhdWx0VmFsdWUgPSBmaWxsVmFsdWUgPyAnJmNoZWNrOycgOiAnJmNyb3NzOyc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBpZiAoZmlsbFZhbHVlPy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IGZpbGxWYWx1ZS5uYW1lO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcm1seUNvbmZpZy5kZWZhdWx0VmFsdWUgPSBmaWxsVmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9ybWx5Q29uZmlnLmlkID0gY29udHJvbC5pZGVudGlmaWVyO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2lzRGlzcGxheU1vZGUnXSA9IHRydWU7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnY29sbGVjdGlvbkNvbnRyb2xJZGVudGlmaWVyJ10gPVxuICAgICAgY29udHJvbC5jb2xsZWN0aW9uQ29udHJvbElkZW50aWZpZXI7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnbGFiZWwnXSA9IHRyYW5zbGF0ZWRUaXRsZTtcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydsYW5nSXNvJ10gPSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbztcblxuICAgIHRoaXMuZm9ybWx5UHJlc2VudGF0aW9uRmllbGRzLnB1c2goZm9ybWx5Q29uZmlnKTtcblxuICAgIHJldHVybiBmb3JtbHlDb25maWc7XG4gIH1cblxuICBhc3luYyBidWlsZEFwaU1ldGhvZEZvcm1GaWVsZEFzeW5jKFxuICAgIHN0ZXA6IFN0ZXBEYXRhIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRyb2w6IFByZXNlbnRhdGlvbkNvbnRyb2xcbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZz4ge1xuICAgIGxldCBmb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnID0geyBwcm9wczoge30gfTtcblxuICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2Zvcm1seS1wYXJhZ3JhcGgnO1xuICAgIGZvcm1seUNvbmZpZy5jbGFzc05hbWUgPSAnY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2Rlc2lnbiddID0gdGhpcy5hcHBNb2RlbC5nZW5lcmF0ZWRDc3M7XG5cbiAgICB2YXIgdHJhbnNsYXRlZFRpdGxlID1cbiAgICAgIGNvbnRyb2wudHJhbnNsYXRpb25zLmZpbmQoKGQpID0+IGQubGFuZ3VhZ2VJc28gPT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28pXG4gICAgICAgID8udmFsdWUgPz9cbiAgICAgIGNvbnRyb2wudGl0bGUgPz9cbiAgICAgICcnO1xuXG4gICAgZm9ybWx5Q29uZmlnLmlkID0gY29udHJvbC5pZGVudGlmaWVyO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2lzRGlzcGxheU1vZGUnXSA9IHRydWU7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnYXBpTWV0aG9kSWQnXSA9IGNvbnRyb2wuYXBpTWV0aG9kSWQ7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnYXBpTWV0aG9kRmllbGRJZCddID0gY29udHJvbC5hcGlNZXRob2RGaWVsZElkO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2xhYmVsJ10gPSB0cmFuc2xhdGVkVGl0bGU7XG5cbiAgICBpZiAoY29udHJvbC5hcGlNZXRob2RGaWVsZElkKSB7XG4gICAgICBjb25zdCB2YWwgPSB0aGlzLmZpbmRJbkFwaUNhbGxzUmVzcG9uc2VzKGNvbnRyb2wuYXBpTWV0aG9kRmllbGRJZCk7XG4gICAgICBmb3JtbHlDb25maWcuZGVmYXVsdFZhbHVlID0gdmFsO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybWx5UHJlc2VudGF0aW9uRmllbGRzLnB1c2goZm9ybWx5Q29uZmlnKTtcblxuICAgIHJldHVybiBmb3JtbHlDb25maWc7XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFRvRGVwZW5kZW50RGljdGlvbmFyeUlmTmVjZXNzYXJ5KFxuICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IERlcGVuZGVudERpY3Rpb25hcnlEYXRhLFxuICAgIGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWdcbiAgKSB7XG4gICAgLy8gSGFuZGxlIGRpY3Rpb25hcnkgZGVwZW5kZW5jaWVzXG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeSAmJlxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeS5kaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXJcbiAgICApIHtcbiAgICAgIGNvbnN0IHBhcmVudEtleSA9IGRlcGVuZGVudERpY3Rpb25hcnkuZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyO1xuICAgICAgY29uc3QgZGVwZW5kZW50VmFsdWVJZHMgPSBkZXBlbmRlbnREaWN0aW9uYXJ5LmRlcGVuZGVudFZhbHVlSWRzIHx8IFtdO1xuXG4gICAgICBmb3JtbHlDb25maWcuZXhwcmVzc2lvbnMgPSB7XG4gICAgICAgIGhpZGU6IChmaWVsZDogRm9ybWx5RmllbGRDb25maWcpID0+IHtcbiAgICAgICAgICBjb25zdCBzaG91bGRTaG93ID0gdGhpcy5zaG91bGRTaG93RGVwZW5kZW50RmllbGQoXG4gICAgICAgICAgICBwYXJlbnRLZXksXG4gICAgICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkcyxcbiAgICAgICAgICAgIHRoaXMubW9kZWxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiAhc2hvdWxkU2hvdztcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhdHRhY2hUb1ZhbHVlQ2hhbmdlcyhjb250cm9sSWQ6IHN0cmluZywgb3B0aW9uczogRm9ybWx5RmllbGRDb25maWcpIHtcbiAgICBvcHRpb25zLnByb3BzIVsnb25TZWxlY3RlZFZhbHVlQ2hhbmdlZCddID0gYXN5bmMgKHZhbDogYW55KSA9PiB7XG4gICAgICB0aGlzLm1vZGVsW2NvbnRyb2xJZF0gPSB2YWw7XG4gICAgICB2YXIgcmVmZXJlbmNlRGljdGlvbmFyaWVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5TWFwLnZhbHVlcygpXG4gICAgICApLmZpbHRlcigoZCkgPT4gZC5yZWZlcmVuY2VJZCA9PSB2YWwuZGljdGlvbmFyeUlkKTtcbiAgICAgIGlmIChyZWZlcmVuY2VEaWN0aW9uYXJpZXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5yZW1vdmVSZWZlcmVuY2VGaWVsZHMob3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHJlZmVyZW5jZURpY3Rpb25hcmllc1dpdGhGaWx0ZXJlZFZhbHVlcyA9XG4gICAgICAgICAgdGhpcy5jcmVhdGVSZWZlcmVuY2VEaWN0aW9uYXJpZXNGcm9tU2VsZWN0ZWRWYWx1ZShcbiAgICAgICAgICAgIHJlZmVyZW5jZURpY3Rpb25hcmllcyxcbiAgICAgICAgICAgIHZhbFxuICAgICAgICAgICk7XG4gICAgICAgIGNvbnN0IHBhcmVudFNwZWNpZmljRGF0YSA9IG9wdGlvbnMucHJvcHM/LltcbiAgICAgICAgICAnc3BlY2lmaWNEYXRhJ1xuICAgICAgICBdIGFzIERpY3Rpb25hcnlDb250cm9sRGF0YTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRSZWZlcmVuY2VEaWN0aW9uYXJ5RmllbGRzSWZOZWNlc3NhcnkoXG4gICAgICAgICAgcmVmZXJlbmNlRGljdGlvbmFyaWVzV2l0aEZpbHRlcmVkVmFsdWVzLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgb3B0aW9ucy50eXBlLFxuICAgICAgICAgIHBhcmVudFNwZWNpZmljRGF0YT8ucmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9ucyB8fCBbXVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVSZWZlcmVuY2VGaWVsZHMob3B0aW9ucyk7XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgIH07XG4gIH1cblxuICBjcmVhdGVSZWZlcmVuY2VEaWN0aW9uYXJpZXNGcm9tU2VsZWN0ZWRWYWx1ZShcbiAgICBhbGxEaWN0aW9uYXJpZXM6IERpY3Rpb25hcnlEdG9bXSxcbiAgICBzZWxlY3RlZFZhbHVlOiBhbnlcbiAgKTogRGljdGlvbmFyeUR0b1tdIHtcbiAgICBjb25zdCBuZXdEaWN0aW9uYXJpZXM6IERpY3Rpb25hcnlEdG9bXSA9IFtdO1xuXG4gICAgYWxsRGljdGlvbmFyaWVzLmZvckVhY2goKGRpY3Rpb25hcnkpID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkVmFsdWVzID1cbiAgICAgICAgZGljdGlvbmFyeS52YWx1ZXM/LmZpbHRlcigodmFsdWUpID0+XG4gICAgICAgICAgdmFsdWUucmVmZXJlbmNlVmFsdWVzLnNvbWUoXG4gICAgICAgICAgICAocmVmVmFsdWUpID0+IHJlZlZhbHVlLmlkID09PSBzZWxlY3RlZFZhbHVlLmlkXG4gICAgICAgICAgKVxuICAgICAgICApIHx8IFtdO1xuXG4gICAgICBpZiAoZmlsdGVyZWRWYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBuZXdEaWN0aW9uYXJ5OiBEaWN0aW9uYXJ5RHRvID0ge1xuICAgICAgICAgIC4uLmRpY3Rpb25hcnksXG4gICAgICAgICAgdmFsdWVzOiBmaWx0ZXJlZFZhbHVlcyxcbiAgICAgICAgfTtcblxuICAgICAgICBuZXdEaWN0aW9uYXJpZXMucHVzaChuZXdEaWN0aW9uYXJ5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBuZXdEaWN0aW9uYXJpZXM7XG4gIH1cblxuICBzaG91bGRTaG93RGVwZW5kZW50RmllbGQoXG4gICAgcGFyZW50S2V5OiBzdHJpbmcsXG4gICAgZGVwZW5kZW50VmFsdWVJZHM6IG51bWJlcltdLFxuICAgIG1vZGVsOiBhbnkgPSB7fVxuICApOiBib29sZWFuIHtcbiAgICAvLyBSZXRyaWV2ZSB0aGUgdmFsdWUgb2YgdGhlIHBhcmVudCBkaWN0aW9uYXJ5IGNvbnRyb2xcbiAgICBjb25zdCBwYXJlbnRWYWx1ZSA9IHRoaXMuZ2V0TmVzdGVkVmFsdWUoXG4gICAgICBtb2RlbCxcbiAgICAgIHBhcmVudEtleVxuICAgICkgYXMgRGljdGlvbmFyeVZhbHVlO1xuXG4gICAgY29uc3QgaWRWYWx1ZSA9IHBhcmVudFZhbHVlPy5pZFxuICAgICAgPyBwYXJlbnRWYWx1ZS5pZFxuICAgICAgOiAocGFyZW50VmFsdWUgYXMgdW5rbm93biBhcyBudW1iZXIpO1xuICAgIC8vIENoZWNrIGlmIHRoZSBwYXJlbnQgdmFsdWUgaXMgaW4gdGhlIGRlcGVuZGVudFZhbHVlSWRzXG4gICAgaWYgKHBhcmVudFZhbHVlICYmIGRlcGVuZGVudFZhbHVlSWRzLmluY2x1ZGVzKGlkVmFsdWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0TmVzdGVkVmFsdWUob2JqOiBhbnksIHBhdGg6IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICBsZXQgdmFsdWUgPSBvYmo7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgdmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgc3VibWl0KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdGb3JtIERhdGE6JywgdGhpcy5mb3JtLnZhbHVlKTtcbiAgICBpZiAodGhpcy5mb3JtLmludmFsaWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdGb3JtIGRhdGEgaGFzIHZhbGlkYXRpb24gZXJyb3JzLicpO1xuICAgICAgdGhpcy5zY3JvbGxUb0Vycm9yU2VydmljZS5zY3JvbGxUb0ZpcnN0RXJyb3IodGhpcy5mb3JtKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIG1ldGhvZCB0byB0cmlnZ2VyIHNjcm9sbCB0byBmaXJzdCBlcnJvciAtIGNhbiBiZSBjYWxsZWQgZnJvbSBvdGhlciBjb21wb25lbnRzXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsVG9GaXJzdFZhbGlkYXRpb25FcnJvcigpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbFRvRXJyb3JTZXJ2aWNlLnNjcm9sbFRvRmlyc3RFcnJvcih0aGlzLmZvcm0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBtZXRob2QgdG8gc2Nyb2xsIHRvIGEgc3BlY2lmaWMgZmllbGQgYnkgbmFtZVxuICAgKi9cbiAgcHVibGljIHNjcm9sbFRvRmllbGQoZmllbGROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbFRvRXJyb3JTZXJ2aWNlLnNjcm9sbFRvRmllbGQoZmllbGROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWJ1ZyBtZXRob2QgdG8gaGVscCB0cm91Ymxlc2hvb3Qgc2Nyb2xsIGlzc3Vlc1xuICAgKi9cbiAgcHVibGljIGRlYnVnRm9ybUVsZW1lbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsVG9FcnJvclNlcnZpY2UuZGVidWdMb2dGb3JtRWxlbWVudHMoKTtcbiAgfVxuXG4gIGFzeW5jIGNvbnN0cnVjdERpY3Rpb25hcnkoXG4gICAgY29udHJvbDogQ29udHJvbERhdGEsXG4gICAgb3B0aW9uczogRm9ybWx5RmllbGRDb25maWdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3BlY2lmaWNEYXRhID0gY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhO1xuXG4gICAgLy8gRGV0ZXJtaW5lIGNvbXBvbmVudCB0eXBlIGJhc2VkIG9uIHNldHRpbmdzXG4gICAgaWYgKHNwZWNpZmljRGF0YS5zaG93QXNDaGVja2JveGVzID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnR5cGUgPSAnZm9ybWx5LWNoZWNrYm94ZXMnO1xuICAgIH0gZWxzZSBpZiAoc3BlY2lmaWNEYXRhLnNob3dBc1JhZGlvQnV0dG9uc0xpc3QgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMudHlwZSA9ICdmb3JtbHktcmFkaW8nO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zLnR5cGUgPSAnZm9ybWx5LWRpY3Rpb25hcnktZHJvcGRvd24tdHJlZSc7XG4gICAgfVxuXG4gICAgb3B0aW9ucy5wcm9wcyFbJ3NwZWNpZmljRGF0YSddID0gc3BlY2lmaWNEYXRhO1xuXG4gICAgY29uc3QgZGljdGlvbmFyeVV1aWQgPSBzcGVjaWZpY0RhdGEuZGljdGlvbmFyeVVVSUQ7XG5cbiAgICBpZiAoZGljdGlvbmFyeVV1aWQpIHtcbiAgICAgIGNvbnN0IGRpY3Rpb25hcnkgPSB0aGlzLmRpY3Rpb25hcnlNYXAuZ2V0KGRpY3Rpb25hcnlVdWlkKTtcbiAgICAgIGlmIChkaWN0aW9uYXJ5KSB7XG4gICAgICAgIGlmIChkaWN0aW9uYXJ5LnJlZmVyZW5jZUlkKSB7XG4gICAgICAgICAgb3B0aW9ucy5wcm9wcyFbJ2RpY3Rpb25hcnlJZCddID0gZGljdGlvbmFyeVV1aWQ7XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3REaWN0aW9uYXJ5V2l0aFJlZmVyZW5jZXMoXG4gICAgICAgICAgICBkaWN0aW9uYXJ5LFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIHNwZWNpZmljRGF0YVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5hdHRhY2hUb1ZhbHVlQ2hhbmdlcyhjb250cm9sLmlkZW50aWZpZXIsIG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFR5cGUgaXMgYWxyZWFkeSBzZXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWV0aG9kXG4gICAgICAgICAgb3B0aW9ucy5wcm9wcyFbJ2RpY3Rpb25hcnlJZCddID0gZGljdGlvbmFyeVV1aWQ7XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3REaWN0aW9uYXJ5V2l0aFJlZmVyZW5jZXMoXG4gICAgICAgICAgICBkaWN0aW9uYXJ5LFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIHNwZWNpZmljRGF0YVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5hdHRhY2hUb1ZhbHVlQ2hhbmdlcyhjb250cm9sLmlkZW50aWZpZXIsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYERpY3Rpb25hcnkgbm90IGZvdW5kIGZvciBVVUlEICR7ZGljdGlvbmFyeVV1aWR9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFVVSUQgbm90IGZvdW5kIGZvciBkaWN0aW9uYXJ5IElEICR7c3BlY2lmaWNEYXRhLmRpY3Rpb25hcnlJZH1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmluZERpY3Rpb25hcnlWYWx1ZU9iamVjdChcbiAgICBkaWN0aW9uYXJ5OiBEaWN0aW9uYXJ5RHRvIHwgdW5kZWZpbmVkLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogRGljdGlvbmFyeVZhbHVlRHRvIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoXG4gICAgICAhZGljdGlvbmFyeSB8fFxuICAgICAgIWRpY3Rpb25hcnkudmFsdWVzIHx8XG4gICAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWU/LmlkICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBkaWN0aW9uYXJ5LnZhbHVlcy5maW5kKCh2KSA9PiB2LmlkID09PSB2YWx1ZS5pZCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHZhbHVlSWQgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKCFpc05hTih2YWx1ZUlkKSkge1xuICAgICAgICByZXR1cm4gZGljdGlvbmFyeS52YWx1ZXMuZmluZCgodikgPT4gdi5pZCA9PT0gdmFsdWVJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVSZWZlcmVuY2VGaWVsZHMoXG4gICAgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdLFxuICAgIHJvb3RDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnW10gPSB0aGlzLmZvcm1seUNvbmZpZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWZpZWxkcykgcmV0dXJuO1xuICAgIGNvbnN0IGZpZWxkc1RvUHJvY2VzcyA9IFsuLi5maWVsZHNdO1xuXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHNUb1Byb2Nlc3MpIHtcbiAgICAgIGNvbnN0IGZpZWxkS2V5ID0gZmllbGQua2V5IGFzIHN0cmluZztcbiAgICAgIGlmIChcbiAgICAgICAgZmllbGRLZXkgJiZcbiAgICAgICAgZmllbGQucHJvcHM/LlsnZGljdGlvbmFyeUlkJ10gJiZcbiAgICAgICAgZmllbGQucHJvcHM/Llsnc3BlY2lmaWNEYXRhJ11cbiAgICAgICkge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChmaWVsZEtleSk7XG4gICAgICAgIGNvbnN0IHNwZWNpZmljRGF0YSA9IGZpZWxkLnByb3BzW1xuICAgICAgICAgICdzcGVjaWZpY0RhdGEnXG4gICAgICAgIF0gYXMgRGljdGlvbmFyeUNvbnRyb2xEYXRhO1xuICAgICAgICBjb25zdCBkaWN0aW9uYXJ5VXVpZCA9IGZpZWxkLnByb3BzWydkaWN0aW9uYXJ5SWQnXSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IG1haW5EaWN0aW9uYXJ5ID0gdGhpcy5kaWN0aW9uYXJ5TWFwLmdldChkaWN0aW9uYXJ5VXVpZCk7XG5cbiAgICAgICAgbGV0IHZhbHVlVG9Vc2U6IGFueSA9IG51bGw7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC52YWx1ZSAhPT0gbnVsbCAmJiBjb250cm9sLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YWx1ZVRvVXNlID0gY29udHJvbC52YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBmaWVsZC5kZWZhdWx0VmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICBmaWVsZC5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB2YWx1ZVRvVXNlID0gZmllbGQuZGVmYXVsdFZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMubW9kZWwgJiZcbiAgICAgICAgICB0aGlzLm1vZGVsW2ZpZWxkS2V5XSAhPT0gbnVsbCAmJlxuICAgICAgICAgIHRoaXMubW9kZWxbZmllbGRLZXldICE9PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFsdWVUb1VzZSA9IHRoaXMubW9kZWxbZmllbGRLZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkVmFsdWVPYmplY3Q6IERpY3Rpb25hcnlWYWx1ZUR0byB8IHVuZGVmaW5lZCB8IG51bGwgPSBudWxsO1xuICAgICAgICBpZiAodmFsdWVUb1VzZSAhPT0gbnVsbCAmJiBtYWluRGljdGlvbmFyeT8uaWQgIT0gbnVsbCkge1xuICAgICAgICAgIHNlbGVjdGVkVmFsdWVPYmplY3QgPSB0aGlzLmZpbmREaWN0aW9uYXJ5VmFsdWVPYmplY3QoXG4gICAgICAgICAgICBtYWluRGljdGlvbmFyeSxcbiAgICAgICAgICAgIHZhbHVlVG9Vc2VcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmllbGRDb25maWdJblRyZWUgPSB0aGlzLmZpbmRGaWVsZEJ5S2V5KHJvb3RDb25maWcsIGZpZWxkS2V5KTtcbiAgICAgICAgaWYgKCFmaWVsZENvbmZpZ0luVHJlZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1vdmVSZWZlcmVuY2VGaWVsZHMoZmllbGRDb25maWdJblRyZWUpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBzZWxlY3RlZFZhbHVlT2JqZWN0ICYmXG4gICAgICAgICAgc2VsZWN0ZWRWYWx1ZU9iamVjdC5pZCAhPSBudWxsICYmXG4gICAgICAgICAgbWFpbkRpY3Rpb25hcnk/LmlkICE9IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcG90ZW50aWFsUmVmZXJlbmNlRGljdGlvbmFyaWVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeU1hcC52YWx1ZXMoKVxuICAgICAgICAgICkuZmlsdGVyKChkaWN0KSA9PiBkaWN0LnJlZmVyZW5jZUlkID09PSBtYWluRGljdGlvbmFyeS5pZCk7XG5cbiAgICAgICAgICBpZiAocG90ZW50aWFsUmVmZXJlbmNlRGljdGlvbmFyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZURpY3Rpb25hcmllc1RvU2hvdyA9XG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlUmVmZXJlbmNlRGljdGlvbmFyaWVzRnJvbVNlbGVjdGVkVmFsdWUoXG4gICAgICAgICAgICAgICAgcG90ZW50aWFsUmVmZXJlbmNlRGljdGlvbmFyaWVzLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVPYmplY3RcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHJlZmVyZW5jZURpY3Rpb25hcmllc1RvU2hvdy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkUmVmZXJlbmNlRGljdGlvbmFyeUZpZWxkc0lmTmVjZXNzYXJ5KFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZURpY3Rpb25hcmllc1RvU2hvdyxcbiAgICAgICAgICAgICAgICBmaWVsZENvbmZpZ0luVHJlZSxcbiAgICAgICAgICAgICAgICBmaWVsZENvbmZpZ0luVHJlZS50eXBlLFxuICAgICAgICAgICAgICAgIHNwZWNpZmljRGF0YT8ucmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9ucyB8fCBbXVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmllbGQuZmllbGRHcm91cCAmJiBmaWVsZC5maWVsZEdyb3VwLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUmVmZXJlbmNlRmllbGRzKGZpZWxkLmZpZWxkR3JvdXAsIHJvb3RDb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBmaWVsZHMgPT09IHRoaXMuZm9ybWx5Q29uZmlnIHx8XG4gICAgICBmaWVsZHMgPT09IHRoaXMuZm9ybWx5Q29uZmlnWzBdPy5maWVsZEdyb3VwXG4gICAgKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgICAgdGhpcy5mb3JtbHlDb25maWdVcGRhdGVkLmVtaXQoKTtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdERpY3Rpb25hcnlXaXRoUmVmZXJlbmNlcyhcbiAgICBkaWN0aW9uYXJ5OiBEaWN0aW9uYXJ5RHRvLFxuICAgIG9wdGlvbnM6IEZvcm1seUZpZWxkQ29uZmlnLFxuICAgIGRpY3Rpb25hcnlDb250cm9sRGF0YTogRGljdGlvbmFyeUNvbnRyb2xEYXRhXG4gICkge1xuICAgIGlmIChvcHRpb25zLnByb3BzKSB7XG4gICAgICB2YXIgY3VycmVudExhbmd1YWdlSWQgPSBVdGlscy5maW5kTGFuZ3VhZ2VJZEJ5SXNvKFxuICAgICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICk7XG5cbiAgICAgIC8vIFBhc3MgcHJlbG9hZGVkIGRpY3Rpb25hcnkgZGF0YSB0byBmb3JtbHkgY29tcG9uZW50XG4gICAgICBvcHRpb25zLnByb3BzWydkaWN0aW9uYXJ5RGF0YSddID0gZGljdGlvbmFyeTtcbiAgICAgIG9wdGlvbnMucHJvcHNbJ2xhbmd1YWdlcyddID0gdGhpcy5hdmFpbGFibGVMYW5ndWFnZXM7XG4gICAgICBvcHRpb25zLnByb3BzWydwcmVsb2FkZWREaWN0aW9uYXJpZXMnXSA9IHRoaXMuZGljdGlvbmFyeU1hcDtcbiAgICAgIG9wdGlvbnMucHJvcHNbJ3VzZVByZWxvYWRlZERhdGEnXSA9IHRydWU7XG5cbiAgICAgIG9wdGlvbnMucHJvcHMub3B0aW9ucyA9IGRpY3Rpb25hcnkudmFsdWVzPy5tYXAoKHZhbHVlKSA9PiAoe1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGxhYmVsOlxuICAgICAgICAgIFV0aWxzLmZpbmRWYWx1ZVRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgdmFsdWUudmFsdWVUcmFuc2xhdGlvbnMsXG4gICAgICAgICAgICBjdXJyZW50TGFuZ3VhZ2VJZFxuICAgICAgICAgICkgfHwgdmFsdWUubmFtZSxcbiAgICAgICAgY3VycmVudExhbmd1YWdlSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgcmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9uczpcbiAgICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbERhdGEucmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9ucyxcbiAgICAgIH0pKTtcblxuICAgICAgb3B0aW9ucy5wcm9wc1snc2VsZWN0ZWRSZWxhdGVkRGljdGlvbmFyaWVzJ10gPVxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbERhdGEuc2VsZWN0ZWRSZWxhdGVkRGljdGlvbmFyaWVzIHx8IFtdO1xuICAgICAgb3B0aW9ucy5wcm9wc1snYWxsb3dNdWx0aXBsZVNlbGVjdGlvbiddID1cbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xEYXRhLmFsbG93TXVsdGlwbGVTZWxlY3Rpb24gfHwgZmFsc2U7XG5cbiAgICAgIGxldCBpbml0aWFsVmFsdWVPYmplY3Q6IERpY3Rpb25hcnlWYWx1ZSB8IG51bGwgPSBudWxsO1xuICAgICAgY29uc3QgY29udHJvbEtleSA9IG9wdGlvbnMua2V5IGFzIHN0cmluZztcbiAgICAgIGNvbnN0IGRpY3Rpb25hcnlEZWZhdWx0VmFsdWVJZCA9XG4gICAgICAgIGRpY3Rpb25hcnlDb250cm9sRGF0YS5kaWN0aW9uYXJ5RGVmYXVsdFZhbHVlSWQ7XG4gICAgICBpZiAoXG4gICAgICAgICEodGhpcy5tb2RlbCAmJiB0aGlzLm1vZGVsW2NvbnRyb2xLZXldICE9IG51bGwpICYmXG4gICAgICAgIGRpY3Rpb25hcnlEZWZhdWx0VmFsdWVJZCAhPSBudWxsXG4gICAgICApIHtcbiAgICAgICAgaW5pdGlhbFZhbHVlT2JqZWN0ID0gdGhpcy5maW5kQW5kTWFwRGVmYXVsdFZhbHVlKFxuICAgICAgICAgIGRpY3Rpb25hcnksXG4gICAgICAgICAgZGljdGlvbmFyeURlZmF1bHRWYWx1ZUlkXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIG9wdGlvbnMuZGVmYXVsdFZhbHVlID0gaW5pdGlhbFZhbHVlT2JqZWN0O1xuXG4gICAgICAvLyBQYXNzIGRlZmF1bHQgdmFsdWUgSUQgdG8gZm9ybWx5IGNvbXBvbmVudFxuICAgICAgb3B0aW9ucy5wcm9wc1snZGljdGlvbmFyeURlZmF1bHRWYWx1ZUlkJ10gPSBkaWN0aW9uYXJ5RGVmYXVsdFZhbHVlSWQ7XG5cbiAgICAgIGNvbnN0IGNvbnRyb2xJZCA9IG9wdGlvbnMua2V5O1xuICAgICAgaWYgKHRoaXMuZmlsbERhdGEgJiYgdGhpcy5maWxsRGF0YS5mbHV4KSB7XG4gICAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiB0aGlzLmZpbGxEYXRhLmZsdXgpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc3RlcC5zZWN0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IHNlY3Rpb24uY29udHJvbHMuZmluZChcbiAgICAgICAgICAgICAgKGN0cmw6IHtcbiAgICAgICAgICAgICAgICBjb250cm9sSWQ6IHN0cmluZyB8IG51bWJlciB8IChzdHJpbmcgfCBudW1iZXIpW10gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH0pID0+IGN0cmwuY29udHJvbElkID09PSBjb250cm9sSWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLmZpbGxWYWx1ZSAmJiBjb250cm9sLmZpbGxWYWx1ZS5uYW1lKSB7XG4gICAgICAgICAgICAgIG9wdGlvbnMucHJvcHNbJ3ZhbHVlJ10gPSBjb250cm9sLmZpbGxWYWx1ZS5uYW1lO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGVGb3JtbHlDb25maWcoKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFJlZmVyZW5jZURpY3Rpb25hcnlGaWVsZHNJZk5lY2Vzc2FyeShcbiAgICByZWZlcnJlbmNlZERpY3Rpb25hcmllczogYW55W10sXG4gICAgcGFyZW50RGljdGlvbmFyeUZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZyxcbiAgICB0eXBlOiBhbnksXG4gICAgcmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9uczogRGljdGlvbmFyeUxhYmVsSW5mb1tdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChyZWZlcnJlbmNlZERpY3Rpb25hcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFJlbGF0ZWREaWN0aW9uYXJpZXMgPVxuICAgICAgICBwYXJlbnREaWN0aW9uYXJ5RmllbGQucHJvcHM/Llsnc2VsZWN0ZWRSZWxhdGVkRGljdGlvbmFyaWVzJ10gfHwgW107XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkRGljdGlvbmFyaWVzID0gcmVmZXJyZW5jZWREaWN0aW9uYXJpZXMuZmlsdGVyKChkaWN0KSA9PlxuICAgICAgICBzZWxlY3RlZFJlbGF0ZWREaWN0aW9uYXJpZXMuaW5jbHVkZXMoZGljdC51dWlkKVxuICAgICAgKTtcblxuICAgICAgc2VsZWN0ZWREaWN0aW9uYXJpZXMuZm9yRWFjaCgocmVmZXJlbmNlRGljdGlvbmFyeSkgPT4ge1xuICAgICAgICBjb25zdCByZWZlcmVuY2VEaWN0aW9uYXJ5VXVpZCA9IHJlZmVyZW5jZURpY3Rpb25hcnkudXVpZDtcblxuICAgICAgICBjb25zdCBjb21wb25lbnRPbmx5Rm9yQ29uZmlnID0gdGhpcy5mbHV4XG4gICAgICAgICAgLmZsYXRNYXAoKHMpID0+IHMuc2VjdGlvbnMpXG4gICAgICAgICAgLmZsYXRNYXAoKHNlYykgPT4gc2VjLmNvbnRyb2xzKVxuICAgICAgICAgIC5maW5kKFxuICAgICAgICAgICAgKGN0cmwpID0+XG4gICAgICAgICAgICAgIGN0cmw/LnNwZWNpZmljQ29udHJvbERhdGE/LmRpY3Rpb25hcnlVVUlEID09PVxuICAgICAgICAgICAgICByZWZlcmVuY2VEaWN0aW9uYXJ5VXVpZCAmJiBjdHJsPy5pc09ubHlGb3JDb25maWcgPT09IHRydWVcbiAgICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG5ld0ZpZWxkS2V5ID1cbiAgICAgICAgICBjb21wb25lbnRPbmx5Rm9yQ29uZmlnPy5pZGVudGlmaWVyID8/XG4gICAgICAgICAgYGV4dHJhXyR7cmVmZXJlbmNlRGljdGlvbmFyeVV1aWR9YDtcblxuICAgICAgICBsZXQgcmVmZXJlbmNlRGljdGlvbmFyeUxhYmVsID0gcmVmZXJlbmNlRGljdGlvbmFyeS5uYW1lO1xuXG4gICAgICAgIGNvbnN0IHNwZWNpZmljVHJhbnNsYXRpb25WYWx1ZSA9IHJlbGF0ZWREaWN0aW9uYXJpZXNUcmFuc2xhdGlvbnNcbiAgICAgICAgICAuZmluZCgoZCkgPT4gZC5kaWN0aW9uYXJ5VVVJRCA9PSByZWZlcmVuY2VEaWN0aW9uYXJ5VXVpZClcbiAgICAgICAgICA/LnRyYW5zbGF0aW9ucz8uZmluZChcbiAgICAgICAgICAgICh0KSA9PiB0Lmxhbmd1YWdlSXNvID09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKT8udmFsdWU7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNwZWNpZmljVHJhbnNsYXRpb25WYWx1ZSAmJlxuICAgICAgICAgIHNwZWNpZmljVHJhbnNsYXRpb25WYWx1ZS50cmltKCkgIT09ICcnXG4gICAgICAgICkge1xuICAgICAgICAgIHJlZmVyZW5jZURpY3Rpb25hcnlMYWJlbCA9IHNwZWNpZmljVHJhbnNsYXRpb25WYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWZlcmVuY2VEaWN0aW9uYXJ5TGFiZWwgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2VJZCA9IFV0aWxzLmZpbmRMYW5ndWFnZUlkQnlJc28oXG4gICAgICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMsXG4gICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBuZXdGaWVsZDogRm9ybWx5RmllbGRDb25maWcgPSB7XG4gICAgICAgICAga2V5OiBuZXdGaWVsZEtleSxcbiAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbDogcmVmZXJlbmNlRGljdGlvbmFyeUxhYmVsLFxuICAgICAgICAgICAgZGVzaWduOiB0aGlzLmRlc2lnbixcbiAgICAgICAgICAgIGRpY3Rpb25hcnlJZDogcmVmZXJlbmNlRGljdGlvbmFyeVV1aWQsXG4gICAgICAgICAgICBkaWN0aW9uYXJ5RGF0YTogcmVmZXJlbmNlRGljdGlvbmFyeSxcbiAgICAgICAgICAgIGxhbmd1YWdlczogdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMsXG4gICAgICAgICAgICBwcmVsb2FkZWREaWN0aW9uYXJpZXM6IHRoaXMuZGljdGlvbmFyeU1hcCxcbiAgICAgICAgICAgIHVzZVByZWxvYWRlZERhdGE6IHRydWUsXG4gICAgICAgICAgICBjdXJyZW50TGFuZ3VhZ2VJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICAgICAgY3VycmVudExhbmd1YWdlSWQ6IGN1cnJlbnRMYW5ndWFnZUlkLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgIHN0eWxlOiB0aGlzLnN0eWxlT2JqZWN0VG9TdHJpbmdFeGNlcHRCYWNrZ3JvdW5kKFxuICAgICAgICAgICAgICAgIHRoaXMuZGVzaWduW2AuZm9udC1saXN0YF0gfHwge31cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcHRpb25zOiByZWZlcmVuY2VEaWN0aW9uYXJ5LnZhbHVlcz8ubWFwKCh2YWx1ZTogYW55KSA9PiAoe1xuICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgIGxhYmVsOlxuICAgICAgICAgICAgICAgIFV0aWxzLmZpbmRWYWx1ZVRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgICAgICAgdmFsdWUudmFsdWVUcmFuc2xhdGlvbnMsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50TGFuZ3VhZ2VJZFxuICAgICAgICAgICAgICAgICkgfHwgdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgY3VycmVudExhbmd1YWdlSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChyZWZlcmVuY2VEaWN0aW9uYXJ5LmRlZmF1bHRWYWx1ZUlkKSB7XG4gICAgICAgICAgY29uc3QgZGVmYXVsdFZhbCA9IHRoaXMuZmluZEFuZE1hcERlZmF1bHRWYWx1ZShcbiAgICAgICAgICAgIHJlZmVyZW5jZURpY3Rpb25hcnksXG4gICAgICAgICAgICByZWZlcmVuY2VEaWN0aW9uYXJ5LmRlZmF1bHRWYWx1ZUlkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZGVmYXVsdFZhbCkge1xuICAgICAgICAgICAgbmV3RmllbGQuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJlbnRGaWVsZEdyb3VwID0gcGFyZW50RGljdGlvbmFyeUZpZWxkLnBhcmVudFxuICAgICAgICAgID8gcGFyZW50RGljdGlvbmFyeUZpZWxkLnBhcmVudC5maWVsZEdyb3VwXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgICBpZiAocGFyZW50RmllbGRHcm91cCkge1xuICAgICAgICAgIGNvbnN0IHBhcmVudEluZGV4ID0gcGFyZW50RmllbGRHcm91cC5maW5kSW5kZXgoXG4gICAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLmtleSA9PT0gcGFyZW50RGljdGlvbmFyeUZpZWxkLmtleVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHBhcmVudEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSB0aGlzLmZpbmRMYXN0Q2hpbGRJbmRleChcbiAgICAgICAgICAgICAgcGFyZW50RmllbGRHcm91cCxcbiAgICAgICAgICAgICAgcGFyZW50SW5kZXhcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2VUb0FkZCA9IHRoaXMuZ2V0RXhpc3RpbmdQZXJjZW50YWdlKFxuICAgICAgICAgICAgICBwYXJlbnRGaWVsZEdyb3VwLFxuICAgICAgICAgICAgICBwYXJlbnRJbmRleFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG5ld0ZpZWxkLmNsYXNzTmFtZSA9IHBlcmNlbnRhZ2VUb0FkZCA9PT0gMFxuICAgICAgICAgICAgICA/IHBhcmVudERpY3Rpb25hcnlGaWVsZC5jbGFzc05hbWVcbiAgICAgICAgICAgICAgOiB0aGlzLmdldFBlcmNlbnRhZ2VDbGFzc05hbWUocGVyY2VudGFnZVRvQWRkKTtcblxuICAgICAgICAgICAgcGFyZW50RmllbGRHcm91cC5zcGxpY2UoZW5kSW5kZXggKyAxLCAwLCBuZXdGaWVsZCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZVRvQWRkID1cbiAgICAgICAgICAgICAgdHlwZSA9PT0gJ3JhZGlvJyA/IGAgY29tcG9uZW50LXJhZGlvYCA6IGAgY29tcG9uZW50LWRhdGFgO1xuICAgICAgICAgICAgbmV3RmllbGQuY2xhc3NOYW1lICs9IGNsYXNzTmFtZVRvQWRkO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hUb1ZhbHVlQ2hhbmdlcyhuZXdGaWVsZEtleSwgbmV3RmllbGQpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtbHlDb25maWcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldEV4aXN0aW5nUGVyY2VudGFnZShmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10sIGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCBwZXJjZW50YWdlID0gMDtcbiAgICBjb25zdCBmaWVsZCA9IGZpZWxkc1tpbmRleF07XG4gICAgY29uc3QgY2xhc3NOYW1lID0gZmllbGQuY2xhc3NOYW1lO1xuICAgIGlmIChmaWVsZC50eXBlPy50b1N0cmluZygpICE9PSBTdGVwQ29udHJvbFR5cGUuTmV3Um93LnRvU3RyaW5nKCkpIHtcbiAgICAgIGlmIChjbGFzc05hbWUgJiYgY2xhc3NOYW1lLnN0YXJ0c1dpdGgoJ3BlcmNlbnRhZ2Utd2lkdGgtJykpIHtcbiAgICAgICAgcGVyY2VudGFnZSA9XG4gICAgICAgICAgKHBhcnNlSW50KGNsYXNzTmFtZS5yZXBsYWNlKCdwZXJjZW50YWdlLXdpZHRoLScsICcnKSwgMTApICogMTAwKSAvIDEyO1xuICAgICAgfSBlbHNlIGlmIChjbGFzc05hbWUgJiYgY2xhc3NOYW1lLnN0YXJ0c1dpdGgoJ3BpeGVsLXdpZHRoLScpKSB7XG4gICAgICAgIGNvbnN0IHBpeGVscyA9IHBhcnNlSW50KGNsYXNzTmFtZS5yZXBsYWNlKCdwaXhlbC13aWR0aC0nLCAnJyksIDEwKTtcbiAgICAgICAgcGVyY2VudGFnZSA9IChwaXhlbHMgLyAxMDAwKSAqIDEwMDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBlcmNlbnRhZ2U7XG4gIH1cblxuICBjYWxjdWxhdGVSZW1haW5pbmdQZXJjZW50YWdlRm9yUmFuZ2UoXG4gICAgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdLFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICBlbmRJbmRleDogbnVtYmVyXG4gICk6IG51bWJlciB7XG4gICAgbGV0IHJlbWFpbmluZ1BlcmNlbnRhZ2UgPSAxMDA7XG5cbiAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsgaSsrKSB7XG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gdGhpcy5nZXRFeGlzdGluZ1BlcmNlbnRhZ2UoZmllbGRzLCBpKTtcbiAgICAgIHJlbWFpbmluZ1BlcmNlbnRhZ2UgLT0gcGVyY2VudGFnZTtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWF4KHJlbWFpbmluZ1BlcmNlbnRhZ2UsIDApO1xuICB9XG5cbiAgcmVtb3ZlUmVmZXJlbmNlRmllbGRzKGN1cnJlbnRGb3JtbHlGaWVsZENvbmZpZzogRm9ybWx5RmllbGRDb25maWcpIHtcbiAgICBjb25zdCByZWZlcnJlZEluRGljdGlvbmFyaWVzVVVJZHMgPVxuICAgICAgY3VycmVudEZvcm1seUZpZWxkQ29uZmlnLnByb3BzPy5bJ2RpY3Rpb25hcnlEYXRhJ11cbiAgICAgICAgPy5yZWZlcnJlZEluRGljdGlvbmFyaWVzVVVJZHM7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZlcnJlZEluRGljdGlvbmFyaWVzVVVJZHMpKSB7XG4gICAgICBjb25zdCBwYXJlbnRGaWVsZEdyb3VwID0gY3VycmVudEZvcm1seUZpZWxkQ29uZmlnLnBhcmVudFxuICAgICAgICA/IGN1cnJlbnRGb3JtbHlGaWVsZENvbmZpZy5wYXJlbnQuZmllbGRHcm91cFxuICAgICAgICA6IG51bGw7XG4gICAgICBpZiAocGFyZW50RmllbGRHcm91cCkge1xuICAgICAgICBjb25zdCBwYXJlbnRJbmRleCA9IHBhcmVudEZpZWxkR3JvdXAuZmluZEluZGV4KFxuICAgICAgICAgIChmaWVsZCkgPT4gZmllbGQua2V5ID09PSBjdXJyZW50Rm9ybWx5RmllbGRDb25maWcua2V5XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHBhcmVudEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiByZWZlcnJlZEluRGljdGlvbmFyaWVzVVVJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkVG9GaW5kID0gJ2V4dHJhXycgKyBpdGVtO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyZW50RmllbGRHcm91cC5sZW5ndGggLSAxOyBpID4gcGFyZW50SW5kZXg7IGktLSkge1xuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50RmllbGRLZXkgPSBwYXJlbnRGaWVsZEdyb3VwW2ldLmtleT8udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZEtleSAmJiBjdXJyZW50RmllbGRLZXkgPT09IGlkVG9GaW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckZvcm1Db250cm9sVmFsdWUoaWRUb0ZpbmQpO1xuICAgICAgICAgICAgICAgIHBhcmVudEZpZWxkR3JvdXAuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWRkQ2hpbGREaWN0aW9uYXJ5RmllbGQoXG4gICAgY2hpbGREaWN0aW9uYXJ5VXVpZDogc3RyaW5nLFxuICAgIHBhcmVudERpY3Rpb25hcnlGaWVsZDogRm9ybWx5RmllbGRDb25maWcsXG4gICAgdHlwZTogYW55LFxuICAgIHJlbGF0ZWREaWN0aW9uYXJpZXNUcmFuc2xhdGlvbnM6IERpY3Rpb25hcnlMYWJlbEluZm9bXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoY2hpbGREaWN0aW9uYXJ5VXVpZCkge1xuICAgICAgY29uc3QgY2hpbGREaWN0aW9uYXJ5ID0gdGhpcy5kaWN0aW9uYXJ5TWFwLmdldChjaGlsZERpY3Rpb25hcnlVdWlkKTtcbiAgICAgIGlmIChjaGlsZERpY3Rpb25hcnkpIHtcbiAgICAgICAgbGV0IGNoaWxkRGljdGlvbmFyeUxhYmVsID0gY2hpbGREaWN0aW9uYXJ5Lm5hbWU7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID1cbiAgICAgICAgICByZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zXG4gICAgICAgICAgICAuZmluZCgoZCkgPT4gZC5kaWN0aW9uYXJ5VVVJRCA9PSBjaGlsZERpY3Rpb25hcnlVdWlkKVxuICAgICAgICAgICAgPy50cmFuc2xhdGlvbnMuZmluZCgodCkgPT4gdC5sYW5ndWFnZUlzbyA9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbylcbiAgICAgICAgICAgID8udmFsdWUgfHwgJyc7XG4gICAgICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgICAgIGNoaWxkRGljdGlvbmFyeUxhYmVsID0gdHJhbnNsYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3RmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnID0ge1xuICAgICAgICAgIGtleTogYCR7cGFyZW50RGljdGlvbmFyeUZpZWxkLmtleX1fY2hpbGRfJHtjaGlsZERpY3Rpb25hcnlVdWlkfWAsXG4gICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgbGFiZWw6IGNoaWxkRGljdGlvbmFyeUxhYmVsLFxuICAgICAgICAgICAgZGljdGlvbmFyeURhdGE6IGNoaWxkRGljdGlvbmFyeSxcbiAgICAgICAgICAgIGxhbmd1YWdlczogdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMsXG4gICAgICAgICAgICBwcmVsb2FkZWREaWN0aW9uYXJpZXM6IHRoaXMuZGljdGlvbmFyeU1hcCxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNoaWxkRGljdGlvbmFyeS52YWx1ZXM/Lm1hcCgodmFsdWUpID0+ICh7XG4gICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS5pZCxcbiAgICAgICAgICAgICAgbGFiZWw6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgc3R5bGU6IHRoaXMuc3R5bGVPYmplY3RUb1N0cmluZ0V4Y2VwdEJhY2tncm91bmQoXG4gICAgICAgICAgICAgICAgdGhpcy5kZXNpZ25bYC5mb250LWxpc3RgXSB8fCB7fVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhvb2tzOiB7XG4gICAgICAgICAgICBvbkluaXQ6IChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgICAgICAgICAgICB0aGlzLmZpZWxkVW5zdWJzY3JpYmVTdWJqZWN0cy5wdXNoKHVuc3Vic2NyaWJlJCk7XG5cbiAgICAgICAgICAgICAgZmllbGQuZm9ybUNvbnRyb2w/LnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh1bnN1YnNjcmliZSQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKHNlbGVjdGVkVmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gY2hpbGREaWN0aW9uYXJ5LnZhbHVlcz8uZmluZChcbiAgICAgICAgICAgICAgICAgICAgKHZhbCkgPT4gdmFsLmlkID09PSBzZWxlY3RlZFZhbHVlXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkT3B0aW9uICYmIHNlbGVjdGVkT3B0aW9uLmNoaWxkRGljdGlvbmFyeVVVSUQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRDaGlsZERpY3Rpb25hcnlGaWVsZChcbiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbi5jaGlsZERpY3Rpb25hcnlVVUlELFxuICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9uc1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVDaGlsZEZpZWxkcyhmaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgZmllbGQuaG9va3MhLm9uRGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB1bnN1YnNjcmliZSQubmV4dCgpO1xuICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHBhcmVudEZpZWxkR3JvdXAgPSBwYXJlbnREaWN0aW9uYXJ5RmllbGQucGFyZW50XG4gICAgICAgICAgPyBwYXJlbnREaWN0aW9uYXJ5RmllbGQucGFyZW50LmZpZWxkR3JvdXBcbiAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGlmIChwYXJlbnRGaWVsZEdyb3VwKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50SW5kZXggPSBwYXJlbnRGaWVsZEdyb3VwLmZpbmRJbmRleChcbiAgICAgICAgICAgIChmaWVsZCkgPT4gZmllbGQua2V5ID09PSBwYXJlbnREaWN0aW9uYXJ5RmllbGQua2V5XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocGFyZW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IHRoaXMuZmluZExhc3RDaGlsZEluZGV4KFxuICAgICAgICAgICAgICBwYXJlbnRGaWVsZEdyb3VwLFxuICAgICAgICAgICAgICBwYXJlbnRJbmRleFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgcGVyY2VudGFnZVRvQWRkID0gdGhpcy5nZXRFeGlzdGluZ1BlcmNlbnRhZ2UoXG4gICAgICAgICAgICAgIHBhcmVudEZpZWxkR3JvdXAsXG4gICAgICAgICAgICAgIHBhcmVudEluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbmV3RmllbGQuY2xhc3NOYW1lID0gdGhpcy5nZXRQZXJjZW50YWdlQ2xhc3NOYW1lKHBlcmNlbnRhZ2VUb0FkZCk7XG4gICAgICAgICAgICBwYXJlbnRGaWVsZEdyb3VwLnNwbGljZShlbmRJbmRleCArIDEsIDAsIG5ld0ZpZWxkKTtcblxuICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lVG9BZGQgPVxuICAgICAgICAgICAgICB0eXBlID09PSAncmFkaW8nID8gYCBjb21wb25lbnQtcmFkaW9gIDogYCBjb21wb25lbnQtZGF0YWA7XG4gICAgICAgICAgICBuZXdGaWVsZC5jbGFzc05hbWUgKz0gY2xhc3NOYW1lVG9BZGQ7XG4gICAgICAgICAgICAvL3RoaXMuYXR0YWNoVG9WYWx1ZUNoYW5nZXMobmV3RmllbGRLZXksIG5ld0ZpZWxkKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYENoaWxkIGRpY3Rpb25hcnkgbm90IGZvdW5kIGZvciBVVUlEICR7Y2hpbGREaWN0aW9uYXJ5VXVpZH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Db21wbGV0aW9uKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdPcmlnaW4gZm9ybSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgdGhpcy5jb21wbGV0aW9uRXZlbnQuZW1pdCgpO1xuICB9XG5cbiAgZmluZExhc3RDaGlsZEluZGV4KGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSwgcGFyZW50SW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcGFyZW50S2V5UHJlZml4ID0gYCR7ZmllbGRzW3BhcmVudEluZGV4XS5rZXl9X2A7XG4gICAgbGV0IGxhc3RJbmRleCA9IHBhcmVudEluZGV4O1xuXG4gICAgZm9yIChsZXQgaSA9IHBhcmVudEluZGV4ICsgMTsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGZpZWxkc1tpXS5rZXk/LnRvU3RyaW5nKCkuc3RhcnRzV2l0aChwYXJlbnRLZXlQcmVmaXgpKSB7XG4gICAgICAgIGxhc3RJbmRleCA9IGk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGFzdEluZGV4O1xuICB9XG5cbiAgZmluZEZpZWxkQnlLZXkoXG4gICAgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdLFxuICAgIGtleTogc3RyaW5nXG4gICk6IEZvcm1seUZpZWxkQ29uZmlnIHwgbnVsbCB7XG4gICAgaWYgKCFmaWVsZHMpIHJldHVybiBudWxsO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3N0ZXBwZXInICYmIGZpZWxkLmZpZWxkR3JvdXApIHtcbiAgICAgICAgY29uc3QgZm91bmRJblN0ZXBwZXIgPSB0aGlzLmZpbmRGaWVsZEJ5S2V5KGZpZWxkLmZpZWxkR3JvdXAsIGtleSk7XG4gICAgICAgIGlmIChmb3VuZEluU3RlcHBlcikgcmV0dXJuIGZvdW5kSW5TdGVwcGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmllbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkLmZpZWxkR3JvdXApIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmZpbmRGaWVsZEJ5S2V5KGZpZWxkLmZpZWxkR3JvdXAsIGtleSk7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJlbW92ZUNoaWxkRmllbGRzKHBhcmVudEZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykge1xuICAgIGNvbnN0IHBhcmVudEZpZWxkR3JvdXAgPSBwYXJlbnRGaWVsZC5wYXJlbnRcbiAgICAgID8gcGFyZW50RmllbGQucGFyZW50LmZpZWxkR3JvdXBcbiAgICAgIDogbnVsbDtcblxuICAgIGlmIChwYXJlbnRGaWVsZEdyb3VwKSB7XG4gICAgICBjb25zdCBwYXJlbnRJbmRleCA9IHBhcmVudEZpZWxkR3JvdXAuZmluZEluZGV4KFxuICAgICAgICAoZmllbGQpID0+IGZpZWxkLmtleSA9PT0gcGFyZW50RmllbGQua2V5XG4gICAgICApO1xuXG4gICAgICBpZiAocGFyZW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudEtleVByZWZpeCA9IGAke3BhcmVudEZpZWxkLmtleX1fY2hpbGRfYDtcblxuICAgICAgICAvLyBSZW1vdmUgb25seSB0aGUgcmVsZXZhbnQgY2hpbGQgZmllbGRzXG4gICAgICAgIGZvciAobGV0IGkgPSBwYXJlbnRGaWVsZEdyb3VwLmxlbmd0aCAtIDE7IGkgPiBwYXJlbnRJbmRleDsgaS0tKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudEZpZWxkS2V5ID0gcGFyZW50RmllbGRHcm91cFtpXS5rZXk/LnRvU3RyaW5nKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZEtleSAmJiBjdXJyZW50RmllbGRLZXkuc3RhcnRzV2l0aChwYXJlbnRLZXlQcmVmaXgpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyRm9ybUNvbnRyb2xWYWx1ZShjdXJyZW50RmllbGRLZXkpO1xuICAgICAgICAgICAgcGFyZW50RmllbGRHcm91cC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5FVzogTG9hZCBBTEwgZGljdGlvbmFyaWVzIG5lZWRlZCBmb3IgdGhpcyBhcHAgdXNpbmcgdGhlIG5ldyBhcHAtYmFzZWQgZW5kcG9pbnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFsbFJlcXVpcmVkRGljdGlvbmFyaWVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hcHBNb2RlbD8uYXBwbGljYXRpb25VdWlkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vIGFwcCBVVUlEIGF2YWlsYWJsZSBmb3IgZGljdGlvbmFyeSBsb2FkaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgIHRoaXMuc2VydmljZS5sb2FkQXBwRGljdGlvbmFyaWVzKFxuICAgICAgICAgIHRoaXMuYXBwTW9kZWwuYXBwbGljYXRpb25VdWlkLFxuICAgICAgICAgIEVudmlyb25tZW50VHlwZS5Db25maWdcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgICAgaWYgKCFyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgJ+KdjCBCYWNrZW5kIGZhaWxlZCB0byBsb2FkIGRpY3Rpb25hcmllczonLFxuICAgICAgICAgIHJlc3BvbnNlLmVycm9yc1xuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNpbXBsZSBhc3NpZ25tZW50IC0gQUxMIGRpY3Rpb25hcmllcyBhbmQgZGVwZW5kZW5jaWVzIGFscmVhZHkgbG9hZGVkIGJ5IGJhY2tlbmRcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJlc3BvbnNlLmRpY3Rpb25hcmllcykuZm9yRWFjaCgoW3V1aWQsIGRpY3RdKSA9PiB7XG4gICAgICAgIHRoaXMuZGljdGlvbmFyeU1hcC5zZXQodXVpZCwgZGljdCk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcign4p2MIEZhaWxlZCB0byBsb2FkIGFwcCBkaWN0aW9uYXJpZXM6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRm9ybUNvbnRyb2xWYWx1ZShmaWVsZEtleTogc3RyaW5nKSB7XG4gICAgY29uc3Qga2V5cyA9IGZpZWxkS2V5LnNwbGl0KCcuJyk7XG4gICAgbGV0IGNvbnRyb2wgPSB0aGlzLmZvcm07XG4gICAgbGV0IG1vZGVsID0gdGhpcy5tb2RlbDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGNvbnRyb2wgPSBjb250cm9sLmdldChrZXlzW2ldKSBhcyBGb3JtR3JvdXA7XG4gICAgICBtb2RlbCA9IG1vZGVsW2tleXNbaV1dO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmFsS2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wuZ2V0KGZpbmFsS2V5KSkge1xuICAgICAgY29udHJvbC5yZW1vdmVDb250cm9sKGZpbmFsS2V5KTtcbiAgICB9XG5cbiAgICBpZiAobW9kZWwgJiYgbW9kZWxbZmluYWxLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbGV0ZSBtb2RlbFtmaW5hbEtleV07XG4gICAgfVxuICB9XG5cbiAgZmluZEZpZWxkKFxuICAgIGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSxcbiAgICBrZXk6IHN0cmluZ1xuICApOiBGb3JtbHlGaWVsZENvbmZpZyB8IG51bGwge1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkLmZpZWxkR3JvdXApIHtcbiAgICAgICAgY29uc3QgbmVzdGVkRmllbGQgPSB0aGlzLmZpbmRGaWVsZChmaWVsZC5maWVsZEdyb3VwLCBrZXkpO1xuICAgICAgICBpZiAobmVzdGVkRmllbGQpIHtcbiAgICAgICAgICByZXR1cm4gbmVzdGVkRmllbGQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHBvcHVsYXRlTW9kZWxXaXRoRmlsbERhdGEoZmlsbERhdGE6IGFueSk6IHZvaWQge1xuICAgIGlmIChmaWxsRGF0YSkge1xuICAgICAgbGV0IGF1eE1vZGVsID0gTW9kZWxQb3B1bGF0aW9uSGVscGVyLnBvcHVsYXRlTW9kZWxXaXRoRmlsbERhdGEoXG4gICAgICAgIGZpbGxEYXRhLFxuICAgICAgICB0aGlzLmZsdXgsXG4gICAgICAgIHRoaXMuZGljdGlvbmFyeU1hcCxcbiAgICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXNcbiAgICAgICk7XG4gICAgICB0aGlzLm1vZGVsID0geyAuLi5hdXhNb2RlbCB9O1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQW5kTWFwRGVmYXVsdFZhbHVlKFxuICAgIGRpY3Rpb25hcnk6IERpY3Rpb25hcnlEdG8gfCB1bmRlZmluZWQsXG4gICAgZGVmYXVsdFZhbHVlSWQ6IG51bWJlclxuICApOiBEaWN0aW9uYXJ5VmFsdWUgfCBudWxsIHtcbiAgICByZXR1cm4gTW9kZWxQb3B1bGF0aW9uSGVscGVyLmZpbmRBbmRNYXBEZWZhdWx0VmFsdWUoXG4gICAgICBkaWN0aW9uYXJ5LFxuICAgICAgZGVmYXVsdFZhbHVlSWQsXG4gICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlc1xuICAgICk7XG4gIH1cblxuICB1cGRhdGVGb3JtbHlDb25maWcoKSB7XG4gICAgdGhpcy5mb3JtbHlDb25maWcgPSBbLi4udGhpcy5mb3JtbHlDb25maWddO1xuICB9XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZUZyb21BbGxGaWVsZHMoKSB7XG4gICAgZm9yIChjb25zdCBzdWJqZWN0IG9mIHRoaXMuZmllbGRVbnN1YnNjcmliZVN1YmplY3RzKSB7XG4gICAgICBzdWJqZWN0Lm5leHQoKTtcbiAgICAgIHN1YmplY3QuY29tcGxldGUoKTtcbiAgICB9XG4gICAgdGhpcy5maWVsZFVuc3Vic2NyaWJlU3ViamVjdHMgPSBbXTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tQWxsRmllbGRzKCk7XG4gICAgaWYgKHRoaXMuY29sbGVjdG9ySGFuZGxlclN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIHRoaXMuY29sbGVjdG9ySGFuZGxlclN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWN0aW9uU3RlcFN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIHRoaXMuYWN0aW9uU3RlcFN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIpIHtcbiAgICAgIHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdEJ1dHRvbnMoYnV0dG9uc0NvbmZpZzogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKCFidXR0b25zQ29uZmlnIHx8IGJ1dHRvbnNDb25maWcubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBidXR0b25zQ29uZmlnLm1hcCgoYnV0dG9uKSA9PiAoe1xuICAgICAgdHlwZTogYnV0dG9uLnZhbHVlLnRvTG93ZXJDYXNlKCksXG4gICAgICBsYWJlbDogYnV0dG9uLnRyYW5zbGF0aW9ucz8uW3RoaXMuY3VycmVudExhbmd1YWdlSXNvXSB8fCBidXR0b24udmFsdWUsXG4gICAgICBzdHlsZUtleTogYC5idXR0b24tJHtidXR0b24udmFsdWUudG9Mb3dlckNhc2UoKX1gLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgc3R5bGVPYmplY3RUb1N0cmluZ0V4Y2VwdEJhY2tncm91bmQoc3R5bGVPYmo6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHN0eWxlT2JqKVxuICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiBrZXkgIT09ICdiYWNrZ3JvdW5kLWNvbG9yJylcbiAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fTogJHt2YWx1ZX1gKVxuICAgICAgLmpvaW4oJzsgJyk7XG4gIH1cblxuICB2YWxpZGF0ZU1ldGhvZEFwaShkYXRhOiBBcGlWYWxpZGF0ZVJlcXVlc3QpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBpZiAoZGF0YS5hcGlJZCA9PT0gdW5kZWZpbmVkIHx8IGRhdGEuYXBwSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hcHBsaWNhdGlvbkRhdGFTZXJ2aWNlLnZhbGlkYXRlQXBpKGRhdGEpLnBpcGUoXG4gICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdBUEkgdmFsaWRhdGlvbiByZXNwb25zZTonLCByZXNwb25zZSk7XG4gICAgICAgIHJldHVybiAhIXJlc3BvbnNlO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB2YWxpZGF0aW5nICcgKyBkYXRhLmRhdGEsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgbWV0aG9kIHRvIGNsZWFyIHRoZSBzYXZpbmcgYWZ0ZXIgYWN0aW9ucyBzdGF0ZVxuICAgKiBDYWxsZWQgYnkgc3RlcHBlciBjb21wb25lbnQgYWZ0ZXIgc2F2ZUFwcERhdGFTdGVwIGNvbXBsZXRlc1xuICAgKi9cbiAgcHVibGljIGNsZWFyU2F2aW5nQWZ0ZXJBY3Rpb25zU3RhdGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTYXZpbmdBZnRlckFjdGlvbnMpIHtcbiAgICAgIHRoaXMuaXNTYXZpbmdBZnRlckFjdGlvbnMgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cbiAgbG9hZGluZ01lc3NhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xufVxuIiwiPGRpdiAqbmdJZj1cImlzTG9hZGluZ1wiIGNsYXNzPVwibG9hZGluZy1vdmVybGF5XCI+XG4gIDxtYXQtc3Bpbm5lcj48L21hdC1zcGlubmVyPlxuPC9kaXY+XG48ZGl2IFtoaWRkZW5dPVwiaXNMb2FkaW5nXCI+XG4gIDxkaXYgKm5nSWY9XCJzaG93TGFuZ3VhZ2VTZWxlY3RvclwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJyaWdodC1hbGlnbmVkXCI+XG4gICAgPGJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZmxhZ3NcIiBtYXQtaWNvbi1idXR0b24gY2xhc3M9XCJtLXItNVwiPlxuICAgICAgPGltZ1xuICAgICAgICBbc3JjXT1cInJldHVybkZMYWcoY3VycmVudExhbmd1YWdlSXNvKVwiXG4gICAgICAgIGNsYXNzPVwicm91bmRlZC1jaXJjbGUgb2JqZWN0LWNvdmVyIGljb24tMjBcIlxuICAgICAgLz5cbiAgICA8L2J1dHRvbj5cbiAgICA8bWF0LW1lbnUgI2ZsYWdzPVwibWF0TWVudVwiIGNsYXNzPVwiY2FyZFdpdGhTaGFkb3dcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAqbmdGb3I9XCJsZXQgbGFuZyBvZiBhcHBsaWNhdGlvbkxhbmd1YWdlcygpXCJcbiAgICAgICAgKGNsaWNrKT1cImNoYW5nZUxhbmd1YWdlKGxhbmcuaXNvKVwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPGltZ1xuICAgICAgICAgICAgW3NyY109XCJyZXR1cm5GTGFnKGxhbmcuaXNvKVwiXG4gICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtY2lyY2xlIG9iamVjdC1jb3ZlciBpY29uLTIwXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LXN1YnRpdGxlLTEgZi1zLTE0XCI+e3sgbGFuZy5uYW1lIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbWF0LW1lbnU+XG4gIDwvZGl2PlxuXG4gIDxiciAvPlxuICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250YWluZXJcIj5cbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAobmdTdWJtaXQpPVwic3VibWl0KClcIj5cbiAgICAgIDxmb3JtbHktZm9ybVxuICAgICAgICBbbW9kZWxdPVwibW9kZWxcIlxuICAgICAgICBbZmllbGRzXT1cImZvcm1seUNvbmZpZ1wiXG4gICAgICAgIFtvcHRpb25zXT1cIm9wdGlvbnNcIlxuICAgICAgICBbZm9ybV09XCJmb3JtXCJcbiAgICAgID48L2Zvcm1seS1mb3JtPlxuICAgIDwvZm9ybT5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
2592
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JpZ2luLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9vcmlnaW4tZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9vcmlnaW4tZm9ybS9zcmMvbGliL29yaWdpbi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBSU4sWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxXQUFXLEVBR1osTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsT0FBTyxFQUNQLGNBQWMsRUFDZCxTQUFTLEVBQ1QsUUFBUSxFQUdSLFVBQVUsRUFDVixFQUFFLEVBQ0YsU0FBUyxFQUVULEdBQUcsRUFDSCxZQUFZLEVBQ1osSUFBSSxFQUNMLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBTy9DLE9BQU8sRUFLTCxRQUFRLEVBQ1IsYUFBYSxFQUNiLGVBQWUsRUFDZixzQkFBc0IsRUFHdkIsTUFBTSxzQkFBc0IsQ0FBQztBQUs5QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUFZLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBVWpELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBUWxFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBS0wsdUJBQXVCLEVBR3hCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLFVB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QUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDOytHQXgwR1Usc0JBQXNCO21HQUF0QixzQkFBc0IsbXBCQUNuQixXQUFXLHFFQzlGM0IsZ3VDQXdDQTs7NEZEcURhLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxpQkFBaUI7dWZBS0EsWUFBWTtzQkFBdEMsWUFBWTt1QkFBQyxXQUFXO2dCQUdoQixlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQWNJLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkcmVuXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgRm9ybWx5RmllbGQsXG4gIEZvcm1seUZpZWxkQ29uZmlnLFxuICBGb3JtbHlGb3JtT3B0aW9uc1xufSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7XG4gIFN1YmplY3QsXG4gIGZpcnN0VmFsdWVGcm9tLFxuICBzdGFydFdpdGgsXG4gIHBhaXJ3aXNlLFxuICBkZWJvdW5jZVRpbWUsXG4gIHN3aXRjaE1hcCxcbiAgY2F0Y2hFcnJvcixcbiAgb2YsXG4gIHRha2VVbnRpbCxcbiAgT2JzZXJ2YWJsZSxcbiAgbWFwLFxuICBTdWJzY3JpcHRpb24sXG4gIGZyb21cbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMYWJlbEtleXMgfSBmcm9tICcuL2VudW1zL2xhYmVsLmtleXMnO1xuaW1wb3J0IHsgQXBpVmFsaWRhdGVSZXF1ZXN0IH0gZnJvbSAnLi9tb2RlbHMvYXBwbGljYXRpb24ubW9kZWwnO1xuaW1wb3J0IHtcbiAgRGljdGlvbmFyeUR0byxcbiAgRGljdGlvbmFyeVZhbHVlLFxuICBEaWN0aW9uYXJ5VmFsdWVEdG9cbn0gZnJvbSAnLi9tb2RlbHMvZGljdGlvbmFyeS5tb2RlbCc7XG5pbXBvcnQge1xuICBGb3JtTW9kZWwsXG4gIERpc3BsYXlNb2RlbCxcbiAgR2VuZXJhbERhdGFNb2RlbCxcbiAgU3RlcHNTZXR0aW5ncyxcbiAgRmx1eFR5cGUsXG4gIERpbWVuc2lvblR5cGUsXG4gIFN0ZXBDb250cm9sVHlwZSxcbiAgTWFudWFsSW5wdXRDb250cm9sVHlwZSxcbiAgUHJlc2VudGF0aW9uUGFyYWdyYXBoQ29udHJvbCxcbiAgRGljdGlvbmFyeUNvbnRyb2xEYXRhXG59IGZyb20gJy4vbW9kZWxzL2Zvcm1zLm1vZGVsJztcbmltcG9ydCB7IExhYmVsSW5mbywgVHJhbnNsYXRpb25JbmZvIH0gZnJvbSAnLi9tb2RlbHMvbGFiZWwtaW5mby5tb2RlbCc7XG5pbXBvcnQgeyBMYWJlbCB9IGZyb20gJy4vbW9kZWxzL2xhYmVsLm1vZGVsJztcbmltcG9ydCB7IExhbmd1YWdlIH0gZnJvbSAnLi9tb2RlbHMvbGFuZ3VhZ2UubW9kZWwnO1xuaW1wb3J0IHsgRGljdGlvbmFyeUxhYmVsSW5mbyB9IGZyb20gJy4vb3RoZXJzL2RpY3Rpb25hcnktbGFiZWwtaW5mbyc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudFR5cGUgfSBmcm9tICcuL290aGVycy9lbnZpcm9ubWVudC10eXBlJztcbmltcG9ydCB7IENzc1J1bGVzLCBVdGlscyB9IGZyb20gJy4vb3RoZXJzL3V0aWxzJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uRGF0YVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2FwcGxpY2F0aW9uRGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IExhYmVsU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvbGFiZWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJveHlTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9wcm94eS5zZXJ2aWNlJztcbmltcG9ydCB7IERpY3Rpb25hcnlTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9kaWN0aW9uYXJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9sYW5ndWFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9yaWdpbkZvcm1BdXRoU2VydmljZSB9IGZyb20gJy4vb3JpZ2luLWZvcm0tYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEZvcm1zU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZm9ybXMuc2VydmljZSc7XG5pbXBvcnQgeyBJbnB1dENvbmZpZyB9IGZyb20gJy4vb3JpZ2luLWZvcm0tY29uZmlnLm1vZGVsJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL290aGVycy9jb25maWctc2VydmljZSc7XG5pbXBvcnQgeyBNb2RlbFBvcHVsYXRpb25IZWxwZXIgfSBmcm9tICcuL21vZGVsLXBvcHVsYXRpb24uaGVscGVyJztcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdHJhbnNsYXRpb24uc2VydmljZSc7XG5pbXBvcnQge1xuICBPcGVyYXRpb25SZXN1bHQsXG4gIE9yaWdpbkZvcm1TaWduYWxySGFuZGxlclNlcnZpY2Vcbn0gZnJvbSAnLi9zZXJ2aWNlcy9vcmlnaW4tZm9ybS1zaWduYWxyLWhhbmRsZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBY3Rpb25TdGVwSGFuZGxlciB9IGZyb20gJy4vYWN0aW9uLXN0ZXAtaGFuZGxlcic7XG5pbXBvcnQgeyBTY3JvbGxUb0Vycm9yU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvc2Nyb2xsLXRvLWVycm9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybUNzc0hlbHBlciB9IGZyb20gJy4vZm9ybS1jc3MuaGVscGVyJztcbmltcG9ydCB7XG4gIEJhc2VDb250cm9sLFxuICBDb250cm9sRGF0YSxcbiAgRGVwZW5kZW50RGljdGlvbmFyeURhdGEsXG4gIFByZXNlbnRhdGlvbkNvbnRyb2wsXG4gIFByZXNlbnRhdGlvbkNvbnRyb2xUeXBlLFxuICBTZWN0aW9uRGF0YSxcbiAgU3RlcERhdGFcbn0gZnJvbSAnLi9tb2RlbHMvZmx1eC5tb2RlbCc7XG5pbXBvcnQgeyBGTEFHX0lDT05TIH0gZnJvbSAnLi9mbGFnLWljb25zJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLW9yaWdpbi1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL29yaWdpbi1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vb3JpZ2luLWZvcm0uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDb2xsZWN0b3JGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkcmVuKEZvcm1seUZpZWxkKSBmb3JtbHlGaWVsZHM6IFF1ZXJ5TGlzdDxGb3JtbHlGaWVsZD47XG5cbiAgLy90aGVzZSBhcmUgc3BlY2lmaWMgdG8gdGhlIGxpYlxuICBASW5wdXQoKSBjb25maWdDb21wb25lbnQ6IElucHV0Q29uZmlnIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBjb25maWdVdWlkITogc3RyaW5nO1xuICBASW5wdXQoKSBjdXJyZW50U3RlcElkOiBzdHJpbmc7XG4gIC8vZW5kIHNwZWNpZmljIHRvIGxpYlxuXG4gIEBJbnB1dCgpIGFwcE1vZGVsOiBGb3JtTW9kZWw7XG4gIEBJbnB1dCgpIHNpZ25CYXNlVXJsOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGN1cnJlbnRMYW5ndWFnZUlzbzogc3RyaW5nO1xuICBASW5wdXQoKSBmaWxsRGF0YTogYW55O1xuICBASW5wdXQoKSBpbml0Rmxvd1ZhbHVlczogc3RyaW5nO1xuICBASW5wdXQoKSBlbnY6IHN0cmluZztcbiAgQElucHV0KCkgc2hvd0Rpc3BsYXlNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dMYW5ndWFnZVNlbGVjdG9yOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgaXNEZW1vTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0RlYnVnOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFwcERhdGFVdWlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJsb2NrUHJldmlvdXNTdGVwOiBib29sZWFuO1xuICBASW5wdXQoKSBkYXRhVXJsSWQ6IHN0cmluZztcbiAgQElucHV0KCkgbm9CdXR0b25zSW5WaWV3OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgZmx1eDogU3RlcERhdGFbXTtcbiAgcHJpdmF0ZSBkaXNwbGF5OiBEaXNwbGF5TW9kZWw7XG4gIHByaXZhdGUgZGVzaWduOiBDc3NSdWxlcztcbiAgcHJpdmF0ZSBnZW5lcmFsRGF0YTogR2VuZXJhbERhdGFNb2RlbDtcbiAgcHJpdmF0ZSBsYWJlbHM6IExhYmVsW107XG4gIHByaXZhdGUgc3RlcERpY3Rpb25hcnlEZXBlbmRlbnRJZHM6IHN0cmluZ1tdO1xuICBwcml2YXRlIGF2YWlsYWJsZUxhbmd1YWdlczogTGFuZ3VhZ2VbXTtcbiAgcHJpdmF0ZSBzdGVwc1NldHRpbmdzOiBTdGVwc1NldHRpbmdzO1xuICBmb3JtbHlDb25maWdVcGRhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICB2aXNpYmxlRmllbGRzVXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBmb3JtbHlVcGRhdGVBbmRHb05leHQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgZm9ybWx5R29OZXh0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIEBPdXRwdXQoKSBjb21wbGV0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgZm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICBmb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXTtcbiAgZm9ybWx5QWxsU3RlcHM6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXTtcbiAgYWN0aXZlU3RlcCA9IDA7XG4gIG1vZGVsOiBhbnk7XG4gIG9wdGlvbnM6IEZvcm1seUZvcm1PcHRpb25zID0ge307XG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XG5cbiAgZGljdGlvbmFyeU1hcDogTWFwPHN0cmluZywgRGljdGlvbmFyeUR0bz4gPSBuZXcgTWFwKCk7XG4gIGRpY3Rpb25hcnlJZFRvVXVpZE1hcDogTWFwPG51bWJlciwgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgZ2VuZXJhbERhdGFLZXlzID0gTGFiZWxLZXlzLmFwcENvbmZpZ0VkaXQuZ2VuZXJhbERhdGE7XG4gIHByaXZhdGUgZmllbGRVbnN1YnNjcmliZVN1YmplY3RzOiBTdWJqZWN0PHZvaWQ+W10gPSBbXTtcbiAgcHJpdmF0ZSBjb2xsZWN0b3JIYW5kbGVyU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIC8vIEFjdGlvbiBzdGVwIGV4ZWN1dGlvbiBzdGF0ZVxuICBwcml2YXRlIGlzRXhlY3V0aW5nQWN0aW9ucyA9IGZhbHNlO1xuICBwcml2YXRlIGFjdGlvblN0ZXBTdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHB1YmxpYyBpc1NhdmluZ0FmdGVyQWN0aW9ucyA9IGZhbHNlOyAvLyBNYWtlIHRoaXMgcHVibGljIHNvIHN0ZXBwZXIgY2FuIGFjY2VzcyBpdFxuXG4gIC8vIGlkZW50aWZpY2F0aW9uIGt5YyBjb21wb25lbnRcbiAgcHVibGljIGt5Y0FwaVVybDogc3RyaW5nO1xuICBwdWJsaWMga3ljT3JkZXJJZDogc3RyaW5nO1xuICBwdWJsaWMga3ljVG9rZW46IHN0cmluZztcbiAgcHVibGljIGt5Y0Vudjogc3RyaW5nO1xuICBwdWJsaWMga3ljUmVkaXJlY3RJZDogc3RyaW5nO1xuICBwdWJsaWMga3ljUGhvbmVOdW1iZXI6IHN0cmluZyA9ICcnO1xuICBwdWJsaWMga3ljTGFuZ0lzbzogc3RyaW5nID0gJyc7XG4gIHB1YmxpYyBreWNTaG93Q2l0aXplbnNoaXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGt5Y1Njcm9sbE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gZW5kIGlkZW50aWZpY2F0aW9uIGt5YyBjb21wb25lbnRcbiAgcHVibGljIGxhbmd1YWdlRmxhZ3M6IGFueVtdID0gW1xuICAgIHtcbiAgICAgIGxhbmd1YWdlOiAnRW5nbGlzaCcsXG4gICAgICBjb2RlOiAnZW4nLFxuICAgICAgdHlwZTogJ1VTJyxcbiAgICAgIGljb246IEZMQUdfSUNPTlMuZW5cbiAgICB9LFxuICAgIHtcbiAgICAgIGxhbmd1YWdlOiAnUm9tYW5hJyxcbiAgICAgIGNvZGU6ICdybycsXG4gICAgICBpY29uOiBGTEFHX0lDT05TLnJvXG4gICAgfSxcbiAgICB7XG4gICAgICBsYW5ndWFnZTogJ0RldXRzY2gnLFxuICAgICAgY29kZTogJ2RlJyxcbiAgICAgIGljb246IEZMQUdfSUNPTlMuZGVcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhbmd1YWdlOiAnRnJhbsOnYWlzJyxcbiAgICAgIGNvZGU6ICdmcicsXG4gICAgICBpY29uOiBGTEFHX0lDT05TLmZyXG4gICAgfSxcbiAgICB7XG4gICAgICBsYW5ndWFnZTogJ0l0YWxpYW5vJyxcbiAgICAgIGNvZGU6ICdpdCcsXG4gICAgICBpY29uOiBGTEFHX0lDT05TLml0XG4gICAgfSxcbiAgICB7XG4gICAgICBsYW5ndWFnZTogJ0VzcGHDsW9sJyxcbiAgICAgIGNvZGU6ICdlcycsXG4gICAgICBpY29uOiBGTEFHX0lDT05TLmVzXG4gICAgfVxuICBdO1xuICBmb3JtbHlDb2xsZWN0aW5nRmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdO1xuICBmb3JtbHlQcmVzZW50YXRpb25GaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW107XG4gIGNvbnRyb2xJZHNXaXRoVmFsdWVzOiBhbnk7XG4gIF9zZWxmID0gdGhpcztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNlcnZpY2U6IERpY3Rpb25hcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcm94eTogUHJveHlTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFiZWxTZXJ2aWNlOiBMYWJlbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcHBsaWNhdGlvbkRhdGFTZXJ2aWNlOiBBcHBsaWNhdGlvbkRhdGFTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ1NlcnZpY2U6IExhbmd1YWdlU2VydmljZSxcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBPcmlnaW5Gb3JtQXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3Jtc1NlcnZpY2U6IEZvcm1zU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2U6IFRyYW5zbGF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIG9yaWdpbkZvcm1TaWduYWxySGFuZGxlclNlcnZpY2U6IE9yaWdpbkZvcm1TaWduYWxySGFuZGxlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3Rpb25TdGVwSGFuZGxlcjogQWN0aW9uU3RlcEhhbmRsZXIsXG4gICAgcHJpdmF0ZSBzY3JvbGxUb0Vycm9yU2VydmljZTogU2Nyb2xsVG9FcnJvclNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5reWNBcGlVcmwgPSBwcm94eS5hcGlVUkw7XG4gICAgdGhpcy5reWNPcmRlcklkID0gcHJveHkub3JkZXJJRCE7XG4gICAgdGhpcy5reWNUb2tlbiA9IHByb3h5LnRva2VuO1xuICAgIHRoaXMua3ljRW52ID0gcHJveHkuZW52O1xuXG4gICAgdGhpcy5reWNMYW5nSXNvID0gcHJveHkubGFuZ0lzbztcbiAgICBjb25zdCBpc0xvYWRpbmdTdWIgPVxuICAgICAgdGhpcy5vcmlnaW5Gb3JtU2lnbmFsckhhbmRsZXJTZXJ2aWNlLmlzTG9hZGluZyQuc3Vic2NyaWJlKChsb2FkaW5nKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzTG9hZGluZyAhPT0gbG9hZGluZykge1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gbG9hZGluZztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgdGhpcy5jb2xsZWN0b3JIYW5kbGVyU3Vic2NyaXB0aW9ucy5hZGQoaXNMb2FkaW5nU3ViKTtcblxuICAgIGNvbnN0IG9wZXJhdGlvbkNvbXBsZXRlZFN1YiA9XG4gICAgICB0aGlzLm9yaWdpbkZvcm1TaWduYWxySGFuZGxlclNlcnZpY2Uub3BlcmF0aW9uQ29tcGxldGVkJC5zdWJzY3JpYmUoXG4gICAgICAgIGFzeW5jIChyZXN1bHQ6IE9wZXJhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQub3BlcmF0aW9uSWRlbnRpZmllciA9PT0gJ0tZQ19QUk9DRVNTSU5HJykge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICdLWUMgUHJvY2Vzc2luZyBzdWNjZXNzZnVsbHkgY29tcGxldGVkICh2aWEgSGFuZGxlciBTZXJ2aWNlKTonLFxuICAgICAgICAgICAgICAgIHJlc3VsdC5kYXRhXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChyZXN1bHQuZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsbERhdGEgPSBKU09OLnBhcnNlKHJlc3VsdC5kYXRhLmZpbGxEYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcHVsYXRlTW9kZWxXaXRoRmlsbERhdGEodGhpcy5maWxsRGF0YSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aGlzLmZvcm1seVVwZGF0ZUFuZEdvTmV4dC5lbWl0KHt9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ0tZQyBQcm9jZXNzaW5nIGZhaWxlZCAodmlhIEhhbmRsZXIgU2VydmljZSk6JyxcbiAgICAgICAgICAgICAgICByZXN1bHQuZXJyb3JcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgdGhpcy5jb2xsZWN0b3JIYW5kbGVyU3Vic2NyaXB0aW9ucy5hZGQob3BlcmF0aW9uQ29tcGxldGVkU3ViKTtcblxuICAgIC8vIFN1YnNjcmliZSB0byBhY3Rpb24gc3RlcCBleGVjdXRpb24gZXZlbnRzXG4gICAgY29uc3QgYWN0aW9uRXhlY3V0aW5nU3ViID1cbiAgICAgIHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuYWN0aW9uRXhlY3V0aW5nJC5zdWJzY3JpYmUoKGV4ZWN1dGluZykgPT4ge1xuICAgICAgICB0aGlzLmlzRXhlY3V0aW5nQWN0aW9ucyA9IGV4ZWN1dGluZztcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBleGVjdXRpbmc7XG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgdGhpcy5hY3Rpb25TdGVwU3Vic2NyaXB0aW9ucy5hZGQoYWN0aW9uRXhlY3V0aW5nU3ViKTtcblxuICAgIGNvbnN0IGFjdGlvbkNvbXBsZXRlZFN1YiA9XG4gICAgICB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmFjdGlvbkNvbXBsZXRlZCQuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ/CfjqwgQWN0aW9uIHN0ZXAgY29tcGxldGVkOicsIHJlc3VsdCk7XG4gICAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgQWN0aW9uIHN0ZXAgZmFpbGVkOicsIHJlc3VsdC5lcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgYXV0by1wcm9ncmVzcyBoZXJlIGFzIGl0J3MgaGFuZGxlZCBpbiBleGVjdXRlQWN0aW9uU3RlcHNCZWZvcmVNb3ZpbmdcbiAgICAgIH0pO1xuICAgIHRoaXMuYWN0aW9uU3RlcFN1YnNjcmlwdGlvbnMuYWRkKGFjdGlvbkNvbXBsZXRlZFN1Yik7XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5kYXRhVXJsSWQpIHtcbiAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5hcHBsaWNhdGlvbkRhdGFTZXJ2aWNlLmdldERhdGFVcmwodGhpcy5kYXRhVXJsSWQpXG4gICAgICApO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmNvbmZpZ1V1aWQgPSByZXN1bHQuYXBwSWQ7XG4gICAgICAgIHRoaXMuYXBwRGF0YVV1aWQgPSByZXN1bHQuYXBwRGF0YUlkO1xuICAgICAgICB0aGlzLmVudiA9IHJlc3VsdC5lbnY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYXBwRGF0YVV1aWQgJiYgdGhpcy5jdXJyZW50U3RlcElkKSB7XG4gICAgICB0aGlzLmFwcGxpY2F0aW9uRGF0YVNlcnZpY2Uuc2V0Q3VycmVudFN0ZXAoXG4gICAgICAgIHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIHRoaXMuY3VycmVudFN0ZXBJZFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYXBwRGF0YVV1aWQpIHtcbiAgICAgIHRoaXMuYXBwRGF0YVV1aWQgPSBVdGlscy5nZW5lcmF0ZVVVSUQoKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbmZpZ0NvbXBvbmVudCAmJlxuICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuVG9rZW4gJiZcbiAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlJlZnJlc2hUb2tlblxuICAgICkge1xuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLnVwZGF0ZUNvbmZpZ0Zyb21JbnB1dCh0aGlzLmNvbmZpZ0NvbXBvbmVudCk7XG4gICAgICBhd2FpdCB0aGlzLmF1dGhTZXJ2aWNlLnNldFRva2VucyhcbiAgICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuVG9rZW4sXG4gICAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlJlZnJlc2hUb2tlblxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyB8fCB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMubGFuZ1NlcnZpY2UuZ2V0TGFuZ3VhZ2VzKCkpLnRoZW4oKGxpc3QpID0+IHtcbiAgICAgICAgaWYgKGxpc3QgJiYgbGlzdC5pdGVtcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzID0gbGlzdC5pdGVtcztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMubG9hZEFwcERhdGEoKTtcbiAgICBpZiAoIXRoaXMuY3VycmVudExhbmd1YWdlSXNvICYmIHRoaXMuYXBwTW9kZWwpIHtcbiAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvID0gdGhpcy5hcHBNb2RlbC5nZW5lcmFsRGF0YS5kZWZhdWx0TGFuZ3VhZ2U7XG4gICAgfVxuICAgIGlmICh0aGlzLmFwcE1vZGVsKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRBc3luYygpO1xuICAgICAgLy8gRXhlY3V0ZSBhbnkgYWN0aW9uL3N0YXR1cyBzdGVwcyB0aGF0IGFwcGVhciBiZWZvcmUgdGhlIGZpcnN0IHZpc2libGUgc3RlcFxuICAgICAgYXdhaXQgdGhpcy5leGVjdXRlTGVhZGluZ0FjdGlvblN0ZXBzKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChjaGFuZ2VzWydjb25maWdDb21wb25lbnQnXSAmJiAhY2hhbmdlc1snY29uZmlnQ29tcG9uZW50J10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5jb25maWdDb21wb25lbnQgJiZcbiAgICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuVG9rZW4gJiZcbiAgICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuUmVmcmVzaFRva2VuXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLnVwZGF0ZUNvbmZpZ0Zyb21JbnB1dCh0aGlzLmNvbmZpZ0NvbXBvbmVudCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYXV0aFNlcnZpY2Uuc2V0VG9rZW5zKFxuICAgICAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlRva2VuLFxuICAgICAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlJlZnJlc2hUb2tlblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzWydjdXJyZW50TGFuZ3VhZ2VJc28nXSAmJlxuICAgICAgIWNoYW5nZXNbJ2N1cnJlbnRMYW5ndWFnZUlzbyddLmZpcnN0Q2hhbmdlXG4gICAgKSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMpIHtcbiAgICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmxhbmdTZXJ2aWNlLmdldExhbmd1YWdlcygpKS50aGVuKChsaXN0KSA9PiB7XG4gICAgICAgICAgICBpZiAobGlzdCAmJiBsaXN0Lml0ZW1zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzID0gbGlzdC5pdGVtcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hcHBEYXRhVXVpZCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBhcHBEYXRhID0gYXdhaXQgdGhpcy5hcHBsaWNhdGlvbkRhdGFTZXJ2aWNlLmdldFN0ZXBzKFxuICAgICAgICAgICAgICB0aGlzLmFwcERhdGFVdWlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGFwcERhdGEgJiYgYXBwRGF0YS5maWxsRGF0YSkge1xuICAgICAgICAgICAgICB0aGlzLmZpbGxEYXRhID0gSlNPTi5wYXJzZShhcHBEYXRhLmZpbGxEYXRhKTtcbiAgICAgICAgICAgICAgdGhpcy5ibG9ja1ByZXZpb3VzU3RlcCA9IGFwcERhdGEuYmxvY2tQcmV2aW91c1N0ZXA7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmZpbGxEYXRhLm1ldGFkYXRhLmxhbmd1YWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28gPSB0aGlzLmZpbGxEYXRhLm1ldGFkYXRhLmxhbmd1YWdlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJldHJpZXZpbmcgYXBwIGRhdGEnLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdEFzeW5jKCk7XG4gICAgICAgIC8vIEV4ZWN1dGUgYW55IGFjdGlvbi9zdGF0dXMgc3RlcHMgdGhhdCBhcHBlYXIgYmVmb3JlIHRoZSBmaXJzdCB2aXNpYmxlIHN0ZXBcbiAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlTGVhZGluZ0FjdGlvblN0ZXBzKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2FkQXBwRGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiB7IGNvbmZpZ3VyYXRpb246IGFueTsgZmlsbERhdGE/OiBhbnkgfSA9XG4gICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICAgIHRoaXMuZm9ybXNTZXJ2aWNlLmxvYWRGb3JtQnlVdWlkKHRoaXMuY29uZmlnVXVpZCwgdGhpcy5lbnYpXG4gICAgICAgICk7XG4gICAgICB0aGlzLmFwcE1vZGVsID0gSlNPTi5wYXJzZShyZXNwb25zZS5jb25maWd1cmF0aW9uKTtcbiAgICAgIHRoaXMuZmlsbERhdGEgPSByZXNwb25zZS5maWxsRGF0YSA/IEpTT04ucGFyc2UocmVzcG9uc2UuZmlsbERhdGEpIDogbnVsbDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBmb3JtIGRhdGEnLCBlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tQWxsRmllbGRzKCk7XG4gICAgYXdhaXQgdGhpcy5idWlsZEZvcm1seUFzeW5jKCk7XG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUmVmZXJlbmNlRmllbGRzKHRoaXMuZm9ybWx5Q29uZmlnKTtcbiAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgIHRoaXMuZm9ybWx5Q29uZmlnVXBkYXRlZC5lbWl0KCk7XG4gICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwdWJsaWMgYXBwbGljYXRpb25MYW5ndWFnZXMoKTogTGFuZ3VhZ2VbXSB7XG4gICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzPy5maWx0ZXIoKGEpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmFwcE1vZGVsPy5nZW5lcmFsRGF0YT8ubGFuZ3VhZ2VzPy5pbmRleE9mKGEuaXNvKSA+PSAwO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJldHVybkZMYWcobGFuZ3VhZ2U6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmxhbmd1YWdlRmxhZ3MuZmluZCgobCkgPT4gbC5jb2RlID09IGxhbmd1YWdlKT8uaWNvbjtcbiAgfVxuXG4gIGNoYW5nZUxhbmd1YWdlKCRldmVudDogc3RyaW5nKSB7XG4gICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28gPSAkZXZlbnQ7XG4gICAgdGhpcy5hcHBsaWNhdGlvbkRhdGFTZXJ2aWNlXG4gICAgICAuY2hhbmdlTGFuZ3VhZ2UodGhpcy5hcHBEYXRhVXVpZCwgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28pXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5pbml0QXN5bmMoKTtcbiAgfVxuICBnZXRMYW5ndWFnZU5hbWUobGFuZ3VhZ2VJc286IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcy5maW5kKFxuICAgICAgKGxhbmcpID0+IGxhbmcuaXNvID09PSBsYW5ndWFnZUlzb1xuICAgICk7XG4gICAgcmV0dXJuIGxhbmd1YWdlID8gbGFuZ3VhZ2UubmFtZSA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEZvcm1seUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbykge1xuICAgICAgYXdhaXQgdGhpcy5nZXRMYWJlbHMoKTtcbiAgICB9XG5cbiAgICAvLyBTVEVQIDE6IEluaXRpYWxpemUgZmx1eCBhbmQgb3RoZXIgcHJvcGVydGllcyBmaXJzdFxuICAgIHRoaXMuZmx1eCA9IHRoaXMuYXBwTW9kZWwuZmx1eDtcbiAgICB0aGlzLmRpc3BsYXkgPSB0aGlzLmFwcE1vZGVsLmRpc3BsYXk7XG4gICAgdGhpcy5kZXNpZ24gPSB0aGlzLmFwcE1vZGVsLmdlbmVyYXRlZENzcztcbiAgICB0aGlzLmdlbmVyYWxEYXRhID0gdGhpcy5hcHBNb2RlbC5nZW5lcmFsRGF0YTtcbiAgICB0aGlzLmFkZFJlbmRlcmVkQ3NzKCk7XG5cbiAgICAvLyBTVEVQIDI6IExvYWQgQUxMIGRpY3Rpb25hcmllcyB1cGZyb250IChub3cgdGhhdCBmbHV4IGlzIGluaXRpYWxpemVkKVxuICAgIGF3YWl0IHRoaXMubG9hZEFsbFJlcXVpcmVkRGljdGlvbmFyaWVzKCk7XG5cbiAgICAvLyBTVEVQIDM6IENvbnRpbnVlIHdpdGggZXhpc3RpbmcgZm9ybSBidWlsZGluZyBsb2dpY1xuICAgIHRoaXMuZm9ybWx5Q29uZmlnID0gW107XG4gICAgdGhpcy5mb3JtbHlDb2xsZWN0aW5nRmllbGRzID0gW107XG4gICAgdGhpcy5mb3JtbHlQcmVzZW50YXRpb25GaWVsZHMgPSBbXTtcbiAgICB0aGlzLm1vZGVsID0ge307XG4gICAgdGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XG5cbiAgICAvLyBQb3B1bGF0ZSBjb250cm9sIElEcyB3aXRoIHZhbHVlcyBpZiBmaWxsRGF0YSBvciBpbml0Rmxvd1ZhbHVlcyBleGlzdFxuICAgIGlmICh0aGlzLmZpbGxEYXRhIHx8IHRoaXMuaW5pdEZsb3dWYWx1ZXMpIHtcbiAgICAgIHRoaXMucG9wdWxhdGVDb250cm9sSWRzV2l0aFZhbHVlRGljdGlvbmFyeSgpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgbW9kZWwgd2l0aCBkZWZhdWx0IHZhbHVlcyBpZiBubyBmaWxsRGF0YVxuICAgIGlmICghdGhpcy5maWxsRGF0YSkge1xuICAgICAgdGhpcy5tb2RlbCA9IE1vZGVsUG9wdWxhdGlvbkhlbHBlci5hcHBseURlZmF1bHRzVG9Nb2RlbChcbiAgICAgICAgdGhpcy5mbHV4LFxuICAgICAgICB0aGlzLmRpY3Rpb25hcnlNYXAsXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBvcHVsYXRlTW9kZWxXaXRoRmlsbERhdGEodGhpcy5maWxsRGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUodGhpcy5tb2RlbCk7XG4gICAgYXdhaXQgdGhpcy5idWlsZEZvcm1seUNvbmZpZ0FzeW5jKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIHJlZmVyZW5jZXMgZm9yIGRlZmF1bHQgdmFsdWVzXG4gICAgaWYgKCF0aGlzLmZpbGxEYXRhKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVSZWZlcmVuY2VGaWVsZHModGhpcy5mb3JtbHlDb25maWcpO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKHN0YXJ0V2l0aChudWxsKSwgcGFpcndpc2UoKSlcbiAgICAgIC5zdWJzY3JpYmUoKFtwcmV2LCBuZXh0XTogW2FueSwgYW55XSkgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVGb3JtVmFsdWVDaGFuZ2UoW3ByZXYsIG5leHRdKVxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRm9ybVZhbHVlQ2hhbmdlKFtwcmV2LCBuZXh0XTogW2FueSwgYW55XSkge1xuICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZUlkID0gVXRpbHMuZmluZExhbmd1YWdlSWRCeUlzbyhcbiAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICApO1xuICAgIGZvciAoY29uc3Qga2V5IGluIG5leHQpIHtcbiAgICAgIGlmIChuZXh0W2tleV0/LnZhbHVlVHJhbnNsYXRpb25zKSB7XG4gICAgICAgIHZhciBzID0gSlNPTi5zdHJpbmdpZnkobmV4dFtrZXldKTtcbiAgICAgICAgdmFyIHJlcGxhY2VkID0gcy5yZXBsYWNlKC9cInZhbHVlVHJhbnNsYXRpb25zXCI6L2csICdcInRyYW5zbGF0aW9uc1wiOicpO1xuICAgICAgICBuZXh0W2tleV0gPSBKU09OLnBhcnNlKHJlcGxhY2VkKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5mb3JtbHlQcmVzZW50YXRpb25GaWVsZHMuZmlsdGVyKFxuICAgICAgICAoaSkgPT4gaS5wcm9wcyAmJiBpLnByb3BzWydjb2xsZWN0aW9uQ29udHJvbElkZW50aWZpZXInXSA9PT0ga2V5XG4gICAgICApO1xuICAgICAgaWYgKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICBsZXQgdmFsdWUgPSAnJztcbiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBuZXh0W2tleV0pIHtcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgICB2YWx1ZSA9IG5leHRba2V5XSA/ICcmY2hlY2s7JyA6ICcmY3Jvc3M7JztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGlmIChuZXh0W2tleV0/LnRyYW5zbGF0aW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gbmV4dFtrZXldLnRyYW5zbGF0aW9ucy5maW5kKFxuICAgICAgICAgICAgICAgICAgKHRyYW5zbGF0aW9uOiB7IGxhbmd1YWdlSWQ6IGFueSB9KSA9PlxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbi5sYW5ndWFnZUlkID09PSBjdXJyZW50TGFuZ3VhZ2VJZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0cmFuc2xhdGlvbiA/IHRyYW5zbGF0aW9uLnZhbHVlIDogbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG5leHRba2V5XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZmllbGQuZGVmYXVsdFZhbHVlID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3RlcERpY3Rpb25hcnlEZXBlbmRlbnRJZHMuZmluZCgoYSkgPT4gYSA9PSBrZXkpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuZXh0W2tleV0/LmlkICYmXG4gICAgICAgICAgKHByZXYgPT0gbnVsbCB8fCBwcmV2W2tleV0/LmlkICE9PSBuZXh0W2tleV0/LmlkKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmZvcm1seUNvbmZpZ1swXS5maWVsZEdyb3VwID0gdGhpcy5nZXRGb3JtbHlGaWx0ZXJlZFN0ZXBzKCk7XG4gICAgICAgICAgdmFyIGZpbHRlcmVkU3RlcHNJZGVudGlmaWVycyA9IHRoaXMuZm9ybWx5Q29uZmlnWzBdLmZpZWxkR3JvdXAubWFwKFxuICAgICAgICAgICAgKGYpID0+IGYucHJvcHM/Llsnc3RlcElkJ11cbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHZpc2libGVTdGVwcyA9IHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZmlsdGVyVmlzaWJsZVN0ZXBzKFxuICAgICAgICAgICAgdGhpcy5mbHV4LFxuICAgICAgICAgICAgZmlsdGVyZWRTdGVwc0lkZW50aWZpZXJzXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgICAgICAgIHRoaXMudmlzaWJsZUZpZWxkc1VwZGF0ZWQuZW1pdCh2aXNpYmxlU3RlcHMpO1xuICAgICAgICAgIHRoaXMuZm9ybWx5Q29uZmlnVXBkYXRlZC5lbWl0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldExhYmVscygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMubGFiZWxTZXJ2aWNlXG4gICAgICAgIC5nZXRMYWJlbHModGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sIGZhbHNlKVxuICAgICAgICAuc3Vic2NyaWJlKChsKSA9PiB7XG4gICAgICAgICAgdGhpcy5sYWJlbHMgPSBsO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHBvcHVsYXRlQ29udHJvbElkc1dpdGhWYWx1ZURpY3Rpb25hcnkoKSB7XG4gICAgdmFyIGN1cnJlbnRMYW5ndWFnZUlkID0gdGhpcy5nZXRDdXJyZW50TGFuZ3VhZ2VJZCgpO1xuXG4gICAgLy8gQnVpbGQgZGljdGlvbmFyeSBmcm9tIGZpbGxEYXRhLmZsdXggaWYgYXZhaWxhYmxlLCBvdGhlcndpc2Ugc3RhcnQgZW1wdHlcbiAgICBjb25zdCBjb250cm9sSWRzV2l0aFZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PiA9IHRoaXMuZmlsbERhdGE/LmZsdXhcbiAgICAgID8gdGhpcy5maWxsRGF0YS5mbHV4XG4gICAgICAgICAgLmZsYXRNYXAoKHN0ZXA6IHsgc2VjdGlvbnM6IHsgY29udHJvbHM6IGFueVtdIH1bXSB9KSA9PlxuICAgICAgICAgICAgc3RlcC5zZWN0aW9ucy5mbGF0TWFwKChzZWN0aW9uOiB7IGNvbnRyb2xzOiBhbnlbXSB9KSA9PlxuICAgICAgICAgICAgICBzZWN0aW9uLmNvbnRyb2xzXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoY29udHJvbCkgPT4gY29udHJvbC5jb250cm9sSWQgJiYgY29udHJvbC5maWxsVmFsdWUpXG4gICAgICAgICAgICAgICAgLm1hcCgoY29udHJvbCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xJZDogY29udHJvbC5jb250cm9sSWQsXG4gICAgICAgICAgICAgICAgICBmaWxsVmFsdWU6IGNvbnRyb2wuZmlsbFZhbHVlLFxuICAgICAgICAgICAgICAgICAgZmlsbFZhbHVlSWQ6IGNvbnRyb2wuZmlsbFZhbHVlSWRcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgZGljdGlvbmFyeTogeyBbeDogc3RyaW5nXTogYW55IH0sXG4gICAgICAgICAgICAgIHsgY29udHJvbElkLCBmaWxsVmFsdWUsIGZpbGxWYWx1ZUlkIH06IGFueVxuICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChmaWxsVmFsdWVJZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgZGljdF0gb2YgdGhpcy5kaWN0aW9uYXJ5TWFwLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkaWN0LnZhbHVlcz8uZmluZCgodikgPT4gdi5pZCA9PSBmaWxsVmFsdWVJZCk7XG4gICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB2YWx1ZS52YWx1ZVRyYW5zbGF0aW9ucy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICh0KSA9PiB0Lmxhbmd1YWdlSWQgPT0gY3VycmVudExhbmd1YWdlSWRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZGljdGlvbmFyeVtjb250cm9sSWRdID0gdHJhbnNsYXRpb24udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGljdGlvbmFyeVtjb250cm9sSWRdID0gZmlsbFZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBkaWN0aW9uYXJ5O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgICApXG4gICAgICA6IHt9O1xuXG4gICAgLy8gR2V0IGluaXRGbG93VmFsdWVzIGZyb20gZmlsbERhdGEgb3IgZnJvbSBkaXJlY3QgaW5wdXQgKHRoaXMuaW5pdEZsb3dWYWx1ZXMpXG4gICAgbGV0IGluaXRGbG93VmFsdWVzID0gdGhpcy5maWxsRGF0YT8uaW5pdEZsb3dWYWx1ZXM7XG5cbiAgICAvLyBJZiBub3QgaW4gZmlsbERhdGEsIHRyeSB0byBwYXJzZSBmcm9tIGRpcmVjdCBpbml0Rmxvd1ZhbHVlcyBpbnB1dFxuICAgIGlmICghaW5pdEZsb3dWYWx1ZXMgJiYgdGhpcy5pbml0Rmxvd1ZhbHVlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW5pdEZsb3dWYWx1ZXMgPVxuICAgICAgICAgIHR5cGVvZiB0aGlzLmluaXRGbG93VmFsdWVzID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBKU09OLnBhcnNlKHRoaXMuaW5pdEZsb3dWYWx1ZXMpXG4gICAgICAgICAgICA6IHRoaXMuaW5pdEZsb3dWYWx1ZXM7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHBhcnNlIGluaXRGbG93VmFsdWVzOicsIGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFkZEluaXRGbG93VmFsdWVzID0gKG5vZGU6IGFueSwgcGF0aFBhcnRzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChwYXRoUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnRyb2xJZHNXaXRoVmFsdWVzW2Bpbml0Rmxvd1ZhbHVlc18ke3BhdGhQYXJ0cy5qb2luKCdfJyl9YF0gPSAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICAgIG5vZGUuZm9yRWFjaCgoY2hpbGQsIGlkeCkgPT5cbiAgICAgICAgICBhZGRJbml0Rmxvd1ZhbHVlcyhjaGlsZCwgWy4uLnBhdGhQYXJ0cywgU3RyaW5nKGlkeCldKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgT2JqZWN0LmtleXMobm9kZSkuZm9yRWFjaCgoaykgPT5cbiAgICAgICAgICBhZGRJbml0Rmxvd1ZhbHVlcyhub2RlW2tdLCBbLi4ucGF0aFBhcnRzLCBrXSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocGF0aFBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29udHJvbElkc1dpdGhWYWx1ZXNbYGluaXRGbG93VmFsdWVzXyR7cGF0aFBhcnRzLmpvaW4oJ18nKX1gXSA9XG4gICAgICAgICAgU3RyaW5nKG5vZGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoaW5pdEZsb3dWYWx1ZXMgIT09IG51bGwgJiYgaW5pdEZsb3dWYWx1ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWRkSW5pdEZsb3dWYWx1ZXMoaW5pdEZsb3dWYWx1ZXMsIFtdKTtcbiAgICB9XG4gICAgLy8gQWRkIGluaGVyaXRlZCBmaWVsZHMgZnJvbSBwYXJlbnQgYXBwXG4gICAgY29uc3QgaW5oZXJpdGVkRmllbGRzID0gdGhpcy5maWxsRGF0YT8uaW5oZXJpdGVkRmllbGRzO1xuICAgIGlmIChpbmhlcml0ZWRGaWVsZHMgJiYgdHlwZW9mIGluaGVyaXRlZEZpZWxkcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluaGVyaXRlZEZpZWxkcykpIHtcbiAgICAgICAgbGV0IHJlc29sdmVkVmFsdWU6IGFueTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgICAgICh2YWx1ZSBhcyBhbnkpLmRpY3Rpb25hcnlVVUlEXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEVucmljaGVkIGZvcm1hdDogaGFuZGxlIG11bHRpLXNlbGVjdCBhbmQgc2luZ2xlLXNlbGVjdFxuICAgICAgICAgIGNvbnN0IGVucmljaGVkID0gdmFsdWUgYXMgYW55O1xuICAgICAgICAgIGNvbnN0IGZpbGxWYWx1ZUlkcyA9IGVucmljaGVkLmZpbGxWYWx1ZUlkcztcblxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbGxWYWx1ZUlkcykgJiYgZmlsbFZhbHVlSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIE11bHRpLXNlbGVjdDogbG9vayB1cCBlYWNoIElEIGluIGRpY3Rpb25hcnlNYXAgZm9yIHRyYW5zbGF0ZWQgZGlzcGxheVxuICAgICAgICAgICAgY29uc3QgY3VycmVudExhbmd1YWdlSWQgPSB0aGlzLmdldEN1cnJlbnRMYW5ndWFnZUlkKCk7XG4gICAgICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZUlkIG9mIGZpbGxWYWx1ZUlkcykge1xuICAgICAgICAgICAgICBjb25zdCBudW1lcmljSWQgPSB0eXBlb2YgdmFsdWVJZCA9PT0gJ3N0cmluZycgPyBwYXJzZUludCh2YWx1ZUlkLCAxMCkgOiB2YWx1ZUlkO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IFssIGRpY3RdIG9mIHRoaXMuZGljdGlvbmFyeU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkdiA9IGRpY3QudmFsdWVzPy5maW5kKCh2OiBhbnkpID0+IHYuaWQgPT09IG51bWVyaWNJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGR2KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IGR2LnZhbHVlVHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAodDogYW55KSA9PiB0Lmxhbmd1YWdlSWQgPT0gY3VycmVudExhbmd1YWdlSWRcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWVzLnB1c2godHJhbnNsYXRpb24/LnZhbHVlIHx8IGR2Lm5hbWUpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlZFZhbHVlID0gZGlzcGxheVZhbHVlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gZGlzcGxheVZhbHVlcy5qb2luKCcsICcpXG4gICAgICAgICAgICAgIDogKGVucmljaGVkLmZpbGxWYWx1ZSA/PyBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU2luZ2xlLXNlbGVjdFxuICAgICAgICAgICAgcmVzb2x2ZWRWYWx1ZSA9IGVucmljaGVkLmZpbGxWYWx1ZSA/PyBTdHJpbmcodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlZFZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbElkc1dpdGhWYWx1ZXNbYGluaGVyaXRlZF8ke2tleX1gXSA9IHJlc29sdmVkVmFsdWU7XG4gICAgICAgIGlmIChjb250cm9sSWRzV2l0aFZhbHVlc1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb250cm9sSWRzV2l0aFZhbHVlc1trZXldID0gcmVzb2x2ZWRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29udHJvbElkc1dpdGhWYWx1ZXMgPSBjb250cm9sSWRzV2l0aFZhbHVlcztcbiAgfVxuICBwcml2YXRlIGdldEN1cnJlbnRMYW5ndWFnZUlkKCk6IG51bWJlciB7XG4gICAgY29uc3QgY3VycmVudExhbmd1YWdlSWQgPSBVdGlscy5maW5kTGFuZ3VhZ2VJZEJ5SXNvKFxuICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMsXG4gICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICk7XG4gICAgcmV0dXJuIGN1cnJlbnRMYW5ndWFnZUlkO1xuICB9XG4gIHByaXZhdGUgYXN5bmMgYnVpbGRGb3JtbHlDb25maWdBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0ZXBzU2V0dGluZ3MgPSB7XG4gICAgICBzaG93Q291bnRlcjogdGhpcy5zaG93RGlzcGxheU1vZGVcbiAgICAgICAgPyBmYWxzZVxuICAgICAgICA6IHRoaXMuZ2VuZXJhbERhdGEuc2hvd0NvdW50ZXJTdGVwLFxuICAgICAgc2hvd0xhYmVsczogdGhpcy5zaG93RGlzcGxheU1vZGUgPyBmYWxzZSA6IHRoaXMuZ2VuZXJhbERhdGEuc2hvd05hbWVTdGVwLFxuICAgICAgc2hvd0FsbFN0ZXBzOiB0aGlzLnNob3dEaXNwbGF5TW9kZVxuICAgICAgICA/IGZhbHNlXG4gICAgICAgIDogdGhpcy5nZW5lcmFsRGF0YS5zaG93QWxsU3RlcHMsXG4gICAgICBzaG93UHJvZ3Jlc3NCYXI6XG4gICAgICAgIHRoaXMuZ2VuZXJhbERhdGEuc2hvd1Byb2dyZXNzQmFyICYmXG4gICAgICAgIHRoaXMuZ2VuZXJhbERhdGEuc2hvd0FsbFN0ZXBzID09IGZhbHNlXG4gICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgOiBmYWxzZVxuICAgIH07XG5cbiAgICB0aGlzLmZvcm1seUFsbFN0ZXBzID0gYXdhaXQgdGhpcy5idWlsZEZvcm1seUZpZWxkR3JvdXBBc3luYygpO1xuICAgIHZhciBoYXNEaWN0aW9uYXJ5RGVwZW5kZW50U3RlcHMgPSB0aGlzLmZvcm1seUFsbFN0ZXBzLnNvbWUoXG4gICAgICAoZikgPT4gZi5wcm9wcz8uWydkZXBlbmRlbnREaWN0aW9uYXJ5J10/LmlzRGljdGlvbmFyeURlcGVuZGVudFxuICAgICk7XG5cbiAgICB2YXIgZm9ybWx5RmlsdGVyZWRTdGVwcyA9IHRoaXMuZ2V0Rm9ybWx5RmlsdGVyZWRTdGVwcygpO1xuICAgIHZhciBmaWx0ZXJlZFN0ZXBzSWRlbnRpZmllcnMgPSBmb3JtbHlGaWx0ZXJlZFN0ZXBzLm1hcChcbiAgICAgIChmKSA9PiBmLnByb3BzPy5bJ3N0ZXBJZCddXG4gICAgKTtcbiAgICAvLyBHZXQgdmlzaWJsZSBzdGVwcyBmb3IgYWNjdXJhdGUgc3RlcCBjb3VudGluZ1xuICAgIGNvbnN0IHZpc2libGVTdGVwcyA9IHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZmlsdGVyVmlzaWJsZVN0ZXBzKHRoaXMuZmx1eCk7XG4gICAgY29uc3QgZmlsdGVyZWRWaXNpYmxlU3RlcHMgPSB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmZpbHRlclZpc2libGVTdGVwcyhcbiAgICAgIHRoaXMuZmx1eCxcbiAgICAgIGZpbHRlcmVkU3RlcHNJZGVudGlmaWVyc1xuICAgICk7XG5cbiAgICB0aGlzLmZvcm1seUNvbmZpZyA9IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ3N0ZXBwZXInLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIGFwcERhdGFJZDogdGhpcy5maWxsRGF0YVxuICAgICAgICAgICAgPyB0aGlzLmZpbGxEYXRhPy5tZXRhZGF0YT8uYXBwRGF0YUlkXG4gICAgICAgICAgICA6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgICAgZGVzaWduOiB0aGlzLmRlc2lnbixcbiAgICAgICAgICBhcHBsaWNhdGlvbklkOiB0aGlzLmFwcE1vZGVsLmFwcGxpY2F0aW9uVXVpZCxcbiAgICAgICAgICBmbHV4OiB2aXNpYmxlU3RlcHMsIC8vIFBhc3Mgb25seSB2aXNpYmxlIHN0ZXBzIHRvIHN0ZXBwZXJcbiAgICAgICAgICBmaWx0ZXJlZEZsdXg6IGZpbHRlcmVkVmlzaWJsZVN0ZXBzLFxuICAgICAgICAgIGlzRGlzcGxheU1vZGU6IHRoaXMuc2hvd0Rpc3BsYXlNb2RlLFxuICAgICAgICAgIGZpbGxEYXRhOiB0aGlzLmZpbGxEYXRhLFxuICAgICAgICAgIGluaXRGbG93VmFsdWVzOiB0aGlzLmluaXRGbG93VmFsdWVzLFxuICAgICAgICAgIGRlZmF1bHRMYW5ndWFnZTogdGhpcy5hcHBNb2RlbC5nZW5lcmFsRGF0YS5kZWZhdWx0TGFuZ3VhZ2UsXG4gICAgICAgICAgZGlzcGxheTogdGhpcy5kaXNwbGF5LFxuICAgICAgICAgIGRlc2lnbkNvbmZpZzoge1xuICAgICAgICAgICAgYnV0dG9uc1ZlcnRpY2FsUG9zaXRpb246XG4gICAgICAgICAgICAgIHRoaXMuYXBwTW9kZWwuZGVzaWduLmJ1dHRvbnNWZXJ0aWNhbFBvc2l0aW9uLFxuICAgICAgICAgICAgYnV0dG9uc0hvcml6b250YWxQb3NpdGlvbjpcbiAgICAgICAgICAgICAgdGhpcy5hcHBNb2RlbC5kZXNpZ24uYnV0dG9uc0hvcml6b250YWxQb3NpdGlvblxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RlcHNTZXR0aW5nczogdGhpcy5zdGVwc1NldHRpbmdzLFxuICAgICAgICAgIG1ldGFEYXRhOiB0aGlzLmZpbGxEYXRhPy5tZXRhZGF0YSxcbiAgICAgICAgICBkZW1vTW9kZTogdGhpcy5pc0RlbW9Nb2RlLFxuICAgICAgICAgIGlzRGVidWc6IHRoaXMuaXNEZWJ1ZyxcbiAgICAgICAgICBub0J1dHRvbnNJblZpZXc6IHRoaXMubm9CdXR0b25zSW5WaWV3LFxuICAgICAgICAgIGJsb2NrUHJldmlvdXNTdGVwOiB0aGlzLmJsb2NrUHJldmlvdXNTdGVwLFxuICAgICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgICAgaGFzRGljdGlvbmFyeURlcGVuZGVudFN0ZXBzOiBoYXNEaWN0aW9uYXJ5RGVwZW5kZW50U3RlcHMsXG4gICAgICAgICAgaGFzQWN0aW9uU3RlcHM6IHRoaXMuZmx1eC5zb21lKChzdGVwKSA9PlxuICAgICAgICAgICAgdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5pc0FjdGlvblN0ZXAoc3RlcClcbiAgICAgICAgICApLCAvLyBJbmRpY2F0ZSBpZiB0aGVyZSBhcmUgYWN0aW9uIHN0ZXBzXG4gICAgICAgICAgY29tcGxldGlvbkV2ZW50OiAoKSA9PiB0aGlzLm9uQ29tcGxldGlvbigpLFxuICAgICAgICAgIG9uU2VsZWN0ZWRQYWdlQ2hhbmdpbmc6IChpbmRleDogbnVtYmVyKSA9PlxuICAgICAgICAgICAgdGhpcy5vblNlbGVjdGVkUGFnZUNoYW5naW5nKGluZGV4KSxcbiAgICAgICAgICBvblNlbGVjdGVkUGFnZUNoYW5nZWQ6IChpbmRleDogbnVtYmVyKSA9PlxuICAgICAgICAgICAgdGhpcy5vblNlbGVjdGVkUGFnZUNoYW5nZWQoaW5kZXgpXG4gICAgICAgIH0sXG4gICAgICAgIGZpZWxkR3JvdXA6IGZvcm1seUZpbHRlcmVkU3RlcHNcbiAgICAgIH1cbiAgICBdO1xuXG4gICAgLy8gRm9yIGRpc3BsYXkgbW9kZSwgcG9wdWxhdGUgdmFsdWVzIGltbWVkaWF0ZWx5IGFmdGVyIGNvbmZpZyBpcyBidWlsdFxuICAgIGlmICh0aGlzLnNob3dEaXNwbGF5TW9kZSAmJiB0aGlzLmZvcm1seUNvbmZpZ1swXT8uZmllbGRHcm91cCkge1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHRoaXMuZm9ybWx5Q29uZmlnWzBdLmZpZWxkR3JvdXApIHtcbiAgICAgICAgdGhpcy5zZXRQcmVzZW50YXRpb25Db250cm9sVmFsdWVzUmVjdXJzaXZlbHkoc3RlcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvblNlbGVjdGVkUGFnZUNoYW5naW5nKHN0ZXBUcmFuc2l0aW9uOiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgZnJvbUluZGV4OiBudW1iZXI7XG4gICAgbGV0IHRvSW5kZXg6IG51bWJlcjtcbiAgICBsZXQgY2FsbGJhY2s6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIGlmICh0eXBlb2Ygc3RlcFRyYW5zaXRpb24gPT09ICdudW1iZXInKSB7XG4gICAgICB0b0luZGV4ID0gc3RlcFRyYW5zaXRpb247XG4gICAgICBmcm9tSW5kZXggPSB0aGlzLmFjdGl2ZVN0ZXA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZyb21JbmRleCA9IHN0ZXBUcmFuc2l0aW9uLmZyb207XG4gICAgICB0b0luZGV4ID0gc3RlcFRyYW5zaXRpb24udG87XG4gICAgICBjYWxsYmFjayA9IHN0ZXBUcmFuc2l0aW9uLmNhbGxiYWNrIHx8ICgoKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgbGV0IGFjdGlvbnNFeGVjdXRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHRvSW5kZXggPiBmcm9tSW5kZXgpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAn4p6h77iPIE1vdmluZyBmb3J3YXJkIC0gZXhlY3V0aW5nIGFjdGlvbiBzdGVwcyBhZnRlciBjdXJyZW50IHN0ZXAnXG4gICAgICApO1xuICAgICAgYWN0aW9uc0V4ZWN1dGVkID1cbiAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlQWN0aW9uU3RlcHNBZnRlckN1cnJlbnRTdGVwKGZyb21JbmRleCk7XG4gICAgfSBlbHNlIGlmICh0b0luZGV4IDwgZnJvbUluZGV4KSB7XG4gICAgICBjb25zb2xlLmxvZygn4qyF77iPIE1vdmluZyBiYWNrd2FyZCAtIG5vIGFjdGlvbiBleGVjdXRpb24gbmVlZGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5SEIFN0YXlpbmcgb24gc2FtZSBzdGVwIC0gbm8gYWN0aW9uIGV4ZWN1dGlvbiBuZWVkZWQnKTtcbiAgICB9XG5cbiAgICB0aGlzLmFjdGl2ZVN0ZXAgPSB0b0luZGV4O1xuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb25zRXhlY3V0ZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVBY3Rpb25TdGVwc0FmdGVyQ3VycmVudFN0ZXAoXG4gICAgY3VycmVudFN0ZXBJbmRleDogbnVtYmVyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmlzRXhlY3V0aW5nQWN0aW9ucykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBmaWx0ZXJlZFN0ZXBzID0gdGhpcy5mbHV4LmZpbHRlcigocykgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBzLmRlcGVuZGVudERpY3Rpb25hcnkgJiZcbiAgICAgICAgcy5kZXBlbmRlbnREaWN0aW9uYXJ5LmlzRGljdGlvbmFyeURlcGVuZGVudFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsVmFsdWUgPVxuICAgICAgICAgIHRoaXMubW9kZWxbcy5kZXBlbmRlbnREaWN0aW9uYXJ5LmRpY3Rpb25hcnlDb250cm9sSWRlbnRpZmllcl07XG4gICAgICAgIC8vIFNraXAgZGVwZW5kZW5jeSBjaGVjayBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uIChhcnJheSlcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobW9kZWxWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gbW9kZWxWYWx1ZT8uaWQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzZWxlY3RlZFZhbHVlICYmXG4gICAgICAgICAgcy5kZXBlbmRlbnREaWN0aW9uYXJ5LmRlcGVuZGVudFZhbHVlSWRzLmluY2x1ZGVzKHNlbGVjdGVkVmFsdWUpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgYWN0aW9uU3RlcHMgPSB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmdldEFjdGlvblN0ZXBzQXRJbmRleChcbiAgICAgIGZpbHRlcmVkU3RlcHMsXG4gICAgICBjdXJyZW50U3RlcEluZGV4XG4gICAgKTtcblxuICAgIGlmIChhY3Rpb25TdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5hcHBEYXRhVXVpZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgc2F2aW5nIGZsYWcgYmVmb3JlIHN0YXJ0aW5nIGFjdGlvbnNcbiAgICAgIHRoaXMuaXNTYXZpbmdBZnRlckFjdGlvbnMgPSB0cnVlO1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmV4ZWN1dGVBY3Rpb25TdGVwcyhcbiAgICAgICAgYWN0aW9uU3RlcHMsXG4gICAgICAgIHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIChzdGVwKSA9PiB7XG4gICAgICAgICAgY29uc3QgbG9hZGluZ01lc3NhZ2UgPSBVdGlscy5maW5kVHJhbnNsYXRpb25JbmZvKFxuICAgICAgICAgICAgJ2xvYWRpbmdNZXNzYWdlVHJhbnNsYXRpb25zJyxcbiAgICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2UgPSBsb2FkaW5nTWVzc2FnZSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ+KchSBBY3Rpb24gc3RlcHMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgIC8vIEtlZXAgbG9hZGluZyBzdGF0ZSB0cnVlIC0gaXQgd2lsbCBiZSBjbGVhcmVkIGFmdGVyIHNhdmVBcHBEYXRhU3RlcCBjb21wbGV0ZXNcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgQWN0aW9uIHN0ZXBzIGV4ZWN1dGlvbiBmYWlsZWQ6JywgcmVzdWx0LmVycm9yKTtcbiAgICAgICAgdGhpcy5pc1NhdmluZ0FmdGVyQWN0aW9ucyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBFcnJvciBleGVjdXRpbmcgYWN0aW9uIHN0ZXBzOicsIGVycm9yKTtcbiAgICAgIHRoaXMuaXNTYXZpbmdBZnRlckFjdGlvbnMgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTGVhZGluZ0FjdGlvblN0ZXBzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hcHBEYXRhVXVpZCB8fCAhdGhpcy5mbHV4IHx8IHRoaXMuZmx1eC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsZWFkaW5nQWN0aW9uU3RlcHMgPVxuICAgICAgdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5nZXRBY3Rpb25TdGVwc0JlZm9yZUZpcnN0VmlzaWJsZVN0ZXAodGhpcy5mbHV4KTtcblxuICAgIGlmIChsZWFkaW5nQWN0aW9uU3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coXG4gICAgICBg8J+OrCBFeGVjdXRpbmcgJHtsZWFkaW5nQWN0aW9uU3RlcHMubGVuZ3RofSBsZWFkaW5nIGFjdGlvbiBzdGVwcyBiZWZvcmUgZmlyc3QgdmlzaWJsZSBzdGVwYFxuICAgICk7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZXhlY3V0ZUFjdGlvblN0ZXBzKFxuICAgICAgICBsZWFkaW5nQWN0aW9uU3RlcHMsXG4gICAgICAgIHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIChzdGVwKSA9PiB7XG4gICAgICAgICAgY29uc3QgbG9hZGluZ01lc3NhZ2UgPSBVdGlscy5maW5kVHJhbnNsYXRpb25JbmZvKFxuICAgICAgICAgICAgJ2xvYWRpbmdNZXNzYWdlVHJhbnNsYXRpb25zJyxcbiAgICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2UgPSBsb2FkaW5nTWVzc2FnZSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ+KchSBMZWFkaW5nIGFjdGlvbiBzdGVwcyBleGVjdXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBMZWFkaW5nIGFjdGlvbiBzdGVwcyBmYWlsZWQ6JywgcmVzdWx0LmVycm9yKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcign4p2MIEVycm9yIGV4ZWN1dGluZyBsZWFkaW5nIGFjdGlvbiBzdGVwczonLCBlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25TZWxlY3RlZFBhZ2VDaGFuZ2VkKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5mb3JtbHlDb25maWdbMF0uZmllbGRHcm91cCkge1xuICAgICAgdmFyIHNlbGVjdGVkUGFnZSA9IHRoaXMuZm9ybWx5Q29uZmlnWzBdLmZpZWxkR3JvdXBbaW5kZXhdO1xuICAgICAgdGhpcy5zZXRQcmVzZW50YXRpb25Db250cm9sVmFsdWVzUmVjdXJzaXZlbHkoc2VsZWN0ZWRQYWdlKTtcblxuICAgICAgTW9kZWxQb3B1bGF0aW9uSGVscGVyLmFwcGx5UHJlY29tcGxldGlvblRvTW9kZWwodGhpcy5tb2RlbCwgdGhpcy5mbHV4KTtcbiAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHRoaXMubW9kZWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0UHJlc2VudGF0aW9uQ29udHJvbFZhbHVlc1JlY3Vyc2l2ZWx5KGZjPzogYW55KSB7XG4gICAgZmM/LmZpZWxkR3JvdXA/LmZvckVhY2goKGZnOiBhbnkpID0+IHtcbiAgICAgIGlmIChmZy5wcm9wcyAmJiBmZy5wcm9wc1snaXNEaXNwbGF5TW9kZSddID09PSB0cnVlKSB7XG4gICAgICAgIHZhciBtZXRob2RGaWVsZElkID0gZmcucHJvcHNbJ2FwaU1ldGhvZEZpZWxkSWQnXTtcbiAgICAgICAgaWYgKG1ldGhvZEZpZWxkSWQpIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmZpbmRJbkFwaUNhbGxzUmVzcG9uc2VzKG1ldGhvZEZpZWxkSWQpO1xuICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IHZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYXNzb2NpYXRlZENvbnRyb2xJZCA9IGZnLnByb3BzWydjb2xsZWN0aW9uQ29udHJvbElkZW50aWZpZXInXTtcbiAgICAgICAgICBpZiAoYXNzb2NpYXRlZENvbnRyb2xJZCkge1xuICAgICAgICAgICAgY29uc3QgZm91bmQgPVxuICAgICAgICAgICAgICB0aGlzLmZpbmRDb250cm9sSW5GaWxsRGF0YUNvbnRyb2xzKGFzc29jaWF0ZWRDb250cm9sSWQpO1xuICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgIC8vIE11bHRpcGxlIHNlbGVjdGlvbiAtIHNob3cgdmFsdWVzIHdpdGggY29tbWFcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWVJZHNBcnJheSA9XG4gICAgICAgICAgICAgICAgZm91bmQuZmlsbFZhbHVlSWRzIHx8IGZvdW5kLmZpbGx2YWx1ZWlkcyB8fCBmb3VuZC5GaWxsVmFsdWVJZHM7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlc0FycmF5ID1cbiAgICAgICAgICAgICAgICBmb3VuZC5maWxsVmFsdWVzIHx8IGZvdW5kLmZpbGx2YWx1ZXMgfHwgZm91bmQuRmlsbFZhbHVlcztcblxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdmFsdWVJZHNBcnJheSAmJlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWVJZHNBcnJheSkgJiZcbiAgICAgICAgICAgICAgICB2YWx1ZUlkc0FycmF5Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudExhbmd1YWdlSWQgPSB0aGlzLmdldEN1cnJlbnRMYW5ndWFnZUlkKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzcGxheVZhbHVlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlSWQgb2YgdmFsdWVJZHNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbnVtZXJpY1ZhbHVlSWQgPVxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWVJZCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KHZhbHVlSWQsIDEwKVxuICAgICAgICAgICAgICAgICAgICAgIDogdmFsdWVJZDtcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgZGljdF0gb2YgdGhpcy5kaWN0aW9uYXJ5TWFwLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRpY3QudmFsdWVzPy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICh2KSA9PiB2LmlkID09PSBudW1lcmljVmFsdWVJZFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHZhbHVlLnZhbHVlVHJhbnNsYXRpb25zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAodCkgPT4gdC5sYW5ndWFnZUlkID09IGN1cnJlbnRMYW5ndWFnZUlkXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWVzLnB1c2godHJhbnNsYXRpb24/LnZhbHVlIHx8IHZhbHVlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5VmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IGRpc3BsYXlWYWx1ZXMuam9pbignLCAnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgdmFsdWVzQXJyYXkgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlc0FycmF5KSAmJlxuICAgICAgICAgICAgICAgIHZhbHVlc0FycmF5Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHVzZSBmaWxsVmFsdWVzIGFycmF5IGRpcmVjdGx5XG4gICAgICAgICAgICAgICAgZmcuZGVmYXVsdFZhbHVlID0gdmFsdWVzQXJyYXkuam9pbignLCAnKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3VuZC5maWxsVmFsdWVJZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZUlkID0gdGhpcy5nZXRDdXJyZW50TGFuZ3VhZ2VJZCgpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgZGljdF0gb2YgdGhpcy5kaWN0aW9uYXJ5TWFwLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkaWN0LnZhbHVlcz8uZmluZChcbiAgICAgICAgICAgICAgICAgICAgKHYpID0+IHYuaWQgPT0gZm91bmQuZmlsbFZhbHVlSWRcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB2YWx1ZS52YWx1ZVRyYW5zbGF0aW9ucy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICh0KSA9PiB0Lmxhbmd1YWdlSWQgPT0gY3VycmVudExhbmd1YWdlSWRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZmcuZGVmYXVsdFZhbHVlID0gdHJhbnNsYXRpb24udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmcuZGVmYXVsdFZhbHVlID0gZm91bmQuZmlsbFZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBDaGVjayBjb250cm9sSWRzV2l0aFZhbHVlcyBmb3IgaW5pdEZsb3dWYWx1ZXNcbiAgICAgICAgICAgICAgbGV0IGluaXRGbG93VmFsdWUgPVxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbElkc1dpdGhWYWx1ZXM/Llthc3NvY2lhdGVkQ29udHJvbElkXTtcbiAgICAgICAgICAgICAgaWYgKGluaXRGbG93VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBpbml0Rmxvd1ZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICAgaW5pdEZsb3dWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgaW5pdEZsb3dWYWx1ZS5maWxsVmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgaW5pdEZsb3dWYWx1ZSA9IGluaXRGbG93VmFsdWUuZmlsbFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmZy5kZWZhdWx0VmFsdWUgPSBpbml0Rmxvd1ZhbHVlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZmluZEluQXBpQ2FsbHNSZXNwb25zZXMoYXNzb2NpYXRlZENvbnRyb2xJZCk7XG4gICAgICAgICAgICAgICAgZmcuZGVmYXVsdFZhbHVlID0gdmFsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFByZXNlbnRhdGlvbkNvbnRyb2xWYWx1ZXNSZWN1cnNpdmVseShmZyk7XG4gICAgICB9XG4gICAgICBpZiAoZmcucHJvcHNbJ2NkciddKSB7XG4gICAgICAgIGZnLnByb3BzWydjZHInXS5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRDb250cm9sSW5GaWxsRGF0YUNvbnRyb2xzKGNvbnRyb2xJZDogc3RyaW5nKTogYW55IHtcbiAgICBsZXQgY29udHJvbERhdGE6IGFueSA9IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5maWxsRGF0YSkge1xuICAgICAgdGhpcy5maWxsRGF0YS5mbHV4Py5mb3JFYWNoKChmOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFjb250cm9sRGF0YSkge1xuICAgICAgICAgIGYuc2VjdGlvbnM/LmZvckVhY2goKHM6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjb250cm9sRGF0YSkge1xuICAgICAgICAgICAgICBjb250cm9sRGF0YSA9IHMuY29udHJvbHM/LmZpbmQoXG4gICAgICAgICAgICAgICAgKGM6IGFueSkgPT4gYy5jb250cm9sSWQgPT09IGNvbnRyb2xJZFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoY29udHJvbERhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udHJvbERhdGE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sRGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEluQXBpQ2FsbHNSZXNwb25zZXMoZmllbGRJZDogc3RyaW5nKTogYW55IHtcbiAgICBsZXQgZm91bmRWYWx1ZTogYW55ID0gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmZpbGxEYXRhKSB7XG4gICAgICB0aGlzLmZpbGxEYXRhLkFQSUNhbGxzPy5mb3JFYWNoKChhcGk6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWZvdW5kVmFsdWUpIHtcbiAgICAgICAgICBhcGkuTWV0aG9kcz8uZm9yRWFjaCgobTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWZvdW5kVmFsdWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSBtLkZpZWxkcz8uW2ZpZWxkSWRdO1xuICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgICBmb3VuZFZhbHVlID0gZm91bmQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmb3VuZFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGb3JtbHlGaWx0ZXJlZFN0ZXBzKCkge1xuICAgIGxldCBzdGVwcyA9IHRoaXMuZm9ybWx5QWxsU3RlcHMuZmlsdGVyKChzKSA9PiB7XG4gICAgICBpZiAocy5wcm9wcyAmJiBzLnByb3BzWydkZXBlbmRlbnREaWN0aW9uYXJ5J10pIHtcbiAgICAgICAgY29uc3QgZGVwRGljdCA9IHMucHJvcHNbXG4gICAgICAgICAgJ2RlcGVuZGVudERpY3Rpb25hcnknXG4gICAgICAgIF0gYXMgRGVwZW5kZW50RGljdGlvbmFyeURhdGE7XG4gICAgICAgIGlmIChkZXBEaWN0ICYmIGRlcERpY3QuaXNEaWN0aW9uYXJ5RGVwZW5kZW50KSB7XG4gICAgICAgICAgY29uc3QgbW9kZWxWYWx1ZSA9IHRoaXMubW9kZWxbZGVwRGljdC5kaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXJdO1xuICAgICAgICAgIC8vIFNraXAgZGVwZW5kZW5jeSBjaGVjayBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uIChhcnJheSlcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlbFZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVmFsdWUgPSBtb2RlbFZhbHVlPy5pZDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzZWxlY3RlZFZhbHVlICYmXG4gICAgICAgICAgICBkZXBEaWN0LmRlcGVuZGVudFZhbHVlSWRzLmluY2x1ZGVzKHNlbGVjdGVkVmFsdWUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiBzdGVwcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRGb3JtbHlGaWVsZEdyb3VwQXN5bmMoKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZ1tdPiB7XG4gICAgdGhpcy5zdGVwRGljdGlvbmFyeURlcGVuZGVudElkcyA9IFtdO1xuICAgIGlmICh0aGlzLnNob3dEaXNwbGF5TW9kZSkge1xuICAgICAgY29uc3Qgc3RlcCA9IGF3YWl0IHRoaXMuYnVpZERpc3BsYXlTdGVwKCk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtzdGVwXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbHRlciBvdXQgYWN0aW9uIHN0ZXBzIGZyb20gdmlzaWJsZSBzdGVwc1xuICAgICAgY29uc3QgdmlzaWJsZVN0ZXBzID0gdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5maWx0ZXJWaXNpYmxlU3RlcHModGhpcy5mbHV4KTtcbiAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdmlzaWJsZVN0ZXBzLm1hcCgoc3RlcCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkRm9ybWx5RmllbGRDb25maWdBc3luYyhzdGVwKTtcbiAgICAgICAgfSkgPz8gW11cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEZvcm1seUZpZWxkQ29uZmlnQXN5bmMoXG4gICAgc3RlcDogU3RlcERhdGFcbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZz4ge1xuICAgIGxldCBzdGVwRm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZyA9IHt9O1xuXG4gICAgaWYgKHN0ZXAudHlwZSAhPT0gRmx1eFR5cGUuQ3VzdG9tICYmIHN0ZXAudHlwZSAhPT0gRmx1eFR5cGUuRmluYWwpIHtcbiAgICAgIHN0ZXBGb3JtbHlDb25maWcgPSBhd2FpdCB0aGlzLmJ1aWxkU3lzdGVtRmllbGRGb3JtbHlDb25maWcoc3RlcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ZXBGb3JtbHlDb25maWcgPSB7XG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgbGFiZWw6IHN0ZXAubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogc3RlcC5uYW1lLFxuICAgICAgICAgIGJ1dHRvbnM6IHRoaXMuY29uc3RydWN0QnV0dG9ucyhzdGVwLmJ1dHRvbnMpLFxuICAgICAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHN0ZXAuZGVwZW5kZW50RGljdGlvbmFyeSxcbiAgICAgICAgICBzdGVwSWQ6IHN0ZXAuaWRlbnRpZmllclxuICAgICAgICB9LFxuICAgICAgICBmaWVsZEdyb3VwOiBhd2FpdCB0aGlzLmJ1aWxkU2VjdGlvbnNGaWVsZEdyb3VwQXN5bmMoc3RlcCwgc3RlcC5zZWN0aW9ucylcbiAgICAgIH07XG5cbiAgICAgIGlmIChzdGVwLnRyYW5zbGF0aW9ucykge1xuICAgICAgICBzdGVwRm9ybWx5Q29uZmlnLnByb3BzIVsnbGFiZWwnXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgJ25hbWUnLFxuICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG4gICAgICAgIHN0ZXBGb3JtbHlDb25maWcucHJvcHMhWydkZXNjcmlwdGlvbiddID0gVXRpbHMuZmluZFRyYW5zbGF0aW9uSW5mbyhcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0ZXBGb3JtbHlDb25maWcgJiYgc3RlcEZvcm1seUNvbmZpZy5wcm9wcykge1xuICAgICAgdGhpcy5zZXRTdGVwQmFzZVByb3BzKHN0ZXAsIHN0ZXBGb3JtbHlDb25maWcpO1xuICAgIH1cbiAgICBpZiAoc3RlcC5kZXBlbmRlbnREaWN0aW9uYXJ5Py5pc0RpY3Rpb25hcnlEZXBlbmRlbnQpIHtcbiAgICAgIHRoaXMuc3RlcERpY3Rpb25hcnlEZXBlbmRlbnRJZHMucHVzaChcbiAgICAgICAgc3RlcC5kZXBlbmRlbnREaWN0aW9uYXJ5LmRpY3Rpb25hcnlDb250cm9sSWRlbnRpZmllclxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBGb3JtbHlDb25maWc7XG4gIH1cblxuICB0cmlnZ2VyQ29tcG9uZW50VXBkYXRlKGNvbnRyb2xJZDogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zZXRGb3JtbHlGaWVsZFZhbHVlKHRoaXMuZm9ybWx5QWxsU3RlcHMsIGNvbnRyb2xJZCwgdmFsdWUpO1xuICB9XG5cbiAgc2V0Rm9ybWx5RmllbGRWYWx1ZShcbiAgICBmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10gfCB1bmRlZmluZWQsXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWZpZWxkcykgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZC5rZXkgPT09IGtleSkge1xuICAgICAgICBpZiAoZmllbGQuZm9ybUNvbnRyb2wpIHtcbiAgICAgICAgICBmaWVsZC5mb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpZWxkLmZpZWxkR3JvdXAgJiYgQXJyYXkuaXNBcnJheShmaWVsZC5maWVsZEdyb3VwKSkge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuc2V0Rm9ybWx5RmllbGRWYWx1ZShmaWVsZC5maWVsZEdyb3VwLCBrZXksIHZhbHVlKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkU3lzdGVtRmllbGRGb3JtbHlDb25maWcoXG4gICAgc3RlcDogU3RlcERhdGFcbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZz4ge1xuICAgIGNvbnN0IGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7XG4gICAgICBwcm9wczoge1xuICAgICAgICBsYWJlbDogc3RlcC5uYW1lLFxuICAgICAgICBidXR0b25zOiB0aGlzLmNvbnN0cnVjdEJ1dHRvbnMoc3RlcC5idXR0b25zKSxcbiAgICAgICAgZmx1eFR5cGU6IHN0ZXAudHlwZVxuICAgICAgfSxcbiAgICAgIGZpZWxkR3JvdXA6IFtdXG4gICAgfTtcblxuICAgIHRoaXMuc2V0U3RlcEJhc2VQcm9wcyhzdGVwLCBmb3JtbHlDb25maWcpO1xuICAgIHZhciBmaWVsZENvbmZpZyA9IHRoaXMuY3JlYXRlRm9ybWx5U3lzdGVtRmllbGRDb25maWcoc3RlcCk7XG5cbiAgICBpZiAoZmllbGRDb25maWcpIHtcbiAgICAgIGlmIChzdGVwLnRyYW5zbGF0aW9ucykge1xuICAgICAgICBsZXQgbGFiZWxzOiBhbnkgPSB7fTtcbiAgICAgICAgc3RlcC50cmFuc2xhdGlvbnMuZm9yRWFjaCgodHI6IFRyYW5zbGF0aW9uSW5mbykgPT4ge1xuICAgICAgICAgIGxhYmVsc1t0ci5uYW1lXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbihcbiAgICAgICAgICAgIHRyLnZhbHVlcyxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZpZWxkQ29uZmlnLnByb3BzIVsnbGFiZWxzJ10gPSBsYWJlbHM7XG4gICAgICAgIGZpZWxkQ29uZmlnLnByb3BzIVsnbmFtZSddID0gVXRpbHMuZmluZFRyYW5zbGF0aW9uSW5mbyhcbiAgICAgICAgICAnbmFtZScsXG4gICAgICAgICAgc3RlcC50cmFuc2xhdGlvbnMsXG4gICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKTtcbiAgICAgICAgZmllbGRDb25maWcucHJvcHMhWydkZXNjcmlwdGlvbiddID0gVXRpbHMuZmluZFRyYW5zbGF0aW9uSW5mbyhcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG4gICAgICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2xhYmVsJ10gPSBVdGlscy5maW5kVHJhbnNsYXRpb25JbmZvKFxuICAgICAgICAgICduYW1lJyxcbiAgICAgICAgICBzdGVwLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApO1xuICAgICAgICBmb3JtbHlDb25maWcucHJvcHMhWydkZXNjcmlwdGlvbiddID0gVXRpbHMuZmluZFRyYW5zbGF0aW9uSW5mbyhcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmaWVsZENvbmZpZy5wcm9wcyFbJ3N0ZXBzU2V0dGluZ3MnXSA9IHRoaXMuc3RlcHNTZXR0aW5ncztcbiAgICAgIGZvcm1seUNvbmZpZy5maWVsZEdyb3VwIS5wdXNoKGZpZWxkQ29uZmlnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWx5Q29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTdGVwQmFzZVByb3BzKHN0ZXA6IFN0ZXBEYXRhLCBmb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnKSB7XG4gICAgaWYgKGZvcm1seUNvbmZpZy5wcm9wcykge1xuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzWyduYW1lJ10gPSBzdGVwLm5hbWU7XG4gICAgICBmb3JtbHlDb25maWcucHJvcHNbJ2ZsdXhUeXBlJ10gPSBzdGVwLnR5cGU7XG4gICAgICBmb3JtbHlDb25maWcucHJvcHNbJ3N0ZXBJZCddID0gc3RlcC5pZGVudGlmaWVyO1xuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzWydpc1Zpc2libGUnXSA9IHN0ZXAuaXNWaXNpYmxlO1xuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzWydkZXBlbmRlbnREaWN0aW9uYXJ5J10gPSBzdGVwLmRlcGVuZGVudERpY3Rpb25hcnk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVTaWduRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktc2lnbi1jb21wb25lbnQnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBzdGVwRGF0YTogc3RlcCxcbiAgICAgICAgZGVzaWduOiB0aGlzLmRlc2lnbixcbiAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgZmx1eDogdGhpcy5mbHV4LFxuICAgICAgICBwYXJlbnRGb3JtOiB0aGlzLmZvcm0sXG4gICAgICAgIGdldE1vZGVsOiAoKSA9PiB0aGlzLm1vZGVsLFxuICAgICAgICBldmVudDogYXN5bmMgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQgPT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGVwcGVyR29OZXh0QXN5bmMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVEb3dubG9hZERvY3NGaWVsZENvbmZpZyhcbiAgICBjb250cm9sRGF0YTogQmFzZUNvbnRyb2xcbiAgKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LWRvd25sb2FkLWRvY3VtZW50cy1jb21wb25lbnQnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgYXBwSWQ6IHRoaXMuYXBwTW9kZWwuYXBwbGljYXRpb25VdWlkLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIGNvbnRyb2xEYXRhOiBjb250cm9sRGF0YSxcbiAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgZG9jdW1lbnRzRGF0YTogdGhpcy5hcHBNb2RlbC5kb2N1bWVudHMsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlVmlld0RvY3NGaWVsZENvbmZpZyhcbiAgICBjb250cm9sRGF0YTogQmFzZUNvbnRyb2xcbiAgKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXZpZXctZG9jdW1lbnRzLWNvbXBvbmVudCcsXG4gICAgICBwcm9wczoge1xuICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgY29udHJvbERhdGE6IGNvbnRyb2xEYXRhLFxuICAgICAgICBlbnY6IHRoaXMuZW52LFxuICAgICAgICBkb2N1bWVudHNEYXRhOiB0aGlzLmFwcE1vZGVsLmRvY3VtZW50cyxcbiAgICAgICAgbGFuZ0lzbzogdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVVcGxvYWREb2NzRmllbGRDb25maWcoXG4gICAgY29udHJvbERhdGE6IEJhc2VDb250cm9sXG4gICk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS11cGxvYWQtZG9jdW1lbnRzLWNvbXBvbmVudCcsXG4gICAgICBwcm9wczoge1xuICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgY29udHJvbERhdGE6IGNvbnRyb2xEYXRhLFxuICAgICAgICBlbnY6IHRoaXMuZW52LFxuICAgICAgICBkb2N1bWVudHNEYXRhOiB0aGlzLmFwcE1vZGVsLmRvY3VtZW50cyxcbiAgICAgICAgbGFuZ0lzbzogdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVHZW5lcmF0ZURvY3NGaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1nZW5lcmF0ZS1kb2N1bWVudHMtY29tcG9uZW50JyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGFwcElkOiB0aGlzLmFwcE1vZGVsLmFwcGxpY2F0aW9uVXVpZCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBzdGVwRGF0YTogc3RlcCxcbiAgICAgICAgZG9jdW1lbnRzRGF0YTogdGhpcy5hcHBNb2RlbC5kb2N1bWVudHMsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICBldmVudDogYXN5bmMgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQgPT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGVwcGVyR29OZXh0QXN5bmMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc3RlcHBlckdvTmV4dEFzeW5jKCkge1xuICAgIGNvbnN0IHN0ZXBwZXJDb21wb25lbnQgPSB0aGlzLmZvcm1seUNvbmZpZ1swXS5wcm9wcyFbJ2NvbXBvbmVudCddO1xuICAgIGlmIChzdGVwcGVyQ29tcG9uZW50ICYmIHN0ZXBwZXJDb21wb25lbnQubmF2aWdhdGVOZXh0QXN5bmMpIHtcbiAgICAgIGF3YWl0IHN0ZXBwZXJDb21wb25lbnQubmF2aWdhdGVOZXh0QXN5bmMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZUVucm9sbENhcmRGaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICBsZXQgbGFiZWxzOiBhbnkgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhzdGVwLmNvbmZpZykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoa2V5LmVuZHNXaXRoKCdMYWJlbCcpKSB7XG4gICAgICAgIGxhYmVsc1trZXldID1cbiAgICAgICAgICBzdGVwPy5jb25maWdba2V5XT8uZmluZChcbiAgICAgICAgICAgIChpOiB7IGxhbmd1YWdlSXNvOiBzdHJpbmcgfSkgPT5cbiAgICAgICAgICAgICAgaS5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApPy52YWx1ZSA/PyAnJztcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1lbnJvbC1jYXJkLWNvbXBvbmVudCcsXG4gICAgICBwcm9wczoge1xuICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgZGF0YVVybElkOiB0aGlzLmRhdGFVcmxJZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGxhYmVsczogbGFiZWxzLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBDcmVhdGVJZFNjYW5GaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICBsZXQgZXJyb3JNZXNzYWdlczogYW55ID0ge307XG5cbiAgICBpZiAoc3RlcC5lcnJvcnNUcmFuc2xhdGlvbnMpIHtcbiAgICAgIHN0ZXAuZXJyb3JzVHJhbnNsYXRpb25zLmZvckVhY2goKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgZXJyb3JNZXNzYWdlc1tlcnJvci5jb2RlXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbihcbiAgICAgICAgICBlcnJvci50cmFuc2xhdGlvbnMsXG4gICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXNjYW4taWQnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgY29uZmlnOiBzdGVwLmNvbmZpZyxcbiAgICAgICAgc3RlcFR5cGU6IHN0ZXAudHlwZSxcbiAgICAgICAgc3RlcElkOiBzdGVwLmlkZW50aWZpZXIsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCB8fCBVdGlscy5nZW5lcmF0ZVVVSUQoKSxcbiAgICAgICAgYXBwSWQ6IHRoaXMuYXBwTW9kZWwuYXBwbGljYXRpb25VdWlkLFxuICAgICAgICBlcnJvck1lc3NhZ2VzOiBlcnJvck1lc3NhZ2VzLFxuICAgICAgICBldmVudDogKGV2ZW50OiBhbnkpID0+IHRoaXMub25JZFNjYW5Db21wbGV0ZWQoZXZlbnQsIHN0ZXApXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlS3ljRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgY29uc3QgbG9hZGluZ01zZ1RyYW5zbGF0aW9ucyA9IHN0ZXAudHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgKHQ6IGFueSkgPT4gdC5uYW1lID09PSAnbG9hZGluZ01lc3NhZ2VUcmFuc2xhdGlvbnMnXG4gICAgKTtcblxuICAgIGNvbnN0IHRyYW5zbGF0ZWRMb2FkaW5nTWVzc2FnZSA9XG4gICAgICBsb2FkaW5nTXNnVHJhbnNsYXRpb25zPy52YWx1ZXM/LmZpbmQoXG4gICAgICAgICh2OiBhbnkpID0+IHYubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICApPy52YWx1ZSB8fCAnJztcblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LWlkZW50aWZpY2F0aW9uLWNvbXBvbmVudCcsXG4gICAgICBwcm9wczoge1xuICAgICAgICB0b2tlbjogdGhpcy5reWNUb2tlbixcbiAgICAgICAgYXBpX3VybDogdGhpcy5reWNBcGlVcmwsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgZW52OiAnRE9DS0VSJywgLy8gQ29uc2lkZXIgbWFraW5nIHRoaXMgZHluYW1pYyBpZiBuZWVkZWRcbiAgICAgICAgcmVkaXJlY3RfaWQ6IHRoaXMua3ljUmVkaXJlY3RJZCxcbiAgICAgICAgcGhvbmVfbnVtYmVyOiAnJyxcbiAgICAgICAgbGFuZ19pc286IHRoaXMua3ljTGFuZ0lzbyxcbiAgICAgICAgc2hvd19jaXRpemVuc2hpcF9zZWxlY3RvcjogdGhpcy5reWNTaG93Q2l0aXplbnNoaXAsXG4gICAgICAgIHNjcm9sbF9tb2RlOiB0aGlzLmt5Y1Njcm9sbE1vZGUsXG4gICAgICAgIG1heFJldHJpZXM6IHN0ZXAuY29uZmlnPy5tYXhLeWNSZXRyaWVzID8/IDMsXG4gICAgICAgIGxvYWRpbmdNZXNzYWdlOiB0cmFuc2xhdGVkTG9hZGluZ01lc3NhZ2UsXG4gICAgICAgIGVjdENvbXBsZXRlZDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2UgPSB0cmFuc2xhdGVkTG9hZGluZ01lc3NhZ2U7XG4gICAgICAgICAgYXdhaXQgdGhpcy5vcmlnaW5Gb3JtU2lnbmFsckhhbmRsZXJTZXJ2aWNlLmluaXRpYXRlS3ljUHJvY2Vzc2luZyhcbiAgICAgICAgICAgIHRoaXMuYXBwRGF0YVV1aWRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlUGhvbmVFbWFpbEZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXZhbGlkYXRlLWNvbnRhY3QtaW5mbycsXG4gICAgICBwcm9wczoge1xuICAgICAgICBzdGVwRGF0YTogc3RlcCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBkZXNpZ246IHRoaXMuZGVzaWduLFxuICAgICAgICBldmVudDogYXN5bmMgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQgPT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGVwcGVyR29OZXh0QXN5bmMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVWaWV3T2ZmZXJGaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS12aWV3LW9mZmVycycsXG4gICAgICBwcm9wczoge1xuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIHN0ZXBEYXRhOiBzdGVwLFxuICAgICAgICBlbnY6IHRoaXMuZW52LFxuICAgICAgICBhcHBNb2RlbDogdGhpcy5hcHBNb2RlbCxcbiAgICAgICAgbGFuZ0lzbzogdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgIGV2ZW50OiAoZXZlbnQ6IGFueSkgPT4gdGhpcy5vbk9mZmVyU2VsZWN0ZWQoZXZlbnQsIHN0ZXApXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlUGF1c2VGaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1maWVsZC1wYXVzZScsXG4gICAgICBwcm9wczoge1xuICAgICAgICBpZGVudGlmaWVyOiBzdGVwLmlkZW50aWZpZXIsXG4gICAgICAgIGNvbmZpZzogc3RlcC5jb25maWcsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGFwcE1vZGVsOiB0aGlzLmFwcE1vZGVsLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZU9wZW5CYW5raW5nRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgLy8gUGFzcyB0aGUgZnVsbCBzdGVwIGRhdGEgd2hpY2ggaW5jbHVkZXMgYWxsIHRyYW5zbGF0aW9uc1xuICAgIC8vIFRoZSBjb21wb25lbnQgd2lsbCBleHRyYWN0IHdoYXQgaXQgbmVlZHMgYmFzZWQgb24gY3VycmVudCBsYW5ndWFnZVxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LW9wZW4tYmFua2luZycsXG4gICAgICBwcm9wczoge1xuICAgICAgICBpZGVudGlmaWVyOiBzdGVwLmlkZW50aWZpZXIsXG4gICAgICAgIGNvbmZpZzogc3RlcC5jb25maWcsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsIC8vIFRoaXMgY29udGFpbnMgdGhlIGZ1bGwgdHJhbnNsYXRpb25zIGFycmF5XG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGFwcE1vZGVsOiB0aGlzLmFwcE1vZGVsLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgbGFiZWxzOiB7XG4gICAgICAgICAgaW5pdGlhbE1lc3NhZ2U6IFV0aWxzLmZpbmRUcmFuc2xhdGlvbihcbiAgICAgICAgICAgIHN0ZXAuY29uZmlnPy5pbml0aWFsTWVzc2FnZVRyYW5zbGF0aW9ucyB8fCBbXSxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKSxcbiAgICAgICAgICB3YWl0aW5nTWVzc2FnZTogVXRpbHMuZmluZFRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgc3RlcC5jb25maWc/LndhaXRpbmdNZXNzYWdlVHJhbnNsYXRpb25zIHx8IFtdLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApLFxuICAgICAgICAgIGNvbnNlbnRFcnJvck1lc3NhZ2U6IFV0aWxzLmZpbmRUcmFuc2xhdGlvbihcbiAgICAgICAgICAgIHN0ZXAuY29uZmlnPy5jb25zZW50RXJyb3JNZXNzYWdlVHJhbnNsYXRpb25zIHx8IFtdLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApLFxuICAgICAgICAgIGNvbXBsZXRpb25NZXNzYWdlOiBVdGlscy5maW5kVHJhbnNsYXRpb24oXG4gICAgICAgICAgICBzdGVwLmNvbmZpZz8uY29tcGxldGlvbk1lc3NhZ2VUcmFuc2xhdGlvbnMgfHwgW10sXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICksXG4gICAgICAgICAgcmV0cnlCdXR0b25MYWJlbDogVXRpbHMuZmluZFRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgc3RlcC5jb25maWc/LnJldHJ5QnV0dG9uTGFiZWxUcmFuc2xhdGlvbnMgfHwgW10sXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgIClcbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnQ6IChldmVudDogYW55KSA9PiB0aGlzLm9uT3BlbkJhbmtpbmdFdmVudChldmVudCwgc3RlcClcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVTdGF0dXNGaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1zdGF0dXMnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgY29uZmlnOiBzdGVwLmNvbmZpZyxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgYXBwSWQ6IHRoaXMuYXBwTW9kZWwuYXBwbGljYXRpb25VdWlkXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRm9ybWx5U3lzdGVtRmllbGRDb25maWcoXG4gICAgc3RlcDogU3RlcERhdGFcbiAgKTogRm9ybWx5RmllbGRDb25maWcgfCB1bmRlZmluZWQge1xuICAgIHN3aXRjaCAoc3RlcC50eXBlKSB7XG4gICAgICBjYXNlIEZsdXhUeXBlLkt5YzpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZUt5Y0ZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGbHV4VHlwZS5FbWFpbDpcbiAgICAgIGNhc2UgRmx1eFR5cGUuUGhvbmU6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlUGhvbmVFbWFpbEZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5BY3Rpb246IHtcbiAgICAgICAgLy8gQWN0aW9uIHN0ZXBzIGFyZSBub3cgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJ5IEFjdGlvblN0ZXBIYW5kbGVyXG4gICAgICAgIC8vIFRoZXkgc2hvdWxkIG5vdCBhcHBlYXIgYXMgdmlzaWJsZSBmb3JtbHkgY29tcG9uZW50c1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5JZFNjYW46IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlSWRTY2FuRmllbGRDb25maWcoc3RlcCk7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLkdlbmVyYXRlRG9jdW1lbnQ6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlR2VuZXJhdGVEb2NzRmllbGRDb25maWcoc3RlcCk7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLlNpZ246IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlU2lnbkZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5WaWV3T2ZmZXI6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlVmlld09mZmVyRmllbGRDb25maWcoc3RlcCk7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLlN0YXR1czoge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVTdGF0dXNGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuRVVQTEFURVNDOiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZUVucm9sbENhcmRGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuTkVUT1BJQToge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVFbnJvbGxDYXJkRmllbGRDb25maWcoc3RlcCk7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLlBhdXNlOiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZVBhdXNlRmllbGRDb25maWcoc3RlcCk7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLk9wZW5CYW5raW5nOiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZU9wZW5CYW5raW5nRmllbGRDb25maWcoc3RlcCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBvbk9mZmVyU2VsZWN0ZWQob2ZmZXJJZDogYW55LCBzdGVwOiBTdGVwRGF0YSkge1xuICAgIHRoaXMuZm9ybWx5VXBkYXRlQW5kR29OZXh0LmVtaXQoeyBzZWxlY3RlZE9mZmVySWQ6IG9mZmVySWQgfSk7XG4gIH1cblxuICBwcml2YXRlIG9uU2lnbkV2ZW50KGV2ZW50OiBhbnksIHN0ZXA6IFN0ZXBEYXRhKSB7XG4gICAgY29uc29sZS5sb2coJ1NpZ24gZXZlbnQgcmVjZWl2ZWQ6JywgZXZlbnQpO1xuICAgIHRoaXMudXBkYXRlU3RlcEJ1dHRvblN0YXRlKHN0ZXApO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk9wZW5CYW5raW5nRXZlbnQoZXZlbnQ6IGFueSwgc3RlcDogU3RlcERhdGEpIHtcbiAgICBjb25zb2xlLmxvZygnT3BlbkJhbmtpbmcgZXZlbnQgcmVjZWl2ZWQ6JywgZXZlbnQpO1xuICAgIGlmIChldmVudCA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAvLyBPcGVuIEJhbmtpbmcgZmxvdyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICB0aGlzLnVwZGF0ZVN0ZXBCdXR0b25TdGF0ZShzdGVwKTtcbiAgICAgIC8vIEF1dG8tcHJvY2VlZCB0byBuZXh0IHN0ZXBcbiAgICAgIHRoaXMuZm9ybWx5VXBkYXRlQW5kR29OZXh0LmVtaXQoe30pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25JZFNjYW5Db21wbGV0ZWQoZXZlbnQ6IGFueSwgc3RlcDogU3RlcERhdGEpIHtcbiAgICBjb25zb2xlLmxvZygnU2lnbiBldmVudCByZWNlaXZlZDonLCBldmVudCk7XG4gICAgY29uc3QgZmlsbERhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmZpbGxEYXRhKTtcbiAgICBjb25zdCBzdGVwRmlsbERhdGEgPSBmaWxsRGF0YS5mbHV4LmZpbmQoXG4gICAgICAoczogeyBzdGVwSWQ6IHN0cmluZyB9KSA9PiBzLnN0ZXBJZCA9PSBzdGVwLmlkZW50aWZpZXJcbiAgICApO1xuICAgIHN0ZXBGaWxsRGF0YS5zZWN0aW9ucy5mb3JFYWNoKFxuICAgICAgKHM6IHtcbiAgICAgICAgY29udHJvbHM6IHtcbiAgICAgICAgICBjb250cm9sSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBmaWxsVmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgfVtdO1xuICAgICAgfSkgPT4ge1xuICAgICAgICBzLmNvbnRyb2xzLmZvckVhY2goXG4gICAgICAgICAgKGM6IHtcbiAgICAgICAgICAgIGNvbnRyb2xJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgZmlsbFZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKGMuY29udHJvbElkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0ge1xuICAgICAgICAgICAgICAgIFtjLmNvbnRyb2xJZF06IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBjLmZpbGxWYWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtLmNvbnRhaW5zKGMuY29udHJvbElkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChjLmNvbnRyb2xJZCwgbmV3IEZvcm1Db250cm9sKGMuZmlsbFZhbHVlKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMudXBkYXRlU3RlcEJ1dHRvblN0YXRlKHN0ZXApO1xuICB9XG5cbiAgdXBkYXRlU3RlcEJ1dHRvblN0YXRlKHN0ZXA6IFN0ZXBEYXRhKSB7XG4gICAgbGV0IGZvcm1seVN0ZXBGaWVsZCA9IHRoaXMuZm9ybWx5Q29uZmlnWzBdLmZpZWxkR3JvdXA/LmZpbmQoKGZpZWxkKSA9PlxuICAgICAgZmllbGQuZmllbGRHcm91cD8uZmluZCgoZikgPT4gZi5wcm9wcz8uWydzdGVwSWQnXSA9PT0gc3RlcC5pZGVudGlmaWVyKVxuICAgICk7XG5cbiAgICBpZiAoIWZvcm1seVN0ZXBGaWVsZCkge1xuICAgICAgZm9ybWx5U3RlcEZpZWxkID0gdGhpcy5mb3JtbHlDb25maWdbMF0uZmllbGRHcm91cD8uZmluZChcbiAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5wcm9wcz8uWydzdGVwSWQnXSA9PT0gc3RlcC5pZGVudGlmaWVyXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChmb3JtbHlTdGVwRmllbGQpIHtcbiAgICAgIGZvcm1seVN0ZXBGaWVsZC5wcm9wcyA9IHtcbiAgICAgICAgLi4uZm9ybWx5U3RlcEZpZWxkLnByb3BzLFxuICAgICAgICBidXR0b25zRGlzYWJsZWQ6IGZhbHNlXG4gICAgICB9O1xuICAgICAgdGhpcy51cGRhdGVGb3JtbHlDb25maWcoKTtcbiAgICAgIHRoaXMuZm9ybWx5Q29uZmlnVXBkYXRlZC5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRSZW5kZXJlZENzcygpIHtcbiAgICBjb25zdCBzdHlsZVN0cmluZyA9IEZvcm1Dc3NIZWxwZXIuY29udmVydFRvU3R5bGVTdHJpbmcoXG4gICAgICB0aGlzLmRlc2lnbixcbiAgICAgIHRoaXMuc2hvd0Rpc3BsYXlNb2RlXG4gICAgKTtcblxuICAgIGNvbnN0IHN0eWxlRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZUVsZW1lbnQuaWQgPSAncmVuZGVyZWQtY3NzJztcbiAgICBjb25zdCByZW5kRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVuZGVyZWQtY3NzJyk7XG4gICAgaWYgKHJlbmRFbCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChkb2N1bWVudC5ib2R5LCByZW5kRWwpO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKFxuICAgICAgc3R5bGVFbGVtZW50LFxuICAgICAgdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KFV0aWxzLnJlbW92ZU5ld0xpbmVzKHN0eWxlU3RyaW5nKSlcbiAgICApO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuYm9keSwgc3R5bGVFbGVtZW50KTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkU2VjdGlvbnNGaWVsZEdyb3VwQXN5bmMoXG4gICAgc3RlcDogU3RlcERhdGEgfCB1bmRlZmluZWQsXG4gICAgc2VjdGlvbnM6IFNlY3Rpb25EYXRhW11cbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZ1tdPiB7XG4gICAgY29uc3Qgc3RlcFNlY3Rpb25zOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IHNlY3Rpb25zICYmIGluZGV4IDwgc2VjdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBzZWN0aW9uID0gc2VjdGlvbnNbaW5kZXhdO1xuICAgICAgbGV0IHNlcGFyYXRvckZvcm1seUNvbmZpZzogYW55ID0ge307XG4gICAgICBpZiAoc2VjdGlvbi5zaG93U2VjdGlvblRpdGxlKSB7XG4gICAgICAgIHNlcGFyYXRvckZvcm1seUNvbmZpZyA9IHtcbiAgICAgICAgICB0eXBlOiAnc2VwYXJhdG9yJyxcbiAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgdGl0bGU6XG4gICAgICAgICAgICAgIHNlY3Rpb24udHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgICAgICAgICAgICh0OiBhbnkpID0+IHQubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgICAgICk/LnZhbHVlID8/ICcnLFxuXG4gICAgICAgICAgICBkZXNpZ246IHRoaXMuZGVzaWduXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VjdGlvbi5zaG93U2VjdGlvblNlcGFyYXRvcikge1xuICAgICAgICBzZXBhcmF0b3JGb3JtbHlDb25maWcgPSB7XG4gICAgICAgICAgLi4uc2VwYXJhdG9yRm9ybWx5Q29uZmlnLFxuICAgICAgICAgIHR5cGU6ICdzZXBhcmF0b3InLFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAuLi5zZXBhcmF0b3JGb3JtbHlDb25maWcucHJvcHMsXG4gICAgICAgICAgICBzaG93U2VwYXJhdG9yOiBzZWN0aW9uLnNob3dTZWN0aW9uU2VwYXJhdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VjdGlvbi5kZXBlbmRlbnREaWN0aW9uYXJ5KSB7XG4gICAgICAgIHRoaXMuYXR0YWNoVG9EZXBlbmRlbnREaWN0aW9uYXJ5SWZOZWNlc3NhcnkoXG4gICAgICAgICAgc2VjdGlvbi5kZXBlbmRlbnREaWN0aW9uYXJ5LFxuICAgICAgICAgIHNlcGFyYXRvckZvcm1seUNvbmZpZ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc3RlcFNlY3Rpb25zLnB1c2goc2VwYXJhdG9yRm9ybWx5Q29uZmlnKTtcblxuICAgICAgY29uc3Qgc2VjdGlvbkZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7XG4gICAgICAgIHR5cGU6ICdjdXN0b20tc2VjdGlvbicsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgbGFiZWw6IHNlY3Rpb24udGl0bGUsXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICBzZWN0aW9uLnRyYW5zbGF0aW9ucz8uZmluZChcbiAgICAgICAgICAgICAgKHQ6IGFueSkgPT4gdC5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICAgICk/LnZhbHVlID8/ICcnLFxuICAgICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ25cbiAgICAgICAgfSxcbiAgICAgICAgZmllbGRHcm91cDogYXdhaXQgdGhpcy5idWlsZENvbnRyb2xzRmllbGRHcm91cEFzeW5jKFxuICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgc2VjdGlvbi5jb250cm9scyB8fCBbXSxcbiAgICAgICAgICBzZWN0aW9uLnByZXNlbnRhdGlvbkNvbnRyb2xzIHx8IFtdXG4gICAgICAgICksXG4gICAgICAgIGZpZWxkR3JvdXBDbGFzc05hbWU6ICdkaXNwbGF5LWZsZXgnXG4gICAgICB9O1xuICAgICAgaWYgKHNlY3Rpb24uZGVwZW5kZW50RGljdGlvbmFyeSkge1xuICAgICAgICB0aGlzLmF0dGFjaFRvRGVwZW5kZW50RGljdGlvbmFyeUlmTmVjZXNzYXJ5KFxuICAgICAgICAgIHNlY3Rpb24uZGVwZW5kZW50RGljdGlvbmFyeSxcbiAgICAgICAgICBzZWN0aW9uRm9ybWx5Q29uZmlnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHN0ZXBTZWN0aW9ucy5wdXNoKHNlY3Rpb25Gb3JtbHlDb25maWcpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGVwU2VjdGlvbnM7XG4gIH1cblxuICBhc3luYyBidWlkRGlzcGxheVN0ZXAoKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZz4ge1xuICAgIGxldCBzdGVwRm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZyA9IHt9O1xuICAgIGlmICh0aGlzLmRpc3BsYXk/LnNlY3Rpb25zPy5sZW5ndGggPiAwKSB7XG4gICAgICBzdGVwRm9ybWx5Q29uZmlnID0ge1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIC8vIGxhYmVsOiBzdGVwLm5hbWUsXG4gICAgICAgICAgLy8gYnV0dG9uczogdGhpcy5jb25zdHJ1Y3RCdXR0b25zKHN0ZXAuYnV0dG9ucyksXG4gICAgICAgICAgLy8gIGRlcGVuZGVudERpY3Rpb25hcnk6IHN0ZXAuZGVwZW5kZW50RGljdGlvbmFyeSxcbiAgICAgICAgfSxcbiAgICAgICAgZmllbGRHcm91cDogYXdhaXQgdGhpcy5idWlsZFNlY3Rpb25zRmllbGRHcm91cEFzeW5jKFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICB0aGlzLmRpc3BsYXkuc2VjdGlvbnNcbiAgICAgICAgKVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBGb3JtbHlDb25maWc7XG4gIH1cblxuICBhZGROZXdSb3dUb0Zvcm1GaWVsZHNJZk5lY2Vzc2FyeShcbiAgICBmaWVsZEdyb3VwOiBGb3JtbHlGaWVsZENvbmZpZ1tdLFxuICAgIG5ld1JvdzogRm9ybWx5RmllbGRDb25maWdcbiAgKSB7XG4gICAgaWYgKG5ld1Jvdy5maWVsZEdyb3VwICYmIG5ld1Jvdy5maWVsZEdyb3VwLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlRm9ybUZpZWxkc1dpZHRoKG5ld1Jvdy5maWVsZEdyb3VwKTtcbiAgICAgIGZpZWxkR3JvdXAucHVzaChuZXdSb3cpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGN1bGF0ZUZvcm1GaWVsZHNXaWR0aChmb3JtRmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdKSB7XG4gICAgY29uc3QgY29sV2lkdGhQZXJJdGVtID0gMTIgLyBmb3JtRmllbGRzLmxlbmd0aDtcbiAgICBmb3JtRmllbGRzLmZvckVhY2goKGYpID0+IHtcbiAgICAgIGYuY2xhc3NOYW1lID0gJ2NvbC0nICsgY29sV2lkdGhQZXJJdGVtO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0UGVyY2VudGFnZUNsYXNzTmFtZShwZXJjZW50YWdlRGltZW5zaW9uOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRvdGFsQ29sdW1ucyA9IDEyOyAvLyAxMi1jb2x1bW4gZ3JpZFxuICAgIGNvbnN0IHNwYW4gPSBNYXRoLnJvdW5kKChwZXJjZW50YWdlRGltZW5zaW9uIC8gMTAwKSAqIHRvdGFsQ29sdW1ucyk7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gYHBlcmNlbnRhZ2Utd2lkdGgtJHtzcGFufWA7XG5cbiAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNsYXNzTmFtZSkpIHtcbiAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHN0eWxlLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgc3R5bGUuaWQgPSBjbGFzc05hbWU7XG4gICAgICBzdHlsZS5pbm5lckhUTUwgPSBgXG4gICAgICAgIC4ke2NsYXNzTmFtZX0ge1xuICAgICAgICAgIGdyaWQtY29sdW1uOiBzcGFuICR7c3Bhbn07XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzTmFtZTtcbiAgfVxuXG4gIGNyZWF0ZUZpbGxlckNvbnRyb2woc3BhbjogbnVtYmVyKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAncm93LWZpbGxlcicsXG4gICAgICBjbGFzc05hbWU6IGBwZXJjZW50YWdlLXdpZHRoLSR7c3Bhbn1gLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgaGlkZTogdHJ1ZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkQ29udHJvbHNGaWVsZEdyb3VwQXN5bmMoXG4gICAgc3RlcDogU3RlcERhdGEgfCB1bmRlZmluZWQsXG4gICAgY29udHJvbHM6IENvbnRyb2xEYXRhW10sXG4gICAgcHJlc2VudGF0aW9uQ29udHJvbHM6IFByZXNlbnRhdGlvbkNvbnRyb2xbXVxuICApOiBQcm9taXNlPEZvcm1seUZpZWxkQ29uZmlnW10+IHtcbiAgICBjb25zdCByZXN1bHQ6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXTtcbiAgICBsZXQgcm93SXRlbXM6IChDb250cm9sRGF0YSB8IFByZXNlbnRhdGlvbkNvbnRyb2wpW10gPSBbXTtcbiAgICBjb250cm9scyA9IGNvbnRyb2xzLmZpbHRlcigoYykgPT4gIWMuaXNPbmx5Rm9yQ29uZmlnKTtcblxuICAgIC8vIEZpbHRlciBvdXQgY29udHJvbHMgdGhhdCBhcmUgaW5jb21wbGV0ZVxuICAgIGNvbnRyb2xzID0gY29udHJvbHMuZmlsdGVyKChjKSA9PiB7XG4gICAgICAvLyBTa2lwIGNvbnRyb2xzIHRoYXQgYXJlIG1pc3NpbmcgZXNzZW50aWFsIGRhdGFcbiAgICAgIGlmIChcbiAgICAgICAgYy50eXBlID09PSBTdGVwQ29udHJvbFR5cGUuRGljdGlvbmFyeSAmJlxuICAgICAgICAhYy5zcGVjaWZpY0NvbnRyb2xEYXRhPy5kaWN0aW9uYXJ5VVVJRFxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHByb2Nlc3NSb3cgPSBhc3luYyAoaXRlbXM6IChDb250cm9sRGF0YSB8IFByZXNlbnRhdGlvbkNvbnRyb2wpW10pID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xuICAgICAgY29uc3QgdG90YWwgPSAxMjtcbiAgICAgIGNvbnN0IGJ1aWx0OiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XG4gICAgICBjb25zdCBhdXRvOiB7XG4gICAgICAgIGM6IENvbnRyb2xEYXRhIHwgUHJlc2VudGF0aW9uQ29udHJvbDtcbiAgICAgICAgZjogRm9ybWx5RmllbGRDb25maWc7XG4gICAgICB9W10gPSBbXTtcbiAgICAgIGxldCB1c2VkID0gMDtcbiAgICAgIGZvciAoY29uc3QgaSBvZiBpdGVtcykge1xuICAgICAgICBpZiAoJ2NvbGxlY3Rpb25Db250cm9sSWRlbnRpZmllcicgaW4gaSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGJ1aWx0LnB1c2goXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmJ1aWxkUHJlc2VudGF0aW9uRm9ybUZpZWxkQXN5bmMoXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIGkgYXMgUHJlc2VudGF0aW9uQ29udHJvbFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoJ2FwaU1ldGhvZElkJyBpbiBpID09PSB0cnVlKSB7XG4gICAgICAgICAgYnVpbHQucHVzaChcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYnVpbGRBcGlNZXRob2RGb3JtRmllbGRBc3luYyhcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgaSBhcyBQcmVzZW50YXRpb25Db250cm9sXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWlsdC5wdXNoKGF3YWl0IHRoaXMuYnVpbGRGb3JtRmllbGRBc3luYyhzdGVwLCBpIGFzIENvbnRyb2xEYXRhKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IGl0ZW1zW2ldO1xuICAgICAgICBjb25zdCBmID0gYnVpbHRbaV07XG4gICAgICAgIGlmIChjLmRpbWVuc2lvblR5cGUgPT09IERpbWVuc2lvblR5cGUuUGVyY2VudGFnZSkge1xuICAgICAgICAgIGlmIChjLmF1dG9EaW1lbnNpb24pIHtcbiAgICAgICAgICAgIGF1dG8ucHVzaCh7IGMsIGYgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBNYXRoLnJvdW5kKChjLmRpbWVuc2lvbiAvIDEwMCkgKiB0b3RhbCk7XG4gICAgICAgICAgICB1c2VkICs9IHM7XG4gICAgICAgICAgICBjb25zdCBwZXJjZW50YWdlQ2xhc3MgPSB0aGlzLmdldFBlcmNlbnRhZ2VDbGFzc05hbWUoYy5kaW1lbnNpb24pO1xuICAgICAgICAgICAgZi5jbGFzc05hbWUgPSBgJHtmLmNsYXNzTmFtZX0gJHtwZXJjZW50YWdlQ2xhc3N9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYy5kaW1lbnNpb25UeXBlID09PSBEaW1lbnNpb25UeXBlLlBpeGVscykge1xuICAgICAgICAgIGNvbnN0IHMgPSBNYXRoLnJvdW5kKChjLmRpbWVuc2lvbiAvIHdpbmRvdy5pbm5lcldpZHRoKSAqIHRvdGFsKTtcbiAgICAgICAgICB1c2VkICs9IHM7XG4gICAgICAgICAgY29uc3QgcGVyY2VudGFnZUNsYXNzID0gdGhpcy5nZXRQZXJjZW50YWdlQ2xhc3NOYW1lKFxuICAgICAgICAgICAgKHMgLyB0b3RhbCkgKiAxMDBcbiAgICAgICAgICApO1xuICAgICAgICAgIGYuY2xhc3NOYW1lID0gYCR7Zi5jbGFzc05hbWV9ICR7cGVyY2VudGFnZUNsYXNzfWA7XG4gICAgICAgIH0gZWxzZSBpZiAoYy5hdXRvRGltZW5zaW9uKSB7XG4gICAgICAgICAgYXV0by5wdXNoKHsgYywgZiB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1c2VkICs9IDE7XG4gICAgICAgICAgY29uc3QgcGVyY2VudGFnZUNsYXNzID0gdGhpcy5nZXRQZXJjZW50YWdlQ2xhc3NOYW1lKFxuICAgICAgICAgICAgKDEgLyB0b3RhbCkgKiAxMDBcbiAgICAgICAgICApO1xuICAgICAgICAgIGYuY2xhc3NOYW1lID0gYCR7Zi5jbGFzc05hbWV9ICR7cGVyY2VudGFnZUNsYXNzfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbSA9IHRvdGFsIC0gdXNlZDtcbiAgICAgIGlmIChhdXRvLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgc2hhcmUgPSBNYXRoLm1heChNYXRoLmZsb29yKHJlbSAvIGF1dG8ubGVuZ3RoKSwgMSk7XG4gICAgICAgIGZvciAoY29uc3QgYSBvZiBhdXRvKSB7XG4gICAgICAgICAgY29uc3QgcGVyY2VudGFnZUNsYXNzID0gdGhpcy5nZXRQZXJjZW50YWdlQ2xhc3NOYW1lKFxuICAgICAgICAgICAgKHNoYXJlIC8gdG90YWwpICogMTAwXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhLmYuY2xhc3NOYW1lID0gYCR7YS5mLmNsYXNzTmFtZX0gJHtwZXJjZW50YWdlQ2xhc3N9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmllbGRzLnB1c2goLi4uYnVpbHQpO1xuICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICB9O1xuICAgIGZvciAoY29uc3QgYyBvZiBbLi4uY29udHJvbHMsIC4uLnByZXNlbnRhdGlvbkNvbnRyb2xzXSkge1xuICAgICAgaWYgKFxuICAgICAgICAoJ3R5cGUnIGluIGMgJiYgYy50eXBlID09PSBTdGVwQ29udHJvbFR5cGUuTmV3Um93KSB8fFxuICAgICAgICBjLnR5cGUgPT0gUHJlc2VudGF0aW9uQ29udHJvbFR5cGUuTmV3Um93XG4gICAgICApIHtcbiAgICAgICAgaWYgKHJvd0l0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXN1bHQucHVzaCguLi4oYXdhaXQgcHJvY2Vzc1Jvdyhyb3dJdGVtcykpKTtcbiAgICAgICAgICByb3dJdGVtcyA9IFtdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb3dJdGVtcy5wdXNoKGMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocm93SXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0LnB1c2goLi4uKGF3YWl0IHByb2Nlc3NSb3cocm93SXRlbXMpKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXRQaXhlbENsYXNzTmFtZShwaXhlbERpbWVuc2lvbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBgcGl4ZWwtd2lkdGgtJHtwaXhlbERpbWVuc2lvbn1gO1xuICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2xhc3NOYW1lKSkge1xuICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgc3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgICBzdHlsZS5pZCA9IGNsYXNzTmFtZTtcbiAgICAgIHN0eWxlLmlubmVySFRNTCA9IGBcbiAgICAgICAgLiR7Y2xhc3NOYW1lfSB7XG4gICAgICAgICAgd2lkdGg6ICR7cGl4ZWxEaW1lbnNpb259cHg7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzTmFtZTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkRm9ybUZpZWxkQXN5bmMoXG4gICAgc3RlcDogU3RlcERhdGEgfCB1bmRlZmluZWQsXG4gICAgY29udHJvbDogQ29udHJvbERhdGFcbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZz4ge1xuICAgIGxldCBpbml0aWFsVHlwZSA9ICdpbnB1dCc7IC8vIERlZmF1bHQgdHlwZVxuICAgIGxldCBjb21wb25lbnRTdHlsZUtleSA9IGAuY29tcG9uZW50LXRleHQtZmllbGRgOyAvLyBEZWZhdWx0IHN0eWxlIGZvciB0ZXh0IGlucHV0XG4gICAgY29uc3QgYmFzZVN0eWxlID0gdGhpcy5kZXNpZ25bYC5mb250LSR7aW5pdGlhbFR5cGV9YF0gfHwge307XG4gICAgY29uc3QgY29udHJvbFN0eWxlU3RyaW5nID1cbiAgICAgIHRoaXMuc3R5bGVPYmplY3RUb1N0cmluZ0V4Y2VwdEJhY2tncm91bmQoYmFzZVN0eWxlKTtcbiAgICBsZXQgcGF0dGVybiA9ICcnO1xuICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93ZWRDaGFyYWN0ZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXR0ZXJuID0gbmV3IFJlZ0V4cChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEuYWxsb3dlZENoYXJhY3RlcnMpXG4gICAgICAgICAgLnNvdXJjZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignaW5jb3JyZWN0IHJlZ2V4IHBhdHRlcm4nLCBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnRzVG9FeGNsdWRlRnJvbVN0eWxlID0gW1xuICAgICAgJy5jb21wb25lbnQtdGV4dC1maWVsZCcsXG4gICAgICAnLmNvbXBvbmVudC1jaGVja2JveCcsXG4gICAgICAnLmNvbXBvbmVudC1yYWRpbycsXG4gICAgICAnLmNvbXBvbmVudC1kYXRlJyxcbiAgICAgICcuY29tcG9uZW50LWRhdGEnXG4gICAgXTtcbiAgICBsZXQgZm9ybWx5Q29uZmlnID0gdGhpcy5nZXREZWZhdWx0Rm9ybWx5RmllbGRDb25maWcoXG4gICAgICBjb250cm9sLFxuICAgICAgaW5pdGlhbFR5cGUsXG4gICAgICBwYXR0ZXJuLFxuICAgICAgY29tcG9uZW50U3R5bGVLZXksXG4gICAgICBjb21wb25lbnRzVG9FeGNsdWRlRnJvbVN0eWxlXG4gICAgKTtcbiAgICAvL2NvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS50eXBlID09PSAzICBpcyBlbWFpbFxuICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LnR5cGUgPT09IDMpIHtcbiAgICAgIHRoaXMuYWRkVmFsaWRhdG9ycyhmb3JtbHlDb25maWcsIGNvbnRyb2wpO1xuICAgIH1cblxuICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmlzQXBpVmFsaWRhdGlvbikge1xuICAgICAgdGhpcy5hZGRBcGlWYWxpZGF0b3JzKGZvcm1seUNvbmZpZywgY29udHJvbCk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb250cm9sLnR5cGUpIHtcbiAgICAgIGNhc2UgU3RlcENvbnRyb2xUeXBlLk1hbnVhbElucHV0OiAvLyBUZXh0XG4gICAgICAgIHZhciBzdWJUeXBlID0gY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhXG4gICAgICAgICAgPy50eXBlIGFzIE1hbnVhbElucHV0Q29udHJvbFR5cGU7XG4gICAgICAgIHN3aXRjaCAoc3ViVHlwZSkge1xuICAgICAgICAgIGNhc2UgTWFudWFsSW5wdXRDb250cm9sVHlwZS5OdW1lcmljOlxuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnbnVtYmVyJztcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLkVtYWlsOlxuICAgICAgICAgIGNhc2UgTWFudWFsSW5wdXRDb250cm9sVHlwZS5UZXh0OlxuICAgICAgICAgIGNhc2UgTWFudWFsSW5wdXRDb250cm9sVHlwZS5QaG9uZTpcbiAgICAgICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2lucHV0JztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgTWFudWFsSW5wdXRDb250cm9sVHlwZS5UZXh0QXJlYTpcbiAgICAgICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2lucHV0JztcbiAgICAgICAgICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2F1dG9zaXplJ10gPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID0gJy5jb21wb25lbnQtdGV4dC1maWVsZCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE1hbnVhbElucHV0Q29udHJvbFR5cGUuRGF0ZVRpbWU6XG4gICAgICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdkYXRlcGlja2VyJztcbiAgICAgICAgICAgIGZvcm1seUNvbmZpZy5wcm9wcyA9IHtcbiAgICAgICAgICAgICAgcmVhZG9ubHk6IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb21wb25lbnRTdHlsZUtleSA9ICcuY29tcG9uZW50LWRhdGUnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2lucHV0JztcbiAgICAgICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID0gJy5jb21wb25lbnQtdGV4dC1maWVsZCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RlcENvbnRyb2xUeXBlLlBhcmFncmFwaDogLy8gUGFyYWdyYXBoXG4gICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2Zvcm1seS1wYXJhZ3JhcGgnO1xuICAgICAgICBjb21wb25lbnRTdHlsZUtleSA9ICcuY29tcG9uZW50LXRleHQtZmllbGQnO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWREZXNjcmlwdGlvbiA9XG4gICAgICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5kZXNjcmlwdGlvblRyYW5zbGF0aW9ucz8uZmluZChcbiAgICAgICAgICAgIChkOiB7IGxhbmd1YWdlSXNvOiBzdHJpbmcgfSkgPT5cbiAgICAgICAgICAgICAgZC5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApPy52YWx1ZSB8fCAnJztcbiAgICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IHRyYW5zbGF0ZWREZXNjcmlwdGlvbjtcblxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RlcENvbnRyb2xUeXBlLkNoZWNrQm94OiAvLyBDaGVja2JveFxuICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdmb3JtbHktY2hlY2tib3gnO1xuICAgICAgICBjb21wb25lbnRTdHlsZUtleSA9ICcuY29tcG9uZW50LWNoZWNrYm94JztcbiAgICAgICAgdmFyIGNoZWNrZWQgPSBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmNoZWNrZWQgPz8gZmFsc2U7XG4gICAgICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2NoZWNrZWQnXSA9IGNoZWNrZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuRGljdGlvbmFyeTogLy8gRGljdGlvbmFyeSAoZHJvcGRvd24pXG4gICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID1cbiAgICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEuc2hvd0FzUmFkaW9CdXR0b25zTGlzdCA9PT0gdHJ1ZVxuICAgICAgICAgICAgPyAnLmNvbXBvbmVudC1yYWRpbydcbiAgICAgICAgICAgIDogJy5jb21wb25lbnQtZGF0YSc7XG4gICAgICAgIGF3YWl0IHRoaXMuY29uc3RydWN0RGljdGlvbmFyeShjb250cm9sLCBmb3JtbHlDb25maWcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RlcENvbnRyb2xUeXBlLkJ1dHRvbnM6XG4gICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuRmx1eEluZm86XG4gICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuRG93bmxvYWREb2N1bWVudHM6XG4gICAgICAgIGZvcm1seUNvbmZpZyA9IHRoaXMuQ3JlYXRlRG93bmxvYWREb2NzRmllbGRDb25maWcoY29udHJvbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuVmlld0RvY3VtZW50czpcbiAgICAgICAgZm9ybWx5Q29uZmlnID0gdGhpcy5DcmVhdGVWaWV3RG9jc0ZpZWxkQ29uZmlnKGNvbnRyb2wpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RlcENvbnRyb2xUeXBlLlVwbG9hZERvY3VtZW50czpcbiAgICAgICAgZm9ybWx5Q29uZmlnID0gdGhpcy5DcmVhdGVVcGxvYWREb2NzRmllbGRDb25maWcoY29udHJvbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuTmV3Um93OiAvLyBOZXcgUm93XG4gICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnaW5wdXQnO1xuICAgICAgICBjb21wb25lbnRTdHlsZUtleSA9ICcuY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgIH1cbiAgICBmb3JtbHlDb25maWcuY2xhc3NOYW1lID0gY29tcG9uZW50U3R5bGVLZXkuc3Vic3RyaW5nKDEpO1xuXG4gICAgaWYgKCFjb21wb25lbnRzVG9FeGNsdWRlRnJvbVN0eWxlLmZpbmQoKGMpID0+IGMgPT09IGNvbXBvbmVudFN0eWxlS2V5KSkge1xuICAgICAgaWYgKHRoaXMuZGVzaWduW2NvbXBvbmVudFN0eWxlS2V5XSkge1xuICAgICAgICBmb3JtbHlDb25maWcucHJvcHMhLmF0dHJpYnV0ZXMhWydzdHlsZSddICs9XG4gICAgICAgICAgJzsnICtcbiAgICAgICAgICB0aGlzLnN0eWxlT2JqZWN0VG9TdHJpbmdFeGNlcHRCYWNrZ3JvdW5kKFxuICAgICAgICAgICAgdGhpcy5kZXNpZ25bY29tcG9uZW50U3R5bGVLZXldXG4gICAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgbGFiZWwgc3R5bGVzXG4gICAgICBjb25zdCBsYWJlbFN0eWxlS2V5ID0gYCR7Y29tcG9uZW50U3R5bGVLZXl9LWxhYmVsYDtcbiAgICAgIGlmICh0aGlzLmRlc2lnbltsYWJlbFN0eWxlS2V5XSkge1xuICAgICAgICBmb3JtbHlDb25maWcucHJvcHMhLmF0dHJpYnV0ZXMhWydzdHlsZSddICs9XG4gICAgICAgICAgJzsnICtcbiAgICAgICAgICB0aGlzLnN0eWxlT2JqZWN0VG9TdHJpbmdFeGNlcHRCYWNrZ3JvdW5kKFxuICAgICAgICAgICAgdGhpcy5kZXNpZ25bY29tcG9uZW50U3R5bGVLZXldXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbnRyb2wuZGVwZW5kZW50RGljdGlvbmFyeSkge1xuICAgICAgdGhpcy5hdHRhY2hUb0RlcGVuZGVudERpY3Rpb25hcnlJZk5lY2Vzc2FyeShcbiAgICAgICAgY29udHJvbC5kZXBlbmRlbnREaWN0aW9uYXJ5LFxuICAgICAgICBmb3JtbHlDb25maWdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IHRyYW5zbGF0ZWRUaXRsZSA9IGNvbnRyb2wudHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgKGQ6IHsgbGFuZ3VhZ2VJc286IHN0cmluZyB9KSA9PiBkLmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICk/LnZhbHVlO1xuICAgIGlmICghdHJhbnNsYXRlZFRpdGxlKSB7XG4gICAgICB0cmFuc2xhdGVkVGl0bGUgPSBjb250cm9sLnRpdGxlO1xuICAgIH1cbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydsYWJlbCddID0gdHJhbnNsYXRlZFRpdGxlO1xuXG4gICAgdGhpcy5mb3JtbHlDb2xsZWN0aW5nRmllbGRzLnB1c2goZm9ybWx5Q29uZmlnKTtcblxuICAgIHJldHVybiBmb3JtbHlDb25maWc7XG4gIH1cblxuICBhZGRWYWxpZGF0b3JzKGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcsIGNvbnRyb2w6IENvbnRyb2xEYXRhKSB7XG4gICAgdmFyIGVtYWlsRXJyb3JMYWJlbCA9IHRoaXMuZmx1eD8uZmluZChcbiAgICAgIChmKSA9PiBmPy5jb25maWc/LmNvbXBvbmVudENvbGxlY3RlZCA9PT0gY29udHJvbD8uaWRlbnRpZmllclxuICAgICk/LmNvbmZpZz8uZW1haWxFcnJvckxhYmVsO1xuICAgIHZhciBlbWFpbEVycm9yTGFiZWxWYWx1ZSA9ICcnO1xuICAgIGlmIChlbWFpbEVycm9yTGFiZWwgIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KGVtYWlsRXJyb3JMYWJlbCkpIHtcbiAgICAgIGVtYWlsRXJyb3JMYWJlbFZhbHVlID1cbiAgICAgICAgKGVtYWlsRXJyb3JMYWJlbCBhcyBMYWJlbEluZm9bXSkuZmluZChcbiAgICAgICAgICAobCkgPT4gbC5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKT8udmFsdWUgPz8gJyc7XG4gICAgfVxuXG4gICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRvcnMgPSB7XG4gICAgICBlbWFpbFZhbGlkOiB7XG4gICAgICAgIGV4cHJlc3Npb246IChjb250OiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbnQudmFsdWU7XG4gICAgICAgICAgY29uc3QgZW1haWxQYXR0ZXJuID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXFxcLlthLXpBLVpdezIsfSQnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodmFsdWUgJiYgIWVtYWlsUGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgY29udC5zZXRFcnJvcnMoeyBpbnZhbGlkRW1haWw6IHRydWUgfSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBtZXNzYWdlOiBlbWFpbEVycm9yTGFiZWxWYWx1ZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBhZGRBcGlWYWxpZGF0b3JzKGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcsIGNvbnRyb2w6IENvbnRyb2xEYXRhKSB7XG4gICAgY29uc3QgdGhyb3VnaEFwaVZhbGlkYXRpb24gPSBVdGlscy5maW5kRXJyb3JUcmFuc2xhdGlvblZhbHVlT3JEZWZhdWx0KFxuICAgICAgY29udHJvbC5lcnJvcnNUcmFuc2xhdGlvbnMsXG4gICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICd0aHJvdWdoQXBpVmFsaWRhdGlvbidcbiAgICApO1xuXG4gICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRvcnMgPSB7XG4gICAgICB2YWxpZGF0ZVRocm91Z2hBcGk6IHtcbiAgICAgICAgZXhwcmVzc2lvbjogYXN5bmMgKGNvbnQ6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgIGlmICghY29udC52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGFwaVZhbGlkYXRpb25NZXRob2QgPVxuICAgICAgICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhLmFwaVZhbGlkYXRpb25NZXRob2Q7XG5cbiAgICAgICAgICBjb25zdCBkYXRhUmVxdWVzdDogQXBpVmFsaWRhdGVSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICAgICAgYXBpTWV0aG9kSWQ6IGFwaVZhbGlkYXRpb25NZXRob2QsXG4gICAgICAgICAgICBjb250cm9sSWRlbnRpZmllcjogY29udHJvbC5pZGVudGlmaWVyXG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnZhbGlkYXRlTWV0aG9kQXBpKGRhdGFSZXF1ZXN0KTtcblxuICAgICAgICAgIGlmIChyZXNwb25zZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnQuc2V0RXJyb3JzKHsgdmFsaWRhdGVUaHJvdWdoQXBpOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIG1lc3NhZ2U6IHRocm91Z2hBcGlWYWxpZGF0aW9uXG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChmb3JtbHlDb25maWcudmFsaWRhdGlvbikge1xuICAgICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24ubWVzc2FnZXMgPSB7XG4gICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0aW9uLm1lc3NhZ2VzLFxuICAgICAgICB2YWxpZGF0ZVRocm91Z2hBcGk6IHRocm91Z2hBcGlWYWxpZGF0aW9uXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGdldERlZmF1bHRGb3JtbHlGaWVsZENvbmZpZyhcbiAgICBjb250cm9sOiBDb250cm9sRGF0YSxcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgcGF0dGVybjogc3RyaW5nLFxuICAgIGNvbXBvbmVudFN0eWxlS2V5OiBzdHJpbmcsXG4gICAgY29tcG9uZW50c1RvRXhjbHVkZUZyb21TdHlsZTogc3RyaW5nW11cbiAgKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZUlkID0gVXRpbHMuZmluZExhbmd1YWdlSWRCeUlzbyhcbiAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICApO1xuXG4gICAgbGV0IGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6IGNvbnRyb2wuaWRlbnRpZmllciB8fCBjb250cm9sLnRpdGxlLFxuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGN1cnJlbnRMYW5ndWFnZUlzbzogdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgIGN1cnJlbnRMYW5ndWFnZUlkOiBjdXJyZW50TGFuZ3VhZ2VJZCxcbiAgICAgICAgbGFiZWw6XG4gICAgICAgICAgY29udHJvbC50cmFuc2xhdGlvbnM/LmZpbmQoXG4gICAgICAgICAgICAodDogeyBsYW5ndWFnZUlzbzogc3RyaW5nIH0pID0+XG4gICAgICAgICAgICAgIHQubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKT8udmFsdWUgfHwgJycsXG5cbiAgICAgICAgdGl0bGU6XG4gICAgICAgICAgY29udHJvbC50cmFuc2xhdGlvbnM/LmZpbmQoXG4gICAgICAgICAgICAodDogeyBsYW5ndWFnZUlzbzogc3RyaW5nIH0pID0+XG4gICAgICAgICAgICAgIHQubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKT8udmFsdWUgfHwgJycsXG4gICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ24sXG4gICAgICAgIHJlcXVpcmVkOiBjb250cm9sLmlzTWFuZGF0b3J5LFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgc3R5bGU6IGNvbXBvbmVudHNUb0V4Y2x1ZGVGcm9tU3R5bGUuZmluZChcbiAgICAgICAgICAgIChjKSA9PiBjID09PSBjb21wb25lbnRTdHlsZUtleVxuICAgICAgICAgIClcbiAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgIDogY29tcG9uZW50U3R5bGVLZXlcbiAgICAgICAgfSxcbiAgICAgICAgYXV0b3NpemU6IHRydWUsXG4gICAgICAgIG9wdGlvbnM6IFt7fV0sXG4gICAgICAgIGZpZWxkR3JvdXA6IFtdLFxuICAgICAgICBhdXRvRGltZW5zaW9uOiBjb250cm9sLmF1dG9EaW1lbnNpb25cbiAgICAgIH0sXG4gICAgICBleHByZXNzaW9uczoge30sXG4gICAgICBob29rczoge30sXG4gICAgICB2YWxpZGF0b3JzOiB7fVxuICAgIH07XG4gICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24gPSB7fTtcblxuICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmlzTWFuZGF0b3J5ICYmIGZvcm1seUNvbmZpZy5wcm9wcykge1xuICAgICAgdmFyIHJlcXVpcmVkTWVzc2FnZSA9IFV0aWxzLmZpbmRFcnJvclRyYW5zbGF0aW9uVmFsdWVPckRlZmF1bHQoXG4gICAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgJ2lzTWFuZGF0b3J5VmFsaWRhdGlvbidcbiAgICAgICk7XG5cbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wcy5yZXF1aXJlZCA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNNYW5kYXRvcnk7XG4gICAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbi5tZXNzYWdlcyA9IHtcbiAgICAgICAgLi4uZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24/Lm1lc3NhZ2VzLFxuICAgICAgICByZXF1aXJlZDogcmVxdWlyZWRNZXNzYWdlXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNvbnRyb2wudHlwZSA9PT0gU3RlcENvbnRyb2xUeXBlLkRpY3Rpb25hcnkgJiZcbiAgICAgIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNNYW5kYXRvcnkgJiZcbiAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zICYmXG4gICAgICBmb3JtbHlDb25maWcucHJvcHNcbiAgICApIHtcbiAgICAgIHZhciByZXF1aXJlZE1lc3NhZ2UgPSBVdGlscy5maW5kRXJyb3JUcmFuc2xhdGlvblZhbHVlT3JEZWZhdWx0KFxuICAgICAgICBjb250cm9sLmVycm9yc1RyYW5zbGF0aW9ucyxcbiAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgICdpc01hbmRhdG9yeSdcbiAgICAgICk7XG5cbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wcy5yZXF1aXJlZCA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNNYW5kYXRvcnk7XG4gICAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbi5tZXNzYWdlcyA9IHtcbiAgICAgICAgLi4uZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24/Lm1lc3NhZ2VzLFxuICAgICAgICByZXF1aXJlZDogcmVxdWlyZWRNZXNzYWdlXG4gICAgICB9O1xuICAgIH1cblxuICAgIGxldCBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmlzU2ltcGxlVmFsaWRhdGlvbiAmJiBmb3JtbHlDb25maWcucHJvcHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc1NpbXBsZVZhbGlkYXRpb24gJiZcbiAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzXG4gICAgICApIHtcbiAgICAgICAgc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UgPSBVdGlscy5maW5kRXJyb3JUcmFuc2xhdGlvblZhbHVlT3JEZWZhdWx0KFxuICAgICAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICAgICdzaW1wbGVWYWxpZGF0aW9uJ1xuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/Lm1pblZhbHVlPy50b1N0cmluZygpKSB7XG4gICAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzLm1pbiA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS5taW5WYWx1ZTtcbiAgICAgICAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbi5tZXNzYWdlcyA9IHtcbiAgICAgICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0aW9uPy5tZXNzYWdlcyxcbiAgICAgICAgICAgIG1pbjogc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2VcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8ubWF4VmFsdWU/LnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICBmb3JtbHlDb25maWcucHJvcHMubWF4ID0gY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhLm1heFZhbHVlO1xuICAgICAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0aW9uLm1lc3NhZ2VzID0ge1xuICAgICAgICAgICAgLi4uZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24/Lm1lc3NhZ2VzLFxuICAgICAgICAgICAgbWF4OiBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcGF0dGVybiB2YWxpZGF0aW9uIGlmIGFsbG93ZWRDaGFyYWN0ZXJzIGlzIGRlZmluZWRcbiAgICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93ZWRDaGFyYWN0ZXJzKSB7XG4gICAgICAgIHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlID0gc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UgPVxuICAgICAgICAgIFV0aWxzLmZpbmRFcnJvclRyYW5zbGF0aW9uVmFsdWVPckRlZmF1bHQoXG4gICAgICAgICAgICBjb250cm9sLmVycm9yc1RyYW5zbGF0aW9ucyxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICAgICAgJ3NpbXBsZVZhbGlkYXRpb24nXG4gICAgICAgICAgKTtcblxuICAgICAgICBmb3JtbHlDb25maWcudmFsaWRhdG9ycyA9IHtcbiAgICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdG9ycyxcbiAgICAgICAgICBjdXN0b21QYXR0ZXJuOiB7XG4gICAgICAgICAgICBleHByZXNzaW9uOiAoYzogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghYy52YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZWdleC50ZXN0KGMudmFsdWUpO1xuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSB8fFxuICAgICAgICAgICAgICAnVmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIHJlcXVpcmVkIHBhdHRlcm4nXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0aW9uLm1lc3NhZ2VzID0ge1xuICAgICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0aW9uPy5tZXNzYWdlcyxcbiAgICAgICAgICBwYXR0ZXJuOiBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBtYXhMZW5ndGggdmFsaWRhdGlvbiBpZiBtYXhDaGFyYWN0ZXJzIGlzIGRlZmluZWRcbiAgICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/Lm1heENoYXJhY3RlcnMpIHtcbiAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzLm1heExlbmd0aCA9XG4gICAgICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5tYXhDaGFyYWN0ZXJzO1xuICAgICAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbi5tZXNzYWdlcyA9IHtcbiAgICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdGlvbj8ubWVzc2FnZXMsXG4gICAgICAgICAgbWF4TGVuZ3RoOiBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93T25seUZ1dHVyZSB8fFxuICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93T25seVBhc3RcbiAgICAgICkge1xuICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdkYXRlcGlja2VyJztcbiAgICAgICAgY29uc3QgY2hlY2tEYXRlVmFsaWRhdGlvbiA9IHtcbiAgICAgICAgICBjaGVja0RhdGU6IHtcbiAgICAgICAgICAgIGV4cHJlc3Npb246IChjOiBBYnN0cmFjdENvbnRyb2wsIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgICAgICBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgVXRpbHMuZmluZEVycm9yVHJhbnNsYXRpb25WYWx1ZU9yRGVmYXVsdChcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgICAgICAgICAgICAnc2ltcGxlVmFsaWRhdGlvbidcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgY3VycmVudERhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cbiAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uYWxsb3dPbmx5RnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjLnZhbHVlIHx8IGMudmFsdWUgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYy52YWx1ZSA+IGN1cnJlbnREYXRlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93T25seVBhc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWMudmFsdWUgfHwgYy52YWx1ZSA9PT0gJycpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjLnZhbHVlIDwgY3VycmVudERhdGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWVzc2FnZTogKGVycm9yOiBhbnksIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBmb3JtbHlDb25maWcudmFsaWRhdG9ycyA9IHtcbiAgICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdG9ycyxcbiAgICAgICAgICAuLi5jaGVja0RhdGVWYWxpZGF0aW9uXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9jb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEudHlwZSA9PT0gNCAgaXMgcGhvbmVcbiAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy50eXBlID09PSA0KSB7XG4gICAgICB2YXIgcGhvbmVFcnJvckxhYmVsID0gdGhpcy5mbHV4Py5maW5kKFxuICAgICAgICAoZikgPT4gZj8uY29uZmlnPy5jb21wb25lbnRDb2xsZWN0ZWQgPT09IGNvbnRyb2w/LmlkZW50aWZpZXJcbiAgICAgICk/LmNvbmZpZz8ucGhvbmVFcnJvckxhYmVsO1xuICAgICAgdmFyIHBob25lRXJyb3JMYWJlbFZhbHVlID0gJyc7XG4gICAgICBpZiAocGhvbmVFcnJvckxhYmVsICE9IG51bGwgJiYgQXJyYXkuaXNBcnJheShwaG9uZUVycm9yTGFiZWwpKSB7XG4gICAgICAgIHBob25lRXJyb3JMYWJlbFZhbHVlID1cbiAgICAgICAgICAocGhvbmVFcnJvckxhYmVsIGFzIExhYmVsSW5mb1tdKS5maW5kKFxuICAgICAgICAgICAgKGwpID0+IGwubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKT8udmFsdWUgPz8gJyc7XG4gICAgICB9XG5cbiAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0b3JzID0ge1xuICAgICAgICBwaG9uZVZhbGlkOiB7XG4gICAgICAgICAgZXhwcmVzc2lvbjogKGNvbnQ6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb250LnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgcGhvbmVQYXR0ZXJuID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgJ14oXFxcXCs0fCk/KDA3WzAtOF17MX1bMC05XXsxfXwwMlswLTldezJ9fDAzWzAtOV17Mn0pezF9PyhcXFxcc3xcXFxcLnwtKT8oWzAtOV17M30oXFxcXHN8XFxcXC58LXwpKXsyfSQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmICFwaG9uZVBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgY29udC5zZXRFcnJvcnMoeyBpbnZhbGlkUGhvbmVOdW1iZXI6IHRydWUgfSk7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVzc2FnZTogcGhvbmVFcnJvckxhYmVsVmFsdWVcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy50eXBlID09PSAyKSB7XG4gICAgICBjb25zdCBjaGVja0RhdGUyVmFsaWRhdGlvbiA9IHtcbiAgICAgICAgY2hlY2tEYXRlMjoge1xuICAgICAgICAgIGV4cHJlc3Npb246IChjOiBBYnN0cmFjdENvbnRyb2wsIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgICAgdmFyIGRhdGVWYWx1ZSA9IGMudmFsdWU7XG4gICAgICAgICAgICBpZiAoIWRhdGVWYWx1ZSAmJiBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmlzTWFuZGF0b3J5KSB7XG4gICAgICAgICAgICAgIHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlID1cbiAgICAgICAgICAgICAgICBVdGlscy5maW5kRXJyb3JUcmFuc2xhdGlvblZhbHVlT3JEZWZhdWx0KFxuICAgICAgICAgICAgICAgICAgY29udHJvbC5lcnJvcnNUcmFuc2xhdGlvbnMsXG4gICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgICAgICAgICAgICdpc01hbmRhdG9yeVZhbGlkYXRpb24nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBpc05hTihEYXRlLnBhcnNlKGRhdGVWYWx1ZSkpICYmXG4gICAgICAgICAgICAgIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNNYW5kYXRvcnlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lc3NhZ2U6IChlcnJvcjogYW55LCBmaWVsZDogRm9ybWx5RmllbGRDb25maWcpID0+IHtcbiAgICAgICAgICAgIGlmIChzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSA9PT0gJycpXG4gICAgICAgICAgICAgIHJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZSc7XG5cbiAgICAgICAgICAgIHJldHVybiBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBmb3JtbHlDb25maWcudmFsaWRhdG9ycyA9IHtcbiAgICAgICAgLi4uZm9ybWx5Q29uZmlnLnZhbGlkYXRvcnMsXG4gICAgICAgIC4uLmNoZWNrRGF0ZTJWYWxpZGF0aW9uXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtbHlDb25maWc7XG4gIH1cblxuICBhc3luYyBidWlsZFByZXNlbnRhdGlvbkZvcm1GaWVsZEFzeW5jKFxuICAgIHN0ZXA6IFN0ZXBEYXRhIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRyb2w6IFByZXNlbnRhdGlvbkNvbnRyb2xcbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZz4ge1xuICAgIGxldCBmb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnID0geyBwcm9wczoge30gfTtcblxuICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2Zvcm1seS1wYXJhZ3JhcGgnO1xuICAgIGZvcm1seUNvbmZpZy5jbGFzc05hbWUgPSAnY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2Rlc2lnbiddID0gdGhpcy5hcHBNb2RlbC5nZW5lcmF0ZWRDc3M7XG5cbiAgICB2YXIgdHJhbnNsYXRlZFRpdGxlID1cbiAgICAgIGNvbnRyb2wudHJhbnNsYXRpb25zLmZpbmQoKGQpID0+IGQubGFuZ3VhZ2VJc28gPT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28pXG4gICAgICAgID8udmFsdWUgPz9cbiAgICAgIGNvbnRyb2wudGl0bGUgPz9cbiAgICAgICcnO1xuXG4gICAgaWYgKGNvbnRyb2wudHlwZSA9PSBQcmVzZW50YXRpb25Db250cm9sVHlwZS5QYXJhZ3JhcGgpIHtcbiAgICAgIGNvbnN0IHBhcmFncmFwaENvbnRyb2wgPSBjb250cm9sIGFzIFByZXNlbnRhdGlvblBhcmFncmFwaENvbnRyb2w7XG5cbiAgICAgIHZhciB0cmFuc2xhdGVkRGVzY3JpcHRpb24gPVxuICAgICAgICBwYXJhZ3JhcGhDb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEuZGVzY3JpcHRpb25UcmFuc2xhdGlvbnMuZmluZChcbiAgICAgICAgICAoZDogYW55KSA9PiBkLmxhbmd1YWdlSXNvID09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk/LnZhbHVlID8/ICcnO1xuICAgICAgdmFyIHRyYW5zbGF0ZWRQYXJhZ3JhcGhUaXRsZSA9XG4gICAgICAgIHBhcmFncmFwaENvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS50ZXh0LmZpbmQoXG4gICAgICAgICAgKGQ6IGFueSkgPT4gZC5sYW5ndWFnZUlzbyA9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApPy52YWx1ZSA/PyAnJztcblxuICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IHRyYW5zbGF0ZWREZXNjcmlwdGlvbjtcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ3RyYW5zbGF0ZWREZXNjcmlwdGlvbiddID0gdHJhbnNsYXRlZERlc2NyaXB0aW9uO1xuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsndHJhbnNsYXRlZFBhcmFncmFwaFRpdGxlJ10gPVxuICAgICAgICB0cmFuc2xhdGVkUGFyYWdyYXBoVGl0bGU7XG4gICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdmb3JtbHktcGFyYWdyYXBoJztcbiAgICAgIGZvcm1seUNvbmZpZy5jbGFzc05hbWUgPSAnY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgIH0gZWxzZSBpZiAoY29udHJvbC50eXBlID09IFByZXNlbnRhdGlvbkNvbnRyb2xUeXBlLkRvd25sb2FkKSB7XG4gICAgICBmb3JtbHlDb25maWcgPSB0aGlzLkNyZWF0ZURvd25sb2FkRG9jc0ZpZWxkQ29uZmlnKGNvbnRyb2wpO1xuICAgIH0gZWxzZSBpZiAoY29udHJvbC50eXBlID09IFByZXNlbnRhdGlvbkNvbnRyb2xUeXBlLlZpZXcpIHtcbiAgICAgIGZvcm1seUNvbmZpZyA9IHRoaXMuQ3JlYXRlVmlld0RvY3NGaWVsZENvbmZpZyhjb250cm9sKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRyb2wudHlwZSA9PSBQcmVzZW50YXRpb25Db250cm9sVHlwZS5TdGF0dXMpIHtcbiAgICAgIGxldCBzdGF0dXNOYW1lID1cbiAgICAgICAgdGhpcy5hcHBNb2RlbC5zdGF0dXNlcy5maW5kKFxuICAgICAgICAgIChzKSA9PiBzLmlkID09PSB0aGlzLmZpbGxEYXRhPy5tZXRhZGF0YS5zdGF0dXNJZFxuICAgICAgICApPy5uYW1lIHx8ICdubyBzdGF0dXMgbmFtZSc7XG5cbiAgICAgIGZvcm1seUNvbmZpZy5kZWZhdWx0VmFsdWUgPSBzdGF0dXNOYW1lO1xuICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZm9ybWx5LXBhcmFncmFwaCc7XG4gICAgICBmb3JtbHlDb25maWcuY2xhc3NOYW1lID0gJ2NvbXBvbmVudC10ZXh0LWZpZWxkJztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKFxuICAgICAgICBjb250cm9sLnR5cGUgPT0gUHJlc2VudGF0aW9uQ29udHJvbFR5cGUuRmx1eENvbXBvbmVudCAmJlxuICAgICAgICB0aGlzLmNvbnRyb2xJZHNXaXRoVmFsdWVzICYmXG4gICAgICAgIGNvbnRyb2wuY29sbGVjdGlvbkNvbnRyb2xJZGVudGlmaWVyXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZmlsbFZhbHVlID1cbiAgICAgICAgICB0aGlzLmNvbnRyb2xJZHNXaXRoVmFsdWVzW2NvbnRyb2wuY29sbGVjdGlvbkNvbnRyb2xJZGVudGlmaWVyXTtcblxuICAgICAgICBpZiAoZmlsbFZhbHVlKSB7XG4gICAgICAgICAgc3dpdGNoICh0eXBlb2YgZmlsbFZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IGZpbGxWYWx1ZSA/ICcmY2hlY2s7JyA6ICcmY3Jvc3M7JztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgICAgICAvLyBFbnJpY2hlZCBpbmhlcml0ZWQgZGljdGlvbmFyeSBmb3JtYXQ6IGV4dHJhY3QgZmlsbFZhbHVlIGZvciBkaXNwbGF5XG4gICAgICAgICAgICAgIGlmIChmaWxsVmFsdWUuZmlsbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBmb3JtbHlDb25maWcuZGVmYXVsdFZhbHVlID0gZmlsbFZhbHVlLmZpbGxWYWx1ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxsVmFsdWUubmFtZSkge1xuICAgICAgICAgICAgICAgIGZvcm1seUNvbmZpZy5kZWZhdWx0VmFsdWUgPSBmaWxsVmFsdWUubmFtZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3JtbHlDb25maWcuZGVmYXVsdFZhbHVlID0gSlNPTi5zdHJpbmdpZnkoZmlsbFZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGZvcm1seUNvbmZpZy5kZWZhdWx0VmFsdWUgPSBmaWxsVmFsdWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVuc3VyZSB0eXBlIGlzIHNldCBmb3IgcHJlc2VudGF0aW9uIGNvbnRyb2xzXG4gICAgaWYgKCFmb3JtbHlDb25maWcudHlwZSkge1xuICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZm9ybWx5LXBhcmFncmFwaCc7XG4gICAgICBmb3JtbHlDb25maWcuY2xhc3NOYW1lID0gJ2NvbXBvbmVudC10ZXh0LWZpZWxkJztcbiAgICB9XG5cbiAgICBmb3JtbHlDb25maWcuaWQgPSBjb250cm9sLmlkZW50aWZpZXI7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnaXNEaXNwbGF5TW9kZSddID0gdHJ1ZTtcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydjb2xsZWN0aW9uQ29udHJvbElkZW50aWZpZXInXSA9XG4gICAgICBjb250cm9sLmNvbGxlY3Rpb25Db250cm9sSWRlbnRpZmllcjtcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydsYWJlbCddID0gdHJhbnNsYXRlZFRpdGxlO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2xhbmdJc28nXSA9IHRoaXMuY3VycmVudExhbmd1YWdlSXNvO1xuXG4gICAgdGhpcy5mb3JtbHlQcmVzZW50YXRpb25GaWVsZHMucHVzaChmb3JtbHlDb25maWcpO1xuXG4gICAgcmV0dXJuIGZvcm1seUNvbmZpZztcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkQXBpTWV0aG9kRm9ybUZpZWxkQXN5bmMoXG4gICAgc3RlcDogU3RlcERhdGEgfCB1bmRlZmluZWQsXG4gICAgY29udHJvbDogUHJlc2VudGF0aW9uQ29udHJvbFxuICApOiBQcm9taXNlPEZvcm1seUZpZWxkQ29uZmlnPiB7XG4gICAgbGV0IGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7IHByb3BzOiB7fSB9O1xuXG4gICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZm9ybWx5LXBhcmFncmFwaCc7XG4gICAgZm9ybWx5Q29uZmlnLmNsYXNzTmFtZSA9ICdjb21wb25lbnQtdGV4dC1maWVsZCc7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnZGVzaWduJ10gPSB0aGlzLmFwcE1vZGVsLmdlbmVyYXRlZENzcztcblxuICAgIHZhciB0cmFuc2xhdGVkVGl0bGUgPVxuICAgICAgY29udHJvbC50cmFuc2xhdGlvbnMuZmluZCgoZCkgPT4gZC5sYW5ndWFnZUlzbyA9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbylcbiAgICAgICAgPy52YWx1ZSA/P1xuICAgICAgY29udHJvbC50aXRsZSA/P1xuICAgICAgJyc7XG5cbiAgICBmb3JtbHlDb25maWcuaWQgPSBjb250cm9sLmlkZW50aWZpZXI7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnaXNEaXNwbGF5TW9kZSddID0gdHJ1ZTtcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydhcGlNZXRob2RJZCddID0gY29udHJvbC5hcGlNZXRob2RJZDtcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydhcGlNZXRob2RGaWVsZElkJ10gPSBjb250cm9sLmFwaU1ldGhvZEZpZWxkSWQ7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnbGFiZWwnXSA9IHRyYW5zbGF0ZWRUaXRsZTtcblxuICAgIGlmIChjb250cm9sLmFwaU1ldGhvZEZpZWxkSWQpIHtcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZmluZEluQXBpQ2FsbHNSZXNwb25zZXMoY29udHJvbC5hcGlNZXRob2RGaWVsZElkKTtcbiAgICAgIGZvcm1seUNvbmZpZy5kZWZhdWx0VmFsdWUgPSB2YWw7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtbHlQcmVzZW50YXRpb25GaWVsZHMucHVzaChmb3JtbHlDb25maWcpO1xuXG4gICAgcmV0dXJuIGZvcm1seUNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoVG9EZXBlbmRlbnREaWN0aW9uYXJ5SWZOZWNlc3NhcnkoXG4gICAgZGVwZW5kZW50RGljdGlvbmFyeTogRGVwZW5kZW50RGljdGlvbmFyeURhdGEsXG4gICAgZm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZ1xuICApIHtcbiAgICAvLyBIYW5kbGUgZGljdGlvbmFyeSBkZXBlbmRlbmNpZXNcbiAgICBpZiAoXG4gICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5ICYmXG4gICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5LmRpY3Rpb25hcnlDb250cm9sSWRlbnRpZmllclxuICAgICkge1xuICAgICAgY29uc3QgcGFyZW50S2V5ID0gZGVwZW5kZW50RGljdGlvbmFyeS5kaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI7XG4gICAgICBjb25zdCBkZXBlbmRlbnRWYWx1ZUlkcyA9IGRlcGVuZGVudERpY3Rpb25hcnkuZGVwZW5kZW50VmFsdWVJZHMgfHwgW107XG5cbiAgICAgIGZvcm1seUNvbmZpZy5leHByZXNzaW9ucyA9IHtcbiAgICAgICAgaGlkZTogKGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgIGNvbnN0IHNob3VsZFNob3cgPSB0aGlzLnNob3VsZFNob3dEZXBlbmRlbnRGaWVsZChcbiAgICAgICAgICAgIHBhcmVudEtleSxcbiAgICAgICAgICAgIGRlcGVuZGVudFZhbHVlSWRzLFxuICAgICAgICAgICAgdGhpcy5tb2RlbFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuICFzaG91bGRTaG93O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoVG9WYWx1ZUNoYW5nZXMoY29udHJvbElkOiBzdHJpbmcsIG9wdGlvbnM6IEZvcm1seUZpZWxkQ29uZmlnKSB7XG4gICAgb3B0aW9ucy5wcm9wcyFbJ29uU2VsZWN0ZWRWYWx1ZUNoYW5nZWQnXSA9IGFzeW5jICh2YWw6IGFueSkgPT4ge1xuICAgICAgdGhpcy5tb2RlbFtjb250cm9sSWRdID0gdmFsO1xuICAgICAgdmFyIHJlZmVyZW5jZURpY3Rpb25hcmllcyA9IEFycmF5LmZyb20oXG4gICAgICAgIHRoaXMuZGljdGlvbmFyeU1hcC52YWx1ZXMoKVxuICAgICAgKS5maWx0ZXIoKGQpID0+IGQucmVmZXJlbmNlSWQgPT0gdmFsLmRpY3Rpb25hcnlJZCk7XG4gICAgICBpZiAocmVmZXJlbmNlRGljdGlvbmFyaWVzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlUmVmZXJlbmNlRmllbGRzKG9wdGlvbnMpO1xuXG4gICAgICAgIHZhciByZWZlcmVuY2VEaWN0aW9uYXJpZXNXaXRoRmlsdGVyZWRWYWx1ZXMgPVxuICAgICAgICAgIHRoaXMuY3JlYXRlUmVmZXJlbmNlRGljdGlvbmFyaWVzRnJvbVNlbGVjdGVkVmFsdWUoXG4gICAgICAgICAgICByZWZlcmVuY2VEaWN0aW9uYXJpZXMsXG4gICAgICAgICAgICB2YWxcbiAgICAgICAgICApO1xuICAgICAgICBjb25zdCBwYXJlbnRTcGVjaWZpY0RhdGEgPSBvcHRpb25zLnByb3BzPy5bXG4gICAgICAgICAgJ3NwZWNpZmljRGF0YSdcbiAgICAgICAgXSBhcyBEaWN0aW9uYXJ5Q29udHJvbERhdGE7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRkUmVmZXJlbmNlRGljdGlvbmFyeUZpZWxkc0lmTmVjZXNzYXJ5KFxuICAgICAgICAgIHJlZmVyZW5jZURpY3Rpb25hcmllc1dpdGhGaWx0ZXJlZFZhbHVlcyxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIG9wdGlvbnMudHlwZSxcbiAgICAgICAgICBwYXJlbnRTcGVjaWZpY0RhdGE/LnJlbGF0ZWREaWN0aW9uYXJpZXNUcmFuc2xhdGlvbnMgfHwgW11cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlUmVmZXJlbmNlRmllbGRzKG9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVGb3JtbHlDb25maWcoKTtcbiAgICB9O1xuICB9XG5cbiAgY3JlYXRlUmVmZXJlbmNlRGljdGlvbmFyaWVzRnJvbVNlbGVjdGVkVmFsdWUoXG4gICAgYWxsRGljdGlvbmFyaWVzOiBEaWN0aW9uYXJ5RHRvW10sXG4gICAgc2VsZWN0ZWRWYWx1ZTogYW55XG4gICk6IERpY3Rpb25hcnlEdG9bXSB7XG4gICAgY29uc3QgbmV3RGljdGlvbmFyaWVzOiBEaWN0aW9uYXJ5RHRvW10gPSBbXTtcblxuICAgIGFsbERpY3Rpb25hcmllcy5mb3JFYWNoKChkaWN0aW9uYXJ5KSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJlZFZhbHVlcyA9XG4gICAgICAgIGRpY3Rpb25hcnkudmFsdWVzPy5maWx0ZXIoKHZhbHVlKSA9PlxuICAgICAgICAgIHZhbHVlLnJlZmVyZW5jZVZhbHVlcy5zb21lKFxuICAgICAgICAgICAgKHJlZlZhbHVlKSA9PiByZWZWYWx1ZS5pZCA9PT0gc2VsZWN0ZWRWYWx1ZS5pZFxuICAgICAgICAgIClcbiAgICAgICAgKSB8fCBbXTtcblxuICAgICAgaWYgKGZpbHRlcmVkVmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgbmV3RGljdGlvbmFyeTogRGljdGlvbmFyeUR0byA9IHtcbiAgICAgICAgICAuLi5kaWN0aW9uYXJ5LFxuICAgICAgICAgIHZhbHVlczogZmlsdGVyZWRWYWx1ZXNcbiAgICAgICAgfTtcblxuICAgICAgICBuZXdEaWN0aW9uYXJpZXMucHVzaChuZXdEaWN0aW9uYXJ5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBuZXdEaWN0aW9uYXJpZXM7XG4gIH1cblxuICBzaG91bGRTaG93RGVwZW5kZW50RmllbGQoXG4gICAgcGFyZW50S2V5OiBzdHJpbmcsXG4gICAgZGVwZW5kZW50VmFsdWVJZHM6IG51bWJlcltdLFxuICAgIG1vZGVsOiBhbnkgPSB7fVxuICApOiBib29sZWFuIHtcbiAgICAvLyBSZXRyaWV2ZSB0aGUgdmFsdWUgb2YgdGhlIHBhcmVudCBkaWN0aW9uYXJ5IGNvbnRyb2xcbiAgICBjb25zdCBwYXJlbnRWYWx1ZSA9IHRoaXMuZ2V0TmVzdGVkVmFsdWUoXG4gICAgICBtb2RlbCxcbiAgICAgIHBhcmVudEtleVxuICAgICkgYXMgRGljdGlvbmFyeVZhbHVlO1xuXG4gICAgY29uc3QgaWRWYWx1ZSA9IHBhcmVudFZhbHVlPy5pZFxuICAgICAgPyBwYXJlbnRWYWx1ZS5pZFxuICAgICAgOiAocGFyZW50VmFsdWUgYXMgdW5rbm93biBhcyBudW1iZXIpO1xuICAgIC8vIENoZWNrIGlmIHRoZSBwYXJlbnQgdmFsdWUgaXMgaW4gdGhlIGRlcGVuZGVudFZhbHVlSWRzXG4gICAgaWYgKHBhcmVudFZhbHVlICYmIGRlcGVuZGVudFZhbHVlSWRzLmluY2x1ZGVzKGlkVmFsdWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0TmVzdGVkVmFsdWUob2JqOiBhbnksIHBhdGg6IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICBsZXQgdmFsdWUgPSBvYmo7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgdmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgc3VibWl0KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdGb3JtIERhdGE6JywgdGhpcy5mb3JtLnZhbHVlKTtcbiAgICBpZiAodGhpcy5mb3JtLmludmFsaWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdGb3JtIGRhdGEgaGFzIHZhbGlkYXRpb24gZXJyb3JzLicpO1xuICAgICAgdGhpcy5zY3JvbGxUb0Vycm9yU2VydmljZS5zY3JvbGxUb0ZpcnN0RXJyb3IodGhpcy5mb3JtKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIG1ldGhvZCB0byB0cmlnZ2VyIHNjcm9sbCB0byBmaXJzdCBlcnJvciAtIGNhbiBiZSBjYWxsZWQgZnJvbSBvdGhlciBjb21wb25lbnRzXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsVG9GaXJzdFZhbGlkYXRpb25FcnJvcigpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbFRvRXJyb3JTZXJ2aWNlLnNjcm9sbFRvRmlyc3RFcnJvcih0aGlzLmZvcm0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBtZXRob2QgdG8gc2Nyb2xsIHRvIGEgc3BlY2lmaWMgZmllbGQgYnkgbmFtZVxuICAgKi9cbiAgcHVibGljIHNjcm9sbFRvRmllbGQoZmllbGROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbFRvRXJyb3JTZXJ2aWNlLnNjcm9sbFRvRmllbGQoZmllbGROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWJ1ZyBtZXRob2QgdG8gaGVscCB0cm91Ymxlc2hvb3Qgc2Nyb2xsIGlzc3Vlc1xuICAgKi9cbiAgcHVibGljIGRlYnVnRm9ybUVsZW1lbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsVG9FcnJvclNlcnZpY2UuZGVidWdMb2dGb3JtRWxlbWVudHMoKTtcbiAgfVxuXG4gIGFzeW5jIGNvbnN0cnVjdERpY3Rpb25hcnkoXG4gICAgY29udHJvbDogQ29udHJvbERhdGEsXG4gICAgb3B0aW9uczogRm9ybWx5RmllbGRDb25maWdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3BlY2lmaWNEYXRhID0gY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhO1xuXG4gICAgLy8gRGV0ZXJtaW5lIGNvbXBvbmVudCB0eXBlIGJhc2VkIG9uIHNldHRpbmdzXG4gICAgaWYgKHNwZWNpZmljRGF0YS5zaG93QXNDaGVja2JveGVzID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnR5cGUgPSAnZm9ybWx5LWNoZWNrYm94ZXMnO1xuICAgIH0gZWxzZSBpZiAoc3BlY2lmaWNEYXRhLnNob3dBc1JhZGlvQnV0dG9uc0xpc3QgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMudHlwZSA9ICdmb3JtbHktcmFkaW8nO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zLnR5cGUgPSAnZm9ybWx5LWRpY3Rpb25hcnktZHJvcGRvd24tdHJlZSc7XG4gICAgfVxuXG4gICAgb3B0aW9ucy5wcm9wcyFbJ3NwZWNpZmljRGF0YSddID0gc3BlY2lmaWNEYXRhO1xuXG4gICAgY29uc3QgZGljdGlvbmFyeVV1aWQgPSBzcGVjaWZpY0RhdGEuZGljdGlvbmFyeVVVSUQ7XG5cbiAgICBpZiAoZGljdGlvbmFyeVV1aWQpIHtcbiAgICAgIGNvbnN0IGRpY3Rpb25hcnkgPSB0aGlzLmRpY3Rpb25hcnlNYXAuZ2V0KGRpY3Rpb25hcnlVdWlkKTtcbiAgICAgIGlmIChkaWN0aW9uYXJ5KSB7XG4gICAgICAgIGlmIChkaWN0aW9uYXJ5LnJlZmVyZW5jZUlkKSB7XG4gICAgICAgICAgb3B0aW9ucy5wcm9wcyFbJ2RpY3Rpb25hcnlJZCddID0gZGljdGlvbmFyeVV1aWQ7XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3REaWN0aW9uYXJ5V2l0aFJlZmVyZW5jZXMoXG4gICAgICAgICAgICBkaWN0aW9uYXJ5LFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIHNwZWNpZmljRGF0YVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5hdHRhY2hUb1ZhbHVlQ2hhbmdlcyhjb250cm9sLmlkZW50aWZpZXIsIG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFR5cGUgaXMgYWxyZWFkeSBzZXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWV0aG9kXG4gICAgICAgICAgb3B0aW9ucy5wcm9wcyFbJ2RpY3Rpb25hcnlJZCddID0gZGljdGlvbmFyeVV1aWQ7XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3REaWN0aW9uYXJ5V2l0aFJlZmVyZW5jZXMoXG4gICAgICAgICAgICBkaWN0aW9uYXJ5LFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIHNwZWNpZmljRGF0YVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5hdHRhY2hUb1ZhbHVlQ2hhbmdlcyhjb250cm9sLmlkZW50aWZpZXIsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYERpY3Rpb25hcnkgbm90IGZvdW5kIGZvciBVVUlEICR7ZGljdGlvbmFyeVV1aWR9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFVVSUQgbm90IGZvdW5kIGZvciBkaWN0aW9uYXJ5IElEICR7c3BlY2lmaWNEYXRhLmRpY3Rpb25hcnlJZH1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmluZERpY3Rpb25hcnlWYWx1ZU9iamVjdChcbiAgICBkaWN0aW9uYXJ5OiBEaWN0aW9uYXJ5RHRvIHwgdW5kZWZpbmVkLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogRGljdGlvbmFyeVZhbHVlRHRvIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoXG4gICAgICAhZGljdGlvbmFyeSB8fFxuICAgICAgIWRpY3Rpb25hcnkudmFsdWVzIHx8XG4gICAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWU/LmlkICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBkaWN0aW9uYXJ5LnZhbHVlcy5maW5kKCh2KSA9PiB2LmlkID09PSB2YWx1ZS5pZCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHZhbHVlSWQgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKCFpc05hTih2YWx1ZUlkKSkge1xuICAgICAgICByZXR1cm4gZGljdGlvbmFyeS52YWx1ZXMuZmluZCgodikgPT4gdi5pZCA9PT0gdmFsdWVJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVSZWZlcmVuY2VGaWVsZHMoXG4gICAgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdLFxuICAgIHJvb3RDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnW10gPSB0aGlzLmZvcm1seUNvbmZpZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWZpZWxkcykgcmV0dXJuO1xuICAgIGNvbnN0IGZpZWxkc1RvUHJvY2VzcyA9IFsuLi5maWVsZHNdO1xuXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHNUb1Byb2Nlc3MpIHtcbiAgICAgIGNvbnN0IGZpZWxkS2V5ID0gZmllbGQua2V5IGFzIHN0cmluZztcbiAgICAgIGlmIChcbiAgICAgICAgZmllbGRLZXkgJiZcbiAgICAgICAgZmllbGQucHJvcHM/LlsnZGljdGlvbmFyeUlkJ10gJiZcbiAgICAgICAgZmllbGQucHJvcHM/Llsnc3BlY2lmaWNEYXRhJ11cbiAgICAgICkge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChmaWVsZEtleSk7XG4gICAgICAgIGNvbnN0IHNwZWNpZmljRGF0YSA9IGZpZWxkLnByb3BzW1xuICAgICAgICAgICdzcGVjaWZpY0RhdGEnXG4gICAgICAgIF0gYXMgRGljdGlvbmFyeUNvbnRyb2xEYXRhO1xuICAgICAgICBjb25zdCBkaWN0aW9uYXJ5VXVpZCA9IGZpZWxkLnByb3BzWydkaWN0aW9uYXJ5SWQnXSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IG1haW5EaWN0aW9uYXJ5ID0gdGhpcy5kaWN0aW9uYXJ5TWFwLmdldChkaWN0aW9uYXJ5VXVpZCk7XG5cbiAgICAgICAgbGV0IHZhbHVlVG9Vc2U6IGFueSA9IG51bGw7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC52YWx1ZSAhPT0gbnVsbCAmJiBjb250cm9sLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YWx1ZVRvVXNlID0gY29udHJvbC52YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBmaWVsZC5kZWZhdWx0VmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICBmaWVsZC5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB2YWx1ZVRvVXNlID0gZmllbGQuZGVmYXVsdFZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMubW9kZWwgJiZcbiAgICAgICAgICB0aGlzLm1vZGVsW2ZpZWxkS2V5XSAhPT0gbnVsbCAmJlxuICAgICAgICAgIHRoaXMubW9kZWxbZmllbGRLZXldICE9PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFsdWVUb1VzZSA9IHRoaXMubW9kZWxbZmllbGRLZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkVmFsdWVPYmplY3Q6IERpY3Rpb25hcnlWYWx1ZUR0byB8IHVuZGVmaW5lZCB8IG51bGwgPSBudWxsO1xuICAgICAgICBpZiAodmFsdWVUb1VzZSAhPT0gbnVsbCAmJiBtYWluRGljdGlvbmFyeT8uaWQgIT0gbnVsbCkge1xuICAgICAgICAgIHNlbGVjdGVkVmFsdWVPYmplY3QgPSB0aGlzLmZpbmREaWN0aW9uYXJ5VmFsdWVPYmplY3QoXG4gICAgICAgICAgICBtYWluRGljdGlvbmFyeSxcbiAgICAgICAgICAgIHZhbHVlVG9Vc2VcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmllbGRDb25maWdJblRyZWUgPSB0aGlzLmZpbmRGaWVsZEJ5S2V5KHJvb3RDb25maWcsIGZpZWxkS2V5KTtcbiAgICAgICAgaWYgKCFmaWVsZENvbmZpZ0luVHJlZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1vdmVSZWZlcmVuY2VGaWVsZHMoZmllbGRDb25maWdJblRyZWUpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBzZWxlY3RlZFZhbHVlT2JqZWN0ICYmXG4gICAgICAgICAgc2VsZWN0ZWRWYWx1ZU9iamVjdC5pZCAhPSBudWxsICYmXG4gICAgICAgICAgbWFpbkRpY3Rpb25hcnk/LmlkICE9IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcG90ZW50aWFsUmVmZXJlbmNlRGljdGlvbmFyaWVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeU1hcC52YWx1ZXMoKVxuICAgICAgICAgICkuZmlsdGVyKChkaWN0KSA9PiBkaWN0LnJlZmVyZW5jZUlkID09PSBtYWluRGljdGlvbmFyeS5pZCk7XG5cbiAgICAgICAgICBpZiAocG90ZW50aWFsUmVmZXJlbmNlRGljdGlvbmFyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZURpY3Rpb25hcmllc1RvU2hvdyA9XG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlUmVmZXJlbmNlRGljdGlvbmFyaWVzRnJvbVNlbGVjdGVkVmFsdWUoXG4gICAgICAgICAgICAgICAgcG90ZW50aWFsUmVmZXJlbmNlRGljdGlvbmFyaWVzLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVPYmplY3RcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHJlZmVyZW5jZURpY3Rpb25hcmllc1RvU2hvdy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkUmVmZXJlbmNlRGljdGlvbmFyeUZpZWxkc0lmTmVjZXNzYXJ5KFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZURpY3Rpb25hcmllc1RvU2hvdyxcbiAgICAgICAgICAgICAgICBmaWVsZENvbmZpZ0luVHJlZSxcbiAgICAgICAgICAgICAgICBmaWVsZENvbmZpZ0luVHJlZS50eXBlLFxuICAgICAgICAgICAgICAgIHNwZWNpZmljRGF0YT8ucmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9ucyB8fCBbXVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmllbGQuZmllbGRHcm91cCAmJiBmaWVsZC5maWVsZEdyb3VwLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUmVmZXJlbmNlRmllbGRzKGZpZWxkLmZpZWxkR3JvdXAsIHJvb3RDb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBmaWVsZHMgPT09IHRoaXMuZm9ybWx5Q29uZmlnIHx8XG4gICAgICBmaWVsZHMgPT09IHRoaXMuZm9ybWx5Q29uZmlnWzBdPy5maWVsZEdyb3VwXG4gICAgKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgICAgdGhpcy5mb3JtbHlDb25maWdVcGRhdGVkLmVtaXQoKTtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdERpY3Rpb25hcnlXaXRoUmVmZXJlbmNlcyhcbiAgICBkaWN0aW9uYXJ5OiBEaWN0aW9uYXJ5RHRvLFxuICAgIG9wdGlvbnM6IEZvcm1seUZpZWxkQ29uZmlnLFxuICAgIGRpY3Rpb25hcnlDb250cm9sRGF0YTogRGljdGlvbmFyeUNvbnRyb2xEYXRhXG4gICkge1xuICAgIGlmIChvcHRpb25zLnByb3BzKSB7XG4gICAgICB2YXIgY3VycmVudExhbmd1YWdlSWQgPSBVdGlscy5maW5kTGFuZ3VhZ2VJZEJ5SXNvKFxuICAgICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICk7XG5cbiAgICAgIC8vIFBhc3MgcHJlbG9hZGVkIGRpY3Rpb25hcnkgZGF0YSB0byBmb3JtbHkgY29tcG9uZW50XG4gICAgICBvcHRpb25zLnByb3BzWydkaWN0aW9uYXJ5RGF0YSddID0gZGljdGlvbmFyeTtcbiAgICAgIG9wdGlvbnMucHJvcHNbJ2xhbmd1YWdlcyddID0gdGhpcy5hdmFpbGFibGVMYW5ndWFnZXM7XG4gICAgICBvcHRpb25zLnByb3BzWydwcmVsb2FkZWREaWN0aW9uYXJpZXMnXSA9IHRoaXMuZGljdGlvbmFyeU1hcDtcbiAgICAgIG9wdGlvbnMucHJvcHNbJ3VzZVByZWxvYWRlZERhdGEnXSA9IHRydWU7XG5cbiAgICAgIG9wdGlvbnMucHJvcHMub3B0aW9ucyA9IGRpY3Rpb25hcnkudmFsdWVzPy5tYXAoKHZhbHVlKSA9PiAoe1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGxhYmVsOlxuICAgICAgICAgIFV0aWxzLmZpbmRWYWx1ZVRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgdmFsdWUudmFsdWVUcmFuc2xhdGlvbnMsXG4gICAgICAgICAgICBjdXJyZW50TGFuZ3VhZ2VJZFxuICAgICAgICAgICkgfHwgdmFsdWUubmFtZSxcbiAgICAgICAgY3VycmVudExhbmd1YWdlSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgcmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9uczpcbiAgICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbERhdGEucmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9uc1xuICAgICAgfSkpO1xuXG4gICAgICBvcHRpb25zLnByb3BzWydzZWxlY3RlZFJlbGF0ZWREaWN0aW9uYXJpZXMnXSA9XG4gICAgICAgIGRpY3Rpb25hcnlDb250cm9sRGF0YS5zZWxlY3RlZFJlbGF0ZWREaWN0aW9uYXJpZXMgfHwgW107XG4gICAgICBvcHRpb25zLnByb3BzWydhbGxvd011bHRpcGxlU2VsZWN0aW9uJ10gPVxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbERhdGEuYWxsb3dNdWx0aXBsZVNlbGVjdGlvbiB8fCBmYWxzZTtcblxuICAgICAgbGV0IGluaXRpYWxWYWx1ZU9iamVjdDogRGljdGlvbmFyeVZhbHVlIHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCBjb250cm9sS2V5ID0gb3B0aW9ucy5rZXkgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgZGljdGlvbmFyeURlZmF1bHRWYWx1ZUlkID1cbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xEYXRhLmRpY3Rpb25hcnlEZWZhdWx0VmFsdWVJZDtcbiAgICAgIGlmIChcbiAgICAgICAgISh0aGlzLm1vZGVsICYmIHRoaXMubW9kZWxbY29udHJvbEtleV0gIT0gbnVsbCkgJiZcbiAgICAgICAgZGljdGlvbmFyeURlZmF1bHRWYWx1ZUlkICE9IG51bGxcbiAgICAgICkge1xuICAgICAgICBpbml0aWFsVmFsdWVPYmplY3QgPSB0aGlzLmZpbmRBbmRNYXBEZWZhdWx0VmFsdWUoXG4gICAgICAgICAgZGljdGlvbmFyeSxcbiAgICAgICAgICBkaWN0aW9uYXJ5RGVmYXVsdFZhbHVlSWRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgb3B0aW9ucy5kZWZhdWx0VmFsdWUgPSBpbml0aWFsVmFsdWVPYmplY3Q7XG5cbiAgICAgIC8vIFBhc3MgZGVmYXVsdCB2YWx1ZSBJRCB0byBmb3JtbHkgY29tcG9uZW50XG4gICAgICBvcHRpb25zLnByb3BzWydkaWN0aW9uYXJ5RGVmYXVsdFZhbHVlSWQnXSA9IGRpY3Rpb25hcnlEZWZhdWx0VmFsdWVJZDtcblxuICAgICAgY29uc3QgY29udHJvbElkID0gb3B0aW9ucy5rZXk7XG4gICAgICBpZiAodGhpcy5maWxsRGF0YSAmJiB0aGlzLmZpbGxEYXRhLmZsdXgpIHtcbiAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHRoaXMuZmlsbERhdGEuZmx1eCkge1xuICAgICAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzdGVwLnNlY3Rpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gc2VjdGlvbi5jb250cm9scy5maW5kKFxuICAgICAgICAgICAgICAoY3RybDoge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xJZDogc3RyaW5nIHwgbnVtYmVyIHwgKHN0cmluZyB8IG51bWJlcilbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfSkgPT4gY3RybC5jb250cm9sSWQgPT09IGNvbnRyb2xJZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wuZmlsbFZhbHVlICYmIGNvbnRyb2wuZmlsbFZhbHVlLm5hbWUpIHtcbiAgICAgICAgICAgICAgb3B0aW9ucy5wcm9wc1sndmFsdWUnXSA9IGNvbnRyb2wuZmlsbFZhbHVlLm5hbWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICB9XG5cbiAgYXN5bmMgYWRkUmVmZXJlbmNlRGljdGlvbmFyeUZpZWxkc0lmTmVjZXNzYXJ5KFxuICAgIHJlZmVycmVuY2VkRGljdGlvbmFyaWVzOiBhbnlbXSxcbiAgICBwYXJlbnREaWN0aW9uYXJ5RmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnLFxuICAgIHR5cGU6IGFueSxcbiAgICByZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zOiBEaWN0aW9uYXJ5TGFiZWxJbmZvW11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHJlZmVycmVuY2VkRGljdGlvbmFyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUmVsYXRlZERpY3Rpb25hcmllcyA9XG4gICAgICAgIHBhcmVudERpY3Rpb25hcnlGaWVsZC5wcm9wcz8uWydzZWxlY3RlZFJlbGF0ZWREaWN0aW9uYXJpZXMnXSB8fCBbXTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWREaWN0aW9uYXJpZXMgPSByZWZlcnJlbmNlZERpY3Rpb25hcmllcy5maWx0ZXIoKGRpY3QpID0+XG4gICAgICAgIHNlbGVjdGVkUmVsYXRlZERpY3Rpb25hcmllcy5pbmNsdWRlcyhkaWN0LnV1aWQpXG4gICAgICApO1xuXG4gICAgICBzZWxlY3RlZERpY3Rpb25hcmllcy5mb3JFYWNoKChyZWZlcmVuY2VEaWN0aW9uYXJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZURpY3Rpb25hcnlVdWlkID0gcmVmZXJlbmNlRGljdGlvbmFyeS51dWlkO1xuXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudE9ubHlGb3JDb25maWcgPSB0aGlzLmZsdXhcbiAgICAgICAgICAuZmxhdE1hcCgocykgPT4gcy5zZWN0aW9ucylcbiAgICAgICAgICAuZmxhdE1hcCgoc2VjKSA9PiBzZWMuY29udHJvbHMpXG4gICAgICAgICAgLmZpbmQoXG4gICAgICAgICAgICAoY3RybCkgPT5cbiAgICAgICAgICAgICAgY3RybD8uc3BlY2lmaWNDb250cm9sRGF0YT8uZGljdGlvbmFyeVVVSUQgPT09XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlRGljdGlvbmFyeVV1aWQgJiYgY3RybD8uaXNPbmx5Rm9yQ29uZmlnID09PSB0cnVlXG4gICAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBuZXdGaWVsZEtleSA9XG4gICAgICAgICAgY29tcG9uZW50T25seUZvckNvbmZpZz8uaWRlbnRpZmllciA/P1xuICAgICAgICAgIGBleHRyYV8ke3JlZmVyZW5jZURpY3Rpb25hcnlVdWlkfWA7XG5cbiAgICAgICAgbGV0IHJlZmVyZW5jZURpY3Rpb25hcnlMYWJlbCA9IHJlZmVyZW5jZURpY3Rpb25hcnkubmFtZTtcblxuICAgICAgICBjb25zdCBzcGVjaWZpY1RyYW5zbGF0aW9uVmFsdWUgPSByZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zXG4gICAgICAgICAgLmZpbmQoKGQpID0+IGQuZGljdGlvbmFyeVVVSUQgPT0gcmVmZXJlbmNlRGljdGlvbmFyeVV1aWQpXG4gICAgICAgICAgPy50cmFuc2xhdGlvbnM/LmZpbmQoXG4gICAgICAgICAgICAodCkgPT4gdC5sYW5ndWFnZUlzbyA9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICk/LnZhbHVlO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBzcGVjaWZpY1RyYW5zbGF0aW9uVmFsdWUgJiZcbiAgICAgICAgICBzcGVjaWZpY1RyYW5zbGF0aW9uVmFsdWUudHJpbSgpICE9PSAnJ1xuICAgICAgICApIHtcbiAgICAgICAgICByZWZlcmVuY2VEaWN0aW9uYXJ5TGFiZWwgPSBzcGVjaWZpY1RyYW5zbGF0aW9uVmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVmZXJlbmNlRGljdGlvbmFyeUxhYmVsID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VycmVudExhbmd1YWdlSWQgPSBVdGlscy5maW5kTGFuZ3VhZ2VJZEJ5SXNvKFxuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbmV3RmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnID0ge1xuICAgICAgICAgIGtleTogbmV3RmllbGRLZXksXG4gICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgbGFiZWw6IHJlZmVyZW5jZURpY3Rpb25hcnlMYWJlbCxcbiAgICAgICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ24sXG4gICAgICAgICAgICBkaWN0aW9uYXJ5SWQ6IHJlZmVyZW5jZURpY3Rpb25hcnlVdWlkLFxuICAgICAgICAgICAgZGljdGlvbmFyeURhdGE6IHJlZmVyZW5jZURpY3Rpb25hcnksXG4gICAgICAgICAgICBsYW5ndWFnZXM6IHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgICAgICAgcHJlbG9hZGVkRGljdGlvbmFyaWVzOiB0aGlzLmRpY3Rpb25hcnlNYXAsXG4gICAgICAgICAgICB1c2VQcmVsb2FkZWREYXRhOiB0cnVlLFxuICAgICAgICAgICAgY3VycmVudExhbmd1YWdlSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgICAgIGN1cnJlbnRMYW5ndWFnZUlkOiBjdXJyZW50TGFuZ3VhZ2VJZCxcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICBzdHlsZTogdGhpcy5zdHlsZU9iamVjdFRvU3RyaW5nRXhjZXB0QmFja2dyb3VuZChcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2lnbltgLmZvbnQtbGlzdGBdIHx8IHt9XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcHRpb25zOiByZWZlcmVuY2VEaWN0aW9uYXJ5LnZhbHVlcz8ubWFwKCh2YWx1ZTogYW55KSA9PiAoe1xuICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgIGxhYmVsOlxuICAgICAgICAgICAgICAgIFV0aWxzLmZpbmRWYWx1ZVRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgICAgICAgdmFsdWUudmFsdWVUcmFuc2xhdGlvbnMsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50TGFuZ3VhZ2VJZFxuICAgICAgICAgICAgICAgICkgfHwgdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgY3VycmVudExhbmd1YWdlSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChyZWZlcmVuY2VEaWN0aW9uYXJ5LmRlZmF1bHRWYWx1ZUlkKSB7XG4gICAgICAgICAgY29uc3QgZGVmYXVsdFZhbCA9IHRoaXMuZmluZEFuZE1hcERlZmF1bHRWYWx1ZShcbiAgICAgICAgICAgIHJlZmVyZW5jZURpY3Rpb25hcnksXG4gICAgICAgICAgICByZWZlcmVuY2VEaWN0aW9uYXJ5LmRlZmF1bHRWYWx1ZUlkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZGVmYXVsdFZhbCkge1xuICAgICAgICAgICAgbmV3RmllbGQuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJlbnRGaWVsZEdyb3VwID0gcGFyZW50RGljdGlvbmFyeUZpZWxkLnBhcmVudFxuICAgICAgICAgID8gcGFyZW50RGljdGlvbmFyeUZpZWxkLnBhcmVudC5maWVsZEdyb3VwXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgICBpZiAocGFyZW50RmllbGRHcm91cCkge1xuICAgICAgICAgIGNvbnN0IHBhcmVudEluZGV4ID0gcGFyZW50RmllbGRHcm91cC5maW5kSW5kZXgoXG4gICAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLmtleSA9PT0gcGFyZW50RGljdGlvbmFyeUZpZWxkLmtleVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHBhcmVudEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSB0aGlzLmZpbmRMYXN0Q2hpbGRJbmRleChcbiAgICAgICAgICAgICAgcGFyZW50RmllbGRHcm91cCxcbiAgICAgICAgICAgICAgcGFyZW50SW5kZXhcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2VUb0FkZCA9IHRoaXMuZ2V0RXhpc3RpbmdQZXJjZW50YWdlKFxuICAgICAgICAgICAgICBwYXJlbnRGaWVsZEdyb3VwLFxuICAgICAgICAgICAgICBwYXJlbnRJbmRleFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG5ld0ZpZWxkLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICAgIHBlcmNlbnRhZ2VUb0FkZCA9PT0gMFxuICAgICAgICAgICAgICAgID8gcGFyZW50RGljdGlvbmFyeUZpZWxkLmNsYXNzTmFtZVxuICAgICAgICAgICAgICAgIDogdGhpcy5nZXRQZXJjZW50YWdlQ2xhc3NOYW1lKHBlcmNlbnRhZ2VUb0FkZCk7XG5cbiAgICAgICAgICAgIHBhcmVudEZpZWxkR3JvdXAuc3BsaWNlKGVuZEluZGV4ICsgMSwgMCwgbmV3RmllbGQpO1xuXG4gICAgICAgICAgICBjb25zdCBjbGFzc05hbWVUb0FkZCA9XG4gICAgICAgICAgICAgIHR5cGUgPT09ICdyYWRpbycgPyBgIGNvbXBvbmVudC1yYWRpb2AgOiBgIGNvbXBvbmVudC1kYXRhYDtcbiAgICAgICAgICAgIG5ld0ZpZWxkLmNsYXNzTmFtZSArPSBjbGFzc05hbWVUb0FkZDtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoVG9WYWx1ZUNoYW5nZXMobmV3RmllbGRLZXksIG5ld0ZpZWxkKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRFeGlzdGluZ1BlcmNlbnRhZ2UoZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdLCBpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgcGVyY2VudGFnZSA9IDA7XG4gICAgY29uc3QgZmllbGQgPSBmaWVsZHNbaW5kZXhdO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGZpZWxkLmNsYXNzTmFtZTtcbiAgICBpZiAoZmllbGQudHlwZT8udG9TdHJpbmcoKSAhPT0gU3RlcENvbnRyb2xUeXBlLk5ld1Jvdy50b1N0cmluZygpKSB7XG4gICAgICBpZiAoY2xhc3NOYW1lICYmIGNsYXNzTmFtZS5zdGFydHNXaXRoKCdwZXJjZW50YWdlLXdpZHRoLScpKSB7XG4gICAgICAgIHBlcmNlbnRhZ2UgPVxuICAgICAgICAgIChwYXJzZUludChjbGFzc05hbWUucmVwbGFjZSgncGVyY2VudGFnZS13aWR0aC0nLCAnJyksIDEwKSAqIDEwMCkgLyAxMjtcbiAgICAgIH0gZWxzZSBpZiAoY2xhc3NOYW1lICYmIGNsYXNzTmFtZS5zdGFydHNXaXRoKCdwaXhlbC13aWR0aC0nKSkge1xuICAgICAgICBjb25zdCBwaXhlbHMgPSBwYXJzZUludChjbGFzc05hbWUucmVwbGFjZSgncGl4ZWwtd2lkdGgtJywgJycpLCAxMCk7XG4gICAgICAgIHBlcmNlbnRhZ2UgPSAocGl4ZWxzIC8gMTAwMCkgKiAxMDA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwZXJjZW50YWdlO1xuICB9XG5cbiAgY2FsY3VsYXRlUmVtYWluaW5nUGVyY2VudGFnZUZvclJhbmdlKFxuICAgIGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSxcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgZW5kSW5kZXg6IG51bWJlclxuICApOiBudW1iZXIge1xuICAgIGxldCByZW1haW5pbmdQZXJjZW50YWdlID0gMTAwO1xuXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7IGkrKykge1xuICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRoaXMuZ2V0RXhpc3RpbmdQZXJjZW50YWdlKGZpZWxkcywgaSk7XG4gICAgICByZW1haW5pbmdQZXJjZW50YWdlIC09IHBlcmNlbnRhZ2U7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLm1heChyZW1haW5pbmdQZXJjZW50YWdlLCAwKTtcbiAgfVxuXG4gIHJlbW92ZVJlZmVyZW5jZUZpZWxkcyhjdXJyZW50Rm9ybWx5RmllbGRDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnKSB7XG4gICAgY29uc3QgcmVmZXJyZWRJbkRpY3Rpb25hcmllc1VVSWRzID1cbiAgICAgIGN1cnJlbnRGb3JtbHlGaWVsZENvbmZpZy5wcm9wcz8uWydkaWN0aW9uYXJ5RGF0YSddXG4gICAgICAgID8ucmVmZXJyZWRJbkRpY3Rpb25hcmllc1VVSWRzO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVmZXJyZWRJbkRpY3Rpb25hcmllc1VVSWRzKSkge1xuICAgICAgY29uc3QgcGFyZW50RmllbGRHcm91cCA9IGN1cnJlbnRGb3JtbHlGaWVsZENvbmZpZy5wYXJlbnRcbiAgICAgICAgPyBjdXJyZW50Rm9ybWx5RmllbGRDb25maWcucGFyZW50LmZpZWxkR3JvdXBcbiAgICAgICAgOiBudWxsO1xuICAgICAgaWYgKHBhcmVudEZpZWxkR3JvdXApIHtcbiAgICAgICAgY29uc3QgcGFyZW50SW5kZXggPSBwYXJlbnRGaWVsZEdyb3VwLmZpbmRJbmRleChcbiAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLmtleSA9PT0gY3VycmVudEZvcm1seUZpZWxkQ29uZmlnLmtleVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChwYXJlbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcmVmZXJyZWRJbkRpY3Rpb25hcmllc1VVSWRzKSB7XG4gICAgICAgICAgICBjb25zdCBpZFRvRmluZCA9ICdleHRyYV8nICsgaXRlbTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHBhcmVudEZpZWxkR3JvdXAubGVuZ3RoIC0gMTsgaSA+IHBhcmVudEluZGV4OyBpLS0pIHtcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudEZpZWxkS2V5ID0gcGFyZW50RmllbGRHcm91cFtpXS5rZXk/LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGRLZXkgJiYgY3VycmVudEZpZWxkS2V5ID09PSBpZFRvRmluZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJGb3JtQ29udHJvbFZhbHVlKGlkVG9GaW5kKTtcbiAgICAgICAgICAgICAgICBwYXJlbnRGaWVsZEdyb3VwLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFkZENoaWxkRGljdGlvbmFyeUZpZWxkKFxuICAgIGNoaWxkRGljdGlvbmFyeVV1aWQ6IHN0cmluZyxcbiAgICBwYXJlbnREaWN0aW9uYXJ5RmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnLFxuICAgIHR5cGU6IGFueSxcbiAgICByZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zOiBEaWN0aW9uYXJ5TGFiZWxJbmZvW11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGNoaWxkRGljdGlvbmFyeVV1aWQpIHtcbiAgICAgIGNvbnN0IGNoaWxkRGljdGlvbmFyeSA9IHRoaXMuZGljdGlvbmFyeU1hcC5nZXQoY2hpbGREaWN0aW9uYXJ5VXVpZCk7XG4gICAgICBpZiAoY2hpbGREaWN0aW9uYXJ5KSB7XG4gICAgICAgIGxldCBjaGlsZERpY3Rpb25hcnlMYWJlbCA9IGNoaWxkRGljdGlvbmFyeS5uYW1lO1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9XG4gICAgICAgICAgcmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9uc1xuICAgICAgICAgICAgLmZpbmQoKGQpID0+IGQuZGljdGlvbmFyeVVVSUQgPT0gY2hpbGREaWN0aW9uYXJ5VXVpZClcbiAgICAgICAgICAgID8udHJhbnNsYXRpb25zLmZpbmQoKHQpID0+IHQubGFuZ3VhZ2VJc28gPT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28pXG4gICAgICAgICAgICA/LnZhbHVlIHx8ICcnO1xuICAgICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgICBjaGlsZERpY3Rpb25hcnlMYWJlbCA9IHRyYW5zbGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0ZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZyA9IHtcbiAgICAgICAgICBrZXk6IGAke3BhcmVudERpY3Rpb25hcnlGaWVsZC5rZXl9X2NoaWxkXyR7Y2hpbGREaWN0aW9uYXJ5VXVpZH1gLFxuICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsOiBjaGlsZERpY3Rpb25hcnlMYWJlbCxcbiAgICAgICAgICAgIGRpY3Rpb25hcnlEYXRhOiBjaGlsZERpY3Rpb25hcnksXG4gICAgICAgICAgICBsYW5ndWFnZXM6IHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgICAgICAgcHJlbG9hZGVkRGljdGlvbmFyaWVzOiB0aGlzLmRpY3Rpb25hcnlNYXAsXG4gICAgICAgICAgICBvcHRpb25zOiBjaGlsZERpY3Rpb25hcnkudmFsdWVzPy5tYXAoKHZhbHVlKSA9PiAoe1xuICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUuaWQsXG4gICAgICAgICAgICAgIGxhYmVsOiB2YWx1ZS5uYW1lXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgc3R5bGU6IHRoaXMuc3R5bGVPYmplY3RUb1N0cmluZ0V4Y2VwdEJhY2tncm91bmQoXG4gICAgICAgICAgICAgICAgdGhpcy5kZXNpZ25bYC5mb250LWxpc3RgXSB8fCB7fVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBob29rczoge1xuICAgICAgICAgICAgb25Jbml0OiAoZmllbGQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAgICAgICAgICAgdGhpcy5maWVsZFVuc3Vic2NyaWJlU3ViamVjdHMucHVzaCh1bnN1YnNjcmliZSQpO1xuXG4gICAgICAgICAgICAgIGZpZWxkLmZvcm1Db250cm9sPy52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodW5zdWJzY3JpYmUkKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGFzeW5jIChzZWxlY3RlZFZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IGNoaWxkRGljdGlvbmFyeS52YWx1ZXM/LmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICh2YWwpID0+IHZhbC5pZCA9PT0gc2VsZWN0ZWRWYWx1ZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZE9wdGlvbiAmJiBzZWxlY3RlZE9wdGlvbi5jaGlsZERpY3Rpb25hcnlVVUlEKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkQ2hpbGREaWN0aW9uYXJ5RmllbGQoXG4gICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb24uY2hpbGREaWN0aW9uYXJ5VVVJRCxcbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWREaWN0aW9uYXJpZXNUcmFuc2xhdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2hpbGRGaWVsZHMoZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGZpZWxkLmhvb2tzIS5vbkRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICAgICAgICAgICAgICB1bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcGFyZW50RmllbGRHcm91cCA9IHBhcmVudERpY3Rpb25hcnlGaWVsZC5wYXJlbnRcbiAgICAgICAgICA/IHBhcmVudERpY3Rpb25hcnlGaWVsZC5wYXJlbnQuZmllbGRHcm91cFxuICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgaWYgKHBhcmVudEZpZWxkR3JvdXApIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnRJbmRleCA9IHBhcmVudEZpZWxkR3JvdXAuZmluZEluZGV4KFxuICAgICAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5rZXkgPT09IHBhcmVudERpY3Rpb25hcnlGaWVsZC5rZXlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwYXJlbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZEluZGV4ID0gdGhpcy5maW5kTGFzdENoaWxkSW5kZXgoXG4gICAgICAgICAgICAgIHBhcmVudEZpZWxkR3JvdXAsXG4gICAgICAgICAgICAgIHBhcmVudEluZGV4XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBwZXJjZW50YWdlVG9BZGQgPSB0aGlzLmdldEV4aXN0aW5nUGVyY2VudGFnZShcbiAgICAgICAgICAgICAgcGFyZW50RmllbGRHcm91cCxcbiAgICAgICAgICAgICAgcGFyZW50SW5kZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBuZXdGaWVsZC5jbGFzc05hbWUgPSB0aGlzLmdldFBlcmNlbnRhZ2VDbGFzc05hbWUocGVyY2VudGFnZVRvQWRkKTtcbiAgICAgICAgICAgIHBhcmVudEZpZWxkR3JvdXAuc3BsaWNlKGVuZEluZGV4ICsgMSwgMCwgbmV3RmllbGQpO1xuXG4gICAgICAgICAgICBjb25zdCBjbGFzc05hbWVUb0FkZCA9XG4gICAgICAgICAgICAgIHR5cGUgPT09ICdyYWRpbycgPyBgIGNvbXBvbmVudC1yYWRpb2AgOiBgIGNvbXBvbmVudC1kYXRhYDtcbiAgICAgICAgICAgIG5ld0ZpZWxkLmNsYXNzTmFtZSArPSBjbGFzc05hbWVUb0FkZDtcbiAgICAgICAgICAgIC8vdGhpcy5hdHRhY2hUb1ZhbHVlQ2hhbmdlcyhuZXdGaWVsZEtleSwgbmV3RmllbGQpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtbHlDb25maWcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgQ2hpbGQgZGljdGlvbmFyeSBub3QgZm91bmQgZm9yIFVVSUQgJHtjaGlsZERpY3Rpb25hcnlVdWlkfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkNvbXBsZXRpb24oKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ09yaWdpbiBmb3JtIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICB0aGlzLmNvbXBsZXRpb25FdmVudC5lbWl0KCk7XG4gIH1cblxuICBmaW5kTGFzdENoaWxkSW5kZXgoZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdLCBwYXJlbnRJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBwYXJlbnRLZXlQcmVmaXggPSBgJHtmaWVsZHNbcGFyZW50SW5kZXhdLmtleX1fYDtcbiAgICBsZXQgbGFzdEluZGV4ID0gcGFyZW50SW5kZXg7XG5cbiAgICBmb3IgKGxldCBpID0gcGFyZW50SW5kZXggKyAxOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZmllbGRzW2ldLmtleT8udG9TdHJpbmcoKS5zdGFydHNXaXRoKHBhcmVudEtleVByZWZpeCkpIHtcbiAgICAgICAgbGFzdEluZGV4ID0gaTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYXN0SW5kZXg7XG4gIH1cblxuICBmaW5kRmllbGRCeUtleShcbiAgICBmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10sXG4gICAga2V5OiBzdHJpbmdcbiAgKTogRm9ybWx5RmllbGRDb25maWcgfCBudWxsIHtcbiAgICBpZiAoIWZpZWxkcykgcmV0dXJuIG51bGw7XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnc3RlcHBlcicgJiYgZmllbGQuZmllbGRHcm91cCkge1xuICAgICAgICBjb25zdCBmb3VuZEluU3RlcHBlciA9IHRoaXMuZmluZEZpZWxkQnlLZXkoZmllbGQuZmllbGRHcm91cCwga2V5KTtcbiAgICAgICAgaWYgKGZvdW5kSW5TdGVwcGVyKSByZXR1cm4gZm91bmRJblN0ZXBwZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWVsZC5rZXkgPT09IGtleSkge1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQuZmllbGRHcm91cCkge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZmluZEZpZWxkQnlLZXkoZmllbGQuZmllbGRHcm91cCwga2V5KTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmVtb3ZlQ2hpbGRGaWVsZHMocGFyZW50RmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnKSB7XG4gICAgY29uc3QgcGFyZW50RmllbGRHcm91cCA9IHBhcmVudEZpZWxkLnBhcmVudFxuICAgICAgPyBwYXJlbnRGaWVsZC5wYXJlbnQuZmllbGRHcm91cFxuICAgICAgOiBudWxsO1xuXG4gICAgaWYgKHBhcmVudEZpZWxkR3JvdXApIHtcbiAgICAgIGNvbnN0IHBhcmVudEluZGV4ID0gcGFyZW50RmllbGRHcm91cC5maW5kSW5kZXgoXG4gICAgICAgIChmaWVsZCkgPT4gZmllbGQua2V5ID09PSBwYXJlbnRGaWVsZC5rZXlcbiAgICAgICk7XG5cbiAgICAgIGlmIChwYXJlbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgY29uc3QgcGFyZW50S2V5UHJlZml4ID0gYCR7cGFyZW50RmllbGQua2V5fV9jaGlsZF9gO1xuXG4gICAgICAgIC8vIFJlbW92ZSBvbmx5IHRoZSByZWxldmFudCBjaGlsZCBmaWVsZHNcbiAgICAgICAgZm9yIChsZXQgaSA9IHBhcmVudEZpZWxkR3JvdXAubGVuZ3RoIC0gMTsgaSA+IHBhcmVudEluZGV4OyBpLS0pIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50RmllbGRLZXkgPSBwYXJlbnRGaWVsZEdyb3VwW2ldLmtleT8udG9TdHJpbmcoKTtcbiAgICAgICAgICBpZiAoY3VycmVudEZpZWxkS2V5ICYmIGN1cnJlbnRGaWVsZEtleS5zdGFydHNXaXRoKHBhcmVudEtleVByZWZpeCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJGb3JtQ29udHJvbFZhbHVlKGN1cnJlbnRGaWVsZEtleSk7XG4gICAgICAgICAgICBwYXJlbnRGaWVsZEdyb3VwLnNwbGljZShpLCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTkVXOiBMb2FkIEFMTCBkaWN0aW9uYXJpZXMgbmVlZGVkIGZvciB0aGlzIGFwcCB1c2luZyB0aGUgbmV3IGFwcC1iYXNlZCBlbmRwb2ludFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkQWxsUmVxdWlyZWREaWN0aW9uYXJpZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFwcE1vZGVsPy5hcHBsaWNhdGlvblV1aWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gYXBwIFVVSUQgYXZhaWxhYmxlIGZvciBkaWN0aW9uYXJ5IGxvYWRpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmxvYWRBcHBEaWN0aW9uYXJpZXMoXG4gICAgICAgICAgdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICAgICAgRW52aXJvbm1lbnRUeXBlLkNvbmZpZ1xuICAgICAgICApXG4gICAgICApO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAn4p2MIEJhY2tlbmQgZmFpbGVkIHRvIGxvYWQgZGljdGlvbmFyaWVzOicsXG4gICAgICAgICAgcmVzcG9uc2UuZXJyb3JzXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2ltcGxlIGFzc2lnbm1lbnQgLSBBTEwgZGljdGlvbmFyaWVzIGFuZCBkZXBlbmRlbmNpZXMgYWxyZWFkeSBsb2FkZWQgYnkgYmFja2VuZFxuICAgICAgT2JqZWN0LmVudHJpZXMocmVzcG9uc2UuZGljdGlvbmFyaWVzKS5mb3JFYWNoKChbdXVpZCwgZGljdF0pID0+IHtcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5TWFwLnNldCh1dWlkLCBkaWN0KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIGxvYWQgYXBwIGRpY3Rpb25hcmllczonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJGb3JtQ29udHJvbFZhbHVlKGZpZWxkS2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBrZXlzID0gZmllbGRLZXkuc3BsaXQoJy4nKTtcbiAgICBsZXQgY29udHJvbCA9IHRoaXMuZm9ybTtcbiAgICBsZXQgbW9kZWwgPSB0aGlzLm1vZGVsO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29udHJvbCA9IGNvbnRyb2wuZ2V0KGtleXNbaV0pIGFzIEZvcm1Hcm91cDtcbiAgICAgIG1vZGVsID0gbW9kZWxba2V5c1tpXV07XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxLZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC5nZXQoZmluYWxLZXkpKSB7XG4gICAgICBjb250cm9sLnJlbW92ZUNvbnRyb2woZmluYWxLZXkpO1xuICAgIH1cblxuICAgIGlmIChtb2RlbCAmJiBtb2RlbFtmaW5hbEtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVsZXRlIG1vZGVsW2ZpbmFsS2V5XTtcbiAgICB9XG4gIH1cblxuICBmaW5kRmllbGQoXG4gICAgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdLFxuICAgIGtleTogc3RyaW5nXG4gICk6IEZvcm1seUZpZWxkQ29uZmlnIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZC5rZXkgPT09IGtleSkge1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQuZmllbGRHcm91cCkge1xuICAgICAgICBjb25zdCBuZXN0ZWRGaWVsZCA9IHRoaXMuZmluZEZpZWxkKGZpZWxkLmZpZWxkR3JvdXAsIGtleSk7XG4gICAgICAgIGlmIChuZXN0ZWRGaWVsZCkge1xuICAgICAgICAgIHJldHVybiBuZXN0ZWRGaWVsZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcG9wdWxhdGVNb2RlbFdpdGhGaWxsRGF0YShmaWxsRGF0YTogYW55KTogdm9pZCB7XG4gICAgaWYgKGZpbGxEYXRhKSB7XG4gICAgICBsZXQgYXV4TW9kZWwgPSBNb2RlbFBvcHVsYXRpb25IZWxwZXIucG9wdWxhdGVNb2RlbFdpdGhGaWxsRGF0YShcbiAgICAgICAgZmlsbERhdGEsXG4gICAgICAgIHRoaXMuZmx1eCxcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5TWFwLFxuICAgICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlc1xuICAgICAgKTtcbiAgICAgIHRoaXMubW9kZWwgPSB7IC4uLmF1eE1vZGVsIH07XG4gICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbmRBbmRNYXBEZWZhdWx0VmFsdWUoXG4gICAgZGljdGlvbmFyeTogRGljdGlvbmFyeUR0byB8IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWVJZDogbnVtYmVyXG4gICk6IERpY3Rpb25hcnlWYWx1ZSB8IG51bGwge1xuICAgIHJldHVybiBNb2RlbFBvcHVsYXRpb25IZWxwZXIuZmluZEFuZE1hcERlZmF1bHRWYWx1ZShcbiAgICAgIGRpY3Rpb25hcnksXG4gICAgICBkZWZhdWx0VmFsdWVJZCxcbiAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZUZvcm1seUNvbmZpZygpIHtcbiAgICB0aGlzLmZvcm1seUNvbmZpZyA9IFsuLi50aGlzLmZvcm1seUNvbmZpZ107XG4gIH1cblxuICBwcml2YXRlIHVuc3Vic2NyaWJlRnJvbUFsbEZpZWxkcygpIHtcbiAgICBmb3IgKGNvbnN0IHN1YmplY3Qgb2YgdGhpcy5maWVsZFVuc3Vic2NyaWJlU3ViamVjdHMpIHtcbiAgICAgIHN1YmplY3QubmV4dCgpO1xuICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgIH1cbiAgICB0aGlzLmZpZWxkVW5zdWJzY3JpYmVTdWJqZWN0cyA9IFtdO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnN1YnNjcmliZUZyb21BbGxGaWVsZHMoKTtcbiAgICBpZiAodGhpcy5jb2xsZWN0b3JIYW5kbGVyU3Vic2NyaXB0aW9ucykge1xuICAgICAgdGhpcy5jb2xsZWN0b3JIYW5kbGVyU3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5hY3Rpb25TdGVwU3Vic2NyaXB0aW9ucykge1xuICAgICAgdGhpcy5hY3Rpb25TdGVwU3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5hY3Rpb25TdGVwSGFuZGxlcikge1xuICAgICAgdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0QnV0dG9ucyhidXR0b25zQ29uZmlnOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoIWJ1dHRvbnNDb25maWcgfHwgYnV0dG9uc0NvbmZpZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1dHRvbnNDb25maWcubWFwKChidXR0b24pID0+ICh7XG4gICAgICB0eXBlOiBidXR0b24udmFsdWUudG9Mb3dlckNhc2UoKSxcbiAgICAgIGxhYmVsOiBidXR0b24udHJhbnNsYXRpb25zPy5bdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29dIHx8IGJ1dHRvbi52YWx1ZSxcbiAgICAgIHN0eWxlS2V5OiBgLmJ1dHRvbi0ke2J1dHRvbi52YWx1ZS50b0xvd2VyQ2FzZSgpfWBcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIHN0eWxlT2JqZWN0VG9TdHJpbmdFeGNlcHRCYWNrZ3JvdW5kKHN0eWxlT2JqOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhzdHlsZU9iailcbiAgICAgIC5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4ga2V5ICE9PSAnYmFja2dyb3VuZC1jb2xvcicpXG4gICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX06ICR7dmFsdWV9YClcbiAgICAgIC5qb2luKCc7ICcpO1xuICB9XG5cbiAgYXN5bmMgdmFsaWRhdGVNZXRob2RBcGkoZGF0YTogQXBpVmFsaWRhdGVSZXF1ZXN0KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGRhdGEuYXBpTWV0aG9kSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgYXBpUmVzcG9uc2UgPSBmcm9tKHRoaXMuYXBwbGljYXRpb25EYXRhU2VydmljZS52YWxpZGF0ZUFwaShkYXRhKSkucGlwZShcbiAgICAgIG1hcCgob2JzKSA9PiB7XG4gICAgICAgIHJldHVybiAhIW9icztcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbShhcGlSZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIG1ldGhvZCB0byBjbGVhciB0aGUgc2F2aW5nIGFmdGVyIGFjdGlvbnMgc3RhdGVcbiAgICogQ2FsbGVkIGJ5IHN0ZXBwZXIgY29tcG9uZW50IGFmdGVyIHNhdmVBcHBEYXRhU3RlcCBjb21wbGV0ZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhclNhdmluZ0FmdGVyQWN0aW9uc1N0YXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzU2F2aW5nQWZ0ZXJBY3Rpb25zKSB7XG4gICAgICB0aGlzLmlzU2F2aW5nQWZ0ZXJBY3Rpb25zID0gZmFsc2U7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG4gIGxvYWRpbmdNZXNzYWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbn1cbiIsIjxkaXYgKm5nSWY9XCJpc0xvYWRpbmdcIiBjbGFzcz1cImxvYWRpbmctb3ZlcmxheVwiPlxuICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cbjwvZGl2PlxuPGRpdiBbaGlkZGVuXT1cImlzTG9hZGluZ1wiPlxuICA8ZGl2ICpuZ0lmPVwic2hvd0xhbmd1YWdlU2VsZWN0b3JcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwicmlnaHQtYWxpZ25lZFwiPlxuICAgIDxidXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImZsYWdzXCIgbWF0LWljb24tYnV0dG9uIGNsYXNzPVwibS1yLTVcIj5cbiAgICAgIDxpbWdcbiAgICAgICAgW3NyY109XCJyZXR1cm5GTGFnKGN1cnJlbnRMYW5ndWFnZUlzbylcIlxuICAgICAgICBjbGFzcz1cInJvdW5kZWQtY2lyY2xlIG9iamVjdC1jb3ZlciBpY29uLTIwXCJcbiAgICAgIC8+XG4gICAgPC9idXR0b24+XG4gICAgPG1hdC1tZW51ICNmbGFncz1cIm1hdE1lbnVcIiBjbGFzcz1cImNhcmRXaXRoU2hhZG93XCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgKm5nRm9yPVwibGV0IGxhbmcgb2YgYXBwbGljYXRpb25MYW5ndWFnZXMoKVwiXG4gICAgICAgIChjbGljayk9XCJjaGFuZ2VMYW5ndWFnZShsYW5nLmlzbylcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgIFtzcmNdPVwicmV0dXJuRkxhZyhsYW5nLmlzbylcIlxuICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLWNpcmNsZSBvYmplY3QtY292ZXIgaWNvbi0yMFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1zdWJ0aXRsZS0xIGYtcy0xNFwiPnt7IGxhbmcubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L21hdC1tZW51PlxuICA8L2Rpdj5cblxuICA8YnIgLz5cbiAgPGRpdiBjbGFzcz1cImZvcm0tY29udGFpbmVyXCI+XG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKG5nU3VibWl0KT1cInN1Ym1pdCgpXCI+XG4gICAgICA8Zm9ybWx5LWZvcm1cbiAgICAgICAgW21vZGVsXT1cIm1vZGVsXCJcbiAgICAgICAgW2ZpZWxkc109XCJmb3JtbHlDb25maWdcIlxuICAgICAgICBbb3B0aW9uc109XCJvcHRpb25zXCJcbiAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgICA+PC9mb3JtbHktZm9ybT5cbiAgICA8L2Zvcm0+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=