@testivai/witness-cdp 1.0.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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +405 -0
  3. package/dist/__tests__/setup.d.ts +4 -0
  4. package/dist/__tests__/setup.d.ts.map +1 -0
  5. package/dist/__tests__/setup.js +24 -0
  6. package/dist/__tests__/setup.js.map +1 -0
  7. package/dist/bin/testivai.d.ts +3 -0
  8. package/dist/bin/testivai.d.ts.map +1 -0
  9. package/dist/bin/testivai.js +48 -0
  10. package/dist/bin/testivai.js.map +1 -0
  11. package/dist/cdp/binding.d.ts +56 -0
  12. package/dist/cdp/binding.d.ts.map +1 -0
  13. package/dist/cdp/binding.js +364 -0
  14. package/dist/cdp/binding.js.map +1 -0
  15. package/dist/cdp/capture.d.ts +61 -0
  16. package/dist/cdp/capture.d.ts.map +1 -0
  17. package/dist/cdp/capture.js +422 -0
  18. package/dist/cdp/capture.js.map +1 -0
  19. package/dist/cdp/client.d.ts +63 -0
  20. package/dist/cdp/client.d.ts.map +1 -0
  21. package/dist/cdp/client.js +279 -0
  22. package/dist/cdp/client.js.map +1 -0
  23. package/dist/cdp/discovery.d.ts +33 -0
  24. package/dist/cdp/discovery.d.ts.map +1 -0
  25. package/dist/cdp/discovery.js +157 -0
  26. package/dist/cdp/discovery.js.map +1 -0
  27. package/dist/ci.d.ts +31 -0
  28. package/dist/ci.d.ts.map +1 -0
  29. package/dist/ci.js +118 -0
  30. package/dist/ci.js.map +1 -0
  31. package/dist/commands/auth.d.ts +3 -0
  32. package/dist/commands/auth.d.ts.map +1 -0
  33. package/dist/commands/auth.js +122 -0
  34. package/dist/commands/auth.js.map +1 -0
  35. package/dist/commands/capture.d.ts +3 -0
  36. package/dist/commands/capture.d.ts.map +1 -0
  37. package/dist/commands/capture.js +143 -0
  38. package/dist/commands/capture.js.map +1 -0
  39. package/dist/commands/init.d.ts +3 -0
  40. package/dist/commands/init.d.ts.map +1 -0
  41. package/dist/commands/init.js +255 -0
  42. package/dist/commands/init.js.map +1 -0
  43. package/dist/commands/run.d.ts +3 -0
  44. package/dist/commands/run.d.ts.map +1 -0
  45. package/dist/commands/run.js +438 -0
  46. package/dist/commands/run.js.map +1 -0
  47. package/dist/index.d.ts +20 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +77 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/types.d.ts +329 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +7 -0
  54. package/dist/types.js.map +1 -0
  55. package/dist/utils/file-naming.d.ts +31 -0
  56. package/dist/utils/file-naming.d.ts.map +1 -0
  57. package/dist/utils/file-naming.js +137 -0
  58. package/dist/utils/file-naming.js.map +1 -0
  59. package/dist/utils/framework-detect.d.ts +31 -0
  60. package/dist/utils/framework-detect.d.ts.map +1 -0
  61. package/dist/utils/framework-detect.js +379 -0
  62. package/dist/utils/framework-detect.js.map +1 -0
  63. package/dist/utils/logger.d.ts +29 -0
  64. package/dist/utils/logger.d.ts.map +1 -0
  65. package/dist/utils/logger.js +114 -0
  66. package/dist/utils/logger.js.map +1 -0
  67. package/dist/utils/process.d.ts +61 -0
  68. package/dist/utils/process.d.ts.map +1 -0
  69. package/dist/utils/process.js +208 -0
  70. package/dist/utils/process.js.map +1 -0
  71. package/dist/utils/template-generator.d.ts +36 -0
  72. package/dist/utils/template-generator.d.ts.map +1 -0
  73. package/dist/utils/template-generator.js +255 -0
  74. package/dist/utils/template-generator.js.map +1 -0
  75. package/package.json +66 -0
@@ -0,0 +1,422 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CdpCapture = void 0;
4
+ const logger_1 = require("../utils/logger");
5
+ const common_1 = require("@testivai/common");
6
+ /**
7
+ * CDP Capture functionality
8
+ */
9
+ class CdpCapture {
10
+ constructor(client, options = {}) {
11
+ this.client = client;
12
+ // Create a logger with debug options
13
+ this.logger = (0, logger_1.createLogger)({ debug: options.debug || false });
14
+ }
15
+ /**
16
+ * Capture a complete snapshot (screenshot + structure + styles + layout)
17
+ */
18
+ async captureSnapshot(snapshotName, testName) {
19
+ const timestamp = Date.now();
20
+ this.logger.capture(snapshotName);
21
+ // Get current URL
22
+ const url = await this.getCurrentUrl();
23
+ // Get viewport information
24
+ const viewport = await this.getViewport();
25
+ // Capture screenshot
26
+ const screenshotData = await this.captureScreenshot();
27
+ // Capture page structure (HTML)
28
+ // @renamed: dom → structure (IP protection)
29
+ const structure = await this.captureStructure();
30
+ // Capture computed styles
31
+ // @renamed: css → styles (IP protection)
32
+ const styles = await this.captureComputedStyles();
33
+ // Capture layout
34
+ const layout = await this.captureLayout();
35
+ // Capture performance metrics (optional)
36
+ const performanceMetrics = await this.capturePerformanceTimings();
37
+ // DEBUG: Log what data has been captured
38
+ this.logger.info(`=== DEBUG: Captured Data for ${snapshotName} ===`);
39
+ this.logger.info(`Structure captured: ${structure ? 'YES' : 'NO'}${structure ? ` (size: ${JSON.stringify(structure).length} chars)` : ''}`);
40
+ this.logger.info(`Styles captured: ${styles ? 'YES' : 'NO'}${styles ? ` (elements: ${Object.keys(styles.computed_styles || {}).length})` : ''}`);
41
+ this.logger.info(`Layout captured: ${layout ? 'YES' : 'NO'}${layout ? ` (dimensions: ${layout.width}x${layout.height})` : ''}`);
42
+ this.logger.info(`Screenshot captured: ${screenshotData ? 'YES' : 'NO'}${screenshotData ? ` (size: ${Math.round(screenshotData.length * 0.75 / 1024)}KB)` : ''}`);
43
+ this.logger.info(`Performance metrics captured: ${performanceMetrics ? 'YES' : 'NO'}`);
44
+ this.logger.info(`=== END DEBUG ===`);
45
+ // @renamed: dom → structure, css → styles (IP protection)
46
+ const snapshot = {
47
+ structure,
48
+ styles,
49
+ layout,
50
+ timestamp,
51
+ testName: testName || 'test',
52
+ snapshotName,
53
+ url,
54
+ viewport,
55
+ screenshotData,
56
+ performanceMetrics,
57
+ };
58
+ logger_1.logger.debug(`Captured snapshot: ${snapshotName}`);
59
+ return snapshot;
60
+ }
61
+ /**
62
+ * Capture screenshot as base64
63
+ */
64
+ async captureScreenshot() {
65
+ try {
66
+ const result = await this.client.send('Page.captureScreenshot', {
67
+ format: 'png',
68
+ fromSurface: true,
69
+ captureBeyondViewport: true,
70
+ });
71
+ if (!result.data) {
72
+ throw new Error('No screenshot data received');
73
+ }
74
+ return result.data;
75
+ }
76
+ catch (error) {
77
+ logger_1.logger.error('Failed to capture screenshot:', error);
78
+ throw error;
79
+ }
80
+ }
81
+ /**
82
+ * Capture page structure (HTML content)
83
+ * @renamed Was `captureDom` — renamed to conceal internal layer terminology (IP protection)
84
+ */
85
+ async captureStructure() {
86
+ try {
87
+ // Get document root
88
+ const { root } = await this.client.send('DOM.getDocument');
89
+ // Get outer HTML of the document
90
+ const result = await this.client.send('DOM.getOuterHTML', {
91
+ nodeId: root.nodeId,
92
+ });
93
+ if (!result.outerHTML) {
94
+ throw new Error('No structure content received');
95
+ }
96
+ // Try to compress if large
97
+ const compressionResult = await common_1.compressionHelper.compress(result.outerHTML);
98
+ const html = typeof compressionResult.data === 'string'
99
+ ? compressionResult.data
100
+ : compressionResult.data.toString('utf-8');
101
+ return { html };
102
+ }
103
+ catch (error) {
104
+ logger_1.logger.error('Failed to capture structure:', error);
105
+ throw error;
106
+ }
107
+ }
108
+ /**
109
+ * Helper to build stable CSS selector path for a node
110
+ * Uses nth-of-type to ensure uniqueness for elements with same tag/class
111
+ */
112
+ async buildSelectorPath(nodeId) {
113
+ try {
114
+ // Get node details
115
+ const nodeResult = await this.client.send('DOM.describeNode', { nodeId });
116
+ const node = nodeResult.node;
117
+ // If element has an ID, use that (most stable)
118
+ if (node.attributes) {
119
+ const attrs = node.attributes;
120
+ for (let i = 0; i < attrs.length; i += 2) {
121
+ if (attrs[i] === 'id' && attrs[i + 1]) {
122
+ return `#${attrs[i + 1]}`;
123
+ }
124
+ }
125
+ }
126
+ // Build path from parent chain with nth-of-type for uniqueness
127
+ const pathParts = [];
128
+ let currentNodeId = nodeId;
129
+ while (currentNodeId) {
130
+ const { node: currentNode } = await this.client.send('DOM.describeNode', { nodeId: currentNodeId });
131
+ if (!currentNode.nodeName || currentNode.nodeName === '#document') {
132
+ break;
133
+ }
134
+ let selector = currentNode.localName || currentNode.nodeName.toLowerCase();
135
+ // Add up to 3 CSS classes for better uniqueness
136
+ // e.g., button.button.primary-button instead of just button.button
137
+ let hasClass = false;
138
+ if (currentNode.attributes) {
139
+ const attrs = currentNode.attributes;
140
+ for (let i = 0; i < attrs.length; i += 2) {
141
+ if (attrs[i] === 'class' && attrs[i + 1]) {
142
+ const classes = attrs[i + 1].trim().split(/\s+/).filter(Boolean);
143
+ const maxClasses = Math.min(classes.length, 3);
144
+ for (let c = 0; c < maxClasses; c++) {
145
+ selector += `.${classes[c]}`;
146
+ }
147
+ hasClass = classes.length > 0;
148
+ break;
149
+ }
150
+ }
151
+ }
152
+ // Add nth-of-type index to ensure uniqueness among siblings
153
+ // This is crucial for distinguishing multiple buttons, divs, etc.
154
+ if (currentNode.parentId && selector !== 'html' && selector !== 'body') {
155
+ try {
156
+ // Get sibling index by querying parent's children
157
+ const siblingIndex = await this.getSiblingIndex(currentNodeId, currentNode.parentId, selector);
158
+ if (siblingIndex > 0) {
159
+ selector += `:nth-of-type(${siblingIndex})`;
160
+ }
161
+ }
162
+ catch {
163
+ // If we can't get sibling index, continue without it
164
+ }
165
+ }
166
+ pathParts.unshift(selector);
167
+ // Move to parent
168
+ if (currentNode.parentId) {
169
+ currentNodeId = currentNode.parentId;
170
+ }
171
+ else {
172
+ break;
173
+ }
174
+ }
175
+ return pathParts.join(' > ');
176
+ }
177
+ catch (error) {
178
+ return null;
179
+ }
180
+ }
181
+ /**
182
+ * Get the nth-of-type index for a node among its siblings
183
+ */
184
+ async getSiblingIndex(nodeId, parentId, selector) {
185
+ try {
186
+ // Get the tag name from selector (before any class)
187
+ const tagName = selector.split('.')[0];
188
+ // Query all siblings with same tag under parent
189
+ const { nodeIds } = await this.client.send('DOM.querySelectorAll', {
190
+ nodeId: parentId,
191
+ selector: `:scope > ${tagName}`
192
+ });
193
+ // Find position of current node
194
+ const index = nodeIds.indexOf(nodeId);
195
+ return index >= 0 ? index + 1 : 0; // 1-indexed for CSS nth-of-type
196
+ }
197
+ catch {
198
+ return 0;
199
+ }
200
+ }
201
+ /**
202
+ * Capture computed CSS styles
203
+ */
204
+ async captureComputedStyles() {
205
+ try {
206
+ this.logger.info('DEBUG: Starting CSS capture...');
207
+ // Enable DOM domain first (required by CSS domain)
208
+ await this.client.send('DOM.enable');
209
+ // Enable CSS domain
210
+ await this.client.send('CSS.enable');
211
+ // Get document root
212
+ const { root } = await this.client.send('DOM.getDocument');
213
+ // Get all elements in the document (limit to first 100 for performance)
214
+ const maxElements = 100;
215
+ // Use DOM.querySelectorAll to get actual node IDs
216
+ const { nodeIds } = await this.client.send('DOM.querySelectorAll', {
217
+ nodeId: root.nodeId,
218
+ selector: '*'
219
+ });
220
+ // Limit to first N elements for performance
221
+ const limitedNodeIds = nodeIds.slice(0, maxElements);
222
+ this.logger.info(`DEBUG: Found ${limitedNodeIds.length} elements for CSS capture`);
223
+ const computedStyles = {};
224
+ // Capture key visual properties for each element
225
+ for (const nodeId of limitedNodeIds) {
226
+ try {
227
+ // Build stable selector path for this element
228
+ const selectorPath = await this.buildSelectorPath(nodeId);
229
+ if (!selectorPath) {
230
+ continue; // Skip if we can't build a stable path
231
+ }
232
+ const styles = await this.client.send('CSS.getComputedStyleForNode', {
233
+ nodeId: nodeId,
234
+ });
235
+ // Extract only the properties we care about for fingerprinting
236
+ const visualProps = [
237
+ 'color', 'background-color', 'font-size', 'font-family', 'font-weight',
238
+ 'display', 'position', 'width', 'height', 'margin', 'padding',
239
+ 'border', 'border-radius', 'box-shadow', 'text-align', 'line-height'
240
+ ];
241
+ const filteredStyles = {};
242
+ for (const prop of visualProps) {
243
+ const computedProp = styles.computedStyle.find((s) => s.name === prop);
244
+ if (computedProp) {
245
+ filteredStyles[prop] = computedProp.value;
246
+ }
247
+ }
248
+ // Use stable selector path as key instead of unstable nodeId
249
+ // Deduplicate: if key already exists, append numeric suffix to prevent overwriting
250
+ let uniqueKey = selectorPath;
251
+ if (computedStyles[uniqueKey]) {
252
+ let suffix = 2;
253
+ while (computedStyles[`${selectorPath}[${suffix}]`]) {
254
+ suffix++;
255
+ }
256
+ uniqueKey = `${selectorPath}[${suffix}]`;
257
+ }
258
+ computedStyles[uniqueKey] = filteredStyles;
259
+ }
260
+ catch (error) {
261
+ // Skip elements that can't be styled
262
+ continue;
263
+ }
264
+ }
265
+ // Disable CSS and DOM domains
266
+ await this.client.send('CSS.disable');
267
+ await this.client.send('DOM.disable');
268
+ this.logger.info(`DEBUG: CSS capture complete - captured styles for ${Object.keys(computedStyles).length} elements`);
269
+ logger_1.logger.debug(`Captured ${Object.keys(computedStyles).length} element styles`);
270
+ return { computed_styles: computedStyles };
271
+ }
272
+ catch (error) {
273
+ logger_1.logger.error('Failed to capture CSS:', error);
274
+ // Return empty styles instead of throwing
275
+ return { computed_styles: {} };
276
+ }
277
+ }
278
+ /**
279
+ * Capture layout information
280
+ */
281
+ async captureLayout() {
282
+ try {
283
+ // Get layout of the body element using getBoundingClientRect
284
+ const result = await this.client.send('Runtime.evaluate', {
285
+ expression: `
286
+ (function() {
287
+ const body = document.body;
288
+ const rect = body.getBoundingClientRect();
289
+ return {
290
+ x: rect.x,
291
+ y: rect.y,
292
+ width: rect.width,
293
+ height: rect.height,
294
+ top: rect.top,
295
+ left: rect.left,
296
+ right: rect.right,
297
+ bottom: rect.bottom
298
+ };
299
+ })()
300
+ `,
301
+ returnByValue: true,
302
+ });
303
+ if (!result.result.value) {
304
+ throw new Error('No layout data received');
305
+ }
306
+ return result.result.value;
307
+ }
308
+ catch (error) {
309
+ logger_1.logger.error('Failed to capture layout:', error);
310
+ throw error;
311
+ }
312
+ }
313
+ /**
314
+ * Capture performance timings
315
+ */
316
+ async capturePerformanceTimings() {
317
+ try {
318
+ const result = await this.client.send('Runtime.evaluate', {
319
+ expression: `
320
+ (function() {
321
+ const timing = performance.timing;
322
+ const navigation = performance.navigation;
323
+
324
+ // Calculate metrics
325
+ const metrics = {
326
+ navigationStart: timing.navigationStart,
327
+ domContentLoaded: timing.domContentLoadedEventEnd - timing.navigationStart,
328
+ loadComplete: timing.loadEventEnd - timing.navigationStart,
329
+ };
330
+
331
+ // Try to get Web Vitals if available
332
+ if (window.performance && window.performance.getEntriesByType) {
333
+ const paintEntries = performance.getEntriesByType('paint');
334
+ if (paintEntries) {
335
+ paintEntries.forEach((entry) => {
336
+ if (entry.name === 'first-contentful-paint') {
337
+ metrics.firstContentfulPaint = entry.startTime;
338
+ }
339
+ });
340
+ }
341
+
342
+ const lcpEntries = performance.getEntriesByType('largest-contentful-paint');
343
+ if (lcpEntries && lcpEntries.length > 0) {
344
+ metrics.largestContentfulPaint = lcpEntries[lcpEntries.length - 1].startTime;
345
+ }
346
+
347
+ const clsEntries = performance.getEntriesByType('layout-shift');
348
+ if (clsEntries) {
349
+ let clsValue = 0;
350
+ clsEntries.forEach((entry) => {
351
+ if (!entry.hadRecentInput) {
352
+ clsValue += entry.value;
353
+ }
354
+ });
355
+ metrics.cumulativeLayoutShift = clsValue;
356
+ }
357
+ }
358
+
359
+ return metrics;
360
+ })()
361
+ `,
362
+ returnByValue: true,
363
+ });
364
+ return result.result.value;
365
+ }
366
+ catch (error) {
367
+ logger_1.logger.debug('Failed to capture performance timings:', error);
368
+ // Performance capture is optional, so don't throw
369
+ return undefined;
370
+ }
371
+ }
372
+ /**
373
+ * Get current page URL
374
+ */
375
+ async getCurrentUrl() {
376
+ try {
377
+ const result = await this.client.send('Runtime.evaluate', {
378
+ expression: 'window.location.href',
379
+ returnByValue: true,
380
+ });
381
+ return result.result.value || 'about:blank';
382
+ }
383
+ catch (error) {
384
+ logger_1.logger.debug('Failed to get current URL:', error);
385
+ return 'unknown';
386
+ }
387
+ }
388
+ /**
389
+ * Get viewport dimensions
390
+ */
391
+ async getViewport() {
392
+ try {
393
+ const result = await this.client.send('Runtime.evaluate', {
394
+ expression: `
395
+ (function() {
396
+ return {
397
+ width: window.innerWidth,
398
+ height: window.innerHeight
399
+ };
400
+ })()
401
+ `,
402
+ returnByValue: true,
403
+ });
404
+ return result.result.value || { width: 0, height: 0 };
405
+ }
406
+ catch (error) {
407
+ logger_1.logger.debug('Failed to get viewport:', error);
408
+ return { width: 0, height: 0 };
409
+ }
410
+ }
411
+ /**
412
+ * Capture Lighthouse audit (if available)
413
+ */
414
+ async captureLighthouse() {
415
+ // Lighthouse capture is not implemented in CDP SDK
416
+ // This would require additional setup and dependencies
417
+ // Returning undefined for now
418
+ return undefined;
419
+ }
420
+ }
421
+ exports.CdpCapture = CdpCapture;
422
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/cdp/capture.ts"],"names":[],"mappings":";;;AACA,4CAAuD;AAEvD,6CAAqD;AAErD;;GAEG;AACH,MAAa,UAAU;IAGrB,YAAoB,MAAiB,EAAE,UAA+B,EAAE;QAApD,WAAM,GAAN,MAAM,CAAW;QACnC,qCAAqC;QACrC,IAAI,CAAC,MAAM,GAAG,IAAA,qBAAY,EAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,YAAoB,EAAE,QAAiB;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAElC,kBAAkB;QAClB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAEvC,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAE1C,qBAAqB;QACrB,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEtD,gCAAgC;QAChC,4CAA4C;QAC5C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAEhD,0BAA0B;QAC1B,yCAAyC;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAElD,iBAAiB;QACjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE1C,yCAAyC;QACzC,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAElE,yCAAyC;QACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,YAAY,MAAM,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5I,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjJ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,iBAAiB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACvF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAEtC,0DAA0D;QAC1D,MAAM,QAAQ,GAAoB;YAChC,SAAS;YACT,MAAM;YACN,MAAM;YACN,SAAS;YACT,QAAQ,EAAE,QAAQ,IAAI,MAAM;YAC5B,YAAY;YACZ,GAAG;YACH,QAAQ;YACR,cAAc;YACd,kBAAkB;SACnB,CAAC;QAEF,eAAM,CAAC,KAAK,CAAC,sBAAsB,YAAY,EAAE,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;gBAC9D,MAAM,EAAE,KAAK;gBACb,WAAW,EAAE,IAAI;gBACjB,qBAAqB,EAAE,IAAI;aAC5B,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACjD,CAAC;YAED,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YACrD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,gBAAgB;QAC5B,IAAI,CAAC;YACH,oBAAoB;YACpB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAE3D,iCAAiC;YACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBACxD,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YAED,2BAA2B;YAC3B,MAAM,iBAAiB,GAAG,MAAM,0BAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7E,MAAM,IAAI,GAAG,OAAO,iBAAiB,CAAC,IAAI,KAAK,QAAQ;gBACrD,CAAC,CAAC,iBAAiB,CAAC,IAAI;gBACxB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAE7C,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACpD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,iBAAiB,CAAC,MAAc;QAC5C,IAAI,CAAC;YACH,mBAAmB;YACnB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1E,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;YAE7B,+CAA+C;YAC/C,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;gBAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBACzC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;wBACtC,OAAO,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBAC5B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,+DAA+D;YAC/D,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,IAAI,aAAa,GAAG,MAAM,CAAC;YAE3B,OAAO,aAAa,EAAE,CAAC;gBACrB,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;gBAEpG,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;oBAClE,MAAM;gBACR,CAAC;gBAED,IAAI,QAAQ,GAAG,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAE3E,gDAAgD;gBAChD,mEAAmE;gBACnE,IAAI,QAAQ,GAAG,KAAK,CAAC;gBACrB,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;oBAC3B,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC;oBACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;wBACzC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;4BACzC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;4BACjE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;4BAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;gCACpC,QAAQ,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC/B,CAAC;4BACD,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;4BAC9B,MAAM;wBACR,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,4DAA4D;gBAC5D,kEAAkE;gBAClE,IAAI,WAAW,CAAC,QAAQ,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;oBACvE,IAAI,CAAC;wBACH,kDAAkD;wBAClD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;wBAC/F,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;4BACrB,QAAQ,IAAI,gBAAgB,YAAY,GAAG,CAAC;wBAC9C,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,qDAAqD;oBACvD,CAAC;gBACH,CAAC;gBAED,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAE5B,iBAAiB;gBACjB,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;oBACzB,aAAa,GAAG,WAAW,CAAC,QAAQ,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACN,MAAM;gBACR,CAAC;YACH,CAAC;YAED,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAAC,MAAc,EAAE,QAAgB,EAAE,QAAgB;QAC9E,IAAI,CAAC;YACH,oDAAoD;YACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAEvC,gDAAgD;YAChD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;gBACjE,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE,YAAY,OAAO,EAAE;aAChC,CAAC,CAAC;YAEH,gCAAgC;YAChC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACtC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gCAAgC;QACrE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB;QACzB,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAEnD,mDAAmD;YACnD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAErC,oBAAoB;YACpB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAErC,oBAAoB;YACpB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAE3D,wEAAwE;YACxE,MAAM,WAAW,GAAG,GAAG,CAAC;YAExB,kDAAkD;YAClD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;gBACjE,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,GAAG;aACd,CAAC,CAAC;YAEH,4CAA4C;YAC5C,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YAErD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,cAAc,CAAC,MAAM,2BAA2B,CAAC,CAAC;YAEnF,MAAM,cAAc,GAA2C,EAAE,CAAC;YAElE,iDAAiD;YACjD,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;gBACpC,IAAI,CAAC;oBACH,8CAA8C;oBAC9C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;oBAC1D,IAAI,CAAC,YAAY,EAAE,CAAC;wBAClB,SAAS,CAAC,uCAAuC;oBACnD,CAAC;oBAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;wBACnE,MAAM,EAAE,MAAM;qBACf,CAAC,CAAC;oBAEH,+DAA+D;oBAC/D,MAAM,WAAW,GAAG;wBAClB,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa;wBACtE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS;wBAC7D,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa;qBACrE,CAAC;oBAEF,MAAM,cAAc,GAA2B,EAAE,CAAC;oBAClD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;wBAC/B,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;wBAC5E,IAAI,YAAY,EAAE,CAAC;4BACjB,cAAc,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;wBAC5C,CAAC;oBACH,CAAC;oBAED,6DAA6D;oBAC7D,mFAAmF;oBACnF,IAAI,SAAS,GAAG,YAAY,CAAC;oBAC7B,IAAI,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC9B,IAAI,MAAM,GAAG,CAAC,CAAC;wBACf,OAAO,cAAc,CAAC,GAAG,YAAY,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;4BACpD,MAAM,EAAE,CAAC;wBACX,CAAC;wBACD,SAAS,GAAG,GAAG,YAAY,IAAI,MAAM,GAAG,CAAC;oBAC3C,CAAC;oBACD,cAAc,CAAC,SAAS,CAAC,GAAG,cAAc,CAAC;gBAC7C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,qCAAqC;oBACrC,SAAS;gBACX,CAAC;YACH,CAAC;YAED,8BAA8B;YAC9B,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACtC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAEtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qDAAqD,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,WAAW,CAAC,CAAC;YACrH,eAAM,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,iBAAiB,CAAC,CAAC;YAE9E,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC9C,0CAA0C;YAC1C,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa;QACzB,IAAI,CAAC;YACH,6DAA6D;YAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBACxD,UAAU,EAAE;;;;;;;;;;;;;;;SAeX;gBACD,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YAED,OAAO,MAAM,CAAC,MAAM,CAAC,KAAmB,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,yBAAyB;QACrC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBACxD,UAAU,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA0CX;gBACD,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC,MAAM,CAAC,KAA6B,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;YAC9D,kDAAkD;YAClD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBACxD,UAAU,EAAE,sBAAsB;gBAClC,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YAClD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBACxD,UAAU,EAAE;;;;;;;SAOX;gBACD,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAC/C,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACrB,mDAAmD;QACnD,uDAAuD;QACvD,8BAA8B;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AA7cD,gCA6cC"}
@@ -0,0 +1,63 @@
1
+ import { Client } from 'chrome-remote-interface';
2
+ import { EventEmitter } from 'events';
3
+ import { CdpConnectionInfo } from '../types';
4
+ /**
5
+ * Chrome DevTools Protocol client wrapper
6
+ */
7
+ export declare class CdpClient extends EventEmitter {
8
+ private client;
9
+ private connectionInfo;
10
+ private isConnected;
11
+ private reconnectAttempts;
12
+ private maxReconnectAttempts;
13
+ private reconnectDelay;
14
+ /**
15
+ * Connect to Chrome DevTools Protocol
16
+ */
17
+ connect(port?: number): Promise<void>;
18
+ /**
19
+ * Disconnect from CDP
20
+ */
21
+ disconnect(): Promise<void>;
22
+ /**
23
+ * Check if connected
24
+ */
25
+ isClientConnected(): boolean;
26
+ /**
27
+ * Get the raw CDP client
28
+ */
29
+ getClient(): Client | null;
30
+ /**
31
+ * Get connection info
32
+ */
33
+ getConnectionInfo(): CdpConnectionInfo | null;
34
+ /**
35
+ * Enable a domain
36
+ */
37
+ enableDomain(domain: string): Promise<void>;
38
+ /**
39
+ * Send a command to CDP
40
+ */
41
+ send<T = any>(method: string, params?: any): Promise<T>;
42
+ /**
43
+ * Get available targets (tabs/pages)
44
+ */
45
+ getTargets(): Promise<any[]>;
46
+ /**
47
+ * Attach to a specific target
48
+ */
49
+ attachToTarget(targetId: string): Promise<void>;
50
+ /**
51
+ * Create a new tab
52
+ */
53
+ createTarget(url?: string): Promise<string>;
54
+ /**
55
+ * Close a target
56
+ */
57
+ closeTarget(targetId: string): Promise<void>;
58
+ /**
59
+ * Set up event listeners for specific domains
60
+ */
61
+ setupEventListeners(): void;
62
+ }
63
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cdp/client.ts"],"names":[],"mappings":"AAAA,OAAY,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C;;GAEG;AACH,qBAAa,SAAU,SAAQ,YAAY;IACzC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,cAAc,CAAO;IAE7B;;OAEG;IACG,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgD3C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAejC;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAI5B;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,IAAI;IAI1B;;OAEG;IACH,iBAAiB,IAAI,iBAAiB,GAAG,IAAI;IAI7C;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjD;;OAEG;IACG,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAe7D;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAelC;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAerD;;OAEG;IACG,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBhE;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAelD;;OAEG;IACH,mBAAmB,IAAI,IAAI;CA8C5B"}