@rivet-health/design-system 40.44.4 → 41.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/fesm2022/rivet-health-design-system.mjs +23103 -18810
  2. package/fesm2022/rivet-health-design-system.mjs.map +1 -1
  3. package/package.json +8 -9
  4. package/types/rivet-health-design-system.d.ts +6566 -0
  5. package/esm2022/lib/accessibility/sr-only/sr-only.component.mjs +0 -18
  6. package/esm2022/lib/download/download.service.mjs +0 -47
  7. package/esm2022/lib/format/pipes/common.mjs +0 -24
  8. package/esm2022/lib/format/pipes/date.pipe.mjs +0 -20
  9. package/esm2022/lib/format/pipes/days.pipe.mjs +0 -20
  10. package/esm2022/lib/format/pipes/dollars.pipe.mjs +0 -19
  11. package/esm2022/lib/format/pipes/number.pipe.mjs +0 -19
  12. package/esm2022/lib/format/pipes/percentage.pipe.mjs +0 -19
  13. package/esm2022/lib/format/pipes/sentence-case.pipe.mjs +0 -61
  14. package/esm2022/lib/format/pipes/small-currency.pipe.mjs +0 -24
  15. package/esm2022/lib/format/pipes/small-number.pipe.mjs +0 -29
  16. package/esm2022/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +0 -62
  17. package/esm2022/lib/format/truncate/truncate.component.mjs +0 -51
  18. package/esm2022/lib/icon/dom-cache.mjs +0 -32
  19. package/esm2022/lib/icon/icon.component.mjs +0 -86
  20. package/esm2022/lib/icon/icons.mjs +0 -271
  21. package/esm2022/lib/input/alphabetic-field/alphabetic-field.component.mjs +0 -42
  22. package/esm2022/lib/input/auto-focus/auto-focus.directive.mjs +0 -48
  23. package/esm2022/lib/input/button/button.component.mjs +0 -139
  24. package/esm2022/lib/input/button-group/button-group.component.mjs +0 -39
  25. package/esm2022/lib/input/calendar/calendar.component.mjs +0 -318
  26. package/esm2022/lib/input/card-checkbox/card-checkbox.component.mjs +0 -13
  27. package/esm2022/lib/input/checkbox/checkbox.component.mjs +0 -84
  28. package/esm2022/lib/input/currency-field/currency-field.component.mjs +0 -26
  29. package/esm2022/lib/input/date/date.component.mjs +0 -279
  30. package/esm2022/lib/input/date-range/date-range.component.mjs +0 -478
  31. package/esm2022/lib/input/filter-chip/filter-chip.component.mjs +0 -47
  32. package/esm2022/lib/input/filter-dropdown/filter-dropdown.component.mjs +0 -89
  33. package/esm2022/lib/input/input-label/input-label.component.mjs +0 -38
  34. package/esm2022/lib/input/mentions-input/mentions-input.component.mjs +0 -745
  35. package/esm2022/lib/input/number-field/number-field.component.mjs +0 -125
  36. package/esm2022/lib/input/percentage-field/percentage-field.component.mjs +0 -20
  37. package/esm2022/lib/input/phone-field/phone-field.component.mjs +0 -74
  38. package/esm2022/lib/input/radio/radio.component.mjs +0 -58
  39. package/esm2022/lib/input/search/search.component.mjs +0 -26
  40. package/esm2022/lib/input/search-select/search-select.component.mjs +0 -189
  41. package/esm2022/lib/input/select/select/select.component.mjs +0 -179
  42. package/esm2022/lib/input/select/select-node/select-node.component.mjs +0 -60
  43. package/esm2022/lib/input/select/state.mjs +0 -882
  44. package/esm2022/lib/input/simple-select/option-group.pipe.mjs +0 -19
  45. package/esm2022/lib/input/simple-select/simple-select.component.mjs +0 -178
  46. package/esm2022/lib/input/switch-checkbox/switch-checkbox.component.mjs +0 -33
  47. package/esm2022/lib/input/text-field/text-field.component.mjs +0 -115
  48. package/esm2022/lib/input/textarea-field/textarea-field.component.mjs +0 -21
  49. package/esm2022/lib/input/validation-message/validation-message.component.mjs +0 -17
  50. package/esm2022/lib/layout/card/card-actions.component.mjs +0 -72
  51. package/esm2022/lib/layout/card/card-content.component.mjs +0 -64
  52. package/esm2022/lib/layout/card/card-header.component.mjs +0 -201
  53. package/esm2022/lib/layout/card/card-link.component.mjs +0 -115
  54. package/esm2022/lib/layout/card/card-media.component.mjs +0 -70
  55. package/esm2022/lib/layout/card/card.component.mjs +0 -306
  56. package/esm2022/lib/layout/setting-row/setting-row.component.mjs +0 -111
  57. package/esm2022/lib/load/loading/loading.component.mjs +0 -43
  58. package/esm2022/lib/load/loading-cover/loading-cover.component.mjs +0 -25
  59. package/esm2022/lib/navigation/editable-heading/editable-heading.component.mjs +0 -243
  60. package/esm2022/lib/navigation/link/link.component.mjs +0 -48
  61. package/esm2022/lib/navigation/page-header/page-header.component.mjs +0 -68
  62. package/esm2022/lib/navigation/simple-tabs/simple-tab/simple-tab.component.mjs +0 -43
  63. package/esm2022/lib/navigation/simple-tabs/simple-tabs/simple-tabs.component.mjs +0 -11
  64. package/esm2022/lib/navigation/tabs/tab/tab.component.mjs +0 -16
  65. package/esm2022/lib/navigation/tabs/tabs/tabs.component.mjs +0 -11
  66. package/esm2022/lib/navigation/views/all-views-modal/all-views-modal.component.mjs +0 -43
  67. package/esm2022/lib/navigation/views/edit-view/edit-view.component.mjs +0 -118
  68. package/esm2022/lib/navigation/views/permission-picker/permission-picker.component.mjs +0 -151
  69. package/esm2022/lib/navigation/views/state.mjs +0 -456
  70. package/esm2022/lib/navigation/views/view-menu/view-menu.component.mjs +0 -30
  71. package/esm2022/lib/navigation/views/views/views.component.mjs +0 -90
  72. package/esm2022/lib/notification/badge/badge.component.mjs +0 -45
  73. package/esm2022/lib/notification/banner/banner-action.component.mjs +0 -48
  74. package/esm2022/lib/notification/banner/banner.component.mjs +0 -61
  75. package/esm2022/lib/notification/map-indicator/map-indicator.component.mjs +0 -50
  76. package/esm2022/lib/notification/map-indicator/map-indicators.mjs +0 -15
  77. package/esm2022/lib/notification/notification-badge/notification-badge.component.mjs +0 -26
  78. package/esm2022/lib/overlay/callout/callout.component.mjs +0 -130
  79. package/esm2022/lib/overlay/callout/callout.helpers.mjs +0 -113
  80. package/esm2022/lib/overlay/callout/help/help.component.mjs +0 -23
  81. package/esm2022/lib/overlay/callout/lock-scroll.directive.mjs +0 -69
  82. package/esm2022/lib/overlay/callout/menu/menu-item/menu-item.component.mjs +0 -71
  83. package/esm2022/lib/overlay/callout/menu/menu.component.mjs +0 -39
  84. package/esm2022/lib/overlay/callout/select-callout-defaults.mjs +0 -13
  85. package/esm2022/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +0 -30
  86. package/esm2022/lib/overlay/callout/tooltip/tooltip.component.mjs +0 -57
  87. package/esm2022/lib/overlay/callout/tooltip/tooltip.directive.mjs +0 -138
  88. package/esm2022/lib/overlay/modal/dialog/dialog.component.mjs +0 -47
  89. package/esm2022/lib/overlay/modal/dialog-stack.service.mjs +0 -41
  90. package/esm2022/lib/overlay/modal/form-dialog/form-dialog.component.mjs +0 -146
  91. package/esm2022/lib/overlay/modal/modal.component.mjs +0 -31
  92. package/esm2022/lib/overlay/modal/side-sheet/side-sheet.component.mjs +0 -30
  93. package/esm2022/lib/overlay/overlay-outlet.component.mjs +0 -98
  94. package/esm2022/lib/overlay/overlay.directive.mjs +0 -25
  95. package/esm2022/lib/overlay/overlay.service.mjs +0 -35
  96. package/esm2022/lib/overlay/toast/toast-action.component.mjs +0 -11
  97. package/esm2022/lib/overlay/toast/toast.component.mjs +0 -41
  98. package/esm2022/lib/riv.module.mjs +0 -580
  99. package/esm2022/lib/size/size.directive.mjs +0 -33
  100. package/esm2022/lib/table/simple-table/coordinate-helper.mjs +0 -61
  101. package/esm2022/lib/table/simple-table/simple-table-cell.component.mjs +0 -36
  102. package/esm2022/lib/table/simple-table/simple-table-header-cell.component.mjs +0 -37
  103. package/esm2022/lib/table/simple-table/simple-table-row.component.mjs +0 -19
  104. package/esm2022/lib/table/simple-table/simple-table.component.mjs +0 -104
  105. package/esm2022/lib/table/table/clipboard.mjs +0 -182
  106. package/esm2022/lib/table/table/state-helpers/collapse-helpers.mjs +0 -116
  107. package/esm2022/lib/table/table/state-helpers/column-helpers.mjs +0 -383
  108. package/esm2022/lib/table/table/state-helpers/display-helpers.mjs +0 -50
  109. package/esm2022/lib/table/table/state-helpers/nesting-helpers.mjs +0 -123
  110. package/esm2022/lib/table/table/state-helpers/order-helpers.mjs +0 -164
  111. package/esm2022/lib/table/table/state-helpers/pagination-helpers.mjs +0 -139
  112. package/esm2022/lib/table/table/state-helpers/result-helpers.mjs +0 -70
  113. package/esm2022/lib/table/table/state-helpers/search-helpers.mjs +0 -72
  114. package/esm2022/lib/table/table/state-helpers/selection-helpers.mjs +0 -180
  115. package/esm2022/lib/table/table/state.mjs +0 -1035
  116. package/esm2022/lib/table/table/table/table.component.mjs +0 -367
  117. package/esm2022/lib/table/table/table-collapse-all/table-collapse-all.component.mjs +0 -25
  118. package/esm2022/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +0 -227
  119. package/esm2022/lib/table/table/table-column-settings/table-column-settings.component.mjs +0 -134
  120. package/esm2022/lib/table/table/table-csv-export/table-csv-export.component.mjs +0 -35
  121. package/esm2022/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.mjs +0 -28
  122. package/esm2022/lib/table/table/table-search/table-search.component.mjs +0 -71
  123. package/esm2022/lib/table/table/table-search-columns/table-search-columns.component.mjs +0 -57
  124. package/esm2022/lib/util/local-storage.mjs +0 -17
  125. package/esm2022/lib/visibility/visibility.directive.mjs +0 -34
  126. package/esm2022/lib/visualization/chart/chart-scaling.mjs +0 -380
  127. package/esm2022/lib/visualization/chart/chart.component.mjs +0 -626
  128. package/esm2022/lib/visualization/chart/chart.mjs +0 -3768
  129. package/esm2022/lib/visualization/data-table/data-table-cell.component.mjs +0 -22
  130. package/esm2022/lib/visualization/data-table/data-table-header-cell.component.mjs +0 -11
  131. package/esm2022/lib/visualization/data-table/data-table-row.component.mjs +0 -19
  132. package/esm2022/lib/visualization/data-table/data-table.component.mjs +0 -17
  133. package/esm2022/lib/visualization/donut/donut.component.mjs +0 -54
  134. package/esm2022/lib/visualization/funnel-chart/funnel-chart.component.mjs +0 -73
  135. package/esm2022/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +0 -33
  136. package/esm2022/lib/visualization/highlight/highlight.component.mjs +0 -24
  137. package/esm2022/lib/visualization/highlight/highlight.helpers.mjs +0 -20
  138. package/esm2022/lib/visualization/intervals.mjs +0 -63
  139. package/esm2022/lib/visualization/issue/issue.component.mjs +0 -30
  140. package/esm2022/lib/visualization/legend-item/legend-item.component.mjs +0 -49
  141. package/esm2022/lib/visualization/metric/metric.component.mjs +0 -52
  142. package/esm2022/lib/visualization/mini-pie/mini-pie.component.mjs +0 -51
  143. package/esm2022/lib/visualization/progress/progress.component.mjs +0 -24
  144. package/esm2022/lib/visualization/stacked-column/stacked-column.component.mjs +0 -377
  145. package/esm2022/lib/visualization/stacked-column/stacked-column.helpers.mjs +0 -18
  146. package/esm2022/lib/visualization/stacked-row/stacked-row.component.mjs +0 -270
  147. package/esm2022/lib/visualization/stacked-row/stacked-row.helpers.mjs +0 -74
  148. package/esm2022/lib/visualization/time-series/time-series.component.mjs +0 -374
  149. package/esm2022/lib/visualization/time-series/time-series.helpers.mjs +0 -15
  150. package/esm2022/lib/visualization/trend/trend.component.mjs +0 -51
  151. package/esm2022/lib/visualization/zero-state/zero-state.component.mjs +0 -22
  152. package/esm2022/public-api.mjs +0 -118
  153. package/esm2022/rivet-health-design-system.mjs +0 -5
  154. package/index.d.ts +0 -5
  155. package/lib/accessibility/sr-only/sr-only.component.d.ts +0 -12
  156. package/lib/download/download.service.d.ts +0 -9
  157. package/lib/format/pipes/common.d.ts +0 -6
  158. package/lib/format/pipes/date.pipe.d.ts +0 -8
  159. package/lib/format/pipes/days.pipe.d.ts +0 -8
  160. package/lib/format/pipes/dollars.pipe.d.ts +0 -9
  161. package/lib/format/pipes/number.pipe.d.ts +0 -8
  162. package/lib/format/pipes/percentage.pipe.d.ts +0 -8
  163. package/lib/format/pipes/sentence-case.pipe.d.ts +0 -8
  164. package/lib/format/pipes/small-currency.pipe.d.ts +0 -8
  165. package/lib/format/pipes/small-number.pipe.d.ts +0 -8
  166. package/lib/format/svg-text-truncate/svg-text-truncate.directive.d.ts +0 -14
  167. package/lib/format/truncate/truncate.component.d.ts +0 -17
  168. package/lib/icon/dom-cache.d.ts +0 -13
  169. package/lib/icon/icon.component.d.ts +0 -27
  170. package/lib/icon/icons.d.ts +0 -137
  171. package/lib/input/alphabetic-field/alphabetic-field.component.d.ts +0 -14
  172. package/lib/input/auto-focus/auto-focus.directive.d.ts +0 -21
  173. package/lib/input/button/button.component.d.ts +0 -37
  174. package/lib/input/button-group/button-group.component.d.ts +0 -11
  175. package/lib/input/calendar/calendar.component.d.ts +0 -67
  176. package/lib/input/card-checkbox/card-checkbox.component.d.ts +0 -6
  177. package/lib/input/checkbox/checkbox.component.d.ts +0 -32
  178. package/lib/input/currency-field/currency-field.component.d.ts +0 -9
  179. package/lib/input/date/date.component.d.ts +0 -62
  180. package/lib/input/date-range/date-range.component.d.ts +0 -97
  181. package/lib/input/filter-chip/filter-chip.component.d.ts +0 -13
  182. package/lib/input/filter-dropdown/filter-dropdown.component.d.ts +0 -30
  183. package/lib/input/input-label/input-label.component.d.ts +0 -17
  184. package/lib/input/mentions-input/mentions-input.component.d.ts +0 -93
  185. package/lib/input/number-field/number-field.component.d.ts +0 -36
  186. package/lib/input/percentage-field/percentage-field.component.d.ts +0 -7
  187. package/lib/input/phone-field/phone-field.component.d.ts +0 -17
  188. package/lib/input/radio/radio.component.d.ts +0 -28
  189. package/lib/input/search/search.component.d.ts +0 -10
  190. package/lib/input/search-select/search-select.component.d.ts +0 -62
  191. package/lib/input/select/select/select.component.d.ts +0 -63
  192. package/lib/input/select/select-node/select-node.component.d.ts +0 -30
  193. package/lib/input/select/state.d.ts +0 -250
  194. package/lib/input/simple-select/option-group.pipe.d.ts +0 -8
  195. package/lib/input/simple-select/simple-select.component.d.ts +0 -63
  196. package/lib/input/switch-checkbox/switch-checkbox.component.d.ts +0 -18
  197. package/lib/input/text-field/text-field.component.d.ts +0 -38
  198. package/lib/input/textarea-field/textarea-field.component.d.ts +0 -8
  199. package/lib/input/validation-message/validation-message.component.d.ts +0 -6
  200. package/lib/layout/card/card-actions.component.d.ts +0 -38
  201. package/lib/layout/card/card-content.component.d.ts +0 -33
  202. package/lib/layout/card/card-header.component.d.ts +0 -132
  203. package/lib/layout/card/card-link.component.d.ts +0 -64
  204. package/lib/layout/card/card-media.component.d.ts +0 -43
  205. package/lib/layout/card/card.component.d.ts +0 -225
  206. package/lib/layout/setting-row/setting-row.component.d.ts +0 -72
  207. package/lib/load/loading/loading.component.d.ts +0 -17
  208. package/lib/load/loading-cover/loading-cover.component.d.ts +0 -10
  209. package/lib/navigation/editable-heading/editable-heading.component.d.ts +0 -118
  210. package/lib/navigation/link/link.component.d.ts +0 -19
  211. package/lib/navigation/page-header/page-header.component.d.ts +0 -50
  212. package/lib/navigation/simple-tabs/simple-tab/simple-tab.component.d.ts +0 -11
  213. package/lib/navigation/simple-tabs/simple-tabs/simple-tabs.component.d.ts +0 -5
  214. package/lib/navigation/tabs/tab/tab.component.d.ts +0 -6
  215. package/lib/navigation/tabs/tabs/tabs.component.d.ts +0 -5
  216. package/lib/navigation/views/all-views-modal/all-views-modal.component.d.ts +0 -14
  217. package/lib/navigation/views/edit-view/edit-view.component.d.ts +0 -31
  218. package/lib/navigation/views/permission-picker/permission-picker.component.d.ts +0 -37
  219. package/lib/navigation/views/state.d.ts +0 -175
  220. package/lib/navigation/views/view-menu/view-menu.component.d.ts +0 -13
  221. package/lib/navigation/views/views/views.component.d.ts +0 -25
  222. package/lib/notification/badge/badge.component.d.ts +0 -14
  223. package/lib/notification/banner/banner-action.component.d.ts +0 -15
  224. package/lib/notification/banner/banner.component.d.ts +0 -25
  225. package/lib/notification/map-indicator/map-indicator.component.d.ts +0 -24
  226. package/lib/notification/map-indicator/map-indicators.d.ts +0 -9
  227. package/lib/notification/notification-badge/notification-badge.component.d.ts +0 -11
  228. package/lib/overlay/callout/callout.component.d.ts +0 -36
  229. package/lib/overlay/callout/callout.helpers.d.ts +0 -16
  230. package/lib/overlay/callout/help/help.component.d.ts +0 -11
  231. package/lib/overlay/callout/lock-scroll.directive.d.ts +0 -22
  232. package/lib/overlay/callout/menu/menu-item/menu-item.component.d.ts +0 -27
  233. package/lib/overlay/callout/menu/menu.component.d.ts +0 -17
  234. package/lib/overlay/callout/select-callout-defaults.d.ts +0 -5
  235. package/lib/overlay/callout/tooltip/locked-tooltip.directive.d.ts +0 -14
  236. package/lib/overlay/callout/tooltip/tooltip.component.d.ts +0 -26
  237. package/lib/overlay/callout/tooltip/tooltip.directive.d.ts +0 -48
  238. package/lib/overlay/modal/dialog/dialog.component.d.ts +0 -19
  239. package/lib/overlay/modal/dialog-stack.service.d.ts +0 -23
  240. package/lib/overlay/modal/form-dialog/form-dialog.component.d.ts +0 -63
  241. package/lib/overlay/modal/modal.component.d.ts +0 -11
  242. package/lib/overlay/modal/side-sheet/side-sheet.component.d.ts +0 -13
  243. package/lib/overlay/overlay-outlet.component.d.ts +0 -19
  244. package/lib/overlay/overlay.directive.d.ts +0 -13
  245. package/lib/overlay/overlay.service.d.ts +0 -14
  246. package/lib/overlay/toast/toast-action.component.d.ts +0 -5
  247. package/lib/overlay/toast/toast.component.d.ts +0 -17
  248. package/lib/riv.module.d.ts +0 -122
  249. package/lib/size/size.directive.d.ts +0 -12
  250. package/lib/table/simple-table/coordinate-helper.d.ts +0 -13
  251. package/lib/table/simple-table/simple-table-cell.component.d.ts +0 -19
  252. package/lib/table/simple-table/simple-table-header-cell.component.d.ts +0 -20
  253. package/lib/table/simple-table/simple-table-row.component.d.ts +0 -6
  254. package/lib/table/simple-table/simple-table.component.d.ts +0 -11
  255. package/lib/table/table/clipboard.d.ts +0 -38
  256. package/lib/table/table/state-helpers/collapse-helpers.d.ts +0 -9
  257. package/lib/table/table/state-helpers/column-helpers.d.ts +0 -29
  258. package/lib/table/table/state-helpers/display-helpers.d.ts +0 -5
  259. package/lib/table/table/state-helpers/nesting-helpers.d.ts +0 -13
  260. package/lib/table/table/state-helpers/order-helpers.d.ts +0 -13
  261. package/lib/table/table/state-helpers/pagination-helpers.d.ts +0 -12
  262. package/lib/table/table/state-helpers/result-helpers.d.ts +0 -10
  263. package/lib/table/table/state-helpers/search-helpers.d.ts +0 -17
  264. package/lib/table/table/state-helpers/selection-helpers.d.ts +0 -13
  265. package/lib/table/table/state.d.ts +0 -512
  266. package/lib/table/table/table/table.component.d.ts +0 -88
  267. package/lib/table/table/table-collapse-all/table-collapse-all.component.d.ts +0 -10
  268. package/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.d.ts +0 -52
  269. package/lib/table/table/table-column-settings/table-column-settings.component.d.ts +0 -37
  270. package/lib/table/table/table-csv-export/table-csv-export.component.d.ts +0 -14
  271. package/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.d.ts +0 -11
  272. package/lib/table/table/table-search/table-search.component.d.ts +0 -21
  273. package/lib/table/table/table-search-columns/table-search-columns.component.d.ts +0 -23
  274. package/lib/util/local-storage.d.ts +0 -14
  275. package/lib/visibility/visibility.directive.d.ts +0 -12
  276. package/lib/visualization/chart/chart-scaling.d.ts +0 -100
  277. package/lib/visualization/chart/chart.component.d.ts +0 -116
  278. package/lib/visualization/chart/chart.d.ts +0 -354
  279. package/lib/visualization/data-table/data-table-cell.component.d.ts +0 -11
  280. package/lib/visualization/data-table/data-table-header-cell.component.d.ts +0 -5
  281. package/lib/visualization/data-table/data-table-row.component.d.ts +0 -6
  282. package/lib/visualization/data-table/data-table.component.d.ts +0 -6
  283. package/lib/visualization/donut/donut.component.d.ts +0 -22
  284. package/lib/visualization/funnel-chart/funnel-chart.component.d.ts +0 -30
  285. package/lib/visualization/funnel-chart/funnel-chart.helpers.d.ts +0 -4
  286. package/lib/visualization/highlight/highlight.component.d.ts +0 -15
  287. package/lib/visualization/highlight/highlight.helpers.d.ts +0 -2
  288. package/lib/visualization/intervals.d.ts +0 -8
  289. package/lib/visualization/issue/issue.component.d.ts +0 -10
  290. package/lib/visualization/legend-item/legend-item.component.d.ts +0 -22
  291. package/lib/visualization/metric/metric.component.d.ts +0 -20
  292. package/lib/visualization/mini-pie/mini-pie.component.d.ts +0 -17
  293. package/lib/visualization/progress/progress.component.d.ts +0 -8
  294. package/lib/visualization/stacked-column/stacked-column.component.d.ts +0 -129
  295. package/lib/visualization/stacked-column/stacked-column.helpers.d.ts +0 -3
  296. package/lib/visualization/stacked-row/stacked-row.component.d.ts +0 -109
  297. package/lib/visualization/stacked-row/stacked-row.helpers.d.ts +0 -53
  298. package/lib/visualization/time-series/time-series.component.d.ts +0 -126
  299. package/lib/visualization/time-series/time-series.helpers.d.ts +0 -34
  300. package/lib/visualization/trend/trend.component.d.ts +0 -13
  301. package/lib/visualization/zero-state/zero-state.component.d.ts +0 -9
  302. package/public-api.d.ts +0 -118
@@ -1,374 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
2
- import { scaleLinear } from 'd3-scale';
3
- import { line } from 'd3-shape';
4
- import { utcDay } from 'd3-time';
5
- import { utcFormat } from 'd3-time-format';
6
- import { BehaviorSubject, combineLatest, map, shareReplay, } from 'rxjs';
7
- import { NumberPipe } from '../../format/pipes/number.pipe';
8
- import { getIntervalTitle, getMajorInterval, getMajorIntervalFormat, getMinorIntervalFormat, getTimeInterval, intervals, } from '../intervals';
9
- import { getDateRange } from './time-series.helpers';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@angular/common";
12
- import * as i2 from "../../overlay/callout/callout.component";
13
- import * as i3 from "../legend-item/legend-item.component";
14
- import * as i4 from "../../overlay/overlay.directive";
15
- import * as i5 from "../../input/simple-select/simple-select.component";
16
- import * as i6 from "../../size/size.directive";
17
- import * as i7 from "../zero-state/zero-state.component";
18
- import * as i8 from "../../input/simple-select/option-group.pipe";
19
- const DEFAULT_INTERVAL = 'day';
20
- // TODO: once we upgrade to Angular 16, this component can be cleaned up with
21
- // signals instead of RxJS. See commit e238c2d.
22
- // https://www.notion.so/rivet/Resolve-TODOs-after-Angular-upgrade-1f2667eb2a3180b79f6ad92a7e576f08
23
- export class TimeSeriesComponent {
24
- constructor() {
25
- this.input$ = new BehaviorSubject([
26
- {
27
- pointReducer: points => points.reduce((total, { value }) => total + value, 0),
28
- valueFormatter: v => new NumberPipe().transform(v) ?? '',
29
- series: [],
30
- },
31
- ]);
32
- this.width$ = new BehaviorSubject(0);
33
- this.HEIGHT = 300;
34
- this.zeroStateMessage$ = new BehaviorSubject('No data to display.');
35
- this.BOTTOM_OFFSET = 24;
36
- this.LEFT_RIGHT_OFFSET = 48;
37
- this.TOP_PADDING = 16;
38
- this.LEFT_RIGHT_PADDING = 8;
39
- this.BOTTOM_PADDING = 8;
40
- this.Y_TICK_COUNT = 5;
41
- this.POINT_RADIUS = 3.5;
42
- this.dateRange$ = this.input$.pipe(map(getDateRange), shareReplay({ refCount: true, bufferSize: 1 }));
43
- this.interval$ = new BehaviorSubject(DEFAULT_INTERVAL);
44
- this.intervalChanged = new EventEmitter();
45
- this.allowLegendToggle$ = new BehaviorSubject(false);
46
- this.groupedTooltips$ = new BehaviorSubject(true);
47
- this.markerClicked = new EventEmitter();
48
- this.maxPoints$ = combineLatest([this.width$, this.input$]).pipe(map(([width, input]) => {
49
- const innerWidth = width - this.LEFT_RIGHT_OFFSET * input.length;
50
- const pointWithPadding = (this.POINT_RADIUS + 4) * 2;
51
- return Math.floor(innerWidth / pointWithPadding);
52
- }));
53
- this.xMinorTickLimit$ = combineLatest([
54
- this.width$,
55
- this.input$,
56
- ]).pipe(map(([width, input]) => {
57
- const innerWidth = width - this.LEFT_RIGHT_OFFSET * input.length;
58
- const minSizePerTick = 40;
59
- return Math.round(innerWidth / minSizePerTick);
60
- }));
61
- this.allowedIntervals$ = combineLatest([
62
- this.input$,
63
- this.maxPoints$,
64
- ]).pipe(map(([input, maxPoints]) => {
65
- const [minDateValue, maxDateValue] = getDateRange(input);
66
- return intervals.filter(interval => {
67
- const timeInterval = getTimeInterval(interval);
68
- const numSteps = timeInterval.range(timeInterval.floor(minDateValue), timeInterval.ceil(utcDay.offset(maxDateValue, 1))).length;
69
- return numSteps <= maxPoints && numSteps > 1;
70
- });
71
- }), shareReplay({ refCount: true, bufferSize: 1 }));
72
- this.intervalOptions$ = this.allowedIntervals$.pipe(map(intervals => intervals.map((interval) => ({
73
- id: interval,
74
- title: getIntervalTitle(interval),
75
- }))), shareReplay({ refCount: true, bufferSize: 1 }));
76
- this.selectedIntervalOption$ = combineLatest([
77
- this.interval$,
78
- this.intervalOptions$,
79
- ]).pipe(map(([interval, options]) => {
80
- const allowedIntervals = options.map(({ id }) => id);
81
- if (!allowedIntervals.includes(interval)) {
82
- const firstAllowed = allowedIntervals.at(0);
83
- const lastAllowed = allowedIntervals.at(-1);
84
- if (!firstAllowed || !lastAllowed)
85
- return null;
86
- if (intervals.indexOf(interval) < intervals.indexOf(firstAllowed))
87
- interval = firstAllowed;
88
- if (intervals.indexOf(interval) > intervals.indexOf(lastAllowed))
89
- interval = lastAllowed;
90
- }
91
- return options.find(o => o.id === interval) ?? null;
92
- }), shareReplay({ refCount: true, bufferSize: 1 }));
93
- this.selectedInterval$ = this.selectedIntervalOption$.pipe(map(option => (option ? option.id : DEFAULT_INTERVAL)));
94
- this.toggleVisibility$ = new BehaviorSubject(null);
95
- this.binnedDataWithRanges$ = combineLatest([
96
- this.input$,
97
- this.selectedInterval$,
98
- this.toggleVisibility$,
99
- ]).pipe(map(([input, interval, toggleVisibility]) => {
100
- const rangeMap = new Map();
101
- const series = input.map((config) => {
102
- return {
103
- ...config,
104
- series: config.series.map((series, i) => {
105
- const binned = new Map();
106
- for (const point of series.data) {
107
- const binKey = getTimeInterval(interval)
108
- .floor(point.date)
109
- .valueOf();
110
- const maxDate = rangeMap.get(binKey);
111
- if (!maxDate || maxDate < point.date) {
112
- rangeMap.set(binKey, point.date);
113
- }
114
- if (!binned.has(binKey)) {
115
- binned.set(binKey, []);
116
- }
117
- binned.get(binKey).push(point);
118
- }
119
- if (this.allowLegendToggle &&
120
- toggleVisibility &&
121
- series.label === toggleVisibility.label) {
122
- series.visibility = toggleVisibility.visibility;
123
- }
124
- return {
125
- ...series,
126
- data: [...binned.entries()].map(([dateValue, points]) => ({
127
- date: new Date(dateValue),
128
- value: config.pointReducer(points, i),
129
- })),
130
- };
131
- }),
132
- };
133
- });
134
- return {
135
- series,
136
- getRange: (date) => {
137
- return {
138
- minDate: date,
139
- maxDate: rangeMap.get(date.valueOf()),
140
- };
141
- },
142
- };
143
- }), shareReplay({ refCount: true, bufferSize: 1 }));
144
- this.binnedData$ = this.binnedDataWithRanges$.pipe(map(binnedData => binnedData.series));
145
- this.getRange$ = this.binnedDataWithRanges$.pipe(map(binnedData => binnedData.getRange));
146
- this.binnedDateRange$ = this.binnedData$.pipe(map(getDateRange), shareReplay({ refCount: true, bufferSize: 1 }));
147
- this.drawData$ = combineLatest([
148
- this.binnedData$,
149
- this.binnedDateRange$,
150
- this.selectedInterval$,
151
- this.width$,
152
- this.xMinorTickLimit$,
153
- ]).pipe(map(([binnedData, binnedDateRange, interval, width, xMinorTickLimit]) => {
154
- const viewBox = `0 0 ${width} ${this.HEIGHT}`;
155
- const xScaleRangeStart = this.LEFT_RIGHT_PADDING + this.LEFT_RIGHT_OFFSET;
156
- const xScaleRangeEnd = width -
157
- this.LEFT_RIGHT_PADDING * 2 -
158
- (binnedData.length > 1 ? this.LEFT_RIGHT_OFFSET : 0);
159
- const xScale = scaleLinear()
160
- .domain(binnedDateRange)
161
- .range([xScaleRangeStart, xScaleRangeEnd]);
162
- const [minDateValue, maxDateValue] = binnedDateRange;
163
- const hasMultipleYears = minDateValue.getFullYear() < maxDateValue.getFullYear();
164
- const xMinorIntervalFormat = getMinorIntervalFormat(interval);
165
- const minorFormatter = utcFormat(xMinorIntervalFormat);
166
- const xMinorTicks = getTimeInterval(interval)
167
- .range(minDateValue, utcDay.offset(maxDateValue, 1))
168
- .map(date => ({
169
- value: utcDay.offset(date, 0).valueOf(),
170
- label: minorFormatter(date),
171
- }))
172
- .filter((_, i, arr) => arr.length > xMinorTickLimit
173
- ? i % Math.ceil(arr.length / xMinorTickLimit) === 0
174
- : true);
175
- const xMajorInterval = getMajorInterval(interval);
176
- const xMajorIntervalFormat = getMajorIntervalFormat(xMajorInterval, hasMultipleYears);
177
- const timeInterval = getTimeInterval(xMajorInterval);
178
- const tickFloor = timeInterval.floor(minDateValue);
179
- const tickCeiling = timeInterval.ceil(utcDay.offset(maxDateValue, 1));
180
- const majorFormatter = utcFormat(xMajorIntervalFormat);
181
- const xMajorTicks = timeInterval
182
- .range(tickFloor, tickCeiling)
183
- .map(tickDate => ({
184
- label: xMajorInterval === interval ? '' : majorFormatter(tickDate),
185
- value: tickDate.valueOf(),
186
- }));
187
- const x = { xMax: maxDateValue, xScale, xMinorTicks, xMajorTicks };
188
- const [y1, y2] = binnedData.map(config => {
189
- const visibleSeries = config.series.filter(s => s.visibility !== 'hidden');
190
- const flattenedValues = visibleSeries.reduce((values, series) => [
191
- ...values,
192
- ...series.data.map(({ value }) => value),
193
- ], []);
194
- let yMax = config.max ?? Math.max(...flattenedValues, 0);
195
- const yMin = config.min ?? Math.min(...flattenedValues, 0);
196
- // RIVET-14605 - if range is [0,0], make it [0,1] instead
197
- if (yMax == 0 && yMin == 0) {
198
- yMax = 1;
199
- }
200
- const yScale = scaleLinear()
201
- .domain([yMin, yMax])
202
- .range([
203
- this.HEIGHT -
204
- this.BOTTOM_OFFSET -
205
- (this.BOTTOM_PADDING + this.TOP_PADDING),
206
- this.TOP_PADDING,
207
- ]);
208
- const yTicks = yScale.ticks(this.Y_TICK_COUNT);
209
- const series = config.series.map(series => ({
210
- ...series,
211
- path: line()
212
- .x(d => xScale(d.date))
213
- .y(d => yScale(d.value))(series.data),
214
- stroke: `var(${series.colorToken})`,
215
- markers: series.data.map(point => ({
216
- ...point,
217
- x: xScale(point.date),
218
- y: yScale(point.value),
219
- })),
220
- }));
221
- return {
222
- ...config,
223
- series,
224
- yMax,
225
- yMin,
226
- yScale,
227
- yTicks,
228
- };
229
- });
230
- // If we have a y2, coerce y1's ticks to be visually equivalent to y2's ticks.
231
- if (y2?.yTicks) {
232
- const tickConversionScale = scaleLinear()
233
- .range(y1.yScale.domain())
234
- .domain(y2.yScale.domain());
235
- y1.yTicks = y2.yTicks.map(tickConversionScale);
236
- }
237
- return { viewBox, x, y1, y2 };
238
- }), shareReplay({ refCount: true, bufferSize: 1 }));
239
- this.legend$ = this.binnedData$.pipe(map(binnedData => binnedData.reduce((items, config) => [
240
- ...items,
241
- ...config.series.map(series => ({
242
- label: series.label,
243
- colorToken: series.colorToken,
244
- visibility: series.visibility ?? 'visible',
245
- })),
246
- ], [])));
247
- this.empty$ = this.binnedData$.pipe(map(binnedData => binnedData.every(config => config.series.every(series => series.data.length === 0))), shareReplay({ refCount: true, bufferSize: 1 }));
248
- this.hoveredMarker$ = new BehaviorSubject(null);
249
- this.callout$ = combineLatest([
250
- this.hoveredMarker$,
251
- this.drawData$,
252
- this.groupedTooltips$,
253
- ]).pipe(map(([hoveredMarker, drawData, groupedTooltips]) => {
254
- if (!hoveredMarker)
255
- return null;
256
- const { target } = hoveredMarker.event;
257
- if (!target)
258
- return null;
259
- const markerRect = target.getBoundingClientRect();
260
- const padding = 8;
261
- const anchor = new DOMRect(markerRect.left - padding, markerRect.top - padding, markerRect.width + padding * 2, markerRect.height + padding * 2);
262
- const metrics = [];
263
- for (let index = 0; index < drawData.y1.series.length; index++) {
264
- const series = drawData.y1.series[index];
265
- const allowed = !groupedTooltips
266
- ? hoveredMarker.y == 'y1' && hoveredMarker.seriesIndex == index
267
- : true;
268
- if (series.visibility !== 'hidden' && allowed) {
269
- const match = series.markers.find(marker => marker.x === hoveredMarker.marker.x);
270
- if (match) {
271
- metrics.push({
272
- colorToken: series.colorToken,
273
- label: series.label,
274
- value: drawData.y1.valueFormatter(match.value),
275
- });
276
- }
277
- }
278
- }
279
- if (drawData.y2) {
280
- for (let index = 0; index < drawData.y2.series.length; index++) {
281
- const series = drawData.y2.series[index];
282
- const allowed = !groupedTooltips
283
- ? hoveredMarker.y == 'y2' && hoveredMarker.seriesIndex == index
284
- : true;
285
- if (series.visibility !== 'hidden' && allowed) {
286
- const match = series.markers.find(marker => marker.x === hoveredMarker.marker.x);
287
- if (match) {
288
- metrics.push({
289
- colorToken: series.colorToken,
290
- label: series.label,
291
- value: drawData.y2.valueFormatter(match.value),
292
- });
293
- }
294
- }
295
- }
296
- }
297
- return { anchor, metrics };
298
- }));
299
- }
300
- set input(v) {
301
- this.input$.next(v);
302
- }
303
- get input() {
304
- return this.input$.getValue();
305
- }
306
- set width(v) {
307
- this.width$.next(v);
308
- }
309
- get width() {
310
- return this.width$.getValue();
311
- }
312
- set zeroStateMessage(v) {
313
- this.zeroStateMessage$.next(v);
314
- }
315
- get zeroStateMessage() {
316
- return this.zeroStateMessage$.getValue();
317
- }
318
- set interval(v) {
319
- if (v !== this.interval$.getValue()) {
320
- this.interval$.next(v);
321
- this.intervalChanged.emit(v);
322
- }
323
- }
324
- get interval() {
325
- return this.interval$.getValue();
326
- }
327
- set allowLegendToggle(v) {
328
- this.allowLegendToggle$.next(v);
329
- }
330
- get allowLegendToggle() {
331
- return this.allowLegendToggle$.getValue();
332
- }
333
- set groupedTooltips(v) {
334
- this.groupedTooltips$.next(v);
335
- }
336
- get groupedTooltips() {
337
- return this.groupedTooltips$.getValue();
338
- }
339
- setIntervalOption(option) {
340
- if (option)
341
- this.interval = option.id;
342
- }
343
- getMarkerClicked(range, seriesIndex, y) {
344
- return {
345
- ...range,
346
- seriesIndex,
347
- y,
348
- };
349
- }
350
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TimeSeriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
351
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TimeSeriesComponent, selector: "riv-time-series", inputs: { input: "input", zeroStateMessage: "zeroStateMessage", interval: "interval", allowLegendToggle: "allowLegendToggle", groupedTooltips: "groupedTooltips" }, outputs: { intervalChanged: "intervalChanged", markerClicked: "markerClicked" }, viewQueries: [{ propertyName: "controls", first: true, predicate: ["controls"], descendants: true }], ngImport: i0, template: "<div\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <g *ngFor=\"let tick of d.x.xMajorTicks\">\n <text\n *ngIf=\"d.x.xScale(tick.value) >= 0\"\n class=\"x-major-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"HEIGHT - BOTTOM_OFFSET\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.x.xMinorTicks\">\n <text\n class=\"x-minor-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"HEIGHT - BOTTOM_OFFSET\"\n text-anchor=\"middle\"\n dominant-baseline=\"hanging\"\n dy=\"8\"\n >\n {{ tick.label }}\n <title>{{ tick.value | date }}</title>\n </text>\n </g>\n <g *ngFor=\"let tick of d.y1.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.y1.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"y-tick-label\" x=\"0\" [attr.y]=\"d.y1.yScale(tick)\" dy=\"-4\">\n {{ d.y1.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngFor=\"let tick of d.y2?.yTicks\">\n <text\n class=\"y-tick-label\"\n [attr.x]=\"width\"\n [attr.y]=\"d.y2?.yScale(tick)\"\n text-anchor=\"end\"\n dy=\"-4\"\n >\n {{ d.y2?.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngIf=\"hoveredMarker$ | async; let hoveredMarker\">\n <line\n class=\"hover-rule\"\n [attr.x1]=\"hoveredMarker.marker.x\"\n [attr.y1]=\"d.y1.yScale(d.y1.yMin)\"\n [attr.x2]=\"hoveredMarker.marker.x\"\n [attr.y2]=\"d.y1.yScale(d.y1.yMax)\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n\n <ng-template #seriesTpl let-series=\"series\" let-index=\"index\" let-y=\"y\">\n <path\n *ngIf=\"series.visibility !== 'hidden'\"\n class=\"data path\"\n [class.marker-hovered]=\"!!(hoveredMarker$ | async)\"\n [attr.d]=\"series.path\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n [attr.stroke-dasharray]=\"series.style === 'dashed' ? '4' : null\"\n ></path>\n <ng-container *ngIf=\"getRange$ | async; let getRange\">\n <ng-container *ngFor=\"let marker of series.markers\">\n <circle\n *ngIf=\"series.visibility !== 'hidden'\"\n class=\"data marker\"\n [class.focused]=\"\n (hoveredMarker$ | async)?.marker?.x === marker.x &&\n (groupedTooltips ||\n ((hoveredMarker$ | async)?.seriesIndex === index &&\n (hoveredMarker$ | async)?.y === y))\n \"\n [class.blurred]=\"\n (hoveredMarker$ | async) !== null &&\n ((hoveredMarker$ | async)?.marker?.x !== marker.x ||\n ((hoveredMarker$ | async)?.marker?.x === marker.x &&\n !groupedTooltips &&\n ((hoveredMarker$ | async)?.seriesIndex !== index ||\n (hoveredMarker$ | async)?.y !== y)))\n \"\n [attr.cx]=\"marker.x\"\n [attr.cy]=\"marker.y\"\n [attr.r]=\"POINT_RADIUS\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n (mouseover)=\"\n hoveredMarker$.next({\n event: $event,\n marker: marker,\n seriesIndex: index,\n y: y\n })\n \"\n (mouseleave)=\"hoveredMarker$.next(null)\"\n (click)=\"\n markerClicked.emit(\n getMarkerClicked(getRange(marker.date), index, y)\n );\n hoveredMarker$.next(null)\n \"\n ></circle>\n </ng-container>\n </ng-container>\n </ng-template>\n <g *ngFor=\"let series of d.y1.series; let i = index\">\n <ng-container\n *ngTemplateOutlet=\"\n seriesTpl;\n context: { series: series, index: i, y: 'y1' }\n \"\n ></ng-container>\n </g>\n <g *ngFor=\"let series of d.y2?.series; let i = index\">\n <ng-container\n *ngTemplateOutlet=\"\n seriesTpl;\n context: { series: series, index: i, y: 'y2' }\n \"\n ></ng-container>\n </g>\n </svg>\n <legend>\n <riv-legend-item\n *ngFor=\"let item of legend$ | async\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [visibility]=\"item.visibility\"\n [clickable]=\"allowLegendToggle\"\n (itemClick)=\"\n allowLegendToggle\n ? toggleVisibility$.next({\n label: item.label,\n visibility: item.visibility === 'hidden' ? 'visible' : 'hidden'\n })\n : null\n \"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-row\" *ngFor=\"let metric of callout?.metrics\">\n <span class=\"series-label\">\n <riv-legend-item [colorToken]=\"metric.colorToken\"></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"zeroStateMessage\"></riv-zero-state>\n</ng-template>\n\n<ng-template #controls>\n <riv-simple-select\n [optionGroups]=\"intervalOptions$ | async | rivOptionGroup\"\n [orderBy]=\"'source'\"\n [selectedOption]=\"selectedIntervalOption$ | async\"\n (selectedOptionChange)=\"setIntervalOption($event)\"\n ></riv-simple-select>\n</ng-template>\n", styles: [".container{display:flex;flex-direction:column;gap:var(--size-xlarge)}.y-tick-label,.x-major-tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.x-minor-tick-label{font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);fill:var(--type-light-low-contrast);text-anchor:middle}.tick{fill:var(--gray-20)}.data.path{transition:stroke-opacity var(--short-transition)}.data.path.marker-hovered{stroke-opacity:.4}.data.marker{fill:var(--surface-light-0);transition:stroke-opacity var(--short-transition)}.data.marker.focused{stroke-opacity:1;filter:drop-shadow(0 1px 1px rgba(10,2,22,.15))}.data.marker.blurred{stroke-opacity:.4}.hover-rule{stroke:var(--gray-20)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-row:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i3.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility", "iconTooltip", "clickable", "showCheckWhenClickable"], outputs: ["itemClick"] }, { kind: "directive", type: i4.OverlayDirective, selector: "[riv-overlay]" }, { kind: "component", type: i5.SimpleSelectComponent, selector: "riv-simple-select", inputs: ["optionGroups", "selectedOption", "size", "disabled", "locked", "filterabilityOptions", "orderBy", "placeholder", "maxHeight", "maxWidth", "minHeight", "minWidth", "dividers", "sortSelectedToTop", "grow", "preferredCalloutPosition", "allowedCalloutPositions"], outputs: ["selectedOptionChange"] }, { kind: "directive", type: i6.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "component", type: i7.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: i8.OptionGroupPipe, name: "rivOptionGroup" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
352
- }
353
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TimeSeriesComponent, decorators: [{
354
- type: Component,
355
- args: [{ selector: 'riv-time-series', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <g *ngFor=\"let tick of d.x.xMajorTicks\">\n <text\n *ngIf=\"d.x.xScale(tick.value) >= 0\"\n class=\"x-major-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"HEIGHT - BOTTOM_OFFSET\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.x.xMinorTicks\">\n <text\n class=\"x-minor-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"HEIGHT - BOTTOM_OFFSET\"\n text-anchor=\"middle\"\n dominant-baseline=\"hanging\"\n dy=\"8\"\n >\n {{ tick.label }}\n <title>{{ tick.value | date }}</title>\n </text>\n </g>\n <g *ngFor=\"let tick of d.y1.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.y1.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"y-tick-label\" x=\"0\" [attr.y]=\"d.y1.yScale(tick)\" dy=\"-4\">\n {{ d.y1.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngFor=\"let tick of d.y2?.yTicks\">\n <text\n class=\"y-tick-label\"\n [attr.x]=\"width\"\n [attr.y]=\"d.y2?.yScale(tick)\"\n text-anchor=\"end\"\n dy=\"-4\"\n >\n {{ d.y2?.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngIf=\"hoveredMarker$ | async; let hoveredMarker\">\n <line\n class=\"hover-rule\"\n [attr.x1]=\"hoveredMarker.marker.x\"\n [attr.y1]=\"d.y1.yScale(d.y1.yMin)\"\n [attr.x2]=\"hoveredMarker.marker.x\"\n [attr.y2]=\"d.y1.yScale(d.y1.yMax)\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n\n <ng-template #seriesTpl let-series=\"series\" let-index=\"index\" let-y=\"y\">\n <path\n *ngIf=\"series.visibility !== 'hidden'\"\n class=\"data path\"\n [class.marker-hovered]=\"!!(hoveredMarker$ | async)\"\n [attr.d]=\"series.path\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n [attr.stroke-dasharray]=\"series.style === 'dashed' ? '4' : null\"\n ></path>\n <ng-container *ngIf=\"getRange$ | async; let getRange\">\n <ng-container *ngFor=\"let marker of series.markers\">\n <circle\n *ngIf=\"series.visibility !== 'hidden'\"\n class=\"data marker\"\n [class.focused]=\"\n (hoveredMarker$ | async)?.marker?.x === marker.x &&\n (groupedTooltips ||\n ((hoveredMarker$ | async)?.seriesIndex === index &&\n (hoveredMarker$ | async)?.y === y))\n \"\n [class.blurred]=\"\n (hoveredMarker$ | async) !== null &&\n ((hoveredMarker$ | async)?.marker?.x !== marker.x ||\n ((hoveredMarker$ | async)?.marker?.x === marker.x &&\n !groupedTooltips &&\n ((hoveredMarker$ | async)?.seriesIndex !== index ||\n (hoveredMarker$ | async)?.y !== y)))\n \"\n [attr.cx]=\"marker.x\"\n [attr.cy]=\"marker.y\"\n [attr.r]=\"POINT_RADIUS\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n (mouseover)=\"\n hoveredMarker$.next({\n event: $event,\n marker: marker,\n seriesIndex: index,\n y: y\n })\n \"\n (mouseleave)=\"hoveredMarker$.next(null)\"\n (click)=\"\n markerClicked.emit(\n getMarkerClicked(getRange(marker.date), index, y)\n );\n hoveredMarker$.next(null)\n \"\n ></circle>\n </ng-container>\n </ng-container>\n </ng-template>\n <g *ngFor=\"let series of d.y1.series; let i = index\">\n <ng-container\n *ngTemplateOutlet=\"\n seriesTpl;\n context: { series: series, index: i, y: 'y1' }\n \"\n ></ng-container>\n </g>\n <g *ngFor=\"let series of d.y2?.series; let i = index\">\n <ng-container\n *ngTemplateOutlet=\"\n seriesTpl;\n context: { series: series, index: i, y: 'y2' }\n \"\n ></ng-container>\n </g>\n </svg>\n <legend>\n <riv-legend-item\n *ngFor=\"let item of legend$ | async\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [visibility]=\"item.visibility\"\n [clickable]=\"allowLegendToggle\"\n (itemClick)=\"\n allowLegendToggle\n ? toggleVisibility$.next({\n label: item.label,\n visibility: item.visibility === 'hidden' ? 'visible' : 'hidden'\n })\n : null\n \"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-row\" *ngFor=\"let metric of callout?.metrics\">\n <span class=\"series-label\">\n <riv-legend-item [colorToken]=\"metric.colorToken\"></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"zeroStateMessage\"></riv-zero-state>\n</ng-template>\n\n<ng-template #controls>\n <riv-simple-select\n [optionGroups]=\"intervalOptions$ | async | rivOptionGroup\"\n [orderBy]=\"'source'\"\n [selectedOption]=\"selectedIntervalOption$ | async\"\n (selectedOptionChange)=\"setIntervalOption($event)\"\n ></riv-simple-select>\n</ng-template>\n", styles: [".container{display:flex;flex-direction:column;gap:var(--size-xlarge)}.y-tick-label,.x-major-tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.x-minor-tick-label{font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);fill:var(--type-light-low-contrast);text-anchor:middle}.tick{fill:var(--gray-20)}.data.path{transition:stroke-opacity var(--short-transition)}.data.path.marker-hovered{stroke-opacity:.4}.data.marker{fill:var(--surface-light-0);transition:stroke-opacity var(--short-transition)}.data.marker.focused{stroke-opacity:1;filter:drop-shadow(0 1px 1px rgba(10,2,22,.15))}.data.marker.blurred{stroke-opacity:.4}.hover-rule{stroke:var(--gray-20)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-row:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}\n"] }]
356
- }], propDecorators: { input: [{
357
- type: Input
358
- }], zeroStateMessage: [{
359
- type: Input
360
- }], interval: [{
361
- type: Input
362
- }], intervalChanged: [{
363
- type: Output
364
- }], controls: [{
365
- type: ViewChild,
366
- args: ['controls']
367
- }], allowLegendToggle: [{
368
- type: Input
369
- }], groupedTooltips: [{
370
- type: Input
371
- }], markerClicked: [{
372
- type: Output
373
- }] } });
374
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1zZXJpZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi90aW1lLXNlcmllcy90aW1lLXNlcmllcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3RpbWUtc2VyaWVzL3RpbWUtc2VyaWVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUNMLGVBQWUsRUFFZixhQUFhLEVBQ2IsR0FBRyxFQUNILFdBQVcsR0FDWixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RCxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixzQkFBc0IsRUFDdEIsc0JBQXNCLEVBQ3RCLGVBQWUsRUFDZixTQUFTLEdBQ1YsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFvQixZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7OztBQUV2RSxNQUFNLGdCQUFnQixHQUFhLEtBQUssQ0FBQztBQU96Qyw2RUFBNkU7QUFDN0UsK0NBQStDO0FBQy9DLG1HQUFtRztBQU9uRyxNQUFNLE9BQU8s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b3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHNjYWxlTGluZWFyIH0gZnJvbSAnZDMtc2NhbGUnO1xuaW1wb3J0IHsgbGluZSB9IGZyb20gJ2QzLXNoYXBlJztcbmltcG9ydCB7IHV0Y0RheSB9IGZyb20gJ2QzLXRpbWUnO1xuaW1wb3J0IHsgdXRjRm9ybWF0IH0gZnJvbSAnZDMtdGltZS1mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBjb21iaW5lTGF0ZXN0LFxuICBtYXAsXG4gIHNoYXJlUmVwbGF5LFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE51bWJlclBpcGUgfSBmcm9tICcuLi8uLi9mb3JtYXQvcGlwZXMvbnVtYmVyLnBpcGUnO1xuaW1wb3J0IHtcbiAgSW50ZXJ2YWwsXG4gIGdldEludGVydmFsVGl0bGUsXG4gIGdldE1ham9ySW50ZXJ2YWwsXG4gIGdldE1ham9ySW50ZXJ2YWxGb3JtYXQsXG4gIGdldE1pbm9ySW50ZXJ2YWxGb3JtYXQsXG4gIGdldFRpbWVJbnRlcnZhbCxcbiAgaW50ZXJ2YWxzLFxufSBmcm9tICcuLi9pbnRlcnZhbHMnO1xuaW1wb3J0IHsgRHJhd0RhdGEsIE1hcmtlciwgZ2V0RGF0ZVJhbmdlIH0gZnJvbSAnLi90aW1lLXNlcmllcy5oZWxwZXJzJztcblxuY29uc3QgREVGQVVMVF9JTlRFUlZBTDogSW50ZXJ2YWwgPSAnZGF5JztcblxudHlwZSBJbnRlcnZhbE9wdGlvbiA9IHtcbiAgaWQ6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbn07XG5cbi8vIFRPRE86IG9uY2Ugd2UgdXBncmFkZSB0byBBbmd1bGFyIDE2LCB0aGlzIGNvbXBvbmVudCBjYW4gYmUgY2xlYW5lZCB1cCB3aXRoXG4vLyBzaWduYWxzIGluc3RlYWQgb2YgUnhKUy4gU2VlIGNvbW1pdCBlMjM4YzJkLlxuLy8gaHR0cHM6Ly93d3cubm90aW9uLnNvL3JpdmV0L1Jlc29sdmUtVE9ET3MtYWZ0ZXItQW5ndWxhci11cGdyYWRlLTFmMjY2N2ViMmEzMTgwYjc5ZjZhZDkyYTdlNTc2ZjA4XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtdGltZS1zZXJpZXMnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGltZS1zZXJpZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90aW1lLXNlcmllcy5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUaW1lU2VyaWVzQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnB1dCQgPVxuICAgIG5ldyBCZWhhdmlvclN1YmplY3Q8VGltZVNlcmllc0NvbXBvbmVudC5UaW1lU2VyaWVzSW5wdXQ+KFtcbiAgICAgIHtcbiAgICAgICAgcG9pbnRSZWR1Y2VyOiBwb2ludHMgPT5cbiAgICAgICAgICBwb2ludHMucmVkdWNlKCh0b3RhbCwgeyB2YWx1ZSB9KSA9PiB0b3RhbCArIHZhbHVlLCAwKSxcbiAgICAgICAgdmFsdWVGb3JtYXR0ZXI6IHYgPT4gbmV3IE51bWJlclBpcGUoKS50cmFuc2Zvcm0odikgPz8gJycsXG4gICAgICAgIHNlcmllczogW10sXG4gICAgICB9LFxuICAgIF0pO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGlucHV0KHY6IFRpbWVTZXJpZXNDb21wb25lbnQuVGltZVNlcmllc0lucHV0KSB7XG4gICAgdGhpcy5pbnB1dCQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlucHV0KCk6IFRpbWVTZXJpZXNDb21wb25lbnQuVGltZVNlcmllc0lucHV0IHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgd2lkdGgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICBwcm90ZWN0ZWQgc2V0IHdpZHRoKHY6IG51bWJlcikge1xuICAgIHRoaXMud2lkdGgkLm5leHQodik7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB3aWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy53aWR0aCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHJlYWRvbmx5IEhFSUdIVCA9IDMwMDtcblxuICBwcml2YXRlIHJlYWRvbmx5IHplcm9TdGF0ZU1lc3NhZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KFxuICAgICdObyBkYXRhIHRvIGRpc3BsYXkuJyxcbiAgKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCB6ZXJvU3RhdGVNZXNzYWdlKHY6IHN0cmluZykge1xuICAgIHRoaXMuemVyb1N0YXRlTWVzc2FnZSQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IHplcm9TdGF0ZU1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy56ZXJvU3RhdGVNZXNzYWdlJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcmVhZG9ubHkgQk9UVE9NX09GRlNFVCA9IDI0O1xuICByZWFkb25seSBMRUZUX1JJR0hUX09GRlNFVCA9IDQ4O1xuICByZWFkb25seSBUT1BfUEFERElORyA9IDE2O1xuICByZWFkb25seSBMRUZUX1JJR0hUX1BBRERJTkcgPSA4O1xuICByZWFkb25seSBCT1RUT01fUEFERElORyA9IDg7XG4gIHJlYWRvbmx5IFlfVElDS19DT1VOVCA9IDU7XG4gIHJlYWRvbmx5IFBPSU5UX1JBRElVUyA9IDMuNTtcblxuICByZWFkb25seSBkYXRlUmFuZ2UkID0gdGhpcy5pbnB1dCQucGlwZShcbiAgICBtYXAoZ2V0RGF0ZVJhbmdlKSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJ2YWwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJbnRlcnZhbD4oREVGQVVMVF9JTlRFUlZBTCk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaW50ZXJ2YWwodjogSW50ZXJ2YWwpIHtcbiAgICBpZiAodiAhPT0gdGhpcy5pbnRlcnZhbCQuZ2V0VmFsdWUoKSkge1xuICAgICAgdGhpcy5pbnRlcnZhbCQubmV4dCh2KTtcbiAgICAgIHRoaXMuaW50ZXJ2YWxDaGFuZ2VkLmVtaXQodik7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgaW50ZXJ2YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJ2YWwkLmdldFZhbHVlKCk7XG4gIH1cblxuICBAT3V0cHV0KClcbiAgaW50ZXJ2YWxDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJbnRlcnZhbD4oKTtcblxuICBAVmlld0NoaWxkKCdjb250cm9scycpXG4gIHB1YmxpYyByZWFkb25seSBjb250cm9scz86IFRlbXBsYXRlUmVmPHZvaWQ+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dMZWdlbmRUb2dnbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgYWxsb3dMZWdlbmRUb2dnbGUodjogYm9vbGVhbikge1xuICAgIHRoaXMuYWxsb3dMZWdlbmRUb2dnbGUkLm5leHQodik7XG4gIH1cbiAgcHVibGljIGdldCBhbGxvd0xlZ2VuZFRvZ2dsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hbGxvd0xlZ2VuZFRvZ2dsZSQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JvdXBlZFRvb2x0aXBzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZ3JvdXBlZFRvb2x0aXBzKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmdyb3VwZWRUb29sdGlwcyQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGdyb3VwZWRUb29sdGlwcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ncm91cGVkVG9vbHRpcHMkLmdldFZhbHVlKCk7XG4gIH1cblxuICBAT3V0cHV0KClcbiAgbWFya2VyQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VGltZVNlcmllc0NvbXBvbmVudC5NYXJrZXJDbGlja2VkPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4UG9pbnRzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMud2lkdGgkLCB0aGlzLmlucHV0JF0pLnBpcGUoXG4gICAgbWFwKChbd2lkdGgsIGlucHV0XSkgPT4ge1xuICAgICAgY29uc3QgaW5uZXJXaWR0aCA9IHdpZHRoIC0gdGhpcy5MRUZUX1JJR0hUX09GRlNFVCAqIGlucHV0Lmxlbmd0aDtcbiAgICAgIGNvbnN0IHBvaW50V2l0aFBhZGRpbmcgPSAodGhpcy5QT0lOVF9SQURJVVMgKyA0KSAqIDI7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihpbm5lcldpZHRoIC8gcG9pbnRXaXRoUGFkZGluZyk7XG4gICAgfSksXG4gICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgeE1pbm9yVGlja0xpbWl0JCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMud2lkdGgkLFxuICAgIHRoaXMuaW5wdXQkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW3dpZHRoLCBpbnB1dF0pID0+IHtcbiAgICAgIGNvbnN0IGlubmVyV2lkdGggPSB3aWR0aCAtIHRoaXMuTEVGVF9SSUdIVF9PRkZTRVQgKiBpbnB1dC5sZW5ndGg7XG4gICAgICBjb25zdCBtaW5TaXplUGVyVGljayA9IDQwO1xuICAgICAgcmV0dXJuIE1hdGgucm91bmQoaW5uZXJXaWR0aCAvIG1pblNpemVQZXJUaWNrKTtcbiAgICB9KSxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93ZWRJbnRlcnZhbHMkOiBPYnNlcnZhYmxlPEludGVydmFsW10+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbnB1dCQsXG4gICAgdGhpcy5tYXhQb2ludHMkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2lucHV0LCBtYXhQb2ludHNdKSA9PiB7XG4gICAgICBjb25zdCBbbWluRGF0ZVZhbHVlLCBtYXhEYXRlVmFsdWVdID0gZ2V0RGF0ZVJhbmdlKGlucHV0KTtcblxuICAgICAgcmV0dXJuIGludGVydmFscy5maWx0ZXIoaW50ZXJ2YWwgPT4ge1xuICAgICAgICBjb25zdCB0aW1lSW50ZXJ2YWwgPSBnZXRUaW1lSW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICBjb25zdCBudW1TdGVwcyA9IHRpbWVJbnRlcnZhbC5yYW5nZShcbiAgICAgICAgICB0aW1lSW50ZXJ2YWwuZmxvb3IobWluRGF0ZVZhbHVlKSxcbiAgICAgICAgICB0aW1lSW50ZXJ2YWwuY2VpbCh1dGNEYXkub2Zmc2V0KG1heERhdGVWYWx1ZSwgMSkpLFxuICAgICAgICApLmxlbmd0aDtcblxuICAgICAgICByZXR1cm4gbnVtU3RlcHMgPD0gbWF4UG9pbnRzICYmIG51bVN0ZXBzID4gMTtcbiAgICAgIH0pO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgaW50ZXJ2YWxPcHRpb25zJCA9IHRoaXMuYWxsb3dlZEludGVydmFscyQucGlwZShcbiAgICBtYXAoaW50ZXJ2YWxzID0+XG4gICAgICBpbnRlcnZhbHMubWFwKFxuICAgICAgICAoaW50ZXJ2YWwpOiBJbnRlcnZhbE9wdGlvbiA9PiAoe1xuICAgICAgICAgIGlkOiBpbnRlcnZhbCxcbiAgICAgICAgICB0aXRsZTogZ2V0SW50ZXJ2YWxUaXRsZShpbnRlcnZhbCksXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRJbnRlcnZhbE9wdGlvbiQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmludGVydmFsJCxcbiAgICB0aGlzLmludGVydmFsT3B0aW9ucyQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW50ZXJ2YWwsIG9wdGlvbnNdKSA9PiB7XG4gICAgICBjb25zdCBhbGxvd2VkSW50ZXJ2YWxzID0gb3B0aW9ucy5tYXAoKHsgaWQgfSkgPT4gaWQgYXMgSW50ZXJ2YWwpO1xuICAgICAgaWYgKCFhbGxvd2VkSW50ZXJ2YWxzLmluY2x1ZGVzKGludGVydmFsKSkge1xuICAgICAgICBjb25zdCBmaXJzdEFsbG93ZWQgPSBhbGxvd2VkSW50ZXJ2YWxzLmF0KDApO1xuICAgICAgICBjb25zdCBsYXN0QWxsb3dlZCA9IGFsbG93ZWRJbnRlcnZhbHMuYXQoLTEpO1xuICAgICAgICBpZiAoIWZpcnN0QWxsb3dlZCB8fCAhbGFzdEFsbG93ZWQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChpbnRlcnZhbHMuaW5kZXhPZihpbnRlcnZhbCkgPCBpbnRlcnZhbHMuaW5kZXhPZihmaXJzdEFsbG93ZWQpKVxuICAgICAgICAgIGludGVydmFsID0gZmlyc3RBbGxvd2VkO1xuICAgICAgICBpZiAoaW50ZXJ2YWxzLmluZGV4T2YoaW50ZXJ2YWwpID4gaW50ZXJ2YWxzLmluZGV4T2YobGFzdEFsbG93ZWQpKVxuICAgICAgICAgIGludGVydmFsID0gbGFzdEFsbG93ZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9ucy5maW5kKG8gPT4gby5pZCA9PT0gaW50ZXJ2YWwpID8/IG51bGw7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3RlZEludGVydmFsJCA9IHRoaXMuc2VsZWN0ZWRJbnRlcnZhbE9wdGlvbiQucGlwZShcbiAgICBtYXAob3B0aW9uID0+IChvcHRpb24gPyAob3B0aW9uLmlkIGFzIEludGVydmFsKSA6IERFRkFVTFRfSU5URVJWQUwpKSxcbiAgKTtcblxuICBzZXRJbnRlcnZhbE9wdGlvbihvcHRpb246IEludGVydmFsT3B0aW9uIHwgbnVsbCkge1xuICAgIGlmIChvcHRpb24pIHRoaXMuaW50ZXJ2YWwgPSBvcHRpb24uaWQgYXMgSW50ZXJ2YWw7XG4gIH1cblxuICByZWFkb25seSB0b2dnbGVWaXNpYmlsaXR5JCA9XG4gICAgbmV3IEJlaGF2aW9yU3ViamVjdDxUaW1lU2VyaWVzQ29tcG9uZW50LlRvZ2dsZVZpc2liaWxpdHkgfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBiaW5uZWREYXRhV2l0aFJhbmdlcyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmlucHV0JCxcbiAgICB0aGlzLnNlbGVjdGVkSW50ZXJ2YWwkLFxuICAgIHRoaXMudG9nZ2xlVmlzaWJpbGl0eSQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW5wdXQsIGludGVydmFsLCB0b2dnbGVWaXNpYmlsaXR5XSkgPT4ge1xuICAgICAgY29uc3QgcmFuZ2VNYXAgPSBuZXcgTWFwPG51bWJlciwgRGF0ZT4oKTtcbiAgICAgIGNvbnN0IHNlcmllcyA9IGlucHV0Lm1hcCgoY29uZmlnKTogVGltZVNlcmllc0NvbXBvbmVudC5ZQ29uZmlnID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgc2VyaWVzOiBjb25maWcuc2VyaWVzLm1hcCgoc2VyaWVzLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiaW5uZWQgPSBuZXcgTWFwPG51bWJlciwgVGltZVNlcmllc0NvbXBvbmVudC5EYXRhUG9pbnRbXT4oKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2Ygc2VyaWVzLmRhdGEpIHtcbiAgICAgICAgICAgICAgY29uc3QgYmluS2V5ID0gZ2V0VGltZUludGVydmFsKGludGVydmFsKVxuICAgICAgICAgICAgICAgIC5mbG9vcihwb2ludC5kYXRlKVxuICAgICAgICAgICAgICAgIC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgIGNvbnN0IG1heERhdGUgPSByYW5nZU1hcC5nZXQoYmluS2V5KTtcblxuICAgICAgICAgICAgICBpZiAoIW1heERhdGUgfHwgbWF4RGF0ZSA8IHBvaW50LmRhdGUpIHtcbiAgICAgICAgICAgICAgICByYW5nZU1hcC5zZXQoYmluS2V5LCBwb2ludC5kYXRlKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICghYmlubmVkLmhhcyhiaW5LZXkpKSB7XG4gICAgICAgICAgICAgICAgYmlubmVkLnNldChiaW5LZXksIFtdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBiaW5uZWQuZ2V0KGJpbktleSkhLnB1c2gocG9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLmFsbG93TGVnZW5kVG9nZ2xlICYmXG4gICAgICAgICAgICAgIHRvZ2dsZVZpc2liaWxpdHkgJiZcbiAgICAgICAgICAgICAgc2VyaWVzLmxhYmVsID09PSB0b2dnbGVWaXNpYmlsaXR5LmxhYmVsXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgc2VyaWVzLnZpc2liaWxpdHkgPSB0b2dnbGVWaXNpYmlsaXR5LnZpc2liaWxpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5zZXJpZXMsXG4gICAgICAgICAgICAgIGRhdGE6IFsuLi5iaW5uZWQuZW50cmllcygpXS5tYXAoKFtkYXRlVmFsdWUsIHBvaW50c10pID0+ICh7XG4gICAgICAgICAgICAgICAgZGF0ZTogbmV3IERhdGUoZGF0ZVZhbHVlKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogY29uZmlnLnBvaW50UmVkdWNlcihwb2ludHMsIGkpLFxuICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXJpZXMsXG4gICAgICAgIGdldFJhbmdlOiAoZGF0ZTogRGF0ZSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtaW5EYXRlOiBkYXRlLFxuICAgICAgICAgICAgbWF4RGF0ZTogcmFuZ2VNYXAuZ2V0KGRhdGUudmFsdWVPZigpKSEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBiaW5uZWREYXRhJCA9IHRoaXMuYmlubmVkRGF0YVdpdGhSYW5nZXMkLnBpcGUoXG4gICAgbWFwKGJpbm5lZERhdGEgPT4gYmlubmVkRGF0YS5zZXJpZXMpLFxuICApO1xuXG4gIHJlYWRvbmx5IGdldFJhbmdlJCA9IHRoaXMuYmlubmVkRGF0YVdpdGhSYW5nZXMkLnBpcGUoXG4gICAgbWFwKGJpbm5lZERhdGEgPT4gYmlubmVkRGF0YS5nZXRSYW5nZSksXG4gICk7XG5cbiAgcmVhZG9ubHkgYmlubmVkRGF0ZVJhbmdlJCA9IHRoaXMuYmlubmVkRGF0YSQucGlwZShcbiAgICBtYXAoZ2V0RGF0ZVJhbmdlKSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIGdldE1hcmtlckNsaWNrZWQoXG4gICAgcmFuZ2U6IHsgbWluRGF0ZTogRGF0ZTsgbWF4RGF0ZTogRGF0ZSB9LFxuICAgIHNlcmllc0luZGV4OiBudW1iZXIsXG4gICAgeTogJ3kxJyB8ICd5MicsXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5yYW5nZSxcbiAgICAgIHNlcmllc0luZGV4LFxuICAgICAgeSxcbiAgICB9O1xuICB9XG5cbiAgcmVhZG9ubHkgZHJhd0RhdGEkOiBPYnNlcnZhYmxlPERyYXdEYXRhPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuYmlubmVkRGF0YSQsXG4gICAgdGhpcy5iaW5uZWREYXRlUmFuZ2UkLFxuICAgIHRoaXMuc2VsZWN0ZWRJbnRlcnZhbCQsXG4gICAgdGhpcy53aWR0aCQsXG4gICAgdGhpcy54TWlub3JUaWNrTGltaXQkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2Jpbm5lZERhdGEsIGJpbm5lZERhdGVSYW5nZSwgaW50ZXJ2YWwsIHdpZHRoLCB4TWlub3JUaWNrTGltaXRdKSA9PiB7XG4gICAgICBjb25zdCB2aWV3Qm94ID0gYDAgMCAke3dpZHRofSAke3RoaXMuSEVJR0hUfWA7XG5cbiAgICAgIGNvbnN0IHhTY2FsZVJhbmdlU3RhcnQgPSB0aGlzLkxFRlRfUklHSFRfUEFERElORyArIHRoaXMuTEVGVF9SSUdIVF9PRkZTRVQ7XG4gICAgICBjb25zdCB4U2NhbGVSYW5nZUVuZCA9XG4gICAgICAgIHdpZHRoIC1cbiAgICAgICAgdGhpcy5MRUZUX1JJR0hUX1BBRERJTkcgKiAyIC1cbiAgICAgICAgKGJpbm5lZERhdGEubGVuZ3RoID4gMSA/IHRoaXMuTEVGVF9SSUdIVF9PRkZTRVQgOiAwKTtcbiAgICAgIGNvbnN0IHhTY2FsZSA9IHNjYWxlTGluZWFyKClcbiAgICAgICAgLmRvbWFpbihiaW5uZWREYXRlUmFuZ2UpXG4gICAgICAgIC5yYW5nZShbeFNjYWxlUmFuZ2VTdGFydCwgeFNjYWxlUmFuZ2VFbmRdKTtcbiAgICAgIGNvbnN0IFttaW5EYXRlVmFsdWUsIG1heERhdGVWYWx1ZV0gPSBiaW5uZWREYXRlUmFuZ2U7XG4gICAgICBjb25zdCBoYXNNdWx0aXBsZVllYXJzID1cbiAgICAgICAgbWluRGF0ZVZhbHVlLmdldEZ1bGxZZWFyKCkgPCBtYXhEYXRlVmFsdWUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIGNvbnN0IHhNaW5vckludGVydmFsRm9ybWF0ID0gZ2V0TWlub3JJbnRlcnZhbEZvcm1hdChpbnRlcnZhbCk7XG4gICAgICBjb25zdCBtaW5vckZvcm1hdHRlciA9IHV0Y0Zvcm1hdCh4TWlub3JJbnRlcnZhbEZvcm1hdCk7XG4gICAgICBjb25zdCB4TWlub3JUaWNrcyA9IGdldFRpbWVJbnRlcnZhbChpbnRlcnZhbClcbiAgICAgICAgLnJhbmdlKG1pbkRhdGVWYWx1ZSwgdXRjRGF5Lm9mZnNldChtYXhEYXRlVmFsdWUsIDEpKVxuICAgICAgICAubWFwKGRhdGUgPT4gKHtcbiAgICAgICAgICB2YWx1ZTogdXRjRGF5Lm9mZnNldChkYXRlLCAwKS52YWx1ZU9mKCksXG4gICAgICAgICAgbGFiZWw6IG1pbm9yRm9ybWF0dGVyKGRhdGUpLFxuICAgICAgICB9KSlcbiAgICAgICAgLmZpbHRlcigoXywgaSwgYXJyKSA9PlxuICAgICAgICAgIGFyci5sZW5ndGggPiB4TWlub3JUaWNrTGltaXRcbiAgICAgICAgICAgID8gaSAlIE1hdGguY2VpbChhcnIubGVuZ3RoIC8geE1pbm9yVGlja0xpbWl0KSA9PT0gMFxuICAgICAgICAgICAgOiB0cnVlLFxuICAgICAgICApO1xuICAgICAgY29uc3QgeE1ham9ySW50ZXJ2YWwgPSBnZXRNYWpvckludGVydmFsKGludGVydmFsKTtcbiAgICAgIGNvbnN0IHhNYWpvckludGVydmFsRm9ybWF0ID0gZ2V0TWFqb3JJbnRlcnZhbEZvcm1hdChcbiAgICAgICAgeE1ham9ySW50ZXJ2YWwsXG4gICAgICAgIGhhc011bHRpcGxlWWVhcnMsXG4gICAgICApO1xuICAgICAgY29uc3QgdGltZUludGVydmFsID0gZ2V0VGltZUludGVydmFsKHhNYWpvckludGVydmFsKTtcbiAgICAgIGNvbnN0IHRpY2tGbG9vciA9IHRpbWVJbnRlcnZhbC5mbG9vcihtaW5EYXRlVmFsdWUpO1xuICAgICAgY29uc3QgdGlja0NlaWxpbmcgPSB0aW1lSW50ZXJ2YWwuY2VpbCh1dGNEYXkub2Zmc2V0KG1heERhdGVWYWx1ZSwgMSkpO1xuICAgICAgY29uc3QgbWFqb3JGb3JtYXR0ZXIgPSB1dGNGb3JtYXQoeE1ham9ySW50ZXJ2YWxGb3JtYXQpO1xuICAgICAgY29uc3QgeE1ham9yVGlja3MgPSB0aW1lSW50ZXJ2YWxcbiAgICAgICAgLnJhbmdlKHRpY2tGbG9vciwgdGlja0NlaWxpbmcpXG4gICAgICAgIC5tYXAodGlja0RhdGUgPT4gKHtcbiAgICAgICAgICBsYWJlbDogeE1ham9ySW50ZXJ2YWwgPT09IGludGVydmFsID8gJycgOiBtYWpvckZvcm1hdHRlcih0aWNrRGF0ZSksXG4gICAgICAgICAgdmFsdWU6IHRpY2tEYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgfSkpO1xuICAgICAgY29uc3QgeCA9IHsgeE1heDogbWF4RGF0ZVZhbHVlLCB4U2NhbGUsIHhNaW5vclRpY2tzLCB4TWFqb3JUaWNrcyB9O1xuXG4gICAgICBjb25zdCBbeTEsIHkyXSA9IGJpbm5lZERhdGEubWFwKGNvbmZpZyA9PiB7XG4gICAgICAgIGNvbnN0IHZpc2libGVTZXJpZXMgPSBjb25maWcuc2VyaWVzLmZpbHRlcihcbiAgICAgICAgICBzID0+IHMudmlzaWJpbGl0eSAhPT0gJ2hpZGRlbicsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGZsYXR0ZW5lZFZhbHVlcyA9IHZpc2libGVTZXJpZXMucmVkdWNlPG51bWJlcltdPihcbiAgICAgICAgICAodmFsdWVzLCBzZXJpZXMpID0+IFtcbiAgICAgICAgICAgIC4uLnZhbHVlcyxcbiAgICAgICAgICAgIC4uLnNlcmllcy5kYXRhLm1hcCgoeyB2YWx1ZSB9KSA9PiB2YWx1ZSksXG4gICAgICAgICAgXSxcbiAgICAgICAgICBbXSxcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHlNYXggPSBjb25maWcubWF4ID8/IE1hdGgubWF4KC4uLmZsYXR0ZW5lZFZhbHVlcywgMCk7XG4gICAgICAgIGNvbnN0IHlNaW4gPSBjb25maWcubWluID8/IE1hdGgubWluKC4uLmZsYXR0ZW5lZFZhbHVlcywgMCk7XG4gICAgICAgIC8vIFJJVkVULTE0NjA1IC0gaWYgcmFuZ2UgaXMgWzAsMF0sIG1ha2UgaXQgWzAsMV0gaW5zdGVhZFxuICAgICAgICBpZiAoeU1heCA9PSAwICYmIHlNaW4gPT0gMCkge1xuICAgICAgICAgIHlNYXggPSAxO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHlTY2FsZSA9IHNjYWxlTGluZWFyKClcbiAgICAgICAgICAuZG9tYWluKFt5TWluLCB5TWF4XSlcbiAgICAgICAgICAucmFuZ2UoW1xuICAgICAgICAgICAgdGhpcy5IRUlHSFQgLVxuICAgICAgICAgICAgICB0aGlzLkJPVFRPTV9PRkZTRVQgLVxuICAgICAgICAgICAgICAodGhpcy5CT1RUT01fUEFERElORyArIHRoaXMuVE9QX1BBRERJTkcpLFxuICAgICAgICAgICAgdGhpcy5UT1BfUEFERElORyxcbiAgICAgICAgICBdKTtcbiAgICAgICAgY29uc3QgeVRpY2tzID0geVNjYWxlLnRpY2tzKHRoaXMuWV9USUNLX0NPVU5UKTtcbiAgICAgICAgY29uc3Qgc2VyaWVzID0gY29uZmlnLnNlcmllcy5tYXAoc2VyaWVzID0+ICh7XG4gICAgICAgICAgLi4uc2VyaWVzLFxuICAgICAgICAgIHBhdGg6IGxpbmU8VGltZVNlcmllc0NvbXBvbmVudC5EYXRhUG9pbnQ+KClcbiAgICAgICAgICAgIC54KGQgPT4geFNjYWxlKGQuZGF0ZSkpXG4gICAgICAgICAgICAueShkID0+IHlTY2FsZShkLnZhbHVlKSkoc2VyaWVzLmRhdGEpLFxuICAgICAgICAgIHN0cm9rZTogYHZhcigke3Nlcmllcy5jb2xvclRva2VufSlgLFxuICAgICAgICAgIG1hcmtlcnM6IHNlcmllcy5kYXRhLm1hcChwb2ludCA9PiAoe1xuICAgICAgICAgICAgLi4ucG9pbnQsXG4gICAgICAgICAgICB4OiB4U2NhbGUocG9pbnQuZGF0ZSksXG4gICAgICAgICAgICB5OiB5U2NhbGUocG9pbnQudmFsdWUpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICBzZXJpZXMsXG4gICAgICAgICAgeU1heCxcbiAgICAgICAgICB5TWluLFxuICAgICAgICAgIHlTY2FsZSxcbiAgICAgICAgICB5VGlja3MsXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBhIHkyLCBjb2VyY2UgeTEncyB0aWNrcyB0byBiZSB2aXN1YWxseSBlcXVpdmFsZW50IHRvIHkyJ3MgdGlja3MuXG4gICAgICBpZiAoeTI/LnlUaWNrcykge1xuICAgICAgICBjb25zdCB0aWNrQ29udmVyc2lvblNjYWxlID0gc2NhbGVMaW5lYXIoKVxuICAgICAgICAgIC5yYW5nZSh5MS55U2NhbGUuZG9tYWluKCkpXG4gICAgICAgICAgLmRvbWFpbih5Mi55U2NhbGUuZG9tYWluKCkpO1xuICAgICAgICB5MS55VGlja3MgPSB5Mi55VGlja3MubWFwKHRpY2tDb252ZXJzaW9uU2NhbGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyB2aWV3Qm94LCB4LCB5MSwgeTIgfTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGxlZ2VuZCQgPSB0aGlzLmJpbm5lZERhdGEkLnBpcGUoXG4gICAgbWFwKGJpbm5lZERhdGEgPT5cbiAgICAgIGJpbm5lZERhdGEucmVkdWNlPFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgICBjb2xvclRva2VuOiBzdHJpbmc7XG4gICAgICAgICAgdmlzaWJpbGl0eTogJ3Zpc2libGUnIHwgJ2hpZGRlbic7XG4gICAgICAgIH1bXVxuICAgICAgPihcbiAgICAgICAgKGl0ZW1zLCBjb25maWcpID0+IFtcbiAgICAgICAgICAuLi5pdGVtcyxcbiAgICAgICAgICAuLi5jb25maWcuc2VyaWVzLm1hcChzZXJpZXMgPT4gKHtcbiAgICAgICAgICAgIGxhYmVsOiBzZXJpZXMubGFiZWwsXG4gICAgICAgICAgICBjb2xvclRva2VuOiBzZXJpZXMuY29sb3JUb2tlbixcbiAgICAgICAgICAgIHZpc2liaWxpdHk6IHNlcmllcy52aXNpYmlsaXR5ID8/ICd2aXNpYmxlJyxcbiAgICAgICAgICB9KSksXG4gICAgICAgIF0sXG4gICAgICAgIFtdLFxuICAgICAgKSxcbiAgICApLFxuICApO1xuXG4gIHJlYWRvbmx5IGVtcHR5JCA9IHRoaXMuYmlubmVkRGF0YSQucGlwZShcbiAgICBtYXAoYmlubmVkRGF0YSA9PlxuICAgICAgYmlubmVkRGF0YS5ldmVyeShjb25maWcgPT5cbiAgICAgICAgY29uZmlnLnNlcmllcy5ldmVyeShzZXJpZXMgPT4gc2VyaWVzLmRhdGEubGVuZ3RoID09PSAwKSxcbiAgICAgICksXG4gICAgKSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGhvdmVyZWRNYXJrZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQ7XG4gICAgbWFya2VyOiBNYXJrZXI7XG4gICAgc2VyaWVzSW5kZXg6IG51bWJlcjtcbiAgICB5OiAneTEnIHwgJ3kyJztcbiAgfSB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IGNhbGxvdXQkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5ob3ZlcmVkTWFya2VyJCxcbiAgICB0aGlzLmRyYXdEYXRhJCxcbiAgICB0aGlzLmdyb3VwZWRUb29sdGlwcyQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaG92ZXJlZE1hcmtlciwgZHJhd0RhdGEsIGdyb3VwZWRUb29sdGlwc10pID0+IHtcbiAgICAgIGlmICghaG92ZXJlZE1hcmtlcikgcmV0dXJuIG51bGw7XG5cbiAgICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBob3ZlcmVkTWFya2VyLmV2ZW50O1xuICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgbWFya2VyUmVjdCA9ICg8U1ZHQ2lyY2xlRWxlbWVudD50YXJnZXQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgcGFkZGluZyA9IDg7XG4gICAgICBjb25zdCBhbmNob3IgPSBuZXcgRE9NUmVjdChcbiAgICAgICAgbWFya2VyUmVjdC5sZWZ0IC0gcGFkZGluZyxcbiAgICAgICAgbWFya2VyUmVjdC50b3AgLSBwYWRkaW5nLFxuICAgICAgICBtYXJrZXJSZWN0LndpZHRoICsgcGFkZGluZyAqIDIsXG4gICAgICAgIG1hcmtlclJlY3QuaGVpZ2h0ICsgcGFkZGluZyAqIDIsXG4gICAgICApO1xuXG4gICAgICB0eXBlIE1ldHJpYyA9IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgY29sb3JUb2tlbjogc3RyaW5nIH07XG4gICAgICBjb25zdCBtZXRyaWNzOiBNZXRyaWNbXSA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZHJhd0RhdGEueTEuc2VyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCBzZXJpZXMgPSBkcmF3RGF0YS55MS5zZXJpZXNbaW5kZXhdO1xuICAgICAgICBjb25zdCBhbGxvd2VkID0gIWdyb3VwZWRUb29sdGlwc1xuICAgICAgICAgID8gaG92ZXJlZE1hcmtlci55ID09ICd5MScgJiYgaG92ZXJlZE1hcmtlci5zZXJpZXNJbmRleCA9PSBpbmRleFxuICAgICAgICAgIDogdHJ1ZTtcbiAgICAgICAgaWYgKHNlcmllcy52aXNpYmlsaXR5ICE9PSAnaGlkZGVuJyAmJiBhbGxvd2VkKSB7XG4gICAgICAgICAgY29uc3QgbWF0Y2ggPSBzZXJpZXMubWFya2Vycy5maW5kKFxuICAgICAgICAgICAgbWFya2VyID0+IG1hcmtlci54ID09PSBob3ZlcmVkTWFya2VyLm1hcmtlci54LFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBtZXRyaWNzLnB1c2goe1xuICAgICAgICAgICAgICBjb2xvclRva2VuOiBzZXJpZXMuY29sb3JUb2tlbixcbiAgICAgICAgICAgICAgbGFiZWw6IHNlcmllcy5sYWJlbCxcbiAgICAgICAgICAgICAgdmFsdWU6IGRyYXdEYXRhLnkxLnZhbHVlRm9ybWF0dGVyKG1hdGNoLnZhbHVlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZHJhd0RhdGEueTIpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGRyYXdEYXRhLnkyLnNlcmllcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBjb25zdCBzZXJpZXMgPSBkcmF3RGF0YS55Mi5zZXJpZXNbaW5kZXhdO1xuICAgICAgICAgIGNvbnN0IGFsbG93ZWQgPSAhZ3JvdXBlZFRvb2x0aXBzXG4gICAgICAgICAgICA/IGhvdmVyZWRNYXJrZXIueSA9PSAneTInICYmIGhvdmVyZWRNYXJrZXIuc2VyaWVzSW5kZXggPT0gaW5kZXhcbiAgICAgICAgICAgIDogdHJ1ZTtcbiAgICAgICAgICBpZiAoc2VyaWVzLnZpc2liaWxpdHkgIT09ICdoaWRkZW4nICYmIGFsbG93ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gc2VyaWVzLm1hcmtlcnMuZmluZChcbiAgICAgICAgICAgICAgbWFya2VyID0+IG1hcmtlci54ID09PSBob3ZlcmVkTWFya2VyLm1hcmtlci54LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICBtZXRyaWNzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvbG9yVG9rZW46IHNlcmllcy5jb2xvclRva2VuLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBzZXJpZXMubGFiZWwsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGRyYXdEYXRhLnkyLnZhbHVlRm9ybWF0dGVyKG1hdGNoLnZhbHVlKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGFuY2hvciwgbWV0cmljcyB9O1xuICAgIH0pLFxuICApO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRpbWVTZXJpZXNDb21wb25lbnQge1xuICBleHBvcnQgdHlwZSBTZXJpZXMgPSB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjb2xvclRva2VuOiBzdHJpbmc7XG4gICAgZGF0YTogVGltZVNlcmllc0NvbXBvbmVudC5EYXRhUG9pbnRbXTtcbiAgICBzdHlsZT86ICdzb2xpZCcgfCAnZGFzaGVkJztcbiAgICB2aXNpYmlsaXR5PzogJ3Zpc2libGUnIHwgJ2hpZGRlbic7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgRGF0YVBvaW50ID0ge1xuICAgIHZhbHVlOiBudW1iZXI7XG4gICAgZGF0ZTogRGF0ZTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBZQ29uZmlnID0ge1xuICAgIHBvaW50UmVkdWNlcjogKHBvaW50czogRGF0YVBvaW50W10sIHNlcmllc0luZGV4OiBudW1iZXIpID0+IG51bWJlcjtcbiAgICB2YWx1ZUZvcm1hdHRlcjogKHJlZHVjZWRWYWx1ZTogbnVtYmVyKSA9PiBzdHJpbmc7XG4gICAgc2VyaWVzOiBTZXJpZXNbXTtcbiAgICBtaW4/OiBudW1iZXI7XG4gICAgbWF4PzogbnVtYmVyO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFRpbWVTZXJpZXNJbnB1dCA9IFtZQ29uZmlnXSB8IFtZQ29uZmlnLCBZQ29uZmlnXTtcblxuICBleHBvcnQgdHlwZSBUb2dnbGVWaXNpYmlsaXR5ID0ge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgdmlzaWJpbGl0eTogJ2hpZGRlbicgfCAndmlzaWJsZSc7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgTWFya2VyQ2xpY2tlZCA9IHtcbiAgICBtaW5EYXRlOiBEYXRlO1xuICAgIG1heERhdGU6IERhdGU7XG4gICAgc2VyaWVzSW5kZXg6IG51bWJlcjtcbiAgICB5OiAneTEnIHwgJ3kyJztcbiAgfTtcbn1cbiIsIjxkaXZcbiAgKm5nSWY9XCIoZW1wdHkkIHwgYXN5bmMpID09PSBmYWxzZTsgZWxzZSB6ZXJvU3RhdGVcIlxuICBjbGFzcz1cImNvbnRhaW5lclwiXG4gIChyaXZDbGllbnRTaXplKT1cIndpZHRoID0gJGV2ZW50LndpZHRoXCJcbj5cbiAgPHN2Z1xuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICpuZ0lmPVwiZHJhd0RhdGEkIHwgYXN5bmM7IGxldCBkXCJcbiAgICBbYXR0ci52aWV3Qm94XT1cImQudmlld0JveFwiXG4gID5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLngueE1ham9yVGlja3NcIj5cbiAgICAgIDx0ZXh0XG4gICAgICAgICpuZ0lmPVwiZC54LnhTY2FsZSh0aWNrLnZhbHVlKSA+PSAwXCJcbiAgICAgICAgY2xhc3M9XCJ4LW1ham9yLXRpY2stbGFiZWxcIlxuICAgICAgICBbYXR0ci54XT1cImQueC54U2NhbGUodGljay52YWx1ZSlcIlxuICAgICAgICBbYXR0ci55XT1cIkhFSUdIVCAtIEJPVFRPTV9PRkZTRVRcIlxuICAgICAgICBkeD1cIjRcIlxuICAgICAgICBkeT1cIi00XCJcbiAgICAgID5cbiAgICAgICAge3sgdGljay5sYWJlbCB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLngueE1pbm9yVGlja3NcIj5cbiAgICAgIDx0ZXh0XG4gICAgICAgIGNsYXNzPVwieC1taW5vci10aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJkLngueFNjYWxlKHRpY2sudmFsdWUpXCJcbiAgICAgICAgW2F0dHIueV09XCJIRUlHSFQgLSBCT1RUT01fT0ZGU0VUXCJcbiAgICAgICAgdGV4dC1hbmNob3I9XCJtaWRkbGVcIlxuICAgICAgICBkb21pbmFudC1iYXNlbGluZT1cImhhbmdpbmdcIlxuICAgICAgICBkeT1cIjhcIlxuICAgICAgPlxuICAgICAgICB7eyB0aWNrLmxhYmVsIH19XG4gICAgICAgIDx0aXRsZT57eyB0aWNrLnZhbHVlIHwgZGF0ZSB9fTwvdGl0bGU+XG4gICAgICA8L3RleHQ+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueTEueVRpY2tzXCI+XG4gICAgICA8cmVjdFxuICAgICAgICBjbGFzcz1cInRpY2tcIlxuICAgICAgICB4PVwiMFwiXG4gICAgICAgIFthdHRyLnldPVwiZC55MS55U2NhbGUodGljaylcIlxuICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICBoZWlnaHQ9XCIxXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8dGV4dCBjbGFzcz1cInktdGljay1sYWJlbFwiIHg9XCIwXCIgW2F0dHIueV09XCJkLnkxLnlTY2FsZSh0aWNrKVwiIGR5PVwiLTRcIj5cbiAgICAgICAge3sgZC55MS52YWx1ZUZvcm1hdHRlcih0aWNrKSB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cblxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueTI/LnlUaWNrc1wiPlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ5LXRpY2stbGFiZWxcIlxuICAgICAgICBbYXR0ci54XT1cIndpZHRoXCJcbiAgICAgICAgW2F0dHIueV09XCJkLnkyPy55U2NhbGUodGljaylcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cImVuZFwiXG4gICAgICAgIGR5PVwiLTRcIlxuICAgICAgPlxuICAgICAgICB7eyBkLnkyPy52YWx1ZUZvcm1hdHRlcih0aWNrKSB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cblxuICAgIDxnICpuZ0lmPVwiaG92ZXJlZE1hcmtlciQgfCBhc3luYzsgbGV0IGhvdmVyZWRNYXJrZXJcIj5cbiAgICAgIDxsaW5lXG4gICAgICAgIGNsYXNzPVwiaG92ZXItcnVsZVwiXG4gICAgICAgIFthdHRyLngxXT1cImhvdmVyZWRNYXJrZXIubWFya2VyLnhcIlxuICAgICAgICBbYXR0ci55MV09XCJkLnkxLnlTY2FsZShkLnkxLnlNaW4pXCJcbiAgICAgICAgW2F0dHIueDJdPVwiaG92ZXJlZE1hcmtlci5tYXJrZXIueFwiXG4gICAgICAgIFthdHRyLnkyXT1cImQueTEueVNjYWxlKGQueTEueU1heClcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheT1cIjRcIlxuICAgICAgLz5cbiAgICA8L2c+XG5cbiAgICA8bmctdGVtcGxhdGUgI3Nlcmllc1RwbCBsZXQtc2VyaWVzPVwic2VyaWVzXCIgbGV0LWluZGV4PVwiaW5kZXhcIiBsZXQteT1cInlcIj5cbiAgICAgIDxwYXRoXG4gICAgICAgICpuZ0lmPVwic2VyaWVzLnZpc2liaWxpdHkgIT09ICdoaWRkZW4nXCJcbiAgICAgICAgY2xhc3M9XCJkYXRhIHBhdGhcIlxuICAgICAgICBbY2xhc3MubWFya2VyLWhvdmVyZWRdPVwiISEoaG92ZXJlZE1hcmtlciQgfCBhc3luYylcIlxuICAgICAgICBbYXR0ci5kXT1cInNlcmllcy5wYXRoXCJcbiAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNlcmllcy5zdHJva2VcIlxuICAgICAgICBbYXR0ci5zdHJva2UtZGFzaGFycmF5XT1cInNlcmllcy5zdHlsZSA9PT0gJ2Rhc2hlZCcgPyAnNCcgOiBudWxsXCJcbiAgICAgID48L3BhdGg+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0UmFuZ2UkIHwgYXN5bmM7IGxldCBnZXRSYW5nZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBtYXJrZXIgb2Ygc2VyaWVzLm1hcmtlcnNcIj5cbiAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICAqbmdJZj1cInNlcmllcy52aXNpYmlsaXR5ICE9PSAnaGlkZGVuJ1wiXG4gICAgICAgICAgICBjbGFzcz1cImRhdGEgbWFya2VyXCJcbiAgICAgICAgICAgIFtjbGFzcy5mb2N1c2VkXT1cIlxuICAgICAgICAgICAgICAoaG92ZXJlZE1hcmtlciQgfCBhc3luYyk/Lm1hcmtlcj8ueCA9PT0gbWFya2VyLnggJiZcbiAgICAgICAgICAgICAgKGdyb3VwZWRUb29sdGlwcyB8fFxuICAgICAgICAgICAgICAgICgoaG92ZXJlZE1hcmtlciQgfCBhc3luYyk/LnNlcmllc0luZGV4ID09PSBpbmRleCAmJlxuICAgICAgICAgICAgICAgICAgKGhvdmVyZWRNYXJrZXIkIHwgYXN5bmMpPy55ID09PSB5KSlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbY2xhc3MuYmx1cnJlZF09XCJcbiAgICAgICAgICAgICAgKGhvdmVyZWRNYXJrZXIkIHwgYXN5bmMpICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICgoaG92ZXJlZE1hcmtlciQgfCBhc3luYyk/Lm1hcmtlcj8ueCAhPT0gbWFya2VyLnggfHxcbiAgICAgICAgICAgICAgICAoKGhvdmVyZWRNYXJrZXIkIHwgYXN5bmMpPy5tYXJrZXI/LnggPT09IG1hcmtlci54ICYmXG4gICAgICAgICAgICAgICAgICAhZ3JvdXBlZFRvb2x0aXBzICYmXG4gICAgICAgICAgICAgICAgICAoKGhvdmVyZWRNYXJrZXIkIHwgYXN5bmMpPy5zZXJpZXNJbmRleCAhPT0gaW5kZXggfHxcbiAgICAgICAgICAgICAgICAgICAgKGhvdmVyZWRNYXJrZXIkIHwgYXN5bmMpPy55ICE9PSB5KSkpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2F0dHIuY3hdPVwibWFya2VyLnhcIlxuICAgICAgICAgICAgW2F0dHIuY3ldPVwibWFya2VyLnlcIlxuICAgICAgICAgICAgW2F0dHIucl09XCJQT0lOVF9SQURJVVNcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic2VyaWVzLnN0cm9rZVwiXG4gICAgICAgICAgICAobW91c2VvdmVyKT1cIlxuICAgICAgICAgICAgICBob3ZlcmVkTWFya2VyJC5uZXh0KHtcbiAgICAgICAgICAgICAgICBldmVudDogJGV2ZW50LFxuICAgICAgICAgICAgICAgIG1hcmtlcjogbWFya2VyLFxuICAgICAgICAgICAgICAgIHNlcmllc0luZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICB5OiB5XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZE1hcmtlciQubmV4dChudWxsKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgIG1hcmtlckNsaWNrZWQuZW1pdChcbiAgICAgICAgICAgICAgICBnZXRNYXJrZXJDbGlja2VkKGdldFJhbmdlKG1hcmtlci5kYXRlKSwgaW5kZXgsIHkpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGhvdmVyZWRNYXJrZXIkLm5leHQobnVsbClcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPjwvY2lyY2xlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPGcgKm5nRm9yPVwibGV0IHNlcmllcyBvZiBkLnkxLnNlcmllczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgIHNlcmllc1RwbDtcbiAgICAgICAgICBjb250ZXh0OiB7IHNlcmllczogc2VyaWVzLCBpbmRleDogaSwgeTogJ3kxJyB9XG4gICAgICAgIFwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCBzZXJpZXMgb2YgZC55Mj8uc2VyaWVzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgc2VyaWVzVHBsO1xuICAgICAgICAgIGNvbnRleHQ6IHsgc2VyaWVzOiBzZXJpZXMsIGluZGV4OiBpLCB5OiAneTInIH1cbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L2c+XG4gIDwvc3ZnPlxuICA8bGVnZW5kPlxuICAgIDxyaXYtbGVnZW5kLWl0ZW1cbiAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxlZ2VuZCQgfCBhc3luY1wiXG4gICAgICBbbGFiZWxdPVwiaXRlbS5sYWJlbFwiXG4gICAgICBbY29sb3JUb2tlbl09XCJpdGVtLmNvbG9yVG9rZW5cIlxuICAgICAgW3Zpc2liaWxpdHldPVwiaXRlbS52aXNpYmlsaXR5XCJcbiAgICAgIFtjbGlja2FibGVdPVwiYWxsb3dMZWdlbmRUb2dnbGVcIlxuICAgICAgKGl0ZW1DbGljayk9XCJcbiAgICAgICAgYWxsb3dMZWdlbmRUb2dnbGVcbiAgICAgICAgICA/IHRvZ2dsZVZpc2liaWxpdHkkLm5leHQoe1xuICAgICAgICAgICAgICBsYWJlbDogaXRlbS5sYWJlbCxcbiAgICAgICAgICAgICAgdmlzaWJpbGl0eTogaXRlbS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJyA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogbnVsbFxuICAgICAgXCJcbiAgICA+PC9yaXYtbGVnZW5kLWl0ZW0+XG4gIDwvbGVnZW5kPlxuPC9kaXY+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJjYWxsb3V0JCB8IGFzeW5jOyBsZXQgY2FsbG91dFwiPlxuICA8cml2LWNhbGxvdXRcbiAgICAqcml2LW92ZXJsYXlcbiAgICBbYW5jaG9yXT1cImNhbGxvdXQ/LmFuY2hvciA/PyBudWxsXCJcbiAgICBbaXNNb2RhbF09XCJmYWxzZVwiXG4gICAgW3ByZWZlcnJlZFBvc2l0aW9uXT1cIidjZW50ZXItcmlnaHQnXCJcbiAgICBbdGhlbWVdPVwiJ2xpZ2h0J1wiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1jb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1yb3dcIiAqbmdGb3I9XCJsZXQgbWV0cmljIG9mIGNhbGxvdXQ/Lm1ldHJpY3NcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXJpZXMtbGFiZWxcIj5cbiAgICAgICAgICA8cml2LWxlZ2VuZC1pdGVtIFtjb2xvclRva2VuXT1cIm1ldHJpYy5jb2xvclRva2VuXCI+PC9yaXYtbGVnZW5kLWl0ZW0+XG4gICAgICAgICAgPHNwYW4+e3sgbWV0cmljLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuPnt7IG1ldHJpYy52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L3Jpdi1jYWxsb3V0PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjemVyb1N0YXRlPlxuICA8cml2LXplcm8tc3RhdGUgW21lc3NhZ2VdPVwiemVyb1N0YXRlTWVzc2FnZVwiPjwvcml2LXplcm8tc3RhdGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbnRyb2xzPlxuICA8cml2LXNpbXBsZS1zZWxlY3RcbiAgICBbb3B0aW9uR3JvdXBzXT1cImludGVydmFsT3B0aW9ucyQgfCBhc3luYyB8IHJpdk9wdGlvbkdyb3VwXCJcbiAgICBbb3JkZXJCeV09XCInc291cmNlJ1wiXG4gICAgW3NlbGVjdGVkT3B0aW9uXT1cInNlbGVjdGVkSW50ZXJ2YWxPcHRpb24kIHwgYXN5bmNcIlxuICAgIChzZWxlY3RlZE9wdGlvbkNoYW5nZSk9XCJzZXRJbnRlcnZhbE9wdGlvbigkZXZlbnQpXCJcbiAgPjwvcml2LXNpbXBsZS1zZWxlY3Q+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -1,15 +0,0 @@
1
- export function getDateRange(configs) {
2
- let min = Infinity;
3
- let max = -Infinity;
4
- for (const config of configs) {
5
- for (const series of config.series) {
6
- for (const { date } of series.data) {
7
- const value = date.valueOf();
8
- min = Math.min(min, value);
9
- max = Math.max(max, value);
10
- }
11
- }
12
- }
13
- return [new Date(min), new Date(max)];
14
- }
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1zZXJpZXMuaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jpdi9zcmMvbGliL3Zpc3VhbGl6YXRpb24vdGltZS1zZXJpZXMvdGltZS1zZXJpZXMuaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUErQkEsTUFBTSxVQUFVLFlBQVksQ0FDMUIsT0FBc0M7SUFFdEMsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDO0lBQ25CLElBQUksR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ3BCLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0IsS0FBSyxNQUFNLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkMsS0FBSyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzdCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDM0IsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTY2FsZUxpbmVhciB9IGZyb20gJ2QzLXNjYWxlJztcbmltcG9ydCB7IFRpbWVTZXJpZXNDb21wb25lbnQgfSBmcm9tICcuL3RpbWUtc2VyaWVzLmNvbXBvbmVudCc7XG5cbnR5cGUgWFRpY2sgPSB7IHZhbHVlOiBudW1iZXI7IGxhYmVsOiBzdHJpbmcgfTtcblxuZXhwb3J0IHR5cGUgTWFya2VyID0gVGltZVNlcmllc0NvbXBvbmVudC5EYXRhUG9pbnQgJiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG5cbnR5cGUgWURyYXdEYXRhID0gVGltZVNlcmllc0NvbXBvbmVudC5ZQ29uZmlnICYge1xuICBzZXJpZXM6IChUaW1lU2VyaWVzQ29tcG9uZW50LlNlcmllcyAmIHtcbiAgICBwYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgIHN0cm9rZTogc3RyaW5nO1xuICAgIG1hcmtlcnM6IE1hcmtlcltdO1xuICB9KVtdO1xuICB5TWF4OiBudW1iZXI7XG4gIHlNaW46IG51bWJlcjtcbiAgeVNjYWxlOiBTY2FsZUxpbmVhcjxudW1iZXIsIG51bWJlciwgbmV2ZXI+O1xuICB5VGlja3M6IG51bWJlcltdO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhd0RhdGEgPSB7XG4gIHZpZXdCb3g6IHN0cmluZztcbiAgeDoge1xuICAgIHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPjtcbiAgICB4TWlub3JUaWNrczogWFRpY2tbXTtcbiAgICB4TWFqb3JUaWNrczogWFRpY2tbXTtcbiAgICB4TWF4OiBEYXRlO1xuICB9O1xuICB5MTogWURyYXdEYXRhO1xuICB5Mj86IFlEcmF3RGF0YTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRlUmFuZ2UoXG4gIGNvbmZpZ3M6IFRpbWVTZXJpZXNDb21wb25lbnQuWUNvbmZpZ1tdLFxuKTogW0RhdGUsIERhdGVdIHtcbiAgbGV0IG1pbiA9IEluZmluaXR5O1xuICBsZXQgbWF4ID0gLUluZmluaXR5O1xuICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBjb25maWdzKSB7XG4gICAgZm9yIChjb25zdCBzZXJpZXMgb2YgY29uZmlnLnNlcmllcykge1xuICAgICAgZm9yIChjb25zdCB7IGRhdGUgfSBvZiBzZXJpZXMuZGF0YSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGUudmFsdWVPZigpO1xuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIHZhbHVlKTtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbbmV3IERhdGUobWluKSwgbmV3IERhdGUobWF4KV07XG59XG4iXX0=
@@ -1,51 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "../../icon/icon.component";
4
- export class TrendComponent {
5
- constructor() {
6
- this.label = '';
7
- this.value = 0;
8
- this.successCondition = 'positive';
9
- }
10
- getClasses() {
11
- const conditionalClass = this.value === 0
12
- ? ''
13
- : this.successCondition === 'positive'
14
- ? this.value > 0
15
- ? 'success'
16
- : 'danger'
17
- : this.value < 0
18
- ? 'success'
19
- : 'danger';
20
- return 'trend ' + conditionalClass;
21
- }
22
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TrendComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TrendComponent, selector: "riv-trend", inputs: { label: "label", value: "value", successCondition: "successCondition" }, ngImport: i0, template: "<span [class]=\"getClasses()\">\n <riv-icon\n class=\"icon\"\n [name]=\"\n value === 0 ? 'ArrowRight' : value > 0 ? 'TrendingUp' : 'TrendingDown'\n \"\n [size]=\"16\"\n ></riv-icon>\n <span>{{ label }}</span>\n</span>\n", styles: [".success{color:var(--baja-blast-90)}.danger{color:var(--fyre-50)}.trend{display:flex;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-1);font-weight:var(--font-weight-normal)}.icon{margin-right:var(--size-small)}\n"], dependencies: [{ kind: "component", type: i1.IconComponent, selector: "riv-icon", inputs: ["name", "fillColor", "size", "customSize", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24
- }
25
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TrendComponent, decorators: [{
26
- type: Component,
27
- args: [{ selector: 'riv-trend', changeDetection: ChangeDetectionStrategy.OnPush, template: "<span [class]=\"getClasses()\">\n <riv-icon\n class=\"icon\"\n [name]=\"\n value === 0 ? 'ArrowRight' : value > 0 ? 'TrendingUp' : 'TrendingDown'\n \"\n [size]=\"16\"\n ></riv-icon>\n <span>{{ label }}</span>\n</span>\n", styles: [".success{color:var(--baja-blast-90)}.danger{color:var(--fyre-50)}.trend{display:flex;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-1);font-weight:var(--font-weight-normal)}.icon{margin-right:var(--size-small)}\n"] }]
28
- }], propDecorators: { label: [{
29
- type: Input
30
- }], value: [{
31
- type: Input
32
- }], successCondition: [{
33
- type: Input
34
- }] } });
35
- (function (TrendComponent) {
36
- function calculateTrend(currentValue, previousValue) {
37
- if (currentValue == null || previousValue == null || previousValue === 0) {
38
- return 0;
39
- }
40
- return currentValue / previousValue - 1;
41
- }
42
- TrendComponent.calculateTrend = calculateTrend;
43
- function calculatePercentageTrend(currentValue, previousValue) {
44
- if (currentValue == null || previousValue == null) {
45
- return 0;
46
- }
47
- return currentValue - previousValue;
48
- }
49
- TrendComponent.calculatePercentageTrend = calculatePercentageTrend;
50
- })(TrendComponent || (TrendComponent = {}));
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlbmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi90cmVuZC90cmVuZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3RyZW5kL3RyZW5kLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFRMUUsTUFBTSxPQUFPLGNBQWM7SUFOM0I7UUFRRSxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBR25CLFVBQUssR0FBVyxDQUFDLENBQUM7UUFHbEIscUJBQWdCLEdBQTRCLFVBQVUsQ0FBQztLQWdCeEQ7SUFkQyxVQUFVO1FBQ1IsTUFBTSxnQkFBZ0IsR0FDcEIsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDO1lBQ2QsQ0FBQyxDQUFDLEVBQUU7WUFDSixDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixLQUFLLFVBQVU7Z0JBQ3RDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUM7b0JBQ2QsQ0FBQyxDQUFDLFNBQVM7b0JBQ1gsQ0FBQyxDQUFDLFFBQVE7Z0JBQ1osQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQztvQkFDaEIsQ0FBQyxDQUFDLFNBQVM7b0JBQ1gsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUVmLE9BQU8sUUFBUSxHQUFHLGdCQUFnQixDQUFDO0lBQ3JDLENBQUM7K0dBdkJVLGNBQWM7bUdBQWQsY0FBYyxtSUNSM0IsaVBBVUE7OzRGREZhLGNBQWM7a0JBTjFCLFNBQVM7K0JBQ0UsV0FBVyxtQkFHSix1QkFBdUIsQ0FBQyxNQUFNOzhCQUkvQyxLQUFLO3NCQURKLEtBQUs7Z0JBSU4sS0FBSztzQkFESixLQUFLO2dCQUlOLGdCQUFnQjtzQkFEZixLQUFLOztBQW1CUixXQUFpQixjQUFjO0lBQzdCLFNBQWdCLGNBQWMsQ0FDNUIsWUFBdUMsRUFDdkMsYUFBd0M7UUFFeEMsSUFBSSxZQUFZLElBQUksSUFBSSxJQUFJLGFBQWEsSUFBSSxJQUFJLElBQUksYUFBYSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pFLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUNELE9BQU8sWUFBWSxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQVJlLDZCQUFjLGlCQVE3QixDQUFBO0lBRUQsU0FBZ0Isd0JBQXdCLENBQ3RDLFlBQXVDLEVBQ3ZDLGFBQXdDO1FBRXhDLElBQUksWUFBWSxJQUFJLElBQUksSUFBSSxhQUFhLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEQsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBQ0QsT0FBTyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ3RDLENBQUM7SUFSZSx1Q0FBd0IsMkJBUXZDLENBQUE7QUFDSCxDQUFDLEVBcEJnQixjQUFjLEtBQWQsY0FBYyxRQW9COUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtdHJlbmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdHJlbmQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90cmVuZC5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUcmVuZENvbXBvbmVudCB7XG4gIEBJbnB1dCgpXG4gIGxhYmVsOiBzdHJpbmcgPSAnJztcblxuICBASW5wdXQoKVxuICB2YWx1ZTogbnVtYmVyID0gMDtcblxuICBASW5wdXQoKVxuICBzdWNjZXNzQ29uZGl0aW9uOiAncG9zaXRpdmUnIHwgJ25lZ2F0aXZlJyA9ICdwb3NpdGl2ZSc7XG5cbiAgZ2V0Q2xhc3NlcygpIHtcbiAgICBjb25zdCBjb25kaXRpb25hbENsYXNzID1cbiAgICAgIHRoaXMudmFsdWUgPT09IDBcbiAgICAgICAgPyAnJ1xuICAgICAgICA6IHRoaXMuc3VjY2Vzc0NvbmRpdGlvbiA9PT0gJ3Bvc2l0aXZlJ1xuICAgICAgICA/IHRoaXMudmFsdWUgPiAwXG4gICAgICAgICAgPyAnc3VjY2VzcydcbiAgICAgICAgICA6ICdkYW5nZXInXG4gICAgICAgIDogdGhpcy52YWx1ZSA8IDBcbiAgICAgICAgPyAnc3VjY2VzcydcbiAgICAgICAgOiAnZGFuZ2VyJztcblxuICAgIHJldHVybiAndHJlbmQgJyArIGNvbmRpdGlvbmFsQ2xhc3M7XG4gIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBUcmVuZENvbXBvbmVudCB7XG4gIGV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVUcmVuZChcbiAgICBjdXJyZW50VmFsdWU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgcHJldmlvdXNWYWx1ZTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAoY3VycmVudFZhbHVlID09IG51bGwgfHwgcHJldmlvdXNWYWx1ZSA9PSBudWxsIHx8IHByZXZpb3VzVmFsdWUgPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudFZhbHVlIC8gcHJldmlvdXNWYWx1ZSAtIDE7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlUGVyY2VudGFnZVRyZW5kKFxuICAgIGN1cnJlbnRWYWx1ZTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICBwcmV2aW91c1ZhbHVlOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLFxuICApOiBudW1iZXIge1xuICAgIGlmIChjdXJyZW50VmFsdWUgPT0gbnVsbCB8fCBwcmV2aW91c1ZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudFZhbHVlIC0gcHJldmlvdXNWYWx1ZTtcbiAgfVxufVxuIiwiPHNwYW4gW2NsYXNzXT1cImdldENsYXNzZXMoKVwiPlxuICA8cml2LWljb25cbiAgICBjbGFzcz1cImljb25cIlxuICAgIFtuYW1lXT1cIlxuICAgICAgdmFsdWUgPT09IDAgPyAnQXJyb3dSaWdodCcgOiB2YWx1ZSA+IDAgPyAnVHJlbmRpbmdVcCcgOiAnVHJlbmRpbmdEb3duJ1xuICAgIFwiXG4gICAgW3NpemVdPVwiMTZcIlxuICA+PC9yaXYtaWNvbj5cbiAgPHNwYW4+e3sgbGFiZWwgfX08L3NwYW4+XG48L3NwYW4+XG4iXX0=