@workflow/web-shared 5.0.0-beta.4 → 5.0.0-beta.40

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 (517) hide show
  1. package/README.md +5 -13
  2. package/dist/components/error-boundary.js +1 -1
  3. package/dist/components/event-list-view.d.ts +46 -1
  4. package/dist/components/event-list-view.d.ts.map +1 -1
  5. package/dist/components/event-list-view.js +235 -97
  6. package/dist/components/hook-actions.js +1 -1
  7. package/dist/components/index.d.ts +8 -5
  8. package/dist/components/index.d.ts.map +1 -1
  9. package/dist/components/index.js +6 -4
  10. package/dist/components/sidebar/attribute-panel.d.ts +4 -1
  11. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  12. package/dist/components/sidebar/attribute-panel.js +173 -119
  13. package/dist/components/sidebar/attributes-block.d.ts +40 -0
  14. package/dist/components/sidebar/attributes-block.d.ts.map +1 -0
  15. package/dist/components/sidebar/attributes-block.js +140 -0
  16. package/dist/components/sidebar/conversation-view.js +1 -1
  17. package/dist/components/sidebar/copyable-data-block.d.ts +2 -0
  18. package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
  19. package/dist/components/sidebar/copyable-data-block.js +17 -16
  20. package/dist/components/sidebar/entity-detail-panel.d.ts +11 -11
  21. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  22. package/dist/components/sidebar/entity-detail-panel.js +37 -71
  23. package/dist/components/sidebar/events-list.d.ts +6 -2
  24. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  25. package/dist/components/sidebar/events-list.js +77 -63
  26. package/dist/components/sidebar/resolve-hook-modal.js +1 -1
  27. package/dist/components/sidebar/sidebar-data-context.d.ts +10 -7
  28. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -1
  29. package/dist/components/sidebar/sidebar-data-context.js +1 -1
  30. package/dist/components/sidebar/span-detail-merge.d.ts +31 -0
  31. package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -0
  32. package/dist/components/sidebar/span-detail-merge.js +92 -0
  33. package/dist/components/sidebar/use-selected-span-detail.d.ts +16 -0
  34. package/dist/components/sidebar/use-selected-span-detail.d.ts.map +1 -0
  35. package/dist/components/sidebar/use-selected-span-detail.js +93 -0
  36. package/dist/components/stream-viewer-skeleton.d.ts +2 -0
  37. package/dist/components/stream-viewer-skeleton.d.ts.map +1 -0
  38. package/dist/components/stream-viewer-skeleton.js +12 -0
  39. package/dist/components/stream-viewer.d.ts +1 -1
  40. package/dist/components/stream-viewer.d.ts.map +1 -1
  41. package/dist/components/stream-viewer.js +9 -26
  42. package/dist/components/trace-viewer/components/copy-button.d.ts.map +1 -0
  43. package/dist/components/trace-viewer/components/copy-button.js +27 -0
  44. package/dist/components/trace-viewer/components/detail-panel-width.d.ts +34 -0
  45. package/dist/components/trace-viewer/components/detail-panel-width.d.ts.map +1 -0
  46. package/dist/components/trace-viewer/components/detail-panel-width.js +67 -0
  47. package/dist/components/trace-viewer/components/detail-panel.d.ts +14 -0
  48. package/dist/components/trace-viewer/components/detail-panel.d.ts.map +1 -0
  49. package/dist/components/trace-viewer/components/detail-panel.js +122 -0
  50. package/dist/components/trace-viewer/components/draggable-border.d.ts +31 -0
  51. package/dist/components/trace-viewer/components/draggable-border.d.ts.map +1 -0
  52. package/dist/components/trace-viewer/components/draggable-border.js +140 -0
  53. package/dist/components/trace-viewer/components/event-list.d.ts +10 -0
  54. package/dist/components/trace-viewer/components/event-list.d.ts.map +1 -0
  55. package/dist/components/trace-viewer/components/event-list.js +47 -0
  56. package/dist/components/trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
  57. package/dist/components/trace-viewer/components/middle-truncate/copy-selection.js +54 -0
  58. package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
  59. package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
  60. package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.d.ts +1 -1
  61. package/dist/components/trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
  62. package/dist/components/trace-viewer/components/middle-truncate/truncate.js +101 -0
  63. package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
  64. package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
  65. package/dist/components/trace-viewer/components/minimap.d.ts +14 -0
  66. package/dist/components/trace-viewer/components/minimap.d.ts.map +1 -0
  67. package/dist/components/trace-viewer/components/minimap.js +337 -0
  68. package/dist/components/trace-viewer/components/pane-constants.d.ts +14 -0
  69. package/dist/components/trace-viewer/components/pane-constants.d.ts.map +1 -0
  70. package/dist/components/trace-viewer/components/pane-constants.js +16 -0
  71. package/dist/components/trace-viewer/components/span-markers.d.ts +46 -0
  72. package/dist/components/trace-viewer/components/span-markers.d.ts.map +1 -0
  73. package/dist/components/trace-viewer/components/span-markers.js +85 -0
  74. package/dist/components/trace-viewer/components/split-pane.d.ts +10 -0
  75. package/dist/components/trace-viewer/components/split-pane.d.ts.map +1 -0
  76. package/dist/components/trace-viewer/components/split-pane.js +41 -0
  77. package/dist/components/trace-viewer/components/timeline.d.ts +42 -0
  78. package/dist/components/trace-viewer/components/timeline.d.ts.map +1 -0
  79. package/dist/components/trace-viewer/components/timeline.js +321 -0
  80. package/dist/components/trace-viewer/components/timeline.module.css +46 -0
  81. package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts +5 -0
  82. package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts.map +1 -0
  83. package/dist/components/trace-viewer/components/trace-shortcut-helper.js +55 -0
  84. package/dist/components/trace-viewer/components/trace-shortcut-helper.module.css +20 -0
  85. package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts +2 -0
  86. package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
  87. package/dist/components/trace-viewer/components/trace-viewer-skeleton.js +26 -0
  88. package/dist/components/trace-viewer/components/use-element-width.d.ts +8 -0
  89. package/dist/components/trace-viewer/components/use-element-width.d.ts.map +1 -0
  90. package/dist/components/trace-viewer/components/use-element-width.js +25 -0
  91. package/dist/components/trace-viewer/components/use-row-window.d.ts +34 -0
  92. package/dist/components/trace-viewer/components/use-row-window.d.ts.map +1 -0
  93. package/dist/components/trace-viewer/components/use-row-window.js +107 -0
  94. package/dist/components/trace-viewer/context.d.ts +14 -182
  95. package/dist/components/trace-viewer/context.d.ts.map +1 -1
  96. package/dist/components/trace-viewer/context.js +44 -351
  97. package/dist/components/trace-viewer/icons.d.ts.map +1 -0
  98. package/dist/components/trace-viewer/icons.js +15 -0
  99. package/dist/components/trace-viewer/search.d.ts +19 -0
  100. package/dist/components/trace-viewer/search.d.ts.map +1 -0
  101. package/dist/components/trace-viewer/search.js +134 -0
  102. package/dist/components/trace-viewer/trace-viewer.d.ts +7 -28
  103. package/dist/components/trace-viewer/trace-viewer.d.ts.map +1 -1
  104. package/dist/components/trace-viewer/trace-viewer.js +306 -356
  105. package/dist/components/trace-viewer/types.d.ts +2 -211
  106. package/dist/components/trace-viewer/types.d.ts.map +1 -1
  107. package/dist/components/trace-viewer/types.js +1 -1
  108. package/dist/components/trace-viewer/util/timing.d.ts +2 -2
  109. package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
  110. package/dist/components/trace-viewer/util/timing.js +3 -3
  111. package/dist/components/trace-viewer/utils.d.ts +111 -0
  112. package/dist/components/trace-viewer/utils.d.ts.map +1 -0
  113. package/dist/components/trace-viewer/utils.js +430 -0
  114. package/dist/components/{trace-viewer-new.d.ts → trace-viewer.d.ts} +7 -3
  115. package/dist/components/trace-viewer.d.ts.map +1 -0
  116. package/dist/components/trace-viewer.js +21 -0
  117. package/dist/components/ui/alert.js +3 -3
  118. package/dist/components/ui/button.d.ts +10 -0
  119. package/dist/components/ui/button.d.ts.map +1 -0
  120. package/dist/components/ui/button.js +46 -0
  121. package/dist/components/ui/card.d.ts.map +1 -1
  122. package/dist/components/ui/card.js +4 -4
  123. package/dist/components/ui/collapsible.d.ts +46 -0
  124. package/dist/components/ui/collapsible.d.ts.map +1 -0
  125. package/dist/components/ui/collapsible.js +66 -0
  126. package/dist/components/ui/context-card.d.ts +47 -0
  127. package/dist/components/ui/context-card.d.ts.map +1 -0
  128. package/dist/components/ui/context-card.js +471 -0
  129. package/dist/components/ui/data-inspector.d.ts +7 -6
  130. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  131. package/dist/components/ui/data-inspector.js +232 -99
  132. package/dist/components/ui/data-inspector.styles.d.ts +29 -0
  133. package/dist/components/ui/data-inspector.styles.d.ts.map +1 -0
  134. package/dist/components/ui/data-inspector.styles.js +95 -0
  135. package/dist/components/ui/decrypt-button.js +1 -1
  136. package/dist/components/ui/error-card.js +3 -3
  137. package/dist/components/ui/error-stack-block.d.ts +17 -10
  138. package/dist/components/ui/error-stack-block.d.ts.map +1 -1
  139. package/dist/components/ui/error-stack-block.js +49 -30
  140. package/dist/components/ui/icon-button.d.ts +19 -0
  141. package/dist/components/ui/icon-button.d.ts.map +1 -0
  142. package/dist/components/ui/icon-button.js +29 -0
  143. package/dist/components/ui/kbd.d.ts +10 -0
  144. package/dist/components/ui/kbd.d.ts.map +1 -0
  145. package/dist/components/ui/kbd.js +25 -0
  146. package/dist/components/ui/load-more-button.js +1 -1
  147. package/dist/components/ui/menu-dropdown.js +1 -1
  148. package/dist/components/ui/skeleton.js +2 -2
  149. package/dist/components/ui/spinner.js +1 -1
  150. package/dist/components/ui/timestamp-tooltip.d.ts +34 -1
  151. package/dist/components/ui/timestamp-tooltip.d.ts.map +1 -1
  152. package/dist/components/ui/timestamp-tooltip.js +80 -132
  153. package/dist/components/ui/tooltip.d.ts +10 -0
  154. package/dist/components/ui/tooltip.d.ts.map +1 -0
  155. package/dist/components/ui/tooltip.js +12 -0
  156. package/dist/components/workflow-traces/event-colors.d.ts +2 -1
  157. package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
  158. package/dist/components/workflow-traces/event-colors.js +15 -7
  159. package/dist/components/workflow-traces/trace-span-construction.d.ts +6 -3
  160. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  161. package/dist/components/workflow-traces/trace-span-construction.js +71 -30
  162. package/dist/components/workflow-traces/trace-time-utils.js +1 -1
  163. package/dist/hooks/use-dark-mode.js +1 -1
  164. package/dist/hooks/use-intersection-observer.d.ts +17 -0
  165. package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
  166. package/dist/hooks/use-intersection-observer.js +29 -0
  167. package/dist/hooks/use-load-more-on-scroll.d.ts +21 -0
  168. package/dist/hooks/use-load-more-on-scroll.d.ts.map +1 -0
  169. package/dist/hooks/use-load-more-on-scroll.js +28 -0
  170. package/dist/hooks/use-reduced-motion.d.ts +10 -0
  171. package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
  172. package/dist/hooks/use-reduced-motion.js +29 -0
  173. package/dist/index.d.ts +4 -3
  174. package/dist/index.d.ts.map +1 -1
  175. package/dist/index.js +4 -3
  176. package/dist/lib/cn.d.ts +10 -0
  177. package/dist/lib/cn.d.ts.map +1 -0
  178. package/dist/lib/cn.js +83 -0
  179. package/dist/lib/event-analysis.d.ts +1 -1
  180. package/dist/lib/event-analysis.d.ts.map +1 -1
  181. package/dist/lib/event-analysis.js +3 -2
  182. package/dist/lib/event-materialization.d.ts +1 -1
  183. package/dist/lib/event-materialization.d.ts.map +1 -1
  184. package/dist/lib/event-materialization.js +29 -21
  185. package/dist/lib/exact-event-search-id.d.ts +25 -0
  186. package/dist/lib/exact-event-search-id.d.ts.map +1 -0
  187. package/dist/lib/exact-event-search-id.js +39 -0
  188. package/dist/lib/hydration.d.ts +17 -2
  189. package/dist/lib/hydration.d.ts.map +1 -1
  190. package/dist/lib/hydration.js +194 -23
  191. package/dist/lib/stream-display.js +1 -1
  192. package/dist/lib/toast.js +1 -1
  193. package/dist/lib/trace-builder.d.ts +17 -5
  194. package/dist/lib/trace-builder.d.ts.map +1 -1
  195. package/dist/lib/trace-builder.js +32 -14
  196. package/dist/lib/trace-types.d.ts +54 -0
  197. package/dist/lib/trace-types.d.ts.map +1 -0
  198. package/dist/lib/trace-types.js +2 -0
  199. package/dist/lib/utils.d.ts +14 -2
  200. package/dist/lib/utils.d.ts.map +1 -1
  201. package/dist/lib/utils.js +46 -6
  202. package/dist/lib/zstd-browser-decoder.d.ts +7 -0
  203. package/dist/lib/zstd-browser-decoder.d.ts.map +1 -0
  204. package/dist/lib/zstd-browser-decoder.js +41 -0
  205. package/dist/styles.css +210 -139
  206. package/package.json +11 -8
  207. package/src/components/event-list-view.tsx +385 -123
  208. package/src/components/index.ts +14 -8
  209. package/src/components/sidebar/attribute-panel.tsx +331 -282
  210. package/src/components/sidebar/attributes-block.tsx +326 -0
  211. package/src/components/sidebar/copyable-data-block.tsx +50 -28
  212. package/src/components/sidebar/entity-detail-panel.tsx +92 -126
  213. package/src/components/sidebar/events-list.tsx +197 -179
  214. package/src/components/sidebar/sidebar-data-context.tsx +11 -11
  215. package/src/components/sidebar/span-detail-merge.ts +134 -0
  216. package/src/components/sidebar/use-selected-span-detail.ts +146 -0
  217. package/src/components/stream-viewer-skeleton.tsx +34 -0
  218. package/src/components/stream-viewer.tsx +34 -106
  219. package/src/components/{new-trace-viewer → trace-viewer}/components/copy-button.tsx +2 -2
  220. package/src/components/trace-viewer/components/detail-panel-width.test.ts +123 -0
  221. package/src/components/trace-viewer/components/detail-panel-width.ts +76 -0
  222. package/src/components/trace-viewer/components/detail-panel.tsx +273 -0
  223. package/src/components/trace-viewer/components/draggable-border.tsx +216 -0
  224. package/src/components/trace-viewer/components/event-list.tsx +144 -0
  225. package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.tsx +8 -8
  226. package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.ts +1 -1
  227. package/src/components/trace-viewer/components/minimap.tsx +556 -0
  228. package/src/components/trace-viewer/components/pane-constants.ts +19 -0
  229. package/src/components/trace-viewer/components/span-markers.tsx +173 -0
  230. package/src/components/trace-viewer/components/split-pane.tsx +141 -0
  231. package/src/components/trace-viewer/components/timeline.module.css +46 -0
  232. package/src/components/trace-viewer/components/timeline.tsx +850 -0
  233. package/src/components/trace-viewer/components/trace-shortcut-helper.module.css +20 -0
  234. package/src/components/trace-viewer/components/trace-shortcut-helper.tsx +116 -0
  235. package/src/components/trace-viewer/components/trace-viewer-skeleton.tsx +114 -0
  236. package/src/components/trace-viewer/components/use-element-width.ts +29 -0
  237. package/src/components/trace-viewer/components/use-row-window.ts +140 -0
  238. package/src/components/trace-viewer/context.tsx +63 -656
  239. package/src/components/{new-trace-viewer → trace-viewer}/icons.tsx +2 -2
  240. package/src/components/trace-viewer/search.ts +178 -0
  241. package/src/components/trace-viewer/trace-viewer.tsx +563 -531
  242. package/src/components/trace-viewer/types.ts +2 -234
  243. package/src/components/trace-viewer/util/timing.ts +2 -2
  244. package/src/components/trace-viewer/utils.test.ts +458 -0
  245. package/src/components/{new-trace-viewer → trace-viewer}/utils.ts +271 -50
  246. package/src/components/{trace-viewer-new.tsx → trace-viewer.tsx} +24 -18
  247. package/src/components/ui/alert.tsx +2 -2
  248. package/src/components/ui/button.tsx +68 -0
  249. package/src/components/ui/card.tsx +3 -10
  250. package/src/components/ui/collapsible.tsx +219 -0
  251. package/src/components/ui/context-card.tsx +784 -0
  252. package/src/components/ui/data-inspector.styles.ts +96 -0
  253. package/src/components/ui/data-inspector.tsx +501 -204
  254. package/src/components/ui/error-card.tsx +4 -4
  255. package/src/components/ui/error-stack-block.tsx +84 -55
  256. package/src/components/ui/icon-button.tsx +53 -0
  257. package/src/components/ui/kbd.tsx +43 -0
  258. package/src/components/ui/skeleton.tsx +1 -1
  259. package/src/components/ui/timestamp-tooltip.tsx +132 -194
  260. package/src/components/ui/tooltip.tsx +47 -0
  261. package/src/components/workflow-traces/event-colors.ts +15 -11
  262. package/src/components/workflow-traces/trace-span-construction.test.ts +85 -0
  263. package/src/components/workflow-traces/trace-span-construction.ts +97 -32
  264. package/src/hooks/use-intersection-observer.ts +57 -0
  265. package/src/hooks/use-load-more-on-scroll.ts +49 -0
  266. package/src/hooks/use-reduced-motion.ts +34 -0
  267. package/src/index.ts +10 -4
  268. package/src/lib/cn.ts +93 -0
  269. package/src/lib/event-analysis.ts +6 -4
  270. package/src/lib/event-materialization.ts +35 -21
  271. package/src/lib/exact-event-search-id.ts +67 -0
  272. package/src/lib/hydration.ts +210 -30
  273. package/src/lib/trace-builder.ts +43 -19
  274. package/src/lib/trace-types.ts +56 -0
  275. package/src/lib/utils.test.ts +33 -0
  276. package/src/lib/utils.ts +53 -6
  277. package/src/lib/zstd-browser-decoder.ts +42 -0
  278. package/src/styles.css +210 -139
  279. package/dist/components/error-boundary.js.map +0 -1
  280. package/dist/components/event-list-view.js.map +0 -1
  281. package/dist/components/hook-actions.js.map +0 -1
  282. package/dist/components/index.js.map +0 -1
  283. package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +0 -1
  284. package/dist/components/new-trace-viewer/components/copy-button.js +0 -27
  285. package/dist/components/new-trace-viewer/components/copy-button.js.map +0 -1
  286. package/dist/components/new-trace-viewer/components/event-list.d.ts +0 -8
  287. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +0 -1
  288. package/dist/components/new-trace-viewer/components/event-list.js +0 -38
  289. package/dist/components/new-trace-viewer/components/event-list.js.map +0 -1
  290. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +0 -1
  291. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +0 -54
  292. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js.map +0 -1
  293. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +0 -1
  294. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +0 -81
  295. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js.map +0 -1
  296. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +0 -1
  297. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +0 -101
  298. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js.map +0 -1
  299. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +0 -1
  300. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +0 -114
  301. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js.map +0 -1
  302. package/dist/components/new-trace-viewer/components/split-pane.d.ts +0 -14
  303. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +0 -1
  304. package/dist/components/new-trace-viewer/components/split-pane.js +0 -99
  305. package/dist/components/new-trace-viewer/components/split-pane.js.map +0 -1
  306. package/dist/components/new-trace-viewer/components/timeline.d.ts +0 -31
  307. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +0 -1
  308. package/dist/components/new-trace-viewer/components/timeline.js +0 -138
  309. package/dist/components/new-trace-viewer/components/timeline.js.map +0 -1
  310. package/dist/components/new-trace-viewer/context.d.ts +0 -15
  311. package/dist/components/new-trace-viewer/context.d.ts.map +0 -1
  312. package/dist/components/new-trace-viewer/context.js +0 -47
  313. package/dist/components/new-trace-viewer/context.js.map +0 -1
  314. package/dist/components/new-trace-viewer/detail-panel.d.ts +0 -10
  315. package/dist/components/new-trace-viewer/detail-panel.d.ts.map +0 -1
  316. package/dist/components/new-trace-viewer/detail-panel.js +0 -12
  317. package/dist/components/new-trace-viewer/detail-panel.js.map +0 -1
  318. package/dist/components/new-trace-viewer/icons.d.ts.map +0 -1
  319. package/dist/components/new-trace-viewer/icons.js +0 -15
  320. package/dist/components/new-trace-viewer/icons.js.map +0 -1
  321. package/dist/components/new-trace-viewer/trace-viewer.d.ts +0 -8
  322. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +0 -1
  323. package/dist/components/new-trace-viewer/trace-viewer.js +0 -349
  324. package/dist/components/new-trace-viewer/trace-viewer.js.map +0 -1
  325. package/dist/components/new-trace-viewer/types.d.ts +0 -1
  326. package/dist/components/new-trace-viewer/types.d.ts.map +0 -1
  327. package/dist/components/new-trace-viewer/types.js +0 -2
  328. package/dist/components/new-trace-viewer/types.js.map +0 -1
  329. package/dist/components/new-trace-viewer/util/constants.d.ts +0 -1
  330. package/dist/components/new-trace-viewer/util/constants.d.ts.map +0 -1
  331. package/dist/components/new-trace-viewer/util/constants.js +0 -2
  332. package/dist/components/new-trace-viewer/util/constants.js.map +0 -1
  333. package/dist/components/new-trace-viewer/utils.d.ts +0 -42
  334. package/dist/components/new-trace-viewer/utils.d.ts.map +0 -1
  335. package/dist/components/new-trace-viewer/utils.js +0 -305
  336. package/dist/components/new-trace-viewer/utils.js.map +0 -1
  337. package/dist/components/run-trace-view.d.ts +0 -25
  338. package/dist/components/run-trace-view.d.ts.map +0 -1
  339. package/dist/components/run-trace-view.js +0 -11
  340. package/dist/components/run-trace-view.js.map +0 -1
  341. package/dist/components/sidebar/attribute-panel.js.map +0 -1
  342. package/dist/components/sidebar/conversation-view.js.map +0 -1
  343. package/dist/components/sidebar/copyable-data-block.js.map +0 -1
  344. package/dist/components/sidebar/detail-card.d.ts +0 -14
  345. package/dist/components/sidebar/detail-card.d.ts.map +0 -1
  346. package/dist/components/sidebar/detail-card.js +0 -20
  347. package/dist/components/sidebar/detail-card.js.map +0 -1
  348. package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
  349. package/dist/components/sidebar/events-list.js.map +0 -1
  350. package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
  351. package/dist/components/sidebar/sidebar-data-context.js.map +0 -1
  352. package/dist/components/stream-viewer.js.map +0 -1
  353. package/dist/components/trace-viewer/components/map.d.ts +0 -8
  354. package/dist/components/trace-viewer/components/map.d.ts.map +0 -1
  355. package/dist/components/trace-viewer/components/map.js +0 -162
  356. package/dist/components/trace-viewer/components/map.js.map +0 -1
  357. package/dist/components/trace-viewer/components/markers.d.ts +0 -23
  358. package/dist/components/trace-viewer/components/markers.d.ts.map +0 -1
  359. package/dist/components/trace-viewer/components/markers.js +0 -416
  360. package/dist/components/trace-viewer/components/markers.js.map +0 -1
  361. package/dist/components/trace-viewer/components/node.d.ts +0 -35
  362. package/dist/components/trace-viewer/components/node.d.ts.map +0 -1
  363. package/dist/components/trace-viewer/components/node.js +0 -285
  364. package/dist/components/trace-viewer/components/node.js.map +0 -1
  365. package/dist/components/trace-viewer/components/search-input.d.ts +0 -9
  366. package/dist/components/trace-viewer/components/search-input.d.ts.map +0 -1
  367. package/dist/components/trace-viewer/components/search-input.js +0 -9
  368. package/dist/components/trace-viewer/components/search-input.js.map +0 -1
  369. package/dist/components/trace-viewer/components/search.d.ts +0 -3
  370. package/dist/components/trace-viewer/components/search.d.ts.map +0 -1
  371. package/dist/components/trace-viewer/components/search.js +0 -25
  372. package/dist/components/trace-viewer/components/search.js.map +0 -1
  373. package/dist/components/trace-viewer/components/span-content.d.ts +0 -19
  374. package/dist/components/trace-viewer/components/span-content.d.ts.map +0 -1
  375. package/dist/components/trace-viewer/components/span-content.js +0 -137
  376. package/dist/components/trace-viewer/components/span-content.js.map +0 -1
  377. package/dist/components/trace-viewer/components/span-detail-panel.d.ts +0 -10
  378. package/dist/components/trace-viewer/components/span-detail-panel.d.ts.map +0 -1
  379. package/dist/components/trace-viewer/components/span-detail-panel.js +0 -285
  380. package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
  381. package/dist/components/trace-viewer/components/span-segments.d.ts +0 -50
  382. package/dist/components/trace-viewer/components/span-segments.d.ts.map +0 -1
  383. package/dist/components/trace-viewer/components/span-segments.js +0 -445
  384. package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
  385. package/dist/components/trace-viewer/components/span-strategies.d.ts +0 -46
  386. package/dist/components/trace-viewer/components/span-strategies.d.ts.map +0 -1
  387. package/dist/components/trace-viewer/components/span-strategies.js +0 -108
  388. package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
  389. package/dist/components/trace-viewer/components/ui.d.ts +0 -28
  390. package/dist/components/trace-viewer/components/ui.d.ts.map +0 -1
  391. package/dist/components/trace-viewer/components/ui.js +0 -39
  392. package/dist/components/trace-viewer/components/ui.js.map +0 -1
  393. package/dist/components/trace-viewer/components/zoom-button.d.ts +0 -3
  394. package/dist/components/trace-viewer/components/zoom-button.d.ts.map +0 -1
  395. package/dist/components/trace-viewer/components/zoom-button.js +0 -29
  396. package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
  397. package/dist/components/trace-viewer/components/zoom-icons.d.ts +0 -11
  398. package/dist/components/trace-viewer/components/zoom-icons.d.ts.map +0 -1
  399. package/dist/components/trace-viewer/components/zoom-icons.js +0 -11
  400. package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
  401. package/dist/components/trace-viewer/context.js.map +0 -1
  402. package/dist/components/trace-viewer/index.d.ts +0 -5
  403. package/dist/components/trace-viewer/index.d.ts.map +0 -1
  404. package/dist/components/trace-viewer/index.js +0 -4
  405. package/dist/components/trace-viewer/index.js.map +0 -1
  406. package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
  407. package/dist/components/trace-viewer/trace-viewer.module.css +0 -1465
  408. package/dist/components/trace-viewer/types.js.map +0 -1
  409. package/dist/components/trace-viewer/util/constants.d.ts +0 -9
  410. package/dist/components/trace-viewer/util/constants.d.ts.map +0 -1
  411. package/dist/components/trace-viewer/util/constants.js +0 -9
  412. package/dist/components/trace-viewer/util/constants.js.map +0 -1
  413. package/dist/components/trace-viewer/util/scrollbar-width.d.ts +0 -2
  414. package/dist/components/trace-viewer/util/scrollbar-width.d.ts.map +0 -1
  415. package/dist/components/trace-viewer/util/scrollbar-width.js +0 -14
  416. package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
  417. package/dist/components/trace-viewer/util/timing.js.map +0 -1
  418. package/dist/components/trace-viewer/util/tree.d.ts +0 -13
  419. package/dist/components/trace-viewer/util/tree.d.ts.map +0 -1
  420. package/dist/components/trace-viewer/util/tree.js +0 -227
  421. package/dist/components/trace-viewer/util/tree.js.map +0 -1
  422. package/dist/components/trace-viewer/util/use-immediate-style.d.ts +0 -15
  423. package/dist/components/trace-viewer/util/use-immediate-style.d.ts.map +0 -1
  424. package/dist/components/trace-viewer/util/use-immediate-style.js +0 -23
  425. package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
  426. package/dist/components/trace-viewer/util/use-streaming-spans.d.ts +0 -8
  427. package/dist/components/trace-viewer/util/use-streaming-spans.d.ts.map +0 -1
  428. package/dist/components/trace-viewer/util/use-streaming-spans.js +0 -345
  429. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
  430. package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts +0 -6
  431. package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts.map +0 -1
  432. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +0 -39
  433. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  434. package/dist/components/trace-viewer/worker.d.ts +0 -2
  435. package/dist/components/trace-viewer/worker.d.ts.map +0 -1
  436. package/dist/components/trace-viewer/worker.js +0 -109
  437. package/dist/components/trace-viewer/worker.js.map +0 -1
  438. package/dist/components/trace-viewer-new.d.ts.map +0 -1
  439. package/dist/components/trace-viewer-new.js +0 -23
  440. package/dist/components/trace-viewer-new.js.map +0 -1
  441. package/dist/components/ui/alert.js.map +0 -1
  442. package/dist/components/ui/card.js.map +0 -1
  443. package/dist/components/ui/data-inspector.js.map +0 -1
  444. package/dist/components/ui/decrypt-button.js.map +0 -1
  445. package/dist/components/ui/error-card.js.map +0 -1
  446. package/dist/components/ui/error-stack-block.js.map +0 -1
  447. package/dist/components/ui/inspector-theme.d.ts +0 -95
  448. package/dist/components/ui/inspector-theme.d.ts.map +0 -1
  449. package/dist/components/ui/inspector-theme.js +0 -82
  450. package/dist/components/ui/inspector-theme.js.map +0 -1
  451. package/dist/components/ui/load-more-button.js.map +0 -1
  452. package/dist/components/ui/menu-dropdown.js.map +0 -1
  453. package/dist/components/ui/skeleton.js.map +0 -1
  454. package/dist/components/ui/spinner.js.map +0 -1
  455. package/dist/components/ui/timestamp-tooltip.js.map +0 -1
  456. package/dist/components/workflow-trace-view.d.ts +0 -40
  457. package/dist/components/workflow-trace-view.d.ts.map +0 -1
  458. package/dist/components/workflow-trace-view.js +0 -695
  459. package/dist/components/workflow-trace-view.js.map +0 -1
  460. package/dist/components/workflow-traces/event-colors.js.map +0 -1
  461. package/dist/components/workflow-traces/trace-colors.d.ts +0 -15
  462. package/dist/components/workflow-traces/trace-colors.d.ts.map +0 -1
  463. package/dist/components/workflow-traces/trace-colors.js +0 -87
  464. package/dist/components/workflow-traces/trace-colors.js.map +0 -1
  465. package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
  466. package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
  467. package/dist/hooks/use-dark-mode.js.map +0 -1
  468. package/dist/index.js.map +0 -1
  469. package/dist/lib/event-analysis.js.map +0 -1
  470. package/dist/lib/event-materialization.js.map +0 -1
  471. package/dist/lib/hydration.js.map +0 -1
  472. package/dist/lib/stream-display.js.map +0 -1
  473. package/dist/lib/toast.js.map +0 -1
  474. package/dist/lib/trace-builder.js.map +0 -1
  475. package/dist/lib/utils.js.map +0 -1
  476. package/src/components/new-trace-viewer/components/event-list.tsx +0 -116
  477. package/src/components/new-trace-viewer/components/split-pane.tsx +0 -185
  478. package/src/components/new-trace-viewer/components/timeline.tsx +0 -382
  479. package/src/components/new-trace-viewer/context.tsx +0 -92
  480. package/src/components/new-trace-viewer/detail-panel.tsx +0 -58
  481. package/src/components/new-trace-viewer/trace-viewer.tsx +0 -645
  482. package/src/components/new-trace-viewer/types.ts +0 -0
  483. package/src/components/new-trace-viewer/util/constants.ts +0 -0
  484. package/src/components/run-trace-view.tsx +0 -84
  485. package/src/components/sidebar/detail-card.tsx +0 -65
  486. package/src/components/trace-viewer/components/map.tsx +0 -226
  487. package/src/components/trace-viewer/components/markers.tsx +0 -612
  488. package/src/components/trace-viewer/components/node.tsx +0 -505
  489. package/src/components/trace-viewer/components/search-input.tsx +0 -52
  490. package/src/components/trace-viewer/components/search.tsx +0 -47
  491. package/src/components/trace-viewer/components/span-content.tsx +0 -247
  492. package/src/components/trace-viewer/components/span-detail-panel.tsx +0 -655
  493. package/src/components/trace-viewer/components/span-segments.ts +0 -585
  494. package/src/components/trace-viewer/components/span-strategies.ts +0 -205
  495. package/src/components/trace-viewer/components/ui.tsx +0 -156
  496. package/src/components/trace-viewer/components/zoom-button.tsx +0 -61
  497. package/src/components/trace-viewer/components/zoom-icons.tsx +0 -65
  498. package/src/components/trace-viewer/index.tsx +0 -4
  499. package/src/components/trace-viewer/trace-viewer.module.css +0 -1465
  500. package/src/components/trace-viewer/util/constants.ts +0 -8
  501. package/src/components/trace-viewer/util/scrollbar-width.ts +0 -13
  502. package/src/components/trace-viewer/util/tree.ts +0 -277
  503. package/src/components/trace-viewer/util/use-immediate-style.ts +0 -38
  504. package/src/components/trace-viewer/util/use-streaming-spans.ts +0 -426
  505. package/src/components/trace-viewer/util/use-trackpad-zoom.tsx +0 -51
  506. package/src/components/trace-viewer/worker.ts +0 -131
  507. package/src/components/ui/inspector-theme.ts +0 -110
  508. package/src/components/workflow-trace-view.tsx +0 -1171
  509. package/src/components/workflow-traces/trace-colors.ts +0 -112
  510. /package/dist/components/{new-trace-viewer → trace-viewer}/components/copy-button.d.ts +0 -0
  511. /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.d.ts +0 -0
  512. /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.d.ts +0 -0
  513. /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.d.ts +0 -0
  514. /package/dist/components/{new-trace-viewer → trace-viewer}/icons.d.ts +0 -0
  515. /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.ts +0 -0
  516. /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.ts +0 -0
  517. /package/src/{components/trace-viewer/modules.d.ts → modules.d.ts} +0 -0
@@ -1,20 +1,18 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';
4
+ import { isTerminalWorkflowRunStatus, } from '@workflow/world';
3
5
  import clsx from 'clsx';
4
6
  import { Send, Zap } from 'lucide-react';
5
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
7
+ import { useCallback, useEffect, useMemo, useState } from 'react';
6
8
  import { useToast } from '../../lib/toast';
7
9
  import { DecryptClickContext } from '../ui/data-inspector';
8
10
  import { AttributePanel } from './attribute-panel';
9
11
  import { EventsList } from './events-list';
10
12
  import { ResolveHookModal } from './resolve-hook-modal';
11
- // Type guards for runtime validation of span attribute data
12
- function isStep(data) {
13
- return data !== null && typeof data === 'object' && 'stepId' in data;
14
- }
15
- function isWorkflowRun(data) {
16
- return data !== null && typeof data === 'object' && 'runId' in data;
17
- }
13
+ import { useSidebarDataOptional } from './sidebar-data-context';
14
+ import { useSelectedSpanDetail, } from './use-selected-span-detail';
15
+ // Type guard for runtime validation of span attribute data
18
16
  function isHook(data) {
19
17
  return data !== null && typeof data === 'object' && 'hookId' in data;
20
18
  }
@@ -24,7 +22,7 @@ function isHook(data) {
24
22
  * This component is rendered OUTSIDE the trace viewer context — it
25
23
  * receives all data via props rather than reading from context.
26
24
  */
27
- export function EntityDetailPanel({ run, onStreamClick, onRunClick, spanDetailData, spanDetailError, spanDetailLoading, onSpanSelect, onWakeUpSleep, onLoadEventData, onResolveHook, encryptionKey, onDecrypt, isDecrypting = false, selectedSpan, }) {
25
+ export function EntityDetailPanel({ run, onStreamClick, onRunClick, fetchSpanDetail, onWakeUpSleep, onLoadEventData, onResolveHook, encryptionKey, onDecrypt, isDecrypting = false, selectedSpan, showSeparateEventOccurrenceTimestamps = false, getModuleSourceUrl, }) {
28
26
  const toast = useToast();
29
27
  const [stoppingSleep, setStoppingSleep] = useState(false);
30
28
  const [showResolveHookModal, setShowResolveHookModal] = useState(false);
@@ -32,58 +30,19 @@ export function EntityDetailPanel({ run, onStreamClick, onRunClick, spanDetailDa
32
30
  // Track hooks that were resolved in this session so the button hides
33
31
  // immediately without waiting for the next event poll.
34
32
  const [resolvedHookIds, setResolvedHookIds] = useState(new Set());
33
+ const sidebar = useSidebarDataOptional();
34
+ const hasEncryptedData = Boolean(sidebar?.hasEncryptedData && !encryptionKey);
35
35
  const data = selectedSpan?.data;
36
36
  const rawEvents = selectedSpan?.rawEvents;
37
37
  const rawEventsLength = rawEvents?.length ?? 0;
38
- // Determine resource type, ID, and runId from the selected span
39
- const { resource, resourceId, runId } = useMemo(() => {
40
- if (!selectedSpan) {
41
- return { resource: undefined, resourceId: undefined, runId: undefined };
42
- }
43
- const res = selectedSpan.resource;
44
- if (res === 'step' && isStep(data)) {
45
- return { resource: 'step', resourceId: data.stepId, runId: data.runId };
46
- }
47
- if (res === 'run' && isWorkflowRun(data)) {
48
- return { resource: 'run', resourceId: data.runId, runId: undefined };
49
- }
50
- if (res === 'hook' && isHook(data)) {
51
- return { resource: 'hook', resourceId: data.hookId, runId: undefined };
52
- }
53
- if (res === 'sleep') {
54
- const waitData = data;
55
- return {
56
- resource: 'sleep',
57
- resourceId: selectedSpan.spanId,
58
- runId: waitData?.runId,
59
- };
60
- }
61
- return { resource: undefined, resourceId: undefined, runId: undefined };
62
- }, [selectedSpan, data]);
63
- // Notify parent when span selection changes.
64
- // Use a ref for the callback so the effect only fires when the actual
65
- // selection values change, not when the callback identity changes due to
66
- // parent re-renders from polling.
67
- const onSpanSelectRef = useRef(onSpanSelect);
68
- onSpanSelectRef.current = onSpanSelect;
69
- useEffect(() => {
70
- if (resource &&
71
- resourceId &&
72
- ['run', 'step', 'hook', 'sleep'].includes(resource)) {
73
- onSpanSelectRef.current({
74
- resource: resource,
75
- resourceId,
76
- runId,
77
- });
78
- }
79
- }, [resource, resourceId, runId]);
38
+ const { status, resource, resourceId, displayData, detail: matchedSpanDetailData, error, } = useSelectedSpanDetail(selectedSpan, fetchSpanDetail);
39
+ const loading = status === 'loading';
80
40
  // Check if this sleep is still pending and can be woken up
81
41
  const canWakeUp = useMemo(() => {
82
42
  void rawEventsLength;
83
43
  if (resource !== 'sleep' || !rawEvents)
84
44
  return false;
85
- const terminalStates = ['completed', 'failed', 'cancelled'];
86
- if (terminalStates.includes(run.status))
45
+ if (isTerminalWorkflowRunStatus(run.status))
87
46
  return false;
88
47
  const hasWaitCreated = rawEvents.some((e) => e.eventType === 'wait_created');
89
48
  if (!hasWaitCreated)
@@ -99,8 +58,7 @@ export function EntityDetailPanel({ run, onStreamClick, onRunClick, spanDetailDa
99
58
  // Check if we already resolved this hook in this session
100
59
  if (resolvedHookIds.has(resourceId))
101
60
  return false;
102
- const terminalStates = ['completed', 'failed', 'cancelled'];
103
- if (terminalStates.includes(run.status))
61
+ if (isTerminalWorkflowRunStatus(run.status))
104
62
  return false;
105
63
  const hasHookDisposed = rawEvents.some((e) => e.eventType === 'hook_disposed');
106
64
  if (hasHookDisposed)
@@ -114,22 +72,20 @@ export function EntityDetailPanel({ run, onStreamClick, onRunClick, spanDetailDa
114
72
  run.status,
115
73
  resolvedHookIds,
116
74
  ]);
117
- const error = spanDetailError ?? undefined;
118
- const loading = spanDetailLoading ?? false;
119
75
  // Get the hook token for resolving (prefer fetched data, then hooks array fallback)
120
76
  const hookToken = useMemo(() => {
121
77
  if (resource !== 'hook' || !resourceId)
122
78
  return undefined;
123
79
  // 1. Try the externally-fetched detail data first
124
- if (isHook(spanDetailData) && spanDetailData.token) {
125
- return spanDetailData.token;
80
+ if (isHook(matchedSpanDetailData) && matchedSpanDetailData.token) {
81
+ return matchedSpanDetailData.token;
126
82
  }
127
83
  // 2. Try the span's inline data (reconstructed from hook_created event)
128
84
  if (isHook(data) && data.token) {
129
85
  return data.token;
130
86
  }
131
87
  return undefined;
132
- }, [resource, resourceId, spanDetailData, data]);
88
+ }, [resource, resourceId, matchedSpanDetailData, data]);
133
89
  useEffect(() => {
134
90
  if (error && selectedSpan && resource) {
135
91
  toast.error(`Failed to load ${resource} details`, {
@@ -187,7 +143,7 @@ export function EntityDetailPanel({ run, onStreamClick, onRunClick, spanDetailDa
187
143
  }
188
144
  try {
189
145
  setResolvingHook(true);
190
- const candidate = spanDetailData ?? data;
146
+ const candidate = matchedSpanDetailData ?? data;
191
147
  const hook = isHook(candidate) ? candidate : undefined;
192
148
  await onResolveHook(hookToken, payload, hook);
193
149
  toast.success('Hook resolved', {
@@ -208,11 +164,7 @@ export function EntityDetailPanel({ run, onStreamClick, onRunClick, spanDetailDa
208
164
  finally {
209
165
  setResolvingHook(false);
210
166
  }
211
- }, [onResolveHook, hookToken, resolvingHook, spanDetailData, data]);
212
- // Prefer externally-fetched details when available. For sleep spans, the
213
- // host fetches full correlated events (withData=true) and materializes a wait
214
- // entity, so this includes resumeAt/completedAt without bloating trace payloads.
215
- const displayData = (spanDetailData ?? data);
167
+ }, [onResolveHook, hookToken, resolvingHook, matchedSpanDetailData, data]);
216
168
  const moduleSpecifier = useMemo(() => {
217
169
  const displayRecord = displayData;
218
170
  const displayStepName = displayRecord.stepName;
@@ -228,24 +180,38 @@ export function EntityDetailPanel({ run, onStreamClick, onRunClick, spanDetailDa
228
180
  }
229
181
  return undefined;
230
182
  }, [displayData, run.workflowName]);
183
+ const moduleSourceUrl = useMemo(() => {
184
+ if (!getModuleSourceUrl || !moduleSpecifier)
185
+ return undefined;
186
+ const parsed = parseStepName(moduleSpecifier) ?? parseWorkflowName(moduleSpecifier);
187
+ if (!parsed)
188
+ return undefined;
189
+ const dataDeploymentId = displayData.deploymentId;
190
+ return getModuleSourceUrl({
191
+ moduleSpecifier: parsed.moduleSpecifier,
192
+ deploymentId: typeof dataDeploymentId === 'string'
193
+ ? dataDeploymentId
194
+ : run.deploymentId,
195
+ });
196
+ }, [getModuleSourceUrl, moduleSpecifier, displayData, run.deploymentId]);
231
197
  if (!selectedSpan || !resource || !resourceId) {
232
198
  return null;
233
199
  }
234
200
  const hasPendingActions = (resource === 'sleep' && canWakeUp) ||
235
201
  (resource === 'hook' && canResolveHook);
236
- return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx(DecryptClickContext.Provider, { value: onDecrypt ? { onDecrypt, isDecrypting } : undefined, children: _jsxs("div", { className: "flex-1 overflow-y-auto px-3 pt-3 pb-8", children: [hasPendingActions && (_jsxs("div", { className: "mb-4 rounded-lg border p-2", style: {
202
+ return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx(DecryptClickContext.Provider, { value: onDecrypt ? { onDecrypt, isDecrypting, hasEncryptedData } : undefined, children: _jsxs("div", { className: "flex-1 overflow-y-auto px-4 pb-8", children: [hasPendingActions && (_jsxs("div", { className: "mb-4 rounded-lg border p-2", style: {
237
203
  borderColor: 'var(--ds-gray-300)',
238
204
  backgroundColor: 'var(--ds-gray-100)',
239
- }, children: [_jsx("p", { className: "mb-2 px-1 text-[13px] font-medium uppercase tracking-wide", style: { color: 'var(--ds-gray-700)' }, children: "Actions" }), _jsxs("div", { className: "flex flex-col gap-2", children: [resource === 'sleep' && canWakeUp && (_jsxs("button", { type: "button", onClick: handleWakeUp, disabled: stoppingSleep, className: clsx('flex items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium', 'disabled:opacity-50 disabled:cursor-not-allowed transition-colors', stoppingSleep
205
+ }, children: [_jsx("p", { className: "mb-2 px-1 text-label-13 font-medium uppercase tracking-wide", style: { color: 'var(--ds-gray-700)' }, children: "Actions" }), _jsxs("div", { className: "flex flex-col gap-2", children: [resource === 'sleep' && canWakeUp && (_jsxs("button", { type: "button", onClick: handleWakeUp, disabled: stoppingSleep, className: clsx('flex items-center justify-center gap-2 rounded-md px-3 py-2 text-button-14', 'disabled:opacity-50 disabled:cursor-not-allowed transition-colors', stoppingSleep
240
206
  ? 'opacity-50 cursor-not-allowed'
241
207
  : 'cursor-pointer'), style: {
242
208
  background: 'var(--ds-amber-200)',
243
209
  color: 'var(--ds-amber-900)',
244
- }, children: [_jsx(Zap, { className: "h-4 w-4" }), stoppingSleep ? 'Waking up...' : 'Wake Up Sleep'] })), resource === 'hook' && canResolveHook && (_jsxs("button", { type: "button", onClick: () => setShowResolveHookModal(true), disabled: resolvingHook, className: clsx('flex items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium', 'disabled:opacity-50 disabled:cursor-not-allowed transition-colors', resolvingHook
210
+ }, children: [_jsx(Zap, { className: "h-4 w-4" }), stoppingSleep ? 'Waking up...' : 'Wake Up Sleep'] })), resource === 'hook' && canResolveHook && (_jsxs("button", { type: "button", onClick: () => setShowResolveHookModal(true), disabled: resolvingHook, className: clsx('flex items-center justify-center gap-2 rounded-md px-3 py-2 text-button-14', 'disabled:opacity-50 disabled:cursor-not-allowed transition-colors', resolvingHook
245
211
  ? 'opacity-50 cursor-not-allowed'
246
212
  : 'cursor-pointer'), style: {
247
213
  background: 'var(--ds-gray-1000)',
248
214
  color: 'var(--ds-background-100)',
249
- }, children: [_jsx(Send, { className: "h-4 w-4" }), "Resolve Hook"] }))] })] })), _jsxs("div", { className: "space-y-4", children: [_jsx("section", { children: _jsx(AttributePanel, { data: displayData, moduleSpecifier: moduleSpecifier, expiredAt: run.expiredAt, isLoading: loading, error: error ?? undefined, onStreamClick: onStreamClick, onRunClick: onRunClick, onDecrypt: onDecrypt, isDecrypting: isDecrypting, resource: resource }) }), resource !== 'run' && rawEvents && (_jsx("section", { children: _jsx(EventsList, { events: rawEvents, onLoadEventData: onLoadEventData, encryptionKey: encryptionKey }) }))] })] }) }), _jsx(ResolveHookModal, { isOpen: showResolveHookModal, onClose: () => setShowResolveHookModal(false), onSubmit: handleResolveHook, isSubmitting: resolvingHook })] }));
215
+ }, children: [_jsx(Send, { className: "h-4 w-4" }), "Resolve Hook"] }))] })] })), _jsx(AttributePanel, { data: displayData, moduleSpecifier: moduleSpecifier, moduleSourceUrl: moduleSourceUrl, expiredAt: run.expiredAt, isLoading: loading, error: error ?? undefined, onStreamClick: onStreamClick, onRunClick: onRunClick, onDecrypt: onDecrypt, isDecrypting: isDecrypting, resource: resource }), rawEvents && (_jsx(EventsList, { events: rawEvents, onLoadEventData: onLoadEventData, onStreamClick: onStreamClick, onRunClick: onRunClick, encryptionKey: encryptionKey, showSeparateEventOccurrenceTimestamps: showSeparateEventOccurrenceTimestamps }))] }) }), _jsx(ResolveHookModal, { isOpen: showResolveHookModal, onClose: () => setShowResolveHookModal(false), onSubmit: handleResolveHook, isSubmitting: resolvingHook })] }));
250
216
  }
251
- //# sourceMappingURL=entity-detail-panel.js.map
217
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWRldGFpbC1wYW5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGViYXIvZW50aXR5LWRldGFpbC1wYW5lbC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RSxPQUFPLEVBR0wsMkJBQTJCLEdBRTVCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDbEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFFTCxxQkFBcUIsR0FDdEIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQywyREFBMkQ7QUFDM0QsU0FBUyxNQUFNLENBQUMsSUFBYTtJQUMzQixPQUFPLElBQUksS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUM7QUFDdkUsQ0FBQztBQXlCRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxF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LGVBQWUsRUFDaEMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQ3hCLFNBQVMsRUFBRSxPQUFPLEVBQ2xCLEtBQUssRUFBRSxLQUFLLElBQUksU0FBUyxFQUN6QixhQUFhLEVBQUUsYUFBYSxFQUM1QixVQUFVLEVBQUUsVUFBVSxFQUN0QixTQUFTLEVBQUUsU0FBUyxFQUNwQixZQUFZLEVBQUUsWUFBWSxFQUMxQixRQUFRLEVBQUUsUUFBUSxHQUNsQixFQUVELFNBQVMsSUFBSSxDQUNaLEtBQUMsVUFBVSxJQUNULE1BQU0sRUFBRSxTQUFTLEVBQ2pCLGVBQWUsRUFBRSxlQUFlLEVBQ2hDLGFBQWEsRUFBRSxhQUFhLEVBQzVCLFVBQVUsRUFBRSxVQUFVLEVBQ3RCLGFBQWEsRUFBRSxhQUFhLEVBQzVCLHFDQUFxQyxFQUNuQyxxQ0FBcUMsR0FFdkMsQ0FDSCxJQUNHLEdBQ3VCLEVBRy9CLEtBQUMsZ0JBQWdCLElBQ2YsTUFBTSxFQUFFLG9CQUFvQixFQUM1QixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLEVBQzdDLFFBQVEsRUFBRSxpQkFBaUIsRUFDM0IsWUFBWSxFQUFFLGFBQWEsR0FDM0IsSUFDRSxDQUNQLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQgeyBwYXJzZVN0ZXBOYW1lLCBwYXJzZVdvcmtmbG93TmFtZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB7XG4gIHR5cGUgRXZlbnQsXG4gIHR5cGUgSG9vayxcbiAgaXNUZXJtaW5hbFdvcmtmbG93UnVuU3RhdHVzLFxuICB0eXBlIFdvcmtmbG93UnVuLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyBTZW5kLCBaYXAgfSBmcm9tICdsdWNpZGUtcmVhY3QnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VUb2FzdCB9IGZyb20gJy4uLy4uL2xpYi90b2FzdCc7XG5pbXBvcnQgeyBEZWNyeXB0Q2xpY2tDb250ZXh0IH0gZnJvbSAnLi4vdWkvZGF0YS1pbnNwZWN0b3InO1xuaW1wb3J0IHsgQXR0cmlidXRlUGFuZWwgfSBmcm9tICcuL2F0dHJpYnV0ZS1wYW5lbCc7XG5pbXBvcnQgeyBFdmVudHNMaXN0IH0gZnJvbSAnLi9ldmVudHMtbGlzdCc7XG5pbXBvcnQgeyBSZXNvbHZlSG9va01vZGFsIH0gZnJvbSAnLi9yZXNvbHZlLWhvb2stbW9kYWwnO1xuaW1wb3J0IHsgdXNlU2lkZWJhckRhdGFPcHRpb25hbCB9IGZyb20gJy4vc2lkZWJhci1kYXRhLWNvbnRleHQnO1xuaW1wb3J0IHtcbiAgdHlwZSBGZXRjaFNwYW5EZXRhaWwsXG4gIHVzZVNlbGVjdGVkU3BhbkRldGFpbCxcbn0gZnJvbSAnLi91c2Utc2VsZWN0ZWQtc3Bhbi1kZXRhaWwnO1xuXG4vLyBUeXBlIGd1YXJkIGZvciBydW50aW1lIHZhbGlkYXRpb24gb2Ygc3BhbiBhdHRyaWJ1dGUgZGF0YVxuZnVuY3Rpb24gaXNIb29rKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEhvb2sge1xuICByZXR1cm4gZGF0YSAhPT0gbnVsbCAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgJ2hvb2tJZCcgaW4gZGF0YTtcbn1cblxuLyoqXG4gKiBJbmZvIGFib3V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc3BhblxuICovXG5leHBvcnQgdHlwZSBTcGFuU2VsZWN0aW9uSW5mbyA9IHtcbiAgcmVzb3VyY2U6ICdydW4nIHwgJ3N0ZXAnIHwgJ2hvb2snIHwgJ3NsZWVwJztcbiAgcmVzb3VyY2VJZDogc3RyaW5nO1xuICBydW5JZD86IHN0cmluZztcbn07XG5cbi8qKlxuICogSW5mbyBhYm91dCB0aGUgc2VsZWN0ZWQgc3BhbiBmcm9tIHRoZSB0cmFjZSB2aWV3ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0ZWRTcGFuSW5mbyB7XG4gIC8qKiBUaGUgcmF3IGRhdGEgZnJvbSB0aGUgc3BhbiBhdHRyaWJ1dGVzIChzdGVwL3J1bi9ob29rIG9iamVjdCBmcm9tIHRoZSB0cmFjZSkgKi9cbiAgZGF0YT86IHVua25vd247XG4gIC8qKiBUaGUgc3BhbiByZXNvdXJjZSB0eXBlIChmcm9tIHNwYW4gYXR0cmlidXRlcykgKi9cbiAgcmVzb3VyY2U/OiBzdHJpbmc7XG4gIC8qKiBUaGUgc3BhbiBJRCAoY29ycmVsYXRpb25JZCBmb3IgZmlsdGVyaW5nIGV2ZW50cykgKi9cbiAgc3BhbklkPzogc3RyaW5nO1xuICAvKiogUmF3IGNvcnJlbGF0ZWQgZXZlbnRzIGZyb20gdGhlIHN0b3JlIChOT1QgZnJvbSB0aGUgdHJhY2Ugd29ya2VyIHBpcGVsaW5lKSAqL1xuICByYXdFdmVudHM/OiBFdmVudFtdO1xufVxuXG4vKipcbiAqIFBhbmVsIGNvbXBvbmVudCBmb3Igd29ya2Zsb3cgdHJhY2VzIHRoYXQgZGlzcGxheXMgZW50aXR5IGRldGFpbHMuXG4gKlxuICogVGhpcyBjb21wb25lbnQgaXMgcmVuZGVyZWQgT1VUU0lERSB0aGUgdHJhY2Ugdmlld2VyIGNvbnRleHQg4oCUIGl0XG4gKiByZWNlaXZlcyBhbGwgZGF0YSB2aWEgcHJvcHMgcmF0aGVyIHRoYW4gcmVhZGluZyBmcm9tIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnRpdHlEZXRhaWxQYW5lbCh7XG4gIHJ1bixcbiAgb25TdHJlYW1DbGljayxcbiAgb25SdW5DbGljayxcbiAgZmV0Y2hTcGFuRGV0YWlsLFxuICBvbldha2VVcFNsZWVwLFxuICBvbkxvYWRFdmVudERhdGEsXG4gIG9uUmVzb2x2ZUhvb2ssXG4gIGVuY3J5cHRpb25LZXksXG4gIG9uRGVjcnlwdCxcbiAgaXNEZWNyeXB0aW5nID0gZmFsc2UsXG4gIHNlbGVjdGVkU3BhbixcbiAgc2hvd1NlcGFyYXRlRXZlbnRPY2N1cnJlbmNlVGltZXN0YW1wcyA9IGZhbHNlLFxuICBnZXRNb2R1bGVTb3VyY2VVcmwsXG59OiB7XG4gIHJ1bjogV29ya2Zsb3dSdW47XG4gIC8qKiBDYWxsYmFjayB3aGVuIGEgc3RyZWFtIHJlZmVyZW5jZSBpcyBjbGlja2VkICovXG4gIG9uU3RyZWFtQ2xpY2s/OiAoc3RyZWFtSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIHdoZW4gYSBydW4gcmVmZXJlbmNlIGlzIGNsaWNrZWQgKi9cbiAgb25SdW5DbGljaz86IChydW5JZDogc3RyaW5nKSA9PiB2b2lkO1xuICBmZXRjaFNwYW5EZXRhaWw6IEZldGNoU3BhbkRldGFpbDtcbiAgLyoqIENhbGxiYWNrIHRvIHdha2UgdXAgYSBwZW5kaW5nIHNsZWVwIGNhbGwuICovXG4gIG9uV2FrZVVwU2xlZXA/OiAoXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmdcbiAgKSA9PiBQcm9taXNlPHsgc3RvcHBlZENvdW50OiBudW1iZXIgfT47XG4gIC8qKiBDYWxsYmFjayB0byBsb2FkIGV2ZW50IGRhdGEgZm9yIGEgc3BlY2lmaWMgZXZlbnQgKGxhenkgbG9hZGluZykgKi9cbiAgb25Mb2FkRXZlbnREYXRhPzogKGV2ZW50OiBFdmVudCkgPT4gUHJvbWlzZTx1bmtub3duIHwgbnVsbD47XG4gIC8qKiBDYWxsYmFjayB0byByZXNvbHZlIGEgaG9vayB3aXRoIGEgcGF5bG9hZC4gKi9cbiAgb25SZXNvbHZlSG9vaz86IChcbiAgICBob29rVG9rZW46IHN0cmluZyxcbiAgICBwYXlsb2FkOiB1bmtub3duLFxuICAgIGhvb2s/OiBIb29rXG4gICkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIEVuY3J5cHRpb24ga2V5IChhdmFpbGFibGUgYWZ0ZXIgRGVjcnlwdCBpcyBjbGlja2VkKSwgdXNlZCB0byByZS1sb2FkIGV2ZW50IGRhdGEgKi9cbiAgZW5jcnlwdGlvbktleT86IFVpbnQ4QXJyYXk7XG4gIC8qKiBDYWxsYmFjayB0byBpbml0aWF0ZSBkZWNyeXB0aW9uIG9mIGVuY3J5cHRlZCBydW4gZGF0YSAqL1xuICBvbkRlY3J5cHQ/OiAoKSA9PiB2b2lkO1xuICAvKiogV2hldGhlciB0aGUgZW5jcnlwdGlvbiBrZXkgaXMgY3VycmVudGx5IGJlaW5nIGZldGNoZWQgKi9cbiAgaXNEZWNyeXB0aW5nPzogYm9vbGVhbjtcbiAgLyoqIEluZm8gYWJvdXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzcGFuIGZyb20gdGhlIHRyYWNlIHZpZXdlciAqL1xuICBzZWxlY3RlZFNwYW46IFNlbGVjdGVkU3BhbkluZm8gfCBudWxsO1xuICAvKiogU2hvdyBvY2N1cnJlZEF0IHNlcGFyYXRlbHkgaW5zdGVhZCBvZiBmb2xkaW5nIGl0IGludG8gdGhlIENyZWF0ZWQgdGltZXN0YW1wLiAqL1xuICBzaG93U2VwYXJhdGVFdmVudE9jY3VycmVuY2VUaW1lc3RhbXBzPzogYm9vbGVhbjtcbiAgZ2V0TW9kdWxlU291cmNlVXJsPzogKGluZm86IHtcbiAgICBtb2R1bGVTcGVjaWZpZXI6IHN0cmluZztcbiAgICBkZXBsb3ltZW50SWQ6IHN0cmluZztcbiAgfSkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xufSk6IFJlYWN0LkpTWC5FbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IHRvYXN0ID0gdXNlVG9hc3QoKTtcbiAgY29uc3QgW3N0b3BwaW5nU2xlZXAsIHNldFN0b3BwaW5nU2xlZXBdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc2hvd1Jlc29sdmVIb29rTW9kYWwsIHNldFNob3dSZXNvbHZlSG9va01vZGFsXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3Jlc29sdmluZ0hvb2ssIHNldFJlc29sdmluZ0hvb2tdID0gdXNlU3RhdGUoZmFsc2UpO1xuICAvLyBUcmFjayBob29rcyB0aGF0IHdlcmUgcmVzb2x2ZWQgaW4gdGhpcyBzZXNzaW9uIHNvIHRoZSBidXR0b24gaGlkZXNcbiAgLy8gaW1tZWRpYXRlbHkgd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgbmV4dCBldmVudCBwb2xsLlxuICBjb25zdCBbcmVzb2x2ZWRIb29rSWRzLCBzZXRSZXNvbHZlZEhvb2tJZHNdID0gdXNlU3RhdGU8U2V0PHN0cmluZz4+KFxuICAgIG5ldyBTZXQoKVxuICApO1xuXG4gIGNvbnN0IHNpZGViYXIgPSB1c2VTaWRlYmFyRGF0YU9wdGlvbmFsKCk7XG4gIGNvbnN0IGhhc0VuY3J5cHRlZERhdGEgPSBCb29sZWFuKHNpZGViYXI/Lmhhc0VuY3J5cHRlZERhdGEgJiYgIWVuY3J5cHRpb25LZXkpO1xuXG4gIGNvbnN0IGRhdGEgPSBzZWxlY3RlZFNwYW4/LmRhdGE7XG4gIGNvbnN0IHJhd0V2ZW50cyA9IHNlbGVjdGVkU3Bhbj8ucmF3RXZlbnRzO1xuICBjb25zdCByYXdFdmVudHNMZW5ndGggPSByYXdFdmVudHM/Lmxlbmd0aCA/PyAwO1xuXG4gIGNvbnN0IHtcbiAgICBzdGF0dXMsXG4gICAgcmVzb3VyY2UsXG4gICAgcmVzb3VyY2VJZCxcbiAgICBkaXNwbGF5RGF0YSxcbiAgICBkZXRhaWw6IG1hdGNoZWRTcGFuRGV0YWlsRGF0YSxcbiAgICBlcnJvcixcbiAgfSA9IHVzZVNlbGVjdGVkU3BhbkRldGFpbChzZWxlY3RlZFNwYW4sIGZldGNoU3BhbkRldGFpbCk7XG4gIGNvbnN0IGxvYWRpbmcgPSBzdGF0dXMgPT09ICdsb2FkaW5nJztcblxuICAvLyBDaGVjayBpZiB0aGlzIHNsZWVwIGlzIHN0aWxsIHBlbmRpbmcgYW5kIGNhbiBiZSB3b2tlbiB1cFxuICBjb25zdCBjYW5XYWtlVXAgPSB1c2VNZW1vKCgpID0+IHtcbiAgICB2b2lkIHJhd0V2ZW50c0xlbmd0aDtcbiAgICBpZiAocmVzb3VyY2UgIT09ICdzbGVlcCcgfHwgIXJhd0V2ZW50cykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpc1Rlcm1pbmFsV29ya2Zsb3dSdW5TdGF0dXMocnVuLnN0YXR1cykpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBoYXNXYWl0Q3JlYXRlZCA9IHJhd0V2ZW50cy5zb21lKFxuICAgICAgKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJ1xuICAgICk7XG4gICAgaWYgKCFoYXNXYWl0Q3JlYXRlZCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGhhc1dhaXRDb21wbGV0ZWQgPSByYXdFdmVudHMuc29tZShcbiAgICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJ1xuICAgICk7XG4gICAgcmV0dXJuICFoYXNXYWl0Q29tcGxldGVkO1xuICB9LCBbcmVzb3VyY2UsIHJhd0V2ZW50cywgcmF3RXZlbnRzTGVuZ3RoLCBydW4uc3RhdHVzXSk7XG5cbiAgLy8gQ2hlY2sgaWYgdGhpcyBob29rIGNhbiBiZSByZXNvbHZlZFxuICBjb25zdCBjYW5SZXNvbHZlSG9vayA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHZvaWQgcmF3RXZlbnRzTGVuZ3RoO1xuICAgIGlmIChyZXNvdXJjZSAhPT0gJ2hvb2snIHx8ICFyYXdFdmVudHMgfHwgIXJlc291cmNlSWQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgcmVzb2x2ZWQgdGhpcyBob29rIGluIHRoaXMgc2Vzc2lvblxuICAgIGlmIChyZXNvbHZlZEhvb2tJZHMuaGFzKHJlc291cmNlSWQpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoaXNUZXJtaW5hbFdvcmtmbG93UnVuU3RhdHVzKHJ1bi5zdGF0dXMpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgaGFzSG9va0Rpc3Bvc2VkID0gcmF3RXZlbnRzLnNvbWUoXG4gICAgICAoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJ1xuICAgICk7XG4gICAgaWYgKGhhc0hvb2tEaXNwb3NlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9LCBbXG4gICAgcmVzb3VyY2UsXG4gICAgcmVzb3VyY2VJZCxcbiAgICByYXdFdmVudHMsXG4gICAgcmF3RXZlbnRzTGVuZ3RoLFxuICAgIHJ1bi5zdGF0dXMsXG4gICAgcmVzb2x2ZWRIb29rSWRzLFxuICBdKTtcblxuICAvLyBHZXQgdGhlIGhvb2sgdG9rZW4gZm9yIHJlc29sdmluZyAocHJlZmVyIGZldGNoZWQgZGF0YSwgdGhlbiBob29rcyBhcnJheSBmYWxsYmFjaylcbiAgY29uc3QgaG9va1Rva2VuID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKHJlc291cmNlICE9PSAnaG9vaycgfHwgIXJlc291cmNlSWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgLy8gMS4gVHJ5IHRoZSBleHRlcm5hbGx5LWZldGNoZWQgZGV0YWlsIGRhdGEgZmlyc3RcbiAgICBpZiAoaXNIb29rKG1hdGNoZWRTcGFuRGV0YWlsRGF0YSkgJiYgbWF0Y2hlZFNwYW5EZXRhaWxEYXRhLnRva2VuKSB7XG4gICAgICByZXR1cm4gbWF0Y2hlZFNwYW5EZXRhaWxEYXRhLnRva2VuO1xuICAgIH1cbiAgICAvLyAyLiBUcnkgdGhlIHNwYW4ncyBpbmxpbmUgZGF0YSAocmVjb25zdHJ1Y3RlZCBmcm9tIGhvb2tfY3JlYXRlZCBldmVudClcbiAgICBpZiAoaXNIb29rKGRhdGEpICYmIChkYXRhIGFzIEhvb2spLnRva2VuKSB7XG4gICAgICByZXR1cm4gKGRhdGEgYXMgSG9vaykudG9rZW47XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0sIFtyZXNvdXJjZSwgcmVzb3VyY2VJZCwgbWF0Y2hlZFNwYW5EZXRhaWxEYXRhLCBkYXRhXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZXJyb3IgJiYgc2VsZWN0ZWRTcGFuICYmIHJlc291cmNlKSB7XG4gICAgICB0b2FzdC5lcnJvcihgRmFpbGVkIHRvIGxvYWQgJHtyZXNvdXJjZX0gZGV0YWlsc2AsIHtcbiAgICAgICAgZGVzY3JpcHRpb246IGVycm9yLm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtlcnJvciwgcmVzb3VyY2UsIHNlbGVjdGVkU3Bhbl0pO1xuXG4gIGNvbnN0IGhhbmRsZVdha2VVcCA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoc3RvcHBpbmdTbGVlcCB8fCAhcmVzb3VyY2VJZCkgcmV0dXJuO1xuICAgIGlmICghb25XYWtlVXBTbGVlcCkge1xuICAgICAgdG9hc3QuZXJyb3IoJ1VuYWJsZSB0byB3YWtlIHVwIHNsZWVwJywge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ05vIHdha2UtdXAgaGFuZGxlciBwcm92aWRlZC4nLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHNldFN0b3BwaW5nU2xlZXAodHJ1ZSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvbldha2VVcFNsZWVwKHJ1bi5ydW5JZCwgcmVzb3VyY2VJZCk7XG4gICAgICBpZiAocmVzdWx0LnN0b3BwZWRDb3VudCA+IDApIHtcbiAgICAgICAgdG9hc3Quc3VjY2VzcygnUnVuIHdva2VuIHVwJywge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ1RoZSBzbGVlcCBjYWxsIGhhcyBiZWVuIGludGVycnVwdGVkIGFuZCB0aGUgcnVuIHdva2VuIHVwLicsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG9hc3QuaW5mbygnU2xlZXAgYWxyZWFkeSBjb21wbGV0ZWQnLCB7XG4gICAgICAgICAgZGVzY3JpcHRpb246ICdUaGlzIHNsZWVwIGNhbGwgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gd2FrZSB1cCBydW46JywgZXJyKTtcbiAgICAgIHRvYXN0LmVycm9yKCdGYWlsZWQgdG8gd2FrZSB1cCBydW4nLCB7XG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZCcsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0U3RvcHBpbmdTbGVlcChmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVJlc29sdmVIb29rID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHBheWxvYWQ6IHVua25vd24pID0+IHtcbiAgICAgIGlmIChyZXNvbHZpbmdIb29rKSByZXR1cm47XG4gICAgICBpZiAoIW9uUmVzb2x2ZUhvb2spIHtcbiAgICAgICAgdG9hc3QuZXJyb3IoJ1VuYWJsZSB0byByZXNvbHZlIGhvb2snLCB7XG4gICAgICAgICAgZGVzY3JpcHRpb246ICdObyByZXNvbHZlIGhhbmRsZXIgcHJvdmlkZWQuJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghaG9va1Rva2VuKSB7XG4gICAgICAgIHRvYXN0LmVycm9yKCdVbmFibGUgdG8gcmVzb2x2ZSBob29rJywge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ01pc3NpbmcgaG9vayB0b2tlbi4gVHJ5IHJlZnJlc2hpbmcgdGhlIHJ1biBkYXRhIGFuZCByZXRyeS4nLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRSZXNvbHZpbmdIb29rKHRydWUpO1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBtYXRjaGVkU3BhbkRldGFpbERhdGEgPz8gZGF0YTtcbiAgICAgICAgY29uc3QgaG9vayA9IGlzSG9vayhjYW5kaWRhdGUpID8gY2FuZGlkYXRlIDogdW5kZWZpbmVkO1xuICAgICAgICBhd2FpdCBvblJlc29sdmVIb29rKGhvb2tUb2tlbiwgcGF5bG9hZCwgaG9vayk7XG4gICAgICAgIHRvYXN0LnN1Y2Nlc3MoJ0hvb2sgcmVzb2x2ZWQnLCB7XG4gICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgcGF5bG9hZCBoYXMgYmVlbiBzZW50IGFuZCB0aGUgaG9vayByZXNvbHZlZC4nLFxuICAgICAgICB9KTtcbiAgICAgICAgc2V0U2hvd1Jlc29sdmVIb29rTW9kYWwoZmFsc2UpO1xuICAgICAgICAvLyBNYXJrIHRoaXMgaG9vayBhcyByZXNvbHZlZCBsb2NhbGx5IHNvIHRoZSBidXR0b24gaGlkZXMgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKHJlc291cmNlSWQpIHtcbiAgICAgICAgICBzZXRSZXNvbHZlZEhvb2tJZHMoKHByZXYpID0+IG5ldyBTZXQocHJldikuYWRkKHJlc291cmNlSWQpKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byByZXNvbHZlIGhvb2s6JywgZXJyKTtcbiAgICAgICAgdG9hc3QuZXJyb3IoJ0ZhaWxlZCB0byByZXNvbHZlIGhvb2snLCB7XG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0FuIHVua25vd24gZXJyb3Igb2NjdXJyZWQnLFxuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldFJlc29sdmluZ0hvb2soZmFsc2UpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW29uUmVzb2x2ZUhvb2ssIGhvb2tUb2tlbiwgcmVzb2x2aW5nSG9vaywgbWF0Y2hlZFNwYW5EZXRhaWxEYXRhLCBkYXRhXVxuICApO1xuXG4gIGNvbnN0IG1vZHVsZVNwZWNpZmllciA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGRpc3BsYXlSZWNvcmQgPSBkaXNwbGF5RGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBkaXNwbGF5U3RlcE5hbWUgPSBkaXNwbGF5UmVjb3JkLnN0ZXBOYW1lO1xuICAgIGNvbnN0IGRpc3BsYXlXb3JrZmxvd05hbWUgPSBkaXNwbGF5UmVjb3JkLndvcmtmbG93TmFtZTtcbiAgICBpZiAodHlwZW9mIGRpc3BsYXlTdGVwTmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkaXNwbGF5U3RlcE5hbWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlzcGxheVdvcmtmbG93TmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkaXNwbGF5V29ya2Zsb3dOYW1lO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJ1bi53b3JrZmxvd05hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcnVuLndvcmtmbG93TmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSwgW2Rpc3BsYXlEYXRhLCBydW4ud29ya2Zsb3dOYW1lXSk7XG5cbiAgY29uc3QgbW9kdWxlU291cmNlVXJsID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFnZXRNb2R1bGVTb3VyY2VVcmwgfHwgIW1vZHVsZVNwZWNpZmllcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBwYXJzZWQgPVxuICAgICAgcGFyc2VTdGVwTmFtZShtb2R1bGVTcGVjaWZpZXIpID8/IHBhcnNlV29ya2Zsb3dOYW1lKG1vZHVsZVNwZWNpZmllcik7XG4gICAgaWYgKCFwYXJzZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGF0YURlcGxveW1lbnRJZCA9IGRpc3BsYXlEYXRhLmRlcGxveW1lbnRJZDtcbiAgICByZXR1cm4gZ2V0TW9kdWxlU291cmNlVXJsKHtcbiAgICAgIG1vZHVsZVNwZWNpZmllcjogcGFyc2VkLm1vZHVsZVNwZWNpZmllcixcbiAgICAgIGRlcGxveW1lbnRJZDpcbiAgICAgICAgdHlwZW9mIGRhdGFEZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyBkYXRhRGVwbG95bWVudElkXG4gICAgICAgICAgOiBydW4uZGVwbG95bWVudElkLFxuICAgIH0pO1xuICB9LCBbZ2V0TW9kdWxlU291cmNlVXJsLCBtb2R1bGVTcGVjaWZpZXIsIGRpc3BsYXlEYXRhLCBydW4uZGVwbG95bWVudElkXSk7XG5cbiAgaWYgKCFzZWxlY3RlZFNwYW4gfHwgIXJlc291cmNlIHx8ICFyZXNvdXJjZUlkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBoYXNQZW5kaW5nQWN0aW9ucyA9XG4gICAgKHJlc291cmNlID09PSAnc2xlZXAnICYmIGNhbldha2VVcCkgfHxcbiAgICAocmVzb3VyY2UgPT09ICdob29rJyAmJiBjYW5SZXNvbHZlSG9vayk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaC1mdWxsIGZsZXgtY29sXCI+XG4gICAgICA8RGVjcnlwdENsaWNrQ29udGV4dC5Qcm92aWRlclxuICAgICAgICB2YWx1ZT17XG4gICAgICAgICAgb25EZWNyeXB0ID8geyBvbkRlY3J5cHQsIGlzRGVjcnlwdGluZywgaGFzRW5jcnlwdGVkRGF0YSB9IDogdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgb3ZlcmZsb3cteS1hdXRvIHB4LTQgcGItOFwiPlxuICAgICAgICAgIHtoYXNQZW5kaW5nQWN0aW9ucyAmJiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1iLTQgcm91bmRlZC1sZyBib3JkZXIgcC0yXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogJ3ZhcigtLWRzLWdyYXktMzAwKScsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDApJyxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtYi0yIHB4LTEgdGV4dC1sYWJlbC0xMyBmb250LW1lZGl1bSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTcwMCknIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBBY3Rpb25zXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgey8qIFdha2UgdXAgYnV0dG9uIGZvciBwZW5kaW5nIHNsZWVwIGNhbGxzICovfVxuICAgICAgICAgICAgICAgIHtyZXNvdXJjZSA9PT0gJ3NsZWVwJyAmJiBjYW5XYWtlVXAgJiYgKFxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlV2FrZVVwfVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17c3RvcHBpbmdTbGVlcH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICAgICAgICAgICAgICdmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMiByb3VuZGVkLW1kIHB4LTMgcHktMiB0ZXh0LWJ1dHRvbi0xNCcsXG4gICAgICAgICAgICAgICAgICAgICAgJ2Rpc2FibGVkOm9wYWNpdHktNTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAgICAgICAgICAgICAgICAgICBzdG9wcGluZ1NsZWVwXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdvcGFjaXR5LTUwIGN1cnNvci1ub3QtYWxsb3dlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2N1cnNvci1wb2ludGVyJ1xuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd2YXIoLS1kcy1hbWJlci0yMDApJyxcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWRzLWFtYmVyLTkwMCknLFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8WmFwIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICB7c3RvcHBpbmdTbGVlcCA/ICdXYWtpbmcgdXAuLi4nIDogJ1dha2UgVXAgU2xlZXAnfVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICAgIHsvKiBSZXNvbHZlIGhvb2sgYnV0dG9uIGZvciBwZW5kaW5nIGhvb2tzICovfVxuICAgICAgICAgICAgICAgIHtyZXNvdXJjZSA9PT0gJ2hvb2snICYmIGNhblJlc29sdmVIb29rICYmIChcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFNob3dSZXNvbHZlSG9va01vZGFsKHRydWUpfVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17cmVzb2x2aW5nSG9va31cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICAgICAgICAgICAgICdmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMiByb3VuZGVkLW1kIHB4LTMgcHktMiB0ZXh0LWJ1dHRvbi0xNCcsXG4gICAgICAgICAgICAgICAgICAgICAgJ2Rpc2FibGVkOm9wYWNpdHktNTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAgICAgICAgICAgICAgICAgICByZXNvbHZpbmdIb29rXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdvcGFjaXR5LTUwIGN1cnNvci1ub3QtYWxsb3dlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2N1cnNvci1wb2ludGVyJ1xuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd2YXIoLS1kcy1ncmF5LTEwMDApJyxcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWRzLWJhY2tncm91bmQtMTAwKScsXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxTZW5kIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICBSZXNvbHZlIEhvb2tcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIDxBdHRyaWJ1dGVQYW5lbFxuICAgICAgICAgICAgZGF0YT17ZGlzcGxheURhdGF9XG4gICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXI9e21vZHVsZVNwZWNpZmllcn1cbiAgICAgICAgICAgIG1vZHVsZVNvdXJjZVVybD17bW9kdWxlU291cmNlVXJsfVxuICAgICAgICAgICAgZXhwaXJlZEF0PXtydW4uZXhwaXJlZEF0fVxuICAgICAgICAgICAgaXNMb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgICAgICAgZXJyb3I9e2Vycm9yID8/IHVuZGVmaW5lZH1cbiAgICAgICAgICAgIG9uU3RyZWFtQ2xpY2s9e29uU3RyZWFtQ2xpY2t9XG4gICAgICAgICAgICBvblJ1bkNsaWNrPXtvblJ1bkNsaWNrfVxuICAgICAgICAgICAgb25EZWNyeXB0PXtvbkRlY3J5cHR9XG4gICAgICAgICAgICBpc0RlY3J5cHRpbmc9e2lzRGVjcnlwdGluZ31cbiAgICAgICAgICAgIHJlc291cmNlPXtyZXNvdXJjZX1cbiAgICAgICAgICAvPlxuXG4gICAgICAgICAge3Jhd0V2ZW50cyAmJiAoXG4gICAgICAgICAgICA8RXZlbnRzTGlzdFxuICAgICAgICAgICAgICBldmVudHM9e3Jhd0V2ZW50c31cbiAgICAgICAgICAgICAgb25Mb2FkRXZlbnREYXRhPXtvbkxvYWRFdmVudERhdGF9XG4gICAgICAgICAgICAgIG9uU3RyZWFtQ2xpY2s9e29uU3RyZWFtQ2xpY2t9XG4gICAgICAgICAgICAgIG9uUnVuQ2xpY2s9e29uUnVuQ2xpY2t9XG4gICAgICAgICAgICAgIGVuY3J5cHRpb25LZXk9e2VuY3J5cHRpb25LZXl9XG4gICAgICAgICAgICAgIHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHM9e1xuICAgICAgICAgICAgICAgIHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvRGVjcnlwdENsaWNrQ29udGV4dC5Qcm92aWRlcj5cblxuICAgICAgey8qIFJlc29sdmUgSG9vayBNb2RhbCAqL31cbiAgICAgIDxSZXNvbHZlSG9va01vZGFsXG4gICAgICAgIGlzT3Blbj17c2hvd1Jlc29sdmVIb29rTW9kYWx9XG4gICAgICAgIG9uQ2xvc2U9eygpID0+IHNldFNob3dSZXNvbHZlSG9va01vZGFsKGZhbHNlKX1cbiAgICAgICAgb25TdWJtaXQ9e2hhbmRsZVJlc29sdmVIb29rfVxuICAgICAgICBpc1N1Ym1pdHRpbmc9e3Jlc29sdmluZ0hvb2t9XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuIl19
@@ -1,10 +1,14 @@
1
1
  import { type Event } from '@workflow/world';
2
- export declare function EventsList({ events, isLoading, error, onLoadEventData, encryptionKey, }: {
2
+ export declare function EventsList({ events, isLoading, error, onLoadEventData, onStreamClick, onRunClick, encryptionKey, showSeparateEventOccurrenceTimestamps, }: {
3
3
  events: Event[];
4
4
  isLoading?: boolean;
5
5
  error?: Error | null;
6
- onLoadEventData?: (correlationId: string, eventId: string) => Promise<unknown | null>;
6
+ onLoadEventData?: (event: Event) => Promise<unknown | null>;
7
+ onStreamClick?: (streamId: string) => void;
8
+ onRunClick?: (runId: string) => void;
7
9
  /** When provided, signals that decryption is active (triggers re-load of expanded events) */
8
10
  encryptionKey?: Uint8Array;
11
+ /** Show occurredAt separately instead of folding it into the Created timestamp. */
12
+ showSeparateEventOccurrenceTimestamps?: boolean;
9
13
  }): import("react/jsx-runtime").JSX.Element;
10
14
  //# sourceMappingURL=events-list.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"events-list.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/events-list.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAC;AA4RpE,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,SAAiB,EACjB,KAAK,EACL,eAAe,EACf,aAAa,GACd,EAAE;IACD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,CAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,6FAA6F;IAC7F,aAAa,CAAC,EAAE,UAAU,CAAC;CAC5B,2CA2CA"}
1
+ {"version":3,"file":"events-list.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/events-list.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,KAAK,EAAyB,MAAM,iBAAiB,CAAC;AA6RpE,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,SAAiB,EACjB,KAAK,EACL,eAAe,EACf,aAAa,EACb,UAAU,EACV,aAAa,EACb,qCAA6C,GAC9C,EAAE;IACD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC5D,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,6FAA6F;IAC7F,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,mFAAmF;IACnF,qCAAqC,CAAC,EAAE,OAAO,CAAC;CACjD,2CAwDA"}
@@ -1,38 +1,36 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { EVENT_DATA_REF_FIELDS } from '@workflow/world';
4
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
5
- import { isExpiredMarker } from '../../lib/hydration';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { getEventDataRefFields } from '@workflow/world';
4
+ import { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';
5
+ import { hasEncryptedFields, isExpiredMarker } from '../../lib/hydration';
6
+ import { Collapsible, CollapsibleContent, CollapsibleRoot, CollapsibleTrigger, } from '../ui/collapsible';
7
+ import { RunClickContext, StreamClickContext } from '../ui/data-inspector';
6
8
  import { ErrorCard } from '../ui/error-card';
7
- import { ErrorStackBlock, isStructuredErrorWithStack, } from '../ui/error-stack-block';
9
+ import { ErrorStackBlock, isStructuredError } from '../ui/error-stack-block';
8
10
  import { Skeleton } from '../ui/skeleton';
9
- import { localMillisecondTime } from './attribute-panel';
10
- import { CopyableDataBlock } from './copyable-data-block';
11
- import { DetailCard } from './detail-card';
12
- /**
13
- * Event types whose eventData contains an error field with a StructuredError.
14
- */
15
- const ERROR_EVENT_TYPES = new Set(['step_failed', 'step_retrying']);
16
- /**
17
- * Event types that carry user-serialized data in their eventData field.
18
- */
19
- const DATA_EVENT_TYPES = new Set([
20
- 'step_created',
21
- 'step_completed',
22
- 'step_failed',
23
- 'step_retrying',
24
- 'hook_created',
25
- 'hook_received',
26
- 'run_created',
27
- 'run_completed',
28
- 'run_failed',
29
- 'wait_created',
30
- 'wait_completed',
31
- ]);
11
+ import { TimestampTooltip } from '../ui/timestamp-tooltip';
12
+ import { AttrSetEventBlock } from './attributes-block';
13
+ import { CopyableDataBlock, EncryptedDataBlock } from './copyable-data-block';
14
+ const parseDateValue = (value) => {
15
+ if (value == null)
16
+ return null;
17
+ const date = value instanceof Date ? value : new Date(String(value));
18
+ return Number.isNaN(date.getTime()) ? null : date;
19
+ };
20
+ const getEffectiveEventDate = (event) => parseDateValue(event.occurredAt) ?? new Date(event.createdAt);
21
+ const formatEventTimestamp = (date) => date.toLocaleString(undefined, {
22
+ month: 'short',
23
+ day: 'numeric',
24
+ hour: 'numeric',
25
+ minute: 'numeric',
26
+ second: 'numeric',
27
+ fractionalSecondDigits: 3,
28
+ timeZoneName: 'short',
29
+ });
32
30
  /**
33
31
  * A single event row that can lazy-load its eventData when expanded.
34
32
  */
35
- function EventItem({ event, onLoadEventData, encryptionKey, }) {
33
+ function EventItem({ event, onLoadEventData, encryptionKey, showSeparateEventOccurrenceTimestamps = false, }) {
36
34
  const [loadedData, setLoadedData] = useState(null);
37
35
  const [isLoading, setIsLoading] = useState(false);
38
36
  const [loadError, setLoadError] = useState(null);
@@ -42,17 +40,17 @@ function EventItem({ event, onLoadEventData, encryptionKey, }) {
42
40
  // Check if the event already has eventData from the store
43
41
  const existingData = 'eventData' in event && event.eventData != null ? event.eventData : null;
44
42
  const mergedDisplay = loadedData ?? existingData;
45
- const canHaveData = DATA_EVENT_TYPES.has(event.eventType);
46
- const loadEventData = useCallback(async (options) => {
47
- if (!onLoadEventData || !event.correlationId || !event.eventId)
43
+ const canHaveData = existingData !== null || getEventDataRefFields(event.eventType).length > 0;
44
+ const loadEventData = useCallback(async (force) => {
45
+ if (!onLoadEventData)
48
46
  return;
49
- if (!options?.force && loadedDataRef.current !== null) {
47
+ if (!force && loadedDataRef.current !== null) {
50
48
  return;
51
49
  }
52
50
  try {
53
51
  setIsLoading(true);
54
52
  setLoadError(null);
55
- const data = await onLoadEventData(event.correlationId, event.eventId);
53
+ const data = await onLoadEventData(event);
56
54
  loadedDataRef.current = data;
57
55
  setLoadedData(data);
58
56
  }
@@ -62,39 +60,43 @@ function EventItem({ event, onLoadEventData, encryptionKey, }) {
62
60
  finally {
63
61
  setIsLoading(false);
64
62
  }
65
- }, [onLoadEventData, event.correlationId, event.eventId]);
66
- const handleExpand = useCallback(async () => {
63
+ }, [onLoadEventData, event]);
64
+ const handleExpand = useCallback(() => {
67
65
  if (isLoading)
68
66
  return;
69
67
  wasExpandedRef.current = true;
70
- await loadEventData();
68
+ void loadEventData(false);
71
69
  }, [isLoading, loadEventData]);
72
70
  // When the encryption key changes and this event was previously expanded,
73
71
  // re-load the data so it gets decrypted
74
- useEffect(() => {
72
+ useLayoutEffect(() => {
75
73
  if (!encryptionKey || !wasExpandedRef.current)
76
74
  return;
77
75
  loadedDataRef.current = null;
78
76
  setLoadedData(null);
79
- void loadEventData({ force: true });
77
+ void loadEventData(true);
80
78
  }, [encryptionKey, loadEventData]);
81
79
  const createdAt = new Date(event.createdAt);
80
+ const occurredAt = parseDateValue(event.occurredAt);
81
+ const displayedCreatedAt = showSeparateEventOccurrenceTimestamps
82
+ ? createdAt
83
+ : getEffectiveEventDate(event);
84
+ const displayedCreatedAtTime = displayedCreatedAt.toLocaleTimeString(undefined, {
85
+ hour: 'numeric',
86
+ minute: 'numeric',
87
+ second: 'numeric',
88
+ });
82
89
  const displayPayload = isLoading ? loadedData : mergedDisplay;
83
- return (_jsxs(DetailCard, { summaryClassName: "text-base py-2", summary: _jsxs(_Fragment, { children: [_jsx("span", { className: "font-medium", style: { color: 'var(--ds-gray-1000)' }, children: event.eventType }), ' ', "-", ' ', _jsx("span", { style: { color: 'var(--ds-gray-700)' }, children: localMillisecondTime(createdAt.getTime()) })] }), onToggle: canHaveData
90
+ return (_jsxs(CollapsibleRoot, { variant: "card", onOpenChange: canHaveData
84
91
  ? (open) => {
85
92
  if (open)
86
93
  handleExpand();
87
94
  }
88
- : undefined, children: [_jsxs("div", { className: "flex flex-col divide-y rounded-md border overflow-hidden", style: {
89
- borderColor: 'var(--ds-gray-300)',
90
- backgroundColor: 'var(--ds-gray-100)',
91
- }, children: [_jsxs("div", { className: "flex min-h-[32px] items-center justify-between gap-4 px-2.5 py-1.5", style: { borderColor: 'var(--ds-gray-300)' }, children: [_jsx("span", { className: "text-[13px] font-medium", style: { color: 'var(--ds-gray-700)' }, children: "Event ID" }), _jsx("span", { className: "max-w-[70%] truncate text-right text-[13px] font-mono", style: { color: 'var(--ds-gray-1000)' }, title: event.eventId, children: event.eventId })] }), event.correlationId && (_jsxs("div", { className: "flex min-h-[32px] items-center justify-between gap-4 px-2.5 py-1.5", style: { borderColor: 'var(--ds-gray-300)' }, children: [_jsx("span", { className: "text-[13px] font-medium", style: { color: 'var(--ds-gray-700)' }, children: "Correlation ID" }), _jsx("span", { className: "max-w-[70%] truncate text-right text-[13px] font-mono", style: { color: 'var(--ds-gray-1000)' }, title: event.correlationId, children: event.correlationId })] }))] }), isLoading && (_jsxs("div", { className: "mt-2 rounded-md border p-3", style: {
92
- borderColor: 'var(--ds-gray-300)',
93
- }, children: [_jsx(Skeleton, { className: "h-4 w-[35%]" }), _jsx(Skeleton, { className: "mt-2 h-4 w-[90%]" }), _jsx(Skeleton, { className: "mt-2 h-4 w-[75%]" })] })), loadError && (_jsx(ErrorCard, { title: "Failed to load event data", details: loadError, className: "mt-2" })), displayPayload != null && (_jsx("div", { className: "mt-2", children: _jsx(EventDataBlock, { eventType: event.eventType, data: displayPayload }) }))] }));
95
+ : undefined, children: [_jsx(CollapsibleTrigger, { className: "px-3 py-2", children: _jsxs("div", { className: "flex w-full items-center justify-between gap-3", children: [_jsx("span", { className: "text-gray-1000 text-label-12 font-mono", children: event.eventType }), _jsx("span", { className: "shrink-0 text-label-13 text-gray-900", children: displayedCreatedAtTime })] }) }), _jsxs(CollapsibleContent, { children: [_jsxs("div", { className: "flex flex-col bg-background-200 [&:has(+_*)]:border-b [&:has(+_*)]:border-gray-alpha-400", children: [showSeparateEventOccurrenceTimestamps && occurredAt && (_jsxs("div", { className: "flex items-center justify-between gap-2 py-2 px-3", children: [_jsx("span", { className: "text-label-12 text-gray-900", children: "Occurred" }), _jsx(TimestampTooltip, { date: occurredAt, children: _jsx("span", { className: "max-w-[70%] truncate text-right text-label-12 font-mono", children: formatEventTimestamp(occurredAt) }) })] })), _jsxs("div", { className: "flex items-center justify-between gap-2 py-2 px-3", children: [_jsx("span", { className: "text-label-12 text-gray-900", children: "Event ID" }), _jsx("span", { className: "max-w-[70%] truncate text-right text-label-12 font-mono", children: event.eventId })] }), event.correlationId && (_jsxs("div", { className: "flex items-center justify-between gap-2 py-2 px-3", children: [_jsx("span", { className: "text-label-12 text-gray-900", children: "Correlation ID" }), _jsx("span", { className: "max-w-[70%] truncate text-right text-label-12 font-mono", children: event.correlationId })] }))] }), isLoading && (_jsxs("div", { className: "p-3", children: [_jsx(Skeleton, { className: "h-4 w-[35%]" }), _jsx(Skeleton, { className: "mt-2 h-4 w-[90%]" }), _jsx(Skeleton, { className: "mt-2 h-4 w-[75%]" })] })), loadError && (_jsx(ErrorCard, { title: "Failed to load event data", details: loadError, className: "mt-2" })), displayPayload != null && (_jsx("div", { className: "[&>div]:border-none [&>div]:rounded-none", children: _jsx(EventDataBlock, { eventType: event.eventType, data: displayPayload }) }))] })] }));
94
96
  }
95
97
  /**
96
98
  * Check if an eventData object has only expired marker values in ref/payload
97
- * fields for this event type (see {@link EVENT_DATA_REF_FIELDS}). Other keys
99
+ * fields for this event type (see {@link getEventDataRefFields}). Other keys
98
100
  * (e.g. `resumeAt`, `stepName`) are ignored.
99
101
  */
100
102
  function hasOnlyExpiredFields(data, eventType) {
@@ -102,39 +104,46 @@ function hasOnlyExpiredFields(data, eventType) {
102
104
  return false;
103
105
  }
104
106
  const record = data;
105
- const refKeys = EVENT_DATA_REF_FIELDS[eventType] ?? [];
107
+ const refKeys = getEventDataRefFields(eventType);
106
108
  const presentKeys = refKeys.filter((k) => k in record);
107
109
  return (presentKeys.length > 0 &&
108
110
  presentKeys.every((k) => isExpiredMarker(record[k])));
109
111
  }
110
112
  /**
111
- * Renders event data, using ErrorStackBlock for error events that contain
112
- * a structured error with a stack trace, and CopyableDataBlock otherwise.
113
+ * Renders event data, using ErrorStackBlock for error events that contain a
114
+ * structured error, and CopyableDataBlock otherwise.
113
115
  */
114
116
  function EventDataBlock({ eventType, data, }) {
115
117
  // Expired data — show a simple message instead of the raw stub.
116
118
  // Check both the top-level eventData and nested sub-fields (result, input, etc.)
117
119
  // since the server stubs each ref field independently.
118
120
  if (isExpiredMarker(data) || hasOnlyExpiredFields(data, eventType)) {
119
- return (_jsx("div", { className: "flex items-center gap-1.5 rounded-md border px-3 py-2 text-xs", style: {
121
+ return (_jsx("div", { className: "flex items-center gap-1.5 rounded-md border px-3 py-2 text-label-12", style: {
120
122
  borderColor: 'var(--ds-gray-300)',
121
123
  backgroundColor: 'var(--ds-gray-100)',
122
124
  color: 'var(--ds-gray-700)',
123
125
  }, children: _jsx("span", { className: "font-medium", children: "Data expired" }) }));
124
126
  }
125
- // For error events (step_failed, step_retrying), the eventData has the shape
126
- // { error: StructuredError, stack?: string, ... }. Check both the top-level
127
- // value and the nested `error` field for a stack trace.
128
- if (ERROR_EVENT_TYPES.has(eventType) &&
127
+ if (hasEncryptedFields({ eventType, eventData: data })) {
128
+ return _jsx(EncryptedDataBlock, {});
129
+ }
130
+ // Attribute changes — render the changed keys and the writer instead of
131
+ // the raw JSON payload.
132
+ if (eventType === 'attr_set') {
133
+ return _jsx(AttrSetEventBlock, { data: data });
134
+ }
135
+ // Error events carry a StructuredError in eventData.error. Check both the
136
+ // nested field and the top-level value for legacy payloads.
137
+ if (getEventDataRefFields(eventType).includes('error') &&
129
138
  data != null &&
130
139
  typeof data === 'object') {
131
140
  const record = data;
132
141
  // Check the nested `error` field first (the StructuredError)
133
- if (isStructuredErrorWithStack(record.error)) {
142
+ if (isStructuredError(record.error)) {
134
143
  return _jsx(ErrorStackBlock, { value: record.error });
135
144
  }
136
- // Some error formats put the stack at the top level of eventData
137
- if (isStructuredErrorWithStack(record)) {
145
+ // Some error formats put the message/stack at the top level of eventData.
146
+ if (isStructuredError(record)) {
138
147
  return _jsx(ErrorStackBlock, { value: record });
139
148
  }
140
149
  }
@@ -142,9 +151,14 @@ function EventDataBlock({ eventType, data, }) {
142
151
  // generic JSON viewer.
143
152
  return _jsx(CopyableDataBlock, { data: data });
144
153
  }
145
- export function EventsList({ events, isLoading = false, error, onLoadEventData, encryptionKey, }) {
146
- // Sort by createdAt
147
- const sortedEvents = useMemo(() => [...events].sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()), [events]);
148
- return (_jsxs("div", { className: "mt-2", style: { color: 'var(--ds-gray-1000)' }, children: [_jsx("h3", { className: "text-label-14 font-medium mt-4 mb-2", style: { color: 'var(--ds-gray-1000)' }, children: "Events" }), isLoading ? (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsx(Skeleton, { className: "h-9 w-full rounded-md" }), _jsx(Skeleton, { className: "h-9 w-full rounded-md" }), _jsx(Skeleton, { className: "h-9 w-full rounded-md" })] })) : null, !isLoading && !error && sortedEvents.length === 0 && (_jsx("div", { className: "text-sm", children: "No events found" })), sortedEvents.length > 0 && !error ? (_jsx("div", { className: "flex flex-col gap-4", children: sortedEvents.map((event) => (_jsx(EventItem, { event: event, onLoadEventData: onLoadEventData, encryptionKey: encryptionKey }, event.eventId))) })) : null] }));
154
+ export function EventsList({ events, isLoading = false, error, onLoadEventData, onStreamClick, onRunClick, encryptionKey, showSeparateEventOccurrenceTimestamps = false, }) {
155
+ // Sort by the timestamp shown as Created by default.
156
+ const sortedEvents = useMemo(() => [...events].sort((a, b) => getEffectiveEventDate(a).getTime() -
157
+ getEffectiveEventDate(b).getTime()), [events]);
158
+ const hasEvents = sortedEvents.length > 0 && !error;
159
+ if (!hasEvents && !isLoading) {
160
+ return _jsx(Collapsible, { label: "Events", disabled: true });
161
+ }
162
+ return (_jsx(RunClickContext.Provider, { value: onRunClick, children: _jsx(StreamClickContext.Provider, { value: onStreamClick, children: _jsxs(CollapsibleRoot, { defaultOpen: true, children: [_jsx(CollapsibleTrigger, { children: "Events" }), _jsx(CollapsibleContent, { className: "mb-0", children: isLoading ? (_jsx("div", { className: "flex flex-col -mx-4", children: [0, 1, 2].map((i) => (_jsxs("div", { className: "flex items-center justify-between gap-3 bg-background-200 px-4 py-2", children: [_jsx(Skeleton, { className: "h-4 w-32 rounded" }), _jsx(Skeleton, { className: "h-3 w-16 rounded" })] }, i))) })) : (_jsx("div", { className: "flex flex-col -mx-4", children: sortedEvents.map((event) => (_jsx(EventItem, { event: event, onLoadEventData: onLoadEventData, encryptionKey: encryptionKey, showSeparateEventOccurrenceTimestamps: showSeparateEventOccurrenceTimestamps }, event.eventId))) })) })] }) }) }));
149
163
  }
150
- //# sourceMappingURL=events-list.js.map
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLWxpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zaWRlYmFyL2V2ZW50cy1saXN0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBRWIsT0FBTyxFQUFjLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDaEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFFLE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZixrQkFBa0IsR0FDbkIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFOUUsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFjLEVBQWUsRUFBRTtJQUNyRCxJQUFJLEtBQUssSUFBSSxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFL0IsTUFBTSxJQUFJLEdBQUcsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNyRSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3BELENBQUMsQ0FBQztBQUVGLE1BQU0scUJBQXFCLEdBQUcsQ0FDNUIsS0FBOEMsRUFDeEMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBRXpFLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxJQUFVLEVBQVUsRUFBRSxDQUNsRCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRTtJQUM3QixLQUFLLEVBQUUsT0FBTztJQUNkLEdBQUcsRUFBRSxTQUFTO0lBQ2QsSUFBSSxFQUFFLFNBQVM7SUFDZixNQUFNLEVBQUUsU0FBUztJQUNqQixNQUFNLEVBQUUsU0FBUztJQUNqQixzQkFBc0IsRUFBRSxDQUFDO0lBQ3pCLFlBQVksRUFBRSxPQUFPO0NBQ3RCLENBQUMsQ0FBQztBQUVMOztHQUVHO0FBQ0gsU0FBUyxTQUFTLENBQUMsRUFDakIsS0FBSyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBQ2IscUNBQXFDLEdBQUcsS0FBSyxHQVE5QztJQUNDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLEdBQUcsUUFBUSxDQUFpQixJQUFJLENBQUMsQ0FBQztJQUNuRSxNQUFNLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRCxNQUFNLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxHQUFHLFFBQVEsQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFDaEUsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLDRGQUE0RjtJQUM1RixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQWlCLElBQUksQ0FBQyxDQUFDO0lBRW5ELDBEQUEwRDtJQUMxRCxNQUFNLFlBQVksR0FDaEIsV0FBVyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzNFLE1BQU0sYUFBYSxHQUFHLFVBQVUsSUFBSSxZQUFZLENBQUM7SUFDakQsTUFBTSxXQUFXLEdBQ2YsWUFBWSxLQUFLLElBQUksSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUU3RSxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQy9CLEtBQUssRUFBRSxLQUFjLEVBQUUsRUFBRTtRQUN2QixJQUFJLENBQUMsZUFBZTtZQUFFLE9BQU87UUFDN0IsSUFBSSxDQUFDLEtBQUssSUFBSSxhQUFhLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzdDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixNQUFNLElBQUksR0FBRyxNQUFNLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQyxhQUFhLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUM3QixhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixZQUFZLENBQUMsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDakUsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDLEVBQ0QsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQ3pCLENBQUM7SUFFRixNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1FBQ3BDLElBQUksU0FBUztZQUFFLE9BQU87UUFDdEIsY0FBYyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDOUIsS0FBSyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFL0IsMEVBQTBFO0lBQzFFLHdDQUF3QztJQUN4QyxlQUFlLENBQUMsR0FBRyxFQUFFO1FBQ25CLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTztZQUFFLE9BQU87UUFDdEQsYUFBYSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDN0IsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLEtBQUssYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRW5DLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1QyxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sa0JBQWtCLEdBQUcscUNBQXFDO1FBQzlELENBQUMsQ0FBQyxTQUFTO1FBQ1gsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sc0JBQXNCLEdBQUcsa0JBQWtCLENBQUMsa0JBQWtCLENBQ2xFLFNBQVMsRUFDVDtRQUNFLElBQUksRUFBRSxTQUFTO1FBQ2YsTUFBTSxFQUFFLFNBQVM7UUFDakIsTUFBTSxFQUFFLFNBQVM7S0FDbEIsQ0FDRixDQUFDO0lBRUYsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztJQUU5RCxPQUFPLENBQ0wsTUFBQyxlQUFlLElBQ2QsT0FBTyxFQUFDLE1BQU0sRUFDZCxZQUFZLEVBQ1YsV0FBVztZQUNULENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNQLElBQUksSUFBSTtvQkFBRSxZQUFZLEVBQUUsQ0FBQztZQUMzQixDQUFDO1lBQ0gsQ0FBQyxDQUFDLFNBQVMsYUFHZixLQUFDLGtCQUFrQixJQUFDLFNBQVMsRUFBQyxXQUFXLFlBQ3ZDLGVBQUssU0FBUyxFQUFDLGdEQUFnRCxhQUM3RCxlQUFNLFNBQVMsRUFBQyx3Q0FBd0MsWUFDckQsS0FBSyxDQUFDLFNBQVMsR0FDWCxFQUNQLGVBQU0sU0FBUyxFQUFDLHNDQUFzQyxZQUNuRCxzQkFBc0IsR0FDbEIsSUFDSCxHQUNhLEVBQ3JCLE1BQUMsa0JBQWtCLGVBRWpCLGVBQUssU0FBUyxFQUFDLDBGQUEwRixhQUN0RyxxQ0FBcUMsSUFBSSxVQUFVLElBQUksQ0FDdEQsZUFBSyxTQUFTLEVBQUMsbURBQW1ELGFBQ2hFLGVBQU0sU0FBUyxFQUFDLDZCQUE2Qix5QkFBZ0IsRUFDN0QsS0FBQyxnQkFBZ0IsSUFBQyxJQUFJLEVBQUUsVUFBVSxZQUNoQyxlQUFNLFNBQVMsRUFBQyx5REFBeUQsWUFDdEUsb0JBQW9CLENBQUMsVUFBVSxDQUFDLEdBQzVCLEdBQ1UsSUFDZixDQUNQLEVBQ0QsZUFBSyxTQUFTLEVBQUMsbURBQW1ELGFBQ2hFLGVBQU0sU0FBUyxFQUFDLDZCQUE2Qix5QkFBZ0IsRUFDN0QsZUFBTSxTQUFTLEVBQUMseURBQXlELFlBQ3RFLEtBQUssQ0FBQyxPQUFPLEdBQ1QsSUFDSCxFQUNMLEtBQUssQ0FBQyxhQUFhLElBQUksQ0FDdEIsZUFBSyxTQUFTLEVBQUMsbURBQW1ELGFBQ2hFLGVBQU0sU0FBUyxFQUFDLDZCQUE2QiwrQkFFdEMsRUFDUCxlQUFNLFNBQVMsRUFBQyx5REFBeUQsWUFDdEUsS0FBSyxDQUFDLGFBQWEsR0FDZixJQUNILENBQ1AsSUFDRyxFQUdMLFNBQVMsSUFBSSxDQUNaLGVBQUssU0FBUyxFQUFDLEtBQUssYUFDbEIsS0FBQyxRQUFRLElBQUMsU0FBUyxFQUFDLGFBQWEsR0FBRyxFQUNwQyxLQUFDLFFBQVEsSUFBQyxTQUFTLEVBQUMsa0JBQWtCLEdBQUcsRUFDekMsS0FBQyxRQUFRLElBQUMsU0FBUyxFQUFDLGtCQUFrQixHQUFHLElBQ3JDLENBQ1AsRUFHQSxTQUFTLElBQUksQ0FDWixLQUFDLFNBQVMsSUFDUixLQUFLLEVBQUMsMkJBQTJCLEVBQ2pDLE9BQU8sRUFBRSxTQUFTLEVBQ2xCLFNBQVMsRUFBQyxNQUFNLEdBQ2hCLENBQ0gsRUFHQSxjQUFjLElBQUksSUFBSSxJQUFJLENBQ3pCLGNBQUssU0FBUyxFQUFDLDBDQUEwQyxZQUN2RCxLQUFDLGNBQWMsSUFBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsY0FBYyxHQUFJLEdBQ2hFLENBQ1AsSUFDa0IsSUFDTCxDQUNuQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLG9CQUFvQixDQUFDLElBQWEsRUFBRSxTQUFpQjtJQUM1RCxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNyRSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxJQUErQixDQUFDO0lBQy9DLE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQztJQUN2RCxPQUFPLENBQ0wsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ3RCLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNyRCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsY0FBYyxDQUFDLEVBQ3RCLFNBQVMsRUFDVCxJQUFJLEdBSUw7SUFDQyxnRUFBZ0U7SUFDaEUsaUZBQWlGO0lBQ2pGLHVEQUF1RDtJQUN2RCxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxPQUFPLENBQ0wsY0FDRSxTQUFTLEVBQUMscUVBQXFFLEVBQy9FLEtBQUssRUFBRTtnQkFDTCxXQUFXLEVBQUUsb0JBQW9CO2dCQUNqQyxlQUFlLEVBQUUsb0JBQW9CO2dCQUNyQyxLQUFLLEVBQUUsb0JBQW9CO2FBQzVCLFlBRUQsZUFBTSxTQUFTLEVBQUMsYUFBYSw2QkFBb0IsR0FDN0MsQ0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksa0JBQWtCLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN2RCxPQUFPLEtBQUMsa0JBQWtCLEtBQUcsQ0FBQztJQUNoQyxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLHdCQUF3QjtJQUN4QixJQUFJLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUM3QixPQUFPLEtBQUMsaUJBQWlCLElBQUMsSUFBSSxFQUFFLElBQUksR0FBSSxDQUFDO0lBQzNDLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsNERBQTREO0lBQzVELElBQ0UscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUNsRCxJQUFJLElBQUksSUFBSTtRQUNaLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFDeEIsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLElBQStCLENBQUM7UUFFL0MsNkRBQTZEO1FBQzdELElBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEMsT0FBTyxLQUFDLGVBQWUsSUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssR0FBSSxDQUFDO1FBQ2xELENBQUM7UUFFRCwwRUFBMEU7UUFDMUUsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sS0FBQyxlQUFlLElBQUMsS0FBSyxFQUFFLE1BQU0sR0FBSSxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLHVCQUF1QjtJQUN2QixPQUFPLEtBQUMsaUJBQWlCLElBQUMsSUFBSSxFQUFFLElBQUksR0FBSSxDQUFDO0FBQzNDLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLEVBQ3pCLE1BQU0sRUFDTixTQUFTLEdBQUcsS0FBSyxFQUNqQixLQUFLLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixVQUFVLEVBQ1YsYUFBYSxFQUNiLHFDQUFxQyxHQUFHLEtBQUssR0FZOUM7SUFDQyxxREFBcUQ7SUFDckQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUMxQixHQUFHLEVBQUUsQ0FDSCxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUNkLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQ1AscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO1FBQ2xDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUNyQyxFQUNILENBQUMsTUFBTSxDQUFDLENBQ1QsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBRXBELElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3QixPQUFPLEtBQUMsV0FBVyxJQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsUUFBUSxTQUFHLENBQUM7SUFDakQsQ0FBQztJQUVELE9BQU8sQ0FDTCxLQUFDLGVBQWUsQ0FBQyxRQUFRLElBQUMsS0FBSyxFQUFFLFVBQVUsWUFDekMsS0FBQyxrQkFBa0IsQ0FBQyxRQUFRLElBQUMsS0FBSyxFQUFFLGFBQWEsWUFDL0MsTUFBQyxlQUFlLElBQUMsV0FBVyxtQkFDMUIsS0FBQyxrQkFBa0IseUJBQTRCLEVBQy9DLEtBQUMsa0JBQWtCLElBQUMsU0FBUyxFQUFDLE1BQU0sWUFDakMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUNYLGNBQUssU0FBUyxFQUFDLHFCQUFxQixZQUNqQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUNwQixlQUVFLFNBQVMsRUFBQyxxRUFBcUUsYUFFL0UsS0FBQyxRQUFRLElBQUMsU0FBUyxFQUFDLGtCQUFrQixHQUFHLEVBQ3pDLEtBQUMsUUFBUSxJQUFDLFNBQVMsRUFBQyxrQkFBa0IsR0FBRyxLQUpwQyxDQUFDLENBS0YsQ0FDUCxDQUFDLEdBQ0UsQ0FDUCxDQUFDLENBQUMsQ0FBQyxDQUNGLGNBQUssU0FBUyxFQUFDLHFCQUFxQixZQUNqQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUMzQixLQUFDLFNBQVMsSUFFUixLQUFLLEVBQUUsS0FBSyxFQUNaLGVBQWUsRUFBRSxlQUFlLEVBQ2hDLGFBQWEsRUFBRSxhQUFhLEVBQzVCLHFDQUFxQyxFQUNuQyxxQ0FBcUMsSUFMbEMsS0FBSyxDQUFDLE9BQU8sQ0FPbEIsQ0FDSCxDQUFDLEdBQ0UsQ0FDUCxHQUNrQixJQUNMLEdBQ1UsR0FDTCxDQUM1QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgdHlwZSBFdmVudCwgZ2V0RXZlbnREYXRhUmVmRmllbGRzIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VMYXlvdXRFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBoYXNFbmNyeXB0ZWRGaWVsZHMsIGlzRXhwaXJlZE1hcmtlciB9IGZyb20gJy4uLy4uL2xpYi9oeWRyYXRpb24nO1xuaW1wb3J0IHtcbiAgQ29sbGFwc2libGUsXG4gIENvbGxhcHNpYmxlQ29udGVudCxcbiAgQ29sbGFwc2libGVSb290LFxuICBDb2xsYXBzaWJsZVRyaWdnZXIsXG59IGZyb20gJy4uL3VpL2NvbGxhcHNpYmxlJztcbmltcG9ydCB7IFJ1bkNsaWNrQ29udGV4dCwgU3RyZWFtQ2xpY2tDb250ZXh0IH0gZnJvbSAnLi4vdWkvZGF0YS1pbnNwZWN0b3InO1xuaW1wb3J0IHsgRXJyb3JDYXJkIH0gZnJvbSAnLi4vdWkvZXJyb3ItY2FyZCc7XG5pbXBvcnQgeyBFcnJvclN0YWNrQmxvY2ssIGlzU3RydWN0dXJlZEVycm9yIH0gZnJvbSAnLi4vdWkvZXJyb3Itc3RhY2stYmxvY2snO1xuaW1wb3J0IHsgU2tlbGV0b24gfSBmcm9tICcuLi91aS9za2VsZXRvbic7XG5pbXBvcnQgeyBUaW1lc3RhbXBUb29sdGlwIH0gZnJvbSAnLi4vdWkvdGltZXN0YW1wLXRvb2x0aXAnO1xuaW1wb3J0IHsgQXR0clNldEV2ZW50QmxvY2sgfSBmcm9tICcuL2F0dHJpYnV0ZXMtYmxvY2snO1xuaW1wb3J0IHsgQ29weWFibGVEYXRhQmxvY2ssIEVuY3J5cHRlZERhdGFCbG9jayB9IGZyb20gJy4vY29weWFibGUtZGF0YS1ibG9jayc7XG5cbmNvbnN0IHBhcnNlRGF0ZVZhbHVlID0gKHZhbHVlOiB1bmtub3duKTogRGF0ZSB8IG51bGwgPT4ge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgZGF0ZSA9IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IHZhbHVlIDogbmV3IERhdGUoU3RyaW5nKHZhbHVlKSk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gbnVsbCA6IGRhdGU7XG59O1xuXG5jb25zdCBnZXRFZmZlY3RpdmVFdmVudERhdGUgPSAoXG4gIGV2ZW50OiBQaWNrPEV2ZW50LCAnY3JlYXRlZEF0JyB8ICdvY2N1cnJlZEF0Jz5cbik6IERhdGUgPT4gcGFyc2VEYXRlVmFsdWUoZXZlbnQub2NjdXJyZWRBdCkgPz8gbmV3IERhdGUoZXZlbnQuY3JlYXRlZEF0KTtcblxuY29uc3QgZm9ybWF0RXZlbnRUaW1lc3RhbXAgPSAoZGF0ZTogRGF0ZSk6IHN0cmluZyA9PlxuICBkYXRlLnRvTG9jYWxlU3RyaW5nKHVuZGVmaW5lZCwge1xuICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgIGRheTogJ251bWVyaWMnLFxuICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICBtaW51dGU6ICdudW1lcmljJyxcbiAgICBzZWNvbmQ6ICdudW1lcmljJyxcbiAgICBmcmFjdGlvbmFsU2Vjb25kRGlnaXRzOiAzLFxuICAgIHRpbWVab25lTmFtZTogJ3Nob3J0JyxcbiAgfSk7XG5cbi8qKlxuICogQSBzaW5nbGUgZXZlbnQgcm93IHRoYXQgY2FuIGxhenktbG9hZCBpdHMgZXZlbnREYXRhIHdoZW4gZXhwYW5kZWQuXG4gKi9cbmZ1bmN0aW9uIEV2ZW50SXRlbSh7XG4gIGV2ZW50LFxuICBvbkxvYWRFdmVudERhdGEsXG4gIGVuY3J5cHRpb25LZXksXG4gIHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHMgPSBmYWxzZSxcbn06IHtcbiAgZXZlbnQ6IEV2ZW50O1xuICBvbkxvYWRFdmVudERhdGE/OiAoZXZlbnQ6IEV2ZW50KSA9PiBQcm9taXNlPHVua25vd24gfCBudWxsPjtcbiAgLyoqIFdoZW4gdGhpcyBjaGFuZ2VzIChlLmcuLCBEZWNyeXB0IHdhcyBjbGlja2VkKSwgaW52YWxpZGF0ZSBjYWNoZWQgZGF0YSAqL1xuICBlbmNyeXB0aW9uS2V5PzogVWludDhBcnJheTtcbiAgLyoqIFNob3cgb2NjdXJyZWRBdCBzZXBhcmF0ZWx5IGluc3RlYWQgb2YgZm9sZGluZyBpdCBpbnRvIHRoZSBDcmVhdGVkIHRpbWVzdGFtcC4gKi9cbiAgc2hvd1NlcGFyYXRlRXZlbnRPY2N1cnJlbmNlVGltZXN0YW1wcz86IGJvb2xlYW47XG59KSB7XG4gIGNvbnN0IFtsb2FkZWREYXRhLCBzZXRMb2FkZWREYXRhXSA9IHVzZVN0YXRlPHVua25vd24gfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2lzTG9hZGluZywgc2V0SXNMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2xvYWRFcnJvciwgc2V0TG9hZEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCB3YXNFeHBhbmRlZFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIC8qKiBNaXJyb3JzIHdoZXRoZXIgd2UgaGF2ZSBhIGZldGNoZWQgcGF5bG9hZDsgYXZvaWRzIHN0YWxlIGBsb2FkZWREYXRhYCBpbiBsb2FkIGNsb3N1cmUuICovXG4gIGNvbnN0IGxvYWRlZERhdGFSZWYgPSB1c2VSZWY8dW5rbm93biB8IG51bGw+KG51bGwpO1xuXG4gIC8vIENoZWNrIGlmIHRoZSBldmVudCBhbHJlYWR5IGhhcyBldmVudERhdGEgZnJvbSB0aGUgc3RvcmVcbiAgY29uc3QgZXhpc3RpbmdEYXRhID1cbiAgICAnZXZlbnREYXRhJyBpbiBldmVudCAmJiBldmVudC5ldmVudERhdGEgIT0gbnVsbCA/IGV2ZW50LmV2ZW50RGF0YSA6IG51bGw7XG4gIGNvbnN0IG1lcmdlZERpc3BsYXkgPSBsb2FkZWREYXRhID8/IGV4aXN0aW5nRGF0YTtcbiAgY29uc3QgY2FuSGF2ZURhdGEgPVxuICAgIGV4aXN0aW5nRGF0YSAhPT0gbnVsbCB8fCBnZXRFdmVudERhdGFSZWZGaWVsZHMoZXZlbnQuZXZlbnRUeXBlKS5sZW5ndGggPiAwO1xuXG4gIGNvbnN0IGxvYWRFdmVudERhdGEgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoZm9yY2U6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICghb25Mb2FkRXZlbnREYXRhKSByZXR1cm47XG4gICAgICBpZiAoIWZvcmNlICYmIGxvYWRlZERhdGFSZWYuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0TG9hZEVycm9yKG51bGwpO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgb25Mb2FkRXZlbnREYXRhKGV2ZW50KTtcbiAgICAgICAgbG9hZGVkRGF0YVJlZi5jdXJyZW50ID0gZGF0YTtcbiAgICAgICAgc2V0TG9hZGVkRGF0YShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzZXRMb2FkRXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbb25Mb2FkRXZlbnREYXRhLCBldmVudF1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVFeHBhbmQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKGlzTG9hZGluZykgcmV0dXJuO1xuICAgIHdhc0V4cGFuZGVkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIHZvaWQgbG9hZEV2ZW50RGF0YShmYWxzZSk7XG4gIH0sIFtpc0xvYWRpbmcsIGxvYWRFdmVudERhdGFdKTtcblxuICAvLyBXaGVuIHRoZSBlbmNyeXB0aW9uIGtleSBjaGFuZ2VzIGFuZCB0aGlzIGV2ZW50IHdhcyBwcmV2aW91c2x5IGV4cGFuZGVkLFxuICAvLyByZS1sb2FkIHRoZSBkYXRhIHNvIGl0IGdldHMgZGVjcnlwdGVkXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmNyeXB0aW9uS2V5IHx8ICF3YXNFeHBhbmRlZFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgbG9hZGVkRGF0YVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICBzZXRMb2FkZWREYXRhKG51bGwpO1xuICAgIHZvaWQgbG9hZEV2ZW50RGF0YSh0cnVlKTtcbiAgfSwgW2VuY3J5cHRpb25LZXksIGxvYWRFdmVudERhdGFdKTtcblxuICBjb25zdCBjcmVhdGVkQXQgPSBuZXcgRGF0ZShldmVudC5jcmVhdGVkQXQpO1xuICBjb25zdCBvY2N1cnJlZEF0ID0gcGFyc2VEYXRlVmFsdWUoZXZlbnQub2NjdXJyZWRBdCk7XG4gIGNvbnN0IGRpc3BsYXllZENyZWF0ZWRBdCA9IHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHNcbiAgICA/IGNyZWF0ZWRBdFxuICAgIDogZ2V0RWZmZWN0aXZlRXZlbnREYXRlKGV2ZW50KTtcbiAgY29uc3QgZGlzcGxheWVkQ3JlYXRlZEF0VGltZSA9IGRpc3BsYXllZENyZWF0ZWRBdC50b0xvY2FsZVRpbWVTdHJpbmcoXG4gICAgdW5kZWZpbmVkLFxuICAgIHtcbiAgICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICAgIG1pbnV0ZTogJ251bWVyaWMnLFxuICAgICAgc2Vjb25kOiAnbnVtZXJpYycsXG4gICAgfVxuICApO1xuXG4gIGNvbnN0IGRpc3BsYXlQYXlsb2FkID0gaXNMb2FkaW5nID8gbG9hZGVkRGF0YSA6IG1lcmdlZERpc3BsYXk7XG5cbiAgcmV0dXJuIChcbiAgICA8Q29sbGFwc2libGVSb290XG4gICAgICB2YXJpYW50PVwiY2FyZFwiXG4gICAgICBvbk9wZW5DaGFuZ2U9e1xuICAgICAgICBjYW5IYXZlRGF0YVxuICAgICAgICAgID8gKG9wZW4pID0+IHtcbiAgICAgICAgICAgICAgaWYgKG9wZW4pIGhhbmRsZUV4cGFuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICB9XG4gICAgPlxuICAgICAgPENvbGxhcHNpYmxlVHJpZ2dlciBjbGFzc05hbWU9XCJweC0zIHB5LTJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0zXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1ncmF5LTEwMDAgdGV4dC1sYWJlbC0xMiBmb250LW1vbm9cIj5cbiAgICAgICAgICAgIHtldmVudC5ldmVudFR5cGV9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInNocmluay0wIHRleHQtbGFiZWwtMTMgdGV4dC1ncmF5LTkwMFwiPlxuICAgICAgICAgICAge2Rpc3BsYXllZENyZWF0ZWRBdFRpbWV9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvQ29sbGFwc2libGVUcmlnZ2VyPlxuICAgICAgPENvbGxhcHNpYmxlQ29udGVudD5cbiAgICAgICAgey8qIEV2ZW50IGF0dHJpYnV0ZXMgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBiZy1iYWNrZ3JvdW5kLTIwMCBbJjpoYXMoK18qKV06Ym9yZGVyLWIgWyY6aGFzKCtfKildOmJvcmRlci1ncmF5LWFscGhhLTQwMFwiPlxuICAgICAgICAgIHtzaG93U2VwYXJhdGVFdmVudE9jY3VycmVuY2VUaW1lc3RhbXBzICYmIG9jY3VycmVkQXQgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTIgcHktMiBweC0zXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtbGFiZWwtMTIgdGV4dC1ncmF5LTkwMFwiPk9jY3VycmVkPC9zcGFuPlxuICAgICAgICAgICAgICA8VGltZXN0YW1wVG9vbHRpcCBkYXRlPXtvY2N1cnJlZEF0fT5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXgtdy1bNzAlXSB0cnVuY2F0ZSB0ZXh0LXJpZ2h0IHRleHQtbGFiZWwtMTIgZm9udC1tb25vXCI+XG4gICAgICAgICAgICAgICAgICB7Zm9ybWF0RXZlbnRUaW1lc3RhbXAob2NjdXJyZWRBdCl9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L1RpbWVzdGFtcFRvb2x0aXA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yIHB5LTIgcHgtM1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1sYWJlbC0xMiB0ZXh0LWdyYXktOTAwXCI+RXZlbnQgSUQ8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXgtdy1bNzAlXSB0cnVuY2F0ZSB0ZXh0LXJpZ2h0IHRleHQtbGFiZWwtMTIgZm9udC1tb25vXCI+XG4gICAgICAgICAgICAgIHtldmVudC5ldmVudElkfVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHtldmVudC5jb3JyZWxhdGlvbklkICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yIHB5LTIgcHgtM1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWxhYmVsLTEyIHRleHQtZ3JheS05MDBcIj5cbiAgICAgICAgICAgICAgICBDb3JyZWxhdGlvbiBJRFxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1heC13LVs3MCVdIHRydW5jYXRlIHRleHQtcmlnaHQgdGV4dC1sYWJlbC0xMiBmb250LW1vbm9cIj5cbiAgICAgICAgICAgICAgICB7ZXZlbnQuY29ycmVsYXRpb25JZH1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIExvYWRpbmcgc3RhdGUgKi99XG4gICAgICAgIHtpc0xvYWRpbmcgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC0zXCI+XG4gICAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwiaC00IHctWzM1JV1cIiAvPlxuICAgICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cIm10LTIgaC00IHctWzkwJV1cIiAvPlxuICAgICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cIm10LTIgaC00IHctWzc1JV1cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuXG4gICAgICAgIHsvKiBFcnJvciBzdGF0ZSAqL31cbiAgICAgICAge2xvYWRFcnJvciAmJiAoXG4gICAgICAgICAgPEVycm9yQ2FyZFxuICAgICAgICAgICAgdGl0bGU9XCJGYWlsZWQgdG8gbG9hZCBldmVudCBkYXRhXCJcbiAgICAgICAgICAgIGRldGFpbHM9e2xvYWRFcnJvcn1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIm10LTJcIlxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG5cbiAgICAgICAgey8qIEV2ZW50IGRhdGEgKi99XG4gICAgICAgIHtkaXNwbGF5UGF5bG9hZCAhPSBudWxsICYmIChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIlsmPmRpdl06Ym9yZGVyLW5vbmUgWyY+ZGl2XTpyb3VuZGVkLW5vbmVcIj5cbiAgICAgICAgICAgIDxFdmVudERhdGFCbG9jayBldmVudFR5cGU9e2V2ZW50LmV2ZW50VHlwZX0gZGF0YT17ZGlzcGxheVBheWxvYWR9IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L0NvbGxhcHNpYmxlQ29udGVudD5cbiAgICA8L0NvbGxhcHNpYmxlUm9vdD5cbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbiBldmVudERhdGEgb2JqZWN0IGhhcyBvbmx5IGV4cGlyZWQgbWFya2VyIHZhbHVlcyBpbiByZWYvcGF5bG9hZFxuICogZmllbGRzIGZvciB0aGlzIGV2ZW50IHR5cGUgKHNlZSB7QGxpbmsgZ2V0RXZlbnREYXRhUmVmRmllbGRzfSkuIE90aGVyIGtleXNcbiAqIChlLmcuIGByZXN1bWVBdGAsIGBzdGVwTmFtZWApIGFyZSBpZ25vcmVkLlxuICovXG5mdW5jdGlvbiBoYXNPbmx5RXhwaXJlZEZpZWxkcyhkYXRhOiB1bmtub3duLCBldmVudFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCByZWNvcmQgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCByZWZLZXlzID0gZ2V0RXZlbnREYXRhUmVmRmllbGRzKGV2ZW50VHlwZSk7XG4gIGNvbnN0IHByZXNlbnRLZXlzID0gcmVmS2V5cy5maWx0ZXIoKGspID0+IGsgaW4gcmVjb3JkKTtcbiAgcmV0dXJuIChcbiAgICBwcmVzZW50S2V5cy5sZW5ndGggPiAwICYmXG4gICAgcHJlc2VudEtleXMuZXZlcnkoKGspID0+IGlzRXhwaXJlZE1hcmtlcihyZWNvcmRba10pKVxuICApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgZXZlbnQgZGF0YSwgdXNpbmcgRXJyb3JTdGFja0Jsb2NrIGZvciBlcnJvciBldmVudHMgdGhhdCBjb250YWluIGFcbiAqIHN0cnVjdHVyZWQgZXJyb3IsIGFuZCBDb3B5YWJsZURhdGFCbG9jayBvdGhlcndpc2UuXG4gKi9cbmZ1bmN0aW9uIEV2ZW50RGF0YUJsb2NrKHtcbiAgZXZlbnRUeXBlLFxuICBkYXRhLFxufToge1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgZGF0YTogdW5rbm93bjtcbn0pIHtcbiAgLy8gRXhwaXJlZCBkYXRhIOKAlCBzaG93IGEgc2ltcGxlIG1lc3NhZ2UgaW5zdGVhZCBvZiB0aGUgcmF3IHN0dWIuXG4gIC8vIENoZWNrIGJvdGggdGhlIHRvcC1sZXZlbCBldmVudERhdGEgYW5kIG5lc3RlZCBzdWItZmllbGRzIChyZXN1bHQsIGlucHV0LCBldGMuKVxuICAvLyBzaW5jZSB0aGUgc2VydmVyIHN0dWJzIGVhY2ggcmVmIGZpZWxkIGluZGVwZW5kZW50bHkuXG4gIGlmIChpc0V4cGlyZWRNYXJrZXIoZGF0YSkgfHwgaGFzT25seUV4cGlyZWRGaWVsZHMoZGF0YSwgZXZlbnRUeXBlKSkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgcm91bmRlZC1tZCBib3JkZXIgcHgtMyBweS0yIHRleHQtbGFiZWwtMTJcIlxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIGJvcmRlckNvbG9yOiAndmFyKC0tZHMtZ3JheS0zMDApJyxcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTEwMCknLFxuICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtZ3JheS03MDApJyxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj5EYXRhIGV4cGlyZWQ8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgaWYgKGhhc0VuY3J5cHRlZEZpZWxkcyh7IGV2ZW50VHlwZSwgZXZlbnREYXRhOiBkYXRhIH0pKSB7XG4gICAgcmV0dXJuIDxFbmNyeXB0ZWREYXRhQmxvY2sgLz47XG4gIH1cblxuICAvLyBBdHRyaWJ1dGUgY2hhbmdlcyDigJQgcmVuZGVyIHRoZSBjaGFuZ2VkIGtleXMgYW5kIHRoZSB3cml0ZXIgaW5zdGVhZCBvZlxuICAvLyB0aGUgcmF3IEpTT04gcGF5bG9hZC5cbiAgaWYgKGV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0Jykge1xuICAgIHJldHVybiA8QXR0clNldEV2ZW50QmxvY2sgZGF0YT17ZGF0YX0gLz47XG4gIH1cblxuICAvLyBFcnJvciBldmVudHMgY2FycnkgYSBTdHJ1Y3R1cmVkRXJyb3IgaW4gZXZlbnREYXRhLmVycm9yLiBDaGVjayBib3RoIHRoZVxuICAvLyBuZXN0ZWQgZmllbGQgYW5kIHRoZSB0b3AtbGV2ZWwgdmFsdWUgZm9yIGxlZ2FjeSBwYXlsb2Fkcy5cbiAgaWYgKFxuICAgIGdldEV2ZW50RGF0YVJlZkZpZWxkcyhldmVudFR5cGUpLmluY2x1ZGVzKCdlcnJvcicpICYmXG4gICAgZGF0YSAhPSBudWxsICYmXG4gICAgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnXG4gICkge1xuICAgIGNvbnN0IHJlY29yZCA9IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAvLyBDaGVjayB0aGUgbmVzdGVkIGBlcnJvcmAgZmllbGQgZmlyc3QgKHRoZSBTdHJ1Y3R1cmVkRXJyb3IpXG4gICAgaWYgKGlzU3RydWN0dXJlZEVycm9yKHJlY29yZC5lcnJvcikpIHtcbiAgICAgIHJldHVybiA8RXJyb3JTdGFja0Jsb2NrIHZhbHVlPXtyZWNvcmQuZXJyb3J9IC8+O1xuICAgIH1cblxuICAgIC8vIFNvbWUgZXJyb3IgZm9ybWF0cyBwdXQgdGhlIG1lc3NhZ2Uvc3RhY2sgYXQgdGhlIHRvcCBsZXZlbCBvZiBldmVudERhdGEuXG4gICAgaWYgKGlzU3RydWN0dXJlZEVycm9yKHJlY29yZCkpIHtcbiAgICAgIHJldHVybiA8RXJyb3JTdGFja0Jsb2NrIHZhbHVlPXtyZWNvcmR9IC8+O1xuICAgIH1cbiAgfVxuXG4gIC8vIEZvciBub24tZXJyb3IgZXZlbnRzIG9yIGVycm9ycyB3aXRob3V0IGEgc3RhY2ssIGZhbGwgYmFjayB0byB0aGVcbiAgLy8gZ2VuZXJpYyBKU09OIHZpZXdlci5cbiAgcmV0dXJuIDxDb3B5YWJsZURhdGFCbG9jayBkYXRhPXtkYXRhfSAvPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEV2ZW50c0xpc3Qoe1xuICBldmVudHMsXG4gIGlzTG9hZGluZyA9IGZhbHNlLFxuICBlcnJvcixcbiAgb25Mb2FkRXZlbnREYXRhLFxuICBvblN0cmVhbUNsaWNrLFxuICBvblJ1bkNsaWNrLFxuICBlbmNyeXB0aW9uS2V5LFxuICBzaG93U2VwYXJhdGVFdmVudE9jY3VycmVuY2VUaW1lc3RhbXBzID0gZmFsc2UsXG59OiB7XG4gIGV2ZW50czogRXZlbnRbXTtcbiAgaXNMb2FkaW5nPzogYm9vbGVhbjtcbiAgZXJyb3I/OiBFcnJvciB8IG51bGw7XG4gIG9uTG9hZEV2ZW50RGF0YT86IChldmVudDogRXZlbnQpID0+IFByb21pc2U8dW5rbm93biB8IG51bGw+O1xuICBvblN0cmVhbUNsaWNrPzogKHN0cmVhbUlkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uUnVuQ2xpY2s/OiAocnVuSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIHNpZ25hbHMgdGhhdCBkZWNyeXB0aW9uIGlzIGFjdGl2ZSAodHJpZ2dlcnMgcmUtbG9hZCBvZiBleHBhbmRlZCBldmVudHMpICovXG4gIGVuY3J5cHRpb25LZXk/OiBVaW50OEFycmF5O1xuICAvKiogU2hvdyBvY2N1cnJlZEF0IHNlcGFyYXRlbHkgaW5zdGVhZCBvZiBmb2xkaW5nIGl0IGludG8gdGhlIENyZWF0ZWQgdGltZXN0YW1wLiAqL1xuICBzaG93U2VwYXJhdGVFdmVudE9jY3VycmVuY2VUaW1lc3RhbXBzPzogYm9vbGVhbjtcbn0pIHtcbiAgLy8gU29ydCBieSB0aGUgdGltZXN0YW1wIHNob3duIGFzIENyZWF0ZWQgYnkgZGVmYXVsdC5cbiAgY29uc3Qgc29ydGVkRXZlbnRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgWy4uLmV2ZW50c10uc29ydChcbiAgICAgICAgKGEsIGIpID0+XG4gICAgICAgICAgZ2V0RWZmZWN0aXZlRXZlbnREYXRlKGEpLmdldFRpbWUoKSAtXG4gICAgICAgICAgZ2V0RWZmZWN0aXZlRXZlbnREYXRlKGIpLmdldFRpbWUoKVxuICAgICAgKSxcbiAgICBbZXZlbnRzXVxuICApO1xuXG4gIGNvbnN0IGhhc0V2ZW50cyA9IHNvcnRlZEV2ZW50cy5sZW5ndGggPiAwICYmICFlcnJvcjtcblxuICBpZiAoIWhhc0V2ZW50cyAmJiAhaXNMb2FkaW5nKSB7XG4gICAgcmV0dXJuIDxDb2xsYXBzaWJsZSBsYWJlbD1cIkV2ZW50c1wiIGRpc2FibGVkIC8+O1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8UnVuQ2xpY2tDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtvblJ1bkNsaWNrfT5cbiAgICAgIDxTdHJlYW1DbGlja0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e29uU3RyZWFtQ2xpY2t9PlxuICAgICAgICA8Q29sbGFwc2libGVSb290IGRlZmF1bHRPcGVuPlxuICAgICAgICAgIDxDb2xsYXBzaWJsZVRyaWdnZXI+RXZlbnRzPC9Db2xsYXBzaWJsZVRyaWdnZXI+XG4gICAgICAgICAgPENvbGxhcHNpYmxlQ29udGVudCBjbGFzc05hbWU9XCJtYi0wXCI+XG4gICAgICAgICAgICB7aXNMb2FkaW5nID8gKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgLW14LTRcIj5cbiAgICAgICAgICAgICAgICB7WzAsIDEsIDJdLm1hcCgoaSkgPT4gKFxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBrZXk9e2l9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtMyBiZy1iYWNrZ3JvdW5kLTIwMCBweC00IHB5LTJcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwiaC00IHctMzIgcm91bmRlZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxTa2VsZXRvbiBjbGFzc05hbWU9XCJoLTMgdy0xNiByb3VuZGVkXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCAtbXgtNFwiPlxuICAgICAgICAgICAgICAgIHtzb3J0ZWRFdmVudHMubWFwKChldmVudCkgPT4gKFxuICAgICAgICAgICAgICAgICAgPEV2ZW50SXRlbVxuICAgICAgICAgICAgICAgICAgICBrZXk9e2V2ZW50LmV2ZW50SWR9XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50PXtldmVudH1cbiAgICAgICAgICAgICAgICAgICAgb25Mb2FkRXZlbnREYXRhPXtvbkxvYWRFdmVudERhdGF9XG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXk9e2VuY3J5cHRpb25LZXl9XG4gICAgICAgICAgICAgICAgICAgIHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHM9e1xuICAgICAgICAgICAgICAgICAgICAgIHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvQ29sbGFwc2libGVDb250ZW50PlxuICAgICAgICA8L0NvbGxhcHNpYmxlUm9vdD5cbiAgICAgIDwvU3RyZWFtQ2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvUnVuQ2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufVxuIl19