@gnggln/ng-ui-system 1.0.0-alpha.23 → 1.0.0-alpha.24

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.
@@ -22,7 +22,11 @@ export class UiWizardHeaderComponent {
22
22
  this.disableStepIndicators = false;
23
23
  this.stepSelect = new EventEmitter();
24
24
  }
25
- /** Indice step selezionabile tramite bullet/titolo (solo step già completati, non il corrente). */
25
+ /**
26
+ * Indice step selezionabile tramite bullet/titolo (step già visitati, non il corrente).
27
+ * Usa `visitedSteps` (non solo `completedSteps`) così si può tornare allo step corrente
28
+ * incompleto dopo aver navigato indietro (es. resume sul primo step non valido).
29
+ */
26
30
  isStepIndicatorNavigable(stepIndex) {
27
31
  if (this.config.allowStepIndicatorNavigation === false)
28
32
  return false;
@@ -31,7 +35,7 @@ export class UiWizardHeaderComponent {
31
35
  if (this.config.allowBackNavigation === false)
32
36
  return false;
33
37
  return (stepIndex !== this.state.currentStep &&
34
- this.state.completedSteps.has(stepIndex));
38
+ this.state.visitedSteps.has(stepIndex));
35
39
  }
36
40
  /** Testo accessibile per il pulsante step (navigazione). */
37
41
  stepAriaLabel(stepTitle) {
@@ -662,7 +666,7 @@ export class UiFormWizardComponent {
662
666
  }
663
667
  /**
664
668
  * Navigazione tramite indicatori step (bullet + titolo) quando `progressStyle` è `'steps'`.
665
- * Consentito solo verso step già marcati completati.
669
+ * Consentito verso step già visitati (anche se non ancora completati/validi).
666
670
  */
667
671
  onWizardStepIndicatorSelect(stepIndex) {
668
672
  if (this.disabled)
@@ -673,7 +677,7 @@ export class UiFormWizardComponent {
673
677
  return;
674
678
  if (stepIndex === this.state.currentStep)
675
679
  return;
676
- if (!this.state.completedSteps.has(stepIndex))
680
+ if (!this.state.visitedSteps.has(stepIndex))
677
681
  return;
678
682
  this.logger?.logWizardAction('navigation', {
679
683
  wizardId: this.wizardConfig.wizardId,
@@ -1148,4 +1152,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1148
1152
  type: HostListener,
1149
1153
  args: ['document:keydown', ['$event']]
1150
1154
  }] } });
1151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS13aXphcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXIvZm9ybS13aXphcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsTUFBTSxFQUVOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQWtCbEUsT0FBTyxFQUNMLG1CQUFtQixHQUVwQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7O0FBRXBFLHFFQUFxRTtBQUVyRTs7O0dBR0c7QUFnSEgsTUFBTSxPQUFPLHVCQUF1QjtJQS9HcEM7UUFpSFcsZUFBVSxHQUFzQixFQUFFLENBQUM7UUFFbkMsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFDcEIscUJBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLDJCQUFzQixHQUFHLEVBQUUsQ0FBQztRQUNyQyxpRkFBaUY7UUFDeEUsMEJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBRTdCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0tBaUJuRDtJQWZDLG1HQUFtRztJQUNuRyx3QkFBd0IsQ0FBQyxTQUFpQjtRQUN4QyxJQUFJ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Uzt1QkFBQyxzQkFBc0I7Z0JBS3hCLE1BQU07c0JBQWQsS0FBSztnQkFHRyxZQUFZO3NCQUFwQixLQUFLO2dCQUdHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFHRywyQkFBMkI7c0JBQW5DLEtBQUs7Z0JBSUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFJRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBd0pQLGlCQUFpQjtzQkFEaEIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT25Jbml0LFxyXG4gIE9uRGVzdHJveSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBWaWV3Q2hpbGQsXHJcbiAgaW5qZWN0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTHVjaWRlQW5ndWxhck1vZHVsZSB9IGZyb20gJ2x1Y2lkZS1hbmd1bGFyJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFVpQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9idXR0b24vaW5kZXgnO1xyXG5cclxuaW1wb3J0IHsgVWlGb3JtQnVpbGRlckNvbXBvbmVudCB9IGZyb20gJy4vZm9ybS1idWlsZGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgVWlGb3JtU2NoZW1hLFxyXG4gIFVpRm9ybVNlY3Rpb24sXHJcbiAgVWlGb3JtRGF0YSxcclxuICBVaVdpemFyZENvbmZpZyxcclxuICBVaVdpemFyZFN0YXRlLFxyXG4gIFVpV2l6YXJkU3RlcENoYW5nZUV2ZW50LFxyXG4gIFVpV2l6YXJkU3RlcENvbXBsZXRlRXZlbnQsXHJcbiAgVWlXaXphcmRSZXN1bWVPcHRpb25zLFxyXG4gIFVpV2l6YXJkUmVzdW1lUmVzdWx0LFxyXG4gIFVpV2l6YXJkVmFsaWRhdGlvbkZuLFxyXG4gIFVpRm9ybUN1c3RvbUV2ZW50LFxyXG59IGZyb20gJy4vdHlwZXMvc2NoZW1hLnR5cGVzJztcclxuaW1wb3J0IHtcclxuICBVaUZvcm1FcnJvckRldGFpbCxcclxuICBVaUZvcm1WYWxpZGF0aW9uU3RhdGUsXHJcbn0gZnJvbSAnLi90eXBlcy92YWxpZGF0aW9uLnR5cGVzJztcclxuaW1wb3J0IHtcclxuICBVaVdpemFyZFN5bmNTZXJ2aWNlLFxyXG4gIFVpV2l6YXJkU3luY0RhdGEsXHJcbn0gZnJvbSAnLi9zZXJ2aWNlcy93aXphcmQtc3luYy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVWlMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9sb2dnaW5nL2xvZ2dlci5zZXJ2aWNlJztcclxuXHJcbi8vIOKUgOKUgOKUgCBDb21wb25lbnRpIGludGVybmkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4vKipcclxuICogSGVhZGVyIGRlbCB3aXphcmQ6IHByb2dyZXNzbyBlIGluZm8gZGVsbG8gc3RlcCBjb3JyZW50ZS5cclxuICogQ29uIGBwcm9ncmVzc1N0eWxlOiAnc3RlcHMnYCBlbWV0dGUgYHN0ZXBTZWxlY3RgIHBlciBzYWx0YXJlIGEgdW5vIHN0ZXAgZ2nDoCBjb21wbGV0YXRvLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd1aS13aXphcmQtaGVhZGVyJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtMdWNpZGVBbmd1bGFyTW9kdWxlXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX2hlYWRlclwiPlxyXG4gICAgICBAaWYgKGNvbmZpZy5zaG93UHJvZ3Jlc3MgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgQGlmIChjb25maWcucHJvZ3Jlc3NTdHlsZSAhPT0gJ3N0ZXBzJykge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19wcm9ncmVzcy1iYXJcIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3Byb2dyZXNzLWZpbGxcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cInByb2dyZXNzUGVyY2VudFwiXHJcbiAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fcHJvZ3Jlc3MtdGV4dFwiPlxyXG4gICAgICAgICAgICB7eyBwcm9ncmVzc1BlcmNlbnQgfX0lIGNvbXBsZXRhdG9cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcHNcIj5cclxuICAgICAgICAgICAgQGZvciAoXHJcbiAgICAgICAgICAgICAgZ3JvdXAgb2Ygc3RlcEdyb3VwcztcclxuICAgICAgICAgICAgICB0cmFjayAkaW5kZXg7XHJcbiAgICAgICAgICAgICAgbGV0IGkgPSAkaW5kZXhcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MudWktZm9ybS13aXphcmRfX3N0ZXAtLWN1cnJlbnRdPVwiXHJcbiAgICAgICAgICAgICAgICAgIGkgPT09IHN0YXRlLmN1cnJlbnRTdGVwXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLnVpLWZvcm0td2l6YXJkX19zdGVwLS1jb21wbGV0ZWRdPVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0YXRlLmNvbXBsZXRlZFN0ZXBzLmhhcyhpKVxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy51aS1mb3JtLXdpemFyZF9fc3RlcC0tdmlzaXRlZF09XCJcclxuICAgICAgICAgICAgICAgICAgc3RhdGUudmlzaXRlZFN0ZXBzLmhhcyhpKVxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy51aS1mb3JtLXdpemFyZF9fc3RlcC0tbmF2aWdhYmxlXT1cIlxyXG4gICAgICAgICAgICAgICAgICBpc1N0ZXBJbmRpY2F0b3JOYXZpZ2FibGUoaSlcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgQGlmIChpc1N0ZXBJbmRpY2F0b3JOYXZpZ2FibGUoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtdHJpZ2dlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBBcmlhTGFiZWwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwWzBdLndpemFyZFN0ZXA/LnN0ZXBUaXRsZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwWzBdLnRpdGxlIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1N0ZXAgJyArIChpICsgMSlcclxuICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzdGVwU2VsZWN0LmVtaXQoaSlcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLWNpcmNsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChzdGF0ZS5jb21wbGV0ZWRTdGVwcy5oYXMoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJjaGVja1wiIFtzaXplXT1cIjE2XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBpICsgMSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwWzBdLndpemFyZFN0ZXA/LnN0ZXBUaXRsZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwWzBdLnRpdGxlIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1N0ZXAgJyArIChpICsgMSlcclxuICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLXN0YXRpY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgaSA9PT0gc3RhdGUuY3VycmVudFN0ZXAgPyAnc3RlcCcgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1jaXJjbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc3RhdGUuY29tcGxldGVkU3RlcHMuaGFzKGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsdWNpZGUtaWNvbiBuYW1lPVwiY2hlY2tcIiBbc2l6ZV09XCIxNlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaSArIDEgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS50aXRsZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdTdGVwICcgKyAoaSArIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtaW5mb1wiPlxyXG4gICAgICAgIDxoMiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLXRpdGxlXCI+e3sgY3VycmVudFN0ZXBUaXRsZSB9fTwvaDI+XHJcbiAgICAgICAgQGlmIChjdXJyZW50U3RlcERlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICA8cCBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLWRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgICAgIHt7IGN1cnJlbnRTdGVwRGVzY3JpcHRpb24gfX1cclxuICAgICAgICAgIDwvcD5cclxuICAgICAgICB9XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1jb3VudGVyXCI+XHJcbiAgICAgICAgICBQYXNzbyB7eyBzdGF0ZS5jdXJyZW50U3RlcCArIDEgfX0gZGkge3sgc3RhdGUudG90YWxTdGVwcyB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICBgLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVWlXaXphcmRIZWFkZXJDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpIGNvbmZpZyE6IFVpV2l6YXJkQ29uZmlnO1xyXG4gIEBJbnB1dCgpIHN0ZXBHcm91cHM6IFVpRm9ybVNlY3Rpb25bXVtdID0gW107XHJcbiAgQElucHV0KCkgc3RhdGUhOiBVaVdpemFyZFN0YXRlO1xyXG4gIEBJbnB1dCgpIHByb2dyZXNzUGVyY2VudCA9IDA7XHJcbiAgQElucHV0KCkgY3VycmVudFN0ZXBUaXRsZSA9ICcnO1xyXG4gIEBJbnB1dCgpIGN1cnJlbnRTdGVwRGVzY3JpcHRpb24gPSAnJztcclxuICAvKiogUXVhbmRvIHRydWUsIGkgYnVsbGV0IHN0ZXAgbm9uIHNvbm8gaW50ZXJhdHRpdmkgKGVzLiB3aXphcmQgZGlzYWJpbGl0YXRvKS4gKi9cclxuICBASW5wdXQoKSBkaXNhYmxlU3RlcEluZGljYXRvcnMgPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIHN0ZXBTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuXHJcbiAgLyoqIEluZGljZSBzdGVwIHNlbGV6aW9uYWJpbGUgdHJhbWl0ZSBidWxsZXQvdGl0b2xvIChzb2xvIHN0ZXAgZ2nDoCBjb21wbGV0YXRpLCBub24gaWwgY29ycmVudGUpLiAqL1xyXG4gIGlzU3RlcEluZGljYXRvck5hdmlnYWJsZShzdGVwSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLmFsbG93U3RlcEluZGljYXRvck5hdmlnYXRpb24gPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlU3RlcEluZGljYXRvcnMpIHJldHVybiBmYWxzZTtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd0JhY2tOYXZpZ2F0aW9uID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgc3RlcEluZGV4ICE9PSB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwICYmXHJcbiAgICAgIHRoaXMuc3RhdGUuY29tcGxldGVkU3RlcHMuaGFzKHN0ZXBJbmRleClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKiogVGVzdG8gYWNjZXNzaWJpbGUgcGVyIGlsIHB1bHNhbnRlIHN0ZXAgKG5hdmlnYXppb25lKS4gKi9cclxuICBzdGVwQXJpYUxhYmVsKHN0ZXBUaXRsZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgVmFpIGFsbG8gc3RlcDogJHtzdGVwVGl0bGV9YDtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGb290ZXIgZGVsIHdpemFyZDogcHVsc2FudGkgZGkgbmF2aWdhemlvbmUgZSBzYWx2YXRhZ2dpby5cclxuICogRW1ldHRlIGV2ZW50aSBwZXIgUHJldmlvdXMsIE5leHQsIEZpbmlzaCwgU2F2ZS5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndWktd2l6YXJkLWZvb3RlcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbVWlCdXR0b25Db21wb25lbnRdLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fZm9vdGVyXCI+XHJcbiAgICAgIEBpZiAoXHJcbiAgICAgICAgY29uZmlnLmFsbG93QmFja05hdmlnYXRpb24gIT09IGZhbHNlICYmIHN0YXRlLmN1cnJlbnRTdGVwID4gMFxyXG4gICAgICApIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX25hdi1hY3Rpb25cIj5cclxuICAgICAgICAgIDx1aS1idXR0b25cclxuICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy5idXR0b25MYWJlbHM/LnByZXZpb3VzID8/ICdJbmRpZXRybydcIlxyXG4gICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXHJcbiAgICAgICAgICAgIGljb249XCJjaGV2cm9uLWxlZnRcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwicHJldmlvdXMuZW1pdCgpXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19uYXYtaGludFwiPkN0cmwgKyDihpA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fZm9vdGVyLXJpZ2h0XCI+XHJcbiAgICAgICAgQGlmIChjb25maWcuYXV0b1NhdmUgJiYgY29uZmlnLmJ1dHRvbkxhYmVscz8uc2F2ZSkge1xyXG4gICAgICAgICAgPHVpLWJ1dHRvblxyXG4gICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLmJ1dHRvbkxhYmVscyEuc2F2ZSFcIlxyXG4gICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzYXZlLmVtaXQoKVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIH1cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX25hdi1hY3Rpb25cIj5cclxuICAgICAgICAgIEBpZiAoaXNMYXN0U3RlcCkge1xyXG4gICAgICAgICAgICA8dWktYnV0dG9uXHJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy5idXR0b25MYWJlbHM/LmZpbmlzaCA/PyAnQ29tcGxldGEnXCJcclxuICAgICAgICAgICAgICB2YXJpYW50PVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgaWNvbj1cImNoZWNrXCJcclxuICAgICAgICAgICAgICBpY29uUG9zaXRpb249XCJ0cmFpbGluZ1wiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImZpbmlzaC5lbWl0KClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgIDx1aS1idXR0b25cclxuICAgICAgICAgICAgICBbbGFiZWxdPVwiXHJcbiAgICAgICAgICAgICAgICBjb25maWcuYnV0dG9uTGFiZWxzPy5uZXh0ID8/XHJcbiAgICAgICAgICAgICAgICAgIGNvbmZpZy5idXR0b25MYWJlbHM/LnN1Ym1pdCA/P1xyXG4gICAgICAgICAgICAgICAgICAnQXZhbnRpJ1xyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgdmFyaWFudD1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgIGljb249XCJjaGV2cm9uLXJpZ2h0XCJcclxuICAgICAgICAgICAgICBpY29uUG9zaXRpb249XCJ0cmFpbGluZ1wiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm5leHQuZW1pdCgpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidWktZm9ybS13aXphcmRfX25hdi1oaW50XCI+Q3RybCArIOKGkjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICBgLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVWlXaXphcmRGb290ZXJDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpIGNvbmZpZyE6IFVpV2l6YXJkQ29uZmlnO1xyXG4gIEBJbnB1dCgpIHN0YXRlITogVWlXaXphcmRTdGF0ZTtcclxuICBASW5wdXQoKSBpc0xhc3RTdGVwID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKSBwcmV2aW91cyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgbmV4dCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgZmluaXNoID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBzYXZlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG59XHJcblxyXG4vLyDilIDilIDilIAgQ29tcG9uZW50ZSB3aXphcmQgcHJpbmNpcGFsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbi8qKlxyXG4gKiBDb21wb25lbnRlIHdpemFyZCBjaGUgd3JhcHBhIGBVaUZvcm1CdWlsZGVyQ29tcG9uZW50YFxyXG4gKiBhZ2dpdW5nZW5kbyBuYXZpZ2F6aW9uZSBtdWx0aS1zdGVwLCBiYXJyYSBkaSBwcm9ncmVzc28sXHJcbiAqIHZhbGlkYXppb25lIHBlciBzdGVwIGUgc2luY3Jvbml6emF6aW9uZSB3aXJlbGVzcy5cclxuICogUGnDuSBzZXppb25pIHNjaGVtYSBjb24gbG8gc3Rlc3NvIGB3aXphcmRTdGVwLnN0ZXBOdW1iZXJgIGZvcm1hbm8gdW4gdW5pY28gcGFzc29cclxuICogKGVzLiBwacO5IGJsb2NjaGkgY29sbGFzc2FiaWxpIHBlciBzdGVwKTsgbWV0YWRhdGkgZGVsIHBhc3NvIGRhbGxhIHByaW1hIHNlemlvbmUgZGVsIGdydXBwby5cclxuICpcclxuICogQHNlbGVjdG9yIHVpLWZvcm0td2l6YXJkXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGh0bWxcclxuICogPHVpLWZvcm0td2l6YXJkXHJcbiAqICAgW3NjaGVtYV09XCJ3aXphcmRTY2hlbWFcIlxyXG4gKiAgIFt3aXphcmRDb25maWddPVwid2l6YXJkQ29uZmlnXCJcclxuICogICAod2l6YXJkQ29tcGxldGUpPVwib25Db21wbGV0ZSgkZXZlbnQpXCJcclxuICogICAoc3RlcENoYW5nZSk9XCJvblN0ZXBDaGFuZ2UoJGV2ZW50KVwiXHJcbiAqIC8+XHJcbiAqIGBgYFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd1aS1mb3JtLXdpemFyZCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBMdWNpZGVBbmd1bGFyTW9kdWxlLFxyXG4gICAgVWlCdXR0b25Db21wb25lbnQsXHJcbiAgICBVaUZvcm1CdWlsZGVyQ29tcG9uZW50LFxyXG4gICAgVWlXaXphcmRIZWFkZXJDb21wb25lbnQsXHJcbiAgICBVaVdpemFyZEZvb3RlckNvbXBvbmVudCxcclxuICBdLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIEBpZiAoc2NoZW1hICYmIHdpemFyZENvbmZpZykge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRcIj5cclxuICAgICAgICA8IS0tIEhlYWRlciB3aXphcmQgKG5hc2Nvc3RvIHNlIHdpcmVsZXNzKSAtLT5cclxuICAgICAgICBAaWYgKCF3aXphcmRDb25maWcud2lyZWxlc3NIZWFkaW5nKSB7XHJcbiAgICAgICAgICA8dWktd2l6YXJkLWhlYWRlclxyXG4gICAgICAgICAgICBbY29uZmlnXT1cIndpemFyZENvbmZpZ1wiXHJcbiAgICAgICAgICAgIFtzdGVwR3JvdXBzXT1cIndpemFyZFN0ZXBHcm91cHNcIlxyXG4gICAgICAgICAgICBbc3RhdGVdPVwic3RhdGVcIlxyXG4gICAgICAgICAgICBbcHJvZ3Jlc3NQZXJjZW50XT1cInByb2dyZXNzUGVyY2VudFwiXHJcbiAgICAgICAgICAgIFtjdXJyZW50U3RlcFRpdGxlXT1cImN1cnJlbnRTdGVwVGl0bGVcIlxyXG4gICAgICAgICAgICBbY3VycmVudFN0ZXBEZXNjcmlwdGlvbl09XCJjdXJyZW50U3RlcERlc2NyaXB0aW9uXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVTdGVwSW5kaWNhdG9yc109XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgIChzdGVwU2VsZWN0KT1cIm9uV2l6YXJkU3RlcEluZGljYXRvclNlbGVjdCgkZXZlbnQpXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8IS0tIE5hdmlnYXppb25lIHNvcHJhIGlsIGZvcm0gLS0+XHJcbiAgICAgICAgQGlmIChzaG93VG9wTmF2KSB7XHJcbiAgICAgICAgICA8dWktd2l6YXJkLWZvb3RlclxyXG4gICAgICAgICAgICBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19mb290ZXIgdWktZm9ybS13aXphcmRfX2Zvb3Rlci0tdG9wXCJcclxuICAgICAgICAgICAgW2NvbmZpZ109XCJ3aXphcmRDb25maWdcIlxyXG4gICAgICAgICAgICBbc3RhdGVdPVwic3RhdGVcIlxyXG4gICAgICAgICAgICBbaXNMYXN0U3RlcF09XCJpc0xhc3RTdGVwXCJcclxuICAgICAgICAgICAgKHByZXZpb3VzKT1cImdvVG9QcmV2aW91c1N0ZXAoKVwiXHJcbiAgICAgICAgICAgIChuZXh0KT1cImdvVG9OZXh0U3RlcCgpXCJcclxuICAgICAgICAgICAgKGZpbmlzaCk9XCJmaW5pc2hXaXphcmQoKVwiXHJcbiAgICAgICAgICAgIChzYXZlKT1cInNhdmVDdXJyZW50U3RlcCgpXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX2NvbnRlbnRcIj5cclxuICAgICAgICAgIDwhLS0gRm9ybSBidWlsZGVyIHBlciBsbyBzdGVwIGNvcnJlbnRlIC0tPlxyXG4gICAgICAgICAgPHVpLWZvcm0tYnVpbGRlclxyXG4gICAgICAgICAgICBbc2NoZW1hXT1cImN1cnJlbnRTdGVwU2NoZW1hIVwiXHJcbiAgICAgICAgICAgIFtpbml0aWFsRGF0YV09XCJtZXJnZWRJbml0aWFsRGF0YUZvckJ1aWxkZXJcIlxyXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICBbbG9hZGluZ0Zvcl09XCJsb2FkaW5nRm9yXCJcclxuICAgICAgICAgICAgW2N1c3RvbUZpZWxkVGVtcGxhdGVzXT1cImN1c3RvbUZpZWxkVGVtcGxhdGVzXCJcclxuICAgICAgICAgICAgW2N1c3RvbUZpZWxkVGVtcGxhdGVGYWxsYmFja109XCJjdXN0b21GaWVsZFRlbXBsYXRlRmFsbGJhY2tcIlxyXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKHZhbGlkYXRpb25DaGFuZ2UpPVwib25WYWxpZGF0aW9uQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAoY3VzdG9tRXZlbnQpPVwiY3VzdG9tRXZlbnQuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gTmF2aWdhemlvbmUgc290dG8gaWwgZm9ybSAtLT5cclxuICAgICAgICBAaWYgKHNob3dCb3R0b21OYXYpIHtcclxuICAgICAgICAgIDx1aS13aXphcmQtZm9vdGVyXHJcbiAgICAgICAgICAgIGNsYXNzPVwidWktZm9ybS13aXphcmRfX2Zvb3RlclwiXHJcbiAgICAgICAgICAgIFtjb25maWddPVwid2l6YXJkQ29uZmlnXCJcclxuICAgICAgICAgICAgW3N0YXRlXT1cInN0YXRlXCJcclxuICAgICAgICAgICAgW2lzTGFzdFN0ZXBdPVwiaXNMYXN0U3RlcFwiXHJcbiAgICAgICAgICAgIChwcmV2aW91cyk9XCJnb1RvUHJldmlvdXNTdGVwKClcIlxyXG4gICAgICAgICAgICAobmV4dCk9XCJnb1RvTmV4dFN0ZXAoKVwiXHJcbiAgICAgICAgICAgIChmaW5pc2gpPVwiZmluaXNoV2l6YXJkKClcIlxyXG4gICAgICAgICAgICAoc2F2ZSk9XCJzYXZlQ3VycmVudFN0ZXAoKVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgYCxcclxuICBzdHlsZVVybDogJy4vZm9ybS13aXphcmQuY29tcG9uZW50LnNjc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVWlGb3JtV2l6YXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHdpemFyZFN5bmMgPSBpbmplY3QoVWlXaXphcmRTeW5jU2VydmljZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBpbmplY3QoVWlMb2dnZXJTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBAVmlld0NoaWxkKFVpRm9ybUJ1aWxkZXJDb21wb25lbnQpIGZvcm1CdWlsZGVyPzogVWlGb3JtQnVpbGRlckNvbXBvbmVudDtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIElucHV0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKiogU2NoZW1hIGNvbXBsZXRvIGRlbCBmb3JtICh0dXR0ZSBsZSBzZXppb25pIGNvbiB3aXphcmRTdGVwKS4gKi9cclxuICBASW5wdXQoKSBzY2hlbWEhOiBVaUZvcm1TY2hlbWE7XHJcblxyXG4gIC8qKiBDb25maWd1cmF6aW9uZSBkZWwgd2l6YXJkLiAqL1xyXG4gIEBJbnB1dCgpIHdpemFyZENvbmZpZyE6IFVpV2l6YXJkQ29uZmlnO1xyXG5cclxuICAvKiogTWV0b2RpIGRpIHZhbGlkYXppb25lIGN1c3RvbSBwZXIgc3RlcC4gKi9cclxuICBASW5wdXQoKSBjdXN0b21WYWxpZGF0aW9uTWV0aG9kczogUmVjb3JkPHN0cmluZywgVWlXaXphcmRWYWxpZGF0aW9uRm4+ID0ge307XHJcblxyXG4gIC8qKiBEYXRpIGluaXppYWxpLiAqL1xyXG4gIEBJbnB1dCgpIGluaXRpYWxEYXRhOiBVaUZvcm1EYXRhID0ge307XHJcblxyXG4gIC8qKiBNb2RhbGl0YSBzb2xhIGxldHR1cmEuICovXHJcbiAgQElucHV0KCkgcmVhZG9ubHkgPSBmYWxzZTtcclxuXHJcbiAgLyoqIFN0YXRvIGRpc2FiaWxpdGF0by4gKi9cclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAvKiogUHVsc2FudGUgaW4gY2FyaWNhbWVudG8uICovXHJcbiAgQElucHV0KCkgbG9hZGluZ0Zvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBUZW1wbGF0ZSBwZXIgY2FtcGkgYHR5cGU6ICdjdXN0b20nYCAoaW5vbHRybyBhbCBmb3JtIGJ1aWxkZXIpLiAqL1xyXG4gIEBJbnB1dCgpIGN1c3RvbUZpZWxkVGVtcGxhdGVzOiBSZWNvcmQ8c3RyaW5nLCBUZW1wbGF0ZVJlZjx1bmtub3duPj4gPSB7fTtcclxuXHJcbiAgLyoqIEZhbGxiYWNrIHRlbXBsYXRlIHBlciBjYW1waSBjdXN0b20gKGlub2x0cm8gYWwgZm9ybSBidWlsZGVyKS4gKi9cclxuICBASW5wdXQoKSBjdXN0b21GaWVsZFRlbXBsYXRlRmFsbGJhY2s/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIE91dHB1dCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgQE91dHB1dCgpIHN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFVpV2l6YXJkU3RlcENoYW5nZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBzdGVwQ29tcGxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPFVpV2l6YXJkU3RlcENvbXBsZXRlRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIHN0ZXBWYWxpZGF0aW9uRmFpbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7XHJcbiAgICBzdGVwOiBudW1iZXI7XHJcbiAgICBlcnJvcnM6IHN0cmluZ1tdO1xyXG4gIH0+KCk7XHJcbiAgQE91dHB1dCgpIHdpemFyZENvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxVaUZvcm1EYXRhPigpO1xyXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VWlGb3JtRGF0YT4oKTtcclxuICBAT3V0cHV0KCkgdmFsaWRhdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VWlGb3JtVmFsaWRhdGlvblN0YXRlPigpO1xyXG4gIEBPdXRwdXQoKSBjdXN0b21FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8VWlGb3JtQ3VzdG9tRXZlbnQ+KCk7XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBTdGF0byDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgc3RhdGU6IFVpV2l6YXJkU3RhdGUgPSB7XHJcbiAgICBjdXJyZW50U3RlcDogMCxcclxuICAgIHRvdGFsU3RlcHM6IDAsXHJcbiAgICBjb21wbGV0ZWRTdGVwczogbmV3IFNldDxudW1iZXI+KCksXHJcbiAgICB2aXNpdGVkU3RlcHM6IG5ldyBTZXQ8bnVtYmVyPihbMF0pLFxyXG4gICAgaXNWYWxpZDogZmFsc2UsXHJcbiAgICBzdGVwRXJyb3JzOiB7fSxcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBHcnVwcGkgZGkgc2V6aW9uaSBzY2hlbWEgcGVyIHBhc3NvIGxvZ2ljbyBkZWwgd2l6YXJkLlxyXG4gICAqIFNlemlvbmkgY29uIGxvIHN0ZXNzbyBgd2l6YXJkU3RlcC5zdGVwTnVtYmVyYCBjb21wb25nb25vIHVuIHVuaWNvIHBhc3NvIChvcmRpbmU6IGNvbWUgaW4gYHNjaGVtYS5zZWN0aW9uc2AgZG9wbyBzb3J0IHBlciBudW1lcm8pLlxyXG4gICAqL1xyXG4gIHdpemFyZFN0ZXBHcm91cHM6IFVpRm9ybVNlY3Rpb25bXVtdID0gW107XHJcblxyXG4gIC8qKiBEYXRpIGFjY3VtdWxhdGkgZGVsIGZvcm0uICovXHJcbiAgcHJpdmF0ZSBhY2N1bXVsYXRlZERhdGE6IFVpRm9ybURhdGEgPSB7fTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2NoZW1hIGNhY2hhdG8gcGVyIGxvIHN0ZXAgY29ycmVudGUuXHJcbiAgICogRXZpdGEgZGkgY3JlYXJlIHVuIG51b3ZvIG9nZ2V0dG8gYWQgb2duaSBjaWNsbyBkaSBjaGFuZ2UgZGV0ZWN0aW9uLFxyXG4gICAqIGNvc2EgY2hlIGNhdXNlcmViYmUgcmVidWlsZCBpbmZpbml0aSBuZWwgZm9ybSBidWlsZGVyLlxyXG4gICAqL1xyXG4gIF9jYWNoZWRTdGVwU2NoZW1hOiBVaUZvcm1TY2hlbWEgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF9jYWNoZWRTdGVwSW5kZXg6IG51bWJlciA9IC0xO1xyXG5cclxuICAvLyDilIDilIDilIAgR2V0dGVyIGNhbGNvbGF0aSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgZ2V0IGN1cnJlbnRTdGVwU2NoZW1hKCk6IFVpRm9ybVNjaGVtYSB8IG51bGwge1xyXG4gICAgLy8gU2UgbG8gc3RlcCBub24gZSBjYW1iaWF0bywgcmVzdGl0dWlzY2kgbG8gc2NoZW1hIGNhY2hhdG9cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5fY2FjaGVkU3RlcEluZGV4ID09PSB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwICYmXHJcbiAgICAgIHRoaXMuX2NhY2hlZFN0ZXBTY2hlbWFcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGVkU3RlcFNjaGVtYTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBncm91cCA9IHRoaXMud2l6YXJkU3RlcEdyb3Vwc1t0aGlzLnN0YXRlLmN1cnJlbnRTdGVwXTtcclxuICAgIGlmICghZ3JvdXA/Lmxlbmd0aCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgdGhpcy5fY2FjaGVkU3RlcFNjaGVtYSA9IHtcclxuICAgICAgaWQ6IHRoaXMuc2NoZW1hLmlkICsgJy1zdGVwLScgKyB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICBzZWN0aW9uczogZ3JvdXAsXHJcbiAgICAgIGNvbmZpZzogeyAuLi50aGlzLnNjaGVtYS5jb25maWcsIGhpZGVGb290ZXI6IHRydWUsIHNob3dCdXR0b25zOiBmYWxzZSB9LFxyXG4gICAgfTtcclxuICAgIHRoaXMuX2NhY2hlZFN0ZXBJbmRleCA9IHRoaXMuc3RhdGUuY3VycmVudFN0ZXA7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkU3RlcFNjaGVtYTtcclxuICB9XHJcblxyXG4gIGdldCBjdXJyZW50U3RlcFRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwcmltYXJ5ID0gdGhpcy53aXphcmRTdGVwR3JvdXBzW3RoaXMuc3RhdGUuY3VycmVudFN0ZXBdPy5bMF07XHJcbiAgICByZXR1cm4gcHJpbWFyeT8ud2l6YXJkU3RlcD8uc3RlcFRpdGxlIHx8IHByaW1hcnk/LnRpdGxlIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1cnJlbnRTdGVwRGVzY3JpcHRpb24oKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHByaW1hcnkgPSB0aGlzLndpemFyZFN0ZXBHcm91cHNbdGhpcy5zdGF0ZS5jdXJyZW50U3RlcF0/LlswXTtcclxuICAgIHJldHVybiBwcmltYXJ5Py53aXphcmRTdGVwPy5zdGVwRGVzY3JpcHRpb24gfHwgcHJpbWFyeT8uZGVzY3JpcHRpb24gfHwgJyc7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNMYXN0U3RlcCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwID49IHRoaXMuc3RhdGUudG90YWxTdGVwcyAtIDE7XHJcbiAgfVxyXG5cclxuICBnZXQgcHJvZ3Jlc3NQZXJjZW50KCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5zdGF0ZS50b3RhbFN0ZXBzIDw9IDEpIHJldHVybiAxMDA7XHJcbiAgICByZXR1cm4gTWF0aC5yb3VuZChcclxuICAgICAgKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgLyAodGhpcy5zdGF0ZS50b3RhbFN0ZXBzIC0gMSkpICogMTAwLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdGkgcGFzc2F0aSBhbCBmb3JtIGJ1aWxkZXI6IHVuaW9uZSB0cmEgdmFsb3JpIGZvcm5pdGkgZGFsIGNvbnN1bWVyIGVcclxuICAgKiBzdGF0byBhY2N1bXVsYXRvIHRyYSBnbGkgc3RlcC4gU2VuemEgcXVlc3RvLCB0b3JuYW5kbyBpbmRpZXRybyBpbCBidWlsZGVyXHJcbiAgICogcmljZXZlcmViYmUgc29sbyBgaW5pdGlhbERhdGFgIGUgcmljcmVlcmViYmUgaSBjYW1waSB2dW90aSwgcHVyIGF2ZW5kb1xyXG4gICAqIGkgdmFsb3JpIGFuY29yYSBpbiBgYWNjdW11bGF0ZWREYXRhYC5cclxuICAgKi9cclxuICBnZXQgbWVyZ2VkSW5pdGlhbERhdGFGb3JCdWlsZGVyKCk6IFVpRm9ybURhdGEge1xyXG4gICAgcmV0dXJuIHsgLi4udGhpcy5pbml0aWFsRGF0YSwgLi4udGhpcy5hY2N1bXVsYXRlZERhdGEgfTtcclxuICB9XHJcblxyXG4gIC8qKiBNb3N0cmEgbGEgbmF2aWdhemlvbmUgc29wcmEgaWwgZm9ybSBidWlsZGVyLiAqL1xyXG4gIGdldCBzaG93VG9wTmF2KCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLnNob3dOYXZpZ2F0aW9uQnV0dG9ucyA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IHBvcyA9IHRoaXMud2l6YXJkQ29uZmlnLm5hdmlnYXRpb25Qb3NpdGlvbjtcclxuICAgIHJldHVybiBwb3MgPT09ICd0b3AnIHx8IHBvcyA9PT0gJ2JvdGgnO1xyXG4gIH1cclxuXHJcbiAgLyoqIE1vc3RyYSBsYSBuYXZpZ2F6aW9uZSBzb3R0byBpbCBmb3JtIGJ1aWxkZXIuICovXHJcbiAgZ2V0IHNob3dCb3R0b21OYXYoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy53aXphcmRDb25maWcuc2hvd05hdmlnYXRpb25CdXR0b25zID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgY29uc3QgcG9zID0gdGhpcy53aXphcmRDb25maWcubmF2aWdhdGlvblBvc2l0aW9uO1xyXG4gICAgcmV0dXJuIHBvcyA9PT0gJ2JvdHRvbScgfHwgcG9zID09PSAnYm90aCcgfHwgcG9zID09IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zY2hlbWEpIHtcclxuICAgICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbignaW5pdCcsIHsgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnPy53aXphcmRJZCwgZXJyb3I6ICdzY2hlbWEgbm9uIHByZXNlbnRlJyB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMud2l6YXJkU3RlcEdyb3VwcyA9IHRoaXMuYnVpbGRXaXphcmRTdGVwR3JvdXBzKHRoaXMuc2NoZW1hLnNlY3Rpb25zKTtcclxuICAgIHRoaXMuc3RhdGUudG90YWxTdGVwcyA9IHRoaXMud2l6YXJkU3RlcEdyb3Vwcy5sZW5ndGg7XHJcbiAgICB0aGlzLmFjY3VtdWxhdGVkRGF0YSA9IHsgLi4udGhpcy5pbml0aWFsRGF0YSB9O1xyXG5cclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ2luaXQnLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZz8ud2l6YXJkSWQsXHJcbiAgICAgIHNjaGVtYUlkOiB0aGlzLnNjaGVtYS5pZCxcclxuICAgICAgdG90YWxTdGVwczogdGhpcy5zdGF0ZS50b3RhbFN0ZXBzLFxyXG4gICAgICB0b3RhbFNlY3Rpb25zOiB0aGlzLndpemFyZFN0ZXBHcm91cHMucmVkdWNlKChzdW0sIGcpID0+IHN1bSArIGcubGVuZ3RoLCAwKSxcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFNpbmNyb25penphemlvbmUgd2lyZWxlc3NcclxuICAgIGlmICh0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCkge1xyXG4gICAgICB0aGlzLnN5bmNXaXphcmRTdGF0ZSgpO1xyXG5cclxuICAgICAgLy8gQXNjb2x0YSBuYXZpZ2F6aW9uZSBlc3Rlcm5hXHJcbiAgICAgIHRoaXMud2l6YXJkU3luY1xyXG4gICAgICAgIC5nZXRXaXphcmRTdGF0ZSQodGhpcy53aXphcmRDb25maWcud2l6YXJkSWQpXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEud2l6YXJkU3RhdGUuY3VycmVudFN0ZXAgIT09IHRoaXMuc3RhdGUuY3VycmVudFN0ZXApIHtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvU3RlcChkYXRhLndpemFyZFN0YXRlLmN1cnJlbnRTdGVwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbignZGVzdHJveScsIHtcclxuICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnPy53aXphcmRJZCxcclxuICAgICAgc2NoZW1hSWQ6IHRoaXMuc2NoZW1hPy5pZCxcclxuICAgICAgY3VycmVudFN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnPy53aXphcmRJZCkge1xyXG4gICAgICB0aGlzLndpemFyZFN5bmMudW5yZWdpc3RlcldpemFyZCh0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTY29yY2lhdG9pYTogQ3RybCArIEZyZWNjaWEgc2luaXN0cmEvZGVzdHJhIHBlciBuYXZpZ2FyZSBjb21lIGkgcHVsc2FudGlcclxuICAgKiBJbmRpZXRybyAvIEF2YW50aSAoc3VsbCd1bHRpbW8gc3RlcCwgQXZhbnRpIGVxdWl2YWxlIGEgQ29tcGxldGEpLlxyXG4gICAqIElnbm9yYXRhIHNlIGlsIGZvY3VzIMOoIGluIHVuIGNhbXBvIGRpIGlucHV0IHBlciBub24gaW50ZXJmZXJpcmUgY29uIGxhIGRpZ2l0YXppb25lLlxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nLCBbJyRldmVudCddKVxyXG4gIG9uRG9jdW1lbnRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2NoZW1hIHx8ICF0aGlzLndpemFyZENvbmZpZyB8fCB0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICBpZiAodGhpcy53aXphcmRDb25maWcuc2hvd05hdmlnYXRpb25CdXR0b25zID09PSBmYWxzZSkgcmV0dXJuO1xyXG4gICAgaWYgKCFldmVudC5jdHJsS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LnNoaWZ0S2V5KVxyXG4gICAgICByZXR1cm47XHJcbiAgICBpZiAoZXZlbnQua2V5ICE9PSAnQXJyb3dMZWZ0JyAmJiBldmVudC5rZXkgIT09ICdBcnJvd1JpZ2h0JykgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMuaXNFZGl0YWJsZUtleWJvYXJkVGFyZ2V0KGV2ZW50LnRhcmdldCkpIHJldHVybjtcclxuXHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0Jykge1xyXG4gICAgICBpZiAodGhpcy53aXphcmRDb25maWcuYWxsb3dCYWNrTmF2aWdhdGlvbiA9PT0gZmFsc2UpIHJldHVybjtcclxuICAgICAgaWYgKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgPD0gMCkgcmV0dXJuO1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdrZXlib2FyZE5hdmlnYXRpb24nLCB7XHJcbiAgICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICAgIGRpcmVjdGlvbjogJ3ByZXZpb3VzJyxcclxuICAgICAgICBmcm9tU3RlcDogdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZ29Ub1ByZXZpb3VzU3RlcCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQXJyb3dSaWdodFxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ2tleWJvYXJkTmF2aWdhdGlvbicsIHtcclxuICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICBkaXJlY3Rpb246IHRoaXMuaXNMYXN0U3RlcCA/ICdmaW5pc2gnIDogJ25leHQnLFxyXG4gICAgICBmcm9tU3RlcDogdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuaXNMYXN0U3RlcCkge1xyXG4gICAgICB2b2lkIHRoaXMuZmluaXNoV2l6YXJkKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2b2lkIHRoaXMuZ29Ub05leHRTdGVwKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogVHJ1ZSBzZSBpbCB0YXJnZXQgZGVsIGtleWRvd24gw6ggdW4gZWxlbWVudG8gZG92ZSBsYSBkaWdpdGF6aW9uZSBoYSBwcmlvcml0w6Agc3VsbGEgc2hvcnRjdXQgd2l6YXJkLiAqL1xyXG4gIHByaXZhdGUgaXNFZGl0YWJsZUtleWJvYXJkVGFyZ2V0KHRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRhcmdldCB8fCAhKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgY29uc3QgZWwgPSB0YXJnZXQ7XHJcbiAgICBpZiAoZWwuaXNDb250ZW50RWRpdGFibGUpIHJldHVybiB0cnVlO1xyXG4gICAgY29uc3QgdGFnID0gZWwudGFnTmFtZTtcclxuICAgIGlmICh0YWcgPT09ICdJTlBVVCcgfHwgdGFnID09PSAnVEVYVEFSRUEnIHx8IHRhZyA9PT0gJ1NFTEVDVCcpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIE5hdmlnYXppb25lIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKiogVmFpIGFsbG8gc3RlcCBzdWNjZXNzaXZvIGNvbiB2YWxpZGF6aW9uZS4gKi9cclxuICBhc3luYyBnb1RvTmV4dFN0ZXAoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5pc0xhc3RTdGVwKSByZXR1cm47XHJcblxyXG4gICAgLy8gVmFsaWRhIHN0ZXAgY29ycmVudGVcclxuICAgIGlmICghKGF3YWl0IHRoaXMudmFsaWRhdGVDdXJyZW50U3RlcCgpKSkgcmV0dXJuO1xyXG5cclxuICAgIC8vIFNhbHZhIGRhdGkgc3RlcCBjb3JyZW50ZVxyXG4gICAgdGhpcy5zdGF0ZS5jb21wbGV0ZWRTdGVwcy5hZGQodGhpcy5zdGF0ZS5jdXJyZW50U3RlcCk7XHJcbiAgICBhd2FpdCB0aGlzLmF1dG9TYXZlSWZOZWVkZWQoKTtcclxuXHJcbiAgICB0aGlzLm5hdmlnYXRlVG9TdGVwKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgKyAxKTtcclxuICB9XHJcblxyXG4gIC8qKiBUb3JuYSBhbGxvIHN0ZXAgcHJlY2VkZW50ZS4gKi9cclxuICBnb1RvUHJldmlvdXNTdGVwKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgPD0gMCkgcmV0dXJuO1xyXG4gICAgdGhpcy5uYXZpZ2F0ZVRvU3RlcCh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOYXZpZ2F6aW9uZSB0cmFtaXRlIGluZGljYXRvcmkgc3RlcCAoYnVsbGV0ICsgdGl0b2xvKSBxdWFuZG8gYHByb2dyZXNzU3R5bGVgIMOoIGAnc3RlcHMnYC5cclxuICAgKiBDb25zZW50aXRvIHNvbG8gdmVyc28gc3RlcCBnacOgIG1hcmNhdGkgY29tcGxldGF0aS5cclxuICAgKi9cclxuICBvbldpemFyZFN0ZXBJbmRpY2F0b3JTZWxlY3Qoc3RlcEluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICBpZiAodGhpcy53aXphcmRDb25maWcuYWxsb3dTdGVwSW5kaWNhdG9yTmF2aWdhdGlvbiA9PT0gZmFsc2UpIHJldHVybjtcclxuICAgIGlmICh0aGlzLndpemFyZENvbmZpZy5hbGxvd0JhY2tOYXZpZ2F0aW9uID09PSBmYWxzZSkgcmV0dXJuO1xyXG4gICAgaWYgKHN0ZXBJbmRleCA9PT0gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCkgcmV0dXJuO1xyXG4gICAgaWYgKCF0aGlzLnN0YXRlLmNvbXBsZXRlZFN0ZXBzLmhhcyhzdGVwSW5kZXgpKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbignbmF2aWdhdGlvbicsIHtcclxuICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICB2aWE6ICdzdGVwSW5kaWNhdG9yJyxcclxuICAgICAgZnJvbVN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgIHRvU3RlcDogc3RlcEluZGV4LFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm5hdmlnYXRlVG9TdGVwKHN0ZXBJbmRleCk7XHJcbiAgfVxyXG5cclxuICAvKiogQ29tcGxldGEgaWwgd2l6YXJkLiAqL1xyXG4gIGFzeW5jIGZpbmlzaFdpemFyZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghKGF3YWl0IHRoaXMudmFsaWRhdGVDdXJyZW50U3RlcCgpKSkge1xyXG4gICAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdzdGVwVmFsaWRhdGlvbkZhaWxlZCcsIHtcclxuICAgICAgICB3aXphcmRJZDogdGhpcy53aXphcmRDb25maWcud2l6YXJkSWQsXHJcbiAgICAgICAgc3RlcDogdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgICBjb250ZXh0OiAnZmluaXNoJyxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN0YXRlLmNvbXBsZXRlZFN0ZXBzLmFkZCh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwKTtcclxuICAgIGF3YWl0IHRoaXMuYXV0b1NhdmVJZk5lZWRlZCgpO1xyXG5cclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ2NvbXBsZXRlJywge1xyXG4gICAgICB3aXphcmRJZDogdGhpcy53aXphcmRDb25maWcud2l6YXJkSWQsXHJcbiAgICAgIHNjaGVtYUlkOiB0aGlzLnNjaGVtYT8uaWQsXHJcbiAgICAgIHRvdGFsU3RlcHM6IHRoaXMuc3RhdGUudG90YWxTdGVwcyxcclxuICAgICAgY29tcGxldGVkU3RlcHM6IEFycmF5LmZyb20odGhpcy5zdGF0ZS5jb21wbGV0ZWRTdGVwcyksXHJcbiAgICB9KTtcclxuICAgIHRoaXMud2l6YXJkQ29tcGxldGUuZW1pdCh0aGlzLmFjY3VtdWxhdGVkRGF0YSk7XHJcbiAgfVxyXG5cclxuICAvKiogU2FsdmEgbG8gc3RlcCBjb3JyZW50ZSBtYW51YWxtZW50ZS4gKi9cclxuICBhc3luYyBzYXZlQ3VycmVudFN0ZXAoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy53aXphcmRDb25maWcub25TdGVwU2F2ZSkge1xyXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5mb3JtQnVpbGRlcj8uZ2V0Rm9ybVZhbHVlKCkgfHwge307XHJcbiAgICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ3NhdmUnLCB7XHJcbiAgICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgICAgc2NoZW1hSWQ6IHRoaXMuc2NoZW1hPy5pZCxcclxuICAgICAgfSk7XHJcbiAgICAgIGF3YWl0IHRoaXMud2l6YXJkQ29uZmlnLm9uU3RlcFNhdmUoZGF0YSwgdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTY2Fuc2lvbmEgZ2xpIHN0ZXAgaW4gb3JkaW5lLCBtYXJjYSBjb21lIGNvbXBsZXRhdGkgcXVlbGxpIHZhbGlkaSByaXNwZXR0byBhbGxlXHJcbiAgICogc3Rlc3NlIHJlZ29sZSBkaSBOZXh0L0NvbXBsZXRhIGUgcG9zaXppb25hIGlsIHdpemFyZCBzdWwgcHJpbW8gc3RlcCBub24gdmFsaWRvXHJcbiAgICogKG8gc3VsbCd1bHRpbW8gc2UgdHV0dGkgdmFsaWRpKS4gVXRpbGUgZG9wbyBpbCBwcmVsb2FkIGRpIGBpbml0aWFsRGF0YWAgaW4gZWRpdC5cclxuICAgKi9cclxuICBhc3luYyByZXN1bWVDb21wbGV0ZWRTdGVwc0Zyb21WYWxpZGF0aW9uKFxyXG4gICAgb3B0aW9ucz86IFVpV2l6YXJkUmVzdW1lT3B0aW9ucyxcclxuICApOiBQcm9taXNlPFVpV2l6YXJkUmVzdW1lUmVzdWx0PiB7XHJcbiAgICBjb25zdCBlbWl0U3RlcENvbXBsZXRlID0gb3B0aW9ucz8uZW1pdFN0ZXBDb21wbGV0ZSA/PyBmYWxzZTtcclxuICAgIGNvbnN0IGVtaXRTdGVwU2F2ZSA9IG9wdGlvbnM/LmVtaXRTdGVwU2F2ZSA/PyBmYWxzZTtcclxuXHJcbiAgICBpZiAoIXRoaXMuc2NoZW1hIHx8IHRoaXMuc3RhdGUudG90YWxTdGVwcyA8PSAwKSB7XHJcbiAgICAgIHJldHVybiB7IGxhc3RDb21wbGV0ZWRTdGVwOiAtMSwgY3VycmVudFN0ZXA6IDAgfTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdyZXN1bWUnLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZz8ud2l6YXJkSWQsXHJcbiAgICAgIHNjaGVtYUlkOiB0aGlzLnNjaGVtYS5pZCxcclxuICAgICAgdG90YWxTdGVwczogdGhpcy5zdGF0ZS50b3RhbFN0ZXBzLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgY29tcGxldGVkID0gbmV3IFNldDxudW1iZXI+KCk7XHJcbiAgICBsZXQgbGFzdENvbXBsZXRlZFN0ZXAgPSAtMTtcclxuICAgIGxldCB0YXJnZXRTdGVwID0gMDtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RhdGUudG90YWxTdGVwczsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHJlYWR5ID0gYXdhaXQgdGhpcy5wcmVwYXJlU3RlcEZvclZhbGlkYXRpb24oaSk7XHJcbiAgICAgIGlmICghcmVhZHkpIHtcclxuICAgICAgICB0YXJnZXRTdGVwID0gaTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgdmFsaWQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlQ3VycmVudFN0ZXAoe1xyXG4gICAgICAgIGVtaXRTdGVwQ29tcGxldGUsXHJcbiAgICAgICAgZW1pdFN0ZXBWYWxpZGF0aW9uRmFpbGVkOiBmYWxzZSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgICAgdGFyZ2V0U3RlcCA9IGk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbXBsZXRlZC5hZGQoaSk7XHJcbiAgICAgIGxhc3RDb21wbGV0ZWRTdGVwID0gaTtcclxuICAgICAgdGFyZ2V0U3RlcCA9IGk7XHJcblxyXG4gICAgICB0aGlzLmFjY3VtdWxhdGVkRGF0YSA9IHtcclxuICAgICAgICAuLi50aGlzLmFjY3VtdWxhdGVkRGF0YSxcclxuICAgICAgICAuLi4odGhpcy5mb3JtQnVpbGRlcj8uZ2V0Rm9ybVZhbHVlKCkgfHwge30pLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKGVtaXRTdGVwU2F2ZSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuYXV0b1NhdmVJZk5lZWRlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdGF0ZS5jb21wbGV0ZWRTdGVwcyA9IGNvbXBsZXRlZDtcclxuICAgIGZvciAobGV0IHYgPSAwOyB2IDw9IHRhcmdldFN0ZXA7IHYrKykge1xyXG4gICAgICB0aGlzLnN0YXRlLnZpc2l0ZWRTdGVwcy5hZGQodik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgIT09IHRhcmdldFN0ZXApIHtcclxuICAgICAgdGhpcy5uYXZpZ2F0ZVRvU3RlcCh0YXJnZXRTdGVwKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3luY1dpemFyZFN0YXRlKCk7XHJcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ3Jlc3VtZUNvbXBsZXRlJywge1xyXG4gICAgICB3aXphcmRJZDogdGhpcy53aXphcmRDb25maWc/LndpemFyZElkLFxyXG4gICAgICBsYXN0Q29tcGxldGVkU3RlcCxcclxuICAgICAgY3VycmVudFN0ZXA6IHRhcmdldFN0ZXAsXHJcbiAgICAgIGNvbXBsZXRlZFN0ZXBzOiBBcnJheS5mcm9tKGNvbXBsZXRlZCksXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4geyBsYXN0Q29tcGxldGVkU3RlcCwgY3VycmVudFN0ZXA6IHRhcmdldFN0ZXAgfTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBDYWxsYmFjayBmb3JtIGJ1aWxkZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIG9uVmFsdWVDaGFuZ2UoZGF0YTogVWlGb3JtRGF0YSk6IHZvaWQge1xyXG4gICAgdGhpcy5hY2N1bXVsYXRlZERhdGEgPSB7IC4uLnRoaXMuYWNjdW11bGF0ZWREYXRhLCAuLi5kYXRhIH07XHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCd2YWx1ZUNoYW5nZScsIHtcclxuICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICBzdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICBzY2hlbWFJZDogdGhpcy5zY2hlbWE/LmlkLFxyXG4gICAgICBjaGFuZ2VkS2V5czogT2JqZWN0LmtleXMoZGF0YSksXHJcbiAgICB9KTtcclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLmFjY3VtdWxhdGVkRGF0YSk7XHJcbiAgfVxyXG5cclxuICBvblZhbGlkYXRpb25DaGFuZ2Uoc3RhdGU6IFVpRm9ybVZhbGlkYXRpb25TdGF0ZSk6IHZvaWQge1xyXG4gICAgdGhpcy5zdGF0ZS5pc1ZhbGlkID0gc3RhdGUudmFsaWQ7XHJcbiAgICB0aGlzLnZhbGlkYXRpb25DaGFuZ2UuZW1pdChzdGF0ZSk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgTmF2aWdhemlvbmUgaW50ZXJuYSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvU3RlcCh0YXJnZXRTdGVwOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0YXJnZXRTdGVwIDwgMCB8fCB0YXJnZXRTdGVwID49IHRoaXMuc3RhdGUudG90YWxTdGVwcykgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGZyb20gPSB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwO1xyXG4gICAgdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCA9IHRhcmdldFN0ZXA7XHJcbiAgICB0aGlzLnN0YXRlLnZpc2l0ZWRTdGVwcy5hZGQodGFyZ2V0U3RlcCk7XHJcblxyXG4gICAgLy8gSW52YWxpZGEgbGEgY2FjaGUgcGVyIGZvcnphcmUgbGEgY3JlYXppb25lIGRpIHVuIG51b3ZvIHNjaGVtYVxyXG4gICAgdGhpcy5fY2FjaGVkU3RlcFNjaGVtYSA9IG51bGw7XHJcbiAgICB0aGlzLl9jYWNoZWRTdGVwSW5kZXggPSAtMTtcclxuXHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdzdGVwQ2hhbmdlJywge1xyXG4gICAgICB3aXphcmRJZDogdGhpcy53aXphcmRDb25maWcud2l6YXJkSWQsXHJcbiAgICAgIGZyb20sXHJcbiAgICAgIHRvOiB0YXJnZXRTdGVwLFxyXG4gICAgICBkaXJlY3Rpb246IHRhcmdldFN0ZXAgPiBmcm9tID8gJ25leHQnIDogJ3ByZXZpb3VzJyxcclxuICAgICAgc2NoZW1hSWQ6IHRoaXMuc2NoZW1hPy5pZCxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc3RlcENoYW5nZS5lbWl0KHtcclxuICAgICAgZnJvbSxcclxuICAgICAgdG86IHRhcmdldFN0ZXAsXHJcbiAgICAgIGRpcmVjdGlvbjogdGFyZ2V0U3RlcCA+IGZyb20gPyAnbmV4dCcgOiAncHJldmlvdXMnLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zeW5jV2l6YXJkU3RhdGUoKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUN1cnJlbnRTdGVwKG9wdGlvbnM/OiB7XHJcbiAgICBlbWl0U3RlcENvbXBsZXRlPzogYm9vbGVhbjtcclxuICAgIGVtaXRTdGVwVmFsaWRhdGlvbkZhaWxlZD86IGJvb2xlYW47XHJcbiAgfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgZW1pdFN0ZXBDb21wbGV0ZSA9IG9wdGlvbnM/LmVtaXRTdGVwQ29tcGxldGUgPz8gdHJ1ZTtcclxuICAgIGNvbnN0IGVtaXRTdGVwVmFsaWRhdGlvbkZhaWxlZCA9IG9wdGlvbnM/LmVtaXRTdGVwVmFsaWRhdGlvbkZhaWxlZCA/PyB0cnVlO1xyXG5cclxuICAgIHRoaXMuZm9ybUJ1aWxkZXI/LnZhbGlkYXRlQWxsRmllbGRzKCk7XHJcbiAgICBjb25zdCBncm91cCA9IHRoaXMud2l6YXJkU3RlcEdyb3Vwc1t0aGlzLnN0YXRlLmN1cnJlbnRTdGVwXTtcclxuICAgIGNvbnN0IHByaW1hcnkgPSBncm91cD8uWzBdO1xyXG4gICAgY29uc3QgdmFsaWRhdGVDdXN0b21Db21wb25lbnRzID1cclxuICAgICAgcHJpbWFyeT8ud2l6YXJkU3RlcD8udmFsaWRhdGlvbj8udmFsaWRhdGVDdXN0b21Db21wb25lbnRzICE9PSBmYWxzZTtcclxuICAgIGNvbnN0IGN1c3RvbUZpZWxkS2V5cyA9IG5ldyBTZXQodGhpcy5nZXRDdXN0b21GaWVsZEtleXNGb3JHcm91cChncm91cCkpO1xyXG5cclxuICAgIGNvbnN0IGlzRm9ybVZhbGlkID0gdmFsaWRhdGVDdXN0b21Db21wb25lbnRzXHJcbiAgICAgID8gKHRoaXMuZm9ybUJ1aWxkZXI/LmlzRm9ybVZhbGlkKCkgPz8gdHJ1ZSlcclxuICAgICAgOiAodGhpcy5mb3JtQnVpbGRlcj8uaXNGb3JtVmFsaWRFeGNsdWRpbmdGaWVsZEtleXMoY3VzdG9tRmllbGRLZXlzKSA/P1xyXG4gICAgICAgIHRydWUpO1xyXG5cclxuICAgIGNvbnN0IGN1c3RvbUZuTmFtZSA9IHByaW1hcnk/LndpemFyZFN0ZXA/LmN1c3RvbVZhbGlkYXRpb25GbjtcclxuXHJcbiAgICBpZiAoY3VzdG9tRm5OYW1lICYmIHRoaXMuY3VzdG9tVmFsaWRhdGlvbk1ldGhvZHNbY3VzdG9tRm5OYW1lXSkge1xyXG4gICAgICBjb25zdCBjdXN0b21WYWxpZCA9IGF3YWl0IHRoaXMuY3VzdG9tVmFsaWRhdGlvbk1ldGhvZHNbY3VzdG9tRm5OYW1lXShcclxuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkRGF0YSxcclxuICAgICAgICB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICAgIGlzRm9ybVZhbGlkLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCFjdXN0b21WYWxpZCkge1xyXG4gICAgICAgIGlmIChlbWl0U3RlcFZhbGlkYXRpb25GYWlsZWQpIHtcclxuICAgICAgICAgIHRoaXMuc3RlcFZhbGlkYXRpb25GYWlsZWQuZW1pdCh7XHJcbiAgICAgICAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgICAgICAgIGVycm9yczogWydWYWxpZGF6aW9uZSBjdXN0b20gZmFsbGl0YSddLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghaXNGb3JtVmFsaWQgJiYgcHJpbWFyeT8ud2l6YXJkU3RlcD8udmFsaWRhdGlvbj8ucmVxdWlyZWQgIT09IGZhbHNlKSB7XHJcbiAgICAgIGxldCBkZXRhaWxzID0gdGhpcy5mb3JtQnVpbGRlcj8uZ2V0RGV0YWlsZWRGb3JtRXJyb3JzKCkgfHwgW107XHJcbiAgICAgIGlmICghdmFsaWRhdGVDdXN0b21Db21wb25lbnRzICYmIGdyb3VwPy5sZW5ndGgpIHtcclxuICAgICAgICBkZXRhaWxzID0gdGhpcy5maWx0ZXJFcnJvckRldGFpbHNFeGNsdWRpbmdDdXN0b21GaWVsZHMoXHJcbiAgICAgICAgICBkZXRhaWxzLFxyXG4gICAgICAgICAgZ3JvdXAsXHJcbiAgICAgICAgICBjdXN0b21GaWVsZEtleXMsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBlcnJvcnMgPSBkZXRhaWxzLmZsYXRNYXAoKGUpID0+IGUuZXJyb3JzKTtcclxuICAgICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbignc3RlcFZhbGlkYXRpb25GYWlsZWQnLCB7XHJcbiAgICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgICAgZXJyb3JzLFxyXG4gICAgICB9KTtcclxuICAgICAgaWYgKGVtaXRTdGVwVmFsaWRhdGlvbkZhaWxlZCkge1xyXG4gICAgICAgIHRoaXMuc3RlcFZhbGlkYXRpb25GYWlsZWQuZW1pdCh7XHJcbiAgICAgICAgICBzdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICAgICAgZXJyb3JzLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZW1pdFN0ZXBDb21wbGV0ZSkge1xyXG4gICAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdzdGVwQ29tcGxldGUnLCB7XHJcbiAgICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgICAgc2NoZW1hSWQ6IHRoaXMuc2NoZW1hPy5pZCxcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuc3RlcENvbXBsZXRlLmVtaXQoe1xyXG4gICAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgICAgZGF0YTogdGhpcy5mb3JtQnVpbGRlcj8uZ2V0Rm9ybVZhbHVlKCkgfHwge30sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqIE5hdmlnYSBhbGxvIHN0ZXAgZSBhdHRlbmRlIGlsIG1vdW50IGRlbCBmb3JtIGJ1aWxkZXIgcGVyIGxhIHZhbGlkYXppb25lIHJlc3VtZS4gKi9cclxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVTdGVwRm9yVmFsaWRhdGlvbihzdGVwSW5kZXg6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdGhpcy5uYXZpZ2F0ZVRvU3RlcChzdGVwSW5kZXgpO1xyXG4gICAgcmV0dXJuIHRoaXMud2FpdEZvckZvcm1CdWlsZGVyUmVhZHkoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckZvcm1CdWlsZGVyUmVhZHkobWF4QXR0ZW1wdHMgPSAzMCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCBtYXhBdHRlbXB0czsgYXR0ZW1wdCsrKSB7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgaWYgKHRoaXMuZm9ybUJ1aWxkZXIpIHtcclxuICAgICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSYWdncnVwcGEgbGUgc2V6aW9uaSBjb24gYHdpemFyZFN0ZXBgIHBlciBgc3RlcE51bWJlcmAgKG9yZGluZSBzdGFiaWxlIHBlciBudW1lcm8sIHBvaSBvcmRpbmUgZGkgYXBwYXJpemlvbmUgbmVsbG8gc2NoZW1hKS5cclxuICAgKi9cclxuICBwcml2YXRlIGJ1aWxkV2l6YXJkU3RlcEdyb3VwcyhzZWN0aW9uczogVWlGb3JtU2VjdGlvbltdKTogVWlGb3JtU2VjdGlvbltdW10ge1xyXG4gICAgY29uc3Qgd2l0aFdpemFyZCA9IHNlY3Rpb25zLmZpbHRlcigocykgPT4gcy53aXphcmRTdGVwKTtcclxuICAgIHdpdGhXaXphcmQuc29ydChcclxuICAgICAgKGEsIGIpID0+XHJcbiAgICAgICAgKGEud2l6YXJkU3RlcCEuc3RlcE51bWJlciB8fCAwKSAtIChiLndpemFyZFN0ZXAhLnN0ZXBOdW1iZXIgfHwgMCksXHJcbiAgICApO1xyXG4gICAgY29uc3QgZ3JvdXBzOiBVaUZvcm1TZWN0aW9uW11bXSA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBzIG9mIHdpdGhXaXphcmQpIHtcclxuICAgICAgY29uc3QgbnVtID0gcy53aXphcmRTdGVwIS5zdGVwTnVtYmVyO1xyXG4gICAgICBjb25zdCBwcmV2ID0gZ3JvdXBzW2dyb3Vwcy5sZW5ndGggLSAxXTtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHByZXY/Lmxlbmd0aCAmJlxyXG4gICAgICAgIChwcmV2WzBdLndpemFyZFN0ZXAhLnN0ZXBOdW1iZXIgfHwgMCkgPT09IChudW0gfHwgMClcclxuICAgICAgKSB7XHJcbiAgICAgICAgcHJldi5wdXNoKHMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGdyb3Vwcy5wdXNoKFtzXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBncm91cHM7XHJcbiAgfVxyXG5cclxuICAvKiogQ2hpYXZpIGRlaSBjYW1waSBgY3VzdG9tYCBpbiB0dXR0ZSBsZSBzZXppb25pIGRlbCBwYXNzbyBjb3JyZW50ZS4gKi9cclxuICBwcml2YXRlIGdldEN1c3RvbUZpZWxkS2V5c0Zvckdyb3VwKFxyXG4gICAgZ3JvdXA6IFVpRm9ybVNlY3Rpb25bXSB8IHVuZGVmaW5lZCxcclxuICApOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAoIWdyb3VwPy5sZW5ndGgpIHJldHVybiBbXTtcclxuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ3JvdXApIHtcclxuICAgICAgZm9yIChjb25zdCBmIG9mIHNlY3Rpb24uZmllbGRzIHx8IFtdKSB7XHJcbiAgICAgICAgaWYgKGYudHlwZSA9PT0gJ2N1c3RvbScpIGtleXMucHVzaChmLmtleSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBrZXlzO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJpbXVvdmUgZGFnbGkgZXJyb3JpIGkgY2FtcGkgY3VzdG9tIHF1YW5kbyBgdmFsaWRhdGVDdXN0b21Db21wb25lbnRzYCDDqCBmYWxzZS4gKi9cclxuICBwcml2YXRlIGZpbHRlckVycm9yRGV0YWlsc0V4Y2x1ZGluZ0N1c3RvbUZpZWxkcyhcclxuICAgIGRldGFpbHM6IFVpRm9ybUVycm9yRGV0YWlsW10sXHJcbiAgICBncm91cDogVWlGb3JtU2VjdGlvbltdLFxyXG4gICAgY3VzdG9tS2V5czogU2V0PHN0cmluZz4sXHJcbiAgKTogVWlGb3JtRXJyb3JEZXRhaWxbXSB7XHJcbiAgICBjb25zdCBzZWN0aW9uSWRzID0gZ3JvdXAubWFwKChzKSA9PiBzLmlkKTtcclxuICAgIHJldHVybiBkZXRhaWxzLmZpbHRlcigoZCkgPT4ge1xyXG4gICAgICBjb25zdCBsb2dpY2FsS2V5ID0gdGhpcy5sb2dpY2FsRmllbGRLZXlGcm9tRGV0YWlsS2V5Rm9yR3JvdXAoXHJcbiAgICAgICAgZC5maWVsZEtleSxcclxuICAgICAgICBzZWN0aW9uSWRzLFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gIWN1c3RvbUtleXMuaGFzKGxvZ2ljYWxLZXkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaXNvbHZlIGxhIGNoaWF2ZSBsb2dpY2EgZGVsIGNhbXBvIHJpc3BldHRvIGEgdHV0dGUgbGUgc2V6aW9uaSBkZWwgZ3J1cHBvIChjYW1waSBmbGF0IG8gcmVwZWF0YWJsZSkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2dpY2FsRmllbGRLZXlGcm9tRGV0YWlsS2V5Rm9yR3JvdXAoXHJcbiAgICBmaWVsZEtleTogc3RyaW5nLFxyXG4gICAgc2VjdGlvbklkczogc3RyaW5nW10sXHJcbiAgKTogc3RyaW5nIHtcclxuICAgIGZvciAoY29uc3QgaWQgb2Ygc2VjdGlvbklkcykge1xyXG4gICAgICBjb25zdCBrID0gdGhpcy5sb2dpY2FsRmllbGRLZXlGcm9tRGV0YWlsS2V5KGZpZWxkS2V5LCBpZCk7XHJcbiAgICAgIGlmIChrICE9PSBmaWVsZEtleSkgcmV0dXJuIGs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmllbGRLZXk7XHJcbiAgfVxyXG5cclxuICAvKiogRXN0cmFlIGxhIGNoaWF2ZSBjYW1wbyBkYSBgZmllbGRLZXlgIGZsYXQgbyBgc2VjdGlvbklkW2ldLmZpZWxkS2V5YC4gKi9cclxuICBwcml2YXRlIGxvZ2ljYWxGaWVsZEtleUZyb21EZXRhaWxLZXkoXHJcbiAgICBmaWVsZEtleTogc3RyaW5nLFxyXG4gICAgc2VjdGlvbklkOiBzdHJpbmcsXHJcbiAgKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChgXiR7dGhpcy5lc2NhcGVSZWdFeHAoc2VjdGlvbklkKX1cXFxcW1xcXFxkK1xcXFxdXFxcXC4oLispJGApO1xyXG4gICAgY29uc3QgbSA9IGZpZWxkS2V5Lm1hdGNoKHJlKTtcclxuICAgIHJldHVybiBtID8gbVsxXSA6IGZpZWxkS2V5O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlc2NhcGVSZWdFeHAoczogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBzLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGF1dG9TYXZlSWZOZWVkZWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy53aXphcmRDb25maWcuYXV0b1NhdmUgJiYgdGhpcy53aXphcmRDb25maWcub25TdGVwU2F2ZSkge1xyXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5mb3JtQnVpbGRlcj8uZ2V0Rm9ybVZhbHVlKCkgfHwge307XHJcbiAgICAgIGF3YWl0IHRoaXMud2l6YXJkQ29uZmlnLm9uU3RlcFNhdmUoZGF0YSwgdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN5bmNXaXphcmRTdGF0ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy53aXphcmRDb25maWcud2l6YXJkSWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBzeW5jRGF0YTogVWlXaXphcmRTeW5jRGF0YSA9IHtcclxuICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICB3aXphcmRTdGF0ZTogeyAuLi50aGlzLnN0YXRlIH0sXHJcbiAgICAgIHdpemFyZFN0ZXBzOiB0aGlzLndpemFyZFN0ZXBHcm91cHMubWFwKChnKSA9PiAoe1xyXG4gICAgICAgIHRpdGxlOiBnWzBdPy53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHwgZ1swXT8udGl0bGUsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IGdbMF0/LndpemFyZFN0ZXA/LnN0ZXBEZXNjcmlwdGlvbiB8fCBnWzBdPy5kZXNjcmlwdGlvbixcclxuICAgICAgfSkpLFxyXG4gICAgICBpc1dpemFyZE1vZGU6IHRydWUsXHJcbiAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMud2l6YXJkU3luYy5yZWdpc3RlcldpemFyZCh0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCwgc3luY0RhdGEpO1xyXG4gIH1cclxufVxyXG4iXX0=
1155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS13aXphcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXIvZm9ybS13aXphcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsTUFBTSxFQUVOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQWtCbEUsT0FBTyxFQUNMLG1CQUFtQixHQUVwQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7O0FBRXBFLHFFQUFxRTtBQUVyRTs7O0dBR0c7QUFnSEgsTUFBTSxPQUFPLHVCQUF1QjtJQS9HcEM7UUFpSFcsZUFBVSxHQUFzQixFQUFFLENBQUM7UUFFbkMsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFDcEIscUJBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLDJCQUFzQixHQUFHLEVBQUUsQ0FBQztRQUNyQyxpRkFBaUY7UUFDeEUsMEJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBRTdCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0tBcUJuRDtJQW5CQzs7OztPQUlHO0lBQ0gsd0JBQXdCLENBQUMsU0FBaUI7UUFDeEMsSUFB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QVM7dUJBQUMsc0JBQXNCO2dCQUt4QixNQUFNO3NCQUFkLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csVUFBVTtzQkFBbEIsS0FBSztnQkFHRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBR0csMkJBQTJCO3NCQUFuQyxLQUFLO2dCQUlJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBSUcsY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQXdKUCxpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIE9uSW5pdCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbiAgVmlld0NoaWxkLFxyXG4gIGluamVjdCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBIb3N0TGlzdGVuZXIsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEx1Y2lkZUFuZ3VsYXJNb2R1bGUgfSBmcm9tICdsdWNpZGUtYW5ndWxhcic7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBVaUJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvYnV0dG9uL2luZGV4JztcclxuXHJcbmltcG9ydCB7IFVpRm9ybUJ1aWxkZXJDb21wb25lbnQgfSBmcm9tICcuL2Zvcm0tYnVpbGRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQge1xyXG4gIFVpRm9ybVNjaGVtYSxcclxuICBVaUZvcm1TZWN0aW9uLFxyXG4gIFVpRm9ybURhdGEsXHJcbiAgVWlXaXphcmRDb25maWcsXHJcbiAgVWlXaXphcmRTdGF0ZSxcclxuICBVaVdpemFyZFN0ZXBDaGFuZ2VFdmVudCxcclxuICBVaVdpemFyZFN0ZXBDb21wbGV0ZUV2ZW50LFxyXG4gIFVpV2l6YXJkUmVzdW1lT3B0aW9ucyxcclxuICBVaVdpemFyZFJlc3VtZVJlc3VsdCxcclxuICBVaVdpemFyZFZhbGlkYXRpb25GbixcclxuICBVaUZvcm1DdXN0b21FdmVudCxcclxufSBmcm9tICcuL3R5cGVzL3NjaGVtYS50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgVWlGb3JtRXJyb3JEZXRhaWwsXHJcbiAgVWlGb3JtVmFsaWRhdGlvblN0YXRlLFxyXG59IGZyb20gJy4vdHlwZXMvdmFsaWRhdGlvbi50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgVWlXaXphcmRTeW5jU2VydmljZSxcclxuICBVaVdpemFyZFN5bmNEYXRhLFxyXG59IGZyb20gJy4vc2VydmljZXMvd2l6YXJkLXN5bmMuc2VydmljZSc7XHJcbmltcG9ydCB7IFVpTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvbG9nZ2luZy9sb2dnZXIuc2VydmljZSc7XHJcblxyXG4vLyDilIDilIDilIAgQ29tcG9uZW50aSBpbnRlcm5pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuLyoqXHJcbiAqIEhlYWRlciBkZWwgd2l6YXJkOiBwcm9ncmVzc28gZSBpbmZvIGRlbGxvIHN0ZXAgY29ycmVudGUuXHJcbiAqIENvbiBgcHJvZ3Jlc3NTdHlsZTogJ3N0ZXBzJ2AgZW1ldHRlIGBzdGVwU2VsZWN0YCBwZXIgc2FsdGFyZSBhIHVubyBzdGVwIGdpw6AgY29tcGxldGF0by5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndWktd2l6YXJkLWhlYWRlcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbTHVjaWRlQW5ndWxhck1vZHVsZV0sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19oZWFkZXJcIj5cclxuICAgICAgQGlmIChjb25maWcuc2hvd1Byb2dyZXNzICE9PSBmYWxzZSkge1xyXG4gICAgICAgIEBpZiAoY29uZmlnLnByb2dyZXNzU3R5bGUgIT09ICdzdGVwcycpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fcHJvZ3Jlc3MtYmFyXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19wcm9ncmVzcy1maWxsXCJcclxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJwcm9ncmVzc1BlcmNlbnRcIlxyXG4gICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3Byb2dyZXNzLXRleHRcIj5cclxuICAgICAgICAgICAge3sgcHJvZ3Jlc3NQZXJjZW50IH19JSBjb21wbGV0YXRvXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXBzXCI+XHJcbiAgICAgICAgICAgIEBmb3IgKFxyXG4gICAgICAgICAgICAgIGdyb3VwIG9mIHN0ZXBHcm91cHM7XHJcbiAgICAgICAgICAgICAgdHJhY2sgJGluZGV4O1xyXG4gICAgICAgICAgICAgIGxldCBpID0gJGluZGV4XHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXBcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLnVpLWZvcm0td2l6YXJkX19zdGVwLS1jdXJyZW50XT1cIlxyXG4gICAgICAgICAgICAgICAgICBpID09PSBzdGF0ZS5jdXJyZW50U3RlcFxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy51aS1mb3JtLXdpemFyZF9fc3RlcC0tY29tcGxldGVkXT1cIlxyXG4gICAgICAgICAgICAgICAgICBzdGF0ZS5jb21wbGV0ZWRTdGVwcy5oYXMoaSlcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MudWktZm9ybS13aXphcmRfX3N0ZXAtLXZpc2l0ZWRdPVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0YXRlLnZpc2l0ZWRTdGVwcy5oYXMoaSlcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MudWktZm9ybS13aXphcmRfX3N0ZXAtLW5hdmlnYWJsZV09XCJcclxuICAgICAgICAgICAgICAgICAgaXNTdGVwSW5kaWNhdG9yTmF2aWdhYmxlKGkpXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIEBpZiAoaXNTdGVwSW5kaWNhdG9yTmF2aWdhYmxlKGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLXRyaWdnZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwQXJpYUxhYmVsKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS50aXRsZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdTdGVwICcgKyAoaSArIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3RlcFNlbGVjdC5lbWl0KGkpXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1jaXJjbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc3RhdGUuY29tcGxldGVkU3RlcHMuaGFzKGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsdWNpZGUtaWNvbiBuYW1lPVwiY2hlY2tcIiBbc2l6ZV09XCIxNlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaSArIDEgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS50aXRsZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdTdGVwICcgKyAoaSArIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1zdGF0aWNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGkgPT09IHN0YXRlLmN1cnJlbnRTdGVwID8gJ3N0ZXAnIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtY2lyY2xlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHN0YXRlLmNvbXBsZXRlZFN0ZXBzLmhhcyhpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImNoZWNrXCIgW3NpemVdPVwiMTZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGkgKyAxIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBbMF0ud2l6YXJkU3RlcD8uc3RlcFRpdGxlIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBbMF0udGl0bGUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAnU3RlcCAnICsgKGkgKyAxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLWluZm9cIj5cclxuICAgICAgICA8aDIgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC10aXRsZVwiPnt7IGN1cnJlbnRTdGVwVGl0bGUgfX08L2gyPlxyXG4gICAgICAgIEBpZiAoY3VycmVudFN0ZXBEZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgPHAgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1kZXNjcmlwdGlvblwiPlxyXG4gICAgICAgICAgICB7eyBjdXJyZW50U3RlcERlc2NyaXB0aW9uIH19XHJcbiAgICAgICAgICA8L3A+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtY291bnRlclwiPlxyXG4gICAgICAgICAgUGFzc28ge3sgc3RhdGUuY3VycmVudFN0ZXAgKyAxIH19IGRpIHt7IHN0YXRlLnRvdGFsU3RlcHMgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpV2l6YXJkSGVhZGVyQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBjb25maWchOiBVaVdpemFyZENvbmZpZztcclxuICBASW5wdXQoKSBzdGVwR3JvdXBzOiBVaUZvcm1TZWN0aW9uW11bXSA9IFtdO1xyXG4gIEBJbnB1dCgpIHN0YXRlITogVWlXaXphcmRTdGF0ZTtcclxuICBASW5wdXQoKSBwcm9ncmVzc1BlcmNlbnQgPSAwO1xyXG4gIEBJbnB1dCgpIGN1cnJlbnRTdGVwVGl0bGUgPSAnJztcclxuICBASW5wdXQoKSBjdXJyZW50U3RlcERlc2NyaXB0aW9uID0gJyc7XHJcbiAgLyoqIFF1YW5kbyB0cnVlLCBpIGJ1bGxldCBzdGVwIG5vbiBzb25vIGludGVyYXR0aXZpIChlcy4gd2l6YXJkIGRpc2FiaWxpdGF0bykuICovXHJcbiAgQElucHV0KCkgZGlzYWJsZVN0ZXBJbmRpY2F0b3JzID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKSBzdGVwU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZGljZSBzdGVwIHNlbGV6aW9uYWJpbGUgdHJhbWl0ZSBidWxsZXQvdGl0b2xvIChzdGVwIGdpw6AgdmlzaXRhdGksIG5vbiBpbCBjb3JyZW50ZSkuXHJcbiAgICogVXNhIGB2aXNpdGVkU3RlcHNgIChub24gc29sbyBgY29tcGxldGVkU3RlcHNgKSBjb3PDrCBzaSBwdcOyIHRvcm5hcmUgYWxsbyBzdGVwIGNvcnJlbnRlXHJcbiAgICogaW5jb21wbGV0byBkb3BvIGF2ZXIgbmF2aWdhdG8gaW5kaWV0cm8gKGVzLiByZXN1bWUgc3VsIHByaW1vIHN0ZXAgbm9uIHZhbGlkbykuXHJcbiAgICovXHJcbiAgaXNTdGVwSW5kaWNhdG9yTmF2aWdhYmxlKHN0ZXBJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5jb25maWcuYWxsb3dTdGVwSW5kaWNhdG9yTmF2aWdhdGlvbiA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcclxuICAgIGlmICh0aGlzLmRpc2FibGVTdGVwSW5kaWNhdG9ycykgcmV0dXJuIGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLmFsbG93QmFja05hdmlnYXRpb24gPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBzdGVwSW5kZXggIT09IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgJiZcclxuICAgICAgdGhpcy5zdGF0ZS52aXNpdGVkU3RlcHMuaGFzKHN0ZXBJbmRleClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKiogVGVzdG8gYWNjZXNzaWJpbGUgcGVyIGlsIHB1bHNhbnRlIHN0ZXAgKG5hdmlnYXppb25lKS4gKi9cclxuICBzdGVwQXJpYUxhYmVsKHN0ZXBUaXRsZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgVmFpIGFsbG8gc3RlcDogJHtzdGVwVGl0bGV9YDtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGb290ZXIgZGVsIHdpemFyZDogcHVsc2FudGkgZGkgbmF2aWdhemlvbmUgZSBzYWx2YXRhZ2dpby5cclxuICogRW1ldHRlIGV2ZW50aSBwZXIgUHJldmlvdXMsIE5leHQsIEZpbmlzaCwgU2F2ZS5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndWktd2l6YXJkLWZvb3RlcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbVWlCdXR0b25Db21wb25lbnRdLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fZm9vdGVyXCI+XHJcbiAgICAgIEBpZiAoXHJcbiAgICAgICAgY29uZmlnLmFsbG93QmFja05hdmlnYXRpb24gIT09IGZhbHNlICYmIHN0YXRlLmN1cnJlbnRTdGVwID4gMFxyXG4gICAgICApIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX25hdi1hY3Rpb25cIj5cclxuICAgICAgICAgIDx1aS1idXR0b25cclxuICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy5idXR0b25MYWJlbHM/LnByZXZpb3VzID8/ICdJbmRpZXRybydcIlxyXG4gICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXHJcbiAgICAgICAgICAgIGljb249XCJjaGV2cm9uLWxlZnRcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwicHJldmlvdXMuZW1pdCgpXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19uYXYtaGludFwiPkN0cmwgKyDihpA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fZm9vdGVyLXJpZ2h0XCI+XHJcbiAgICAgICAgQGlmIChjb25maWcuYXV0b1NhdmUgJiYgY29uZmlnLmJ1dHRvbkxhYmVscz8uc2F2ZSkge1xyXG4gICAgICAgICAgPHVpLWJ1dHRvblxyXG4gICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLmJ1dHRvbkxhYmVscyEuc2F2ZSFcIlxyXG4gICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzYXZlLmVtaXQoKVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIH1cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX25hdi1hY3Rpb25cIj5cclxuICAgICAgICAgIEBpZiAoaXNMYXN0U3RlcCkge1xyXG4gICAgICAgICAgICA8dWktYnV0dG9uXHJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy5idXR0b25MYWJlbHM/LmZpbmlzaCA/PyAnQ29tcGxldGEnXCJcclxuICAgICAgICAgICAgICB2YXJpYW50PVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgaWNvbj1cImNoZWNrXCJcclxuICAgICAgICAgICAgICBpY29uUG9zaXRpb249XCJ0cmFpbGluZ1wiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImZpbmlzaC5lbWl0KClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgIDx1aS1idXR0b25cclxuICAgICAgICAgICAgICBbbGFiZWxdPVwiXHJcbiAgICAgICAgICAgICAgICBjb25maWcuYnV0dG9uTGFiZWxzPy5uZXh0ID8/XHJcbiAgICAgICAgICAgICAgICAgIGNvbmZpZy5idXR0b25MYWJlbHM/LnN1Ym1pdCA/P1xyXG4gICAgICAgICAgICAgICAgICAnQXZhbnRpJ1xyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgdmFyaWFudD1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgIGljb249XCJjaGV2cm9uLXJpZ2h0XCJcclxuICAgICAgICAgICAgICBpY29uUG9zaXRpb249XCJ0cmFpbGluZ1wiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm5leHQuZW1pdCgpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidWktZm9ybS13aXphcmRfX25hdi1oaW50XCI+Q3RybCArIOKGkjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICBgLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVWlXaXphcmRGb290ZXJDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpIGNvbmZpZyE6IFVpV2l6YXJkQ29uZmlnO1xyXG4gIEBJbnB1dCgpIHN0YXRlITogVWlXaXphcmRTdGF0ZTtcclxuICBASW5wdXQoKSBpc0xhc3RTdGVwID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKSBwcmV2aW91cyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgbmV4dCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgZmluaXNoID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBzYXZlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG59XHJcblxyXG4vLyDilIDilIDilIAgQ29tcG9uZW50ZSB3aXphcmQgcHJpbmNpcGFsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbi8qKlxyXG4gKiBDb21wb25lbnRlIHdpemFyZCBjaGUgd3JhcHBhIGBVaUZvcm1CdWlsZGVyQ29tcG9uZW50YFxyXG4gKiBhZ2dpdW5nZW5kbyBuYXZpZ2F6aW9uZSBtdWx0aS1zdGVwLCBiYXJyYSBkaSBwcm9ncmVzc28sXHJcbiAqIHZhbGlkYXppb25lIHBlciBzdGVwIGUgc2luY3Jvbml6emF6aW9uZSB3aXJlbGVzcy5cclxuICogUGnDuSBzZXppb25pIHNjaGVtYSBjb24gbG8gc3Rlc3NvIGB3aXphcmRTdGVwLnN0ZXBOdW1iZXJgIGZvcm1hbm8gdW4gdW5pY28gcGFzc29cclxuICogKGVzLiBwacO5IGJsb2NjaGkgY29sbGFzc2FiaWxpIHBlciBzdGVwKTsgbWV0YWRhdGkgZGVsIHBhc3NvIGRhbGxhIHByaW1hIHNlemlvbmUgZGVsIGdydXBwby5cclxuICpcclxuICogQHNlbGVjdG9yIHVpLWZvcm0td2l6YXJkXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGh0bWxcclxuICogPHVpLWZvcm0td2l6YXJkXHJcbiAqICAgW3NjaGVtYV09XCJ3aXphcmRTY2hlbWFcIlxyXG4gKiAgIFt3aXphcmRDb25maWddPVwid2l6YXJkQ29uZmlnXCJcclxuICogICAod2l6YXJkQ29tcGxldGUpPVwib25Db21wbGV0ZSgkZXZlbnQpXCJcclxuICogICAoc3RlcENoYW5nZSk9XCJvblN0ZXBDaGFuZ2UoJGV2ZW50KVwiXHJcbiAqIC8+XHJcbiAqIGBgYFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd1aS1mb3JtLXdpemFyZCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBMdWNpZGVBbmd1bGFyTW9kdWxlLFxyXG4gICAgVWlCdXR0b25Db21wb25lbnQsXHJcbiAgICBVaUZvcm1CdWlsZGVyQ29tcG9uZW50LFxyXG4gICAgVWlXaXphcmRIZWFkZXJDb21wb25lbnQsXHJcbiAgICBVaVdpemFyZEZvb3RlckNvbXBvbmVudCxcclxuICBdLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIEBpZiAoc2NoZW1hICYmIHdpemFyZENvbmZpZykge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRcIj5cclxuICAgICAgICA8IS0tIEhlYWRlciB3aXphcmQgKG5hc2Nvc3RvIHNlIHdpcmVsZXNzKSAtLT5cclxuICAgICAgICBAaWYgKCF3aXphcmRDb25maWcud2lyZWxlc3NIZWFkaW5nKSB7XHJcbiAgICAgICAgICA8dWktd2l6YXJkLWhlYWRlclxyXG4gICAgICAgICAgICBbY29uZmlnXT1cIndpemFyZENvbmZpZ1wiXHJcbiAgICAgICAgICAgIFtzdGVwR3JvdXBzXT1cIndpemFyZFN0ZXBHcm91cHNcIlxyXG4gICAgICAgICAgICBbc3RhdGVdPVwic3RhdGVcIlxyXG4gICAgICAgICAgICBbcHJvZ3Jlc3NQZXJjZW50XT1cInByb2dyZXNzUGVyY2VudFwiXHJcbiAgICAgICAgICAgIFtjdXJyZW50U3RlcFRpdGxlXT1cImN1cnJlbnRTdGVwVGl0bGVcIlxyXG4gICAgICAgICAgICBbY3VycmVudFN0ZXBEZXNjcmlwdGlvbl09XCJjdXJyZW50U3RlcERlc2NyaXB0aW9uXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVTdGVwSW5kaWNhdG9yc109XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgIChzdGVwU2VsZWN0KT1cIm9uV2l6YXJkU3RlcEluZGljYXRvclNlbGVjdCgkZXZlbnQpXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8IS0tIE5hdmlnYXppb25lIHNvcHJhIGlsIGZvcm0gLS0+XHJcbiAgICAgICAgQGlmIChzaG93VG9wTmF2KSB7XHJcbiAgICAgICAgICA8dWktd2l6YXJkLWZvb3RlclxyXG4gICAgICAgICAgICBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19mb290ZXIgdWktZm9ybS13aXphcmRfX2Zvb3Rlci0tdG9wXCJcclxuICAgICAgICAgICAgW2NvbmZpZ109XCJ3aXphcmRDb25maWdcIlxyXG4gICAgICAgICAgICBbc3RhdGVdPVwic3RhdGVcIlxyXG4gICAgICAgICAgICBbaXNMYXN0U3RlcF09XCJpc0xhc3RTdGVwXCJcclxuICAgICAgICAgICAgKHByZXZpb3VzKT1cImdvVG9QcmV2aW91c1N0ZXAoKVwiXHJcbiAgICAgICAgICAgIChuZXh0KT1cImdvVG9OZXh0U3RlcCgpXCJcclxuICAgICAgICAgICAgKGZpbmlzaCk9XCJmaW5pc2hXaXphcmQoKVwiXHJcbiAgICAgICAgICAgIChzYXZlKT1cInNhdmVDdXJyZW50U3RlcCgpXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX2NvbnRlbnRcIj5cclxuICAgICAgICAgIDwhLS0gRm9ybSBidWlsZGVyIHBlciBsbyBzdGVwIGNvcnJlbnRlIC0tPlxyXG4gICAgICAgICAgPHVpLWZvcm0tYnVpbGRlclxyXG4gICAgICAgICAgICBbc2NoZW1hXT1cImN1cnJlbnRTdGVwU2NoZW1hIVwiXHJcbiAgICAgICAgICAgIFtpbml0aWFsRGF0YV09XCJtZXJnZWRJbml0aWFsRGF0YUZvckJ1aWxkZXJcIlxyXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICBbbG9hZGluZ0Zvcl09XCJsb2FkaW5nRm9yXCJcclxuICAgICAgICAgICAgW2N1c3RvbUZpZWxkVGVtcGxhdGVzXT1cImN1c3RvbUZpZWxkVGVtcGxhdGVzXCJcclxuICAgICAgICAgICAgW2N1c3RvbUZpZWxkVGVtcGxhdGVGYWxsYmFja109XCJjdXN0b21GaWVsZFRlbXBsYXRlRmFsbGJhY2tcIlxyXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKHZhbGlkYXRpb25DaGFuZ2UpPVwib25WYWxpZGF0aW9uQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAoY3VzdG9tRXZlbnQpPVwiY3VzdG9tRXZlbnQuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gTmF2aWdhemlvbmUgc290dG8gaWwgZm9ybSAtLT5cclxuICAgICAgICBAaWYgKHNob3dCb3R0b21OYXYpIHtcclxuICAgICAgICAgIDx1aS13aXphcmQtZm9vdGVyXHJcbiAgICAgICAgICAgIGNsYXNzPVwidWktZm9ybS13aXphcmRfX2Zvb3RlclwiXHJcbiAgICAgICAgICAgIFtjb25maWddPVwid2l6YXJkQ29uZmlnXCJcclxuICAgICAgICAgICAgW3N0YXRlXT1cInN0YXRlXCJcclxuICAgICAgICAgICAgW2lzTGFzdFN0ZXBdPVwiaXNMYXN0U3RlcFwiXHJcbiAgICAgICAgICAgIChwcmV2aW91cyk9XCJnb1RvUHJldmlvdXNTdGVwKClcIlxyXG4gICAgICAgICAgICAobmV4dCk9XCJnb1RvTmV4dFN0ZXAoKVwiXHJcbiAgICAgICAgICAgIChmaW5pc2gpPVwiZmluaXNoV2l6YXJkKClcIlxyXG4gICAgICAgICAgICAoc2F2ZSk9XCJzYXZlQ3VycmVudFN0ZXAoKVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgYCxcclxuICBzdHlsZVVybDogJy4vZm9ybS13aXphcmQuY29tcG9uZW50LnNjc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVWlGb3JtV2l6YXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHdpemFyZFN5bmMgPSBpbmplY3QoVWlXaXphcmRTeW5jU2VydmljZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBpbmplY3QoVWlMb2dnZXJTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBAVmlld0NoaWxkKFVpRm9ybUJ1aWxkZXJDb21wb25lbnQpIGZvcm1CdWlsZGVyPzogVWlGb3JtQnVpbGRlckNvbXBvbmVudDtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIElucHV0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKiogU2NoZW1hIGNvbXBsZXRvIGRlbCBmb3JtICh0dXR0ZSBsZSBzZXppb25pIGNvbiB3aXphcmRTdGVwKS4gKi9cclxuICBASW5wdXQoKSBzY2hlbWEhOiBVaUZvcm1TY2hlbWE7XHJcblxyXG4gIC8qKiBDb25maWd1cmF6aW9uZSBkZWwgd2l6YXJkLiAqL1xyXG4gIEBJbnB1dCgpIHdpemFyZENvbmZpZyE6IFVpV2l6YXJkQ29uZmlnO1xyXG5cclxuICAvKiogTWV0b2RpIGRpIHZhbGlkYXppb25lIGN1c3RvbSBwZXIgc3RlcC4gKi9cclxuICBASW5wdXQoKSBjdXN0b21WYWxpZGF0aW9uTWV0aG9kczogUmVjb3JkPHN0cmluZywgVWlXaXphcmRWYWxpZGF0aW9uRm4+ID0ge307XHJcblxyXG4gIC8qKiBEYXRpIGluaXppYWxpLiAqL1xyXG4gIEBJbnB1dCgpIGluaXRpYWxEYXRhOiBVaUZvcm1EYXRhID0ge307XHJcblxyXG4gIC8qKiBNb2RhbGl0YSBzb2xhIGxldHR1cmEuICovXHJcbiAgQElucHV0KCkgcmVhZG9ubHkgPSBmYWxzZTtcclxuXHJcbiAgLyoqIFN0YXRvIGRpc2FiaWxpdGF0by4gKi9cclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAvKiogUHVsc2FudGUgaW4gY2FyaWNhbWVudG8uICovXHJcbiAgQElucHV0KCkgbG9hZGluZ0Zvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBUZW1wbGF0ZSBwZXIgY2FtcGkgYHR5cGU6ICdjdXN0b20nYCAoaW5vbHRybyBhbCBmb3JtIGJ1aWxkZXIpLiAqL1xyXG4gIEBJbnB1dCgpIGN1c3RvbUZpZWxkVGVtcGxhdGVzOiBSZWNvcmQ8c3RyaW5nLCBUZW1wbGF0ZVJlZjx1bmtub3duPj4gPSB7fTtcclxuXHJcbiAgLyoqIEZhbGxiYWNrIHRlbXBsYXRlIHBlciBjYW1waSBjdXN0b20gKGlub2x0cm8gYWwgZm9ybSBidWlsZGVyKS4gKi9cclxuICBASW5wdXQoKSBjdXN0b21GaWVsZFRlbXBsYXRlRmFsbGJhY2s/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIE91dHB1dCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgQE91dHB1dCgpIHN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFVpV2l6YXJkU3RlcENoYW5nZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBzdGVwQ29tcGxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPFVpV2l6YXJkU3RlcENvbXBsZXRlRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIHN0ZXBWYWxpZGF0aW9uRmFpbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7XHJcbiAgICBzdGVwOiBudW1iZXI7XHJcbiAgICBlcnJvcnM6IHN0cmluZ1tdO1xyXG4gIH0+KCk7XHJcbiAgQE91dHB1dCgpIHdpemFyZENvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxVaUZvcm1EYXRhPigpO1xyXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VWlGb3JtRGF0YT4oKTtcclxuICBAT3V0cHV0KCkgdmFsaWRhdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VWlGb3JtVmFsaWRhdGlvblN0YXRlPigpO1xyXG4gIEBPdXRwdXQoKSBjdXN0b21FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8VWlGb3JtQ3VzdG9tRXZlbnQ+KCk7XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBTdGF0byDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgc3RhdGU6IFVpV2l6YXJkU3RhdGUgPSB7XHJcbiAgICBjdXJyZW50U3RlcDogMCxcclxuICAgIHRvdGFsU3RlcHM6IDAsXHJcbiAgICBjb21wbGV0ZWRTdGVwczogbmV3IFNldDxudW1iZXI+KCksXHJcbiAgICB2aXNpdGVkU3RlcHM6IG5ldyBTZXQ8bnVtYmVyPihbMF0pLFxyXG4gICAgaXNWYWxpZDogZmFsc2UsXHJcbiAgICBzdGVwRXJyb3JzOiB7fSxcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBHcnVwcGkgZGkgc2V6aW9uaSBzY2hlbWEgcGVyIHBhc3NvIGxvZ2ljbyBkZWwgd2l6YXJkLlxyXG4gICAqIFNlemlvbmkgY29uIGxvIHN0ZXNzbyBgd2l6YXJkU3RlcC5zdGVwTnVtYmVyYCBjb21wb25nb25vIHVuIHVuaWNvIHBhc3NvIChvcmRpbmU6IGNvbWUgaW4gYHNjaGVtYS5zZWN0aW9uc2AgZG9wbyBzb3J0IHBlciBudW1lcm8pLlxyXG4gICAqL1xyXG4gIHdpemFyZFN0ZXBHcm91cHM6IFVpRm9ybVNlY3Rpb25bXVtdID0gW107XHJcblxyXG4gIC8qKiBEYXRpIGFjY3VtdWxhdGkgZGVsIGZvcm0uICovXHJcbiAgcHJpdmF0ZSBhY2N1bXVsYXRlZERhdGE6IFVpRm9ybURhdGEgPSB7fTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2NoZW1hIGNhY2hhdG8gcGVyIGxvIHN0ZXAgY29ycmVudGUuXHJcbiAgICogRXZpdGEgZGkgY3JlYXJlIHVuIG51b3ZvIG9nZ2V0dG8gYWQgb2duaSBjaWNsbyBkaSBjaGFuZ2UgZGV0ZWN0aW9uLFxyXG4gICAqIGNvc2EgY2hlIGNhdXNlcmViYmUgcmVidWlsZCBpbmZpbml0aSBuZWwgZm9ybSBidWlsZGVyLlxyXG4gICAqL1xyXG4gIF9jYWNoZWRTdGVwU2NoZW1hOiBVaUZvcm1TY2hlbWEgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF9jYWNoZWRTdGVwSW5kZXg6IG51bWJlciA9IC0xO1xyXG5cclxuICAvLyDilIDilIDilIAgR2V0dGVyIGNhbGNvbGF0aSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgZ2V0IGN1cnJlbnRTdGVwU2NoZW1hKCk6IFVpRm9ybVNjaGVtYSB8IG51bGwge1xyXG4gICAgLy8gU2UgbG8gc3RlcCBub24gZSBjYW1iaWF0bywgcmVzdGl0dWlzY2kgbG8gc2NoZW1hIGNhY2hhdG9cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5fY2FjaGVkU3RlcEluZGV4ID09PSB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwICYmXHJcbiAgICAgIHRoaXMuX2NhY2hlZFN0ZXBTY2hlbWFcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGVkU3RlcFNjaGVtYTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBncm91cCA9IHRoaXMud2l6YXJkU3RlcEdyb3Vwc1t0aGlzLnN0YXRlLmN1cnJlbnRTdGVwXTtcclxuICAgIGlmICghZ3JvdXA/Lmxlbmd0aCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgdGhpcy5fY2FjaGVkU3RlcFNjaGVtYSA9IHtcclxuICAgICAgaWQ6IHRoaXMuc2NoZW1hLmlkICsgJy1zdGVwLScgKyB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICBzZWN0aW9uczogZ3JvdXAsXHJcbiAgICAgIGNvbmZpZzogeyAuLi50aGlzLnNjaGVtYS5jb25maWcsIGhpZGVGb290ZXI6IHRydWUsIHNob3dCdXR0b25zOiBmYWxzZSB9LFxyXG4gICAgfTtcclxuICAgIHRoaXMuX2NhY2hlZFN0ZXBJbmRleCA9IHRoaXMuc3RhdGUuY3VycmVudFN0ZXA7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkU3RlcFNjaGVtYTtcclxuICB9XHJcblxyXG4gIGdldCBjdXJyZW50U3RlcFRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwcmltYXJ5ID0gdGhpcy53aXphcmRTdGVwR3JvdXBzW3RoaXMuc3RhdGUuY3VycmVudFN0ZXBdPy5bMF07XHJcbiAgICByZXR1cm4gcHJpbWFyeT8ud2l6YXJkU3RlcD8uc3RlcFRpdGxlIHx8IHByaW1hcnk/LnRpdGxlIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1cnJlbnRTdGVwRGVzY3JpcHRpb24oKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHByaW1hcnkgPSB0aGlzLndpemFyZFN0ZXBHcm91cHNbdGhpcy5zdGF0ZS5jdXJyZW50U3RlcF0/LlswXTtcclxuICAgIHJldHVybiBwcmltYXJ5Py53aXphcmRTdGVwPy5zdGVwRGVzY3JpcHRpb24gfHwgcHJpbWFyeT8uZGVzY3JpcHRpb24gfHwgJyc7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNMYXN0U3RlcCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwID49IHRoaXMuc3RhdGUudG90YWxTdGVwcyAtIDE7XHJcbiAgfVxyXG5cclxuICBnZXQgcHJvZ3Jlc3NQZXJjZW50KCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5zdGF0ZS50b3RhbFN0ZXBzIDw9IDEpIHJldHVybiAxMDA7XHJcbiAgICByZXR1cm4gTWF0aC5yb3VuZChcclxuICAgICAgKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgLyAodGhpcy5zdGF0ZS50b3RhbFN0ZXBzIC0gMSkpICogMTAwLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdGkgcGFzc2F0aSBhbCBmb3JtIGJ1aWxkZXI6IHVuaW9uZSB0cmEgdmFsb3JpIGZvcm5pdGkgZGFsIGNvbnN1bWVyIGVcclxuICAgKiBzdGF0byBhY2N1bXVsYXRvIHRyYSBnbGkgc3RlcC4gU2VuemEgcXVlc3RvLCB0b3JuYW5kbyBpbmRpZXRybyBpbCBidWlsZGVyXHJcbiAgICogcmljZXZlcmViYmUgc29sbyBgaW5pdGlhbERhdGFgIGUgcmljcmVlcmViYmUgaSBjYW1waSB2dW90aSwgcHVyIGF2ZW5kb1xyXG4gICAqIGkgdmFsb3JpIGFuY29yYSBpbiBgYWNjdW11bGF0ZWREYXRhYC5cclxuICAgKi9cclxuICBnZXQgbWVyZ2VkSW5pdGlhbERhdGFGb3JCdWlsZGVyKCk6IFVpRm9ybURhdGEge1xyXG4gICAgcmV0dXJuIHsgLi4udGhpcy5pbml0aWFsRGF0YSwgLi4udGhpcy5hY2N1bXVsYXRlZERhdGEgfTtcclxuICB9XHJcblxyXG4gIC8qKiBNb3N0cmEgbGEgbmF2aWdhemlvbmUgc29wcmEgaWwgZm9ybSBidWlsZGVyLiAqL1xyXG4gIGdldCBzaG93VG9wTmF2KCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLnNob3dOYXZpZ2F0aW9uQnV0dG9ucyA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IHBvcyA9IHRoaXMud2l6YXJkQ29uZmlnLm5hdmlnYXRpb25Qb3NpdGlvbjtcclxuICAgIHJldHVybiBwb3MgPT09ICd0b3AnIHx8IHBvcyA9PT0gJ2JvdGgnO1xyXG4gIH1cclxuXHJcbiAgLyoqIE1vc3RyYSBsYSBuYXZpZ2F6aW9uZSBzb3R0byBpbCBmb3JtIGJ1aWxkZXIuICovXHJcbiAgZ2V0IHNob3dCb3R0b21OYXYoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy53aXphcmRDb25maWcuc2hvd05hdmlnYXRpb25CdXR0b25zID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgY29uc3QgcG9zID0gdGhpcy53aXphcmRDb25maWcubmF2aWdhdGlvblBvc2l0aW9uO1xyXG4gICAgcmV0dXJuIHBvcyA9PT0gJ2JvdHRvbScgfHwgcG9zID09PSAnYm90aCcgfHwgcG9zID09IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zY2hlbWEpIHtcclxuICAgICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbignaW5pdCcsIHsgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnPy53aXphcmRJZCwgZXJyb3I6ICdzY2hlbWEgbm9uIHByZXNlbnRlJyB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMud2l6YXJkU3RlcEdyb3VwcyA9IHRoaXMuYnVpbGRXaXphcmRTdGVwR3JvdXBzKHRoaXMuc2NoZW1hLnNlY3Rpb25zKTtcclxuICAgIHRoaXMuc3RhdGUudG90YWxTdGVwcyA9IHRoaXMud2l6YXJkU3RlcEdyb3Vwcy5sZW5ndGg7XHJcbiAgICB0aGlzLmFjY3VtdWxhdGVkRGF0YSA9IHsgLi4udGhpcy5pbml0aWFsRGF0YSB9O1xyXG5cclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ2luaXQnLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZz8ud2l6YXJkSWQsXHJcbiAgICAgIHNjaGVtYUlkOiB0aGlzLnNjaGVtYS5pZCxcclxuICAgICAgdG90YWxTdGVwczogdGhpcy5zdGF0ZS50b3RhbFN0ZXBzLFxyXG4gICAgICB0b3RhbFNlY3Rpb25zOiB0aGlzLndpemFyZFN0ZXBHcm91cHMucmVkdWNlKChzdW0sIGcpID0+IHN1bSArIGcubGVuZ3RoLCAwKSxcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFNpbmNyb25penphemlvbmUgd2lyZWxlc3NcclxuICAgIGlmICh0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCkge1xyXG4gICAgICB0aGlzLnN5bmNXaXphcmRTdGF0ZSgpO1xyXG5cclxuICAgICAgLy8gQXNjb2x0YSBuYXZpZ2F6aW9uZSBlc3Rlcm5hXHJcbiAgICAgIHRoaXMud2l6YXJkU3luY1xyXG4gICAgICAgIC5nZXRXaXphcmRTdGF0ZSQodGhpcy53aXphcmRDb25maWcud2l6YXJkSWQpXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEud2l6YXJkU3RhdGUuY3VycmVudFN0ZXAgIT09IHRoaXMuc3RhdGUuY3VycmVudFN0ZXApIHtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvU3RlcChkYXRhLndpemFyZFN0YXRlLmN1cnJlbnRTdGVwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbignZGVzdHJveScsIHtcclxuICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnPy53aXphcmRJZCxcclxuICAgICAgc2NoZW1hSWQ6IHRoaXMuc2NoZW1hPy5pZCxcclxuICAgICAgY3VycmVudFN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnPy53aXphcmRJZCkge1xyXG4gICAgICB0aGlzLndpemFyZFN5bmMudW5yZWdpc3RlcldpemFyZCh0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTY29yY2lhdG9pYTogQ3RybCArIEZyZWNjaWEgc2luaXN0cmEvZGVzdHJhIHBlciBuYXZpZ2FyZSBjb21lIGkgcHVsc2FudGlcclxuICAgKiBJbmRpZXRybyAvIEF2YW50aSAoc3VsbCd1bHRpbW8gc3RlcCwgQXZhbnRpIGVxdWl2YWxlIGEgQ29tcGxldGEpLlxyXG4gICAqIElnbm9yYXRhIHNlIGlsIGZvY3VzIMOoIGluIHVuIGNhbXBvIGRpIGlucHV0IHBlciBub24gaW50ZXJmZXJpcmUgY29uIGxhIGRpZ2l0YXppb25lLlxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nLCBbJyRldmVudCddKVxyXG4gIG9uRG9jdW1lbnRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2NoZW1hIHx8ICF0aGlzLndpemFyZENvbmZpZyB8fCB0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICBpZiAodGhpcy53aXphcmRDb25maWcuc2hvd05hdmlnYXRpb25CdXR0b25zID09PSBmYWxzZSkgcmV0dXJuO1xyXG4gICAgaWYgKCFldmVudC5jdHJsS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LnNoaWZ0S2V5KVxyXG4gICAgICByZXR1cm47XHJcbiAgICBpZiAoZXZlbnQua2V5ICE9PSAnQXJyb3dMZWZ0JyAmJiBldmVudC5rZXkgIT09ICdBcnJvd1JpZ2h0JykgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMuaXNFZGl0YWJsZUtleWJvYXJkVGFyZ2V0KGV2ZW50LnRhcmdldCkpIHJldHVybjtcclxuXHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0Jykge1xyXG4gICAgICBpZiAodGhpcy53aXphcmRDb25maWcuYWxsb3dCYWNrTmF2aWdhdGlvbiA9PT0gZmFsc2UpIHJldHVybjtcclxuICAgICAgaWYgKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgPD0gMCkgcmV0dXJuO1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdrZXlib2FyZE5hdmlnYXRpb24nLCB7XHJcbiAgICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICAgIGRpcmVjdGlvbjogJ3ByZXZpb3VzJyxcclxuICAgICAgICBmcm9tU3RlcDogdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZ29Ub1ByZXZpb3VzU3RlcCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQXJyb3dSaWdodFxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ2tleWJvYXJkTmF2aWdhdGlvbicsIHtcclxuICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICBkaXJlY3Rpb246IHRoaXMuaXNMYXN0U3RlcCA/ICdmaW5pc2gnIDogJ25leHQnLFxyXG4gICAgICBmcm9tU3RlcDogdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuaXNMYXN0U3RlcCkge1xyXG4gICAgICB2b2lkIHRoaXMuZmluaXNoV2l6YXJkKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2b2lkIHRoaXMuZ29Ub05leHRTdGVwKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogVHJ1ZSBzZSBpbCB0YXJnZXQgZGVsIGtleWRvd24gw6ggdW4gZWxlbWVudG8gZG92ZSBsYSBkaWdpdGF6aW9uZSBoYSBwcmlvcml0w6Agc3VsbGEgc2hvcnRjdXQgd2l6YXJkLiAqL1xyXG4gIHByaXZhdGUgaXNFZGl0YWJsZUtleWJvYXJkVGFyZ2V0KHRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRhcmdldCB8fCAhKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgY29uc3QgZWwgPSB0YXJnZXQ7XHJcbiAgICBpZiAoZWwuaXNDb250ZW50RWRpdGFibGUpIHJldHVybiB0cnVlO1xyXG4gICAgY29uc3QgdGFnID0gZWwudGFnTmFtZTtcclxuICAgIGlmICh0YWcgPT09ICdJTlBVVCcgfHwgdGFnID09PSAnVEVYVEFSRUEnIHx8IHRhZyA9PT0gJ1NFTEVDVCcpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIE5hdmlnYXppb25lIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKiogVmFpIGFsbG8gc3RlcCBzdWNjZXNzaXZvIGNvbiB2YWxpZGF6aW9uZS4gKi9cclxuICBhc3luYyBnb1RvTmV4dFN0ZXAoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5pc0xhc3RTdGVwKSByZXR1cm47XHJcblxyXG4gICAgLy8gVmFsaWRhIHN0ZXAgY29ycmVudGVcclxuICAgIGlmICghKGF3YWl0IHRoaXMudmFsaWRhdGVDdXJyZW50U3RlcCgpKSkgcmV0dXJuO1xyXG5cclxuICAgIC8vIFNhbHZhIGRhdGkgc3RlcCBjb3JyZW50ZVxyXG4gICAgdGhpcy5zdGF0ZS5jb21wbGV0ZWRTdGVwcy5hZGQodGhpcy5zdGF0ZS5jdXJyZW50U3RlcCk7XHJcbiAgICBhd2FpdCB0aGlzLmF1dG9TYXZlSWZOZWVkZWQoKTtcclxuXHJcbiAgICB0aGlzLm5hdmlnYXRlVG9TdGVwKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgKyAxKTtcclxuICB9XHJcblxyXG4gIC8qKiBUb3JuYSBhbGxvIHN0ZXAgcHJlY2VkZW50ZS4gKi9cclxuICBnb1RvUHJldmlvdXNTdGVwKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgPD0gMCkgcmV0dXJuO1xyXG4gICAgdGhpcy5uYXZpZ2F0ZVRvU3RlcCh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOYXZpZ2F6aW9uZSB0cmFtaXRlIGluZGljYXRvcmkgc3RlcCAoYnVsbGV0ICsgdGl0b2xvKSBxdWFuZG8gYHByb2dyZXNzU3R5bGVgIMOoIGAnc3RlcHMnYC5cclxuICAgKiBDb25zZW50aXRvIHZlcnNvIHN0ZXAgZ2nDoCB2aXNpdGF0aSAoYW5jaGUgc2Ugbm9uIGFuY29yYSBjb21wbGV0YXRpL3ZhbGlkaSkuXHJcbiAgICovXHJcbiAgb25XaXphcmRTdGVwSW5kaWNhdG9yU2VsZWN0KHN0ZXBJbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLmFsbG93U3RlcEluZGljYXRvck5hdmlnYXRpb24gPT09IGZhbHNlKSByZXR1cm47XHJcbiAgICBpZiAodGhpcy53aXphcmRDb25maWcuYWxsb3dCYWNrTmF2aWdhdGlvbiA9PT0gZmFsc2UpIHJldHVybjtcclxuICAgIGlmIChzdGVwSW5kZXggPT09IHRoaXMuc3RhdGUuY3VycmVudFN0ZXApIHJldHVybjtcclxuICAgIGlmICghdGhpcy5zdGF0ZS52aXNpdGVkU3RlcHMuaGFzKHN0ZXBJbmRleCkpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCduYXZpZ2F0aW9uJywge1xyXG4gICAgICB3aXphcmRJZDogdGhpcy53aXphcmRDb25maWcud2l6YXJkSWQsXHJcbiAgICAgIHZpYTogJ3N0ZXBJbmRpY2F0b3InLFxyXG4gICAgICBmcm9tU3RlcDogdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgdG9TdGVwOiBzdGVwSW5kZXgsXHJcbiAgICB9KTtcclxuICAgIHRoaXMubmF2aWdhdGVUb1N0ZXAoc3RlcEluZGV4KTtcclxuICB9XHJcblxyXG4gIC8qKiBDb21wbGV0YSBpbCB3aXphcmQuICovXHJcbiAgYXN5bmMgZmluaXNoV2l6YXJkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCEoYXdhaXQgdGhpcy52YWxpZGF0ZUN1cnJlbnRTdGVwKCkpKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ3N0ZXBWYWxpZGF0aW9uRmFpbGVkJywge1xyXG4gICAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgICBzdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICAgIGNvbnRleHQ6ICdmaW5pc2gnLFxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RhdGUuY29tcGxldGVkU3RlcHMuYWRkKHRoaXMuc3RhdGUuY3VycmVudFN0ZXApO1xyXG4gICAgYXdhaXQgdGhpcy5hdXRvU2F2ZUlmTmVlZGVkKCk7XHJcblxyXG4gICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbignY29tcGxldGUnLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgc2NoZW1hSWQ6IHRoaXMuc2NoZW1hPy5pZCxcclxuICAgICAgdG90YWxTdGVwczogdGhpcy5zdGF0ZS50b3RhbFN0ZXBzLFxyXG4gICAgICBjb21wbGV0ZWRTdGVwczogQXJyYXkuZnJvbSh0aGlzLnN0YXRlLmNvbXBsZXRlZFN0ZXBzKSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy53aXphcmRDb21wbGV0ZS5lbWl0KHRoaXMuYWNjdW11bGF0ZWREYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKiBTYWx2YSBsbyBzdGVwIGNvcnJlbnRlIG1hbnVhbG1lbnRlLiAqL1xyXG4gIGFzeW5jIHNhdmVDdXJyZW50U3RlcCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLndpemFyZENvbmZpZy5vblN0ZXBTYXZlKSB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZvcm1CdWlsZGVyPy5nZXRGb3JtVmFsdWUoKSB8fCB7fTtcclxuICAgICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbignc2F2ZScsIHtcclxuICAgICAgICB3aXphcmRJZDogdGhpcy53aXphcmRDb25maWcud2l6YXJkSWQsXHJcbiAgICAgICAgc3RlcDogdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgICBzY2hlbWFJZDogdGhpcy5zY2hlbWE/LmlkLFxyXG4gICAgICB9KTtcclxuICAgICAgYXdhaXQgdGhpcy53aXphcmRDb25maWcub25TdGVwU2F2ZShkYXRhLCB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNjYW5zaW9uYSBnbGkgc3RlcCBpbiBvcmRpbmUsIG1hcmNhIGNvbWUgY29tcGxldGF0aSBxdWVsbGkgdmFsaWRpIHJpc3BldHRvIGFsbGVcclxuICAgKiBzdGVzc2UgcmVnb2xlIGRpIE5leHQvQ29tcGxldGEgZSBwb3NpemlvbmEgaWwgd2l6YXJkIHN1bCBwcmltbyBzdGVwIG5vbiB2YWxpZG9cclxuICAgKiAobyBzdWxsJ3VsdGltbyBzZSB0dXR0aSB2YWxpZGkpLiBVdGlsZSBkb3BvIGlsIHByZWxvYWQgZGkgYGluaXRpYWxEYXRhYCBpbiBlZGl0LlxyXG4gICAqL1xyXG4gIGFzeW5jIHJlc3VtZUNvbXBsZXRlZFN0ZXBzRnJvbVZhbGlkYXRpb24oXHJcbiAgICBvcHRpb25zPzogVWlXaXphcmRSZXN1bWVPcHRpb25zLFxyXG4gICk6IFByb21pc2U8VWlXaXphcmRSZXN1bWVSZXN1bHQ+IHtcclxuICAgIGNvbnN0IGVtaXRTdGVwQ29tcGxldGUgPSBvcHRpb25zPy5lbWl0U3RlcENvbXBsZXRlID8/IGZhbHNlO1xyXG4gICAgY29uc3QgZW1pdFN0ZXBTYXZlID0gb3B0aW9ucz8uZW1pdFN0ZXBTYXZlID8/IGZhbHNlO1xyXG5cclxuICAgIGlmICghdGhpcy5zY2hlbWEgfHwgdGhpcy5zdGF0ZS50b3RhbFN0ZXBzIDw9IDApIHtcclxuICAgICAgcmV0dXJuIHsgbGFzdENvbXBsZXRlZFN0ZXA6IC0xLCBjdXJyZW50U3RlcDogMCB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ3Jlc3VtZScsIHtcclxuICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnPy53aXphcmRJZCxcclxuICAgICAgc2NoZW1hSWQ6IHRoaXMuc2NoZW1hLmlkLFxyXG4gICAgICB0b3RhbFN0ZXBzOiB0aGlzLnN0YXRlLnRvdGFsU3RlcHMsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjb21wbGV0ZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcclxuICAgIGxldCBsYXN0Q29tcGxldGVkU3RlcCA9IC0xO1xyXG4gICAgbGV0IHRhcmdldFN0ZXAgPSAwO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGF0ZS50b3RhbFN0ZXBzOyBpKyspIHtcclxuICAgICAgY29uc3QgcmVhZHkgPSBhd2FpdCB0aGlzLnByZXBhcmVTdGVwRm9yVmFsaWRhdGlvbihpKTtcclxuICAgICAgaWYgKCFyZWFkeSkge1xyXG4gICAgICAgIHRhcmdldFN0ZXAgPSBpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB2YWxpZCA9IGF3YWl0IHRoaXMudmFsaWRhdGVDdXJyZW50U3RlcCh7XHJcbiAgICAgICAgZW1pdFN0ZXBDb21wbGV0ZSxcclxuICAgICAgICBlbWl0U3RlcFZhbGlkYXRpb25GYWlsZWQ6IGZhbHNlLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgICB0YXJnZXRTdGVwID0gaTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgY29tcGxldGVkLmFkZChpKTtcclxuICAgICAgbGFzdENvbXBsZXRlZFN0ZXAgPSBpO1xyXG4gICAgICB0YXJnZXRTdGVwID0gaTtcclxuXHJcbiAgICAgIHRoaXMuYWNjdW11bGF0ZWREYXRhID0ge1xyXG4gICAgICAgIC4uLnRoaXMuYWNjdW11bGF0ZWREYXRhLFxyXG4gICAgICAgIC4uLih0aGlzLmZvcm1CdWlsZGVyPy5nZXRGb3JtVmFsdWUoKSB8fCB7fSksXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAoZW1pdFN0ZXBTYXZlKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5hdXRvU2F2ZUlmTmVlZGVkKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN0YXRlLmNvbXBsZXRlZFN0ZXBzID0gY29tcGxldGVkO1xyXG4gICAgZm9yIChsZXQgdiA9IDA7IHYgPD0gdGFyZ2V0U3RlcDsgdisrKSB7XHJcbiAgICAgIHRoaXMuc3RhdGUudmlzaXRlZFN0ZXBzLmFkZCh2KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zdGF0ZS5jdXJyZW50U3RlcCAhPT0gdGFyZ2V0U3RlcCkge1xyXG4gICAgICB0aGlzLm5hdmlnYXRlVG9TdGVwKHRhcmdldFN0ZXApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zeW5jV2l6YXJkU3RhdGUoKTtcclxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbigncmVzdW1lQ29tcGxldGUnLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZz8ud2l6YXJkSWQsXHJcbiAgICAgIGxhc3RDb21wbGV0ZWRTdGVwLFxyXG4gICAgICBjdXJyZW50U3RlcDogdGFyZ2V0U3RlcCxcclxuICAgICAgY29tcGxldGVkU3RlcHM6IEFycmF5LmZyb20oY29tcGxldGVkKSxcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB7IGxhc3RDb21wbGV0ZWRTdGVwLCBjdXJyZW50U3RlcDogdGFyZ2V0U3RlcCB9O1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIENhbGxiYWNrIGZvcm0gYnVpbGRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgb25WYWx1ZUNoYW5nZShkYXRhOiBVaUZvcm1EYXRhKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjY3VtdWxhdGVkRGF0YSA9IHsgLi4udGhpcy5hY2N1bXVsYXRlZERhdGEsIC4uLmRhdGEgfTtcclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ3ZhbHVlQ2hhbmdlJywge1xyXG4gICAgICB3aXphcmRJZDogdGhpcy53aXphcmRDb25maWcud2l6YXJkSWQsXHJcbiAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgIHNjaGVtYUlkOiB0aGlzLnNjaGVtYT8uaWQsXHJcbiAgICAgIGNoYW5nZWRLZXlzOiBPYmplY3Qua2V5cyhkYXRhKSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMuYWNjdW11bGF0ZWREYXRhKTtcclxuICB9XHJcblxyXG4gIG9uVmFsaWRhdGlvbkNoYW5nZShzdGF0ZTogVWlGb3JtVmFsaWRhdGlvblN0YXRlKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0YXRlLmlzVmFsaWQgPSBzdGF0ZS52YWxpZDtcclxuICAgIHRoaXMudmFsaWRhdGlvbkNoYW5nZS5lbWl0KHN0YXRlKTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBOYXZpZ2F6aW9uZSBpbnRlcm5hIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBwcml2YXRlIG5hdmlnYXRlVG9TdGVwKHRhcmdldFN0ZXA6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRhcmdldFN0ZXAgPCAwIHx8IHRhcmdldFN0ZXAgPj0gdGhpcy5zdGF0ZS50b3RhbFN0ZXBzKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgZnJvbSA9IHRoaXMuc3RhdGUuY3VycmVudFN0ZXA7XHJcbiAgICB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwID0gdGFyZ2V0U3RlcDtcclxuICAgIHRoaXMuc3RhdGUudmlzaXRlZFN0ZXBzLmFkZCh0YXJnZXRTdGVwKTtcclxuXHJcbiAgICAvLyBJbnZhbGlkYSBsYSBjYWNoZSBwZXIgZm9yemFyZSBsYSBjcmVhemlvbmUgZGkgdW4gbnVvdm8gc2NoZW1hXHJcbiAgICB0aGlzLl9jYWNoZWRTdGVwU2NoZW1hID0gbnVsbDtcclxuICAgIHRoaXMuX2NhY2hlZFN0ZXBJbmRleCA9IC0xO1xyXG5cclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ3N0ZXBDaGFuZ2UnLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgZnJvbSxcclxuICAgICAgdG86IHRhcmdldFN0ZXAsXHJcbiAgICAgIGRpcmVjdGlvbjogdGFyZ2V0U3RlcCA+IGZyb20gPyAnbmV4dCcgOiAncHJldmlvdXMnLFxyXG4gICAgICBzY2hlbWFJZDogdGhpcy5zY2hlbWE/LmlkLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zdGVwQ2hhbmdlLmVtaXQoe1xyXG4gICAgICBmcm9tLFxyXG4gICAgICB0bzogdGFyZ2V0U3RlcCxcclxuICAgICAgZGlyZWN0aW9uOiB0YXJnZXRTdGVwID4gZnJvbSA/ICduZXh0JyA6ICdwcmV2aW91cycsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnN5bmNXaXphcmRTdGF0ZSgpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlQ3VycmVudFN0ZXAob3B0aW9ucz86IHtcclxuICAgIGVtaXRTdGVwQ29tcGxldGU/OiBib29sZWFuO1xyXG4gICAgZW1pdFN0ZXBWYWxpZGF0aW9uRmFpbGVkPzogYm9vbGVhbjtcclxuICB9KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBlbWl0U3RlcENvbXBsZXRlID0gb3B0aW9ucz8uZW1pdFN0ZXBDb21wbGV0ZSA/PyB0cnVlO1xyXG4gICAgY29uc3QgZW1pdFN0ZXBWYWxpZGF0aW9uRmFpbGVkID0gb3B0aW9ucz8uZW1pdFN0ZXBWYWxpZGF0aW9uRmFpbGVkID8/IHRydWU7XHJcblxyXG4gICAgdGhpcy5mb3JtQnVpbGRlcj8udmFsaWRhdGVBbGxGaWVsZHMoKTtcclxuICAgIGNvbnN0IGdyb3VwID0gdGhpcy53aXphcmRTdGVwR3JvdXBzW3RoaXMuc3RhdGUuY3VycmVudFN0ZXBdO1xyXG4gICAgY29uc3QgcHJpbWFyeSA9IGdyb3VwPy5bMF07XHJcbiAgICBjb25zdCB2YWxpZGF0ZUN1c3RvbUNvbXBvbmVudHMgPVxyXG4gICAgICBwcmltYXJ5Py53aXphcmRTdGVwPy52YWxpZGF0aW9uPy52YWxpZGF0ZUN1c3RvbUNvbXBvbmVudHMgIT09IGZhbHNlO1xyXG4gICAgY29uc3QgY3VzdG9tRmllbGRLZXlzID0gbmV3IFNldCh0aGlzLmdldEN1c3RvbUZpZWxkS2V5c0Zvckdyb3VwKGdyb3VwKSk7XHJcblxyXG4gICAgY29uc3QgaXNGb3JtVmFsaWQgPSB2YWxpZGF0ZUN1c3RvbUNvbXBvbmVudHNcclxuICAgICAgPyAodGhpcy5mb3JtQnVpbGRlcj8uaXNGb3JtVmFsaWQoKSA/PyB0cnVlKVxyXG4gICAgICA6ICh0aGlzLmZvcm1CdWlsZGVyPy5pc0Zvcm1WYWxpZEV4Y2x1ZGluZ0ZpZWxkS2V5cyhjdXN0b21GaWVsZEtleXMpID8/XHJcbiAgICAgICAgdHJ1ZSk7XHJcblxyXG4gICAgY29uc3QgY3VzdG9tRm5OYW1lID0gcHJpbWFyeT8ud2l6YXJkU3RlcD8uY3VzdG9tVmFsaWRhdGlvbkZuO1xyXG5cclxuICAgIGlmIChjdXN0b21Gbk5hbWUgJiYgdGhpcy5jdXN0b21WYWxpZGF0aW9uTWV0aG9kc1tjdXN0b21Gbk5hbWVdKSB7XHJcbiAgICAgIGNvbnN0IGN1c3RvbVZhbGlkID0gYXdhaXQgdGhpcy5jdXN0b21WYWxpZGF0aW9uTWV0aG9kc1tjdXN0b21Gbk5hbWVdKFxyXG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWREYXRhLFxyXG4gICAgICAgIHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgICAgaXNGb3JtVmFsaWQsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoIWN1c3RvbVZhbGlkKSB7XHJcbiAgICAgICAgaWYgKGVtaXRTdGVwVmFsaWRhdGlvbkZhaWxlZCkge1xyXG4gICAgICAgICAgdGhpcy5zdGVwVmFsaWRhdGlvbkZhaWxlZC5lbWl0KHtcclxuICAgICAgICAgICAgc3RlcDogdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgICAgICAgZXJyb3JzOiBbJ1ZhbGlkYXppb25lIGN1c3RvbSBmYWxsaXRhJ10sXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFpc0Zvcm1WYWxpZCAmJiBwcmltYXJ5Py53aXphcmRTdGVwPy52YWxpZGF0aW9uPy5yZXF1aXJlZCAhPT0gZmFsc2UpIHtcclxuICAgICAgbGV0IGRldGFpbHMgPSB0aGlzLmZvcm1CdWlsZGVyPy5nZXREZXRhaWxlZEZvcm1FcnJvcnMoKSB8fCBbXTtcclxuICAgICAgaWYgKCF2YWxpZGF0ZUN1c3RvbUNvbXBvbmVudHMgJiYgZ3JvdXA/Lmxlbmd0aCkge1xyXG4gICAgICAgIGRldGFpbHMgPSB0aGlzLmZpbHRlckVycm9yRGV0YWlsc0V4Y2x1ZGluZ0N1c3RvbUZpZWxkcyhcclxuICAgICAgICAgIGRldGFpbHMsXHJcbiAgICAgICAgICBncm91cCxcclxuICAgICAgICAgIGN1c3RvbUZpZWxkS2V5cyxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGVycm9ycyA9IGRldGFpbHMuZmxhdE1hcCgoZSkgPT4gZS5lcnJvcnMpO1xyXG4gICAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdzdGVwVmFsaWRhdGlvbkZhaWxlZCcsIHtcclxuICAgICAgICB3aXphcmRJZDogdGhpcy53aXphcmRDb25maWcud2l6YXJkSWQsXHJcbiAgICAgICAgc3RlcDogdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgICBlcnJvcnMsXHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoZW1pdFN0ZXBWYWxpZGF0aW9uRmFpbGVkKSB7XHJcbiAgICAgICAgdGhpcy5zdGVwVmFsaWRhdGlvbkZhaWxlZC5lbWl0KHtcclxuICAgICAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgICAgICBlcnJvcnMsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlbWl0U3RlcENvbXBsZXRlKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ3N0ZXBDb21wbGV0ZScsIHtcclxuICAgICAgICB3aXphcmRJZDogdGhpcy53aXphcmRDb25maWcud2l6YXJkSWQsXHJcbiAgICAgICAgc3RlcDogdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgICBzY2hlbWFJZDogdGhpcy5zY2hlbWE/LmlkLFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5zdGVwQ29tcGxldGUuZW1pdCh7XHJcbiAgICAgICAgc3RlcDogdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgICBkYXRhOiB0aGlzLmZvcm1CdWlsZGVyPy5nZXRGb3JtVmFsdWUoKSB8fCB7fSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKiogTmF2aWdhIGFsbG8gc3RlcCBlIGF0dGVuZGUgaWwgbW91bnQgZGVsIGZvcm0gYnVpbGRlciBwZXIgbGEgdmFsaWRhemlvbmUgcmVzdW1lLiAqL1xyXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZVN0ZXBGb3JWYWxpZGF0aW9uKHN0ZXBJbmRleDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0aGlzLm5hdmlnYXRlVG9TdGVwKHN0ZXBJbmRleCk7XHJcbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yRm9ybUJ1aWxkZXJSZWFkeSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yRm9ybUJ1aWxkZXJSZWFkeShtYXhBdHRlbXB0cyA9IDMwKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IG1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICBpZiAodGhpcy5mb3JtQnVpbGRlcikge1xyXG4gICAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDApKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJhZ2dydXBwYSBsZSBzZXppb25pIGNvbiBgd2l6YXJkU3RlcGAgcGVyIGBzdGVwTnVtYmVyYCAob3JkaW5lIHN0YWJpbGUgcGVyIG51bWVybywgcG9pIG9yZGluZSBkaSBhcHBhcml6aW9uZSBuZWxsbyBzY2hlbWEpLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYnVpbGRXaXphcmRTdGVwR3JvdXBzKHNlY3Rpb25zOiBVaUZvcm1TZWN0aW9uW10pOiBVaUZvcm1TZWN0aW9uW11bXSB7XHJcbiAgICBjb25zdCB3aXRoV2l6YXJkID0gc2VjdGlvbnMuZmlsdGVyKChzKSA9PiBzLndpemFyZFN0ZXApO1xyXG4gICAgd2l0aFdpemFyZC5zb3J0KFxyXG4gICAgICAoYSwgYikgPT5cclxuICAgICAgICAoYS53aXphcmRTdGVwIS5zdGVwTnVtYmVyIHx8IDApIC0gKGIud2l6YXJkU3RlcCEuc3RlcE51bWJlciB8fCAwKSxcclxuICAgICk7XHJcbiAgICBjb25zdCBncm91cHM6IFVpRm9ybVNlY3Rpb25bXVtdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IHMgb2Ygd2l0aFdpemFyZCkge1xyXG4gICAgICBjb25zdCBudW0gPSBzLndpemFyZFN0ZXAhLnN0ZXBOdW1iZXI7XHJcbiAgICAgIGNvbnN0IHByZXYgPSBncm91cHNbZ3JvdXBzLmxlbmd0aCAtIDFdO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgcHJldj8ubGVuZ3RoICYmXHJcbiAgICAgICAgKHByZXZbMF0ud2l6YXJkU3RlcCEuc3RlcE51bWJlciB8fCAwKSA9PT0gKG51bSB8fCAwKVxyXG4gICAgICApIHtcclxuICAgICAgICBwcmV2LnB1c2gocyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZ3JvdXBzLnB1c2goW3NdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwcztcclxuICB9XHJcblxyXG4gIC8qKiBDaGlhdmkgZGVpIGNhbXBpIGBjdXN0b21gIGluIHR1dHRlIGxlIHNlemlvbmkgZGVsIHBhc3NvIGNvcnJlbnRlLiAqL1xyXG4gIHByaXZhdGUgZ2V0Q3VzdG9tRmllbGRLZXlzRm9yR3JvdXAoXHJcbiAgICBncm91cDogVWlGb3JtU2VjdGlvbltdIHwgdW5kZWZpbmVkLFxyXG4gICk6IHN0cmluZ1tdIHtcclxuICAgIGlmICghZ3JvdXA/Lmxlbmd0aCkgcmV0dXJuIFtdO1xyXG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcclxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBncm91cCkge1xyXG4gICAgICBmb3IgKGNvbnN0IGYgb2Ygc2VjdGlvbi5maWVsZHMgfHwgW10pIHtcclxuICAgICAgICBpZiAoZi50eXBlID09PSAnY3VzdG9tJykga2V5cy5wdXNoKGYua2V5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGtleXM7XHJcbiAgfVxyXG5cclxuICAvKiogUmltdW92ZSBkYWdsaSBlcnJvcmkgaSBjYW1waSBjdXN0b20gcXVhbmRvIGB2YWxpZGF0ZUN1c3RvbUNvbXBvbmVudHNgIMOoIGZhbHNlLiAqL1xyXG4gIHByaXZhdGUgZmlsdGVyRXJyb3JEZXRhaWxzRXhjbHVkaW5nQ3VzdG9tRmllbGRzKFxyXG4gICAgZGV0YWlsczogVWlGb3JtRXJyb3JEZXRhaWxbXSxcclxuICAgIGdyb3VwOiBVaUZvcm1TZWN0aW9uW10sXHJcbiAgICBjdXN0b21LZXlzOiBTZXQ8c3RyaW5nPixcclxuICApOiBVaUZvcm1FcnJvckRldGFpbFtdIHtcclxuICAgIGNvbnN0IHNlY3Rpb25JZHMgPSBncm91cC5tYXAoKHMpID0+IHMuaWQpO1xyXG4gICAgcmV0dXJuIGRldGFpbHMuZmlsdGVyKChkKSA9PiB7XHJcbiAgICAgIGNvbnN0IGxvZ2ljYWxLZXkgPSB0aGlzLmxvZ2ljYWxGaWVsZEtleUZyb21EZXRhaWxLZXlGb3JHcm91cChcclxuICAgICAgICBkLmZpZWxkS2V5LFxyXG4gICAgICAgIHNlY3Rpb25JZHMsXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiAhY3VzdG9tS2V5cy5oYXMobG9naWNhbEtleSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpc29sdmUgbGEgY2hpYXZlIGxvZ2ljYSBkZWwgY2FtcG8gcmlzcGV0dG8gYSB0dXR0ZSBsZSBzZXppb25pIGRlbCBncnVwcG8gKGNhbXBpIGZsYXQgbyByZXBlYXRhYmxlKS5cclxuICAgKi9cclxuICBwcml2YXRlIGxvZ2ljYWxGaWVsZEtleUZyb21EZXRhaWxLZXlGb3JHcm91cChcclxuICAgIGZpZWxkS2V5OiBzdHJpbmcsXHJcbiAgICBzZWN0aW9uSWRzOiBzdHJpbmdbXSxcclxuICApOiBzdHJpbmcge1xyXG4gICAgZm9yIChjb25zdCBpZCBvZiBzZWN0aW9uSWRzKSB7XHJcbiAgICAgIGNvbnN0IGsgPSB0aGlzLmxvZ2ljYWxGaWVsZEtleUZyb21EZXRhaWxLZXkoZmllbGRLZXksIGlkKTtcclxuICAgICAgaWYgKGsgIT09IGZpZWxkS2V5KSByZXR1cm4gaztcclxuICAgIH1cclxuICAgIHJldHVybiBmaWVsZEtleTtcclxuICB9XHJcblxyXG4gIC8qKiBFc3RyYWUgbGEgY2hpYXZlIGNhbXBvIGRhIGBmaWVsZEtleWAgZmxhdCBvIGBzZWN0aW9uSWRbaV0uZmllbGRLZXlgLiAqL1xyXG4gIHByaXZhdGUgbG9naWNhbEZpZWxkS2V5RnJvbURldGFpbEtleShcclxuICAgIGZpZWxkS2V5OiBzdHJpbmcsXHJcbiAgICBzZWN0aW9uSWQ6IHN0cmluZyxcclxuICApOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGBeJHt0aGlzLmVzY2FwZVJlZ0V4cChzZWN0aW9uSWQpfVxcXFxbXFxcXGQrXFxcXF1cXFxcLiguKykkYCk7XHJcbiAgICBjb25zdCBtID0gZmllbGRLZXkubWF0Y2gocmUpO1xyXG4gICAgcmV0dXJuIG0gPyBtWzFdIDogZmllbGRLZXk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVzY2FwZVJlZ0V4cChzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgYXV0b1NhdmVJZk5lZWRlZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLndpemFyZENvbmZpZy5hdXRvU2F2ZSAmJiB0aGlzLndpemFyZENvbmZpZy5vblN0ZXBTYXZlKSB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZvcm1CdWlsZGVyPy5nZXRGb3JtVmFsdWUoKSB8fCB7fTtcclxuICAgICAgYXdhaXQgdGhpcy53aXphcmRDb25maWcub25TdGVwU2F2ZShkYXRhLCB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3luY1dpemFyZFN0YXRlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHN5bmNEYXRhOiBVaVdpemFyZFN5bmNEYXRhID0ge1xyXG4gICAgICB3aXphcmRJZDogdGhpcy53aXphcmRDb25maWcud2l6YXJkSWQsXHJcbiAgICAgIHdpemFyZFN0YXRlOiB7IC4uLnRoaXMuc3RhdGUgfSxcclxuICAgICAgd2l6YXJkU3RlcHM6IHRoaXMud2l6YXJkU3RlcEdyb3Vwcy5tYXAoKGcpID0+ICh7XHJcbiAgICAgICAgdGl0bGU6IGdbMF0/LndpemFyZFN0ZXA/LnN0ZXBUaXRsZSB8fCBnWzBdPy50aXRsZSxcclxuICAgICAgICBkZXNjcmlwdGlvbjogZ1swXT8ud2l6YXJkU3RlcD8uc3RlcERlc2NyaXB0aW9uIHx8IGdbMF0/LmRlc2NyaXB0aW9uLFxyXG4gICAgICB9KSksXHJcbiAgICAgIGlzV2l6YXJkTW9kZTogdHJ1ZSxcclxuICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy53aXphcmRTeW5jLnJlZ2lzdGVyV2l6YXJkKHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLCBzeW5jRGF0YSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==