@seniorsistemas/data-seniorx-core 2.3.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/core/constants/autocomplete.const.d.ts +4 -0
  2. package/core/constants/context-selector.const.d.ts +1 -0
  3. package/core/constants/gantt.const.d.ts +7 -0
  4. package/core/constants/hyperlink.const.d.ts +1 -0
  5. package/core/constants/inline-edit.const.d.ts +4 -0
  6. package/core/constants/kanban.const.d.ts +2 -0
  7. package/core/constants/pin-code-field.const.d.ts +5 -0
  8. package/core/constants/rating-scale.const.d.ts +1 -0
  9. package/core/constants/spotlight.const.d.ts +8 -0
  10. package/core/constants/star-rating.const.d.ts +4 -0
  11. package/core/constants/stepper.const.d.ts +1 -0
  12. package/core/constants/tiered-menu.const.d.ts +3 -0
  13. package/core/types/autocomplete.type.d.ts +9 -0
  14. package/core/types/chat.type.d.ts +12 -0
  15. package/core/types/checkbox-list.type.d.ts +12 -0
  16. package/core/types/gantt.type.d.ts +22 -0
  17. package/core/types/grid-menu.type.d.ts +13 -0
  18. package/core/types/hyperlink.type.d.ts +1 -0
  19. package/core/types/image-cropper.type.d.ts +20 -0
  20. package/core/types/inline-edit.type.d.ts +26 -0
  21. package/core/types/kanban.type.d.ts +36 -0
  22. package/core/types/panel.type.d.ts +16 -0
  23. package/core/types/profile-picture-picker.type.d.ts +9 -0
  24. package/core/types/rating-scale.type.d.ts +5 -0
  25. package/core/types/select-button.type.d.ts +1 -0
  26. package/core/types/spotlight.type.d.ts +34 -0
  27. package/core/types/star-rating.type.d.ts +1 -0
  28. package/core/types/stepper.type.d.ts +20 -0
  29. package/core/types/table-column.type.d.ts +3 -1
  30. package/core/types/table-options.type.d.ts +8 -2
  31. package/core/types/table.type.d.ts +1 -1
  32. package/core/types/tiered-menu.type.d.ts +16 -0
  33. package/core/types/tree.type.d.ts +25 -0
  34. package/core/types/workspace-switch.type.d.ts +6 -0
  35. package/core/utils/body-scroll.util.d.ts +2 -0
  36. package/core/utils/roving-focus.util.d.ts +2 -0
  37. package/core/utils/selection.util.d.ts +3 -0
  38. package/core/utils/tree.util.d.ts +4 -0
  39. package/esm2022/core/constants/autocomplete.const.mjs +5 -0
  40. package/esm2022/core/constants/context-selector.const.mjs +2 -0
  41. package/esm2022/core/constants/gantt.const.mjs +7 -0
  42. package/esm2022/core/constants/hyperlink.const.mjs +2 -1
  43. package/esm2022/core/constants/inline-edit.const.mjs +5 -0
  44. package/esm2022/core/constants/kanban.const.mjs +3 -0
  45. package/esm2022/core/constants/pin-code-field.const.mjs +6 -0
  46. package/esm2022/core/constants/rating-scale.const.mjs +2 -0
  47. package/esm2022/core/constants/spotlight.const.mjs +9 -0
  48. package/esm2022/core/constants/star-rating.const.mjs +5 -0
  49. package/esm2022/core/constants/stepper.const.mjs +2 -0
  50. package/esm2022/core/constants/table.const.mjs +2 -2
  51. package/esm2022/core/constants/tiered-menu.const.mjs +4 -0
  52. package/esm2022/core/types/autocomplete.type.mjs +2 -0
  53. package/esm2022/core/types/chat.type.mjs +2 -0
  54. package/esm2022/core/types/checkbox-list.type.mjs +2 -0
  55. package/esm2022/core/types/gantt.type.mjs +2 -0
  56. package/esm2022/core/types/grid-menu.type.mjs +2 -0
  57. package/esm2022/core/types/hyperlink.type.mjs +1 -1
  58. package/esm2022/core/types/image-cropper.type.mjs +2 -0
  59. package/esm2022/core/types/inline-edit.type.mjs +2 -0
  60. package/esm2022/core/types/kanban.type.mjs +2 -0
  61. package/esm2022/core/types/panel.type.mjs +9 -0
  62. package/esm2022/core/types/profile-picture-picker.type.mjs +2 -0
  63. package/esm2022/core/types/rating-scale.type.mjs +2 -0
  64. package/esm2022/core/types/select-button.type.mjs +1 -1
  65. package/esm2022/core/types/spotlight.type.mjs +2 -0
  66. package/esm2022/core/types/star-rating.type.mjs +2 -0
  67. package/esm2022/core/types/stepper.type.mjs +7 -0
  68. package/esm2022/core/types/table-column.type.mjs +1 -1
  69. package/esm2022/core/types/table-options.type.mjs +1 -1
  70. package/esm2022/core/types/table.type.mjs +1 -1
  71. package/esm2022/core/types/tiered-menu.type.mjs +2 -0
  72. package/esm2022/core/types/tree.type.mjs +2 -0
  73. package/esm2022/core/types/workspace-switch.type.mjs +2 -0
  74. package/esm2022/core/utils/body-scroll.util.mjs +19 -0
  75. package/esm2022/core/utils/combobox.util.mjs +3 -2
  76. package/esm2022/core/utils/roving-focus.util.mjs +20 -0
  77. package/esm2022/core/utils/selection.util.mjs +13 -0
  78. package/esm2022/core/utils/string.util.mjs +8 -3
  79. package/esm2022/core/utils/tree.util.mjs +23 -0
  80. package/esm2022/features/accordion/accordion.component.mjs +2 -2
  81. package/esm2022/features/accordion/{accordion-item.component.mjs → components/accordion-item/accordion-item.component.mjs} +7 -7
  82. package/esm2022/features/autocomplete/autocomplete.component.mjs +501 -0
  83. package/esm2022/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +30 -0
  84. package/esm2022/features/breadcrumb/breadcrumb.component.mjs +2 -2
  85. package/esm2022/features/card-list/card/card.component.mjs +63 -99
  86. package/esm2022/features/chat/chat.component.mjs +126 -0
  87. package/esm2022/features/checkbox-list/checkbox-list.component.mjs +125 -0
  88. package/esm2022/features/combobox/combobox.component.mjs +20 -8
  89. package/esm2022/features/context-selector/context-selector.component.mjs +198 -0
  90. package/esm2022/features/filters/filters.component.mjs +1 -1
  91. package/esm2022/features/gantt/components/gantt-side-table/gantt-side-table.component.mjs +17 -0
  92. package/esm2022/features/gantt/gantt-date.utils.mjs +97 -0
  93. package/esm2022/features/gantt/gantt.component.mjs +89 -0
  94. package/esm2022/features/gantt/gantt.engine.mjs +662 -0
  95. package/esm2022/features/grid-menu/grid-menu.component.mjs +104 -0
  96. package/esm2022/features/hyperlink/hyperlink.component.mjs +7 -4
  97. package/esm2022/features/icon-picker/icon-picker.component.mjs +3 -3
  98. package/esm2022/features/image-cropper/image-cropper.component.mjs +218 -0
  99. package/esm2022/features/image-cropper/services/image-cropper.service.mjs +50 -0
  100. package/esm2022/features/infinite-scroll/infinite-scroll.directive.mjs +89 -0
  101. package/esm2022/features/info-sign/info-sign.component.mjs +3 -3
  102. package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +38 -0
  103. package/esm2022/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.mjs +29 -0
  104. package/esm2022/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.mjs +29 -0
  105. package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +131 -0
  106. package/esm2022/features/inline-edit/fields/inline-edit-field.mjs +17 -0
  107. package/esm2022/features/inline-edit/fields/inline-edit-number-field.mjs +15 -0
  108. package/esm2022/features/inline-edit/fields/inline-edit-text-field.mjs +11 -0
  109. package/esm2022/features/inline-edit/fields/inline-edit-textarea-field.mjs +15 -0
  110. package/esm2022/features/inline-edit/inline-edit.component.mjs +27 -0
  111. package/esm2022/features/interactive-content/interactive-content.directive.mjs +140 -0
  112. package/esm2022/features/kanban/components/kanban-column/kanban-column.component.mjs +88 -0
  113. package/esm2022/features/kanban/components/kanban-item/kanban-item.component.mjs +72 -0
  114. package/esm2022/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.mjs +19 -0
  115. package/esm2022/features/kanban/directives/kanban-template.directive.mjs +22 -0
  116. package/esm2022/features/kanban/kanban.component.mjs +198 -0
  117. package/esm2022/features/kanban/services/kanban-event.service.mjs +27 -0
  118. package/esm2022/features/loading-state/loading-state.component.mjs +3 -62
  119. package/esm2022/features/mouse-events/directives/double-click.directive.mjs +34 -0
  120. package/esm2022/features/mouse-events/directives/long-press.directive.mjs +61 -0
  121. package/esm2022/features/paginator/paginator.component.mjs +8 -3
  122. package/esm2022/features/panel/panel.component.mjs +43 -11
  123. package/esm2022/features/pin-code-field/pin-code-field.component.mjs +234 -0
  124. package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +330 -0
  125. package/esm2022/features/rating-scale/rating-scale.component.mjs +86 -0
  126. package/esm2022/features/row-card-list/row-card/row-card.component.mjs +3 -3
  127. package/esm2022/features/scaffold/scaffold.component.mjs +4 -6
  128. package/esm2022/features/select-button/select-button.component.mjs +7 -4
  129. package/esm2022/features/speech-recognition/services/speech-recognition.service.mjs +148 -0
  130. package/esm2022/features/speech-recognition/services/text-to-speech.service.mjs +88 -0
  131. package/esm2022/features/speech-recognition/speech-recognition.component.mjs +243 -0
  132. package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +521 -0
  133. package/esm2022/features/spotlight/directives/spotlight-step.directive.mjs +38 -0
  134. package/esm2022/features/spotlight/services/spotlight-tour.service.mjs +179 -0
  135. package/esm2022/features/spotlight/spotlight.component.mjs +160 -0
  136. package/esm2022/features/star-rating/star-rating.component.mjs +95 -0
  137. package/esm2022/features/stepper/stepper.component.mjs +86 -0
  138. package/esm2022/features/switch/switch.component.mjs +12 -8
  139. package/esm2022/features/tab/{tab-item.component.mjs → components/tab-item/tab-item.component.mjs} +1 -1
  140. package/esm2022/features/tab/tab.component.mjs +4 -4
  141. package/esm2022/features/table/components/table-cell-content.component.mjs +14 -5
  142. package/esm2022/features/table/table.component.mjs +220 -29
  143. package/esm2022/features/table/utils/table-data.util.mjs +71 -8
  144. package/esm2022/features/table/utils/table-layout.util.mjs +21 -1
  145. package/esm2022/features/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +367 -0
  146. package/esm2022/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.mjs +11 -0
  147. package/esm2022/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +97 -0
  148. package/esm2022/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs +181 -0
  149. package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +246 -0
  150. package/esm2022/features/tiered-menu/services/tiered-menu.event.service.mjs +16 -0
  151. package/esm2022/features/tiered-menu/services/tiered-menu.global.service.mjs +12 -0
  152. package/esm2022/features/tiered-menu/services/tiered-menu.service.mjs +49 -0
  153. package/esm2022/features/tree/components/tree-node-item/tree-node-item.component.mjs +169 -0
  154. package/esm2022/features/tree/tree.component.mjs +211 -0
  155. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.mjs +41 -0
  156. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.mjs +38 -0
  157. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.mjs +29 -0
  158. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.mjs +29 -0
  159. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.mjs +35 -0
  160. package/esm2022/features/visual-sql-editor/services/visual-sql-editor-flow.service.mjs +106 -0
  161. package/esm2022/features/visual-sql-editor/services/visual-sql-editor-state.service.mjs +230 -0
  162. package/esm2022/features/visual-sql-editor/types/visual-sql-editor.types.mjs +2 -0
  163. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.mjs +72 -0
  164. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sql.util.mjs +281 -0
  165. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-text.util.mjs +37 -0
  166. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor.constants.mjs +89 -0
  167. package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +172 -630
  168. package/esm2022/locales/en.json +351 -3
  169. package/esm2022/locales/es-CO.json +351 -3
  170. package/esm2022/locales/pt.json +351 -3
  171. package/esm2022/providers/features.provider.mjs +40 -4
  172. package/esm2022/public-api.mjs +56 -3
  173. package/features/accordion/accordion.component.d.ts +1 -1
  174. package/features/accordion/{accordion-item.component.d.ts → components/accordion-item/accordion-item.component.d.ts} +1 -1
  175. package/features/autocomplete/autocomplete.component.d.ts +102 -0
  176. package/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +11 -0
  177. package/features/card-list/card/card.component.d.ts +14 -34
  178. package/features/chat/chat.component.d.ts +31 -0
  179. package/features/checkbox-list/checkbox-list.component.d.ts +26 -0
  180. package/features/combobox/combobox.component.d.ts +2 -1
  181. package/features/context-selector/context-selector.component.d.ts +37 -0
  182. package/features/gantt/components/gantt-side-table/gantt-side-table.component.d.ts +8 -0
  183. package/features/gantt/gantt-date.utils.d.ts +36 -0
  184. package/features/gantt/gantt.component.d.ts +24 -0
  185. package/features/gantt/gantt.engine.d.ts +52 -0
  186. package/features/grid-menu/grid-menu.component.d.ts +29 -0
  187. package/features/hyperlink/hyperlink.component.d.ts +2 -1
  188. package/features/image-cropper/image-cropper.component.d.ts +43 -0
  189. package/features/image-cropper/services/image-cropper.service.d.ts +13 -0
  190. package/features/infinite-scroll/infinite-scroll.directive.d.ts +25 -0
  191. package/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.d.ts +13 -0
  192. package/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.d.ts +13 -0
  193. package/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.d.ts +13 -0
  194. package/features/inline-edit/components/inline-edit-item/inline-edit-item.component.d.ts +37 -0
  195. package/features/inline-edit/fields/inline-edit-field.d.ts +12 -0
  196. package/features/inline-edit/fields/inline-edit-number-field.d.ts +9 -0
  197. package/features/inline-edit/fields/inline-edit-text-field.d.ts +7 -0
  198. package/features/inline-edit/fields/inline-edit-textarea-field.d.ts +9 -0
  199. package/features/inline-edit/inline-edit.component.d.ts +13 -0
  200. package/features/interactive-content/interactive-content.directive.d.ts +31 -0
  201. package/features/kanban/components/kanban-column/kanban-column.component.d.ts +22 -0
  202. package/features/kanban/components/kanban-item/kanban-item.component.d.ts +23 -0
  203. package/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.d.ts +8 -0
  204. package/features/kanban/directives/kanban-template.directive.d.ts +10 -0
  205. package/features/kanban/kanban.component.d.ts +32 -0
  206. package/features/kanban/services/kanban-event.service.d.ts +15 -0
  207. package/features/loading-state/loading-state.component.d.ts +0 -2
  208. package/features/mouse-events/directives/double-click.directive.d.ts +11 -0
  209. package/features/mouse-events/directives/long-press.directive.d.ts +14 -0
  210. package/features/panel/panel.component.d.ts +12 -3
  211. package/features/pin-code-field/pin-code-field.component.d.ts +44 -0
  212. package/features/profile-picture-picker/profile-picture-picker.component.d.ts +77 -0
  213. package/features/rating-scale/rating-scale.component.d.ts +24 -0
  214. package/features/select-button/select-button.component.d.ts +2 -1
  215. package/features/speech-recognition/services/speech-recognition.service.d.ts +29 -0
  216. package/features/speech-recognition/services/text-to-speech.service.d.ts +24 -0
  217. package/features/speech-recognition/speech-recognition.component.d.ts +50 -0
  218. package/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.d.ts +59 -0
  219. package/features/spotlight/directives/spotlight-step.directive.d.ts +13 -0
  220. package/features/spotlight/services/spotlight-tour.service.d.ts +46 -0
  221. package/features/spotlight/spotlight.component.d.ts +59 -0
  222. package/features/star-rating/star-rating.component.d.ts +26 -0
  223. package/features/stepper/stepper.component.d.ts +23 -0
  224. package/features/switch/switch.component.d.ts +2 -1
  225. package/features/tab/tab.component.d.ts +1 -1
  226. package/features/table/components/table-cell-content.component.d.ts +4 -3
  227. package/features/table/table.component.d.ts +40 -5
  228. package/features/table/utils/table-data.util.d.ts +1 -0
  229. package/features/table/utils/table-layout.util.d.ts +1 -0
  230. package/features/tiered-menu/components/tiered-menu/tiered-menu.component.d.ts +49 -0
  231. package/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.d.ts +5 -0
  232. package/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.d.ts +19 -0
  233. package/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.d.ts +26 -0
  234. package/features/tiered-menu/directives/tiered-menu.directive.d.ts +44 -0
  235. package/features/tiered-menu/services/tiered-menu.event.service.d.ts +13 -0
  236. package/features/tiered-menu/services/tiered-menu.global.service.d.ts +7 -0
  237. package/features/tiered-menu/services/tiered-menu.service.d.ts +14 -0
  238. package/features/tree/components/tree-node-item/tree-node-item.component.d.ts +37 -0
  239. package/features/tree/tree.component.d.ts +37 -0
  240. package/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.d.ts +18 -0
  241. package/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.d.ts +17 -0
  242. package/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.d.ts +13 -0
  243. package/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.d.ts +13 -0
  244. package/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.d.ts +15 -0
  245. package/features/visual-sql-editor/services/visual-sql-editor-flow.service.d.ts +26 -0
  246. package/features/visual-sql-editor/services/visual-sql-editor-state.service.d.ts +72 -0
  247. package/features/visual-sql-editor/types/visual-sql-editor.types.d.ts +182 -0
  248. package/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.d.ts +14 -0
  249. package/features/visual-sql-editor/utils/visual-sql-editor-sql.util.d.ts +81 -0
  250. package/features/visual-sql-editor/utils/visual-sql-editor-text.util.d.ts +15 -0
  251. package/features/visual-sql-editor/utils/visual-sql-editor.constants.d.ts +36 -0
  252. package/features/visual-sql-editor/visual-sql-editor.component.d.ts +37 -199
  253. package/fesm2022/seniorsistemas-data-seniorx-core.mjs +14883 -6353
  254. package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
  255. package/package.json +8 -8
  256. package/public-api.d.ts +72 -2
  257. package/src/locales/en.json +353 -15
  258. package/src/locales/es-CO.json +352 -14
  259. package/src/locales/pt.json +352 -14
  260. package/styles/sdc-global-variables.scss +1 -1
  261. package/styles.css +1 -1
  262. /package/features/tab/{tab-item.component.d.ts → components/tab-item/tab-item.component.d.ts} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { CommonModule } from '@angular/common';
2
- import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewEncapsulation, computed, signal } from '@angular/core';
2
+ import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostListener, Input, Output, ViewEncapsulation, computed, inject, signal } from '@angular/core';
3
3
  import { TranslateModule } from '@ngx-translate/core';
4
4
  import { getViewportWidth, isMobileViewport } from '../../core/utils/layout.util';
5
5
  import { getFocusableElements } from '../../core/utils/focus.util';
@@ -14,13 +14,26 @@ import { TableActionsMenuComponent } from './components/table-actions-menu.compo
14
14
  import { TableCellContentComponent } from './components/table-cell-content.component';
15
15
  import { TableSortIndicatorComponent } from './components/table-sort-indicator.component';
16
16
  import { buildTableCellConfigMap, mergeTableOptions } from './utils/table-config.util';
17
- import { buildRowCheckboxId, filterTableRows, getNestedValue, resolveRowIdentityLabel } from './utils/table-data.util';
18
- import { getTableColumnMinWidthPx, getTableMinWidthPx, normalizeTableColumnAlignment } from './utils/table-layout.util';
17
+ import { buildRowCheckboxId, filterTableRows, getNestedValue, resolveRowIdentityLabel, resolveRowSelectionKey } from './utils/table-data.util';
18
+ import { getTableColumnMinWidthPx, getTableMinWidthPx, resolveTableColumnAlignment } from './utils/table-layout.util';
19
19
  import * as i0 from "@angular/core";
20
20
  import * as i1 from "@angular/common";
21
21
  import * as i2 from "@ngx-translate/core";
22
+ let tableInstanceSequence = 0;
22
23
  export class TableComponent {
24
+ static allocateTableInstanceId() {
25
+ const nextId = tableInstanceSequence;
26
+ tableInstanceSequence += 1;
27
+ return nextId;
28
+ }
29
+ elementRef = inject((ElementRef));
30
+ resizeObserver;
31
+ _tableInstanceId = null;
23
32
  actionsMenuIdSequence = 0;
33
+ get tableInstanceId() {
34
+ this._tableInstanceId ??= TableComponent.allocateTableInstanceId();
35
+ return this._tableInstanceId;
36
+ }
24
37
  colsSignal = signal([]);
25
38
  dataSignal = signal([]);
26
39
  loadingSignal = signal(false);
@@ -73,6 +86,7 @@ export class TableComponent {
73
86
  this.first.set(INDEX_ZERO);
74
87
  this.pathPartsCache.clear();
75
88
  this.rowCheckboxIdCache = new WeakMap();
89
+ this.reconcileSelectionWithData();
76
90
  this.closeActionsMenu();
77
91
  }
78
92
  get config() {
@@ -86,6 +100,7 @@ export class TableComponent {
86
100
  }
87
101
  action = new EventEmitter();
88
102
  lazyLoad = new EventEmitter();
103
+ selectionChange = new EventEmitter();
89
104
  get isLoading() {
90
105
  return this.loadingSignal();
91
106
  }
@@ -99,11 +114,31 @@ export class TableComponent {
99
114
  triggerMode = computed(() => this.options().search?.type ?? 'auto');
100
115
  totalRecordsLabel = computed(() => this.options().table?.totalRecordsLabel ?? '');
101
116
  defaultTextOverflow = computed(() => this.options().table?.textOverflow);
117
+ tableMode = computed(() => this.options().table?.mode ?? 'local');
118
+ isApiMode = computed(() => this.tableMode() === 'api');
119
+ isFitLayout = computed(() => this.options().table?.layout === 'fit');
120
+ mobileMode = computed(() => this.options().table?.mobileMode ?? 'expandable');
121
+ expandedRowIndex = signal(null);
122
+ summaryCols = computed(() => {
123
+ const SUMMARY_COL_COUNT = 2;
124
+ return this.colsSignal()
125
+ .filter(col => col.type !== 'checkbox-selection' && col.type !== 'actions' && col.type !== 'button')
126
+ .slice(0, SUMMARY_COL_COUNT);
127
+ });
128
+ checkboxCol = computed(() => this.colsSignal().find(col => col.type === 'checkbox-selection') ?? null);
102
129
  emptyTitle = computed(() => this.options().empty?.title ?? '');
103
130
  emptyText = computed(() => this.options().empty?.text ?? '');
104
131
  cellsCfg = computed(() => buildTableCellConfigMap(this.options()));
105
- filteredData = computed(() => filterTableRows(this.dataSignal(), this.colsSignal(), this.globalFilter(), this.resolveValue));
132
+ filteredData = computed(() => {
133
+ if (this.isApiMode()) {
134
+ return this.dataSignal();
135
+ }
136
+ return filterTableRows(this.dataSignal(), this.colsSignal(), this.globalFilter(), this.resolveValue);
137
+ });
106
138
  sortedData = computed(() => {
139
+ if (this.isApiMode()) {
140
+ return this.filteredData();
141
+ }
107
142
  const field = this.sortField();
108
143
  const order = this.sortOrder();
109
144
  const rows = [...this.filteredData()];
@@ -125,12 +160,21 @@ export class TableComponent {
125
160
  if (typeof leftValue === 'number' && typeof rightValue === 'number') {
126
161
  return (leftValue - rightValue) * order;
127
162
  }
128
- return String(leftValue).localeCompare(String(rightValue)) * order;
163
+ return this.toComparableText(leftValue).localeCompare(this.toComparableText(rightValue)) * order;
129
164
  });
130
165
  });
131
- totalRecords = computed(() => this.sortedData().length);
166
+ totalRecords = computed(() => {
167
+ if (!this.isApiMode()) {
168
+ return this.sortedData().length;
169
+ }
170
+ const apiTotal = this.options().pagination?.totalRecords;
171
+ if (typeof apiTotal === 'number' && Number.isFinite(apiTotal) && apiTotal >= 0) {
172
+ return Math.trunc(apiTotal);
173
+ }
174
+ return this.sortedData().length;
175
+ });
132
176
  pageData = computed(() => {
133
- if (!this.showPaginator()) {
177
+ if (!this.showPaginator() || this.isApiMode()) {
134
178
  return this.sortedData();
135
179
  }
136
180
  const start = this.first();
@@ -163,9 +207,18 @@ export class TableComponent {
163
207
  onEscapeKey() {
164
208
  this.closeActionsMenu(TableMenuFocusTarget.Trigger);
165
209
  }
166
- onWindowResize() {
167
- this.viewportWidthSignal.set(getViewportWidth());
168
- this.closeActionsMenu();
210
+ ngAfterViewInit() {
211
+ this.resizeObserver = new ResizeObserver(entries => {
212
+ const width = Math.floor(entries[0]?.contentRect.width ?? 0);
213
+ if (width > 0) {
214
+ this.viewportWidthSignal.set(width);
215
+ this.closeActionsMenu();
216
+ }
217
+ });
218
+ this.resizeObserver.observe(this.elementRef.nativeElement);
219
+ }
220
+ ngOnDestroy() {
221
+ this.resizeObserver?.disconnect();
169
222
  }
170
223
  onWindowScroll() {
171
224
  this.closeActionsMenu();
@@ -175,11 +228,17 @@ export class TableComponent {
175
228
  this.globalFilter.set(String(term));
176
229
  this.first.set(INDEX_ZERO);
177
230
  this.closeActionsMenu();
231
+ if (this.isApiMode()) {
232
+ this.emitLazyLoad('search');
233
+ }
178
234
  }
179
235
  onClearSearch() {
180
236
  this.globalFilter.set('');
181
237
  this.first.set(INDEX_ZERO);
182
238
  this.closeActionsMenu();
239
+ if (this.isApiMode()) {
240
+ this.emitLazyLoad('search');
241
+ }
183
242
  }
184
243
  toggleSort(field, enabled = true) {
185
244
  if (!enabled || !field) {
@@ -204,6 +263,9 @@ export class TableComponent {
204
263
  }
205
264
  }
206
265
  this.first.set(INDEX_ZERO);
266
+ if (this.isApiMode()) {
267
+ this.emitLazyLoad('sort');
268
+ }
207
269
  this.closeActionsMenu();
208
270
  }
209
271
  getSortAriaAttribute(col) {
@@ -222,16 +284,30 @@ export class TableComponent {
222
284
  }
223
285
  return 'none';
224
286
  }
225
- columnAlignClass(col) {
226
- const align = normalizeTableColumnAlignment(col.align);
227
- return align ? `sdc-table-td-align-${align}` : null;
287
+ columnAlignClass(col, target = 'cell') {
288
+ const align = resolveTableColumnAlignment(col, target);
289
+ return target === 'header'
290
+ ? `sdc-table-th-align-${align}`
291
+ : `sdc-table-td-align-${align}`;
228
292
  }
229
293
  isSortableColumn(col) {
230
294
  return col.sortable !== false && !!col.field;
231
295
  }
296
+ hasDataRows() {
297
+ return this.dataSignal().length > 0;
298
+ }
299
+ canSortColumn(col) {
300
+ return this.hasDataRows() && this.isSortableColumn(col);
301
+ }
232
302
  columnMinWidthPx(col) {
233
303
  return getTableColumnMinWidthPx(col);
234
304
  }
305
+ colWidthStyle(col) {
306
+ if (this.isFitLayout()) {
307
+ return undefined;
308
+ }
309
+ return col.width != null ? `${col.width}%` : `${getTableColumnMinWidthPx(col)}px`;
310
+ }
235
311
  mobileFieldLabel(col) {
236
312
  if (col.header) {
237
313
  return col.header;
@@ -247,15 +323,25 @@ export class TableComponent {
247
323
  return '';
248
324
  }
249
325
  }
326
+ toggleExpandRow(index) {
327
+ this.expandedRowIndex.set(this.expandedRowIndex() === index ? null : index);
328
+ }
329
+ isRowExpanded(index) {
330
+ return this.expandedRowIndex() === index;
331
+ }
250
332
  onPageChange(event) {
251
333
  const nextFirst = event.first ?? INDEX_ZERO;
252
334
  const nextRows = event.rows ?? this.options().pagination?.rowsPerPage ?? DEFAULT_ROWS_PER_PAGE;
253
335
  this.first.set(nextFirst);
254
336
  this.rows.set(nextRows);
255
- this.lazyLoad.emit({ first: nextFirst, rows: nextRows });
337
+ this.expandedRowIndex.set(null);
338
+ this.emitLazyLoad('page');
256
339
  this.closeActionsMenu();
257
340
  }
258
341
  onToggleRow(row, checked) {
342
+ if (this.isRowSelectionDisabled(row)) {
343
+ return;
344
+ }
259
345
  const nextSelection = new Set(this.selectionSet());
260
346
  if (checked) {
261
347
  nextSelection.add(row);
@@ -263,14 +349,21 @@ export class TableComponent {
263
349
  else {
264
350
  nextSelection.delete(row);
265
351
  }
266
- this.selection.set([...nextSelection]);
352
+ this.updateSelection(nextSelection);
267
353
  }
268
354
  isRowSelected(row) {
269
355
  return this.selectionSet().has(row);
270
356
  }
357
+ isRowSelectionDisabled(row) {
358
+ const disabled = this.cellsCfg().checkbox.disabled;
359
+ if (typeof disabled === 'function') {
360
+ return disabled(row);
361
+ }
362
+ return disabled === true;
363
+ }
271
364
  toggleSelectPage(checked) {
272
365
  const nextSelection = new Set(this.selectionSet());
273
- this.pageData().forEach((row) => {
366
+ this.selectablePageRows().forEach((row) => {
274
367
  if (checked) {
275
368
  nextSelection.add(row);
276
369
  }
@@ -278,16 +371,34 @@ export class TableComponent {
278
371
  nextSelection.delete(row);
279
372
  }
280
373
  });
281
- this.selection.set([...nextSelection]);
374
+ this.updateSelection(nextSelection);
282
375
  }
283
376
  isPageFullySelected() {
284
- const visibleRows = this.pageData();
377
+ const visibleRows = this.selectablePageRows();
285
378
  if (visibleRows.length === 0) {
286
379
  return false;
287
380
  }
288
381
  const selectedRows = this.selectionSet();
289
382
  return visibleRows.every((row) => selectedRows.has(row));
290
383
  }
384
+ isPagePartiallySelected() {
385
+ const visibleRows = this.selectablePageRows();
386
+ if (visibleRows.length === 0) {
387
+ return false;
388
+ }
389
+ const selectedRows = this.selectionSet();
390
+ const selectedCount = visibleRows.filter((row) => selectedRows.has(row)).length;
391
+ return selectedCount > 0 && selectedCount < visibleRows.length;
392
+ }
393
+ hasSelectablePageRows() {
394
+ return this.selectablePageRows().length > 0;
395
+ }
396
+ getPageSelectionAriaChecked() {
397
+ if (this.isPagePartiallySelected()) {
398
+ return 'mixed';
399
+ }
400
+ return this.isPageFullySelected() ? 'true' : 'false';
401
+ }
291
402
  getCheckedValue(event) {
292
403
  return event.target.checked;
293
404
  }
@@ -306,6 +417,9 @@ export class TableComponent {
306
417
  getRowCheckboxLabel(row) {
307
418
  return resolveRowIdentityLabel(row);
308
419
  }
420
+ getSelectAllCheckboxId(columnIndex) {
421
+ return `sdc-table-${this.tableInstanceId}-select-all-checkbox-${columnIndex}`;
422
+ }
309
423
  tableAriaLabelKey() {
310
424
  return this.ariaLabelSignal() ?? 'platform.datacore.accessibility.table_description';
311
425
  }
@@ -377,7 +491,7 @@ export class TableComponent {
377
491
  }
378
492
  const fieldKey = col.actionField ?? col.field;
379
493
  const rowValue = fieldKey ? this.resolveValue(row, fieldKey) : undefined;
380
- this.action.emit({ row, column: col, value: { action: item, rowValue } });
494
+ this.action.emit({ row, column: col, value: { rowValue, action: item } });
381
495
  }
382
496
  onButtonClick(row, col) {
383
497
  const key = col.actionField ?? col.field;
@@ -393,6 +507,19 @@ export class TableComponent {
393
507
  cellCfg(kind) {
394
508
  return this.cellsCfg()[kind];
395
509
  }
510
+ emitLazyLoad(trigger) {
511
+ const payload = {
512
+ first: this.first(),
513
+ rows: this.rows(),
514
+ sortField: this.sortField(),
515
+ sortOrder: this.sortOrder(),
516
+ trigger
517
+ };
518
+ if (trigger === 'search') {
519
+ payload.searchTerm = this.globalFilter();
520
+ }
521
+ this.lazyLoad.emit(payload);
522
+ }
396
523
  clampPage() {
397
524
  if (!this.showPaginator()) {
398
525
  return;
@@ -403,11 +530,25 @@ export class TableComponent {
403
530
  }
404
531
  }
405
532
  reconcileSelectionWithData() {
406
- const dataSet = new Set(this.dataSignal());
407
- const nextSelection = this.selection().filter((row) => dataSet.has(row));
408
- if (nextSelection.length !== this.selection().length) {
409
- this.selection.set(nextSelection);
533
+ const rowsByKey = new Map();
534
+ for (const row of this.dataSignal()) {
535
+ const rowKey = this.getSelectionKey(row);
536
+ if (!rowsByKey.has(rowKey)) {
537
+ rowsByKey.set(rowKey, row);
538
+ }
539
+ }
540
+ const seenKeys = new Set();
541
+ const nextSelection = [];
542
+ for (const row of this.selection()) {
543
+ const rowKey = this.getSelectionKey(row);
544
+ const nextRow = rowsByKey.get(rowKey);
545
+ const isInvalidRow = !nextRow || seenKeys.has(rowKey) || this.isRowSelectionDisabled(nextRow);
546
+ if (!isInvalidRow) {
547
+ seenKeys.add(rowKey);
548
+ nextSelection.push(nextRow);
549
+ }
410
550
  }
551
+ this.updateSelection(nextSelection);
411
552
  }
412
553
  resolveActionDisabled(item, row) {
413
554
  if (typeof item.disabled === 'function') {
@@ -415,6 +556,57 @@ export class TableComponent {
415
556
  }
416
557
  return item.disabled === true;
417
558
  }
559
+ selectablePageRows() {
560
+ return this.pageData().filter((row) => !this.isRowSelectionDisabled(row));
561
+ }
562
+ updateSelection(nextSelection) {
563
+ const normalizedSelection = this.normalizeSelection(nextSelection);
564
+ if (this.hasSameSelection(this.selection(), normalizedSelection)) {
565
+ return;
566
+ }
567
+ this.selection.set(normalizedSelection);
568
+ this.selectionChange.emit([...normalizedSelection]);
569
+ }
570
+ normalizeSelection(nextSelection) {
571
+ const normalizedSelection = [];
572
+ const seenRows = new Set();
573
+ for (const row of nextSelection) {
574
+ const rowKey = this.getSelectionKey(row);
575
+ const shouldAppend = !seenRows.has(rowKey) && !this.isRowSelectionDisabled(row);
576
+ if (shouldAppend) {
577
+ seenRows.add(rowKey);
578
+ normalizedSelection.push(row);
579
+ }
580
+ }
581
+ return normalizedSelection;
582
+ }
583
+ getSelectionKey(row) {
584
+ return resolveRowSelectionKey(row);
585
+ }
586
+ hasSameSelection(currentSelection, nextSelection) {
587
+ return currentSelection.length === nextSelection.length
588
+ && currentSelection.every((row, index) => row === nextSelection[index]);
589
+ }
590
+ toComparableText(value) {
591
+ if (value == null) {
592
+ return '';
593
+ }
594
+ if (typeof value === 'string') {
595
+ return value;
596
+ }
597
+ if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {
598
+ return String(value);
599
+ }
600
+ if (typeof value === 'object') {
601
+ try {
602
+ return JSON.stringify(value);
603
+ }
604
+ catch {
605
+ return '';
606
+ }
607
+ }
608
+ return '';
609
+ }
418
610
  nextActionsMenuId() {
419
611
  this.actionsMenuIdSequence += 1;
420
612
  return `sdc-table-actions-menu-${this.actionsMenuIdSequence}`;
@@ -439,7 +631,7 @@ export class TableComponent {
439
631
  nextElement?.focus();
440
632
  }
441
633
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
442
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TableComponent, isStandalone: true, selector: "sdc-table", inputs: { cols: "cols", data: "data", loading: "loading", config: "config", ariaLabel: "ariaLabel" }, outputs: { action: "action", lazyLoad: "lazyLoad" }, host: { listeners: { "document:click": "onDocumentClick()", "document:keydown.escape": "onEscapeKey()", "window:resize": "onWindowResize()", "window:scroll": "onWindowScroll()" } }, ngImport: i0, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"'dots'\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility.search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div class=\"sdc-table-scroll\" [style.--sdc-table-min-width.px]=\"tableMinWidthPx()\">\n <table\n class=\"sdc-table-grid\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"col.width ?? (columnMinWidthPx(col) + 'px')\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"isSortableColumn(col)\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"isSortableColumn(col) ? 0 : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n (keydown.enter)=\"col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n >\n <div class=\"sdc-table-th-inner\" [class.sdc-table-sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"'select-all-checkbox'\"\n [checked]=\"isPageFullySelected()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility.select_all_rows' | translate\"\n [attr.aria-checked]=\"isPageFullySelected()\"\n />\n <label for=\"select-all-checkbox\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility.select_all_rows' | translate }}\n </label>\n </span>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr role=\"row\" [attr.aria-rowindex]=\"r + 1\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [menuId]=\"menu.menuId\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (close)=\"onMenuClose($event)\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden}.sdc-table-sort-overlay{position:relative;margin-left:auto}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}thead th.sdc-table-th-checkbox .sdc-table-th-center{position:absolute;inset:0;display:flex;align-items:center;justify-content:flex-end;padding-right:10px;pointer-events:none}thead th.sdc-table-th-checkbox .sdc-table-th-center input{pointer-events:auto}thead th.sdc-table-th-checkbox .sdc-table-th-inner{padding-right:28px}.sdc-table-paginator{padding:.5rem 0}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.sdc-table-mobile-list{display:flex;flex-direction:column;gap:.375rem;width:100%}.sdc-table-mobile-card{display:flex;flex-direction:column;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.25rem;background:var(--sdc-surface-bg, #ffffff);overflow:hidden}.sdc-table-mobile-card--loading{gap:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,8.5rem) minmax(0,1fr);gap:.875rem 1rem;align-items:start;padding:.9rem 1rem;border-top:1px solid var(--sdc-border-default, #cccccc);background:transparent}.sdc-table-mobile-field:first-child{border-top:0}.sdc-table-mobile-field--selected{background:#11182705}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.625rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:space-between;gap:.625rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.75rem;font-weight:600;line-height:1.35;letter-spacing:.01em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:7rem;height:.75rem;border-radius:999px;background:linear-gradient(90deg,#94a3b82e,#94a3b852,#94a3b82e)}.sdc-table-mobile-skeleton{min-height:2.75rem;border-radius:.75rem;background:linear-gradient(90deg,#94a3b81f,#94a3b833,#94a3b81f)}.sdc-table-mobile-value{display:flex;align-items:flex-start}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182706}}@media (max-width: 540px){.sdc-table-mobile-field{grid-template-columns:1fr;gap:.5rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: PaginatorComponent, selector: "sdc-paginator", inputs: ["first", "rows", "totalRecords", "rowsPerPageOptions", "showRowsPerPageSelector", "isMobile", "totalRecordsLabel"], outputs: ["pageChange"] }, { kind: "component", type: LoadingStateComponent, selector: "sdc-loading-state", inputs: ["indicator", "id", "blockWindow", "blockDelayMs", "unblockDelayMs", "loading"] }, { kind: "component", type: EmptyStateComponent, selector: "sdc-empty-state", inputs: ["id", "title", "variant", "titleParams", "iconClass", "description", "descriptionParams", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "primaryActionLabelParams", "secondaryActionLabel", "secondaryActionLabelParams", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: TableSortIndicatorComponent, selector: "sdc-table-sort-indicator", inputs: ["columnField", "columnType", "sortField", "sortOrder", "sortable"] }, { kind: "component", type: TableCellContentComponent, selector: "sdc-table-cell-content", inputs: ["cellConfigs", "col", "resolveValue", "row", "actionsMenuOpen", "actionsMenuId", "defaultTextOverflow", "rowCheckboxId", "rowLabel", "rowSelected"], outputs: ["toggleActionsMenu", "toggleRow", "triggerButtonAction"] }, { kind: "component", type: TableActionsMenuComponent, selector: "sdc-table-actions-menu", inputs: ["ariaLabel", "items", "left", "menuId", "top", "width"], outputs: ["close", "select"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
634
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TableComponent, isStandalone: true, selector: "sdc-table", inputs: { cols: "cols", data: "data", loading: "loading", config: "config", ariaLabel: "ariaLabel" }, outputs: { action: "action", lazyLoad: "lazyLoad", selectionChange: "selectionChange" }, host: { listeners: { "document:click": "onDocumentClick()", "document:keydown.escape": "onEscapeKey()", "window:scroll": "onWindowScroll()" } }, ngImport: i0, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"'dots'\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility.search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div\n class=\"sdc-table-scroll\"\n [style.--sdc-table-min-width]=\"isFitLayout() ? '100%' : tableMinWidthPx() + 'px'\"\n >\n <table\n class=\"sdc-table-grid\"\n [class.sdc-table-grid--fit]=\"isFitLayout()\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"colWidthStyle(col)\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"canSortColumn(col)\"\n [class.sdc-table-sortable-disabled]=\"isSortableColumn(col) && !canSortColumn(col)\"\n [class.sdc-table-header-disabled]=\"!hasDataRows()\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col, 'header')\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"hasDataRows() && canSortColumn(col) ? 0 : null\"\n [attr.aria-disabled]=\"!hasDataRows() || (isSortableColumn(col) && !canSortColumn(col)) ? 'true' : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.enter)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n >\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <div class=\"sdc-table-th-inner sdc-table-th-inner--checkbox\">\n <span class=\"sdc-table-th-label sr-only\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"getSelectAllCheckboxId($index)\"\n [checked]=\"isPageFullySelected()\"\n [indeterminate]=\"isPagePartiallySelected()\"\n [disabled]=\"!hasSelectablePageRows()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility.select_all_rows' | translate\"\n [attr.aria-checked]=\"getPageSelectionAriaChecked()\"\n />\n <label [for]=\"getSelectAllCheckboxId($index)\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility.select_all_rows' | translate }}\n </label>\n </span>\n </div>\n } @else {\n <div class=\"sdc-table-th-inner\" [class.sdc-table-th-inner--sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr role=\"row\" [attr.aria-rowindex]=\"r + 1\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else if (mobileMode() === 'stacked') {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n } @else {\n <ul\n class=\"sdc-table-expandable-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex) {\n <li class=\"sdc-table-expandable-item sdc-table-expandable-item--loading\" aria-hidden=\"true\">\n <div class=\"sdc-table-expandable-summary sdc-table-expandable-summary--loading\">\n <div class=\"sdc-table-expandable-summary-fields\">\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-primary\"></div>\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-secondary\"></div>\n </div>\n <span class=\"sdc-table-expandable-chevron\" aria-hidden=\"true\">\n <i class=\"fas fa-chevron-down\"></i>\n </span>\n </div>\n </li>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <li\n class=\"sdc-table-expandable-item\"\n [class.sdc-table-expandable-item--expanded]=\"isRowExpanded(r)\"\n >\n <div\n class=\"sdc-table-expandable-summary\"\n (click)=\"toggleExpandRow(r)\"\n (keydown.enter)=\"toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); toggleExpandRow(r)\"\n >\n @if (checkboxCol(); as cbCol) {\n <div\n class=\"sdc-table-expandable-checkbox\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"cbCol\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, cbCol)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, cbCol, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n <div class=\"sdc-table-expandable-summary-fields\">\n @for (col of summaryCols(); track $index) {\n <div class=\"sdc-table-expandable-summary-field\">\n <span class=\"sdc-table-expandable-summary-label\">{{ mobileFieldLabel(col) | translate }}</span>\n <div class=\"sdc-table-expandable-summary-value\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n <button\n type=\"button\"\n class=\"sdc-table-expandable-toggle\"\n [attr.aria-expanded]=\"isRowExpanded(r)\"\n [attr.aria-label]=\"\n isRowExpanded(r)\n ? ('platform.datacore.accessibility.collapse_row' | translate)\n : ('platform.datacore.accessibility.expand_row' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.enter)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); $event.stopPropagation(); toggleExpandRow(r)\"\n >\n <span\n class=\"sdc-table-expandable-chevron\"\n [class.sdc-table-expandable-chevron--open]=\"isRowExpanded(r)\"\n aria-hidden=\"true\"\n ><i class=\"fas fa-chevron-down\"></i></span>\n </button>\n </div>\n @if (isRowExpanded(r)) {\n <div class=\"sdc-table-expandable-details\">\n @for (col of cols; track $index) {\n @if (col.type !== 'checkbox-selection') {\n <div\n class=\"sdc-table-expandable-field\"\n [class.sdc-table-expandable-field--full-width]=\"\n col.type === 'button' || col.type === 'actions'\n \"\n >\n @if (col.type !== 'button' && col.type !== 'actions') {\n <div class=\"sdc-table-expandable-label-wrap\">\n <span class=\"sdc-table-expandable-label\">{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n <div class=\"sdc-table-expandable-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n }\n </div>\n }\n </li>\n }\n }\n </ul>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [menuId]=\"menu.menuId\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (close)=\"onMenuClose($event)\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}.sdc-table-grid--fit{table-layout:fixed}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable-disabled,thead th.sdc-table-header-disabled{cursor:default}thead th.sdc-table-sortable-disabled:focus,thead th.sdc-table-sortable-disabled:focus-visible{outline:none;box-shadow:none}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}thead th.sdc-table-is-selected .sdc-table-sort-overlay{right:.5rem}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden;text-align:inherit}.sdc-table-sort-overlay{position:absolute;right:0;top:50%;transform:translateY(-50%)}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto;width:100%;text-align:inherit}.sdc-table-th-inner--sortable{padding-right:1.5rem}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}.sdc-table--initial-loading .sdc-table-scroll{overflow-x:hidden}thead th.sdc-table-th-checkbox .sdc-table-th-inner--checkbox{justify-content:center}thead th.sdc-table-th-checkbox .sdc-table-th-center{display:flex;align-items:center;justify-content:center;width:100%}thead th.sdc-table-th-checkbox .sdc-table-th-center input{cursor:pointer;margin:0}thead th.sdc-table-th-checkbox .sdc-table-th-center input:disabled{cursor:not-allowed}.sdc-table-paginator{padding:.5rem 0}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-th-align-left{text-align:left}.sdc-table-th-align-center{text-align:center}.sdc-table-th-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}@keyframes sdc-mobile-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.sdc-table-mobile-list{display:flex;flex-direction:column;width:100%;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.5rem;overflow:hidden}.sdc-table-mobile-card{display:flex;flex-direction:column;background:var(--sdc-formfield-default-bg, #ffffff);border-top:2px solid var(--sdc-border-strong, #d1d5db)}.sdc-table-mobile-card:first-child{border-top:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.5rem 1rem;border-top:1px solid rgba(0,0,0,.05)}.sdc-table-mobile-field:first-child{border-top:0;padding-top:.75rem}.sdc-table-mobile-field:last-child{padding-bottom:.75rem}.sdc-table-mobile-field--selected{background:#11182706}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-field--full-width>.sdc-table-mobile-label-wrap{display:none}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:flex-start;gap:.25rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:5.5rem;height:.625rem;border-radius:999px;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b824,#94a3b842,#94a3b824);background-size:200% 100%}.sdc-table-mobile-skeleton{min-height:1.25rem;border-radius:.25rem;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b81a,#94a3b82e,#94a3b81a);background-size:200% 100%}.sdc-table-mobile-value{display:flex;align-items:flex-start;width:100%}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182705}}@media (max-width: 540px){.sdc-table-mobile-list{border-radius:.375rem}.sdc-table-mobile-field{grid-template-columns:1fr;gap:.125rem;padding:.4375rem .875rem}.sdc-table-mobile-field:first-child{padding-top:.625rem}.sdc-table-mobile-field:last-child{padding-bottom:.625rem}}.sdc-table-expandable-list{display:flex;flex-direction:column;width:100%;list-style:none;margin:0;padding:0;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.5rem;overflow:hidden}.sdc-table-expandable-item{display:flex;flex-direction:column;background:var(--sdc-formfield-default-bg, #ffffff);border-top:1px solid var(--sdc-border-strong, #d1d5db)}.sdc-table-expandable-item:first-child{border-top:0}.sdc-table-expandable-summary{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-expandable-summary--loading{pointer-events:none}.sdc-table-expandable-summary:hover{background:#11182705}.sdc-table-expandable-checkbox{flex:0 0 auto}.sdc-table-expandable-summary-fields{display:flex;flex:1 1 0;flex-wrap:wrap;gap:.125rem 1.5rem;min-width:0}.sdc-table-expandable-summary-field{display:flex;flex-direction:column;min-width:0}.sdc-table-expandable-summary-label{color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-table-expandable-summary-value{display:flex;align-items:center;min-width:0}.sdc-table-expandable-toggle{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:1.75rem;height:1.75rem;padding:0;border:0;border-radius:50%;background:transparent;color:var(--sdc-text-muted, #6b7280);cursor:pointer;transition:color var(--sdc-table-transition-fast, .15s ease),background var(--sdc-table-transition-fast, .15s ease)}.sdc-table-expandable-toggle:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:2px}.sdc-table-expandable-toggle:hover{color:var(--sdc-text-default, #111827);background:#1118270f}.sdc-table-expandable-chevron{display:flex;align-items:center;justify-content:center;font-size:.75rem;transition:transform .2s ease}.sdc-table-expandable-label-wrap,.sdc-table-expandable-value{min-width:0}.sdc-table-expandable-details{padding:.375rem 0;border-top:1px solid rgba(0,0,0,.06);background:#11182704}.sdc-table-expandable-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.375rem 1rem;border-top:1px solid rgba(0,0,0,.04)}.sdc-table-expandable-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-expandable-field:first-child{border-top:0}.sdc-table-expandable-field--full-width>.sdc-table-expandable-label-wrap{display:none}.sdc-table-expandable-label{display:flex;align-items:center;color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em}.sdc-table-expandable-value{display:flex;align-items:flex-start;width:100%}.sdc-table-expandable-skeleton-primary{width:55%;max-width:10rem}.sdc-table-expandable-skeleton-secondary{width:35%;max-width:7rem}.sdc-table-expandable-chevron--open{transform:rotate(180deg)}.sdc-table-expandable-item--expanded .sdc-table-expandable-summary{background:#11182706}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: PaginatorComponent, selector: "sdc-paginator", inputs: ["first", "rows", "totalRecords", "rowsPerPageOptions", "showRowsPerPageSelector", "isMobile", "totalRecordsLabel"], outputs: ["pageChange"] }, { kind: "component", type: LoadingStateComponent, selector: "sdc-loading-state", inputs: ["indicator", "id", "blockWindow", "blockDelayMs", "unblockDelayMs", "loading"] }, { kind: "component", type: EmptyStateComponent, selector: "sdc-empty-state", inputs: ["id", "title", "variant", "titleParams", "iconClass", "description", "descriptionParams", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "primaryActionLabelParams", "secondaryActionLabel", "secondaryActionLabelParams", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: TableSortIndicatorComponent, selector: "sdc-table-sort-indicator", inputs: ["columnField", "columnType", "sortField", "sortOrder", "sortable"] }, { kind: "component", type: TableCellContentComponent, selector: "sdc-table-cell-content", inputs: ["cellConfigs", "col", "resolveValue", "row", "actionsMenuOpen", "actionsMenuId", "defaultTextOverflow", "rowCheckboxId", "rowLabel", "rowSelectionDisabled", "forceLeftAlign", "rowSelected"], outputs: ["toggleActionsMenu", "toggleRow", "triggerButtonAction"] }, { kind: "component", type: TableActionsMenuComponent, selector: "sdc-table-actions-menu", inputs: ["ariaLabel", "items", "left", "menuId", "top", "width"], outputs: ["close", "select"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
443
635
  }
444
636
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableComponent, decorators: [{
445
637
  type: Component,
@@ -454,7 +646,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
454
646
  TableSortIndicatorComponent,
455
647
  TableCellContentComponent,
456
648
  TableActionsMenuComponent
457
- ], encapsulation: ViewEncapsulation.Emulated, changeDetection: ChangeDetectionStrategy.OnPush, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"'dots'\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility.search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div class=\"sdc-table-scroll\" [style.--sdc-table-min-width.px]=\"tableMinWidthPx()\">\n <table\n class=\"sdc-table-grid\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"col.width ?? (columnMinWidthPx(col) + 'px')\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"isSortableColumn(col)\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"isSortableColumn(col) ? 0 : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n (keydown.enter)=\"col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n col.field ? toggleSort(col.field, isSortableColumn(col)) : null\"\n >\n <div class=\"sdc-table-th-inner\" [class.sdc-table-sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"'select-all-checkbox'\"\n [checked]=\"isPageFullySelected()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility.select_all_rows' | translate\"\n [attr.aria-checked]=\"isPageFullySelected()\"\n />\n <label for=\"select-all-checkbox\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility.select_all_rows' | translate }}\n </label>\n </span>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr role=\"row\" [attr.aria-rowindex]=\"r + 1\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [menuId]=\"menu.menuId\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (close)=\"onMenuClose($event)\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden}.sdc-table-sort-overlay{position:relative;margin-left:auto}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}thead th.sdc-table-th-checkbox .sdc-table-th-center{position:absolute;inset:0;display:flex;align-items:center;justify-content:flex-end;padding-right:10px;pointer-events:none}thead th.sdc-table-th-checkbox .sdc-table-th-center input{pointer-events:auto}thead th.sdc-table-th-checkbox .sdc-table-th-inner{padding-right:28px}.sdc-table-paginator{padding:.5rem 0}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.sdc-table-mobile-list{display:flex;flex-direction:column;gap:.375rem;width:100%}.sdc-table-mobile-card{display:flex;flex-direction:column;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.25rem;background:var(--sdc-surface-bg, #ffffff);overflow:hidden}.sdc-table-mobile-card--loading{gap:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,8.5rem) minmax(0,1fr);gap:.875rem 1rem;align-items:start;padding:.9rem 1rem;border-top:1px solid var(--sdc-border-default, #cccccc);background:transparent}.sdc-table-mobile-field:first-child{border-top:0}.sdc-table-mobile-field--selected{background:#11182705}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.625rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:space-between;gap:.625rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.75rem;font-weight:600;line-height:1.35;letter-spacing:.01em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:7rem;height:.75rem;border-radius:999px;background:linear-gradient(90deg,#94a3b82e,#94a3b852,#94a3b82e)}.sdc-table-mobile-skeleton{min-height:2.75rem;border-radius:.75rem;background:linear-gradient(90deg,#94a3b81f,#94a3b833,#94a3b81f)}.sdc-table-mobile-value{display:flex;align-items:flex-start}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182706}}@media (max-width: 540px){.sdc-table-mobile-field{grid-template-columns:1fr;gap:.5rem}}\n"] }]
649
+ ], encapsulation: ViewEncapsulation.Emulated, changeDetection: ChangeDetectionStrategy.OnPush, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"'dots'\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility.search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div\n class=\"sdc-table-scroll\"\n [style.--sdc-table-min-width]=\"isFitLayout() ? '100%' : tableMinWidthPx() + 'px'\"\n >\n <table\n class=\"sdc-table-grid\"\n [class.sdc-table-grid--fit]=\"isFitLayout()\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"colWidthStyle(col)\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"canSortColumn(col)\"\n [class.sdc-table-sortable-disabled]=\"isSortableColumn(col) && !canSortColumn(col)\"\n [class.sdc-table-header-disabled]=\"!hasDataRows()\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col, 'header')\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"hasDataRows() && canSortColumn(col) ? 0 : null\"\n [attr.aria-disabled]=\"!hasDataRows() || (isSortableColumn(col) && !canSortColumn(col)) ? 'true' : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.enter)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n >\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <div class=\"sdc-table-th-inner sdc-table-th-inner--checkbox\">\n <span class=\"sdc-table-th-label sr-only\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"getSelectAllCheckboxId($index)\"\n [checked]=\"isPageFullySelected()\"\n [indeterminate]=\"isPagePartiallySelected()\"\n [disabled]=\"!hasSelectablePageRows()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility.select_all_rows' | translate\"\n [attr.aria-checked]=\"getPageSelectionAriaChecked()\"\n />\n <label [for]=\"getSelectAllCheckboxId($index)\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility.select_all_rows' | translate }}\n </label>\n </span>\n </div>\n } @else {\n <div class=\"sdc-table-th-inner\" [class.sdc-table-th-inner--sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr role=\"row\" [attr.aria-rowindex]=\"r + 1\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else if (mobileMode() === 'stacked') {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility.sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n } @else {\n <ul\n class=\"sdc-table-expandable-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex) {\n <li class=\"sdc-table-expandable-item sdc-table-expandable-item--loading\" aria-hidden=\"true\">\n <div class=\"sdc-table-expandable-summary sdc-table-expandable-summary--loading\">\n <div class=\"sdc-table-expandable-summary-fields\">\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-primary\"></div>\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-secondary\"></div>\n </div>\n <span class=\"sdc-table-expandable-chevron\" aria-hidden=\"true\">\n <i class=\"fas fa-chevron-down\"></i>\n </span>\n </div>\n </li>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <li\n class=\"sdc-table-expandable-item\"\n [class.sdc-table-expandable-item--expanded]=\"isRowExpanded(r)\"\n >\n <div\n class=\"sdc-table-expandable-summary\"\n (click)=\"toggleExpandRow(r)\"\n (keydown.enter)=\"toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); toggleExpandRow(r)\"\n >\n @if (checkboxCol(); as cbCol) {\n <div\n class=\"sdc-table-expandable-checkbox\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"cbCol\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, cbCol)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, cbCol, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n <div class=\"sdc-table-expandable-summary-fields\">\n @for (col of summaryCols(); track $index) {\n <div class=\"sdc-table-expandable-summary-field\">\n <span class=\"sdc-table-expandable-summary-label\">{{ mobileFieldLabel(col) | translate }}</span>\n <div class=\"sdc-table-expandable-summary-value\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n <button\n type=\"button\"\n class=\"sdc-table-expandable-toggle\"\n [attr.aria-expanded]=\"isRowExpanded(r)\"\n [attr.aria-label]=\"\n isRowExpanded(r)\n ? ('platform.datacore.accessibility.collapse_row' | translate)\n : ('platform.datacore.accessibility.expand_row' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.enter)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); $event.stopPropagation(); toggleExpandRow(r)\"\n >\n <span\n class=\"sdc-table-expandable-chevron\"\n [class.sdc-table-expandable-chevron--open]=\"isRowExpanded(r)\"\n aria-hidden=\"true\"\n ><i class=\"fas fa-chevron-down\"></i></span>\n </button>\n </div>\n @if (isRowExpanded(r)) {\n <div class=\"sdc-table-expandable-details\">\n @for (col of cols; track $index) {\n @if (col.type !== 'checkbox-selection') {\n <div\n class=\"sdc-table-expandable-field\"\n [class.sdc-table-expandable-field--full-width]=\"\n col.type === 'button' || col.type === 'actions'\n \"\n >\n @if (col.type !== 'button' && col.type !== 'actions') {\n <div class=\"sdc-table-expandable-label-wrap\">\n <span class=\"sdc-table-expandable-label\">{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n <div class=\"sdc-table-expandable-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n }\n </div>\n }\n </li>\n }\n }\n </ul>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [menuId]=\"menu.menuId\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (close)=\"onMenuClose($event)\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}.sdc-table-grid--fit{table-layout:fixed}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable-disabled,thead th.sdc-table-header-disabled{cursor:default}thead th.sdc-table-sortable-disabled:focus,thead th.sdc-table-sortable-disabled:focus-visible{outline:none;box-shadow:none}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}thead th.sdc-table-is-selected .sdc-table-sort-overlay{right:.5rem}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden;text-align:inherit}.sdc-table-sort-overlay{position:absolute;right:0;top:50%;transform:translateY(-50%)}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto;width:100%;text-align:inherit}.sdc-table-th-inner--sortable{padding-right:1.5rem}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}.sdc-table--initial-loading .sdc-table-scroll{overflow-x:hidden}thead th.sdc-table-th-checkbox .sdc-table-th-inner--checkbox{justify-content:center}thead th.sdc-table-th-checkbox .sdc-table-th-center{display:flex;align-items:center;justify-content:center;width:100%}thead th.sdc-table-th-checkbox .sdc-table-th-center input{cursor:pointer;margin:0}thead th.sdc-table-th-checkbox .sdc-table-th-center input:disabled{cursor:not-allowed}.sdc-table-paginator{padding:.5rem 0}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-th-align-left{text-align:left}.sdc-table-th-align-center{text-align:center}.sdc-table-th-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}@keyframes sdc-mobile-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.sdc-table-mobile-list{display:flex;flex-direction:column;width:100%;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.5rem;overflow:hidden}.sdc-table-mobile-card{display:flex;flex-direction:column;background:var(--sdc-formfield-default-bg, #ffffff);border-top:2px solid var(--sdc-border-strong, #d1d5db)}.sdc-table-mobile-card:first-child{border-top:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.5rem 1rem;border-top:1px solid rgba(0,0,0,.05)}.sdc-table-mobile-field:first-child{border-top:0;padding-top:.75rem}.sdc-table-mobile-field:last-child{padding-bottom:.75rem}.sdc-table-mobile-field--selected{background:#11182706}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-field--full-width>.sdc-table-mobile-label-wrap{display:none}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:flex-start;gap:.25rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:5.5rem;height:.625rem;border-radius:999px;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b824,#94a3b842,#94a3b824);background-size:200% 100%}.sdc-table-mobile-skeleton{min-height:1.25rem;border-radius:.25rem;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b81a,#94a3b82e,#94a3b81a);background-size:200% 100%}.sdc-table-mobile-value{display:flex;align-items:flex-start;width:100%}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182705}}@media (max-width: 540px){.sdc-table-mobile-list{border-radius:.375rem}.sdc-table-mobile-field{grid-template-columns:1fr;gap:.125rem;padding:.4375rem .875rem}.sdc-table-mobile-field:first-child{padding-top:.625rem}.sdc-table-mobile-field:last-child{padding-bottom:.625rem}}.sdc-table-expandable-list{display:flex;flex-direction:column;width:100%;list-style:none;margin:0;padding:0;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.5rem;overflow:hidden}.sdc-table-expandable-item{display:flex;flex-direction:column;background:var(--sdc-formfield-default-bg, #ffffff);border-top:1px solid var(--sdc-border-strong, #d1d5db)}.sdc-table-expandable-item:first-child{border-top:0}.sdc-table-expandable-summary{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-expandable-summary--loading{pointer-events:none}.sdc-table-expandable-summary:hover{background:#11182705}.sdc-table-expandable-checkbox{flex:0 0 auto}.sdc-table-expandable-summary-fields{display:flex;flex:1 1 0;flex-wrap:wrap;gap:.125rem 1.5rem;min-width:0}.sdc-table-expandable-summary-field{display:flex;flex-direction:column;min-width:0}.sdc-table-expandable-summary-label{color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-table-expandable-summary-value{display:flex;align-items:center;min-width:0}.sdc-table-expandable-toggle{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:1.75rem;height:1.75rem;padding:0;border:0;border-radius:50%;background:transparent;color:var(--sdc-text-muted, #6b7280);cursor:pointer;transition:color var(--sdc-table-transition-fast, .15s ease),background var(--sdc-table-transition-fast, .15s ease)}.sdc-table-expandable-toggle:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:2px}.sdc-table-expandable-toggle:hover{color:var(--sdc-text-default, #111827);background:#1118270f}.sdc-table-expandable-chevron{display:flex;align-items:center;justify-content:center;font-size:.75rem;transition:transform .2s ease}.sdc-table-expandable-label-wrap,.sdc-table-expandable-value{min-width:0}.sdc-table-expandable-details{padding:.375rem 0;border-top:1px solid rgba(0,0,0,.06);background:#11182704}.sdc-table-expandable-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.375rem 1rem;border-top:1px solid rgba(0,0,0,.04)}.sdc-table-expandable-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-expandable-field:first-child{border-top:0}.sdc-table-expandable-field--full-width>.sdc-table-expandable-label-wrap{display:none}.sdc-table-expandable-label{display:flex;align-items:center;color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em}.sdc-table-expandable-value{display:flex;align-items:flex-start;width:100%}.sdc-table-expandable-skeleton-primary{width:55%;max-width:10rem}.sdc-table-expandable-skeleton-secondary{width:35%;max-width:7rem}.sdc-table-expandable-chevron--open{transform:rotate(180deg)}.sdc-table-expandable-item--expanded .sdc-table-expandable-summary{background:#11182706}\n"] }]
458
650
  }], propDecorators: { cols: [{
459
651
  type: Input,
460
652
  args: [{ required: true }]
@@ -473,17 +665,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
473
665
  type: Output
474
666
  }], lazyLoad: [{
475
667
  type: Output
668
+ }], selectionChange: [{
669
+ type: Output
476
670
  }], onDocumentClick: [{
477
671
  type: HostListener,
478
672
  args: ['document:click']
479
673
  }], onEscapeKey: [{
480
674
  type: HostListener,
481
675
  args: ['document:keydown.escape']
482
- }], onWindowResize: [{
483
- type: HostListener,
484
- args: ['window:resize']
485
676
  }], onWindowScroll: [{
486
677
  type: HostListener,
487
678
  args: ['window:scroll']
488
679
  }] } });
489
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLFFBQVEsRUFDUixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ25FLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIseUNBQXlDLElBQUksbUNBQW1DLEVBQ2hGLG1DQUFtQyxJQUFJLDZCQUE2QixFQUNwRSwyQkFBMkIsSUFBSSxxQkFBcUIsRUFDcEQsMkJBQTJCLElBQUkscUJBQXFCLEVBQ3BELGdCQUFnQixJQUFJLFVBQVUsRUFDOUIsaUJBQWlCLElBQUksV0FBVyxFQUNoQyxxQ0FBcUMsRUFDdEMsTUFBTSxrQ0FBa0MsQ0FBQztBQUcxQyxPQUFPLEVBYUwsb0JBQW9CLEVBQ3JCLE1BQU0sNkJBQTZCLENBQUM7QUFFckMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtD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LFFBQVEsRUFBRSxLQUFLLEVBQUU7Z0JBeUJ0QixTQUFTO3NCQURaLEtBQUs7Z0JBU0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBc0dHLGVBQWU7c0JBRHhCLFlBQVk7dUJBQUMsZ0JBQWdCO2dCQU1wQixXQUFXO3NCQURwQixZQUFZO3VCQUFDLHlCQUF5QjtnQkFNN0IsY0FBYztzQkFEdkIsWUFBWTt1QkFBQyxlQUFlO2dCQU9uQixjQUFjO3NCQUR2QixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBjb21wdXRlZCxcbiAgc2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5cbmltcG9ydCB7IGdldFZpZXdwb3J0V2lkdGgsIGlzTW9iaWxlVmlld3BvcnQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2xheW91dC51dGlsJztcbmltcG9ydCB7IGdldEZvY3VzYWJsZUVsZW1lbnRzIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9mb2N1cy51dGlsJztcbmltcG9ydCB7XG4gIERFRkFVTFRfVEFCTEVfT1BUSU9OUyxcbiAgVEFCTEVfREVGQVVMVF9MT0FESU5HX1ZFUlRJQ0FMX1BBRERJTkdfUFggYXMgREVGQVVMVF9MT0FESU5HX1ZFUlRJQ0FMX1BBRERJTkdfUFgsXG4gIFRBQkxFX0RFRkFVTFRfTUlOX0xPQURJTkdfSEVJR0hUX1BYIGFzIERFRkFVTFRfTUlOX0xPQURJTkdfSEVJR0hUX1BYLFxuICBUQUJMRV9ERUZBVUxUX1JPV19IRUlHSFRfUFggYXMgREVGQVVMVF9ST1dfSEVJR0hUX1BYLFxuICBUQUJMRV9ERUZBVUxUX1JPV1NfUEVSX1BBR0UgYXMgREVGQVVMVF9ST1dTX1BFUl9QQUdFLFxuICBUQUJMRV9JTkRFWF9aRVJPIGFzIElOREVYX1pFUk8sXG4gIFRBQkxFX01FTlVfR0FQX1BYIGFzIE1FTlVfR0FQX1BYLFxuICBUQUJMRV9NT0JJTEVfQ0FSRF9FU1RJTUFURURfSEVJR0hUX1BYXG59IGZyb20gJy4uLy4uL2NvcmUvY29uc3RhbnRzL3RhYmxlLmNvbnN0JztcbmltcG9ydCB0eXBlIHsgUGFnaW5hdG9yU3RhdGUgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3BhZ2luYXRvci50eXBlJztcbmltcG9ydCB7IHR5cGUgU2VhcmNoVHJpZ2dlck1vZGUgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3NlYXJjaGJveC50eXBlJztcbmltcG9ydCB7XG4gIHR5cGUgQWN0aW9uTWVudUl0ZW0sXG4gIHR5cGUgUm93QmFzZSxcbiAgdHlwZSBTb3J0T3JkZXIsXG4gIHR5cGUgVGFibGVBY3Rpb25NZW51SXRlbSBhcyBOYXRpdmVBY3Rpb25NZW51SXRlbSxcbiAgdHlwZSBUYWJsZUFjdGlvbk1lbnVDbG9zZUV2ZW50LFxuICB0eXBlIFRhYmxlQ2VsbENvbmZpZyxcbiAgdHlwZSBUYWJsZUNlbGxDb25maWdLZXksXG4gIHR5cGUgVGFibGVDb2x1bW4sXG4gIHR5cGUgVGFibGVPcGVuTWVudVN0YXRlIGFzIE9wZW5NZW51U3RhdGUsXG4gIHR5cGUgVGFibGVPcHRpb25zLFxuICB0eXBlIFRhYmxlUm93SWRlbnRpdHksXG4gIHR5cGUgVGFibGVTZWFyY2hFdmVudCxcbiAgVGFibGVNZW51Rm9jdXNUYXJnZXRcbn0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy90YWJsZS50eXBlJztcblxuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYWdpbmF0b3JDb21wb25lbnQgfSBmcm9tICcuLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hib3hDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2hib3gvc2VhcmNoYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb2FkaW5nU3RhdGVDb21wb25lbnQgfSBmcm9tICcuLi9sb2FkaW5nLXN0YXRlL2xvYWRpbmctc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQWN0aW9uc01lbnVDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtYWN0aW9ucy1tZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZUNlbGxDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RhYmxlLWNlbGwtY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVTb3J0SW5kaWNhdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RhYmxlLXNvcnQtaW5kaWNhdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBidWlsZFRhYmxlQ2VsbENvbmZpZ01hcCwgbWVyZ2VUYWJsZU9wdGlvbnMgfSBmcm9tICcuL3V0aWxzL3RhYmxlLWNvbmZpZy51dGlsJztcbmltcG9ydCB7XG4gIGJ1aWxkUm93Q2hlY2tib3hJZCxcbiAgZmlsdGVyVGFibGVSb3dzLFxuICBnZXROZXN0ZWRWYWx1ZSxcbiAgcmVzb2x2ZVJvd0lkZW50aXR5TGFiZWxcbn0gZnJvbSAnLi91dGlscy90YWJsZS1kYXRhLnV0aWwnO1xuaW1wb3J0IHtcbiAgZ2V0VGFibGVDb2x1bW5NaW5XaWR0aFB4LFxuICBnZXRUYWJsZU1pbldpZHRoUHgsXG4gIG5vcm1hbGl6ZVRhYmxlQ29sdW1uQWxpZ25tZW50XG59IGZyb20gJy4vdXRpbHMvdGFibGUtbGF5b3V0LnV0aWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZGMtdGFibGUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFNlYXJjaGJveENvbXBvbmVudCxcbiAgICBQYWdpbmF0b3JDb21wb25lbnQsXG4gICAgQnV0dG9uQ29tcG9uZW50LFxuICAgIExvYWRpbmdTdGF0ZUNvbXBvbmVudCxcbiAgICBFbXB0eVN0YXRlQ29tcG9uZW50LFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBUYWJsZVNvcnRJbmRpY2F0b3JDb21wb25lbnQsXG4gICAgVGFibGVDZWxsQ29udGVudENvbXBvbmVudCxcbiAgICBUYWJsZUFjdGlvbnNNZW51Q29tcG9uZW50XG4gIF0sXG4gIHN0eWxlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuc2NzcycsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudDxUIGV4dGVuZHMgUm93QmFzZSA9IFJvd0Jhc2U+IHtcbiAgcHJpdmF0ZSBhY3Rpb25zTWVudUlkU2VxdWVuY2UgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbHNTaWduYWwgPSBzaWduYWw8VGFibGVDb2x1bW48VD5bXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFTaWduYWwgPSBzaWduYWw8VFtdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZGluZ1NpZ25hbCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnRXaWR0aFNpZ25hbCA9IHNpZ25hbDxudW1iZXI+KGdldFZpZXdwb3J0V2lkdGgoKSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTaWduYWwgPSBzaWduYWw8VGFibGVPcHRpb25zPFQ+PihtZXJnZVRhYmxlT3B0aW9ucyhERUZBVUxUX1RBQkxFX09QVElPTlMgYXMgVGFibGVPcHRpb25zPFQ+KSk7XG4gIHByaXZhdGUgX2NvbmZpZzogVGFibGVPcHRpb25zPFQ+ID0gREVGQVVMVF9UQUJMRV9PUFRJT05TIGFzIFRhYmxlT3B0aW9uczxUPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhQYXJ0c0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICBwcml2YXRlIHJvd0NoZWNrYm94SWRDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgc3RyaW5nPigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBvcGVuTWVudVN0YXRlID0gc2lnbmFsPE9wZW5NZW51U3RhdGU8VD4gfCBudWxsPihudWxsKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFyaWFMYWJlbFNpZ25hbCA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdsb2JhbEZpbHRlciA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvcnRGaWVsZCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvcnRPcmRlciA9IHNpZ25hbDxTb3J0T3JkZXI+KDApO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0aW9uID0gc2lnbmFsPFRbXT4oW10pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlyc3QgPSBzaWduYWw8bnVtYmVyPihJTkRFWF9aRVJPKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJvd3MgPSBzaWduYWw8bnVtYmVyPihERUZBVUxUX1JPV1NfUEVSX1BBR0UpO1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHNldCBjb2xzKHZhbHVlOiBUYWJsZUNvbHVtbjxUPltdIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuY29sc1NpZ25hbC5zZXQodmFsdWUgPz8gW10pO1xuICB9XG5cbiAgZ2V0IGNvbHMoKTogVGFibGVDb2x1bW48VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sc1NpZ25hbCgpO1xuICB9XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgc2V0IGRhdGEodmFsdWU6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmRhdGFTaWduYWwuc2V0KHZhbHVlID8/IFtdKTtcbiAgICB0aGlzLnJlY29uY2lsZVNlbGVjdGlvbldpdGhEYXRhKCk7XG4gICAgdGhpcy5jbGFtcFBhZ2UoKTtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIGdldCBkYXRhKCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNpZ25hbCgpO1xuICB9XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IGZhbHNlIH0pXG4gIHNldCBsb2FkaW5nKHZhbHVlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMubG9hZGluZ1NpZ25hbC5zZXQodmFsdWUgPT09IHRydWUpO1xuXG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgbG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU2lnbmFsKCk7XG4gIH1cblxuICBASW5wdXQoeyByZXF1aXJlZDogZmFsc2UgfSlcbiAgc2V0IGNvbmZpZyh2YWx1ZTogVGFibGVPcHRpb25zPFQ+IHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG5leHQgPSB2YWx1ZSA/PyAoREVGQVVMVF9UQUJMRV9PUFRJT05TIGFzIFRhYmxlT3B0aW9uczxUPik7XG5cbiAgICBpZiAodGhpcy5fY29uZmlnID09PSBuZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY29uZmlnID0gbmV4dDtcbiAgICB0aGlzLmNvbmZpZ1NpZ25hbC5zZXQobWVyZ2VUYWJsZU9wdGlvbnMobmV4dCkpO1xuXG4gICAgY29uc3QgbmV4dFJvd3MgPSB0aGlzLmNvbmZpZ1NpZ25hbCgpLnBhZ2luYXRpb24/LnJvd3NQZXJQYWdlID8/IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcbiAgICB0aGlzLnJvd3Muc2V0KG5leHRSb3dzKTtcbiAgICB0aGlzLmZpcnN0LnNldChJTkRFWF9aRVJPKTtcblxuICAgIHRoaXMucGF0aFBhcnRzQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnJvd0NoZWNrYm94SWRDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgc3RyaW5nPigpO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgZ2V0IGNvbmZpZygpOiBUYWJsZU9wdGlvbnM8VD4ge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgYXJpYUxhYmVsKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmFyaWFMYWJlbFNpZ25hbC5zZXQodmFsdWUpO1xuICB9XG5cbiAgZ2V0IGFyaWFMYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmFyaWFMYWJlbFNpZ25hbCgpO1xuICB9XG5cbiAgQE91dHB1dCgpIGFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb2x1bW46IFRhYmxlQ29sdW1uPFQ+OyByb3c6IFQ7IHZhbHVlOiB1bmtub3duIH0+KCk7XG4gIEBPdXRwdXQoKSBsYXp5TG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBmaXJzdDogbnVtYmVyOyByb3dzOiBudW1iZXIgfT4oKTtcblxuICBnZXQgaXNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTaWduYWwoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBvcHRpb25zID0gY29tcHV0ZWQ8VGFibGVPcHRpb25zPFQ+PigoKSA9PiB0aGlzLmNvbmZpZ1NpZ25hbCgpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzTW9iaWxlID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gaXNNb2JpbGVWaWV3cG9ydCh0aGlzLnZpZXdwb3J0V2lkdGhTaWduYWwoKSkpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93U2VhcmNoID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5vcHRpb25zKCkuc2VhcmNoPy5zaG93ID8/IGZhbHNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dQYWdpbmF0b3IgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5zaG93ID8/IGZhbHNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dJbml0aWFsTG9hZGluZyA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMubG9hZGluZ1NpZ25hbCgpICYmIHRoaXMuZGF0YVNpZ25hbCgpLmxlbmd0aCA9PT0gMCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJvd3NQZXJQYWdlT3B0aW9ucyA9IGNvbXB1dGVkPG51bWJlcltdPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZU9wdGlvbnMgPz8gW10pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VhcmNoUGxhY2Vob2xkZXIgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHRoaXMub3B0aW9ucygpLnNlYXJjaD8ucGxhY2Vob2xkZXIgPz8gJycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJpZ2dlck1vZGUgPSBjb21wdXRlZDxTZWFyY2hUcmlnZ2VyTW9kZT4oKCkgPT4gdGhpcy5vcHRpb25zKCkuc2VhcmNoPy50eXBlID8/ICdhdXRvJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0b3RhbFJlY29yZHNMYWJlbCA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4gdGhpcy5vcHRpb25zKCkudGFibGU/LnRvdGFsUmVjb3Jkc0xhYmVsID8/ICcnKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlZmF1bHRUZXh0T3ZlcmZsb3cgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKS50YWJsZT8udGV4dE92ZXJmbG93KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVtcHR5VGl0bGUgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHRoaXMub3B0aW9ucygpLmVtcHR5Py50aXRsZSA/PyAnJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBlbXB0eVRleHQgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHRoaXMub3B0aW9ucygpLmVtcHR5Py50ZXh0ID8/ICcnKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2VsbHNDZmcgPSBjb21wdXRlZCgoKSA9PiBidWlsZFRhYmxlQ2VsbENvbmZpZ01hcCh0aGlzLm9wdGlvbnMoKSkpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBmaWx0ZXJlZERhdGEgPSBjb21wdXRlZDxUW10+KCgpID0+XG4gICAgZmlsdGVyVGFibGVSb3dzKHRoaXMuZGF0YVNpZ25hbCgpLCB0aGlzLmNvbHNTaWduYWwoKSwgdGhpcy5nbG9iYWxGaWx0ZXIoKSwgdGhpcy5yZXNvbHZlVmFsdWUpXG4gICk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvcnRlZERhdGEgPSBjb21wdXRlZDxUW10+KCgpID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuc29ydEZpZWxkKCk7XG4gICAgY29uc3Qgb3JkZXIgPSB0aGlzLnNvcnRPcmRlcigpO1xuICAgIGNvbnN0IHJvd3MgPSBbLi4udGhpcy5maWx0ZXJlZERhdGEoKV07XG5cbiAgICBpZiAoIWZpZWxkIHx8IG9yZGVyID09PSAwKSB7XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cy5zb3J0KChsZWZ0Um93LCByaWdodFJvdykgPT4ge1xuICAgICAgY29uc3QgbGVmdFZhbHVlID0gdGhpcy5yZXNvbHZlVmFsdWUobGVmdFJvdywgZmllbGQpO1xuICAgICAgY29uc3QgcmlnaHRWYWx1ZSA9IHRoaXMucmVzb2x2ZVZhbHVlKHJpZ2h0Um93LCBmaWVsZCk7XG5cbiAgICAgIGlmIChsZWZ0VmFsdWUgPT0gbnVsbCAmJiByaWdodFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChsZWZ0VmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gLW9yZGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAocmlnaHRWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBvcmRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBsZWZ0VmFsdWUgPT09ICdudW1iZXInICYmIHR5cGVvZiByaWdodFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gKGxlZnRWYWx1ZSAtIHJpZ2h0VmFsdWUpICogb3JkZXI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBTdHJpbmcobGVmdFZhbHVlKS5sb2NhbGVDb21wYXJlKFN0cmluZyhyaWdodFZhbHVlKSkgKiBvcmRlcjtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRvdGFsUmVjb3JkcyA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4gdGhpcy5zb3J0ZWREYXRhKCkubGVuZ3RoKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGFnZURhdGEgPSBjb21wdXRlZDxUW10+KCgpID0+IHtcbiAgICBpZiAoIXRoaXMuc2hvd1BhZ2luYXRvcigpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3J0ZWREYXRhKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmZpcnN0KCk7XG4gICAgY29uc3QgZW5kID0gc3RhcnQgKyB0aGlzLnJvd3MoKTtcbiAgICByZXR1cm4gdGhpcy5zb3J0ZWREYXRhKCkuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBpbml0aWFsTG9hZGluZ1Jvd3MgPSBjb21wdXRlZDxudW1iZXJbXT4oKCkgPT4ge1xuICAgIGNvbnN0IHJvd3NGcm9tU3RhdGUgPSB0aGlzLnJvd3MoKTtcbiAgICBjb25zdCByb3dzRnJvbUNvbmZpZyA9IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnJvd3NQZXJQYWdlID8/IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcbiAgICBjb25zdCBub3JtYWxpemVkUm93cyA9IE51bWJlcihyb3dzRnJvbVN0YXRlIHx8IHJvd3NGcm9tQ29uZmlnIHx8IERFRkFVTFRfUk9XU19QRVJfUEFHRSk7XG4gICAgY29uc3Qgc2FmZVJvd3MgPSBOdW1iZXIuaXNGaW5pdGUobm9ybWFsaXplZFJvd3MpICYmIG5vcm1hbGl6ZWRSb3dzID4gMCA/IG5vcm1hbGl6ZWRSb3dzIDogREVGQVVMVF9ST1dTX1BFUl9QQUdFO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IHNhZmVSb3dzIH0sIChfLCBpbmRleCkgPT4gaW5kZXgpO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0aW9uU2V0ID0gY29tcHV0ZWQ8U2V0PFQ+PigoKSA9PiBuZXcgU2V0KHRoaXMuc2VsZWN0aW9uKCkpKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYm9keVZpZXdwb3J0SGVpZ2h0UHggPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHtcbiAgICBjb25zdCByb3dzRnJvbVN0YXRlID0gdGhpcy5yb3dzKCk7XG4gICAgY29uc3Qgcm93c0Zyb21Db25maWcgPSB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZSA/PyBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG4gICAgY29uc3Qgbm9ybWFsaXplZFJvd3MgPSBOdW1iZXIocm93c0Zyb21TdGF0ZSB8fCByb3dzRnJvbUNvbmZpZyB8fCBERUZBVUxUX1JPV1NfUEVSX1BBR0UpO1xuICAgIGNvbnN0IHNhZmVSb3dzID0gTnVtYmVyLmlzRmluaXRlKG5vcm1hbGl6ZWRSb3dzKSAmJiBub3JtYWxpemVkUm93cyA+IDAgPyBub3JtYWxpemVkUm93cyA6IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcblxuICAgIGNvbnN0IHJvd0hlaWdodCA9IHRoaXMuaXNNb2JpbGUoKSA/IFRBQkxFX01PQklMRV9DQVJEX0VTVElNQVRFRF9IRUlHSFRfUFggOiBERUZBVUxUX1JPV19IRUlHSFRfUFg7XG4gICAgY29uc3QgZXN0aW1hdGVkSGVpZ2h0ID0gc2FmZVJvd3MgKiByb3dIZWlnaHQgKyBERUZBVUxUX0xPQURJTkdfVkVSVElDQUxfUEFERElOR19QWDtcblxuICAgIHJldHVybiBNYXRoLm1heChERUZBVUxUX01JTl9MT0FESU5HX0hFSUdIVF9QWCwgZXN0aW1hdGVkSGVpZ2h0KTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVtcHR5Qm9keUhlaWdodFB4ID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB0aGlzLmJvZHlWaWV3cG9ydEhlaWdodFB4KCkpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGFibGVNaW5XaWR0aFB4ID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiBnZXRUYWJsZU1pbldpZHRoUHgodGhpcy5jb2xzU2lnbmFsKCkpKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZVZhbHVlID0gKG9iajogVCwgcGF0aD86IHN0cmluZyk6IHVua25vd24gPT5cbiAgICBnZXROZXN0ZWRWYWx1ZShvYmosIHBhdGgsIHRoaXMucGF0aFBhcnRzQ2FjaGUpO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcbiAgcHJvdGVjdGVkIG9uRG9jdW1lbnRDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJylcbiAgcHJvdGVjdGVkIG9uRXNjYXBlS2V5KCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudShUYWJsZU1lbnVGb2N1c1RhcmdldC5UcmlnZ2VyKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBwcm90ZWN0ZWQgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3cG9ydFdpZHRoU2lnbmFsLnNldChnZXRWaWV3cG9ydFdpZHRoKCkpO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcpXG4gIHByb3RlY3RlZCBvbldpbmRvd1Njcm9sbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNlYXJjaFRlcm0oZXZlbnRPclZhbHVlOiBUYWJsZVNlYXJjaEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGVybSA9IHR5cGVvZiBldmVudE9yVmFsdWUgPT09ICdzdHJpbmcnID8gZXZlbnRPclZhbHVlIDogZXZlbnRPclZhbHVlPy5kZXRhaWwgPz8gJyc7XG4gICAgdGhpcy5nbG9iYWxGaWx0ZXIuc2V0KFN0cmluZyh0ZXJtKSk7XG4gICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DbGVhclNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLmdsb2JhbEZpbHRlci5zZXQoJycpO1xuICAgIHRoaXMuZmlyc3Quc2V0KElOREVYX1pFUk8pO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZVNvcnQoZmllbGQ6IHN0cmluZywgZW5hYmxlZCA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoIWVuYWJsZWQgfHwgIWZpZWxkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ydEZpZWxkKCkgIT09IGZpZWxkKSB7XG4gICAgICB0aGlzLnNvcnRGaWVsZC5zZXQoZmllbGQpO1xuICAgICAgdGhpcy5zb3J0T3JkZXIuc2V0KDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50T3JkZXIgPSB0aGlzLnNvcnRPcmRlcigpO1xuXG4gICAgICBpZiAoY3VycmVudE9yZGVyID09PSAxKSB7XG4gICAgICAgIHRoaXMuc29ydE9yZGVyLnNldCgtMSk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRPcmRlciA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5zb3J0T3JkZXIuc2V0KDApO1xuICAgICAgICB0aGlzLnNvcnRGaWVsZC5zZXQobnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvcnRPcmRlci5zZXQoMSk7XG4gICAgICAgIHRoaXMuc29ydEZpZWxkLnNldChmaWVsZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U29ydEFyaWFBdHRyaWJ1dGUoY29sOiBUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbC5zb3J0YWJsZSA9PT0gZmFsc2UgfHwgIWNvbC5maWVsZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3J0RmllbGQoKSAhPT0gY29sLmZpZWxkKSB7XG4gICAgICByZXR1cm4gJ25vbmUnO1xuICAgIH1cblxuICAgIGNvbnN0IG9yZGVyID0gdGhpcy5zb3J0T3JkZXIoKTtcblxuICAgIGlmIChvcmRlciA9PT0gMSkge1xuICAgICAgcmV0dXJuICdhc2NlbmRpbmcnO1xuICAgIH1cblxuICAgIGlmIChvcmRlciA9PT0gLTEpIHtcbiAgICAgIHJldHVybiAnZGVzY2VuZGluZyc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdub25lJztcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2x1bW5BbGlnbkNsYXNzKGNvbDogVGFibGVDb2x1bW48VD4pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBhbGlnbiA9IG5vcm1hbGl6ZVRhYmxlQ29sdW1uQWxpZ25tZW50KGNvbC5hbGlnbik7XG4gICAgcmV0dXJuIGFsaWduID8gYHNkYy10YWJsZS10ZC1hbGlnbi0ke2FsaWdufWAgOiBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzU29ydGFibGVDb2x1bW4oY29sOiBUYWJsZUNvbHVtbjxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb2wuc29ydGFibGUgIT09IGZhbHNlICYmICEhY29sLmZpZWxkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbHVtbk1pbldpZHRoUHgoY29sOiBUYWJsZUNvbHVtbjxUPik6IG51bWJlciB7XG4gICAgcmV0dXJuIGdldFRhYmxlQ29sdW1uTWluV2lkdGhQeChjb2wpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1vYmlsZUZpZWxkTGFiZWwoY29sOiBUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB7XG4gICAgaWYgKGNvbC5oZWFkZXIpIHtcbiAgICAgIHJldHVybiBjb2wuaGVhZGVyO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29sLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2FjdGlvbnMnOlxuICAgICAgICByZXR1cm4gdGhpcy5jZWxsc0NmZygpLmFjdGlvbnMuYnV0dG9uTGFiZWwgfHwgJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuYWN0aW9uc19tZW51JztcbiAgICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgICAgIHJldHVybiB0aGlzLmNlbGxzQ2ZnKCkuYnV0dG9uLmxhYmVsXG4gICAgICAgICAgfHwgdGhpcy5jZWxsc0NmZygpLmJ1dHRvbi50b29sdGlwXG4gICAgICAgICAgfHwgJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuYWN0aW9uX2J1dHRvbic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uUGFnZUNoYW5nZShldmVudDogUGFnaW5hdG9yU3RhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0Rmlyc3QgPSBldmVudC5maXJzdCA/PyBJTkRFWF9aRVJPO1xuICAgIGNvbnN0IG5leHRSb3dzID0gZXZlbnQucm93cyA/PyB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZSA/PyBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG5cbiAgICB0aGlzLmZpcnN0LnNldChuZXh0Rmlyc3QpO1xuICAgIHRoaXMucm93cy5zZXQobmV4dFJvd3MpO1xuICAgIHRoaXMubGF6eUxvYWQuZW1pdCh7IGZpcnN0OiBuZXh0Rmlyc3QsIHJvd3M6IG5leHRSb3dzIH0pO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVG9nZ2xlUm93KHJvdzogVCwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IG5leHRTZWxlY3Rpb24gPSBuZXcgU2V0KHRoaXMuc2VsZWN0aW9uU2V0KCkpO1xuXG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIG5leHRTZWxlY3Rpb24uYWRkKHJvdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRTZWxlY3Rpb24uZGVsZXRlKHJvdyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3Rpb24uc2V0KFsuLi5uZXh0U2VsZWN0aW9uXSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNSb3dTZWxlY3RlZChyb3c6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXQoKS5oYXMocm93KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVTZWxlY3RQYWdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0U2VsZWN0aW9uID0gbmV3IFNldCh0aGlzLnNlbGVjdGlvblNldCgpKTtcblxuICAgIHRoaXMucGFnZURhdGEoKS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgIG5leHRTZWxlY3Rpb24uYWRkKHJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0U2VsZWN0aW9uLmRlbGV0ZShyb3cpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWxlY3Rpb24uc2V0KFsuLi5uZXh0U2VsZWN0aW9uXSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNQYWdlRnVsbHlTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aXNpYmxlUm93cyA9IHRoaXMucGFnZURhdGEoKTtcblxuICAgIGlmICh2aXNpYmxlUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLnNlbGVjdGlvblNldCgpO1xuICAgIHJldHVybiB2aXNpYmxlUm93cy5ldmVyeSgocm93KSA9PiBzZWxlY3RlZFJvd3MuaGFzKHJvdykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENoZWNrZWRWYWx1ZShldmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJvd0NoZWNrYm94SWQocm93OiBUKTogc3RyaW5nIHtcbiAgICBpZiAoIXJvdyB8fCB0eXBlb2Ygcm93ICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGJ1aWxkUm93Q2hlY2tib3hJZChyb3cpO1xuICAgIH1cblxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucm93Q2hlY2tib3hJZENhY2hlLmdldChyb3cgYXMgb2JqZWN0KTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dElkID0gYnVpbGRSb3dDaGVja2JveElkKHJvdyk7XG4gICAgdGhpcy5yb3dDaGVja2JveElkQ2FjaGUuc2V0KHJvdyBhcyBvYmplY3QsIG5leHRJZCk7XG4gICAgcmV0dXJuIG5leHRJZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSb3dDaGVja2JveExhYmVsKHJvdzogVCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVSb3dJZGVudGl0eUxhYmVsKHJvdyBhcyBUYWJsZVJvd0lkZW50aXR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0YWJsZUFyaWFMYWJlbEtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFyaWFMYWJlbFNpZ25hbCgpID8/ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5LnRhYmxlX2Rlc2NyaXB0aW9uJztcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVBY3Rpb25zTWVudShldmVudDogRXZlbnQsIHJvdzogVCwgY29sOiBUYWJsZUNvbHVtbjxUPiwgdHJpZ2dlckVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAodGhpcy5pc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkpIHtcbiAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbnNPcHRpb25zID0gdGhpcy5jZWxsQ2ZnKCdhY3Rpb25zJyk7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmFjdGlvbkl0ZW1zRm9yKHJvdywgYWN0aW9uc09wdGlvbnMpO1xuICAgIGNvbnN0IHJlY3QgPSB0cmlnZ2VyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBtZW51SWQgPSB0aGlzLm5leHRBY3Rpb25zTWVudUlkKCk7XG5cbiAgICB0aGlzLm9wZW5NZW51U3RhdGUuc2V0KHtcbiAgICAgIHJvdyxcbiAgICAgIGNvbCxcbiAgICAgIGl0ZW1zLFxuICAgICAgbWVudUlkLFxuICAgICAgY2xvc2VPbkNsaWNrOiBhY3Rpb25zT3B0aW9ucz8uY2xvc2VPbkNsaWNrICE9PSBmYWxzZSxcbiAgICAgIHRyaWdnZXI6IHRyaWdnZXJFbGVtZW50LFxuICAgICAgdG9wOiByZWN0LmJvdHRvbSArIE1FTlVfR0FQX1BYLFxuICAgICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgICAgd2lkdGg6IHJlY3Qud2lkdGhcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbG9zZUFjdGlvbnNNZW51KGZvY3VzVGFyZ2V0OiBUYWJsZU1lbnVGb2N1c1RhcmdldCA9IFRhYmxlTWVudUZvY3VzVGFyZ2V0Lk5vbmUpOiB2b2lkIHtcbiAgICBjb25zdCBtZW51ID0gdGhpcy5vcGVuTWVudVN0YXRlKCk7XG4gICAgdGhpcy5vcGVuTWVudVN0YXRlLnNldChudWxsKTtcblxuICAgIGlmICghbWVudSB8fCBmb2N1c1RhcmdldCA9PT0gVGFibGVNZW51Rm9jdXNUYXJnZXQuTm9uZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuZm9jdXNDbG9zZWRNZW51VGFyZ2V0KG1lbnUudHJpZ2dlciwgbWVudS5tZW51SWQsIGZvY3VzVGFyZ2V0KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNBY3Rpb25zTWVudU9wZW4ocm93OiBULCBjb2w6IFRhYmxlQ29sdW1uPFQ+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWVudSA9IHRoaXMub3Blbk1lbnVTdGF0ZSgpO1xuXG4gICAgaWYgKCFtZW51KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lbnUucm93ID09PSByb3cgJiYgbWVudS5jb2wgPT09IGNvbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY3Rpb25JdGVtc0Zvcihyb3c6IFQsIG9wdGlvbnM6IFRhYmxlQ2VsbENvbmZpZzxULCAnYWN0aW9ucyc+KTogTmF0aXZlQWN0aW9uTWVudUl0ZW1bXSB7XG4gICAgY29uc3QgaXRlbXMgPSBvcHRpb25zLml0ZW1zID8/IFtdO1xuXG4gICAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbTogQWN0aW9uTWVudUl0ZW08VD4pID0+ICh7XG4gICAgICBrZXk6IGl0ZW0ua2V5LFxuICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXG4gICAgICBpY29uOiBpdGVtLmljb24sXG4gICAgICBkaXNhYmxlZDogdGhpcy5yZXNvbHZlQWN0aW9uRGlzYWJsZWQoaXRlbSwgcm93KVxuICAgIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblBvcnRhbEFjdGlvbkNsaWNrKGl0ZW06IE5hdGl2ZUFjdGlvbk1lbnVJdGVtKTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtZW51ID0gdGhpcy5vcGVuTWVudVN0YXRlKCk7XG5cbiAgICBpZiAoIW1lbnUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uQWN0aW9uU2VsZWN0KG1lbnUucm93LCBtZW51LmNvbCwgaXRlbSk7XG5cbiAgICBpZiAobWVudS5jbG9zZU9uQ2xpY2spIHtcbiAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbk1lbnVDbG9zZShldmVudDogVGFibGVBY3Rpb25NZW51Q2xvc2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudShldmVudC5mb2N1c1RhcmdldCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25BY3Rpb25TZWxlY3Qocm93OiBULCBjb2w6IFRhYmxlQ29sdW1uPFQ+LCBpdGVtOiB7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyBpY29uPzogc3RyaW5nOyBkaXNhYmxlZD86IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRLZXkgPSBjb2wuYWN0aW9uRmllbGQgPz8gY29sLmZpZWxkO1xuICAgIGNvbnN0IHJvd1ZhbHVlID0gZmllbGRLZXkgPyB0aGlzLnJlc29sdmVWYWx1ZShyb3csIGZpZWxkS2V5KSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFjdGlvbi5lbWl0KHsgcm93LCBjb2x1bW46IGNvbCwgdmFsdWU6IHsgYWN0aW9uOiBpdGVtLCByb3dWYWx1ZSB9IH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQnV0dG9uQ2xpY2socm93OiBULCBjb2w6IFRhYmxlQ29sdW1uPFQ+KTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gY29sLmFjdGlvbkZpZWxkID8/IGNvbC5maWVsZDtcbiAgICBjb25zdCB2YWx1ZSA9IGtleSA/IHRoaXMucmVzb2x2ZVZhbHVlKHJvdywga2V5KSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFjdGlvbi5lbWl0KHsgcm93LCB2YWx1ZSwgY29sdW1uOiBjb2wgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZUNlbGxJZChjb2w6IFRhYmxlQ29sdW1uPFQ+LCByb3c6IFQpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWNvbC5jZWxsSWQpIHsgcmV0dXJuIG51bGw7IH1cbiAgICByZXR1cm4gdHlwZW9mIGNvbC5jZWxsSWQgPT09ICdmdW5jdGlvbicgPyAoY29sLmNlbGxJZChyb3cpIHx8IG51bGwpIDogKGNvbC5jZWxsSWQgfHwgbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGNlbGxDZmc8SyBleHRlbmRzIFRhYmxlQ2VsbENvbmZpZ0tleT4oa2luZDogSykge1xuICAgIHJldHVybiB0aGlzLmNlbGxzQ2ZnKClba2luZF07XG4gIH1cblxuICBwcml2YXRlIGNsYW1wUGFnZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvd1BhZ2luYXRvcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWF4Rmlyc3QgPSBNYXRoLm1heChJTkRFWF9aRVJPLCB0aGlzLnRvdGFsUmVjb3JkcygpIC0gdGhpcy5yb3dzKCkpO1xuXG4gICAgaWYgKHRoaXMuZmlyc3QoKSA+IG1heEZpcnN0KSB7XG4gICAgICB0aGlzLmZpcnN0LnNldChJTkRFWF9aRVJPKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlY29uY2lsZVNlbGVjdGlvbldpdGhEYXRhKCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGFTZXQgPSBuZXcgU2V0KHRoaXMuZGF0YVNpZ25hbCgpKTtcbiAgICBjb25zdCBuZXh0U2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24oKS5maWx0ZXIoKHJvdykgPT4gZGF0YVNldC5oYXMocm93KSk7XG5cbiAgICBpZiAobmV4dFNlbGVjdGlvbi5sZW5ndGggIT09IHRoaXMuc2VsZWN0aW9uKCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZXQobmV4dFNlbGVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQWN0aW9uRGlzYWJsZWQoaXRlbTogQWN0aW9uTWVudUl0ZW08VD4sIHJvdzogVCk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgaXRlbS5kaXNhYmxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZW0uZGlzYWJsZWQocm93KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbS5kaXNhYmxlZCA9PT0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbmV4dEFjdGlvbnNNZW51SWQoKTogc3RyaW5nIHtcbiAgICB0aGlzLmFjdGlvbnNNZW51SWRTZXF1ZW5jZSArPSAxO1xuICAgIHJldHVybiBgc2RjLXRhYmxlLWFjdGlvbnMtbWVudS0ke3RoaXMuYWN0aW9uc01lbnVJZFNlcXVlbmNlfWA7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzQ2xvc2VkTWVudVRhcmdldChcbiAgICB0cmlnZ2VyOiBIVE1MRWxlbWVudCxcbiAgICBtZW51SWQ6IHN0cmluZyxcbiAgICBmb2N1c1RhcmdldDogVGFibGVNZW51Rm9jdXNUYXJnZXRcbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0cmlnZ2VyLmlzQ29ubmVjdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZvY3VzVGFyZ2V0ID09PSBUYWJsZU1lbnVGb2N1c1RhcmdldC5UcmlnZ2VyKSB7XG4gICAgICB0cmlnZ2VyLmZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3duZXJEb2N1bWVudCA9IHRyaWdnZXIub3duZXJEb2N1bWVudDtcbiAgICBjb25zdCBtZW51RWxlbWVudCA9IG93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobWVudUlkKTtcbiAgICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGdldEZvY3VzYWJsZUVsZW1lbnRzKG93bmVyRG9jdW1lbnQpLmZpbHRlcigoZWxlbWVudCkgPT4gIW1lbnVFbGVtZW50Py5jb250YWlucyhlbGVtZW50KSk7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gZm9jdXNhYmxlRWxlbWVudHMuaW5kZXhPZih0cmlnZ2VyKTtcblxuICAgIGlmIChjdXJyZW50SW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0SW5kZXggPSBmb2N1c1RhcmdldCA9PT0gVGFibGVNZW51Rm9jdXNUYXJnZXQuTmV4dCA/IGN1cnJlbnRJbmRleCArIDEgOiBjdXJyZW50SW5kZXggLSAxO1xuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gZm9jdXNhYmxlRWxlbWVudHNbdGFyZ2V0SW5kZXhdO1xuXG4gICAgbmV4dEVsZW1lbnQ/LmZvY3VzKCk7XG4gIH1cbn1cbiIsIjxzZWN0aW9uXG4gIGNsYXNzPVwic2RjLXRhYmxlXCJcbiAgW2NsYXNzLnNkYy10YWJsZS1zdGFja109XCJpc01vYmlsZSgpXCJcbiAgW2NsYXNzLnNkYy10YWJsZS1maWx0ZXJlZF09XCIhIWdsb2JhbEZpbHRlcigpLnRyaW0oKVwiXG4gIFtjbGFzcy5zZGMtdGFibGUtLWxvYWRpbmddPVwiaXNMb2FkaW5nXCJcbiAgW2NsYXNzLnNkYy10YWJsZS0taW5pdGlhbC1sb2FkaW5nXT1cInNob3dJbml0aWFsTG9hZGluZygpXCJcbj5cbiAgPHNkYy1sb2FkaW5nLXN0YXRlXG4gICAgY2xhc3M9XCJzZGMtdGFibGUtbG9hZGluZy13cmFwXCJcbiAgICBbbG9hZGluZ109XCJpc0xvYWRpbmdcIlxuICAgIFtibG9ja1dpbmRvd109XCJmYWxzZVwiXG4gICAgW2Jsb2NrRGVsYXlNc109XCIwXCJcbiAgICBbaW5kaWNhdG9yXT1cIidkb3RzJ1wiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXNoZWxsXCIgW3N0eWxlLi0tc2RjLXRhYmxlLWJvZHktaGVpZ2h0LnB4XT1cImJvZHlWaWV3cG9ydEhlaWdodFB4KClcIj5cbiAgICAgIEBpZiAoc2hvd1NlYXJjaCgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtY2FwdGlvblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtY2FwdGlvbl9fc2VhcmNoXCI+XG4gICAgICAgICAgICA8c2RjLXNlYXJjaGJveFxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyKClcIlxuICAgICAgICAgICAgICBbdHJpZ2dlck1vZGVdPVwidHJpZ2dlck1vZGUoKVwiXG4gICAgICAgICAgICAgIChvblNlYXJjaCk9XCJvblNlYXJjaFRlcm0oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvbkNsZWFyKT1cIm9uQ2xlYXJTZWFyY2goKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuc2VhcmNoX2ZpZWxkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgQGlmICghaXNNb2JpbGUoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXNjcm9sbFwiIFtzdHlsZS4tLXNkYy10YWJsZS1taW4td2lkdGgucHhdPVwidGFibGVNaW5XaWR0aFB4KClcIj5cbiAgICAgICAgICA8dGFibGVcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWdyaWRcIlxuICAgICAgICAgICAgcm9sZT1cInRhYmxlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGFibGVBcmlhTGFiZWxLZXkoKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXJvd2NvdW50XT1cInRvdGFsUmVjb3JkcygpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtYnVzeV09XCJpc0xvYWRpbmdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxjb2xncm91cD5cbiAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxjb2wgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aCA/PyAoY29sdW1uTWluV2lkdGhQeChjb2wpICsgJ3B4JylcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2NvbGdyb3VwPlxuXG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0ciByb2xlPVwicm93XCI+XG4gICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNvbHVtbmhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtY2hlY2tib3hdPVwiY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10aC1jdXJyZW5jeV09XCJjb2wudHlwZSA9PT0gJ2N1cnJlbmN5J1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtYnV0dG9uXT1cImNvbC50eXBlID09PSAnYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtYWN0aW9uc109XCJjb2wudHlwZSA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1zb3J0YWJsZV09XCJpc1NvcnRhYmxlQ29sdW1uKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWlzLXNlbGVjdGVkXT1cInNvcnRGaWVsZCgpID09PSBjb2wuZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0U29ydEFyaWFBdHRyaWJ1dGUoY29sKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImlzU29ydGFibGVDb2x1bW4oY29sKSA/IDAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICBpc1NvcnRhYmxlQ29sdW1uKGNvbClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2wuaGVhZGVyIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyAtICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eS5zb3J0YWJsZV9jb2x1bW4nIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IChjb2wuaGVhZGVyIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29sLmZpZWxkID8gdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY29sLmZpZWxkID8gdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgY29sLmZpZWxkID8gdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS10aC1pbm5lclwiIFtjbGFzcy5zZGMtdGFibGUtc29ydGFibGVdPVwiaXNTb3J0YWJsZUNvbHVtbihjb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtdGgtbGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj57eyBjb2wuaGVhZGVyIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtc29ydC1vdmVybGF5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLXNvcnQtaW5kaWNhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5GaWVsZF09XCJjb2wuZmllbGQgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5UeXBlXT1cImNvbC50eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRhYmxlXT1cImlzU29ydGFibGVDb2x1bW4oY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0RmllbGRdPVwic29ydEZpZWxkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydE9yZGVyXT1cInNvcnRPcmRlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1zb3J0LWluZGljYXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nICYmIChjZWxsc0NmZygpLmNoZWNrYm94LnNlbGVjdEFsbCA/PyB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLXRoLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCInc2VsZWN0LWFsbC1jaGVja2JveCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc1BhZ2VGdWxseVNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RQYWdlKGdldENoZWNrZWRWYWx1ZSgkZXZlbnQpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB0b2dnbGVTZWxlY3RQYWdlKCFpc1BhZ2VGdWxseVNlbGVjdGVkKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eS5zZWxlY3RfYWxsX3Jvd3MnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImlzUGFnZUZ1bGx5U2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNlbGVjdC1hbGwtY2hlY2tib3hcIiBjbGFzcz1cInNyLW9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuc2VsZWN0X2FsbF9yb3dzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICBAaWYgKHNob3dJbml0aWFsTG9hZGluZygpKSB7XG4gICAgICAgICAgICAgICAgQGZvciAocm93SW5kZXggb2YgaW5pdGlhbExvYWRpbmdSb3dzKCk7IHRyYWNrIHJvd0luZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwic2RjLXRhYmxlLWluaXRpYWwtbG9hZGluZy1yb3dcIiByb2xlPVwicm93XCIgW2F0dHIuYXJpYS1yb3dpbmRleF09XCJyICsgMVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS10ZCBzZGMtdGFibGUtdGRjIHNkYy10YWJsZS10ZC0taW5pdGlhbC1sb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY2hlY2tib3hdPVwiY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY3VycmVuY3ldPVwiY29sLnR5cGUgPT09ICdjdXJyZW5jeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1idXR0b25dPVwiY29sLnR5cGUgPT09ICdidXR0b24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtYWN0aW9uc109XCJjb2wudHlwZSA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbkFsaWduQ2xhc3MoY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRpdGxlXT1cImNvbC5oZWFkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsIHNkYy10YWJsZS10ZC12YWwtLWluaXRpYWwtbG9hZGluZ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAZm9yIChyb3cgb2YgcGFnZURhdGEoKTsgdHJhY2sgJGluZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRyIHJvbGU9XCJyb3dcIiBbYXR0ci5hcmlhLXJvd2luZGV4XT1cInIgKyAxXCI+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLXRkIHNkYy10YWJsZS10ZGNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1jaGVja2JveF09XCJjb2wudHlwZSA9PT0gJ2NoZWNrYm94LXNlbGVjdGlvbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1jdXJyZW5jeV09XCJjb2wudHlwZSA9PT0gJ2N1cnJlbmN5J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWJ1dHRvbl09XCJjb2wudHlwZSA9PT0gJ2J1dHRvbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1hY3Rpb25zXT1cImNvbC50eXBlID09PSAnYWN0aW9ucydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1pcy1zZWxlY3RlZF09XCJzb3J0RmllbGQoKSA9PT0gY29sLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbkFsaWduQ2xhc3MoY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRpdGxlXT1cImNvbC5oZWFkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiY29sLmNvbElkIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLmNlbGxUYWcgPT09ICdzcGFuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS10ZC12YWxcIiBbbmdTdHlsZV09XCJjb2wuY2VsbFN0eWxlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkgPyBvcGVuTWVudVN0YXRlKCk/Lm1lbnVJZCA/PyBudWxsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoY29sLmNlbGxUYWcgPT09ICdpJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInNkYy10YWJsZS10ZC12YWxcIiBbbmdTdHlsZV09XCJjb2wuY2VsbFN0eWxlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkgPyBvcGVuTWVudVN0YXRlKCk/Lm1lbnVJZCA/PyBudWxsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoY29sLmNlbGxUYWcgPT09ICdwJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInNkYy10YWJsZS10ZC12YWxcIiBbbmdTdHlsZV09XCJjb2wuY2VsbFN0eWxlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkgPyBvcGVuTWVudVN0YXRlKCk/Lm1lbnVJZCA/PyBudWxsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsXCIgW25nU3R5bGVdPVwiY29sLmNlbGxTdHlsZVwiIFthdHRyLmlkXT1cInJlc29sdmVDZWxsSWQoY29sLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xdPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51SWRdPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpID8gb3Blbk1lbnVTdGF0ZSgpPy5tZW51SWQgPz8gbnVsbCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY29sLCAkZXZlbnQudHJpZ2dlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgIDwvdGFibGU+XG5cbiAgICAgICAgICBAaWYgKCFpc0xvYWRpbmcgJiYgb3B0aW9ucygpLmVtcHR5Py5zaG93ICE9PSBmYWxzZSAmJiB0b3RhbFJlY29yZHMoKSA9PT0gMCkge1xuICAgICAgICAgICAgPHNkYy1lbXB0eS1zdGF0ZVxuICAgICAgICAgICAgICBpZD1cIm15LWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgICAgaWNvbkNsYXNzPVwiZmEgZmEtaW5ib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiZW1wdHlUaXRsZSgpXCJcbiAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImVtcHR5VGV4dCgpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgICBbc3R5bGUubWluLWhlaWdodC5weF09XCJlbXB0eUJvZHlIZWlnaHRQeCgpXCJcbiAgICAgICAgICAgID48L3NkYy1lbXB0eS1zdGF0ZT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtbGlzdFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0YWJsZUFyaWFMYWJlbEtleSgpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWJ1c3ldPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgIEBpZiAoc2hvd0luaXRpYWxMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIEBmb3IgKHJvd0luZGV4IG9mIGluaXRpYWxMb2FkaW5nUm93cygpOyB0cmFjayByb3dJbmRleDsgbGV0IHIgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtY2FyZCBzZGMtdGFibGUtbW9iaWxlLWNhcmQtLWxvYWRpbmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1maWVsZCBzZGMtdGFibGUtbW9iaWxlLWZpZWxkLS1sb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWxhYmVsIHNkYy10YWJsZS1tb2JpbGUtbGFiZWwtLWxvYWRpbmdcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtc2tlbGV0b25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICBAZm9yIChyb3cgb2YgcGFnZURhdGEoKTsgdHJhY2sgJGluZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1jYXJkXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLW1vYmlsZS1maWVsZC0tZnVsbC13aWR0aF09XCJcbiAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PT0gJ2J1dHRvbicgfHwgY29sLnR5cGUgPT09ICdhY3Rpb25zJyB8fCBjb2wudHlwZSA9PT0gJ2NoZWNrYm94LXNlbGVjdGlvbidcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1tb2JpbGUtZmllbGQtLXNlbGVjdGVkXT1cInNvcnRGaWVsZCgpID09PSBjb2wuZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLW1vYmlsZS1maWVsZC0tc29ydGFibGVdPVwiY29sLmZpZWxkICYmIGlzU29ydGFibGVDb2x1bW4oY29sKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb2wuZmllbGQgJiYgdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKG1vYmlsZUZpZWxkTGFiZWwoY29sKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWxhYmVsLXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLmZpZWxkICYmIGlzU29ydGFibGVDb2x1bW4oY29sKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWxhYmVsIHNkYy10YWJsZS1tb2JpbGUtbGFiZWwtLXNvcnRhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vYmlsZUZpZWxkTGFiZWwoY29sKSB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnIC0gJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eS5zb3J0YWJsZV9jb2x1bW4nIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInRvZ2dsZVNvcnQoY29sLmZpZWxkLCBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgbW9iaWxlRmllbGRMYWJlbChjb2wpIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtc29ydC1pbmRpY2F0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5GaWVsZF09XCJjb2wuZmllbGQgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uVHlwZV09XCJjb2wudHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydGFibGVdPVwiaXNTb3J0YWJsZUNvbHVtbihjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0RmllbGRdPVwic29ydEZpZWxkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRPcmRlcl09XCJzb3J0T3JkZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLXNvcnQtaW5kaWNhdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IG1vYmlsZUZpZWxkTGFiZWwoY29sKSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS12YWx1ZVwiIFtuZ1N0eWxlXT1cImNvbC5jZWxsU3R5bGVcIiBbYXR0ci5pZF09XCJyZXNvbHZlQ2VsbElkKGNvbCwgcm93KVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2VsbENvbmZpZ3NdPVwiY2VsbHNDZmcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVzb2x2ZVZhbHVlXT1cInJlc29sdmVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93Q2hlY2tib3hJZF09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0xhYmVsXT1cImdldFJvd0NoZWNrYm94TGFiZWwocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKSA/IG9wZW5NZW51U3RhdGUoKT8ubWVudUlkID8/IG51bGwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKCFpc0xvYWRpbmcgJiYgb3B0aW9ucygpLmVtcHR5Py5zaG93ICE9PSBmYWxzZSAmJiB0b3RhbFJlY29yZHMoKSA9PT0gMCkge1xuICAgICAgICAgIDxzZGMtZW1wdHktc3RhdGVcbiAgICAgICAgICAgIGlkPVwibXktZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgaWNvbkNsYXNzPVwiZmEgZmEtaW5ib3hcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImVtcHR5VGl0bGUoKVwiXG4gICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiZW1wdHlUZXh0KClcIlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHQucHhdPVwiZW1wdHlCb2R5SGVpZ2h0UHgoKVwiXG4gICAgICAgICAgPjwvc2RjLWVtcHR5LXN0YXRlPlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIEBpZiAoc2hvd1BhZ2luYXRvcigpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtcGFnaW5hdG9yXCI+XG4gICAgICAgICAgPHNkYy1wYWdpbmF0b3JcbiAgICAgICAgICAgIFtmaXJzdF09XCJmaXJzdCgpXCJcbiAgICAgICAgICAgIFtyb3dzXT1cInJvd3MoKVwiXG4gICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3JkcygpXCJcbiAgICAgICAgICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiaXNNb2JpbGUoKSA/IFtdIDogcm93c1BlclBhZ2VPcHRpb25zKClcIlxuICAgICAgICAgICAgW2lzTW9iaWxlXT1cImlzTW9iaWxlKClcIlxuICAgICAgICAgICAgW3RvdGFsUmVjb3Jkc0xhYmVsXT1cInRvdGFsUmVjb3Jkc0xhYmVsKClcIlxuICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgID48L3NkYy1wYWdpbmF0b3I+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L3NkYy1sb2FkaW5nLXN0YXRlPlxuPC9zZWN0aW9uPlxuXG5AaWYgKG9wZW5NZW51U3RhdGUoKTsgYXMgbWVudSkge1xuICA8c2RjLXRhYmxlLWFjdGlvbnMtbWVudVxuICAgIFtpdGVtc109XCJtZW51Lml0ZW1zXCJcbiAgICBbbWVudUlkXT1cIm1lbnUubWVudUlkXCJcbiAgICBbdG9wXT1cIm1lbnUudG9wXCJcbiAgICBbbGVmdF09XCJtZW51LmxlZnRcIlxuICAgIFt3aWR0aF09XCJtZW51LndpZHRoXCJcbiAgICAoY2xvc2UpPVwib25NZW51Q2xvc2UoJGV2ZW50KVwiXG4gICAgKHNlbGVjdCk9XCJvblBvcnRhbEFjdGlvbkNsaWNrKCRldmVudClcIlxuICA+PC9zZGMtdGFibGUtYWN0aW9ucy1tZW51PlxufVxuIl19
680
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUNMLHFCQUFxQixFQUNyQix5Q0FBeUMsSUFBSSxtQ0FBbUMsRUFDaEYsbUNBQW1DLElBQUksNkJBQTZCLEVBQ3BFLDJCQUEyQixJQUFJLHFCQUFxQixFQUNwRCwyQkFBMkIsSUFBSSxxQkFBcUIsRUFDcEQsZ0JBQWdCLElBQUksVUFBVSxFQUM5QixpQkFBaUIsSUFBSSxXQUFXLEVBQ2hDLHFDQUFxQyxFQUN0QyxNQUFNLGtDQUFrQyxDQUFDO0FBRzFDLE9BQU8sRUFZTCxvQkFBb0IsRUFDckIsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFF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a0JBcEIxQixTQUFTOytCQUNFLFdBQVcsY0FDVCxJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixrQkFBa0I7d0JBQ2xCLGtCQUFrQjt3QkFDbEIsZUFBZTt3QkFDZixxQkFBcUI7d0JBQ3JCLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZiwyQkFBMkI7d0JBQzNCLHlCQUF5Qjt3QkFDekIseUJBQXlCO3FCQUMxQixpQkFHYyxpQkFBaUIsQ0FBQyxRQUFRLG1CQUN4Qix1QkFBdUIsQ0FBQyxNQUFNOzhCQXdDM0MsSUFBSTtzQkFEUCxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFVckIsSUFBSTtzQkFEUCxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFhckIsT0FBTztzQkFEVixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtnQkFjdEIsTUFBTTtzQkFEVCxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtnQkEwQnRCLFNBQVM7c0JBRFosS0FBSztnQkFTSSxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFRRyxlQUFlO3NCQUF4QixNQUFNO2dCQXdJRyxlQUFlO3NCQUR4QixZQUFZO3VCQUFDLGdCQUFnQjtnQkFNcEIsV0FBVztzQkFEcEIsWUFBWTt1QkFBQyx5QkFBeUI7Z0JBcUI3QixjQUFjO3NCQUR2QixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIHNpZ25hbFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5pbXBvcnQgeyBnZXRWaWV3cG9ydFdpZHRoLCBpc01vYmlsZVZpZXdwb3J0IH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9sYXlvdXQudXRpbCc7XG5pbXBvcnQgeyBnZXRGb2N1c2FibGVFbGVtZW50cyB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvZm9jdXMudXRpbCc7XG5pbXBvcnQge1xuICBERUZBVUxUX1RBQkxFX09QVElPTlMsXG4gIFRBQkxFX0RFRkFVTFRfTE9BRElOR19WRVJUSUNBTF9QQURESU5HX1BYIGFzIERFRkFVTFRfTE9BRElOR19WRVJUSUNBTF9QQURESU5HX1BYLFxuICBUQUJMRV9ERUZBVUxUX01JTl9MT0FESU5HX0hFSUdIVF9QWCBhcyBERUZBVUxUX01JTl9MT0FESU5HX0hFSUdIVF9QWCxcbiAgVEFCTEVfREVGQVVMVF9ST1dfSEVJR0hUX1BYIGFzIERFRkFVTFRfUk9XX0hFSUdIVF9QWCxcbiAgVEFCTEVfREVGQVVMVF9ST1dTX1BFUl9QQUdFIGFzIERFRkFVTFRfUk9XU19QRVJfUEFHRSxcbiAgVEFCTEVfSU5ERVhfWkVSTyBhcyBJTkRFWF9aRVJPLFxuICBUQUJMRV9NRU5VX0dBUF9QWCBhcyBNRU5VX0dBUF9QWCxcbiAgVEFCTEVfTU9CSUxFX0NBUkRfRVNUSU1BVEVEX0hFSUdIVF9QWFxufSBmcm9tICcuLi8uLi9jb3JlL2NvbnN0YW50cy90YWJsZS5jb25zdCc7XG5pbXBvcnQgdHlwZSB7IFBhZ2luYXRvclN0YXRlIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9wYWdpbmF0b3IudHlwZSc7XG5pbXBvcnQgeyB0eXBlIFNlYXJjaFRyaWdnZXJNb2RlIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9zZWFyY2hib3gudHlwZSc7XG5pbXBvcnQge1xuICB0eXBlIEFjdGlvbk1lbnVJdGVtLFxuICB0eXBlIFJvd0Jhc2UsXG4gIHR5cGUgU29ydE9yZGVyLFxuICB0eXBlIFRhYmxlQWN0aW9uTWVudUl0ZW0gYXMgTmF0aXZlQWN0aW9uTWVudUl0ZW0sXG4gIHR5cGUgVGFibGVBY3Rpb25NZW51Q2xvc2VFdmVudCxcbiAgdHlwZSBUYWJsZUNlbGxDb25maWcsXG4gIHR5cGUgVGFibGVDZWxsQ29uZmlnS2V5LFxuICB0eXBlIFRhYmxlQ29sdW1uLFxuICB0eXBlIFRhYmxlT3Blbk1lbnVTdGF0ZSBhcyBPcGVuTWVudVN0YXRlLFxuICB0eXBlIFRhYmxlT3B0aW9ucyxcbiAgdHlwZSBUYWJsZVNlYXJjaEV2ZW50LFxuICBUYWJsZU1lbnVGb2N1c1RhcmdldFxufSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3RhYmxlLnR5cGUnO1xuXG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IFBhZ2luYXRvckNvbXBvbmVudCB9IGZyb20gJy4uL3BhZ2luYXRvci9wYWdpbmF0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IFNlYXJjaGJveENvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaGJveC9zZWFyY2hib3guY29tcG9uZW50JztcbmltcG9ydCB7IExvYWRpbmdTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2xvYWRpbmctc3RhdGUvbG9hZGluZy1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVBY3Rpb25zTWVudUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90YWJsZS1hY3Rpb25zLW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQ2VsbENvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtY2VsbC1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZVNvcnRJbmRpY2F0b3JDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtc29ydC1pbmRpY2F0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IGJ1aWxkVGFibGVDZWxsQ29uZmlnTWFwLCBtZXJnZVRhYmxlT3B0aW9ucyB9IGZyb20gJy4vdXRpbHMvdGFibGUtY29uZmlnLnV0aWwnO1xuaW1wb3J0IHtcbiAgYnVpbGRSb3dDaGVja2JveElkLFxuICBmaWx0ZXJUYWJsZVJvd3MsXG4gIGdldE5lc3RlZFZhbHVlLFxuICByZXNvbHZlUm93SWRlbnRpdHlMYWJlbCxcbiAgcmVzb2x2ZVJvd1NlbGVjdGlvbktleVxufSBmcm9tICcuL3V0aWxzL3RhYmxlLWRhdGEudXRpbCc7XG5pbXBvcnQge1xuICBnZXRUYWJsZUNvbHVtbk1pbldpZHRoUHgsXG4gIGdldFRhYmxlTWluV2lkdGhQeCxcbiAgcmVzb2x2ZVRhYmxlQ29sdW1uQWxpZ25tZW50XG59IGZyb20gJy4vdXRpbHMvdGFibGUtbGF5b3V0LnV0aWwnO1xuXG5sZXQgdGFibGVJbnN0YW5jZVNlcXVlbmNlID0gMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2RjLXRhYmxlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBTZWFyY2hib3hDb21wb25lbnQsXG4gICAgUGFnaW5hdG9yQ29tcG9uZW50LFxuICAgIEJ1dHRvbkNvbXBvbmVudCxcbiAgICBMb2FkaW5nU3RhdGVDb21wb25lbnQsXG4gICAgRW1wdHlTdGF0ZUNvbXBvbmVudCxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgVGFibGVTb3J0SW5kaWNhdG9yQ29tcG9uZW50LFxuICAgIFRhYmxlQ2VsbENvbnRlbnRDb21wb25lbnQsXG4gICAgVGFibGVBY3Rpb25zTWVudUNvbXBvbmVudFxuICBdLFxuICBzdHlsZVVybDogJy4vdGFibGUuY29tcG9uZW50LnNjc3MnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQ8VCBleHRlbmRzIFJvd0Jhc2UgPSBSb3dCYXNlPiBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgc3RhdGljIGFsbG9jYXRlVGFibGVJbnN0YW5jZUlkKCk6IG51bWJlciB7XG4gICAgY29uc3QgbmV4dElkID0gdGFibGVJbnN0YW5jZVNlcXVlbmNlO1xuICAgIHRhYmxlSW5zdGFuY2VTZXF1ZW5jZSArPSAxO1xuICAgIHJldHVybiBuZXh0SWQ7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pO1xuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyPzogUmVzaXplT2JzZXJ2ZXI7XG4gIHByaXZhdGUgX3RhYmxlSW5zdGFuY2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYWN0aW9uc01lbnVJZFNlcXVlbmNlID0gMDtcblxuICBwcml2YXRlIGdldCB0YWJsZUluc3RhbmNlSWQoKTogbnVtYmVyIHtcbiAgICB0aGlzLl90YWJsZUluc3RhbmNlSWQgPz89IFRhYmxlQ29tcG9uZW50LmFsbG9jYXRlVGFibGVJbnN0YW5jZUlkKCk7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5zdGFuY2VJZDtcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IGNvbHNTaWduYWwgPSBzaWduYWw8VGFibGVDb2x1bW48VD5bXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFTaWduYWwgPSBzaWduYWw8VFtdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZGluZ1NpZ25hbCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnRXaWR0aFNpZ25hbCA9IHNpZ25hbDxudW1iZXI+KGdldFZpZXdwb3J0V2lkdGgoKSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTaWduYWwgPSBzaWduYWw8VGFibGVPcHRpb25zPFQ+PihtZXJnZVRhYmxlT3B0aW9ucyhERUZBVUxUX1RBQkxFX09QVElPTlMgYXMgVGFibGVPcHRpb25zPFQ+KSk7XG4gIHByaXZhdGUgX2NvbmZpZzogVGFibGVPcHRpb25zPFQ+ID0gREVGQVVMVF9UQUJMRV9PUFRJT05TO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGF0aFBhcnRzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIHByaXZhdGUgcm93Q2hlY2tib3hJZENhY2hlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBzdHJpbmc+KCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9wZW5NZW51U3RhdGUgPSBzaWduYWw8T3Blbk1lbnVTdGF0ZTxUPiB8IG51bGw+KG51bGwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXJpYUxhYmVsU2lnbmFsID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2xvYmFsRmlsdGVyID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ydEZpZWxkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ydE9yZGVyID0gc2lnbmFsPFNvcnRPcmRlcj4oMCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzZWxlY3Rpb24gPSBzaWduYWw8VFtdPihbXSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBmaXJzdCA9IHNpZ25hbDxudW1iZXI+KElOREVYX1pFUk8pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcm93cyA9IHNpZ25hbDxudW1iZXI+KERFRkFVTFRfUk9XU19QRVJfUEFHRSk7XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgc2V0IGNvbHModmFsdWU6IFRhYmxlQ29sdW1uPFQ+W10gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5jb2xzU2lnbmFsLnNldCh2YWx1ZSA/PyBbXSk7XG4gIH1cblxuICBnZXQgY29scygpOiBUYWJsZUNvbHVtbjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xzU2lnbmFsKCk7XG4gIH1cblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBzZXQgZGF0YSh2YWx1ZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuZGF0YVNpZ25hbC5zZXQodmFsdWUgPz8gW10pO1xuICAgIHRoaXMucmVjb25jaWxlU2VsZWN0aW9uV2l0aERhdGEoKTtcbiAgICB0aGlzLmNsYW1wUGFnZSgpO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgZ2V0IGRhdGEoKTogVFtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2lnbmFsKCk7XG4gIH1cblxuICBASW5wdXQoeyByZXF1aXJlZDogZmFsc2UgfSlcbiAgc2V0IGxvYWRpbmcodmFsdWU6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5sb2FkaW5nU2lnbmFsLnNldCh2YWx1ZSA9PT0gdHJ1ZSk7XG5cbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTaWduYWwoKTtcbiAgfVxuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiBmYWxzZSB9KVxuICBzZXQgY29uZmlnKHZhbHVlOiBUYWJsZU9wdGlvbnM8VD4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbmV4dCA9IHZhbHVlID8/IERFRkFVTFRfVEFCTEVfT1BUSU9OUztcblxuICAgIGlmICh0aGlzLl9jb25maWcgPT09IG5leHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb25maWcgPSBuZXh0O1xuICAgIHRoaXMuY29uZmlnU2lnbmFsLnNldChtZXJnZVRhYmxlT3B0aW9ucyhuZXh0KSk7XG5cbiAgICBjb25zdCBuZXh0Um93cyA9IHRoaXMuY29uZmlnU2lnbmFsKCkucGFnaW5hdGlvbj8ucm93c1BlclBhZ2UgPz8gREVGQVVMVF9ST1dTX1BFUl9QQUdFO1xuICAgIHRoaXMucm93cy5zZXQobmV4dFJvd3MpO1xuICAgIHRoaXMuZmlyc3Quc2V0KElOREVYX1pFUk8pO1xuXG4gICAgdGhpcy5wYXRoUGFydHNDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMucm93Q2hlY2tib3hJZENhY2hlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBzdHJpbmc+KCk7XG4gICAgdGhpcy5yZWNvbmNpbGVTZWxlY3Rpb25XaXRoRGF0YSgpO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgZ2V0IGNvbmZpZygpOiBUYWJsZU9wdGlvbnM8VD4ge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgYXJpYUxhYmVsKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmFyaWFMYWJlbFNpZ25hbC5zZXQodmFsdWUpO1xuICB9XG5cbiAgZ2V0IGFyaWFMYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmFyaWFMYWJlbFNpZ25hbCgpO1xuICB9XG5cbiAgQE91dHB1dCgpIGFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb2x1bW46IFRhYmxlQ29sdW1uPFQ+OyByb3c6IFQ7IHZhbHVlOiB1bmtub3duIH0+KCk7XG4gIEBPdXRwdXQoKSBsYXp5TG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIGZpcnN0OiBudW1iZXI7XG4gICAgcm93czogbnVtYmVyO1xuICAgIHNvcnRGaWVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgc29ydE9yZGVyPzogU29ydE9yZGVyO1xuICAgIHRyaWdnZXI/OiAncGFnZScgfCAnc29ydCcgfCAnc2VhcmNoJztcbiAgICBzZWFyY2hUZXJtPzogc3RyaW5nO1xuICB9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUW10+KCk7XG5cbiAgZ2V0IGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU2lnbmFsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3B0aW9ucyA9IGNvbXB1dGVkPFRhYmxlT3B0aW9uczxUPj4oKCkgPT4gdGhpcy5jb25maWdTaWduYWwoKSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBpc01vYmlsZSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IGlzTW9iaWxlVmlld3BvcnQodGhpcy52aWV3cG9ydFdpZHRoU2lnbmFsKCkpKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd1NlYXJjaCA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMub3B0aW9ucygpLnNlYXJjaD8uc2hvdyA/PyBmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93UGFnaW5hdG9yID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5vcHRpb25zKCkucGFnaW5hdGlvbj8uc2hvdyA/PyBmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93SW5pdGlhbExvYWRpbmcgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB0aGlzLmxvYWRpbmdTaWduYWwoKSAmJiB0aGlzLmRhdGFTaWduYWwoKS5sZW5ndGggPT09IDApO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSByb3dzUGVyUGFnZU9wdGlvbnMgPSBjb21wdXRlZDxudW1iZXJbXT4oKCkgPT4gdGhpcy5vcHRpb25zKCkucGFnaW5hdGlvbj8ucm93c1BlclBhZ2VPcHRpb25zID8/IFtdKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlYXJjaFBsYWNlaG9sZGVyID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5zZWFyY2g/LnBsYWNlaG9sZGVyID8/ICcnKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyaWdnZXJNb2RlID0gY29tcHV0ZWQ8U2VhcmNoVHJpZ2dlck1vZGU+KCgpID0+IHRoaXMub3B0aW9ucygpLnNlYXJjaD8udHlwZSA/PyAnYXV0bycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG90YWxSZWNvcmRzTGFiZWwgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHRoaXMub3B0aW9ucygpLnRhYmxlPy50b3RhbFJlY29yZHNMYWJlbCA/PyAnJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0VGV4dE92ZXJmbG93ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcHRpb25zKCkudGFibGU/LnRleHRPdmVyZmxvdyk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0YWJsZU1vZGUgPSBjb21wdXRlZDwnbG9jYWwnIHwgJ2FwaSc+KCgpID0+IHRoaXMub3B0aW9ucygpLnRhYmxlPy5tb2RlID8/ICdsb2NhbCcpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNBcGlNb2RlID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy50YWJsZU1vZGUoKSA9PT0gJ2FwaScpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNGaXRMYXlvdXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKS50YWJsZT8ubGF5b3V0ID09PSAnZml0Jyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBtb2JpbGVNb2RlID0gY29tcHV0ZWQ8J2V4cGFuZGFibGUnIHwgJ3N0YWNrZWQnPigoKSA9PiB0aGlzLm9wdGlvbnMoKS50YWJsZT8ubW9iaWxlTW9kZSA/PyAnZXhwYW5kYWJsZScpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXhwYW5kZWRSb3dJbmRleCA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN1bW1hcnlDb2xzID0gY29tcHV0ZWQ8VGFibGVDb2x1bW48VD5bXT4oKCkgPT4ge1xuICAgIGNvbnN0IFNVTU1BUllfQ09MX0NPVU5UID0gMjtcbiAgICByZXR1cm4gdGhpcy5jb2xzU2lnbmFsKClcbiAgICAgIC5maWx0ZXIoY29sID0+IGNvbC50eXBlICE9PSAnY2hlY2tib3gtc2VsZWN0aW9uJyAmJiBjb2wudHlwZSAhPT0gJ2FjdGlvbnMnICYmIGNvbC50eXBlICE9PSAnYnV0dG9uJylcbiAgICAgIC5zbGljZSgwLCBTVU1NQVJZX0NPTF9DT1VOVCk7XG4gIH0pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2hlY2tib3hDb2wgPSBjb21wdXRlZDxUYWJsZUNvbHVtbjxUPiB8IG51bGw+KCgpID0+XG4gICAgdGhpcy5jb2xzU2lnbmFsKCkuZmluZChjb2wgPT4gY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nKSA/PyBudWxsXG4gICk7XG4gIHByb3RlY3RlZCByZWFkb25seSBlbXB0eVRpdGxlID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5lbXB0eT8udGl0bGUgPz8gJycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZW1wdHlUZXh0ID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5lbXB0eT8udGV4dCA/PyAnJyk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNlbGxzQ2ZnID0gY29tcHV0ZWQoKCkgPT4gYnVpbGRUYWJsZUNlbGxDb25maWdNYXAodGhpcy5vcHRpb25zKCkpKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsdGVyZWREYXRhID0gY29tcHV0ZWQ8VFtdPigoKSA9PiB7XG4gICAgaWYgKHRoaXMuaXNBcGlNb2RlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFTaWduYWwoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmlsdGVyVGFibGVSb3dzKHRoaXMuZGF0YVNpZ25hbCgpLCB0aGlzLmNvbHNTaWduYWwoKSwgdGhpcy5nbG9iYWxGaWx0ZXIoKSwgdGhpcy5yZXNvbHZlVmFsdWUpO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ydGVkRGF0YSA9IGNvbXB1dGVkPFRbXT4oKCkgPT4ge1xuICAgIGlmICh0aGlzLmlzQXBpTW9kZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZERhdGEoKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuc29ydEZpZWxkKCk7XG4gICAgY29uc3Qgb3JkZXIgPSB0aGlzLnNvcnRPcmRlcigpO1xuICAgIGNvbnN0IHJvd3MgPSBbLi4udGhpcy5maWx0ZXJlZERhdGEoKV07XG5cbiAgICBpZiAoIWZpZWxkIHx8IG9yZGVyID09PSAwKSB7XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cy5zb3J0KChsZWZ0Um93LCByaWdodFJvdykgPT4ge1xuICAgICAgY29uc3QgbGVmdFZhbHVlID0gdGhpcy5yZXNvbHZlVmFsdWUobGVmdFJvdywgZmllbGQpO1xuICAgICAgY29uc3QgcmlnaHRWYWx1ZSA9IHRoaXMucmVzb2x2ZVZhbHVlKHJpZ2h0Um93LCBmaWVsZCk7XG5cbiAgICAgIGlmIChsZWZ0VmFsdWUgPT0gbnVsbCAmJiByaWdodFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChsZWZ0VmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gLW9yZGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAocmlnaHRWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBvcmRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBsZWZ0VmFsdWUgPT09ICdudW1iZXInICYmIHR5cGVvZiByaWdodFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gKGxlZnRWYWx1ZSAtIHJpZ2h0VmFsdWUpICogb3JkZXI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnRvQ29tcGFyYWJsZVRleHQobGVmdFZhbHVlKS5sb2NhbGVDb21wYXJlKHRoaXMudG9Db21wYXJhYmxlVGV4dChyaWdodFZhbHVlKSkgKiBvcmRlcjtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRvdGFsUmVjb3JkcyA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5pc0FwaU1vZGUoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc29ydGVkRGF0YSgpLmxlbmd0aDtcbiAgICB9XG5cbiAgICBjb25zdCBhcGlUb3RhbCA9IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnRvdGFsUmVjb3JkcztcblxuICAgIGlmICh0eXBlb2YgYXBpVG90YWwgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShhcGlUb3RhbCkgJiYgYXBpVG90YWwgPj0gMCkge1xuICAgICAgcmV0dXJuIE1hdGgudHJ1bmMoYXBpVG90YWwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNvcnRlZERhdGEoKS5sZW5ndGg7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBwYWdlRGF0YSA9IGNvbXB1dGVkPFRbXT4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5zaG93UGFnaW5hdG9yKCkgfHwgdGhpcy5pc0FwaU1vZGUoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc29ydGVkRGF0YSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5maXJzdCgpO1xuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgdGhpcy5yb3dzKCk7XG4gICAgcmV0dXJuIHRoaXMuc29ydGVkRGF0YSgpLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW5pdGlhbExvYWRpbmdSb3dzID0gY29tcHV0ZWQ8bnVtYmVyW10+KCgpID0+IHtcbiAgICBjb25zdCByb3dzRnJvbVN0YXRlID0gdGhpcy5yb3dzKCk7XG4gICAgY29uc3Qgcm93c0Zyb21Db25maWcgPSB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZSA/PyBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG4gICAgY29uc3Qgbm9ybWFsaXplZFJvd3MgPSBOdW1iZXIocm93c0Zyb21TdGF0ZSB8fCByb3dzRnJvbUNvbmZpZyB8fCBERUZBVUxUX1JPV1NfUEVSX1BBR0UpO1xuICAgIGNvbnN0IHNhZmVSb3dzID0gTnVtYmVyLmlzRmluaXRlKG5vcm1hbGl6ZWRSb3dzKSAmJiBub3JtYWxpemVkUm93cyA+IDAgPyBub3JtYWxpemVkUm93cyA6IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBzYWZlUm93cyB9LCAoXywgaW5kZXgpID0+IGluZGV4KTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGlvblNldCA9IGNvbXB1dGVkPFNldDxUPj4oKCkgPT4gbmV3IFNldCh0aGlzLnNlbGVjdGlvbigpKSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJvZHlWaWV3cG9ydEhlaWdodFB4ID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB7XG4gICAgY29uc3Qgcm93c0Zyb21TdGF0ZSA9IHRoaXMucm93cygpO1xuICAgIGNvbnN0IHJvd3NGcm9tQ29uZmlnID0gdGhpcy5vcHRpb25zKCkucGFnaW5hdGlvbj8ucm93c1BlclBhZ2UgPz8gREVGQVVMVF9ST1dTX1BFUl9QQUdFO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRSb3dzID0gTnVtYmVyKHJvd3NGcm9tU3RhdGUgfHwgcm93c0Zyb21Db25maWcgfHwgREVGQVVMVF9ST1dTX1BFUl9QQUdFKTtcbiAgICBjb25zdCBzYWZlUm93cyA9IE51bWJlci5pc0Zpbml0ZShub3JtYWxpemVkUm93cykgJiYgbm9ybWFsaXplZFJvd3MgPiAwID8gbm9ybWFsaXplZFJvd3MgOiBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG5cbiAgICBjb25zdCByb3dIZWlnaHQgPSB0aGlzLmlzTW9iaWxlKCkgPyBUQUJMRV9NT0JJTEVfQ0FSRF9FU1RJTUFURURfSEVJR0hUX1BYIDogREVGQVVMVF9ST1dfSEVJR0hUX1BYO1xuICAgIGNvbnN0IGVzdGltYXRlZEhlaWdodCA9IHNhZmVSb3dzICogcm93SGVpZ2h0ICsgREVGQVVMVF9MT0FESU5HX1ZFUlRJQ0FMX1BBRERJTkdfUFg7XG5cbiAgICByZXR1cm4gTWF0aC5tYXgoREVGQVVMVF9NSU5fTE9BRElOR19IRUlHSFRfUFgsIGVzdGltYXRlZEhlaWdodCk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBlbXB0eUJvZHlIZWlnaHRQeCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4gdGhpcy5ib2R5Vmlld3BvcnRIZWlnaHRQeCgpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRhYmxlTWluV2lkdGhQeCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4gZ2V0VGFibGVNaW5XaWR0aFB4KHRoaXMuY29sc1NpZ25hbCgpKSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc29sdmVWYWx1ZSA9IChvYmo6IFQsIHBhdGg/OiBzdHJpbmcpOiB1bmtub3duID0+XG4gICAgZ2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoLCB0aGlzLnBhdGhQYXJ0c0NhY2hlKTtcblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycpXG4gIHByb3RlY3RlZCBvbkRvY3VtZW50Q2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScpXG4gIHByb3RlY3RlZCBvbkVzY2FwZUtleSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoVGFibGVNZW51Rm9jdXNUYXJnZXQuVHJpZ2dlcik7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5mbG9vcihlbnRyaWVzWzBdPy5jb250ZW50UmVjdC53aWR0aCA/PyAwKTtcbiAgICAgIGlmICh3aWR0aCA+IDApIHtcbiAgICAgICAgdGhpcy52aWV3cG9ydFdpZHRoU2lnbmFsLnNldCh3aWR0aCk7XG4gICAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJylcbiAgcHJvdGVjdGVkIG9uV2luZG93U2Nyb2xsKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU2VhcmNoVGVybShldmVudE9yVmFsdWU6IFRhYmxlU2VhcmNoRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXJtID0gdHlwZW9mIGV2ZW50T3JWYWx1ZSA9PT0gJ3N0cmluZycgPyBldmVudE9yVmFsdWUgOiBldmVudE9yVmFsdWU/LmRldGFpbCA/PyAnJztcbiAgICB0aGlzLmdsb2JhbEZpbHRlci5zZXQoU3RyaW5nKHRlcm0pKTtcbiAgICB0aGlzLmZpcnN0LnNldChJTkRFWF9aRVJPKTtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcblxuICAgIGlmICh0aGlzLmlzQXBpTW9kZSgpKSB7XG4gICAgICB0aGlzLmVtaXRMYXp5TG9hZCgnc2VhcmNoJyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2xlYXJTZWFyY2goKTogdm9pZCB7XG4gICAgdGhpcy5nbG9iYWxGaWx0ZXIuc2V0KCcnKTtcbiAgICB0aGlzLmZpcnN0LnNldChJTkRFWF9aRVJPKTtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcblxuICAgIGlmICh0aGlzLmlzQXBpTW9kZSgpKSB7XG4gICAgICB0aGlzLmVtaXRMYXp5TG9hZCgnc2VhcmNoJyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZVNvcnQoZmllbGQ6IHN0cmluZywgZW5hYmxlZCA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoIWVuYWJsZWQgfHwgIWZpZWxkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ydEZpZWxkKCkgIT09IGZpZWxkKSB7XG4gICAgICB0aGlzLnNvcnRGaWVsZC5zZXQoZmllbGQpO1xuICAgICAgdGhpcy5zb3J0T3JkZXIuc2V0KDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50T3JkZXIgPSB0aGlzLnNvcnRPcmRlcigpO1xuXG4gICAgICBpZiAoY3VycmVudE9yZGVyID09PSAxKSB7XG4gICAgICAgIHRoaXMuc29ydE9yZGVyLnNldCgtMSk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRPcmRlciA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5zb3J0T3JkZXIuc2V0KDApO1xuICAgICAgICB0aGlzLnNvcnRGaWVsZC5zZXQobnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvcnRPcmRlci5zZXQoMSk7XG4gICAgICAgIHRoaXMuc29ydEZpZWxkLnNldChmaWVsZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG4gICAgaWYgKHRoaXMuaXNBcGlNb2RlKCkpIHtcbiAgICAgIHRoaXMuZW1pdExhenlMb2FkKCdzb3J0Jyk7XG4gICAgfVxuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNvcnRBcmlhQXR0cmlidXRlKGNvbDogVGFibGVDb2x1bW48VD4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChjb2wuc29ydGFibGUgPT09IGZhbHNlIHx8ICFjb2wuZmllbGQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ydEZpZWxkKCkgIT09IGNvbC5maWVsZCkge1xuICAgICAgcmV0dXJuICdub25lJztcbiAgICB9XG5cbiAgICBjb25zdCBvcmRlciA9IHRoaXMuc29ydE9yZGVyKCk7XG5cbiAgICBpZiAob3JkZXIgPT09IDEpIHtcbiAgICAgIHJldHVybiAnYXNjZW5kaW5nJztcbiAgICB9XG5cbiAgICBpZiAob3JkZXIgPT09IC0xKSB7XG4gICAgICByZXR1cm4gJ2Rlc2NlbmRpbmcnO1xuICAgIH1cblxuICAgIHJldHVybiAnbm9uZSc7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29sdW1uQWxpZ25DbGFzcyhjb2w6IFRhYmxlQ29sdW1uPFQ+LCB0YXJnZXQ6ICdjZWxsJyB8ICdoZWFkZXInID0gJ2NlbGwnKTogc3RyaW5nIHtcbiAgICBjb25zdCBhbGlnbiA9IHJlc29sdmVUYWJsZUNvbHVtbkFsaWdubWVudChjb2wsIHRhcmdldCk7XG4gICAgcmV0dXJuIHRhcmdldCA9PT0gJ2hlYWRlcidcbiAgICAgID8gYHNkYy10YWJsZS10aC1hbGlnbi0ke2FsaWdufWBcbiAgICAgIDogYHNkYy10YWJsZS10ZC1hbGlnbi0ke2FsaWdufWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNTb3J0YWJsZUNvbHVtbihjb2w6IFRhYmxlQ29sdW1uPFQ+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbC5zb3J0YWJsZSAhPT0gZmFsc2UgJiYgISFjb2wuZmllbGQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFzRGF0YVJvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNpZ25hbCgpLmxlbmd0aCA+IDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2FuU29ydENvbHVtbihjb2w6IFRhYmxlQ29sdW1uPFQ+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGF0YVJvd3MoKSAmJiB0aGlzLmlzU29ydGFibGVDb2x1bW4oY29sKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2x1bW5NaW5XaWR0aFB4KGNvbDogVGFibGVDb2x1bW48VD4pOiBudW1iZXIge1xuICAgIHJldHVybiBnZXRUYWJsZUNvbHVtbk1pbldpZHRoUHgoY29sKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2xXaWR0aFN0eWxlKGNvbDogVGFibGVDb2x1bW48VD4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmlzRml0TGF5b3V0KCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbC53aWR0aCAhPSBudWxsID8gYCR7Y29sLndpZHRofSVgIDogYCR7Z2V0VGFibGVDb2x1bW5NaW5XaWR0aFB4KGNvbCl9cHhgO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1vYmlsZUZpZWxkTGFiZWwoY29sOiBUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB7XG4gICAgaWYgKGNvbC5oZWFkZXIpIHtcbiAgICAgIHJldHVybiBjb2wuaGVhZGVyO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29sLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2FjdGlvbnMnOlxuICAgICAgICByZXR1cm4gdGhpcy5jZWxsc0NmZygpLmFjdGlvbnMuYnV0dG9uTGFiZWwgfHwgJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuYWN0aW9uc19tZW51JztcbiAgICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgICAgIHJldHVybiB0aGlzLmNlbGxzQ2ZnKCkuYnV0dG9uLmxhYmVsXG4gICAgICAgICAgfHwgdGhpcy5jZWxsc0NmZygpLmJ1dHRvbi50b29sdGlwXG4gICAgICAgICAgfHwgJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuYWN0aW9uX2J1dHRvbic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZUV4cGFuZFJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZFJvd0luZGV4LnNldCh0aGlzLmV4cGFuZGVkUm93SW5kZXgoKSA9PT0gaW5kZXggPyBudWxsIDogaW5kZXgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzUm93RXhwYW5kZWQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkUm93SW5kZXgoKSA9PT0gaW5kZXg7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25QYWdlQ2hhbmdlKGV2ZW50OiBQYWdpbmF0b3JTdGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IG5leHRGaXJzdCA9IGV2ZW50LmZpcnN0ID8/IElOREVYX1pFUk87XG4gICAgY29uc3QgbmV4dFJvd3MgPSBldmVudC5yb3dzID8/IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnJvd3NQZXJQYWdlID8/IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcblxuICAgIHRoaXMuZmlyc3Quc2V0KG5leHRGaXJzdCk7XG4gICAgdGhpcy5yb3dzLnNldChuZXh0Um93cyk7XG4gICAgdGhpcy5leHBhbmRlZFJvd0luZGV4LnNldChudWxsKTtcbiAgICB0aGlzLmVtaXRMYXp5TG9hZCgncGFnZScpO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVG9nZ2xlUm93KHJvdzogVCwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRTZWxlY3Rpb24gPSBuZXcgU2V0KHRoaXMuc2VsZWN0aW9uU2V0KCkpO1xuXG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIG5leHRTZWxlY3Rpb24uYWRkKHJvdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRTZWxlY3Rpb24uZGVsZXRlKHJvdyk7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTZWxlY3Rpb24obmV4dFNlbGVjdGlvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNSb3dTZWxlY3RlZChyb3c6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXQoKS5oYXMocm93KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdzogVCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRpc2FibGVkID0gdGhpcy5jZWxsc0NmZygpLmNoZWNrYm94LmRpc2FibGVkO1xuXG4gICAgaWYgKHR5cGVvZiBkaXNhYmxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGRpc2FibGVkKHJvdyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpc2FibGVkID09PSB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZVNlbGVjdFBhZ2UoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IG5leHRTZWxlY3Rpb24gPSBuZXcgU2V0KHRoaXMuc2VsZWN0aW9uU2V0KCkpO1xuXG4gICAgdGhpcy5zZWxlY3RhYmxlUGFnZVJvd3MoKS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgIG5leHRTZWxlY3Rpb24uYWRkKHJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0U2VsZWN0aW9uLmRlbGV0ZShyb3cpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVTZWxlY3Rpb24obmV4dFNlbGVjdGlvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNQYWdlRnVsbHlTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aXNpYmxlUm93cyA9IHRoaXMuc2VsZWN0YWJsZVBhZ2VSb3dzKCk7XG5cbiAgICBpZiAodmlzaWJsZVJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5zZWxlY3Rpb25TZXQoKTtcbiAgICByZXR1cm4gdmlzaWJsZVJvd3MuZXZlcnkoKHJvdykgPT4gc2VsZWN0ZWRSb3dzLmhhcyhyb3cpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1BhZ2VQYXJ0aWFsbHlTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aXNpYmxlUm93cyA9IHRoaXMuc2VsZWN0YWJsZVBhZ2VSb3dzKCk7XG5cbiAgICBpZiAodmlzaWJsZVJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5zZWxlY3Rpb25TZXQoKTtcbiAgICBjb25zdCBzZWxlY3RlZENvdW50ID0gdmlzaWJsZVJvd3MuZmlsdGVyKChyb3cpID0+IHNlbGVjdGVkUm93cy5oYXMocm93KSkubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkQ291bnQgPiAwICYmIHNlbGVjdGVkQ291bnQgPCB2aXNpYmxlUm93cy5sZW5ndGg7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFzU2VsZWN0YWJsZVBhZ2VSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGFibGVQYWdlUm93cygpLmxlbmd0aCA+IDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UGFnZVNlbGVjdGlvbkFyaWFDaGVja2VkKCk6ICdmYWxzZScgfCAnbWl4ZWQnIHwgJ3RydWUnIHtcbiAgICBpZiAodGhpcy5pc1BhZ2VQYXJ0aWFsbHlTZWxlY3RlZCgpKSB7XG4gICAgICByZXR1cm4gJ21peGVkJztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc1BhZ2VGdWxseVNlbGVjdGVkKCkgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENoZWNrZWRWYWx1ZShldmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJvd0NoZWNrYm94SWQocm93OiBUKTogc3RyaW5nIHtcbiAgICBpZiAoIXJvdyB8fCB0eXBlb2Ygcm93ICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGJ1aWxkUm93Q2hlY2tib3hJZChyb3cpO1xuICAgIH1cblxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucm93Q2hlY2tib3hJZENhY2hlLmdldChyb3cpO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0SWQgPSBidWlsZFJvd0NoZWNrYm94SWQocm93KTtcbiAgICB0aGlzLnJvd0NoZWNrYm94SWRDYWNoZS5zZXQocm93LCBuZXh0SWQpO1xuICAgIHJldHVybiBuZXh0SWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Um93Q2hlY2tib3hMYWJlbChyb3c6IFQpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlUm93SWRlbnRpdHlMYWJlbChyb3cpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNlbGVjdEFsbENoZWNrYm94SWQoY29sdW1uSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBzZGMtdGFibGUtJHt0aGlzLnRhYmxlSW5zdGFuY2VJZH0tc2VsZWN0LWFsbC1jaGVja2JveC0ke2NvbHVtbkluZGV4fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgdGFibGVBcmlhTGFiZWxLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcmlhTGFiZWxTaWduYWwoKSA/PyAncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eS50YWJsZV9kZXNjcmlwdGlvbic7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlQWN0aW9uc01lbnUoZXZlbnQ6IEV2ZW50LCByb3c6IFQsIGNvbDogVGFibGVDb2x1bW48VD4sIHRyaWdnZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpKSB7XG4gICAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb25zT3B0aW9ucyA9IHRoaXMuY2VsbENmZygnYWN0aW9ucycpO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5hY3Rpb25JdGVtc0Zvcihyb3csIGFjdGlvbnNPcHRpb25zKTtcbiAgICBjb25zdCByZWN0ID0gdHJpZ2dlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbWVudUlkID0gdGhpcy5uZXh0QWN0aW9uc01lbnVJZCgpO1xuXG4gICAgdGhpcy5vcGVuTWVudVN0YXRlLnNldCh7XG4gICAgICByb3csXG4gICAgICBjb2wsXG4gICAgICBpdGVtcyxcbiAgICAgIG1lbnVJZCxcbiAgICAgIGNsb3NlT25DbGljazogYWN0aW9uc09wdGlvbnM/LmNsb3NlT25DbGljayAhPT0gZmFsc2UsXG4gICAgICB0cmlnZ2VyOiB0cmlnZ2VyRWxlbWVudCxcbiAgICAgIHRvcDogcmVjdC5ib3R0b20gKyBNRU5VX0dBUF9QWCxcbiAgICAgIGxlZnQ6IHJlY3QubGVmdCxcbiAgICAgIHdpZHRoOiByZWN0LndpZHRoXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xvc2VBY3Rpb25zTWVudShmb2N1c1RhcmdldDogVGFibGVNZW51Rm9jdXNUYXJnZXQgPSBUYWJsZU1lbnVGb2N1c1RhcmdldC5Ob25lKTogdm9pZCB7XG4gICAgY29uc3QgbWVudSA9IHRoaXMub3Blbk1lbnVTdGF0ZSgpO1xuICAgIHRoaXMub3Blbk1lbnVTdGF0ZS5zZXQobnVsbCk7XG5cbiAgICBpZiAoIW1lbnUgfHwgZm9jdXNUYXJnZXQgPT09IFRhYmxlTWVudUZvY3VzVGFyZ2V0Lk5vbmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLmZvY3VzQ2xvc2VkTWVudVRhcmdldChtZW51LnRyaWdnZXIsIG1lbnUubWVudUlkLCBmb2N1c1RhcmdldCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzQWN0aW9uc01lbnVPcGVuKHJvdzogVCwgY29sOiBUYWJsZUNvbHVtbjxUPik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1lbnUgPSB0aGlzLm9wZW5NZW51U3RhdGUoKTtcblxuICAgIGlmICghbWVudSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBtZW51LnJvdyA9PT0gcm93ICYmIG1lbnUuY29sID09PSBjb2w7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWN0aW9uSXRlbXNGb3Iocm93OiBULCBvcHRpb25zOiBUYWJsZUNlbGxDb25maWc8VCwgJ2FjdGlvbnMnPik6IE5hdGl2ZUFjdGlvbk1lbnVJdGVtW10ge1xuICAgIGNvbnN0IGl0ZW1zID0gb3B0aW9ucy5pdGVtcyA/PyBbXTtcblxuICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW06IEFjdGlvbk1lbnVJdGVtPFQ+KSA9PiAoe1xuICAgICAga2V5OiBpdGVtLmtleSxcbiAgICAgIGxhYmVsOiBpdGVtLmxhYmVsLFxuICAgICAgaWNvbjogaXRlbS5pY29uLFxuICAgICAgZGlzYWJsZWQ6IHRoaXMucmVzb2x2ZUFjdGlvbkRpc2FibGVkKGl0ZW0sIHJvdylcbiAgICB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Qb3J0YWxBY3Rpb25DbGljayhpdGVtOiBOYXRpdmVBY3Rpb25NZW51SXRlbSk6IHZvaWQge1xuICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWVudSA9IHRoaXMub3Blbk1lbnVTdGF0ZSgpO1xuXG4gICAgaWYgKCFtZW51KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vbkFjdGlvblNlbGVjdChtZW51LnJvdywgbWVudS5jb2wsIGl0ZW0pO1xuXG4gICAgaWYgKG1lbnUuY2xvc2VPbkNsaWNrKSB7XG4gICAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZW51Q2xvc2UoZXZlbnQ6IFRhYmxlQWN0aW9uTWVudUNsb3NlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoZXZlbnQuZm9jdXNUYXJnZXQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQWN0aW9uU2VsZWN0KHJvdzogVCwgY29sOiBUYWJsZUNvbHVtbjxUPiwgaXRlbTogeyBrZXk6IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgaWNvbj86IHN0cmluZzsgZGlzYWJsZWQ/OiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICBpZiAoaXRlbS5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkS2V5ID0gY29sLmFjdGlvbkZpZWxkID8/IGNvbC5maWVsZDtcbiAgICBjb25zdCByb3dWYWx1ZSA9IGZpZWxkS2V5ID8gdGhpcy5yZXNvbHZlVmFsdWUocm93LCBmaWVsZEtleSkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5hY3Rpb24uZW1pdCh7IHJvdywgY29sdW1uOiBjb2wsIHZhbHVlOiB7IHJvd1ZhbHVlLCBhY3Rpb246IGl0ZW0gfSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJ1dHRvbkNsaWNrKHJvdzogVCwgY29sOiBUYWJsZUNvbHVtbjxUPik6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IGNvbC5hY3Rpb25GaWVsZCA/PyBjb2wuZmllbGQ7XG4gICAgY29uc3QgdmFsdWUgPSBrZXkgPyB0aGlzLnJlc29sdmVWYWx1ZShyb3csIGtleSkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5hY3Rpb24uZW1pdCh7IHJvdywgdmFsdWUsIGNvbHVtbjogY29sIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVDZWxsSWQoY29sOiBUYWJsZUNvbHVtbjxUPiwgcm93OiBUKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFjb2wuY2VsbElkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZW9mIGNvbC5jZWxsSWQgPT09ICdmdW5jdGlvbicgPyAoY29sLmNlbGxJZChyb3cpIHx8IG51bGwpIDogKGNvbC5jZWxsSWQgfHwgbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGNlbGxDZmc8SyBleHRlbmRzIFRhYmxlQ2VsbENvbmZpZ0tleT4oa2luZDogSykge1xuICAgIHJldHVybiB0aGlzLmNlbGxzQ2ZnKClba2luZF07XG4gIH1cblxuICBwcml2YXRlIGVtaXRMYXp5TG9hZCh0cmlnZ2VyOiAncGFnZScgfCAnc29ydCcgfCAnc2VhcmNoJyk6IHZvaWQge1xuICAgIGNvbnN0IHBheWxvYWQ6IHtcbiAgICAgIGZpcnN0OiBudW1iZXI7XG4gICAgICByb3dzOiBudW1iZXI7XG4gICAgICBzb3J0RmllbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgICAgc29ydE9yZGVyPzogU29ydE9yZGVyO1xuICAgICAgdHJpZ2dlcj86ICdwYWdlJyB8ICdzb3J0JyB8ICdzZWFyY2gnO1xuICAgICAgc2VhcmNoVGVybT86IHN0cmluZztcbiAgICB9ID0ge1xuICAgICAgZmlyc3Q6IHRoaXMuZmlyc3QoKSxcbiAgICAgIHJvd3M6IHRoaXMucm93cygpLFxuICAgICAgc29ydEZpZWxkOiB0aGlzLnNvcnRGaWVsZCgpLFxuICAgICAgc29ydE9yZGVyOiB0aGlzLnNvcnRPcmRlcigpLFxuICAgICAgdHJpZ2dlclxuICAgIH07XG5cbiAgICBpZiAodHJpZ2dlciA9PT0gJ3NlYXJjaCcpIHtcbiAgICAgIHBheWxvYWQuc2VhcmNoVGVybSA9IHRoaXMuZ2xvYmFsRmlsdGVyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5sYXp5TG9hZC5lbWl0KHBheWxvYWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGFtcFBhZ2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dQYWdpbmF0b3IoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1heEZpcnN0ID0gTWF0aC5tYXgoSU5ERVhfWkVSTywgdGhpcy50b3RhbFJlY29yZHMoKSAtIHRoaXMucm93cygpKTtcblxuICAgIGlmICh0aGlzLmZpcnN0KCkgPiBtYXhGaXJzdCkge1xuICAgICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWNvbmNpbGVTZWxlY3Rpb25XaXRoRGF0YSgpOiB2b2lkIHtcbiAgICBjb25zdCByb3dzQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgVD4oKTtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMuZGF0YVNpZ25hbCgpKSB7XG4gICAgICBjb25zdCByb3dLZXkgPSB0aGlzLmdldFNlbGVjdGlvbktleShyb3cpO1xuXG4gICAgICBpZiAoIXJvd3NCeUtleS5oYXMocm93S2V5KSkge1xuICAgICAgICByb3dzQnlLZXkuc2V0KHJvd0tleSwgcm93KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzZWVuS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IG5leHRTZWxlY3Rpb246IFRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5zZWxlY3Rpb24oKSkge1xuICAgICAgY29uc3Qgcm93S2V5ID0gdGhpcy5nZXRTZWxlY3Rpb25LZXkocm93KTtcbiAgICAgIGNvbnN0IG5leHRSb3cgPSByb3dzQnlLZXkuZ2V0KHJvd0tleSk7XG5cbiAgICAgIGNvbnN0IGlzSW52YWxpZFJvdyA9ICFuZXh0Um93IHx8IHNlZW5LZXlzLmhhcyhyb3dLZXkpIHx8IHRoaXMuaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChuZXh0Um93KTtcblxuICAgICAgaWYgKCFpc0ludmFsaWRSb3cpIHtcbiAgICAgICAgc2VlbktleXMuYWRkKHJvd0tleSk7XG4gICAgICAgIG5leHRTZWxlY3Rpb24ucHVzaChuZXh0Um93KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihuZXh0U2VsZWN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUFjdGlvbkRpc2FibGVkKGl0ZW06IEFjdGlvbk1lbnVJdGVtPFQ+LCByb3c6IFQpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIGl0ZW0uZGlzYWJsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpdGVtLmRpc2FibGVkKHJvdyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW0uZGlzYWJsZWQgPT09IHRydWU7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdGFibGVQYWdlUm93cygpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLnBhZ2VEYXRhKCkuZmlsdGVyKChyb3cpID0+ICF0aGlzLmlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlbGVjdGlvbihuZXh0U2VsZWN0aW9uOiBJdGVyYWJsZTxUPik6IHZvaWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWxlY3Rpb24gPSB0aGlzLm5vcm1hbGl6ZVNlbGVjdGlvbihuZXh0U2VsZWN0aW9uKTtcblxuICAgIGlmICh0aGlzLmhhc1NhbWVTZWxlY3Rpb24odGhpcy5zZWxlY3Rpb24oKSwgbm9ybWFsaXplZFNlbGVjdGlvbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGlvbi5zZXQobm9ybWFsaXplZFNlbGVjdGlvbik7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChbLi4ubm9ybWFsaXplZFNlbGVjdGlvbl0pO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVTZWxlY3Rpb24obmV4dFNlbGVjdGlvbjogSXRlcmFibGU8VD4pOiBUW10ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWxlY3Rpb246IFRbXSA9IFtdO1xuICAgIGNvbnN0IHNlZW5Sb3dzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBuZXh0U2VsZWN0aW9uKSB7XG4gICAgICBjb25zdCByb3dLZXkgPSB0aGlzLmdldFNlbGVjdGlvbktleShyb3cpO1xuXG4gICAgICBjb25zdCBzaG91bGRBcHBlbmQgPSAhc2VlblJvd3MuaGFzKHJvd0tleSkgJiYgIXRoaXMuaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpO1xuXG4gICAgICBpZiAoc2hvdWxkQXBwZW5kKSB7XG4gICAgICAgIHNlZW5Sb3dzLmFkZChyb3dLZXkpO1xuICAgICAgICBub3JtYWxpemVkU2VsZWN0aW9uLnB1c2gocm93KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZFNlbGVjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0aW9uS2V5KHJvdzogVCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVSb3dTZWxlY3Rpb25LZXkocm93KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzU2FtZVNlbGVjdGlvbihjdXJyZW50U2VsZWN0aW9uOiBUW10sIG5leHRTZWxlY3Rpb246IFRbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uLmxlbmd0aCA9PT0gbmV4dFNlbGVjdGlvbi5sZW5ndGhcbiAgICAgICYmIGN1cnJlbnRTZWxlY3Rpb24uZXZlcnkoKHJvdywgaW5kZXgpID0+IHJvdyA9PT0gbmV4dFNlbGVjdGlvbltpbmRleF0pO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0NvbXBhcmFibGVUZXh0KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIHZhbHVlID09PSAnYmlnaW50Jykge1xuICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgbmV4dEFjdGlvbnNNZW51SWQoKTogc3RyaW5nIHtcbiAgICB0aGlzLmFjdGlvbnNNZW51SWRTZXF1ZW5jZSArPSAxO1xuICAgIHJldHVybiBgc2RjLXRhYmxlLWFjdGlvbnMtbWVudS0ke3RoaXMuYWN0aW9uc01lbnVJZFNlcXVlbmNlfWA7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzQ2xvc2VkTWVudVRhcmdldChcbiAgICB0cmlnZ2VyOiBIVE1MRWxlbWVudCxcbiAgICBtZW51SWQ6IHN0cmluZyxcbiAgICBmb2N1c1RhcmdldDogVGFibGVNZW51Rm9jdXNUYXJnZXRcbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0cmlnZ2VyLmlzQ29ubmVjdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZvY3VzVGFyZ2V0ID09PSBUYWJsZU1lbnVGb2N1c1RhcmdldC5UcmlnZ2VyKSB7XG4gICAgICB0cmlnZ2VyLmZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3duZXJEb2N1bWVudCA9IHRyaWdnZXIub3duZXJEb2N1bWVudDtcbiAgICBjb25zdCBtZW51RWxlbWVudCA9IG93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobWVudUlkKTtcbiAgICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGdldEZvY3VzYWJsZUVsZW1lbnRzKG93bmVyRG9jdW1lbnQpLmZpbHRlcigoZWxlbWVudCkgPT4gIW1lbnVFbGVtZW50Py5jb250YWlucyhlbGVtZW50KSk7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gZm9jdXNhYmxlRWxlbWVudHMuaW5kZXhPZih0cmlnZ2VyKTtcblxuICAgIGlmIChjdXJyZW50SW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0SW5kZXggPSBmb2N1c1RhcmdldCA9PT0gVGFibGVNZW51Rm9jdXNUYXJnZXQuTmV4dCA/IGN1cnJlbnRJbmRleCArIDEgOiBjdXJyZW50SW5kZXggLSAxO1xuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gZm9jdXNhYmxlRWxlbWVudHNbdGFyZ2V0SW5kZXhdO1xuXG4gICAgbmV4dEVsZW1lbnQ/LmZvY3VzKCk7XG4gIH1cbn1cbiIsIjxzZWN0aW9uXG4gIGNsYXNzPVwic2RjLXRhYmxlXCJcbiAgW2NsYXNzLnNkYy10YWJsZS1zdGFja109XCJpc01vYmlsZSgpXCJcbiAgW2NsYXNzLnNkYy10YWJsZS1maWx0ZXJlZF09XCIhIWdsb2JhbEZpbHRlcigpLnRyaW0oKVwiXG4gIFtjbGFzcy5zZGMtdGFibGUtLWxvYWRpbmddPVwiaXNMb2FkaW5nXCJcbiAgW2NsYXNzLnNkYy10YWJsZS0taW5pdGlhbC1sb2FkaW5nXT1cInNob3dJbml0aWFsTG9hZGluZygpXCJcbj5cbiAgPHNkYy1sb2FkaW5nLXN0YXRlXG4gICAgY2xhc3M9XCJzZGMtdGFibGUtbG9hZGluZy13cmFwXCJcbiAgICBbbG9hZGluZ109XCJpc0xvYWRpbmdcIlxuICAgIFtibG9ja1dpbmRvd109XCJmYWxzZVwiXG4gICAgW2Jsb2NrRGVsYXlNc109XCIwXCJcbiAgICBbaW5kaWNhdG9yXT1cIidkb3RzJ1wiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXNoZWxsXCIgW3N0eWxlLi0tc2RjLXRhYmxlLWJvZHktaGVpZ2h0LnB4XT1cImJvZHlWaWV3cG9ydEhlaWdodFB4KClcIj5cbiAgICAgIEBpZiAoc2hvd1NlYXJjaCgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtY2FwdGlvblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtY2FwdGlvbl9fc2VhcmNoXCI+XG4gICAgICAgICAgICA8c2RjLXNlYXJjaGJveFxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyKClcIlxuICAgICAgICAgICAgICBbdHJpZ2dlck1vZGVdPVwidHJpZ2dlck1vZGUoKVwiXG4gICAgICAgICAgICAgIChvblNlYXJjaCk9XCJvblNlYXJjaFRlcm0oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvbkNsZWFyKT1cIm9uQ2xlYXJTZWFyY2goKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuc2VhcmNoX2ZpZWxkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgQGlmICghaXNNb2JpbGUoKSkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtc2Nyb2xsXCJcbiAgICAgICAgICBbc3R5bGUuLS1zZGMtdGFibGUtbWluLXdpZHRoXT1cImlzRml0TGF5b3V0KCkgPyAnMTAwJScgOiB0YWJsZU1pbldpZHRoUHgoKSArICdweCdcIlxuICAgICAgICA+XG4gICAgICAgICAgPHRhYmxlXG4gICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1ncmlkXCJcbiAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtZ3JpZC0tZml0XT1cImlzRml0TGF5b3V0KClcIlxuICAgICAgICAgICAgcm9sZT1cInRhYmxlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGFibGVBcmlhTGFiZWxLZXkoKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXJvd2NvdW50XT1cInRvdGFsUmVjb3JkcygpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtYnVzeV09XCJpc0xvYWRpbmdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxjb2xncm91cD5cbiAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxjb2wgW3N0eWxlLndpZHRoXT1cImNvbFdpZHRoU3R5bGUoY29sKVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvY29sZ3JvdXA+XG5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgPHRyIHJvbGU9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiY29sdW1uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10aC1jaGVja2JveF09XCJjb2wudHlwZSA9PT0gJ2NoZWNrYm94LXNlbGVjdGlvbidcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRoLWN1cnJlbmN5XT1cImNvbC50eXBlID09PSAnY3VycmVuY3knXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10aC1idXR0b25dPVwiY29sLnR5cGUgPT09ICdidXR0b24nXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10aC1hY3Rpb25zXT1cImNvbC50eXBlID09PSAnYWN0aW9ucydcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXNvcnRhYmxlXT1cImNhblNvcnRDb2x1bW4oY29sKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtc29ydGFibGUtZGlzYWJsZWRdPVwiaXNTb3J0YWJsZUNvbHVtbihjb2wpICYmICFjYW5Tb3J0Q29sdW1uKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWhlYWRlci1kaXNhYmxlZF09XCIhaGFzRGF0YVJvd3MoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtaXMtc2VsZWN0ZWRdPVwic29ydEZpZWxkKCkgPT09IGNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbkFsaWduQ2xhc3MoY29sLCAnaGVhZGVyJylcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0U29ydEFyaWFBdHRyaWJ1dGUoY29sKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImhhc0RhdGFSb3dzKCkgJiYgY2FuU29ydENvbHVtbihjb2wpID8gMCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIiFoYXNEYXRhUm93cygpIHx8IChpc1NvcnRhYmxlQ29sdW1uKGNvbCkgJiYgIWNhblNvcnRDb2x1bW4oY29sKSkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICBpc1NvcnRhYmxlQ29sdW1uKGNvbClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2wuaGVhZGVyIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyAtICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eS5zb3J0YWJsZV9jb2x1bW4nIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IChjb2wuaGVhZGVyIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFzRGF0YVJvd3MoKSAmJiBjb2wuZmllbGQgPyB0b2dnbGVTb3J0KGNvbC5maWVsZCwgY2FuU29ydENvbHVtbihjb2wpKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJoYXNEYXRhUm93cygpICYmIGNvbC5maWVsZCA/IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBjYW5Tb3J0Q29sdW1uKGNvbCkpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgIGhhc0RhdGFSb3dzKCkgJiYgY29sLmZpZWxkID8gdG9nZ2xlU29ydChjb2wuZmllbGQsIGNhblNvcnRDb2x1bW4oY29sKSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wudHlwZSA9PT0gJ2NoZWNrYm94LXNlbGVjdGlvbicgJiYgKGNlbGxzQ2ZnKCkuY2hlY2tib3guc2VsZWN0QWxsID8/IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS10aC1pbm5lciBzZGMtdGFibGUtdGgtaW5uZXItLWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS10aC1sYWJlbCBzci1vbmx5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3sgY29sLmhlYWRlciB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLXRoLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJnZXRTZWxlY3RBbGxDaGVja2JveElkKCRpbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzUGFnZUZ1bGx5U2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiaXNQYWdlUGFydGlhbGx5U2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNTZWxlY3RhYmxlUGFnZVJvd3MoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RQYWdlKGdldENoZWNrZWRWYWx1ZSgkZXZlbnQpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRvZ2dsZVNlbGVjdFBhZ2UoIWlzUGFnZUZ1bGx5U2VsZWN0ZWQoKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuc2VsZWN0X2FsbF9yb3dzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImdldFBhZ2VTZWxlY3Rpb25BcmlhQ2hlY2tlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwiZ2V0U2VsZWN0QWxsQ2hlY2tib3hJZCgkaW5kZXgpXCIgY2xhc3M9XCJzci1vbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuc2VsZWN0X2FsbF9yb3dzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXRoLWlubmVyXCIgW2NsYXNzLnNkYy10YWJsZS10aC1pbm5lci0tc29ydGFibGVdPVwiaXNTb3J0YWJsZUNvbHVtbihjb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS10aC1sYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt7IGNvbC5oZWFkZXIgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLXNvcnQtb3ZlcmxheVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLXNvcnQtaW5kaWNhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbkZpZWxkXT1cImNvbC5maWVsZCB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uVHlwZV09XCJjb2wudHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRhYmxlXT1cImlzU29ydGFibGVDb2x1bW4oY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRGaWVsZF09XCJzb3J0RmllbGQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRPcmRlcl09XCJzb3J0T3JkZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1zb3J0LWluZGljYXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuXG4gICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgIEBpZiAoc2hvd0luaXRpYWxMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgICAgICBAZm9yIChyb3dJbmRleCBvZiBpbml0aWFsTG9hZGluZ1Jvd3MoKTsgdHJhY2sgcm93SW5kZXg7IGxldCByID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJzZGMtdGFibGUtaW5pdGlhbC1sb2FkaW5nLXJvd1wiIHJvbGU9XCJyb3dcIiBbYXR0ci5hcmlhLXJvd2luZGV4XT1cInIgKyAxXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLXRkIHNkYy10YWJsZS10ZGMgc2RjLXRhYmxlLXRkLS1pbml0aWFsLWxvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1jaGVja2JveF09XCJjb2wudHlwZSA9PT0gJ2NoZWNrYm94LXNlbGVjdGlvbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1jdXJyZW5jeV09XCJjb2wudHlwZSA9PT0gJ2N1cnJlbmN5J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWJ1dHRvbl09XCJjb2wudHlwZSA9PT0gJ2J1dHRvbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1hY3Rpb25zXT1cImNvbC50eXBlID09PSAnYWN0aW9ucydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uQWxpZ25DbGFzcyhjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGl0bGVdPVwiY29sLmhlYWRlciB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS10ZC12YWwgc2RjLXRhYmxlLXRkLXZhbC0taW5pdGlhbC1sb2FkaW5nXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBwYWdlRGF0YSgpOyB0cmFjayAkaW5kZXg7IGxldCByID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICA8dHIgcm9sZT1cInJvd1wiIFthdHRyLmFyaWEtcm93aW5kZXhdPVwiciArIDFcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtdGQgc2RjLXRhYmxlLXRkY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWNoZWNrYm94XT1cImNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWN1cnJlbmN5XT1cImNvbC50eXBlID09PSAnY3VycmVuY3knXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtYnV0dG9uXT1cImNvbC50eXBlID09PSAnYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWFjdGlvbnNdPVwiY29sLnR5cGUgPT09ICdhY3Rpb25zJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWlzLXNlbGVjdGVkXT1cInNvcnRGaWVsZCgpID09PSBjb2wuZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uQWxpZ25DbGFzcyhjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGl0bGVdPVwiY29sLmhlYWRlciB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJjb2wuY29sSWQgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wuY2VsbFRhZyA9PT0gJ3NwYW4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLXRkLXZhbFwiIFtuZ1N0eWxlXT1cImNvbC5jZWxsU3R5bGVcIiBbYXR0ci5pZF09XCJyZXNvbHZlQ2VsbElkKGNvbCwgcm93KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2VsbENvbmZpZ3NdPVwiY2VsbHNDZmcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzb2x2ZVZhbHVlXT1cInJlc29sdmVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93Q2hlY2tib3hJZF09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0xhYmVsXT1cImdldFJvd0NoZWNrYm94TGFiZWwocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0aW9uRGlzYWJsZWRdPVwiaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51SWRdPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpID8gb3Blbk1lbnVTdGF0ZSgpPy5tZW51SWQgPz8gbnVsbCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY29sLCAkZXZlbnQudHJpZ2dlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGNvbC5jZWxsVGFnID09PSAnaScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsXCIgW25nU3R5bGVdPVwiY29sLmNlbGxTdHlsZVwiIFthdHRyLmlkXT1cInJlc29sdmVDZWxsSWQoY29sLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xdPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3Rpb25EaXNhYmxlZF09XCJpc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkgPyBvcGVuTWVudVN0YXRlKCk/Lm1lbnVJZCA/PyBudWxsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoY29sLmNlbGxUYWcgPT09ICdwJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInNkYy10YWJsZS10ZC12YWxcIiBbbmdTdHlsZV09XCJjb2wuY2VsbFN0eWxlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbkRpc2FibGVkXT1cImlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKSA/IG9wZW5NZW51U3RhdGUoKT8ubWVudUlkID8/IG51bGwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS10ZC12YWxcIiBbbmdTdHlsZV09XCJjb2wuY2VsbFN0eWxlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbkRpc2FibGVkXT1cImlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKSA/IG9wZW5NZW51U3RhdGUoKT8ubWVudUlkID8/IG51bGwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICA8L3RhYmxlPlxuXG4gICAgICAgICAgQGlmICghaXNMb2FkaW5nICYmIG9wdGlvbnMoKS5lbXB0eT8uc2hvdyAhPT0gZmFsc2UgJiYgdG90YWxSZWNvcmRzKCkgPT09IDApIHtcbiAgICAgICAgICAgIDxzZGMtZW1wdHktc3RhdGVcbiAgICAgICAgICAgICAgaWQ9XCJteS1lbXB0eS1zdGF0ZVwiXG4gICAgICAgICAgICAgIGljb25DbGFzcz1cImZhIGZhLWluYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cImVtcHR5VGl0bGUoKVwiXG4gICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCJlbXB0eVRleHQoKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHQucHhdPVwiZW1wdHlCb2R5SGVpZ2h0UHgoKVwiXG4gICAgICAgICAgICA+PC9zZGMtZW1wdHktc3RhdGU+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2UgaWYgKG1vYmlsZU1vZGUoKSA9PT0gJ3N0YWNrZWQnKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtbGlzdFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0YWJsZUFyaWFMYWJlbEtleSgpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWJ1c3ldPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgIEBpZiAoc2hvd0luaXRpYWxMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIEBmb3IgKHJvd0luZGV4IG9mIGluaXRpYWxMb2FkaW5nUm93cygpOyB0cmFjayByb3dJbmRleDsgbGV0IHIgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtY2FyZCBzZGMtdGFibGUtbW9iaWxlLWNhcmQtLWxvYWRpbmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1maWVsZCBzZGMtdGFibGUtbW9iaWxlLWZpZWxkLS1sb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWxhYmVsIHNkYy10YWJsZS1tb2JpbGUtbGFiZWwtLWxvYWRpbmdcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtc2tlbGV0b25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICBAZm9yIChyb3cgb2YgcGFnZURhdGEoKTsgdHJhY2sgJGluZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1jYXJkXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLW1vYmlsZS1maWVsZC0tZnVsbC13aWR0aF09XCJcbiAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PT0gJ2J1dHRvbicgfHwgY29sLnR5cGUgPT09ICdhY3Rpb25zJyB8fCBjb2wudHlwZSA9PT0gJ2NoZWNrYm94LXNlbGVjdGlvbidcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1tb2JpbGUtZmllbGQtLXNlbGVjdGVkXT1cInNvcnRGaWVsZCgpID09PSBjb2wuZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLW1vYmlsZS1maWVsZC0tc29ydGFibGVdPVwiY29sLmZpZWxkICYmIGlzU29ydGFibGVDb2x1bW4oY29sKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb2wuZmllbGQgJiYgdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKG1vYmlsZUZpZWxkTGFiZWwoY29sKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWxhYmVsLXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLmZpZWxkICYmIGlzU29ydGFibGVDb2x1bW4oY29sKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWxhYmVsIHNkYy10YWJsZS1tb2JpbGUtbGFiZWwtLXNvcnRhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vYmlsZUZpZWxkTGFiZWwoY29sKSB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnIC0gJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eS5zb3J0YWJsZV9jb2x1bW4nIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInRvZ2dsZVNvcnQoY29sLmZpZWxkLCBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgbW9iaWxlRmllbGRMYWJlbChjb2wpIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtc29ydC1pbmRpY2F0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5GaWVsZF09XCJjb2wuZmllbGQgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uVHlwZV09XCJjb2wudHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydGFibGVdPVwiaXNTb3J0YWJsZUNvbHVtbihjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0RmllbGRdPVwic29ydEZpZWxkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRPcmRlcl09XCJzb3J0T3JkZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLXNvcnQtaW5kaWNhdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IG1vYmlsZUZpZWxkTGFiZWwoY29sKSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS12YWx1ZVwiIFthdHRyLmlkXT1cInJlc29sdmVDZWxsSWQoY29sLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JjZUxlZnRBbGlnbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xdPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3Rpb25EaXNhYmxlZF09XCJpc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkgPyBvcGVuTWVudVN0YXRlKCk/Lm1lbnVJZCA/PyBudWxsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmICghaXNMb2FkaW5nICYmIG9wdGlvbnMoKS5lbXB0eT8uc2hvdyAhPT0gZmFsc2UgJiYgdG90YWxSZWNvcmRzKCkgPT09IDApIHtcbiAgICAgICAgICA8c2RjLWVtcHR5LXN0YXRlXG4gICAgICAgICAgICBpZD1cIm15LWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgIGljb25DbGFzcz1cImZhIGZhLWluYm94XCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJlbXB0eVRpdGxlKClcIlxuICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImVtcHR5VGV4dCgpXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgIFtzdHlsZS5taW4taGVpZ2h0LnB4XT1cImVtcHR5Qm9keUhlaWdodFB4KClcIlxuICAgICAgICAgID48L3NkYy1lbXB0eS1zdGF0ZT5cbiAgICAgICAgfVxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDx1bFxuICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtbGlzdFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0YWJsZUFyaWFMYWJlbEtleSgpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWJ1c3ldPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgIEBpZiAoc2hvd0luaXRpYWxMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIEBmb3IgKHJvd0luZGV4IG9mIGluaXRpYWxMb2FkaW5nUm93cygpOyB0cmFjayByb3dJbmRleCkge1xuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1pdGVtIHNkYy10YWJsZS1leHBhbmRhYmxlLWl0ZW0tLWxvYWRpbmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtc3VtbWFyeSBzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5LS1sb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtc3VtbWFyeS1maWVsZHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtc2tlbGV0b24gc2RjLXRhYmxlLWV4cGFuZGFibGUtc2tlbGV0b24tcHJpbWFyeVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1za2VsZXRvbiBzZGMtdGFibGUtZXhwYW5kYWJsZS1za2VsZXRvbi1zZWNvbmRhcnlcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1jaGV2cm9uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93blwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBwYWdlRGF0YSgpOyB0cmFjayAkaW5kZXg7IGxldCByID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtaXRlbVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1leHBhbmRhYmxlLWl0ZW0tLWV4cGFuZGVkXT1cImlzUm93RXhwYW5kZWQocilcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5XCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVFeHBhbmRSb3cocilcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwidG9nZ2xlRXhwYW5kUm93KHIpXCJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB0b2dnbGVFeHBhbmRSb3cocilcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEBpZiAoY2hlY2tib3hDb2woKTsgYXMgY2JDb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZvcmNlTGVmdEFsaWduXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjYkNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2VsbENvbmZpZ3NdPVwiY2VsbHNDZmcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVzb2x2ZVZhbHVlXT1cInJlc29sdmVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93Q2hlY2tib3hJZF09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0xhYmVsXT1cImdldFJvd0NoZWNrYm94TGFiZWwocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0aW9uRGlzYWJsZWRdPVwiaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjYkNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY2JDb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtc3VtbWFyeS1maWVsZHNcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIHN1bW1hcnlDb2xzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5LWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLXN1bW1hcnktbGFiZWxcIj57eyBtb2JpbGVGaWVsZExhYmVsKGNvbCkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtc3VtbWFyeS12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JjZUxlZnRBbGlnbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzb2x2ZVZhbHVlXT1cInJlc29sdmVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0aW9uRGlzYWJsZWRdPVwiaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLXRvZ2dsZVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNSb3dFeHBhbmRlZChyKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgaXNSb3dFeHBhbmRlZChyKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHkuY29sbGFwc2Vfcm93JyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKCdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5LmV4cGFuZF9yb3cnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVFeHBhbmRSb3cocilcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHRvZ2dsZUV4cGFuZFJvdyhyKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHRvZ2dsZUV4cGFuZFJvdyhyKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1jaGV2cm9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWV4cGFuZGFibGUtY2hldnJvbi0tb3Blbl09XCJpc1Jvd0V4cGFuZGVkKHIpXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICA+PGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duXCI+PC9pPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIEBpZiAoaXNSb3dFeHBhbmRlZChyKSkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLnR5cGUgIT09ICdjaGVja2JveC1zZWxlY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWV4cGFuZGFibGUtZmllbGQtLWZ1bGwtd2lkdGhdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT09ICdidXR0b24nIHx8IGNvbC50eXBlID09PSAnYWN0aW9ucydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wudHlwZSAhPT0gJ2J1dHRvbicgJiYgY29sLnR5cGUgIT09ICdhY3Rpb25zJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1sYWJlbC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLWxhYmVsXCI+e3sgbW9iaWxlRmllbGRMYWJlbChjb2wpIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS12YWx1ZVwiIFthdHRyLmlkXT1cInJlc29sdmVDZWxsSWQoY29sLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JjZUxlZnRBbGlnbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xdPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3Rpb25EaXNhYmxlZF09XCJpc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkgPyBvcGVuTWVudVN0YXRlKCk/Lm1lbnVJZCA/PyBudWxsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvdWw+XG5cbiAgICAgICAgQGlmICghaXNMb2FkaW5nICYmIG9wdGlvbnMoKS5lbXB0eT8uc2hvdyAhPT0gZmFsc2UgJiYgdG90YWxSZWNvcmRzKCkgPT09IDApIHtcbiAgICAgICAgICA8c2RjLWVtcHR5LXN0YXRlXG4gICAgICAgICAgICBpZD1cIm15LWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgIGljb25DbGFzcz1cImZhIGZhLWluYm94XCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJlbXB0eVRpdGxlKClcIlxuICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImVtcHR5VGV4dCgpXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgIFtzdHlsZS5taW4taGVpZ2h0LnB4XT1cImVtcHR5Qm9keUhlaWdodFB4KClcIlxuICAgICAgICAgID48L3NkYy1lbXB0eS1zdGF0ZT5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBAaWYgKHNob3dQYWdpbmF0b3IoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXBhZ2luYXRvclwiPlxuICAgICAgICAgIDxzZGMtcGFnaW5hdG9yXG4gICAgICAgICAgICBbZmlyc3RdPVwiZmlyc3QoKVwiXG4gICAgICAgICAgICBbcm93c109XCJyb3dzKClcIlxuICAgICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJ0b3RhbFJlY29yZHMoKVwiXG4gICAgICAgICAgICBbcm93c1BlclBhZ2VPcHRpb25zXT1cImlzTW9iaWxlKCkgPyBbXSA6IHJvd3NQZXJQYWdlT3B0aW9ucygpXCJcbiAgICAgICAgICAgIFtpc01vYmlsZV09XCJpc01vYmlsZSgpXCJcbiAgICAgICAgICAgIFt0b3RhbFJlY29yZHNMYWJlbF09XCJ0b3RhbFJlY29yZHNMYWJlbCgpXCJcbiAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9zZGMtcGFnaW5hdG9yPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9zZGMtbG9hZGluZy1zdGF0ZT5cbjwvc2VjdGlvbj5cblxuQGlmIChvcGVuTWVudVN0YXRlKCk7IGFzIG1lbnUpIHtcbiAgPHNkYy10YWJsZS1hY3Rpb25zLW1lbnVcbiAgICBbaXRlbXNdPVwibWVudS5pdGVtc1wiXG4gICAgW21lbnVJZF09XCJtZW51Lm1lbnVJZFwiXG4gICAgW3RvcF09XCJtZW51LnRvcFwiXG4gICAgW2xlZnRdPVwibWVudS5sZWZ0XCJcbiAgICBbd2lkdGhdPVwibWVudS53aWR0aFwiXG4gICAgKGNsb3NlKT1cIm9uTWVudUNsb3NlKCRldmVudClcIlxuICAgIChzZWxlY3QpPVwib25Qb3J0YWxBY3Rpb25DbGljaygkZXZlbnQpXCJcbiAgPjwvc2RjLXRhYmxlLWFjdGlvbnMtbWVudT5cbn1cbiJdfQ==