@compr/contextengine-mcp 1.9.44
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/LICENSE +21 -0
- package/README.md +200 -0
- package/dist/agents.d.ts +127 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +1162 -0
- package/dist/agents.js.map +1 -0
- package/dist/cache.d.ts +15 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +117 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +227 -0
- package/dist/cli.js.map +1 -0
- package/dist/code-chunker.d.ts +12 -0
- package/dist/code-chunker.d.ts.map +1 -0
- package/dist/code-chunker.js +263 -0
- package/dist/code-chunker.js.map +1 -0
- package/dist/collectors.d.ts +63 -0
- package/dist/collectors.d.ts.map +1 -0
- package/dist/collectors.js +617 -0
- package/dist/collectors.js.map +1 -0
- package/dist/config.d.ts +59 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +213 -0
- package/dist/config.js.map +1 -0
- package/dist/embeddings.d.ts +31 -0
- package/dist/embeddings.d.ts.map +1 -0
- package/dist/embeddings.js +91 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +557 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest.d.ts +23 -0
- package/dist/ingest.d.ts.map +1 -0
- package/dist/ingest.js +79 -0
- package/dist/ingest.js.map +1 -0
- package/dist/search.d.ts +11 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +58 -0
- package/dist/search.js.map +1 -0
- package/dist/sessions.d.ts +46 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +143 -0
- package/dist/sessions.js.map +1 -0
- package/dist/test-sessions.d.ts +2 -0
- package/dist/test-sessions.d.ts.map +1 -0
- package/dist/test-sessions.js.map +1 -0
- package/dist/test.d.ts +2 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +52 -0
- package/dist/test.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,617 @@
|
|
|
1
|
+
import { execSync } from "child_process";
|
|
2
|
+
import { readFileSync, existsSync, readdirSync, statSync } from "fs";
|
|
3
|
+
import { resolve, join } from "path";
|
|
4
|
+
import { homedir } from "os";
|
|
5
|
+
/**
|
|
6
|
+
* Operational data collectors — the unique moat of ContextEngine.
|
|
7
|
+
*
|
|
8
|
+
* Each collector gathers data from a specific operational source
|
|
9
|
+
* (git, package managers, environment, shell history, running services,
|
|
10
|
+
* server configs, scheduled tasks) and returns Chunk[] in the same
|
|
11
|
+
* format as the Markdown parser so they integrate seamlessly into
|
|
12
|
+
* keyword + semantic search.
|
|
13
|
+
*
|
|
14
|
+
* Design principles:
|
|
15
|
+
* - All collectors are **read-only** and **safe** — no writes, no side effects
|
|
16
|
+
* - Failed commands produce empty arrays (never crash the server)
|
|
17
|
+
* - Sensitive values (.env passwords, tokens) are **redacted**
|
|
18
|
+
* - Each collector operates on a project directory path
|
|
19
|
+
*/
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Helpers
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
/** Run a shell command, return stdout or empty string on failure */
|
|
24
|
+
function exec(cmd, cwd) {
|
|
25
|
+
try {
|
|
26
|
+
return execSync(cmd, {
|
|
27
|
+
cwd,
|
|
28
|
+
encoding: "utf-8",
|
|
29
|
+
timeout: 10_000,
|
|
30
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
31
|
+
}).trim();
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return "";
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Check if a command exists */
|
|
38
|
+
function commandExists(cmd) {
|
|
39
|
+
return exec(`command -v ${cmd}`) !== "";
|
|
40
|
+
}
|
|
41
|
+
/** Redact sensitive values in .env content */
|
|
42
|
+
function redactSensitive(content) {
|
|
43
|
+
const sensitivePatterns = /^(.*(?:PASSWORD|SECRET|KEY|TOKEN|CREDENTIAL|AUTH|PRIVATE|API_KEY|DB_PASSWORD|MAIL_PASSWORD|JWT_SECRET|APP_KEY|ENCRYPT)[^=]*=\s*).+$/gim;
|
|
44
|
+
return content.replace(sensitivePatterns, "$1[REDACTED]");
|
|
45
|
+
}
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// 1. Git Log Collector
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
/**
|
|
50
|
+
* Collect recent git history for a project directory.
|
|
51
|
+
* Produces chunks with commit messages, authors, dates — gives AI
|
|
52
|
+
* context about recent changes and development velocity.
|
|
53
|
+
*/
|
|
54
|
+
export function collectGitLog(projectDir, sourceName) {
|
|
55
|
+
if (!existsSync(join(projectDir, ".git")))
|
|
56
|
+
return [];
|
|
57
|
+
// Recent 50 commits, one-line format with hash, date, author, message
|
|
58
|
+
const log = exec(`git --no-pager log --oneline --format="%h|%ai|%an|%s" -50`, projectDir);
|
|
59
|
+
if (!log)
|
|
60
|
+
return [];
|
|
61
|
+
const lines = log.split("\n").filter(Boolean);
|
|
62
|
+
if (lines.length === 0)
|
|
63
|
+
return [];
|
|
64
|
+
// Current branch + remote info
|
|
65
|
+
const branch = exec("git branch --show-current", projectDir) || "unknown";
|
|
66
|
+
const remotes = exec("git remote -v", projectDir);
|
|
67
|
+
const status = exec("git --no-pager diff --stat HEAD~1..HEAD", projectDir);
|
|
68
|
+
const chunks = [];
|
|
69
|
+
// Summary chunk
|
|
70
|
+
chunks.push({
|
|
71
|
+
source: `${sourceName} — git`,
|
|
72
|
+
section: "## Git Overview",
|
|
73
|
+
content: [
|
|
74
|
+
`Branch: ${branch}`,
|
|
75
|
+
`Commits shown: ${lines.length}`,
|
|
76
|
+
remotes ? `\nRemotes:\n${remotes}` : "",
|
|
77
|
+
status ? `\nLast commit changes:\n${status}` : "",
|
|
78
|
+
]
|
|
79
|
+
.filter(Boolean)
|
|
80
|
+
.join("\n"),
|
|
81
|
+
lineStart: 1,
|
|
82
|
+
lineEnd: 1,
|
|
83
|
+
});
|
|
84
|
+
// Batch commits into groups of 10 for searchable chunks
|
|
85
|
+
for (let i = 0; i < lines.length; i += 10) {
|
|
86
|
+
const batch = lines.slice(i, i + 10);
|
|
87
|
+
const formatted = batch
|
|
88
|
+
.map((line) => {
|
|
89
|
+
const [hash, date, author, ...msgParts] = line.split("|");
|
|
90
|
+
return `${hash} ${date?.split(" ")[0]} ${author}: ${msgParts.join("|")}`;
|
|
91
|
+
})
|
|
92
|
+
.join("\n");
|
|
93
|
+
chunks.push({
|
|
94
|
+
source: `${sourceName} — git`,
|
|
95
|
+
section: `## Git Log (${i + 1}-${Math.min(i + 10, lines.length)})`,
|
|
96
|
+
content: formatted,
|
|
97
|
+
lineStart: i + 1,
|
|
98
|
+
lineEnd: Math.min(i + 10, lines.length),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return chunks;
|
|
102
|
+
}
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// 2. Package.json Collector (Node.js projects)
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
/**
|
|
107
|
+
* Collect dependency and script info from package.json.
|
|
108
|
+
* Critical for version agent + understanding project capabilities.
|
|
109
|
+
*/
|
|
110
|
+
export function collectPackageJson(projectDir, sourceName) {
|
|
111
|
+
const pkgPath = join(projectDir, "package.json");
|
|
112
|
+
if (!existsSync(pkgPath))
|
|
113
|
+
return [];
|
|
114
|
+
try {
|
|
115
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
116
|
+
const chunks = [];
|
|
117
|
+
// Project identity
|
|
118
|
+
chunks.push({
|
|
119
|
+
source: `${sourceName} — package.json`,
|
|
120
|
+
section: "## Package Identity",
|
|
121
|
+
content: [
|
|
122
|
+
`Name: ${pkg.name || "unnamed"}`,
|
|
123
|
+
`Version: ${pkg.version || "0.0.0"}`,
|
|
124
|
+
pkg.description ? `Description: ${pkg.description}` : "",
|
|
125
|
+
pkg.license ? `License: ${pkg.license}` : "",
|
|
126
|
+
pkg.engines
|
|
127
|
+
? `Engines: ${JSON.stringify(pkg.engines)}`
|
|
128
|
+
: "",
|
|
129
|
+
pkg.type ? `Module type: ${pkg.type}` : "",
|
|
130
|
+
]
|
|
131
|
+
.filter(Boolean)
|
|
132
|
+
.join("\n"),
|
|
133
|
+
lineStart: 1,
|
|
134
|
+
lineEnd: 1,
|
|
135
|
+
});
|
|
136
|
+
// Scripts
|
|
137
|
+
if (pkg.scripts && Object.keys(pkg.scripts).length > 0) {
|
|
138
|
+
chunks.push({
|
|
139
|
+
source: `${sourceName} — package.json`,
|
|
140
|
+
section: "## npm Scripts",
|
|
141
|
+
content: Object.entries(pkg.scripts)
|
|
142
|
+
.map(([k, v]) => `${k}: ${v}`)
|
|
143
|
+
.join("\n"),
|
|
144
|
+
lineStart: 1,
|
|
145
|
+
lineEnd: 1,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
// Dependencies (names + versions, no code)
|
|
149
|
+
const deps = pkg.dependencies || {};
|
|
150
|
+
const devDeps = pkg.devDependencies || {};
|
|
151
|
+
if (Object.keys(deps).length > 0) {
|
|
152
|
+
chunks.push({
|
|
153
|
+
source: `${sourceName} — package.json`,
|
|
154
|
+
section: "## Dependencies",
|
|
155
|
+
content: Object.entries(deps)
|
|
156
|
+
.map(([k, v]) => `${k}: ${v}`)
|
|
157
|
+
.join("\n"),
|
|
158
|
+
lineStart: 1,
|
|
159
|
+
lineEnd: 1,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
if (Object.keys(devDeps).length > 0) {
|
|
163
|
+
chunks.push({
|
|
164
|
+
source: `${sourceName} — package.json`,
|
|
165
|
+
section: "## Dev Dependencies",
|
|
166
|
+
content: Object.entries(devDeps)
|
|
167
|
+
.map(([k, v]) => `${k}: ${v}`)
|
|
168
|
+
.join("\n"),
|
|
169
|
+
lineStart: 1,
|
|
170
|
+
lineEnd: 1,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
return chunks;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return [];
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
// 3. Composer.json Collector (PHP projects)
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
/**
|
|
183
|
+
* Collect dependency info from composer.json (Laravel, Symfony, etc.).
|
|
184
|
+
*/
|
|
185
|
+
export function collectComposerJson(projectDir, sourceName) {
|
|
186
|
+
const composerPath = join(projectDir, "composer.json");
|
|
187
|
+
if (!existsSync(composerPath))
|
|
188
|
+
return [];
|
|
189
|
+
try {
|
|
190
|
+
const composer = JSON.parse(readFileSync(composerPath, "utf-8"));
|
|
191
|
+
const chunks = [];
|
|
192
|
+
chunks.push({
|
|
193
|
+
source: `${sourceName} — composer.json`,
|
|
194
|
+
section: "## Composer Package",
|
|
195
|
+
content: [
|
|
196
|
+
`Name: ${composer.name || "unnamed"}`,
|
|
197
|
+
composer.description ? `Description: ${composer.description}` : "",
|
|
198
|
+
composer.type ? `Type: ${composer.type}` : "",
|
|
199
|
+
composer.license ? `License: ${composer.license}` : "",
|
|
200
|
+
composer.require?.php ? `PHP: ${composer.require.php}` : "",
|
|
201
|
+
]
|
|
202
|
+
.filter(Boolean)
|
|
203
|
+
.join("\n"),
|
|
204
|
+
lineStart: 1,
|
|
205
|
+
lineEnd: 1,
|
|
206
|
+
});
|
|
207
|
+
const deps = composer.require || {};
|
|
208
|
+
if (Object.keys(deps).length > 0) {
|
|
209
|
+
chunks.push({
|
|
210
|
+
source: `${sourceName} — composer.json`,
|
|
211
|
+
section: "## PHP Dependencies",
|
|
212
|
+
content: Object.entries(deps)
|
|
213
|
+
.map(([k, v]) => `${k}: ${v}`)
|
|
214
|
+
.join("\n"),
|
|
215
|
+
lineStart: 1,
|
|
216
|
+
lineEnd: 1,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
const devDeps = composer["require-dev"] || {};
|
|
220
|
+
if (Object.keys(devDeps).length > 0) {
|
|
221
|
+
chunks.push({
|
|
222
|
+
source: `${sourceName} — composer.json`,
|
|
223
|
+
section: "## PHP Dev Dependencies",
|
|
224
|
+
content: Object.entries(devDeps)
|
|
225
|
+
.map(([k, v]) => `${k}: ${v}`)
|
|
226
|
+
.join("\n"),
|
|
227
|
+
lineStart: 1,
|
|
228
|
+
lineEnd: 1,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
// Scripts
|
|
232
|
+
if (composer.scripts && Object.keys(composer.scripts).length > 0) {
|
|
233
|
+
chunks.push({
|
|
234
|
+
source: `${sourceName} — composer.json`,
|
|
235
|
+
section: "## Composer Scripts",
|
|
236
|
+
content: Object.entries(composer.scripts)
|
|
237
|
+
.map(([k, v]) => {
|
|
238
|
+
const val = Array.isArray(v) ? v.join(", ") : String(v);
|
|
239
|
+
return `${k}: ${val}`;
|
|
240
|
+
})
|
|
241
|
+
.join("\n"),
|
|
242
|
+
lineStart: 1,
|
|
243
|
+
lineEnd: 1,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
return chunks;
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return [];
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// ---------------------------------------------------------------------------
|
|
253
|
+
// 4. .env Collector (sanitized — passwords redacted)
|
|
254
|
+
// ---------------------------------------------------------------------------
|
|
255
|
+
/**
|
|
256
|
+
* Collect environment configuration. Passwords/secrets are REDACTED.
|
|
257
|
+
* Gives AI context about database hosts, mail config, app URLs, etc.
|
|
258
|
+
*/
|
|
259
|
+
export function collectEnvFile(projectDir, sourceName) {
|
|
260
|
+
const envPath = join(projectDir, ".env");
|
|
261
|
+
if (!existsSync(envPath))
|
|
262
|
+
return [];
|
|
263
|
+
try {
|
|
264
|
+
const raw = readFileSync(envPath, "utf-8");
|
|
265
|
+
const redacted = redactSensitive(raw);
|
|
266
|
+
// Remove empty lines and comments for cleaner chunks
|
|
267
|
+
const meaningful = redacted
|
|
268
|
+
.split("\n")
|
|
269
|
+
.filter((line) => line.trim() && !line.trim().startsWith("#"))
|
|
270
|
+
.join("\n");
|
|
271
|
+
if (!meaningful)
|
|
272
|
+
return [];
|
|
273
|
+
return [
|
|
274
|
+
{
|
|
275
|
+
source: `${sourceName} — .env`,
|
|
276
|
+
section: "## Environment Configuration",
|
|
277
|
+
content: meaningful,
|
|
278
|
+
lineStart: 1,
|
|
279
|
+
lineEnd: meaningful.split("\n").length,
|
|
280
|
+
},
|
|
281
|
+
];
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
return [];
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// ---------------------------------------------------------------------------
|
|
288
|
+
// 5. Shell History Collector (recent commands)
|
|
289
|
+
// ---------------------------------------------------------------------------
|
|
290
|
+
/**
|
|
291
|
+
* Collect recent shell history entries.
|
|
292
|
+
* Useful for understanding what the developer has been doing recently.
|
|
293
|
+
* Passwords in history are redacted.
|
|
294
|
+
*/
|
|
295
|
+
export function collectShellHistory(sourceName) {
|
|
296
|
+
const histFile = resolve(homedir(), ".zsh_history");
|
|
297
|
+
if (!existsSync(histFile))
|
|
298
|
+
return [];
|
|
299
|
+
try {
|
|
300
|
+
// Read last 200 lines (most recent commands)
|
|
301
|
+
const raw = exec(`tail -200 ${histFile}`);
|
|
302
|
+
if (!raw)
|
|
303
|
+
return [];
|
|
304
|
+
// Parse zsh extended history format: : timestamp:0;command
|
|
305
|
+
const commands = raw
|
|
306
|
+
.split("\n")
|
|
307
|
+
.map((line) => {
|
|
308
|
+
const match = line.match(/^:\s*(\d+):\d+;(.+)/);
|
|
309
|
+
if (match)
|
|
310
|
+
return match[2].trim();
|
|
311
|
+
// Plain format
|
|
312
|
+
return line.trim();
|
|
313
|
+
})
|
|
314
|
+
.filter(Boolean)
|
|
315
|
+
// Remove duplicates while preserving order
|
|
316
|
+
.filter((cmd, i, arr) => arr.indexOf(cmd) === i);
|
|
317
|
+
if (commands.length === 0)
|
|
318
|
+
return [];
|
|
319
|
+
const redacted = redactSensitive(commands.join("\n"));
|
|
320
|
+
return [
|
|
321
|
+
{
|
|
322
|
+
source: `${sourceName} — shell history`,
|
|
323
|
+
section: "## Recent Shell Commands",
|
|
324
|
+
content: redacted,
|
|
325
|
+
lineStart: 1,
|
|
326
|
+
lineEnd: commands.length,
|
|
327
|
+
},
|
|
328
|
+
];
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
return [];
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// ---------------------------------------------------------------------------
|
|
335
|
+
// 6. Docker Collector (running containers + compose config)
|
|
336
|
+
// ---------------------------------------------------------------------------
|
|
337
|
+
/**
|
|
338
|
+
* Collect Docker container info — what's running, ports, images.
|
|
339
|
+
*/
|
|
340
|
+
export function collectDocker(sourceName) {
|
|
341
|
+
if (!commandExists("docker"))
|
|
342
|
+
return [];
|
|
343
|
+
const chunks = [];
|
|
344
|
+
// Running containers
|
|
345
|
+
const ps = exec('docker ps --format "{{.Names}}|{{.Image}}|{{.Status}}|{{.Ports}}" 2>/dev/null');
|
|
346
|
+
if (ps) {
|
|
347
|
+
const formatted = ps
|
|
348
|
+
.split("\n")
|
|
349
|
+
.filter(Boolean)
|
|
350
|
+
.map((line) => {
|
|
351
|
+
const [name, image, status, ports] = line.split("|");
|
|
352
|
+
return `${name}: ${image} (${status}) ${ports || ""}`.trim();
|
|
353
|
+
})
|
|
354
|
+
.join("\n");
|
|
355
|
+
chunks.push({
|
|
356
|
+
source: `${sourceName} — docker`,
|
|
357
|
+
section: "## Running Containers",
|
|
358
|
+
content: formatted,
|
|
359
|
+
lineStart: 1,
|
|
360
|
+
lineEnd: 1,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
// Docker images
|
|
364
|
+
const images = exec('docker images --format "{{.Repository}}:{{.Tag}} ({{.Size}})" 2>/dev/null | head -20');
|
|
365
|
+
if (images) {
|
|
366
|
+
chunks.push({
|
|
367
|
+
source: `${sourceName} — docker`,
|
|
368
|
+
section: "## Docker Images",
|
|
369
|
+
content: images,
|
|
370
|
+
lineStart: 1,
|
|
371
|
+
lineEnd: 1,
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
return chunks;
|
|
375
|
+
}
|
|
376
|
+
// ---------------------------------------------------------------------------
|
|
377
|
+
// 7. PM2 Collector (running processes)
|
|
378
|
+
// ---------------------------------------------------------------------------
|
|
379
|
+
/**
|
|
380
|
+
* Collect PM2 process list — what apps are running, ports, status.
|
|
381
|
+
*/
|
|
382
|
+
export function collectPM2(sourceName) {
|
|
383
|
+
if (!commandExists("pm2"))
|
|
384
|
+
return [];
|
|
385
|
+
// Use jlist for structured data
|
|
386
|
+
const raw = exec("pm2 jlist 2>/dev/null");
|
|
387
|
+
if (!raw)
|
|
388
|
+
return [];
|
|
389
|
+
try {
|
|
390
|
+
const processes = JSON.parse(raw);
|
|
391
|
+
if (!Array.isArray(processes) || processes.length === 0)
|
|
392
|
+
return [];
|
|
393
|
+
const formatted = processes
|
|
394
|
+
.map((p) => {
|
|
395
|
+
const env = p.pm2_env || {};
|
|
396
|
+
return [
|
|
397
|
+
`${p.name}: ${env.status || "unknown"}`,
|
|
398
|
+
` pid: ${p.pid || "N/A"}`,
|
|
399
|
+
` port: ${env.PORT || env.port || "N/A"}`,
|
|
400
|
+
` cwd: ${env.pm_cwd || "N/A"}`,
|
|
401
|
+
` uptime: ${env.pm_uptime ? new Date(env.pm_uptime).toISOString() : "N/A"}`,
|
|
402
|
+
` restarts: ${env.restart_time || 0}`,
|
|
403
|
+
].join("\n");
|
|
404
|
+
})
|
|
405
|
+
.join("\n\n");
|
|
406
|
+
return [
|
|
407
|
+
{
|
|
408
|
+
source: `${sourceName} — pm2`,
|
|
409
|
+
section: "## PM2 Processes",
|
|
410
|
+
content: formatted,
|
|
411
|
+
lineStart: 1,
|
|
412
|
+
lineEnd: processes.length,
|
|
413
|
+
},
|
|
414
|
+
];
|
|
415
|
+
}
|
|
416
|
+
catch {
|
|
417
|
+
return [];
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
// ---------------------------------------------------------------------------
|
|
421
|
+
// 8. Nginx Collector (site configurations)
|
|
422
|
+
// ---------------------------------------------------------------------------
|
|
423
|
+
/**
|
|
424
|
+
* Collect Nginx site configurations — domains, roots, proxy settings.
|
|
425
|
+
* Reads from common config locations.
|
|
426
|
+
*/
|
|
427
|
+
export function collectNginx(sourceName) {
|
|
428
|
+
const configDirs = [
|
|
429
|
+
"/etc/nginx/sites-enabled",
|
|
430
|
+
"/etc/nginx/conf.d",
|
|
431
|
+
"/usr/local/etc/nginx/servers", // macOS Homebrew
|
|
432
|
+
];
|
|
433
|
+
const chunks = [];
|
|
434
|
+
for (const dir of configDirs) {
|
|
435
|
+
if (!existsSync(dir))
|
|
436
|
+
continue;
|
|
437
|
+
try {
|
|
438
|
+
const files = readdirSync(dir);
|
|
439
|
+
for (const file of files) {
|
|
440
|
+
if (file.startsWith("."))
|
|
441
|
+
continue;
|
|
442
|
+
const filePath = join(dir, file);
|
|
443
|
+
try {
|
|
444
|
+
if (!statSync(filePath).isFile())
|
|
445
|
+
continue;
|
|
446
|
+
}
|
|
447
|
+
catch {
|
|
448
|
+
continue;
|
|
449
|
+
}
|
|
450
|
+
try {
|
|
451
|
+
const content = readFileSync(filePath, "utf-8");
|
|
452
|
+
// Extract key directives for a summary
|
|
453
|
+
const serverNames = [
|
|
454
|
+
...content.matchAll(/server_name\s+([^;]+);/g),
|
|
455
|
+
].map((m) => m[1].trim());
|
|
456
|
+
const roots = [...content.matchAll(/root\s+([^;]+);/g)].map((m) => m[1].trim());
|
|
457
|
+
const listens = [...content.matchAll(/listen\s+([^;]+);/g)].map((m) => m[1].trim());
|
|
458
|
+
const proxyPasses = [
|
|
459
|
+
...content.matchAll(/proxy_pass\s+([^;]+);/g),
|
|
460
|
+
].map((m) => m[1].trim());
|
|
461
|
+
const summary = [
|
|
462
|
+
serverNames.length
|
|
463
|
+
? `Domains: ${serverNames.join(", ")}`
|
|
464
|
+
: "",
|
|
465
|
+
listens.length ? `Listen: ${listens.join(", ")}` : "",
|
|
466
|
+
roots.length ? `Root: ${roots.join(", ")}` : "",
|
|
467
|
+
proxyPasses.length
|
|
468
|
+
? `Proxy: ${proxyPasses.join(", ")}`
|
|
469
|
+
: "",
|
|
470
|
+
]
|
|
471
|
+
.filter(Boolean)
|
|
472
|
+
.join("\n");
|
|
473
|
+
if (summary) {
|
|
474
|
+
chunks.push({
|
|
475
|
+
source: `${sourceName} — nginx`,
|
|
476
|
+
section: `## Nginx: ${file}`,
|
|
477
|
+
content: summary,
|
|
478
|
+
lineStart: 1,
|
|
479
|
+
lineEnd: 1,
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
catch {
|
|
484
|
+
// Permission denied — skip
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
catch {
|
|
489
|
+
// Permission denied — skip
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
return chunks;
|
|
493
|
+
}
|
|
494
|
+
// ---------------------------------------------------------------------------
|
|
495
|
+
// 9. Crontab Collector
|
|
496
|
+
// ---------------------------------------------------------------------------
|
|
497
|
+
/**
|
|
498
|
+
* Collect crontab entries — scheduled tasks and maintenance jobs.
|
|
499
|
+
*/
|
|
500
|
+
export function collectCrontab(sourceName) {
|
|
501
|
+
const cron = exec("crontab -l 2>/dev/null");
|
|
502
|
+
if (!cron)
|
|
503
|
+
return [];
|
|
504
|
+
// Filter out comments and empty lines for summary
|
|
505
|
+
const entries = cron
|
|
506
|
+
.split("\n")
|
|
507
|
+
.filter((line) => line.trim() && !line.trim().startsWith("#"));
|
|
508
|
+
if (entries.length === 0)
|
|
509
|
+
return [];
|
|
510
|
+
return [
|
|
511
|
+
{
|
|
512
|
+
source: `${sourceName} — crontab`,
|
|
513
|
+
section: "## Scheduled Tasks (crontab)",
|
|
514
|
+
content: entries.join("\n"),
|
|
515
|
+
lineStart: 1,
|
|
516
|
+
lineEnd: entries.length,
|
|
517
|
+
},
|
|
518
|
+
];
|
|
519
|
+
}
|
|
520
|
+
// ---------------------------------------------------------------------------
|
|
521
|
+
// 10. Ecosystem.config.js Collector (PM2 config files)
|
|
522
|
+
// ---------------------------------------------------------------------------
|
|
523
|
+
/**
|
|
524
|
+
* Collect PM2 ecosystem config from project directory.
|
|
525
|
+
*/
|
|
526
|
+
export function collectEcosystemConfig(projectDir, sourceName) {
|
|
527
|
+
const configNames = ["ecosystem.config.js", "ecosystem.config.cjs"];
|
|
528
|
+
for (const name of configNames) {
|
|
529
|
+
const configPath = join(projectDir, name);
|
|
530
|
+
if (!existsSync(configPath))
|
|
531
|
+
continue;
|
|
532
|
+
try {
|
|
533
|
+
const content = readFileSync(configPath, "utf-8");
|
|
534
|
+
return [
|
|
535
|
+
{
|
|
536
|
+
source: `${sourceName} — ecosystem.config`,
|
|
537
|
+
section: "## PM2 Ecosystem Config",
|
|
538
|
+
content,
|
|
539
|
+
lineStart: 1,
|
|
540
|
+
lineEnd: content.split("\n").length,
|
|
541
|
+
},
|
|
542
|
+
];
|
|
543
|
+
}
|
|
544
|
+
catch {
|
|
545
|
+
continue;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
return [];
|
|
549
|
+
}
|
|
550
|
+
// ---------------------------------------------------------------------------
|
|
551
|
+
// 11. Docker Compose Collector (project-level)
|
|
552
|
+
// ---------------------------------------------------------------------------
|
|
553
|
+
/**
|
|
554
|
+
* Collect docker-compose.yml for a project — services, ports, volumes.
|
|
555
|
+
*/
|
|
556
|
+
export function collectDockerCompose(projectDir, sourceName) {
|
|
557
|
+
const composeNames = [
|
|
558
|
+
"docker-compose.yml",
|
|
559
|
+
"docker-compose.yaml",
|
|
560
|
+
"docker-compose.prod.yml",
|
|
561
|
+
"compose.yml",
|
|
562
|
+
"compose.yaml",
|
|
563
|
+
];
|
|
564
|
+
const chunks = [];
|
|
565
|
+
for (const name of composeNames) {
|
|
566
|
+
const composePath = join(projectDir, name);
|
|
567
|
+
if (!existsSync(composePath))
|
|
568
|
+
continue;
|
|
569
|
+
try {
|
|
570
|
+
const content = readFileSync(composePath, "utf-8");
|
|
571
|
+
const redacted = redactSensitive(content);
|
|
572
|
+
chunks.push({
|
|
573
|
+
source: `${sourceName} — ${name}`,
|
|
574
|
+
section: `## Docker Compose: ${name}`,
|
|
575
|
+
content: redacted,
|
|
576
|
+
lineStart: 1,
|
|
577
|
+
lineEnd: redacted.split("\n").length,
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
catch {
|
|
581
|
+
// Permission denied — skip
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
return chunks;
|
|
585
|
+
}
|
|
586
|
+
// ---------------------------------------------------------------------------
|
|
587
|
+
// Master collector: gather all operational data for a project
|
|
588
|
+
// ---------------------------------------------------------------------------
|
|
589
|
+
/**
|
|
590
|
+
* Collect all operational data for a single project directory.
|
|
591
|
+
* Returns chunks from all available collectors.
|
|
592
|
+
*/
|
|
593
|
+
export function collectProjectOps(projectDir, sourceName) {
|
|
594
|
+
const allChunks = [];
|
|
595
|
+
allChunks.push(...collectGitLog(projectDir, sourceName));
|
|
596
|
+
allChunks.push(...collectPackageJson(projectDir, sourceName));
|
|
597
|
+
allChunks.push(...collectComposerJson(projectDir, sourceName));
|
|
598
|
+
allChunks.push(...collectEnvFile(projectDir, sourceName));
|
|
599
|
+
allChunks.push(...collectEcosystemConfig(projectDir, sourceName));
|
|
600
|
+
allChunks.push(...collectDockerCompose(projectDir, sourceName));
|
|
601
|
+
return allChunks;
|
|
602
|
+
}
|
|
603
|
+
/**
|
|
604
|
+
* Collect system-wide operational data (not project-specific).
|
|
605
|
+
* These run once, not per-project.
|
|
606
|
+
*/
|
|
607
|
+
export function collectSystemOps() {
|
|
608
|
+
const allChunks = [];
|
|
609
|
+
const sourceName = "System";
|
|
610
|
+
allChunks.push(...collectShellHistory(sourceName));
|
|
611
|
+
allChunks.push(...collectDocker(sourceName));
|
|
612
|
+
allChunks.push(...collectPM2(sourceName));
|
|
613
|
+
allChunks.push(...collectNginx(sourceName));
|
|
614
|
+
allChunks.push(...collectCrontab(sourceName));
|
|
615
|
+
return allChunks;
|
|
616
|
+
}
|
|
617
|
+
//# sourceMappingURL=collectors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectors.js","sourceRoot":"","sources":["../src/collectors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAqB,MAAM,MAAM,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAG7B;;;;;;;;;;;;;;GAcG;AAEH,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,oEAAoE;AACpE,SAAS,IAAI,CAAC,GAAW,EAAE,GAAY;IACrC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,GAAG,EAAE;YACnB,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,gCAAgC;AAChC,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;AAC1C,CAAC;AAED,8CAA8C;AAC9C,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,iBAAiB,GACrB,wIAAwI,CAAC;IAC3I,OAAO,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;AAC5D,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,UAAkB;IAClE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAErD,sEAAsE;IACtE,MAAM,GAAG,GAAG,IAAI,CACd,2DAA2D,EAC3D,UAAU,CACX,CAAC;IACF,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,+BAA+B;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,2BAA2B,EAAE,UAAU,CAAC,IAAI,SAAS,CAAC;IAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,yCAAyC,EAAE,UAAU,CAAC,CAAC;IAE3E,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,gBAAgB;IAChB,MAAM,CAAC,IAAI,CAAC;QACV,MAAM,EAAE,GAAG,UAAU,QAAQ;QAC7B,OAAO,EAAE,iBAAiB;QAC1B,OAAO,EAAE;YACP,WAAW,MAAM,EAAE;YACnB,kBAAkB,KAAK,CAAC,MAAM,EAAE;YAChC,OAAO,CAAC,CAAC,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;YACvC,MAAM,CAAC,CAAC,CAAC,2BAA2B,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;SAClD;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,IAAI,CAAC;QACb,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;KACX,CAAC,CAAC;IAEH,wDAAwD;IACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,KAAK;aACpB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1D,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,KAAK,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3E,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,CAAC,IAAI,CAAC;YACV,MAAM,EAAE,GAAG,UAAU,QAAQ;YAC7B,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG;YAClE,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,CAAC,GAAG,CAAC;YAChB,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC;SACxC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,+CAA+C;AAC/C,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAAkB,EAClB,UAAkB;IAElB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,MAAM,MAAM,GAAY,EAAE,CAAC;QAE3B,mBAAmB;QACnB,MAAM,CAAC,IAAI,CAAC;YACV,MAAM,EAAE,GAAG,UAAU,iBAAiB;YACtC,OAAO,EAAE,qBAAqB;YAC9B,OAAO,EAAE;gBACP,SAAS,GAAG,CAAC,IAAI,IAAI,SAAS,EAAE;gBAChC,YAAY,GAAG,CAAC,OAAO,IAAI,OAAO,EAAE;gBACpC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;gBACxD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;gBAC5C,GAAG,CAAC,OAAO;oBACT,CAAC,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;oBAC3C,CAAC,CAAC,EAAE;gBACN,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;aAC3C;iBACE,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,IAAI,CAAC;YACb,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QAEH,UAAU;QACV,IAAI,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,GAAG,UAAU,iBAAiB;gBACtC,OAAO,EAAE,gBAAgB;gBACzB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;qBACjC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;qBAC7B,IAAI,CAAC,IAAI,CAAC;gBACb,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,CAAC;aACX,CAAC,CAAC;QACL,CAAC;QAED,2CAA2C;QAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,GAAG,UAAU,iBAAiB;gBACtC,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;qBAC1B,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;qBAC7B,IAAI,CAAC,IAAI,CAAC;gBACb,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,CAAC;aACX,CAAC,CAAC;QACL,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,GAAG,UAAU,iBAAiB;gBACtC,OAAO,EAAE,qBAAqB;gBAC9B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;qBAC7B,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;qBAC7B,IAAI,CAAC,IAAI,CAAC;gBACb,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,CAAC;aACX,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,4CAA4C;AAC5C,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAkB,EAClB,UAAkB;IAElB,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;QACjE,MAAM,MAAM,GAAY,EAAE,CAAC;QAE3B,MAAM,CAAC,IAAI,CAAC;YACV,MAAM,EAAE,GAAG,UAAU,kBAAkB;YACvC,OAAO,EAAE,qBAAqB;YAC9B,OAAO,EAAE;gBACP,SAAS,QAAQ,CAAC,IAAI,IAAI,SAAS,EAAE;gBACrC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;gBAClE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;gBAC7C,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;gBACtD,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE;aAC5D;iBACE,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,IAAI,CAAC;YACb,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,GAAG,UAAU,kBAAkB;gBACvC,OAAO,EAAE,qBAAqB;gBAC9B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;qBAC1B,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;qBAC7B,IAAI,CAAC,IAAI,CAAC;gBACb,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,CAAC;aACX,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,GAAG,UAAU,kBAAkB;gBACvC,OAAO,EAAE,yBAAyB;gBAClC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;qBAC7B,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;qBAC7B,IAAI,CAAC,IAAI,CAAC;gBACb,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,CAAC;aACX,CAAC,CAAC;QACL,CAAC;QAED,UAAU;QACV,IAAI,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,GAAG,UAAU,kBAAkB;gBACvC,OAAO,EAAE,qBAAqB;gBAC9B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;qBACtC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;oBACd,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACxD,OAAO,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;gBACxB,CAAC,CAAC;qBACD,IAAI,CAAC,IAAI,CAAC;gBACb,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,CAAC;aACX,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,qDAAqD;AACrD,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,UAAkB,EAClB,UAAkB;IAElB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QAEtC,qDAAqD;QACrD,MAAM,UAAU,GAAG,QAAQ;aACxB,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aAC7D,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QAE3B,OAAO;YACL;gBACE,MAAM,EAAE,GAAG,UAAU,SAAS;gBAC9B,OAAO,EAAE,8BAA8B;gBACvC,OAAO,EAAE,UAAU;gBACnB,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM;aACvC;SACF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,+CAA+C;AAC/C,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,IAAI,CAAC;QACH,6CAA6C;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QAEpB,2DAA2D;QAC3D,MAAM,QAAQ,GAAG,GAAG;aACjB,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAChD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAClC,eAAe;YACf,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC,CAAC;aACD,MAAM,CAAC,OAAO,CAAC;YAChB,2CAA2C;aAC1C,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAEnD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAErC,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAEtD,OAAO;YACL;gBACE,MAAM,EAAE,GAAG,UAAU,kBAAkB;gBACvC,OAAO,EAAE,0BAA0B;gBACnC,OAAO,EAAE,QAAQ;gBACjB,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,QAAQ,CAAC,MAAM;aACzB;SACF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,4DAA4D;AAC5D,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,qBAAqB;IACrB,MAAM,EAAE,GAAG,IAAI,CACb,+EAA+E,CAChF,CAAC;IACF,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,SAAS,GAAG,EAAE;aACjB,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrD,OAAO,GAAG,IAAI,KAAK,KAAK,KAAK,MAAM,KAAK,KAAK,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QAC/D,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,CAAC,IAAI,CAAC;YACV,MAAM,EAAE,GAAG,UAAU,WAAW;YAChC,OAAO,EAAE,uBAAuB;YAChC,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB;IAChB,MAAM,MAAM,GAAG,IAAI,CACjB,sFAAsF,CACvF,CAAC;IACF,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC;YACV,MAAM,EAAE,GAAG,UAAU,WAAW;YAChC,OAAO,EAAE,kBAAkB;YAC3B,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,uCAAuC;AACvC,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC3C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,gCAAgC;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEnE,MAAM,SAAS,GAAG,SAAS;aACxB,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;YACd,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;YAC5B,OAAO;gBACL,GAAG,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,SAAS,EAAE;gBACvC,UAAU,CAAC,CAAC,GAAG,IAAI,KAAK,EAAE;gBAC1B,WAAW,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,EAAE;gBAC1C,UAAU,GAAG,CAAC,MAAM,IAAI,KAAK,EAAE;gBAC/B,aAAa,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE;gBAC5E,eAAe,GAAG,CAAC,YAAY,IAAI,CAAC,EAAE;aACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC;aACD,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhB,OAAO;YACL;gBACE,MAAM,EAAE,GAAG,UAAU,QAAQ;gBAC7B,OAAO,EAAE,kBAAkB;gBAC3B,OAAO,EAAE,SAAS;gBAClB,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,SAAS,CAAC,MAAM;aAC1B;SACF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,MAAM,UAAU,GAAG;QACjB,0BAA0B;QAC1B,mBAAmB;QACnB,8BAA8B,EAAE,iBAAiB;KAClD,CAAC;IAEF,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAE/B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAEjC,IAAI,CAAC;oBACH,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE;wBAAE,SAAS;gBAC7C,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAEhD,uCAAuC;oBACvC,MAAM,WAAW,GAAG;wBAClB,GAAG,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC;qBAC/C,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC1B,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAChE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CACZ,CAAC;oBACF,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAC7D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CACnB,CAAC;oBACF,MAAM,WAAW,GAAG;wBAClB,GAAG,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC;qBAC9C,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;oBAE1B,MAAM,OAAO,GAAG;wBACd,WAAW,CAAC,MAAM;4BAChB,CAAC,CAAC,YAAY,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;4BACtC,CAAC,CAAC,EAAE;wBACN,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;wBACrD,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;wBAC/C,WAAW,CAAC,MAAM;4BAChB,CAAC,CAAC,UAAU,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;4BACpC,CAAC,CAAC,EAAE;qBACP;yBACE,MAAM,CAAC,OAAO,CAAC;yBACf,IAAI,CAAC,IAAI,CAAC,CAAC;oBAEd,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,CAAC,IAAI,CAAC;4BACV,MAAM,EAAE,GAAG,UAAU,UAAU;4BAC/B,OAAO,EAAE,aAAa,IAAI,EAAE;4BAC5B,OAAO,EAAE,OAAO;4BAChB,SAAS,EAAE,CAAC;4BACZ,OAAO,EAAE,CAAC;yBACX,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,2BAA2B;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,kDAAkD;IAClD,MAAM,OAAO,GAAG,IAAI;SACjB,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAEjE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,OAAO;QACL;YACE,MAAM,EAAE,GAAG,UAAU,YAAY;YACjC,OAAO,EAAE,8BAA8B;YACvC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3B,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,OAAO,CAAC,MAAM;SACxB;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,uDAAuD;AACvD,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAAkB,EAClB,UAAkB;IAElB,MAAM,WAAW,GAAG,CAAC,qBAAqB,EAAE,sBAAsB,CAAC,CAAC;IAEpE,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAS;QAEtC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAClD,OAAO;gBACL;oBACE,MAAM,EAAE,GAAG,UAAU,qBAAqB;oBAC1C,OAAO,EAAE,yBAAyB;oBAClC,OAAO;oBACP,SAAS,EAAE,CAAC;oBACZ,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM;iBACpC;aACF,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,8EAA8E;AAC9E,+CAA+C;AAC/C,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAkB,EAClB,UAAkB;IAElB,MAAM,YAAY,GAAG;QACnB,oBAAoB;QACpB,qBAAqB;QACrB,yBAAyB;QACzB,aAAa;QACb,cAAc;KACf,CAAC;IAEF,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,SAAS;QAEvC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YAE1C,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,GAAG,UAAU,MAAM,IAAI,EAAE;gBACjC,OAAO,EAAE,sBAAsB,IAAI,EAAE;gBACrC,OAAO,EAAE,QAAQ;gBACjB,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM;aACrC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,8DAA8D;AAC9D,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,UAAkB,EAClB,UAAkB;IAElB,MAAM,SAAS,GAAY,EAAE,CAAC;IAE9B,SAAS,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IACzD,SAAS,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IAC9D,SAAS,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/D,SAAS,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IAC1D,SAAS,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IAClE,SAAS,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IAEhE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,SAAS,GAAY,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAG,QAAQ,CAAC;IAE5B,SAAS,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC;IACnD,SAAS,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7C,SAAS,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1C,SAAS,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;IAC5C,SAAS,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;IAE9C,OAAO,SAAS,CAAC;AACnB,CAAC"}
|