slate-angular 15.0.0 → 15.1.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/components/block-card/block-card.component.d.ts +1 -1
  2. package/components/block-card/block-card.component.scss +3 -2
  3. package/components/children/children.component.d.ts +4 -4
  4. package/components/descendant/descendant.component.d.ts +5 -5
  5. package/components/element/default-element.component.token.d.ts +3 -3
  6. package/components/leaf/default-leaf.component.d.ts +2 -2
  7. package/components/leaf/leaf.component.d.ts +5 -5
  8. package/components/leaves/leaves.component.d.ts +4 -4
  9. package/components/string/default-string.component.d.ts +13 -0
  10. package/components/string/string.component.d.ts +2 -1
  11. package/components/string/template.component.d.ts +0 -1
  12. package/esm2020/components/block-card/block-card.component.mjs +5 -5
  13. package/esm2020/components/children/children.component.mjs +22 -19
  14. package/esm2020/components/descendant/descendant.component.mjs +19 -17
  15. package/esm2020/components/editable/editable.component.mjs +129 -48
  16. package/esm2020/components/element/default-element.component.mjs +1 -1
  17. package/esm2020/components/element/default-element.component.token.mjs +2 -2
  18. package/esm2020/components/element/element.component.mjs +1 -1
  19. package/esm2020/components/leaf/default-leaf.component.mjs +5 -5
  20. package/esm2020/components/leaf/leaf.component.mjs +6 -6
  21. package/esm2020/components/leaves/leaves.component.mjs +15 -13
  22. package/esm2020/components/string/default-string.component.mjs +31 -0
  23. package/esm2020/components/string/string.component.mjs +7 -3
  24. package/esm2020/components/string/template.component.mjs +8 -8
  25. package/esm2020/components/text/default-text.component.mjs +1 -1
  26. package/esm2020/components/text/void-text.component.mjs +3 -3
  27. package/esm2020/custom-event/BeforeInputEventPlugin.mjs +1 -1
  28. package/esm2020/custom-event/before-input-polyfill.mjs +2 -2
  29. package/esm2020/module.mjs +21 -6
  30. package/esm2020/plugins/angular-editor.mjs +33 -50
  31. package/esm2020/plugins/with-angular.mjs +11 -8
  32. package/esm2020/public-api.mjs +2 -1
  33. package/esm2020/types/error.mjs +1 -1
  34. package/esm2020/types/feature.mjs +1 -1
  35. package/esm2020/types/view.mjs +1 -1
  36. package/esm2020/utils/block-card.mjs +1 -1
  37. package/esm2020/utils/dom.mjs +4 -8
  38. package/esm2020/utils/environment.mjs +5 -9
  39. package/esm2020/utils/global-normalize.mjs +5 -8
  40. package/esm2020/utils/hotkeys.mjs +1 -1
  41. package/esm2020/utils/index.mjs +1 -1
  42. package/esm2020/utils/lines.mjs +1 -1
  43. package/esm2020/utils/range-list.mjs +1 -1
  44. package/esm2020/utils/restore-dom.mjs +33 -0
  45. package/esm2020/utils/view.mjs +2 -2
  46. package/esm2020/utils/weak-maps.mjs +1 -1
  47. package/esm2020/view/base.mjs +4 -4
  48. package/esm2020/view/before-context-change.mjs +1 -1
  49. package/esm2020/view/container-item.mjs +13 -7
  50. package/esm2020/view/container.mjs +5 -5
  51. package/esm2020/view/context.mjs +1 -1
  52. package/fesm2015/slate-angular.mjs +327 -181
  53. package/fesm2015/slate-angular.mjs.map +1 -1
  54. package/fesm2020/slate-angular.mjs +327 -182
  55. package/fesm2020/slate-angular.mjs.map +1 -1
  56. package/module.d.ts +3 -2
  57. package/package.json +1 -1
  58. package/plugins/angular-editor.d.ts +4 -4
  59. package/public-api.d.ts +1 -0
  60. package/styles/index.scss +3 -4
  61. package/types/error.d.ts +1 -1
  62. package/types/feature.d.ts +1 -1
  63. package/types/view.d.ts +1 -1
  64. package/utils/block-card.d.ts +1 -1
  65. package/utils/dom.d.ts +3 -3
  66. package/utils/global-normalize.d.ts +1 -1
  67. package/utils/restore-dom.d.ts +2 -0
  68. package/utils/view.d.ts +2 -2
  69. package/view/base.d.ts +4 -4
  70. package/view/container-item.d.ts +5 -5
  71. package/view/container.d.ts +3 -3
  72. package/view/context.d.ts +5 -5
@@ -14,6 +14,7 @@ import { SlateLeafComponent } from './components/leaf/leaf.component';
14
14
  import { SlateDefaultLeafComponent } from './components/leaf/default-leaf.component';
15
15
  import { SlateLeavesComponent } from './components/leaves/leaves.component';
16
16
  import { SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN } from './components/element/default-element.component.token';
17
+ import { SlateDefaultStringComponent } from './components/string/default-string.component';
17
18
  import * as i0 from "@angular/core";
18
19
  export class SlateModule {
19
20
  }
@@ -30,12 +31,18 @@ SlateModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "1
30
31
  SlateBlockCardComponent,
31
32
  SlateLeafComponent,
32
33
  SlateLeavesComponent,
33
- SlateDefaultLeafComponent], imports: [CommonModule], exports: [SlateEditableComponent, SlateChildrenComponent, SlateElementComponent, SlateLeavesComponent, SlateStringComponent] });
34
+ SlateDefaultLeafComponent,
35
+ SlateDefaultStringComponent], imports: [CommonModule], exports: [SlateEditableComponent,
36
+ SlateChildrenComponent,
37
+ SlateElementComponent,
38
+ SlateLeavesComponent,
39
+ SlateStringComponent,
40
+ SlateDefaultStringComponent] });
34
41
  SlateModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: SlateModule, providers: [
35
42
  {
36
43
  provide: SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN,
37
44
  useValue: SlateDefaultElementComponent
38
- },
45
+ }
39
46
  ], imports: [CommonModule] });
40
47
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: SlateModule, decorators: [{
41
48
  type: NgModule,
@@ -53,16 +60,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImpor
53
60
  SlateBlockCardComponent,
54
61
  SlateLeafComponent,
55
62
  SlateLeavesComponent,
56
- SlateDefaultLeafComponent
63
+ SlateDefaultLeafComponent,
64
+ SlateDefaultStringComponent
57
65
  ],
58
66
  imports: [CommonModule],
59
- exports: [SlateEditableComponent, SlateChildrenComponent, SlateElementComponent, SlateLeavesComponent, SlateStringComponent],
67
+ exports: [
68
+ SlateEditableComponent,
69
+ SlateChildrenComponent,
70
+ SlateElementComponent,
71
+ SlateLeavesComponent,
72
+ SlateStringComponent,
73
+ SlateDefaultStringComponent
74
+ ],
60
75
  providers: [
61
76
  {
62
77
  provide: SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN,
63
78
  useValue: SlateDefaultElementComponent
64
- },
79
+ }
65
80
  ]
66
81
  }]
67
82
  }] });
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vcGFja2FnZXMvc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNsRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUM5RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN4RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNsRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSxzREFBc0QsQ0FBQzs7QUEyQjdHLE1BQU0sT0FBTyxXQUFXOzt3R0FBWCxXQUFXO3lHQUFYLFdBQVcsaUJBdkJoQixzQkFBc0I7UUFDdEIsNEJBQTRCO1FBQzVCLHFCQUFxQjtRQUNyQixzQkFBc0I7UUFDdEIseUJBQXlCO1FBQ3pCLG9CQUFvQjtRQUNwQiw0QkFBNEI7UUFDNUIsd0JBQXdCO1FBQ3hCLHNCQUFzQjtRQUN0Qix1QkFBdUI7UUFDdkIsa0JBQWtCO1FBQ2xCLG9CQUFvQjtRQUNwQix5QkFBeUIsYUFFbkIsWUFBWSxhQUNaLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLG9CQUFvQjt5R0FRbEgsV0FBVyxhQVBUO1FBQ1A7WUFDSSxPQUFPLEVBQUUscUNBQXFDO1lBQzlDLFFBQVEsRUFBRSw0QkFBNEI7U0FDekM7S0FDSixZQVBTLFlBQVk7MkZBU2IsV0FBVztrQkF6QnZCLFFBQVE7bUJBQUM7b0JBQ04sWUFBWSxFQUFFO3dCQUNWLHNCQUFzQjt3QkFDdEIsNEJBQTRCO3dCQUM1QixxQkFBcUI7d0JBQ3JCLHNCQUFzQjt3QkFDdEIseUJBQXlCO3dCQUN6QixvQkFBb0I7d0JBQ3BCLDRCQUE0Qjt3QkFDNUIsd0JBQXdCO3dCQUN4QixzQkFBc0I7d0JBQ3RCLHVCQUF1Qjt3QkFDdkIsa0JBQWtCO3dCQUNsQixvQkFBb0I7d0JBQ3BCLHlCQUF5QjtxQkFDNUI7b0JBQ0QsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQztvQkFDNUgsU0FBUyxFQUFFO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxxQ0FBcUM7NEJBQzlDLFFBQVEsRUFBRSw0QkFBNEI7eUJBQ3pDO3FCQUNKO2lCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9yd2FyZFJlZiwgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBTbGF0ZUVkaXRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2VkaXRhYmxlL2VkaXRhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTbGF0ZURlZmF1bHRUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RleHQvZGVmYXVsdC10ZXh0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTbGF0ZVZvaWRUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RleHQvdm9pZC10ZXh0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTbGF0ZUVsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZWxlbWVudC9lbGVtZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTbGF0ZURlZmF1bHRFbGVtZW50Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2VsZW1lbnQvZGVmYXVsdC1lbGVtZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTbGF0ZVN0cmluZ0NvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9zdHJpbmcvc3RyaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTbGF0ZVN0cmluZ1RlbXBsYXRlQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3N0cmluZy90ZW1wbGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2xhdGVEZXNjZW5kYW50Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2Rlc2NlbmRhbnQvZGVzY2VuZGFudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2xhdGVDaGlsZHJlbkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9jaGlsZHJlbi9jaGlsZHJlbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2xhdGVCbG9ja0NhcmRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvYmxvY2stY2FyZC9ibG9jay1jYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTbGF0ZUxlYWZDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbGVhZi9sZWFmLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTbGF0ZURlZmF1bHRMZWFmQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2xlYWYvZGVmYXVsdC1sZWFmLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTbGF0ZUxlYXZlc0NvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9sZWF2ZXMvbGVhdmVzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTTEFURV9ERUZBVUxUX0VMRU1FTlRfQ09NUE9ORU5UX1RPS0VOIH0gZnJvbSAnLi9jb21wb25lbnRzL2VsZW1lbnQvZGVmYXVsdC1lbGVtZW50LmNvbXBvbmVudC50b2tlbic7XG5cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbXG4gICAgICAgIFNsYXRlRWRpdGFibGVDb21wb25lbnQsXG4gICAgICAgIFNsYXRlRGVmYXVsdEVsZW1lbnRDb21wb25lbnQsXG4gICAgICAgIFNsYXRlRWxlbWVudENvbXBvbmVudCxcbiAgICAgICAgU2xhdGVWb2lkVGV4dENvbXBvbmVudCxcbiAgICAgICAgU2xhdGVEZWZhdWx0VGV4dENvbXBvbmVudCxcbiAgICAgICAgU2xhdGVTdHJpbmdDb21wb25lbnQsXG4gICAgICAgIFNsYXRlU3RyaW5nVGVtcGxhdGVDb21wb25lbnQsXG4gICAgICAgIFNsYXRlRGVzY2VuZGFudENvbXBvbmVudCxcbiAgICAgICAgU2xhdGVDaGlsZHJlbkNvbXBvbmVudCxcbiAgICAgICAgU2xhdGVCbG9ja0NhcmRDb21wb25lbnQsXG4gICAgICAgIFNsYXRlTGVhZkNvbXBvbmVudCxcbiAgICAgICAgU2xhdGVMZWF2ZXNDb21wb25lbnQsXG4gICAgICAgIFNsYXRlRGVmYXVsdExlYWZDb21wb25lbnRcbiAgICBdLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIGV4cG9ydHM6IFtTbGF0ZUVkaXRhYmxlQ29tcG9uZW50LCBTbGF0ZUNoaWxkcmVuQ29tcG9uZW50LCBTbGF0ZUVsZW1lbnRDb21wb25lbnQsIFNsYXRlTGVhdmVzQ29tcG9uZW50LCBTbGF0ZVN0cmluZ0NvbXBvbmVudF0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFNMQVRFX0RFRkFVTFRfRUxFTUVOVF9DT01QT05FTlRfVE9LRU4sXG4gICAgICAgICAgICB1c2VWYWx1ZTogU2xhdGVEZWZhdWx0RWxlbWVudENvbXBvbmVudFxuICAgICAgICB9LFxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgU2xhdGVNb2R1bGUgeyB9XG4iXX0=
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vcGFja2FnZXMvc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNsRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUM5RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN4RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNsRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUM3RyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQzs7QUFtQzNGLE1BQU0sT0FBTyxXQUFXOzt3R0FBWCxXQUFXO3lHQUFYLFdBQVcsaUJBL0JoQixzQkFBc0I7UUFDdEIsNEJBQTRCO1FBQzVCLHFCQUFxQjtRQUNyQixzQkFBc0I7UUFDdEIseUJBQXlCO1FBQ3pCLG9CQUFvQjtRQUNwQiw0QkFBNEI7UUFDNUIsd0JBQXdCO1FBQ3hCLHNCQUFzQjtRQUN0Qix1QkFBdUI7UUFDdkIsa0JBQWtCO1FBQ2xCLG9CQUFvQjtRQUNwQix5QkFBeUI7UUFDekIsMkJBQTJCLGFBRXJCLFlBQVksYUFFbEIsc0JBQXNCO1FBQ3RCLHNCQUFzQjtRQUN0QixxQkFBcUI7UUFDckIsb0JBQW9CO1FBQ3BCLG9CQUFvQjtRQUNwQiwyQkFBMkI7eUdBU3RCLFdBQVcsYUFQVDtRQUNQO1lBQ0ksT0FBTyxFQUFFLHFDQUFxQztZQUM5QyxRQUFRLEVBQUUsNEJBQTRCO1NBQ3pDO0tBQ0osWUFkUyxZQUFZOzJGQWdCYixXQUFXO2tCQWpDdkIsUUFBUTttQkFBQztvQkFDTixZQUFZLEVBQUU7d0JBQ1Ysc0JBQXNCO3dCQUN0Qiw0QkFBNEI7d0JBQzVCLHFCQUFxQjt3QkFDckIsc0JBQXNCO3dCQUN0Qix5QkFBeUI7d0JBQ3pCLG9CQUFvQjt3QkFDcEIsNEJBQTRCO3dCQUM1Qix3QkFBd0I7d0JBQ3hCLHNCQUFzQjt3QkFDdEIsdUJBQXVCO3dCQUN2QixrQkFBa0I7d0JBQ2xCLG9CQUFvQjt3QkFDcEIseUJBQXlCO3dCQUN6QiwyQkFBMkI7cUJBQzlCO29CQUNELE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsT0FBTyxFQUFFO3dCQUNMLHNCQUFzQjt3QkFDdEIsc0JBQXNCO3dCQUN0QixxQkFBcUI7d0JBQ3JCLG9CQUFvQjt3QkFDcEIsb0JBQW9CO3dCQUNwQiwyQkFBMkI7cUJBQzlCO29CQUNELFNBQVMsRUFBRTt3QkFDUDs0QkFDSSxPQUFPLEVBQUUscUNBQXFDOzRCQUM5QyxRQUFRLEVBQUUsNEJBQTRCO3lCQUN6QztxQkFDSjtpQkFDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZvcndhcmRSZWYsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU2xhdGVFZGl0YWJsZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9lZGl0YWJsZS9lZGl0YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2xhdGVEZWZhdWx0VGV4dENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90ZXh0L2RlZmF1bHQtdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2xhdGVWb2lkVGV4dENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90ZXh0L3ZvaWQtdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2xhdGVFbGVtZW50Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2VsZW1lbnQvZWxlbWVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2xhdGVEZWZhdWx0RWxlbWVudENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9lbGVtZW50L2RlZmF1bHQtZWxlbWVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2xhdGVTdHJpbmdDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvc3RyaW5nL3N0cmluZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2xhdGVTdHJpbmdUZW1wbGF0ZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9zdHJpbmcvdGVtcGxhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IFNsYXRlRGVzY2VuZGFudENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9kZXNjZW5kYW50L2Rlc2NlbmRhbnQuY29tcG9uZW50JztcbmltcG9ydCB7IFNsYXRlQ2hpbGRyZW5Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvY2hpbGRyZW4vY2hpbGRyZW4uY29tcG9uZW50JztcbmltcG9ydCB7IFNsYXRlQmxvY2tDYXJkQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2Jsb2NrLWNhcmQvYmxvY2stY2FyZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2xhdGVMZWFmQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2xlYWYvbGVhZi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2xhdGVEZWZhdWx0TGVhZkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9sZWFmL2RlZmF1bHQtbGVhZi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2xhdGVMZWF2ZXNDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbGVhdmVzL2xlYXZlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU0xBVEVfREVGQVVMVF9FTEVNRU5UX0NPTVBPTkVOVF9UT0tFTiB9IGZyb20gJy4vY29tcG9uZW50cy9lbGVtZW50L2RlZmF1bHQtZWxlbWVudC5jb21wb25lbnQudG9rZW4nO1xuaW1wb3J0IHsgU2xhdGVEZWZhdWx0U3RyaW5nQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3N0cmluZy9kZWZhdWx0LXN0cmluZy5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICBTbGF0ZUVkaXRhYmxlQ29tcG9uZW50LFxuICAgICAgICBTbGF0ZURlZmF1bHRFbGVtZW50Q29tcG9uZW50LFxuICAgICAgICBTbGF0ZUVsZW1lbnRDb21wb25lbnQsXG4gICAgICAgIFNsYXRlVm9pZFRleHRDb21wb25lbnQsXG4gICAgICAgIFNsYXRlRGVmYXVsdFRleHRDb21wb25lbnQsXG4gICAgICAgIFNsYXRlU3RyaW5nQ29tcG9uZW50LFxuICAgICAgICBTbGF0ZVN0cmluZ1RlbXBsYXRlQ29tcG9uZW50LFxuICAgICAgICBTbGF0ZURlc2NlbmRhbnRDb21wb25lbnQsXG4gICAgICAgIFNsYXRlQ2hpbGRyZW5Db21wb25lbnQsXG4gICAgICAgIFNsYXRlQmxvY2tDYXJkQ29tcG9uZW50LFxuICAgICAgICBTbGF0ZUxlYWZDb21wb25lbnQsXG4gICAgICAgIFNsYXRlTGVhdmVzQ29tcG9uZW50LFxuICAgICAgICBTbGF0ZURlZmF1bHRMZWFmQ29tcG9uZW50LFxuICAgICAgICBTbGF0ZURlZmF1bHRTdHJpbmdDb21wb25lbnRcbiAgICBdLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIGV4cG9ydHM6IFtcbiAgICAgICAgU2xhdGVFZGl0YWJsZUNvbXBvbmVudCxcbiAgICAgICAgU2xhdGVDaGlsZHJlbkNvbXBvbmVudCxcbiAgICAgICAgU2xhdGVFbGVtZW50Q29tcG9uZW50LFxuICAgICAgICBTbGF0ZUxlYXZlc0NvbXBvbmVudCxcbiAgICAgICAgU2xhdGVTdHJpbmdDb21wb25lbnQsXG4gICAgICAgIFNsYXRlRGVmYXVsdFN0cmluZ0NvbXBvbmVudFxuICAgIF0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFNMQVRFX0RFRkFVTFRfRUxFTUVOVF9DT01QT05FTlRfVE9LRU4sXG4gICAgICAgICAgICB1c2VWYWx1ZTogU2xhdGVEZWZhdWx0RWxlbWVudENvbXBvbmVudFxuICAgICAgICB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBTbGF0ZU1vZHVsZSB7fVxuIl19
@@ -65,8 +65,7 @@ export const AngularEditor = {
65
65
  findDocumentOrShadowRoot(editor) {
66
66
  const el = AngularEditor.toDOMNode(editor, editor);
67
67
  const root = el.getRootNode();
68
- if ((root instanceof Document || root instanceof ShadowRoot) &&
69
- root.getSelection != null) {
68
+ if ((root instanceof Document || root instanceof ShadowRoot) && root.getSelection != null) {
70
69
  return root;
71
70
  }
72
71
  return el.ownerDocument;
@@ -95,7 +94,10 @@ export const AngularEditor = {
95
94
  return false;
96
95
  }
97
96
  const [start, end] = Range.edges(selection);
98
- const endBlock = Editor.above(editor, { at: end, match: (node) => Editor.isBlock(editor, node) });
97
+ const endBlock = Editor.above(editor, {
98
+ at: end,
99
+ match: node => Editor.isBlock(editor, node)
100
+ });
99
101
  return Editor.isStart(editor, end, endBlock[1]);
100
102
  },
101
103
  /**
@@ -156,9 +158,8 @@ export const AngularEditor = {
156
158
  if (!targetEl) {
157
159
  return false;
158
160
  }
159
- return targetEl.closest(`[data-slate-editor]`) === editorEl &&
160
- (!editable || targetEl.isContentEditable ||
161
- !!targetEl.getAttribute('data-slate-zero-width'));
161
+ return (targetEl.closest(`[data-slate-editor]`) === editorEl &&
162
+ (!editable || targetEl.isContentEditable || !!targetEl.getAttribute('data-slate-zero-width')));
162
163
  },
163
164
  /**
164
165
  * Insert data from a `DataTransfer` into the editor.
@@ -167,8 +168,8 @@ export const AngularEditor = {
167
168
  editor.insertData(data);
168
169
  },
169
170
  /**
170
- * Insert fragment data from a `DataTransfer` into the editor.
171
- */
171
+ * Insert fragment data from a `DataTransfer` into the editor.
172
+ */
172
173
  insertFragmentData(editor, data) {
173
174
  return editor.insertFragmentData(data);
174
175
  },
@@ -185,8 +186,8 @@ export const AngularEditor = {
185
186
  editor.onKeydown(data);
186
187
  },
187
188
  /**
188
- * onClick hook.
189
- */
189
+ * onClick hook.
190
+ */
190
191
  onClick(editor, data) {
191
192
  editor.onClick(data);
192
193
  },
@@ -203,9 +204,7 @@ export const AngularEditor = {
203
204
  * Find the native DOM element from a Slate node.
204
205
  */
205
206
  toDOMNode(editor, node) {
206
- const domNode = Editor.isEditor(node)
207
- ? EDITOR_TO_ELEMENT.get(editor)
208
- : NODE_TO_ELEMENT.get(node);
207
+ const domNode = Editor.isEditor(node) ? EDITOR_TO_ELEMENT.get(editor) : NODE_TO_ELEMENT.get(node);
209
208
  if (!domNode) {
210
209
  throw new Error(`Cannot resolve a DOM node from Slate node: ${JSON.stringify(node)}`);
211
210
  }
@@ -281,13 +280,9 @@ export const AngularEditor = {
281
280
  // A slate Point at zero-width Leaf always has an offset of 0 but a native DOM selection at
282
281
  // zero-width node has an offset of 1 so we have to check if we are in a zero-width node and
283
282
  // adjust the offset accordingly.
284
- const startEl = (isDOMElement(startNode)
285
- ? startNode
286
- : startNode.parentElement);
283
+ const startEl = (isDOMElement(startNode) ? startNode : startNode.parentElement);
287
284
  const isStartAtZeroWidth = !!startEl.getAttribute('data-slate-zero-width');
288
- const endEl = (isDOMElement(endNode)
289
- ? endNode
290
- : endNode.parentElement);
285
+ const endEl = (isDOMElement(endNode) ? endNode : endNode.parentElement);
291
286
  const isEndAtZeroWidth = !!endEl.getAttribute('data-slate-zero-width');
292
287
  domRange.setStart(startNode, isStartAtZeroWidth ? 1 : startOffset);
293
288
  domRange.setEnd(endNode, isEndAtZeroWidth ? 1 : endOffset);
@@ -325,9 +320,7 @@ export const AngularEditor = {
325
320
  // coordinates are closest to.
326
321
  if (Editor.isVoid(editor, node)) {
327
322
  const rect = target.getBoundingClientRect();
328
- const isPrev = editor.isInline(node)
329
- ? x - rect.left < rect.left + rect.width - x
330
- : y - rect.top < rect.top + rect.height - y;
323
+ const isPrev = editor.isInline(node) ? x - rect.left < rect.left + rect.width - x : y - rect.top < rect.top + rect.height - y;
331
324
  const edge = Editor.point(editor, path, {
332
325
  edge: isPrev ? 'start' : 'end'
333
326
  });
@@ -386,15 +379,11 @@ export const AngularEditor = {
386
379
  // forward
387
380
  // and to the end of previous node
388
381
  if (isCardLeftByTargetAttr(cardTargetAttr) && !isBackward) {
389
- const endPath = blockPath[blockPath.length - 1] <= 0
390
- ? blockPath
391
- : Path.previous(blockPath);
382
+ const endPath = blockPath[blockPath.length - 1] <= 0 ? blockPath : Path.previous(blockPath);
392
383
  return Editor.end(editor, endPath);
393
384
  }
394
385
  // to the of current node
395
- if ((isCardCenterByTargetAttr(cardTargetAttr) ||
396
- isCardRightByTargetAttr(cardTargetAttr)) &&
397
- !isBackward) {
386
+ if ((isCardCenterByTargetAttr(cardTargetAttr) || isCardRightByTargetAttr(cardTargetAttr)) && !isBackward) {
398
387
  return Editor.end(editor, blockPath);
399
388
  }
400
389
  // backward
@@ -403,9 +392,7 @@ export const AngularEditor = {
403
392
  return Editor.start(editor, Path.next(blockPath));
404
393
  }
405
394
  // and to the start of current node
406
- if ((isCardCenterByTargetAttr(cardTargetAttr) ||
407
- isCardLeftByTargetAttr(cardTargetAttr)) &&
408
- isBackward) {
395
+ if ((isCardCenterByTargetAttr(cardTargetAttr) || isCardLeftByTargetAttr(cardTargetAttr)) && isBackward) {
409
396
  return Editor.start(editor, blockPath);
410
397
  }
411
398
  }
@@ -424,7 +411,7 @@ export const AngularEditor = {
424
411
  const contents = range.cloneContents();
425
412
  const removals = [
426
413
  ...Array.prototype.slice.call(contents.querySelectorAll('[data-slate-zero-width]')),
427
- ...Array.prototype.slice.call(contents.querySelectorAll('[contenteditable=false]')),
414
+ ...Array.prototype.slice.call(contents.querySelectorAll('[contenteditable=false]'))
428
415
  ];
429
416
  removals.forEach(el => {
430
417
  el.parentNode.removeChild(el);
@@ -451,9 +438,7 @@ export const AngularEditor = {
451
438
  // composition the ASCII characters will be prepended to the zero-width
452
439
  // space, so subtract 1 from the offset to account for the zero-width
453
440
  // space character.
454
- if (domNode &&
455
- offset === domNode.textContent.length &&
456
- (parentNode && parentNode.hasAttribute('data-slate-zero-width'))) {
441
+ if (domNode && offset === domNode.textContent.length && parentNode && parentNode.hasAttribute('data-slate-zero-width')) {
457
442
  offset--;
458
443
  }
459
444
  }
@@ -488,9 +473,7 @@ export const AngularEditor = {
488
473
  // (2020/08/08)
489
474
  // https://bugs.chromium.org/p/chromium/issues/detail?id=447523
490
475
  if (IS_CHROME && hasShadowRoot()) {
491
- isCollapsed =
492
- domRange.anchorNode === domRange.focusNode &&
493
- domRange.anchorOffset === domRange.focusOffset;
476
+ isCollapsed = domRange.anchorNode === domRange.focusNode && domRange.anchorOffset === domRange.focusOffset;
494
477
  }
495
478
  else {
496
479
  isCollapsed = domRange.isCollapsed;
@@ -515,22 +498,19 @@ export const AngularEditor = {
515
498
  return Element.isElement(node) && !editor.isInline(node) && Editor.hasInlines(editor, node);
516
499
  },
517
500
  isBlockCardLeftCursor(editor) {
518
- return editor.selection.anchor.offset === FAKE_LEFT_BLOCK_CARD_OFFSET && editor.selection.focus.offset === FAKE_LEFT_BLOCK_CARD_OFFSET;
501
+ return (editor.selection.anchor.offset === FAKE_LEFT_BLOCK_CARD_OFFSET && editor.selection.focus.offset === FAKE_LEFT_BLOCK_CARD_OFFSET);
519
502
  },
520
503
  isBlockCardRightCursor(editor) {
521
- return editor.selection.anchor.offset === FAKE_RIGHT_BLOCK_CARD_OFFSET && editor.selection.focus.offset === FAKE_RIGHT_BLOCK_CARD_OFFSET;
504
+ return (editor.selection.anchor.offset === FAKE_RIGHT_BLOCK_CARD_OFFSET &&
505
+ editor.selection.focus.offset === FAKE_RIGHT_BLOCK_CARD_OFFSET);
522
506
  },
523
507
  getCardCursorNode(editor, blockCardNode, options) {
524
508
  const blockCardElement = AngularEditor.toDOMNode(editor, blockCardNode);
525
509
  const cardCenter = blockCardElement.parentElement;
526
- return options.direction === 'left'
527
- ? cardCenter.previousElementSibling
528
- : cardCenter.nextElementSibling;
510
+ return options.direction === 'left' ? cardCenter.previousElementSibling : cardCenter.nextElementSibling;
529
511
  },
530
512
  toSlateCardEntry(editor, node) {
531
- const element = node.parentElement
532
- .closest('.slate-block-card')?.querySelector('[card-target="card-center"]')
533
- .firstElementChild;
513
+ const element = node.parentElement.closest('.slate-block-card')?.querySelector('[card-target="card-center"]').firstElementChild;
534
514
  const slateNode = AngularEditor.toSlateNode(editor, element);
535
515
  const path = AngularEditor.findPath(editor, slateNode);
536
516
  return [slateNode, path];
@@ -554,12 +534,15 @@ export const AngularEditor = {
554
534
  * @param options
555
535
  */
556
536
  moveBlockCardCursor(editor, path, options) {
557
- const cursor = { path, offset: options.direction === 'left' ? FAKE_LEFT_BLOCK_CARD_OFFSET : FAKE_RIGHT_BLOCK_CARD_OFFSET };
537
+ const cursor = {
538
+ path,
539
+ offset: options.direction === 'left' ? FAKE_LEFT_BLOCK_CARD_OFFSET : FAKE_RIGHT_BLOCK_CARD_OFFSET
540
+ };
558
541
  Transforms.select(editor, { anchor: cursor, focus: cursor });
559
542
  },
560
543
  hasRange(editor, range) {
561
544
  const { anchor, focus } = range;
562
- return (Editor.hasPath(editor, anchor.path) && Editor.hasPath(editor, focus.path));
563
- },
545
+ return Editor.hasPath(editor, anchor.path) && Editor.hasPath(editor, focus.path);
546
+ }
564
547
  };
565
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1lZGl0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy9hbmd1bGFyLWVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFRLElBQUksRUFBUyxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBYyxNQUFNLE9BQU8sQ0FBQztBQUMxRixPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNYLGFBQWEsRUFDYixjQUFjLEVBQ2QsZUFBZSxFQUNmLFdBQVcsRUFDWCxnQkFBZ0IsRUFDbkIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBT0gsYUFBYSxFQUNiLFlBQVksRUFDWixjQUFjLEVBQ2QsaUJBQWlCLEVBQ3BCLE1BQU0sY0FBYyxDQUFDO0FBSXRCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbkMsT0FBTyxFQUFFLFNBQVMsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSw0QkFBNEIsRUFBRSxzQkFBc0IsRUFBRSx3QkFBd0IsRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBcUJuTSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUc7SUFDekI7O09BRUc7SUFFSCxTQUFTLENBQUMsTUFBcUI7UUFDM0IsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7U0FDM0U7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBQ0Q7O09BRUc7SUFFSCxPQUFPLENBQUMsTUFBcUIsRUFBRSxJQUFVO1FBQ3JDLElBQUksR0FBRyxH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RixNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsbUJBQW1CLENBQUMsTUFBcUIsRUFBRSxJQUFVLEVBQUUsT0FFdEQ7UUFDRyxNQUFNLE1BQU0sR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLFNBQVMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQzNILFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsUUFBUSxDQUFDLE1BQXFCLEVBQUUsS0FBWTtRQUN4QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQUssQ0FBQztRQUNoQyxPQUFPLENBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FDNUUsQ0FBQztJQUNOLENBQUM7Q0FDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWRpdG9yLCBOb2RlLCBQYXRoLCBQb2ludCwgUmFuZ2UsIFRyYW5zZm9ybXMsIEVsZW1lbnQsIEJhc2VFZGl0b3IgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQge1xuICAgIEVESVRPUl9UT19FTEVNRU5ULFxuICAgIEVMRU1FTlRfVE9fTk9ERSxcbiAgICBJU19GT0NVU0VELFxuICAgIElTX1JFQURPTkxZLFxuICAgIE5PREVfVE9fSU5ERVgsXG4gICAgTk9ERV9UT19QQVJFTlQsXG4gICAgTk9ERV9UT19FTEVNRU5ULFxuICAgIE5PREVfVE9fS0VZLFxuICAgIEVESVRPUl9UT19XSU5ET1dcbn0gZnJvbSAnLi4vdXRpbHMvd2Vhay1tYXBzJztcbmltcG9ydCB7XG4gICAgRE9NRWxlbWVudCxcbiAgICBET01Ob2RlLFxuICAgIERPTVBvaW50LFxuICAgIERPTVJhbmdlLFxuICAgIERPTVNlbGVjdGlvbixcbiAgICBET01TdGF0aWNSYW5nZSxcbiAgICBoYXNTaGFkb3dSb290LFxuICAgIGlzRE9NRWxlbWVudCxcbiAgICBpc0RPTVNlbGVjdGlvbixcbiAgICBub3JtYWxpemVET01Qb2ludFxufSBmcm9tICcuLi91dGlscy9kb20nO1xuaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5vZGVFbnRyeSB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7IFNsYXRlRXJyb3IgfSBmcm9tICcuLi90eXBlcy9lcnJvcic7XG5pbXBvcnQgeyBLZXkgfSBmcm9tICcuLi91dGlscy9rZXknO1xuaW1wb3J0IHsgSVNfQ0hST01FLCBJU19GSVJFRk9YIH0gZnJvbSAnLi4vdXRpbHMvZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgRkFLRV9MRUZUX0JMT0NLX0NBUkRfT0ZGU0VULCBGQUtFX1JJR0hUX0JMT0NLX0NBUkRfT0ZGU0VULCBnZXRDYXJkVGFyZ2V0QXR0cmlidXRlLCBpc0NhcmRDZW50ZXJCeVRhcmdldEF0dHIsIGlzQ2FyZExlZnRCeVRhcmdldEF0dHIsIGlzQ2FyZFJpZ2h0QnlUYXJnZXRBdHRyIH0gZnJvbSAnLi4vdXRpbHMvYmxvY2stY2FyZCc7XG5pbXBvcnQgeyBTYWZlQW55IH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIEFuIEFuZ3VsYXIgYW5kIERPTS1zcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBgRWRpdG9yYCBpbnRlcmZhY2UuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBBbmd1bGFyRWRpdG9yIGV4dGVuZHMgQmFzZUVkaXRvciB7XG4gICAgaW5zZXJ0RGF0YTogKGRhdGE6IERhdGFUcmFuc2ZlcikgPT4gdm9pZDtcbiAgICBpbnNlcnRGcmFnbWVudERhdGE6IChkYXRhOiBEYXRhVHJhbnNmZXIpID0+IGJvb2xlYW5cbiAgICBpbnNlcnRUZXh0RGF0YTogKGRhdGE6IERhdGFUcmFuc2ZlcikgPT4gYm9vbGVhblxuICAgIHNldEZyYWdtZW50RGF0YTogKGRhdGE6IERhdGFUcmFuc2Zlciwgb3JpZ2luRXZlbnQ/OiAnZHJhZycgfCAnY29weScgfCAnY3V0JykgPT4gdm9pZDtcbiAgICBkZWxldGVDdXREYXRhOiAoKSA9PiB2b2lkO1xuICAgIG9uS2V5ZG93bjogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkO1xuICAgIG9uQ2xpY2s6IChldmVudDogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgICBpbmplY3RvcjogSW5qZWN0b3I7XG4gICAgaXNCbG9ja0NhcmQ6IChub2RlOiBOb2RlKSA9PiBib29sZWFuO1xuICAgIG9uRXJyb3I6IChlcnJvckRhdGE6IFNsYXRlRXJyb3IpID0+IHZvaWQ7XG4gICAgaGFzUmFuZ2U6IChlZGl0b3I6IEFuZ3VsYXJFZGl0b3IsIHJhbmdlOiBSYW5nZSkgPT4gYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IEFuZ3VsYXJFZGl0b3IgPSB7XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBob3N0IHdpbmRvdyBvZiB0aGUgY3VycmVudCBlZGl0b3IuXG4gICAgICovXG5cbiAgICBnZXRXaW5kb3coZWRpdG9yOiBBbmd1bGFyRWRpdG9yKTogV2luZG93IHtcbiAgICAgICAgY29uc3Qgd2luZG93ID0gRURJVE9SX1RPX1dJTkRPVy5nZXQoZWRpdG9yKTtcbiAgICAgICAgaWYgKCF3aW5kb3cpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgYSBob3N0IHdpbmRvdyBlbGVtZW50IGZvciB0aGlzIGVkaXRvcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBGaW5kIGEga2V5IGZvciBhIFNsYXRlIG5vZGUuXG4gICAgICovXG5cbiAgICBmaW5kS2V5KGVkaXRvcjogQW5ndWxhckVkaXRvciwgbm9kZTogTm9kZSk6IEtleSB7XG4gICAgICAgIGxldCBrZXkgPSBOT0RFX1RPX0tFWS5nZXQobm9kZSk7XG5cbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIGtleSA9IG5ldyBLZXkoKTtcbiAgICAgICAgICAgIE5PREVfVE9fS0VZLnNldChub2RlLCBrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogaGFuZGxlIGVkaXRvciBlcnJvci5cbiAgICAgKi9cblxuICAgIG9uRXJyb3IoZXJyb3JEYXRhOiBTbGF0ZUVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvckRhdGEubmF0aXZlRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yRGF0YS5uYXRpdmVFcnJvcjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSBwYXRoIG9mIFNsYXRlIG5vZGUuXG4gICAgICovXG5cbiAgICBmaW5kUGF0aChlZGl0b3I6IEFuZ3VsYXJFZGl0b3IsIG5vZGU6IE5vZGUpOiBQYXRoIHtcbiAgICAgICAgY29uc3QgcGF0aDogUGF0aCA9IFtdO1xuICAgICAgICBsZXQgY2hpbGQgPSBub2RlO1xuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBOT0RFX1RPX1BBUkVOVC5nZXQoY2hpbGQpO1xuXG4gICAgICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoRWRpdG9yLmlzRWRpdG9yKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGkgPSBOT0RFX1RPX0lOREVYLmdldChjaGlsZCk7XG5cbiAgICAgICAgICAgIGlmIChpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGF0aC51bnNoaWZ0KGkpO1xuICAgICAgICAgICAgY2hpbGQgPSBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZmluZCB0aGUgcGF0aCBmb3IgU2xhdGUgbm9kZTogJHtKU09OLnN0cmluZ2lmeShub2RlKX1gKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgRE9NIG5vZGUgdGhhdCBpbXBsZW1lbnRzIERvY3VtZW50T3JTaGFkb3dSb290IGZvciB0aGUgZWRpdG9yLlxuICAgICAqL1xuXG4gICAgZmluZERvY3VtZW50T3JTaGFkb3dSb290KGVkaXRvcjogQW5ndWxhckVkaXRvcik6IERvY3VtZW50IHwgU2hhZG93Um9vdCB7XG4gICAgICAgIGNvbnN0IGVsID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUoZWRpdG9yLCBlZGl0b3IpXG4gICAgICAgIGNvbnN0IHJvb3QgPSBlbC5nZXRSb290Tm9kZSgpXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgcm9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpICYmXG4gICAgICAgICAgICAocm9vdCBhcyBEb2N1bWVudCkuZ2V0U2VsZWN0aW9uICE9IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gcm9vdFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsLm93bmVyRG9jdW1lbnRcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGVkaXRvciBpcyBmb2N1c2VkLlxuICAgICAqL1xuXG4gICAgaXNGb2N1c2VkKGVkaXRvcjogQW5ndWxhckVkaXRvcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISFJU19GT0NVU0VELmdldChlZGl0b3IpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgZWRpdG9yIGlzIGluIHJlYWQtb25seSBtb2RlLlxuICAgICAqL1xuXG4gICAgaXNSZWFkb25seShlZGl0b3I6IEFuZ3VsYXJFZGl0b3IpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhSVNfUkVBRE9OTFkuZ2V0KGVkaXRvcik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBlZGl0b3IgaXMgaGFuZ2luZyByaWdodC5cbiAgICAgKi9cbiAgICBpc0Jsb2NrSGFuZ2luZ1JpZ2h0KGVkaXRvcjogQW5ndWxhckVkaXRvcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gZWRpdG9yO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChSYW5nZS5pc0NvbGxhcHNlZChzZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gUmFuZ2UuZWRnZXMoc2VsZWN0aW9uKTtcbiAgICAgICAgY29uc3QgZW5kQmxvY2sgPSBFZGl0b3IuYWJvdmUoZWRpdG9yLCB7IGF0OiBlbmQsIG1hdGNoOiAobm9kZSkgPT4gRWRpdG9yLmlzQmxvY2soZWRpdG9yLCBub2RlKSB9KTtcbiAgICAgICAgcmV0dXJuIEVkaXRvci5pc1N0YXJ0KGVkaXRvciwgZW5kLCBlbmRCbG9ja1sxXSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEJsdXIgdGhlIGVkaXRvci5cbiAgICAgKi9cblxuICAgIGJsdXIoZWRpdG9yOiBBbmd1bGFyRWRpdG9yKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVsID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUoZWRpdG9yLCBlZGl0b3IpO1xuICAgICAgICBjb25zdCByb290ID0gQW5ndWxhckVkaXRvci5maW5kRG9jdW1lbnRPclNoYWRvd1Jvb3QoZWRpdG9yKTtcbiAgICAgICAgSVNfRk9DVVNFRC5zZXQoZWRpdG9yLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKHJvb3QuYWN0aXZlRWxlbWVudCA9PT0gZWwpIHtcbiAgICAgICAgICAgIGVsLmJsdXIoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGb2N1cyB0aGUgZWRpdG9yLlxuICAgICAqL1xuXG4gICAgZm9jdXMoZWRpdG9yOiBBbmd1bGFyRWRpdG9yKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVsID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUoZWRpdG9yLCBlZGl0b3IpO1xuICAgICAgICBJU19GT0NVU0VELnNldChlZGl0b3IsIHRydWUpO1xuXG4gICAgICAgIGNvbnN0IHdpbmRvdyA9IEFuZ3VsYXJFZGl0b3IuZ2V0V2luZG93KGVkaXRvcik7XG4gICAgICAgIGlmICh3aW5kb3cuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gZWwpIHtcbiAgICAgICAgICAgIGVsLmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdCB0aGUgZWRpdG9yLlxuICAgICAqL1xuXG4gICAgZGVzZWxlY3QoZWRpdG9yOiBBbmd1bGFyRWRpdG9yKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uIH0gPSBlZGl0b3I7XG4gICAgICAgIGNvbnN0IHJvb3QgPSBBbmd1bGFyRWRpdG9yLmZpbmREb2N1bWVudE9yU2hhZG93Um9vdChlZGl0b3IpO1xuICAgICAgICBjb25zdCBkb21TZWxlY3Rpb24gPSAocm9vdCBhcyBEb2N1bWVudCkuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKGRvbVNlbGVjdGlvbiAmJiBkb21TZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGRvbVNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIFRyYW5zZm9ybXMuZGVzZWxlY3QoZWRpdG9yKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIERPTSBub2RlIGlzIHdpdGhpbiB0aGUgZWRpdG9yLlxuICAgICAqL1xuXG4gICAgaGFzRE9NTm9kZShlZGl0b3I6IEFuZ3VsYXJFZGl0b3IsIHRhcmdldDogRE9NTm9kZSwgb3B0aW9uczogeyBlZGl0YWJsZT86IGJvb2xlYW4gfSA9IHt9KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHsgZWRpdGFibGUgPSBmYWxzZSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZWRpdG9yRWwgPSBBbmd1bGFyRWRpdG9yLnRvRE9NTm9kZShlZGl0b3IsIGVkaXRvcik7XG4gICAgICAgIGxldCB0YXJnZXRFbDtcblxuICAgICAgICAvLyBDT01QQVQ6IEluIEZpcmVmb3gsIHJlYWRpbmcgYHRhcmdldC5ub2RlVHlwZWAgd2lsbCB0aHJvdyBhbiBlcnJvciBpZlxuICAgICAgICAvLyB0YXJnZXQgaXMgb3JpZ2luYXRpbmcgZnJvbSBhbiBpbnRlcm5hbCBcInJlc3RyaWN0ZWRcIiBlbGVtZW50IChlLmcuIGFcbiAgICAgICAgLy8gc3RlcHBlciBhcnJvdyBvbiBhIG51bWJlciBpbnB1dCkuICgyMDE4LzA1LzA0KVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vaWFuc3Rvcm10YXlsb3Ivc2xhdGUvaXNzdWVzLzE4MTlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRhcmdldEVsID0gKGlzRE9NRWxlbWVudCh0YXJnZXQpID8gdGFyZ2V0IDogdGFyZ2V0LnBhcmVudEVsZW1lbnQpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmICghZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ1Blcm1pc3Npb24gZGVuaWVkIHRvIGFjY2VzcyBwcm9wZXJ0eSBcIm5vZGVUeXBlXCInKSkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGFyZ2V0RWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YXJnZXRFbC5jbG9zZXN0KGBbZGF0YS1zbGF0ZS1lZGl0b3JdYCkgPT09IGVkaXRvckVsICYmXG4gICAgICAgICAgICAoIWVkaXRhYmxlIHx8IHRhcmdldEVsLmlzQ29udGVudEVkaXRhYmxlIHx8XG4gICAgICAgICAgICAgICAgISF0YXJnZXRFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2xhdGUtemVyby13aWR0aCcpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0IGRhdGEgZnJvbSBhIGBEYXRhVHJhbnNmZXJgIGludG8gdGhlIGVkaXRvci5cbiAgICAgKi9cblxuICAgIGluc2VydERhdGEoZWRpdG9yOiBBbmd1bGFyRWRpdG9yLCBkYXRhOiBEYXRhVHJhbnNmZXIpOiB2b2lkIHtcbiAgICAgICAgZWRpdG9yLmluc2VydERhdGEoZGF0YSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgKiBJbnNlcnQgZnJhZ21lbnQgZGF0YSBmcm9tIGEgYERhdGFUcmFuc2ZlcmAgaW50byB0aGUgZWRpdG9yLlxuICAgKi9cblxuICAgIGluc2VydEZyYWdtZW50RGF0YShlZGl0b3I6IEFuZ3VsYXJFZGl0b3IsIGRhdGE6IERhdGFUcmFuc2Zlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZWRpdG9yLmluc2VydEZyYWdtZW50RGF0YShkYXRhKVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgdGV4dCBkYXRhIGZyb20gYSBgRGF0YVRyYW5zZmVyYCBpbnRvIHRoZSBlZGl0b3IuXG4gICAgICovXG5cbiAgICBpbnNlcnRUZXh0RGF0YShlZGl0b3I6IEFuZ3VsYXJFZGl0b3IsIGRhdGE6IERhdGFUcmFuc2Zlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZWRpdG9yLmluc2VydFRleHREYXRhKGRhdGEpXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIG9uS2V5ZG93biBob29rLlxuICAgICAqL1xuICAgIG9uS2V5ZG93bihlZGl0b3I6IEFuZ3VsYXJFZGl0b3IsIGRhdGE6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZWRpdG9yLm9uS2V5ZG93bihkYXRhKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgKiBvbkNsaWNrIGhvb2suXG4gICAgKi9cbiAgICBvbkNsaWNrKGVkaXRvcjogQW5ndWxhckVkaXRvciwgZGF0YTogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBlZGl0b3Iub25DbGljayhkYXRhKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0cyBkYXRhIGZyb20gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBmcmFnbWVudCBvbiBhIGBEYXRhVHJhbnNmZXJgLlxuICAgICAqL1xuXG4gICAgc2V0RnJhZ21lbnREYXRhKGVkaXRvcjogQW5ndWxhckVkaXRvciwgZGF0YTogRGF0YVRyYW5zZmVyLCBvcmlnaW5FdmVudD86ICdkcmFnJyB8ICdjb3B5JyB8ICdjdXQnKTogdm9pZCB7XG4gICAgICAgIGVkaXRvci5zZXRGcmFnbWVudERhdGEoZGF0YSwgb3JpZ2luRXZlbnQpO1xuICAgIH0sXG5cbiAgICBkZWxldGVDdXREYXRhKGVkaXRvcjogQW5ndWxhckVkaXRvcik6IHZvaWQge1xuICAgICAgICBlZGl0b3IuZGVsZXRlQ3V0RGF0YSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSBuYXRpdmUgRE9NIGVsZW1lbnQgZnJvbSBhIFNsYXRlIG5vZGUuXG4gICAgICovXG5cbiAgICB0b0RPTU5vZGUoZWRpdG9yOiBBbmd1bGFyRWRpdG9yLCBub2RlOiBOb2RlKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBkb21Ob2RlID0gRWRpdG9yLmlzRWRpdG9yKG5vZGUpXG4gICAgICAgICAgICA/IEVESVRPUl9UT19FTEVNRU5ULmdldChlZGl0b3IpXG4gICAgICAgICAgICA6IE5PREVfVE9fRUxFTUVOVC5nZXQobm9kZSk7XG5cbiAgICAgICAgaWYgKCFkb21Ob2RlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXNvbHZlIGEgRE9NIG5vZGUgZnJvbSBTbGF0ZSBub2RlOiAke0pTT04uc3RyaW5naWZ5KG5vZGUpfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRvbU5vZGU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmQgYSBuYXRpdmUgRE9NIHNlbGVjdGlvbiBwb2ludCBmcm9tIGEgU2xhdGUgcG9pbnQuXG4gICAgICovXG5cbiAgICB0b0RPTVBvaW50KGVkaXRvcjogQW5ndWxhckVkaXRvciwgcG9pbnQ6IFBvaW50KTogRE9NUG9pbnQge1xuICAgICAgICBjb25zdCBbbm9kZV0gPSBFZGl0b3Iubm9kZShlZGl0b3IsIHBvaW50LnBhdGgpO1xuICAgICAgICBjb25zdCBlbCA9IEFuZ3VsYXJFZGl0b3IudG9ET01Ob2RlKGVkaXRvciwgbm9kZSk7XG4gICAgICAgIGxldCBkb21Qb2ludDogRE9NUG9pbnQgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gYmxvY2sgY2FyZFxuICAgICAgICBjb25zdCBjYXJkVGFyZ2V0QXR0ciA9IGdldENhcmRUYXJnZXRBdHRyaWJ1dGUoZWwpO1xuICAgICAgICBpZiAoY2FyZFRhcmdldEF0dHIpIHtcbiAgICAgICAgICAgIGlmIChwb2ludC5vZmZzZXQgPT09IEZBS0VfTEVGVF9CTE9DS19DQVJEX09GRlNFVCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnNvck5vZGUgPSBBbmd1bGFyRWRpdG9yLmdldENhcmRDdXJzb3JOb2RlKGVkaXRvciwgbm9kZSwgeyBkaXJlY3Rpb246ICdsZWZ0JyB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2N1cnNvck5vZGUsIDFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJzb3JOb2RlID0gQW5ndWxhckVkaXRvci5nZXRDYXJkQ3Vyc29yTm9kZShlZGl0b3IsIG5vZGUsIHsgZGlyZWN0aW9uOiAncmlnaHQnIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBbY3Vyc29yTm9kZSwgMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSdyZSBpbnNpZGUgYSB2b2lkIG5vZGUsIGZvcmNlIHRoZSBvZmZzZXQgdG8gMCwgb3RoZXJ3aXNlIHRoZSB6ZXJvXG4gICAgICAgIC8vIHdpZHRoIHNwYWNpbmcgY2hhcmFjdGVyIHdpbGwgcmVzdWx0IGluIGFuIGluY29ycmVjdCBvZmZzZXQgb2YgMVxuICAgICAgICBpZiAoRWRpdG9yLnZvaWQoZWRpdG9yLCB7IGF0OiBwb2ludCB9KSkge1xuICAgICAgICAgICAgcG9pbnQgPSB7IHBhdGg6IHBvaW50LnBhdGgsIG9mZnNldDogMCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9yIGVhY2ggbGVhZiwgd2UgbmVlZCB0byBpc29sYXRlIGl0cyBjb250ZW50LCB3aGljaCBtZWFucyBmaWx0ZXJpbmdcbiAgICAgICAgLy8gdG8gaXRzIGRpcmVjdCB0ZXh0IGFuZCB6ZXJvLXdpZHRoIHNwYW5zLiAoV2UgaGF2ZSB0byBmaWx0ZXIgb3V0IGFueVxuICAgICAgICAvLyBvdGhlciBzaWJsaW5ncyB0aGF0IG1heSBoYXZlIGJlZW4gcmVuZGVyZWQgYWxvbmdzaWRlIHRoZW0uKVxuICAgICAgICBjb25zdCBzZWxlY3RvciA9IGBbZGF0YS1zbGF0ZS1zdHJpbmddLCBbZGF0YS1zbGF0ZS16ZXJvLXdpZHRoXWA7XG4gICAgICAgIGNvbnN0IHRleHRzID0gQXJyYXkuZnJvbShlbC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7XG4gICAgICAgIGxldCBzdGFydCA9IDA7XG5cbiAgICAgICAgZm9yIChjb25zdCB0ZXh0IG9mIHRleHRzKSB7XG4gICAgICAgICAgICBjb25zdCBkb21Ob2RlID0gdGV4dC5jaGlsZE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICBpZiAoZG9tTm9kZSA9PSBudWxsIHx8IGRvbU5vZGUudGV4dENvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB7IGxlbmd0aCB9ID0gZG9tTm9kZS50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIGNvbnN0IGF0dHIgPSB0ZXh0LmdldEF0dHJpYnV0ZSgnZGF0YS1zbGF0ZS1sZW5ndGgnKTtcbiAgICAgICAgICAgIGNvbnN0IHRydWVMZW5ndGggPSBhdHRyID09IG51bGwgPyBsZW5ndGggOiBwYXJzZUludChhdHRyLCAxMCk7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSBzdGFydCArIHRydWVMZW5ndGg7XG5cbiAgICAgICAgICAgIGlmIChwb2ludC5vZmZzZXQgPD0gZW5kKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gTWF0aC5taW4obGVuZ3RoLCBNYXRoLm1heCgwLCBwb2ludC5vZmZzZXQgLSBzdGFydCkpO1xuICAgICAgICAgICAgICAgIGRvbVBvaW50ID0gW2RvbU5vZGUsIG9mZnNldF07XG4gICAgICAgICAgICAgICAgLy8gZml4ZWQgY3Vyc29yIHBvc2l0aW9uIGFmdGVyIHplcm8gd2lkdGggY2hhclxuICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT09IDAgJiYgbGVuZ3RoID09PSAxICYmIGRvbU5vZGUudGV4dENvbnRlbnQgPT09ICdcXHVGRUZGJykge1xuICAgICAgICAgICAgICAgICAgICBkb21Qb2ludCA9IFtkb21Ob2RlLCBvZmZzZXQgKyAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0YXJ0ID0gZW5kO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkb21Qb2ludCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVzb2x2ZSBhIERPTSBwb2ludCBmcm9tIFNsYXRlIHBvaW50OiAke0pTT04uc3RyaW5naWZ5KHBvaW50KX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkb21Qb2ludDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluZCBhIG5hdGl2ZSBET00gcmFuZ2UgZnJvbSBhIFNsYXRlIGByYW5nZWAuXG4gICAgICovXG5cbiAgICB0b0RPTVJhbmdlKGVkaXRvcjogQW5ndWxhckVkaXRvciwgcmFuZ2U6IFJhbmdlKTogRE9NUmFuZ2Uge1xuICAgICAgICBjb25zdCB7IGFuY2hvciwgZm9jdXMgfSA9IHJhbmdlO1xuICAgICAgICBjb25zdCBpc0JhY2t3YXJkID0gUmFuZ2UuaXNCYWNrd2FyZChyYW5nZSk7XG4gICAgICAgIGNvbnN0IGRvbUFuY2hvciA9IEFuZ3VsYXJFZGl0b3IudG9ET01Qb2ludChlZGl0b3IsIGFuY2hvcik7XG4gICAgICAgIGNvbnN0IGRvbUZvY3VzID0gUmFuZ2UuaXNDb2xsYXBzZWQocmFuZ2UpID8gZG9tQW5jaG9yIDogQW5ndWxhckVkaXRvci50b0RPTVBvaW50KGVkaXRvciwgZm9jdXMpO1xuXG4gICAgICAgIGNvbnN0IHdpbmRvdyA9IEFuZ3VsYXJFZGl0b3IuZ2V0V2luZG93KGVkaXRvcik7XG4gICAgICAgIGNvbnN0IGRvbVJhbmdlID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIGNvbnN0IFtzdGFydE5vZGUsIHN0YXJ0T2Zmc2V0XSA9IGlzQmFja3dhcmQgPyBkb21Gb2N1cyA6IGRvbUFuY2hvcjtcbiAgICAgICAgY29uc3QgW2VuZE5vZGUsIGVuZE9mZnNldF0gPSBpc0JhY2t3YXJkID8gZG9tQW5jaG9yIDogZG9tRm9jdXM7XG5cbiAgICAgICAgLy8gQSBzbGF0ZSBQb2ludCBhdCB6ZXJvLXdpZHRoIExlYWYgYWx3YXlzIGhhcyBhbiBvZmZzZXQgb2YgMCBidXQgYSBuYXRpdmUgRE9NIHNlbGVjdGlvbiBhdFxuICAgICAgICAvLyB6ZXJvLXdpZHRoIG5vZGUgaGFzIGFuIG9mZnNldCBvZiAxIHNvIHdlIGhhdmUgdG8gY2hlY2sgaWYgd2UgYXJlIGluIGEgemVyby13aWR0aCBub2RlIGFuZFxuICAgICAgICAvLyBhZGp1c3QgdGhlIG9mZnNldCBhY2NvcmRpbmdseS5cbiAgICAgICAgY29uc3Qgc3RhcnRFbCA9IChpc0RPTUVsZW1lbnQoc3RhcnROb2RlKVxuICAgICAgICAgICAgPyBzdGFydE5vZGVcbiAgICAgICAgICAgIDogc3RhcnROb2RlLnBhcmVudEVsZW1lbnQpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBpc1N0YXJ0QXRaZXJvV2lkdGggPSAhIXN0YXJ0RWwuZ2V0QXR0cmlidXRlKCdkYXRhLXNsYXRlLXplcm8td2lkdGgnKTtcbiAgICAgICAgY29uc3QgZW5kRWwgPSAoaXNET01FbGVtZW50KGVuZE5vZGUpXG4gICAgICAgICAgICA/IGVuZE5vZGVcbiAgICAgICAgICAgIDogZW5kTm9kZS5wYXJlbnRFbGVtZW50KSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgaXNFbmRBdFplcm9XaWR0aCA9ICEhZW5kRWwuZ2V0QXR0cmlidXRlKCdkYXRhLXNsYXRlLXplcm8td2lkdGgnKTtcblxuICAgICAgICBkb21SYW5nZS5zZXRTdGFydChzdGFydE5vZGUsIGlzU3RhcnRBdFplcm9XaWR0aCA/IDEgOiBzdGFydE9mZnNldCk7XG4gICAgICAgIGRvbVJhbmdlLnNldEVuZChlbmROb2RlLCBpc0VuZEF0WmVyb1dpZHRoID8gMSA6IGVuZE9mZnNldCk7XG4gICAgICAgIHJldHVybiBkb21SYW5nZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluZCBhIFNsYXRlIG5vZGUgZnJvbSBhIG5hdGl2ZSBET00gYGVsZW1lbnRgLlxuICAgICAqL1xuXG4gICAgdG9TbGF0ZU5vZGUoZWRpdG9yOiBBbmd1bGFyRWRpdG9yLCBkb21Ob2RlOiBET01Ob2RlKTogTm9kZSB7XG4gICAgICAgIGxldCBkb21FbCA9IGlzRE9NRWxlbWVudChkb21Ob2RlKSA/IGRvbU5vZGUgOiBkb21Ob2RlLnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGRvbUVsICYmICFkb21FbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtc2xhdGUtbm9kZScpKSB7XG4gICAgICAgICAgICBkb21FbCA9IGRvbUVsLmNsb3Nlc3QoYFtkYXRhLXNsYXRlLW5vZGVdYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBub2RlID0gZG9tRWwgPyBFTEVNRU5UX1RPX05PREUuZ2V0KGRvbUVsIGFzIEhUTUxFbGVtZW50KSA6IG51bGw7XG5cbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXNvbHZlIGEgU2xhdGUgbm9kZSBmcm9tIERPTSBub2RlOiAke2RvbUVsfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdGFyZ2V0IHJhbmdlIGZyb20gYSBET00gYGV2ZW50YC5cbiAgICAgKi9cblxuICAgIGZpbmRFdmVudFJhbmdlKGVkaXRvcjogQW5ndWxhckVkaXRvciwgZXZlbnQ6IGFueSk6IFJhbmdlIHtcbiAgICAgICAgaWYgKCduYXRpdmVFdmVudCcgaW4gZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50ID0gZXZlbnQubmF0aXZlRXZlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHksIHRhcmdldCB9ID0gZXZlbnQ7XG5cbiAgICAgICAgaWYgKHggPT0gbnVsbCB8fCB5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc29sdmUgYSBTbGF0ZSByYW5nZSBmcm9tIGEgRE9NIGV2ZW50OiAke2V2ZW50fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IEFuZ3VsYXJFZGl0b3IudG9TbGF0ZU5vZGUoZWRpdG9yLCBldmVudC50YXJnZXQpO1xuICAgICAgICBjb25zdCBwYXRoID0gQW5ndWxhckVkaXRvci5maW5kUGF0aChlZGl0b3IsIG5vZGUpO1xuXG4gICAgICAgIC8vIElmIHRoZSBkcm9wIHRhcmdldCBpcyBpbnNpZGUgYSB2b2lkIG5vZGUsIG1vdmUgaXQgaW50byBlaXRoZXIgdGhlXG4gICAgICAgIC8vIG5leHQgb3IgcHJldmlvdXMgbm9kZSwgZGVwZW5kaW5nIG9uIHdoaWNoIHNpZGUgdGhlIGB4YCBhbmQgYHlgXG4gICAgICAgIC8vIGNvb3JkaW5hdGVzIGFyZSBjbG9zZXN0IHRvLlxuICAgICAgICBpZiAoRWRpdG9yLmlzVm9pZChlZGl0b3IsIG5vZGUpKSB7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgaXNQcmV2ID0gZWRpdG9yLmlzSW5saW5lKG5vZGUpXG4gICAgICAgICAgICAgICAgPyB4IC0gcmVjdC5sZWZ0IDwgcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAtIHhcbiAgICAgICAgICAgICAgICA6IHkgLSByZWN0LnRvcCA8IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLSB5O1xuXG4gICAgICAgICAgICBjb25zdCBlZGdlID0gRWRpdG9yLnBvaW50KGVkaXRvciwgcGF0aCwge1xuICAgICAgICAgICAgICAgIGVkZ2U6IGlzUHJldiA/ICdzdGFydCcgOiAnZW5kJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IGlzUHJldiA/IEVkaXRvci5iZWZvcmUoZWRpdG9yLCBlZGdlKSA6IEVkaXRvci5hZnRlcihlZGl0b3IsIGVkZ2UpO1xuXG4gICAgICAgICAgICBpZiAocG9pbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRWRpdG9yLnJhbmdlKGVkaXRvciwgcG9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRWxzZSByZXNvbHZlIGEgcmFuZ2UgZnJvbSB0aGUgY2FyZXQgcG9zaXRpb24gd2hlcmUgdGhlIGRyb3Agb2NjdXJlZC5cbiAgICAgICAgbGV0IGRvbVJhbmdlOiBET01SYW5nZTtcbiAgICAgICAgY29uc3Qgd2luZG93ID0gQW5ndWxhckVkaXRvci5nZXRXaW5kb3coZWRpdG9yKTtcbiAgICAgICAgY29uc3QgeyBkb2N1bWVudCB9ID0gd2luZG93O1xuXG4gICAgICAgIC8vIENPTVBBVDogSW4gRmlyZWZveCwgYGNhcmV0UmFuZ2VGcm9tUG9pbnRgIGRvZXNuJ3QgZXhpc3QuICgyMDE2LzA3LzI1KVxuICAgICAgICBpZiAoZG9jdW1lbnQuY2FyZXRSYW5nZUZyb21Qb2ludCkge1xuICAgICAgICAgICAgZG9tUmFuZ2UgPSBkb2N1bWVudC5jYXJldFJhbmdlRnJvbVBvaW50KHgsIHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSAoZG9jdW1lbnQgYXMgU2FmZUFueSkuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCh4LCB5KTtcblxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgZG9tUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICAgICAgICAgIGRvbVJhbmdlLnNldFN0YXJ0KHBvc2l0aW9uLm9mZnNldE5vZGUsIHBvc2l0aW9uLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgZG9tUmFuZ2Uuc2V0RW5kKHBvc2l0aW9uLm9mZnNldE5vZGUsIHBvc2l0aW9uLm9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRvbVJhbmdlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXNvbHZlIGEgU2xhdGUgcmFuZ2UgZnJvbSBhIERPTSBldmVudDogJHtldmVudH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmUgYSBTbGF0ZSByYW5nZSBmcm9tIHRoZSBET00gcmFuZ2UuXG4gICAgICAgIGNvbnN0IHJhbmdlID0gQW5ndWxhckVkaXRvci50b1NsYXRlUmFuZ2UoZWRpdG9yLCBkb21SYW5nZSk7XG4gICAgICAgIHJldHVybiByYW5nZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluZCBhIFNsYXRlIHBvaW50IGZyb20gYSBET00gc2VsZWN0aW9uJ3MgYGRvbU5vZGVgIGFuZCBgZG9tT2Zmc2V0YC5cbiAgICAgKi9cblxuICAgIHRvU2xhdGVQb2ludChlZGl0b3I6IEFuZ3VsYXJFZGl0b3IsIGRvbVBvaW50OiBET01Qb2ludCk6IFBvaW50IHtcbiAgICAgICAgY29uc3QgW2RvbU5vZGVdID0gZG9tUG9pbnQ7XG4gICAgICAgIGNvbnN0IFtuZWFyZXN0Tm9kZSwgbmVhcmVzdE9mZnNldF0gPSBub3JtYWxpemVET01Qb2ludChkb21Qb2ludCk7XG4gICAgICAgIGxldCBwYXJlbnROb2RlID0gbmVhcmVzdE5vZGUucGFyZW50Tm9kZSBhcyBET01FbGVtZW50O1xuICAgICAgICBsZXQgdGV4dE5vZGU6IERPTUVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG5cbiAgICAgICAgLy8gYmxvY2sgY2FyZFxuICAgICAgICBjb25zdCBjYXJkVGFyZ2V0QXR0ciA9IGdldENhcmRUYXJnZXRBdHRyaWJ1dGUoZG9tTm9kZSk7XG4gICAgICAgIGlmIChjYXJkVGFyZ2V0QXR0cikge1xuICAgICAgICAgICAgY29uc3QgZG9tU2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgY29uc3QgaXNCYWNrd2FyZCA9IGVkaXRvci5zZWxlY3Rpb24gJiYgUmFuZ2UuaXNCYWNrd2FyZChlZGl0b3Iuc2VsZWN0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrQ2FyZEVudHJ5ID0gQW5ndWxhckVkaXRvci50b1NsYXRlQ2FyZEVudHJ5KGVkaXRvciwgZG9tTm9kZSkgfHwgQW5ndWxhckVkaXRvci50b1NsYXRlQ2FyZEVudHJ5KGVkaXRvciwgbmVhcmVzdE5vZGUpO1xuICAgICAgICAgICAgY29uc3QgWywgYmxvY2tQYXRoXSA9IGJsb2NrQ2FyZEVudHJ5O1xuICAgICAgICAgICAgaWYgKGRvbVNlbGVjdGlvbi5pc0NvbGxhcHNlZCkge1xuICAgICAgICAgICAgICAgIGlmIChpc0NhcmRMZWZ0QnlUYXJnZXRBdHRyKGNhcmRUYXJnZXRBdHRyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBwYXRoOiBibG9ja1BhdGgsIG9mZnNldDogLTEgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhdGg6IGJsb2NrUGF0aCwgb2Zmc2V0OiAtMiB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGZvcndhcmRcbiAgICAgICAgICAgIC8vIGFuZCB0byB0aGUgZW5kIG9mIHByZXZpb3VzIG5vZGVcbiAgICAgICAgICAgIGlmIChpc0NhcmRMZWZ0QnlUYXJnZXRBdHRyKGNhcmRUYXJnZXRBdHRyKSAmJiAhaXNCYWNrd2FyZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZFBhdGggPVxuICAgICAgICAgICAgICAgICAgICBibG9ja1BhdGhbYmxvY2tQYXRoLmxlbmd0aCAtIDFdIDw9IDBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYmxvY2tQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFBhdGgucHJldmlvdXMoYmxvY2tQYXRoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gRWRpdG9yLmVuZChlZGl0b3IsIGVuZFBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdG8gdGhlIG9mIGN1cnJlbnQgbm9kZVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChpc0NhcmRDZW50ZXJCeVRhcmdldEF0dHIoY2FyZFRhcmdldEF0dHIpIHx8XG4gICAgICAgICAgICAgICAgICAgIGlzQ2FyZFJpZ2h0QnlUYXJnZXRBdHRyKGNhcmRUYXJnZXRBdHRyKSkgJiZcbiAgICAgICAgICAgICAgICAhaXNCYWNrd2FyZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVkaXRvci5lbmQoZWRpdG9yLCBibG9ja1BhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYmFja3dhcmRcbiAgICAgICAgICAgIC8vIGFuZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub2RlXG4gICAgICAgICAgICBpZiAoaXNDYXJkUmlnaHRCeVRhcmdldEF0dHIoY2FyZFRhcmdldEF0dHIpICYmIGlzQmFja3dhcmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRWRpdG9yLnN0YXJ0KGVkaXRvciwgUGF0aC5uZXh0KGJsb2NrUGF0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYW5kIHRvIHRoZSBzdGFydCBvZiBjdXJyZW50IG5vZGVcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoaXNDYXJkQ2VudGVyQnlUYXJnZXRBdHRyKGNhcmRUYXJnZXRBdHRyKSB8fFxuICAgICAgICAgICAgICAgICAgICBpc0NhcmRMZWZ0QnlUYXJnZXRBdHRyKGNhcmRUYXJnZXRBdHRyKSkgJiZcbiAgICAgICAgICAgICAgICBpc0JhY2t3YXJkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRWRpdG9yLnN0YXJ0KGVkaXRvciwgYmxvY2tQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBjb25zdCB2b2lkTm9kZSA9IHBhcmVudE5vZGUuY2xvc2VzdCgnW2RhdGEtc2xhdGUtdm9pZD1cInRydWVcIl0nKTtcbiAgICAgICAgICAgIGxldCBsZWFmTm9kZSA9IHBhcmVudE5vZGUuY2xvc2VzdCgnW2RhdGEtc2xhdGUtbGVhZl0nKTtcbiAgICAgICAgICAgIGxldCBkb21Ob2RlOiBET01FbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBob3cgZmFyIGludG8gdGhlIHRleHQgbm9kZSB0aGUgYG5lYXJlc3ROb2RlYCBpcywgc28gdGhhdCB3ZVxuICAgICAgICAgICAgLy8gY2FuIGRldGVybWluZSB3aGF0IHRoZSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHRleHQgbm9kZSBpcy5cbiAgICAgICAgICAgIGlmIChsZWFmTm9kZSkge1xuICAgICAgICAgICAgICAgIHRleHROb2RlID0gbGVhZk5vZGUuY2xvc2VzdCgnW2RhdGEtc2xhdGUtbm9kZT1cInRleHRcIl0nKSE7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2luZG93ID0gQW5ndWxhckVkaXRvci5nZXRXaW5kb3coZWRpdG9yKTtcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KHRleHROb2RlLCAwKTtcbiAgICAgICAgICAgICAgICByYW5nZS5zZXRFbmQobmVhcmVzdE5vZGUsIG5lYXJlc3RPZmZzZXQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gcmFuZ2UuY2xvbmVDb250ZW50cygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92YWxzID0gW1xuICAgICAgICAgICAgICAgICAgICAuLi5BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXNsYXRlLXplcm8td2lkdGhdJylcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cy5xdWVyeVNlbGVjdG9yQWxsKCdbY29udGVudGVkaXRhYmxlPWZhbHNlXScpXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIHJlbW92YWxzLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlbCEucGFyZW50Tm9kZSEucmVtb3ZlQ2hpbGQoZWwpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gQ09NUEFUOiBFZGdlIGhhcyBhIGJ1ZyB3aGVyZSBSYW5nZS5wcm90b3R5cGUudG9TdHJpbmcoKSB3aWxsXG4gICAgICAgICAgICAgICAgLy8gY29udmVydCBcXG4gaW50byBcXHJcXG4uIFRoZSBidWcgY2F1c2VzIGEgbG9vcCB3aGVuIHNsYXRlLXJlYWN0XG4gICAgICAgICAgICAgICAgLy8gYXR0ZW1wdHMgdG8gcmVwb3NpdGlvbiBpdHMgY3Vyc29yIHRvIG1hdGNoIHRoZSBuYXRpdmUgcG9zaXRpb24uIFVzZVxuICAgICAgICAgICAgICAgIC8vIHRleHRDb250ZW50Lmxlbmd0aCBpbnN0ZWFkLlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzEwMjkxMTE2L1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IGNvbnRlbnRzLnRleHRDb250ZW50IS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZG9tTm9kZSA9IHRleHROb2RlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2b2lkTm9kZSkge1xuICAgICAgICAgICAgICAgIC8vIEZvciB2b2lkIG5vZGVzLCB0aGUgZWxlbWVudCB3aXRoIHRoZSBvZmZzZXQga2V5IHdpbGwgYmUgYSBjb3VzaW4sIG5vdCBhblxuICAgICAgICAgICAgICAgIC8vIGFuY2VzdG9yLCBzbyBmaW5kIGl0IGJ5IGdvaW5nIGRvd24gZnJvbSB0aGUgbmVhcmVzdCB2b2lkIHBhcmVudC5cblxuICAgICAgICAgICAgICAgIGxlYWZOb2RlID0gdm9pZE5vZGUucXVlcnlTZWxlY3RvcignW2RhdGEtc2xhdGUtbGVhZl0nKSE7XG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHZvaWROb2RlLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNsYXRlLWxlbmd0aD1cIjBcIl0nKTtcbiAgICAgICAgICAgICAgICB0ZXh0Tm9kZSA9IGxlYWZOb2RlLmNsb3Nlc3QoJ1tkYXRhLXNsYXRlLW5vZGU9XCJ0ZXh0XCJdJykhO1xuICAgICAgICAgICAgICAgIGRvbU5vZGUgPSBsZWFmTm9kZTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBkb21Ob2RlLnRleHRDb250ZW50IS5sZW5ndGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENPTVBBVDogSWYgdGhlIHBhcmVudCBub2RlIGlzIGEgU2xhdGUgemVyby13aWR0aCBzcGFjZSwgZWRpdG9yIGlzXG4gICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSB0ZXh0IG5vZGUgc2hvdWxkIGhhdmUgbm8gY2hhcmFjdGVycy4gSG93ZXZlciwgZHVyaW5nIElNRVxuICAgICAgICAgICAgLy8gY29tcG9zaXRpb24gdGhlIEFTQ0lJIGNoYXJhY3RlcnMgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhlIHplcm8td2lkdGhcbiAgICAgICAgICAgIC8vIHNwYWNlLCBzbyBzdWJ0cmFjdCAxIGZyb20gdGhlIG9mZnNldCB0byBhY2NvdW50IGZvciB0aGUgemVyby13aWR0aFxuICAgICAgICAgICAgLy8gc3BhY2UgY2hhcmFjdGVyLlxuICAgICAgICAgICAgaWYgKGRvbU5vZGUgJiZcbiAgICAgICAgICAgICAgICBvZmZzZXQgPT09IGRvbU5vZGUudGV4dENvbnRlbnQhLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUuaGFzQXR0cmlidXRlKCdkYXRhLXNsYXRlLXplcm8td2lkdGgnKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG9mZnNldC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0ZXh0Tm9kZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVzb2x2ZSBhIFNsYXRlIHBvaW50IGZyb20gRE9NIHBvaW50OiAke2RvbVBvaW50fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ09NUEFUOiBJZiBzb21lb25lIGlzIGNsaWNraW5nIGZyb20gb25lIFNsYXRlIGVkaXRvciBpbnRvIGFub3RoZXIsXG4gICAgICAgIC8vIHRoZSBzZWxlY3QgZXZlbnQgZmlyZXMgdHdpY2UsIG9uY2UgZm9yIHRoZSBvbGQgZWRpdG9yJ3MgYGVsZW1lbnRgXG4gICAgICAgIC8vIGZpcnN0LCBhbmQgdGhlbiBhZnRlcndhcmRzIGZvciB0aGUgY29ycmVjdCBgZWxlbWVudGAuICgyMDE3LzAzLzAzKVxuICAgICAgICBjb25zdCBzbGF0ZU5vZGUgPSBBbmd1bGFyRWRpdG9yLnRvU2xhdGVOb2RlKGVkaXRvciwgdGV4dE5vZGUhKTtcbiAgICAgICAgY29uc3QgcGF0aCA9IEFuZ3VsYXJFZGl0b3IuZmluZFBhdGgoZWRpdG9yLCBzbGF0ZU5vZGUpO1xuICAgICAgICByZXR1cm4geyBwYXRoLCBvZmZzZXQgfTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluZCBhIFNsYXRlIHJhbmdlIGZyb20gYSBET00gcmFuZ2Ugb3Igc2VsZWN0aW9uLlxuICAgICAqL1xuXG4gICAgdG9TbGF0ZVJhbmdlKGVkaXRvcjogQW5ndWxhckVkaXRvciwgZG9tUmFuZ2U6IERPTVJhbmdlIHwgRE9NU3RhdGljUmFuZ2UgfCBET01TZWxlY3Rpb24pOiBSYW5nZSB7XG4gICAgICAgIGNvbnN0IGVsID0gaXNET01TZWxlY3Rpb24oZG9tUmFuZ2UpID8gZG9tUmFuZ2UuYW5jaG9yTm9kZSA6IGRvbVJhbmdlLnN0YXJ0Q29udGFpbmVyO1xuICAgICAgICBsZXQgYW5jaG9yTm9kZTtcbiAgICAgICAgbGV0IGFuY2hvck9mZnNldDtcbiAgICAgICAgbGV0IGZvY3VzTm9kZTtcbiAgICAgICAgbGV0IGZvY3VzT2Zmc2V0O1xuICAgICAgICBsZXQgaXNDb2xsYXBzZWQ7XG5cbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICBpZiAoaXNET01TZWxlY3Rpb24oZG9tUmFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yTm9kZSA9IGRvbVJhbmdlLmFuY2hvck5vZGU7XG4gICAgICAgICAgICAgICAgYW5jaG9yT2Zmc2V0ID0gZG9tUmFuZ2UuYW5jaG9yT2Zmc2V0O1xuICAgICAgICAgICAgICAgIGZvY3VzTm9kZSA9IGRvbVJhbmdlLmZvY3VzTm9kZTtcbiAgICAgICAgICAgICAgICBmb2N1c09mZnNldCA9IGRvbVJhbmdlLmZvY3VzT2Zmc2V0O1xuICAgICAgICAgICAgICAgIC8vIENPTVBBVDogVGhlcmUncyBhIGJ1ZyBpbiBjaHJvbWUgdGhhdCBhbHdheXMgcmV0dXJucyBgdHJ1ZWAgZm9yXG4gICAgICAgICAgICAgICAgLy8gYGlzQ29sbGFwc2VkYCBmb3IgYSBTZWxlY3Rpb24gdGhhdCBjb21lcyBmcm9tIGEgU2hhZG93Um9vdC5cbiAgICAgICAgICAgICAgICAvLyAoMjAyMC8wOC8wOClcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NDc1MjNcbiAgICAgICAgICAgICAgICBpZiAoSVNfQ0hST01FICYmIGhhc1NoYWRvd1Jvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICBpc0NvbGxhcHNlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBkb21SYW5nZS5hbmNob3JOb2RlID09PSBkb21SYW5nZS5mb2N1c05vZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbVJhbmdlLmFuY2hvck9mZnNldCA9PT0gZG9tUmFuZ2UuZm9jdXNPZmZzZXQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaXNDb2xsYXBzZWQgPSBkb21SYW5nZS5pc0NvbGxhcHNlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFuY2hvck5vZGUgPSBkb21SYW5nZS5zdGFydENvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICBhbmNob3JPZmZzZXQgPSBkb21SYW5nZS5zdGFydE9mZnNldDtcbiAgICAgICAgICAgICAgICBmb2N1c05vZGUgPSBkb21SYW5nZS5lbmRDb250YWluZXI7XG4gICAgICAgICAgICAgICAgZm9jdXNPZmZzZXQgPSBkb21SYW5nZS5lbmRPZmZzZXQ7XG4gICAgICAgICAgICAgICAgaXNDb2xsYXBzZWQgPSBkb21SYW5nZS5jb2xsYXBzZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYW5jaG9yTm9kZSA9PSBudWxsIHx8IGZvY3VzTm9kZSA9PSBudWxsIHx8IGFuY2hvck9mZnNldCA9PSBudWxsIHx8IGZvY3VzT2Zmc2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc29sdmUgYSBTbGF0ZSByYW5nZSBmcm9tIERPTSByYW5nZTogJHtkb21SYW5nZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFuY2hvciA9IEFuZ3VsYXJFZGl0b3IudG9TbGF0ZVBvaW50KGVkaXRvciwgW2FuY2hvck5vZGUsIGFuY2hvck9mZnNldF0pO1xuICAgICAgICBjb25zdCBmb2N1cyA9IGlzQ29sbGFwc2VkID8gYW5jaG9yIDogQW5ndWxhckVkaXRvci50b1NsYXRlUG9pbnQoZWRpdG9yLCBbZm9jdXNOb2RlLCBmb2N1c09mZnNldF0pO1xuXG4gICAgICAgIHJldHVybiB7IGFuY2hvciwgZm9jdXMgfTtcbiAgICB9LFxuXG4gICAgaXNMZWFmQmxvY2soZWRpdG9yOiBBbmd1bGFyRWRpdG9yLCBub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBFbGVtZW50LmlzRWxlbWVudChub2RlKSAmJiAhZWRpdG9yLmlzSW5saW5lKG5vZGUpICYmIEVkaXRvci5oYXNJbmxpbmVzKGVkaXRvciwgbm9kZSk7XG4gICAgfSxcblxuICAgIGlzQmxvY2tDYXJkTGVmdEN1cnNvcihlZGl0b3I6IEFuZ3VsYXJFZGl0b3IpIHtcbiAgICAgICAgcmV0dXJuIGVkaXRvci5zZWxlY3Rpb24uYW5jaG9yLm9mZnNldCA9PT0gRkFLRV9MRUZUX0JMT0NLX0NBUkRfT0ZGU0VUICYmIGVkaXRvci5zZWxlY3Rpb24uZm9jdXMub2Zmc2V0ID09PSBGQUtFX0xFRlRfQkxPQ0tfQ0FSRF9PRkZTRVQ7XG4gICAgfSxcblxuICAgIGlzQmxvY2tDYXJkUmlnaHRDdXJzb3IoZWRpdG9yOiBBbmd1bGFyRWRpdG9yKSB7XG4gICAgICAgIHJldHVybiBlZGl0b3Iuc2VsZWN0aW9uLmFuY2hvci5vZmZzZXQgPT09IEZBS0VfUklHSFRfQkxPQ0tfQ0FSRF9PRkZTRVQgJiYgZWRpdG9yLnNlbGVjdGlvbi5mb2N1cy5vZmZzZXQgPT09IEZBS0VfUklHSFRfQkxPQ0tfQ0FSRF9PRkZTRVQ7XG4gICAgfSxcblxuICAgIGdldENhcmRDdXJzb3JOb2RlKGVkaXRvcjogQW5ndWxhckVkaXRvciwgYmxvY2tDYXJkTm9kZTogTm9kZSwgb3B0aW9uczoge1xuICAgICAgICBkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCcgfCAnY2VudGVyJ1xuICAgIH0pIHtcbiAgICAgICAgY29uc3QgYmxvY2tDYXJkRWxlbWVudCA9IEFuZ3VsYXJFZGl0b3IudG9ET01Ob2RlKGVkaXRvciwgYmxvY2tDYXJkTm9kZSk7XG4gICAgICAgIGNvbnN0IGNhcmRDZW50ZXIgPSBibG9ja0NhcmRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmRpcmVjdGlvbiA9PT0gJ2xlZnQnXG4gICAgICAgICAgICA/IGNhcmRDZW50ZXIucHJldmlvdXNFbGVtZW50U2libGluZ1xuICAgICAgICAgICAgOiBjYXJkQ2VudGVyLm5leHRFbGVtZW50U2libGluZztcbiAgICB9LFxuXG4gICAgdG9TbGF0ZUNhcmRFbnRyeShlZGl0b3I6IEFuZ3VsYXJFZGl0b3IsIG5vZGU6IERPTU5vZGUpOiBOb2RlRW50cnkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZS5wYXJlbnRFbGVtZW50XG4gICAgICAgICAgICAuY2xvc2VzdCgnLnNsYXRlLWJsb2NrLWNhcmQnKT8ucXVlcnlTZWxlY3RvcignW2NhcmQtdGFyZ2V0PVwiY2FyZC1jZW50ZXJcIl0nKVxuICAgICAgICAgICAgLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICBjb25zdCBzbGF0ZU5vZGUgPSBBbmd1bGFyRWRpdG9yLnRvU2xhdGVOb2RlKGVkaXRvciwgZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHBhdGggPSBBbmd1bGFyRWRpdG9yLmZpbmRQYXRoKGVkaXRvciwgc2xhdGVOb2RlKTtcbiAgICAgICAgcmV0dXJuIFtzbGF0ZU5vZGUsIHBhdGhdO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBtb3ZlIG5hdGl2ZSBzZWxlY3Rpb24gdG8gY2FyZC1sZWZ0IG9yIGNhcmQtcmlnaHRcbiAgICAgKiBAcGFyYW0gZWRpdG9yIFxuICAgICAqIEBwYXJhbSBibG9ja0NhcmROb2RlIFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFxuICAgICAqL1xuICAgIG1vdmVCbG9ja0NhcmQoZWRpdG9yOiBBbmd1bGFyRWRpdG9yLCBibG9ja0NhcmROb2RlOiBOb2RlLCBvcHRpb25zOiB7XG4gICAgICAgIGRpcmVjdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0J1xuICAgIH0pIHtcbiAgICAgICAgY29uc3QgY3Vyc29yTm9kZSA9IEFuZ3VsYXJFZGl0b3IuZ2V0Q2FyZEN1cnNvck5vZGUoZWRpdG9yLCBibG9ja0NhcmROb2RlLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3Qgd2luZG93ID0gQW5ndWxhckVkaXRvci5nZXRXaW5kb3coZWRpdG9yKTtcbiAgICAgICAgY29uc3QgZG9tU2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBkb21TZWxlY3Rpb24uc2V0QmFzZUFuZEV4dGVudChjdXJzb3JOb2RlLCAxLCBjdXJzb3JOb2RlLCAxKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogbW92ZSBzbGF0ZSBzZWxlY3Rpb24gdG8gY2FyZC1sZWZ0IG9yIGNhcmQtcmlnaHRcbiAgICAgKiBAcGFyYW0gZWRpdG9yIFxuICAgICAqIEBwYXJhbSBwYXRoIFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFxuICAgICAqL1xuICAgIG1vdmVCbG9ja0NhcmRDdXJzb3IoZWRpdG9yOiBBbmd1bGFyRWRpdG9yLCBwYXRoOiBQYXRoLCBvcHRpb25zOiB7XG4gICAgICAgIGRpcmVjdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0J1xuICAgIH0pIHtcbiAgICAgICAgY29uc3QgY3Vyc29yID0geyBwYXRoLCBvZmZzZXQ6IG9wdGlvbnMuZGlyZWN0aW9uID09PSAnbGVmdCcgPyBGQUtFX0xFRlRfQkxPQ0tfQ0FSRF9PRkZTRVQgOiBGQUtFX1JJR0hUX0JMT0NLX0NBUkRfT0ZGU0VUIH07XG4gICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgeyBhbmNob3I6IGN1cnNvciwgZm9jdXM6IGN1cnNvciB9KTtcbiAgICB9LFxuXG4gICAgaGFzUmFuZ2UoZWRpdG9yOiBBbmd1bGFyRWRpdG9yLCByYW5nZTogUmFuZ2UpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgeyBhbmNob3IsIGZvY3VzIH0gPSByYW5nZTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIEVkaXRvci5oYXNQYXRoKGVkaXRvciwgYW5jaG9yLnBhdGgpICYmIEVkaXRvci5oYXNQYXRoKGVkaXRvciwgZm9jdXMucGF0aClcbiAgICAgICAgKTtcbiAgICB9LFxufTtcbiJdfQ==
548
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1lZGl0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy9hbmd1bGFyLWVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFRLElBQUksRUFBUyxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBYyxNQUFNLE9BQU8sQ0FBQztBQUMxRixPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNYLGFBQWEsRUFDYixjQUFjLEVBQ2QsZUFBZSxFQUNmLFdBQVcsRUFDWCxnQkFBZ0IsRUFDbkIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBT0gsYUFBYSxFQUNiLFlBQVksRUFDWixjQUFjLEVBQ2QsaUJBQWlCLEVBQ3BCLE1BQU0sY0FBYyxDQUFDO0FBSXRCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbkMsT0FBTyxFQUFFLFNBQVMsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFDSCwyQkFBMkIsRUFDM0IsNEJBQTRCLEVBQzVCLHNCQUFzQixFQUN0Qix3QkFBd0IsRUFDeEIsc0JBQXNCLEVBQ3RCLHVCQUF1QixFQUMxQixNQUFNLHFCQUFxQixDQUFDO0FBcUI3QixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUc7SUFDekI7O09BRUc7SUFFSCxTQUFTLENBQUMsTUFBcUI7UUFDM0IsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7U0FDM0U7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBQ0Q7O09BRUc7SUFFSCxPQUFPLENBQUMsTUFBcUIsRUFBRSxJQUFVO1FBQ3JDLElBQUks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TUFBTSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzNDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxtQkFBbUIsQ0FDZixNQUFxQixFQUNyQixJQUFVLEVBQ1YsT0FFQztRQUVELE1BQU0sTUFBTSxHQUFHO1lBQ1gsSUFBSTtZQUNKLE1BQU0sRUFBRSxPQUFPLENBQUMsU0FBUyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLDRCQUE0QjtTQUNwRyxDQUFDO1FBQ0YsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxRQUFRLENBQUMsTUFBcUIsRUFBRSxLQUFZO1FBQ3hDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyRixDQUFDO0NBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVkaXRvciwgTm9kZSwgUGF0aCwgUG9pbnQsIFJhbmdlLCBUcmFuc2Zvcm1zLCBFbGVtZW50LCBCYXNlRWRpdG9yIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHtcbiAgICBFRElUT1JfVE9fRUxFTUVOVCxcbiAgICBFTEVNRU5UX1RPX05PREUsXG4gICAgSVNfRk9DVVNFRCxcbiAgICBJU19SRUFET05MWSxcbiAgICBOT0RFX1RPX0lOREVYLFxuICAgIE5PREVfVE9fUEFSRU5ULFxuICAgIE5PREVfVE9fRUxFTUVOVCxcbiAgICBOT0RFX1RPX0tFWSxcbiAgICBFRElUT1JfVE9fV0lORE9XXG59IGZyb20gJy4uL3V0aWxzL3dlYWstbWFwcyc7XG5pbXBvcnQge1xuICAgIERPTUVsZW1lbnQsXG4gICAgRE9NTm9kZSxcbiAgICBET01Qb2ludCxcbiAgICBET01SYW5nZSxcbiAgICBET01TZWxlY3Rpb24sXG4gICAgRE9NU3RhdGljUmFuZ2UsXG4gICAgaGFzU2hhZG93Um9vdCxcbiAgICBpc0RPTUVsZW1lbnQsXG4gICAgaXNET01TZWxlY3Rpb24sXG4gICAgbm9ybWFsaXplRE9NUG9pbnRcbn0gZnJvbSAnLi4vdXRpbHMvZG9tJztcbmltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOb2RlRW50cnkgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgeyBTbGF0ZUVycm9yIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3InO1xuaW1wb3J0IHsgS2V5IH0gZnJvbSAnLi4vdXRpbHMva2V5JztcbmltcG9ydCB7IElTX0NIUk9NRSwgSVNfRklSRUZPWCB9IGZyb20gJy4uL3V0aWxzL2Vudmlyb25tZW50JztcbmltcG9ydCB7XG4gICAgRkFLRV9MRUZUX0JMT0NLX0NBUkRfT0ZGU0VULFxuICAgIEZBS0VfUklHSFRfQkxPQ0tfQ0FSRF9PRkZTRVQsXG4gICAgZ2V0Q2FyZFRhcmdldEF0dHJpYnV0ZSxcbiAgICBpc0NhcmRDZW50ZXJCeVRhcmdldEF0dHIsXG4gICAgaXNDYXJkTGVmdEJ5VGFyZ2V0QXR0cixcbiAgICBpc0NhcmRSaWdodEJ5VGFyZ2V0QXR0clxufSBmcm9tICcuLi91dGlscy9ibG9jay1jYXJkJztcbmltcG9ydCB7IFNhZmVBbnkgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogQW4gQW5ndWxhciBhbmQgRE9NLXNwZWNpZmljIHZlcnNpb24gb2YgdGhlIGBFZGl0b3JgIGludGVyZmFjZS5cbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEFuZ3VsYXJFZGl0b3IgZXh0ZW5kcyBCYXNlRWRpdG9yIHtcbiAgICBpbnNlcnREYXRhOiAoZGF0YTogRGF0YVRyYW5zZmVyKSA9PiB2b2lkO1xuICAgIGluc2VydEZyYWdtZW50RGF0YTogKGRhdGE6IERhdGFUcmFuc2ZlcikgPT4gYm9vbGVhbjtcbiAgICBpbnNlcnRUZXh0RGF0YTogKGRhdGE6IERhdGFUcmFuc2ZlcikgPT4gYm9vbGVhbjtcbiAgICBzZXRGcmFnbWVudERhdGE6IChkYXRhOiBEYXRhVHJhbnNmZXIsIG9yaWdpbkV2ZW50PzogJ2RyYWcnIHwgJ2NvcHknIHwgJ2N1dCcpID0+IHZvaWQ7XG4gICAgZGVsZXRlQ3V0RGF0YTogKCkgPT4gdm9pZDtcbiAgICBvbktleWRvd246IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZDtcbiAgICBvbkNsaWNrOiAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XG4gICAgaW5qZWN0b3I6IEluamVjdG9yO1xuICAgIGlzQmxvY2tDYXJkOiAobm9kZTogTm9kZSkgPT4gYm9vbGVhbjtcbiAgICBvbkVycm9yOiAoZXJyb3JEYXRhOiBTbGF0ZUVycm9yKSA9PiB2b2lkO1xuICAgIGhhc1JhbmdlOiAoZWRpdG9yOiBBbmd1bGFyRWRpdG9yLCByYW5nZTogUmFuZ2UpID0+IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBBbmd1bGFyRWRpdG9yID0ge1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgaG9zdCB3aW5kb3cgb2YgdGhlIGN1cnJlbnQgZWRpdG9yLlxuICAgICAqL1xuXG4gICAgZ2V0V2luZG93KGVkaXRvcjogQW5ndWxhckVkaXRvcik6IFdpbmRvdyB7XG4gICAgICAgIGNvbnN0IHdpbmRvdyA9IEVESVRPUl9UT19XSU5ET1cuZ2V0KGVkaXRvcik7XG4gICAgICAgIGlmICghd2luZG93KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIGEgaG9zdCB3aW5kb3cgZWxlbWVudCBmb3IgdGhpcyBlZGl0b3InKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRmluZCBhIGtleSBmb3IgYSBTbGF0ZSBub2RlLlxuICAgICAqL1xuXG4gICAgZmluZEtleShlZGl0b3I6IEFuZ3VsYXJFZGl0b3IsIG5vZGU6IE5vZGUpOiBLZXkge1xuICAgICAgICBsZXQga2V5ID0gTk9ERV9UT19LRVkuZ2V0KG5vZGUpO1xuXG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICBrZXkgPSBuZXcgS2V5KCk7XG4gICAgICAgICAgICBOT0RFX1RPX0tFWS5zZXQobm9kZSwga2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGhhbmRsZSBlZGl0b3IgZXJyb3IuXG4gICAgICovXG5cbiAgICBvbkVycm9yKGVycm9yRGF0YTogU2xhdGVFcnJvcikge1xuICAgICAgICBpZiAoZXJyb3JEYXRhLm5hdGl2ZUVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvckRhdGEubmF0aXZlRXJyb3I7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgcGF0aCBvZiBTbGF0ZSBub2RlLlxuICAgICAqL1xuXG4gICAgZmluZFBhdGgoZWRpdG9yOiBBbmd1bGFyRWRpdG9yLCBub2RlOiBOb2RlKTogUGF0aCB7XG4gICAgICAgIGNvbnN0IHBhdGg6IFBhdGggPSBbXTtcbiAgICAgICAgbGV0IGNoaWxkID0gbm9kZTtcblxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gTk9ERV9UT19QQVJFTlQuZ2V0KGNoaWxkKTtcblxuICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKEVkaXRvci5pc0VkaXRvcihjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpID0gTk9ERV9UT19JTkRFWC5nZXQoY2hpbGQpO1xuXG4gICAgICAgICAgICBpZiAoaSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhdGgudW5zaGlmdChpKTtcbiAgICAgICAgICAgIGNoaWxkID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGZpbmQgdGhlIHBhdGggZm9yIFNsYXRlIG5vZGU6ICR7SlNPTi5zdHJpbmdpZnkobm9kZSl9YCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIERPTSBub2RlIHRoYXQgaW1wbGVtZW50cyBEb2N1bWVudE9yU2hhZG93Um9vdCBmb3IgdGhlIGVkaXRvci5cbiAgICAgKi9cblxuICAgIGZpbmREb2N1bWVudE9yU2hhZG93Um9vdChlZGl0b3I6IEFuZ3VsYXJFZGl0b3IpOiBEb2N1bWVudCB8IFNoYWRvd1Jvb3Qge1xuICAgICAgICBjb25zdCBlbCA9IEFuZ3VsYXJFZGl0b3IudG9ET01Ob2RlKGVkaXRvciwgZWRpdG9yKTtcbiAgICAgICAgY29uc3Qgcm9vdCA9IGVsLmdldFJvb3ROb2RlKCk7XG4gICAgICAgIGlmICgocm9vdCBpbnN0YW5jZW9mIERvY3VtZW50IHx8IHJvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290KSAmJiAocm9vdCBhcyBEb2N1bWVudCkuZ2V0U2VsZWN0aW9uICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiByb290O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsLm93bmVyRG9jdW1lbnQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBlZGl0b3IgaXMgZm9jdXNlZC5cbiAgICAgKi9cblxuICAgIGlzRm9jdXNlZChlZGl0b3I6IEFuZ3VsYXJFZGl0b3IpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhSVNfRk9DVVNFRC5nZXQoZWRpdG9yKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGVkaXRvciBpcyBpbiByZWFkLW9ubHkgbW9kZS5cbiAgICAgKi9cblxuICAgIGlzUmVhZG9ubHkoZWRpdG9yOiBBbmd1bGFyRWRpdG9yKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIUlTX1JFQURPTkxZLmdldChlZGl0b3IpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgZWRpdG9yIGlzIGhhbmdpbmcgcmlnaHQuXG4gICAgICovXG4gICAgaXNCbG9ja0hhbmdpbmdSaWdodChlZGl0b3I6IEFuZ3VsYXJFZGl0b3IpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IGVkaXRvcjtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUmFuZ2UuaXNDb2xsYXBzZWQoc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IFJhbmdlLmVkZ2VzKHNlbGVjdGlvbik7XG4gICAgICAgIGNvbnN0IGVuZEJsb2NrID0gRWRpdG9yLmFib3ZlKGVkaXRvciwge1xuICAgICAgICAgICAgYXQ6IGVuZCxcbiAgICAgICAgICAgIG1hdGNoOiBub2RlID0+IEVkaXRvci5pc0Jsb2NrKGVkaXRvciwgbm9kZSlcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBFZGl0b3IuaXNTdGFydChlZGl0b3IsIGVuZCwgZW5kQmxvY2tbMV0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBCbHVyIHRoZSBlZGl0b3IuXG4gICAgICovXG5cbiAgICBibHVyKGVkaXRvcjogQW5ndWxhckVkaXRvcik6IHZvaWQge1xuICAgICAgICBjb25zdCBlbCA9IEFuZ3VsYXJFZGl0b3IudG9ET01Ob2RlKGVkaXRvciwgZWRpdG9yKTtcbiAgICAgICAgY29uc3Qgcm9vdCA9IEFuZ3VsYXJFZGl0b3IuZmluZERvY3VtZW50T3JTaGFkb3dSb290KGVkaXRvcik7XG4gICAgICAgIElTX0ZPQ1VTRUQuc2V0KGVkaXRvciwgZmFsc2UpO1xuXG4gICAgICAgIGlmIChyb290LmFjdGl2ZUVsZW1lbnQgPT09IGVsKSB7XG4gICAgICAgICAgICBlbC5ibHVyKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRm9jdXMgdGhlIGVkaXRvci5cbiAgICAgKi9cblxuICAgIGZvY3VzKGVkaXRvcjogQW5ndWxhckVkaXRvcik6IHZvaWQge1xuICAgICAgICBjb25zdCBlbCA9IEFuZ3VsYXJFZGl0b3IudG9ET01Ob2RlKGVkaXRvciwgZWRpdG9yKTtcbiAgICAgICAgSVNfRk9DVVNFRC5zZXQoZWRpdG9yLCB0cnVlKTtcblxuICAgICAgICBjb25zdCB3aW5kb3cgPSBBbmd1bGFyRWRpdG9yLmdldFdpbmRvdyhlZGl0b3IpO1xuICAgICAgICBpZiAod2luZG93LmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGVsKSB7XG4gICAgICAgICAgICBlbC5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3QgdGhlIGVkaXRvci5cbiAgICAgKi9cblxuICAgIGRlc2VsZWN0KGVkaXRvcjogQW5ndWxhckVkaXRvcik6IHZvaWQge1xuICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gZWRpdG9yO1xuICAgICAgICBjb25zdCByb290ID0gQW5ndWxhckVkaXRvci5maW5kRG9jdW1lbnRPclNoYWRvd1Jvb3QoZWRpdG9yKTtcbiAgICAgICAgY29uc3QgZG9tU2VsZWN0aW9uID0gKHJvb3QgYXMgRG9jdW1lbnQpLmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmIChkb21TZWxlY3Rpb24gJiYgZG9tU2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBkb21TZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBUcmFuc2Zvcm1zLmRlc2VsZWN0KGVkaXRvcik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBET00gbm9kZSBpcyB3aXRoaW4gdGhlIGVkaXRvci5cbiAgICAgKi9cblxuICAgIGhhc0RPTU5vZGUoZWRpdG9yOiBBbmd1bGFyRWRpdG9yLCB0YXJnZXQ6IERPTU5vZGUsIG9wdGlvbnM6IHsgZWRpdGFibGU/OiBib29sZWFuIH0gPSB7fSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB7IGVkaXRhYmxlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGVkaXRvckVsID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUoZWRpdG9yLCBlZGl0b3IpO1xuICAgICAgICBsZXQgdGFyZ2V0RWw7XG5cbiAgICAgICAgLy8gQ09NUEFUOiBJbiBGaXJlZm94LCByZWFkaW5nIGB0YXJnZXQubm9kZVR5cGVgIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWZcbiAgICAgICAgLy8gdGFyZ2V0IGlzIG9yaWdpbmF0aW5nIGZyb20gYW4gaW50ZXJuYWwgXCJyZXN0cmljdGVkXCIgZWxlbWVudCAoZS5nLiBhXG4gICAgICAgIC8vIHN0ZXBwZXIgYXJyb3cgb24gYSBudW1iZXIgaW5wdXQpLiAoMjAxOC8wNS8wNClcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2lhbnN0b3JtdGF5bG9yL3NsYXRlL2lzc3Vlcy8xODE5XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0YXJnZXRFbCA9IChpc0RPTUVsZW1lbnQodGFyZ2V0KSA/IHRhcmdldCA6IHRhcmdldC5wYXJlbnRFbGVtZW50KSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoIWVyci5tZXNzYWdlLmluY2x1ZGVzKCdQZXJtaXNzaW9uIGRlbmllZCB0byBhY2Nlc3MgcHJvcGVydHkgXCJub2RlVHlwZVwiJykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRhcmdldEVsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGFyZ2V0RWwuY2xvc2VzdChgW2RhdGEtc2xhdGUtZWRpdG9yXWApID09PSBlZGl0b3JFbCAmJlxuICAgICAgICAgICAgKCFlZGl0YWJsZSB8fCB0YXJnZXRFbC5pc0NvbnRlbnRFZGl0YWJsZSB8fCAhIXRhcmdldEVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zbGF0ZS16ZXJvLXdpZHRoJykpXG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEluc2VydCBkYXRhIGZyb20gYSBgRGF0YVRyYW5zZmVyYCBpbnRvIHRoZSBlZGl0b3IuXG4gICAgICovXG5cbiAgICBpbnNlcnREYXRhKGVkaXRvcjogQW5ndWxhckVkaXRvciwgZGF0YTogRGF0YVRyYW5zZmVyKTogdm9pZCB7XG4gICAgICAgIGVkaXRvci5pbnNlcnREYXRhKGRhdGEpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgZnJhZ21lbnQgZGF0YSBmcm9tIGEgYERhdGFUcmFuc2ZlcmAgaW50byB0aGUgZWRpdG9yLlxuICAgICAqL1xuXG4gICAgaW5zZXJ0RnJhZ21lbnREYXRhKGVkaXRvcjogQW5ndWxhckVkaXRvciwgZGF0YTogRGF0YVRyYW5zZmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBlZGl0b3IuaW5zZXJ0RnJhZ21lbnREYXRhKGRhdGEpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgdGV4dCBkYXRhIGZyb20gYSBgRGF0YVRyYW5zZmVyYCBpbnRvIHRoZSBlZGl0b3IuXG4gICAgICovXG5cbiAgICBpbnNlcnRUZXh0RGF0YShlZGl0b3I6IEFuZ3VsYXJFZGl0b3IsIGRhdGE6IERhdGFUcmFuc2Zlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZWRpdG9yLmluc2VydFRleHREYXRhKGRhdGEpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBvbktleWRvd24gaG9vay5cbiAgICAgKi9cbiAgICBvbktleWRvd24oZWRpdG9yOiBBbmd1bGFyRWRpdG9yLCBkYXRhOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGVkaXRvci5vbktleWRvd24oZGF0YSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIG9uQ2xpY2sgaG9vay5cbiAgICAgKi9cbiAgICBvbkNsaWNrKGVkaXRvcjogQW5ndWxhckVkaXRvciwgZGF0YTogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBlZGl0b3Iub25DbGljayhkYXRhKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0cyBkYXRhIGZyb20gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBmcmFnbWVudCBvbiBhIGBEYXRhVHJhbnNmZXJgLlxuICAgICAqL1xuXG4gICAgc2V0RnJhZ21lbnREYXRhKGVkaXRvcjogQW5ndWxhckVkaXRvciwgZGF0YTogRGF0YVRyYW5zZmVyLCBvcmlnaW5FdmVudD86ICdkcmFnJyB8ICdjb3B5JyB8ICdjdXQnKTogdm9pZCB7XG4gICAgICAgIGVkaXRvci5zZXRGcmFnbWVudERhdGEoZGF0YSwgb3JpZ2luRXZlbnQpO1xuICAgIH0sXG5cbiAgICBkZWxldGVDdXREYXRhKGVkaXRvcjogQW5ndWxhckVkaXRvcik6IHZvaWQge1xuICAgICAgICBlZGl0b3IuZGVsZXRlQ3V0RGF0YSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSBuYXRpdmUgRE9NIGVsZW1lbnQgZnJvbSBhIFNsYXRlIG5vZGUuXG4gICAgICovXG5cbiAgICB0b0RPTU5vZGUoZWRpdG9yOiBBbmd1bGFyRWRpdG9yLCBub2RlOiBOb2RlKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBkb21Ob2RlID0gRWRpdG9yLmlzRWRpdG9yKG5vZGUpID8gRURJVE9SX1RPX0VMRU1FTlQuZ2V0KGVkaXRvcikgOiBOT0RFX1RPX0VMRU1FTlQuZ2V0KG5vZGUpO1xuXG4gICAgICAgIGlmICghZG9tTm9kZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVzb2x2ZSBhIERPTSBub2RlIGZyb20gU2xhdGUgbm9kZTogJHtKU09OLnN0cmluZ2lmeShub2RlKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkb21Ob2RlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGEgbmF0aXZlIERPTSBzZWxlY3Rpb24gcG9pbnQgZnJvbSBhIFNsYXRlIHBvaW50LlxuICAgICAqL1xuXG4gICAgdG9ET01Qb2ludChlZGl0b3I6IEFuZ3VsYXJFZGl0b3IsIHBvaW50OiBQb2ludCk6IERPTVBvaW50IHtcbiAgICAgICAgY29uc3QgW25vZGVdID0gRWRpdG9yLm5vZGUoZWRpdG9yLCBwb2ludC5wYXRoKTtcbiAgICAgICAgY29uc3QgZWwgPSBBbmd1bGFyRWRpdG9yLnRvRE9NTm9kZShlZGl0b3IsIG5vZGUpO1xuICAgICAgICBsZXQgZG9tUG9pbnQ6IERPTVBvaW50IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIGJsb2NrIGNhcmRcbiAgICAgICAgY29uc3QgY2FyZFRhcmdldEF0dHIgPSBnZXRDYXJkVGFyZ2V0QXR0cmlidXRlKGVsKTtcbiAgICAgICAgaWYgKGNhcmRUYXJnZXRBdHRyKSB7XG4gICAgICAgICAgICBpZiAocG9pbnQub2Zmc2V0ID09PSBGQUtFX0xFRlRfQkxPQ0tfQ0FSRF9PRkZTRVQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJzb3JOb2RlID0gQW5ndWxhckVkaXRvci5nZXRDYXJkQ3Vyc29yTm9kZShlZGl0b3IsIG5vZGUsIHsgZGlyZWN0aW9uOiAnbGVmdCcgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtjdXJzb3JOb2RlLCAxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3Vyc29yTm9kZSA9IEFuZ3VsYXJFZGl0b3IuZ2V0Q2FyZEN1cnNvck5vZGUoZWRpdG9yLCBub2RlLCB7IGRpcmVjdGlvbjogJ3JpZ2h0JyB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2N1cnNvck5vZGUsIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgd2UncmUgaW5zaWRlIGEgdm9pZCBub2RlLCBmb3JjZSB0aGUgb2Zmc2V0IHRvIDAsIG90aGVyd2lzZSB0aGUgemVyb1xuICAgICAgICAvLyB3aWR0aCBzcGFjaW5nIGNoYXJhY3RlciB3aWxsIHJlc3VsdCBpbiBhbiBpbmNvcnJlY3Qgb2Zmc2V0IG9mIDFcbiAgICAgICAgaWYgKEVkaXRvci52b2lkKGVkaXRvciwgeyBhdDogcG9pbnQgfSkpIHtcbiAgICAgICAgICAgIHBvaW50ID0geyBwYXRoOiBwb2ludC5wYXRoLCBvZmZzZXQ6IDAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZvciBlYWNoIGxlYWYsIHdlIG5lZWQgdG8gaXNvbGF0ZSBpdHMgY29udGVudCwgd2hpY2ggbWVhbnMgZmlsdGVyaW5nXG4gICAgICAgIC8vIHRvIGl0cyBkaXJlY3QgdGV4dCBhbmQgemVyby13aWR0aCBzcGFucy4gKFdlIGhhdmUgdG8gZmlsdGVyIG91dCBhbnlcbiAgICAgICAgLy8gb3RoZXIgc2libGluZ3MgdGhhdCBtYXkgaGF2ZSBiZWVuIHJlbmRlcmVkIGFsb25nc2lkZSB0aGVtLilcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBgW2RhdGEtc2xhdGUtc3RyaW5nXSwgW2RhdGEtc2xhdGUtemVyby13aWR0aF1gO1xuICAgICAgICBjb25zdCB0ZXh0cyA9IEFycmF5LmZyb20oZWwucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpO1xuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuXG4gICAgICAgIGZvciAoY29uc3QgdGV4dCBvZiB0ZXh0cykge1xuICAgICAgICAgICAgY29uc3QgZG9tTm9kZSA9IHRleHQuY2hpbGROb2Rlc1swXSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKGRvbU5vZGUgPT0gbnVsbCB8fCBkb21Ob2RlLnRleHRDb250ZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgeyBsZW5ndGggfSA9IGRvbU5vZGUudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICBjb25zdCBhdHRyID0gdGV4dC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2xhdGUtbGVuZ3RoJyk7XG4gICAgICAgICAgICBjb25zdCB0cnVlTGVuZ3RoID0gYXR0ciA9PSBudWxsID8gbGVuZ3RoIDogcGFyc2VJbnQoYXR0ciwgMTApO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyB0cnVlTGVuZ3RoO1xuXG4gICAgICAgICAgICBpZiAocG9pbnQub2Zmc2V0IDw9IGVuZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IE1hdGgubWluKGxlbmd0aCwgTWF0aC5tYXgoMCwgcG9pbnQub2Zmc2V0IC0gc3RhcnQpKTtcbiAgICAgICAgICAgICAgICBkb21Qb2ludCA9IFtkb21Ob2RlLCBvZmZzZXRdO1xuICAgICAgICAgICAgICAgIC8vIGZpeGVkIGN1cnNvciBwb3NpdGlvbiBhZnRlciB6ZXJvIHdpZHRoIGNoYXJcbiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09PSAwICYmIGxlbmd0aCA9PT0gMSAmJiBkb21Ob2RlLnRleHRDb250ZW50ID09PSAnXFx1RkVGRicpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tUG9pbnQgPSBbZG9tTm9kZSwgb2Zmc2V0ICsgMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGFydCA9IGVuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZG9tUG9pbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc29sdmUgYSBET00gcG9pbnQgZnJvbSBTbGF0ZSBwb2ludDogJHtKU09OLnN0cmluZ2lmeShwb2ludCl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZG9tUG9pbnQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmQgYSBuYXRpdmUgRE9NIHJhbmdlIGZyb20gYSBTbGF0ZSBgcmFuZ2VgLlxuICAgICAqL1xuXG4gICAgdG9ET01SYW5nZShlZGl0b3I6IEFuZ3VsYXJFZGl0b3IsIHJhbmdlOiBSYW5nZSk6IERPTVJhbmdlIHtcbiAgICAgICAgY29uc3QgeyBhbmNob3IsIGZvY3VzIH0gPSByYW5nZTtcbiAgICAgICAgY29uc3QgaXNCYWNrd2FyZCA9IFJhbmdlLmlzQmFja3dhcmQocmFuZ2UpO1xuICAgICAgICBjb25zdCBkb21BbmNob3IgPSBBbmd1bGFyRWRpdG9yLnRvRE9NUG9pbnQoZWRpdG9yLCBhbmNob3IpO1xuICAgICAgICBjb25zdCBkb21Gb2N1cyA9IFJhbmdlLmlzQ29sbGFwc2VkKHJhbmdlKSA/IGRvbUFuY2hvciA6IEFuZ3VsYXJFZGl0b3IudG9ET01Qb2ludChlZGl0b3IsIGZvY3VzKTtcblxuICAgICAgICBjb25zdCB3aW5kb3cgPSBBbmd1bGFyRWRpdG9yLmdldFdpbmRvdyhlZGl0b3IpO1xuICAgICAgICBjb25zdCBkb21SYW5nZSA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICBjb25zdCBbc3RhcnROb2RlLCBzdGFydE9mZnNldF0gPSBpc0JhY2t3YXJkID8gZG9tRm9jdXMgOiBkb21BbmNob3I7XG4gICAgICAgIGNvbnN0IFtlbmROb2RlLCBlbmRPZmZzZXRdID0gaXNCYWNrd2FyZCA/IGRvbUFuY2hvciA6IGRvbUZvY3VzO1xuXG4gICAgICAgIC8vIEEgc2xhdGUgUG9pbnQgYXQgemVyby13aWR0aCBMZWFmIGFsd2F5cyBoYXMgYW4gb2Zmc2V0IG9mIDAgYnV0IGEgbmF0aXZlIERPTSBzZWxlY3Rpb24gYXRcbiAgICAgICAgLy8gemVyby13aWR0aCBub2RlIGhhcyBhbiBvZmZzZXQgb2YgMSBzbyB3ZSBoYXZlIHRvIGNoZWNrIGlmIHdlIGFyZSBpbiBhIHplcm8td2lkdGggbm9kZSBhbmRcbiAgICAgICAgLy8gYWRqdXN0IHRoZSBvZmZzZXQgYWNjb3JkaW5nbHkuXG4gICAgICAgIGNvbnN0IHN0YXJ0RWwgPSAoaXNET01FbGVtZW50KHN0YXJ0Tm9kZSkgPyBzdGFydE5vZGUgOiBzdGFydE5vZGUucGFyZW50RWxlbWVudCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGlzU3RhcnRBdFplcm9XaWR0aCA9ICEhc3RhcnRFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2xhdGUtemVyby13aWR0aCcpO1xuICAgICAgICBjb25zdCBlbmRFbCA9IChpc0RPTUVsZW1lbnQoZW5kTm9kZSkgPyBlbmROb2RlIDogZW5kTm9kZS5wYXJlbnRFbGVtZW50KSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgaXNFbmRBdFplcm9XaWR0aCA9ICEhZW5kRWwuZ2V0QXR0cmlidXRlKCdkYXRhLXNsYXRlLXplcm8td2lkdGgnKTtcblxuICAgICAgICBkb21SYW5nZS5zZXRTdGFydChzdGFydE5vZGUsIGlzU3RhcnRBdFplcm9XaWR0aCA/IDEgOiBzdGFydE9mZnNldCk7XG4gICAgICAgIGRvbVJhbmdlLnNldEVuZChlbmROb2RlLCBpc0VuZEF0WmVyb1dpZHRoID8gMSA6IGVuZE9mZnNldCk7XG4gICAgICAgIHJldHVybiBkb21SYW5nZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluZCBhIFNsYXRlIG5vZGUgZnJvbSBhIG5hdGl2ZSBET00gYGVsZW1lbnRgLlxuICAgICAqL1xuXG4gICAgdG9TbGF0ZU5vZGUoZWRpdG9yOiBBbmd1bGFyRWRpdG9yLCBkb21Ob2RlOiBET01Ob2RlKTogTm9kZSB7XG4gICAgICAgIGxldCBkb21FbCA9IGlzRE9NRWxlbWVudChkb21Ob2RlKSA/IGRvbU5vZGUgOiBkb21Ob2RlLnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGRvbUVsICYmICFkb21FbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtc2xhdGUtbm9kZScpKSB7XG4gICAgICAgICAgICBkb21FbCA9IGRvbUVsLmNsb3Nlc3QoYFtkYXRhLXNsYXRlLW5vZGVdYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBub2RlID0gZG9tRWwgPyBFTEVNRU5UX1RPX05PREUuZ2V0KGRvbUVsIGFzIEhUTUxFbGVtZW50KSA6IG51bGw7XG5cbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXNvbHZlIGEgU2xhdGUgbm9kZSBmcm9tIERPTSBub2RlOiAke2RvbUVsfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdGFyZ2V0IHJhbmdlIGZyb20gYSBET00gYGV2ZW50YC5cbiAgICAgKi9cblxuICAgIGZpbmRFdmVudFJhbmdlKGVkaXRvcjogQW5ndWxhckVkaXRvciwgZXZlbnQ6IGFueSk6IFJhbmdlIHtcbiAgICAgICAgaWYgKCduYXRpdmVFdmVudCcgaW4gZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50ID0gZXZlbnQubmF0aXZlRXZlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHksIHRhcmdldCB9ID0gZXZlbnQ7XG5cbiAgICAgICAgaWYgKHggPT0gbnVsbCB8fCB5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc29sdmUgYSBTbGF0ZSByYW5nZSBmcm9tIGEgRE9NIGV2ZW50OiAke2V2ZW50fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IEFuZ3VsYXJFZGl0b3IudG9TbGF0ZU5vZGUoZWRpdG9yLCBldmVudC50YXJnZXQpO1xuICAgICAgICBjb25zdCBwYXRoID0gQW5ndWxhckVkaXRvci5maW5kUGF0aChlZGl0b3IsIG5vZGUpO1xuXG4gICAgICAgIC8vIElmIHRoZSBkcm9wIHRhcmdldCBpcyBpbnNpZGUgYSB2b2lkIG5vZGUsIG1vdmUgaXQgaW50byBlaXRoZXIgdGhlXG4gICAgICAgIC8vIG5leHQgb3IgcHJldmlvdXMgbm9kZSwgZGVwZW5kaW5nIG9uIHdoaWNoIHNpZGUgdGhlIGB4YCBhbmQgYHlgXG4gICAgICAgIC8vIGNvb3JkaW5hdGVzIGFyZSBjbG9zZXN0IHRvLlxuICAgICAgICBpZiAoRWRpdG9yLmlzVm9pZChlZGl0b3IsIG5vZGUpKSB7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgaXNQcmV2ID0gZWRpdG9yLmlzSW5saW5lKG5vZGUpID8geCAtIHJlY3QubGVmdCA8IHJlY3QubGVmdCArIHJlY3Qud2lkdGggLSB4IDogeSAtIHJlY3QudG9wIDwgcmVjdC50b3AgKyByZWN0LmhlaWdodCAtIHk7XG5cbiAgICAgICAgICAgIGNvbnN0IGVkZ2UgPSBFZGl0b3IucG9pbnQoZWRpdG9yLCBwYXRoLCB7XG4gICAgICAgICAgICAgICAgZWRnZTogaXNQcmV2ID8gJ3N0YXJ0JyA6ICdlbmQnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gaXNQcmV2ID8gRWRpdG9yLmJlZm9yZShlZGl0b3IsIGVkZ2UpIDogRWRpdG9yLmFmdGVyKGVkaXRvciwgZWRnZSk7XG5cbiAgICAgICAgICAgIGlmIChwb2ludCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBFZGl0b3IucmFuZ2UoZWRpdG9yLCBwb2ludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbHNlIHJlc29sdmUgYSByYW5nZSBmcm9tIHRoZSBjYXJldCBwb3NpdGlvbiB3aGVyZSB0aGUgZHJvcCBvY2N1cmVkLlxuICAgICAgICBsZXQgZG9tUmFuZ2U6IERPTVJhbmdlO1xuICAgICAgICBjb25zdCB3aW5kb3cgPSBBbmd1bGFyRWRpdG9yLmdldFdpbmRvdyhlZGl0b3IpO1xuICAgICAgICBjb25zdCB7IGRvY3VtZW50IH0gPSB3aW5kb3c7XG5cbiAgICAgICAgLy8gQ09NUEFUOiBJbiBGaXJlZm94LCBgY2FyZXRSYW5nZUZyb21Qb2ludGAgZG9lc24ndCBleGlzdC4gKDIwMTYvMDcvMjUpXG4gICAgICAgIGlmIChkb2N1bWVudC5jYXJldFJhbmdlRnJvbVBvaW50KSB7XG4gICAgICAgICAgICBkb21SYW5nZSA9IGRvY3VtZW50LmNhcmV0UmFuZ2VGcm9tUG9pbnQoeCwgeSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IChkb2N1bWVudCBhcyBTYWZlQW55KS5jYXJldFBvc2l0aW9uRnJvbVBvaW50KHgsIHkpO1xuXG4gICAgICAgICAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBkb21SYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICAgICAgZG9tUmFuZ2Uuc2V0U3RhcnQocG9zaXRpb24ub2Zmc2V0Tm9kZSwgcG9zaXRpb24ub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBkb21SYW5nZS5zZXRFbmQocG9zaXRpb24ub2Zmc2V0Tm9kZSwgcG9zaXRpb24ub2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZG9tUmFuZ2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc29sdmUgYSBTbGF0ZSByYW5nZSBmcm9tIGEgRE9NIGV2ZW50OiAke2V2ZW50fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBhIFNsYXRlIHJhbmdlIGZyb20gdGhlIERPTSByYW5nZS5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBBbmd1bGFyRWRpdG9yLnRvU2xhdGVSYW5nZShlZGl0b3IsIGRvbVJhbmdlKTtcbiAgICAgICAgcmV0dXJuIHJhbmdlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGEgU2xhdGUgcG9pbnQgZnJvbSBhIERPTSBzZWxlY3Rpb24ncyBgZG9tTm9kZWAgYW5kIGBkb21PZmZzZXRgLlxuICAgICAqL1xuXG4gICAgdG9TbGF0ZVBvaW50KGVkaXRvcjogQW5ndWxhckVkaXRvciwgZG9tUG9pbnQ6IERPTVBvaW50KTogUG9pbnQge1xuICAgICAgICBjb25zdCBbZG9tTm9kZV0gPSBkb21Qb2ludDtcbiAgICAgICAgY29uc3QgW25lYXJlc3ROb2RlLCBuZWFyZXN0T2Zmc2V0XSA9IG5vcm1hbGl6ZURPTVBvaW50KGRvbVBvaW50KTtcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBuZWFyZXN0Tm9kZS5wYXJlbnROb2RlIGFzIERPTUVsZW1lbnQ7XG4gICAgICAgIGxldCB0ZXh0Tm9kZTogRE9NRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcblxuICAgICAgICAvLyBibG9jayBjYXJkXG4gICAgICAgIGNvbnN0IGNhcmRUYXJnZXRBdHRyID0gZ2V0Q2FyZFRhcmdldEF0dHJpYnV0ZShkb21Ob2RlKTtcbiAgICAgICAgaWYgKGNhcmRUYXJnZXRBdHRyKSB7XG4gICAgICAgICAgICBjb25zdCBkb21TZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICBjb25zdCBpc0JhY2t3YXJkID0gZWRpdG9yLnNlbGVjdGlvbiAmJiBSYW5nZS5pc0JhY2t3YXJkKGVkaXRvci5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgY29uc3QgYmxvY2tDYXJkRW50cnkgPSBBbmd1bGFyRWRpdG9yLnRvU2xhdGVDYXJkRW50cnkoZWRpdG9yLCBkb21Ob2RlKSB8fCBBbmd1bGFyRWRpdG9yLnRvU2xhdGVDYXJkRW50cnkoZWRpdG9yLCBuZWFyZXN0Tm9kZSk7XG4gICAgICAgICAgICBjb25zdCBbLCBibG9ja1BhdGhdID0gYmxvY2tDYXJkRW50cnk7XG4gICAgICAgICAgICBpZiAoZG9tU2VsZWN0aW9uLmlzQ29sbGFwc2VkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQ2FyZExlZnRCeVRhcmdldEF0dHIoY2FyZFRhcmdldEF0dHIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhdGg6IGJsb2NrUGF0aCwgb2Zmc2V0OiAtMSB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhdGg6IGJsb2NrUGF0aCwgb2Zmc2V0OiAtMiB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGZvcndhcmRcbiAgICAgICAgICAgIC8vIGFuZCB0byB0aGUgZW5kIG9mIHByZXZpb3VzIG5vZGVcbiAgICAgICAgICAgIGlmIChpc0NhcmRMZWZ0QnlUYXJnZXRBdHRyKGNhcmRUYXJnZXRBdHRyKSAmJiAhaXNCYWNrd2FyZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZFBhdGggPSBibG9ja1BhdGhbYmxvY2tQYXRoLmxlbmd0aCAtIDFdIDw9IDAgPyBibG9ja1BhdGggOiBQYXRoLnByZXZpb3VzKGJsb2NrUGF0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVkaXRvci5lbmQoZWRpdG9yLCBlbmRQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRvIHRoZSBvZiBjdXJyZW50IG5vZGVcbiAgICAgICAgICAgIGlmICgoaXNDYXJkQ2VudGVyQnlUYXJnZXRBdHRyKGNhcmRUYXJnZXRBdHRyKSB8fCBpc0NhcmRSaWdodEJ5VGFyZ2V0QXR0cihjYXJkVGFyZ2V0QXR0cikpICYmICFpc0JhY2t3YXJkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVkaXRvci5lbmQoZWRpdG9yLCBibG9ja1BhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYmFja3dhcmRcbiAgICAgICAgICAgIC8vIGFuZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub2RlXG4gICAgICAgICAgICBpZiAoaXNDYXJkUmlnaHRCeVRhcmdldEF0dHIoY2FyZFRhcmdldEF0dHIpICYmIGlzQmFja3dhcmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRWRpdG9yLnN0YXJ0KGVkaXRvciwgUGF0aC5uZXh0KGJsb2NrUGF0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYW5kIHRvIHRoZSBzdGFydCBvZiBjdXJyZW50IG5vZGVcbiAgICAgICAgICAgIGlmICgoaXNDYXJkQ2VudGVyQnlUYXJnZXRBdHRyKGNhcmRUYXJnZXRBdHRyKSB8fCBpc0NhcmRMZWZ0QnlUYXJnZXRBdHRyKGNhcmRUYXJnZXRBdHRyKSkgJiYgaXNCYWNrd2FyZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBFZGl0b3Iuc3RhcnQoZWRpdG9yLCBibG9ja1BhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHZvaWROb2RlID0gcGFyZW50Tm9kZS5jbG9zZXN0KCdbZGF0YS1zbGF0ZS12b2lkPVwidHJ1ZVwiXScpO1xuICAgICAgICAgICAgbGV0IGxlYWZOb2RlID0gcGFyZW50Tm9kZS5jbG9zZXN0KCdbZGF0YS1zbGF0ZS1sZWFmXScpO1xuICAgICAgICAgICAgbGV0IGRvbU5vZGU6IERPTUVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGhvdyBmYXIgaW50byB0aGUgdGV4dCBub2RlIHRoZSBgbmVhcmVzdE5vZGVgIGlzLCBzbyB0aGF0IHdlXG4gICAgICAgICAgICAvLyBjYW4gZGV0ZXJtaW5lIHdoYXQgdGhlIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgdGV4dCBub2RlIGlzLlxuICAgICAgICAgICAgaWYgKGxlYWZOb2RlKSB7XG4gICAgICAgICAgICAgICAgdGV4dE5vZGUgPSBsZWFmTm9kZS5jbG9zZXN0KCdbZGF0YS1zbGF0ZS1ub2RlPVwidGV4dFwiXScpITtcbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSBBbmd1bGFyRWRpdG9yLmdldFdpbmRvdyhlZGl0b3IpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQodGV4dE5vZGUsIDApO1xuICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZChuZWFyZXN0Tm9kZSwgbmVhcmVzdE9mZnNldCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudHMgPSByYW5nZS5jbG9uZUNvbnRlbnRzKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZhbHMgPSBbXG4gICAgICAgICAgICAgICAgICAgIC4uLkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGNvbnRlbnRzLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXNsYXRlLXplcm8td2lkdGhdJykpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjb250ZW50cy5xdWVyeVNlbGVjdG9yQWxsKCdbY29udGVudGVkaXRhYmxlPWZhbHNlXScpKVxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICByZW1vdmFscy5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZWwhLnBhcmVudE5vZGUhLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIENPTVBBVDogRWRnZSBoYXMgYSBidWcgd2hlcmUgUmFuZ2UucHJvdG90eXBlLnRvU3RyaW5nKCkgd2lsbFxuICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgXFxuIGludG8gXFxyXFxuLiBUaGUgYnVnIGNhdXNlcyBhIGxvb3Agd2hlbiBzbGF0ZS1yZWFjdFxuICAgICAgICAgICAgICAgIC8vIGF0dGVtcHRzIHRvIHJlcG9zaXRpb24gaXRzIGN1cnNvciB0byBtYXRjaCB0aGUgbmF0aXZlIHBvc2l0aW9uLiBVc2VcbiAgICAgICAgICAgICAgICAvLyB0ZXh0Q29udGVudC5sZW5ndGggaW5zdGVhZC5cbiAgICAgICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL2VuLXVzL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy8xMDI5MTExNi9cbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBjb250ZW50cy50ZXh0Q29udGVudCEubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGRvbU5vZGUgPSB0ZXh0Tm9kZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodm9pZE5vZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBGb3Igdm9pZCBub2RlcywgdGhlIGVsZW1lbnQgd2l0aCB0aGUgb2Zmc2V0IGtleSB3aWxsIGJlIGEgY291c2luLCBub3QgYW5cbiAgICAgICAgICAgICAgICAvLyBhbmNlc3Rvciwgc28gZmluZCBpdCBieSBnb2luZyBkb3duIGZyb20gdGhlIG5lYXJlc3Qgdm9pZCBwYXJlbnQuXG5cbiAgICAgICAgICAgICAgICBsZWFmTm9kZSA9IHZvaWROb2RlLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNsYXRlLWxlYWZdJykhO1xuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSB2b2lkTm9kZS5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zbGF0ZS1sZW5ndGg9XCIwXCJdJyk7XG4gICAgICAgICAgICAgICAgdGV4dE5vZGUgPSBsZWFmTm9kZS5jbG9zZXN0KCdbZGF0YS1zbGF0ZS1ub2RlPVwidGV4dFwiXScpITtcbiAgICAgICAgICAgICAgICBkb21Ob2RlID0gbGVhZk5vZGU7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gZG9tTm9kZS50ZXh0Q29udGVudCEubGVuZ3RoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDT01QQVQ6IElmIHRoZSBwYXJlbnQgbm9kZSBpcyBhIFNsYXRlIHplcm8td2lkdGggc3BhY2UsIGVkaXRvciBpc1xuICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgdGV4dCBub2RlIHNob3VsZCBoYXZlIG5vIGNoYXJhY3RlcnMuIEhvd2V2ZXIsIGR1cmluZyBJTUVcbiAgICAgICAgICAgIC8vIGNvbXBvc2l0aW9uIHRoZSBBU0NJSSBjaGFyYWN0ZXJzIHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoZSB6ZXJvLXdpZHRoXG4gICAgICAgICAgICAvLyBzcGFjZSwgc28gc3VidHJhY3QgMSBmcm9tIHRoZSBvZmZzZXQgdG8gYWNjb3VudCBmb3IgdGhlIHplcm8td2lkdGhcbiAgICAgICAgICAgIC8vIHNwYWNlIGNoYXJhY3Rlci5cbiAgICAgICAgICAgIGlmIChkb21Ob2RlICYmIG9mZnNldCA9PT0gZG9tTm9kZS50ZXh0Q29udGVudCEubGVuZ3RoICYmIHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS5oYXNBdHRyaWJ1dGUoJ2RhdGEtc2xhdGUtemVyby13aWR0aCcpKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0LS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRleHROb2RlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXNvbHZlIGEgU2xhdGUgcG9pbnQgZnJvbSBET00gcG9pbnQ6ICR7ZG9tUG9pbnR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDT01QQVQ6IElmIHNvbWVvbmUgaXMgY2xpY2tpbmcgZnJvbSBvbmUgU2xhdGUgZWRpdG9yIGludG8gYW5vdGhlcixcbiAgICAgICAgLy8gdGhlIHNlbGVjdCBldmVudCBmaXJlcyB0d2ljZSwgb25jZSBmb3IgdGhlIG9sZCBlZGl0b3IncyBgZWxlbWVudGBcbiAgICAgICAgLy8gZmlyc3QsIGFuZCB0aGVuIGFmdGVyd2FyZHMgZm9yIHRoZSBjb3JyZWN0IGBlbGVtZW50YC4gKDIwMTcvMDMvMDMpXG4gICAgICAgIGNvbnN0IHNsYXRlTm9kZSA9IEFuZ3VsYXJFZGl0b3IudG9TbGF0ZU5vZGUoZWRpdG9yLCB0ZXh0Tm9kZSEpO1xuICAgICAgICBjb25zdCBwYXRoID0gQW5ndWxhckVkaXRvci5maW5kUGF0aChlZGl0b3IsIHNsYXRlTm9kZSk7XG4gICAgICAgIHJldHVybiB7IHBhdGgsIG9mZnNldCB9O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGEgU2xhdGUgcmFuZ2UgZnJvbSBhIERPTSByYW5nZSBvciBzZWxlY3Rpb24uXG4gICAgICovXG5cbiAgICB0b1NsYXRlUmFuZ2UoZWRpdG9yOiBBbmd1bGFyRWRpdG9yLCBkb21SYW5nZTogRE9NUmFuZ2UgfCBET01TdGF0aWNSYW5nZSB8IERPTVNlbGVjdGlvbik6IFJhbmdlIHtcbiAgICAgICAgY29uc3QgZWwgPSBpc0RPTVNlbGVjdGlvbihkb21SYW5nZSkgPyBkb21SYW5nZS5hbmNob3JOb2RlIDogZG9tUmFuZ2Uuc3RhcnRDb250YWluZXI7XG4gICAgICAgIGxldCBhbmNob3JOb2RlO1xuICAgICAgICBsZXQgYW5jaG9yT2Zmc2V0O1xuICAgICAgICBsZXQgZm9jdXNOb2RlO1xuICAgICAgICBsZXQgZm9jdXNPZmZzZXQ7XG4gICAgICAgIGxldCBpc0NvbGxhcHNlZDtcblxuICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgIGlmIChpc0RPTVNlbGVjdGlvbihkb21SYW5nZSkpIHtcbiAgICAgICAgICAgICAgICBhbmNob3JOb2RlID0gZG9tUmFuZ2UuYW5jaG9yTm9kZTtcbiAgICAgICAgICAgICAgICBhbmNob3JPZmZzZXQgPSBkb21SYW5nZS5hbmNob3JPZmZzZXQ7XG4gICAgICAgICAgICAgICAgZm9jdXNOb2RlID0gZG9tUmFuZ2UuZm9jdXNOb2RlO1xuICAgICAgICAgICAgICAgIGZvY3VzT2Zmc2V0ID0gZG9tUmFuZ2UuZm9jdXNPZmZzZXQ7XG4gICAgICAgICAgICAgICAgLy8gQ09NUEFUOiBUaGVyZSdzIGEgYnVnIGluIGNocm9tZSB0aGF0IGFsd2F5cyByZXR1cm5zIGB0cnVlYCBmb3JcbiAgICAgICAgICAgICAgICAvLyBgaXNDb2xsYXBzZWRgIGZvciBhIFNlbGVjdGlvbiB0aGF0IGNvbWVzIGZyb20gYSBTaGFkb3dSb290LlxuICAgICAgICAgICAgICAgIC8vICgyMDIwLzA4LzA4KVxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0NzUyM1xuICAgICAgICAgICAgICAgIGlmIChJU19DSFJPTUUgJiYgaGFzU2hhZG93Um9vdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzQ29sbGFwc2VkID0gZG9tUmFuZ2UuYW5jaG9yTm9kZSA9PT0gZG9tUmFuZ2UuZm9jdXNOb2RlICYmIGRvbVJhbmdlLmFuY2hvck9mZnNldCA9PT0gZG9tUmFuZ2UuZm9jdXNPZmZzZXQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaXNDb2xsYXBzZWQgPSBkb21SYW5nZS5pc0NvbGxhcHNlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFuY2hvck5vZGUgPSBkb21SYW5nZS5zdGFydENvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICBhbmNob3JPZmZzZXQgPSBkb21SYW5nZS5zdGFydE9mZnNldDtcbiAgICAgICAgICAgICAgICBmb2N1c05vZGUgPSBkb21SYW5nZS5lbmRDb250YWluZXI7XG4gICAgICAgICAgICAgICAgZm9jdXNPZmZzZXQgPSBkb21SYW5nZS5lbmRPZmZzZXQ7XG4gICAgICAgICAgICAgICAgaXNDb2xsYXBzZWQgPSBkb21SYW5nZS5jb2xsYXBzZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYW5jaG9yTm9kZSA9PSBudWxsIHx8IGZvY3VzTm9kZSA9PSBudWxsIHx8IGFuY2hvck9mZnNldCA9PSBudWxsIHx8IGZvY3VzT2Zmc2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc29sdmUgYSBTbGF0ZSByYW5nZSBmcm9tIERPTSByYW5nZTogJHtkb21SYW5nZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFuY2hvciA9IEFuZ3VsYXJFZGl0b3IudG9TbGF0ZVBvaW50KGVkaXRvciwgW2FuY2hvck5vZGUsIGFuY2hvck9mZnNldF0pO1xuICAgICAgICBjb25zdCBmb2N1cyA9IGlzQ29sbGFwc2VkID8gYW5jaG9yIDogQW5ndWxhckVkaXRvci50b1NsYXRlUG9pbnQoZWRpdG9yLCBbZm9jdXNOb2RlLCBmb2N1c09mZnNldF0pO1xuXG4gICAgICAgIHJldHVybiB7IGFuY2hvciwgZm9jdXMgfTtcbiAgICB9LFxuXG4gICAgaXNMZWFmQmxvY2soZWRpdG9yOiBBbmd1bGFyRWRpdG9yLCBub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBFbGVtZW50LmlzRWxlbWVudChub2RlKSAmJiAhZWRpdG9yLmlzSW5saW5lKG5vZGUpICYmIEVkaXRvci5oYXNJbmxpbmVzKGVkaXRvciwgbm9kZSk7XG4gICAgfSxcblxuICAgIGlzQmxvY2tDYXJkTGVmdEN1cnNvcihlZGl0b3I6IEFuZ3VsYXJFZGl0b3IpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGVkaXRvci5zZWxlY3Rpb24uYW5jaG9yLm9mZnNldCA9PT0gRkFLRV9MRUZUX0JMT0NLX0NBUkRfT0ZGU0VUICYmIGVkaXRvci5zZWxlY3Rpb24uZm9jdXMub2Zmc2V0ID09PSBGQUtFX0xFRlRfQkxPQ0tfQ0FSRF9PRkZTRVRcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgaXNCbG9ja0NhcmRSaWdodEN1cnNvcihlZGl0b3I6IEFuZ3VsYXJFZGl0b3IpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGVkaXRvci5zZWxlY3Rpb24uYW5jaG9yLm9mZnNldCA9PT0gRkFLRV9SSUdIVF9CTE9DS19DQVJEX09GRlNFVCAmJlxuICAgICAgICAgICAgZWRpdG9yLnNlbGVjdGlvbi5mb2N1cy5vZmZzZXQgPT09IEZBS0VfUklHSFRfQkxPQ0tfQ0FSRF9PRkZTRVRcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgZ2V0Q2FyZEN1cnNvck5vZGUoXG4gICAgICAgIGVkaXRvcjogQW5ndWxhckVkaXRvcixcbiAgICAgICAgYmxvY2tDYXJkTm9kZTogTm9kZSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnIHwgJ2NlbnRlcic7XG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgY29uc3QgYmxvY2tDYXJkRWxlbWVudCA9IEFuZ3VsYXJFZGl0b3IudG9ET01Ob2RlKGVkaXRvciwgYmxvY2tDYXJkTm9kZSk7XG4gICAgICAgIGNvbnN0IGNhcmRDZW50ZXIgPSBibG9ja0NhcmRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmRpcmVjdGlvbiA9PT0gJ2xlZnQnID8gY2FyZENlbnRlci5wcmV2aW91c0VsZW1lbnRTaWJsaW5nIDogY2FyZENlbnRlci5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgfSxcblxuICAgIHRvU2xhdGVDYXJkRW50cnkoZWRpdG9yOiBBbmd1bGFyRWRpdG9yLCBub2RlOiBET01Ob2RlKTogTm9kZUVudHJ5IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IG5vZGUucGFyZW50RWxlbWVudC5jbG9zZXN0KCcuc2xhdGUtYmxvY2stY2FyZCcpPy5xdWVyeVNlbGVjdG9yKCdbY2FyZC10YXJnZXQ9XCJjYXJkLWNlbnRlclwiXScpLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICBjb25zdCBzbGF0ZU5vZGUgPSBBbmd1bGFyRWRpdG9yLnRvU2xhdGVOb2RlKGVkaXRvciwgZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHBhdGggPSBBbmd1bGFyRWRpdG9yLmZpbmRQYXRoKGVkaXRvciwgc2xhdGVOb2RlKTtcbiAgICAgICAgcmV0dXJuIFtzbGF0ZU5vZGUsIHBhdGhdO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBtb3ZlIG5hdGl2ZSBzZWxlY3Rpb24gdG8gY2FyZC1sZWZ0IG9yIGNhcmQtcmlnaHRcbiAgICAgKiBAcGFyYW0gZWRpdG9yXG4gICAgICogQHBhcmFtIGJsb2NrQ2FyZE5vZGVcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqL1xuICAgIG1vdmVCbG9ja0NhcmQoXG4gICAgICAgIGVkaXRvcjogQW5ndWxhckVkaXRvcixcbiAgICAgICAgYmxvY2tDYXJkTm9kZTogTm9kZSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnO1xuICAgICAgICB9XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGN1cnNvck5vZGUgPSBBbmd1bGFyRWRpdG9yLmdldENhcmRDdXJzb3JOb2RlKGVkaXRvciwgYmxvY2tDYXJkTm9kZSwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHdpbmRvdyA9IEFuZ3VsYXJFZGl0b3IuZ2V0V2luZG93KGVkaXRvcik7XG4gICAgICAgIGNvbnN0IGRvbVNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgZG9tU2VsZWN0aW9uLnNldEJhc2VBbmRFeHRlbnQoY3Vyc29yTm9kZSwgMSwgY3Vyc29yTm9kZSwgMSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIG1vdmUgc2xhdGUgc2VsZWN0aW9uIHRvIGNhcmQtbGVmdCBvciBjYXJkLXJpZ2h0XG4gICAgICogQHBhcmFtIGVkaXRvclxuICAgICAqIEBwYXJhbSBwYXRoXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKi9cbiAgICBtb3ZlQmxvY2tDYXJkQ3Vyc29yKFxuICAgICAgICBlZGl0b3I6IEFuZ3VsYXJFZGl0b3IsXG4gICAgICAgIHBhdGg6IFBhdGgsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JztcbiAgICAgICAgfVxuICAgICkge1xuICAgICAgICBjb25zdCBjdXJzb3IgPSB7XG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgb2Zmc2V0OiBvcHRpb25zLmRpcmVjdGlvbiA9PT0gJ2xlZnQnID8gRkFLRV9MRUZUX0JMT0NLX0NBUkRfT0ZGU0VUIDogRkFLRV9SSUdIVF9CTE9DS19DQVJEX09GRlNFVFxuICAgICAgICB9O1xuICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdChlZGl0b3IsIHsgYW5jaG9yOiBjdXJzb3IsIGZvY3VzOiBjdXJzb3IgfSk7XG4gICAgfSxcblxuICAgIGhhc1JhbmdlKGVkaXRvcjogQW5ndWxhckVkaXRvciwgcmFuZ2U6IFJhbmdlKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHsgYW5jaG9yLCBmb2N1cyB9ID0gcmFuZ2U7XG4gICAgICAgIHJldHVybiBFZGl0b3IuaGFzUGF0aChlZGl0b3IsIGFuY2hvci5wYXRoKSAmJiBFZGl0b3IuaGFzUGF0aChlZGl0b3IsIGZvY3VzLnBhdGgpO1xuICAgIH1cbn07XG4iXX0=