agent-eval-opencode 0.10.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.
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +590 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agents/claude-code.d.ts +12 -0
- package/dist/lib/agents/claude-code.d.ts.map +1 -0
- package/dist/lib/agents/claude-code.js +231 -0
- package/dist/lib/agents/claude-code.js.map +1 -0
- package/dist/lib/agents/codex.d.ts +12 -0
- package/dist/lib/agents/codex.d.ts.map +1 -0
- package/dist/lib/agents/codex.js +267 -0
- package/dist/lib/agents/codex.js.map +1 -0
- package/dist/lib/agents/cursor.d.ts +10 -0
- package/dist/lib/agents/cursor.d.ts.map +1 -0
- package/dist/lib/agents/cursor.js +204 -0
- package/dist/lib/agents/cursor.js.map +1 -0
- package/dist/lib/agents/gemini.d.ts +10 -0
- package/dist/lib/agents/gemini.d.ts.map +1 -0
- package/dist/lib/agents/gemini.js +207 -0
- package/dist/lib/agents/gemini.js.map +1 -0
- package/dist/lib/agents/index.d.ts +7 -0
- package/dist/lib/agents/index.d.ts.map +1 -0
- package/dist/lib/agents/index.js +20 -0
- package/dist/lib/agents/index.js.map +1 -0
- package/dist/lib/agents/opencode.d.ts +11 -0
- package/dist/lib/agents/opencode.d.ts.map +1 -0
- package/dist/lib/agents/opencode.js +245 -0
- package/dist/lib/agents/opencode.js.map +1 -0
- package/dist/lib/agents/registry.d.ts +23 -0
- package/dist/lib/agents/registry.d.ts.map +1 -0
- package/dist/lib/agents/registry.js +35 -0
- package/dist/lib/agents/registry.js.map +1 -0
- package/dist/lib/agents/shared.d.ts +83 -0
- package/dist/lib/agents/shared.d.ts.map +1 -0
- package/dist/lib/agents/shared.js +192 -0
- package/dist/lib/agents/shared.js.map +1 -0
- package/dist/lib/agents/types.d.ts +73 -0
- package/dist/lib/agents/types.d.ts.map +1 -0
- package/dist/lib/agents/types.js +5 -0
- package/dist/lib/agents/types.js.map +1 -0
- package/dist/lib/classifier.d.ts +89 -0
- package/dist/lib/classifier.d.ts.map +1 -0
- package/dist/lib/classifier.js +285 -0
- package/dist/lib/classifier.js.map +1 -0
- package/dist/lib/config.d.ts +37 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +187 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/dashboard.d.ts +65 -0
- package/dist/lib/dashboard.d.ts.map +1 -0
- package/dist/lib/dashboard.js +237 -0
- package/dist/lib/dashboard.js.map +1 -0
- package/dist/lib/docker-sandbox.d.ts +92 -0
- package/dist/lib/docker-sandbox.d.ts.map +1 -0
- package/dist/lib/docker-sandbox.js +375 -0
- package/dist/lib/docker-sandbox.js.map +1 -0
- package/dist/lib/fingerprint.d.ts +15 -0
- package/dist/lib/fingerprint.d.ts.map +1 -0
- package/dist/lib/fingerprint.js +59 -0
- package/dist/lib/fingerprint.js.map +1 -0
- package/dist/lib/fixture.d.ts +55 -0
- package/dist/lib/fixture.d.ts.map +1 -0
- package/dist/lib/fixture.js +215 -0
- package/dist/lib/fixture.js.map +1 -0
- package/dist/lib/housekeeping.d.ts +26 -0
- package/dist/lib/housekeeping.d.ts.map +1 -0
- package/dist/lib/housekeeping.js +170 -0
- package/dist/lib/housekeeping.js.map +1 -0
- package/dist/lib/init.d.ts +21 -0
- package/dist/lib/init.d.ts.map +1 -0
- package/dist/lib/init.js +275 -0
- package/dist/lib/init.js.map +1 -0
- package/dist/lib/o11y/index.d.ts +13 -0
- package/dist/lib/o11y/index.d.ts.map +1 -0
- package/dist/lib/o11y/index.js +13 -0
- package/dist/lib/o11y/index.js.map +1 -0
- package/dist/lib/o11y/parsers/claude-code.d.ts +18 -0
- package/dist/lib/o11y/parsers/claude-code.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/claude-code.js +343 -0
- package/dist/lib/o11y/parsers/claude-code.js.map +1 -0
- package/dist/lib/o11y/parsers/codex.d.ts +17 -0
- package/dist/lib/o11y/parsers/codex.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/codex.js +364 -0
- package/dist/lib/o11y/parsers/codex.js.map +1 -0
- package/dist/lib/o11y/parsers/cursor.d.ts +21 -0
- package/dist/lib/o11y/parsers/cursor.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/cursor.js +226 -0
- package/dist/lib/o11y/parsers/cursor.js.map +1 -0
- package/dist/lib/o11y/parsers/gemini.d.ts +21 -0
- package/dist/lib/o11y/parsers/gemini.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/gemini.js +241 -0
- package/dist/lib/o11y/parsers/gemini.js.map +1 -0
- package/dist/lib/o11y/parsers/index.d.ts +55 -0
- package/dist/lib/o11y/parsers/index.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/index.js +284 -0
- package/dist/lib/o11y/parsers/index.js.map +1 -0
- package/dist/lib/o11y/parsers/opencode.d.ts +17 -0
- package/dist/lib/o11y/parsers/opencode.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/opencode.js +320 -0
- package/dist/lib/o11y/parsers/opencode.js.map +1 -0
- package/dist/lib/o11y/types.d.ts +113 -0
- package/dist/lib/o11y/types.d.ts.map +1 -0
- package/dist/lib/o11y/types.js +6 -0
- package/dist/lib/o11y/types.js.map +1 -0
- package/dist/lib/results.d.ts +91 -0
- package/dist/lib/results.d.ts.map +1 -0
- package/dist/lib/results.js +361 -0
- package/dist/lib/results.js.map +1 -0
- package/dist/lib/runner.d.ts +71 -0
- package/dist/lib/runner.d.ts.map +1 -0
- package/dist/lib/runner.js +267 -0
- package/dist/lib/runner.js.map +1 -0
- package/dist/lib/sandbox.d.ts +173 -0
- package/dist/lib/sandbox.d.ts.map +1 -0
- package/dist/lib/sandbox.js +337 -0
- package/dist/lib/sandbox.js.map +1 -0
- package/dist/lib/types.d.ts +258 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +15 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/test-setup.d.ts +2 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +6 -0
- package/dist/test-setup.js.map +1 -0
- package/package.json +72 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;GAEG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI entry point for the eval framework.
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { config as dotenvConfig } from 'dotenv';
|
|
7
|
+
import { resolve, dirname, basename } from 'path';
|
|
8
|
+
import { existsSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'fs';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
import chalk from 'chalk';
|
|
11
|
+
import { loadConfig, resolveEvalNames } from './lib/config.js';
|
|
12
|
+
import { loadAllFixtures } from './lib/fixture.js';
|
|
13
|
+
import { runExperiment, StartRateLimiter } from './lib/runner.js';
|
|
14
|
+
import { Dashboard, createConsoleProgressHandler } from './lib/dashboard.js';
|
|
15
|
+
import { initProject, getPostInitInstructions } from './lib/init.js';
|
|
16
|
+
import { getAgent } from './lib/agents/index.js';
|
|
17
|
+
import { getSandboxBackendInfo } from './lib/sandbox.js';
|
|
18
|
+
import { computeFingerprint } from './lib/fingerprint.js';
|
|
19
|
+
import { scanReusableResults } from './lib/results.js';
|
|
20
|
+
import { isClassifierEnabled, classifyFailure } from './lib/classifier.js';
|
|
21
|
+
import { housekeep } from './lib/housekeeping.js';
|
|
22
|
+
import { spawnSync } from 'child_process';
|
|
23
|
+
import { minimatch } from 'minimatch';
|
|
24
|
+
import pLimit from 'p-limit';
|
|
25
|
+
// Load environment variables (.env.local first, then .env as fallback)
|
|
26
|
+
dotenvConfig({ path: '.env.local' });
|
|
27
|
+
dotenvConfig();
|
|
28
|
+
// Read version from package.json
|
|
29
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
30
|
+
const pkg = JSON.parse(readFileSync(resolve(__dirname, '../package.json'), 'utf-8'));
|
|
31
|
+
const program = new Command();
|
|
32
|
+
program.enablePositionalOptions();
|
|
33
|
+
program
|
|
34
|
+
.name('@vercel/agent-eval')
|
|
35
|
+
.description('Framework for testing AI coding agents in isolated sandboxes')
|
|
36
|
+
.version(pkg.version);
|
|
37
|
+
/**
|
|
38
|
+
* Resolve config path shorthand.
|
|
39
|
+
* - "cc" -> "experiments/cc.ts"
|
|
40
|
+
* - "experiments/cc.ts" -> "experiments/cc.ts" (unchanged)
|
|
41
|
+
*/
|
|
42
|
+
function resolveConfigPath(input) {
|
|
43
|
+
// If it already has a path separator or extension, use as-is
|
|
44
|
+
if (input.includes('/') || input.includes('\\') || input.endsWith('.ts') || input.endsWith('.js')) {
|
|
45
|
+
return input;
|
|
46
|
+
}
|
|
47
|
+
// Otherwise, treat as shorthand: "cc" -> "experiments/cc.ts"
|
|
48
|
+
return `experiments/${input}.ts`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Run experiment command handler
|
|
52
|
+
*/
|
|
53
|
+
async function runExperimentCommand(configInput, options) {
|
|
54
|
+
try {
|
|
55
|
+
const configPath = resolveConfigPath(configInput);
|
|
56
|
+
const absoluteConfigPath = resolve(process.cwd(), configPath);
|
|
57
|
+
if (!existsSync(absoluteConfigPath)) {
|
|
58
|
+
console.error(chalk.red(`Config file not found: ${absoluteConfigPath}`));
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
console.log(chalk.blue(`Loading config from ${configPath}...`));
|
|
62
|
+
const config = await loadConfig(absoluteConfigPath);
|
|
63
|
+
// Discover evals - infer from config file location
|
|
64
|
+
// Config at project/experiments/foo.ts -> evals at project/evals/
|
|
65
|
+
const projectDir = dirname(dirname(absoluteConfigPath));
|
|
66
|
+
const evalsDir = resolve(projectDir, 'evals');
|
|
67
|
+
if (!existsSync(evalsDir)) {
|
|
68
|
+
console.error(chalk.red(`Evals directory not found: ${evalsDir}`));
|
|
69
|
+
console.error(chalk.gray(`Expected evals/ to be sibling to experiments/ directory`));
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
console.log(chalk.blue(`Discovering evals in ${evalsDir}...`));
|
|
73
|
+
const { fixtures, errors } = loadAllFixtures(evalsDir);
|
|
74
|
+
if (errors.length > 0) {
|
|
75
|
+
console.log(chalk.yellow(`\nWarning: ${errors.length} invalid fixture(s):`));
|
|
76
|
+
for (const error of errors) {
|
|
77
|
+
console.log(chalk.yellow(` - ${error.fixtureName}: ${error.message}`));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (fixtures.length === 0) {
|
|
81
|
+
console.error(chalk.red('No valid eval fixtures found'));
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
// Resolve which evals to run
|
|
85
|
+
const availableNames = fixtures.map((f) => f.name);
|
|
86
|
+
const evalNames = resolveEvalNames(config.evals, availableNames);
|
|
87
|
+
if (evalNames.length === 0) {
|
|
88
|
+
console.error(chalk.red('No evals matched the filter'));
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
// Smoke mode: pick first eval alphabetically, override runs to 1
|
|
92
|
+
const smokeEvalNames = options.smoke ? [evalNames.sort()[0]] : evalNames;
|
|
93
|
+
const smokeRuns = options.smoke ? 1 : config.runs;
|
|
94
|
+
if (options.smoke) {
|
|
95
|
+
console.log(chalk.yellow(`\n[SMOKE TEST] Running 1 eval to verify setup: ${smokeEvalNames[0]}`));
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
console.log(chalk.green(`\nFound ${fixtures.length} valid fixture(s), will run ${evalNames.length}:`));
|
|
99
|
+
for (const name of evalNames) {
|
|
100
|
+
console.log(chalk.green(` - ${name}`));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const models = Array.isArray(config.model) ? config.model : [config.model];
|
|
104
|
+
// Show info for all models
|
|
105
|
+
const totalRunsPerModel = smokeEvalNames.length * smokeRuns;
|
|
106
|
+
const totalRuns = totalRunsPerModel * models.length;
|
|
107
|
+
if (models.length > 1) {
|
|
108
|
+
console.log(chalk.blue(`\nRunning ${smokeEvalNames.length} eval(s) x ${smokeRuns} run(s) x ${models.length} model(s) = ${totalRuns} total runs`));
|
|
109
|
+
console.log(chalk.blue(`Agent: ${config.agent}, Models: ${models.join(', ')}, Timeout: ${config.timeout}s, Early Exit: ${config.earlyExit}`));
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.log(chalk.blue(`\nRunning ${smokeEvalNames.length} eval(s) x ${smokeRuns} run(s) = ${totalRuns} total runs`));
|
|
113
|
+
console.log(chalk.blue(`Agent: ${config.agent}, Model: ${models[0]}, Timeout: ${config.timeout}s, Early Exit: ${config.earlyExit}`));
|
|
114
|
+
}
|
|
115
|
+
// Show which sandbox backend will be used
|
|
116
|
+
const sandboxInfo = getSandboxBackendInfo({ backend: config.sandbox });
|
|
117
|
+
console.log(chalk.blue(`Sandbox: ${sandboxInfo.description}`));
|
|
118
|
+
if (options.dry) {
|
|
119
|
+
console.log(chalk.yellow('\n[DRY RUN] Would execute evals here'));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
// Get the agent to check for required API key
|
|
123
|
+
const agent = getAgent(config.agent);
|
|
124
|
+
const apiKeyEnvVar = agent.getApiKeyEnvVar();
|
|
125
|
+
let apiKey = '';
|
|
126
|
+
if (apiKeyEnvVar) {
|
|
127
|
+
apiKey = process.env[apiKeyEnvVar] ?? process.env.VERCEL_OIDC_TOKEN ?? '';
|
|
128
|
+
if (!apiKey) {
|
|
129
|
+
console.error(chalk.red(`${apiKeyEnvVar} (or VERCEL_OIDC_TOKEN) environment variable is required`));
|
|
130
|
+
console.error(chalk.gray(`Get your API key at: https://vercel.com/dashboard -> AI Gateway`));
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Filter fixtures to only the ones we want to run
|
|
135
|
+
const selectedFixtures = fixtures.filter((f) => smokeEvalNames.includes(f.name));
|
|
136
|
+
// Get experiment name from config file
|
|
137
|
+
const baseExperimentName = basename(configPath, '.ts').replace(/\.js$/, '');
|
|
138
|
+
const resultsDir = resolve(process.cwd(), 'results');
|
|
139
|
+
console.log(chalk.blue('\nStarting experiment...'));
|
|
140
|
+
// Run experiments for each model
|
|
141
|
+
let allPassed = true;
|
|
142
|
+
for (const model of models) {
|
|
143
|
+
// Create a config for this specific model (with smoke overrides if applicable)
|
|
144
|
+
const modelConfig = { ...config, model, runs: smokeRuns };
|
|
145
|
+
// Include model in experiment name for organized results
|
|
146
|
+
const experimentName = `${baseExperimentName}/${model}`;
|
|
147
|
+
if (models.length > 1) {
|
|
148
|
+
console.log(chalk.blue(`\n--- Running with model: ${model} ---`));
|
|
149
|
+
}
|
|
150
|
+
// Run the experiment
|
|
151
|
+
const results = await runExperiment({
|
|
152
|
+
config: modelConfig,
|
|
153
|
+
fixtures: selectedFixtures,
|
|
154
|
+
apiKey,
|
|
155
|
+
resultsDir,
|
|
156
|
+
experimentName,
|
|
157
|
+
smoke: options.smoke,
|
|
158
|
+
onProgress: createConsoleProgressHandler({
|
|
159
|
+
experimentName,
|
|
160
|
+
model,
|
|
161
|
+
agent: config.agent,
|
|
162
|
+
}),
|
|
163
|
+
});
|
|
164
|
+
// Check if this experiment passed
|
|
165
|
+
const experimentPassed = results.evals.every((e) => e.passedRuns === e.totalRuns);
|
|
166
|
+
if (!experimentPassed) {
|
|
167
|
+
allPassed = false;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Exit with appropriate code
|
|
171
|
+
process.exit(allPassed ? 0 : 1);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
if (error instanceof Error) {
|
|
175
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
console.error(chalk.red('An unknown error occurred'));
|
|
179
|
+
}
|
|
180
|
+
process.exit(1);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* init command - Create a new eval project
|
|
185
|
+
*/
|
|
186
|
+
program
|
|
187
|
+
.command('init')
|
|
188
|
+
.argument('<name>', 'Name of the project to create')
|
|
189
|
+
.description('Create a new eval project with example fixtures')
|
|
190
|
+
.action(async (name) => {
|
|
191
|
+
try {
|
|
192
|
+
console.log(chalk.blue(`Creating new eval project: ${name}`));
|
|
193
|
+
const projectDir = initProject({
|
|
194
|
+
name,
|
|
195
|
+
targetDir: process.cwd(),
|
|
196
|
+
});
|
|
197
|
+
console.log(chalk.green('Project created successfully!'));
|
|
198
|
+
console.log(getPostInitInstructions(projectDir, name));
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
if (error instanceof Error) {
|
|
202
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
console.error(chalk.red('An unknown error occurred'));
|
|
206
|
+
}
|
|
207
|
+
process.exit(1);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
/**
|
|
211
|
+
* playground command - Launch the web-based results viewer
|
|
212
|
+
* Spawns @vercel/agent-eval-playground (downloaded on-demand via npx if not installed)
|
|
213
|
+
*/
|
|
214
|
+
program
|
|
215
|
+
.command('playground')
|
|
216
|
+
.description('Launch the web-based playground for browsing experiment results')
|
|
217
|
+
.option('--port <port>', 'HTTP server port', '3000')
|
|
218
|
+
.option('--results-dir <dir>', 'Path to results directory', './results')
|
|
219
|
+
.option('--evals-dir <dir>', 'Path to evals directory', './evals')
|
|
220
|
+
.option('--watch', 'Enable live mode — watch results directory for changes')
|
|
221
|
+
.action(async (options) => {
|
|
222
|
+
const resultsDir = resolve(process.cwd(), options.resultsDir);
|
|
223
|
+
const evalsDir = resolve(process.cwd(), options.evalsDir);
|
|
224
|
+
console.log(chalk.blue('Starting Agent Eval Playground...'));
|
|
225
|
+
// Build args for the playground CLI
|
|
226
|
+
const playgroundArgs = [
|
|
227
|
+
'--results-dir', resultsDir,
|
|
228
|
+
'--evals-dir', evalsDir,
|
|
229
|
+
'--port', options.port,
|
|
230
|
+
];
|
|
231
|
+
if (options.watch) {
|
|
232
|
+
playgroundArgs.push('--watch');
|
|
233
|
+
}
|
|
234
|
+
// Try to run the playground package directly, fall back to npx
|
|
235
|
+
const result = spawnSync('npx', ['@vercel/agent-eval-playground', ...playgroundArgs], { stdio: 'inherit', cwd: process.cwd() });
|
|
236
|
+
process.exit(result.status ?? 1);
|
|
237
|
+
});
|
|
238
|
+
/**
|
|
239
|
+
* Run-all handler: discover and run all experiments with fingerprint reuse
|
|
240
|
+
* and classification. Used by both `run-all` subcommand and the default
|
|
241
|
+
* (no-args) invocation.
|
|
242
|
+
*/
|
|
243
|
+
async function runAllCommand(experimentArgs, options) {
|
|
244
|
+
try {
|
|
245
|
+
const projectDir = process.cwd();
|
|
246
|
+
const experimentsDir = resolve(projectDir, 'experiments');
|
|
247
|
+
const evalsDir = resolve(projectDir, 'evals');
|
|
248
|
+
const resultsDir = resolve(projectDir, 'results');
|
|
249
|
+
if (!existsSync(experimentsDir)) {
|
|
250
|
+
console.error(chalk.red('experiments/ directory not found'));
|
|
251
|
+
process.exit(1);
|
|
252
|
+
}
|
|
253
|
+
if (!existsSync(evalsDir)) {
|
|
254
|
+
console.error(chalk.red('evals/ directory not found'));
|
|
255
|
+
process.exit(1);
|
|
256
|
+
}
|
|
257
|
+
// Discover experiments
|
|
258
|
+
const allExperimentFiles = readdirSync(experimentsDir)
|
|
259
|
+
.filter((f) => f.endsWith('.ts') && !f.startsWith('_temp_'))
|
|
260
|
+
.sort();
|
|
261
|
+
// Filter by args if provided
|
|
262
|
+
let selectedFiles;
|
|
263
|
+
if (experimentArgs.length > 0) {
|
|
264
|
+
selectedFiles = allExperimentFiles.filter((f) => {
|
|
265
|
+
const name = f.replace(/\.ts$/, '');
|
|
266
|
+
return experimentArgs.some((arg) => arg.includes('*') ? minimatch(name, arg) : name === arg);
|
|
267
|
+
});
|
|
268
|
+
if (selectedFiles.length === 0) {
|
|
269
|
+
console.error(chalk.red(`No experiments matched: ${experimentArgs.join(', ')}`));
|
|
270
|
+
console.error(chalk.gray(`Available: ${allExperimentFiles.map((f) => f.replace(/\.ts$/, '')).join(', ')}`));
|
|
271
|
+
process.exit(1);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
selectedFiles = allExperimentFiles;
|
|
276
|
+
}
|
|
277
|
+
console.log(chalk.blue(`Discovered ${selectedFiles.length} experiment(s):`));
|
|
278
|
+
for (const f of selectedFiles) {
|
|
279
|
+
console.log(chalk.blue(` - ${f.replace(/\.ts$/, '')}`));
|
|
280
|
+
}
|
|
281
|
+
// Load all fixtures
|
|
282
|
+
const { fixtures, errors } = loadAllFixtures(evalsDir);
|
|
283
|
+
if (errors.length > 0) {
|
|
284
|
+
console.log(chalk.yellow(`\nWarning: ${errors.length} invalid fixture(s)`));
|
|
285
|
+
}
|
|
286
|
+
if (fixtures.length === 0) {
|
|
287
|
+
console.error(chalk.red('No valid eval fixtures found'));
|
|
288
|
+
process.exit(1);
|
|
289
|
+
}
|
|
290
|
+
// --- Dry run: collect info and print a single summary table ---
|
|
291
|
+
if (options.dry) {
|
|
292
|
+
const dryResults = [];
|
|
293
|
+
for (const file of selectedFiles) {
|
|
294
|
+
const configPath = resolve(experimentsDir, file);
|
|
295
|
+
const baseExperimentName = file.replace(/\.ts$/, '');
|
|
296
|
+
let config;
|
|
297
|
+
try {
|
|
298
|
+
config = await loadConfig(configPath);
|
|
299
|
+
}
|
|
300
|
+
catch (err) {
|
|
301
|
+
console.error(chalk.red(`Failed to load ${file}: ${err instanceof Error ? err.message : err}`));
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
const models = Array.isArray(config.model) ? config.model : [config.model];
|
|
305
|
+
const availableNames = fixtures.map((f) => f.name);
|
|
306
|
+
let evalNames;
|
|
307
|
+
try {
|
|
308
|
+
evalNames = resolveEvalNames(config.evals, availableNames);
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
evalNames = availableNames;
|
|
312
|
+
}
|
|
313
|
+
if (options.smoke) {
|
|
314
|
+
evalNames = [evalNames.sort()[0]];
|
|
315
|
+
}
|
|
316
|
+
for (const model of models) {
|
|
317
|
+
const experimentName = models.length > 1
|
|
318
|
+
? `${baseExperimentName}/${model}`
|
|
319
|
+
: baseExperimentName;
|
|
320
|
+
const modelConfig = { ...config, model, runs: options.smoke ? 1 : config.runs };
|
|
321
|
+
const selectedFixtures = fixtures.filter((f) => evalNames.includes(f.name));
|
|
322
|
+
const fingerprints = {};
|
|
323
|
+
for (const fixture of selectedFixtures) {
|
|
324
|
+
fingerprints[fixture.name] = computeFingerprint(fixture.path, modelConfig);
|
|
325
|
+
}
|
|
326
|
+
let fixturesToRun = selectedFixtures;
|
|
327
|
+
if (!options.force && !options.smoke) {
|
|
328
|
+
const reusable = scanReusableResults(resultsDir, experimentName, fingerprints);
|
|
329
|
+
if (reusable.size > 0) {
|
|
330
|
+
fixturesToRun = selectedFixtures.filter((f) => !reusable.has(f.name));
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
dryResults.push({
|
|
334
|
+
name: experimentName,
|
|
335
|
+
toRun: fixturesToRun.map((f) => f.name),
|
|
336
|
+
cached: selectedFixtures.length - fixturesToRun.length,
|
|
337
|
+
total: selectedFixtures.length,
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// Print summary
|
|
342
|
+
const totalToRun = dryResults.reduce((sum, d) => sum + d.toRun.length, 0);
|
|
343
|
+
const totalCached = dryResults.reduce((sum, d) => sum + d.cached, 0);
|
|
344
|
+
const nameWidth = Math.max(...dryResults.map((d) => d.name.length)) + 2;
|
|
345
|
+
console.log('');
|
|
346
|
+
if (totalToRun === 0) {
|
|
347
|
+
console.log(chalk.green(` All ${totalCached} evals cached across ${dryResults.length} experiments. Nothing to run.`));
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
console.log(chalk.bold(` ${totalToRun} evals to run, ${totalCached} cached\n`));
|
|
351
|
+
for (const d of dryResults) {
|
|
352
|
+
const label = d.name.padEnd(nameWidth);
|
|
353
|
+
if (d.toRun.length === 0) {
|
|
354
|
+
console.log(chalk.gray(` ${label} ${d.total} cached`));
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
console.log(chalk.white(` ${label}`) +
|
|
358
|
+
chalk.blue(` ${d.toRun.length} to run`) +
|
|
359
|
+
(d.cached > 0 ? chalk.gray(`, ${d.cached} cached`) : ''));
|
|
360
|
+
for (const name of d.toRun) {
|
|
361
|
+
console.log(chalk.green(` ${' '.repeat(nameWidth)} → ${name}`));
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
console.log('');
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
// --- Live run ---
|
|
370
|
+
const useDashboard = process.stdout.isTTY && selectedFiles.length > 1;
|
|
371
|
+
const dashboard = useDashboard ? new Dashboard() : null;
|
|
372
|
+
if (dashboard) {
|
|
373
|
+
dashboard.start();
|
|
374
|
+
}
|
|
375
|
+
// Warn if classifier is disabled
|
|
376
|
+
if (!isClassifierEnabled()) {
|
|
377
|
+
console.log(chalk.yellow('\n⚠️ Classifier disabled: Neither AI_GATEWAY_API_KEY nor VERCEL_OIDC_TOKEN is set.\n' +
|
|
378
|
+
' The classifier automatically identifies why evals failed (model error, infrastructure issue, or timeout).\n' +
|
|
379
|
+
' Without it, all failed results are kept as-is and housekeeping will not remove non-model failures.\n' +
|
|
380
|
+
' Set AI_GATEWAY_API_KEY or VERCEL_OIDC_TOKEN to enable classifier for cleaner result management.\n'));
|
|
381
|
+
}
|
|
382
|
+
// Rate-limit sandbox starts across all experiments to avoid 429s (20 starts per 2 seconds)
|
|
383
|
+
const rateLimiter = new StartRateLimiter(20, 2_000);
|
|
384
|
+
let allPassed = true;
|
|
385
|
+
const experimentPromises = selectedFiles.map(async (file) => {
|
|
386
|
+
const configPath = resolve(experimentsDir, file);
|
|
387
|
+
const baseExperimentName = file.replace(/\.ts$/, '');
|
|
388
|
+
let config;
|
|
389
|
+
try {
|
|
390
|
+
config = await loadConfig(configPath);
|
|
391
|
+
}
|
|
392
|
+
catch (err) {
|
|
393
|
+
console.error(chalk.red(`Failed to load ${file}: ${err instanceof Error ? err.message : err}`));
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
const models = Array.isArray(config.model) ? config.model : [config.model];
|
|
397
|
+
const availableNames = fixtures.map((f) => f.name);
|
|
398
|
+
let evalNames;
|
|
399
|
+
try {
|
|
400
|
+
evalNames = resolveEvalNames(config.evals, availableNames);
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
evalNames = availableNames;
|
|
404
|
+
}
|
|
405
|
+
if (options.smoke) {
|
|
406
|
+
evalNames = [evalNames.sort()[0]];
|
|
407
|
+
}
|
|
408
|
+
const agent = getAgent(config.agent);
|
|
409
|
+
const apiKeyEnvVar = agent.getApiKeyEnvVar();
|
|
410
|
+
let apiKey = '';
|
|
411
|
+
if (apiKeyEnvVar) {
|
|
412
|
+
apiKey = process.env[apiKeyEnvVar] ?? process.env.VERCEL_OIDC_TOKEN ?? '';
|
|
413
|
+
if (!apiKey) {
|
|
414
|
+
console.error(chalk.red(`${apiKeyEnvVar} (or VERCEL_OIDC_TOKEN) not set, skipping ${baseExperimentName}`));
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
for (const model of models) {
|
|
419
|
+
const experimentName = models.length > 1
|
|
420
|
+
? `${baseExperimentName}/${model}`
|
|
421
|
+
: baseExperimentName;
|
|
422
|
+
const modelConfig = {
|
|
423
|
+
...config,
|
|
424
|
+
model,
|
|
425
|
+
runs: options.smoke ? 1 : config.runs,
|
|
426
|
+
};
|
|
427
|
+
const selectedFixtures = fixtures.filter((f) => evalNames.includes(f.name));
|
|
428
|
+
const fingerprints = {};
|
|
429
|
+
for (const fixture of selectedFixtures) {
|
|
430
|
+
fingerprints[fixture.name] = computeFingerprint(fixture.path, modelConfig);
|
|
431
|
+
}
|
|
432
|
+
let fixturesToRun = selectedFixtures;
|
|
433
|
+
if (!options.force && !options.smoke) {
|
|
434
|
+
const reusable = scanReusableResults(resultsDir, experimentName, fingerprints);
|
|
435
|
+
if (reusable.size > 0) {
|
|
436
|
+
fixturesToRun = selectedFixtures.filter((f) => !reusable.has(f.name));
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
if (fixturesToRun.length === 0) {
|
|
440
|
+
continue;
|
|
441
|
+
}
|
|
442
|
+
// Register with dashboard or log to console
|
|
443
|
+
if (dashboard) {
|
|
444
|
+
dashboard.addExperiment(experimentName, {
|
|
445
|
+
agent: config.agent,
|
|
446
|
+
model,
|
|
447
|
+
totalEvals: fixturesToRun.length,
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
else {
|
|
451
|
+
console.log(chalk.blue(`\nRunning ${experimentName}: ${fixturesToRun.length} eval(s)`));
|
|
452
|
+
}
|
|
453
|
+
// Build the progress handler
|
|
454
|
+
const onProgress = dashboard
|
|
455
|
+
? (event) => dashboard.handleEvent(experimentName, event)
|
|
456
|
+
: createConsoleProgressHandler({ experimentName, model, agent: config.agent });
|
|
457
|
+
try {
|
|
458
|
+
const results = await runExperiment({
|
|
459
|
+
config: modelConfig,
|
|
460
|
+
fixtures: fixturesToRun,
|
|
461
|
+
apiKey: apiKey,
|
|
462
|
+
resultsDir,
|
|
463
|
+
experimentName,
|
|
464
|
+
fingerprints,
|
|
465
|
+
smoke: options.smoke,
|
|
466
|
+
onProgress,
|
|
467
|
+
rateLimiter,
|
|
468
|
+
});
|
|
469
|
+
// Classify failures (only if classifier is enabled)
|
|
470
|
+
const failedEvals = results.evals.filter((e) => e.passedRuns === 0);
|
|
471
|
+
const classifications = new Map();
|
|
472
|
+
let hasNonModelFailures = false;
|
|
473
|
+
if (isClassifierEnabled()) {
|
|
474
|
+
if (dashboard) {
|
|
475
|
+
dashboard.setPhase(experimentName, 'classifying');
|
|
476
|
+
}
|
|
477
|
+
if (failedEvals.length > 0 && !options.smoke) {
|
|
478
|
+
const timestamp = results.startedAt.replace(/:/g, '-');
|
|
479
|
+
const classifyLimit = pLimit(4);
|
|
480
|
+
let classifyingDone = 0;
|
|
481
|
+
const classifyingTotal = failedEvals.length;
|
|
482
|
+
await Promise.all(failedEvals.map((evalSummary) => classifyLimit(async () => {
|
|
483
|
+
const evalResultDir = resolve(resultsDir, experimentName, timestamp, evalSummary.name);
|
|
484
|
+
const classification = await classifyFailure(evalResultDir, evalSummary.name, experimentName);
|
|
485
|
+
classifyingDone++;
|
|
486
|
+
if (dashboard) {
|
|
487
|
+
dashboard.setClassifyingProgress(experimentName, classifyingDone, classifyingTotal);
|
|
488
|
+
}
|
|
489
|
+
if (classification) {
|
|
490
|
+
classifications.set(evalSummary.name, classification);
|
|
491
|
+
if (!dashboard) {
|
|
492
|
+
const icon = { model: ' ', infra: ' ', timeout: ' ' }[classification.failureType];
|
|
493
|
+
console.log(chalk.gray(` ${icon} ${evalSummary.name}: ${classification.failureType} — ${classification.failureReason}`));
|
|
494
|
+
}
|
|
495
|
+
if (classification.failureType !== 'model') {
|
|
496
|
+
if (options.ackFailures) {
|
|
497
|
+
classification.acknowledged = true;
|
|
498
|
+
const classificationPath = resolve(evalResultDir, 'classification.json');
|
|
499
|
+
writeFileSync(classificationPath, JSON.stringify(classification, null, 2));
|
|
500
|
+
if (!dashboard) {
|
|
501
|
+
console.log(chalk.yellow(` ✓ Acknowledged ${evalSummary.name} (${classification.failureType} failure — kept as final result)`));
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
rmSync(evalResultDir, { recursive: true });
|
|
506
|
+
if (!dashboard) {
|
|
507
|
+
console.log(chalk.gray(` 🗑️ Removed ${evalSummary.name} (${classification.failureType} failure)`));
|
|
508
|
+
}
|
|
509
|
+
hasNonModelFailures = true;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
})));
|
|
514
|
+
if (hasNonModelFailures && !dashboard) {
|
|
515
|
+
console.log(chalk.yellow(`\n To keep non-model failures as final results, re-run with --ack-failures`));
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
// Complete the experiment in the dashboard (prints permanent block)
|
|
520
|
+
if (dashboard) {
|
|
521
|
+
dashboard.completeExperiment(experimentName, results, classifications);
|
|
522
|
+
}
|
|
523
|
+
const experimentPassed = results.evals.every((e) => e.passedRuns > 0);
|
|
524
|
+
if (!experimentPassed)
|
|
525
|
+
allPassed = false;
|
|
526
|
+
}
|
|
527
|
+
catch (err) {
|
|
528
|
+
console.error(chalk.red(` Error running ${experimentName}: ${err instanceof Error ? err.message : err}`));
|
|
529
|
+
allPassed = false;
|
|
530
|
+
if (dashboard) {
|
|
531
|
+
dashboard.setPhase(experimentName, 'done');
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
// Housekeeping after each experiment
|
|
535
|
+
const stats = housekeep(resultsDir, experimentName);
|
|
536
|
+
if (stats.removedDuplicates + stats.removedIncomplete + stats.removedNonModelFailures > 0) {
|
|
537
|
+
console.log(chalk.gray(` Housekeeping: removed ${stats.removedDuplicates} duplicate(s), ${stats.removedIncomplete} incomplete, ${stats.removedNonModelFailures} non-model failure(s)`));
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
});
|
|
541
|
+
await Promise.all(experimentPromises);
|
|
542
|
+
if (dashboard) {
|
|
543
|
+
dashboard.stop();
|
|
544
|
+
}
|
|
545
|
+
process.exit(allPassed ? 0 : 1);
|
|
546
|
+
}
|
|
547
|
+
catch (error) {
|
|
548
|
+
if (error instanceof Error) {
|
|
549
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
550
|
+
}
|
|
551
|
+
else {
|
|
552
|
+
console.error(chalk.red('An unknown error occurred'));
|
|
553
|
+
}
|
|
554
|
+
process.exit(1);
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* run-all subcommand (explicit)
|
|
559
|
+
*/
|
|
560
|
+
program
|
|
561
|
+
.command('run-all')
|
|
562
|
+
.description('Discover and run all experiments with fingerprint reuse and classification')
|
|
563
|
+
.argument('[experiments...]', 'Experiment names or glob patterns (default: all)')
|
|
564
|
+
.option('--dry', 'Preview what would run without executing')
|
|
565
|
+
.option('--force', 'Ignore fingerprints, re-run everything')
|
|
566
|
+
.option('--smoke', 'Run 1 eval per experiment for sanity checking')
|
|
567
|
+
.option('--ack-failures', 'Keep non-model failures (infra/timeout) as final results instead of deleting them')
|
|
568
|
+
.action(runAllCommand);
|
|
569
|
+
/**
|
|
570
|
+
* Default command - run a single experiment, or run-all if no args given.
|
|
571
|
+
* Usage:
|
|
572
|
+
* agent-eval # runs all experiments (same as run-all)
|
|
573
|
+
* agent-eval cc # runs single experiment
|
|
574
|
+
* agent-eval cc --dry # preview single experiment
|
|
575
|
+
*/
|
|
576
|
+
program
|
|
577
|
+
.argument('[config]', 'Experiment name (e.g., "cc") or path. Omit to run all experiments.')
|
|
578
|
+
.option('--dry', 'Preview what would run without executing')
|
|
579
|
+
.option('--smoke', 'Run a single eval to verify setup (API keys, model IDs, sandbox)')
|
|
580
|
+
.option('--force', 'Ignore fingerprints, re-run everything (only applies when running all)')
|
|
581
|
+
.option('--ack-failures', 'Keep non-model failures (infra/timeout) as final results instead of deleting them')
|
|
582
|
+
.action(async (configInput, options) => {
|
|
583
|
+
if (!configInput) {
|
|
584
|
+
await runAllCommand([], options);
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
await runExperimentCommand(configInput, options);
|
|
588
|
+
});
|
|
589
|
+
program.parse();
|
|
590
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAE7E,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,MAAM,MAAM,SAAS,CAAC;AAE7B,uEAAuE;AACvE,YAAY,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;AACrC,YAAY,EAAE,CAAC;AAEf,iCAAiC;AACjC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAErF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO,CAAC,uBAAuB,EAAE,CAAC;AAElC,OAAO;KACJ,IAAI,CAAC,oBAAoB,CAAC;KAC1B,WAAW,CAAC,8DAA8D,CAAC;KAC3E,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,KAAa;IACtC,6DAA6D;IAC7D,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAClG,OAAO,KAAK,CAAC;IACf,CAAC;IACD,6DAA6D;IAC7D,OAAO,eAAe,KAAK,KAAK,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,oBAAoB,CAAC,WAAmB,EAAE,OAA2C;IAClG,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAClD,MAAM,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;QAE9D,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,kBAAkB,EAAE,CAAC,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,UAAU,KAAK,CAAC,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,kBAAkB,CAAC,CAAC;QAEpD,mDAAmD;QACnD,kEAAkE;QAClE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC,CAAC;YACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,QAAQ,KAAK,CAAC,CAAC,CAAC;QAC/D,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAEvD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,MAAM,CAAC,MAAM,sBAAsB,CAAC,CAAC,CAAC;YAC7E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,6BAA6B;QAC7B,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAEjE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,iEAAiE;QACjE,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAElD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kDAAkD,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnG,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,QAAQ,CAAC,MAAM,+BAA+B,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvG,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAEJ,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAExE,2BAA2B;QAC3B,MAAM,iBAAiB,GAAG,cAAc,CAAC,MAAM,GAAG,SAAS,CAAC;QAC5D,MAAM,SAAS,GAAG,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;QAEpD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,cAAc,CAAC,MAAM,cAAc,SAAS,aAAa,MAAM,CAAC,MAAM,eAAe,SAAS,aAAa,CAAC,CAAC,CAAC;YAClJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,aAAa,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,OAAO,kBAAkB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAChJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,cAAc,CAAC,MAAM,cAAc,SAAS,aAAa,SAAS,aAAa,CAAC,CAAC,CAAC;YACtH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,YAAY,MAAM,CAAC,CAAC,CAAC,cAAc,MAAM,CAAC,OAAO,kBAAkB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACvI,CAAC;QAED,0CAA0C;QAC1C,MAAM,WAAW,GAAG,qBAAqB,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAE/D,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,8CAA8C;QAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,YAAY,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;QAC7C,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;YAC1E,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,YAAY,0DAA0D,CAAC,CAAC,CAAC;gBACpG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC,CAAC;gBAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,kDAAkD;QAClD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEjF,uCAAuC;QACvC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;QAErD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAEpD,iCAAiC;QACjC,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,+EAA+E;YAC/E,MAAM,WAAW,GAAG,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAE1D,yDAAyD;YACzD,MAAM,cAAc,GAAG,GAAG,kBAAkB,IAAI,KAAK,EAAE,CAAC;YAExD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,KAAK,MAAM,CAAC,CAAC,CAAC;YACpE,CAAC;YAED,qBAAqB;YACrB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC;gBAClC,MAAM,EAAE,WAAW;gBACnB,QAAQ,EAAE,gBAAgB;gBAC1B,MAAM;gBACN,UAAU;gBACV,cAAc;gBACd,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,UAAU,EAAE,4BAA4B,CAAC;oBACvC,cAAc;oBACd,KAAK;oBACL,KAAK,EAAE,MAAM,CAAC,KAAK;iBACpB,CAAC;aACH,CAAC,CAAC;YAEH,kCAAkC;YAClC,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC;YAClF,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,SAAS,GAAG,KAAK,CAAC;YACpB,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,QAAQ,CAAC,QAAQ,EAAE,+BAA+B,CAAC;KACnD,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;IAC7B,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC,CAAC;QAE9D,MAAM,UAAU,GAAG,WAAW,CAAC;YAC7B,IAAI;YACJ,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE;SACzB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL;;;GAGG;AACH,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,iEAAiE,CAAC;KAC9E,MAAM,CAAC,eAAe,EAAE,kBAAkB,EAAE,MAAM,CAAC;KACnD,MAAM,CAAC,qBAAqB,EAAE,2BAA2B,EAAE,WAAW,CAAC;KACvE,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,EAAE,SAAS,CAAC;KACjE,MAAM,CAAC,SAAS,EAAE,wDAAwD,CAAC;KAC3E,MAAM,CAAC,KAAK,EAAE,OAAgF,EAAE,EAAE;IACjG,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAE7D,oCAAoC;IACpC,MAAM,cAAc,GAAG;QACrB,eAAe,EAAE,UAAU;QAC3B,aAAa,EAAE,QAAQ;QACvB,QAAQ,EAAE,OAAO,CAAC,IAAI;KACvB,CAAC;IACF,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED,+DAA+D;IAC/D,MAAM,MAAM,GAAG,SAAS,CACtB,KAAK,EACL,CAAC,+BAA+B,EAAE,GAAG,cAAc,CAAC,EACpD,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CACzC,CAAC;IAEF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEL;;;;GAIG;AACH,KAAK,UAAU,aAAa,CAAC,cAAwB,EAAE,OAAmF;IACtI,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAElD,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,uBAAuB;QACvB,MAAM,kBAAkB,GAAG,WAAW,CAAC,cAAc,CAAC;aACnD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;aAC3D,IAAI,EAAE,CAAC;QAEV,6BAA6B;QAC7B,IAAI,aAAuB,CAAC;QAC5B,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC9C,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACpC,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CACjC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CACxD,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,aAAa,GAAG,kBAAkB,CAAC;QACrC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,aAAa,CAAC,MAAM,iBAAiB,CAAC,CAAC,CAAC;QAC7E,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,oBAAoB;QACpB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,MAAM,CAAC,MAAM,qBAAqB,CAAC,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,iEAAiE;QACjE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAEhB,MAAM,UAAU,GAAiB,EAAE,CAAC;YAEpC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACjC,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;gBACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAErD,IAAI,MAAM,CAAC;gBACX,IAAI,CAAC;oBACH,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;gBACxC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBAChG,SAAS;gBACX,CAAC;gBAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC3E,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACnD,IAAI,SAAmB,CAAC;gBACxB,IAAI,CAAC;oBACH,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;gBAC7D,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS,GAAG,cAAc,CAAC;gBAC7B,CAAC;gBAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBAClB,SAAS,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpC,CAAC;gBAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;wBACtC,CAAC,CAAC,GAAG,kBAAkB,IAAI,KAAK,EAAE;wBAClC,CAAC,CAAC,kBAAkB,CAAC;oBAEvB,MAAM,WAAW,GAAG,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBAChF,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC5E,MAAM,YAAY,GAA2B,EAAE,CAAC;oBAChD,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;wBACvC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;oBAC7E,CAAC;oBAED,IAAI,aAAa,GAAG,gBAAgB,CAAC;oBACrC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;wBACrC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;wBAC/E,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;4BACtB,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;wBACxE,CAAC;oBACH,CAAC;oBAED,UAAU,CAAC,IAAI,CAAC;wBACd,IAAI,EAAE,cAAc;wBACpB,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;wBACvC,MAAM,EAAE,gBAAgB,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM;wBACtD,KAAK,EAAE,gBAAgB,CAAC,MAAM;qBAC/B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,gBAAgB;YAChB,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC1E,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACrE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;YAExE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,WAAW,wBAAwB,UAAU,CAAC,MAAM,+BAA+B,CAAC,CAAC,CAAC;YACzH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,kBAAkB,WAAW,WAAW,CAAC,CAAC,CAAC;gBACjF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;oBAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBACvC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC;oBAC1D,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC;4BACzB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;4BACvC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CACzD,CAAC;wBACF,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;4BAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;wBACnE,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,mBAAmB;QACnB,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;QACtE,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAExD,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;QAED,iCAAiC;QACjC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,uFAAuF;gBACvF,+GAA+G;gBAC/G,wGAAwG;gBACxG,qGAAqG,CACtG,CACF,CAAC;QACJ,CAAC;QAED,2FAA2F;QAC3F,MAAM,WAAW,GAAG,IAAI,gBAAgB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAEpD,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,MAAM,kBAAkB,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAErD,IAAI,MAAM,CAAC;YACX,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAChG,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3E,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,SAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;YAC7D,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS,GAAG,cAAc,CAAC;YAC7B,CAAC;YAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,SAAS,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACpC,CAAC;YAED,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,YAAY,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;YAC7C,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;gBAC1E,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,YAAY,6CAA6C,kBAAkB,EAAE,CAAC,CAAC,CAAC;oBAC3G,OAAO;gBACT,CAAC;YACH,CAAC;YAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;oBACtC,CAAC,CAAC,GAAG,kBAAkB,IAAI,KAAK,EAAE;oBAClC,CAAC,CAAC,kBAAkB,CAAC;gBAEvB,MAAM,WAAW,GAAG;oBAClB,GAAG,MAAM;oBACT,KAAK;oBACL,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI;iBACtC,CAAC;gBAEF,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5E,MAAM,YAAY,GAA2B,EAAE,CAAC;gBAChD,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;oBACvC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;gBAC7E,CAAC;gBAED,IAAI,aAAa,GAAG,gBAAgB,CAAC;gBACrC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;oBACrC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;oBAC/E,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;wBACtB,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;oBACxE,CAAC;gBACH,CAAC;gBAED,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC/B,SAAS;gBACX,CAAC;gBAED,4CAA4C;gBAC5C,IAAI,SAAS,EAAE,CAAC;oBACd,SAAS,CAAC,aAAa,CAAC,cAAc,EAAE;wBACtC,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,KAAK;wBACL,UAAU,EAAE,aAAa,CAAC,MAAM;qBACjC,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,cAAc,KAAK,aAAa,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC;gBAC1F,CAAC;gBAED,6BAA6B;gBAC7B,MAAM,UAAU,GAAmC,SAAS;oBAC1D,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC;oBACzD,CAAC,CAAC,4BAA4B,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBAEjF,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC;wBAClC,MAAM,EAAE,WAAW;wBACnB,QAAQ,EAAE,aAAa;wBACvB,MAAM,EAAE,MAAO;wBACf,UAAU;wBACV,cAAc;wBACd,YAAY;wBACZ,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,UAAU;wBACV,WAAW;qBACZ,CAAC,CAAC;oBAEH,oDAAoD;oBACpD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC;oBACpE,MAAM,eAAe,GAAG,IAAI,GAAG,EAA0B,CAAC;oBAC1D,IAAI,mBAAmB,GAAG,KAAK,CAAC;oBAEhC,IAAI,mBAAmB,EAAE,EAAE,CAAC;wBAC1B,IAAI,SAAS,EAAE,CAAC;4BACd,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;wBACpD,CAAC;wBAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;4BAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;4BACvD,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;4BAChC,IAAI,eAAe,GAAG,CAAC,CAAC;4BACxB,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,CAAC;4BAG5C,MAAM,OAAO,CAAC,GAAG,CACf,WAAW,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAC9B,aAAa,CAAC,KAAK,IAAI,EAAE;gCACvB,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;gCACvF,MAAM,cAAc,GAAG,MAAM,eAAe,CAC1C,aAAa,EACb,WAAW,CAAC,IAAI,EAChB,cAAc,CACf,CAAC;gCAEF,eAAe,EAAE,CAAC;gCAClB,IAAI,SAAS,EAAE,CAAC;oCACd,SAAS,CAAC,sBAAsB,CAAC,cAAc,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC;gCACtF,CAAC;gCAED,IAAI,cAAc,EAAE,CAAC;oCACnB,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;oCAEtD,IAAI,CAAC,SAAS,EAAE,CAAC;wCACf,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;wCACrF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,WAAW,CAAC,IAAI,KAAK,cAAc,CAAC,WAAW,MAAM,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;oCAC5H,CAAC;oCAED,IAAI,cAAc,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;wCAC3C,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;4CACxB,cAAc,CAAC,YAAY,GAAG,IAAI,CAAC;4CACnC,MAAM,kBAAkB,GAAG,OAAO,CAAC,aAAa,EAAE,qBAAqB,CAAC,CAAC;4CACzE,aAAa,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;4CAC3E,IAAI,CAAC,SAAS,EAAE,CAAC;gDACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,WAAW,CAAC,IAAI,KAAK,cAAc,CAAC,WAAW,kCAAkC,CAAC,CAAC,CAAC;4CACnI,CAAC;wCACH,CAAC;6CAAM,CAAC;4CACN,MAAM,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;4CAC3C,IAAI,CAAC,SAAS,EAAE,CAAC;gDACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,WAAW,CAAC,IAAI,KAAK,cAAc,CAAC,WAAW,WAAW,CAAC,CAAC,CAAC;4CACxG,CAAC;4CACD,mBAAmB,GAAG,IAAI,CAAC;wCAC7B,CAAC;oCACH,CAAC;gCACH,CAAC;4BACH,CAAC,CAAC,CACH,CACF,CAAC;4BAEF,IAAI,mBAAmB,IAAI,CAAC,SAAS,EAAE,CAAC;gCACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6EAA6E,CAAC,CAAC,CAAC;4BAC3G,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,oEAAoE;oBACpE,IAAI,SAAS,EAAE,CAAC;wBACd,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;oBACzE,CAAC;oBAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;oBACtE,IAAI,CAAC,gBAAgB;wBAAE,SAAS,GAAG,KAAK,CAAC;gBAC3C,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,cAAc,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBAC3G,SAAS,GAAG,KAAK,CAAC;oBAClB,IAAI,SAAS,EAAE,CAAC;wBACd,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;gBAED,qCAAqC;gBACrC,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;gBACpD,IAAI,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,uBAAuB,GAAG,CAAC,EAAE,CAAC;oBAC1F,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,2BAA2B,KAAK,CAAC,iBAAiB,kBAAkB,KAAK,CAAC,iBAAiB,gBAAgB,KAAK,CAAC,uBAAuB,uBAAuB,CAChK,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAEtC,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,4EAA4E,CAAC;KACzF,QAAQ,CAAC,kBAAkB,EAAE,kDAAkD,CAAC;KAChF,MAAM,CAAC,OAAO,EAAE,0CAA0C,CAAC;KAC3D,MAAM,CAAC,SAAS,EAAE,wCAAwC,CAAC;KAC3D,MAAM,CAAC,SAAS,EAAE,+CAA+C,CAAC;KAClE,MAAM,CAAC,gBAAgB,EAAE,mFAAmF,CAAC;KAC7G,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB;;;;;;GAMG;AACH,OAAO;KACJ,QAAQ,CAAC,UAAU,EAAE,oEAAoE,CAAC;KAC1F,MAAM,CAAC,OAAO,EAAE,0CAA0C,CAAC;KAC3D,MAAM,CAAC,SAAS,EAAE,kEAAkE,CAAC;KACrF,MAAM,CAAC,SAAS,EAAE,wEAAwE,CAAC;KAC3F,MAAM,CAAC,gBAAgB,EAAE,mFAAmF,CAAC;KAC7G,MAAM,CAAC,KAAK,EAAE,WAA+B,EAAE,OAAmF,EAAE,EAAE;IACrI,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IACD,MAAM,oBAAoB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|