@workflow/web-shared 5.0.0-beta.27 → 5.0.0-beta.29

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 (54) hide show
  1. package/dist/components/event-list-view.d.ts.map +1 -1
  2. package/dist/components/event-list-view.js +13 -1
  3. package/dist/components/new-trace-viewer/components/detail-panel.d.ts.map +1 -1
  4. package/dist/components/new-trace-viewer/components/detail-panel.js +2 -2
  5. package/dist/components/new-trace-viewer/components/event-list.d.ts +1 -1
  6. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -1
  7. package/dist/components/new-trace-viewer/components/event-list.js +4 -6
  8. package/dist/components/new-trace-viewer/components/minimap.d.ts +14 -0
  9. package/dist/components/new-trace-viewer/components/minimap.d.ts.map +1 -0
  10. package/dist/components/new-trace-viewer/components/minimap.js +337 -0
  11. package/dist/components/new-trace-viewer/components/split-pane.d.ts +0 -2
  12. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -1
  13. package/dist/components/new-trace-viewer/components/split-pane.js +9 -75
  14. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -1
  15. package/dist/components/new-trace-viewer/components/timeline.js +5 -7
  16. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -1
  17. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +6 -2
  18. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
  19. package/dist/components/new-trace-viewer/trace-viewer.js +48 -96
  20. package/dist/components/new-trace-viewer/utils.d.ts +21 -0
  21. package/dist/components/new-trace-viewer/utils.d.ts.map +1 -1
  22. package/dist/components/new-trace-viewer/utils.js +44 -3
  23. package/dist/components/sidebar/attribute-panel.d.ts +4 -1
  24. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  25. package/dist/components/sidebar/attribute-panel.js +32 -24
  26. package/dist/components/sidebar/attributes-block.d.ts +1 -0
  27. package/dist/components/sidebar/attributes-block.d.ts.map +1 -1
  28. package/dist/components/sidebar/attributes-block.js +6 -5
  29. package/dist/components/sidebar/entity-detail-panel.d.ts +5 -1
  30. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  31. package/dist/components/sidebar/entity-detail-panel.js +18 -3
  32. package/dist/components/sidebar/sidebar-data-context.d.ts +4 -0
  33. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -1
  34. package/dist/components/sidebar/sidebar-data-context.js +1 -1
  35. package/dist/lib/utils.d.ts +8 -5
  36. package/dist/lib/utils.d.ts.map +1 -1
  37. package/dist/lib/utils.js +13 -16
  38. package/package.json +5 -5
  39. package/src/components/event-list-view.tsx +21 -0
  40. package/src/components/new-trace-viewer/components/detail-panel.tsx +1 -0
  41. package/src/components/new-trace-viewer/components/event-list.tsx +4 -6
  42. package/src/components/new-trace-viewer/components/minimap.tsx +559 -0
  43. package/src/components/new-trace-viewer/components/split-pane.tsx +39 -95
  44. package/src/components/new-trace-viewer/components/timeline.tsx +3 -5
  45. package/src/components/new-trace-viewer/components/trace-viewer-skeleton.tsx +17 -0
  46. package/src/components/new-trace-viewer/trace-viewer.tsx +79 -117
  47. package/src/components/new-trace-viewer/utils.test.ts +65 -0
  48. package/src/components/new-trace-viewer/utils.ts +76 -2
  49. package/src/components/sidebar/attribute-panel.tsx +77 -22
  50. package/src/components/sidebar/attributes-block.tsx +43 -10
  51. package/src/components/sidebar/entity-detail-panel.tsx +22 -0
  52. package/src/components/sidebar/sidebar-data-context.tsx +4 -0
  53. package/src/lib/utils.test.ts +33 -0
  54. package/src/lib/utils.ts +12 -16
@@ -0,0 +1,337 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { memo, useCallback, useEffect, useLayoutEffect, useRef, useState, } from 'react';
4
+ import { cn } from '../../../lib/cn';
5
+ import { formatDurationPrecise, getHighResInMs, } from '../../trace-viewer/util/timing';
6
+ import { clampViewportToRoot, isSpanErrored, wheelDeltaToPixels, wheelZoomScaleFactor, } from '../utils';
7
+ import { TIMELINE_PADDING_PX } from './timeline';
8
+ // ---------------------------------------------------------------------------
9
+ // Constants
10
+ // ---------------------------------------------------------------------------
11
+ const CANVAS_PAD_Y_PX = 6;
12
+ const MIN_LINE_HEIGHT_PX = 1.5;
13
+ const MAX_LINE_HEIGHT_PX = 3;
14
+ const MIN_LINE_WIDTH_PX = 2;
15
+ /** Pointer travel below this is treated as a click rather than a drag. */
16
+ const CLICK_DRAG_THRESHOLD_PX = 3;
17
+ const MIN_BRUSH_WIDTH_PX = 6;
18
+ /** Fraction of the current window that arrow keys pan by. */
19
+ const KEYBOARD_PAN_FRACTION = 0.1;
20
+ /**
21
+ * Line colors resolved from the design-system tokens on the container, so the
22
+ * canvas follows the active theme. Runs and steps carry the accent hues;
23
+ * passive spans (hooks, sleeps) stay gray like their event-list icons.
24
+ */
25
+ const RESOURCE_LINE_TOKENS = {
26
+ run: '--ds-blue-400',
27
+ step: '--ds-green-400',
28
+ hook: '--ds-gray-400',
29
+ sleep: '--ds-gray-400',
30
+ };
31
+ const DEFAULT_LINE_TOKEN = '--ds-gray-400';
32
+ const ERROR_LINE_TOKEN = '--ds-red-400';
33
+ function computeDensityLayout(spans, rootStartMs, rootDurationMs, contentWidth, contentHeight) {
34
+ const count = spans.length;
35
+ const lineHeight = Math.max(MIN_LINE_HEIGHT_PX, Math.min(MAX_LINE_HEIGHT_PX, contentHeight / count));
36
+ // Distribute rows across the strip; never spread a handful of spans further
37
+ // apart than one line + 1px gap.
38
+ const rowStep = count > 1
39
+ ? Math.min((contentHeight - lineHeight) / (count - 1), lineHeight + 1)
40
+ : 0;
41
+ const rectsByToken = new Map();
42
+ spans.forEach((span, index) => {
43
+ const token = isSpanErrored(span)
44
+ ? ERROR_LINE_TOKEN
45
+ : (RESOURCE_LINE_TOKENS[span.resource] ?? DEFAULT_LINE_TOKEN);
46
+ const startMs = getHighResInMs(span.startTime);
47
+ const endMs = getHighResInMs(span.endTime);
48
+ const x = TIMELINE_PADDING_PX +
49
+ ((startMs - rootStartMs) / rootDurationMs) * contentWidth;
50
+ const w = Math.max(MIN_LINE_WIDTH_PX, ((endMs - startMs) / rootDurationMs) * contentWidth);
51
+ const y = CANVAS_PAD_Y_PX + index * rowStep;
52
+ const rects = rectsByToken.get(token) ?? [];
53
+ rects.push([x, y, w]);
54
+ rectsByToken.set(token, rects);
55
+ });
56
+ return { lineHeight, rectsByToken };
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Hooks
60
+ // ---------------------------------------------------------------------------
61
+ /** Track the display's device pixel ratio (changes when moving monitors). */
62
+ function useDpr() {
63
+ const [dpr, setDpr] = useState(1);
64
+ useLayoutEffect(() => {
65
+ const onChange = () => setDpr(window.devicePixelRatio || 1);
66
+ const media = matchMedia(`(resolution: ${dpr}dppx)`);
67
+ media.addEventListener('change', onChange);
68
+ onChange();
69
+ return () => media.removeEventListener('change', onChange);
70
+ }, [dpr]);
71
+ return dpr;
72
+ }
73
+ /** Bump a counter when the theme (html class/data-theme) changes. */
74
+ function useThemeVersion() {
75
+ const [version, setVersion] = useState(0);
76
+ useEffect(() => {
77
+ const observer = new MutationObserver(() => setVersion((v) => v + 1));
78
+ observer.observe(document.documentElement, {
79
+ attributes: true,
80
+ attributeFilter: ['class', 'data-theme', 'style'],
81
+ });
82
+ return () => observer.disconnect();
83
+ }, []);
84
+ return version;
85
+ }
86
+ export const Minimap = memo(function Minimap({ spans, root, viewport, minViewportMs, onViewportChange, onAnimateTo, }) {
87
+ const { startTime: rootStartMs, endTime: rootEndMs, duration: rootDurationMs, } = root;
88
+ const containerRef = useRef(null);
89
+ const canvasRef = useRef(null);
90
+ const dpr = useDpr();
91
+ const themeVersion = useThemeVersion();
92
+ // Latest viewport for pointer handlers, without re-binding them per frame.
93
+ const viewportRef = useRef(viewport);
94
+ viewportRef.current = viewport;
95
+ const [drag, setDrag] = useState(null);
96
+ const [selection, setSelection] = useState(null);
97
+ const xToTime = useCallback((x, contentWidth) => {
98
+ if (contentWidth <= 0)
99
+ return rootStartMs;
100
+ const fraction = (x - TIMELINE_PADDING_PX) / contentWidth;
101
+ return Math.min(Math.max(rootStartMs + fraction * rootDurationMs, rootStartMs), rootEndMs);
102
+ }, [rootStartMs, rootDurationMs, rootEndMs]);
103
+ const clamp = useCallback((next) => clampViewportToRoot(next, rootStartMs, rootEndMs, minViewportMs), [rootStartMs, rootEndMs, minViewportMs]);
104
+ // Density canvas: one thin line per span across the full run. Sizing is
105
+ // read live and redraws run straight from the ResizeObserver (which fires
106
+ // before paint), so layout changes — e.g. the detail panel opening — never
107
+ // paint a frame with a stale, stretched bitmap.
108
+ // biome-ignore lint/correctness/useExhaustiveDependencies: themeVersion is a redraw trigger — the canvas re-resolves its token colors when the theme flips
109
+ useLayoutEffect(() => {
110
+ const canvas = canvasRef.current;
111
+ const container = containerRef.current;
112
+ const ctx = canvas?.getContext('2d');
113
+ if (!canvas || !container || !ctx)
114
+ return;
115
+ const draw = () => {
116
+ const width = canvas.clientWidth;
117
+ const height = canvas.clientHeight;
118
+ const contentWidth = width - TIMELINE_PADDING_PX * 2;
119
+ if (width <= 0 || height <= 0 || contentWidth <= 0)
120
+ return;
121
+ canvas.width = Math.round(width * dpr);
122
+ canvas.height = Math.round(height * dpr);
123
+ ctx.scale(dpr, dpr);
124
+ ctx.clearRect(0, 0, width, height);
125
+ if (spans.length === 0 || rootDurationMs <= 0)
126
+ return;
127
+ const { lineHeight, rectsByToken } = computeDensityLayout(spans, rootStartMs, rootDurationMs, contentWidth, height - CANVAS_PAD_Y_PX * 2);
128
+ const style = getComputedStyle(container);
129
+ const drawToken = (token) => {
130
+ const rects = rectsByToken.get(token);
131
+ if (!rects)
132
+ return;
133
+ ctx.fillStyle =
134
+ style.getPropertyValue(token).trim() || 'rgb(160,160,160)';
135
+ ctx.beginPath();
136
+ for (const [x, y, w] of rects) {
137
+ ctx.roundRect(x, y, w, lineHeight, lineHeight / 2);
138
+ }
139
+ ctx.fill();
140
+ };
141
+ // Errored spans are drawn last so red never disappears under neighbors.
142
+ for (const token of rectsByToken.keys()) {
143
+ if (token !== ERROR_LINE_TOKEN)
144
+ drawToken(token);
145
+ }
146
+ drawToken(ERROR_LINE_TOKEN);
147
+ };
148
+ draw();
149
+ const observer = new ResizeObserver(draw);
150
+ observer.observe(container);
151
+ return () => observer.disconnect();
152
+ }, [spans, rootStartMs, rootDurationMs, dpr, themeVersion]);
153
+ // Content width is read from the live rect at event time, so pointer math
154
+ // stays exact while the strip is being resized mid-gesture.
155
+ const pointerFrame = useCallback((e) => {
156
+ const rect = e.currentTarget.getBoundingClientRect();
157
+ return {
158
+ x: e.clientX - rect.left,
159
+ cw: rect.width - TIMELINE_PADDING_PX * 2,
160
+ };
161
+ }, []);
162
+ const resolveDragState = useCallback((target, x, cw) => {
163
+ if (target.closest('[data-minimap-handle="left"]')) {
164
+ return { mode: 'resize-left' };
165
+ }
166
+ if (target.closest('[data-minimap-handle="right"]')) {
167
+ return { mode: 'resize-right' };
168
+ }
169
+ // Panning a full-extent window is a no-op, so let a drag on the brush
170
+ // start a selection instead — the natural first gesture on the map.
171
+ const { start, end } = viewportRef.current;
172
+ const isFullExtent = start - rootStartMs < rootDurationMs * 0.001 &&
173
+ rootEndMs - end < rootDurationMs * 0.001;
174
+ if (target.closest('[data-minimap-brush]') && !isFullExtent) {
175
+ return { mode: 'pan', grabOffsetMs: xToTime(x, cw) - start };
176
+ }
177
+ return { mode: 'select', originX: x, originMs: xToTime(x, cw) };
178
+ }, [xToTime, rootStartMs, rootDurationMs, rootEndMs]);
179
+ const handlePointerDown = useCallback((e) => {
180
+ if (e.button !== 0)
181
+ return;
182
+ const { x, cw } = pointerFrame(e);
183
+ if (cw <= 0)
184
+ return;
185
+ e.currentTarget.setPointerCapture(e.pointerId);
186
+ setDrag(resolveDragState(e.target, x, cw));
187
+ }, [pointerFrame, resolveDragState]);
188
+ const handlePointerMove = useCallback((e) => {
189
+ if (!drag)
190
+ return;
191
+ const { x, cw } = pointerFrame(e);
192
+ const t = xToTime(x, cw);
193
+ const { start, end } = viewportRef.current;
194
+ if (drag.mode === 'pan') {
195
+ const duration = end - start;
196
+ onViewportChange(clamp({
197
+ start: t - drag.grabOffsetMs,
198
+ end: t - drag.grabOffsetMs + duration,
199
+ }));
200
+ }
201
+ else if (drag.mode === 'resize-left') {
202
+ onViewportChange({ start: Math.min(t, end - minViewportMs), end });
203
+ }
204
+ else if (drag.mode === 'resize-right') {
205
+ onViewportChange({ start, end: Math.max(t, start + minViewportMs) });
206
+ }
207
+ else if (selection ||
208
+ Math.abs(x - drag.originX) > CLICK_DRAG_THRESHOLD_PX) {
209
+ setSelection({
210
+ x0: Math.min(drag.originX, x),
211
+ x1: Math.max(drag.originX, x),
212
+ });
213
+ }
214
+ }, [
215
+ drag,
216
+ selection,
217
+ pointerFrame,
218
+ xToTime,
219
+ onViewportChange,
220
+ clamp,
221
+ minViewportMs,
222
+ ]);
223
+ const endDrag = useCallback((e) => {
224
+ if (!drag)
225
+ return;
226
+ if (drag.mode === 'select') {
227
+ const { x, cw } = pointerFrame(e);
228
+ const t = xToTime(x, cw);
229
+ if (selection) {
230
+ onAnimateTo(clamp({
231
+ start: Math.min(drag.originMs, t),
232
+ end: Math.max(drag.originMs, t),
233
+ }));
234
+ }
235
+ else {
236
+ // Plain click: keep the current zoom, center the window there.
237
+ const { start, end } = viewportRef.current;
238
+ const duration = end - start;
239
+ onAnimateTo(clamp({ start: t - duration / 2, end: t + duration / 2 }));
240
+ }
241
+ }
242
+ setSelection(null);
243
+ setDrag(null);
244
+ }, [drag, selection, pointerFrame, xToTime, onAnimateTo, clamp]);
245
+ const handleLostPointerCapture = useCallback(() => {
246
+ setSelection(null);
247
+ setDrag(null);
248
+ }, []);
249
+ const handleDoubleClick = useCallback(() => {
250
+ onAnimateTo({ start: rootStartMs, end: rootEndMs });
251
+ }, [onAnimateTo, rootStartMs, rootEndMs]);
252
+ // Wheel: same gestures as the timeline, mapped through the full extent.
253
+ useEffect(() => {
254
+ const el = containerRef.current;
255
+ if (!el || rootDurationMs <= 0)
256
+ return;
257
+ // The minimap's x axis is the full run, so zoom around the absolute time
258
+ // under the cursor rather than a viewport fraction.
259
+ const zoomAtCursor = (e, cw, left) => {
260
+ const scaleFactor = wheelZoomScaleFactor(e);
261
+ const { start, end } = viewportRef.current;
262
+ const duration = end - start;
263
+ const cursorFraction = Math.min(Math.max((e.clientX - left - TIMELINE_PADDING_PX) / cw, 0), 1);
264
+ const cursorMs = rootStartMs + cursorFraction * rootDurationMs;
265
+ const anchor = Math.min(Math.max(duration > 0 ? (cursorMs - start) / duration : 0.5, 0), 1);
266
+ const newDuration = duration * scaleFactor;
267
+ onViewportChange(clamp({
268
+ start: cursorMs - anchor * newDuration,
269
+ end: cursorMs + (1 - anchor) * newDuration,
270
+ }));
271
+ };
272
+ // Pan in map coordinates: one map pixel is one full-extent fraction.
273
+ const panByMapPixels = (e, cw) => {
274
+ const dx = wheelDeltaToPixels(e.deltaX, e.deltaMode);
275
+ const panMs = (dx / cw) * rootDurationMs;
276
+ const { start, end } = viewportRef.current;
277
+ onViewportChange(clamp({ start: start + panMs, end: end + panMs }));
278
+ };
279
+ const onWheel = (e) => {
280
+ const isZoomGesture = e.ctrlKey || e.metaKey;
281
+ const hasDeltaX = Math.abs(e.deltaX) > Math.abs(e.deltaY);
282
+ if (!isZoomGesture && !hasDeltaX)
283
+ return;
284
+ e.preventDefault();
285
+ const rect = el.getBoundingClientRect();
286
+ const cw = rect.width - TIMELINE_PADDING_PX * 2;
287
+ if (cw <= 0)
288
+ return;
289
+ if (isZoomGesture)
290
+ zoomAtCursor(e, cw, rect.left);
291
+ else
292
+ panByMapPixels(e, cw);
293
+ };
294
+ el.addEventListener('wheel', onWheel, { passive: false });
295
+ return () => el.removeEventListener('wheel', onWheel);
296
+ }, [rootStartMs, rootDurationMs, onViewportChange, clamp]);
297
+ // Arrow keys pan the focused brush; Home/End jump to the ends.
298
+ const handleKeyDown = useCallback((e) => {
299
+ const { start, end } = viewportRef.current;
300
+ const duration = end - start;
301
+ const pan = duration * KEYBOARD_PAN_FRACTION;
302
+ if (e.key === 'ArrowLeft') {
303
+ onViewportChange(clamp({ start: start - pan, end: end - pan }));
304
+ }
305
+ else if (e.key === 'ArrowRight') {
306
+ onViewportChange(clamp({ start: start + pan, end: end + pan }));
307
+ }
308
+ else if (e.key === 'Home') {
309
+ onViewportChange(clamp({ start: rootStartMs, end: rootStartMs + duration }));
310
+ }
311
+ else if (e.key === 'End') {
312
+ onViewportChange(clamp({ start: rootEndMs - duration, end: rootEndMs }));
313
+ }
314
+ else {
315
+ return;
316
+ }
317
+ e.preventDefault();
318
+ }, [onViewportChange, clamp, rootStartMs, rootEndMs]);
319
+ // Brush geometry in CSS calc() from time fractions, so the thumb reflows in
320
+ // the same frame as any container resize instead of lagging a state update.
321
+ const startFraction = (viewport.start - rootStartMs) / rootDurationMs;
322
+ const endFraction = (viewport.end - rootStartMs) / rootDurationMs;
323
+ const trackWidth = `(100% - ${TIMELINE_PADDING_PX * 2}px)`;
324
+ const brushStyle = {
325
+ left: `calc(${TIMELINE_PADDING_PX}px + ${startFraction} * ${trackWidth})`,
326
+ width: `max(${MIN_BRUSH_WIDTH_PX}px, calc(${endFraction - startFraction} * ${trackWidth}))`,
327
+ };
328
+ const viewDuration = viewport.end - viewport.start;
329
+ const scrollableMs = Math.max(rootDurationMs - viewDuration, 0);
330
+ const scrollPercent = scrollableMs > 0
331
+ ? Math.round(((viewport.start - rootStartMs) / scrollableMs) * 100)
332
+ : 0;
333
+ return (_jsxs("div", { ref: containerRef, className: cn('relative h-10 min-h-10 w-full border-b border-gray-alpha-400 bg-background-100 select-none overflow-hidden touch-none', drag?.mode === 'select' && 'cursor-crosshair'), onPointerDown: handlePointerDown, onPointerMove: handlePointerMove, onPointerUp: endDrag, onPointerCancel: endDrag, onLostPointerCapture: handleLostPointerCapture, onDoubleClick: handleDoubleClick, children: [_jsx("canvas", { ref: canvasRef, "aria-hidden": true, className: "pointer-events-none absolute inset-0 h-full w-full mix-blend-multiply [.dark-theme_&]:mix-blend-screen [.dark_&]:mix-blend-screen [[data-theme=dark]_&]:mix-blend-screen" }), selection ? (_jsx("div", { "aria-hidden": true, className: "pointer-events-none absolute inset-y-0 border border-blue-500 bg-blue-300 opacity-40", style: { left: selection.x0, width: selection.x1 - selection.x0 } })) : null, _jsxs("div", { "data-minimap-brush": true, role: "scrollbar", "aria-controls": "trace-timeline", "aria-orientation": "horizontal", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": scrollPercent, "aria-valuetext": `Viewing ${formatDurationPrecise(viewport.start - rootStartMs)} to ${formatDurationPrecise(viewport.end - rootStartMs)} of ${formatDurationPrecise(rootDurationMs)}`, "aria-label": "Timeline overview", tabIndex: 0, onKeyDown: handleKeyDown, className: cn(
334
+ // Glass thumb, matching the legacy trace viewer's map window.
335
+ 'group/minimap-brush absolute top-0.5 bottom-0.5 rounded-[3px] border border-gray-alpha-400 bg-gray-alpha-200 shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-[var(--ds-focus-color)]', drag?.mode === 'pan' ? 'cursor-grabbing' : 'cursor-grab'), style: brushStyle, children: [_jsx("div", { "data-minimap-handle": "left", className: "absolute inset-y-0 -left-1 flex w-2.5 cursor-ew-resize items-center justify-center", children: _jsx("span", { className: cn('h-3.5 w-[3px] rounded-full bg-gray-600 opacity-0 transition-opacity group-hover/minimap-brush:opacity-100 group-focus-visible/minimap-brush:opacity-100', drag && 'opacity-100') }) }), _jsx("div", { "data-minimap-handle": "right", className: "absolute inset-y-0 -right-1 flex w-2.5 cursor-ew-resize items-center justify-center", children: _jsx("span", { className: cn('h-3.5 w-[3px] rounded-full bg-gray-600 opacity-0 transition-opacity group-hover/minimap-brush:opacity-100 group-focus-visible/minimap-brush:opacity-100', drag && 'opacity-100') }) })] })] }));
336
+ });
337
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluaW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL25ldy10cmFjZS12aWV3ZXIvY29tcG9uZW50cy9taW5pbWFwLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBR2IsT0FBTyxFQUNMLElBQUksRUFDSixXQUFXLEVBQ1gsU0FBUyxFQUNULGVBQWUsRUFDZixNQUFNLEVBQ04sUUFBUSxHQUNULE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JDLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsY0FBYyxHQUNmLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixhQUFhLEVBR2Isa0JBQWtCLEVBQ2xCLG9CQUFvQixHQUNyQixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFakQsOEVBQThFO0FBQzlFLFlBQVk7QUFDWiw4RUFBOEU7QUFFOUUsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBQy9CLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLDBFQUEwRTtBQUMxRSxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQztBQUNsQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUM3Qiw2REFBNkQ7QUFDN0QsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFFbEM7Ozs7R0FJRztBQUNILE1BQU0sb0JBQW9CLEdBQTJCO0lBQ25ELEdBQUcsRUFBRSxlQUFlO0lBQ3BCLElBQUksRUFBRSxnQkFBZ0I7SUFDdEIsSUFBSSxFQUFFLGVBQWU7SUFDckIsS0FBSyxFQUFFLGVBQWU7Q0FDdkIs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b3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICBtZW1vLFxuICB1c2VDYWxsYmFjayxcbiAgdXNlRWZmZWN0LFxuICB1c2VMYXlvdXRFZmZlY3QsXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi4vLi4vLi4vbGliL2NuJztcbmltcG9ydCB7XG4gIGZvcm1hdER1cmF0aW9uUHJlY2lzZSxcbiAgZ2V0SGlnaFJlc0luTXMsXG59IGZyb20gJy4uLy4uL3RyYWNlLXZpZXdlci91dGlsL3RpbWluZyc7XG5pbXBvcnQgdHlwZSB7IFNwYW4gfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge1xuICBjbGFtcFZpZXdwb3J0VG9Sb290LFxuICBpc1NwYW5FcnJvcmVkLFxuICB0eXBlIFJvb3RCb3VuZHMsXG4gIHR5cGUgVmlld3BvcnRSYW5nZSxcbiAgd2hlZWxEZWx0YVRvUGl4ZWxzLFxuICB3aGVlbFpvb21TY2FsZUZhY3Rvcixcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVElNRUxJTkVfUEFERElOR19QWCB9IGZyb20gJy4vdGltZWxpbmUnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbnN0YW50c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IENBTlZBU19QQURfWV9QWCA9IDY7XG5jb25zdCBNSU5fTElORV9IRUlHSFRfUFggPSAxLjU7XG5jb25zdCBNQVhfTElORV9IRUlHSFRfUFggPSAzO1xuY29uc3QgTUlOX0xJTkVfV0lEVEhfUFggPSAyO1xuLyoqIFBvaW50ZXIgdHJhdmVsIGJlbG93IHRoaXMgaXMgdHJlYXRlZCBhcyBhIGNsaWNrIHJhdGhlciB0aGFuIGEgZHJhZy4gKi9cbmNvbnN0IENMSUNLX0RSQUdfVEhSRVNIT0xEX1BYID0gMztcbmNvbnN0IE1JTl9CUlVTSF9XSURUSF9QWCA9IDY7XG4vKiogRnJhY3Rpb24gb2YgdGhlIGN1cnJlbnQgd2luZG93IHRoYXQgYXJyb3cga2V5cyBwYW4gYnkuICovXG5jb25zdCBLRVlCT0FSRF9QQU5fRlJBQ1RJT04gPSAwLjE7XG5cbi8qKlxuICogTGluZSBjb2xvcnMgcmVzb2x2ZWQgZnJvbSB0aGUgZGVzaWduLXN5c3RlbSB0b2tlbnMgb24gdGhlIGNvbnRhaW5lciwgc28gdGhlXG4gKiBjYW52YXMgZm9sbG93cyB0aGUgYWN0aXZlIHRoZW1lLiBSdW5zIGFuZCBzdGVwcyBjYXJyeSB0aGUgYWNjZW50IGh1ZXM7XG4gKiBwYXNzaXZlIHNwYW5zIChob29rcywgc2xlZXBzKSBzdGF5IGdyYXkgbGlrZSB0aGVpciBldmVudC1saXN0IGljb25zLlxuICovXG5jb25zdCBSRVNPVVJDRV9MSU5FX1RPS0VOUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgcnVuOiAnLS1kcy1ibHVlLTQwMCcsXG4gIHN0ZXA6ICctLWRzLWdyZWVuLTQwMCcsXG4gIGhvb2s6ICctLWRzLWdyYXktNDAwJyxcbiAgc2xlZXA6ICctLWRzLWdyYXktNDAwJyxcbn07XG5jb25zdCBERUZBVUxUX0xJTkVfVE9LRU4gPSAnLS1kcy1ncmF5LTQwMCc7XG5jb25zdCBFUlJPUl9MSU5FX1RPS0VOID0gJy0tZHMtcmVkLTQwMCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGVuc2l0eSBsYXllciBnZW9tZXRyeVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmludGVyZmFjZSBEZW5zaXR5TGF5b3V0IHtcbiAgbGluZUhlaWdodDogbnVtYmVyO1xuICAvKiogW3gsIHksIHdpZHRoXSByZWN0cyBncm91cGVkIGJ5IGNvbG9yIHRva2VuLCBvbmUgZmlsbCBwYXNzIHBlciBjb2xvci4gKi9cbiAgcmVjdHNCeVRva2VuOiBNYXA8c3RyaW5nLCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl1bXT47XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVEZW5zaXR5TGF5b3V0KFxuICBzcGFuczogU3BhbltdLFxuICByb290U3RhcnRNczogbnVtYmVyLFxuICByb290RHVyYXRpb25NczogbnVtYmVyLFxuICBjb250ZW50V2lkdGg6IG51bWJlcixcbiAgY29udGVudEhlaWdodDogbnVtYmVyXG4pOiBEZW5zaXR5TGF5b3V0IHtcbiAgY29uc3QgY291bnQgPSBzcGFucy5sZW5ndGg7XG4gIGNvbnN0IGxpbmVIZWlnaHQgPSBNYXRoLm1heChcbiAgICBNSU5fTElORV9IRUlHSFRfUFgsXG4gICAgTWF0aC5taW4oTUFYX0xJTkVfSEVJR0hUX1BYLCBjb250ZW50SGVpZ2h0IC8gY291bnQpXG4gICk7XG4gIC8vIERpc3RyaWJ1dGUgcm93cyBhY3Jvc3MgdGhlIHN0cmlwOyBuZXZlciBzcHJlYWQgYSBoYW5kZnVsIG9mIHNwYW5zIGZ1cnRoZXJcbiAgLy8gYXBhcnQgdGhhbiBvbmUgbGluZSArIDFweCBnYXAuXG4gIGNvbnN0IHJvd1N0ZXAgPVxuICAgIGNvdW50ID4gMVxuICAgICAgPyBNYXRoLm1pbigoY29udGVudEhlaWdodCAtIGxpbmVIZWlnaHQpIC8gKGNvdW50IC0gMSksIGxpbmVIZWlnaHQgKyAxKVxuICAgICAgOiAwO1xuXG4gIGNvbnN0IHJlY3RzQnlUb2tlbiA9IG5ldyBNYXA8c3RyaW5nLCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl1bXT4oKTtcbiAgc3BhbnMuZm9yRWFjaCgoc3BhbiwgaW5kZXgpID0+IHtcbiAgICBjb25zdCB0b2tlbiA9IGlzU3BhbkVycm9yZWQoc3BhbilcbiAgICAgID8gRVJST1JfTElORV9UT0tFTlxuICAgICAgOiAoUkVTT1VSQ0VfTElORV9UT0tFTlNbc3Bhbi5yZXNvdXJjZV0gPz8gREVGQVVMVF9MSU5FX1RPS0VOKTtcbiAgICBjb25zdCBzdGFydE1zID0gZ2V0SGlnaFJlc0luTXMoc3Bhbi5zdGFydFRpbWUpO1xuICAgIGNvbnN0IGVuZE1zID0gZ2V0SGlnaFJlc0luTXMoc3Bhbi5lbmRUaW1lKTtcbiAgICBjb25zdCB4ID1cbiAgICAgIFRJTUVMSU5FX1BBRERJTkdfUFggK1xuICAgICAgKChzdGFydE1zIC0gcm9vdFN0YXJ0TXMpIC8gcm9vdER1cmF0aW9uTXMpICogY29udGVudFdpZHRoO1xuICAgIGNvbnN0IHcgPSBNYXRoLm1heChcbiAgICAgIE1JTl9MSU5FX1dJRFRIX1BYLFxuICAgICAgKChlbmRNcyAtIHN0YXJ0TXMpIC8gcm9vdER1cmF0aW9uTXMpICogY29udGVudFdpZHRoXG4gICAgKTtcbiAgICBjb25zdCB5ID0gQ0FOVkFTX1BBRF9ZX1BYICsgaW5kZXggKiByb3dTdGVwO1xuICAgIGNvbnN0IHJlY3RzID0gcmVjdHNCeVRva2VuLmdldCh0b2tlbikgPz8gW107XG4gICAgcmVjdHMucHVzaChbeCwgeSwgd10pO1xuICAgIHJlY3RzQnlUb2tlbi5zZXQodG9rZW4sIHJlY3RzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgbGluZUhlaWdodCwgcmVjdHNCeVRva2VuIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSG9va3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogVHJhY2sgdGhlIGRpc3BsYXkncyBkZXZpY2UgcGl4ZWwgcmF0aW8gKGNoYW5nZXMgd2hlbiBtb3ZpbmcgbW9uaXRvcnMpLiAqL1xuZnVuY3Rpb24gdXNlRHByKCk6IG51bWJlciB7XG4gIGNvbnN0IFtkcHIsIHNldERwcl0gPSB1c2VTdGF0ZSgxKTtcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvbkNoYW5nZSA9ICgpOiB2b2lkID0+IHNldERwcih3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKTtcbiAgICBjb25zdCBtZWRpYSA9IG1hdGNoTWVkaWEoYChyZXNvbHV0aW9uOiAke2Rwcn1kcHB4KWApO1xuICAgIG1lZGlhLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIG9uQ2hhbmdlKTtcbiAgICBvbkNoYW5nZSgpO1xuICAgIHJldHVybiAoKSA9PiBtZWRpYS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBvbkNoYW5nZSk7XG4gIH0sIFtkcHJdKTtcbiAgcmV0dXJuIGRwcjtcbn1cblxuLyoqIEJ1bXAgYSBjb3VudGVyIHdoZW4gdGhlIHRoZW1lIChodG1sIGNsYXNzL2RhdGEtdGhlbWUpIGNoYW5nZXMuICovXG5mdW5jdGlvbiB1c2VUaGVtZVZlcnNpb24oKTogbnVtYmVyIHtcbiAgY29uc3QgW3ZlcnNpb24sIHNldFZlcnNpb25dID0gdXNlU3RhdGUoMCk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiBzZXRWZXJzaW9uKCh2KSA9PiB2ICsgMSkpO1xuICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7XG4gICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgYXR0cmlidXRlRmlsdGVyOiBbJ2NsYXNzJywgJ2RhdGEtdGhlbWUnLCAnc3R5bGUnXSxcbiAgICB9KTtcbiAgICByZXR1cm4gKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9LCBbXSk7XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1pbmltYXBcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50eXBlIERyYWdTdGF0ZSA9XG4gIHwgeyBtb2RlOiAncGFuJzsgZ3JhYk9mZnNldE1zOiBudW1iZXIgfVxuICB8IHsgbW9kZTogJ3Jlc2l6ZS1sZWZ0JyB9XG4gIHwgeyBtb2RlOiAncmVzaXplLXJpZ2h0JyB9XG4gIHwgeyBtb2RlOiAnc2VsZWN0Jzsgb3JpZ2luWDogbnVtYmVyOyBvcmlnaW5NczogbnVtYmVyIH07XG5cbmV4cG9ydCBjb25zdCBNaW5pbWFwID0gbWVtbyhmdW5jdGlvbiBNaW5pbWFwKHtcbiAgc3BhbnMsXG4gIHJvb3QsXG4gIHZpZXdwb3J0LFxuICBtaW5WaWV3cG9ydE1zLFxuICBvblZpZXdwb3J0Q2hhbmdlLFxuICBvbkFuaW1hdGVUbyxcbn06IHtcbiAgc3BhbnM6IFNwYW5bXTtcbiAgcm9vdDogUm9vdEJvdW5kcztcbiAgdmlld3BvcnQ6IFZpZXdwb3J0UmFuZ2U7XG4gIG1pblZpZXdwb3J0TXM6IG51bWJlcjtcbiAgLyoqIEltbWVkaWF0ZSB2aWV3cG9ydCB1cGRhdGUgKHVzZWQgd2hpbGUgZHJhZ2dpbmcpLiAqL1xuICBvblZpZXdwb3J0Q2hhbmdlOiAodmlld3BvcnQ6IFZpZXdwb3J0UmFuZ2UpID0+IHZvaWQ7XG4gIC8qKiBFYXNlZCB2aWV3cG9ydCB0cmFuc2l0aW9uICh1c2VkIGZvciBjbGljay10by1qdW1wIGFuZCBzZWxlY3Rpb25zKS4gKi9cbiAgb25BbmltYXRlVG86ICh2aWV3cG9ydDogVmlld3BvcnRSYW5nZSkgPT4gdm9pZDtcbn0pOiBSZWFjdE5vZGUge1xuICBjb25zdCB7XG4gICAgc3RhcnRUaW1lOiByb290U3RhcnRNcyxcbiAgICBlbmRUaW1lOiByb290RW5kTXMsXG4gICAgZHVyYXRpb246IHJvb3REdXJhdGlvbk1zLFxuICB9ID0gcm9vdDtcblxuICBjb25zdCBjb250YWluZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBjYW52YXNSZWYgPSB1c2VSZWY8SFRNTENhbnZhc0VsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBkcHIgPSB1c2VEcHIoKTtcbiAgY29uc3QgdGhlbWVWZXJzaW9uID0gdXNlVGhlbWVWZXJzaW9uKCk7XG5cbiAgLy8gTGF0ZXN0IHZpZXdwb3J0IGZvciBwb2ludGVyIGhhbmRsZXJzLCB3aXRob3V0IHJlLWJpbmRpbmcgdGhlbSBwZXIgZnJhbWUuXG4gIGNvbnN0IHZpZXdwb3J0UmVmID0gdXNlUmVmPFZpZXdwb3J0UmFuZ2U+KHZpZXdwb3J0KTtcbiAgdmlld3BvcnRSZWYuY3VycmVudCA9IHZpZXdwb3J0O1xuXG4gIGNvbnN0IFtkcmFnLCBzZXREcmFnXSA9IHVzZVN0YXRlPERyYWdTdGF0ZSB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbc2VsZWN0aW9uLCBzZXRTZWxlY3Rpb25dID0gdXNlU3RhdGU8eyB4MDogbnVtYmVyOyB4MTogbnVtYmVyIH0gfCBudWxsPihcbiAgICBudWxsXG4gICk7XG5cbiAgY29uc3QgeFRvVGltZSA9IHVzZUNhbGxiYWNrKFxuICAgICh4OiBudW1iZXIsIGNvbnRlbnRXaWR0aDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICAgIGlmIChjb250ZW50V2lkdGggPD0gMCkgcmV0dXJuIHJvb3RTdGFydE1zO1xuICAgICAgY29uc3QgZnJhY3Rpb24gPSAoeCAtIFRJTUVMSU5FX1BBRERJTkdfUFgpIC8gY29udGVudFdpZHRoO1xuICAgICAgcmV0dXJuIE1hdGgubWluKFxuICAgICAgICBNYXRoLm1heChyb290U3RhcnRNcyArIGZyYWN0aW9uICogcm9vdER1cmF0aW9uTXMsIHJvb3RTdGFydE1zKSxcbiAgICAgICAgcm9vdEVuZE1zXG4gICAgICApO1xuICAgIH0sXG4gICAgW3Jvb3RTdGFydE1zLCByb290RHVyYXRpb25Ncywgcm9vdEVuZE1zXVxuICApO1xuXG4gIGNvbnN0IGNsYW1wID0gdXNlQ2FsbGJhY2soXG4gICAgKG5leHQ6IFZpZXdwb3J0UmFuZ2UpOiBWaWV3cG9ydFJhbmdlID0+XG4gICAgICBjbGFtcFZpZXdwb3J0VG9Sb290KG5leHQsIHJvb3RTdGFydE1zLCByb290RW5kTXMsIG1pblZpZXdwb3J0TXMpLFxuICAgIFtyb290U3RhcnRNcywgcm9vdEVuZE1zLCBtaW5WaWV3cG9ydE1zXVxuICApO1xuXG4gIC8vIERlbnNpdHkgY2FudmFzOiBvbmUgdGhpbiBsaW5lIHBlciBzcGFuIGFjcm9zcyB0aGUgZnVsbCBydW4uIFNpemluZyBpc1xuICAvLyByZWFkIGxpdmUgYW5kIHJlZHJhd3MgcnVuIHN0cmFpZ2h0IGZyb20gdGhlIFJlc2l6ZU9ic2VydmVyICh3aGljaCBmaXJlc1xuICAvLyBiZWZvcmUgcGFpbnQpLCBzbyBsYXlvdXQgY2hhbmdlcyDigJQgZS5nLiB0aGUgZGV0YWlsIHBhbmVsIG9wZW5pbmcg4oCUIG5ldmVyXG4gIC8vIHBhaW50IGEgZnJhbWUgd2l0aCBhIHN0YWxlLCBzdHJldGNoZWQgYml0bWFwLlxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiB0aGVtZVZlcnNpb24gaXMgYSByZWRyYXcgdHJpZ2dlciDigJQgdGhlIGNhbnZhcyByZS1yZXNvbHZlcyBpdHMgdG9rZW4gY29sb3JzIHdoZW4gdGhlIHRoZW1lIGZsaXBzXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY2FudmFzID0gY2FudmFzUmVmLmN1cnJlbnQ7XG4gICAgY29uc3QgY29udGFpbmVyID0gY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzPy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY2FudmFzIHx8ICFjb250YWluZXIgfHwgIWN0eCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZHJhdyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHdpZHRoID0gY2FudmFzLmNsaWVudFdpZHRoO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gY2FudmFzLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IGNvbnRlbnRXaWR0aCA9IHdpZHRoIC0gVElNRUxJTkVfUEFERElOR19QWCAqIDI7XG4gICAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCB8fCBjb250ZW50V2lkdGggPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjYW52YXMud2lkdGggPSBNYXRoLnJvdW5kKHdpZHRoICogZHByKTtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCAqIGRwcik7XG4gICAgICBjdHguc2NhbGUoZHByLCBkcHIpO1xuICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGlmIChzcGFucy5sZW5ndGggPT09IDAgfHwgcm9vdER1cmF0aW9uTXMgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB7IGxpbmVIZWlnaHQsIHJlY3RzQnlUb2tlbiB9ID0gY29tcHV0ZURlbnNpdHlMYXlvdXQoXG4gICAgICAgIHNwYW5zLFxuICAgICAgICByb290U3RhcnRNcyxcbiAgICAgICAgcm9vdER1cmF0aW9uTXMsXG4gICAgICAgIGNvbnRlbnRXaWR0aCxcbiAgICAgICAgaGVpZ2h0IC0gQ0FOVkFTX1BBRF9ZX1BYICogMlxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lcik7XG4gICAgICBjb25zdCBkcmF3VG9rZW4gPSAodG9rZW46IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCByZWN0cyA9IHJlY3RzQnlUb2tlbi5nZXQodG9rZW4pO1xuICAgICAgICBpZiAoIXJlY3RzKSByZXR1cm47XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPVxuICAgICAgICAgIHN0eWxlLmdldFByb3BlcnR5VmFsdWUodG9rZW4pLnRyaW0oKSB8fCAncmdiKDE2MCwxNjAsMTYwKSc7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgZm9yIChjb25zdCBbeCwgeSwgd10gb2YgcmVjdHMpIHtcbiAgICAgICAgICBjdHgucm91bmRSZWN0KHgsIHksIHcsIGxpbmVIZWlnaHQsIGxpbmVIZWlnaHQgLyAyKTtcbiAgICAgICAgfVxuICAgICAgICBjdHguZmlsbCgpO1xuICAgICAgfTtcbiAgICAgIC8vIEVycm9yZWQgc3BhbnMgYXJlIGRyYXduIGxhc3Qgc28gcmVkIG5ldmVyIGRpc2FwcGVhcnMgdW5kZXIgbmVpZ2hib3JzLlxuICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiByZWN0c0J5VG9rZW4ua2V5cygpKSB7XG4gICAgICAgIGlmICh0b2tlbiAhPT0gRVJST1JfTElORV9UT0tFTikgZHJhd1Rva2VuKHRva2VuKTtcbiAgICAgIH1cbiAgICAgIGRyYXdUb2tlbihFUlJPUl9MSU5FX1RPS0VOKTtcbiAgICB9O1xuXG4gICAgZHJhdygpO1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGRyYXcpO1xuICAgIG9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKTtcbiAgICByZXR1cm4gKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9LCBbc3BhbnMsIHJvb3RTdGFydE1zLCByb290RHVyYXRpb25NcywgZHByLCB0aGVtZVZlcnNpb25dKTtcblxuICAvLyBDb250ZW50IHdpZHRoIGlzIHJlYWQgZnJvbSB0aGUgbGl2ZSByZWN0IGF0IGV2ZW50IHRpbWUsIHNvIHBvaW50ZXIgbWF0aFxuICAvLyBzdGF5cyBleGFjdCB3aGlsZSB0aGUgc3RyaXAgaXMgYmVpbmcgcmVzaXplZCBtaWQtZ2VzdHVyZS5cbiAgY29uc3QgcG9pbnRlckZyYW1lID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MRGl2RWxlbWVudD4pOiB7IHg6IG51bWJlcjsgY3c6IG51bWJlciB9ID0+IHtcbiAgICAgIGNvbnN0IHJlY3QgPSBlLmN1cnJlbnRUYXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBlLmNsaWVudFggLSByZWN0LmxlZnQsXG4gICAgICAgIGN3OiByZWN0LndpZHRoIC0gVElNRUxJTkVfUEFERElOR19QWCAqIDIsXG4gICAgICB9O1xuICAgIH0sXG4gICAgW11cbiAgKTtcblxuICBjb25zdCByZXNvbHZlRHJhZ1N0YXRlID0gdXNlQ2FsbGJhY2soXG4gICAgKHRhcmdldDogSFRNTEVsZW1lbnQsIHg6IG51bWJlciwgY3c6IG51bWJlcik6IERyYWdTdGF0ZSA9PiB7XG4gICAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLW1pbmltYXAtaGFuZGxlPVwibGVmdFwiXScpKSB7XG4gICAgICAgIHJldHVybiB7IG1vZGU6ICdyZXNpemUtbGVmdCcgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnW2RhdGEtbWluaW1hcC1oYW5kbGU9XCJyaWdodFwiXScpKSB7XG4gICAgICAgIHJldHVybiB7IG1vZGU6ICdyZXNpemUtcmlnaHQnIH07XG4gICAgICB9XG4gICAgICAvLyBQYW5uaW5nIGEgZnVsbC1leHRlbnQgd2luZG93IGlzIGEgbm8tb3AsIHNvIGxldCBhIGRyYWcgb24gdGhlIGJydXNoXG4gICAgICAvLyBzdGFydCBhIHNlbGVjdGlvbiBpbnN0ZWFkIOKAlCB0aGUgbmF0dXJhbCBmaXJzdCBnZXN0dXJlIG9uIHRoZSBtYXAuXG4gICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHZpZXdwb3J0UmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCBpc0Z1bGxFeHRlbnQgPVxuICAgICAgICBzdGFydCAtIHJvb3RTdGFydE1zIDwgcm9vdER1cmF0aW9uTXMgKiAwLjAwMSAmJlxuICAgICAgICByb290RW5kTXMgLSBlbmQgPCByb290RHVyYXRpb25NcyAqIDAuMDAxO1xuICAgICAgaWYgKHRhcmdldC5jbG9zZXN0KCdbZGF0YS1taW5pbWFwLWJydXNoXScpICYmICFpc0Z1bGxFeHRlbnQpIHtcbiAgICAgICAgcmV0dXJuIHsgbW9kZTogJ3BhbicsIGdyYWJPZmZzZXRNczogeFRvVGltZSh4LCBjdykgLSBzdGFydCB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbW9kZTogJ3NlbGVjdCcsIG9yaWdpblg6IHgsIG9yaWdpbk1zOiB4VG9UaW1lKHgsIGN3KSB9O1xuICAgIH0sXG4gICAgW3hUb1RpbWUsIHJvb3RTdGFydE1zLCByb290RHVyYXRpb25Ncywgcm9vdEVuZE1zXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZVBvaW50ZXJEb3duID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuICAgICAgY29uc3QgeyB4LCBjdyB9ID0gcG9pbnRlckZyYW1lKGUpO1xuICAgICAgaWYgKGN3IDw9IDApIHJldHVybjtcbiAgICAgIGUuY3VycmVudFRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICBzZXREcmFnKHJlc29sdmVEcmFnU3RhdGUoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIHgsIGN3KSk7XG4gICAgfSxcbiAgICBbcG9pbnRlckZyYW1lLCByZXNvbHZlRHJhZ1N0YXRlXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZVBvaW50ZXJNb3ZlID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICAgIGlmICghZHJhZykgcmV0dXJuO1xuICAgICAgY29uc3QgeyB4LCBjdyB9ID0gcG9pbnRlckZyYW1lKGUpO1xuICAgICAgY29uc3QgdCA9IHhUb1RpbWUoeCwgY3cpO1xuICAgICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB2aWV3cG9ydFJlZi5jdXJyZW50O1xuXG4gICAgICBpZiAoZHJhZy5tb2RlID09PSAncGFuJykge1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IGVuZCAtIHN0YXJ0O1xuICAgICAgICBvblZpZXdwb3J0Q2hhbmdlKFxuICAgICAgICAgIGNsYW1wKHtcbiAgICAgICAgICAgIHN0YXJ0OiB0IC0gZHJhZy5ncmFiT2Zmc2V0TXMsXG4gICAgICAgICAgICBlbmQ6IHQgLSBkcmFnLmdyYWJPZmZzZXRNcyArIGR1cmF0aW9uLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGRyYWcubW9kZSA9PT0gJ3Jlc2l6ZS1sZWZ0Jykge1xuICAgICAgICBvblZpZXdwb3J0Q2hhbmdlKHsgc3RhcnQ6IE1hdGgubWluKHQsIGVuZCAtIG1pblZpZXdwb3J0TXMpLCBlbmQgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRyYWcubW9kZSA9PT0gJ3Jlc2l6ZS1yaWdodCcpIHtcbiAgICAgICAgb25WaWV3cG9ydENoYW5nZSh7IHN0YXJ0LCBlbmQ6IE1hdGgubWF4KHQsIHN0YXJ0ICsgbWluVmlld3BvcnRNcykgfSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBzZWxlY3Rpb24gfHxcbiAgICAgICAgTWF0aC5hYnMoeCAtIGRyYWcub3JpZ2luWCkgPiBDTElDS19EUkFHX1RIUkVTSE9MRF9QWFxuICAgICAgKSB7XG4gICAgICAgIHNldFNlbGVjdGlvbih7XG4gICAgICAgICAgeDA6IE1hdGgubWluKGRyYWcub3JpZ2luWCwgeCksXG4gICAgICAgICAgeDE6IE1hdGgubWF4KGRyYWcub3JpZ2luWCwgeCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgZHJhZyxcbiAgICAgIHNlbGVjdGlvbixcbiAgICAgIHBvaW50ZXJGcmFtZSxcbiAgICAgIHhUb1RpbWUsXG4gICAgICBvblZpZXdwb3J0Q2hhbmdlLFxuICAgICAgY2xhbXAsXG4gICAgICBtaW5WaWV3cG9ydE1zLFxuICAgIF1cbiAgKTtcblxuICBjb25zdCBlbmREcmFnID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICAgIGlmICghZHJhZykgcmV0dXJuO1xuICAgICAgaWYgKGRyYWcubW9kZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgY29uc3QgeyB4LCBjdyB9ID0gcG9pbnRlckZyYW1lKGUpO1xuICAgICAgICBjb25zdCB0ID0geFRvVGltZSh4LCBjdyk7XG4gICAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICBvbkFuaW1hdGVUbyhcbiAgICAgICAgICAgIGNsYW1wKHtcbiAgICAgICAgICAgICAgc3RhcnQ6IE1hdGgubWluKGRyYWcub3JpZ2luTXMsIHQpLFxuICAgICAgICAgICAgICBlbmQ6IE1hdGgubWF4KGRyYWcub3JpZ2luTXMsIHQpLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFBsYWluIGNsaWNrOiBrZWVwIHRoZSBjdXJyZW50IHpvb20sIGNlbnRlciB0aGUgd2luZG93IHRoZXJlLlxuICAgICAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdmlld3BvcnRSZWYuY3VycmVudDtcbiAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IGVuZCAtIHN0YXJ0O1xuICAgICAgICAgIG9uQW5pbWF0ZVRvKFxuICAgICAgICAgICAgY2xhbXAoeyBzdGFydDogdCAtIGR1cmF0aW9uIC8gMiwgZW5kOiB0ICsgZHVyYXRpb24gLyAyIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2V0U2VsZWN0aW9uKG51bGwpO1xuICAgICAgc2V0RHJhZyhudWxsKTtcbiAgICB9LFxuICAgIFtkcmFnLCBzZWxlY3Rpb24sIHBvaW50ZXJGcmFtZSwgeFRvVGltZSwgb25BbmltYXRlVG8sIGNsYW1wXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUxvc3RQb2ludGVyQ2FwdHVyZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRTZWxlY3Rpb24obnVsbCk7XG4gICAgc2V0RHJhZyhudWxsKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZURvdWJsZUNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIG9uQW5pbWF0ZVRvKHsgc3RhcnQ6IHJvb3RTdGFydE1zLCBlbmQ6IHJvb3RFbmRNcyB9KTtcbiAgfSwgW29uQW5pbWF0ZVRvLCByb290U3RhcnRNcywgcm9vdEVuZE1zXSk7XG5cbiAgLy8gV2hlZWw6IHNhbWUgZ2VzdHVyZXMgYXMgdGhlIHRpbWVsaW5lLCBtYXBwZWQgdGhyb3VnaCB0aGUgZnVsbCBleHRlbnQuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZWwgPSBjb250YWluZXJSZWYuY3VycmVudDtcbiAgICBpZiAoIWVsIHx8IHJvb3REdXJhdGlvbk1zIDw9IDApIHJldHVybjtcblxuICAgIC8vIFRoZSBtaW5pbWFwJ3MgeCBheGlzIGlzIHRoZSBmdWxsIHJ1biwgc28gem9vbSBhcm91bmQgdGhlIGFic29sdXRlIHRpbWVcbiAgICAvLyB1bmRlciB0aGUgY3Vyc29yIHJhdGhlciB0aGFuIGEgdmlld3BvcnQgZnJhY3Rpb24uXG4gICAgY29uc3Qgem9vbUF0Q3Vyc29yID0gKGU6IFdoZWVsRXZlbnQsIGN3OiBudW1iZXIsIGxlZnQ6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgc2NhbGVGYWN0b3IgPSB3aGVlbFpvb21TY2FsZUZhY3RvcihlKTtcbiAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdmlld3BvcnRSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gZW5kIC0gc3RhcnQ7XG4gICAgICBjb25zdCBjdXJzb3JGcmFjdGlvbiA9IE1hdGgubWluKFxuICAgICAgICBNYXRoLm1heCgoZS5jbGllbnRYIC0gbGVmdCAtIFRJTUVMSU5FX1BBRERJTkdfUFgpIC8gY3csIDApLFxuICAgICAgICAxXG4gICAgICApO1xuICAgICAgY29uc3QgY3Vyc29yTXMgPSByb290U3RhcnRNcyArIGN1cnNvckZyYWN0aW9uICogcm9vdER1cmF0aW9uTXM7XG4gICAgICBjb25zdCBhbmNob3IgPSBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5tYXgoZHVyYXRpb24gPiAwID8gKGN1cnNvck1zIC0gc3RhcnQpIC8gZHVyYXRpb24gOiAwLjUsIDApLFxuICAgICAgICAxXG4gICAgICApO1xuICAgICAgY29uc3QgbmV3RHVyYXRpb24gPSBkdXJhdGlvbiAqIHNjYWxlRmFjdG9yO1xuICAgICAgb25WaWV3cG9ydENoYW5nZShcbiAgICAgICAgY2xhbXAoe1xuICAgICAgICAgIHN0YXJ0OiBjdXJzb3JNcyAtIGFuY2hvciAqIG5ld0R1cmF0aW9uLFxuICAgICAgICAgIGVuZDogY3Vyc29yTXMgKyAoMSAtIGFuY2hvcikgKiBuZXdEdXJhdGlvbixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIFBhbiBpbiBtYXAgY29vcmRpbmF0ZXM6IG9uZSBtYXAgcGl4ZWwgaXMgb25lIGZ1bGwtZXh0ZW50IGZyYWN0aW9uLlxuICAgIGNvbnN0IHBhbkJ5TWFwUGl4ZWxzID0gKGU6IFdoZWVsRXZlbnQsIGN3OiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGR4ID0gd2hlZWxEZWx0YVRvUGl4ZWxzKGUuZGVsdGFYLCBlLmRlbHRhTW9kZSk7XG4gICAgICBjb25zdCBwYW5NcyA9IChkeCAvIGN3KSAqIHJvb3REdXJhdGlvbk1zO1xuICAgICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB2aWV3cG9ydFJlZi5jdXJyZW50O1xuICAgICAgb25WaWV3cG9ydENoYW5nZShjbGFtcCh7IHN0YXJ0OiBzdGFydCArIHBhbk1zLCBlbmQ6IGVuZCArIHBhbk1zIH0pKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25XaGVlbCA9IChlOiBXaGVlbEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBpc1pvb21HZXN0dXJlID0gZS5jdHJsS2V5IHx8IGUubWV0YUtleTtcbiAgICAgIGNvbnN0IGhhc0RlbHRhWCA9IE1hdGguYWJzKGUuZGVsdGFYKSA+IE1hdGguYWJzKGUuZGVsdGFZKTtcbiAgICAgIGlmICghaXNab29tR2VzdHVyZSAmJiAhaGFzRGVsdGFYKSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGN3ID0gcmVjdC53aWR0aCAtIFRJTUVMSU5FX1BBRERJTkdfUFggKiAyO1xuICAgICAgaWYgKGN3IDw9IDApIHJldHVybjtcbiAgICAgIGlmIChpc1pvb21HZXN0dXJlKSB6b29tQXRDdXJzb3IoZSwgY3csIHJlY3QubGVmdCk7XG4gICAgICBlbHNlIHBhbkJ5TWFwUGl4ZWxzKGUsIGN3KTtcbiAgICB9O1xuXG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvbldoZWVsLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIHJldHVybiAoKSA9PiBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIG9uV2hlZWwpO1xuICB9LCBbcm9vdFN0YXJ0TXMsIHJvb3REdXJhdGlvbk1zLCBvblZpZXdwb3J0Q2hhbmdlLCBjbGFtcF0pO1xuXG4gIC8vIEFycm93IGtleXMgcGFuIHRoZSBmb2N1c2VkIGJydXNoOyBIb21lL0VuZCBqdW1wIHRvIHRoZSBlbmRzLlxuICBjb25zdCBoYW5kbGVLZXlEb3duID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IFJlYWN0LktleWJvYXJkRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHZpZXdwb3J0UmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IGVuZCAtIHN0YXJ0O1xuICAgICAgY29uc3QgcGFuID0gZHVyYXRpb24gKiBLRVlCT0FSRF9QQU5fRlJBQ1RJT047XG4gICAgICBpZiAoZS5rZXkgPT09ICdBcnJvd0xlZnQnKSB7XG4gICAgICAgIG9uVmlld3BvcnRDaGFuZ2UoY2xhbXAoeyBzdGFydDogc3RhcnQgLSBwYW4sIGVuZDogZW5kIC0gcGFuIH0pKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd1JpZ2h0Jykge1xuICAgICAgICBvblZpZXdwb3J0Q2hhbmdlKGNsYW1wKHsgc3RhcnQ6IHN0YXJ0ICsgcGFuLCBlbmQ6IGVuZCArIHBhbiB9KSk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnSG9tZScpIHtcbiAgICAgICAgb25WaWV3cG9ydENoYW5nZShcbiAgICAgICAgICBjbGFtcCh7IHN0YXJ0OiByb290U3RhcnRNcywgZW5kOiByb290U3RhcnRNcyArIGR1cmF0aW9uIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnRW5kJykge1xuICAgICAgICBvblZpZXdwb3J0Q2hhbmdlKFxuICAgICAgICAgIGNsYW1wKHsgc3RhcnQ6IHJvb3RFbmRNcyAtIGR1cmF0aW9uLCBlbmQ6IHJvb3RFbmRNcyB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0sXG4gICAgW29uVmlld3BvcnRDaGFuZ2UsIGNsYW1wLCByb290U3RhcnRNcywgcm9vdEVuZE1zXVxuICApO1xuXG4gIC8vIEJydXNoIGdlb21ldHJ5IGluIENTUyBjYWxjKCkgZnJvbSB0aW1lIGZyYWN0aW9ucywgc28gdGhlIHRodW1iIHJlZmxvd3MgaW5cbiAgLy8gdGhlIHNhbWUgZnJhbWUgYXMgYW55IGNvbnRhaW5lciByZXNpemUgaW5zdGVhZCBvZiBsYWdnaW5nIGEgc3RhdGUgdXBkYXRlLlxuICBjb25zdCBzdGFydEZyYWN0aW9uID0gKHZpZXdwb3J0LnN0YXJ0IC0gcm9vdFN0YXJ0TXMpIC8gcm9vdER1cmF0aW9uTXM7XG4gIGNvbnN0IGVuZEZyYWN0aW9uID0gKHZpZXdwb3J0LmVuZCAtIHJvb3RTdGFydE1zKSAvIHJvb3REdXJhdGlvbk1zO1xuICBjb25zdCB0cmFja1dpZHRoID0gYCgxMDAlIC0gJHtUSU1FTElORV9QQURESU5HX1BYICogMn1weClgO1xuICBjb25zdCBicnVzaFN0eWxlID0ge1xuICAgIGxlZnQ6IGBjYWxjKCR7VElNRUxJTkVfUEFERElOR19QWH1weCArICR7c3RhcnRGcmFjdGlvbn0gKiAke3RyYWNrV2lkdGh9KWAsXG4gICAgd2lkdGg6IGBtYXgoJHtNSU5fQlJVU0hfV0lEVEhfUFh9cHgsIGNhbGMoJHtcbiAgICAgIGVuZEZyYWN0aW9uIC0gc3RhcnRGcmFjdGlvblxuICAgIH0gKiAke3RyYWNrV2lkdGh9KSlgLFxuICB9O1xuXG4gIGNvbnN0IHZpZXdEdXJhdGlvbiA9IHZpZXdwb3J0LmVuZCAtIHZpZXdwb3J0LnN0YXJ0O1xuICBjb25zdCBzY3JvbGxhYmxlTXMgPSBNYXRoLm1heChyb290RHVyYXRpb25NcyAtIHZpZXdEdXJhdGlvbiwgMCk7XG4gIGNvbnN0IHNjcm9sbFBlcmNlbnQgPVxuICAgIHNjcm9sbGFibGVNcyA+IDBcbiAgICAgID8gTWF0aC5yb3VuZCgoKHZpZXdwb3J0LnN0YXJ0IC0gcm9vdFN0YXJ0TXMpIC8gc2Nyb2xsYWJsZU1zKSAqIDEwMClcbiAgICAgIDogMDtcblxuICByZXR1cm4gKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2ExMXkvbm9TdGF0aWNFbGVtZW50SW50ZXJhY3Rpb25zOiBwb2ludGVyIGdlc3R1cmVzIGFyZSBhIG1vdXNlLW9ubHkgZW5oYW5jZW1lbnQ7IHRoZSBicnVzaCBpbnNpZGUgaXMga2V5Ym9hcmQtb3BlcmFibGVcbiAgICA8ZGl2XG4gICAgICByZWY9e2NvbnRhaW5lclJlZn1cbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdyZWxhdGl2ZSBoLTEwIG1pbi1oLTEwIHctZnVsbCBib3JkZXItYiBib3JkZXItZ3JheS1hbHBoYS00MDAgYmctYmFja2dyb3VuZC0xMDAgc2VsZWN0LW5vbmUgb3ZlcmZsb3ctaGlkZGVuIHRvdWNoLW5vbmUnLFxuICAgICAgICBkcmFnPy5tb2RlID09PSAnc2VsZWN0JyAmJiAnY3Vyc29yLWNyb3NzaGFpcidcbiAgICAgICl9XG4gICAgICBvblBvaW50ZXJEb3duPXtoYW5kbGVQb2ludGVyRG93bn1cbiAgICAgIG9uUG9pbnRlck1vdmU9e2hhbmRsZVBvaW50ZXJNb3ZlfVxuICAgICAgb25Qb2ludGVyVXA9e2VuZERyYWd9XG4gICAgICBvblBvaW50ZXJDYW5jZWw9e2VuZERyYWd9XG4gICAgICBvbkxvc3RQb2ludGVyQ2FwdHVyZT17aGFuZGxlTG9zdFBvaW50ZXJDYXB0dXJlfVxuICAgICAgb25Eb3VibGVDbGljaz17aGFuZGxlRG91YmxlQ2xpY2t9XG4gICAgPlxuICAgICAgey8qIE11bHRpcGx5IG9uIGxpZ2h0IHRoZW1lcyAvIHNjcmVlbiBvbiBkYXJrLCBzbyBvdmVybGFwcGluZyBzcGFuIGxpbmVzXG4gICAgICAgICAgZGVlcGVuIGluc3RlYWQgb2Ygb2NjbHVkaW5nIGFuZCB0aGUgZ2xhc3MgdGh1bWIgcmVhZHMgdGhyb3VnaCB0aGVtLiAqL31cbiAgICAgIDxjYW52YXNcbiAgICAgICAgcmVmPXtjYW52YXNSZWZ9XG4gICAgICAgIGFyaWEtaGlkZGVuXG4gICAgICAgIGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgaW5zZXQtMCBoLWZ1bGwgdy1mdWxsIG1peC1ibGVuZC1tdWx0aXBseSBbLmRhcmstdGhlbWVfJl06bWl4LWJsZW5kLXNjcmVlbiBbLmRhcmtfJl06bWl4LWJsZW5kLXNjcmVlbiBbW2RhdGEtdGhlbWU9ZGFya11fJl06bWl4LWJsZW5kLXNjcmVlblwiXG4gICAgICAvPlxuICAgICAge3NlbGVjdGlvbiA/IChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGFyaWEtaGlkZGVuXG4gICAgICAgICAgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSBpbnNldC15LTAgYm9yZGVyIGJvcmRlci1ibHVlLTUwMCBiZy1ibHVlLTMwMCBvcGFjaXR5LTQwXCJcbiAgICAgICAgICBzdHlsZT17eyBsZWZ0OiBzZWxlY3Rpb24ueDAsIHdpZHRoOiBzZWxlY3Rpb24ueDEgLSBzZWxlY3Rpb24ueDAgfX1cbiAgICAgICAgLz5cbiAgICAgICkgOiBudWxsfVxuICAgICAgPGRpdlxuICAgICAgICBkYXRhLW1pbmltYXAtYnJ1c2hcbiAgICAgICAgcm9sZT1cInNjcm9sbGJhclwiXG4gICAgICAgIGFyaWEtY29udHJvbHM9XCJ0cmFjZS10aW1lbGluZVwiXG4gICAgICAgIGFyaWEtb3JpZW50YXRpb249XCJob3Jpem9udGFsXCJcbiAgICAgICAgYXJpYS12YWx1ZW1pbj17MH1cbiAgICAgICAgYXJpYS12YWx1ZW1heD17MTAwfVxuICAgICAgICBhcmlhLXZhbHVlbm93PXtzY3JvbGxQZXJjZW50fVxuICAgICAgICBhcmlhLXZhbHVldGV4dD17YFZpZXdpbmcgJHtmb3JtYXREdXJhdGlvblByZWNpc2UoXG4gICAgICAgICAgdmlld3BvcnQuc3RhcnQgLSByb290U3RhcnRNc1xuICAgICAgICApfSB0byAke2Zvcm1hdER1cmF0aW9uUHJlY2lzZShcbiAgICAgICAgICB2aWV3cG9ydC5lbmQgLSByb290U3RhcnRNc1xuICAgICAgICApfSBvZiAke2Zvcm1hdER1cmF0aW9uUHJlY2lzZShyb290RHVyYXRpb25Ncyl9YH1cbiAgICAgICAgYXJpYS1sYWJlbD1cIlRpbWVsaW5lIG92ZXJ2aWV3XCJcbiAgICAgICAgdGFiSW5kZXg9ezB9XG4gICAgICAgIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn1cbiAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAvLyBHbGFzcyB0aHVtYiwgbWF0Y2hpbmcgdGhlIGxlZ2FjeSB0cmFjZSB2aWV3ZXIncyBtYXAgd2luZG93LlxuICAgICAgICAgICdncm91cC9taW5pbWFwLWJydXNoIGFic29sdXRlIHRvcC0wLjUgYm90dG9tLTAuNSByb3VuZGVkLVszcHhdIGJvcmRlciBib3JkZXItZ3JheS1hbHBoYS00MDAgYmctZ3JheS1hbHBoYS0yMDAgc2hhZG93LXNtIGZvY3VzLXZpc2libGU6b3V0bGluZSBmb2N1cy12aXNpYmxlOm91dGxpbmUtMiBmb2N1cy12aXNpYmxlOi1vdXRsaW5lLW9mZnNldC0yIGZvY3VzLXZpc2libGU6b3V0bGluZS1bdmFyKC0tZHMtZm9jdXMtY29sb3IpXScsXG4gICAgICAgICAgZHJhZz8ubW9kZSA9PT0gJ3BhbicgPyAnY3Vyc29yLWdyYWJiaW5nJyA6ICdjdXJzb3ItZ3JhYidcbiAgICAgICAgKX1cbiAgICAgICAgc3R5bGU9e2JydXNoU3R5bGV9XG4gICAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBkYXRhLW1pbmltYXAtaGFuZGxlPVwibGVmdFwiXG4gICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQteS0wIC1sZWZ0LTEgZmxleCB3LTIuNSBjdXJzb3ItZXctcmVzaXplIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgJ2gtMy41IHctWzNweF0gcm91bmRlZC1mdWxsIGJnLWdyYXktNjAwIG9wYWNpdHktMCB0cmFuc2l0aW9uLW9wYWNpdHkgZ3JvdXAtaG92ZXIvbWluaW1hcC1icnVzaDpvcGFjaXR5LTEwMCBncm91cC1mb2N1cy12aXNpYmxlL21pbmltYXAtYnJ1c2g6b3BhY2l0eS0xMDAnLFxuICAgICAgICAgICAgICBkcmFnICYmICdvcGFjaXR5LTEwMCdcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBkYXRhLW1pbmltYXAtaGFuZGxlPVwicmlnaHRcIlxuICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXktMCAtcmlnaHQtMSBmbGV4IHctMi41IGN1cnNvci1ldy1yZXNpemUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAnaC0zLjUgdy1bM3B4XSByb3VuZGVkLWZ1bGwgYmctZ3JheS02MDAgb3BhY2l0eS0wIHRyYW5zaXRpb24tb3BhY2l0eSBncm91cC1ob3Zlci9taW5pbWFwLWJydXNoOm9wYWNpdHktMTAwIGdyb3VwLWZvY3VzLXZpc2libGUvbWluaW1hcC1icnVzaDpvcGFjaXR5LTEwMCcsXG4gICAgICAgICAgICAgIGRyYWcgJiYgJ29wYWNpdHktMTAwJ1xuICAgICAgICAgICAgKX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufSk7XG4iXX0=
@@ -2,9 +2,7 @@ import { type ReactNode, type RefObject } from 'react';
2
2
  export interface SplitPaneProps {
3
3
  children: ReactNode;
4
4
  className?: string;
5
- /** Fixed (non-scrolling) header rendered above the start pane. */
6
5
  startHeader?: ReactNode;
7
- /** Fixed (non-scrolling) header rendered above the end pane. */
8
6
  endHeader?: ReactNode;
9
7
  scrollContainerRef?: RefObject<HTMLDivElement | null>;
10
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"split-pane.d.ts","sourceRoot":"","sources":["../../../../src/components/new-trace-viewer/components/split-pane.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,SAAS,EAEd,KAAK,SAAS,EAKf,MAAM,OAAO,CAAC;AAUf,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,gEAAgE;IAChE,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,kBAAkB,CAAC,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;CACvD;AAED,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,EACT,kBAAkB,GACnB,EAAE,cAAc,2CAqJhB"}
1
+ {"version":3,"file":"split-pane.d.ts","sourceRoot":"","sources":["../../../../src/components/new-trace-viewer/components/split-pane.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,SAAS,EAIf,MAAM,OAAO,CAAC;AAaf,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,kBAAkB,CAAC,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;CACvD;AAED,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,EACT,kBAAkB,GACnB,EAAE,cAAc,2CA8FhB"}
@@ -1,33 +1,21 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Children, useCallback, useEffect, useRef, useState, } from 'react';
3
+ import { Children, useCallback, useRef, useState, } from 'react';
4
4
  import { cn } from '../../../lib/cn';
5
+ import { DraggableBorder } from './draggable-border';
5
6
  import { DEFAULT_START_PX, GUTTER_PX, MIN_PX, paneColTemplate, } from './pane-constants';
6
7
  import { useElementWidth } from './use-element-width';
8
+ const SPLIT_PANE_START_ID = 'trace-split-start';
7
9
  export function SplitPane({ children, className, startHeader, endHeader, scrollContainerRef, }) {
8
10
  const parts = Children.toArray(children);
9
11
  if (parts.length !== 2) {
10
12
  throw new Error('SplitPane expects exactly two children');
11
13
  }
12
14
  const [start, end] = parts;
13
- // `startPx` is the user's preferred width; the rendered width is derived by
14
- // clamping against the live container width (same model as the detail
15
- // panel), so shrinking the container compresses the pane without destroying
16
- // the preference, and re-growing restores it.
17
15
  const [startPx, setStartPx] = useState(DEFAULT_START_PX);
18
- const [isDragging, setIsDragging] = useState(false);
19
16
  const containerRef = useRef(null);
20
- const gutterRef = useRef(null);
21
- const rafRef = useRef(null);
22
- const pendingPx = useRef(DEFAULT_START_PX);
23
- const pointerIdRef = useRef(null);
17
+ const startRef = useRef(null);
24
18
  const containerWidth = useElementWidth(containerRef);
25
- useEffect(() => {
26
- return () => {
27
- if (rafRef.current)
28
- cancelAnimationFrame(rafRef.current);
29
- };
30
- }, []);
31
19
  const setContainerRef = useCallback((node) => {
32
20
  containerRef.current = node;
33
21
  if (scrollContainerRef) {
@@ -41,67 +29,13 @@ export function SplitPane({ children, className, startHeader, endHeader, scrollC
41
29
  const maxPx = el.getBoundingClientRect().width - MIN_PX - GUTTER_PX;
42
30
  return Math.min(maxPx, Math.max(MIN_PX, px));
43
31
  }, []);
44
- useEffect(() => {
45
- if (!isDragging)
46
- return;
47
- const onPointerMove = (e) => {
48
- if (e.pointerId !== pointerIdRef.current)
49
- return;
50
- const container = containerRef.current;
51
- if (!container)
52
- return;
53
- const rect = container.getBoundingClientRect();
54
- pendingPx.current = clampPx(e.clientX - rect.left);
55
- if (!rafRef.current) {
56
- rafRef.current = requestAnimationFrame(() => {
57
- rafRef.current = null;
58
- setStartPx(pendingPx.current);
59
- });
60
- }
61
- };
62
- const onPointerUp = (e) => {
63
- if (e.pointerId !== pointerIdRef.current)
64
- return;
65
- const gutter = gutterRef.current;
66
- if (gutter?.hasPointerCapture(e.pointerId)) {
67
- gutter.releasePointerCapture(e.pointerId);
68
- }
69
- if (rafRef.current) {
70
- cancelAnimationFrame(rafRef.current);
71
- rafRef.current = null;
72
- }
73
- pointerIdRef.current = null;
74
- setIsDragging(false);
75
- };
76
- document.addEventListener('pointermove', onPointerMove);
77
- document.addEventListener('pointerup', onPointerUp);
78
- document.addEventListener('pointercancel', onPointerUp);
79
- return () => {
80
- document.removeEventListener('pointermove', onPointerMove);
81
- document.removeEventListener('pointerup', onPointerUp);
82
- document.removeEventListener('pointercancel', onPointerUp);
83
- };
84
- }, [isDragging, clampPx]);
85
- const handlePointerDown = (e) => {
86
- e.currentTarget.setPointerCapture(e.pointerId);
87
- pointerIdRef.current = e.pointerId;
88
- setIsDragging(true);
89
- };
90
- const handleLostPointerCapture = () => {
91
- pointerIdRef.current = null;
92
- setIsDragging(false);
93
- if (rafRef.current) {
94
- cancelAnimationFrame(rafRef.current);
95
- rafRef.current = null;
96
- }
97
- };
98
- // Floor applied last so the start column can never collapse below MIN_PX
99
- // (which would produce an invalid negative grid track on tiny containers).
32
+ const handleWidthChange = useCallback((next) => setStartPx(clampPx(next)), [clampPx]);
33
+ const handleReset = useCallback(() => setStartPx(clampPx(DEFAULT_START_PX)), [clampPx]);
100
34
  const effectiveStartPx = containerWidth > 0
101
35
  ? Math.max(MIN_PX, Math.min(containerWidth - MIN_PX - GUTTER_PX, startPx))
102
36
  : startPx;
103
37
  const colTemplate = paneColTemplate(effectiveStartPx);
104
- const gutter = (_jsx("div", { ref: gutterRef, className: "relative z-20 isolate flex shrink-0 cursor-col-resize justify-center", onPointerDown: handlePointerDown, onLostPointerCapture: handleLostPointerCapture, children: _jsx("span", { className: "pointer-events-none relative z-10 h-full w-px shrink-0 bg-gray-alpha-400", "aria-hidden": true }) }));
105
- return (_jsxs("div", { className: cn('flex flex-col h-full min-h-0', className), children: [_jsxs("div", { className: "shrink-0 grid", style: { gridTemplateColumns: colTemplate }, children: [_jsx("div", { children: startHeader }), _jsx("div", { className: "flex justify-center", children: _jsx("span", { className: "h-full w-px bg-gray-alpha-400", "aria-hidden": true }) }), _jsx("div", { children: endHeader })] }), _jsxs("div", { ref: setContainerRef, className: cn('grid flex-1 min-h-0 overflow-x-hidden overflow-y-auto', isDragging && 'select-none'), style: { gridTemplateColumns: colTemplate }, children: [start, gutter, end] })] }));
38
+ const maxStartPx = Math.max(MIN_PX, containerWidth > 0 ? containerWidth - MIN_PX - GUTTER_PX : startPx);
39
+ return (_jsxs("div", { className: cn('flex flex-col h-full min-h-0', className), children: [_jsxs("div", { className: "shrink-0 grid", style: { gridTemplateColumns: colTemplate }, children: [_jsx("div", { children: startHeader }), _jsx("div", { className: "flex justify-center", children: _jsx("span", { className: "h-full w-px bg-gray-alpha-400", "aria-hidden": true }) }), _jsx("div", { children: endHeader })] }), _jsxs("div", { ref: setContainerRef, className: "grid flex-1 min-h-0 overflow-x-hidden overflow-y-auto", style: { gridTemplateColumns: colTemplate }, children: [_jsx("div", { ref: startRef, id: SPLIT_PANE_START_ID, className: "min-w-0", children: start }), _jsxs("div", { className: "relative z-20 isolate flex shrink-0 justify-center", children: [_jsx("span", { className: "pointer-events-none relative z-10 h-full w-px shrink-0 bg-gray-alpha-400", "aria-hidden": true }), _jsx(DraggableBorder, { element: startRef, position: "right", onWidthChange: handleWidthChange, onReset: handleReset, "aria-label": "Resize event list", "aria-controls": SPLIT_PANE_START_ID, "aria-valuemin": MIN_PX, "aria-valuemax": maxStartPx, "aria-valuenow": Math.min(Math.max(Math.round(effectiveStartPx), MIN_PX), maxStartPx) })] }), end] })] }));
106
40
  }
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQtcGFuZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL25ldy10cmFjZS12aWV3ZXIvY29tcG9uZW50cy9zcGxpdC1wYW5lLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBRWIsT0FBTyxFQUNMLFFBQVEsRUFJUixXQUFXLEVBQ1gsU0FBUyxFQUNULE1BQU0sRUFDTixRQUFRLEdBQ1QsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckMsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsTUFBTSxFQUNOLGVBQWUsR0FDaEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFZdEQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxFQUN4QixRQUFRLEVBQ1IsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1Qsa0JBQWtCLEdBQ0g7SUFDZixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUNELE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTNCLDRFQUE0RTtJQUM1RSxzRUFBc0U7SUFDdEUsNEVBQTRFO0lBQzVFLDhDQUE4QztJQUM5QyxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELE1B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LGFBQWEsQ0FDNUIsRUFDRCxLQUFLLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsYUFFMUMsS0FBSyxFQUNMLE1BQU0sRUFDTixHQUFHLElBQ0EsSUFDRixDQUNQLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQge1xuICBDaGlsZHJlbixcbiAgdHlwZSBSZWFjdE5vZGUsXG4gIHR5cGUgUG9pbnRlckV2ZW50IGFzIFJlYWN0UG9pbnRlckV2ZW50LFxuICB0eXBlIFJlZk9iamVjdCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi8uLi9saWIvY24nO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9TVEFSVF9QWCxcbiAgR1VUVEVSX1BYLFxuICBNSU5fUFgsXG4gIHBhbmVDb2xUZW1wbGF0ZSxcbn0gZnJvbSAnLi9wYW5lLWNvbnN0YW50cyc7XG5pbXBvcnQgeyB1c2VFbGVtZW50V2lkdGggfSBmcm9tICcuL3VzZS1lbGVtZW50LXdpZHRoJztcblxuZXhwb3J0IGludGVyZmFjZSBTcGxpdFBhbmVQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgLyoqIEZpeGVkIChub24tc2Nyb2xsaW5nKSBoZWFkZXIgcmVuZGVyZWQgYWJvdmUgdGhlIHN0YXJ0IHBhbmUuICovXG4gIHN0YXJ0SGVhZGVyPzogUmVhY3ROb2RlO1xuICAvKiogRml4ZWQgKG5vbi1zY3JvbGxpbmcpIGhlYWRlciByZW5kZXJlZCBhYm92ZSB0aGUgZW5kIHBhbmUuICovXG4gIGVuZEhlYWRlcj86IFJlYWN0Tm9kZTtcbiAgc2Nyb2xsQ29udGFpbmVyUmVmPzogUmVmT2JqZWN0PEhUTUxEaXZFbGVtZW50IHwgbnVsbD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTcGxpdFBhbmUoe1xuICBjaGlsZHJlbixcbiAgY2xhc3NOYW1lLFxuICBzdGFydEhlYWRlcixcbiAgZW5kSGVhZGVyLFxuICBzY3JvbGxDb250YWluZXJSZWYsXG59OiBTcGxpdFBhbmVQcm9wcykge1xuICBjb25zdCBwYXJ0cyA9IENoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTcGxpdFBhbmUgZXhwZWN0cyBleGFjdGx5IHR3byBjaGlsZHJlbicpO1xuICB9XG4gIGNvbnN0IFtzdGFydCwgZW5kXSA9IHBhcnRzO1xuXG4gIC8vIGBzdGFydFB4YCBpcyB0aGUgdXNlcidzIHByZWZlcnJlZCB3aWR0aDsgdGhlIHJlbmRlcmVkIHdpZHRoIGlzIGRlcml2ZWQgYnlcbiAgLy8gY2xhbXBpbmcgYWdhaW5zdCB0aGUgbGl2ZSBjb250YWluZXIgd2lkdGggKHNhbWUgbW9kZWwgYXMgdGhlIGRldGFpbFxuICAvLyBwYW5lbCksIHNvIHNocmlua2luZyB0aGUgY29udGFpbmVyIGNvbXByZXNzZXMgdGhlIHBhbmUgd2l0aG91dCBkZXN0cm95aW5nXG4gIC8vIHRoZSBwcmVmZXJlbmNlLCBhbmQgcmUtZ3Jvd2luZyByZXN0b3JlcyBpdC5cbiAgY29uc3QgW3N0YXJ0UHgsIHNldFN0YXJ0UHhdID0gdXNlU3RhdGUoREVGQVVMVF9TVEFSVF9QWCk7XG4gIGNvbnN0IFtpc0RyYWdnaW5nLCBzZXRJc0RyYWdnaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgY29udGFpbmVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3QgZ3V0dGVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3QgcmFmUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpO1xuICBjb25zdCBwZW5kaW5nUHggPSB1c2VSZWYoREVGQVVMVF9TVEFSVF9QWCk7XG4gIGNvbnN0IHBvaW50ZXJJZFJlZiA9IHVzZVJlZjxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgY29uc3QgY29udGFpbmVyV2lkdGggPSB1c2VFbGVtZW50V2lkdGgoY29udGFpbmVyUmVmKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAocmFmUmVmLmN1cnJlbnQpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZlJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgY29uc3Qgc2V0Q29udGFpbmVyUmVmID0gdXNlQ2FsbGJhY2soXG4gICAgKG5vZGU6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgICAgY29udGFpbmVyUmVmLmN1cnJlbnQgPSBub2RlO1xuICAgICAgaWYgKHNjcm9sbENvbnRhaW5lclJlZikge1xuICAgICAgICBzY3JvbGxDb250YWluZXJSZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICB9XG4gICAgfSxcbiAgICBbc2Nyb2xsQ29udGFpbmVyUmVmXVxuICApO1xuXG4gIGNvbnN0IGNsYW1wUHggPSB1c2VDYWxsYmFjaygocHg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IGVsID0gY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuIHB4O1xuICAgIGNvbnN0IG1heFB4ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSBNSU5fUFggLSBHVVRURVJfUFg7XG4gICAgcmV0dXJuIE1hdGgubWluKG1heFB4LCBNYXRoLm1heChNSU5fUFgsIHB4KSk7XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaXNEcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IChlOiBnbG9iYWxUaGlzLlBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgaWYgKGUucG9pbnRlcklkICE9PSBwb2ludGVySWRSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgICAgY29uc3QgY29udGFpbmVyID0gY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICAgICAgY29uc3QgcmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHBlbmRpbmdQeC5jdXJyZW50ID0gY2xhbXBQeChlLmNsaWVudFggLSByZWN0LmxlZnQpO1xuICAgICAgaWYgKCFyYWZSZWYuY3VycmVudCkge1xuICAgICAgICByYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgcmFmUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgIHNldFN0YXJ0UHgocGVuZGluZ1B4LmN1cnJlbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25Qb2ludGVyVXAgPSAoZTogZ2xvYmFsVGhpcy5Qb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGlmIChlLnBvaW50ZXJJZCAhPT0gcG9pbnRlcklkUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICAgIGNvbnN0IGd1dHRlciA9IGd1dHRlclJlZi5jdXJyZW50O1xuICAgICAgaWYgKGd1dHRlcj8uaGFzUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpKSB7XG4gICAgICAgIGd1dHRlci5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgfVxuICAgICAgaWYgKHJhZlJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZlJlZi5jdXJyZW50KTtcbiAgICAgICAgcmFmUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgfVxuICAgICAgcG9pbnRlcklkUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgc2V0SXNEcmFnZ2luZyhmYWxzZSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgb25Qb2ludGVyTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgb25Qb2ludGVyVXApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBvblBvaW50ZXJVcCk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBvblBvaW50ZXJNb3ZlKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIG9uUG9pbnRlclVwKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBvblBvaW50ZXJVcCk7XG4gICAgfTtcbiAgfSwgW2lzRHJhZ2dpbmcsIGNsYW1wUHhdKTtcblxuICBjb25zdCBoYW5kbGVQb2ludGVyRG93biA9IChlOiBSZWFjdFBvaW50ZXJFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICBlLmN1cnJlbnRUYXJnZXQuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgIHBvaW50ZXJJZFJlZi5jdXJyZW50ID0gZS5wb2ludGVySWQ7XG4gICAgc2V0SXNEcmFnZ2luZyh0cnVlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVMb3N0UG9pbnRlckNhcHR1cmUgPSAoKSA9PiB7XG4gICAgcG9pbnRlcklkUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIHNldElzRHJhZ2dpbmcoZmFsc2UpO1xuICAgIGlmIChyYWZSZWYuY3VycmVudCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmUmVmLmN1cnJlbnQpO1xuICAgICAgcmFmUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvLyBGbG9vciBhcHBsaWVkIGxhc3Qgc28gdGhlIHN0YXJ0IGNvbHVtbiBjYW4gbmV2ZXIgY29sbGFwc2UgYmVsb3cgTUlOX1BYXG4gIC8vICh3aGljaCB3b3VsZCBwcm9kdWNlIGFuIGludmFsaWQgbmVnYXRpdmUgZ3JpZCB0cmFjayBvbiB0aW55IGNvbnRhaW5lcnMpLlxuICBjb25zdCBlZmZlY3RpdmVTdGFydFB4ID1cbiAgICBjb250YWluZXJXaWR0aCA+IDBcbiAgICAgID8gTWF0aC5tYXgoTUlOX1BYLCBNYXRoLm1pbihjb250YWluZXJXaWR0aCAtIE1JTl9QWCAtIEdVVFRFUl9QWCwgc3RhcnRQeCkpXG4gICAgICA6IHN0YXJ0UHg7XG5cbiAgY29uc3QgY29sVGVtcGxhdGUgPSBwYW5lQ29sVGVtcGxhdGUoZWZmZWN0aXZlU3RhcnRQeCk7XG5cbiAgY29uc3QgZ3V0dGVyID0gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17Z3V0dGVyUmVmfVxuICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgei0yMCBpc29sYXRlIGZsZXggc2hyaW5rLTAgY3Vyc29yLWNvbC1yZXNpemUganVzdGlmeS1jZW50ZXJcIlxuICAgICAgb25Qb2ludGVyRG93bj17aGFuZGxlUG9pbnRlckRvd259XG4gICAgICBvbkxvc3RQb2ludGVyQ2FwdHVyZT17aGFuZGxlTG9zdFBvaW50ZXJDYXB0dXJlfVxuICAgID5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLW5vbmUgcmVsYXRpdmUgei0xMCBoLWZ1bGwgdy1weCBzaHJpbmstMCBiZy1ncmF5LWFscGhhLTQwMFwiXG4gICAgICAgIGFyaWEtaGlkZGVuXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2NuKCdmbGV4IGZsZXgtY29sIGgtZnVsbCBtaW4taC0wJywgY2xhc3NOYW1lKX0+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cInNocmluay0wIGdyaWRcIlxuICAgICAgICBzdHlsZT17eyBncmlkVGVtcGxhdGVDb2x1bW5zOiBjb2xUZW1wbGF0ZSB9fVxuICAgICAgPlxuICAgICAgICA8ZGl2PntzdGFydEhlYWRlcn08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaC1mdWxsIHctcHggYmctZ3JheS1hbHBoYS00MDBcIiBhcmlhLWhpZGRlbiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj57ZW5kSGVhZGVyfTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIHJlZj17c2V0Q29udGFpbmVyUmVmfVxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdncmlkIGZsZXgtMSBtaW4taC0wIG92ZXJmbG93LXgtaGlkZGVuIG92ZXJmbG93LXktYXV0bycsXG4gICAgICAgICAgaXNEcmFnZ2luZyAmJiAnc2VsZWN0LW5vbmUnXG4gICAgICAgICl9XG4gICAgICAgIHN0eWxlPXt7IGdyaWRUZW1wbGF0ZUNvbHVtbnM6IGNvbFRlbXBsYXRlIH19XG4gICAgICA+XG4gICAgICAgIHtzdGFydH1cbiAgICAgICAge2d1dHRlcn1cbiAgICAgICAge2VuZH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuIl19
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQtcGFuZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL25ldy10cmFjZS12aWV3ZXIvY29tcG9uZW50cy9zcGxpdC1wYW5lLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBRWIsT0FBTyxFQUNMLFFBQVEsRUFHUixXQUFXLEVBQ1gsTUFBTSxFQUNOLFFBQVEsR0FDVCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsTUFBTSxFQUNOLGVBQWUsR0FDaEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEQsTUFBTSxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQztBQVVoRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEVBQ3hCLFFBQVEsRUFDUixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxrQkFBa0IsR0FDSDtJQUNmLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQ0QsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7SUFFM0IsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN6RCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQWlCLElBQUksQ0FBQyxDQUFDO0lBQ2xELE1BQU0s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LFdBQVcsZ0JBQ1QsbUJBQW1CLG1CQUNmLG1CQUFtQixtQkFDbkIsTUFBTSxtQkFDTixVQUFVLG1CQUNWLElBQUksQ0FBQyxHQUFHLENBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUM5QyxVQUFVLENBQ1gsR0FDRCxJQUNFLEVBQ0wsR0FBRyxJQUNBLElBQ0YsQ0FDUCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHtcbiAgQ2hpbGRyZW4sXG4gIHR5cGUgUmVhY3ROb2RlLFxuICB0eXBlIFJlZk9iamVjdCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi4vLi4vLi4vbGliL2NuJztcbmltcG9ydCB7IERyYWdnYWJsZUJvcmRlciB9IGZyb20gJy4vZHJhZ2dhYmxlLWJvcmRlcic7XG5pbXBvcnQge1xuICBERUZBVUxUX1NUQVJUX1BYLFxuICBHVVRURVJfUFgsXG4gIE1JTl9QWCxcbiAgcGFuZUNvbFRlbXBsYXRlLFxufSBmcm9tICcuL3BhbmUtY29uc3RhbnRzJztcbmltcG9ydCB7IHVzZUVsZW1lbnRXaWR0aCB9IGZyb20gJy4vdXNlLWVsZW1lbnQtd2lkdGgnO1xuXG5jb25zdCBTUExJVF9QQU5FX1NUQVJUX0lEID0gJ3RyYWNlLXNwbGl0LXN0YXJ0JztcblxuZXhwb3J0IGludGVyZmFjZSBTcGxpdFBhbmVQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgc3RhcnRIZWFkZXI/OiBSZWFjdE5vZGU7XG4gIGVuZEhlYWRlcj86IFJlYWN0Tm9kZTtcbiAgc2Nyb2xsQ29udGFpbmVyUmVmPzogUmVmT2JqZWN0PEhUTUxEaXZFbGVtZW50IHwgbnVsbD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTcGxpdFBhbmUoe1xuICBjaGlsZHJlbixcbiAgY2xhc3NOYW1lLFxuICBzdGFydEhlYWRlcixcbiAgZW5kSGVhZGVyLFxuICBzY3JvbGxDb250YWluZXJSZWYsXG59OiBTcGxpdFBhbmVQcm9wcykge1xuICBjb25zdCBwYXJ0cyA9IENoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTcGxpdFBhbmUgZXhwZWN0cyBleGFjdGx5IHR3byBjaGlsZHJlbicpO1xuICB9XG4gIGNvbnN0IFtzdGFydCwgZW5kXSA9IHBhcnRzO1xuXG4gIGNvbnN0IFtzdGFydFB4LCBzZXRTdGFydFB4XSA9IHVzZVN0YXRlKERFRkFVTFRfU1RBUlRfUFgpO1xuICBjb25zdCBjb250YWluZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBzdGFydFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdXNlRWxlbWVudFdpZHRoKGNvbnRhaW5lclJlZik7XG5cbiAgY29uc3Qgc2V0Q29udGFpbmVyUmVmID0gdXNlQ2FsbGJhY2soXG4gICAgKG5vZGU6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgICAgY29udGFpbmVyUmVmLmN1cnJlbnQgPSBub2RlO1xuICAgICAgaWYgKHNjcm9sbENvbnRhaW5lclJlZikge1xuICAgICAgICBzY3JvbGxDb250YWluZXJSZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICB9XG4gICAgfSxcbiAgICBbc2Nyb2xsQ29udGFpbmVyUmVmXVxuICApO1xuXG4gIGNvbnN0IGNsYW1wUHggPSB1c2VDYWxsYmFjaygocHg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IGVsID0gY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuIHB4O1xuICAgIGNvbnN0IG1heFB4ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSBNSU5fUFggLSBHVVRURVJfUFg7XG4gICAgcmV0dXJuIE1hdGgubWluKG1heFB4LCBNYXRoLm1heChNSU5fUFgsIHB4KSk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVXaWR0aENoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXh0OiBudW1iZXIpID0+IHNldFN0YXJ0UHgoY2xhbXBQeChuZXh0KSksXG4gICAgW2NsYW1wUHhdXG4gICk7XG4gIGNvbnN0IGhhbmRsZVJlc2V0ID0gdXNlQ2FsbGJhY2soXG4gICAgKCkgPT4gc2V0U3RhcnRQeChjbGFtcFB4KERFRkFVTFRfU1RBUlRfUFgpKSxcbiAgICBbY2xhbXBQeF1cbiAgKTtcblxuICBjb25zdCBlZmZlY3RpdmVTdGFydFB4ID1cbiAgICBjb250YWluZXJXaWR0aCA+IDBcbiAgICAgID8gTWF0aC5tYXgoTUlOX1BYLCBNYXRoLm1pbihjb250YWluZXJXaWR0aCAtIE1JTl9QWCAtIEdVVFRFUl9QWCwgc3RhcnRQeCkpXG4gICAgICA6IHN0YXJ0UHg7XG5cbiAgY29uc3QgY29sVGVtcGxhdGUgPSBwYW5lQ29sVGVtcGxhdGUoZWZmZWN0aXZlU3RhcnRQeCk7XG5cbiAgY29uc3QgbWF4U3RhcnRQeCA9IE1hdGgubWF4KFxuICAgIE1JTl9QWCxcbiAgICBjb250YWluZXJXaWR0aCA+IDAgPyBjb250YWluZXJXaWR0aCAtIE1JTl9QWCAtIEdVVFRFUl9QWCA6IHN0YXJ0UHhcbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtjbignZmxleCBmbGV4LWNvbCBoLWZ1bGwgbWluLWgtMCcsIGNsYXNzTmFtZSl9PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9XCJzaHJpbmstMCBncmlkXCJcbiAgICAgICAgc3R5bGU9e3sgZ3JpZFRlbXBsYXRlQ29sdW1uczogY29sVGVtcGxhdGUgfX1cbiAgICAgID5cbiAgICAgICAgPGRpdj57c3RhcnRIZWFkZXJ9PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImgtZnVsbCB3LXB4IGJnLWdyYXktYWxwaGEtNDAwXCIgYXJpYS1oaWRkZW4gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+e2VuZEhlYWRlcn08L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICByZWY9e3NldENvbnRhaW5lclJlZn1cbiAgICAgICAgY2xhc3NOYW1lPVwiZ3JpZCBmbGV4LTEgbWluLWgtMCBvdmVyZmxvdy14LWhpZGRlbiBvdmVyZmxvdy15LWF1dG9cIlxuICAgICAgICBzdHlsZT17eyBncmlkVGVtcGxhdGVDb2x1bW5zOiBjb2xUZW1wbGF0ZSB9fVxuICAgICAgPlxuICAgICAgICA8ZGl2IHJlZj17c3RhcnRSZWZ9IGlkPXtTUExJVF9QQU5FX1NUQVJUX0lEfSBjbGFzc05hbWU9XCJtaW4tdy0wXCI+XG4gICAgICAgICAge3N0YXJ0fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSB6LTIwIGlzb2xhdGUgZmxleCBzaHJpbmstMCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJwb2ludGVyLWV2ZW50cy1ub25lIHJlbGF0aXZlIHotMTAgaC1mdWxsIHctcHggc2hyaW5rLTAgYmctZ3JheS1hbHBoYS00MDBcIlxuICAgICAgICAgICAgYXJpYS1oaWRkZW5cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxEcmFnZ2FibGVCb3JkZXJcbiAgICAgICAgICAgIGVsZW1lbnQ9e3N0YXJ0UmVmfVxuICAgICAgICAgICAgcG9zaXRpb249XCJyaWdodFwiXG4gICAgICAgICAgICBvbldpZHRoQ2hhbmdlPXtoYW5kbGVXaWR0aENoYW5nZX1cbiAgICAgICAgICAgIG9uUmVzZXQ9e2hhbmRsZVJlc2V0fVxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlc2l6ZSBldmVudCBsaXN0XCJcbiAgICAgICAgICAgIGFyaWEtY29udHJvbHM9e1NQTElUX1BBTkVfU1RBUlRfSUR9XG4gICAgICAgICAgICBhcmlhLXZhbHVlbWluPXtNSU5fUFh9XG4gICAgICAgICAgICBhcmlhLXZhbHVlbWF4PXttYXhTdGFydFB4fVxuICAgICAgICAgICAgYXJpYS12YWx1ZW5vdz17TWF0aC5taW4oXG4gICAgICAgICAgICAgIE1hdGgubWF4KE1hdGgucm91bmQoZWZmZWN0aXZlU3RhcnRQeCksIE1JTl9QWCksXG4gICAgICAgICAgICAgIG1heFN0YXJ0UHhcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHtlbmR9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../../../src/components/new-trace-viewer/components/timeline.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AAgBtD,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,EAIV,UAAU,EACX,MAAM,UAAU,CAAC;AAwBlB,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAoUtC,QAAA,MAAM,WAAW,yIASd;IACD,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC,KAAG,SAAS,CAqJX,CAAC;AAEH,OAAO,EAAE,WAAW,EAAE,CAAC;AAiDvB,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,SAAS,GACV,EAAE;IACD,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACxD,GAAG,SAAS,CAwBZ;AAMD,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,SAAS,EACT,OAAO,EACP,OAAO,EACP,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,OAAe,GAChB,EAAE;IACD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,SAAS,CA6FZ"}
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../../../src/components/new-trace-viewer/components/timeline.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AAetD,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,EAIV,UAAU,EACX,MAAM,UAAU,CAAC;AAyBlB,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAoUtC,QAAA,MAAM,WAAW,yIASd;IACD,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC,KAAG,SAAS,CAmJX,CAAC;AAEH,OAAO,EAAE,WAAW,EAAE,CAAC;AAiDvB,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,SAAS,GACV,EAAE;IACD,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACxD,GAAG,SAAS,CAwBZ;AAMD,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,SAAS,EACT,OAAO,EACP,OAAO,EACP,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,OAAe,GAChB,EAAE;IACD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,SAAS,CA6FZ"}