@coolon/angular-ui-powerups 16.1.0-alpha.238 → 16.1.0-aplpha.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 (400) hide show
  1. package/assets/activities/activities.scss +6 -8
  2. package/assets/activities/input-activities.scss +6 -14
  3. package/assets/form.scss +23 -77
  4. package/assets/icons.scss +1 -2
  5. package/assets/interaction/editor/inline-string-editor.scss +0 -4
  6. package/assets/interaction.scss +1 -1
  7. package/assets/styles.scss +0 -4
  8. package/assets/table.scss +31 -84
  9. package/assets/tabs.scss +2 -15
  10. package/esm2022/lib/angular-ui-powerups.module.mjs +9 -9
  11. package/esm2022/lib/animations/slide-animations.mjs +10 -15
  12. package/esm2022/lib/components/alignment.mjs +1 -1
  13. package/esm2022/lib/components/busy-overlay/busy-overlay.component.mjs +12 -7
  14. package/esm2022/lib/components/cards/abstract-card-container.component.mjs +7 -31
  15. package/esm2022/lib/components/cards/card-container/card-container.component.mjs +6 -6
  16. package/esm2022/lib/components/cards/card-stack/card-stack.component.mjs +81 -0
  17. package/esm2022/lib/components/commands/command/command.component.mjs +33 -35
  18. package/esm2022/lib/components/commands/command-face/command-face.component.mjs +5 -13
  19. package/esm2022/lib/components/commands/command-face.mjs +11 -12
  20. package/esm2022/lib/components/commands/flex.component.mjs +4 -4
  21. package/esm2022/lib/components/commands/group/command-container.mjs +1 -1
  22. package/esm2022/lib/components/commands/group/popup-aware.component.mjs +8 -31
  23. package/esm2022/lib/components/commands/group/popup-container.mjs +1 -1
  24. package/esm2022/lib/components/commands/group/popup-menu/abstract-popup-menu.component.mjs +25 -27
  25. package/esm2022/lib/components/commands/group/popup-menu/more-menu.component.mjs +24 -15
  26. package/esm2022/lib/components/commands/group/popup-menu/popup-menu-renderer/popup-menu-renderer.component.mjs +12 -18
  27. package/esm2022/lib/components/commands/group/popup-menu/popup-menu.component.mjs +23 -14
  28. package/esm2022/lib/components/commands/group/tool-bar/tool-bar.component.mjs +19 -12
  29. package/esm2022/lib/components/commands/separator.component.mjs +14 -8
  30. package/esm2022/lib/components/components.module.mjs +58 -73
  31. package/esm2022/lib/components/disposable-component.mjs +40 -74
  32. package/esm2022/lib/components/empty-state/empty-state.component.mjs +9 -5
  33. package/esm2022/lib/components/exports.mjs +12 -16
  34. package/esm2022/lib/components/focus-container/focus-container.component.mjs +4 -4
  35. package/esm2022/lib/components/focusable.component.mjs +5 -5
  36. package/esm2022/lib/components/forms/abstract-input.component.mjs +18 -67
  37. package/esm2022/lib/components/forms/abstract-list-input.component.mjs +4 -4
  38. package/esm2022/lib/components/forms/abstract-value-input.component.mjs +4 -4
  39. package/esm2022/lib/components/forms/autocomplete-input/autocomplete-input.component.mjs +15 -18
  40. package/esm2022/lib/components/forms/checkbox-input/checkbox-input.component.mjs +8 -10
  41. package/esm2022/lib/components/forms/multiple-select-input/multiple-select-input.component.mjs +11 -12
  42. package/esm2022/lib/components/forms/number-input/number-input.component.mjs +13 -94
  43. package/esm2022/lib/components/forms/password-input/password-input.component.mjs +7 -44
  44. package/esm2022/lib/components/forms/select-input/select-input.component.mjs +19 -21
  45. package/esm2022/lib/components/forms/string-input/string-input.component.mjs +16 -35
  46. package/esm2022/lib/components/forms/text-input/text-input.component.mjs +8 -12
  47. package/esm2022/lib/components/icon/icon.component.mjs +7 -10
  48. package/esm2022/lib/components/labelled-value/labelled-value.component.mjs +4 -4
  49. package/esm2022/lib/components/loading-container/loading-container.component.mjs +12 -7
  50. package/esm2022/lib/components/noop/noop.component.mjs +7 -5
  51. package/esm2022/lib/components/resize-aware.component.mjs +27 -64
  52. package/esm2022/lib/components/scroll-container/scroll-container.component.mjs +5 -5
  53. package/esm2022/lib/components/section-header/section-header.component.mjs +4 -4
  54. package/esm2022/lib/components/switch-case/switch-case.component.mjs +17 -15
  55. package/esm2022/lib/components/tables/abstract-table-model.mjs +113 -116
  56. package/esm2022/lib/components/tables/abstract-table.component.mjs +8 -23
  57. package/esm2022/lib/components/tables/column/column-list-model.mjs +44 -0
  58. package/esm2022/lib/components/tables/column/column-model.mjs +23 -20
  59. package/esm2022/lib/components/tables/column/column-template/column-template.directive.mjs +4 -5
  60. package/esm2022/lib/components/tables/column/custom-template-column-model.mjs +3 -4
  61. package/esm2022/lib/components/tables/column/custom-value-column-model.mjs +5 -5
  62. package/esm2022/lib/components/tables/column/editor-controls-column-model.mjs +21 -0
  63. package/esm2022/lib/components/tables/column/list-propery-column-model.mjs +21 -8
  64. package/esm2022/lib/components/tables/column/property-column-model.mjs +20 -7
  65. package/esm2022/lib/components/tables/column/selection-column-model.mjs +13 -35
  66. package/esm2022/lib/components/tables/editor/edit-row-controls/edit-row-controls.component.mjs +60 -0
  67. package/esm2022/lib/components/tables/editor/edit-session.mjs +26 -0
  68. package/esm2022/lib/components/tables/editor/editable-cell-renderer.mjs +2 -0
  69. package/esm2022/lib/components/tables/filter/column-text-search-formatter.mjs +1 -1
  70. package/esm2022/lib/components/tables/filter/enable-cell-text-search.decorator.mjs +2 -3
  71. package/esm2022/lib/components/tables/filter/table-filter-model.mjs +12 -16
  72. package/esm2022/lib/components/tables/filter/text-search-predicate.mjs +2 -17
  73. package/esm2022/lib/components/tables/paginator/paginator.component.mjs +5 -5
  74. package/esm2022/lib/components/tables/renderer/cell-editors.mjs +2 -0
  75. package/esm2022/lib/components/tables/renderer/cell-portal-ref.mjs +26 -22
  76. package/esm2022/lib/components/tables/renderer/default-cell-renderer/default-cell-renderer.component.mjs +8 -6
  77. package/esm2022/lib/components/tables/renderer/default-header-cell-renderer/default-header-cell-renderer.component.mjs +7 -5
  78. package/esm2022/lib/components/tables/renderer/select-header-cell/selection-header-cell.component.mjs +8 -19
  79. package/esm2022/lib/components/tables/renderer/selection-cell/selection-cell.component.mjs +9 -18
  80. package/esm2022/lib/components/tables/renderer/table-body/table-body.component.mjs +53 -266
  81. package/esm2022/lib/components/tables/renderer/table-cell/table-cell.component.mjs +50 -9
  82. package/esm2022/lib/components/tables/renderer/table-header-cell/table-header-cell.component.mjs +7 -5
  83. package/esm2022/lib/components/tables/renderer/table-more-menu/table-more-menu-popup/table-more-menu-popup.component.mjs +33 -0
  84. package/esm2022/lib/components/tables/renderer/table-more-menu/table-more-menu.component.mjs +60 -0
  85. package/esm2022/lib/components/tables/table/table-model.mjs +35 -18
  86. package/esm2022/lib/components/tables/table/table.component.mjs +64 -42
  87. package/esm2022/lib/components/tables/table-row-menu/table-row-menu.component.mjs +84 -0
  88. package/esm2022/lib/components/tables/tree-table/decorated-tree-node.mjs +4 -5
  89. package/esm2022/lib/components/tables/tree-table/flattened-tree-list-model.mjs +1 -1
  90. package/esm2022/lib/components/tables/tree-table/tree-expansion-model.mjs +1 -1
  91. package/esm2022/lib/components/tables/tree-table/tree-inheritance-icon/tree-inheritance-icon.component.mjs +7 -5
  92. package/esm2022/lib/components/tables/tree-table/tree-label-cell-renderer/tree-label-cell-renderer.component.mjs +6 -6
  93. package/esm2022/lib/components/tables/tree-table/tree-label-column-model.mjs +4 -4
  94. package/esm2022/lib/components/tables/tree-table/tree-table-component.mjs +8 -15
  95. package/esm2022/lib/components/tables/tree-table/tree-table-model.mjs +7 -4
  96. package/esm2022/lib/components/text/markdown/markdown.component.mjs +6 -6
  97. package/esm2022/lib/components/track.mjs +1 -1
  98. package/esm2022/lib/components/types/bounds.class.mjs +1 -1
  99. package/esm2022/lib/components/types/loadable.mjs +2 -0
  100. package/esm2022/lib/components/vertical-focus-container/vertical-focus-container.component.mjs +4 -4
  101. package/esm2022/lib/directives/command.directive.mjs +14 -26
  102. package/esm2022/lib/directives/directives.module.mjs +10 -10
  103. package/esm2022/lib/directives/exports.mjs +1 -2
  104. package/esm2022/lib/directives/focus-binding-factory.mjs +4 -5
  105. package/esm2022/lib/directives/focus-binding.directive.mjs +5 -5
  106. package/esm2022/lib/directives/focus-binding.mjs +2 -22
  107. package/esm2022/lib/directives/garbage-collector.directive.mjs +4 -5
  108. package/esm2022/lib/directives/highlight-text-model.directive.mjs +4 -4
  109. package/esm2022/lib/directives/highlight.pipe.mjs +13 -22
  110. package/esm2022/lib/interaction/abstract-interaction-context.mjs +8 -6
  111. package/esm2022/lib/interaction/activity-ref.mjs +2 -2
  112. package/esm2022/lib/interaction/activity.mjs +23 -24
  113. package/esm2022/lib/interaction/alert.mjs +2 -2
  114. package/esm2022/lib/interaction/components/abstract-confirm-dialog.component.mjs +10 -14
  115. package/esm2022/lib/interaction/components/abstract-dialog.component.mjs +45 -5
  116. package/esm2022/lib/interaction/components/activity-actions/activity-actions.component.mjs +17 -30
  117. package/esm2022/lib/interaction/components/activity-body/activity-body.component.mjs +4 -10
  118. package/esm2022/lib/interaction/components/activity-container/activity-container.component.mjs +25 -119
  119. package/esm2022/lib/interaction/components/activity-container/activity-outlet/activity-outlet.component.mjs +19 -55
  120. package/esm2022/lib/interaction/components/activity-title/activity-title.component.mjs +6 -6
  121. package/esm2022/lib/interaction/components/activity-triggers/abstract-activity-trigger.component.mjs +4 -5
  122. package/esm2022/lib/interaction/components/activity-triggers/inline-activity-trigger/inline-activity-trigger.component.mjs +4 -5
  123. package/esm2022/lib/interaction/components/activity-triggers/modal-activity-trigger/modal-activity-trigger.component.mjs +4 -5
  124. package/esm2022/lib/interaction/components/activity-triggers/popup-activity-trigger/popup-activity-trigger.component.mjs +4 -5
  125. package/esm2022/lib/interaction/components/add-card-activity/add-card-activity.component.mjs +4 -4
  126. package/esm2022/lib/interaction/components/add-item-interaction-context/add-item-interaction-context.component.mjs +4 -5
  127. package/esm2022/lib/interaction/components/alert-dialog/alert-dialog.component.mjs +12 -12
  128. package/esm2022/lib/interaction/components/confirm-then-dialog/confirm-then-dialog.component.mjs +10 -6
  129. package/esm2022/lib/interaction/components/confirm-then-execute-dialog/confirm-then-execute-dialog.component.mjs +10 -6
  130. package/esm2022/lib/interaction/components/confirmation-dialog/confirmation-dialog.component.mjs +11 -9
  131. package/esm2022/lib/interaction/components/editors/edit-context.mjs +1 -1
  132. package/esm2022/lib/interaction/components/editors/inline-string-editor/inline-editor-model.mjs +2 -2
  133. package/esm2022/lib/interaction/components/editors/inline-string-editor/inline-string-editor.component.mjs +13 -13
  134. package/esm2022/lib/interaction/components/inplace-interaction-context/in-place-interaction-context.component.mjs +9 -25
  135. package/esm2022/lib/interaction/components/input-activities/input-activity.mjs +5 -6
  136. package/esm2022/lib/interaction/components/input-activities/select-input-activity.mjs +38 -44
  137. package/esm2022/lib/interaction/components/input-activities/string-input-activity.mjs +12 -14
  138. package/esm2022/lib/interaction/components/popup-interaction-context/popup-interaction-context.component.mjs +5 -6
  139. package/esm2022/lib/interaction/confirm.mjs +2 -26
  140. package/esm2022/lib/interaction/directives/interaction-context-trigger-for.directive.mjs +6 -6
  141. package/esm2022/lib/interaction/exports.mjs +1 -6
  142. package/esm2022/lib/interaction/in-place-interaction-context.mjs +1 -1
  143. package/esm2022/lib/interaction/interaction-context.mjs +2 -3
  144. package/esm2022/lib/interaction/interaction.module.mjs +36 -44
  145. package/esm2022/lib/interaction/route-synchronisation-adapter.mjs +1 -1
  146. package/esm2022/lib/interaction/services/interaction-service-routing-adapter.mjs +4 -4
  147. package/esm2022/lib/interaction/services/interaction.service.mjs +10 -23
  148. package/esm2022/lib/interaction/services/mat-dialog-interaction/dialog-interaction-context-factory.mjs +10 -16
  149. package/esm2022/lib/interaction/services/mat-dialog-interaction/dialog-interaction-context.mjs +5 -29
  150. package/esm2022/lib/interaction/services/modal-interaction-context.factory.mjs +1 -1
  151. package/esm2022/lib/place/components/abstract-place-navigation.component.mjs +5 -15
  152. package/esm2022/lib/place/components/list-place-nav/list-place-nav.component.mjs +9 -8
  153. package/esm2022/lib/place/components/not-authorised-notice/not-authorised-notice.component.mjs +7 -5
  154. package/esm2022/lib/place/components/place-outlet/place-outlet.component.mjs +21 -23
  155. package/esm2022/lib/place/components/place-outlet/route-animations.mjs +1 -1
  156. package/esm2022/lib/place/components/side-place-navigation/side-place-navigation.component.mjs +11 -19
  157. package/esm2022/lib/place/components/tabbed-place-navigation/tabbed-place-navigation.component.mjs +7 -7
  158. package/esm2022/lib/place/guards/consolidated-param-map.mjs +4 -4
  159. package/esm2022/lib/place/guards/noop-auth-guard.service.mjs +7 -5
  160. package/esm2022/lib/place/guards/place.guard.mjs +14 -30
  161. package/esm2022/lib/place/navigation/place-component-deactivation-handler.mjs +2 -2
  162. package/esm2022/lib/place/navigation/session/abstract-pop-state-navigation.mjs +1 -1
  163. package/esm2022/lib/place/navigation/session/event-cleanup/event-clean-up-session.mjs +1 -1
  164. package/esm2022/lib/place/navigation/session/event-cleanup/wait-until-leaving-interaction-transition-cancelled.mjs +1 -1
  165. package/esm2022/lib/place/navigation/session/event-cleanup/wait-until-link-triggered-navigation-interaction-cancelation-type-determined.mjs +1 -1
  166. package/esm2022/lib/place/navigation/session/event-cleanup/wait-until-popstate-during-can-deactivate-transition-finishes.mjs +1 -1
  167. package/esm2022/lib/place/navigation/session/interactions/navigating-during-interaction.mjs +2 -2
  168. package/esm2022/lib/place/navigation/session/interactions/pop-state-during-interaction-navigation.mjs +1 -1
  169. package/esm2022/lib/place/navigation/session/interactions/remove-last-interaction-from-url-navigation-session.mjs +4 -39
  170. package/esm2022/lib/place/navigation/session/interactions/synchronise-interaction-context-ids-with-route.mjs +9 -9
  171. package/esm2022/lib/place/navigation/session/navigating.mjs +2 -2
  172. package/esm2022/lib/place/navigation/session/navigation-context.mjs +1 -1
  173. package/esm2022/lib/place/navigation/session/navigation-session.mjs +2 -11
  174. package/esm2022/lib/place/navigation/session/pop-state-navigation.mjs +1 -1
  175. package/esm2022/lib/place/place-access-guard.mjs +1 -1
  176. package/esm2022/lib/place/place-auth-service.mjs +7 -8
  177. package/esm2022/lib/place/place-component.mjs +79 -82
  178. package/esm2022/lib/place/place-config.mjs +1 -1
  179. package/esm2022/lib/place/place-definition.mjs +5 -18
  180. package/esm2022/lib/place/place-history.mjs +8 -17
  181. package/esm2022/lib/place/place-router.mjs +70 -191
  182. package/esm2022/lib/place/place.decorator.mjs +3 -4
  183. package/esm2022/lib/place/place.module.mjs +17 -17
  184. package/esm2022/lib/place/route/formatter.mjs +2 -2
  185. package/esm2022/lib/place/route/json-types.mjs +1 -1
  186. package/esm2022/lib/place/route/parameter-decorators.mjs +51 -55
  187. package/esm2022/lib/place/route/parameter-definition.mjs +2 -6
  188. package/esm2022/lib/place/route/parameter-sanitiser.mjs +2 -7
  189. package/esm2022/lib/place/route/parameter-snapshot.mjs +1 -1
  190. package/esm2022/lib/place/route/visit-segment-sanitiser.mjs +1 -1
  191. package/esm2022/lib/place/url-service.mjs +4 -4
  192. package/esm2022/lib/place/url-snapshot.mjs +3 -3
  193. package/esm2022/lib/place/visit-segment.mjs +2 -3
  194. package/esm2022/lib/place/visit.mjs +5 -5
  195. package/esm2022/lib/services/markdown/markdown.service.mjs +7 -5
  196. package/esm2022/lib/services/markdown/pill-plugin.mjs +3 -1
  197. package/esm2022/lib/services/visibility-service.mjs +7 -7
  198. package/fesm2022/coolon-angular-ui-powerups.mjs +3634 -5281
  199. package/fesm2022/coolon-angular-ui-powerups.mjs.map +1 -1
  200. package/lib/angular-ui-powerups.module.d.ts +5 -5
  201. package/lib/animations/slide-animations.d.ts +0 -1
  202. package/lib/components/busy-overlay/busy-overlay.component.d.ts +4 -1
  203. package/lib/components/cards/abstract-card-container.component.d.ts +3 -6
  204. package/lib/components/cards/card-container/card-container.component.d.ts +1 -1
  205. package/lib/components/cards/card-stack/card-stack.component.d.ts +68 -0
  206. package/lib/components/commands/command/command.component.d.ts +10 -9
  207. package/lib/components/commands/command-face/command-face.component.d.ts +0 -2
  208. package/lib/components/commands/command-face.d.ts +9 -8
  209. package/lib/components/commands/group/popup-aware.component.d.ts +5 -10
  210. package/lib/components/commands/group/popup-container.d.ts +1 -1
  211. package/lib/components/commands/group/popup-menu/abstract-popup-menu.component.d.ts +6 -6
  212. package/lib/components/commands/group/popup-menu/more-menu.component.d.ts +4 -2
  213. package/lib/components/commands/group/popup-menu/popup-menu-renderer/popup-menu-renderer.component.d.ts +2 -4
  214. package/lib/components/commands/group/popup-menu/popup-menu.component.d.ts +4 -2
  215. package/lib/components/commands/group/tool-bar/tool-bar.component.d.ts +7 -3
  216. package/lib/components/commands/separator.component.d.ts +4 -2
  217. package/lib/components/components.module.d.ts +30 -33
  218. package/lib/components/disposable-component.d.ts +9 -26
  219. package/lib/components/empty-state/empty-state.component.d.ts +4 -1
  220. package/lib/components/exports.d.ts +11 -15
  221. package/lib/components/forms/abstract-input.component.d.ts +7 -16
  222. package/lib/components/forms/abstract-list-input.component.d.ts +1 -1
  223. package/lib/components/forms/abstract-value-input.component.d.ts +1 -1
  224. package/lib/components/forms/autocomplete-input/autocomplete-input.component.d.ts +2 -2
  225. package/lib/components/forms/checkbox-input/checkbox-input.component.d.ts +0 -2
  226. package/lib/components/forms/number-input/number-input.component.d.ts +4 -16
  227. package/lib/components/forms/password-input/password-input.component.d.ts +1 -7
  228. package/lib/components/forms/select-input/select-input.component.d.ts +3 -4
  229. package/lib/components/forms/string-input/string-input.component.d.ts +1 -7
  230. package/lib/components/forms/text-input/text-input.component.d.ts +0 -3
  231. package/lib/components/loading-container/loading-container.component.d.ts +4 -1
  232. package/lib/components/noop/noop.component.d.ts +1 -0
  233. package/lib/components/resize-aware.component.d.ts +7 -26
  234. package/lib/components/switch-case/switch-case.component.d.ts +7 -6
  235. package/lib/components/tables/abstract-table-model.d.ts +37 -51
  236. package/lib/components/tables/abstract-table.component.d.ts +7 -8
  237. package/lib/components/tables/column/column-list-model.d.ts +13 -0
  238. package/lib/components/tables/column/column-model.d.ts +17 -14
  239. package/lib/components/tables/column/custom-template-column-model.d.ts +2 -3
  240. package/lib/components/tables/column/custom-value-column-model.d.ts +3 -4
  241. package/lib/components/tables/column/editor-controls-column-model.d.ts +13 -0
  242. package/lib/components/tables/column/list-propery-column-model.d.ts +7 -5
  243. package/lib/components/tables/column/property-column-model.d.ts +9 -7
  244. package/lib/components/tables/column/selection-column-model.d.ts +4 -10
  245. package/lib/components/tables/editor/edit-row-controls/edit-row-controls.component.d.ts +17 -0
  246. package/lib/components/tables/editor/edit-session.d.ts +9 -0
  247. package/lib/components/tables/{renderer → editor}/editable-cell-renderer.d.ts +1 -1
  248. package/lib/components/tables/filter/enable-cell-text-search.decorator.d.ts +1 -1
  249. package/lib/components/tables/filter/table-filter-model.d.ts +1 -1
  250. package/lib/components/tables/filter/text-search-predicate.d.ts +0 -9
  251. package/lib/components/tables/renderer/cell-editors.d.ts +9 -0
  252. package/lib/components/tables/renderer/cell-portal-ref.d.ts +25 -22
  253. package/lib/components/tables/renderer/default-cell-renderer/default-cell-renderer.component.d.ts +2 -1
  254. package/lib/components/tables/renderer/default-header-cell-renderer/default-header-cell-renderer.component.d.ts +1 -0
  255. package/lib/components/tables/renderer/select-header-cell/selection-header-cell.component.d.ts +2 -3
  256. package/lib/components/tables/renderer/selection-cell/selection-cell.component.d.ts +0 -1
  257. package/lib/components/tables/renderer/table-body/table-body.component.d.ts +21 -55
  258. package/lib/components/tables/renderer/table-cell/table-cell.component.d.ts +14 -5
  259. package/lib/components/tables/renderer/table-header-cell/table-header-cell.component.d.ts +1 -0
  260. package/lib/components/tables/renderer/table-more-menu/table-more-menu-popup/table-more-menu-popup.component.d.ts +15 -0
  261. package/lib/components/tables/renderer/table-more-menu/table-more-menu.component.d.ts +23 -0
  262. package/lib/components/tables/table/table-model.d.ts +36 -10
  263. package/lib/components/tables/table/table.component.d.ts +13 -17
  264. package/lib/components/tables/table-row-menu/table-row-menu.component.d.ts +28 -0
  265. package/lib/components/tables/tree-table/flattened-tree-list-model.d.ts +1 -1
  266. package/lib/components/tables/tree-table/tree-expansion-model.d.ts +2 -2
  267. package/lib/components/tables/tree-table/tree-inheritance-icon/tree-inheritance-icon.component.d.ts +1 -0
  268. package/lib/components/tables/tree-table/tree-label-cell-renderer/tree-label-cell-renderer.component.d.ts +3 -3
  269. package/lib/components/tables/tree-table/tree-label-column-model.d.ts +3 -4
  270. package/lib/components/tables/tree-table/tree-table-component.d.ts +3 -6
  271. package/lib/components/tables/tree-table/tree-table-model.d.ts +6 -5
  272. package/lib/components/text/markdown/markdown.component.d.ts +1 -1
  273. package/lib/components/types/loadable.d.ts +5 -0
  274. package/lib/directives/command.directive.d.ts +5 -7
  275. package/lib/directives/directives.module.d.ts +5 -5
  276. package/lib/directives/exports.d.ts +0 -1
  277. package/lib/directives/focus-binding.d.ts +0 -1
  278. package/lib/directives/highlight.pipe.d.ts +2 -8
  279. package/lib/interaction/abstract-interaction-context.d.ts +5 -5
  280. package/lib/interaction/activity-ref.d.ts +4 -4
  281. package/lib/interaction/activity.d.ts +8 -8
  282. package/lib/interaction/components/abstract-confirm-dialog.component.d.ts +2 -3
  283. package/lib/interaction/components/abstract-dialog.component.d.ts +15 -6
  284. package/lib/interaction/components/activity-actions/activity-actions.component.d.ts +9 -12
  285. package/lib/interaction/components/activity-body/activity-body.component.d.ts +1 -2
  286. package/lib/interaction/components/activity-container/activity-container.component.d.ts +13 -32
  287. package/lib/interaction/components/activity-container/activity-outlet/activity-outlet.component.d.ts +7 -6
  288. package/lib/interaction/components/activity-title/activity-title.component.d.ts +1 -1
  289. package/lib/interaction/components/activity-triggers/abstract-activity-trigger.component.d.ts +2 -2
  290. package/lib/interaction/components/activity-triggers/inline-activity-trigger/inline-activity-trigger.component.d.ts +1 -1
  291. package/lib/interaction/components/activity-triggers/modal-activity-trigger/modal-activity-trigger.component.d.ts +1 -1
  292. package/lib/interaction/components/activity-triggers/popup-activity-trigger/popup-activity-trigger.component.d.ts +1 -1
  293. package/lib/interaction/components/add-card-activity/add-card-activity.component.d.ts +2 -2
  294. package/lib/interaction/components/add-item-interaction-context/add-item-interaction-context.component.d.ts +3 -3
  295. package/lib/interaction/components/alert-dialog/alert-dialog.component.d.ts +1 -6
  296. package/lib/interaction/components/confirm-then-dialog/confirm-then-dialog.component.d.ts +2 -2
  297. package/lib/interaction/components/confirm-then-execute-dialog/confirm-then-execute-dialog.component.d.ts +2 -2
  298. package/lib/interaction/components/editors/edit-context.d.ts +1 -1
  299. package/lib/interaction/components/editors/inline-string-editor/inline-editor-model.d.ts +1 -1
  300. package/lib/interaction/components/editors/inline-string-editor/inline-string-editor.component.d.ts +2 -2
  301. package/lib/interaction/components/inplace-interaction-context/in-place-interaction-context.component.d.ts +10 -12
  302. package/lib/interaction/components/input-activities/input-activity.d.ts +1 -1
  303. package/lib/interaction/components/input-activities/select-input-activity.d.ts +2 -2
  304. package/lib/interaction/components/input-activities/string-input-activity.d.ts +1 -1
  305. package/lib/interaction/components/popup-interaction-context/popup-interaction-context.component.d.ts +2 -2
  306. package/lib/interaction/confirm.d.ts +0 -4
  307. package/lib/interaction/directives/interaction-context-trigger-for.directive.d.ts +5 -5
  308. package/lib/interaction/exports.d.ts +0 -5
  309. package/lib/interaction/in-place-interaction-context.d.ts +2 -2
  310. package/lib/interaction/interaction-context.d.ts +4 -10
  311. package/lib/interaction/interaction.module.d.ts +33 -35
  312. package/lib/interaction/route-synchronisation-adapter.d.ts +3 -3
  313. package/lib/interaction/services/interaction-service-routing-adapter.d.ts +4 -4
  314. package/lib/interaction/services/interaction.service.d.ts +4 -5
  315. package/lib/interaction/services/mat-dialog-interaction/dialog-interaction-context-factory.d.ts +5 -4
  316. package/lib/interaction/services/mat-dialog-interaction/dialog-interaction-context.d.ts +5 -6
  317. package/lib/interaction/services/modal-interaction-context.factory.d.ts +2 -2
  318. package/lib/place/components/abstract-place-navigation.component.d.ts +2 -3
  319. package/lib/place/components/not-authorised-notice/not-authorised-notice.component.d.ts +1 -0
  320. package/lib/place/components/place-outlet/place-outlet.component.d.ts +7 -6
  321. package/lib/place/components/side-place-navigation/side-place-navigation.component.d.ts +1 -2
  322. package/lib/place/guards/noop-auth-guard.service.d.ts +1 -0
  323. package/lib/place/guards/place.guard.d.ts +1 -8
  324. package/lib/place/navigation/place-component-deactivation-handler.d.ts +4 -4
  325. package/lib/place/navigation/session/abstract-pop-state-navigation.d.ts +1 -1
  326. package/lib/place/navigation/session/event-cleanup/wait-until-leaving-interaction-transition-cancelled.d.ts +3 -3
  327. package/lib/place/navigation/session/event-cleanup/wait-until-link-triggered-navigation-interaction-cancelation-type-determined.d.ts +3 -3
  328. package/lib/place/navigation/session/event-cleanup/wait-until-popstate-during-can-deactivate-transition-finishes.d.ts +3 -3
  329. package/lib/place/navigation/session/interactions/pop-state-during-interaction-navigation.d.ts +1 -1
  330. package/lib/place/navigation/session/interactions/remove-last-interaction-from-url-navigation-session.d.ts +3 -16
  331. package/lib/place/navigation/session/interactions/synchronise-interaction-context-ids-with-route.d.ts +1 -1
  332. package/lib/place/navigation/session/navigation-context.d.ts +5 -5
  333. package/lib/place/navigation/session/navigation-session.d.ts +8 -15
  334. package/lib/place/place-access-guard.d.ts +1 -1
  335. package/lib/place/place-auth-service.d.ts +8 -8
  336. package/lib/place/place-component.d.ts +23 -15
  337. package/lib/place/place-definition.d.ts +3 -6
  338. package/lib/place/place-history.d.ts +4 -5
  339. package/lib/place/place-router.d.ts +10 -41
  340. package/lib/place/place.decorator.d.ts +1 -9
  341. package/lib/place/place.module.d.ts +8 -8
  342. package/lib/place/route/json-types.d.ts +3 -1
  343. package/lib/place/route/parameter-decorators.d.ts +6 -5
  344. package/lib/place/route/parameter-definition.d.ts +5 -5
  345. package/lib/place/route/parameter-sanitiser.d.ts +1 -8
  346. package/lib/place/route/parameter-snapshot.d.ts +2 -2
  347. package/lib/place/route/visit-segment-sanitiser.d.ts +3 -3
  348. package/lib/place/url-service.d.ts +1 -1
  349. package/lib/place/url-snapshot.d.ts +1 -1
  350. package/lib/place/visit-segment.d.ts +6 -6
  351. package/lib/place/visit.d.ts +4 -4
  352. package/lib/services/markdown/markdown.service.d.ts +1 -0
  353. package/lib/services/visibility-service.d.ts +1 -1
  354. package/package.json +20 -19
  355. package/assets/draw.scss +0 -20
  356. package/assets/layout.scss +0 -3
  357. package/assets/place.scss +0 -31
  358. package/esm2022/lib/components/commands/button-renderer/button-renderer.component.mjs +0 -115
  359. package/esm2022/lib/components/file/file-download/file-download.component.mjs +0 -89
  360. package/esm2022/lib/components/forms/form-field.mjs +0 -2
  361. package/esm2022/lib/components/forms/search-input/search-input.component.mjs +0 -33
  362. package/esm2022/lib/components/loadable-component.mjs +0 -69
  363. package/esm2022/lib/components/tables/column/column-manager.mjs +0 -82
  364. package/esm2022/lib/components/tables/column/column-order-manager.mjs +0 -19
  365. package/esm2022/lib/components/tables/footer/footer-row-model.mjs +0 -135
  366. package/esm2022/lib/components/tables/renderer/abstract-cell-renderer.mjs +0 -7
  367. package/esm2022/lib/components/tables/renderer/editable-cell-renderer.mjs +0 -2
  368. package/esm2022/lib/components/tables/renderer/table-action-column/menu-builder.mjs +0 -2
  369. package/esm2022/lib/components/tables/renderer/table-action-column/table-action-column.component.mjs +0 -153
  370. package/esm2022/lib/components/tables/renderer/table-custom-more-menu/table-custom-more-menu-popup.component.mjs +0 -45
  371. package/esm2022/lib/components/tables/renderer/table-custom-more-menu/table-custom-more-menu.component.mjs +0 -71
  372. package/esm2022/lib/components/tables/renderer/table-footer-row/table-footer-row.component.mjs +0 -32
  373. package/esm2022/lib/directives/resize-observer.directive.mjs +0 -40
  374. package/esm2022/lib/interaction/activity-context.mjs +0 -4
  375. package/esm2022/lib/interaction/components/alert-renderer/alert-renderer.component.mjs +0 -55
  376. package/esm2022/lib/interaction/components/confirm-renderer/confirm-renderer.component.mjs +0 -54
  377. package/esm2022/lib/interaction/components/slide-down-interaction-context/slide-down-interaction-context.component.mjs +0 -134
  378. package/esm2022/lib/interaction/interaction-context-provider.mjs +0 -17
  379. package/esm2022/lib/place/place-metadata.mjs +0 -16
  380. package/lib/components/commands/button-renderer/button-renderer.component.d.ts +0 -30
  381. package/lib/components/file/file-download/file-download.component.d.ts +0 -45
  382. package/lib/components/forms/form-field.d.ts +0 -5
  383. package/lib/components/forms/search-input/search-input.component.d.ts +0 -10
  384. package/lib/components/loadable-component.d.ts +0 -20
  385. package/lib/components/tables/column/column-manager.d.ts +0 -19
  386. package/lib/components/tables/column/column-order-manager.d.ts +0 -20
  387. package/lib/components/tables/footer/footer-row-model.d.ts +0 -72
  388. package/lib/components/tables/renderer/abstract-cell-renderer.d.ts +0 -6
  389. package/lib/components/tables/renderer/table-action-column/menu-builder.d.ts +0 -7
  390. package/lib/components/tables/renderer/table-action-column/table-action-column.component.d.ts +0 -42
  391. package/lib/components/tables/renderer/table-custom-more-menu/table-custom-more-menu-popup.component.d.ts +0 -19
  392. package/lib/components/tables/renderer/table-custom-more-menu/table-custom-more-menu.component.d.ts +0 -24
  393. package/lib/components/tables/renderer/table-footer-row/table-footer-row.component.d.ts +0 -10
  394. package/lib/directives/resize-observer.directive.d.ts +0 -16
  395. package/lib/interaction/activity-context.d.ts +0 -9
  396. package/lib/interaction/components/alert-renderer/alert-renderer.component.d.ts +0 -17
  397. package/lib/interaction/components/confirm-renderer/confirm-renderer.component.d.ts +0 -15
  398. package/lib/interaction/components/slide-down-interaction-context/slide-down-interaction-context.component.d.ts +0 -53
  399. package/lib/interaction/interaction-context-provider.d.ts +0 -11
  400. package/lib/place/place-metadata.d.ts +0 -8
@@ -1,188 +1,70 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
- /* eslint-disable @typescript-eslint/no-explicit-any -- table body renders arbitrary row/cell types */
3
- import { CdkVirtualScrollViewport } from "@angular/cdk/scrolling";
4
- import { ChangeDetectorRef, Component, Directive, ElementRef, HostBinding, Inject, InjectionToken, Input, Optional, ViewChild, inject } from "@angular/core";
2
+ import { Component, ElementRef, EventEmitter, HostBinding, Input, NgZone, Output } from "@angular/core";
5
3
  import { Dsl, ListModel, MutableValueModel, Proxify, proxify, StoreInValueModel, ValueModel } from "@coolon/pectin";
6
- import { TableVirtualScrollDataSource } from "ng-table-virtual-scroll";
7
4
  import { ResizeAwareComponent } from "../../../resize-aware.component";
8
5
  import { AbstractTableModel } from "../../abstract-table-model";
9
- import { AUP_DETACHED_PARENT_CDR, DisposableComponent } from "../../../disposable-component";
10
6
  import * as i0 from "@angular/core";
11
7
  import * as i1 from "@angular/common";
12
- import * as i2 from "@angular/material/table";
13
- import * as i3 from "@angular/cdk/scrolling";
14
- import * as i4 from "ng-table-virtual-scroll";
15
- import * as i5 from "../table-cell/table-cell.component";
16
- import * as i6 from "../table-header-cell/table-header-cell.component";
17
- import * as i7 from "../table-footer-row/table-footer-row.component";
18
- export const AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER = new InjectionToken("AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER");
19
- export const AUP_TABLE_OPTIMIZED_CHANGE_DETECTION = new InjectionToken("AUP_TABLE_OPTIMIZED_CHANGE_DETECTION");
20
- export class TableRowAttributesDirective {
21
- elementRef;
22
- aupTableRowAttributes = {};
23
- /** Attribute names applied on the previous pass, so ones that disappear can be removed. */
24
- appliedAttributeNames = [];
25
- constructor(elementRef) {
26
- this.elementRef = elementRef;
27
- }
28
- // Re-apply on every change, not just once at init: a row's attribute values can change after the
29
- // row has rendered (e.g. an OTAP device row whose device record resolves after its scratchpad row
30
- // was created), and the element must reflect the latest values. Previously this implemented OnInit,
31
- // so the attributes were frozen at row-creation time and went stale (e.g. deviceHardwareId stuck on
32
- // its initial "undefined").
33
- ngOnChanges() {
34
- const element = this.elementRef.nativeElement;
35
- const next = this.aupTableRowAttributes ?? {};
36
- for (const attr of this.appliedAttributeNames) {
37
- if (!(attr in next)) {
38
- element.removeAttribute(attr);
39
- }
40
- }
41
- this.appliedAttributeNames = Object.keys(next);
42
- for (const attr of this.appliedAttributeNames) {
43
- element.setAttribute(attr, next[attr]);
44
- }
45
- }
46
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableRowAttributesDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
47
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: TableRowAttributesDirective, selector: "[aupTableRowAttributes]", inputs: { aupTableRowAttributes: "aupTableRowAttributes" }, usesOnChanges: true, ngImport: i0 });
48
- }
49
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableRowAttributesDirective, decorators: [{
50
- type: Directive,
51
- args: [{
52
- selector: "[aupTableRowAttributes]",
53
- }]
54
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { aupTableRowAttributes: [{
55
- type: Input
56
- }] } });
8
+ import * as i2 from "@angular/material/legacy-table";
9
+ import * as i3 from "../table-cell/table-cell.component";
10
+ import * as i4 from "../table-header-cell/table-header-cell.component";
57
11
  export class TableBodyComponent extends ResizeAwareComponent {
58
- bufferMultiplier;
59
12
  #data$_accessor_storage = proxify((ListModel));
60
13
  get data$() { return this.#data$_accessor_storage; }
61
14
  set data$(value) { this.#data$_accessor_storage = value; }
62
15
  #tableModel_accessor_storage = proxify((AbstractTableModel));
63
16
  get tableModel() { return this.#tableModel_accessor_storage; }
64
17
  set tableModel(value) { this.#tableModel_accessor_storage = value; }
65
- // Footer rows are built once in the TableModel builder callback, so a plain input is enough;
66
- // the per-row cell layout (footerRowDefs$) is derived reactively from the visible columns.
67
- footerRows = [];
68
18
  #showHeader$_accessor_storage = proxify((ValueModel));
69
19
  get showHeader$() { return this.#showHeader$_accessor_storage; }
70
20
  set showHeader$(value) { this.#showHeader$_accessor_storage = value; }
71
21
  #showHeader_accessor_storage = true;
72
22
  get showHeader() { return this.#showHeader_accessor_storage; }
73
23
  set showHeader(value) { this.#showHeader_accessor_storage = value; }
24
+ visibleRowCount = new EventEmitter();
74
25
  trackBy;
75
- #scrollMode$_accessor_storage = proxify((ValueModel));
76
- get scrollMode$() { return this.#scrollMode$_accessor_storage; }
77
- set scrollMode$(value) { this.#scrollMode$_accessor_storage = value; }
78
- #scrollMode_accessor_storage = "none";
79
- get scrollMode() { return this.#scrollMode_accessor_storage; }
80
- set scrollMode(value) { this.#scrollMode_accessor_storage = value; }
81
- scrollViewport;
82
- columns$;
83
- columnIds$;
84
- footerRowDefs$;
85
- columnsById$;
26
+ /**
27
+ * Set to true to enable scrolling. Once enabled the table will have 0 implicit height. You will either
28
+ * need to set it explicitly e.g. height: 400px; or by using flex or grid layout to make it fill it's
29
+ * containment area.
30
+ */
31
+ enableScrolling = false;
32
+ columns;
33
+ columnIds;
34
+ columnsById;
35
+ _visibleRowCount;
86
36
  // TODO: support user defined header and row heights via css vars.
87
- headerHeight$ = new MutableValueModel(48);
88
- rowHeight$ = new MutableValueModel(44);
37
+ headerHeight = new MutableValueModel(56);
38
+ rowHeight = new MutableValueModel(48);
89
39
  baseCssClass = "aup-table-component";
90
- get animationsDisabledClass() { return this.animationsDisabled$.value; }
91
- virtualScrollDataSource = new TableVirtualScrollDataSource();
92
- virtualScrollActive$ = new MutableValueModel(false);
93
- animationsDisabled$ = new MutableValueModel(false);
94
- scrollTimeout;
95
- animationsResetRafId = null;
96
- scrollEndAbortController = null;
97
- optimisedChangeDetectionEnabled;
98
- viewInitialized = false;
99
- markForCheck() {
100
- if (this.optimisedChangeDetectionEnabled) {
101
- // The table-body detaches its own CDR and has no detached parent (AUP_DETACHED_PARENT_CDR
102
- // uses skipSelf), so the base markForCheck() would call cdr.markForCheck() which is a
103
- // no-op on a detached view. Schedule an explicit detectChanges() on ourselves instead so
104
- // that viewStateDependsOn() correctly triggers re-renders (e.g. row selection classes).
105
- DisposableComponent.scheduleParentSweep(this.cdr);
106
- }
107
- else {
108
- super.markForCheck();
109
- }
110
- }
111
- constructor(bufferMultiplier = 3) {
112
- super();
113
- this.bufferMultiplier = bufferMultiplier;
114
- const { chain, when, observe } = Dsl.disposeWith(this);
115
- this.optimisedChangeDetectionEnabled = this.inject(AUP_TABLE_OPTIMIZED_CHANGE_DETECTION, { optional: true });
116
- const actualHeaderHeight$ = chain(this.showHeader$).map(show => {
117
- return show ? this.headerHeight$.value : 0;
118
- }, { dependsOn: this.headerHeight$ });
119
- // performance is terrible if the data changes while we're scrolling, so we postpone updates until
120
- // scrolling stops.
121
- const delayedData$ = chain(this.data$).postponeWhile(this.virtualScrollActive$);
122
- when(delayedData$).changes(delatedData => {
123
- this.animationsDisabled$.value = true;
124
- // Update the CDK data source before detectChanges so that both the explicit detectChanges
125
- // and any subsequent SWEEP-triggered detectChanges see the same data. If we update after,
126
- // the SWEEP's detectChanges sees different row objects and triggers a second cascade.
127
- this.virtualScrollDataSource.data = delatedData;
128
- // With detached CD, markForCheck() alone won't push [@.disabled]="true" to the DOM.
129
- // Detect synchronously so CDK renders new rows with animations already suppressed.
130
- // animationsDisabled$.value is already true (set above), so the template evaluation
131
- // in this detectChanges will see [@.disabled]="true" before any new rows are created.
132
- // Guard against the {initialValue:"evaluate"} firing during construction before the view exists.
133
- if (this.optimisedChangeDetectionEnabled && this.viewInitialized) {
134
- this.cdr.detectChanges();
135
- }
136
- this.scheduleTableHeightCheck();
137
- this.resetAnimationsAfterFrame();
138
- }, { initialValue: "evaluate" });
40
+ constructor(elementRef, ngZone) {
41
+ super(elementRef, ngZone);
42
+ const { chain, when } = Dsl.disposeWith(this);
43
+ const actualHeaderHeight = chain(this.showHeader$).map(show => {
44
+ return show ? this.headerHeight.value : 0;
45
+ }, { dependsOn: this.headerHeight });
46
+ this._visibleRowCount = chain(this.boundsModel).map(bounds => {
47
+ // TODO: this doesn't take into account any css styling adjustments etc. Will investigate if it's an issue.
48
+ const rawRowCount = (bounds.height - actualHeaderHeight.value) / this.rowHeight.value;
49
+ return rawRowCount < 1 ? 0 : Math.floor(rawRowCount);
50
+ }, {
51
+ dependsOn: [actualHeaderHeight, this.rowHeight],
52
+ postponeWhile: chain(this.boundsModel).pluckNumeric("height").isLessThan(1)
53
+ });
54
+ when(this._visibleRowCount).changes(visibleRows => {
55
+ this.visibleRowCount.emit(visibleRows);
56
+ }, { initialValue: "triggerChangeUnlessNil" });
139
57
  this.onInit(() => {
140
- this.columns$ = chain(this.tableModel.visibleColumns$);
141
- this.columnIds$ = chain(this.columns$).pluck("columnId");
142
- this.columnsById$ = chain(this.columns$).indexBy('columnId');
143
- this.footerRowDefs$ = chain(this.columnIds$).reduceAll(ids => (this.footerRows ?? []).map((row, i) => row.resolve(i, [...ids])));
144
- this.viewStateDependsOn(this.tableModel.filteredRows$, this.tableModel.visibleColumns$, this.virtualScrollActive$, this.animationsDisabled$, this.tableModel.selectedItems$, this.footerRowDefs$);
58
+ this.columns = chain(this.tableModel.columns);
59
+ this.columnIds = chain(this.columns).pluck("columnId");
60
+ this.columnsById = chain(this.columns).indexBy('columnId');
145
61
  });
146
62
  }
147
- ngAfterViewInit() {
148
- super.ngAfterViewInit();
149
- this.viewInitialized = true;
150
- if (this.scrollViewport) {
151
- const { observe } = Dsl.disposeWith(this);
152
- this.scrollViewport.elementScrolled().subscribe(() => this.notifyScrolled());
153
- this.scrollEndAbortController = new AbortController();
154
- this.scrollViewport.elementRef.nativeElement.addEventListener('scrollend', () => this.notifyScrollEnded(), { passive: true, signal: this.scrollEndAbortController.signal });
155
- }
156
- if (this.optimisedChangeDetectionEnabled) {
157
- this.cdr.detach();
158
- if (this.scrollViewport) {
159
- this.scrollViewport.renderedRangeStream.subscribe(() => {
160
- // Defer past the current sync batch so the data source has updated _renderedItems before we run CD.
161
- // Must call detectChanges() directly — markForCheck() alone does nothing on a detached view.
162
- Promise.resolve().then(() => {
163
- this.cdr.detectChanges();
164
- });
165
- // Extend the animation suppression window on each CDK range change so animations can't
166
- // fire mid-render regardless of how many frames the range update spans.
167
- if (this.animationsDisabled$.value) {
168
- this.resetAnimationsAfterFrame();
169
- }
170
- });
171
- }
172
- // Defer past the current tick so the viewport's initial rendered range is stable
173
- Promise.resolve().then(() => {
174
- this.cdr.detectChanges();
175
- });
176
- }
177
- }
178
63
  get hideHeader() {
179
64
  return !this.showHeader;
180
65
  }
181
- get headerHeightCssVar() {
182
- return `${this.headerHeight$.value}px`;
183
- }
184
- get rowHeightCssVar() {
185
- return `${this.rowHeight$.value}px`;
66
+ isEditing(row) {
67
+ return !!this.tableModel.getEditSessionFor(row);
186
68
  }
187
69
  notifyCellClicked(columnModel, row) {
188
70
  this.tableModel._notifyCellClicked(columnModel, row);
@@ -196,7 +78,7 @@ export class TableBodyComponent extends ResizeAwareComponent {
196
78
  return this.tableModel.lastVisibleColumn$.query().value?.columnId === columnId;
197
79
  }
198
80
  getColumnClasses(columnId) {
199
- const classes = [`aup-col-${this.columnsById$.get(columnId).dasherisedColumnId}`];
81
+ const classes = [`aup-col-${this.columnsById.get(columnId).dasherisedColumnId}`];
200
82
  if (this.isFirstVisibleColumn(columnId)) {
201
83
  classes.push("first-visible-column");
202
84
  }
@@ -205,145 +87,50 @@ export class TableBodyComponent extends ResizeAwareComponent {
205
87
  }
206
88
  return classes;
207
89
  }
208
- scheduleTableHeightCheck(waitMillis = 50) {
209
- setTimeout(() => {
210
- // Use CDK's internal rendered range to detect a broken virtual scroll state —
211
- // avoids reading offsetHeight (forced layout) and dispatching a global resize event
212
- // (which triggers Angular's animation engine to call getComputedStyle on all elements).
213
- const renderedRange = this.scrollViewport?.getRenderedRange();
214
- // A usable virtual viewport renders more than one row whenever more data exists. Rendering
215
- // none or one row at the top while data$ holds more means the viewport measured a
216
- // collapsed/stale height (e.g. it was measured before the table was sized up, then never
217
- // re-measured under detached change detection) — so re-measure to expand the rendered range.
218
- // Covers both the zero-row collapse and the partial (one-row) under-render. Detection stays
219
- // layout-free (getRenderedRange only); correctly-sized and genuinely-virtualised large
220
- // tables render many rows, so they never reach the checkViewportSize() reflow below.
221
- const renderedCount = renderedRange != null ? renderedRange.end - renderedRange.start : 0;
222
- const underRendered = renderedRange != null && renderedRange.start === 0 && renderedCount <= 1;
223
- if (underRendered && this.data$.length > renderedCount) {
224
- this.scrollViewport?.checkViewportSize();
225
- if (waitMillis < 500) {
226
- this.scheduleTableHeightCheck(waitMillis + 50);
227
- }
228
- }
229
- }, waitMillis);
230
- }
231
- notifyScrolled() {
232
- this.virtualScrollActive$.value = true;
233
- this.animationsDisabled$.value = true;
234
- // Sync the [@.disabled]="true" to the DOM immediately so CDK's pending range
235
- // update (which is scheduled async) sees animations suppressed when it renders rows.
236
- if (this.optimisedChangeDetectionEnabled) {
237
- this.cdr.detectChanges();
238
- }
239
- this.clearScrollTimeout();
240
- this.scrollTimeout = setTimeout(() => this.notifyScrollEnded(), 100);
241
- }
242
- notifyScrollEnded() {
243
- this.clearScrollTimeout();
244
- this.virtualScrollActive$.value = false;
245
- this.resetAnimationsAfterFrame();
246
- }
247
- ngOnDestroy() {
248
- this.scrollEndAbortController?.abort();
249
- super.ngOnDestroy();
250
- }
251
- resetAnimationsAfterFrame() {
252
- // Cancel any pending reset so rapid data changes don't re-enable animations mid-render.
253
- if (this.animationsResetRafId !== null) {
254
- cancelAnimationFrame(this.animationsResetRafId);
255
- }
256
- // Re-enable after the next frame: by then CDK has created rows and CD has run,
257
- // so :enter animations won't fire on the newly created row components.
258
- this.animationsResetRafId = requestAnimationFrame(() => {
259
- this.animationsResetRafId = null;
260
- this.animationsDisabled$.value = false;
261
- if (this.optimisedChangeDetectionEnabled) {
262
- // detectChanges() directly — markForCheck() does nothing on a detached view.
263
- this.cdr.detectChanges();
264
- }
265
- });
266
- }
267
- clearScrollTimeout() {
268
- if (this.scrollTimeout) {
269
- clearTimeout(this.scrollTimeout);
270
- }
271
- }
272
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableBodyComponent, deps: [{ token: AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER, optional: true }], target: i0.ɵɵFactoryTarget.Component });
273
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableBodyComponent, selector: "aup-table-body", inputs: { data$: "data$", tableModel: "tableModel", footerRows: "footerRows", showHeader$: "showHeader$", showHeader: "showHeader", trackBy: "trackBy", scrollMode$: "scrollMode$", scrollMode: "scrollMode" }, host: { properties: { "attr.scrollMode": "this.scrollMode", "class": "this.baseCssClass", "class.aup-animations-disabled": "this.animationsDisabledClass", "class.hide-header": "this.hideHeader", "style.--aup-table-header-height": "this.headerHeightCssVar", "style.--aup-table-row-height": "this.rowHeightCssVar" } }, providers: [
274
- { provide: AUP_DETACHED_PARENT_CDR, useFactory: () => inject(AUP_TABLE_OPTIMIZED_CHANGE_DETECTION, { optional: true }) ? inject(ChangeDetectorRef) : null }
275
- ], viewQueries: [{ propertyName: "scrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], usesInheritance: true, ngImport: i0, template: "\n<div class=\"classic-scroll-container\" *ngIf=\"scrollMode$.value !== 'virtual'\">\n <table mat-table [dataSource]=\"data$.value\" [trackBy]=\"trackBy\" [multiTemplateDataRows]>\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"$any(column)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n <ng-container *ngFor=\"let footer of footerRowDefs$.value\">\n <ng-container *ngFor=\"let cell of footer.cells\" [matColumnDef]=\"cell.defId\">\n <td mat-footer-cell *matFooterCellDef [attr.colspan]=\"cell.colspan\"\n [attr.column-id]=\"cell.columnId\" class=\"footer-cell\">\n <aup-table-footer-row *ngIf=\"!cell.filler\" [cell]=\"cell\"></aup-table-footer-row>\n </td>\n </ng-container>\n <tr mat-footer-row *matFooterRowDef=\"footer.defIds; sticky: true\" [ngClass]=\"footer.rowClasses\"></tr>\n </ng-container>\n\n </table>\n</div>\n\n<cdk-virtual-scroll-viewport *ngIf=\"scrollMode$.value === 'virtual'\"\n [@.disabled]=\"animationsDisabled$.value\"\n [tvsItemSize]=\"rowHeight$.value\"\n [headerHeight]=\"headerHeight$.value\"\n [footerEnabled]=\"(footerRowDefs$?.value?.length ?? 0) > 0\"\n [footerHeight]=\"48 * (footerRowDefs$?.value?.length ?? 0)\"\n [bufferMultiplier]=\"bufferMultiplier\"\n>\n <table mat-table [dataSource]=\"virtualScrollDataSource\" [trackBy]=\"trackBy\">\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n <ng-container *ngFor=\"let footer of footerRowDefs$.value\">\n <ng-container *ngFor=\"let cell of footer.cells\" [matColumnDef]=\"cell.defId\">\n <td mat-footer-cell *matFooterCellDef [attr.colspan]=\"cell.colspan\"\n [attr.column-id]=\"cell.columnId\" class=\"footer-cell\">\n <aup-table-footer-row *ngIf=\"!cell.filler\" [cell]=\"cell\"></aup-table-footer-row>\n </td>\n </ng-container>\n <tr mat-footer-row *matFooterRowDef=\"footer.defIds; sticky: true\" [ngClass]=\"footer.rowClasses\"></tr>\n </ng-container>\n\n\n </table>\n</cdk-virtual-scroll-viewport>\n\n", styles: [":host{--enter-animation-duration: .1s;display:flex;flex-direction:column;align-items:stretch}:host.aup-animations-disabled{--enter-animation-duration: 0ms}:host table{width:100%}:host[scrollMode=virtual] cdk-virtual-scroll-viewport{flex:1}:host[scrollMode=virtual] table th{height:var(--aup-table-header-height);max-height:var(--aup-table-header-height);min-height:var(--aup-table-header-height)}:host[scrollMode=virtual] table td{height:var(--aup-table-row-height);max-height:var(--aup-table-row-height);min-height:var(--aup-table-row-height)}:host[scrollMode=classic]{min-height:0}:host[scrollMode=classic] .classic-scroll-container{flex:1;flex-basis:0;overflow-y:auto;display:flex;flex-direction:column;align-items:stretch}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i2.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i2.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i2.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "component", type: i3.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i4.TableItemSizeDirective, selector: "cdk-virtual-scroll-viewport[tvsItemSize]", inputs: ["tvsItemSize", "headerEnabled", "headerHeight", "footerEnabled", "footerHeight", "bufferMultiplier"] }, { kind: "directive", type: TableRowAttributesDirective, selector: "[aupTableRowAttributes]", inputs: ["aupTableRowAttributes"] }, { kind: "component", type: i5.TableCellComponent, selector: "aup-table-cell", inputs: ["row", "column", "tableModel"] }, { kind: "component", type: i6.TableHeaderCellComponent, selector: "aup-table-header-cell", inputs: ["column"] }, { kind: "component", type: i7.TableFooterRow, selector: "aup-table-footer-row", inputs: ["cell"] }] });
90
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: TableBodyComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
91
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: TableBodyComponent, selector: "aup-table-body", inputs: { data$: "data$", tableModel: "tableModel", showHeader$: "showHeader$", showHeader: "showHeader", trackBy: "trackBy", enableScrolling: "enableScrolling" }, outputs: { visibleRowCount: "visibleRowCount" }, host: { properties: { "class.enable-scrolling": "this.enableScrolling", "class": "this.baseCssClass", "class.hide-header": "this.hideHeader" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"scroll-container\">\n <table mat-table [dataSource]=\"data$.value\" [trackBy]=\"trackBy\">\n\n <ng-container *ngFor=\"let column of columns.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"column\"\n [row]=\"row\"\n [tableModel]=\"tableModel\"\n [editSession]=\"tableModel.getEditSessionFor(row)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\n\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}:host table{width:100%}:host.enable-scrolling{min-height:0}:host.enable-scrolling .scroll-container{flex:1;flex-basis:0;overflow-y:auto;display:flex;flex-direction:column;align-items:stretch}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i2.MatLegacyTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2.MatLegacyHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatLegacyHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2.MatLegacyColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i2.MatLegacyCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatLegacyRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2.MatLegacyHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatLegacyCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i2.MatLegacyHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2.MatLegacyRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i3.TableCellComponent, selector: "aup-table-cell", inputs: ["row", "column", "editSession", "tableModel"] }, { kind: "component", type: i4.TableHeaderCellComponent, selector: "aup-table-header-cell", inputs: ["column"] }] });
276
92
  }
277
93
  __decorate([
278
94
  Proxify(),
279
- __metadata("design:type", ListModel)
95
+ __metadata("design:type", Object)
280
96
  ], TableBodyComponent.prototype, "data$", null);
281
97
  __decorate([
282
98
  Proxify(),
283
- __metadata("design:type", AbstractTableModel)
99
+ __metadata("design:type", Object)
284
100
  ], TableBodyComponent.prototype, "tableModel", null);
285
101
  __decorate([
286
102
  Proxify(),
287
- __metadata("design:type", ValueModel)
103
+ __metadata("design:type", Object)
288
104
  ], TableBodyComponent.prototype, "showHeader$", null);
289
105
  __decorate([
290
106
  StoreInValueModel(),
291
107
  __metadata("design:type", Object)
292
108
  ], TableBodyComponent.prototype, "showHeader", null);
293
- __decorate([
294
- Proxify(),
295
- __metadata("design:type", ValueModel)
296
- ], TableBodyComponent.prototype, "scrollMode$", null);
297
- __decorate([
298
- StoreInValueModel(),
299
- __metadata("design:type", String)
300
- ], TableBodyComponent.prototype, "scrollMode", null);
301
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableBodyComponent, decorators: [{
109
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: TableBodyComponent, decorators: [{
302
110
  type: Component,
303
- args: [{ selector: "aup-table-body", providers: [
304
- { provide: AUP_DETACHED_PARENT_CDR, useFactory: () => inject(AUP_TABLE_OPTIMIZED_CHANGE_DETECTION, { optional: true }) ? inject(ChangeDetectorRef) : null }
305
- ], template: "\n<div class=\"classic-scroll-container\" *ngIf=\"scrollMode$.value !== 'virtual'\">\n <table mat-table [dataSource]=\"data$.value\" [trackBy]=\"trackBy\" [multiTemplateDataRows]>\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"$any(column)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n <ng-container *ngFor=\"let footer of footerRowDefs$.value\">\n <ng-container *ngFor=\"let cell of footer.cells\" [matColumnDef]=\"cell.defId\">\n <td mat-footer-cell *matFooterCellDef [attr.colspan]=\"cell.colspan\"\n [attr.column-id]=\"cell.columnId\" class=\"footer-cell\">\n <aup-table-footer-row *ngIf=\"!cell.filler\" [cell]=\"cell\"></aup-table-footer-row>\n </td>\n </ng-container>\n <tr mat-footer-row *matFooterRowDef=\"footer.defIds; sticky: true\" [ngClass]=\"footer.rowClasses\"></tr>\n </ng-container>\n\n </table>\n</div>\n\n<cdk-virtual-scroll-viewport *ngIf=\"scrollMode$.value === 'virtual'\"\n [@.disabled]=\"animationsDisabled$.value\"\n [tvsItemSize]=\"rowHeight$.value\"\n [headerHeight]=\"headerHeight$.value\"\n [footerEnabled]=\"(footerRowDefs$?.value?.length ?? 0) > 0\"\n [footerHeight]=\"48 * (footerRowDefs$?.value?.length ?? 0)\"\n [bufferMultiplier]=\"bufferMultiplier\"\n>\n <table mat-table [dataSource]=\"virtualScrollDataSource\" [trackBy]=\"trackBy\">\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n <ng-container *ngFor=\"let footer of footerRowDefs$.value\">\n <ng-container *ngFor=\"let cell of footer.cells\" [matColumnDef]=\"cell.defId\">\n <td mat-footer-cell *matFooterCellDef [attr.colspan]=\"cell.colspan\"\n [attr.column-id]=\"cell.columnId\" class=\"footer-cell\">\n <aup-table-footer-row *ngIf=\"!cell.filler\" [cell]=\"cell\"></aup-table-footer-row>\n </td>\n </ng-container>\n <tr mat-footer-row *matFooterRowDef=\"footer.defIds; sticky: true\" [ngClass]=\"footer.rowClasses\"></tr>\n </ng-container>\n\n\n </table>\n</cdk-virtual-scroll-viewport>\n\n", styles: [":host{--enter-animation-duration: .1s;display:flex;flex-direction:column;align-items:stretch}:host.aup-animations-disabled{--enter-animation-duration: 0ms}:host table{width:100%}:host[scrollMode=virtual] cdk-virtual-scroll-viewport{flex:1}:host[scrollMode=virtual] table th{height:var(--aup-table-header-height);max-height:var(--aup-table-header-height);min-height:var(--aup-table-header-height)}:host[scrollMode=virtual] table td{height:var(--aup-table-row-height);max-height:var(--aup-table-row-height);min-height:var(--aup-table-row-height)}:host[scrollMode=classic]{min-height:0}:host[scrollMode=classic] .classic-scroll-container{flex:1;flex-basis:0;overflow-y:auto;display:flex;flex-direction:column;align-items:stretch}\n"] }]
306
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
307
- type: Inject,
308
- args: [AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER]
309
- }, {
310
- type: Optional
311
- }] }]; }, propDecorators: { data$: [{
111
+ args: [{ selector: "aup-table-body", template: "<div class=\"scroll-container\">\n <table mat-table [dataSource]=\"data$.value\" [trackBy]=\"trackBy\">\n\n <ng-container *ngFor=\"let column of columns.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"column\"\n [row]=\"row\"\n [tableModel]=\"tableModel\"\n [editSession]=\"tableModel.getEditSessionFor(row)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\n\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}:host table{width:100%}:host.enable-scrolling{min-height:0}:host.enable-scrolling .scroll-container{flex:1;flex-basis:0;overflow-y:auto;display:flex;flex-direction:column;align-items:stretch}\n"] }]
112
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { data$: [{
312
113
  type: Input
313
114
  }], tableModel: [{
314
115
  type: Input
315
- }], footerRows: [{
316
- type: Input
317
116
  }], showHeader$: [{
318
117
  type: Input
319
118
  }], showHeader: [{
320
119
  type: Input
120
+ }], visibleRowCount: [{
121
+ type: Output
321
122
  }], trackBy: [{
322
123
  type: Input
323
- }], scrollMode$: [{
324
- type: Input
325
- }], scrollMode: [{
124
+ }], enableScrolling: [{
326
125
  type: Input
327
126
  }, {
328
127
  type: HostBinding,
329
- args: ["attr.scrollMode"]
330
- }], scrollViewport: [{
331
- type: ViewChild,
332
- args: [CdkVirtualScrollViewport]
128
+ args: ["class.enable-scrolling"]
333
129
  }], baseCssClass: [{
334
130
  type: HostBinding,
335
131
  args: ["class"]
336
- }], animationsDisabledClass: [{
337
- type: HostBinding,
338
- args: ["class.aup-animations-disabled"]
339
132
  }], hideHeader: [{
340
133
  type: HostBinding,
341
134
  args: ["class.hide-header"]
342
- }], headerHeightCssVar: [{
343
- type: HostBinding,
344
- args: ["style.--aup-table-header-height"]
345
- }], rowHeightCssVar: [{
346
- type: HostBinding,
347
- args: ["style.--aup-table-row-height"]
348
135
  }] } });
349
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdWktcG93ZXJ1cHMvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlcy9yZW5kZXJlci90YWJsZS1ib2R5L3RhYmxlLWJvZHkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXVpLXBvd2VydXBzL3NyYy9saWIvY29tcG9uZW50cy90YWJsZXMvcmVuZGVyZXIvdGFibGUtYm9keS90YWJsZS1ib2R5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxzR0FBc0c7QUFDdEcsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLGNBQWMsRUFDZCxLQUFLLEVBR0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLEdBQUcsRUFDSCxTQUFTLEVBR1QsaUJBQWlCLEVBQ2pCLE9BQU8sRUFDUCxPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3JFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBSTlELE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLCtCQUErQixDQUFDOzs7Ozs7Ozs7QUFFM0YsTUFBTSxDQUFDLE1BQU0sMENBQTBDLEdBQUcsSUFBSSxjQUFj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LGtCQUFrQjtzQkFEckIsV0FBVzt1QkFBQyxpQ0FBaUM7Z0JBTTFDLGVBQWU7c0JBRGxCLFdBQVc7dUJBQUMsOEJBQThCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSB0YWJsZSBib2R5IHJlbmRlcnMgYXJiaXRyYXJ5IHJvdy9jZWxsIHR5cGVzICovXG5pbXBvcnQge0Nka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9zY3JvbGxpbmdcIjtcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdCxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIFZpZXdDaGlsZCxcbiAgaW5qZWN0XG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICBEc2wsXG4gIExpc3RNb2RlbCxcbiAgTGlzdE1vZGVsQ2hhaW4sXG4gIE1hcE1vZGVsQ2hhaW4sXG4gIE11dGFibGVWYWx1ZU1vZGVsLFxuICBQcm94aWZ5LFxuICBwcm94aWZ5LFxuICBTdG9yZUluVmFsdWVNb2RlbCxcbiAgVmFsdWVNb2RlbFxufSBmcm9tIFwiQGNvb2xvbi9wZWN0aW5cIjtcbmltcG9ydCB7VGFibGVWaXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZX0gZnJvbSBcIm5nLXRhYmxlLXZpcnR1YWwtc2Nyb2xsXCI7XG5pbXBvcnQge1Jlc2l6ZUF3YXJlQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vLi4vcmVzaXplLWF3YXJlLmNvbXBvbmVudFwiO1xuaW1wb3J0IHtBYnN0cmFjdFRhYmxlTW9kZWx9IGZyb20gXCIuLi8uLi9hYnN0cmFjdC10YWJsZS1tb2RlbFwiO1xuaW1wb3J0IHR5cGUge0NvbHVtbk1vZGVsfSBmcm9tIFwiLi4vLi4vY29sdW1uL2NvbHVtbi1tb2RlbFwiO1xuaW1wb3J0IHtGb290ZXJSb3dNb2RlbCwgUmVzb2x2ZWRGb290ZXJSb3d9IGZyb20gXCIuLi8uLi9mb290ZXIvZm9vdGVyLXJvdy1tb2RlbFwiO1xuXG5pbXBvcnQge0FVUF9ERVRBQ0hFRF9QQVJFTlRfQ0RSLCBEaXNwb3NhYmxlQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vLi4vZGlzcG9zYWJsZS1jb21wb25lbnRcIjtcblxuZXhwb3J0IGNvbnN0IEFVUF9UQUJMRV9WSVJUVUFMX1NDUk9MTF9CVUZGRVJfTVVMVElQTElFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxudW1iZXI+KFwiQVVQX1RBQkxFX1ZJUlRVQUxfU0NST0xMX0JVRkZFUl9NVUxUSVBMSUVSXCIpXG5leHBvcnQgY29uc3QgQVVQX1RBQkxFX09QVElNSVpFRF9DSEFOR0VfREVURUNUSU9OID0gbmV3IEluamVjdGlvblRva2VuPGJvb2xlYW4+KFwiQVVQX1RBQkxFX09QVElNSVpFRF9DSEFOR0VfREVURUNUSU9OXCIpXG5cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBcIlthdXBUYWJsZVJvd0F0dHJpYnV0ZXNdXCIsXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlUm93QXR0cmlidXRlc0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KClcbiAgYXVwVGFibGVSb3dBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgLyoqIEF0dHJpYnV0ZSBuYW1lcyBhcHBsaWVkIG9uIHRoZSBwcmV2aW91cyBwYXNzLCBzbyBvbmVzIHRoYXQgZGlzYXBwZWFyIGNhbiBiZSByZW1vdmVkLiAqL1xuICBwcml2YXRlIGFwcGxpZWRBdHRyaWJ1dGVOYW1lczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHtcbiAgfVxuXG4gIC8vIFJlLWFwcGx5IG9uIGV2ZXJ5IGNoYW5nZSwgbm90IGp1c3Qgb25jZSBhdCBpbml0OiBhIHJvdydzIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGNoYW5nZSBhZnRlciB0aGVcbiAgLy8gcm93IGhhcyByZW5kZXJlZCAoZS5nLiBhbiBPVEFQIGRldmljZSByb3cgd2hvc2UgZGV2aWNlIHJlY29yZCByZXNvbHZlcyBhZnRlciBpdHMgc2NyYXRjaHBhZCByb3dcbiAgLy8gd2FzIGNyZWF0ZWQpLCBhbmQgdGhlIGVsZW1lbnQgbXVzdCByZWZsZWN0IHRoZSBsYXRlc3QgdmFsdWVzLiBQcmV2aW91c2x5IHRoaXMgaW1wbGVtZW50ZWQgT25Jbml0LFxuICAvLyBzbyB0aGUgYXR0cmlidXRlcyB3ZXJlIGZyb3plbiBhdCByb3ctY3JlYXRpb24gdGltZSBhbmQgd2VudCBzdGFsZSAoZS5nLiBkZXZpY2VIYXJkd2FyZUlkIHN0dWNrIG9uXG4gIC8vIGl0cyBpbml0aWFsIFwidW5kZWZpbmVkXCIpLlxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuYXVwVGFibGVSb3dBdHRyaWJ1dGVzID8/IHt9O1xuICAgIGZvciAoY29uc3QgYXR0ciBvZiB0aGlzLmFwcGxpZWRBdHRyaWJ1dGVOYW1lcykge1xuICAgICAgaWYgKCEoYXR0ciBpbiBuZXh0KSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hcHBsaWVkQXR0cmlidXRlTmFtZXMgPSBPYmplY3Qua2V5cyhuZXh0KTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgb2YgdGhpcy5hcHBsaWVkQXR0cmlidXRlTmFtZXMpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHIsIG5leHRbYXR0cl0pO1xuICAgIH1cbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiYXVwLXRhYmxlLWJvZHlcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi90YWJsZS1ib2R5LmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi90YWJsZS1ib2R5LmNvbXBvbmVudC5zY3NzXCJdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7IHByb3ZpZGU6IEFVUF9ERVRBQ0hFRF9QQVJFTlRfQ0RSLCB1c2VGYWN0b3J5OiAoKSA9PiBpbmplY3QoQVVQX1RBQkxFX09QVElNSVpFRF9DSEFOR0VfREVURUNUSU9OLCB7IG9wdGlvbmFsOiB0cnVlIH0pID8gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSA6IG51bGwgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQm9keUNvbXBvbmVudDxSb3cgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgUmVzaXplQXdhcmVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpIEBQcm94aWZ5KClcbiAgYWNjZXNzb3IgZGF0YSQ6IExpc3RNb2RlbDxSb3c+ID0gcHJveGlmeShMaXN0TW9kZWw8Um93Pik7XG5cbiAgQElucHV0KCkgQFByb3hpZnkoKVxuICBhY2Nlc3NvciB0YWJsZU1vZGVsOiBBYnN0cmFjdFRhYmxlTW9kZWw8Um93PiA9IHByb3hpZnkoQWJzdHJhY3RUYWJsZU1vZGVsPFJvdz4pO1xuXG4gIC8vIEZvb3RlciByb3dzIGFyZSBidWlsdCBvbmNlIGluIHRoZSBUYWJsZU1vZGVsIGJ1aWxkZXIgY2FsbGJhY2ssIHNvIGEgcGxhaW4gaW5wdXQgaXMgZW5vdWdoO1xuICAvLyB0aGUgcGVyLXJvdyBjZWxsIGxheW91dCAoZm9vdGVyUm93RGVmcyQpIGlzIGRlcml2ZWQgcmVhY3RpdmVseSBmcm9tIHRoZSB2aXNpYmxlIGNvbHVtbnMuXG4gIEBJbnB1dCgpXG4gIGZvb3RlclJvd3M6IEZvb3RlclJvd01vZGVsLkltcGxbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIEBQcm94aWZ5KClcbiAgYWNjZXNzb3Igc2hvd0hlYWRlciQ6IFZhbHVlTW9kZWw8Ym9vbGVhbj4gPSBwcm94aWZ5KFZhbHVlTW9kZWw8Ym9vbGVhbj4pO1xuXG4gIEBJbnB1dCgpIEBTdG9yZUluVmFsdWVNb2RlbCgpXG4gIGFjY2Vzc29yIHNob3dIZWFkZXIgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHRyYWNrQnk6IChpbmRleDogbnVtYmVyLCBpdGVtOiBSb3cpID0+IGFueVxuXG4gIEBJbnB1dCgpIEBQcm94aWZ5KClcbiAgYWNjZXNzb3Igc2Nyb2xsTW9kZSQ6IFZhbHVlTW9kZWw8VGFibGVCb2R5Q29tcG9uZW50LlNjcm9sbE1vZGU+ID0gcHJveGlmeShWYWx1ZU1vZGVsPFRhYmxlQm9keUNvbXBvbmVudC5TY3JvbGxNb2RlPik7XG5cbiAgQElucHV0KCkgQFN0b3JlSW5WYWx1ZU1vZGVsKClcbiAgQEhvc3RCaW5kaW5nKFwiYXR0ci5zY3JvbGxNb2RlXCIpXG4gIGFjY2Vzc29yIHNjcm9sbE1vZGU6IFRhYmxlQm9keUNvbXBvbmVudC5TY3JvbGxNb2RlID0gXCJub25lXCI7XG5cbiAgQFZpZXdDaGlsZChDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQpXG4gIHNjcm9sbFZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnRcblxuICBjb2x1bW5zJDogTGlzdE1vZGVsQ2hhaW48Q29sdW1uTW9kZWw8Um93Pj47XG4gIGNvbHVtbklkcyQ6IExpc3RNb2RlbENoYWluPHN0cmluZz47XG4gIGZvb3RlclJvd0RlZnMkOiBWYWx1ZU1vZGVsPFJlc29sdmVkRm9vdGVyUm93W10+O1xuXG4gIHByaXZhdGUgY29sdW1uc0J5SWQkOiBNYXBNb2RlbENoYWluPHN0cmluZywgQ29sdW1uTW9kZWw8Um93Pj47XG5cblxuICAvLyBUT0RPOiBzdXBwb3J0IHVzZXIgZGVmaW5lZCBoZWFkZXIgYW5kIHJvdyBoZWlnaHRzIHZpYSBjc3MgdmFycy5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhlYWRlckhlaWdodCQgPSBuZXcgTXV0YWJsZVZhbHVlTW9kZWw8bnVtYmVyPig0OCk7XG4gIHByb3RlY3RlZCByb3dIZWlnaHQkID0gbmV3IE11dGFibGVWYWx1ZU1vZGVsPG51bWJlcj4oNDQpO1xuXG4gIEBIb3N0QmluZGluZyhcImNsYXNzXCIpXG4gIGJhc2VDc3NDbGFzcyA9IFwiYXVwLXRhYmxlLWNvbXBvbmVudFwiO1xuXG4gIEBIb3N0QmluZGluZyhcImNsYXNzLmF1cC1hbmltYXRpb25zLWRpc2FibGVkXCIpXG4gIGdldCBhbmltYXRpb25zRGlzYWJsZWRDbGFzcygpIHsgcmV0dXJuIHRoaXMuYW5pbWF0aW9uc0Rpc2FibGVkJC52YWx1ZTsgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSB2aXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZSA9IG5ldyBUYWJsZVZpcnR1YWxTY3JvbGxEYXRhU291cmNlPFJvdz4oKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHZpcnR1YWxTY3JvbGxBY3RpdmUkID0gbmV3IE11dGFibGVWYWx1ZU1vZGVsKGZhbHNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFuaW1hdGlvbnNEaXNhYmxlZCQgPSBuZXcgTXV0YWJsZVZhbHVlTW9kZWwoZmFsc2UpO1xuICBwcml2YXRlIHNjcm9sbFRpbWVvdXQ6IGFueTtcbiAgcHJpdmF0ZSBhbmltYXRpb25zUmVzZXRSYWZJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2Nyb2xsRW5kQWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3B0aW1pc2VkQ2hhbmdlRGV0ZWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSB2aWV3SW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbWFya0ZvckNoZWNrKCkge1xuICAgIGlmICh0aGlzLm9wdGltaXNlZENoYW5nZURldGVjdGlvbkVuYWJsZWQpIHtcbiAgICAgIC8vIFRoZSB0YWJsZS1ib2R5IGRldGFjaGVzIGl0cyBvd24gQ0RSIGFuZCBoYXMgbm8gZGV0YWNoZWQgcGFyZW50IChBVVBfREVUQUNIRURfUEFSRU5UX0NEUlxuICAgICAgLy8gdXNlcyBza2lwU2VsZiksIHNvIHRoZSBiYXNlIG1hcmtGb3JDaGVjaygpIHdvdWxkIGNhbGwgY2RyLm1hcmtGb3JDaGVjaygpIHdoaWNoIGlzIGFcbiAgICAgIC8vIG5vLW9wIG9uIGEgZGV0YWNoZWQgdmlldy4gU2NoZWR1bGUgYW4gZXhwbGljaXQgZGV0ZWN0Q2hhbmdlcygpIG9uIG91cnNlbHZlcyBpbnN0ZWFkIHNvXG4gICAgICAvLyB0aGF0IHZpZXdTdGF0ZURlcGVuZHNPbigpIGNvcnJlY3RseSB0cmlnZ2VycyByZS1yZW5kZXJzIChlLmcuIHJvdyBzZWxlY3Rpb24gY2xhc3NlcykuXG4gICAgICBEaXNwb3NhYmxlQ29tcG9uZW50LnNjaGVkdWxlUGFyZW50U3dlZXAodGhpcy5jZHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoQVVQX1RBQkxFX1ZJUlRVQUxfU0NST0xMX0JVRkZFUl9NVUxUSVBMSUVSKSBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgYnVmZmVyTXVsdGlwbGllcjogbnVtYmVyID0gMykge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3Qge2NoYWluLCB3aGVuLCBvYnNlcnZlfSA9IERzbC5kaXNwb3NlV2l0aCh0aGlzKTtcblxuICAgIHRoaXMub3B0aW1pc2VkQ2hhbmdlRGV0ZWN0aW9uRW5hYmxlZCA9IHRoaXMuaW5qZWN0KEFVUF9UQUJMRV9PUFRJTUlaRURfQ0hBTkdFX0RFVEVDVElPTiwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgICBjb25zdCBhY3R1YWxIZWFkZXJIZWlnaHQkID0gY2hhaW4odGhpcy5zaG93SGVhZGVyJCkubWFwKHNob3cgPT4ge1xuICAgICAgcmV0dXJuIHNob3cgPyB0aGlzLmhlYWRlckhlaWdodCQudmFsdWUgOiAwO1xuICAgIH0sIHtkZXBlbmRzT246IHRoaXMuaGVhZGVySGVpZ2h0JH0pO1xuXG5cbiAgICAvLyBwZXJmb3JtYW5jZSBpcyB0ZXJyaWJsZSBpZiB0aGUgZGF0YSBjaGFuZ2VzIHdoaWxlIHdlJ3JlIHNjcm9sbGluZywgc28gd2UgcG9zdHBvbmUgdXBkYXRlcyB1bnRpbFxuICAgIC8vIHNjcm9sbGluZyBzdG9wcy5cbiAgICBjb25zdCBkZWxheWVkRGF0YSQgPSBjaGFpbih0aGlzLmRhdGEkKS5wb3N0cG9uZVdoaWxlKHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSQpXG4gICAgd2hlbihkZWxheWVkRGF0YSQpLmNoYW5nZXMoZGVsYXRlZERhdGEgPT4ge1xuICAgICAgdGhpcy5hbmltYXRpb25zRGlzYWJsZWQkLnZhbHVlID0gdHJ1ZTtcbiAgICAgIC8vIFVwZGF0ZSB0aGUgQ0RLIGRhdGEgc291cmNlIGJlZm9yZSBkZXRlY3RDaGFuZ2VzIHNvIHRoYXQgYm90aCB0aGUgZXhwbGljaXQgZGV0ZWN0Q2hhbmdlc1xuICAgICAgLy8gYW5kIGFueSBzdWJzZXF1ZW50IFNXRUVQLXRyaWdnZXJlZCBkZXRlY3RDaGFuZ2VzIHNlZSB0aGUgc2FtZSBkYXRhLiBJZiB3ZSB1cGRhdGUgYWZ0ZXIsXG4gICAgICAvLyB0aGUgU1dFRVAncyBkZXRlY3RDaGFuZ2VzIHNlZXMgZGlmZmVyZW50IHJvdyBvYmplY3RzIGFuZCB0cmlnZ2VycyBhIHNlY29uZCBjYXNjYWRlLlxuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZS5kYXRhID0gZGVsYXRlZERhdGE7XG4gICAgICAvLyBXaXRoIGRldGFjaGVkIENELCBtYXJrRm9yQ2hlY2soKSBhbG9uZSB3b24ndCBwdXNoIFtALmRpc2FibGVkXT1cInRydWVcIiB0byB0aGUgRE9NLlxuICAgICAgLy8gRGV0ZWN0IHN5bmNocm9ub3VzbHkgc28gQ0RLIHJlbmRlcnMgbmV3IHJvd3Mgd2l0aCBhbmltYXRpb25zIGFscmVhZHkgc3VwcHJlc3NlZC5cbiAgICAgIC8vIGFuaW1hdGlvbnNEaXNhYmxlZCQudmFsdWUgaXMgYWxyZWFkeSB0cnVlIChzZXQgYWJvdmUpLCBzbyB0aGUgdGVtcGxhdGUgZXZhbHVhdGlvblxuICAgICAgLy8gaW4gdGhpcyBkZXRlY3RDaGFuZ2VzIHdpbGwgc2VlIFtALmRpc2FibGVkXT1cInRydWVcIiBiZWZvcmUgYW55IG5ldyByb3dzIGFyZSBjcmVhdGVkLlxuICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUge2luaXRpYWxWYWx1ZTpcImV2YWx1YXRlXCJ9IGZpcmluZyBkdXJpbmcgY29uc3RydWN0aW9uIGJlZm9yZSB0aGUgdmlldyBleGlzdHMuXG4gICAgICBpZiAodGhpcy5vcHRpbWlzZWRDaGFuZ2VEZXRlY3Rpb25FbmFibGVkICYmIHRoaXMudmlld0luaXRpYWxpemVkKSB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2NoZWR1bGVUYWJsZUhlaWdodENoZWNrKCk7XG4gICAgICB0aGlzLnJlc2V0QW5pbWF0aW9uc0FmdGVyRnJhbWUoKTtcbiAgICB9LCB7aW5pdGlhbFZhbHVlOiBcImV2YWx1YXRlXCJ9KVxuXG5cbiAgICB0aGlzLm9uSW5pdCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbHVtbnMkID0gY2hhaW4odGhpcy50YWJsZU1vZGVsLnZpc2libGVDb2x1bW5zJCk7XG4gICAgICB0aGlzLmNvbHVtbklkcyQgPSBjaGFpbih0aGlzLmNvbHVtbnMkKS5wbHVjayhcImNvbHVtbklkXCIpO1xuICAgICAgdGhpcy5jb2x1bW5zQnlJZCQgPSBjaGFpbih0aGlzLmNvbHVtbnMkKS5pbmRleEJ5KCdjb2x1bW5JZCcpO1xuICAgICAgdGhpcy5mb290ZXJSb3dEZWZzJCA9IGNoYWluKHRoaXMuY29sdW1uSWRzJCkucmVkdWNlQWxsKGlkcyA9PlxuICAgICAgICAodGhpcy5mb290ZXJSb3dzID8/IFtdKS5tYXAoKHJvdywgaSkgPT4gcm93LnJlc29sdmUoaSwgWy4uLmlkc10pKVxuICAgICAgKTtcbiAgICAgIHRoaXMudmlld1N0YXRlRGVwZW5kc09uKHRoaXMudGFibGVNb2RlbC5maWx0ZXJlZFJvd3MkLCB0aGlzLnRhYmxlTW9kZWwudmlzaWJsZUNvbHVtbnMkLCB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUkLCB0aGlzLmFuaW1hdGlvbnNEaXNhYmxlZCQsIHRoaXMudGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zJCwgdGhpcy5mb290ZXJSb3dEZWZzJClcbiAgICB9KTtcblxuICB9XG5cbiAgb3ZlcnJpZGUgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuICAgIHRoaXMudmlld0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5zY3JvbGxWaWV3cG9ydCkge1xuICAgICAgY29uc3Qge29ic2VydmV9ID0gRHNsLmRpc3Bvc2VXaXRoKHRoaXMpO1xuICAgICAgdGhpcy5zY3JvbGxWaWV3cG9ydC5lbGVtZW50U2Nyb2xsZWQoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5ub3RpZnlTY3JvbGxlZCgpKTtcbiAgICAgIHRoaXMuc2Nyb2xsRW5kQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgdGhpcy5zY3JvbGxWaWV3cG9ydC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ3Njcm9sbGVuZCcsXG4gICAgICAgICgpID0+IHRoaXMubm90aWZ5U2Nyb2xsRW5kZWQoKSxcbiAgICAgICAge3Bhc3NpdmU6IHRydWUsIHNpZ25hbDogdGhpcy5zY3JvbGxFbmRBYm9ydENvbnRyb2xsZXIuc2lnbmFsfVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW1pc2VkQ2hhbmdlRGV0ZWN0aW9uRW5hYmxlZCkge1xuICAgICAgdGhpcy5jZHIuZGV0YWNoKCk7XG4gICAgICBpZiAodGhpcy5zY3JvbGxWaWV3cG9ydCkge1xuICAgICAgICB0aGlzLnNjcm9sbFZpZXdwb3J0LnJlbmRlcmVkUmFuZ2VTdHJlYW0uc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAvLyBEZWZlciBwYXN0IHRoZSBjdXJyZW50IHN5bmMgYmF0Y2ggc28gdGhlIGRhdGEgc291cmNlIGhhcyB1cGRhdGVkIF9yZW5kZXJlZEl0ZW1zIGJlZm9yZSB3ZSBydW4gQ0QuXG4gICAgICAgICAgLy8gTXVzdCBjYWxsIGRldGVjdENoYW5nZXMoKSBkaXJlY3RseSDigJQgbWFya0ZvckNoZWNrKCkgYWxvbmUgZG9lcyBub3RoaW5nIG9uIGEgZGV0YWNoZWQgdmlldy5cbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBFeHRlbmQgdGhlIGFuaW1hdGlvbiBzdXBwcmVzc2lvbiB3aW5kb3cgb24gZWFjaCBDREsgcmFuZ2UgY2hhbmdlIHNvIGFuaW1hdGlvbnMgY2FuJ3RcbiAgICAgICAgICAvLyBmaXJlIG1pZC1yZW5kZXIgcmVnYXJkbGVzcyBvZiBob3cgbWFueSBmcmFtZXMgdGhlIHJhbmdlIHVwZGF0ZSBzcGFucy5cbiAgICAgICAgICBpZiAodGhpcy5hbmltYXRpb25zRGlzYWJsZWQkLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0QW5pbWF0aW9uc0FmdGVyRnJhbWUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gRGVmZXIgcGFzdCB0aGUgY3VycmVudCB0aWNrIHNvIHRoZSB2aWV3cG9ydCdzIGluaXRpYWwgcmVuZGVyZWQgcmFuZ2UgaXMgc3RhYmxlXG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3MuaGlkZS1oZWFkZXJcIilcbiAgZ2V0IGhpZGVIZWFkZXIoKSB7XG4gICAgcmV0dXJuICF0aGlzLnNob3dIZWFkZXI7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoXCJzdHlsZS4tLWF1cC10YWJsZS1oZWFkZXItaGVpZ2h0XCIpXG4gIGdldCBoZWFkZXJIZWlnaHRDc3NWYXIoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuaGVhZGVySGVpZ2h0JC52YWx1ZX1weGBcbiAgfVxuXG4gIEBIb3N0QmluZGluZyhcInN0eWxlLi0tYXVwLXRhYmxlLXJvdy1oZWlnaHRcIilcbiAgZ2V0IHJvd0hlaWdodENzc1ZhcigpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5yb3dIZWlnaHQkLnZhbHVlfXB4YFxuICB9XG5cbiAgbm90aWZ5Q2VsbENsaWNrZWQoY29sdW1uTW9kZWw6IENvbHVtbk1vZGVsPFJvdz4sIHJvdzogUm93KSB7XG4gICAgdGhpcy50YWJsZU1vZGVsLl9ub3RpZnlDZWxsQ2xpY2tlZChjb2x1bW5Nb2RlbCwgcm93KTtcbiAgfVxuXG4gIC8vIEBUcmFjZSgpXG5cbiAgaXNGaXJzdFZpc2libGVDb2x1bW4oY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhYmxlTW9kZWwuZmlyc3RWaXNpYmxlQ29sdW1uJC5xdWVyeSgpLnZhbHVlPy5jb2x1bW5JZCA9PT0gY29sdW1uSWQ7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuXG4gIGlzTGFzdFZpc2libGVDb2x1bW4oY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhYmxlTW9kZWwubGFzdFZpc2libGVDb2x1bW4kLnF1ZXJ5KCkudmFsdWU/LmNvbHVtbklkID09PSBjb2x1bW5JZDtcbiAgfVxuXG4gIGdldENvbHVtbkNsYXNzZXMoY29sdW1uSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNsYXNzZXMgPSBbYGF1cC1jb2wtJHt0aGlzLmNvbHVtbnNCeUlkJC5nZXQoY29sdW1uSWQpLmRhc2hlcmlzZWRDb2x1bW5JZH1gXTtcbiAgICBpZiAodGhpcy5pc0ZpcnN0VmlzaWJsZUNvbHVtbihjb2x1bW5JZCkpIHtcbiAgICAgIGNsYXNzZXMucHVzaChcImZpcnN0LXZpc2libGUtY29sdW1uXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0xhc3RWaXNpYmxlQ29sdW1uKGNvbHVtbklkKSkge1xuICAgICAgY2xhc3Nlcy5wdXNoKFwibGFzdC12aXNpYmxlLWNvbHVtblwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlVGFibGVIZWlnaHRDaGVjayh3YWl0TWlsbGlzID0gNTApIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIFVzZSBDREsncyBpbnRlcm5hbCByZW5kZXJlZCByYW5nZSB0byBkZXRlY3QgYSBicm9rZW4gdmlydHVhbCBzY3JvbGwgc3RhdGUg4oCUXG4gICAgICAvLyBhdm9pZHMgcmVhZGluZyBvZmZzZXRIZWlnaHQgKGZvcmNlZCBsYXlvdXQpIGFuZCBkaXNwYXRjaGluZyBhIGdsb2JhbCByZXNpemUgZXZlbnRcbiAgICAgIC8vICh3aGljaCB0cmlnZ2VycyBBbmd1bGFyJ3MgYW5pbWF0aW9uIGVuZ2luZSB0byBjYWxsIGdldENvbXB1dGVkU3R5bGUgb24gYWxsIGVsZW1lbnRzKS5cbiAgICAgIGNvbnN0IHJlbmRlcmVkUmFuZ2UgPSB0aGlzLnNjcm9sbFZpZXdwb3J0Py5nZXRSZW5kZXJlZFJhbmdlKCk7XG4gICAgICAvLyBBIHVzYWJsZSB2aXJ0dWFsIHZpZXdwb3J0IHJlbmRlcnMgbW9yZSB0aGFuIG9uZSByb3cgd2hlbmV2ZXIgbW9yZSBkYXRhIGV4aXN0cy4gUmVuZGVyaW5nXG4gICAgICAvLyBub25lIG9yIG9uZSByb3cgYXQgdGhlIHRvcCB3aGlsZSBkYXRhJCBob2xkcyBtb3JlIG1lYW5zIHRoZSB2aWV3cG9ydCBtZWFzdXJlZCBhXG4gICAgICAvLyBjb2xsYXBzZWQvc3RhbGUgaGVpZ2h0IChlLmcuIGl0IHdhcyBtZWFzdXJlZCBiZWZvcmUgdGhlIHRhYmxlIHdhcyBzaXplZCB1cCwgdGhlbiBuZXZlclxuICAgICAgLy8gcmUtbWVhc3VyZWQgdW5kZXIgZGV0YWNoZWQgY2hhbmdlIGRldGVjdGlvbikg4oCUIHNvIHJlLW1lYXN1cmUgdG8gZXhwYW5kIHRoZSByZW5kZXJlZCByYW5nZS5cbiAgICAgIC8vIENvdmVycyBib3RoIHRoZSB6ZXJvLXJvdyBjb2xsYXBzZSBhbmQgdGhlIHBhcnRpYWwgKG9uZS1yb3cpIHVuZGVyLXJlbmRlci4gRGV0ZWN0aW9uIHN0YXlzXG4gICAgICAvLyBsYXlvdXQtZnJlZSAoZ2V0UmVuZGVyZWRSYW5nZSBvbmx5KTsgY29ycmVjdGx5LXNpemVkIGFuZCBnZW51aW5lbHktdmlydHVhbGlzZWQgbGFyZ2VcbiAgICAgIC8vIHRhYmxlcyByZW5kZXIgbWFueSByb3dzLCBzbyB0aGV5IG5ldmVyIHJlYWNoIHRoZSBjaGVja1ZpZXdwb3J0U2l6ZSgpIHJlZmxvdyBiZWxvdy5cbiAgICAgIGNvbnN0IHJlbmRlcmVkQ291bnQgPSByZW5kZXJlZFJhbmdlICE9IG51bGwgPyByZW5kZXJlZFJhbmdlLmVuZCAtIHJlbmRlcmVkUmFuZ2Uuc3RhcnQgOiAwO1xuICAgICAgY29uc3QgdW5kZXJSZW5kZXJlZCA9IHJlbmRlcmVkUmFuZ2UgIT0gbnVsbCAmJiByZW5kZXJlZFJhbmdlLnN0YXJ0ID09PSAwICYmIHJlbmRlcmVkQ291bnQgPD0gMTtcbiAgICAgIGlmICh1bmRlclJlbmRlcmVkICYmIHRoaXMuZGF0YSQubGVuZ3RoID4gcmVuZGVyZWRDb3VudCkge1xuICAgICAgICB0aGlzLnNjcm9sbFZpZXdwb3J0Py5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICBpZiAod2FpdE1pbGxpcyA8IDUwMCkge1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGVUYWJsZUhlaWdodENoZWNrKHdhaXRNaWxsaXMgKyA1MCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB3YWl0TWlsbGlzKVxuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlTY3JvbGxlZCgpIHtcbiAgICB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUkLnZhbHVlID0gdHJ1ZTtcbiAgICB0aGlzLmFuaW1hdGlvbnNEaXNhYmxlZCQudmFsdWUgPSB0cnVlO1xuICAgIC8vIFN5bmMgdGhlIFtALmRpc2FibGVkXT1cInRydWVcIiB0byB0aGUgRE9NIGltbWVkaWF0ZWx5IHNvIENESydzIHBlbmRpbmcgcmFuZ2VcbiAgICAvLyB1cGRhdGUgKHdoaWNoIGlzIHNjaGVkdWxlZCBhc3luYykgc2VlcyBhbmltYXRpb25zIHN1cHByZXNzZWQgd2hlbiBpdCByZW5kZXJzIHJvd3MuXG4gICAgaWYgKHRoaXMub3B0aW1pc2VkQ2hhbmdlRGV0ZWN0aW9uRW5hYmxlZCkge1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgICB0aGlzLmNsZWFyU2Nyb2xsVGltZW91dCgpO1xuICAgIHRoaXMuc2Nyb2xsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5ub3RpZnlTY3JvbGxFbmRlZCgpLCAxMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlTY3JvbGxFbmRlZCgpIHtcbiAgICB0aGlzLmNsZWFyU2Nyb2xsVGltZW91dCgpO1xuICAgIHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSQudmFsdWUgPSBmYWxzZTtcbiAgICB0aGlzLnJlc2V0QW5pbWF0aW9uc0FmdGVyRnJhbWUoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc2Nyb2xsRW5kQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0QW5pbWF0aW9uc0FmdGVyRnJhbWUoKSB7XG4gICAgLy8gQ2FuY2VsIGFueSBwZW5kaW5nIHJlc2V0IHNvIHJhcGlkIGRhdGEgY2hhbmdlcyBkb24ndCByZS1lbmFibGUgYW5pbWF0aW9ucyBtaWQtcmVuZGVyLlxuICAgIGlmICh0aGlzLmFuaW1hdGlvbnNSZXNldFJhZklkICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbnNSZXNldFJhZklkKTtcbiAgICB9XG4gICAgLy8gUmUtZW5hYmxlIGFmdGVyIHRoZSBuZXh0IGZyYW1lOiBieSB0aGVuIENESyBoYXMgY3JlYXRlZCByb3dzIGFuZCBDRCBoYXMgcnVuLFxuICAgIC8vIHNvIDplbnRlciBhbmltYXRpb25zIHdvbid0IGZpcmUgb24gdGhlIG5ld2x5IGNyZWF0ZWQgcm93IGNvbXBvbmVudHMuXG4gICAgdGhpcy5hbmltYXRpb25zUmVzZXRSYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLmFuaW1hdGlvbnNSZXNldFJhZklkID0gbnVsbDtcbiAgICAgIHRoaXMuYW5pbWF0aW9uc0Rpc2FibGVkJC52YWx1ZSA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMub3B0aW1pc2VkQ2hhbmdlRGV0ZWN0aW9uRW5hYmxlZCkge1xuICAgICAgICAvLyBkZXRlY3RDaGFuZ2VzKCkgZGlyZWN0bHkg4oCUIG1hcmtGb3JDaGVjaygpIGRvZXMgbm90aGluZyBvbiBhIGRldGFjaGVkIHZpZXcuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTY3JvbGxUaW1lb3V0KCkge1xuICAgIGlmICh0aGlzLnNjcm9sbFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbFRpbWVvdXQpO1xuICAgIH1cbiAgfVxuXG59XG5cblxuZXhwb3J0IG5hbWVzcGFjZSBUYWJsZUJvZHlDb21wb25lbnQge1xuICBleHBvcnQgdHlwZSBTY3JvbGxNb2RlID0gXCJub25lXCIgfCBcImNsYXNzaWNcIiB8IFwidmlydHVhbFwiO1xufVxuIiwiXG48ZGl2IGNsYXNzPVwiY2xhc3NpYy1zY3JvbGwtY29udGFpbmVyXCIgKm5nSWY9XCJzY3JvbGxNb2RlJC52YWx1ZSAhPT0gJ3ZpcnR1YWwnXCI+XG4gIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YSQudmFsdWVcIiBbdHJhY2tCeV09XCJ0cmFja0J5XCIgW211bHRpVGVtcGxhdGVEYXRhUm93c10+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1ucyQudmFsdWU7IGluZGV4IGFzIGluZGV4OyBmaXJzdCBhcyBmaXJzdDsgbGFzdCBhcyBsYXN0XCJcbiAgICAgICAgICAgICAgICAgIG1hdENvbHVtbkRlZj1cInt7Y29sdW1uLmNvbHVtbklkfX1cIj5cbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2NsYXNzLmZsZXhdPVwiY29sdW1uLmlzRmxleCgpXCIgW2NsYXNzLmhpZGVdPVwiIWNvbHVtbi5pc1Zpc2libGUoKVwiPlxuICAgICAgICA8YXVwLXRhYmxlLWhlYWRlci1jZWxsIFtjb2x1bW5dPVwiJGFueShjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pZF09XCJjb2x1bW4uY29sdW1uSWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXRDb2x1bW5DbGFzc2VzKGNvbHVtbi5jb2x1bW5JZClcIlxuICAgICAgICA+PC9hdXAtdGFibGUtaGVhZGVyLWNlbGw+XG4gICAgICA8L3RoPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIChjbGljayk9XCJub3RpZnlDZWxsQ2xpY2tlZChjb2x1bW4sIHJvdylcIlxuICAgICAgICAgIFtjbGFzcy5lbmFibGUtY3Vyc29yXT1cInRhYmxlTW9kZWwuaXNDdXJzb3JFbmFibGVkKGNvbHVtbilcIlxuICAgICAgICAgIFtjbGFzcy5mbGV4XT1cImNvbHVtbi5pc0ZsZXgoKVwiXG4gICAgICAgICAgW2NsYXNzLmhpZGVdPVwiIWNvbHVtbi5pc1Zpc2libGUoKVwiXG4gICAgICA+XG4gICAgICAgIDxhdXAtdGFibGUtY2VsbCBbY29sdW1uXT1cIiRhbnkoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGFibGVNb2RlbF09XCIkYW55KHRhYmxlTW9kZWwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taWRdPVwiY29sdW1uLmNvbHVtbklkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXRDb2x1bW5DbGFzc2VzKGNvbHVtbi5jb2x1bW5JZClcIlxuICAgICAgICA+PC9hdXAtdGFibGUtY2VsbD5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImNvbHVtbklkcyQudmFsdWU7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XG4gICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGNvbHVtbklkcyQudmFsdWU7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICBbbmdDbGFzc109XCJ0YWJsZU1vZGVsLmdldFJvd0NsYXNzZXMocm93KVwiXG4gICAgICAgIFtjbGFzcy5lbmFibGUtaG92ZXJdPVwidGFibGVNb2RlbC5pc0hvdmVyRW5hYmxlZCgpXCJcbiAgICAgICAgW2F1cFRhYmxlUm93QXR0cmlidXRlc109XCJ0YWJsZU1vZGVsLmdldFJvd0F0dHJpYnV0ZXMocm93KVwiXG4gICAgICAgIFthdHRyLmF1cC1yb3ctaWRdPVwidHJhY2tCeShpLCByb3cpXCJcbiAgICA+PC90cj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZvb3RlciBvZiBmb290ZXJSb3dEZWZzJC52YWx1ZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2VsbCBvZiBmb290ZXIuY2VsbHNcIiBbbWF0Q29sdW1uRGVmXT1cImNlbGwuZGVmSWRcIj5cbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBbYXR0ci5jb2xzcGFuXT1cImNlbGwuY29sc3BhblwiXG4gICAgICAgICAgICBbYXR0ci5jb2x1bW4taWRdPVwiY2VsbC5jb2x1bW5JZFwiIGNsYXNzPVwiZm9vdGVyLWNlbGxcIj5cbiAgICAgICAgICA8YXVwLXRhYmxlLWZvb3Rlci1yb3cgKm5nSWY9XCIhY2VsbC5maWxsZXJcIiBbY2VsbF09XCJjZWxsXCI+PC9hdXAtdGFibGUtZm9vdGVyLXJvdz5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHRyIG1hdC1mb290ZXItcm93ICptYXRGb290ZXJSb3dEZWY9XCJmb290ZXIuZGVmSWRzOyBzdGlja3k6IHRydWVcIiBbbmdDbGFzc109XCJmb290ZXIucm93Q2xhc3Nlc1wiPjwvdHI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgPC90YWJsZT5cbjwvZGl2PlxuXG48Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0ICAqbmdJZj1cInNjcm9sbE1vZGUkLnZhbHVlID09PSAndmlydHVhbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0AuZGlzYWJsZWRdPVwiYW5pbWF0aW9uc0Rpc2FibGVkJC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHZzSXRlbVNpemVdPVwicm93SGVpZ2h0JC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGVhZGVySGVpZ2h0XT1cImhlYWRlckhlaWdodCQudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvb3RlckVuYWJsZWRdPVwiKGZvb3RlclJvd0RlZnMkPy52YWx1ZT8ubGVuZ3RoID8/IDApID4gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9vdGVySGVpZ2h0XT1cIjQ4ICogKGZvb3RlclJvd0RlZnMkPy52YWx1ZT8ubGVuZ3RoID8/IDApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtidWZmZXJNdWx0aXBsaWVyXT1cImJ1ZmZlck11bHRpcGxpZXJcIlxuPlxuICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cInZpcnR1YWxTY3JvbGxEYXRhU291cmNlXCIgW3RyYWNrQnldPVwidHJhY2tCeVwiPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnMkLnZhbHVlOyBpbmRleCBhcyBpbmRleDsgZmlyc3QgYXMgZmlyc3Q7IGxhc3QgYXMgbGFzdFwiXG4gICAgICAgICAgICAgICAgICBtYXRDb2x1bW5EZWY9XCJ7e2NvbHVtbi5jb2x1bW5JZH19XCI+XG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtjbGFzcy5mbGV4XT1cImNvbHVtbi5pc0ZsZXgoKVwiIFtjbGFzcy5oaWRlXT1cIiFjb2x1bW4uaXNWaXNpYmxlKClcIj5cbiAgICAgICAgPGF1cC10YWJsZS1oZWFkZXItY2VsbCBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWluZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taWRdPVwiY29sdW1uLmNvbHVtbklkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3Nlcyhjb2x1bW4uY29sdW1uSWQpXCJcbiAgICAgICAgPjwvYXVwLXRhYmxlLWhlYWRlci1jZWxsPlxuICAgICAgPC90aD5cbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiAoY2xpY2spPVwibm90aWZ5Q2VsbENsaWNrZWQoY29sdW1uLCByb3cpXCJcbiAgICAgICAgICBbY2xhc3MuZW5hYmxlLWN1cnNvcl09XCJ0YWJsZU1vZGVsLmlzQ3Vyc29yRW5hYmxlZChjb2x1bW4pXCJcbiAgICAgICAgICBbY2xhc3MuZmxleF09XCJjb2x1bW4uaXNGbGV4KClcIlxuICAgICAgICAgIFtjbGFzcy5oaWRlXT1cIiFjb2x1bW4uaXNWaXNpYmxlKClcIlxuICAgICAgPlxuICAgICAgICA8YXVwLXRhYmxlLWNlbGwgW2NvbHVtbl09XCIkYW55KGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RhYmxlTW9kZWxdPVwiJGFueSh0YWJsZU1vZGVsKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWlkXT1cImNvbHVtbi5jb2x1bW5JZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3Nlcyhjb2x1bW4uY29sdW1uSWQpXCJcbiAgICAgICAgPjwvYXVwLXRhYmxlLWNlbGw+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJjb2x1bW5JZHMkLnZhbHVlOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBjb2x1bW5JZHMkLnZhbHVlOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgW25nQ2xhc3NdPVwidGFibGVNb2RlbC5nZXRSb3dDbGFzc2VzKHJvdylcIlxuICAgICAgICBbY2xhc3MuZW5hYmxlLWhvdmVyXT1cInRhYmxlTW9kZWwuaXNIb3ZlckVuYWJsZWQoKVwiXG4gICAgICAgIFthdXBUYWJsZVJvd0F0dHJpYnV0ZXNdPVwidGFibGVNb2RlbC5nZXRSb3dBdHRyaWJ1dGVzKHJvdylcIlxuICAgICAgICBbYXR0ci5hdXAtcm93LWlkXT1cInRyYWNrQnkoaSwgcm93KVwiXG4gICAgPjwvdHI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmb290ZXIgb2YgZm9vdGVyUm93RGVmcyQudmFsdWVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNlbGwgb2YgZm9vdGVyLmNlbGxzXCIgW21hdENvbHVtbkRlZl09XCJjZWxsLmRlZklkXCI+XG4gICAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWYgW2F0dHIuY29sc3Bhbl09XCJjZWxsLmNvbHNwYW5cIlxuICAgICAgICAgICAgW2F0dHIuY29sdW1uLWlkXT1cImNlbGwuY29sdW1uSWRcIiBjbGFzcz1cImZvb3Rlci1jZWxsXCI+XG4gICAgICAgICAgPGF1cC10YWJsZS1mb290ZXItcm93ICpuZ0lmPVwiIWNlbGwuZmlsbGVyXCIgW2NlbGxdPVwiY2VsbFwiPjwvYXVwLXRhYmxlLWZvb3Rlci1yb3c+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDx0ciBtYXQtZm9vdGVyLXJvdyAqbWF0Rm9vdGVyUm93RGVmPVwiZm9vdGVyLmRlZklkczsgc3RpY2t5OiB0cnVlXCIgW25nQ2xhc3NdPVwiZm9vdGVyLnJvd0NsYXNzZXNcIj48L3RyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgPC90YWJsZT5cbjwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuXG4iXX0=
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdWktcG93ZXJ1cHMvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlcy9yZW5kZXJlci90YWJsZS1ib2R5L3RhYmxlLWJvZHkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXVpLXBvd2VydXBzL3NyYy9saWIvY29tcG9uZW50cy90YWJsZXMvcmVuZGVyZXIvdGFibGUtYm9keS90YWJsZS1ib2R5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQVUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzlHLE9BQU8sRUFDTCxHQUFHLEVBQ0gsU0FBUyxFQUdULGlCQUFpQixFQUNqQixPQUFPLEVBQ1AsT0FBTyxFQUNQLGlCQUFpQixFQUNqQixVQUFVLEVBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7O0FBUTlELE1BQU0sT0FBTyxrQkFBd0IsU0FBUSxvQkFBb0I7SUFHdEQsMEJBQVEsT0FBTyxDQUFDLENBQUEsU0FBYyxDQUFBLENBQUMsQ0FBQztJQUFoQyxJQUFBLEtBQUssMkNBQTJCO0lBQWhDLElBQUEsS0FBSyxpREFBMkI7SUFHaEMsK0JBQWEsT0FBTyxDQUFDLENBQUEsa0JBQXVCLENBQUEsQ0FBQyxDQUFDO0lBQTlDLElBQUEsVUFBVSxnREFBb0M7SUFBOUMsSUFBQSxVQUFVLHNEQUFvQztJQUc5QyxnQ0FBYyxPQUFPLENBQUMsQ0FB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QUFFOzsrQ0FDc0I7QUFHaEM7SUFEQyxPQUFPLEVBQUU7O29EQUNvQztBQUc5QztJQURDLE9BQU8sRUFBRTs7cURBQ2lDO0FBRzNDO0lBREMsaUJBQWlCLEVBQUU7O29EQUNGOzJGQVpoQixrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsZ0JBQWdCO3NIQU9qQixLQUFLO3NCQURiLEtBQUs7Z0JBSUcsVUFBVTtzQkFEbEIsS0FBSztnQkFJRyxXQUFXO3NCQURuQixLQUFLO2dCQUlHLFVBQVU7c0JBRGxCLEtBQUs7Z0JBSUcsZUFBZTtzQkFEdkIsTUFBTTtnQkFJUCxPQUFPO3NCQUROLEtBQUs7Z0JBVU4sZUFBZTtzQkFGZCxLQUFLOztzQkFDTCxXQUFXO3VCQUFDLHdCQUF3QjtnQkFlckMsWUFBWTtzQkFEWCxXQUFXO3VCQUFDLE9BQU87Z0JBZ0NoQixVQUFVO3NCQURiLFdBQVc7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBOZ1pvbmUsIE9uSW5pdCwgT3V0cHV0fSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgRHNsLFxuICBMaXN0TW9kZWwsXG4gIExpc3RNb2RlbENoYWluLFxuICBNYXBNb2RlbENoYWluLFxuICBNdXRhYmxlVmFsdWVNb2RlbCxcbiAgUHJveGlmeSxcbiAgcHJveGlmeSxcbiAgU3RvcmVJblZhbHVlTW9kZWwsXG4gIFZhbHVlTW9kZWxcbn0gZnJvbSBcIkBjb29sb24vcGVjdGluXCI7XG5pbXBvcnQge1Jlc2l6ZUF3YXJlQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vLi4vcmVzaXplLWF3YXJlLmNvbXBvbmVudFwiO1xuaW1wb3J0IHtBYnN0cmFjdFRhYmxlTW9kZWx9IGZyb20gXCIuLi8uLi9hYnN0cmFjdC10YWJsZS1tb2RlbFwiO1xuaW1wb3J0IHtDb2x1bW5Nb2RlbH0gZnJvbSBcIi4uLy4uL2NvbHVtbi9jb2x1bW4tbW9kZWxcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImF1cC10YWJsZS1ib2R5XCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vdGFibGUtYm9keS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vdGFibGUtYm9keS5jb21wb25lbnQuc2Nzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVCb2R5Q29tcG9uZW50PFJvdz4gZXh0ZW5kcyBSZXNpemVBd2FyZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgQFByb3hpZnkoKVxuICBhY2Nlc3NvciBkYXRhJCA9IHByb3hpZnkoTGlzdE1vZGVsPFJvdz4pO1xuXG4gIEBJbnB1dCgpIEBQcm94aWZ5KClcbiAgYWNjZXNzb3IgdGFibGVNb2RlbCA9IHByb3hpZnkoQWJzdHJhY3RUYWJsZU1vZGVsPFJvdz4pO1xuXG4gIEBJbnB1dCgpIEBQcm94aWZ5KClcbiAgYWNjZXNzb3Igc2hvd0hlYWRlciQgPSBwcm94aWZ5KFZhbHVlTW9kZWw8Ym9vbGVhbj4pO1xuXG4gIEBJbnB1dCgpIEBTdG9yZUluVmFsdWVNb2RlbCgpXG4gIGFjY2Vzc29yIHNob3dIZWFkZXIgPSB0cnVlO1xuXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSB2aXNpYmxlUm93Q291bnQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBASW5wdXQoKVxuICB0cmFja0J5OiAoaW5kZXg6IG51bWJlciwgaXRlbTogUm93KSA9PiBhbnlcblxuICAvKipcbiAgICogU2V0IHRvIHRydWUgdG8gZW5hYmxlIHNjcm9sbGluZy4gIE9uY2UgZW5hYmxlZCB0aGUgdGFibGUgd2lsbCBoYXZlIDAgaW1wbGljaXQgaGVpZ2h0LiAgWW91IHdpbGwgZWl0aGVyXG4gICAqIG5lZWQgdG8gc2V0IGl0IGV4cGxpY2l0bHkgZS5nLiBoZWlnaHQ6IDQwMHB4OyBvciBieSB1c2luZyBmbGV4IG9yIGdyaWQgbGF5b3V0IHRvIG1ha2UgaXQgZmlsbCBpdCdzXG4gICAqIGNvbnRhaW5tZW50IGFyZWEuXG4gICAqL1xuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoXCJjbGFzcy5lbmFibGUtc2Nyb2xsaW5nXCIpXG4gIGVuYWJsZVNjcm9sbGluZyA9IGZhbHNlO1xuXG4gIGNvbHVtbnM6IExpc3RNb2RlbENoYWluPENvbHVtbk1vZGVsPFJvdz4+O1xuICBjb2x1bW5JZHM6IExpc3RNb2RlbENoYWluPHN0cmluZz47XG4gIHByaXZhdGUgY29sdW1uc0J5SWQ6IE1hcE1vZGVsQ2hhaW48c3RyaW5nLCBDb2x1bW5Nb2RlbDxSb3c+PjtcblxuICByZWFkb25seSBfdmlzaWJsZVJvd0NvdW50OiBWYWx1ZU1vZGVsPG51bWJlcj47XG5cblxuICAvLyBUT0RPOiBzdXBwb3J0IHVzZXIgZGVmaW5lZCBoZWFkZXIgYW5kIHJvdyBoZWlnaHRzIHZpYSBjc3MgdmFycy5cbiAgcHJpdmF0ZSByZWFkb25seSBoZWFkZXJIZWlnaHQgPSBuZXcgTXV0YWJsZVZhbHVlTW9kZWw8bnVtYmVyPig1Nik7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm93SGVpZ2h0ID0gbmV3IE11dGFibGVWYWx1ZU1vZGVsPG51bWJlcj4oNDgpO1xuXG4gIEBIb3N0QmluZGluZyhcImNsYXNzXCIpXG4gIGJhc2VDc3NDbGFzcyA9IFwiYXVwLXRhYmxlLWNvbXBvbmVudFwiO1xuXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIG5nWm9uZTogTmdab25lKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZiwgbmdab25lKTtcbiAgICBjb25zdCB7Y2hhaW4sIHdoZW59ID0gRHNsLmRpc3Bvc2VXaXRoKHRoaXMpO1xuXG4gICAgY29uc3QgYWN0dWFsSGVhZGVySGVpZ2h0ID0gY2hhaW4odGhpcy5zaG93SGVhZGVyJCkubWFwKHNob3cgPT4ge1xuICAgICAgcmV0dXJuIHNob3cgPyB0aGlzLmhlYWRlckhlaWdodC52YWx1ZSA6IDA7XG4gICAgfSwge2RlcGVuZHNPbjogdGhpcy5oZWFkZXJIZWlnaHR9KTtcblxuICAgIHRoaXMuX3Zpc2libGVSb3dDb3VudCA9IGNoYWluKHRoaXMuYm91bmRzTW9kZWwpLm1hcChib3VuZHMgPT4ge1xuICAgICAgLy8gVE9ETzogdGhpcyBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IGFueSBjc3Mgc3R5bGluZyBhZGp1c3RtZW50cyBldGMuICBXaWxsIGludmVzdGlnYXRlIGlmIGl0J3MgYW4gaXNzdWUuXG4gICAgICBjb25zdCByYXdSb3dDb3VudCA9IChib3VuZHMuaGVpZ2h0IC0gYWN0dWFsSGVhZGVySGVpZ2h0LnZhbHVlKSAvIHRoaXMucm93SGVpZ2h0LnZhbHVlO1xuICAgICAgcmV0dXJuIHJhd1Jvd0NvdW50IDwgMSA/IDAgOiBNYXRoLmZsb29yKHJhd1Jvd0NvdW50KTtcbiAgICB9LCB7XG4gICAgICBkZXBlbmRzT246IFthY3R1YWxIZWFkZXJIZWlnaHQsIHRoaXMucm93SGVpZ2h0XSxcbiAgICAgIHBvc3Rwb25lV2hpbGU6IGNoYWluKHRoaXMuYm91bmRzTW9kZWwpLnBsdWNrTnVtZXJpYyhcImhlaWdodFwiKS5pc0xlc3NUaGFuKDEpXG4gICAgfSk7XG5cbiAgICB3aGVuKHRoaXMuX3Zpc2libGVSb3dDb3VudCkuY2hhbmdlcyh2aXNpYmxlUm93cyA9PiB7XG4gICAgICB0aGlzLnZpc2libGVSb3dDb3VudC5lbWl0KHZpc2libGVSb3dzKTtcbiAgICB9LCB7aW5pdGlhbFZhbHVlOiBcInRyaWdnZXJDaGFuZ2VVbmxlc3NOaWxcIn0pO1xuXG4gICAgdGhpcy5vbkluaXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb2x1bW5zID0gY2hhaW4odGhpcy50YWJsZU1vZGVsLmNvbHVtbnMpO1xuICAgICAgdGhpcy5jb2x1bW5JZHMgPSBjaGFpbih0aGlzLmNvbHVtbnMpLnBsdWNrKFwiY29sdW1uSWRcIik7XG4gICAgICB0aGlzLmNvbHVtbnNCeUlkID0gY2hhaW4odGhpcy5jb2x1bW5zKS5pbmRleEJ5KCdjb2x1bW5JZCcpO1xuICAgIH0pXG4gIH1cblxuICBASG9zdEJpbmRpbmcoXCJjbGFzcy5oaWRlLWhlYWRlclwiKVxuICBnZXQgaGlkZUhlYWRlcigpIHtcbiAgICByZXR1cm4gIXRoaXMuc2hvd0hlYWRlcjtcbiAgfVxuXG4gIGlzRWRpdGluZyhyb3c6IFJvdyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMudGFibGVNb2RlbC5nZXRFZGl0U2Vzc2lvbkZvcihyb3cpO1xuICB9XG5cbiAgbm90aWZ5Q2VsbENsaWNrZWQoY29sdW1uTW9kZWw6IENvbHVtbk1vZGVsPFJvdz4sIHJvdzogUm93KSB7XG4gICAgdGhpcy50YWJsZU1vZGVsLl9ub3RpZnlDZWxsQ2xpY2tlZChjb2x1bW5Nb2RlbCwgcm93KTtcbiAgfVxuXG4gIC8vIEBUcmFjZSgpXG4gIGlzRmlyc3RWaXNpYmxlQ29sdW1uKGNvbHVtbklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZU1vZGVsLmZpcnN0VmlzaWJsZUNvbHVtbiQucXVlcnkoKS52YWx1ZT8uY29sdW1uSWQgPT09IGNvbHVtbklkO1xuICB9XG5cbiAgLy8gQFRyYWNlKClcbiAgaXNMYXN0VmlzaWJsZUNvbHVtbihjb2x1bW5JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVNb2RlbC5sYXN0VmlzaWJsZUNvbHVtbiQucXVlcnkoKS52YWx1ZT8uY29sdW1uSWQgPT09IGNvbHVtbklkO1xuICB9XG5cbiAgZ2V0Q29sdW1uQ2xhc3Nlcyhjb2x1bW5JZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY2xhc3NlcyA9IFtgYXVwLWNvbC0ke3RoaXMuY29sdW1uc0J5SWQuZ2V0KGNvbHVtbklkKS5kYXNoZXJpc2VkQ29sdW1uSWR9YF07XG4gICAgaWYgKHRoaXMuaXNGaXJzdFZpc2libGVDb2x1bW4oY29sdW1uSWQpKSB7XG4gICAgICBjbGFzc2VzLnB1c2goXCJmaXJzdC12aXNpYmxlLWNvbHVtblwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNMYXN0VmlzaWJsZUNvbHVtbihjb2x1bW5JZCkpIHtcbiAgICAgIGNsYXNzZXMucHVzaChcImxhc3QtdmlzaWJsZS1jb2x1bW5cIik7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc2VzO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cImRhdGEkLnZhbHVlXCIgW3RyYWNrQnldPVwidHJhY2tCeVwiPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnMudmFsdWU7IGluZGV4IGFzIGluZGV4OyBmaXJzdCBhcyBmaXJzdDsgbGFzdCBhcyBsYXN0XCJcbiAgICAgICAgICAgICAgICAgIG1hdENvbHVtbkRlZj1cInt7Y29sdW1uLmNvbHVtbklkfX1cIj5cbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2NsYXNzLmZsZXhdPVwiY29sdW1uLmlzRmxleCgpXCIgW2NsYXNzLmhpZGVdPVwiIWNvbHVtbi5pc1Zpc2libGUoKVwiPlxuICAgICAgICA8YXVwLXRhYmxlLWhlYWRlci1jZWxsIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pZF09XCJjb2x1bW4uY29sdW1uSWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXRDb2x1bW5DbGFzc2VzKGNvbHVtbi5jb2x1bW5JZClcIlxuICAgICAgICA+PC9hdXAtdGFibGUtaGVhZGVyLWNlbGw+XG4gICAgICA8L3RoPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIChjbGljayk9XCJub3RpZnlDZWxsQ2xpY2tlZChjb2x1bW4sIHJvdylcIlxuICAgICAgICAgIFtjbGFzcy5lbmFibGUtY3Vyc29yXT1cInRhYmxlTW9kZWwuaXNDdXJzb3JFbmFibGVkKGNvbHVtbilcIlxuICAgICAgICAgIFtjbGFzcy5mbGV4XT1cImNvbHVtbi5pc0ZsZXgoKVwiXG4gICAgICAgICAgW2NsYXNzLmhpZGVdPVwiIWNvbHVtbi5pc1Zpc2libGUoKVwiXG4gICAgICA+XG4gICAgICAgIDxhdXAtdGFibGUtY2VsbCBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGFibGVNb2RlbF09XCJ0YWJsZU1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlZGl0U2Vzc2lvbl09XCJ0YWJsZU1vZGVsLmdldEVkaXRTZXNzaW9uRm9yKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWluZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pZF09XCJjb2x1bW4uY29sdW1uSWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzZXMoY29sdW1uLmNvbHVtbklkKVwiXG4gICAgICAgID48L2F1cC10YWJsZS1jZWxsPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29sdW1uSWRzLnZhbHVlOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBjb2x1bW5JZHMudmFsdWU7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICBbbmdDbGFzc109XCJ0YWJsZU1vZGVsLmdldFJvd0NsYXNzZXMocm93KVwiXG4gICAgICAgIFtjbGFzcy5lbmFibGUtaG92ZXJdPVwidGFibGVNb2RlbC5pc0hvdmVyRW5hYmxlZCgpXCJcbiAgICAgICAgW2F0dHIuYXVwLXJvdy1pZF09XCJ0cmFja0J5KGksIHJvdylcIlxuICAgID48L3RyPlxuXG4gIDwvdGFibGU+XG48L2Rpdj5cblxuIl19