@wavemaker/app-ng-runtime 11.10.2-rc.203 → 11.10.3-next.25128

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 (170) hide show
  1. package/build-task/bundles/index.umd.js +5 -3
  2. package/build-task/esm2022/advanced/carousel/carousel-template/carousel-template.build.mjs +4 -2
  3. package/build-task/esm2022/data/form/form-field/form-field.build.mjs +3 -3
  4. package/build-task/fesm2022/index.mjs +5 -3
  5. package/build-task/fesm2022/index.mjs.map +1 -1
  6. package/components/basic/default/bundles/index.umd.js +68 -71
  7. package/components/basic/default/esm2022/anchor/anchor.component.mjs +18 -18
  8. package/components/basic/default/esm2022/icon/icon.component.mjs +12 -13
  9. package/components/basic/default/esm2022/iframe/iframe.component.mjs +9 -10
  10. package/components/basic/default/esm2022/picture/picture.directive.mjs +2 -5
  11. package/components/basic/default/esm2022/spinner/spinner.component.mjs +21 -21
  12. package/components/basic/default/esm2022/video/video.component.mjs +14 -15
  13. package/components/basic/default/fesm2022/index.mjs +68 -71
  14. package/components/basic/default/fesm2022/index.mjs.map +1 -1
  15. package/components/basic/progress/bundles/index.umd.js +16 -17
  16. package/components/basic/progress/esm2022/progress-bar/progress-bar.component.mjs +7 -8
  17. package/components/basic/progress/fesm2022/index.mjs +8 -9
  18. package/components/basic/progress/fesm2022/index.mjs.map +1 -1
  19. package/components/basic/rich-text-editor/bundles/index.umd.js +11 -12
  20. package/components/basic/rich-text-editor/esm2022/rich-text-editor.component.mjs +8 -9
  21. package/components/basic/rich-text-editor/fesm2022/index.mjs +7 -8
  22. package/components/basic/rich-text-editor/fesm2022/index.mjs.map +1 -1
  23. package/components/basic/search/bundles/index.umd.js +63 -67
  24. package/components/basic/search/esm2022/search.component.mjs +63 -67
  25. package/components/basic/search/esm2022/search.module.mjs +2 -2
  26. package/components/basic/search/fesm2022/index.mjs +63 -67
  27. package/components/basic/search/fesm2022/index.mjs.map +1 -1
  28. package/components/chart/bundles/index.umd.js +17 -17
  29. package/components/chart/esm2022/chart.component.mjs +18 -18
  30. package/components/chart/fesm2022/index.mjs +17 -17
  31. package/components/chart/fesm2022/index.mjs.map +1 -1
  32. package/components/containers/panel/bundles/index.umd.js +39 -39
  33. package/components/containers/panel/esm2022/panel.component.mjs +40 -40
  34. package/components/containers/panel/fesm2022/index.mjs +39 -39
  35. package/components/containers/panel/fesm2022/index.mjs.map +1 -1
  36. package/components/containers/tabs/bundles/index.umd.js +29 -29
  37. package/components/containers/tabs/esm2022/tabs.component.mjs +30 -30
  38. package/components/containers/tabs/fesm2022/index.mjs +29 -29
  39. package/components/containers/tabs/fesm2022/index.mjs.map +1 -1
  40. package/components/containers/wizard/bundles/index.umd.js +49 -49
  41. package/components/containers/wizard/esm2022/wizard.component.mjs +50 -50
  42. package/components/containers/wizard/fesm2022/index.mjs +49 -49
  43. package/components/containers/wizard/fesm2022/index.mjs.map +1 -1
  44. package/components/data/card/bundles/index.umd.js +29 -29
  45. package/components/data/card/esm2022/card.component.mjs +30 -30
  46. package/components/data/card/fesm2022/index.mjs +29 -29
  47. package/components/data/card/fesm2022/index.mjs.map +1 -1
  48. package/components/data/form/bundles/index.umd.js +91 -96
  49. package/components/data/form/esm2022/form.component.mjs +92 -97
  50. package/components/data/form/fesm2022/index.mjs +91 -96
  51. package/components/data/form/fesm2022/index.mjs.map +1 -1
  52. package/components/data/list/bundles/index.umd.js +171 -173
  53. package/components/data/list/esm2022/list.component.mjs +171 -173
  54. package/components/data/list/esm2022/list.module.mjs +2 -2
  55. package/components/data/list/fesm2022/index.mjs +171 -173
  56. package/components/data/list/fesm2022/index.mjs.map +1 -1
  57. package/components/data/pagination/bundles/index.umd.js +32 -32
  58. package/components/data/pagination/esm2022/pagination.component.mjs +33 -33
  59. package/components/data/pagination/fesm2022/index.mjs +32 -32
  60. package/components/data/pagination/fesm2022/index.mjs.map +1 -1
  61. package/components/data/table/bundles/index.umd.js +69 -39
  62. package/components/data/table/esm2022/table-column/table-column.directive.mjs +2 -1
  63. package/components/data/table/esm2022/table-column/table-column.props.mjs +2 -1
  64. package/components/data/table/esm2022/table-filter.directive.mjs +29 -2
  65. package/components/data/table/esm2022/table.component.mjs +40 -39
  66. package/components/data/table/esm2022/table.props.mjs +2 -1
  67. package/components/data/table/fesm2022/index.mjs +72 -41
  68. package/components/data/table/fesm2022/index.mjs.map +1 -1
  69. package/components/data/table/table-column/table-column.directive.d.ts +1 -0
  70. package/components/data/table/table-filter.directive.d.ts +1 -0
  71. package/components/dialogs/default/bundles/index.umd.js +66 -95
  72. package/components/dialogs/default/esm2022/dialog-header/dialog-header.component.mjs +67 -96
  73. package/components/dialogs/default/fesm2022/index.mjs +66 -95
  74. package/components/dialogs/default/fesm2022/index.mjs.map +1 -1
  75. package/components/dialogs/design-dialog/bundles/index.umd.js +7 -7
  76. package/components/dialogs/design-dialog/esm2022/dialog.component.mjs +8 -8
  77. package/components/dialogs/design-dialog/fesm2022/index.mjs +7 -7
  78. package/components/dialogs/design-dialog/fesm2022/index.mjs.map +1 -1
  79. package/components/dialogs/iframe-dialog/bundles/index.umd.js +24 -25
  80. package/components/dialogs/iframe-dialog/esm2022/iframe-dialog.component.mjs +15 -16
  81. package/components/dialogs/iframe-dialog/fesm2022/index.mjs +14 -15
  82. package/components/dialogs/iframe-dialog/fesm2022/index.mjs.map +1 -1
  83. package/components/dialogs/partial-dialog/bundles/index.umd.js +8 -8
  84. package/components/dialogs/partial-dialog/esm2022/partial-dialog.component.mjs +9 -9
  85. package/components/dialogs/partial-dialog/fesm2022/index.mjs +8 -8
  86. package/components/dialogs/partial-dialog/fesm2022/index.mjs.map +1 -1
  87. package/components/input/chips/bundles/index.umd.js +21 -21
  88. package/components/input/chips/esm2022/chips.component.mjs +22 -22
  89. package/components/input/chips/fesm2022/index.mjs +21 -21
  90. package/components/input/chips/fesm2022/index.mjs.map +1 -1
  91. package/components/input/default/bundles/index.umd.js +201 -209
  92. package/components/input/default/esm2022/button/button.component.mjs +18 -18
  93. package/components/input/default/esm2022/checkboxset/checkboxset.component.mjs +68 -69
  94. package/components/input/default/esm2022/radioset/radioset.component.mjs +68 -69
  95. package/components/input/default/esm2022/select/select.component.mjs +21 -27
  96. package/components/input/default/esm2022/switch/switch.component.mjs +24 -24
  97. package/components/input/default/esm2022/textarea/textarea.component.mjs +8 -8
  98. package/components/input/default/fesm2022/index.mjs +201 -209
  99. package/components/input/default/fesm2022/index.mjs.map +1 -1
  100. package/components/input/epoch/bundles/index.umd.js +171 -164
  101. package/components/input/epoch/esm2022/date/date.component.mjs +14 -15
  102. package/components/input/epoch/esm2022/date-time/date-time-picker.component.mjs +64 -59
  103. package/components/input/epoch/esm2022/date-time/date-time.component.mjs +18 -19
  104. package/components/input/epoch/esm2022/picker/picker.component.mjs +26 -25
  105. package/components/input/epoch/esm2022/time/time.component.mjs +17 -18
  106. package/components/input/epoch/fesm2022/index.mjs +124 -117
  107. package/components/input/epoch/fesm2022/index.mjs.map +1 -1
  108. package/components/input/file-upload/bundles/index.umd.js +111 -114
  109. package/components/input/file-upload/esm2022/file-upload.component.mjs +112 -115
  110. package/components/input/file-upload/fesm2022/index.mjs +111 -114
  111. package/components/input/file-upload/fesm2022/index.mjs.map +1 -1
  112. package/components/input/rating/bundles/index.umd.js +14 -14
  113. package/components/input/rating/esm2022/rating.component.mjs +15 -15
  114. package/components/input/rating/fesm2022/index.mjs +14 -14
  115. package/components/input/rating/fesm2022/index.mjs.map +1 -1
  116. package/components/input/slider/bundles/index.umd.js +39 -40
  117. package/components/input/slider/esm2022/slider.component.mjs +10 -11
  118. package/components/input/slider/fesm2022/index.mjs +9 -10
  119. package/components/input/slider/fesm2022/index.mjs.map +1 -1
  120. package/components/navigation/breadcrumb/bundles/index.umd.js +16 -15
  121. package/components/navigation/breadcrumb/esm2022/breadcrumb.component.mjs +17 -16
  122. package/components/navigation/breadcrumb/fesm2022/index.mjs +16 -15
  123. package/components/navigation/breadcrumb/fesm2022/index.mjs.map +1 -1
  124. package/components/navigation/menu/bundles/index.umd.js +82 -74
  125. package/components/navigation/menu/esm2022/menu-adapator.component.mjs +14 -4
  126. package/components/navigation/menu/esm2022/menu-dropdown/menu-dropdown.component.mjs +7 -7
  127. package/components/navigation/menu/esm2022/menu-dropdown-item/menu-dropdown-item.component.mjs +15 -15
  128. package/components/navigation/menu/esm2022/menu.component.mjs +22 -26
  129. package/components/navigation/menu/esm2022/menu.module.mjs +4 -4
  130. package/components/navigation/menu/esm2022/nav/nav.component.mjs +26 -24
  131. package/components/navigation/menu/fesm2022/index.mjs +82 -74
  132. package/components/navigation/menu/fesm2022/index.mjs.map +1 -1
  133. package/components/navigation/menu/menu-adapator.component.d.ts +1 -0
  134. package/components/navigation/navbar/bundles/index.umd.js +12 -12
  135. package/components/navigation/navbar/esm2022/navbar.component.mjs +13 -13
  136. package/components/navigation/navbar/fesm2022/index.mjs +12 -12
  137. package/components/navigation/navbar/fesm2022/index.mjs.map +1 -1
  138. package/mobile/components/basic/default/bundles/index.umd.js +102 -111
  139. package/mobile/components/basic/default/esm2022/file-browser/file-browser.component.mjs +39 -40
  140. package/mobile/components/basic/default/esm2022/network-info-toaster/network-info-toaster.component.mjs +35 -44
  141. package/mobile/components/basic/default/esm2022/process-manager/process-manager.component.mjs +27 -28
  142. package/mobile/components/basic/default/fesm2022/index.mjs +98 -107
  143. package/mobile/components/basic/default/fesm2022/index.mjs.map +1 -1
  144. package/mobile/components/containers/segmented-control/bundles/index.umd.js +16 -16
  145. package/mobile/components/containers/segmented-control/esm2022/segment-content/segment-content.component.mjs +8 -9
  146. package/mobile/components/containers/segmented-control/esm2022/segmented-control.component.mjs +10 -10
  147. package/mobile/components/containers/segmented-control/fesm2022/index.mjs +16 -16
  148. package/mobile/components/containers/segmented-control/fesm2022/index.mjs.map +1 -1
  149. package/mobile/components/data/media-list/bundles/index.umd.js +28 -28
  150. package/mobile/components/data/media-list/esm2022/media-list.component.mjs +29 -29
  151. package/mobile/components/data/media-list/fesm2022/index.mjs +28 -28
  152. package/mobile/components/data/media-list/fesm2022/index.mjs.map +1 -1
  153. package/mobile/components/page/mobile-navbar/bundles/index.umd.js +29 -29
  154. package/mobile/components/page/mobile-navbar/esm2022/mobile-navbar.component.mjs +30 -30
  155. package/mobile/components/page/mobile-navbar/fesm2022/index.mjs +29 -29
  156. package/mobile/components/page/mobile-navbar/fesm2022/index.mjs.map +1 -1
  157. package/mobile/components/page/tab-bar/bundles/index.umd.js +28 -28
  158. package/mobile/components/page/tab-bar/esm2022/tabbar.component.mjs +29 -29
  159. package/mobile/components/page/tab-bar/fesm2022/index.mjs +28 -28
  160. package/mobile/components/page/tab-bar/fesm2022/index.mjs.map +1 -1
  161. package/npm-shrinkwrap.json +2 -2
  162. package/package-lock.json +2 -2
  163. package/package.json +1 -1
  164. package/runtime/base/bundles/index.umd.js +219 -215
  165. package/runtime/base/esm2022/components/app-component/app.component.mjs +38 -41
  166. package/runtime/base/esm2022/components/app-spinner.component.mjs +25 -21
  167. package/runtime/base/esm2022/components/custom-toaster.component.mjs +18 -16
  168. package/runtime/base/fesm2022/index.mjs +99 -95
  169. package/runtime/base/fesm2022/index.mjs.map +1 -1
  170. package/scripts/datatable/datatable.js +1 -0
@@ -25,139 +25,136 @@ const _c6 = a0 => ({ btn: a0 });
25
25
  function FormComponent_ng_template_0_Template(rf, ctx) { if (rf & 1) {
26
26
  i0.ɵɵprojection(0);
27
27
  } }
28
- function FormComponent_ng_container_2_Template(rf, ctx) { if (rf & 1) {
28
+ function FormComponent_Conditional_2_ng_container_0_Template(rf, ctx) { if (rf & 1) {
29
29
  i0.ɵɵelementContainer(0);
30
30
  } }
31
- function FormComponent_ng_template_3_div_0_i_3_Template(rf, ctx) { if (rf & 1) {
32
- i0.ɵɵelement(0, "i", 22);
31
+ function FormComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
32
+ i0.ɵɵtemplate(0, FormComponent_Conditional_2_ng_container_0_Template, 1, 0, "ng-container", 5);
33
33
  } if (rf & 2) {
34
- const ctx_r0 = i0.ɵɵnextContext(3);
35
- i0.ɵɵproperty("ngClass", ctx_r0.iconclass);
34
+ i0.ɵɵnextContext();
35
+ const content_r1 = i0.ɵɵreference(1);
36
+ i0.ɵɵproperty("ngTemplateOutlet", content_r1);
37
+ } }
38
+ function FormComponent_Conditional_3_Conditional_0_Conditional_3_Template(rf, ctx) { if (rf & 1) {
39
+ i0.ɵɵelement(0, "i", 14);
40
+ } if (rf & 2) {
41
+ const ctx_r1 = i0.ɵɵnextContext(3);
42
+ i0.ɵɵproperty("ngClass", ctx_r1.iconclass);
36
43
  } }
37
- function FormComponent_ng_template_3_div_0_ng_container_8_Template(rf, ctx) { if (rf & 1) {
38
- i0.ɵɵelementContainer(0, 23);
44
+ function FormComponent_Conditional_3_Conditional_0_For_9_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵelementContainer(0, 11);
39
46
  } if (rf & 2) {
40
- const btn_r2 = ctx.$implicit;
41
- const index_r3 = ctx.index;
42
- const ctx_r0 = i0.ɵɵnextContext(3);
43
- const buttonRef_r4 = i0.ɵɵreference(8);
44
- const anchorRef_r5 = i0.ɵɵreference(10);
45
- i0.ɵɵproperty("ngTemplateOutlet", btn_r2.widgetType === "button" ? buttonRef_r4 : anchorRef_r5)("ngTemplateOutletContext", i0.ɵɵpureFunction1(3, _c6, btn_r2))("ngTemplateOutletInjector", ctx_r0.createCustomInjector("action_header_" + index_r3, i0.ɵɵpureFunction1(5, _c6, btn_r2)));
47
+ const btn_r3 = ctx.$implicit;
48
+ const ɵ$index_28_r4 = ctx.$index;
49
+ const ctx_r1 = i0.ɵɵnextContext(3);
50
+ const buttonRef_r5 = i0.ɵɵreference(5);
51
+ const anchorRef_r6 = i0.ɵɵreference(7);
52
+ i0.ɵɵproperty("ngTemplateOutlet", btn_r3.widgetType === "button" ? buttonRef_r5 : anchorRef_r6)("ngTemplateOutletContext", i0.ɵɵpureFunction1(3, _c6, btn_r3))("ngTemplateOutletInjector", ctx_r1.createCustomInjector("action_header_" + ɵ$index_28_r4, i0.ɵɵpureFunction1(5, _c6, btn_r3)));
46
53
  } }
47
- function FormComponent_ng_template_3_div_0_button_10_Template(rf, ctx) { if (rf & 1) {
48
- const _r6 = i0.ɵɵgetCurrentView();
49
- i0.ɵɵelementStart(0, "button", 24);
50
- i0.ɵɵlistener("click", function FormComponent_ng_template_3_div_0_button_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.expandCollapsePanel()); });
54
+ function FormComponent_Conditional_3_Conditional_0_Conditional_11_Template(rf, ctx) { if (rf & 1) {
55
+ const _r7 = i0.ɵɵgetCurrentView();
56
+ i0.ɵɵelementStart(0, "button", 19);
57
+ i0.ɵɵlistener("click", function FormComponent_Conditional_3_Conditional_0_Conditional_11_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.expandCollapsePanel()); });
51
58
  i0.ɵɵelementEnd();
52
59
  } if (rf & 2) {
53
- const ctx_r0 = i0.ɵɵnextContext(3);
54
- i0.ɵɵproperty("title", ctx_r0.expanded ? (ctx_r0.appLocale == null ? null : ctx_r0.appLocale.LABEL_COLLAPSE) || "Collapse" : (ctx_r0.appLocale == null ? null : ctx_r0.appLocale.LABEL_EXPAND) || "Expand")("ngClass", ctx_r0.expanded ? "wi-minus" : "wi-plus");
60
+ const ctx_r1 = i0.ɵɵnextContext(3);
61
+ i0.ɵɵproperty("title", ctx_r1.expanded ? (ctx_r1.appLocale == null ? null : ctx_r1.appLocale.LABEL_COLLAPSE) || "Collapse" : (ctx_r1.appLocale == null ? null : ctx_r1.appLocale.LABEL_EXPAND) || "Expand")("ngClass", ctx_r1.expanded ? "wi-minus" : "wi-plus");
55
62
  } }
56
- function FormComponent_ng_template_3_div_0_Template(rf, ctx) { if (rf & 1) {
57
- i0.ɵɵelementStart(0, "div", 14)(1, "h3", 15)(2, "div", 16);
58
- i0.ɵɵtemplate(3, FormComponent_ng_template_3_div_0_i_3_Template, 1, 1, "i", 17);
63
+ function FormComponent_Conditional_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
64
+ i0.ɵɵelementStart(0, "div", 6)(1, "h3", 12)(2, "div", 13);
65
+ i0.ɵɵtemplate(3, FormComponent_Conditional_3_Conditional_0_Conditional_3_Template, 1, 1, "i", 14);
59
66
  i0.ɵɵelementEnd();
60
- i0.ɵɵelementStart(4, "div", 16);
61
- i0.ɵɵelement(5, "div", 18)(6, "div", 19);
67
+ i0.ɵɵelementStart(4, "div", 13);
68
+ i0.ɵɵelement(5, "div", 15)(6, "div", 16);
62
69
  i0.ɵɵelementEnd();
63
- i0.ɵɵelementStart(7, "div", 20);
64
- i0.ɵɵtemplate(8, FormComponent_ng_template_3_div_0_ng_container_8_Template, 1, 7, "ng-container", 13);
65
- i0.ɵɵpipe(9, "filter");
66
- i0.ɵɵtemplate(10, FormComponent_ng_template_3_div_0_button_10_Template, 1, 2, "button", 21);
70
+ i0.ɵɵelementStart(7, "div", 17);
71
+ i0.ɵɵrepeaterCreate(8, FormComponent_Conditional_3_Conditional_0_For_9_Template, 1, 7, "ng-container", 11, i0.ɵɵrepeaterTrackByIdentity);
72
+ i0.ɵɵpipe(10, "filter");
73
+ i0.ɵɵtemplate(11, FormComponent_Conditional_3_Conditional_0_Conditional_11_Template, 1, 2, "button", 18);
67
74
  i0.ɵɵelementEnd()()();
68
75
  } if (rf & 2) {
69
- const ctx_r0 = i0.ɵɵnextContext(2);
76
+ const ctx_r1 = i0.ɵɵnextContext(2);
70
77
  i0.ɵɵadvance(3);
71
- i0.ɵɵproperty("ngIf", ctx_r0.iconclass);
78
+ i0.ɵɵconditional(ctx_r1.iconclass ? 3 : -1);
72
79
  i0.ɵɵadvance(2);
73
- i0.ɵɵproperty("innerHTML", ctx_r0.title, i0.ɵɵsanitizeHtml);
80
+ i0.ɵɵproperty("innerHTML", ctx_r1.title, i0.ɵɵsanitizeHtml);
74
81
  i0.ɵɵadvance();
75
- i0.ɵɵproperty("innerHTML", ctx_r0.subheading, i0.ɵɵsanitizeHtml);
82
+ i0.ɵɵproperty("innerHTML", ctx_r1.subheading, i0.ɵɵsanitizeHtml);
76
83
  i0.ɵɵadvance(2);
77
- i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind3(9, 5, ctx_r0.buttonArray, "position", "header"));
78
- i0.ɵɵadvance(2);
79
- i0.ɵɵproperty("ngIf", ctx_r0.collapsible);
84
+ i0.ɵɵrepeater(i0.ɵɵpipeBind3(10, 4, ctx_r1.buttonArray, "position", "header"));
85
+ i0.ɵɵadvance(3);
86
+ i0.ɵɵconditional(ctx_r1.collapsible ? 11 : -1);
80
87
  } }
81
- function FormComponent_ng_template_3_p_2_Template(rf, ctx) { if (rf & 1) {
82
- i0.ɵɵelement(0, "p", 25);
88
+ function FormComponent_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
89
+ i0.ɵɵelement(0, "p", 8);
83
90
  } if (rf & 2) {
84
- const ctx_r0 = i0.ɵɵnextContext(2);
85
- i0.ɵɵattribute("aria-hidden", !ctx_r0.statusMessage.caption)("aria-label", ctx_r0.statusMessage.caption);
91
+ const ctx_r1 = i0.ɵɵnextContext(2);
92
+ i0.ɵɵattribute("aria-hidden", !ctx_r1.statusMessage.caption)("aria-label", ctx_r1.statusMessage.caption);
86
93
  } }
87
- function FormComponent_ng_template_3_ng_container_4_Template(rf, ctx) { if (rf & 1) {
94
+ function FormComponent_Conditional_3_ng_container_4_Template(rf, ctx) { if (rf & 1) {
88
95
  i0.ɵɵelementContainer(0);
89
96
  } }
90
- function FormComponent_ng_template_3_ng_container_6_Template(rf, ctx) { if (rf & 1) {
91
- i0.ɵɵelementContainer(0, 23);
97
+ function FormComponent_Conditional_3_For_7_Template(rf, ctx) { if (rf & 1) {
98
+ i0.ɵɵelementContainer(0, 11);
92
99
  } if (rf & 2) {
93
- const btn_r7 = ctx.$implicit;
94
- const index_r8 = ctx.index;
95
- const ctx_r0 = i0.ɵɵnextContext(2);
96
- const buttonRef_r4 = i0.ɵɵreference(8);
97
- const anchorRef_r5 = i0.ɵɵreference(10);
98
- i0.ɵɵproperty("ngTemplateOutlet", btn_r7.widgetType === "button" ? buttonRef_r4 : anchorRef_r5)("ngTemplateOutletContext", i0.ɵɵpureFunction1(3, _c6, btn_r7))("ngTemplateOutletInjector", ctx_r0.createCustomInjector("action_footer_" + index_r8, i0.ɵɵpureFunction1(5, _c6, btn_r7)));
100
+ const btn_r8 = ctx.$implicit;
101
+ const ɵ$index_48_r9 = ctx.$index;
102
+ const ctx_r1 = i0.ɵɵnextContext(2);
103
+ const buttonRef_r5 = i0.ɵɵreference(5);
104
+ const anchorRef_r6 = i0.ɵɵreference(7);
105
+ i0.ɵɵproperty("ngTemplateOutlet", btn_r8.widgetType === "button" ? buttonRef_r5 : anchorRef_r6)("ngTemplateOutletContext", i0.ɵɵpureFunction1(3, _c6, btn_r8))("ngTemplateOutletInjector", ctx_r1.createCustomInjector("action_footer_" + ɵ$index_48_r9, i0.ɵɵpureFunction1(5, _c6, btn_r8)));
99
106
  } }
100
- function FormComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
101
- i0.ɵɵtemplate(0, FormComponent_ng_template_3_div_0_Template, 11, 9, "div", 7);
102
- i0.ɵɵelementStart(1, "div", 8);
103
- i0.ɵɵtemplate(2, FormComponent_ng_template_3_p_2_Template, 1, 2, "p", 9);
104
- i0.ɵɵelementStart(3, "div", 10);
105
- i0.ɵɵtemplate(4, FormComponent_ng_template_3_ng_container_4_Template, 1, 0, "ng-container", 11);
107
+ function FormComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
108
+ i0.ɵɵtemplate(0, FormComponent_Conditional_3_Conditional_0_Template, 12, 8, "div", 6);
109
+ i0.ɵɵelementStart(1, "div", 7);
110
+ i0.ɵɵtemplate(2, FormComponent_Conditional_3_Conditional_2_Template, 1, 2, "p", 8);
111
+ i0.ɵɵelementStart(3, "div", 9);
112
+ i0.ɵɵtemplate(4, FormComponent_Conditional_3_ng_container_4_Template, 1, 0, "ng-container", 5);
106
113
  i0.ɵɵelementEnd();
107
- i0.ɵɵelementStart(5, "div", 12);
108
- i0.ɵɵtemplate(6, FormComponent_ng_template_3_ng_container_6_Template, 1, 7, "ng-container", 13);
109
- i0.ɵɵpipe(7, "filter");
114
+ i0.ɵɵelementStart(5, "div", 10);
115
+ i0.ɵɵrepeaterCreate(6, FormComponent_Conditional_3_For_7_Template, 1, 7, "ng-container", 11, i0.ɵɵrepeaterTrackByIdentity);
116
+ i0.ɵɵpipe(8, "filter");
110
117
  i0.ɵɵelementEnd()();
111
118
  } if (rf & 2) {
112
- const ctx_r0 = i0.ɵɵnextContext();
113
- const content_r9 = i0.ɵɵreference(1);
114
- i0.ɵɵproperty("ngIf", !ctx_r0.isLayoutDialog && (ctx_r0.title || ctx_r0.subheading || ctx_r0.iconclass || ctx_r0.showButtons("header")));
119
+ const ctx_r1 = i0.ɵɵnextContext();
120
+ const content_r1 = i0.ɵɵreference(1);
121
+ i0.ɵɵconditional(!ctx_r1.isLayoutDialog && (ctx_r1.title || ctx_r1.subheading || ctx_r1.iconclass || ctx_r1.showButtons("header")) ? 0 : -1);
115
122
  i0.ɵɵadvance();
116
- i0.ɵɵclassProp("hidden", !ctx_r0.expanded);
117
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(15, _c3, ctx_r0.isLayoutDialog, !ctx_r0.isLayoutDialog));
123
+ i0.ɵɵclassProp("hidden", !ctx_r1.expanded);
124
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(14, _c3, ctx_r1.isLayoutDialog, !ctx_r1.isLayoutDialog));
118
125
  i0.ɵɵadvance();
119
- i0.ɵɵproperty("ngIf", !!ctx_r0.statusMessage.caption);
126
+ i0.ɵɵconditional(!!ctx_r1.statusMessage.caption ? 2 : -1);
120
127
  i0.ɵɵadvance();
121
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(18, _c4, !ctx_r0.isLayoutDialog, ctx_r0.isLayoutDialog));
128
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(17, _c4, !ctx_r1.isLayoutDialog, ctx_r1.isLayoutDialog));
122
129
  i0.ɵɵadvance();
123
- i0.ɵɵproperty("ngTemplateOutlet", content_r9);
130
+ i0.ɵɵproperty("ngTemplateOutlet", content_r1);
124
131
  i0.ɵɵadvance();
125
- i0.ɵɵclassProp("hidden", !ctx_r0.expanded || !ctx_r0.showButtons("footer"));
126
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(21, _c5, ctx_r0.isLayoutDialog));
132
+ i0.ɵɵclassProp("hidden", !ctx_r1.expanded || !ctx_r1.showButtons("footer"));
133
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(20, _c5, ctx_r1.isLayoutDialog));
127
134
  i0.ɵɵadvance();
128
- i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind3(7, 11, ctx_r0.buttonArray, "position", "footer"));
129
- } }
130
- function FormComponent_ng_template_5_ng_container_0_Template(rf, ctx) { if (rf & 1) {
131
- i0.ɵɵelementContainer(0);
132
- } }
133
- function FormComponent_ng_template_5_Template(rf, ctx) { if (rf & 1) {
134
- i0.ɵɵtemplate(0, FormComponent_ng_template_5_ng_container_0_Template, 1, 0, "ng-container", 11);
135
- } if (rf & 2) {
136
- i0.ɵɵnextContext();
137
- const content_r9 = i0.ɵɵreference(1);
138
- i0.ɵɵproperty("ngTemplateOutlet", content_r9);
135
+ i0.ɵɵrepeater(i0.ɵɵpipeBind3(8, 10, ctx_r1.buttonArray, "position", "footer"));
139
136
  } }
140
- function FormComponent_ng_template_7_Template(rf, ctx) { if (rf & 1) {
137
+ function FormComponent_ng_template_4_Template(rf, ctx) { if (rf & 1) {
141
138
  const _r10 = i0.ɵɵgetCurrentView();
142
- i0.ɵɵelementStart(0, "button", 26);
143
- i0.ɵɵlistener("click", function FormComponent_ng_template_7_Template_button_click_0_listener($event) { const btn_r11 = i0.ɵɵrestoreView(_r10).btn; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.invokeActionEvent($event, btn_r11.action)); });
139
+ i0.ɵɵelementStart(0, "button", 20);
140
+ i0.ɵɵlistener("click", function FormComponent_ng_template_4_Template_button_click_0_listener($event) { const btn_r11 = i0.ɵɵrestoreView(_r10).btn; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.invokeActionEvent($event, btn_r11.action)); });
144
141
  i0.ɵɵelementEnd();
145
142
  } if (rf & 2) {
146
143
  const btn_r11 = ctx.btn;
147
- const ctx_r0 = i0.ɵɵnextContext();
148
- i0.ɵɵclassProp("hidden", btn_r11.updateMode ? !ctx_r0.isUpdateMode : ctx_r0.isUpdateMode);
144
+ const ctx_r1 = i0.ɵɵnextContext();
145
+ i0.ɵɵclassProp("hidden", btn_r11.updateMode ? !ctx_r1.isUpdateMode : ctx_r1.isUpdateMode);
149
146
  i0.ɵɵpropertyInterpolate("name", btn_r11.key);
150
147
  i0.ɵɵattribute("aria-label", btn_r11.displayName);
151
148
  } }
152
- function FormComponent_ng_template_9_Template(rf, ctx) { if (rf & 1) {
149
+ function FormComponent_ng_template_6_Template(rf, ctx) { if (rf & 1) {
153
150
  const _r12 = i0.ɵɵgetCurrentView();
154
- i0.ɵɵelementStart(0, "a", 27);
155
- i0.ɵɵlistener("click", function FormComponent_ng_template_9_Template_a_click_0_listener($event) { const btn_r13 = i0.ɵɵrestoreView(_r12).btn; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.invokeActionEvent($event, btn_r13.action)); });
151
+ i0.ɵɵelementStart(0, "a", 21);
152
+ i0.ɵɵlistener("click", function FormComponent_ng_template_6_Template_a_click_0_listener($event) { const btn_r13 = i0.ɵɵrestoreView(_r12).btn; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.invokeActionEvent($event, btn_r13.action)); });
156
153
  i0.ɵɵelementEnd();
157
154
  } if (rf & 2) {
158
155
  const btn_r13 = ctx.btn;
159
- const ctx_r0 = i0.ɵɵnextContext();
160
- i0.ɵɵclassProp("hidden", btn_r13.updateMode ? !ctx_r0.isUpdateMode : ctx_r0.isUpdateMode);
156
+ const ctx_r1 = i0.ɵɵnextContext();
157
+ i0.ɵɵclassProp("hidden", btn_r13.updateMode ? !ctx_r1.isUpdateMode : ctx_r1.isUpdateMode);
161
158
  i0.ɵɵpropertyInterpolate("name", btn_r13.key);
162
159
  } }
163
160
  const WIDGET_CONFIG = { widgetType: 'wm-form', hostClass: 'panel app-panel app-form' };
@@ -1266,22 +1263,20 @@ export class FormComponent extends StylableComponent {
1266
1263
  i0.ɵɵhostProperty("action", ctx.action, i0.ɵɵsanitizeUrl);
1267
1264
  } }, features: [i0.ɵɵProvidersFeature([
1268
1265
  provideAsWidgetRef(FormComponent)
1269
- ]), i0.ɵɵInheritDefinitionFeature], attrs: _c1, ngContentSelectors: _c2, decls: 13, vars: 3, consts: [["content", ""], ["defaultTemplate", ""], ["pageLayoutTemplate", ""], ["buttonRef", ""], ["anchorRef", ""], ["dynamicForm", ""], [4, "ngIf", "ngIfThen", "ngIfElse"], ["class", "panel-heading", 4, "ngIf"], [1, "panel-body", 3, "ngClass"], ["wmMessage", "", "caption.bind", "statusMessage.caption", "type.bind", "statusMessage.type", 4, "ngIf"], [3, "ngClass"], [4, "ngTemplateOutlet"], [1, "basic-btn-grp", "form-action", "panel-footer", "clearfix", 3, "ngClass"], [3, "ngTemplateOutlet", "ngTemplateOutletContext", "ngTemplateOutletInjector", 4, "ngFor", "ngForOf"], [1, "panel-heading"], [1, "panel-title"], [1, "pull-left"], ["class", "app-icon panel-icon", "aria-hidden", "true", 3, "ngClass", 4, "ngIf"], [1, "heading", 3, "innerHTML"], [1, "description", 3, "innerHTML"], [1, "form-action", "panel-actions", "basic-btn-grp"], ["type", "button", "class", "app-icon wi panel-action", 3, "title", "ngClass", "click", 4, "ngIf"], ["aria-hidden", "true", 1, "app-icon", "panel-icon", 3, "ngClass"], [3, "ngTemplateOutlet", "ngTemplateOutletContext", "ngTemplateOutletInjector"], ["type", "button", 1, "app-icon", "wi", "panel-action", 3, "click", "title", "ngClass"], ["wmMessage", "", "caption.bind", "statusMessage.caption", "type.bind", "statusMessage.type"], ["wmButton", "", "caption.bind", "btn.displayName", "class.bind", "btn.class", "iconclass.bind", "btn.iconclass", "show.bind", "btn.show", "type.bind", "btn.type", "hint.bind", "btn.title", "shortcutkey.bind", "btn.shortcutkey", "disabled.bind", "ngform.status === 'PENDING' || btn.disabled", "tabindex.bind", "btn.tabindex", 3, "click", "name"], ["wmAnchor", "", "caption.bind", "btn.displayName", "class.bind", "btn.class", "iconclass.bind", "btn.iconclass", "show.bind", "btn.show", "hint.bind", "btn.title", "shortcutkey.bind", "btn.shortcutkey", "hyperlink.bind", "btn.hyperlink", "target.bind", "btn.target", "tabindex.bind", "btn.tabindex", 3, "click", "name"]], template: function FormComponent_Template(rf, ctx) { if (rf & 1) {
1266
+ ]), i0.ɵɵInheritDefinitionFeature], attrs: _c1, ngContentSelectors: _c2, decls: 10, vars: 1, consts: [["content", ""], ["buttonRef", ""], ["anchorRef", ""], ["dynamicForm", ""], [1, "panel-body", 3, "ngClass", "hidden"], [4, "ngTemplateOutlet"], [1, "panel-heading"], [1, "panel-body", 3, "ngClass"], ["wmMessage", "", "caption.bind", "statusMessage.caption", "type.bind", "statusMessage.type"], [3, "ngClass"], [1, "basic-btn-grp", "form-action", "panel-footer", "clearfix", 3, "ngClass"], [3, "ngTemplateOutlet", "ngTemplateOutletContext", "ngTemplateOutletInjector"], [1, "panel-title"], [1, "pull-left"], ["aria-hidden", "true", 1, "app-icon", "panel-icon", 3, "ngClass"], [1, "heading", 3, "innerHTML"], [1, "description", 3, "innerHTML"], [1, "form-action", "panel-actions", "basic-btn-grp"], ["type", "button", 1, "app-icon", "wi", "panel-action", 3, "title", "ngClass"], ["type", "button", 1, "app-icon", "wi", "panel-action", 3, "click", "title", "ngClass"], ["wmButton", "", "caption.bind", "btn.displayName", "class.bind", "btn.class", "iconclass.bind", "btn.iconclass", "show.bind", "btn.show", "type.bind", "btn.type", "hint.bind", "btn.title", "shortcutkey.bind", "btn.shortcutkey", "disabled.bind", "ngform.status === 'PENDING' || btn.disabled", "tabindex.bind", "btn.tabindex", 3, "click", "name"], ["wmAnchor", "", "caption.bind", "btn.displayName", "class.bind", "btn.class", "iconclass.bind", "btn.iconclass", "show.bind", "btn.show", "hint.bind", "btn.title", "shortcutkey.bind", "btn.shortcutkey", "hyperlink.bind", "btn.hyperlink", "target.bind", "btn.target", "tabindex.bind", "btn.tabindex", 3, "click", "name"]], template: function FormComponent_Template(rf, ctx) { if (rf & 1) {
1270
1267
  i0.ɵɵprojectionDef();
1271
- i0.ɵɵtemplate(0, FormComponent_ng_template_0_Template, 1, 0, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor)(2, FormComponent_ng_container_2_Template, 1, 0, "ng-container", 6)(3, FormComponent_ng_template_3_Template, 8, 23, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor)(5, FormComponent_ng_template_5_Template, 1, 1, "ng-template", null, 2, i0.ɵɵtemplateRefExtractor)(7, FormComponent_ng_template_7_Template, 1, 4, "ng-template", null, 3, i0.ɵɵtemplateRefExtractor)(9, FormComponent_ng_template_9_Template, 1, 3, "ng-template", null, 4, i0.ɵɵtemplateRefExtractor);
1272
- i0.ɵɵelementContainer(11, null, 5);
1268
+ i0.ɵɵtemplate(0, FormComponent_ng_template_0_Template, 1, 0, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor)(2, FormComponent_Conditional_2_Template, 1, 1, "ng-container")(3, FormComponent_Conditional_3_Template, 9, 22, "div", 4)(4, FormComponent_ng_template_4_Template, 1, 4, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor)(6, FormComponent_ng_template_6_Template, 1, 3, "ng-template", null, 2, i0.ɵɵtemplateRefExtractor);
1269
+ i0.ɵɵelementContainer(8, null, 3);
1273
1270
  } if (rf & 2) {
1274
- const defaultTemplate_r14 = i0.ɵɵreference(4);
1275
- const pageLayoutTemplate_r15 = i0.ɵɵreference(6);
1276
1271
  i0.ɵɵadvance(2);
1277
- i0.ɵɵproperty("ngIf", ctx.formlayout === "page")("ngIfThen", pageLayoutTemplate_r15)("ngIfElse", defaultTemplate_r14);
1278
- } }, dependencies: [i6.AnchorComponent, i7.NgClass, i7.NgForOf, i7.NgIf, i7.NgTemplateOutlet, i8.ButtonComponent, i5.MessageComponent, i5.FilterPipe], encapsulation: 2 }); }
1272
+ i0.ɵɵconditional(ctx.formlayout === "page" ? 2 : 3);
1273
+ } }, dependencies: [i6.AnchorComponent, i7.NgClass, i7.NgTemplateOutlet, i8.ButtonComponent, i5.MessageComponent, i5.FilterPipe], encapsulation: 2 }); }
1279
1274
  }
1280
1275
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FormComponent, [{
1281
1276
  type: Component,
1282
1277
  args: [{ selector: 'form[wmForm]', providers: [
1283
1278
  provideAsWidgetRef(FormComponent)
1284
- ], template: "<ng-template #content><ng-content></ng-content></ng-template>\n\n<ng-container *ngIf=\"formlayout === 'page'; then pageLayoutTemplate else defaultTemplate\">\n</ng-container>\n\n<ng-template #defaultTemplate>\n <div class=\"panel-heading\" *ngIf=\"!isLayoutDialog && (title || subheading || iconclass || showButtons('header'))\">\n <h3 class=\"panel-title\">\n <div class=\"pull-left\">\n <i class=\"app-icon panel-icon\" aria-hidden=\"true\" [ngClass]=\"iconclass\" *ngIf=\"iconclass\"></i>\n </div>\n <div class=\"pull-left\">\n <div class=\"heading\" [innerHTML]=\"title\"></div>\n <div class=\"description\" [innerHTML]=\"subheading\"></div>\n </div>\n <div class=\"form-action panel-actions basic-btn-grp\">\n <ng-container *ngFor=\"let btn of buttonArray | filter : 'position' : 'header'; let index = index\"\n [ngTemplateOutlet]=\"btn.widgetType === 'button' ? buttonRef : anchorRef\"\n [ngTemplateOutletContext]=\"{btn:btn}\"\n [ngTemplateOutletInjector]=\"createCustomInjector('action_header_' + index, {btn:btn})\">\n </ng-container>\n <button type=\"button\" class=\"app-icon wi panel-action\" *ngIf=\"collapsible\" [title]=\"expanded? (this.appLocale?.LABEL_COLLAPSE||'Collapse'):(this.appLocale?.LABEL_EXPAND||'Expand')\"\n [ngClass]=\"expanded ? 'wi-minus': 'wi-plus'\" (click)=\"expandCollapsePanel();\"></button>\n </div>\n </h3>\n </div>\n <div class=\"panel-body\" [ngClass]=\"{'form-elements': isLayoutDialog, 'form-body': !isLayoutDialog}\" [class.hidden]=\"!expanded\">\n <p wmMessage *ngIf=\"!!statusMessage.caption\" [attr.aria-hidden]=\"!statusMessage.caption\" [attr.aria-label]=\"statusMessage.caption\" caption.bind=\"statusMessage.caption\" type.bind=\"statusMessage.type\"></p>\n <div [ngClass]=\"{'form-elements': !isLayoutDialog, 'form-content': isLayoutDialog}\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"basic-btn-grp form-action panel-footer clearfix\" [ngClass]=\"{'modal-footer': isLayoutDialog}\" [class.hidden]=\"!expanded || !showButtons('footer')\">\n <ng-container *ngFor=\"let btn of buttonArray | filter : 'position' : 'footer'; let index = index\"\n [ngTemplateOutlet]=\"btn.widgetType === 'button' ? buttonRef : anchorRef\"\n [ngTemplateOutletContext]=\"{btn:btn}\"\n [ngTemplateOutletInjector]=\"createCustomInjector('action_footer_' + index, {btn:btn})\">\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #pageLayoutTemplate>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</ng-template>\n\n<ng-template #buttonRef let-btn=\"btn\">\n <button wmButton name=\"{{btn.key}}\" caption.bind=\"btn.displayName\" class.bind=\"btn.class\" iconclass.bind=\"btn.iconclass\" show.bind=\"btn.show\"\n (click)=\"invokeActionEvent($event, btn.action)\" type.bind=\"btn.type\" hint.bind=\"btn.title\" shortcutkey.bind=\"btn.shortcutkey\" disabled.bind=\"ngform.status === 'PENDING' || btn.disabled\"\n tabindex.bind=\"btn.tabindex\" [attr.aria-label]=\"btn.displayName\" [class.hidden]=\"btn.updateMode ? !isUpdateMode : isUpdateMode\"></button>\n</ng-template>\n\n<ng-template #anchorRef let-btn=\"btn\">\n <a wmAnchor name=\"{{btn.key}}\" caption.bind=\"btn.displayName\" class.bind=\"btn.class\" iconclass.bind=\"btn.iconclass\" show.bind=\"btn.show\"\n (click)=\"invokeActionEvent($event, btn.action)\" hint.bind=\"btn.title\" shortcutkey.bind=\"btn.shortcutkey\"\n hyperlink.bind=\"btn.hyperlink\" target.bind=\"btn.target\"\n tabindex.bind=\"btn.tabindex\" [class.hidden]=\"btn.updateMode ? !isUpdateMode : isUpdateMode\"></a>\n</ng-template>\n\n<ng-container #dynamicForm></ng-container>\n" }]
1279
+ ], template: "<ng-template #content><ng-content></ng-content></ng-template>\n\n@if (formlayout === 'page') {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n} @else {\n @if (!isLayoutDialog && (title || subheading || iconclass || showButtons('header'))) {\n <div class=\"panel-heading\">\n <h3 class=\"panel-title\">\n <div class=\"pull-left\">\n @if (iconclass) {\n <i class=\"app-icon panel-icon\" aria-hidden=\"true\" [ngClass]=\"iconclass\"></i>\n }\n </div>\n <div class=\"pull-left\">\n <div class=\"heading\" [innerHTML]=\"title\"></div>\n <div class=\"description\" [innerHTML]=\"subheading\"></div>\n </div>\n <div class=\"form-action panel-actions basic-btn-grp\">\n @for (btn of buttonArray | filter : 'position' : 'header'; track btn; let index = $index) {\n <ng-container\n [ngTemplateOutlet]=\"btn.widgetType === 'button' ? buttonRef : anchorRef\"\n [ngTemplateOutletContext]=\"{btn:btn}\"\n [ngTemplateOutletInjector]=\"createCustomInjector('action_header_' + index, {btn:btn})\">\n </ng-container>\n }\n @if (collapsible) {\n <button type=\"button\" class=\"app-icon wi panel-action\" [title]=\"expanded? (this.appLocale?.LABEL_COLLAPSE||'Collapse'):(this.appLocale?.LABEL_EXPAND||'Expand')\"\n [ngClass]=\"expanded ? 'wi-minus': 'wi-plus'\" (click)=\"expandCollapsePanel();\"></button>\n }\n </div>\n </h3>\n </div>\n }\n <div class=\"panel-body\" [ngClass]=\"{'form-elements': isLayoutDialog, 'form-body': !isLayoutDialog}\" [class.hidden]=\"!expanded\">\n @if (!!statusMessage.caption) {\n <p wmMessage [attr.aria-hidden]=\"!statusMessage.caption\" [attr.aria-label]=\"statusMessage.caption\" caption.bind=\"statusMessage.caption\" type.bind=\"statusMessage.type\"></p>\n }\n <div [ngClass]=\"{'form-elements': !isLayoutDialog, 'form-content': isLayoutDialog}\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"basic-btn-grp form-action panel-footer clearfix\" [ngClass]=\"{'modal-footer': isLayoutDialog}\" [class.hidden]=\"!expanded || !showButtons('footer')\">\n @for (btn of buttonArray | filter : 'position' : 'footer'; track btn; let index = $index) {\n <ng-container\n [ngTemplateOutlet]=\"btn.widgetType === 'button' ? buttonRef : anchorRef\"\n [ngTemplateOutletContext]=\"{btn:btn}\"\n [ngTemplateOutletInjector]=\"createCustomInjector('action_footer_' + index, {btn:btn})\">\n </ng-container>\n }\n </div>\n </div>\n}\n\n\n\n<ng-template #buttonRef let-btn=\"btn\">\n <button wmButton name=\"{{btn.key}}\" caption.bind=\"btn.displayName\" class.bind=\"btn.class\" iconclass.bind=\"btn.iconclass\" show.bind=\"btn.show\"\n (click)=\"invokeActionEvent($event, btn.action)\" type.bind=\"btn.type\" hint.bind=\"btn.title\" shortcutkey.bind=\"btn.shortcutkey\" disabled.bind=\"ngform.status === 'PENDING' || btn.disabled\"\n tabindex.bind=\"btn.tabindex\" [attr.aria-label]=\"btn.displayName\" [class.hidden]=\"btn.updateMode ? !isUpdateMode : isUpdateMode\"></button>\n</ng-template>\n\n<ng-template #anchorRef let-btn=\"btn\">\n <a wmAnchor name=\"{{btn.key}}\" caption.bind=\"btn.displayName\" class.bind=\"btn.class\" iconclass.bind=\"btn.iconclass\" show.bind=\"btn.show\"\n (click)=\"invokeActionEvent($event, btn.action)\" hint.bind=\"btn.title\" shortcutkey.bind=\"btn.shortcutkey\"\n hyperlink.bind=\"btn.hyperlink\" target.bind=\"btn.target\"\n tabindex.bind=\"btn.tabindex\" [class.hidden]=\"btn.updateMode ? !isUpdateMode : isUpdateMode\"></a>\n</ng-template>\n\n<ng-container #dynamicForm></ng-container>\n" }]
1285
1280
  }], () => [{ type: i0.Injector }, { type: i1.FormBuilder }, { type: i2.App }, { type: i2.AbstractDialogService }, { type: i2.DynamicComponentRefProvider }, { type: i0.NgZone }, { type: i3.ListComponent, decorators: [{
1286
1281
  type: Optional
1287
1282
  }] }, { type: FormComponent, decorators: [{
@@ -1354,4 +1349,4 @@ export class FormComponent extends StylableComponent {
1354
1349
  args: ['keydown', ['$event']]
1355
1350
  }] }); })();
1356
1351
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FormComponent, { className: "FormComponent", filePath: "form.component.ts", lineNumber: 159 }); })();
1357
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvZGF0YS9mb3JtL3NyYy9mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9kYXRhL2Zvcm0vc3JjL2Zvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdILFNBQVMsRUFDVCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFdBQVcsRUFDWCxZQUFZLEVBQUUsTUFBTSxFQUNwQixRQUFRLEVBQ1IsTUFBTSxFQUVOLFFBQVEsRUFDUixRQUFRLEVBQ1IsU0FBUyxFQUNULGdCQUFnQixFQUNuQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsU0FBUyxFQUFFLFdBQVcsRUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFDSCxVQUFVLEVBQ1YsZUFBZSxFQUNmLFdBQVcsRUFDWCxxQkFBcUIsRUFDckIsR0FBRyxFQUNILFVBQVUsRUFDVixRQUFRLEVBQ1IsUUFBUSxFQUNSLDJCQUEyQixFQUMzQixXQUFXLEVBQ1gsZUFBZSxFQUNmLFFBQVEsRUFDUixZQUFZLEVBQ1osU0FBUyxFQUNULG1CQUFtQixFQUNuQixVQUFVLEVBQ1YsV0FBVyxFQUNYLGVBQWUsR0FDbEIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUNILG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLFNBQVMsRUFDWixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1B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QixRQUFROztzQkFBSSxRQUFROztzQkFDcEIsU0FBUzt1QkFBQyxvQkFBb0I7O3NCQUM5QixTQUFTO3VCQUFDLGNBQWM7O3NCQUN4QixTQUFTO3VCQUFDLG9CQUFvQjs7c0JBQzlCLFNBQVM7dUJBQUMsY0FBYzs7c0JBQ3hCLFNBQVM7dUJBQUMsZUFBZTs7c0JBQ3pCLFNBQVM7dUJBQUMsWUFBWTs7c0JBQ3RCLFNBQVM7dUJBQUMsY0FBYzs7c0JBQ3hCLFNBQVM7dUJBQUMsV0FBVzs7c0JBQ3JCLFNBQVM7dUJBQUMsS0FBSzs7c0JBQ2YsU0FBUzt1QkFBQyxNQUFNOztzQkFDaEIsTUFBTTt1QkFBQyxrQkFBa0I7O3NCQUFHLFFBQVE7cUJBcEsyQixjQUFjO2tCQUFqRixTQUFTO21CQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQ3JDLFVBQVU7a0JBQXRDLFNBQVM7bUJBQUMsZ0JBQWdCO1lBRXNCLGFBQWE7a0JBQTdELGVBQWU7bUJBQUMsU0FBUyxFQUFFLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQztZQTRHeEIsTUFBTTtrQkFBNUIsV0FBVzttQkFBQyxRQUFRO1lBRWUsTUFBTTtrQkFBekMsWUFBWTttQkFBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFJWCxPQUFPO2tCQUE3QixZQUFZO21CQUFDLE9BQU87WUFJZ0IsZ0JBQWdCO2tCQUFwRCxZQUFZO21CQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7a0ZBM0gxQixhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQXR0cmlidXRlLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLCBJbmplY3QsXG4gICAgSW5qZWN0b3IsXG4gICAgTmdab25lLFxuICAgIE9uRGVzdHJveSxcbiAgICBPcHRpb25hbCxcbiAgICBTa2lwU2VsZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Rm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7XG4gICAgJGFwcERpZ2VzdCxcbiAgICAkaW52b2tlV2F0Y2hlcnMsXG4gICAgJHBhcnNlRXZlbnQsXG4gICAgQWJzdHJhY3REaWFsb2dTZXJ2aWNlLFxuICAgIEFwcCxcbiAgICBEYXRhU291cmNlLFxuICAgIERhdGFUeXBlLFxuICAgIGRlYm91bmNlLFxuICAgIER5bmFtaWNDb21wb25lbnRSZWZQcm92aWRlcixcbiAgICBleHRlbmRQcm90byxcbiAgICBnZXRDbG9uZWRPYmplY3QsXG4gICAgZ2V0RmlsZXMsXG4gICAgZ2V0VmFsaWRKU09OLFxuICAgIGlzRGVmaW5lZCxcbiAgICBpc0VsZW1lbnRJblZpZXdwb3J0LFxuICAgIHJlbW92ZUF0dHIsXG4gICAgcmVtb3ZlQ2xhc3MsXG4gICAgc2Nyb2xsVG9FbGVtZW50LFxufSBmcm9tICdAd20vY29yZSc7XG5pbXBvcnQge1xuICAgIGdldEZpZWxkTGF5b3V0Q29uZmlnLFxuICAgIExpdmVfT3BlcmF0aW9ucyxcbiAgICBNZXNzYWdlQ29tcG9uZW50LFxuICAgIHBhcnNlVmFsdWVCeVR5cGUsXG4gICAgUGFydGlhbERpcmVjdGl2ZSxcbiAgICBwZXJmb3JtRGF0YU9wZXJhdGlvbixcbiAgICBwcm92aWRlQXNXaWRnZXRSZWYsXG4gICAgU3R5bGFibGVDb21wb25lbnQsXG4gICAgc3R5bGVyLFxuICAgIFdpZGdldFJlZlxufSBmcm9tICdAd20vY29tcG9uZW50cy9iYXNlJztcbmltcG9ydCB7UHJlZmFiRGlyZWN0aXZlfSBmcm9tICdAd20vY29tcG9uZW50cy9wcmVmYWInO1xuaW1wb3J0IHtMaXN0Q29tcG9uZW50fSBmcm9tICdAd20vY29tcG9uZW50cy9kYXRhL2xpc3QnO1xuXG5pbXBvcnQge3JlZ2lzdGVyRm9ybVByb3BzfSBmcm9tICcuL2Zvcm0ucHJvcHMnO1xuaW1wb3J0IHtcbiAgICBkZWJvdW5jZSBhcyBfZGVib3VuY2UsXG4gICAgZmlsdGVyLFxuICAgIGZpbmQsIGZpbmRJbmRleCxcbiAgICBmb3JFYWNoLFxuICAgIGdldCxcbiAgICBpbmNsdWRlcyxcbiAgICBpc0FycmF5LFxuICAgIGlzRW1wdHksIGlzRXF1YWwsXG4gICAgaXNVbmRlZmluZWQsXG4gICAga2V5cyxcbiAgICBsYXN0LFxuICAgIHNldCxcbiAgICBzb21lLFxuICAgIHNwbGl0XG59IGZyb20gXCJsb2Rhc2gtZXNcIjtcblxuY29uc3QgV0lER0VUX0NPTkZJRyA9IHt3aWRnZXRUeXBlOiAnd20tZm9ybScsIGhvc3RDbGFzczogJ3BhbmVsIGFwcC1wYW5lbCBhcHAtZm9ybSd9O1xuY29uc3QgTE9HSU5fRk9STV9DT05GSUcgPSB7d2lkZ2V0VHlwZTogJ3dtLWZvcm0nLCBob3N0Q2xhc3M6ICdhcHAtZm9ybSBhcHAtbG9naW4tZm9ybSd9O1xuY29uc3QgTElWRV9GT1JNX0NPTkZJRyA9IHt3aWRnZXRUeXBlOiAnd20tbGl2ZWZvcm0nLCBob3N0Q2xhc3M6ICdwYW5lbCBhcHAtcGFuZWwgYXBwLWxpdmVmb3JtIGxpdmVmb3JtLWlubGluZSd9O1xuY29uc3QgTElWRV9GSUxURVJfQ09ORklHID0ge3dpZGdldFR5cGU6ICd3bS1saXZlZmlsdGVyJywgaG9zdENsYXNzOiAncGFuZWwgYXBwLXBhbmVsIGFwcC1saXZlZmlsdGVyIGNsZWFyZml4IGxpdmVmb3JtLWlubGluZSd9O1xuXG5jb25zdCBnZXRXaWRnZXRDb25maWcgPSAoaXNMaXZlRm9ybSwgaXNMaXZlRmlsdGVyLCByb2xlKSA9PiB7XG4gICAgbGV0IGNvbmZpZyA9IFdJREdFVF9DT05GSUc7XG4gICAgaWYgKGlzTGl2ZUZvcm0gIT09IG51bGwpIHtcbiAgICAgICAgY29uZmlnID0gTElWRV9GT1JNX0NPTkZJRztcbiAgICB9IGVsc2UgaWYgKGlzTGl2ZUZpbHRlciAhPT0gbnVsbCkge1xuICAgICAgICBjb25maWcgPSBMSVZFX0ZJTFRFUl9DT05GSUc7XG4gICAgfSBlbHNlIGlmIChyb2xlID09PSAnYXBwLWxvZ2luJykge1xuICAgICAgICBjb25maWcgPSBMT0dJTl9GT1JNX0NPTkZJRztcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbn07XG5cbi8vIEdlbmVyYXRlIHRoZSBmb3JtIGZpZWxkIHdpdGggZ2l2ZW4gZmllbGQgZGVmaW5pdGlvbi4gQWRkIGEgZ3JpZCBjb2x1bW4gd3JhcHBlciBhcm91bmQgdGhlIGZvcm0gZmllbGQuXG5jb25zdCBzZXRNYXJrdXBGb3JGb3JtRmllbGQgPSAoZmllbGQsIGNvbHVtbldpZHRoKSA9PiAge1xuICAgIGxldCBwcm9wc1RtcGwgPSAnJztcbiAgICBmb3JFYWNoKGZpZWxkLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBwcm9wc1RtcGwgPSBgJHtwcm9wc1RtcGx9ICR7a2V5fT1cIiR7dmFsdWV9XCJgO1xuICAgIH0pO1xuICAgIHJldHVybiBgPHdtLWdyaWRjb2x1bW4gY29sdW1ud2lkdGg9XCIke2NvbHVtbldpZHRofVwiPlxuICAgICAgICAgICAgICAgICAgPHdtLWZvcm0tZmllbGQgJHtwcm9wc1RtcGx9Pjwvd20tZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvd20tZ3JpZGNvbHVtbj5gO1xufTtcblxuLy8gRnVuY3Rpb24gdG8gZmluZCBvdXQgdGhlIGZpcnN0IGludmFsaWQgZWxlbWVudCBpbiBmb3JtXG5jb25zdCBmaW5kSW52YWxpZEVsZW1lbnQgPSAoJGZvcm1FbGUsIG5nRm9ybSkgPT4ge1xuICAgIGNvbnN0ICRlbGUgPSAkZm9ybUVsZS5maW5kKCdmb3JtLm5nLWludmFsaWQ6dmlzaWJsZSwgW2Zvcm1Db250cm9sTmFtZV0ubmctaW52YWxpZDp2aXNpYmxlJykuZmlyc3QoKTtcbiAgICBsZXQgZm9ybU9iaiA9IG5nRm9ybTtcbiAgICAvLyBJZiBlbGVtZW50IGlzIGZvcm0sIGZpbmQgb3V0IHRoZSBmaXJzdCBpbnZhbGlkIGVsZW1lbnQgaW4gdGhpcyBmb3JtXG4gICAgaWYgKCRlbGUuaXMoJ2Zvcm0nKSkge1xuICAgICAgICBmb3JtT2JqID0gbmdGb3JtICYmIG5nRm9ybS5jb250cm9sc1skZWxlLmF0dHIoJ2Zvcm1Db250cm9sTmFtZScpIHx8ICRlbGUuYXR0cignbmFtZScpXTtcbiAgICAgICAgaWYgKGZvcm1PYmopIHtcbiAgICAgICAgICAgIHJldHVybiBmaW5kSW52YWxpZEVsZW1lbnQoJGVsZSwgZm9ybU9iaik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmdGb3JtOiBmb3JtT2JqLFxuICAgICAgICAkZWxlOiAkZWxlXG4gICAgfTtcbn07XG5cbi8vIEZ1bmN0aW9uIHRvIGdldCB0aGUgYWN0aXZlIGVsZW1lbnQgbWFya3VwIGJhc2VkIG9uIHdpZGdldCB0eXBlXG5jb25zdCBnZXRBY3RpdmVFbGVtZW50ID0gKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCB3aWRnZXRUeXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dpZGdldHR5cGUnKTtcbiAgICBzd2l0Y2ggKHdpZGdldFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NlbGVjdCcpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgfVxufVxuY29uc3Qgc2V0VG91Y2hlZFN0YXRlID0gKHNlbGYsIG5nRm9ybSwgZmllbGROYW1lKSA9PiB7XG4gICAgaWYgKG5nRm9ybS52YWxpZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuZ0Zvcm0uY29udHJvbHMpIHtcbiAgICAgICAgZm9yRWFjaChuZ0Zvcm0uY29udHJvbHMsIChjdHJsLCBmaWVsZE5hbWUpID0+IHtcbiAgICAgICAgICAgIHNldFRvdWNoZWRTdGF0ZShzZWxmLCBjdHJsLCBmaWVsZE5hbWUpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgZWxlbWVudCA9IHNlbGYuJGVsZW1lbnQuZmluZChgW3dtZm9ybWZpZWxkXVtrZXk9XCIke2ZpZWxkTmFtZX1cIl1gKTtcbiAgICAgICAgaWYgKCFlbGVtZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgZWxlbWVudCA9IHNlbGYuJGVsZW1lbnQuZmluZChgW3dtZm9ybWZpZWxkXVtuYW1lPVwiJHtmaWVsZE5hbWV9XCJdYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudFswXS5zZXRBdHRyaWJ1dGUoJ19fZXJyb3Jtc2cnLCBlbGVtZW50WzBdLmdldEF0dHJpYnV0ZSgnX192YWxpZGF0aW9uSWQnKSk7XG4gICAgICAgIGxldCBhY3RpdmVFbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudChlbGVtZW50WzBdKTtcbiAgICAgICAgYWN0aXZlRWxlbWVudD8uc2V0QXR0cmlidXRlKCdhcmlhLWludmFsaWQnLCBuZ0Zvcm0uaW52YWxpZCk7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIGVsZW1lbnRbMF0uZ2V0QXR0cmlidXRlKCdfX3ZhbGlkYXRpb25JZCcpKTtcbiAgICAgICAgbmdGb3JtLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB9XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2Zvcm1bd21Gb3JtXScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0uY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBwcm92aWRlQXNXaWRnZXRSZWYoRm9ybUNvbXBvbmVudClcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1Db21wb25lbnQgZXh0ZW5kcyBTdHlsYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgc3RhdGljICBpbml0aWFsaXplUHJvcHMgPSByZWdpc3RlckZvcm1Qcm9wcygpO1xuICAgIEBWaWV3Q2hpbGQoJ2R5bmFtaWNGb3JtJywgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgZHluYW1pY0Zvcm1SZWY6IFZpZXdDb250YWluZXJSZWY7XG4gICAgQFZpZXdDaGlsZChNZXNzYWdlQ29tcG9uZW50KSBtZXNzYWdlUmVmO1xuICAgIC8vIHRoaXMgaXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50IHJlZnMgaW5zaWRlIHRoZSBmb3JtLWdyb3VwXG4gICAgQENvbnRlbnRDaGlsZHJlbihXaWRnZXRSZWYsIHtkZXNjZW5kYW50czogdHJ1ZX0pIGNvbXBvbmVudFJlZnM7XG5cbiAgICBhdXRvdXBkYXRlO1xuICAgIHB1YmxpYyBmb3JtbGF5b3V0OiBhbnk7XG4gICAgcHVibGljIGlzRGF0YVNvdXJjZVVwZGF0ZWQ6IGJvb2xlYW47XG4gICAgY2FwdGlvbkFsaWduQ2xhc3M6IHN0cmluZztcbiAgICB2YWxpZGF0aW9udHlwZTogc3RyaW5nO1xuICAgIGNhcHRpb25hbGlnbjogc3RyaW5nO1xuICAgIGNhcHRpb25wb3NpdGlvbjogc3RyaW5nO1xuICAgIGNhcHRpb25zaXplO1xuICAgIGNvbGxhcHNpYmxlOiBib29sZWFuO1xuICAgIGV4cGFuZGVkOiBib29sZWFuO1xuICAgIGVsU2NvcGU7XG4gICAgX3dpZGdldENsYXNzID0gJyc7XG4gICAgY2FwdGlvbndpZHRoOiBzdHJpbmc7XG4gICAgX2NhcHRpb25DbGFzcyA9ICcnO1xuICAgIG5nZm9ybTogRm9ybUdyb3VwO1xuICAgIGZvcm1GaWVsZHMgPSBbXTtcbiAgICBmb3JtZmllbGRzID0ge307XG4gICAgZm9ybVdpZGdldHMgPSB7fTtcbiAgICBmaWx0ZXJXaWRnZXRzID0ge307XG4gICAgYnV0dG9uQXJyYXkgPSBbXTtcbiAgICBkYXRhb3V0cHV0ID0ge307XG4gICAgZGF0YXNvdXJjZTtcbiAgICBmb3JtZGF0YXNvdXJjZTtcbiAgICBmb3JtZGF0YSA9IHt9O1xuICAgIGlzU2VsZWN0ZWQ7XG4gICAgcHJldkRhdGFWYWx1ZXM7XG4gICAgcHJldkRhdGFPYmplY3Q7XG4gICAgcHJldmZvcm1GaWVsZHM7XG4gICAgc3RhdHVzTWVzc2FnZSA9IHtcbiAgICAgICAgY2FwdGlvbjogJycsXG4gICAgICAgIHR5cGU6ICcnXG4gICAgfTtcbiAgICBtZXNzYWdlbGF5b3V0O1xuICAgIG1ldGFkYXRhO1xuICAgIGVycm9ybWVzc2FnZTtcbiAgICBvbkVycm9yO1xuICAgIG9uU3VjY2VzcztcbiAgICBwcmltYXJ5S2V5ID0gW107XG4gICAgcG9zdG1lc3NhZ2U7XG4gICAgX2xpdmVUYWJsZVBhcmVudDtcbiAgICB1cGRhdGVNb2RlO1xuICAgIG5hbWU7XG4gICAgLy8gTGl2ZSBGb3JtIE1ldGhvZHNcbiAgICBjbGVhckRhdGE6IEZ1bmN0aW9uO1xuICAgIGNhbmNlbDogRnVuY3Rpb247XG4gICAgZGVsZXRlOiBGdW5jdGlvbjtcbiAgICBzYXZlOiBGdW5jdGlvbjtcbiAgICBzYXZlQW5kTmV3OiBGdW5jdGlvbjtcbiAgICBzYXZlQW5kVmlldzogRnVuY3Rpb247XG4gICAgc2V0UHJpbWFyeUtleTogKCkgPT4ge307XG4gICAgZGlhbG9nSWQ6IHN0cmluZztcbiAgICAvLyBMaXZlIEZpbHRlclxuICAgIGVuYWJsZWVtcHR5ZmlsdGVyO1xuICAgIHBhZ2VzaXplO1xuICAgIHJlc3VsdDtcbiAgICBwYWdpbmF0aW9uO1xuICAgIGNsZWFyRmlsdGVyOiBGdW5jdGlvbjtcbiAgICBhcHBseUZpbHRlcjogRnVuY3Rpb247XG4gICAgZmlsdGVyOiBGdW5jdGlvbjtcbiAgICBmaWx0ZXJPbkRlZmF1bHQ6IEZ1bmN0aW9uO1xuICAgIG9uTWF4RGVmYXVsdFZhbHVlQ2hhbmdlOiBGdW5jdGlvbjtcbiAgICBudW1iZXJPZkZpZWxkczogbnVtYmVyO1xuXG4gICAgcHJpdmF0ZSBfZGVib3VuY2VkVXBkYXRlRmllbGRTb3VyY2U6IEZ1bmN0aW9uID0gX2RlYm91bmNlKHRoaXMudXBkYXRlRmllbGRTb3VyY2UsIDM1MCk7XG4gICAgcHJpdmF0ZSBvcGVyYXRpb25UeXBlO1xuICAgIHByaXZhdGUgX2lzTGF5b3V0RGlhbG9nO1xuICAgIHByaXZhdGUgX2R5bmFtaWNDb250ZXh0O1xuICAgIHByaXZhdGUgX2lzR3JpZExheW91dFByZXNlbnQ7XG4gICAgcHJpdmF0ZSB2YWxpZGF0aW9uTWVzc2FnZXMgPSBbXTtcbiAgICBwcml2YXRlIGZvcm1Hcm91cE5hbWU7XG4gICAgcHJpdmF0ZSBmb3JtQXJyYXlJbmRleDtcbiAgICBwcml2YXRlIGJpbmRpbmdWYWx1ZTtcbiAgICBwcml2YXRlIF9mb3JtSXNJbkxpc3Q7XG4gICAgcHJpdmF0ZSBfdHJpZ2dlcmVkQnlVc2VyOiBib29sZWFuO1xuXG5cbiAgICBwcml2YXRlIF9kZWJvdW5jZWRTdWJtaXRGb3JtID0gZGVib3VuY2UoKCRldmVudCkgPT4ge1xuICAgICAgICAvLyBjYWxsaW5nIHN1Ym1pdCBldmVudCBpbiBuZ1pvbmUgYXMgY2hhbmdlIGRldGVjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIHBvc3QgdGhlIHN1Ym1pdCBjYWxsYmFjayBhbmQgYWN0aW9ucyBsaWtlIG5vdGlmaWNhdGlvbiBhcmUgbm90IHNob3duXG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEZvcm0oJGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfSwgMjUwKTtcblxuICAgIHNldCBpc0xheW91dERpYWxvZyhudikge1xuICAgICAgICBpZiAobnYpIHtcbiAgICAgICAgICAgIHJlbW92ZUNsYXNzKHRoaXMubmF0aXZlRWxlbWVudCwgJ3BhbmVsIGFwcC1wYW5lbCBsaXZlZm9ybS1pbmxpbmUnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc0xheW91dERpYWxvZyA9IG52O1xuICAgIH1cblxuICAgIGdldCBpc0xheW91dERpYWxvZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzTGF5b3V0RGlhbG9nO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2lzVXBkYXRlTW9kZTtcbiAgICBzZXQgaXNVcGRhdGVNb2RlKG52KSB7XG4gICAgICAgIHRoaXMuX2lzVXBkYXRlTW9kZSA9IG52O1xuICAgICAgICB0aGlzLmZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBmaWVsZC5zZXRSZWFkT25seVN0YXRlKG52KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGlzVXBkYXRlTW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVXBkYXRlTW9kZTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2FjdGlvbicpIGFjdGlvbjogc3RyaW5nO1xuXG4gICAgQEhvc3RMaXN0ZW5lcignc3VibWl0JywgWyckZXZlbnQnXSkgc3VibWl0KCRldmVudCkge1xuICAgICAgICB0aGlzLl9kZWJvdW5jZWRTdWJtaXRGb3JtKCRldmVudCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigncmVzZXQnKSBvblJlc2V0KCkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pIG9uS2V5ZG93bkhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgdGhpcy5fdHJpZ2dlcmVkQnlVc2VyID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gcmV0dXJucyB0aGUgZm9ybUFycmF5IGNvbnRyb2wgb24gdGhlIHBhcmVudEZvcm0uXG4gICAgZ2V0IHBhcmVudEZvcm1BcnJheSgpOiBGb3JtQXJyYXkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRGb3JtICYmIHRoaXMuaXNQYXJlbnRMaXN0ICYmIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0uZ2V0KHRoaXMucGFyZW50TGlzdC5uYW1lKSBhcyBGb3JtQXJyYXk7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyB0cnVlIG9ubHkgd2hlbiBjbG9zZXN0IGxpdmVsaXN0IGlzIHRoZSBpbW1lZGlhdGUgcGFyZW50IG9mIHRoZSBmb3JtLlxuICAgIC8vIGNoZWNrcyBmb3IgbGl2ZWxpc3QgaGF2aW5nIGFueSBmb3JtIGVsZW1lbnRzIHdpdGggcGFyZW50Rm9ybSBuYW1lLlxuICAgIC8vIElmIGxpdmVsaXN0IGlzIG5vdCBjb250YWluaW5nIGFueSBwYXJlbnRGb3JtIGVsZW1lbnRzIHRoZW4gaXQgcmV0dXJucyB0cnVlLlxuICAgIGdldCBpc1BhcmVudExpc3QoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudExpc3QgJiYgdGhpcy5wYXJlbnRGb3JtICYmICFpc0RlZmluZWQodGhpcy5fZm9ybUlzSW5MaXN0KSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybUVsZSA9IHRoaXMuJGVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBsaXN0RWxlID0gZm9ybUVsZS5jbG9zZXN0KCcuYXBwLWxpdmVsaXN0W25hbWU9XCInICsgdGhpcy5wYXJlbnRMaXN0Lm5hbWUgKyAnXCJdJyk7XG4gICAgICAgICAgICBpZiAobGlzdEVsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtSXNJbkxpc3QgPSAhKGxpc3RFbGUuZmluZCgnZm9ybVt3aWRnZXQtaWQ9XCInICsgdGhpcy5wYXJlbnRGb3JtLndpZGdldElkICsgJ1wiXScpKS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzRGVmaW5lZCh0aGlzLl9mb3JtSXNJbkxpc3QpID8gdGhpcy5fZm9ybUlzSW5MaXN0IDogdGhpcy5wYXJlbnRMaXN0O1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBpbmo6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICAgICAgcHJpdmF0ZSBhcHA6IEFwcCxcbiAgICAgICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBBYnN0cmFjdERpYWxvZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZHluYW1pY0NvbXBvbmVudFByb3ZpZGVyOiBEeW5hbWljQ29tcG9uZW50UmVmUHJvdmlkZXIsXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIEBPcHRpb25hbCgpIHB1YmxpYyBwYXJlbnRMaXN0OiBMaXN0Q29tcG9uZW50LFxuICAgICAgICBAU2tpcFNlbGYoKSBAT3B0aW9uYWwoKSBwdWJsaWMgcGFyZW50Rm9ybTogRm9ybUNvbXBvbmVudCxcbiAgICAgICAgQFNraXBTZWxmKCkgQE9wdGlvbmFsKCkgcHVibGljIHBhcmVudFByZWZhYjogUHJlZmFiRGlyZWN0aXZlLFxuICAgICAgICBAU2tpcFNlbGYoKSBAT3B0aW9uYWwoKSBwdWJsaWMgcGFyZW50UGFydGlhbDogUGFydGlhbERpcmVjdGl2ZSxcbiAgICAgICAgQEF0dHJpYnV0ZSgnYmVmb3Jlc3VibWl0LmV2ZW50JykgcHVibGljIG9uQmVmb3JlU3VibWl0RXZ0LFxuICAgICAgICBAQXR0cmlidXRlKCdzdWJtaXQuZXZlbnQnKSBwdWJsaWMgb25TdWJtaXRFdnQsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ2JlZm9yZXJlbmRlci5ldmVudCcpIHB1YmxpYyBvbkJlZm9yZVJlbmRlckV2dCxcbiAgICAgICAgQEF0dHJpYnV0ZSgnZGF0YXNldC5iaW5kJykgcHVibGljIGJpbmRkYXRhc2V0LFxuICAgICAgICBAQXR0cmlidXRlKCdmb3JtZGF0YS5iaW5kJykgcHJpdmF0ZSBiaW5kZm9ybWRhdGEsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ3dtTGl2ZUZvcm0nKSBpc0xpdmVGb3JtLFxuICAgICAgICBAQXR0cmlidXRlKCd3bUxpdmVGaWx0ZXInKSBpc0xpdmVGaWx0ZXIsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ2RhdGEtcm9sZScpIHJvbGUsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ2tleScpIGtleSxcbiAgICAgICAgQEF0dHJpYnV0ZSgnbmFtZScpIG5hbWUsXG4gICAgICAgIEBJbmplY3QoJ0VYUExJQ0lUX0NPTlRFWFQnKSBAT3B0aW9uYWwoKSBleHBsaWNpdENvbnRleHQ6IGFueVxuICAgICkge1xuICAgICAgICBzdXBlcihpbmosIGdldFdpZGdldENvbmZpZyhpc0xpdmVGb3JtLCBpc0xpdmVGaWx0ZXIsIHJvbGUpLCBleHBsaWNpdENvbnRleHQpO1xuXG4gICAgICAgIHN0eWxlcih0aGlzLm5hdGl2ZUVsZW1lbnQsIHRoaXMpO1xuXG4gICAgICAgIC8vIHJlbW92ZSB0aXRsZSBwcm9wZXJ0eSBhcyBhdHRyaWJ1dGUgYXMgaXQgaXMgY2F1c2luZyB1bm5lY2Vzc2FyeSB0b29sdGlwXG4gICAgICAgIHJlbW92ZUF0dHIodGhpcy5uYXRpdmVFbGVtZW50LCAndGl0bGUnKTtcbiAgICAgICAgdGhpcy5pc1VwZGF0ZU1vZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmRpYWxvZ0lkID0gdGhpcy5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGlhbG9nSWQnKTtcbiAgICAgICAgdGhpcy5uZ2Zvcm0gPSBmYi5ncm91cCh7fSk7XG4gICAgICAgIHRoaXMuYmluZGluZ1ZhbHVlID0ga2V5IHx8IG5hbWU7XG5cbiAgICAgICAgLy8gT24gdmFsdWUgY2hhbmdlIGluIGZvcm0sIHVwZGF0ZSB0aGUgZGF0YW91dHB1dFxuICAgICAgICBjb25zdCBvblZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uID0gIHRoaXMubmdmb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLnVwZGF0ZURhdGFPdXRwdXQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJEZXN0cm95TGlzdGVuZXIoKCkgPT4gb25WYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgdGhpcy5lbFNjb3BlID0gdGhpcztcblxuICAgICAgICB0aGlzLmFkZEV2ZW50c1RvQ29udGV4dCh0aGlzLmNvbnRleHQpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmcy5mb3JFYWNoKGNvbXBvbmVudFJlZiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHdpZGdldHMgaW5zaWRlIGZvcm0gd2l0aCBmb3JtV2lkZ2V0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1XaWRnZXRzW2NvbXBvbmVudFJlZi5uYW1lXSA9IGNvbXBvbmVudFJlZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgMjUwKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudEZvcm0gJiYgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybSAmJiB0aGlzLmlzUGFyZW50TGlzdCkge1xuICAgICAgICAgICAgLy8gc2V0dGluZyBmb3JtQXJyYXkgY29udHJvbCBvbiBuZ2Zvcm0uXG4gICAgICAgICAgICBpZiAoIWdldCh0aGlzLnBhcmVudEZvcm0ubmdmb3JtLmNvbnRyb2xzLCB0aGlzLnBhcmVudExpc3QubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0ubmdmb3JtLnNldENvbnRyb2wodGhpcy5wYXJlbnRMaXN0Lm5hbWUsIG5ldyBGb3JtQXJyYXkoW10pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHB1c2hpbmcgdGhlIG5nZm9ybSB0byBmb3JtQXJyYXkuXG4gICAgICAgICAgICB0aGlzLnBhcmVudEZvcm1BcnJheS5wdXNoKHRoaXMubmdmb3JtKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUFycmF5SW5kZXggPSB0aGlzLnBhcmVudEZvcm1BcnJheS5sZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkSW5uZXJOZ0Zvcm1Ub0Zvcm0odGhpcy5iaW5kaW5nVmFsdWUpO1xuICAgIH1cblxuICAgIGZpbmRPcGVyYXRpb25UeXBlKCkge31cblxuICAgIHByaXZhdGUgYWRkSW5uZXJOZ0Zvcm1Ub0Zvcm0oYmluZGluZykge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRGb3JtICYmIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0pIHtcbiAgICAgICAgICAgIC8vIGhhbmRsaW5nIGFzIGZvcm1BcnJheSB3aGVuIHBhcmVudCBpcyBsaXN0LiBIZW5jZSByZXR1cm5pbmcgaGVyZSBmcm9tIGFkZGluZyB0byBwYXJlbnRGb3JtIGFnYWluLlxuICAgICAgICAgICAgaWYgKHRoaXMuaXNQYXJlbnRMaXN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYXNzaWduaW5nIHRoZSBjb250cm9sIG5hbWUgb2YgdGhlIGZvcm0gaW5zaWRlIHRoZSBwcmVmYWIgd2l0aCB0aGUgcHJlZmFiIG5hbWUuXG4gICAgICAgICAgICAvLyBUaGlzIHdpbGwgaGFwcGVuIG9ubHkgd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBmb3JtIGluc2lkZSBwcmVmYWIuXG4gICAgICAgICAgICAvLyBXZSBkbyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGlzIHdoZW4gbXVsdGlwbGUgZm9ybXMgYXJlIGluc2lkZSBwcmVmYWIuXG4gICAgICAgICAgICAvLyBUaGlzIHNjZW5hcmlvIGhhcyB0byBiZSBoYW5kbGVkIGJ5IGVuZCB1c2VyIGJ5IGNoYW5naW5nIGZvcm0gbmFtZXMgaW4gcHJlZmFiIGFjY29yZGluZyB0byB0aGUgZGF0YW1vZGVsIGJpbmRpbmcuXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRDb250YWluZXIgPSB0aGlzLnBhcmVudFByZWZhYiB8fCB0aGlzLnBhcmVudFBhcnRpYWw7XG4gICAgICAgICAgICBpZiAocGFyZW50Q29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudENvbnRlbnRFbDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRQcmVmYWIpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29udGVudEVsID0gcGFyZW50Q29udGFpbmVyLiRlbGVtZW50LmZpbmQoJ1t3bXByZWZhYmNvbnRhaW5lcl0nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb250ZW50RWwgPSBwYXJlbnRDb250YWluZXIuJGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIGFzc2lnbmluZyB0aGUgZm9ybSBuYW1lIHRvIHRoZSBwYXJlbnRDb250YWluZXIgbmFtZSBpLmUuIHBhcnRpYWwgbmFtZSBvciBwZXJmYWIgbmFtZSBieSBmb2xsb3dpbmdcbiAgICAgICAgICAgICAgICAgKiAxLiByZXRyaWV2aW5nIGFsbCB0aGUgZm9ybXMgaW4gdGhlIHBhcmVudENvbnRhaW5lclxuICAgICAgICAgICAgICAgICAqIDIuIGNvbnNpZGVyIHRoZSBmaXJzdCBmb3JtXG4gICAgICAgICAgICAgICAgICogMy4gaWYgdGhpcyBmb3JtIGlzIGluc2lkZSBsaXN0IGkuZS4gYWxzbyBmaW5kIGlmIHRoaXMgbGlzdCBpcyBhbHNvIGluc2lkZSB0aGUgcGFyZW50Q29udGFpbmVyIChwcmVmYWIgLyBwYXJ0aWFsKVxuICAgICAgICAgICAgICAgICAqIDQuIHRoZW4gZG8gbm90IGNoYW5nZSB0aGUgZm9ybSBuYW1lIHdoZW4gZm9ybSBpcyBpbnNpZGUgbGlzdCBhbmQgYWxzbyB3aGVuIHRoZXJlIGFyZSBzaWJsaW5ncyB0byB0aGUgZm9ybVxuICAgICAgICAgICAgICAgICAqIDUuIHRoaXMgbWVhbnMgZm9ybSBuYW1lIGNoYW5nZSBhcHBsaWVzIG9ubHkgd2hlbiB0aGVyZSBpcyBzaW5nbGUgZm9ybSAoaW1tZWRpYXRlIGNoaWxkKSBpbnNpZGUgdGhlIHBhcmVudENvbnRhaW5lci5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBwcmVmYWJJbm5lckZvcm0gPSBwYXJlbnRDb250ZW50RWwuZmluZCgnZm9ybScpLmZpcnN0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGdldChwcmVmYWJJbm5lckZvcm1bMF0sICd3aWRnZXQud2lkZ2V0SWQnKSA9PT0gdGhpcy53aWRnZXRJZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIGZvcm0gaW5zaWRlIHByZWZhYiBjb250YWluZXIgaXMgaW5zaWRlIHRoZSBsaXN0LiBJZiB0cnVlLCBkbyBub3QgY2hhbmdlIHRoZSBuYW1lLlxuICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWZhYklubmVyRm9ybS5pc1BhcmVudExpc3QgJiYgIXByZWZhYklubmVyRm9ybS5zaWJsaW5ncygnZm9ybScpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZyA9IGdldChwYXJlbnRDb250YWluZXIsICduYW1lJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY291bnRlciA9IDE7XG4gICAgICAgICAgICBsZXQgaW5uZXJCaW5kaW5nID0gYmluZGluZztcbiAgICAgICAgICAgIC8vIElubmVyIGZvcm1zIG1heSBoYXZlIHNhbWUgbmFtZXMuIElmIHNhbWUgbmFtZSBpcyBwcmVzZW50LCBhcHBlbmQgdW5xaXVlIGlkZW50aWZpZXJcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLnBhcmVudEZvcm0ubmdmb3JtLmNvbnRyb2xzLmhhc093blByb3BlcnR5KGlubmVyQmluZGluZykpIHtcbiAgICAgICAgICAgICAgICBpbm5lckJpbmRpbmcgPSBgJHtiaW5kaW5nfV8ke2NvdW50ZXJ9YDtcbiAgICAgICAgICAgICAgICBjb3VudGVyKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cE5hbWUgPSBpbm5lckJpbmRpbmc7XG4gICAgICAgICAgICAvLyBJZiBwYXJlbnQgZm9ybSBpcyBwcmVzZW50LCBhZGQgdGhlIGN1cnJlbnQgZm9ybSBhcyBhcyBmb3JtR3JvdXAgZm9yIHBhcmVudCBmb3JtXG4gICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0ubmdmb3JtLmFkZENvbnRyb2woaW5uZXJCaW5kaW5nLCB0aGlzLm5nZm9ybSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgdGhlIGV2ZW50cyBvbiBjb250ZXh0IHNvIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgYnkgZm9ybSBhY3Rpb25zXG4gICAgcHJpdmF0ZSBhZGRFdmVudHNUb0NvbnRleHQoY29udGV4dCkge1xuICAgICAgICBjb250ZXh0LmNhbmNlbCA9ICgpID0+IHRoaXMuY2FuY2VsKCk7XG4gICAgICAgIGNvbnRleHQucmVzZXQgPSAoKSA9PiB0aGlzLnJlc2V0KCk7XG4gICAgICAgIGNvbnRleHQuc2F2ZSA9IGV2dCA9PiB0aGlzLnNhdmUoZXZ0KTtcbiAgICAgICAgY29udGV4dC5zYXZlQW5kTmV3ID0gKCkgPT4gdGhpcy5zYXZlQW5kTmV3KCk7XG4gICAgICAgIGNvbnRleHQuc2F2ZUFuZFZpZXcgPSAoKSA9PiB0aGlzLnNhdmVBbmRWaWV3KCk7XG4gICAgICAgIGNvbnRleHQuZGVsZXRlID0gKCkgPT4gdGhpcy5kZWxldGUoKTtcbiAgICAgICAgY29udGV4dC5uZXcgPSAoKSA9PiB0aGlzLm5ldygpO1xuICAgICAgICBjb250ZXh0LmVkaXQgPSAoKSA9PiB0aGlzLmVkaXQoKTtcbiAgICAgICAgY29udGV4dC5oaWdobGlnaHRJbnZhbGlkRmllbGRzID0gKCkgPT4gdGhpcy5oaWdobGlnaHRJbnZhbGlkRmllbGRzKCk7XG4gICAgICAgIGNvbnRleHQuZmlsdGVyID0gKCkgPT4gdGhpcy5maWx0ZXIoKTtcbiAgICAgICAgY29udGV4dC5jbGVhckZpbHRlciA9ICgpID0+IHRoaXMuY2xlYXJGaWx0ZXIoKTtcbiAgICAgICAgY29udGV4dC5zdWJtaXQgPSBldnQgPT4gdGhpcy5zdWJtaXQoZXZ0KTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIG1ldGhvZCBnZXRzIGFsbCB0aGUgaW5uZXIgZm9ybXMgYW5kIHZhbGlkYXRlcyBlYWNoIGZvcm0uXG4gICAgcHJpdmF0ZSBzZXRWYWxpZGF0aW9uT25Jbm5lckZvcm1zKHZhbGlkYXRlVG91Y2gpIHtcbiAgICAgICAgY29uc3QgZm9ybUVsZSA9IHRoaXMuZ2V0TmF0aXZlRWxlbWVudCgpO1xuICAgICAgICBjb25zdCBmb3JtT2JqcyA9IGZvcm1FbGUucXVlcnlTZWxlY3RvckFsbCgnLmFwcC1mb3JtJyk7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25Nc2dzID0gW107XG4gICAgICAgIGZvckVhY2goZm9ybU9ianMsIGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9ybUluc3RhbmNlID0gKGUgYXMgYW55KS53aWRnZXQ7XG4gICAgICAgICAgICAvLyBkaWZmZXJlbnRpYXRpbmcgdGhlIHZhbGlkYXRpb25NZXNzYWdlcyBwcmVmaXggYmFzZWQgb24gdGhlIGZvcm1Hcm91cE5hbWVcbiAgICAgICAgICAgIC8vIGFzIHRoZSBmb3JtTmFtZSdzIGFyZSBzYW1lIHdoZW4gZm9ybXMgYXJlIGluIGxpc3RcbiAgICAgICAgICAgIGxldCBmb3JtTmFtZSA9IGdldChmb3JtSW5zdGFuY2UsICdmb3JtR3JvdXBOYW1lJykgfHwgZm9ybUluc3RhbmNlLm5hbWU7XG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKGZvcm1JbnN0YW5jZS5mb3JtQXJyYXlJbmRleCkpIHtcbiAgICAgICAgICAgICAgICBmb3JtTmFtZSA9IGZvcm1OYW1lICsgJ1snICsgZm9ybUluc3RhbmNlLmZvcm1BcnJheUluZGV4ICsgJ10nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBmb3JtSW5zdGFuY2U7XG4gICAgICAgICAgICB3aGlsZSAoZ2V0KGN1cnJlbnQsICdwYXJlbnRGb3JtJykpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50TmFtZSA9IGN1cnJlbnQucGFyZW50Rm9ybS5mb3JtR3JvdXBOYW1lIHx8IGN1cnJlbnQucGFyZW50Rm9ybS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LnBhcmVudEZvcm0ucGFyZW50Rm9ybUFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudE5hbWUgPSBwYXJlbnROYW1lICsgJ1snICsgY3VycmVudC5wYXJlbnRGb3JtLmZvcm1BcnJheUluZGV4ICsgJ10nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3JtTmFtZSA9IHBhcmVudE5hbWUgKyAnLicgKyBmb3JtTmFtZTtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRGb3JtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uT25GaWVsZHMoZm9ybUluc3RhbmNlLCBmb3JtTmFtZSwgdmFsaWRhdGVUb3VjaCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdmFsaWRhdGlvbiBvbiBmb3JtRmllbGRzLlxuICAgICAqIEFwcGxpZXMgdG8gaW5uZXJmb3JtIGFuZCBhbHNvIHNldHMgaW5uZXJmb3JtIHZhbGlkYXRpb24gb24gcGFyZW50IGZvcm0uXG4gICAgICogQHBhcmFtIHByZWZpeCBjb250YWlucyB0aGUgZm9ybSBuYW1lLCB3aGljaCBhbHNvIGluY2x1ZGVzIGl0cyBwYXJlbnRzIGZvcm0gbmFtZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsaWRhdGVUb3VjaFxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0VmFsaWRhdGlvbk9uRmllbGRzKGZvcm06IEZvcm1Db21wb25lbnQsIHByZWZpeDogc3RyaW5nLCB2YWxpZGF0ZVRvdWNoPzogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBjb250cm9scyA9IGZvcm0ubmdmb3JtLmNvbnRyb2xzO1xuICAgICAgICBjb25zdCBmb3JtRmllbGRzID0gZm9ybS5mb3JtRmllbGRzO1xuICAgICAgICBpZiAoIWZvcm1GaWVsZHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3JFYWNoKGNvbnRyb2xzLCAodiwgaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBmb3JtRmllbGRzLmZpbmQoZSA9PiBlLmtleSA9PT0gayk7XG4gICAgICAgICAgICBpZiAoIWZpZWxkIHx8ICh2YWxpZGF0ZVRvdWNoICYmICF2LnRvdWNoZWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmllbGQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpPy5zZXRBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcsIHYuaW52YWxpZCk7XG4gICAgICAgICAgICAvLyBpbnZva2luZyB0aGUgcHJlcGFyZVZhbGlkYXRpb24gb24gYm90aCBwYXJlbnQgZm9ybSBhbmQgY3VycmVudCBmb3JtLlxuICAgICAgICAgICAgdGhpcy5wcmVwYXJlVmFsaWRhdGlvbk9iaih2LCBrLCBmaWVsZCwgcHJlZml4KTtcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZVZhbGlkYXRpb25PYmouY2FsbChmb3JtLCB2LCBrLCBmaWVsZCwgcHJlZml4KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXNzaWducyAvIHVwZGF0ZXMgdmFsaWRhdGlvbk1lc3NhZ2VzIGJhc2VkIG9uIGFuZ3VsYXIgZXJyb3JzIG9uIGZpZWxkXG4gICAgcHJpdmF0ZSBwcmVwYXJlVmFsaWRhdGlvbk9iaih2LCBrLCBmaWVsZCwgcHJlZml4KSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMuZmluZEluZGV4KGUgPT4gKGUuZmllbGQgPT09IGsgJiYgZS5mdWxseVF1YWxpZmllZEZvcm1OYW1lID09PSBwcmVmaXgpKTtcbiAgICAgICAgaWYgKHYuaW52YWxpZCkge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIGZpZWxkIGNvbnRhaW5zIHRoZSBmaWVsZE5hbWVcbiAgICAgICAgICAgICAgICAgKiB2YWx1ZSBjb250YWlucyB0aGUgZmllbGQgdmFsdWVcbiAgICAgICAgICAgICAgICAgKiBlcnJvclR5cGUgY29udGFpbnMgdGhlIGxpc3Qgb2YgZXJyb3JzXG4gICAgICAgICAgICAgICAgICogbWVzc2FnZSBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICogZ2V0RWxlbWVudCByZXR1cm5zIHRoZSBlbGVtZW50IGhhdmluZyBmb2N1cy10YXJnZXRcbiAgICAgICAgICAgICAgICAgKiBmb3JtTmFtZSByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmb3JtXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBrLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yVHlwZToga2V5cyh2LmVycm9ycyksXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZpZWxkLnZhbGlkYXRpb25tZXNzYWdlIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICBnZXRFbGVtZW50OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQuJGVsZW1lbnQuZmluZCgnW2ZvY3VzLXRhcmdldF0nKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybU5hbWU6IGxhc3QocHJlZml4LnNwbGl0KCcuJykpLFxuICAgICAgICAgICAgICAgICAgICBmdWxseVF1YWxpZmllZEZvcm1OYW1lOiBwcmVmaXhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXNbaW5kZXhdLnZhbHVlID0gZmllbGQudmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXNbaW5kZXhdLmVycm9yVHlwZSA9IGtleXModi5lcnJvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHYudmFsaWQgJiYgaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoaXMgd2lsbCByZXR1cm4gYSBvYmplY3QgY29udGFpbmluZyB0aGUgZXJyb3IgZGV0YWlscyBmcm9tIHRoZSBsaXN0IG9mIGZvcm1GaWVsZHMgdGhhdCBhcmUgaW52YWxpZFxuICAgIHByaXZhdGUgc2V0VmFsaWRhdGlvbk1zZ3ModmFsaWRhdGVUb3VjaD86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1GaWVsZHMubGVuZ3RoICYmIGlzRW1wdHkodGhpcy5uZ2Zvcm0uY29udHJvbHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uT25GaWVsZHModGhpcywgdGhpcy5uYW1lLCB2YWxpZGF0ZVRvdWNoKTtcbiAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uT25Jbm5lckZvcm1zKHZhbGlkYXRlVG91Y2gpO1xuICAgIH1cblxuICAgIC8vIGNoYW5nZSBhbmQgYmx1ciBldmVudHMgYXJlIGFkZGVkIGZyb20gdGhlIHRlbXBsYXRlXG4gICAgcHJvdGVjdGVkIGhhbmRsZUV2ZW50KG5vZGU6IEhUTUxFbGVtZW50LCBldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uLCBsb2NhbHM6IGFueSkge1xuICAgICAgICBpZiAoZXZlbnROYW1lICE9PSAnc3VibWl0Jykge1xuICAgICAgICAgICAgc3VwZXIuaGFuZGxlRXZlbnQodGhpcy5uYXRpdmVFbGVtZW50LCBldmVudE5hbWUsIGNhbGxiYWNrLCBsb2NhbHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVGaWVsZFNvdXJjZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybWRhdGFzb3VyY2UgJiYgdGhpcy5mb3JtZGF0YXNvdXJjZS5leGVjdXRlKERhdGFTb3VyY2UuT3BlcmF0aW9uLklTX0FQSV9BV0FSRSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZvcm1kYXRhc291cmNlICYmICF0aGlzLmZvcm1kYXRhc291cmNlLnR3b1dheUJpbmRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcm1GaWVsZHMuZm9yRWFjaChmb3JtRmllbGQgPT4ge1xuICAgICAgICAgICAgZm9ybUZpZWxkLnNldEZvcm1XaWRnZXQoJ2RhdGF2YWx1ZXNvdXJjZScsIHRoaXMuZm9ybWRhdGFzb3VyY2UpO1xuICAgICAgICAgICAgZm9ybUZpZWxkLnNldEZvcm1XaWRnZXQoJ2JpbmRkYXRhdmFsdWUnLCBgJHt0aGlzLmJpbmRmb3JtZGF0YX0uJHtmb3JtRmllbGQua2V5fWApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIG1ldGhvZCBsb29wcyB0aHJvdWdoIHRoZSBmb3JtIGZpZWxkcyBhbmQgaGlnaGxpZ2h0cyB0aGUgaW52YWxpZCBmaWVsZHMgYnkgc2V0dGluZyBzdGF0ZSB0byB0b3VjaGVkXG4gICAgaGlnaGxpZ2h0SW52YWxpZEZpZWxkcygpIHtcbiAgICAgICAgc2V0VG91Y2hlZFN0YXRlKHRoaXMsIHRoaXMubmdmb3JtLCAnJyk7XG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSB0aGUgZm9ybSBzdWJtaXQgaWYgZm9ybSBpcyBpbiBpbnZhbGlkIHN0YXRlLiBIaWdobGlnaHQgYWxsIHRoZSBpbnZhbGlkIGZpZWxkcyBpZiB2YWxpZGF0aW9uIHR5cGUgaXMgZGVmYXVsdFxuICAgIHZhbGlkYXRlRmllbGRzT25TdWJtaXQoKSB7XG4gICAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbk1zZ3MoKTtcbiAgICAgICAgLy8gRGlzYWJsZSB0aGUgZm9ybSBzdWJtaXQgaWYgZm9ybSBpcyBpbiBpbnZhbGlkIHN0YXRlLiBGb3IgZGVsZXRlIG9wZXJhdGlvbiwgZG8gbm90IGNoZWNrIHRoZSB2YWxpZGF0aW9uLlxuICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25UeXBlICE9PSAnZGVsZXRlJyAmJiAodGhpcy52YWxpZGF0aW9udHlwZSA9PT0gJ2h0bWwnIHx8IHRoaXMudmFsaWRhdGlvbnR5cGUgPT09ICdkZWZhdWx0JylcbiAgICAgICAgICAgICAgICAmJiB0aGlzLm5nZm9ybSAmJiB0aGlzLm5nZm9ybS5pbnZhbGlkKSB7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm5nZm9ybS5pbnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdGlvbnR5cGUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodEludmFsaWRGaWVsZHMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgaW52YWxpZCB1bnRvY2hlZCBlbGVtZW50IGFuZCBzZXQgaXQgdG8gdG91Y2hlZC5cbiAgICAgICAgICAgICAgICAvLyBTYWZhcmkgZG9lcyBub3QgZm9ybSB2YWxpZGF0aW9ucy4gdGhpcyB3aWxsIGVuc3VyZSB0aGF0IGVycm9yIGlzIHNob3duIGZvciB1c2VyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlRm9ybSA9IGZpbmRJbnZhbGlkRWxlbWVudCh0aGlzLiRlbGVtZW50LCB0aGlzLm5nZm9ybSk7XG4gICAgICAgICAgICAgICAgY29uc3QgJGludmFsaWRGb3JtID0gZWxlRm9ybS5uZ0Zvcm07XG4gICAgICAgICAgICAgICAgbGV0ICRpbnZhbGlkRWxlICA9IGVsZUZvcm0uJGVsZTtcbiAgICAgICAgICAgICAgICAkaW52YWxpZEVsZSA9ICRpbnZhbGlkRWxlLnBhcmVudCgpLmZpbmQoJ1tmb2N1cy10YXJnZXRdJyk7XG4gICAgICAgICAgICAgICAgaWYgKCRpbnZhbGlkRWxlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBvbiBzYXZlIGNsaWNrIGluIHBhZ2UgbGF5b3V0IGxpdmVmb3JtLCBmb2N1cyBvZiBhdXRvY29tcGxldGUgd2lkZ2V0IG9wZW5zIGZ1bGwtc2NyZWVuIHNlYXJjaC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEkaW52YWxpZEVsZS5oYXNDbGFzcygnYXBwLXNlYXJjaC1pbnB1dCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkaW52YWxpZEVsZS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5nRWxlID0gJGludmFsaWRGb3JtICYmICRpbnZhbGlkRm9ybS5jb250cm9sc1skaW52YWxpZEVsZS5hdHRyKCdmb3JtQ29udHJvbE5hbWUnKSB8fCAkaW52YWxpZEVsZS5hdHRyKCduYW1lJyldO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmdFbGUgJiYgbmdFbGUubWFya0FzVG91Y2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmdFbGUubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICRhcHBEaWdlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBvblByb3BlcnR5Q2hhbmdlKGtleSwgbnYsIG92Pykge1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnY2FwdGlvbmFsaWduJzpcbiAgICAgICAgICAgICAgICB0aGlzLmNhcHRpb25BbGlnbkNsYXNzID0gJ2FsaWduLScgKyBudjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NhcHRpb25wb3NpdGlvbic6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRMYXlvdXRDb25maWcoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NhcHRpb253aWR0aCc6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRMYXlvdXRDb25maWcoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NhcHRpb25zaXplJzpcbiAgICAgICAgICAgICAgICB0aGlzLmNhcHRpb25zaXplID0gbnY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdub3ZhbGlkYXRlJzpcbiAgICAgICAgICAgICAgICAvLyAgU2V0IHZhbGlkYXRpb24gdHlwZSBiYXNlZCBvbiB0aGUgbm92YWxpZGF0ZSBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIHRoaXMud2lkZ2V0LnZhbGlkYXRpb250eXBlID0gKG52ID09PSB0cnVlIHx8IG52ID09PSAndHJ1ZScpID8gJ25vbmUnIDogJ2RlZmF1bHQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZm9ybWRhdGEnOlxuICAgICAgICAgICAgICAgIC8vIEZvciBsaXZlbGlzdCB3aGVuIG11bHRpc2VsZWN0IGlzIGVuYWJsZWQsIGZvcm1kYXRhIHdpbGwgYmUgYXJyYXkgb2Ygb2JqZWN0cy4gSW4gdGhpcyBjYXNlIGNvbnNpZGVyIHRoZSBsYXN0IG9iamVjdCBhcyBmb3JtZGF0YS5cbiAgICAgICAgICAgICAgICBpZiAoaXNFcXVhbChudiwgb3YpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpc0FycmF5KG52KSA/IHRoaXMuc2V0Rm9ybURhdGEobGFzdChudikpIDogdGhpcy5zZXRGb3JtRGF0YShudik7XG4gICAgICAgICAgICAgICAgLy8gaWYgZGF0YXNldCBvbiB0aGUgZm9ybUZpZWxkcyBhcmUgbm90IHNldCBhcyB0aGUgZGF0YXNvdXJjZUNoYW5nZSBpcyB0cmlnZ2VyZWQgYmVmb3JlIHRoZSBmb3JtRmllbGRzIGFyZSByZWdpc3RlcmVkLlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0RhdGFTb3VyY2VVcGRhdGVkICYmIHRoaXMuZGF0YXNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRGF0YVNvdXJjZUNoYW5nZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RlZmF1bHRtb2RlJzpcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNMYXlvdXREaWFsb2cpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG52ICYmIG52ID09PSAnRWRpdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTW9kZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU1vZGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVXBkYXRlTW9kZSA9IHRoaXMudXBkYXRlTW9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkYXRhc291cmNlJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9uRGF0YVNvdXJjZUNoYW5nZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZm9ybWRhdGFzb3VyY2UnOlxuICAgICAgICAgICAgICAgIHRoaXMub25Gb3JtRGF0YVNvdXJjZUNoYW5nZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWV0YWRhdGEnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGb3JtRmllbGRzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkYXRhc2V0JzpcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtRmllbGRzID0gdGhpcy5nZXRGb3JtRmllbGRzKCk7XG4gICAgICAgICAgICAgICAgZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5aW5nIHRoZSBkYXRhc2V0IGNoYW5nZSB0byB0aGUgZm9ybS1maWVsZCB3aWRnZXQuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQuaXNEYXRhU2V0Qm91bmQgJiYgZ2V0KGZpZWxkLmZvcm1XaWRnZXQsICdkYXRhc2V0JCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5mb3JtV2lkZ2V0LmRhdGFzZXQkLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBzdXBlci5vblByb3BlcnR5Q2hhbmdlKGtleSwgbnYsIG92KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEV2ZW50IGNhbGxiYWNrcyBvbiBzdWNjZXNzL2Vycm9yXG4gICAgb25SZXN1bHRDYihkYXRhLCBzdGF0dXMsIGV2ZW50Pykge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7JGV2ZW50OiBldmVudCwgJGRhdGE6IGRhdGEsICRvcGVyYXRpb246IHRoaXMub3BlcmF0aW9uVHlwZX07XG4gICAgICAgIC8vIHdoZXRoZXIgc2VydmljZSBjYWxsIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBjYWxsIHRoaXMgbWV0aG9kXG4gICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygncmVzdWx0JywgcGFyYW1zKTtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgLy8gaWYgc2VydmljZSBjYWxsIGlzIHN1Y2Nlc3MgY2FsbCB0aGlzIG1ldGhvZFxuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzdWNjZXNzJywgcGFyYW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHNlcnZpY2UgY2FsbCBmYWlscyBjYWxsIHRoaXMgbWV0aG9kXG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2Vycm9yJywgcGFyYW1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERpc3BsYXkgb3IgaGlkZSB0aGUgaW5saW5lIG1lc3NhZ2UvIHRvYXN0ZXJcbiAgICB0b2dnbGVNZXNzYWdlKHNob3c6IGJvb2xlYW4sIG1zZz86IHN0cmluZywgdHlwZT86IHN0cmluZywgaGVhZGVyPzogc3RyaW5nKSB7XG4gICAgICAgIGxldCB0ZW1wbGF0ZTtcbiAgICAgICAgaWYgKHNob3cgJiYgbXNnKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9ICh0eXBlID09PSAnZXJyb3InICYmIHRoaXMuZXJyb3JtZXNzYWdlKSA/IHRoaXMuZXJyb3JtZXNzYWdlIDogbXNnO1xuICAgICAgICAgICAgaWYgKHRoaXMubWVzc2FnZWxheW91dCA9PT0gJ0lubGluZScpIHtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuY2hlY2tBcHBTZXJ2aWNlRXJyb3JNc2codHlwZSkgfHwgdGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlID0geydjYXB0aW9uJzogdGVtcGxhdGUgfHwgJycsIHR5cGU6IHR5cGV9O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1lc3NhZ2VSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlUmVmLnNob3dNZXNzYWdlKHRoaXMuc3RhdHVzTWVzc2FnZS5jYXB0aW9uLCB0aGlzLnN0YXR1c01lc3NhZ2UudHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHdoZW4gbWVzc2FnZSBsYXlvdXQgaXMgaW5saW5lIG9uIHNhdmUsIHNjcm9sbCB0aGUgdmlldyB0byB0b3Agb2YgdGhlIGZvcm0gdG8gc2VlIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvblxuICAgICAgICAgICAgICAgIGlmICghaXNFbGVtZW50SW5WaWV3cG9ydCh0aGlzLiRlbGVtZW50WzBdKSkge1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb0VsZW1lbnQodGhpcy4kZWxlbWVudFswXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcC5ub3RpZnlBcHAodGVtcGxhdGUsIHR5cGUsIGhlYWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UuY2FwdGlvbiA9ICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgaXMgYW4gQXBwLm9uU2VydmljZUVycm9yIGhhbmRsZXIgZm9yIHRoZSBhcHAsIHRoYXQgbWVzc2FnZSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHNlcnZlciByZXR1cm5lZCBlcnJvciBtZXNzYWdlXG4gICAgY2hlY2tBcHBTZXJ2aWNlRXJyb3JNc2codHlwZSkge1xuICAgICAgICBjb25zdCBub3RpZmljYXRpb25BY3Rpb24gPSBnZXQodGhpcy5hcHAsICdBY3Rpb25zLmFwcE5vdGlmaWNhdGlvbicpO1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uQWN0aW9uICYmIHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIHJldHVybiBub3RpZmljYXRpb25BY3Rpb24uZ2V0TWVzc2FnZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBIaWRlIHRoZSBpbmxpbmUgbWVzc2FnZS8gdG9hc3RlclxuICAgIGNsZWFyTWVzc2FnZSgpIHtcbiAgICAgICAgdGhpcy50b2dnbGVNZXNzYWdlKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIGNsYXNzZXMgb24gdGhlIGZvcm0gYmFzZWQgb24gdGhlIGNhcHRpb25wb3NpdGlvbiBhbmQgY2FwdGlvbndpZHRoIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIHNldExheW91dENvbmZpZygpIHtcbiAgICAgICAgbGV0IGxheW91dENvbmZpZztcbiAgICAgICAgbGF5b3V0Q29uZmlnID0gZ2V0RmllbGRMYXlvdXRDb25maWcodGhpcy5jYXB0aW9ud2lkdGgsIHRoaXMuY2FwdGlvbnBvc2l0aW9uLCBnZXQodGhpcy5hcHAuc2VsZWN0ZWRWaWV3UG9ydCwgJ29zJykpO1xuICAgICAgICB0aGlzLl93aWRnZXRDbGFzcyA9IGxheW91dENvbmZpZy53aWRnZXRDbHM7XG4gICAgICAgIHRoaXMuX2NhcHRpb25DbGFzcyA9IGxheW91dENvbmZpZy5jYXB0aW9uQ2xzO1xuXG4gICAgICAgICRhcHBEaWdlc3QoKTtcbiAgICB9XG5cbiAgICByZWdpc3RlckZvcm1XaWRnZXQod2lkZ2V0KSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB3aWRnZXQubmFtZSB8fCB3aWRnZXQua2V5O1xuICAgICAgICB0aGlzLmZvcm1XaWRnZXRzW25hbWVdID0gd2lkZ2V0O1xuICAgIH1cblxuICAgIHJlZ2lzdGVyRm9ybUZpZWxkcyhmb3JtRmllbGQpIHtcbiAgICAgICAgY29uc3QgZmllbGRDb3VudCA9IHRoaXMuZm9ybUZpZWxkcy5wdXNoKGZvcm1GaWVsZCk7XG4gICAgICAgIHRoaXMuZm9ybWZpZWxkc1tmb3JtRmllbGQua2V5XSA9IGZvcm1GaWVsZDtcbiAgICAgICAgdGhpcy5yZWdpc3RlckZvcm1XaWRnZXQoZm9ybUZpZWxkKTtcbiAgICAgICAgdGhpcy5fZGVib3VuY2VkVXBkYXRlRmllbGRTb3VyY2UoKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Rm9ybSkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLmZvcm1GaWVsZHMucHVzaChmb3JtRmllbGQpO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLmZvcm1maWVsZHNbZm9ybUZpZWxkLmtleV0gPSBmb3JtRmllbGQ7XG4gICAgICAgICAgICAvLyBpbm5lciBmb3JtZmllbGRzIGFyZSBwdXNoZWQgdG8gcGFyZW50Rm9ybSwgcGFzc2luZyBjdXJyZW50IGlubmVyRm9ybSdzIGZvcm1kYXRhIHRvIHNldCBpbm5lckZvcm1kYXRhIHRvIHRoZXNlIGlubmVyRm9ybUZpZWxkc1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLnNldEZvcm1EYXRhKHRoaXMucGFyZW50Rm9ybS5mb3JtZGF0YSwgdGhpcy5mb3JtRmllbGRzLCB0aGlzLmZvcm1kYXRhIHx8IHt9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXTVMtMTg5Njc6IEFwcGx5aW5nIGZvcm1hZGF0YSBhZnRlciBmb3JtZmllbGRzIGFyZSByZWFkeVxuICAgICAgICBpZiAoZmllbGRDb3VudCA9PT0gdGhpcy5udW1iZXJPZkZpZWxkcyAmJiAhaXNFbXB0eSh0aGlzLmZvcm1kYXRhKSkge1xuICAgICAgICAgICAgdGhpcy5vbkRhdGFTb3VyY2VDaGFuZ2UoKTtcbiAgICAgICAgICAgIGlzQXJyYXkodGhpcy5mb3JtZGF0YSkgPyB0aGlzLnNldEZvcm1EYXRhKGxhc3QodGhpcy5mb3JtZGF0YSkpIDogdGhpcy5zZXRGb3JtRGF0YSh0aGlzLmZvcm1kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZ2lzdGVyQWN0aW9ucyhmb3JtQWN0aW9uKSB7XG4gICAgICAgIHRoaXMuYnV0dG9uQXJyYXkucHVzaChmb3JtQWN0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGRhdGFvdXRwdXQgd2hlbmV2ZXIgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gaW5zaWRlIGZvcm0gd2lkZ2V0IHZhbHVlXG4gICAgdXBkYXRlRm9ybURhdGFPdXRwdXQoZGF0YU9iamVjdCkge1xuICAgICAgICAvLyBTZXQgdGhlIHZhbHVlcyBvZiB0aGUgd2lkZ2V0cyBpbnNpZGUgdGhlIGxpdmUgZm9ybSAob3RoZXIgdGhhbiBmb3JtIGZpZWxkcykgaW4gZm9ybSBkYXRhXG4gICAgICAgIGZvckVhY2godGhpcy5uZ2Zvcm0udmFsdWUsICh2YWwsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFmaW5kKHRoaXMuZm9ybUZpZWxkcywge2tleX0pKSB7XG4gICAgICAgICAgICAgICAgZGF0YU9iamVjdFtrZXldID0gdmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kYXRhb3V0cHV0ID0gZGF0YU9iamVjdDtcbiAgICB9XG5cbiAgICAvLyBDb25zdHJ1Y3QgdGhlIGRhdGEgb2JqZWN0IG1lcmdpbmcgdGhlIGZvcm0gZmllbGRzIGFuZCBjdXN0b20gd2lkZ2V0cyBkYXRhXG4gICAgY29uc3RydWN0RGF0YU9iamVjdCgpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgICAgID0ge307XG4gICAgICAgIGNvbnN0IGZvcm1GaWVsZHMgPSB0aGlzLmdldEZvcm1GaWVsZHMoKTtcbiAgICAgICAgLy8gR2V0IGFsbCBmb3JtIGZpZWxkcyBhbmQgcHJlcGFyZSBmb3JtIGRhdGEgYXMga2V5IHZhbHVlIHBhaXJzXG4gICAgICAgIGZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBsZXQgZmllbGROYW1lLFxuICAgICAgICAgICAgICAgIGZpZWxkVmFsdWU7XG4gICAgICAgICAgICBmaWVsZFZhbHVlID0gZmllbGQuZGF0YXZhbHVlIHx8IGZpZWxkLl9jb250cm9sLnZhbHVlO1xuICAgICAgICAgICAgZmllbGRWYWx1ZSA9IChmaWVsZFZhbHVlID09PSBudWxsIHx8IGZpZWxkVmFsdWUgPT09ICcnKSA/IHVuZGVmaW5lZCA6IGZpZWxkVmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gZ2V0RmlsZXModGhpcy5uYW1lLCBmaWVsZC5rZXkgKyAnX2Zvcm1XaWRnZXQnLCBmaWVsZC5tdWx0aXBsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZpZWxkTmFtZSA9IGZpZWxkLmtleSB8fCBmaWVsZC50YXJnZXQgfHwgZmllbGQubmFtZTtcblxuICAgICAgICAgICAgLy8gb24gY3VycmVudCBGb3JtLCB3aGVuIGZpZWxkIGlzIGlubmVyRm9ybSBmaWVsZCB0aGVuIHdlIGdyb3VwIHRoZXNlIGZpZWxkcyB1bmRlciBuZXcgb2JqZWN0IHVzaW5nIGZvcm1Hcm91cE5hbWUgYXMga2V5XG4gICAgICAgICAgICAvLyBGb3Igc3VwcG9zZSwgYXBwbGljYW50TmFtZSwgYXBwbGljYW50SUQgYXJlIGZvcm1maWVsZHMgaW4gY3VycmVudEZvcm1cbiAgICAgICAgICAgIC8vIFRoaXMgZm9ybSBpcyBoYXZpbmcgaW5uZXJmb3JtIGkuZS4gYWRkcmVzcywgdGhlc2UgZmllbGRzIGFyZSBsaXN0ZWQgYXNcbiAgICAgICAgICAgIC8vIHtcImFwcGxpY2FudE5hbWVcIjogXCJcIiwgXCJhcHBsaWNhbnRJRFwiOiBcIlwiLCBcImFkZHJlc3NcIjoge1wic3RyZWV0XCI6IFwiXCJ9fVxuICAgICAgICAgICAgaWYgKGZpZWxkLmZvcm0ud2lkZ2V0SWQgIT09IHRoaXMud2lkZ2V0SWQgJiYgZmllbGQuZm9ybS5mb3JtR3JvdXBOYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmQgPSBnZXQoZm9ybURhdGEsIGZpZWxkLmZvcm0uZm9ybUdyb3VwTmFtZSwge30pO1xuICAgICAgICAgICAgICAgIGZkW2ZpZWxkTmFtZV0gPSBmaWVsZFZhbHVlO1xuICAgICAgICAgICAgICAgIHNldChmb3JtRGF0YSwgZmllbGQuZm9ybS5mb3JtR3JvdXBOYW1lLCBmZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCh0eXBlb2YgZmllbGQuZm9ybS5mb3JtQXJyYXlJbmRleCA9PT0gJ251bWJlcicpICYmIGZpZWxkLmZvcm0uaXNQYXJlbnRMaXN0ICYmICF0aGlzLnBhcmVudEZvcm0pIHsgLy8gRml4IGZvciBbV01TLTI1ODA2XTogdXNlIGZvcm1BcnJheUluZGV4IG9ubHkgaWYgZm9ybSBoYXMgYSBwYXJlbnQgZm9ybVxuICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgZm9ybWRhdGEgYmFzZWQgb24gZm9ybUFycmF5SW5kZXhcbiAgICAgICAgICAgICAgICBjb25zdCBmZCA9IGdldChmb3JtRGF0YSwgZmllbGQuZm9ybS5wYXJlbnRMaXN0Lm5hbWUsIFtdKTtcbiAgICAgICAgICAgICAgICBmZFtmaWVsZC5mb3JtLmZvcm1BcnJheUluZGV4XSA9IGZkW2ZpZWxkLmZvcm0uZm9ybUFycmF5SW5kZXhdIHx8IHt9O1xuICAgICAgICAgICAgICAgIGZkW2ZpZWxkLmZvcm0uZm9ybUFycmF5SW5kZXhdW2ZpZWxkTmFtZV0gPSBmaWVsZFZhbHVlO1xuICAgICAgICAgICAgICAgIHNldChmb3JtRGF0YSwgZmllbGQuZm9ybS5wYXJlbnRMaXN0Lm5hbWUsIGZkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiB1cGRhdGUgdGhlIGZpZWxkIHdpbGwgYmUgYWxyZWFkeSBwcmVzZW50IGluIGZvcm0gZGF0YVxuICAgICAgICAgICAgICAgIHNldChmb3JtRGF0YSwgZmllbGROYW1lLCBmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9ybURhdGFPdXRwdXQoZm9ybURhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhb3V0cHV0O1xuICAgIH1cblxuICAgIHVwZGF0ZURhdGFPdXRwdXQoKSB7XG4gICAgICAgIHRoaXMuY29uc3RydWN0RGF0YU9iamVjdCgpO1xuICAgICAgICBpZiAodGhpcy5uZ2Zvcm0udG91Y2hlZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uTXNncyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvcm1GaWVsZHMgd2lsbCBjb250YWluIGFsbCB0aGUgZmllbGRzIGluIHBhcmVudCBhbmQgaW5uZXIgZm9ybSBhbHNvLlxuICAgIC8vIFRoaXMgcmV0dXJucyB0aGUgZm9ybUZpZWxkcyBpbiB0aGUgZm9ybSBiYXNlZCBvbiB0aGUgZm9ybSBuYW1lLlxuICAgIGdldEZvcm1GaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXIodGhpcy5mb3JtRmllbGRzLCBmb3JtRmllbGQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1GaWVsZC5mb3JtLm5hbWUgPT09IHRoaXMubmFtZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0RmllbGRWYWx1ZShmaWVsZCwgZGF0YSwgaW5uZXJGb3JtZGF0YT8pIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZmllbGQua2V5IHx8IGZpZWxkLm5hbWU7XG4gICAgICAgIC8vIGlmIGN1c3RvbWZpZWxkIHBhcmFtIHZhbHVlIGlzIG5vdCBpbiB0aGUgZm9ybWRhdGEgdGhlbiBkbyBub3QgYXNzaWduIGZpZWxkIHZhbHVlXG4gICAgICAgIC8vIGFzIGl0IGNhbiBjb250YWluIGRlZmF1bHQgdmFsdWUgd2hpY2ggd2lsbCBhZ2FpbiBiZSBvdmVycmlkZGVuIGJ5IHVuZGVmaW5lZC5cbiAgICAgICAgY29uc3QgZmQgPSBpbm5lckZvcm1kYXRhID8gaW5uZXJGb3JtZGF0YSA6IGRhdGE7XG4gICAgICAgIGlmIChmZCkge1xuICAgICAgICAgICAgaWYgKGZkLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGdldChmZCwga2V5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5jbHVkZXMoa2V5LCAnLicpKSB7XG4gICAgICAgICAgICAgICAgLy8ga2V5IGNvbnRhaW5zICcuJyB3aGVuIG1hcHBpbmcgdGhlIGZpZWxkcyB0byBjaGlsZCByZWZlcmVuY2UgaS5lLiBjaGlsZENvbCBpcyBoYXZpbmcga2V5IGFzIFwicGFyZW50LmNoaWxkQ29sXCJcbiAgICAgICAgICAgICAgICBpZiAoZmQuaGFzT3duUHJvcGVydHkoc3BsaXQoa2V5LCAnLicpWzBdKSkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGdldChmZCwga2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXTVMtMTg5MDY6IEZvciBkZWZhdWx0IHZhbHVlLCBkbyBub3QgbWFyayB0aGUgZm9ybSBhcyBkaXJ0eS5cbiAgICAgICAgICAgIGlmICh0aGlzLmRpcnR5ICYmICF0aGlzLl90cmlnZ2VyZWRCeVVzZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9ybUdyb3VwTmFtZSA9IGZpZWxkLmZvcm0uZm9ybUdyb3VwTmFtZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGlmIGZvcm1Hcm91cE5hbWUgaXMgZGVmaW5lZCB3aGljaCBtZWFucyBmaWVsZCBpcyBpbnNpZGUgdGhlIGlubmVyIGZvcm1cbiAgICAgICAgICogdGhlbiBzZXQgdGhlIGZvcm1kYXRhIG9uIHRoZSBmaWVsZCdzIGZvcm0gdXNpbmcgZm9ybUdyb3VwTmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGZvcm1Hcm91cE5hbWUgJiYgZ2V0KGRhdGEsIGZvcm1Hcm91cE5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhLmNhbGwoZmllbGQuZm9ybSwgZGF0YVtmb3JtR3JvdXBOYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgZm9ybWRhdGEgaXMgYXNzaWduZWQgbGF0ZXIgdGhlbiBvbiBwcm9wZXJ0eUNoYW5nZUhhbmRsZXIsIGV2ZW4gaW5uZXIgZm9ybXMgZGF0YSBhbHNvIG5lZWRzIHRvIGJlIHVwZGF0ZWQuXG4gICAgICAgIGlmIChnZXQoZmllbGQuZm9ybSwgJ3BhcmVudEZvcm1BcnJheScpKSB7XG4gICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhRnJvbVBhcmVudEZvcm1EYXRhLmNhbGwoZmllbGQuZm9ybSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRGb3JtRGF0YShkYXRhLCBpbm5lckZvcm1GaWVsZHM/LCBpbm5lckZvcm1kYXRhPykge1xuICAgICAgICAvLyB3aGVyZWFzIGZvcm1GaWVsZHMgZXhwbGljaXRseSBwYXNzZWQgY2FuIGNvbnRhaW4gaW5uZXJmb3JtIGZpZWxkcyBhbHNvLlxuICAgICAgICBjb25zdCBmb3JtRmllbGRzID0gaW5uZXJGb3JtRmllbGRzIHx8IHRoaXMuZm9ybUZpZWxkcztcbiAgICAgICAgZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0RmllbGRWYWx1ZShmaWVsZCwgZGF0YSwgaW5uZXJGb3JtZGF0YSk7XG4gICAgICAgICAgICBpZiAoZmllbGQuZmllbGRWYWxpZGF0aW9ucykge1xuICAgICAgICAgICAgICAgIGZpZWxkLmZpZWxkVmFsaWRhdGlvbnMuc2V0Q3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uc3RydWN0RGF0YU9iamVjdCgpO1xuICAgIH1cblxuICAgIHJlc2V0Rm9ybVN0YXRlKCkge1xuICAgICAgICAvLyBjbGVhcmluZyB0aGUgdmFsaWRhdGlvbk1lc3NhZ2VzIG9uIHJlc2V0LlxuICAgICAgICBpZiAodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5uZ2Zvcm0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5uZ2Zvcm0ubWFya0FzUHJpc3RpbmUoKTtcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICB0aGlzLmZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBmaWVsZC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgaWYgKGZpZWxkLndpZGdldHR5cGUgPT09ICd1cGxvYWQnIHx8IGZpZWxkLnR5cGUgPT09IERhdGFUeXBlLkJMT0IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmlsZVVwbG9hZFdpZGdldChmaWVsZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk/LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdERhdGFPYmplY3QoKTtcbiAgICAgICAgdGhpcy5jbGVhck1lc3NhZ2UoKTtcbiAgICB9XG5cbiAgICBzYXZlUHJldmZvcm1GaWVsZHMoKSB7XG4gICAgICAgIHRoaXMucHJldmZvcm1GaWVsZHMgPSBnZXRDbG9uZWRPYmplY3QodGhpcy5mb3JtRmllbGRzLm1hcChmaWVsZCA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICdrZXknOiBmaWVsZC5rZXksXG4gICAgICAgICAgICAgICAgJ3R5cGUnOiBmaWVsZC50eXBlLFxuICAgICAgICAgICAgICAgICd3aWRnZXR0eXBlJzogZmllbGQud2lkZ2V0dHlwZSxcbiAgICAgICAgICAgICAgICAnb3V0cHV0Zm9ybWF0JzogZmllbGQub3V0cHV0Zm9ybWF0LFxuICAgICAgICAgICAgICAgICd2YWx1ZSc6IGZpZWxkLnZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2F2ZVByZXZEYXRhVmFsdWVzKCkge1xuICAgICAgICB0aGlzLnByZXZEYXRhVmFsdWVzID0gdGhpcy5mb3JtRmllbGRzLm1hcCgob2JqKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geydrZXknOiBvYmoua2V5LCAndmFsdWUnOiBvYmoudmFsdWV9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRSZWFkb25seUZpZWxkcygpIHtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgZmllbGQuc2V0UmVhZE9ubHlTdGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXNldEZpbGVVcGxvYWRXaWRnZXQoZmllbGQsIHNraXBWYWx1ZVNldD8pIHtcbiAgICAgICAgY29uc3QgJGZvcm1FbGUgPSB0aGlzLiRlbGVtZW50O1xuICAgICAgICAkZm9ybUVsZS5maW5kKCdbbmFtZT1cIicgKyBmaWVsZC5rZXkgKyAnX2Zvcm1XaWRnZXRcIl0nKS52YWwoJycpO1xuICAgICAgICBmaWVsZC5fY29udHJvbC5yZXNldCgpO1xuICAgICAgICBpZiAoIXNraXBWYWx1ZVNldCkge1xuICAgICAgICAgICAgZmllbGQuaHJlZiA9ICcnO1xuICAgICAgICAgICAgZmllbGQudmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW1wdHlEYXRhTW9kZWwoKSB7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09IERhdGFUeXBlLkJMT0IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldEZpbGVVcGxvYWRXaWRnZXQoZmllbGQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmRhdGF2YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0RGVmYXVsdFZhbHVlcygpIHtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkZpZWxkRGVmYXVsdFZhbHVlQ2hhbmdlKGZpZWxkLCBmaWVsZC5kZWZhdWx0dmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRPcGVyYXRpb25UeXBlKG1vZGUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25UeXBlID0gbW9kZSB8fCAnaW5zZXJ0JztcbiAgICB9XG5cbiAgICBuZXcoKSB7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtU3RhdGUoKTtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25UeXBlID0gTGl2ZV9PcGVyYXRpb25zLklOU0VSVDtcbiAgICAgICAgdGhpcy5jbGVhck1lc3NhZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5zYXZlUHJldmZvcm1GaWVsZHMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtcHR5RGF0YU1vZGVsKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0VmFsdWVzKCk7XG4gICAgICAgICAgICB0aGlzLnNhdmVQcmV2RGF0YVZhbHVlcygpO1xuICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3REYXRhT2JqZWN0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzVXBkYXRlTW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgZWRpdCgpIHtcbiAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICB0aGlzLmNsZWFyTWVzc2FnZSgpO1xuXG4gICAgICAgIHRoaXMub3BlcmF0aW9uVHlwZSA9IExpdmVfT3BlcmF0aW9ucy5VUERBVEU7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5zYXZlUHJldmZvcm1GaWVsZHMoKTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZVByZXZEYXRhVmFsdWVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV2RGF0YU9iamVjdCA9IGdldENsb25lZE9iamVjdCh0aGlzLmZvcm1kYXRhIHx8IHt9KTtcblxuICAgICAgICB0aGlzLnNldFJlYWRvbmx5RmllbGRzKCk7XG4gICAgICAgIHRoaXMuaXNVcGRhdGVNb2RlID0gdHJ1ZTtcblxuICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmlnZ2VyV01FdmVudChldmVudE5hbWUpIHtcbiAgICAgICAgY29uc3QgdGFibGVJZCA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RlcGVuZHNvbnRhYmxlJyk7XG4gICAgICAgIGlmICghdGFibGVJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgICRpbnZva2VXYXRjaGVycyh0cnVlKTtcbiAgICAgICAgdGhpcy5hcHAubm90aWZ5KCd3bS1ldmVudCcsIHtldmVudE5hbWUsIHdpZGdldE5hbWU6IHRhYmxlSWR9KTtcbiAgICB9XG5cbiAgICBzdWJtaXRGb3JtKCRldmVudCkge1xuICAgICAgICBsZXQgdGVtcGxhdGUsIGZvcm1EYXRhLCByZXN1bHQ7XG4gICAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSB0aGlzLmRhdGFzb3VyY2U7XG4gICAgICAgIC8vIERpc2FibGUgdGhlIGZvcm0gc3VibWl0IGlmIGZvcm0gaXMgaW4gaW52YWxpZCBzdGF0ZS5cbiAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVGaWVsZHNPblN1Ym1pdCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtRGF0YSA9IGdldENsb25lZE9iamVjdCh0aGlzLmNvbnN0cnVjdERhdGFPYmplY3QoKSk7XG5cbiAgICAgICAgY29uc3QgZ2V0UGFyYW1zID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHskZXZlbnQsICRmb3JtRGF0YTogZm9ybURhdGEsICRkYXRhOiBmb3JtRGF0YX07XG4gICAgICAgIH07XG5cblxuICAgICAgICBpZiAodGhpcy5vbkJlZm9yZVN1Ym1pdEV2dCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnYmVmb3Jlc3VibWl0JywgZ2V0UGFyYW1zKCkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub25TdWJtaXRFdnQgfHwgZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgLy8gSWYgb24gc3VibWl0IGlzIHRoZXJlIGV4ZWN1dGUgaXQgYW5kIGlmIGl0IHJldHVybnMgdHJ1ZSBkbyBzZXJ2aWNlIHZhcmlhYmxlIGludm9rZSBlbHNlIHJldHVyblxuICAgICAgICAgICAgLy8gSWYgaXRzIGEgc2VydmljZSB2YXJpYWJsZSBjYWxsIHNldElucHV0IGFuZCBhc3NpZ24gZm9ybSBkYXRhIGFuZCBpbnZva2UgdGhlIHNlcnZpY2VcbiAgICAgICAgICAgIGlmIChkYXRhU291cmNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhZ2VOdW0gPSBkYXRhU291cmNlLnBhZ2luYXRpb24gJiYgZGF0YVNvdXJjZS5wYWdpbmF0aW9uLm51bWJlciArIDE7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uVHlwZSA9IHRoaXMub3BlcmF0aW9uVHlwZSA/IHRoaXMub3BlcmF0aW9uVHlwZSA6ICdpbnNlcnQnO1xuICAgICAgICAgICAgICAgIHBlcmZvcm1EYXRhT3BlcmF0aW9uKGRhdGFTb3VyY2UsIGZvcm1EYXRhLCB7b3BlcmF0aW9uVHlwZTogb3BlcmF0aW9uVHlwZX0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZS5jYXRlZ29yeSA9PT0gJ3dtLkNydWRWYXJpYWJsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJXTUV2ZW50KCdyZXNldEVkaXRNb2RlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc291cmNlLmV4ZWN1dGUoRGF0YVNvdXJjZS5PcGVyYXRpb24uTElTVF9SRUNPUkRTLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdza2lwVG9nZ2xlU3RhdGUnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3BlcmF0aW9uJzogJ2xpc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFnZSc6IGN1cnJlbnRQYWdlTnVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJldmVudE1pc3NpbmdPcE1zZyc6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kaWFsb2dJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGVmaW5lZChkYXRhLmJvZHkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0VmFsaWRKU09OKGRhdGEuYm9keSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNEZWZpbmVkKHJlc3VsdCkgPyByZXN1bHQgOiBkYXRhLmJvZHk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXN1bHQnOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cyc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnOiB0aGlzLnBvc3RtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3N1Y2Nlc3MnXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5lcnJvcm1lc3NhZ2UgfHwgZXJyb3IuZXJyb3IgfHwgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXN1bHQnOiBnZXQoZXJyb3IsICdlcnJvcicpIHx8IGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0dXMnOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZSc6IHRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2Vycm9yJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocmVzcG9uc2UudHlwZSA9PT0gJ2Vycm9yJyAmJiAhdGhpcy5vbkVycm9yKSB8fCAocmVzcG9uc2UudHlwZSA9PT0gJ3N1Y2Nlc3MnICYmICF0aGlzLm9uU3VjY2VzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTWVzc2FnZSh0cnVlLCByZXNwb25zZS5tZXNzYWdlLCByZXNwb25zZS50eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3N1Ym1pdCcsIGdldFBhcmFtcygpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblJlc3VsdENiKHJlc3BvbnNlLnJlc3VsdCwgcmVzcG9uc2Uuc3RhdHVzLCAkZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3N1Ym1pdCcsIGdldFBhcmFtcygpKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUmVzdWx0Q2Ioe30sIHRydWUsICRldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uUmVzdWx0Q2Ioe30sIHRydWUsICRldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbG9zZURpYWxvZygpIHtcbiAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmNsb3NlKHRoaXMuZGlhbG9nSWQpO1xuICAgIH1cblxuICAgIC8vIE1ldGhvZCB0byBzaG93L2hpZGUgdGhlIHBhbmVsIGhlYWRlciBvciBmb290ZXIgYmFzZWQgb24gdGhlIGJ1dHRvbnNcbiAgICBzaG93QnV0dG9ucyhwb3NpdGlvbikge1xuICAgICAgICByZXR1cm4gc29tZSh0aGlzLmJ1dHRvbkFycmF5LCBidG4gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGluY2x1ZGVzKGJ0bi5wb3NpdGlvbiwgcG9zaXRpb24pICYmIGJ0bi51cGRhdGVNb2RlID09PSB0aGlzLmlzVXBkYXRlTW9kZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBwYW5lbFxuICAgIGV4cGFuZENvbGxhcHNlUGFuZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbGxhcHNpYmxlKSB7XG4gICAgICAgICAgICAvLyBmbGlwIHRoZSBhY3RpdmUgZmxhZ1xuICAgICAgICAgICAgdGhpcy5leHBhbmRlZCA9ICF0aGlzLmV4cGFuZGVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25EYXRhU291cmNlVXBkYXRlKHJlc3BvbnNlLCBuZXdGb3JtLCB1cGRhdGVNb2RlKSB7XG4gICAgICAgIGlmIChuZXdGb3JtKSB7XG4gICAgICAgICAgICB0aGlzLm5ldygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YShyZXNwb25zZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1VwZGF0ZU1vZGUgPSBpc0RlZmluZWQodXBkYXRlTW9kZSkgPyB1cGRhdGVNb2RlIDogdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCB0cmFudmVyc2VzIHRocm91Z2ggdGhlIHBhcmVudCBjb250YWluaW5nIGZvcm1kYXRhIGFuZCByZXR1cm5zIHRoZSBwYXJlbnQgZm9ybWRhdGEuXG4gICAgICogQHBhcmFtIGZvcm0sIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgZm9ybSBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgZ2V0TmVhcmVzdFBhcmVudEZvcm1EYXRhKGZvcm0pIHtcbiAgICAgICAgaWYgKCFmb3JtLnBhcmVudEZvcm0pIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZvcm0uYmluZGZvcm1kYXRhICYmIGdldChmb3JtLnBhcmVudEZvcm0sICdmb3JtZGF0YScpICYmICFpc0VtcHR5KGZvcm0ucGFyZW50Rm9ybS5mb3JtZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtLnBhcmVudEZvcm0uZm9ybWRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmVhcmVzdFBhcmVudEZvcm1EYXRhKGZvcm0ucGFyZW50Rm9ybSk7XG4gICAgfVxuXG4gICAgc2V0Rm9ybURhdGFGcm9tUGFyZW50Rm9ybURhdGEoZm9ybWRhdGE6IGFueSkge1xuICAgICAgICBpZiAoaXNFbXB0eSh0aGlzLmZvcm1kYXRhKSAmJiB0aGlzLnBhcmVudEZvcm0gJiYgZm9ybWRhdGEpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSWYgZm9ybSBpcyBpbnNpZGUgbGlzdCxcbiAgICAgICAgICAgICAqIDEuIGRpcmVjdGx5IGFwcGx5aW5nIHRoZSBmb3JtZGF0YSB0byB0aGUgZm9ybUFycmF5IHRvIHVwZGF0ZSB0aGUgZm9ybWRhdGEgb24gbGlzdCBvZiBmb3JtcyB1c2luZyBwYXRjaFZhbHVlLlxuICAgICAgICAgICAgICogMi4gYW5kIGFsc28gc2V0dGluZyBpbmRpdmlkdWFsIGZvcm1kYXRhIHRvIHRoZSBmb3JtIGluc2lkZSBlYWNoIGl0ZW0gYmFzZWQgb24gZm9ybUFycmF5SW5kZXgsIHdoZW4gZm9ybSBpcyBub3QgYm91bmQgdG8gZm9ybWRhdGEuXG4gICAgICAgICAgICAgKiAzLiBleHBsaWNpdGx5IGludm9raW5nIGZvcm1kYXRhIGFzIGZvcm1GaWVsZHMgd2lsbCBjb250YWluIGFsbCB0aGUgZm9ybWZpZWxkcyBpbmNsdWRpbmcgaW5uZXJGb3JtJ3MgZmllbGRzXG4gICAgICAgICAgICAgKiAoaWYgd2UgZG8gbm90IGludm9rZSBleHBsaWNpdGx5IHRoZW4gZm9ybUZpZWxkcyB3aWxsIGp1c3QgY29udGFpbiB0aGUgZmllbGRzIGluc2lkZSBjdXJyZW50IGZvcm0gYW5kIG5vdCBpbm5lciBmb3JtIGZpZWxkcylcbiAgICAgICAgICAgICAqIDQuIGlmIGNoaWxkRm9ybUFycmF5RGF0YSBpcyBub3QgYXZhaWxhYmxlIHdlIHdpbGwgY2hlY2sgZm9yIGlubmVyIGZvcm0gZGF0YSB1c2luZyBcImZvcm1Hcm91cE5hbWVcIiBhbmQgd2lsbCBzZXQgdGhlIGlubmVyZm9ybSBkYXRhXG4gICAgICAgICAgICAgKiBJZiBub3QgaW5zaWRlIGxpc3QsIGp1c3Qgc2V0IHRoZSBmb3JtZGF0YSBvbiBhbGwgdGhlIGZvcm1maWVsZHMgaW5jbHVkaW5nIGlubmVyRm9ybSBmaWVsZHNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Rm9ybUFycmF5KSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkRm9ybUFycmF5RGF0YSA9IGdldChmb3JtZGF0YSwgdGhpcy5wYXJlbnRMaXN0Lm5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZEZvcm1BcnJheURhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0FycmF5KGNoaWxkRm9ybUFycmF5RGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRm9ybUFycmF5RGF0YSA9IFtjaGlsZEZvcm1BcnJheURhdGFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybUFycmF5LnBhdGNoVmFsdWUoY2hpbGRGb3JtQXJyYXlEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmJpbmRmb3JtZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtZGF0YSA9IGNoaWxkRm9ybUFycmF5RGF0YVt0aGlzLmZvcm1BcnJheUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhKHRoaXMuZm9ybWRhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1BhcmVudExpc3QgJiYgdGhpcy5wYXJlbnRGb3JtLmZvcm1Hcm91cE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Rm9ybURhdGEgPSBnZXQoZm9ybWRhdGEsIHRoaXMucGFyZW50Rm9ybS5mb3JtR3JvdXBOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YUZyb21QYXJlbnRGb3JtRGF0YShwYXJlbnRGb3JtRGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhKGZvcm1kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9uIGZvcm0gZGF0YSBzb3VyY2UgY2hhbmdlLiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGxpdmUgZm9ybSBhbmQgbGl2ZSBmaWx0ZXJcbiAgICBvbkRhdGFTb3VyY2VDaGFuZ2UoKSB7XG4gICAgICAgIGlmIChnZXQodGhpcy5mb3JtRmllbGRzLCAnbGVuZ3RoJykgJiYgIXRoaXMuYmluZGZvcm1kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmlzRGF0YVNvdXJjZVVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBmb3JtZGF0YSBvbiB0aGUgcGFyZW50IGZvcm0gd2lsbCBiZSBzZXQgYmVmb3JlIHRoZSBpbm5lciBmb3JtcyBhcmUgcmVuZGVyZWQuXG4gICAgICAgICAgICAgKiBIZW5jZSBoYW5kbGluZyBmb3JtZGF0YSBvbiB0aGUgaW5uZXJGb3Jtcywgd2hpY2ggbWlnaHQgYmUgcmVuZGVyZWQgc2xvd2x5IChzdXBwb3NlIHByZWZhYiB3aXRoIGZvcm0pXG4gICAgICAgICAgICAgKiBzZXR0aW5nIGlubmVyIGZvcm0ncyBmb3JtZGF0YSBvYnRhaW5lZCBmcm9tIHBhcmVudCBmb3JtZGF0YVxuICAgICAgICAgICAgICogdGhpcyBhcHBsaWVzIG9ubHkgd2hlbiBmb3JtZGF0YSBpcyBub3QgZ2l2ZW4gb24gdGhlIGlubmVyIGZvcm0uXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGZvcm1kYXRhID0gdGhpcy5nZXROZWFyZXN0UGFyZW50Rm9ybURhdGEodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhRnJvbVBhcmVudEZvcm1EYXRhKGZvcm1kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9uIGZvcm0gZGF0YSBzb3VyY2UgY2hhbmdlLiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGxpdmUgZm9ybSBhbmQgbGl2ZSBmaWx0ZXJcbiAgICBvbkZvcm1EYXRhU291cmNlQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUZpZWxkU291cmNlKCk7XG4gICAgfVxuXG4gICAgLy8gT24gZm9ybSBmaWVsZCBkZWZhdWx0IHZhbHVlIGNoYW5nZS4gVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBsaXZlIGZvcm0gYW5kIGxpdmUgZmlsdGVyXG4gICAgb25GaWVsZERlZmF1bHRWYWx1ZUNoYW5nZShmaWVsZCwgbnYpIHtcbiAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZVZhbHVlQnlUeXBlKG52LCB1bmRlZmluZWQsIGZpZWxkLndpZGdldHR5cGUsIGZpZWxkLnRyYWlsaW5nemVybyk7XG4gICAgICAgIC8vIFdNUy0yMjQzNDogRm9yIGRlZmF1bHQgdmFsdWUgc2V0IG9uIGluZGl2aWR1YWwgZm9ybSBmaWVsZHMsIGRvIG5vdCBtYXJrIHRoZSBmb3JtIGFzIGRpcnR5LlxuICAgICAgICBpZiAodGhpcy5kaXJ0eSAmJiAhdGhpcy5fdHJpZ2dlcmVkQnlVc2VyKSB7XG4gICAgICAgICAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPbiBmb3JtIGZpZWxkIHZhbHVlIGNoYW5nZS4gVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBsaXZlIGZvcm0gYW5kIGxpdmUgZmlsdGVyXG4gICAgb25GaWVsZFZhbHVlQ2hhbmdlKCkge1xuICAgIH1cblxuICAgIC8vIEZ1bmN0aW9uIHRvIGdlbmVyYXRlIGFuZCBjb21waWxlIHRoZSBmb3JtIGZpZWxkcyBmcm9tIHRoZSBtZXRhZGF0YVxuICAgIGFzeW5jIGdlbmVyYXRlRm9ybUZpZWxkcygpIHtcbiAgICAgICAgbGV0IG5vT2ZDb2x1bW5zO1xuICAgICAgICBsZXQgJGdyaWRMYXlvdXQ7XG4gICAgICAgIC8vIENoZWNrIGlmIGdyaWQgbGF5b3V0IGlzIHByZXNlbnQgb3Igbm90IGZvciBmaXJzdCB0aW1lXG4gICAgICAgIGlmIChpc1VuZGVmaW5lZCh0aGlzLl9pc0dyaWRMYXlvdXRQcmVzZW50KSkge1xuICAgICAgICAgICAgdGhpcy5faXNHcmlkTGF5b3V0UHJlc2VudCA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLnBhbmVsLWJvZHkgW3dtbGF5b3V0Z3JpZF0nKS5sZW5ndGggPiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pc0dyaWRMYXlvdXRQcmVzZW50KSB7XG4gICAgICAgICAgICAkZ3JpZExheW91dCA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLmZvcm0tZWxlbWVudHMgW3dtbGF5b3V0Z3JpZF0nKS5maXJzdCgpO1xuICAgICAgICAgICAgbm9PZkNvbHVtbnMgPSBOdW1iZXIoJGdyaWRMYXlvdXQuYXR0cignY29sdW1ucycpKSB8fCAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJGdyaWRMYXlvdXQgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5mb3JtLWVsZW1lbnRzIC5keW5hbWljLWZvcm0tY29udGFpbmVyJyk7XG4gICAgICAgICAgICBpZiAoISRncmlkTGF5b3V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuZmluZCgnLmZvcm0tZWxlbWVudHMnKS5wcmVwZW5kKCc8ZGl2IGNsYXNzPVwiZHluYW1pYy1mb3JtLWNvbnRhaW5lclwiPjwvZGl2PicpO1xuICAgICAgICAgICAgICAgICRncmlkTGF5b3V0ID0gdGhpcy4kZWxlbWVudC5maW5kKCcuZm9ybS1lbGVtZW50cyAuZHluYW1pYy1mb3JtLWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9PZkNvbHVtbnMgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gMTIgLyBub09mQ29sdW1ucztcbiAgICAgICAgbGV0IGZpZWxkVGVtcGxhdGUgPSAnJztcbiAgICAgICAgbGV0IGNvbENvdW50ID0gMDtcbiAgICAgICAgbGV0IGluZGV4O1xuICAgICAgICBsZXQgdXNlckZpZWxkcztcbiAgICAgICAgbGV0IGZpZWxkcyA9IHRoaXMubWV0YWRhdGEgPyB0aGlzLm1ldGFkYXRhLmRhdGEgfHwgdGhpcy5tZXRhZGF0YSA6IFtdO1xuXG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IFtdOyAvLyBlbXB0eSB0aGUgZm9ybSBmaWVsZHNcblxuICAgICAgICBpZiAoaXNFbXB0eShmaWVsZHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vbkJlZm9yZVJlbmRlckV2dCkge1xuICAgICAgICAgICAgdXNlckZpZWxkcyA9IHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnYmVmb3JlcmVuZGVyJywgeyRtZXRhZGF0YTogZmllbGRzfSk7XG4gICAgICAgICAgICBpZiAodXNlckZpZWxkcykge1xuICAgICAgICAgICAgICAgIGZpZWxkcyA9IHVzZXJGaWVsZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzQXJyYXkoZmllbGRzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKGZpZWxkc1tjb2xDb3VudF0pIHtcbiAgICAgICAgICAgIGxldCBjb2xUbXBsID0gJyc7XG4gICAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBub09mQ29sdW1uczsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZHNbY29sQ291bnRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbFRtcGwgKz0gc2V0TWFya3VwRm9yRm9ybUZpZWxkKGZpZWxkc1tjb2xDb3VudF0sIGNvbHVtbldpZHRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sQ291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkVGVtcGxhdGUgKz0gYDx3bS1ncmlkcm93PiR7Y29sVG1wbH08L3dtLWdyaWRyb3c+YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5faXNHcmlkTGF5b3V0UHJlc2VudCkge1xuICAgICAgICAgICAgZmllbGRUZW1wbGF0ZSA9IGA8d20tbGF5b3V0Z3JpZD4ke2ZpZWxkVGVtcGxhdGV9PC93bS1sYXlvdXRncmlkPmA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmR5bmFtaWNGb3JtUmVmLmNsZWFyKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9keW5hbWljQ29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5fZHluYW1pY0NvbnRleHQgPSBPYmplY3QuY3JlYXRlKHRoaXMudmlld1BhcmVudCk7XG4gICAgICAgICAgICB0aGlzLl9keW5hbWljQ29udGV4dC5mb3JtID0gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5UmVmID0gYXdhaXQgdGhpcy5keW5hbWljQ29tcG9uZW50UHJvdmlkZXIuZ2V0Q29tcG9uZW50RmFjdG9yeVJlZihcbiAgICAgICAgICAgICdhcHAtZm9ybS1keW5hbWljLScgKyB0aGlzLndpZGdldElkLFxuICAgICAgICAgICAgZmllbGRUZW1wbGF0ZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBub0NhY2hlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRyYW5zcGlsZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuZHluYW1pY0Zvcm1SZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudEZhY3RvcnlSZWYsIDAsIHRoaXMuaW5qKTtcbiAgICAgICAgZXh0ZW5kUHJvdG8oY29tcG9uZW50Lmluc3RhbmNlLCB0aGlzLl9keW5hbWljQ29udGV4dCk7XG4gICAgICAgICRncmlkTGF5b3V0WzBdLmFwcGVuZENoaWxkKGNvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXRGb3JtRGF0YSh0aGlzLmZvcm1kYXRhKTtcbiAgICB9XG5cbiAgICBnZXQgbW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uVHlwZSB8fCB0aGlzLmZpbmRPcGVyYXRpb25UeXBlKCk7XG4gICAgfVxuXG4gICAgZ2V0IGRpcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0uZGlydHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgZm9ybSBzdGF0ZSB0byBwcmlzdGluZSBieSBpbnRlcm5hbGx5IGNhbGxpbmcgYW5ndWxhciBtYXJrQXNQcmlzdGluZSBtZXRob2Qgb24gdGhlIGZvcm1cbiAgICAgKiBAcGFyYW0gdmFsdWUsIFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbWFya0FzUHJpc3RpbmUodmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNQcmlzdGluZSh7IG9ubHlTZWxmOiB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBmb3JtIHN0YXRlIHRvIGRpcnR5IGJ5IGludGVybmFsbHkgY2FsbGluZyBhbmd1bGFyIG1hcmtBc0RpcnR5IG1ldGhvZCBvbiB0aGUgZm9ybVxuICAgICAqIEBwYXJhbSB2YWx1ZSwgV2hlbiB0cnVlLCBtYXJrIG9ubHkgdGhpcyBjb250cm9sLiBXaGVuIGZhbHNlIG9yIG5vdCBzdXBwbGllZCwgbWFya3MgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2VcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBtYXJrQXNEaXJ0eSh2YWx1ZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubmdmb3JtLm1hcmtBc0RpcnR5KHsgb25seVNlbGY6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIGdldCBpbnZhbGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0uaW52YWxpZDtcbiAgICB9XG5cbiAgICBnZXQgdG91Y2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmdmb3JtICYmIHRoaXMubmdmb3JtLnRvdWNoZWQ7XG4gICAgfVxuXG4gICAgZ2V0IHZhbGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0udmFsaWQ7XG4gICAgfVxuXG4gICAgZ2V0IHByaXN0aW5lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0ucHJpc3RpbmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgZm9ybSBzdGF0ZSB0byB0b3VjaGVkIGJ5IGludGVybmFsbHkgY2FsbGluZyBhbmd1bGFyIG1hcmtBc1RvdWNoZWQgbWV0aG9kIG9uIHRoZSBmb3JtXG4gICAgICogQHBhcmFtIHZhbHVlLCBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLCBtYXJrcyBhbGwgZGlyZWN0IGFuY2VzdG9ycy4gRGVmYXVsdCBpcyBmYWxzZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIG1hcmtBc1RvdWNoZWQodmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNUb3VjaGVkKHsgb25seVNlbGY6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGZvcm0gc3RhdGUgdG8gdW50b3VjaGVkIGJ5IGludGVybmFsbHkgY2FsbGluZyBhbmd1bGFyIG1hcmtBc1VudG91Y2hlZCBtZXRob2Qgb24gdGhlIGZvcm1cbiAgICAgKiBAcGFyYW0gdmFsdWUsIFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbWFya0FzVW50b3VjaGVkKHZhbHVlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5uZ2Zvcm0ubWFya0FzVW50b3VjaGVkKHsgb25seVNlbGY6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIGludm9rZUFjdGlvbkV2ZW50KCRldmVudCwgZXhwcmVzc2lvbjogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGZuID0gJHBhcnNlRXZlbnQoZXhwcmVzc2lvbik7XG4gICAgICAgIGZuKHRoaXMudmlld1BhcmVudCwgT2JqZWN0LmFzc2lnbih0aGlzLmNvbnRleHQsIHskZXZlbnR9KSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIC8vIG9uIGZvcm0gZGVzdHJveSwgcmVtb3ZpbmcgdGhpcyBmb3JtIGZyb20gdGhlIHBhcmVudEZvcm0gdG9vLlxuICAgICAgICBjb25zdCBjb250cm9scyA9IHRoaXMucGFyZW50Rm9ybSAmJiBnZXQodGhpcy5wYXJlbnRGb3JtLCAnbmdmb3JtLmNvbnRyb2xzJyk7XG4gICAgICAgIGlmIChjb250cm9scykge1xuICAgICAgICAgICAgLy8gd2hlbiBjdXJyZW50IGZvcm0gaXMgaW5zaWRlIHRoZSBsaXN0IChpLmUuIGluY2FzZSBvZiBmb3JtQXJyYXkpLlxuICAgICAgICAgICAgaWYgKGdldCh0aGlzLnBhcmVudExpc3QsICduYW1lJykgJiYgY29udHJvbHMuaGFzT3duUHJvcGVydHkodGhpcy5wYXJlbnRMaXN0Lm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgdGhlIGluZGV4IG9mIGN1cnJlbnQgZm9ybSBpbiB0aGUgbGlzdCBhbmQgcmVtb3ZlIHRoZSBGb3JtQ29udHJvbCBmcm9tIEZvcm1BcnJheVxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZmluZEluZGV4KHRoaXMucGFyZW50TGlzdC5nZXRXaWRnZXRzKHRoaXMubmFtZSksIHt3aWRnZXRJZDogdGhpcy53aWRnZXRJZH0pO1xuICAgICAgICAgICAgICAgICg8Rm9ybUFycmF5PnRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0uY29udHJvbHNbdGhpcy5wYXJlbnRMaXN0Lm5hbWVdKS5yZW1vdmVBdChpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB3aGVuIHdlIGhhdmUgZm9ybUdyb3VwTmFtZSBzZXQgaS5lLiBtdWx0aXBsZSBmb3JtSW5zdGFuY2Ugd2l0aCBjb3VudGVyIGFwcGVuZGVkIHRvIGZvcm1OYW1lXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXBOYW1lICYmIGNvbnRyb2xzLmhhc093blByb3BlcnR5KHRoaXMuZm9ybUdyb3VwTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0ubmdmb3JtLnJlbW92ZUNvbnRyb2wodGhpcy5mb3JtR3JvdXBOYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5yZW1vdmVDb250cm9sKHRoaXMubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG59XG4iLCI8bmctdGVtcGxhdGUgI2NvbnRlbnQ+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtbGF5b3V0ID09PSAncGFnZSc7IHRoZW4gcGFnZUxheW91dFRlbXBsYXRlIGVsc2UgZGVmYXVsdFRlbXBsYXRlXCI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0VGVtcGxhdGU+XG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIiAqbmdJZj1cIiFpc0xheW91dERpYWxvZyAmJiAodGl0bGUgfHwgc3ViaGVhZGluZyB8fCBpY29uY2xhc3MgfHwgc2hvd0J1dHRvbnMoJ2hlYWRlcicpKVwiPlxuICAgICAgICA8aDMgY2xhc3M9XCJwYW5lbC10aXRsZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYXBwLWljb24gcGFuZWwtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIFtuZ0NsYXNzXT1cImljb25jbGFzc1wiICpuZ0lmPVwiaWNvbmNsYXNzXCI+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmdcIiBbaW5uZXJIVE1MXT1cInRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCIgW2lubmVySFRNTF09XCJzdWJoZWFkaW5nXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWFjdGlvbiBwYW5lbC1hY3Rpb25zIGJhc2ljLWJ0bi1ncnBcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBidG4gb2YgYnV0dG9uQXJyYXkgfCBmaWx0ZXIgOiAncG9zaXRpb24nIDogJ2hlYWRlcic7IGxldCBpbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJ0bi53aWRnZXRUeXBlID09PSAnYnV0dG9uJyA/IGJ1dHRvblJlZiA6IGFuY2hvclJlZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2J0bjpidG59XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0SW5qZWN0b3JdPVwiY3JlYXRlQ3VzdG9tSW5qZWN0b3IoJ2FjdGlvbl9oZWFkZXJfJyArIGluZGV4LCB7YnRuOmJ0bn0pXCI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhcHAtaWNvbiB3aSBwYW5lbC1hY3Rpb25cIiAqbmdJZj1cImNvbGxhcHNpYmxlXCIgW3RpdGxlXT1cImV4cGFuZGVkPyAodGhpcy5hcHBMb2NhbGU/LkxBQkVMX0NPTExBUFNFfHwnQ29sbGFwc2UnKToodGhpcy5hcHBMb2NhbGU/LkxBQkVMX0VYUEFORHx8J0V4cGFuZCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImV4cGFuZGVkID8gJ3dpLW1pbnVzJzogJ3dpLXBsdXMnXCIgKGNsaWNrKT1cImV4cGFuZENvbGxhcHNlUGFuZWwoKTtcIj48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2gzPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ib2R5XCIgW25nQ2xhc3NdPVwieydmb3JtLWVsZW1lbnRzJzogaXNMYXlvdXREaWFsb2csICdmb3JtLWJvZHknOiAhaXNMYXlvdXREaWFsb2d9XCIgW2NsYXNzLmhpZGRlbl09XCIhZXhwYW5kZWRcIj5cbiAgICAgICAgPHAgd21NZXNzYWdlICpuZ0lmPVwiISFzdGF0dXNNZXNzYWdlLmNhcHRpb25cIiBbYXR0ci5hcmlhLWhpZGRlbl09XCIhc3RhdHVzTWVzc2FnZS5jYXB0aW9uXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJzdGF0dXNNZXNzYWdlLmNhcHRpb25cIiBjYXB0aW9uLmJpbmQ9XCJzdGF0dXNNZXNzYWdlLmNhcHRpb25cIiB0eXBlLmJpbmQ9XCJzdGF0dXNNZXNzYWdlLnR5cGVcIj48L3A+XG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydmb3JtLWVsZW1lbnRzJzogIWlzTGF5b3V0RGlhbG9nLCAnZm9ybS1jb250ZW50JzogaXNMYXlvdXREaWFsb2d9XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJhc2ljLWJ0bi1ncnAgZm9ybS1hY3Rpb24gcGFuZWwtZm9vdGVyIGNsZWFyZml4XCIgW25nQ2xhc3NdPVwieydtb2RhbC1mb290ZXInOiBpc0xheW91dERpYWxvZ31cIiBbY2xhc3MuaGlkZGVuXT1cIiFleHBhbmRlZCB8fCAhc2hvd0J1dHRvbnMoJ2Zvb3RlcicpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBidG4gb2YgYnV0dG9uQXJyYXkgfCBmaWx0ZXIgOiAncG9zaXRpb24nIDogJ2Zvb3Rlcic7IGxldCBpbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiYnRuLndpZGdldFR5cGUgPT09ICdidXR0b24nID8gYnV0dG9uUmVmIDogYW5jaG9yUmVmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntidG46YnRufVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0SW5qZWN0b3JdPVwiY3JlYXRlQ3VzdG9tSW5qZWN0b3IoJ2FjdGlvbl9mb290ZXJfJyArIGluZGV4LCB7YnRuOmJ0bn0pXCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3BhZ2VMYXlvdXRUZW1wbGF0ZT5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFwiPjwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNidXR0b25SZWYgbGV0LWJ0bj1cImJ0blwiPlxuICAgIDxidXR0b24gIHdtQnV0dG9uIG5hbWU9XCJ7e2J0bi5rZXl9fVwiIGNhcHRpb24uYmluZD1cImJ0bi5kaXNwbGF5TmFtZVwiIGNsYXNzLmJpbmQ9XCJidG4uY2xhc3NcIiBpY29uY2xhc3MuYmluZD1cImJ0bi5pY29uY2xhc3NcIiBzaG93LmJpbmQ9XCJidG4uc2hvd1wiXG4gICAgICAgICAgICAgKGNsaWNrKT1cImludm9rZUFjdGlvbkV2ZW50KCRldmVudCwgYnRuLmFjdGlvbilcIiB0eXBlLmJpbmQ9XCJidG4udHlwZVwiIGhpbnQuYmluZD1cImJ0bi50aXRsZVwiIHNob3J0Y3V0a2V5LmJpbmQ9XCJidG4uc2hvcnRjdXRrZXlcIiBkaXNhYmxlZC5iaW5kPVwibmdmb3JtLnN0YXR1cyA9PT0gJ1BFTkRJTkcnIHx8IGJ0bi5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgdGFiaW5kZXguYmluZD1cImJ0bi50YWJpbmRleFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiYnRuLmRpc3BsYXlOYW1lXCIgW2NsYXNzLmhpZGRlbl09XCJidG4udXBkYXRlTW9kZSA/ICFpc1VwZGF0ZU1vZGUgOiBpc1VwZGF0ZU1vZGVcIj48L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYW5jaG9yUmVmIGxldC1idG49XCJidG5cIj5cbiAgICA8YSB3bUFuY2hvciBuYW1lPVwie3tidG4ua2V5fX1cIiBjYXB0aW9uLmJpbmQ9XCJidG4uZGlzcGxheU5hbWVcIiBjbGFzcy5iaW5kPVwiYnRuLmNsYXNzXCIgaWNvbmNsYXNzLmJpbmQ9XCJidG4uaWNvbmNsYXNzXCIgc2hvdy5iaW5kPVwiYnRuLnNob3dcIlxuICAgICAgICAgICAgIChjbGljayk9XCJpbnZva2VBY3Rpb25FdmVudCgkZXZlbnQsIGJ0bi5hY3Rpb24pXCIgaGludC5iaW5kPVwiYnRuLnRpdGxlXCIgc2hvcnRjdXRrZXkuYmluZD1cImJ0bi5zaG9ydGN1dGtleVwiXG4gICAgICAgICAgICAgaHlwZXJsaW5rLmJpbmQ9XCJidG4uaHlwZXJsaW5rXCIgdGFyZ2V0LmJpbmQ9XCJidG4udGFyZ2V0XCJcbiAgICAgICAgICAgICB0YWJpbmRleC5iaW5kPVwiYnRuLnRhYmluZGV4XCIgW2NsYXNzLmhpZGRlbl09XCJidG4udXBkYXRlTW9kZSA/ICFpc1VwZGF0ZU1vZGUgOiBpc1VwZGF0ZU1vZGVcIj48L2E+XG48L25nLXRlbXBsYXRlPlxuXG48bmctY29udGFpbmVyICNkeW5hbWljRm9ybT48L25nLWNvbnRhaW5lcj5cbiJdfQ==
1352
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvZGF0YS9mb3JtL3NyYy9mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9kYXRhL2Zvcm0vc3JjL2Zvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdILFNBQVMsRUFDVCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFdBQVcsRUFDWCxZQUFZLEVBQUUsTUFBTSxFQUNwQixRQUFRLEVBQ1IsTUFBTSxFQUVOLFFBQVEsRUFDUixRQUFRLEVBQ1IsU0FBUyxFQUNULGdCQUFnQixFQUNuQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsU0FBUyxFQUFFLFdBQVcsRUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFDSCxVQUFVLEVBQ1YsZUFBZSxFQUNmLFdBQVcsRUFDWCxxQkFBcUIsRUFDckIsR0FBRyxFQUNILFVBQVUsRUFDVixRQUFRLEVBQ1IsUUFBUSxFQUNSLDJCQUEyQixFQUMzQixXQUFXLEVBQ1gsZUFBZSxFQUNmLFFBQVEsRUFDUixZQUFZLEVBQ1osU0FBUyxFQUNULG1CQUFtQixFQUNuQixVQUFVLEVBQ1YsV0FBVyxFQUNYLGVBQWUsR0FDbEIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUNILG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLFNBQVMsRUFDWixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1B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dUJBQUMsb0JBQW9COztzQkFDOUIsU0FBUzt1QkFBQyxjQUFjOztzQkFDeEIsU0FBUzt1QkFBQyxvQkFBb0I7O3NCQUM5QixTQUFTO3VCQUFDLGNBQWM7O3NCQUN4QixTQUFTO3VCQUFDLGVBQWU7O3NCQUN6QixTQUFTO3VCQUFDLFlBQVk7O3NCQUN0QixTQUFTO3VCQUFDLGNBQWM7O3NCQUN4QixTQUFTO3VCQUFDLFdBQVc7O3NCQUNyQixTQUFTO3VCQUFDLEtBQUs7O3NCQUNmLFNBQVM7dUJBQUMsTUFBTTs7c0JBQ2hCLE1BQU07dUJBQUMsa0JBQWtCOztzQkFBRyxRQUFRO3FCQXBLMkIsY0FBYztrQkFBakYsU0FBUzttQkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUNyQyxVQUFVO2tCQUF0QyxTQUFTO21CQUFDLGdCQUFnQjtZQUVzQixhQUFhO2tCQUE3RCxlQUFlO21CQUFDLFNBQVMsRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUM7WUE0R3hCLE1BQU07a0JBQTVCLFdBQVc7bUJBQUMsUUFBUTtZQUVlLE1BQU07a0JBQXpDLFlBQVk7bUJBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBSVgsT0FBTztrQkFBN0IsWUFBWTttQkFBQyxPQUFPO1lBSWdCLGdCQUFnQjtrQkFBcEQsWUFBWTttQkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7O2tGQTNIMUIsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIEF0dHJpYnV0ZSxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lciwgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIE5nWm9uZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT3B0aW9uYWwsXG4gICAgU2tpcFNlbGYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Zvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge1xuICAgICRhcHBEaWdlc3QsXG4gICAgJGludm9rZVdhdGNoZXJzLFxuICAgICRwYXJzZUV2ZW50LFxuICAgIEFic3RyYWN0RGlhbG9nU2VydmljZSxcbiAgICBBcHAsXG4gICAgRGF0YVNvdXJjZSxcbiAgICBEYXRhVHlwZSxcbiAgICBkZWJvdW5jZSxcbiAgICBEeW5hbWljQ29tcG9uZW50UmVmUHJvdmlkZXIsXG4gICAgZXh0ZW5kUHJvdG8sXG4gICAgZ2V0Q2xvbmVkT2JqZWN0LFxuICAgIGdldEZpbGVzLFxuICAgIGdldFZhbGlkSlNPTixcbiAgICBpc0RlZmluZWQsXG4gICAgaXNFbGVtZW50SW5WaWV3cG9ydCxcbiAgICByZW1vdmVBdHRyLFxuICAgIHJlbW92ZUNsYXNzLFxuICAgIHNjcm9sbFRvRWxlbWVudCxcbn0gZnJvbSAnQHdtL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBnZXRGaWVsZExheW91dENvbmZpZyxcbiAgICBMaXZlX09wZXJhdGlvbnMsXG4gICAgTWVzc2FnZUNvbXBvbmVudCxcbiAgICBwYXJzZVZhbHVlQnlUeXBlLFxuICAgIFBhcnRpYWxEaXJlY3RpdmUsXG4gICAgcGVyZm9ybURhdGFPcGVyYXRpb24sXG4gICAgcHJvdmlkZUFzV2lkZ2V0UmVmLFxuICAgIFN0eWxhYmxlQ29tcG9uZW50LFxuICAgIHN0eWxlcixcbiAgICBXaWRnZXRSZWZcbn0gZnJvbSAnQHdtL2NvbXBvbmVudHMvYmFzZSc7XG5pbXBvcnQge1ByZWZhYkRpcmVjdGl2ZX0gZnJvbSAnQHdtL2NvbXBvbmVudHMvcHJlZmFiJztcbmltcG9ydCB7TGlzdENvbXBvbmVudH0gZnJvbSAnQHdtL2NvbXBvbmVudHMvZGF0YS9saXN0JztcblxuaW1wb3J0IHtyZWdpc3RlckZvcm1Qcm9wc30gZnJvbSAnLi9mb3JtLnByb3BzJztcbmltcG9ydCB7XG4gICAgZGVib3VuY2UgYXMgX2RlYm91bmNlLFxuICAgIGZpbHRlcixcbiAgICBmaW5kLCBmaW5kSW5kZXgsXG4gICAgZm9yRWFjaCxcbiAgICBnZXQsXG4gICAgaW5jbHVkZXMsXG4gICAgaXNBcnJheSxcbiAgICBpc0VtcHR5LCBpc0VxdWFsLFxuICAgIGlzVW5kZWZpbmVkLFxuICAgIGtleXMsXG4gICAgbGFzdCxcbiAgICBzZXQsXG4gICAgc29tZSxcbiAgICBzcGxpdFxufSBmcm9tIFwibG9kYXNoLWVzXCI7XG5cbmNvbnN0IFdJREdFVF9DT05GSUcgPSB7d2lkZ2V0VHlwZTogJ3dtLWZvcm0nLCBob3N0Q2xhc3M6ICdwYW5lbCBhcHAtcGFuZWwgYXBwLWZvcm0nfTtcbmNvbnN0IExPR0lOX0ZPUk1fQ09ORklHID0ge3dpZGdldFR5cGU6ICd3bS1mb3JtJywgaG9zdENsYXNzOiAnYXBwLWZvcm0gYXBwLWxvZ2luLWZvcm0nfTtcbmNvbnN0IExJVkVfRk9STV9DT05GSUcgPSB7d2lkZ2V0VHlwZTogJ3dtLWxpdmVmb3JtJywgaG9zdENsYXNzOiAncGFuZWwgYXBwLXBhbmVsIGFwcC1saXZlZm9ybSBsaXZlZm9ybS1pbmxpbmUnfTtcbmNvbnN0IExJVkVfRklMVEVSX0NPTkZJRyA9IHt3aWRnZXRUeXBlOiAnd20tbGl2ZWZpbHRlcicsIGhvc3RDbGFzczogJ3BhbmVsIGFwcC1wYW5lbCBhcHAtbGl2ZWZpbHRlciBjbGVhcmZpeCBsaXZlZm9ybS1pbmxpbmUnfTtcblxuY29uc3QgZ2V0V2lkZ2V0Q29uZmlnID0gKGlzTGl2ZUZvcm0sIGlzTGl2ZUZpbHRlciwgcm9sZSkgPT4ge1xuICAgIGxldCBjb25maWcgPSBXSURHRVRfQ09ORklHO1xuICAgIGlmIChpc0xpdmVGb3JtICE9PSBudWxsKSB7XG4gICAgICAgIGNvbmZpZyA9IExJVkVfRk9STV9DT05GSUc7XG4gICAgfSBlbHNlIGlmIChpc0xpdmVGaWx0ZXIgIT09IG51bGwpIHtcbiAgICAgICAgY29uZmlnID0gTElWRV9GSUxURVJfQ09ORklHO1xuICAgIH0gZWxzZSBpZiAocm9sZSA9PT0gJ2FwcC1sb2dpbicpIHtcbiAgICAgICAgY29uZmlnID0gTE9HSU5fRk9STV9DT05GSUc7XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG59O1xuXG4vLyBHZW5lcmF0ZSB0aGUgZm9ybSBmaWVsZCB3aXRoIGdpdmVuIGZpZWxkIGRlZmluaXRpb24uIEFkZCBhIGdyaWQgY29sdW1uIHdyYXBwZXIgYXJvdW5kIHRoZSBmb3JtIGZpZWxkLlxuY29uc3Qgc2V0TWFya3VwRm9yRm9ybUZpZWxkID0gKGZpZWxkLCBjb2x1bW5XaWR0aCkgPT4gIHtcbiAgICBsZXQgcHJvcHNUbXBsID0gJyc7XG4gICAgZm9yRWFjaChmaWVsZCwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgcHJvcHNUbXBsID0gYCR7cHJvcHNUbXBsfSAke2tleX09XCIke3ZhbHVlfVwiYDtcbiAgICB9KTtcbiAgICByZXR1cm4gYDx3bS1ncmlkY29sdW1uIGNvbHVtbndpZHRoPVwiJHtjb2x1bW5XaWR0aH1cIj5cbiAgICAgICAgICAgICAgICAgIDx3bS1mb3JtLWZpZWxkICR7cHJvcHNUbXBsfT48L3dtLWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L3dtLWdyaWRjb2x1bW4+YDtcbn07XG5cbi8vIEZ1bmN0aW9uIHRvIGZpbmQgb3V0IHRoZSBmaXJzdCBpbnZhbGlkIGVsZW1lbnQgaW4gZm9ybVxuY29uc3QgZmluZEludmFsaWRFbGVtZW50ID0gKCRmb3JtRWxlLCBuZ0Zvcm0pID0+IHtcbiAgICBjb25zdCAkZWxlID0gJGZvcm1FbGUuZmluZCgnZm9ybS5uZy1pbnZhbGlkOnZpc2libGUsIFtmb3JtQ29udHJvbE5hbWVdLm5nLWludmFsaWQ6dmlzaWJsZScpLmZpcnN0KCk7XG4gICAgbGV0IGZvcm1PYmogPSBuZ0Zvcm07XG4gICAgLy8gSWYgZWxlbWVudCBpcyBmb3JtLCBmaW5kIG91dCB0aGUgZmlyc3QgaW52YWxpZCBlbGVtZW50IGluIHRoaXMgZm9ybVxuICAgIGlmICgkZWxlLmlzKCdmb3JtJykpIHtcbiAgICAgICAgZm9ybU9iaiA9IG5nRm9ybSAmJiBuZ0Zvcm0uY29udHJvbHNbJGVsZS5hdHRyKCdmb3JtQ29udHJvbE5hbWUnKSB8fCAkZWxlLmF0dHIoJ25hbWUnKV07XG4gICAgICAgIGlmIChmb3JtT2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gZmluZEludmFsaWRFbGVtZW50KCRlbGUsIGZvcm1PYmopO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIG5nRm9ybTogZm9ybU9iaixcbiAgICAgICAgJGVsZTogJGVsZVxuICAgIH07XG59O1xuXG4vLyBGdW5jdGlvbiB0byBnZXQgdGhlIGFjdGl2ZSBlbGVtZW50IG1hcmt1cCBiYXNlZCBvbiB3aWRnZXQgdHlwZVxuY29uc3QgZ2V0QWN0aXZlRWxlbWVudCA9IChlbGVtZW50KSA9PiB7XG4gICAgY29uc3Qgd2lkZ2V0VHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3aWRnZXR0eXBlJyk7XG4gICAgc3dpdGNoICh3aWRnZXRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdzZWxlY3QnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgIH1cbn1cbmNvbnN0IHNldFRvdWNoZWRTdGF0ZSA9IChzZWxmLCBuZ0Zvcm0sIGZpZWxkTmFtZSkgPT4ge1xuICAgIGlmIChuZ0Zvcm0udmFsaWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmdGb3JtLmNvbnRyb2xzKSB7XG4gICAgICAgIGZvckVhY2gobmdGb3JtLmNvbnRyb2xzLCAoY3RybCwgZmllbGROYW1lKSA9PiB7XG4gICAgICAgICAgICBzZXRUb3VjaGVkU3RhdGUoc2VsZiwgY3RybCwgZmllbGROYW1lKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGVsZW1lbnQgPSBzZWxmLiRlbGVtZW50LmZpbmQoYFt3bWZvcm1maWVsZF1ba2V5PVwiJHtmaWVsZE5hbWV9XCJdYCk7XG4gICAgICAgIGlmICghZWxlbWVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLiRlbGVtZW50LmZpbmQoYFt3bWZvcm1maWVsZF1bbmFtZT1cIiR7ZmllbGROYW1lfVwiXWApO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRbMF0uc2V0QXR0cmlidXRlKCdfX2Vycm9ybXNnJywgZWxlbWVudFswXS5nZXRBdHRyaWJ1dGUoJ19fdmFsaWRhdGlvbklkJykpO1xuICAgICAgICBsZXQgYWN0aXZlRWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQoZWxlbWVudFswXSk7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgbmdGb3JtLmludmFsaWQpO1xuICAgICAgICBhY3RpdmVFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCBlbGVtZW50WzBdLmdldEF0dHJpYnV0ZSgnX192YWxpZGF0aW9uSWQnKSk7XG4gICAgICAgIG5nRm9ybS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgfVxufTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmb3JtW3dtRm9ybV0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgcHJvdmlkZUFzV2lkZ2V0UmVmKEZvcm1Db21wb25lbnQpXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBGb3JtQ29tcG9uZW50IGV4dGVuZHMgU3R5bGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQge1xuICAgIHN0YXRpYyAgaW5pdGlhbGl6ZVByb3BzID0gcmVnaXN0ZXJGb3JtUHJvcHMoKTtcbiAgICBAVmlld0NoaWxkKCdkeW5hbWljRm9ybScsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIGR5bmFtaWNGb3JtUmVmOiBWaWV3Q29udGFpbmVyUmVmO1xuICAgIEBWaWV3Q2hpbGQoTWVzc2FnZUNvbXBvbmVudCkgbWVzc2FnZVJlZjtcbiAgICAvLyB0aGlzIGlzIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCByZWZzIGluc2lkZSB0aGUgZm9ybS1ncm91cFxuICAgIEBDb250ZW50Q2hpbGRyZW4oV2lkZ2V0UmVmLCB7ZGVzY2VuZGFudHM6IHRydWV9KSBjb21wb25lbnRSZWZzO1xuXG4gICAgYXV0b3VwZGF0ZTtcbiAgICBwdWJsaWMgZm9ybWxheW91dDogYW55O1xuICAgIHB1YmxpYyBpc0RhdGFTb3VyY2VVcGRhdGVkOiBib29sZWFuO1xuICAgIGNhcHRpb25BbGlnbkNsYXNzOiBzdHJpbmc7XG4gICAgdmFsaWRhdGlvbnR5cGU6IHN0cmluZztcbiAgICBjYXB0aW9uYWxpZ246IHN0cmluZztcbiAgICBjYXB0aW9ucG9zaXRpb246IHN0cmluZztcbiAgICBjYXB0aW9uc2l6ZTtcbiAgICBjb2xsYXBzaWJsZTogYm9vbGVhbjtcbiAgICBleHBhbmRlZDogYm9vbGVhbjtcbiAgICBlbFNjb3BlO1xuICAgIF93aWRnZXRDbGFzcyA9ICcnO1xuICAgIGNhcHRpb253aWR0aDogc3RyaW5nO1xuICAgIF9jYXB0aW9uQ2xhc3MgPSAnJztcbiAgICBuZ2Zvcm06IEZvcm1Hcm91cDtcbiAgICBmb3JtRmllbGRzID0gW107XG4gICAgZm9ybWZpZWxkcyA9IHt9O1xuICAgIGZvcm1XaWRnZXRzID0ge307XG4gICAgZmlsdGVyV2lkZ2V0cyA9IHt9O1xuICAgIGJ1dHRvbkFycmF5ID0gW107XG4gICAgZGF0YW91dHB1dCA9IHt9O1xuICAgIGRhdGFzb3VyY2U7XG4gICAgZm9ybWRhdGFzb3VyY2U7XG4gICAgZm9ybWRhdGEgPSB7fTtcbiAgICBpc1NlbGVjdGVkO1xuICAgIHByZXZEYXRhVmFsdWVzO1xuICAgIHByZXZEYXRhT2JqZWN0O1xuICAgIHByZXZmb3JtRmllbGRzO1xuICAgIHN0YXR1c01lc3NhZ2UgPSB7XG4gICAgICAgIGNhcHRpb246ICcnLFxuICAgICAgICB0eXBlOiAnJ1xuICAgIH07XG4gICAgbWVzc2FnZWxheW91dDtcbiAgICBtZXRhZGF0YTtcbiAgICBlcnJvcm1lc3NhZ2U7XG4gICAgb25FcnJvcjtcbiAgICBvblN1Y2Nlc3M7XG4gICAgcHJpbWFyeUtleSA9IFtdO1xuICAgIHBvc3RtZXNzYWdlO1xuICAgIF9saXZlVGFibGVQYXJlbnQ7XG4gICAgdXBkYXRlTW9kZTtcbiAgICBuYW1lO1xuICAgIC8vIExpdmUgRm9ybSBNZXRob2RzXG4gICAgY2xlYXJEYXRhOiBGdW5jdGlvbjtcbiAgICBjYW5jZWw6IEZ1bmN0aW9uO1xuICAgIGRlbGV0ZTogRnVuY3Rpb247XG4gICAgc2F2ZTogRnVuY3Rpb247XG4gICAgc2F2ZUFuZE5ldzogRnVuY3Rpb247XG4gICAgc2F2ZUFuZFZpZXc6IEZ1bmN0aW9uO1xuICAgIHNldFByaW1hcnlLZXk6ICgpID0+IHt9O1xuICAgIGRpYWxvZ0lkOiBzdHJpbmc7XG4gICAgLy8gTGl2ZSBGaWx0ZXJcbiAgICBlbmFibGVlbXB0eWZpbHRlcjtcbiAgICBwYWdlc2l6ZTtcbiAgICByZXN1bHQ7XG4gICAgcGFnaW5hdGlvbjtcbiAgICBjbGVhckZpbHRlcjogRnVuY3Rpb247XG4gICAgYXBwbHlGaWx0ZXI6IEZ1bmN0aW9uO1xuICAgIGZpbHRlcjogRnVuY3Rpb247XG4gICAgZmlsdGVyT25EZWZhdWx0OiBGdW5jdGlvbjtcbiAgICBvbk1heERlZmF1bHRWYWx1ZUNoYW5nZTogRnVuY3Rpb247XG4gICAgbnVtYmVyT2ZGaWVsZHM6IG51bWJlcjtcblxuICAgIHByaXZhdGUgX2RlYm91bmNlZFVwZGF0ZUZpZWxkU291cmNlOiBGdW5jdGlvbiA9IF9kZWJvdW5jZSh0aGlzLnVwZGF0ZUZpZWxkU291cmNlLCAzNTApO1xuICAgIHByaXZhdGUgb3BlcmF0aW9uVHlwZTtcbiAgICBwcml2YXRlIF9pc0xheW91dERpYWxvZztcbiAgICBwcml2YXRlIF9keW5hbWljQ29udGV4dDtcbiAgICBwcml2YXRlIF9pc0dyaWRMYXlvdXRQcmVzZW50O1xuICAgIHByaXZhdGUgdmFsaWRhdGlvbk1lc3NhZ2VzID0gW107XG4gICAgcHJpdmF0ZSBmb3JtR3JvdXBOYW1lO1xuICAgIHByaXZhdGUgZm9ybUFycmF5SW5kZXg7XG4gICAgcHJpdmF0ZSBiaW5kaW5nVmFsdWU7XG4gICAgcHJpdmF0ZSBfZm9ybUlzSW5MaXN0O1xuICAgIHByaXZhdGUgX3RyaWdnZXJlZEJ5VXNlcjogYm9vbGVhbjtcblxuXG4gICAgcHJpdmF0ZSBfZGVib3VuY2VkU3VibWl0Rm9ybSA9IGRlYm91bmNlKCgkZXZlbnQpID0+IHtcbiAgICAgICAgLy8gY2FsbGluZyBzdWJtaXQgZXZlbnQgaW4gbmdab25lIGFzIGNoYW5nZSBkZXRlY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBwb3N0IHRoZSBzdWJtaXQgY2FsbGJhY2sgYW5kIGFjdGlvbnMgbGlrZSBub3RpZmljYXRpb24gYXJlIG5vdCBzaG93blxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRGb3JtKCRldmVudCk7XG4gICAgICAgIH0pO1xuICAgIH0sIDI1MCk7XG5cbiAgICBzZXQgaXNMYXlvdXREaWFsb2cobnYpIHtcbiAgICAgICAgaWYgKG52KSB7XG4gICAgICAgICAgICByZW1vdmVDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQsICdwYW5lbCBhcHAtcGFuZWwgbGl2ZWZvcm0taW5saW5lJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNMYXlvdXREaWFsb2cgPSBudjtcbiAgICB9XG5cbiAgICBnZXQgaXNMYXlvdXREaWFsb2coKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0xheW91dERpYWxvZztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pc1VwZGF0ZU1vZGU7XG4gICAgc2V0IGlzVXBkYXRlTW9kZShudikge1xuICAgICAgICB0aGlzLl9pc1VwZGF0ZU1vZGUgPSBudjtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgZmllbGQuc2V0UmVhZE9ubHlTdGF0ZShudik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCBpc1VwZGF0ZU1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1VwZGF0ZU1vZGU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdhY3Rpb24nKSBhY3Rpb246IHN0cmluZztcblxuICAgIEBIb3N0TGlzdGVuZXIoJ3N1Ym1pdCcsIFsnJGV2ZW50J10pIHN1Ym1pdCgkZXZlbnQpIHtcbiAgICAgICAgdGhpcy5fZGVib3VuY2VkU3VibWl0Rm9ybSgkZXZlbnQpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3Jlc2V0Jykgb25SZXNldCgpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKSBvbktleWRvd25IYW5kbGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIHRoaXMuX3RyaWdnZXJlZEJ5VXNlciA9IHRydWU7XG4gICAgfVxuICAgIC8vIHJldHVybnMgdGhlIGZvcm1BcnJheSBjb250cm9sIG9uIHRoZSBwYXJlbnRGb3JtLlxuICAgIGdldCBwYXJlbnRGb3JtQXJyYXkoKTogRm9ybUFycmF5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50Rm9ybSAmJiB0aGlzLmlzUGFyZW50TGlzdCAmJiB0aGlzLnBhcmVudEZvcm0ubmdmb3JtLmdldCh0aGlzLnBhcmVudExpc3QubmFtZSkgYXMgRm9ybUFycmF5O1xuICAgIH1cblxuICAgIC8vIHJldHVybnMgdHJ1ZSBvbmx5IHdoZW4gY2xvc2VzdCBsaXZlbGlzdCBpcyB0aGUgaW1tZWRpYXRlIHBhcmVudCBvZiB0aGUgZm9ybS5cbiAgICAvLyBjaGVja3MgZm9yIGxpdmVsaXN0IGhhdmluZyBhbnkgZm9ybSBlbGVtZW50cyB3aXRoIHBhcmVudEZvcm0gbmFtZS5cbiAgICAvLyBJZiBsaXZlbGlzdCBpcyBub3QgY29udGFpbmluZyBhbnkgcGFyZW50Rm9ybSBlbGVtZW50cyB0aGVuIGl0IHJldHVybnMgdHJ1ZS5cbiAgICBnZXQgaXNQYXJlbnRMaXN0KCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRMaXN0ICYmIHRoaXMucGFyZW50Rm9ybSAmJiAhaXNEZWZpbmVkKHRoaXMuX2Zvcm1Jc0luTGlzdCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1FbGUgPSB0aGlzLiRlbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgbGlzdEVsZSA9IGZvcm1FbGUuY2xvc2VzdCgnLmFwcC1saXZlbGlzdFtuYW1lPVwiJyArIHRoaXMucGFyZW50TGlzdC5uYW1lICsgJ1wiXScpO1xuICAgICAgICAgICAgaWYgKGxpc3RFbGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9ybUlzSW5MaXN0ID0gIShsaXN0RWxlLmZpbmQoJ2Zvcm1bd2lkZ2V0LWlkPVwiJyArIHRoaXMucGFyZW50Rm9ybS53aWRnZXRJZCArICdcIl0nKSkubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0RlZmluZWQodGhpcy5fZm9ybUlzSW5MaXN0KSA/IHRoaXMuX2Zvcm1Jc0luTGlzdCA6IHRoaXMucGFyZW50TGlzdDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgaW5qOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgICAgIHByaXZhdGUgYXBwOiBBcHAsXG4gICAgICAgIHByaXZhdGUgZGlhbG9nU2VydmljZTogQWJzdHJhY3REaWFsb2dTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGR5bmFtaWNDb21wb25lbnRQcm92aWRlcjogRHluYW1pY0NvbXBvbmVudFJlZlByb3ZpZGVyLFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgICAgICBAT3B0aW9uYWwoKSBwdWJsaWMgcGFyZW50TGlzdDogTGlzdENvbXBvbmVudCxcbiAgICAgICAgQFNraXBTZWxmKCkgQE9wdGlvbmFsKCkgcHVibGljIHBhcmVudEZvcm06IEZvcm1Db21wb25lbnQsXG4gICAgICAgIEBTa2lwU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBwYXJlbnRQcmVmYWI6IFByZWZhYkRpcmVjdGl2ZSxcbiAgICAgICAgQFNraXBTZWxmKCkgQE9wdGlvbmFsKCkgcHVibGljIHBhcmVudFBhcnRpYWw6IFBhcnRpYWxEaXJlY3RpdmUsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ2JlZm9yZXN1Ym1pdC5ldmVudCcpIHB1YmxpYyBvbkJlZm9yZVN1Ym1pdEV2dCxcbiAgICAgICAgQEF0dHJpYnV0ZSgnc3VibWl0LmV2ZW50JykgcHVibGljIG9uU3VibWl0RXZ0LFxuICAgICAgICBAQXR0cmlidXRlKCdiZWZvcmVyZW5kZXIuZXZlbnQnKSBwdWJsaWMgb25CZWZvcmVSZW5kZXJFdnQsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ2RhdGFzZXQuYmluZCcpIHB1YmxpYyBiaW5kZGF0YXNldCxcbiAgICAgICAgQEF0dHJpYnV0ZSgnZm9ybWRhdGEuYmluZCcpIHByaXZhdGUgYmluZGZvcm1kYXRhLFxuICAgICAgICBAQXR0cmlidXRlKCd3bUxpdmVGb3JtJykgaXNMaXZlRm9ybSxcbiAgICAgICAgQEF0dHJpYnV0ZSgnd21MaXZlRmlsdGVyJykgaXNMaXZlRmlsdGVyLFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhLXJvbGUnKSByb2xlLFxuICAgICAgICBAQXR0cmlidXRlKCdrZXknKSBrZXksXG4gICAgICAgIEBBdHRyaWJ1dGUoJ25hbWUnKSBuYW1lLFxuICAgICAgICBASW5qZWN0KCdFWFBMSUNJVF9DT05URVhUJykgQE9wdGlvbmFsKCkgZXhwbGljaXRDb250ZXh0OiBhbnlcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaW5qLCBnZXRXaWRnZXRDb25maWcoaXNMaXZlRm9ybSwgaXNMaXZlRmlsdGVyLCByb2xlKSwgZXhwbGljaXRDb250ZXh0KTtcblxuICAgICAgICBzdHlsZXIodGhpcy5uYXRpdmVFbGVtZW50LCB0aGlzKTtcblxuICAgICAgICAvLyByZW1vdmUgdGl0bGUgcHJvcGVydHkgYXMgYXR0cmlidXRlIGFzIGl0IGlzIGNhdXNpbmcgdW5uZWNlc3NhcnkgdG9vbHRpcFxuICAgICAgICByZW1vdmVBdHRyKHRoaXMubmF0aXZlRWxlbWVudCwgJ3RpdGxlJyk7XG4gICAgICAgIHRoaXMuaXNVcGRhdGVNb2RlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kaWFsb2dJZCA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpYWxvZ0lkJyk7XG4gICAgICAgIHRoaXMubmdmb3JtID0gZmIuZ3JvdXAoe30pO1xuICAgICAgICB0aGlzLmJpbmRpbmdWYWx1ZSA9IGtleSB8fCBuYW1lO1xuXG4gICAgICAgIC8vIE9uIHZhbHVlIGNoYW5nZSBpbiBmb3JtLCB1cGRhdGUgdGhlIGRhdGFvdXRwdXRcbiAgICAgICAgY29uc3Qgb25WYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbiA9ICB0aGlzLm5nZm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodGhpcy51cGRhdGVEYXRhT3V0cHV0LmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRGVzdHJveUxpc3RlbmVyKCgpID0+IG9uVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMuZWxTY29wZSA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy5hZGRFdmVudHNUb0NvbnRleHQodGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlZnMuZm9yRWFjaChjb21wb25lbnRSZWYgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRSZWYubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciB3aWRnZXRzIGluc2lkZSBmb3JtIHdpdGggZm9ybVdpZGdldHNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtV2lkZ2V0c1tjb21wb25lbnRSZWYubmFtZV0gPSBjb21wb25lbnRSZWY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIDI1MCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRGb3JtICYmIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0gJiYgdGhpcy5pc1BhcmVudExpc3QpIHtcbiAgICAgICAgICAgIC8vIHNldHRpbmcgZm9ybUFycmF5IGNvbnRyb2wgb24gbmdmb3JtLlxuICAgICAgICAgICAgaWYgKCFnZXQodGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5jb250cm9scywgdGhpcy5wYXJlbnRMaXN0Lm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5zZXRDb250cm9sKHRoaXMucGFyZW50TGlzdC5uYW1lLCBuZXcgRm9ybUFycmF5KFtdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBwdXNoaW5nIHRoZSBuZ2Zvcm0gdG8gZm9ybUFycmF5LlxuICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtQXJyYXkucHVzaCh0aGlzLm5nZm9ybSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1BcnJheUluZGV4ID0gdGhpcy5wYXJlbnRGb3JtQXJyYXkubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZElubmVyTmdGb3JtVG9Gb3JtKHRoaXMuYmluZGluZ1ZhbHVlKTtcbiAgICB9XG5cbiAgICBmaW5kT3BlcmF0aW9uVHlwZSgpIHt9XG5cbiAgICBwcml2YXRlIGFkZElubmVyTmdGb3JtVG9Gb3JtKGJpbmRpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Rm9ybSAmJiB0aGlzLnBhcmVudEZvcm0ubmdmb3JtKSB7XG4gICAgICAgICAgICAvLyBoYW5kbGluZyBhcyBmb3JtQXJyYXkgd2hlbiBwYXJlbnQgaXMgbGlzdC4gSGVuY2UgcmV0dXJuaW5nIGhlcmUgZnJvbSBhZGRpbmcgdG8gcGFyZW50Rm9ybSBhZ2Fpbi5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzUGFyZW50TGlzdCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFzc2lnbmluZyB0aGUgY29udHJvbCBuYW1lIG9mIHRoZSBmb3JtIGluc2lkZSB0aGUgcHJlZmFiIHdpdGggdGhlIHByZWZhYiBuYW1lLlxuICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGhhcHBlbiBvbmx5IHdoZW4gdGhlcmUgaXMgb25seSBvbmUgZm9ybSBpbnNpZGUgcHJlZmFiLlxuICAgICAgICAgICAgLy8gV2UgZG8gbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhpcyB3aGVuIG11bHRpcGxlIGZvcm1zIGFyZSBpbnNpZGUgcHJlZmFiLlxuICAgICAgICAgICAgLy8gVGhpcyBzY2VuYXJpbyBoYXMgdG8gYmUgaGFuZGxlZCBieSBlbmQgdXNlciBieSBjaGFuZ2luZyBmb3JtIG5hbWVzIGluIHByZWZhYiBhY2NvcmRpbmcgdG8gdGhlIGRhdGFtb2RlbCBiaW5kaW5nLlxuICAgICAgICAgICAgY29uc3QgcGFyZW50Q29udGFpbmVyID0gdGhpcy5wYXJlbnRQcmVmYWIgfHwgdGhpcy5wYXJlbnRQYXJ0aWFsO1xuICAgICAgICAgICAgaWYgKHBhcmVudENvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRDb250ZW50RWw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50UHJlZmFiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudENvbnRlbnRFbCA9IHBhcmVudENvbnRhaW5lci4kZWxlbWVudC5maW5kKCdbd21wcmVmYWJjb250YWluZXJdJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29udGVudEVsID0gcGFyZW50Q29udGFpbmVyLiRlbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBhc3NpZ25pbmcgdGhlIGZvcm0gbmFtZSB0byB0aGUgcGFyZW50Q29udGFpbmVyIG5hbWUgaS5lLiBwYXJ0aWFsIG5hbWUgb3IgcGVyZmFiIG5hbWUgYnkgZm9sbG93aW5nXG4gICAgICAgICAgICAgICAgICogMS4gcmV0cmlldmluZyBhbGwgdGhlIGZvcm1zIGluIHRoZSBwYXJlbnRDb250YWluZXJcbiAgICAgICAgICAgICAgICAgKiAyLiBjb25zaWRlciB0aGUgZmlyc3QgZm9ybVxuICAgICAgICAgICAgICAgICAqIDMuIGlmIHRoaXMgZm9ybSBpcyBpbnNpZGUgbGlzdCBpLmUuIGFsc28gZmluZCBpZiB0aGlzIGxpc3QgaXMgYWxzbyBpbnNpZGUgdGhlIHBhcmVudENvbnRhaW5lciAocHJlZmFiIC8gcGFydGlhbClcbiAgICAgICAgICAgICAgICAgKiA0LiB0aGVuIGRvIG5vdCBjaGFuZ2UgdGhlIGZvcm0gbmFtZSB3aGVuIGZvcm0gaXMgaW5zaWRlIGxpc3QgYW5kIGFsc28gd2hlbiB0aGVyZSBhcmUgc2libGluZ3MgdG8gdGhlIGZvcm1cbiAgICAgICAgICAgICAgICAgKiA1LiB0aGlzIG1lYW5zIGZvcm0gbmFtZSBjaGFuZ2UgYXBwbGllcyBvbmx5IHdoZW4gdGhlcmUgaXMgc2luZ2xlIGZvcm0gKGltbWVkaWF0ZSBjaGlsZCkgaW5zaWRlIHRoZSBwYXJlbnRDb250YWluZXIuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3QgcHJlZmFiSW5uZXJGb3JtID0gcGFyZW50Q29udGVudEVsLmZpbmQoJ2Zvcm0nKS5maXJzdCgpO1xuICAgICAgICAgICAgICAgIGlmIChnZXQocHJlZmFiSW5uZXJGb3JtWzBdLCAnd2lkZ2V0LndpZGdldElkJykgPT09IHRoaXMud2lkZ2V0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciBmb3JtIGluc2lkZSBwcmVmYWIgY29udGFpbmVyIGlzIGluc2lkZSB0aGUgbGlzdC4gSWYgdHJ1ZSwgZG8gbm90IGNoYW5nZSB0aGUgbmFtZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVmYWJJbm5lckZvcm0uaXNQYXJlbnRMaXN0ICYmICFwcmVmYWJJbm5lckZvcm0uc2libGluZ3MoJ2Zvcm0nKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmcgPSBnZXQocGFyZW50Q29udGFpbmVyLCAnbmFtZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAxO1xuICAgICAgICAgICAgbGV0IGlubmVyQmluZGluZyA9IGJpbmRpbmc7XG4gICAgICAgICAgICAvLyBJbm5lciBmb3JtcyBtYXkgaGF2ZSBzYW1lIG5hbWVzLiBJZiBzYW1lIG5hbWUgaXMgcHJlc2VudCwgYXBwZW5kIHVucWl1ZSBpZGVudGlmaWVyXG4gICAgICAgICAgICB3aGlsZSAodGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5jb250cm9scy5oYXNPd25Qcm9wZXJ0eShpbm5lckJpbmRpbmcpKSB7XG4gICAgICAgICAgICAgICAgaW5uZXJCaW5kaW5nID0gYCR7YmluZGluZ31fJHtjb3VudGVyfWA7XG4gICAgICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBOYW1lID0gaW5uZXJCaW5kaW5nO1xuICAgICAgICAgICAgLy8gSWYgcGFyZW50IGZvcm0gaXMgcHJlc2VudCwgYWRkIHRoZSBjdXJyZW50IGZvcm0gYXMgYXMgZm9ybUdyb3VwIGZvciBwYXJlbnQgZm9ybVxuICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5hZGRDb250cm9sKGlubmVyQmluZGluZywgdGhpcy5uZ2Zvcm0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRXhwb3NlIHRoZSBldmVudHMgb24gY29udGV4dCBzbyB0aGF0IHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGJ5IGZvcm0gYWN0aW9uc1xuICAgIHByaXZhdGUgYWRkRXZlbnRzVG9Db250ZXh0KGNvbnRleHQpIHtcbiAgICAgICAgY29udGV4dC5jYW5jZWwgPSAoKSA9PiB0aGlzLmNhbmNlbCgpO1xuICAgICAgICBjb250ZXh0LnJlc2V0ID0gKCkgPT4gdGhpcy5yZXNldCgpO1xuICAgICAgICBjb250ZXh0LnNhdmUgPSBldnQgPT4gdGhpcy5zYXZlKGV2dCk7XG4gICAgICAgIGNvbnRleHQuc2F2ZUFuZE5ldyA9ICgpID0+IHRoaXMuc2F2ZUFuZE5ldygpO1xuICAgICAgICBjb250ZXh0LnNhdmVBbmRWaWV3ID0gKCkgPT4gdGhpcy5zYXZlQW5kVmlldygpO1xuICAgICAgICBjb250ZXh0LmRlbGV0ZSA9ICgpID0+IHRoaXMuZGVsZXRlKCk7XG4gICAgICAgIGNvbnRleHQubmV3ID0gKCkgPT4gdGhpcy5uZXcoKTtcbiAgICAgICAgY29udGV4dC5lZGl0ID0gKCkgPT4gdGhpcy5lZGl0KCk7XG4gICAgICAgIGNvbnRleHQuaGlnaGxpZ2h0SW52YWxpZEZpZWxkcyA9ICgpID0+IHRoaXMuaGlnaGxpZ2h0SW52YWxpZEZpZWxkcygpO1xuICAgICAgICBjb250ZXh0LmZpbHRlciA9ICgpID0+IHRoaXMuZmlsdGVyKCk7XG4gICAgICAgIGNvbnRleHQuY2xlYXJGaWx0ZXIgPSAoKSA9PiB0aGlzLmNsZWFyRmlsdGVyKCk7XG4gICAgICAgIGNvbnRleHQuc3VibWl0ID0gZXZ0ID0+IHRoaXMuc3VibWl0KGV2dCk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBtZXRob2QgZ2V0cyBhbGwgdGhlIGlubmVyIGZvcm1zIGFuZCB2YWxpZGF0ZXMgZWFjaCBmb3JtLlxuICAgIHByaXZhdGUgc2V0VmFsaWRhdGlvbk9uSW5uZXJGb3Jtcyh2YWxpZGF0ZVRvdWNoKSB7XG4gICAgICAgIGNvbnN0IGZvcm1FbGUgPSB0aGlzLmdldE5hdGl2ZUVsZW1lbnQoKTtcbiAgICAgICAgY29uc3QgZm9ybU9ianMgPSBmb3JtRWxlLnF1ZXJ5U2VsZWN0b3JBbGwoJy5hcHAtZm9ybScpO1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uTXNncyA9IFtdO1xuICAgICAgICBmb3JFYWNoKGZvcm1PYmpzLCBlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1JbnN0YW5jZSA9IChlIGFzIGFueSkud2lkZ2V0O1xuICAgICAgICAgICAgLy8gZGlmZmVyZW50aWF0aW5nIHRoZSB2YWxpZGF0aW9uTWVzc2FnZXMgcHJlZml4IGJhc2VkIG9uIHRoZSBmb3JtR3JvdXBOYW1lXG4gICAgICAgICAgICAvLyBhcyB0aGUgZm9ybU5hbWUncyBhcmUgc2FtZSB3aGVuIGZvcm1zIGFyZSBpbiBsaXN0XG4gICAgICAgICAgICBsZXQgZm9ybU5hbWUgPSBnZXQoZm9ybUluc3RhbmNlLCAnZm9ybUdyb3VwTmFtZScpIHx8IGZvcm1JbnN0YW5jZS5uYW1lO1xuICAgICAgICAgICAgaWYgKGlzRGVmaW5lZChmb3JtSW5zdGFuY2UuZm9ybUFycmF5SW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgZm9ybU5hbWUgPSBmb3JtTmFtZSArICdbJyArIGZvcm1JbnN0YW5jZS5mb3JtQXJyYXlJbmRleCArICddJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjdXJyZW50ID0gZm9ybUluc3RhbmNlO1xuICAgICAgICAgICAgd2hpbGUgKGdldChjdXJyZW50LCAncGFyZW50Rm9ybScpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudE5hbWUgPSBjdXJyZW50LnBhcmVudEZvcm0uZm9ybUdyb3VwTmFtZSB8fCBjdXJyZW50LnBhcmVudEZvcm0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5wYXJlbnRGb3JtLnBhcmVudEZvcm1BcnJheSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnROYW1lID0gcGFyZW50TmFtZSArICdbJyArIGN1cnJlbnQucGFyZW50Rm9ybS5mb3JtQXJyYXlJbmRleCArICddJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9ybU5hbWUgPSBwYXJlbnROYW1lICsgJy4nICsgZm9ybU5hbWU7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50Rm9ybTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbk9uRmllbGRzKGZvcm1JbnN0YW5jZSwgZm9ybU5hbWUsIHZhbGlkYXRlVG91Y2gpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHZhbGlkYXRpb24gb24gZm9ybUZpZWxkcy5cbiAgICAgKiBBcHBsaWVzIHRvIGlubmVyZm9ybSBhbmQgYWxzbyBzZXRzIGlubmVyZm9ybSB2YWxpZGF0aW9uIG9uIHBhcmVudCBmb3JtLlxuICAgICAqIEBwYXJhbSBwcmVmaXggY29udGFpbnMgdGhlIGZvcm0gbmFtZSwgd2hpY2ggYWxzbyBpbmNsdWRlcyBpdHMgcGFyZW50cyBmb3JtIG5hbWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbGlkYXRlVG91Y2hcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldFZhbGlkYXRpb25PbkZpZWxkcyhmb3JtOiBGb3JtQ29tcG9uZW50LCBwcmVmaXg6IHN0cmluZywgdmFsaWRhdGVUb3VjaD86IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgY29udHJvbHMgPSBmb3JtLm5nZm9ybS5jb250cm9scztcbiAgICAgICAgY29uc3QgZm9ybUZpZWxkcyA9IGZvcm0uZm9ybUZpZWxkcztcbiAgICAgICAgaWYgKCFmb3JtRmllbGRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yRWFjaChjb250cm9scywgKHYsIGspID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZm9ybUZpZWxkcy5maW5kKGUgPT4gZS5rZXkgPT09IGspO1xuICAgICAgICAgICAgaWYgKCFmaWVsZCB8fCAodmFsaWRhdGVUb3VjaCAmJiAhdi50b3VjaGVkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKT8uc2V0QXR0cmlidXRlKCdhcmlhLWludmFsaWQnLCB2LmludmFsaWQpO1xuICAgICAgICAgICAgLy8gaW52b2tpbmcgdGhlIHByZXBhcmVWYWxpZGF0aW9uIG9uIGJvdGggcGFyZW50IGZvcm0gYW5kIGN1cnJlbnQgZm9ybS5cbiAgICAgICAgICAgIHRoaXMucHJlcGFyZVZhbGlkYXRpb25PYmoodiwgaywgZmllbGQsIHByZWZpeCk7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVWYWxpZGF0aW9uT2JqLmNhbGwoZm9ybSwgdiwgaywgZmllbGQsIHByZWZpeCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFzc2lnbnMgLyB1cGRhdGVzIHZhbGlkYXRpb25NZXNzYWdlcyBiYXNlZCBvbiBhbmd1bGFyIGVycm9ycyBvbiBmaWVsZFxuICAgIHByaXZhdGUgcHJlcGFyZVZhbGlkYXRpb25PYmoodiwgaywgZmllbGQsIHByZWZpeCkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLmZpbmRJbmRleChlID0+IChlLmZpZWxkID09PSBrICYmIGUuZnVsbHlRdWFsaWZpZWRGb3JtTmFtZSA9PT0gcHJlZml4KSk7XG4gICAgICAgIGlmICh2LmludmFsaWQpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBmaWVsZCBjb250YWlucyB0aGUgZmllbGROYW1lXG4gICAgICAgICAgICAgICAgICogdmFsdWUgY29udGFpbnMgdGhlIGZpZWxkIHZhbHVlXG4gICAgICAgICAgICAgICAgICogZXJyb3JUeXBlIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGVycm9yc1xuICAgICAgICAgICAgICAgICAqIG1lc3NhZ2UgY29udGFpbnMgdGhlIHZhbGlkYXRpb24gbWVzc2FnZVxuICAgICAgICAgICAgICAgICAqIGdldEVsZW1lbnQgcmV0dXJucyB0aGUgZWxlbWVudCBoYXZpbmcgZm9jdXMtdGFyZ2V0XG4gICAgICAgICAgICAgICAgICogZm9ybU5hbWUgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZm9ybVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogayxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBlcnJvclR5cGU6IGtleXModi5lcnJvcnMpLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmaWVsZC52YWxpZGF0aW9ubWVzc2FnZSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgZ2V0RWxlbWVudDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLiRlbGVtZW50LmZpbmQoJ1tmb2N1cy10YXJnZXRdJyk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZvcm1OYW1lOiBsYXN0KHByZWZpeC5zcGxpdCgnLicpKSxcbiAgICAgICAgICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWRGb3JtTmFtZTogcHJlZml4XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzW2luZGV4XS52YWx1ZSA9IGZpZWxkLnZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzW2luZGV4XS5lcnJvclR5cGUgPSBrZXlzKHYuZXJyb3JzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh2LnZhbGlkICYmIGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGlzIHdpbGwgcmV0dXJuIGEgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGVycm9yIGRldGFpbHMgZnJvbSB0aGUgbGlzdCBvZiBmb3JtRmllbGRzIHRoYXQgYXJlIGludmFsaWRcbiAgICBwcml2YXRlIHNldFZhbGlkYXRpb25Nc2dzKHZhbGlkYXRlVG91Y2g/OiBib29sZWFuKSB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtRmllbGRzLmxlbmd0aCAmJiBpc0VtcHR5KHRoaXMubmdmb3JtLmNvbnRyb2xzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbk9uRmllbGRzKHRoaXMsIHRoaXMubmFtZSwgdmFsaWRhdGVUb3VjaCk7XG4gICAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbk9uSW5uZXJGb3Jtcyh2YWxpZGF0ZVRvdWNoKTtcbiAgICB9XG5cbiAgICAvLyBjaGFuZ2UgYW5kIGJsdXIgZXZlbnRzIGFyZSBhZGRlZCBmcm9tIHRoZSB0ZW1wbGF0ZVxuICAgIHByb3RlY3RlZCBoYW5kbGVFdmVudChub2RlOiBIVE1MRWxlbWVudCwgZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbiwgbG9jYWxzOiBhbnkpIHtcbiAgICAgICAgaWYgKGV2ZW50TmFtZSAhPT0gJ3N1Ym1pdCcpIHtcbiAgICAgICAgICAgIHN1cGVyLmhhbmRsZUV2ZW50KHRoaXMubmF0aXZlRWxlbWVudCwgZXZlbnROYW1lLCBjYWxsYmFjaywgbG9jYWxzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRmllbGRTb3VyY2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1kYXRhc291cmNlICYmIHRoaXMuZm9ybWRhdGFzb3VyY2UuZXhlY3V0ZShEYXRhU291cmNlLk9wZXJhdGlvbi5JU19BUElfQVdBUkUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtZGF0YXNvdXJjZSAmJiAhdGhpcy5mb3JtZGF0YXNvdXJjZS50d29XYXlCaW5kaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZm9ybUZpZWxkID0+IHtcbiAgICAgICAgICAgIGZvcm1GaWVsZC5zZXRGb3JtV2lkZ2V0KCdkYXRhdmFsdWVzb3VyY2UnLCB0aGlzLmZvcm1kYXRhc291cmNlKTtcbiAgICAgICAgICAgIGZvcm1GaWVsZC5zZXRGb3JtV2lkZ2V0KCdiaW5kZGF0YXZhbHVlJywgYCR7dGhpcy5iaW5kZm9ybWRhdGF9LiR7Zm9ybUZpZWxkLmtleX1gKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBtZXRob2QgbG9vcHMgdGhyb3VnaCB0aGUgZm9ybSBmaWVsZHMgYW5kIGhpZ2hsaWdodHMgdGhlIGludmFsaWQgZmllbGRzIGJ5IHNldHRpbmcgc3RhdGUgdG8gdG91Y2hlZFxuICAgIGhpZ2hsaWdodEludmFsaWRGaWVsZHMoKSB7XG4gICAgICAgIHNldFRvdWNoZWRTdGF0ZSh0aGlzLCB0aGlzLm5nZm9ybSwgJycpO1xuICAgIH1cblxuICAgIC8vIERpc2FibGUgdGhlIGZvcm0gc3VibWl0IGlmIGZvcm0gaXMgaW4gaW52YWxpZCBzdGF0ZS4gSGlnaGxpZ2h0IGFsbCB0aGUgaW52YWxpZCBmaWVsZHMgaWYgdmFsaWRhdGlvbiB0eXBlIGlzIGRlZmF1bHRcbiAgICB2YWxpZGF0ZUZpZWxkc09uU3VibWl0KCkge1xuICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25Nc2dzKCk7XG4gICAgICAgIC8vIERpc2FibGUgdGhlIGZvcm0gc3VibWl0IGlmIGZvcm0gaXMgaW4gaW52YWxpZCBzdGF0ZS4gRm9yIGRlbGV0ZSBvcGVyYXRpb24sIGRvIG5vdCBjaGVjayB0aGUgdmFsaWRhdGlvbi5cbiAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9uVHlwZSAhPT0gJ2RlbGV0ZScgJiYgKHRoaXMudmFsaWRhdGlvbnR5cGUgPT09ICdodG1sJyB8fCB0aGlzLnZhbGlkYXRpb250eXBlID09PSAnZGVmYXVsdCcpXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0uaW52YWxpZCkge1xuXG4gICAgICAgICAgICBpZiAodGhpcy5uZ2Zvcm0uaW52YWxpZCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXRpb250eXBlID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRJbnZhbGlkRmllbGRzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGludmFsaWQgdW50b2NoZWQgZWxlbWVudCBhbmQgc2V0IGl0IHRvIHRvdWNoZWQuXG4gICAgICAgICAgICAgICAgLy8gU2FmYXJpIGRvZXMgbm90IGZvcm0gdmFsaWRhdGlvbnMuIHRoaXMgd2lsbCBlbnN1cmUgdGhhdCBlcnJvciBpcyBzaG93biBmb3IgdXNlclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZUZvcm0gPSBmaW5kSW52YWxpZEVsZW1lbnQodGhpcy4kZWxlbWVudCwgdGhpcy5uZ2Zvcm0pO1xuICAgICAgICAgICAgICAgIGNvbnN0ICRpbnZhbGlkRm9ybSA9IGVsZUZvcm0ubmdGb3JtO1xuICAgICAgICAgICAgICAgIGxldCAkaW52YWxpZEVsZSAgPSBlbGVGb3JtLiRlbGU7XG4gICAgICAgICAgICAgICAgJGludmFsaWRFbGUgPSAkaW52YWxpZEVsZS5wYXJlbnQoKS5maW5kKCdbZm9jdXMtdGFyZ2V0XScpO1xuICAgICAgICAgICAgICAgIGlmICgkaW52YWxpZEVsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gc2F2ZSBjbGljayBpbiBwYWdlIGxheW91dCBsaXZlZm9ybSwgZm9jdXMgb2YgYXV0b2NvbXBsZXRlIHdpZGdldCBvcGVucyBmdWxsLXNjcmVlbiBzZWFyY2guXG4gICAgICAgICAgICAgICAgICAgIGlmICghJGludmFsaWRFbGUuaGFzQ2xhc3MoJ2FwcC1zZWFyY2gtaW5wdXQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGludmFsaWRFbGUuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZ0VsZSA9ICRpbnZhbGlkRm9ybSAmJiAkaW52YWxpZEZvcm0uY29udHJvbHNbJGludmFsaWRFbGUuYXR0cignZm9ybUNvbnRyb2xOYW1lJykgfHwgJGludmFsaWRFbGUuYXR0cignbmFtZScpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5nRWxlICYmIG5nRWxlLm1hcmtBc1RvdWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5nRWxlLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgb25Qcm9wZXJ0eUNoYW5nZShrZXksIG52LCBvdj8pIHtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ2NhcHRpb25hbGlnbic6XG4gICAgICAgICAgICAgICAgdGhpcy5jYXB0aW9uQWxpZ25DbGFzcyA9ICdhbGlnbi0nICsgbnY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjYXB0aW9ucG9zaXRpb24nOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TGF5b3V0Q29uZmlnKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjYXB0aW9ud2lkdGgnOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TGF5b3V0Q29uZmlnKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjYXB0aW9uc2l6ZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5jYXB0aW9uc2l6ZSA9IG52O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbm92YWxpZGF0ZSc6XG4gICAgICAgICAgICAgICAgLy8gIFNldCB2YWxpZGF0aW9uIHR5cGUgYmFzZWQgb24gdGhlIG5vdmFsaWRhdGUgcHJvcGVydHlcbiAgICAgICAgICAgICAgICB0aGlzLndpZGdldC52YWxpZGF0aW9udHlwZSA9IChudiA9PT0gdHJ1ZSB8fCBudiA9PT0gJ3RydWUnKSA/ICdub25lJyA6ICdkZWZhdWx0JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Zvcm1kYXRhJzpcbiAgICAgICAgICAgICAgICAvLyBGb3IgbGl2ZWxpc3Qgd2hlbiBtdWx0aXNlbGVjdCBpcyBlbmFibGVkLCBmb3JtZGF0YSB3aWxsIGJlIGFycmF5IG9mIG9iamVjdHMuIEluIHRoaXMgY2FzZSBjb25zaWRlciB0aGUgbGFzdCBvYmplY3QgYXMgZm9ybWRhdGEuXG4gICAgICAgICAgICAgICAgaWYgKGlzRXF1YWwobnYsIG92KSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXNBcnJheShudikgPyB0aGlzLnNldEZvcm1EYXRhKGxhc3QobnYpKSA6IHRoaXMuc2V0Rm9ybURhdGEobnYpO1xuICAgICAgICAgICAgICAgIC8vIGlmIGRhdGFzZXQgb24gdGhlIGZvcm1GaWVsZHMgYXJlIG5vdCBzZXQgYXMgdGhlIGRhdGFzb3VyY2VDaGFuZ2UgaXMgdHJpZ2dlcmVkIGJlZm9yZSB0aGUgZm9ybUZpZWxkcyBhcmUgcmVnaXN0ZXJlZC5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNEYXRhU291cmNlVXBkYXRlZCAmJiB0aGlzLmRhdGFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRhdGFTb3VyY2VDaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkZWZhdWx0bW9kZSc6XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGF5b3V0RGlhbG9nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudiAmJiBudiA9PT0gJ0VkaXQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU1vZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVNb2RlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1VwZGF0ZU1vZGUgPSB0aGlzLnVwZGF0ZU1vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF0YXNvdXJjZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5vbkRhdGFTb3VyY2VDaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Zvcm1kYXRhc291cmNlJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9uRm9ybURhdGFTb3VyY2VDaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21ldGFkYXRhJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRm9ybUZpZWxkcygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF0YXNldCc6XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybUZpZWxkcyA9IHRoaXMuZ2V0Rm9ybUZpZWxkcygpO1xuICAgICAgICAgICAgICAgIGZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeWluZyB0aGUgZGF0YXNldCBjaGFuZ2UgdG8gdGhlIGZvcm0tZmllbGQgd2lkZ2V0LlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmlzRGF0YVNldEJvdW5kICYmIGdldChmaWVsZC5mb3JtV2lkZ2V0LCAnZGF0YXNldCQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZm9ybVdpZGdldC5kYXRhc2V0JC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgc3VwZXIub25Qcm9wZXJ0eUNoYW5nZShrZXksIG52LCBvdik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFdmVudCBjYWxsYmFja3Mgb24gc3VjY2Vzcy9lcnJvclxuICAgIG9uUmVzdWx0Q2IoZGF0YSwgc3RhdHVzLCBldmVudD8pIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0geyRldmVudDogZXZlbnQsICRkYXRhOiBkYXRhLCAkb3BlcmF0aW9uOiB0aGlzLm9wZXJhdGlvblR5cGV9O1xuICAgICAgICAvLyB3aGV0aGVyIHNlcnZpY2UgY2FsbCBzdWNjZXNzIG9yIGZhaWx1cmUgY2FsbCB0aGlzIG1ldGhvZFxuICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3Jlc3VsdCcsIHBhcmFtcyk7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIC8vIGlmIHNlcnZpY2UgY2FsbCBpcyBzdWNjZXNzIGNhbGwgdGhpcyBtZXRob2RcbiAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc3VjY2VzcycsIHBhcmFtcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiBzZXJ2aWNlIGNhbGwgZmFpbHMgY2FsbCB0aGlzIG1ldGhvZFxuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdlcnJvcicsIHBhcmFtcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEaXNwbGF5IG9yIGhpZGUgdGhlIGlubGluZSBtZXNzYWdlLyB0b2FzdGVyXG4gICAgdG9nZ2xlTWVzc2FnZShzaG93OiBib29sZWFuLCBtc2c/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcsIGhlYWRlcj86IHN0cmluZykge1xuICAgICAgICBsZXQgdGVtcGxhdGU7XG4gICAgICAgIGlmIChzaG93ICYmIG1zZykge1xuICAgICAgICAgICAgdGVtcGxhdGUgPSAodHlwZSA9PT0gJ2Vycm9yJyAmJiB0aGlzLmVycm9ybWVzc2FnZSkgPyB0aGlzLmVycm9ybWVzc2FnZSA6IG1zZztcbiAgICAgICAgICAgIGlmICh0aGlzLm1lc3NhZ2VsYXlvdXQgPT09ICdJbmxpbmUnKSB7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLmNoZWNrQXBwU2VydmljZUVycm9yTXNnKHR5cGUpIHx8IHRlbXBsYXRlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSA9IHsnY2FwdGlvbic6IHRlbXBsYXRlIHx8ICcnLCB0eXBlOiB0eXBlfTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tZXNzYWdlUmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVJlZi5zaG93TWVzc2FnZSh0aGlzLnN0YXR1c01lc3NhZ2UuY2FwdGlvbiwgdGhpcy5zdGF0dXNNZXNzYWdlLnR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB3aGVuIG1lc3NhZ2UgbGF5b3V0IGlzIGlubGluZSBvbiBzYXZlLCBzY3JvbGwgdGhlIHZpZXcgdG8gdG9wIG9mIHRoZSBmb3JtIHRvIHNlZSB0aGUgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb25cbiAgICAgICAgICAgICAgICBpZiAoIWlzRWxlbWVudEluVmlld3BvcnQodGhpcy4kZWxlbWVudFswXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9FbGVtZW50KHRoaXMuJGVsZW1lbnRbMF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHAubm90aWZ5QXBwKHRlbXBsYXRlLCB0eXBlLCBoZWFkZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlLmNhcHRpb24gPSAnJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHRoZXJlIGlzIGFuIEFwcC5vblNlcnZpY2VFcnJvciBoYW5kbGVyIGZvciB0aGUgYXBwLCB0aGF0IG1lc3NhZ2Ugc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBzZXJ2ZXIgcmV0dXJuZWQgZXJyb3IgbWVzc2FnZVxuICAgIGNoZWNrQXBwU2VydmljZUVycm9yTXNnKHR5cGUpIHtcbiAgICAgICAgY29uc3Qgbm90aWZpY2F0aW9uQWN0aW9uID0gZ2V0KHRoaXMuYXBwLCAnQWN0aW9ucy5hcHBOb3RpZmljYXRpb24nKTtcbiAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkFjdGlvbiAmJiB0eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gbm90aWZpY2F0aW9uQWN0aW9uLmdldE1lc3NhZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSGlkZSB0aGUgaW5saW5lIG1lc3NhZ2UvIHRvYXN0ZXJcbiAgICBjbGVhck1lc3NhZ2UoKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlTWVzc2FnZShmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBjbGFzc2VzIG9uIHRoZSBmb3JtIGJhc2VkIG9uIHRoZSBjYXB0aW9ucG9zaXRpb24gYW5kIGNhcHRpb253aWR0aCBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBzZXRMYXlvdXRDb25maWcoKSB7XG4gICAgICAgIGxldCBsYXlvdXRDb25maWc7XG4gICAgICAgIGxheW91dENvbmZpZyA9IGdldEZpZWxkTGF5b3V0Q29uZmlnKHRoaXMuY2FwdGlvbndpZHRoLCB0aGlzLmNhcHRpb25wb3NpdGlvbiwgZ2V0KHRoaXMuYXBwLnNlbGVjdGVkVmlld1BvcnQsICdvcycpKTtcbiAgICAgICAgdGhpcy5fd2lkZ2V0Q2xhc3MgPSBsYXlvdXRDb25maWcud2lkZ2V0Q2xzO1xuICAgICAgICB0aGlzLl9jYXB0aW9uQ2xhc3MgPSBsYXlvdXRDb25maWcuY2FwdGlvbkNscztcblxuICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJGb3JtV2lkZ2V0KHdpZGdldCkge1xuICAgICAgICBjb25zdCBuYW1lID0gd2lkZ2V0Lm5hbWUgfHwgd2lkZ2V0LmtleTtcbiAgICAgICAgdGhpcy5mb3JtV2lkZ2V0c1tuYW1lXSA9IHdpZGdldDtcbiAgICB9XG5cbiAgICByZWdpc3RlckZvcm1GaWVsZHMoZm9ybUZpZWxkKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkQ291bnQgPSB0aGlzLmZvcm1GaWVsZHMucHVzaChmb3JtRmllbGQpO1xuICAgICAgICB0aGlzLmZvcm1maWVsZHNbZm9ybUZpZWxkLmtleV0gPSBmb3JtRmllbGQ7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJGb3JtV2lkZ2V0KGZvcm1GaWVsZCk7XG4gICAgICAgIHRoaXMuX2RlYm91bmNlZFVwZGF0ZUZpZWxkU291cmNlKCk7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudEZvcm0pIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5mb3JtRmllbGRzLnB1c2goZm9ybUZpZWxkKTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5mb3JtZmllbGRzW2Zvcm1GaWVsZC5rZXldID0gZm9ybUZpZWxkO1xuICAgICAgICAgICAgLy8gaW5uZXIgZm9ybWZpZWxkcyBhcmUgcHVzaGVkIHRvIHBhcmVudEZvcm0sIHBhc3NpbmcgY3VycmVudCBpbm5lckZvcm0ncyBmb3JtZGF0YSB0byBzZXQgaW5uZXJGb3JtZGF0YSB0byB0aGVzZSBpbm5lckZvcm1GaWVsZHNcbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5zZXRGb3JtRGF0YSh0aGlzLnBhcmVudEZvcm0uZm9ybWRhdGEsIHRoaXMuZm9ybUZpZWxkcywgdGhpcy5mb3JtZGF0YSB8fCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV01TLTE4OTY3OiBBcHBseWluZyBmb3JtYWRhdGEgYWZ0ZXIgZm9ybWZpZWxkcyBhcmUgcmVhZHlcbiAgICAgICAgaWYgKGZpZWxkQ291bnQgPT09IHRoaXMubnVtYmVyT2ZGaWVsZHMgJiYgIWlzRW1wdHkodGhpcy5mb3JtZGF0YSkpIHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhU291cmNlQ2hhbmdlKCk7XG4gICAgICAgICAgICBpc0FycmF5KHRoaXMuZm9ybWRhdGEpID8gdGhpcy5zZXRGb3JtRGF0YShsYXN0KHRoaXMuZm9ybWRhdGEpKSA6IHRoaXMuc2V0Rm9ybURhdGEodGhpcy5mb3JtZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWdpc3RlckFjdGlvbnMoZm9ybUFjdGlvbikge1xuICAgICAgICB0aGlzLmJ1dHRvbkFycmF5LnB1c2goZm9ybUFjdGlvbik7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBkYXRhb3V0cHV0IHdoZW5ldmVyIHRoZXJlIGlzIGEgY2hhbmdlIGluIGluc2lkZSBmb3JtIHdpZGdldCB2YWx1ZVxuICAgIHVwZGF0ZUZvcm1EYXRhT3V0cHV0KGRhdGFPYmplY3QpIHtcbiAgICAgICAgLy8gU2V0IHRoZSB2YWx1ZXMgb2YgdGhlIHdpZGdldHMgaW5zaWRlIHRoZSBsaXZlIGZvcm0gKG90aGVyIHRoYW4gZm9ybSBmaWVsZHMpIGluIGZvcm0gZGF0YVxuICAgICAgICBmb3JFYWNoKHRoaXMubmdmb3JtLnZhbHVlLCAodmFsLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghZmluZCh0aGlzLmZvcm1GaWVsZHMsIHtrZXl9KSkge1xuICAgICAgICAgICAgICAgIGRhdGFPYmplY3Rba2V5XSA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGF0YW91dHB1dCA9IGRhdGFPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gQ29uc3RydWN0IHRoZSBkYXRhIG9iamVjdCBtZXJnaW5nIHRoZSBmb3JtIGZpZWxkcyBhbmQgY3VzdG9tIHdpZGdldHMgZGF0YVxuICAgIGNvbnN0cnVjdERhdGFPYmplY3QoKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhICAgICA9IHt9O1xuICAgICAgICBjb25zdCBmb3JtRmllbGRzID0gdGhpcy5nZXRGb3JtRmllbGRzKCk7XG4gICAgICAgIC8vIEdldCBhbGwgZm9ybSBmaWVsZHMgYW5kIHByZXBhcmUgZm9ybSBkYXRhIGFzIGtleSB2YWx1ZSBwYWlyc1xuICAgICAgICBmb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgbGV0IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICBmaWVsZFZhbHVlO1xuICAgICAgICAgICAgZmllbGRWYWx1ZSA9IGZpZWxkLmRhdGF2YWx1ZSB8fCBmaWVsZC5fY29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgIGZpZWxkVmFsdWUgPSAoZmllbGRWYWx1ZSA9PT0gbnVsbCB8fCBmaWVsZFZhbHVlID09PSAnJykgPyB1bmRlZmluZWQgOiBmaWVsZFZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgICAgICAgZmllbGRWYWx1ZSA9IGdldEZpbGVzKHRoaXMubmFtZSwgZmllbGQua2V5ICsgJ19mb3JtV2lkZ2V0JywgZmllbGQubXVsdGlwbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmaWVsZE5hbWUgPSBmaWVsZC5rZXkgfHwgZmllbGQudGFyZ2V0IHx8IGZpZWxkLm5hbWU7XG5cbiAgICAgICAgICAgIC8vIG9uIGN1cnJlbnQgRm9ybSwgd2hlbiBmaWVsZCBpcyBpbm5lckZvcm0gZmllbGQgdGhlbiB3ZSBncm91cCB0aGVzZSBmaWVsZHMgdW5kZXIgbmV3IG9iamVjdCB1c2luZyBmb3JtR3JvdXBOYW1lIGFzIGtleVxuICAgICAgICAgICAgLy8gRm9yIHN1cHBvc2UsIGFwcGxpY2FudE5hbWUsIGFwcGxpY2FudElEIGFyZSBmb3JtZmllbGRzIGluIGN1cnJlbnRGb3JtXG4gICAgICAgICAgICAvLyBUaGlzIGZvcm0gaXMgaGF2aW5nIGlubmVyZm9ybSBpLmUuIGFkZHJlc3MsIHRoZXNlIGZpZWxkcyBhcmUgbGlzdGVkIGFzXG4gICAgICAgICAgICAvLyB7XCJhcHBsaWNhbnROYW1lXCI6IFwiXCIsIFwiYXBwbGljYW50SURcIjogXCJcIiwgXCJhZGRyZXNzXCI6IHtcInN0cmVldFwiOiBcIlwifX1cbiAgICAgICAgICAgIGlmIChmaWVsZC5mb3JtLndpZGdldElkICE9PSB0aGlzLndpZGdldElkICYmIGZpZWxkLmZvcm0uZm9ybUdyb3VwTmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZkID0gZ2V0KGZvcm1EYXRhLCBmaWVsZC5mb3JtLmZvcm1Hcm91cE5hbWUsIHt9KTtcbiAgICAgICAgICAgICAgICBmZFtmaWVsZE5hbWVdID0gZmllbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICBzZXQoZm9ybURhdGEsIGZpZWxkLmZvcm0uZm9ybUdyb3VwTmFtZSwgZmQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgodHlwZW9mIGZpZWxkLmZvcm0uZm9ybUFycmF5SW5kZXggPT09ICdudW1iZXInKSAmJiBmaWVsZC5mb3JtLmlzUGFyZW50TGlzdCAmJiAhdGhpcy5wYXJlbnRGb3JtKSB7IC8vIEZpeCBmb3IgW1dNUy0yNTgwNl06IHVzZSBmb3JtQXJyYXlJbmRleCBvbmx5IGlmIGZvcm0gaGFzIGEgcGFyZW50IGZvcm1cbiAgICAgICAgICAgICAgICAvLyBzZXR0aW5nIGZvcm1kYXRhIGJhc2VkIG9uIGZvcm1BcnJheUluZGV4XG4gICAgICAgICAgICAgICAgY29uc3QgZmQgPSBnZXQoZm9ybURhdGEsIGZpZWxkLmZvcm0ucGFyZW50TGlzdC5uYW1lLCBbXSk7XG4gICAgICAgICAgICAgICAgZmRbZmllbGQuZm9ybS5mb3JtQXJyYXlJbmRleF0gPSBmZFtmaWVsZC5mb3JtLmZvcm1BcnJheUluZGV4XSB8fCB7fTtcbiAgICAgICAgICAgICAgICBmZFtmaWVsZC5mb3JtLmZvcm1BcnJheUluZGV4XVtmaWVsZE5hbWVdID0gZmllbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICBzZXQoZm9ybURhdGEsIGZpZWxkLmZvcm0ucGFyZW50TGlzdC5uYW1lLCBmZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgdXBkYXRlIHRoZSBmaWVsZCB3aWxsIGJlIGFscmVhZHkgcHJlc2VudCBpbiBmb3JtIGRhdGFcbiAgICAgICAgICAgICAgICBzZXQoZm9ybURhdGEsIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1EYXRhT3V0cHV0KGZvcm1EYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YW91dHB1dDtcbiAgICB9XG5cbiAgICB1cGRhdGVEYXRhT3V0cHV0KCkge1xuICAgICAgICB0aGlzLmNvbnN0cnVjdERhdGFPYmplY3QoKTtcbiAgICAgICAgaWYgKHRoaXMubmdmb3JtLnRvdWNoZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbk1zZ3ModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGb3JtRmllbGRzIHdpbGwgY29udGFpbiBhbGwgdGhlIGZpZWxkcyBpbiBwYXJlbnQgYW5kIGlubmVyIGZvcm0gYWxzby5cbiAgICAvLyBUaGlzIHJldHVybnMgdGhlIGZvcm1GaWVsZHMgaW4gdGhlIGZvcm0gYmFzZWQgb24gdGhlIGZvcm0gbmFtZS5cbiAgICBnZXRGb3JtRmllbGRzKCkge1xuICAgICAgICByZXR1cm4gZmlsdGVyKHRoaXMuZm9ybUZpZWxkcywgZm9ybUZpZWxkID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtRmllbGQuZm9ybS5uYW1lID09PSB0aGlzLm5hbWU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldEZpZWxkVmFsdWUoZmllbGQsIGRhdGEsIGlubmVyRm9ybWRhdGE/KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGZpZWxkLmtleSB8fCBmaWVsZC5uYW1lO1xuICAgICAgICAvLyBpZiBjdXN0b21maWVsZCBwYXJhbSB2YWx1ZSBpcyBub3QgaW4gdGhlIGZvcm1kYXRhIHRoZW4gZG8gbm90IGFzc2lnbiBmaWVsZCB2YWx1ZVxuICAgICAgICAvLyBhcyBpdCBjYW4gY29udGFpbiBkZWZhdWx0IHZhbHVlIHdoaWNoIHdpbGwgYWdhaW4gYmUgb3ZlcnJpZGRlbiBieSB1bmRlZmluZWQuXG4gICAgICAgIGNvbnN0IGZkID0gaW5uZXJGb3JtZGF0YSA/IGlubmVyRm9ybWRhdGEgOiBkYXRhO1xuICAgICAgICBpZiAoZmQpIHtcbiAgICAgICAgICAgIGlmIChmZC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBnZXQoZmQsIGtleSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGluY2x1ZGVzKGtleSwgJy4nKSkge1xuICAgICAgICAgICAgICAgIC8vIGtleSBjb250YWlucyAnLicgd2hlbiBtYXBwaW5nIHRoZSBmaWVsZHMgdG8gY2hpbGQgcmVmZXJlbmNlIGkuZS4gY2hpbGRDb2wgaXMgaGF2aW5nIGtleSBhcyBcInBhcmVudC5jaGlsZENvbFwiXG4gICAgICAgICAgICAgICAgaWYgKGZkLmhhc093blByb3BlcnR5KHNwbGl0KGtleSwgJy4nKVswXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBnZXQoZmQsIGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV01TLTE4OTA2OiBGb3IgZGVmYXVsdCB2YWx1ZSwgZG8gbm90IG1hcmsgdGhlIGZvcm0gYXMgZGlydHkuXG4gICAgICAgICAgICBpZiAodGhpcy5kaXJ0eSAmJiAhdGhpcy5fdHJpZ2dlcmVkQnlVc2VyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvcm1Hcm91cE5hbWUgPSBmaWVsZC5mb3JtLmZvcm1Hcm91cE5hbWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBpZiBmb3JtR3JvdXBOYW1lIGlzIGRlZmluZWQgd2hpY2ggbWVhbnMgZmllbGQgaXMgaW5zaWRlIHRoZSBpbm5lciBmb3JtXG4gICAgICAgICAqIHRoZW4gc2V0IHRoZSBmb3JtZGF0YSBvbiB0aGUgZmllbGQncyBmb3JtIHVzaW5nIGZvcm1Hcm91cE5hbWVcbiAgICAgICAgICovXG4gICAgICAgIGlmIChmb3JtR3JvdXBOYW1lICYmIGdldChkYXRhLCBmb3JtR3JvdXBOYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YS5jYWxsKGZpZWxkLmZvcm0sIGRhdGFbZm9ybUdyb3VwTmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGZvcm1kYXRhIGlzIGFzc2lnbmVkIGxhdGVyIHRoZW4gb24gcHJvcGVydHlDaGFuZ2VIYW5kbGVyLCBldmVuIGlubmVyIGZvcm1zIGRhdGEgYWxzbyBuZWVkcyB0byBiZSB1cGRhdGVkLlxuICAgICAgICBpZiAoZ2V0KGZpZWxkLmZvcm0sICdwYXJlbnRGb3JtQXJyYXknKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YUZyb21QYXJlbnRGb3JtRGF0YS5jYWxsKGZpZWxkLmZvcm0sIGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0Rm9ybURhdGEoZGF0YSwgaW5uZXJGb3JtRmllbGRzPywgaW5uZXJGb3JtZGF0YT8pIHtcbiAgICAgICAgLy8gd2hlcmVhcyBmb3JtRmllbGRzIGV4cGxpY2l0bHkgcGFzc2VkIGNhbiBjb250YWluIGlubmVyZm9ybSBmaWVsZHMgYWxzby5cbiAgICAgICAgY29uc3QgZm9ybUZpZWxkcyA9IGlubmVyRm9ybUZpZWxkcyB8fCB0aGlzLmZvcm1GaWVsZHM7XG4gICAgICAgIGZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldEZpZWxkVmFsdWUoZmllbGQsIGRhdGEsIGlubmVyRm9ybWRhdGEpO1xuICAgICAgICAgICAgaWYgKGZpZWxkLmZpZWxkVmFsaWRhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5maWVsZFZhbGlkYXRpb25zLnNldEN1c3RvbVZhbGlkYXRpb25NZXNzYWdlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdERhdGFPYmplY3QoKTtcbiAgICB9XG5cbiAgICByZXNldEZvcm1TdGF0ZSgpIHtcbiAgICAgICAgLy8gY2xlYXJpbmcgdGhlIHZhbGlkYXRpb25NZXNzYWdlcyBvbiByZXNldC5cbiAgICAgICAgaWYgKHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMubmdmb3JtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZ2Zvcm0ubWFya0FzVW50b3VjaGVkKCk7XG4gICAgICAgIHRoaXMubmdmb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtU3RhdGUoKTtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgZmllbGQudmFsdWUgPSAnJztcbiAgICAgICAgICAgIGlmIChmaWVsZC53aWRnZXR0eXBlID09PSAndXBsb2FkJyB8fCBmaWVsZC50eXBlID09PSBEYXRhVHlwZS5CTE9CKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldEZpbGVVcGxvYWRXaWRnZXQoZmllbGQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmllbGQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpPy5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3REYXRhT2JqZWN0KCk7XG4gICAgICAgIHRoaXMuY2xlYXJNZXNzYWdlKCk7XG4gICAgfVxuXG4gICAgc2F2ZVByZXZmb3JtRmllbGRzKCkge1xuICAgICAgICB0aGlzLnByZXZmb3JtRmllbGRzID0gZ2V0Q2xvbmVkT2JqZWN0KHRoaXMuZm9ybUZpZWxkcy5tYXAoZmllbGQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAna2V5JzogZmllbGQua2V5LFxuICAgICAgICAgICAgICAgICd0eXBlJzogZmllbGQudHlwZSxcbiAgICAgICAgICAgICAgICAnd2lkZ2V0dHlwZSc6IGZpZWxkLndpZGdldHR5cGUsXG4gICAgICAgICAgICAgICAgJ291dHB1dGZvcm1hdCc6IGZpZWxkLm91dHB1dGZvcm1hdCxcbiAgICAgICAgICAgICAgICAndmFsdWUnOiBmaWVsZC52YWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNhdmVQcmV2RGF0YVZhbHVlcygpIHtcbiAgICAgICAgdGhpcy5wcmV2RGF0YVZhbHVlcyA9IHRoaXMuZm9ybUZpZWxkcy5tYXAoKG9iaikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsna2V5Jzogb2JqLmtleSwgJ3ZhbHVlJzogb2JqLnZhbHVlfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0UmVhZG9ubHlGaWVsZHMoKSB7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGZpZWxkLnNldFJlYWRPbmx5U3RhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVzZXRGaWxlVXBsb2FkV2lkZ2V0KGZpZWxkLCBza2lwVmFsdWVTZXQ/KSB7XG4gICAgICAgIGNvbnN0ICRmb3JtRWxlID0gdGhpcy4kZWxlbWVudDtcbiAgICAgICAgJGZvcm1FbGUuZmluZCgnW25hbWU9XCInICsgZmllbGQua2V5ICsgJ19mb3JtV2lkZ2V0XCJdJykudmFsKCcnKTtcbiAgICAgICAgZmllbGQuX2NvbnRyb2wucmVzZXQoKTtcbiAgICAgICAgaWYgKCFza2lwVmFsdWVTZXQpIHtcbiAgICAgICAgICAgIGZpZWxkLmhyZWYgPSAnJztcbiAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVtcHR5RGF0YU1vZGVsKCkge1xuICAgICAgICB0aGlzLmZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKGZpZWxkKSkge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSBEYXRhVHlwZS5CTE9CKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGaWxlVXBsb2FkV2lkZ2V0KGZpZWxkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC5kYXRhdmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldERlZmF1bHRWYWx1ZXMoKSB7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIHRoaXMub25GaWVsZERlZmF1bHRWYWx1ZUNoYW5nZShmaWVsZCwgZmllbGQuZGVmYXVsdHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0T3BlcmF0aW9uVHlwZShtb2RlKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9uVHlwZSA9IG1vZGUgfHwgJ2luc2VydCc7XG4gICAgfVxuXG4gICAgbmV3KCkge1xuICAgICAgICB0aGlzLnJlc2V0Rm9ybVN0YXRlKCk7XG4gICAgICAgIHRoaXMub3BlcmF0aW9uVHlwZSA9IExpdmVfT3BlcmF0aW9ucy5JTlNFUlQ7XG4gICAgICAgIHRoaXMuY2xlYXJNZXNzYWdlKCk7XG4gICAgICAgIGlmICh0aGlzLmlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZVByZXZmb3JtRmllbGRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbXB0eURhdGFNb2RlbCgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGVmYXVsdFZhbHVlcygpO1xuICAgICAgICAgICAgdGhpcy5zYXZlUHJldkRhdGFWYWx1ZXMoKTtcbiAgICAgICAgICAgIHRoaXMuY29uc3RydWN0RGF0YU9iamVjdCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pc1VwZGF0ZU1vZGUgPSB0cnVlO1xuICAgIH1cblxuICAgIGVkaXQoKSB7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtU3RhdGUoKTtcbiAgICAgICAgdGhpcy5jbGVhck1lc3NhZ2UoKTtcblxuICAgICAgICB0aGlzLm9wZXJhdGlvblR5cGUgPSBMaXZlX09wZXJhdGlvbnMuVVBEQVRFO1xuXG4gICAgICAgIGlmICh0aGlzLmlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZVByZXZmb3JtRmllbGRzKCk7XG4gICAgICAgICAgICB0aGlzLnNhdmVQcmV2RGF0YVZhbHVlcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJldkRhdGFPYmplY3QgPSBnZXRDbG9uZWRPYmplY3QodGhpcy5mb3JtZGF0YSB8fCB7fSk7XG5cbiAgICAgICAgdGhpcy5zZXRSZWFkb25seUZpZWxkcygpO1xuICAgICAgICB0aGlzLmlzVXBkYXRlTW9kZSA9IHRydWU7XG5cbiAgICAgICAgJGFwcERpZ2VzdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdHJpZ2dlcldNRXZlbnQoZXZlbnROYW1lKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlSWQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkZXBlbmRzb250YWJsZScpO1xuICAgICAgICBpZiAoIXRhYmxlSWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAkaW52b2tlV2F0Y2hlcnModHJ1ZSk7XG4gICAgICAgIHRoaXMuYXBwLm5vdGlmeSgnd20tZXZlbnQnLCB7ZXZlbnROYW1lLCB3aWRnZXROYW1lOiB0YWJsZUlkfSk7XG4gICAgfVxuXG4gICAgc3VibWl0Rm9ybSgkZXZlbnQpIHtcbiAgICAgICAgbGV0IHRlbXBsYXRlLCBmb3JtRGF0YSwgcmVzdWx0O1xuICAgICAgICBjb25zdCBkYXRhU291cmNlID0gdGhpcy5kYXRhc291cmNlO1xuICAgICAgICAvLyBEaXNhYmxlIHRoZSBmb3JtIHN1Ym1pdCBpZiBmb3JtIGlzIGluIGludmFsaWQgc3RhdGUuXG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRlRmllbGRzT25TdWJtaXQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybURhdGEgPSBnZXRDbG9uZWRPYmplY3QodGhpcy5jb25zdHJ1Y3REYXRhT2JqZWN0KCkpO1xuXG4gICAgICAgIGNvbnN0IGdldFBhcmFtcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7JGV2ZW50LCAkZm9ybURhdGE6IGZvcm1EYXRhLCAkZGF0YTogZm9ybURhdGF9O1xuICAgICAgICB9O1xuXG5cbiAgICAgICAgaWYgKHRoaXMub25CZWZvcmVTdWJtaXRFdnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2JlZm9yZXN1Ym1pdCcsIGdldFBhcmFtcygpKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtU3RhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9uU3VibWl0RXZ0IHx8IGRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIElmIG9uIHN1Ym1pdCBpcyB0aGVyZSBleGVjdXRlIGl0IGFuZCBpZiBpdCByZXR1cm5zIHRydWUgZG8gc2VydmljZSB2YXJpYWJsZSBpbnZva2UgZWxzZSByZXR1cm5cbiAgICAgICAgICAgIC8vIElmIGl0cyBhIHNlcnZpY2UgdmFyaWFibGUgY2FsbCBzZXRJbnB1dCBhbmQgYXNzaWduIGZvcm0gZGF0YSBhbmQgaW52b2tlIHRoZSBzZXJ2aWNlXG4gICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlTnVtID0gZGF0YVNvdXJjZS5wYWdpbmF0aW9uICYmIGRhdGFTb3VyY2UucGFnaW5hdGlvbi5udW1iZXIgKyAxO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wZXJhdGlvblR5cGUgPSB0aGlzLm9wZXJhdGlvblR5cGUgPyB0aGlzLm9wZXJhdGlvblR5cGUgOiAnaW5zZXJ0JztcbiAgICAgICAgICAgICAgICBwZXJmb3JtRGF0YU9wZXJhdGlvbihkYXRhU291cmNlLCBmb3JtRGF0YSwge29wZXJhdGlvblR5cGU6IG9wZXJhdGlvblR5cGV9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFTb3VyY2UuY2F0ZWdvcnkgPT09ICd3bS5DcnVkVmFyaWFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyV01FdmVudCgncmVzZXRFZGl0TW9kZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZS5leGVjdXRlKERhdGFTb3VyY2UuT3BlcmF0aW9uLkxJU1RfUkVDT1JEUywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2tpcFRvZ2dsZVN0YXRlJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wZXJhdGlvbic6ICdsaXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhZ2UnOiBjdXJyZW50UGFnZU51bSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZXZlbnRNaXNzaW5nT3BNc2cnOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlhbG9nSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZURpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0RlZmluZWQoZGF0YS5ib2R5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdldFZhbGlkSlNPTihkYXRhLmJvZHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzRGVmaW5lZChyZXN1bHQpID8gcmVzdWx0IDogZGF0YS5ib2R5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzdWx0JzogcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0dXMnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJzogdGhpcy5wb3N0bWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdzdWNjZXNzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuZXJyb3JtZXNzYWdlIHx8IGVycm9yLmVycm9yIHx8IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgJGFwcERpZ2VzdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzdWx0JzogZ2V0KGVycm9yLCAnZXJyb3InKSB8fCBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RhdHVzJzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnOiB0ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdlcnJvcidcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlc3BvbnNlLnR5cGUgPT09ICdlcnJvcicgJiYgIXRoaXMub25FcnJvcikgfHwgKHJlc3BvbnNlLnR5cGUgPT09ICdzdWNjZXNzJyAmJiAhdGhpcy5vblN1Y2Nlc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU1lc3NhZ2UodHJ1ZSwgcmVzcG9uc2UubWVzc2FnZSwgcmVzcG9uc2UudHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzdWJtaXQnLCBnZXRQYXJhbXMoKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25SZXN1bHRDYihyZXNwb25zZS5yZXN1bHQsIHJlc3BvbnNlLnN0YXR1cywgJGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzdWJtaXQnLCBnZXRQYXJhbXMoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5vblJlc3VsdENiKHt9LCB0cnVlLCAkZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vblJlc3VsdENiKHt9LCB0cnVlLCAkZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xvc2VEaWFsb2coKSB7XG4gICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5jbG9zZSh0aGlzLmRpYWxvZ0lkKTtcbiAgICB9XG5cbiAgICAvLyBNZXRob2QgdG8gc2hvdy9oaWRlIHRoZSBwYW5lbCBoZWFkZXIgb3IgZm9vdGVyIGJhc2VkIG9uIHRoZSBidXR0b25zXG4gICAgc2hvd0J1dHRvbnMocG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHNvbWUodGhpcy5idXR0b25BcnJheSwgYnRuID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpbmNsdWRlcyhidG4ucG9zaXRpb24sIHBvc2l0aW9uKSAmJiBidG4udXBkYXRlTW9kZSA9PT0gdGhpcy5pc1VwZGF0ZU1vZGU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEV4cGFuZCBvciBjb2xsYXBzZSB0aGUgcGFuZWxcbiAgICBleHBhbmRDb2xsYXBzZVBhbmVsKCkge1xuICAgICAgICBpZiAodGhpcy5jb2xsYXBzaWJsZSkge1xuICAgICAgICAgICAgLy8gZmxpcCB0aGUgYWN0aXZlIGZsYWdcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kZWQgPSAhdGhpcy5leHBhbmRlZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRGF0YVNvdXJjZVVwZGF0ZShyZXNwb25zZSwgbmV3Rm9ybSwgdXBkYXRlTW9kZSkge1xuICAgICAgICBpZiAobmV3Rm9ybSkge1xuICAgICAgICAgICAgdGhpcy5uZXcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Rm9ybURhdGEocmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZURpYWxvZygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNVcGRhdGVNb2RlID0gaXNEZWZpbmVkKHVwZGF0ZU1vZGUpID8gdXBkYXRlTW9kZSA6IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgdHJhbnZlcnNlcyB0aHJvdWdoIHRoZSBwYXJlbnQgY29udGFpbmluZyBmb3JtZGF0YSBhbmQgcmV0dXJucyB0aGUgcGFyZW50IGZvcm1kYXRhLlxuICAgICAqIEBwYXJhbSBmb3JtLCByZXByZXNlbnRzIHRoZSBjdXJyZW50IGZvcm0gaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIGdldE5lYXJlc3RQYXJlbnRGb3JtRGF0YShmb3JtKSB7XG4gICAgICAgIGlmICghZm9ybS5wYXJlbnRGb3JtKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3JtLmJpbmRmb3JtZGF0YSAmJiBnZXQoZm9ybS5wYXJlbnRGb3JtLCAnZm9ybWRhdGEnKSAmJiAhaXNFbXB0eShmb3JtLnBhcmVudEZvcm0uZm9ybWRhdGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybS5wYXJlbnRGb3JtLmZvcm1kYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldE5lYXJlc3RQYXJlbnRGb3JtRGF0YShmb3JtLnBhcmVudEZvcm0pO1xuICAgIH1cblxuICAgIHNldEZvcm1EYXRhRnJvbVBhcmVudEZvcm1EYXRhKGZvcm1kYXRhOiBhbnkpIHtcbiAgICAgICAgaWYgKGlzRW1wdHkodGhpcy5mb3JtZGF0YSkgJiYgdGhpcy5wYXJlbnRGb3JtICYmIGZvcm1kYXRhKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIElmIGZvcm0gaXMgaW5zaWRlIGxpc3QsXG4gICAgICAgICAgICAgKiAxLiBkaXJlY3RseSBhcHBseWluZyB0aGUgZm9ybWRhdGEgdG8gdGhlIGZvcm1BcnJheSB0byB1cGRhdGUgdGhlIGZvcm1kYXRhIG9uIGxpc3Qgb2YgZm9ybXMgdXNpbmcgcGF0Y2hWYWx1ZS5cbiAgICAgICAgICAgICAqIDIuIGFuZCBhbHNvIHNldHRpbmcgaW5kaXZpZHVhbCBmb3JtZGF0YSB0byB0aGUgZm9ybSBpbnNpZGUgZWFjaCBpdGVtIGJhc2VkIG9uIGZvcm1BcnJheUluZGV4LCB3aGVuIGZvcm0gaXMgbm90IGJvdW5kIHRvIGZvcm1kYXRhLlxuICAgICAgICAgICAgICogMy4gZXhwbGljaXRseSBpbnZva2luZyBmb3JtZGF0YSBhcyBmb3JtRmllbGRzIHdpbGwgY29udGFpbiBhbGwgdGhlIGZvcm1maWVsZHMgaW5jbHVkaW5nIGlubmVyRm9ybSdzIGZpZWxkc1xuICAgICAgICAgICAgICogKGlmIHdlIGRvIG5vdCBpbnZva2UgZXhwbGljaXRseSB0aGVuIGZvcm1GaWVsZHMgd2lsbCBqdXN0IGNvbnRhaW4gdGhlIGZpZWxkcyBpbnNpZGUgY3VycmVudCBmb3JtIGFuZCBub3QgaW5uZXIgZm9ybSBmaWVsZHMpXG4gICAgICAgICAgICAgKiA0LiBpZiBjaGlsZEZvcm1BcnJheURhdGEgaXMgbm90IGF2YWlsYWJsZSB3ZSB3aWxsIGNoZWNrIGZvciBpbm5lciBmb3JtIGRhdGEgdXNpbmcgXCJmb3JtR3JvdXBOYW1lXCIgYW5kIHdpbGwgc2V0IHRoZSBpbm5lcmZvcm0gZGF0YVxuICAgICAgICAgICAgICogSWYgbm90IGluc2lkZSBsaXN0LCBqdXN0IHNldCB0aGUgZm9ybWRhdGEgb24gYWxsIHRoZSBmb3JtZmllbGRzIGluY2x1ZGluZyBpbm5lckZvcm0gZmllbGRzXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudEZvcm1BcnJheSkge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZEZvcm1BcnJheURhdGEgPSBnZXQoZm9ybWRhdGEsIHRoaXMucGFyZW50TGlzdC5uYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRGb3JtQXJyYXlEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNBcnJheShjaGlsZEZvcm1BcnJheURhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEZvcm1BcnJheURhdGEgPSBbY2hpbGRGb3JtQXJyYXlEYXRhXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudEZvcm1BcnJheS5wYXRjaFZhbHVlKGNoaWxkRm9ybUFycmF5RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5iaW5kZm9ybWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybWRhdGEgPSBjaGlsZEZvcm1BcnJheURhdGFbdGhpcy5mb3JtQXJyYXlJbmRleF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YSh0aGlzLmZvcm1kYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNQYXJlbnRMaXN0ICYmIHRoaXMucGFyZW50Rm9ybS5mb3JtR3JvdXBOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEZvcm1EYXRhID0gZ2V0KGZvcm1kYXRhLCB0aGlzLnBhcmVudEZvcm0uZm9ybUdyb3VwTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9ybURhdGFGcm9tUGFyZW50Rm9ybURhdGEocGFyZW50Rm9ybURhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YShmb3JtZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPbiBmb3JtIGRhdGEgc291cmNlIGNoYW5nZS4gVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBsaXZlIGZvcm0gYW5kIGxpdmUgZmlsdGVyXG4gICAgb25EYXRhU291cmNlQ2hhbmdlKCkge1xuICAgICAgICBpZiAoZ2V0KHRoaXMuZm9ybUZpZWxkcywgJ2xlbmd0aCcpICYmICF0aGlzLmJpbmRmb3JtZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5pc0RhdGFTb3VyY2VVcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogZm9ybWRhdGEgb24gdGhlIHBhcmVudCBmb3JtIHdpbGwgYmUgc2V0IGJlZm9yZSB0aGUgaW5uZXIgZm9ybXMgYXJlIHJlbmRlcmVkLlxuICAgICAgICAgICAgICogSGVuY2UgaGFuZGxpbmcgZm9ybWRhdGEgb24gdGhlIGlubmVyRm9ybXMsIHdoaWNoIG1pZ2h0IGJlIHJlbmRlcmVkIHNsb3dseSAoc3VwcG9zZSBwcmVmYWIgd2l0aCBmb3JtKVxuICAgICAgICAgICAgICogc2V0dGluZyBpbm5lciBmb3JtJ3MgZm9ybWRhdGEgb2J0YWluZWQgZnJvbSBwYXJlbnQgZm9ybWRhdGFcbiAgICAgICAgICAgICAqIHRoaXMgYXBwbGllcyBvbmx5IHdoZW4gZm9ybWRhdGEgaXMgbm90IGdpdmVuIG9uIHRoZSBpbm5lciBmb3JtLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBmb3JtZGF0YSA9IHRoaXMuZ2V0TmVhcmVzdFBhcmVudEZvcm1EYXRhKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YUZyb21QYXJlbnRGb3JtRGF0YShmb3JtZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPbiBmb3JtIGRhdGEgc291cmNlIGNoYW5nZS4gVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBsaXZlIGZvcm0gYW5kIGxpdmUgZmlsdGVyXG4gICAgb25Gb3JtRGF0YVNvdXJjZUNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVGaWVsZFNvdXJjZSgpO1xuICAgIH1cblxuICAgIC8vIE9uIGZvcm0gZmllbGQgZGVmYXVsdCB2YWx1ZSBjaGFuZ2UuIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgbGl2ZSBmb3JtIGFuZCBsaXZlIGZpbHRlclxuICAgIG9uRmllbGREZWZhdWx0VmFsdWVDaGFuZ2UoZmllbGQsIG52KSB7XG4gICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VWYWx1ZUJ5VHlwZShudiwgdW5kZWZpbmVkLCBmaWVsZC53aWRnZXR0eXBlLCBmaWVsZC50cmFpbGluZ3plcm8pO1xuICAgICAgICAvLyBXTVMtMjI0MzQ6IEZvciBkZWZhdWx0IHZhbHVlIHNldCBvbiBpbmRpdmlkdWFsIGZvcm0gZmllbGRzLCBkbyBub3QgbWFyayB0aGUgZm9ybSBhcyBkaXJ0eS5cbiAgICAgICAgaWYgKHRoaXMuZGlydHkgJiYgIXRoaXMuX3RyaWdnZXJlZEJ5VXNlcikge1xuICAgICAgICAgICAgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gT24gZm9ybSBmaWVsZCB2YWx1ZSBjaGFuZ2UuIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgbGl2ZSBmb3JtIGFuZCBsaXZlIGZpbHRlclxuICAgIG9uRmllbGRWYWx1ZUNoYW5nZSgpIHtcbiAgICB9XG5cbiAgICAvLyBGdW5jdGlvbiB0byBnZW5lcmF0ZSBhbmQgY29tcGlsZSB0aGUgZm9ybSBmaWVsZHMgZnJvbSB0aGUgbWV0YWRhdGFcbiAgICBhc3luYyBnZW5lcmF0ZUZvcm1GaWVsZHMoKSB7XG4gICAgICAgIGxldCBub09mQ29sdW1ucztcbiAgICAgICAgbGV0ICRncmlkTGF5b3V0O1xuICAgICAgICAvLyBDaGVjayBpZiBncmlkIGxheW91dCBpcyBwcmVzZW50IG9yIG5vdCBmb3IgZmlyc3QgdGltZVxuICAgICAgICBpZiAoaXNVbmRlZmluZWQodGhpcy5faXNHcmlkTGF5b3V0UHJlc2VudCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzR3JpZExheW91dFByZXNlbnQgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5wYW5lbC1ib2R5IFt3bWxheW91dGdyaWRdJykubGVuZ3RoID4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faXNHcmlkTGF5b3V0UHJlc2VudCkge1xuICAgICAgICAgICAgJGdyaWRMYXlvdXQgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5mb3JtLWVsZW1lbnRzIFt3bWxheW91dGdyaWRdJykuZmlyc3QoKTtcbiAgICAgICAgICAgIG5vT2ZDb2x1bW5zID0gTnVtYmVyKCRncmlkTGF5b3V0LmF0dHIoJ2NvbHVtbnMnKSkgfHwgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICRncmlkTGF5b3V0ID0gdGhpcy4kZWxlbWVudC5maW5kKCcuZm9ybS1lbGVtZW50cyAuZHluYW1pYy1mb3JtLWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgaWYgKCEkZ3JpZExheW91dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRlbGVtZW50LmZpbmQoJy5mb3JtLWVsZW1lbnRzJykucHJlcGVuZCgnPGRpdiBjbGFzcz1cImR5bmFtaWMtZm9ybS1jb250YWluZXJcIj48L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICAkZ3JpZExheW91dCA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLmZvcm0tZWxlbWVudHMgLmR5bmFtaWMtZm9ybS1jb250YWluZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vT2ZDb2x1bW5zID0gMTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2x1bW5XaWR0aCA9IDEyIC8gbm9PZkNvbHVtbnM7XG4gICAgICAgIGxldCBmaWVsZFRlbXBsYXRlID0gJyc7XG4gICAgICAgIGxldCBjb2xDb3VudCA9IDA7XG4gICAgICAgIGxldCBpbmRleDtcbiAgICAgICAgbGV0IHVzZXJGaWVsZHM7XG4gICAgICAgIGxldCBmaWVsZHMgPSB0aGlzLm1ldGFkYXRhID8gdGhpcy5tZXRhZGF0YS5kYXRhIHx8IHRoaXMubWV0YWRhdGEgOiBbXTtcblxuICAgICAgICB0aGlzLmZvcm1GaWVsZHMgPSBbXTsgLy8gZW1wdHkgdGhlIGZvcm0gZmllbGRzXG5cbiAgICAgICAgaWYgKGlzRW1wdHkoZmllbGRzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub25CZWZvcmVSZW5kZXJFdnQpIHtcbiAgICAgICAgICAgIHVzZXJGaWVsZHMgPSB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2JlZm9yZXJlbmRlcicsIHskbWV0YWRhdGE6IGZpZWxkc30pO1xuICAgICAgICAgICAgaWYgKHVzZXJGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBmaWVsZHMgPSB1c2VyRmllbGRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0FycmF5KGZpZWxkcykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChmaWVsZHNbY29sQ291bnRdKSB7XG4gICAgICAgICAgICBsZXQgY29sVG1wbCA9ICcnO1xuICAgICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbm9PZkNvbHVtbnM7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGRzW2NvbENvdW50XSkge1xuICAgICAgICAgICAgICAgICAgICBjb2xUbXBsICs9IHNldE1hcmt1cEZvckZvcm1GaWVsZChmaWVsZHNbY29sQ291bnRdLCBjb2x1bW5XaWR0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbENvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZFRlbXBsYXRlICs9IGA8d20tZ3JpZHJvdz4ke2NvbFRtcGx9PC93bS1ncmlkcm93PmA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2lzR3JpZExheW91dFByZXNlbnQpIHtcbiAgICAgICAgICAgIGZpZWxkVGVtcGxhdGUgPSBgPHdtLWxheW91dGdyaWQ+JHtmaWVsZFRlbXBsYXRlfTwvd20tbGF5b3V0Z3JpZD5gO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5keW5hbWljRm9ybVJlZi5jbGVhcigpO1xuXG4gICAgICAgIGlmICghdGhpcy5fZHluYW1pY0NvbnRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuX2R5bmFtaWNDb250ZXh0ID0gT2JqZWN0LmNyZWF0ZSh0aGlzLnZpZXdQYXJlbnQpO1xuICAgICAgICAgICAgdGhpcy5fZHluYW1pY0NvbnRleHQuZm9ybSA9IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9uZW50RmFjdG9yeVJlZiA9IGF3YWl0IHRoaXMuZHluYW1pY0NvbXBvbmVudFByb3ZpZGVyLmdldENvbXBvbmVudEZhY3RvcnlSZWYoXG4gICAgICAgICAgICAnYXBwLWZvcm0tZHluYW1pYy0nICsgdGhpcy53aWRnZXRJZCxcbiAgICAgICAgICAgIGZpZWxkVGVtcGxhdGUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbm9DYWNoZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0cmFuc3BpbGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmR5bmFtaWNGb3JtUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5UmVmLCAwLCB0aGlzLmluaik7XG4gICAgICAgIGV4dGVuZFByb3RvKGNvbXBvbmVudC5pbnN0YW5jZSwgdGhpcy5fZHluYW1pY0NvbnRleHQpO1xuICAgICAgICAkZ3JpZExheW91dFswXS5hcHBlbmRDaGlsZChjb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuc2V0Rm9ybURhdGEodGhpcy5mb3JtZGF0YSk7XG4gICAgfVxuXG4gICAgZ2V0IG1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZXJhdGlvblR5cGUgfHwgdGhpcy5maW5kT3BlcmF0aW9uVHlwZSgpO1xuICAgIH1cblxuICAgIGdldCBkaXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmdmb3JtICYmIHRoaXMubmdmb3JtLmRpcnR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGZvcm0gc3RhdGUgdG8gcHJpc3RpbmUgYnkgaW50ZXJuYWxseSBjYWxsaW5nIGFuZ3VsYXIgbWFya0FzUHJpc3RpbmUgbWV0aG9kIG9uIHRoZSBmb3JtXG4gICAgICogQHBhcmFtIHZhbHVlLCBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLCBtYXJrcyBhbGwgZGlyZWN0IGFuY2VzdG9ycy4gRGVmYXVsdCBpcyBmYWxzZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIG1hcmtBc1ByaXN0aW5lKHZhbHVlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5uZ2Zvcm0ubWFya0FzUHJpc3RpbmUoeyBvbmx5U2VsZjogdmFsdWUgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgZm9ybSBzdGF0ZSB0byBkaXJ0eSBieSBpbnRlcm5hbGx5IGNhbGxpbmcgYW5ndWxhciBtYXJrQXNEaXJ0eSBtZXRob2Qgb24gdGhlIGZvcm1cbiAgICAgKiBAcGFyYW0gdmFsdWUsIFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbWFya0FzRGlydHkodmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNEaXJ0eSh7IG9ubHlTZWxmOiB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICBnZXQgaW52YWxpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmdmb3JtICYmIHRoaXMubmdmb3JtLmludmFsaWQ7XG4gICAgfVxuXG4gICAgZ2V0IHRvdWNoZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5nZm9ybSAmJiB0aGlzLm5nZm9ybS50b3VjaGVkO1xuICAgIH1cblxuICAgIGdldCB2YWxpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmdmb3JtICYmIHRoaXMubmdmb3JtLnZhbGlkO1xuICAgIH1cblxuICAgIGdldCBwcmlzdGluZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmdmb3JtICYmIHRoaXMubmdmb3JtLnByaXN0aW5lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGZvcm0gc3RhdGUgdG8gdG91Y2hlZCBieSBpbnRlcm5hbGx5IGNhbGxpbmcgYW5ndWxhciBtYXJrQXNUb3VjaGVkIG1ldGhvZCBvbiB0aGUgZm9ybVxuICAgICAqIEBwYXJhbSB2YWx1ZSwgV2hlbiB0cnVlLCBtYXJrIG9ubHkgdGhpcyBjb250cm9sLiBXaGVuIGZhbHNlIG9yIG5vdCBzdXBwbGllZCwgbWFya3MgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2VcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBtYXJrQXNUb3VjaGVkKHZhbHVlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5uZ2Zvcm0ubWFya0FzVG91Y2hlZCh7IG9ubHlTZWxmOiB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBmb3JtIHN0YXRlIHRvIHVudG91Y2hlZCBieSBpbnRlcm5hbGx5IGNhbGxpbmcgYW5ndWxhciBtYXJrQXNVbnRvdWNoZWQgbWV0aG9kIG9uIHRoZSBmb3JtXG4gICAgICogQHBhcmFtIHZhbHVlLCBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLCBtYXJrcyBhbGwgZGlyZWN0IGFuY2VzdG9ycy4gRGVmYXVsdCBpcyBmYWxzZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIG1hcmtBc1VudG91Y2hlZCh2YWx1ZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubmdmb3JtLm1hcmtBc1VudG91Y2hlZCh7IG9ubHlTZWxmOiB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICBpbnZva2VBY3Rpb25FdmVudCgkZXZlbnQsIGV4cHJlc3Npb246IHN0cmluZykge1xuICAgICAgICBjb25zdCBmbiA9ICRwYXJzZUV2ZW50KGV4cHJlc3Npb24pO1xuICAgICAgICBmbih0aGlzLnZpZXdQYXJlbnQsIE9iamVjdC5hc3NpZ24odGhpcy5jb250ZXh0LCB7JGV2ZW50fSkpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICAvLyBvbiBmb3JtIGRlc3Ryb3ksIHJlbW92aW5nIHRoaXMgZm9ybSBmcm9tIHRoZSBwYXJlbnRGb3JtIHRvby5cbiAgICAgICAgY29uc3QgY29udHJvbHMgPSB0aGlzLnBhcmVudEZvcm0gJiYgZ2V0KHRoaXMucGFyZW50Rm9ybSwgJ25nZm9ybS5jb250cm9scycpO1xuICAgICAgICBpZiAoY29udHJvbHMpIHtcbiAgICAgICAgICAgIC8vIHdoZW4gY3VycmVudCBmb3JtIGlzIGluc2lkZSB0aGUgbGlzdCAoaS5lLiBpbmNhc2Ugb2YgZm9ybUFycmF5KS5cbiAgICAgICAgICAgIGlmIChnZXQodGhpcy5wYXJlbnRMaXN0LCAnbmFtZScpICYmIGNvbnRyb2xzLmhhc093blByb3BlcnR5KHRoaXMucGFyZW50TGlzdC5uYW1lKSkge1xuICAgICAgICAgICAgICAgIC8vZ2V0IHRoZSBpbmRleCBvZiBjdXJyZW50IGZvcm0gaW4gdGhlIGxpc3QgYW5kIHJlbW92ZSB0aGUgRm9ybUNvbnRyb2wgZnJvbSBGb3JtQXJyYXlcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGZpbmRJbmRleCh0aGlzLnBhcmVudExpc3QuZ2V0V2lkZ2V0cyh0aGlzLm5hbWUpLCB7d2lkZ2V0SWQ6IHRoaXMud2lkZ2V0SWR9KTtcbiAgICAgICAgICAgICAgICAoPEZvcm1BcnJheT50aGlzLnBhcmVudEZvcm0ubmdmb3JtLmNvbnRyb2xzW3RoaXMucGFyZW50TGlzdC5uYW1lXSkucmVtb3ZlQXQoaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gd2hlbiB3ZSBoYXZlIGZvcm1Hcm91cE5hbWUgc2V0IGkuZS4gbXVsdGlwbGUgZm9ybUluc3RhbmNlIHdpdGggY291bnRlciBhcHBlbmRlZCB0byBmb3JtTmFtZVxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybUdyb3VwTmFtZSAmJiBjb250cm9scy5oYXNPd25Qcm9wZXJ0eSh0aGlzLmZvcm1Hcm91cE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5yZW1vdmVDb250cm9sKHRoaXMuZm9ybUdyb3VwTmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0ucmVtb3ZlQ29udHJvbCh0aGlzLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICNjb250ZW50PjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLXRlbXBsYXRlPlxuXG5AaWYgKGZvcm1sYXlvdXQgPT09ICdwYWdlJykge1xuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFwiPjwvbmctY29udGFpbmVyPlxufSBAZWxzZSB7XG4gIEBpZiAoIWlzTGF5b3V0RGlhbG9nICYmICh0aXRsZSB8fCBzdWJoZWFkaW5nIHx8IGljb25jbGFzcyB8fCBzaG93QnV0dG9ucygnaGVhZGVyJykpKSB7XG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIj5cbiAgICAgIDxoMyBjbGFzcz1cInBhbmVsLXRpdGxlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICBAaWYgKGljb25jbGFzcykge1xuICAgICAgICAgICAgPGkgY2xhc3M9XCJhcHAtaWNvbiBwYW5lbC1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgW25nQ2xhc3NdPVwiaWNvbmNsYXNzXCI+PC9pPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZ1wiIFtpbm5lckhUTUxdPVwidGl0bGVcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb25cIiBbaW5uZXJIVE1MXT1cInN1YmhlYWRpbmdcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWFjdGlvbiBwYW5lbC1hY3Rpb25zIGJhc2ljLWJ0bi1ncnBcIj5cbiAgICAgICAgICBAZm9yIChidG4gb2YgYnV0dG9uQXJyYXkgfCBmaWx0ZXIgOiAncG9zaXRpb24nIDogJ2hlYWRlcic7IHRyYWNrIGJ0bjsgbGV0IGluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJ0bi53aWRnZXRUeXBlID09PSAnYnV0dG9uJyA/IGJ1dHRvblJlZiA6IGFuY2hvclJlZlwiXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7YnRuOmJ0bn1cIlxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldEluamVjdG9yXT1cImNyZWF0ZUN1c3RvbUluamVjdG9yKCdhY3Rpb25faGVhZGVyXycgKyBpbmRleCwge2J0bjpidG59KVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoY29sbGFwc2libGUpIHtcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXBwLWljb24gd2kgcGFuZWwtYWN0aW9uXCIgW3RpdGxlXT1cImV4cGFuZGVkPyAodGhpcy5hcHBMb2NhbGU/LkxBQkVMX0NPTExBUFNFfHwnQ29sbGFwc2UnKToodGhpcy5hcHBMb2NhbGU/LkxBQkVMX0VYUEFORHx8J0V4cGFuZCcpXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImV4cGFuZGVkID8gJ3dpLW1pbnVzJzogJ3dpLXBsdXMnXCIgKGNsaWNrKT1cImV4cGFuZENvbGxhcHNlUGFuZWwoKTtcIj48L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9oMz5cbiAgICA8L2Rpdj5cbiAgfVxuICA8ZGl2IGNsYXNzPVwicGFuZWwtYm9keVwiIFtuZ0NsYXNzXT1cInsnZm9ybS1lbGVtZW50cyc6IGlzTGF5b3V0RGlhbG9nLCAnZm9ybS1ib2R5JzogIWlzTGF5b3V0RGlhbG9nfVwiIFtjbGFzcy5oaWRkZW5dPVwiIWV4cGFuZGVkXCI+XG4gICAgQGlmICghIXN0YXR1c01lc3NhZ2UuY2FwdGlvbikge1xuICAgICAgPHAgd21NZXNzYWdlIFthdHRyLmFyaWEtaGlkZGVuXT1cIiFzdGF0dXNNZXNzYWdlLmNhcHRpb25cIiBbYXR0ci5hcmlhLWxhYmVsXT1cInN0YXR1c01lc3NhZ2UuY2FwdGlvblwiIGNhcHRpb24uYmluZD1cInN0YXR1c01lc3NhZ2UuY2FwdGlvblwiIHR5cGUuYmluZD1cInN0YXR1c01lc3NhZ2UudHlwZVwiPjwvcD5cbiAgICB9XG4gICAgPGRpdiBbbmdDbGFzc109XCJ7J2Zvcm0tZWxlbWVudHMnOiAhaXNMYXlvdXREaWFsb2csICdmb3JtLWNvbnRlbnQnOiBpc0xheW91dERpYWxvZ31cIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImJhc2ljLWJ0bi1ncnAgZm9ybS1hY3Rpb24gcGFuZWwtZm9vdGVyIGNsZWFyZml4XCIgW25nQ2xhc3NdPVwieydtb2RhbC1mb290ZXInOiBpc0xheW91dERpYWxvZ31cIiBbY2xhc3MuaGlkZGVuXT1cIiFleHBhbmRlZCB8fCAhc2hvd0J1dHRvbnMoJ2Zvb3RlcicpXCI+XG4gICAgICBAZm9yIChidG4gb2YgYnV0dG9uQXJyYXkgfCBmaWx0ZXIgOiAncG9zaXRpb24nIDogJ2Zvb3Rlcic7IHRyYWNrIGJ0bjsgbGV0IGluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJidG4ud2lkZ2V0VHlwZSA9PT0gJ2J1dHRvbicgPyBidXR0b25SZWYgOiBhbmNob3JSZWZcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7YnRuOmJ0bn1cIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0SW5qZWN0b3JdPVwiY3JlYXRlQ3VzdG9tSW5qZWN0b3IoJ2FjdGlvbl9mb290ZXJfJyArIGluZGV4LCB7YnRuOmJ0bn0pXCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbn1cblxuXG5cbjxuZy10ZW1wbGF0ZSAjYnV0dG9uUmVmIGxldC1idG49XCJidG5cIj5cbiAgPGJ1dHRvbiAgd21CdXR0b24gbmFtZT1cInt7YnRuLmtleX19XCIgY2FwdGlvbi5iaW5kPVwiYnRuLmRpc3BsYXlOYW1lXCIgY2xhc3MuYmluZD1cImJ0bi5jbGFzc1wiIGljb25jbGFzcy5iaW5kPVwiYnRuLmljb25jbGFzc1wiIHNob3cuYmluZD1cImJ0bi5zaG93XCJcbiAgICAoY2xpY2spPVwiaW52b2tlQWN0aW9uRXZlbnQoJGV2ZW50LCBidG4uYWN0aW9uKVwiIHR5cGUuYmluZD1cImJ0bi50eXBlXCIgaGludC5iaW5kPVwiYnRuLnRpdGxlXCIgc2hvcnRjdXRrZXkuYmluZD1cImJ0bi5zaG9ydGN1dGtleVwiIGRpc2FibGVkLmJpbmQ9XCJuZ2Zvcm0uc3RhdHVzID09PSAnUEVORElORycgfHwgYnRuLmRpc2FibGVkXCJcbiAgdGFiaW5kZXguYmluZD1cImJ0bi50YWJpbmRleFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiYnRuLmRpc3BsYXlOYW1lXCIgW2NsYXNzLmhpZGRlbl09XCJidG4udXBkYXRlTW9kZSA/ICFpc1VwZGF0ZU1vZGUgOiBpc1VwZGF0ZU1vZGVcIj48L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYW5jaG9yUmVmIGxldC1idG49XCJidG5cIj5cbiAgPGEgd21BbmNob3IgbmFtZT1cInt7YnRuLmtleX19XCIgY2FwdGlvbi5iaW5kPVwiYnRuLmRpc3BsYXlOYW1lXCIgY2xhc3MuYmluZD1cImJ0bi5jbGFzc1wiIGljb25jbGFzcy5iaW5kPVwiYnRuLmljb25jbGFzc1wiIHNob3cuYmluZD1cImJ0bi5zaG93XCJcbiAgICAoY2xpY2spPVwiaW52b2tlQWN0aW9uRXZlbnQoJGV2ZW50LCBidG4uYWN0aW9uKVwiIGhpbnQuYmluZD1cImJ0bi50aXRsZVwiIHNob3J0Y3V0a2V5LmJpbmQ9XCJidG4uc2hvcnRjdXRrZXlcIlxuICAgIGh5cGVybGluay5iaW5kPVwiYnRuLmh5cGVybGlua1wiIHRhcmdldC5iaW5kPVwiYnRuLnRhcmdldFwiXG4gIHRhYmluZGV4LmJpbmQ9XCJidG4udGFiaW5kZXhcIiBbY2xhc3MuaGlkZGVuXT1cImJ0bi51cGRhdGVNb2RlID8gIWlzVXBkYXRlTW9kZSA6IGlzVXBkYXRlTW9kZVwiPjwvYT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgI2R5bmFtaWNGb3JtPjwvbmctY29udGFpbmVyPlxuIl19