@wavemaker/app-ng-runtime 11.11.6-rc.6191 → 11.11.7-rc.6211

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.
Files changed (48) hide show
  1. package/build-task/bundles/index.umd.js +1 -1
  2. package/build-task/esm2022/input/default/checkbox/checkbox.build.mjs +2 -2
  3. package/build-task/fesm2022/index.mjs +1 -1
  4. package/build-task/fesm2022/index.mjs.map +1 -1
  5. package/components/base/bundles/index.umd.js +21 -3
  6. package/components/base/components.module.d.ts +1 -1
  7. package/components/base/esm2022/components.module.mjs +8 -5
  8. package/components/base/esm2022/pipes/custom-pipes.mjs +16 -2
  9. package/components/base/esm2022/public_api.mjs +2 -2
  10. package/components/base/fesm2022/index.mjs +24 -7
  11. package/components/base/fesm2022/index.mjs.map +1 -1
  12. package/components/base/pipes/custom-pipes.d.ts +5 -0
  13. package/components/base/public_api.d.ts +1 -1
  14. package/components/basic/default/bundles/index.umd.js +8 -1
  15. package/components/basic/default/esm2022/label/label.directive.mjs +9 -2
  16. package/components/basic/default/fesm2022/index.mjs +8 -1
  17. package/components/basic/default/fesm2022/index.mjs.map +1 -1
  18. package/components/basic/search/bundles/index.umd.js +19 -4
  19. package/components/basic/search/esm2022/search.component.mjs +20 -5
  20. package/components/basic/search/fesm2022/index.mjs +19 -4
  21. package/components/basic/search/fesm2022/index.mjs.map +1 -1
  22. package/components/basic/search/search.component.d.ts +1 -0
  23. package/components/containers/wizard/bundles/index.umd.js +135 -5
  24. package/components/containers/wizard/esm2022/wizard.component.mjs +137 -7
  25. package/components/containers/wizard/fesm2022/index.mjs +136 -6
  26. package/components/containers/wizard/fesm2022/index.mjs.map +1 -1
  27. package/components/containers/wizard/wizard.component.d.ts +7 -0
  28. package/components/input/chips/bundles/index.umd.js +5 -2
  29. package/components/input/chips/esm2022/chips.component.mjs +6 -3
  30. package/components/input/chips/fesm2022/index.mjs +5 -2
  31. package/components/input/chips/fesm2022/index.mjs.map +1 -1
  32. package/components/input/default/bundles/index.umd.js +14 -2
  33. package/components/input/default/esm2022/base-form.component.mjs +15 -3
  34. package/components/input/default/fesm2022/index.mjs +14 -2
  35. package/components/input/default/fesm2022/index.mjs.map +1 -1
  36. package/components/input/epoch/bundles/index.umd.js +15 -4
  37. package/components/input/epoch/esm2022/base-date-time.component.mjs +16 -5
  38. package/components/input/epoch/fesm2022/index.mjs +15 -4
  39. package/components/input/epoch/fesm2022/index.mjs.map +1 -1
  40. package/npm-shrinkwrap.json +2 -2
  41. package/package-lock.json +2 -2
  42. package/package.json +1 -1
  43. package/runtime/base/bundles/index.umd.js +8 -4
  44. package/runtime/base/esm2022/services/app.manager.service.mjs +8 -5
  45. package/runtime/base/esm2022/services/pipe-provider.service.mjs +4 -3
  46. package/runtime/base/fesm2022/index.mjs +10 -6
  47. package/runtime/base/fesm2022/index.mjs.map +1 -1
  48. package/scripts/datatable/datatable.js +7 -3
@@ -5,7 +5,7 @@ import { DynamicComponentRefProvider, noop } from '@wm/core';
5
5
  import { APPLY_STYLES_TYPE, provideAsWidgetRef, styler, StylableComponent, Context, createArrayFrom } from '@wm/components/base';
6
6
  import { registerProps } from './wizard.props';
7
7
  import { WizardStepComponent } from "./wizard-step/wizard-step.component";
8
- import { find, forEach, get, indexOf, isArray, isNumber, isString } from "lodash-es";
8
+ import { find, findIndex, forEach, get, indexOf, isArray, isNumber, isString } from "lodash-es";
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "@wm/core";
11
11
  import * as i2 from "@angular/common";
@@ -74,6 +74,7 @@ function WizardComponent_For_3_Template(rf, ctx) { if (rf & 1) {
74
74
  i0.ɵɵelementStart(0, "li", 3);
75
75
  i0.ɵɵlistener("click", function WizardComponent_For_3_Template_li_click_0_listener($event) { const step_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onWizardHeaderClick($event, step_r2)); });
76
76
  i0.ɵɵelementStart(1, "a", 4);
77
+ i0.ɵɵlistener("keydown", function WizardComponent_For_3_Template_a_keydown_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onkeydown($event)); });
77
78
  i0.ɵɵtemplate(2, WizardComponent_For_3_Conditional_2_Template, 1, 0, "span", 5);
78
79
  i0.ɵɵelementStart(3, "span", 6);
79
80
  i0.ɵɵtemplate(4, WizardComponent_For_3_Conditional_4_Template, 2, 1, "span", 7)(5, WizardComponent_For_3_Conditional_5_Template, 1, 0, "i", 8)(6, WizardComponent_For_3_Conditional_6_Template, 1, 0, "i", 9)(7, WizardComponent_For_3_Conditional_7_Template, 1, 3, "i", 10)(8, WizardComponent_For_3_Conditional_8_Template, 1, 3, "i", 10);
@@ -88,9 +89,10 @@ function WizardComponent_For_3_Template(rf, ctx) { if (rf & 1) {
88
89
  const step_r2 = ctx.$implicit;
89
90
  const ɵ$index_5_r4 = ctx.$index;
90
91
  const ctx_r2 = i0.ɵɵnextContext();
91
- i0.ɵɵproperty("hidden", !step_r2.show)("ngClass", i0.ɵɵpureFunction3(17, _c4, step_r2.done, step_r2.active, step_r2.disabled));
92
+ i0.ɵɵproperty("hidden", !step_r2.show)("ngClass", i0.ɵɵpureFunction3(18, _c4, step_r2.done, step_r2.active, step_r2.disabled));
93
+ i0.ɵɵattribute("data-stepid", step_r2.widgetId);
92
94
  i0.ɵɵadvance();
93
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(21, _c5, ctx_r2.class && ctx_r2.class.includes("classic") && !step_r2.subtitle))("tabindex", step_r2.active ? "0" : "-1");
95
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(22, _c5, ctx_r2.class && ctx_r2.class.includes("classic") && !step_r2.subtitle))("tabindex", step_r2.active ? "0" : "-1");
94
96
  i0.ɵɵattribute("aria-current", step_r2.active ? "step" : null)("aria-disabled", step_r2.disabled)("aria-label", step_r2.subtitle ? "step " + (ɵ$index_5_r4 + 1) + " " + step_r2.title + " " + step_r2.subtitle : "step " + (ɵ$index_5_r4 + 1) + " " + step_r2.title)("title", step_r2.title);
95
97
  i0.ɵɵadvance();
96
98
  i0.ɵɵconditional(ctx_r2.class && ctx_r2.class.includes("classic") ? 2 : -1);
@@ -455,6 +457,23 @@ export class WizardComponent extends StylableComponent {
455
457
  currentStep.done = true;
456
458
  nextStep.active = true;
457
459
  this.currentStep = nextStep;
460
+ // Remove 'current' class from all wizard steps in header
461
+ const allStepItems = this.nativeElement.querySelectorAll('li[data-stepid]');
462
+ allStepItems.forEach((el) => {
463
+ el.classList.remove('current');
464
+ const anchor = el.querySelector('a');
465
+ if (anchor) {
466
+ anchor.setAttribute('tabindex', '-1');
467
+ }
468
+ });
469
+ // Add 'current' to next step header item
470
+ const newStepLi = this.nativeElement.querySelector(`li[data-stepid="${nextStep.widgetId}"]`);
471
+ const newStepAnchor = newStepLi?.querySelector('a');
472
+ if (newStepLi && newStepAnchor) {
473
+ newStepLi.classList.add('current');
474
+ newStepAnchor.setAttribute('tabindex', '0');
475
+ newStepAnchor.focus();
476
+ }
458
477
  this.updateStepFocus();
459
478
  }
460
479
  this.addMoreText();
@@ -488,6 +507,23 @@ export class WizardComponent extends StylableComponent {
488
507
  currentStep.disabled = true;
489
508
  prevStep.active = true;
490
509
  this.currentStep = prevStep;
510
+ // Remove 'current' class from all steps
511
+ const allStepItems = this.nativeElement.querySelectorAll('li[data-stepid]');
512
+ allStepItems.forEach((el) => {
513
+ el.classList.remove('current');
514
+ const anchor = el.querySelector('a');
515
+ if (anchor) {
516
+ anchor.setAttribute('tabindex', '-1');
517
+ }
518
+ });
519
+ // Apply 'current' to prev step
520
+ const prevStepLi = this.nativeElement.querySelector(`li[data-stepid="${prevStep.widgetId}"]`);
521
+ const prevStepAnchor = prevStepLi?.querySelector('a');
522
+ if (prevStepLi && prevStepAnchor) {
523
+ prevStepLi.classList.add('current');
524
+ prevStepAnchor.setAttribute('tabindex', '0');
525
+ prevStepAnchor.focus();
526
+ }
491
527
  this.updateStepFocus();
492
528
  }
493
529
  this.addMoreText();
@@ -626,6 +662,37 @@ export class WizardComponent extends StylableComponent {
626
662
  }
627
663
  });
628
664
  }
665
+ isSelectableStep(stepRef) {
666
+ return stepRef.show && !stepRef.disabled;
667
+ }
668
+ getSelectableStepBeforeIndex(index) {
669
+ for (let i = index - 1; i >= 0; i--) {
670
+ const step = this.getStepRefByIndex(i);
671
+ if (this.isSelectableStep(step)) {
672
+ return step;
673
+ }
674
+ }
675
+ if (index === 0) {
676
+ const step = this.getStepRefByIndex(this.steps.length - 1);
677
+ if (this.isSelectableStep(step)) {
678
+ return step;
679
+ }
680
+ }
681
+ }
682
+ getSelectableStepAfterIndex(index) {
683
+ for (let i = index + 1; i < this.steps.length; i++) {
684
+ const step = this.getStepRefByIndex(i);
685
+ if (this.isSelectableStep(step)) {
686
+ return step;
687
+ }
688
+ }
689
+ if (index === this.steps.length - 1) {
690
+ const step = this.getStepRefByIndex(0);
691
+ if (this.isSelectableStep(step)) {
692
+ return step;
693
+ }
694
+ }
695
+ }
629
696
  ngAfterViewInit() {
630
697
  super.ngAfterViewInit();
631
698
  styler(this.nativeElement.querySelector('.panel-body'), this, APPLY_STYLES_TYPE.INNER_SHELL);
@@ -639,6 +706,69 @@ export class WizardComponent extends StylableComponent {
639
706
  this.nativeElement.querySelectorAll('div.app-wizard-actions').forEach(el => el?.classList.add(this.actionsalignment));
640
707
  this.nativeElement.querySelectorAll('div.app-wizard-actions-right').forEach(el => el?.classList.remove('app-container'));
641
708
  }
709
+ getActiveStepIndex() {
710
+ return findIndex(this.steps.toArray(), { isCurrent: true });
711
+ }
712
+ onkeydown(event) {
713
+ let newStep;
714
+ switch (event.key) {
715
+ case 'ArrowLeft':
716
+ case 'ArrowUp':
717
+ event.preventDefault();
718
+ newStep = this.autoActivation ? null : this.getSelectableStepBeforeIndex(this.getSelectedStepIndex());
719
+ break;
720
+ case 'ArrowRight':
721
+ case 'ArrowDown':
722
+ event.preventDefault();
723
+ newStep = this.autoActivation ? null : this.getSelectableStepAfterIndex(this.getSelectedStepIndex());
724
+ break;
725
+ case 'Enter':
726
+ case ' ':
727
+ case 'Spacebar':
728
+ event.preventDefault();
729
+ setTimeout(() => {
730
+ const activeElement = this.nativeElement.querySelector('li.current');
731
+ const stepLi = activeElement.closest('li[data-stepid]');
732
+ const isInWizardHeader = activeElement.closest('.app-wizard-heading');
733
+ if (stepLi && isInWizardHeader) {
734
+ const stepId = stepLi.getAttribute('data-stepid');
735
+ const stepIndex = this.steps.toArray().findIndex(step => step.widgetId === stepId);
736
+ const currentStep = this.steps.toArray()[stepIndex];
737
+ if (currentStep && currentStep !== this.currentStep) {
738
+ this.onWizardHeaderClick(event, currentStep);
739
+ // Update tabindex for accessibility
740
+ const allStepItems = this.nativeElement.querySelectorAll('li[data-stepid]');
741
+ allStepItems.forEach((el) => {
742
+ el.setAttribute('tabindex', '-1');
743
+ });
744
+ const stepAnchor = stepLi.querySelector('a');
745
+ if (stepAnchor) {
746
+ stepAnchor.setAttribute('tabindex', '0');
747
+ stepAnchor.focus();
748
+ }
749
+ }
750
+ }
751
+ }, 0);
752
+ break;
753
+ default:
754
+ return;
755
+ }
756
+ if (newStep) {
757
+ this.nativeElement.querySelector('li.current')?.classList.remove('current');
758
+ this.nativeElement.querySelector(`li[data-stepid="${newStep.widgetId}"]`)?.classList.add('current');
759
+ const stepLi = this.nativeElement.querySelector(".app-wizard-heading li.current a");
760
+ const allStepItems = this.nativeElement.querySelectorAll('li[data-stepid] a');
761
+ allStepItems.forEach((el) => {
762
+ el.setAttribute('tabindex', '-1');
763
+ });
764
+ (stepLi).setAttribute('tabindex', '0');
765
+ stepLi?.focus();
766
+ }
767
+ }
768
+ getSelectedStepIndex() {
769
+ const index = this.steps.toArray().findIndex(step => this.nativeElement.querySelector(`li[data-stepid="${step.widgetId}"]`)?.classList.contains("current"));
770
+ return index >= 0 ? index : this.getActiveStepIndex();
771
+ }
642
772
  static { this.ɵfac = function WizardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || WizardComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.DynamicComponentRefProvider), i0.ɵɵdirectiveInject(Context, 2), i0.ɵɵdirectiveInject('EXPLICIT_CONTEXT', 8)); }; }
643
773
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: WizardComponent, selectors: [["div", "wmWizard", ""]], contentQueries: function WizardComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
644
774
  i0.ɵɵcontentQuery(dirIndex, _c0, 4, TemplateRef);
@@ -650,10 +780,10 @@ export class WizardComponent extends StylableComponent {
650
780
  } }, exportAs: ["wmWizard"], standalone: true, features: [i0.ɵɵProvidersFeature([
651
781
  provideAsWidgetRef(WizardComponent),
652
782
  { provide: Context, useFactory: () => { return {}; }, multi: true }
653
- ]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], attrs: _c1, ngContentSelectors: _c3, decls: 7, vars: 6, consts: [[1, "app-wizard-heading"], [1, "app-wizard-step", 3, "hidden", "ngClass"], [1, "app-wizard-body", "panel-body"], [1, "app-wizard-step", 3, "click", "hidden", "ngClass"], ["href", "javascript:void(0)", 3, "ngClass", "tabindex"], [1, "arrow"], [1, "wizard-step-number"], [1, "count"], [1, "dottedstepper"], [1, "app-icon", "wi", "wi-done"], [3, "class"], [1, "title-wrapper"], [1, "step-title", 3, "textContent"], [1, "subtitle-wrapper"], [1, "read_more", 2, "display", "none", 3, "click"], ["wmMessage", "", "caption.bind", "message.caption", "type.bind", "message.type"], [4, "ngTemplateOutlet"]], template: function WizardComponent_Template(rf, ctx) { if (rf & 1) {
783
+ ]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], attrs: _c1, ngContentSelectors: _c3, decls: 7, vars: 6, consts: [[1, "app-wizard-heading"], [1, "app-wizard-step", 3, "hidden", "ngClass"], [1, "app-wizard-body", "panel-body"], [1, "app-wizard-step", 3, "click", "hidden", "ngClass"], ["href", "javascript:void(0)", 3, "keydown", "ngClass", "tabindex"], [1, "arrow"], [1, "wizard-step-number"], [1, "count"], [1, "dottedstepper"], [1, "app-icon", "wi", "wi-done"], [3, "class"], [1, "title-wrapper"], [1, "step-title", 3, "textContent"], [1, "subtitle-wrapper"], [1, "read_more", 2, "display", "none", 3, "click"], ["wmMessage", "", "caption.bind", "message.caption", "type.bind", "message.type"], [4, "ngTemplateOutlet"]], template: function WizardComponent_Template(rf, ctx) { if (rf & 1) {
654
784
  i0.ɵɵprojectionDef(_c2);
655
785
  i0.ɵɵelementStart(0, "div", 0)(1, "ul");
656
- i0.ɵɵrepeaterCreate(2, WizardComponent_For_3_Template, 13, 23, "li", 1, i0.ɵɵrepeaterTrackByIdentity);
786
+ i0.ɵɵrepeaterCreate(2, WizardComponent_For_3_Template, 13, 24, "li", 1, i0.ɵɵrepeaterTrackByIdentity);
657
787
  i0.ɵɵelementEnd()();
658
788
  i0.ɵɵtemplate(4, WizardComponent_Conditional_4_Template, 3, 1, "div", 2)(5, WizardComponent_Conditional_5_Template, 3, 1, "div", 2)(6, WizardComponent_Conditional_6_Template, 1, 1, "ng-container");
659
789
  } if (rf & 2) {
@@ -674,7 +804,7 @@ export class WizardComponent extends StylableComponent {
674
804
  args: [{ standalone: true, imports: [CommonModule, WmComponentsModule], selector: 'div[wmWizard]', providers: [
675
805
  provideAsWidgetRef(WizardComponent),
676
806
  { provide: Context, useFactory: () => { return {}; }, multi: true }
677
- ], exportAs: 'wmWizard', template: "<div class=\"app-wizard-heading\">\n <ul class=\"app-wizard-steps nav nav-pills {{stepClass}}\">\n @for (step of steps; track step; let i = $index) {\n <li class=\"app-wizard-step\" [hidden]=\"!step.show\"\n [ngClass]=\"{active: step.done, current: step.active, disabled: step.disabled}\"\n (click)=\"onWizardHeaderClick($event, step)\">\n <a href=\"javascript:void(0)\" [attr.aria-current]=\"step.active ? 'step' : null\"\n [attr.aria-disabled]=\"step.disabled\" [attr.aria-label]='step.subtitle ? \"step \" + (i + 1) + \" \" + step.title + \" \" + step.subtitle : \"step \" + (i + 1) + \" \" + step.title' [attr.title]= \"step.title\"\n [ngClass]=\"{'title-center-align':class && class.includes('classic') && !step.subtitle}\" [tabindex]=\"step.active ? '0' : '-1'\">\n @if (class && class.includes('classic')) {\n <span class=\"arrow\"></span>\n }\n <span class=\"wizard-step-number\">\n @if (class && class.includes('number') && !step.isDone) {\n <span class=\"count\">{{i+1}}</span>\n }\n @if (class && (class.includes('dottedstepper') || class.includes('text-inline') && !class.includes('iconstepper')) && !step.isDone) {\n <i class=\"dottedstepper\"></i>\n }\n @if (class && (class.includes('dottedstepper') || class.includes('number')) && step.isDone) {\n <i class=\"app-icon wi wi-done\"></i>\n }\n @if ((class && class.includes('iconstepper')) && ((step.iconclass && !step.isDone) || (step.iconclass && step.isDone && step.doneiconclass ===''))) {\n <i class=\"app-icon {{step.iconclass}}\"></i>\n }\n @if (step.doneiconclass && step.isDone && (class && class.includes('iconstepper'))) {\n <i class=\"app-icon {{step.doneiconclass}}\"></i>\n }\n </span>\n <span class=\"title-wrapper\">\n @if (class && class.includes('text-inline')) {\n <span>{{'0' + (i+1)}}</span>\n }\n <span class=\"step-title\" [textContent]=\"step.title\"></span>\n </span>\n @if (step.subtitle) {\n <span class=\"subtitle-wrapper\" [attr.title]=\"step.subtitle\">\n <span class=\"step-title\" [textContent]=\"step.subtitle\"></span>\n <a class=\"read_more\" (click)=\"readMoreSubtitle()\" style=\"display:none\">more</a>\n </span>\n }\n </a>\n </li>\n }\n </ul>\n</div>\n@if (type !== 'dynamic') {\n<div class=\"app-wizard-body panel-body\">\n @if (message.caption) {\n <p wmMessage caption.bind=\"message.caption\" type.bind=\"message.type\"></p>\n }\n <ng-content ngProjectAs=\"form[wmWizardStep]\"></ng-content>\n</div>\n}\n@if (type === 'dynamic') {\n<div class=\"app-wizard-body panel-body\">\n @if(!fieldDefs?.length) {\n <div>{{nodatamessage}}</div>\n }\n <ng-content select=\"div[wmRepeatTemplate]\"></ng-content>\n</div>\n}\n@if(fieldDefs && fieldDefs.length || type !== 'dynamic') {\n <ng-container *ngTemplateOutlet=\"wizardAction\"></ng-container>\n}\n" }]
807
+ ], exportAs: 'wmWizard', template: "<div class=\"app-wizard-heading\">\n <ul class=\"app-wizard-steps nav nav-pills {{stepClass}}\">\n @for (step of steps; track step; let i = $index) {\n <li class=\"app-wizard-step\" [hidden]=\"!step.show\"\n [ngClass]=\"{active: step.done, current: step.active, disabled: step.disabled}\"\n (click)=\"onWizardHeaderClick($event, step)\" [attr.data-stepid]=\"step.widgetId\">\n <a href=\"javascript:void(0)\" [attr.aria-current]=\"step.active ? 'step' : null\"\n [attr.aria-disabled]=\"step.disabled\" [attr.aria-label]='step.subtitle ? \"step \" + (i + 1) + \" \" + step.title + \" \" + step.subtitle : \"step \" + (i + 1) + \" \" + step.title' [attr.title]= \"step.title\"\n [ngClass]=\"{'title-center-align':class && class.includes('classic') && !step.subtitle}\" [tabindex]=\"step.active ? '0' : '-1'\" (keydown)=\"onkeydown($event)\">\n @if (class && class.includes('classic')) {\n <span class=\"arrow\"></span>\n }\n <span class=\"wizard-step-number\">\n @if (class && class.includes('number') && !step.isDone) {\n <span class=\"count\">{{i+1}}</span>\n }\n @if (class && (class.includes('dottedstepper') || class.includes('text-inline') && !class.includes('iconstepper')) && !step.isDone) {\n <i class=\"dottedstepper\"></i>\n }\n @if (class && (class.includes('dottedstepper') || class.includes('number')) && step.isDone) {\n <i class=\"app-icon wi wi-done\"></i>\n }\n @if ((class && class.includes('iconstepper')) && ((step.iconclass && !step.isDone) || (step.iconclass && step.isDone && step.doneiconclass ===''))) {\n <i class=\"app-icon {{step.iconclass}}\"></i>\n }\n @if (step.doneiconclass && step.isDone && (class && class.includes('iconstepper'))) {\n <i class=\"app-icon {{step.doneiconclass}}\"></i>\n }\n </span>\n <span class=\"title-wrapper\">\n @if (class && class.includes('text-inline')) {\n <span>{{'0' + (i+1)}}</span>\n }\n <span class=\"step-title\" [textContent]=\"step.title\"></span>\n </span>\n @if (step.subtitle) {\n <span class=\"subtitle-wrapper\" [attr.title]=\"step.subtitle\">\n <span class=\"step-title\" [textContent]=\"step.subtitle\"></span>\n <a class=\"read_more\" (click)=\"readMoreSubtitle()\" style=\"display:none\">more</a>\n </span>\n }\n </a>\n </li>\n }\n </ul>\n</div>\n@if (type !== 'dynamic') {\n<div class=\"app-wizard-body panel-body\">\n @if (message.caption) {\n <p wmMessage caption.bind=\"message.caption\" type.bind=\"message.type\"></p>\n }\n <ng-content ngProjectAs=\"form[wmWizardStep]\"></ng-content>\n</div>\n}\n@if (type === 'dynamic') {\n<div class=\"app-wizard-body panel-body\">\n @if(!fieldDefs?.length) {\n <div>{{nodatamessage}}</div>\n }\n <ng-content select=\"div[wmRepeatTemplate]\"></ng-content>\n</div>\n}\n@if(fieldDefs && fieldDefs.length || type !== 'dynamic') {\n <ng-container *ngTemplateOutlet=\"wizardAction\"></ng-container>\n}\n" }]
678
808
  }], () => [{ type: i0.Injector }, { type: i1.DynamicComponentRefProvider }, { type: Array, decorators: [{
679
809
  type: Self
680
810
  }, {
@@ -693,4 +823,4 @@ export class WizardComponent extends StylableComponent {
693
823
  args: ['wizardAction', { read: TemplateRef, descendants: false }]
694
824
  }] }); })();
695
825
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(WizardComponent, { className: "WizardComponent", filePath: "wizard.component.ts", lineNumber: 51 }); })();
696
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9jb250YWluZXJzL3dpemFyZC9zcmMvd2l6YXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9jb250YWluZXJzL3dpemFyZC9zcmMvd2l6YXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RCxPQUFPLEVBSUgsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsTUFBTSxFQUNOLFFBQVEsRUFFUixRQUFRLEVBQ1IsU0FBUyxFQUNULElBQUksRUFDSixXQUFXLEVBQ2QsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLDJCQUEyQixFQUFFLElBQUksRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMzRCxPQUFPLEVBQ0gsaUJBQWlCLEVBRWpCLGtCQUFrQixFQUNsQixNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLE9BQU8sRUFBRSxlQUFlLEVBQzNCLE1BQU0scUJBQXFCLENBQUM7QUFFN0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9DLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUMsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7OztJQ3JCdkUsMEJBQTJCOzs7SUFJekIsK0JBQW9CO0lBQUEsWUFBTztJQUFBLGlCQUFPOzs7SUFBZCxjQUFPO0lBQVAs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JztcbmltcG9ydCB7IFdtQ29tcG9uZW50c01vZHVsZSB9IGZyb20gXCJAd20vY29tcG9uZW50cy9iYXNlXCI7XG5pbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgUXVlcnlMaXN0LFxuICAgIFNlbGYsXG4gICAgVGVtcGxhdGVSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7RHluYW1pY0NvbXBvbmVudFJlZlByb3ZpZGVyLCBub29wfSBmcm9tICdAd20vY29yZSc7XG5pbXBvcnQge1xuICAgIEFQUExZX1NUWUxFU19UWVBFLFxuICAgIElXaWRnZXRDb25maWcsXG4gICAgcHJvdmlkZUFzV2lkZ2V0UmVmLFxuICAgIHN0eWxlcixcbiAgICBTdHlsYWJsZUNvbXBvbmVudCxcbiAgICBDb250ZXh0LCBjcmVhdGVBcnJheUZyb21cbn0gZnJvbSAnQHdtL2NvbXBvbmVudHMvYmFzZSc7XG5cbmltcG9ydCB7IHJlZ2lzdGVyUHJvcHMgfSBmcm9tICcuL3dpemFyZC5wcm9wcyc7XG5cbmltcG9ydCB7V2l6YXJkU3RlcENvbXBvbmVudH0gZnJvbSBcIi4vd2l6YXJkLXN0ZXAvd2l6YXJkLXN0ZXAuY29tcG9uZW50XCI7XG5pbXBvcnQge2ZpbmQsIGZvckVhY2gsIGdldCwgaW5kZXhPZiwgaXNBcnJheSwgaXNOdW1iZXIsIGlzU3RyaW5nfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5cbmNvbnN0IERFRkFVTFRfQ0xTID0gJ2FwcC13aXphcmQgcGFuZWwgY2xlYXJmaXgnO1xuY29uc3QgV0lER0VUX0NPTkZJRzogSVdpZGdldENvbmZpZyA9IHtcbiAgICB3aWRnZXRUeXBlOiAnd20td2l6YXJkJyxcbiAgICBob3N0Q2xhc3M6IERFRkFVTFRfQ0xTXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgV21Db21wb25lbnRzTW9kdWxlXSxcbiAgICBzZWxlY3RvcjogJ2Rpdlt3bVdpemFyZF0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi93aXphcmQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBwcm92aWRlQXNXaWRnZXRSZWYoV2l6YXJkQ29tcG9uZW50KSxcbiAgICAgICAge3Byb3ZpZGU6IENvbnRleHQsIHVzZUZhY3Rvcnk6ICgpID0+IHsgcmV0dXJuIHt9IH0sIG11bHRpOiB0cnVlfVxuICAgIF0sXG4gICAgZXhwb3J0QXM6ICd3bVdpemFyZCdcbn0pXG5leHBvcnQgY2xhc3MgV2l6YXJkQ29tcG9uZW50IGV4dGVuZHMgU3R5bGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQge1xuICAgIHN0YXRpYyBpbml0aWFsaXplUHJvcHMgPSByZWdpc3RlclByb3BzKCk7XG5cbiAgICBAQ29udGVudENoaWxkcmVuKFdpemFyZFN0ZXBDb21wb25lbnQpIHN0ZXBzOiBRdWVyeUxpc3Q8V2l6YXJkU3RlcENvbXBvbmVudD47XG4gICAgQENvbnRlbnRDaGlsZCgnd2l6YXJkQWN0aW9uJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgZGVzY2VuZGFudHM6IGZhbHNlIH0pIHdpemFyZEFjdGlvbjogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIHB1YmxpYyBtZXNzYWdlOiB7Y2FwdGlvbjogc3RyaW5nLCB0eXBlOiBzdHJpbmd9O1xuICAgIHB1YmxpYyBjdXJyZW50U3RlcDogV2l6YXJkU3RlcENvbXBvbmVudDtcblxuICAgIHB1YmxpYyBzdGVwQ2xhc3M6IHN0cmluZztcbiAgICBwdWJsaWMgY2xhc3M7XG4gICAgcHVibGljIG5hbWU7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9taXNlUmVzb2x2ZXJGbjogRnVuY3Rpb247XG4gICAgcHVibGljIGFjdGlvbnNhbGlnbm1lbnQ6IGFueTtcbiAgICBwdWJsaWMgY2FuY2VsYWJsZTogYW55O1xuICAgIHB1YmxpYyBlbmFibGVuZXh0OiBhbnk7XG4gICAgcHVibGljIHdpekNvbnRleHQ6IGFueTtcbiAgICBwdWJsaWMgY2FuY2VsYnRubGFiZWw6IGFueTtcbiAgICBwdWJsaWMgZG9uZWJ0bmxhYmVsOiBhbnk7XG4gICAgcHVibGljIHByZXZpb3VzYnRubGFiZWw6IGFueTtcbiAgICBwdWJsaWMgbmV4dGJ0bmxhYmVsOiBhbnk7XG4gICAgcHVibGljIGRlZmF1bHRzdGVwO1xuICAgIHB1YmxpYyBmaWVsZERlZnM7XG4gICAgcHVibGljIHR5cGU7XG4gICAgcHVibGljIG5vZGF0YW1lc3NhZ2U7XG4gICAgcHJpdmF0ZSBkeW5hbWljQ29tcG9uZW50UHJvdmlkZXI7XG4gICAgcHJpdmF0ZSBfZHluYW1pY0NvbnRleHQ7XG4gICAgcHJpdmF0ZSBkeW5hbWljU3RlcEluZGV4O1xuICAgIHB1YmxpYyBkeW5hbWljV2l6YXJkO1xuICAgIHB1YmxpYyBkZWZhdWx0c3RlcGluZGV4O1xuICAgIHByaXZhdGUgX2lzRmlyc3RMb2FkOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIGdldCBoYXNQcmV2U3RlcCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9pc0ZpcnN0U3RlcCh0aGlzLmN1cnJlbnRTdGVwKTtcbiAgICB9XG5cbiAgICBnZXQgaGFzTmV4dFN0ZXAoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5faXNMYXN0U3RlcCh0aGlzLmN1cnJlbnRTdGVwKTtcbiAgICB9XG5cbiAgICBnZXQgc2hvd0RvbmVCdG4oKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50U3RlcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhdGhpcy5oYXNOZXh0U3RlcCAmJiB0aGlzLmN1cnJlbnRTdGVwLmVuYWJsZURvbmU7XG4gICAgfVxuXG4gICAgZ2V0IGVuYWJsZVByZXYoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50U3RlcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGVwLmVuYWJsZVByZXY7XG4gICAgfVxuXG4gICAgZ2V0IGVuYWJsZU5leHQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50U3RlcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmVuYWJsZW5leHQgPyB0cnVlIDogKHRoaXMuY3VycmVudFN0ZXAuZW5hYmxlTmV4dCAmJiB0aGlzLmN1cnJlbnRTdGVwLmlzVmFsaWQpO1xuICAgIH1cblxuICAgIGdldCBlbmFibGVEb25lKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFN0ZXApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RlcC5lbmFibGVEb25lICYmIHRoaXMuY3VycmVudFN0ZXAuaXNWYWxpZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIGN1cnJlbnQgc3RlcCBpbmRleCBvZiB0aGUgV2l6YXJkJ3MgY3VycmVudCBzdGVwXG4gICAgICovXG4gICAgZ2V0IGN1cnJlbnRTdGVwSW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFN0ZXBJbmRleEJ5UmVmKHRoaXMuY3VycmVudFN0ZXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybnMgd2VhdGhlciB0aGUgY3VycmVudCBzdGVwIGlzIGZpcnN0IHN0ZXAgb3Igbm90XG4gICAgICovXG4gICAgZ2V0IGlzRmlyc3RTdGVwKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNGaXJzdFN0ZXAodGhpcy5jdXJyZW50U3RlcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJucyB3ZWF0aGVyIHRoZSBjdXJyZW50IHN0ZXAgaXMgbGFzdCBzdGVwIG9yIG5vdFxuICAgICAqL1xuICAgIGdldCBpc0xhc3RTdGVwKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNMYXN0U3RlcCh0aGlzLmN1cnJlbnRTdGVwKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihpbmo6IEluamVjdG9yLCBkeW5hbWljQ29tcG9uZW50UHJvdmlkZXI6IER5bmFtaWNDb21wb25lbnRSZWZQcm92aWRlciwgQFNlbGYoKSBASW5qZWN0KENvbnRleHQpIGNvbnRleHRzOiBBcnJheTxhbnk+LCBASW5qZWN0KCdFWFBMSUNJVF9DT05URVhUJykgQE9wdGlvbmFsKCkgZXhwbGljaXRDb250ZXh0OiBhbnkpIHtcbiAgICAgICAgbGV0IHJlc29sdmVGbjogRnVuY3Rpb24gPSBub29wO1xuXG4gICAgICAgIHN1cGVyKGluaiwgV0lER0VUX0NPTkZJRywgZXhwbGljaXRDb250ZXh0LCBuZXcgUHJvbWlzZShyZXMgPT4gcmVzb2x2ZUZuID0gcmVzKSk7XG4gICAgICAgIHN0eWxlcih0aGlzLm5hdGl2ZUVsZW1lbnQsIHRoaXMsIEFQUExZX1NUWUxFU19UWVBFLlNIRUxMKTtcblxuICAgICAgICB0aGlzLnByb21pc2VSZXNvbHZlckZuID0gcmVzb2x2ZUZuO1xuXG4gICAgICAgIC8vIGluaXRpYWxpemUgdGhlIG1lc3NhZ2Ugb2JqZWN0IHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgdGhpcy5tZXNzYWdlID0ge1xuICAgICAgICAgICAgY2FwdGlvbjogJycsXG4gICAgICAgICAgICB0eXBlOiAnJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLndpekNvbnRleHQgPSBjb250ZXh0c1swXTtcbiAgICAgICAgdGhpcy5keW5hbWljQ29tcG9uZW50UHJvdmlkZXIgPSBkeW5hbWljQ29tcG9uZW50UHJvdmlkZXI7XG4gICAgICAgIHRoaXMuZHluYW1pY1dpemFyZCA9IFtdO1xuICAgICAgICB0aGlzLmR5bmFtaWNTdGVwSW5kZXggPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGR5bmFtaWMgc3RlcHMuXG4gICAgICogQWZ0ZXIgYWxsIHN0ZXBzIGFyZSBpbml0aWFsemVkLCB1cGRhdGUgdGhlIHF1ZXJ5bGlzdCBtYW51YWxseSBiYXNlZCBvbiBpbmRleC5cbiAgICAgKiBAcGFyYW0gc3RlcFJlZiAtIHJlZnJlbmNlIG9mIHRoZSB3aXphcmRzdGVwXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyRHluYW1pY1N0ZXAoc3RlcFJlZikge1xuICAgICAgICB0aGlzLmR5bmFtaWNXaXphcmQucHVzaChzdGVwUmVmKTtcbiAgICAgICAgY29uc3QgaXNMYXN0U3RlcCA9ICB0aGlzLmR5bmFtaWNXaXphcmQubGVuZ3RoID09PSB0aGlzLmR5bmFtaWNTdGVwSW5kZXg7XG4gICAgICAgIGlmIChpc0xhc3RTdGVwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZHluYW1pY1dpemFyZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0ZXBSZWYgID0gZmluZCh0aGlzLmR5bmFtaWNXaXphcmQsIHN0ZXAgPT4gc3RlcC5keW5hbWljU3RlcEluZGV4ID09PSBpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1N0ZXBBbHJlYWR5RXhpc3QgPSBmaW5kKHRoaXMuc3RlcHMudG9BcnJheSgpLCBuZXdTdGVwUmVmKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzU3RlcEFscmVhZHlFeGlzdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0ZXBzLnJlc2V0KFsuLi50aGlzLnN0ZXBzLnRvQXJyYXkoKSwgbmV3U3RlcFJlZl0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RlcFJlZi5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0ZXBSZWYuc2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAyMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0byBhZGQgdGhlIHdpemFyZCBzdGVwIGR5bmFtaWNhbGx5XG4gICAgICogQHBhcmFtIHdpemFyZFN0ZXBzIC0gbGlzdCBvZiB3aXphcmRzdGVwc1xuICAgICAqL1xuICAgIHB1YmxpYyBhZGRTdGVwKHdpemFyZFN0ZXBzKSB7XG4gICAgICAgIGlmICghaXNBcnJheSh3aXphcmRTdGVwcykpIHtcbiAgICAgICAgICAgIHdpemFyZFN0ZXBzID0gW3dpemFyZFN0ZXBzXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGVwTmFtZXNMaXN0ID0gW107XG4gICAgICAgIGZvckVhY2god2l6YXJkU3RlcHMsIChzdGVwLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNTdGVwQWxyZWFkeUNyZWF0ZWQgPSBmaW5kKHRoaXMuc3RlcHMudG9BcnJheSgpLCB7bmFtZTogc3RlcC5uYW1lfSk7XG4gICAgICAgICAgICBjb25zdCBpc1N0ZXBOYW1lRXhpc3QgPSBpbmRleE9mKHN0ZXBOYW1lc0xpc3QsIHN0ZXAubmFtZSk7XG4gICAgICAgICAgICAvLyBJZiB1c2VyIHRyaWVzIHRvIGFkZCB3aXphcmRzdGVwIHdpdGggdGhlIHNhbWUgbmFtZSB3aGljaCBpcyBhbHJlYWR5IGV4aXN0cyB0aGVuIGRvIG5vdCBjcmVhdGUgdGhlIHN0ZXBcbiAgICAgICAgICAgIGlmIChpc1N0ZXBBbHJlYWR5Q3JlYXRlZCB8fCBpc1N0ZXBOYW1lRXhpc3QgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBUaGUgd2l6YXJkIHN0ZXAgd2l0aCBuYW1lICR7c3RlcC5uYW1lfSBhbHJlYWR5IGV4aXN0c2ApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHBhcmFtTWFya3VwID0gJyc7XG4gICAgICAgICAgICBsZXQgcHJvcHNUbXBsID0gJyc7XG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNTdGVwSW5kZXgrKztcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBzdGVwLm5hbWUgPyBzdGVwLm5hbWUgOiBgd2l6YXJkc3RlcCR7dGhpcy5zdGVwcy50b0FycmF5KCkubGVuZ3RoICsgKGluZGV4ICsgMSl9YDtcbiAgICAgICAgICAgIHN0ZXBOYW1lc0xpc3QucHVzaChuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRpYWxQYXJhbXMgPSBnZXQoc3RlcCwgJ3BhcmFtcycpO1xuXG4gICAgICAgICAgICBmb3JFYWNoKHN0ZXAsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gJ3BhcmFtcycpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHNUbXBsID0gYCR7cHJvcHNUbXBsfSAke2tleX09XCIke3ZhbHVlfVwiYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZm9yRWFjaChwYXJ0aWFsUGFyYW1zLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIHBhcmFtTWFya3VwID0gYCR7cGFyYW1NYXJrdXB9IDx3bS1wYXJhbSBuYW1lPVwiJHtrZXl9XCIgdmFsdWU9XCIke3ZhbHVlfVwiPjwvd20tcGFyYW0+YDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgbWFya3VwID0gYDx3bS13aXphcmRzdGVwIGR5bmFtaWNTdGVwSW5kZXg9XCIke3RoaXMuZHluYW1pY1N0ZXBJbmRleCAtIDF9XCIgaXNkeW5hbWljPVwidHJ1ZVwiIG5hbWU9XCIke25hbWV9XCIgJHtwcm9wc1RtcGx9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7cGFyYW1NYXJrdXB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3dtLXdpemFyZHN0ZXA+YDtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9keW5hbWljQ29udGV4dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2R5bmFtaWNDb250ZXh0ID0gT2JqZWN0LmNyZWF0ZSh0aGlzLnZpZXdQYXJlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2R5bmFtaWNDb250ZXh0W3RoaXMuZ2V0QXR0cignd21XaXphcmQnKV0gPSB0aGlzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRQcm92aWRlci5hZGRDb21wb25lbnQodGhpcy5nZXROYXRpdmVFbGVtZW50KCkucXVlcnlTZWxlY3RvcignLmFwcC13aXphcmQtYm9keScpLCBtYXJrdXAsIHRoaXMuX2R5bmFtaWNDb250ZXh0LCB7aW5qOiB0aGlzLmluan0pO1xuXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc3RlcE5hbWVzTGlzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0byByZW1vdmUgdGhlIHdpemFyZCBzdGVwXG4gICAgICogQHBhcmFtIHN0ZXAgLSBpbmRleCBvciBuYW1lIG9mIHRoZSBzdGVwXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVN0ZXAoc3RlcDogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHN0ZXBSZWYgPSBpc1N0cmluZyhzdGVwKSA/IHRoaXMuZ2V0U3RlcFJlZkJ5TmFtZShzdGVwKSA6IGlzTnVtYmVyKHN0ZXApXG4gICAgICAgICAgICA/IHRoaXMuZ2V0U3RlcFJlZkJ5SW5kZXgoc3RlcCkgOiBudWxsO1xuICAgICAgICBzdGVwUmVmID8gc3RlcFJlZi5yZW1vdmUoKSA6IGNvbnNvbGUud2FybihgQ291bGQgbm90IGZpbmQgc3RlcCB3aXRoIG5hbWUgb3IgaW5kZXggJyR7c3RlcH0nIHRvIHJlbW92ZWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybnMgbmV4dCB2YWxpZCBzdGVwLiB0aGUgaW5kZXggcGFzc2VkIGlzIGFsc28gY2hlY2tlZCBpZiBpdHMgdmFsaWQgc3RlcFxuICAgICAqIEBwYXJhbSBpbmRleFxuICAgICAqIEByZXR1cm5zIHtXaXphcmRTdGVwQ29tcG9uZW50fVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0TmV4dFZhbGlkU3RlcEZvcm1JbmRleChpbmRleDogbnVtYmVyKTogV2l6YXJkU3RlcENvbXBvbmVudCB7XG4gICAgICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IHRoaXMuc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmdldFN0ZXBSZWZCeUluZGV4KGkpO1xuICAgICAgICAgICAgaWYgKHN0ZXAuc2hvdykge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJucyBwcmV2aW91cyB2YWxpZCBzdGVwLiB0aGUgaW5kZXggcGFzc2VkIGlzIGFsc28gY2hlY2tlZCBpZiBpdHMgdmFsaWQgc3RlcFxuICAgICAqIEBwYXJhbSBpbmRleFxuICAgICAqIEByZXR1cm5zIHtXaXphcmRTdGVwQ29tcG9uZW50fVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0UHJldmlvdXNWYWxpZFN0ZXBGb3JtSW5kZXgoaW5kZXg6IG51bWJlcik6IFdpemFyZFN0ZXBDb21wb25lbnQge1xuICAgICAgICBmb3IgKGxldCBpID0gaW5kZXg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVwID0gdGhpcy5nZXRTdGVwUmVmQnlJbmRleChpKTtcbiAgICAgICAgICAgIGlmIChzdGVwLnNob3cpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybnMgY3VycmVudCBzdGVwIGluZGV4IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRDdXJyZW50U3RlcEluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFN0ZXBJbmRleEJ5UmVmKHRoaXMuY3VycmVudFN0ZXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybnMgc3RlcFJlZiB3aGVuIGluZGV4IGlzIHBhc3NlZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAgICAgKiBAcmV0dXJucyB7V2l6YXJkU3RlcENvbXBvbmVudH1cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFN0ZXBSZWZCeUluZGV4KGluZGV4OiBudW1iZXIpOiBXaXphcmRTdGVwQ29tcG9uZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RlcHMudG9BcnJheSgpW2luZGV4XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIHRoZSBpbmRleCB2YWx1ZSBvZiB0aGUgc3RlcC5cbiAgICAgKiBAcGFyYW0ge1dpemFyZFN0ZXBDb21wb25lbnR9IHdpemFyZFN0ZXBcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0U3RlcEluZGV4QnlSZWYod2l6YXJkU3RlcDogV2l6YXJkU3RlcENvbXBvbmVudCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0ZXBzLnRvQXJyYXkoKS5pbmRleE9mKHdpemFyZFN0ZXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGdldHMgc3RlcFJlZiBieSBzZWFyY2hpbmcgb24gdGhlIG5hbWUgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJucyB7V2l6YXJkU3RlcENvbXBvbmVudH1cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFN0ZXBSZWZCeU5hbWUobmFtZTogc3RyaW5nKTogV2l6YXJkU3RlcENvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0ZXBzLmZpbmQoc3RlcCA9PiBzdGVwLm5hbWUgPT09IG5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHNldHMgZGVmYXVsdCBzdGVwIGFzIGN1cnJlbnQgc3RlcCBpZiBjb25maWd1cmVkXG4gICAgICogb3IgZmluZHMgZmlyc3QgdmFsaWQgc3RlcCBhbmQgc2V0IGl0IGFzIGN1cnJlbnQgc3RlcC5cbiAgICAgKiBAcGFyYW0ge1dpemFyZFN0ZXBDb21wb25lbnR9IHN0ZXBcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldERlZmF1bHRTdGVwKHN0ZXA6IFdpemFyZFN0ZXBDb21wb25lbnQpIHtcbiAgICAgICAgLy8gSWYgdGhlIGRlZmF1bHQgc3RlcCBoYXMgc2hvdyB0cnVlIHRoZW4gb25seSB1cGRhdGUgdGhlIGN1cnJlbnRTdGVwXG4gICAgICAgIGlmIChzdGVwICYmIHN0ZXAuc2hvdykge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlcCA9IHN0ZXA7XG4gICAgICAgICAgICBzdGVwLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICBzdGVwLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gTWFyayBhbGwgcHJldmlvdXMgc3RlcCBzdGF0dXMgQ09NUExFVEVEXG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmdldFN0ZXBJbmRleEJ5UmVmKHN0ZXApIC0gMTtcbiAgICAgICAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldlN0ZXAgPSB0aGlzLmdldFN0ZXBSZWZCeUluZGV4KGluZGV4KTtcbiAgICAgICAgICAgICAgICBwcmV2U3RlcC5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwcmV2U3RlcC5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpbmRleC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc2V0IG5leHQgdmFsaWQgc3RlcCBhcyBjdXJyZW50IHN0ZXBcbiAgICAgICAgICAgIHN0ZXAgPSB0aGlzLmdldE5leHRWYWxpZFN0ZXBGb3JtSW5kZXgoMCk7XG4gICAgICAgICAgICBpZiAoc3RlcCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGVmYXVsdFN0ZXAoc3RlcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRNb3JlVGV4dCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdHMgdGhlIGFzc29jaWF0ZWQgc3RlcCB3aGVuIHRoZSB3aXphcmQgaGVhZGVyIGlzIGNsaWNrZWQuXG4gICAgICogQHBhcmFtICRldmVudFxuICAgICAqIEBwYXJhbSB7V2l6YXJkU3RlcENvbXBvbmVudH0gY3VycmVudFN0ZXBcbiAgICAgKi9cbiAgICBwcml2YXRlIG9uV2l6YXJkSGVhZGVyQ2xpY2soJGV2ZW50OiBFdmVudCwgY3VycmVudFN0ZXA6IFdpemFyZFN0ZXBDb21wb25lbnQpIHtcbiAgICAgICAgLy8gc2VsZWN0IHRoZSBzdGVwIGlmIGl0J3Mgc3RhdHVzIGlzIGRvbmVcbiAgICAgICAgaWYgKGN1cnJlbnRTdGVwLmRvbmUpIHtcbiAgICAgICAgICAgIC8vIHNldCBhbGwgdGhlIG5leHQgc3RlcHMgc3RhdHVzIGFzIGRpc2FibGVkIGFuZCBwcmV2aW91cyBzdGVwcyBhcyBkb25lXG4gICAgICAgICAgICB0aGlzLnN0ZXBzLmZvckVhY2goKHN0ZXAsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5nZXRTdGVwSW5kZXhCeVJlZihjdXJyZW50U3RlcCkpIHtcbiAgICAgICAgICAgICAgICAgICBzdGVwLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgIHN0ZXAuaXNEb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdGVwLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgc3RlcC5pc0RvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIHNldCB0aGUgc2VsZWN0ZWQgc3RlcCBhcyBjdXJyZW50IHN0ZXAgYW5kIG1ha2UgaXQgYWN0aXZlXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGVwID0gY3VycmVudFN0ZXA7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGVwLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmFkZE1vcmVUZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUHJvbWlzZSA9IChvYmopID0+IG9iaiBpbnN0YW5jZW9mIFByb21pc2UgfHwgKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqLnRoZW4gPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai5jYXRjaCA9PT0gJ2Z1bmN0aW9uJyk7XG5cbiAgICAvLyBNZXRob2QgdG8gbmF2aWdhdGUgdG8gbmV4dCBzdGVwXG5cbiAgICBwcml2YXRlIGhhbmRsZU5leHQodmFsdWU6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+LCBjdXJyZW50U3RlcCwgY3VycmVudFN0ZXBJbmRleCkge1xuICAgICAgICBpZiAodGhpcy5pc1Byb21pc2UodmFsdWUpKSB7XG4gICAgICAgICAgICAodmFsdWUgYXMgUHJvbWlzZTxib29sZWFuPikudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZXh0ZW5kTmV4dEZuKGN1cnJlbnRTdGVwLCBjdXJyZW50U3RlcEluZGV4KTtcbiAgICAgICAgICAgIH0sIGVyciA9PiBlcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kTmV4dEZuKGN1cnJlbnRTdGVwLCBjdXJyZW50U3RlcEluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZXh0KGV2ZW50TmFtZTogc3RyaW5nID0gJ25leHQnKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGVwID0gdGhpcy5jdXJyZW50U3RlcDtcbiAgICAgICAgY29uc3QgY3VycmVudFN0ZXBJbmRleCA9IHRoaXMuZ2V0Q3VycmVudFN0ZXBJbmRleCgpO1xuXG4gICAgICAgIC8vIGFib3J0IGlmIG9uU2tpcCBtZXRob2QgcmV0dXJucyBmYWxzZVxuICAgICAgICBpZiAoZXZlbnROYW1lID09PSAnc2tpcCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gIGN1cnJlbnRTdGVwLmludm9rZVNraXBDQihjdXJyZW50U3RlcEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTmV4dChyZXNwb25zZSwgY3VycmVudFN0ZXAsIGN1cnJlbnRTdGVwSW5kZXgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFN0ZXAuaXNWYWxpZCAmJiBldmVudE5hbWUgPT09ICduZXh0Jykge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgID0gIGN1cnJlbnRTdGVwLmludm9rZU5leHRDQihjdXJyZW50U3RlcEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTmV4dChyZXNwb25zZSwgY3VycmVudFN0ZXAsIGN1cnJlbnRTdGVwSW5kZXgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZW5hYmxlbmV4dCAmJiAhdGhpcy5jdXJyZW50U3RlcC5pc1ZhbGlkKXtcbiAgICAgICAgICAgIEFycmF5LmZyb20oKDxhbnk+dGhpcykuY3VycmVudFN0ZXAuZ2V0QWxsRW1iZWRkZWRGb3JtcygpKT8uZm9yRWFjaCgoZm9ybTphbnkpID0+IHtcbiAgICAgICAgICAgICAgICBmb3JtLndpZGdldC5oaWdobGlnaHRJbnZhbGlkRmllbGRzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGludmFsaWRGb3JtSW5wdXRFbGVtZW50ID0gdGhpcy5jdXJyZW50U3RlcC5uYXRpdmVFbGVtZW50Py5xdWVyeVNlbGVjdG9yKFwiaW5wdXQubmctaW52YWxpZFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICAgICAgaW52YWxpZEZvcm1JbnB1dEVsZW1lbnQ/LmZvY3VzKCk7XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZXh0ZW5kTmV4dEZuKGN1cnJlbnRTdGVwLCBjdXJyZW50U3RlcEluZGV4KXtcbiAgICAgICAgY29uc3QgbmV4dFN0ZXA6IFdpemFyZFN0ZXBDb21wb25lbnQgPSB0aGlzLmdldE5leHRWYWxpZFN0ZXBGb3JtSW5kZXgoY3VycmVudFN0ZXBJbmRleCArIDEpO1xuICAgICAgICAvLyBJZiB0aGVyZSBhcmUgYW55IHN0ZXBzIHdoaWNoIGhhcyBzaG93IHRoZW4gb25seSBjaGFuZ2Ugc3RhdGUgb2YgY3VycmVudCBzdGVwIGVsc2UgcmVtYWluIHNhbWVcbiAgICAgICAgaWYgKG5leHRTdGVwKSB7XG4gICAgICAgICAgICBuZXh0U3RlcC5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGN1cnJlbnRTdGVwLmlzRG9uZSA9IHRydWU7XG4gICAgICAgICAgICBjdXJyZW50U3RlcC5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIG5leHRTdGVwLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGVwID0gbmV4dFN0ZXA7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0ZXBGb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkTW9yZVRleHQoKTtcbiAgICB9XG4gICAgLy8gTWV0aG9kIHRvIG5hdmlnYXRlIHRvIHByZXZpb3VzIHN0ZXBcbiAgICBwdWJsaWMgcHJldigpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFN0ZXAgPSB0aGlzLmN1cnJlbnRTdGVwO1xuICAgICAgICBjb25zdCBjdXJyZW50U3RlcEluZGV4ID0gdGhpcy5nZXRDdXJyZW50U3RlcEluZGV4KCk7XG5cbiAgICAgICAgLy8gYWJvcnQgaWYgb25QcmV2IG1ldGhvZCByZXR1cm5zIGZhbHNlLlxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGN1cnJlbnRTdGVwLmludm9rZVByZXZDQihjdXJyZW50U3RlcEluZGV4KTtcbiAgICAgICAgaWYgKHRoaXMuaXNQcm9taXNlKHJlc3BvbnNlKSkge1xuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIFByb21pc2U8Ym9vbGVhbj4pLnRoZW4oIHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5leHRlbmRQcmV2Rm4oY3VycmVudFN0ZXAsIGN1cnJlbnRTdGVwSW5kZXgpO1xuICAgICAgICAgICAgfSwgZXJyID0+IGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5leHRlbmRQcmV2Rm4oY3VycmVudFN0ZXAsIGN1cnJlbnRTdGVwSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleHRlbmRQcmV2Rm4oY3VycmVudFN0ZXAsIGN1cnJlbnRTdGVwSW5kZXgpe1xuICAgICAgICBjb25zdCBwcmV2U3RlcDogV2l6YXJkU3RlcENvbXBvbmVudCA9IHRoaXMuZ2V0UHJldmlvdXNWYWxpZFN0ZXBGb3JtSW5kZXgoY3VycmVudFN0ZXBJbmRleCAtIDEpO1xuXG4gICAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgc3RlcHMgd2hpY2ggaGFzIHNob3cgdGhlbiBvbmx5IGNoYW5nZSBzdGF0ZSBvZiBjdXJyZW50IHN0ZXAgZWxzZSByZW1haW4gc2FtZVxuICAgICAgICBpZiAocHJldlN0ZXApIHtcbiAgICAgICAgICAgIGN1cnJlbnRTdGVwLmlzRG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgY3VycmVudFN0ZXAuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcHJldlN0ZXAuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZXAgPSBwcmV2U3RlcDtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RlcEZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRNb3JlVGV4dCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBza2lwKCkge1xuICAgICAgICB0aGlzLm5leHQoJ3NraXAnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIGdpdmVuIHN0ZXAgYmFzZWQgb24gc3RlcCBuYW1lIG9yIHN0ZXAgaW5kZXhcbiAgICAgKiBUaGlzIHdpbGwgd29yayBvbmx5IGlmIHRoZSBzdGVwIGlzIGFscmVhZHkgaW4gZG9uZSBzdGF0ZVxuICAgICAqIEBwYXJhbSBzdGVwXG4gICAgICovXG4gICAgcHVibGljIGdvdG9TdGVwKHN0ZXA6IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICBsZXQgZ290b1N0ZXBJbmRleDogbnVtYmVyO1xuICAgICAgICBpZiAoaXNTdHJpbmcoc3RlcCkpIHtcbiAgICAgICAgICAgIGdvdG9TdGVwSW5kZXggPSB0aGlzLnN0ZXBzLnRvQXJyYXkoKS5tYXAoc3RlcCA9PiBzdGVwLm5hbWUpLmluZGV4T2Yoc3RlcCk7XG4gICAgICAgICAgICBpZiAoZ290b1N0ZXBJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDb3VsZCBub3QgZmluZCBzdGVwICcke3N0ZXB9J2ApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc051bWJlcihzdGVwKSAmJiBzdGVwID49IDApIHtcbiAgICAgICAgICAgIGdvdG9TdGVwSW5kZXggPSBzdGVwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkludmFsaWQgc3RlcCBuYW1lIG9yIGluZGV4IHByb3ZpZGVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ290b1N0ZXA6IFdpemFyZFN0ZXBDb21wb25lbnQgPSB0aGlzLmdldFN0ZXBSZWZCeUluZGV4KGdvdG9TdGVwSW5kZXgpO1xuXG4gICAgICAgIGlmIChnb3RvU3RlcD8uc2hvdykge1xuICAgICAgICAgICAgdGhpcy5vbldpemFyZEhlYWRlckNsaWNrKGV2ZW50LCBnb3RvU3RlcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGhlIGdvdG9TdGVwIGZ1bmN0aW9uIGNhbm5vdCBuYXZpZ2F0ZSB0byBoaWRkZW4gc3RlcHNcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNZXRob2QgdG8gaW52b2tlIG9uLURvbmUgZXZlbnQgb24gd2l6YXJkXG4gICAgcHVibGljIGRvbmUoKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFN0ZXAuaXNEb25lID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdkb25lJywge3N0ZXBzOiB0aGlzLnN0ZXBzLnRvQXJyYXkoKX0pO1xuICAgIH1cbiAgICAvLyBNZXRob2QgdG8gaW52b2tlIG9uLUNhbmNlbCBldmVudCBvbiB3aXphcmRcbiAgICBwdWJsaWMgY2FuY2VsICgpIHtcbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdjYW5jZWwnLCB7c3RlcHM6IHRoaXMuc3RlcHMudG9BcnJheSgpfSk7XG4gICAgfVxuICAgIHB1YmxpYyBhZGRNb3JlVGV4dCgpe1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcblxuXG4gICAgICAgIHZhciBuZXdXaW5kb3dXaWR0aCA9ICQod2luZG93KS53aWR0aCgpO1xuICAgICAgICBpZihuZXdXaW5kb3dXaWR0aCA8IDc2OCl7XG4gICAgICAgICQoXCIuYXBwLXdpemFyZC1zdGVwLmN1cnJlbnQgLnN1YnRpdGxlLXdyYXBwZXIgLnN0ZXAtdGl0bGVcIikuY3NzKHtcImhlaWdodFwiOlwiYXV0b1wiLFwiZGlzcGxheVwiOlwiYmxvY2tcIn0pO1xuICAgICAgICB2YXIgc3VidGl0bGVUZXh0TGVuZ3RoID0gJChcIi5hcHAtd2l6YXJkLXN0ZXAuY3VycmVudCAuc3VidGl0bGUtd3JhcHBlciAuc3RlcC10aXRsZVwiKS5oZWlnaHQoKTtcbiAgICAgICAgJChcIi5yZWFkX21vcmVcIikuY3NzKFwiZGlzcGxheVwiLFwibm9uZVwiKTtcbiAgICAgICAgJChcIi5jdXJyZW50IC5zdWJ0aXRsZS13cmFwcGVyXCIpLnJlbW92ZUNsYXNzKFwicmVhZG1vcmVfc3VidGl0bGVcIik7XG5cbiAgICAgICAgaWYoc3VidGl0bGVUZXh0TGVuZ3RoPjQ0KXtcbiAgICAgICAgICAgICQoXCIuYXBwLXdpemFyZC1zdGVwLmN1cnJlbnQgLnN1YnRpdGxlLXdyYXBwZXIgLnN0ZXAtdGl0bGVcIikuY3NzKHtcImhlaWdodFwiOlwiNDRweFwiLFwiZGlzcGxheVwiOlwiLXdlYmtpdC1ib3hcIn0pO1xuICAgICAgICAgICAgJChcIi5jdXJyZW50IC5yZWFkX21vcmVcIikuY3NzKFwiZGlzcGxheVwiLFwiYmxvY2tcIik7XG4gICAgICAgICAgICAkKFwiLmFjdGl2ZSAucmVhZF9tb3JlXCIpLmNzcyhcImRpc3BsYXlcIixcIm5vbmVcIik7XG4gICAgICAgICAgICAkKFwiLmRpc2FibGUgLnJlYWRfbW9yZVwiKS5jc3MoXCJkaXNwbGF5XCIsXCJub25lXCIpO1xuICAgICAgICAgICAgJChcIi5hcHAtd2l6YXJkLXN0ZXA+YVwiKS5jc3MoXCJoZWlnaHRcIixcIjEwMHB4XCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIH1cbiAgICBwdWJsaWMgcmVhZE1vcmVTdWJ0aXRsZSgpe1xuICAgICAgICAkKFwiLmN1cnJlbnQgLnN1YnRpdGxlLXdyYXBwZXJcIikuYWRkQ2xhc3MoXCJyZWFkbW9yZV9zdWJ0aXRsZVwiKTtcbiAgICAgICAgJChcIi5jdXJyZW50IC5yZWFkX21vcmVcIikuY3NzKFwiZGlzcGxheVwiLFwibm9uZVwiKTtcbiAgICAgICAgJChkb2N1bWVudCkub24oXCJtb3VzZXVwXCIsZnVuY3Rpb24oZTphbnkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSAkKFwiLnN1YnRpdGxlLXdyYXBwZXJcIik7XG4gICAgICAgICAgICAvLyBpZiB0aGUgdGFyZ2V0IG9mIHRoZSBjbGljayBpc24ndCB0aGUgY29udGFpbmVyIG5vciBhIGRlc2NlbmRhbnQgb2YgdGhlIGNvbnRhaW5lclxuICAgICAgICAgICAgaWYgKCFjb250YWluZXIuaXMoZS50YXJnZXQpICYmIGNvbnRhaW5lci5oYXMoZS50YXJnZXQpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAkKFwiLmN1cnJlbnQgLnN1YnRpdGxlLXdyYXBwZXJcIikucmVtb3ZlQ2xhc3MoXCJyZWFkbW9yZV9zdWJ0aXRsZVwiKTtcbiAgICAgICAgICAgICAgICAkKFwiLmN1cnJlbnQgLnJlYWRfbW9yZVwiKS5jc3MoXCJkaXNwbGF5XCIsXCJibG9ja1wiKTtcbiAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoXCJtb3VzZXVwXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pc0ZpcnN0U3RlcChzdGVwUmVmOiBXaXphcmRTdGVwQ29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0ZXBzLmZpcnN0ID09PSBzdGVwUmVmO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2lzTGFzdFN0ZXAoc3RlcFJlZjogV2l6YXJkU3RlcENvbXBvbmVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGVwcy5sYXN0ID09PSBzdGVwUmVmO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25EYXRhQ2hhbmdlKG5ld1ZhbCkge1xuICAgICAgICB0aGlzLmZpZWxkRGVmcyA9IGNyZWF0ZUFycmF5RnJvbShuZXdWYWwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlU3RlcEZvY3VzKCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdGVwRWxlbWVudCA9IHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLmFwcC13aXphcmQtaGVhZGluZyBsaS5jdXJyZW50IGFcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjdXJyZW50U3RlcEVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgcHJvcGVydHkgY2hhbmdlIGhhbmRsZXIuIFRoaXMgTWV0aG9kIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlIHdpZGdldCBwcm9wZXJ0eVxuICAgIG9uUHJvcGVydHlDaGFuZ2Uoa2V5OiBzdHJpbmcsIG52OiBhbnksIG92PzogYW55KSB7XG4gICAgICAgIC8vIE1vbml0b3JpbmcgY2hhbmdlcyBmb3IgcHJvcGVydGllcyBhbmQgYWNjb3JkaW5nbHkgaGFuZGxpbmcgcmVzcGVjdGl2ZSBjaGFuZ2VzXG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ3N0ZXBzdHlsZScpIHtcbiAgICAgICAgICAgIHRoaXMuc3RlcENsYXNzID0gIG52ID09PSAnanVzdGlmaWVkJyA/ICduYXYtanVzdGlmaWVkJyA6ICcnO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2RhdGFzZXQnKSB7XG4gICAgICAgICAgICB0aGlzLm9uRGF0YUNoYW5nZShudik7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnZGVmYXVsdHN0ZXAnKSB7XG4gICAgICAgICAgICB0aGlzLnNldERlZmF1bHRTdGVwKHRoaXMuZ2V0U3RlcFJlZkJ5TmFtZShudikpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2FjdGlvbnNhbGlnbm1lbnQnKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignZGl2LmFwcC13aXphcmQtYWN0aW9ucycpPy5jbGFzc0xpc3QucmVwbGFjZShvdiwgbnYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3VwZXIub25Qcm9wZXJ0eUNoYW5nZShrZXksIG52LCBvdik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nQWZ0ZXJDb250ZW50SW5pdCgpO1xuICAgICAgICB0aGlzLnByb21pc2VSZXNvbHZlckZuKCk7XG4gICAgICAgIHRoaXMud2l6Q29udGV4dC5oYXNOZXh0U3RlcCA9ICgpID0+IHRoaXMuaGFzTmV4dFN0ZXA7XG4gICAgICAgIHRoaXMud2l6Q29udGV4dC5oYXNQcmV2aW91c1N0ZXAgPSAoKSA9PiB0aGlzLmhhc1ByZXZTdGVwO1xuICAgICAgICB0aGlzLndpekNvbnRleHQuaGFzTm9OZXh0U3RlcCA9ICgpID0+IHRoaXMuc2hvd0RvbmVCdG47XG4gICAgICAgIHRoaXMud2l6Q29udGV4dC5jYW5jZWxhYmxlID0gKCkgPT4gdGhpcy5jYW5jZWxhYmxlO1xuICAgICAgICB0aGlzLndpekNvbnRleHQuc2tpcHBhYmxlID0gKCkgPT4gdGhpcy5jdXJyZW50U3RlcD8uZW5hYmxlc2tpcDtcbiAgICAgICAgdGhpcy53aXpDb250ZXh0Lm5leHQgPSAoKSA9PiB0aGlzLm5leHQoKTtcbiAgICAgICAgdGhpcy53aXpDb250ZXh0LnByZXZpb3VzID0gKCkgPT4gdGhpcy5wcmV2KCk7XG4gICAgICAgIHRoaXMud2l6Q29udGV4dC5kb25lID0gKCkgPT4gdGhpcy5kb25lKCk7XG4gICAgICAgIHRoaXMud2l6Q29udGV4dC5jYW5jZWwgPSAoKSA9PiB0aGlzLmNhbmNlbCgpO1xuICAgICAgICB0aGlzLndpekNvbnRleHQuc2tpcCA9ICgpID0+IHRoaXMuc2tpcCgpO1xuICAgICAgICB0aGlzLndpekNvbnRleHQubmV4dGJ0bmxhYmVsID0gKCkgPT4gdGhpcy5uZXh0YnRubGFiZWw7XG4gICAgICAgIHRoaXMud2l6Q29udGV4dC5wcmV2aW91c2J0bmxhYmVsID0gKCkgPT4gdGhpcy5wcmV2aW91c2J0bmxhYmVsO1xuICAgICAgICB0aGlzLndpekNvbnRleHQuZG9uZWJ0bmxhYmVsID0gKCkgPT4gdGhpcy5kb25lYnRubGFiZWw7XG4gICAgICAgIHRoaXMud2l6Q29udGV4dC5jYW5jZWxidG5sYWJlbCA9ICgpID0+IHRoaXMuY2FuY2VsYnRubGFiZWw7XG4gICAgICAgIHRoaXMud2l6Q29udGV4dC5hY3Rpb25zYWxpZ25tZW50ID0gKCkgPT4gdGhpcy5hY3Rpb25zYWxpZ25tZW50O1xuICAgICAgICB0aGlzLndpekNvbnRleHQuZGlzYWJsZU5leHQgPSAoKSA9PiAhdGhpcy5lbmFibGVOZXh0O1xuICAgICAgICB0aGlzLndpekNvbnRleHQuZGlzYWJsZVByZXZpb3VzID0gKCkgPT4gIXRoaXMuZW5hYmxlUHJldjtcbiAgICAgICAgdGhpcy53aXpDb250ZXh0LmRpc2FibGVEb25lID0gKCkgPT4gIXRoaXMuZW5hYmxlRG9uZTtcbiAgICAgICAgdGhpcy5zdGVwcy5jaGFuZ2VzLnN1YnNjcmliZSggc2xpZGVzID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0ZXBzLmxlbmd0aCA+IDEgJiYgdGhpcy50eXBlID09PSAnZHluYW1pYycgJiYgdGhpcy5faXNGaXJzdExvYWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERlZmF1bHRTdGVwKHRoaXMuZ2V0U3RlcFJlZkJ5SW5kZXgodGhpcy5kZWZhdWx0c3RlcGluZGV4KSk7XG4gICAgICAgICAgICAgICAgdGhpcy5faXNGaXJzdExvYWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICAgICAgc3R5bGVyKFxuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYW5lbC1ib2R5JykgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgQVBQTFlfU1RZTEVTX1RZUEUuSU5ORVJfU0hFTExcbiAgICAgICAgKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmKCQod2luZG93KS53aWR0aCgpPDc2OCkge1xuICAgICAgICAgICAgJChcIi5hcHAtd2l6YXJkXCIpLnJlbW92ZUNsYXNzKFwidmVydGljYWxcIik7XG4gICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Rpdi5hcHAtd2l6YXJkLWFjdGlvbnMnKS5mb3JFYWNoKGVsID0+IGVsPy5jbGFzc0xpc3QuYWRkKHRoaXMuYWN0aW9uc2FsaWdubWVudCkpO1xuICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGl2LmFwcC13aXphcmQtYWN0aW9ucy1yaWdodCcpLmZvckVhY2goZWwgPT4gZWw/LmNsYXNzTGlzdC5yZW1vdmUoJ2FwcC1jb250YWluZXInKSk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImFwcC13aXphcmQtaGVhZGluZ1wiPlxuICA8dWwgY2xhc3M9XCJhcHAtd2l6YXJkLXN0ZXBzIG5hdiBuYXYtcGlsbHMge3tzdGVwQ2xhc3N9fVwiPlxuICAgIEBmb3IgKHN0ZXAgb2Ygc3RlcHM7IHRyYWNrIHN0ZXA7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICA8bGkgY2xhc3M9XCJhcHAtd2l6YXJkLXN0ZXBcIiBbaGlkZGVuXT1cIiFzdGVwLnNob3dcIlxuICAgICAgICBbbmdDbGFzc109XCJ7YWN0aXZlOiBzdGVwLmRvbmUsIGN1cnJlbnQ6IHN0ZXAuYWN0aXZlLCBkaXNhYmxlZDogc3RlcC5kaXNhYmxlZH1cIlxuICAgICAgICAoY2xpY2spPVwib25XaXphcmRIZWFkZXJDbGljaygkZXZlbnQsIHN0ZXApXCI+XG4gICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiBbYXR0ci5hcmlhLWN1cnJlbnRdPVwic3RlcC5hY3RpdmUgPyAnc3RlcCcgOiBudWxsXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInN0ZXAuZGlzYWJsZWRcIiBbYXR0ci5hcmlhLWxhYmVsXT0nc3RlcC5zdWJ0aXRsZSA/IFwic3RlcCBcIiArIChpICsgMSkgKyBcIiBcIiArICBzdGVwLnRpdGxlICsgXCIgXCIgKyBzdGVwLnN1YnRpdGxlIDogXCJzdGVwIFwiICsgKGkgKyAxKSArIFwiIFwiICsgIHN0ZXAudGl0bGUnIFthdHRyLnRpdGxlXT0gXCJzdGVwLnRpdGxlXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J3RpdGxlLWNlbnRlci1hbGlnbic6Y2xhc3MgJiYgY2xhc3MuaW5jbHVkZXMoJ2NsYXNzaWMnKSAmJiAhc3RlcC5zdWJ0aXRsZX1cIiBbdGFiaW5kZXhdPVwic3RlcC5hY3RpdmUgPyAnMCcgOiAnLTEnXCI+XG4gICAgICAgICAgQGlmIChjbGFzcyAmJiBjbGFzcy5pbmNsdWRlcygnY2xhc3NpYycpKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFycm93XCI+PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIndpemFyZC1zdGVwLW51bWJlclwiPlxuICAgICAgICAgICAgQGlmIChjbGFzcyAmJiBjbGFzcy5pbmNsdWRlcygnbnVtYmVyJykgJiYgIXN0ZXAuaXNEb25lKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY291bnRcIj57e2krMX19PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChjbGFzcyAmJiAoY2xhc3MuaW5jbHVkZXMoJ2RvdHRlZHN0ZXBwZXInKSB8fCBjbGFzcy5pbmNsdWRlcygndGV4dC1pbmxpbmUnKSAmJiAhY2xhc3MuaW5jbHVkZXMoJ2ljb25zdGVwcGVyJykpICYmICFzdGVwLmlzRG9uZSkge1xuICAgICAgICAgICAgICA8aSBjbGFzcz1cImRvdHRlZHN0ZXBwZXJcIj48L2k+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGNsYXNzICYmIChjbGFzcy5pbmNsdWRlcygnZG90dGVkc3RlcHBlcicpIHx8IGNsYXNzLmluY2x1ZGVzKCdudW1iZXInKSkgJiYgc3RlcC5pc0RvbmUpIHtcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJhcHAtaWNvbiB3aSB3aS1kb25lXCI+PC9pPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmICgoY2xhc3MgJiYgY2xhc3MuaW5jbHVkZXMoJ2ljb25zdGVwcGVyJykpICYmICgoc3RlcC5pY29uY2xhc3MgJiYgIXN0ZXAuaXNEb25lKSB8fCAoc3RlcC5pY29uY2xhc3MgJiYgc3RlcC5pc0RvbmUgJiYgc3RlcC5kb25laWNvbmNsYXNzID09PScnKSkpIHtcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJhcHAtaWNvbiB7e3N0ZXAuaWNvbmNsYXNzfX1cIj48L2k+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKHN0ZXAuZG9uZWljb25jbGFzcyAmJiBzdGVwLmlzRG9uZSAmJiAoY2xhc3MgJiYgY2xhc3MuaW5jbHVkZXMoJ2ljb25zdGVwcGVyJykpKSB7XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiYXBwLWljb24ge3tzdGVwLmRvbmVpY29uY2xhc3N9fVwiPjwvaT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZS13cmFwcGVyXCI+XG4gICAgICAgICAgICBAaWYgKGNsYXNzICYmIGNsYXNzLmluY2x1ZGVzKCd0ZXh0LWlubGluZScpKSB7XG4gICAgICAgICAgICAgIDxzcGFuPnt7JzAnICsgKGkrMSl9fTwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RlcC10aXRsZVwiIFt0ZXh0Q29udGVudF09XCJzdGVwLnRpdGxlXCI+PC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICBAaWYgKHN0ZXAuc3VidGl0bGUpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VidGl0bGUtd3JhcHBlclwiIFthdHRyLnRpdGxlXT1cInN0ZXAuc3VidGl0bGVcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGVwLXRpdGxlXCIgW3RleHRDb250ZW50XT1cInN0ZXAuc3VidGl0bGVcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwicmVhZF9tb3JlXCIgKGNsaWNrKT1cInJlYWRNb3JlU3VidGl0bGUoKVwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+bW9yZTwvYT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbGk+XG4gICAgfVxuICA8L3VsPlxuPC9kaXY+XG5AaWYgKHR5cGUgIT09ICdkeW5hbWljJykge1xuPGRpdiBjbGFzcz1cImFwcC13aXphcmQtYm9keSBwYW5lbC1ib2R5XCI+XG4gIEBpZiAobWVzc2FnZS5jYXB0aW9uKSB7XG4gICAgPHAgd21NZXNzYWdlIGNhcHRpb24uYmluZD1cIm1lc3NhZ2UuY2FwdGlvblwiIHR5cGUuYmluZD1cIm1lc3NhZ2UudHlwZVwiPjwvcD5cbiAgfVxuICA8bmctY29udGVudCBuZ1Byb2plY3RBcz1cImZvcm1bd21XaXphcmRTdGVwXVwiPjwvbmctY29udGVudD5cbjwvZGl2PlxufVxuQGlmICh0eXBlID09PSAnZHluYW1pYycpIHtcbjxkaXYgY2xhc3M9XCJhcHAtd2l6YXJkLWJvZHkgcGFuZWwtYm9keVwiPlxuICAgIEBpZighZmllbGREZWZzPy5sZW5ndGgpIHtcbiAgICA8ZGl2Pnt7bm9kYXRhbWVzc2FnZX19PC9kaXY+XG4gICAgfVxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImRpdlt3bVJlcGVhdFRlbXBsYXRlXVwiPjwvbmctY29udGVudD5cbjwvZGl2PlxufVxuQGlmKGZpZWxkRGVmcyAmJiBmaWVsZERlZnMubGVuZ3RoIHx8IHR5cGUgIT09ICdkeW5hbWljJykge1xuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ3aXphcmRBY3Rpb25cIj48L25nLWNvbnRhaW5lcj5cbn1cbiJdfQ==
826
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9jb250YWluZXJzL3dpemFyZC9zcmMvd2l6YXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9jb250YWluZXJzL3dpemFyZC9zcmMvd2l6YXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RCxPQUFPLEVBSUgsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsTUFBTSxFQUNOLFFBQVEsRUFFUixRQUFRLEVBQ1IsU0FBUyxFQUNULElBQUksRUFDSixXQUFXLEVBQ2QsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLDJCQUEyQixFQUFFLElBQUksRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMzRCxPQUFPLEVBQ0gsaUJBQWlCLEVBRWpCLGtCQUFrQixFQUNsQixNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLE9BQU8sRUFBRSxlQUFlLEVBQzNCLE1BQU0scUJBQXFCLENBQUM7QUFFN0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9DLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFDLE1BQU0sV0FBVyxDQUFDOzs7Ozs7Ozs7Ozs7SUNyQmxGLDBCQUEyQjs7O0lBSXpCLCtCQUFvQjtJQUFBLFlBQU87SUFBQSxpQkFBTzs7O0lBQWQs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QTBCLDJEQVFBLGlFQVFnQzs7WUE3RHBELGNBQW9EO1lBQXBELCtFQUFvRDtZQUN0RCxjQXlDQztZQXpDRCx3QkF5Q0M7WUFHTCxlQU9DO1lBUEQsaURBT0M7WUFDRCxjQU9DO1lBUEQsaURBT0M7WUFDRCxjQUVDO1lBRkQsMEZBRUM7NEJEdkJXLFlBQVksbUNBQUUsa0JBQWtCOztpRkFTL0IsZUFBZTtjQVgzQixTQUFTOzZCQUNJLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxZQUMvQixlQUFlLGFBRWQ7b0JBQ1Asa0JBQWtCLGlCQUFpQjtvQkFDbkMsRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO2lCQUNuRSxZQUNTLFVBQVU7O3NCQTRGK0QsSUFBSTs7c0JBQUksTUFBTTt1QkFBQyxPQUFPOztzQkFBeUIsTUFBTTt1QkFBQyxrQkFBa0I7O3NCQUFHLFFBQVE7cUJBdkZoSSxLQUFLO2tCQUExQyxlQUFlO21CQUFDLG1CQUFtQjtZQUNxQyxZQUFZO2tCQUFwRixZQUFZO21CQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRTs7a0ZBSjlELGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgV21Db21wb25lbnRzTW9kdWxlIH0gZnJvbSBcIkB3bS9jb21wb25lbnRzL2Jhc2VcIjtcbmltcG9ydCB7XG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBBZnRlclZpZXdDaGVja2VkLFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBRdWVyeUxpc3QsXG4gICAgU2VsZixcbiAgICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtEeW5hbWljQ29tcG9uZW50UmVmUHJvdmlkZXIsIG5vb3B9IGZyb20gJ0B3bS9jb3JlJztcbmltcG9ydCB7XG4gICAgQVBQTFlfU1RZTEVTX1RZUEUsXG4gICAgSVdpZGdldENvbmZpZyxcbiAgICBwcm92aWRlQXNXaWRnZXRSZWYsXG4gICAgc3R5bGVyLFxuICAgIFN0eWxhYmxlQ29tcG9uZW50LFxuICAgIENvbnRleHQsIGNyZWF0ZUFycmF5RnJvbVxufSBmcm9tICdAd20vY29tcG9uZW50cy9iYXNlJztcblxuaW1wb3J0IHsgcmVnaXN0ZXJQcm9wcyB9IGZyb20gJy4vd2l6YXJkLnByb3BzJztcblxuaW1wb3J0IHtXaXphcmRTdGVwQ29tcG9uZW50fSBmcm9tIFwiLi93aXphcmQtc3RlcC93aXphcmQtc3RlcC5jb21wb25lbnRcIjtcbmltcG9ydCB7ZmluZCwgZmluZEluZGV4LCBmb3JFYWNoLCBnZXQsIGluZGV4T2YsIGlzQXJyYXksIGlzTnVtYmVyLCBpc1N0cmluZ30gZnJvbSBcImxvZGFzaC1lc1wiO1xuXG5jb25zdCBERUZBVUxUX0NMUyA9ICdhcHAtd2l6YXJkIHBhbmVsIGNsZWFyZml4JztcbmNvbnN0IFdJREdFVF9DT05GSUc6IElXaWRnZXRDb25maWcgPSB7XG4gICAgd2lkZ2V0VHlwZTogJ3dtLXdpemFyZCcsXG4gICAgaG9zdENsYXNzOiBERUZBVUxUX0NMU1xufTtcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFdtQ29tcG9uZW50c01vZHVsZV0sXG4gICAgc2VsZWN0b3I6ICdkaXZbd21XaXphcmRdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vd2l6YXJkLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgcHJvdmlkZUFzV2lkZ2V0UmVmKFdpemFyZENvbXBvbmVudCksXG4gICAgICAgIHtwcm92aWRlOiBDb250ZXh0LCB1c2VGYWN0b3J5OiAoKSA9PiB7IHJldHVybiB7fSB9LCBtdWx0aTogdHJ1ZX1cbiAgICBdLFxuICAgIGV4cG9ydEFzOiAnd21XaXphcmQnXG59KVxuZXhwb3J0IGNsYXNzIFdpemFyZENvbXBvbmVudCBleHRlbmRzIFN0eWxhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkIHtcbiAgICBzdGF0aWMgaW5pdGlhbGl6ZVByb3BzID0gcmVnaXN0ZXJQcm9wcygpO1xuXG4gICAgQENvbnRlbnRDaGlsZHJlbihXaXphcmRTdGVwQ29tcG9uZW50KSBzdGVwczogUXVlcnlMaXN0PFdpemFyZFN0ZXBDb21wb25lbnQ+O1xuICAgIEBDb250ZW50Q2hpbGQoJ3dpemFyZEFjdGlvbicsIHsgcmVhZDogVGVtcGxhdGVSZWYsIGRlc2NlbmRhbnRzOiBmYWxzZSB9KSB3aXphcmRBY3Rpb246IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBwdWJsaWMgbWVzc2FnZToge2NhcHRpb246IHN0cmluZywgdHlwZTogc3RyaW5nfTtcbiAgICBwdWJsaWMgY3VycmVudFN0ZXA6IFdpemFyZFN0ZXBDb21wb25lbnQ7XG5cbiAgICBwdWJsaWMgc3RlcENsYXNzOiBzdHJpbmc7XG4gICAgcHVibGljIGNsYXNzO1xuICAgIHB1YmxpYyBuYW1lO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvbWlzZVJlc29sdmVyRm46IEZ1bmN0aW9uO1xuICAgIHB1YmxpYyBhY3Rpb25zYWxpZ25tZW50OiBhbnk7XG4gICAgcHVibGljIGNhbmNlbGFibGU6IGFueTtcbiAgICBwdWJsaWMgZW5hYmxlbmV4dDogYW55O1xuICAgIHB1YmxpYyB3aXpDb250ZXh0OiBhbnk7XG4gICAgcHVibGljIGNhbmNlbGJ0bmxhYmVsOiBhbnk7XG4gICAgcHVibGljIGRvbmVidG5sYWJlbDogYW55O1xuICAgIHB1YmxpYyBwcmV2aW91c2J0bmxhYmVsOiBhbnk7XG4gICAgcHVibGljIG5leHRidG5sYWJlbDogYW55O1xuICAgIHB1YmxpYyBkZWZhdWx0c3RlcDtcbiAgICBwdWJsaWMgZmllbGREZWZzO1xuICAgIHB1YmxpYyB0eXBlO1xuICAgIHB1YmxpYyBub2RhdGFtZXNzYWdlO1xuICAgIHByaXZhdGUgZHluYW1pY0NvbXBvbmVudFByb3ZpZGVyO1xuICAgIHByaXZhdGUgX2R5bmFtaWNDb250ZXh0O1xuICAgIHByaXZhdGUgZHluYW1pY1N0ZXBJbmRleDtcbiAgICBwdWJsaWMgZHluYW1pY1dpemFyZDtcbiAgICBwdWJsaWMgZGVmYXVsdHN0ZXBpbmRleDtcbiAgICBwcml2YXRlIF9pc0ZpcnN0TG9hZDogYm9vbGVhbiA9IHRydWU7XG4gICAgcHVibGljIGF1dG9BY3RpdmF0aW9uOmJvb2xlYW47XG5cbiAgICBnZXQgaGFzUHJldlN0ZXAoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5faXNGaXJzdFN0ZXAodGhpcy5jdXJyZW50U3RlcCk7XG4gICAgfVxuXG4gICAgZ2V0IGhhc05leHRTdGVwKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuX2lzTGFzdFN0ZXAodGhpcy5jdXJyZW50U3RlcCk7XG4gICAgfVxuXG4gICAgZ2V0IHNob3dEb25lQnRuKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFN0ZXApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXRoaXMuaGFzTmV4dFN0ZXAgJiYgdGhpcy5jdXJyZW50U3RlcC5lbmFibGVEb25lO1xuICAgIH1cblxuICAgIGdldCBlbmFibGVQcmV2KCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFN0ZXApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RlcC5lbmFibGVQcmV2O1xuICAgIH1cblxuICAgIGdldCBlbmFibGVOZXh0KCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFN0ZXApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5lbmFibGVuZXh0ID8gdHJ1ZSA6ICh0aGlzLmN1cnJlbnRTdGVwLmVuYWJsZU5leHQgJiYgdGhpcy5jdXJyZW50U3RlcC5pc1ZhbGlkKTtcbiAgICB9XG5cbiAgICBnZXQgZW5hYmxlRG9uZSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRTdGVwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0ZXAuZW5hYmxlRG9uZSAmJiB0aGlzLmN1cnJlbnRTdGVwLmlzVmFsaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJucyBjdXJyZW50IHN0ZXAgaW5kZXggb2YgdGhlIFdpemFyZCdzIGN1cnJlbnQgc3RlcFxuICAgICAqL1xuICAgIGdldCBjdXJyZW50U3RlcEluZGV4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGVwSW5kZXhCeVJlZih0aGlzLmN1cnJlbnRTdGVwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIHdlYXRoZXIgdGhlIGN1cnJlbnQgc3RlcCBpcyBmaXJzdCBzdGVwIG9yIG5vdFxuICAgICAqL1xuICAgIGdldCBpc0ZpcnN0U3RlcCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRmlyc3RTdGVwKHRoaXMuY3VycmVudFN0ZXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybnMgd2VhdGhlciB0aGUgY3VycmVudCBzdGVwIGlzIGxhc3Qgc3RlcCBvciBub3RcbiAgICAgKi9cbiAgICBnZXQgaXNMYXN0U3RlcCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzTGFzdFN0ZXAodGhpcy5jdXJyZW50U3RlcCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoaW5qOiBJbmplY3RvciwgZHluYW1pY0NvbXBvbmVudFByb3ZpZGVyOiBEeW5hbWljQ29tcG9uZW50UmVmUHJvdmlkZXIsIEBTZWxmKCkgQEluamVjdChDb250ZXh0KSBjb250ZXh0czogQXJyYXk8YW55PiwgQEluamVjdCgnRVhQTElDSVRfQ09OVEVYVCcpIEBPcHRpb25hbCgpIGV4cGxpY2l0Q29udGV4dDogYW55KSB7XG4gICAgICAgIGxldCByZXNvbHZlRm46IEZ1bmN0aW9uID0gbm9vcDtcblxuICAgICAgICBzdXBlcihpbmosIFdJREdFVF9DT05GSUcsIGV4cGxpY2l0Q29udGV4dCwgbmV3IFByb21pc2UocmVzID0+IHJlc29sdmVGbiA9IHJlcykpO1xuICAgICAgICBzdHlsZXIodGhpcy5uYXRpdmVFbGVtZW50LCB0aGlzLCBBUFBMWV9TVFlMRVNfVFlQRS5TSEVMTCk7XG5cbiAgICAgICAgdGhpcy5wcm9taXNlUmVzb2x2ZXJGbiA9IHJlc29sdmVGbjtcblxuICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBtZXNzYWdlIG9iamVjdCB3aXRoIGRlZmF1bHQgdmFsdWVzXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGNhcHRpb246ICcnLFxuICAgICAgICAgICAgdHlwZTogJydcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy53aXpDb250ZXh0ID0gY29udGV4dHNbMF07XG4gICAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFByb3ZpZGVyID0gZHluYW1pY0NvbXBvbmVudFByb3ZpZGVyO1xuICAgICAgICB0aGlzLmR5bmFtaWNXaXphcmQgPSBbXTtcbiAgICAgICAgdGhpcy5keW5hbWljU3RlcEluZGV4ID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBkeW5hbWljIHN0ZXBzLlxuICAgICAqIEFmdGVyIGFsbCBzdGVwcyBhcmUgaW5pdGlhbHplZCwgdXBkYXRlIHRoZSBxdWVyeWxpc3QgbWFudWFsbHkgYmFzZWQgb24gaW5kZXguXG4gICAgICogQHBhcmFtIHN0ZXBSZWYgLSByZWZyZW5jZSBvZiB0aGUgd2l6YXJkc3RlcFxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3RlckR5bmFtaWNTdGVwKHN0ZXBSZWYpIHtcbiAgICAgICAgdGhpcy5keW5hbWljV2l6YXJkLnB1c2goc3RlcFJlZik7XG4gICAgICAgIGNvbnN0IGlzTGFzdFN0ZXAgPSAgdGhpcy5keW5hbWljV2l6YXJkLmxlbmd0aCA9PT0gdGhpcy5keW5hbWljU3RlcEluZGV4O1xuICAgICAgICBpZiAoaXNMYXN0U3RlcCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmR5bmFtaWNXaXphcmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdTdGVwUmVmICA9IGZpbmQodGhpcy5keW5hbWljV2l6YXJkLCBzdGVwID0+IHN0ZXAuZHluYW1pY1N0ZXBJbmRleCA9PT0gaSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNTdGVwQWxyZWFkeUV4aXN0ID0gZmluZCh0aGlzLnN0ZXBzLnRvQXJyYXkoKSwgbmV3U3RlcFJlZik7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1N0ZXBBbHJlYWR5RXhpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGVwcy5yZXNldChbLi4udGhpcy5zdGVwcy50b0FycmF5KCksIG5ld1N0ZXBSZWZdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0ZXBSZWYuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGVwUmVmLnNlbGVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdG8gYWRkIHRoZSB3aXphcmQgc3RlcCBkeW5hbWljYWxseVxuICAgICAqIEBwYXJhbSB3aXphcmRTdGVwcyAtIGxpc3Qgb2Ygd2l6YXJkc3RlcHNcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkU3RlcCh3aXphcmRTdGVwcykge1xuICAgICAgICBpZiAoIWlzQXJyYXkod2l6YXJkU3RlcHMpKSB7XG4gICAgICAgICAgICB3aXphcmRTdGVwcyA9IFt3aXphcmRTdGVwc107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RlcE5hbWVzTGlzdCA9IFtdO1xuICAgICAgICBmb3JFYWNoKHdpemFyZFN0ZXBzLCAoc3RlcCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzU3RlcEFscmVhZHlDcmVhdGVkID0gZmluZCh0aGlzLnN0ZXBzLnRvQXJyYXkoKSwge25hbWU6IHN0ZXAubmFtZX0pO1xuICAgICAgICAgICAgY29uc3QgaXNTdGVwTmFtZUV4aXN0ID0gaW5kZXhPZihzdGVwTmFtZXNMaXN0LCBzdGVwLm5hbWUpO1xuICAgICAgICAgICAgLy8gSWYgdXNlciB0cmllcyB0byBhZGQgd2l6YXJkc3RlcCB3aXRoIHRoZSBzYW1lIG5hbWUgd2hpY2ggaXMgYWxyZWFkeSBleGlzdHMgdGhlbiBkbyBub3QgY3JlYXRlIHRoZSBzdGVwXG4gICAgICAgICAgICBpZiAoaXNTdGVwQWxyZWFkeUNyZWF0ZWQgfHwgaXNTdGVwTmFtZUV4aXN0ID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgVGhlIHdpemFyZCBzdGVwIHdpdGggbmFtZSAke3N0ZXAubmFtZX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBwYXJhbU1hcmt1cCA9ICcnO1xuICAgICAgICAgICAgbGV0IHByb3BzVG1wbCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5keW5hbWljU3RlcEluZGV4Kys7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gc3RlcC5uYW1lID8gc3RlcC5uYW1lIDogYHdpemFyZHN0ZXAke3RoaXMuc3RlcHMudG9BcnJheSgpLmxlbmd0aCArIChpbmRleCArIDEpfWA7XG4gICAgICAgICAgICBzdGVwTmFtZXNMaXN0LnB1c2gobmFtZSk7XG4gICAgICAgICAgICBjb25zdCBwYXJ0aWFsUGFyYW1zID0gZ2V0KHN0ZXAsICdwYXJhbXMnKTtcblxuICAgICAgICAgICAgZm9yRWFjaChzdGVwLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgIT09ICdwYXJhbXMnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzVG1wbCA9IGAke3Byb3BzVG1wbH0gJHtrZXl9PVwiJHt2YWx1ZX1cImA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGZvckVhY2gocGFydGlhbFBhcmFtcywgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBwYXJhbU1hcmt1cCA9IGAke3BhcmFtTWFya3VwfSA8d20tcGFyYW0gbmFtZT1cIiR7a2V5fVwiIHZhbHVlPVwiJHt2YWx1ZX1cIj48L3dtLXBhcmFtPmA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG1hcmt1cCA9IGA8d20td2l6YXJkc3RlcCBkeW5hbWljU3RlcEluZGV4PVwiJHt0aGlzLmR5bmFtaWNTdGVwSW5kZXggLSAxfVwiIGlzZHluYW1pYz1cInRydWVcIiBuYW1lPVwiJHtuYW1lfVwiICR7cHJvcHNUbXBsfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3BhcmFtTWFya3VwfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC93bS13aXphcmRzdGVwPmA7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5fZHluYW1pY0NvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9keW5hbWljQ29udGV4dCA9IE9iamVjdC5jcmVhdGUodGhpcy52aWV3UGFyZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9keW5hbWljQ29udGV4dFt0aGlzLmdldEF0dHIoJ3dtV2l6YXJkJyldID0gdGhpcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5keW5hbWljQ29tcG9uZW50UHJvdmlkZXIuYWRkQ29tcG9uZW50KHRoaXMuZ2V0TmF0aXZlRWxlbWVudCgpLnF1ZXJ5U2VsZWN0b3IoJy5hcHAtd2l6YXJkLWJvZHknKSwgbWFya3VwLCB0aGlzLl9keW5hbWljQ29udGV4dCwge2luajogdGhpcy5pbmp9KTtcblxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHN0ZXBOYW1lc0xpc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdG8gcmVtb3ZlIHRoZSB3aXphcmQgc3RlcFxuICAgICAqIEBwYXJhbSBzdGVwIC0gaW5kZXggb3IgbmFtZSBvZiB0aGUgc3RlcFxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVTdGVwKHN0ZXA6IG51bWJlciB8IHN0cmluZykge1xuICAgICAgICBjb25zdCBzdGVwUmVmID0gaXNTdHJpbmcoc3RlcCkgPyB0aGlzLmdldFN0ZXBSZWZCeU5hbWUoc3RlcCkgOiBpc051bWJlcihzdGVwKVxuICAgICAgICAgICAgPyB0aGlzLmdldFN0ZXBSZWZCeUluZGV4KHN0ZXApIDogbnVsbDtcbiAgICAgICAgc3RlcFJlZiA/IHN0ZXBSZWYucmVtb3ZlKCkgOiBjb25zb2xlLndhcm4oYENvdWxkIG5vdCBmaW5kIHN0ZXAgd2l0aCBuYW1lIG9yIGluZGV4ICcke3N0ZXB9JyB0byByZW1vdmVgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIG5leHQgdmFsaWQgc3RlcC4gdGhlIGluZGV4IHBhc3NlZCBpcyBhbHNvIGNoZWNrZWQgaWYgaXRzIHZhbGlkIHN0ZXBcbiAgICAgKiBAcGFyYW0gaW5kZXhcbiAgICAgKiBAcmV0dXJucyB7V2l6YXJkU3RlcENvbXBvbmVudH1cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldE5leHRWYWxpZFN0ZXBGb3JtSW5kZXgoaW5kZXg6IG51bWJlcik6IFdpemFyZFN0ZXBDb21wb25lbnQge1xuICAgICAgICBmb3IgKGxldCBpID0gaW5kZXg7IGkgPCB0aGlzLnN0ZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVwID0gdGhpcy5nZXRTdGVwUmVmQnlJbmRleChpKTtcbiAgICAgICAgICAgIGlmIChzdGVwLnNob3cpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybnMgcHJldmlvdXMgdmFsaWQgc3RlcC4gdGhlIGluZGV4IHBhc3NlZCBpcyBhbHNvIGNoZWNrZWQgaWYgaXRzIHZhbGlkIHN0ZXBcbiAgICAgKiBAcGFyYW0gaW5kZXhcbiAgICAgKiBAcmV0dXJucyB7V2l6YXJkU3RlcENvbXBvbmVudH1cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFByZXZpb3VzVmFsaWRTdGVwRm9ybUluZGV4KGluZGV4OiBudW1iZXIpOiBXaXphcmRTdGVwQ29tcG9uZW50IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4OyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3Qgc3RlcCA9IHRoaXMuZ2V0U3RlcFJlZkJ5SW5kZXgoaSk7XG4gICAgICAgICAgICBpZiAoc3RlcC5zaG93KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIGN1cnJlbnQgc3RlcCBpbmRleCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0Q3VycmVudFN0ZXBJbmRleCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGVwSW5kZXhCeVJlZih0aGlzLmN1cnJlbnRTdGVwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIHN0ZXBSZWYgd2hlbiBpbmRleCBpcyBwYXNzZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gICAgICogQHJldHVybnMge1dpemFyZFN0ZXBDb21wb25lbnR9XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRTdGVwUmVmQnlJbmRleChpbmRleDogbnVtYmVyKTogV2l6YXJkU3RlcENvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0ZXBzLnRvQXJyYXkoKVtpbmRleF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJucyB0aGUgaW5kZXggdmFsdWUgb2YgdGhlIHN0ZXAuXG4gICAgICogQHBhcmFtIHtXaXphcmRTdGVwQ29tcG9uZW50fSB3aXphcmRTdGVwXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFN0ZXBJbmRleEJ5UmVmKHdpemFyZFN0ZXA6IFdpemFyZFN0ZXBDb21wb25lbnQpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGVwcy50b0FycmF5KCkuaW5kZXhPZih3aXphcmRTdGVwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBnZXRzIHN0ZXBSZWYgYnkgc2VhcmNoaW5nIG9uIHRoZSBuYW1lIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybnMge1dpemFyZFN0ZXBDb21wb25lbnR9XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRTdGVwUmVmQnlOYW1lKG5hbWU6IHN0cmluZyk6IFdpemFyZFN0ZXBDb21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGVwcy5maW5kKHN0ZXAgPT4gc3RlcC5uYW1lID09PSBuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBzZXRzIGRlZmF1bHQgc3RlcCBhcyBjdXJyZW50IHN0ZXAgaWYgY29uZmlndXJlZFxuICAgICAqIG9yIGZpbmRzIGZpcnN0IHZhbGlkIHN0ZXAgYW5kIHNldCBpdCBhcyBjdXJyZW50IHN0ZXAuXG4gICAgICogQHBhcmFtIHtXaXphcmRTdGVwQ29tcG9uZW50fSBzdGVwXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXREZWZhdWx0U3RlcChzdGVwOiBXaXphcmRTdGVwQ29tcG9uZW50KSB7XG4gICAgICAgIC8vIElmIHRoZSBkZWZhdWx0IHN0ZXAgaGFzIHNob3cgdHJ1ZSB0aGVuIG9ubHkgdXBkYXRlIHRoZSBjdXJyZW50U3RlcFxuICAgICAgICBpZiAoc3RlcCAmJiBzdGVwLnNob3cpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZXAgPSBzdGVwO1xuICAgICAgICAgICAgc3RlcC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgc3RlcC5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIE1hcmsgYWxsIHByZXZpb3VzIHN0ZXAgc3RhdHVzIENPTVBMRVRFRFxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5nZXRTdGVwSW5kZXhCeVJlZihzdGVwKSAtIDE7XG4gICAgICAgICAgICB3aGlsZSAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZTdGVwID0gdGhpcy5nZXRTdGVwUmVmQnlJbmRleChpbmRleCk7XG4gICAgICAgICAgICAgICAgcHJldlN0ZXAuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcHJldlN0ZXAuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaW5kZXgtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNldCBuZXh0IHZhbGlkIHN0ZXAgYXMgY3VycmVudCBzdGVwXG4gICAgICAgICAgICBzdGVwID0gdGhpcy5nZXROZXh0VmFsaWRTdGVwRm9ybUluZGV4KDApO1xuICAgICAgICAgICAgaWYgKHN0ZXApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERlZmF1bHRTdGVwKHN0ZXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkTW9yZVRleHQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3RzIHRoZSBhc3NvY2lhdGVkIHN0ZXAgd2hlbiB0aGUgd2l6YXJkIGhlYWRlciBpcyBjbGlja2VkLlxuICAgICAqIEBwYXJhbSAkZXZlbnRcbiAgICAgKiBAcGFyYW0ge1dpemFyZFN0ZXBDb21wb25lbnR9IGN1cnJlbnRTdGVwXG4gICAgICovXG4gICAgcHJpdmF0ZSBvbldpemFyZEhlYWRlckNsaWNrKCRldmVudDogRXZlbnQsIGN1cnJlbnRTdGVwOiBXaXphcmRTdGVwQ29tcG9uZW50KSB7XG4gICAgICAgIC8vIHNlbGVjdCB0aGUgc3RlcCBpZiBpdCdzIHN0YXR1cyBpcyBkb25lXG4gICAgICAgIGlmIChjdXJyZW50U3RlcC5kb25lKSB7XG4gICAgICAgICAgICAvLyBzZXQgYWxsIHRoZSBuZXh0IHN0ZXBzIHN0YXR1cyBhcyBkaXNhYmxlZCBhbmQgcHJldmlvdXMgc3RlcHMgYXMgZG9uZVxuICAgICAgICAgICAgdGhpcy5zdGVwcy5mb3JFYWNoKChzdGVwLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IHRoaXMuZ2V0U3RlcEluZGV4QnlSZWYoY3VycmVudFN0ZXApKSB7XG4gICAgICAgICAgICAgICAgICAgc3RlcC5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICBzdGVwLmlzRG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHN0ZXAuaXNEb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBzZXQgdGhlIHNlbGVjdGVkIHN0ZXAgYXMgY3VycmVudCBzdGVwIGFuZCBtYWtlIGl0IGFjdGl2ZVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlcCA9IGN1cnJlbnRTdGVwO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlcC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5hZGRNb3JlVGV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1Byb21pc2UgPSAob2JqKSA9PiBvYmogaW5zdGFuY2VvZiBQcm9taXNlIHx8IChvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9iai50aGVuID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouY2F0Y2ggPT09ICdmdW5jdGlvbicpO1xuXG4gICAgLy8gTWV0aG9kIHRvIG5hdmlnYXRlIHRvIG5leHQgc3RlcFxuXG4gICAgcHJpdmF0ZSBoYW5kbGVOZXh0KHZhbHVlOiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiwgY3VycmVudFN0ZXAsIGN1cnJlbnRTdGVwSW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNQcm9taXNlKHZhbHVlKSkge1xuICAgICAgICAgICAgKHZhbHVlIGFzIFByb21pc2U8Ym9vbGVhbj4pLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmV4dGVuZE5leHRGbihjdXJyZW50U3RlcCwgY3VycmVudFN0ZXBJbmRleCk7XG4gICAgICAgICAgICB9LCBlcnIgPT4gZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmV4dGVuZE5leHRGbihjdXJyZW50U3RlcCwgY3VycmVudFN0ZXBJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmV4dChldmVudE5hbWU6IHN0cmluZyA9ICduZXh0Jykge1xuICAgICAgICBjb25zdCBjdXJyZW50U3RlcCA9IHRoaXMuY3VycmVudFN0ZXA7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGVwSW5kZXggPSB0aGlzLmdldEN1cnJlbnRTdGVwSW5kZXgoKTtcblxuICAgICAgICAvLyBhYm9ydCBpZiBvblNraXAgbWV0aG9kIHJldHVybnMgZmFsc2VcbiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gJ3NraXAnKSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9ICBjdXJyZW50U3RlcC5pbnZva2VTa2lwQ0IoY3VycmVudFN0ZXBJbmRleCk7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU5leHQocmVzcG9uc2UsIGN1cnJlbnRTdGVwLCBjdXJyZW50U3RlcEluZGV4KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRTdGVwLmlzVmFsaWQgJiYgZXZlbnROYW1lID09PSAnbmV4dCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlICA9ICBjdXJyZW50U3RlcC5pbnZva2VOZXh0Q0IoY3VycmVudFN0ZXBJbmRleCk7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU5leHQocmVzcG9uc2UsIGN1cnJlbnRTdGVwLCBjdXJyZW50U3RlcEluZGV4KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVuYWJsZW5leHQgJiYgIXRoaXMuY3VycmVudFN0ZXAuaXNWYWxpZCl7XG4gICAgICAgICAgICBBcnJheS5mcm9tKCg8YW55PnRoaXMpLmN1cnJlbnRTdGVwLmdldEFsbEVtYmVkZGVkRm9ybXMoKSk/LmZvckVhY2goKGZvcm06YW55KSA9PiB7XG4gICAgICAgICAgICAgICAgZm9ybS53aWRnZXQuaGlnaGxpZ2h0SW52YWxpZEZpZWxkcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpbnZhbGlkRm9ybUlucHV0RWxlbWVudCA9IHRoaXMuY3VycmVudFN0ZXAubmF0aXZlRWxlbWVudD8ucXVlcnlTZWxlY3RvcihcImlucHV0Lm5nLWludmFsaWRcIikgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgICAgIGludmFsaWRGb3JtSW5wdXRFbGVtZW50Py5mb2N1cygpO1xuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGV4dGVuZE5leHRGbihjdXJyZW50U3RlcCwgY3VycmVudFN0ZXBJbmRleCkge1xuICAgICAgICBjb25zdCBuZXh0U3RlcDogV2l6YXJkU3RlcENvbXBvbmVudCA9IHRoaXMuZ2V0TmV4dFZhbGlkU3RlcEZvcm1JbmRleChjdXJyZW50U3RlcEluZGV4ICsgMSk7XG4gICAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgc3RlcHMgd2hpY2ggaGFzIHNob3cgdGhlbiBvbmx5IGNoYW5nZSBzdGF0ZSBvZiBjdXJyZW50IHN0ZXAgZWxzZSByZW1haW4gc2FtZVxuICAgICAgICBpZiAobmV4dFN0ZXApIHtcbiAgICAgICAgICAgIG5leHRTdGVwLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgY3VycmVudFN0ZXAuaXNEb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIGN1cnJlbnRTdGVwLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgbmV4dFN0ZXAuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZXAgPSBuZXh0U3RlcDtcbiAgICAgICAgICAgIC8vIFJlbW92ZSAnY3VycmVudCcgY2xhc3MgZnJvbSBhbGwgd2l6YXJkIHN0ZXBzIGluIGhlYWRlclxuICAgICAgICAgICAgY29uc3QgYWxsU3RlcEl0ZW1zID0gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpW2RhdGEtc3RlcGlkXScpO1xuICAgICAgICAgICAgYWxsU3RlcEl0ZW1zLmZvckVhY2goKGVsOiBFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnY3VycmVudCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ2EnKTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuY2hvci5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBBZGQgJ2N1cnJlbnQnIHRvIG5leHQgc3RlcCBoZWFkZXIgaXRlbVxuICAgICAgICAgICAgY29uc3QgbmV3U3RlcExpID0gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYGxpW2RhdGEtc3RlcGlkPVwiJHtuZXh0U3RlcC53aWRnZXRJZH1cIl1gKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1N0ZXBBbmNob3IgPSBuZXdTdGVwTGk/LnF1ZXJ5U2VsZWN0b3IoJ2EnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChuZXdTdGVwTGkgJiYgbmV3U3RlcEFuY2hvcikge1xuICAgICAgICAgICAgICAgIG5ld1N0ZXBMaS5jbGFzc0xpc3QuYWRkKCdjdXJyZW50Jyk7XG4gICAgICAgICAgICAgICAgbmV3U3RlcEFuY2hvci5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgICAgICAgICBuZXdTdGVwQW5jaG9yLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0ZXBGb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkTW9yZVRleHQoKTtcbiAgICB9XG4gICAgLy8gTWV0aG9kIHRvIG5hdmlnYXRlIHRvIHByZXZpb3VzIHN0ZXBcbiAgICBwdWJsaWMgcHJldigpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFN0ZXAgPSB0aGlzLmN1cnJlbnRTdGVwO1xuICAgICAgICBjb25zdCBjdXJyZW50U3RlcEluZGV4ID0gdGhpcy5nZXRDdXJyZW50U3RlcEluZGV4KCk7XG5cbiAgICAgICAgLy8gYWJvcnQgaWYgb25QcmV2IG1ldGhvZCByZXR1cm5zIGZhbHNlLlxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGN1cnJlbnRTdGVwLmludm9rZVByZXZDQihjdXJyZW50U3RlcEluZGV4KTtcbiAgICAgICAgaWYgKHRoaXMuaXNQcm9taXNlKHJlc3BvbnNlKSkge1xuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIFByb21pc2U8Ym9vbGVhbj4pLnRoZW4oIHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5leHRlbmRQcmV2Rm4oY3VycmVudFN0ZXAsIGN1cnJlbnRTdGVwSW5kZXgpO1xuICAgICAgICAgICAgfSwgZXJyID0+IGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5leHRlbmRQcmV2Rm4oY3VycmVudFN0ZXAsIGN1cnJlbnRTdGVwSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleHRlbmRQcmV2Rm4oY3VycmVudFN0ZXAsIGN1cnJlbnRTdGVwSW5kZXgpe1xuICAgICAgICBjb25zdCBwcmV2U3RlcDogV2l6YXJkU3RlcENvbXBvbmVudCA9IHRoaXMuZ2V0UHJldmlvdXNWYWxpZFN0ZXBGb3JtSW5kZXgoY3VycmVudFN0ZXBJbmRleCAtIDEpO1xuXG4gICAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgc3RlcHMgd2hpY2ggaGFzIHNob3cgdGhlbiBvbmx5IGNoYW5nZSBzdGF0ZSBvZiBjdXJyZW50IHN0ZXAgZWxzZSByZW1haW4gc2FtZVxuICAgICAgICBpZiAocHJldlN0ZXApIHtcbiAgICAgICAgICAgIGN1cnJlbnRTdGVwLmlzRG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgY3VycmVudFN0ZXAuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcHJldlN0ZXAuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZXAgPSBwcmV2U3RlcDtcbiAgICAgICAgICAgIC8vICBSZW1vdmUgJ2N1cnJlbnQnIGNsYXNzIGZyb20gYWxsIHN0ZXBzXG4gICAgICAgICAgICBjb25zdCBhbGxTdGVwSXRlbXMgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlbZGF0YS1zdGVwaWRdJyk7XG4gICAgICAgICAgICBhbGxTdGVwSXRlbXMuZm9yRWFjaCgoZWw6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdjdXJyZW50Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gZWwucXVlcnlTZWxlY3RvcignYScpO1xuICAgICAgICAgICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5jaG9yLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIEFwcGx5ICdjdXJyZW50JyB0byBwcmV2IHN0ZXBcbiAgICAgICAgICAgIGNvbnN0IHByZXZTdGVwTGkgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihgbGlbZGF0YS1zdGVwaWQ9XCIke3ByZXZTdGVwLndpZGdldElkfVwiXWApO1xuICAgICAgICAgICAgY29uc3QgcHJldlN0ZXBBbmNob3IgPSBwcmV2U3RlcExpPy5xdWVyeVNlbGVjdG9yKCdhJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAocHJldlN0ZXBMaSAmJiBwcmV2U3RlcEFuY2hvcikge1xuICAgICAgICAgICAgICAgIHByZXZTdGVwTGkuY2xhc3NMaXN0LmFkZCgnY3VycmVudCcpO1xuICAgICAgICAgICAgICAgIHByZXZTdGVwQW5jaG9yLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgICAgICAgICAgIHByZXZTdGVwQW5jaG9yLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0ZXBGb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkTW9yZVRleHQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2tpcCgpIHtcbiAgICAgICAgdGhpcy5uZXh0KCdza2lwJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTmF2aWdhdGVzIHRvIHRoZSBnaXZlbiBzdGVwIGJhc2VkIG9uIHN0ZXAgbmFtZSBvciBzdGVwIGluZGV4XG4gICAgICogVGhpcyB3aWxsIHdvcmsgb25seSBpZiB0aGUgc3RlcCBpcyBhbHJlYWR5IGluIGRvbmUgc3RhdGVcbiAgICAgKiBAcGFyYW0gc3RlcFxuICAgICAqL1xuICAgIHB1YmxpYyBnb3RvU3RlcChzdGVwOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICAgICAgbGV0IGdvdG9TdGVwSW5kZXg6IG51bWJlcjtcbiAgICAgICAgaWYgKGlzU3RyaW5nKHN0ZXApKSB7XG4gICAgICAgICAgICBnb3RvU3RlcEluZGV4ID0gdGhpcy5zdGVwcy50b0FycmF5KCkubWFwKHN0ZXAgPT4gc3RlcC5uYW1lKS5pbmRleE9mKHN0ZXApO1xuICAgICAgICAgICAgaWYgKGdvdG9TdGVwSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQ291bGQgbm90IGZpbmQgc3RlcCAnJHtzdGVwfSdgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoc3RlcCkgJiYgc3RlcCA+PSAwKSB7XG4gICAgICAgICAgICBnb3RvU3RlcEluZGV4ID0gc3RlcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJJbnZhbGlkIHN0ZXAgbmFtZSBvciBpbmRleCBwcm92aWRlZFwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdvdG9TdGVwOiBXaXphcmRTdGVwQ29tcG9uZW50ID0gdGhpcy5nZXRTdGVwUmVmQnlJbmRleChnb3RvU3RlcEluZGV4KTtcblxuICAgICAgICBpZiAoZ290b1N0ZXA/LnNob3cpIHtcbiAgICAgICAgICAgIHRoaXMub25XaXphcmRIZWFkZXJDbGljayhldmVudCwgZ290b1N0ZXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRoZSBnb3RvU3RlcCBmdW5jdGlvbiBjYW5ub3QgbmF2aWdhdGUgdG8gaGlkZGVuIHN0ZXBzXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWV0aG9kIHRvIGludm9rZSBvbi1Eb25lIGV2ZW50IG9uIHdpemFyZFxuICAgIHB1YmxpYyBkb25lKCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwLmlzRG9uZSA9IHRydWU7XG4gICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnZG9uZScsIHtzdGVwczogdGhpcy5zdGVwcy50b0FycmF5KCl9KTtcbiAgICB9XG4gICAgLy8gTWV0aG9kIHRvIGludm9rZSBvbi1DYW5jZWwgZXZlbnQgb24gd2l6YXJkXG4gICAgcHVibGljIGNhbmNlbCAoKSB7XG4gICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnY2FuY2VsJywge3N0ZXBzOiB0aGlzLnN0ZXBzLnRvQXJyYXkoKX0pO1xuICAgIH1cbiAgICBwdWJsaWMgYWRkTW9yZVRleHQoKXtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cblxuICAgICAgICB2YXIgbmV3V2luZG93V2lkdGggPSAkKHdpbmRvdykud2lkdGgoKTtcbiAgICAgICAgaWYobmV3V2luZG93V2lkdGggPCA3Njgpe1xuICAgICAgICAkKFwiLmFwcC13aXphcmQtc3RlcC5jdXJyZW50IC5zdWJ0aXRsZS13cmFwcGVyIC5zdGVwLXRpdGxlXCIpLmNzcyh7XCJoZWlnaHRcIjpcImF1dG9cIixcImRpc3BsYXlcIjpcImJsb2NrXCJ9KTtcbiAgICAgICAgdmFyIHN1YnRpdGxlVGV4dExlbmd0aCA9ICQoXCIuYXBwLXdpemFyZC1zdGVwLmN1cnJlbnQgLnN1YnRpdGxlLXdyYXBwZXIgLnN0ZXAtdGl0bGVcIikuaGVpZ2h0KCk7XG4gICAgICAgICQoXCIucmVhZF9tb3JlXCIpLmNzcyhcImRpc3BsYXlcIixcIm5vbmVcIik7XG4gICAgICAgICQoXCIuY3VycmVudCAuc3VidGl0bGUtd3JhcHBlclwiKS5yZW1vdmVDbGFzcyhcInJlYWRtb3JlX3N1YnRpdGxlXCIpO1xuXG4gICAgICAgIGlmKHN1YnRpdGxlVGV4dExlbmd0aD40NCl7XG4gICAgICAgICAgICAkKFwiLmFwcC13aXphcmQtc3RlcC5jdXJyZW50IC5zdWJ0aXRsZS13cmFwcGVyIC5zdGVwLXRpdGxlXCIpLmNzcyh7XCJoZWlnaHRcIjpcIjQ0cHhcIixcImRpc3BsYXlcIjpcIi13ZWJraXQtYm94XCJ9KTtcbiAgICAgICAgICAgICQoXCIuY3VycmVudCAucmVhZF9tb3JlXCIpLmNzcyhcImRpc3BsYXlcIixcImJsb2NrXCIpO1xuICAgICAgICAgICAgJChcIi5hY3RpdmUgLnJlYWRfbW9yZVwiKS5jc3MoXCJkaXNwbGF5XCIsXCJub25lXCIpO1xuICAgICAgICAgICAgJChcIi5kaXNhYmxlIC5yZWFkX21vcmVcIikuY3NzKFwiZGlzcGxheVwiLFwibm9uZVwiKTtcbiAgICAgICAgICAgICQoXCIuYXBwLXdpemFyZC1zdGVwPmFcIikuY3NzKFwiaGVpZ2h0XCIsXCIxMDBweFwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICB9XG4gICAgcHVibGljIHJlYWRNb3JlU3VidGl0bGUoKXtcbiAgICAgICAgJChcIi5jdXJyZW50IC5zdWJ0aXRsZS13cmFwcGVyXCIpLmFkZENsYXNzKFwicmVhZG1vcmVfc3VidGl0bGVcIik7XG4gICAgICAgICQoXCIuY3VycmVudCAucmVhZF9tb3JlXCIpLmNzcyhcImRpc3BsYXlcIixcIm5vbmVcIik7XG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwibW91c2V1cFwiLGZ1bmN0aW9uKGU6YW55KVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgY29udGFpbmVyID0gJChcIi5zdWJ0aXRsZS13cmFwcGVyXCIpO1xuICAgICAgICAgICAgLy8gaWYgdGhlIHRhcmdldCBvZiB0aGUgY2xpY2sgaXNuJ3QgdGhlIGNvbnRhaW5lciBub3IgYSBkZXNjZW5kYW50IG9mIHRoZSBjb250YWluZXJcbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLmlzKGUudGFyZ2V0KSAmJiBjb250YWluZXIuaGFzKGUudGFyZ2V0KS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgJChcIi5jdXJyZW50IC5zdWJ0aXRsZS13cmFwcGVyXCIpLnJlbW92ZUNsYXNzKFwicmVhZG1vcmVfc3VidGl0bGVcIik7XG4gICAgICAgICAgICAgICAgJChcIi5jdXJyZW50IC5yZWFkX21vcmVcIikuY3NzKFwiZGlzcGxheVwiLFwiYmxvY2tcIik7XG4gICAgICAgICAgICAgICAgJChkb2N1bWVudCkub2ZmKFwibW91c2V1cFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaXNGaXJzdFN0ZXAoc3RlcFJlZjogV2l6YXJkU3RlcENvbXBvbmVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGVwcy5maXJzdCA9PT0gc3RlcFJlZjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pc0xhc3RTdGVwKHN0ZXBSZWY6IFdpemFyZFN0ZXBDb21wb25lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RlcHMubGFzdCA9PT0gc3RlcFJlZjtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRGF0YUNoYW5nZShuZXdWYWwpIHtcbiAgICAgICAgdGhpcy5maWVsZERlZnMgPSBjcmVhdGVBcnJheUZyb20obmV3VmFsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVN0ZXBGb2N1cygpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50U3RlcEVsZW1lbnQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5hcHAtd2l6YXJkLWhlYWRpbmcgbGkuY3VycmVudCBhXCIpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgY3VycmVudFN0ZXBFbGVtZW50Py5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHByb3BlcnR5IGNoYW5nZSBoYW5kbGVyLiBUaGlzIE1ldGhvZCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHRoZXJlIGlzIGEgY2hhbmdlIGluIHRoZSB3aWRnZXQgcHJvcGVydHlcbiAgICBvblByb3BlcnR5Q2hhbmdlKGtleTogc3RyaW5nLCBudjogYW55LCBvdj86IGFueSkge1xuICAgICAgICAvLyBNb25pdG9yaW5nIGNoYW5nZXMgZm9yIHByb3BlcnRpZXMgYW5kIGFjY29yZGluZ2x5IGhhbmRsaW5nIHJlc3BlY3RpdmUgY2hhbmdlc1xuXG4gICAgICAgIGlmIChrZXkgPT09ICdzdGVwc3R5bGUnKSB7XG4gICAgICAgICAgICB0aGlzLnN0ZXBDbGFzcyA9ICBudiA9PT0gJ2p1c3RpZmllZCcgPyAnbmF2LWp1c3RpZmllZCcgOiAnJztcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdkYXRhc2V0Jykge1xuICAgICAgICAgICAgdGhpcy5vbkRhdGFDaGFuZ2UobnYpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2RlZmF1bHRzdGVwJykge1xuICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0U3RlcCh0aGlzLmdldFN0ZXBSZWZCeU5hbWUobnYpKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdhY3Rpb25zYWxpZ25tZW50Jykge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Rpdi5hcHAtd2l6YXJkLWFjdGlvbnMnKT8uY2xhc3NMaXN0LnJlcGxhY2Uob3YsIG52KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICBzdXBlci5uZ0FmdGVyQ29udGVudEluaXQoKTtcbiAgICAgICAgdGhpcy5wcm9taXNlUmVzb2x2ZXJGbigpO1xuICAgICAgICB0aGlzLndpekNvbnRleHQuaGFzTmV4dFN0ZXAgPSAoKSA9PiB0aGlzLmhhc05leHRTdGVwO1xuICAgICAgICB0aGlzLndpekNvbnRleHQuaGFzUHJldmlvdXNTdGVwID0gKCkgPT4gdGhpcy5oYXNQcmV2U3RlcDtcbiAgICAgICAgdGhpcy53aXpDb250ZXh0Lmhhc05vTmV4dFN0ZXAgPSAoKSA9PiB0aGlzLnNob3dEb25lQnRuO1xuICAgICAgICB0aGlzLndpekNvbnRleHQuY2FuY2VsYWJsZSA9ICgpID0+IHRoaXMuY2FuY2VsYWJsZTtcbiAgICAgICAgdGhpcy53aXpDb250ZXh0LnNraXBwYWJsZSA9ICgpID0+IHRoaXMuY3VycmVudFN0ZXA/LmVuYWJsZXNraXA7XG4gICAgICAgIHRoaXMud2l6Q29udGV4dC5uZXh0ID0gKCkgPT4gdGhpcy5uZXh0KCk7XG4gICAgICAgIHRoaXMud2l6Q29udGV4dC5wcmV2aW91cyA9ICgpID0+IHRoaXMucHJldigpO1xuICAgICAgICB0aGlzLndpekNvbnRleHQuZG9uZSA9ICgpID0+IHRoaXMuZG9uZSgpO1xuICAgICAgICB0aGlzLndpekNvbnRleHQuY2FuY2VsID0gKCkgPT4gdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgdGhpcy53aXpDb250ZXh0LnNraXAgPSAoKSA9PiB0aGlzLnNraXAoKTtcbiAgICAgICAgdGhpcy53aXpDb250ZXh0Lm5leHRidG5sYWJlbCA9ICgpID0+IHRoaXMubmV4dGJ0bmxhYmVsO1xuICAgICAgICB0aGlzLndpekNvbnRleHQucHJldmlvdXNidG5sYWJlbCA9ICgpID0+IHRoaXMucHJldmlvdXNidG5sYWJlbDtcbiAgICAgICAgdGhpcy53aXpDb250ZXh0LmRvbmVidG5sYWJlbCA9ICgpID0+IHRoaXMuZG9uZWJ0bmxhYmVsO1xuICAgICAgICB0aGlzLndpekNvbnRleHQuY2FuY2VsYnRubGFiZWwgPSAoKSA9PiB0aGlzLmNhbmNlbGJ0bmxhYmVsO1xuICAgICAgICB0aGlzLndpekNvbnRleHQuYWN0aW9uc2FsaWdubWVudCA9ICgpID0+IHRoaXMuYWN0aW9uc2FsaWdubWVudDtcbiAgICAgICAgdGhpcy53aXpDb250ZXh0LmRpc2FibGVOZXh0ID0gKCkgPT4gIXRoaXMuZW5hYmxlTmV4dDtcbiAgICAgICAgdGhpcy53aXpDb250ZXh0LmRpc2FibGVQcmV2aW91cyA9ICgpID0+ICF0aGlzLmVuYWJsZVByZXY7XG4gICAgICAgIHRoaXMud2l6Q29udGV4dC5kaXNhYmxlRG9uZSA9ICgpID0+ICF0aGlzLmVuYWJsZURvbmU7XG4gICAgICAgIHRoaXMuc3RlcHMuY2hhbmdlcy5zdWJzY3JpYmUoIHNsaWRlcyA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGVwcy5sZW5ndGggPiAxICYmIHRoaXMudHlwZSA9PT0gJ2R5bmFtaWMnICYmIHRoaXMuX2lzRmlyc3RMb2FkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0U3RlcCh0aGlzLmdldFN0ZXBSZWZCeUluZGV4KHRoaXMuZGVmYXVsdHN0ZXBpbmRleCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzRmlyc3RMb2FkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIGlzU2VsZWN0YWJsZVN0ZXAoc3RlcFJlZjogV2l6YXJkU3RlcENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXBSZWYuc2hvdyAmJiAhc3RlcFJlZi5kaXNhYmxlZDtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRTZWxlY3RhYmxlU3RlcEJlZm9yZUluZGV4KGluZGV4OiBudW1iZXIpOiBXaXphcmRTdGVwQ29tcG9uZW50IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBpbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RlcCA9IHRoaXMuZ2V0U3RlcFJlZkJ5SW5kZXgoaSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RhYmxlU3RlcChzdGVwKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGVwID0gdGhpcy5nZXRTdGVwUmVmQnlJbmRleCh0aGlzLnN0ZXBzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2VsZWN0YWJsZVN0ZXAoc3RlcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgcHJpdmF0ZSBnZXRTZWxlY3RhYmxlU3RlcEFmdGVySW5kZXgoaW5kZXg6IG51bWJlcik6IFdpemFyZFN0ZXBDb21wb25lbnQge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBpbmRleCArIDE7IGkgPCB0aGlzLnN0ZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmdldFN0ZXBSZWZCeUluZGV4KGkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1NlbGVjdGFibGVTdGVwKHN0ZXApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuc3RlcHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwID0gdGhpcy5nZXRTdGVwUmVmQnlJbmRleCgwKTtcbiAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2VsZWN0YWJsZVN0ZXAoc3RlcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG4gICAgICAgIHN0eWxlcihcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucGFuZWwtYm9keScpIGFzIEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIEFQUExZX1NUWUxFU19UWVBFLklOTkVSX1NIRUxMXG4gICAgICAgICk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBpZigkKHdpbmRvdykud2lkdGgoKTw3NjgpIHtcbiAgICAgICAgICAgICQoXCIuYXBwLXdpemFyZFwiKS5yZW1vdmVDbGFzcyhcInZlcnRpY2FsXCIpO1xuICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkaXYuYXBwLXdpemFyZC1hY3Rpb25zJykuZm9yRWFjaChlbCA9PiBlbD8uY2xhc3NMaXN0LmFkZCh0aGlzLmFjdGlvbnNhbGlnbm1lbnQpKTtcbiAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Rpdi5hcHAtd2l6YXJkLWFjdGlvbnMtcmlnaHQnKS5mb3JFYWNoKGVsID0+IGVsPy5jbGFzc0xpc3QucmVtb3ZlKCdhcHAtY29udGFpbmVyJykpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0QWN0aXZlU3RlcEluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBmaW5kSW5kZXgodGhpcy5zdGVwcy50b0FycmF5KCksIHtpc0N1cnJlbnQ6IHRydWV9KTtcbiAgICB9XG4gICAgb25rZXlkb3duKGV2ZW50KSB7XG4gICAgICAgIGxldCBuZXdTdGVwO1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgbmV3U3RlcCA9IHRoaXMuYXV0b0FjdGl2YXRpb24gPyBudWxsIDogdGhpcy5nZXRTZWxlY3RhYmxlU3RlcEJlZm9yZUluZGV4KHRoaXMuZ2V0U2VsZWN0ZWRTdGVwSW5kZXgoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIG5ld1N0ZXAgPSB0aGlzLmF1dG9BY3RpdmF0aW9uID8gbnVsbCA6IHRoaXMuZ2V0U2VsZWN0YWJsZVN0ZXBBZnRlckluZGV4KHRoaXMuZ2V0U2VsZWN0ZWRTdGVwSW5kZXgoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgIGNhc2UgJ1NwYWNlYmFyJzogXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCAgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignbGkuY3VycmVudCcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwTGkgPSBhY3RpdmVFbGVtZW50LmNsb3Nlc3QoJ2xpW2RhdGEtc3RlcGlkXScpOyBcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNJbldpemFyZEhlYWRlciA9IGFjdGl2ZUVsZW1lbnQuY2xvc2VzdCgnLmFwcC13aXphcmQtaGVhZGluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcExpICYmIGlzSW5XaXphcmRIZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcElkID0gc3RlcExpLmdldEF0dHJpYnV0ZSgnZGF0YS1zdGVwaWQnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcEluZGV4ID0gdGhpcy5zdGVwcy50b0FycmF5KCkuZmluZEluZGV4KHN0ZXAgPT4gc3RlcC53aWRnZXRJZCA9PT0gc3RlcElkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFN0ZXAgPSB0aGlzLnN0ZXBzLnRvQXJyYXkoKVtzdGVwSW5kZXhdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFN0ZXAgJiYgY3VycmVudFN0ZXAgIT09IHRoaXMuY3VycmVudFN0ZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uV2l6YXJkSGVhZGVyQ2xpY2soZXZlbnQsIGN1cnJlbnRTdGVwKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0YWJpbmRleCBmb3IgYWNjZXNzaWJpbGl0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbFN0ZXBJdGVtcyA9IHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaVtkYXRhLXN0ZXBpZF0nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxTdGVwSXRlbXMuZm9yRWFjaCgoZWw6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWwgYXMgSFRNTEVsZW1lbnQpLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBBbmNob3IgPSBzdGVwTGkucXVlcnlTZWxlY3RvcignYScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwQW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEFuY2hvci5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwQW5jaG9yLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgIGlmIChuZXdTdGVwKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignbGkuY3VycmVudCcpPy5jbGFzc0xpc3QucmVtb3ZlKCdjdXJyZW50Jyk7XG4gICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYGxpW2RhdGEtc3RlcGlkPVwiJHtuZXdTdGVwLndpZGdldElkfVwiXWApPy5jbGFzc0xpc3QuYWRkKCdjdXJyZW50Jyk7XG4gICAgICAgICAgICAgY29uc3Qgc3RlcExpID0gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYXBwLXdpemFyZC1oZWFkaW5nIGxpLmN1cnJlbnQgYVwiKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICBjb25zdCBhbGxTdGVwSXRlbXMgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlbZGF0YS1zdGVwaWRdIGEnKTtcbiAgICAgICAgICAgICBhbGxTdGVwSXRlbXMuZm9yRWFjaCgoZWw6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAoZWwgYXMgSFRNTEVsZW1lbnQpLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIChzdGVwTGkpLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgICAgICAgc3RlcExpPy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFNlbGVjdGVkU3RlcEluZGV4KCkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc3RlcHMudG9BcnJheSgpLmZpbmRJbmRleChzdGVwID0+XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihgbGlbZGF0YS1zdGVwaWQ9XCIke3N0ZXAud2lkZ2V0SWR9XCJdYCk/LmNsYXNzTGlzdC5jb250YWlucyhcImN1cnJlbnRcIikpO1xuICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IGluZGV4IDogdGhpcy5nZXRBY3RpdmVTdGVwSW5kZXgoKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXBwLXdpemFyZC1oZWFkaW5nXCI+XG4gIDx1bCBjbGFzcz1cImFwcC13aXphcmQtc3RlcHMgbmF2IG5hdi1waWxscyB7e3N0ZXBDbGFzc319XCI+XG4gICAgQGZvciAoc3RlcCBvZiBzdGVwczsgdHJhY2sgc3RlcDsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgIDxsaSBjbGFzcz1cImFwcC13aXphcmQtc3RlcFwiIFtoaWRkZW5dPVwiIXN0ZXAuc2hvd1wiXG4gICAgICAgIFtuZ0NsYXNzXT1cInthY3RpdmU6IHN0ZXAuZG9uZSwgY3VycmVudDogc3RlcC5hY3RpdmUsIGRpc2FibGVkOiBzdGVwLmRpc2FibGVkfVwiXG4gICAgICAgIChjbGljayk9XCJvbldpemFyZEhlYWRlckNsaWNrKCRldmVudCwgc3RlcClcIiBbYXR0ci5kYXRhLXN0ZXBpZF09XCJzdGVwLndpZGdldElkXCI+XG4gICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiBbYXR0ci5hcmlhLWN1cnJlbnRdPVwic3RlcC5hY3RpdmUgPyAnc3RlcCcgOiBudWxsXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInN0ZXAuZGlzYWJsZWRcIiBbYXR0ci5hcmlhLWxhYmVsXT0nc3RlcC5zdWJ0aXRsZSA/IFwic3RlcCBcIiArIChpICsgMSkgKyBcIiBcIiArICBzdGVwLnRpdGxlICsgXCIgXCIgKyBzdGVwLnN1YnRpdGxlIDogXCJzdGVwIFwiICsgKGkgKyAxKSArIFwiIFwiICsgIHN0ZXAudGl0bGUnIFthdHRyLnRpdGxlXT0gXCJzdGVwLnRpdGxlXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J3RpdGxlLWNlbnRlci1hbGlnbic6Y2xhc3MgJiYgY2xhc3MuaW5jbHVkZXMoJ2NsYXNzaWMnKSAmJiAhc3RlcC5zdWJ0aXRsZX1cIiBbdGFiaW5kZXhdPVwic3RlcC5hY3RpdmUgPyAnMCcgOiAnLTEnXCIgKGtleWRvd24pPVwib25rZXlkb3duKCRldmVudClcIj5cbiAgICAgICAgICBAaWYgKGNsYXNzICYmIGNsYXNzLmluY2x1ZGVzKCdjbGFzc2ljJykpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJyb3dcIj48L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwid2l6YXJkLXN0ZXAtbnVtYmVyXCI+XG4gICAgICAgICAgICBAaWYgKGNsYXNzICYmIGNsYXNzLmluY2x1ZGVzKCdudW1iZXInKSAmJiAhc3RlcC5pc0RvbmUpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb3VudFwiPnt7aSsxfX08L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGNsYXNzICYmIChjbGFzcy5pbmNsdWRlcygnZG90dGVkc3RlcHBlcicpIHx8IGNsYXNzLmluY2x1ZGVzKCd0ZXh0LWlubGluZScpICYmICFjbGFzcy5pbmNsdWRlcygnaWNvbnN0ZXBwZXInKSkgJiYgIXN0ZXAuaXNEb25lKSB7XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZG90dGVkc3RlcHBlclwiPjwvaT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoY2xhc3MgJiYgKGNsYXNzLmluY2x1ZGVzKCdkb3R0ZWRzdGVwcGVyJykgfHwgY2xhc3MuaW5jbHVkZXMoJ251bWJlcicpKSAmJiBzdGVwLmlzRG9uZSkge1xuICAgICAgICAgICAgICA8aSBjbGFzcz1cImFwcC1pY29uIHdpIHdpLWRvbmVcIj48L2k+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKChjbGFzcyAmJiBjbGFzcy5pbmNsdWRlcygnaWNvbnN0ZXBwZXInKSkgJiYgKChzdGVwLmljb25jbGFzcyAmJiAhc3RlcC5pc0RvbmUpIHx8IChzdGVwLmljb25jbGFzcyAmJiBzdGVwLmlzRG9uZSAmJiBzdGVwLmRvbmVpY29uY2xhc3MgPT09JycpKSkge1xuICAgICAgICAgICAgICA8aSBjbGFzcz1cImFwcC1pY29uIHt7c3RlcC5pY29uY2xhc3N9fVwiPjwvaT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoc3RlcC5kb25laWNvbmNsYXNzICYmIHN0ZXAuaXNEb25lICYmIChjbGFzcyAmJiBjbGFzcy5pbmNsdWRlcygnaWNvbnN0ZXBwZXInKSkpIHtcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJhcHAtaWNvbiB7e3N0ZXAuZG9uZWljb25jbGFzc319XCI+PC9pPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIEBpZiAoY2xhc3MgJiYgY2xhc3MuaW5jbHVkZXMoJ3RleHQtaW5saW5lJykpIHtcbiAgICAgICAgICAgICAgPHNwYW4+e3snMCcgKyAoaSsxKX19PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGVwLXRpdGxlXCIgW3RleHRDb250ZW50XT1cInN0ZXAudGl0bGVcIj48L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIEBpZiAoc3RlcC5zdWJ0aXRsZSkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdWJ0aXRsZS13cmFwcGVyXCIgW2F0dHIudGl0bGVdPVwic3RlcC5zdWJ0aXRsZVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0ZXAtdGl0bGVcIiBbdGV4dENvbnRlbnRdPVwic3RlcC5zdWJ0aXRsZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJyZWFkX21vcmVcIiAoY2xpY2spPVwicmVhZE1vcmVTdWJ0aXRsZSgpXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj5tb3JlPC9hPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9hPlxuICAgICAgPC9saT5cbiAgICB9XG4gIDwvdWw+XG48L2Rpdj5cbkBpZiAodHlwZSAhPT0gJ2R5bmFtaWMnKSB7XG48ZGl2IGNsYXNzPVwiYXBwLXdpemFyZC1ib2R5IHBhbmVsLWJvZHlcIj5cbiAgQGlmIChtZXNzYWdlLmNhcHRpb24pIHtcbiAgICA8cCB3bU1lc3NhZ2UgY2FwdGlvbi5iaW5kPVwibWVzc2FnZS5jYXB0aW9uXCIgdHlwZS5iaW5kPVwibWVzc2FnZS50eXBlXCI+PC9wPlxuICB9XG4gIDxuZy1jb250ZW50IG5nUHJvamVjdEFzPVwiZm9ybVt3bVdpemFyZFN0ZXBdXCI+PC9uZy1jb250ZW50PlxuPC9kaXY+XG59XG5AaWYgKHR5cGUgPT09ICdkeW5hbWljJykge1xuPGRpdiBjbGFzcz1cImFwcC13aXphcmQtYm9keSBwYW5lbC1ib2R5XCI+XG4gICAgQGlmKCFmaWVsZERlZnM/Lmxlbmd0aCkge1xuICAgIDxkaXY+e3tub2RhdGFtZXNzYWdlfX08L2Rpdj5cbiAgICB9XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiZGl2W3dtUmVwZWF0VGVtcGxhdGVdXCI+PC9uZy1jb250ZW50PlxuPC9kaXY+XG59XG5AaWYoZmllbGREZWZzICYmIGZpZWxkRGVmcy5sZW5ndGggfHwgdHlwZSAhPT0gJ2R5bmFtaWMnKSB7XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIndpemFyZEFjdGlvblwiPjwvbmctY29udGFpbmVyPlxufVxuIl19