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

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 (74) hide show
  1. package/dist/components/new-trace-viewer/components/detail-panel-width.d.ts +34 -0
  2. package/dist/components/new-trace-viewer/components/detail-panel-width.d.ts.map +1 -0
  3. package/dist/components/new-trace-viewer/components/detail-panel-width.js +67 -0
  4. package/dist/components/new-trace-viewer/components/detail-panel.d.ts +14 -0
  5. package/dist/components/new-trace-viewer/components/detail-panel.d.ts.map +1 -0
  6. package/dist/components/new-trace-viewer/components/detail-panel.js +122 -0
  7. package/dist/components/new-trace-viewer/components/draggable-border.d.ts +31 -0
  8. package/dist/components/new-trace-viewer/components/draggable-border.d.ts.map +1 -0
  9. package/dist/components/new-trace-viewer/components/draggable-border.js +140 -0
  10. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts +1 -1
  11. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -1
  12. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +2 -2
  13. package/dist/components/new-trace-viewer/components/pane-constants.d.ts +14 -0
  14. package/dist/components/new-trace-viewer/components/pane-constants.d.ts.map +1 -0
  15. package/dist/components/new-trace-viewer/components/pane-constants.js +16 -0
  16. package/dist/components/new-trace-viewer/components/split-pane.d.ts +1 -4
  17. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -1
  18. package/dist/components/new-trace-viewer/components/split-pane.js +18 -16
  19. package/dist/components/new-trace-viewer/components/timeline.d.ts +2 -2
  20. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -1
  21. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -1
  22. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +5 -2
  23. package/dist/components/new-trace-viewer/components/use-element-width.d.ts +8 -0
  24. package/dist/components/new-trace-viewer/components/use-element-width.d.ts.map +1 -0
  25. package/dist/components/new-trace-viewer/components/use-element-width.js +25 -0
  26. package/dist/components/new-trace-viewer/context.d.ts +2 -0
  27. package/dist/components/new-trace-viewer/context.d.ts.map +1 -1
  28. package/dist/components/new-trace-viewer/context.js +3 -2
  29. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
  30. package/dist/components/new-trace-viewer/trace-viewer.js +10 -90
  31. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  32. package/dist/components/sidebar/attribute-panel.js +38 -35
  33. package/dist/components/sidebar/attributes-block.d.ts +18 -7
  34. package/dist/components/sidebar/attributes-block.d.ts.map +1 -1
  35. package/dist/components/sidebar/attributes-block.js +76 -18
  36. package/dist/components/sidebar/events-list.d.ts +1 -1
  37. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  38. package/dist/components/sidebar/events-list.js +9 -10
  39. package/dist/components/trace-viewer/components/map.d.ts +2 -2
  40. package/dist/components/trace-viewer/components/map.d.ts.map +1 -1
  41. package/dist/components/trace-viewer/components/node.d.ts +7 -7
  42. package/dist/components/trace-viewer/components/node.d.ts.map +1 -1
  43. package/dist/components/ui/collapsible.d.ts +46 -0
  44. package/dist/components/ui/collapsible.d.ts.map +1 -0
  45. package/dist/components/ui/collapsible.js +66 -0
  46. package/dist/components/ui/data-inspector.js +2 -7
  47. package/dist/index.d.ts +2 -2
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +3 -3
  50. package/dist/lib/hydration.d.ts +12 -2
  51. package/dist/lib/hydration.d.ts.map +1 -1
  52. package/dist/lib/hydration.js +41 -18
  53. package/package.json +6 -6
  54. package/src/components/new-trace-viewer/components/detail-panel-width.test.ts +123 -0
  55. package/src/components/new-trace-viewer/components/detail-panel-width.ts +76 -0
  56. package/src/components/new-trace-viewer/components/detail-panel.tsx +272 -0
  57. package/src/components/new-trace-viewer/components/draggable-border.tsx +216 -0
  58. package/src/components/new-trace-viewer/components/middle-truncate/truncate.ts +1 -1
  59. package/src/components/new-trace-viewer/components/pane-constants.ts +19 -0
  60. package/src/components/new-trace-viewer/components/split-pane.tsx +44 -55
  61. package/src/components/new-trace-viewer/components/trace-viewer-skeleton.tsx +4 -1
  62. package/src/components/new-trace-viewer/components/use-element-width.ts +29 -0
  63. package/src/components/new-trace-viewer/context.tsx +4 -1
  64. package/src/components/new-trace-viewer/trace-viewer.tsx +18 -199
  65. package/src/components/sidebar/attribute-panel.tsx +106 -105
  66. package/src/components/sidebar/attributes-block.tsx +170 -50
  67. package/src/components/sidebar/events-list.tsx +107 -92
  68. package/src/components/ui/collapsible.tsx +219 -0
  69. package/src/index.ts +8 -7
  70. package/src/lib/hydration.ts +48 -25
  71. package/dist/components/sidebar/detail-card.d.ts +0 -13
  72. package/dist/components/sidebar/detail-card.d.ts.map +0 -1
  73. package/dist/components/sidebar/detail-card.js +0 -36
  74. package/src/components/sidebar/detail-card.tsx +0 -143
@@ -1,23 +1,49 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { RESERVED_ATTRIBUTE_KEY_PREFIX, } from '@workflow/world';
4
+ import { cva } from 'class-variance-authority';
5
+ import { cn } from '../../lib/cn';
6
+ import { CopyButton } from '../new-trace-viewer/components/copy-button';
7
+ import { MiddleTruncate } from '../new-trace-viewer/components/middle-truncate/middle-truncate';
8
+ import { CollapsibleContent, CollapsibleRoot, CollapsibleTrigger, } from '../ui/collapsible';
4
9
  import { CopyableDataBlock } from './copyable-data-block';
5
- import { DetailCard } from './detail-card';
6
- /**
7
- * Check whether an attribute key is in the reserved (`$`-prefixed)
8
- * namespace used by framework/library code.
9
- */
10
- export const isReservedAttributeKey = (key) => key.startsWith(RESERVED_ATTRIBUTE_KEY_PREFIX);
11
- function ReservedBadge() {
12
- return (_jsx("span", { className: "shrink-0 rounded border px-1 py-px text-[10px] font-medium leading-3", style: {
13
- borderColor: 'var(--ds-gray-alpha-400)',
14
- backgroundColor: 'var(--ds-gray-100)',
15
- color: 'var(--ds-gray-700)',
16
- }, title: `Keys prefixed with "${RESERVED_ATTRIBUTE_KEY_PREFIX}" are reserved for framework and library code`, children: "Reserved" }));
10
+ function isReservedAttributeKey(key) {
11
+ return key.startsWith(RESERVED_ATTRIBUTE_KEY_PREFIX);
12
+ }
13
+ const rowValueVariants = cva('max-w-[60%] truncate text-right text-copy-13 text-gray-1000', {
14
+ variants: {
15
+ variant: {
16
+ default: '',
17
+ mono: 'font-mono',
18
+ },
19
+ },
20
+ defaultVariants: {
21
+ variant: 'default',
22
+ },
23
+ });
24
+ const rowCopyValueVariants = cva('flex min-w-0 max-w-[60%] items-center justify-end gap-1 text-copy-13 text-gray-1000', {
25
+ variants: {
26
+ variant: {
27
+ default: '',
28
+ mono: 'font-mono',
29
+ },
30
+ },
31
+ defaultVariants: {
32
+ variant: 'default',
33
+ },
34
+ });
35
+ function DetailKeyValueRowBase({ label, value, copyText, removed = false, variant, }) {
36
+ const stringValue = typeof value === 'string' ? value : undefined;
37
+ return (_jsxs("div", { className: "px-1.5 hover:bg-gray-100 flex justify-between gap-3 -mx-1.5 py-0.5 rounded items-center", children: [_jsx("span", { className: "flex min-w-0 items-center gap-1.5 truncate text-label-13 text-gray-900", children: label }), removed ? (_jsx("span", { className: "shrink-0 text-copy-13 italic text-gray-700", children: "removed" })) : copyText ? (_jsxs("div", { className: cn(rowCopyValueVariants({ variant })), title: copyText, children: [_jsx(MiddleTruncate, { value: copyText, className: cn(rowValueVariants({ variant, className: 'text-right' })), style: { gridTemplateColumns: 'minmax(0, 1fr)' } }), _jsx(CopyButton, { copyText: copyText, ariaLabel: `Copy ${label}`, className: "shrink-0 -mr-1" })] })) : (_jsx("span", { className: cn(rowValueVariants({ variant })), title: stringValue, children: value }))] }));
38
+ }
39
+ export function DetailKeyValueRow(props) {
40
+ return _jsx(DetailKeyValueRowBase, { ...props });
41
+ }
42
+ export function DetailMonoKeyValueRow(props) {
43
+ return _jsx(DetailKeyValueRowBase, { ...props, variant: "mono" });
17
44
  }
18
45
  function AttributeRow({ attributeKey, value, removed = false, }) {
19
- const reserved = isReservedAttributeKey(attributeKey);
20
- return (_jsxs("div", { className: "flex items-center justify-between gap-3 py-0.5", children: [_jsxs("span", { className: "flex min-w-0 items-center gap-1.5 text-label-13 text-gray-900", style: reserved ? { color: 'var(--ds-gray-700)' } : undefined, children: [_jsx("span", { className: "truncate", children: attributeKey }), reserved && _jsx(ReservedBadge, {})] }), removed ? (_jsx("span", { className: "shrink-0 text-copy-13 italic text-gray-700", children: "removed" })) : (_jsx("span", { className: "max-w-[60%] truncate text-copy-13 text-gray-1000", title: value, children: value }))] }));
46
+ return (_jsx(DetailKeyValueRow, { label: attributeKey, value: value, removed: removed }));
21
47
  }
22
48
  /**
23
49
  * Sort attribute keys for display: user keys first (alphabetical), then
@@ -35,14 +61,46 @@ export function sortAttributeKeys(keys) {
35
61
  }
36
62
  /**
37
63
  * Collapsible section showing a run's materialized attributes as key-value
38
- * rows. Reserved (`$`-prefixed) keys are visually de-emphasized with a
39
- * badge and sorted after user keys.
64
+ * rows. Reserved (`$`-prefixed) keys are sorted after user keys.
40
65
  */
41
66
  export function RunAttributesCard({ attributes, }) {
42
67
  const keys = sortAttributeKeys(Object.keys(attributes));
43
68
  if (keys.length === 0)
44
69
  return null;
45
- return (_jsx(DetailCard, { summary: "Attributes", defaultOpen: true, contentClassName: "mb-4", children: _jsx("div", { className: "flex flex-col", children: keys.map((key) => (_jsx(AttributeRow, { attributeKey: key, value: attributes[key] }, key))) }) }));
70
+ return (_jsxs(CollapsibleRoot, { defaultOpen: true, children: [_jsx(CollapsibleTrigger, { children: "Attributes" }), _jsx(CollapsibleContent, { className: "mb-4", children: _jsx("div", { className: "flex flex-col", children: keys.map((key) => (_jsx(AttributeRow, { attributeKey: key, value: attributes[key] }, key))) }) })] }));
71
+ }
72
+ function formatMetadataValue(value) {
73
+ if (value == null) {
74
+ return String(value);
75
+ }
76
+ if (typeof value === 'string') {
77
+ return value;
78
+ }
79
+ if (typeof value === 'number' || typeof value === 'boolean') {
80
+ return String(value);
81
+ }
82
+ try {
83
+ return JSON.stringify(value);
84
+ }
85
+ catch {
86
+ return String(value);
87
+ }
88
+ }
89
+ function isMetadataRecord(value) {
90
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
91
+ }
92
+ /**
93
+ * Collapsible section showing hook (or other resource) metadata as key-value
94
+ * rows, matching the Attributes section styling.
95
+ */
96
+ export function RunMetadataCard({ metadata }) {
97
+ if (!isMetadataRecord(metadata)) {
98
+ return (_jsxs(CollapsibleRoot, { defaultOpen: true, children: [_jsx(CollapsibleTrigger, { children: "Metadata" }), _jsx(CollapsibleContent, { className: "mb-4", children: _jsx(CopyableDataBlock, { data: metadata }) })] }));
99
+ }
100
+ const keys = Object.keys(metadata).sort((a, b) => a.localeCompare(b));
101
+ if (keys.length === 0)
102
+ return null;
103
+ return (_jsxs(CollapsibleRoot, { defaultOpen: true, children: [_jsx(CollapsibleTrigger, { children: "Metadata" }), _jsx(CollapsibleContent, { className: "mb-4", children: _jsx("div", { className: "flex flex-col", children: keys.map((key) => (_jsx(AttributeRow, { attributeKey: key, value: formatMetadataValue(metadata[key]) }, key))) }) })] }));
46
104
  }
47
105
  function isAttrSetEventData(data) {
48
106
  if (data === null || typeof data !== 'object')
@@ -78,4 +136,4 @@ export function AttrSetEventBlock({ data }) {
78
136
  color: 'var(--ds-gray-700)',
79
137
  }, children: writerLabel }))] }));
80
138
  }
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlcy1ibG9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGViYXIvYXR0cmlidXRlcy1ibG9jay50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViLE9BQU8sRUFFTCw2QkFBNkIsR0FDOUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsR0FBVyxFQUFXLEVBQUUsQ0FDN0QsR0FBRyxDQUFDLFVBQVUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0FBRWhELFNBQVMsYUFBYTtJQUNwQixPQUFPLENBQ0wsZUFDRSxTQUFTLEVBQUMsc0VBQXNFLEVBQ2hGLEtBQUssRUFBRTtZQUNMLFdBQVcsRUFBRSwwQkFBMEI7WUFDdkMsZUFBZSxFQUFFLG9CQUFvQjtZQUNyQyxLQUFLLEVBQUUsb0JBQW9CO1NBQzVCLEVBQ0QsS0FBSyxFQUFFLHVCQUF1Qiw2QkFBNkIsK0NBQStDLHlCQUdyRyxDQUNSLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsRUFDcEIsWUFBWSxFQUNaLEtBQUssRUFDTCxPQUFPLEdBQUcsS0FBSyxHQUtoQjtJQUNDLE1BQU0sUUFBUSxHQUFHLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3RELE9BQU8sQ0FDTCxlQUFLLFNBQVMsRUFBQyxnREFBZ0QsYUFDN0QsZ0JBQ0UsU0FBUyxFQUFDLCtEQUErRCxFQUN6RSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLGFBRTdELGVBQU0sU0FBUyxFQUFDLFVBQVUs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Q0FBQztRQUM5QixPQUFPLEtBQUMsaUJBQWlCLElBQUMsSUFBSSxFQUFFLElBQUksR0FBSSxDQUFDO0lBQzNDLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWhELE9BQU8sQ0FDTCxlQUFLLFNBQVMsRUFBQyx5QkFBeUIsYUFDdEMsY0FBSyxTQUFTLEVBQUMsZUFBZSxZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQ25DLEtBQUMsWUFBWSxJQUNYLFlBQVksRUFBRSxNQUFNLENBQUMsR0FBRyxFQUV4QixPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQzlCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxJQUFJLFNBQVMsSUFGM0IsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUc3QixDQUNILENBQUMsR0FDRSxFQUNMLFdBQVcsSUFBSSxDQUNkLGNBQ0UsU0FBUyxFQUFDLCtCQUErQixFQUN6QyxLQUFLLEVBQUU7b0JBQ0wsV0FBVyxFQUFFLDBCQUEwQjtvQkFDdkMsS0FBSyxFQUFFLG9CQUFvQjtpQkFDNUIsWUFFQSxXQUFXLEdBQ1IsQ0FDUCxJQUNHLENBQ1AsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbmltcG9ydCB7XG4gIHR5cGUgQXR0cmlidXRlQ2hhbmdlLFxuICBSRVNFUlZFRF9BVFRSSUJVVEVfS0VZX1BSRUZJWCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IENvcHlhYmxlRGF0YUJsb2NrIH0gZnJvbSAnLi9jb3B5YWJsZS1kYXRhLWJsb2NrJztcbmltcG9ydCB7IERldGFpbENhcmQgfSBmcm9tICcuL2RldGFpbC1jYXJkJztcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGFuIGF0dHJpYnV0ZSBrZXkgaXMgaW4gdGhlIHJlc2VydmVkIChgJGAtcHJlZml4ZWQpXG4gKiBuYW1lc3BhY2UgdXNlZCBieSBmcmFtZXdvcmsvbGlicmFyeSBjb2RlLlxuICovXG5leHBvcnQgY29uc3QgaXNSZXNlcnZlZEF0dHJpYnV0ZUtleSA9IChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAga2V5LnN0YXJ0c1dpdGgoUkVTRVJWRURfQVRUUklCVVRFX0tFWV9QUkVGSVgpO1xuXG5mdW5jdGlvbiBSZXNlcnZlZEJhZGdlKCkge1xuICByZXR1cm4gKFxuICAgIDxzcGFuXG4gICAgICBjbGFzc05hbWU9XCJzaHJpbmstMCByb3VuZGVkIGJvcmRlciBweC0xIHB5LXB4IHRleHQtWzEwcHhdIGZvbnQtbWVkaXVtIGxlYWRpbmctM1wiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBib3JkZXJDb2xvcjogJ3ZhcigtLWRzLWdyYXktYWxwaGEtNDAwKScsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwKScsXG4gICAgICAgIGNvbG9yOiAndmFyKC0tZHMtZ3JheS03MDApJyxcbiAgICAgIH19XG4gICAgICB0aXRsZT17YEtleXMgcHJlZml4ZWQgd2l0aCBcIiR7UkVTRVJWRURfQVRUUklCVVRFX0tFWV9QUkVGSVh9XCIgYXJlIHJlc2VydmVkIGZvciBmcmFtZXdvcmsgYW5kIGxpYnJhcnkgY29kZWB9XG4gICAgPlxuICAgICAgUmVzZXJ2ZWRcbiAgICA8L3NwYW4+XG4gICk7XG59XG5cbmZ1bmN0aW9uIEF0dHJpYnV0ZVJvdyh7XG4gIGF0dHJpYnV0ZUtleSxcbiAgdmFsdWUsXG4gIHJlbW92ZWQgPSBmYWxzZSxcbn06IHtcbiAgYXR0cmlidXRlS2V5OiBzdHJpbmc7XG4gIHZhbHVlPzogc3RyaW5nO1xuICByZW1vdmVkPzogYm9vbGVhbjtcbn0pIHtcbiAgY29uc3QgcmVzZXJ2ZWQgPSBpc1Jlc2VydmVkQXR0cmlidXRlS2V5KGF0dHJpYnV0ZUtleSk7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTMgcHktMC41XCI+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzc05hbWU9XCJmbGV4IG1pbi13LTAgaXRlbXMtY2VudGVyIGdhcC0xLjUgdGV4dC1sYWJlbC0xMyB0ZXh0LWdyYXktOTAwXCJcbiAgICAgICAgc3R5bGU9e3Jlc2VydmVkID8geyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktNzAwKScgfSA6IHVuZGVmaW5lZH1cbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidHJ1bmNhdGVcIj57YXR0cmlidXRlS2V5fTwvc3Bhbj5cbiAgICAgICAge3Jlc2VydmVkICYmIDxSZXNlcnZlZEJhZGdlIC8+fVxuICAgICAgPC9zcGFuPlxuICAgICAge3JlbW92ZWQgPyAoXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInNocmluay0wIHRleHQtY29weS0xMyBpdGFsaWMgdGV4dC1ncmF5LTcwMFwiPlxuICAgICAgICAgIHJlbW92ZWRcbiAgICAgICAgPC9zcGFuPlxuICAgICAgKSA6IChcbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzc05hbWU9XCJtYXgtdy1bNjAlXSB0cnVuY2F0ZSB0ZXh0LWNvcHktMTMgdGV4dC1ncmF5LTEwMDBcIlxuICAgICAgICAgIHRpdGxlPXt2YWx1ZX1cbiAgICAgICAgPlxuICAgICAgICAgIHt2YWx1ZX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLyoqXG4gKiBTb3J0IGF0dHJpYnV0ZSBrZXlzIGZvciBkaXNwbGF5OiB1c2VyIGtleXMgZmlyc3QgKGFscGhhYmV0aWNhbCksIHRoZW5cbiAqIHJlc2VydmVkIGAkYC1wcmVmaXhlZCBrZXlzIChhbHBoYWJldGljYWwpLCBzbyBmcmFtZXdvcmsgbWV0YWRhdGEgZG9lc24ndFxuICogY3Jvd2Qgb3V0IHVzZXItc2V0IGF0dHJpYnV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0QXR0cmlidXRlS2V5cyhrZXlzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5rZXlzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgYVJlc2VydmVkID0gaXNSZXNlcnZlZEF0dHJpYnV0ZUtleShhKTtcbiAgICBjb25zdCBiUmVzZXJ2ZWQgPSBpc1Jlc2VydmVkQXR0cmlidXRlS2V5KGIpO1xuICAgIGlmIChhUmVzZXJ2ZWQgIT09IGJSZXNlcnZlZCkgcmV0dXJuIGFSZXNlcnZlZCA/IDEgOiAtMTtcbiAgICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb2xsYXBzaWJsZSBzZWN0aW9uIHNob3dpbmcgYSBydW4ncyBtYXRlcmlhbGl6ZWQgYXR0cmlidXRlcyBhcyBrZXktdmFsdWVcbiAqIHJvd3MuIFJlc2VydmVkIChgJGAtcHJlZml4ZWQpIGtleXMgYXJlIHZpc3VhbGx5IGRlLWVtcGhhc2l6ZWQgd2l0aCBhXG4gKiBiYWRnZSBhbmQgc29ydGVkIGFmdGVyIHVzZXIga2V5cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJ1bkF0dHJpYnV0ZXNDYXJkKHtcbiAgYXR0cmlidXRlcyxcbn06IHtcbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn0pIHtcbiAgY29uc3Qga2V5cyA9IHNvcnRBdHRyaWJ1dGVLZXlzKE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpKTtcbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gKFxuICAgIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJBdHRyaWJ1dGVzXCIgZGVmYXVsdE9wZW4gY29udGVudENsYXNzTmFtZT1cIm1iLTRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICB7a2V5cy5tYXAoKGtleSkgPT4gKFxuICAgICAgICAgIDxBdHRyaWJ1dGVSb3cgYXR0cmlidXRlS2V5PXtrZXl9IGtleT17a2V5fSB2YWx1ZT17YXR0cmlidXRlc1trZXldfSAvPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvRGV0YWlsQ2FyZD5cbiAgKTtcbn1cblxuaW50ZXJmYWNlIEF0dHJTZXRFdmVudERhdGEge1xuICBjaGFuZ2VzOiBBdHRyaWJ1dGVDaGFuZ2VbXTtcbiAgd3JpdGVyPzpcbiAgICB8IHsgdHlwZTogJ3dvcmtmbG93JyB9XG4gICAgfCB7IHR5cGU6ICdzdGVwJzsgc3RlcElkOiBzdHJpbmc7IGF0dGVtcHQ6IG51bWJlciB9O1xufVxuXG5mdW5jdGlvbiBpc0F0dHJTZXRFdmVudERhdGEoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgQXR0clNldEV2ZW50RGF0YSB7XG4gIGlmIChkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByZWNvcmQgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gKFxuICAgIEFycmF5LmlzQXJyYXkocmVjb3JkLmNoYW5nZXMpICYmXG4gICAgcmVjb3JkLmNoYW5nZXMuZXZlcnkoXG4gICAgICAoYykgPT5cbiAgICAgICAgYyAhPT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgYyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdHlwZW9mIChjIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5rZXkgPT09ICdzdHJpbmcnXG4gICAgKVxuICApO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVdyaXRlcih3cml0ZXI6IEF0dHJTZXRFdmVudERhdGFbJ3dyaXRlciddKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghd3JpdGVyKSByZXR1cm4gbnVsbDtcbiAgaWYgKHdyaXRlci50eXBlID09PSAnd29ya2Zsb3cnKSByZXR1cm4gJ1NldCBieSB3b3JrZmxvdyc7XG4gIGlmICh3cml0ZXIudHlwZSA9PT0gJ3N0ZXAnKSB7XG4gICAgcmV0dXJuIGBTZXQgYnkgc3RlcCAke3dyaXRlci5zdGVwSWR9IChhdHRlbXB0ICR7d3JpdGVyLmF0dGVtcHR9KWA7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmVuZGVycyB0aGUgcGF5bG9hZCBvZiBhbiBgYXR0cl9zZXRgIGV2ZW50OiB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVcbiAqIGNoYW5nZXMgKHNldHMgYW5kIHJlbW92YWxzKSBwbHVzIHdoaWNoIHdyaXRlciAod29ya2Zsb3cgb3Igc3RlcClcbiAqIG1hZGUgdGhlbS4gRmFsbHMgYmFjayB0byB0aGUgZ2VuZXJpYyBKU09OIGJsb2NrIGZvciB1bmV4cGVjdGVkIHNoYXBlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEF0dHJTZXRFdmVudEJsb2NrKHsgZGF0YSB9OiB7IGRhdGE6IHVua25vd24gfSkge1xuICBpZiAoIWlzQXR0clNldEV2ZW50RGF0YShkYXRhKSkge1xuICAgIHJldHVybiA8Q29weWFibGVEYXRhQmxvY2sgZGF0YT17ZGF0YX0gLz47XG4gIH1cblxuICBjb25zdCB3cml0ZXJMYWJlbCA9IGRlc2NyaWJlV3JpdGVyKGRhdGEud3JpdGVyKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBweC0zIHB5LTFcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICB7ZGF0YS5jaGFuZ2VzLm1hcCgoY2hhbmdlLCBpbmRleCkgPT4gKFxuICAgICAgICAgIDxBdHRyaWJ1dGVSb3dcbiAgICAgICAgICAgIGF0dHJpYnV0ZUtleT17Y2hhbmdlLmtleX1cbiAgICAgICAgICAgIGtleT17YCR7Y2hhbmdlLmtleX06JHtpbmRleH1gfVxuICAgICAgICAgICAgcmVtb3ZlZD17Y2hhbmdlLnZhbHVlID09PSBudWxsfVxuICAgICAgICAgICAgdmFsdWU9e2NoYW5nZS52YWx1ZSA/PyB1bmRlZmluZWR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSl9XG4gICAgICA8L2Rpdj5cbiAgICAgIHt3cml0ZXJMYWJlbCAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXItdCBweS0xLjUgdGV4dC1sYWJlbC0xMlwiXG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiAndmFyKC0tZHMtZ3JheS1hbHBoYS00MDApJyxcbiAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtZ3JheS03MDApJyxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge3dyaXRlckxhYmVsfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG4iXX0=
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlcy1ibG9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGViYXIvYXR0cmlidXRlcy1ibG9jay50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViLE9BQU8sRUFFTCw2QkFBNkIsR0FDOUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsR0FBRyxFQUFxQixNQUFNLDBCQUEwQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUNoRyxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZixrQkFBa0IsR0FDbkIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxTQUFTLHNCQUFzQixDQUFDLEdBQVc7SUFDekMsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDLDZCQUE2QixDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUMxQiw2REFBNkQsRUFDN0Q7SUFDRSxRQUFRLEVBQUU7UUFDUixPQUFPLEVBQUU7WUFDUCxPQUFPLEVBQUUsRUFBRTtZQUNYLElBQUksRUFBRSxXQUFXO1NBQ2xCO0tBQ0Y7SUFDRCxlQUFlLEVBQUU7UUFDZixPQUFPLEVBQUUsU0FBUztLQUNuQjtDQUNGLENBQ0YsQ0FBQztBQUVGLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUM5QixxRkFBcUYsRUFDckY7SUFDRSxRQUFRLEVBQUU7UUFDUixPQUFPLEVBQUU7WUFDUCxPQUFPLEVBQUUsRUFBRTtZQUNYLElBQUksRUFBRSxXQUFXO1NBQ2xCO0tBQ0Y7SUFDRCxlQUFl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LEVBQUUsRUFBRSxDQUFDLENBQ25DLEtBQUMsWUFBWSxJQUNYLFlBQVksRUFBRSxNQUFNLENBQUMsR0FBRyxFQUV4QixPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQzlCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxJQUFJLFNBQVMsSUFGM0IsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUc3QixDQUNILENBQUMsR0FDRSxFQUNMLFdBQVcsSUFBSSxDQUNkLGNBQ0UsU0FBUyxFQUFDLCtCQUErQixFQUN6QyxLQUFLLEVBQUU7b0JBQ0wsV0FBVyxFQUFFLDBCQUEwQjtvQkFDdkMsS0FBSyxFQUFFLG9CQUFvQjtpQkFDNUIsWUFFQSxXQUFXLEdBQ1IsQ0FDUCxJQUNHLENBQ1AsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbmltcG9ydCB7XG4gIHR5cGUgQXR0cmlidXRlQ2hhbmdlLFxuICBSRVNFUlZFRF9BVFRSSUJVVEVfS0VZX1BSRUZJWCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4uLy4uL2xpYi9jbic7XG5pbXBvcnQgeyBDb3B5QnV0dG9uIH0gZnJvbSAnLi4vbmV3LXRyYWNlLXZpZXdlci9jb21wb25lbnRzL2NvcHktYnV0dG9uJztcbmltcG9ydCB7IE1pZGRsZVRydW5jYXRlIH0gZnJvbSAnLi4vbmV3LXRyYWNlLXZpZXdlci9jb21wb25lbnRzL21pZGRsZS10cnVuY2F0ZS9taWRkbGUtdHJ1bmNhdGUnO1xuaW1wb3J0IHtcbiAgQ29sbGFwc2libGVDb250ZW50LFxuICBDb2xsYXBzaWJsZVJvb3QsXG4gIENvbGxhcHNpYmxlVHJpZ2dlcixcbn0gZnJvbSAnLi4vdWkvY29sbGFwc2libGUnO1xuaW1wb3J0IHsgQ29weWFibGVEYXRhQmxvY2sgfSBmcm9tICcuL2NvcHlhYmxlLWRhdGEtYmxvY2snO1xuXG5mdW5jdGlvbiBpc1Jlc2VydmVkQXR0cmlidXRlS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBrZXkuc3RhcnRzV2l0aChSRVNFUlZFRF9BVFRSSUJVVEVfS0VZX1BSRUZJWCk7XG59XG5cbmNvbnN0IHJvd1ZhbHVlVmFyaWFudHMgPSBjdmEoXG4gICdtYXgtdy1bNjAlXSB0cnVuY2F0ZSB0ZXh0LXJpZ2h0IHRleHQtY29weS0xMyB0ZXh0LWdyYXktMTAwMCcsXG4gIHtcbiAgICB2YXJpYW50czoge1xuICAgICAgdmFyaWFudDoge1xuICAgICAgICBkZWZhdWx0OiAnJyxcbiAgICAgICAgbW9ubzogJ2ZvbnQtbW9ubycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgZGVmYXVsdFZhcmlhbnRzOiB7XG4gICAgICB2YXJpYW50OiAnZGVmYXVsdCcsXG4gICAgfSxcbiAgfVxuKTtcblxuY29uc3Qgcm93Q29weVZhbHVlVmFyaWFudHMgPSBjdmEoXG4gICdmbGV4IG1pbi13LTAgbWF4LXctWzYwJV0gaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kIGdhcC0xIHRleHQtY29weS0xMyB0ZXh0LWdyYXktMTAwMCcsXG4gIHtcbiAgICB2YXJpYW50czoge1xuICAgICAgdmFyaWFudDoge1xuICAgICAgICBkZWZhdWx0OiAnJyxcbiAgICAgICAgbW9ubzogJ2ZvbnQtbW9ubycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgZGVmYXVsdFZhcmlhbnRzOiB7XG4gICAgICB2YXJpYW50OiAnZGVmYXVsdCcsXG4gICAgfSxcbiAgfVxuKTtcblxudHlwZSBEZXRhaWxLZXlWYWx1ZVJvd1Byb3BzID0ge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZT86IFJlYWN0Tm9kZTtcbiAgY29weVRleHQ/OiBzdHJpbmc7XG4gIHJlbW92ZWQ/OiBib29sZWFuO1xufTtcblxuZnVuY3Rpb24gRGV0YWlsS2V5VmFsdWVSb3dCYXNlKHtcbiAgbGFiZWwsXG4gIHZhbHVlLFxuICBjb3B5VGV4dCxcbiAgcmVtb3ZlZCA9IGZhbHNlLFxuICB2YXJpYW50LFxufTogRGV0YWlsS2V5VmFsdWVSb3dQcm9wcyAmIFZhcmlhbnRQcm9wczx0eXBlb2Ygcm93VmFsdWVWYXJpYW50cz4pIHtcbiAgY29uc3Qgc3RyaW5nVmFsdWUgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInB4LTEuNSBob3ZlcjpiZy1ncmF5LTEwMCBmbGV4IGp1c3RpZnktYmV0d2VlbiBnYXAtMyAtbXgtMS41IHB5LTAuNSByb3VuZGVkIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZmxleCBtaW4tdy0wIGl0ZW1zLWNlbnRlciBnYXAtMS41IHRydW5jYXRlIHRleHQtbGFiZWwtMTMgdGV4dC1ncmF5LTkwMFwiPlxuICAgICAgICB7bGFiZWx9XG4gICAgICA8L3NwYW4+XG4gICAgICB7cmVtb3ZlZCA/IChcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwic2hyaW5rLTAgdGV4dC1jb3B5LTEzIGl0YWxpYyB0ZXh0LWdyYXktNzAwXCI+XG4gICAgICAgICAgcmVtb3ZlZFxuICAgICAgICA8L3NwYW4+XG4gICAgICApIDogY29weVRleHQgPyAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbihyb3dDb3B5VmFsdWVWYXJpYW50cyh7IHZhcmlhbnQgfSkpfSB0aXRsZT17Y29weVRleHR9PlxuICAgICAgICAgIDxNaWRkbGVUcnVuY2F0ZVxuICAgICAgICAgICAgdmFsdWU9e2NvcHlUZXh0fVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgcm93VmFsdWVWYXJpYW50cyh7IHZhcmlhbnQsIGNsYXNzTmFtZTogJ3RleHQtcmlnaHQnIH0pXG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgc3R5bGU9e3sgZ3JpZFRlbXBsYXRlQ29sdW1uczogJ21pbm1heCgwLCAxZnIpJyB9fVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPENvcHlCdXR0b25cbiAgICAgICAgICAgIGNvcHlUZXh0PXtjb3B5VGV4dH1cbiAgICAgICAgICAgIGFyaWFMYWJlbD17YENvcHkgJHtsYWJlbH1gfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwic2hyaW5rLTAgLW1yLTFcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSA6IChcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtjbihyb3dWYWx1ZVZhcmlhbnRzKHsgdmFyaWFudCB9KSl9IHRpdGxlPXtzdHJpbmdWYWx1ZX0+XG4gICAgICAgICAge3ZhbHVlfVxuICAgICAgICA8L3NwYW4+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRGV0YWlsS2V5VmFsdWVSb3cocHJvcHM6IERldGFpbEtleVZhbHVlUm93UHJvcHMpIHtcbiAgcmV0dXJuIDxEZXRhaWxLZXlWYWx1ZVJvd0Jhc2Ugey4uLnByb3BzfSAvPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIERldGFpbE1vbm9LZXlWYWx1ZVJvdyhwcm9wczogRGV0YWlsS2V5VmFsdWVSb3dQcm9wcykge1xuICByZXR1cm4gPERldGFpbEtleVZhbHVlUm93QmFzZSB7Li4ucHJvcHN9IHZhcmlhbnQ9XCJtb25vXCIgLz47XG59XG5cbmZ1bmN0aW9uIEF0dHJpYnV0ZVJvdyh7XG4gIGF0dHJpYnV0ZUtleSxcbiAgdmFsdWUsXG4gIHJlbW92ZWQgPSBmYWxzZSxcbn06IHtcbiAgYXR0cmlidXRlS2V5OiBzdHJpbmc7XG4gIHZhbHVlPzogc3RyaW5nO1xuICByZW1vdmVkPzogYm9vbGVhbjtcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8RGV0YWlsS2V5VmFsdWVSb3cgbGFiZWw9e2F0dHJpYnV0ZUtleX0gdmFsdWU9e3ZhbHVlfSByZW1vdmVkPXtyZW1vdmVkfSAvPlxuICApO1xufVxuXG4vKipcbiAqIFNvcnQgYXR0cmlidXRlIGtleXMgZm9yIGRpc3BsYXk6IHVzZXIga2V5cyBmaXJzdCAoYWxwaGFiZXRpY2FsKSwgdGhlblxuICogcmVzZXJ2ZWQgYCRgLXByZWZpeGVkIGtleXMgKGFscGhhYmV0aWNhbCksIHNvIGZyYW1ld29yayBtZXRhZGF0YSBkb2Vzbid0XG4gKiBjcm93ZCBvdXQgdXNlci1zZXQgYXR0cmlidXRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRBdHRyaWJ1dGVLZXlzKGtleXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmtleXNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBhUmVzZXJ2ZWQgPSBpc1Jlc2VydmVkQXR0cmlidXRlS2V5KGEpO1xuICAgIGNvbnN0IGJSZXNlcnZlZCA9IGlzUmVzZXJ2ZWRBdHRyaWJ1dGVLZXkoYik7XG4gICAgaWYgKGFSZXNlcnZlZCAhPT0gYlJlc2VydmVkKSByZXR1cm4gYVJlc2VydmVkID8gMSA6IC0xO1xuICAgIHJldHVybiBhLmxvY2FsZUNvbXBhcmUoYik7XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbGxhcHNpYmxlIHNlY3Rpb24gc2hvd2luZyBhIHJ1bidzIG1hdGVyaWFsaXplZCBhdHRyaWJ1dGVzIGFzIGtleS12YWx1ZVxuICogcm93cy4gUmVzZXJ2ZWQgKGAkYC1wcmVmaXhlZCkga2V5cyBhcmUgc29ydGVkIGFmdGVyIHVzZXIga2V5cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJ1bkF0dHJpYnV0ZXNDYXJkKHtcbiAgYXR0cmlidXRlcyxcbn06IHtcbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn0pIHtcbiAgY29uc3Qga2V5cyA9IHNvcnRBdHRyaWJ1dGVLZXlzKE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpKTtcbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gKFxuICAgIDxDb2xsYXBzaWJsZVJvb3QgZGVmYXVsdE9wZW4+XG4gICAgICA8Q29sbGFwc2libGVUcmlnZ2VyPkF0dHJpYnV0ZXM8L0NvbGxhcHNpYmxlVHJpZ2dlcj5cbiAgICAgIDxDb2xsYXBzaWJsZUNvbnRlbnQgY2xhc3NOYW1lPVwibWItNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICB7a2V5cy5tYXAoKGtleSkgPT4gKFxuICAgICAgICAgICAgPEF0dHJpYnV0ZVJvd1xuICAgICAgICAgICAgICBhdHRyaWJ1dGVLZXk9e2tleX1cbiAgICAgICAgICAgICAga2V5PXtrZXl9XG4gICAgICAgICAgICAgIHZhbHVlPXthdHRyaWJ1dGVzW2tleV19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvQ29sbGFwc2libGVDb250ZW50PlxuICAgIDwvQ29sbGFwc2libGVSb290PlxuICApO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRNZXRhZGF0YVZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNNZXRhZGF0YVJlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vKipcbiAqIENvbGxhcHNpYmxlIHNlY3Rpb24gc2hvd2luZyBob29rIChvciBvdGhlciByZXNvdXJjZSkgbWV0YWRhdGEgYXMga2V5LXZhbHVlXG4gKiByb3dzLCBtYXRjaGluZyB0aGUgQXR0cmlidXRlcyBzZWN0aW9uIHN0eWxpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSdW5NZXRhZGF0YUNhcmQoeyBtZXRhZGF0YSB9OiB7IG1ldGFkYXRhOiB1bmtub3duIH0pIHtcbiAgaWYgKCFpc01ldGFkYXRhUmVjb3JkKG1ldGFkYXRhKSkge1xuICAgIHJldHVybiAoXG4gICAgICA8Q29sbGFwc2libGVSb290IGRlZmF1bHRPcGVuPlxuICAgICAgICA8Q29sbGFwc2libGVUcmlnZ2VyPk1ldGFkYXRhPC9Db2xsYXBzaWJsZVRyaWdnZXI+XG4gICAgICAgIDxDb2xsYXBzaWJsZUNvbnRlbnQgY2xhc3NOYW1lPVwibWItNFwiPlxuICAgICAgICAgIDxDb3B5YWJsZURhdGFCbG9jayBkYXRhPXttZXRhZGF0YX0gLz5cbiAgICAgICAgPC9Db2xsYXBzaWJsZUNvbnRlbnQ+XG4gICAgICA8L0NvbGxhcHNpYmxlUm9vdD5cbiAgICApO1xuICB9XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG1ldGFkYXRhKS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIHJldHVybiAoXG4gICAgPENvbGxhcHNpYmxlUm9vdCBkZWZhdWx0T3Blbj5cbiAgICAgIDxDb2xsYXBzaWJsZVRyaWdnZXI+TWV0YWRhdGE8L0NvbGxhcHNpYmxlVHJpZ2dlcj5cbiAgICAgIDxDb2xsYXBzaWJsZUNvbnRlbnQgY2xhc3NOYW1lPVwibWItNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICB7a2V5cy5tYXAoKGtleSkgPT4gKFxuICAgICAgICAgICAgPEF0dHJpYnV0ZVJvd1xuICAgICAgICAgICAgICBhdHRyaWJ1dGVLZXk9e2tleX1cbiAgICAgICAgICAgICAga2V5PXtrZXl9XG4gICAgICAgICAgICAgIHZhbHVlPXtmb3JtYXRNZXRhZGF0YVZhbHVlKG1ldGFkYXRhW2tleV0pfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L0NvbGxhcHNpYmxlQ29udGVudD5cbiAgICA8L0NvbGxhcHNpYmxlUm9vdD5cbiAgKTtcbn1cblxuaW50ZXJmYWNlIEF0dHJTZXRFdmVudERhdGEge1xuICBjaGFuZ2VzOiBBdHRyaWJ1dGVDaGFuZ2VbXTtcbiAgd3JpdGVyPzpcbiAgICB8IHsgdHlwZTogJ3dvcmtmbG93JyB9XG4gICAgfCB7IHR5cGU6ICdzdGVwJzsgc3RlcElkOiBzdHJpbmc7IGF0dGVtcHQ6IG51bWJlciB9O1xufVxuXG5mdW5jdGlvbiBpc0F0dHJTZXRFdmVudERhdGEoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgQXR0clNldEV2ZW50RGF0YSB7XG4gIGlmIChkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByZWNvcmQgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gKFxuICAgIEFycmF5LmlzQXJyYXkocmVjb3JkLmNoYW5nZXMpICYmXG4gICAgcmVjb3JkLmNoYW5nZXMuZXZlcnkoXG4gICAgICAoYykgPT5cbiAgICAgICAgYyAhPT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgYyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdHlwZW9mIChjIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5rZXkgPT09ICdzdHJpbmcnXG4gICAgKVxuICApO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVdyaXRlcih3cml0ZXI6IEF0dHJTZXRFdmVudERhdGFbJ3dyaXRlciddKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghd3JpdGVyKSByZXR1cm4gbnVsbDtcbiAgaWYgKHdyaXRlci50eXBlID09PSAnd29ya2Zsb3cnKSByZXR1cm4gJ1NldCBieSB3b3JrZmxvdyc7XG4gIGlmICh3cml0ZXIudHlwZSA9PT0gJ3N0ZXAnKSB7XG4gICAgcmV0dXJuIGBTZXQgYnkgc3RlcCAke3dyaXRlci5zdGVwSWR9IChhdHRlbXB0ICR7d3JpdGVyLmF0dGVtcHR9KWA7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmVuZGVycyB0aGUgcGF5bG9hZCBvZiBhbiBgYXR0cl9zZXRgIGV2ZW50OiB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVcbiAqIGNoYW5nZXMgKHNldHMgYW5kIHJlbW92YWxzKSBwbHVzIHdoaWNoIHdyaXRlciAod29ya2Zsb3cgb3Igc3RlcClcbiAqIG1hZGUgdGhlbS4gRmFsbHMgYmFjayB0byB0aGUgZ2VuZXJpYyBKU09OIGJsb2NrIGZvciB1bmV4cGVjdGVkIHNoYXBlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEF0dHJTZXRFdmVudEJsb2NrKHsgZGF0YSB9OiB7IGRhdGE6IHVua25vd24gfSkge1xuICBpZiAoIWlzQXR0clNldEV2ZW50RGF0YShkYXRhKSkge1xuICAgIHJldHVybiA8Q29weWFibGVEYXRhQmxvY2sgZGF0YT17ZGF0YX0gLz47XG4gIH1cblxuICBjb25zdCB3cml0ZXJMYWJlbCA9IGRlc2NyaWJlV3JpdGVyKGRhdGEud3JpdGVyKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBweC0zIHB5LTFcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICB7ZGF0YS5jaGFuZ2VzLm1hcCgoY2hhbmdlLCBpbmRleCkgPT4gKFxuICAgICAgICAgIDxBdHRyaWJ1dGVSb3dcbiAgICAgICAgICAgIGF0dHJpYnV0ZUtleT17Y2hhbmdlLmtleX1cbiAgICAgICAgICAgIGtleT17YCR7Y2hhbmdlLmtleX06JHtpbmRleH1gfVxuICAgICAgICAgICAgcmVtb3ZlZD17Y2hhbmdlLnZhbHVlID09PSBudWxsfVxuICAgICAgICAgICAgdmFsdWU9e2NoYW5nZS52YWx1ZSA/PyB1bmRlZmluZWR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSl9XG4gICAgICA8L2Rpdj5cbiAgICAgIHt3cml0ZXJMYWJlbCAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXItdCBweS0xLjUgdGV4dC1sYWJlbC0xMlwiXG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiAndmFyKC0tZHMtZ3JheS1hbHBoYS00MDApJyxcbiAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtZ3JheS03MDApJyxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge3dyaXRlckxhYmVsfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG4iXX0=
@@ -1,4 +1,4 @@
1
- import { type Event } from '@workflow/world';
1
+ import type { Event } from '@workflow/world';
2
2
  export declare function EventsList({ events, isLoading, error, onLoadEventData, onStreamClick, onRunClick, encryptionKey, showSeparateEventOccurrenceTimestamps, }: {
3
3
  events: Event[];
4
4
  isLoading?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"events-list.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/events-list.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAC;AA+SpE,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,SAAiB,EACjB,KAAK,EACL,eAAe,EACf,aAAa,EACb,UAAU,EACV,aAAa,EACb,qCAA6C,GAC9C,EAAE;IACD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,CAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,6FAA6F;IAC7F,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,mFAAmF;IACnF,qCAAqC,CAAC,EAAE,OAAO,CAAC;CACjD,2CAqDA"}
1
+ {"version":3,"file":"events-list.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/events-list.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AA2T7C,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,SAAiB,EACjB,KAAK,EACL,eAAe,EACf,aAAa,EACb,UAAU,EACV,aAAa,EACb,qCAA6C,GAC9C,EAAE;IACD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,CAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,6FAA6F;IAC7F,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,mFAAmF;IACnF,qCAAqC,CAAC,EAAE,OAAO,CAAC;CACjD,2CAwDA"}
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { EVENT_DATA_REF_FIELDS } from '@workflow/world';
4
3
  import { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';
5
- import { hasEncryptedFields, isExpiredMarker } from '../../lib/hydration';
4
+ import { getEventDataRefFields, hasEncryptedFields, isExpiredMarker, } from '../../lib/hydration';
5
+ import { Collapsible, CollapsibleContent, CollapsibleRoot, CollapsibleTrigger, } from '../ui/collapsible';
6
6
  import { RunClickContext, StreamClickContext } from '../ui/data-inspector';
7
7
  import { ErrorCard } from '../ui/error-card';
8
8
  import { ErrorStackBlock, isStructuredError } from '../ui/error-stack-block';
@@ -10,7 +10,6 @@ import { Skeleton } from '../ui/skeleton';
10
10
  import { TimestampTooltip } from '../ui/timestamp-tooltip';
11
11
  import { AttrSetEventBlock } from './attributes-block';
12
12
  import { CopyableDataBlock, EncryptedDataBlock } from './copyable-data-block';
13
- import { DetailCard } from './detail-card';
14
13
  /**
15
14
  * Event types whose eventData contains an error field with a StructuredError.
16
15
  */
@@ -108,16 +107,16 @@ function EventItem({ event, onLoadEventData, encryptionKey, showSeparateEventOcc
108
107
  second: 'numeric',
109
108
  });
110
109
  const displayPayload = isLoading ? loadedData : mergedDisplay;
111
- return (_jsxs(DetailCard, { variant: "card", summaryClassName: "px-3 py-2", summary: _jsxs("div", { className: "flex w-full items-center justify-between gap-3", children: [_jsx("span", { className: "text-gray-1000 text-label-12 font-mono", children: event.eventType }), _jsx("span", { className: "shrink-0 text-label-13 text-gray-900", children: displayedCreatedAtTime })] }), onToggle: canHaveData
110
+ return (_jsxs(CollapsibleRoot, { variant: "card", onOpenChange: canHaveData
112
111
  ? (open) => {
113
112
  if (open)
114
113
  handleExpand();
115
114
  }
116
- : undefined, children: [_jsxs("div", { className: "flex flex-col bg-background-200 [&:has(+_*)]:border-b [&:has(+_*)]:border-gray-alpha-400", children: [showSeparateEventOccurrenceTimestamps && occurredAt && (_jsxs("div", { className: "flex items-center justify-between gap-2 py-2 px-3", children: [_jsx("span", { className: "text-label-12 text-gray-900", children: "Occurred" }), _jsx(TimestampTooltip, { date: occurredAt, children: _jsx("span", { className: "max-w-[70%] truncate text-right text-label-12 font-mono", children: formatEventTimestamp(occurredAt) }) })] })), _jsxs("div", { className: "flex items-center justify-between gap-2 py-2 px-3", children: [_jsx("span", { className: "text-label-12 text-gray-900", children: "Event ID" }), _jsx("span", { className: "max-w-[70%] truncate text-right text-label-12 font-mono", children: event.eventId })] }), event.correlationId && (_jsxs("div", { className: "flex items-center justify-between gap-2 py-2 px-3", children: [_jsx("span", { className: "text-label-12 text-gray-900", children: "Correlation ID" }), _jsx("span", { className: "max-w-[70%] truncate text-right text-label-12 font-mono", children: event.correlationId })] }))] }), isLoading && (_jsxs("div", { className: "p-3", children: [_jsx(Skeleton, { className: "h-4 w-[35%]" }), _jsx(Skeleton, { className: "mt-2 h-4 w-[90%]" }), _jsx(Skeleton, { className: "mt-2 h-4 w-[75%]" })] })), loadError && (_jsx(ErrorCard, { title: "Failed to load event data", details: loadError, className: "mt-2" })), displayPayload != null && (_jsx("div", { className: "[&>div]:border-none [&>div]:rounded-none", children: _jsx(EventDataBlock, { eventType: event.eventType, data: displayPayload }) }))] }));
115
+ : undefined, children: [_jsx(CollapsibleTrigger, { className: "px-3 py-2", children: _jsxs("div", { className: "flex w-full items-center justify-between gap-3", children: [_jsx("span", { className: "text-gray-1000 text-label-12 font-mono", children: event.eventType }), _jsx("span", { className: "shrink-0 text-label-13 text-gray-900", children: displayedCreatedAtTime })] }) }), _jsxs(CollapsibleContent, { children: [_jsxs("div", { className: "flex flex-col bg-background-200 [&:has(+_*)]:border-b [&:has(+_*)]:border-gray-alpha-400", children: [showSeparateEventOccurrenceTimestamps && occurredAt && (_jsxs("div", { className: "flex items-center justify-between gap-2 py-2 px-3", children: [_jsx("span", { className: "text-label-12 text-gray-900", children: "Occurred" }), _jsx(TimestampTooltip, { date: occurredAt, children: _jsx("span", { className: "max-w-[70%] truncate text-right text-label-12 font-mono", children: formatEventTimestamp(occurredAt) }) })] })), _jsxs("div", { className: "flex items-center justify-between gap-2 py-2 px-3", children: [_jsx("span", { className: "text-label-12 text-gray-900", children: "Event ID" }), _jsx("span", { className: "max-w-[70%] truncate text-right text-label-12 font-mono", children: event.eventId })] }), event.correlationId && (_jsxs("div", { className: "flex items-center justify-between gap-2 py-2 px-3", children: [_jsx("span", { className: "text-label-12 text-gray-900", children: "Correlation ID" }), _jsx("span", { className: "max-w-[70%] truncate text-right text-label-12 font-mono", children: event.correlationId })] }))] }), isLoading && (_jsxs("div", { className: "p-3", children: [_jsx(Skeleton, { className: "h-4 w-[35%]" }), _jsx(Skeleton, { className: "mt-2 h-4 w-[90%]" }), _jsx(Skeleton, { className: "mt-2 h-4 w-[75%]" })] })), loadError && (_jsx(ErrorCard, { title: "Failed to load event data", details: loadError, className: "mt-2" })), displayPayload != null && (_jsx("div", { className: "[&>div]:border-none [&>div]:rounded-none", children: _jsx(EventDataBlock, { eventType: event.eventType, data: displayPayload }) }))] })] }));
117
116
  }
118
117
  /**
119
118
  * Check if an eventData object has only expired marker values in ref/payload
120
- * fields for this event type (see {@link EVENT_DATA_REF_FIELDS}). Other keys
119
+ * fields for this event type (see {@link getEventDataRefFields}). Other keys
121
120
  * (e.g. `resumeAt`, `stepName`) are ignored.
122
121
  */
123
122
  function hasOnlyExpiredFields(data, eventType) {
@@ -125,7 +124,7 @@ function hasOnlyExpiredFields(data, eventType) {
125
124
  return false;
126
125
  }
127
126
  const record = data;
128
- const refKeys = EVENT_DATA_REF_FIELDS[eventType] ?? [];
127
+ const refKeys = getEventDataRefFields(eventType);
129
128
  const presentKeys = refKeys.filter((k) => k in record);
130
129
  return (presentKeys.length > 0 &&
131
130
  presentKeys.every((k) => isExpiredMarker(record[k])));
@@ -179,8 +178,8 @@ export function EventsList({ events, isLoading = false, error, onLoadEventData,
179
178
  getEffectiveEventDate(b).getTime()), [events]);
180
179
  const hasEvents = sortedEvents.length > 0 && !error;
181
180
  if (!hasEvents && !isLoading) {
182
- return _jsx(DetailCard, { summary: "Events", disabled: true });
181
+ return _jsx(Collapsible, { label: "Events", disabled: true });
183
182
  }
184
- return (_jsx(RunClickContext.Provider, { value: onRunClick, children: _jsx(StreamClickContext.Provider, { value: onStreamClick, children: _jsx(DetailCard, { summary: "Events", contentClassName: "mb-0", defaultOpen: true, children: isLoading ? (_jsx("div", { className: "flex flex-col -mx-4", children: [0, 1, 2].map((i) => (_jsxs("div", { className: "flex items-center justify-between gap-3 bg-background-200 px-4 py-2", children: [_jsx(Skeleton, { className: "h-4 w-32 rounded" }), _jsx(Skeleton, { className: "h-3 w-16 rounded" })] }, i))) })) : (_jsx("div", { className: "flex flex-col -mx-4", children: sortedEvents.map((event) => (_jsx(EventItem, { event: event, onLoadEventData: onLoadEventData, encryptionKey: encryptionKey, showSeparateEventOccurrenceTimestamps: showSeparateEventOccurrenceTimestamps }, event.eventId))) })) }) }) }));
183
+ return (_jsx(RunClickContext.Provider, { value: onRunClick, children: _jsx(StreamClickContext.Provider, { value: onStreamClick, children: _jsxs(CollapsibleRoot, { defaultOpen: true, children: [_jsx(CollapsibleTrigger, { children: "Events" }), _jsx(CollapsibleContent, { className: "mb-0", children: isLoading ? (_jsx("div", { className: "flex flex-col -mx-4", children: [0, 1, 2].map((i) => (_jsxs("div", { className: "flex items-center justify-between gap-3 bg-background-200 px-4 py-2", children: [_jsx(Skeleton, { className: "h-4 w-32 rounded" }), _jsx(Skeleton, { className: "h-3 w-16 rounded" })] }, i))) })) : (_jsx("div", { className: "flex flex-col -mx-4", children: sortedEvents.map((event) => (_jsx(EventItem, { event: event, onLoadEventData: onLoadEventData, encryptionKey: encryptionKey, showSeparateEventOccurrenceTimestamps: showSeparateEventOccurrenceTimestamps }, event.eventId))) })) })] }) }) }));
185
184
  }
186
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLWxpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zaWRlYmFyL2V2ZW50cy1saXN0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBRWIsT0FBTyxFQUFFLHFCQUFxQixFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDaEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDOztHQUVHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBRXBFOztHQUVHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMvQixjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixlQUFlO0lBQ2Ys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Q0FPbEIsQ0FDSCxDQUFDLEdBQ0UsQ0FDUCxHQUNVLEdBQ2UsR0FDTCxDQUM1QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgRVZFTlRfREFUQV9SRUZfRklFTERTLCB0eXBlIEV2ZW50IH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VMYXlvdXRFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBoYXNFbmNyeXB0ZWRGaWVsZHMsIGlzRXhwaXJlZE1hcmtlciB9IGZyb20gJy4uLy4uL2xpYi9oeWRyYXRpb24nO1xuaW1wb3J0IHsgUnVuQ2xpY2tDb250ZXh0LCBTdHJlYW1DbGlja0NvbnRleHQgfSBmcm9tICcuLi91aS9kYXRhLWluc3BlY3Rvcic7XG5pbXBvcnQgeyBFcnJvckNhcmQgfSBmcm9tICcuLi91aS9lcnJvci1jYXJkJztcbmltcG9ydCB7IEVycm9yU3RhY2tCbG9jaywgaXNTdHJ1Y3R1cmVkRXJyb3IgfSBmcm9tICcuLi91aS9lcnJvci1zdGFjay1ibG9jayc7XG5pbXBvcnQgeyBTa2VsZXRvbiB9IGZyb20gJy4uL3VpL3NrZWxldG9uJztcbmltcG9ydCB7IFRpbWVzdGFtcFRvb2x0aXAgfSBmcm9tICcuLi91aS90aW1lc3RhbXAtdG9vbHRpcCc7XG5pbXBvcnQgeyBBdHRyU2V0RXZlbnRCbG9jayB9IGZyb20gJy4vYXR0cmlidXRlcy1ibG9jayc7XG5pbXBvcnQgeyBDb3B5YWJsZURhdGFCbG9jaywgRW5jcnlwdGVkRGF0YUJsb2NrIH0gZnJvbSAnLi9jb3B5YWJsZS1kYXRhLWJsb2NrJztcbmltcG9ydCB7IERldGFpbENhcmQgfSBmcm9tICcuL2RldGFpbC1jYXJkJztcblxuLyoqXG4gKiBFdmVudCB0eXBlcyB3aG9zZSBldmVudERhdGEgY29udGFpbnMgYW4gZXJyb3IgZmllbGQgd2l0aCBhIFN0cnVjdHVyZWRFcnJvci5cbiAqL1xuY29uc3QgRVJST1JfRVZFTlRfVFlQRVMgPSBuZXcgU2V0KFsnc3RlcF9mYWlsZWQnLCAnc3RlcF9yZXRyeWluZyddKTtcblxuLyoqXG4gKiBFdmVudCB0eXBlcyB0aGF0IGNhcnJ5IHVzZXItc2VyaWFsaXplZCBkYXRhIGluIHRoZWlyIGV2ZW50RGF0YSBmaWVsZC5cbiAqL1xuY29uc3QgREFUQV9FVkVOVF9UWVBFUyA9IG5ldyBTZXQoW1xuICAnc3RlcF9jcmVhdGVkJyxcbiAgJ3N0ZXBfY29tcGxldGVkJyxcbiAgJ3N0ZXBfZmFpbGVkJyxcbiAgJ3N0ZXBfcmV0cnlpbmcnLFxuICAnaG9va19jcmVhdGVkJyxcbiAgJ2hvb2tfcmVjZWl2ZWQnLFxuICAncnVuX2NyZWF0ZWQnLFxuICAncnVuX2NvbXBsZXRlZCcsXG4gICdydW5fZmFpbGVkJyxcbiAgJ3dhaXRfY3JlYXRlZCcsXG4gICd3YWl0X2NvbXBsZXRlZCcsXG4gICdhdHRyX3NldCcsXG5dKTtcblxuY29uc3QgcGFyc2VEYXRlVmFsdWUgPSAodmFsdWU6IHVua25vd24pOiBEYXRlIHwgbnVsbCA9PiB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBkYXRlID0gdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gdmFsdWUgOiBuZXcgRGF0ZShTdHJpbmcodmFsdWUpKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyBudWxsIDogZGF0ZTtcbn07XG5cbmNvbnN0IGdldEVmZmVjdGl2ZUV2ZW50RGF0ZSA9IChcbiAgZXZlbnQ6IFBpY2s8RXZlbnQsICdjcmVhdGVkQXQnIHwgJ29jY3VycmVkQXQnPlxuKTogRGF0ZSA9PiBwYXJzZURhdGVWYWx1ZShldmVudC5vY2N1cnJlZEF0KSA/PyBuZXcgRGF0ZShldmVudC5jcmVhdGVkQXQpO1xuXG5jb25zdCBmb3JtYXRFdmVudFRpbWVzdGFtcCA9IChkYXRlOiBEYXRlKTogc3RyaW5nID0+XG4gIGRhdGUudG9Mb2NhbGVTdHJpbmcodW5kZWZpbmVkLCB7XG4gICAgbW9udGg6ICdzaG9ydCcsXG4gICAgZGF5OiAnbnVtZXJpYycsXG4gICAgaG91cjogJ251bWVyaWMnLFxuICAgIG1pbnV0ZTogJ251bWVyaWMnLFxuICAgIHNlY29uZDogJ251bWVyaWMnLFxuICAgIGZyYWN0aW9uYWxTZWNvbmREaWdpdHM6IDMsXG4gICAgdGltZVpvbmVOYW1lOiAnc2hvcnQnLFxuICB9KTtcblxuLyoqXG4gKiBBIHNpbmdsZSBldmVudCByb3cgdGhhdCBjYW4gbGF6eS1sb2FkIGl0cyBldmVudERhdGEgd2hlbiBleHBhbmRlZC5cbiAqL1xuZnVuY3Rpb24gRXZlbnRJdGVtKHtcbiAgZXZlbnQsXG4gIG9uTG9hZEV2ZW50RGF0YSxcbiAgZW5jcnlwdGlvbktleSxcbiAgc2hvd1NlcGFyYXRlRXZlbnRPY2N1cnJlbmNlVGltZXN0YW1wcyA9IGZhbHNlLFxufToge1xuICBldmVudDogRXZlbnQ7XG4gIG9uTG9hZEV2ZW50RGF0YT86IChcbiAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmcsXG4gICAgZXZlbnRJZDogc3RyaW5nXG4gICkgPT4gUHJvbWlzZTx1bmtub3duIHwgbnVsbD47XG4gIC8qKiBXaGVuIHRoaXMgY2hhbmdlcyAoZS5nLiwgRGVjcnlwdCB3YXMgY2xpY2tlZCksIGludmFsaWRhdGUgY2FjaGVkIGRhdGEgKi9cbiAgZW5jcnlwdGlvbktleT86IFVpbnQ4QXJyYXk7XG4gIC8qKiBTaG93IG9jY3VycmVkQXQgc2VwYXJhdGVseSBpbnN0ZWFkIG9mIGZvbGRpbmcgaXQgaW50byB0aGUgQ3JlYXRlZCB0aW1lc3RhbXAuICovXG4gIHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHM/OiBib29sZWFuO1xufSkge1xuICBjb25zdCBbbG9hZGVkRGF0YSwgc2V0TG9hZGVkRGF0YV0gPSB1c2VTdGF0ZTx1bmtub3duIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldElzTG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtsb2FkRXJyb3IsIHNldExvYWRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3Qgd2FzRXhwYW5kZWRSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICAvKiogTWlycm9ycyB3aGV0aGVyIHdlIGhhdmUgYSBmZXRjaGVkIHBheWxvYWQ7IGF2b2lkcyBzdGFsZSBgbG9hZGVkRGF0YWAgaW4gbG9hZCBjbG9zdXJlLiAqL1xuICBjb25zdCBsb2FkZWREYXRhUmVmID0gdXNlUmVmPHVua25vd24gfCBudWxsPihudWxsKTtcblxuICAvLyBDaGVjayBpZiB0aGUgZXZlbnQgYWxyZWFkeSBoYXMgZXZlbnREYXRhIGZyb20gdGhlIHN0b3JlXG4gIGNvbnN0IGV4aXN0aW5nRGF0YSA9XG4gICAgJ2V2ZW50RGF0YScgaW4gZXZlbnQgJiYgZXZlbnQuZXZlbnREYXRhICE9IG51bGwgPyBldmVudC5ldmVudERhdGEgOiBudWxsO1xuICBjb25zdCBtZXJnZWREaXNwbGF5ID0gbG9hZGVkRGF0YSA/PyBleGlzdGluZ0RhdGE7XG4gIGNvbnN0IGNhbkhhdmVEYXRhID0gREFUQV9FVkVOVF9UWVBFUy5oYXMoZXZlbnQuZXZlbnRUeXBlKTtcblxuICBjb25zdCBsb2FkRXZlbnREYXRhID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKG9wdGlvbnM/OiB7IGZvcmNlPzogYm9vbGVhbiB9KSA9PiB7XG4gICAgICBpZiAoIW9uTG9hZEV2ZW50RGF0YSB8fCAhZXZlbnQuY29ycmVsYXRpb25JZCB8fCAhZXZlbnQuZXZlbnRJZCkgcmV0dXJuO1xuICAgICAgaWYgKCFvcHRpb25zPy5mb3JjZSAmJiBsb2FkZWREYXRhUmVmLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICAgIHNldExvYWRFcnJvcihudWxsKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IG9uTG9hZEV2ZW50RGF0YShldmVudC5jb3JyZWxhdGlvbklkLCBldmVudC5ldmVudElkKTtcbiAgICAgICAgbG9hZGVkRGF0YVJlZi5jdXJyZW50ID0gZGF0YTtcbiAgICAgICAgc2V0TG9hZGVkRGF0YShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzZXRMb2FkRXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbb25Mb2FkRXZlbnREYXRhLCBldmVudC5jb3JyZWxhdGlvbklkLCBldmVudC5ldmVudElkXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUV4cGFuZCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNMb2FkaW5nKSByZXR1cm47XG4gICAgd2FzRXhwYW5kZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgYXdhaXQgbG9hZEV2ZW50RGF0YSgpO1xuICB9LCBbaXNMb2FkaW5nLCBsb2FkRXZlbnREYXRhXSk7XG5cbiAgLy8gV2hlbiB0aGUgZW5jcnlwdGlvbiBrZXkgY2hhbmdlcyBhbmQgdGhpcyBldmVudCB3YXMgcHJldmlvdXNseSBleHBhbmRlZCxcbiAgLy8gcmUtbG9hZCB0aGUgZGF0YSBzbyBpdCBnZXRzIGRlY3J5cHRlZFxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5jcnlwdGlvbktleSB8fCAhd2FzRXhwYW5kZWRSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgIGxvYWRlZERhdGFSZWYuY3VycmVudCA9IG51bGw7XG4gICAgc2V0TG9hZGVkRGF0YShudWxsKTtcbiAgICB2b2lkIGxvYWRFdmVudERhdGEoeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSwgW2VuY3J5cHRpb25LZXksIGxvYWRFdmVudERhdGFdKTtcblxuICBjb25zdCBjcmVhdGVkQXQgPSBuZXcgRGF0ZShldmVudC5jcmVhdGVkQXQpO1xuICBjb25zdCBvY2N1cnJlZEF0ID0gcGFyc2VEYXRlVmFsdWUoZXZlbnQub2NjdXJyZWRBdCk7XG4gIGNvbnN0IGRpc3BsYXllZENyZWF0ZWRBdCA9IHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHNcbiAgICA/IGNyZWF0ZWRBdFxuICAgIDogZ2V0RWZmZWN0aXZlRXZlbnREYXRlKGV2ZW50KTtcbiAgY29uc3QgZGlzcGxheWVkQ3JlYXRlZEF0VGltZSA9IGRpc3BsYXllZENyZWF0ZWRBdC50b0xvY2FsZVRpbWVTdHJpbmcoXG4gICAgdW5kZWZpbmVkLFxuICAgIHtcbiAgICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICAgIG1pbnV0ZTogJ251bWVyaWMnLFxuICAgICAgc2Vjb25kOiAnbnVtZXJpYycsXG4gICAgfVxuICApO1xuXG4gIGNvbnN0IGRpc3BsYXlQYXlsb2FkID0gaXNMb2FkaW5nID8gbG9hZGVkRGF0YSA6IG1lcmdlZERpc3BsYXk7XG5cbiAgcmV0dXJuIChcbiAgICA8RGV0YWlsQ2FyZFxuICAgICAgdmFyaWFudD1cImNhcmRcIlxuICAgICAgc3VtbWFyeUNsYXNzTmFtZT1cInB4LTMgcHktMlwiXG4gICAgICBzdW1tYXJ5PXtcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0zXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1ncmF5LTEwMDAgdGV4dC1sYWJlbC0xMiBmb250LW1vbm9cIj5cbiAgICAgICAgICAgIHtldmVudC5ldmVudFR5cGV9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInNocmluay0wIHRleHQtbGFiZWwtMTMgdGV4dC1ncmF5LTkwMFwiPlxuICAgICAgICAgICAge2Rpc3BsYXllZENyZWF0ZWRBdFRpbWV9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIG9uVG9nZ2xlPXtcbiAgICAgICAgY2FuSGF2ZURhdGFcbiAgICAgICAgICA/IChvcGVuKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChvcGVuKSBoYW5kbGVFeHBhbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgfVxuICAgID5cbiAgICAgIHsvKiBFdmVudCBhdHRyaWJ1dGVzICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGJnLWJhY2tncm91bmQtMjAwIFsmOmhhcygrXyopXTpib3JkZXItYiBbJjpoYXMoK18qKV06Ym9yZGVyLWdyYXktYWxwaGEtNDAwXCI+XG4gICAgICAgIHtzaG93U2VwYXJhdGVFdmVudE9jY3VycmVuY2VUaW1lc3RhbXBzICYmIG9jY3VycmVkQXQgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yIHB5LTIgcHgtM1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1sYWJlbC0xMiB0ZXh0LWdyYXktOTAwXCI+T2NjdXJyZWQ8L3NwYW4+XG4gICAgICAgICAgICA8VGltZXN0YW1wVG9vbHRpcCBkYXRlPXtvY2N1cnJlZEF0fT5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF4LXctWzcwJV0gdHJ1bmNhdGUgdGV4dC1yaWdodCB0ZXh0LWxhYmVsLTEyIGZvbnQtbW9ub1wiPlxuICAgICAgICAgICAgICAgIHtmb3JtYXRFdmVudFRpbWVzdGFtcChvY2N1cnJlZEF0KX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9UaW1lc3RhbXBUb29sdGlwPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtMiBweS0yIHB4LTNcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWxhYmVsLTEyIHRleHQtZ3JheS05MDBcIj5FdmVudCBJRDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXgtdy1bNzAlXSB0cnVuY2F0ZSB0ZXh0LXJpZ2h0IHRleHQtbGFiZWwtMTIgZm9udC1tb25vXCI+XG4gICAgICAgICAgICB7ZXZlbnQuZXZlbnRJZH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7ZXZlbnQuY29ycmVsYXRpb25JZCAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTIgcHktMiBweC0zXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWxhYmVsLTEyIHRleHQtZ3JheS05MDBcIj5Db3JyZWxhdGlvbiBJRDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1heC13LVs3MCVdIHRydW5jYXRlIHRleHQtcmlnaHQgdGV4dC1sYWJlbC0xMiBmb250LW1vbm9cIj5cbiAgICAgICAgICAgICAge2V2ZW50LmNvcnJlbGF0aW9uSWR9XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIExvYWRpbmcgc3RhdGUgKi99XG4gICAgICB7aXNMb2FkaW5nICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTNcIj5cbiAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwiaC00IHctWzM1JV1cIiAvPlxuICAgICAgICAgIDxTa2VsZXRvbiBjbGFzc05hbWU9XCJtdC0yIGgtNCB3LVs5MCVdXCIgLz5cbiAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwibXQtMiBoLTQgdy1bNzUlXVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAgey8qIEVycm9yIHN0YXRlICovfVxuICAgICAge2xvYWRFcnJvciAmJiAoXG4gICAgICAgIDxFcnJvckNhcmRcbiAgICAgICAgICB0aXRsZT1cIkZhaWxlZCB0byBsb2FkIGV2ZW50IGRhdGFcIlxuICAgICAgICAgIGRldGFpbHM9e2xvYWRFcnJvcn1cbiAgICAgICAgICBjbGFzc05hbWU9XCJtdC0yXCJcbiAgICAgICAgLz5cbiAgICAgICl9XG5cbiAgICAgIHsvKiBFdmVudCBkYXRhICovfVxuICAgICAge2Rpc3BsYXlQYXlsb2FkICE9IG51bGwgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIlsmPmRpdl06Ym9yZGVyLW5vbmUgWyY+ZGl2XTpyb3VuZGVkLW5vbmVcIj5cbiAgICAgICAgICA8RXZlbnREYXRhQmxvY2sgZXZlbnRUeXBlPXtldmVudC5ldmVudFR5cGV9IGRhdGE9e2Rpc3BsYXlQYXlsb2FkfSAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9EZXRhaWxDYXJkPlxuICApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFuIGV2ZW50RGF0YSBvYmplY3QgaGFzIG9ubHkgZXhwaXJlZCBtYXJrZXIgdmFsdWVzIGluIHJlZi9wYXlsb2FkXG4gKiBmaWVsZHMgZm9yIHRoaXMgZXZlbnQgdHlwZSAoc2VlIHtAbGluayBFVkVOVF9EQVRBX1JFRl9GSUVMRFN9KS4gT3RoZXIga2V5c1xuICogKGUuZy4gYHJlc3VtZUF0YCwgYHN0ZXBOYW1lYCkgYXJlIGlnbm9yZWQuXG4gKi9cbmZ1bmN0aW9uIGhhc09ubHlFeHBpcmVkRmllbGRzKGRhdGE6IHVua25vd24sIGV2ZW50VHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHJlY29yZCA9IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHJlZktleXMgPSBFVkVOVF9EQVRBX1JFRl9GSUVMRFNbZXZlbnRUeXBlXSA/PyBbXTtcbiAgY29uc3QgcHJlc2VudEtleXMgPSByZWZLZXlzLmZpbHRlcigoaykgPT4gayBpbiByZWNvcmQpO1xuICByZXR1cm4gKFxuICAgIHByZXNlbnRLZXlzLmxlbmd0aCA+IDAgJiZcbiAgICBwcmVzZW50S2V5cy5ldmVyeSgoaykgPT4gaXNFeHBpcmVkTWFya2VyKHJlY29yZFtrXSkpXG4gICk7XG59XG5cbi8qKlxuICogUmVuZGVycyBldmVudCBkYXRhLCB1c2luZyBFcnJvclN0YWNrQmxvY2sgZm9yIGVycm9yIGV2ZW50cyB0aGF0IGNvbnRhaW4gYVxuICogc3RydWN0dXJlZCBlcnJvciwgYW5kIENvcHlhYmxlRGF0YUJsb2NrIG90aGVyd2lzZS5cbiAqL1xuZnVuY3Rpb24gRXZlbnREYXRhQmxvY2soe1xuICBldmVudFR5cGUsXG4gIGRhdGEsXG59OiB7XG4gIGV2ZW50VHlwZTogc3RyaW5nO1xuICBkYXRhOiB1bmtub3duO1xufSkge1xuICAvLyBFeHBpcmVkIGRhdGEg4oCUIHNob3cgYSBzaW1wbGUgbWVzc2FnZSBpbnN0ZWFkIG9mIHRoZSByYXcgc3R1Yi5cbiAgLy8gQ2hlY2sgYm90aCB0aGUgdG9wLWxldmVsIGV2ZW50RGF0YSBhbmQgbmVzdGVkIHN1Yi1maWVsZHMgKHJlc3VsdCwgaW5wdXQsIGV0Yy4pXG4gIC8vIHNpbmNlIHRoZSBzZXJ2ZXIgc3R1YnMgZWFjaCByZWYgZmllbGQgaW5kZXBlbmRlbnRseS5cbiAgaWYgKGlzRXhwaXJlZE1hcmtlcihkYXRhKSB8fCBoYXNPbmx5RXhwaXJlZEZpZWxkcyhkYXRhLCBldmVudFR5cGUpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEuNSByb3VuZGVkLW1kIGJvcmRlciBweC0zIHB5LTIgdGV4dC14c1wiXG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTMwMCknLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwKScsXG4gICAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTcwMCknLFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1lZGl1bVwiPkRhdGEgZXhwaXJlZDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICBpZiAoaGFzRW5jcnlwdGVkRmllbGRzKHsgZXZlbnRUeXBlLCBldmVudERhdGE6IGRhdGEgfSkpIHtcbiAgICByZXR1cm4gPEVuY3J5cHRlZERhdGFCbG9jayAvPjtcbiAgfVxuXG4gIC8vIEF0dHJpYnV0ZSBjaGFuZ2VzIOKAlCByZW5kZXIgdGhlIGNoYW5nZWQga2V5cyBhbmQgdGhlIHdyaXRlciBpbnN0ZWFkIG9mXG4gIC8vIHRoZSByYXcgSlNPTiBwYXlsb2FkLlxuICBpZiAoZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnKSB7XG4gICAgcmV0dXJuIDxBdHRyU2V0RXZlbnRCbG9jayBkYXRhPXtkYXRhfSAvPjtcbiAgfVxuXG4gIC8vIEZvciBlcnJvciBldmVudHMgKHN0ZXBfZmFpbGVkLCBzdGVwX3JldHJ5aW5nKSwgdGhlIGV2ZW50RGF0YSBoYXMgdGhlIHNoYXBlXG4gIC8vIHsgZXJyb3I6IFN0cnVjdHVyZWRFcnJvciwgc3RhY2s/OiBzdHJpbmcsIC4uLiB9LiBDaGVjayBib3RoIHRoZSB0b3AtbGV2ZWxcbiAgLy8gdmFsdWUgYW5kIHRoZSBuZXN0ZWQgYGVycm9yYCBmaWVsZCBmb3IgYSBzdGFjayB0cmFjZS5cbiAgaWYgKFxuICAgIEVSUk9SX0VWRU5UX1RZUEVTLmhhcyhldmVudFR5cGUpICYmXG4gICAgZGF0YSAhPSBudWxsICYmXG4gICAgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnXG4gICkge1xuICAgIGNvbnN0IHJlY29yZCA9IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAvLyBDaGVjayB0aGUgbmVzdGVkIGBlcnJvcmAgZmllbGQgZmlyc3QgKHRoZSBTdHJ1Y3R1cmVkRXJyb3IpXG4gICAgaWYgKGlzU3RydWN0dXJlZEVycm9yKHJlY29yZC5lcnJvcikpIHtcbiAgICAgIHJldHVybiA8RXJyb3JTdGFja0Jsb2NrIHZhbHVlPXtyZWNvcmQuZXJyb3J9IC8+O1xuICAgIH1cblxuICAgIC8vIFNvbWUgZXJyb3IgZm9ybWF0cyBwdXQgdGhlIG1lc3NhZ2Uvc3RhY2sgYXQgdGhlIHRvcCBsZXZlbCBvZiBldmVudERhdGEuXG4gICAgaWYgKGlzU3RydWN0dXJlZEVycm9yKHJlY29yZCkpIHtcbiAgICAgIHJldHVybiA8RXJyb3JTdGFja0Jsb2NrIHZhbHVlPXtyZWNvcmR9IC8+O1xuICAgIH1cbiAgfVxuXG4gIC8vIEZvciBub24tZXJyb3IgZXZlbnRzIG9yIGVycm9ycyB3aXRob3V0IGEgc3RhY2ssIGZhbGwgYmFjayB0byB0aGVcbiAgLy8gZ2VuZXJpYyBKU09OIHZpZXdlci5cbiAgcmV0dXJuIDxDb3B5YWJsZURhdGFCbG9jayBkYXRhPXtkYXRhfSAvPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEV2ZW50c0xpc3Qoe1xuICBldmVudHMsXG4gIGlzTG9hZGluZyA9IGZhbHNlLFxuICBlcnJvcixcbiAgb25Mb2FkRXZlbnREYXRhLFxuICBvblN0cmVhbUNsaWNrLFxuICBvblJ1bkNsaWNrLFxuICBlbmNyeXB0aW9uS2V5LFxuICBzaG93U2VwYXJhdGVFdmVudE9jY3VycmVuY2VUaW1lc3RhbXBzID0gZmFsc2UsXG59OiB7XG4gIGV2ZW50czogRXZlbnRbXTtcbiAgaXNMb2FkaW5nPzogYm9vbGVhbjtcbiAgZXJyb3I/OiBFcnJvciB8IG51bGw7XG4gIG9uTG9hZEV2ZW50RGF0YT86IChcbiAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmcsXG4gICAgZXZlbnRJZDogc3RyaW5nXG4gICkgPT4gUHJvbWlzZTx1bmtub3duIHwgbnVsbD47XG4gIG9uU3RyZWFtQ2xpY2s/OiAoc3RyZWFtSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgb25SdW5DbGljaz86IChydW5JZDogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogV2hlbiBwcm92aWRlZCwgc2lnbmFscyB0aGF0IGRlY3J5cHRpb24gaXMgYWN0aXZlICh0cmlnZ2VycyByZS1sb2FkIG9mIGV4cGFuZGVkIGV2ZW50cykgKi9cbiAgZW5jcnlwdGlvbktleT86IFVpbnQ4QXJyYXk7XG4gIC8qKiBTaG93IG9jY3VycmVkQXQgc2VwYXJhdGVseSBpbnN0ZWFkIG9mIGZvbGRpbmcgaXQgaW50byB0aGUgQ3JlYXRlZCB0aW1lc3RhbXAuICovXG4gIHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHM/OiBib29sZWFuO1xufSkge1xuICAvLyBTb3J0IGJ5IHRoZSB0aW1lc3RhbXAgc2hvd24gYXMgQ3JlYXRlZCBieSBkZWZhdWx0LlxuICBjb25zdCBzb3J0ZWRFdmVudHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBbLi4uZXZlbnRzXS5zb3J0KFxuICAgICAgICAoYSwgYikgPT5cbiAgICAgICAgICBnZXRFZmZlY3RpdmVFdmVudERhdGUoYSkuZ2V0VGltZSgpIC1cbiAgICAgICAgICBnZXRFZmZlY3RpdmVFdmVudERhdGUoYikuZ2V0VGltZSgpXG4gICAgICApLFxuICAgIFtldmVudHNdXG4gICk7XG5cbiAgY29uc3QgaGFzRXZlbnRzID0gc29ydGVkRXZlbnRzLmxlbmd0aCA+IDAgJiYgIWVycm9yO1xuXG4gIGlmICghaGFzRXZlbnRzICYmICFpc0xvYWRpbmcpIHtcbiAgICByZXR1cm4gPERldGFpbENhcmQgc3VtbWFyeT1cIkV2ZW50c1wiIGRpc2FibGVkIC8+O1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8UnVuQ2xpY2tDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtvblJ1bkNsaWNrfT5cbiAgICAgIDxTdHJlYW1DbGlja0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e29uU3RyZWFtQ2xpY2t9PlxuICAgICAgICA8RGV0YWlsQ2FyZCBzdW1tYXJ5PVwiRXZlbnRzXCIgY29udGVudENsYXNzTmFtZT1cIm1iLTBcIiBkZWZhdWx0T3Blbj5cbiAgICAgICAgICB7aXNMb2FkaW5nID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIC1teC00XCI+XG4gICAgICAgICAgICAgIHtbMCwgMSwgMl0ubWFwKChpKSA9PiAoXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAga2V5PXtpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0zIGJnLWJhY2tncm91bmQtMjAwIHB4LTQgcHktMlwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cImgtNCB3LTMyIHJvdW5kZWRcIiAvPlxuICAgICAgICAgICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cImgtMyB3LTE2IHJvdW5kZWRcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgLW14LTRcIj5cbiAgICAgICAgICAgICAge3NvcnRlZEV2ZW50cy5tYXAoKGV2ZW50KSA9PiAoXG4gICAgICAgICAgICAgICAgPEV2ZW50SXRlbVxuICAgICAgICAgICAgICAgICAga2V5PXtldmVudC5ldmVudElkfVxuICAgICAgICAgICAgICAgICAgZXZlbnQ9e2V2ZW50fVxuICAgICAgICAgICAgICAgICAgb25Mb2FkRXZlbnREYXRhPXtvbkxvYWRFdmVudERhdGF9XG4gICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5PXtlbmNyeXB0aW9uS2V5fVxuICAgICAgICAgICAgICAgICAgc2hvd1NlcGFyYXRlRXZlbnRPY2N1cnJlbmNlVGltZXN0YW1wcz17XG4gICAgICAgICAgICAgICAgICAgIHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHNcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvRGV0YWlsQ2FyZD5cbiAgICAgIDwvU3RyZWFtQ2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvUnVuQ2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufVxuIl19
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLWxpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zaWRlYmFyL2V2ZW50cy1saXN0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBR2IsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDaEYsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsZUFBZSxHQUNoQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZixrQkFBa0IsR0FDbkIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFOUU7O0dBRUc7QUFDSCxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7QUFFcEU7O0dBRUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQy9CLGNBQWM7SUFDZCxnQkFBZ0I7SUFDaEIsYUFBYTtJQUNiLGVB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RSxhQUFhLEVBQzVCLHFDQUFxQyxFQUNuQyxxQ0FBcUMsSUFMbEMsS0FBSyxDQUFDLE9BQU8sQ0FPbEIsQ0FDSCxDQUFDLEdBQ0UsQ0FDUCxHQUNrQixJQUNMLEdBQ1UsR0FDTCxDQUM1QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHR5cGUgeyBFdmVudCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlTGF5b3V0RWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgZ2V0RXZlbnREYXRhUmVmRmllbGRzLFxuICBoYXNFbmNyeXB0ZWRGaWVsZHMsXG4gIGlzRXhwaXJlZE1hcmtlcixcbn0gZnJvbSAnLi4vLi4vbGliL2h5ZHJhdGlvbic7XG5pbXBvcnQge1xuICBDb2xsYXBzaWJsZSxcbiAgQ29sbGFwc2libGVDb250ZW50LFxuICBDb2xsYXBzaWJsZVJvb3QsXG4gIENvbGxhcHNpYmxlVHJpZ2dlcixcbn0gZnJvbSAnLi4vdWkvY29sbGFwc2libGUnO1xuaW1wb3J0IHsgUnVuQ2xpY2tDb250ZXh0LCBTdHJlYW1DbGlja0NvbnRleHQgfSBmcm9tICcuLi91aS9kYXRhLWluc3BlY3Rvcic7XG5pbXBvcnQgeyBFcnJvckNhcmQgfSBmcm9tICcuLi91aS9lcnJvci1jYXJkJztcbmltcG9ydCB7IEVycm9yU3RhY2tCbG9jaywgaXNTdHJ1Y3R1cmVkRXJyb3IgfSBmcm9tICcuLi91aS9lcnJvci1zdGFjay1ibG9jayc7XG5pbXBvcnQgeyBTa2VsZXRvbiB9IGZyb20gJy4uL3VpL3NrZWxldG9uJztcbmltcG9ydCB7IFRpbWVzdGFtcFRvb2x0aXAgfSBmcm9tICcuLi91aS90aW1lc3RhbXAtdG9vbHRpcCc7XG5pbXBvcnQgeyBBdHRyU2V0RXZlbnRCbG9jayB9IGZyb20gJy4vYXR0cmlidXRlcy1ibG9jayc7XG5pbXBvcnQgeyBDb3B5YWJsZURhdGFCbG9jaywgRW5jcnlwdGVkRGF0YUJsb2NrIH0gZnJvbSAnLi9jb3B5YWJsZS1kYXRhLWJsb2NrJztcblxuLyoqXG4gKiBFdmVudCB0eXBlcyB3aG9zZSBldmVudERhdGEgY29udGFpbnMgYW4gZXJyb3IgZmllbGQgd2l0aCBhIFN0cnVjdHVyZWRFcnJvci5cbiAqL1xuY29uc3QgRVJST1JfRVZFTlRfVFlQRVMgPSBuZXcgU2V0KFsnc3RlcF9mYWlsZWQnLCAnc3RlcF9yZXRyeWluZyddKTtcblxuLyoqXG4gKiBFdmVudCB0eXBlcyB0aGF0IGNhcnJ5IHVzZXItc2VyaWFsaXplZCBkYXRhIGluIHRoZWlyIGV2ZW50RGF0YSBmaWVsZC5cbiAqL1xuY29uc3QgREFUQV9FVkVOVF9UWVBFUyA9IG5ldyBTZXQoW1xuICAnc3RlcF9jcmVhdGVkJyxcbiAgJ3N0ZXBfY29tcGxldGVkJyxcbiAgJ3N0ZXBfZmFpbGVkJyxcbiAgJ3N0ZXBfcmV0cnlpbmcnLFxuICAnaG9va19jcmVhdGVkJyxcbiAgJ2hvb2tfcmVjZWl2ZWQnLFxuICAncnVuX2NyZWF0ZWQnLFxuICAncnVuX2NvbXBsZXRlZCcsXG4gICdydW5fZmFpbGVkJyxcbiAgJ3dhaXRfY3JlYXRlZCcsXG4gICd3YWl0X2NvbXBsZXRlZCcsXG4gICdhdHRyX3NldCcsXG5dKTtcblxuY29uc3QgcGFyc2VEYXRlVmFsdWUgPSAodmFsdWU6IHVua25vd24pOiBEYXRlIHwgbnVsbCA9PiB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBkYXRlID0gdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gdmFsdWUgOiBuZXcgRGF0ZShTdHJpbmcodmFsdWUpKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyBudWxsIDogZGF0ZTtcbn07XG5cbmNvbnN0IGdldEVmZmVjdGl2ZUV2ZW50RGF0ZSA9IChcbiAgZXZlbnQ6IFBpY2s8RXZlbnQsICdjcmVhdGVkQXQnIHwgJ29jY3VycmVkQXQnPlxuKTogRGF0ZSA9PiBwYXJzZURhdGVWYWx1ZShldmVudC5vY2N1cnJlZEF0KSA/PyBuZXcgRGF0ZShldmVudC5jcmVhdGVkQXQpO1xuXG5jb25zdCBmb3JtYXRFdmVudFRpbWVzdGFtcCA9IChkYXRlOiBEYXRlKTogc3RyaW5nID0+XG4gIGRhdGUudG9Mb2NhbGVTdHJpbmcodW5kZWZpbmVkLCB7XG4gICAgbW9udGg6ICdzaG9ydCcsXG4gICAgZGF5OiAnbnVtZXJpYycsXG4gICAgaG91cjogJ251bWVyaWMnLFxuICAgIG1pbnV0ZTogJ251bWVyaWMnLFxuICAgIHNlY29uZDogJ251bWVyaWMnLFxuICAgIGZyYWN0aW9uYWxTZWNvbmREaWdpdHM6IDMsXG4gICAgdGltZVpvbmVOYW1lOiAnc2hvcnQnLFxuICB9KTtcblxuLyoqXG4gKiBBIHNpbmdsZSBldmVudCByb3cgdGhhdCBjYW4gbGF6eS1sb2FkIGl0cyBldmVudERhdGEgd2hlbiBleHBhbmRlZC5cbiAqL1xuZnVuY3Rpb24gRXZlbnRJdGVtKHtcbiAgZXZlbnQsXG4gIG9uTG9hZEV2ZW50RGF0YSxcbiAgZW5jcnlwdGlvbktleSxcbiAgc2hvd1NlcGFyYXRlRXZlbnRPY2N1cnJlbmNlVGltZXN0YW1wcyA9IGZhbHNlLFxufToge1xuICBldmVudDogRXZlbnQ7XG4gIG9uTG9hZEV2ZW50RGF0YT86IChcbiAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmcsXG4gICAgZXZlbnRJZDogc3RyaW5nXG4gICkgPT4gUHJvbWlzZTx1bmtub3duIHwgbnVsbD47XG4gIC8qKiBXaGVuIHRoaXMgY2hhbmdlcyAoZS5nLiwgRGVjcnlwdCB3YXMgY2xpY2tlZCksIGludmFsaWRhdGUgY2FjaGVkIGRhdGEgKi9cbiAgZW5jcnlwdGlvbktleT86IFVpbnQ4QXJyYXk7XG4gIC8qKiBTaG93IG9jY3VycmVkQXQgc2VwYXJhdGVseSBpbnN0ZWFkIG9mIGZvbGRpbmcgaXQgaW50byB0aGUgQ3JlYXRlZCB0aW1lc3RhbXAuICovXG4gIHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHM/OiBib29sZWFuO1xufSkge1xuICBjb25zdCBbbG9hZGVkRGF0YSwgc2V0TG9hZGVkRGF0YV0gPSB1c2VTdGF0ZTx1bmtub3duIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldElzTG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtsb2FkRXJyb3IsIHNldExvYWRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3Qgd2FzRXhwYW5kZWRSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICAvKiogTWlycm9ycyB3aGV0aGVyIHdlIGhhdmUgYSBmZXRjaGVkIHBheWxvYWQ7IGF2b2lkcyBzdGFsZSBgbG9hZGVkRGF0YWAgaW4gbG9hZCBjbG9zdXJlLiAqL1xuICBjb25zdCBsb2FkZWREYXRhUmVmID0gdXNlUmVmPHVua25vd24gfCBudWxsPihudWxsKTtcblxuICAvLyBDaGVjayBpZiB0aGUgZXZlbnQgYWxyZWFkeSBoYXMgZXZlbnREYXRhIGZyb20gdGhlIHN0b3JlXG4gIGNvbnN0IGV4aXN0aW5nRGF0YSA9XG4gICAgJ2V2ZW50RGF0YScgaW4gZXZlbnQgJiYgZXZlbnQuZXZlbnREYXRhICE9IG51bGwgPyBldmVudC5ldmVudERhdGEgOiBudWxsO1xuICBjb25zdCBtZXJnZWREaXNwbGF5ID0gbG9hZGVkRGF0YSA/PyBleGlzdGluZ0RhdGE7XG4gIGNvbnN0IGNhbkhhdmVEYXRhID0gREFUQV9FVkVOVF9UWVBFUy5oYXMoZXZlbnQuZXZlbnRUeXBlKTtcblxuICBjb25zdCBsb2FkRXZlbnREYXRhID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKG9wdGlvbnM/OiB7IGZvcmNlPzogYm9vbGVhbiB9KSA9PiB7XG4gICAgICBpZiAoIW9uTG9hZEV2ZW50RGF0YSB8fCAhZXZlbnQuY29ycmVsYXRpb25JZCB8fCAhZXZlbnQuZXZlbnRJZCkgcmV0dXJuO1xuICAgICAgaWYgKCFvcHRpb25zPy5mb3JjZSAmJiBsb2FkZWREYXRhUmVmLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICAgIHNldExvYWRFcnJvcihudWxsKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IG9uTG9hZEV2ZW50RGF0YShldmVudC5jb3JyZWxhdGlvbklkLCBldmVudC5ldmVudElkKTtcbiAgICAgICAgbG9hZGVkRGF0YVJlZi5jdXJyZW50ID0gZGF0YTtcbiAgICAgICAgc2V0TG9hZGVkRGF0YShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzZXRMb2FkRXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbb25Mb2FkRXZlbnREYXRhLCBldmVudC5jb3JyZWxhdGlvbklkLCBldmVudC5ldmVudElkXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUV4cGFuZCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNMb2FkaW5nKSByZXR1cm47XG4gICAgd2FzRXhwYW5kZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgYXdhaXQgbG9hZEV2ZW50RGF0YSgpO1xuICB9LCBbaXNMb2FkaW5nLCBsb2FkRXZlbnREYXRhXSk7XG5cbiAgLy8gV2hlbiB0aGUgZW5jcnlwdGlvbiBrZXkgY2hhbmdlcyBhbmQgdGhpcyBldmVudCB3YXMgcHJldmlvdXNseSBleHBhbmRlZCxcbiAgLy8gcmUtbG9hZCB0aGUgZGF0YSBzbyBpdCBnZXRzIGRlY3J5cHRlZFxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5jcnlwdGlvbktleSB8fCAhd2FzRXhwYW5kZWRSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgIGxvYWRlZERhdGFSZWYuY3VycmVudCA9IG51bGw7XG4gICAgc2V0TG9hZGVkRGF0YShudWxsKTtcbiAgICB2b2lkIGxvYWRFdmVudERhdGEoeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSwgW2VuY3J5cHRpb25LZXksIGxvYWRFdmVudERhdGFdKTtcblxuICBjb25zdCBjcmVhdGVkQXQgPSBuZXcgRGF0ZShldmVudC5jcmVhdGVkQXQpO1xuICBjb25zdCBvY2N1cnJlZEF0ID0gcGFyc2VEYXRlVmFsdWUoZXZlbnQub2NjdXJyZWRBdCk7XG4gIGNvbnN0IGRpc3BsYXllZENyZWF0ZWRBdCA9IHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHNcbiAgICA/IGNyZWF0ZWRBdFxuICAgIDogZ2V0RWZmZWN0aXZlRXZlbnREYXRlKGV2ZW50KTtcbiAgY29uc3QgZGlzcGxheWVkQ3JlYXRlZEF0VGltZSA9IGRpc3BsYXllZENyZWF0ZWRBdC50b0xvY2FsZVRpbWVTdHJpbmcoXG4gICAgdW5kZWZpbmVkLFxuICAgIHtcbiAgICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICAgIG1pbnV0ZTogJ251bWVyaWMnLFxuICAgICAgc2Vjb25kOiAnbnVtZXJpYycsXG4gICAgfVxuICApO1xuXG4gIGNvbnN0IGRpc3BsYXlQYXlsb2FkID0gaXNMb2FkaW5nID8gbG9hZGVkRGF0YSA6IG1lcmdlZERpc3BsYXk7XG5cbiAgcmV0dXJuIChcbiAgICA8Q29sbGFwc2libGVSb290XG4gICAgICB2YXJpYW50PVwiY2FyZFwiXG4gICAgICBvbk9wZW5DaGFuZ2U9e1xuICAgICAgICBjYW5IYXZlRGF0YVxuICAgICAgICAgID8gKG9wZW4pID0+IHtcbiAgICAgICAgICAgICAgaWYgKG9wZW4pIGhhbmRsZUV4cGFuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICB9XG4gICAgPlxuICAgICAgPENvbGxhcHNpYmxlVHJpZ2dlciBjbGFzc05hbWU9XCJweC0zIHB5LTJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0zXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1ncmF5LTEwMDAgdGV4dC1sYWJlbC0xMiBmb250LW1vbm9cIj5cbiAgICAgICAgICAgIHtldmVudC5ldmVudFR5cGV9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInNocmluay0wIHRleHQtbGFiZWwtMTMgdGV4dC1ncmF5LTkwMFwiPlxuICAgICAgICAgICAge2Rpc3BsYXllZENyZWF0ZWRBdFRpbWV9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvQ29sbGFwc2libGVUcmlnZ2VyPlxuICAgICAgPENvbGxhcHNpYmxlQ29udGVudD5cbiAgICAgICAgey8qIEV2ZW50IGF0dHJpYnV0ZXMgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBiZy1iYWNrZ3JvdW5kLTIwMCBbJjpoYXMoK18qKV06Ym9yZGVyLWIgWyY6aGFzKCtfKildOmJvcmRlci1ncmF5LWFscGhhLTQwMFwiPlxuICAgICAgICAgIHtzaG93U2VwYXJhdGVFdmVudE9jY3VycmVuY2VUaW1lc3RhbXBzICYmIG9jY3VycmVkQXQgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTIgcHktMiBweC0zXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtbGFiZWwtMTIgdGV4dC1ncmF5LTkwMFwiPk9jY3VycmVkPC9zcGFuPlxuICAgICAgICAgICAgICA8VGltZXN0YW1wVG9vbHRpcCBkYXRlPXtvY2N1cnJlZEF0fT5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXgtdy1bNzAlXSB0cnVuY2F0ZSB0ZXh0LXJpZ2h0IHRleHQtbGFiZWwtMTIgZm9udC1tb25vXCI+XG4gICAgICAgICAgICAgICAgICB7Zm9ybWF0RXZlbnRUaW1lc3RhbXAob2NjdXJyZWRBdCl9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L1RpbWVzdGFtcFRvb2x0aXA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yIHB5LTIgcHgtM1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1sYWJlbC0xMiB0ZXh0LWdyYXktOTAwXCI+RXZlbnQgSUQ8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXgtdy1bNzAlXSB0cnVuY2F0ZSB0ZXh0LXJpZ2h0IHRleHQtbGFiZWwtMTIgZm9udC1tb25vXCI+XG4gICAgICAgICAgICAgIHtldmVudC5ldmVudElkfVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHtldmVudC5jb3JyZWxhdGlvbklkICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yIHB5LTIgcHgtM1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWxhYmVsLTEyIHRleHQtZ3JheS05MDBcIj5cbiAgICAgICAgICAgICAgICBDb3JyZWxhdGlvbiBJRFxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1heC13LVs3MCVdIHRydW5jYXRlIHRleHQtcmlnaHQgdGV4dC1sYWJlbC0xMiBmb250LW1vbm9cIj5cbiAgICAgICAgICAgICAgICB7ZXZlbnQuY29ycmVsYXRpb25JZH1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIExvYWRpbmcgc3RhdGUgKi99XG4gICAgICAgIHtpc0xvYWRpbmcgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC0zXCI+XG4gICAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwiaC00IHctWzM1JV1cIiAvPlxuICAgICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cIm10LTIgaC00IHctWzkwJV1cIiAvPlxuICAgICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cIm10LTIgaC00IHctWzc1JV1cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuXG4gICAgICAgIHsvKiBFcnJvciBzdGF0ZSAqL31cbiAgICAgICAge2xvYWRFcnJvciAmJiAoXG4gICAgICAgICAgPEVycm9yQ2FyZFxuICAgICAgICAgICAgdGl0bGU9XCJGYWlsZWQgdG8gbG9hZCBldmVudCBkYXRhXCJcbiAgICAgICAgICAgIGRldGFpbHM9e2xvYWRFcnJvcn1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIm10LTJcIlxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG5cbiAgICAgICAgey8qIEV2ZW50IGRhdGEgKi99XG4gICAgICAgIHtkaXNwbGF5UGF5bG9hZCAhPSBudWxsICYmIChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIlsmPmRpdl06Ym9yZGVyLW5vbmUgWyY+ZGl2XTpyb3VuZGVkLW5vbmVcIj5cbiAgICAgICAgICAgIDxFdmVudERhdGFCbG9jayBldmVudFR5cGU9e2V2ZW50LmV2ZW50VHlwZX0gZGF0YT17ZGlzcGxheVBheWxvYWR9IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L0NvbGxhcHNpYmxlQ29udGVudD5cbiAgICA8L0NvbGxhcHNpYmxlUm9vdD5cbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbiBldmVudERhdGEgb2JqZWN0IGhhcyBvbmx5IGV4cGlyZWQgbWFya2VyIHZhbHVlcyBpbiByZWYvcGF5bG9hZFxuICogZmllbGRzIGZvciB0aGlzIGV2ZW50IHR5cGUgKHNlZSB7QGxpbmsgZ2V0RXZlbnREYXRhUmVmRmllbGRzfSkuIE90aGVyIGtleXNcbiAqIChlLmcuIGByZXN1bWVBdGAsIGBzdGVwTmFtZWApIGFyZSBpZ25vcmVkLlxuICovXG5mdW5jdGlvbiBoYXNPbmx5RXhwaXJlZEZpZWxkcyhkYXRhOiB1bmtub3duLCBldmVudFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCByZWNvcmQgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCByZWZLZXlzID0gZ2V0RXZlbnREYXRhUmVmRmllbGRzKGV2ZW50VHlwZSk7XG4gIGNvbnN0IHByZXNlbnRLZXlzID0gcmVmS2V5cy5maWx0ZXIoKGspID0+IGsgaW4gcmVjb3JkKTtcbiAgcmV0dXJuIChcbiAgICBwcmVzZW50S2V5cy5sZW5ndGggPiAwICYmXG4gICAgcHJlc2VudEtleXMuZXZlcnkoKGspID0+IGlzRXhwaXJlZE1hcmtlcihyZWNvcmRba10pKVxuICApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgZXZlbnQgZGF0YSwgdXNpbmcgRXJyb3JTdGFja0Jsb2NrIGZvciBlcnJvciBldmVudHMgdGhhdCBjb250YWluIGFcbiAqIHN0cnVjdHVyZWQgZXJyb3IsIGFuZCBDb3B5YWJsZURhdGFCbG9jayBvdGhlcndpc2UuXG4gKi9cbmZ1bmN0aW9uIEV2ZW50RGF0YUJsb2NrKHtcbiAgZXZlbnRUeXBlLFxuICBkYXRhLFxufToge1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgZGF0YTogdW5rbm93bjtcbn0pIHtcbiAgLy8gRXhwaXJlZCBkYXRhIOKAlCBzaG93IGEgc2ltcGxlIG1lc3NhZ2UgaW5zdGVhZCBvZiB0aGUgcmF3IHN0dWIuXG4gIC8vIENoZWNrIGJvdGggdGhlIHRvcC1sZXZlbCBldmVudERhdGEgYW5kIG5lc3RlZCBzdWItZmllbGRzIChyZXN1bHQsIGlucHV0LCBldGMuKVxuICAvLyBzaW5jZSB0aGUgc2VydmVyIHN0dWJzIGVhY2ggcmVmIGZpZWxkIGluZGVwZW5kZW50bHkuXG4gIGlmIChpc0V4cGlyZWRNYXJrZXIoZGF0YSkgfHwgaGFzT25seUV4cGlyZWRGaWVsZHMoZGF0YSwgZXZlbnRUeXBlKSkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgcm91bmRlZC1tZCBib3JkZXIgcHgtMyBweS0yIHRleHQteHNcIlxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIGJvcmRlckNvbG9yOiAndmFyKC0tZHMtZ3JheS0zMDApJyxcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTEwMCknLFxuICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtZ3JheS03MDApJyxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj5EYXRhIGV4cGlyZWQ8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgaWYgKGhhc0VuY3J5cHRlZEZpZWxkcyh7IGV2ZW50VHlwZSwgZXZlbnREYXRhOiBkYXRhIH0pKSB7XG4gICAgcmV0dXJuIDxFbmNyeXB0ZWREYXRhQmxvY2sgLz47XG4gIH1cblxuICAvLyBBdHRyaWJ1dGUgY2hhbmdlcyDigJQgcmVuZGVyIHRoZSBjaGFuZ2VkIGtleXMgYW5kIHRoZSB3cml0ZXIgaW5zdGVhZCBvZlxuICAvLyB0aGUgcmF3IEpTT04gcGF5bG9hZC5cbiAgaWYgKGV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0Jykge1xuICAgIHJldHVybiA8QXR0clNldEV2ZW50QmxvY2sgZGF0YT17ZGF0YX0gLz47XG4gIH1cblxuICAvLyBGb3IgZXJyb3IgZXZlbnRzIChzdGVwX2ZhaWxlZCwgc3RlcF9yZXRyeWluZyksIHRoZSBldmVudERhdGEgaGFzIHRoZSBzaGFwZVxuICAvLyB7IGVycm9yOiBTdHJ1Y3R1cmVkRXJyb3IsIHN0YWNrPzogc3RyaW5nLCAuLi4gfS4gQ2hlY2sgYm90aCB0aGUgdG9wLWxldmVsXG4gIC8vIHZhbHVlIGFuZCB0aGUgbmVzdGVkIGBlcnJvcmAgZmllbGQgZm9yIGEgc3RhY2sgdHJhY2UuXG4gIGlmIChcbiAgICBFUlJPUl9FVkVOVF9UWVBFUy5oYXMoZXZlbnRUeXBlKSAmJlxuICAgIGRhdGEgIT0gbnVsbCAmJlxuICAgIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0J1xuICApIHtcbiAgICBjb25zdCByZWNvcmQgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgLy8gQ2hlY2sgdGhlIG5lc3RlZCBgZXJyb3JgIGZpZWxkIGZpcnN0ICh0aGUgU3RydWN0dXJlZEVycm9yKVxuICAgIGlmIChpc1N0cnVjdHVyZWRFcnJvcihyZWNvcmQuZXJyb3IpKSB7XG4gICAgICByZXR1cm4gPEVycm9yU3RhY2tCbG9jayB2YWx1ZT17cmVjb3JkLmVycm9yfSAvPjtcbiAgICB9XG5cbiAgICAvLyBTb21lIGVycm9yIGZvcm1hdHMgcHV0IHRoZSBtZXNzYWdlL3N0YWNrIGF0IHRoZSB0b3AgbGV2ZWwgb2YgZXZlbnREYXRhLlxuICAgIGlmIChpc1N0cnVjdHVyZWRFcnJvcihyZWNvcmQpKSB7XG4gICAgICByZXR1cm4gPEVycm9yU3RhY2tCbG9jayB2YWx1ZT17cmVjb3JkfSAvPjtcbiAgICB9XG4gIH1cblxuICAvLyBGb3Igbm9uLWVycm9yIGV2ZW50cyBvciBlcnJvcnMgd2l0aG91dCBhIHN0YWNrLCBmYWxsIGJhY2sgdG8gdGhlXG4gIC8vIGdlbmVyaWMgSlNPTiB2aWV3ZXIuXG4gIHJldHVybiA8Q29weWFibGVEYXRhQmxvY2sgZGF0YT17ZGF0YX0gLz47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNMaXN0KHtcbiAgZXZlbnRzLFxuICBpc0xvYWRpbmcgPSBmYWxzZSxcbiAgZXJyb3IsXG4gIG9uTG9hZEV2ZW50RGF0YSxcbiAgb25TdHJlYW1DbGljayxcbiAgb25SdW5DbGljayxcbiAgZW5jcnlwdGlvbktleSxcbiAgc2hvd1NlcGFyYXRlRXZlbnRPY2N1cnJlbmNlVGltZXN0YW1wcyA9IGZhbHNlLFxufToge1xuICBldmVudHM6IEV2ZW50W107XG4gIGlzTG9hZGluZz86IGJvb2xlYW47XG4gIGVycm9yPzogRXJyb3IgfCBudWxsO1xuICBvbkxvYWRFdmVudERhdGE/OiAoXG4gICAgY29ycmVsYXRpb25JZDogc3RyaW5nLFxuICAgIGV2ZW50SWQ6IHN0cmluZ1xuICApID0+IFByb21pc2U8dW5rbm93biB8IG51bGw+O1xuICBvblN0cmVhbUNsaWNrPzogKHN0cmVhbUlkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uUnVuQ2xpY2s/OiAocnVuSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIHNpZ25hbHMgdGhhdCBkZWNyeXB0aW9uIGlzIGFjdGl2ZSAodHJpZ2dlcnMgcmUtbG9hZCBvZiBleHBhbmRlZCBldmVudHMpICovXG4gIGVuY3J5cHRpb25LZXk/OiBVaW50OEFycmF5O1xuICAvKiogU2hvdyBvY2N1cnJlZEF0IHNlcGFyYXRlbHkgaW5zdGVhZCBvZiBmb2xkaW5nIGl0IGludG8gdGhlIENyZWF0ZWQgdGltZXN0YW1wLiAqL1xuICBzaG93U2VwYXJhdGVFdmVudE9jY3VycmVuY2VUaW1lc3RhbXBzPzogYm9vbGVhbjtcbn0pIHtcbiAgLy8gU29ydCBieSB0aGUgdGltZXN0YW1wIHNob3duIGFzIENyZWF0ZWQgYnkgZGVmYXVsdC5cbiAgY29uc3Qgc29ydGVkRXZlbnRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgWy4uLmV2ZW50c10uc29ydChcbiAgICAgICAgKGEsIGIpID0+XG4gICAgICAgICAgZ2V0RWZmZWN0aXZlRXZlbnREYXRlKGEpLmdldFRpbWUoKSAtXG4gICAgICAgICAgZ2V0RWZmZWN0aXZlRXZlbnREYXRlKGIpLmdldFRpbWUoKVxuICAgICAgKSxcbiAgICBbZXZlbnRzXVxuICApO1xuXG4gIGNvbnN0IGhhc0V2ZW50cyA9IHNvcnRlZEV2ZW50cy5sZW5ndGggPiAwICYmICFlcnJvcjtcblxuICBpZiAoIWhhc0V2ZW50cyAmJiAhaXNMb2FkaW5nKSB7XG4gICAgcmV0dXJuIDxDb2xsYXBzaWJsZSBsYWJlbD1cIkV2ZW50c1wiIGRpc2FibGVkIC8+O1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8UnVuQ2xpY2tDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtvblJ1bkNsaWNrfT5cbiAgICAgIDxTdHJlYW1DbGlja0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e29uU3RyZWFtQ2xpY2t9PlxuICAgICAgICA8Q29sbGFwc2libGVSb290IGRlZmF1bHRPcGVuPlxuICAgICAgICAgIDxDb2xsYXBzaWJsZVRyaWdnZXI+RXZlbnRzPC9Db2xsYXBzaWJsZVRyaWdnZXI+XG4gICAgICAgICAgPENvbGxhcHNpYmxlQ29udGVudCBjbGFzc05hbWU9XCJtYi0wXCI+XG4gICAgICAgICAgICB7aXNMb2FkaW5nID8gKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgLW14LTRcIj5cbiAgICAgICAgICAgICAgICB7WzAsIDEsIDJdLm1hcCgoaSkgPT4gKFxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBrZXk9e2l9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtMyBiZy1iYWNrZ3JvdW5kLTIwMCBweC00IHB5LTJcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwiaC00IHctMzIgcm91bmRlZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxTa2VsZXRvbiBjbGFzc05hbWU9XCJoLTMgdy0xNiByb3VuZGVkXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCAtbXgtNFwiPlxuICAgICAgICAgICAgICAgIHtzb3J0ZWRFdmVudHMubWFwKChldmVudCkgPT4gKFxuICAgICAgICAgICAgICAgICAgPEV2ZW50SXRlbVxuICAgICAgICAgICAgICAgICAgICBrZXk9e2V2ZW50LmV2ZW50SWR9XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50PXtldmVudH1cbiAgICAgICAgICAgICAgICAgICAgb25Mb2FkRXZlbnREYXRhPXtvbkxvYWRFdmVudERhdGF9XG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXk9e2VuY3J5cHRpb25LZXl9XG4gICAgICAgICAgICAgICAgICAgIHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHM9e1xuICAgICAgICAgICAgICAgICAgICAgIHNob3dTZXBhcmF0ZUV2ZW50T2NjdXJyZW5jZVRpbWVzdGFtcHNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvQ29sbGFwc2libGVDb250ZW50PlxuICAgICAgICA8L0NvbGxhcHNpYmxlUm9vdD5cbiAgICAgIDwvU3RyZWFtQ2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvUnVuQ2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufVxuIl19
@@ -1,8 +1,8 @@
1
1
  import { type MutableRefObject } from 'react';
2
2
  import type { VisibleSpan } from '../types';
3
- export declare const MiniMap: import("react").NamedExoticComponent<{
3
+ export declare const MiniMap: import("react").MemoExoticComponent<({ timelineRef, rows, scale, }: {
4
4
  timelineRef: MutableRefObject<HTMLDivElement | null>;
5
5
  rows: VisibleSpan[][];
6
6
  scale: number;
7
- }>;
7
+ }) => import("react/jsx-runtime").JSX.Element>;
8
8
  //# sourceMappingURL=map.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/map.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EAMtB,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA4B5C,eAAO,MAAM,OAAO;iBAKL,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC;UAC9C,WAAW,EAAE,EAAE;WACd,MAAM;EAoLb,CAAC"}
1
+ {"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/map.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EAMtB,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA4B5C,eAAO,MAAM,OAAO,sEAIjB;IACD,WAAW,EAAE,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACrD,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf,6CAmLC,CAAC"}
@@ -1,7 +1,7 @@
1
- import type { MutableRefObject } from 'react';
1
+ import type { MutableRefObject, ReactNode } from 'react';
2
2
  import type { MemoCache, MemoCacheKey, RootNode, ScrollSnapshot, SpanNode, VisibleSpan, VisibleSpanEvent } from '../types';
3
3
  export declare const getSpanColorClassName: (node: SpanNode) => string;
4
- export declare const SpanNodes: import("react").NamedExoticComponent<{
4
+ export declare const SpanNodes: import("react").MemoExoticComponent<({ root, scale, spans, isLive, scrollSnapshotRef, cache, customSpanClassNameFunc, customSpanEventClassNameFunc, }: {
5
5
  root: RootNode;
6
6
  scale: number;
7
7
  spans: VisibleSpan[];
@@ -12,8 +12,8 @@ export declare const SpanNodes: import("react").NamedExoticComponent<{
12
12
  cache: MemoCache;
13
13
  customSpanClassNameFunc?: (span: SpanNode) => string;
14
14
  customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;
15
- }>;
16
- export declare const SpanComponent: import("react").NamedExoticComponent<{
15
+ }) => import("react/jsx-runtime").JSX.Element[]>;
16
+ export declare const SpanComponent: import("react").MemoExoticComponent<({ node, root, scale, traceIsLive, scrollSnapshotRef, customSpanClassNameFunc, customSpanEventClassNameFunc, }: {
17
17
  node: VisibleSpan;
18
18
  root: RootNode;
19
19
  scale: number;
@@ -23,13 +23,13 @@ export declare const SpanComponent: import("react").NamedExoticComponent<{
23
23
  cacheKey?: MemoCacheKey;
24
24
  customSpanClassNameFunc?: (span: SpanNode) => string;
25
25
  customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;
26
- }>;
27
- export declare const SpanEventComponent: import("react").NamedExoticComponent<{
26
+ }) => ReactNode>;
27
+ export declare const SpanEventComponent: import("react").MemoExoticComponent<({ event, node, root, scale, customSpanEventClassNameFunc, asBoundary, }: {
28
28
  event: VisibleSpanEvent;
29
29
  node: VisibleSpan;
30
30
  root: RootNode;
31
31
  scale: number;
32
32
  customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;
33
33
  asBoundary?: boolean;
34
- }>;
34
+ }) => ReactNode>;
35
35
  //# sourceMappingURL=node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/node.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,gBAAgB,EAAa,MAAM,OAAO,CAAC;AAGxE,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,WAAW,EACX,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAYlB,eAAO,MAAM,qBAAqB,GAAI,MAAM,QAAQ,KAAG,MAGtD,CAAC;AAoDF,eAAO,MAAM,SAAS;UAUd,QAAQ;WACP,MAAM;WACN,WAAW,EAAE;aACX,OAAO;uBACG,gBAAgB,CAAC,cAAc,GAAG,SAAS,CAAC;IAC/D,kGAAkG;eACvF,YAAY;WAChB,SAAS;8BACU,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM;mCACrB,CAAC,KAAK,EAAE,gBAAgB,KAAK,MAAM;EAelE,CAAC;AAuCH,eAAO,MAAM,aAAa;UASlB,WAAW;UACX,QAAQ;WACP,MAAM;kBACC,OAAO;uBACF,gBAAgB,CAAC,cAAc,GAAG,SAAS,CAAC;IAC/D,6EAA6E;eAClE,YAAY;8BACG,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM;mCACrB,CAAC,KAAK,EAAE,gBAAgB,KAAK,MAAM;EA6KlE,CAAC;AAuBH,eAAO,MAAM,kBAAkB;WAQtB,gBAAgB;UACjB,WAAW;UACX,QAAQ;WACP,MAAM;mCACkB,CAAC,KAAK,EAAE,gBAAgB,KAAK,MAAM;iBACrD,OAAO;EA6HpB,CAAC"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/node.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,gBAAgB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGxE,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,WAAW,EACX,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAYlB,eAAO,MAAM,qBAAqB,GAAI,MAAM,QAAQ,KAAG,MAGtD,CAAC;AAoDF,eAAO,MAAM,SAAS,yJASnB;IACD,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,gBAAgB,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAChE,kGAAkG;IAClG,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,KAAK,EAAE,SAAS,CAAC;IACjB,uBAAuB,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,CAAC;IACrD,4BAA4B,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,MAAM,CAAC;CACpE,+CAcC,CAAC;AAuCH,eAAO,MAAM,aAAa,sJAQvB;IACD,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,gBAAgB,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAChE,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,uBAAuB,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,CAAC;IACrD,4BAA4B,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,MAAM,CAAC;CACpE,KAAG,SAAS,CA4KX,CAAC;AAuBH,eAAO,MAAM,kBAAkB,gHAO5B;IACD,KAAK,EAAE,gBAAgB,CAAC;IACxB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,MAAM,CAAC;IACnE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,KAAG,SAAS,CA4HX,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { type ReactNode } from 'react';
2
+ type CollapsibleVariant = 'section' | 'card';
3
+ type CollapsibleRootProps = {
4
+ children: ReactNode;
5
+ variant?: CollapsibleVariant;
6
+ disabled?: boolean;
7
+ defaultOpen?: boolean;
8
+ onOpenChange?: (open: boolean) => void;
9
+ className?: string;
10
+ };
11
+ /**
12
+ * Low-level collapsible container. Use this together with `CollapsibleTrigger`
13
+ * and `CollapsibleContent` when you need to override the styling of individual
14
+ * parts. For the common case, prefer the all-in-one `Collapsible`.
15
+ */
16
+ export declare function CollapsibleRoot({ children, variant, disabled, defaultOpen, onOpenChange, className, }: CollapsibleRootProps): import("react/jsx-runtime").JSX.Element;
17
+ type CollapsibleTriggerProps = {
18
+ children: ReactNode;
19
+ className?: string;
20
+ };
21
+ /** The clickable header of a `CollapsibleRoot`. */
22
+ export declare function CollapsibleTrigger({ children, className, }: CollapsibleTriggerProps): import("react/jsx-runtime").JSX.Element;
23
+ type CollapsibleContentProps = {
24
+ children: ReactNode;
25
+ className?: string;
26
+ };
27
+ /** The collapsible body of a `CollapsibleRoot`. */
28
+ export declare function CollapsibleContent({ children, className, }: CollapsibleContentProps): import("react/jsx-runtime").JSX.Element;
29
+ type CollapsibleProps = {
30
+ /** Header content shown in the trigger row. */
31
+ label: ReactNode;
32
+ /** Body content. Omit for a header-only (e.g. disabled or skeleton) row. */
33
+ children?: ReactNode;
34
+ disabled?: boolean;
35
+ defaultOpen?: boolean;
36
+ onOpenChange?: (open: boolean) => void;
37
+ };
38
+ /**
39
+ * All-in-one collapsible section: a labeled header plus body content. This is
40
+ * the component to reach for in most cases. When you need to override the
41
+ * styling of a specific part, compose `CollapsibleRoot`, `CollapsibleTrigger`,
42
+ * and `CollapsibleContent` directly instead.
43
+ */
44
+ export declare function Collapsible({ label, children, disabled, defaultOpen, onOpenChange, }: CollapsibleProps): import("react/jsx-runtime").JSX.Element;
45
+ export {};
46
+ //# sourceMappingURL=collapsible.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collapsible.d.ts","sourceRoot":"","sources":["../../../src/components/ui/collapsible.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,SAAS,EAIf,MAAM,OAAO,CAAC;AAGf,KAAK,kBAAkB,GAAG,SAAS,GAAG,MAAM,CAAC;AAmB7C,KAAK,oBAAoB,GAAG;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,OAAmB,EACnB,QAAgB,EAChB,WAAmB,EACnB,YAAY,EACZ,SAAS,GACV,EAAE,oBAAoB,2CAyCtB;AAED,KAAK,uBAAuB,GAAG;IAC7B,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,mDAAmD;AACnD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,SAAS,GACV,EAAE,uBAAuB,2CA0DzB;AAED,KAAK,uBAAuB,GAAG;IAC7B,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,mDAAmD;AACnD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,SAAS,GACV,EAAE,uBAAuB,2CAUzB;AAED,KAAK,gBAAgB,GAAG;IACtB,+CAA+C;IAC/C,KAAK,EAAE,SAAS,CAAC;IACjB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,YAAY,GACb,EAAE,gBAAgB,2CAWlB"}