@seniorsistemas/angular-components 19.9.7 → 19.9.8-develop-5d2dfb27

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 (166) hide show
  1. package/card/lib/card/card.component.d.ts +6 -2
  2. package/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.d.ts +0 -1
  3. package/datepicker/README.md +6 -2
  4. package/datepicker/lib/datepicker/date-segment-input.d.ts +7 -1
  5. package/datepicker/lib/datepicker/datepicker.component.d.ts +137 -3
  6. package/dialog/lib/src/dialog/services/dialog.service.d.ts +2 -0
  7. package/esm2022/accordion/lib/accordion/components/accordion-panel/accordion-panel.component.mjs +3 -3
  8. package/esm2022/autocomplete/lib/autocomplete/autocomplete.component.mjs +8 -3
  9. package/esm2022/autocomplete/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +4 -3
  10. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.component.mjs +3 -3
  11. package/esm2022/breadcrumb/lib/dynamic-breadcrumb/dynamic-breadcrumb.component.mjs +4 -2
  12. package/esm2022/button/lib/button/button.component.mjs +3 -3
  13. package/esm2022/card/lib/card/card.component.mjs +13 -5
  14. package/esm2022/checkbox/lib/checkbox/checkbox.component.mjs +3 -3
  15. package/esm2022/checkbox-list/lib/checkbox-list/checkbox-list.component.mjs +3 -3
  16. package/esm2022/chips/lib/chips/chip-item/chip-item.component.mjs +3 -3
  17. package/esm2022/chips/lib/chips/chips/chips.component.mjs +3 -3
  18. package/esm2022/code-editor/lib/code-editor/infra/cores/codemirror-6/themes/sds-light/sds-light-style.mjs +3 -2
  19. package/esm2022/collapse-link/lib/collapse-link/collapse-link.component.mjs +3 -3
  20. package/esm2022/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.mjs +14 -9
  21. package/esm2022/datepicker/lib/datepicker/date-segment-input.mjs +19 -2
  22. package/esm2022/datepicker/lib/datepicker/datepicker.component.mjs +405 -38
  23. package/esm2022/dialog/lib/src/dialog/dialog.component.mjs +3 -3
  24. package/esm2022/dialog/lib/src/dialog/services/dialog.service.mjs +13 -1
  25. package/esm2022/drawer/lib/drawer/drawer.component.mjs +3 -3
  26. package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +3 -3
  27. package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +3 -3
  28. package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +6 -4
  29. package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +3 -3
  30. package/esm2022/dynamic-form/dynamic-form/form-field/fields/password/password-field.component.mjs +3 -3
  31. package/esm2022/dynamic-form/dynamic-form/form-field/fields/text/text-field.component.mjs +3 -3
  32. package/esm2022/editor/lib/editor/editor.component.mjs +3 -3
  33. package/esm2022/editor/lib/editor/toolbar-button/editor-toolbar-button.component.mjs +3 -3
  34. package/esm2022/fieldset/lib/fieldset/fieldset.component.mjs +3 -3
  35. package/esm2022/file-picker/lib/file-picker/file-picker.component.mjs +3 -3
  36. package/esm2022/gantt/lib/gantt/components/gantt/bar.mjs +2 -1
  37. package/esm2022/gantt/lib/gantt/gantt.component.mjs +3 -3
  38. package/esm2022/global-search/lib/global-search/global-search.component.mjs +16 -25
  39. package/esm2022/grid-menu/lib/grid-menu/components/grid-menu-item/grid-menu-item.component.mjs +3 -3
  40. package/esm2022/input-text/lib/input-text/input-text.directive.mjs +3 -3
  41. package/esm2022/lib/locale/fallback.mjs +40 -13
  42. package/esm2022/navigation-button/lib/navigation-button/navigation-button.component.mjs +3 -3
  43. package/esm2022/object-card/lib/object-card/object-card.component.mjs +3 -3
  44. package/esm2022/paginator/lib/paginator/paginator.component.mjs +3 -3
  45. package/esm2022/pin-code-field/lib/pin-code-field/pin-code-field.component.mjs +3 -3
  46. package/esm2022/radio-button/lib/radio-button/radio-button.component.mjs +4 -10
  47. package/esm2022/rating-scale/lib/rating-scale/rating-scale.component.mjs +3 -3
  48. package/esm2022/select/lib/select/select.component.mjs +3 -3
  49. package/esm2022/select-button/lib/select-button/components/select-button-item/select-button-item.component.mjs +3 -3
  50. package/esm2022/shared/lib/accessibility/datepicker-no-period-tab.directive.mjs +6 -6
  51. package/esm2022/side-sheet/lib/side-sheet/side-sheet.component.mjs +3 -3
  52. package/esm2022/slider/lib/slider/slider.component.mjs +67 -65
  53. package/esm2022/slider/lib/slider/slider.module.mjs +2 -2
  54. package/esm2022/split-button/lib/split-button/split-button.component.mjs +3 -3
  55. package/esm2022/star-rating/star-rating/star-rating.component.mjs +3 -3
  56. package/esm2022/stepper/lib/stepper/stepper.component.mjs +3 -3
  57. package/esm2022/switch/lib/switch/switch.component.mjs +5 -19
  58. package/esm2022/tabs/lib/tabs/tabs.component.mjs +3 -3
  59. package/esm2022/text-area/lib/text-area/text-area.component.mjs +3 -3
  60. package/esm2022/thumbnail/lib/thumbnail/thumbnail.component.mjs +10 -3
  61. package/esm2022/thumbnails/lib/thumbnails/components/thumbnail-item/thumbnail-item.component.mjs +3 -3
  62. package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +3 -3
  63. package/esm2022/tiered-menu/lib/tiered-menu/services/tiered-menu.global.service.mjs +4 -3
  64. package/esm2022/tile/lib/tile/tile.component.mjs +3 -3
  65. package/esm2022/tree/lib/tree/components/tree-node-item/tree-node-item.component.mjs +20 -3
  66. package/esm2022/workspace-switch/lib/workspace-switch/workspace-switch.component.mjs +3 -3
  67. package/fesm2022/seniorsistemas-angular-components-accordion.mjs +2 -2
  68. package/fesm2022/seniorsistemas-angular-components-accordion.mjs.map +1 -1
  69. package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs +10 -5
  70. package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs.map +1 -1
  71. package/fesm2022/seniorsistemas-angular-components-breadcrumb.mjs +5 -3
  72. package/fesm2022/seniorsistemas-angular-components-breadcrumb.mjs.map +1 -1
  73. package/fesm2022/seniorsistemas-angular-components-button.mjs +2 -2
  74. package/fesm2022/seniorsistemas-angular-components-button.mjs.map +1 -1
  75. package/fesm2022/seniorsistemas-angular-components-card.mjs +12 -4
  76. package/fesm2022/seniorsistemas-angular-components-card.mjs.map +1 -1
  77. package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs +2 -2
  78. package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs.map +1 -1
  79. package/fesm2022/seniorsistemas-angular-components-checkbox.mjs +2 -2
  80. package/fesm2022/seniorsistemas-angular-components-checkbox.mjs.map +1 -1
  81. package/fesm2022/seniorsistemas-angular-components-chips.mjs +4 -4
  82. package/fesm2022/seniorsistemas-angular-components-chips.mjs.map +1 -1
  83. package/fesm2022/seniorsistemas-angular-components-code-editor.mjs +2 -1
  84. package/fesm2022/seniorsistemas-angular-components-code-editor.mjs.map +1 -1
  85. package/fesm2022/seniorsistemas-angular-components-collapse-link.mjs +2 -2
  86. package/fesm2022/seniorsistemas-angular-components-collapse-link.mjs.map +1 -1
  87. package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs +13 -8
  88. package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs.map +1 -1
  89. package/fesm2022/seniorsistemas-angular-components-datepicker.mjs +422 -38
  90. package/fesm2022/seniorsistemas-angular-components-datepicker.mjs.map +1 -1
  91. package/fesm2022/seniorsistemas-angular-components-dialog.mjs +14 -2
  92. package/fesm2022/seniorsistemas-angular-components-dialog.mjs.map +1 -1
  93. package/fesm2022/seniorsistemas-angular-components-drawer.mjs +2 -2
  94. package/fesm2022/seniorsistemas-angular-components-drawer.mjs.map +1 -1
  95. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +13 -12
  96. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  97. package/fesm2022/seniorsistemas-angular-components-editor.mjs +4 -4
  98. package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -1
  99. package/fesm2022/seniorsistemas-angular-components-fieldset.mjs +2 -2
  100. package/fesm2022/seniorsistemas-angular-components-fieldset.mjs.map +1 -1
  101. package/fesm2022/seniorsistemas-angular-components-file-picker.mjs +2 -2
  102. package/fesm2022/seniorsistemas-angular-components-file-picker.mjs.map +1 -1
  103. package/fesm2022/seniorsistemas-angular-components-gantt.mjs +3 -2
  104. package/fesm2022/seniorsistemas-angular-components-gantt.mjs.map +1 -1
  105. package/fesm2022/seniorsistemas-angular-components-global-search.mjs +14 -23
  106. package/fesm2022/seniorsistemas-angular-components-global-search.mjs.map +1 -1
  107. package/fesm2022/seniorsistemas-angular-components-grid-menu.mjs +2 -2
  108. package/fesm2022/seniorsistemas-angular-components-grid-menu.mjs.map +1 -1
  109. package/fesm2022/seniorsistemas-angular-components-input-text.mjs +2 -2
  110. package/fesm2022/seniorsistemas-angular-components-input-text.mjs.map +1 -1
  111. package/fesm2022/seniorsistemas-angular-components-navigation-button.mjs +2 -2
  112. package/fesm2022/seniorsistemas-angular-components-navigation-button.mjs.map +1 -1
  113. package/fesm2022/seniorsistemas-angular-components-object-card.mjs +2 -2
  114. package/fesm2022/seniorsistemas-angular-components-object-card.mjs.map +1 -1
  115. package/fesm2022/seniorsistemas-angular-components-paginator.mjs +2 -2
  116. package/fesm2022/seniorsistemas-angular-components-paginator.mjs.map +1 -1
  117. package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs +2 -2
  118. package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs.map +1 -1
  119. package/fesm2022/seniorsistemas-angular-components-radio-button.mjs +3 -9
  120. package/fesm2022/seniorsistemas-angular-components-radio-button.mjs.map +1 -1
  121. package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs +2 -2
  122. package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs.map +1 -1
  123. package/fesm2022/seniorsistemas-angular-components-select-button.mjs +2 -2
  124. package/fesm2022/seniorsistemas-angular-components-select-button.mjs.map +1 -1
  125. package/fesm2022/seniorsistemas-angular-components-select.mjs +2 -2
  126. package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
  127. package/fesm2022/seniorsistemas-angular-components-shared.mjs +5 -5
  128. package/fesm2022/seniorsistemas-angular-components-shared.mjs.map +1 -1
  129. package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs +2 -2
  130. package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs.map +1 -1
  131. package/fesm2022/seniorsistemas-angular-components-slider.mjs +67 -65
  132. package/fesm2022/seniorsistemas-angular-components-slider.mjs.map +1 -1
  133. package/fesm2022/seniorsistemas-angular-components-split-button.mjs +2 -2
  134. package/fesm2022/seniorsistemas-angular-components-split-button.mjs.map +1 -1
  135. package/fesm2022/seniorsistemas-angular-components-star-rating.mjs +2 -2
  136. package/fesm2022/seniorsistemas-angular-components-star-rating.mjs.map +1 -1
  137. package/fesm2022/seniorsistemas-angular-components-stepper.mjs +2 -2
  138. package/fesm2022/seniorsistemas-angular-components-stepper.mjs.map +1 -1
  139. package/fesm2022/seniorsistemas-angular-components-switch.mjs +4 -18
  140. package/fesm2022/seniorsistemas-angular-components-switch.mjs.map +1 -1
  141. package/fesm2022/seniorsistemas-angular-components-tabs.mjs +2 -2
  142. package/fesm2022/seniorsistemas-angular-components-tabs.mjs.map +1 -1
  143. package/fesm2022/seniorsistemas-angular-components-text-area.mjs +2 -2
  144. package/fesm2022/seniorsistemas-angular-components-text-area.mjs.map +1 -1
  145. package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs +9 -2
  146. package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs.map +1 -1
  147. package/fesm2022/seniorsistemas-angular-components-thumbnails.mjs +2 -2
  148. package/fesm2022/seniorsistemas-angular-components-thumbnails.mjs.map +1 -1
  149. package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs +5 -4
  150. package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs.map +1 -1
  151. package/fesm2022/seniorsistemas-angular-components-tile.mjs +2 -2
  152. package/fesm2022/seniorsistemas-angular-components-tile.mjs.map +1 -1
  153. package/fesm2022/seniorsistemas-angular-components-tree.mjs +20 -3
  154. package/fesm2022/seniorsistemas-angular-components-tree.mjs.map +1 -1
  155. package/fesm2022/seniorsistemas-angular-components-workspace-switch.mjs +2 -2
  156. package/fesm2022/seniorsistemas-angular-components-workspace-switch.mjs.map +1 -1
  157. package/fesm2022/seniorsistemas-angular-components.mjs +39 -12
  158. package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
  159. package/global-search/lib/global-search/global-search.component.d.ts +7 -3
  160. package/package.json +1 -1
  161. package/radio-button/lib/radio-button/radio-button.component.d.ts +0 -1
  162. package/slider/lib/slider/slider.component.d.ts +25 -7
  163. package/styles.css +5 -0
  164. package/switch/lib/switch/switch.component.d.ts +0 -2
  165. package/thumbnail/lib/thumbnail/thumbnail.component.d.ts +1 -0
  166. package/tree/lib/tree/components/tree-node-item/tree-node-item.component.d.ts +4 -0
@@ -138,6 +138,13 @@ export class DateSegmentEngine {
138
138
  const segment = this.segments[this.activeIndex];
139
139
  return isEditableSegment(segment) ? segment.kind : null;
140
140
  }
141
+ /** Texto bruto (sem padding de sublinhado) do segmento ativo — usado pelo anúncio de acessibilidade. */
142
+ getActiveSegmentText() {
143
+ if (this.activeIndex === null)
144
+ return null;
145
+ const segment = this.segments[this.activeIndex];
146
+ return isEditableSegment(segment) ? segment.text : null;
147
+ }
141
148
  selectSegmentAt(charIndex) {
142
149
  let acc = 0;
143
150
  for (let i = 0; i < this.segments.length; i++) {
@@ -250,7 +257,11 @@ export class DateSegmentEngine {
250
257
  this.activeIndex = this.getFirstEditableIndex();
251
258
  this.freshEntry = true;
252
259
  }
253
- /** Incrementa/decrementa o segmento ativo, dando a volta (wrap) dentro do range válido. */
260
+ /**
261
+ * Incrementa/decrementa o segmento ativo, dando a volta (wrap) dentro do range válido.
262
+ * Exceção: ano vazio sempre pousa no ano atual do sistema na primeira seta (up ou down),
263
+ * em vez de 0000/9999 — só passa a incrementar/decrementar a partir da segunda seta.
264
+ */
254
265
  incrementActiveSegment(delta) {
255
266
  if (this.activeIndex === null)
256
267
  return;
@@ -261,6 +272,12 @@ export class DateSegmentEngine {
261
272
  this.setAmPm(segment.text === 'PM' ? 0 : 1);
262
273
  return;
263
274
  }
275
+ if (segment.kind === 'year' && !segment.text) {
276
+ segment.text = String(new Date().getFullYear()).padStart(segment.length, '0');
277
+ this.freshEntry = true;
278
+ this.reconcileDayIfNeeded(segment.kind);
279
+ return;
280
+ }
264
281
  const { min, max } = this.boundsFor(segment.kind);
265
282
  const range = max - min + 1;
266
283
  const current = segment.text ? parseInt(segment.text, 10) : delta > 0 ? min - 1 : min;
@@ -415,4 +432,4 @@ export class DateSegmentEngine {
415
432
  return new Date(year, month, day, hour ?? ref.getHours(), minute, second);
416
433
  }
417
434
  }
418
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1zZWdtZW50LWlucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2RhdGVwaWNrZXIvc3JjL2xpYi9kYXRlcGlja2VyL2RhdGUtc2VnbWVudC1pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUEyQkEsTUFBTSxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQztBQUNuRCxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUM5QixNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDdkIsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFDN0IsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQzNCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBRWpDLFNBQVMsaUJBQWlCLENBQUMsT0FBcUI7SUFDNUMsT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQztBQUN0QyxDQUFDO0FBRUQsb0dBQW9HO0FBQ3BHLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFjO0lBQzdDLE1BQU0sTUFBTSxHQUFrQixFQUFFLENBQUM7SUFDakMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLG9CQUFvQixDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDbkMsSUFBSSxLQUE2QixDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsU0FBUyxFQUFFLENBQUM7WUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENB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QyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVwRCxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDcEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxNQUFNLElBQUksR0FBRyxXQUFXLEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQztZQUN4QyxJQUFJLEdBQUcsSUFBSSxHQUFHLGtCQUFrQixDQUFDO1lBQ2pDLElBQUksSUFBSTtnQkFBRSxJQUFJLElBQUksa0JBQWtCLENBQUM7UUFDekMsQ0FBQztRQUVELE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUUsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgU2VnbWVudEtpbmQgPSAnZGF5JyB8ICdtb250aCcgfCAneWVhcicgfCAnaG91cicgfCAnbWludXRlJyB8ICdzZWNvbmQnIHwgJ2FtcG0nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRhYmxlU2VnbWVudFN0YXRlIHtcbiAgICBraW5kOiBTZWdtZW50S2luZDtcbiAgICBsZW5ndGg6IG51bWJlcjtcbiAgICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGl0ZXJhbFNlZ21lbnRTdGF0ZSB7XG4gICAga2luZDogJ2xpdGVyYWwnO1xuICAgIHRleHQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgU2VnbWVudFN0YXRlID0gRWRpdGFibGVTZWdtZW50U3RhdGUgfCBMaXRlcmFsU2VnbWVudFN0YXRlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlZ21lbnRFbmdpbmVDb25maWcge1xuICAgIG1vZGU6ICdkYXRlJyB8ICdtb250aCcgfCAndGltZScgfCAnZGF0ZXRpbWUnO1xuICAgIGRhdGVGb3JtYXQ6IHN0cmluZztcbiAgICBob3VyRm9ybWF0OiAnMTInIHwgJzI0JztcbiAgICBzaG93U2Vjb25kczogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEZvcm1hdFRva2VuIHtcbiAgICBraW5kOiAnZGF5JyB8ICdtb250aCcgfCAneWVhcicgfCAnbGl0ZXJhbCc7XG4gICAgcmF3OiBzdHJpbmc7XG59XG5cbmNvbnN0IERBVEVfRk9STUFUX1RPS0VOX1JFID0gL3l5eXl8eXl8TU18bW18ZGR8ZC9nO1xuY29uc3QgWUVBUl9TRUdNRU5UX0xFTkdUSCA9IDQ7XG5jb25zdCBTSE9SVF9TRUdNRU5UX0xFTkdUSCA9IDI7XG5jb25zdCBIT1VSU19QRVJfTUVSSURJRU0gPSAxMjtcbmNvbnN0IE1BWF9IT1VSXzI0ID0gMjM7XG5jb25zdCBNQVhfTUlOVVRFX1NFQ09ORCA9IDU5O1xuY29uc3QgR0VORVJJQ19NQVhfREFZID0gMzE7XG5jb25zdCBMRUFQX1JFRkVSRU5DRV9ZRUFSID0gMjAwMDtcblxuZnVuY3Rpb24gaXNFZGl0YWJsZVNlZ21lbnQoc2VnbWVudDogU2VnbWVudFN0YXRlKTogc2VnbWVudCBpcyBFZGl0YWJsZVNlZ21lbnRTdGF0ZSB7XG4gICAgcmV0dXJuIHNlZ21lbnQua2luZCAhPT0gJ2xpdGVyYWwnO1xufVxuXG4vKiogVG9rZW5pemEgdW0gYGRhdGVGb3JtYXRgIChleC46IGBkZC9NTS95eXl5YCwgYE1NL2RkL3l5YCkgZW0gdG9rZW5zIGRlIGRpYS9tw6pzL2FubyArIGxpdGVyYWlzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRva2VuaXplRGF0ZUZvcm1hdChmb3JtYXQ6IHN0cmluZyk6IEZvcm1hdFRva2VuW10ge1xuICAgIGNvbnN0IHRva2VuczogRm9ybWF0VG9rZW5bXSA9IFtdO1xuICAgIGxldCBsYXN0SW5kZXggPSAwO1xuICAgIERBVEVfRk9STUFUX1RPS0VOX1JFLmxhc3RJbmRleCA9IDA7XG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgIHdoaWxlICgobWF0Y2ggPSBEQVRFX0ZPUk1BVF9UT0tFTl9SRS5leGVjKGZvcm1hdCkpKSB7XG4gICAgICAgIGlmIChtYXRjaC5pbmRleCA+IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgdG9rZW5zLnB1c2goeyBraW5kOiAnbGl0ZXJhbCcsIHJhdzogZm9ybWF0LnNsaWNlKGxhc3RJbmRleCwgbWF0Y2guaW5kZXgpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhdyA9IG1hdGNoWzBdO1xuICAgICAgICBjb25zdCBraW5kID0gcmF3WzBdID09PSAneScgPyAneWVhcicgOiByYXdbMF0gPT09ICdkJyA/ICdkYXknIDogJ21vbnRoJztcbiAgICAgICAgdG9rZW5zLnB1c2goeyBraW5kLCByYXcgfSk7XG4gICAgICAgIGxhc3RJbmRleCA9IERBVEVfRk9STUFUX1RPS0VOX1JFLmxhc3RJbmRleDtcbiAgICB9XG4gICAgaWYgKGxhc3RJbmRleCA8IGZvcm1hdC5sZW5ndGgpIHtcbiAgICAgICAgdG9rZW5zLnB1c2goeyBraW5kOiAnbGl0ZXJhbCcsIHJhdzogZm9ybWF0LnNsaWNlKGxhc3RJbmRleCkgfSk7XG4gICAgfVxuICAgIHJldHVybiB0b2tlbnM7XG59XG5cbi8qKiBEaWFzIG5vIG3DqnMgKDEtMTIpLCBqw6EgcmVzb2x2ZW5kbyBmZXZlcmVpcm8vYW5vIGJpc3NleHRvIHZpYSByb2xsb3ZlciBuYXRpdm8gZG8gYERhdGVgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRheXNJbk1vbnRoKG1vbnRoOiBudW1iZXIsIHllYXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCAwKS5nZXREYXRlKCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGF0ZVNlZ21lbnRzKGRhdGVGb3JtYXQ6IHN0cmluZyk6IFNlZ21lbnRTdGF0ZVtdIHtcbiAgICByZXR1cm4gdG9rZW5pemVEYXRlRm9ybWF0KGRhdGVGb3JtYXQpLm1hcCgodG9rZW4pOiBTZWdtZW50U3RhdGUgPT4ge1xuICAgICAgICBpZiAodG9rZW4ua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4geyBraW5kOiAnbGl0ZXJhbCcsIHRleHQ6IHRva2VuLnJhdyB9O1xuICAgICAgICBpZiAodG9rZW4ua2luZCA9PT0gJ3llYXInKSByZXR1cm4geyBraW5kOiAneWVhcicsIGxlbmd0aDogWUVBUl9TRUdNRU5UX0xFTkdUSCwgdGV4dDogJycgfTtcbiAgICAgICAgaWYgKHRva2VuLmtpbmQgPT09ICdtb250aCcpIHJldHVybiB7IGtpbmQ6ICdtb250aCcsIGxlbmd0aDogU0hPUlRfU0VHTUVOVF9MRU5HVEgsIHRleHQ6ICcnIH07XG4gICAgICAgIHJldHVybiB7IGtpbmQ6ICdkYXknLCBsZW5ndGg6IFNIT1JUX1NFR01FTlRfTEVOR1RILCB0ZXh0OiAnJyB9O1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZE1vbnRoU2VnbWVudHMoZGF0ZUZvcm1hdDogc3RyaW5nKTogU2VnbWVudFN0YXRlW10ge1xuICAgIGNvbnN0IGFsbCA9IGJ1aWxkRGF0ZVNlZ21lbnRzKGRhdGVGb3JtYXQpO1xuICAgIGNvbnN0IGRheUlkeCA9IGFsbC5maW5kSW5kZXgoKHMpID0+IHMua2luZCA9PT0gJ2RheScpO1xuICAgIGlmIChkYXlJZHggPT09IC0xKSByZXR1cm4gYWxsO1xuICAgIGNvbnN0IGRyb3BJbmRleGVzID0gbmV3IFNldDxudW1iZXI+KFtkYXlJZHhdKTtcbiAgICBpZiAoYWxsW2RheUlkeCArIDFdPy5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgZHJvcEluZGV4ZXMuYWRkKGRheUlkeCArIDEpO1xuICAgIH0gZWxzZSBpZiAoYWxsW2RheUlkeCAtIDFdPy5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgZHJvcEluZGV4ZXMuYWRkKGRheUlkeCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gYWxsLmZpbHRlcigoXywgaSkgPT4gIWRyb3BJbmRleGVzLmhhcyhpKSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVGltZVNlZ21lbnRzKGhvdXJGb3JtYXQ6ICcxMicgfCAnMjQnLCBzaG93U2Vjb25kczogYm9vbGVhbik6IFNlZ21lbnRTdGF0ZVtdIHtcbiAgICBjb25zdCBzZWdtZW50czogU2VnbWVudFN0YXRlW10gPSBbXG4gICAgICAgIHsga2luZDogJ2hvdXInLCBsZW5ndGg6IFNIT1JUX1NFR01FTlRfTEVOR1RILCB0ZXh0OiAnJyB9LFxuICAgICAgICB7IGtpbmQ6ICdsaXRlcmFsJywgdGV4dDogJzonIH0sXG4gICAgICAgIHsga2luZDogJ21pbnV0ZScsIGxlbmd0aDogU0hPUlRfU0VHTUVOVF9MRU5HVEgsIHRleHQ6ICcnIH0sXG4gICAgXTtcbiAgICBpZiAoc2hvd1NlY29uZHMpIHtcbiAgICAgICAgc2VnbWVudHMucHVzaCh7IGtpbmQ6ICdsaXRlcmFsJywgdGV4dDogJzonIH0sIHsga2luZDogJ3NlY29uZCcsIGxlbmd0aDogU0hPUlRfU0VHTUVOVF9MRU5HVEgsIHRleHQ6ICcnIH0pO1xuICAgIH1cbiAgICBpZiAoaG91ckZvcm1hdCA9PT0gJzEyJykge1xuICAgICAgICBzZWdtZW50cy5wdXNoKHsga2luZDogJ2xpdGVyYWwnLCB0ZXh0OiAnICcgfSwgeyBraW5kOiAnYW1wbScsIGxlbmd0aDogU0hPUlRfU0VHTUVOVF9MRU5HVEgsIHRleHQ6ICcnIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc2VnbWVudHM7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2VnbWVudHNGb3IoY29uZmlnOiBTZWdtZW50RW5naW5lQ29uZmlnKTogU2VnbWVudFN0YXRlW10ge1xuICAgIHN3aXRjaCAoY29uZmlnLm1vZGUpIHtcbiAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICByZXR1cm4gYnVpbGREYXRlU2VnbWVudHMoY29uZmlnLmRhdGVGb3JtYXQpO1xuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRNb250aFNlZ21lbnRzKGNvbmZpZy5kYXRlRm9ybWF0KTtcbiAgICAgICAgY2FzZSAndGltZSc6XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRUaW1lU2VnbWVudHMoY29uZmlnLmhvdXJGb3JtYXQsIGNvbmZpZy5zaG93U2Vjb25kcyk7XG4gICAgICAgIGNhc2UgJ2RhdGV0aW1lJzpcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgLi4uYnVpbGREYXRlU2VnbWVudHMoY29uZmlnLmRhdGVGb3JtYXQpLFxuICAgICAgICAgICAgICAgIHsga2luZDogJ2xpdGVyYWwnLCB0ZXh0OiAnICcgfSxcbiAgICAgICAgICAgICAgICAuLi5idWlsZFRpbWVTZWdtZW50cyhjb25maWcuaG91ckZvcm1hdCwgY29uZmlnLnNob3dTZWNvbmRzKSxcbiAgICAgICAgICAgIF07XG4gICAgfVxufVxuXG4vKipcbiAqIEVuZ2luZSBkZSBzZWdtZW50b3MgKGRpYS9tw6pzL2Fuby9ob3JhL21pbnV0by9zZWd1bmRvL2FtcG0pIHBhcmEgbyB0cmlnZ2VyIGRvIGRhdGVwaWNrZXIuXG4gKiBTZW0gZGVwZW5kw6puY2lhcyBkZSBBbmd1bGFyIOKAlCBET00vQ1ZBIGZpY2FtIHBvciBjb250YSBkbyBjb21wb25lbnRlIHF1ZSBhIGNvbnNvbWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRlU2VnbWVudEVuZ2luZSB7XG4gICAgcHJpdmF0ZSBzZWdtZW50czogU2VnbWVudFN0YXRlW10gPSBbXTtcbiAgICBwcml2YXRlIGNvbmZpZzogU2VnbWVudEVuZ2luZUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgYWN0aXZlSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZnJlc2hFbnRyeSA9IHRydWU7XG5cbiAgICBjb25maWd1cmUoY29uZmlnOiBTZWdtZW50RW5naW5lQ29uZmlnKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLnNlZ21lbnRzID0gYnVpbGRTZWdtZW50c0Zvcihjb25maWcpO1xuICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gbnVsbDtcbiAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXREaXNwbGF5U3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzLm1hcCgocykgPT4gKGlzRWRpdGFibGVTZWdtZW50KHMpID8gdGhpcy5yZW5kZXJTZWdtZW50KHMpIDogcy50ZXh0KSkuam9pbignJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJTZWdtZW50KHNlZ21lbnQ6IEVkaXRhYmxlU2VnbWVudFN0YXRlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHNlZ21lbnQudGV4dCArICdfJy5yZXBlYXQoTWF0aC5tYXgoMCwgc2VnbWVudC5sZW5ndGggLSBzZWdtZW50LnRleHQubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWdtZW50UmVuZGVyTGVuZ3RoKHNlZ21lbnQ6IFNlZ21lbnRTdGF0ZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBpc0VkaXRhYmxlU2VnbWVudChzZWdtZW50KSA/IHNlZ21lbnQubGVuZ3RoIDogc2VnbWVudC50ZXh0Lmxlbmd0aDtcbiAgICB9XG5cbiAgICBnZXRTZWdtZW50UmFuZ2UoaW5kZXg6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHtcbiAgICAgICAgICAgIHN0YXJ0ICs9IHRoaXMuc2VnbWVudFJlbmRlckxlbmd0aCh0aGlzLnNlZ21lbnRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3N0YXJ0LCBzdGFydCArIHRoaXMuc2VnbWVudFJlbmRlckxlbmd0aCh0aGlzLnNlZ21lbnRzW2luZGV4XSldO1xuICAgIH1cblxuICAgIGdldEZpcnN0RWRpdGFibGVJbmRleCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWdtZW50cy5maW5kSW5kZXgoKHMpID0+IGlzRWRpdGFibGVTZWdtZW50KHMpKTtcbiAgICB9XG5cbiAgICBnZXRMYXN0RWRpdGFibGVJbmRleCgpOiBudW1iZXIge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zZWdtZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKGlzRWRpdGFibGVTZWdtZW50KHRoaXMuc2VnbWVudHNbaV0pKSByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgZ2V0QWN0aXZlSW5kZXgoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUluZGV4O1xuICAgIH1cblxuICAgIGFjdGl2ZUtpbmQoKTogU2VnbWVudEtpbmQgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlSW5kZXggPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBzZWdtZW50ID0gdGhpcy5zZWdtZW50c1t0aGlzLmFjdGl2ZUluZGV4XTtcbiAgICAgICAgcmV0dXJuIGlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpID8gc2VnbWVudC5raW5kIDogbnVsbDtcbiAgICB9XG5cbiAgICBzZWxlY3RTZWdtZW50QXQoY2hhckluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgYWNjID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSB0aGlzLnNlZ21lbnRSZW5kZXJMZW5ndGgodGhpcy5zZWdtZW50c1tpXSk7XG4gICAgICAgICAgICBpZiAoY2hhckluZGV4IDwgYWNjICsgbGVuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVhcmVzdEVkaXRhYmxlRnJvbShpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjYyArPSBsZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFzdEVkaXRhYmxlSW5kZXgoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5lYXJlc3RFZGl0YWJsZUZyb20oaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IHRoaXMuc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpc0VkaXRhYmxlU2VnbWVudCh0aGlzLnNlZ21lbnRzW2ldKSkgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFzdEVkaXRhYmxlSW5kZXgoKTtcbiAgICB9XG5cbiAgICBzZWxlY3RTZWdtZW50KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnNlZ21lbnRzLmxlbmd0aCB8fCAhaXNFZGl0YWJsZVNlZ21lbnQodGhpcy5zZWdtZW50c1tpbmRleF0pKSByZXR1cm47XG4gICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBzZWxlY3RGaXJzdFNlZ21lbnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0U2VnbWVudCh0aGlzLmdldEZpcnN0RWRpdGFibGVJbmRleCgpKTtcbiAgICB9XG5cbiAgICAvKiogQ29tbWl0YSAocGFkL2NsYW1wKSBvIHNlZ21lbnRvIGF0aXZvIGUgbW92ZSBwYXJhIG8gcHLDs3hpbW8vYW50ZXJpb3IgZWRpdMOhdmVsLiAqL1xuICAgIG1vdmVUb0FkamFjZW50U2VnbWVudChkaXJlY3Rpb246IDEgfCAtMSk6ICdtb3ZlZCcgfCAnYm91bmRhcnknIHtcbiAgICAgICAgdGhpcy5jb21taXRBY3RpdmVTZWdtZW50KCk7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm4gJ2JvdW5kYXJ5JztcbiAgICAgICAgbGV0IG5leHQgPSB0aGlzLmFjdGl2ZUluZGV4O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBuZXh0ICs9IGRpcmVjdGlvbjtcbiAgICAgICAgfSB3aGlsZSAobmV4dCA+PSAwICYmIG5leHQgPCB0aGlzLnNlZ21lbnRzLmxlbmd0aCAmJiAhaXNFZGl0YWJsZVNlZ21lbnQodGhpcy5zZWdtZW50c1tuZXh0XSkpO1xuICAgICAgICBpZiAobmV4dCA8IDAgfHwgbmV4dCA+PSB0aGlzLnNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gJ2JvdW5kYXJ5JztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdFNlZ21lbnQobmV4dCk7XG4gICAgICAgIHJldHVybiAnbW92ZWQnO1xuICAgIH1cblxuICAgIHR5cGVEaWdpdChkaWdpdDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpIHx8IHNlZ21lbnQua2luZCA9PT0gJ2FtcG0nKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmZyZXNoRW50cnkpIHtcbiAgICAgICAgICAgIHNlZ21lbnQudGV4dCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZ21lbnQudGV4dC5sZW5ndGggPj0gc2VnbWVudC5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgc2VnbWVudC50ZXh0ICs9IGRpZ2l0O1xuICAgICAgICBpZiAoc2VnbWVudC50ZXh0Lmxlbmd0aCA+PSBzZWdtZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jb21taXRBY3RpdmVTZWdtZW50KCk7XG4gICAgICAgICAgICB0aGlzLmF1dG9BZHZhbmNlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGF1dG9BZHZhbmNlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVJbmRleCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV4dCA9IHRoaXMuYWN0aXZlSW5kZXg7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIG5leHQgKz0gMTtcbiAgICAgICAgfSB3aGlsZSAobmV4dCA8IHRoaXMuc2VnbWVudHMubGVuZ3RoICYmICFpc0VkaXRhYmxlU2VnbWVudCh0aGlzLnNlZ21lbnRzW25leHRdKSk7XG4gICAgICAgIGlmIChuZXh0IDwgdGhpcy5zZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0U2VnbWVudChuZXh0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEFtUG0odmFsdWU6IDAgfCAxKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpIHx8IHNlZ21lbnQua2luZCAhPT0gJ2FtcG0nKSByZXR1cm47XG4gICAgICAgIHNlZ21lbnQudGV4dCA9IHZhbHVlID09PSAxID8gJ1BNJyA6ICdBTSc7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgfVxuXG4gICAgY2xlYXJBY3RpdmVTZWdtZW50KGtpbmQ6ICdiYWNrc3BhY2UnIHwgJ2RlbGV0ZScpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlSW5kZXggPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IHRoaXMuc2VnbWVudHNbdGhpcy5hY3RpdmVJbmRleF07XG4gICAgICAgIGlmICghaXNFZGl0YWJsZVNlZ21lbnQoc2VnbWVudCkpIHJldHVybjtcbiAgICAgICAgaWYgKHNlZ21lbnQudGV4dCA9PT0gJycpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSAnYmFja3NwYWNlJykge1xuICAgICAgICAgICAgICAgIGxldCBwcmV2ID0gdGhpcy5hY3RpdmVJbmRleDtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIHByZXYgLT0gMTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChwcmV2ID49IDAgJiYgIWlzRWRpdGFibGVTZWdtZW50KHRoaXMuc2VnbWVudHNbcHJldl0pKTtcbiAgICAgICAgICAgICAgICBpZiAocHJldiA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSBwcmV2O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyZXNoRW50cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2VnbWVudC50ZXh0ID0gJyc7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqIExpbXBhIHRvZG9zIG9zIHNlZ21lbnRvcyBlZGl0w6F2ZWlzICh1c2FkbyBxdWFuZG8gbyBjYW1wbyBpbnRlaXJvIGVzdMOhIHNlbGVjaW9uYWRvLCBleC46IEN0cmwrQSkuICovXG4gICAgY2xlYXJBbGwoKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiB0aGlzLnNlZ21lbnRzKSB7XG4gICAgICAgICAgICBpZiAoaXNFZGl0YWJsZVNlZ21lbnQoc2VnbWVudCkpIHNlZ21lbnQudGV4dCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSB0aGlzLmdldEZpcnN0RWRpdGFibGVJbmRleCgpO1xuICAgICAgICB0aGlzLmZyZXNoRW50cnkgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKiBJbmNyZW1lbnRhL2RlY3JlbWVudGEgbyBzZWdtZW50byBhdGl2bywgZGFuZG8gYSB2b2x0YSAod3JhcCkgZGVudHJvIGRvIHJhbmdlIHbDoWxpZG8uICovXG4gICAgaW5jcmVtZW50QWN0aXZlU2VnbWVudChkZWx0YTogMSB8IC0xKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpKSByZXR1cm47XG4gICAgICAgIGlmIChzZWdtZW50LmtpbmQgPT09ICdhbXBtJykge1xuICAgICAgICAgICAgdGhpcy5zZXRBbVBtKHNlZ21lbnQudGV4dCA9PT0gJ1BNJyA/IDAgOiAxKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSB0aGlzLmJvdW5kc0ZvcihzZWdtZW50LmtpbmQpO1xuICAgICAgICBjb25zdCByYW5nZSA9IG1heCAtIG1pbiArIDE7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBzZWdtZW50LnRleHQgPyBwYXJzZUludChzZWdtZW50LnRleHQsIDEwKSA6IGRlbHRhID4gMCA/IG1pbiAtIDEgOiBtaW47XG4gICAgICAgIGNvbnN0IG5leHQgPSAoKChjdXJyZW50ICsgZGVsdGEgLSBtaW4pICUgcmFuZ2UpICsgcmFuZ2UpICUgcmFuZ2UgKyBtaW47XG4gICAgICAgIHNlZ21lbnQudGV4dCA9IFN0cmluZyhuZXh0KS5wYWRTdGFydChzZWdtZW50Lmxlbmd0aCwgJzAnKTtcbiAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZWNvbmNpbGVEYXlJZk5lZWRlZChzZWdtZW50LmtpbmQpO1xuICAgIH1cblxuICAgIC8qKiBQYWQvY2xhbXAgZG8gc2VnbWVudG8gYXRpdm8gKGV4LjogXCIyXCIgLT4gXCIwMlwiLCBcIjQ1XCIgbm8gZGlhIC0+IGNsYW1wIHBhcmEgZGF5c0luTW9udGgpLiAqL1xuICAgIGNvbW1pdEFjdGl2ZVNlZ21lbnQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGtpbmQgPSBzZWdtZW50LmtpbmQ7XG4gICAgICAgIHNlZ21lbnQudGV4dCA9IHRoaXMuY2xhbXBBbmRQYWQoc2VnbWVudCk7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVjb25jaWxlRGF5SWZOZWVkZWQoa2luZCk7XG4gICAgfVxuXG4gICAgLyoqIENvbW1pdGEgbyBzZWdtZW50byBhdGl2byBlIHNhaSBkbyBtb2RvIGRlIGVkacOnw6NvICh1c2FkbyBubyBibHVyIGRvIGNhbXBvKS4gKi9cbiAgICBkZWFjdGl2YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbW1pdEFjdGl2ZVNlZ21lbnQoKTtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGFtcEFuZFBhZChzZWdtZW50OiBFZGl0YWJsZVNlZ21lbnRTdGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChzZWdtZW50LmtpbmQgPT09ICdhbXBtJyB8fCBzZWdtZW50LmtpbmQgPT09ICd5ZWFyJyB8fCAhc2VnbWVudC50ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gc2VnbWVudC50ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG51bSA9IHBhcnNlSW50KHNlZ21lbnQudGV4dCwgMTApO1xuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSB0aGlzLmJvdW5kc0ZvcihzZWdtZW50LmtpbmQpO1xuICAgICAgICBjb25zdCBjbGFtcGVkID0gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIG51bSkpO1xuICAgICAgICByZXR1cm4gU3RyaW5nKGNsYW1wZWQpLnBhZFN0YXJ0KHNlZ21lbnQubGVuZ3RoLCAnMCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYm91bmRzRm9yKGtpbmQ6IFNlZ21lbnRLaW5kKTogeyBtaW46IG51bWJlcjsgbWF4OiBudW1iZXIgfSB7XG4gICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtaW46IDEsIG1heDogdGhpcy5kYXlzSW5Nb250aE5vdygpIH07XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWluOiAxLCBtYXg6IEhPVVJTX1BFUl9NRVJJRElFTSB9O1xuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnPy5ob3VyRm9ybWF0ID09PSAnMTInXG4gICAgICAgICAgICAgICAgICAgID8geyBtaW46IDEsIG1heDogSE9VUlNfUEVSX01FUklESUVNIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7IG1pbjogMCwgbWF4OiBNQVhfSE9VUl8yNCB9O1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWluOiAwLCBtYXg6IE1BWF9NSU5VVEVfU0VDT05EIH07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB7IG1pbjogMCwgbWF4OiA5OTk5IH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCb3VuZCBkbyBkaWEgZGVwZW5kZW5kbyBkbyBxdWUgasOhIMOpIGNvbmhlY2lkbyBkZSBtw6pzL2Fuby4gTnVuY2EgXCJhZGl2aW5oYVwiIGNvbSBvIG3DqnMvYW5vXG4gICAgICogYXR1YWlzIGRvIHNpc3RlbWEg4oCUIGlzc28gZXN0cmVpdGFyaWEgbyByYW5nZSBhbnRlcyBkYSBob3JhIChleC46IGRpYT0yOSBkaWdpdGFkbyBhbnRlcyBkb1xuICAgICAqIGFubywgbcOqcz1mZXZlcmVpcm8gY29uaGVjaWRvIG1hcyBhbm8gYWluZGEgbsOjbyAtPiBzZSBhc3N1bWlzc2UgbyBhbm8gYXR1YWwgZG8gc2lzdGVtYSBlIGVsZVxuICAgICAqIG7Do28gZm9zc2UgYmlzc2V4dG8sIG8gZGlhIHNlcmlhIGNsYW1wYWRvIHBhcmEgMjggZSBudW5jYSBtYWlzIHJlZXhwYW5kaWRvIHBhcmEgMjkgbWVzbW8gcXVlXG4gICAgICogbyBhbm8gcmVhbG1lbnRlIGRpZ2l0YWRvIGRlcG9pcyBzZWphIGJpc3NleHRvKS4gRW0gdmV6IGRpc3NvLCBmaWNhIHNlbXByZSBubyBsYWRvIHBlcm1pc3Npdm9cbiAgICAgKiBhdMOpIHF1ZSBhIGluZm9ybWHDp8OjbyByZWFsbWVudGUgZXhpc3RhLlxuICAgICAqL1xuICAgIHByaXZhdGUgZGF5c0luTW9udGhOb3coKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbW9udGhTZWdtZW50ID0gdGhpcy5maW5kRWRpdGFibGUoJ21vbnRoJyk7XG4gICAgICAgIGNvbnN0IG1vbnRoS25vd24gPSAhIW1vbnRoU2VnbWVudD8udGV4dCAmJiBtb250aFNlZ21lbnQudGV4dC5sZW5ndGggPT09IG1vbnRoU2VnbWVudC5sZW5ndGg7XG4gICAgICAgIGlmICghbW9udGhTZWdtZW50IHx8ICFtb250aEtub3duKSByZXR1cm4gR0VORVJJQ19NQVhfREFZO1xuICAgICAgICBjb25zdCBtb250aCA9IHBhcnNlSW50KG1vbnRoU2VnbWVudC50ZXh0LCAxMCk7XG4gICAgICAgIGNvbnN0IHllYXJTZWdtZW50ID0gdGhpcy5maW5kRWRpdGFibGUoJ3llYXInKTtcbiAgICAgICAgY29uc3QgeWVhcktub3duID0gISF5ZWFyU2VnbWVudD8udGV4dCAmJiB5ZWFyU2VnbWVudC50ZXh0Lmxlbmd0aCA9PT0gWUVBUl9TRUdNRU5UX0xFTkdUSDtcbiAgICAgICAgaWYgKCF5ZWFyU2VnbWVudCB8fCAheWVhcktub3duKSByZXR1cm4gZGF5c0luTW9udGgobW9udGgsIExFQVBfUkVGRVJFTkNFX1lFQVIpO1xuICAgICAgICByZXR1cm4gZGF5c0luTW9udGgobW9udGgsIHBhcnNlSW50KHllYXJTZWdtZW50LnRleHQsIDEwKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWNvbmNpbGVEYXlJZk5lZWRlZChjb21taXR0ZWRLaW5kOiBTZWdtZW50S2luZCk6IHZvaWQge1xuICAgICAgICBpZiAoY29tbWl0dGVkS2luZCAhPT0gJ21vbnRoJyAmJiBjb21taXR0ZWRLaW5kICE9PSAneWVhcicpIHJldHVybjtcbiAgICAgICAgY29uc3QgZGF5U2VnbWVudCA9IHRoaXMuZmluZEVkaXRhYmxlKCdkYXknKTtcbiAgICAgICAgaWYgKCFkYXlTZWdtZW50IHx8IGRheVNlZ21lbnQudGV4dC5sZW5ndGggIT09IGRheVNlZ21lbnQubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMuZGF5c0luTW9udGhOb3coKTtcbiAgICAgICAgY29uc3QgZGF5TnVtID0gcGFyc2VJbnQoZGF5U2VnbWVudC50ZXh0LCAxMCk7XG4gICAgICAgIGlmIChkYXlOdW0gPiBtYXgpIHtcbiAgICAgICAgICAgIGRheVNlZ21lbnQudGV4dCA9IFN0cmluZyhtYXgpLnBhZFN0YXJ0KGRheVNlZ21lbnQubGVuZ3RoLCAnMCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRWRpdGFibGUoa2luZDogU2VnbWVudEtpbmQpOiBFZGl0YWJsZVNlZ21lbnRTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzLmZpbmQoKHMpOiBzIGlzIEVkaXRhYmxlU2VnbWVudFN0YXRlID0+IGlzRWRpdGFibGVTZWdtZW50KHMpICYmIHMua2luZCA9PT0ga2luZCk7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VnbWVudHMuZXZlcnkoKHMpID0+ICFpc0VkaXRhYmxlU2VnbWVudChzKSB8fCBzLnRleHQgPT09ICcnKTtcbiAgICB9XG5cbiAgICBpc0NvbXBsZXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWdtZW50cy5ldmVyeSgocykgPT4gIWlzRWRpdGFibGVTZWdtZW50KHMpIHx8IHMudGV4dC5sZW5ndGggPT09IHMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBsb2FkRnJvbURhdGUoZGF0ZTogRGF0ZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHRoaXMuc2VnbWVudHMpIHtcbiAgICAgICAgICAgIGlmIChpc0VkaXRhYmxlU2VnbWVudChzZWdtZW50KSkgc2VnbWVudC50ZXh0ID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgICAgIGlmICghZGF0ZSkgcmV0dXJuO1xuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgdGhpcy5zZWdtZW50cykge1xuICAgICAgICAgICAgaWYgKCFpc0VkaXRhYmxlU2VnbWVudChzZWdtZW50KSkgY29udGludWU7XG4gICAgICAgICAgICBzZWdtZW50LnRleHQgPSB0aGlzLnJlbmRlclZhbHVlRm9yKHNlZ21lbnQua2luZCwgZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlclZhbHVlRm9yKGtpbmQ6IFNlZ21lbnRLaW5kLCBkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KFNIT1JUX1NFR01FTlRfTEVOR1RILCAnMCcpO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoU0hPUlRfU0VHTUVOVF9MRU5HVEgsICcwJyk7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGRhdGUuZ2V0RnVsbFllYXIoKSkucGFkU3RhcnQoWUVBUl9TRUdNRU5UX0xFTkdUSCwgJzAnKTtcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5ID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWc/LmhvdXJGb3JtYXQgPT09ICcxMicgPyAoaCAlIEhPVVJTX1BFUl9NRVJJRElFTSA9PT0gMCA/IEhPVVJTX1BFUl9NRVJJRElFTSA6IGggJSBIT1VSU19QRVJfTUVSSURJRU0pIDogaDtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGRpc3BsYXkpLnBhZFN0YXJ0KFNIT1JUX1NFR01FTlRfTEVOR1RILCAnMCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGRhdGUuZ2V0TWludXRlcygpKS5wYWRTdGFydChTSE9SVF9TRUdNRU5UX0xFTkdUSCwgJzAnKTtcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhkYXRlLmdldFNlY29uZHMoKSkucGFkU3RhcnQoU0hPUlRfU0VHTUVOVF9MRU5HVEgsICcwJyk7XG4gICAgICAgICAgICBjYXNlICdhbXBtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRIb3VycygpIDwgSE9VUlNfUEVSX01FUklESUVNID8gJ0FNJyA6ICdQTSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQ29uc3Ryw7NpIG8gYERhdGVgIGEgcGFydGlyIGRvcyBzZWdtZW50b3M7IGBudWxsYCBlbnF1YW50byBpbmNvbXBsZXRvLiBVc2EgYHJlZmVyZW5jZURhdGVgIHBhcmEgcHJlZW5jaGVyIHBhcnRlcyBhdXNlbnRlcyAoZXguOiBob3JhIGFvIGVkaXRhciBzw7MgYSBkYXRhKS4gKi9cbiAgICB0b0RhdGUocmVmZXJlbmNlRGF0ZT86IERhdGUgfCBudWxsKTogRGF0ZSB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuaXNDb21wbGV0ZSgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVmID0gcmVmZXJlbmNlRGF0ZSA/PyBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBnZXROdW0gPSAoa2luZDogU2VnbWVudEtpbmQpOiBudW1iZXIgfCBudWxsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLmZpbmRFZGl0YWJsZShraW5kKTtcbiAgICAgICAgICAgIHJldHVybiBzZWdtZW50ID8gcGFyc2VJbnQoc2VnbWVudC50ZXh0LCAxMCkgOiBudWxsO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHllYXIgPSBnZXROdW0oJ3llYXInKSA/PyByZWYuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgY29uc3QgbW9udGhOdW0gPSBnZXROdW0oJ21vbnRoJyk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gbW9udGhOdW0gIT09IG51bGwgPyBtb250aE51bSAtIDEgOiByZWYuZ2V0TW9udGgoKTtcbiAgICAgICAgY29uc3QgZGF5ID0gdGhpcy5jb25maWc/Lm1vZGUgPT09ICdtb250aCcgPyAxIDogKGdldE51bSgnZGF5JykgPz8gcmVmLmdldERhdGUoKSk7XG5cbiAgICAgICAgbGV0IGhvdXIgPSBnZXROdW0oJ2hvdXInKTtcbiAgICAgICAgY29uc3QgbWludXRlID0gZ2V0TnVtKCdtaW51dGUnKSA/PyByZWYuZ2V0TWludXRlcygpO1xuICAgICAgICBjb25zdCBzZWNvbmQgPSBnZXROdW0oJ3NlY29uZCcpID8/IHJlZi5nZXRTZWNvbmRzKCk7XG5cbiAgICAgICAgaWYgKGhvdXIgIT09IG51bGwgJiYgdGhpcy5jb25maWc/LmhvdXJGb3JtYXQgPT09ICcxMicpIHtcbiAgICAgICAgICAgIGNvbnN0IGFtcG1TZWdtZW50ID0gdGhpcy5maW5kRWRpdGFibGUoJ2FtcG0nKTtcbiAgICAgICAgICAgIGNvbnN0IGlzUG0gPSBhbXBtU2VnbWVudD8udGV4dCA9PT0gJ1BNJztcbiAgICAgICAgICAgIGhvdXIgPSBob3VyICUgSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICAgICAgaWYgKGlzUG0pIGhvdXIgKz0gSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIgPz8gcmVmLmdldEhvdXJzKCksIG1pbnV0ZSwgc2Vjb25kKTtcbiAgICB9XG59XG4iXX0=
435
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1zZWdtZW50LWlucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2RhdGVwaWNrZXIvc3JjL2xpYi9kYXRlcGlja2VyL2RhdGUtc2VnbWVudC1pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUEyQkEsTUFBTSxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQztBQUNuRCxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUM5QixNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDdkIsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFDN0IsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQzNCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBRWpDLFNBQVMsaUJBQWlCLENBQUMsT0FBcUI7SUFDNUMsT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQztBQUN0QyxDQUFDO0FBRUQsb0dBQW9HO0FBQ3BHLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFjO0lBQzdDLE1BQU0sTUFBTSxHQUFrQixFQUFFLENBQUM7SUFDakMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLG9CQUFvQixDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDbkMsSUFBSSxLQUE2QixDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsU0FBUyxFQUFFLENBQUM7WUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENB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R0FBRyxFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzlFLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFNlZ21lbnRLaW5kID0gJ2RheScgfCAnbW9udGgnIHwgJ3llYXInIHwgJ2hvdXInIHwgJ21pbnV0ZScgfCAnc2Vjb25kJyB8ICdhbXBtJztcblxuZXhwb3J0IGludGVyZmFjZSBFZGl0YWJsZVNlZ21lbnRTdGF0ZSB7XG4gICAga2luZDogU2VnbWVudEtpbmQ7XG4gICAgbGVuZ3RoOiBudW1iZXI7XG4gICAgdGV4dDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpdGVyYWxTZWdtZW50U3RhdGUge1xuICAgIGtpbmQ6ICdsaXRlcmFsJztcbiAgICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFNlZ21lbnRTdGF0ZSA9IEVkaXRhYmxlU2VnbWVudFN0YXRlIHwgTGl0ZXJhbFNlZ21lbnRTdGF0ZTtcblxuZXhwb3J0IGludGVyZmFjZSBTZWdtZW50RW5naW5lQ29uZmlnIHtcbiAgICBtb2RlOiAnZGF0ZScgfCAnbW9udGgnIHwgJ3RpbWUnIHwgJ2RhdGV0aW1lJztcbiAgICBkYXRlRm9ybWF0OiBzdHJpbmc7XG4gICAgaG91ckZvcm1hdDogJzEyJyB8ICcyNCc7XG4gICAgc2hvd1NlY29uZHM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBGb3JtYXRUb2tlbiB7XG4gICAga2luZDogJ2RheScgfCAnbW9udGgnIHwgJ3llYXInIHwgJ2xpdGVyYWwnO1xuICAgIHJhdzogc3RyaW5nO1xufVxuXG5jb25zdCBEQVRFX0ZPUk1BVF9UT0tFTl9SRSA9IC95eXl5fHl5fE1NfG1tfGRkfGQvZztcbmNvbnN0IFlFQVJfU0VHTUVOVF9MRU5HVEggPSA0O1xuY29uc3QgU0hPUlRfU0VHTUVOVF9MRU5HVEggPSAyO1xuY29uc3QgSE9VUlNfUEVSX01FUklESUVNID0gMTI7XG5jb25zdCBNQVhfSE9VUl8yNCA9IDIzO1xuY29uc3QgTUFYX01JTlVURV9TRUNPTkQgPSA1OTtcbmNvbnN0IEdFTkVSSUNfTUFYX0RBWSA9IDMxO1xuY29uc3QgTEVBUF9SRUZFUkVOQ0VfWUVBUiA9IDIwMDA7XG5cbmZ1bmN0aW9uIGlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQ6IFNlZ21lbnRTdGF0ZSk6IHNlZ21lbnQgaXMgRWRpdGFibGVTZWdtZW50U3RhdGUge1xuICAgIHJldHVybiBzZWdtZW50LmtpbmQgIT09ICdsaXRlcmFsJztcbn1cblxuLyoqIFRva2VuaXphIHVtIGBkYXRlRm9ybWF0YCAoZXguOiBgZGQvTU0veXl5eWAsIGBNTS9kZC95eWApIGVtIHRva2VucyBkZSBkaWEvbcOqcy9hbm8gKyBsaXRlcmFpcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbml6ZURhdGVGb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiBGb3JtYXRUb2tlbltdIHtcbiAgICBjb25zdCB0b2tlbnM6IEZvcm1hdFRva2VuW10gPSBbXTtcbiAgICBsZXQgbGFzdEluZGV4ID0gMDtcbiAgICBEQVRFX0ZPUk1BVF9UT0tFTl9SRS5sYXN0SW5kZXggPSAwO1xuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgICB3aGlsZSAoKG1hdGNoID0gREFURV9GT1JNQVRfVE9LRU5fUkUuZXhlYyhmb3JtYXQpKSkge1xuICAgICAgICBpZiAobWF0Y2guaW5kZXggPiBsYXN0SW5kZXgpIHtcbiAgICAgICAgICAgIHRva2Vucy5wdXNoKHsga2luZDogJ2xpdGVyYWwnLCByYXc6IGZvcm1hdC5zbGljZShsYXN0SW5kZXgsIG1hdGNoLmluZGV4KSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByYXcgPSBtYXRjaFswXTtcbiAgICAgICAgY29uc3Qga2luZCA9IHJhd1swXSA9PT0gJ3knID8gJ3llYXInIDogcmF3WzBdID09PSAnZCcgPyAnZGF5JyA6ICdtb250aCc7XG4gICAgICAgIHRva2Vucy5wdXNoKHsga2luZCwgcmF3IH0pO1xuICAgICAgICBsYXN0SW5kZXggPSBEQVRFX0ZPUk1BVF9UT0tFTl9SRS5sYXN0SW5kZXg7XG4gICAgfVxuICAgIGlmIChsYXN0SW5kZXggPCBmb3JtYXQubGVuZ3RoKSB7XG4gICAgICAgIHRva2Vucy5wdXNoKHsga2luZDogJ2xpdGVyYWwnLCByYXc6IGZvcm1hdC5zbGljZShsYXN0SW5kZXgpIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zO1xufVxuXG4vKiogRGlhcyBubyBtw6pzICgxLTEyKSwgasOhIHJlc29sdmVuZG8gZmV2ZXJlaXJvL2FubyBiaXNzZXh0byB2aWEgcm9sbG92ZXIgbmF0aXZvIGRvIGBEYXRlYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXlzSW5Nb250aChtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMCkuZ2V0RGF0ZSgpO1xufVxuXG5mdW5jdGlvbiBidWlsZERhdGVTZWdtZW50cyhkYXRlRm9ybWF0OiBzdHJpbmcpOiBTZWdtZW50U3RhdGVbXSB7XG4gICAgcmV0dXJuIHRva2VuaXplRGF0ZUZvcm1hdChkYXRlRm9ybWF0KS5tYXAoKHRva2VuKTogU2VnbWVudFN0YXRlID0+IHtcbiAgICAgICAgaWYgKHRva2VuLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHsga2luZDogJ2xpdGVyYWwnLCB0ZXh0OiB0b2tlbi5yYXcgfTtcbiAgICAgICAgaWYgKHRva2VuLmtpbmQgPT09ICd5ZWFyJykgcmV0dXJuIHsga2luZDogJ3llYXInLCBsZW5ndGg6IFlFQVJfU0VHTUVOVF9MRU5HVEgsIHRleHQ6ICcnIH07XG4gICAgICAgIGlmICh0b2tlbi5raW5kID09PSAnbW9udGgnKSByZXR1cm4geyBraW5kOiAnbW9udGgnLCBsZW5ndGg6IFNIT1JUX1NFR01FTlRfTEVOR1RILCB0ZXh0OiAnJyB9O1xuICAgICAgICByZXR1cm4geyBraW5kOiAnZGF5JywgbGVuZ3RoOiBTSE9SVF9TRUdNRU5UX0xFTkdUSCwgdGV4dDogJycgfTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRNb250aFNlZ21lbnRzKGRhdGVGb3JtYXQ6IHN0cmluZyk6IFNlZ21lbnRTdGF0ZVtdIHtcbiAgICBjb25zdCBhbGwgPSBidWlsZERhdGVTZWdtZW50cyhkYXRlRm9ybWF0KTtcbiAgICBjb25zdCBkYXlJZHggPSBhbGwuZmluZEluZGV4KChzKSA9PiBzLmtpbmQgPT09ICdkYXknKTtcbiAgICBpZiAoZGF5SWR4ID09PSAtMSkgcmV0dXJuIGFsbDtcbiAgICBjb25zdCBkcm9wSW5kZXhlcyA9IG5ldyBTZXQ8bnVtYmVyPihbZGF5SWR4XSk7XG4gICAgaWYgKGFsbFtkYXlJZHggKyAxXT8ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICAgIGRyb3BJbmRleGVzLmFkZChkYXlJZHggKyAxKTtcbiAgICB9IGVsc2UgaWYgKGFsbFtkYXlJZHggLSAxXT8ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICAgIGRyb3BJbmRleGVzLmFkZChkYXlJZHggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbC5maWx0ZXIoKF8sIGkpID0+ICFkcm9wSW5kZXhlcy5oYXMoaSkpO1xufVxuXG5mdW5jdGlvbiBidWlsZFRpbWVTZWdtZW50cyhob3VyRm9ybWF0OiAnMTInIHwgJzI0Jywgc2hvd1NlY29uZHM6IGJvb2xlYW4pOiBTZWdtZW50U3RhdGVbXSB7XG4gICAgY29uc3Qgc2VnbWVudHM6IFNlZ21lbnRTdGF0ZVtdID0gW1xuICAgICAgICB7IGtpbmQ6ICdob3VyJywgbGVuZ3RoOiBTSE9SVF9TRUdNRU5UX0xFTkdUSCwgdGV4dDogJycgfSxcbiAgICAgICAgeyBraW5kOiAnbGl0ZXJhbCcsIHRleHQ6ICc6JyB9LFxuICAgICAgICB7IGtpbmQ6ICdtaW51dGUnLCBsZW5ndGg6IFNIT1JUX1NFR01FTlRfTEVOR1RILCB0ZXh0OiAnJyB9LFxuICAgIF07XG4gICAgaWYgKHNob3dTZWNvbmRzKSB7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goeyBraW5kOiAnbGl0ZXJhbCcsIHRleHQ6ICc6JyB9LCB7IGtpbmQ6ICdzZWNvbmQnLCBsZW5ndGg6IFNIT1JUX1NFR01FTlRfTEVOR1RILCB0ZXh0OiAnJyB9KTtcbiAgICB9XG4gICAgaWYgKGhvdXJGb3JtYXQgPT09ICcxMicpIHtcbiAgICAgICAgc2VnbWVudHMucHVzaCh7IGtpbmQ6ICdsaXRlcmFsJywgdGV4dDogJyAnIH0sIHsga2luZDogJ2FtcG0nLCBsZW5ndGg6IFNIT1JUX1NFR01FTlRfTEVOR1RILCB0ZXh0OiAnJyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlZ21lbnRzO1xufVxuXG5mdW5jdGlvbiBidWlsZFNlZ21lbnRzRm9yKGNvbmZpZzogU2VnbWVudEVuZ2luZUNvbmZpZyk6IFNlZ21lbnRTdGF0ZVtdIHtcbiAgICBzd2l0Y2ggKGNvbmZpZy5tb2RlKSB7XG4gICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkRGF0ZVNlZ21lbnRzKGNvbmZpZy5kYXRlRm9ybWF0KTtcbiAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkTW9udGhTZWdtZW50cyhjb25maWcuZGF0ZUZvcm1hdCk7XG4gICAgICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkVGltZVNlZ21lbnRzKGNvbmZpZy5ob3VyRm9ybWF0LCBjb25maWcuc2hvd1NlY29uZHMpO1xuICAgICAgICBjYXNlICdkYXRldGltZSc6XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIC4uLmJ1aWxkRGF0ZVNlZ21lbnRzKGNvbmZpZy5kYXRlRm9ybWF0KSxcbiAgICAgICAgICAgICAgICB7IGtpbmQ6ICdsaXRlcmFsJywgdGV4dDogJyAnIH0sXG4gICAgICAgICAgICAgICAgLi4uYnVpbGRUaW1lU2VnbWVudHMoY29uZmlnLmhvdXJGb3JtYXQsIGNvbmZpZy5zaG93U2Vjb25kcyksXG4gICAgICAgICAgICBdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBFbmdpbmUgZGUgc2VnbWVudG9zIChkaWEvbcOqcy9hbm8vaG9yYS9taW51dG8vc2VndW5kby9hbXBtKSBwYXJhIG8gdHJpZ2dlciBkbyBkYXRlcGlja2VyLlxuICogU2VtIGRlcGVuZMOqbmNpYXMgZGUgQW5ndWxhciDigJQgRE9NL0NWQSBmaWNhbSBwb3IgY29udGEgZG8gY29tcG9uZW50ZSBxdWUgYSBjb25zb21lLlxuICovXG5leHBvcnQgY2xhc3MgRGF0ZVNlZ21lbnRFbmdpbmUge1xuICAgIHByaXZhdGUgc2VnbWVudHM6IFNlZ21lbnRTdGF0ZVtdID0gW107XG4gICAgcHJpdmF0ZSBjb25maWc6IFNlZ21lbnRFbmdpbmVDb25maWcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGFjdGl2ZUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGZyZXNoRW50cnkgPSB0cnVlO1xuXG4gICAgY29uZmlndXJlKGNvbmZpZzogU2VnbWVudEVuZ2luZUNvbmZpZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IGJ1aWxkU2VnbWVudHNGb3IoY29uZmlnKTtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgfVxuXG4gICAgZ2V0RGlzcGxheVN0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWdtZW50cy5tYXAoKHMpID0+IChpc0VkaXRhYmxlU2VnbWVudChzKSA/IHRoaXMucmVuZGVyU2VnbWVudChzKSA6IHMudGV4dCkpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyU2VnbWVudChzZWdtZW50OiBFZGl0YWJsZVNlZ21lbnRTdGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBzZWdtZW50LnRleHQgKyAnXycucmVwZWF0KE1hdGgubWF4KDAsIHNlZ21lbnQubGVuZ3RoIC0gc2VnbWVudC50ZXh0Lmxlbmd0aCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VnbWVudFJlbmRlckxlbmd0aChzZWdtZW50OiBTZWdtZW50U3RhdGUpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gaXNFZGl0YWJsZVNlZ21lbnQoc2VnbWVudCkgPyBzZWdtZW50Lmxlbmd0aCA6IHNlZ21lbnQudGV4dC5sZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0U2VnbWVudFJhbmdlKGluZGV4OiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7XG4gICAgICAgICAgICBzdGFydCArPSB0aGlzLnNlZ21lbnRSZW5kZXJMZW5ndGgodGhpcy5zZWdtZW50c1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtzdGFydCwgc3RhcnQgKyB0aGlzLnNlZ21lbnRSZW5kZXJMZW5ndGgodGhpcy5zZWdtZW50c1tpbmRleF0pXTtcbiAgICB9XG5cbiAgICBnZXRGaXJzdEVkaXRhYmxlSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VnbWVudHMuZmluZEluZGV4KChzKSA9PiBpc0VkaXRhYmxlU2VnbWVudChzKSk7XG4gICAgfVxuXG4gICAgZ2V0TGFzdEVkaXRhYmxlSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuc2VnbWVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmIChpc0VkaXRhYmxlU2VnbWVudCh0aGlzLnNlZ21lbnRzW2ldKSkgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIGdldEFjdGl2ZUluZGV4KCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVJbmRleDtcbiAgICB9XG5cbiAgICBhY3RpdmVLaW5kKCk6IFNlZ21lbnRLaW5kIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IHRoaXMuc2VnbWVudHNbdGhpcy5hY3RpdmVJbmRleF07XG4gICAgICAgIHJldHVybiBpc0VkaXRhYmxlU2VnbWVudChzZWdtZW50KSA/IHNlZ21lbnQua2luZCA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqIFRleHRvIGJydXRvIChzZW0gcGFkZGluZyBkZSBzdWJsaW5oYWRvKSBkbyBzZWdtZW50byBhdGl2byDigJQgdXNhZG8gcGVsbyBhbsO6bmNpbyBkZSBhY2Vzc2liaWxpZGFkZS4gKi9cbiAgICBnZXRBY3RpdmVTZWdtZW50VGV4dCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlSW5kZXggPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBzZWdtZW50ID0gdGhpcy5zZWdtZW50c1t0aGlzLmFjdGl2ZUluZGV4XTtcbiAgICAgICAgcmV0dXJuIGlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpID8gc2VnbWVudC50ZXh0IDogbnVsbDtcbiAgICB9XG5cbiAgICBzZWxlY3RTZWdtZW50QXQoY2hhckluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgYWNjID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSB0aGlzLnNlZ21lbnRSZW5kZXJMZW5ndGgodGhpcy5zZWdtZW50c1tpXSk7XG4gICAgICAgICAgICBpZiAoY2hhckluZGV4IDwgYWNjICsgbGVuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVhcmVzdEVkaXRhYmxlRnJvbShpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjYyArPSBsZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFzdEVkaXRhYmxlSW5kZXgoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5lYXJlc3RFZGl0YWJsZUZyb20oaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IHRoaXMuc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpc0VkaXRhYmxlU2VnbWVudCh0aGlzLnNlZ21lbnRzW2ldKSkgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFzdEVkaXRhYmxlSW5kZXgoKTtcbiAgICB9XG5cbiAgICBzZWxlY3RTZWdtZW50KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnNlZ21lbnRzLmxlbmd0aCB8fCAhaXNFZGl0YWJsZVNlZ21lbnQodGhpcy5zZWdtZW50c1tpbmRleF0pKSByZXR1cm47XG4gICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBzZWxlY3RGaXJzdFNlZ21lbnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0U2VnbWVudCh0aGlzLmdldEZpcnN0RWRpdGFibGVJbmRleCgpKTtcbiAgICB9XG5cbiAgICAvKiogQ29tbWl0YSAocGFkL2NsYW1wKSBvIHNlZ21lbnRvIGF0aXZvIGUgbW92ZSBwYXJhIG8gcHLDs3hpbW8vYW50ZXJpb3IgZWRpdMOhdmVsLiAqL1xuICAgIG1vdmVUb0FkamFjZW50U2VnbWVudChkaXJlY3Rpb246IDEgfCAtMSk6ICdtb3ZlZCcgfCAnYm91bmRhcnknIHtcbiAgICAgICAgdGhpcy5jb21taXRBY3RpdmVTZWdtZW50KCk7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm4gJ2JvdW5kYXJ5JztcbiAgICAgICAgbGV0IG5leHQgPSB0aGlzLmFjdGl2ZUluZGV4O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBuZXh0ICs9IGRpcmVjdGlvbjtcbiAgICAgICAgfSB3aGlsZSAobmV4dCA+PSAwICYmIG5leHQgPCB0aGlzLnNlZ21lbnRzLmxlbmd0aCAmJiAhaXNFZGl0YWJsZVNlZ21lbnQodGhpcy5zZWdtZW50c1tuZXh0XSkpO1xuICAgICAgICBpZiAobmV4dCA8IDAgfHwgbmV4dCA+PSB0aGlzLnNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gJ2JvdW5kYXJ5JztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdFNlZ21lbnQobmV4dCk7XG4gICAgICAgIHJldHVybiAnbW92ZWQnO1xuICAgIH1cblxuICAgIHR5cGVEaWdpdChkaWdpdDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpIHx8IHNlZ21lbnQua2luZCA9PT0gJ2FtcG0nKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmZyZXNoRW50cnkpIHtcbiAgICAgICAgICAgIHNlZ21lbnQudGV4dCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZ21lbnQudGV4dC5sZW5ndGggPj0gc2VnbWVudC5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgc2VnbWVudC50ZXh0ICs9IGRpZ2l0O1xuICAgICAgICBpZiAoc2VnbWVudC50ZXh0Lmxlbmd0aCA+PSBzZWdtZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jb21taXRBY3RpdmVTZWdtZW50KCk7XG4gICAgICAgICAgICB0aGlzLmF1dG9BZHZhbmNlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGF1dG9BZHZhbmNlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVJbmRleCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV4dCA9IHRoaXMuYWN0aXZlSW5kZXg7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIG5leHQgKz0gMTtcbiAgICAgICAgfSB3aGlsZSAobmV4dCA8IHRoaXMuc2VnbWVudHMubGVuZ3RoICYmICFpc0VkaXRhYmxlU2VnbWVudCh0aGlzLnNlZ21lbnRzW25leHRdKSk7XG4gICAgICAgIGlmIChuZXh0IDwgdGhpcy5zZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0U2VnbWVudChuZXh0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEFtUG0odmFsdWU6IDAgfCAxKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpIHx8IHNlZ21lbnQua2luZCAhPT0gJ2FtcG0nKSByZXR1cm47XG4gICAgICAgIHNlZ21lbnQudGV4dCA9IHZhbHVlID09PSAxID8gJ1BNJyA6ICdBTSc7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgfVxuXG4gICAgY2xlYXJBY3RpdmVTZWdtZW50KGtpbmQ6ICdiYWNrc3BhY2UnIHwgJ2RlbGV0ZScpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlSW5kZXggPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IHRoaXMuc2VnbWVudHNbdGhpcy5hY3RpdmVJbmRleF07XG4gICAgICAgIGlmICghaXNFZGl0YWJsZVNlZ21lbnQoc2VnbWVudCkpIHJldHVybjtcbiAgICAgICAgaWYgKHNlZ21lbnQudGV4dCA9PT0gJycpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSAnYmFja3NwYWNlJykge1xuICAgICAgICAgICAgICAgIGxldCBwcmV2ID0gdGhpcy5hY3RpdmVJbmRleDtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIHByZXYgLT0gMTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChwcmV2ID49IDAgJiYgIWlzRWRpdGFibGVTZWdtZW50KHRoaXMuc2VnbWVudHNbcHJldl0pKTtcbiAgICAgICAgICAgICAgICBpZiAocHJldiA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSBwcmV2O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyZXNoRW50cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2VnbWVudC50ZXh0ID0gJyc7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqIExpbXBhIHRvZG9zIG9zIHNlZ21lbnRvcyBlZGl0w6F2ZWlzICh1c2FkbyBxdWFuZG8gbyBjYW1wbyBpbnRlaXJvIGVzdMOhIHNlbGVjaW9uYWRvLCBleC46IEN0cmwrQSkuICovXG4gICAgY2xlYXJBbGwoKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiB0aGlzLnNlZ21lbnRzKSB7XG4gICAgICAgICAgICBpZiAoaXNFZGl0YWJsZVNlZ21lbnQoc2VnbWVudCkpIHNlZ21lbnQudGV4dCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSB0aGlzLmdldEZpcnN0RWRpdGFibGVJbmRleCgpO1xuICAgICAgICB0aGlzLmZyZXNoRW50cnkgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluY3JlbWVudGEvZGVjcmVtZW50YSBvIHNlZ21lbnRvIGF0aXZvLCBkYW5kbyBhIHZvbHRhICh3cmFwKSBkZW50cm8gZG8gcmFuZ2UgdsOhbGlkby5cbiAgICAgKiBFeGNlw6fDo286IGFubyB2YXppbyBzZW1wcmUgcG91c2Egbm8gYW5vIGF0dWFsIGRvIHNpc3RlbWEgbmEgcHJpbWVpcmEgc2V0YSAodXAgb3UgZG93biksXG4gICAgICogZW0gdmV6IGRlIDAwMDAvOTk5OSDigJQgc8OzIHBhc3NhIGEgaW5jcmVtZW50YXIvZGVjcmVtZW50YXIgYSBwYXJ0aXIgZGEgc2VndW5kYSBzZXRhLlxuICAgICAqL1xuICAgIGluY3JlbWVudEFjdGl2ZVNlZ21lbnQoZGVsdGE6IDEgfCAtMSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVJbmRleCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzZWdtZW50ID0gdGhpcy5zZWdtZW50c1t0aGlzLmFjdGl2ZUluZGV4XTtcbiAgICAgICAgaWYgKCFpc0VkaXRhYmxlU2VnbWVudChzZWdtZW50KSkgcmV0dXJuO1xuICAgICAgICBpZiAoc2VnbWVudC5raW5kID09PSAnYW1wbScpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QW1QbShzZWdtZW50LnRleHQgPT09ICdQTScgPyAwIDogMSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZ21lbnQua2luZCA9PT0gJ3llYXInICYmICFzZWdtZW50LnRleHQpIHtcbiAgICAgICAgICAgIHNlZ21lbnQudGV4dCA9IFN0cmluZyhuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkpLnBhZFN0YXJ0KHNlZ21lbnQubGVuZ3RoLCAnMCcpO1xuICAgICAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucmVjb25jaWxlRGF5SWZOZWVkZWQoc2VnbWVudC5raW5kKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSB0aGlzLmJvdW5kc0ZvcihzZWdtZW50LmtpbmQpO1xuICAgICAgICBjb25zdCByYW5nZSA9IG1heCAtIG1pbiArIDE7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBzZWdtZW50LnRleHQgPyBwYXJzZUludChzZWdtZW50LnRleHQsIDEwKSA6IGRlbHRhID4gMCA/IG1pbiAtIDEgOiBtaW47XG4gICAgICAgIGNvbnN0IG5leHQgPSAoKChjdXJyZW50ICsgZGVsdGEgLSBtaW4pICUgcmFuZ2UpICsgcmFuZ2UpICUgcmFuZ2UgKyBtaW47XG4gICAgICAgIHNlZ21lbnQudGV4dCA9IFN0cmluZyhuZXh0KS5wYWRTdGFydChzZWdtZW50Lmxlbmd0aCwgJzAnKTtcbiAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZWNvbmNpbGVEYXlJZk5lZWRlZChzZWdtZW50LmtpbmQpO1xuICAgIH1cblxuICAgIC8qKiBQYWQvY2xhbXAgZG8gc2VnbWVudG8gYXRpdm8gKGV4LjogXCIyXCIgLT4gXCIwMlwiLCBcIjQ1XCIgbm8gZGlhIC0+IGNsYW1wIHBhcmEgZGF5c0luTW9udGgpLiAqL1xuICAgIGNvbW1pdEFjdGl2ZVNlZ21lbnQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGtpbmQgPSBzZWdtZW50LmtpbmQ7XG4gICAgICAgIHNlZ21lbnQudGV4dCA9IHRoaXMuY2xhbXBBbmRQYWQoc2VnbWVudCk7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVjb25jaWxlRGF5SWZOZWVkZWQoa2luZCk7XG4gICAgfVxuXG4gICAgLyoqIENvbW1pdGEgbyBzZWdtZW50byBhdGl2byBlIHNhaSBkbyBtb2RvIGRlIGVkacOnw6NvICh1c2FkbyBubyBibHVyIGRvIGNhbXBvKS4gKi9cbiAgICBkZWFjdGl2YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbW1pdEFjdGl2ZVNlZ21lbnQoKTtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGFtcEFuZFBhZChzZWdtZW50OiBFZGl0YWJsZVNlZ21lbnRTdGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChzZWdtZW50LmtpbmQgPT09ICdhbXBtJyB8fCBzZWdtZW50LmtpbmQgPT09ICd5ZWFyJyB8fCAhc2VnbWVudC50ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gc2VnbWVudC50ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG51bSA9IHBhcnNlSW50KHNlZ21lbnQudGV4dCwgMTApO1xuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSB0aGlzLmJvdW5kc0ZvcihzZWdtZW50LmtpbmQpO1xuICAgICAgICBjb25zdCBjbGFtcGVkID0gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIG51bSkpO1xuICAgICAgICByZXR1cm4gU3RyaW5nKGNsYW1wZWQpLnBhZFN0YXJ0KHNlZ21lbnQubGVuZ3RoLCAnMCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYm91bmRzRm9yKGtpbmQ6IFNlZ21lbnRLaW5kKTogeyBtaW46IG51bWJlcjsgbWF4OiBudW1iZXIgfSB7XG4gICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtaW46IDEsIG1heDogdGhpcy5kYXlzSW5Nb250aE5vdygpIH07XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWluOiAxLCBtYXg6IEhPVVJTX1BFUl9NRVJJRElFTSB9O1xuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnPy5ob3VyRm9ybWF0ID09PSAnMTInXG4gICAgICAgICAgICAgICAgICAgID8geyBtaW46IDEsIG1heDogSE9VUlNfUEVSX01FUklESUVNIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7IG1pbjogMCwgbWF4OiBNQVhfSE9VUl8yNCB9O1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWluOiAwLCBtYXg6IE1BWF9NSU5VVEVfU0VDT05EIH07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB7IG1pbjogMCwgbWF4OiA5OTk5IH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCb3VuZCBkbyBkaWEgZGVwZW5kZW5kbyBkbyBxdWUgasOhIMOpIGNvbmhlY2lkbyBkZSBtw6pzL2Fuby4gTnVuY2EgXCJhZGl2aW5oYVwiIGNvbSBvIG3DqnMvYW5vXG4gICAgICogYXR1YWlzIGRvIHNpc3RlbWEg4oCUIGlzc28gZXN0cmVpdGFyaWEgbyByYW5nZSBhbnRlcyBkYSBob3JhIChleC46IGRpYT0yOSBkaWdpdGFkbyBhbnRlcyBkb1xuICAgICAqIGFubywgbcOqcz1mZXZlcmVpcm8gY29uaGVjaWRvIG1hcyBhbm8gYWluZGEgbsOjbyAtPiBzZSBhc3N1bWlzc2UgbyBhbm8gYXR1YWwgZG8gc2lzdGVtYSBlIGVsZVxuICAgICAqIG7Do28gZm9zc2UgYmlzc2V4dG8sIG8gZGlhIHNlcmlhIGNsYW1wYWRvIHBhcmEgMjggZSBudW5jYSBtYWlzIHJlZXhwYW5kaWRvIHBhcmEgMjkgbWVzbW8gcXVlXG4gICAgICogbyBhbm8gcmVhbG1lbnRlIGRpZ2l0YWRvIGRlcG9pcyBzZWphIGJpc3NleHRvKS4gRW0gdmV6IGRpc3NvLCBmaWNhIHNlbXByZSBubyBsYWRvIHBlcm1pc3Npdm9cbiAgICAgKiBhdMOpIHF1ZSBhIGluZm9ybWHDp8OjbyByZWFsbWVudGUgZXhpc3RhLlxuICAgICAqL1xuICAgIHByaXZhdGUgZGF5c0luTW9udGhOb3coKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbW9udGhTZWdtZW50ID0gdGhpcy5maW5kRWRpdGFibGUoJ21vbnRoJyk7XG4gICAgICAgIGNvbnN0IG1vbnRoS25vd24gPSAhIW1vbnRoU2VnbWVudD8udGV4dCAmJiBtb250aFNlZ21lbnQudGV4dC5sZW5ndGggPT09IG1vbnRoU2VnbWVudC5sZW5ndGg7XG4gICAgICAgIGlmICghbW9udGhTZWdtZW50IHx8ICFtb250aEtub3duKSByZXR1cm4gR0VORVJJQ19NQVhfREFZO1xuICAgICAgICBjb25zdCBtb250aCA9IHBhcnNlSW50KG1vbnRoU2VnbWVudC50ZXh0LCAxMCk7XG4gICAgICAgIGNvbnN0IHllYXJTZWdtZW50ID0gdGhpcy5maW5kRWRpdGFibGUoJ3llYXInKTtcbiAgICAgICAgY29uc3QgeWVhcktub3duID0gISF5ZWFyU2VnbWVudD8udGV4dCAmJiB5ZWFyU2VnbWVudC50ZXh0Lmxlbmd0aCA9PT0gWUVBUl9TRUdNRU5UX0xFTkdUSDtcbiAgICAgICAgaWYgKCF5ZWFyU2VnbWVudCB8fCAheWVhcktub3duKSByZXR1cm4gZGF5c0luTW9udGgobW9udGgsIExFQVBfUkVGRVJFTkNFX1lFQVIpO1xuICAgICAgICByZXR1cm4gZGF5c0luTW9udGgobW9udGgsIHBhcnNlSW50KHllYXJTZWdtZW50LnRleHQsIDEwKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWNvbmNpbGVEYXlJZk5lZWRlZChjb21taXR0ZWRLaW5kOiBTZWdtZW50S2luZCk6IHZvaWQge1xuICAgICAgICBpZiAoY29tbWl0dGVkS2luZCAhPT0gJ21vbnRoJyAmJiBjb21taXR0ZWRLaW5kICE9PSAneWVhcicpIHJldHVybjtcbiAgICAgICAgY29uc3QgZGF5U2VnbWVudCA9IHRoaXMuZmluZEVkaXRhYmxlKCdkYXknKTtcbiAgICAgICAgaWYgKCFkYXlTZWdtZW50IHx8IGRheVNlZ21lbnQudGV4dC5sZW5ndGggIT09IGRheVNlZ21lbnQubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMuZGF5c0luTW9udGhOb3coKTtcbiAgICAgICAgY29uc3QgZGF5TnVtID0gcGFyc2VJbnQoZGF5U2VnbWVudC50ZXh0LCAxMCk7XG4gICAgICAgIGlmIChkYXlOdW0gPiBtYXgpIHtcbiAgICAgICAgICAgIGRheVNlZ21lbnQudGV4dCA9IFN0cmluZyhtYXgpLnBhZFN0YXJ0KGRheVNlZ21lbnQubGVuZ3RoLCAnMCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRWRpdGFibGUoa2luZDogU2VnbWVudEtpbmQpOiBFZGl0YWJsZVNlZ21lbnRTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzLmZpbmQoKHMpOiBzIGlzIEVkaXRhYmxlU2VnbWVudFN0YXRlID0+IGlzRWRpdGFibGVTZWdtZW50KHMpICYmIHMua2luZCA9PT0ga2luZCk7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VnbWVudHMuZXZlcnkoKHMpID0+ICFpc0VkaXRhYmxlU2VnbWVudChzKSB8fCBzLnRleHQgPT09ICcnKTtcbiAgICB9XG5cbiAgICBpc0NvbXBsZXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWdtZW50cy5ldmVyeSgocykgPT4gIWlzRWRpdGFibGVTZWdtZW50KHMpIHx8IHMudGV4dC5sZW5ndGggPT09IHMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBsb2FkRnJvbURhdGUoZGF0ZTogRGF0ZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHRoaXMuc2VnbWVudHMpIHtcbiAgICAgICAgICAgIGlmIChpc0VkaXRhYmxlU2VnbWVudChzZWdtZW50KSkgc2VnbWVudC50ZXh0ID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgICAgIGlmICghZGF0ZSkgcmV0dXJuO1xuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgdGhpcy5zZWdtZW50cykge1xuICAgICAgICAgICAgaWYgKCFpc0VkaXRhYmxlU2VnbWVudChzZWdtZW50KSkgY29udGludWU7XG4gICAgICAgICAgICBzZWdtZW50LnRleHQgPSB0aGlzLnJlbmRlclZhbHVlRm9yKHNlZ21lbnQua2luZCwgZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlclZhbHVlRm9yKGtpbmQ6IFNlZ21lbnRLaW5kLCBkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KFNIT1JUX1NFR01FTlRfTEVOR1RILCAnMCcpO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoU0hPUlRfU0VHTUVOVF9MRU5HVEgsICcwJyk7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGRhdGUuZ2V0RnVsbFllYXIoKSkucGFkU3RhcnQoWUVBUl9TRUdNRU5UX0xFTkdUSCwgJzAnKTtcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5ID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWc/LmhvdXJGb3JtYXQgPT09ICcxMicgPyAoaCAlIEhPVVJTX1BFUl9NRVJJRElFTSA9PT0gMCA/IEhPVVJTX1BFUl9NRVJJRElFTSA6IGggJSBIT1VSU19QRVJfTUVSSURJRU0pIDogaDtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGRpc3BsYXkpLnBhZFN0YXJ0KFNIT1JUX1NFR01FTlRfTEVOR1RILCAnMCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGRhdGUuZ2V0TWludXRlcygpKS5wYWRTdGFydChTSE9SVF9TRUdNRU5UX0xFTkdUSCwgJzAnKTtcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhkYXRlLmdldFNlY29uZHMoKSkucGFkU3RhcnQoU0hPUlRfU0VHTUVOVF9MRU5HVEgsICcwJyk7XG4gICAgICAgICAgICBjYXNlICdhbXBtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRIb3VycygpIDwgSE9VUlNfUEVSX01FUklESUVNID8gJ0FNJyA6ICdQTSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQ29uc3Ryw7NpIG8gYERhdGVgIGEgcGFydGlyIGRvcyBzZWdtZW50b3M7IGBudWxsYCBlbnF1YW50byBpbmNvbXBsZXRvLiBVc2EgYHJlZmVyZW5jZURhdGVgIHBhcmEgcHJlZW5jaGVyIHBhcnRlcyBhdXNlbnRlcyAoZXguOiBob3JhIGFvIGVkaXRhciBzw7MgYSBkYXRhKS4gKi9cbiAgICB0b0RhdGUocmVmZXJlbmNlRGF0ZT86IERhdGUgfCBudWxsKTogRGF0ZSB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuaXNDb21wbGV0ZSgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVmID0gcmVmZXJlbmNlRGF0ZSA/PyBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBnZXROdW0gPSAoa2luZDogU2VnbWVudEtpbmQpOiBudW1iZXIgfCBudWxsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLmZpbmRFZGl0YWJsZShraW5kKTtcbiAgICAgICAgICAgIHJldHVybiBzZWdtZW50ID8gcGFyc2VJbnQoc2VnbWVudC50ZXh0LCAxMCkgOiBudWxsO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHllYXIgPSBnZXROdW0oJ3llYXInKSA/PyByZWYuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgY29uc3QgbW9udGhOdW0gPSBnZXROdW0oJ21vbnRoJyk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gbW9udGhOdW0gIT09IG51bGwgPyBtb250aE51bSAtIDEgOiByZWYuZ2V0TW9udGgoKTtcbiAgICAgICAgY29uc3QgZGF5ID0gdGhpcy5jb25maWc/Lm1vZGUgPT09ICdtb250aCcgPyAxIDogKGdldE51bSgnZGF5JykgPz8gcmVmLmdldERhdGUoKSk7XG5cbiAgICAgICAgbGV0IGhvdXIgPSBnZXROdW0oJ2hvdXInKTtcbiAgICAgICAgY29uc3QgbWludXRlID0gZ2V0TnVtKCdtaW51dGUnKSA/PyByZWYuZ2V0TWludXRlcygpO1xuICAgICAgICBjb25zdCBzZWNvbmQgPSBnZXROdW0oJ3NlY29uZCcpID8/IHJlZi5nZXRTZWNvbmRzKCk7XG5cbiAgICAgICAgaWYgKGhvdXIgIT09IG51bGwgJiYgdGhpcy5jb25maWc/LmhvdXJGb3JtYXQgPT09ICcxMicpIHtcbiAgICAgICAgICAgIGNvbnN0IGFtcG1TZWdtZW50ID0gdGhpcy5maW5kRWRpdGFibGUoJ2FtcG0nKTtcbiAgICAgICAgICAgIGNvbnN0IGlzUG0gPSBhbXBtU2VnbWVudD8udGV4dCA9PT0gJ1BNJztcbiAgICAgICAgICAgIGhvdXIgPSBob3VyICUgSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICAgICAgaWYgKGlzUG0pIGhvdXIgKz0gSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIgPz8gcmVmLmdldEhvdXJzKCksIG1pbnV0ZSwgc2Vjb25kKTtcbiAgICB9XG59XG4iXX0=