@rivet-health/design-system 40.44.3 → 41.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/fesm2022/rivet-health-design-system.mjs +23103 -18772
  2. package/fesm2022/rivet-health-design-system.mjs.map +1 -1
  3. package/package.json +8 -9
  4. package/types/rivet-health-design-system.d.ts +6566 -0
  5. package/esm2022/lib/accessibility/sr-only/sr-only.component.mjs +0 -18
  6. package/esm2022/lib/download/download.service.mjs +0 -47
  7. package/esm2022/lib/format/pipes/common.mjs +0 -24
  8. package/esm2022/lib/format/pipes/date.pipe.mjs +0 -20
  9. package/esm2022/lib/format/pipes/days.pipe.mjs +0 -20
  10. package/esm2022/lib/format/pipes/dollars.pipe.mjs +0 -19
  11. package/esm2022/lib/format/pipes/number.pipe.mjs +0 -19
  12. package/esm2022/lib/format/pipes/percentage.pipe.mjs +0 -19
  13. package/esm2022/lib/format/pipes/sentence-case.pipe.mjs +0 -61
  14. package/esm2022/lib/format/pipes/small-currency.pipe.mjs +0 -24
  15. package/esm2022/lib/format/pipes/small-number.pipe.mjs +0 -29
  16. package/esm2022/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +0 -62
  17. package/esm2022/lib/format/truncate/truncate.component.mjs +0 -51
  18. package/esm2022/lib/icon/dom-cache.mjs +0 -32
  19. package/esm2022/lib/icon/icon.component.mjs +0 -86
  20. package/esm2022/lib/icon/icons.mjs +0 -271
  21. package/esm2022/lib/input/alphabetic-field/alphabetic-field.component.mjs +0 -42
  22. package/esm2022/lib/input/auto-focus/auto-focus.directive.mjs +0 -48
  23. package/esm2022/lib/input/button/button.component.mjs +0 -139
  24. package/esm2022/lib/input/button-group/button-group.component.mjs +0 -39
  25. package/esm2022/lib/input/calendar/calendar.component.mjs +0 -318
  26. package/esm2022/lib/input/card-checkbox/card-checkbox.component.mjs +0 -13
  27. package/esm2022/lib/input/checkbox/checkbox.component.mjs +0 -84
  28. package/esm2022/lib/input/currency-field/currency-field.component.mjs +0 -26
  29. package/esm2022/lib/input/date/date.component.mjs +0 -279
  30. package/esm2022/lib/input/date-range/date-range.component.mjs +0 -477
  31. package/esm2022/lib/input/filter-chip/filter-chip.component.mjs +0 -47
  32. package/esm2022/lib/input/filter-dropdown/filter-dropdown.component.mjs +0 -89
  33. package/esm2022/lib/input/input-label/input-label.component.mjs +0 -38
  34. package/esm2022/lib/input/mentions-input/mentions-input.component.mjs +0 -745
  35. package/esm2022/lib/input/number-field/number-field.component.mjs +0 -125
  36. package/esm2022/lib/input/percentage-field/percentage-field.component.mjs +0 -20
  37. package/esm2022/lib/input/phone-field/phone-field.component.mjs +0 -74
  38. package/esm2022/lib/input/radio/radio.component.mjs +0 -58
  39. package/esm2022/lib/input/search/search.component.mjs +0 -26
  40. package/esm2022/lib/input/search-select/search-select.component.mjs +0 -189
  41. package/esm2022/lib/input/select/select/select.component.mjs +0 -178
  42. package/esm2022/lib/input/select/select-node/select-node.component.mjs +0 -60
  43. package/esm2022/lib/input/select/state.mjs +0 -882
  44. package/esm2022/lib/input/simple-select/option-group.pipe.mjs +0 -19
  45. package/esm2022/lib/input/simple-select/simple-select.component.mjs +0 -178
  46. package/esm2022/lib/input/switch-checkbox/switch-checkbox.component.mjs +0 -33
  47. package/esm2022/lib/input/text-field/text-field.component.mjs +0 -115
  48. package/esm2022/lib/input/textarea-field/textarea-field.component.mjs +0 -21
  49. package/esm2022/lib/input/validation-message/validation-message.component.mjs +0 -17
  50. package/esm2022/lib/layout/card/card-actions.component.mjs +0 -72
  51. package/esm2022/lib/layout/card/card-content.component.mjs +0 -64
  52. package/esm2022/lib/layout/card/card-header.component.mjs +0 -201
  53. package/esm2022/lib/layout/card/card-link.component.mjs +0 -94
  54. package/esm2022/lib/layout/card/card-media.component.mjs +0 -70
  55. package/esm2022/lib/layout/card/card.component.mjs +0 -291
  56. package/esm2022/lib/layout/setting-row/setting-row.component.mjs +0 -111
  57. package/esm2022/lib/load/loading/loading.component.mjs +0 -43
  58. package/esm2022/lib/load/loading-cover/loading-cover.component.mjs +0 -25
  59. package/esm2022/lib/navigation/editable-heading/editable-heading.component.mjs +0 -243
  60. package/esm2022/lib/navigation/link/link.component.mjs +0 -48
  61. package/esm2022/lib/navigation/page-header/page-header.component.mjs +0 -68
  62. package/esm2022/lib/navigation/simple-tabs/simple-tab/simple-tab.component.mjs +0 -43
  63. package/esm2022/lib/navigation/simple-tabs/simple-tabs/simple-tabs.component.mjs +0 -11
  64. package/esm2022/lib/navigation/tabs/tab/tab.component.mjs +0 -16
  65. package/esm2022/lib/navigation/tabs/tabs/tabs.component.mjs +0 -11
  66. package/esm2022/lib/navigation/views/all-views-modal/all-views-modal.component.mjs +0 -43
  67. package/esm2022/lib/navigation/views/edit-view/edit-view.component.mjs +0 -118
  68. package/esm2022/lib/navigation/views/permission-picker/permission-picker.component.mjs +0 -151
  69. package/esm2022/lib/navigation/views/state.mjs +0 -456
  70. package/esm2022/lib/navigation/views/view-menu/view-menu.component.mjs +0 -30
  71. package/esm2022/lib/navigation/views/views/views.component.mjs +0 -90
  72. package/esm2022/lib/notification/badge/badge.component.mjs +0 -45
  73. package/esm2022/lib/notification/banner/banner-action.component.mjs +0 -48
  74. package/esm2022/lib/notification/banner/banner.component.mjs +0 -61
  75. package/esm2022/lib/notification/map-indicator/map-indicator.component.mjs +0 -50
  76. package/esm2022/lib/notification/map-indicator/map-indicators.mjs +0 -15
  77. package/esm2022/lib/notification/notification-badge/notification-badge.component.mjs +0 -26
  78. package/esm2022/lib/overlay/callout/callout.component.mjs +0 -130
  79. package/esm2022/lib/overlay/callout/callout.helpers.mjs +0 -113
  80. package/esm2022/lib/overlay/callout/help/help.component.mjs +0 -23
  81. package/esm2022/lib/overlay/callout/lock-scroll.directive.mjs +0 -69
  82. package/esm2022/lib/overlay/callout/menu/menu-item/menu-item.component.mjs +0 -71
  83. package/esm2022/lib/overlay/callout/menu/menu.component.mjs +0 -38
  84. package/esm2022/lib/overlay/callout/select-callout-defaults.mjs +0 -13
  85. package/esm2022/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +0 -30
  86. package/esm2022/lib/overlay/callout/tooltip/tooltip.component.mjs +0 -57
  87. package/esm2022/lib/overlay/callout/tooltip/tooltip.directive.mjs +0 -138
  88. package/esm2022/lib/overlay/modal/dialog/dialog.component.mjs +0 -47
  89. package/esm2022/lib/overlay/modal/dialog-stack.service.mjs +0 -41
  90. package/esm2022/lib/overlay/modal/form-dialog/form-dialog.component.mjs +0 -146
  91. package/esm2022/lib/overlay/modal/modal.component.mjs +0 -31
  92. package/esm2022/lib/overlay/modal/side-sheet/side-sheet.component.mjs +0 -30
  93. package/esm2022/lib/overlay/overlay-outlet.component.mjs +0 -98
  94. package/esm2022/lib/overlay/overlay.directive.mjs +0 -25
  95. package/esm2022/lib/overlay/overlay.service.mjs +0 -35
  96. package/esm2022/lib/overlay/toast/toast-action.component.mjs +0 -11
  97. package/esm2022/lib/overlay/toast/toast.component.mjs +0 -41
  98. package/esm2022/lib/riv.module.mjs +0 -580
  99. package/esm2022/lib/size/size.directive.mjs +0 -33
  100. package/esm2022/lib/table/simple-table/coordinate-helper.mjs +0 -61
  101. package/esm2022/lib/table/simple-table/simple-table-cell.component.mjs +0 -36
  102. package/esm2022/lib/table/simple-table/simple-table-header-cell.component.mjs +0 -37
  103. package/esm2022/lib/table/simple-table/simple-table-row.component.mjs +0 -19
  104. package/esm2022/lib/table/simple-table/simple-table.component.mjs +0 -104
  105. package/esm2022/lib/table/table/clipboard.mjs +0 -182
  106. package/esm2022/lib/table/table/state-helpers/collapse-helpers.mjs +0 -116
  107. package/esm2022/lib/table/table/state-helpers/column-helpers.mjs +0 -383
  108. package/esm2022/lib/table/table/state-helpers/display-helpers.mjs +0 -50
  109. package/esm2022/lib/table/table/state-helpers/nesting-helpers.mjs +0 -123
  110. package/esm2022/lib/table/table/state-helpers/order-helpers.mjs +0 -164
  111. package/esm2022/lib/table/table/state-helpers/pagination-helpers.mjs +0 -139
  112. package/esm2022/lib/table/table/state-helpers/result-helpers.mjs +0 -70
  113. package/esm2022/lib/table/table/state-helpers/search-helpers.mjs +0 -72
  114. package/esm2022/lib/table/table/state-helpers/selection-helpers.mjs +0 -180
  115. package/esm2022/lib/table/table/state.mjs +0 -1035
  116. package/esm2022/lib/table/table/table/table.component.mjs +0 -367
  117. package/esm2022/lib/table/table/table-collapse-all/table-collapse-all.component.mjs +0 -25
  118. package/esm2022/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +0 -227
  119. package/esm2022/lib/table/table/table-column-settings/table-column-settings.component.mjs +0 -134
  120. package/esm2022/lib/table/table/table-csv-export/table-csv-export.component.mjs +0 -35
  121. package/esm2022/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.mjs +0 -28
  122. package/esm2022/lib/table/table/table-search/table-search.component.mjs +0 -71
  123. package/esm2022/lib/table/table/table-search-columns/table-search-columns.component.mjs +0 -57
  124. package/esm2022/lib/util/local-storage.mjs +0 -17
  125. package/esm2022/lib/visibility/visibility.directive.mjs +0 -34
  126. package/esm2022/lib/visualization/chart/chart-scaling.mjs +0 -380
  127. package/esm2022/lib/visualization/chart/chart.component.mjs +0 -626
  128. package/esm2022/lib/visualization/chart/chart.mjs +0 -3768
  129. package/esm2022/lib/visualization/data-table/data-table-cell.component.mjs +0 -22
  130. package/esm2022/lib/visualization/data-table/data-table-header-cell.component.mjs +0 -11
  131. package/esm2022/lib/visualization/data-table/data-table-row.component.mjs +0 -19
  132. package/esm2022/lib/visualization/data-table/data-table.component.mjs +0 -17
  133. package/esm2022/lib/visualization/donut/donut.component.mjs +0 -54
  134. package/esm2022/lib/visualization/funnel-chart/funnel-chart.component.mjs +0 -73
  135. package/esm2022/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +0 -33
  136. package/esm2022/lib/visualization/highlight/highlight.component.mjs +0 -24
  137. package/esm2022/lib/visualization/highlight/highlight.helpers.mjs +0 -20
  138. package/esm2022/lib/visualization/intervals.mjs +0 -63
  139. package/esm2022/lib/visualization/issue/issue.component.mjs +0 -30
  140. package/esm2022/lib/visualization/legend-item/legend-item.component.mjs +0 -49
  141. package/esm2022/lib/visualization/metric/metric.component.mjs +0 -52
  142. package/esm2022/lib/visualization/mini-pie/mini-pie.component.mjs +0 -51
  143. package/esm2022/lib/visualization/progress/progress.component.mjs +0 -24
  144. package/esm2022/lib/visualization/stacked-column/stacked-column.component.mjs +0 -377
  145. package/esm2022/lib/visualization/stacked-column/stacked-column.helpers.mjs +0 -18
  146. package/esm2022/lib/visualization/stacked-row/stacked-row.component.mjs +0 -270
  147. package/esm2022/lib/visualization/stacked-row/stacked-row.helpers.mjs +0 -74
  148. package/esm2022/lib/visualization/time-series/time-series.component.mjs +0 -374
  149. package/esm2022/lib/visualization/time-series/time-series.helpers.mjs +0 -15
  150. package/esm2022/lib/visualization/trend/trend.component.mjs +0 -51
  151. package/esm2022/lib/visualization/zero-state/zero-state.component.mjs +0 -22
  152. package/esm2022/public-api.mjs +0 -118
  153. package/esm2022/rivet-health-design-system.mjs +0 -5
  154. package/index.d.ts +0 -5
  155. package/lib/accessibility/sr-only/sr-only.component.d.ts +0 -12
  156. package/lib/download/download.service.d.ts +0 -9
  157. package/lib/format/pipes/common.d.ts +0 -6
  158. package/lib/format/pipes/date.pipe.d.ts +0 -8
  159. package/lib/format/pipes/days.pipe.d.ts +0 -8
  160. package/lib/format/pipes/dollars.pipe.d.ts +0 -9
  161. package/lib/format/pipes/number.pipe.d.ts +0 -8
  162. package/lib/format/pipes/percentage.pipe.d.ts +0 -8
  163. package/lib/format/pipes/sentence-case.pipe.d.ts +0 -8
  164. package/lib/format/pipes/small-currency.pipe.d.ts +0 -8
  165. package/lib/format/pipes/small-number.pipe.d.ts +0 -8
  166. package/lib/format/svg-text-truncate/svg-text-truncate.directive.d.ts +0 -14
  167. package/lib/format/truncate/truncate.component.d.ts +0 -17
  168. package/lib/icon/dom-cache.d.ts +0 -13
  169. package/lib/icon/icon.component.d.ts +0 -27
  170. package/lib/icon/icons.d.ts +0 -137
  171. package/lib/input/alphabetic-field/alphabetic-field.component.d.ts +0 -14
  172. package/lib/input/auto-focus/auto-focus.directive.d.ts +0 -21
  173. package/lib/input/button/button.component.d.ts +0 -37
  174. package/lib/input/button-group/button-group.component.d.ts +0 -11
  175. package/lib/input/calendar/calendar.component.d.ts +0 -67
  176. package/lib/input/card-checkbox/card-checkbox.component.d.ts +0 -6
  177. package/lib/input/checkbox/checkbox.component.d.ts +0 -32
  178. package/lib/input/currency-field/currency-field.component.d.ts +0 -9
  179. package/lib/input/date/date.component.d.ts +0 -62
  180. package/lib/input/date-range/date-range.component.d.ts +0 -97
  181. package/lib/input/filter-chip/filter-chip.component.d.ts +0 -13
  182. package/lib/input/filter-dropdown/filter-dropdown.component.d.ts +0 -30
  183. package/lib/input/input-label/input-label.component.d.ts +0 -17
  184. package/lib/input/mentions-input/mentions-input.component.d.ts +0 -93
  185. package/lib/input/number-field/number-field.component.d.ts +0 -36
  186. package/lib/input/percentage-field/percentage-field.component.d.ts +0 -7
  187. package/lib/input/phone-field/phone-field.component.d.ts +0 -17
  188. package/lib/input/radio/radio.component.d.ts +0 -28
  189. package/lib/input/search/search.component.d.ts +0 -10
  190. package/lib/input/search-select/search-select.component.d.ts +0 -62
  191. package/lib/input/select/select/select.component.d.ts +0 -63
  192. package/lib/input/select/select-node/select-node.component.d.ts +0 -30
  193. package/lib/input/select/state.d.ts +0 -250
  194. package/lib/input/simple-select/option-group.pipe.d.ts +0 -8
  195. package/lib/input/simple-select/simple-select.component.d.ts +0 -63
  196. package/lib/input/switch-checkbox/switch-checkbox.component.d.ts +0 -18
  197. package/lib/input/text-field/text-field.component.d.ts +0 -38
  198. package/lib/input/textarea-field/textarea-field.component.d.ts +0 -8
  199. package/lib/input/validation-message/validation-message.component.d.ts +0 -6
  200. package/lib/layout/card/card-actions.component.d.ts +0 -38
  201. package/lib/layout/card/card-content.component.d.ts +0 -33
  202. package/lib/layout/card/card-header.component.d.ts +0 -132
  203. package/lib/layout/card/card-link.component.d.ts +0 -54
  204. package/lib/layout/card/card-media.component.d.ts +0 -43
  205. package/lib/layout/card/card.component.d.ts +0 -215
  206. package/lib/layout/setting-row/setting-row.component.d.ts +0 -72
  207. package/lib/load/loading/loading.component.d.ts +0 -17
  208. package/lib/load/loading-cover/loading-cover.component.d.ts +0 -10
  209. package/lib/navigation/editable-heading/editable-heading.component.d.ts +0 -118
  210. package/lib/navigation/link/link.component.d.ts +0 -19
  211. package/lib/navigation/page-header/page-header.component.d.ts +0 -50
  212. package/lib/navigation/simple-tabs/simple-tab/simple-tab.component.d.ts +0 -11
  213. package/lib/navigation/simple-tabs/simple-tabs/simple-tabs.component.d.ts +0 -5
  214. package/lib/navigation/tabs/tab/tab.component.d.ts +0 -6
  215. package/lib/navigation/tabs/tabs/tabs.component.d.ts +0 -5
  216. package/lib/navigation/views/all-views-modal/all-views-modal.component.d.ts +0 -14
  217. package/lib/navigation/views/edit-view/edit-view.component.d.ts +0 -31
  218. package/lib/navigation/views/permission-picker/permission-picker.component.d.ts +0 -37
  219. package/lib/navigation/views/state.d.ts +0 -175
  220. package/lib/navigation/views/view-menu/view-menu.component.d.ts +0 -13
  221. package/lib/navigation/views/views/views.component.d.ts +0 -25
  222. package/lib/notification/badge/badge.component.d.ts +0 -14
  223. package/lib/notification/banner/banner-action.component.d.ts +0 -15
  224. package/lib/notification/banner/banner.component.d.ts +0 -25
  225. package/lib/notification/map-indicator/map-indicator.component.d.ts +0 -24
  226. package/lib/notification/map-indicator/map-indicators.d.ts +0 -9
  227. package/lib/notification/notification-badge/notification-badge.component.d.ts +0 -11
  228. package/lib/overlay/callout/callout.component.d.ts +0 -36
  229. package/lib/overlay/callout/callout.helpers.d.ts +0 -16
  230. package/lib/overlay/callout/help/help.component.d.ts +0 -11
  231. package/lib/overlay/callout/lock-scroll.directive.d.ts +0 -22
  232. package/lib/overlay/callout/menu/menu-item/menu-item.component.d.ts +0 -27
  233. package/lib/overlay/callout/menu/menu.component.d.ts +0 -17
  234. package/lib/overlay/callout/select-callout-defaults.d.ts +0 -5
  235. package/lib/overlay/callout/tooltip/locked-tooltip.directive.d.ts +0 -14
  236. package/lib/overlay/callout/tooltip/tooltip.component.d.ts +0 -26
  237. package/lib/overlay/callout/tooltip/tooltip.directive.d.ts +0 -48
  238. package/lib/overlay/modal/dialog/dialog.component.d.ts +0 -19
  239. package/lib/overlay/modal/dialog-stack.service.d.ts +0 -23
  240. package/lib/overlay/modal/form-dialog/form-dialog.component.d.ts +0 -63
  241. package/lib/overlay/modal/modal.component.d.ts +0 -11
  242. package/lib/overlay/modal/side-sheet/side-sheet.component.d.ts +0 -13
  243. package/lib/overlay/overlay-outlet.component.d.ts +0 -19
  244. package/lib/overlay/overlay.directive.d.ts +0 -13
  245. package/lib/overlay/overlay.service.d.ts +0 -14
  246. package/lib/overlay/toast/toast-action.component.d.ts +0 -5
  247. package/lib/overlay/toast/toast.component.d.ts +0 -17
  248. package/lib/riv.module.d.ts +0 -122
  249. package/lib/size/size.directive.d.ts +0 -12
  250. package/lib/table/simple-table/coordinate-helper.d.ts +0 -13
  251. package/lib/table/simple-table/simple-table-cell.component.d.ts +0 -19
  252. package/lib/table/simple-table/simple-table-header-cell.component.d.ts +0 -20
  253. package/lib/table/simple-table/simple-table-row.component.d.ts +0 -6
  254. package/lib/table/simple-table/simple-table.component.d.ts +0 -11
  255. package/lib/table/table/clipboard.d.ts +0 -38
  256. package/lib/table/table/state-helpers/collapse-helpers.d.ts +0 -9
  257. package/lib/table/table/state-helpers/column-helpers.d.ts +0 -29
  258. package/lib/table/table/state-helpers/display-helpers.d.ts +0 -5
  259. package/lib/table/table/state-helpers/nesting-helpers.d.ts +0 -13
  260. package/lib/table/table/state-helpers/order-helpers.d.ts +0 -13
  261. package/lib/table/table/state-helpers/pagination-helpers.d.ts +0 -12
  262. package/lib/table/table/state-helpers/result-helpers.d.ts +0 -10
  263. package/lib/table/table/state-helpers/search-helpers.d.ts +0 -17
  264. package/lib/table/table/state-helpers/selection-helpers.d.ts +0 -13
  265. package/lib/table/table/state.d.ts +0 -512
  266. package/lib/table/table/table/table.component.d.ts +0 -88
  267. package/lib/table/table/table-collapse-all/table-collapse-all.component.d.ts +0 -10
  268. package/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.d.ts +0 -52
  269. package/lib/table/table/table-column-settings/table-column-settings.component.d.ts +0 -37
  270. package/lib/table/table/table-csv-export/table-csv-export.component.d.ts +0 -14
  271. package/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.d.ts +0 -11
  272. package/lib/table/table/table-search/table-search.component.d.ts +0 -21
  273. package/lib/table/table/table-search-columns/table-search-columns.component.d.ts +0 -23
  274. package/lib/util/local-storage.d.ts +0 -14
  275. package/lib/visibility/visibility.directive.d.ts +0 -12
  276. package/lib/visualization/chart/chart-scaling.d.ts +0 -100
  277. package/lib/visualization/chart/chart.component.d.ts +0 -116
  278. package/lib/visualization/chart/chart.d.ts +0 -354
  279. package/lib/visualization/data-table/data-table-cell.component.d.ts +0 -11
  280. package/lib/visualization/data-table/data-table-header-cell.component.d.ts +0 -5
  281. package/lib/visualization/data-table/data-table-row.component.d.ts +0 -6
  282. package/lib/visualization/data-table/data-table.component.d.ts +0 -6
  283. package/lib/visualization/donut/donut.component.d.ts +0 -22
  284. package/lib/visualization/funnel-chart/funnel-chart.component.d.ts +0 -30
  285. package/lib/visualization/funnel-chart/funnel-chart.helpers.d.ts +0 -4
  286. package/lib/visualization/highlight/highlight.component.d.ts +0 -15
  287. package/lib/visualization/highlight/highlight.helpers.d.ts +0 -2
  288. package/lib/visualization/intervals.d.ts +0 -8
  289. package/lib/visualization/issue/issue.component.d.ts +0 -10
  290. package/lib/visualization/legend-item/legend-item.component.d.ts +0 -22
  291. package/lib/visualization/metric/metric.component.d.ts +0 -20
  292. package/lib/visualization/mini-pie/mini-pie.component.d.ts +0 -17
  293. package/lib/visualization/progress/progress.component.d.ts +0 -8
  294. package/lib/visualization/stacked-column/stacked-column.component.d.ts +0 -129
  295. package/lib/visualization/stacked-column/stacked-column.helpers.d.ts +0 -3
  296. package/lib/visualization/stacked-row/stacked-row.component.d.ts +0 -109
  297. package/lib/visualization/stacked-row/stacked-row.helpers.d.ts +0 -53
  298. package/lib/visualization/time-series/time-series.component.d.ts +0 -126
  299. package/lib/visualization/time-series/time-series.helpers.d.ts +0 -34
  300. package/lib/visualization/trend/trend.component.d.ts +0 -13
  301. package/lib/visualization/zero-state/zero-state.component.d.ts +0 -9
  302. package/public-api.d.ts +0 -118
@@ -1,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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9pbnB1dC9zZWxlY3Qvc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUtOLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDckUsT0FBTyxFQUNMLFdBQVcsRUFFWCxHQUFHLEVBQ0gsS0FBSyxFQUVMLGFBQWEsRUFDYixJQUFJLEVBQ0osU0FBUyxFQUNULE9BQU8sR0FDUixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUc1RCxNQUFNLEtBQVcsU0FBUyxDQXk4Q3pCO0FBejhDRCxXQUFpQixTQUFTO0lBQ3hCLGFBQWE7SUFDYixhQUFhO0lBQ2IsYUFBYTtJQXVHYjs7O09BR0c7SUFDSCxNQUFhLFNBQWdDLFNBQVEsR0FBb0I7UUFPdkUsWUFBWSxNQUF5QztZQUNuRCxLQUFLLEVBQUUsQ0FBQztZQVBWLHVFQUF1RTtZQUN2RSx1RUFBdUU7WUFDdkUsdUVBQXVFO1lBQ3ZFLDhEQUE4RDtZQUM3QyxTQUFJLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7WUFJMUQsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNsQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFUSxHQUFHLENBQUMsTUFBdUM7WUFDbEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVRLEdBQUcsQ0FBQyxNQUF1QjtZQUNsQyxN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QUFTLFFBeThDekIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRnVzZSwge1xuICBGdXNlUmVzdWx0LFxuICBGdXNlUmVzdWx0TWF0Y2gsXG4gIElGdXNlT3B0aW9ucyxcbiAgUmFuZ2VUdXBsZSxcbn0gZnJvbSAnZnVzZS5qcyc7XG5pbXBvcnQgeyBkZWZhdWx0c0RlZXAsIGZsYXR0ZW5EZWVwLCBpc051bWJlciwgc29ydEJ5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIGNvbm5lY3RhYmxlLFxuICBDb25uZWN0YWJsZSxcbiAgbWFwLFxuICBtZXJnZSxcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgc2NhbixcbiAgc3RhcnRXaXRoLFxuICBTdWJqZWN0LFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERlZXBQYXJ0aWFsIH0gZnJvbSAndXRpbGl0eS10eXBlcyc7XG5pbXBvcnQgeyBOdW1iZXJQaXBlIH0gZnJvbSAnLi4vLi4vZm9ybWF0L3BpcGVzL251bWJlci5waXBlJztcbmltcG9ydCB7IEhpZ2hsaWdodENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3Zpc3VhbGl6YXRpb24vaGlnaGxpZ2h0L2hpZ2hsaWdodC5jb21wb25lbnQnO1xuXG5leHBvcnQgbmFtZXNwYWNlIFJpdlNlbGVjdCB7XG4gIC8vLy8vLy8vLy8vLy9cbiAgLy8gT3B0aW9ucyAvL1xuICAvLy8vLy8vLy8vLy8vXG5cbiAgLyoqXG4gICAqIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgC0tLS0tLS0tLS0tLS0tLS0tLS3ilIDilIDilIDilJBcbiAgICog4pSCIEJhc2VPcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilIIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCXG4gICAqIOKUgiBUaGUgY29yZSBkYXRhIHJlcXVpcmVkIGZvciBlYWNoIG9wdGlvbiAgICDilIJcbiAgICog4pSCIChzdWNoIGFzIGlkIGFuZCB0aXRsZSkuICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilJzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAtLS0tLS0tLS0tLS0tLS0tLS0t4pSA4pSA4pSkXG4gICAqIOKUgiBPcHRpb24gKEJhc2VPcHRpb24gKyBjaGlsZHJlbikgICAgICAgICAgICDilIJcbiAgICog4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilIIgUHJvdmlkZXMgcmVjdXJzaXZlIHR5cGUgc2FmZXR5IHRvIHRoZSAgICAg4pSCXG4gICAqIOKUgiB0eXBlIHNhZmV0eSB0byB0aGUgQmFzZU9wdGlvbi4gICAgICAgICAgICDilIJcbiAgICog4pSU4pSALS0tLS0tLS0tLS0tLS0tLS0t4pSsLS0tLS0tLeKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgKiAgICAgICAgICAgICAgICAgICAgIHxcbiAgICog4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pa84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAqIOKUgiBTb3VyY2VPcHRpb24gKE9wdGlvbiArIHNlYXJjaCBoaWdobGlnaHRzKSDilIJcbiAgICog4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilIIgQWRkcyBzZWFyY2ggaGlnaGxpZ2h0cyB0byB0aGUgT3B0aW9uIGFuZCAg4pSCXG4gICAqIOKUgiBpcyB0aGUgcmV0dXJuIHR5cGUgZm9yIHRoZSBvcHRpb24gU291cmNlICDilIJcbiAgICog4pSCIChkYXRhIGZldGNoZXIpIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICogICAgICAgICAgICAgICAgICAgICB8XG4gICAqIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKWvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgKiDilIIgRnVsbE9wdGlvbiAoU291cmNlT3B0aW9uICsgVUkgc3RhdGUpICAgICAg4pSCXG4gICAqIOKUgiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIJcbiAgICog4pSCIEF1Z21lbnRzIHRoZSBTb3VyY2VPcHRpb24gd2l0aCBhbGwgb2YgdGhlIOKUglxuICAgKiDilIIgVUkgaW5mb3JtYXRpb24gZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUgICAg4pSCXG4gICAqIOKUgiBzdGF0ZSwgc3VjaCBhcyBzZWxlY3Rpb24gc3RhdHVzLCB3aGV0aGVyICDilIJcbiAgICog4pSCIG9yIG5vdCB0aGUgbm9kZSBpcyBleHBhbmRlZCwgZXRjLiAgICAgICAgIOKUglxuICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSB1c2FnZXMgb2YgT21pdDwuLi4+IGluIHRoaXMgc2VjdGlvbiBhcmUgbm90IHJlcXVpcmVkLCBidXRcbiAgICogZG8gaGVscCBpbi1lZGl0b3IgdHlwZSBoaW50cyB0byBiZSBtb3JlIGNsZWFyIGFuZCBkaXJlY3QuXG4gICAqL1xuXG4gIGV4cG9ydCB0eXBlIEJhc2VPcHRpb24gPSB7XG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcjtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIHN1YnRpdGxlPzogc3RyaW5nO1xuICAgIGhlbHA/OiBzdHJpbmc7XG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAgIGRpc2FibGVkRXhwbGFuYXRpb24/OiBzdHJpbmc7XG4gIH07XG4gIGV4cG9ydCB0eXBlIE9wdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbiA9IEJhc2VPcHRpb24+ID0gTyAmIHtcbiAgICBjaGlsZHJlbj86IE9wdGlvbjxPPltdO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFNvdXJjZU9wdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSBPbWl0PFxuICAgIE9wdGlvbjxPPixcbiAgICAnY2hpbGRyZW4nXG4gID4gJiB7XG4gICAgdGl0bGVIaWdobGlnaHRJbmRpY2VzPzogSGlnaGxpZ2h0Q29tcG9uZW50LkhpZ2hsaWdodEluZGljZXNbXTtcbiAgICBzdWJ0aXRsZUhpZ2hsaWdodEluZGljZXM/OiBIaWdobGlnaHRDb21wb25lbnQuSGlnaGxpZ2h0SW5kaWNlc1tdO1xuICAgIGNoaWxkcmVuPzogU291cmNlT3B0aW9uPE8+W107XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgTXVsdGlTZWxlY3Rpb25TdGF0ZSA9IGJvb2xlYW4gfCAnaW5kZXRlcm1pbmF0ZSc7XG5cbiAgZXhwb3J0IHR5cGUgRnVsbE9wdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSBPbWl0PFxuICAgIFNvdXJjZU9wdGlvbjxPPixcbiAgICAnY2hpbGRyZW4nXG4gID4gJiB7XG4gICAgc2VsZWN0ZWQ6IE11bHRpU2VsZWN0aW9uU3RhdGU7XG4gICAgZXhwYW5kZWQ6IGJvb2xlYW47XG4gICAgc2VsZWN0YWJsZTogYm9vbGVhbjtcbiAgICBleHBhbmRhYmxlOiBib29sZWFuO1xuICAgIGNoaWxkcmVuPzogRnVsbE9wdGlvbjxPPltdO1xuICB9O1xuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gT3B0aW9uIGdyb3VwcyAvL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgLyoqXG4gICAqIFRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gT3B0aW9uR3JvdXAsIFNvdXJjZU9wdGlvbkdyb3VwLCBhbmRcbiAgICogRnVsbE9wdGlvbkdyb3VwIGlzIGFuYWxvZ291cyB0byB0aGUgb3B0aW9uIHR5cGVzIGFib3ZlLlxuICAgKlxuICAgKiBBcyB3aXRoIGJlZm9yZSwgdGhlIHVzZSBvZiBPbWl0PC4uLj4gaXMgbm90IHJlcXVpcmVkIGJ1dCBoZWxwZnVsLlxuICAgKi9cblxuICBleHBvcnQgdHlwZSBPcHRpb25Hcm91cDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSB7XG4gICAgaGVhZGVyPzogc3RyaW5nO1xuICAgIC8qKiBJbmZvIGljb24gKyB0b29sdGlwIHNob3duIGJlc2lkZSB0aGUgaGVhZGVyLiBOby1vcCB3aXRob3V0IGEgaGVhZGVyLiAqL1xuICAgIGhlbHA/OiBzdHJpbmc7XG4gICAgb3B0aW9uczogT3B0aW9uPE8+W107XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgU291cmNlT3B0aW9uR3JvdXA8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gT21pdDxcbiAgICBPcHRpb25Hcm91cDxPPixcbiAgICAnb3B0aW9ucydcbiAgPiAmIHtcbiAgICBvcHRpb25zOiBTb3VyY2VPcHRpb248Tz5bXTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBGdWxsT3B0aW9uR3JvdXA8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gT21pdDxcbiAgICBTb3VyY2VPcHRpb25Hcm91cDxPPixcbiAgICAnb3B0aW9ucydcbiAgPiAmIHtcbiAgICBvcHRpb25zOiBGdWxsT3B0aW9uPE8+W107XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBPcHRpb25TZXQgY2xhc3MgcHJvdmlkZXMgU2V0LWxpa2UgZnVuY3Rpb25hbGl0eSwgYnV0IHVuaXF1ZW5lc3MgaXNcbiAgICogZGV0ZXJtaW5lZCBieSB0aGUgb3B0aW9uJ3MgSUQgcmF0aGVyIHRoYW4gdGhlIG9iamVjdCByZWZlcmVuY2UuXG4gICAqL1xuICBleHBvcnQgY2xhc3MgT3B0aW9uU2V0PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPiBleHRlbmRzIFNldDxTb3VyY2VPcHRpb248Tz4+IHtcbiAgICAvLyBQYXJhbGxlbCBpZCDihpIgb3B0aW9uIG1hcCBzbyBoYXMoKS9hZGQoKS9kZWxldGUoKSBhcmUgTygxKSBpbnN0ZWFkIG9mXG4gICAgLy8gc3ByZWFkaW5nIHRoZSBTZXQgYW5kIGxpbmVhci1zY2FubmluZyBpdC4gUmVidWlsZGluZyBhbiBPKE7CsikgbG9va3VwXG4gICAgLy8gZm9yIGEgMTZrLW9wdGlvbiBzZWxlY3Rpb24gd2FzIHRoZSBwcmltYXJ5IGNhdXNlIG9mIHRoZSBtdWx0aS1taW51dGVcbiAgICAvLyBmcmVlemUgdGhhdCBzdXJmYWNlZCBSVlQtMjUzODMncyB0cmVlLXNlbGVjdCBzY2FsZSBwcm9ibGVtLlxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnlJZCA9IG5ldyBNYXA8T1snaWQnXSwgU291cmNlT3B0aW9uPE8+PigpO1xuXG4gICAgY29uc3RydWN0b3IodmFsdWVzPzogSXRlcmFibGU8U291cmNlT3B0aW9uPE8+PiB8IG51bGwpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICBpZiAodmFsdWVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgdGhpcy5hZGQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgaGFzKG9wdGlvbjogU291cmNlT3B0aW9uPE8+IHwgRnVsbE9wdGlvbjxPPikge1xuICAgICAgcmV0dXJuIHRoaXMuYnlJZC5oYXMob3B0aW9uLmlkKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBhZGQob3B0aW9uOiBTb3VyY2VPcHRpb248Tz4pIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5ieUlkLmdldChvcHRpb24uaWQpO1xuICAgICAgaWYgKGV4aXN0aW5nID09PSBvcHRpb24pIHtcbiAgICAgICAgLy8gU2FtZSBvYmplY3QgcmVmZXJlbmNlIOKAlCBub3RoaW5nIHRvIHVwZGF0ZS4gQW5jZXN0b3IgcmUtYWRkc1xuICAgICAgICAvLyBkdXJpbmcgYSBzZWxlY3Rpb24gc25hcHNob3QgaGl0IHRoaXMgcGF0aCByZXBlYXRlZGx5LCBzbyBrZWVwaW5nXG4gICAgICAgIC8vIGl0IE8oMSkgaXMgd2hhdCBwcmV2ZW50cyB0aGUgdHJlZS1zZWxlY3QgTsKyIGJsb3ctdXAgc2VlbiBpblxuICAgICAgICAvLyBSVlQtMjU0NzAuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gRGlmZmVyZW50IHJlZmVyZW5jZSwgc2FtZSBpZCDigJQgc3dhcCB0aGUgc3RvcmVkIHJlZiB3aGlsZVxuICAgICAgICAvLyBwcmVzZXJ2aW5nIFNldCBpbnNlcnRpb24gb3JkZXIuIFRoZSByZWJ1aWxkIGlzIE8oTiksIGJ1dCB0aGlzXG4gICAgICAgIC8vIHBhdGggaXMgcmFyZSBpbiBwcmFjdGljZSAodGhlIGhvdCBhbmNlc3Rvci1zbmFwc2hvdCBsb29wIHRha2VzXG4gICAgICAgIC8vIHRoZSBpZGVudGl0eSBmYXN0LXBhdGggYWJvdmUpLlxuICAgICAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzXS5tYXAobyA9PiAoby5pZCA9PT0gb3B0aW9uLmlkID8gb3B0aW9uIDogbykpO1xuICAgICAgICB0aGlzLmJ5SWQuc2V0KG9wdGlvbi5pZCwgb3B0aW9uKTtcbiAgICAgICAgc3VwZXIuY2xlYXIoKTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSBzdXBlci5hZGQoaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJ5SWQuc2V0KG9wdGlvbi5pZCwgb3B0aW9uKTtcbiAgICAgICAgc3VwZXIuYWRkKG9wdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkZWxldGUob3B0aW9uOiBTb3VyY2VPcHRpb248Tz4pIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5ieUlkLmdldChvcHRpb24uaWQpO1xuICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgIHRoaXMuYnlJZC5kZWxldGUob3B0aW9uLmlkKTtcbiAgICAgICAgc3VwZXIuZGVsZXRlKGV4aXN0aW5nKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY2xlYXIoKSB7XG4gICAgICB0aGlzLmJ5SWQuY2xlYXIoKTtcbiAgICAgIHN1cGVyLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgLy8vLy8vLy8vLy9cbiAgLy8gU3RhdGUgLy9cbiAgLy8vLy8vLy8vLy9cblxuICAvKipcbiAgICogVGhlIENvcmVTdGF0ZSBwcm92aWRlcyBhbGwgb2YgdGhlIGZvdW5kYXRpb25hbCBwaWVjZXMgb2Ygc3RhdGUgcmVxdWlyZWRcbiAgICogZm9yIGEgd29ya2luZyBjb21wb25lbnQuIEZ1bGxTdGF0ZSBpcyBhIHB1cmUgZGVyaXZhdGlvbiBvZiBDb3JlU3RhdGUgcGx1c1xuICAgKiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zLCBhbmQgcHJvdmlkZXMgY29udmVuaWVuY2VzIGZvciByZW5kZXJpbmcgdGhlXG4gICAqIGNvbXBvbmVudHMuIEFjdGlvbnMgYW5kIHRoZSBjb3JlIHN0YXRlIGFyZSBwYXNzZWQgdG8gdGhlIHJlZHVjZXIgdG9cbiAgICogcHJvZHVjZSBuZXcgQ29yZVN0YXRlcyAod2hpY2ggYXJlIHRoZW4gdXNlZCB0byBjYWxjdWxhdGUgbmV3IEZ1bGxTdGF0ZXMpLlxuICAgKlxuICAgKiDilIzilIDilIDilIDilIDilIDilIDilJBcbiAgICog4pSCICBVSSAg4peE4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAqIOKUlOKUgOKUgOKUrOKUgOKUgOKUgOKUmCAgICAgICAg4pSCXG4gICAqICAgIOKUgiAgICAgICAgICAgIOKUglxuICAgKiDilIzilIDilIDilrzilIDilIDilIDilIDilIDilIDilIDilIDilJAgICDilIJcbiAgICog4pSCICBBY3Rpb25zICDilIIgICDilIJcbiAgICog4pSU4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSCXG4gICAqICAgIOKUgiAgICAgICAgICAgIOKUglxuICAgKiDilIzilIDilIDilrzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilJBcbiAgICog4pSCICBTdGF0ZSByZWR1Y2VyICDilIJcbiAgICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gICAqL1xuXG4gIGV4cG9ydCB0eXBlIE9yZGVyQnkgPSAndGl0bGUnIHwgJ2NvdW50JyB8ICdzb3VyY2UnO1xuXG4gIGNvbnN0IE1JTl9PUFRJT05TX0ZPUl9DT05UUk9MUyA9IDU7XG5cbiAgY29uc3QgREVGQVVMVF9ESVNQTEFZX0xJTUlUID0gMTAwO1xuXG4gIGV4cG9ydCB0eXBlIENvcmVTdGF0ZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSB7XG4gICAgcXVlcnk6IHtcbiAgICAgIHNlYXJjaDogc3RyaW5nO1xuICAgICAgb3JkZXI6IE9yZGVyQnk7XG4gICAgfTtcbiAgICBsb2FkOiB7XG4gICAgICBsb2FkaW5nOiBib29sZWFuO1xuICAgICAgZXJyb3I6IHVua25vd24gfCBudWxsO1xuICAgIH07XG4gICAgc291cmNlT3B0aW9uR3JvdXBzOiBTb3VyY2VPcHRpb25Hcm91cDxPPltdO1xuICAgIC8qKlxuICAgICAqIFN0b3JlcyB0aGUgdW5maWx0ZXJlZCBvcmlnaW5hbCBvcHRpb24gZ3JvdXBzIHdoZW4gc2VhcmNoIGZpbHRlcmluZyBpcyBhY3RpdmUuXG4gICAgICogVXNlZCBieSBgYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoYCB0byBzZWxlY3QgYWxsIGNoaWxkcmVuIG9mIGEgcGFyZW50LFxuICAgICAqIGluY2x1ZGluZyB0aG9zZSBub3QgdmlzaWJsZSBpbiB0aGUgZmlsdGVyZWQgc2VhcmNoIHJlc3VsdHMuXG4gICAgICovXG4gICAgb3JpZ2luYWxPcHRpb25Hcm91cHM6IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgc2VsZWN0aW9uOiB7XG4gICAgICBzZWxlY3RlZDogT3B0aW9uU2V0PE8+O1xuICAgIH07XG4gICAgZGlzcGxheToge1xuICAgICAgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICAgIG9wZW46IGJvb2xlYW47XG4gICAgICBleHBhbmRlZE9wdGlvbnM6IFNldDxPWydpZCddPjtcbiAgICB9O1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIEZ1bGxTdGF0ZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSBDb3JlU3RhdGU8Tz4gJiB7XG4gICAgcXVlcnk6IHtcbiAgICAgIHNob3dTZWFyY2g6IGJvb2xlYW47XG4gICAgICBzZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nO1xuICAgICAgc2hvd09yZGVyOiBib29sZWFuO1xuICAgIH07XG4gICAgZnVsbE9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W107XG4gICAgc2VsZWN0aW9uOiB7XG4gICAgICBhbGxvd011bHRpU2VsZWN0OiBib29sZWFuO1xuICAgICAgYWxsb3dTZWxlY3RBbGw6IGJvb2xlYW47XG4gICAgICB2aXNpYmxlU2VsZWN0aW9uU3RhdGU6IE11bHRpU2VsZWN0aW9uU3RhdGU7XG4gICAgfTtcbiAgICBkaXNwbGF5OiB7XG4gICAgICBmb3JtYXR0ZWRTZWxlY3RlZE9wdGlvbnM6IHN0cmluZztcbiAgICAgIHplcm9TdGF0ZU1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG4gICAgICBkaXZpZGVyczogYm9vbGVhbjtcbiAgICAgIGlubGluZTogYm9vbGVhbjtcbiAgICAgIG1heEhlaWdodDogc3RyaW5nIHwgbnVsbDtcbiAgICAgIG1heFdpZHRoOiBzdHJpbmcgfCBudWxsO1xuICAgICAgbWluSGVpZ2h0OiBzdHJpbmcgfCBudWxsO1xuICAgICAgbWluV2lkdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICBkaXNwbGF5TGltaXRNZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgICAgc2hvd1NpbmdsZVNlbGVjdGVkOiBib29sZWFuO1xuICAgICAgcGlsbENvdW50OiBudW1iZXI7XG4gICAgfTtcbiAgfTtcblxuICAvLy8vLy8vLy8vLy8vXG4gIC8vIEFjdGlvbnMgLy9cbiAgLy8vLy8vLy8vLy8vL1xuXG4gIGV4cG9ydCB0eXBlIEFjdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPVxuICAgIHwgeyB0eXBlOiAnbG9hZCcgfVxuICAgIHwgeyB0eXBlOiAnb3BlbkNoYW5nZSc7IG9wZW46IGJvb2xlYW4gfVxuICAgIHwgeyB0eXBlOiAnc2VhcmNoQ2hhbmdlJzsgcGF5bG9hZDogc3RyaW5nIH1cbiAgICB8IHsgdHlwZTogJ29yZGVyQ2hhbmdlJzsgcGF5bG9hZDogT3JkZXJCeSB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdzZWxlY3Rpb25DaGFuZ2UnO1xuICAgICAgICBwYXlsb2FkOiBDb3JlU3RhdGU8Tz5bJ3NlbGVjdGlvbiddO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAndG9nZ2xlT3B0aW9uU2VsZWN0ZWQnO1xuICAgICAgICBpZDogT1snaWQnXTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3NldFNlbGVjdGVkT3B0aW9uJztcbiAgICAgICAgaWQ6IE9bJ2lkJ107XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICd2aXNpYmxlU2VsZWN0ZWRDaGFuZ2UnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAndG9nZ2xlT3B0aW9uRXhwYW5kZWQnO1xuICAgICAgICBpZDogT1snaWQnXTtcbiAgICAgIH07XG5cbiAgdHlwZSBJbnRlcm5hbEFjdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnbG9hZENvbXBsZXRlJztcbiAgICAgICAgZGF0YTogU291cmNlT3B0aW9uR3JvdXA8Tz5bXTtcbiAgICAgICAgLyoqIE9yaWdpbmFsIHVuZmlsdGVyZWQgZGF0YSwgcHJvdmlkZWQgd2hlbiBzZWFyY2ggaXMgYWN0aXZlICovXG4gICAgICAgIG9yaWdpbmFsRGF0YT86IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgICB9XG4gICAgfCB7IHR5cGU6ICdsb2FkRXJyb3InOyBlcnJvcjogdW5rbm93biB9O1xuXG4gIC8vLy8vLy8vLy8vL1xuICAvLyBTb3VyY2UgLy9cbiAgLy8vLy8vLy8vLy8vXG5cbiAgLyoqXG4gICAqIFRoZSBTb3VyY2UncyBqb2IgaXMgdG8gZmV0Y2ggb3B0aW9ucyAoYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUpIHdoaWNoXG4gICAqIHRoZW4gYmxlbmQgd2l0aCB0aGUgb3RoZXIgcGllY2VzIG9mIHN0YXRlIHRvIHByb2R1Y2UgdGhlIEZ1bGxTdGF0ZS5cbiAgICovXG5cbiAgZXhwb3J0IHR5cGUgU291cmNlUmVzdWx0PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPiA9XG4gICAgfCBTb3VyY2VPcHRpb25Hcm91cDxPPltdXG4gICAgfCB7XG4gICAgICAgIGRhdGE6IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPcmlnaW5hbCB1bmZpbHRlcmVkIGRhdGEsIHByb3ZpZGVkIHdoZW4gc2VhcmNoIGZpbHRlcmluZyBpcyBhY3RpdmUuXG4gICAgICAgICAqIFVzZWQgYnkgYGFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaGAgdG8gc2VsZWN0IGFsbCBjaGlsZHJlbiBvZlxuICAgICAgICAgKiBhIHBhcmVudCwgaW5jbHVkaW5nIHRob3NlIG5vdCB2aXNpYmxlIGluIHRoZSBmaWx0ZXJlZCBzZWFyY2ggcmVzdWx0cy5cbiAgICAgICAgICovXG4gICAgICAgIG9yaWdpbmFsRGF0YT86IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgICB9O1xuXG4gIGV4cG9ydCB0eXBlIFNvdXJjZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSAoXG4gICAgcXVlcnk6IENvcmVTdGF0ZTxPPlsncXVlcnknXSxcbiAgICBtb3N0UmVjZW50QWN0aW9uOiBBY3Rpb248Tz4sXG4gICkgPT4gUHJvbWlzZTxTb3VyY2VSZXN1bHQ8Tz4+O1xuXG4gIC8vLy8vLy8vLy8vLy9cbiAgLy8gTWFuYWdlciAvL1xuICAvLy8vLy8vLy8vLy8vXG5cbiAgZXhwb3J0IHR5cGUgTWFuYWdlcjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSB7XG4gICAgYWN0aW9uczogU3ViamVjdDxBY3Rpb248Tz4+O1xuICAgIHN0YXRlOiBDb25uZWN0YWJsZTxGdWxsU3RhdGU8Tz4+O1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIE1hbmFnZXJPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPiA9IHtcbiAgICBpbml0aWFsU3RhdGU/OiBEZWVwUGFydGlhbDxDb3JlU3RhdGU8Tz4+O1xuICAgIGFsbG93TXVsdGlTZWxlY3Q/OiBib29sZWFuO1xuICAgIGFsbG93U2VhcmNoPzogYm9vbGVhbjtcbiAgICBhbGxvd1NlbGVjdEFsbD86IGJvb2xlYW47XG4gICAgYWxsb3dPcmRlcj86IGJvb2xlYW47XG4gICAgc2VhcmNoUGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gICAgZGl2aWRlcnM/OiBib29sZWFuO1xuICAgIGlubGluZT86IGJvb2xlYW47XG4gICAgbWF4SGVpZ2h0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICBtYXhXaWR0aD86IHN0cmluZyB8IG51bGw7XG4gICAgbWluSGVpZ2h0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICBtaW5XaWR0aD86IHN0cmluZyB8IG51bGw7XG4gICAgZGlzcGxheUxpbWl0PzogbnVtYmVyO1xuICAgIHNlbGVjdGVkT3B0aW9uTGltaXQ/OiBudW1iZXI7XG4gICAgc2hvd1NpbmdsZVNlbGVjdGVkPzogYm9vbGVhbjtcbiAgICB1c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5PzogYm9vbGVhbjtcbiAgICBnZXRDdXN0b21PcHRpb25EaXNwbGF5PzogKHNlbGVjdGVkT3B0aW9uczogU291cmNlT3B0aW9uPE8+W10pID0+IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIG5vbi1sZWFmIG5vZGVzIChwYXJlbnRzKSByZW1haW4gc2VsZWN0YWJsZSBkdXJpbmcgc2VhcmNoLFxuICAgICAqIGFuZCBzZWxlY3RpbmcgdGhlbSB3aWxsIHNlbGVjdC9kZXNlbGVjdCBBTEwgY2hpbGRyZW4gZnJvbSB0aGUgb3JpZ2luYWxcbiAgICAgKiBkYXRhc2V0LCBub3QganVzdCB0aGUgdmlzaWJsZSBmaWx0ZXJlZCByZXN1bHRzLlxuICAgICAqXG4gICAgICogRGVmYXVsdDogZmFsc2UgKGN1cnJlbnQgYmVoYXZpb3IgLSBwYXJlbnRzIGFyZSBub3Qgc2VsZWN0YWJsZSBkdXJpbmcgc2VhcmNoKVxuICAgICAqL1xuICAgIGFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCBvcHRpb25zIHRoYXQgd2VyZSBzZWxlY3RlZCB3aGVuIHRoZSBzZWxlY3Qgd2FzIG9wZW5lZCBhcmVcbiAgICAgKiBzb3J0ZWQgdG8gdGhlIHRvcCBvZiB0aGVpciBzaWJsaW5nIGxpc3RzLiBTZXQgdG8gZmFsc2UgdG8gcHJlc2VydmUgdGhlXG4gICAgICogbmF0dXJhbCAob3IgY2hvc2VuIE9yZGVyQnkpIG9yZGVyIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0OiB0aGUgdmFsdWUgb2YgYWxsb3dNdWx0aVNlbGVjdFxuICAgICAqL1xuICAgIHNvcnRTZWxlY3RlZFRvVG9wPzogYm9vbGVhbjtcbiAgfTtcblxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlTWFuYWdlcjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc291cmNlOiBTb3VyY2U8Tz4sXG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBNYW5hZ2VyPE8+IHtcbiAgICBjb25zdCBkZWZhdWx0U3RhdGU6IENvcmVTdGF0ZTxPPiA9IHtcbiAgICAgIHF1ZXJ5OiB7XG4gICAgICAgIHNlYXJjaDogJycsXG4gICAgICAgIG9yZGVyOiAndGl0bGUnLFxuICAgICAgfSxcbiAgICAgIGxvYWQ6IHtcbiAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfSxcbiAgICAgIHNvdXJjZU9wdGlvbkdyb3VwczogW10sXG4gICAgICBvcmlnaW5hbE9wdGlvbkdyb3VwczogW10sXG4gICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgc2VsZWN0ZWQ6IG5ldyBPcHRpb25TZXQoKSxcbiAgICAgIH0sXG4gICAgICBkaXNwbGF5OiB7XG4gICAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICAgICAgb3BlbjogZmFsc2UsXG4gICAgICAgIGV4cGFuZGVkT3B0aW9uczogbmV3IFNldCgpLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IGRlZmF1bHRlZEluaXRpYWxTdGF0ZTogQ29yZVN0YXRlPE8+ID0gZGVmYXVsdHNEZWVwKFxuICAgICAge30sXG4gICAgICBvcHRpb25zPy5pbml0aWFsU3RhdGUsXG4gICAgICBkZWZhdWx0U3RhdGUsXG4gICAgKTtcblxuICAgIGNvbnN0IGFjdGlvbnM6IFN1YmplY3Q8QWN0aW9uPE8+PiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgY29uc3QgaW50ZXJuYWxBY3Rpb25zOiBTdWJqZWN0PEludGVybmFsQWN0aW9uPE8+PiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICBjb25zdCBjb3JlU3RhdGVXaXRoU2VsZWN0aW9uU25hcHNob3Q6IE9ic2VydmFibGU8XG4gICAgICBbQ29yZVN0YXRlPE8+LCBPcHRpb25TZXQ8Tz5dXG4gICAgPiA9IG1lcmdlKGFjdGlvbnMsIGludGVybmFsQWN0aW9ucykucGlwZShcbiAgICAgIHNjYW48QWN0aW9uPE8+IHwgSW50ZXJuYWxBY3Rpb248Tz4sIFtDb3JlU3RhdGU8Tz4sIE9wdGlvblNldDxPPl0+KFxuICAgICAgICAoW3N0YXRlLCBzbmFwc2hvdF0sIGFjdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ld1N0YXRlID0gc2lkZUVmZmVjdHMoXG4gICAgICAgICAgICByZWR1Y2Uoc3RhdGUsIGFjdGlvbiwgb3B0aW9ucyksXG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICBpbnRlcm5hbEFjdGlvbnMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvblNuYXBzaG90ID1cbiAgICAgICAgICAgIChhY3Rpb24udHlwZSA9PT0gJ29wZW5DaGFuZ2UnICYmIGFjdGlvbi5vcGVuKSB8fFxuICAgICAgICAgICAgKGFjdGlvbi50eXBlID09PSAnbG9hZENvbXBsZXRlJyAmJlxuICAgICAgICAgICAgICAobmV3U3RhdGUuZGlzcGxheS5vcGVuIHx8IG9wdGlvbnM/LmlubGluZSkpXG4gICAgICAgICAgICAgID8gY3JlYXRlU2VsZWN0aW9uU25hcHNob3RXaXRoQW5jZXN0b3JzKG5ld1N0YXRlKVxuICAgICAgICAgICAgICA6IHNuYXBzaG90O1xuXG4gICAgICAgICAgcmV0dXJuIFtuZXdTdGF0ZSwgbmV3U2VsZWN0aW9uU25hcHNob3RdO1xuICAgICAgICB9LFxuICAgICAgICBbZGVmYXVsdGVkSW5pdGlhbFN0YXRlLCBuZXcgT3B0aW9uU2V0PE8+KCldLFxuICAgICAgKSxcbiAgICAgIHN0YXJ0V2l0aDxbQ29yZVN0YXRlPE8+LCBPcHRpb25TZXQ8Tz5dPihbXG4gICAgICAgIGRlZmF1bHRlZEluaXRpYWxTdGF0ZSxcbiAgICAgICAgbmV3IE9wdGlvblNldDxPPigpLFxuICAgICAgXSksXG4gICAgKTtcblxuICAgIGNvbnN0IHN0YXRlOiBDb25uZWN0YWJsZTxGdWxsU3RhdGU8Tz4+ID0gY29ubmVjdGFibGUoXG4gICAgICBjb3JlU3RhdGVXaXRoU2VsZWN0aW9uU25hcHNob3QucGlwZShcbiAgICAgICAgbWFwKChbcywgc2VsZWN0aW9uQXRPcGVuXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFsbE9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W10gPVxuICAgICAgICAgICAgcy5zb3VyY2VPcHRpb25Hcm91cHMubWFwKG9wdGlvbkdyb3VwID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25Hcm91cCxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25Hcm91cC5vcHRpb25zLm1hcChvcHRpb24gPT5cbiAgICAgICAgICAgICAgICAgIGF1Z21lbnRPcHRpb25Ub0Z1bGxPcHRpb24ocywgb3B0aW9uLCBvcHRpb25zKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCB0b3BMZXZlbE9wdGlvbnMgPSBnZXRUb3BMZXZlbE9wdGlvbnMoYWxsT3B0aW9uR3JvdXBzKTtcblxuICAgICAgICAgIGNvbnN0IHNvcnRlZE9wdGlvbkdyb3VwcyA9XG4gICAgICAgICAgICBvcHRpb25zPy5zb3J0U2VsZWN0ZWRUb1RvcCA/PyBvcHRpb25zPy5hbGxvd011bHRpU2VsZWN0XG4gICAgICAgICAgICAgID8gc29ydE9wdGlvbnNCeVByZXZpb3VzbHlTZWxlY3RlZFN0YXRlKFxuICAgICAgICAgICAgICAgICAgYWxsT3B0aW9uR3JvdXBzLFxuICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQXRPcGVuLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBhbGxPcHRpb25Hcm91cHM7XG5cbiAgICAgICAgICBjb25zdCBkaXNwbGF5TGltaXQgPSBvcHRpb25zPy5kaXNwbGF5TGltaXQgPz8gREVGQVVMVF9ESVNQTEFZX0xJTUlUO1xuICAgICAgICAgIGNvbnN0IGRpc3BsYXlMaW1pdGVkT3B0aW9uR3JvdXBzID0gYXBwbHlEaXNwbGF5TGltaXQoXG4gICAgICAgICAgICBzb3J0ZWRPcHRpb25Hcm91cHMsXG4gICAgICAgICAgICBkaXNwbGF5TGltaXQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBmdWxsT3B0aW9uR3JvdXBzID0gYXBwbHlTZWxlY3RlZE9wdGlvbkxpbWl0KFxuICAgICAgICAgICAgcyxcbiAgICAgICAgICAgIGRpc3BsYXlMaW1pdGVkT3B0aW9uR3JvdXBzLFxuICAgICAgICAgICAgdG9wTGV2ZWxPcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnMsXG4gICAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgICAuLi5zLnF1ZXJ5LFxuICAgICAgICAgICAgICBzaG93U2VhcmNoOlxuICAgICAgICAgICAgICAgICEhcy5xdWVyeS5zZWFyY2ggfHxcbiAgICAgICAgICAgICAgICAoISFvcHRpb25zPy5hbGxvd1NlYXJjaCAmJlxuICAgICAgICAgICAgICAgICAgY291bnRBbGxPcHRpb25zKGFsbE9wdGlvbkdyb3VwcykgPlxuICAgICAgICAgICAgICAgICAgICBNSU5fT1BUSU9OU19GT1JfQ09OVFJPTFMpIHx8XG4gICAgICAgICAgICAgICAgY291bnRBbGxPcHRpb25zKGFsbE9wdGlvbkdyb3VwcykgPiBkaXNwbGF5TGltaXQsXG4gICAgICAgICAgICAgIHNlYXJjaFBsYWNlaG9sZGVyOiBvcHRpb25zPy5zZWFyY2hQbGFjZWhvbGRlciA/PyAnU2VhcmNoJyxcbiAgICAgICAgICAgICAgc2hvd09yZGVyOlxuICAgICAgICAgICAgICAgICEhb3B0aW9ucz8uYWxsb3dPcmRlciAmJlxuICAgICAgICAgICAgICAgICFzLnF1ZXJ5LnNlYXJjaCAmJlxuICAgICAgICAgICAgICAgIGNvdW50QWxsT3B0aW9ucyhhbGxPcHRpb25Hcm91cHMpID4gTUlOX09QVElPTlNfRk9SX0NPTlRST0xTLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bGxPcHRpb25Hcm91cHMsXG4gICAgICAgICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgICAgICAgLi4ucy5zZWxlY3Rpb24sXG4gICAgICAgICAgICAgIGFsbG93TXVsdGlTZWxlY3Q6ICEhb3B0aW9ucz8uYWxsb3dNdWx0aVNlbGVjdCxcbiAgICAgICAgICAgICAgYWxsb3dTZWxlY3RBbGw6XG4gICAgICAgICAgICAgICAgISFvcHRpb25zPy5hbGxvd1NlbGVjdEFsbCAmJlxuICAgICAgICAgICAgICAgIG9wdGlvbnM/LnNlbGVjdGVkT3B0aW9uTGltaXQgPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB2aXNpYmxlU2VsZWN0aW9uU3RhdGU6XG4gICAgICAgICAgICAgICAgZ2V0UGFyZW50TXVsdGlTZWxlY3Rpb25TdGF0ZSh0b3BMZXZlbE9wdGlvbnMpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgICAgICAgLi4ucy5kaXNwbGF5LFxuICAgICAgICAgICAgICBmb3JtYXR0ZWRTZWxlY3RlZE9wdGlvbnM6IGdldEZvcm1hdHRlZE9wdGlvbnNGb3JEaXNwbGF5KFxuICAgICAgICAgICAgICAgIHMsXG4gICAgICAgICAgICAgICAgdG9wTGV2ZWxPcHRpb25zLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHplcm9TdGF0ZU1lc3NhZ2U6IGdldFplcm9TdGF0ZU1lc3NhZ2UocyksXG4gICAgICAgICAgICAgIGRpdmlkZXJzOiAhIW9wdGlvbnM/LmRpdmlkZXJzLFxuICAgICAgICAgICAgICBpbmxpbmU6ICEhb3B0aW9ucz8uaW5saW5lLFxuICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG9wdGlvbnM/Lm1heEhlaWdodCA/PyBudWxsLFxuICAgICAgICAgICAgICBtYXhXaWR0aDogb3B0aW9ucz8ubWF4V2lkdGggPz8gbnVsbCxcbiAgICAgICAgICAgICAgbWluSGVpZ2h0OiBvcHRpb25zPy5taW5IZWlnaHQgPz8gbnVsbCxcbiAgICAgICAgICAgICAgbWluV2lkdGg6IG9wdGlvbnM/Lm1pbldpZHRoID8/IG51bGwsXG4gICAgICAgICAgICAgIGRpc3BsYXlMaW1pdE1lc3NhZ2U6IGdldERpc3BsYXlMaW1pdE1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgY291bnRWaXNpYmxlT3B0aW9ucyhmdWxsT3B0aW9uR3JvdXBzLCAhIXMucXVlcnkuc2VhcmNoKSxcbiAgICAgICAgICAgICAgICBjb3VudFZpc2libGVPcHRpb25zKGFsbE9wdGlvbkdyb3VwcywgISFzLnF1ZXJ5LnNlYXJjaCksXG4gICAgICAgICAgICAgICAgcy5xdWVyeSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgc2hvd1NpbmdsZVNlbGVjdGVkOiAhIW9wdGlvbnM/LnNob3dTaW5nbGVTZWxlY3RlZCxcbiAgICAgICAgICAgICAgcGlsbENvdW50OiBnZXRQaWxsQ291bnRGb3JEaXNwbGF5KHMsIHRvcExldmVsT3B0aW9ucywgb3B0aW9ucyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIHtcbiAgICAgICAgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSxcbiAgICAgICAgcmVzZXRPbkRpc2Nvbm5lY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuICAgIHN0YXRlLmNvbm5lY3QoKTtcblxuICAgIC8vIExvYWQgdGhlIG9wdGlvbnMgaW1tZWRpYXRlbHkgZm9yIHNlbGVjdHMgdGhhdCBhcmUgZGlzcGxheWVkIGlubGluZS5cbiAgICBpZiAob3B0aW9ucz8uaW5saW5lKSBhY3Rpb25zLm5leHQoeyB0eXBlOiAnbG9hZCcgfSk7XG5cbiAgICByZXR1cm4geyBhY3Rpb25zLCBzdGF0ZSB9O1xuICB9XG5cbiAgZXhwb3J0IHR5cGUgSW5NZW1vcnlNYW5hZ2VyT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPVxuICAgIE1hbmFnZXJPcHRpb25zPE8+ICYge1xuICAgICAgZnVzZU9wdGlvbnM/OiBJRnVzZU9wdGlvbnM8Tz47XG4gICAgfTtcblxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5NZW1vcnlNYW5hZ2VyPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBmZXRjaERhdGFzZXQ6ICgpID0+IFByb21pc2U8T3B0aW9uR3JvdXA8Tz5bXT4gfCBPcHRpb25Hcm91cDxPPltdLFxuICAgIG9wdGlvbnM/OiBJbk1lbW9yeU1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBNYW5hZ2VyPE8+IHtcbiAgICBsZXQgZGF0YTogT3B0aW9uR3JvdXA8Tz5bXTtcbiAgICBsZXQgZnVzZTogRnVzZTxPPjtcbiAgICBsZXQgZXhhY3RNYXRjaDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGxldCBwYXJlbnRzOiBNYXA8T1snaWQnXSwgT1snaWQnXT47XG4gICAgbGV0IGNoaWxkcmVuOiBNYXA8T1snaWQnXSwgT1snaWQnXVtdPjtcblxuICAgIGNvbnN0IHNvdXJjZTogU291cmNlPE8+ID0gYXN5bmMgKHF1ZXJ5LCBtb3N0UmVjZW50QWN0aW9uKSA9PiB7XG4gICAgICAvKlxuICAgICAgICBSZS1mZXRjaCB0aGUgb3B0aW9ucyBvbiB0aGUgbG9hZCBhY3Rpb24sIGFuZCByZWJ1aWxkIHRoZSBzdGF0ZVxuICAgICAgICBkZXJpdmVkIGZyb20gdGhlIG9wdGlvbiBkYXRhLlxuICAgICAgKi9cbiAgICAgIGlmIChcbiAgICAgICAgbW9zdFJlY2VudEFjdGlvbi50eXBlID09PSAnbG9hZCcgfHxcbiAgICAgICAgbW9zdFJlY2VudEFjdGlvbi50eXBlID09PSAnb3BlbkNoYW5nZSdcbiAgICAgICkge1xuICAgICAgICBkYXRhID0gYXdhaXQgZmV0Y2hEYXRhc2V0KCk7XG4gICAgICAgIGNvbnN0IHRvcExldmVsT3B0aW9ucyA9IGdldFRvcExldmVsT3B0aW9ucyhkYXRhKTtcblxuICAgICAgICBmdXNlID0gbmV3IEZ1c2UoZmxhdHRlbk9wdGlvbnModG9wTGV2ZWxPcHRpb25zLCBmYWxzZSksIHtcbiAgICAgICAgICB0aHJlc2hvbGQ6IDAuMixcbiAgICAgICAgICBrZXlzOiBbJ3RpdGxlJ10sXG4gICAgICAgICAgaW5jbHVkZVNjb3JlOiB0cnVlLFxuICAgICAgICAgIGluY2x1ZGVNYXRjaGVzOiB0cnVlLFxuICAgICAgICAgIC4uLm9wdGlvbnM/LmZ1c2VPcHRpb25zLFxuICAgICAgICB9KTtcblxuICAgICAgICBleGFjdE1hdGNoID0gb3B0aW9ucz8uZnVzZU9wdGlvbnM/LnRocmVzaG9sZCA9PSAwO1xuICAgICAgICBbcGFyZW50cywgY2hpbGRyZW5dID0gZ2V0UmVsYXRpb25zaGlwTWFwcyh0b3BMZXZlbE9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICAvLyBMZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2Ugc2hvdWxkbid0IGFmZmVjdCBmdXp6eSBtYXRjaGluZyAoRnVzZVxuICAgICAgLy8gc2NvcmVzIHRoZSBwYXR0ZXJuJ3MgbGVuZ3RoIGFnYWluc3QgdGhlIHRleHQncywgc28gYSBzdHJheSBzcGFjZVxuICAgICAgLy8gY2hhbmdlcyByZXN1bHRzIGluIHN1cnByaXNpbmcgd2F5cyk7IGEgc2VhcmNoIHN0cmluZyBvZiBvbmx5XG4gICAgICAvLyB3aGl0ZXNwYWNlIGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgbm8gc2VhcmNoLlxuICAgICAgY29uc3Qgc2VhcmNoID0gcXVlcnkuc2VhcmNoLnRyaW0oKTtcblxuICAgICAgLypcbiAgICAgICAgSWYgdGhlIHVzZXIgaXMgbm90IHNlYXJjaGluZyBvcHRpb25zLCByZXR1cm4gdGhlIGZ1bGwgc2V0IG9mIG9wdGlvbnNcbiAgICAgICAgc29ydGVkIGFwcHJvcHJpYXRlbHkuXG4gICAgICAqL1xuICAgICAgaWYgKCFzZWFyY2gpIHtcbiAgICAgICAgLypcbiAgICAgICAgICBUaGUgYHNvdXJjZWAgb3JkZXIgcHJvcGVydHkgYWxsb3dzIGZvciBvcHRpbmcgb3V0IG9mIGF1dG9tYXRpY1xuICAgICAgICAgIHNvcnRpbmcsIHJldHVybmluZyB0aGUgZGF0YSBpbiBpdHMgbmF0dXJhbCBpbnB1dCBvcmRlci5cbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHF1ZXJ5Lm9yZGVyID09PSAnc291cmNlJykgcmV0dXJuIGRhdGE7XG5cbiAgICAgICAgLypcbiAgICAgICAgICBTb3J0IHRoZSBvcHRpb25zIGJ5IHRpdGxlIGFuZCBzdWJ0aXRsZS5cbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHF1ZXJ5Lm9yZGVyID09PSAndGl0bGUnKSB7XG4gICAgICAgICAgZnVuY3Rpb24gc29ydEJ5VGl0bGUob3B0aW9uczogT3B0aW9uPE8+W10pOiBPcHRpb248Tz5bXSB7XG4gICAgICAgICAgICByZXR1cm4gc29ydEJ5KG9wdGlvbnMsIFtcbiAgICAgICAgICAgICAgKG86IE9wdGlvbjxPPikgPT4gby50aXRsZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAobzogT3B0aW9uPE8+KSA9PiBvLnN1YnRpdGxlPy50b0xvd2VyQ2FzZSgpID8/ICcnLFxuICAgICAgICAgICAgXSkubWFwKG9wdGlvbiA9PiAoe1xuICAgICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aFxuICAgICAgICAgICAgICAgID8gc29ydEJ5VGl0bGUob3B0aW9uLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBkYXRhLm1hcChncm91cCA9PiAoe1xuICAgICAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgICAgICBvcHRpb25zOiBzb3J0QnlUaXRsZShncm91cC5vcHRpb25zKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgIFNvcnQgdGhlIG9wdGlvbnMgYnkgY291bnQsIHRoZW4gYnkgdGl0bGUsIHRoZW4gYnkgc3VidGl0bGUuXG4gICAgICAgICovXG4gICAgICAgIGlmIChxdWVyeS5vcmRlciA9PT0gJ2NvdW50Jykge1xuICAgICAgICAgIGZ1bmN0aW9uIHNvcnRCeUNvdW50KG9wdGlvbnM6IE9wdGlvbjxPPltdKTogT3B0aW9uPE8+W10ge1xuICAgICAgICAgICAgcmV0dXJuIHNvcnRCeShvcHRpb25zLCBbXG4gICAgICAgICAgICAgIChvOiBPcHRpb248Tz4pID0+IChpc051bWJlcihvLmNvdW50KSA/IC1vLmNvdW50IDogSW5maW5pdHkpLFxuICAgICAgICAgICAgICAobzogT3B0aW9uPE8+KSA9PiBvLnRpdGxlLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgIChvOiBPcHRpb248Tz4pID0+IG8uc3VidGl0bGU/LnRvTG93ZXJDYXNlKCkgPz8gJycsXG4gICAgICAgICAgICBdKS5tYXAob3B0aW9uID0+ICh7XG4gICAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgICAgY2hpbGRyZW46IG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBzb3J0QnlDb3VudChvcHRpb24uY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGRhdGEubWFwKGdyb3VwID0+ICh7XG4gICAgICAgICAgICAuLi5ncm91cCxcbiAgICAgICAgICAgIG9wdGlvbnM6IHNvcnRCeUNvdW50KGdyb3VwLm9wdGlvbnMpLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICBFeGVjdXRlIHRoZSBzZWFyY2ggd2l0aCBmdXNlLiBPbmNlIHdlIGhhdmUgdGhlIHNlYXJjaCBtYXRjaCBkYXRhLFxuICAgICAgICByZWJ1aWxkIGp1c3QgYXMgbXVjaCBvZiB0aGUgdHJlZSBhcyBpcyBuZWVkZWQgdG8gcmVuZGVyIHRoZSBzZWFyY2hcbiAgICAgICAgcmVzdWx0cy4gU3BlY2lmaWNhbGx5LCBhbnkgbWF0Y2ggd2lsbCBuZWVkIGFsbCBvZiBpdHMgYW5jZXN0b3JzIChzb1xuICAgICAgICB0aGF0IG1hdGNoZWQgbGVhZiBub2RlcyBhcmUgc2hvd24gbmVzdGVkIHVuZGVyIHRoZWlyIGFuY2VzdG9ycykgYW5kIGFsbFxuICAgICAgICBvZiBpdHMgY2hpbGRyZW4gKGJlY2F1c2UgYSBtYXRjaGluZyBwYXJlbnQgbWVhbnMgdGhhdCBhbGwgb2YgaXRzXG4gICAgICAgIGRlc2NlbmRhbnRzIG1hdGNoIHRvbywgcGVyIHRoZSBkZXNpZ24gc3BlY2lmaWNhdGlvbiksIHdoZXRoZXIgdGhleVxuICAgICAgICB0aGVtc2VsdmVzIG1hdGNoZWQgb3Igbm90LlxuICAgICAgKi9cbiAgICAgIGNvbnN0IG1hdGNoZWRPcHRpb25zOiBGdXNlUmVzdWx0PE8+W10gPSBmdXNlLnNlYXJjaChzZWFyY2gpO1xuICAgICAgY29uc3QgbWF0Y2hlZElkczogU2V0PE9bJ2lkJ10+ID0gbmV3IFNldChcbiAgICAgICAgbWF0Y2hlZE9wdGlvbnMubWFwKHJlc3VsdCA9PiByZXN1bHQuaXRlbS5pZCksXG4gICAgICApO1xuXG4gICAgICBjb25zdCBtYXRjaEFuY2VzdG9yczogU2V0PE9bJ2lkJ10+ID0gbmV3IFNldCgpO1xuICAgICAgZnVuY3Rpb24gY29sbGVjdEFuY2VzdG9ycyhpZHM6IE9bJ2lkJ11bXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgIGNvbnN0IHBhcmVudElkID0gcGFyZW50cy5nZXQoaWQpO1xuICAgICAgICAgIGlmIChwYXJlbnRJZCkge1xuICAgICAgICAgICAgbWF0Y2hBbmNlc3RvcnMuYWRkKHBhcmVudElkKTtcbiAgICAgICAgICAgIGNvbGxlY3RBbmNlc3RvcnMoW3BhcmVudElkXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb2xsZWN0QW5jZXN0b3JzKFsuLi5tYXRjaGVkSWRzXSk7XG5cbiAgICAgIGNvbnN0IG1hdGNoRGVzY2VuZGFudHM6IFNldDxPWydpZCddPiA9IG5ldyBTZXQoKTtcbiAgICAgIGZ1bmN0aW9uIGNvbGxlY3REZXNjZW5kYW50cyhpZHM6IE9bJ2lkJ11bXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuSWRzID0gY2hpbGRyZW4uZ2V0KGlkKTtcbiAgICAgICAgICBpZiAoY2hpbGRyZW5JZHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW5JZHMpIHtcbiAgICAgICAgICAgICAgbWF0Y2hEZXNjZW5kYW50cy5hZGQoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29sbGVjdERlc2NlbmRhbnRzKGNoaWxkcmVuSWRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbGxlY3REZXNjZW5kYW50cyhbLi4ubWF0Y2hlZElkc10pO1xuXG4gICAgICAvKlxuICAgICAgICBOZXh0LCB3ZSdsbCBjb21iaW5lIGFsbCB0aGUgbWF0Y2hlZCBJRHMgd2l0aCB0aGVpciBkaXJlY3QgYW5jZXN0b3JzIGFuZFxuICAgICAgICBkZXNjYW5kYW50cywgYW5kIGZpbHRlciB0aGUgb3JpZ2luYWwgZGF0YSBzZXQgZG93biB0byBqdXN0IHRoZXNlXG4gICAgICAgIG9wdGlvbnMuXG4gICAgICAqL1xuICAgICAgY29uc3QgZmlsdGVyZWRJZHM6IFNldDxPWydpZCddPiA9IG5ldyBTZXQoW1xuICAgICAgICAuLi5tYXRjaGVkSWRzLFxuICAgICAgICAuLi5tYXRjaEFuY2VzdG9ycyxcbiAgICAgICAgLi4ubWF0Y2hEZXNjZW5kYW50cyxcbiAgICAgIF0pO1xuXG4gICAgICBmdW5jdGlvbiBmaWx0ZXJPcHRpb25zKG9wdGlvbnM6IE9wdGlvbjxPPltdKTogT3B0aW9uPE8+W10ge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnM6IE9wdGlvbjxPPltdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoZmlsdGVyZWRJZHMuaGFzKG9wdGlvbi5pZCkpIHtcbiAgICAgICAgICAgIGZpbHRlcmVkT3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICAgICAgICBjaGlsZHJlbjogb3B0aW9uLmNoaWxkcmVuPy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IGZpbHRlck9wdGlvbnMob3B0aW9uLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZE9wdGlvbnM7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnMgPSBmaWx0ZXJPcHRpb25zKGdldFRvcExldmVsT3B0aW9ucyhkYXRhKSk7XG5cbiAgICAgIC8qXG4gICAgICAgIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgYW4gYXJyYXkgb2YgZGlzdGluY3QgdHJlZXMgKHRvcC1sZXZlbCBvcHRpb25zKSxcbiAgICAgICAgZmlsdGVyZWQgZG93biB0byBvbmx5IHRoZSBvcHRpb25zIG1hdGNoaW5nIHRoZSBzZWFyY2ggcXVlcnkuIE5vdGUgdGhhdFxuICAgICAgICB3ZSBkb24ndCBjYXJlIGFib3V0IHNlY3Rpb24gaGVhZGVycyB3aGVuIHNlYXJjaGluZyBzaW5jZSByZXN1bHRzIHNob3VsZFxuICAgICAgICBiZSBvcmRlcmVkIGJ5IHJlbGV2YW5jZS4gVG8gY2FsY3VsYXRlIHRoZSBvcmRlciBvZiB0aGVzZSB0cmVlcywgd2UnbGxcbiAgICAgICAgdGFrZSB0aGUgdG90YWwgbWF0Y2ggc2NvcmVzIGZvciBvcHRpb25zIGZvdW5kIGluIHRoZSB0cmVlLCBkaXZpZGVkIGJ5XG4gICAgICAgIHRoZSBjb3VudCBvZiBtYXRjaGVzIGluIHRoZSB0cmVlICh0aGUgYmVzdCBhdmVyYWdlIG1hdGNoIHNjb3JlKS5cbiAgICAgICovXG5cbiAgICAgIGNvbnN0IHNjb3JlTWFwOiBNYXA8T1snaWQnXSwgbnVtYmVyPiA9IG5ldyBNYXAoXG4gICAgICAgIG1hdGNoZWRPcHRpb25zLm1hcChyZXN1bHQgPT4gW3Jlc3VsdC5pdGVtLmlkLCByZXN1bHQuc2NvcmUgPz8gMF0pLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG9yZGVyZWQgPSBzb3J0QnkoZmlsdGVyZWRPcHRpb25zLCAob3B0aW9uOiBPcHRpb248Tz4pOiBudW1iZXIgPT4ge1xuICAgICAgICBmdW5jdGlvbiBjYWxjdWxhdGVTY29yZShvcHRpb246IE9wdGlvbjxPPik6IG51bWJlciB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChzY29yZU1hcC5nZXQob3B0aW9uLmlkKSA/PyAwKSArXG4gICAgICAgICAgICAob3B0aW9uLmNoaWxkcmVuID8/IFtdKS5yZWR1Y2UoXG4gICAgICAgICAgICAgIChzY29yZSwgY2hpbGQpID0+IHNjb3JlICsgY2FsY3VsYXRlU2NvcmUoY2hpbGQpLFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2FsY3VsYXRlQ291bnQob3B0aW9uOiBPcHRpb248Tz4pOiBudW1iZXIge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAxICtcbiAgICAgICAgICAgIChvcHRpb24uY2hpbGRyZW4gPz8gW10pLnJlZHVjZShcbiAgICAgICAgICAgICAgKGNvdW50LCBjaGlsZCkgPT4gY291bnQgKyBjYWxjdWxhdGVDb3VudChjaGlsZCksXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3RhbFNjb3JlID0gY2FsY3VsYXRlU2NvcmUob3B0aW9uKTtcbiAgICAgICAgY29uc3QgdG90YWxDb3VudCA9IGNhbGN1bGF0ZUNvdW50KG9wdGlvbik7XG4gICAgICAgIHJldHVybiB0b3RhbFNjb3JlIC8gdG90YWxDb3VudDtcbiAgICAgIH0pO1xuXG4gICAgICAvKlxuICAgICAgICBGaW5hbGx5LCB3ZSdsbCBhZGQgaGlnaGxpZ2h0IGluZGljZXMgdG8gdGhlIG1hdGNoZXMgc28gdGhhdCB0aGV5IGNhbiBiZVxuICAgICAgICBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAgICAqL1xuXG4gICAgICB0eXBlIEhpZ2hsaWdodHMgPSB7XG4gICAgICAgIHRpdGxlSGlnaGxpZ2h0SW5kaWNlcz86IEhpZ2hsaWdodENvbXBvbmVudC5IaWdobGlnaHRJbmRpY2VzW107XG4gICAgICAgIHN1YnRpdGxlSGlnaGxpZ2h0SW5kaWNlcz86IEhpZ2hsaWdodENvbXBvbmVudC5IaWdobGlnaHRJbmRpY2VzW107XG4gICAgICB9O1xuICAgICAgY29uc3QgaGlnaGxpZ2h0TWFwOiBNYXA8T1snaWQnXSwgSGlnaGxpZ2h0cz4gPSBuZXcgTWFwKFxuICAgICAgICBtYXRjaGVkT3B0aW9ucy5tYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICBjb25zdCBoaWdobGlnaHRzOiBIaWdobGlnaHRzID0ge307XG4gICAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiByZXN1bHQubWF0Y2hlcyA/PyBbXSkge1xuICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBpbmV4YWN0IG1hdGNoZXNcbiAgICAgICAgICAgIGlmIChleGFjdE1hdGNoICYmIG1hdGNoLnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgbWF0Y2guaW5kaWNlcyA9IG1hdGNoLmluZGljZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGlzRnVzZU1hdGNoRXhhY3QobWF0Y2gsIHNlYXJjaCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2gua2V5ID09PSAndGl0bGUnKSB7XG4gICAgICAgICAgICAgIGhpZ2hsaWdodHMudGl0bGVIaWdobGlnaHRJbmRpY2VzID0gWy4uLm1hdGNoLmluZGljZXNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoLmtleSA9PT0gJ3N1YnRpdGxlJykge1xuICAgICAgICAgICAgICBoaWdobGlnaHRzLnN1YnRpdGxlSGlnaGxpZ2h0SW5kaWNlcyA9IFsuLi5tYXRjaC5pbmRpY2VzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtyZXN1bHQuaXRlbS5pZCwgaGlnaGxpZ2h0c107XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGZ1bmN0aW9uIGFkZEhpZ2hsaWdodHNUb09wdGlvbihvcHRpb25zOiBPcHRpb248Tz5bXSk6IFNvdXJjZU9wdGlvbjxPPltdIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdGlvbiA9PiAoe1xuICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAuLi5oaWdobGlnaHRNYXAuZ2V0KG9wdGlvbi5pZCksXG4gICAgICAgICAgLi4uKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoXG4gICAgICAgICAgICA/IHsgY2hpbGRyZW46IGFkZEhpZ2hsaWdodHNUb09wdGlvbihvcHRpb24uY2hpbGRyZW4pIH1cbiAgICAgICAgICAgIDogbnVsbCksXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogW3sgb3B0aW9uczogYWRkSGlnaGxpZ2h0c1RvT3B0aW9uKG9yZGVyZWQpIH1dLFxuICAgICAgICBvcmlnaW5hbERhdGE6IGRhdGEsXG4gICAgICB9O1xuICAgIH07XG5cbiAgICByZXR1cm4gY3JlYXRlTWFuYWdlcihzb3VyY2UsIG9wdGlvbnMpO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzRnVzZU1hdGNoRXhhY3QoXG4gICAgbWF0Y2g6IEZ1c2VSZXN1bHRNYXRjaCxcbiAgICBzZWFyY2g6IHN0cmluZyxcbiAgKTogKFxuICAgIHZhbHVlOiBSYW5nZVR1cGxlLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgYXJyYXk6IHJlYWRvbmx5IFJhbmdlVHVwbGVbXSxcbiAgKSA9PiBib29sZWFuIHtcbiAgICByZXR1cm4gbWF0Y2hlZEluZGljZXMgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hlZFZhbHVlID0gbWF0Y2hcbiAgICAgICAgLnZhbHVlIS5zbGljZShtYXRjaGVkSW5kaWNlc1swXSwgbWF0Y2hlZEluZGljZXNbMV0gKyAxKVxuICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIC8vIGZ1c2UgaXMgd2VpcmQgd2l0aCBpdCdzIG1hdGNoZXMuIEZvciBhIHRleHQgb2YgXCJwbGFubmluZ1wiIGFuZCBhIHNlYXJjaCBzdHJpbmcgb2YgXCJwbGFuXCJcbiAgICAgIC8vIHRoZSBtYXRjaGVkIHZhbHVlIHdpbGwgYmUgXCJwbGFublwiIHdpdGggdGhlIGV4dHJhICduJyBiZWNhdXNlIG9mIGl0cyBmdXp6eSBtYXRjaGluZy5cbiAgICAgIC8vIHNvIGp1c3QgbWFrZSBzdXJlIHRoZSBtYXRjaGVkIHZhbHVlIGF0IGxlYXN0IHN0YXJ0cyB3aXRoIHRoZSBzZWFyY2ggc3RyaW5nLlxuICAgICAgLy8gaXQncyBleHRyYSB3ZWlyZCBiZWNhdXNlIGZvciBhIHRleHQgb2YgXCJhbmFseXRpY3NcIiBhbmQgYSBzZWFyY2ggc3RyaW5nIG9mIFwibmFseXRpY3NcIixcbiAgICAgIC8vIHRoZSBtYXRjaGVkIHZhbHVlIHdpbGwgYmUgXCJhbmFseXRpY3NcIi4gU28gd2UganVzdCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgdGhlIG1hdGNoZWQgdmFsdWVcbiAgICAgIC8vIGluY2x1ZGVzIHRoZSBzZWFyY2ggc3RyaW5nIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgZXh0cmEgc3R1ZmYgb24gdGhlIGZyb250IG9yIHRoZSBlbmQuXG4gICAgICByZXR1cm4gbWF0Y2hlZFZhbHVlLmluY2x1ZGVzKHNlYXJjaC50b0xvd2VyQ2FzZSgpKTtcbiAgICB9O1xuICB9XG5cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvLyBTdGF0ZSByZWR1Y2VyICh3aXRoIGhlbHBlcnMpIC8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICBmdW5jdGlvbiBjcmVhdGVTZWxlY3Rpb25TbmFwc2hvdFdpdGhBbmNlc3RvcnM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICk6IE9wdGlvblNldDxPPiB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBuZXcgT3B0aW9uU2V0KHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZCk7XG4gICAgY29uc3QgdG9wTGV2ZWxPcHRpb25zID0gZ2V0VG9wTGV2ZWxPcHRpb25zKHN0YXRlLnNvdXJjZU9wdGlvbkdyb3Vwcyk7XG4gICAgY29uc3QgW3BhcmVudHNdID0gZ2V0UmVsYXRpb25zaGlwTWFwcyh0b3BMZXZlbE9wdGlvbnMpO1xuXG4gICAgLy8gU2libGluZyBsZWF2ZXMgc2hhcmUgYW5jZXN0b3JzLCBzbyBvbmNlIHdlJ3ZlIHdhbGtlZCB1cCB0aHJvdWdoIGFcbiAgICAvLyBnaXZlbiBwYXJlbnQgaWQgd2UgY2FuIHN0b3Ag4oCUIGFueXRoaW5nIGFib3ZlIGl0IGhhcyBhbHJlYWR5IGJlZW5cbiAgICAvLyBhZGRlZCBieSBhIHByZXZpb3VzIGl0ZXJhdGlvbi4gV2l0aG91dCB0aGlzIHNob3J0LWNpcmN1aXQgdGhlIGxvb3BcbiAgICAvLyByZS1ydW5zIGZpbmRPcHRpb24gKHdoaWNoIGlzIGEgZnVsbCB0cmVlIHdhbGspIG9uY2UgcGVyIHNoYXJlZFxuICAgIC8vIGFuY2VzdG9yIGVkZ2UsIHdoaWNoIHdhcyB0aGUgIzIgaG90c3BvdCBiZWhpbmQgT3B0aW9uU2V0LmFkZCBpblxuICAgIC8vIFJWVC0yNTQ3MCdzIHByb2ZpbGUuXG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8T1snaWQnXT4oKTtcbiAgICBmb3IgKGNvbnN0IHNlbGVjdGVkT3B0aW9uIG9mIHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZCkge1xuICAgICAgbGV0IHBhcmVudElkID0gcGFyZW50cy5nZXQoc2VsZWN0ZWRPcHRpb24uaWQpO1xuICAgICAgd2hpbGUgKHBhcmVudElkICE9PSB1bmRlZmluZWQgJiYgIXZpc2l0ZWQuaGFzKHBhcmVudElkKSkge1xuICAgICAgICB2aXNpdGVkLmFkZChwYXJlbnRJZCk7XG4gICAgICAgIGNvbnN0IHBhcmVudE9wdGlvbiA9IGZpbmRPcHRpb24odG9wTGV2ZWxPcHRpb25zLCBwYXJlbnRJZCk7XG4gICAgICAgIGlmIChwYXJlbnRPcHRpb24pIHtcbiAgICAgICAgICBzbmFwc2hvdC5hZGQocGFyZW50T3B0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnRJZCA9IHBhcmVudHMuZ2V0KHBhcmVudElkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREaXNwbGF5TGltaXRNZXNzYWdlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBkaXNwbGF5ZWRPcHRpb25Db3VudDogbnVtYmVyLFxuICAgIHRvdGFsT3B0aW9uQ291bnQ6IG51bWJlcixcbiAgICBxdWVyeTogQ29yZVN0YXRlPE8+WydxdWVyeSddLFxuICApOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoZGlzcGxheWVkT3B0aW9uQ291bnQgPT09IHRvdGFsT3B0aW9uQ291bnQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJpdk51bWJlciA9IG5ldyBOdW1iZXJQaXBlKCk7XG4gICAgY29uc3QgZGlzcGxheWVkID0gcml2TnVtYmVyLnRyYW5zZm9ybShkaXNwbGF5ZWRPcHRpb25Db3VudCk7XG4gICAgY29uc3QgdG90YWwgPSByaXZOdW1iZXIudHJhbnNmb3JtKHRvdGFsT3B0aW9uQ291bnQpO1xuICAgIGNvbnN0IHN0YXJ0ID0gYFNob3dpbmcgJHtkaXNwbGF5ZWR9IG9mICR7dG90YWx9IG9wdGlvbnNgO1xuICAgIHJldHVybiBxdWVyeS5zZWFyY2ggPyBgJHtzdGFydH0gbWF0Y2hpbmcgXCIke3F1ZXJ5LnNlYXJjaH1cImAgOiBzdGFydDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvdW50VmlzaWJsZU9wdGlvbnM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W10sXG4gICAgbGVhZk9ubHk6IGJvb2xlYW4sXG4gICk6IG51bWJlciB7XG4gICAgZnVuY3Rpb24gY291bnQob3B0aW9uczogRnVsbE9wdGlvbjxPPltdKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnJlZHVjZSgoYWNjLCBvcHRpb24pID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi5leHBhbmRlZCAmJiBvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBhY2MgKyAobGVhZk9ubHkgPyAwIDogMSkgKyBjb3VudChvcHRpb24uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2MgKyAxO1xuICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbkdyb3Vwcy5yZWR1Y2UoXG4gICAgICAodG90YWwsIGdyb3VwKSA9PiB0b3RhbCArIGNvdW50KGdyb3VwLm9wdGlvbnMpLFxuICAgICAgMCxcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gY291bnRBbGxPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICApOiBudW1iZXIge1xuICAgIGZ1bmN0aW9uIGNvdW50KG9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSk6IG51bWJlciB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5yZWR1Y2UoKGFjYywgb3B0aW9uKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBhY2MgKyAxICsgY291bnQob3B0aW9uLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjICsgMTtcbiAgICAgIH0sIDApO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25Hcm91cHMucmVkdWNlKFxuICAgICAgKHRvdGFsLCBncm91cCkgPT4gdG90YWwgKyBjb3VudChncm91cC5vcHRpb25zKSxcbiAgICAgIDAsXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5RGlzcGxheUxpbWl0PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICAgIGRpc3BsYXlMaW1pdDogbnVtYmVyLFxuICApOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSB7XG4gICAgdHlwZSBEaXNwbGF5TGltaXRPcHRpb25zID0gW0Z1bGxPcHRpb248Tz5bXSwgbnVtYmVyXTtcbiAgICBmdW5jdGlvbiBmaWx0ZXJXaXRoTGltaXQoXG4gICAgICBvcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgICByZW1haW5pbmc6IG51bWJlcixcbiAgICApOiBEaXNwbGF5TGltaXRPcHRpb25zIHtcbiAgICAgIGxldCBsZWZ0ID0gcmVtYWluaW5nO1xuICAgICAgY29uc3QgdmlzaWJsZU9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICBpZiAobGVmdCA8PSAwKSBicmVhaztcblxuICAgICAgICBpZiAob3B0aW9uLmV4cGFuZGVkICYmIG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgW2NoaWxkT3B0aW9ucywgY2hpbGRSZW1haW5pbmddID0gZmlsdGVyV2l0aExpbWl0KFxuICAgICAgICAgICAgb3B0aW9uLmNoaWxkcmVuLFxuICAgICAgICAgICAgbGVmdCAtIDEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB2aXNpYmxlT3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZE9wdGlvbnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGVmdCA9IGNoaWxkUmVtYWluaW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZpc2libGVPcHRpb25zLnB1c2gob3B0aW9uKTtcbiAgICAgICAgICBsZWZ0LS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBbdmlzaWJsZU9wdGlvbnMsIGxlZnRdO1xuICAgIH1cblxuICAgIHR5cGUgRGlzcGxheUxpbWl0R3JvdXBzID0gW0Z1bGxPcHRpb25Hcm91cDxPPltdLCBudW1iZXJdO1xuICAgIGNvbnN0IHN0YXJ0aW5nVmFsdWU6IERpc3BsYXlMaW1pdEdyb3VwcyA9IFtbXSwgZGlzcGxheUxpbWl0XTtcbiAgICBjb25zdCBbcmVzb2x2ZWRHcm91cHNdID0gb3B0aW9uR3JvdXBzLnJlZHVjZTxEaXNwbGF5TGltaXRHcm91cHM+KFxuICAgICAgKFtncm91cHMsIHJlbWFpbmluZ10sIGdyb3VwKSA9PiB7XG4gICAgICAgIGNvbnN0IFtvcHRpb25zLCBsZWZ0QWZ0ZXJdID0gZmlsdGVyV2l0aExpbWl0KGdyb3VwLm9wdGlvbnMsIHJlbWFpbmluZyk7XG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBbWy4uLmdyb3VwcywgeyAuLi5ncm91cCwgb3B0aW9ucyB9XSwgbGVmdEFmdGVyXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW2dyb3VwcywgcmVtYWluaW5nXTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHN0YXJ0aW5nVmFsdWUsXG4gICAgKTtcblxuICAgIHJldHVybiByZXNvbHZlZEdyb3VwcztcbiAgfVxuXG4gIC8qXG4gICAgU29ydCBvcHRpb25zIHNvIHRoYXQgcHJldmlvdXNseSBzZWxlY3RlZCBvcHRpb25zIChmcm9tIHByaW9yIHNlc3Npb25zKVxuICAgIGFwcGVhciBhdCB0aGUgdG9wIG9mIHRoZWlyIHBlZXIvc2libGluZyBsaXN0cy5cbiAgKi9cbiAgZnVuY3Rpb24gc29ydE9wdGlvbnNCeVByZXZpb3VzbHlTZWxlY3RlZFN0YXRlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICAgIHNlbGVjdGlvbkF0T3BlbjogT3B0aW9uU2V0PE8+LFxuICApOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSB7XG4gICAgZnVuY3Rpb24gc29ydE9wdGlvbnMob3B0aW9uczogRnVsbE9wdGlvbjxPPltdKTogRnVsbE9wdGlvbjxPPltdIHtcbiAgICAgIHJldHVybiBzb3J0Qnkob3B0aW9ucywgb3B0aW9uID0+ICFzZWxlY3Rpb25BdE9wZW4uaGFzKG9wdGlvbikpLm1hcChcbiAgICAgICAgb3B0aW9uID0+IHtcbiAgICAgICAgICBpZiAob3B0aW9uLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBzb3J0T3B0aW9ucyhvcHRpb24uY2hpbGRyZW4pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgcmV0dXJuIG9wdGlvbjtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbkdyb3Vwcy5tYXAoZ3JvdXAgPT4gKHtcbiAgICAgIC4uLmdyb3VwLFxuICAgICAgb3B0aW9uczogc29ydE9wdGlvbnMoZ3JvdXAub3B0aW9ucyksXG4gICAgfSkpO1xuICB9XG5cbiAgLypcbiAgICBJZiB3ZSBhcmUgcmVzdHJpY3RpbmcgaG93IG1hbnkgb3B0aW9ucyBhcmUgc2VsZWN0ZWQgdG8gYSBzcGVjaWZpYyBsaW1pdCxcbiAgICAgIHdoZW4gd2UgYXJlIGF0IHRoYXQgbGltaXQsIGRpc2FibGUgYWxsIG9wdGlvbnMgbm90IGN1cnJlbnRseSBzZWxlY3RlZC5cbiAgKi9cbiAgZnVuY3Rpb24gYXBwbHlTZWxlY3RlZE9wdGlvbkxpbWl0PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIG9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W10sXG4gICAgdG9wTGV2ZWxPcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSB7XG4gICAgaWYgKG9wdGlvbnM/LnNlbGVjdGVkT3B0aW9uTGltaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG9wdGlvbkdyb3VwcztcbiAgICB9XG5cbiAgICAvLyBXaGVuIHVzZVRvcExldmVsT3B0aW9uc0ZvckRpc3BsYXkgaXMgdHJ1ZSBhbmQgc2VhcmNoIGlzIGFjdGl2ZSwgY291bnRcbiAgICAvLyBzZWxlY3RlZCB0b3AtbGV2ZWwgb3B0aW9ucyBmcm9tIHRoZSBvcmlnaW5hbCAodW5maWx0ZXJlZCkgZGF0YSB0byBlbnN1cmVcbiAgICAvLyBhbHJlYWR5LXNlbGVjdGVkIG9wdGlvbnMgdGhhdCBkb24ndCBtYXRjaCB0aGUgc2VhcmNoIGFyZSBzdGlsbCBjb3VudGVkLlxuICAgIGNvbnN0IHVzZU9yaWdpbmFsRm9yQ291bnRpbmcgPVxuICAgICAgb3B0aW9ucz8udXNlVG9wTGV2ZWxPcHRpb25zRm9yRGlzcGxheSAmJlxuICAgICAgc3RhdGUucXVlcnkuc2VhcmNoICYmXG4gICAgICBzdGF0ZS5vcmlnaW5hbE9wdGlvbkdyb3Vwcy5sZW5ndGggPiAwO1xuXG4gICAgY29uc3QgdG9wT3B0aW9uc0ZvckNvdW50aW5nID0gdXNlT3JpZ2luYWxGb3JDb3VudGluZ1xuICAgICAgPyBnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUub3JpZ2luYWxPcHRpb25Hcm91cHMpLm1hcChvcHRpb24gPT5cbiAgICAgICAgICBhdWdtZW50T3B0aW9uVG9GdWxsT3B0aW9uKHN0YXRlLCBvcHRpb24sIG9wdGlvbnMpLFxuICAgICAgICApXG4gICAgICA6IHRvcExldmVsT3B0aW9ucztcblxuICAgIGNvbnN0IHNlbGVjdGVkT3JJbmRldGVybWluYXRlVG9wT3B0aW9ucyA9IHRvcE9wdGlvbnNGb3JDb3VudGluZy5maWx0ZXIoXG4gICAgICBvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkICE9IGZhbHNlLFxuICAgICk7XG4gICAgY29uc3QgbnVtU2VsZWN0ZWRPcHRpb25zOiBudW1iZXIgPSBvcHRpb25zPy51c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5XG4gICAgICA/IHNlbGVjdGVkT3JJbmRldGVybWluYXRlVG9wT3B0aW9ucy5sZW5ndGhcbiAgICAgIDogc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkLnNpemU7XG5cbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbkxpbWl0OiBudW1iZXIgPSBvcHRpb25zLnNlbGVjdGVkT3B0aW9uTGltaXQ7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGxlc3MgaXRlbXMgc2VsZWN0ZWQgdGhhbiB0aGUgbGltaXQsIGJ1c2luZXNzIGFzIHVzdWFsLlxuICAgIGlmIChudW1TZWxlY3RlZE9wdGlvbnMgPCBzZWxlY3RlZE9wdGlvbkxpbWl0KSB7XG4gICAgICByZXR1cm4gb3B0aW9uR3JvdXBzO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgZXF1YWwgaXRlbXMgc2VsZWN0ZWQgdG8gdGhlIGxpbWl0IChvciBtb3JlKSwgcHJldmVudCB1c2VycyBmcm9tIHNlbGVjdGluZyBtb3JlIG9wdGlvbnMuXG4gICAgZnVuY3Rpb24gZGlzYWJsZVVuc2VsZWN0ZWRJdGVtcyhcbiAgICAgIGN1cnJlbnRPcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgICBvcHRpb25zQXJlQ2hpbGRyZW5PZlNlbGVjdGVkR3JvdXA6IGJvb2xlYW4sXG4gICAgKTogRnVsbE9wdGlvbjxPPltdIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRJdGVtczogRnVsbE9wdGlvbjxPPltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBjdXJyZW50T3B0aW9ucykge1xuICAgICAgICBjb25zdCBpc0Rpc2FibGVkT3JVbnNlbGVjdGVkOiBib29sZWFuID1cbiAgICAgICAgICAhIW9wdGlvbi5kaXNhYmxlZCB8fCAob3B0aW9uLnNlbGVjdGFibGUgJiYgb3B0aW9uLnNlbGVjdGVkID09IGZhbHNlKTtcblxuICAgICAgICBjb25zdCBpc0N1cnJlbnRPcHRpb25TZWxlY3RlZDogYm9vbGVhbiA9XG4gICAgICAgICAgb3B0aW9uLnNlbGVjdGFibGUgJiYgb3B0aW9uLnNlbGVjdGVkICE9IGZhbHNlO1xuICAgICAgICBjb25zdCBpc0N1cnJlbnRPclBhcmVudE9wdGlvblNlbGVjdGVkOiBib29sZWFuID1cbiAgICAgICAgICBpc0N1cnJlbnRPcHRpb25TZWxlY3RlZCB8fCBvcHRpb25zQXJlQ2hpbGRyZW5PZlNlbGVjdGVkR3JvdXA7XG5cbiAgICAgICAgY29uc3QgZm9yY2VFbmFibGVkQmFzZWRPblBhcmVudDogYm9vbGVhbiA9XG4gICAgICAgICAgISFvcHRpb25zPy51c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5ICYmXG4gICAgICAgICAgb3B0aW9uc0FyZUNoaWxkcmVuT2ZTZWxlY3RlZEdyb3VwO1xuICAgICAgICBjb25zdCBtYXJrRGlzYWJsZWQ6IGJvb2xlYW4gPVxuICAgICAgICAgIGlzRGlzYWJsZWRPclVuc2VsZWN0ZWQgJiYgIWZvcmNlRW5hYmxlZEJhc2VkT25QYXJlbnQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGRPcHRpb25zID0gZGlzYWJsZVVuc2VsZWN0ZWRJdGVtcyhcbiAgICAgICAgICAgIG9wdGlvbi5jaGlsZHJlbixcbiAgICAgICAgICAgIGlzQ3VycmVudE9yUGFyZW50T3B0aW9uU2VsZWN0ZWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1cGRhdGVkSXRlbXMucHVzaCh7XG4gICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICBkaXNhYmxlZDogISFtYXJrRGlzYWJsZWQsXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRPcHRpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVwZGF0ZWRJdGVtcy5wdXNoKHtcbiAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgIGRpc2FibGVkOiAhIW1hcmtEaXNhYmxlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHVwZGF0ZWRJdGVtcztcbiAgICB9XG5cbiAgICBjb25zdCBncm91cHNBZnRlckxpbWl0OiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY3VycmVudEdyb3VwIG9mIG9wdGlvbkdyb3Vwcykge1xuICAgICAgZ3JvdXBzQWZ0ZXJMaW1pdC5wdXNoKHtcbiAgICAgICAgLi4uY3VycmVudEdyb3VwLFxuICAgICAgICBvcHRpb25zOiBkaXNhYmxlVW5zZWxlY3RlZEl0ZW1zKGN1cnJlbnRHcm91cC5vcHRpb25zLCBmYWxzZSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JvdXBzQWZ0ZXJMaW1pdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFJlbGF0aW9uc2hpcE1hcHM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbnM6IE9wdGlvbjxPPltdLFxuICApOiBbTWFwPE9bJ2lkJ10sIE9bJ2lkJ10+LCBNYXA8T1snaWQnXSwgT1snaWQnXVtdPl0ge1xuICAgIGNvbnN0IHBhcmVudHMgPSBuZXcgTWFwKCk7XG4gICAgZnVuY3Rpb24gYnVpbGRQYXJlbnRzTWFwKG9wdGlvbnM6IE9wdGlvbjxPPltdLCBwYXJlbnQ/OiBPcHRpb248Tz4pOiB2b2lkIHtcbiAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgIHBhcmVudHMuc2V0KG9wdGlvbi5pZCwgcGFyZW50LmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9uLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICBidWlsZFBhcmVudHNNYXAob3B0aW9uLmNoaWxkcmVuLCBvcHRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGJ1aWxkUGFyZW50c01hcChvcHRpb25zKTtcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gbmV3IE1hcCgpO1xuICAgIGZ1bmN0aW9uIGJ1aWxkQ2hpbGRyZW5NYXAob3B0aW9uczogT3B0aW9uPE8+W10pOiB2b2lkIHtcbiAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY2hpbGRyZW4uc2V0KFxuICAgICAgICAgICAgb3B0aW9uLmlkLFxuICAgICAgICAgICAgb3B0aW9uLmNoaWxkcmVuLm1hcCgoeyBpZCB9KSA9PiBpZCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBidWlsZENoaWxkcmVuTWFwKG9wdGlvbi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgYnVpbGRDaGlsZHJlbk1hcChvcHRpb25zKTtcblxuICAgIHJldHVybiBbcGFyZW50cywgY2hpbGRyZW5dO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VG9wTGV2ZWxPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICApOiBGdWxsT3B0aW9uPE8+W107XG4gIGZ1bmN0aW9uIGdldFRvcExldmVsT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uR3JvdXBzOiBTb3VyY2VPcHRpb25Hcm91cDxPPltdLFxuICApOiBTb3VyY2VPcHRpb248Tz5bXTtcbiAgZnVuY3Rpb24gZ2V0VG9wTGV2ZWxPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IE9wdGlvbkdyb3VwPE8+W10sXG4gICk6IE9wdGlvbjxPPltdO1xuICBmdW5jdGlvbiBnZXRUb3BMZXZlbE9wdGlvbnM8XG4gICAgTyBleHRlbmRzIEJhc2VPcHRpb24sXG4gICAgRyBleHRlbmRzIHsgb3B0aW9uczogcmVhZG9ubHkgVFtdIH0sXG4gICAgVCA9IEcgZXh0ZW5kcyBGdWxsT3B0aW9uR3JvdXA8Tz5cbiAgICAgID8gRnVsbE9wdGlvbjxPPlxuICAgICAgOiBHIGV4dGVuZHMgU291cmNlT3B0aW9uR3JvdXA8Tz5cbiAgICAgID8gU291cmNlT3B0aW9uPE8+XG4gICAgICA6IE9wdGlvbjxPPixcbiAgPihvcHRpb25Hcm91cHM6IEdbXSk6IFRbXSB7XG4gICAgcmV0dXJuIG9wdGlvbkdyb3Vwcy5yZWR1Y2U8VFtdPihcbiAgICAgIChvcHRpb25zLCBncm91cCkgPT4gWy4uLm9wdGlvbnMsIC4uLmdyb3VwLm9wdGlvbnNdLFxuICAgICAgW10sXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFBhcmVudE11bHRpU2VsZWN0aW9uU3RhdGU8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIGNoaWxkcmVuOiBGdWxsT3B0aW9uPE8+W10sXG4gICk6IE11bHRpU2VsZWN0aW9uU3RhdGUge1xuICAgIGlmIChjaGlsZHJlbi5ldmVyeShjaGlsZCA9PiBjaGlsZC5zZWxlY3RlZCA9PT0gdHJ1ZSkpIHJldHVybiB0cnVlO1xuICAgIGlmIChjaGlsZHJlbi5ldmVyeShjaGlsZCA9PiBjaGlsZC5zZWxlY3RlZCA9PT0gZmFsc2UpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICdpbmRldGVybWluYXRlJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGF1Z21lbnRPcHRpb25Ub0Z1bGxPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgb3B0aW9uOiBTb3VyY2VPcHRpb248Tz4sXG4gICAgbWFuYWdlck9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogRnVsbE9wdGlvbjxPPiB7XG4gICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBhdWdtZW50ZWRDaGlsZHJlbiA9IG9wdGlvbi5jaGlsZHJlbi5tYXAoY2hpbGQgPT5cbiAgICAgICAgYXVnbWVudE9wdGlvblRvRnVsbE9wdGlvbihzdGF0ZSwgY2hpbGQsIG1hbmFnZXJPcHRpb25zKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBzZWxlY3RhYmxlV2hlblNlYXJjaGluZyA9XG4gICAgICAgIG1hbmFnZXJPcHRpb25zPy5hbGxvd1NlbGVjdE5vbkxlYWZEdXJpbmdTZWFyY2ggPz8gZmFsc2U7XG5cbiAgICAgIC8vIFdoZW4gYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoIGlzIGVuYWJsZWQgYW5kIHNlYXJjaCBpcyBhY3RpdmUsXG4gICAgICAvLyBjYWxjdWxhdGUgc2VsZWN0aW9uIHN0YXRlIGZyb20gQUxMIG9yaWdpbmFsIGNoaWxkcmVuLCBub3QganVzdCB0aGVcbiAgICAgIC8vIGZpbHRlcmVkIG9uZXMgdmlzaWJsZSBpbiBzZWFyY2ggcmVzdWx0cy5cbiAgICAgIGNvbnN0IHVzZU9yaWdpbmFsRm9yU2VsZWN0aW9uU3RhdGUgPVxuICAgICAgICBtYW5hZ2VyT3B0aW9ucz8uYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoICYmXG4gICAgICAgIHN0YXRlLnF1ZXJ5LnNlYXJjaCAmJlxuICAgICAgICBzdGF0ZS5vcmlnaW5hbE9wdGlvbkdyb3Vwcy5sZW5ndGggPiAwO1xuXG4gICAgICBsZXQgc2VsZWN0ZWQ6IE11bHRpU2VsZWN0aW9uU3RhdGU7XG4gICAgICBpZiAodXNlT3JpZ2luYWxGb3JTZWxlY3Rpb25TdGF0ZSkge1xuICAgICAgICBjb25zdCBvcmlnaW5hbE9wdGlvbiA9IGZpbmRPcHRpb24oXG4gICAgICAgICAgZ2V0VG9wTGV2ZWxPcHRpb25zKHN0YXRlLm9yaWdpbmFsT3B0aW9uR3JvdXBzKSxcbiAgICAgICAgICBvcHRpb24uaWQsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcmlnaW5hbE9wdGlvbikge1xuICAgICAgICAgIGNvbnN0IGFsbExlYXZlcyA9IGZsYXR0ZW5PcHRpb25zKFtvcmlnaW5hbE9wdGlvbl0sIHRydWUpO1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQ291bnQgPSBhbGxMZWF2ZXMuZmlsdGVyKGxlYWYgPT5cbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZC5oYXMobGVhZiksXG4gICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZENvdW50ID09PSBhbGxMZWF2ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gJ2luZGV0ZXJtaW5hdGUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxlY3RlZCA9IGdldFBhcmVudE11bHRpU2VsZWN0aW9uU3RhdGUoYXVnbWVudGVkQ2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZCA9IGdldFBhcmVudE11bHRpU2VsZWN0aW9uU3RhdGUoYXVnbWVudGVkQ2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgIGNoaWxkcmVuOiBhdWdtZW50ZWRDaGlsZHJlbixcbiAgICAgICAgc2VsZWN0ZWQsXG4gICAgICAgIGV4cGFuZGVkOiBzdGF0ZS5xdWVyeS5zZWFyY2hcbiAgICAgICAgICA/IHRydWVcbiAgICAgICAgICA6IHN0YXRlLmRpc3BsYXkuZXhwYW5kZWRPcHRpb25zLmhhcyhvcHRpb24uaWQpLFxuICAgICAgICBzZWxlY3RhYmxlOiAhc3RhdGUucXVlcnkuc2VhcmNoIHx8IHNlbGVjdGFibGVXaGVuU2VhcmNoaW5nLFxuICAgICAgICBleHBhbmRhYmxlOiAhc3RhdGUucXVlcnkuc2VhcmNoLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm9wdGlvbixcbiAgICAgIGNoaWxkcmVuOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3RlZDogc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkLmhhcyhvcHRpb24pLFxuICAgICAgZXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgc2VsZWN0YWJsZTogdHJ1ZSxcbiAgICAgIGV4cGFuZGFibGU6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRPcHRpb25zRm9yRGlzcGxheTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICB0b3BMZXZlbE9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSxcbiAgICBvcHRpb25zPzogTWFuYWdlck9wdGlvbnM8Tz4sXG4gICk6IHN0cmluZyB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhIGN1c3RvbSBkaXNwbGF5IGZ1bmN0aW9uLCB1c2UgaXRcbiAgICBpZiAob3B0aW9ucz8uZ2V0Q3VzdG9tT3B0aW9uRGlzcGxheSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuZ2V0Q3VzdG9tT3B0aW9uRGlzcGxheShbLi4uc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkXSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zPy51c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5KSB7XG4gICAgICByZXR1cm4gZ2V0VG9wTGV2ZWxGb3JtYXR0ZWRPcHRpb25zRm9yRGlzcGxheSh0b3BMZXZlbE9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBPdGhlcndpc2UsIHVzZSB0aGUgZGVmYXVsdCBkaXNwbGF5IGZvciBvcHRpb25zIC0gdGl0bGVzIHNlcGFyYXRlZCBieSBjb21tYXMuXG4gICAgcmV0dXJuIFsuLi5zdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWRdLm1hcCgoeyB0aXRsZSB9KSA9PiB0aXRsZSkuam9pbignLCAnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFRvcExldmVsRm9ybWF0dGVkT3B0aW9uc0ZvckRpc3BsYXk8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHRvcExldmVsT3B0aW9uczogRnVsbE9wdGlvbjxPPltdLFxuICApOiBzdHJpbmcge1xuICAgIGlmICghdG9wTGV2ZWxPcHRpb25zIHx8IHRvcExldmVsT3B0aW9ucy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnMgPSB0b3BMZXZlbE9wdGlvbnMuZmlsdGVyKFxuICAgICAgb3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCAhPSBmYWxzZSxcbiAgICApO1xuICAgIHJldHVybiBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnNcbiAgICAgIC5tYXAoKHsgdGl0bGUgfSkgPT4gdGl0bGUpXG4gICAgICAuam9pbignLCAnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFBpbGxDb3VudEZvckRpc3BsYXk8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgdG9wTGV2ZWxPcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBudW1iZXIge1xuICAgIGlmIChvcHRpb25zPy51c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5KSB7XG4gICAgICBjb25zdCBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnMgPSB0b3BMZXZlbE9wdGlvbnMuZmlsdGVyKFxuICAgICAgICBvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkICE9IGZhbHNlLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnMubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkLnNpemU7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRaZXJvU3RhdGVNZXNzYWdlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICApOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoc3RhdGUuc291cmNlT3B0aW9uR3JvdXBzLmV2ZXJ5KGdyb3VwID0+IGdyb3VwLm9wdGlvbnMubGVuZ3RoID09PSAwKSkge1xuICAgICAgaWYgKHN0YXRlLnF1ZXJ5LnNlYXJjaCkgcmV0dXJuICdObyByZXN1bHRzIGZvdW5kLic7XG4gICAgICByZXR1cm4gJ05vIG9wdGlvbnMuJztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBmaW5kT3B0aW9uPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25zOiBTb3VyY2VPcHRpb248Tz5bXSxcbiAgICBpZDogT1snaWQnXSxcbiAgKTogU291cmNlT3B0aW9uPE8+IHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbi5pZCA9PT0gaWQpIHJldHVybiBvcHRpb247XG4gICAgICBpZiAob3B0aW9uLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBmaW5kT3B0aW9uKG9wdGlvbi5jaGlsZHJlbiwgaWQpO1xuICAgICAgICBpZiAoY2hpbGQpIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBmbGF0dGVuT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uczogT3B0aW9uPE8+W10sXG4gICAgbGVhZk9ubHk6IGJvb2xlYW4sXG4gICk6IE9bXSB7XG4gICAgcmV0dXJuIGZsYXR0ZW5EZWVwKFxuICAgICAgb3B0aW9ucy5tYXAob3B0aW9uID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgZGVzY2VuZGFudHMgPSBvcHRpb24uY2hpbGRyZW4ubWFwKGNoaWxkID0+XG4gICAgICAgICAgICBmbGF0dGVuT3B0aW9ucyhbY2hpbGRdLCBsZWFmT25seSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gbGVhZk9ubHkgPyBkZXNjZW5kYW50cyA6IFtvcHRpb24sIC4uLmRlc2NlbmRhbnRzXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW29wdGlvbl07XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiB0b2dnbGVTZWxlY3RlZDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICBpZDogT1snaWQnXSxcbiAgICBtYW5hZ2VyT3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBDb3JlU3RhdGU8Tz4ge1xuICAgIGNvbnN0IHRvcExldmVsT3B0aW9ucyA9IGdldFRvcExldmVsT3B0aW9ucyhzdGF0ZS5zb3VyY2VPcHRpb25Hcm91cHMpO1xuICAgIGNvbnN0IG9wdGlvbiA9IGZpbmRPcHRpb24odG9wTGV2ZWxPcHRpb25zLCBpZCk7XG4gICAgaWYgKCFvcHRpb24pIHJldHVybiBzdGF0ZTtcblxuICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IG5ldyBPcHRpb25TZXQoc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkKTtcblxuICAgIGNvbnN0IG5ld1ZhbHVlID0gIShcbiAgICAgIGF1Z21lbnRPcHRpb25Ub0Z1bGxPcHRpb24oc3RhdGUsIG9wdGlvbiwgbWFuYWdlck9wdGlvbnMpLnNlbGVjdGVkID09PSB0cnVlXG4gICAgKTtcblxuICAgIC8vIFdoZW4gYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoIGlzIGVuYWJsZWQgYW5kIHNlYXJjaCBpcyBhY3RpdmUsXG4gICAgLy8gdXNlIHRoZSBvcmlnaW5hbCAodW5maWx0ZXJlZCkgZGF0YSB0byBnZXQgYWxsIGNoaWxkcmVuLCBub3QganVzdFxuICAgIC8vIHRob3NlIHZpc2libGUgaW4gdGhlIGZpbHRlcmVkIHNlYXJjaCByZXN1bHRzLlxuICAgIGNvbnN0IHVzZU9yaWdpbmFsRGF0YSA9XG4gICAgICBtYW5hZ2VyT3B0aW9ucz8uYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoICYmXG4gICAgICBzdGF0ZS5xdWVyeS5zZWFyY2ggJiZcbiAgICAgIHN0YXRlLm9yaWdpbmFsT3B0aW9uR3JvdXBzLmxlbmd0aCA+IDA7XG5cbiAgICBjb25zdCBvcHRpb25Gb3JMZWF2ZXMgPSB1c2VPcmlnaW5hbERhdGFcbiAgICAgID8gZmluZE9wdGlvbihnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUub3JpZ2luYWxPcHRpb25Hcm91cHMpLCBpZCkgPz8gb3B0aW9uXG4gICAgICA6IG9wdGlvbjtcblxuICAgIGNvbnN0IGxlYXZlcyA9IGZsYXR0ZW5PcHRpb25zKFtvcHRpb25Gb3JMZWF2ZXNdLCB0cnVlKTtcbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgbGVhdmVzKSB7XG4gICAgICBpZiAobmV3VmFsdWUpIHtcbiAgICAgICAgbmV3U2VsZWN0aW9uLmFkZChsZWFmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1NlbGVjdGlvbi5kZWxldGUobGVhZik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIHNlbGVjdGVkOiBuZXdTZWxlY3Rpb24sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBzZXRTZWxlY3RlZE9wdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICBpZDogT1snaWQnXSxcbiAgKTogQ29yZVN0YXRlPE8+IHtcbiAgICBjb25zdCB0b3BMZXZlbE9wdGlvbnMgPSBnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUuc291cmNlT3B0aW9uR3JvdXBzKTtcbiAgICBjb25zdCBvcHRpb24gPSBmaW5kT3B0aW9uKHRvcExldmVsT3B0aW9ucywgaWQpO1xuICAgIGlmICghb3B0aW9uKSByZXR1cm4gc3RhdGU7XG5cbiAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBuZXcgT3B0aW9uU2V0PE8+KCk7XG4gICAgbmV3U2VsZWN0aW9uLmFkZChvcHRpb24pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIHNlbGVjdGVkOiBuZXdTZWxlY3Rpb24sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB0b2dnbGVWaXNpYmxlU2VsZWN0ZWQ8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICk6IENvcmVTdGF0ZTxPPiB7XG4gICAgY29uc3QgbGVhdmVzID0gZmxhdHRlbk9wdGlvbnMoXG4gICAgICBnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUuc291cmNlT3B0aW9uR3JvdXBzKSxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgICBjb25zdCBpc0FsbFNlbGVjdGVkID0gbGVhdmVzLmV2ZXJ5KGxlYWYgPT5cbiAgICAgIHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZC5oYXMobGVhZiksXG4gICAgKTtcbiAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBuZXcgT3B0aW9uU2V0KHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZCk7XG5cbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgbGVhdmVzKSB7XG4gICAgICBpZiAoaXNBbGxTZWxlY3RlZCkgbmV3U2VsZWN0aW9uLmRlbGV0ZShsZWFmKTtcbiAgICAgIGVsc2UgbmV3U2VsZWN0aW9uLmFkZChsZWFmKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgLi4uc3RhdGUuc2VsZWN0aW9uLFxuICAgICAgICBzZWxlY3RlZDogbmV3U2VsZWN0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlT3B0aW9uRXhwYW5kZWQ8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgaWQ6IE9bJ2lkJ10sXG4gICk6IENvcmVTdGF0ZTxPPiB7XG4gICAgY29uc3QgbmV3VmFsdWUgPSAhc3RhdGUuZGlzcGxheS5leHBhbmRlZE9wdGlvbnMuaGFzKGlkKTtcbiAgICBjb25zdCBuZXdFeHBhbmRlZE9wdGlvbnMgPSBuZXcgU2V0KHN0YXRlLmRpc3BsYXkuZXhwYW5kZWRPcHRpb25zKTtcbiAgICBpZiAobmV3VmFsdWUpIG5ld0V4cGFuZGVkT3B0aW9ucy5hZGQoaWQpO1xuICAgIGVsc2UgbmV3RXhwYW5kZWRPcHRpb25zLmRlbGV0ZShpZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZGlzcGxheToge1xuICAgICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgICBleHBhbmRlZE9wdGlvbnM6IG5ld0V4cGFuZGVkT3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNpZGVFZmZlY3RzPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIGFjdGlvbjogQWN0aW9uPE8+IHwgSW50ZXJuYWxBY3Rpb248Tz4sXG4gICAgc291cmNlOiBTb3VyY2U8Tz4sXG4gICAgaW50ZXJuYWxBY3Rpb25zOiBTdWJqZWN0PEludGVybmFsQWN0aW9uPE8+PixcbiAgKTogQ29yZVN0YXRlPE8+IHtcbiAgICBpZiAoXG4gICAgICBhY3Rpb24udHlwZSA9PT0gJ2xvYWQnIHx8XG4gICAgICBhY3Rpb24udHlwZSA9PT0gJ3NlYXJjaENoYW5nZScgfHxcbiAgICAgIGFjdGlvbi50eXBlID09PSAnb3JkZXJDaGFuZ2UnIHx8XG4gICAgICAoYWN0aW9uLnR5cGUgPT09ICdvcGVuQ2hhbmdlJyAmJiBhY3Rpb24ub3BlbilcbiAgICApIHtcbiAgICAgIHNvdXJjZShzdGF0ZS5xdWVyeSwgYWN0aW9uKVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiByZXN1bHQuZGF0YTtcbiAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGEgPSBBcnJheS5pc0FycmF5KHJlc3VsdClcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IHJlc3VsdC5vcmlnaW5hbERhdGE7XG4gICAgICAgICAgaW50ZXJuYWxBY3Rpb25zLm5leHQoeyB0eXBlOiAnbG9hZENvbXBsZXRlJywgZGF0YSwgb3JpZ2luYWxEYXRhIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgaW50ZXJuYWxBY3Rpb25zLm5leHQoeyB0eXBlOiAnbG9hZEVycm9yJywgZXJyb3IgfSk7XG4gICAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGxvYWQ6IHtcbiAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVkdWNlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIGFjdGlvbjogQWN0aW9uPE8+IHwgSW50ZXJuYWxBY3Rpb248Tz4sXG4gICAgbWFuYWdlck9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogQ29yZVN0YXRlPE8+IHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICBjYXNlICdsb2FkJzpcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgY2FzZSAnbG9hZENvbXBsZXRlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBsb2FkOiB7XG4gICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc291cmNlT3B0aW9uR3JvdXBzOiBhY3Rpb24uZGF0YSxcbiAgICAgICAgICBvcmlnaW5hbE9wdGlvbkdyb3VwczogYWN0aW9uLm9yaWdpbmFsRGF0YSA/PyBbXSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ2xvYWRFcnJvcic6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgbG9hZDoge1xuICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogYWN0aW9uLmVycm9yLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICBjYXNlICdvcGVuQ2hhbmdlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBzZWFyY2g6ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGlzcGxheToge1xuICAgICAgICAgICAgLi4uc3RhdGUuZGlzcGxheSxcbiAgICAgICAgICAgIG9wZW46IGFjdGlvbi5vcGVuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICBjYXNlICdzZWFyY2hDaGFuZ2UnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIHNlYXJjaDogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ29yZGVyQ2hhbmdlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBvcmRlcjogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ3NlbGVjdGlvbkNoYW5nZSc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgc2VsZWN0aW9uOiBhY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ3RvZ2dsZU9wdGlvblNlbGVjdGVkJzpcbiAgICAgICAgcmV0dXJuIHRvZ2dsZVNlbGVjdGVkKHN0YXRlLCBhY3Rpb24uaWQsIG1hbmFnZXJPcHRpb25zKTtcbiAgICAgIGNhc2UgJ3NldFNlbGVjdGVkT3B0aW9uJzpcbiAgICAgICAgcmV0dXJuIHNldFNlbGVjdGVkT3B0aW9uKHN0YXRlLCBhY3Rpb24uaWQpO1xuICAgICAgY2FzZSAndmlzaWJsZVNlbGVjdGVkQ2hhbmdlJzpcbiAgICAgICAgcmV0dXJuIHRvZ2dsZVZpc2libGVTZWxlY3RlZChzdGF0ZSk7XG4gICAgICBjYXNlICd0b2dnbGVPcHRpb25FeHBhbmRlZCc6XG4gICAgICAgIHJldHVybiB0b2dnbGVPcHRpb25FeHBhbmRlZChzdGF0ZSwgYWN0aW9uLmlkKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==