@rivet-health/design-system 40.44.3 → 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 -18772
  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 -477
  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 -178
  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 -94
  54. package/esm2022/lib/layout/card/card-media.component.mjs +0 -70
  55. package/esm2022/lib/layout/card/card.component.mjs +0 -291
  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 -38
  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 -54
  204. package/lib/layout/card/card-media.component.d.ts +0 -43
  205. package/lib/layout/card/card.component.d.ts +0 -215
  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,477 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ContentChild, ElementRef, Input, Output, ViewChild, } from '@angular/core';
2
- import { timeDay, timeMonth, timeSunday, timeWeek, timeYear } from 'd3-time';
3
- import { BehaviorSubject, Subject, combineLatest, distinctUntilChanged, filter, map, merge, scan, shareReplay, skipUntil, startWith, } from 'rxjs';
4
- import { DatePipe } from '../../format/pipes/date.pipe';
5
- import { LocalStorage } from '../../util/local-storage';
6
- import { CalendarComponent } from '../calendar/calendar.component';
7
- import { InputLabelComponent } from '../input-label/input-label.component';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/common";
10
- import * as i2 from "../button/button.component";
11
- import * as i3 from "../calendar/calendar.component";
12
- import * as i4 from "../../overlay/callout/callout.component";
13
- import * as i5 from "../../visualization/highlight/highlight.component";
14
- import * as i6 from "../../icon/icon.component";
15
- import * as i7 from "../input-label/input-label.component";
16
- import * as i8 from "../../overlay/overlay.directive";
17
- import * as i9 from "../simple-select/simple-select.component";
18
- import * as i10 from "../../overlay/callout/tooltip/tooltip.directive";
19
- import * as i11 from "../simple-select/option-group.pipe";
20
- const timeQuarter = timeMonth.every(3);
21
- // TODO: once we upgrade to Angular 16, this component can be cleaned up with
22
- // signals instead of RxJS.
23
- // https://www.notion.so/rivet/Resolve-TODOs-after-Angular-upgrade-1f2667eb2a3180b79f6ad92a7e576f08
24
- export class DateRangeComponent extends InputLabelComponent {
25
- constructor() {
26
- super(...arguments);
27
- this.TODAY = new Date();
28
- this.STORAGE_KEY = 'date-range.default';
29
- this.showPresets$ = new BehaviorSubject(true);
30
- this.min$ = new BehaviorSubject(CalendarComponent.defaultMin);
31
- this.max$ = new BehaviorSubject(CalendarComponent.defaultMax);
32
- this.value$ = new BehaviorSubject(undefined);
33
- this.distinctValue$ = this.value$.pipe(distinctUntilChanged((previous, current) => previous?.[0].valueOf() === current?.[0].valueOf() &&
34
- previous?.[1].valueOf() === current?.[1].valueOf()), shareReplay({ refCount: true, bufferSize: 1 }));
35
- this.placeholder$ = new BehaviorSubject('Select date range');
36
- this.disabled$ = new BehaviorSubject(false);
37
- this.alternativePresetList$ = new BehaviorSubject([]);
38
- this.open$ = new BehaviorSubject(false);
39
- this.userSelectedPreset$ = new Subject();
40
- this.userSelectedDate$ = new Subject();
41
- this.selectedValue$ = merge(this.distinctValue$, this.userSelectedDate$.pipe(scan((previous, date) => {
42
- if (previous instanceof Date && date instanceof Date) {
43
- if (date.valueOf() >= previous.valueOf()) {
44
- const pair = [previous, date];
45
- return pair;
46
- }
47
- }
48
- return date;
49
- })), this.userSelectedPreset$.pipe(filter((preset) => preset !== null), map(preset => preset.dates))).pipe(shareReplay({ refCount: true, bufferSize: 1 }));
50
- this.filteredPresetOptions$ = combineLatest([
51
- this.min$,
52
- this.max$,
53
- this.alternativePresetList$,
54
- ]).pipe(map(([min, max, alternativePresetList]) => {
55
- const optionsFilteredOnMinMax = DateRangeComponent.Presets.filter(p => p.dates[0].valueOf() >= min.valueOf() &&
56
- p.dates[1].valueOf() <= max.valueOf());
57
- if (alternativePresetList.length == 0) {
58
- return optionsFilteredOnMinMax;
59
- }
60
- else {
61
- const optionsFilteredOnAlternativePresetList = optionsFilteredOnMinMax.filter(p => alternativePresetList.includes(p.id));
62
- return optionsFilteredOnAlternativePresetList;
63
- }
64
- }), shareReplay({ refCount: true, bufferSize: 1 }));
65
- this.selectedPreset$ = combineLatest([
66
- this.selectedValue$,
67
- this.userSelectedPreset$.pipe(startWith(null)),
68
- ]).pipe(map(([selectedValue, userSelectedPreset]) => {
69
- if (selectedValue instanceof Array) {
70
- const options = DateRangeComponent.Presets.filter(preset => preset.dates[0].valueOf() === selectedValue[0].valueOf() &&
71
- preset.dates[1].valueOf() === selectedValue[1].valueOf());
72
- if (options.length) {
73
- // Some date ranges match multiple presets, e.g. on Jan 19th, a
74
- // selected date range of Jan 1-19 would correspond to "this month
75
- // so far," "this quarter so far," and "this year so far." We'll
76
- // use the user's most recent manual selection as a tie breaker
77
- // where possible.
78
- const mostRecent = options.find(option => option.id === userSelectedPreset?.id);
79
- if (mostRecent)
80
- return mostRecent;
81
- return options[0];
82
- }
83
- }
84
- return null;
85
- }));
86
- this.favoritePresetIds$ = new LocalStorage(this.STORAGE_KEY, []);
87
- this.favoritePresets$ = combineLatest([
88
- this.favoritePresetIds$,
89
- this.filteredPresetOptions$,
90
- this.alternativePresetList$,
91
- ]).pipe(map(([ids, presets, alternativePresetList]) => {
92
- const favoritePresets = ids
93
- .map(id => presets.find(preset => preset.id === id))
94
- .filter((p) => p !== undefined);
95
- if (alternativePresetList.length == 0) {
96
- return favoritePresets;
97
- }
98
- else {
99
- const favoritesFilteredOnAlternativePresetList = favoritePresets.filter(p => alternativePresetList.includes(p.id));
100
- return favoritesFilteredOnAlternativePresetList;
101
- }
102
- }), shareReplay({ refCount: true, bufferSize: 1 }));
103
- this.userLeftActiveYearMonth$ = new Subject();
104
- this.userRightActiveYearMonth$ = new Subject();
105
- this.leftMin$ = this.min$.pipe(shareReplay({ refCount: true, bufferSize: 1 }));
106
- this.leftMax$ = this.max$.pipe(map(max => timeDay.offset(timeMonth.floor(max), -1)), shareReplay({ refCount: true, bufferSize: 1 }));
107
- this.rightMax$ = this.max$.pipe(shareReplay({ refCount: true, bufferSize: 1 }));
108
- this.leftActiveYearMonth$ = combineLatest([
109
- this.leftMax$,
110
- merge(this.userLeftActiveYearMonth$.pipe(startWith(timeMonth.floor(this.TODAY))), this.userSelectedPreset$.pipe(filter((preset) => preset !== null), map(preset => timeMonth.floor(preset.dates[0]))), this.distinctValue$.pipe(filter((v) => v !== undefined), map(v => timeMonth.floor(v[0])))),
111
- ]).pipe(map(([leftMax, left]) => {
112
- if (left.valueOf() >= leftMax.valueOf())
113
- return timeMonth.floor(leftMax);
114
- else
115
- return left;
116
- }), shareReplay({ refCount: true, bufferSize: 1 }));
117
- this.rightActiveYearMonth$ = combineLatest([
118
- this.leftActiveYearMonth$,
119
- merge(this.userRightActiveYearMonth$.pipe(startWith(timeMonth.ceil(this.TODAY))), this.userSelectedPreset$.pipe(filter((preset) => preset !== null), map(preset => timeMonth.floor(preset.dates[1]))), this.distinctValue$.pipe(filter((v) => v !== undefined), map(v => timeMonth.floor(v[1])))),
120
- this.rightMax$,
121
- ]).pipe(map(([left, userRight, rightMax$]) => {
122
- if (left.valueOf() >= userRight.valueOf())
123
- return timeMonth.floor(timeMonth.offset(left, 1));
124
- else if (userRight.valueOf() >= rightMax$.valueOf())
125
- return timeMonth.floor(rightMax$);
126
- else
127
- return userRight;
128
- }), shareReplay({ refCount: true, bufferSize: 1 }));
129
- this.rightMin$ = this.leftActiveYearMonth$.pipe(map(left => timeMonth.floor(timeMonth.offset(left, 1))), shareReplay({ refCount: true, bufferSize: 1 }));
130
- this.leftOmitRange$ = this.rightActiveYearMonth$.pipe(map(rightActiveYearMonth => {
131
- const first = timeMonth.floor(rightActiveYearMonth);
132
- const last = timeDay.offset(timeMonth.floor(timeMonth.offset(rightActiveYearMonth, 1)), -1);
133
- return [first, last];
134
- }), shareReplay({ refCount: true, bufferSize: 1 }));
135
- this.userInteracted$ = merge(this.userSelectedDate$, this.userSelectedPreset$);
136
- this.valueChange = this.selectedValue$.pipe(skipUntil(merge(this.userInteracted$, this.selectedValue$.pipe(filter(v => v !== undefined)))), filter((v) => !(v instanceof Date)), distinctUntilChanged((previous, current) => previous?.[0].valueOf() === current?.[0].valueOf() &&
137
- previous?.[1].valueOf() === current?.[1].valueOf()), shareReplay({ refCount: true, bufferSize: 1 }));
138
- this.displayValue$ = this.valueChange.pipe(map(v => {
139
- if (v) {
140
- return v.map(date => new DatePipe().transform(date)).join(' — ');
141
- }
142
- return undefined;
143
- }), shareReplay({ refCount: true, bufferSize: 1 }));
144
- }
145
- set showPresets(v) {
146
- this.showPresets$.next(v);
147
- }
148
- get showPresets() {
149
- return this.showPresets$.getValue();
150
- }
151
- set min(v) {
152
- this.min$.next(v);
153
- }
154
- get min() {
155
- return this.min$.getValue();
156
- }
157
- set max(v) {
158
- this.max$.next(v);
159
- }
160
- get max() {
161
- return this.max$.getValue();
162
- }
163
- set value(v) {
164
- this.value$.next(v);
165
- }
166
- get value() {
167
- return this.value$.getValue();
168
- }
169
- set placeholder(v) {
170
- this.placeholder$.next(v);
171
- }
172
- get placeholder() {
173
- return this.placeholder$.getValue();
174
- }
175
- set disabled(v) {
176
- this.disabled$.next(v);
177
- }
178
- get disabled() {
179
- return this.disabled$.getValue();
180
- }
181
- getTrigger() {
182
- return (this.customTriggerButton?.nativeElement ??
183
- this.standardTriggerButton?.nativeElement);
184
- }
185
- set alternativePresetList(v) {
186
- this.alternativePresetList$.next(v);
187
- }
188
- get alternativePresetList() {
189
- return this.alternativePresetList$.getValue();
190
- }
191
- setFavorite(preset, favorite) {
192
- const ids = new Set(this.favoritePresetIds$.getValue());
193
- if (favorite) {
194
- ids.add(preset.id);
195
- }
196
- else {
197
- ids.delete(preset.id);
198
- }
199
- this.favoritePresetIds$.next([...ids]);
200
- }
201
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DateRangeComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
202
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DateRangeComponent, selector: "riv-date-range", inputs: { showPresets: "showPresets", min: "min", max: "max", value: "value", placeholder: "placeholder", disabled: "disabled", alternativePresetList: "alternativePresetList" }, outputs: { valueChange: "valueChange" }, queries: [{ propertyName: "triggerTemplate", first: true, predicate: ["trigger"], descendants: true }], viewQueries: [{ propertyName: "customTriggerButton", first: true, predicate: ["customTriggerButton"], descendants: true, read: ElementRef }, { propertyName: "standardTriggerButton", first: true, predicate: ["standardTriggerButton"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"triggerTemplate; else standardTrigger\">\n <button\n #customTriggerButton\n (click)=\"open$.next(true)\"\n [disabled]=\"disabled$ | async\"\n [attr.aria-disabled]=\"(disabled$ | async) ? 'true' : null\"\n type=\"button\"\n >\n <ng-container\n [ngTemplateOutlet]=\"triggerTemplate\"\n [ngTemplateOutletContext]=\"{ open: open$ | async }\"\n ></ng-container>\n </button>\n</ng-container>\n<ng-template #standardTrigger>\n <riv-input-label\n [label]=\"label\"\n [help]=\"help\"\n [required]=\"required\"\n [state]=\"state\"\n [errorMessage]=\"errorMessage\"\n [labelActionText]=\"labelActionText\"\n (labelAction)=\"labelAction.emit($event)\"\n >\n <button\n #standardTriggerButton\n class=\"trigger\"\n [class.warning]=\"state === 'warning'\"\n [class.error]=\"state === 'error'\"\n (click)=\"open$.next(true)\"\n [disabled]=\"disabled$ | async\"\n [attr.aria-disabled]=\"(disabled$ | async) ? 'true' : null\"\n type=\"button\"\n >\n <ng-container\n *ngIf=\"displayValue$ | async; else placeholderValue; let display\"\n >\n <span class=\"value\">{{ display }}</span>\n </ng-container>\n <ng-template #placeholderValue>\n <span class=\"value placeholder\">{{ placeholder$ | async }}</span>\n </ng-template>\n <span class=\"chevron\">\n <riv-icon [name]=\"'Calendar'\" [size]=\"16\"></riv-icon>\n </span>\n </button>\n </riv-input-label>\n</ng-template>\n\n<ng-template\n #self\n [ngTemplateOutlet]=\"self\"\n let-inputValue\n [ngTemplateOutletContext]=\"{ $implicit: (distinctValue$ | async) }\"\n>\n <ng-container *ngIf=\"open$ | async\">\n <riv-callout\n *riv-overlay\n [anchor]=\"getTrigger()\"\n [showCaret]=\"false\"\n [theme]=\"'light'\"\n [allowedPositions]=\"[\n 'top-left',\n 'top-right',\n 'bottom-right',\n 'bottom-left'\n ]\"\n [preferredPosition]=\"'bottom-right'\"\n (close)=\"open$.next(false); userSelectedDate$.next(inputValue)\"\n >\n <div class=\"content\" [class.include-preset]=\"showPresets\">\n <div *ngIf=\"showPresets\" class=\"presets\">\n <riv-simple-select\n [label]=\"'Date presets'\"\n [filterabilityOptions]=\"{ enabled: true, placeholder: 'Search' }\"\n [orderBy]=\"'source'\"\n [optionGroups]=\"\n (filteredPresetOptions$ | async) ?? [] | rivOptionGroup\n \"\n [selectedOption]=\"selectedPreset$ | async\"\n (selectedOptionChange)=\"userSelectedPreset$.next($event)\"\n >\n <ng-template #option let-node=\"node\">\n <ng-template\n #self\n [ngTemplateOutlet]=\"self\"\n let-isFavorite\n [ngTemplateOutletContext]=\"{\n $implicit: (favoritePresetIds$ | async)?.includes(node.id)\n }\"\n >\n <div class=\"preset\" [class.favorite]=\"isFavorite\">\n <div class=\"description\">\n <riv-highlight\n class=\"title\"\n [text]=\"node.title\"\n [indices]=\"node.titleHighlightIndices || []\"\n ></riv-highlight>\n <riv-highlight\n class=\"subtitle\"\n [text]=\"node.subtitle\"\n [indices]=\"node.subtitleHighlightIndices || []\"\n ></riv-highlight>\n </div>\n <button\n (click)=\"\n setFavorite(node, !isFavorite); $event.stopPropagation()\n \"\n type=\"button\"\n >\n <riv-icon\n [name]=\"isFavorite ? 'HeartActive' : 'Heart'\"\n [size]=\"16\"\n [rivTooltip]=\"'Mark as favorite'\"\n ></riv-icon>\n </button>\n </div>\n </ng-template>\n </ng-template>\n </riv-simple-select>\n <ng-template\n #self\n [ngTemplateOutlet]=\"self\"\n let-favorites\n [ngTemplateOutletContext]=\"{ $implicit: favoritePresets$ | async }\"\n >\n <riv-input-label *ngIf=\"favorites.length\" [label]=\"'Favorites'\">\n <div class=\"shortcuts\">\n <button\n *ngFor=\"let favorite of favorites\"\n class=\"shortcut\"\n [class.active]=\"(selectedPreset$ | async)?.id === favorite.id\"\n (click)=\"userSelectedPreset$.next(favorite)\"\n type=\"button\"\n >\n <span class=\"title\">{{ favorite.title }}</span>\n <button\n (click)=\"setFavorite(favorite, false)\"\n [rivTooltip]=\"'Remove favorite'\"\n type=\"button\"\n >\n <riv-icon [name]=\"'HeartActive'\" [size]=\"16\"></riv-icon>\n </button>\n </button>\n </div>\n </riv-input-label>\n </ng-template>\n </div>\n\n <div class=\"calendars\">\n <riv-calendar\n class=\"left\"\n [activeYearMonth]=\"(leftActiveYearMonth$ | async) || TODAY\"\n (activeYearMonthChange)=\"userLeftActiveYearMonth$.next($event)\"\n [displayMin]=\"(min$ | async) || TODAY\"\n [displayMax]=\"(max$ | async) || TODAY\"\n [selectableMin]=\"(leftMin$ | async) || TODAY\"\n [selectableMax]=\"(leftMax$ | async) || TODAY\"\n [omitRange]=\"(leftOmitRange$ | async) || [TODAY, TODAY]\"\n [selectedValue]=\"(selectedValue$ | async) || TODAY\"\n (dateSelect)=\"userSelectedDate$.next($event)\"\n ></riv-calendar>\n <riv-calendar\n class=\"right\"\n [activeYearMonth]=\"(rightActiveYearMonth$ | async) || TODAY\"\n (activeYearMonthChange)=\"userRightActiveYearMonth$.next($event)\"\n [displayMin]=\"(min$ | async) || TODAY\"\n [displayMax]=\"(max$ | async) || TODAY\"\n [selectableMin]=\"(rightMin$ | async) || TODAY\"\n [selectableMax]=\"(rightMax$ | async) || TODAY\"\n [selectedValue]=\"(selectedValue$ | async) || TODAY\"\n (dateSelect)=\"userSelectedDate$.next($event)\"\n ></riv-calendar>\n </div>\n\n <footer class=\"buttons\">\n <button\n rivButton\n [size]=\"'small'\"\n [variant]=\"'ghost'\"\n (click)=\"userSelectedDate$.next(undefined)\"\n type=\"button\"\n >\n Clear\n </button>\n <button\n rivButton\n [size]=\"'small'\"\n [variant]=\"'primary'\"\n (click)=\"open$.next(false)\"\n type=\"button\"\n >\n Done\n </button>\n </footer>\n </div>\n </riv-callout>\n </ng-container>\n</ng-template>\n", styles: [".trigger{width:100%;border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);display:flex;gap:var(--size-small);background-color:var(--surface-light-0);cursor:pointer}.trigger:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.trigger:disabled{color:var(--type-light-disabled);background-color:var(--surface-light-1)}.value{font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small);flex-grow:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:pre}.value.placeholder{color:var(--type-light-low-contrast)}.chevron{display:flex;justify-content:center;align-items:center;padding:var(--size-xsmall) calc(var(--base-grid-size) * 1.5)}.trigger.warning{border-color:var(--surface-dark-caution)}.trigger.error{border-color:var(--surface-dark-danger);box-shadow:inset 0 0 0 var(--border-width-large) var(--surface-dark-danger)}.content{display:inline-grid;grid-template-rows:1fr auto}.content.include-preset{grid-template-columns:calc(var(--base-grid-size) * 50) 1fr 1fr}.presets{grid-area:1 / 1 / 3 / 2;background-color:var(--surface-light-1);padding:var(--size-xlarge) var(--size-large);border-right:var(--border-width) solid var(--border-light);display:flex;flex-direction:column;gap:var(--size-medium)}.preset{display:flex;transition:background-color var(--short-transition)}.preset:hover{background-color:var(--surface-light-2)}.preset button{color:transparent;transition:color var(--short-transition);padding:var(--size-medium) var(--size-large) var(--size-medium) var(--size-small);cursor:pointer}.preset:hover button{color:var(--type-light-low-contrast)}.preset button:hover{color:var(--type-light-high-contrast)}.preset.favorite button{color:var(--type-light-link)}.preset .description{flex-grow:1;padding:var(--size-medium) var(--size-small) var(--size-medium) var(--size-medium)}.preset .title{display:block;font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-1)}.preset .subtitle{display:block;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-1);color:var(--type-light-low-contrast)}.shortcuts{display:flex;flex-direction:column;gap:var(--size-xsmall);overflow-y:auto}.shortcut{display:flex;align-items:center;padding:var(--size-small) var(--size-small) var(--size-small) var(--size-medium);gap:var(--size-small);border-radius:var(--border-radius-small);transition:background-color var(--short-transition);cursor:pointer}.shortcut:hover{background-color:var(--black-20)}.shortcut.active{background-color:var(--baloo-05)}.shortcut .title{flex-grow:1;text-align:left;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.shortcut button{color:transparent;transition:color var(--short-transition);cursor:pointer}.shortcut:hover button{color:var(--type-light-link)}.calendars{grid-column:2 / 4;display:grid;grid-template-columns:subgrid;grid-template-rows:subgrid;padding:var(--size-large)}.left{grid-area:1 / 1 / 2 / 2;padding-right:var(--size-large);border-right:var(--border-width) solid var(--border-light)}.right{padding-left:var(--size-large);grid-area:1 / 2 / 2 / 3}.buttons{grid-area:2 / 2 / 3 / 4;padding:var(--size-small);display:flex;justify-content:space-between}\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.ButtonComponent, selector: "[rivButton]", inputs: ["locked", "disabled", "loading", "full", "size", "variant", "icon", "iconPosition", "current"] }, { kind: "component", type: i3.CalendarComponent, selector: "riv-calendar", inputs: ["activeYearMonth", "displayMin", "displayMax", "selectableMin", "selectableMax", "omitRange", "selectedValue"], outputs: ["activeYearMonthChange", "dateSelect"] }, { kind: "component", type: i4.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i5.HighlightComponent, selector: "riv-highlight", inputs: ["text", "indices"] }, { kind: "component", type: i6.IconComponent, selector: "riv-icon", inputs: ["name", "fillColor", "size", "customSize", "strokeWidth"] }, { kind: "component", type: i7.InputLabelComponent, selector: "riv-input-label", inputs: ["label", "help", "required", "labelActionText", "errorMessage", "state"], outputs: ["labelAction"] }, { kind: "directive", type: i8.OverlayDirective, selector: "[riv-overlay]" }, { kind: "component", type: i9.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: i10.TooltipDirective, selector: "[rivTooltip]", inputs: ["rivTooltip", "rivTooltipTheme", "rivTooltipMaxWidth", "rivTooltipPreferredPosition", "rivTooltipAnchor", "rivTooltipCloseDelay", "rivTooltipOpenDelay", "rivTooltipGracePeriod"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i11.OptionGroupPipe, name: "rivOptionGroup" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
203
- }
204
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DateRangeComponent, decorators: [{
205
- type: Component,
206
- args: [{ selector: 'riv-date-range', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"triggerTemplate; else standardTrigger\">\n <button\n #customTriggerButton\n (click)=\"open$.next(true)\"\n [disabled]=\"disabled$ | async\"\n [attr.aria-disabled]=\"(disabled$ | async) ? 'true' : null\"\n type=\"button\"\n >\n <ng-container\n [ngTemplateOutlet]=\"triggerTemplate\"\n [ngTemplateOutletContext]=\"{ open: open$ | async }\"\n ></ng-container>\n </button>\n</ng-container>\n<ng-template #standardTrigger>\n <riv-input-label\n [label]=\"label\"\n [help]=\"help\"\n [required]=\"required\"\n [state]=\"state\"\n [errorMessage]=\"errorMessage\"\n [labelActionText]=\"labelActionText\"\n (labelAction)=\"labelAction.emit($event)\"\n >\n <button\n #standardTriggerButton\n class=\"trigger\"\n [class.warning]=\"state === 'warning'\"\n [class.error]=\"state === 'error'\"\n (click)=\"open$.next(true)\"\n [disabled]=\"disabled$ | async\"\n [attr.aria-disabled]=\"(disabled$ | async) ? 'true' : null\"\n type=\"button\"\n >\n <ng-container\n *ngIf=\"displayValue$ | async; else placeholderValue; let display\"\n >\n <span class=\"value\">{{ display }}</span>\n </ng-container>\n <ng-template #placeholderValue>\n <span class=\"value placeholder\">{{ placeholder$ | async }}</span>\n </ng-template>\n <span class=\"chevron\">\n <riv-icon [name]=\"'Calendar'\" [size]=\"16\"></riv-icon>\n </span>\n </button>\n </riv-input-label>\n</ng-template>\n\n<ng-template\n #self\n [ngTemplateOutlet]=\"self\"\n let-inputValue\n [ngTemplateOutletContext]=\"{ $implicit: (distinctValue$ | async) }\"\n>\n <ng-container *ngIf=\"open$ | async\">\n <riv-callout\n *riv-overlay\n [anchor]=\"getTrigger()\"\n [showCaret]=\"false\"\n [theme]=\"'light'\"\n [allowedPositions]=\"[\n 'top-left',\n 'top-right',\n 'bottom-right',\n 'bottom-left'\n ]\"\n [preferredPosition]=\"'bottom-right'\"\n (close)=\"open$.next(false); userSelectedDate$.next(inputValue)\"\n >\n <div class=\"content\" [class.include-preset]=\"showPresets\">\n <div *ngIf=\"showPresets\" class=\"presets\">\n <riv-simple-select\n [label]=\"'Date presets'\"\n [filterabilityOptions]=\"{ enabled: true, placeholder: 'Search' }\"\n [orderBy]=\"'source'\"\n [optionGroups]=\"\n (filteredPresetOptions$ | async) ?? [] | rivOptionGroup\n \"\n [selectedOption]=\"selectedPreset$ | async\"\n (selectedOptionChange)=\"userSelectedPreset$.next($event)\"\n >\n <ng-template #option let-node=\"node\">\n <ng-template\n #self\n [ngTemplateOutlet]=\"self\"\n let-isFavorite\n [ngTemplateOutletContext]=\"{\n $implicit: (favoritePresetIds$ | async)?.includes(node.id)\n }\"\n >\n <div class=\"preset\" [class.favorite]=\"isFavorite\">\n <div class=\"description\">\n <riv-highlight\n class=\"title\"\n [text]=\"node.title\"\n [indices]=\"node.titleHighlightIndices || []\"\n ></riv-highlight>\n <riv-highlight\n class=\"subtitle\"\n [text]=\"node.subtitle\"\n [indices]=\"node.subtitleHighlightIndices || []\"\n ></riv-highlight>\n </div>\n <button\n (click)=\"\n setFavorite(node, !isFavorite); $event.stopPropagation()\n \"\n type=\"button\"\n >\n <riv-icon\n [name]=\"isFavorite ? 'HeartActive' : 'Heart'\"\n [size]=\"16\"\n [rivTooltip]=\"'Mark as favorite'\"\n ></riv-icon>\n </button>\n </div>\n </ng-template>\n </ng-template>\n </riv-simple-select>\n <ng-template\n #self\n [ngTemplateOutlet]=\"self\"\n let-favorites\n [ngTemplateOutletContext]=\"{ $implicit: favoritePresets$ | async }\"\n >\n <riv-input-label *ngIf=\"favorites.length\" [label]=\"'Favorites'\">\n <div class=\"shortcuts\">\n <button\n *ngFor=\"let favorite of favorites\"\n class=\"shortcut\"\n [class.active]=\"(selectedPreset$ | async)?.id === favorite.id\"\n (click)=\"userSelectedPreset$.next(favorite)\"\n type=\"button\"\n >\n <span class=\"title\">{{ favorite.title }}</span>\n <button\n (click)=\"setFavorite(favorite, false)\"\n [rivTooltip]=\"'Remove favorite'\"\n type=\"button\"\n >\n <riv-icon [name]=\"'HeartActive'\" [size]=\"16\"></riv-icon>\n </button>\n </button>\n </div>\n </riv-input-label>\n </ng-template>\n </div>\n\n <div class=\"calendars\">\n <riv-calendar\n class=\"left\"\n [activeYearMonth]=\"(leftActiveYearMonth$ | async) || TODAY\"\n (activeYearMonthChange)=\"userLeftActiveYearMonth$.next($event)\"\n [displayMin]=\"(min$ | async) || TODAY\"\n [displayMax]=\"(max$ | async) || TODAY\"\n [selectableMin]=\"(leftMin$ | async) || TODAY\"\n [selectableMax]=\"(leftMax$ | async) || TODAY\"\n [omitRange]=\"(leftOmitRange$ | async) || [TODAY, TODAY]\"\n [selectedValue]=\"(selectedValue$ | async) || TODAY\"\n (dateSelect)=\"userSelectedDate$.next($event)\"\n ></riv-calendar>\n <riv-calendar\n class=\"right\"\n [activeYearMonth]=\"(rightActiveYearMonth$ | async) || TODAY\"\n (activeYearMonthChange)=\"userRightActiveYearMonth$.next($event)\"\n [displayMin]=\"(min$ | async) || TODAY\"\n [displayMax]=\"(max$ | async) || TODAY\"\n [selectableMin]=\"(rightMin$ | async) || TODAY\"\n [selectableMax]=\"(rightMax$ | async) || TODAY\"\n [selectedValue]=\"(selectedValue$ | async) || TODAY\"\n (dateSelect)=\"userSelectedDate$.next($event)\"\n ></riv-calendar>\n </div>\n\n <footer class=\"buttons\">\n <button\n rivButton\n [size]=\"'small'\"\n [variant]=\"'ghost'\"\n (click)=\"userSelectedDate$.next(undefined)\"\n type=\"button\"\n >\n Clear\n </button>\n <button\n rivButton\n [size]=\"'small'\"\n [variant]=\"'primary'\"\n (click)=\"open$.next(false)\"\n type=\"button\"\n >\n Done\n </button>\n </footer>\n </div>\n </riv-callout>\n </ng-container>\n</ng-template>\n", styles: [".trigger{width:100%;border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);display:flex;gap:var(--size-small);background-color:var(--surface-light-0);cursor:pointer}.trigger:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.trigger:disabled{color:var(--type-light-disabled);background-color:var(--surface-light-1)}.value{font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small);flex-grow:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:pre}.value.placeholder{color:var(--type-light-low-contrast)}.chevron{display:flex;justify-content:center;align-items:center;padding:var(--size-xsmall) calc(var(--base-grid-size) * 1.5)}.trigger.warning{border-color:var(--surface-dark-caution)}.trigger.error{border-color:var(--surface-dark-danger);box-shadow:inset 0 0 0 var(--border-width-large) var(--surface-dark-danger)}.content{display:inline-grid;grid-template-rows:1fr auto}.content.include-preset{grid-template-columns:calc(var(--base-grid-size) * 50) 1fr 1fr}.presets{grid-area:1 / 1 / 3 / 2;background-color:var(--surface-light-1);padding:var(--size-xlarge) var(--size-large);border-right:var(--border-width) solid var(--border-light);display:flex;flex-direction:column;gap:var(--size-medium)}.preset{display:flex;transition:background-color var(--short-transition)}.preset:hover{background-color:var(--surface-light-2)}.preset button{color:transparent;transition:color var(--short-transition);padding:var(--size-medium) var(--size-large) var(--size-medium) var(--size-small);cursor:pointer}.preset:hover button{color:var(--type-light-low-contrast)}.preset button:hover{color:var(--type-light-high-contrast)}.preset.favorite button{color:var(--type-light-link)}.preset .description{flex-grow:1;padding:var(--size-medium) var(--size-small) var(--size-medium) var(--size-medium)}.preset .title{display:block;font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-1)}.preset .subtitle{display:block;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-1);color:var(--type-light-low-contrast)}.shortcuts{display:flex;flex-direction:column;gap:var(--size-xsmall);overflow-y:auto}.shortcut{display:flex;align-items:center;padding:var(--size-small) var(--size-small) var(--size-small) var(--size-medium);gap:var(--size-small);border-radius:var(--border-radius-small);transition:background-color var(--short-transition);cursor:pointer}.shortcut:hover{background-color:var(--black-20)}.shortcut.active{background-color:var(--baloo-05)}.shortcut .title{flex-grow:1;text-align:left;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.shortcut button{color:transparent;transition:color var(--short-transition);cursor:pointer}.shortcut:hover button{color:var(--type-light-link)}.calendars{grid-column:2 / 4;display:grid;grid-template-columns:subgrid;grid-template-rows:subgrid;padding:var(--size-large)}.left{grid-area:1 / 1 / 2 / 2;padding-right:var(--size-large);border-right:var(--border-width) solid var(--border-light)}.right{padding-left:var(--size-large);grid-area:1 / 2 / 2 / 3}.buttons{grid-area:2 / 2 / 3 / 4;padding:var(--size-small);display:flex;justify-content:space-between}\n"] }]
207
- }], propDecorators: { showPresets: [{
208
- type: Input
209
- }], min: [{
210
- type: Input
211
- }], max: [{
212
- type: Input
213
- }], value: [{
214
- type: Input
215
- }], placeholder: [{
216
- type: Input
217
- }], disabled: [{
218
- type: Input
219
- }], triggerTemplate: [{
220
- type: ContentChild,
221
- args: ['trigger']
222
- }], customTriggerButton: [{
223
- type: ViewChild,
224
- args: ['customTriggerButton', { read: ElementRef }]
225
- }], standardTriggerButton: [{
226
- type: ViewChild,
227
- args: ['standardTriggerButton', { read: ElementRef }]
228
- }], alternativePresetList: [{
229
- type: Input
230
- }], valueChange: [{
231
- type: Output
232
- }] } });
233
- (function (DateRangeComponent) {
234
- const today = new Date();
235
- let PresetType;
236
- (function (PresetType) {
237
- PresetType["TODAY"] = "today";
238
- PresetType["YESTERDAY"] = "yesterday";
239
- PresetType["TOMORROW"] = "tomorrow";
240
- PresetType["THIS_WEEK"] = "this_week";
241
- PresetType["THIS_WEEK_SO_FAR"] = "this_week_so_far";
242
- PresetType["LAST_WEEK"] = "last_week";
243
- PresetType["NEXT_WEEK"] = "next_week";
244
- PresetType["THIS_MONTH"] = "this_month";
245
- PresetType["THIS_MONTH_SO_FAR"] = "this_month_so_far";
246
- PresetType["LAST_MONTH"] = "last_month";
247
- PresetType["NEXT_MONTH"] = "next_month";
248
- PresetType["THIS_QUARTER"] = "this_quarter";
249
- PresetType["THIS_QUARTER_SO_FAR"] = "this_quarter_so_far";
250
- PresetType["LAST_QUARTER"] = "last_quarter";
251
- PresetType["NEXT_QUARTER"] = "next_quarter";
252
- PresetType["THIS_YEAR"] = "this_year";
253
- PresetType["THIS_YEAR_SO_FAR"] = "this_year_so_far";
254
- PresetType["LAST_YEAR"] = "last_year";
255
- PresetType["NEXT_YEAR"] = "next_year";
256
- PresetType["LAST_7_DAYS"] = "last_7_days";
257
- PresetType["LAST_14_DAYS"] = "last_14_days";
258
- PresetType["LAST_30_DAYS"] = "last_30_days";
259
- PresetType["LAST_60_DAYS"] = "last_60_days";
260
- PresetType["LAST_90_DAYS"] = "last_90_days";
261
- PresetType["LAST_180_DAYS"] = "last_180_days";
262
- PresetType["LAST_365_DAYS"] = "last_365_days";
263
- })(PresetType = DateRangeComponent.PresetType || (DateRangeComponent.PresetType = {}));
264
- DateRangeComponent.Presets = [
265
- {
266
- id: PresetType.TODAY,
267
- title: 'Today',
268
- subtitle: 'Today from midnight until the current time',
269
- dates: [timeDay(), timeDay()],
270
- },
271
- {
272
- id: PresetType.YESTERDAY,
273
- title: 'Yesterday',
274
- subtitle: 'The previous 24 hour day',
275
- dates: [timeDay.offset(timeDay(), -1), timeDay.offset(timeDay(), -1)],
276
- },
277
- {
278
- id: PresetType.TOMORROW,
279
- title: 'Tomorrow',
280
- subtitle: 'The next 24 hour day',
281
- dates: [timeDay.offset(timeDay(), 1), timeDay.offset(timeDay(), 1)],
282
- },
283
- {
284
- id: PresetType.THIS_WEEK,
285
- title: 'This week',
286
- subtitle: 'The current calendar week',
287
- dates: [
288
- timeSunday.floor(today),
289
- timeDay.offset(timeSunday.ceil(today), -1),
290
- ],
291
- },
292
- {
293
- id: PresetType.THIS_WEEK_SO_FAR,
294
- title: 'This week so far',
295
- subtitle: 'The current calendar week up to now',
296
- dates: [timeSunday.floor(today), timeDay.floor(today)],
297
- },
298
- {
299
- id: PresetType.LAST_WEEK,
300
- title: 'Last week',
301
- subtitle: 'The previous calendar week',
302
- dates: [
303
- timeSunday.offset(timeWeek.floor(today), -1),
304
- timeDay.offset(timeSunday.offset(timeWeek.ceil(today), -1), -1),
305
- ],
306
- },
307
- {
308
- id: PresetType.NEXT_WEEK,
309
- title: 'Next week',
310
- subtitle: 'The next calendar week',
311
- dates: [
312
- timeSunday.offset(timeWeek.floor(today), 1),
313
- timeDay.offset(timeSunday.offset(timeWeek.ceil(today), 1), -1),
314
- ],
315
- },
316
- {
317
- id: PresetType.THIS_MONTH,
318
- title: 'This month',
319
- subtitle: 'The current calendar month',
320
- dates: [
321
- timeMonth.floor(today),
322
- timeDay.offset(timeMonth.ceil(today), -1),
323
- ],
324
- },
325
- {
326
- id: PresetType.THIS_MONTH_SO_FAR,
327
- title: 'This month so far',
328
- subtitle: 'The current calendar month up to now',
329
- dates: [timeMonth.floor(today), timeDay.floor(today)],
330
- },
331
- {
332
- id: PresetType.LAST_MONTH,
333
- title: 'Last month',
334
- subtitle: 'The previous calendar month',
335
- dates: [
336
- timeMonth.offset(timeMonth.floor(today), -1),
337
- timeDay.offset(timeMonth.offset(timeMonth.ceil(today), -1), -1),
338
- ],
339
- },
340
- {
341
- id: PresetType.NEXT_MONTH,
342
- title: 'Next month',
343
- subtitle: 'The next calendar month',
344
- dates: [
345
- timeMonth.offset(timeMonth.floor(today), 1),
346
- timeDay.offset(timeMonth.offset(timeMonth.ceil(today), 1), -1),
347
- ],
348
- },
349
- {
350
- id: PresetType.THIS_QUARTER,
351
- title: 'This quarter',
352
- subtitle: 'The current quarter',
353
- dates: [
354
- timeQuarter.floor(today),
355
- timeDay.offset(timeQuarter.ceil(today), -1),
356
- ],
357
- },
358
- {
359
- id: PresetType.THIS_QUARTER_SO_FAR,
360
- title: 'This quarter so far',
361
- subtitle: 'The current quarter up to now',
362
- dates: [timeQuarter.floor(today), timeDay.floor(today)],
363
- },
364
- {
365
- id: PresetType.LAST_QUARTER,
366
- title: 'Last quarter',
367
- subtitle: 'The previous full quarter',
368
- dates: [
369
- timeQuarter.offset(timeQuarter.floor(today), -1),
370
- timeDay.offset(timeQuarter.offset(timeQuarter.ceil(today), -1), -1),
371
- ],
372
- },
373
- {
374
- id: PresetType.NEXT_QUARTER,
375
- title: 'Next quarter',
376
- subtitle: 'The next full quarter',
377
- dates: [
378
- timeQuarter.offset(timeQuarter.floor(today), 1),
379
- timeDay.offset(timeQuarter.offset(timeQuarter.ceil(today), 1), -1),
380
- ],
381
- },
382
- {
383
- id: PresetType.THIS_YEAR,
384
- title: 'This year',
385
- subtitle: 'The current calendar year',
386
- dates: [timeYear.floor(today), timeDay.offset(timeYear.ceil(today), -1)],
387
- },
388
- {
389
- id: PresetType.THIS_YEAR_SO_FAR,
390
- title: 'This year so far',
391
- subtitle: 'The current calendar year up to now',
392
- dates: [timeYear.floor(today), timeDay.floor(today)],
393
- },
394
- {
395
- id: PresetType.LAST_YEAR,
396
- title: 'Last year',
397
- subtitle: 'The previous calendar year',
398
- dates: [
399
- timeYear.offset(timeYear.floor(today), -1),
400
- timeDay.offset(timeYear.offset(timeYear.ceil(today), -1), -1),
401
- ],
402
- },
403
- {
404
- id: PresetType.NEXT_YEAR,
405
- title: 'Next year',
406
- subtitle: 'The next calendar year',
407
- dates: [
408
- timeYear.offset(timeYear.floor(today), 1),
409
- timeDay.offset(timeYear.offset(timeYear.ceil(today), 1), -1),
410
- ],
411
- },
412
- {
413
- id: PresetType.LAST_7_DAYS,
414
- title: 'Last 7 days',
415
- subtitle: 'The previous 7 days before today',
416
- dates: [
417
- timeDay.floor(timeDay.offset(today, -8)),
418
- timeDay.floor(timeDay.offset(today, -1)),
419
- ],
420
- },
421
- {
422
- id: PresetType.LAST_14_DAYS,
423
- title: 'Last 14 days',
424
- subtitle: 'The previous 14 days before today',
425
- dates: [
426
- timeDay.floor(timeDay.offset(today, -15)),
427
- timeDay.floor(timeDay.offset(today, -1)),
428
- ],
429
- },
430
- {
431
- id: PresetType.LAST_30_DAYS,
432
- title: 'Last 30 days',
433
- subtitle: 'The previous 30 days before today',
434
- dates: [
435
- timeDay.floor(timeDay.offset(today, -31)),
436
- timeDay.floor(timeDay.offset(today, -1)),
437
- ],
438
- },
439
- {
440
- id: PresetType.LAST_60_DAYS,
441
- title: 'Last 60 days',
442
- subtitle: 'The previous 60 days before today',
443
- dates: [
444
- timeDay.floor(timeDay.offset(today, -61)),
445
- timeDay.floor(timeDay.offset(today, -1)),
446
- ],
447
- },
448
- {
449
- id: PresetType.LAST_90_DAYS,
450
- title: 'Last 90 days',
451
- subtitle: 'The previous 90 days before today',
452
- dates: [
453
- timeDay.floor(timeDay.offset(today, -91)),
454
- timeDay.floor(timeDay.offset(today, -1)),
455
- ],
456
- },
457
- {
458
- id: PresetType.LAST_180_DAYS,
459
- title: 'Last 180 days',
460
- subtitle: 'The previous 180 days before today',
461
- dates: [
462
- timeDay.floor(timeDay.offset(today, -181)),
463
- timeDay.floor(timeDay.offset(today, -1)),
464
- ],
465
- },
466
- {
467
- id: PresetType.LAST_365_DAYS,
468
- title: 'Last 365 days',
469
- subtitle: 'The previous 365 days before today',
470
- dates: [
471
- timeDay.floor(timeDay.offset(today, -366)),
472
- timeDay.floor(timeDay.offset(today, -1)),
473
- ],
474
- },
475
- ];
476
- })(DateRangeComponent || (DateRangeComponent = {}));
477
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9pbnB1dC9kYXRlLXJhbmdlL2RhdGUtcmFuZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvaW5wdXQvZGF0ZS1yYW5nZS9kYXRlLXJhbmdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDN0UsT0FBTyxFQUNMLGVBQWUsRUFFZixPQUFPLEVBQ1AsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sR0FBRyxFQUNILEtBQUssRUFDTCxJQUFJLEVBQ0osV0FBVyxFQUNYLFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FBQzNFLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFFLENBQUM7QUFFeEMsNkVBQTZFO0FBQzdFLDJCQUEyQjtBQUMzQixtR0FBbUc7QUFPbkcsTUFBTSxPQUFPLGtCQUFtQixTQUFR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QzNCLEtBQUssRUFBRSxjQUFjO1lBQ3JCLFFBQVEsRUFBRSxtQ0FBbUM7WUFDN0MsS0FBSyxFQUFFO2dCQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3pDO1NBQ0Y7UUFDRDtZQUNFLEVBQUUsRUFBRSxVQUFVLENBQUMsYUFBYTtZQUM1QixLQUFLLEVBQUUsZUFBZTtZQUN0QixRQUFRLEVBQUUsb0NBQW9DO1lBQzlDLEtBQUssRUFBRTtnQkFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN6QztTQUNGO1FBQ0Q7WUFDRSxFQUFFLEVBQUUsVUFBVSxDQUFDLGFBQWE7WUFDNUIsS0FBSyxFQUFFLGVBQWU7WUFDdEIsUUFBUSxFQUFFLG9DQUFvQztZQUM5QyxLQUFLLEVBQUU7Z0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDekM7U0FDRjtLQUNGLENBQUM7QUFDSixDQUFDLEVBM1BnQixrQkFBa0IsS0FBbEIsa0JBQWtCLFFBMlBsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0aW1lRGF5LCB0aW1lTW9udGgsIHRpbWVTdW5kYXksIHRpbWVXZWVrLCB0aW1lWWVhciB9IGZyb20gJ2QzLXRpbWUnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIG1lcmdlLFxuICBzY2FuLFxuICBzaGFyZVJlcGxheSxcbiAgc2tpcFVudGlsLFxuICBzdGFydFdpdGgsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9mb3JtYXQvcGlwZXMvZGF0ZS5waXBlJztcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gJy4uLy4uL3V0aWwvbG9jYWwtc3RvcmFnZSc7XG5pbXBvcnQgeyBDYWxlbmRhckNvbXBvbmVudCB9IGZyb20gJy4uL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJbnB1dExhYmVsQ29tcG9uZW50IH0gZnJvbSAnLi4vaW5wdXQtbGFiZWwvaW5wdXQtbGFiZWwuY29tcG9uZW50JztcbmNvbnN0IHRpbWVRdWFydGVyID0gdGltZU1vbnRoLmV2ZXJ5KDMpITtcblxuLy8gVE9ETzogb25jZSB3ZSB1cGdyYWRlIHRvIEFuZ3VsYXIgMTYsIHRoaXMgY29tcG9uZW50IGNhbiBiZSBjbGVhbmVkIHVwIHdpdGhcbi8vIHNpZ25hbHMgaW5zdGVhZCBvZiBSeEpTLlxuLy8gaHR0cHM6Ly93d3cubm90aW9uLnNvL3JpdmV0L1Jlc29sdmUtVE9ET3MtYWZ0ZXItQW5ndWxhci11cGdyYWRlLTFmMjY2N2ViMmEzMTgwYjc5ZjZhZDkyYTdlNTc2ZjA4XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtZGF0ZS1yYW5nZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXJhbmdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZS1yYW5nZS5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlUmFuZ2VDb21wb25lbnQgZXh0ZW5kcyBJbnB1dExhYmVsQ29tcG9uZW50IHtcbiAgcmVhZG9ubHkgVE9EQVkgPSBuZXcgRGF0ZSgpO1xuICByZWFkb25seSBTVE9SQUdFX0tFWSA9ICdkYXRlLXJhbmdlLmRlZmF1bHQnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd1ByZXNldHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgQElucHV0KClcbiAgc2V0IHNob3dQcmVzZXRzKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNob3dQcmVzZXRzJC5uZXh0KHYpO1xuICB9XG4gIGdldCBzaG93UHJlc2V0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93UHJlc2V0cyQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHJlYWRvbmx5IG1pbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGU+KENhbGVuZGFyQ29tcG9uZW50LmRlZmF1bHRNaW4pO1xuICBASW5wdXQoKVxuICBzZXQgbWluKHY6IERhdGUpIHtcbiAgICB0aGlzLm1pbiQubmV4dCh2KTtcbiAgfVxuICBnZXQgbWluKCk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLm1pbiQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHJlYWRvbmx5IG1heCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGU+KENhbGVuZGFyQ29tcG9uZW50LmRlZmF1bHRNYXgpO1xuICBASW5wdXQoKVxuICBzZXQgbWF4KHY6IERhdGUpIHtcbiAgICB0aGlzLm1heCQubmV4dCh2KTtcbiAgfVxuICBnZXQgbWF4KCk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLm1heCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHJlYWRvbmx5IHZhbHVlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8W0RhdGUsIERhdGVdIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBASW5wdXQoKVxuICBzZXQgdmFsdWUodjogW0RhdGUsIERhdGVdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy52YWx1ZSQubmV4dCh2KTtcbiAgfVxuICBnZXQgdmFsdWUoKTogW0RhdGUsIERhdGVdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZSQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHJlYWRvbmx5IGRpc3RpbmN0VmFsdWUkID0gdGhpcy52YWx1ZSQucGlwZShcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChcbiAgICAgIChwcmV2aW91cywgY3VycmVudCkgPT5cbiAgICAgICAgcHJldmlvdXM/LlswXS52YWx1ZU9mKCkgPT09IGN1cnJlbnQ/LlswXS52YWx1ZU9mKCkgJiZcbiAgICAgICAgcHJldmlvdXM/LlsxXS52YWx1ZU9mKCkgPT09IGN1cnJlbnQ/LlsxXS52YWx1ZU9mKCksXG4gICAgKSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IHBsYWNlaG9sZGVyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignU2VsZWN0IGRhdGUgcmFuZ2UnKTtcbiAgQElucHV0KClcbiAgc2V0IHBsYWNlaG9sZGVyKHY6IHN0cmluZykge1xuICAgIHRoaXMucGxhY2Vob2xkZXIkLm5leHQodik7XG4gIH1cbiAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGxhY2Vob2xkZXIkLmdldFZhbHVlKCk7XG4gIH1cblxuICByZWFkb25seSBkaXNhYmxlZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgQElucHV0KClcbiAgc2V0IGRpc2FibGVkKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGVkJC5uZXh0KHYpO1xuICB9XG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGQoJ3RyaWdnZXInKVxuICB0cmlnZ2VyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7IG9wZW46IGJvb2xlYW4gfT47XG5cbiAgQFZpZXdDaGlsZCgnY3VzdG9tVHJpZ2dlckJ1dHRvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICBjdXN0b21UcmlnZ2VyQnV0dG9uPzogRWxlbWVudFJlZjtcblxuICBAVmlld0NoaWxkKCdzdGFuZGFyZFRyaWdnZXJCdXR0b24nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgc3RhbmRhcmRUcmlnZ2VyQnV0dG9uPzogRWxlbWVudFJlZjtcblxuICBnZXRUcmlnZ2VyKCk6IEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jdXN0b21UcmlnZ2VyQnV0dG9uPy5uYXRpdmVFbGVtZW50ID8/XG4gICAgICB0aGlzLnN0YW5kYXJkVHJpZ2dlckJ1dHRvbj8ubmF0aXZlRWxlbWVudFxuICAgICk7XG4gIH1cblxuICByZWFkb25seSBhbHRlcm5hdGl2ZVByZXNldExpc3QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBEYXRlUmFuZ2VDb21wb25lbnQuUHJlc2V0VHlwZVtdXG4gID4oW10pO1xuICBASW5wdXQoKVxuICBzZXQgYWx0ZXJuYXRpdmVQcmVzZXRMaXN0KHY6IERhdGVSYW5nZUNvbXBvbmVudC5QcmVzZXRUeXBlW10pIHtcbiAgICB0aGlzLmFsdGVybmF0aXZlUHJlc2V0TGlzdCQubmV4dCh2KTtcbiAgfVxuICBnZXQgYWx0ZXJuYXRpdmVQcmVzZXRMaXN0KCk6IERhdGVSYW5nZUNvbXBvbmVudC5QcmVzZXRUeXBlW10ge1xuICAgIHJldHVybiB0aGlzLmFsdGVybmF0aXZlUHJlc2V0TGlzdCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHJlYWRvbmx5IG9wZW4kID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgcmVhZG9ubHkgdXNlclNlbGVjdGVkUHJlc2V0JCA9XG4gICAgbmV3IFN1YmplY3Q8RGF0ZVJhbmdlQ29tcG9uZW50LlByZXNldCB8IG51bGw+KCk7XG5cbiAgcmVhZG9ubHkgdXNlclNlbGVjdGVkRGF0ZSQgPSBuZXcgU3ViamVjdDxEYXRlIHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBzZWxlY3RlZFZhbHVlJDogT2JzZXJ2YWJsZTxEYXRlIHwgW0RhdGUsIERhdGVdIHwgdW5kZWZpbmVkPiA9IG1lcmdlKFxuICAgIHRoaXMuZGlzdGluY3RWYWx1ZSQsXG4gICAgdGhpcy51c2VyU2VsZWN0ZWREYXRlJC5waXBlKFxuICAgICAgc2NhbihcbiAgICAgICAgKHByZXZpb3VzOiBEYXRlIHwgW0RhdGUsIERhdGVdIHwgdW5kZWZpbmVkLCBkYXRlOiBEYXRlIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgRGF0ZSAmJiBkYXRlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgaWYgKGRhdGUudmFsdWVPZigpID49IHByZXZpb3VzLnZhbHVlT2YoKSkge1xuICAgICAgICAgICAgICBjb25zdCBwYWlyOiBbRGF0ZSwgRGF0ZV0gPSBbcHJldmlvdXMsIGRhdGVdO1xuICAgICAgICAgICAgICByZXR1cm4gcGFpcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICksXG4gICAgdGhpcy51c2VyU2VsZWN0ZWRQcmVzZXQkLnBpcGUoXG4gICAgICBmaWx0ZXIoKHByZXNldCk6IHByZXNldCBpcyBEYXRlUmFuZ2VDb21wb25lbnQuUHJlc2V0ID0+IHByZXNldCAhPT0gbnVsbCksXG4gICAgICBtYXAocHJlc2V0ID0+IHByZXNldC5kYXRlcyksXG4gICAgKSxcbiAgKS5waXBlKHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSkpO1xuXG4gIHJlYWRvbmx5IGZpbHRlcmVkUHJlc2V0T3B0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLm1pbiQsXG4gICAgdGhpcy5tYXgkLFxuICAgIHRoaXMuYWx0ZXJuYXRpdmVQcmVzZXRMaXN0JCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFttaW4sIG1heCwgYWx0ZXJuYXRpdmVQcmVzZXRMaXN0XSkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uc0ZpbHRlcmVkT25NaW5NYXggPSBEYXRlUmFuZ2VDb21wb25lbnQuUHJlc2V0cy5maWx0ZXIoXG4gICAgICAgIHAgPT5cbiAgICAgICAgICBwLmRhdGVzWzBdLnZhbHVlT2YoKSA+PSBtaW4udmFsdWVPZigpICYmXG4gICAgICAgICAgcC5kYXRlc1sxXS52YWx1ZU9mKCkgPD0gbWF4LnZhbHVlT2YoKSxcbiAgICAgICk7XG4gICAgICBpZiAoYWx0ZXJuYXRpdmVQcmVzZXRMaXN0Lmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zRmlsdGVyZWRPbk1pbk1heDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNGaWx0ZXJlZE9uQWx0ZXJuYXRpdmVQcmVzZXRMaXN0ID1cbiAgICAgICAgICBvcHRpb25zRmlsdGVyZWRPbk1pbk1heC5maWx0ZXIocCA9PlxuICAgICAgICAgICAgYWx0ZXJuYXRpdmVQcmVzZXRMaXN0LmluY2x1ZGVzKHAuaWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBvcHRpb25zRmlsdGVyZWRPbkFsdGVybmF0aXZlUHJlc2V0TGlzdDtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkUHJlc2V0JDogT2JzZXJ2YWJsZTxEYXRlUmFuZ2VDb21wb25lbnQuUHJlc2V0IHwgbnVsbD4gPVxuICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlJCxcbiAgICAgIHRoaXMudXNlclNlbGVjdGVkUHJlc2V0JC5waXBlKHN0YXJ0V2l0aChudWxsKSksXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3NlbGVjdGVkVmFsdWUsIHVzZXJTZWxlY3RlZFByZXNldF0pID0+IHtcbiAgICAgICAgaWYgKHNlbGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBEYXRlUmFuZ2VDb21wb25lbnQuUHJlc2V0cy5maWx0ZXIoXG4gICAgICAgICAgICBwcmVzZXQgPT5cbiAgICAgICAgICAgICAgcHJlc2V0LmRhdGVzWzBdLnZhbHVlT2YoKSA9PT0gc2VsZWN0ZWRWYWx1ZVswXS52YWx1ZU9mKCkgJiZcbiAgICAgICAgICAgICAgcHJlc2V0LmRhdGVzWzFdLnZhbHVlT2YoKSA9PT0gc2VsZWN0ZWRWYWx1ZVsxXS52YWx1ZU9mKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIFNvbWUgZGF0ZSByYW5nZXMgbWF0Y2ggbXVsdGlwbGUgcHJlc2V0cywgZS5nLiBvbiBKYW4gMTl0aCwgYVxuICAgICAgICAgICAgLy8gc2VsZWN0ZWQgZGF0ZSByYW5nZSBvZiBKYW4gMS0xOSB3b3VsZCBjb3JyZXNwb25kIHRvIFwidGhpcyBtb250aFxuICAgICAgICAgICAgLy8gc28gZmFyLFwiIFwidGhpcyBxdWFydGVyIHNvIGZhcixcIiBhbmQgXCJ0aGlzIHllYXIgc28gZmFyLlwiIFdlJ2xsXG4gICAgICAgICAgICAvLyB1c2UgdGhlIHVzZXIncyBtb3N0IHJlY2VudCBtYW51YWwgc2VsZWN0aW9uIGFzIGEgdGllIGJyZWFrZXJcbiAgICAgICAgICAgIC8vIHdoZXJlIHBvc3NpYmxlLlxuICAgICAgICAgICAgY29uc3QgbW9zdFJlY2VudCA9IG9wdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgb3B0aW9uID0+IG9wdGlvbi5pZCA9PT0gdXNlclNlbGVjdGVkUHJlc2V0Py5pZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAobW9zdFJlY2VudCkgcmV0dXJuIG1vc3RSZWNlbnQ7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uc1swXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KSxcbiAgICApO1xuXG4gIHJlYWRvbmx5IGZhdm9yaXRlUHJlc2V0SWRzJCA9IG5ldyBMb2NhbFN0b3JhZ2U8c3RyaW5nW10+KFxuICAgIHRoaXMuU1RPUkFHRV9LRVksXG4gICAgW10sXG4gICk7XG5cbiAgc2V0RmF2b3JpdGUocHJlc2V0OiBEYXRlUmFuZ2VDb21wb25lbnQuUHJlc2V0LCBmYXZvcml0ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IGlkcyA9IG5ldyBTZXQodGhpcy5mYXZvcml0ZVByZXNldElkcyQuZ2V0VmFsdWUoKSk7XG4gICAgaWYgKGZhdm9yaXRlKSB7XG4gICAgICBpZHMuYWRkKHByZXNldC5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlkcy5kZWxldGUocHJlc2V0LmlkKTtcbiAgICB9XG4gICAgdGhpcy5mYXZvcml0ZVByZXNldElkcyQubmV4dChbLi4uaWRzXSk7XG4gIH1cblxuICByZWFkb25seSBmYXZvcml0ZVByZXNldHMkOiBPYnNlcnZhYmxlPERhdGVSYW5nZUNvbXBvbmVudC5QcmVzZXRbXT4gPVxuICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5mYXZvcml0ZVByZXNldElkcyQsXG4gICAgICB0aGlzLmZpbHRlcmVkUHJlc2V0T3B0aW9ucyQsXG4gICAgICB0aGlzLmFsdGVybmF0aXZlUHJlc2V0TGlzdCQsXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW2lkcywgcHJlc2V0cywgYWx0ZXJuYXRpdmVQcmVzZXRMaXN0XSkgPT4ge1xuICAgICAgICBjb25zdCBmYXZvcml0ZVByZXNldHMgPSBpZHNcbiAgICAgICAgICAubWFwKGlkID0+IHByZXNldHMuZmluZChwcmVzZXQgPT4gcHJlc2V0LmlkID09PSBpZCkpXG4gICAgICAgICAgLmZpbHRlcigocCk6IHAgaXMgRGF0ZVJhbmdlQ29tcG9uZW50LlByZXNldCA9PiBwICE9PSB1bmRlZmluZWQpO1xuXG4gICAgICAgIGlmIChhbHRlcm5hdGl2ZVByZXNldExpc3QubGVuZ3RoID09IDApIHtcbiAgICAgICAgICByZXR1cm4gZmF2b3JpdGVQcmVzZXRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGZhdm9yaXRlc0ZpbHRlcmVkT25BbHRlcm5hdGl2ZVByZXNldExpc3QgPVxuICAgICAgICAgICAgZmF2b3JpdGVQcmVzZXRzLmZpbHRlcihwID0+XG4gICAgICAgICAgICAgIGFsdGVybmF0aXZlUHJlc2V0TGlzdC5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICA8RGF0ZVJhbmdlQ29tcG9uZW50LlByZXNldFR5cGU+cC5pZCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGZhdm9yaXRlc0ZpbHRlcmVkT25BbHRlcm5hdGl2ZVByZXNldExpc3Q7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgICApO1xuXG4gIHJlYWRvbmx5IHVzZXJMZWZ0QWN0aXZlWWVhck1vbnRoJCA9IG5ldyBTdWJqZWN0PERhdGU+KCk7XG4gIHJlYWRvbmx5IHVzZXJSaWdodEFjdGl2ZVllYXJNb250aCQgPSBuZXcgU3ViamVjdDxEYXRlPigpO1xuXG4gIHJlYWRvbmx5IGxlZnRNaW4kID0gdGhpcy5taW4kLnBpcGUoXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcbiAgcmVhZG9ubHkgbGVmdE1heCQgPSB0aGlzLm1heCQucGlwZShcbiAgICBtYXAobWF4ID0+IHRpbWVEYXkub2Zmc2V0KHRpbWVNb250aC5mbG9vcihtYXgpLCAtMSkpLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG4gIHJlYWRvbmx5IHJpZ2h0TWF4JCA9IHRoaXMubWF4JC5waXBlKFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgbGVmdEFjdGl2ZVllYXJNb250aCQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmxlZnRNYXgkLFxuICAgIG1lcmdlKFxuICAgICAgdGhpcy51c2VyTGVmdEFjdGl2ZVllYXJNb250aCQucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHRpbWVNb250aC5mbG9vcih0aGlzLlRPREFZKSksXG4gICAgICApLFxuICAgICAgdGhpcy51c2VyU2VsZWN0ZWRQcmVzZXQkLnBpcGUoXG4gICAgICAgIGZpbHRlcihcbiAgICAgICAgICAocHJlc2V0KTogcHJlc2V0IGlzIERhdGVSYW5nZUNvbXBvbmVudC5QcmVzZXQgPT4gcHJlc2V0ICE9PSBudWxsLFxuICAgICAgICApLFxuICAgICAgICBtYXAocHJlc2V0ID0+IHRpbWVNb250aC5mbG9vcihwcmVzZXQuZGF0ZXNbMF0pKSxcbiAgICAgICksXG4gICAgICB0aGlzLmRpc3RpbmN0VmFsdWUkLnBpcGUoXG4gICAgICAgIGZpbHRlcigodik6IHYgaXMgW0RhdGUsIERhdGVdID0+IHYgIT09IHVuZGVmaW5lZCksXG4gICAgICAgIG1hcCh2ID0+IHRpbWVNb250aC5mbG9vcih2WzBdKSksXG4gICAgICApLFxuICAgICksXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbbGVmdE1heCwgbGVmdF0pID0+IHtcbiAgICAgIGlmIChsZWZ0LnZhbHVlT2YoKSA+PSBsZWZ0TWF4LnZhbHVlT2YoKSkgcmV0dXJuIHRpbWVNb250aC5mbG9vcihsZWZ0TWF4KTtcbiAgICAgIGVsc2UgcmV0dXJuIGxlZnQ7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSByaWdodEFjdGl2ZVllYXJNb250aCQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmxlZnRBY3RpdmVZZWFyTW9udGgkLFxuICAgIG1lcmdlKFxuICAgICAgdGhpcy51c2VyUmlnaHRBY3RpdmVZZWFyTW9udGgkLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aCh0aW1lTW9udGguY2VpbCh0aGlzLlRPREFZKSksXG4gICAgICApLFxuICAgICAgdGhpcy51c2VyU2VsZWN0ZWRQcmVzZXQkLnBpcGUoXG4gICAgICAgIGZpbHRlcihcbiAgICAgICAgICAocHJlc2V0KTogcHJlc2V0IGlzIERhdGVSYW5nZUNvbXBvbmVudC5QcmVzZXQgPT4gcHJlc2V0ICE9PSBudWxsLFxuICAgICAgICApLFxuICAgICAgICBtYXAocHJlc2V0ID0+IHRpbWVNb250aC5mbG9vcihwcmVzZXQuZGF0ZXNbMV0pKSxcbiAgICAgICksXG4gICAgICB0aGlzLmRpc3RpbmN0VmFsdWUkLnBpcGUoXG4gICAgICAgIGZpbHRlcigodik6IHYgaXMgW0RhdGUsIERhdGVdID0+IHYgIT09IHVuZGVmaW5lZCksXG4gICAgICAgIG1hcCh2ID0+IHRpbWVNb250aC5mbG9vcih2WzFdKSksXG4gICAgICApLFxuICAgICksXG4gICAgdGhpcy5yaWdodE1heCQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbbGVmdCwgdXNlclJpZ2h0LCByaWdodE1heCRdKSA9PiB7XG4gICAgICBpZiAobGVmdC52YWx1ZU9mKCkgPj0gdXNlclJpZ2h0LnZhbHVlT2YoKSlcbiAgICAgICAgcmV0dXJuIHRpbWVNb250aC5mbG9vcih0aW1lTW9udGgub2Zmc2V0KGxlZnQsIDEpKTtcbiAgICAgIGVsc2UgaWYgKHVzZXJSaWdodC52YWx1ZU9mKCkgPj0gcmlnaHRNYXgkLnZhbHVlT2YoKSlcbiAgICAgICAgcmV0dXJuIHRpbWVNb250aC5mbG9vcihyaWdodE1heCQpO1xuICAgICAgZWxzZSByZXR1cm4gdXNlclJpZ2h0O1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgcmlnaHRNaW4kID0gdGhpcy5sZWZ0QWN0aXZlWWVhck1vbnRoJC5waXBlKFxuICAgIG1hcChsZWZ0ID0+IHRpbWVNb250aC5mbG9vcih0aW1lTW9udGgub2Zmc2V0KGxlZnQsIDEpKSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBsZWZ0T21pdFJhbmdlJDogT2JzZXJ2YWJsZTxbRGF0ZSwgRGF0ZV0+ID1cbiAgICB0aGlzLnJpZ2h0QWN0aXZlWWVhck1vbnRoJC5waXBlKFxuICAgICAgbWFwPERhdGUsIFtEYXRlLCBEYXRlXT4ocmlnaHRBY3RpdmVZZWFyTW9udGggPT4ge1xuICAgICAgICBjb25zdCBmaXJzdCA9IHRpbWVNb250aC5mbG9vcihyaWdodEFjdGl2ZVllYXJNb250aCk7XG4gICAgICAgIGNvbnN0IGxhc3QgPSB0aW1lRGF5Lm9mZnNldChcbiAgICAgICAgICB0aW1lTW9udGguZmxvb3IodGltZU1vbnRoLm9mZnNldChyaWdodEFjdGl2ZVllYXJNb250aCwgMSkpLFxuICAgICAgICAgIC0xLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW2ZpcnN0LCBsYXN0XTtcbiAgICAgIH0pLFxuICAgICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgICApO1xuXG4gIHJlYWRvbmx5IHVzZXJJbnRlcmFjdGVkJCA9IG1lcmdlKFxuICAgIHRoaXMudXNlclNlbGVjdGVkRGF0ZSQsXG4gICAgdGhpcy51c2VyU2VsZWN0ZWRQcmVzZXQkLFxuICApO1xuXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSB2YWx1ZUNoYW5nZTogT2JzZXJ2YWJsZTxbRGF0ZSwgRGF0ZV0gfCB1bmRlZmluZWQ+ID1cbiAgICB0aGlzLnNlbGVjdGVkVmFsdWUkLnBpcGUoXG4gICAgICBza2lwVW50aWwoXG4gICAgICAgIG1lcmdlKFxuICAgICAgICAgIHRoaXMudXNlckludGVyYWN0ZWQkLFxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZSQucGlwZShmaWx0ZXIodiA9PiB2ICE9PSB1bmRlZmluZWQpKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgICBmaWx0ZXIoKHYpOiB2IGlzIFtEYXRlLCBEYXRlXSB8IHVuZGVmaW5lZCA9PiAhKHYgaW5zdGFuY2VvZiBEYXRlKSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChcbiAgICAgICAgKHByZXZpb3VzLCBjdXJyZW50KSA9PlxuICAgICAgICAgIHByZXZpb3VzPy5bMF0udmFsdWVPZigpID09PSBjdXJyZW50Py5bMF0udmFsdWVPZigpICYmXG4gICAgICAgICAgcHJldmlvdXM/LlsxXS52YWx1ZU9mKCkgPT09IGN1cnJlbnQ/LlsxXS52YWx1ZU9mKCksXG4gICAgICApLFxuICAgICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgICApO1xuXG4gIHJlYWRvbmx5IGRpc3BsYXlWYWx1ZSQ6IE9ic2VydmFibGU8c3RyaW5nIHwgdW5kZWZpbmVkPiA9XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5waXBlKFxuICAgICAgbWFwKHYgPT4ge1xuICAgICAgICBpZiAodikge1xuICAgICAgICAgIHJldHVybiB2Lm1hcChkYXRlID0+IG5ldyBEYXRlUGlwZSgpLnRyYW5zZm9ybShkYXRlKSkuam9pbignIOKAlCAnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICAgICk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRGF0ZVJhbmdlQ29tcG9uZW50IHtcbiAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuXG4gIGV4cG9ydCBlbnVtIFByZXNldFR5cGUge1xuICAgIFRPREFZID0gJ3RvZGF5JyxcbiAgICBZRVNURVJEQVkgPSAneWVzdGVyZGF5JyxcbiAgICBUT01PUlJPVyA9ICd0b21vcnJvdycsXG4gICAgVEhJU19XRUVLID0gJ3RoaXNfd2VlaycsXG4gICAgVEhJU19XRUVLX1NPX0ZBUiA9ICd0aGlzX3dlZWtfc29fZmFyJyxcbiAgICBMQVNUX1dFRUsgPSAnbGFzdF93ZWVrJyxcbiAgICBORVhUX1dFRUsgPSAnbmV4dF93ZWVrJyxcbiAgICBUSElTX01PTlRIID0gJ3RoaXNfbW9udGgnLFxuICAgIFRISVNfTU9OVEhfU09fRkFSID0gJ3RoaXNfbW9udGhfc29fZmFyJyxcbiAgICBMQVNUX01PTlRIID0gJ2xhc3RfbW9udGgnLFxuICAgIE5FWFRfTU9OVEggPSAnbmV4dF9tb250aCcsXG4gICAgVEhJU19RVUFSVEVSID0gJ3RoaXNfcXVhcnRlcicsXG4gICAgVEhJU19RVUFSVEVSX1NPX0ZBUiA9ICd0aGlzX3F1YXJ0ZXJfc29fZmFyJyxcbiAgICBMQVNUX1FVQVJURVIgPSAnbGFzdF9xdWFydGVyJyxcbiAgICBORVhUX1FVQVJURVIgPSAnbmV4dF9xdWFydGVyJyxcbiAgICBUSElTX1lFQVIgPSAndGhpc195ZWFyJyxcbiAgICBUSElTX1lFQVJfU09fRkFSID0gJ3RoaXNfeWVhcl9zb19mYXInLFxuICAgIExBU1RfWUVBUiA9ICdsYXN0X3llYXInLFxuICAgIE5FWFRfWUVBUiA9ICduZXh0X3llYXInLFxuICAgIExBU1RfN19EQVlTID0gJ2xhc3RfN19kYXlzJyxcbiAgICBMQVNUXzE0X0RBWVMgPSAnbGFzdF8xNF9kYXlzJyxcbiAgICBMQVNUXzMwX0RBWVMgPSAnbGFzdF8zMF9kYXlzJyxcbiAgICBMQVNUXzYwX0RBWVMgPSAnbGFzdF82MF9kYXlzJyxcbiAgICBMQVNUXzkwX0RBWVMgPSAnbGFzdF85MF9kYXlzJyxcbiAgICBMQVNUXzE4MF9EQVlTID0gJ2xhc3RfMTgwX2RheXMnLFxuICAgIExBU1RfMzY1X0RBWVMgPSAnbGFzdF8zNjVfZGF5cycsXG4gIH1cblxuICBleHBvcnQgdHlwZSBQcmVzZXQgPSB7XG4gICAgaWQ6IFByZXNldFR5cGU7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBzdWJ0aXRsZTogc3RyaW5nO1xuICAgIGRhdGVzOiBbRGF0ZSwgRGF0ZV07XG4gIH07XG5cbiAgZXhwb3J0IGNvbnN0IFByZXNldHM6IFByZXNldFtdID0gW1xuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLlRPREFZLFxuICAgICAgdGl0bGU6ICdUb2RheScsXG4gICAgICBzdWJ0aXRsZTogJ1RvZGF5IGZyb20gbWlkbmlnaHQgdW50aWwgdGhlIGN1cnJlbnQgdGltZScsXG4gICAgICBkYXRlczogW3RpbWVEYXkoKSwgdGltZURheSgpXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLllFU1RFUkRBWSxcbiAgICAgIHRpdGxlOiAnWWVzdGVyZGF5JyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIHByZXZpb3VzIDI0IGhvdXIgZGF5JyxcbiAgICAgIGRhdGVzOiBbdGltZURheS5vZmZzZXQodGltZURheSgpLCAtMSksIHRpbWVEYXkub2Zmc2V0KHRpbWVEYXkoKSwgLTEpXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLlRPTU9SUk9XLFxuICAgICAgdGl0bGU6ICdUb21vcnJvdycsXG4gICAgICBzdWJ0aXRsZTogJ1RoZSBuZXh0IDI0IGhvdXIgZGF5JyxcbiAgICAgIGRhdGVzOiBbdGltZURheS5vZmZzZXQodGltZURheSgpLCAxKSwgdGltZURheS5vZmZzZXQodGltZURheSgpLCAxKV0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogUHJlc2V0VHlwZS5USElTX1dFRUssXG4gICAgICB0aXRsZTogJ1RoaXMgd2VlaycsXG4gICAgICBzdWJ0aXRsZTogJ1RoZSBjdXJyZW50IGNhbGVuZGFyIHdlZWsnLFxuICAgICAgZGF0ZXM6IFtcbiAgICAgICAgdGltZVN1bmRheS5mbG9vcih0b2RheSksXG4gICAgICAgIHRpbWVEYXkub2Zmc2V0KHRpbWVTdW5kYXkuY2VpbCh0b2RheSksIC0xKSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogUHJlc2V0VHlwZS5USElTX1dFRUtfU09fRkFSLFxuICAgICAgdGl0bGU6ICdUaGlzIHdlZWsgc28gZmFyJyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIGN1cnJlbnQgY2FsZW5kYXIgd2VlayB1cCB0byBub3cnLFxuICAgICAgZGF0ZXM6IFt0aW1lU3VuZGF5LmZsb29yKHRvZGF5KSwgdGltZURheS5mbG9vcih0b2RheSldLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IFByZXNldFR5cGUuTEFTVF9XRUVLLFxuICAgICAgdGl0bGU6ICdMYXN0IHdlZWsnLFxuICAgICAgc3VidGl0bGU6ICdUaGUgcHJldmlvdXMgY2FsZW5kYXIgd2VlaycsXG4gICAgICBkYXRlczogW1xuICAgICAgICB0aW1lU3VuZGF5Lm9mZnNldCh0aW1lV2Vlay5mbG9vcih0b2RheSksIC0xKSxcbiAgICAgICAgdGltZURheS5vZmZzZXQodGltZVN1bmRheS5vZmZzZXQodGltZVdlZWsuY2VpbCh0b2RheSksIC0xKSwgLTEpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLk5FWFRfV0VFSyxcbiAgICAgIHRpdGxlOiAnTmV4dCB3ZWVrJyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIG5leHQgY2FsZW5kYXIgd2VlaycsXG4gICAgICBkYXRlczogW1xuICAgICAgICB0aW1lU3VuZGF5Lm9mZnNldCh0aW1lV2Vlay5mbG9vcih0b2RheSksIDEpLFxuICAgICAgICB0aW1lRGF5Lm9mZnNldCh0aW1lU3VuZGF5Lm9mZnNldCh0aW1lV2Vlay5jZWlsKHRvZGF5KSwgMSksIC0xKSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogUHJlc2V0VHlwZS5USElTX01PTlRILFxuICAgICAgdGl0bGU6ICdUaGlzIG1vbnRoJyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIGN1cnJlbnQgY2FsZW5kYXIgbW9udGgnLFxuICAgICAgZGF0ZXM6IFtcbiAgICAgICAgdGltZU1vbnRoLmZsb29yKHRvZGF5KSxcbiAgICAgICAgdGltZURheS5vZmZzZXQodGltZU1vbnRoLmNlaWwodG9kYXkpLCAtMSksXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IFByZXNldFR5cGUuVEhJU19NT05USF9TT19GQVIsXG4gICAgICB0aXRsZTogJ1RoaXMgbW9udGggc28gZmFyJyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIGN1cnJlbnQgY2FsZW5kYXIgbW9udGggdXAgdG8gbm93JyxcbiAgICAgIGRhdGVzOiBbdGltZU1vbnRoLmZsb29yKHRvZGF5KSwgdGltZURheS5mbG9vcih0b2RheSldLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IFByZXNldFR5cGUuTEFTVF9NT05USCxcbiAgICAgIHRpdGxlOiAnTGFzdCBtb250aCcsXG4gICAgICBzdWJ0aXRsZTogJ1RoZSBwcmV2aW91cyBjYWxlbmRhciBtb250aCcsXG4gICAgICBkYXRlczogW1xuICAgICAgICB0aW1lTW9udGgub2Zmc2V0KHRpbWVNb250aC5mbG9vcih0b2RheSksIC0xKSxcbiAgICAgICAgdGltZURheS5vZmZzZXQodGltZU1vbnRoLm9mZnNldCh0aW1lTW9udGguY2VpbCh0b2RheSksIC0xKSwgLTEpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLk5FWFRfTU9OVEgsXG4gICAgICB0aXRsZTogJ05leHQgbW9udGgnLFxuICAgICAgc3VidGl0bGU6ICdUaGUgbmV4dCBjYWxlbmRhciBtb250aCcsXG4gICAgICBkYXRlczogW1xuICAgICAgICB0aW1lTW9udGgub2Zmc2V0KHRpbWVNb250aC5mbG9vcih0b2RheSksIDEpLFxuICAgICAgICB0aW1lRGF5Lm9mZnNldCh0aW1lTW9udGgub2Zmc2V0KHRpbWVNb250aC5jZWlsKHRvZGF5KSwgMSksIC0xKSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogUHJlc2V0VHlwZS5USElTX1FVQVJURVIsXG4gICAgICB0aXRsZTogJ1RoaXMgcXVhcnRlcicsXG4gICAgICBzdWJ0aXRsZTogJ1RoZSBjdXJyZW50IHF1YXJ0ZXInLFxuICAgICAgZGF0ZXM6IFtcbiAgICAgICAgdGltZVF1YXJ0ZXIuZmxvb3IodG9kYXkpLFxuICAgICAgICB0aW1lRGF5Lm9mZnNldCh0aW1lUXVhcnRlci5jZWlsKHRvZGF5KSwgLTEpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLlRISVNfUVVBUlRFUl9TT19GQVIsXG4gICAgICB0aXRsZTogJ1RoaXMgcXVhcnRlciBzbyBmYXInLFxuICAgICAgc3VidGl0bGU6ICdUaGUgY3VycmVudCBxdWFydGVyIHVwIHRvIG5vdycsXG4gICAgICBkYXRlczogW3RpbWVRdWFydGVyLmZsb29yKHRvZGF5KSwgdGltZURheS5mbG9vcih0b2RheSldLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IFByZXNldFR5cGUuTEFTVF9RVUFSVEVSLFxuICAgICAgdGl0bGU6ICdMYXN0IHF1YXJ0ZXInLFxuICAgICAgc3VidGl0bGU6ICdUaGUgcHJldmlvdXMgZnVsbCBxdWFydGVyJyxcbiAgICAgIGRhdGVzOiBbXG4gICAgICAgIHRpbWVRdWFydGVyLm9mZnNldCh0aW1lUXVhcnRlci5mbG9vcih0b2RheSksIC0xKSxcbiAgICAgICAgdGltZURheS5vZmZzZXQodGltZVF1YXJ0ZXIub2Zmc2V0KHRpbWVRdWFydGVyLmNlaWwodG9kYXkpLCAtMSksIC0xKSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogUHJlc2V0VHlwZS5ORVhUX1FVQVJURVIsXG4gICAgICB0aXRsZTogJ05leHQgcXVhcnRlcicsXG4gICAgICBzdWJ0aXRsZTogJ1RoZSBuZXh0IGZ1bGwgcXVhcnRlcicsXG4gICAgICBkYXRlczogW1xuICAgICAgICB0aW1lUXVhcnRlci5vZmZzZXQodGltZVF1YXJ0ZXIuZmxvb3IodG9kYXkpLCAxKSxcbiAgICAgICAgdGltZURheS5vZmZzZXQodGltZVF1YXJ0ZXIub2Zmc2V0KHRpbWVRdWFydGVyLmNlaWwodG9kYXkpLCAxKSwgLTEpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLlRISVNfWUVBUixcbiAgICAgIHRpdGxlOiAnVGhpcyB5ZWFyJyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIGN1cnJlbnQgY2FsZW5kYXIgeWVhcicsXG4gICAgICBkYXRlczogW3RpbWVZZWFyLmZsb29yKHRvZGF5KSwgdGltZURheS5vZmZzZXQodGltZVllYXIuY2VpbCh0b2RheSksIC0xKV0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogUHJlc2V0VHlwZS5USElTX1lFQVJfU09fRkFSLFxuICAgICAgdGl0bGU6ICdUaGlzIHllYXIgc28gZmFyJyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIGN1cnJlbnQgY2FsZW5kYXIgeWVhciB1cCB0byBub3cnLFxuICAgICAgZGF0ZXM6IFt0aW1lWWVhci5mbG9vcih0b2RheSksIHRpbWVEYXkuZmxvb3IodG9kYXkpXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLkxBU1RfWUVBUixcbiAgICAgIHRpdGxlOiAnTGFzdCB5ZWFyJyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIHByZXZpb3VzIGNhbGVuZGFyIHllYXInLFxuICAgICAgZGF0ZXM6IFtcbiAgICAgICAgdGltZVllYXIub2Zmc2V0KHRpbWVZZWFyLmZsb29yKHRvZGF5KSwgLTEpLFxuICAgICAgICB0aW1lRGF5Lm9mZnNldCh0aW1lWWVhci5vZmZzZXQodGltZVllYXIuY2VpbCh0b2RheSksIC0xKSwgLTEpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLk5FWFRfWUVBUixcbiAgICAgIHRpdGxlOiAnTmV4dCB5ZWFyJyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIG5leHQgY2FsZW5kYXIgeWVhcicsXG4gICAgICBkYXRlczogW1xuICAgICAgICB0aW1lWWVhci5vZmZzZXQodGltZVllYXIuZmxvb3IodG9kYXkpLCAxKSxcbiAgICAgICAgdGltZURheS5vZmZzZXQodGltZVllYXIub2Zmc2V0KHRpbWVZZWFyLmNlaWwodG9kYXkpLCAxKSwgLTEpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLkxBU1RfN19EQVlTLFxuICAgICAgdGl0bGU6ICdMYXN0IDcgZGF5cycsXG4gICAgICBzdWJ0aXRsZTogJ1RoZSBwcmV2aW91cyA3IGRheXMgYmVmb3JlIHRvZGF5JyxcbiAgICAgIGRhdGVzOiBbXG4gICAgICAgIHRpbWVEYXkuZmxvb3IodGltZURheS5vZmZzZXQodG9kYXksIC04KSksXG4gICAgICAgIHRpbWVEYXkuZmxvb3IodGltZURheS5vZmZzZXQodG9kYXksIC0xKSksXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IFByZXNldFR5cGUuTEFTVF8xNF9EQVlTLFxuICAgICAgdGl0bGU6ICdMYXN0IDE0IGRheXMnLFxuICAgICAgc3VidGl0bGU6ICdUaGUgcHJldmlvdXMgMTQgZGF5cyBiZWZvcmUgdG9kYXknLFxuICAgICAgZGF0ZXM6IFtcbiAgICAgICAgdGltZURheS5mbG9vcih0aW1lRGF5Lm9mZnNldCh0b2RheSwgLTE1KSksXG4gICAgICAgIHRpbWVEYXkuZmxvb3IodGltZURheS5vZmZzZXQodG9kYXksIC0xKSksXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IFByZXNldFR5cGUuTEFTVF8zMF9EQVlTLFxuICAgICAgdGl0bGU6ICdMYXN0IDMwIGRheXMnLFxuICAgICAgc3VidGl0bGU6ICdUaGUgcHJldmlvdXMgMzAgZGF5cyBiZWZvcmUgdG9kYXknLFxuICAgICAgZGF0ZXM6IFtcbiAgICAgICAgdGltZURheS5mbG9vcih0aW1lRGF5Lm9mZnNldCh0b2RheSwgLTMxKSksXG4gICAgICAgIHRpbWVEYXkuZmxvb3IodGltZURheS5vZmZzZXQodG9kYXksIC0xKSksXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IFByZXNldFR5cGUuTEFTVF82MF9EQVlTLFxuICAgICAgdGl0bGU6ICdMYXN0IDYwIGRheXMnLFxuICAgICAgc3VidGl0bGU6ICdUaGUgcHJldmlvdXMgNjAgZGF5cyBiZWZvcmUgdG9kYXknLFxuICAgICAgZGF0ZXM6IFtcbiAgICAgICAgdGltZURheS5mbG9vcih0aW1lRGF5Lm9mZnNldCh0b2RheSwgLTYxKSksXG4gICAgICAgIHRpbWVEYXkuZmxvb3IodGltZURheS5vZmZzZXQodG9kYXksIC0xKSksXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IFByZXNldFR5cGUuTEFTVF85MF9EQVlTLFxuICAgICAgdGl0bGU6ICdMYXN0IDkwIGRheXMnLFxuICAgICAgc3VidGl0bGU6ICdUaGUgcHJldmlvdXMgOTAgZGF5cyBiZWZvcmUgdG9kYXknLFxuICAgICAgZGF0ZXM6IFtcbiAgICAgICAgdGltZURheS5mbG9vcih0aW1lRGF5Lm9mZnNldCh0b2RheSwgLTkxKSksXG4gICAgICAgIHRpbWVEYXkuZmxvb3IodGltZURheS5vZmZzZXQodG9kYXksIC0xKSksXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IFByZXNldFR5cGUuTEFTVF8xODBfREFZUyxcbiAgICAgIHRpdGxlOiAnTGFzdCAxODAgZGF5cycsXG4gICAgICBzdWJ0aXRsZTogJ1RoZSBwcmV2aW91cyAxODAgZGF5cyBiZWZvcmUgdG9kYXknLFxuICAgICAgZGF0ZXM6IFtcbiAgICAgICAgdGltZURheS5mbG9vcih0aW1lRGF5Lm9mZnNldCh0b2RheSwgLTE4MSkpLFxuICAgICAgICB0aW1lRGF5LmZsb29yKHRpbWVEYXkub2Zmc2V0KHRvZGF5LCAtMSkpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLkxBU1RfMzY1X0RBWVMsXG4gICAgICB0aXRsZTogJ0xhc3QgMzY1IGRheXMnLFxuICAgICAgc3VidGl0bGU6ICdUaGUgcHJldmlvdXMgMzY1IGRheXMgYmVmb3JlIHRvZGF5JyxcbiAgICAgIGRhdGVzOiBbXG4gICAgICAgIHRpbWVEYXkuZmxvb3IodGltZURheS5vZmZzZXQodG9kYXksIC0zNjYpKSxcbiAgICAgICAgdGltZURheS5mbG9vcih0aW1lRGF5Lm9mZnNldCh0b2RheSwgLTEpKSxcbiAgICAgIF0sXG4gICAgfSxcbiAgXTtcbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJ0cmlnZ2VyVGVtcGxhdGU7IGVsc2Ugc3RhbmRhcmRUcmlnZ2VyXCI+XG4gIDxidXR0b25cbiAgICAjY3VzdG9tVHJpZ2dlckJ1dHRvblxuICAgIChjbGljayk9XCJvcGVuJC5uZXh0KHRydWUpXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQkIHwgYXN5bmNcIlxuICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiKGRpc2FibGVkJCB8IGFzeW5jKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidHJpZ2dlclRlbXBsYXRlXCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IG9wZW46IG9wZW4kIHwgYXN5bmMgfVwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICA8L2J1dHRvbj5cbjwvbmctY29udGFpbmVyPlxuPG5nLXRlbXBsYXRlICNzdGFuZGFyZFRyaWdnZXI+XG4gIDxyaXYtaW5wdXQtbGFiZWxcbiAgICBbbGFiZWxdPVwibGFiZWxcIlxuICAgIFtoZWxwXT1cImhlbHBcIlxuICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgW3N0YXRlXT1cInN0YXRlXCJcbiAgICBbZXJyb3JNZXNzYWdlXT1cImVycm9yTWVzc2FnZVwiXG4gICAgW2xhYmVsQWN0aW9uVGV4dF09XCJsYWJlbEFjdGlvblRleHRcIlxuICAgIChsYWJlbEFjdGlvbik9XCJsYWJlbEFjdGlvbi5lbWl0KCRldmVudClcIlxuICA+XG4gICAgPGJ1dHRvblxuICAgICAgI3N0YW5kYXJkVHJpZ2dlckJ1dHRvblxuICAgICAgY2xhc3M9XCJ0cmlnZ2VyXCJcbiAgICAgIFtjbGFzcy53YXJuaW5nXT1cInN0YXRlID09PSAnd2FybmluZydcIlxuICAgICAgW2NsYXNzLmVycm9yXT1cInN0YXRlID09PSAnZXJyb3InXCJcbiAgICAgIChjbGljayk9XCJvcGVuJC5uZXh0KHRydWUpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCQgfCBhc3luY1wiXG4gICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIihkaXNhYmxlZCQgfCBhc3luYykgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJkaXNwbGF5VmFsdWUkIHwgYXN5bmM7IGVsc2UgcGxhY2Vob2xkZXJWYWx1ZTsgbGV0IGRpc3BsYXlcIlxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInZhbHVlXCI+e3sgZGlzcGxheSB9fTwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNwbGFjZWhvbGRlclZhbHVlPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInZhbHVlIHBsYWNlaG9sZGVyXCI+e3sgcGxhY2Vob2xkZXIkIHwgYXN5bmMgfX08L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjaGV2cm9uXCI+XG4gICAgICAgIDxyaXYtaWNvbiBbbmFtZV09XCInQ2FsZW5kYXInXCIgW3NpemVdPVwiMTZcIj48L3Jpdi1pY29uPlxuICAgICAgPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L3Jpdi1pbnB1dC1sYWJlbD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjc2VsZlxuICBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWxmXCJcbiAgbGV0LWlucHV0VmFsdWVcbiAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiAoZGlzdGluY3RWYWx1ZSQgfCBhc3luYykgfVwiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcGVuJCB8IGFzeW5jXCI+XG4gICAgPHJpdi1jYWxsb3V0XG4gICAgICAqcml2LW92ZXJsYXlcbiAgICAgIFthbmNob3JdPVwiZ2V0VHJpZ2dlcigpXCJcbiAgICAgIFtzaG93Q2FyZXRdPVwiZmFsc2VcIlxuICAgICAgW3RoZW1lXT1cIidsaWdodCdcIlxuICAgICAgW2FsbG93ZWRQb3NpdGlvbnNdPVwiW1xuICAgICAgICAndG9wLWxlZnQnLFxuICAgICAgICAndG9wLXJpZ2h0JyxcbiAgICAgICAgJ2JvdHRvbS1yaWdodCcsXG4gICAgICAgICdib3R0b20tbGVmdCdcbiAgICAgIF1cIlxuICAgICAgW3ByZWZlcnJlZFBvc2l0aW9uXT1cIidib3R0b20tcmlnaHQnXCJcbiAgICAgIChjbG9zZSk9XCJvcGVuJC5uZXh0KGZhbHNlKTsgdXNlclNlbGVjdGVkRGF0ZSQubmV4dChpbnB1dFZhbHVlKVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIiBbY2xhc3MuaW5jbHVkZS1wcmVzZXRdPVwic2hvd1ByZXNldHNcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dQcmVzZXRzXCIgY2xhc3M9XCJwcmVzZXRzXCI+XG4gICAgICAgICAgPHJpdi1zaW1wbGUtc2VsZWN0XG4gICAgICAgICAgICBbbGFiZWxdPVwiJ0RhdGUgcHJlc2V0cydcIlxuICAgICAgICAgICAgW2ZpbHRlcmFiaWxpdHlPcHRpb25zXT1cInsgZW5hYmxlZDogdHJ1ZSwgcGxhY2Vob2xkZXI6ICdTZWFyY2gnIH1cIlxuICAgICAgICAgICAgW29yZGVyQnldPVwiJ3NvdXJjZSdcIlxuICAgICAgICAgICAgW29wdGlvbkdyb3Vwc109XCJcbiAgICAgICAgICAgICAgKGZpbHRlcmVkUHJlc2V0T3B0aW9ucyQgfCBhc3luYykgPz8gW10gfCByaXZPcHRpb25Hcm91cFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZE9wdGlvbl09XCJzZWxlY3RlZFByZXNldCQgfCBhc3luY1wiXG4gICAgICAgICAgICAoc2VsZWN0ZWRPcHRpb25DaGFuZ2UpPVwidXNlclNlbGVjdGVkUHJlc2V0JC5uZXh0KCRldmVudClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb3B0aW9uIGxldC1ub2RlPVwibm9kZVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAjc2VsZlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlbGZcIlxuICAgICAgICAgICAgICAgIGxldC1pc0Zhdm9yaXRlXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogKGZhdm9yaXRlUHJlc2V0SWRzJCB8IGFzeW5jKT8uaW5jbHVkZXMobm9kZS5pZClcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmVzZXRcIiBbY2xhc3MuZmF2b3JpdGVdPVwiaXNGYXZvcml0ZVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxyaXYtaGlnaGxpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwibm9kZS50aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2luZGljZXNdPVwibm9kZS50aXRsZUhpZ2hsaWdodEluZGljZXMgfHwgW11cIlxuICAgICAgICAgICAgICAgICAgICA+PC9yaXYtaGlnaGxpZ2h0PlxuICAgICAgICAgICAgICAgICAgICA8cml2LWhpZ2hsaWdodFxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3VidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cIm5vZGUuc3VidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtpbmRpY2VzXT1cIm5vZGUuc3VidGl0bGVIaWdobGlnaHRJbmRpY2VzIHx8IFtdXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcml2LWhpZ2hsaWdodD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgc2V0RmF2b3JpdGUobm9kZSwgIWlzRmF2b3JpdGUpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxyaXYtaWNvblxuICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImlzRmF2b3JpdGUgPyAnSGVhcnRBY3RpdmUnIDogJ0hlYXJ0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiMTZcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyaXZUb29sdGlwXT1cIidNYXJrIGFzIGZhdm9yaXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgID48L3Jpdi1pY29uPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvcml2LXNpbXBsZS1zZWxlY3Q+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAjc2VsZlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZlwiXG4gICAgICAgICAgICBsZXQtZmF2b3JpdGVzXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGZhdm9yaXRlUHJlc2V0cyQgfCBhc3luYyB9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cml2LWlucHV0LWxhYmVsICpuZ0lmPVwiZmF2b3JpdGVzLmxlbmd0aFwiIFtsYWJlbF09XCInRmF2b3JpdGVzJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hvcnRjdXRzXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGZhdm9yaXRlIG9mIGZhdm9yaXRlc1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNob3J0Y3V0XCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiKHNlbGVjdGVkUHJlc2V0JCB8IGFzeW5jKT8uaWQgPT09IGZhdm9yaXRlLmlkXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1c2VyU2VsZWN0ZWRQcmVzZXQkLm5leHQoZmF2b3JpdGUpXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj57eyBmYXZvcml0ZS50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNldEZhdm9yaXRlKGZhdm9yaXRlLCBmYWxzZSlcIlxuICAgICAgICAgICAgICAgICAgICBbcml2VG9vbHRpcF09XCInUmVtb3ZlIGZhdm9yaXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cml2LWljb24gW25hbWVdPVwiJ0hlYXJ0QWN0aXZlJ1wiIFtzaXplXT1cIjE2XCI+PC9yaXYtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvcml2LWlucHV0LWxhYmVsPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhcnNcIj5cbiAgICAgICAgICA8cml2LWNhbGVuZGFyXG4gICAgICAgICAgICBjbGFzcz1cImxlZnRcIlxuICAgICAgICAgICAgW2FjdGl2ZVllYXJNb250aF09XCIobGVmdEFjdGl2ZVllYXJNb250aCQgfCBhc3luYykgfHwgVE9EQVlcIlxuICAgICAgICAgICAgKGFjdGl2ZVllYXJNb250aENoYW5nZSk9XCJ1c2VyTGVmdEFjdGl2ZVllYXJNb250aCQubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtkaXNwbGF5TWluXT1cIihtaW4kIHwgYXN5bmMpIHx8IFRPREFZXCJcbiAgICAgICAgICAgIFtkaXNwbGF5TWF4XT1cIihtYXgkIHwgYXN5bmMpIHx8IFRPREFZXCJcbiAgICAgICAgICAgIFtzZWxlY3RhYmxlTWluXT1cIihsZWZ0TWluJCB8IGFzeW5jKSB8fCBUT0RBWVwiXG4gICAgICAgICAgICBbc2VsZWN0YWJsZU1heF09XCIobGVmdE1heCQgfCBhc3luYykgfHwgVE9EQVlcIlxuICAgICAgICAgICAgW29taXRSYW5nZV09XCIobGVmdE9taXRSYW5nZSQgfCBhc3luYykgfHwgW1RPREFZLCBUT0RBWV1cIlxuICAgICAgICAgICAgW3NlbGVjdGVkVmFsdWVdPVwiKHNlbGVjdGVkVmFsdWUkIHwgYXN5bmMpIHx8IFRPREFZXCJcbiAgICAgICAgICAgIChkYXRlU2VsZWN0KT1cInVzZXJTZWxlY3RlZERhdGUkLm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgPjwvcml2LWNhbGVuZGFyPlxuICAgICAgICAgIDxyaXYtY2FsZW5kYXJcbiAgICAgICAgICAgIGNsYXNzPVwicmlnaHRcIlxuICAgICAgICAgICAgW2FjdGl2ZVllYXJNb250aF09XCIocmlnaHRBY3RpdmVZZWFyTW9udGgkIHwgYXN5bmMpIHx8IFRPREFZXCJcbiAgICAgICAgICAgIChhY3RpdmVZZWFyTW9udGhDaGFuZ2UpPVwidXNlclJpZ2h0QWN0aXZlWWVhck1vbnRoJC5uZXh0KCRldmVudClcIlxuICAgICAgICAgICAgW2Rpc3BsYXlNaW5dPVwiKG1pbiQgfCBhc3luYykgfHwgVE9EQVlcIlxuICAgICAgICAgICAgW2Rpc3BsYXlNYXhdPVwiKG1heCQgfCBhc3luYykgfHwgVE9EQVlcIlxuICAgICAgICAgICAgW3NlbGVjdGFibGVNaW5dPVwiKHJpZ2h0TWluJCB8IGFzeW5jKSB8fCBUT0RBWVwiXG4gICAgICAgICAgICBbc2VsZWN0YWJsZU1heF09XCIocmlnaHRNYXgkIHwgYXN5bmMpIHx8IFRPREFZXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZFZhbHVlXT1cIihzZWxlY3RlZFZhbHVlJCB8IGFzeW5jKSB8fCBUT0RBWVwiXG4gICAgICAgICAgICAoZGF0ZVNlbGVjdCk9XCJ1c2VyU2VsZWN0ZWREYXRlJC5uZXh0KCRldmVudClcIlxuICAgICAgICAgID48L3Jpdi1jYWxlbmRhcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGZvb3RlciBjbGFzcz1cImJ1dHRvbnNcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICByaXZCdXR0b25cbiAgICAgICAgICAgIFtzaXplXT1cIidzbWFsbCdcIlxuICAgICAgICAgICAgW3ZhcmlhbnRdPVwiJ2dob3N0J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwidXNlclNlbGVjdGVkRGF0ZSQubmV4dCh1bmRlZmluZWQpXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIENsZWFyXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcml2QnV0dG9uXG4gICAgICAgICAgICBbc2l6ZV09XCInc21hbGwnXCJcbiAgICAgICAgICAgIFt2YXJpYW50XT1cIidwcmltYXJ5J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwib3BlbiQubmV4dChmYWxzZSlcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgRG9uZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Zvb3Rlcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvcml2LWNhbGxvdXQ+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==