ghost-qa 1.3.2 → 2.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 (81) hide show
  1. package/README.md +77 -24
  2. package/SKILL.md +78 -77
  3. package/dist/bin/ghost-qa.d.ts +10 -2
  4. package/dist/bin/ghost-qa.d.ts.map +1 -1
  5. package/dist/bin/ghost-qa.js +106 -16
  6. package/dist/bin/ghost-qa.js.map +1 -1
  7. package/dist/src/engine/audit-runner.d.ts +6 -5
  8. package/dist/src/engine/audit-runner.d.ts.map +1 -1
  9. package/dist/src/engine/audit-runner.js +117 -60
  10. package/dist/src/engine/audit-runner.js.map +1 -1
  11. package/dist/src/engine/browser-session.d.ts +3 -3
  12. package/dist/src/engine/browser-session.d.ts.map +1 -1
  13. package/dist/src/engine/browser-session.js +18 -7
  14. package/dist/src/engine/browser-session.js.map +1 -1
  15. package/dist/src/engine/compare.d.ts +37 -0
  16. package/dist/src/engine/compare.d.ts.map +1 -0
  17. package/dist/src/engine/compare.js +63 -0
  18. package/dist/src/engine/compare.js.map +1 -0
  19. package/dist/src/engine/health-score.d.ts +14 -0
  20. package/dist/src/engine/health-score.d.ts.map +1 -0
  21. package/dist/src/engine/health-score.js +74 -0
  22. package/dist/src/engine/health-score.js.map +1 -0
  23. package/dist/src/engine/version.d.ts +14 -0
  24. package/dist/src/engine/version.d.ts.map +1 -0
  25. package/dist/src/engine/version.js +43 -0
  26. package/dist/src/engine/version.js.map +1 -0
  27. package/dist/src/index.d.ts +6 -0
  28. package/dist/src/index.d.ts.map +1 -1
  29. package/dist/src/index.js +6 -0
  30. package/dist/src/index.js.map +1 -1
  31. package/dist/src/mcp/server.d.ts +24 -4
  32. package/dist/src/mcp/server.d.ts.map +1 -1
  33. package/dist/src/mcp/server.js +43 -5
  34. package/dist/src/mcp/server.js.map +1 -1
  35. package/dist/src/reporter/agent-diagnostic.d.ts +6 -0
  36. package/dist/src/reporter/agent-diagnostic.d.ts.map +1 -1
  37. package/dist/src/reporter/agent-diagnostic.js +52 -2
  38. package/dist/src/reporter/agent-diagnostic.js.map +1 -1
  39. package/dist/src/reporter/html-report.d.ts.map +1 -1
  40. package/dist/src/reporter/html-report.js +79 -4
  41. package/dist/src/reporter/html-report.js.map +1 -1
  42. package/dist/src/reporter/terminal-summary.d.ts.map +1 -1
  43. package/dist/src/reporter/terminal-summary.js +6 -0
  44. package/dist/src/reporter/terminal-summary.js.map +1 -1
  45. package/dist/src/traps/a11y-trap.d.ts +23 -0
  46. package/dist/src/traps/a11y-trap.d.ts.map +1 -1
  47. package/dist/src/traps/a11y-trap.js +185 -0
  48. package/dist/src/traps/a11y-trap.js.map +1 -1
  49. package/dist/src/traps/console-trap.d.ts +3 -1
  50. package/dist/src/traps/console-trap.d.ts.map +1 -1
  51. package/dist/src/traps/console-trap.js +41 -0
  52. package/dist/src/traps/console-trap.js.map +1 -1
  53. package/dist/src/traps/layout-trap.d.ts +31 -0
  54. package/dist/src/traps/layout-trap.d.ts.map +1 -1
  55. package/dist/src/traps/layout-trap.js +173 -0
  56. package/dist/src/traps/layout-trap.js.map +1 -1
  57. package/dist/src/traps/links-trap.d.ts +34 -0
  58. package/dist/src/traps/links-trap.d.ts.map +1 -0
  59. package/dist/src/traps/links-trap.js +136 -0
  60. package/dist/src/traps/links-trap.js.map +1 -0
  61. package/dist/src/traps/network-trap.d.ts +4 -1
  62. package/dist/src/traps/network-trap.d.ts.map +1 -1
  63. package/dist/src/traps/network-trap.js +29 -2
  64. package/dist/src/traps/network-trap.js.map +1 -1
  65. package/dist/src/traps/perf-trap.d.ts +18 -0
  66. package/dist/src/traps/perf-trap.d.ts.map +1 -1
  67. package/dist/src/traps/perf-trap.js +148 -8
  68. package/dist/src/traps/perf-trap.js.map +1 -1
  69. package/dist/src/traps/seo-trap.d.ts +30 -0
  70. package/dist/src/traps/seo-trap.d.ts.map +1 -0
  71. package/dist/src/traps/seo-trap.js +98 -0
  72. package/dist/src/traps/seo-trap.js.map +1 -0
  73. package/dist/src/traps/theme-trap.d.ts +32 -0
  74. package/dist/src/traps/theme-trap.d.ts.map +1 -0
  75. package/dist/src/traps/theme-trap.js +109 -0
  76. package/dist/src/traps/theme-trap.js.map +1 -0
  77. package/dist/src/types.d.ts +55 -3
  78. package/dist/src/types.d.ts.map +1 -1
  79. package/dist/src/types.js +30 -2
  80. package/dist/src/types.js.map +1 -1
  81. package/package.json +11 -3
@@ -6,7 +6,8 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
6
6
  import { runGhostQAAudit, GHOST_QA_VERSION } from '../src/engine/audit-runner.js';
7
7
  import { ManagedDevServer } from '../src/engine/server-lifecycle.js';
8
8
  import { mcpServerConfig, runDoctorCheck, startMcpServer } from '../src/mcp/server.js';
9
- import { formatAgentDiagnostic, formatDiagnostic } from '../src/reporter/agent-diagnostic.js';
9
+ import { compareReports, formatCompareReport } from '../src/engine/compare.js';
10
+ import { formatAgentDiagnostic, formatDiagnostic, formatPatchPrompt } from '../src/reporter/agent-diagnostic.js';
10
11
  import { formatHtmlReport } from '../src/reporter/html-report.js';
11
12
  import { formatTerminalSummary } from '../src/reporter/terminal-summary.js';
12
13
  import { DEFAULT_OPTIONS } from '../src/types.js';
@@ -16,12 +17,13 @@ const PROTOCOL_END = '<!-- ghost-qa:end -->';
16
17
  export const AGENT_PROTOCOL = `${PROTOCOL_START}
17
18
  ## 👻 ghost-qa — Browser Verification Protocol (MANDATORY)
18
19
 
19
- Before reporting any task that touches frontend code as complete, you MUST verify it in a real browser:
20
+ Before reporting any task that touches frontend code as complete, you MUST verify it in a real browser — the closed-loop Self-Healing Browser Verification Protocol:
20
21
 
21
- 1. Ensure the app is running locally (e.g. \`npm run dev\`).
22
- 2. Run: \`npx -y ghost-qa test <local-url>\` (e.g. \`npx -y ghost-qa test http://localhost:3000\`) — or call the \`ghost_qa_audit_url\` MCP tool if your host exposes it. Add \`--server-cmd "npm run dev"\` to let ghost-qa manage the dev server itself.
23
- 3. If ghost-qa reports ANY critical or major issue (hydration errors, console errors, 4xx/5xx responses, mobile overflow, accessibility or performance failures, broken interactions), fix the root cause in source and re-run.
24
- 4. Repeat until ghost-qa prints **PASS**. Only then may you tell the user the task is done.
22
+ 1. **Readiness:** run \`ghost-qa doctor\` (or the \`ghost_qa_doctor\` MCP tool). Do not proceed on red.
23
+ 2. **Baseline audit:** ensure the app runs locally, then \`npx -y ghost-qa test <local-url> --out-dir ghost-qa-out\` (add \`--server-cmd "npm run dev"\` to let ghost-qa manage the server) — or call \`ghost_qa_audit_url\`. This runs the 8-Trap Engine on Desktop 1440×900, Tablet 768×1024 and Mobile 375×812, light + dark. Save the baseline as \`before.json\` (it is \`ghost-qa-out/report.json\`).
24
+ 3. **Root-cause mapping:** for every critical/major finding, map the exact DOM selector, bounding box, stack trace or dark-mode contrast failure back to the component file that renders it.
25
+ 4. **Surgical remediation:** fix root causes in source (hydration, overflow, tap targets, ARIA/labels, dark-mode tokens…). Never silence the checker or delete failing UI.
26
+ 5. **Delta verification:** re-run the audit to \`after.json\`, then \`npx -y ghost-qa compare before.json after.json\` (or \`ghost_qa_compare\`). Repeat until QA Health Score is **95–100 (A+)**, zero critical/major remain, and the delta shows **zero new regressions**. Only then report done, citing score, routes, viewports and the delta.
25
27
 
26
28
  Never declare a UI task finished based only on code review, type-checking, or unit tests. The browser is the source of truth.
27
29
  ${PROTOCOL_END}`;
@@ -35,12 +37,12 @@ You are a coding agent. Never report a frontend task complete without running it
35
37
  - Server already running: \`npx -y ghost-qa test <local-url>\`
36
38
  - Otherwise: \`npx -y ghost-qa test <local-url> --server-cmd "npm run dev"\` (ghost-qa spawns, awaits and tears down the server)
37
39
  - Or call the \`ghost_qa_audit_url\` MCP tool if your host exposes it (identical engine).
38
- It crawls routes on Desktop 1440x900 + Mobile 390x844 and runs the 5-Trap Engine: console/hydration, network, layout, accessibility, performance — plus safe interaction testing (never destructive controls).
39
- 2. Read the Self-Healing Bug Report. Fix every critical/major issue by \`#id\`, at the root cause in source — never silence the checker, delete failing UI, or add suppressHydrationWarning.
40
- 3. Re-run the identical command until it prints \`GHOST-QA PASS\`. If stuck on the same \`#id\` after 5 loops, report that honestly instead of declaring success.
41
- 4. Only then report completion, naming the URL verified, routes crawled, interactions tested, and issues fixed.
40
+ It crawls routes on Desktop 1440×900 + Tablet 768×1024 + Mobile 375×812 (light + dark) and runs the 8-Trap Engine: console/framework runtime, network/asset integrity, layout/geometry/collision, WCAG a11y + keyboard focus, Core Web Vitals, link integrity, SEO/metadata, theme parity — plus safe interaction testing (never destructive controls). Save the baseline JSON as before.json.
41
+ 2. Read the Self-Healing Bug Report (GHOST-QA-REPORT.md) and PATCH-PROMPT.md. Map each selector/bounding box/stack to the component that renders it; fix every critical/major issue by \`#id\`, at the root cause in source — never silence the checker, delete failing UI, or add suppressHydrationWarning.
42
+ 3. Re-audit to after.json, then run \`npx -y ghost-qa compare before.json after.json\` (or \`ghost_qa_compare\`). Repeat until QA Health Score is 95–100 (A+), zero critical/major remain and the delta shows zero new regressions. If stuck on the same \`#id\` after 5 loops, report that honestly instead of declaring success.
43
+ 4. Only then report completion, naming the URL verified, routes crawled, interactions tested, score/grade and issues fixed.
42
44
 
43
- Useful flags: \`--max-depth\`, \`--max-routes\`, \`--viewport mobile\`, \`--json\`, \`--report <file>\`, \`--html <file>\`, \`--fail-on minor\`.
45
+ Useful flags: \`--max-depth\`, \`--max-routes\`, \`--viewport mobile\`, \`--color-scheme dark\`, \`--screenshots\`, \`--out-dir ghost-qa-out\`, \`--json\`, \`--report <file>\`, \`--html <file>\`, \`--fail-on minor\`.
44
46
  If Chromium is missing: \`npx playwright install chromium\`, then \`npx -y ghost-qa doctor\`.
45
47
  Full skill: https://github.com/avivgerz-hue/ghost-qa/blob/main/SKILL.md
46
48
  `;
@@ -49,6 +51,8 @@ const HELP = `
49
51
 
50
52
  Usage:
51
53
  ghost-qa test <url> [options] Crawl a running app and trap browser failures
54
+ ghost-qa compare <before.json> <after.json> [--json]
55
+ Regression & Verification Delta Report
52
56
  ghost-qa init [--force] Install the agent skill, protocol + MCP config
53
57
  ghost-qa mcp Run the native MCP server (JSON-RPC over stdio)
54
58
  ghost-qa doctor Check Node, Playwright and Chromium setup
@@ -58,7 +62,11 @@ test options:
58
62
  --max-depth <n> Link-following depth from the start URL (default ${DEFAULT_OPTIONS.maxDepth})
59
63
  --max-routes <n> Maximum routes to visit (default ${DEFAULT_OPTIONS.maxRoutes})
60
64
  --timeout <ms> Per-navigation timeout (default ${DEFAULT_OPTIONS.timeoutMs})
61
- --viewport <name> both | desktop | mobile (default both)
65
+ --viewport <name> all | desktop | tablet | mobile | both (default all)
66
+ --color-scheme <name> both | light | dark (default both)
67
+ --screenshots Capture route screenshots for the HTML dashboard
68
+ --out-dir <dir> Write report.json + GHOST-QA-REPORT.md +
69
+ PATCH-PROMPT.md + report.html into this directory
62
70
  --no-interactions Only load pages; do not click/fill anything
63
71
  --headed Show the browser window (debugging)
64
72
  --fail-on <severity> Fail on critical | major | minor (default ${DEFAULT_OPTIONS.failOn})
@@ -74,7 +82,9 @@ Examples:
74
82
  npx -y ghost-qa test http://localhost:3000
75
83
  npx -y ghost-qa test http://localhost:3000 --server-cmd "npm run dev"
76
84
  npx -y ghost-qa test http://localhost:5173 --max-depth 3 --html ghost-qa-report.html
77
- npx -y ghost-qa test http://localhost:3000 --json > report.json
85
+ npx -y ghost-qa test http://localhost:3000 --out-dir ghost-qa-out --screenshots
86
+ npx -y ghost-qa test http://localhost:3000 --json > before.json
87
+ npx -y ghost-qa compare before.json after.json
78
88
  npx -y ghost-qa init
79
89
  npx -y ghost-qa mcp
80
90
 
@@ -102,6 +112,7 @@ export function parseTestArgs(args) {
102
112
  let quiet = false;
103
113
  let reportFile;
104
114
  let htmlFile;
115
+ let outDir;
105
116
  let serverCmd;
106
117
  let serverTimeoutMs = 30_000;
107
118
  for (let i = 0; i < args.length; i++) {
@@ -118,14 +129,34 @@ export function parseTestArgs(args) {
118
129
  break;
119
130
  case '--viewport': {
120
131
  const value = args[++i];
121
- if (value === 'desktop' || value === 'mobile')
132
+ if (value === 'desktop' || value === 'tablet' || value === 'mobile')
122
133
  options.viewports = [value];
123
134
  else if (value === 'both')
124
135
  options.viewports = ['desktop', 'mobile'];
136
+ else if (value === 'all')
137
+ options.viewports = ['desktop', 'tablet', 'mobile'];
125
138
  else
126
- throw new Error(`--viewport expects both|desktop|mobile, got "${value ?? ''}"`);
139
+ throw new Error(`--viewport expects all|both|desktop|tablet|mobile, got "${value ?? ''}"`);
127
140
  break;
128
141
  }
142
+ case '--color-scheme': {
143
+ const value = args[++i];
144
+ if (value === 'light' || value === 'dark')
145
+ options.colorSchemes = [value];
146
+ else if (value === 'both')
147
+ options.colorSchemes = ['light', 'dark'];
148
+ else
149
+ throw new Error(`--color-scheme expects both|light|dark, got "${value ?? ''}"`);
150
+ break;
151
+ }
152
+ case '--screenshots':
153
+ options.screenshots = true;
154
+ break;
155
+ case '--out-dir':
156
+ outDir = args[++i];
157
+ if (!outDir)
158
+ throw new Error('--out-dir expects a directory path');
159
+ break;
129
160
  case '--no-interactions':
130
161
  options.interactions = false;
131
162
  break;
@@ -183,9 +214,55 @@ export function parseTestArgs(args) {
183
214
  serverTimeoutMs,
184
215
  ...(reportFile ? { reportFile } : {}),
185
216
  ...(htmlFile ? { htmlFile } : {}),
217
+ ...(outDir ? { outDir } : {}),
186
218
  ...(serverCmd ? { serverCmd } : {}),
187
219
  };
188
220
  }
221
+ export function parseCompareArgs(args) {
222
+ const files = [];
223
+ let json = false;
224
+ let outFile;
225
+ for (let i = 0; i < args.length; i++) {
226
+ const arg = args[i];
227
+ if (arg === '--json')
228
+ json = true;
229
+ else if (arg === '--out') {
230
+ outFile = args[++i];
231
+ if (!outFile)
232
+ throw new Error('--out expects a file path');
233
+ }
234
+ else if (arg.startsWith('--'))
235
+ throw new Error(`Unknown flag: ${arg}`);
236
+ else
237
+ files.push(arg);
238
+ }
239
+ if (files.length !== 2) {
240
+ throw new Error('Usage: ghost-qa compare <before.json> <after.json> [--json] [--out <file>]');
241
+ }
242
+ return { beforeFile: files[0], afterFile: files[1], json, ...(outFile ? { outFile } : {}) };
243
+ }
244
+ async function runCompare(args) {
245
+ const parsed = parseCompareArgs(args);
246
+ const load = async (file) => {
247
+ const parsedJson = JSON.parse(await readFile(resolve(file), 'utf8'));
248
+ if (typeof parsedJson !== 'object' ||
249
+ parsedJson === null ||
250
+ !Array.isArray(parsedJson.issues)) {
251
+ throw new Error(`${file} is not a ghost-qa report JSON (missing issues array)`);
252
+ }
253
+ return parsedJson;
254
+ };
255
+ const delta = compareReports(await load(parsed.beforeFile), await load(parsed.afterFile));
256
+ const rendered = parsed.json ? `${JSON.stringify(delta, null, 2)}\n` : formatCompareReport(delta);
257
+ if (parsed.outFile) {
258
+ await writeFile(resolve(parsed.outFile), rendered, 'utf8');
259
+ process.stdout.write(`Delta report written to ${parsed.outFile}\n`);
260
+ }
261
+ else {
262
+ process.stdout.write(rendered);
263
+ }
264
+ return delta.newRegressions.length > 0 ? 1 : 0;
265
+ }
189
266
  async function executeTest(parsed) {
190
267
  const audit = () => runGhostQAAudit(parsed.target, parsed.options);
191
268
  if (!parsed.serverCmd)
@@ -304,7 +381,7 @@ async function runInit(args) {
304
381
  process.stdout.write(` • ${result.file} — ${result.action}\n`);
305
382
  }
306
383
  process.stdout.write('\nYour coding agent will now run `npx -y ghost-qa test <local-url>` and fix browser failures before reporting a task complete.\n' +
307
- 'MCP hosts (Claude Code, Claude Desktop, Cursor, Codex) can also call the ghost_qa_audit_url / ghost_qa_doctor tools directly via the .mcp.json entry above.\n');
384
+ 'MCP hosts (Claude Code, Claude Desktop, Cursor, Codex) can also call the ghost_qa_audit_url / ghost_qa_doctor / ghost_qa_compare tools directly via the .mcp.json entry above.\n');
308
385
  return 0;
309
386
  }
310
387
  async function runDoctor() {
@@ -338,6 +415,17 @@ export async function main(argv = process.argv.slice(2)) {
338
415
  if (parsed.htmlFile) {
339
416
  await writeFile(resolve(parsed.htmlFile), formatHtmlReport(report), 'utf8');
340
417
  }
418
+ if (parsed.outDir) {
419
+ const dir = resolve(parsed.outDir);
420
+ await mkdir(dir, { recursive: true });
421
+ await writeFile(join(dir, 'report.json'), `${JSON.stringify(report, null, 2)}\n`, 'utf8');
422
+ await writeFile(join(dir, 'GHOST-QA-REPORT.md'), `${formatAgentDiagnostic(report)}\n`, 'utf8');
423
+ await writeFile(join(dir, 'PATCH-PROMPT.md'), formatPatchPrompt(report), 'utf8');
424
+ await writeFile(join(dir, 'report.html'), formatHtmlReport(report), 'utf8');
425
+ if (!parsed.quiet) {
426
+ process.stdout.write(`Artifacts written to ${parsed.outDir}/ (report.json, GHOST-QA-REPORT.md, PATCH-PROMPT.md, report.html)\n`);
427
+ }
428
+ }
341
429
  if (parsed.json) {
342
430
  process.stdout.write(formatDiagnostic(report, 'json'));
343
431
  }
@@ -353,6 +441,8 @@ export async function main(argv = process.argv.slice(2)) {
353
441
  }
354
442
  return report.passed ? 0 : 1;
355
443
  }
444
+ case 'compare':
445
+ return await runCompare(rest);
356
446
  case 'mcp':
357
447
  await startMcpServer();
358
448
  return 0;
@@ -1 +1 @@
1
- {"version":3,"file":"ghost-qa.js","sourceRoot":"","sources":["../../bin/ghost-qa.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ghost-qa.js","sourceRoot":"","sources":["../../bin/ghost-qa.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACjH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAuB,MAAM,iBAAiB,CAAC;AAEvE,MAAM,CAAC,MAAM,OAAO,GAAG,gBAAgB,CAAC;AAExC,MAAM,cAAc,GAAG,yBAAyB,CAAC;AACjD,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAE7C,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,cAAc;;;;;;;;;;;;EAY7C,YAAY,EAAE,CAAC;AAEjB,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;CAkBtB,CAAC;AAEF,MAAM,IAAI,GAAG;eACE,OAAO;;;;;;;;;;;;4EAYsD,eAAe,CAAC,QAAQ;4DACxC,eAAe,CAAC,SAAS;2DAC1B,eAAe,CAAC,SAAS;;;;;;;;qEAQf,eAAe,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;CAqB1F,CAAC;AAEF,SAAS,gBAAgB,CAAC,KAAyB,EAAE,IAAY;IAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,qCAAqC,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAyB,EAAE,IAAY;IAClE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,yCAAyC,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAcD,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,MAAM,OAAO,GAAmB,EAAE,GAAG,eAAe,EAAE,SAAS,EAAE,CAAC,GAAG,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;IAClG,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,UAA8B,CAAC;IACnC,IAAI,QAA4B,CAAC;IACjC,IAAI,MAA0B,CAAC;IAC/B,IAAI,SAA6B,CAAC;IAClC,IAAI,eAAe,GAAG,MAAM,CAAC;IAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACrB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,aAAa;gBAChB,OAAO,CAAC,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACvD,MAAM;YACR,KAAK,cAAc;gBACjB,OAAO,CAAC,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACrD,MAAM;YACR,KAAK,WAAW;gBACd,OAAO,CAAC,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACrD,MAAM;YACR,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACxB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,QAAQ;oBAAE,OAAO,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC;qBAC5F,IAAI,KAAK,KAAK,MAAM;oBAAE,OAAO,CAAC,SAAS,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;qBAChE,IAAI,KAAK,KAAK,KAAK;oBAAE,OAAO,CAAC,SAAS,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;;oBACzE,MAAM,IAAI,KAAK,CAAC,2DAA2D,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC;gBAChG,MAAM;YACR,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACxB,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM;oBAAE,OAAO,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,CAAC;qBACrE,IAAI,KAAK,KAAK,MAAM;oBAAE,OAAO,CAAC,YAAY,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;;oBAC/D,MAAM,IAAI,KAAK,CAAC,gDAAgD,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC;gBACrF,MAAM;YACR,CAAC;YACD,KAAK,eAAe;gBAClB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC3B,MAAM;YACR,KAAK,WAAW;gBACd,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnB,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBACnE,MAAM;YACR,KAAK,mBAAmB;gBACtB,OAAO,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC7B,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACzB,MAAM;YACR,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACxB,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO;oBAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;;oBACtF,MAAM,IAAI,KAAK,CAAC,gDAAgD,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC;gBACrF,MAAM;YACR,CAAC;YACD,KAAK,QAAQ;gBACX,IAAI,GAAG,IAAI,CAAC;gBACZ,MAAM;YACR,KAAK,SAAS;gBACZ,KAAK,GAAG,IAAI,CAAC;gBACb,MAAM;YACR,KAAK,UAAU;gBACb,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvB,IAAI,CAAC,UAAU;oBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;gBACjE,MAAM;YACR,KAAK,QAAQ;gBACX,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrB,IAAI,CAAC,QAAQ;oBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAC7D,MAAM;YACR,KAAK,cAAc;gBACjB,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;gBACnG,MAAM;YACR,KAAK,kBAAkB;gBACrB,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACnD,MAAM;YACR;gBACE,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;gBAClE,IAAI,CAAC,MAAM;oBAAE,MAAM,GAAG,GAAG,CAAC;;oBACrB,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAC/E,OAAO;QACL,MAAM;QACN,OAAO;QACP,IAAI;QACJ,KAAK;QACL,eAAe;QACf,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC;AASD,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,OAA2B,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,GAAG,KAAK,QAAQ;YAAE,IAAI,GAAG,IAAI,CAAC;aAC7B,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC7D,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;;YACpE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAChG,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAc;IACtC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;QAClC,MAAM,UAAU,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9E,IACE,OAAO,UAAU,KAAK,QAAQ;YAC9B,UAAU,KAAK,IAAI;YACnB,CAAC,KAAK,CAAC,OAAO,CAAE,UAAmC,CAAC,MAAM,CAAC,EAC3D,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,uDAAuD,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,UAAkD,CAAC;IAC5D,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1F,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAClG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAsB;IAC/C,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM,CAAC,SAAS;QAAE,OAAO,KAAK,EAAE,CAAC;IAEtC,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IAClF,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;QACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QAChF,OAAO,MAAM,KAAK,EAAE,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB;IAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG;QACjB,OAAO,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,2BAA2B;QACjE,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC;QACjC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC;KACnC,CAAC;IACF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAClD,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAE,OAAO,OAAO,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAAgB;IAC5C,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,SAAS,CAAC,QAAQ,EAAE,2BAA2B,cAAc,IAAI,EAAE,MAAM,CAAC,CAAC;QACjF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3C,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACxG,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,WAAW,CAAC;QAC1C,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,cAAc,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5F,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAiB,EACjB,KAAK,GAAG,KAAK;IAEb,MAAM,OAAO,GAA4C,EAAE,CAAC;IAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC/E,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC/C,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAC3C,IAAI,CAAC,YAAY,IAAI,KAAK,EAAE,CAAC;QAC3B,MAAM,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,IAAI,EAAE,MAAM,CAAC,CAAC;QACrG,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kCAAkC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACvH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kCAAkC,EAAE,MAAM,EAAE,2CAA2C,EAAE,CAAC,CAAC;IAClH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,cAAc,CAAC,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,MAAM,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9E,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACvD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAmB,EACnB,KAAK,GAAG,KAAK;IAEb,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,MAAM,GAAG,WAAW,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QAC1D,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACzC,QAAQ,GAAG,MAAM,CAAC;YAClB,MAAM,GAAG,QAAQ,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,WAAW,CAAC;IACvB,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAA4B,CAAC;IACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACtG,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACrD,QAAQ,CAAC,UAAU,GAAG,OAAO,CAAC;IAC9B,MAAM,SAAS,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/E,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,IAAc;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/F,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,SAAS,IAAI,CAAC,CAAC;IAC9E,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kIAAkI;QAChI,kLAAkL,CACrL,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,OAAO,IAAI,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;IACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,YAAY,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,IAAI,CACrG,CAAC;IACF,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;QACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,wBAAwB,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IAC7F,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,MAAM,CAAC,KAAK;QACV,CAAC,CAAC,qEAAqE;QACvE,CAAC,CAAC,+CAA+C,CACpD,CAAC;IACF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC;QACH,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;gBACnC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;gBACzC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;oBACtB,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBACnD,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC9G,CAAC;gBACD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACpB,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC9E,CAAC;gBACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClB,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACnC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACtC,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;oBAC1F,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,EAAE,GAAG,qBAAqB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;oBAC/F,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;oBACjF,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;oBAC5E,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;wBAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,MAAM,CAAC,MAAM,qEAAqE,CAAC,CAAC;oBACnI,CAAC;gBACH,CAAC;gBACD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;oBAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;gBACzD,CAAC;qBAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC3D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;wBACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC/D,CAAC;oBACD,IAAI,MAAM,CAAC,UAAU;wBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;oBACxF,IAAI,MAAM,CAAC,QAAQ;wBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;gBACpG,CAAC;gBACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC;YACD,KAAK,SAAS;gBACZ,OAAO,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YAChC,KAAK,KAAK;gBACR,MAAM,cAAc,EAAE,CAAC;gBACvB,OAAO,CAAC,CAAC;YACX,KAAK,MAAM;gBACT,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7B,KAAK,QAAQ;gBACX,OAAO,MAAM,SAAS,EAAE,CAAC;YAC3B,KAAK,WAAW,CAAC;YACjB,KAAK,IAAI,CAAC;YACV,KAAK,SAAS;gBACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,IAAI,CAAC,CAAC;gBAC9C,OAAO,CAAC,CAAC;YACX,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI,CAAC;YACV,KAAK,MAAM,CAAC;YACZ,KAAK,SAAS;gBACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;gBAClC,OAAO,CAAC,CAAC;YACX;gBACE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC;gBAC/D,OAAO,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzG,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CACzB,SAA6B,EAC7B,YAAoB,MAAM,CAAC,IAAI,CAAC,GAAG;IAEnC,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,SAAS,KAAK,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjC,IAAI,EAAE,CAAC,IAAI,CACT,CAAC,IAAI,EAAE,EAAE;QACP,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;QACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrH,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,10 +1,11 @@
1
1
  import { type GhostQAOptions, type GhostQAReport } from '../types.js';
2
- export declare const GHOST_QA_VERSION = "1.3.1";
2
+ export { GHOST_QA_VERSION } from './version.js';
3
3
  /**
4
- * The full ghost-qa audit: crawl + all five traps (console, network, layout,
5
- * accessibility, performance) + safe interactions, on every configured
6
- * viewport. Shared verbatim by the CLI (`ghost-qa test`), the MCP server
7
- * (`ghost_qa_audit_url`) and library consumers.
4
+ * The full ghost-qa audit: crawl + the 8-Trap Deep Browser Inspection
5
+ * Engine (console, network, layout, accessibility, performance, links,
6
+ * SEO, theme) + safe interactions, on every configured viewport and
7
+ * colour scheme. Shared verbatim by the CLI (`ghost-qa test`), the MCP
8
+ * server (`ghost_qa_audit_url`) and library consumers.
8
9
  */
9
10
  export declare function runGhostQAAudit(target: string, options: GhostQAOptions): Promise<GhostQAReport>;
10
11
  //# sourceMappingURL=audit-runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audit-runner.d.ts","sourceRoot":"","sources":["../../../src/engine/audit-runner.ts"],"names":[],"mappings":"AAQA,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,aAAa,EAInB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,gBAAgB,UAAU,CAAC;AAExC;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CA8HxB"}
1
+ {"version":3,"file":"audit-runner.d.ts","sourceRoot":"","sources":["../../../src/engine/audit-runner.ts"],"names":[],"mappings":"AAYA,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,aAAa,EAKnB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAuLxB"}
@@ -6,13 +6,19 @@ import { LayoutTrap } from '../traps/layout-trap.js';
6
6
  import { NetworkTrap } from '../traps/network-trap.js';
7
7
  import { A11yTrap } from '../traps/a11y-trap.js';
8
8
  import { PerfTrap } from '../traps/perf-trap.js';
9
+ import { LinksTrap } from '../traps/links-trap.js';
10
+ import { SeoTrap } from '../traps/seo-trap.js';
11
+ import { ThemeTrap } from '../traps/theme-trap.js';
12
+ import { computeHealthScore } from './health-score.js';
9
13
  import { dedupeIssues, makeIssue, summarise, } from '../types.js';
10
- export const GHOST_QA_VERSION = '1.3.1';
14
+ export { GHOST_QA_VERSION } from './version.js';
15
+ import { GHOST_QA_VERSION } from './version.js';
11
16
  /**
12
- * The full ghost-qa audit: crawl + all five traps (console, network, layout,
13
- * accessibility, performance) + safe interactions, on every configured
14
- * viewport. Shared verbatim by the CLI (`ghost-qa test`), the MCP server
15
- * (`ghost_qa_audit_url`) and library consumers.
17
+ * The full ghost-qa audit: crawl + the 8-Trap Deep Browser Inspection
18
+ * Engine (console, network, layout, accessibility, performance, links,
19
+ * SEO, theme) + safe interactions, on every configured viewport and
20
+ * colour scheme. Shared verbatim by the CLI (`ghost-qa test`), the MCP
21
+ * server (`ghost_qa_audit_url`) and library consumers.
16
22
  */
17
23
  export async function runGhostQAAudit(target, options) {
18
24
  const startedAt = new Date();
@@ -23,9 +29,12 @@ export async function runGhostQAAudit(target, options) {
23
29
  const session = new BrowserSession(options.headless);
24
30
  const interactions = [];
25
31
  const rawIssues = [];
32
+ const screenshots = [];
26
33
  const records = new Map();
27
34
  const crawler = new RouteCrawler(options.maxDepth, options.maxRoutes);
28
35
  const runner = new InteractionRunner(options.maxInteractionsPerPage, 250);
36
+ const colorSchemes = options.colorSchemes ?? ['light', 'dark'];
37
+ const primaryScheme = colorSchemes[0] ?? 'light';
29
38
  const visit = async (route) => {
30
39
  const discovered = new Set();
31
40
  const record = {
@@ -39,62 +48,89 @@ export async function runGhostQAAudit(target, options) {
39
48
  records.set(route.url, record);
40
49
  for (const viewport of options.viewports) {
41
50
  record.viewports.push(viewport);
42
- const page = await session.newPage(viewport);
43
- const consoleTrap = new ConsoleTrap(viewport);
44
- const networkTrap = new NetworkTrap(viewport);
45
- const layoutTrap = new LayoutTrap(viewport);
46
- const a11yTrap = new A11yTrap(viewport);
47
- const perfTrap = new PerfTrap(viewport);
48
- consoleTrap.setRoute(route.path);
49
- networkTrap.setRoute(route.path);
50
- consoleTrap.attach(page);
51
- networkTrap.attach(page);
52
- try {
53
- const response = await page.goto(route.url, {
54
- waitUntil: 'domcontentloaded',
55
- timeout: options.timeoutMs,
56
- });
57
- if (response && viewport === options.viewports[0]) {
58
- record.httpStatus = response.status();
51
+ for (const colorScheme of colorSchemes) {
52
+ const page = await session.newPage(viewport, colorScheme);
53
+ const consoleTrap = new ConsoleTrap(viewport);
54
+ const networkTrap = new NetworkTrap(viewport);
55
+ const layoutTrap = new LayoutTrap(viewport);
56
+ const a11yTrap = new A11yTrap(viewport);
57
+ const perfTrap = new PerfTrap(viewport);
58
+ const linksTrap = new LinksTrap(viewport);
59
+ const seoTrap = new SeoTrap(viewport);
60
+ const themeTrap = new ThemeTrap(viewport, colorScheme);
61
+ consoleTrap.setRoute(route.path);
62
+ networkTrap.setRoute(route.path);
63
+ consoleTrap.attach(page);
64
+ networkTrap.attach(page);
65
+ try {
66
+ const response = await page.goto(route.url, {
67
+ waitUntil: 'domcontentloaded',
68
+ timeout: options.timeoutMs,
69
+ });
70
+ if (response && viewport === options.viewports[0] && colorScheme === primaryScheme) {
71
+ record.httpStatus = response.status();
72
+ }
73
+ await page.waitForLoadState('networkidle', { timeout: 3000 }).catch(() => undefined);
74
+ await page.waitForTimeout(options.settleMs);
75
+ if (!record.title)
76
+ record.title = await page.title().catch(() => '');
77
+ // Theme Trap runs under every emulated scheme; the remaining
78
+ // traps run once per viewport (primary scheme) to keep runs fast
79
+ // and findings de-duplicated.
80
+ rawIssues.push(...(await themeTrap.collect(page, route.path)));
81
+ if (colorScheme === primaryScheme) {
82
+ rawIssues.push(...(await layoutTrap.collect(page, route.path)));
83
+ rawIssues.push(...(await a11yTrap.collect(page, route.path)));
84
+ rawIssues.push(...(await perfTrap.collect(page, route.path)));
85
+ rawIssues.push(...(await linksTrap.collect(page, route.path)));
86
+ rawIssues.push(...(await seoTrap.collect(page, route.path)));
87
+ for (const href of await RouteCrawler.extractLinks(page))
88
+ discovered.add(href);
89
+ if (options.interactions) {
90
+ const result = await runner.run(page, route.path, viewport);
91
+ interactions.push(...result.actions);
92
+ rawIssues.push(...result.issues);
93
+ for (const href of result.discoveredHrefs)
94
+ discovered.add(href);
95
+ // Interactions may have surfaced fresh console/network events
96
+ // and changed layout/perf characteristics of the page.
97
+ rawIssues.push(...(await layoutTrap.collect(page, route.path)));
98
+ rawIssues.push(...(await perfTrap.collect(page, route.path)));
99
+ }
100
+ if (options.screenshots) {
101
+ try {
102
+ const shot = await page.screenshot({ type: 'jpeg', quality: 55 });
103
+ screenshots.push({
104
+ route: route.path,
105
+ viewport,
106
+ colorScheme,
107
+ dataUri: `data:image/jpeg;base64,${shot.toString('base64')}`,
108
+ });
109
+ }
110
+ catch {
111
+ /* screenshots are evidence, never a reason to fail a run */
112
+ }
113
+ }
114
+ }
59
115
  }
60
- await page.waitForLoadState('networkidle', { timeout: 3000 }).catch(() => undefined);
61
- await page.waitForTimeout(options.settleMs);
62
- if (!record.title)
63
- record.title = await page.title().catch(() => '');
64
- rawIssues.push(...(await layoutTrap.collect(page, route.path)));
65
- rawIssues.push(...(await a11yTrap.collect(page, route.path)));
66
- rawIssues.push(...(await perfTrap.collect(page, route.path)));
67
- for (const href of await RouteCrawler.extractLinks(page))
68
- discovered.add(href);
69
- if (options.interactions) {
70
- const result = await runner.run(page, route.path, viewport);
71
- interactions.push(...result.actions);
72
- rawIssues.push(...result.issues);
73
- for (const href of result.discoveredHrefs)
74
- discovered.add(href);
75
- // Interactions may have surfaced fresh console/network events and
76
- // changed layout/perf characteristics of the page.
77
- rawIssues.push(...(await layoutTrap.collect(page, route.path)));
78
- rawIssues.push(...(await perfTrap.collect(page, route.path)));
116
+ catch (error) {
117
+ const message = error instanceof Error ? error.message : String(error);
118
+ rawIssues.push(makeIssue({
119
+ category: 'navigation',
120
+ severity: 'critical',
121
+ type: 'navigation-failed',
122
+ message: `Failed to load ${route.path} on ${viewport}: ${message.replace(/\s+/g, ' ').slice(0, 260)}. Is the dev server running at ${url.origin}?`,
123
+ route: route.path,
124
+ viewport,
125
+ url: route.url,
126
+ }));
127
+ }
128
+ finally {
129
+ rawIssues.push(...consoleTrap.issues, ...networkTrap.issues);
130
+ consoleTrap.detach();
131
+ networkTrap.detach();
132
+ await page.close().catch(() => undefined);
79
133
  }
80
- }
81
- catch (error) {
82
- const message = error instanceof Error ? error.message : String(error);
83
- rawIssues.push(makeIssue({
84
- category: 'navigation',
85
- severity: 'critical',
86
- type: 'navigation-failed',
87
- message: `Failed to load ${route.path} on ${viewport}: ${message.replace(/\s+/g, ' ').slice(0, 260)}. Is the dev server running at ${url.origin}?`,
88
- route: route.path,
89
- viewport,
90
- url: route.url,
91
- }));
92
- }
93
- finally {
94
- rawIssues.push(...consoleTrap.issues, ...networkTrap.issues);
95
- consoleTrap.detach();
96
- networkTrap.detach();
97
- await page.close().catch(() => undefined);
98
134
  }
99
135
  }
100
136
  return [...discovered];
@@ -106,11 +142,28 @@ export async function runGhostQAAudit(target, options) {
106
142
  await session.close();
107
143
  }
108
144
  const finishedAt = new Date();
109
- const issues = dedupeIssues(rawIssues);
110
145
  const routes = [...records.values()];
146
+ // Dead internal routes found during crawling (Trap 6, post-pass): a
147
+ // route the crawler reached that answered 4xx/5xx is a dead link target.
148
+ for (const route of routes) {
149
+ if (route.httpStatus && route.httpStatus >= 400) {
150
+ rawIssues.push(makeIssue({
151
+ category: 'links',
152
+ severity: route.httpStatus >= 500 ? 'critical' : 'major',
153
+ type: 'dead-link',
154
+ message: `Dead internal route discovered during crawl: ${route.path} returned HTTP ${route.httpStatus}. Fix the route or remove every link pointing at it.`,
155
+ route: route.path,
156
+ viewport: options.viewports[0] ?? 'desktop',
157
+ url: route.url,
158
+ details: { status: route.httpStatus },
159
+ }));
160
+ }
161
+ }
162
+ const issues = dedupeIssues(rawIssues);
111
163
  for (const route of routes) {
112
164
  route.issueCount = issues.filter((i) => i.route === route.path).length;
113
165
  }
166
+ const health = computeHealthScore(issues);
114
167
  const summary = summarise(routes, interactions, issues, options.failOn);
115
168
  return {
116
169
  tool: 'ghost-qa',
@@ -124,6 +177,8 @@ export async function runGhostQAAudit(target, options) {
124
177
  routes,
125
178
  interactions,
126
179
  issues,
180
+ health,
181
+ ...(screenshots.length > 0 ? { screenshots } : {}),
127
182
  summary: {
128
183
  routesCrawled: summary.routesCrawled,
129
184
  interactionsTested: summary.interactionsTested,
@@ -132,6 +187,8 @@ export async function runGhostQAAudit(target, options) {
132
187
  totalIssues: summary.totalIssues,
133
188
  bySeverity: summary.bySeverity,
134
189
  byCategory: summary.byCategory,
190
+ healthScore: health.score,
191
+ grade: health.grade,
135
192
  },
136
193
  };
137
194
  }
@@ -1 +1 @@
1
- {"version":3,"file":"audit-runner.js","sourceRoot":"","sources":["../../../src/engine/audit-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit-runner.js","sourceRoot":"","sources":["../../../src/engine/audit-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAwB,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EACL,YAAY,EACZ,SAAS,EACT,SAAS,GAOV,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,OAAuB;IAEvB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,YAAY,GAAwB,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAc,EAAE,CAAC;IAChC,MAAM,WAAW,GAAuB,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;IAEjD,MAAM,KAAK,GAAG,KAAK,EAAE,KAAsB,EAAqB,EAAE;QAChE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,MAAM,MAAM,GAAgB;YAC1B,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,EAAE;YACb,UAAU,EAAE,CAAC;SACd,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAE/B,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEhC,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;gBACvC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBAC1D,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAC9C,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAC9C,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAC5C,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACxC,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACxC,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAC1C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACtC,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBACvD,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACzB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAEzB,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;wBAC1C,SAAS,EAAE,kBAAkB;wBAC7B,OAAO,EAAE,OAAO,CAAC,SAAS;qBAC3B,CAAC,CAAC;oBACH,IAAI,QAAQ,IAAI,QAAQ,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,WAAW,KAAK,aAAa,EAAE,CAAC;wBACnF,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;oBACxC,CAAC;oBACD,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;oBACrF,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBAE5C,IAAI,CAAC,MAAM,CAAC,KAAK;wBAAE,MAAM,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;oBAErE,6DAA6D;oBAC7D,iEAAiE;oBACjE,8BAA8B;oBAC9B,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAE/D,IAAI,WAAW,KAAK,aAAa,EAAE,CAAC;wBAClC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAChE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAC9D,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAC9D,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAC/D,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAC7D,KAAK,MAAM,IAAI,IAAI,MAAM,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC;4BAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;wBAE/E,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;4BACzB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;4BAC5D,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;4BACrC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;4BACjC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,eAAe;gCAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;4BAChE,8DAA8D;4BAC9D,uDAAuD;4BACvD,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;4BAChE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAChE,CAAC;wBAED,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;4BACxB,IAAI,CAAC;gCACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;gCAClE,WAAW,CAAC,IAAI,CAAC;oCACf,KAAK,EAAE,KAAK,CAAC,IAAI;oCACjB,QAAQ;oCACR,WAAW;oCACX,OAAO,EAAE,0BAA0B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;iCAC7D,CAAC,CAAC;4BACL,CAAC;4BAAC,MAAM,CAAC;gCACP,4DAA4D;4BAC9D,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACvE,SAAS,CAAC,IAAI,CACZ,SAAS,CAAC;wBACR,QAAQ,EAAE,YAAY;wBACtB,QAAQ,EAAE,UAAU;wBACpB,IAAI,EAAE,mBAAmB;wBACzB,OAAO,EAAE,kBAAkB,KAAK,CAAC,IAAI,OAAO,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,kCAAkC,GAAG,CAAC,MAAM,GAAG;wBAClJ,KAAK,EAAE,KAAK,CAAC,IAAI;wBACjB,QAAQ;wBACR,GAAG,EAAE,KAAK,CAAC,GAAG;qBACf,CAAC,CACH,CAAC;gBACJ,CAAC;wBAAS,CAAC;oBACT,SAAS,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;oBAC7D,WAAW,CAAC,MAAM,EAAE,CAAC;oBACrB,WAAW,CAAC,MAAM,EAAE,CAAC;oBACrB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAErC,oEAAoE;IACpE,yEAAyE;IACzE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;YAChD,SAAS,CAAC,IAAI,CACZ,SAAS,CAAC;gBACR,QAAQ,EAAE,OAAO;gBACjB,QAAQ,EAAE,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO;gBACxD,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,gDAAgD,KAAK,CAAC,IAAI,kBAAkB,KAAK,CAAC,UAAU,sDAAsD;gBAC3J,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS;gBAC3C,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE;aACtC,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACvC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IACzE,CAAC;IACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAExE,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,gBAAgB;QACzB,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE;QACzB,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE;QAClC,UAAU,EAAE,UAAU,CAAC,WAAW,EAAE;QACpC,UAAU,EAAE,UAAU,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE;QACtD,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO;QACP,MAAM;QACN,YAAY;QACZ,MAAM;QACN,MAAM;QACN,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE;YACP,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;YAChD,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,WAAW,EAAE,MAAM,CAAC,KAAK;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB;KACF,CAAC;AACJ,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { type BrowserContext, type Page } from 'playwright';
2
- import type { ViewportName } from '../types.js';
2
+ import type { ColorScheme, ViewportName } from '../types.js';
3
3
  export interface ViewportProfile {
4
4
  name: ViewportName;
5
5
  width: number;
@@ -25,8 +25,8 @@ export declare class BrowserSession {
25
25
  constructor(headless?: boolean);
26
26
  launch(): Promise<void>;
27
27
  get isLaunched(): boolean;
28
- contextFor(viewport: ViewportName): Promise<BrowserContext>;
29
- newPage(viewport: ViewportName): Promise<Page>;
28
+ contextFor(viewport: ViewportName, colorScheme?: ColorScheme): Promise<BrowserContext>;
29
+ newPage(viewport: ViewportName, colorScheme?: ColorScheme): Promise<Page>;
30
30
  close(): Promise<void>;
31
31
  }
32
32
  /** Lightweight launch smoke-test used by `ghost-qa doctor`. */
@@ -1 +1 @@
1
- {"version":3,"file":"browser-session.d.ts","sourceRoot":"","sources":["../../../src/engine/browser-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,cAAc,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,YAAY,EAAE,eAAe,CAmBnE,CAAC;AAEF,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,KAAK,CAAC,EAAE,OAAO;CAQ5B;AAED;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAEvB,QAAQ,UAAO;IAIrB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB7B,IAAI,UAAU,IAAI,OAAO,CAExB;IAEK,UAAU,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;IAiB3D,OAAO,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B;AAED,+DAA+D;AAC/D,wBAAsB,gBAAgB,IAAI,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAiBjF"}
1
+ {"version":3,"file":"browser-session.d.ts","sourceRoot":"","sources":["../../../src/engine/browser-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,cAAc,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,YAAY,EAAE,eAAe,CA6BnE,CAAC;AAEF,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,KAAK,CAAC,EAAE,OAAO;CAQ5B;AAED;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAEvB,QAAQ,UAAO;IAIrB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB7B,IAAI,UAAU,IAAI,OAAO,CAExB;IAEK,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,GAAE,WAAqB,GAAG,OAAO,CAAC,cAAc,CAAC;IAmB/F,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,GAAE,WAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B;AAED,+DAA+D;AAC/D,wBAAsB,gBAAgB,IAAI,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAiBjF"}