@rivet-health/design-system 40.44.0 → 40.44.2

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 (321) hide show
  1. package/{esm2020 → esm2022}/lib/accessibility/sr-only/sr-only.component.mjs +4 -4
  2. package/esm2022/lib/download/download.service.mjs +47 -0
  3. package/{esm2020 → esm2022}/lib/format/pipes/common.mjs +5 -5
  4. package/{esm2020 → esm2022}/lib/format/pipes/date.pipe.mjs +4 -4
  5. package/{esm2020 → esm2022}/lib/format/pipes/days.pipe.mjs +4 -4
  6. package/{esm2020 → esm2022}/lib/format/pipes/dollars.pipe.mjs +4 -4
  7. package/{esm2020 → esm2022}/lib/format/pipes/number.pipe.mjs +4 -4
  8. package/{esm2020 → esm2022}/lib/format/pipes/percentage.pipe.mjs +4 -4
  9. package/esm2022/lib/format/pipes/sentence-case.pipe.mjs +61 -0
  10. package/esm2022/lib/format/pipes/small-currency.pipe.mjs +24 -0
  11. package/esm2022/lib/format/pipes/small-number.pipe.mjs +29 -0
  12. package/esm2022/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +62 -0
  13. package/esm2022/lib/format/truncate/truncate.component.mjs +51 -0
  14. package/esm2022/lib/icon/dom-cache.mjs +32 -0
  15. package/esm2022/lib/icon/icon.component.mjs +86 -0
  16. package/{esm2020 → esm2022}/lib/icon/icons.mjs +1 -1
  17. package/{esm2020 → esm2022}/lib/input/alphabetic-field/alphabetic-field.component.mjs +4 -4
  18. package/esm2022/lib/input/auto-focus/auto-focus.directive.mjs +48 -0
  19. package/esm2022/lib/input/button/button.component.mjs +139 -0
  20. package/esm2022/lib/input/button-group/button-group.component.mjs +39 -0
  21. package/{esm2020 → esm2022}/lib/input/calendar/calendar.component.mjs +4 -4
  22. package/{esm2020 → esm2022}/lib/input/card-checkbox/card-checkbox.component.mjs +4 -4
  23. package/{esm2020 → esm2022}/lib/input/checkbox/checkbox.component.mjs +4 -4
  24. package/{esm2020 → esm2022}/lib/input/currency-field/currency-field.component.mjs +4 -4
  25. package/esm2022/lib/input/date/date.component.mjs +279 -0
  26. package/esm2022/lib/input/date-range/date-range.component.mjs +477 -0
  27. package/esm2022/lib/input/filter-chip/filter-chip.component.mjs +47 -0
  28. package/{esm2020 → esm2022}/lib/input/filter-dropdown/filter-dropdown.component.mjs +5 -5
  29. package/{esm2020 → esm2022}/lib/input/input-label/input-label.component.mjs +4 -4
  30. package/esm2022/lib/input/mentions-input/mentions-input.component.mjs +745 -0
  31. package/esm2022/lib/input/number-field/number-field.component.mjs +125 -0
  32. package/{esm2020 → esm2022}/lib/input/percentage-field/percentage-field.component.mjs +4 -4
  33. package/esm2022/lib/input/phone-field/phone-field.component.mjs +74 -0
  34. package/{esm2020 → esm2022}/lib/input/radio/radio.component.mjs +4 -4
  35. package/{esm2020 → esm2022}/lib/input/search/search.component.mjs +4 -4
  36. package/esm2022/lib/input/search-select/search-select.component.mjs +189 -0
  37. package/esm2022/lib/input/select/select/select.component.mjs +178 -0
  38. package/{esm2020 → esm2022}/lib/input/select/select-node/select-node.component.mjs +4 -4
  39. package/esm2022/lib/input/select/state.mjs +882 -0
  40. package/{esm2020 → esm2022}/lib/input/simple-select/option-group.pipe.mjs +4 -4
  41. package/esm2022/lib/input/simple-select/simple-select.component.mjs +178 -0
  42. package/esm2022/lib/input/switch-checkbox/switch-checkbox.component.mjs +33 -0
  43. package/esm2022/lib/input/text-field/text-field.component.mjs +115 -0
  44. package/{esm2020 → esm2022}/lib/input/textarea-field/textarea-field.component.mjs +4 -4
  45. package/{esm2020 → esm2022}/lib/input/validation-message/validation-message.component.mjs +4 -4
  46. package/{esm2020 → esm2022}/lib/layout/card/card-actions.component.mjs +4 -4
  47. package/esm2022/lib/layout/card/card-content.component.mjs +64 -0
  48. package/esm2022/lib/layout/card/card-header.component.mjs +201 -0
  49. package/{esm2020 → esm2022}/lib/layout/card/card-link.component.mjs +5 -5
  50. package/{esm2020 → esm2022}/lib/layout/card/card-media.component.mjs +4 -4
  51. package/esm2022/lib/layout/card/card.component.mjs +291 -0
  52. package/{esm2020 → esm2022}/lib/layout/setting-row/setting-row.component.mjs +4 -4
  53. package/esm2022/lib/load/loading/loading.component.mjs +43 -0
  54. package/{esm2020 → esm2022}/lib/load/loading-cover/loading-cover.component.mjs +4 -4
  55. package/esm2022/lib/navigation/editable-heading/editable-heading.component.mjs +243 -0
  56. package/{esm2020 → esm2022}/lib/navigation/link/link.component.mjs +6 -6
  57. package/{esm2020 → esm2022}/lib/navigation/page-header/page-header.component.mjs +4 -4
  58. package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tab/simple-tab.component.mjs +4 -4
  59. package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tabs/simple-tabs.component.mjs +4 -4
  60. package/{esm2020 → esm2022}/lib/navigation/tabs/tab/tab.component.mjs +4 -4
  61. package/{esm2020 → esm2022}/lib/navigation/tabs/tabs/tabs.component.mjs +4 -4
  62. package/{esm2020 → esm2022}/lib/navigation/views/all-views-modal/all-views-modal.component.mjs +4 -4
  63. package/{esm2020 → esm2022}/lib/navigation/views/edit-view/edit-view.component.mjs +9 -9
  64. package/esm2022/lib/navigation/views/permission-picker/permission-picker.component.mjs +151 -0
  65. package/esm2022/lib/navigation/views/state.mjs +456 -0
  66. package/{esm2020 → esm2022}/lib/navigation/views/view-menu/view-menu.component.mjs +5 -5
  67. package/esm2022/lib/navigation/views/views/views.component.mjs +90 -0
  68. package/{esm2020 → esm2022}/lib/notification/badge/badge.component.mjs +4 -4
  69. package/esm2022/lib/notification/banner/banner-action.component.mjs +48 -0
  70. package/esm2022/lib/notification/banner/banner.component.mjs +61 -0
  71. package/esm2022/lib/notification/map-indicator/map-indicator.component.mjs +50 -0
  72. package/esm2022/lib/notification/map-indicator/map-indicators.mjs +15 -0
  73. package/{esm2020 → esm2022}/lib/notification/notification-badge/notification-badge.component.mjs +4 -4
  74. package/esm2022/lib/overlay/callout/callout.component.mjs +130 -0
  75. package/esm2022/lib/overlay/callout/callout.helpers.mjs +113 -0
  76. package/{esm2020 → esm2022}/lib/overlay/callout/help/help.component.mjs +4 -4
  77. package/esm2022/lib/overlay/callout/lock-scroll.directive.mjs +69 -0
  78. package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu-item/menu-item.component.mjs +5 -5
  79. package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu.component.mjs +4 -4
  80. package/esm2022/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +30 -0
  81. package/{esm2020 → esm2022}/lib/overlay/callout/tooltip/tooltip.component.mjs +4 -4
  82. package/esm2022/lib/overlay/callout/tooltip/tooltip.directive.mjs +138 -0
  83. package/esm2022/lib/overlay/modal/dialog/dialog.component.mjs +47 -0
  84. package/{esm2020 → esm2022}/lib/overlay/modal/dialog-stack.service.mjs +4 -4
  85. package/esm2022/lib/overlay/modal/form-dialog/form-dialog.component.mjs +146 -0
  86. package/esm2022/lib/overlay/modal/modal.component.mjs +31 -0
  87. package/{esm2020 → esm2022}/lib/overlay/modal/side-sheet/side-sheet.component.mjs +4 -4
  88. package/esm2022/lib/overlay/overlay-outlet.component.mjs +98 -0
  89. package/{esm2020 → esm2022}/lib/overlay/overlay.directive.mjs +5 -5
  90. package/{esm2020 → esm2022}/lib/overlay/overlay.service.mjs +5 -5
  91. package/{esm2020 → esm2022}/lib/overlay/toast/toast-action.component.mjs +4 -4
  92. package/esm2022/lib/overlay/toast/toast.component.mjs +41 -0
  93. package/{esm2020 → esm2022}/lib/riv.module.mjs +227 -227
  94. package/esm2022/lib/size/size.directive.mjs +33 -0
  95. package/esm2022/lib/table/simple-table/coordinate-helper.mjs +61 -0
  96. package/esm2022/lib/table/simple-table/simple-table-cell.component.mjs +36 -0
  97. package/esm2022/lib/table/simple-table/simple-table-header-cell.component.mjs +37 -0
  98. package/{esm2020 → esm2022}/lib/table/simple-table/simple-table-row.component.mjs +4 -4
  99. package/esm2022/lib/table/simple-table/simple-table.component.mjs +104 -0
  100. package/esm2022/lib/table/table/clipboard.mjs +182 -0
  101. package/esm2022/lib/table/table/state-helpers/collapse-helpers.mjs +116 -0
  102. package/esm2022/lib/table/table/state-helpers/column-helpers.mjs +383 -0
  103. package/{esm2020 → esm2022}/lib/table/table/state-helpers/display-helpers.mjs +1 -1
  104. package/esm2022/lib/table/table/state-helpers/nesting-helpers.mjs +123 -0
  105. package/esm2022/lib/table/table/state-helpers/order-helpers.mjs +164 -0
  106. package/esm2022/lib/table/table/state-helpers/pagination-helpers.mjs +139 -0
  107. package/esm2022/lib/table/table/state-helpers/result-helpers.mjs +70 -0
  108. package/esm2022/lib/table/table/state-helpers/search-helpers.mjs +72 -0
  109. package/esm2022/lib/table/table/state-helpers/selection-helpers.mjs +180 -0
  110. package/esm2022/lib/table/table/state.mjs +1035 -0
  111. package/esm2022/lib/table/table/table/table.component.mjs +367 -0
  112. package/{esm2020 → esm2022}/lib/table/table/table-collapse-all/table-collapse-all.component.mjs +5 -5
  113. package/esm2022/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +227 -0
  114. package/esm2022/lib/table/table/table-column-settings/table-column-settings.component.mjs +134 -0
  115. package/esm2022/lib/table/table/table-csv-export/table-csv-export.component.mjs +35 -0
  116. package/{esm2020 → esm2022}/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.mjs +6 -6
  117. package/esm2022/lib/table/table/table-search/table-search.component.mjs +71 -0
  118. package/{esm2020 → esm2022}/lib/table/table/table-search-columns/table-search-columns.component.mjs +4 -4
  119. package/esm2022/lib/visibility/visibility.directive.mjs +34 -0
  120. package/esm2022/lib/visualization/chart/chart-scaling.mjs +380 -0
  121. package/esm2022/lib/visualization/chart/chart.component.mjs +626 -0
  122. package/esm2022/lib/visualization/chart/chart.mjs +3768 -0
  123. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-cell.component.mjs +5 -5
  124. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-header-cell.component.mjs +4 -4
  125. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-row.component.mjs +4 -4
  126. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table.component.mjs +4 -4
  127. package/{esm2020 → esm2022}/lib/visualization/donut/donut.component.mjs +4 -4
  128. package/{esm2020 → esm2022}/lib/visualization/funnel-chart/funnel-chart.component.mjs +5 -5
  129. package/esm2022/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +33 -0
  130. package/{esm2020 → esm2022}/lib/visualization/highlight/highlight.component.mjs +4 -4
  131. package/esm2022/lib/visualization/highlight/highlight.helpers.mjs +20 -0
  132. package/esm2022/lib/visualization/intervals.mjs +63 -0
  133. package/{esm2020 → esm2022}/lib/visualization/issue/issue.component.mjs +4 -4
  134. package/{esm2020 → esm2022}/lib/visualization/legend-item/legend-item.component.mjs +4 -4
  135. package/{esm2020 → esm2022}/lib/visualization/metric/metric.component.mjs +4 -4
  136. package/{esm2020 → esm2022}/lib/visualization/mini-pie/mini-pie.component.mjs +4 -4
  137. package/{esm2020 → esm2022}/lib/visualization/progress/progress.component.mjs +5 -5
  138. package/esm2022/lib/visualization/stacked-column/stacked-column.component.mjs +377 -0
  139. package/esm2022/lib/visualization/stacked-column/stacked-column.helpers.mjs +18 -0
  140. package/esm2022/lib/visualization/stacked-row/stacked-row.component.mjs +270 -0
  141. package/esm2022/lib/visualization/stacked-row/stacked-row.helpers.mjs +74 -0
  142. package/esm2022/lib/visualization/time-series/time-series.component.mjs +374 -0
  143. package/esm2022/lib/visualization/time-series/time-series.helpers.mjs +15 -0
  144. package/esm2022/lib/visualization/trend/trend.component.mjs +51 -0
  145. package/{esm2020 → esm2022}/lib/visualization/zero-state/zero-state.component.mjs +4 -4
  146. package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs +670 -670
  147. package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs.map +1 -1
  148. package/lib/format/svg-text-truncate/svg-text-truncate.directive.d.ts +1 -1
  149. package/lib/format/truncate/truncate.component.d.ts +1 -1
  150. package/lib/icon/icon.component.d.ts +1 -1
  151. package/lib/input/auto-focus/auto-focus.directive.d.ts +1 -1
  152. package/lib/input/button/button.component.d.ts +1 -1
  153. package/lib/input/calendar/calendar.component.d.ts +1 -1
  154. package/lib/input/checkbox/checkbox.component.d.ts +1 -1
  155. package/lib/input/currency-field/currency-field.component.d.ts +1 -1
  156. package/lib/input/date/date.component.d.ts +1 -1
  157. package/lib/input/date-range/date-range.component.d.ts +1 -1
  158. package/lib/input/filter-chip/filter-chip.component.d.ts +1 -1
  159. package/lib/input/filter-dropdown/filter-dropdown.component.d.ts +1 -1
  160. package/lib/input/input-label/input-label.component.d.ts +1 -1
  161. package/lib/input/mentions-input/mentions-input.component.d.ts +1 -1
  162. package/lib/input/number-field/number-field.component.d.ts +1 -1
  163. package/lib/input/percentage-field/percentage-field.component.d.ts +1 -1
  164. package/lib/input/phone-field/phone-field.component.d.ts +1 -1
  165. package/lib/input/radio/radio.component.d.ts +1 -1
  166. package/lib/input/search/search.component.d.ts +1 -1
  167. package/lib/input/search-select/search-select.component.d.ts +1 -1
  168. package/lib/input/select/select/select.component.d.ts +1 -1
  169. package/lib/input/select/select-node/select-node.component.d.ts +1 -1
  170. package/lib/input/simple-select/simple-select.component.d.ts +1 -1
  171. package/lib/input/switch-checkbox/switch-checkbox.component.d.ts +1 -1
  172. package/lib/input/text-field/text-field.component.d.ts +1 -1
  173. package/lib/input/textarea-field/textarea-field.component.d.ts +1 -1
  174. package/lib/input/validation-message/validation-message.component.d.ts +1 -1
  175. package/lib/layout/card/card-actions.component.d.ts +1 -1
  176. package/lib/layout/card/card-content.component.d.ts +1 -1
  177. package/lib/layout/card/card-header.component.d.ts +1 -1
  178. package/lib/layout/card/card-link.component.d.ts +1 -1
  179. package/lib/layout/card/card-media.component.d.ts +1 -1
  180. package/lib/layout/card/card.component.d.ts +1 -1
  181. package/lib/layout/setting-row/setting-row.component.d.ts +1 -1
  182. package/lib/load/loading/loading.component.d.ts +1 -1
  183. package/lib/load/loading-cover/loading-cover.component.d.ts +1 -1
  184. package/lib/navigation/editable-heading/editable-heading.component.d.ts +1 -1
  185. package/lib/navigation/link/link.component.d.ts +1 -1
  186. package/lib/navigation/page-header/page-header.component.d.ts +1 -1
  187. package/lib/navigation/simple-tabs/simple-tab/simple-tab.component.d.ts +1 -1
  188. package/lib/navigation/tabs/tab/tab.component.d.ts +1 -1
  189. package/lib/navigation/views/all-views-modal/all-views-modal.component.d.ts +1 -1
  190. package/lib/navigation/views/edit-view/edit-view.component.d.ts +1 -1
  191. package/lib/navigation/views/permission-picker/permission-picker.component.d.ts +3 -3
  192. package/lib/navigation/views/view-menu/view-menu.component.d.ts +1 -1
  193. package/lib/navigation/views/views/views.component.d.ts +1 -1
  194. package/lib/notification/badge/badge.component.d.ts +1 -1
  195. package/lib/notification/banner/banner-action.component.d.ts +1 -1
  196. package/lib/notification/banner/banner.component.d.ts +1 -1
  197. package/lib/notification/map-indicator/map-indicator.component.d.ts +1 -1
  198. package/lib/notification/notification-badge/notification-badge.component.d.ts +1 -1
  199. package/lib/overlay/callout/callout.component.d.ts +1 -1
  200. package/lib/overlay/callout/help/help.component.d.ts +1 -1
  201. package/lib/overlay/callout/lock-scroll.directive.d.ts +1 -1
  202. package/lib/overlay/callout/menu/menu-item/menu-item.component.d.ts +1 -1
  203. package/lib/overlay/callout/menu/menu.component.d.ts +1 -1
  204. package/lib/overlay/callout/tooltip/locked-tooltip.directive.d.ts +1 -1
  205. package/lib/overlay/callout/tooltip/tooltip.component.d.ts +1 -1
  206. package/lib/overlay/callout/tooltip/tooltip.directive.d.ts +1 -1
  207. package/lib/overlay/modal/dialog/dialog.component.d.ts +1 -1
  208. package/lib/overlay/modal/form-dialog/form-dialog.component.d.ts +1 -1
  209. package/lib/overlay/modal/modal.component.d.ts +1 -1
  210. package/lib/overlay/modal/side-sheet/side-sheet.component.d.ts +1 -1
  211. package/lib/overlay/toast/toast.component.d.ts +1 -1
  212. package/lib/table/simple-table/simple-table-header-cell.component.d.ts +1 -1
  213. package/lib/table/simple-table/simple-table-row.component.d.ts +1 -1
  214. package/lib/table/table/table/table.component.d.ts +1 -1
  215. package/lib/table/table/table-collapse-all/table-collapse-all.component.d.ts +1 -1
  216. package/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.d.ts +1 -1
  217. package/lib/table/table/table-column-settings/table-column-settings.component.d.ts +1 -1
  218. package/lib/table/table/table-csv-export/table-csv-export.component.d.ts +1 -1
  219. package/lib/table/table/table-search/table-search.component.d.ts +1 -1
  220. package/lib/table/table/table-search-columns/table-search-columns.component.d.ts +1 -1
  221. package/lib/visualization/chart/chart.component.d.ts +1 -1
  222. package/lib/visualization/data-table/data-table-row.component.d.ts +1 -1
  223. package/lib/visualization/donut/donut.component.d.ts +1 -1
  224. package/lib/visualization/funnel-chart/funnel-chart.component.d.ts +1 -1
  225. package/lib/visualization/highlight/highlight.component.d.ts +1 -1
  226. package/lib/visualization/issue/issue.component.d.ts +1 -1
  227. package/lib/visualization/legend-item/legend-item.component.d.ts +1 -1
  228. package/lib/visualization/metric/metric.component.d.ts +1 -1
  229. package/lib/visualization/mini-pie/mini-pie.component.d.ts +1 -1
  230. package/lib/visualization/progress/progress.component.d.ts +1 -1
  231. package/lib/visualization/stacked-column/stacked-column.component.d.ts +3 -3
  232. package/lib/visualization/stacked-row/stacked-row.component.d.ts +1 -1
  233. package/lib/visualization/time-series/time-series.component.d.ts +3 -3
  234. package/lib/visualization/trend/trend.component.d.ts +1 -1
  235. package/lib/visualization/zero-state/zero-state.component.d.ts +1 -1
  236. package/package.json +5 -11
  237. package/esm2020/lib/download/download.service.mjs +0 -47
  238. package/esm2020/lib/format/pipes/sentence-case.pipe.mjs +0 -61
  239. package/esm2020/lib/format/pipes/small-currency.pipe.mjs +0 -24
  240. package/esm2020/lib/format/pipes/small-number.pipe.mjs +0 -29
  241. package/esm2020/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +0 -62
  242. package/esm2020/lib/format/truncate/truncate.component.mjs +0 -51
  243. package/esm2020/lib/icon/dom-cache.mjs +0 -32
  244. package/esm2020/lib/icon/icon.component.mjs +0 -86
  245. package/esm2020/lib/input/auto-focus/auto-focus.directive.mjs +0 -48
  246. package/esm2020/lib/input/button/button.component.mjs +0 -139
  247. package/esm2020/lib/input/button-group/button-group.component.mjs +0 -39
  248. package/esm2020/lib/input/date/date.component.mjs +0 -279
  249. package/esm2020/lib/input/date-range/date-range.component.mjs +0 -477
  250. package/esm2020/lib/input/filter-chip/filter-chip.component.mjs +0 -47
  251. package/esm2020/lib/input/mentions-input/mentions-input.component.mjs +0 -745
  252. package/esm2020/lib/input/number-field/number-field.component.mjs +0 -125
  253. package/esm2020/lib/input/phone-field/phone-field.component.mjs +0 -74
  254. package/esm2020/lib/input/search-select/search-select.component.mjs +0 -189
  255. package/esm2020/lib/input/select/select/select.component.mjs +0 -178
  256. package/esm2020/lib/input/select/state.mjs +0 -882
  257. package/esm2020/lib/input/simple-select/simple-select.component.mjs +0 -178
  258. package/esm2020/lib/input/switch-checkbox/switch-checkbox.component.mjs +0 -33
  259. package/esm2020/lib/input/text-field/text-field.component.mjs +0 -115
  260. package/esm2020/lib/layout/card/card-content.component.mjs +0 -64
  261. package/esm2020/lib/layout/card/card-header.component.mjs +0 -201
  262. package/esm2020/lib/layout/card/card.component.mjs +0 -291
  263. package/esm2020/lib/load/loading/loading.component.mjs +0 -43
  264. package/esm2020/lib/navigation/editable-heading/editable-heading.component.mjs +0 -243
  265. package/esm2020/lib/navigation/views/permission-picker/permission-picker.component.mjs +0 -151
  266. package/esm2020/lib/navigation/views/state.mjs +0 -456
  267. package/esm2020/lib/navigation/views/views/views.component.mjs +0 -90
  268. package/esm2020/lib/notification/banner/banner-action.component.mjs +0 -48
  269. package/esm2020/lib/notification/banner/banner.component.mjs +0 -61
  270. package/esm2020/lib/notification/map-indicator/map-indicator.component.mjs +0 -50
  271. package/esm2020/lib/notification/map-indicator/map-indicators.mjs +0 -15
  272. package/esm2020/lib/overlay/callout/callout.component.mjs +0 -130
  273. package/esm2020/lib/overlay/callout/callout.helpers.mjs +0 -113
  274. package/esm2020/lib/overlay/callout/lock-scroll.directive.mjs +0 -69
  275. package/esm2020/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +0 -30
  276. package/esm2020/lib/overlay/callout/tooltip/tooltip.directive.mjs +0 -138
  277. package/esm2020/lib/overlay/modal/dialog/dialog.component.mjs +0 -47
  278. package/esm2020/lib/overlay/modal/form-dialog/form-dialog.component.mjs +0 -146
  279. package/esm2020/lib/overlay/modal/modal.component.mjs +0 -31
  280. package/esm2020/lib/overlay/overlay-outlet.component.mjs +0 -98
  281. package/esm2020/lib/overlay/toast/toast.component.mjs +0 -41
  282. package/esm2020/lib/size/size.directive.mjs +0 -33
  283. package/esm2020/lib/table/simple-table/coordinate-helper.mjs +0 -61
  284. package/esm2020/lib/table/simple-table/simple-table-cell.component.mjs +0 -36
  285. package/esm2020/lib/table/simple-table/simple-table-header-cell.component.mjs +0 -37
  286. package/esm2020/lib/table/simple-table/simple-table.component.mjs +0 -104
  287. package/esm2020/lib/table/table/clipboard.mjs +0 -182
  288. package/esm2020/lib/table/table/state-helpers/collapse-helpers.mjs +0 -116
  289. package/esm2020/lib/table/table/state-helpers/column-helpers.mjs +0 -383
  290. package/esm2020/lib/table/table/state-helpers/nesting-helpers.mjs +0 -123
  291. package/esm2020/lib/table/table/state-helpers/order-helpers.mjs +0 -164
  292. package/esm2020/lib/table/table/state-helpers/pagination-helpers.mjs +0 -139
  293. package/esm2020/lib/table/table/state-helpers/result-helpers.mjs +0 -70
  294. package/esm2020/lib/table/table/state-helpers/search-helpers.mjs +0 -72
  295. package/esm2020/lib/table/table/state-helpers/selection-helpers.mjs +0 -180
  296. package/esm2020/lib/table/table/state.mjs +0 -1035
  297. package/esm2020/lib/table/table/table/table.component.mjs +0 -367
  298. package/esm2020/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +0 -227
  299. package/esm2020/lib/table/table/table-column-settings/table-column-settings.component.mjs +0 -134
  300. package/esm2020/lib/table/table/table-csv-export/table-csv-export.component.mjs +0 -35
  301. package/esm2020/lib/table/table/table-search/table-search.component.mjs +0 -71
  302. package/esm2020/lib/visibility/visibility.directive.mjs +0 -34
  303. package/esm2020/lib/visualization/chart/chart-scaling.mjs +0 -380
  304. package/esm2020/lib/visualization/chart/chart.component.mjs +0 -626
  305. package/esm2020/lib/visualization/chart/chart.mjs +0 -3768
  306. package/esm2020/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +0 -33
  307. package/esm2020/lib/visualization/highlight/highlight.helpers.mjs +0 -20
  308. package/esm2020/lib/visualization/intervals.mjs +0 -63
  309. package/esm2020/lib/visualization/stacked-column/stacked-column.component.mjs +0 -377
  310. package/esm2020/lib/visualization/stacked-column/stacked-column.helpers.mjs +0 -18
  311. package/esm2020/lib/visualization/stacked-row/stacked-row.component.mjs +0 -270
  312. package/esm2020/lib/visualization/stacked-row/stacked-row.helpers.mjs +0 -74
  313. package/esm2020/lib/visualization/time-series/time-series.component.mjs +0 -374
  314. package/esm2020/lib/visualization/time-series/time-series.helpers.mjs +0 -15
  315. package/esm2020/lib/visualization/trend/trend.component.mjs +0 -51
  316. package/fesm2015/rivet-health-design-system.mjs +0 -18370
  317. package/fesm2015/rivet-health-design-system.mjs.map +0 -1
  318. /package/{esm2020 → esm2022}/lib/overlay/callout/select-callout-defaults.mjs +0 -0
  319. /package/{esm2020 → esm2022}/lib/util/local-storage.mjs +0 -0
  320. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  321. /package/{esm2020 → esm2022}/rivet-health-design-system.mjs +0 -0
@@ -1,882 +0,0 @@
1
- import Fuse from 'fuse.js';
2
- import { defaultsDeep, flattenDeep, isNumber, sortBy } from 'lodash';
3
- import { connectable, map, merge, ReplaySubject, scan, startWith, Subject, } from 'rxjs';
4
- import { NumberPipe } from '../../format/pipes/number.pipe';
5
- export var RivSelect;
6
- (function (RivSelect) {
7
- /////////////
8
- // Options //
9
- /////////////
10
- /**
11
- * The OptionSet class provides Set-like functionality, but uniqueness is
12
- * determined by the option's ID rather than the object reference.
13
- */
14
- class OptionSet extends Set {
15
- constructor(values) {
16
- super();
17
- // Parallel id → option map so has()/add()/delete() are O(1) instead of
18
- // spreading the Set and linear-scanning it. Rebuilding an O(N²) lookup
19
- // for a 16k-option selection was the primary cause of the multi-minute
20
- // freeze that surfaced RVT-25383's tree-select scale problem.
21
- this.byId = new Map();
22
- if (values) {
23
- for (const value of values) {
24
- this.add(value);
25
- }
26
- }
27
- }
28
- has(option) {
29
- return this.byId.has(option.id);
30
- }
31
- add(option) {
32
- const existing = this.byId.get(option.id);
33
- if (existing === option) {
34
- // Same object reference — nothing to update. Ancestor re-adds
35
- // during a selection snapshot hit this path repeatedly, so keeping
36
- // it O(1) is what prevents the tree-select N² blow-up seen in
37
- // RVT-25470.
38
- return this;
39
- }
40
- if (existing !== undefined) {
41
- // Different reference, same id — swap the stored ref while
42
- // preserving Set insertion order. The rebuild is O(N), but this
43
- // path is rare in practice (the hot ancestor-snapshot loop takes
44
- // the identity fast-path above).
45
- const items = [...this].map(o => (o.id === option.id ? option : o));
46
- this.byId.set(option.id, option);
47
- super.clear();
48
- for (const item of items)
49
- super.add(item);
50
- }
51
- else {
52
- this.byId.set(option.id, option);
53
- super.add(option);
54
- }
55
- return this;
56
- }
57
- delete(option) {
58
- const existing = this.byId.get(option.id);
59
- if (existing) {
60
- this.byId.delete(option.id);
61
- super.delete(existing);
62
- return true;
63
- }
64
- else {
65
- return false;
66
- }
67
- }
68
- clear() {
69
- this.byId.clear();
70
- super.clear();
71
- }
72
- }
73
- RivSelect.OptionSet = OptionSet;
74
- const MIN_OPTIONS_FOR_CONTROLS = 5;
75
- const DEFAULT_DISPLAY_LIMIT = 100;
76
- function createManager(source, options) {
77
- const defaultState = {
78
- query: {
79
- search: '',
80
- order: 'title',
81
- },
82
- load: {
83
- loading: false,
84
- error: null,
85
- },
86
- sourceOptionGroups: [],
87
- originalOptionGroups: [],
88
- selection: {
89
- selected: new OptionSet(),
90
- },
91
- display: {
92
- placeholder: 'Select',
93
- open: false,
94
- expandedOptions: new Set(),
95
- },
96
- };
97
- const defaultedInitialState = defaultsDeep({}, options?.initialState, defaultState);
98
- const actions = new Subject();
99
- const internalActions = new Subject();
100
- const coreStateWithSelectionSnapshot = merge(actions, internalActions).pipe(scan(([state, snapshot], action) => {
101
- const newState = sideEffects(reduce(state, action, options), action, source, internalActions);
102
- const newSelectionSnapshot = (action.type === 'openChange' && action.open) ||
103
- (action.type === 'loadComplete' &&
104
- (newState.display.open || options?.inline))
105
- ? createSelectionSnapshotWithAncestors(newState)
106
- : snapshot;
107
- return [newState, newSelectionSnapshot];
108
- }, [defaultedInitialState, new OptionSet()]), startWith([
109
- defaultedInitialState,
110
- new OptionSet(),
111
- ]));
112
- const state = connectable(coreStateWithSelectionSnapshot.pipe(map(([s, selectionAtOpen]) => {
113
- const allOptionGroups = s.sourceOptionGroups.map(optionGroup => {
114
- return {
115
- ...optionGroup,
116
- options: optionGroup.options.map(option => augmentOptionToFullOption(s, option, options)),
117
- };
118
- });
119
- const topLevelOptions = getTopLevelOptions(allOptionGroups);
120
- const sortedOptionGroups = options?.sortSelectedToTop ?? options?.allowMultiSelect
121
- ? sortOptionsByPreviouslySelectedState(allOptionGroups, selectionAtOpen)
122
- : allOptionGroups;
123
- const displayLimit = options?.displayLimit ?? DEFAULT_DISPLAY_LIMIT;
124
- const displayLimitedOptionGroups = applyDisplayLimit(sortedOptionGroups, displayLimit);
125
- const fullOptionGroups = applySelectedOptionLimit(s, displayLimitedOptionGroups, topLevelOptions, options);
126
- return {
127
- ...s,
128
- query: {
129
- ...s.query,
130
- showSearch: !!s.query.search ||
131
- (!!options?.allowSearch &&
132
- countAllOptions(allOptionGroups) >
133
- MIN_OPTIONS_FOR_CONTROLS) ||
134
- countAllOptions(allOptionGroups) > displayLimit,
135
- searchPlaceholder: options?.searchPlaceholder ?? 'Search',
136
- showOrder: !!options?.allowOrder &&
137
- !s.query.search &&
138
- countAllOptions(allOptionGroups) > MIN_OPTIONS_FOR_CONTROLS,
139
- },
140
- fullOptionGroups,
141
- selection: {
142
- ...s.selection,
143
- allowMultiSelect: !!options?.allowMultiSelect,
144
- allowSelectAll: !!options?.allowSelectAll &&
145
- options?.selectedOptionLimit == undefined,
146
- visibleSelectionState: getParentMultiSelectionState(topLevelOptions),
147
- },
148
- display: {
149
- ...s.display,
150
- formattedSelectedOptions: getFormattedOptionsForDisplay(s, topLevelOptions, options),
151
- zeroStateMessage: getZeroStateMessage(s),
152
- dividers: !!options?.dividers,
153
- inline: !!options?.inline,
154
- maxHeight: options?.maxHeight ?? null,
155
- maxWidth: options?.maxWidth ?? null,
156
- minHeight: options?.minHeight ?? null,
157
- minWidth: options?.minWidth ?? null,
158
- displayLimitMessage: getDisplayLimitMessage(countVisibleOptions(fullOptionGroups, !!s.query.search), countVisibleOptions(allOptionGroups, !!s.query.search), s.query),
159
- showSingleSelected: !!options?.showSingleSelected,
160
- pillCount: getPillCountForDisplay(s, topLevelOptions, options),
161
- },
162
- };
163
- })), {
164
- connector: () => new ReplaySubject(1),
165
- resetOnDisconnect: false,
166
- });
167
- state.connect();
168
- // Load the options immediately for selects that are displayed inline.
169
- if (options?.inline)
170
- actions.next({ type: 'load' });
171
- return { actions, state };
172
- }
173
- RivSelect.createManager = createManager;
174
- function createInMemoryManager(fetchDataset, options) {
175
- let data;
176
- let fuse;
177
- let exactMatch = false;
178
- let parents;
179
- let children;
180
- const source = async (query, mostRecentAction) => {
181
- /*
182
- Re-fetch the options on the load action, and rebuild the state
183
- derived from the option data.
184
- */
185
- if (mostRecentAction.type === 'load' ||
186
- mostRecentAction.type === 'openChange') {
187
- data = await fetchDataset();
188
- const topLevelOptions = getTopLevelOptions(data);
189
- fuse = new Fuse(flattenOptions(topLevelOptions, false), {
190
- threshold: 0.2,
191
- keys: ['title'],
192
- includeScore: true,
193
- includeMatches: true,
194
- ...options?.fuseOptions,
195
- });
196
- exactMatch = options?.fuseOptions?.threshold == 0;
197
- [parents, children] = getRelationshipMaps(topLevelOptions);
198
- }
199
- // Leading/trailing whitespace shouldn't affect fuzzy matching (Fuse
200
- // scores the pattern's length against the text's, so a stray space
201
- // changes results in surprising ways); a search string of only
202
- // whitespace is treated the same as no search.
203
- const search = query.search.trim();
204
- /*
205
- If the user is not searching options, return the full set of options
206
- sorted appropriately.
207
- */
208
- if (!search) {
209
- /*
210
- The `source` order property allows for opting out of automatic
211
- sorting, returning the data in its natural input order.
212
- */
213
- if (query.order === 'source')
214
- return data;
215
- /*
216
- Sort the options by title and subtitle.
217
- */
218
- if (query.order === 'title') {
219
- function sortByTitle(options) {
220
- return sortBy(options, [
221
- (o) => o.title.toLowerCase(),
222
- (o) => o.subtitle?.toLowerCase() ?? '',
223
- ]).map(option => ({
224
- ...option,
225
- children: option.children?.length
226
- ? sortByTitle(option.children)
227
- : undefined,
228
- }));
229
- }
230
- return data.map(group => ({
231
- ...group,
232
- options: sortByTitle(group.options),
233
- }));
234
- }
235
- /*
236
- Sort the options by count, then by title, then by subtitle.
237
- */
238
- if (query.order === 'count') {
239
- function sortByCount(options) {
240
- return sortBy(options, [
241
- (o) => (isNumber(o.count) ? -o.count : Infinity),
242
- (o) => o.title.toLowerCase(),
243
- (o) => o.subtitle?.toLowerCase() ?? '',
244
- ]).map(option => ({
245
- ...option,
246
- children: option.children?.length
247
- ? sortByCount(option.children)
248
- : undefined,
249
- }));
250
- }
251
- return data.map(group => ({
252
- ...group,
253
- options: sortByCount(group.options),
254
- }));
255
- }
256
- }
257
- /*
258
- Execute the search with fuse. Once we have the search match data,
259
- rebuild just as much of the tree as is needed to render the search
260
- results. Specifically, any match will need all of its ancestors (so
261
- that matched leaf nodes are shown nested under their ancestors) and all
262
- of its children (because a matching parent means that all of its
263
- descendants match too, per the design specification), whether they
264
- themselves matched or not.
265
- */
266
- const matchedOptions = fuse.search(search);
267
- const matchedIds = new Set(matchedOptions.map(result => result.item.id));
268
- const matchAncestors = new Set();
269
- function collectAncestors(ids) {
270
- for (const id of ids) {
271
- const parentId = parents.get(id);
272
- if (parentId) {
273
- matchAncestors.add(parentId);
274
- collectAncestors([parentId]);
275
- }
276
- }
277
- }
278
- collectAncestors([...matchedIds]);
279
- const matchDescendants = new Set();
280
- function collectDescendants(ids) {
281
- for (const id of ids) {
282
- const childrenIds = children.get(id);
283
- if (childrenIds) {
284
- for (const child of childrenIds) {
285
- matchDescendants.add(child);
286
- }
287
- collectDescendants(childrenIds);
288
- }
289
- }
290
- }
291
- collectDescendants([...matchedIds]);
292
- /*
293
- Next, we'll combine all the matched IDs with their direct ancestors and
294
- descandants, and filter the original data set down to just these
295
- options.
296
- */
297
- const filteredIds = new Set([
298
- ...matchedIds,
299
- ...matchAncestors,
300
- ...matchDescendants,
301
- ]);
302
- function filterOptions(options) {
303
- const filteredOptions = [];
304
- for (const option of options) {
305
- if (filteredIds.has(option.id)) {
306
- filteredOptions.push({
307
- ...option,
308
- children: option.children?.length
309
- ? filterOptions(option.children)
310
- : undefined,
311
- });
312
- }
313
- }
314
- return filteredOptions;
315
- }
316
- const filteredOptions = filterOptions(getTopLevelOptions(data));
317
- /*
318
- At this point, we have an array of distinct trees (top-level options),
319
- filtered down to only the options matching the search query. Note that
320
- we don't care about section headers when searching since results should
321
- be ordered by relevance. To calculate the order of these trees, we'll
322
- take the total match scores for options found in the tree, divided by
323
- the count of matches in the tree (the best average match score).
324
- */
325
- const scoreMap = new Map(matchedOptions.map(result => [result.item.id, result.score ?? 0]));
326
- const ordered = sortBy(filteredOptions, (option) => {
327
- function calculateScore(option) {
328
- return ((scoreMap.get(option.id) ?? 0) +
329
- (option.children ?? []).reduce((score, child) => score + calculateScore(child), 0));
330
- }
331
- function calculateCount(option) {
332
- return (1 +
333
- (option.children ?? []).reduce((count, child) => count + calculateCount(child), 0));
334
- }
335
- const totalScore = calculateScore(option);
336
- const totalCount = calculateCount(option);
337
- return totalScore / totalCount;
338
- });
339
- const highlightMap = new Map(matchedOptions.map(result => {
340
- const highlights = {};
341
- for (const match of result.matches ?? []) {
342
- // filter out inexact matches
343
- if (exactMatch && match.value != null) {
344
- match.indices = match.indices.filter(isFuseMatchExact(match, search));
345
- }
346
- if (match.key === 'title') {
347
- highlights.titleHighlightIndices = [...match.indices];
348
- }
349
- if (match.key === 'subtitle') {
350
- highlights.subtitleHighlightIndices = [...match.indices];
351
- }
352
- }
353
- return [result.item.id, highlights];
354
- }));
355
- function addHighlightsToOption(options) {
356
- return options.map(option => ({
357
- ...option,
358
- ...highlightMap.get(option.id),
359
- ...(option.children?.length
360
- ? { children: addHighlightsToOption(option.children) }
361
- : null),
362
- }));
363
- }
364
- return {
365
- data: [{ options: addHighlightsToOption(ordered) }],
366
- originalData: data,
367
- };
368
- };
369
- return createManager(source, options);
370
- }
371
- RivSelect.createInMemoryManager = createInMemoryManager;
372
- function isFuseMatchExact(match, search) {
373
- return matchedIndices => {
374
- const matchedValue = match
375
- .value.slice(matchedIndices[0], matchedIndices[1] + 1)
376
- .toLowerCase();
377
- // fuse is weird with it's matches. For a text of "planning" and a search string of "plan"
378
- // the matched value will be "plann" with the extra 'n' because of its fuzzy matching.
379
- // so just make sure the matched value at least starts with the search string.
380
- // it's extra weird because for a text of "analytics" and a search string of "nalytics",
381
- // the matched value will be "analytics". So we just need to make sure the the matched value
382
- // includes the search string because there might be extra stuff on the front or the end.
383
- return matchedValue.includes(search.toLowerCase());
384
- };
385
- }
386
- RivSelect.isFuseMatchExact = isFuseMatchExact;
387
- //////////////////////////////////
388
- // State reducer (with helpers) //
389
- //////////////////////////////////
390
- function createSelectionSnapshotWithAncestors(state) {
391
- const snapshot = new OptionSet(state.selection.selected);
392
- const topLevelOptions = getTopLevelOptions(state.sourceOptionGroups);
393
- const [parents] = getRelationshipMaps(topLevelOptions);
394
- // Sibling leaves share ancestors, so once we've walked up through a
395
- // given parent id we can stop — anything above it has already been
396
- // added by a previous iteration. Without this short-circuit the loop
397
- // re-runs findOption (which is a full tree walk) once per shared
398
- // ancestor edge, which was the #2 hotspot behind OptionSet.add in
399
- // RVT-25470's profile.
400
- const visited = new Set();
401
- for (const selectedOption of state.selection.selected) {
402
- let parentId = parents.get(selectedOption.id);
403
- while (parentId !== undefined && !visited.has(parentId)) {
404
- visited.add(parentId);
405
- const parentOption = findOption(topLevelOptions, parentId);
406
- if (parentOption) {
407
- snapshot.add(parentOption);
408
- }
409
- parentId = parents.get(parentId);
410
- }
411
- }
412
- return snapshot;
413
- }
414
- function getDisplayLimitMessage(displayedOptionCount, totalOptionCount, query) {
415
- if (displayedOptionCount === totalOptionCount)
416
- return null;
417
- const rivNumber = new NumberPipe();
418
- const displayed = rivNumber.transform(displayedOptionCount);
419
- const total = rivNumber.transform(totalOptionCount);
420
- const start = `Showing ${displayed} of ${total} options`;
421
- return query.search ? `${start} matching "${query.search}"` : start;
422
- }
423
- function countVisibleOptions(optionGroups, leafOnly) {
424
- function count(options) {
425
- return options.reduce((acc, option) => {
426
- if (option.expanded && option.children?.length) {
427
- return acc + (leafOnly ? 0 : 1) + count(option.children);
428
- }
429
- return acc + 1;
430
- }, 0);
431
- }
432
- return optionGroups.reduce((total, group) => total + count(group.options), 0);
433
- }
434
- function countAllOptions(optionGroups) {
435
- function count(options) {
436
- return options.reduce((acc, option) => {
437
- if (option.children?.length) {
438
- return acc + 1 + count(option.children);
439
- }
440
- return acc + 1;
441
- }, 0);
442
- }
443
- return optionGroups.reduce((total, group) => total + count(group.options), 0);
444
- }
445
- function applyDisplayLimit(optionGroups, displayLimit) {
446
- function filterWithLimit(options, remaining) {
447
- let left = remaining;
448
- const visibleOptions = [];
449
- for (const option of options) {
450
- if (left <= 0)
451
- break;
452
- if (option.expanded && option.children?.length) {
453
- const [childOptions, childRemaining] = filterWithLimit(option.children, left - 1);
454
- visibleOptions.push({
455
- ...option,
456
- children: childOptions,
457
- });
458
- left = childRemaining;
459
- }
460
- else {
461
- visibleOptions.push(option);
462
- left--;
463
- }
464
- }
465
- return [visibleOptions, left];
466
- }
467
- const startingValue = [[], displayLimit];
468
- const [resolvedGroups] = optionGroups.reduce(([groups, remaining], group) => {
469
- const [options, leftAfter] = filterWithLimit(group.options, remaining);
470
- if (options.length) {
471
- return [[...groups, { ...group, options }], leftAfter];
472
- }
473
- else {
474
- return [groups, remaining];
475
- }
476
- }, startingValue);
477
- return resolvedGroups;
478
- }
479
- /*
480
- Sort options so that previously selected options (from prior sessions)
481
- appear at the top of their peer/sibling lists.
482
- */
483
- function sortOptionsByPreviouslySelectedState(optionGroups, selectionAtOpen) {
484
- function sortOptions(options) {
485
- return sortBy(options, option => !selectionAtOpen.has(option)).map(option => {
486
- if (option.children) {
487
- return {
488
- ...option,
489
- children: sortOptions(option.children),
490
- };
491
- }
492
- else
493
- return option;
494
- });
495
- }
496
- return optionGroups.map(group => ({
497
- ...group,
498
- options: sortOptions(group.options),
499
- }));
500
- }
501
- /*
502
- If we are restricting how many options are selected to a specific limit,
503
- when we are at that limit, disable all options not currently selected.
504
- */
505
- function applySelectedOptionLimit(state, optionGroups, topLevelOptions, options) {
506
- if (options?.selectedOptionLimit === undefined) {
507
- return optionGroups;
508
- }
509
- // When useTopLevelOptionsForDisplay is true and search is active, count
510
- // selected top-level options from the original (unfiltered) data to ensure
511
- // already-selected options that don't match the search are still counted.
512
- const useOriginalForCounting = options?.useTopLevelOptionsForDisplay &&
513
- state.query.search &&
514
- state.originalOptionGroups.length > 0;
515
- const topOptionsForCounting = useOriginalForCounting
516
- ? getTopLevelOptions(state.originalOptionGroups).map(option => augmentOptionToFullOption(state, option, options))
517
- : topLevelOptions;
518
- const selectedOrIndeterminateTopOptions = topOptionsForCounting.filter(option => option.selected != false);
519
- const numSelectedOptions = options?.useTopLevelOptionsForDisplay
520
- ? selectedOrIndeterminateTopOptions.length
521
- : state.selection.selected.size;
522
- const selectedOptionLimit = options.selectedOptionLimit;
523
- // If we have less items selected than the limit, business as usual.
524
- if (numSelectedOptions < selectedOptionLimit) {
525
- return optionGroups;
526
- }
527
- // If we have equal items selected to the limit (or more), prevent users from selecting more options.
528
- function disableUnselectedItems(currentOptions, optionsAreChildrenOfSelectedGroup) {
529
- const updatedItems = [];
530
- for (const option of currentOptions) {
531
- const isDisabledOrUnselected = !!option.disabled || (option.selectable && option.selected == false);
532
- const isCurrentOptionSelected = option.selectable && option.selected != false;
533
- const isCurrentOrParentOptionSelected = isCurrentOptionSelected || optionsAreChildrenOfSelectedGroup;
534
- const forceEnabledBasedOnParent = !!options?.useTopLevelOptionsForDisplay &&
535
- optionsAreChildrenOfSelectedGroup;
536
- const markDisabled = isDisabledOrUnselected && !forceEnabledBasedOnParent;
537
- if (option.children?.length) {
538
- const childOptions = disableUnselectedItems(option.children, isCurrentOrParentOptionSelected);
539
- updatedItems.push({
540
- ...option,
541
- disabled: !!markDisabled,
542
- children: childOptions,
543
- });
544
- }
545
- else {
546
- updatedItems.push({
547
- ...option,
548
- disabled: !!markDisabled,
549
- });
550
- }
551
- }
552
- return updatedItems;
553
- }
554
- const groupsAfterLimit = [];
555
- for (const currentGroup of optionGroups) {
556
- groupsAfterLimit.push({
557
- ...currentGroup,
558
- options: disableUnselectedItems(currentGroup.options, false),
559
- });
560
- }
561
- return groupsAfterLimit;
562
- }
563
- function getRelationshipMaps(options) {
564
- const parents = new Map();
565
- function buildParentsMap(options, parent) {
566
- for (const option of options) {
567
- if (parent) {
568
- parents.set(option.id, parent.id);
569
- }
570
- if (option.children?.length) {
571
- buildParentsMap(option.children, option);
572
- }
573
- }
574
- }
575
- buildParentsMap(options);
576
- const children = new Map();
577
- function buildChildrenMap(options) {
578
- for (const option of options) {
579
- if (option.children?.length) {
580
- children.set(option.id, option.children.map(({ id }) => id));
581
- buildChildrenMap(option.children);
582
- }
583
- }
584
- }
585
- buildChildrenMap(options);
586
- return [parents, children];
587
- }
588
- function getTopLevelOptions(optionGroups) {
589
- return optionGroups.reduce((options, group) => [...options, ...group.options], []);
590
- }
591
- function getParentMultiSelectionState(children) {
592
- if (children.every(child => child.selected === true))
593
- return true;
594
- if (children.every(child => child.selected === false))
595
- return false;
596
- return 'indeterminate';
597
- }
598
- function augmentOptionToFullOption(state, option, managerOptions) {
599
- if (option.children?.length) {
600
- const augmentedChildren = option.children.map(child => augmentOptionToFullOption(state, child, managerOptions));
601
- const selectableWhenSearching = managerOptions?.allowSelectNonLeafDuringSearch ?? false;
602
- // When allowSelectNonLeafDuringSearch is enabled and search is active,
603
- // calculate selection state from ALL original children, not just the
604
- // filtered ones visible in search results.
605
- const useOriginalForSelectionState = managerOptions?.allowSelectNonLeafDuringSearch &&
606
- state.query.search &&
607
- state.originalOptionGroups.length > 0;
608
- let selected;
609
- if (useOriginalForSelectionState) {
610
- const originalOption = findOption(getTopLevelOptions(state.originalOptionGroups), option.id);
611
- if (originalOption) {
612
- const allLeaves = flattenOptions([originalOption], true);
613
- const selectedCount = allLeaves.filter(leaf => state.selection.selected.has(leaf)).length;
614
- if (selectedCount === 0) {
615
- selected = false;
616
- }
617
- else if (selectedCount === allLeaves.length) {
618
- selected = true;
619
- }
620
- else {
621
- selected = 'indeterminate';
622
- }
623
- }
624
- else {
625
- selected = getParentMultiSelectionState(augmentedChildren);
626
- }
627
- }
628
- else {
629
- selected = getParentMultiSelectionState(augmentedChildren);
630
- }
631
- return {
632
- ...option,
633
- children: augmentedChildren,
634
- selected,
635
- expanded: state.query.search
636
- ? true
637
- : state.display.expandedOptions.has(option.id),
638
- selectable: !state.query.search || selectableWhenSearching,
639
- expandable: !state.query.search,
640
- };
641
- }
642
- return {
643
- ...option,
644
- children: undefined,
645
- selected: state.selection.selected.has(option),
646
- expanded: false,
647
- selectable: true,
648
- expandable: false,
649
- };
650
- }
651
- function getFormattedOptionsForDisplay(state, topLevelOptions, options) {
652
- // If we have a custom display function, use it
653
- if (options?.getCustomOptionDisplay) {
654
- return options.getCustomOptionDisplay([...state.selection.selected]);
655
- }
656
- if (options?.useTopLevelOptionsForDisplay) {
657
- return getTopLevelFormattedOptionsForDisplay(topLevelOptions);
658
- }
659
- // Otherwise, use the default display for options - titles separated by commas.
660
- return [...state.selection.selected].map(({ title }) => title).join(', ');
661
- }
662
- function getTopLevelFormattedOptionsForDisplay(topLevelOptions) {
663
- if (!topLevelOptions || topLevelOptions.length == 0) {
664
- return '';
665
- }
666
- const selectedOrIndeterminateTopOptions = topLevelOptions.filter(option => option.selected != false);
667
- return selectedOrIndeterminateTopOptions
668
- .map(({ title }) => title)
669
- .join(', ');
670
- }
671
- function getPillCountForDisplay(state, topLevelOptions, options) {
672
- if (options?.useTopLevelOptionsForDisplay) {
673
- const selectedOrIndeterminateTopOptions = topLevelOptions.filter(option => option.selected != false);
674
- return selectedOrIndeterminateTopOptions.length;
675
- }
676
- return state.selection.selected.size;
677
- }
678
- function getZeroStateMessage(state) {
679
- if (state.sourceOptionGroups.every(group => group.options.length === 0)) {
680
- if (state.query.search)
681
- return 'No results found.';
682
- return 'No options.';
683
- }
684
- return null;
685
- }
686
- function findOption(options, id) {
687
- for (const option of options) {
688
- if (option.id === id)
689
- return option;
690
- if (option.children?.length) {
691
- const child = findOption(option.children, id);
692
- if (child)
693
- return child;
694
- }
695
- }
696
- return null;
697
- }
698
- function flattenOptions(options, leafOnly) {
699
- return flattenDeep(options.map(option => {
700
- if (option.children?.length) {
701
- const descendants = option.children.map(child => flattenOptions([child], leafOnly));
702
- return leafOnly ? descendants : [option, ...descendants];
703
- }
704
- else {
705
- return [option];
706
- }
707
- }));
708
- }
709
- function toggleSelected(state, id, managerOptions) {
710
- const topLevelOptions = getTopLevelOptions(state.sourceOptionGroups);
711
- const option = findOption(topLevelOptions, id);
712
- if (!option)
713
- return state;
714
- const newSelection = new OptionSet(state.selection.selected);
715
- const newValue = !(augmentOptionToFullOption(state, option, managerOptions).selected === true);
716
- // When allowSelectNonLeafDuringSearch is enabled and search is active,
717
- // use the original (unfiltered) data to get all children, not just
718
- // those visible in the filtered search results.
719
- const useOriginalData = managerOptions?.allowSelectNonLeafDuringSearch &&
720
- state.query.search &&
721
- state.originalOptionGroups.length > 0;
722
- const optionForLeaves = useOriginalData
723
- ? findOption(getTopLevelOptions(state.originalOptionGroups), id) ?? option
724
- : option;
725
- const leaves = flattenOptions([optionForLeaves], true);
726
- for (const leaf of leaves) {
727
- if (newValue) {
728
- newSelection.add(leaf);
729
- }
730
- else {
731
- newSelection.delete(leaf);
732
- }
733
- }
734
- return {
735
- ...state,
736
- selection: {
737
- selected: newSelection,
738
- },
739
- };
740
- }
741
- function setSelectedOption(state, id) {
742
- const topLevelOptions = getTopLevelOptions(state.sourceOptionGroups);
743
- const option = findOption(topLevelOptions, id);
744
- if (!option)
745
- return state;
746
- const newSelection = new OptionSet();
747
- newSelection.add(option);
748
- return {
749
- ...state,
750
- selection: {
751
- selected: newSelection,
752
- },
753
- };
754
- }
755
- function toggleVisibleSelected(state) {
756
- const leaves = flattenOptions(getTopLevelOptions(state.sourceOptionGroups), true);
757
- const isAllSelected = leaves.every(leaf => state.selection.selected.has(leaf));
758
- const newSelection = new OptionSet(state.selection.selected);
759
- for (const leaf of leaves) {
760
- if (isAllSelected)
761
- newSelection.delete(leaf);
762
- else
763
- newSelection.add(leaf);
764
- }
765
- return {
766
- ...state,
767
- selection: {
768
- ...state.selection,
769
- selected: newSelection,
770
- },
771
- };
772
- }
773
- function toggleOptionExpanded(state, id) {
774
- const newValue = !state.display.expandedOptions.has(id);
775
- const newExpandedOptions = new Set(state.display.expandedOptions);
776
- if (newValue)
777
- newExpandedOptions.add(id);
778
- else
779
- newExpandedOptions.delete(id);
780
- return {
781
- ...state,
782
- display: {
783
- ...state.display,
784
- expandedOptions: newExpandedOptions,
785
- },
786
- };
787
- }
788
- function sideEffects(state, action, source, internalActions) {
789
- if (action.type === 'load' ||
790
- action.type === 'searchChange' ||
791
- action.type === 'orderChange' ||
792
- (action.type === 'openChange' && action.open)) {
793
- source(state.query, action)
794
- .then(result => {
795
- const data = Array.isArray(result) ? result : result.data;
796
- const originalData = Array.isArray(result)
797
- ? undefined
798
- : result.originalData;
799
- internalActions.next({ type: 'loadComplete', data, originalData });
800
- })
801
- .catch(error => {
802
- // eslint-disable-next-line no-console
803
- console.error(error);
804
- internalActions.next({ type: 'loadError', error });
805
- });
806
- return {
807
- ...state,
808
- load: {
809
- loading: true,
810
- error: null,
811
- },
812
- };
813
- }
814
- return state;
815
- }
816
- function reduce(state, action, managerOptions) {
817
- switch (action.type) {
818
- case 'load':
819
- return state;
820
- case 'loadComplete':
821
- return {
822
- ...state,
823
- load: {
824
- loading: false,
825
- error: null,
826
- },
827
- sourceOptionGroups: action.data,
828
- originalOptionGroups: action.originalData ?? [],
829
- };
830
- case 'loadError':
831
- return {
832
- ...state,
833
- load: {
834
- loading: false,
835
- error: action.error,
836
- },
837
- };
838
- case 'openChange':
839
- return {
840
- ...state,
841
- query: {
842
- ...state.query,
843
- search: '',
844
- },
845
- display: {
846
- ...state.display,
847
- open: action.open,
848
- },
849
- };
850
- case 'searchChange':
851
- return {
852
- ...state,
853
- query: {
854
- ...state.query,
855
- search: action.payload,
856
- },
857
- };
858
- case 'orderChange':
859
- return {
860
- ...state,
861
- query: {
862
- ...state.query,
863
- order: action.payload,
864
- },
865
- };
866
- case 'selectionChange':
867
- return {
868
- ...state,
869
- selection: action.payload,
870
- };
871
- case 'toggleOptionSelected':
872
- return toggleSelected(state, action.id, managerOptions);
873
- case 'setSelectedOption':
874
- return setSelectedOption(state, action.id);
875
- case 'visibleSelectedChange':
876
- return toggleVisibleSelected(state);
877
- case 'toggleOptionExpanded':
878
- return toggleOptionExpanded(state, action.id);
879
- }
880
- }
881
- })(RivSelect || (RivSelect = {}));
882
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9pbnB1dC9zZWxlY3Qvc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUtOLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDckUsT0FBTyxFQUNMLFdBQVcsRUFFWCxHQUFHLEVBQ0gsS0FBSyxFQUVMLGFBQWEsRUFDYixJQUFJLEVBQ0osU0FBUyxFQUNULE9BQU8sR0FDUixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUc1RCxNQUFNLEtBQVcsU0FBUyxDQXk4Q3pCO0FBejhDRCxXQUFpQixTQUFTO0lBQ3hCLGFBQWE7SUFDYixhQUFhO0lBQ2IsYUFBYTtJQXVHYjs7O09BR0c7SUFDSCxNQUFhLFNBQWdDLFNBQVEsR0FBb0I7UUFPdkUsWUFBWSxNQUF5QztZQUNuRCxLQUFLLEVBQUUsQ0FBQztZQVBWLHVFQUF1RTtZQUN2RSx1RUFBdUU7WUFDdkUsdUVBQXVFO1lBQ3ZFLDhEQUE4RDtZQUM3QyxTQUFJLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7WUFJMUQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7b0JBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ2pCO2FBQ0Y7UUFDSCxDQUFDO1FBRVEsR0FBRyxDQUFDLE1BQXVDO1lBQ2xELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFUSxHQUFHLENBQUMsTUFBdUI7WUFDbEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxD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QU8saUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3QyxLQUFLLHVCQUF1QjtnQkFDMUIsT0FBTyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QyxLQUFLLHNCQUFzQjtnQkFDekIsT0FBTyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2pEO0lBQ0gsQ0FBQztBQUNILENBQUMsRUF6OENnQixTQUFTLEtBQVQsU0FBUyxRQXk4Q3pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEZ1c2UsIHtcbiAgRnVzZVJlc3VsdCxcbiAgRnVzZVJlc3VsdE1hdGNoLFxuICBJRnVzZU9wdGlvbnMsXG4gIFJhbmdlVHVwbGUsXG59IGZyb20gJ2Z1c2UuanMnO1xuaW1wb3J0IHsgZGVmYXVsdHNEZWVwLCBmbGF0dGVuRGVlcCwgaXNOdW1iZXIsIHNvcnRCeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBjb25uZWN0YWJsZSxcbiAgQ29ubmVjdGFibGUsXG4gIG1hcCxcbiAgbWVyZ2UsXG4gIE9ic2VydmFibGUsXG4gIFJlcGxheVN1YmplY3QsXG4gIHNjYW4sXG4gIHN0YXJ0V2l0aCxcbiAgU3ViamVjdCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEZWVwUGFydGlhbCB9IGZyb20gJ3V0aWxpdHktdHlwZXMnO1xuaW1wb3J0IHsgTnVtYmVyUGlwZSB9IGZyb20gJy4uLy4uL2Zvcm1hdC9waXBlcy9udW1iZXIucGlwZSc7XG5pbXBvcnQgeyBIaWdobGlnaHRDb21wb25lbnQgfSBmcm9tICcuLi8uLi92aXN1YWxpemF0aW9uL2hpZ2hsaWdodC9oaWdobGlnaHQuY29tcG9uZW50JztcblxuZXhwb3J0IG5hbWVzcGFjZSBSaXZTZWxlY3Qge1xuICAvLy8vLy8vLy8vLy8vXG4gIC8vIE9wdGlvbnMgLy9cbiAgLy8vLy8vLy8vLy8vL1xuXG4gIC8qKlxuICAgKiDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAtLS0tLS0tLS0tLS0tLS0tLS0t4pSA4pSA4pSA4pSQXG4gICAqIOKUgiBCYXNlT3B0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIJcbiAgICog4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilIIgVGhlIGNvcmUgZGF0YSByZXF1aXJlZCBmb3IgZWFjaCBvcHRpb24gICAg4pSCXG4gICAqIOKUgiAoc3VjaCBhcyBpZCBhbmQgdGl0bGUpLiAgICAgICAgICAgICAgICAgICDilIJcbiAgICog4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSALS0tLS0tLS0tLS0tLS0tLS0tLeKUgOKUgOKUpFxuICAgKiDilIIgT3B0aW9uIChCYXNlT3B0aW9uICsgY2hpbGRyZW4pICAgICAgICAgICAg4pSCXG4gICAqIOKUgiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIJcbiAgICog4pSCIFByb3ZpZGVzIHJlY3Vyc2l2ZSB0eXBlIHNhZmV0eSB0byB0aGUgICAgIOKUglxuICAgKiDilIIgdHlwZSBzYWZldHkgdG8gdGhlIEJhc2VPcHRpb24uICAgICAgICAgICAg4pSCXG4gICAqIOKUlOKUgC0tLS0tLS0tLS0tLS0tLS0tLeKUrC0tLS0tLS3ilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICogICAgICAgICAgICAgICAgICAgICB8XG4gICAqIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKWvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgKiDilIIgU291cmNlT3B0aW9uIChPcHRpb24gKyBzZWFyY2ggaGlnaGxpZ2h0cykg4pSCXG4gICAqIOKUgiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIJcbiAgICog4pSCIEFkZHMgc2VhcmNoIGhpZ2hsaWdodHMgdG8gdGhlIE9wdGlvbiBhbmQgIOKUglxuICAgKiDilIIgaXMgdGhlIHJldHVybiB0eXBlIGZvciB0aGUgb3B0aW9uIFNvdXJjZSAg4pSCXG4gICAqIOKUgiAoZGF0YSBmZXRjaGVyKSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICDilIJcbiAgICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gICAqICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilrzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAgICog4pSCIEZ1bGxPcHRpb24gKFNvdXJjZU9wdGlvbiArIFVJIHN0YXRlKSAgICAgIOKUglxuICAgKiDilIIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCXG4gICAqIOKUgiBBdWdtZW50cyB0aGUgU291cmNlT3B0aW9uIHdpdGggYWxsIG9mIHRoZSDilIJcbiAgICog4pSCIFVJIGluZm9ybWF0aW9uIGZyb20gb3RoZXIgcGFydHMgb2YgdGhlICAgIOKUglxuICAgKiDilIIgc3RhdGUsIHN1Y2ggYXMgc2VsZWN0aW9uIHN0YXR1cywgd2hldGhlciAg4pSCXG4gICAqIOKUgiBvciBub3QgdGhlIG5vZGUgaXMgZXhwYW5kZWQsIGV0Yy4gICAgICAgICDilIJcbiAgICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgdXNhZ2VzIG9mIE9taXQ8Li4uPiBpbiB0aGlzIHNlY3Rpb24gYXJlIG5vdCByZXF1aXJlZCwgYnV0XG4gICAqIGRvIGhlbHAgaW4tZWRpdG9yIHR5cGUgaGludHMgdG8gYmUgbW9yZSBjbGVhciBhbmQgZGlyZWN0LlxuICAgKi9cblxuICBleHBvcnQgdHlwZSBCYXNlT3B0aW9uID0ge1xuICAgIGlkOiBzdHJpbmcgfCBudW1iZXI7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBzdWJ0aXRsZT86IHN0cmluZztcbiAgICBoZWxwPzogc3RyaW5nO1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlZEV4cGxhbmF0aW9uPzogc3RyaW5nO1xuICB9O1xuICBleHBvcnQgdHlwZSBPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24gPSBCYXNlT3B0aW9uPiA9IE8gJiB7XG4gICAgY2hpbGRyZW4/OiBPcHRpb248Tz5bXTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBTb3VyY2VPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gT21pdDxcbiAgICBPcHRpb248Tz4sXG4gICAgJ2NoaWxkcmVuJ1xuICA+ICYge1xuICAgIHRpdGxlSGlnaGxpZ2h0SW5kaWNlcz86IEhpZ2hsaWdodENvbXBvbmVudC5IaWdobGlnaHRJbmRpY2VzW107XG4gICAgc3VidGl0bGVIaWdobGlnaHRJbmRpY2VzPzogSGlnaGxpZ2h0Q29tcG9uZW50LkhpZ2hsaWdodEluZGljZXNbXTtcbiAgICBjaGlsZHJlbj86IFNvdXJjZU9wdGlvbjxPPltdO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIE11bHRpU2VsZWN0aW9uU3RhdGUgPSBib29sZWFuIHwgJ2luZGV0ZXJtaW5hdGUnO1xuXG4gIGV4cG9ydCB0eXBlIEZ1bGxPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gT21pdDxcbiAgICBTb3VyY2VPcHRpb248Tz4sXG4gICAgJ2NoaWxkcmVuJ1xuICA+ICYge1xuICAgIHNlbGVjdGVkOiBNdWx0aVNlbGVjdGlvblN0YXRlO1xuICAgIGV4cGFuZGVkOiBib29sZWFuO1xuICAgIHNlbGVjdGFibGU6IGJvb2xlYW47XG4gICAgZXhwYW5kYWJsZTogYm9vbGVhbjtcbiAgICBjaGlsZHJlbj86IEZ1bGxPcHRpb248Tz5bXTtcbiAgfTtcblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vXG4gIC8vIE9wdGlvbiBncm91cHMgLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIC8qKlxuICAgKiBUaGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIE9wdGlvbkdyb3VwLCBTb3VyY2VPcHRpb25Hcm91cCwgYW5kXG4gICAqIEZ1bGxPcHRpb25Hcm91cCBpcyBhbmFsb2dvdXMgdG8gdGhlIG9wdGlvbiB0eXBlcyBhYm92ZS5cbiAgICpcbiAgICogQXMgd2l0aCBiZWZvcmUsIHRoZSB1c2Ugb2YgT21pdDwuLi4+IGlzIG5vdCByZXF1aXJlZCBidXQgaGVscGZ1bC5cbiAgICovXG5cbiAgZXhwb3J0IHR5cGUgT3B0aW9uR3JvdXA8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0ge1xuICAgIGhlYWRlcj86IHN0cmluZztcbiAgICAvKiogSW5mbyBpY29uICsgdG9vbHRpcCBzaG93biBiZXNpZGUgdGhlIGhlYWRlci4gTm8tb3Agd2l0aG91dCBhIGhlYWRlci4gKi9cbiAgICBoZWxwPzogc3RyaW5nO1xuICAgIG9wdGlvbnM6IE9wdGlvbjxPPltdO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFNvdXJjZU9wdGlvbkdyb3VwPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPiA9IE9taXQ8XG4gICAgT3B0aW9uR3JvdXA8Tz4sXG4gICAgJ29wdGlvbnMnXG4gID4gJiB7XG4gICAgb3B0aW9uczogU291cmNlT3B0aW9uPE8+W107XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgRnVsbE9wdGlvbkdyb3VwPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPiA9IE9taXQ8XG4gICAgU291cmNlT3B0aW9uR3JvdXA8Tz4sXG4gICAgJ29wdGlvbnMnXG4gID4gJiB7XG4gICAgb3B0aW9uczogRnVsbE9wdGlvbjxPPltdO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgT3B0aW9uU2V0IGNsYXNzIHByb3ZpZGVzIFNldC1saWtlIGZ1bmN0aW9uYWxpdHksIGJ1dCB1bmlxdWVuZXNzIGlzXG4gICAqIGRldGVybWluZWQgYnkgdGhlIG9wdGlvbidzIElEIHJhdGhlciB0aGFuIHRoZSBvYmplY3QgcmVmZXJlbmNlLlxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIE9wdGlvblNldDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gZXh0ZW5kcyBTZXQ8U291cmNlT3B0aW9uPE8+PiB7XG4gICAgLy8gUGFyYWxsZWwgaWQg4oaSIG9wdGlvbiBtYXAgc28gaGFzKCkvYWRkKCkvZGVsZXRlKCkgYXJlIE8oMSkgaW5zdGVhZCBvZlxuICAgIC8vIHNwcmVhZGluZyB0aGUgU2V0IGFuZCBsaW5lYXItc2Nhbm5pbmcgaXQuIFJlYnVpbGRpbmcgYW4gTyhOwrIpIGxvb2t1cFxuICAgIC8vIGZvciBhIDE2ay1vcHRpb24gc2VsZWN0aW9uIHdhcyB0aGUgcHJpbWFyeSBjYXVzZSBvZiB0aGUgbXVsdGktbWludXRlXG4gICAgLy8gZnJlZXplIHRoYXQgc3VyZmFjZWQgUlZULTI1MzgzJ3MgdHJlZS1zZWxlY3Qgc2NhbGUgcHJvYmxlbS5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGJ5SWQgPSBuZXcgTWFwPE9bJ2lkJ10sIFNvdXJjZU9wdGlvbjxPPj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHZhbHVlcz86IEl0ZXJhYmxlPFNvdXJjZU9wdGlvbjxPPj4gfCBudWxsKSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgaWYgKHZhbHVlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICAgIHRoaXMuYWRkKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG92ZXJyaWRlIGhhcyhvcHRpb246IFNvdXJjZU9wdGlvbjxPPiB8IEZ1bGxPcHRpb248Tz4pIHtcbiAgICAgIHJldHVybiB0aGlzLmJ5SWQuaGFzKG9wdGlvbi5pZCk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgYWRkKG9wdGlvbjogU291cmNlT3B0aW9uPE8+KSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuYnlJZC5nZXQob3B0aW9uLmlkKTtcbiAgICAgIGlmIChleGlzdGluZyA9PT0gb3B0aW9uKSB7XG4gICAgICAgIC8vIFNhbWUgb2JqZWN0IHJlZmVyZW5jZSDigJQgbm90aGluZyB0byB1cGRhdGUuIEFuY2VzdG9yIHJlLWFkZHNcbiAgICAgICAgLy8gZHVyaW5nIGEgc2VsZWN0aW9uIHNuYXBzaG90IGhpdCB0aGlzIHBhdGggcmVwZWF0ZWRseSwgc28ga2VlcGluZ1xuICAgICAgICAvLyBpdCBPKDEpIGlzIHdoYXQgcHJldmVudHMgdGhlIHRyZWUtc2VsZWN0IE7CsiBibG93LXVwIHNlZW4gaW5cbiAgICAgICAgLy8gUlZULTI1NDcwLlxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmIChleGlzdGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIERpZmZlcmVudCByZWZlcmVuY2UsIHNhbWUgaWQg4oCUIHN3YXAgdGhlIHN0b3JlZCByZWYgd2hpbGVcbiAgICAgICAgLy8gcHJlc2VydmluZyBTZXQgaW5zZXJ0aW9uIG9yZGVyLiBUaGUgcmVidWlsZCBpcyBPKE4pLCBidXQgdGhpc1xuICAgICAgICAvLyBwYXRoIGlzIHJhcmUgaW4gcHJhY3RpY2UgKHRoZSBob3QgYW5jZXN0b3Itc25hcHNob3QgbG9vcCB0YWtlc1xuICAgICAgICAvLyB0aGUgaWRlbnRpdHkgZmFzdC1wYXRoIGFib3ZlKS5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBbLi4udGhpc10ubWFwKG8gPT4gKG8uaWQgPT09IG9wdGlvbi5pZCA/IG9wdGlvbiA6IG8pKTtcbiAgICAgICAgdGhpcy5ieUlkLnNldChvcHRpb24uaWQsIG9wdGlvbik7XG4gICAgICAgIHN1cGVyLmNsZWFyKCk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgc3VwZXIuYWRkKGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ieUlkLnNldChvcHRpb24uaWQsIG9wdGlvbik7XG4gICAgICAgIHN1cGVyLmFkZChvcHRpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGVsZXRlKG9wdGlvbjogU291cmNlT3B0aW9uPE8+KSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuYnlJZC5nZXQob3B0aW9uLmlkKTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICB0aGlzLmJ5SWQuZGVsZXRlKG9wdGlvbi5pZCk7XG4gICAgICAgIHN1cGVyLmRlbGV0ZShleGlzdGluZyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIG92ZXJyaWRlIGNsZWFyKCkge1xuICAgICAgdGhpcy5ieUlkLmNsZWFyKCk7XG4gICAgICBzdXBlci5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIC8vLy8vLy8vLy8vXG4gIC8vIFN0YXRlIC8vXG4gIC8vLy8vLy8vLy8vXG5cbiAgLyoqXG4gICAqIFRoZSBDb3JlU3RhdGUgcHJvdmlkZXMgYWxsIG9mIHRoZSBmb3VuZGF0aW9uYWwgcGllY2VzIG9mIHN0YXRlIHJlcXVpcmVkXG4gICAqIGZvciBhIHdvcmtpbmcgY29tcG9uZW50LiBGdWxsU3RhdGUgaXMgYSBwdXJlIGRlcml2YXRpb24gb2YgQ29yZVN0YXRlIHBsdXNcbiAgICogdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYW5kIHByb3ZpZGVzIGNvbnZlbmllbmNlcyBmb3IgcmVuZGVyaW5nIHRoZVxuICAgKiBjb21wb25lbnRzLiBBY3Rpb25zIGFuZCB0aGUgY29yZSBzdGF0ZSBhcmUgcGFzc2VkIHRvIHRoZSByZWR1Y2VyIHRvXG4gICAqIHByb2R1Y2UgbmV3IENvcmVTdGF0ZXMgKHdoaWNoIGFyZSB0aGVuIHVzZWQgdG8gY2FsY3VsYXRlIG5ldyBGdWxsU3RhdGVzKS5cbiAgICpcbiAgICog4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAqIOKUgiAgVUkgIOKXhOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgKiDilJTilIDilIDilKzilIDilIDilIDilJggICAgICAgIOKUglxuICAgKiAgICDilIIgICAgICAgICAgICDilIJcbiAgICog4pSM4pSA4pSA4pa84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAg4pSCXG4gICAqIOKUgiAgQWN0aW9ucyAg4pSCICAg4pSCXG4gICAqIOKUlOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIOKUglxuICAgKiAgICDilIIgICAgICAgICAgICDilIJcbiAgICog4pSM4pSA4pSA4pa84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS04pSA4pSQXG4gICAqIOKUgiAgU3RhdGUgcmVkdWNlciAg4pSCXG4gICAqIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgKi9cblxuICBleHBvcnQgdHlwZSBPcmRlckJ5ID0gJ3RpdGxlJyB8ICdjb3VudCcgfCAnc291cmNlJztcblxuICBjb25zdCBNSU5fT1BUSU9OU19GT1JfQ09OVFJPTFMgPSA1O1xuXG4gIGNvbnN0IERFRkFVTFRfRElTUExBWV9MSU1JVCA9IDEwMDtcblxuICBleHBvcnQgdHlwZSBDb3JlU3RhdGU8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0ge1xuICAgIHF1ZXJ5OiB7XG4gICAgICBzZWFyY2g6IHN0cmluZztcbiAgICAgIG9yZGVyOiBPcmRlckJ5O1xuICAgIH07XG4gICAgbG9hZDoge1xuICAgICAgbG9hZGluZzogYm9vbGVhbjtcbiAgICAgIGVycm9yOiB1bmtub3duIHwgbnVsbDtcbiAgICB9O1xuICAgIHNvdXJjZU9wdGlvbkdyb3VwczogU291cmNlT3B0aW9uR3JvdXA8Tz5bXTtcbiAgICAvKipcbiAgICAgKiBTdG9yZXMgdGhlIHVuZmlsdGVyZWQgb3JpZ2luYWwgb3B0aW9uIGdyb3VwcyB3aGVuIHNlYXJjaCBmaWx0ZXJpbmcgaXMgYWN0aXZlLlxuICAgICAqIFVzZWQgYnkgYGFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaGAgdG8gc2VsZWN0IGFsbCBjaGlsZHJlbiBvZiBhIHBhcmVudCxcbiAgICAgKiBpbmNsdWRpbmcgdGhvc2Ugbm90IHZpc2libGUgaW4gdGhlIGZpbHRlcmVkIHNlYXJjaCByZXN1bHRzLlxuICAgICAqL1xuICAgIG9yaWdpbmFsT3B0aW9uR3JvdXBzOiBTb3VyY2VPcHRpb25Hcm91cDxPPltdO1xuICAgIHNlbGVjdGlvbjoge1xuICAgICAgc2VsZWN0ZWQ6IE9wdGlvblNldDxPPjtcbiAgICB9O1xuICAgIGRpc3BsYXk6IHtcbiAgICAgIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gICAgICBvcGVuOiBib29sZWFuO1xuICAgICAgZXhwYW5kZWRPcHRpb25zOiBTZXQ8T1snaWQnXT47XG4gICAgfTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBGdWxsU3RhdGU8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gQ29yZVN0YXRlPE8+ICYge1xuICAgIHF1ZXJ5OiB7XG4gICAgICBzaG93U2VhcmNoOiBib29sZWFuO1xuICAgICAgc2VhcmNoUGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICAgIHNob3dPcmRlcjogYm9vbGVhbjtcbiAgICB9O1xuICAgIGZ1bGxPcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdO1xuICAgIHNlbGVjdGlvbjoge1xuICAgICAgYWxsb3dNdWx0aVNlbGVjdDogYm9vbGVhbjtcbiAgICAgIGFsbG93U2VsZWN0QWxsOiBib29sZWFuO1xuICAgICAgdmlzaWJsZVNlbGVjdGlvblN0YXRlOiBNdWx0aVNlbGVjdGlvblN0YXRlO1xuICAgIH07XG4gICAgZGlzcGxheToge1xuICAgICAgZm9ybWF0dGVkU2VsZWN0ZWRPcHRpb25zOiBzdHJpbmc7XG4gICAgICB6ZXJvU3RhdGVNZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgICAgZGl2aWRlcnM6IGJvb2xlYW47XG4gICAgICBpbmxpbmU6IGJvb2xlYW47XG4gICAgICBtYXhIZWlnaHQ6IHN0cmluZyB8IG51bGw7XG4gICAgICBtYXhXaWR0aDogc3RyaW5nIHwgbnVsbDtcbiAgICAgIG1pbkhlaWdodDogc3RyaW5nIHwgbnVsbDtcbiAgICAgIG1pbldpZHRoOiBzdHJpbmcgfCBudWxsO1xuICAgICAgZGlzcGxheUxpbWl0TWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbiAgICAgIHNob3dTaW5nbGVTZWxlY3RlZDogYm9vbGVhbjtcbiAgICAgIHBpbGxDb3VudDogbnVtYmVyO1xuICAgIH07XG4gIH07XG5cbiAgLy8vLy8vLy8vLy8vL1xuICAvLyBBY3Rpb25zIC8vXG4gIC8vLy8vLy8vLy8vLy9cblxuICBleHBvcnQgdHlwZSBBY3Rpb248TyBleHRlbmRzIEJhc2VPcHRpb24+ID1cbiAgICB8IHsgdHlwZTogJ2xvYWQnIH1cbiAgICB8IHsgdHlwZTogJ29wZW5DaGFuZ2UnOyBvcGVuOiBib29sZWFuIH1cbiAgICB8IHsgdHlwZTogJ3NlYXJjaENoYW5nZSc7IHBheWxvYWQ6IHN0cmluZyB9XG4gICAgfCB7IHR5cGU6ICdvcmRlckNoYW5nZSc7IHBheWxvYWQ6IE9yZGVyQnkgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnc2VsZWN0aW9uQ2hhbmdlJztcbiAgICAgICAgcGF5bG9hZDogQ29yZVN0YXRlPE8+WydzZWxlY3Rpb24nXTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3RvZ2dsZU9wdGlvblNlbGVjdGVkJztcbiAgICAgICAgaWQ6IE9bJ2lkJ107XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdzZXRTZWxlY3RlZE9wdGlvbic7XG4gICAgICAgIGlkOiBPWydpZCddO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAndmlzaWJsZVNlbGVjdGVkQ2hhbmdlJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3RvZ2dsZU9wdGlvbkV4cGFuZGVkJztcbiAgICAgICAgaWQ6IE9bJ2lkJ107XG4gICAgICB9O1xuXG4gIHR5cGUgSW50ZXJuYWxBY3Rpb248TyBleHRlbmRzIEJhc2VPcHRpb24+ID1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2xvYWRDb21wbGV0ZSc7XG4gICAgICAgIGRhdGE6IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgICAgIC8qKiBPcmlnaW5hbCB1bmZpbHRlcmVkIGRhdGEsIHByb3ZpZGVkIHdoZW4gc2VhcmNoIGlzIGFjdGl2ZSAqL1xuICAgICAgICBvcmlnaW5hbERhdGE/OiBTb3VyY2VPcHRpb25Hcm91cDxPPltdO1xuICAgICAgfVxuICAgIHwgeyB0eXBlOiAnbG9hZEVycm9yJzsgZXJyb3I6IHVua25vd24gfTtcblxuICAvLy8vLy8vLy8vLy9cbiAgLy8gU291cmNlIC8vXG4gIC8vLy8vLy8vLy8vL1xuXG4gIC8qKlxuICAgKiBUaGUgU291cmNlJ3Mgam9iIGlzIHRvIGZldGNoIG9wdGlvbnMgKGJhc2VkIG9uIHRoZSBjdXJyZW50IHN0YXRlKSB3aGljaFxuICAgKiB0aGVuIGJsZW5kIHdpdGggdGhlIG90aGVyIHBpZWNlcyBvZiBzdGF0ZSB0byBwcm9kdWNlIHRoZSBGdWxsU3RhdGUuXG4gICAqL1xuXG4gIGV4cG9ydCB0eXBlIFNvdXJjZVJlc3VsdDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPVxuICAgIHwgU291cmNlT3B0aW9uR3JvdXA8Tz5bXVxuICAgIHwge1xuICAgICAgICBkYXRhOiBTb3VyY2VPcHRpb25Hcm91cDxPPltdO1xuICAgICAgICAvKipcbiAgICAgICAgICogT3JpZ2luYWwgdW5maWx0ZXJlZCBkYXRhLCBwcm92aWRlZCB3aGVuIHNlYXJjaCBmaWx0ZXJpbmcgaXMgYWN0aXZlLlxuICAgICAgICAgKiBVc2VkIGJ5IGBhbGxvd1NlbGVjdE5vbkxlYWZEdXJpbmdTZWFyY2hgIHRvIHNlbGVjdCBhbGwgY2hpbGRyZW4gb2ZcbiAgICAgICAgICogYSBwYXJlbnQsIGluY2x1ZGluZyB0aG9zZSBub3QgdmlzaWJsZSBpbiB0aGUgZmlsdGVyZWQgc2VhcmNoIHJlc3VsdHMuXG4gICAgICAgICAqL1xuICAgICAgICBvcmlnaW5hbERhdGE/OiBTb3VyY2VPcHRpb25Hcm91cDxPPltdO1xuICAgICAgfTtcblxuICBleHBvcnQgdHlwZSBTb3VyY2U8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gKFxuICAgIHF1ZXJ5OiBDb3JlU3RhdGU8Tz5bJ3F1ZXJ5J10sXG4gICAgbW9zdFJlY2VudEFjdGlvbjogQWN0aW9uPE8+LFxuICApID0+IFByb21pc2U8U291cmNlUmVzdWx0PE8+PjtcblxuICAvLy8vLy8vLy8vLy8vXG4gIC8vIE1hbmFnZXIgLy9cbiAgLy8vLy8vLy8vLy8vL1xuXG4gIGV4cG9ydCB0eXBlIE1hbmFnZXI8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0ge1xuICAgIGFjdGlvbnM6IFN1YmplY3Q8QWN0aW9uPE8+PjtcbiAgICBzdGF0ZTogQ29ubmVjdGFibGU8RnVsbFN0YXRlPE8+PjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBNYW5hZ2VyT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSB7XG4gICAgaW5pdGlhbFN0YXRlPzogRGVlcFBhcnRpYWw8Q29yZVN0YXRlPE8+PjtcbiAgICBhbGxvd011bHRpU2VsZWN0PzogYm9vbGVhbjtcbiAgICBhbGxvd1NlYXJjaD86IGJvb2xlYW47XG4gICAgYWxsb3dTZWxlY3RBbGw/OiBib29sZWFuO1xuICAgIGFsbG93T3JkZXI/OiBib29sZWFuO1xuICAgIHNlYXJjaFBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgIGRpdmlkZXJzPzogYm9vbGVhbjtcbiAgICBpbmxpbmU/OiBib29sZWFuO1xuICAgIG1heEhlaWdodD86IHN0cmluZyB8IG51bGw7XG4gICAgbWF4V2lkdGg/OiBzdHJpbmcgfCBudWxsO1xuICAgIG1pbkhlaWdodD86IHN0cmluZyB8IG51bGw7XG4gICAgbWluV2lkdGg/OiBzdHJpbmcgfCBudWxsO1xuICAgIGRpc3BsYXlMaW1pdD86IG51bWJlcjtcbiAgICBzZWxlY3RlZE9wdGlvbkxpbWl0PzogbnVtYmVyO1xuICAgIHNob3dTaW5nbGVTZWxlY3RlZD86IGJvb2xlYW47XG4gICAgdXNlVG9wTGV2ZWxPcHRpb25zRm9yRGlzcGxheT86IGJvb2xlYW47XG4gICAgZ2V0Q3VzdG9tT3B0aW9uRGlzcGxheT86IChzZWxlY3RlZE9wdGlvbnM6IFNvdXJjZU9wdGlvbjxPPltdKSA9PiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCBub24tbGVhZiBub2RlcyAocGFyZW50cykgcmVtYWluIHNlbGVjdGFibGUgZHVyaW5nIHNlYXJjaCxcbiAgICAgKiBhbmQgc2VsZWN0aW5nIHRoZW0gd2lsbCBzZWxlY3QvZGVzZWxlY3QgQUxMIGNoaWxkcmVuIGZyb20gdGhlIG9yaWdpbmFsXG4gICAgICogZGF0YXNldCwgbm90IGp1c3QgdGhlIHZpc2libGUgZmlsdGVyZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIERlZmF1bHQ6IGZhbHNlIChjdXJyZW50IGJlaGF2aW9yIC0gcGFyZW50cyBhcmUgbm90IHNlbGVjdGFibGUgZHVyaW5nIHNlYXJjaClcbiAgICAgKi9cbiAgICBhbGxvd1NlbGVjdE5vbkxlYWZEdXJpbmdTZWFyY2g/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgb3B0aW9ucyB0aGF0IHdlcmUgc2VsZWN0ZWQgd2hlbiB0aGUgc2VsZWN0IHdhcyBvcGVuZWQgYXJlXG4gICAgICogc29ydGVkIHRvIHRoZSB0b3Agb2YgdGhlaXIgc2libGluZyBsaXN0cy4gU2V0IHRvIGZhbHNlIHRvIHByZXNlcnZlIHRoZVxuICAgICAqIG5hdHVyYWwgKG9yIGNob3NlbiBPcmRlckJ5KSBvcmRlciBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogRGVmYXVsdDogdGhlIHZhbHVlIG9mIGFsbG93TXVsdGlTZWxlY3RcbiAgICAgKi9cbiAgICBzb3J0U2VsZWN0ZWRUb1RvcD86IGJvb2xlYW47XG4gIH07XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1hbmFnZXI8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHNvdXJjZTogU291cmNlPE8+LFxuICAgIG9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogTWFuYWdlcjxPPiB7XG4gICAgY29uc3QgZGVmYXVsdFN0YXRlOiBDb3JlU3RhdGU8Tz4gPSB7XG4gICAgICBxdWVyeToge1xuICAgICAgICBzZWFyY2g6ICcnLFxuICAgICAgICBvcmRlcjogJ3RpdGxlJyxcbiAgICAgIH0sXG4gICAgICBsb2FkOiB7XG4gICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH0sXG4gICAgICBzb3VyY2VPcHRpb25Hcm91cHM6IFtdLFxuICAgICAgb3JpZ2luYWxPcHRpb25Hcm91cHM6IFtdLFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIHNlbGVjdGVkOiBuZXcgT3B0aW9uU2V0KCksXG4gICAgICB9LFxuICAgICAgZGlzcGxheToge1xuICAgICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgICAgIG9wZW46IGZhbHNlLFxuICAgICAgICBleHBhbmRlZE9wdGlvbnM6IG5ldyBTZXQoKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBkZWZhdWx0ZWRJbml0aWFsU3RhdGU6IENvcmVTdGF0ZTxPPiA9IGRlZmF1bHRzRGVlcChcbiAgICAgIHt9LFxuICAgICAgb3B0aW9ucz8uaW5pdGlhbFN0YXRlLFxuICAgICAgZGVmYXVsdFN0YXRlLFxuICAgICk7XG5cbiAgICBjb25zdCBhY3Rpb25zOiBTdWJqZWN0PEFjdGlvbjxPPj4gPSBuZXcgU3ViamVjdCgpO1xuICAgIGNvbnN0IGludGVybmFsQWN0aW9uczogU3ViamVjdDxJbnRlcm5hbEFjdGlvbjxPPj4gPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgY29uc3QgY29yZVN0YXRlV2l0aFNlbGVjdGlvblNuYXBzaG90OiBPYnNlcnZhYmxlPFxuICAgICAgW0NvcmVTdGF0ZTxPPiwgT3B0aW9uU2V0PE8+XVxuICAgID4gPSBtZXJnZShhY3Rpb25zLCBpbnRlcm5hbEFjdGlvbnMpLnBpcGUoXG4gICAgICBzY2FuPEFjdGlvbjxPPiB8IEludGVybmFsQWN0aW9uPE8+LCBbQ29yZVN0YXRlPE8+LCBPcHRpb25TZXQ8Tz5dPihcbiAgICAgICAgKFtzdGF0ZSwgc25hcHNob3RdLCBhY3Rpb24pID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHNpZGVFZmZlY3RzKFxuICAgICAgICAgICAgcmVkdWNlKHN0YXRlLCBhY3Rpb24sIG9wdGlvbnMpLFxuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgaW50ZXJuYWxBY3Rpb25zLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb25TbmFwc2hvdCA9XG4gICAgICAgICAgICAoYWN0aW9uLnR5cGUgPT09ICdvcGVuQ2hhbmdlJyAmJiBhY3Rpb24ub3BlbikgfHxcbiAgICAgICAgICAgIChhY3Rpb24udHlwZSA9PT0gJ2xvYWRDb21wbGV0ZScgJiZcbiAgICAgICAgICAgICAgKG5ld1N0YXRlLmRpc3BsYXkub3BlbiB8fCBvcHRpb25zPy5pbmxpbmUpKVxuICAgICAgICAgICAgICA/IGNyZWF0ZVNlbGVjdGlvblNuYXBzaG90V2l0aEFuY2VzdG9ycyhuZXdTdGF0ZSlcbiAgICAgICAgICAgICAgOiBzbmFwc2hvdDtcblxuICAgICAgICAgIHJldHVybiBbbmV3U3RhdGUsIG5ld1NlbGVjdGlvblNuYXBzaG90XTtcbiAgICAgICAgfSxcbiAgICAgICAgW2RlZmF1bHRlZEluaXRpYWxTdGF0ZSwgbmV3IE9wdGlvblNldDxPPigpXSxcbiAgICAgICksXG4gICAgICBzdGFydFdpdGg8W0NvcmVTdGF0ZTxPPiwgT3B0aW9uU2V0PE8+XT4oW1xuICAgICAgICBkZWZhdWx0ZWRJbml0aWFsU3RhdGUsXG4gICAgICAgIG5ldyBPcHRpb25TZXQ8Tz4oKSxcbiAgICAgIF0pLFxuICAgICk7XG5cbiAgICBjb25zdCBzdGF0ZTogQ29ubmVjdGFibGU8RnVsbFN0YXRlPE8+PiA9IGNvbm5lY3RhYmxlKFxuICAgICAgY29yZVN0YXRlV2l0aFNlbGVjdGlvblNuYXBzaG90LnBpcGUoXG4gICAgICAgIG1hcCgoW3MsIHNlbGVjdGlvbkF0T3Blbl0pID0+IHtcbiAgICAgICAgICBjb25zdCBhbGxPcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdID1cbiAgICAgICAgICAgIHMuc291cmNlT3B0aW9uR3JvdXBzLm1hcChvcHRpb25Hcm91cCA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uR3JvdXAsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uR3JvdXAub3B0aW9ucy5tYXAob3B0aW9uID0+XG4gICAgICAgICAgICAgICAgICBhdWdtZW50T3B0aW9uVG9GdWxsT3B0aW9uKHMsIG9wdGlvbiwgb3B0aW9ucyksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgdG9wTGV2ZWxPcHRpb25zID0gZ2V0VG9wTGV2ZWxPcHRpb25zKGFsbE9wdGlvbkdyb3Vwcyk7XG5cbiAgICAgICAgICBjb25zdCBzb3J0ZWRPcHRpb25Hcm91cHMgPVxuICAgICAgICAgICAgb3B0aW9ucz8uc29ydFNlbGVjdGVkVG9Ub3AgPz8gb3B0aW9ucz8uYWxsb3dNdWx0aVNlbGVjdFxuICAgICAgICAgICAgICA/IHNvcnRPcHRpb25zQnlQcmV2aW91c2x5U2VsZWN0ZWRTdGF0ZShcbiAgICAgICAgICAgICAgICAgIGFsbE9wdGlvbkdyb3VwcyxcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkF0T3BlbixcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogYWxsT3B0aW9uR3JvdXBzO1xuXG4gICAgICAgICAgY29uc3QgZGlzcGxheUxpbWl0ID0gb3B0aW9ucz8uZGlzcGxheUxpbWl0ID8/IERFRkFVTFRfRElTUExBWV9MSU1JVDtcbiAgICAgICAgICBjb25zdCBkaXNwbGF5TGltaXRlZE9wdGlvbkdyb3VwcyA9IGFwcGx5RGlzcGxheUxpbWl0KFxuICAgICAgICAgICAgc29ydGVkT3B0aW9uR3JvdXBzLFxuICAgICAgICAgICAgZGlzcGxheUxpbWl0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZnVsbE9wdGlvbkdyb3VwcyA9IGFwcGx5U2VsZWN0ZWRPcHRpb25MaW1pdChcbiAgICAgICAgICAgIHMsXG4gICAgICAgICAgICBkaXNwbGF5TGltaXRlZE9wdGlvbkdyb3VwcyxcbiAgICAgICAgICAgIHRvcExldmVsT3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zLFxuICAgICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgICAgLi4ucy5xdWVyeSxcbiAgICAgICAgICAgICAgc2hvd1NlYXJjaDpcbiAgICAgICAgICAgICAgICAhIXMucXVlcnkuc2VhcmNoIHx8XG4gICAgICAgICAgICAgICAgKCEhb3B0aW9ucz8uYWxsb3dTZWFyY2ggJiZcbiAgICAgICAgICAgICAgICAgIGNvdW50QWxsT3B0aW9ucyhhbGxPcHRpb25Hcm91cHMpID5cbiAgICAgICAgICAgICAgICAgICAgTUlOX09QVElPTlNfRk9SX0NPTlRST0xTKSB8fFxuICAgICAgICAgICAgICAgIGNvdW50QWxsT3B0aW9ucyhhbGxPcHRpb25Hcm91cHMpID4gZGlzcGxheUxpbWl0LFxuICAgICAgICAgICAgICBzZWFyY2hQbGFjZWhvbGRlcjogb3B0aW9ucz8uc2VhcmNoUGxhY2Vob2xkZXIgPz8gJ1NlYXJjaCcsXG4gICAgICAgICAgICAgIHNob3dPcmRlcjpcbiAgICAgICAgICAgICAgICAhIW9wdGlvbnM/LmFsbG93T3JkZXIgJiZcbiAgICAgICAgICAgICAgICAhcy5xdWVyeS5zZWFyY2ggJiZcbiAgICAgICAgICAgICAgICBjb3VudEFsbE9wdGlvbnMoYWxsT3B0aW9uR3JvdXBzKSA+IE1JTl9PUFRJT05TX0ZPUl9DT05UUk9MUyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmdWxsT3B0aW9uR3JvdXBzLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgICAgICAgIC4uLnMuc2VsZWN0aW9uLFxuICAgICAgICAgICAgICBhbGxvd011bHRpU2VsZWN0OiAhIW9wdGlvbnM/LmFsbG93TXVsdGlTZWxlY3QsXG4gICAgICAgICAgICAgIGFsbG93U2VsZWN0QWxsOlxuICAgICAgICAgICAgICAgICEhb3B0aW9ucz8uYWxsb3dTZWxlY3RBbGwgJiZcbiAgICAgICAgICAgICAgICBvcHRpb25zPy5zZWxlY3RlZE9wdGlvbkxpbWl0ID09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdmlzaWJsZVNlbGVjdGlvblN0YXRlOlxuICAgICAgICAgICAgICAgIGdldFBhcmVudE11bHRpU2VsZWN0aW9uU3RhdGUodG9wTGV2ZWxPcHRpb25zKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkaXNwbGF5OiB7XG4gICAgICAgICAgICAgIC4uLnMuZGlzcGxheSxcbiAgICAgICAgICAgICAgZm9ybWF0dGVkU2VsZWN0ZWRPcHRpb25zOiBnZXRGb3JtYXR0ZWRPcHRpb25zRm9yRGlzcGxheShcbiAgICAgICAgICAgICAgICBzLFxuICAgICAgICAgICAgICAgIHRvcExldmVsT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB6ZXJvU3RhdGVNZXNzYWdlOiBnZXRaZXJvU3RhdGVNZXNzYWdlKHMpLFxuICAgICAgICAgICAgICBkaXZpZGVyczogISFvcHRpb25zPy5kaXZpZGVycyxcbiAgICAgICAgICAgICAgaW5saW5lOiAhIW9wdGlvbnM/LmlubGluZSxcbiAgICAgICAgICAgICAgbWF4SGVpZ2h0OiBvcHRpb25zPy5tYXhIZWlnaHQgPz8gbnVsbCxcbiAgICAgICAgICAgICAgbWF4V2lkdGg6IG9wdGlvbnM/Lm1heFdpZHRoID8/IG51bGwsXG4gICAgICAgICAgICAgIG1pbkhlaWdodDogb3B0aW9ucz8ubWluSGVpZ2h0ID8/IG51bGwsXG4gICAgICAgICAgICAgIG1pbldpZHRoOiBvcHRpb25zPy5taW5XaWR0aCA/PyBudWxsLFxuICAgICAgICAgICAgICBkaXNwbGF5TGltaXRNZXNzYWdlOiBnZXREaXNwbGF5TGltaXRNZXNzYWdlKFxuICAgICAgICAgICAgICAgIGNvdW50VmlzaWJsZU9wdGlvbnMoZnVsbE9wdGlvbkdyb3VwcywgISFzLnF1ZXJ5LnNlYXJjaCksXG4gICAgICAgICAgICAgICAgY291bnRWaXNpYmxlT3B0aW9ucyhhbGxPcHRpb25Hcm91cHMsICEhcy5xdWVyeS5zZWFyY2gpLFxuICAgICAgICAgICAgICAgIHMucXVlcnksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHNob3dTaW5nbGVTZWxlY3RlZDogISFvcHRpb25zPy5zaG93U2luZ2xlU2VsZWN0ZWQsXG4gICAgICAgICAgICAgIHBpbGxDb3VudDogZ2V0UGlsbENvdW50Rm9yRGlzcGxheShzLCB0b3BMZXZlbE9wdGlvbnMsIG9wdGlvbnMpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICB7XG4gICAgICAgIGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksXG4gICAgICAgIHJlc2V0T25EaXNjb25uZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBzdGF0ZS5jb25uZWN0KCk7XG5cbiAgICAvLyBMb2FkIHRoZSBvcHRpb25zIGltbWVkaWF0ZWx5IGZvciBzZWxlY3RzIHRoYXQgYXJlIGRpc3BsYXllZCBpbmxpbmUuXG4gICAgaWYgKG9wdGlvbnM/LmlubGluZSkgYWN0aW9ucy5uZXh0KHsgdHlwZTogJ2xvYWQnIH0pO1xuXG4gICAgcmV0dXJuIHsgYWN0aW9ucywgc3RhdGUgfTtcbiAgfVxuXG4gIGV4cG9ydCB0eXBlIEluTWVtb3J5TWFuYWdlck9wdGlvbnM8TyBleHRlbmRzIEJhc2VPcHRpb24+ID1cbiAgICBNYW5hZ2VyT3B0aW9uczxPPiAmIHtcbiAgICAgIGZ1c2VPcHRpb25zPzogSUZ1c2VPcHRpb25zPE8+O1xuICAgIH07XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluTWVtb3J5TWFuYWdlcjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgZmV0Y2hEYXRhc2V0OiAoKSA9PiBQcm9taXNlPE9wdGlvbkdyb3VwPE8+W10+IHwgT3B0aW9uR3JvdXA8Tz5bXSxcbiAgICBvcHRpb25zPzogSW5NZW1vcnlNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogTWFuYWdlcjxPPiB7XG4gICAgbGV0IGRhdGE6IE9wdGlvbkdyb3VwPE8+W107XG4gICAgbGV0IGZ1c2U6IEZ1c2U8Tz47XG4gICAgbGV0IGV4YWN0TWF0Y2g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBsZXQgcGFyZW50czogTWFwPE9bJ2lkJ10sIE9bJ2lkJ10+O1xuICAgIGxldCBjaGlsZHJlbjogTWFwPE9bJ2lkJ10sIE9bJ2lkJ11bXT47XG5cbiAgICBjb25zdCBzb3VyY2U6IFNvdXJjZTxPPiA9IGFzeW5jIChxdWVyeSwgbW9zdFJlY2VudEFjdGlvbikgPT4ge1xuICAgICAgLypcbiAgICAgICAgUmUtZmV0Y2ggdGhlIG9wdGlvbnMgb24gdGhlIGxvYWQgYWN0aW9uLCBhbmQgcmVidWlsZCB0aGUgc3RhdGVcbiAgICAgICAgZGVyaXZlZCBmcm9tIHRoZSBvcHRpb24gZGF0YS5cbiAgICAgICovXG4gICAgICBpZiAoXG4gICAgICAgIG1vc3RSZWNlbnRBY3Rpb24udHlwZSA9PT0gJ2xvYWQnIHx8XG4gICAgICAgIG1vc3RSZWNlbnRBY3Rpb24udHlwZSA9PT0gJ29wZW5DaGFuZ2UnXG4gICAgICApIHtcbiAgICAgICAgZGF0YSA9IGF3YWl0IGZldGNoRGF0YXNldCgpO1xuICAgICAgICBjb25zdCB0b3BMZXZlbE9wdGlvbnMgPSBnZXRUb3BMZXZlbE9wdGlvbnMoZGF0YSk7XG5cbiAgICAgICAgZnVzZSA9IG5ldyBGdXNlKGZsYXR0ZW5PcHRpb25zKHRvcExldmVsT3B0aW9ucywgZmFsc2UpLCB7XG4gICAgICAgICAgdGhyZXNob2xkOiAwLjIsXG4gICAgICAgICAga2V5czogWyd0aXRsZSddLFxuICAgICAgICAgIGluY2x1ZGVTY29yZTogdHJ1ZSxcbiAgICAgICAgICBpbmNsdWRlTWF0Y2hlczogdHJ1ZSxcbiAgICAgICAgICAuLi5vcHRpb25zPy5mdXNlT3B0aW9ucyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXhhY3RNYXRjaCA9IG9wdGlvbnM/LmZ1c2VPcHRpb25zPy50aHJlc2hvbGQgPT0gMDtcbiAgICAgICAgW3BhcmVudHMsIGNoaWxkcmVuXSA9IGdldFJlbGF0aW9uc2hpcE1hcHModG9wTGV2ZWxPcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgLy8gTGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIHNob3VsZG4ndCBhZmZlY3QgZnV6enkgbWF0Y2hpbmcgKEZ1c2VcbiAgICAgIC8vIHNjb3JlcyB0aGUgcGF0dGVybidzIGxlbmd0aCBhZ2FpbnN0IHRoZSB0ZXh0J3MsIHNvIGEgc3RyYXkgc3BhY2VcbiAgICAgIC8vIGNoYW5nZXMgcmVzdWx0cyBpbiBzdXJwcmlzaW5nIHdheXMpOyBhIHNlYXJjaCBzdHJpbmcgb2Ygb25seVxuICAgICAgLy8gd2hpdGVzcGFjZSBpcyB0cmVhdGVkIHRoZSBzYW1lIGFzIG5vIHNlYXJjaC5cbiAgICAgIGNvbnN0IHNlYXJjaCA9IHF1ZXJ5LnNlYXJjaC50cmltKCk7XG5cbiAgICAgIC8qXG4gICAgICAgIElmIHRoZSB1c2VyIGlzIG5vdCBzZWFyY2hpbmcgb3B0aW9ucywgcmV0dXJuIHRoZSBmdWxsIHNldCBvZiBvcHRpb25zXG4gICAgICAgIHNvcnRlZCBhcHByb3ByaWF0ZWx5LlxuICAgICAgKi9cbiAgICAgIGlmICghc2VhcmNoKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAgVGhlIGBzb3VyY2VgIG9yZGVyIHByb3BlcnR5IGFsbG93cyBmb3Igb3B0aW5nIG91dCBvZiBhdXRvbWF0aWNcbiAgICAgICAgICBzb3J0aW5nLCByZXR1cm5pbmcgdGhlIGRhdGEgaW4gaXRzIG5hdHVyYWwgaW5wdXQgb3JkZXIuXG4gICAgICAgICovXG4gICAgICAgIGlmIChxdWVyeS5vcmRlciA9PT0gJ3NvdXJjZScpIHJldHVybiBkYXRhO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAgU29ydCB0aGUgb3B0aW9ucyBieSB0aXRsZSBhbmQgc3VidGl0bGUuXG4gICAgICAgICovXG4gICAgICAgIGlmIChxdWVyeS5vcmRlciA9PT0gJ3RpdGxlJykge1xuICAgICAgICAgIGZ1bmN0aW9uIHNvcnRCeVRpdGxlKG9wdGlvbnM6IE9wdGlvbjxPPltdKTogT3B0aW9uPE8+W10ge1xuICAgICAgICAgICAgcmV0dXJuIHNvcnRCeShvcHRpb25zLCBbXG4gICAgICAgICAgICAgIChvOiBPcHRpb248Tz4pID0+IG8udGl0bGUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICAgKG86IE9wdGlvbjxPPikgPT4gby5zdWJ0aXRsZT8udG9Mb3dlckNhc2UoKSA/PyAnJyxcbiAgICAgICAgICAgIF0pLm1hcChvcHRpb24gPT4gKHtcbiAgICAgICAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICAgICAgICBjaGlsZHJlbjogb3B0aW9uLmNoaWxkcmVuPy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHNvcnRCeVRpdGxlKG9wdGlvbi5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZGF0YS5tYXAoZ3JvdXAgPT4gKHtcbiAgICAgICAgICAgIC4uLmdyb3VwLFxuICAgICAgICAgICAgb3B0aW9uczogc29ydEJ5VGl0bGUoZ3JvdXAub3B0aW9ucyksXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICBTb3J0IHRoZSBvcHRpb25zIGJ5IGNvdW50LCB0aGVuIGJ5IHRpdGxlLCB0aGVuIGJ5IHN1YnRpdGxlLlxuICAgICAgICAqL1xuICAgICAgICBpZiAocXVlcnkub3JkZXIgPT09ICdjb3VudCcpIHtcbiAgICAgICAgICBmdW5jdGlvbiBzb3J0QnlDb3VudChvcHRpb25zOiBPcHRpb248Tz5bXSk6IE9wdGlvbjxPPltdIHtcbiAgICAgICAgICAgIHJldHVybiBzb3J0Qnkob3B0aW9ucywgW1xuICAgICAgICAgICAgICAobzogT3B0aW9uPE8+KSA9PiAoaXNOdW1iZXIoby5jb3VudCkgPyAtby5jb3VudCA6IEluZmluaXR5KSxcbiAgICAgICAgICAgICAgKG86IE9wdGlvbjxPPikgPT4gby50aXRsZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAobzogT3B0aW9uPE8+KSA9PiBvLnN1YnRpdGxlPy50b0xvd2VyQ2FzZSgpID8/ICcnLFxuICAgICAgICAgICAgXSkubWFwKG9wdGlvbiA9PiAoe1xuICAgICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aFxuICAgICAgICAgICAgICAgID8gc29ydEJ5Q291bnQob3B0aW9uLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBkYXRhLm1hcChncm91cCA9PiAoe1xuICAgICAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgICAgICBvcHRpb25zOiBzb3J0QnlDb3VudChncm91cC5vcHRpb25zKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAgRXhlY3V0ZSB0aGUgc2VhcmNoIHdpdGggZnVzZS4gT25jZSB3ZSBoYXZlIHRoZSBzZWFyY2ggbWF0Y2ggZGF0YSxcbiAgICAgICAgcmVidWlsZCBqdXN0IGFzIG11Y2ggb2YgdGhlIHRyZWUgYXMgaXMgbmVlZGVkIHRvIHJlbmRlciB0aGUgc2VhcmNoXG4gICAgICAgIHJlc3VsdHMuIFNwZWNpZmljYWxseSwgYW55IG1hdGNoIHdpbGwgbmVlZCBhbGwgb2YgaXRzIGFuY2VzdG9ycyAoc29cbiAgICAgICAgdGhhdCBtYXRjaGVkIGxlYWYgbm9kZXMgYXJlIHNob3duIG5lc3RlZCB1bmRlciB0aGVpciBhbmNlc3RvcnMpIGFuZCBhbGxcbiAgICAgICAgb2YgaXRzIGNoaWxkcmVuIChiZWNhdXNlIGEgbWF0Y2hpbmcgcGFyZW50IG1lYW5zIHRoYXQgYWxsIG9mIGl0c1xuICAgICAgICBkZXNjZW5kYW50cyBtYXRjaCB0b28sIHBlciB0aGUgZGVzaWduIHNwZWNpZmljYXRpb24pLCB3aGV0aGVyIHRoZXlcbiAgICAgICAgdGhlbXNlbHZlcyBtYXRjaGVkIG9yIG5vdC5cbiAgICAgICovXG4gICAgICBjb25zdCBtYXRjaGVkT3B0aW9uczogRnVzZVJlc3VsdDxPPltdID0gZnVzZS5zZWFyY2goc2VhcmNoKTtcbiAgICAgIGNvbnN0IG1hdGNoZWRJZHM6IFNldDxPWydpZCddPiA9IG5ldyBTZXQoXG4gICAgICAgIG1hdGNoZWRPcHRpb25zLm1hcChyZXN1bHQgPT4gcmVzdWx0Lml0ZW0uaWQpLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgbWF0Y2hBbmNlc3RvcnM6IFNldDxPWydpZCddPiA9IG5ldyBTZXQoKTtcbiAgICAgIGZ1bmN0aW9uIGNvbGxlY3RBbmNlc3RvcnMoaWRzOiBPWydpZCddW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHBhcmVudHMuZ2V0KGlkKTtcbiAgICAgICAgICBpZiAocGFyZW50SWQpIHtcbiAgICAgICAgICAgIG1hdGNoQW5jZXN0b3JzLmFkZChwYXJlbnRJZCk7XG4gICAgICAgICAgICBjb2xsZWN0QW5jZXN0b3JzKFtwYXJlbnRJZF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29sbGVjdEFuY2VzdG9ycyhbLi4ubWF0Y2hlZElkc10pO1xuXG4gICAgICBjb25zdCBtYXRjaERlc2NlbmRhbnRzOiBTZXQ8T1snaWQnXT4gPSBuZXcgU2V0KCk7XG4gICAgICBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudHMoaWRzOiBPWydpZCddW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICBjb25zdCBjaGlsZHJlbklkcyA9IGNoaWxkcmVuLmdldChpZCk7XG4gICAgICAgICAgaWYgKGNoaWxkcmVuSWRzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuSWRzKSB7XG4gICAgICAgICAgICAgIG1hdGNoRGVzY2VuZGFudHMuYWRkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbGxlY3REZXNjZW5kYW50cyhjaGlsZHJlbklkcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb2xsZWN0RGVzY2VuZGFudHMoWy4uLm1hdGNoZWRJZHNdKTtcblxuICAgICAgLypcbiAgICAgICAgTmV4dCwgd2UnbGwgY29tYmluZSBhbGwgdGhlIG1hdGNoZWQgSURzIHdpdGggdGhlaXIgZGlyZWN0IGFuY2VzdG9ycyBhbmRcbiAgICAgICAgZGVzY2FuZGFudHMsIGFuZCBmaWx0ZXIgdGhlIG9yaWdpbmFsIGRhdGEgc2V0IGRvd24gdG8ganVzdCB0aGVzZVxuICAgICAgICBvcHRpb25zLlxuICAgICAgKi9cbiAgICAgIGNvbnN0IGZpbHRlcmVkSWRzOiBTZXQ8T1snaWQnXT4gPSBuZXcgU2V0KFtcbiAgICAgICAgLi4ubWF0Y2hlZElkcyxcbiAgICAgICAgLi4ubWF0Y2hBbmNlc3RvcnMsXG4gICAgICAgIC4uLm1hdGNoRGVzY2VuZGFudHMsXG4gICAgICBdKTtcblxuICAgICAgZnVuY3Rpb24gZmlsdGVyT3B0aW9ucyhvcHRpb25zOiBPcHRpb248Tz5bXSk6IE9wdGlvbjxPPltdIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRPcHRpb25zOiBPcHRpb248Tz5bXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKGZpbHRlcmVkSWRzLmhhcyhvcHRpb24uaWQpKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZE9wdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgICAgY2hpbGRyZW46IG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBmaWx0ZXJPcHRpb25zKG9wdGlvbi5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsdGVyZWRPcHRpb25zO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gZmlsdGVyT3B0aW9ucyhnZXRUb3BMZXZlbE9wdGlvbnMoZGF0YSkpO1xuXG4gICAgICAvKlxuICAgICAgICBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGFuIGFycmF5IG9mIGRpc3RpbmN0IHRyZWVzICh0b3AtbGV2ZWwgb3B0aW9ucyksXG4gICAgICAgIGZpbHRlcmVkIGRvd24gdG8gb25seSB0aGUgb3B0aW9ucyBtYXRjaGluZyB0aGUgc2VhcmNoIHF1ZXJ5LiBOb3RlIHRoYXRcbiAgICAgICAgd2UgZG9uJ3QgY2FyZSBhYm91dCBzZWN0aW9uIGhlYWRlcnMgd2hlbiBzZWFyY2hpbmcgc2luY2UgcmVzdWx0cyBzaG91bGRcbiAgICAgICAgYmUgb3JkZXJlZCBieSByZWxldmFuY2UuIFRvIGNhbGN1bGF0ZSB0aGUgb3JkZXIgb2YgdGhlc2UgdHJlZXMsIHdlJ2xsXG4gICAgICAgIHRha2UgdGhlIHRvdGFsIG1hdGNoIHNjb3JlcyBmb3Igb3B0aW9ucyBmb3VuZCBpbiB0aGUgdHJlZSwgZGl2aWRlZCBieVxuICAgICAgICB0aGUgY291bnQgb2YgbWF0Y2hlcyBpbiB0aGUgdHJlZSAodGhlIGJlc3QgYXZlcmFnZSBtYXRjaCBzY29yZSkuXG4gICAgICAqL1xuXG4gICAgICBjb25zdCBzY29yZU1hcDogTWFwPE9bJ2lkJ10sIG51bWJlcj4gPSBuZXcgTWFwKFxuICAgICAgICBtYXRjaGVkT3B0aW9ucy5tYXAocmVzdWx0ID0+IFtyZXN1bHQuaXRlbS5pZCwgcmVzdWx0LnNjb3JlID8/IDBdKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBvcmRlcmVkID0gc29ydEJ5KGZpbHRlcmVkT3B0aW9ucywgKG9wdGlvbjogT3B0aW9uPE8+KTogbnVtYmVyID0+IHtcbiAgICAgICAgZnVuY3Rpb24gY2FsY3VsYXRlU2NvcmUob3B0aW9uOiBPcHRpb248Tz4pOiBudW1iZXIge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoc2NvcmVNYXAuZ2V0KG9wdGlvbi5pZCkgPz8gMCkgK1xuICAgICAgICAgICAgKG9wdGlvbi5jaGlsZHJlbiA/PyBbXSkucmVkdWNlKFxuICAgICAgICAgICAgICAoc2NvcmUsIGNoaWxkKSA9PiBzY29yZSArIGNhbGN1bGF0ZVNjb3JlKGNoaWxkKSxcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZUNvdW50KG9wdGlvbjogT3B0aW9uPE8+KTogbnVtYmVyIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgMSArXG4gICAgICAgICAgICAob3B0aW9uLmNoaWxkcmVuID8/IFtdKS5yZWR1Y2UoXG4gICAgICAgICAgICAgIChjb3VudCwgY2hpbGQpID0+IGNvdW50ICsgY2FsY3VsYXRlQ291bnQoY2hpbGQpLFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG90YWxTY29yZSA9IGNhbGN1bGF0ZVNjb3JlKG9wdGlvbik7XG4gICAgICAgIGNvbnN0IHRvdGFsQ291bnQgPSBjYWxjdWxhdGVDb3VudChvcHRpb24pO1xuICAgICAgICByZXR1cm4gdG90YWxTY29yZSAvIHRvdGFsQ291bnQ7XG4gICAgICB9KTtcblxuICAgICAgLypcbiAgICAgICAgRmluYWxseSwgd2UnbGwgYWRkIGhpZ2hsaWdodCBpbmRpY2VzIHRvIHRoZSBtYXRjaGVzIHNvIHRoYXQgdGhleSBjYW4gYmVcbiAgICAgICAgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgICAgKi9cblxuICAgICAgdHlwZSBIaWdobGlnaHRzID0ge1xuICAgICAgICB0aXRsZUhpZ2hsaWdodEluZGljZXM/OiBIaWdobGlnaHRDb21wb25lbnQuSGlnaGxpZ2h0SW5kaWNlc1tdO1xuICAgICAgICBzdWJ0aXRsZUhpZ2hsaWdodEluZGljZXM/OiBIaWdobGlnaHRDb21wb25lbnQuSGlnaGxpZ2h0SW5kaWNlc1tdO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGhpZ2hsaWdodE1hcDogTWFwPE9bJ2lkJ10sIEhpZ2hsaWdodHM+ID0gbmV3IE1hcChcbiAgICAgICAgbWF0Y2hlZE9wdGlvbnMubWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgY29uc3QgaGlnaGxpZ2h0czogSGlnaGxpZ2h0cyA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgcmVzdWx0Lm1hdGNoZXMgPz8gW10pIHtcbiAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgaW5leGFjdCBtYXRjaGVzXG4gICAgICAgICAgICBpZiAoZXhhY3RNYXRjaCAmJiBtYXRjaC52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIG1hdGNoLmluZGljZXMgPSBtYXRjaC5pbmRpY2VzLmZpbHRlcihcbiAgICAgICAgICAgICAgICBpc0Z1c2VNYXRjaEV4YWN0KG1hdGNoLCBzZWFyY2gpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoLmtleSA9PT0gJ3RpdGxlJykge1xuICAgICAgICAgICAgICBoaWdobGlnaHRzLnRpdGxlSGlnaGxpZ2h0SW5kaWNlcyA9IFsuLi5tYXRjaC5pbmRpY2VzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaC5rZXkgPT09ICdzdWJ0aXRsZScpIHtcbiAgICAgICAgICAgICAgaGlnaGxpZ2h0cy5zdWJ0aXRsZUhpZ2hsaWdodEluZGljZXMgPSBbLi4ubWF0Y2guaW5kaWNlc107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbcmVzdWx0Lml0ZW0uaWQsIGhpZ2hsaWdodHNdO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBmdW5jdGlvbiBhZGRIaWdobGlnaHRzVG9PcHRpb24ob3B0aW9uczogT3B0aW9uPE8+W10pOiBTb3VyY2VPcHRpb248Tz5bXSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLm1hcChvcHRpb24gPT4gKHtcbiAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgLi4uaGlnaGxpZ2h0TWFwLmdldChvcHRpb24uaWQpLFxuICAgICAgICAgIC4uLihvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aFxuICAgICAgICAgICAgPyB7IGNoaWxkcmVuOiBhZGRIaWdobGlnaHRzVG9PcHRpb24ob3B0aW9uLmNoaWxkcmVuKSB9XG4gICAgICAgICAgICA6IG51bGwpLFxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IFt7IG9wdGlvbnM6IGFkZEhpZ2hsaWdodHNUb09wdGlvbihvcmRlcmVkKSB9XSxcbiAgICAgICAgb3JpZ2luYWxEYXRhOiBkYXRhLFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNyZWF0ZU1hbmFnZXIoc291cmNlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpc0Z1c2VNYXRjaEV4YWN0KFxuICAgIG1hdGNoOiBGdXNlUmVzdWx0TWF0Y2gsXG4gICAgc2VhcmNoOiBzdHJpbmcsXG4gICk6IChcbiAgICB2YWx1ZTogUmFuZ2VUdXBsZSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGFycmF5OiByZWFkb25seSBSYW5nZVR1cGxlW10sXG4gICkgPT4gYm9vbGVhbiB7XG4gICAgcmV0dXJuIG1hdGNoZWRJbmRpY2VzID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZWRWYWx1ZSA9IG1hdGNoXG4gICAgICAgIC52YWx1ZSEuc2xpY2UobWF0Y2hlZEluZGljZXNbMF0sIG1hdGNoZWRJbmRpY2VzWzFdICsgMSlcbiAgICAgICAgLnRvTG93ZXJDYXNlKCk7XG4gICAgICAvLyBmdXNlIGlzIHdlaXJkIHdpdGggaXQncyBtYXRjaGVzLiBGb3IgYSB0ZXh0IG9mIFwicGxhbm5pbmdcIiBhbmQgYSBzZWFyY2ggc3RyaW5nIG9mIFwicGxhblwiXG4gICAgICAvLyB0aGUgbWF0Y2hlZCB2YWx1ZSB3aWxsIGJlIFwicGxhbm5cIiB3aXRoIHRoZSBleHRyYSAnbicgYmVjYXVzZSBvZiBpdHMgZnV6enkgbWF0Y2hpbmcuXG4gICAgICAvLyBzbyBqdXN0IG1ha2Ugc3VyZSB0aGUgbWF0Y2hlZCB2YWx1ZSBhdCBsZWFzdCBzdGFydHMgd2l0aCB0aGUgc2VhcmNoIHN0cmluZy5cbiAgICAgIC8vIGl0J3MgZXh0cmEgd2VpcmQgYmVjYXVzZSBmb3IgYSB0ZXh0IG9mIFwiYW5hbHl0aWNzXCIgYW5kIGEgc2VhcmNoIHN0cmluZyBvZiBcIm5hbHl0aWNzXCIsXG4gICAgICAvLyB0aGUgbWF0Y2hlZCB2YWx1ZSB3aWxsIGJlIFwiYW5hbHl0aWNzXCIuIFNvIHdlIGp1c3QgbmVlZCB0byBtYWtlIHN1cmUgdGhlIHRoZSBtYXRjaGVkIHZhbHVlXG4gICAgICAvLyBpbmNsdWRlcyB0aGUgc2VhcmNoIHN0cmluZyBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIGV4dHJhIHN0dWZmIG9uIHRoZSBmcm9udCBvciB0aGUgZW5kLlxuICAgICAgcmV0dXJuIG1hdGNoZWRWYWx1ZS5pbmNsdWRlcyhzZWFyY2gudG9Mb3dlckNhc2UoKSk7XG4gICAgfTtcbiAgfVxuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gU3RhdGUgcmVkdWNlciAod2l0aCBoZWxwZXJzKSAvL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgZnVuY3Rpb24gY3JlYXRlU2VsZWN0aW9uU25hcHNob3RXaXRoQW5jZXN0b3JzPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICApOiBPcHRpb25TZXQ8Tz4ge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gbmV3IE9wdGlvblNldChzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICAgIGNvbnN0IHRvcExldmVsT3B0aW9ucyA9IGdldFRvcExldmVsT3B0aW9ucyhzdGF0ZS5zb3VyY2VPcHRpb25Hcm91cHMpO1xuICAgIGNvbnN0IFtwYXJlbnRzXSA9IGdldFJlbGF0aW9uc2hpcE1hcHModG9wTGV2ZWxPcHRpb25zKTtcblxuICAgIC8vIFNpYmxpbmcgbGVhdmVzIHNoYXJlIGFuY2VzdG9ycywgc28gb25jZSB3ZSd2ZSB3YWxrZWQgdXAgdGhyb3VnaCBhXG4gICAgLy8gZ2l2ZW4gcGFyZW50IGlkIHdlIGNhbiBzdG9wIOKAlCBhbnl0aGluZyBhYm92ZSBpdCBoYXMgYWxyZWFkeSBiZWVuXG4gICAgLy8gYWRkZWQgYnkgYSBwcmV2aW91cyBpdGVyYXRpb24uIFdpdGhvdXQgdGhpcyBzaG9ydC1jaXJjdWl0IHRoZSBsb29wXG4gICAgLy8gcmUtcnVucyBmaW5kT3B0aW9uICh3aGljaCBpcyBhIGZ1bGwgdHJlZSB3YWxrKSBvbmNlIHBlciBzaGFyZWRcbiAgICAvLyBhbmNlc3RvciBlZGdlLCB3aGljaCB3YXMgdGhlICMyIGhvdHNwb3QgYmVoaW5kIE9wdGlvblNldC5hZGQgaW5cbiAgICAvLyBSVlQtMjU0NzAncyBwcm9maWxlLlxuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PE9bJ2lkJ10+KCk7XG4gICAgZm9yIChjb25zdCBzZWxlY3RlZE9wdGlvbiBvZiBzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQpIHtcbiAgICAgIGxldCBwYXJlbnRJZCA9IHBhcmVudHMuZ2V0KHNlbGVjdGVkT3B0aW9uLmlkKTtcbiAgICAgIHdoaWxlIChwYXJlbnRJZCAhPT0gdW5kZWZpbmVkICYmICF2aXNpdGVkLmhhcyhwYXJlbnRJZCkpIHtcbiAgICAgICAgdmlzaXRlZC5hZGQocGFyZW50SWQpO1xuICAgICAgICBjb25zdCBwYXJlbnRPcHRpb24gPSBmaW5kT3B0aW9uKHRvcExldmVsT3B0aW9ucywgcGFyZW50SWQpO1xuICAgICAgICBpZiAocGFyZW50T3B0aW9uKSB7XG4gICAgICAgICAgc25hcHNob3QuYWRkKHBhcmVudE9wdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50SWQgPSBwYXJlbnRzLmdldChwYXJlbnRJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RGlzcGxheUxpbWl0TWVzc2FnZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgZGlzcGxheWVkT3B0aW9uQ291bnQ6IG51bWJlcixcbiAgICB0b3RhbE9wdGlvbkNvdW50OiBudW1iZXIsXG4gICAgcXVlcnk6IENvcmVTdGF0ZTxPPlsncXVlcnknXSxcbiAgKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKGRpc3BsYXllZE9wdGlvbkNvdW50ID09PSB0b3RhbE9wdGlvbkNvdW50KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByaXZOdW1iZXIgPSBuZXcgTnVtYmVyUGlwZSgpO1xuICAgIGNvbnN0IGRpc3BsYXllZCA9IHJpdk51bWJlci50cmFuc2Zvcm0oZGlzcGxheWVkT3B0aW9uQ291bnQpO1xuICAgIGNvbnN0IHRvdGFsID0gcml2TnVtYmVyLnRyYW5zZm9ybSh0b3RhbE9wdGlvbkNvdW50KTtcbiAgICBjb25zdCBzdGFydCA9IGBTaG93aW5nICR7ZGlzcGxheWVkfSBvZiAke3RvdGFsfSBvcHRpb25zYDtcbiAgICByZXR1cm4gcXVlcnkuc2VhcmNoID8gYCR7c3RhcnR9IG1hdGNoaW5nIFwiJHtxdWVyeS5zZWFyY2h9XCJgIDogc3RhcnQ7XG4gIH1cblxuICBmdW5jdGlvbiBjb3VudFZpc2libGVPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICAgIGxlYWZPbmx5OiBib29sZWFuLFxuICApOiBudW1iZXIge1xuICAgIGZ1bmN0aW9uIGNvdW50KG9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSk6IG51bWJlciB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5yZWR1Y2UoKGFjYywgb3B0aW9uKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb24uZXhwYW5kZWQgJiYgb3B0aW9uLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gYWNjICsgKGxlYWZPbmx5ID8gMCA6IDEpICsgY291bnQob3B0aW9uLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjICsgMTtcbiAgICAgIH0sIDApO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25Hcm91cHMucmVkdWNlKFxuICAgICAgKHRvdGFsLCBncm91cCkgPT4gdG90YWwgKyBjb3VudChncm91cC5vcHRpb25zKSxcbiAgICAgIDAsXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvdW50QWxsT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uR3JvdXBzOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSxcbiAgKTogbnVtYmVyIHtcbiAgICBmdW5jdGlvbiBjb3VudChvcHRpb25zOiBGdWxsT3B0aW9uPE8+W10pOiBudW1iZXIge1xuICAgICAgcmV0dXJuIG9wdGlvbnMucmVkdWNlKChhY2MsIG9wdGlvbikgPT4ge1xuICAgICAgICBpZiAob3B0aW9uLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gYWNjICsgMSArIGNvdW50KG9wdGlvbi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYyArIDE7XG4gICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9uR3JvdXBzLnJlZHVjZShcbiAgICAgICh0b3RhbCwgZ3JvdXApID0+IHRvdGFsICsgY291bnQoZ3JvdXAub3B0aW9ucyksXG4gICAgICAwLFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseURpc3BsYXlMaW1pdDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uR3JvdXBzOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSxcbiAgICBkaXNwbGF5TGltaXQ6IG51bWJlcixcbiAgKTogRnVsbE9wdGlvbkdyb3VwPE8+W10ge1xuICAgIHR5cGUgRGlzcGxheUxpbWl0T3B0aW9ucyA9IFtGdWxsT3B0aW9uPE8+W10sIG51bWJlcl07XG4gICAgZnVuY3Rpb24gZmlsdGVyV2l0aExpbWl0KFxuICAgICAgb3B0aW9uczogRnVsbE9wdGlvbjxPPltdLFxuICAgICAgcmVtYWluaW5nOiBudW1iZXIsXG4gICAgKTogRGlzcGxheUxpbWl0T3B0aW9ucyB7XG4gICAgICBsZXQgbGVmdCA9IHJlbWFpbmluZztcbiAgICAgIGNvbnN0IHZpc2libGVPcHRpb25zOiBGdWxsT3B0aW9uPE8+W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGxlZnQgPD0gMCkgYnJlYWs7XG5cbiAgICAgICAgaWYgKG9wdGlvbi5leHBhbmRlZCAmJiBvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IFtjaGlsZE9wdGlvbnMsIGNoaWxkUmVtYWluaW5nXSA9IGZpbHRlcldpdGhMaW1pdChcbiAgICAgICAgICAgIG9wdGlvbi5jaGlsZHJlbixcbiAgICAgICAgICAgIGxlZnQgLSAxLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdmlzaWJsZU9wdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRPcHRpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGxlZnQgPSBjaGlsZFJlbWFpbmluZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2aXNpYmxlT3B0aW9ucy5wdXNoKG9wdGlvbik7XG4gICAgICAgICAgbGVmdC0tO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gW3Zpc2libGVPcHRpb25zLCBsZWZ0XTtcbiAgICB9XG5cbiAgICB0eXBlIERpc3BsYXlMaW1pdEdyb3VwcyA9IFtGdWxsT3B0aW9uR3JvdXA8Tz5bXSwgbnVtYmVyXTtcbiAgICBjb25zdCBzdGFydGluZ1ZhbHVlOiBEaXNwbGF5TGltaXRHcm91cHMgPSBbW10sIGRpc3BsYXlMaW1pdF07XG4gICAgY29uc3QgW3Jlc29sdmVkR3JvdXBzXSA9IG9wdGlvbkdyb3Vwcy5yZWR1Y2U8RGlzcGxheUxpbWl0R3JvdXBzPihcbiAgICAgIChbZ3JvdXBzLCByZW1haW5pbmddLCBncm91cCkgPT4ge1xuICAgICAgICBjb25zdCBbb3B0aW9ucywgbGVmdEFmdGVyXSA9IGZpbHRlcldpdGhMaW1pdChncm91cC5vcHRpb25zLCByZW1haW5pbmcpO1xuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gW1suLi5ncm91cHMsIHsgLi4uZ3JvdXAsIG9wdGlvbnMgfV0sIGxlZnRBZnRlcl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtncm91cHMsIHJlbWFpbmluZ107XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzdGFydGluZ1ZhbHVlLFxuICAgICk7XG5cbiAgICByZXR1cm4gcmVzb2x2ZWRHcm91cHM7XG4gIH1cblxuICAvKlxuICAgIFNvcnQgb3B0aW9ucyBzbyB0aGF0IHByZXZpb3VzbHkgc2VsZWN0ZWQgb3B0aW9ucyAoZnJvbSBwcmlvciBzZXNzaW9ucylcbiAgICBhcHBlYXIgYXQgdGhlIHRvcCBvZiB0aGVpciBwZWVyL3NpYmxpbmcgbGlzdHMuXG4gICovXG4gIGZ1bmN0aW9uIHNvcnRPcHRpb25zQnlQcmV2aW91c2x5U2VsZWN0ZWRTdGF0ZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uR3JvdXBzOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSxcbiAgICBzZWxlY3Rpb25BdE9wZW46IE9wdGlvblNldDxPPixcbiAgKTogRnVsbE9wdGlvbkdyb3VwPE8+W10ge1xuICAgIGZ1bmN0aW9uIHNvcnRPcHRpb25zKG9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSk6IEZ1bGxPcHRpb248Tz5bXSB7XG4gICAgICByZXR1cm4gc29ydEJ5KG9wdGlvbnMsIG9wdGlvbiA9PiAhc2VsZWN0aW9uQXRPcGVuLmhhcyhvcHRpb24pKS5tYXAoXG4gICAgICAgIG9wdGlvbiA9PiB7XG4gICAgICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICAgICAgICBjaGlsZHJlbjogc29ydE9wdGlvbnMob3B0aW9uLmNoaWxkcmVuKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHJldHVybiBvcHRpb247XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25Hcm91cHMubWFwKGdyb3VwID0+ICh7XG4gICAgICAuLi5ncm91cCxcbiAgICAgIG9wdGlvbnM6IHNvcnRPcHRpb25zKGdyb3VwLm9wdGlvbnMpLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qXG4gICAgSWYgd2UgYXJlIHJlc3RyaWN0aW5nIGhvdyBtYW55IG9wdGlvbnMgYXJlIHNlbGVjdGVkIHRvIGEgc3BlY2lmaWMgbGltaXQsXG4gICAgICB3aGVuIHdlIGFyZSBhdCB0aGF0IGxpbWl0LCBkaXNhYmxlIGFsbCBvcHRpb25zIG5vdCBjdXJyZW50bHkgc2VsZWN0ZWQuXG4gICovXG4gIGZ1bmN0aW9uIGFwcGx5U2VsZWN0ZWRPcHRpb25MaW1pdDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICAgIHRvcExldmVsT3B0aW9uczogRnVsbE9wdGlvbjxPPltdLFxuICAgIG9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogRnVsbE9wdGlvbkdyb3VwPE8+W10ge1xuICAgIGlmIChvcHRpb25zPy5zZWxlY3RlZE9wdGlvbkxpbWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBvcHRpb25Hcm91cHM7XG4gICAgfVxuXG4gICAgLy8gV2hlbiB1c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5IGlzIHRydWUgYW5kIHNlYXJjaCBpcyBhY3RpdmUsIGNvdW50XG4gICAgLy8gc2VsZWN0ZWQgdG9wLWxldmVsIG9wdGlvbnMgZnJvbSB0aGUgb3JpZ2luYWwgKHVuZmlsdGVyZWQpIGRhdGEgdG8gZW5zdXJlXG4gICAgLy8gYWxyZWFkeS1zZWxlY3RlZCBvcHRpb25zIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIHNlYXJjaCBhcmUgc3RpbGwgY291bnRlZC5cbiAgICBjb25zdCB1c2VPcmlnaW5hbEZvckNvdW50aW5nID1cbiAgICAgIG9wdGlvbnM/LnVzZVRvcExldmVsT3B0aW9uc0ZvckRpc3BsYXkgJiZcbiAgICAgIHN0YXRlLnF1ZXJ5LnNlYXJjaCAmJlxuICAgICAgc3RhdGUub3JpZ2luYWxPcHRpb25Hcm91cHMubGVuZ3RoID4gMDtcblxuICAgIGNvbnN0IHRvcE9wdGlvbnNGb3JDb3VudGluZyA9IHVzZU9yaWdpbmFsRm9yQ291bnRpbmdcbiAgICAgID8gZ2V0VG9wTGV2ZWxPcHRpb25zKHN0YXRlLm9yaWdpbmFsT3B0aW9uR3JvdXBzKS5tYXAob3B0aW9uID0+XG4gICAgICAgICAgYXVnbWVudE9wdGlvblRvRnVsbE9wdGlvbihzdGF0ZSwgb3B0aW9uLCBvcHRpb25zKSxcbiAgICAgICAgKVxuICAgICAgOiB0b3BMZXZlbE9wdGlvbnM7XG5cbiAgICBjb25zdCBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnMgPSB0b3BPcHRpb25zRm9yQ291bnRpbmcuZmlsdGVyKFxuICAgICAgb3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCAhPSBmYWxzZSxcbiAgICApO1xuICAgIGNvbnN0IG51bVNlbGVjdGVkT3B0aW9uczogbnVtYmVyID0gb3B0aW9ucz8udXNlVG9wTGV2ZWxPcHRpb25zRm9yRGlzcGxheVxuICAgICAgPyBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnMubGVuZ3RoXG4gICAgICA6IHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZC5zaXplO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25MaW1pdDogbnVtYmVyID0gb3B0aW9ucy5zZWxlY3RlZE9wdGlvbkxpbWl0O1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBsZXNzIGl0ZW1zIHNlbGVjdGVkIHRoYW4gdGhlIGxpbWl0LCBidXNpbmVzcyBhcyB1c3VhbC5cbiAgICBpZiAobnVtU2VsZWN0ZWRPcHRpb25zIDwgc2VsZWN0ZWRPcHRpb25MaW1pdCkge1xuICAgICAgcmV0dXJuIG9wdGlvbkdyb3VwcztcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGVxdWFsIGl0ZW1zIHNlbGVjdGVkIHRvIHRoZSBsaW1pdCAob3IgbW9yZSksIHByZXZlbnQgdXNlcnMgZnJvbSBzZWxlY3RpbmcgbW9yZSBvcHRpb25zLlxuICAgIGZ1bmN0aW9uIGRpc2FibGVVbnNlbGVjdGVkSXRlbXMoXG4gICAgICBjdXJyZW50T3B0aW9uczogRnVsbE9wdGlvbjxPPltdLFxuICAgICAgb3B0aW9uc0FyZUNoaWxkcmVuT2ZTZWxlY3RlZEdyb3VwOiBib29sZWFuLFxuICAgICk6IEZ1bGxPcHRpb248Tz5bXSB7XG4gICAgICBjb25zdCB1cGRhdGVkSXRlbXM6IEZ1bGxPcHRpb248Tz5bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgY3VycmVudE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgaXNEaXNhYmxlZE9yVW5zZWxlY3RlZDogYm9vbGVhbiA9XG4gICAgICAgICAgISFvcHRpb24uZGlzYWJsZWQgfHwgKG9wdGlvbi5zZWxlY3RhYmxlICYmIG9wdGlvbi5zZWxlY3RlZCA9PSBmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgaXNDdXJyZW50T3B0aW9uU2VsZWN0ZWQ6IGJvb2xlYW4gPVxuICAgICAgICAgIG9wdGlvbi5zZWxlY3RhYmxlICYmIG9wdGlvbi5zZWxlY3RlZCAhPSBmYWxzZTtcbiAgICAgICAgY29uc3QgaXNDdXJyZW50T3JQYXJlbnRPcHRpb25TZWxlY3RlZDogYm9vbGVhbiA9XG4gICAgICAgICAgaXNDdXJyZW50T3B0aW9uU2VsZWN0ZWQgfHwgb3B0aW9uc0FyZUNoaWxkcmVuT2ZTZWxlY3RlZEdyb3VwO1xuXG4gICAgICAgIGNvbnN0IGZvcmNlRW5hYmxlZEJhc2VkT25QYXJlbnQ6IGJvb2xlYW4gPVxuICAgICAgICAgICEhb3B0aW9ucz8udXNlVG9wTGV2ZWxPcHRpb25zRm9yRGlzcGxheSAmJlxuICAgICAgICAgIG9wdGlvbnNBcmVDaGlsZHJlbk9mU2VsZWN0ZWRHcm91cDtcbiAgICAgICAgY29uc3QgbWFya0Rpc2FibGVkOiBib29sZWFuID1cbiAgICAgICAgICBpc0Rpc2FibGVkT3JVbnNlbGVjdGVkICYmICFmb3JjZUVuYWJsZWRCYXNlZE9uUGFyZW50O1xuXG4gICAgICAgIGlmIChvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IGNoaWxkT3B0aW9ucyA9IGRpc2FibGVVbnNlbGVjdGVkSXRlbXMoXG4gICAgICAgICAgICBvcHRpb24uY2hpbGRyZW4sXG4gICAgICAgICAgICBpc0N1cnJlbnRPclBhcmVudE9wdGlvblNlbGVjdGVkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlZEl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICAgICAgZGlzYWJsZWQ6ICEhbWFya0Rpc2FibGVkLFxuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkT3B0aW9ucyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cGRhdGVkSXRlbXMucHVzaCh7XG4gICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICBkaXNhYmxlZDogISFtYXJrRGlzYWJsZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1cGRhdGVkSXRlbXM7XG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXBzQWZ0ZXJMaW1pdDogRnVsbE9wdGlvbkdyb3VwPE8+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGN1cnJlbnRHcm91cCBvZiBvcHRpb25Hcm91cHMpIHtcbiAgICAgIGdyb3Vwc0FmdGVyTGltaXQucHVzaCh7XG4gICAgICAgIC4uLmN1cnJlbnRHcm91cCxcbiAgICAgICAgb3B0aW9uczogZGlzYWJsZVVuc2VsZWN0ZWRJdGVtcyhjdXJyZW50R3JvdXAub3B0aW9ucywgZmFsc2UpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyb3Vwc0FmdGVyTGltaXQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRSZWxhdGlvbnNoaXBNYXBzPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25zOiBPcHRpb248Tz5bXSxcbiAgKTogW01hcDxPWydpZCddLCBPWydpZCddPiwgTWFwPE9bJ2lkJ10sIE9bJ2lkJ11bXT5dIHtcbiAgICBjb25zdCBwYXJlbnRzID0gbmV3IE1hcCgpO1xuICAgIGZ1bmN0aW9uIGJ1aWxkUGFyZW50c01hcChvcHRpb25zOiBPcHRpb248Tz5bXSwgcGFyZW50PzogT3B0aW9uPE8+KTogdm9pZCB7XG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICBwYXJlbnRzLnNldChvcHRpb24uaWQsIHBhcmVudC5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgYnVpbGRQYXJlbnRzTWFwKG9wdGlvbi5jaGlsZHJlbiwgb3B0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBidWlsZFBhcmVudHNNYXAob3B0aW9ucyk7XG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IG5ldyBNYXAoKTtcbiAgICBmdW5jdGlvbiBidWlsZENoaWxkcmVuTWFwKG9wdGlvbnM6IE9wdGlvbjxPPltdKTogdm9pZCB7XG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIGNoaWxkcmVuLnNldChcbiAgICAgICAgICAgIG9wdGlvbi5pZCxcbiAgICAgICAgICAgIG9wdGlvbi5jaGlsZHJlbi5tYXAoKHsgaWQgfSkgPT4gaWQpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnVpbGRDaGlsZHJlbk1hcChvcHRpb24uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGJ1aWxkQ2hpbGRyZW5NYXAob3B0aW9ucyk7XG5cbiAgICByZXR1cm4gW3BhcmVudHMsIGNoaWxkcmVuXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFRvcExldmVsT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uR3JvdXBzOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSxcbiAgKTogRnVsbE9wdGlvbjxPPltdO1xuICBmdW5jdGlvbiBnZXRUb3BMZXZlbE9wdGlvbnM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbkdyb3VwczogU291cmNlT3B0aW9uR3JvdXA8Tz5bXSxcbiAgKTogU291cmNlT3B0aW9uPE8+W107XG4gIGZ1bmN0aW9uIGdldFRvcExldmVsT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uR3JvdXBzOiBPcHRpb25Hcm91cDxPPltdLFxuICApOiBPcHRpb248Tz5bXTtcbiAgZnVuY3Rpb24gZ2V0VG9wTGV2ZWxPcHRpb25zPFxuICAgIE8gZXh0ZW5kcyBCYXNlT3B0aW9uLFxuICAgIEcgZXh0ZW5kcyB7IG9wdGlvbnM6IHJlYWRvbmx5IFRbXSB9LFxuICAgIFQgPSBHIGV4dGVuZHMgRnVsbE9wdGlvbkdyb3VwPE8+XG4gICAgICA/IEZ1bGxPcHRpb248Tz5cbiAgICAgIDogRyBleHRlbmRzIFNvdXJjZU9wdGlvbkdyb3VwPE8+XG4gICAgICA/IFNvdXJjZU9wdGlvbjxPPlxuICAgICAgOiBPcHRpb248Tz4sXG4gID4ob3B0aW9uR3JvdXBzOiBHW10pOiBUW10ge1xuICAgIHJldHVybiBvcHRpb25Hcm91cHMucmVkdWNlPFRbXT4oXG4gICAgICAob3B0aW9ucywgZ3JvdXApID0+IFsuLi5vcHRpb25zLCAuLi5ncm91cC5vcHRpb25zXSxcbiAgICAgIFtdLFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQYXJlbnRNdWx0aVNlbGVjdGlvblN0YXRlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBjaGlsZHJlbjogRnVsbE9wdGlvbjxPPltdLFxuICApOiBNdWx0aVNlbGVjdGlvblN0YXRlIHtcbiAgICBpZiAoY2hpbGRyZW4uZXZlcnkoY2hpbGQgPT4gY2hpbGQuc2VsZWN0ZWQgPT09IHRydWUpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY2hpbGRyZW4uZXZlcnkoY2hpbGQgPT4gY2hpbGQuc2VsZWN0ZWQgPT09IGZhbHNlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAnaW5kZXRlcm1pbmF0ZSc7XG4gIH1cblxuICBmdW5jdGlvbiBhdWdtZW50T3B0aW9uVG9GdWxsT3B0aW9uPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIG9wdGlvbjogU291cmNlT3B0aW9uPE8+LFxuICAgIG1hbmFnZXJPcHRpb25zPzogTWFuYWdlck9wdGlvbnM8Tz4sXG4gICk6IEZ1bGxPcHRpb248Tz4ge1xuICAgIGlmIChvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgYXVnbWVudGVkQ2hpbGRyZW4gPSBvcHRpb24uY2hpbGRyZW4ubWFwKGNoaWxkID0+XG4gICAgICAgIGF1Z21lbnRPcHRpb25Ub0Z1bGxPcHRpb24oc3RhdGUsIGNoaWxkLCBtYW5hZ2VyT3B0aW9ucyksXG4gICAgICApO1xuICAgICAgY29uc3Qgc2VsZWN0YWJsZVdoZW5TZWFyY2hpbmcgPVxuICAgICAgICBtYW5hZ2VyT3B0aW9ucz8uYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoID8/IGZhbHNlO1xuXG4gICAgICAvLyBXaGVuIGFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaCBpcyBlbmFibGVkIGFuZCBzZWFyY2ggaXMgYWN0aXZlLFxuICAgICAgLy8gY2FsY3VsYXRlIHNlbGVjdGlvbiBzdGF0ZSBmcm9tIEFMTCBvcmlnaW5hbCBjaGlsZHJlbiwgbm90IGp1c3QgdGhlXG4gICAgICAvLyBmaWx0ZXJlZCBvbmVzIHZpc2libGUgaW4gc2VhcmNoIHJlc3VsdHMuXG4gICAgICBjb25zdCB1c2VPcmlnaW5hbEZvclNlbGVjdGlvblN0YXRlID1cbiAgICAgICAgbWFuYWdlck9wdGlvbnM/LmFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaCAmJlxuICAgICAgICBzdGF0ZS5xdWVyeS5zZWFyY2ggJiZcbiAgICAgICAgc3RhdGUub3JpZ2luYWxPcHRpb25Hcm91cHMubGVuZ3RoID4gMDtcblxuICAgICAgbGV0IHNlbGVjdGVkOiBNdWx0aVNlbGVjdGlvblN0YXRlO1xuICAgICAgaWYgKHVzZU9yaWdpbmFsRm9yU2VsZWN0aW9uU3RhdGUpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxPcHRpb24gPSBmaW5kT3B0aW9uKFxuICAgICAgICAgIGdldFRvcExldmVsT3B0aW9ucyhzdGF0ZS5vcmlnaW5hbE9wdGlvbkdyb3VwcyksXG4gICAgICAgICAgb3B0aW9uLmlkLFxuICAgICAgICApO1xuICAgICAgICBpZiAob3JpZ2luYWxPcHRpb24pIHtcbiAgICAgICAgICBjb25zdCBhbGxMZWF2ZXMgPSBmbGF0dGVuT3B0aW9ucyhbb3JpZ2luYWxPcHRpb25dLCB0cnVlKTtcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZENvdW50ID0gYWxsTGVhdmVzLmZpbHRlcihsZWFmID0+XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQuaGFzKGxlYWYpLFxuICAgICAgICAgICkubGVuZ3RoO1xuICAgICAgICAgIGlmIChzZWxlY3RlZENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBzZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRDb3VudCA9PT0gYWxsTGVhdmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxlY3RlZCA9ICdpbmRldGVybWluYXRlJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0ZWQgPSBnZXRQYXJlbnRNdWx0aVNlbGVjdGlvblN0YXRlKGF1Z21lbnRlZENoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWQgPSBnZXRQYXJlbnRNdWx0aVNlbGVjdGlvblN0YXRlKGF1Z21lbnRlZENoaWxkcmVuKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICBjaGlsZHJlbjogYXVnbWVudGVkQ2hpbGRyZW4sXG4gICAgICAgIHNlbGVjdGVkLFxuICAgICAgICBleHBhbmRlZDogc3RhdGUucXVlcnkuc2VhcmNoXG4gICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgOiBzdGF0ZS5kaXNwbGF5LmV4cGFuZGVkT3B0aW9ucy5oYXMob3B0aW9uLmlkKSxcbiAgICAgICAgc2VsZWN0YWJsZTogIXN0YXRlLnF1ZXJ5LnNlYXJjaCB8fCBzZWxlY3RhYmxlV2hlblNlYXJjaGluZyxcbiAgICAgICAgZXhwYW5kYWJsZTogIXN0YXRlLnF1ZXJ5LnNlYXJjaCxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5vcHRpb24sXG4gICAgICBjaGlsZHJlbjogdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0ZWQ6IHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZC5oYXMob3B0aW9uKSxcbiAgICAgIGV4cGFuZGVkOiBmYWxzZSxcbiAgICAgIHNlbGVjdGFibGU6IHRydWUsXG4gICAgICBleHBhbmRhYmxlOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkT3B0aW9uc0ZvckRpc3BsYXk8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgdG9wTGV2ZWxPcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBzdHJpbmcge1xuICAgIC8vIElmIHdlIGhhdmUgYSBjdXN0b20gZGlzcGxheSBmdW5jdGlvbiwgdXNlIGl0XG4gICAgaWYgKG9wdGlvbnM/LmdldEN1c3RvbU9wdGlvbkRpc3BsYXkpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmdldEN1c3RvbU9wdGlvbkRpc3BsYXkoWy4uLnN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZF0pO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucz8udXNlVG9wTGV2ZWxPcHRpb25zRm9yRGlzcGxheSkge1xuICAgICAgcmV0dXJuIGdldFRvcExldmVsRm9ybWF0dGVkT3B0aW9uc0ZvckRpc3BsYXkodG9wTGV2ZWxPcHRpb25zKTtcbiAgICB9XG4gICAgLy8gT3RoZXJ3aXNlLCB1c2UgdGhlIGRlZmF1bHQgZGlzcGxheSBmb3Igb3B0aW9ucyAtIHRpdGxlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLlxuICAgIHJldHVybiBbLi4uc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkXS5tYXAoKHsgdGl0bGUgfSkgPT4gdGl0bGUpLmpvaW4oJywgJyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRUb3BMZXZlbEZvcm1hdHRlZE9wdGlvbnNGb3JEaXNwbGF5PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICB0b3BMZXZlbE9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSxcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAoIXRvcExldmVsT3B0aW9ucyB8fCB0b3BMZXZlbE9wdGlvbnMubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0ZWRPckluZGV0ZXJtaW5hdGVUb3BPcHRpb25zID0gdG9wTGV2ZWxPcHRpb25zLmZpbHRlcihcbiAgICAgIG9wdGlvbiA9PiBvcHRpb24uc2VsZWN0ZWQgIT0gZmFsc2UsXG4gICAgKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRPckluZGV0ZXJtaW5hdGVUb3BPcHRpb25zXG4gICAgICAubWFwKCh7IHRpdGxlIH0pID0+IHRpdGxlKVxuICAgICAgLmpvaW4oJywgJyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQaWxsQ291bnRGb3JEaXNwbGF5PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIHRvcExldmVsT3B0aW9uczogRnVsbE9wdGlvbjxPPltdLFxuICAgIG9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAob3B0aW9ucz8udXNlVG9wTGV2ZWxPcHRpb25zRm9yRGlzcGxheSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRPckluZGV0ZXJtaW5hdGVUb3BPcHRpb25zID0gdG9wTGV2ZWxPcHRpb25zLmZpbHRlcihcbiAgICAgICAgb3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCAhPSBmYWxzZSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gc2VsZWN0ZWRPckluZGV0ZXJtaW5hdGVUb3BPcHRpb25zLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZC5zaXplO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0WmVyb1N0YXRlTWVzc2FnZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHN0YXRlLnNvdXJjZU9wdGlvbkdyb3Vwcy5ldmVyeShncm91cCA9PiBncm91cC5vcHRpb25zLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIGlmIChzdGF0ZS5xdWVyeS5zZWFyY2gpIHJldHVybiAnTm8gcmVzdWx0cyBmb3VuZC4nO1xuICAgICAgcmV0dXJuICdObyBvcHRpb25zLic7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gZmluZE9wdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uczogU291cmNlT3B0aW9uPE8+W10sXG4gICAgaWQ6IE9bJ2lkJ10sXG4gICk6IFNvdXJjZU9wdGlvbjxPPiB8IG51bGwge1xuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgIGlmIChvcHRpb24uaWQgPT09IGlkKSByZXR1cm4gb3B0aW9uO1xuICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gZmluZE9wdGlvbihvcHRpb24uY2hpbGRyZW4sIGlkKTtcbiAgICAgICAgaWYgKGNoaWxkKSByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gZmxhdHRlbk9wdGlvbnM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbnM6IE9wdGlvbjxPPltdLFxuICAgIGxlYWZPbmx5OiBib29sZWFuLFxuICApOiBPW10ge1xuICAgIHJldHVybiBmbGF0dGVuRGVlcChcbiAgICAgIG9wdGlvbnMubWFwKG9wdGlvbiA9PiB7XG4gICAgICAgIGlmIChvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gb3B0aW9uLmNoaWxkcmVuLm1hcChjaGlsZCA9PlxuICAgICAgICAgICAgZmxhdHRlbk9wdGlvbnMoW2NoaWxkXSwgbGVhZk9ubHkpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGxlYWZPbmx5ID8gZGVzY2VuZGFudHMgOiBbb3B0aW9uLCAuLi5kZXNjZW5kYW50c107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtvcHRpb25dO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlU2VsZWN0ZWQ8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgaWQ6IE9bJ2lkJ10sXG4gICAgbWFuYWdlck9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogQ29yZVN0YXRlPE8+IHtcbiAgICBjb25zdCB0b3BMZXZlbE9wdGlvbnMgPSBnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUuc291cmNlT3B0aW9uR3JvdXBzKTtcbiAgICBjb25zdCBvcHRpb24gPSBmaW5kT3B0aW9uKHRvcExldmVsT3B0aW9ucywgaWQpO1xuICAgIGlmICghb3B0aW9uKSByZXR1cm4gc3RhdGU7XG5cbiAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBuZXcgT3B0aW9uU2V0KHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZCk7XG5cbiAgICBjb25zdCBuZXdWYWx1ZSA9ICEoXG4gICAgICBhdWdtZW50T3B0aW9uVG9GdWxsT3B0aW9uKHN0YXRlLCBvcHRpb24sIG1hbmFnZXJPcHRpb25zKS5zZWxlY3RlZCA9PT0gdHJ1ZVxuICAgICk7XG5cbiAgICAvLyBXaGVuIGFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaCBpcyBlbmFibGVkIGFuZCBzZWFyY2ggaXMgYWN0aXZlLFxuICAgIC8vIHVzZSB0aGUgb3JpZ2luYWwgKHVuZmlsdGVyZWQpIGRhdGEgdG8gZ2V0IGFsbCBjaGlsZHJlbiwgbm90IGp1c3RcbiAgICAvLyB0aG9zZSB2aXNpYmxlIGluIHRoZSBmaWx0ZXJlZCBzZWFyY2ggcmVzdWx0cy5cbiAgICBjb25zdCB1c2VPcmlnaW5hbERhdGEgPVxuICAgICAgbWFuYWdlck9wdGlvbnM/LmFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaCAmJlxuICAgICAgc3RhdGUucXVlcnkuc2VhcmNoICYmXG4gICAgICBzdGF0ZS5vcmlnaW5hbE9wdGlvbkdyb3Vwcy5sZW5ndGggPiAwO1xuXG4gICAgY29uc3Qgb3B0aW9uRm9yTGVhdmVzID0gdXNlT3JpZ2luYWxEYXRhXG4gICAgICA/IGZpbmRPcHRpb24oZ2V0VG9wTGV2ZWxPcHRpb25zKHN0YXRlLm9yaWdpbmFsT3B0aW9uR3JvdXBzKSwgaWQpID8/IG9wdGlvblxuICAgICAgOiBvcHRpb247XG5cbiAgICBjb25zdCBsZWF2ZXMgPSBmbGF0dGVuT3B0aW9ucyhbb3B0aW9uRm9yTGVhdmVzXSwgdHJ1ZSk7XG4gICAgZm9yIChjb25zdCBsZWFmIG9mIGxlYXZlcykge1xuICAgICAgaWYgKG5ld1ZhbHVlKSB7XG4gICAgICAgIG5ld1NlbGVjdGlvbi5hZGQobGVhZik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdTZWxlY3Rpb24uZGVsZXRlKGxlYWYpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICBzZWxlY3RlZDogbmV3U2VsZWN0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0U2VsZWN0ZWRPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgaWQ6IE9bJ2lkJ10sXG4gICk6IENvcmVTdGF0ZTxPPiB7XG4gICAgY29uc3QgdG9wTGV2ZWxPcHRpb25zID0gZ2V0VG9wTGV2ZWxPcHRpb25zKHN0YXRlLnNvdXJjZU9wdGlvbkdyb3Vwcyk7XG4gICAgY29uc3Qgb3B0aW9uID0gZmluZE9wdGlvbih0b3BMZXZlbE9wdGlvbnMsIGlkKTtcbiAgICBpZiAoIW9wdGlvbikgcmV0dXJuIHN0YXRlO1xuXG4gICAgY29uc3QgbmV3U2VsZWN0aW9uID0gbmV3IE9wdGlvblNldDxPPigpO1xuICAgIG5ld1NlbGVjdGlvbi5hZGQob3B0aW9uKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICBzZWxlY3RlZDogbmV3U2VsZWN0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlVmlzaWJsZVNlbGVjdGVkPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICApOiBDb3JlU3RhdGU8Tz4ge1xuICAgIGNvbnN0IGxlYXZlcyA9IGZsYXR0ZW5PcHRpb25zKFxuICAgICAgZ2V0VG9wTGV2ZWxPcHRpb25zKHN0YXRlLnNvdXJjZU9wdGlvbkdyb3VwcyksXG4gICAgICB0cnVlLFxuICAgICk7XG4gICAgY29uc3QgaXNBbGxTZWxlY3RlZCA9IGxlYXZlcy5ldmVyeShsZWFmID0+XG4gICAgICBzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQuaGFzKGxlYWYpLFxuICAgICk7XG4gICAgY29uc3QgbmV3U2VsZWN0aW9uID0gbmV3IE9wdGlvblNldChzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuXG4gICAgZm9yIChjb25zdCBsZWFmIG9mIGxlYXZlcykge1xuICAgICAgaWYgKGlzQWxsU2VsZWN0ZWQpIG5ld1NlbGVjdGlvbi5kZWxldGUobGVhZik7XG4gICAgICBlbHNlIG5ld1NlbGVjdGlvbi5hZGQobGVhZik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIC4uLnN0YXRlLnNlbGVjdGlvbixcbiAgICAgICAgc2VsZWN0ZWQ6IG5ld1NlbGVjdGlvbixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvZ2dsZU9wdGlvbkV4cGFuZGVkPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIGlkOiBPWydpZCddLFxuICApOiBDb3JlU3RhdGU8Tz4ge1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gIXN0YXRlLmRpc3BsYXkuZXhwYW5kZWRPcHRpb25zLmhhcyhpZCk7XG4gICAgY29uc3QgbmV3RXhwYW5kZWRPcHRpb25zID0gbmV3IFNldChzdGF0ZS5kaXNwbGF5LmV4cGFuZGVkT3B0aW9ucyk7XG4gICAgaWYgKG5ld1ZhbHVlKSBuZXdFeHBhbmRlZE9wdGlvbnMuYWRkKGlkKTtcbiAgICBlbHNlIG5ld0V4cGFuZGVkT3B0aW9ucy5kZWxldGUoaWQpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgLi4uc3RhdGUuZGlzcGxheSxcbiAgICAgICAgZXhwYW5kZWRPcHRpb25zOiBuZXdFeHBhbmRlZE9wdGlvbnMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBzaWRlRWZmZWN0czxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICBhY3Rpb246IEFjdGlvbjxPPiB8IEludGVybmFsQWN0aW9uPE8+LFxuICAgIHNvdXJjZTogU291cmNlPE8+LFxuICAgIGludGVybmFsQWN0aW9uczogU3ViamVjdDxJbnRlcm5hbEFjdGlvbjxPPj4sXG4gICk6IENvcmVTdGF0ZTxPPiB7XG4gICAgaWYgKFxuICAgICAgYWN0aW9uLnR5cGUgPT09ICdsb2FkJyB8fFxuICAgICAgYWN0aW9uLnR5cGUgPT09ICdzZWFyY2hDaGFuZ2UnIHx8XG4gICAgICBhY3Rpb24udHlwZSA9PT0gJ29yZGVyQ2hhbmdlJyB8fFxuICAgICAgKGFjdGlvbi50eXBlID09PSAnb3BlbkNoYW5nZScgJiYgYWN0aW9uLm9wZW4pXG4gICAgKSB7XG4gICAgICBzb3VyY2Uoc3RhdGUucXVlcnksIGFjdGlvbilcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogcmVzdWx0LmRhdGE7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhID0gQXJyYXkuaXNBcnJheShyZXN1bHQpXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiByZXN1bHQub3JpZ2luYWxEYXRhO1xuICAgICAgICAgIGludGVybmFsQWN0aW9ucy5uZXh0KHsgdHlwZTogJ2xvYWRDb21wbGV0ZScsIGRhdGEsIG9yaWdpbmFsRGF0YSB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIGludGVybmFsQWN0aW9ucy5uZXh0KHsgdHlwZTogJ2xvYWRFcnJvcicsIGVycm9yIH0pO1xuICAgICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBsb2FkOiB7XG4gICAgICAgICAgbG9hZGluZzogdHJ1ZSxcbiAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZHVjZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICBhY3Rpb246IEFjdGlvbjxPPiB8IEludGVybmFsQWN0aW9uPE8+LFxuICAgIG1hbmFnZXJPcHRpb25zPzogTWFuYWdlck9wdGlvbnM8Tz4sXG4gICk6IENvcmVTdGF0ZTxPPiB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgY2FzZSAnbG9hZCc6XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIGNhc2UgJ2xvYWRDb21wbGV0ZSc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgbG9hZDoge1xuICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNvdXJjZU9wdGlvbkdyb3VwczogYWN0aW9uLmRhdGEsXG4gICAgICAgICAgb3JpZ2luYWxPcHRpb25Hcm91cHM6IGFjdGlvbi5vcmlnaW5hbERhdGEgPz8gW10sXG4gICAgICAgIH07XG4gICAgICBjYXNlICdsb2FkRXJyb3InOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIGxvYWQ6IHtcbiAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGFjdGlvbi5lcnJvcixcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgY2FzZSAnb3BlbkNoYW5nZSc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgc2VhcmNoOiAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmRpc3BsYXksXG4gICAgICAgICAgICBvcGVuOiBhY3Rpb24ub3BlbixcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgY2FzZSAnc2VhcmNoQ2hhbmdlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBzZWFyY2g6IGFjdGlvbi5wYXlsb2FkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICBjYXNlICdvcmRlckNoYW5nZSc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgb3JkZXI6IGFjdGlvbi5wYXlsb2FkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICBjYXNlICdzZWxlY3Rpb25DaGFuZ2UnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHNlbGVjdGlvbjogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgIH07XG4gICAgICBjYXNlICd0b2dnbGVPcHRpb25TZWxlY3RlZCc6XG4gICAgICAgIHJldHVybiB0b2dnbGVTZWxlY3RlZChzdGF0ZSwgYWN0aW9uLmlkLCBtYW5hZ2VyT3B0aW9ucyk7XG4gICAgICBjYXNlICdzZXRTZWxlY3RlZE9wdGlvbic6XG4gICAgICAgIHJldHVybiBzZXRTZWxlY3RlZE9wdGlvbihzdGF0ZSwgYWN0aW9uLmlkKTtcbiAgICAgIGNhc2UgJ3Zpc2libGVTZWxlY3RlZENoYW5nZSc6XG4gICAgICAgIHJldHVybiB0b2dnbGVWaXNpYmxlU2VsZWN0ZWQoc3RhdGUpO1xuICAgICAgY2FzZSAndG9nZ2xlT3B0aW9uRXhwYW5kZWQnOlxuICAgICAgICByZXR1cm4gdG9nZ2xlT3B0aW9uRXhwYW5kZWQoc3RhdGUsIGFjdGlvbi5pZCk7XG4gICAgfVxuICB9XG59XG4iXX0=