@workflow/web-shared 5.0.0-beta.37 → 5.0.0-beta.39
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.
- package/README.md +3 -3
- package/dist/components/event-list-view.d.ts.map +1 -1
- package/dist/components/event-list-view.js +10 -10
- package/dist/components/index.d.ts +4 -5
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +4 -5
- package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
- package/dist/components/sidebar/attribute-panel.js +32 -8
- package/dist/components/sidebar/attributes-block.js +3 -3
- package/dist/components/sidebar/copyable-data-block.js +2 -2
- package/dist/components/sidebar/entity-detail-panel.js +3 -3
- package/dist/components/sidebar/events-list.js +2 -2
- package/dist/components/stream-viewer-skeleton.d.ts +2 -0
- package/dist/components/stream-viewer-skeleton.d.ts.map +1 -0
- package/dist/components/stream-viewer-skeleton.js +12 -0
- package/dist/components/stream-viewer.d.ts +1 -1
- package/dist/components/stream-viewer.d.ts.map +1 -1
- package/dist/components/stream-viewer.js +9 -26
- package/dist/components/trace-viewer/components/copy-button.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/copy-button.js +27 -0
- package/dist/components/trace-viewer/components/detail-panel-width.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/detail-panel-width.js +67 -0
- package/dist/components/trace-viewer/components/detail-panel.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/detail-panel.js +122 -0
- package/dist/components/trace-viewer/components/draggable-border.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/draggable-border.js +140 -0
- package/dist/components/trace-viewer/components/event-list.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/event-list.js +47 -0
- package/dist/components/trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/middle-truncate/copy-selection.js +54 -0
- package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
- package/dist/components/trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/middle-truncate/truncate.js +101 -0
- package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
- package/dist/components/trace-viewer/components/minimap.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/minimap.js +337 -0
- package/dist/components/trace-viewer/components/pane-constants.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/pane-constants.js +16 -0
- package/dist/components/trace-viewer/components/span-markers.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/span-markers.js +85 -0
- package/dist/components/trace-viewer/components/split-pane.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/split-pane.js +41 -0
- package/dist/components/trace-viewer/components/timeline.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/timeline.js +321 -0
- package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/trace-shortcut-helper.js +55 -0
- package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/trace-viewer-skeleton.js +26 -0
- package/dist/components/trace-viewer/components/use-element-width.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/use-element-width.js +25 -0
- package/dist/components/trace-viewer/components/use-row-window.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/use-row-window.js +107 -0
- package/dist/components/trace-viewer/context.d.ts +14 -182
- package/dist/components/trace-viewer/context.d.ts.map +1 -1
- package/dist/components/trace-viewer/context.js +44 -351
- package/dist/components/trace-viewer/icons.d.ts.map +1 -0
- package/dist/components/trace-viewer/icons.js +15 -0
- package/dist/components/trace-viewer/search.d.ts.map +1 -0
- package/dist/components/trace-viewer/search.js +134 -0
- package/dist/components/trace-viewer/trace-viewer.d.ts +7 -28
- package/dist/components/trace-viewer/trace-viewer.d.ts.map +1 -1
- package/dist/components/trace-viewer/trace-viewer.js +306 -356
- package/dist/components/trace-viewer/types.d.ts +2 -211
- package/dist/components/trace-viewer/types.d.ts.map +1 -1
- package/dist/components/trace-viewer/types.js +1 -1
- package/dist/components/trace-viewer/utils.d.ts.map +1 -0
- package/dist/components/trace-viewer/utils.js +430 -0
- package/dist/components/{trace-viewer-new.d.ts → trace-viewer.d.ts} +3 -3
- package/dist/components/trace-viewer.d.ts.map +1 -0
- package/dist/components/trace-viewer.js +21 -0
- package/dist/components/ui/alert.js +2 -2
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/components/ui/button.d.ts.map +1 -1
- package/dist/components/ui/button.js +3 -3
- package/dist/components/ui/card.d.ts.map +1 -1
- package/dist/components/ui/card.js +3 -3
- package/dist/components/ui/error-card.js +2 -2
- package/dist/components/ui/error-stack-block.js +4 -4
- package/dist/components/ui/kbd.js +3 -3
- package/dist/components/ui/timestamp-tooltip.js +3 -3
- package/dist/components/workflow-traces/trace-span-construction.d.ts +1 -1
- package/dist/components/workflow-traces/trace-span-construction.js +1 -1
- package/dist/lib/trace-builder.d.ts +1 -1
- package/dist/lib/trace-builder.d.ts.map +1 -1
- package/dist/lib/trace-builder.js +1 -1
- package/dist/lib/trace-types.d.ts +54 -0
- package/dist/lib/trace-types.d.ts.map +1 -0
- package/dist/lib/trace-types.js +2 -0
- package/package.json +6 -6
- package/src/components/event-list-view.tsx +12 -9
- package/src/components/index.ts +4 -5
- package/src/components/sidebar/attribute-panel.tsx +46 -8
- package/src/components/sidebar/attributes-block.tsx +2 -2
- package/src/components/sidebar/copyable-data-block.tsx +1 -1
- package/src/components/sidebar/entity-detail-panel.tsx +3 -3
- package/src/components/sidebar/events-list.tsx +1 -1
- package/src/components/stream-viewer-skeleton.tsx +34 -0
- package/src/components/stream-viewer.tsx +34 -106
- package/src/components/{new-trace-viewer → trace-viewer}/components/event-list.tsx +1 -1
- package/src/components/{new-trace-viewer → trace-viewer}/components/minimap.tsx +1 -4
- package/src/components/{new-trace-viewer → trace-viewer}/components/timeline.tsx +2 -5
- package/src/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.tsx +1 -1
- package/src/components/trace-viewer/context.tsx +63 -656
- package/src/components/trace-viewer/trace-viewer.tsx +563 -531
- package/src/components/trace-viewer/types.ts +2 -234
- package/src/components/{new-trace-viewer → trace-viewer}/utils.ts +2 -2
- package/src/components/{trace-viewer-new.tsx → trace-viewer.tsx} +5 -5
- package/src/components/ui/alert.tsx +1 -1
- package/src/components/ui/button.tsx +3 -3
- package/src/components/ui/card.tsx +2 -9
- package/src/components/ui/error-card.tsx +3 -3
- package/src/components/ui/error-stack-block.tsx +3 -3
- package/src/components/ui/kbd.tsx +2 -2
- package/src/components/ui/timestamp-tooltip.tsx +4 -4
- package/src/components/workflow-traces/trace-span-construction.ts +1 -1
- package/src/lib/trace-builder.ts +1 -1
- package/src/lib/trace-types.ts +56 -0
- package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/copy-button.js +0 -27
- package/dist/components/new-trace-viewer/components/detail-panel-width.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/detail-panel-width.js +0 -67
- package/dist/components/new-trace-viewer/components/detail-panel.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/detail-panel.js +0 -122
- package/dist/components/new-trace-viewer/components/draggable-border.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/draggable-border.js +0 -140
- package/dist/components/new-trace-viewer/components/event-list.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/event-list.js +0 -47
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +0 -54
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +0 -81
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +0 -101
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +0 -114
- package/dist/components/new-trace-viewer/components/minimap.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/minimap.js +0 -337
- package/dist/components/new-trace-viewer/components/pane-constants.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/pane-constants.js +0 -16
- package/dist/components/new-trace-viewer/components/span-markers.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/span-markers.js +0 -85
- package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/split-pane.js +0 -41
- package/dist/components/new-trace-viewer/components/timeline.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/timeline.js +0 -321
- package/dist/components/new-trace-viewer/components/trace-shortcut-helper.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/trace-shortcut-helper.js +0 -55
- package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +0 -26
- package/dist/components/new-trace-viewer/components/use-element-width.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/use-element-width.js +0 -25
- package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/use-row-window.js +0 -107
- package/dist/components/new-trace-viewer/context.d.ts +0 -17
- package/dist/components/new-trace-viewer/context.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/context.js +0 -48
- package/dist/components/new-trace-viewer/icons.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/icons.js +0 -15
- package/dist/components/new-trace-viewer/search.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/search.js +0 -134
- package/dist/components/new-trace-viewer/trace-viewer.d.ts +0 -11
- package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/trace-viewer.js +0 -336
- package/dist/components/new-trace-viewer/types.d.ts +0 -3
- package/dist/components/new-trace-viewer/types.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/types.js +0 -2
- package/dist/components/new-trace-viewer/utils.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/utils.js +0 -430
- package/dist/components/run-trace-view.d.ts +0 -23
- package/dist/components/run-trace-view.d.ts.map +0 -1
- package/dist/components/run-trace-view.js +0 -11
- package/dist/components/trace-viewer/components/map.d.ts +0 -8
- package/dist/components/trace-viewer/components/map.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/map.js +0 -162
- package/dist/components/trace-viewer/components/markers.d.ts +0 -23
- package/dist/components/trace-viewer/components/markers.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/markers.js +0 -416
- package/dist/components/trace-viewer/components/node.d.ts +0 -35
- package/dist/components/trace-viewer/components/node.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/node.js +0 -286
- package/dist/components/trace-viewer/components/search-input.d.ts +0 -9
- package/dist/components/trace-viewer/components/search-input.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/search-input.js +0 -9
- package/dist/components/trace-viewer/components/search.d.ts +0 -3
- package/dist/components/trace-viewer/components/search.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/search.js +0 -25
- package/dist/components/trace-viewer/components/span-content.d.ts +0 -19
- package/dist/components/trace-viewer/components/span-content.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/span-content.js +0 -137
- package/dist/components/trace-viewer/components/span-detail-panel.d.ts +0 -10
- package/dist/components/trace-viewer/components/span-detail-panel.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js +0 -285
- package/dist/components/trace-viewer/components/span-segments.d.ts +0 -50
- package/dist/components/trace-viewer/components/span-segments.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/span-segments.js +0 -445
- package/dist/components/trace-viewer/components/span-strategies.d.ts +0 -46
- package/dist/components/trace-viewer/components/span-strategies.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/span-strategies.js +0 -108
- package/dist/components/trace-viewer/components/ui.d.ts +0 -28
- package/dist/components/trace-viewer/components/ui.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/ui.js +0 -39
- package/dist/components/trace-viewer/components/zoom-button.d.ts +0 -3
- package/dist/components/trace-viewer/components/zoom-button.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/zoom-button.js +0 -29
- package/dist/components/trace-viewer/components/zoom-icons.d.ts +0 -11
- package/dist/components/trace-viewer/components/zoom-icons.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/zoom-icons.js +0 -11
- package/dist/components/trace-viewer/index.d.ts +0 -5
- package/dist/components/trace-viewer/index.d.ts.map +0 -1
- package/dist/components/trace-viewer/index.js +0 -4
- package/dist/components/trace-viewer/trace-viewer.module.css +0 -1465
- package/dist/components/trace-viewer/util/constants.d.ts +0 -9
- package/dist/components/trace-viewer/util/constants.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/constants.js +0 -9
- package/dist/components/trace-viewer/util/scrollbar-width.d.ts +0 -2
- package/dist/components/trace-viewer/util/scrollbar-width.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js +0 -14
- package/dist/components/trace-viewer/util/tree.d.ts +0 -13
- package/dist/components/trace-viewer/util/tree.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/tree.js +0 -227
- package/dist/components/trace-viewer/util/use-immediate-style.d.ts +0 -15
- package/dist/components/trace-viewer/util/use-immediate-style.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js +0 -23
- package/dist/components/trace-viewer/util/use-streaming-spans.d.ts +0 -8
- package/dist/components/trace-viewer/util/use-streaming-spans.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js +0 -345
- package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts +0 -6
- package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js +0 -39
- package/dist/components/trace-viewer/worker.d.ts +0 -2
- package/dist/components/trace-viewer/worker.d.ts.map +0 -1
- package/dist/components/trace-viewer/worker.js +0 -109
- package/dist/components/trace-viewer-new.d.ts.map +0 -1
- package/dist/components/trace-viewer-new.js +0 -21
- package/dist/components/workflow-trace-view.d.ts +0 -39
- package/dist/components/workflow-trace-view.d.ts.map +0 -1
- package/dist/components/workflow-trace-view.js +0 -690
- package/dist/components/workflow-traces/trace-colors.d.ts +0 -15
- package/dist/components/workflow-traces/trace-colors.d.ts.map +0 -1
- package/dist/components/workflow-traces/trace-colors.js +0 -86
- package/src/components/new-trace-viewer/context.tsx +0 -93
- package/src/components/new-trace-viewer/trace-viewer.tsx +0 -632
- package/src/components/new-trace-viewer/types.ts +0 -2
- package/src/components/run-trace-view.tsx +0 -80
- package/src/components/trace-viewer/components/map.tsx +0 -226
- package/src/components/trace-viewer/components/markers.tsx +0 -612
- package/src/components/trace-viewer/components/node.tsx +0 -506
- package/src/components/trace-viewer/components/search-input.tsx +0 -52
- package/src/components/trace-viewer/components/search.tsx +0 -47
- package/src/components/trace-viewer/components/span-content.tsx +0 -247
- package/src/components/trace-viewer/components/span-detail-panel.tsx +0 -655
- package/src/components/trace-viewer/components/span-segments.ts +0 -585
- package/src/components/trace-viewer/components/span-strategies.ts +0 -205
- package/src/components/trace-viewer/components/ui.tsx +0 -156
- package/src/components/trace-viewer/components/zoom-button.tsx +0 -61
- package/src/components/trace-viewer/components/zoom-icons.tsx +0 -65
- package/src/components/trace-viewer/index.tsx +0 -4
- package/src/components/trace-viewer/trace-viewer.module.css +0 -1465
- package/src/components/trace-viewer/util/constants.ts +0 -8
- package/src/components/trace-viewer/util/scrollbar-width.ts +0 -13
- package/src/components/trace-viewer/util/tree.ts +0 -277
- package/src/components/trace-viewer/util/use-immediate-style.ts +0 -38
- package/src/components/trace-viewer/util/use-streaming-spans.ts +0 -426
- package/src/components/trace-viewer/util/use-trackpad-zoom.tsx +0 -51
- package/src/components/trace-viewer/worker.ts +0 -131
- package/src/components/workflow-trace-view.tsx +0 -1166
- package/src/components/workflow-traces/trace-colors.ts +0 -112
- package/dist/components/{new-trace-viewer → trace-viewer}/components/copy-button.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/detail-panel-width.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/detail-panel.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/draggable-border.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/event-list.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/minimap.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/pane-constants.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/span-markers.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/split-pane.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/timeline.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/timeline.module.css +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.module.css +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-viewer-skeleton.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/use-element-width.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/use-row-window.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/icons.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/search.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/utils.d.ts +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/copy-button.tsx +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel-width.test.ts +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel-width.ts +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel.tsx +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/draggable-border.tsx +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.ts +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.tsx +1 -1
- /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/pane-constants.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/span-markers.tsx +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/split-pane.tsx +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/timeline.module.css +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.module.css +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/trace-viewer-skeleton.tsx +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/use-element-width.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/use-row-window.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/icons.tsx +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/search.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/utils.test.ts +0 -0
- /package/src/{components/trace-viewer/modules.d.ts → modules.d.ts} +0 -0
|
@@ -1,445 +0,0 @@
|
|
|
1
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
2
|
-
// CSS class mapping (segment status → module CSS class name)
|
|
3
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
4
|
-
/**
|
|
5
|
-
* Maps a SegmentStatus to the CSS module class name to use.
|
|
6
|
-
* These class names must exist in trace-viewer.module.css.
|
|
7
|
-
*/
|
|
8
|
-
export const SEGMENT_CLASS_MAP = {
|
|
9
|
-
queued: 'segQueued',
|
|
10
|
-
running: 'segRunning',
|
|
11
|
-
failed: 'segFailed',
|
|
12
|
-
retrying: 'segRetrying',
|
|
13
|
-
succeeded: 'segSucceeded',
|
|
14
|
-
waiting: 'segWaiting',
|
|
15
|
-
sleeping: 'segSleeping',
|
|
16
|
-
received: 'segReceived',
|
|
17
|
-
};
|
|
18
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
19
|
-
// Helpers
|
|
20
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
21
|
-
function clampFraction(value) {
|
|
22
|
-
return Math.max(0, Math.min(1, value));
|
|
23
|
-
}
|
|
24
|
-
function timeToFraction(time, spanStart, spanDuration) {
|
|
25
|
-
if (spanDuration <= 0)
|
|
26
|
-
return 0;
|
|
27
|
-
return clampFraction((time - spanStart) / spanDuration);
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Sort events by timestamp ascending.
|
|
31
|
-
*/
|
|
32
|
-
function sortedEvents(events) {
|
|
33
|
-
return [...events].sort((a, b) => a.timestamp - b.timestamp);
|
|
34
|
-
}
|
|
35
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
36
|
-
// Step segments
|
|
37
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
38
|
-
/**
|
|
39
|
-
* Compute segments for a step span.
|
|
40
|
-
*
|
|
41
|
-
* Timeline: [queued] → [attempt₁ (fail)] → [retry wait] → [attempt₂ (fail)] → ... → [attemptₙ (success)]
|
|
42
|
-
*
|
|
43
|
-
* Events used: step_started, step_retrying, step_failed, step_completed
|
|
44
|
-
* The final segment is 'succeeded' if no trailing step_retrying/step_failed.
|
|
45
|
-
*/
|
|
46
|
-
function computeStepSegments(node) {
|
|
47
|
-
const events = node.events ? sortedEvents(node.events) : [];
|
|
48
|
-
const { startTime, duration } = node;
|
|
49
|
-
const segments = [];
|
|
50
|
-
if (duration <= 0)
|
|
51
|
-
return segments;
|
|
52
|
-
const marks = events
|
|
53
|
-
.filter((e) => [
|
|
54
|
-
'step_started',
|
|
55
|
-
'step_retrying',
|
|
56
|
-
'step_failed',
|
|
57
|
-
'step_completed',
|
|
58
|
-
].includes(e.event.name))
|
|
59
|
-
.map((e) => ({ time: e.timestamp, type: e.event.name }));
|
|
60
|
-
if (marks.length === 0) {
|
|
61
|
-
// No events — show entire span as running
|
|
62
|
-
segments.push({ startFraction: 0, endFraction: 1, status: 'running' });
|
|
63
|
-
return segments;
|
|
64
|
-
}
|
|
65
|
-
// Queued period: from span start to first event
|
|
66
|
-
const firstMark = marks[0];
|
|
67
|
-
const firstFraction = timeToFraction(firstMark.time, startTime, duration);
|
|
68
|
-
if (firstFraction > 0.001) {
|
|
69
|
-
segments.push({
|
|
70
|
-
startFraction: 0,
|
|
71
|
-
endFraction: firstFraction,
|
|
72
|
-
status: 'queued',
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
// Walk through events to build attempt/retry segments
|
|
76
|
-
for (let i = 0; i < marks.length; i++) {
|
|
77
|
-
const mark = marks[i];
|
|
78
|
-
const markFraction = timeToFraction(mark.time, startTime, duration);
|
|
79
|
-
const nextMark = marks[i + 1];
|
|
80
|
-
const nextFraction = nextMark
|
|
81
|
-
? timeToFraction(nextMark.time, startTime, duration)
|
|
82
|
-
: 1;
|
|
83
|
-
if (mark.type === 'step_started') {
|
|
84
|
-
// This is the start of an execution attempt.
|
|
85
|
-
// It runs until the next event (step_retrying or step_failed) or end of span.
|
|
86
|
-
const isLastMark = i === marks.length - 1;
|
|
87
|
-
if (isLastMark) {
|
|
88
|
-
// Last event is step_started — this attempt is either still running or succeeded
|
|
89
|
-
segments.push({
|
|
90
|
-
startFraction: markFraction,
|
|
91
|
-
endFraction: 1,
|
|
92
|
-
status: 'succeeded',
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
// Attempt runs until the next event
|
|
97
|
-
const nextType = nextMark.type;
|
|
98
|
-
const attemptStatus = nextType === 'step_retrying' || nextType === 'step_failed'
|
|
99
|
-
? 'failed'
|
|
100
|
-
: nextType === 'step_completed'
|
|
101
|
-
? 'succeeded'
|
|
102
|
-
: 'running';
|
|
103
|
-
segments.push({
|
|
104
|
-
startFraction: markFraction,
|
|
105
|
-
endFraction: nextFraction,
|
|
106
|
-
status: attemptStatus,
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
else if (mark.type === 'step_retrying') {
|
|
111
|
-
// Retry wait: from this event to the next step_started (or end)
|
|
112
|
-
segments.push({
|
|
113
|
-
startFraction: markFraction,
|
|
114
|
-
endFraction: nextFraction,
|
|
115
|
-
status: 'retrying',
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
else if (mark.type === 'step_failed') {
|
|
119
|
-
// Terminal failure: from this event to the end
|
|
120
|
-
if (markFraction < 0.999) {
|
|
121
|
-
segments.push({
|
|
122
|
-
startFraction: markFraction,
|
|
123
|
-
endFraction: 1,
|
|
124
|
-
status: 'failed',
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
else if (mark.type === 'step_completed') {
|
|
129
|
-
// Terminal success: do nothing here since the preceding step_started
|
|
130
|
-
// segment already terminates at this marker.
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
return segments;
|
|
134
|
-
}
|
|
135
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
136
|
-
// Hook segments
|
|
137
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
138
|
-
/**
|
|
139
|
-
* Compute segments for a hook span.
|
|
140
|
-
*
|
|
141
|
-
* Timeline: [waiting] → [received] → [disposed]
|
|
142
|
-
*/
|
|
143
|
-
function computeHookSegments(node) {
|
|
144
|
-
const events = node.events ? sortedEvents(node.events) : [];
|
|
145
|
-
const { startTime, duration } = node;
|
|
146
|
-
const segments = [];
|
|
147
|
-
if (duration <= 0)
|
|
148
|
-
return segments;
|
|
149
|
-
const receivedEvent = events.find((e) => e.event.name === 'hook_received');
|
|
150
|
-
const disposedEvent = events.find((e) => e.event.name === 'hook_disposed');
|
|
151
|
-
if (!receivedEvent && !disposedEvent) {
|
|
152
|
-
// Still waiting
|
|
153
|
-
segments.push({ startFraction: 0, endFraction: 1, status: 'waiting' });
|
|
154
|
-
return segments;
|
|
155
|
-
}
|
|
156
|
-
const receivedFraction = receivedEvent
|
|
157
|
-
? timeToFraction(receivedEvent.timestamp, startTime, duration)
|
|
158
|
-
: null;
|
|
159
|
-
const disposedFraction = disposedEvent
|
|
160
|
-
? timeToFraction(disposedEvent.timestamp, startTime, duration)
|
|
161
|
-
: null;
|
|
162
|
-
// Waiting period (before received)
|
|
163
|
-
if (receivedFraction !== null && receivedFraction > 0.001) {
|
|
164
|
-
segments.push({
|
|
165
|
-
startFraction: 0,
|
|
166
|
-
endFraction: receivedFraction,
|
|
167
|
-
status: 'waiting',
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
else if (receivedFraction === null && disposedFraction !== null) {
|
|
171
|
-
// Disposed without receiving — waiting the whole time
|
|
172
|
-
segments.push({
|
|
173
|
-
startFraction: 0,
|
|
174
|
-
endFraction: disposedFraction,
|
|
175
|
-
status: 'waiting',
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
// Received period
|
|
179
|
-
if (receivedFraction !== null) {
|
|
180
|
-
const end = disposedFraction ?? 1;
|
|
181
|
-
segments.push({
|
|
182
|
-
startFraction: receivedFraction,
|
|
183
|
-
endFraction: end,
|
|
184
|
-
status: 'received',
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
// Post-disposed (if there's remaining span after disposal)
|
|
188
|
-
if (disposedFraction !== null && disposedFraction < 0.999) {
|
|
189
|
-
segments.push({
|
|
190
|
-
startFraction: disposedFraction,
|
|
191
|
-
endFraction: 1,
|
|
192
|
-
status: 'succeeded',
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
return segments;
|
|
196
|
-
}
|
|
197
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
198
|
-
// Sleep segments
|
|
199
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
200
|
-
/**
|
|
201
|
-
* Compute segments for a sleep span.
|
|
202
|
-
*
|
|
203
|
-
* Timeline: [sleeping] → [completed]
|
|
204
|
-
*/
|
|
205
|
-
function computeSleepSegments(node) {
|
|
206
|
-
const events = node.events ? sortedEvents(node.events) : [];
|
|
207
|
-
const { startTime, duration } = node;
|
|
208
|
-
const segments = [];
|
|
209
|
-
if (duration <= 0)
|
|
210
|
-
return segments;
|
|
211
|
-
const completedEvent = events.find((e) => e.event.name === 'wait_completed');
|
|
212
|
-
if (!completedEvent) {
|
|
213
|
-
// Still sleeping
|
|
214
|
-
segments.push({ startFraction: 0, endFraction: 1, status: 'sleeping' });
|
|
215
|
-
return segments;
|
|
216
|
-
}
|
|
217
|
-
const completedFraction = timeToFraction(completedEvent.timestamp, startTime, duration);
|
|
218
|
-
if (completedFraction > 0.001) {
|
|
219
|
-
segments.push({
|
|
220
|
-
startFraction: 0,
|
|
221
|
-
endFraction: completedFraction,
|
|
222
|
-
status: 'sleeping',
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
segments.push({
|
|
226
|
-
startFraction: completedFraction,
|
|
227
|
-
endFraction: 1,
|
|
228
|
-
status: 'succeeded',
|
|
229
|
-
});
|
|
230
|
-
return segments;
|
|
231
|
-
}
|
|
232
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
233
|
-
// Run segments
|
|
234
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
235
|
-
/**
|
|
236
|
-
* Compute segments for a run span.
|
|
237
|
-
*
|
|
238
|
-
* Timeline: [queued] → [running] → [completed/failed]
|
|
239
|
-
*
|
|
240
|
-
* The queued period is derived from activeStartTime (run.startedAt).
|
|
241
|
-
* A synthetic run_started event is injected at that timestamp so
|
|
242
|
-
* the boundary is hoverable in the trace viewer.
|
|
243
|
-
*/
|
|
244
|
-
function computeRunSegments(node) {
|
|
245
|
-
const events = node.events ? sortedEvents(node.events) : [];
|
|
246
|
-
const { startTime, duration, activeStartTime } = node;
|
|
247
|
-
const segments = [];
|
|
248
|
-
if (duration <= 0)
|
|
249
|
-
return segments;
|
|
250
|
-
// V1 runs (specVersion 1) don't emit run lifecycle events (run_created,
|
|
251
|
-
// run_started, run_completed). Detect this by checking for the absence of
|
|
252
|
-
// run_created — it's always the first event for v2 runs and is always
|
|
253
|
-
// loaded in the first page, so its absence reliably signals a v1 run.
|
|
254
|
-
// For v1, fall back to the run entity's status from span.attributes.data.
|
|
255
|
-
const hasRunCreated = events.some((e) => e.event.name === 'run_created');
|
|
256
|
-
if (!hasRunCreated) {
|
|
257
|
-
const runData = node.span.attributes?.data;
|
|
258
|
-
const runStatus = runData?.status;
|
|
259
|
-
return computeV1RunSegments(startTime, duration, activeStartTime, runStatus);
|
|
260
|
-
}
|
|
261
|
-
const failedEvent = events.find((e) => e.event.name === 'run_failed');
|
|
262
|
-
const completedEvent = events.find((e) => e.event.name === 'run_completed');
|
|
263
|
-
// Queued period (from span start to activeStartTime)
|
|
264
|
-
let cursor = 0;
|
|
265
|
-
if (activeStartTime && activeStartTime > startTime) {
|
|
266
|
-
const queuedFraction = timeToFraction(activeStartTime, startTime, duration);
|
|
267
|
-
if (queuedFraction > 0.001) {
|
|
268
|
-
segments.push({
|
|
269
|
-
startFraction: 0,
|
|
270
|
-
endFraction: queuedFraction,
|
|
271
|
-
status: 'queued',
|
|
272
|
-
});
|
|
273
|
-
cursor = queuedFraction;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
if (failedEvent) {
|
|
277
|
-
const failedFraction = timeToFraction(failedEvent.timestamp, startTime, duration);
|
|
278
|
-
// Running until failure
|
|
279
|
-
if (failedFraction > cursor + 0.001) {
|
|
280
|
-
segments.push({
|
|
281
|
-
startFraction: cursor,
|
|
282
|
-
endFraction: failedFraction,
|
|
283
|
-
status: 'running',
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
segments.push({
|
|
287
|
-
startFraction: failedFraction,
|
|
288
|
-
endFraction: 1,
|
|
289
|
-
status: 'failed',
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
else if (completedEvent) {
|
|
293
|
-
const completedFraction = timeToFraction(completedEvent.timestamp, startTime, duration);
|
|
294
|
-
if (completedFraction > cursor + 0.001) {
|
|
295
|
-
segments.push({
|
|
296
|
-
startFraction: cursor,
|
|
297
|
-
endFraction: completedFraction,
|
|
298
|
-
status: 'running',
|
|
299
|
-
});
|
|
300
|
-
}
|
|
301
|
-
segments.push({
|
|
302
|
-
startFraction: completedFraction,
|
|
303
|
-
endFraction: 1,
|
|
304
|
-
status: 'succeeded',
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
else {
|
|
308
|
-
// Running to completion (or terminal events haven't loaded yet)
|
|
309
|
-
segments.push({
|
|
310
|
-
startFraction: cursor,
|
|
311
|
-
endFraction: 1,
|
|
312
|
-
status: 'running',
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
|
-
return segments;
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Compute segments for a v1 run using only the run entity's status and
|
|
319
|
-
* activeStartTime (derived from run.startedAt). V1 runs have no run
|
|
320
|
-
* lifecycle events, so we infer the visual segments from entity fields.
|
|
321
|
-
*/
|
|
322
|
-
function computeV1RunSegments(startTime, duration, activeStartTime, runStatus) {
|
|
323
|
-
const segments = [];
|
|
324
|
-
let cursor = 0;
|
|
325
|
-
if (activeStartTime && activeStartTime > startTime) {
|
|
326
|
-
const queuedFraction = timeToFraction(activeStartTime, startTime, duration);
|
|
327
|
-
if (queuedFraction > 0.001) {
|
|
328
|
-
segments.push({
|
|
329
|
-
startFraction: 0,
|
|
330
|
-
endFraction: queuedFraction,
|
|
331
|
-
status: 'queued',
|
|
332
|
-
});
|
|
333
|
-
cursor = queuedFraction;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
if (runStatus === 'failed') {
|
|
337
|
-
segments.push({
|
|
338
|
-
startFraction: cursor,
|
|
339
|
-
endFraction: 1,
|
|
340
|
-
status: 'failed',
|
|
341
|
-
});
|
|
342
|
-
}
|
|
343
|
-
else if (runStatus === 'completed' || runStatus === 'cancelled') {
|
|
344
|
-
segments.push({
|
|
345
|
-
startFraction: cursor,
|
|
346
|
-
endFraction: 1,
|
|
347
|
-
status: 'succeeded',
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
else {
|
|
351
|
-
segments.push({
|
|
352
|
-
startFraction: cursor,
|
|
353
|
-
endFraction: 1,
|
|
354
|
-
status: 'running',
|
|
355
|
-
});
|
|
356
|
-
}
|
|
357
|
-
return segments;
|
|
358
|
-
}
|
|
359
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
360
|
-
// Boundary computation
|
|
361
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
362
|
-
/** Event names to human-readable labels */
|
|
363
|
-
const EVENT_LABELS = {
|
|
364
|
-
step_started: 'Started',
|
|
365
|
-
step_retrying: 'Retrying',
|
|
366
|
-
step_failed: 'Failed',
|
|
367
|
-
hook_created: 'Created',
|
|
368
|
-
hook_received: 'Received',
|
|
369
|
-
hook_disposed: 'Resolved',
|
|
370
|
-
wait_created: 'Sleep started',
|
|
371
|
-
wait_completed: 'Sleep completed',
|
|
372
|
-
run_completed: 'Completed',
|
|
373
|
-
run_failed: 'Run failed',
|
|
374
|
-
step_completed: 'Completed',
|
|
375
|
-
};
|
|
376
|
-
/**
|
|
377
|
-
* Extract boundaries from a span's events. Each boundary sits at the
|
|
378
|
-
* fractional position of a relevant event within the span duration.
|
|
379
|
-
* Only includes events that are used as segment boundaries (not at the
|
|
380
|
-
* very start or very end of the span, to avoid edge clutter).
|
|
381
|
-
*/
|
|
382
|
-
function computeBoundaries(node, relevantEventNames) {
|
|
383
|
-
const events = node.events ? sortedEvents(node.events) : [];
|
|
384
|
-
const { startTime, duration } = node;
|
|
385
|
-
if (duration <= 0)
|
|
386
|
-
return [];
|
|
387
|
-
const boundaries = [];
|
|
388
|
-
for (const e of events) {
|
|
389
|
-
if (!relevantEventNames.includes(e.event.name))
|
|
390
|
-
continue;
|
|
391
|
-
const fraction = timeToFraction(e.timestamp, startTime, duration);
|
|
392
|
-
// Skip boundaries at the very edges (< 1% or > 99%) to avoid clutter
|
|
393
|
-
if (fraction < 0.01 || fraction > 0.99)
|
|
394
|
-
continue;
|
|
395
|
-
boundaries.push({
|
|
396
|
-
fraction,
|
|
397
|
-
label: EVENT_LABELS[e.event.name] ?? e.event.name,
|
|
398
|
-
offsetMs: e.timestamp - startTime,
|
|
399
|
-
});
|
|
400
|
-
}
|
|
401
|
-
return boundaries;
|
|
402
|
-
}
|
|
403
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
404
|
-
// Dispatcher
|
|
405
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
406
|
-
/**
|
|
407
|
-
* Compute the event-based segments and boundaries for a span based on its resource type.
|
|
408
|
-
* Returns empty arrays for 'default' (generic OTEL) spans.
|
|
409
|
-
*/
|
|
410
|
-
export function computeSegments(resourceType, node) {
|
|
411
|
-
switch (resourceType) {
|
|
412
|
-
case 'step':
|
|
413
|
-
return {
|
|
414
|
-
segments: computeStepSegments(node),
|
|
415
|
-
boundaries: computeBoundaries(node, [
|
|
416
|
-
'step_started',
|
|
417
|
-
'step_retrying',
|
|
418
|
-
'step_failed',
|
|
419
|
-
'step_completed',
|
|
420
|
-
]),
|
|
421
|
-
};
|
|
422
|
-
case 'hook':
|
|
423
|
-
return {
|
|
424
|
-
segments: computeHookSegments(node),
|
|
425
|
-
boundaries: computeBoundaries(node, [
|
|
426
|
-
'hook_created',
|
|
427
|
-
'hook_received',
|
|
428
|
-
'hook_disposed',
|
|
429
|
-
]),
|
|
430
|
-
};
|
|
431
|
-
case 'sleep':
|
|
432
|
-
return {
|
|
433
|
-
segments: computeSleepSegments(node),
|
|
434
|
-
boundaries: computeBoundaries(node, ['wait_created', 'wait_completed']),
|
|
435
|
-
};
|
|
436
|
-
case 'run':
|
|
437
|
-
return {
|
|
438
|
-
segments: computeRunSegments(node),
|
|
439
|
-
boundaries: computeBoundaries(node, ['run_completed', 'run_failed']),
|
|
440
|
-
};
|
|
441
|
-
default:
|
|
442
|
-
return { segments: [], boundaries: [] };
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bhbi1zZWdtZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3RyYWNlLXZpZXdlci9jb21wb25lbnRzL3NwYW4tc2VnbWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbURBLDZFQUE2RTtBQUM3RSw2REFBNkQ7QUFDN0QsNkVBQTZFO0FBRTdFOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFrQztJQUM5RCxNQUFNLEVBQUUsV0FBVztJQUNuQixPQUFPLEVBQUUsWUFBWTtJQUNyQixNQUFNLEVBQUUsV0FBVztJQUNuQixRQUFRLEVBQUUsYUFBYTtJQUN2QixTQUFTLEVBQUUsY0FBYztJQUN6QixPQUFPLEVBQUUsWUFBWTtJQUNyQixRQUFRLEVBQUUsYUFBYTtJQUN2QixRQUFRLEVBQUUsYUFBYTtDQUN4QixDQUFDO0FBRUYsNkVBQTZFO0FBQzdFLFVBQVU7QUFDViw2RUFBNkU7QUFFN0UsU0FBUyxhQUFhLENBQUMsS0FBYTtJQUNsQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUNyQixJQUFZLEVBQ1osU0FBaUIsRUFDakIsWUFBb0I7SUFFcEIsSUFBSSxZQUFZLElBQUksQ0FBQztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sYUFBYSxDQUFDLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsWUFBWSxDQUFDLE1BQXVCO0lBQzNDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FB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YixnQkFBZ0I7aUJBQ2pCLENBQUM7YUFDSCxDQUFDO1FBQ0osS0FBSyxNQUFNO1lBQ1QsT0FBTztnQkFDTCxRQUFRLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxDQUFDO2dCQUNuQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxFQUFFO29CQUNsQyxjQUFjO29CQUNkLGVBQWU7b0JBQ2YsZUFBZTtpQkFDaEIsQ0FBQzthQUNILENBQUM7UUFDSixLQUFLLE9BQU87WUFDVixPQUFPO2dCQUNMLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7Z0JBQ3BDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxjQUFjLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQzthQUN4RSxDQUFDO1FBQ0osS0FBSyxLQUFLO1lBQ1IsT0FBTztnQkFDTCxRQUFRLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDO2dCQUNsQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUMsZUFBZSxFQUFFLFlBQVksQ0FBQyxDQUFDO2FBQ3JFLENBQUM7UUFDSjtZQUNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3Bhbk5vZGUsIFNwYW5Ob2RlRXZlbnQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlVHlwZSB9IGZyb20gJy4vc3Bhbi1zdHJhdGVnaWVzJztcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTZWdtZW50IHR5cGVzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBWaXN1YWwgc3RhdHVzIG9mIGEgc2VnbWVudCB3aXRoaW4gYSBzcGFuIGJhci5cbiAqXG4gKiAtIHF1ZXVlZDogICAgIFdhaXRpbmcgdG8gc3RhcnQgKGhhdGNoZWQgcGF0dGVybilcbiAqIC0gcnVubmluZzogICAgQWN0aXZlbHkgZXhlY3V0aW5nIChzb2xpZCBibHVlKVxuICogLSBmYWlsZWQ6ICAgICBBdHRlbXB0IHRoYXQgZW5kZWQgaW4gZmFpbHVyZSAoc29mdCByZWQpXG4gKiAtIHJldHJ5aW5nOiAgIFdhaXRpbmcgYmV0d2VlbiByZXRyeSBhdHRlbXB0cyAoaGF0Y2hlZCBwYXR0ZXJuKVxuICogLSBzdWNjZWVkZWQ6ICBGaW5hbCBzdWNjZXNzZnVsIGF0dGVtcHQgKHNvZnQgZ3JlZW4pXG4gKiAtIHdhaXRpbmc6ICAgIFBhc3NpdmUgd2FpdGluZywgZS5nLiBob29rIHdhaXRpbmcgZm9yIHBheWxvYWQgKGhhdGNoZWQgcGF0dGVybilcbiAqIC0gc2xlZXBpbmc6ICAgU2xlZXAgaW4gcHJvZ3Jlc3MgKHNvZnQgYW1iZXIpXG4gKiAtIHJlY2VpdmVkOiAgIEhvb2sgcmVjZWl2ZWQgYSBwYXlsb2FkIChzb2Z0IGJsdWUpXG4gKi9cbmV4cG9ydCB0eXBlIFNlZ21lbnRTdGF0dXMgPVxuICB8ICdxdWV1ZWQnXG4gIHwgJ3J1bm5pbmcnXG4gIHwgJ2ZhaWxlZCdcbiAgfCAncmV0cnlpbmcnXG4gIHwgJ3N1Y2NlZWRlZCdcbiAgfCAnd2FpdGluZydcbiAgfCAnc2xlZXBpbmcnXG4gIHwgJ3JlY2VpdmVkJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWdtZW50IHtcbiAgLyoqIEZyYWN0aW9uIG9mIHNwYW4gd2lkdGggd2hlcmUgdGhpcyBzZWdtZW50IHN0YXJ0cyAoMOKAkzEpICovXG4gIHN0YXJ0RnJhY3Rpb246IG51bWJlcjtcbiAgLyoqIEZyYWN0aW9uIG9mIHNwYW4gd2lkdGggd2hlcmUgdGhpcyBzZWdtZW50IGVuZHMgKDDigJMxKSAqL1xuICBlbmRGcmFjdGlvbjogbnVtYmVyO1xuICAvKiogVmlzdWFsIHN0YXR1cyBjb250cm9sbGluZyBjb2xvci9wYXR0ZXJuICovXG4gIHN0YXR1czogU2VnbWVudFN0YXR1cztcbn1cblxuLyoqXG4gKiBBIGJvdW5kYXJ5IGJldHdlZW4gdHdvIHNlZ21lbnRzLCByZXByZXNlbnRpbmcgYW4gZXZlbnQgdGhhdCBjYXVzZWRcbiAqIGEgdHJhbnNpdGlvbi4gUmVuZGVyZWQgYXMgYSBob3ZlcmFibGUgZGl2aWRlciB3aXRoIGEgdG9vbHRpcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWdtZW50Qm91bmRhcnkge1xuICAvKiogRnJhY3Rpb25hbCBwb3NpdGlvbiBhbG9uZyB0aGUgc3BhbiAoMOKAkzEpICovXG4gIGZyYWN0aW9uOiBudW1iZXI7XG4gIC8qKiBEaXNwbGF5IGxhYmVsIGZvciB0aGUgdG9vbHRpcCAoZS5nLiBcInN0ZXBfc3RhcnRlZFwiKSAqL1xuICBsYWJlbDogc3RyaW5nO1xuICAvKiogRm9ybWF0dGVkIHRpbWVzdGFtcCByZWxhdGl2ZSB0byBzcGFuIHN0YXJ0ICovXG4gIG9mZnNldE1zOiBudW1iZXI7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQ1NTIGNsYXNzIG1hcHBpbmcgKHNlZ21lbnQgc3RhdHVzIOKGkiBtb2R1bGUgQ1NTIGNsYXNzIG5hbWUpXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBNYXBzIGEgU2VnbWVudFN0YXR1cyB0byB0aGUgQ1NTIG1vZHVsZSBjbGFzcyBuYW1lIHRvIHVzZS5cbiAqIFRoZXNlIGNsYXNzIG5hbWVzIG11c3QgZXhpc3QgaW4gdHJhY2Utdmlld2VyLm1vZHVsZS5jc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBTRUdNRU5UX0NMQVNTX01BUDogUmVjb3JkPFNlZ21lbnRTdGF0dXMsIHN0cmluZz4gPSB7XG4gIHF1ZXVlZDogJ3NlZ1F1ZXVlZCcsXG4gIHJ1bm5pbmc6ICdzZWdSdW5uaW5nJyxcbiAgZmFpbGVkOiAnc2VnRmFpbGVkJyxcbiAgcmV0cnlpbmc6ICdzZWdSZXRyeWluZycsXG4gIHN1Y2NlZWRlZDogJ3NlZ1N1Y2NlZWRlZCcsXG4gIHdhaXRpbmc6ICdzZWdXYWl0aW5nJyxcbiAgc2xlZXBpbmc6ICdzZWdTbGVlcGluZycsXG4gIHJlY2VpdmVkOiAnc2VnUmVjZWl2ZWQnLFxufTtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBIZWxwZXJzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gY2xhbXBGcmFjdGlvbih2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIHRpbWVUb0ZyYWN0aW9uKFxuICB0aW1lOiBudW1iZXIsXG4gIHNwYW5TdGFydDogbnVtYmVyLFxuICBzcGFuRHVyYXRpb246IG51bWJlclxuKTogbnVtYmVyIHtcbiAgaWYgKHNwYW5EdXJhdGlvbiA8PSAwKSByZXR1cm4gMDtcbiAgcmV0dXJuIGNsYW1wRnJhY3Rpb24oKHRpbWUgLSBzcGFuU3RhcnQpIC8gc3BhbkR1cmF0aW9uKTtcbn1cblxuLyoqXG4gKiBTb3J0IGV2ZW50cyBieSB0aW1lc3RhbXAgYXNjZW5kaW5nLlxuICovXG5mdW5jdGlvbiBzb3J0ZWRFdmVudHMoZXZlbnRzOiBTcGFuTm9kZUV2ZW50W10pOiBTcGFuTm9kZUV2ZW50W10ge1xuICByZXR1cm4gWy4uLmV2ZW50c10uc29ydCgoYSwgYikgPT4gYS50aW1lc3RhbXAgLSBiLnRpbWVzdGFtcCk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gU3RlcCBzZWdtZW50c1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQ29tcHV0ZSBzZWdtZW50cyBmb3IgYSBzdGVwIHNwYW4uXG4gKlxuICogVGltZWxpbmU6IFtxdWV1ZWRdIOKGkiBbYXR0ZW1wdOKCgSAoZmFpbCldIOKGkiBbcmV0cnkgd2FpdF0g4oaSIFthdHRlbXB04oKCIChmYWlsKV0g4oaSIC4uLiDihpIgW2F0dGVtcHTigpkgKHN1Y2Nlc3MpXVxuICpcbiAqIEV2ZW50cyB1c2VkOiBzdGVwX3N0YXJ0ZWQsIHN0ZXBfcmV0cnlpbmcsIHN0ZXBfZmFpbGVkLCBzdGVwX2NvbXBsZXRlZFxuICogVGhlIGZpbmFsIHNlZ21lbnQgaXMgJ3N1Y2NlZWRlZCcgaWYgbm8gdHJhaWxpbmcgc3RlcF9yZXRyeWluZy9zdGVwX2ZhaWxlZC5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZVN0ZXBTZWdtZW50cyhub2RlOiBTcGFuTm9kZSk6IFNlZ21lbnRbXSB7XG4gIGNvbnN0IGV2ZW50cyA9IG5vZGUuZXZlbnRzID8gc29ydGVkRXZlbnRzKG5vZGUuZXZlbnRzKSA6IFtdO1xuICBjb25zdCB7IHN0YXJ0VGltZSwgZHVyYXRpb24gfSA9IG5vZGU7XG4gIGNvbnN0IHNlZ21lbnRzOiBTZWdtZW50W10gPSBbXTtcblxuICBpZiAoZHVyYXRpb24gPD0gMCkgcmV0dXJuIHNlZ21lbnRzO1xuXG4gIC8vIEJ1aWxkIGEgdGltZWxpbmUgb2YgZXZlbnQgYm91bmRhcmllc1xuICBpbnRlcmZhY2UgRXZlbnRNYXJrIHtcbiAgICB0aW1lOiBudW1iZXI7XG4gICAgdHlwZTogc3RyaW5nO1xuICB9XG4gIGNvbnN0IG1hcmtzOiBFdmVudE1hcmtbXSA9IGV2ZW50c1xuICAgIC5maWx0ZXIoKGUpID0+XG4gICAgICBbXG4gICAgICAgICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAnc3RlcF9yZXRyeWluZycsXG4gICAgICAgICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICdzdGVwX2NvbXBsZXRlZCcsXG4gICAgICBdLmluY2x1ZGVzKGUuZXZlbnQubmFtZSlcbiAgICApXG4gICAgLm1hcCgoZSkgPT4gKHsgdGltZTogZS50aW1lc3RhbXAsIHR5cGU6IGUuZXZlbnQubmFtZSB9KSk7XG5cbiAgaWYgKG1hcmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIE5vIGV2ZW50cyDigJQgc2hvdyBlbnRpcmUgc3BhbiBhcyBydW5uaW5nXG4gICAgc2VnbWVudHMucHVzaCh7IHN0YXJ0RnJhY3Rpb246IDAsIGVuZEZyYWN0aW9uOiAxLCBzdGF0dXM6ICdydW5uaW5nJyB9KTtcbiAgICByZXR1cm4gc2VnbWVudHM7XG4gIH1cblxuICAvLyBRdWV1ZWQgcGVyaW9kOiBmcm9tIHNwYW4gc3RhcnQgdG8gZmlyc3QgZXZlbnRcbiAgY29uc3QgZmlyc3RNYXJrID0gbWFya3NbMF07XG4gIGNvbnN0IGZpcnN0RnJhY3Rpb24gPSB0aW1lVG9GcmFjdGlvbihmaXJzdE1hcmsudGltZSwgc3RhcnRUaW1lLCBkdXJhdGlvbik7XG4gIGlmIChmaXJzdEZyYWN0aW9uID4gMC4wMDEpIHtcbiAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgIHN0YXJ0RnJhY3Rpb246IDAsXG4gICAgICBlbmRGcmFjdGlvbjogZmlyc3RGcmFjdGlvbixcbiAgICAgIHN0YXR1czogJ3F1ZXVlZCcsXG4gICAgfSk7XG4gIH1cblxuICAvLyBXYWxrIHRocm91Z2ggZXZlbnRzIHRvIGJ1aWxkIGF0dGVtcHQvcmV0cnkgc2VnbWVudHNcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG1hcmsgPSBtYXJrc1tpXTtcbiAgICBjb25zdCBtYXJrRnJhY3Rpb24gPSB0aW1lVG9GcmFjdGlvbihtYXJrLnRpbWUsIHN0YXJ0VGltZSwgZHVyYXRpb24pO1xuICAgIGNvbnN0IG5leHRNYXJrID0gbWFya3NbaSArIDFdO1xuICAgIGNvbnN0IG5leHRGcmFjdGlvbiA9IG5leHRNYXJrXG4gICAgICA/IHRpbWVUb0ZyYWN0aW9uKG5leHRNYXJrLnRpbWUsIHN0YXJ0VGltZSwgZHVyYXRpb24pXG4gICAgICA6IDE7XG5cbiAgICBpZiAobWFyay50eXBlID09PSAnc3RlcF9zdGFydGVkJykge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgc3RhcnQgb2YgYW4gZXhlY3V0aW9uIGF0dGVtcHQuXG4gICAgICAvLyBJdCBydW5zIHVudGlsIHRoZSBuZXh0IGV2ZW50IChzdGVwX3JldHJ5aW5nIG9yIHN0ZXBfZmFpbGVkKSBvciBlbmQgb2Ygc3Bhbi5cbiAgICAgIGNvbnN0IGlzTGFzdE1hcmsgPSBpID09PSBtYXJrcy5sZW5ndGggLSAxO1xuICAgICAgaWYgKGlzTGFzdE1hcmspIHtcbiAgICAgICAgLy8gTGFzdCBldmVudCBpcyBzdGVwX3N0YXJ0ZWQg4oCUIHRoaXMgYXR0ZW1wdCBpcyBlaXRoZXIgc3RpbGwgcnVubmluZyBvciBzdWNjZWVkZWRcbiAgICAgICAgc2VnbWVudHMucHVzaCh7XG4gICAgICAgICAgc3RhcnRGcmFjdGlvbjogbWFya0ZyYWN0aW9uLFxuICAgICAgICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgICAgICAgIHN0YXR1czogJ3N1Y2NlZWRlZCcsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQXR0ZW1wdCBydW5zIHVudGlsIHRoZSBuZXh0IGV2ZW50XG4gICAgICAgIGNvbnN0IG5leHRUeXBlID0gbmV4dE1hcmsudHlwZTtcbiAgICAgICAgY29uc3QgYXR0ZW1wdFN0YXR1czogU2VnbWVudFN0YXR1cyA9XG4gICAgICAgICAgbmV4dFR5cGUgPT09ICdzdGVwX3JldHJ5aW5nJyB8fCBuZXh0VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJ1xuICAgICAgICAgICAgPyAnZmFpbGVkJ1xuICAgICAgICAgICAgOiBuZXh0VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJ1xuICAgICAgICAgICAgICA/ICdzdWNjZWVkZWQnXG4gICAgICAgICAgICAgIDogJ3J1bm5pbmcnO1xuICAgICAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgICAgICBzdGFydEZyYWN0aW9uOiBtYXJrRnJhY3Rpb24sXG4gICAgICAgICAgZW5kRnJhY3Rpb246IG5leHRGcmFjdGlvbixcbiAgICAgICAgICBzdGF0dXM6IGF0dGVtcHRTdGF0dXMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobWFyay50eXBlID09PSAnc3RlcF9yZXRyeWluZycpIHtcbiAgICAgIC8vIFJldHJ5IHdhaXQ6IGZyb20gdGhpcyBldmVudCB0byB0aGUgbmV4dCBzdGVwX3N0YXJ0ZWQgKG9yIGVuZClcbiAgICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgICBzdGFydEZyYWN0aW9uOiBtYXJrRnJhY3Rpb24sXG4gICAgICAgIGVuZEZyYWN0aW9uOiBuZXh0RnJhY3Rpb24sXG4gICAgICAgIHN0YXR1czogJ3JldHJ5aW5nJyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAobWFyay50eXBlID09PSAnc3RlcF9mYWlsZWQnKSB7XG4gICAgICAvLyBUZXJtaW5hbCBmYWlsdXJlOiBmcm9tIHRoaXMgZXZlbnQgdG8gdGhlIGVuZFxuICAgICAgaWYgKG1hcmtGcmFjdGlvbiA8IDAuOTk5KSB7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgICAgIHN0YXJ0RnJhY3Rpb246IG1hcmtGcmFjdGlvbixcbiAgICAgICAgICBlbmRGcmFjdGlvbjogMSxcbiAgICAgICAgICBzdGF0dXM6ICdmYWlsZWQnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1hcmsudHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJykge1xuICAgICAgLy8gVGVybWluYWwgc3VjY2VzczogZG8gbm90aGluZyBoZXJlIHNpbmNlIHRoZSBwcmVjZWRpbmcgc3RlcF9zdGFydGVkXG4gICAgICAvLyBzZWdtZW50IGFscmVhZHkgdGVybWluYXRlcyBhdCB0aGlzIG1hcmtlci5cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2VnbWVudHM7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gSG9vayBzZWdtZW50c1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQ29tcHV0ZSBzZWdtZW50cyBmb3IgYSBob29rIHNwYW4uXG4gKlxuICogVGltZWxpbmU6IFt3YWl0aW5nXSDihpIgW3JlY2VpdmVkXSDihpIgW2Rpc3Bvc2VkXVxuICovXG5mdW5jdGlvbiBjb21wdXRlSG9va1NlZ21lbnRzKG5vZGU6IFNwYW5Ob2RlKTogU2VnbWVudFtdIHtcbiAgY29uc3QgZXZlbnRzID0gbm9kZS5ldmVudHMgPyBzb3J0ZWRFdmVudHMobm9kZS5ldmVudHMpIDogW107XG4gIGNvbnN0IHsgc3RhcnRUaW1lLCBkdXJhdGlvbiB9ID0gbm9kZTtcbiAgY29uc3Qgc2VnbWVudHM6IFNlZ21lbnRbXSA9IFtdO1xuXG4gIGlmIChkdXJhdGlvbiA8PSAwKSByZXR1cm4gc2VnbWVudHM7XG5cbiAgY29uc3QgcmVjZWl2ZWRFdmVudCA9IGV2ZW50cy5maW5kKChlKSA9PiBlLmV2ZW50Lm5hbWUgPT09ICdob29rX3JlY2VpdmVkJyk7XG4gIGNvbnN0IGRpc3Bvc2VkRXZlbnQgPSBldmVudHMuZmluZCgoZSkgPT4gZS5ldmVudC5uYW1lID09PSAnaG9va19kaXNwb3NlZCcpO1xuXG4gIGlmICghcmVjZWl2ZWRFdmVudCAmJiAhZGlzcG9zZWRFdmVudCkge1xuICAgIC8vIFN0aWxsIHdhaXRpbmdcbiAgICBzZWdtZW50cy5wdXNoKHsgc3RhcnRGcmFjdGlvbjogMCwgZW5kRnJhY3Rpb246IDEsIHN0YXR1czogJ3dhaXRpbmcnIH0pO1xuICAgIHJldHVybiBzZWdtZW50cztcbiAgfVxuXG4gIGNvbnN0IHJlY2VpdmVkRnJhY3Rpb24gPSByZWNlaXZlZEV2ZW50XG4gICAgPyB0aW1lVG9GcmFjdGlvbihyZWNlaXZlZEV2ZW50LnRpbWVzdGFtcCwgc3RhcnRUaW1lLCBkdXJhdGlvbilcbiAgICA6IG51bGw7XG4gIGNvbnN0IGRpc3Bvc2VkRnJhY3Rpb24gPSBkaXNwb3NlZEV2ZW50XG4gICAgPyB0aW1lVG9GcmFjdGlvbihkaXNwb3NlZEV2ZW50LnRpbWVzdGFtcCwgc3RhcnRUaW1lLCBkdXJhdGlvbilcbiAgICA6IG51bGw7XG5cbiAgLy8gV2FpdGluZyBwZXJpb2QgKGJlZm9yZSByZWNlaXZlZClcbiAgaWYgKHJlY2VpdmVkRnJhY3Rpb24gIT09IG51bGwgJiYgcmVjZWl2ZWRGcmFjdGlvbiA+IDAuMDAxKSB7XG4gICAgc2VnbWVudHMucHVzaCh7XG4gICAgICBzdGFydEZyYWN0aW9uOiAwLFxuICAgICAgZW5kRnJhY3Rpb246IHJlY2VpdmVkRnJhY3Rpb24sXG4gICAgICBzdGF0dXM6ICd3YWl0aW5nJyxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChyZWNlaXZlZEZyYWN0aW9uID09PSBudWxsICYmIGRpc3Bvc2VkRnJhY3Rpb24gIT09IG51bGwpIHtcbiAgICAvLyBEaXNwb3NlZCB3aXRob3V0IHJlY2VpdmluZyDigJQgd2FpdGluZyB0aGUgd2hvbGUgdGltZVxuICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgc3RhcnRGcmFjdGlvbjogMCxcbiAgICAgIGVuZEZyYWN0aW9uOiBkaXNwb3NlZEZyYWN0aW9uLFxuICAgICAgc3RhdHVzOiAnd2FpdGluZycsXG4gICAgfSk7XG4gIH1cblxuICAvLyBSZWNlaXZlZCBwZXJpb2RcbiAgaWYgKHJlY2VpdmVkRnJhY3Rpb24gIT09IG51bGwpIHtcbiAgICBjb25zdCBlbmQgPSBkaXNwb3NlZEZyYWN0aW9uID8/IDE7XG4gICAgc2VnbWVudHMucHVzaCh7XG4gICAgICBzdGFydEZyYWN0aW9uOiByZWNlaXZlZEZyYWN0aW9uLFxuICAgICAgZW5kRnJhY3Rpb246IGVuZCxcbiAgICAgIHN0YXR1czogJ3JlY2VpdmVkJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFBvc3QtZGlzcG9zZWQgKGlmIHRoZXJlJ3MgcmVtYWluaW5nIHNwYW4gYWZ0ZXIgZGlzcG9zYWwpXG4gIGlmIChkaXNwb3NlZEZyYWN0aW9uICE9PSBudWxsICYmIGRpc3Bvc2VkRnJhY3Rpb24gPCAwLjk5OSkge1xuICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgc3RhcnRGcmFjdGlvbjogZGlzcG9zZWRGcmFjdGlvbixcbiAgICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgICAgc3RhdHVzOiAnc3VjY2VlZGVkJyxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzZWdtZW50cztcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTbGVlcCBzZWdtZW50c1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQ29tcHV0ZSBzZWdtZW50cyBmb3IgYSBzbGVlcCBzcGFuLlxuICpcbiAqIFRpbWVsaW5lOiBbc2xlZXBpbmddIOKGkiBbY29tcGxldGVkXVxuICovXG5mdW5jdGlvbiBjb21wdXRlU2xlZXBTZWdtZW50cyhub2RlOiBTcGFuTm9kZSk6IFNlZ21lbnRbXSB7XG4gIGNvbnN0IGV2ZW50cyA9IG5vZGUuZXZlbnRzID8gc29ydGVkRXZlbnRzKG5vZGUuZXZlbnRzKSA6IFtdO1xuICBjb25zdCB7IHN0YXJ0VGltZSwgZHVyYXRpb24gfSA9IG5vZGU7XG4gIGNvbnN0IHNlZ21lbnRzOiBTZWdtZW50W10gPSBbXTtcblxuICBpZiAoZHVyYXRpb24gPD0gMCkgcmV0dXJuIHNlZ21lbnRzO1xuXG4gIGNvbnN0IGNvbXBsZXRlZEV2ZW50ID0gZXZlbnRzLmZpbmQoKGUpID0+IGUuZXZlbnQubmFtZSA9PT0gJ3dhaXRfY29tcGxldGVkJyk7XG5cbiAgaWYgKCFjb21wbGV0ZWRFdmVudCkge1xuICAgIC8vIFN0aWxsIHNsZWVwaW5nXG4gICAgc2VnbWVudHMucHVzaCh7IHN0YXJ0RnJhY3Rpb246IDAsIGVuZEZyYWN0aW9uOiAxLCBzdGF0dXM6ICdzbGVlcGluZycgfSk7XG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9XG5cbiAgY29uc3QgY29tcGxldGVkRnJhY3Rpb24gPSB0aW1lVG9GcmFjdGlvbihcbiAgICBjb21wbGV0ZWRFdmVudC50aW1lc3RhbXAsXG4gICAgc3RhcnRUaW1lLFxuICAgIGR1cmF0aW9uXG4gICk7XG5cbiAgaWYgKGNvbXBsZXRlZEZyYWN0aW9uID4gMC4wMDEpIHtcbiAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgIHN0YXJ0RnJhY3Rpb246IDAsXG4gICAgICBlbmRGcmFjdGlvbjogY29tcGxldGVkRnJhY3Rpb24sXG4gICAgICBzdGF0dXM6ICdzbGVlcGluZycsXG4gICAgfSk7XG4gIH1cblxuICBzZWdtZW50cy5wdXNoKHtcbiAgICBzdGFydEZyYWN0aW9uOiBjb21wbGV0ZWRGcmFjdGlvbixcbiAgICBlbmRGcmFjdGlvbjogMSxcbiAgICBzdGF0dXM6ICdzdWNjZWVkZWQnLFxuICB9KTtcblxuICByZXR1cm4gc2VnbWVudHM7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gUnVuIHNlZ21lbnRzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBDb21wdXRlIHNlZ21lbnRzIGZvciBhIHJ1biBzcGFuLlxuICpcbiAqIFRpbWVsaW5lOiBbcXVldWVkXSDihpIgW3J1bm5pbmddIOKGkiBbY29tcGxldGVkL2ZhaWxlZF1cbiAqXG4gKiBUaGUgcXVldWVkIHBlcmlvZCBpcyBkZXJpdmVkIGZyb20gYWN0aXZlU3RhcnRUaW1lIChydW4uc3RhcnRlZEF0KS5cbiAqIEEgc3ludGhldGljIHJ1bl9zdGFydGVkIGV2ZW50IGlzIGluamVjdGVkIGF0IHRoYXQgdGltZXN0YW1wIHNvXG4gKiB0aGUgYm91bmRhcnkgaXMgaG92ZXJhYmxlIGluIHRoZSB0cmFjZSB2aWV3ZXIuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVSdW5TZWdtZW50cyhub2RlOiBTcGFuTm9kZSk6IFNlZ21lbnRbXSB7XG4gIGNvbnN0IGV2ZW50cyA9IG5vZGUuZXZlbnRzID8gc29ydGVkRXZlbnRzKG5vZGUuZXZlbnRzKSA6IFtdO1xuICBjb25zdCB7IHN0YXJ0VGltZSwgZHVyYXRpb24sIGFjdGl2ZVN0YXJ0VGltZSB9ID0gbm9kZTtcbiAgY29uc3Qgc2VnbWVudHM6IFNlZ21lbnRbXSA9IFtdO1xuXG4gIGlmIChkdXJhdGlvbiA8PSAwKSByZXR1cm4gc2VnbWVudHM7XG5cbiAgLy8gVjEgcnVucyAoc3BlY1ZlcnNpb24gMSkgZG9uJ3QgZW1pdCBydW4gbGlmZWN5Y2xlIGV2ZW50cyAocnVuX2NyZWF0ZWQsXG4gIC8vIHJ1bl9zdGFydGVkLCBydW5fY29tcGxldGVkKS4gRGV0ZWN0IHRoaXMgYnkgY2hlY2tpbmcgZm9yIHRoZSBhYnNlbmNlIG9mXG4gIC8vIHJ1bl9jcmVhdGVkIOKAlCBpdCdzIGFsd2F5cyB0aGUgZmlyc3QgZXZlbnQgZm9yIHYyIHJ1bnMgYW5kIGlzIGFsd2F5c1xuICAvLyBsb2FkZWQgaW4gdGhlIGZpcnN0IHBhZ2UsIHNvIGl0cyBhYnNlbmNlIHJlbGlhYmx5IHNpZ25hbHMgYSB2MSBydW4uXG4gIC8vIEZvciB2MSwgZmFsbCBiYWNrIHRvIHRoZSBydW4gZW50aXR5J3Mgc3RhdHVzIGZyb20gc3Bhbi5hdHRyaWJ1dGVzLmRhdGEuXG4gIGNvbnN0IGhhc1J1bkNyZWF0ZWQgPSBldmVudHMuc29tZSgoZSkgPT4gZS5ldmVudC5uYW1lID09PSAncnVuX2NyZWF0ZWQnKTtcblxuICBpZiAoIWhhc1J1bkNyZWF0ZWQpIHtcbiAgICBjb25zdCBydW5EYXRhID0gbm9kZS5zcGFuLmF0dHJpYnV0ZXM/LmRhdGEgYXNcbiAgICAgIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJ1blN0YXR1cyA9IHJ1bkRhdGE/LnN0YXR1cyBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNvbXB1dGVWMVJ1blNlZ21lbnRzKFxuICAgICAgc3RhcnRUaW1lLFxuICAgICAgZHVyYXRpb24sXG4gICAgICBhY3RpdmVTdGFydFRpbWUsXG4gICAgICBydW5TdGF0dXNcbiAgICApO1xuICB9XG5cbiAgY29uc3QgZmFpbGVkRXZlbnQgPSBldmVudHMuZmluZCgoZSkgPT4gZS5ldmVudC5uYW1lID09PSAncnVuX2ZhaWxlZCcpO1xuICBjb25zdCBjb21wbGV0ZWRFdmVudCA9IGV2ZW50cy5maW5kKChlKSA9PiBlLmV2ZW50Lm5hbWUgPT09ICdydW5fY29tcGxldGVkJyk7XG5cbiAgLy8gUXVldWVkIHBlcmlvZCAoZnJvbSBzcGFuIHN0YXJ0IHRvIGFjdGl2ZVN0YXJ0VGltZSlcbiAgbGV0IGN1cnNvciA9IDA7XG4gIGlmIChhY3RpdmVTdGFydFRpbWUgJiYgYWN0aXZlU3RhcnRUaW1lID4gc3RhcnRUaW1lKSB7XG4gICAgY29uc3QgcXVldWVkRnJhY3Rpb24gPSB0aW1lVG9GcmFjdGlvbihhY3RpdmVTdGFydFRpbWUsIHN0YXJ0VGltZSwgZHVyYXRpb24pO1xuICAgIGlmIChxdWV1ZWRGcmFjdGlvbiA+IDAuMDAxKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgICAgc3RhcnRGcmFjdGlvbjogMCxcbiAgICAgICAgZW5kRnJhY3Rpb246IHF1ZXVlZEZyYWN0aW9uLFxuICAgICAgICBzdGF0dXM6ICdxdWV1ZWQnLFxuICAgICAgfSk7XG4gICAgICBjdXJzb3IgPSBxdWV1ZWRGcmFjdGlvbjtcbiAgICB9XG4gIH1cblxuICBpZiAoZmFpbGVkRXZlbnQpIHtcbiAgICBjb25zdCBmYWlsZWRGcmFjdGlvbiA9IHRpbWVUb0ZyYWN0aW9uKFxuICAgICAgZmFpbGVkRXZlbnQudGltZXN0YW1wLFxuICAgICAgc3RhcnRUaW1lLFxuICAgICAgZHVyYXRpb25cbiAgICApO1xuICAgIC8vIFJ1bm5pbmcgdW50aWwgZmFpbHVyZVxuICAgIGlmIChmYWlsZWRGcmFjdGlvbiA+IGN1cnNvciArIDAuMDAxKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgICAgc3RhcnRGcmFjdGlvbjogY3Vyc29yLFxuICAgICAgICBlbmRGcmFjdGlvbjogZmFpbGVkRnJhY3Rpb24sXG4gICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgc3RhcnRGcmFjdGlvbjogZmFpbGVkRnJhY3Rpb24sXG4gICAgICBlbmRGcmFjdGlvbjogMSxcbiAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoY29tcGxldGVkRXZlbnQpIHtcbiAgICBjb25zdCBjb21wbGV0ZWRGcmFjdGlvbiA9IHRpbWVUb0ZyYWN0aW9uKFxuICAgICAgY29tcGxldGVkRXZlbnQudGltZXN0YW1wLFxuICAgICAgc3RhcnRUaW1lLFxuICAgICAgZHVyYXRpb25cbiAgICApO1xuICAgIGlmIChjb21wbGV0ZWRGcmFjdGlvbiA+IGN1cnNvciArIDAuMDAxKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgICAgc3RhcnRGcmFjdGlvbjogY3Vyc29yLFxuICAgICAgICBlbmRGcmFjdGlvbjogY29tcGxldGVkRnJhY3Rpb24sXG4gICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgc3RhcnRGcmFjdGlvbjogY29tcGxldGVkRnJhY3Rpb24sXG4gICAgICBlbmRGcmFjdGlvbjogMSxcbiAgICAgIHN0YXR1czogJ3N1Y2NlZWRlZCcsXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gUnVubmluZyB0byBjb21wbGV0aW9uIChvciB0ZXJtaW5hbCBldmVudHMgaGF2ZW4ndCBsb2FkZWQgeWV0KVxuICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgc3RhcnRGcmFjdGlvbjogY3Vyc29yLFxuICAgICAgZW5kRnJhY3Rpb246IDEsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzZWdtZW50cztcbn1cblxuLyoqXG4gKiBDb21wdXRlIHNlZ21lbnRzIGZvciBhIHYxIHJ1biB1c2luZyBvbmx5IHRoZSBydW4gZW50aXR5J3Mgc3RhdHVzIGFuZFxuICogYWN0aXZlU3RhcnRUaW1lIChkZXJpdmVkIGZyb20gcnVuLnN0YXJ0ZWRBdCkuIFYxIHJ1bnMgaGF2ZSBubyBydW5cbiAqIGxpZmVjeWNsZSBldmVudHMsIHNvIHdlIGluZmVyIHRoZSB2aXN1YWwgc2VnbWVudHMgZnJvbSBlbnRpdHkgZmllbGRzLlxuICovXG5mdW5jdGlvbiBjb21wdXRlVjFSdW5TZWdtZW50cyhcbiAgc3RhcnRUaW1lOiBudW1iZXIsXG4gIGR1cmF0aW9uOiBudW1iZXIsXG4gIGFjdGl2ZVN0YXJ0VGltZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBydW5TdGF0dXM6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogU2VnbWVudFtdIHtcbiAgY29uc3Qgc2VnbWVudHM6IFNlZ21lbnRbXSA9IFtdO1xuXG4gIGxldCBjdXJzb3IgPSAwO1xuICBpZiAoYWN0aXZlU3RhcnRUaW1lICYmIGFjdGl2ZVN0YXJ0VGltZSA+IHN0YXJ0VGltZSkge1xuICAgIGNvbnN0IHF1ZXVlZEZyYWN0aW9uID0gdGltZVRvRnJhY3Rpb24oYWN0aXZlU3RhcnRUaW1lLCBzdGFydFRpbWUsIGR1cmF0aW9uKTtcbiAgICBpZiAocXVldWVkRnJhY3Rpb24gPiAwLjAwMSkge1xuICAgICAgc2VnbWVudHMucHVzaCh7XG4gICAgICAgIHN0YXJ0RnJhY3Rpb246IDAsXG4gICAgICAgIGVuZEZyYWN0aW9uOiBxdWV1ZWRGcmFjdGlvbixcbiAgICAgICAgc3RhdHVzOiAncXVldWVkJyxcbiAgICAgIH0pO1xuICAgICAgY3Vyc29yID0gcXVldWVkRnJhY3Rpb247XG4gICAgfVxuICB9XG5cbiAgaWYgKHJ1blN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgIHN0YXJ0RnJhY3Rpb246IGN1cnNvcixcbiAgICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgICAgc3RhdHVzOiAnZmFpbGVkJyxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChydW5TdGF0dXMgPT09ICdjb21wbGV0ZWQnIHx8IHJ1blN0YXR1cyA9PT0gJ2NhbmNlbGxlZCcpIHtcbiAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgIHN0YXJ0RnJhY3Rpb246IGN1cnNvcixcbiAgICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgICAgc3RhdHVzOiAnc3VjY2VlZGVkJyxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgIHN0YXJ0RnJhY3Rpb246IGN1cnNvcixcbiAgICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gc2VnbWVudHM7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRGlzcGF0Y2hlclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VnbWVudFJlc3VsdCB7XG4gIHNlZ21lbnRzOiBTZWdtZW50W107XG4gIGJvdW5kYXJpZXM6IFNlZ21lbnRCb3VuZGFyeVtdO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEJvdW5kYXJ5IGNvbXB1dGF0aW9uXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIEV2ZW50IG5hbWVzIHRvIGh1bWFuLXJlYWRhYmxlIGxhYmVscyAqL1xuY29uc3QgRVZFTlRfTEFCRUxTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBzdGVwX3N0YXJ0ZWQ6ICdTdGFydGVkJyxcbiAgc3RlcF9yZXRyeWluZzogJ1JldHJ5aW5nJyxcbiAgc3RlcF9mYWlsZWQ6ICdGYWlsZWQnLFxuICBob29rX2NyZWF0ZWQ6ICdDcmVhdGVkJyxcbiAgaG9va19yZWNlaXZlZDogJ1JlY2VpdmVkJyxcbiAgaG9va19kaXNwb3NlZDogJ1Jlc29sdmVkJyxcbiAgd2FpdF9jcmVhdGVkOiAnU2xlZXAgc3RhcnRlZCcsXG4gIHdhaXRfY29tcGxldGVkOiAnU2xlZXAgY29tcGxldGVkJyxcbiAgcnVuX2NvbXBsZXRlZDogJ0NvbXBsZXRlZCcsXG4gIHJ1bl9mYWlsZWQ6ICdSdW4gZmFpbGVkJyxcbiAgc3RlcF9jb21wbGV0ZWQ6ICdDb21wbGV0ZWQnLFxufTtcblxuLyoqXG4gKiBFeHRyYWN0IGJvdW5kYXJpZXMgZnJvbSBhIHNwYW4ncyBldmVudHMuIEVhY2ggYm91bmRhcnkgc2l0cyBhdCB0aGVcbiAqIGZyYWN0aW9uYWwgcG9zaXRpb24gb2YgYSByZWxldmFudCBldmVudCB3aXRoaW4gdGhlIHNwYW4gZHVyYXRpb24uXG4gKiBPbmx5IGluY2x1ZGVzIGV2ZW50cyB0aGF0IGFyZSB1c2VkIGFzIHNlZ21lbnQgYm91bmRhcmllcyAobm90IGF0IHRoZVxuICogdmVyeSBzdGFydCBvciB2ZXJ5IGVuZCBvZiB0aGUgc3BhbiwgdG8gYXZvaWQgZWRnZSBjbHV0dGVyKS5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUJvdW5kYXJpZXMoXG4gIG5vZGU6IFNwYW5Ob2RlLFxuICByZWxldmFudEV2ZW50TmFtZXM6IHN0cmluZ1tdXG4pOiBTZWdtZW50Qm91bmRhcnlbXSB7XG4gIGNvbnN0IGV2ZW50cyA9IG5vZGUuZXZlbnRzID8gc29ydGVkRXZlbnRzKG5vZGUuZXZlbnRzKSA6IFtdO1xuICBjb25zdCB7IHN0YXJ0VGltZSwgZHVyYXRpb24gfSA9IG5vZGU7XG5cbiAgaWYgKGR1cmF0aW9uIDw9IDApIHJldHVybiBbXTtcblxuICBjb25zdCBib3VuZGFyaWVzOiBTZWdtZW50Qm91bmRhcnlbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB7XG4gICAgaWYgKCFyZWxldmFudEV2ZW50TmFtZXMuaW5jbHVkZXMoZS5ldmVudC5uYW1lKSkgY29udGludWU7XG5cbiAgICBjb25zdCBmcmFjdGlvbiA9IHRpbWVUb0ZyYWN0aW9uKGUudGltZXN0YW1wLCBzdGFydFRpbWUsIGR1cmF0aW9uKTtcbiAgICAvLyBTa2lwIGJvdW5kYXJpZXMgYXQgdGhlIHZlcnkgZWRnZXMgKDwgMSUgb3IgPiA5OSUpIHRvIGF2b2lkIGNsdXR0ZXJcbiAgICBpZiAoZnJhY3Rpb24gPCAwLjAxIHx8IGZyYWN0aW9uID4gMC45OSkgY29udGludWU7XG5cbiAgICBib3VuZGFyaWVzLnB1c2goe1xuICAgICAgZnJhY3Rpb24sXG4gICAgICBsYWJlbDogRVZFTlRfTEFCRUxTW2UuZXZlbnQubmFtZV0gPz8gZS5ldmVudC5uYW1lLFxuICAgICAgb2Zmc2V0TXM6IGUudGltZXN0YW1wIC0gc3RhcnRUaW1lLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGJvdW5kYXJpZXM7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRGlzcGF0Y2hlclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgZXZlbnQtYmFzZWQgc2VnbWVudHMgYW5kIGJvdW5kYXJpZXMgZm9yIGEgc3BhbiBiYXNlZCBvbiBpdHMgcmVzb3VyY2UgdHlwZS5cbiAqIFJldHVybnMgZW1wdHkgYXJyYXlzIGZvciAnZGVmYXVsdCcgKGdlbmVyaWMgT1RFTCkgc3BhbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU2VnbWVudHMoXG4gIHJlc291cmNlVHlwZTogUmVzb3VyY2VUeXBlLFxuICBub2RlOiBTcGFuTm9kZVxuKTogU2VnbWVudFJlc3VsdCB7XG4gIHN3aXRjaCAocmVzb3VyY2VUeXBlKSB7XG4gICAgY2FzZSAnc3RlcCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZWdtZW50czogY29tcHV0ZVN0ZXBTZWdtZW50cyhub2RlKSxcbiAgICAgICAgYm91bmRhcmllczogY29tcHV0ZUJvdW5kYXJpZXMobm9kZSwgW1xuICAgICAgICAgICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAgICdzdGVwX3JldHJ5aW5nJyxcbiAgICAgICAgICAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICdzdGVwX2NvbXBsZXRlZCcsXG4gICAgICAgIF0pLFxuICAgICAgfTtcbiAgICBjYXNlICdob29rJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlZ21lbnRzOiBjb21wdXRlSG9va1NlZ21lbnRzKG5vZGUpLFxuICAgICAgICBib3VuZGFyaWVzOiBjb21wdXRlQm91bmRhcmllcyhub2RlLCBbXG4gICAgICAgICAgJ2hvb2tfY3JlYXRlZCcsXG4gICAgICAgICAgJ2hvb2tfcmVjZWl2ZWQnLFxuICAgICAgICAgICdob29rX2Rpc3Bvc2VkJyxcbiAgICAgICAgXSksXG4gICAgICB9O1xuICAgIGNhc2UgJ3NsZWVwJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlZ21lbnRzOiBjb21wdXRlU2xlZXBTZWdtZW50cyhub2RlKSxcbiAgICAgICAgYm91bmRhcmllczogY29tcHV0ZUJvdW5kYXJpZXMobm9kZSwgWyd3YWl0X2NyZWF0ZWQnLCAnd2FpdF9jb21wbGV0ZWQnXSksXG4gICAgICB9O1xuICAgIGNhc2UgJ3J1bic6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZWdtZW50czogY29tcHV0ZVJ1blNlZ21lbnRzKG5vZGUpLFxuICAgICAgICBib3VuZGFyaWVzOiBjb21wdXRlQm91bmRhcmllcyhub2RlLCBbJ3J1bl9jb21wbGV0ZWQnLCAncnVuX2ZhaWxlZCddKSxcbiAgICAgIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7IHNlZ21lbnRzOiBbXSwgYm91bmRhcmllczogW10gfTtcbiAgfVxufVxuIl19
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import type { RefObject } from 'react';
|
|
2
|
-
import type { RootNode, ScrollSnapshot, VisibleSpan } from '../types';
|
|
3
|
-
/**
|
|
4
|
-
* The resource type of a workflow span, read from span.attributes.resource.
|
|
5
|
-
* Falls back to 'default' for non-workflow (generic OTEL) spans.
|
|
6
|
-
*/
|
|
7
|
-
export type ResourceType = 'run' | 'step' | 'hook' | 'sleep' | 'default';
|
|
8
|
-
/**
|
|
9
|
-
* Layout result computed by a span strategy. Controls how the span
|
|
10
|
-
* is sized and positioned in the timeline.
|
|
11
|
-
*/
|
|
12
|
-
export interface SpanLayout {
|
|
13
|
-
/** The rendered width in pixels */
|
|
14
|
-
width: number;
|
|
15
|
-
/** The actual duration-based width (before min-width clamping) */
|
|
16
|
-
actualWidth: number;
|
|
17
|
-
/** The rendered height in pixels */
|
|
18
|
-
height: number;
|
|
19
|
-
/** The y position in pixels */
|
|
20
|
-
top: number;
|
|
21
|
-
/** The x position in pixels (from left) */
|
|
22
|
-
left: number;
|
|
23
|
-
/** Whether the span is considered "small" (< 64px actual width) */
|
|
24
|
-
isSmall: boolean;
|
|
25
|
-
/** Whether the span is considered "huge" (>= 500px actual width) */
|
|
26
|
-
isHuge: boolean;
|
|
27
|
-
/** Whether the span is currently hovered (with hover eligibility) */
|
|
28
|
-
isHovered: boolean;
|
|
29
|
-
/** Whether the span is expanded (hovered or selected) — controls sizing */
|
|
30
|
-
isExpanded: boolean;
|
|
31
|
-
/** Whether the span is near the right side of the visible area */
|
|
32
|
-
isNearRightSide: boolean;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Reads the resource type from a span's attributes.
|
|
36
|
-
*/
|
|
37
|
-
export declare function getResourceType(node: VisibleSpan): ResourceType;
|
|
38
|
-
export declare function getRunLayout(node: VisibleSpan, root: RootNode, scale: number, scrollSnapshotRef: RefObject<ScrollSnapshot | undefined>): SpanLayout;
|
|
39
|
-
export declare function getStepLayout(node: VisibleSpan, root: RootNode, scale: number, scrollSnapshotRef: RefObject<ScrollSnapshot | undefined>): SpanLayout;
|
|
40
|
-
export declare function getHookLayout(node: VisibleSpan, root: RootNode, scale: number, scrollSnapshotRef: RefObject<ScrollSnapshot | undefined>): SpanLayout;
|
|
41
|
-
export declare function getSleepLayout(node: VisibleSpan, root: RootNode, scale: number, scrollSnapshotRef: RefObject<ScrollSnapshot | undefined>): SpanLayout;
|
|
42
|
-
/**
|
|
43
|
-
* Computes the layout for a span based on its resource type.
|
|
44
|
-
*/
|
|
45
|
-
export declare function getSpanLayout(resourceType: ResourceType, node: VisibleSpan, root: RootNode, scale: number, scrollSnapshotRef: RefObject<ScrollSnapshot | undefined>): SpanLayout;
|
|
46
|
-
//# sourceMappingURL=span-strategies.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"span-strategies.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/span-strategies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGtE;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAKzE;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,OAAO,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,MAAM,EAAE,OAAO,CAAC;IAChB,qEAAqE;IACrE,SAAS,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,UAAU,EAAE,OAAO,CAAC;IACpB,kEAAkE;IAClE,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,CAW/D;AAwFD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,GACvD,UAAU,CAEZ;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,GACvD,UAAU,CAEZ;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,GACvD,UAAU,CAEZ;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,GACvD,UAAU,CAEZ;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,GACvD,UAAU,CAaZ"}
|