@energycap/components 0.41.1-ECAP-27592-angular-17.20241223-1652 → 0.41.1-ECAP-26841-date-input-features.20250106-0847

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 (353) hide show
  1. package/{esm2022 → esm2020}/energycap-components.mjs +4 -4
  2. package/esm2020/lib/components.module.mjs +423 -0
  3. package/esm2020/lib/controls/banner/banner.component.mjs +109 -0
  4. package/esm2020/lib/controls/button/button.component.mjs +106 -0
  5. package/esm2020/lib/controls/button/copy-button-base.directive.mjs +67 -0
  6. package/{esm2022 → esm2020}/lib/controls/button/copy-button.directive.mjs +28 -28
  7. package/esm2020/lib/controls/button/copy-table-button.directive.mjs +43 -0
  8. package/esm2020/lib/controls/calendar/calendar-item.component.mjs +91 -0
  9. package/esm2020/lib/controls/calendar/calendar.component.mjs +248 -0
  10. package/esm2020/lib/controls/calendar/calendar.types.mjs +2 -0
  11. package/esm2020/lib/controls/checkbox/checkbox.component.mjs +140 -0
  12. package/{esm2022 → esm2020}/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +38 -38
  13. package/esm2020/lib/controls/combobox/combobox.component.mjs +879 -0
  14. package/esm2020/lib/controls/date-input/date-input-selection-strategies/date-input-selection-strategy-base.mjs +57 -0
  15. package/esm2020/lib/controls/date-input/date-input-selection-strategies/day-selection-strategy.mjs +62 -0
  16. package/esm2020/lib/controls/date-input/date-input-selection-strategies/last-28-days-selection-strategy.mjs +100 -0
  17. package/esm2020/lib/controls/date-input/date-input-selection-strategies/last-7-days-selection-strategy.mjs +101 -0
  18. package/esm2020/lib/controls/date-input/date-input-selection-strategies/month-selection-strategy.mjs +76 -0
  19. package/esm2020/lib/controls/date-input/date-input-selection-strategies/quarter-selection-strategy.mjs +79 -0
  20. package/esm2020/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.mjs +210 -0
  21. package/esm2020/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.mjs +81 -0
  22. package/esm2020/lib/controls/date-input/date-input.component.mjs +462 -0
  23. package/esm2020/lib/controls/date-input/date-input.types.mjs +44 -0
  24. package/esm2020/lib/controls/dropdown/dropdown.component.mjs +243 -0
  25. package/esm2020/lib/controls/file-upload/file-upload.component.mjs +261 -0
  26. package/esm2020/lib/controls/form-control/form-control.component.mjs +98 -0
  27. package/esm2020/lib/controls/form-control-base.mjs +151 -0
  28. package/esm2020/lib/controls/form-control-label/form-control-label.component.mjs +136 -0
  29. package/esm2020/lib/controls/form-group/form-group.component.mjs +261 -0
  30. package/{esm2022 → esm2020}/lib/controls/help-popover/help-popover.component.mjs +31 -31
  31. package/esm2020/lib/controls/item-picker/item-picker.component.mjs +329 -0
  32. package/{esm2022 → esm2020}/lib/controls/link-button/link-button.component.mjs +11 -11
  33. package/esm2020/lib/controls/menu/menu.component.mjs +485 -0
  34. package/{esm2022 → esm2020}/lib/controls/navigation/link-item.mjs +1 -1
  35. package/esm2020/lib/controls/navigation/nav-group.mjs +39 -0
  36. package/esm2020/lib/controls/navigation/nav-item-active.directive.mjs +92 -0
  37. package/{esm2022 → esm2020}/lib/controls/navigation/nav-item.mjs +1 -1
  38. package/esm2020/lib/controls/numericbox/numericbox.component.mjs +372 -0
  39. package/esm2020/lib/controls/popover/popover.component.mjs +117 -0
  40. package/{esm2022 → esm2020}/lib/controls/radio-button/radio-button-option.mjs +2 -2
  41. package/esm2020/lib/controls/radio-button/radio-button.component.mjs +82 -0
  42. package/esm2020/lib/controls/select/select.component.mjs +88 -0
  43. package/esm2020/lib/controls/tabs/tabs.component.mjs +47 -0
  44. package/esm2020/lib/controls/textbox/textbox.component.mjs +155 -0
  45. package/esm2020/lib/core/cache.service.mjs +105 -0
  46. package/esm2020/lib/core/custom-validators.mjs +29 -0
  47. package/esm2020/lib/core/date-time-helper.mjs +228 -0
  48. package/esm2020/lib/core/error.service.mjs +61 -0
  49. package/esm2020/lib/core/router-helper.service.mjs +111 -0
  50. package/esm2020/lib/core/scroll.service.mjs +89 -0
  51. package/{esm2022 → esm2020}/lib/core/telemetry-tracker.service.mjs +16 -16
  52. package/{esm2022 → esm2020}/lib/core/telemetry.service.mjs +38 -38
  53. package/esm2020/lib/core/validation-message.service.mjs +185 -0
  54. package/{esm2022 → esm2020}/lib/core/validation-patterns.mjs +30 -30
  55. package/esm2020/lib/core/window.service.mjs +186 -0
  56. package/esm2020/lib/display/app-bar/app-bar.component.mjs +46 -0
  57. package/esm2020/lib/display/avatar/avatar.component.mjs +67 -0
  58. package/esm2020/lib/display/avatar/avatar.service.mjs +64 -0
  59. package/esm2020/lib/display/confirm/confirm.component.mjs +168 -0
  60. package/{esm2022 → esm2020}/lib/display/dialog/dialog-content.mjs +1 -1
  61. package/esm2020/lib/display/dialog/dialog-group/dialog-group.component.mjs +63 -0
  62. package/{esm2022 → esm2020}/lib/display/dialog/dialog-types.mjs +76 -76
  63. package/esm2020/lib/display/dialog/dialog.component.mjs +281 -0
  64. package/{esm2022 → esm2020}/lib/display/dialog/dialog.service.mjs +71 -71
  65. package/{esm2022 → esm2020}/lib/display/help/help-types.mjs +1 -1
  66. package/esm2020/lib/display/hierarchy/hierarchy-base.mjs +111 -0
  67. package/{esm2022 → esm2020}/lib/display/hierarchy/hierarchy-mocks.spec.mjs +53 -53
  68. package/esm2020/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +61 -0
  69. package/esm2020/lib/display/item-display/item-display.component.mjs +81 -0
  70. package/esm2020/lib/display/json-display/json-display.component.mjs +47 -0
  71. package/esm2020/lib/display/resizable/resizable-base.mjs +120 -0
  72. package/{esm2022 → esm2020}/lib/display/resizable/resizable.component.mjs +52 -52
  73. package/{esm2022 → esm2020}/lib/display/spinner/spinner.component.mjs +12 -12
  74. package/esm2020/lib/display/splash/splash.component.mjs +42 -0
  75. package/{esm2022 → esm2020}/lib/display/splash/splash.service.mjs +35 -35
  76. package/{esm2022 → esm2020}/lib/display/table/resizable-column.component.mjs +20 -20
  77. package/esm2020/lib/display/table/resizable-table.directive.mjs +227 -0
  78. package/esm2020/lib/display/table/searchable-table.component.mjs +342 -0
  79. package/{esm2022 → esm2020}/lib/display/table/table-detail-row.component.mjs +19 -19
  80. package/esm2020/lib/display/table/table-locked-column.component.mjs +58 -0
  81. package/{esm2022 → esm2020}/lib/display/table/table-master-header-row.component.mjs +14 -14
  82. package/esm2020/lib/display/table/table-master-row.component.mjs +163 -0
  83. package/esm2020/lib/display/table/table-pagination.component.mjs +155 -0
  84. package/esm2020/lib/display/table/table-selectable-row.component.mjs +235 -0
  85. package/esm2020/lib/display/table/table.component.mjs +249 -0
  86. package/esm2020/lib/display/tags/tag.mjs +18 -0
  87. package/esm2020/lib/display/tags/tags.component.mjs +77 -0
  88. package/esm2020/lib/display/toast/toast/toast.component.mjs +77 -0
  89. package/{esm2022 → esm2020}/lib/display/toast/toast-types.mjs +7 -7
  90. package/{esm2022 → esm2020}/lib/display/toast/toast.service.mjs +35 -35
  91. package/esm2020/lib/display/toast/toaster/toaster.component.mjs +114 -0
  92. package/{esm2022 → esm2020}/lib/display/tooltip/tooltip.component.mjs +28 -28
  93. package/{esm2022 → esm2020}/lib/display/tooltip/tooltip.service.mjs +78 -78
  94. package/esm2020/lib/display/tooltip-directive/tooltip.directive.mjs +173 -0
  95. package/{esm2022 → esm2020}/lib/display/tour/tour-types.mjs +33 -33
  96. package/esm2020/lib/display/tour/tour.component.mjs +398 -0
  97. package/esm2020/lib/display/tour/tour.service.mjs +75 -0
  98. package/esm2020/lib/display/tree/tree.component.mjs +135 -0
  99. package/esm2020/lib/display/view-overlay/view-overlay.component.mjs +58 -0
  100. package/esm2020/lib/shared/directives/click-area-for/click-area-for.directive.mjs +32 -0
  101. package/esm2020/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +111 -0
  102. package/esm2020/lib/shared/directives/keyboard-nav-container/keyboard-nav-container.directive.mjs +100 -0
  103. package/esm2020/lib/shared/directives/popup/popup-container.directive.mjs +163 -0
  104. package/esm2020/lib/shared/display/pipes/date-display.pipe.mjs +50 -0
  105. package/esm2020/lib/shared/display/pipes/highlight-text.pipe.mjs +30 -0
  106. package/esm2020/lib/shared/display/pipes/relative-date.pipe.mjs +62 -0
  107. package/esm2020/lib/shared/display/pipes/row-count.pipe.mjs +48 -0
  108. package/esm2020/lib/shared/display/pipes/time-display.pipe.mjs +41 -0
  109. package/esm2020/lib/shared/display.mjs +6 -0
  110. package/esm2020/lib/shared/form-group.helper.mjs +67 -0
  111. package/esm2020/lib/shared/json-helper.mjs +19 -0
  112. package/esm2020/lib/shared/lodash-helper.mjs +51 -0
  113. package/esm2020/lib/shared/page/page-base/page-base.component.mjs +387 -0
  114. package/{esm2022 → esm2020}/lib/shared/page/page-statuses.mjs +22 -22
  115. package/{esm2022 → esm2020}/lib/shared/page/page-title/page-title.component.mjs +23 -23
  116. package/esm2020/lib/shared/page/page-view/page-view.component.mjs +147 -0
  117. package/{esm2022 → esm2020}/lib/shared/testing/copy-button-base-test-injector-factory.spec.mjs +16 -16
  118. package/{esm2022 → esm2020}/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs +16 -16
  119. package/{esm2022 → esm2020}/lib/shared/testing/page-base-component-test-helper.spec.mjs +37 -37
  120. package/esm2020/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +98 -0
  121. package/{esm2022 → esm2020}/lib/shared/testing/public-mocks.spec.mjs +148 -148
  122. package/{esm2022 → esm2020}/lib/shared/testing/spy-factory.spec.mjs +39 -39
  123. package/{esm2022 → esm2020}/lib/shared/testing/translation-mocks.spec.mjs +56 -56
  124. package/{esm2022 → esm2020}/lib/shared/user-preference.service.mjs +17 -17
  125. package/esm2020/lib/shared/wizard/wizard-base/wizard-base.component.mjs +246 -0
  126. package/{esm2022 → esm2020}/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +68 -68
  127. package/{esm2022 → esm2020}/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +18 -18
  128. package/esm2020/public-api.mjs +117 -0
  129. package/fesm2015/energycap-components.mjs +13370 -0
  130. package/fesm2015/energycap-components.mjs.map +1 -0
  131. package/{fesm2022 → fesm2020}/energycap-components.mjs +12971 -11819
  132. package/fesm2020/energycap-components.mjs.map +1 -0
  133. package/index.d.ts +5 -5
  134. package/lib/components.module.d.ts +92 -91
  135. package/lib/controls/banner/banner.component.d.ts +50 -50
  136. package/lib/controls/button/button.component.d.ts +78 -78
  137. package/lib/controls/button/copy-button-base.directive.d.ts +20 -20
  138. package/lib/controls/button/copy-button.directive.d.ts +14 -14
  139. package/lib/controls/button/copy-table-button.directive.d.ts +19 -19
  140. package/lib/controls/calendar/calendar-item.component.d.ts +22 -17
  141. package/lib/controls/calendar/calendar.component.d.ts +52 -54
  142. package/lib/controls/calendar/calendar.types.d.ts +11 -7
  143. package/lib/controls/checkbox/checkbox.component.d.ts +65 -65
  144. package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +25 -25
  145. package/lib/controls/combobox/combobox.component.d.ts +418 -418
  146. package/lib/controls/date-input/date-input-selection-strategies/date-input-selection-strategy-base.d.ts +42 -0
  147. package/lib/controls/date-input/date-input-selection-strategies/day-selection-strategy.d.ts +21 -0
  148. package/lib/controls/date-input/date-input-selection-strategies/last-28-days-selection-strategy.d.ts +21 -0
  149. package/lib/controls/date-input/date-input-selection-strategies/last-7-days-selection-strategy.d.ts +21 -0
  150. package/lib/controls/date-input/date-input-selection-strategies/month-selection-strategy.d.ts +18 -0
  151. package/lib/controls/date-input/date-input-selection-strategies/quarter-selection-strategy.d.ts +18 -0
  152. package/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.d.ts +21 -0
  153. package/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.d.ts +20 -0
  154. package/lib/controls/date-input/date-input.component.d.ts +115 -80
  155. package/lib/controls/date-input/date-input.types.d.ts +62 -0
  156. package/lib/controls/dropdown/dropdown.component.d.ts +161 -161
  157. package/lib/controls/file-upload/file-upload.component.d.ts +124 -124
  158. package/lib/controls/form-control/form-control.component.d.ts +28 -30
  159. package/lib/controls/form-control-base.d.ts +110 -110
  160. package/lib/controls/form-control-label/form-control-label.component.d.ts +73 -73
  161. package/lib/controls/form-group/form-group.component.d.ts +105 -105
  162. package/lib/controls/help-popover/help-popover.component.d.ts +11 -11
  163. package/lib/controls/item-picker/item-picker.component.d.ts +164 -164
  164. package/lib/controls/link-button/link-button.component.d.ts +5 -5
  165. package/lib/controls/menu/menu.component.d.ts +255 -255
  166. package/lib/controls/navigation/link-item.d.ts +32 -32
  167. package/lib/controls/navigation/nav-group.d.ts +18 -18
  168. package/lib/controls/navigation/nav-item-active.directive.d.ts +42 -42
  169. package/lib/controls/navigation/nav-item.d.ts +31 -31
  170. package/lib/controls/numericbox/numericbox.component.d.ts +148 -148
  171. package/lib/controls/popover/popover.component.d.ts +51 -51
  172. package/lib/controls/radio-button/radio-button-option.d.ts +19 -19
  173. package/lib/controls/radio-button/radio-button.component.d.ts +53 -53
  174. package/lib/controls/select/select.component.d.ts +44 -44
  175. package/lib/controls/tabs/tabs.component.d.ts +30 -30
  176. package/lib/controls/textbox/textbox.component.d.ts +107 -107
  177. package/lib/core/cache.service.d.ts +33 -33
  178. package/lib/core/custom-validators.d.ts +20 -20
  179. package/lib/core/date-time-helper.d.ts +101 -101
  180. package/lib/core/error.service.d.ts +20 -20
  181. package/lib/core/router-helper.service.d.ts +48 -48
  182. package/lib/core/scroll.service.d.ts +36 -36
  183. package/lib/core/telemetry-tracker.service.d.ts +13 -13
  184. package/lib/core/telemetry.service.d.ts +31 -31
  185. package/lib/core/validation-message.service.d.ts +26 -26
  186. package/lib/core/validation-patterns.d.ts +22 -22
  187. package/lib/core/window.service.d.ts +116 -116
  188. package/lib/display/app-bar/app-bar.component.d.ts +20 -20
  189. package/lib/display/avatar/avatar.component.d.ts +35 -35
  190. package/lib/display/avatar/avatar.service.d.ts +24 -24
  191. package/lib/display/confirm/confirm.component.d.ts +123 -123
  192. package/lib/display/dialog/dialog-content.d.ts +19 -19
  193. package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +32 -32
  194. package/lib/display/dialog/dialog-types.d.ts +130 -130
  195. package/lib/display/dialog/dialog.component.d.ts +120 -120
  196. package/lib/display/dialog/dialog.service.d.ts +48 -48
  197. package/lib/display/help/help-types.d.ts +33 -33
  198. package/lib/display/hierarchy/hierarchy-base.d.ts +97 -97
  199. package/lib/display/hierarchy/hierarchy-mocks.spec.d.ts +53 -53
  200. package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +34 -34
  201. package/lib/display/item-display/item-display.component.d.ts +43 -43
  202. package/lib/display/json-display/json-display.component.d.ts +16 -16
  203. package/lib/display/resizable/resizable-base.d.ts +67 -67
  204. package/lib/display/resizable/resizable.component.d.ts +31 -31
  205. package/lib/display/spinner/spinner.component.d.ts +5 -5
  206. package/lib/display/splash/splash.component.d.ts +16 -16
  207. package/lib/display/splash/splash.service.d.ts +22 -22
  208. package/lib/display/table/resizable-column.component.d.ts +10 -10
  209. package/lib/display/table/resizable-table.directive.d.ts +93 -93
  210. package/lib/display/table/searchable-table.component.d.ts +206 -206
  211. package/lib/display/table/table-detail-row.component.d.ts +8 -8
  212. package/lib/display/table/table-locked-column.component.d.ts +20 -20
  213. package/lib/display/table/table-master-header-row.component.d.ts +9 -9
  214. package/lib/display/table/table-master-row.component.d.ts +113 -113
  215. package/lib/display/table/table-pagination.component.d.ts +91 -91
  216. package/lib/display/table/table-selectable-row.component.d.ts +102 -102
  217. package/lib/display/table/table.component.d.ts +121 -121
  218. package/lib/display/tags/tag.d.ts +18 -18
  219. package/lib/display/tags/tags.component.d.ts +48 -48
  220. package/lib/display/toast/toast/toast.component.d.ts +23 -23
  221. package/lib/display/toast/toast-types.d.ts +24 -24
  222. package/lib/display/toast/toast.service.d.ts +20 -20
  223. package/lib/display/toast/toaster/toaster.component.d.ts +35 -35
  224. package/lib/display/tooltip/tooltip.component.d.ts +70 -70
  225. package/lib/display/tooltip/tooltip.service.d.ts +16 -16
  226. package/lib/display/tooltip-directive/tooltip.directive.d.ts +44 -44
  227. package/lib/display/tour/tour-types.d.ts +70 -70
  228. package/lib/display/tour/tour.component.d.ts +147 -147
  229. package/lib/display/tour/tour.service.d.ts +38 -38
  230. package/lib/display/tree/tree.component.d.ts +75 -75
  231. package/lib/display/view-overlay/view-overlay.component.d.ts +38 -38
  232. package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +14 -14
  233. package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +60 -60
  234. package/lib/shared/directives/keyboard-nav-container/keyboard-nav-container.directive.d.ts +23 -0
  235. package/lib/shared/directives/popup/popup-container.directive.d.ts +101 -101
  236. package/lib/shared/display/pipes/date-display.pipe.d.ts +21 -21
  237. package/lib/shared/display/pipes/highlight-text.pipe.d.ts +9 -9
  238. package/lib/shared/display/pipes/relative-date.pipe.d.ts +36 -36
  239. package/lib/shared/display/pipes/row-count.pipe.d.ts +23 -23
  240. package/lib/shared/display/pipes/time-display.pipe.d.ts +18 -18
  241. package/lib/shared/display.d.ts +42 -42
  242. package/lib/shared/form-group.helper.d.ts +31 -31
  243. package/lib/shared/json-helper.d.ts +7 -7
  244. package/lib/shared/lodash-helper.d.ts +18 -18
  245. package/lib/shared/page/page-base/page-base.component.d.ts +259 -259
  246. package/lib/shared/page/page-statuses.d.ts +13 -13
  247. package/lib/shared/page/page-title/page-title.component.d.ts +9 -9
  248. package/lib/shared/page/page-view/page-view.component.d.ts +102 -102
  249. package/lib/shared/testing/copy-button-base-test-injector-factory.spec.d.ts +4 -4
  250. package/lib/shared/testing/hierarchy-base-test-injector-factory.spec.d.ts +4 -4
  251. package/lib/shared/testing/page-base-component-test-helper.spec.d.ts +30 -30
  252. package/lib/shared/testing/page-base-component-test-injector-factory.spec.d.ts +28 -28
  253. package/lib/shared/testing/public-mocks.spec.d.ts +90 -90
  254. package/lib/shared/testing/spy-factory.spec.d.ts +27 -27
  255. package/lib/shared/testing/translation-mocks.spec.d.ts +30 -30
  256. package/lib/shared/user-preference.service.d.ts +13 -13
  257. package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +134 -134
  258. package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +27 -27
  259. package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +10 -10
  260. package/package.json +18 -12
  261. package/public-api.d.ts +113 -111
  262. package/schematics/rxjs-7-upgrade/index.d.ts +3 -3
  263. package/schematics/rxjs-7-upgrade/index.js +67 -67
  264. package/schematics/rxjs-7-upgrade/index.js.map +1 -1
  265. package/schematics/rxjs-7-upgrade/schema.d.ts +4 -4
  266. package/schematics/rxjs-7-upgrade/schema.js +2 -2
  267. package/schematics/utilities/typescript.d.ts +7 -7
  268. package/schematics/utilities/typescript.js +41 -41
  269. package/schematics/utilities/workspace.d.ts +8 -8
  270. package/schematics/utilities/workspace.js +71 -71
  271. package/schematics/utilities/workspace.js.map +1 -1
  272. package/src/assets/locales/en_US.json +9 -1
  273. package/esm2022/lib/components.module.mjs +0 -418
  274. package/esm2022/lib/controls/banner/banner.component.mjs +0 -109
  275. package/esm2022/lib/controls/button/button.component.mjs +0 -106
  276. package/esm2022/lib/controls/button/copy-button-base.directive.mjs +0 -67
  277. package/esm2022/lib/controls/button/copy-table-button.directive.mjs +0 -43
  278. package/esm2022/lib/controls/calendar/calendar-item.component.mjs +0 -59
  279. package/esm2022/lib/controls/calendar/calendar.component.mjs +0 -200
  280. package/esm2022/lib/controls/calendar/calendar.types.mjs +0 -4
  281. package/esm2022/lib/controls/checkbox/checkbox.component.mjs +0 -140
  282. package/esm2022/lib/controls/combobox/combobox.component.mjs +0 -879
  283. package/esm2022/lib/controls/date-input/date-input.component.mjs +0 -256
  284. package/esm2022/lib/controls/dropdown/dropdown.component.mjs +0 -243
  285. package/esm2022/lib/controls/file-upload/file-upload.component.mjs +0 -261
  286. package/esm2022/lib/controls/form-control/form-control.component.mjs +0 -104
  287. package/esm2022/lib/controls/form-control-base.mjs +0 -151
  288. package/esm2022/lib/controls/form-control-label/form-control-label.component.mjs +0 -136
  289. package/esm2022/lib/controls/form-group/form-group.component.mjs +0 -261
  290. package/esm2022/lib/controls/item-picker/item-picker.component.mjs +0 -329
  291. package/esm2022/lib/controls/menu/menu.component.mjs +0 -485
  292. package/esm2022/lib/controls/navigation/nav-group.mjs +0 -39
  293. package/esm2022/lib/controls/navigation/nav-item-active.directive.mjs +0 -92
  294. package/esm2022/lib/controls/numericbox/numericbox.component.mjs +0 -372
  295. package/esm2022/lib/controls/popover/popover.component.mjs +0 -117
  296. package/esm2022/lib/controls/radio-button/radio-button.component.mjs +0 -82
  297. package/esm2022/lib/controls/select/select.component.mjs +0 -88
  298. package/esm2022/lib/controls/tabs/tabs.component.mjs +0 -47
  299. package/esm2022/lib/controls/textbox/textbox.component.mjs +0 -155
  300. package/esm2022/lib/core/cache.service.mjs +0 -105
  301. package/esm2022/lib/core/custom-validators.mjs +0 -29
  302. package/esm2022/lib/core/date-time-helper.mjs +0 -220
  303. package/esm2022/lib/core/error.service.mjs +0 -61
  304. package/esm2022/lib/core/router-helper.service.mjs +0 -111
  305. package/esm2022/lib/core/scroll.service.mjs +0 -89
  306. package/esm2022/lib/core/validation-message.service.mjs +0 -185
  307. package/esm2022/lib/core/window.service.mjs +0 -186
  308. package/esm2022/lib/display/app-bar/app-bar.component.mjs +0 -46
  309. package/esm2022/lib/display/avatar/avatar.component.mjs +0 -67
  310. package/esm2022/lib/display/avatar/avatar.service.mjs +0 -64
  311. package/esm2022/lib/display/confirm/confirm.component.mjs +0 -168
  312. package/esm2022/lib/display/dialog/dialog-group/dialog-group.component.mjs +0 -63
  313. package/esm2022/lib/display/dialog/dialog.component.mjs +0 -281
  314. package/esm2022/lib/display/hierarchy/hierarchy-base.mjs +0 -111
  315. package/esm2022/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +0 -61
  316. package/esm2022/lib/display/item-display/item-display.component.mjs +0 -81
  317. package/esm2022/lib/display/json-display/json-display.component.mjs +0 -47
  318. package/esm2022/lib/display/resizable/resizable-base.mjs +0 -120
  319. package/esm2022/lib/display/splash/splash.component.mjs +0 -42
  320. package/esm2022/lib/display/table/resizable-table.directive.mjs +0 -227
  321. package/esm2022/lib/display/table/searchable-table.component.mjs +0 -342
  322. package/esm2022/lib/display/table/table-locked-column.component.mjs +0 -58
  323. package/esm2022/lib/display/table/table-master-row.component.mjs +0 -163
  324. package/esm2022/lib/display/table/table-pagination.component.mjs +0 -155
  325. package/esm2022/lib/display/table/table-selectable-row.component.mjs +0 -235
  326. package/esm2022/lib/display/table/table.component.mjs +0 -249
  327. package/esm2022/lib/display/tags/tag.mjs +0 -18
  328. package/esm2022/lib/display/tags/tags.component.mjs +0 -77
  329. package/esm2022/lib/display/toast/toast/toast.component.mjs +0 -77
  330. package/esm2022/lib/display/toast/toaster/toaster.component.mjs +0 -114
  331. package/esm2022/lib/display/tooltip-directive/tooltip.directive.mjs +0 -173
  332. package/esm2022/lib/display/tour/tour.component.mjs +0 -398
  333. package/esm2022/lib/display/tour/tour.service.mjs +0 -75
  334. package/esm2022/lib/display/tree/tree.component.mjs +0 -135
  335. package/esm2022/lib/display/view-overlay/view-overlay.component.mjs +0 -58
  336. package/esm2022/lib/shared/directives/click-area-for/click-area-for.directive.mjs +0 -32
  337. package/esm2022/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +0 -111
  338. package/esm2022/lib/shared/directives/popup/popup-container.directive.mjs +0 -166
  339. package/esm2022/lib/shared/display/pipes/date-display.pipe.mjs +0 -50
  340. package/esm2022/lib/shared/display/pipes/highlight-text.pipe.mjs +0 -30
  341. package/esm2022/lib/shared/display/pipes/relative-date.pipe.mjs +0 -62
  342. package/esm2022/lib/shared/display/pipes/row-count.pipe.mjs +0 -48
  343. package/esm2022/lib/shared/display/pipes/time-display.pipe.mjs +0 -41
  344. package/esm2022/lib/shared/display.mjs +0 -6
  345. package/esm2022/lib/shared/form-group.helper.mjs +0 -67
  346. package/esm2022/lib/shared/json-helper.mjs +0 -19
  347. package/esm2022/lib/shared/lodash-helper.mjs +0 -52
  348. package/esm2022/lib/shared/page/page-base/page-base.component.mjs +0 -387
  349. package/esm2022/lib/shared/page/page-view/page-view.component.mjs +0 -147
  350. package/esm2022/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +0 -98
  351. package/esm2022/lib/shared/wizard/wizard-base/wizard-base.component.mjs +0 -246
  352. package/esm2022/public-api.mjs +0 -115
  353. package/fesm2022/energycap-components.mjs.map +0 -1
@@ -0,0 +1,372 @@
1
+ import { Component, ElementRef, Input, ViewChild } from '@angular/core';
2
+ import { UntypedFormControl, Validators } from "@angular/forms";
3
+ import { debounceTime, distinctUntilChanged, filter, takeUntil } from 'rxjs/operators';
4
+ import { getDecimalPattern, integerPattern } from '../../core/validation-patterns';
5
+ import { FormControlBase } from "../form-control-base";
6
+ import { TextboxComponent } from '../textbox/textbox.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../../core/validation-message.service";
9
+ import * as i2 from "../../shared/form-group.helper";
10
+ import * as i3 from "@angular/common";
11
+ import * as i4 from "../textbox/textbox.component";
12
+ import * as i5 from "../help-popover/help-popover.component";
13
+ import * as i6 from "@ngx-translate/core";
14
+ /**
15
+ * Custom validator to check that min/max and pattern validation is met on the numericbox
16
+ * component
17
+ */
18
+ export const numericboxValidation = (min, max, decimals, maxPrecisionDigits) => {
19
+ return (control) => {
20
+ let hasError = false;
21
+ // If the control is empty we won't attempt to validate, if there is a required
22
+ // validator we will never get here until there is a value
23
+ if (control.value && control.value !== "") {
24
+ let numericPattern;
25
+ if (decimals && decimals > 0) {
26
+ numericPattern = getDecimalPattern(decimals);
27
+ }
28
+ else if (maxPrecisionDigits) {
29
+ // Still need to check for a valid number formatting when in max precision mode
30
+ numericPattern = getDecimalPattern(maxPrecisionDigits);
31
+ }
32
+ else {
33
+ // Allow an optional negative sign and any number of digits 0-9
34
+ numericPattern = integerPattern;
35
+ }
36
+ if (!numericPattern.test(control.value)) {
37
+ hasError = true;
38
+ }
39
+ else if (maxPrecisionDigits) {
40
+ // Converting to a number then back to string removes trailing zeros, and the regex replace removes
41
+ // any negative signs, leading zeros or decimal points from the number.
42
+ const val = Number(control.value).toString().replace(/^-?/, '').replace(/(^0\.)|(\.)/, '');
43
+ hasError = val.length > maxPrecisionDigits;
44
+ }
45
+ // We now know we have a valid number, so we can cast these to numbers
46
+ // for proper range validation
47
+ if (min !== undefined && Number(control.value) < min) {
48
+ hasError = true;
49
+ }
50
+ if (max !== undefined && Number(control.value) > max) {
51
+ hasError = true;
52
+ }
53
+ }
54
+ if (hasError) {
55
+ return {
56
+ numericbox: {
57
+ valid: false,
58
+ min: min,
59
+ max: max,
60
+ decimals: decimals,
61
+ maxPrecisionDigits: maxPrecisionDigits
62
+ }
63
+ };
64
+ }
65
+ else {
66
+ return null;
67
+ }
68
+ };
69
+ };
70
+ export class NumericboxComponent extends FormControlBase {
71
+ constructor(validationMessageService, formGroupHelper, renderer) {
72
+ super(validationMessageService, formGroupHelper);
73
+ this.validationMessageService = validationMessageService;
74
+ this.formGroupHelper = formGroupHelper;
75
+ this.renderer = renderer;
76
+ /**
77
+ * Show trailing zeros after the decimal point.
78
+ * Do not use with maxPrecisionDigits.
79
+ */
80
+ this.showPrecision = false;
81
+ /**
82
+ * If set to true this will update the form model after a debounce as the user
83
+ * interacts with the component
84
+ */
85
+ this.autoUpdateFormModel = false;
86
+ /** Flag to tell the page we finally computed a greater than zero
87
+ * width for units (if applicable)
88
+ */
89
+ this.unitsWidthCalculated = false;
90
+ /** Flag used to filter the form models value changes subscription
91
+ * to prevent the textbox model from being formatted as the form model is updated
92
+ * programmatically when the textbox model updates
93
+ */
94
+ this.autoUpdatingFormModel = false;
95
+ }
96
+ /**
97
+ * Angular AfterViewInit life-cycle hook
98
+ * Subscribe to textbox model value changes if the hosting
99
+ * page has opted in for this component
100
+ */
101
+ ngAfterViewInit() {
102
+ if (this.autoUpdateFormModel) {
103
+ this.textboxFormModel.valueChanges
104
+ .pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.componentDestroyed)).subscribe(() => {
105
+ this.updateFormModelValue();
106
+ });
107
+ }
108
+ }
109
+ /**
110
+ * Angular onChanges life-cycle hook
111
+ * @see {@link https://angular.io/guide/lifecycle-hooks | Life-cycle hooks}
112
+ */
113
+ ngOnChanges(changes) {
114
+ // If either units change after we've calculated,
115
+ // reset the flag so we can react and redraw
116
+ if (changes.rightUnits || changes.leftUnits) {
117
+ this.unitsWidthCalculated = false;
118
+ }
119
+ super.ngOnChanges(changes);
120
+ }
121
+ /**
122
+ * Angular onInit lifecycle hook
123
+ * If units is defined, set the position and listen for status changes so we
124
+ * can update the positioning of the units element
125
+ */
126
+ ngOnInit() {
127
+ super.ngOnInit();
128
+ // Initialize the textbox form model with the value of the form model and synchronize
129
+ // disabled state
130
+ this.textboxFormModel = new UntypedFormControl({ value: this.formModel.value, disabled: this.formModel.disabled });
131
+ // Update the form model's errors when the textbox form model status changes
132
+ this.textboxFormModel.statusChanges.pipe(takeUntil(this.componentDestroyed)).subscribe(() => {
133
+ if (this.formModel.enabled) {
134
+ this.formModel.setErrors(this.textboxFormModel.errors);
135
+ }
136
+ });
137
+ // Synchronize disabled state between form model and internal textbox form model
138
+ this.formModel.statusChanges.pipe(takeUntil(this.componentDestroyed)).subscribe(() => {
139
+ if (this.formModel.disabled) {
140
+ this.textboxFormModel.disable();
141
+ }
142
+ else {
143
+ if (this.textboxFormModel.disabled) {
144
+ this.textboxFormModel.enable();
145
+ }
146
+ }
147
+ });
148
+ // Set textbox validators
149
+ this.textboxFormModel.setValidators(this.getValidators());
150
+ // Now that the textbox is set up we will set it's value to whatever the
151
+ // form model had when we initialized
152
+ this.textboxFormModel.setValue(this.formatDisplayNumber(this.formModel.value));
153
+ // If the form model's value changes programmatically we need to update the
154
+ // textbox form model
155
+ this.formModel.valueChanges.pipe(
156
+ // We need to filter out when we are updating it programmatically if the
157
+ // hosting page has opted into the auto updating input
158
+ filter(() => !this.autoUpdatingFormModel), takeUntil(this.componentDestroyed)).subscribe(value => {
159
+ this.textboxFormModel.setValue(this.formatDisplayNumber(value));
160
+ });
161
+ // If the textbox status changes we need to update the left units position because
162
+ // we want to make room for the invalid icon
163
+ if (this.leftUnits) {
164
+ this.textboxFormModel.statusChanges.pipe(takeUntil(this.componentDestroyed)).subscribe(() => {
165
+ this.positionLeftUnits();
166
+ });
167
+ }
168
+ }
169
+ /**
170
+ * Angular afterViewChecked lifecycle hook
171
+ * Show the units element if units is defined. Runs after every ngOnChanges
172
+ */
173
+ ngAfterViewChecked() {
174
+ if ((this.leftUnits || this.rightUnits) && !this.unitsWidthCalculated) {
175
+ this.showUnits();
176
+ }
177
+ }
178
+ /**
179
+ * Function that builds and returns a ValidatorFn array to set on the form control
180
+ */
181
+ getValidators() {
182
+ let validators = [];
183
+ if (this.required) {
184
+ validators.push(Validators.required);
185
+ }
186
+ validators.push(numericboxValidation(this.min, this.max, this.decimals, this.maxPrecisionDigits));
187
+ return validators;
188
+ }
189
+ /**
190
+ * Focus out event handler for the Textbox component
191
+ */
192
+ onFocusOut() {
193
+ this.updateFormModelValue(true);
194
+ }
195
+ /**
196
+ * Function to set focus on an input programatically after the page
197
+ * had been rendered. The highlight text flag will select the text
198
+ * within the input if passed in and true
199
+ */
200
+ setFocus(highlightText) {
201
+ this.textboxInput.setFocus(highlightText);
202
+ }
203
+ /**
204
+ * When the textbox model updates we need to add some display formatting for
205
+ * display in the textbox and cast the textbox model to a number. Avoid updating
206
+ * the form model when the value doesn't change because listeners will fire for no reason
207
+ */
208
+ updateFormModelValue(isFocusOut) {
209
+ if (this.autoUpdateFormModel) {
210
+ // Make it so value changes on the form model do not get triggered
211
+ // as we change it programmatically. We do not want the textbox
212
+ // model to be updated while the user is in the input
213
+ this.autoUpdatingFormModel = true;
214
+ }
215
+ try {
216
+ if (this.textboxFormModel.valid || this.textboxFormModel.value === "") {
217
+ // Start out with null for the number, if the textbox value is not a number
218
+ // we will clear it out on focus out
219
+ let number = null;
220
+ // Make sure the textbox model is a number before trying to update the
221
+ // form model value with it
222
+ if (this.textboxFormModel.value && !isNaN(this.textboxFormModel.value)) {
223
+ // Our value is a legit number, on focus out we will format it if needed
224
+ number = Number(this.textboxFormModel.value);
225
+ // Checking if the value has actually changed, if not don't set the
226
+ // value to avoid extra listener calls
227
+ if (this.formModel.value !== number) {
228
+ this.formModel.setValue(number);
229
+ }
230
+ // The textbox model is not a number, check to see if our form model has a value
231
+ // and if so clear it out
232
+ }
233
+ else if (this.formModel.value !== null) {
234
+ this.formModel.setValue(null);
235
+ }
236
+ // We only will update the textbox form model with formatting if needed
237
+ // on Focus out. This works well for the user whether the auto update
238
+ // is opted in or not
239
+ if (isFocusOut) {
240
+ this.textboxFormModel.setValue(this.formatDisplayNumber(number));
241
+ }
242
+ }
243
+ this.formModel.markAsTouched();
244
+ }
245
+ catch (error) {
246
+ // Nothing to display, just ensuring we reset our flag that filters
247
+ // the form model value changes
248
+ }
249
+ finally {
250
+ this.autoUpdatingFormModel = false;
251
+ }
252
+ }
253
+ /**
254
+ * Convert a number value to the formmated display string. If there is no value
255
+ * return null
256
+ */
257
+ formatDisplayNumber(value) {
258
+ if (value || value === 0) {
259
+ // Guard against calling toFixed if the value isn't a number. This is possible
260
+ // if patching a value from outside of the component as you don't have
261
+ // type checking there
262
+ if (this.showPrecision && this.decimals && !isNaN(value)) {
263
+ return value.toFixed(this.decimals);
264
+ }
265
+ else {
266
+ return value.toString();
267
+ }
268
+ }
269
+ else {
270
+ return null;
271
+ }
272
+ }
273
+ /**
274
+ * Position the units element and set the padding in the textbox input based
275
+ * on the width of the units element
276
+ */
277
+ positionRightUnits() {
278
+ let unitsEl = this.textboxEl.nativeElement.querySelector('.units-right');
279
+ let inputEl = this.textboxEl.nativeElement.querySelector('input');
280
+ if (unitsEl && inputEl) {
281
+ let unitsWidth = unitsEl.offsetWidth;
282
+ if (unitsWidth > 0) {
283
+ this.unitsWidthCalculated = true;
284
+ }
285
+ let padding = unitsWidth;
286
+ this.renderer.setStyle(inputEl, 'padding-right', padding + 'px');
287
+ }
288
+ }
289
+ positionLeftUnits() {
290
+ let unitsEl = this.textboxEl.nativeElement.querySelector('.units-left');
291
+ let inputEl = this.textboxEl.nativeElement.querySelector('input');
292
+ if (unitsEl && inputEl) {
293
+ let unitsWidth = unitsEl.offsetWidth;
294
+ if (unitsWidth > 0) {
295
+ this.unitsWidthCalculated = true;
296
+ }
297
+ let padding = unitsWidth;
298
+ let leftPosition = getComputedStyle(unitsEl).left;
299
+ if (leftPosition) {
300
+ padding += parseInt(leftPosition.replace('px', ''), 0);
301
+ }
302
+ this.renderer.setStyle(inputEl, 'padding-left', padding + 'px');
303
+ }
304
+ }
305
+ /**
306
+ * Create and append the units element to the textbox element
307
+ */
308
+ showUnits() {
309
+ let inputWrapper = this.textboxEl.nativeElement.querySelector('.input-wrapper');
310
+ if (inputWrapper) {
311
+ if (this.leftUnits) {
312
+ let unitsEl = this.textboxEl.nativeElement.querySelector('.units-left');
313
+ if (unitsEl) {
314
+ this.renderer.setProperty(unitsEl, 'innerHTML', this.leftUnits);
315
+ }
316
+ else {
317
+ this.renderer.appendChild(inputWrapper, this.makeUnitElement('left', this.leftUnits));
318
+ }
319
+ this.positionLeftUnits();
320
+ }
321
+ if (this.rightUnits) {
322
+ let unitsEl = this.textboxEl.nativeElement.querySelector('.units-right');
323
+ if (unitsEl) {
324
+ this.renderer.setProperty(unitsEl, 'innerHTML', this.rightUnits);
325
+ }
326
+ else {
327
+ this.renderer.appendChild(inputWrapper, this.makeUnitElement('right', this.rightUnits));
328
+ }
329
+ this.positionRightUnits();
330
+ }
331
+ }
332
+ }
333
+ makeUnitElement(side, text) {
334
+ let unitsEl = this.renderer.createElement('span');
335
+ this.renderer.setAttribute(unitsEl, 'class', `units units-${side}`);
336
+ this.renderer.setAttribute(unitsEl, 'id', `${this.id}_units`);
337
+ this.renderer.setAttribute(unitsEl, 'style', 'pointer-events: none');
338
+ this.renderer.setProperty(unitsEl, 'innerHTML', text);
339
+ return unitsEl;
340
+ }
341
+ }
342
+ NumericboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NumericboxComponent, deps: [{ token: i1.ValidationMessageService }, { token: i2.FormGroupHelper }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
343
+ NumericboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: NumericboxComponent, selector: "ec-numericbox", inputs: { placeholder: "placeholder", decimals: "decimals", showPrecision: "showPrecision", maxPrecisionDigits: "maxPrecisionDigits", max: "max", min: "min", leftUnits: "leftUnits", rightUnits: "rightUnits", autoUpdateFormModel: "autoUpdateFormModel" }, viewQueries: [{ propertyName: "textboxEl", first: true, predicate: TextboxComponent, descendants: true, read: ElementRef, static: true }, { propertyName: "textboxInput", first: true, predicate: ["textbox"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [class.invalid]=\"formModel?.invalid && (formModel?.touched)\">\r\n\r\n <label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length && formModel?.touched && formModel?.invalid\">&nbsp;{{validationErrors | translate}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n </label>\r\n\r\n <!-- Setting the maxlength to 13 to combat the user from entering too large of a number\r\n for javascript to support. If the user enters all 13 characters as numbers and we have showPrecision set, adding the\r\n decimal and the empty zero characters will get them in a situation where to edit it they must remove characters\r\n as we would push them past the limit -->\r\n <ec-textbox [id]=\"id\"\r\n #textbox\r\n class=\"control-input mb-0\"\r\n [placeholder]=\"placeholder\"\r\n [maxlength]=\"maxPrecisionDigits ? maxPrecisionDigits + 3 : 13\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n [tooltip]=\"tooltip\"\r\n (focusout)=\"onFocusOut()\">\r\n </ec-textbox>\r\n</div>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}ec-textbox ::ng-deep .input-wrapper{position:relative}ec-textbox ::ng-deep input{text-align:right}ec-textbox ::ng-deep input:required.is-empty:not(:disabled)~.units-left{left:1.25rem}ec-textbox ::ng-deep input.ng-invalid.ng-touched~.units-left{left:1.25rem}ec-textbox ::ng-deep .control:not(.is-readonly) input:disabled~.units{color:var(--ec-form-control-color-disabled);opacity:.65}ec-textbox ::ng-deep .units{display:block;position:absolute;top:0;height:2rem;line-height:1.25rem;padding:.375rem .25rem;z-index:2}ec-textbox ::ng-deep .units.units-right{right:0;padding-right:.5rem}ec-textbox ::ng-deep .units.units-left{left:0;padding-left:.5rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid,.control.invalid ec-textbox ::ng-deep input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}.control.invalid ec-textbox ::ng-deep input.ng-invalid:focus,.control.invalid ec-textbox ::ng-deep input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.units-left,.control.invalid ec-textbox ::ng-deep input.ng-valid~.units-left{left:1.25rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.icon-invalid,.control.invalid ec-textbox ::ng-deep input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.icon-required,.control.invalid ec-textbox ::ng-deep input.ng-valid~.icon-required{display:none}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TextboxComponent, selector: "ec-textbox", inputs: ["autocomplete", "type", "placeholder", "maxlength", "minlength", "rows", "selectOnAutofocus", "upperCase"] }, { kind: "component", type: i5.HelpPopoverComponent, selector: "ec-help-popover", inputs: ["id", "text", "contentPosition", "maxWidth"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] });
344
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NumericboxComponent, decorators: [{
345
+ type: Component,
346
+ args: [{ selector: 'ec-numericbox', template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [class.invalid]=\"formModel?.invalid && (formModel?.touched)\">\r\n\r\n <label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length && formModel?.touched && formModel?.invalid\">&nbsp;{{validationErrors | translate}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n </label>\r\n\r\n <!-- Setting the maxlength to 13 to combat the user from entering too large of a number\r\n for javascript to support. If the user enters all 13 characters as numbers and we have showPrecision set, adding the\r\n decimal and the empty zero characters will get them in a situation where to edit it they must remove characters\r\n as we would push them past the limit -->\r\n <ec-textbox [id]=\"id\"\r\n #textbox\r\n class=\"control-input mb-0\"\r\n [placeholder]=\"placeholder\"\r\n [maxlength]=\"maxPrecisionDigits ? maxPrecisionDigits + 3 : 13\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n [tooltip]=\"tooltip\"\r\n (focusout)=\"onFocusOut()\">\r\n </ec-textbox>\r\n</div>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}ec-textbox ::ng-deep .input-wrapper{position:relative}ec-textbox ::ng-deep input{text-align:right}ec-textbox ::ng-deep input:required.is-empty:not(:disabled)~.units-left{left:1.25rem}ec-textbox ::ng-deep input.ng-invalid.ng-touched~.units-left{left:1.25rem}ec-textbox ::ng-deep .control:not(.is-readonly) input:disabled~.units{color:var(--ec-form-control-color-disabled);opacity:.65}ec-textbox ::ng-deep .units{display:block;position:absolute;top:0;height:2rem;line-height:1.25rem;padding:.375rem .25rem;z-index:2}ec-textbox ::ng-deep .units.units-right{right:0;padding-right:.5rem}ec-textbox ::ng-deep .units.units-left{left:0;padding-left:.5rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid,.control.invalid ec-textbox ::ng-deep input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}.control.invalid ec-textbox ::ng-deep input.ng-invalid:focus,.control.invalid ec-textbox ::ng-deep input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.units-left,.control.invalid ec-textbox ::ng-deep input.ng-valid~.units-left{left:1.25rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.icon-invalid,.control.invalid ec-textbox ::ng-deep input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.icon-required,.control.invalid ec-textbox ::ng-deep input.ng-valid~.icon-required{display:none}\n"] }]
347
+ }], ctorParameters: function () { return [{ type: i1.ValidationMessageService }, { type: i2.FormGroupHelper }, { type: i0.Renderer2 }]; }, propDecorators: { placeholder: [{
348
+ type: Input
349
+ }], decimals: [{
350
+ type: Input
351
+ }], showPrecision: [{
352
+ type: Input
353
+ }], maxPrecisionDigits: [{
354
+ type: Input
355
+ }], max: [{
356
+ type: Input
357
+ }], min: [{
358
+ type: Input
359
+ }], leftUnits: [{
360
+ type: Input
361
+ }], rightUnits: [{
362
+ type: Input
363
+ }], autoUpdateFormModel: [{
364
+ type: Input
365
+ }], textboxEl: [{
366
+ type: ViewChild,
367
+ args: [TextboxComponent, { read: ElementRef, static: true }]
368
+ }], textboxInput: [{
369
+ type: ViewChild,
370
+ args: ['textbox', { static: true }]
371
+ }] } });
372
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpY2JveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvbnVtZXJpY2JveC9udW1lcmljYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9udW1lcmljYm94L251bWVyaWNib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFtQyxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBMEQsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pLLE9BQU8sRUFBbUIsa0JBQWtCLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUYsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRW5GLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7QUFHaEU7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUF1QixFQUFFLEdBQXVCLEVBQUUsUUFBNEIsRUFBRSxrQkFBc0MsRUFBZSxFQUFFO0lBQ3hLLE9BQU8sQ0FBQyxPQUF3QixFQUFFLEVBQUU7UUFDaEMsSUFBSSxRQUFRLEdBQVksS0FBSyxDQUFDO1FBRTlCLCtFQUErRTtRQUMvRSwwREFBMEQ7UUFDMUQsSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFFO1lBRXZDLElBQUksY0FB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VCxXQUFXO3NCQUExQixLQUFLO2dCQU1VLFFBQVE7c0JBQXZCLEtBQUs7Z0JBT1UsYUFBYTtzQkFBNUIsS0FBSztnQkFTVSxrQkFBa0I7c0JBQWpDLEtBQUs7Z0JBVVUsR0FBRztzQkFBbEIsS0FBSztnQkFVVSxHQUFHO3NCQUFsQixLQUFLO2dCQU1VLFNBQVM7c0JBQXhCLEtBQUs7Z0JBTVUsVUFBVTtzQkFBekIsS0FBSztnQkFNVSxtQkFBbUI7c0JBQWxDLEtBQUs7Z0JBS21FLFNBQVM7c0JBQWpGLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBc0JmLFlBQVk7c0JBQTNELFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0NoZWNrZWQsIEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIFJlbmRlcmVyMiwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS92YWxpZGF0aW9uLW1lc3NhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IGdldERlY2ltYWxQYXR0ZXJuLCBpbnRlZ2VyUGF0dGVybiB9IGZyb20gJy4uLy4uL2NvcmUvdmFsaWRhdGlvbi1wYXR0ZXJucyc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cEhlbHBlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9mb3JtLWdyb3VwLmhlbHBlcic7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sQmFzZSB9IGZyb20gXCIuLi9mb3JtLWNvbnRyb2wtYmFzZVwiO1xyXG5pbXBvcnQgeyBUZXh0Ym94Q29tcG9uZW50IH0gZnJvbSAnLi4vdGV4dGJveC90ZXh0Ym94LmNvbXBvbmVudCc7XHJcblxyXG5cclxuLyoqXHJcbiAqIEN1c3RvbSB2YWxpZGF0b3IgdG8gY2hlY2sgdGhhdCBtaW4vbWF4IGFuZCBwYXR0ZXJuIHZhbGlkYXRpb24gaXMgbWV0IG9uIHRoZSBudW1lcmljYm94XHJcbiAqIGNvbXBvbmVudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG51bWVyaWNib3hWYWxpZGF0aW9uID0gKG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkLCBtYXg6IG51bWJlciB8IHVuZGVmaW5lZCwgZGVjaW1hbHM6IG51bWJlciB8IHVuZGVmaW5lZCwgbWF4UHJlY2lzaW9uRGlnaXRzOiBudW1iZXIgfCB1bmRlZmluZWQpOiBWYWxpZGF0b3JGbiA9PiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICAgIGxldCBoYXNFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgY29udHJvbCBpcyBlbXB0eSB3ZSB3b24ndCBhdHRlbXB0IHRvIHZhbGlkYXRlLCBpZiB0aGVyZSBpcyBhIHJlcXVpcmVkXHJcbiAgICAgICAgLy8gdmFsaWRhdG9yIHdlIHdpbGwgbmV2ZXIgZ2V0IGhlcmUgdW50aWwgdGhlcmUgaXMgYSB2YWx1ZVxyXG4gICAgICAgIGlmIChjb250cm9sLnZhbHVlICYmIGNvbnRyb2wudmFsdWUgIT09IFwiXCIpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBudW1lcmljUGF0dGVybjogUmVnRXhwO1xyXG4gICAgICAgICAgICBpZiAoZGVjaW1hbHMgJiYgZGVjaW1hbHMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBudW1lcmljUGF0dGVybiA9IGdldERlY2ltYWxQYXR0ZXJuKGRlY2ltYWxzKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXhQcmVjaXNpb25EaWdpdHMpIHtcclxuICAgICAgICAgICAgICAgIC8vIFN0aWxsIG5lZWQgdG8gY2hlY2sgZm9yIGEgdmFsaWQgbnVtYmVyIGZvcm1hdHRpbmcgd2hlbiBpbiBtYXggcHJlY2lzaW9uIG1vZGVcclxuICAgICAgICAgICAgICAgIG51bWVyaWNQYXR0ZXJuID0gZ2V0RGVjaW1hbFBhdHRlcm4obWF4UHJlY2lzaW9uRGlnaXRzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIEFsbG93IGFuIG9wdGlvbmFsIG5lZ2F0aXZlIHNpZ24gYW5kIGFueSBudW1iZXIgb2YgZGlnaXRzIDAtOVxyXG4gICAgICAgICAgICAgICAgbnVtZXJpY1BhdHRlcm4gPSBpbnRlZ2VyUGF0dGVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFudW1lcmljUGF0dGVybi50ZXN0KGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWF4UHJlY2lzaW9uRGlnaXRzKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0aW5nIHRvIGEgbnVtYmVyIHRoZW4gYmFjayB0byBzdHJpbmcgcmVtb3ZlcyB0cmFpbGluZyB6ZXJvcywgYW5kIHRoZSByZWdleCByZXBsYWNlIHJlbW92ZXNcclxuICAgICAgICAgICAgICAgIC8vIGFueSBuZWdhdGl2ZSBzaWducywgbGVhZGluZyB6ZXJvcyBvciBkZWNpbWFsIHBvaW50cyBmcm9tIHRoZSBudW1iZXIuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBOdW1iZXIoY29udHJvbC52YWx1ZSkudG9TdHJpbmcoKS5yZXBsYWNlKC9eLT8vLCAnJykucmVwbGFjZSgvKF4wXFwuKXwoXFwuKS8sICcnKTtcclxuICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdmFsLmxlbmd0aCA+IG1heFByZWNpc2lvbkRpZ2l0cztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gV2Ugbm93IGtub3cgd2UgaGF2ZSBhIHZhbGlkIG51bWJlciwgc28gd2UgY2FuIGNhc3QgdGhlc2UgdG8gbnVtYmVyc1xyXG4gICAgICAgICAgICAvLyBmb3IgcHJvcGVyIHJhbmdlIHZhbGlkYXRpb25cclxuICAgICAgICAgICAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkICYmIE51bWJlcihjb250cm9sLnZhbHVlKSA8IG1pbikge1xyXG4gICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobWF4ICE9PSB1bmRlZmluZWQgJiYgTnVtYmVyKGNvbnRyb2wudmFsdWUpID4gbWF4KSB7XHJcbiAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChoYXNFcnJvcikge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgbnVtZXJpY2JveDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBtaW46IG1pbixcclxuICAgICAgICAgICAgICAgICAgICBtYXg6IG1heCxcclxuICAgICAgICAgICAgICAgICAgICBkZWNpbWFsczogZGVjaW1hbHMsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4UHJlY2lzaW9uRGlnaXRzOiBtYXhQcmVjaXNpb25EaWdpdHNcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2VjLW51bWVyaWNib3gnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL251bWVyaWNib3guY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vbnVtZXJpY2JveC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgTnVtZXJpY2JveENvbXBvbmVudCBleHRlbmRzIEZvcm1Db250cm9sQmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIEFmdGVyVmlld0NoZWNrZWQsIEFmdGVyVmlld0luaXQge1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgdGV4dGJveCBpbnB1dCdzIHBsYWNlaG9sZGVyXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlcj86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBudW1iZXIgb2YgZGVjaW1hbHMgYWxsb3dlZC4gIElmIG5vdCBzdXBwbGllZCB0aGUgaW5wdXQgdmFsdWUgd2lsbCBiZSB2YWxpZGF0ZWQgYXMgYVxyXG4gICAgICogd2hvbGUgbnVtYmVyXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkZWNpbWFscz86IG51bWJlcjtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93IHRyYWlsaW5nIHplcm9zIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LlxyXG4gICAgICogRG8gbm90IHVzZSB3aXRoIG1heFByZWNpc2lvbkRpZ2l0cy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHNob3dQcmVjaXNpb24/OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1heGltdW0gdG90YWwgZGlnaXRzIGEgbnVtYmVyIGNhbiBoYXZlIGxlZnQgb3IgcmlnaHQgb2YgdGhlIGRlY2ltYWwgcG9pbnQuXHJcbiAgICAgKiBEdWUgdG8gbGltaXRhdGlvbnMgd2l0aCBob3cgSlMgaGFuZGxlcyBudW1iZXJzLCB0aGUgbWF4IHZhbHVlIGZvciB0aGlzIGlzIDE1LlxyXG4gICAgICogTnVtYmVycyBsb25nZXIgdGhhbiAxNSBkaWdpdHMgbWF5IGNhdXNlIHJvdW5kaW5nIGVycm9ycy5cclxuICAgICAqIERvIG5vdCB1c2Ugd2l0aCBzaG93UHJlY2lzaW9uID0gdHJ1ZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4UHJlY2lzaW9uRGlnaXRzPzogbnVtYmVyO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtYXhpbXVtIHZhbHVlIGFsbG93ZWQgaW4gdGhlIGlucHV0XHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBpcyBmb3IgYWRkaW5nIHRoZSBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSBicm93c2VyIGZ1bmN0aW9uYWxpdHlcclxuICAgICAqIGZyb20gdGhlIGlucHV0LiAgSWYgeW91IG5lZWQgdGhlIGZvcm0gdG8gYmUgdmFsaWRhdGVkIGJlZm9yZSBzdWJtaXNzaW9uLCBhcHBseSB0aGVcclxuICAgICAqIG1heCB2YWxpZGF0b3IgdG8gdGhlIGZvcm0gY29ucm9sLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4PzogbnVtYmVyO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtaW5pbXVtIHZhbHVlIGFsbG93ZWQgaW4gdGhlIGlucHV0XHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBpcyBmb3IgYWRkaW5nIHRoZSBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSBicm93c2VyIGZ1bmN0aW9uYWxpdHlcclxuICAgICAqIGZyb20gdGhlIGlucHV0LiAgSWYgeW91IG5lZWQgdGhlIGZvcm0gdG8gYmUgdmFsaWRhdGVkIGJlZm9yZSBzdWJtaXNzaW9uLCBhcHBseSB0aGVcclxuICAgICAqIG1pbiB2YWxpZGF0b3IgdG8gdGhlIGZvcm0gY29ucm9sLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWluPzogbnVtYmVyO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRleHQgdG8gZGlzcGxheSBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBpbnB1dFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbGVmdFVuaXRzPzogc3RyaW5nO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRleHQgdG8gZGlzcGxheSBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgaW5wdXRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHJpZ2h0VW5pdHM/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiBzZXQgdG8gdHJ1ZSB0aGlzIHdpbGwgdXBkYXRlIHRoZSBmb3JtIG1vZGVsIGFmdGVyIGEgZGVib3VuY2UgYXMgdGhlIHVzZXJcclxuICAgICAqIGludGVyYWN0cyB3aXRoIHRoZSBjb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGF1dG9VcGRhdGVGb3JtTW9kZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSB0ZXh0Ym94IGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZChUZXh0Ym94Q29tcG9uZW50LCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHRleHRib3hFbCE6IEVsZW1lbnRSZWY7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGludGVybmFsIGZvcm0gbW9kZWwgd2UgdXNlIHRvIGRpc3BsYXkgdGhlIHZhbHVlIHdpdGggZm9ybWF0dGluZ1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdGV4dGJveEZvcm1Nb2RlbCE6IFVudHlwZWRGb3JtQ29udHJvbDtcclxuXHJcbiAgICAvKiogRmxhZyB0byB0ZWxsIHRoZSBwYWdlIHdlIGZpbmFsbHkgY29tcHV0ZWQgYSBncmVhdGVyIHRoYW4gemVyb1xyXG4gICAgICogIHdpZHRoIGZvciB1bml0cyAoaWYgYXBwbGljYWJsZSlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1bml0c1dpZHRoQ2FsY3VsYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBGbGFnIHVzZWQgdG8gZmlsdGVyIHRoZSBmb3JtIG1vZGVscyB2YWx1ZSBjaGFuZ2VzIHN1YnNjcmlwdGlvblxyXG4gICAgICogIHRvIHByZXZlbnQgdGhlIHRleHRib3ggbW9kZWwgZnJvbSBiZWluZyBmb3JtYXR0ZWQgYXMgdGhlIGZvcm0gbW9kZWwgaXMgdXBkYXRlZFxyXG4gICAgICogIHByb2dyYW1tYXRpY2FsbHkgd2hlbiB0aGUgdGV4dGJveCBtb2RlbCB1cGRhdGVzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXV0b1VwZGF0aW5nRm9ybU1vZGVsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICogUmVmZXJlbmNlIHRvIHRoZSB0ZXh0Ym94IGlucHV0IGNvbnRyb2xcclxuICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ3RleHRib3gnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHRleHRib3hJbnB1dCE6IFRleHRib3hDb21wb25lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJvdGVjdGVkIHZhbGlkYXRpb25NZXNzYWdlU2VydmljZTogVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBmb3JtR3JvdXBIZWxwZXI6IEZvcm1Hcm91cEhlbHBlcixcclxuICAgICAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMlxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIodmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlLCBmb3JtR3JvdXBIZWxwZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW5ndWxhciBBZnRlclZpZXdJbml0IGxpZmUtY3ljbGUgaG9va1xyXG4gICAgICogU3Vic2NyaWJlIHRvIHRleHRib3ggbW9kZWwgdmFsdWUgY2hhbmdlcyBpZiB0aGUgaG9zdGluZ1xyXG4gICAgICogcGFnZSBoYXMgb3B0ZWQgaW4gZm9yIHRoaXMgY29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b1VwZGF0ZUZvcm1Nb2RlbCkge1xyXG4gICAgICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcclxuICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZCksXHJcbiAgICAgICAgICAgICAgICApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtTW9kZWxWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW5ndWxhciBvbkNoYW5nZXMgbGlmZS1jeWNsZSBob29rXHJcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvbGlmZWN5Y2xlLWhvb2tzIHwgTGlmZS1jeWNsZSBob29rc31cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICAvLyBJZiBlaXRoZXIgdW5pdHMgY2hhbmdlIGFmdGVyIHdlJ3ZlIGNhbGN1bGF0ZWQsXHJcbiAgICAgICAgLy8gcmVzZXQgdGhlIGZsYWcgc28gd2UgY2FuIHJlYWN0IGFuZCByZWRyYXdcclxuICAgICAgICBpZiAoY2hhbmdlcy5yaWdodFVuaXRzIHx8IGNoYW5nZXMubGVmdFVuaXRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5pdHNXaWR0aENhbGN1bGF0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuZ3VsYXIgb25Jbml0IGxpZmVjeWNsZSBob29rXHJcbiAgICAgKiBJZiB1bml0cyBpcyBkZWZpbmVkLCBzZXQgdGhlIHBvc2l0aW9uIGFuZCBsaXN0ZW4gZm9yIHN0YXR1cyBjaGFuZ2VzIHNvIHdlXHJcbiAgICAgKiBjYW4gdXBkYXRlIHRoZSBwb3NpdGlvbmluZyBvZiB0aGUgdW5pdHMgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgdGV4dGJveCBmb3JtIG1vZGVsIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBmb3JtIG1vZGVsIGFuZCBzeW5jaHJvbml6ZVxyXG4gICAgICAgIC8vIGRpc2FibGVkIHN0YXRlXHJcbiAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiB0aGlzLmZvcm1Nb2RlbC52YWx1ZSwgZGlzYWJsZWQ6IHRoaXMuZm9ybU1vZGVsLmRpc2FibGVkIH0pO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIGZvcm0gbW9kZWwncyBlcnJvcnMgd2hlbiB0aGUgdGV4dGJveCBmb3JtIG1vZGVsIHN0YXR1cyBjaGFuZ2VzXHJcbiAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnN0YXR1c0NoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtTW9kZWwuZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtTW9kZWwuc2V0RXJyb3JzKHRoaXMudGV4dGJveEZvcm1Nb2RlbC5lcnJvcnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgLy8gU3luY2hyb25pemUgZGlzYWJsZWQgc3RhdGUgYmV0d2VlbiBmb3JtIG1vZGVsIGFuZCBpbnRlcm5hbCB0ZXh0Ym94IGZvcm0gbW9kZWxcclxuICAgICAgICB0aGlzLmZvcm1Nb2RlbC5zdGF0dXNDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybU1vZGVsLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGV4dGJveEZvcm1Nb2RlbC5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dGJveEZvcm1Nb2RlbC5lbmFibGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBTZXQgdGV4dGJveCB2YWxpZGF0b3JzXHJcbiAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbGlkYXRvcnModGhpcy5nZXRWYWxpZGF0b3JzKCkpO1xyXG5cclxuICAgICAgICAvLyBOb3cgdGhhdCB0aGUgdGV4dGJveCBpcyBzZXQgdXAgd2Ugd2lsbCBzZXQgaXQncyB2YWx1ZSB0byB3aGF0ZXZlciB0aGVcclxuICAgICAgICAvLyBmb3JtIG1vZGVsIGhhZCB3aGVuIHdlIGluaXRpYWxpemVkXHJcbiAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbHVlKHRoaXMuZm9ybWF0RGlzcGxheU51bWJlcih0aGlzLmZvcm1Nb2RlbC52YWx1ZSkpO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgZm9ybSBtb2RlbCdzIHZhbHVlIGNoYW5nZXMgcHJvZ3JhbW1hdGljYWxseSB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGVcclxuICAgICAgICAvLyB0ZXh0Ym94IGZvcm0gbW9kZWxcclxuICAgICAgICB0aGlzLmZvcm1Nb2RlbC52YWx1ZUNoYW5nZXMucGlwZShcclxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBmaWx0ZXIgb3V0IHdoZW4gd2UgYXJlIHVwZGF0aW5nIGl0IHByb2dyYW1tYXRpY2FsbHkgaWYgdGhlXHJcbiAgICAgICAgICAgIC8vIGhvc3RpbmcgcGFnZSBoYXMgb3B0ZWQgaW50byB0aGUgYXV0byB1cGRhdGluZyBpbnB1dFxyXG4gICAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMuYXV0b1VwZGF0aW5nRm9ybU1vZGVsKSxcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKSkuc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWx1ZSh0aGlzLmZvcm1hdERpc3BsYXlOdW1iZXIodmFsdWUpKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSB0ZXh0Ym94IHN0YXR1cyBjaGFuZ2VzIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBsZWZ0IHVuaXRzIHBvc2l0aW9uIGJlY2F1c2VcclxuICAgICAgICAvLyB3ZSB3YW50IHRvIG1ha2Ugcm9vbSBmb3IgdGhlIGludmFsaWQgaWNvblxyXG4gICAgICAgIGlmICh0aGlzLmxlZnRVbml0cykge1xyXG4gICAgICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuc3RhdHVzQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uTGVmdFVuaXRzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbmd1bGFyIGFmdGVyVmlld0NoZWNrZWQgbGlmZWN5Y2xlIGhvb2tcclxuICAgICAqIFNob3cgdGhlIHVuaXRzIGVsZW1lbnQgaWYgdW5pdHMgaXMgZGVmaW5lZC4gUnVucyBhZnRlciBldmVyeSBuZ09uQ2hhbmdlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICgodGhpcy5sZWZ0VW5pdHMgfHwgdGhpcy5yaWdodFVuaXRzKSAmJiAhdGhpcy51bml0c1dpZHRoQ2FsY3VsYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dVbml0cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uIHRoYXQgYnVpbGRzIGFuZCByZXR1cm5zIGEgVmFsaWRhdG9yRm4gYXJyYXkgdG8gc2V0IG9uIHRoZSBmb3JtIGNvbnRyb2xcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRWYWxpZGF0b3JzKCk6IFZhbGlkYXRvckZuW10ge1xyXG4gICAgICAgIGxldCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVkKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChudW1lcmljYm94VmFsaWRhdGlvbih0aGlzLm1pbiwgdGhpcy5tYXgsIHRoaXMuZGVjaW1hbHMsIHRoaXMubWF4UHJlY2lzaW9uRGlnaXRzKSk7XHJcblxyXG4gICAgICAgIHJldHVybiB2YWxpZGF0b3JzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9jdXMgb3V0IGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBUZXh0Ym94IGNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25Gb2N1c091dCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1Nb2RlbFZhbHVlKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBGdW5jdGlvbiB0byBzZXQgZm9jdXMgb24gYW4gaW5wdXQgcHJvZ3JhbWF0aWNhbGx5IGFmdGVyIHRoZSBwYWdlXHJcbiAgICAqIGhhZCBiZWVuIHJlbmRlcmVkLiAgVGhlIGhpZ2hsaWdodCB0ZXh0IGZsYWcgd2lsbCBzZWxlY3QgdGhlIHRleHRcclxuICAgICogd2l0aGluIHRoZSBpbnB1dCBpZiBwYXNzZWQgaW4gYW5kIHRydWVcclxuICAgICovXHJcbiAgICBwdWJsaWMgc2V0Rm9jdXMoaGlnaGxpZ2h0VGV4dD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRleHRib3hJbnB1dC5zZXRGb2N1cyhoaWdobGlnaHRUZXh0KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIHRoZSB0ZXh0Ym94IG1vZGVsIHVwZGF0ZXMgd2UgbmVlZCB0byBhZGQgc29tZSBkaXNwbGF5IGZvcm1hdHRpbmcgZm9yXHJcbiAgICAgKiBkaXNwbGF5IGluIHRoZSB0ZXh0Ym94IGFuZCBjYXN0IHRoZSB0ZXh0Ym94IG1vZGVsIHRvIGEgbnVtYmVyLiBBdm9pZCB1cGRhdGluZ1xyXG4gICAgICogdGhlIGZvcm0gbW9kZWwgd2hlbiB0aGUgdmFsdWUgZG9lc24ndCBjaGFuZ2UgYmVjYXVzZSBsaXN0ZW5lcnMgd2lsbCBmaXJlIGZvciBubyByZWFzb25cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVGb3JtTW9kZWxWYWx1ZShpc0ZvY3VzT3V0PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmF1dG9VcGRhdGVGb3JtTW9kZWwpIHtcclxuICAgICAgICAgICAgLy8gTWFrZSBpdCBzbyB2YWx1ZSBjaGFuZ2VzIG9uIHRoZSBmb3JtIG1vZGVsIGRvIG5vdCBnZXQgdHJpZ2dlcmVkXHJcbiAgICAgICAgICAgIC8vIGFzIHdlIGNoYW5nZSBpdCBwcm9ncmFtbWF0aWNhbGx5LiAgV2UgZG8gbm90IHdhbnQgdGhlIHRleHRib3hcclxuICAgICAgICAgICAgLy8gbW9kZWwgdG8gYmUgdXBkYXRlZCB3aGlsZSB0aGUgdXNlciBpcyBpbiB0aGUgaW5wdXRcclxuICAgICAgICAgICAgdGhpcy5hdXRvVXBkYXRpbmdGb3JtTW9kZWwgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWxpZCB8fCB0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG91dCB3aXRoIG51bGwgZm9yIHRoZSBudW1iZXIsIGlmIHRoZSB0ZXh0Ym94IHZhbHVlIGlzIG5vdCBhIG51bWJlclxyXG4gICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBjbGVhciBpdCBvdXQgb24gZm9jdXMgb3V0XHJcbiAgICAgICAgICAgICAgICBsZXQgbnVtYmVyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHRleHRib3ggbW9kZWwgaXMgYSBudW1iZXIgYmVmb3JlIHRyeWluZyB0byB1cGRhdGUgdGhlXHJcbiAgICAgICAgICAgICAgICAvLyBmb3JtIG1vZGVsIHZhbHVlIHdpdGggaXRcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUgJiYgIWlzTmFOKHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBPdXIgdmFsdWUgaXMgYSBsZWdpdCBudW1iZXIsIG9uIGZvY3VzIG91dCB3ZSB3aWxsIGZvcm1hdCBpdCBpZiBuZWVkZWRcclxuICAgICAgICAgICAgICAgICAgICBudW1iZXIgPSBOdW1iZXIodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhlIHZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLCBpZiBub3QgZG9uJ3Qgc2V0IHRoZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHRvIGF2b2lkIGV4dHJhIGxpc3RlbmVyIGNhbGxzXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybU1vZGVsLnZhbHVlICE9PSBudW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtTW9kZWwuc2V0VmFsdWUobnVtYmVyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRleHRib3ggbW9kZWwgaXMgbm90IGEgbnVtYmVyLCBjaGVjayB0byBzZWUgaWYgb3VyIGZvcm0gbW9kZWwgaGFzIGEgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgaWYgc28gY2xlYXIgaXQgb3V0XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybU1vZGVsLnZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtTW9kZWwuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gV2Ugb25seSB3aWxsIHVwZGF0ZSB0aGUgdGV4dGJveCBmb3JtIG1vZGVsIHdpdGggZm9ybWF0dGluZyBpZiBuZWVkZWRcclxuICAgICAgICAgICAgICAgIC8vIG9uIEZvY3VzIG91dC4gIFRoaXMgd29ya3Mgd2VsbCBmb3IgdGhlIHVzZXIgd2hldGhlciB0aGUgYXV0byB1cGRhdGVcclxuICAgICAgICAgICAgICAgIC8vIGlzIG9wdGVkIGluIG9yIG5vdFxyXG4gICAgICAgICAgICAgICAgaWYgKGlzRm9jdXNPdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUodGhpcy5mb3JtYXREaXNwbGF5TnVtYmVyKG51bWJlcikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgLy8gTm90aGluZyB0byBkaXNwbGF5LCBqdXN0IGVuc3VyaW5nIHdlIHJlc2V0IG91ciBmbGFnIHRoYXQgZmlsdGVyc1xyXG4gICAgICAgICAgICAvLyB0aGUgZm9ybSBtb2RlbCB2YWx1ZSBjaGFuZ2VzXHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy5hdXRvVXBkYXRpbmdGb3JtTW9kZWwgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0IGEgbnVtYmVyIHZhbHVlIHRvIHRoZSBmb3JtbWF0ZWQgZGlzcGxheSBzdHJpbmcuIElmIHRoZXJlIGlzIG5vIHZhbHVlXHJcbiAgICAgKiByZXR1cm4gbnVsbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZvcm1hdERpc3BsYXlOdW1iZXIodmFsdWU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgICAgICBpZiAodmFsdWUgfHwgdmFsdWUgPT09IDApIHtcclxuICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBjYWxsaW5nIHRvRml4ZWQgaWYgdGhlIHZhbHVlIGlzbid0IGEgbnVtYmVyLiAgVGhpcyBpcyBwb3NzaWJsZVxyXG4gICAgICAgICAgICAvLyBpZiBwYXRjaGluZyBhIHZhbHVlIGZyb20gb3V0c2lkZSBvZiB0aGUgY29tcG9uZW50IGFzIHlvdSBkb24ndCBoYXZlXHJcbiAgICAgICAgICAgIC8vIHR5cGUgY2hlY2tpbmcgdGhlcmVcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1ByZWNpc2lvbiAmJiB0aGlzLmRlY2ltYWxzICYmICFpc05hTih2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b0ZpeGVkKHRoaXMuZGVjaW1hbHMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQb3NpdGlvbiB0aGUgdW5pdHMgZWxlbWVudCBhbmQgc2V0IHRoZSBwYWRkaW5nIGluIHRoZSB0ZXh0Ym94IGlucHV0IGJhc2VkXHJcbiAgICAgKiBvbiB0aGUgd2lkdGggb2YgdGhlIHVuaXRzIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwb3NpdGlvblJpZ2h0VW5pdHMoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHVuaXRzRWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy51bml0cy1yaWdodCcpO1xyXG4gICAgICAgIGxldCBpbnB1dEVsID0gdGhpcy50ZXh0Ym94RWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xyXG5cclxuICAgICAgICBpZiAodW5pdHNFbCAmJiBpbnB1dEVsKSB7XHJcbiAgICAgICAgICAgIGxldCB1bml0c1dpZHRoID0gdW5pdHNFbC5vZmZzZXRXaWR0aDtcclxuXHJcbiAgICAgICAgICAgIGlmICh1bml0c1dpZHRoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51bml0c1dpZHRoQ2FsY3VsYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBwYWRkaW5nID0gdW5pdHNXaWR0aDtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpbnB1dEVsLCAncGFkZGluZy1yaWdodCcsIHBhZGRpbmcgKyAncHgnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgcG9zaXRpb25MZWZ0VW5pdHMoKSB7XHJcbiAgICAgICAgbGV0IHVuaXRzRWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy51bml0cy1sZWZ0Jyk7XHJcbiAgICAgICAgbGV0IGlucHV0RWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcblxyXG4gICAgICAgIGlmICh1bml0c0VsICYmIGlucHV0RWwpIHtcclxuICAgICAgICAgICAgbGV0IHVuaXRzV2lkdGggPSB1bml0c0VsLm9mZnNldFdpZHRoO1xyXG5cclxuICAgICAgICAgICAgaWYgKHVuaXRzV2lkdGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVuaXRzV2lkdGhDYWxjdWxhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHBhZGRpbmcgPSB1bml0c1dpZHRoO1xyXG4gICAgICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gZ2V0Q29tcHV0ZWRTdHlsZSh1bml0c0VsKS5sZWZ0O1xyXG4gICAgICAgICAgICBpZiAobGVmdFBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nICs9IHBhcnNlSW50KGxlZnRQb3NpdGlvbi5yZXBsYWNlKCdweCcsICcnKSwgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpbnB1dEVsLCAncGFkZGluZy1sZWZ0JywgcGFkZGluZyArICdweCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBhbmQgYXBwZW5kIHRoZSB1bml0cyBlbGVtZW50IHRvIHRoZSB0ZXh0Ym94IGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzaG93VW5pdHMoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGlucHV0V3JhcHBlciA9IHRoaXMudGV4dGJveEVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmlucHV0LXdyYXBwZXInKTtcclxuXHJcbiAgICAgICAgaWYgKGlucHV0V3JhcHBlcikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0VW5pdHMpIHtcclxuICAgICAgICAgICAgICAgIGxldCB1bml0c0VsID0gdGhpcy50ZXh0Ym94RWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudW5pdHMtbGVmdCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHVuaXRzRWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHVuaXRzRWwsICdpbm5lckhUTUwnLCB0aGlzLmxlZnRVbml0cyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoaW5wdXRXcmFwcGVyLCB0aGlzLm1ha2VVbml0RWxlbWVudCgnbGVmdCcsIHRoaXMubGVmdFVuaXRzKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uTGVmdFVuaXRzKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0VW5pdHMpIHtcclxuICAgICAgICAgICAgICAgIGxldCB1bml0c0VsID0gdGhpcy50ZXh0Ym94RWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudW5pdHMtcmlnaHQnKTtcclxuICAgICAgICAgICAgICAgIGlmICh1bml0c0VsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh1bml0c0VsLCAnaW5uZXJIVE1MJywgdGhpcy5yaWdodFVuaXRzKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChpbnB1dFdyYXBwZXIsIHRoaXMubWFrZVVuaXRFbGVtZW50KCdyaWdodCcsIHRoaXMucmlnaHRVbml0cykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvblJpZ2h0VW5pdHMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1ha2VVbml0RWxlbWVudChzaWRlOiAnbGVmdCcgfCAncmlnaHQnLCB0ZXh0OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIGxldCB1bml0c0VsID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodW5pdHNFbCwgJ2NsYXNzJywgYHVuaXRzIHVuaXRzLSR7c2lkZX1gKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh1bml0c0VsLCAnaWQnLCBgJHt0aGlzLmlkfV91bml0c2ApO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHVuaXRzRWwsICdzdHlsZScsICdwb2ludGVyLWV2ZW50czogbm9uZScpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodW5pdHNFbCwgJ2lubmVySFRNTCcsIHRleHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gdW5pdHNFbDtcclxuICAgIH1cclxufSIsIjxkaXYgY2xhc3M9XCJjb250cm9sIGNvbnRyb2wtbGFiZWwte3tsYWJlbFBvc2l0aW9ufX1cIlxyXG4gICAgIFtjbGFzcy5pbnZhbGlkXT1cImZvcm1Nb2RlbD8uaW52YWxpZCAmJiAoZm9ybU1vZGVsPy50b3VjaGVkKVwiPlxyXG5cclxuICAgICAgIDxsYWJlbCAqbmdJZj1cImxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3tsYWJlbCB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidmFsaWRhdGlvbkVycm9ycy5sZW5ndGggJiYgZm9ybU1vZGVsPy50b3VjaGVkICYmIGZvcm1Nb2RlbD8uaW52YWxpZFwiPiZuYnNwO3t7dmFsaWRhdGlvbkVycm9ycyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxlYy1oZWxwLXBvcG92ZXIgaWQ9XCJ7e2lkfX1faGVscFBvcG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJoZWxwUG9wb3ZlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtaW5saW5lLWJsb2NrIG15LW4zIG14LW4xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9XCJ7e2hlbHBQb3BvdmVyIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFBvc2l0aW9uPVwie3toZWxwUG9wb3ZlclBvc2l0aW9ufX1cIj5cclxuICAgICAgICAgICAgICA8L2VjLWhlbHAtcG9wb3Zlcj5cclxuICAgICAgIDwvbGFiZWw+XHJcblxyXG4gICAgICAgPCEtLSBTZXR0aW5nIHRoZSBtYXhsZW5ndGggdG8gMTMgdG8gY29tYmF0IHRoZSB1c2VyIGZyb20gZW50ZXJpbmcgdG9vIGxhcmdlIG9mIGEgbnVtYmVyXHJcbiAgICAgICAgIGZvciBqYXZhc2NyaXB0IHRvIHN1cHBvcnQuICBJZiB0aGUgdXNlciBlbnRlcnMgYWxsIDEzIGNoYXJhY3RlcnMgYXMgbnVtYmVycyBhbmQgd2UgaGF2ZSBzaG93UHJlY2lzaW9uIHNldCwgYWRkaW5nIHRoZVxyXG4gICAgICAgICBkZWNpbWFsIGFuZCB0aGUgZW1wdHkgemVybyBjaGFyYWN0ZXJzIHdpbGwgZ2V0IHRoZW0gaW4gYSBzaXR1YXRpb24gd2hlcmUgdG8gZWRpdCBpdCB0aGV5IG11c3QgcmVtb3ZlIGNoYXJhY3RlcnNcclxuICAgICAgICAgYXMgd2Ugd291bGQgcHVzaCB0aGVtIHBhc3QgdGhlIGxpbWl0IC0tPlxyXG4gICAgICAgPGVjLXRleHRib3ggW2lkXT1cImlkXCJcclxuICAgICAgICAgICAgICAgICAgICN0ZXh0Ym94XHJcbiAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRyb2wtaW5wdXQgbWItMFwiXHJcbiAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgW21heGxlbmd0aF09XCJtYXhQcmVjaXNpb25EaWdpdHMgPyBtYXhQcmVjaXNpb25EaWdpdHMgKyAzIDogMTNcIlxyXG4gICAgICAgICAgICAgICAgICAgW2F1dG9mb2N1c109XCJhdXRvZm9jdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgW2Zvcm1Nb2RlbF09XCJ0ZXh0Ym94Rm9ybU1vZGVsXCJcclxuICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cInRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cIm9uRm9jdXNPdXQoKVwiPlxyXG4gICAgICAgPC9lYy10ZXh0Ym94PlxyXG48L2Rpdj4iXX0=
@@ -0,0 +1,117 @@
1
+ import { OverlayConfig } from '@angular/cdk/overlay';
2
+ import { TemplatePortal } from '@angular/cdk/portal';
3
+ import { Component, HostListener, Input, ViewChild } from '@angular/core';
4
+ import { of, Subject } from 'rxjs';
5
+ import { delay, switchMap, takeUntil } from 'rxjs/operators';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/cdk/overlay";
8
+ import * as i2 from "../../display/tooltip/tooltip.service";
9
+ import * as i3 from "@angular/common";
10
+ import * as i4 from "../../display/tags/tags.component";
11
+ export class PopoverComponent {
12
+ constructor(overlay, viewContainerRef, elementRef, tooltipService) {
13
+ this.overlay = overlay;
14
+ this.viewContainerRef = viewContainerRef;
15
+ this.elementRef = elementRef;
16
+ this.tooltipService = tooltipService;
17
+ /** An optional icon that, if provided, enables the popover to use it as the anchor element */
18
+ this.icon = '';
19
+ this.contentPosition = 'top-left';
20
+ this.iconHoverClass = '';
21
+ this.isVisible = false;
22
+ this.mouseOver = new Subject();
23
+ this.interrupt = new Subject();
24
+ }
25
+ /** When the popover initializes, if a new tagType is provided for the hover state of the popover,
26
+ * we use it to update the type of our "hoverTag" (which controls background-color of tag)
27
+ */
28
+ ngOnInit() {
29
+ if (this.tag && this.tagHoverType) {
30
+ this.hoverTag = { ...this.tag, type: this.tagHoverType };
31
+ }
32
+ this.mouseOver
33
+ .pipe(switchMap(v => of(v).pipe(delay(300), takeUntil(this.interrupt))))
34
+ .subscribe(() => this.show());
35
+ }
36
+ ngOnDestroy() {
37
+ this.hide();
38
+ }
39
+ show() {
40
+ if (!this.isVisible) {
41
+ const overlayConfig = this.getOverlayConfig();
42
+ this.overlayRef = this.overlay.create(overlayConfig);
43
+ const contentPortal = new TemplatePortal(this.content, this.viewContainerRef);
44
+ this.contentViewRef = this.overlayRef.attach(contentPortal);
45
+ this.isVisible = true;
46
+ }
47
+ }
48
+ onMouseOver() {
49
+ this.mouseOver.next();
50
+ }
51
+ onLeave() {
52
+ this.interrupt.next();
53
+ }
54
+ /**
55
+ * Hides the popover if the mouse moves outside of the popover content
56
+ */
57
+ onMouseMove(event) {
58
+ let callCallback = false;
59
+ if (!this.contentRect) {
60
+ this.contentRect = this.contentViewRef?.rootNodes[0].getBoundingClientRect();
61
+ }
62
+ if (this.contentRect) {
63
+ callCallback = this.tooltipService.onMove(event, this.contentRect);
64
+ }
65
+ if (callCallback) {
66
+ this.hide();
67
+ }
68
+ }
69
+ hide() {
70
+ this.interrupt.next();
71
+ this.overlayRef?.dispose();
72
+ this.isVisible = false;
73
+ this.contentRect = undefined;
74
+ }
75
+ getOverlayConfig() {
76
+ const position = this.getPosition();
77
+ const positionStrategy = this.overlay.position()
78
+ .flexibleConnectedTo(this.elementRef)
79
+ .withPositions([position]);
80
+ const config = new OverlayConfig({
81
+ positionStrategy: positionStrategy
82
+ });
83
+ return config;
84
+ }
85
+ getPosition() {
86
+ const position = this.contentPosition.split('-');
87
+ const overlayX = (position[1] == 'left' ? 'start' : 'end');
88
+ const overlayY = position[0];
89
+ return { originX: overlayX, originY: overlayY, overlayX: overlayX, overlayY: overlayY };
90
+ }
91
+ }
92
+ PopoverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PopoverComponent, deps: [{ token: i1.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ElementRef }, { token: i2.TooltipService }], target: i0.ɵɵFactoryTarget.Component });
93
+ PopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: PopoverComponent, selector: "ec-popover", inputs: { icon: "icon", tag: "tag", tagHoverType: "tagHoverType", contentPosition: "contentPosition", iconHoverClass: "iconHoverClass" }, host: { listeners: { "mouseover": "onMouseOver()", "mouseleave": "onLeave()" } }, viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: "<!-- Before hover state -->\r\n<div class=\"p-2\">\r\n <i *ngIf=\"!tag\" class=\"ec-icon {{icon}} ec-icon-sm\"></i>\r\n <ec-tags *ngIf=\"tag\"\r\n [isCondensed] = \"true\"\r\n [tags]=\"tag\">\r\n </ec-tags>\r\n</div>\r\n<!-- ./Before hover state -->\r\n\r\n<!-- Hover state -->\r\n<ng-template #content>\r\n <article class=\"popover-content\"\r\n (document:mousemove)=\"onMouseMove($event)\">\r\n <ng-content></ng-content>\r\n </article>\r\n <div class=\"p-2 {{contentPosition}}\">\r\n <i *ngIf=\"!tag\" class=\"ec-icon {{icon}} ec-icon-sm {{iconHoverClass}}\"></i>\r\n <ec-tags *ngIf=\"tag\"\r\n [isCondensed]=\"true\"\r\n [tags]=\"hoverTag\">\r\n </ec-tags>\r\n </div>\r\n</ng-template>\r\n<!-- ./Hover state -->\r\n", styles: [":host{line-height:.75rem;display:inline-block}.popover-content{border-radius:var(--ec-border-radius);box-shadow:0 3px 6px #1a1a231f;overflow:hidden;position:relative}.popover-content+div{position:absolute;line-height:.75rem}.popover-content+div.top-left{top:0;left:0}.popover-content+div.top-right{top:0;right:0}.popover-content+div.bottom-right{bottom:0;right:0}.popover-content+div.bottom-left{bottom:0;left:0}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TagsComponent, selector: "ec-tags", inputs: ["id", "tags", "wrap", "isCondensed"], outputs: ["tagClosed"] }] });
94
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PopoverComponent, decorators: [{
95
+ type: Component,
96
+ args: [{ selector: 'ec-popover', template: "<!-- Before hover state -->\r\n<div class=\"p-2\">\r\n <i *ngIf=\"!tag\" class=\"ec-icon {{icon}} ec-icon-sm\"></i>\r\n <ec-tags *ngIf=\"tag\"\r\n [isCondensed] = \"true\"\r\n [tags]=\"tag\">\r\n </ec-tags>\r\n</div>\r\n<!-- ./Before hover state -->\r\n\r\n<!-- Hover state -->\r\n<ng-template #content>\r\n <article class=\"popover-content\"\r\n (document:mousemove)=\"onMouseMove($event)\">\r\n <ng-content></ng-content>\r\n </article>\r\n <div class=\"p-2 {{contentPosition}}\">\r\n <i *ngIf=\"!tag\" class=\"ec-icon {{icon}} ec-icon-sm {{iconHoverClass}}\"></i>\r\n <ec-tags *ngIf=\"tag\"\r\n [isCondensed]=\"true\"\r\n [tags]=\"hoverTag\">\r\n </ec-tags>\r\n </div>\r\n</ng-template>\r\n<!-- ./Hover state -->\r\n", styles: [":host{line-height:.75rem;display:inline-block}.popover-content{border-radius:var(--ec-border-radius);box-shadow:0 3px 6px #1a1a231f;overflow:hidden;position:relative}.popover-content+div{position:absolute;line-height:.75rem}.popover-content+div.top-left{top:0;left:0}.popover-content+div.top-right{top:0;right:0}.popover-content+div.bottom-right{bottom:0;right:0}.popover-content+div.bottom-left{bottom:0;left:0}\n"] }]
97
+ }], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i2.TooltipService }]; }, propDecorators: { icon: [{
98
+ type: Input
99
+ }], tag: [{
100
+ type: Input
101
+ }], tagHoverType: [{
102
+ type: Input
103
+ }], contentPosition: [{
104
+ type: Input
105
+ }], iconHoverClass: [{
106
+ type: Input
107
+ }], content: [{
108
+ type: ViewChild,
109
+ args: ['content']
110
+ }], onMouseOver: [{
111
+ type: HostListener,
112
+ args: ['mouseover']
113
+ }], onLeave: [{
114
+ type: HostListener,
115
+ args: ['mouseleave']
116
+ }] } });
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvcG9wb3Zlci9wb3BvdmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9wb3BvdmVyL3BvcG92ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE4QixhQUFhLEVBQWMsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBK0IsWUFBWSxFQUFFLEtBQUssRUFBMEIsU0FBUyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUNqSixPQUFPLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBVzdELE1BQU0sT0FBTyxnQkFBZ0I7SUFrQzNCLFlBQ1UsT0FBZ0IsRUFDaEIsZ0JBQWtDLEVBQ2xDLFVBQXNCLEVBQ3RCLGNBQThCO1FBSDlCLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQXBDeEMsOEZBQThGO1FBQ3JGLFNBQUksR0FBWSxFQUFFLENBQUM7UUFRbkIsb0JBQWUsR0FBMkIsVUFBVSxDQUFDO1FBRXJELG1CQUFjLEdBQVcsRUFBRSxDQUFDO1FBZ0I3QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBRTNCLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2hD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LENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxXQUFXO1FBQ2pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sUUFBUSxHQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUUsTUFBTSxRQUFRLEdBQXFCLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQzFGLENBQUM7OzZHQXBJVSxnQkFBZ0I7aUdBQWhCLGdCQUFnQixrWENmN0IsMnhCQXlCQTsyRkRWYSxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsWUFBWTttTEFPYixJQUFJO3NCQUFaLEtBQUs7Z0JBR0csR0FBRztzQkFBWCxLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUV1QixPQUFPO3NCQUFuQyxTQUFTO3VCQUFDLFNBQVM7Z0JBZ0ViLFdBQVc7c0JBRGpCLFlBQVk7dUJBQUMsV0FBVztnQkFNbEIsT0FBTztzQkFEYixZQUFZO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25uZWN0ZWRQb3NpdGlvbiwgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFbWJlZGRlZFZpZXdSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uRGVzdHJveSwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWxheSwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFRhZywgVGFnVHlwZSB9IGZyb20gJy4uLy4uL2Rpc3BsYXkvdGFncy90YWcnO1xyXG5pbXBvcnQgeyBUb29sdGlwU2VydmljZSB9IGZyb20gJy4uLy4uL2Rpc3BsYXkvdG9vbHRpcC90b29sdGlwLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0IHR5cGUgUG9wb3ZlckNvbnRlbnRQb3NpdGlvbiA9ICd0b3AtbGVmdCcgfCAndG9wLXJpZ2h0JyB8ICdib3R0b20tcmlnaHQnIHwgJ2JvdHRvbS1sZWZ0JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZWMtcG9wb3ZlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3BvcG92ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3BvcG92ZXIuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUG9wb3ZlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIC8qKiBBbiBvcHRpb25hbCBpY29uIHRoYXQsIGlmIHByb3ZpZGVkLCBlbmFibGVzIHRoZSBwb3BvdmVyIHRvIHVzZSBpdCBhcyB0aGUgYW5jaG9yIGVsZW1lbnQgKi9cclxuICBASW5wdXQoKSBpY29uPzogc3RyaW5nID0gJyc7XHJcbiAgXHJcbiAgLyoqIEFuIG9wdGlvbmFsIHRhZyB0aGF0LCBpZiBwcm92aWRlZCwgZW5hYmxlcyB0aGUgcG9wb3ZlciB0byB1c2UgaXQgYXMgdGhlIGFuY2hvciBlbGVtZW50ICovXHJcbiAgQElucHV0KCkgdGFnPzogVGFnO1xyXG5cclxuICAvKiogVXNlZCB0byBkZW5vdGUgdGhlIGhvdmVyIHRhZydzIHR5cGUgKGFuZCB0aHVzIGJhY2tncm91bmQtY29sb3IpICovXHJcbiAgQElucHV0KCkgdGFnSG92ZXJUeXBlPzogVGFnVHlwZTtcclxuXHJcbiAgQElucHV0KCkgY29udGVudFBvc2l0aW9uOiBQb3BvdmVyQ29udGVudFBvc2l0aW9uID0gJ3RvcC1sZWZ0JztcclxuXHJcbiAgQElucHV0KCkgaWNvbkhvdmVyQ2xhc3M6IHN0cmluZyA9ICcnO1xyXG5cclxuICBAVmlld0NoaWxkKCdjb250ZW50JykgcHVibGljIGNvbnRlbnQhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBcclxuXHJcbiAgLyoqIEluIHRoZSB0ZW1wbGF0ZSwgd2UgdXNlIGFuIGVjLXRhZ3MgZWxlbWVudCBmb3IgdGhlIHByZS1ob3ZlciBzdGF0ZSBhbmQgYW4gZW50aXJlbHlcclxuICAgKiAgc2VwYXJhdGUgZWMtdGFncyBlbGVtZW50IGZvciBvdXIgaG92ZXIgc3RhdGUsIHJlc3VsdGluZyBpbiB0d28gY29tcG9uZW50cy4gVG8gYWNoaWV2ZSBhIGNoYW5nZSBcclxuICAgKiBpbiB0aGUgYmFja2dyb3VuZC1jb2xvciBmb3Igb3VyIGFuY2hvciB0YWcsIG9uIGhvdmVyLCBhIGRpZmZlcmVudCB0YWcudGFnVHlwZSBtdXN0IGJlIHByb3ZpZGVkIG9uIHRoZVxyXG4gICAqIHNlY29uZCBlYy10YWcgZWxlbWVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyBob3ZlclRhZz86IFRhZztcclxuXHJcbiAgcHJpdmF0ZSBvdmVybGF5UmVmPzogT3ZlcmxheVJlZjtcclxuICBwcml2YXRlIGNvbnRlbnRWaWV3UmVmPzogRW1iZWRkZWRWaWV3UmVmPGFueT47XHJcbiAgcHJpdmF0ZSBjb250ZW50UmVjdDogRE9NUmVjdCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGlzVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIG1vdXNlT3ZlciA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHJpdmF0ZSBpbnRlcnJ1cHQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcclxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgdG9vbHRpcFNlcnZpY2U6IFRvb2x0aXBTZXJ2aWNlLFxyXG4gICkgeyB9XHJcblxyXG4gIC8qKiBXaGVuIHRoZSBwb3BvdmVyIGluaXRpYWxpemVzLCBpZiBhIG5ldyB0YWdUeXBlIGlzIHByb3ZpZGVkIGZvciB0aGUgaG92ZXIgc3RhdGUgb2YgdGhlIHBvcG92ZXIsIFxyXG4gICAqICB3ZSB1c2UgaXQgdG8gdXBkYXRlIHRoZSB0eXBlIG9mIG91ciBcImhvdmVyVGFnXCIgKHdoaWNoIGNvbnRyb2xzIGJhY2tncm91bmQtY29sb3Igb2YgdGFnKSBcclxuICAgKi9cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0aGlzLnRhZyAmJiB0aGlzLnRhZ0hvdmVyVHlwZSkge1xyXG4gICAgICB0aGlzLmhvdmVyVGFnID0gey4uLnRoaXMudGFnLCB0eXBlOiB0aGlzLnRhZ0hvdmVyVHlwZSB9O1xyXG4gICAgfVxyXG4gICAgdGhpcy5tb3VzZU92ZXJcclxuICAgIC5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAodiA9PlxyXG4gICAgICAgIG9mKHYpLnBpcGUoXHJcbiAgICAgICAgICBkZWxheSgzMDApLFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuaW50ZXJydXB0KVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNob3coKSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuaGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzaG93KCkge1xyXG5cclxuICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcclxuICAgICAgXHJcbiAgICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSB0aGlzLmdldE92ZXJsYXlDb25maWcoKTtcclxuICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShvdmVybGF5Q29uZmlnKTtcclxuICBcclxuICAgICAgY29uc3QgY29udGVudFBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLmNvbnRlbnQsIHRoaXMudmlld0NvbnRhaW5lclJlZik7XHJcbiAgICAgIHRoaXMuY29udGVudFZpZXdSZWYgPSB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKGNvbnRlbnRQb3J0YWwpO1xyXG4gIFxyXG4gICAgICB0aGlzLmlzVmlzaWJsZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZW92ZXInKVxyXG4gIHB1YmxpYyBvbk1vdXNlT3ZlcigpIHtcclxuICAgIHRoaXMubW91c2VPdmVyLm5leHQoKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnKVxyXG4gIHB1YmxpYyBvbkxlYXZlKCkge1xyXG4gICAgdGhpcy5pbnRlcnJ1cHQubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGlkZXMgdGhlIHBvcG92ZXIgaWYgdGhlIG1vdXNlIG1vdmVzIG91dHNpZGUgb2YgdGhlIHBvcG92ZXIgY29udGVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgbGV0IGNhbGxDYWxsYmFjayA9IGZhbHNlO1xyXG4gICAgXHJcbiAgICBpZighdGhpcy5jb250ZW50UmVjdCkge1xyXG4gICAgICB0aGlzLmNvbnRlbnRSZWN0ID0gdGhpcy5jb250ZW50Vmlld1JlZj8ucm9vdE5vZGVzWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKHRoaXMuY29udGVudFJlY3QpIHtcclxuICAgICAgY2FsbENhbGxiYWNrID0gdGhpcy50b29sdGlwU2VydmljZS5vbk1vdmUoZXZlbnQsIHRoaXMuY29udGVudFJlY3QhKTtcclxuICAgIH1cclxuICAgIGlmKGNhbGxDYWxsYmFjaykge1xyXG4gICAgICB0aGlzLmhpZGUoKTtcclxuICAgIH1cclxuICB9IFxyXG5cclxuICBwcml2YXRlIGhpZGUoKSB7XHJcbiAgICB0aGlzLmludGVycnVwdC5uZXh0KCk7XHJcbiAgICB0aGlzLm92ZXJsYXlSZWY/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuaXNWaXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLmNvbnRlbnRSZWN0ID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRPdmVybGF5Q29uZmlnKCk6IE92ZXJsYXlDb25maWcge1xyXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uKCk7XHJcblxyXG4gICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheS5wb3NpdGlvbigpXHJcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuZWxlbWVudFJlZilcclxuICAgICAgLndpdGhQb3NpdGlvbnMoW3Bvc2l0aW9uXSk7XHJcblxyXG4gICAgY29uc3QgY29uZmlnID0gbmV3IE92ZXJsYXlDb25maWcoe1xyXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiBwb3NpdGlvblN0cmF0ZWd5XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gY29uZmlnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRQb3NpdGlvbigpOiBDb25uZWN0ZWRQb3NpdGlvbiB7XHJcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuY29udGVudFBvc2l0aW9uLnNwbGl0KCctJyk7XHJcbiAgICBjb25zdCBvdmVybGF5WCA9IDwnc3RhcnQnIHwgJ2VuZCc+KHBvc2l0aW9uWzFdID09ICdsZWZ0JyA/ICdzdGFydCcgOiAnZW5kJyk7XHJcbiAgICBjb25zdCBvdmVybGF5WSA9IDwndG9wJyB8ICdib3R0b20nPnBvc2l0aW9uWzBdO1xyXG4gICAgcmV0dXJuIHsgb3JpZ2luWDogb3ZlcmxheVgsIG9yaWdpblk6IG92ZXJsYXlZLCBvdmVybGF5WDogb3ZlcmxheVgsIG92ZXJsYXlZOiBvdmVybGF5WSB9O1xyXG4gIH1cclxufVxyXG4iLCI8IS0tIEJlZm9yZSBob3ZlciBzdGF0ZSAtLT5cclxuPGRpdiBjbGFzcz1cInAtMlwiPlxyXG4gIDxpICpuZ0lmPVwiIXRhZ1wiIGNsYXNzPVwiZWMtaWNvbiB7e2ljb259fSBlYy1pY29uLXNtXCI+PC9pPlxyXG4gIDxlYy10YWdzICpuZ0lmPVwidGFnXCJcclxuICAgICAgICAgICAgW2lzQ29uZGVuc2VkXSA9IFwidHJ1ZVwiXHJcbiAgICAgICAgICAgIFt0YWdzXT1cInRhZ1wiPlxyXG4gIDwvZWMtdGFncz5cclxuPC9kaXY+XHJcbjwhLS0gLi9CZWZvcmUgaG92ZXIgc3RhdGUgLS0+XHJcblxyXG48IS0tIEhvdmVyIHN0YXRlIC0tPlxyXG48bmctdGVtcGxhdGUgI2NvbnRlbnQ+XHJcbiAgPGFydGljbGUgY2xhc3M9XCJwb3BvdmVyLWNvbnRlbnRcIlxyXG4gICAgICAgICAgIChkb2N1bWVudDptb3VzZW1vdmUpPVwib25Nb3VzZU1vdmUoJGV2ZW50KVwiPlxyXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gIDwvYXJ0aWNsZT5cclxuICA8ZGl2IGNsYXNzPVwicC0yIHt7Y29udGVudFBvc2l0aW9ufX1cIj5cclxuICAgIDxpICpuZ0lmPVwiIXRhZ1wiIGNsYXNzPVwiZWMtaWNvbiB7e2ljb259fSBlYy1pY29uLXNtIHt7aWNvbkhvdmVyQ2xhc3N9fVwiPjwvaT5cclxuICAgIDxlYy10YWdzICpuZ0lmPVwidGFnXCJcclxuICAgICAgICAgICAgIFtpc0NvbmRlbnNlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgIFt0YWdzXT1cImhvdmVyVGFnXCI+XHJcbiAgICA8L2VjLXRhZ3M+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjwhLS0gLi9Ib3ZlciBzdGF0ZSAtLT5cclxuIl19
@@ -1,3 +1,3 @@
1
- export class RadioButtonOption {
2
- }
1
+ export class RadioButtonOption {
2
+ }
3
3
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tYnV0dG9uLW9wdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9yYWRpby1idXR0b24vcmFkaW8tYnV0dG9uLW9wdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8saUJBQWlCO0NBa0I3QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBSYWRpb0J1dHRvbk9wdGlvbjxUID0gYW55PiB7XHJcbiAgLyoqXHJcbiAgICogVGhlIHRleHQgdG8gZGlzcGxheSBhcyB0aGUgcmFkaW8gYnV0dG9uIGxhYmVsLCB0aGlzIGNhbiBhbHNvIGluY2x1ZGUgaHRtbCBmb3JtYXR0aW5nIHN1Y2hcclxuICAgKiBhcyBib2xkIGFuZCBpdGFsaWNzIHRvIGVtcGhhc2l6ZSB3b3JkcyBpbiB0aGUgc3RyaW5nXHJcbiAgICovXHJcbiAgbGFiZWw/OiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBhIHNlbGVjdGVkIHJhZGlvIGJ1dHRvbiBtb2RlbFxyXG4gICAqL1xyXG4gIHZhbHVlPzogVDtcclxuICAvKipcclxuICAgKiBUaGUgaWNvbiB0byBkaXNwbGF5IHdpdGggdGhlIHJhZGlvIGJ1dHRvbiBvcHRpb25cclxuICAgKi9cclxuICBpY29uPzogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIFRoZSB0b29sdGlwIHRleHQgdG8gc2hvdyB3aGVuIGhvdmVyaW5nIG92ZXIgYW4gb3B0aW9uXHJcbiAgICovXHJcbiAgdG9vbHRpcD86IHN0cmluZztcclxufSJdfQ==