@cubenest/rrweb-core 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/NOTICE +15 -0
  2. package/README.md +26 -0
  3. package/dist/compat/index.d.ts +37 -0
  4. package/dist/compat/index.d.ts.map +1 -0
  5. package/dist/compat/index.js +97 -0
  6. package/dist/compat/index.js.map +1 -0
  7. package/dist/compression/index.d.ts +24 -0
  8. package/dist/compression/index.d.ts.map +1 -0
  9. package/dist/compression/index.js +61 -0
  10. package/dist/compression/index.js.map +1 -0
  11. package/dist/console/buffer.d.ts +99 -0
  12. package/dist/console/buffer.d.ts.map +1 -0
  13. package/dist/console/buffer.js +169 -0
  14. package/dist/console/buffer.js.map +1 -0
  15. package/dist/console/index.d.ts +3 -0
  16. package/dist/console/index.d.ts.map +1 -0
  17. package/dist/console/index.js +16 -0
  18. package/dist/console/index.js.map +1 -0
  19. package/dist/console/types.d.ts +61 -0
  20. package/dist/console/types.d.ts.map +1 -0
  21. package/dist/console/types.js +11 -0
  22. package/dist/console/types.js.map +1 -0
  23. package/dist/index.d.ts +17 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +18 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/masking/body.d.ts +30 -0
  28. package/dist/masking/body.d.ts.map +1 -0
  29. package/dist/masking/body.js +33 -0
  30. package/dist/masking/body.js.map +1 -0
  31. package/dist/masking/headers.d.ts +16 -0
  32. package/dist/masking/headers.d.ts.map +1 -0
  33. package/dist/masking/headers.js +46 -0
  34. package/dist/masking/headers.js.map +1 -0
  35. package/dist/masking/index.d.ts +8 -0
  36. package/dist/masking/index.d.ts.map +1 -0
  37. package/dist/masking/index.js +11 -0
  38. package/dist/masking/index.js.map +1 -0
  39. package/dist/masking/inputs.d.ts +15 -0
  40. package/dist/masking/inputs.d.ts.map +1 -0
  41. package/dist/masking/inputs.js +36 -0
  42. package/dist/masking/inputs.js.map +1 -0
  43. package/dist/masking/regex.d.ts +96 -0
  44. package/dist/masking/regex.d.ts.map +1 -0
  45. package/dist/masking/regex.js +182 -0
  46. package/dist/masking/regex.js.map +1 -0
  47. package/dist/masking/selectors.d.ts +67 -0
  48. package/dist/masking/selectors.d.ts.map +1 -0
  49. package/dist/masking/selectors.js +137 -0
  50. package/dist/masking/selectors.js.map +1 -0
  51. package/dist/masking/text.d.ts +9 -0
  52. package/dist/masking/text.d.ts.map +1 -0
  53. package/dist/masking/text.js +15 -0
  54. package/dist/masking/text.js.map +1 -0
  55. package/dist/network/cdp.d.ts +54 -0
  56. package/dist/network/cdp.d.ts.map +1 -0
  57. package/dist/network/cdp.js +282 -0
  58. package/dist/network/cdp.js.map +1 -0
  59. package/dist/network/index.d.ts +4 -0
  60. package/dist/network/index.d.ts.map +1 -0
  61. package/dist/network/index.js +14 -0
  62. package/dist/network/index.js.map +1 -0
  63. package/dist/network/types.d.ts +133 -0
  64. package/dist/network/types.d.ts.map +1 -0
  65. package/dist/network/types.js +35 -0
  66. package/dist/network/types.js.map +1 -0
  67. package/dist/network/web-request.d.ts +76 -0
  68. package/dist/network/web-request.d.ts.map +1 -0
  69. package/dist/network/web-request.js +294 -0
  70. package/dist/network/web-request.js.map +1 -0
  71. package/dist/persistence/index.d.ts +3 -0
  72. package/dist/persistence/index.d.ts.map +1 -0
  73. package/dist/persistence/index.js +11 -0
  74. package/dist/persistence/index.js.map +1 -0
  75. package/dist/persistence/store.d.ts +18 -0
  76. package/dist/persistence/store.d.ts.map +1 -0
  77. package/dist/persistence/store.js +327 -0
  78. package/dist/persistence/store.js.map +1 -0
  79. package/dist/persistence/types.d.ts +76 -0
  80. package/dist/persistence/types.d.ts.map +1 -0
  81. package/dist/persistence/types.js +21 -0
  82. package/dist/persistence/types.js.map +1 -0
  83. package/dist/rrweb.d.ts +5 -0
  84. package/dist/rrweb.d.ts.map +1 -0
  85. package/dist/rrweb.js +13 -0
  86. package/dist/rrweb.js.map +1 -0
  87. package/dist/screenshot/base64.d.ts +8 -0
  88. package/dist/screenshot/base64.d.ts.map +1 -0
  89. package/dist/screenshot/base64.js +21 -0
  90. package/dist/screenshot/base64.js.map +1 -0
  91. package/dist/screenshot/cdp.d.ts +50 -0
  92. package/dist/screenshot/cdp.d.ts.map +1 -0
  93. package/dist/screenshot/cdp.js +65 -0
  94. package/dist/screenshot/cdp.js.map +1 -0
  95. package/dist/screenshot/index.d.ts +4 -0
  96. package/dist/screenshot/index.d.ts.map +1 -0
  97. package/dist/screenshot/index.js +10 -0
  98. package/dist/screenshot/index.js.map +1 -0
  99. package/dist/screenshot/tabs.d.ts +44 -0
  100. package/dist/screenshot/tabs.d.ts.map +1 -0
  101. package/dist/screenshot/tabs.js +63 -0
  102. package/dist/screenshot/tabs.js.map +1 -0
  103. package/dist/screenshot/types.d.ts +27 -0
  104. package/dist/screenshot/types.d.ts.map +1 -0
  105. package/dist/screenshot/types.js +18 -0
  106. package/dist/screenshot/types.js.map +1 -0
  107. package/dist/shadow-dom/index.d.ts +3 -0
  108. package/dist/shadow-dom/index.d.ts.map +1 -0
  109. package/dist/shadow-dom/index.js +8 -0
  110. package/dist/shadow-dom/index.js.map +1 -0
  111. package/dist/shadow-dom/traverse.d.ts +54 -0
  112. package/dist/shadow-dom/traverse.d.ts.map +1 -0
  113. package/dist/shadow-dom/traverse.js +209 -0
  114. package/dist/shadow-dom/traverse.js.map +1 -0
  115. package/dist/shadow-dom/types.d.ts +43 -0
  116. package/dist/shadow-dom/types.d.ts.map +1 -0
  117. package/dist/shadow-dom/types.js +25 -0
  118. package/dist/shadow-dom/types.js.map +1 -0
  119. package/dist/throttling/apply.d.ts +59 -0
  120. package/dist/throttling/apply.d.ts.map +1 -0
  121. package/dist/throttling/apply.js +101 -0
  122. package/dist/throttling/apply.js.map +1 -0
  123. package/dist/throttling/defaults.d.ts +60 -0
  124. package/dist/throttling/defaults.d.ts.map +1 -0
  125. package/dist/throttling/defaults.js +81 -0
  126. package/dist/throttling/defaults.js.map +1 -0
  127. package/dist/throttling/guards.d.ts +69 -0
  128. package/dist/throttling/guards.d.ts.map +1 -0
  129. package/dist/throttling/guards.js +212 -0
  130. package/dist/throttling/guards.js.map +1 -0
  131. package/dist/throttling/index.d.ts +5 -0
  132. package/dist/throttling/index.d.ts.map +1 -0
  133. package/dist/throttling/index.js +11 -0
  134. package/dist/throttling/index.js.map +1 -0
  135. package/package.json +35 -0
@@ -0,0 +1,294 @@
1
+ // chrome.webRequest network adapter — Task 1.7.
2
+ //
3
+ // Subscribes to the chrome.webRequest event family from the extension
4
+ // service worker. P2/peek owns the listener; we accept the event source as
5
+ // a parameter rather than reading `chrome.webRequest` off a global so the
6
+ // substrate stays environment-agnostic.
7
+ //
8
+ // chrome.webRequest reports an HTTP exchange across multiple events:
9
+ //
10
+ // - onBeforeRequest — request URL + method + body (limited)
11
+ // - onSendHeaders — final request headers (after browser merging)
12
+ // - onHeadersReceived — response headers, status
13
+ // - onCompleted — terminal success: cache hint + size + final ts
14
+ // - onErrorOccurred — terminal failure: error string
15
+ //
16
+ // We correlate by `requestId` (chrome.webRequest's own monotonic id, scoped
17
+ // to a profile). Bodies are NOT accessible via chrome.webRequest in MV3 —
18
+ // the `requestBody` field is only populated by `onBeforeRequest` and only
19
+ // for form-encoded payloads, but our adapter doesn't depend on it: we
20
+ // surface what the transport gives us, and `responseBody` is always
21
+ // undefined here.
22
+ import { redactBody, redactNetworkHeaders } from '../masking';
23
+ // ────────────────────────────────────────────────────────────────────────────
24
+ // chrome.webRequest payload narrowing
25
+ // ────────────────────────────────────────────────────────────────────────────
26
+ function readNumber(value) {
27
+ return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
28
+ }
29
+ function readString(value) {
30
+ return typeof value === 'string' ? value : undefined;
31
+ }
32
+ /**
33
+ * chrome.webRequest serializes headers as `{ name, value }[]` (preserving
34
+ * insertion order). We collapse to a plain record — the masking module
35
+ * already handles case-insensitive matching, so the lossy collapse is
36
+ * cheap and matches the CDP path's shape.
37
+ */
38
+ function readHeaderArray(value) {
39
+ if (!Array.isArray(value))
40
+ return {};
41
+ const out = {};
42
+ for (const item of value) {
43
+ if (item === null || typeof item !== 'object')
44
+ continue;
45
+ const entry = item;
46
+ const name = readString(entry.name);
47
+ if (name === undefined)
48
+ continue;
49
+ // chrome.webRequest may expose `binaryValue` for non-UTF-8 headers; we
50
+ // ignore those (they're rare in practice — bodies/cookies aside).
51
+ const headerValue = readString(entry.value);
52
+ if (headerValue !== undefined)
53
+ out[name] = headerValue;
54
+ }
55
+ return out;
56
+ }
57
+ /**
58
+ * chrome.webRequest's `requestBody` field shape on `onBeforeRequest`:
59
+ * { formData?: Record<string, string[]>, raw?: { bytes: ArrayBuffer }[] }
60
+ *
61
+ * `formData` is the only field that's safely textual. We serialize it to a
62
+ * stable querystring-like representation so the redactor has something to
63
+ * scan; `raw` is left alone (binary).
64
+ */
65
+ function readRequestBody(value) {
66
+ if (value === null || typeof value !== 'object')
67
+ return undefined;
68
+ const formData = value.formData;
69
+ if (formData === null || typeof formData !== 'object')
70
+ return undefined;
71
+ const parts = [];
72
+ for (const [key, values] of Object.entries(formData)) {
73
+ if (!Array.isArray(values))
74
+ continue;
75
+ for (const v of values) {
76
+ if (typeof v === 'string')
77
+ parts.push(`${key}=${v}`);
78
+ }
79
+ }
80
+ return parts.length > 0 ? parts.join('&') : undefined;
81
+ }
82
+ /**
83
+ * Build a `NetworkCaptureAdapter` that consumes chrome.webRequest events.
84
+ *
85
+ * The adapter installs five listeners on `source`, all gated by
86
+ * `options.filter` (defaulting to `{ urls: ['<all_urls>'] }`). On
87
+ * `dispose()` every listener is removed and the in-flight map is cleared.
88
+ *
89
+ * @param source A `WebRequestEventSource` — typically the global
90
+ * `chrome.webRequest` itself.
91
+ * @param options `{ filter?, maxBodyBytes?, extraInfoSpec? }`.
92
+ */
93
+ export function createWebRequestNetworkAdapter(source, options = {}) {
94
+ const filter = options.filter ?? { urls: ['<all_urls>'] };
95
+ const maxBodyBytes = options.maxBodyBytes ?? 1024 * 1024;
96
+ const extraInfo = options.extraInfoSpec ?? {};
97
+ const onBeforeRequestExtra = extraInfo.onBeforeRequest ?? ['requestBody'];
98
+ const onSendHeadersExtra = extraInfo.onSendHeaders ?? ['requestHeaders'];
99
+ const onHeadersReceivedExtra = extraInfo.onHeadersReceived ?? ['responseHeaders'];
100
+ const inFlight = new Map();
101
+ const requestHandlers = new Set();
102
+ const responseHandlers = new Set();
103
+ const errorHandlers = new Set();
104
+ const emitRequest = (req) => {
105
+ for (const h of requestHandlers)
106
+ h(req);
107
+ };
108
+ const emitResponse = (res) => {
109
+ for (const h of responseHandlers)
110
+ h(res);
111
+ };
112
+ const emitError = (err) => {
113
+ for (const h of errorHandlers)
114
+ h(err);
115
+ };
116
+ // ──────────────────────────────────────────────────────────────────────
117
+ // onBeforeRequest — emit CapturedRequest with whatever we know now.
118
+ //
119
+ // chrome.webRequest's `timeStamp` is already in ms epoch.
120
+ // ──────────────────────────────────────────────────────────────────────
121
+ // biome-ignore lint/suspicious/noExplicitAny: webRequest's per-event payload is documented separately.
122
+ const beforeRequestListener = (details) => {
123
+ if (details === null || typeof details !== 'object')
124
+ return;
125
+ const requestId = readString(details.requestId);
126
+ if (requestId === undefined)
127
+ return;
128
+ const startTs = readNumber(details.timeStamp) ?? Date.now();
129
+ const requestBodyRaw = readRequestBody(details.requestBody);
130
+ const requestBody = requestBodyRaw !== undefined
131
+ ? redactBody(requestBodyRaw, { maxLengthBytes: maxBodyBytes })
132
+ : undefined;
133
+ const captured = {
134
+ id: requestId,
135
+ ts: startTs,
136
+ url: readString(details.url) ?? '',
137
+ method: readString(details.method) ?? 'GET',
138
+ // onBeforeRequest doesn't carry headers — they arrive on onSendHeaders.
139
+ // We start with an empty record; onSendHeaders upgrades the entry.
140
+ headers: {},
141
+ ...(requestBody !== undefined ? { requestBody } : {}),
142
+ ...(readString(details.type) !== undefined
143
+ ? { resourceType: readString(details.type) }
144
+ : {}),
145
+ };
146
+ inFlight.set(requestId, {
147
+ startTs,
148
+ request: captured,
149
+ headersUpgraded: false,
150
+ });
151
+ emitRequest(captured);
152
+ };
153
+ source.onBeforeRequest.addListener(beforeRequestListener, filter, onBeforeRequestExtra);
154
+ // ──────────────────────────────────────────────────────────────────────
155
+ // onSendHeaders — final request headers. We mutate the in-flight record
156
+ // so a later request-emission won't lose them; we DO NOT re-emit the
157
+ // request (consumers expect one onRequest event per exchange).
158
+ // ──────────────────────────────────────────────────────────────────────
159
+ // biome-ignore lint/suspicious/noExplicitAny: webRequest's per-event payload is documented separately.
160
+ const sendHeadersListener = (details) => {
161
+ if (details === null || typeof details !== 'object')
162
+ return;
163
+ const requestId = readString(details.requestId);
164
+ if (requestId === undefined)
165
+ return;
166
+ const entry = inFlight.get(requestId);
167
+ if (entry === undefined)
168
+ return;
169
+ const headers = redactNetworkHeaders(readHeaderArray(details.requestHeaders));
170
+ entry.request = { ...entry.request, headers };
171
+ entry.headersUpgraded = true;
172
+ };
173
+ source.onSendHeaders.addListener(sendHeadersListener, filter, onSendHeadersExtra);
174
+ // ──────────────────────────────────────────────────────────────────────
175
+ // onHeadersReceived — record response status + headers; defer emission
176
+ // until onCompleted (matches the CDP path, which also defers).
177
+ // ──────────────────────────────────────────────────────────────────────
178
+ // biome-ignore lint/suspicious/noExplicitAny: webRequest's per-event payload is documented separately.
179
+ const headersReceivedListener = (details) => {
180
+ if (details === null || typeof details !== 'object')
181
+ return;
182
+ const requestId = readString(details.requestId);
183
+ if (requestId === undefined)
184
+ return;
185
+ const entry = inFlight.get(requestId);
186
+ if (entry === undefined)
187
+ return;
188
+ const headers = redactNetworkHeaders(readHeaderArray(details.responseHeaders));
189
+ entry.pendingResponse = {
190
+ status: readNumber(details.statusCode) ?? 0,
191
+ ...(readString(details.statusLine) !== undefined
192
+ ? { statusText: readString(details.statusLine) }
193
+ : {}),
194
+ headers,
195
+ };
196
+ };
197
+ source.onHeadersReceived.addListener(headersReceivedListener, filter, onHeadersReceivedExtra);
198
+ // ──────────────────────────────────────────────────────────────────────
199
+ // onCompleted — terminal success. Emit CapturedResponse.
200
+ // ──────────────────────────────────────────────────────────────────────
201
+ // biome-ignore lint/suspicious/noExplicitAny: webRequest's per-event payload is documented separately.
202
+ const completedListener = (details) => {
203
+ if (details === null || typeof details !== 'object')
204
+ return;
205
+ const requestId = readString(details.requestId);
206
+ if (requestId === undefined)
207
+ return;
208
+ const entry = inFlight.get(requestId);
209
+ if (entry === undefined)
210
+ return;
211
+ const ts = readNumber(details.timeStamp) ?? Date.now();
212
+ const durationMs = Math.max(0, ts - entry.startTs);
213
+ const encodedSize = readNumber(details.responseSize);
214
+ const fromCache = details.fromCache === true;
215
+ const pending = entry.pendingResponse ?? {
216
+ status: readNumber(details.statusCode) ?? 0,
217
+ headers: {},
218
+ };
219
+ const captured = {
220
+ id: requestId,
221
+ ts,
222
+ status: pending.status,
223
+ ...(pending.statusText !== undefined ? { statusText: pending.statusText } : {}),
224
+ headers: pending.headers,
225
+ fromCache,
226
+ ...(encodedSize !== undefined ? { encodedSize } : {}),
227
+ durationMs,
228
+ };
229
+ inFlight.delete(requestId);
230
+ emitResponse(captured);
231
+ };
232
+ source.onCompleted.addListener(completedListener, filter);
233
+ // ──────────────────────────────────────────────────────────────────────
234
+ // onErrorOccurred — terminal failure. Emit CapturedResponse with
235
+ // errorText AND a parallel onError event.
236
+ // ──────────────────────────────────────────────────────────────────────
237
+ // biome-ignore lint/suspicious/noExplicitAny: webRequest's per-event payload is documented separately.
238
+ const errorOccurredListener = (details) => {
239
+ if (details === null || typeof details !== 'object')
240
+ return;
241
+ const requestId = readString(details.requestId);
242
+ if (requestId === undefined)
243
+ return;
244
+ const entry = inFlight.get(requestId);
245
+ const ts = readNumber(details.timeStamp) ?? Date.now();
246
+ const errorText = readString(details.error) ?? 'unknown';
247
+ const durationMs = entry !== undefined ? Math.max(0, ts - entry.startTs) : undefined;
248
+ const fromCache = details.fromCache === true;
249
+ const pending = entry?.pendingResponse ?? { status: 0, headers: {} };
250
+ const captured = {
251
+ id: requestId,
252
+ ts,
253
+ status: pending.status,
254
+ ...(pending.statusText !== undefined ? { statusText: pending.statusText } : {}),
255
+ headers: pending.headers,
256
+ fromCache,
257
+ ...(durationMs !== undefined ? { durationMs } : {}),
258
+ errorText,
259
+ };
260
+ inFlight.delete(requestId);
261
+ emitResponse(captured);
262
+ emitError({ id: requestId, ts, errorText });
263
+ };
264
+ source.onErrorOccurred.addListener(errorOccurredListener, filter);
265
+ // ──────────────────────────────────────────────────────────────────────
266
+ // Adapter surface
267
+ // ──────────────────────────────────────────────────────────────────────
268
+ return {
269
+ onRequest(handler) {
270
+ requestHandlers.add(handler);
271
+ return () => requestHandlers.delete(handler);
272
+ },
273
+ onResponse(handler) {
274
+ responseHandlers.add(handler);
275
+ return () => responseHandlers.delete(handler);
276
+ },
277
+ onError(handler) {
278
+ errorHandlers.add(handler);
279
+ return () => errorHandlers.delete(handler);
280
+ },
281
+ async dispose() {
282
+ source.onBeforeRequest.removeListener(beforeRequestListener);
283
+ source.onSendHeaders.removeListener(sendHeadersListener);
284
+ source.onHeadersReceived.removeListener(headersReceivedListener);
285
+ source.onCompleted.removeListener(completedListener);
286
+ source.onErrorOccurred.removeListener(errorOccurredListener);
287
+ requestHandlers.clear();
288
+ responseHandlers.clear();
289
+ errorHandlers.clear();
290
+ inFlight.clear();
291
+ },
292
+ };
293
+ }
294
+ //# sourceMappingURL=web-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-request.js","sourceRoot":"","sources":["../../src/network/web-request.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { createSessionStore } from './store';
2
+ export type { SessionChunk, SessionStore, SessionStoreOptions } from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/persistence/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,11 @@
1
+ // Public barrel for the IndexedDB persistence module.
2
+ //
3
+ // Locked surface per IMPLEMENTATION_PLAN.md Public API contract (line 726):
4
+ //
5
+ // export { createSessionStore, type SessionChunk } from './persistence';
6
+ //
7
+ // The factory + companion `SessionStore` / `SessionStoreOptions` types
8
+ // are re-exported so consumers can declare-and-pass without reaching
9
+ // into `./store` directly.
10
+ export { createSessionStore } from './store';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/persistence/index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,4EAA4E;AAC5E,EAAE;AACF,2EAA2E;AAC3E,EAAE;AACF,uEAAuE;AACvE,qEAAqE;AACrE,2BAA2B;AAE3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { SessionStore, SessionStoreOptions } from './types';
2
+ /**
3
+ * Open an IDB-backed chunk store for a session.
4
+ *
5
+ * The returned `SessionStore` is scoped to `sessionId`; all read/write
6
+ * operations are filtered by it. Multiple stores for different sessions
7
+ * can be opened concurrently — they share the same DB connection's
8
+ * keyspace but are isolated by the composite key.
9
+ *
10
+ * @param sessionId non-empty session identifier; used as the first
11
+ * component of every chunk's composite key
12
+ * @param options optional overrides (dbName, storeName, IDBFactory)
13
+ * @throws {Error} if `sessionId` is empty / non-string, or if no
14
+ * `IDBFactory` is available (`globalThis.indexedDB`
15
+ * undefined and `options.indexedDB` not provided)
16
+ */
17
+ export declare function createSessionStore(sessionId: string, options?: SessionStoreOptions): Promise<SessionStore>;
18
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/persistence/store.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAgB,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAkG/E;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAwNvB"}