@qbs-origin/origin-form 0.8.2 → 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;
@@ -378,7 +378,7 @@ export class CollectorFormComponent {
378
378
  .map((control) => ({
379
379
  controlId: control.controlId,
380
380
  fillValue: control.fillValue,
381
- fillValueId: control.fillValueId,
381
+ fillValueId: control.fillValueId
382
382
  }))))
383
383
  .reduce((dictionary, { controlId, fillValue, fillValueId }) => {
384
384
  if (fillValueId) {
@@ -436,6 +436,51 @@ export class CollectorFormComponent {
436
436
  if (initFlowValues !== null && initFlowValues !== undefined) {
437
437
  addInitFlowValues(initFlowValues, []);
438
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
+ }
439
484
  this.controlIdsWithValues = controlIdsWithValues;
440
485
  }
441
486
  getCurrentLanguageId() {
@@ -454,7 +499,7 @@ export class CollectorFormComponent {
454
499
  showProgressBar: this.generalData.showProgressBar &&
455
500
  this.generalData.showAllSteps == false
456
501
  ? true
457
- : false,
502
+ : false
458
503
  };
459
504
  this.formlyAllSteps = await this.buildFormlyFieldGroupAsync();
460
505
  var hasDictionaryDependentSteps = this.formlyAllSteps.some((f) => f.props?.['dependentDictionary']?.isDictionaryDependent);
@@ -481,7 +526,7 @@ export class CollectorFormComponent {
481
526
  display: this.display,
482
527
  designConfig: {
483
528
  buttonsVerticalPosition: this.appModel.design.buttonsVerticalPosition,
484
- buttonsHorizontalPosition: this.appModel.design.buttonsHorizontalPosition,
529
+ buttonsHorizontalPosition: this.appModel.design.buttonsHorizontalPosition
485
530
  },
486
531
  stepsSettings: this.stepsSettings,
487
532
  metaData: this.fillData?.metadata,
@@ -494,10 +539,10 @@ export class CollectorFormComponent {
494
539
  hasActionSteps: this.flux.some((step) => this.actionStepHandler.isActionStep(step)), // Indicate if there are action steps
495
540
  completionEvent: () => this.onCompletion(),
496
541
  onSelectedPageChanging: (index) => this.onSelectedPageChanging(index),
497
- onSelectedPageChanged: (index) => this.onSelectedPageChanged(index),
542
+ onSelectedPageChanged: (index) => this.onSelectedPageChanged(index)
498
543
  },
499
- fieldGroup: formlyFilteredSteps,
500
- },
544
+ fieldGroup: formlyFilteredSteps
545
+ }
501
546
  ];
502
547
  // For display mode, populate values immediately after config is built
503
548
  if (this.showDisplayMode && this.formlyConfig[0]?.fieldGroup) {
@@ -522,7 +567,8 @@ export class CollectorFormComponent {
522
567
  let actionsExecuted = false;
523
568
  if (toIndex > fromIndex) {
524
569
  console.log('➡️ Moving forward - executing action steps after current step');
525
- actionsExecuted = await this.executeActionStepsAfterCurrentStep(fromIndex);
570
+ actionsExecuted =
571
+ await this.executeActionStepsAfterCurrentStep(fromIndex);
526
572
  }
527
573
  else if (toIndex < fromIndex) {
528
574
  console.log('⬅️ Moving backward - no action execution needed');
@@ -644,11 +690,15 @@ export class CollectorFormComponent {
644
690
  // Multiple selection - show values with comma
645
691
  const valueIdsArray = found.fillValueIds || found.fillvalueids || found.FillValueIds;
646
692
  const valuesArray = found.fillValues || found.fillvalues || found.FillValues;
647
- if (valueIdsArray && Array.isArray(valueIdsArray) && valueIdsArray.length > 0) {
693
+ if (valueIdsArray &&
694
+ Array.isArray(valueIdsArray) &&
695
+ valueIdsArray.length > 0) {
648
696
  const currentLanguageId = this.getCurrentLanguageId();
649
697
  const displayValues = [];
650
698
  for (const valueId of valueIdsArray) {
651
- const numericValueId = typeof valueId === 'string' ? parseInt(valueId, 10) : valueId;
699
+ const numericValueId = typeof valueId === 'string'
700
+ ? parseInt(valueId, 10)
701
+ : valueId;
652
702
  for (const [key, dict] of this.dictionaryMap.entries()) {
653
703
  const value = dict.values?.find((v) => v.id === numericValueId);
654
704
  if (value) {
@@ -662,7 +712,9 @@ export class CollectorFormComponent {
662
712
  fg.defaultValue = displayValues.join(', ');
663
713
  }
664
714
  }
665
- else if (valuesArray && Array.isArray(valuesArray) && valuesArray.length > 0) {
715
+ else if (valuesArray &&
716
+ Array.isArray(valuesArray) &&
717
+ valuesArray.length > 0) {
666
718
  // Fallback: use fillValues array directly
667
719
  fg.defaultValue = valuesArray.join(', ');
668
720
  }
@@ -685,8 +737,13 @@ export class CollectorFormComponent {
685
737
  }
686
738
  else {
687
739
  // Check controlIdsWithValues for initFlowValues
688
- const initFlowValue = this.controlIdsWithValues?.[associatedControlId];
740
+ let initFlowValue = this.controlIdsWithValues?.[associatedControlId];
689
741
  if (initFlowValue !== undefined) {
742
+ if (typeof initFlowValue === 'object' &&
743
+ initFlowValue !== null &&
744
+ initFlowValue.fillValue !== undefined) {
745
+ initFlowValue = initFlowValue.fillValue;
746
+ }
690
747
  fg.defaultValue = initFlowValue;
691
748
  }
692
749
  else {
@@ -789,9 +846,9 @@ export class CollectorFormComponent {
789
846
  description: step.name,
790
847
  buttons: this.constructButtons(step.buttons),
791
848
  dependentDictionary: step.dependentDictionary,
792
- stepId: step.identifier,
849
+ stepId: step.identifier
793
850
  },
794
- fieldGroup: await this.buildSectionsFieldGroupAsync(step, step.sections),
851
+ fieldGroup: await this.buildSectionsFieldGroupAsync(step, step.sections)
795
852
  };
796
853
  if (step.translations) {
797
854
  stepFormlyConfig.props['label'] = Utils.findTranslationInfo('name', step.translations, this.currentLanguageIso);
@@ -832,9 +889,9 @@ export class CollectorFormComponent {
832
889
  props: {
833
890
  label: step.name,
834
891
  buttons: this.constructButtons(step.buttons),
835
- fluxType: step.type,
892
+ fluxType: step.type
836
893
  },
837
- fieldGroup: [],
894
+ fieldGroup: []
838
895
  };
839
896
  this.setStepBaseProps(step, formlyConfig);
840
897
  var fieldConfig = this.createFormlySystemFieldConfig(step);
@@ -879,8 +936,8 @@ export class CollectorFormComponent {
879
936
  if (event === 'success') {
880
937
  await this.stepperGoNextAsync();
881
938
  }
882
- },
883
- },
939
+ }
940
+ }
884
941
  };
885
942
  }
886
943
  CreateDownloadDocsFieldConfig(controlData) {
@@ -892,8 +949,8 @@ export class CollectorFormComponent {
892
949
  controlData: controlData,
893
950
  env: this.env,
894
951
  documentsData: this.appModel.documents,
895
- langIso: this.currentLanguageIso,
896
- },
952
+ langIso: this.currentLanguageIso
953
+ }
897
954
  };
898
955
  }
899
956
  CreateViewDocsFieldConfig(controlData) {
@@ -905,8 +962,8 @@ export class CollectorFormComponent {
905
962
  controlData: controlData,
906
963
  env: this.env,
907
964
  documentsData: this.appModel.documents,
908
- langIso: this.currentLanguageIso,
909
- },
965
+ langIso: this.currentLanguageIso
966
+ }
910
967
  };
911
968
  }
912
969
  CreateUploadDocsFieldConfig(controlData) {
@@ -918,8 +975,8 @@ export class CollectorFormComponent {
918
975
  controlData: controlData,
919
976
  env: this.env,
920
977
  documentsData: this.appModel.documents,
921
- langIso: this.currentLanguageIso,
922
- },
978
+ langIso: this.currentLanguageIso
979
+ }
923
980
  };
924
981
  }
925
982
  CreateGenerateDocsFieldConfig(step) {
@@ -935,8 +992,8 @@ export class CollectorFormComponent {
935
992
  if (event === 'success') {
936
993
  await this.stepperGoNextAsync();
937
994
  }
938
- },
939
- },
995
+ }
996
+ }
940
997
  };
941
998
  }
942
999
  async stepperGoNextAsync() {
@@ -961,8 +1018,8 @@ export class CollectorFormComponent {
961
1018
  dataUrlId: this.dataUrlId,
962
1019
  stepData: step,
963
1020
  labels: labels,
964
- langIso: this.currentLanguageIso,
965
- },
1021
+ langIso: this.currentLanguageIso
1022
+ }
966
1023
  };
967
1024
  }
968
1025
  CreateIdScanFieldConfig(step) {
@@ -981,8 +1038,8 @@ export class CollectorFormComponent {
981
1038
  appDataId: this.appDataUuid || Utils.generateUUID(),
982
1039
  appId: this.appModel.applicationUuid,
983
1040
  errorMessages: errorMessages,
984
- event: (event) => this.onIdScanCompleted(event, step),
985
- },
1041
+ event: (event) => this.onIdScanCompleted(event, step)
1042
+ }
986
1043
  };
987
1044
  }
988
1045
  CreateKycFieldConfig(step) {
@@ -1005,8 +1062,8 @@ export class CollectorFormComponent {
1005
1062
  ectCompleted: async () => {
1006
1063
  this.loadingMessage = translatedLoadingMessage;
1007
1064
  await this.originFormSignalrHandlerService.initiateKycProcessing(this.appDataUuid);
1008
- },
1009
- },
1065
+ }
1066
+ }
1010
1067
  };
1011
1068
  }
1012
1069
  CreatePhoneEmailFieldConfig(step) {
@@ -1020,8 +1077,8 @@ export class CollectorFormComponent {
1020
1077
  if (event === 'success') {
1021
1078
  await this.stepperGoNextAsync();
1022
1079
  }
1023
- },
1024
- },
1080
+ }
1081
+ }
1025
1082
  };
1026
1083
  }
1027
1084
  CreateViewOfferFieldConfig(step) {
@@ -1033,8 +1090,8 @@ export class CollectorFormComponent {
1033
1090
  env: this.env,
1034
1091
  appModel: this.appModel,
1035
1092
  langIso: this.currentLanguageIso,
1036
- event: (event) => this.onOfferSelected(event, step),
1037
- },
1093
+ event: (event) => this.onOfferSelected(event, step)
1094
+ }
1038
1095
  };
1039
1096
  }
1040
1097
  CreatePauseFieldConfig(step) {
@@ -1047,8 +1104,8 @@ export class CollectorFormComponent {
1047
1104
  stepData: step,
1048
1105
  env: this.env,
1049
1106
  appModel: this.appModel,
1050
- langIso: this.currentLanguageIso,
1051
- },
1107
+ langIso: this.currentLanguageIso
1108
+ }
1052
1109
  };
1053
1110
  }
1054
1111
  CreateOpenBankingFieldConfig(step) {
@@ -1069,10 +1126,10 @@ export class CollectorFormComponent {
1069
1126
  waitingMessage: Utils.findTranslation(step.config?.waitingMessageTranslations || [], this.currentLanguageIso),
1070
1127
  consentErrorMessage: Utils.findTranslation(step.config?.consentErrorMessageTranslations || [], this.currentLanguageIso),
1071
1128
  completionMessage: Utils.findTranslation(step.config?.completionMessageTranslations || [], this.currentLanguageIso),
1072
- retryButtonLabel: Utils.findTranslation(step.config?.retryButtonLabelTranslations || [], this.currentLanguageIso),
1129
+ retryButtonLabel: Utils.findTranslation(step.config?.retryButtonLabelTranslations || [], this.currentLanguageIso)
1073
1130
  },
1074
- event: (event) => this.onOpenBankingEvent(event, step),
1075
- },
1131
+ event: (event) => this.onOpenBankingEvent(event, step)
1132
+ }
1076
1133
  };
1077
1134
  }
1078
1135
  CreateStatusFieldConfig(step) {
@@ -1082,8 +1139,8 @@ export class CollectorFormComponent {
1082
1139
  config: step.config,
1083
1140
  stepData: step,
1084
1141
  appDataId: this.appDataUuid,
1085
- appId: this.appModel.applicationUuid,
1086
- },
1142
+ appId: this.appModel.applicationUuid
1143
+ }
1087
1144
  };
1088
1145
  }
1089
1146
  createFormlySystemFieldConfig(step) {
@@ -1157,8 +1214,8 @@ export class CollectorFormComponent {
1157
1214
  if (c.controlId) {
1158
1215
  const value = {
1159
1216
  [c.controlId]: {
1160
- value: c.fillValue,
1161
- },
1217
+ value: c.fillValue
1218
+ }
1162
1219
  };
1163
1220
  if (this.form.contains(c.controlId)) {
1164
1221
  this.form.patchValue(value);
@@ -1179,7 +1236,7 @@ export class CollectorFormComponent {
1179
1236
  if (formlyStepField) {
1180
1237
  formlyStepField.props = {
1181
1238
  ...formlyStepField.props,
1182
- buttonsDisabled: false,
1239
+ buttonsDisabled: false
1183
1240
  };
1184
1241
  this.updateFormlyConfig();
1185
1242
  this.formlyConfigUpdated.emit();
@@ -1206,8 +1263,8 @@ export class CollectorFormComponent {
1206
1263
  type: 'separator',
1207
1264
  props: {
1208
1265
  title: section.translations?.find((t) => t.languageIso === this.currentLanguageIso)?.value ?? '',
1209
- design: this.design,
1210
- },
1266
+ design: this.design
1267
+ }
1211
1268
  };
1212
1269
  }
1213
1270
  if (section.showSectionSeparator) {
@@ -1216,8 +1273,8 @@ export class CollectorFormComponent {
1216
1273
  type: 'separator',
1217
1274
  props: {
1218
1275
  ...separatorFormlyConfig.props,
1219
- showSeparator: section.showSectionSeparator,
1220
- },
1276
+ showSeparator: section.showSectionSeparator
1277
+ }
1221
1278
  };
1222
1279
  }
1223
1280
  if (section.dependentDictionary) {
@@ -1229,10 +1286,10 @@ export class CollectorFormComponent {
1229
1286
  props: {
1230
1287
  label: section.title,
1231
1288
  description: section.translations?.find((t) => t.languageIso === this.currentLanguageIso)?.value ?? '',
1232
- design: this.design,
1289
+ design: this.design
1233
1290
  },
1234
1291
  fieldGroup: await this.buildControlsFieldGroupAsync(step, section.controls || [], section.presentationControls || []),
1235
- fieldGroupClassName: 'display-flex',
1292
+ fieldGroupClassName: 'display-flex'
1236
1293
  };
1237
1294
  if (section.dependentDictionary) {
1238
1295
  this.attachToDependentDictionaryIfNecessary(section.dependentDictionary, sectionFormlyConfig);
@@ -1250,7 +1307,7 @@ export class CollectorFormComponent {
1250
1307
  // buttons: this.constructButtons(step.buttons),
1251
1308
  // dependentDictionary: step.dependentDictionary,
1252
1309
  },
1253
- fieldGroup: await this.buildSectionsFieldGroupAsync(undefined, this.display.sections),
1310
+ fieldGroup: await this.buildSectionsFieldGroupAsync(undefined, this.display.sections)
1254
1311
  };
1255
1312
  }
1256
1313
  return stepFormlyConfig;
@@ -1291,8 +1348,8 @@ export class CollectorFormComponent {
1291
1348
  props: {
1292
1349
  label: '',
1293
1350
  disabled: true,
1294
- hide: true,
1295
- },
1351
+ hide: true
1352
+ }
1296
1353
  };
1297
1354
  }
1298
1355
  async buildControlsFieldGroupAsync(step, controls, presentationControls) {
@@ -1416,7 +1473,7 @@ export class CollectorFormComponent {
1416
1473
  '.component-checkbox',
1417
1474
  '.component-radio',
1418
1475
  '.component-date',
1419
- '.component-data',
1476
+ '.component-data'
1420
1477
  ];
1421
1478
  let formlyConfig = this.getDefaultFormlyFieldConfig(control, initialType, pattern, componentStyleKey, componentsToExcludeFromStyle);
1422
1479
  //control.specificControlData.type === 3 is email
@@ -1447,7 +1504,7 @@ export class CollectorFormComponent {
1447
1504
  case ManualInputControlType.DateTime:
1448
1505
  formlyConfig.type = 'datepicker';
1449
1506
  formlyConfig.props = {
1450
- readonly: true,
1507
+ readonly: true
1451
1508
  };
1452
1509
  componentStyleKey = '.component-date';
1453
1510
  break;
@@ -1542,40 +1599,40 @@ export class CollectorFormComponent {
1542
1599
  }
1543
1600
  return true;
1544
1601
  },
1545
- message: emailErrorLabelValue,
1546
- },
1602
+ message: emailErrorLabelValue
1603
+ }
1547
1604
  };
1548
1605
  }
1549
1606
  addApiValidators(formlyConfig, control) {
1550
- formlyConfig.asyncValidators = {
1607
+ const throughApiValidation = Utils.findErrorTranslationValueOrDefault(control.errorsTranslations, this.currentLanguageIso, 'throughApiValidation');
1608
+ formlyConfig.validators = {
1551
1609
  validateThroughApi: {
1552
- expression: (cont) => {
1553
- return (cont.valueChanges.pipe(debounceTime(500), switchMap(() => {
1554
- const apiValidationMethod = control.specificControlData.apiValidationMethod;
1555
- const bodyValue = this.appModel.partners
1556
- .flatMap((p) => p.partnerSettings.partnerMethodsApi)
1557
- .find((p) => p.methodId === apiValidationMethod)
1558
- ?.bodyConfiguration.bodyMapFields;
1559
- const fieldMap = bodyValue?.reduce((acc, f) => {
1560
- if (f.fluxFieldId === control.identifier) {
1561
- acc[f.partnerField] = cont.value || '';
1562
- }
1563
- else {
1564
- acc[f.partnerField] = '';
1565
- }
1566
- return acc;
1567
- }, {}) || {};
1568
- const dataRequest = {
1569
- appId: this.appModel.applicationId,
1570
- apiId: apiValidationMethod,
1571
- data: JSON.stringify(fieldMap),
1572
- };
1573
- return this.validateMethodApi(dataRequest).pipe(catchError(() => of(false)));
1574
- })) || '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;
1575
1626
  },
1576
- message: 'Validation failed.',
1577
- },
1627
+ message: throughApiValidation
1628
+ }
1578
1629
  };
1630
+ if (formlyConfig.validation) {
1631
+ formlyConfig.validation.messages = {
1632
+ ...formlyConfig.validation.messages,
1633
+ validateThroughApi: throughApiValidation
1634
+ };
1635
+ }
1579
1636
  }
1580
1637
  getDefaultFormlyFieldConfig(control, type, pattern, componentStyleKey, componentsToExcludeFromStyle) {
1581
1638
  const currentLanguageId = Utils.findLanguageIdByIso(this.availableLanguages, this.currentLanguageIso);
@@ -1592,16 +1649,16 @@ export class CollectorFormComponent {
1592
1649
  attributes: {
1593
1650
  style: componentsToExcludeFromStyle.find((c) => c === componentStyleKey)
1594
1651
  ? ''
1595
- : componentStyleKey,
1652
+ : componentStyleKey
1596
1653
  },
1597
1654
  autosize: true,
1598
1655
  options: [{}],
1599
1656
  fieldGroup: [],
1600
- autoDimension: control.autoDimension,
1657
+ autoDimension: control.autoDimension
1601
1658
  },
1602
1659
  expressions: {},
1603
1660
  hooks: {},
1604
- validators: {},
1661
+ validators: {}
1605
1662
  };
1606
1663
  formlyConfig.validation = {};
1607
1664
  if (control.specificControlData?.isMandatory && formlyConfig.props) {
@@ -1609,7 +1666,7 @@ export class CollectorFormComponent {
1609
1666
  formlyConfig.props.required = control.specificControlData?.isMandatory;
1610
1667
  formlyConfig.validation.messages = {
1611
1668
  ...formlyConfig.validation?.messages,
1612
- required: requiredMessage,
1669
+ required: requiredMessage
1613
1670
  };
1614
1671
  }
1615
1672
  if (control.type === StepControlType.Dictionary &&
@@ -1620,7 +1677,7 @@ export class CollectorFormComponent {
1620
1677
  formlyConfig.props.required = control.specificControlData?.isMandatory;
1621
1678
  formlyConfig.validation.messages = {
1622
1679
  ...formlyConfig.validation?.messages,
1623
- required: requiredMessage,
1680
+ required: requiredMessage
1624
1681
  };
1625
1682
  }
1626
1683
  let simpleValidationMessage = '';
@@ -1632,14 +1689,14 @@ export class CollectorFormComponent {
1632
1689
  formlyConfig.props.min = control.specificControlData.minValue;
1633
1690
  formlyConfig.validation.messages = {
1634
1691
  ...formlyConfig.validation?.messages,
1635
- min: simpleValidationMessage,
1692
+ min: simpleValidationMessage
1636
1693
  };
1637
1694
  }
1638
1695
  if (control.specificControlData?.maxValue?.toString()) {
1639
1696
  formlyConfig.props.max = control.specificControlData.maxValue;
1640
1697
  formlyConfig.validation.messages = {
1641
1698
  ...formlyConfig.validation?.messages,
1642
- max: simpleValidationMessage,
1699
+ max: simpleValidationMessage
1643
1700
  };
1644
1701
  }
1645
1702
  }
@@ -1662,12 +1719,12 @@ export class CollectorFormComponent {
1662
1719
  }
1663
1720
  },
1664
1721
  message: simpleValidationMessage ||
1665
- 'Value does not match the required pattern',
1666
- },
1722
+ 'Value does not match the required pattern'
1723
+ }
1667
1724
  };
1668
1725
  formlyConfig.validation.messages = {
1669
1726
  ...formlyConfig.validation?.messages,
1670
- pattern: simpleValidationMessage,
1727
+ pattern: simpleValidationMessage
1671
1728
  };
1672
1729
  }
1673
1730
  // Apply maxLength validation if maxCharacters is defined
@@ -1676,7 +1733,7 @@ export class CollectorFormComponent {
1676
1733
  control.specificControlData?.maxCharacters;
1677
1734
  formlyConfig.validation.messages = {
1678
1735
  ...formlyConfig.validation?.messages,
1679
- maxLength: simpleValidationMessage,
1736
+ maxLength: simpleValidationMessage
1680
1737
  };
1681
1738
  }
1682
1739
  if (control.specificControlData?.allowOnlyFuture ||
@@ -1703,12 +1760,12 @@ export class CollectorFormComponent {
1703
1760
  },
1704
1761
  message: (error, field) => {
1705
1762
  return simpleValidationMessage;
1706
- },
1707
- },
1763
+ }
1764
+ }
1708
1765
  };
1709
1766
  formlyConfig.validators = {
1710
1767
  ...formlyConfig.validators,
1711
- ...checkDateValidation,
1768
+ ...checkDateValidation
1712
1769
  };
1713
1770
  }
1714
1771
  }
@@ -1731,8 +1788,8 @@ export class CollectorFormComponent {
1731
1788
  }
1732
1789
  return true;
1733
1790
  },
1734
- message: phoneErrorLabelValue,
1735
- },
1791
+ message: phoneErrorLabelValue
1792
+ }
1736
1793
  };
1737
1794
  }
1738
1795
  if (control.specificControlData?.type === 2) {
@@ -1754,12 +1811,12 @@ export class CollectorFormComponent {
1754
1811
  if (simpleValidationMessage === '')
1755
1812
  return 'Please enter a valid date';
1756
1813
  return simpleValidationMessage;
1757
- },
1758
- },
1814
+ }
1815
+ }
1759
1816
  };
1760
1817
  formlyConfig.validators = {
1761
1818
  ...formlyConfig.validators,
1762
- ...checkDate2Validation,
1819
+ ...checkDate2Validation
1763
1820
  };
1764
1821
  }
1765
1822
  return formlyConfig;
@@ -1806,14 +1863,21 @@ export class CollectorFormComponent {
1806
1863
  case 'boolean':
1807
1864
  formlyConfig.defaultValue = fillValue ? '&check;' : '&cross;';
1808
1865
  break;
1809
- default:
1810
- 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) {
1811
1872
  formlyConfig.defaultValue = fillValue.name;
1812
1873
  }
1813
1874
  else {
1814
- formlyConfig.defaultValue = fillValue;
1875
+ formlyConfig.defaultValue = JSON.stringify(fillValue);
1815
1876
  }
1816
1877
  break;
1878
+ default:
1879
+ formlyConfig.defaultValue = fillValue;
1880
+ break;
1817
1881
  }
1818
1882
  }
1819
1883
  }
@@ -1863,7 +1927,7 @@ export class CollectorFormComponent {
1863
1927
  hide: (field) => {
1864
1928
  const shouldShow = this.shouldShowDependentField(parentKey, dependentValueIds, this.model);
1865
1929
  return !shouldShow;
1866
- },
1930
+ }
1867
1931
  };
1868
1932
  }
1869
1933
  }
@@ -1890,7 +1954,7 @@ export class CollectorFormComponent {
1890
1954
  if (filteredValues.length > 0) {
1891
1955
  const newDictionary = {
1892
1956
  ...dictionary,
1893
- values: filteredValues,
1957
+ values: filteredValues
1894
1958
  };
1895
1959
  newDictionaries.push(newDictionary);
1896
1960
  }
@@ -2070,7 +2134,7 @@ export class CollectorFormComponent {
2070
2134
  value: value,
2071
2135
  label: Utils.findValueTranslation(value.valueTranslations, currentLanguageId) || value.name,
2072
2136
  currentLanguageIso: this.currentLanguageIso,
2073
- relatedDictionariesTranslations: dictionaryControlData.relatedDictionariesTranslations,
2137
+ relatedDictionariesTranslations: dictionaryControlData.relatedDictionariesTranslations
2074
2138
  }));
2075
2139
  options.props['selectedRelatedDictionaries'] =
2076
2140
  dictionaryControlData.selectedRelatedDictionaries || [];
@@ -2141,14 +2205,14 @@ export class CollectorFormComponent {
2141
2205
  currentLanguageId: currentLanguageId,
2142
2206
  required: true,
2143
2207
  attributes: {
2144
- style: this.styleObjectToStringExceptBackground(this.design[`.font-list`] || {}),
2208
+ style: this.styleObjectToStringExceptBackground(this.design[`.font-list`] || {})
2145
2209
  },
2146
2210
  options: referenceDictionary.values?.map((value) => ({
2147
2211
  value: value,
2148
2212
  label: Utils.findValueTranslation(value.valueTranslations, currentLanguageId) || value.name,
2149
- currentLanguageIso: this.currentLanguageIso,
2150
- })),
2151
- },
2213
+ currentLanguageIso: this.currentLanguageIso
2214
+ }))
2215
+ }
2152
2216
  };
2153
2217
  if (referenceDictionary.defaultValueId) {
2154
2218
  const defaultVal = this.findAndMapDefaultValue(referenceDictionary, referenceDictionary.defaultValueId);
@@ -2164,9 +2228,10 @@ export class CollectorFormComponent {
2164
2228
  if (parentIndex !== -1) {
2165
2229
  const endIndex = this.findLastChildIndex(parentFieldGroup, parentIndex);
2166
2230
  const percentageToAdd = this.getExistingPercentage(parentFieldGroup, parentIndex);
2167
- newField.className = percentageToAdd === 0
2168
- ? parentDictionaryField.className
2169
- : this.getPercentageClassName(percentageToAdd);
2231
+ newField.className =
2232
+ percentageToAdd === 0
2233
+ ? parentDictionaryField.className
2234
+ : this.getPercentageClassName(percentageToAdd);
2170
2235
  parentFieldGroup.splice(endIndex + 1, 0, newField);
2171
2236
  const classNameToAdd = type === 'radio' ? ` component-radio` : ` component-data`;
2172
2237
  newField.className += classNameToAdd;
@@ -2247,12 +2312,12 @@ export class CollectorFormComponent {
2247
2312
  preloadedDictionaries: this.dictionaryMap,
2248
2313
  options: childDictionary.values?.map((value) => ({
2249
2314
  value: value.id,
2250
- label: value.name,
2315
+ label: value.name
2251
2316
  })),
2252
2317
  required: true,
2253
2318
  attributes: {
2254
- style: this.styleObjectToStringExceptBackground(this.design[`.font-list`] || {}),
2255
- },
2319
+ style: this.styleObjectToStringExceptBackground(this.design[`.font-list`] || {})
2320
+ }
2256
2321
  },
2257
2322
  hooks: {
2258
2323
  onInit: (field) => {
@@ -2274,8 +2339,8 @@ export class CollectorFormComponent {
2274
2339
  unsubscribe$.next();
2275
2340
  unsubscribe$.complete();
2276
2341
  };
2277
- },
2278
- },
2342
+ }
2343
+ }
2279
2344
  };
2280
2345
  const parentFieldGroup = parentDictionaryField.parent
2281
2346
  ? parentDictionaryField.parent.fieldGroup
@@ -2447,7 +2512,7 @@ export class CollectorFormComponent {
2447
2512
  return buttonsConfig.map((button) => ({
2448
2513
  type: button.value.toLowerCase(),
2449
2514
  label: button.translations?.[this.currentLanguageIso] || button.value,
2450
- styleKey: `.button-${button.value.toLowerCase()}`,
2515
+ styleKey: `.button-${button.value.toLowerCase()}`
2451
2516
  }));
2452
2517
  }
2453
2518
  styleObjectToStringExceptBackground(styleObj) {
@@ -2456,17 +2521,16 @@ export class CollectorFormComponent {
2456
2521
  .map(([key, value]) => `${key}: ${value}`)
2457
2522
  .join('; ');
2458
2523
  }
2459
- validateMethodApi(data) {
2460
- if (data.apiId === undefined || data.appId === undefined) {
2461
- return of(false);
2524
+ async validateMethodApi(data) {
2525
+ if (data.apiMethodId === undefined) {
2526
+ return false;
2462
2527
  }
2463
- return this.applicationDataService.validateApi(data).pipe(map((response) => {
2464
- console.log('API validation response:', response);
2465
- return !!response;
2528
+ var apiResponse = from(this.applicationDataService.validateApi(data)).pipe(map((obs) => {
2529
+ return !!obs;
2466
2530
  }), catchError((error) => {
2467
- console.error('Error validating ' + data.data, error);
2468
2531
  return of(false);
2469
2532
  }));
2533
+ return firstValueFrom(apiResponse);
2470
2534
  }
2471
2535
  /**
2472
2536
  * Public method to clear the saving after actions state
@@ -2525,4 +2589,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
2525
2589
  }], completionEvent: [{
2526
2590
  type: Output
2527
2591
  }] } });
2528
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JpZ2luLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9vcmlnaW4tZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9vcmlnaW4tZm9ybS9zcmMvbGliL29yaWdpbi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBSU4sWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxXQUFXLEdBR1osTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsT0FBTyxFQUNQLGNBQWMsRUFDZCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNWLEVBQUUsRUFDRixTQUFTLEVBRVQsR0FBRyxFQUNILFlBQVksR0FDYixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU8vQyxPQUFPLEVBS0wsUUFBUSxFQUNSLGFBQWEsRUFDYixlQUFlLEVBQ2Ysc0JBQXNCLEdBR3ZCLE1BQU0sc0JBQXNCLENBQUM7QUFLOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBWSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVVqRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQVFsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUEwRSx1QkFBdUIsRUFBeUIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3SixP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QUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztZQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDOytHQWp3R1Usc0JBQXNCO21HQUF0QixzQkFBc0IsbXBCQUNuQixXQUFXLHFFQ3JGM0IsZ3VDQXdDQTs7NEZENENhLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxpQkFBaUI7dWZBS0EsWUFBWTtzQkFBdEMsWUFBWTt1QkFBQyxXQUFXO2dCQUdoQixlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQWNJLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIEZvcm1seUZpZWxkLFxuICBGb3JtbHlGaWVsZENvbmZpZyxcbiAgRm9ybWx5Rm9ybU9wdGlvbnMsXG59IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHtcbiAgU3ViamVjdCxcbiAgZmlyc3RWYWx1ZUZyb20sXG4gIHN0YXJ0V2l0aCxcbiAgcGFpcndpc2UsXG4gIGRlYm91bmNlVGltZSxcbiAgc3dpdGNoTWFwLFxuICBjYXRjaEVycm9yLFxuICBvZixcbiAgdGFrZVVudGlsLFxuICBPYnNlcnZhYmxlLFxuICBtYXAsXG4gIFN1YnNjcmlwdGlvbixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMYWJlbEtleXMgfSBmcm9tICcuL2VudW1zL2xhYmVsLmtleXMnO1xuaW1wb3J0IHsgQXBpVmFsaWRhdGVSZXF1ZXN0IH0gZnJvbSAnLi9tb2RlbHMvYXBwbGljYXRpb24ubW9kZWwnO1xuaW1wb3J0IHtcbiAgRGljdGlvbmFyeUR0byxcbiAgRGljdGlvbmFyeVZhbHVlLFxuICBEaWN0aW9uYXJ5VmFsdWVEdG8sXG59IGZyb20gJy4vbW9kZWxzL2RpY3Rpb25hcnkubW9kZWwnO1xuaW1wb3J0IHtcbiAgRm9ybU1vZGVsLFxuICBEaXNwbGF5TW9kZWwsXG4gIEdlbmVyYWxEYXRhTW9kZWwsXG4gIFN0ZXBzU2V0dGluZ3MsXG4gIEZsdXhUeXBlLFxuICBEaW1lbnNpb25UeXBlLFxuICBTdGVwQ29udHJvbFR5cGUsXG4gIE1hbnVhbElucHV0Q29udHJvbFR5cGUsXG4gIFByZXNlbnRhdGlvblBhcmFncmFwaENvbnRyb2wsXG4gIERpY3Rpb25hcnlDb250cm9sRGF0YSxcbn0gZnJvbSAnLi9tb2RlbHMvZm9ybXMubW9kZWwnO1xuaW1wb3J0IHsgTGFiZWxJbmZvLCBUcmFuc2xhdGlvbkluZm8gfSBmcm9tICcuL21vZGVscy9sYWJlbC1pbmZvLm1vZGVsJztcbmltcG9ydCB7IExhYmVsIH0gZnJvbSAnLi9tb2RlbHMvbGFiZWwubW9kZWwnO1xuaW1wb3J0IHsgTGFuZ3VhZ2UgfSBmcm9tICcuL21vZGVscy9sYW5ndWFnZS5tb2RlbCc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5TGFiZWxJbmZvIH0gZnJvbSAnLi9vdGhlcnMvZGljdGlvbmFyeS1sYWJlbC1pbmZvJztcbmltcG9ydCB7IEVudmlyb25tZW50VHlwZSB9IGZyb20gJy4vb3RoZXJzL2Vudmlyb25tZW50LXR5cGUnO1xuaW1wb3J0IHsgQ3NzUnVsZXMsIFV0aWxzIH0gZnJvbSAnLi9vdGhlcnMvdXRpbHMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25EYXRhU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvYXBwbGljYXRpb25EYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGFiZWxTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9sYWJlbHMuc2VydmljZSc7XG5pbXBvcnQgeyBQcm94eVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3Byb3h5LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGljdGlvbmFyeVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2RpY3Rpb25hcnkuc2VydmljZSc7XG5pbXBvcnQgeyBMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2xhbmd1YWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgT3JpZ2luRm9ybUF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9vcmlnaW4tZm9ybS1hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybXNTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9mb3Jtcy5zZXJ2aWNlJztcbmltcG9ydCB7IElucHV0Q29uZmlnIH0gZnJvbSAnLi9vcmlnaW4tZm9ybS1jb25maWcubW9kZWwnO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4vb3RoZXJzL2NvbmZpZy1zZXJ2aWNlJztcbmltcG9ydCB7IE1vZGVsUG9wdWxhdGlvbkhlbHBlciB9IGZyb20gJy4vbW9kZWwtcG9wdWxhdGlvbi5oZWxwZXInO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy90cmFuc2xhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIE9wZXJhdGlvblJlc3VsdCxcbiAgT3JpZ2luRm9ybVNpZ25hbHJIYW5kbGVyU2VydmljZSxcbn0gZnJvbSAnLi9zZXJ2aWNlcy9vcmlnaW4tZm9ybS1zaWduYWxyLWhhbmRsZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBY3Rpb25TdGVwSGFuZGxlciB9IGZyb20gJy4vYWN0aW9uLXN0ZXAtaGFuZGxlcic7XG5pbXBvcnQgeyBTY3JvbGxUb0Vycm9yU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvc2Nyb2xsLXRvLWVycm9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybUNzc0hlbHBlciB9IGZyb20gJy4vZm9ybS1jc3MuaGVscGVyJztcbmltcG9ydCB7IEJhc2VDb250cm9sLCBDb250cm9sRGF0YSwgRGVwZW5kZW50RGljdGlvbmFyeURhdGEsIFByZXNlbnRhdGlvbkNvbnRyb2wsIFByZXNlbnRhdGlvbkNvbnRyb2xUeXBlLCBTZWN0aW9uRGF0YSwgU3RlcERhdGEgfSBmcm9tICcuL21vZGVscy9mbHV4Lm1vZGVsJztcbmltcG9ydCB7IEZMQUdfSUNPTlMgfSBmcm9tICcuL2ZsYWctaWNvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtb3JpZ2luLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vb3JpZ2luLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9vcmlnaW4tZm9ybS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBDb2xsZWN0b3JGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkcmVuKEZvcm1seUZpZWxkKSBmb3JtbHlGaWVsZHM6IFF1ZXJ5TGlzdDxGb3JtbHlGaWVsZD47XG4gIFxuICAvL3RoZXNlIGFyZSBzcGVjaWZpYyB0byB0aGUgbGliXG4gIEBJbnB1dCgpIGNvbmZpZ0NvbXBvbmVudDogSW5wdXRDb25maWcgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGNvbmZpZ1V1aWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGN1cnJlbnRTdGVwSWQ6IHN0cmluZztcbiAgLy9lbmQgc3BlY2lmaWMgdG8gbGliXG5cbiAgQElucHV0KCkgYXBwTW9kZWw6IEZvcm1Nb2RlbDtcbiAgQElucHV0KCkgc2lnbkJhc2VVcmw6IHN0cmluZztcbiAgQElucHV0KCkgY3VycmVudExhbmd1YWdlSXNvOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZpbGxEYXRhOiBhbnk7XG4gIEBJbnB1dCgpIGluaXRGbG93VmFsdWVzOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGVudjogc3RyaW5nO1xuICBASW5wdXQoKSBzaG93RGlzcGxheU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0xhbmd1YWdlU2VsZWN0b3I6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBpc0RlbW9Nb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzRGVidWc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgYXBwRGF0YVV1aWQ6IHN0cmluZztcbiAgQElucHV0KCkgYmxvY2tQcmV2aW91c1N0ZXA6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGRhdGFVcmxJZDogc3RyaW5nO1xuICBASW5wdXQoKSBub0J1dHRvbnNJblZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBmbHV4OiBTdGVwRGF0YVtdO1xuICBwcml2YXRlIGRpc3BsYXk6IERpc3BsYXlNb2RlbDtcbiAgcHJpdmF0ZSBkZXNpZ246IENzc1J1bGVzO1xuICBwcml2YXRlIGdlbmVyYWxEYXRhOiBHZW5lcmFsRGF0YU1vZGVsO1xuICBwcml2YXRlIGxhYmVsczogTGFiZWxbXTtcbiAgcHJpdmF0ZSBzdGVwRGljdGlvbmFyeURlcGVuZGVudElkczogc3RyaW5nW107XG4gIHByaXZhdGUgYXZhaWxhYmxlTGFuZ3VhZ2VzOiBMYW5ndWFnZVtdO1xuICBwcml2YXRlIHN0ZXBzU2V0dGluZ3M6IFN0ZXBzU2V0dGluZ3M7XG4gIGZvcm1seUNvbmZpZ1VwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIHZpc2libGVGaWVsZHNVcGRhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIGZvcm1seVVwZGF0ZUFuZEdvTmV4dCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBmb3JtbHlHb05leHQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQE91dHB1dCgpIGNvbXBsZXRpb25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBmb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gIGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xuICBmb3JtbHlBbGxTdGVwczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xuICBhY3RpdmVTdGVwID0gMDtcbiAgbW9kZWw6IGFueTtcbiAgb3B0aW9uczogRm9ybWx5Rm9ybU9wdGlvbnMgPSB7fTtcbiAgaXNMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcblxuICBkaWN0aW9uYXJ5TWFwOiBNYXA8c3RyaW5nLCBEaWN0aW9uYXJ5RHRvPiA9IG5ldyBNYXAoKTtcbiAgZGljdGlvbmFyeUlkVG9VdWlkTWFwOiBNYXA8bnVtYmVyLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuICBnZW5lcmFsRGF0YUtleXMgPSBMYWJlbEtleXMuYXBwQ29uZmlnRWRpdC5nZW5lcmFsRGF0YTtcbiAgcHJpdmF0ZSBmaWVsZFVuc3Vic2NyaWJlU3ViamVjdHM6IFN1YmplY3Q8dm9pZD5bXSA9IFtdO1xuICBwcml2YXRlIGNvbGxlY3RvckhhbmRsZXJTdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgLy8gQWN0aW9uIHN0ZXAgZXhlY3V0aW9uIHN0YXRlXG4gIHByaXZhdGUgaXNFeGVjdXRpbmdBY3Rpb25zID0gZmFsc2U7XG4gIHByaXZhdGUgYWN0aW9uU3RlcFN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHVibGljIGlzU2F2aW5nQWZ0ZXJBY3Rpb25zID0gZmFsc2U7IC8vIE1ha2UgdGhpcyBwdWJsaWMgc28gc3RlcHBlciBjYW4gYWNjZXNzIGl0XG5cbiAgLy8gaWRlbnRpZmljYXRpb24ga3ljIGNvbXBvbmVudFxuICBwdWJsaWMga3ljQXBpVXJsOiBzdHJpbmc7XG4gIHB1YmxpYyBreWNPcmRlcklkOiBzdHJpbmc7XG4gIHB1YmxpYyBreWNUb2tlbjogc3RyaW5nO1xuICBwdWJsaWMga3ljRW52OiBzdHJpbmc7XG4gIHB1YmxpYyBreWNSZWRpcmVjdElkOiBzdHJpbmc7XG4gIHB1YmxpYyBreWNQaG9uZU51bWJlcjogc3RyaW5nID0gJyc7XG4gIHB1YmxpYyBreWNMYW5nSXNvOiBzdHJpbmcgPSAnJztcbiAgcHVibGljIGt5Y1Nob3dDaXRpemVuc2hpcDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMga3ljU2Nyb2xsTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBlbmQgaWRlbnRpZmljYXRpb24ga3ljIGNvbXBvbmVudFxuICBwdWJsaWMgbGFuZ3VhZ2VGbGFnczogYW55W10gPSBbXG4gICAge1xuICAgICAgbGFuZ3VhZ2U6ICdFbmdsaXNoJyxcbiAgICAgIGNvZGU6ICdlbicsXG4gICAgICB0eXBlOiAnVVMnLFxuICAgICAgaWNvbjogRkxBR19JQ09OUy5lbixcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhbmd1YWdlOiAnUm9tYW5hJyxcbiAgICAgIGNvZGU6ICdybycsXG4gICAgICBpY29uOiBGTEFHX0lDT05TLnJvLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFuZ3VhZ2U6ICdEZXV0c2NoJyxcbiAgICAgIGNvZGU6ICdkZScsXG4gICAgICBpY29uOiBGTEFHX0lDT05TLmRlLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFuZ3VhZ2U6ICdGcmFuw6dhaXMnLFxuICAgICAgY29kZTogJ2ZyJyxcbiAgICAgIGljb246IEZMQUdfSUNPTlMuZnIsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYW5ndWFnZTogJ0l0YWxpYW5vJyxcbiAgICAgIGNvZGU6ICdpdCcsXG4gICAgICBpY29uOiBGTEFHX0lDT05TLml0LFxuICAgIH0sXG4gICAge1xuICAgICAgbGFuZ3VhZ2U6ICdFc3Bhw7FvbCcsXG4gICAgICBjb2RlOiAnZXMnLFxuICAgICAgaWNvbjogRkxBR19JQ09OUy5lcyxcbiAgICB9LFxuICBdO1xuICBmb3JtbHlDb2xsZWN0aW5nRmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdO1xuICBmb3JtbHlQcmVzZW50YXRpb25GaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW107XG4gIGNvbnRyb2xJZHNXaXRoVmFsdWVzOiBhbnk7XG4gIF9zZWxmID0gdGhpcztcblxuICBcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBEaWN0aW9uYXJ5U2VydmljZSxcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJveHk6IFByb3h5U2VydmljZSxcbiAgICBwcml2YXRlIGxhYmVsU2VydmljZTogTGFiZWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXBwbGljYXRpb25EYXRhU2VydmljZTogQXBwbGljYXRpb25EYXRhU2VydmljZSxcbiAgICBwcml2YXRlIGxhbmdTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogT3JpZ2luRm9ybUF1dGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybXNTZXJ2aWNlOiBGb3Jtc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRpb25TZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvcmlnaW5Gb3JtU2lnbmFsckhhbmRsZXJTZXJ2aWNlOiBPcmlnaW5Gb3JtU2lnbmFsckhhbmRsZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aW9uU3RlcEhhbmRsZXI6IEFjdGlvblN0ZXBIYW5kbGVyLFxuICAgIHByaXZhdGUgc2Nyb2xsVG9FcnJvclNlcnZpY2U6IFNjcm9sbFRvRXJyb3JTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMua3ljQXBpVXJsID0gcHJveHkuYXBpVVJMO1xuICAgIHRoaXMua3ljT3JkZXJJZCA9IHByb3h5Lm9yZGVySUQhO1xuICAgIHRoaXMua3ljVG9rZW4gPSBwcm94eS50b2tlbjtcbiAgICB0aGlzLmt5Y0VudiA9IHByb3h5LmVudjtcblxuICAgIHRoaXMua3ljTGFuZ0lzbyA9IHByb3h5LmxhbmdJc287XG4gICAgY29uc3QgaXNMb2FkaW5nU3ViID1cbiAgICAgIHRoaXMub3JpZ2luRm9ybVNpZ25hbHJIYW5kbGVyU2VydmljZS5pc0xvYWRpbmckLnN1YnNjcmliZSgobG9hZGluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0xvYWRpbmcgIT09IGxvYWRpbmcpIHtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGxvYWRpbmc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHRoaXMuY29sbGVjdG9ySGFuZGxlclN1YnNjcmlwdGlvbnMuYWRkKGlzTG9hZGluZ1N1Yik7XG5cbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQ29tcGxldGVkU3ViID1cbiAgICAgIHRoaXMub3JpZ2luRm9ybVNpZ25hbHJIYW5kbGVyU2VydmljZS5vcGVyYXRpb25Db21wbGV0ZWQkLnN1YnNjcmliZShcbiAgICAgICAgYXN5bmMgKHJlc3VsdDogT3BlcmF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5vcGVyYXRpb25JZGVudGlmaWVyID09PSAnS1lDX1BST0NFU1NJTkcnKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgJ0tZQyBQcm9jZXNzaW5nIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgKHZpYSBIYW5kbGVyIFNlcnZpY2UpOicsXG4gICAgICAgICAgICAgICAgcmVzdWx0LmRhdGFcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdC5kYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxsRGF0YSA9IEpTT04ucGFyc2UocmVzdWx0LmRhdGEuZmlsbERhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMucG9wdWxhdGVNb2RlbFdpdGhGaWxsRGF0YSh0aGlzLmZpbGxEYXRhKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRoaXMuZm9ybWx5VXBkYXRlQW5kR29OZXh0LmVtaXQoe30pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAnS1lDIFByb2Nlc3NpbmcgZmFpbGVkICh2aWEgSGFuZGxlciBTZXJ2aWNlKTonLFxuICAgICAgICAgICAgICAgIHJlc3VsdC5lcnJvclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB0aGlzLmNvbGxlY3RvckhhbmRsZXJTdWJzY3JpcHRpb25zLmFkZChvcGVyYXRpb25Db21wbGV0ZWRTdWIpO1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIGFjdGlvbiBzdGVwIGV4ZWN1dGlvbiBldmVudHNcbiAgICBjb25zdCBhY3Rpb25FeGVjdXRpbmdTdWIgPVxuICAgICAgdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5hY3Rpb25FeGVjdXRpbmckLnN1YnNjcmliZSgoZXhlY3V0aW5nKSA9PiB7XG4gICAgICAgIHRoaXMuaXNFeGVjdXRpbmdBY3Rpb25zID0gZXhlY3V0aW5nO1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGV4ZWN1dGluZztcbiAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgICB0aGlzLmFjdGlvblN0ZXBTdWJzY3JpcHRpb25zLmFkZChhY3Rpb25FeGVjdXRpbmdTdWIpO1xuXG4gICAgY29uc3QgYWN0aW9uQ29tcGxldGVkU3ViID1cbiAgICAgIHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuYWN0aW9uQ29tcGxldGVkJC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygn8J+OrCBBY3Rpb24gc3RlcCBjb21wbGV0ZWQ6JywgcmVzdWx0KTtcbiAgICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBBY3Rpb24gc3RlcCBmYWlsZWQ6JywgcmVzdWx0LmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiBXZSBkb24ndCBhdXRvLXByb2dyZXNzIGhlcmUgYXMgaXQncyBoYW5kbGVkIGluIGV4ZWN1dGVBY3Rpb25TdGVwc0JlZm9yZU1vdmluZ1xuICAgICAgfSk7XG4gICAgdGhpcy5hY3Rpb25TdGVwU3Vic2NyaXB0aW9ucy5hZGQoYWN0aW9uQ29tcGxldGVkU3ViKTtcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmRhdGFVcmxJZCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLmFwcGxpY2F0aW9uRGF0YVNlcnZpY2UuZ2V0RGF0YVVybCh0aGlzLmRhdGFVcmxJZClcbiAgICAgICk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuY29uZmlnVXVpZCA9IHJlc3VsdC5hcHBJZDtcbiAgICAgICAgdGhpcy5hcHBEYXRhVXVpZCA9IHJlc3VsdC5hcHBEYXRhSWQ7XG4gICAgICAgIHRoaXMuZW52ID0gcmVzdWx0LmVudjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5hcHBEYXRhVXVpZCAmJiB0aGlzLmN1cnJlbnRTdGVwSWQpIHtcbiAgICAgIHRoaXMuYXBwbGljYXRpb25EYXRhU2VydmljZS5zZXRDdXJyZW50U3RlcChcbiAgICAgICAgdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcElkXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5hcHBEYXRhVXVpZCkge1xuICAgICAgdGhpcy5hcHBEYXRhVXVpZCA9IFV0aWxzLmdlbmVyYXRlVVVJRCgpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50ICYmXG4gICAgICB0aGlzLmNvbmZpZ0NvbXBvbmVudC5Ub2tlbiAmJlxuICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuUmVmcmVzaFRva2VuXG4gICAgKSB7XG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UudXBkYXRlQ29uZmlnRnJvbUlucHV0KHRoaXMuY29uZmlnQ29tcG9uZW50KTtcbiAgICAgIGF3YWl0IHRoaXMuYXV0aFNlcnZpY2Uuc2V0VG9rZW5zKFxuICAgICAgICB0aGlzLmNvbmZpZ0NvbXBvbmVudC5Ub2tlbixcbiAgICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuUmVmcmVzaFRva2VuXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzIHx8IHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5sYW5nU2VydmljZS5nZXRMYW5ndWFnZXMoKSkudGhlbigobGlzdCkgPT4ge1xuICAgICAgICBpZiAobGlzdCAmJiBsaXN0Lml0ZW1zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMgPSBsaXN0Lml0ZW1zO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5sb2FkQXBwRGF0YSgpO1xuICAgIGlmICghdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28gJiYgdGhpcy5hcHBNb2RlbCkge1xuICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28gPSB0aGlzLmFwcE1vZGVsLmdlbmVyYWxEYXRhLmRlZmF1bHRMYW5ndWFnZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXBwTW9kZWwpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdEFzeW5jKCk7XG4gICAgICAvLyBFeGVjdXRlIGFueSBhY3Rpb24vc3RhdHVzIHN0ZXBzIHRoYXQgYXBwZWFyIGJlZm9yZSB0aGUgZmlyc3QgdmlzaWJsZSBzdGVwXG4gICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVMZWFkaW5nQWN0aW9uU3RlcHMoKTtcbiAgICB9XG4gIH1cblxuIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnQ29tcG9uZW50J10gJiYgIWNoYW5nZXNbJ2NvbmZpZ0NvbXBvbmVudCddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50ICYmXG4gICAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlRva2VuICYmXG4gICAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlJlZnJlc2hUb2tlblxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29uZmlnU2VydmljZS51cGRhdGVDb25maWdGcm9tSW5wdXQodGhpcy5jb25maWdDb21wb25lbnQpO1xuICAgICAgICBhd2FpdCB0aGlzLmF1dGhTZXJ2aWNlLnNldFRva2VucyhcbiAgICAgICAgICB0aGlzLmNvbmZpZ0NvbXBvbmVudC5Ub2tlbixcbiAgICAgICAgICB0aGlzLmNvbmZpZ0NvbXBvbmVudC5SZWZyZXNoVG9rZW5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1snY3VycmVudExhbmd1YWdlSXNvJ10gJiZcbiAgICAgICFjaGFuZ2VzWydjdXJyZW50TGFuZ3VhZ2VJc28nXS5maXJzdENoYW5nZVxuICAgICkge1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzKSB7XG4gICAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5sYW5nU2VydmljZS5nZXRMYW5ndWFnZXMoKSkudGhlbigobGlzdCkgPT4ge1xuICAgICAgICAgICAgaWYgKGxpc3QgJiYgbGlzdC5pdGVtcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyA9IGxpc3QuaXRlbXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXBwRGF0YVV1aWQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYXBwRGF0YSA9IGF3YWl0IHRoaXMuYXBwbGljYXRpb25EYXRhU2VydmljZS5nZXRTdGVwcyhcbiAgICAgICAgICAgICAgdGhpcy5hcHBEYXRhVXVpZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChhcHBEYXRhICYmIGFwcERhdGEuZmlsbERhdGEpIHtcbiAgICAgICAgICAgICAgdGhpcy5maWxsRGF0YSA9IEpTT04ucGFyc2UoYXBwRGF0YS5maWxsRGF0YSk7XG4gICAgICAgICAgICAgIHRoaXMuYmxvY2tQcmV2aW91c1N0ZXAgPSBhcHBEYXRhLmJsb2NrUHJldmlvdXNTdGVwO1xuICAgICAgICAgICAgICBpZiAodGhpcy5maWxsRGF0YS5tZXRhZGF0YS5sYW5ndWFnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvID0gdGhpcy5maWxsRGF0YS5tZXRhZGF0YS5sYW5ndWFnZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZXRyaWV2aW5nIGFwcCBkYXRhJywgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmluaXRBc3luYygpO1xuICAgICAgICAvLyBFeGVjdXRlIGFueSBhY3Rpb24vc3RhdHVzIHN0ZXBzIHRoYXQgYXBwZWFyIGJlZm9yZSB0aGUgZmlyc3QgdmlzaWJsZSBzdGVwXG4gICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUxlYWRpbmdBY3Rpb25TdGVwcygpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9hZEFwcERhdGEoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZTogeyBjb25maWd1cmF0aW9uOiBhbnk7IGZpbGxEYXRhPzogYW55IH0gPVxuICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICB0aGlzLmZvcm1zU2VydmljZS5sb2FkRm9ybUJ5VXVpZCh0aGlzLmNvbmZpZ1V1aWQsIHRoaXMuZW52KVxuICAgICAgICApO1xuICAgICAgdGhpcy5hcHBNb2RlbCA9IEpTT04ucGFyc2UocmVzcG9uc2UuY29uZmlndXJhdGlvbik7XG4gICAgICB0aGlzLmZpbGxEYXRhID0gcmVzcG9uc2UuZmlsbERhdGEgPyBKU09OLnBhcnNlKHJlc3BvbnNlLmZpbGxEYXRhKSA6IG51bGw7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgZm9ybSBkYXRhJywgZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluaXRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbUFsbEZpZWxkcygpO1xuICAgIGF3YWl0IHRoaXMuYnVpbGRGb3JtbHlBc3luYygpO1xuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVJlZmVyZW5jZUZpZWxkcyh0aGlzLmZvcm1seUNvbmZpZyk7XG4gICAgdGhpcy51cGRhdGVGb3JtbHlDb25maWcoKTtcbiAgICB0aGlzLmZvcm1seUNvbmZpZ1VwZGF0ZWQuZW1pdCgpO1xuICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIGFwcGxpY2F0aW9uTGFuZ3VhZ2VzKCk6IExhbmd1YWdlW10ge1xuICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcz8uZmlsdGVyKChhKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5hcHBNb2RlbD8uZ2VuZXJhbERhdGE/Lmxhbmd1YWdlcz8uaW5kZXhPZihhLmlzbykgPj0gMDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZXR1cm5GTGFnKGxhbmd1YWdlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5sYW5ndWFnZUZsYWdzLmZpbmQoKGwpID0+IGwuY29kZSA9PSBsYW5ndWFnZSk/Lmljb247XG4gIH1cblxuICBjaGFuZ2VMYW5ndWFnZSgkZXZlbnQ6IHN0cmluZykge1xuICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvID0gJGV2ZW50O1xuICAgIHRoaXMuYXBwbGljYXRpb25EYXRhU2VydmljZVxuICAgICAgLmNoYW5nZUxhbmd1YWdlKHRoaXMuYXBwRGF0YVV1aWQsIHRoaXMuY3VycmVudExhbmd1YWdlSXNvKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaW5pdEFzeW5jKCk7XG4gIH1cbiAgZ2V0TGFuZ3VhZ2VOYW1lKGxhbmd1YWdlSXNvOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMuZmluZChcbiAgICAgIChsYW5nKSA9PiBsYW5nLmlzbyA9PT0gbGFuZ3VhZ2VJc29cbiAgICApO1xuICAgIHJldHVybiBsYW5ndWFnZSA/IGxhbmd1YWdlLm5hbWUgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRGb3JtbHlBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28pIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0TGFiZWxzKCk7XG4gICAgfVxuXG4gICAgLy8gU1RFUCAxOiBJbml0aWFsaXplIGZsdXggYW5kIG90aGVyIHByb3BlcnRpZXMgZmlyc3RcbiAgICB0aGlzLmZsdXggPSB0aGlzLmFwcE1vZGVsLmZsdXg7XG4gICAgdGhpcy5kaXNwbGF5ID0gdGhpcy5hcHBNb2RlbC5kaXNwbGF5O1xuICAgIHRoaXMuZGVzaWduID0gdGhpcy5hcHBNb2RlbC5nZW5lcmF0ZWRDc3M7XG4gICAgdGhpcy5nZW5lcmFsRGF0YSA9IHRoaXMuYXBwTW9kZWwuZ2VuZXJhbERhdGE7XG4gICAgdGhpcy5hZGRSZW5kZXJlZENzcygpO1xuXG4gICAgLy8gU1RFUCAyOiBMb2FkIEFMTCBkaWN0aW9uYXJpZXMgdXBmcm9udCAobm93IHRoYXQgZmx1eCBpcyBpbml0aWFsaXplZClcbiAgICBhd2FpdCB0aGlzLmxvYWRBbGxSZXF1aXJlZERpY3Rpb25hcmllcygpO1xuXG4gICAgLy8gU1RFUCAzOiBDb250aW51ZSB3aXRoIGV4aXN0aW5nIGZvcm0gYnVpbGRpbmcgbG9naWNcbiAgICB0aGlzLmZvcm1seUNvbmZpZyA9IFtdO1xuICAgIHRoaXMuZm9ybWx5Q29sbGVjdGluZ0ZpZWxkcyA9IFtdO1xuICAgIHRoaXMuZm9ybWx5UHJlc2VudGF0aW9uRmllbGRzID0gW107XG4gICAgdGhpcy5tb2RlbCA9IHt9O1xuICAgIHRoaXMuZm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xuXG4gICAgLy8gUG9wdWxhdGUgY29udHJvbCBJRHMgd2l0aCB2YWx1ZXMgaWYgZmlsbERhdGEgb3IgaW5pdEZsb3dWYWx1ZXMgZXhpc3RcbiAgICBpZiAodGhpcy5maWxsRGF0YSB8fCB0aGlzLmluaXRGbG93VmFsdWVzKSB7XG4gICAgICB0aGlzLnBvcHVsYXRlQ29udHJvbElkc1dpdGhWYWx1ZURpY3Rpb25hcnkoKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIG1vZGVsIHdpdGggZGVmYXVsdCB2YWx1ZXMgaWYgbm8gZmlsbERhdGFcbiAgICBpZiAoIXRoaXMuZmlsbERhdGEpIHtcbiAgICAgIHRoaXMubW9kZWwgPSBNb2RlbFBvcHVsYXRpb25IZWxwZXIuYXBwbHlEZWZhdWx0c1RvTW9kZWwoXG4gICAgICAgIHRoaXMuZmx1eCxcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5TWFwLFxuICAgICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wb3B1bGF0ZU1vZGVsV2l0aEZpbGxEYXRhKHRoaXMuZmlsbERhdGEpO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHRoaXMubW9kZWwpO1xuICAgIGF3YWl0IHRoaXMuYnVpbGRGb3JtbHlDb25maWdBc3luYygpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSByZWZlcmVuY2VzIGZvciBkZWZhdWx0IHZhbHVlc1xuICAgIGlmICghdGhpcy5maWxsRGF0YSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUmVmZXJlbmNlRmllbGRzKHRoaXMuZm9ybWx5Q29uZmlnKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShzdGFydFdpdGgobnVsbCksIHBhaXJ3aXNlKCkpXG4gICAgICAuc3Vic2NyaWJlKChbcHJldiwgbmV4dF06IFthbnksIGFueV0pID0+XG4gICAgICAgIHRoaXMuaGFuZGxlRm9ybVZhbHVlQ2hhbmdlKFtwcmV2LCBuZXh0XSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZvcm1WYWx1ZUNoYW5nZShbcHJldiwgbmV4dF06IFthbnksIGFueV0pIHtcbiAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2VJZCA9IFV0aWxzLmZpbmRMYW5ndWFnZUlkQnlJc28oXG4gICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXh0KSB7XG4gICAgICBpZiAobmV4dFtrZXldPy52YWx1ZVRyYW5zbGF0aW9ucykge1xuICAgICAgICB2YXIgcyA9IEpTT04uc3RyaW5naWZ5KG5leHRba2V5XSk7XG4gICAgICAgIHZhciByZXBsYWNlZCA9IHMucmVwbGFjZSgvXCJ2YWx1ZVRyYW5zbGF0aW9uc1wiOi9nLCAnXCJ0cmFuc2xhdGlvbnNcIjonKTtcbiAgICAgICAgbmV4dFtrZXldID0gSlNPTi5wYXJzZShyZXBsYWNlZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZm9ybWx5UHJlc2VudGF0aW9uRmllbGRzLmZpbHRlcihcbiAgICAgICAgKGkpID0+IGkucHJvcHMgJiYgaS5wcm9wc1snY29sbGVjdGlvbkNvbnRyb2xJZGVudGlmaWVyJ10gPT09IGtleVxuICAgICAgKTtcbiAgICAgIGlmIChmaWVsZHMgJiYgZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgbGV0IHZhbHVlID0gJyc7XG4gICAgICAgICAgc3dpdGNoICh0eXBlb2YgbmV4dFtrZXldKSB7XG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgICAgdmFsdWUgPSBuZXh0W2tleV0gPyAnJmNoZWNrOycgOiAnJmNyb3NzOyc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBpZiAobmV4dFtrZXldPy50cmFuc2xhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IG5leHRba2V5XS50cmFuc2xhdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICh0cmFuc2xhdGlvbjogeyBsYW5ndWFnZUlkOiBhbnkgfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24ubGFuZ3VhZ2VJZCA9PT0gY3VycmVudExhbmd1YWdlSWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdHJhbnNsYXRpb24gPyB0cmFuc2xhdGlvbi52YWx1ZSA6IG51bGw7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBuZXh0W2tleV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkLmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0ZXBEaWN0aW9uYXJ5RGVwZW5kZW50SWRzLmZpbmQoKGEpID0+IGEgPT0ga2V5KSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmV4dFtrZXldPy5pZCAmJlxuICAgICAgICAgIChwcmV2ID09IG51bGwgfHwgcHJldltrZXldPy5pZCAhPT0gbmV4dFtrZXldPy5pZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5mb3JtbHlDb25maWdbMF0uZmllbGRHcm91cCA9IHRoaXMuZ2V0Rm9ybWx5RmlsdGVyZWRTdGVwcygpO1xuICAgICAgICAgIHZhciBmaWx0ZXJlZFN0ZXBzSWRlbnRpZmllcnMgPSB0aGlzLmZvcm1seUNvbmZpZ1swXS5maWVsZEdyb3VwLm1hcChcbiAgICAgICAgICAgIChmKSA9PiBmLnByb3BzPy5bJ3N0ZXBJZCddXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB2aXNpYmxlU3RlcHMgPSB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmZpbHRlclZpc2libGVTdGVwcyhcbiAgICAgICAgICAgIHRoaXMuZmx1eCxcbiAgICAgICAgICAgIGZpbHRlcmVkU3RlcHNJZGVudGlmaWVyc1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy51cGRhdGVGb3JtbHlDb25maWcoKTtcbiAgICAgICAgICB0aGlzLnZpc2libGVGaWVsZHNVcGRhdGVkLmVtaXQodmlzaWJsZVN0ZXBzKTtcbiAgICAgICAgICB0aGlzLmZvcm1seUNvbmZpZ1VwZGF0ZWQuZW1pdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYWJlbHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLmxhYmVsU2VydmljZVxuICAgICAgICAuZ2V0TGFiZWxzKHRoaXMuY3VycmVudExhbmd1YWdlSXNvLCBmYWxzZSlcbiAgICAgICAgLnN1YnNjcmliZSgobCkgPT4ge1xuICAgICAgICAgIHRoaXMubGFiZWxzID0gbDtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3B1bGF0ZUNvbnRyb2xJZHNXaXRoVmFsdWVEaWN0aW9uYXJ5KCkge1xuICAgIHZhciBjdXJyZW50TGFuZ3VhZ2VJZCA9IHRoaXMuZ2V0Q3VycmVudExhbmd1YWdlSWQoKTtcblxuICAgIC8vIEJ1aWxkIGRpY3Rpb25hcnkgZnJvbSBmaWxsRGF0YS5mbHV4IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHN0YXJ0IGVtcHR5XG4gICAgY29uc3QgY29udHJvbElkc1dpdGhWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB0aGlzLmZpbGxEYXRhPy5mbHV4XG4gICAgICA/IHRoaXMuZmlsbERhdGEuZmx1eFxuICAgICAgICAgIC5mbGF0TWFwKChzdGVwOiB7IHNlY3Rpb25zOiB7IGNvbnRyb2xzOiBhbnlbXSB9W10gfSkgPT5cbiAgICAgICAgICAgIHN0ZXAuc2VjdGlvbnMuZmxhdE1hcCgoc2VjdGlvbjogeyBjb250cm9sczogYW55W10gfSkgPT5cbiAgICAgICAgICAgICAgc2VjdGlvbi5jb250cm9sc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGNvbnRyb2wpID0+IGNvbnRyb2wuY29udHJvbElkICYmIGNvbnRyb2wuZmlsbFZhbHVlKVxuICAgICAgICAgICAgICAgIC5tYXAoKGNvbnRyb2wpID0+ICh7XG4gICAgICAgICAgICAgICAgICBjb250cm9sSWQ6IGNvbnRyb2wuY29udHJvbElkLFxuICAgICAgICAgICAgICAgICAgZmlsbFZhbHVlOiBjb250cm9sLmZpbGxWYWx1ZSxcbiAgICAgICAgICAgICAgICAgIGZpbGxWYWx1ZUlkOiBjb250cm9sLmZpbGxWYWx1ZUlkLFxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICBkaWN0aW9uYXJ5OiB7IFt4OiBzdHJpbmddOiBhbnkgfSxcbiAgICAgICAgICAgICAgeyBjb250cm9sSWQsIGZpbGxWYWx1ZSwgZmlsbFZhbHVlSWQgfTogYW55XG4gICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgaWYgKGZpbGxWYWx1ZUlkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCBkaWN0XSBvZiB0aGlzLmRpY3Rpb25hcnlNYXAuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRpY3QudmFsdWVzPy5maW5kKCh2KSA9PiB2LmlkID09IGZpbGxWYWx1ZUlkKTtcbiAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHZhbHVlLnZhbHVlVHJhbnNsYXRpb25zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgKHQpID0+IHQubGFuZ3VhZ2VJZCA9PSBjdXJyZW50TGFuZ3VhZ2VJZFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5W2NvbnRyb2xJZF0gPSB0cmFuc2xhdGlvbi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5W2NvbnRyb2xJZF0gPSBmaWxsVmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGRpY3Rpb25hcnk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICAgIClcbiAgICAgIDoge307XG5cbiAgICAvLyBHZXQgaW5pdEZsb3dWYWx1ZXMgZnJvbSBmaWxsRGF0YSBvciBmcm9tIGRpcmVjdCBpbnB1dCAodGhpcy5pbml0Rmxvd1ZhbHVlcylcbiAgICBsZXQgaW5pdEZsb3dWYWx1ZXMgPSB0aGlzLmZpbGxEYXRhPy5pbml0Rmxvd1ZhbHVlcztcblxuICAgIC8vIElmIG5vdCBpbiBmaWxsRGF0YSwgdHJ5IHRvIHBhcnNlIGZyb20gZGlyZWN0IGluaXRGbG93VmFsdWVzIGlucHV0XG4gICAgaWYgKCFpbml0Rmxvd1ZhbHVlcyAmJiB0aGlzLmluaXRGbG93VmFsdWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbml0Rmxvd1ZhbHVlcyA9XG4gICAgICAgICAgdHlwZW9mIHRoaXMuaW5pdEZsb3dWYWx1ZXMgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IEpTT04ucGFyc2UodGhpcy5pbml0Rmxvd1ZhbHVlcylcbiAgICAgICAgICAgIDogdGhpcy5pbml0Rmxvd1ZhbHVlcztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gcGFyc2UgaW5pdEZsb3dWYWx1ZXM6JywgZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWRkSW5pdEZsb3dWYWx1ZXMgPSAobm9kZTogYW55LCBwYXRoUGFydHM6IHN0cmluZ1tdKSA9PiB7XG4gICAgICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHBhdGhQYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29udHJvbElkc1dpdGhWYWx1ZXNbYGluaXRGbG93VmFsdWVzXyR7cGF0aFBhcnRzLmpvaW4oJ18nKX1gXSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICAgICAgbm9kZS5mb3JFYWNoKChjaGlsZCwgaWR4KSA9PlxuICAgICAgICAgIGFkZEluaXRGbG93VmFsdWVzKGNoaWxkLCBbLi4ucGF0aFBhcnRzLCBTdHJpbmcoaWR4KV0pXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBub2RlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBPYmplY3Qua2V5cyhub2RlKS5mb3JFYWNoKChrKSA9PlxuICAgICAgICAgIGFkZEluaXRGbG93VmFsdWVzKG5vZGVba10sIFsuLi5wYXRoUGFydHMsIGtdKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXRoUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb250cm9sSWRzV2l0aFZhbHVlc1tgaW5pdEZsb3dWYWx1ZXNfJHtwYXRoUGFydHMuam9pbignXycpfWBdID1cbiAgICAgICAgICBTdHJpbmcobm9kZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChpbml0Rmxvd1ZhbHVlcyAhPT0gbnVsbCAmJiBpbml0Rmxvd1ZhbHVlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZGRJbml0Rmxvd1ZhbHVlcyhpbml0Rmxvd1ZhbHVlcywgW10pO1xuICAgIH1cbiAgICB0aGlzLmNvbnRyb2xJZHNXaXRoVmFsdWVzID0gY29udHJvbElkc1dpdGhWYWx1ZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXRDdXJyZW50TGFuZ3VhZ2VJZCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZUlkID0gVXRpbHMuZmluZExhbmd1YWdlSWRCeUlzbyhcbiAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICApO1xuICAgIHJldHVybiBjdXJyZW50TGFuZ3VhZ2VJZDtcbiAgfVxuICBwcml2YXRlIGFzeW5jIGJ1aWxkRm9ybWx5Q29uZmlnQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGVwc1NldHRpbmdzID0ge1xuICAgICAgc2hvd0NvdW50ZXI6IHRoaXMuc2hvd0Rpc3BsYXlNb2RlXG4gICAgICAgID8gZmFsc2VcbiAgICAgICAgOiB0aGlzLmdlbmVyYWxEYXRhLnNob3dDb3VudGVyU3RlcCxcbiAgICAgIHNob3dMYWJlbHM6IHRoaXMuc2hvd0Rpc3BsYXlNb2RlID8gZmFsc2UgOiB0aGlzLmdlbmVyYWxEYXRhLnNob3dOYW1lU3RlcCxcbiAgICAgIHNob3dBbGxTdGVwczogdGhpcy5zaG93RGlzcGxheU1vZGVcbiAgICAgICAgPyBmYWxzZVxuICAgICAgICA6IHRoaXMuZ2VuZXJhbERhdGEuc2hvd0FsbFN0ZXBzLFxuICAgICAgc2hvd1Byb2dyZXNzQmFyOlxuICAgICAgICB0aGlzLmdlbmVyYWxEYXRhLnNob3dQcm9ncmVzc0JhciAmJlxuICAgICAgICAgIHRoaXMuZ2VuZXJhbERhdGEuc2hvd0FsbFN0ZXBzID09IGZhbHNlXG4gICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgdGhpcy5mb3JtbHlBbGxTdGVwcyA9IGF3YWl0IHRoaXMuYnVpbGRGb3JtbHlGaWVsZEdyb3VwQXN5bmMoKTtcbiAgICB2YXIgaGFzRGljdGlvbmFyeURlcGVuZGVudFN0ZXBzID0gdGhpcy5mb3JtbHlBbGxTdGVwcy5zb21lKFxuICAgICAgKGYpID0+IGYucHJvcHM/LlsnZGVwZW5kZW50RGljdGlvbmFyeSddPy5pc0RpY3Rpb25hcnlEZXBlbmRlbnRcbiAgICApO1xuXG4gICAgdmFyIGZvcm1seUZpbHRlcmVkU3RlcHMgPSB0aGlzLmdldEZvcm1seUZpbHRlcmVkU3RlcHMoKTtcbiAgICB2YXIgZmlsdGVyZWRTdGVwc0lkZW50aWZpZXJzID0gZm9ybWx5RmlsdGVyZWRTdGVwcy5tYXAoXG4gICAgICAoZikgPT4gZi5wcm9wcz8uWydzdGVwSWQnXVxuICAgICk7XG4gICAgLy8gR2V0IHZpc2libGUgc3RlcHMgZm9yIGFjY3VyYXRlIHN0ZXAgY291bnRpbmdcbiAgICBjb25zdCB2aXNpYmxlU3RlcHMgPSB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmZpbHRlclZpc2libGVTdGVwcyh0aGlzLmZsdXgpO1xuICAgIGNvbnN0IGZpbHRlcmVkVmlzaWJsZVN0ZXBzID0gdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5maWx0ZXJWaXNpYmxlU3RlcHMoXG4gICAgICB0aGlzLmZsdXgsXG4gICAgICBmaWx0ZXJlZFN0ZXBzSWRlbnRpZmllcnNcbiAgICApO1xuXG4gICAgdGhpcy5mb3JtbHlDb25maWcgPSBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdzdGVwcGVyJyxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuZmlsbERhdGFcbiAgICAgICAgICAgID8gdGhpcy5maWxsRGF0YT8ubWV0YWRhdGE/LmFwcERhdGFJZFxuICAgICAgICAgICAgOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ24sXG4gICAgICAgICAgYXBwbGljYXRpb25JZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICAgICAgZmx1eDogdmlzaWJsZVN0ZXBzLCAvLyBQYXNzIG9ubHkgdmlzaWJsZSBzdGVwcyB0byBzdGVwcGVyXG4gICAgICAgICAgZmlsdGVyZWRGbHV4OiBmaWx0ZXJlZFZpc2libGVTdGVwcyxcbiAgICAgICAgICBpc0Rpc3BsYXlNb2RlOiB0aGlzLnNob3dEaXNwbGF5TW9kZSxcbiAgICAgICAgICBmaWxsRGF0YTogdGhpcy5maWxsRGF0YSxcbiAgICAgICAgICBpbml0Rmxvd1ZhbHVlczogdGhpcy5pbml0Rmxvd1ZhbHVlcyxcbiAgICAgICAgICBkZWZhdWx0TGFuZ3VhZ2U6IHRoaXMuYXBwTW9kZWwuZ2VuZXJhbERhdGEuZGVmYXVsdExhbmd1YWdlLFxuICAgICAgICAgIGRpc3BsYXk6IHRoaXMuZGlzcGxheSxcbiAgICAgICAgICBkZXNpZ25Db25maWc6IHtcbiAgICAgICAgICAgIGJ1dHRvbnNWZXJ0aWNhbFBvc2l0aW9uOlxuICAgICAgICAgICAgICB0aGlzLmFwcE1vZGVsLmRlc2lnbi5idXR0b25zVmVydGljYWxQb3NpdGlvbixcbiAgICAgICAgICAgIGJ1dHRvbnNIb3Jpem9udGFsUG9zaXRpb246XG4gICAgICAgICAgICAgIHRoaXMuYXBwTW9kZWwuZGVzaWduLmJ1dHRvbnNIb3Jpem9udGFsUG9zaXRpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGVwc1NldHRpbmdzOiB0aGlzLnN0ZXBzU2V0dGluZ3MsXG4gICAgICAgICAgbWV0YURhdGE6IHRoaXMuZmlsbERhdGE/Lm1ldGFkYXRhLFxuICAgICAgICAgIGRlbW9Nb2RlOiB0aGlzLmlzRGVtb01vZGUsXG4gICAgICAgICAgaXNEZWJ1ZzogdGhpcy5pc0RlYnVnLFxuICAgICAgICAgIG5vQnV0dG9uc0luVmlldzogdGhpcy5ub0J1dHRvbnNJblZpZXcsXG4gICAgICAgICAgYmxvY2tQcmV2aW91c1N0ZXA6IHRoaXMuYmxvY2tQcmV2aW91c1N0ZXAsXG4gICAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgICBoYXNEaWN0aW9uYXJ5RGVwZW5kZW50U3RlcHM6IGhhc0RpY3Rpb25hcnlEZXBlbmRlbnRTdGVwcyxcbiAgICAgICAgICBoYXNBY3Rpb25TdGVwczogdGhpcy5mbHV4LnNvbWUoKHN0ZXApID0+XG4gICAgICAgICAgICB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmlzQWN0aW9uU3RlcChzdGVwKVxuICAgICAgICAgICksIC8vIEluZGljYXRlIGlmIHRoZXJlIGFyZSBhY3Rpb24gc3RlcHNcbiAgICAgICAgICBjb21wbGV0aW9uRXZlbnQ6ICgpID0+IHRoaXMub25Db21wbGV0aW9uKCksXG4gICAgICAgICAgb25TZWxlY3RlZFBhZ2VDaGFuZ2luZzogKGluZGV4OiBudW1iZXIpID0+XG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0ZWRQYWdlQ2hhbmdpbmcoaW5kZXgpLFxuICAgICAgICAgIG9uU2VsZWN0ZWRQYWdlQ2hhbmdlZDogKGluZGV4OiBudW1iZXIpID0+XG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0ZWRQYWdlQ2hhbmdlZChpbmRleCksXG4gICAgICAgIH0sXG4gICAgICAgIGZpZWxkR3JvdXA6IGZvcm1seUZpbHRlcmVkU3RlcHMsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICAvLyBGb3IgZGlzcGxheSBtb2RlLCBwb3B1bGF0ZSB2YWx1ZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgY29uZmlnIGlzIGJ1aWx0XG4gICAgaWYgKHRoaXMuc2hvd0Rpc3BsYXlNb2RlICYmIHRoaXMuZm9ybWx5Q29uZmlnWzBdPy5maWVsZEdyb3VwKSB7XG4gICAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgdGhpcy5mb3JtbHlDb25maWdbMF0uZmllbGRHcm91cCkge1xuICAgICAgICB0aGlzLnNldFByZXNlbnRhdGlvbkNvbnRyb2xWYWx1ZXNSZWN1cnNpdmVseShzdGVwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG9uU2VsZWN0ZWRQYWdlQ2hhbmdpbmcoc3RlcFRyYW5zaXRpb246IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxldCBmcm9tSW5kZXg6IG51bWJlcjtcbiAgICBsZXQgdG9JbmRleDogbnVtYmVyO1xuICAgIGxldCBjYWxsYmFjazogKCkgPT4gdm9pZCA9ICgpID0+IHsgfTtcblxuICAgIGlmICh0eXBlb2Ygc3RlcFRyYW5zaXRpb24gPT09ICdudW1iZXInKSB7XG4gICAgICB0b0luZGV4ID0gc3RlcFRyYW5zaXRpb247XG4gICAgICBmcm9tSW5kZXggPSB0aGlzLmFjdGl2ZVN0ZXA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZyb21JbmRleCA9IHN0ZXBUcmFuc2l0aW9uLmZyb207XG4gICAgICB0b0luZGV4ID0gc3RlcFRyYW5zaXRpb24udG87XG4gICAgICBjYWxsYmFjayA9IHN0ZXBUcmFuc2l0aW9uLmNhbGxiYWNrIHx8ICgoKSA9PiB7IH0pO1xuICAgIH1cblxuICAgIGxldCBhY3Rpb25zRXhlY3V0ZWQgPSBmYWxzZTtcblxuICAgIGlmICh0b0luZGV4ID4gZnJvbUluZGV4KSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ+Keoe+4jyBNb3ZpbmcgZm9yd2FyZCAtIGV4ZWN1dGluZyBhY3Rpb24gc3RlcHMgYWZ0ZXIgY3VycmVudCBzdGVwJ1xuICAgICAgKTtcbiAgICAgIGFjdGlvbnNFeGVjdXRlZCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUFjdGlvblN0ZXBzQWZ0ZXJDdXJyZW50U3RlcChcbiAgICAgICAgZnJvbUluZGV4XG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodG9JbmRleCA8IGZyb21JbmRleCkge1xuICAgICAgY29uc29sZS5sb2coJ+Kshe+4jyBNb3ZpbmcgYmFja3dhcmQgLSBubyBhY3Rpb24gZXhlY3V0aW9uIG5lZWRlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygn8J+UhCBTdGF5aW5nIG9uIHNhbWUgc3RlcCAtIG5vIGFjdGlvbiBleGVjdXRpb24gbmVlZGVkJyk7XG4gICAgfVxuXG4gICAgdGhpcy5hY3RpdmVTdGVwID0gdG9JbmRleDtcblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9uc0V4ZWN1dGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQWN0aW9uU3RlcHNBZnRlckN1cnJlbnRTdGVwKFxuICAgIGN1cnJlbnRTdGVwSW5kZXg6IG51bWJlclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5hY3Rpb25TdGVwSGFuZGxlci5pc0V4ZWN1dGluZ0FjdGlvbnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgZmlsdGVyZWRTdGVwcyA9IHRoaXMuZmx1eC5maWx0ZXIoKHMpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgcy5kZXBlbmRlbnREaWN0aW9uYXJ5ICYmXG4gICAgICAgIHMuZGVwZW5kZW50RGljdGlvbmFyeS5pc0RpY3Rpb25hcnlEZXBlbmRlbnRcbiAgICAgICkge1xuICAgICAgICBjb25zdCBtb2RlbFZhbHVlID0gdGhpcy5tb2RlbFtzLmRlcGVuZGVudERpY3Rpb25hcnkuZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyXTtcbiAgICAgICAgLy8gU2tpcCBkZXBlbmRlbmN5IGNoZWNrIGZvciBtdWx0aXBsZSBzZWxlY3Rpb24gKGFycmF5KVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlbFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVmFsdWUgPSBtb2RlbFZhbHVlPy5pZDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlbGVjdGVkVmFsdWUgJiZcbiAgICAgICAgICBzLmRlcGVuZGVudERpY3Rpb25hcnkuZGVwZW5kZW50VmFsdWVJZHMuaW5jbHVkZXMoc2VsZWN0ZWRWYWx1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhY3Rpb25TdGVwcyA9IHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZ2V0QWN0aW9uU3RlcHNBdEluZGV4KFxuICAgICAgZmlsdGVyZWRTdGVwcyxcbiAgICAgIGN1cnJlbnRTdGVwSW5kZXhcbiAgICApO1xuXG4gICAgaWYgKGFjdGlvblN0ZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmFwcERhdGFVdWlkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBzYXZpbmcgZmxhZyBiZWZvcmUgc3RhcnRpbmcgYWN0aW9uc1xuICAgICAgdGhpcy5pc1NhdmluZ0FmdGVyQWN0aW9ucyA9IHRydWU7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZXhlY3V0ZUFjdGlvblN0ZXBzKFxuICAgICAgICBhY3Rpb25TdGVwcyxcbiAgICAgICAgdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgKHN0ZXApID0+IHtcbiAgICAgICAgICBjb25zdCBsb2FkaW5nTWVzc2FnZSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgICAnbG9hZGluZ01lc3NhZ2VUcmFuc2xhdGlvbnMnLFxuICAgICAgICAgICAgc3RlcC50cmFuc2xhdGlvbnMsXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZSA9IGxvYWRpbmdNZXNzYWdlIHx8IG51bGw7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBjb25zb2xlLmxvZygn4pyFIEFjdGlvbiBzdGVwcyBleGVjdXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgLy8gS2VlcCBsb2FkaW5nIHN0YXRlIHRydWUgLSBpdCB3aWxsIGJlIGNsZWFyZWQgYWZ0ZXIgc2F2ZUFwcERhdGFTdGVwIGNvbXBsZXRlc1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBBY3Rpb24gc3RlcHMgZXhlY3V0aW9uIGZhaWxlZDonLCByZXN1bHQuZXJyb3IpO1xuICAgICAgICB0aGlzLmlzU2F2aW5nQWZ0ZXJBY3Rpb25zID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcign4p2MIEVycm9yIGV4ZWN1dGluZyBhY3Rpb24gc3RlcHM6JywgZXJyb3IpO1xuICAgICAgdGhpcy5pc1NhdmluZ0FmdGVyQWN0aW9ucyA9IGZhbHNlO1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVMZWFkaW5nQWN0aW9uU3RlcHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFwcERhdGFVdWlkIHx8ICF0aGlzLmZsdXggfHwgdGhpcy5mbHV4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxlYWRpbmdBY3Rpb25TdGVwcyA9XG4gICAgICB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmdldEFjdGlvblN0ZXBzQmVmb3JlRmlyc3RWaXNpYmxlU3RlcCh0aGlzLmZsdXgpO1xuXG4gICAgaWYgKGxlYWRpbmdBY3Rpb25TdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGDwn46sIEV4ZWN1dGluZyAke2xlYWRpbmdBY3Rpb25TdGVwcy5sZW5ndGh9IGxlYWRpbmcgYWN0aW9uIHN0ZXBzIGJlZm9yZSBmaXJzdCB2aXNpYmxlIHN0ZXBgXG4gICAgKTtcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5leGVjdXRlQWN0aW9uU3RlcHMoXG4gICAgICAgIGxlYWRpbmdBY3Rpb25TdGVwcyxcbiAgICAgICAgdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgKHN0ZXApID0+IHtcbiAgICAgICAgICBjb25zdCBsb2FkaW5nTWVzc2FnZSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgICAnbG9hZGluZ01lc3NhZ2VUcmFuc2xhdGlvbnMnLFxuICAgICAgICAgICAgc3RlcC50cmFuc2xhdGlvbnMsXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZSA9IGxvYWRpbmdNZXNzYWdlIHx8IG51bGw7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBjb25zb2xlLmxvZygn4pyFIExlYWRpbmcgYWN0aW9uIHN0ZXBzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcign4p2MIExlYWRpbmcgYWN0aW9uIHN0ZXBzIGZhaWxlZDonLCByZXN1bHQuZXJyb3IpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCfinYwgRXJyb3IgZXhlY3V0aW5nIGxlYWRpbmcgYWN0aW9uIHN0ZXBzOicsIGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblNlbGVjdGVkUGFnZUNoYW5nZWQoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmZvcm1seUNvbmZpZ1swXS5maWVsZEdyb3VwKSB7XG4gICAgICB2YXIgc2VsZWN0ZWRQYWdlID0gdGhpcy5mb3JtbHlDb25maWdbMF0uZmllbGRHcm91cFtpbmRleF07XG4gICAgICB0aGlzLnNldFByZXNlbnRhdGlvbkNvbnRyb2xWYWx1ZXNSZWN1cnNpdmVseShzZWxlY3RlZFBhZ2UpO1xuXG4gICAgICBNb2RlbFBvcHVsYXRpb25IZWxwZXIuYXBwbHlQcmVjb21wbGV0aW9uVG9Nb2RlbCh0aGlzLm1vZGVsLCB0aGlzLmZsdXgpO1xuICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUodGhpcy5tb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcmVzZW50YXRpb25Db250cm9sVmFsdWVzUmVjdXJzaXZlbHkoZmM/OiBhbnkpIHtcbiAgICBmYz8uZmllbGRHcm91cD8uZm9yRWFjaCgoZmc6IGFueSkgPT4ge1xuICAgICAgaWYgKGZnLnByb3BzICYmIGZnLnByb3BzWydpc0Rpc3BsYXlNb2RlJ10gPT09IHRydWUpIHtcbiAgICAgICAgdmFyIG1ldGhvZEZpZWxkSWQgPSBmZy5wcm9wc1snYXBpTWV0aG9kRmllbGRJZCddO1xuICAgICAgICBpZiAobWV0aG9kRmllbGRJZCkge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZmluZEluQXBpQ2FsbHNSZXNwb25zZXMobWV0aG9kRmllbGRJZCk7XG4gICAgICAgICAgZmcuZGVmYXVsdFZhbHVlID0gdmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBhc3NvY2lhdGVkQ29udHJvbElkID0gZmcucHJvcHNbJ2NvbGxlY3Rpb25Db250cm9sSWRlbnRpZmllciddO1xuICAgICAgICAgIGlmIChhc3NvY2lhdGVkQ29udHJvbElkKSB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZCA9XG4gICAgICAgICAgICAgIHRoaXMuZmluZENvbnRyb2xJbkZpbGxEYXRhQ29udHJvbHMoYXNzb2NpYXRlZENvbnRyb2xJZCk7XG4gICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgLy8gTXVsdGlwbGUgc2VsZWN0aW9uIC0gc2hvdyB2YWx1ZXMgd2l0aCBjb21tYVxuICAgICAgICAgICAgICBjb25zdCB2YWx1ZUlkc0FycmF5ID0gZm91bmQuZmlsbFZhbHVlSWRzIHx8IGZvdW5kLmZpbGx2YWx1ZWlkcyB8fCBmb3VuZC5GaWxsVmFsdWVJZHM7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlc0FycmF5ID0gZm91bmQuZmlsbFZhbHVlcyB8fCBmb3VuZC5maWxsdmFsdWVzIHx8IGZvdW5kLkZpbGxWYWx1ZXM7XG5cbiAgICAgICAgICAgICAgaWYgKHZhbHVlSWRzQXJyYXkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZUlkc0FycmF5KSAmJiB2YWx1ZUlkc0FycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2VJZCA9IHRoaXMuZ2V0Q3VycmVudExhbmd1YWdlSWQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWVJZCBvZiB2YWx1ZUlkc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBudW1lcmljVmFsdWVJZCA9IHR5cGVvZiB2YWx1ZUlkID09PSAnc3RyaW5nJyA/IHBhcnNlSW50KHZhbHVlSWQsIDEwKSA6IHZhbHVlSWQ7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRpY3RdIG9mIHRoaXMuZGljdGlvbmFyeU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkaWN0LnZhbHVlcz8uZmluZCgodikgPT4gdi5pZCA9PT0gbnVtZXJpY1ZhbHVlSWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHZhbHVlLnZhbHVlVHJhbnNsYXRpb25zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAodCkgPT4gdC5sYW5ndWFnZUlkID09IGN1cnJlbnRMYW5ndWFnZUlkXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWVzLnB1c2godHJhbnNsYXRpb24/LnZhbHVlIHx8IHZhbHVlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5VmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IGRpc3BsYXlWYWx1ZXMuam9pbignLCAnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVzQXJyYXkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZXNBcnJheSkgJiYgdmFsdWVzQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiB1c2UgZmlsbFZhbHVlcyBhcnJheSBkaXJlY3RseVxuICAgICAgICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IHZhbHVlc0FycmF5LmpvaW4oJywgJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm91bmQuZmlsbFZhbHVlSWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2VJZCA9IHRoaXMuZ2V0Q3VycmVudExhbmd1YWdlSWQoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRpY3RdIG9mIHRoaXMuZGljdGlvbmFyeU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGljdC52YWx1ZXM/LmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICh2KSA9PiB2LmlkID09IGZvdW5kLmZpbGxWYWx1ZUlkXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdmFsdWUudmFsdWVUcmFuc2xhdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAodCkgPT4gdC5sYW5ndWFnZUlkID09IGN1cnJlbnRMYW5ndWFnZUlkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IHRyYW5zbGF0aW9uLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IGZvdW5kLmZpbGxWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgY29udHJvbElkc1dpdGhWYWx1ZXMgZm9yIGluaXRGbG93VmFsdWVzXG4gICAgICAgICAgICAgIGNvbnN0IGluaXRGbG93VmFsdWUgPSB0aGlzLmNvbnRyb2xJZHNXaXRoVmFsdWVzPy5bYXNzb2NpYXRlZENvbnRyb2xJZF07XG4gICAgICAgICAgICAgIGlmIChpbml0Rmxvd1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBmZy5kZWZhdWx0VmFsdWUgPSBpbml0Rmxvd1ZhbHVlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZmluZEluQXBpQ2FsbHNSZXNwb25zZXMoYXNzb2NpYXRlZENvbnRyb2xJZCk7XG4gICAgICAgICAgICAgICAgZmcuZGVmYXVsdFZhbHVlID0gdmFsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFByZXNlbnRhdGlvbkNvbnRyb2xWYWx1ZXNSZWN1cnNpdmVseShmZyk7XG4gICAgICB9XG4gICAgICBpZiAoZmcucHJvcHNbJ2NkciddKSB7XG4gICAgICAgIGZnLnByb3BzWydjZHInXS5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRDb250cm9sSW5GaWxsRGF0YUNvbnRyb2xzKGNvbnRyb2xJZDogc3RyaW5nKTogYW55IHtcbiAgICBsZXQgY29udHJvbERhdGE6IGFueSA9IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5maWxsRGF0YSkge1xuICAgICAgdGhpcy5maWxsRGF0YS5mbHV4Py5mb3JFYWNoKChmOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFjb250cm9sRGF0YSkge1xuICAgICAgICAgIGYuc2VjdGlvbnM/LmZvckVhY2goKHM6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjb250cm9sRGF0YSkge1xuICAgICAgICAgICAgICBjb250cm9sRGF0YSA9IHMuY29udHJvbHM/LmZpbmQoXG4gICAgICAgICAgICAgICAgKGM6IGFueSkgPT4gYy5jb250cm9sSWQgPT09IGNvbnRyb2xJZFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoY29udHJvbERhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udHJvbERhdGE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sRGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEluQXBpQ2FsbHNSZXNwb25zZXMoZmllbGRJZDogc3RyaW5nKTogYW55IHtcbiAgICBsZXQgZm91bmRWYWx1ZTogYW55ID0gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmZpbGxEYXRhKSB7XG4gICAgICB0aGlzLmZpbGxEYXRhLkFQSUNhbGxzPy5mb3JFYWNoKChhcGk6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWZvdW5kVmFsdWUpIHtcbiAgICAgICAgICBhcGkuTWV0aG9kcz8uZm9yRWFjaCgobTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWZvdW5kVmFsdWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSBtLkZpZWxkcz8uW2ZpZWxkSWRdO1xuICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgICBmb3VuZFZhbHVlID0gZm91bmQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmb3VuZFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGb3JtbHlGaWx0ZXJlZFN0ZXBzKCkge1xuICAgIGxldCBzdGVwcyA9IHRoaXMuZm9ybWx5QWxsU3RlcHMuZmlsdGVyKChzKSA9PiB7XG4gICAgICBpZiAocy5wcm9wcyAmJiBzLnByb3BzWydkZXBlbmRlbnREaWN0aW9uYXJ5J10pIHtcbiAgICAgICAgY29uc3QgZGVwRGljdCA9IHMucHJvcHNbXG4gICAgICAgICAgJ2RlcGVuZGVudERpY3Rpb25hcnknXG4gICAgICAgIF0gYXMgRGVwZW5kZW50RGljdGlvbmFyeURhdGE7XG4gICAgICAgIGlmIChkZXBEaWN0ICYmIGRlcERpY3QuaXNEaWN0aW9uYXJ5RGVwZW5kZW50KSB7XG4gICAgICAgICAgY29uc3QgbW9kZWxWYWx1ZSA9IHRoaXMubW9kZWxbZGVwRGljdC5kaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXJdO1xuICAgICAgICAgIC8vIFNraXAgZGVwZW5kZW5jeSBjaGVjayBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uIChhcnJheSlcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlbFZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVmFsdWUgPSBtb2RlbFZhbHVlPy5pZDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzZWxlY3RlZFZhbHVlICYmXG4gICAgICAgICAgICBkZXBEaWN0LmRlcGVuZGVudFZhbHVlSWRzLmluY2x1ZGVzKHNlbGVjdGVkVmFsdWUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiBzdGVwcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRGb3JtbHlGaWVsZEdyb3VwQXN5bmMoKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZ1tdPiB7XG4gICAgdGhpcy5zdGVwRGljdGlvbmFyeURlcGVuZGVudElkcyA9IFtdO1xuICAgIGlmICh0aGlzLnNob3dEaXNwbGF5TW9kZSkge1xuICAgICAgY29uc3Qgc3RlcCA9IGF3YWl0IHRoaXMuYnVpZERpc3BsYXlTdGVwKCk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtzdGVwXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbHRlciBvdXQgYWN0aW9uIHN0ZXBzIGZyb20gdmlzaWJsZSBzdGVwc1xuICAgICAgY29uc3QgdmlzaWJsZVN0ZXBzID0gdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5maWx0ZXJWaXNpYmxlU3RlcHModGhpcy5mbHV4KTtcbiAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdmlzaWJsZVN0ZXBzLm1hcCgoc3RlcCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkRm9ybWx5RmllbGRDb25maWdBc3luYyhzdGVwKTtcbiAgICAgICAgfSkgPz8gW11cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEZvcm1seUZpZWxkQ29uZmlnQXN5bmMoXG4gICAgc3RlcDogU3RlcERhdGFcbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZz4ge1xuICAgIGxldCBzdGVwRm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZyA9IHt9O1xuXG4gICAgaWYgKHN0ZXAudHlwZSAhPT0gRmx1eFR5cGUuQ3VzdG9tICYmIHN0ZXAudHlwZSAhPT0gRmx1eFR5cGUuRmluYWwpIHtcbiAgICAgIHN0ZXBGb3JtbHlDb25maWcgPSBhd2FpdCB0aGlzLmJ1aWxkU3lzdGVtRmllbGRGb3JtbHlDb25maWcoc3RlcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ZXBGb3JtbHlDb25maWcgPSB7XG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgbGFiZWw6IHN0ZXAubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogc3RlcC5uYW1lLFxuICAgICAgICAgIGJ1dHRvbnM6IHRoaXMuY29uc3RydWN0QnV0dG9ucyhzdGVwLmJ1dHRvbnMpLFxuICAgICAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHN0ZXAuZGVwZW5kZW50RGljdGlvbmFyeSxcbiAgICAgICAgICBzdGVwSWQ6IHN0ZXAuaWRlbnRpZmllcixcbiAgICAgICAgfSxcbiAgICAgICAgZmllbGRHcm91cDogYXdhaXQgdGhpcy5idWlsZFNlY3Rpb25zRmllbGRHcm91cEFzeW5jKFxuICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgc3RlcC5zZWN0aW9uc1xuICAgICAgICApLFxuICAgICAgfTtcblxuICAgICAgaWYgKHN0ZXAudHJhbnNsYXRpb25zKSB7XG4gICAgICAgIHN0ZXBGb3JtbHlDb25maWcucHJvcHMhWydsYWJlbCddID0gVXRpbHMuZmluZFRyYW5zbGF0aW9uSW5mbyhcbiAgICAgICAgICAnbmFtZScsXG4gICAgICAgICAgc3RlcC50cmFuc2xhdGlvbnMsXG4gICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKTtcbiAgICAgICAgc3RlcEZvcm1seUNvbmZpZy5wcm9wcyFbJ2Rlc2NyaXB0aW9uJ10gPSBVdGlscy5maW5kVHJhbnNsYXRpb25JbmZvKFxuICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgc3RlcC50cmFuc2xhdGlvbnMsXG4gICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RlcEZvcm1seUNvbmZpZyAmJiBzdGVwRm9ybWx5Q29uZmlnLnByb3BzKSB7XG4gICAgICB0aGlzLnNldFN0ZXBCYXNlUHJvcHMoc3RlcCwgc3RlcEZvcm1seUNvbmZpZyk7XG4gICAgfVxuICAgIGlmIChzdGVwLmRlcGVuZGVudERpY3Rpb25hcnk/LmlzRGljdGlvbmFyeURlcGVuZGVudCkge1xuICAgICAgdGhpcy5zdGVwRGljdGlvbmFyeURlcGVuZGVudElkcy5wdXNoKFxuICAgICAgICBzdGVwLmRlcGVuZGVudERpY3Rpb25hcnkuZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcEZvcm1seUNvbmZpZztcbiAgfVxuXG4gIHRyaWdnZXJDb21wb25lbnRVcGRhdGUoY29udHJvbElkOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNldEZvcm1seUZpZWxkVmFsdWUodGhpcy5mb3JtbHlBbGxTdGVwcywgY29udHJvbElkLCB2YWx1ZSk7XG4gIH1cblxuICBzZXRGb3JtbHlGaWVsZFZhbHVlKFxuICAgIGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSB8IHVuZGVmaW5lZCxcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55XG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghZmllbGRzKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIGlmIChmaWVsZC5mb3JtQ29udHJvbCkge1xuICAgICAgICAgIGZpZWxkLmZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmllbGQuZmllbGRHcm91cCAmJiBBcnJheS5pc0FycmF5KGZpZWxkLmZpZWxkR3JvdXApKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5zZXRGb3JtbHlGaWVsZFZhbHVlKGZpZWxkLmZpZWxkR3JvdXAsIGtleSwgdmFsdWUpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRTeXN0ZW1GaWVsZEZvcm1seUNvbmZpZyhcbiAgICBzdGVwOiBTdGVwRGF0YVxuICApOiBQcm9taXNlPEZvcm1seUZpZWxkQ29uZmlnPiB7XG4gICAgY29uc3QgZm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZyA9IHtcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGxhYmVsOiBzdGVwLm5hbWUsXG4gICAgICAgIGJ1dHRvbnM6IHRoaXMuY29uc3RydWN0QnV0dG9ucyhzdGVwLmJ1dHRvbnMpLFxuICAgICAgICBmbHV4VHlwZTogc3RlcC50eXBlLFxuICAgICAgfSxcbiAgICAgIGZpZWxkR3JvdXA6IFtdLFxuICAgIH07XG5cbiAgICB0aGlzLnNldFN0ZXBCYXNlUHJvcHMoc3RlcCwgZm9ybWx5Q29uZmlnKTtcbiAgICB2YXIgZmllbGRDb25maWcgPSB0aGlzLmNyZWF0ZUZvcm1seVN5c3RlbUZpZWxkQ29uZmlnKHN0ZXApO1xuXG4gICAgaWYgKGZpZWxkQ29uZmlnKSB7XG4gICAgICBpZiAoc3RlcC50cmFuc2xhdGlvbnMpIHtcbiAgICAgICAgbGV0IGxhYmVsczogYW55ID0ge307XG4gICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLmZvckVhY2goKHRyOiBUcmFuc2xhdGlvbkluZm8pID0+IHtcbiAgICAgICAgICBsYWJlbHNbdHIubmFtZV0gPSBVdGlscy5maW5kVHJhbnNsYXRpb24oXG4gICAgICAgICAgICB0ci52YWx1ZXMsXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICBmaWVsZENvbmZpZy5wcm9wcyFbJ2xhYmVscyddID0gbGFiZWxzO1xuICAgICAgICBmaWVsZENvbmZpZy5wcm9wcyFbJ25hbWUnXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgJ25hbWUnLFxuICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG4gICAgICAgIGZpZWxkQ29uZmlnLnByb3BzIVsnZGVzY3JpcHRpb24nXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICBzdGVwLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApO1xuICAgICAgICBmb3JtbHlDb25maWcucHJvcHMhWydsYWJlbCddID0gVXRpbHMuZmluZFRyYW5zbGF0aW9uSW5mbyhcbiAgICAgICAgICAnbmFtZScsXG4gICAgICAgICAgc3RlcC50cmFuc2xhdGlvbnMsXG4gICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKTtcbiAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnZGVzY3JpcHRpb24nXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICBzdGVwLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZmllbGRDb25maWcucHJvcHMhWydzdGVwc1NldHRpbmdzJ10gPSB0aGlzLnN0ZXBzU2V0dGluZ3M7XG4gICAgICBmb3JtbHlDb25maWcuZmllbGRHcm91cCEucHVzaChmaWVsZENvbmZpZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1seUNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RlcEJhc2VQcm9wcyhzdGVwOiBTdGVwRGF0YSwgZm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZykge1xuICAgIGlmIChmb3JtbHlDb25maWcucHJvcHMpIHtcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wc1snbmFtZSddID0gc3RlcC5uYW1lO1xuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzWydmbHV4VHlwZSddID0gc3RlcC50eXBlO1xuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzWydzdGVwSWQnXSA9IHN0ZXAuaWRlbnRpZmllcjtcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wc1snaXNWaXNpYmxlJ10gPSBzdGVwLmlzVmlzaWJsZTtcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wc1snZGVwZW5kZW50RGljdGlvbmFyeSddID0gc3RlcC5kZXBlbmRlbnREaWN0aW9uYXJ5O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlU2lnbkZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXNpZ24tY29tcG9uZW50JyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ24sXG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGZsdXg6IHRoaXMuZmx1eCxcbiAgICAgICAgcGFyZW50Rm9ybTogdGhpcy5mb3JtLFxuICAgICAgICBnZXRNb2RlbDogKCkgPT4gdGhpcy5tb2RlbCxcbiAgICAgICAgZXZlbnQ6IGFzeW5jIChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50ID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RlcHBlckdvTmV4dEFzeW5jKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVEb3dubG9hZERvY3NGaWVsZENvbmZpZyhcbiAgICBjb250cm9sRGF0YTogQmFzZUNvbnRyb2xcbiAgKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LWRvd25sb2FkLWRvY3VtZW50cy1jb21wb25lbnQnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgYXBwSWQ6IHRoaXMuYXBwTW9kZWwuYXBwbGljYXRpb25VdWlkLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIGNvbnRyb2xEYXRhOiBjb250cm9sRGF0YSxcbiAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgZG9jdW1lbnRzRGF0YTogdGhpcy5hcHBNb2RlbC5kb2N1bWVudHMsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVWaWV3RG9jc0ZpZWxkQ29uZmlnKFxuICAgIGNvbnRyb2xEYXRhOiBCYXNlQ29udHJvbFxuICApOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktdmlldy1kb2N1bWVudHMtY29tcG9uZW50JyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGFwcElkOiB0aGlzLmFwcE1vZGVsLmFwcGxpY2F0aW9uVXVpZCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBjb250cm9sRGF0YTogY29udHJvbERhdGEsXG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGRvY3VtZW50c0RhdGE6IHRoaXMuYXBwTW9kZWwuZG9jdW1lbnRzLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlVXBsb2FkRG9jc0ZpZWxkQ29uZmlnKFxuICAgIGNvbnRyb2xEYXRhOiBCYXNlQ29udHJvbFxuICApOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktdXBsb2FkLWRvY3VtZW50cy1jb21wb25lbnQnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgYXBwSWQ6IHRoaXMuYXBwTW9kZWwuYXBwbGljYXRpb25VdWlkLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIGNvbnRyb2xEYXRhOiBjb250cm9sRGF0YSxcbiAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgZG9jdW1lbnRzRGF0YTogdGhpcy5hcHBNb2RlbC5kb2N1bWVudHMsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVHZW5lcmF0ZURvY3NGaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1nZW5lcmF0ZS1kb2N1bWVudHMtY29tcG9uZW50JyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGFwcElkOiB0aGlzLmFwcE1vZGVsLmFwcGxpY2F0aW9uVXVpZCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBzdGVwRGF0YTogc3RlcCxcbiAgICAgICAgZG9jdW1lbnRzRGF0YTogdGhpcy5hcHBNb2RlbC5kb2N1bWVudHMsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICBldmVudDogYXN5bmMgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQgPT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGVwcGVyR29OZXh0QXN5bmMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBhc3luYyBzdGVwcGVyR29OZXh0QXN5bmMoKSB7XG4gICAgY29uc3Qgc3RlcHBlckNvbXBvbmVudCA9IHRoaXMuZm9ybWx5Q29uZmlnWzBdLnByb3BzIVsnY29tcG9uZW50J107XG4gICAgaWYgKHN0ZXBwZXJDb21wb25lbnQgJiYgc3RlcHBlckNvbXBvbmVudC5uYXZpZ2F0ZU5leHRBc3luYykge1xuICAgICAgYXdhaXQgc3RlcHBlckNvbXBvbmVudC5uYXZpZ2F0ZU5leHRBc3luYygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlRW5yb2xsQ2FyZEZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIGxldCBsYWJlbHM6IGFueSA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHN0ZXAuY29uZmlnKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChrZXkuZW5kc1dpdGgoJ0xhYmVsJykpIHtcbiAgICAgICAgbGFiZWxzW2tleV0gPVxuICAgICAgICAgIHN0ZXA/LmNvbmZpZ1trZXldPy5maW5kKFxuICAgICAgICAgICAgKGk6IHsgbGFuZ3VhZ2VJc286IHN0cmluZyB9KSA9PlxuICAgICAgICAgICAgICBpLmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICk/LnZhbHVlID8/ICcnO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LWVucm9sLWNhcmQtY29tcG9uZW50JyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGFwcElkOiB0aGlzLmFwcE1vZGVsLmFwcGxpY2F0aW9uVXVpZCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBkYXRhVXJsSWQ6IHRoaXMuZGF0YVVybElkLFxuICAgICAgICBzdGVwRGF0YTogc3RlcCxcbiAgICAgICAgbGFiZWxzOiBsYWJlbHMsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgQ3JlYXRlSWRTY2FuRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgbGV0IGVycm9yTWVzc2FnZXM6IGFueSA9IHt9O1xuXG4gICAgaWYgKHN0ZXAuZXJyb3JzVHJhbnNsYXRpb25zKSB7XG4gICAgICBzdGVwLmVycm9yc1RyYW5zbGF0aW9ucy5mb3JFYWNoKChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIGVycm9yTWVzc2FnZXNbZXJyb3IuY29kZV0gPSBVdGlscy5maW5kVHJhbnNsYXRpb24oXG4gICAgICAgICAgZXJyb3IudHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1zY2FuLWlkJyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGNvbmZpZzogc3RlcC5jb25maWcsXG4gICAgICAgIHN0ZXBUeXBlOiBzdGVwLnR5cGUsXG4gICAgICAgIHN0ZXBJZDogc3RlcC5pZGVudGlmaWVyLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQgfHwgVXRpbHMuZ2VuZXJhdGVVVUlEKCksXG4gICAgICAgIGFwcElkOiB0aGlzLmFwcE1vZGVsLmFwcGxpY2F0aW9uVXVpZCxcbiAgICAgICAgZXJyb3JNZXNzYWdlczogZXJyb3JNZXNzYWdlcyxcbiAgICAgICAgZXZlbnQ6IChldmVudDogYW55KSA9PiB0aGlzLm9uSWRTY2FuQ29tcGxldGVkKGV2ZW50LCBzdGVwKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlS3ljRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgY29uc3QgbG9hZGluZ01zZ1RyYW5zbGF0aW9ucyA9IHN0ZXAudHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgKHQ6IGFueSkgPT4gdC5uYW1lID09PSAnbG9hZGluZ01lc3NhZ2VUcmFuc2xhdGlvbnMnXG4gICAgKTtcblxuICAgIGNvbnN0IHRyYW5zbGF0ZWRMb2FkaW5nTWVzc2FnZSA9XG4gICAgICBsb2FkaW5nTXNnVHJhbnNsYXRpb25zPy52YWx1ZXM/LmZpbmQoXG4gICAgICAgICh2OiBhbnkpID0+IHYubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICApPy52YWx1ZSB8fCAnJztcblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LWlkZW50aWZpY2F0aW9uLWNvbXBvbmVudCcsXG4gICAgICBwcm9wczoge1xuICAgICAgICB0b2tlbjogdGhpcy5reWNUb2tlbixcbiAgICAgICAgYXBpX3VybDogdGhpcy5reWNBcGlVcmwsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgZW52OiAnRE9DS0VSJywgLy8gQ29uc2lkZXIgbWFraW5nIHRoaXMgZHluYW1pYyBpZiBuZWVkZWRcbiAgICAgICAgcmVkaXJlY3RfaWQ6IHRoaXMua3ljUmVkaXJlY3RJZCxcbiAgICAgICAgcGhvbmVfbnVtYmVyOiAnJyxcbiAgICAgICAgbGFuZ19pc286IHRoaXMua3ljTGFuZ0lzbyxcbiAgICAgICAgc2hvd19jaXRpemVuc2hpcF9zZWxlY3RvcjogdGhpcy5reWNTaG93Q2l0aXplbnNoaXAsXG4gICAgICAgIHNjcm9sbF9tb2RlOiB0aGlzLmt5Y1Njcm9sbE1vZGUsXG4gICAgICAgIG1heFJldHJpZXM6IHN0ZXAuY29uZmlnPy5tYXhLeWNSZXRyaWVzID8/IDMsXG4gICAgICAgIGxvYWRpbmdNZXNzYWdlOiB0cmFuc2xhdGVkTG9hZGluZ01lc3NhZ2UsXG4gICAgICAgIGVjdENvbXBsZXRlZDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2UgPSB0cmFuc2xhdGVkTG9hZGluZ01lc3NhZ2U7XG4gICAgICAgICAgYXdhaXQgdGhpcy5vcmlnaW5Gb3JtU2lnbmFsckhhbmRsZXJTZXJ2aWNlLmluaXRpYXRlS3ljUHJvY2Vzc2luZyhcbiAgICAgICAgICAgIHRoaXMuYXBwRGF0YVV1aWRcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVQaG9uZUVtYWlsRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktdmFsaWRhdGUtY29udGFjdC1pbmZvJyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIHN0ZXBEYXRhOiBzdGVwLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ24sXG4gICAgICAgIGV2ZW50OiBhc3luYyAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChldmVudCA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0ZXBwZXJHb05leHRBc3luYygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlVmlld09mZmVyRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktdmlldy1vZmZlcnMnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBzdGVwRGF0YTogc3RlcCxcbiAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgYXBwTW9kZWw6IHRoaXMuYXBwTW9kZWwsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICBldmVudDogKGV2ZW50OiBhbnkpID0+IHRoaXMub25PZmZlclNlbGVjdGVkKGV2ZW50LCBzdGVwKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlUGF1c2VGaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1maWVsZC1wYXVzZScsXG4gICAgICBwcm9wczoge1xuICAgICAgICBpZGVudGlmaWVyOiBzdGVwLmlkZW50aWZpZXIsXG4gICAgICAgIGNvbmZpZzogc3RlcC5jb25maWcsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGFwcE1vZGVsOiB0aGlzLmFwcE1vZGVsLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlT3BlbkJhbmtpbmdGaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICAvLyBQYXNzIHRoZSBmdWxsIHN0ZXAgZGF0YSB3aGljaCBpbmNsdWRlcyBhbGwgdHJhbnNsYXRpb25zXG4gICAgLy8gVGhlIGNvbXBvbmVudCB3aWxsIGV4dHJhY3Qgd2hhdCBpdCBuZWVkcyBiYXNlZCBvbiBjdXJyZW50IGxhbmd1YWdlXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktb3Blbi1iYW5raW5nJyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGlkZW50aWZpZXI6IHN0ZXAuaWRlbnRpZmllcixcbiAgICAgICAgY29uZmlnOiBzdGVwLmNvbmZpZyxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBzdGVwRGF0YTogc3RlcCwgLy8gVGhpcyBjb250YWlucyB0aGUgZnVsbCB0cmFuc2xhdGlvbnMgYXJyYXlcbiAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgYXBwTW9kZWw6IHRoaXMuYXBwTW9kZWwsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICBsYWJlbHM6IHtcbiAgICAgICAgICBpbml0aWFsTWVzc2FnZTogVXRpbHMuZmluZFRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgc3RlcC5jb25maWc/LmluaXRpYWxNZXNzYWdlVHJhbnNsYXRpb25zIHx8IFtdLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApLFxuICAgICAgICAgIHdhaXRpbmdNZXNzYWdlOiBVdGlscy5maW5kVHJhbnNsYXRpb24oXG4gICAgICAgICAgICBzdGVwLmNvbmZpZz8ud2FpdGluZ01lc3NhZ2VUcmFuc2xhdGlvbnMgfHwgW10sXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICksXG4gICAgICAgICAgY29uc2VudEVycm9yTWVzc2FnZTogVXRpbHMuZmluZFRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgc3RlcC5jb25maWc/LmNvbnNlbnRFcnJvck1lc3NhZ2VUcmFuc2xhdGlvbnMgfHwgW10sXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICksXG4gICAgICAgICAgY29tcGxldGlvbk1lc3NhZ2U6IFV0aWxzLmZpbmRUcmFuc2xhdGlvbihcbiAgICAgICAgICAgIHN0ZXAuY29uZmlnPy5jb21wbGV0aW9uTWVzc2FnZVRyYW5zbGF0aW9ucyB8fCBbXSxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKSxcbiAgICAgICAgICByZXRyeUJ1dHRvbkxhYmVsOiBVdGlscy5maW5kVHJhbnNsYXRpb24oXG4gICAgICAgICAgICBzdGVwLmNvbmZpZz8ucmV0cnlCdXR0b25MYWJlbFRyYW5zbGF0aW9ucyB8fCBbXSxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnQ6IChldmVudDogYW55KSA9PiB0aGlzLm9uT3BlbkJhbmtpbmdFdmVudChldmVudCwgc3RlcCksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZVN0YXR1c0ZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXN0YXR1cycsXG4gICAgICBwcm9wczoge1xuICAgICAgICBjb25maWc6IHN0ZXAuY29uZmlnLFxuICAgICAgICBzdGVwRGF0YTogc3RlcCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZvcm1seVN5c3RlbUZpZWxkQ29uZmlnKFxuICAgIHN0ZXA6IFN0ZXBEYXRhXG4gICk6IEZvcm1seUZpZWxkQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBzd2l0Y2ggKHN0ZXAudHlwZSkge1xuICAgICAgY2FzZSBGbHV4VHlwZS5LeWM6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVLeWNGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRmx1eFR5cGUuRW1haWw6XG4gICAgICBjYXNlIEZsdXhUeXBlLlBob25lOiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZVBob25lRW1haWxGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuQWN0aW9uOiB7XG4gICAgICAgIC8vIEFjdGlvbiBzdGVwcyBhcmUgbm93IGhhbmRsZWQgYXV0b21hdGljYWxseSBieSBBY3Rpb25TdGVwSGFuZGxlclxuICAgICAgICAvLyBUaGV5IHNob3VsZCBub3QgYXBwZWFyIGFzIHZpc2libGUgZm9ybWx5IGNvbXBvbmVudHNcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuSWRTY2FuOiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZUlkU2NhbkZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5HZW5lcmF0ZURvY3VtZW50OiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZUdlbmVyYXRlRG9jc0ZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5TaWduOiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZVNpZ25GaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuVmlld09mZmVyOiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZVZpZXdPZmZlckZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5TdGF0dXM6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlU3RhdHVzRmllbGRDb25maWcoc3RlcCk7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLkVVUExBVEVTQzoge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVFbnJvbGxDYXJkRmllbGRDb25maWcoc3RlcCk7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLk5FVE9QSUE6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlRW5yb2xsQ2FyZEZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5QYXVzZToge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVQYXVzZUZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5PcGVuQmFua2luZzoge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVPcGVuQmFua2luZ0ZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgb25PZmZlclNlbGVjdGVkKG9mZmVySWQ6IGFueSwgc3RlcDogU3RlcERhdGEpIHtcbiAgICB0aGlzLmZvcm1seVVwZGF0ZUFuZEdvTmV4dC5lbWl0KHsgc2VsZWN0ZWRPZmZlcklkOiBvZmZlcklkIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvblNpZ25FdmVudChldmVudDogYW55LCBzdGVwOiBTdGVwRGF0YSkge1xuICAgIGNvbnNvbGUubG9nKCdTaWduIGV2ZW50IHJlY2VpdmVkOicsIGV2ZW50KTtcbiAgICB0aGlzLnVwZGF0ZVN0ZXBCdXR0b25TdGF0ZShzdGVwKTtcbiAgfVxuXG4gIHByaXZhdGUgb25PcGVuQmFua2luZ0V2ZW50KGV2ZW50OiBhbnksIHN0ZXA6IFN0ZXBEYXRhKSB7XG4gICAgY29uc29sZS5sb2coJ09wZW5CYW5raW5nIGV2ZW50IHJlY2VpdmVkOicsIGV2ZW50KTtcbiAgICBpZiAoZXZlbnQgPT09ICdzdWNjZXNzJykge1xuICAgICAgLy8gT3BlbiBCYW5raW5nIGZsb3cgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuICAgICAgdGhpcy51cGRhdGVTdGVwQnV0dG9uU3RhdGUoc3RlcCk7XG4gICAgICAvLyBBdXRvLXByb2NlZWQgdG8gbmV4dCBzdGVwXG4gICAgICB0aGlzLmZvcm1seVVwZGF0ZUFuZEdvTmV4dC5lbWl0KHt9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uSWRTY2FuQ29tcGxldGVkKGV2ZW50OiBhbnksIHN0ZXA6IFN0ZXBEYXRhKSB7XG4gICAgY29uc29sZS5sb2coJ1NpZ24gZXZlbnQgcmVjZWl2ZWQ6JywgZXZlbnQpO1xuICAgIGNvbnN0IGZpbGxEYXRhID0gSlNPTi5wYXJzZShldmVudC5maWxsRGF0YSk7XG4gICAgY29uc3Qgc3RlcEZpbGxEYXRhID0gZmlsbERhdGEuZmx1eC5maW5kKFxuICAgICAgKHM6IHsgc3RlcElkOiBzdHJpbmcgfSkgPT4gcy5zdGVwSWQgPT0gc3RlcC5pZGVudGlmaWVyXG4gICAgKTtcbiAgICBzdGVwRmlsbERhdGEuc2VjdGlvbnMuZm9yRWFjaChcbiAgICAgIChzOiB7XG4gICAgICAgIGNvbnRyb2xzOiB7XG4gICAgICAgICAgY29udHJvbElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgZmlsbFZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIH1bXTtcbiAgICAgIH0pID0+IHtcbiAgICAgICAgcy5jb250cm9scy5mb3JFYWNoKFxuICAgICAgICAgIChjOiB7XG4gICAgICAgICAgICBjb250cm9sSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGZpbGxWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIH0pID0+IHtcbiAgICAgICAgICAgIGlmIChjLmNvbnRyb2xJZCkge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHtcbiAgICAgICAgICAgICAgICBbYy5jb250cm9sSWRdOiB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogYy5maWxsVmFsdWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtLmNvbnRhaW5zKGMuY29udHJvbElkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChjLmNvbnRyb2xJZCwgbmV3IEZvcm1Db250cm9sKGMuZmlsbFZhbHVlKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMudXBkYXRlU3RlcEJ1dHRvblN0YXRlKHN0ZXApO1xuICB9XG5cbiAgdXBkYXRlU3RlcEJ1dHRvblN0YXRlKHN0ZXA6IFN0ZXBEYXRhKSB7XG4gICAgbGV0IGZvcm1seVN0ZXBGaWVsZCA9IHRoaXMuZm9ybWx5Q29uZmlnWzBdLmZpZWxkR3JvdXA/LmZpbmQoKGZpZWxkKSA9PlxuICAgICAgZmllbGQuZmllbGRHcm91cD8uZmluZCgoZikgPT4gZi5wcm9wcz8uWydzdGVwSWQnXSA9PT0gc3RlcC5pZGVudGlmaWVyKVxuICAgICk7XG5cbiAgICBpZiAoIWZvcm1seVN0ZXBGaWVsZCkge1xuICAgICAgZm9ybWx5U3RlcEZpZWxkID0gdGhpcy5mb3JtbHlDb25maWdbMF0uZmllbGRHcm91cD8uZmluZChcbiAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5wcm9wcz8uWydzdGVwSWQnXSA9PT0gc3RlcC5pZGVudGlmaWVyXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChmb3JtbHlTdGVwRmllbGQpIHtcbiAgICAgIGZvcm1seVN0ZXBGaWVsZC5wcm9wcyA9IHtcbiAgICAgICAgLi4uZm9ybWx5U3RlcEZpZWxkLnByb3BzLFxuICAgICAgICBidXR0b25zRGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gICAgICB0aGlzLmZvcm1seUNvbmZpZ1VwZGF0ZWQuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkUmVuZGVyZWRDc3MoKSB7XG4gICAgY29uc3Qgc3R5bGVTdHJpbmcgPSBGb3JtQ3NzSGVscGVyLmNvbnZlcnRUb1N0eWxlU3RyaW5nKFxuICAgICAgdGhpcy5kZXNpZ24sXG4gICAgICB0aGlzLnNob3dEaXNwbGF5TW9kZVxuICAgICk7XG5cbiAgICBjb25zdCBzdHlsZUVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGVFbGVtZW50LmlkID0gJ3JlbmRlcmVkLWNzcyc7XG4gICAgY29uc3QgcmVuZEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbmRlcmVkLWNzcycpO1xuICAgIGlmIChyZW5kRWwpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQoZG9jdW1lbnQuYm9keSwgcmVuZEVsKTtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChcbiAgICAgIHN0eWxlRWxlbWVudCxcbiAgICAgIHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChVdGlscy5yZW1vdmVOZXdMaW5lcyhzdHlsZVN0cmluZykpXG4gICAgKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmJvZHksIHN0eWxlRWxlbWVudCk7XG4gIH1cblxuICBhc3luYyBidWlsZFNlY3Rpb25zRmllbGRHcm91cEFzeW5jKFxuICAgIHN0ZXA6IFN0ZXBEYXRhIHwgdW5kZWZpbmVkLFxuICAgIHNlY3Rpb25zOiBTZWN0aW9uRGF0YVtdXG4gICk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWdbXT4ge1xuICAgIGNvbnN0IHN0ZXBTZWN0aW9uczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBzZWN0aW9ucyAmJiBpbmRleCA8IHNlY3Rpb25zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3Qgc2VjdGlvbiA9IHNlY3Rpb25zW2luZGV4XTtcbiAgICAgIGxldCBzZXBhcmF0b3JGb3JtbHlDb25maWc6IGFueSA9IHt9O1xuICAgICAgaWYgKHNlY3Rpb24uc2hvd1NlY3Rpb25UaXRsZSkge1xuICAgICAgICBzZXBhcmF0b3JGb3JtbHlDb25maWcgPSB7XG4gICAgICAgICAgdHlwZTogJ3NlcGFyYXRvcicsXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIHRpdGxlOlxuICAgICAgICAgICAgICBzZWN0aW9uLnRyYW5zbGF0aW9ucz8uZmluZChcbiAgICAgICAgICAgICAgICAodDogYW55KSA9PiB0Lmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICAgICApPy52YWx1ZSA/PyAnJyxcblxuICAgICAgICAgICAgZGVzaWduOiB0aGlzLmRlc2lnbixcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VjdGlvbi5zaG93U2VjdGlvblNlcGFyYXRvcikge1xuICAgICAgICBzZXBhcmF0b3JGb3JtbHlDb25maWcgPSB7XG4gICAgICAgICAgLi4uc2VwYXJhdG9yRm9ybWx5Q29uZmlnLFxuICAgICAgICAgIHR5cGU6ICdzZXBhcmF0b3InLFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAuLi5zZXBhcmF0b3JGb3JtbHlDb25maWcucHJvcHMsXG4gICAgICAgICAgICBzaG93U2VwYXJhdG9yOiBzZWN0aW9uLnNob3dTZWN0aW9uU2VwYXJhdG9yLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWN0aW9uLmRlcGVuZGVudERpY3Rpb25hcnkpIHtcbiAgICAgICAgdGhpcy5hdHRhY2hUb0RlcGVuZGVudERpY3Rpb25hcnlJZk5lY2Vzc2FyeShcbiAgICAgICAgICBzZWN0aW9uLmRlcGVuZGVudERpY3Rpb25hcnksXG4gICAgICAgICAgc2VwYXJhdG9yRm9ybWx5Q29uZmlnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzdGVwU2VjdGlvbnMucHVzaChzZXBhcmF0b3JGb3JtbHlDb25maWcpO1xuXG4gICAgICBjb25zdCBzZWN0aW9uRm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZyA9IHtcbiAgICAgICAgdHlwZTogJ2N1c3RvbS1zZWN0aW9uJyxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICBsYWJlbDogc2VjdGlvbi50aXRsZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIHNlY3Rpb24udHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgICAgICAgICAodDogYW55KSA9PiB0Lmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICAgKT8udmFsdWUgPz8gJycsXG4gICAgICAgICAgZGVzaWduOiB0aGlzLmRlc2lnbixcbiAgICAgICAgfSxcbiAgICAgICAgZmllbGRHcm91cDogYXdhaXQgdGhpcy5idWlsZENvbnRyb2xzRmllbGRHcm91cEFzeW5jKFxuICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgc2VjdGlvbi5jb250cm9scyB8fCBbXSxcbiAgICAgICAgICBzZWN0aW9uLnByZXNlbnRhdGlvbkNvbnRyb2xzIHx8IFtdXG4gICAgICAgICksXG4gICAgICAgIGZpZWxkR3JvdXBDbGFzc05hbWU6ICdkaXNwbGF5LWZsZXgnLFxuICAgICAgfTtcbiAgICAgIGlmIChzZWN0aW9uLmRlcGVuZGVudERpY3Rpb25hcnkpIHtcbiAgICAgICAgdGhpcy5hdHRhY2hUb0RlcGVuZGVudERpY3Rpb25hcnlJZk5lY2Vzc2FyeShcbiAgICAgICAgICBzZWN0aW9uLmRlcGVuZGVudERpY3Rpb25hcnksXG4gICAgICAgICAgc2VjdGlvbkZvcm1seUNvbmZpZ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBzdGVwU2VjdGlvbnMucHVzaChzZWN0aW9uRm9ybWx5Q29uZmlnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RlcFNlY3Rpb25zO1xuICB9XG5cbiAgYXN5bmMgYnVpZERpc3BsYXlTdGVwKCk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWc+IHtcbiAgICBsZXQgc3RlcEZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7fTtcbiAgICBpZiAodGhpcy5kaXNwbGF5Py5zZWN0aW9ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgc3RlcEZvcm1seUNvbmZpZyA9IHtcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAvLyBsYWJlbDogc3RlcC5uYW1lLFxuICAgICAgICAgIC8vIGJ1dHRvbnM6IHRoaXMuY29uc3RydWN0QnV0dG9ucyhzdGVwLmJ1dHRvbnMpLFxuICAgICAgICAgIC8vICBkZXBlbmRlbnREaWN0aW9uYXJ5OiBzdGVwLmRlcGVuZGVudERpY3Rpb25hcnksXG4gICAgICAgIH0sXG4gICAgICAgIGZpZWxkR3JvdXA6IGF3YWl0IHRoaXMuYnVpbGRTZWN0aW9uc0ZpZWxkR3JvdXBBc3luYyhcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdGhpcy5kaXNwbGF5LnNlY3Rpb25zXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gc3RlcEZvcm1seUNvbmZpZztcbiAgfVxuXG4gIGFkZE5ld1Jvd1RvRm9ybUZpZWxkc0lmTmVjZXNzYXJ5KFxuICAgIGZpZWxkR3JvdXA6IEZvcm1seUZpZWxkQ29uZmlnW10sXG4gICAgbmV3Um93OiBGb3JtbHlGaWVsZENvbmZpZ1xuICApIHtcbiAgICBpZiAobmV3Um93LmZpZWxkR3JvdXAgJiYgbmV3Um93LmZpZWxkR3JvdXAubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jYWxjdWxhdGVGb3JtRmllbGRzV2lkdGgobmV3Um93LmZpZWxkR3JvdXApO1xuICAgICAgZmllbGRHcm91cC5wdXNoKG5ld1Jvdyk7XG4gICAgfVxuICB9XG5cbiAgY2FsY3VsYXRlRm9ybUZpZWxkc1dpZHRoKGZvcm1GaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10pIHtcbiAgICBjb25zdCBjb2xXaWR0aFBlckl0ZW0gPSAxMiAvIGZvcm1GaWVsZHMubGVuZ3RoO1xuICAgIGZvcm1GaWVsZHMuZm9yRWFjaCgoZikgPT4ge1xuICAgICAgZi5jbGFzc05hbWUgPSAnY29sLScgKyBjb2xXaWR0aFBlckl0ZW07XG4gICAgfSk7XG4gIH1cblxuICBnZXRQZXJjZW50YWdlQ2xhc3NOYW1lKHBlcmNlbnRhZ2VEaW1lbnNpb246IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgdG90YWxDb2x1bW5zID0gMTI7IC8vIDEyLWNvbHVtbiBncmlkXG4gICAgY29uc3Qgc3BhbiA9IE1hdGgucm91bmQoKHBlcmNlbnRhZ2VEaW1lbnNpb24gLyAxMDApICogdG90YWxDb2x1bW5zKTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBgcGVyY2VudGFnZS13aWR0aC0ke3NwYW59YDtcblxuICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2xhc3NOYW1lKSkge1xuICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgc3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgICBzdHlsZS5pZCA9IGNsYXNzTmFtZTtcbiAgICAgIHN0eWxlLmlubmVySFRNTCA9IGBcbiAgICAgICAgLiR7Y2xhc3NOYW1lfSB7XG4gICAgICAgICAgZ3JpZC1jb2x1bW46IHNwYW4gJHtzcGFufTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NOYW1lO1xuICB9XG5cbiAgY3JlYXRlRmlsbGVyQ29udHJvbChzcGFuOiBudW1iZXIpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdyb3ctZmlsbGVyJyxcbiAgICAgIGNsYXNzTmFtZTogYHBlcmNlbnRhZ2Utd2lkdGgtJHtzcGFufWAsXG4gICAgICBwcm9wczoge1xuICAgICAgICBsYWJlbDogJycsXG4gICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICBoaWRlOiB0cnVlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZENvbnRyb2xzRmllbGRHcm91cEFzeW5jKFxuICAgIHN0ZXA6IFN0ZXBEYXRhIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRyb2xzOiBDb250cm9sRGF0YVtdLFxuICAgIHByZXNlbnRhdGlvbkNvbnRyb2xzOiBQcmVzZW50YXRpb25Db250cm9sW11cbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZ1tdPiB7XG4gICAgY29uc3QgcmVzdWx0OiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XG4gICAgbGV0IHJvd0l0ZW1zOiAoQ29udHJvbERhdGEgfCBQcmVzZW50YXRpb25Db250cm9sKVtdID0gW107XG4gICAgY29udHJvbHMgPSBjb250cm9scy5maWx0ZXIoKGMpID0+ICFjLmlzT25seUZvckNvbmZpZyk7XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGNvbnRyb2xzIHRoYXQgYXJlIGluY29tcGxldGVcbiAgICBjb250cm9scyA9IGNvbnRyb2xzLmZpbHRlcigoYykgPT4ge1xuICAgICAgLy8gU2tpcCBjb250cm9scyB0aGF0IGFyZSBtaXNzaW5nIGVzc2VudGlhbCBkYXRhXG4gICAgICBpZiAoXG4gICAgICAgIGMudHlwZSA9PT0gU3RlcENvbnRyb2xUeXBlLkRpY3Rpb25hcnkgJiZcbiAgICAgICAgIWMuc3BlY2lmaWNDb250cm9sRGF0YT8uZGljdGlvbmFyeVVVSURcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9jZXNzUm93ID0gYXN5bmMgKFxuICAgICAgaXRlbXM6IChDb250cm9sRGF0YSB8IFByZXNlbnRhdGlvbkNvbnRyb2wpW11cbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xuICAgICAgY29uc3QgdG90YWwgPSAxMjtcbiAgICAgIGNvbnN0IGJ1aWx0OiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XG4gICAgICBjb25zdCBhdXRvOiB7XG4gICAgICAgIGM6IENvbnRyb2xEYXRhIHwgUHJlc2VudGF0aW9uQ29udHJvbDtcbiAgICAgICAgZjogRm9ybWx5RmllbGRDb25maWc7XG4gICAgICB9W10gPSBbXTtcbiAgICAgIGxldCB1c2VkID0gMDtcbiAgICAgIGZvciAoY29uc3QgaSBvZiBpdGVtcykge1xuICAgICAgICBpZiAoJ2NvbGxlY3Rpb25Db250cm9sSWRlbnRpZmllcicgaW4gaSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGJ1aWx0LnB1c2goXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmJ1aWxkUHJlc2VudGF0aW9uRm9ybUZpZWxkQXN5bmMoXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIGkgYXMgUHJlc2VudGF0aW9uQ29udHJvbFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoJ2FwaU1ldGhvZElkJyBpbiBpID09PSB0cnVlKSB7XG4gICAgICAgICAgYnVpbHQucHVzaChcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYnVpbGRBcGlNZXRob2RGb3JtRmllbGRBc3luYyhcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgaSBhcyBQcmVzZW50YXRpb25Db250cm9sXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWlsdC5wdXNoKGF3YWl0IHRoaXMuYnVpbGRGb3JtRmllbGRBc3luYyhzdGVwLCBpIGFzIENvbnRyb2xEYXRhKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IGl0ZW1zW2ldO1xuICAgICAgICBjb25zdCBmID0gYnVpbHRbaV07XG4gICAgICAgIGlmIChjLmRpbWVuc2lvblR5cGUgPT09IERpbWVuc2lvblR5cGUuUGVyY2VudGFnZSkge1xuICAgICAgICAgIGlmIChjLmF1dG9EaW1lbnNpb24pIHtcbiAgICAgICAgICAgIGF1dG8ucHVzaCh7IGMsIGYgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBNYXRoLnJvdW5kKChjLmRpbWVuc2lvbiAvIDEwMCkgKiB0b3RhbCk7XG4gICAgICAgICAgICB1c2VkICs9IHM7XG4gICAgICAgICAgICBjb25zdCBwZXJjZW50YWdlQ2xhc3MgPSB0aGlzLmdldFBlcmNlbnRhZ2VDbGFzc05hbWUoYy5kaW1lbnNpb24pO1xuICAgICAgICAgICAgZi5jbGFzc05hbWUgPSBgJHtmLmNsYXNzTmFtZX0gJHtwZXJjZW50YWdlQ2xhc3N9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYy5kaW1lbnNpb25UeXBlID09PSBEaW1lbnNpb25UeXBlLlBpeGVscykge1xuICAgICAgICAgIGNvbnN0IHMgPSBNYXRoLnJvdW5kKChjLmRpbWVuc2lvbiAvIHdpbmRvdy5pbm5lcldpZHRoKSAqIHRvdGFsKTtcbiAgICAgICAgICB1c2VkICs9IHM7XG4gICAgICAgICAgY29uc3QgcGVyY2VudGFnZUNsYXNzID0gdGhpcy5nZXRQZXJjZW50YWdlQ2xhc3NOYW1lKFxuICAgICAgICAgICAgKHMgLyB0b3RhbCkgKiAxMDBcbiAgICAgICAgICApO1xuICAgICAgICAgIGYuY2xhc3NOYW1lID0gYCR7Zi5jbGFzc05hbWV9ICR7cGVyY2VudGFnZUNsYXNzfWA7XG4gICAgICAgIH0gZWxzZSBpZiAoYy5hdXRvRGltZW5zaW9uKSB7XG4gICAgICAgICAgYXV0by5wdXNoKHsgYywgZiB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1c2VkICs9IDE7XG4gICAgICAgICAgY29uc3QgcGVyY2VudGFnZUNsYXNzID0gdGhpcy5nZXRQZXJjZW50YWdlQ2xhc3NOYW1lKFxuICAgICAgICAgICAgKDEgLyB0b3RhbCkgKiAxMDBcbiAgICAgICAgICApO1xuICAgICAgICAgIGYuY2xhc3NOYW1lID0gYCR7Zi5jbGFzc05hbWV9ICR7cGVyY2VudGFnZUNsYXNzfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbSA9IHRvdGFsIC0gdXNlZDtcbiAgICAgIGlmIChhdXRvLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgc2hhcmUgPSBNYXRoLm1heChNYXRoLmZsb29yKHJlbSAvIGF1dG8ubGVuZ3RoKSwgMSk7XG4gICAgICAgIGZvciAoY29uc3QgYSBvZiBhdXRvKSB7XG4gICAgICAgICAgY29uc3QgcGVyY2VudGFnZUNsYXNzID0gdGhpcy5nZXRQZXJjZW50YWdlQ2xhc3NOYW1lKFxuICAgICAgICAgICAgKHNoYXJlIC8gdG90YWwpICogMTAwXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhLmYuY2xhc3NOYW1lID0gYCR7YS5mLmNsYXNzTmFtZX0gJHtwZXJjZW50YWdlQ2xhc3N9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmllbGRzLnB1c2goLi4uYnVpbHQpO1xuICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICB9O1xuICAgIGZvciAoY29uc3QgYyBvZiBbLi4uY29udHJvbHMsIC4uLnByZXNlbnRhdGlvbkNvbnRyb2xzXSkge1xuICAgICAgaWYgKFxuICAgICAgICAoJ3R5cGUnIGluIGMgJiYgYy50eXBlID09PSBTdGVwQ29udHJvbFR5cGUuTmV3Um93KSB8fFxuICAgICAgICBjLnR5cGUgPT0gUHJlc2VudGF0aW9uQ29udHJvbFR5cGUuTmV3Um93XG4gICAgICApIHtcbiAgICAgICAgaWYgKHJvd0l0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXN1bHQucHVzaCguLi4oYXdhaXQgcHJvY2Vzc1Jvdyhyb3dJdGVtcykpKTtcbiAgICAgICAgICByb3dJdGVtcyA9IFtdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb3dJdGVtcy5wdXNoKGMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocm93SXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0LnB1c2goLi4uKGF3YWl0IHByb2Nlc3NSb3cocm93SXRlbXMpKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXRQaXhlbENsYXNzTmFtZShwaXhlbERpbWVuc2lvbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBgcGl4ZWwtd2lkdGgtJHtwaXhlbERpbWVuc2lvbn1gO1xuICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2xhc3NOYW1lKSkge1xuICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgc3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgICBzdHlsZS5pZCA9IGNsYXNzTmFtZTtcbiAgICAgIHN0eWxlLmlubmVySFRNTCA9IGBcbiAgICAgICAgLiR7Y2xhc3NOYW1lfSB7XG4gICAgICAgICAgd2lkdGg6ICR7cGl4ZWxEaW1lbnNpb259cHg7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzTmFtZTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkRm9ybUZpZWxkQXN5bmMoXG4gICAgc3RlcDogU3RlcERhdGEgfCB1bmRlZmluZWQsXG4gICAgY29udHJvbDogQ29udHJvbERhdGFcbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZz4ge1xuICAgIGxldCBpbml0aWFsVHlwZSA9ICdpbnB1dCc7IC8vIERlZmF1bHQgdHlwZVxuICAgIGxldCBjb21wb25lbnRTdHlsZUtleSA9IGAuY29tcG9uZW50LXRleHQtZmllbGRgOyAvLyBEZWZhdWx0IHN0eWxlIGZvciB0ZXh0IGlucHV0XG4gICAgY29uc3QgYmFzZVN0eWxlID0gdGhpcy5kZXNpZ25bYC5mb250LSR7aW5pdGlhbFR5cGV9YF0gfHwge307XG4gICAgY29uc3QgY29udHJvbFN0eWxlU3RyaW5nID1cbiAgICAgIHRoaXMuc3R5bGVPYmplY3RUb1N0cmluZ0V4Y2VwdEJhY2tncm91bmQoYmFzZVN0eWxlKTtcbiAgICBsZXQgcGF0dGVybiA9ICcnO1xuICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93ZWRDaGFyYWN0ZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXR0ZXJuID0gbmV3IFJlZ0V4cChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEuYWxsb3dlZENoYXJhY3RlcnMpXG4gICAgICAgICAgLnNvdXJjZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignaW5jb3JyZWN0IHJlZ2V4IHBhdHRlcm4nLCBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnRzVG9FeGNsdWRlRnJvbVN0eWxlID0gW1xuICAgICAgJy5jb21wb25lbnQtdGV4dC1maWVsZCcsXG4gICAgICAnLmNvbXBvbmVudC1jaGVja2JveCcsXG4gICAgICAnLmNvbXBvbmVudC1yYWRpbycsXG4gICAgICAnLmNvbXBvbmVudC1kYXRlJyxcbiAgICAgICcuY29tcG9uZW50LWRhdGEnLFxuICAgIF07XG4gICAgbGV0IGZvcm1seUNvbmZpZyA9IHRoaXMuZ2V0RGVmYXVsdEZvcm1seUZpZWxkQ29uZmlnKFxuICAgICAgY29udHJvbCxcbiAgICAgIGluaXRpYWxUeXBlLFxuICAgICAgcGF0dGVybixcbiAgICAgIGNvbXBvbmVudFN0eWxlS2V5LFxuICAgICAgY29tcG9uZW50c1RvRXhjbHVkZUZyb21TdHlsZVxuICAgICk7XG4gICAgLy9jb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEudHlwZSA9PT0gMyAgaXMgZW1haWxcbiAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy50eXBlID09PSAzKSB7XG4gICAgICB0aGlzLmFkZFZhbGlkYXRvcnMoZm9ybWx5Q29uZmlnLCBjb250cm9sKTtcbiAgICB9XG5cbiAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc0FwaVZhbGlkYXRpb24pIHtcbiAgICAgIHRoaXMuYWRkQXBpVmFsaWRhdG9ycyhmb3JtbHlDb25maWcsIGNvbnRyb2wpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29udHJvbC50eXBlKSB7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5NYW51YWxJbnB1dDogLy8gVGV4dFxuICAgICAgICB2YXIgc3ViVHlwZSA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YVxuICAgICAgICAgID8udHlwZSBhcyBNYW51YWxJbnB1dENvbnRyb2xUeXBlO1xuICAgICAgICBzd2l0Y2ggKHN1YlR5cGUpIHtcbiAgICAgICAgICBjYXNlIE1hbnVhbElucHV0Q29udHJvbFR5cGUuTnVtZXJpYzpcbiAgICAgICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ251bWJlcic7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgTWFudWFsSW5wdXRDb250cm9sVHlwZS5FbWFpbDpcbiAgICAgICAgICBjYXNlIE1hbnVhbElucHV0Q29udHJvbFR5cGUuVGV4dDpcbiAgICAgICAgICBjYXNlIE1hbnVhbElucHV0Q29udHJvbFR5cGUuUGhvbmU6XG4gICAgICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdpbnB1dCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE1hbnVhbElucHV0Q29udHJvbFR5cGUuVGV4dEFyZWE6XG4gICAgICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdpbnB1dCc7XG4gICAgICAgICAgICBmb3JtbHlDb25maWcucHJvcHMhWydhdXRvc2l6ZSddID0gZmFsc2U7XG4gICAgICAgICAgICBjb21wb25lbnRTdHlsZUtleSA9ICcuY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLkRhdGVUaW1lOlxuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZGF0ZXBpY2tlcic7XG4gICAgICAgICAgICBmb3JtbHlDb25maWcucHJvcHMgPSB7XG4gICAgICAgICAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID0gJy5jb21wb25lbnQtZGF0ZSc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnaW5wdXQnO1xuICAgICAgICAgICAgY29tcG9uZW50U3R5bGVLZXkgPSAnLmNvbXBvbmVudC10ZXh0LWZpZWxkJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuUGFyYWdyYXBoOiAvLyBQYXJhZ3JhcGhcbiAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZm9ybWx5LXBhcmFncmFwaCc7XG4gICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID0gJy5jb21wb25lbnQtdGV4dC1maWVsZCc7XG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZERlc2NyaXB0aW9uID1cbiAgICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmRlc2NyaXB0aW9uVHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgICAgICAgKGQ6IHsgbGFuZ3VhZ2VJc286IHN0cmluZyB9KSA9PlxuICAgICAgICAgICAgICBkLmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICk/LnZhbHVlIHx8ICcnO1xuICAgICAgICBmb3JtbHlDb25maWcuZGVmYXVsdFZhbHVlID0gdHJhbnNsYXRlZERlc2NyaXB0aW9uO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuQ2hlY2tCb3g6IC8vIENoZWNrYm94XG4gICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2Zvcm1seS1jaGVja2JveCc7XG4gICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID0gJy5jb21wb25lbnQtY2hlY2tib3gnO1xuICAgICAgICB2YXIgY2hlY2tlZCA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uY2hlY2tlZCA/PyBmYWxzZTtcbiAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnY2hlY2tlZCddID0gY2hlY2tlZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5EaWN0aW9uYXJ5OiAvLyBEaWN0aW9uYXJ5IChkcm9wZG93bilcbiAgICAgICAgY29tcG9uZW50U3R5bGVLZXkgPVxuICAgICAgICAgIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS5zaG93QXNSYWRpb0J1dHRvbnNMaXN0ID09PSB0cnVlXG4gICAgICAgICAgICA/ICcuY29tcG9uZW50LXJhZGlvJ1xuICAgICAgICAgICAgOiAnLmNvbXBvbmVudC1kYXRhJztcbiAgICAgICAgYXdhaXQgdGhpcy5jb25zdHJ1Y3REaWN0aW9uYXJ5KGNvbnRyb2wsIGZvcm1seUNvbmZpZyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuQnV0dG9uczpcbiAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5GbHV4SW5mbzpcbiAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5Eb3dubG9hZERvY3VtZW50czpcbiAgICAgICAgZm9ybWx5Q29uZmlnID0gdGhpcy5DcmVhdGVEb3dubG9hZERvY3NGaWVsZENvbmZpZyhjb250cm9sKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5WaWV3RG9jdW1lbnRzOlxuICAgICAgICBmb3JtbHlDb25maWcgPSB0aGlzLkNyZWF0ZVZpZXdEb2NzRmllbGRDb25maWcoY29udHJvbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuVXBsb2FkRG9jdW1lbnRzOlxuICAgICAgICBmb3JtbHlDb25maWcgPSB0aGlzLkNyZWF0ZVVwbG9hZERvY3NGaWVsZENvbmZpZyhjb250cm9sKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5OZXdSb3c6IC8vIE5ldyBSb3dcbiAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdpbnB1dCc7XG4gICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID0gJy5jb21wb25lbnQtdGV4dC1maWVsZCc7XG4gICAgfVxuICAgIGZvcm1seUNvbmZpZy5jbGFzc05hbWUgPSBjb21wb25lbnRTdHlsZUtleS5zdWJzdHJpbmcoMSk7XG5cbiAgICBpZiAoIWNvbXBvbmVudHNUb0V4Y2x1ZGVGcm9tU3R5bGUuZmluZCgoYykgPT4gYyA9PT0gY29tcG9uZW50U3R5bGVLZXkpKSB7XG4gICAgICBpZiAodGhpcy5kZXNpZ25bY29tcG9uZW50U3R5bGVLZXldKSB7XG4gICAgICAgIGZvcm1seUNvbmZpZy5wcm9wcyEuYXR0cmlidXRlcyFbJ3N0eWxlJ10gKz1cbiAgICAgICAgICAnOycgK1xuICAgICAgICAgIHRoaXMuc3R5bGVPYmplY3RUb1N0cmluZ0V4Y2VwdEJhY2tncm91bmQoXG4gICAgICAgICAgICB0aGlzLmRlc2lnbltjb21wb25lbnRTdHlsZUtleV1cbiAgICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBsYWJlbCBzdHlsZXNcbiAgICAgIGNvbnN0IGxhYmVsU3R5bGVLZXkgPSBgJHtjb21wb25lbnRTdHlsZUtleX0tbGFiZWxgO1xuICAgICAgaWYgKHRoaXMuZGVzaWduW2xhYmVsU3R5bGVLZXldKSB7XG4gICAgICAgIGZvcm1seUNvbmZpZy5wcm9wcyEuYXR0cmlidXRlcyFbJ3N0eWxlJ10gKz1cbiAgICAgICAgICAnOycgK1xuICAgICAgICAgIHRoaXMuc3R5bGVPYmplY3RUb1N0cmluZ0V4Y2VwdEJhY2tncm91bmQoXG4gICAgICAgICAgICB0aGlzLmRlc2lnbltjb21wb25lbnRTdHlsZUtleV1cbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29udHJvbC5kZXBlbmRlbnREaWN0aW9uYXJ5KSB7XG4gICAgICB0aGlzLmF0dGFjaFRvRGVwZW5kZW50RGljdGlvbmFyeUlmTmVjZXNzYXJ5KFxuICAgICAgICBjb250cm9sLmRlcGVuZGVudERpY3Rpb25hcnksXG4gICAgICAgIGZvcm1seUNvbmZpZ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgdHJhbnNsYXRlZFRpdGxlID0gY29udHJvbC50cmFuc2xhdGlvbnM/LmZpbmQoXG4gICAgICAoZDogeyBsYW5ndWFnZUlzbzogc3RyaW5nIH0pID0+IGQubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgKT8udmFsdWU7XG4gICAgaWYgKCF0cmFuc2xhdGVkVGl0bGUpIHtcbiAgICAgIHRyYW5zbGF0ZWRUaXRsZSA9IGNvbnRyb2wudGl0bGU7XG4gICAgfVxuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2xhYmVsJ10gPSB0cmFuc2xhdGVkVGl0bGU7XG5cbiAgICB0aGlzLmZvcm1seUNvbGxlY3RpbmdGaWVsZHMucHVzaChmb3JtbHlDb25maWcpO1xuXG4gICAgcmV0dXJuIGZvcm1seUNvbmZpZztcbiAgfVxuXG4gIGFkZFZhbGlkYXRvcnMoZm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZywgY29udHJvbDogQ29udHJvbERhdGEpIHtcbiAgICB2YXIgZW1haWxFcnJvckxhYmVsID0gdGhpcy5mbHV4Py5maW5kKFxuICAgICAgKGYpID0+IGY/LmNvbmZpZz8uY29tcG9uZW50Q29sbGVjdGVkID09PSBjb250cm9sPy5pZGVudGlmaWVyXG4gICAgKT8uY29uZmlnPy5lbWFpbEVycm9yTGFiZWw7XG4gICAgdmFyIGVtYWlsRXJyb3JMYWJlbFZhbHVlID0gJyc7XG4gICAgaWYgKGVtYWlsRXJyb3JMYWJlbCAhPSBudWxsICYmIEFycmF5LmlzQXJyYXkoZW1haWxFcnJvckxhYmVsKSkge1xuICAgICAgZW1haWxFcnJvckxhYmVsVmFsdWUgPVxuICAgICAgICAoZW1haWxFcnJvckxhYmVsIGFzIExhYmVsSW5mb1tdKS5maW5kKFxuICAgICAgICAgIChsKSA9PiBsLmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApPy52YWx1ZSA/PyAnJztcbiAgICB9XG5cbiAgICBmb3JtbHlDb25maWcudmFsaWRhdG9ycyA9IHtcbiAgICAgIGVtYWlsVmFsaWQ6IHtcbiAgICAgICAgZXhwcmVzc2lvbjogKGNvbnQ6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29udC52YWx1ZTtcbiAgICAgICAgICBjb25zdCBlbWFpbFBhdHRlcm4gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcXFwuW2EtekEtWl17Mix9JCdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICh2YWx1ZSAmJiAhZW1haWxQYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICBjb250LnNldEVycm9ycyh7IGludmFsaWRFbWFpbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIG1lc3NhZ2U6IGVtYWlsRXJyb3JMYWJlbFZhbHVlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYWRkQXBpVmFsaWRhdG9ycyhmb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnLCBjb250cm9sOiBDb250cm9sRGF0YSkge1xuICAgIGZvcm1seUNvbmZpZy5hc3luY1ZhbGlkYXRvcnMgPSB7XG4gICAgICB2YWxpZGF0ZVRocm91Z2hBcGk6IHtcbiAgICAgICAgZXhwcmVzc2lvbjogKGNvbnQ6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjb250LnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoNTAwKSxcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcGlWYWxpZGF0aW9uTWV0aG9kID1cbiAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS5hcGlWYWxpZGF0aW9uTWV0aG9kO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYm9keVZhbHVlID0gdGhpcy5hcHBNb2RlbC5wYXJ0bmVyc1xuICAgICAgICAgICAgICAgICAgLmZsYXRNYXAoKHApID0+IHAucGFydG5lclNldHRpbmdzLnBhcnRuZXJNZXRob2RzQXBpKVxuICAgICAgICAgICAgICAgICAgLmZpbmQoKHApID0+IHAubWV0aG9kSWQgPT09IGFwaVZhbGlkYXRpb25NZXRob2QpXG4gICAgICAgICAgICAgICAgICA/LmJvZHlDb25maWd1cmF0aW9uLmJvZHlNYXBGaWVsZHM7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZE1hcDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9XG4gICAgICAgICAgICAgICAgICBib2R5VmFsdWU/LnJlZHVjZSgoYWNjOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9LCBmKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmLmZsdXhGaWVsZElkID09PSBjb250cm9sLmlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhY2NbZi5wYXJ0bmVyRmllbGRdID0gY29udC52YWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBhY2NbZi5wYXJ0bmVyRmllbGRdID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgICAgICAgIH0sIHt9KSB8fCB7fTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFSZXF1ZXN0OiBBcGlWYWxpZGF0ZVJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgYXBpSWQ6IGFwaVZhbGlkYXRpb25NZXRob2QsXG4gICAgICAgICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShmaWVsZE1hcCksXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlTWV0aG9kQXBpKGRhdGFSZXF1ZXN0KS5waXBlKFxuICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihmYWxzZSkpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkgfHwgJ3Nzc3Nzc3Nzc3Nzc3Nzc3MnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVzc2FnZTogJ1ZhbGlkYXRpb24gZmFpbGVkLicsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBnZXREZWZhdWx0Rm9ybWx5RmllbGRDb25maWcoXG4gICAgY29udHJvbDogQ29udHJvbERhdGEsXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHBhdHRlcm46IHN0cmluZyxcbiAgICBjb21wb25lbnRTdHlsZUtleTogc3RyaW5nLFxuICAgIGNvbXBvbmVudHNUb0V4Y2x1ZGVGcm9tU3R5bGU6IHN0cmluZ1tdXG4gICk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2VJZCA9IFV0aWxzLmZpbmRMYW5ndWFnZUlkQnlJc28oXG4gICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgKTtcblxuICAgIGxldCBmb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiBjb250cm9sLmlkZW50aWZpZXIgfHwgY29udHJvbC50aXRsZSxcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBwcm9wczoge1xuICAgICAgICBjdXJyZW50TGFuZ3VhZ2VJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICBjdXJyZW50TGFuZ3VhZ2VJZDogY3VycmVudExhbmd1YWdlSWQsXG4gICAgICAgIGxhYmVsOlxuICAgICAgICAgIGNvbnRyb2wudHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgICAgICAgKHQ6IHsgbGFuZ3VhZ2VJc286IHN0cmluZyB9KSA9PlxuICAgICAgICAgICAgICB0Lmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICk/LnZhbHVlIHx8ICcnLFxuXG4gICAgICAgIHRpdGxlOlxuICAgICAgICAgIGNvbnRyb2wudHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgICAgICAgKHQ6IHsgbGFuZ3VhZ2VJc286IHN0cmluZyB9KSA9PlxuICAgICAgICAgICAgICB0Lmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICk/LnZhbHVlIHx8ICcnLFxuICAgICAgICBkZXNpZ246IHRoaXMuZGVzaWduLFxuICAgICAgICByZXF1aXJlZDogY29udHJvbC5pc01hbmRhdG9yeSxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIHN0eWxlOiBjb21wb25lbnRzVG9FeGNsdWRlRnJvbVN0eWxlLmZpbmQoXG4gICAgICAgICAgICAoYykgPT4gYyA9PT0gY29tcG9uZW50U3R5bGVLZXlcbiAgICAgICAgICApXG4gICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICA6IGNvbXBvbmVudFN0eWxlS2V5LFxuICAgICAgICB9LFxuICAgICAgICBhdXRvc2l6ZTogdHJ1ZSxcbiAgICAgICAgb3B0aW9uczogW3t9XSxcbiAgICAgICAgZmllbGRHcm91cDogW10sXG4gICAgICAgIGF1dG9EaW1lbnNpb246IGNvbnRyb2wuYXV0b0RpbWVuc2lvbixcbiAgICAgIH0sXG4gICAgICBleHByZXNzaW9uczoge30sXG4gICAgICBob29rczoge30sXG4gICAgICB2YWxpZGF0b3JzOiB7fSxcbiAgICB9O1xuICAgIGZvcm1seUNvbmZpZy52YWxpZGF0aW9uID0ge307XG5cbiAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc01hbmRhdG9yeSAmJiBmb3JtbHlDb25maWcucHJvcHMpIHtcbiAgICAgIHZhciByZXF1aXJlZE1lc3NhZ2UgPSBVdGlscy5maW5kRXJyb3JUcmFuc2xhdGlvblZhbHVlT3JEZWZhdWx0KFxuICAgICAgICBjb250cm9sLmVycm9yc1RyYW5zbGF0aW9ucyxcbiAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgICdpc01hbmRhdG9yeVZhbGlkYXRpb24nXG4gICAgICApO1xuXG4gICAgICBmb3JtbHlDb25maWcucHJvcHMucmVxdWlyZWQgPSBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmlzTWFuZGF0b3J5O1xuICAgICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24ubWVzc2FnZXMgPSB7XG4gICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0aW9uPy5tZXNzYWdlcyxcbiAgICAgICAgcmVxdWlyZWQ6IHJlcXVpcmVkTWVzc2FnZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY29udHJvbC50eXBlID09PSBTdGVwQ29udHJvbFR5cGUuRGljdGlvbmFyeSAmJlxuICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc01hbmRhdG9yeSAmJlxuICAgICAgY29udHJvbC5lcnJvcnNUcmFuc2xhdGlvbnMgJiZcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wc1xuICAgICkge1xuICAgICAgdmFyIHJlcXVpcmVkTWVzc2FnZSA9IFV0aWxzLmZpbmRFcnJvclRyYW5zbGF0aW9uVmFsdWVPckRlZmF1bHQoXG4gICAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgJ2lzTWFuZGF0b3J5J1xuICAgICAgKTtcblxuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzLnJlcXVpcmVkID0gY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc01hbmRhdG9yeTtcbiAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0aW9uLm1lc3NhZ2VzID0ge1xuICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdGlvbj8ubWVzc2FnZXMsXG4gICAgICAgIHJlcXVpcmVkOiByZXF1aXJlZE1lc3NhZ2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGxldCBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmlzU2ltcGxlVmFsaWRhdGlvbiAmJiBmb3JtbHlDb25maWcucHJvcHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc1NpbXBsZVZhbGlkYXRpb24gJiZcbiAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzXG4gICAgICApIHtcbiAgICAgICAgc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UgPSBVdGlscy5maW5kRXJyb3JUcmFuc2xhdGlvblZhbHVlT3JEZWZhdWx0KFxuICAgICAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICAgICdzaW1wbGVWYWxpZGF0aW9uJ1xuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/Lm1pblZhbHVlPy50b1N0cmluZygpKSB7XG4gICAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzLm1pbiA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS5taW5WYWx1ZTtcbiAgICAgICAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbi5tZXNzYWdlcyA9IHtcbiAgICAgICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0aW9uPy5tZXNzYWdlcyxcbiAgICAgICAgICAgIG1pbjogc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/Lm1heFZhbHVlPy50b1N0cmluZygpKSB7XG4gICAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzLm1heCA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS5tYXhWYWx1ZTtcbiAgICAgICAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbi5tZXNzYWdlcyA9IHtcbiAgICAgICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0aW9uPy5tZXNzYWdlcyxcbiAgICAgICAgICAgIG1heDogc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwYXR0ZXJuIHZhbGlkYXRpb24gaWYgYWxsb3dlZENoYXJhY3RlcnMgaXMgZGVmaW5lZFxuICAgICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uYWxsb3dlZENoYXJhY3RlcnMpIHtcbiAgICAgICAgc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UgPSBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSA9XG4gICAgICAgICAgVXRpbHMuZmluZEVycm9yVHJhbnNsYXRpb25WYWx1ZU9yRGVmYXVsdChcbiAgICAgICAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgICAgICAnc2ltcGxlVmFsaWRhdGlvbidcbiAgICAgICAgICApO1xuXG4gICAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0b3JzID0ge1xuICAgICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0b3JzLFxuICAgICAgICAgIGN1c3RvbVBhdHRlcm46IHtcbiAgICAgICAgICAgIGV4cHJlc3Npb246IChjOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFjLnZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QoYy52YWx1ZSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgIHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlIHx8XG4gICAgICAgICAgICAgICdWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWlyZWQgcGF0dGVybicsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbi5tZXNzYWdlcyA9IHtcbiAgICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdGlvbj8ubWVzc2FnZXMsXG4gICAgICAgICAgcGF0dGVybjogc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IG1heExlbmd0aCB2YWxpZGF0aW9uIGlmIG1heENoYXJhY3RlcnMgaXMgZGVmaW5lZFxuICAgICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8ubWF4Q2hhcmFjdGVycykge1xuICAgICAgICBmb3JtbHlDb25maWcucHJvcHMubWF4TGVuZ3RoID1cbiAgICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/Lm1heENoYXJhY3RlcnM7XG4gICAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0aW9uLm1lc3NhZ2VzID0ge1xuICAgICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0aW9uPy5tZXNzYWdlcyxcbiAgICAgICAgICBtYXhMZW5ndGg6IHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93T25seUZ1dHVyZSB8fFxuICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93T25seVBhc3RcbiAgICAgICkge1xuICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdkYXRlcGlja2VyJztcbiAgICAgICAgY29uc3QgY2hlY2tEYXRlVmFsaWRhdGlvbiA9IHtcbiAgICAgICAgICBjaGVja0RhdGU6IHtcbiAgICAgICAgICAgIGV4cHJlc3Npb246IChjOiBBYnN0cmFjdENvbnRyb2wsIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgICAgICBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgVXRpbHMuZmluZEVycm9yVHJhbnNsYXRpb25WYWx1ZU9yRGVmYXVsdChcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgICAgICAgICAgICAnc2ltcGxlVmFsaWRhdGlvbidcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgY3VycmVudERhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cbiAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uYWxsb3dPbmx5RnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjLnZhbHVlIHx8IGMudmFsdWUgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYy52YWx1ZSA+IGN1cnJlbnREYXRlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93T25seVBhc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWMudmFsdWUgfHwgYy52YWx1ZSA9PT0gJycpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjLnZhbHVlIDwgY3VycmVudERhdGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWVzc2FnZTogKGVycm9yOiBhbnksIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0b3JzID0ge1xuICAgICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0b3JzLFxuICAgICAgICAgIC4uLmNoZWNrRGF0ZVZhbGlkYXRpb24sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9jb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEudHlwZSA9PT0gNCAgaXMgcGhvbmVcbiAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy50eXBlID09PSA0KSB7XG4gICAgICB2YXIgcGhvbmVFcnJvckxhYmVsID0gdGhpcy5mbHV4Py5maW5kKFxuICAgICAgICAoZikgPT4gZj8uY29uZmlnPy5jb21wb25lbnRDb2xsZWN0ZWQgPT09IGNvbnRyb2w/LmlkZW50aWZpZXJcbiAgICAgICk/LmNvbmZpZz8ucGhvbmVFcnJvckxhYmVsO1xuICAgICAgdmFyIHBob25lRXJyb3JMYWJlbFZhbHVlID0gJyc7XG4gICAgICBpZiAocGhvbmVFcnJvckxhYmVsICE9IG51bGwgJiYgQXJyYXkuaXNBcnJheShwaG9uZUVycm9yTGFiZWwpKSB7XG4gICAgICAgIHBob25lRXJyb3JMYWJlbFZhbHVlID1cbiAgICAgICAgICAocGhvbmVFcnJvckxhYmVsIGFzIExhYmVsSW5mb1tdKS5maW5kKFxuICAgICAgICAgICAgKGwpID0+IGwubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKT8udmFsdWUgPz8gJyc7XG4gICAgICB9XG5cbiAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0b3JzID0ge1xuICAgICAgICBwaG9uZVZhbGlkOiB7XG4gICAgICAgICAgZXhwcmVzc2lvbjogKGNvbnQ6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb250LnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgcGhvbmVQYXR0ZXJuID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgJ14oXFxcXCs0fCk/KDA3WzAtOF17MX1bMC05XXsxfXwwMlswLTldezJ9fDAzWzAtOV17Mn0pezF9PyhcXFxcc3xcXFxcLnwtKT8oWzAtOV17M30oXFxcXHN8XFxcXC58LXwpKXsyfSQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmICFwaG9uZVBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgY29udC5zZXRFcnJvcnMoeyBpbnZhbGlkUGhvbmVOdW1iZXI6IHRydWUgfSk7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVzc2FnZTogcGhvbmVFcnJvckxhYmVsVmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LnR5cGUgPT09IDIpIHtcbiAgICAgIGNvbnN0IGNoZWNrRGF0ZTJWYWxpZGF0aW9uID0ge1xuICAgICAgICBjaGVja0RhdGUyOiB7XG4gICAgICAgICAgZXhwcmVzc2lvbjogKGM6IEFic3RyYWN0Q29udHJvbCwgZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnKSA9PiB7XG4gICAgICAgICAgICB2YXIgZGF0ZVZhbHVlID0gYy52YWx1ZTtcbiAgICAgICAgICAgIGlmICghZGF0ZVZhbHVlICYmIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNNYW5kYXRvcnkpIHtcbiAgICAgICAgICAgICAgc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgIFV0aWxzLmZpbmRFcnJvclRyYW5zbGF0aW9uVmFsdWVPckRlZmF1bHQoXG4gICAgICAgICAgICAgICAgICBjb250cm9sLmVycm9yc1RyYW5zbGF0aW9ucyxcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICAgICAgICAgICAgJ2lzTWFuZGF0b3J5VmFsaWRhdGlvbidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGlzTmFOKERhdGUucGFyc2UoZGF0ZVZhbHVlKSkgJiZcbiAgICAgICAgICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc01hbmRhdG9yeVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVzc2FnZTogKGVycm9yOiBhbnksIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgICAgaWYgKHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlID09PSAnJylcbiAgICAgICAgICAgICAgcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlJztcblxuICAgICAgICAgICAgcmV0dXJuIHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRvcnMgPSB7XG4gICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0b3JzLFxuICAgICAgICAuLi5jaGVja0RhdGUyVmFsaWRhdGlvbixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1seUNvbmZpZztcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkUHJlc2VudGF0aW9uRm9ybUZpZWxkQXN5bmMoXG4gICAgc3RlcDogU3RlcERhdGEgfCB1bmRlZmluZWQsXG4gICAgY29udHJvbDogUHJlc2VudGF0aW9uQ29udHJvbFxuICApOiBQcm9taXNlPEZvcm1seUZpZWxkQ29uZmlnPiB7XG4gICAgbGV0IGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7IHByb3BzOiB7fSB9O1xuXG4gICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZm9ybWx5LXBhcmFncmFwaCc7XG4gICAgZm9ybWx5Q29uZmlnLmNsYXNzTmFtZSA9ICdjb21wb25lbnQtdGV4dC1maWVsZCc7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnZGVzaWduJ10gPSB0aGlzLmFwcE1vZGVsLmdlbmVyYXRlZENzcztcblxuICAgIHZhciB0cmFuc2xhdGVkVGl0bGUgPVxuICAgICAgY29udHJvbC50cmFuc2xhdGlvbnMuZmluZCgoZCkgPT4gZC5sYW5ndWFnZUlzbyA9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbylcbiAgICAgICAgPy52YWx1ZSA/P1xuICAgICAgY29udHJvbC50aXRsZSA/P1xuICAgICAgJyc7XG5cbiAgICBpZiAoY29udHJvbC50eXBlID09IFByZXNlbnRhdGlvbkNvbnRyb2xUeXBlLlBhcmFncmFwaCkge1xuICAgICAgY29uc3QgcGFyYWdyYXBoQ29udHJvbCA9IGNvbnRyb2wgYXMgUHJlc2VudGF0aW9uUGFyYWdyYXBoQ29udHJvbDtcblxuICAgICAgdmFyIHRyYW5zbGF0ZWREZXNjcmlwdGlvbiA9XG4gICAgICAgIHBhcmFncmFwaENvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS5kZXNjcmlwdGlvblRyYW5zbGF0aW9ucy5maW5kKFxuICAgICAgICAgIChkOiBhbnkpID0+IGQubGFuZ3VhZ2VJc28gPT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKT8udmFsdWUgPz8gJyc7XG4gICAgICB2YXIgdHJhbnNsYXRlZFBhcmFncmFwaFRpdGxlID1cbiAgICAgICAgcGFyYWdyYXBoQ29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhLnRleHQuZmluZChcbiAgICAgICAgICAoZDogYW55KSA9PiBkLmxhbmd1YWdlSXNvID09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk/LnZhbHVlID8/ICcnO1xuXG4gICAgICBmb3JtbHlDb25maWcuZGVmYXVsdFZhbHVlID0gdHJhbnNsYXRlZERlc2NyaXB0aW9uO1xuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsndHJhbnNsYXRlZERlc2NyaXB0aW9uJ10gPSB0cmFuc2xhdGVkRGVzY3JpcHRpb247XG4gICAgICBmb3JtbHlDb25maWcucHJvcHMhWyd0cmFuc2xhdGVkUGFyYWdyYXBoVGl0bGUnXSA9XG4gICAgICAgIHRyYW5zbGF0ZWRQYXJhZ3JhcGhUaXRsZTtcbiAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2Zvcm1seS1wYXJhZ3JhcGgnO1xuICAgICAgZm9ybWx5Q29uZmlnLmNsYXNzTmFtZSA9ICdjb21wb25lbnQtdGV4dC1maWVsZCc7XG4gICAgfSBlbHNlIGlmIChjb250cm9sLnR5cGUgPT0gUHJlc2VudGF0aW9uQ29udHJvbFR5cGUuRG93bmxvYWQpIHtcbiAgICAgIGZvcm1seUNvbmZpZyA9IHRoaXMuQ3JlYXRlRG93bmxvYWREb2NzRmllbGRDb25maWcoY29udHJvbCk7XG4gICAgfSBlbHNlIGlmIChjb250cm9sLnR5cGUgPT0gUHJlc2VudGF0aW9uQ29udHJvbFR5cGUuVmlldykge1xuICAgICAgZm9ybWx5Q29uZmlnID0gdGhpcy5DcmVhdGVWaWV3RG9jc0ZpZWxkQ29uZmlnKGNvbnRyb2wpO1xuICAgIH0gZWxzZSBpZiAoY29udHJvbC50eXBlID09IFByZXNlbnRhdGlvbkNvbnRyb2xUeXBlLlN0YXR1cykge1xuICAgICAgbGV0IHN0YXR1c05hbWUgPVxuICAgICAgICB0aGlzLmFwcE1vZGVsLnN0YXR1c2VzLmZpbmQoXG4gICAgICAgICAgKHMpID0+IHMuaWQgPT09IHRoaXMuZmlsbERhdGE/Lm1ldGFkYXRhLnN0YXR1c0lkXG4gICAgICAgICk/Lm5hbWUgfHwgJ25vIHN0YXR1cyBuYW1lJztcblxuICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IHN0YXR1c05hbWU7XG4gICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdmb3JtbHktcGFyYWdyYXBoJztcbiAgICAgIGZvcm1seUNvbmZpZy5jbGFzc05hbWUgPSAnY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbnRyb2wudHlwZSA9PSBQcmVzZW50YXRpb25Db250cm9sVHlwZS5GbHV4Q29tcG9uZW50ICYmXG4gICAgICAgIHRoaXMuY29udHJvbElkc1dpdGhWYWx1ZXMgJiZcbiAgICAgICAgY29udHJvbC5jb2xsZWN0aW9uQ29udHJvbElkZW50aWZpZXJcbiAgICAgICkge1xuICAgICAgICBjb25zdCBmaWxsVmFsdWUgPVxuICAgICAgICAgIHRoaXMuY29udHJvbElkc1dpdGhWYWx1ZXNbY29udHJvbC5jb2xsZWN0aW9uQ29udHJvbElkZW50aWZpZXJdO1xuXG4gICAgICAgIGlmIChmaWxsVmFsdWUpIHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBmaWxsVmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgICBmb3JtbHlDb25maWcuZGVmYXVsdFZhbHVlID0gZmlsbFZhbHVlID8gJyZjaGVjazsnIDogJyZjcm9zczsnO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgaWYgKGZpbGxWYWx1ZT8ubmFtZSkge1xuICAgICAgICAgICAgICAgIGZvcm1seUNvbmZpZy5kZWZhdWx0VmFsdWUgPSBmaWxsVmFsdWUubmFtZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3JtbHlDb25maWcuZGVmYXVsdFZhbHVlID0gZmlsbFZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVuc3VyZSB0eXBlIGlzIHNldCBmb3IgcHJlc2VudGF0aW9uIGNvbnRyb2xzXG4gICAgaWYgKCFmb3JtbHlDb25maWcudHlwZSkge1xuICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZm9ybWx5LXBhcmFncmFwaCc7XG4gICAgICBmb3JtbHlDb25maWcuY2xhc3NOYW1lID0gJ2NvbXBvbmVudC10ZXh0LWZpZWxkJztcbiAgICB9XG5cbiAgICBmb3JtbHlDb25maWcuaWQgPSBjb250cm9sLmlkZW50aWZpZXI7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnaXNEaXNwbGF5TW9kZSddID0gdHJ1ZTtcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydjb2xsZWN0aW9uQ29udHJvbElkZW50aWZpZXInXSA9XG4gICAgICBjb250cm9sLmNvbGxlY3Rpb25Db250cm9sSWRlbnRpZmllcjtcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydsYWJlbCddID0gdHJhbnNsYXRlZFRpdGxlO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2xhbmdJc28nXSA9IHRoaXMuY3VycmVudExhbmd1YWdlSXNvO1xuXG4gICAgdGhpcy5mb3JtbHlQcmVzZW50YXRpb25GaWVsZHMucHVzaChmb3JtbHlDb25maWcpO1xuXG4gICAgcmV0dXJuIGZvcm1seUNvbmZpZztcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkQXBpTWV0aG9kRm9ybUZpZWxkQXN5bmMoXG4gICAgc3RlcDogU3RlcERhdGEgfCB1bmRlZmluZWQsXG4gICAgY29udHJvbDogUHJlc2VudGF0aW9uQ29udHJvbFxuICApOiBQcm9taXNlPEZvcm1seUZpZWxkQ29uZmlnPiB7XG4gICAgbGV0IGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7IHByb3BzOiB7fSB9O1xuXG4gICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZm9ybWx5LXBhcmFncmFwaCc7XG4gICAgZm9ybWx5Q29uZmlnLmNsYXNzTmFtZSA9ICdjb21wb25lbnQtdGV4dC1maWVsZCc7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnZGVzaWduJ10gPSB0aGlzLmFwcE1vZGVsLmdlbmVyYXRlZENzcztcblxuICAgIHZhciB0cmFuc2xhdGVkVGl0bGUgPVxuICAgICAgY29udHJvbC50cmFuc2xhdGlvbnMuZmluZCgoZCkgPT4gZC5sYW5ndWFnZUlzbyA9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbylcbiAgICAgICAgPy52YWx1ZSA/P1xuICAgICAgY29udHJvbC50aXRsZSA/P1xuICAgICAgJyc7XG5cbiAgICBmb3JtbHlDb25maWcuaWQgPSBjb250cm9sLmlkZW50aWZpZXI7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnaXNEaXNwbGF5TW9kZSddID0gdHJ1ZTtcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydhcGlNZXRob2RJZCddID0gY29udHJvbC5hcGlNZXRob2RJZDtcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydhcGlNZXRob2RGaWVsZElkJ10gPSBjb250cm9sLmFwaU1ldGhvZEZpZWxkSWQ7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnbGFiZWwnXSA9IHRyYW5zbGF0ZWRUaXRsZTtcblxuICAgIGlmIChjb250cm9sLmFwaU1ldGhvZEZpZWxkSWQpIHtcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZmluZEluQXBpQ2FsbHNSZXNwb25zZXMoY29udHJvbC5hcGlNZXRob2RGaWVsZElkKTtcbiAgICAgIGZvcm1seUNvbmZpZy5kZWZhdWx0VmFsdWUgPSB2YWw7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtbHlQcmVzZW50YXRpb25GaWVsZHMucHVzaChmb3JtbHlDb25maWcpO1xuXG4gICAgcmV0dXJuIGZvcm1seUNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoVG9EZXBlbmRlbnREaWN0aW9uYXJ5SWZOZWNlc3NhcnkoXG4gICAgZGVwZW5kZW50RGljdGlvbmFyeTogRGVwZW5kZW50RGljdGlvbmFyeURhdGEsXG4gICAgZm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZ1xuICApIHtcbiAgICAvLyBIYW5kbGUgZGljdGlvbmFyeSBkZXBlbmRlbmNpZXNcbiAgICBpZiAoXG4gICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5ICYmXG4gICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5LmRpY3Rpb25hcnlDb250cm9sSWRlbnRpZmllclxuICAgICkge1xuICAgICAgY29uc3QgcGFyZW50S2V5ID0gZGVwZW5kZW50RGljdGlvbmFyeS5kaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI7XG4gICAgICBjb25zdCBkZXBlbmRlbnRWYWx1ZUlkcyA9IGRlcGVuZGVudERpY3Rpb25hcnkuZGVwZW5kZW50VmFsdWVJZHMgfHwgW107XG5cbiAgICAgIGZvcm1seUNvbmZpZy5leHByZXNzaW9ucyA9IHtcbiAgICAgICAgaGlkZTogKGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgIGNvbnN0IHNob3VsZFNob3cgPSB0aGlzLnNob3VsZFNob3dEZXBlbmRlbnRGaWVsZChcbiAgICAgICAgICAgIHBhcmVudEtleSxcbiAgICAgICAgICAgIGRlcGVuZGVudFZhbHVlSWRzLFxuICAgICAgICAgICAgdGhpcy5tb2RlbFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuICFzaG91bGRTaG93O1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFRvVmFsdWVDaGFuZ2VzKGNvbnRyb2xJZDogc3RyaW5nLCBvcHRpb25zOiBGb3JtbHlGaWVsZENvbmZpZykge1xuICAgIG9wdGlvbnMucHJvcHMhWydvblNlbGVjdGVkVmFsdWVDaGFuZ2VkJ10gPSBhc3luYyAodmFsOiBhbnkpID0+IHtcbiAgICAgIHRoaXMubW9kZWxbY29udHJvbElkXSA9IHZhbDtcbiAgICAgIHZhciByZWZlcmVuY2VEaWN0aW9uYXJpZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICB0aGlzLmRpY3Rpb25hcnlNYXAudmFsdWVzKClcbiAgICAgICkuZmlsdGVyKChkKSA9PiBkLnJlZmVyZW5jZUlkID09IHZhbC5kaWN0aW9uYXJ5SWQpO1xuICAgICAgaWYgKHJlZmVyZW5jZURpY3Rpb25hcmllcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnJlbW92ZVJlZmVyZW5jZUZpZWxkcyhvcHRpb25zKTtcblxuICAgICAgICB2YXIgcmVmZXJlbmNlRGljdGlvbmFyaWVzV2l0aEZpbHRlcmVkVmFsdWVzID1cbiAgICAgICAgICB0aGlzLmNyZWF0ZVJlZmVyZW5jZURpY3Rpb25hcmllc0Zyb21TZWxlY3RlZFZhbHVlKFxuICAgICAgICAgICAgcmVmZXJlbmNlRGljdGlvbmFyaWVzLFxuICAgICAgICAgICAgdmFsXG4gICAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcGFyZW50U3BlY2lmaWNEYXRhID0gb3B0aW9ucy5wcm9wcz8uW1xuICAgICAgICAgICdzcGVjaWZpY0RhdGEnXG4gICAgICAgIF0gYXMgRGljdGlvbmFyeUNvbnRyb2xEYXRhO1xuICAgICAgICBhd2FpdCB0aGlzLmFkZFJlZmVyZW5jZURpY3Rpb25hcnlGaWVsZHNJZk5lY2Vzc2FyeShcbiAgICAgICAgICByZWZlcmVuY2VEaWN0aW9uYXJpZXNXaXRoRmlsdGVyZWRWYWx1ZXMsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICBvcHRpb25zLnR5cGUsXG4gICAgICAgICAgcGFyZW50U3BlY2lmaWNEYXRhPy5yZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zIHx8IFtdXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZVJlZmVyZW5jZUZpZWxkcyhvcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZVJlZmVyZW5jZURpY3Rpb25hcmllc0Zyb21TZWxlY3RlZFZhbHVlKFxuICAgIGFsbERpY3Rpb25hcmllczogRGljdGlvbmFyeUR0b1tdLFxuICAgIHNlbGVjdGVkVmFsdWU6IGFueVxuICApOiBEaWN0aW9uYXJ5RHRvW10ge1xuICAgIGNvbnN0IG5ld0RpY3Rpb25hcmllczogRGljdGlvbmFyeUR0b1tdID0gW107XG5cbiAgICBhbGxEaWN0aW9uYXJpZXMuZm9yRWFjaCgoZGljdGlvbmFyeSkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVyZWRWYWx1ZXMgPVxuICAgICAgICBkaWN0aW9uYXJ5LnZhbHVlcz8uZmlsdGVyKCh2YWx1ZSkgPT5cbiAgICAgICAgICB2YWx1ZS5yZWZlcmVuY2VWYWx1ZXMuc29tZShcbiAgICAgICAgICAgIChyZWZWYWx1ZSkgPT4gcmVmVmFsdWUuaWQgPT09IHNlbGVjdGVkVmFsdWUuaWRcbiAgICAgICAgICApXG4gICAgICAgICkgfHwgW107XG5cbiAgICAgIGlmIChmaWx0ZXJlZFZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5ld0RpY3Rpb25hcnk6IERpY3Rpb25hcnlEdG8gPSB7XG4gICAgICAgICAgLi4uZGljdGlvbmFyeSxcbiAgICAgICAgICB2YWx1ZXM6IGZpbHRlcmVkVmFsdWVzLFxuICAgICAgICB9O1xuXG4gICAgICAgIG5ld0RpY3Rpb25hcmllcy5wdXNoKG5ld0RpY3Rpb25hcnkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ld0RpY3Rpb25hcmllcztcbiAgfVxuXG4gIHNob3VsZFNob3dEZXBlbmRlbnRGaWVsZChcbiAgICBwYXJlbnRLZXk6IHN0cmluZyxcbiAgICBkZXBlbmRlbnRWYWx1ZUlkczogbnVtYmVyW10sXG4gICAgbW9kZWw6IGFueSA9IHt9XG4gICk6IGJvb2xlYW4ge1xuICAgIC8vIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IGRpY3Rpb25hcnkgY29udHJvbFxuICAgIGNvbnN0IHBhcmVudFZhbHVlID0gdGhpcy5nZXROZXN0ZWRWYWx1ZShcbiAgICAgIG1vZGVsLFxuICAgICAgcGFyZW50S2V5XG4gICAgKSBhcyBEaWN0aW9uYXJ5VmFsdWU7XG5cbiAgICBjb25zdCBpZFZhbHVlID0gcGFyZW50VmFsdWU/LmlkXG4gICAgICA/IHBhcmVudFZhbHVlLmlkXG4gICAgICA6IChwYXJlbnRWYWx1ZSBhcyB1bmtub3duIGFzIG51bWJlcik7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBhcmVudCB2YWx1ZSBpcyBpbiB0aGUgZGVwZW5kZW50VmFsdWVJZHNcbiAgICBpZiAocGFyZW50VmFsdWUgJiYgZGVwZW5kZW50VmFsdWVJZHMuaW5jbHVkZXMoaWRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXROZXN0ZWRWYWx1ZShvYmo6IGFueSwgcGF0aDogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIGxldCB2YWx1ZSA9IG9iajtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBzdWJtaXQoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ0Zvcm0gRGF0YTonLCB0aGlzLmZvcm0udmFsdWUpO1xuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xuICAgICAgY29uc29sZS5sb2coJ0Zvcm0gZGF0YSBoYXMgdmFsaWRhdGlvbiBlcnJvcnMuJyk7XG4gICAgICB0aGlzLnNjcm9sbFRvRXJyb3JTZXJ2aWNlLnNjcm9sbFRvRmlyc3RFcnJvcih0aGlzLmZvcm0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgbWV0aG9kIHRvIHRyaWdnZXIgc2Nyb2xsIHRvIGZpcnN0IGVycm9yIC0gY2FuIGJlIGNhbGxlZCBmcm9tIG90aGVyIGNvbXBvbmVudHNcbiAgICovXG4gIHB1YmxpYyBzY3JvbGxUb0ZpcnN0VmFsaWRhdGlvbkVycm9yKCk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsVG9FcnJvclNlcnZpY2Uuc2Nyb2xsVG9GaXJzdEVycm9yKHRoaXMuZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIG1ldGhvZCB0byBzY3JvbGwgdG8gYSBzcGVjaWZpYyBmaWVsZCBieSBuYW1lXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsVG9GaWVsZChmaWVsZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsVG9FcnJvclNlcnZpY2Uuc2Nyb2xsVG9GaWVsZChmaWVsZE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlYnVnIG1ldGhvZCB0byBoZWxwIHRyb3VibGVzaG9vdCBzY3JvbGwgaXNzdWVzXG4gICAqL1xuICBwdWJsaWMgZGVidWdGb3JtRWxlbWVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5zY3JvbGxUb0Vycm9yU2VydmljZS5kZWJ1Z0xvZ0Zvcm1FbGVtZW50cygpO1xuICB9XG5cbiAgYXN5bmMgY29uc3RydWN0RGljdGlvbmFyeShcbiAgICBjb250cm9sOiBDb250cm9sRGF0YSxcbiAgICBvcHRpb25zOiBGb3JtbHlGaWVsZENvbmZpZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzcGVjaWZpY0RhdGEgPSBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE7XG5cbiAgICAvLyBEZXRlcm1pbmUgY29tcG9uZW50IHR5cGUgYmFzZWQgb24gc2V0dGluZ3NcbiAgICBpZiAoc3BlY2lmaWNEYXRhLnNob3dBc0NoZWNrYm94ZXMgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMudHlwZSA9ICdmb3JtbHktY2hlY2tib3hlcyc7XG4gICAgfSBlbHNlIGlmIChzcGVjaWZpY0RhdGEuc2hvd0FzUmFkaW9CdXR0b25zTGlzdCA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy50eXBlID0gJ2Zvcm1seS1yYWRpbyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMudHlwZSA9ICdmb3JtbHktZGljdGlvbmFyeS1kcm9wZG93bi10cmVlJztcbiAgICB9XG5cbiAgICBvcHRpb25zLnByb3BzIVsnc3BlY2lmaWNEYXRhJ10gPSBzcGVjaWZpY0RhdGE7XG5cbiAgICBjb25zdCBkaWN0aW9uYXJ5VXVpZCA9IHNwZWNpZmljRGF0YS5kaWN0aW9uYXJ5VVVJRDtcblxuICAgIGlmIChkaWN0aW9uYXJ5VXVpZCkge1xuICAgICAgY29uc3QgZGljdGlvbmFyeSA9IHRoaXMuZGljdGlvbmFyeU1hcC5nZXQoZGljdGlvbmFyeVV1aWQpO1xuICAgICAgaWYgKGRpY3Rpb25hcnkpIHtcbiAgICAgICAgaWYgKGRpY3Rpb25hcnkucmVmZXJlbmNlSWQpIHtcbiAgICAgICAgICBvcHRpb25zLnByb3BzIVsnZGljdGlvbmFyeUlkJ10gPSBkaWN0aW9uYXJ5VXVpZDtcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdERpY3Rpb25hcnlXaXRoUmVmZXJlbmNlcyhcbiAgICAgICAgICAgIGRpY3Rpb25hcnksXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgc3BlY2lmaWNEYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmF0dGFjaFRvVmFsdWVDaGFuZ2VzKGNvbnRyb2wuaWRlbnRpZmllciwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVHlwZSBpcyBhbHJlYWR5IHNldCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXRob2RcbiAgICAgICAgICBvcHRpb25zLnByb3BzIVsnZGljdGlvbmFyeUlkJ10gPSBkaWN0aW9uYXJ5VXVpZDtcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdERpY3Rpb25hcnlXaXRoUmVmZXJlbmNlcyhcbiAgICAgICAgICAgIGRpY3Rpb25hcnksXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgc3BlY2lmaWNEYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmF0dGFjaFRvVmFsdWVDaGFuZ2VzKGNvbnRyb2wuaWRlbnRpZmllciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgRGljdGlvbmFyeSBub3QgZm91bmQgZm9yIFVVSUQgJHtkaWN0aW9uYXJ5VXVpZH1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgVVVJRCBub3QgZm91bmQgZm9yIGRpY3Rpb25hcnkgSUQgJHtzcGVjaWZpY0RhdGEuZGljdGlvbmFyeUlkfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRGljdGlvbmFyeVZhbHVlT2JqZWN0KFxuICAgIGRpY3Rpb25hcnk6IERpY3Rpb25hcnlEdG8gfCB1bmRlZmluZWQsXG4gICAgdmFsdWU6IGFueVxuICApOiBEaWN0aW9uYXJ5VmFsdWVEdG8gfCB1bmRlZmluZWQge1xuICAgIGlmIChcbiAgICAgICFkaWN0aW9uYXJ5IHx8XG4gICAgICAhZGljdGlvbmFyeS52YWx1ZXMgfHxcbiAgICAgIHZhbHVlID09PSBudWxsIHx8XG4gICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZT8uaWQgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGRpY3Rpb25hcnkudmFsdWVzLmZpbmQoKHYpID0+IHYuaWQgPT09IHZhbHVlLmlkKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdmFsdWVJZCA9IE51bWJlcih2YWx1ZSk7XG4gICAgICBpZiAoIWlzTmFOKHZhbHVlSWQpKSB7XG4gICAgICAgIHJldHVybiBkaWN0aW9uYXJ5LnZhbHVlcy5maW5kKCh2KSA9PiB2LmlkID09PSB2YWx1ZUlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVJlZmVyZW5jZUZpZWxkcyhcbiAgICBmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10sXG4gICAgcm9vdENvbmZpZzogRm9ybWx5RmllbGRDb25maWdbXSA9IHRoaXMuZm9ybWx5Q29uZmlnXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghZmllbGRzKSByZXR1cm47XG4gICAgY29uc3QgZmllbGRzVG9Qcm9jZXNzID0gWy4uLmZpZWxkc107XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkc1RvUHJvY2Vzcykge1xuICAgICAgY29uc3QgZmllbGRLZXkgPSBmaWVsZC5rZXkgYXMgc3RyaW5nO1xuICAgICAgaWYgKFxuICAgICAgICBmaWVsZEtleSAmJlxuICAgICAgICBmaWVsZC5wcm9wcz8uWydkaWN0aW9uYXJ5SWQnXSAmJlxuICAgICAgICBmaWVsZC5wcm9wcz8uWydzcGVjaWZpY0RhdGEnXVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkS2V5KTtcbiAgICAgICAgY29uc3Qgc3BlY2lmaWNEYXRhID0gZmllbGQucHJvcHNbXG4gICAgICAgICAgJ3NwZWNpZmljRGF0YSdcbiAgICAgICAgXSBhcyBEaWN0aW9uYXJ5Q29udHJvbERhdGE7XG4gICAgICAgIGNvbnN0IGRpY3Rpb25hcnlVdWlkID0gZmllbGQucHJvcHNbJ2RpY3Rpb25hcnlJZCddIGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgbWFpbkRpY3Rpb25hcnkgPSB0aGlzLmRpY3Rpb25hcnlNYXAuZ2V0KGRpY3Rpb25hcnlVdWlkKTtcblxuICAgICAgICBsZXQgdmFsdWVUb1VzZTogYW55ID0gbnVsbDtcblxuICAgICAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLnZhbHVlICE9PSBudWxsICYmIGNvbnRyb2wudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHZhbHVlVG9Vc2UgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGZpZWxkLmRlZmF1bHRWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgIGZpZWxkLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHZhbHVlVG9Vc2UgPSBmaWVsZC5kZWZhdWx0VmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdGhpcy5tb2RlbCAmJlxuICAgICAgICAgIHRoaXMubW9kZWxbZmllbGRLZXldICE9PSBudWxsICYmXG4gICAgICAgICAgdGhpcy5tb2RlbFtmaWVsZEtleV0gIT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB2YWx1ZVRvVXNlID0gdGhpcy5tb2RlbFtmaWVsZEtleV07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2VsZWN0ZWRWYWx1ZU9iamVjdDogRGljdGlvbmFyeVZhbHVlRHRvIHwgdW5kZWZpbmVkIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGlmICh2YWx1ZVRvVXNlICE9PSBudWxsICYmIG1haW5EaWN0aW9uYXJ5Py5pZCAhPSBudWxsKSB7XG4gICAgICAgICAgc2VsZWN0ZWRWYWx1ZU9iamVjdCA9IHRoaXMuZmluZERpY3Rpb25hcnlWYWx1ZU9iamVjdChcbiAgICAgICAgICAgIG1haW5EaWN0aW9uYXJ5LFxuICAgICAgICAgICAgdmFsdWVUb1VzZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWVsZENvbmZpZ0luVHJlZSA9IHRoaXMuZmluZEZpZWxkQnlLZXkocm9vdENvbmZpZywgZmllbGRLZXkpO1xuICAgICAgICBpZiAoIWZpZWxkQ29uZmlnSW5UcmVlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbW92ZVJlZmVyZW5jZUZpZWxkcyhmaWVsZENvbmZpZ0luVHJlZSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlbGVjdGVkVmFsdWVPYmplY3QgJiZcbiAgICAgICAgICBzZWxlY3RlZFZhbHVlT2JqZWN0LmlkICE9IG51bGwgJiZcbiAgICAgICAgICBtYWluRGljdGlvbmFyeT8uaWQgIT0gbnVsbFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBwb3RlbnRpYWxSZWZlcmVuY2VEaWN0aW9uYXJpZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5TWFwLnZhbHVlcygpXG4gICAgICAgICAgKS5maWx0ZXIoKGRpY3QpID0+IGRpY3QucmVmZXJlbmNlSWQgPT09IG1haW5EaWN0aW9uYXJ5LmlkKTtcblxuICAgICAgICAgIGlmIChwb3RlbnRpYWxSZWZlcmVuY2VEaWN0aW9uYXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcmVmZXJlbmNlRGljdGlvbmFyaWVzVG9TaG93ID1cbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVSZWZlcmVuY2VEaWN0aW9uYXJpZXNGcm9tU2VsZWN0ZWRWYWx1ZShcbiAgICAgICAgICAgICAgICBwb3RlbnRpYWxSZWZlcmVuY2VEaWN0aW9uYXJpZXMsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZU9iamVjdFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAocmVmZXJlbmNlRGljdGlvbmFyaWVzVG9TaG93Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRSZWZlcmVuY2VEaWN0aW9uYXJ5RmllbGRzSWZOZWNlc3NhcnkoXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlRGljdGlvbmFyaWVzVG9TaG93LFxuICAgICAgICAgICAgICAgIGZpZWxkQ29uZmlnSW5UcmVlLFxuICAgICAgICAgICAgICAgIGZpZWxkQ29uZmlnSW5UcmVlLnR5cGUsXG4gICAgICAgICAgICAgICAgc3BlY2lmaWNEYXRhPy5yZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zIHx8IFtdXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWVsZC5maWVsZEdyb3VwICYmIGZpZWxkLmZpZWxkR3JvdXAubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVSZWZlcmVuY2VGaWVsZHMoZmllbGQuZmllbGRHcm91cCwgcm9vdENvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGZpZWxkcyA9PT0gdGhpcy5mb3JtbHlDb25maWcgfHxcbiAgICAgIGZpZWxkcyA9PT0gdGhpcy5mb3JtbHlDb25maWdbMF0/LmZpZWxkR3JvdXBcbiAgICApIHtcbiAgICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gICAgICB0aGlzLmZvcm1seUNvbmZpZ1VwZGF0ZWQuZW1pdCgpO1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0RGljdGlvbmFyeVdpdGhSZWZlcmVuY2VzKFxuICAgIGRpY3Rpb25hcnk6IERpY3Rpb25hcnlEdG8sXG4gICAgb3B0aW9uczogRm9ybWx5RmllbGRDb25maWcsXG4gICAgZGljdGlvbmFyeUNvbnRyb2xEYXRhOiBEaWN0aW9uYXJ5Q29udHJvbERhdGFcbiAgKSB7XG4gICAgaWYgKG9wdGlvbnMucHJvcHMpIHtcbiAgICAgIHZhciBjdXJyZW50TGFuZ3VhZ2VJZCA9IFV0aWxzLmZpbmRMYW5ndWFnZUlkQnlJc28oXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgKTtcblxuICAgICAgLy8gUGFzcyBwcmVsb2FkZWQgZGljdGlvbmFyeSBkYXRhIHRvIGZvcm1seSBjb21wb25lbnRcbiAgICAgIG9wdGlvbnMucHJvcHNbJ2RpY3Rpb25hcnlEYXRhJ10gPSBkaWN0aW9uYXJ5O1xuICAgICAgb3B0aW9ucy5wcm9wc1snbGFuZ3VhZ2VzJ10gPSB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcztcbiAgICAgIG9wdGlvbnMucHJvcHNbJ3ByZWxvYWRlZERpY3Rpb25hcmllcyddID0gdGhpcy5kaWN0aW9uYXJ5TWFwO1xuICAgICAgb3B0aW9ucy5wcm9wc1sndXNlUHJlbG9hZGVkRGF0YSddID0gdHJ1ZTtcblxuICAgICAgb3B0aW9ucy5wcm9wcy5vcHRpb25zID0gZGljdGlvbmFyeS52YWx1ZXM/Lm1hcCgodmFsdWUpID0+ICh7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgbGFiZWw6XG4gICAgICAgICAgVXRpbHMuZmluZFZhbHVlVHJhbnNsYXRpb24oXG4gICAgICAgICAgICB2YWx1ZS52YWx1ZVRyYW5zbGF0aW9ucyxcbiAgICAgICAgICAgIGN1cnJlbnRMYW5ndWFnZUlkXG4gICAgICAgICAgKSB8fCB2YWx1ZS5uYW1lLFxuICAgICAgICBjdXJyZW50TGFuZ3VhZ2VJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICByZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zOlxuICAgICAgICAgIGRpY3Rpb25hcnlDb250cm9sRGF0YS5yZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zLFxuICAgICAgfSkpO1xuXG4gICAgICBvcHRpb25zLnByb3BzWydzZWxlY3RlZFJlbGF0ZWREaWN0aW9uYXJpZXMnXSA9XG4gICAgICAgIGRpY3Rpb25hcnlDb250cm9sRGF0YS5zZWxlY3RlZFJlbGF0ZWREaWN0aW9uYXJpZXMgfHwgW107XG4gICAgICBvcHRpb25zLnByb3BzWydhbGxvd011bHRpcGxlU2VsZWN0aW9uJ10gPVxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbERhdGEuYWxsb3dNdWx0aXBsZVNlbGVjdGlvbiB8fCBmYWxzZTtcblxuICAgICAgbGV0IGluaXRpYWxWYWx1ZU9iamVjdDogRGljdGlvbmFyeVZhbHVlIHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCBjb250cm9sS2V5ID0gb3B0aW9ucy5rZXkgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgZGljdGlvbmFyeURlZmF1bHRWYWx1ZUlkID1cbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xEYXRhLmRpY3Rpb25hcnlEZWZhdWx0VmFsdWVJZDtcbiAgICAgIGlmIChcbiAgICAgICAgISh0aGlzLm1vZGVsICYmIHRoaXMubW9kZWxbY29udHJvbEtleV0gIT0gbnVsbCkgJiZcbiAgICAgICAgZGljdGlvbmFyeURlZmF1bHRWYWx1ZUlkICE9IG51bGxcbiAgICAgICkge1xuICAgICAgICBpbml0aWFsVmFsdWVPYmplY3QgPSB0aGlzLmZpbmRBbmRNYXBEZWZhdWx0VmFsdWUoXG4gICAgICAgICAgZGljdGlvbmFyeSxcbiAgICAgICAgICBkaWN0aW9uYXJ5RGVmYXVsdFZhbHVlSWRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgb3B0aW9ucy5kZWZhdWx0VmFsdWUgPSBpbml0aWFsVmFsdWVPYmplY3Q7XG5cbiAgICAgIC8vIFBhc3MgZGVmYXVsdCB2YWx1ZSBJRCB0byBmb3JtbHkgY29tcG9uZW50XG4gICAgICBvcHRpb25zLnByb3BzWydkaWN0aW9uYXJ5RGVmYXVsdFZhbHVlSWQnXSA9IGRpY3Rpb25hcnlEZWZhdWx0VmFsdWVJZDtcblxuICAgICAgY29uc3QgY29udHJvbElkID0gb3B0aW9ucy5rZXk7XG4gICAgICBpZiAodGhpcy5maWxsRGF0YSAmJiB0aGlzLmZpbGxEYXRhLmZsdXgpIHtcbiAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHRoaXMuZmlsbERhdGEuZmx1eCkge1xuICAgICAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzdGVwLnNlY3Rpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gc2VjdGlvbi5jb250cm9scy5maW5kKFxuICAgICAgICAgICAgICAoY3RybDoge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xJZDogc3RyaW5nIHwgbnVtYmVyIHwgKHN0cmluZyB8IG51bWJlcilbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfSkgPT4gY3RybC5jb250cm9sSWQgPT09IGNvbnRyb2xJZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wuZmlsbFZhbHVlICYmIGNvbnRyb2wuZmlsbFZhbHVlLm5hbWUpIHtcbiAgICAgICAgICAgICAgb3B0aW9ucy5wcm9wc1sndmFsdWUnXSA9IGNvbnRyb2wuZmlsbFZhbHVlLm5hbWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICB9XG5cbiAgYXN5bmMgYWRkUmVmZXJlbmNlRGljdGlvbmFyeUZpZWxkc0lmTmVjZXNzYXJ5KFxuICAgIHJlZmVycmVuY2VkRGljdGlvbmFyaWVzOiBhbnlbXSxcbiAgICBwYXJlbnREaWN0aW9uYXJ5RmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnLFxuICAgIHR5cGU6IGFueSxcbiAgICByZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zOiBEaWN0aW9uYXJ5TGFiZWxJbmZvW11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHJlZmVycmVuY2VkRGljdGlvbmFyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUmVsYXRlZERpY3Rpb25hcmllcyA9XG4gICAgICAgIHBhcmVudERpY3Rpb25hcnlGaWVsZC5wcm9wcz8uWydzZWxlY3RlZFJlbGF0ZWREaWN0aW9uYXJpZXMnXSB8fCBbXTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWREaWN0aW9uYXJpZXMgPSByZWZlcnJlbmNlZERpY3Rpb25hcmllcy5maWx0ZXIoKGRpY3QpID0+XG4gICAgICAgIHNlbGVjdGVkUmVsYXRlZERpY3Rpb25hcmllcy5pbmNsdWRlcyhkaWN0LnV1aWQpXG4gICAgICApO1xuXG4gICAgICBzZWxlY3RlZERpY3Rpb25hcmllcy5mb3JFYWNoKChyZWZlcmVuY2VEaWN0aW9uYXJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZURpY3Rpb25hcnlVdWlkID0gcmVmZXJlbmNlRGljdGlvbmFyeS51dWlkO1xuXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudE9ubHlGb3JDb25maWcgPSB0aGlzLmZsdXhcbiAgICAgICAgICAuZmxhdE1hcCgocykgPT4gcy5zZWN0aW9ucylcbiAgICAgICAgICAuZmxhdE1hcCgoc2VjKSA9PiBzZWMuY29udHJvbHMpXG4gICAgICAgICAgLmZpbmQoXG4gICAgICAgICAgICAoY3RybCkgPT5cbiAgICAgICAgICAgICAgY3RybD8uc3BlY2lmaWNDb250cm9sRGF0YT8uZGljdGlvbmFyeVVVSUQgPT09XG4gICAgICAgICAgICAgIHJlZmVyZW5jZURpY3Rpb25hcnlVdWlkICYmIGN0cmw/LmlzT25seUZvckNvbmZpZyA9PT0gdHJ1ZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbmV3RmllbGRLZXkgPVxuICAgICAgICAgIGNvbXBvbmVudE9ubHlGb3JDb25maWc/LmlkZW50aWZpZXIgPz9cbiAgICAgICAgICBgZXh0cmFfJHtyZWZlcmVuY2VEaWN0aW9uYXJ5VXVpZH1gO1xuXG4gICAgICAgIGxldCByZWZlcmVuY2VEaWN0aW9uYXJ5TGFiZWwgPSByZWZlcmVuY2VEaWN0aW9uYXJ5Lm5hbWU7XG5cbiAgICAgICAgY29uc3Qgc3BlY2lmaWNUcmFuc2xhdGlvblZhbHVlID0gcmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9uc1xuICAgICAgICAgIC5maW5kKChkKSA9PiBkLmRpY3Rpb25hcnlVVUlEID09IHJlZmVyZW5jZURpY3Rpb25hcnlVdWlkKVxuICAgICAgICAgID8udHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgICAgICAgKHQpID0+IHQubGFuZ3VhZ2VJc28gPT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApPy52YWx1ZTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgc3BlY2lmaWNUcmFuc2xhdGlvblZhbHVlICYmXG4gICAgICAgICAgc3BlY2lmaWNUcmFuc2xhdGlvblZhbHVlLnRyaW0oKSAhPT0gJydcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmVmZXJlbmNlRGljdGlvbmFyeUxhYmVsID0gc3BlY2lmaWNUcmFuc2xhdGlvblZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlZmVyZW5jZURpY3Rpb25hcnlMYWJlbCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZUlkID0gVXRpbHMuZmluZExhbmd1YWdlSWRCeUlzbyhcbiAgICAgICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG5ld0ZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZyA9IHtcbiAgICAgICAgICBrZXk6IG5ld0ZpZWxkS2V5LFxuICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsOiByZWZlcmVuY2VEaWN0aW9uYXJ5TGFiZWwsXG4gICAgICAgICAgICBkZXNpZ246IHRoaXMuZGVzaWduLFxuICAgICAgICAgICAgZGljdGlvbmFyeUlkOiByZWZlcmVuY2VEaWN0aW9uYXJ5VXVpZCxcbiAgICAgICAgICAgIGRpY3Rpb25hcnlEYXRhOiByZWZlcmVuY2VEaWN0aW9uYXJ5LFxuICAgICAgICAgICAgbGFuZ3VhZ2VzOiB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgICAgICAgIHByZWxvYWRlZERpY3Rpb25hcmllczogdGhpcy5kaWN0aW9uYXJ5TWFwLFxuICAgICAgICAgICAgdXNlUHJlbG9hZGVkRGF0YTogdHJ1ZSxcbiAgICAgICAgICAgIGN1cnJlbnRMYW5ndWFnZUlzbzogdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgICAgICBjdXJyZW50TGFuZ3VhZ2VJZDogY3VycmVudExhbmd1YWdlSWQsXG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgc3R5bGU6IHRoaXMuc3R5bGVPYmplY3RUb1N0cmluZ0V4Y2VwdEJhY2tncm91bmQoXG4gICAgICAgICAgICAgICAgdGhpcy5kZXNpZ25bYC5mb250LWxpc3RgXSB8fCB7fVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHJlZmVyZW5jZURpY3Rpb25hcnkudmFsdWVzPy5tYXAoKHZhbHVlOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6XG4gICAgICAgICAgICAgICAgVXRpbHMuZmluZFZhbHVlVHJhbnNsYXRpb24oXG4gICAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZVRyYW5zbGF0aW9ucyxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRMYW5ndWFnZUlkXG4gICAgICAgICAgICAgICAgKSB8fCB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICBjdXJyZW50TGFuZ3VhZ2VJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHJlZmVyZW5jZURpY3Rpb25hcnkuZGVmYXVsdFZhbHVlSWQpIHtcbiAgICAgICAgICBjb25zdCBkZWZhdWx0VmFsID0gdGhpcy5maW5kQW5kTWFwRGVmYXVsdFZhbHVlKFxuICAgICAgICAgICAgcmVmZXJlbmNlRGljdGlvbmFyeSxcbiAgICAgICAgICAgIHJlZmVyZW5jZURpY3Rpb25hcnkuZGVmYXVsdFZhbHVlSWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChkZWZhdWx0VmFsKSB7XG4gICAgICAgICAgICBuZXdGaWVsZC5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudEZpZWxkR3JvdXAgPSBwYXJlbnREaWN0aW9uYXJ5RmllbGQucGFyZW50XG4gICAgICAgICAgPyBwYXJlbnREaWN0aW9uYXJ5RmllbGQucGFyZW50LmZpZWxkR3JvdXBcbiAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGlmIChwYXJlbnRGaWVsZEdyb3VwKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50SW5kZXggPSBwYXJlbnRGaWVsZEdyb3VwLmZpbmRJbmRleChcbiAgICAgICAgICAgIChmaWVsZCkgPT4gZmllbGQua2V5ID09PSBwYXJlbnREaWN0aW9uYXJ5RmllbGQua2V5XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocGFyZW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IHRoaXMuZmluZExhc3RDaGlsZEluZGV4KFxuICAgICAgICAgICAgICBwYXJlbnRGaWVsZEdyb3VwLFxuICAgICAgICAgICAgICBwYXJlbnRJbmRleFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgcGVyY2VudGFnZVRvQWRkID0gdGhpcy5nZXRFeGlzdGluZ1BlcmNlbnRhZ2UoXG4gICAgICAgICAgICAgIHBhcmVudEZpZWxkR3JvdXAsXG4gICAgICAgICAgICAgIHBhcmVudEluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbmV3RmllbGQuY2xhc3NOYW1lID0gcGVyY2VudGFnZVRvQWRkID09PSAwXG4gICAgICAgICAgICAgID8gcGFyZW50RGljdGlvbmFyeUZpZWxkLmNsYXNzTmFtZVxuICAgICAgICAgICAgICA6IHRoaXMuZ2V0UGVyY2VudGFnZUNsYXNzTmFtZShwZXJjZW50YWdlVG9BZGQpO1xuXG4gICAgICAgICAgICBwYXJlbnRGaWVsZEdyb3VwLnNwbGljZShlbmRJbmRleCArIDEsIDAsIG5ld0ZpZWxkKTtcblxuICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lVG9BZGQgPVxuICAgICAgICAgICAgICB0eXBlID09PSAncmFkaW8nID8gYCBjb21wb25lbnQtcmFkaW9gIDogYCBjb21wb25lbnQtZGF0YWA7XG4gICAgICAgICAgICBuZXdGaWVsZC5jbGFzc05hbWUgKz0gY2xhc3NOYW1lVG9BZGQ7XG4gICAgICAgICAgICB0aGlzLmF0dGFjaFRvVmFsdWVDaGFuZ2VzKG5ld0ZpZWxkS2V5LCBuZXdGaWVsZCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RXhpc3RpbmdQZXJjZW50YWdlKGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSwgaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IHBlcmNlbnRhZ2UgPSAwO1xuICAgIGNvbnN0IGZpZWxkID0gZmllbGRzW2luZGV4XTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBmaWVsZC5jbGFzc05hbWU7XG4gICAgaWYgKGZpZWxkLnR5cGU/LnRvU3RyaW5nKCkgIT09IFN0ZXBDb250cm9sVHlwZS5OZXdSb3cudG9TdHJpbmcoKSkge1xuICAgICAgaWYgKGNsYXNzTmFtZSAmJiBjbGFzc05hbWUuc3RhcnRzV2l0aCgncGVyY2VudGFnZS13aWR0aC0nKSkge1xuICAgICAgICBwZXJjZW50YWdlID1cbiAgICAgICAgICAocGFyc2VJbnQoY2xhc3NOYW1lLnJlcGxhY2UoJ3BlcmNlbnRhZ2Utd2lkdGgtJywgJycpLCAxMCkgKiAxMDApIC8gMTI7XG4gICAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSAmJiBjbGFzc05hbWUuc3RhcnRzV2l0aCgncGl4ZWwtd2lkdGgtJykpIHtcbiAgICAgICAgY29uc3QgcGl4ZWxzID0gcGFyc2VJbnQoY2xhc3NOYW1lLnJlcGxhY2UoJ3BpeGVsLXdpZHRoLScsICcnKSwgMTApO1xuICAgICAgICBwZXJjZW50YWdlID0gKHBpeGVscyAvIDEwMDApICogMTAwO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGVyY2VudGFnZTtcbiAgfVxuXG4gIGNhbGN1bGF0ZVJlbWFpbmluZ1BlcmNlbnRhZ2VGb3JSYW5nZShcbiAgICBmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICAgIGVuZEluZGV4OiBudW1iZXJcbiAgKTogbnVtYmVyIHtcbiAgICBsZXQgcmVtYWluaW5nUGVyY2VudGFnZSA9IDEwMDtcblxuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyBpKyspIHtcbiAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB0aGlzLmdldEV4aXN0aW5nUGVyY2VudGFnZShmaWVsZHMsIGkpO1xuICAgICAgcmVtYWluaW5nUGVyY2VudGFnZSAtPSBwZXJjZW50YWdlO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5tYXgocmVtYWluaW5nUGVyY2VudGFnZSwgMCk7XG4gIH1cblxuICByZW1vdmVSZWZlcmVuY2VGaWVsZHMoY3VycmVudEZvcm1seUZpZWxkQ29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZykge1xuICAgIGNvbnN0IHJlZmVycmVkSW5EaWN0aW9uYXJpZXNVVUlkcyA9XG4gICAgICBjdXJyZW50Rm9ybWx5RmllbGRDb25maWcucHJvcHM/LlsnZGljdGlvbmFyeURhdGEnXVxuICAgICAgICA/LnJlZmVycmVkSW5EaWN0aW9uYXJpZXNVVUlkcztcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlZmVycmVkSW5EaWN0aW9uYXJpZXNVVUlkcykpIHtcbiAgICAgIGNvbnN0IHBhcmVudEZpZWxkR3JvdXAgPSBjdXJyZW50Rm9ybWx5RmllbGRDb25maWcucGFyZW50XG4gICAgICAgID8gY3VycmVudEZvcm1seUZpZWxkQ29uZmlnLnBhcmVudC5maWVsZEdyb3VwXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGlmIChwYXJlbnRGaWVsZEdyb3VwKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudEluZGV4ID0gcGFyZW50RmllbGRHcm91cC5maW5kSW5kZXgoXG4gICAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5rZXkgPT09IGN1cnJlbnRGb3JtbHlGaWVsZENvbmZpZy5rZXlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocGFyZW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHJlZmVycmVkSW5EaWN0aW9uYXJpZXNVVUlkcykge1xuICAgICAgICAgICAgY29uc3QgaWRUb0ZpbmQgPSAnZXh0cmFfJyArIGl0ZW07XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwYXJlbnRGaWVsZEdyb3VwLmxlbmd0aCAtIDE7IGkgPiBwYXJlbnRJbmRleDsgaS0tKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRGaWVsZEtleSA9IHBhcmVudEZpZWxkR3JvdXBbaV0ua2V5Py50b1N0cmluZygpO1xuICAgICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkS2V5ICYmIGN1cnJlbnRGaWVsZEtleSA9PT0gaWRUb0ZpbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyRm9ybUNvbnRyb2xWYWx1ZShpZFRvRmluZCk7XG4gICAgICAgICAgICAgICAgcGFyZW50RmllbGRHcm91cC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBhZGRDaGlsZERpY3Rpb25hcnlGaWVsZChcbiAgICBjaGlsZERpY3Rpb25hcnlVdWlkOiBzdHJpbmcsXG4gICAgcGFyZW50RGljdGlvbmFyeUZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZyxcbiAgICB0eXBlOiBhbnksXG4gICAgcmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9uczogRGljdGlvbmFyeUxhYmVsSW5mb1tdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChjaGlsZERpY3Rpb25hcnlVdWlkKSB7XG4gICAgICBjb25zdCBjaGlsZERpY3Rpb25hcnkgPSB0aGlzLmRpY3Rpb25hcnlNYXAuZ2V0KGNoaWxkRGljdGlvbmFyeVV1aWQpO1xuICAgICAgaWYgKGNoaWxkRGljdGlvbmFyeSkge1xuICAgICAgICBsZXQgY2hpbGREaWN0aW9uYXJ5TGFiZWwgPSBjaGlsZERpY3Rpb25hcnkubmFtZTtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPVxuICAgICAgICAgIHJlbGF0ZWREaWN0aW9uYXJpZXNUcmFuc2xhdGlvbnNcbiAgICAgICAgICAgIC5maW5kKChkKSA9PiBkLmRpY3Rpb25hcnlVVUlEID09IGNoaWxkRGljdGlvbmFyeVV1aWQpXG4gICAgICAgICAgICA/LnRyYW5zbGF0aW9ucy5maW5kKCh0KSA9PiB0Lmxhbmd1YWdlSXNvID09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvKVxuICAgICAgICAgICAgPy52YWx1ZSB8fCAnJztcbiAgICAgICAgaWYgKHRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgY2hpbGREaWN0aW9uYXJ5TGFiZWwgPSB0cmFuc2xhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdGaWVsZDogRm9ybWx5RmllbGRDb25maWcgPSB7XG4gICAgICAgICAga2V5OiBgJHtwYXJlbnREaWN0aW9uYXJ5RmllbGQua2V5fV9jaGlsZF8ke2NoaWxkRGljdGlvbmFyeVV1aWR9YCxcbiAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbDogY2hpbGREaWN0aW9uYXJ5TGFiZWwsXG4gICAgICAgICAgICBkaWN0aW9uYXJ5RGF0YTogY2hpbGREaWN0aW9uYXJ5LFxuICAgICAgICAgICAgbGFuZ3VhZ2VzOiB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgICAgICAgIHByZWxvYWRlZERpY3Rpb25hcmllczogdGhpcy5kaWN0aW9uYXJ5TWFwLFxuICAgICAgICAgICAgb3B0aW9uczogY2hpbGREaWN0aW9uYXJ5LnZhbHVlcz8ubWFwKCh2YWx1ZSkgPT4gKHtcbiAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLmlkLFxuICAgICAgICAgICAgICBsYWJlbDogdmFsdWUubmFtZSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICBzdHlsZTogdGhpcy5zdHlsZU9iamVjdFRvU3RyaW5nRXhjZXB0QmFja2dyb3VuZChcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2lnbltgLmZvbnQtbGlzdGBdIHx8IHt9XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaG9va3M6IHtcbiAgICAgICAgICAgIG9uSW5pdDogKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgICAgICAgICAgIHRoaXMuZmllbGRVbnN1YnNjcmliZVN1YmplY3RzLnB1c2godW5zdWJzY3JpYmUkKTtcblxuICAgICAgICAgICAgICBmaWVsZC5mb3JtQ29udHJvbD8udmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHVuc3Vic2NyaWJlJCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShhc3luYyAoc2VsZWN0ZWRWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSBjaGlsZERpY3Rpb25hcnkudmFsdWVzPy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAodmFsKSA9PiB2YWwuaWQgPT09IHNlbGVjdGVkVmFsdWVcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRPcHRpb24gJiYgc2VsZWN0ZWRPcHRpb24uY2hpbGREaWN0aW9uYXJ5VVVJRCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFkZENoaWxkRGljdGlvbmFyeUZpZWxkKFxuICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9uLmNoaWxkRGljdGlvbmFyeVVVSUQsXG4gICAgICAgICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUNoaWxkRmllbGRzKGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtbHlDb25maWcoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBmaWVsZC5ob29rcyEub25EZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgdW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcGFyZW50RmllbGRHcm91cCA9IHBhcmVudERpY3Rpb25hcnlGaWVsZC5wYXJlbnRcbiAgICAgICAgICA/IHBhcmVudERpY3Rpb25hcnlGaWVsZC5wYXJlbnQuZmllbGRHcm91cFxuICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgaWYgKHBhcmVudEZpZWxkR3JvdXApIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnRJbmRleCA9IHBhcmVudEZpZWxkR3JvdXAuZmluZEluZGV4KFxuICAgICAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5rZXkgPT09IHBhcmVudERpY3Rpb25hcnlGaWVsZC5rZXlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwYXJlbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZEluZGV4ID0gdGhpcy5maW5kTGFzdENoaWxkSW5kZXgoXG4gICAgICAgICAgICAgIHBhcmVudEZpZWxkR3JvdXAsXG4gICAgICAgICAgICAgIHBhcmVudEluZGV4XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBwZXJjZW50YWdlVG9BZGQgPSB0aGlzLmdldEV4aXN0aW5nUGVyY2VudGFnZShcbiAgICAgICAgICAgICAgcGFyZW50RmllbGRHcm91cCxcbiAgICAgICAgICAgICAgcGFyZW50SW5kZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBuZXdGaWVsZC5jbGFzc05hbWUgPSB0aGlzLmdldFBlcmNlbnRhZ2VDbGFzc05hbWUocGVyY2VudGFnZVRvQWRkKTtcbiAgICAgICAgICAgIHBhcmVudEZpZWxkR3JvdXAuc3BsaWNlKGVuZEluZGV4ICsgMSwgMCwgbmV3RmllbGQpO1xuXG4gICAgICAgICAgICBjb25zdCBjbGFzc05hbWVUb0FkZCA9XG4gICAgICAgICAgICAgIHR5cGUgPT09ICdyYWRpbycgPyBgIGNvbXBvbmVudC1yYWRpb2AgOiBgIGNvbXBvbmVudC1kYXRhYDtcbiAgICAgICAgICAgIG5ld0ZpZWxkLmNsYXNzTmFtZSArPSBjbGFzc05hbWVUb0FkZDtcbiAgICAgICAgICAgIC8vdGhpcy5hdHRhY2hUb1ZhbHVlQ2hhbmdlcyhuZXdGaWVsZEtleSwgbmV3RmllbGQpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtbHlDb25maWcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgQ2hpbGQgZGljdGlvbmFyeSBub3QgZm91bmQgZm9yIFVVSUQgJHtjaGlsZERpY3Rpb25hcnlVdWlkfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkNvbXBsZXRpb24oKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ09yaWdpbiBmb3JtIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICB0aGlzLmNvbXBsZXRpb25FdmVudC5lbWl0KCk7XG4gIH1cblxuICBmaW5kTGFzdENoaWxkSW5kZXgoZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdLCBwYXJlbnRJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBwYXJlbnRLZXlQcmVmaXggPSBgJHtmaWVsZHNbcGFyZW50SW5kZXhdLmtleX1fYDtcbiAgICBsZXQgbGFzdEluZGV4ID0gcGFyZW50SW5kZXg7XG5cbiAgICBmb3IgKGxldCBpID0gcGFyZW50SW5kZXggKyAxOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZmllbGRzW2ldLmtleT8udG9TdHJpbmcoKS5zdGFydHNXaXRoKHBhcmVudEtleVByZWZpeCkpIHtcbiAgICAgICAgbGFzdEluZGV4ID0gaTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYXN0SW5kZXg7XG4gIH1cblxuICBmaW5kRmllbGRCeUtleShcbiAgICBmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10sXG4gICAga2V5OiBzdHJpbmdcbiAgKTogRm9ybWx5RmllbGRDb25maWcgfCBudWxsIHtcbiAgICBpZiAoIWZpZWxkcykgcmV0dXJuIG51bGw7XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnc3RlcHBlcicgJiYgZmllbGQuZmllbGRHcm91cCkge1xuICAgICAgICBjb25zdCBmb3VuZEluU3RlcHBlciA9IHRoaXMuZmluZEZpZWxkQnlLZXkoZmllbGQuZmllbGRHcm91cCwga2V5KTtcbiAgICAgICAgaWYgKGZvdW5kSW5TdGVwcGVyKSByZXR1cm4gZm91bmRJblN0ZXBwZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWVsZC5rZXkgPT09IGtleSkge1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQuZmllbGRHcm91cCkge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZmluZEZpZWxkQnlLZXkoZmllbGQuZmllbGRHcm91cCwga2V5KTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmVtb3ZlQ2hpbGRGaWVsZHMocGFyZW50RmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnKSB7XG4gICAgY29uc3QgcGFyZW50RmllbGRHcm91cCA9IHBhcmVudEZpZWxkLnBhcmVudFxuICAgICAgPyBwYXJlbnRGaWVsZC5wYXJlbnQuZmllbGRHcm91cFxuICAgICAgOiBudWxsO1xuXG4gICAgaWYgKHBhcmVudEZpZWxkR3JvdXApIHtcbiAgICAgIGNvbnN0IHBhcmVudEluZGV4ID0gcGFyZW50RmllbGRHcm91cC5maW5kSW5kZXgoXG4gICAgICAgIChmaWVsZCkgPT4gZmllbGQua2V5ID09PSBwYXJlbnRGaWVsZC5rZXlcbiAgICAgICk7XG5cbiAgICAgIGlmIChwYXJlbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgY29uc3QgcGFyZW50S2V5UHJlZml4ID0gYCR7cGFyZW50RmllbGQua2V5fV9jaGlsZF9gO1xuXG4gICAgICAgIC8vIFJlbW92ZSBvbmx5IHRoZSByZWxldmFudCBjaGlsZCBmaWVsZHNcbiAgICAgICAgZm9yIChsZXQgaSA9IHBhcmVudEZpZWxkR3JvdXAubGVuZ3RoIC0gMTsgaSA+IHBhcmVudEluZGV4OyBpLS0pIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50RmllbGRLZXkgPSBwYXJlbnRGaWVsZEdyb3VwW2ldLmtleT8udG9TdHJpbmcoKTtcbiAgICAgICAgICBpZiAoY3VycmVudEZpZWxkS2V5ICYmIGN1cnJlbnRGaWVsZEtleS5zdGFydHNXaXRoKHBhcmVudEtleVByZWZpeCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJGb3JtQ29udHJvbFZhbHVlKGN1cnJlbnRGaWVsZEtleSk7XG4gICAgICAgICAgICBwYXJlbnRGaWVsZEdyb3VwLnNwbGljZShpLCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTkVXOiBMb2FkIEFMTCBkaWN0aW9uYXJpZXMgbmVlZGVkIGZvciB0aGlzIGFwcCB1c2luZyB0aGUgbmV3IGFwcC1iYXNlZCBlbmRwb2ludFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkQWxsUmVxdWlyZWREaWN0aW9uYXJpZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFwcE1vZGVsPy5hcHBsaWNhdGlvblV1aWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gYXBwIFVVSUQgYXZhaWxhYmxlIGZvciBkaWN0aW9uYXJ5IGxvYWRpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmxvYWRBcHBEaWN0aW9uYXJpZXMoXG4gICAgICAgICAgdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICAgICAgRW52aXJvbm1lbnRUeXBlLkNvbmZpZ1xuICAgICAgICApXG4gICAgICApO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAn4p2MIEJhY2tlbmQgZmFpbGVkIHRvIGxvYWQgZGljdGlvbmFyaWVzOicsXG4gICAgICAgICAgcmVzcG9uc2UuZXJyb3JzXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2ltcGxlIGFzc2lnbm1lbnQgLSBBTEwgZGljdGlvbmFyaWVzIGFuZCBkZXBlbmRlbmNpZXMgYWxyZWFkeSBsb2FkZWQgYnkgYmFja2VuZFxuICAgICAgT2JqZWN0LmVudHJpZXMocmVzcG9uc2UuZGljdGlvbmFyaWVzKS5mb3JFYWNoKChbdXVpZCwgZGljdF0pID0+IHtcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5TWFwLnNldCh1dWlkLCBkaWN0KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIGxvYWQgYXBwIGRpY3Rpb25hcmllczonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJGb3JtQ29udHJvbFZhbHVlKGZpZWxkS2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBrZXlzID0gZmllbGRLZXkuc3BsaXQoJy4nKTtcbiAgICBsZXQgY29udHJvbCA9IHRoaXMuZm9ybTtcbiAgICBsZXQgbW9kZWwgPSB0aGlzLm1vZGVsO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29udHJvbCA9IGNvbnRyb2wuZ2V0KGtleXNbaV0pIGFzIEZvcm1Hcm91cDtcbiAgICAgIG1vZGVsID0gbW9kZWxba2V5c1tpXV07XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxLZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC5nZXQoZmluYWxLZXkpKSB7XG4gICAgICBjb250cm9sLnJlbW92ZUNvbnRyb2woZmluYWxLZXkpO1xuICAgIH1cblxuICAgIGlmIChtb2RlbCAmJiBtb2RlbFtmaW5hbEtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVsZXRlIG1vZGVsW2ZpbmFsS2V5XTtcbiAgICB9XG4gIH1cblxuICBmaW5kRmllbGQoXG4gICAgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdLFxuICAgIGtleTogc3RyaW5nXG4gICk6IEZvcm1seUZpZWxkQ29uZmlnIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZC5rZXkgPT09IGtleSkge1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQuZmllbGRHcm91cCkge1xuICAgICAgICBjb25zdCBuZXN0ZWRGaWVsZCA9IHRoaXMuZmluZEZpZWxkKGZpZWxkLmZpZWxkR3JvdXAsIGtleSk7XG4gICAgICAgIGlmIChuZXN0ZWRGaWVsZCkge1xuICAgICAgICAgIHJldHVybiBuZXN0ZWRGaWVsZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcG9wdWxhdGVNb2RlbFdpdGhGaWxsRGF0YShmaWxsRGF0YTogYW55KTogdm9pZCB7XG4gICAgaWYgKGZpbGxEYXRhKSB7XG4gICAgICBsZXQgYXV4TW9kZWwgPSBNb2RlbFBvcHVsYXRpb25IZWxwZXIucG9wdWxhdGVNb2RlbFdpdGhGaWxsRGF0YShcbiAgICAgICAgZmlsbERhdGEsXG4gICAgICAgIHRoaXMuZmx1eCxcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5TWFwLFxuICAgICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlc1xuICAgICAgKTtcbiAgICAgIHRoaXMubW9kZWwgPSB7IC4uLmF1eE1vZGVsIH07XG4gICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbmRBbmRNYXBEZWZhdWx0VmFsdWUoXG4gICAgZGljdGlvbmFyeTogRGljdGlvbmFyeUR0byB8IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWVJZDogbnVtYmVyXG4gICk6IERpY3Rpb25hcnlWYWx1ZSB8IG51bGwge1xuICAgIHJldHVybiBNb2RlbFBvcHVsYXRpb25IZWxwZXIuZmluZEFuZE1hcERlZmF1bHRWYWx1ZShcbiAgICAgIGRpY3Rpb25hcnksXG4gICAgICBkZWZhdWx0VmFsdWVJZCxcbiAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZUZvcm1seUNvbmZpZygpIHtcbiAgICB0aGlzLmZvcm1seUNvbmZpZyA9IFsuLi50aGlzLmZvcm1seUNvbmZpZ107XG4gIH1cblxuICBwcml2YXRlIHVuc3Vic2NyaWJlRnJvbUFsbEZpZWxkcygpIHtcbiAgICBmb3IgKGNvbnN0IHN1YmplY3Qgb2YgdGhpcy5maWVsZFVuc3Vic2NyaWJlU3ViamVjdHMpIHtcbiAgICAgIHN1YmplY3QubmV4dCgpO1xuICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgIH1cbiAgICB0aGlzLmZpZWxkVW5zdWJzY3JpYmVTdWJqZWN0cyA9IFtdO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnN1YnNjcmliZUZyb21BbGxGaWVsZHMoKTtcbiAgICBpZiAodGhpcy5jb2xsZWN0b3JIYW5kbGVyU3Vic2NyaXB0aW9ucykge1xuICAgICAgdGhpcy5jb2xsZWN0b3JIYW5kbGVyU3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5hY3Rpb25TdGVwU3Vic2NyaXB0aW9ucykge1xuICAgICAgdGhpcy5hY3Rpb25TdGVwU3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5hY3Rpb25TdGVwSGFuZGxlcikge1xuICAgICAgdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0QnV0dG9ucyhidXR0b25zQ29uZmlnOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoIWJ1dHRvbnNDb25maWcgfHwgYnV0dG9uc0NvbmZpZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1dHRvbnNDb25maWcubWFwKChidXR0b24pID0+ICh7XG4gICAgICB0eXBlOiBidXR0b24udmFsdWUudG9Mb3dlckNhc2UoKSxcbiAgICAgIGxhYmVsOiBidXR0b24udHJhbnNsYXRpb25zPy5bdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29dIHx8IGJ1dHRvbi52YWx1ZSxcbiAgICAgIHN0eWxlS2V5OiBgLmJ1dHRvbi0ke2J1dHRvbi52YWx1ZS50b0xvd2VyQ2FzZSgpfWAsXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdHlsZU9iamVjdFRvU3RyaW5nRXhjZXB0QmFja2dyb3VuZChzdHlsZU9iajogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoc3R5bGVPYmopXG4gICAgICAuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IGtleSAhPT0gJ2JhY2tncm91bmQtY29sb3InKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9OiAke3ZhbHVlfWApXG4gICAgICAuam9pbignOyAnKTtcbiAgfVxuXG4gIHZhbGlkYXRlTWV0aG9kQXBpKGRhdGE6IEFwaVZhbGlkYXRlUmVxdWVzdCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGlmIChkYXRhLmFwaUlkID09PSB1bmRlZmluZWQgfHwgZGF0YS5hcHBJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFwcGxpY2F0aW9uRGF0YVNlcnZpY2UudmFsaWRhdGVBcGkoZGF0YSkucGlwZShcbiAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0FQSSB2YWxpZGF0aW9uIHJlc3BvbnNlOicsIHJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuICEhcmVzcG9uc2U7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHZhbGlkYXRpbmcgJyArIGRhdGEuZGF0YSwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBtZXRob2QgdG8gY2xlYXIgdGhlIHNhdmluZyBhZnRlciBhY3Rpb25zIHN0YXRlXG4gICAqIENhbGxlZCBieSBzdGVwcGVyIGNvbXBvbmVudCBhZnRlciBzYXZlQXBwRGF0YVN0ZXAgY29tcGxldGVzXG4gICAqL1xuICBwdWJsaWMgY2xlYXJTYXZpbmdBZnRlckFjdGlvbnNTdGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1NhdmluZ0FmdGVyQWN0aW9ucykge1xuICAgICAgdGhpcy5pc1NhdmluZ0FmdGVyQWN0aW9ucyA9IGZhbHNlO1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuICBsb2FkaW5nTWVzc2FnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG59XG4iLCI8ZGl2ICpuZ0lmPVwiaXNMb2FkaW5nXCIgY2xhc3M9XCJsb2FkaW5nLW92ZXJsYXlcIj5cbiAgPG1hdC1zcGlubmVyPjwvbWF0LXNwaW5uZXI+XG48L2Rpdj5cbjxkaXYgW2hpZGRlbl09XCJpc0xvYWRpbmdcIj5cbiAgPGRpdiAqbmdJZj1cInNob3dMYW5ndWFnZVNlbGVjdG9yXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInJpZ2h0LWFsaWduZWRcIj5cbiAgICA8YnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJmbGFnc1wiIG1hdC1pY29uLWJ1dHRvbiBjbGFzcz1cIm0tci01XCI+XG4gICAgICA8aW1nXG4gICAgICAgIFtzcmNdPVwicmV0dXJuRkxhZyhjdXJyZW50TGFuZ3VhZ2VJc28pXCJcbiAgICAgICAgY2xhc3M9XCJyb3VuZGVkLWNpcmNsZSBvYmplY3QtY292ZXIgaWNvbi0yMFwiXG4gICAgICAvPlxuICAgIDwvYnV0dG9uPlxuICAgIDxtYXQtbWVudSAjZmxhZ3M9XCJtYXRNZW51XCIgY2xhc3M9XCJjYXJkV2l0aFNoYWRvd1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICpuZ0Zvcj1cImxldCBsYW5nIG9mIGFwcGxpY2F0aW9uTGFuZ3VhZ2VzKClcIlxuICAgICAgICAoY2xpY2spPVwiY2hhbmdlTGFuZ3VhZ2UobGFuZy5pc28pXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICA8aW1nXG4gICAgICAgICAgICBbc3JjXT1cInJldHVybkZMYWcobGFuZy5pc28pXCJcbiAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1jaXJjbGUgb2JqZWN0LWNvdmVyIGljb24tMjBcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtc3VidGl0bGUtMSBmLXMtMTRcIj57eyBsYW5nLm5hbWUgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9idXR0b24+XG4gICAgPC9tYXQtbWVudT5cbiAgPC9kaXY+XG5cbiAgPGJyIC8+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lclwiPlxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChuZ1N1Ym1pdCk9XCJzdWJtaXQoKVwiPlxuICAgICAgPGZvcm1seS1mb3JtXG4gICAgICAgIFttb2RlbF09XCJtb2RlbFwiXG4gICAgICAgIFtmaWVsZHNdPVwiZm9ybWx5Q29uZmlnXCJcbiAgICAgICAgW29wdGlvbnNdPVwib3B0aW9uc1wiXG4gICAgICAgIFtmb3JtXT1cImZvcm1cIlxuICAgICAgPjwvZm9ybWx5LWZvcm0+XG4gICAgPC9mb3JtPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
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=