mcmodding-mcp 0.2.2 → 0.3.1
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/README.md +43 -0
- package/dist/cli/{install.d.ts → manage.d.ts} +1 -1
- package/dist/cli/manage.d.ts.map +1 -0
- package/dist/cli/manage.js +757 -0
- package/dist/cli/manage.js.map +1 -0
- package/dist/db-versioning.d.ts +1 -1
- package/dist/db-versioning.d.ts.map +1 -1
- package/dist/db-versioning.js +14 -6
- package/dist/db-versioning.js.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/indexer/store.d.ts +15 -0
- package/dist/indexer/store.d.ts.map +1 -1
- package/dist/indexer/store.js +44 -26
- package/dist/indexer/store.js.map +1 -1
- package/dist/services/example-service.d.ts +2 -1
- package/dist/services/example-service.d.ts.map +1 -1
- package/dist/services/example-service.js +71 -3
- package/dist/services/example-service.js.map +1 -1
- package/dist/services/search-service.js +3 -3
- package/dist/services/search-service.js.map +1 -1
- package/dist/services/search-utils.d.ts.map +1 -1
- package/dist/services/search-utils.js +66 -9
- package/dist/services/search-utils.js.map +1 -1
- package/dist/tools/getExample.d.ts +1 -1
- package/dist/tools/getExample.d.ts.map +1 -1
- package/dist/tools/getExample.js +2 -2
- package/dist/tools/getExample.js.map +1 -1
- package/package.json +1 -1
- package/scripts/postinstall.js +50 -20
- package/dist/cli/install.d.ts.map +0 -1
- package/dist/cli/install.js +0 -397
- package/dist/cli/install.js.map +0 -1
package/scripts/postinstall.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
/* eslint-disable no-undef, no-control-regex, no-unused-vars */
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* MCModding-MCP Postinstall Script
|
|
@@ -20,7 +21,7 @@ const __dirname = path.dirname(__filename);
|
|
|
20
21
|
// ═══════════════════════════════════════════════════════════════════════════════
|
|
21
22
|
|
|
22
23
|
const CONFIG = {
|
|
23
|
-
repoUrl: 'https://api.github.com/repos/OGMatrix/mcmodding-mcp/releases
|
|
24
|
+
repoUrl: 'https://api.github.com/repos/OGMatrix/mcmodding-mcp/releases',
|
|
24
25
|
dataDir: path.join(__dirname, '..', 'data'),
|
|
25
26
|
dbFileName: 'mcmodding-docs.db',
|
|
26
27
|
manifestFileName: 'db-manifest.json',
|
|
@@ -291,10 +292,10 @@ class ProgressDisplay {
|
|
|
291
292
|
}
|
|
292
293
|
|
|
293
294
|
clear() {
|
|
294
|
-
if (isColorSupported) {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
295
|
+
if (isColorSupported && this.lines > 0) {
|
|
296
|
+
// Move cursor up and clear all lines in a single write operation
|
|
297
|
+
const clearSequence = (c.cursorUp + c.clearLine).repeat(this.lines);
|
|
298
|
+
process.stdout.write(clearSequence);
|
|
298
299
|
}
|
|
299
300
|
this.lines = 0;
|
|
300
301
|
}
|
|
@@ -309,7 +310,7 @@ class ProgressDisplay {
|
|
|
309
310
|
|
|
310
311
|
update(downloaded, total, phase = 'download') {
|
|
311
312
|
const now = Date.now();
|
|
312
|
-
if (now - this.lastUpdate <
|
|
313
|
+
if (now - this.lastUpdate < 100) return; // Throttle updates
|
|
313
314
|
this.lastUpdate = now;
|
|
314
315
|
|
|
315
316
|
this.clear();
|
|
@@ -349,11 +350,9 @@ class ProgressDisplay {
|
|
|
349
350
|
|
|
350
351
|
lines.push(statsLine);
|
|
351
352
|
|
|
352
|
-
// Print all lines
|
|
353
|
-
lines
|
|
354
|
-
|
|
355
|
-
this.lines++;
|
|
356
|
-
});
|
|
353
|
+
// Print all lines as a single write operation to prevent flickering
|
|
354
|
+
this.lines = lines.length;
|
|
355
|
+
process.stdout.write(lines.join('\n') + '\n');
|
|
357
356
|
}
|
|
358
357
|
|
|
359
358
|
finish(success = true, message = '') {
|
|
@@ -533,14 +532,20 @@ function printWelcomeScreen() {
|
|
|
533
532
|
|
|
534
533
|
function httpsGet(url, options = {}) {
|
|
535
534
|
return new Promise((resolve, reject) => {
|
|
535
|
+
const headers = {
|
|
536
|
+
'User-Agent': CONFIG.userAgent,
|
|
537
|
+
Accept: 'application/vnd.github.v3+json',
|
|
538
|
+
...options.headers,
|
|
539
|
+
};
|
|
540
|
+
|
|
541
|
+
if (process.env.GITHUB_TOKEN) {
|
|
542
|
+
headers.Authorization = `Bearer ${process.env.GITHUB_TOKEN}`;
|
|
543
|
+
}
|
|
544
|
+
|
|
536
545
|
const req = https.get(
|
|
537
546
|
url,
|
|
538
547
|
{
|
|
539
|
-
headers
|
|
540
|
-
'User-Agent': CONFIG.userAgent,
|
|
541
|
-
Accept: 'application/vnd.github.v3+json',
|
|
542
|
-
...options.headers,
|
|
543
|
-
},
|
|
548
|
+
headers,
|
|
544
549
|
},
|
|
545
550
|
(res) => {
|
|
546
551
|
// Handle redirects
|
|
@@ -582,12 +587,18 @@ async function downloadWithProgress(url, destPath, onProgress) {
|
|
|
582
587
|
|
|
583
588
|
const makeRequest = (requestUrl) => {
|
|
584
589
|
const urlObj = new URL(requestUrl);
|
|
590
|
+
const headers = {
|
|
591
|
+
'User-Agent': CONFIG.userAgent,
|
|
592
|
+
};
|
|
593
|
+
|
|
594
|
+
if (process.env.GITHUB_TOKEN) {
|
|
595
|
+
headers.Authorization = `Bearer ${process.env.GITHUB_TOKEN}`;
|
|
596
|
+
}
|
|
597
|
+
|
|
585
598
|
const options = {
|
|
586
599
|
hostname: urlObj.hostname,
|
|
587
600
|
path: urlObj.pathname + urlObj.search,
|
|
588
|
-
headers
|
|
589
|
-
'User-Agent': CONFIG.userAgent,
|
|
590
|
-
},
|
|
601
|
+
headers,
|
|
591
602
|
};
|
|
592
603
|
|
|
593
604
|
https
|
|
@@ -642,7 +653,19 @@ async function downloadWithProgress(url, destPath, onProgress) {
|
|
|
642
653
|
|
|
643
654
|
async function fetchReleaseInfo() {
|
|
644
655
|
const response = await httpsGet(CONFIG.repoUrl);
|
|
645
|
-
|
|
656
|
+
const releases = JSON.parse(response);
|
|
657
|
+
|
|
658
|
+
// Find the first release that has the required assets
|
|
659
|
+
for (const release of releases) {
|
|
660
|
+
const hasManifest = release.assets.some((a) => a.name === 'db-manifest.json');
|
|
661
|
+
const hasDb = release.assets.some((a) => a.name === 'mcmodding-docs.db');
|
|
662
|
+
|
|
663
|
+
if (hasManifest && hasDb) {
|
|
664
|
+
return release;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
throw new Error('No suitable release found with database artifacts');
|
|
646
669
|
}
|
|
647
670
|
|
|
648
671
|
async function fetchManifest(manifestUrl) {
|
|
@@ -737,6 +760,13 @@ async function main() {
|
|
|
737
760
|
if (!manifestAsset) throw new Error('No manifest found in release');
|
|
738
761
|
|
|
739
762
|
manifest = await fetchManifest(manifestAsset.browser_download_url);
|
|
763
|
+
|
|
764
|
+
// Find the database asset in the release to ensure we have the correct download URL
|
|
765
|
+
// This overrides the URL in the manifest which might be outdated or incorrect
|
|
766
|
+
const dbAsset = release.assets.find((a) => a.name === CONFIG.dbFileName);
|
|
767
|
+
if (dbAsset) {
|
|
768
|
+
manifest.downloadUrl = dbAsset.browser_download_url;
|
|
769
|
+
}
|
|
740
770
|
} catch (error) {
|
|
741
771
|
process.stdout.write(c.cursorUp + c.clearLine);
|
|
742
772
|
printStepIndicator(2, 4, `Failed to fetch release info: ${error.message}`, 'error');
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":"AAqdA,wBAAsB,YAAY,kBAkFjC"}
|
package/dist/cli/install.js
DELETED
|
@@ -1,397 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import https from 'https';
|
|
4
|
-
import readline from 'readline';
|
|
5
|
-
import { fileURLToPath } from 'url';
|
|
6
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
-
const __dirname = path.dirname(__filename);
|
|
8
|
-
const CONFIG = {
|
|
9
|
-
repoOwner: 'OGMatrix',
|
|
10
|
-
repoName: 'mcmodding-mcp',
|
|
11
|
-
dataDir: path.join(__dirname, '..', '..', 'data'),
|
|
12
|
-
userAgent: 'mcmodding-mcp-installer',
|
|
13
|
-
};
|
|
14
|
-
const OPTIONAL_DBS = [
|
|
15
|
-
{
|
|
16
|
-
id: 'mod-examples',
|
|
17
|
-
name: 'Mod Examples Database',
|
|
18
|
-
fileName: 'mod-examples.db',
|
|
19
|
-
manifestName: 'mod-examples-manifest.json',
|
|
20
|
-
description: '1000+ high-quality modding examples for Fabric & NeoForge',
|
|
21
|
-
tagPrefix: 'examples-v',
|
|
22
|
-
icon: '🧩',
|
|
23
|
-
},
|
|
24
|
-
];
|
|
25
|
-
const isColorSupported = process.stdout.isTTY && !process.env.NO_COLOR;
|
|
26
|
-
const c = {
|
|
27
|
-
reset: isColorSupported ? '\x1b[0m' : '',
|
|
28
|
-
bold: isColorSupported ? '\x1b[1m' : '',
|
|
29
|
-
dim: isColorSupported ? '\x1b[2m' : '',
|
|
30
|
-
italic: isColorSupported ? '\x1b[3m' : '',
|
|
31
|
-
underline: isColorSupported ? '\x1b[4m' : '',
|
|
32
|
-
black: isColorSupported ? '\x1b[30m' : '',
|
|
33
|
-
red: isColorSupported ? '\x1b[31m' : '',
|
|
34
|
-
green: isColorSupported ? '\x1b[32m' : '',
|
|
35
|
-
yellow: isColorSupported ? '\x1b[33m' : '',
|
|
36
|
-
blue: isColorSupported ? '\x1b[34m' : '',
|
|
37
|
-
magenta: isColorSupported ? '\x1b[35m' : '',
|
|
38
|
-
cyan: isColorSupported ? '\x1b[36m' : '',
|
|
39
|
-
white: isColorSupported ? '\x1b[37m' : '',
|
|
40
|
-
brightBlack: isColorSupported ? '\x1b[90m' : '',
|
|
41
|
-
brightRed: isColorSupported ? '\x1b[91m' : '',
|
|
42
|
-
brightGreen: isColorSupported ? '\x1b[92m' : '',
|
|
43
|
-
brightYellow: isColorSupported ? '\x1b[93m' : '',
|
|
44
|
-
brightBlue: isColorSupported ? '\x1b[94m' : '',
|
|
45
|
-
brightMagenta: isColorSupported ? '\x1b[95m' : '',
|
|
46
|
-
brightCyan: isColorSupported ? '\x1b[96m' : '',
|
|
47
|
-
brightWhite: isColorSupported ? '\x1b[97m' : '',
|
|
48
|
-
bgBlue: isColorSupported ? '\x1b[44m' : '',
|
|
49
|
-
clearLine: isColorSupported ? '\x1b[2K' : '',
|
|
50
|
-
cursorUp: isColorSupported ? '\x1b[1A' : '',
|
|
51
|
-
cursorHide: isColorSupported ? '\x1b[?25l' : '',
|
|
52
|
-
cursorShow: isColorSupported ? '\x1b[?25h' : '',
|
|
53
|
-
};
|
|
54
|
-
const sym = {
|
|
55
|
-
topLeft: '╔',
|
|
56
|
-
topRight: '╗',
|
|
57
|
-
bottomLeft: '╚',
|
|
58
|
-
bottomRight: '╝',
|
|
59
|
-
horizontal: '═',
|
|
60
|
-
vertical: '║',
|
|
61
|
-
sTopLeft: '┌',
|
|
62
|
-
sTopRight: '┐',
|
|
63
|
-
sBottomLeft: '└',
|
|
64
|
-
sBottomRight: '┘',
|
|
65
|
-
sHorizontal: '─',
|
|
66
|
-
sVertical: '│',
|
|
67
|
-
barFull: '█',
|
|
68
|
-
barThreeQuarter: '▓',
|
|
69
|
-
barHalf: '▒',
|
|
70
|
-
barQuarter: '░',
|
|
71
|
-
barEmpty: '░',
|
|
72
|
-
check: '✔',
|
|
73
|
-
cross: '✖',
|
|
74
|
-
warning: '⚠',
|
|
75
|
-
info: 'ℹ',
|
|
76
|
-
star: '★',
|
|
77
|
-
sparkle: '✨',
|
|
78
|
-
rocket: '🚀',
|
|
79
|
-
package: '📦',
|
|
80
|
-
database: '🗄️',
|
|
81
|
-
download: '⬇',
|
|
82
|
-
shield: '🛡️',
|
|
83
|
-
clock: '⏱',
|
|
84
|
-
lightning: '⚡',
|
|
85
|
-
arrowRight: '▶',
|
|
86
|
-
dot: '●',
|
|
87
|
-
circle: '○',
|
|
88
|
-
selected: '◉',
|
|
89
|
-
unselected: '○',
|
|
90
|
-
};
|
|
91
|
-
function getTerminalWidth() {
|
|
92
|
-
return process.stdout.columns || 80;
|
|
93
|
-
}
|
|
94
|
-
function centerText(text, width) {
|
|
95
|
-
const cleanText = text.replace(/\x1b\[[0-9;]*m/g, '');
|
|
96
|
-
const totalPadding = Math.max(0, width - cleanText.length);
|
|
97
|
-
const leftPadding = Math.floor(totalPadding / 2);
|
|
98
|
-
const rightPadding = totalPadding - leftPadding;
|
|
99
|
-
return ' '.repeat(leftPadding) + text + ' '.repeat(rightPadding);
|
|
100
|
-
}
|
|
101
|
-
function formatBytes(bytes) {
|
|
102
|
-
if (bytes === 0)
|
|
103
|
-
return '0 B';
|
|
104
|
-
const k = 1024;
|
|
105
|
-
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
106
|
-
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
107
|
-
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
|
108
|
-
}
|
|
109
|
-
function formatSpeed(bytesPerSecond) {
|
|
110
|
-
return formatBytes(bytesPerSecond) + '/s';
|
|
111
|
-
}
|
|
112
|
-
async function fetchJson(url) {
|
|
113
|
-
return new Promise((resolve, reject) => {
|
|
114
|
-
const options = {
|
|
115
|
-
headers: { 'User-Agent': CONFIG.userAgent },
|
|
116
|
-
};
|
|
117
|
-
https
|
|
118
|
-
.get(url, options, (res) => {
|
|
119
|
-
if (res.statusCode !== 200) {
|
|
120
|
-
res.resume();
|
|
121
|
-
return reject(new Error(`Request failed with status code ${res.statusCode}`));
|
|
122
|
-
}
|
|
123
|
-
let data = '';
|
|
124
|
-
res.on('data', (chunk) => (data += chunk));
|
|
125
|
-
res.on('end', () => {
|
|
126
|
-
try {
|
|
127
|
-
resolve(JSON.parse(data));
|
|
128
|
-
}
|
|
129
|
-
catch (e) {
|
|
130
|
-
reject(e instanceof Error ? e : new Error(String(e)));
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
})
|
|
134
|
-
.on('error', (err) => reject(err instanceof Error ? err : new Error(String(err))));
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
async function downloadFile(url, destPath, onProgress) {
|
|
138
|
-
return new Promise((resolve, reject) => {
|
|
139
|
-
const file = fs.createWriteStream(destPath);
|
|
140
|
-
const options = {
|
|
141
|
-
headers: { 'User-Agent': CONFIG.userAgent },
|
|
142
|
-
};
|
|
143
|
-
https
|
|
144
|
-
.get(url, options, (res) => {
|
|
145
|
-
if (res.statusCode === 302 || res.statusCode === 301) {
|
|
146
|
-
if (!res.headers.location) {
|
|
147
|
-
return reject(new Error('Redirect location missing'));
|
|
148
|
-
}
|
|
149
|
-
downloadFile(res.headers.location, destPath, onProgress).then(resolve).catch(reject);
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
if (res.statusCode !== 200) {
|
|
153
|
-
res.resume();
|
|
154
|
-
return reject(new Error(`Download failed with status code ${res.statusCode}`));
|
|
155
|
-
}
|
|
156
|
-
const totalSize = parseInt(res.headers['content-length'] || '0', 10);
|
|
157
|
-
let downloadedSize = 0;
|
|
158
|
-
let startTime = Date.now();
|
|
159
|
-
res.on('data', (chunk) => {
|
|
160
|
-
downloadedSize += chunk.length;
|
|
161
|
-
file.write(chunk);
|
|
162
|
-
const currentTime = Date.now();
|
|
163
|
-
const elapsed = (currentTime - startTime) / 1000;
|
|
164
|
-
const speed = elapsed > 0 ? downloadedSize / elapsed : 0;
|
|
165
|
-
if (onProgress) {
|
|
166
|
-
onProgress(downloadedSize, totalSize, speed);
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
res.on('end', () => {
|
|
170
|
-
file.end();
|
|
171
|
-
resolve();
|
|
172
|
-
});
|
|
173
|
-
res.on('error', (err) => {
|
|
174
|
-
fs.unlink(destPath, () => { });
|
|
175
|
-
reject(err);
|
|
176
|
-
});
|
|
177
|
-
})
|
|
178
|
-
.on('error', (err) => {
|
|
179
|
-
fs.unlink(destPath, () => { });
|
|
180
|
-
reject(err);
|
|
181
|
-
});
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
function printHeader() {
|
|
185
|
-
console.clear();
|
|
186
|
-
const width = Math.min(getTerminalWidth(), 80);
|
|
187
|
-
const innerWidth = width - 4;
|
|
188
|
-
console.log(c.brightCyan + sym.topLeft + sym.horizontal.repeat(width - 2) + sym.topRight + c.reset);
|
|
189
|
-
console.log(c.brightCyan +
|
|
190
|
-
sym.vertical +
|
|
191
|
-
c.reset +
|
|
192
|
-
centerText(`${c.brightWhite}${c.bold}MCModding-MCP Optional Components${c.reset}`, innerWidth) +
|
|
193
|
-
c.brightCyan +
|
|
194
|
-
sym.vertical +
|
|
195
|
-
c.reset);
|
|
196
|
-
console.log(c.brightCyan +
|
|
197
|
-
sym.vertical +
|
|
198
|
-
c.reset +
|
|
199
|
-
centerText(`${c.dim}Enhance your AI assistant with specialized knowledge bases${c.reset}`, innerWidth) +
|
|
200
|
-
c.brightCyan +
|
|
201
|
-
sym.vertical +
|
|
202
|
-
c.reset);
|
|
203
|
-
console.log(c.brightCyan + sym.bottomLeft + sym.horizontal.repeat(width - 2) + sym.bottomRight + c.reset);
|
|
204
|
-
console.log();
|
|
205
|
-
}
|
|
206
|
-
function drawProgressBar(current, total, speed, label = 'Downloading') {
|
|
207
|
-
const width = Math.min(getTerminalWidth(), 80);
|
|
208
|
-
const barWidth = Math.max(10, width - 30);
|
|
209
|
-
const percentage = total > 0 ? Math.min(100, (current / total) * 100) : 0;
|
|
210
|
-
const filledWidth = Math.round((percentage / 100) * barWidth);
|
|
211
|
-
const emptyWidth = barWidth - filledWidth;
|
|
212
|
-
const filledBar = c.brightGreen + sym.barFull.repeat(filledWidth) + c.reset;
|
|
213
|
-
const emptyBar = c.dim + sym.barEmpty.repeat(emptyWidth) + c.reset;
|
|
214
|
-
process.stdout.write(c.cursorHide);
|
|
215
|
-
process.stdout.write(c.clearLine + '\r');
|
|
216
|
-
const sizeStr = `${formatBytes(current)}/${formatBytes(total)}`;
|
|
217
|
-
const speedStr = formatSpeed(speed);
|
|
218
|
-
console.log(c.cursorUp + c.clearLine + `${c.cyan}${sym.download} ${label}...${c.reset}`);
|
|
219
|
-
console.log(`${filledBar}${emptyBar} ${c.brightWhite}${percentage.toFixed(1)}%${c.reset}`);
|
|
220
|
-
console.log(`${c.dim}${sizeStr} • ${speedStr}${c.reset}`);
|
|
221
|
-
process.stdout.write(c.cursorUp + c.cursorUp);
|
|
222
|
-
}
|
|
223
|
-
function getLocalVersion(dbConfig) {
|
|
224
|
-
const manifestPath = path.join(CONFIG.dataDir, dbConfig.manifestName);
|
|
225
|
-
if (fs.existsSync(manifestPath)) {
|
|
226
|
-
try {
|
|
227
|
-
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
|
|
228
|
-
return manifest.version;
|
|
229
|
-
}
|
|
230
|
-
catch {
|
|
231
|
-
return null;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
return null;
|
|
235
|
-
}
|
|
236
|
-
async function getRemoteVersion(dbConfig) {
|
|
237
|
-
try {
|
|
238
|
-
const releases = (await fetchJson(`https://api.github.com/repos/${CONFIG.repoOwner}/${CONFIG.repoName}/releases`));
|
|
239
|
-
const release = releases.find((r) => r.tag_name.startsWith(dbConfig.tagPrefix));
|
|
240
|
-
if (!release)
|
|
241
|
-
return null;
|
|
242
|
-
const version = release.tag_name.replace(dbConfig.tagPrefix, '');
|
|
243
|
-
const dbAsset = release.assets.find((a) => a.name === dbConfig.fileName);
|
|
244
|
-
const manifestAsset = release.assets.find((a) => a.name === dbConfig.manifestName);
|
|
245
|
-
if (!dbAsset)
|
|
246
|
-
return null;
|
|
247
|
-
return {
|
|
248
|
-
version,
|
|
249
|
-
releaseId: release.id,
|
|
250
|
-
downloadUrl: dbAsset.browser_download_url,
|
|
251
|
-
manifestUrl: manifestAsset ? manifestAsset.browser_download_url : null,
|
|
252
|
-
size: dbAsset.size,
|
|
253
|
-
publishedAt: release.published_at,
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
catch {
|
|
257
|
-
return null;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
async function promptSelection(options) {
|
|
261
|
-
const rl = readline.createInterface({
|
|
262
|
-
input: process.stdin,
|
|
263
|
-
output: process.stdout,
|
|
264
|
-
});
|
|
265
|
-
let selectedIndex = 0;
|
|
266
|
-
const render = () => {
|
|
267
|
-
printHeader();
|
|
268
|
-
console.log(`${c.brightWhite}Select a database to install/update:${c.reset}\n`);
|
|
269
|
-
options.forEach((opt, idx) => {
|
|
270
|
-
const isSelected = idx === selectedIndex;
|
|
271
|
-
const prefix = isSelected ? `${c.brightCyan}${sym.arrowRight} ` : ' ';
|
|
272
|
-
const checkbox = opt.selected
|
|
273
|
-
? `${c.brightGreen}${sym.selected}${c.reset}`
|
|
274
|
-
: `${c.dim}${sym.unselected}${c.reset}`;
|
|
275
|
-
const style = isSelected ? c.brightWhite + c.bold : c.white;
|
|
276
|
-
console.log(`${prefix}${checkbox} ${style}${opt.name}${c.reset}`);
|
|
277
|
-
let status = '';
|
|
278
|
-
if (opt.localVersion) {
|
|
279
|
-
status += `${c.green}Installed: v${opt.localVersion}${c.reset}`;
|
|
280
|
-
}
|
|
281
|
-
else {
|
|
282
|
-
status += `${c.dim}Not installed${c.reset}`;
|
|
283
|
-
}
|
|
284
|
-
if (opt.remoteInfo) {
|
|
285
|
-
if (opt.localVersion && opt.remoteInfo.version !== opt.localVersion) {
|
|
286
|
-
status += ` ${c.dim}→${c.reset} ${c.brightYellow}Update available: v${opt.remoteInfo.version}${c.reset}`;
|
|
287
|
-
}
|
|
288
|
-
else if (!opt.localVersion) {
|
|
289
|
-
status += ` ${c.dim}→${c.reset} ${c.brightCyan}Available: v${opt.remoteInfo.version}${c.reset}`;
|
|
290
|
-
}
|
|
291
|
-
else {
|
|
292
|
-
status += ` ${c.dim}(Latest)${c.reset}`;
|
|
293
|
-
}
|
|
294
|
-
status += ` ${c.dim}[${formatBytes(opt.remoteInfo.size)}]${c.reset}`;
|
|
295
|
-
}
|
|
296
|
-
else {
|
|
297
|
-
status += ` ${c.red}(Offline/Unavailable)${c.reset}`;
|
|
298
|
-
}
|
|
299
|
-
console.log(` ${status}`);
|
|
300
|
-
console.log(` ${c.dim}${opt.description}${c.reset}\n`);
|
|
301
|
-
});
|
|
302
|
-
console.log(`${c.dim}Use ↑/↓ to navigate, SPACE to toggle, ENTER to confirm${c.reset}`);
|
|
303
|
-
};
|
|
304
|
-
return new Promise((resolve) => {
|
|
305
|
-
if (options.length > 0 && options[0]) {
|
|
306
|
-
options[0].selected = true;
|
|
307
|
-
}
|
|
308
|
-
process.stdin.setRawMode(true);
|
|
309
|
-
process.stdin.resume();
|
|
310
|
-
render();
|
|
311
|
-
process.stdin.on('data', (key) => {
|
|
312
|
-
const keyStr = key.toString();
|
|
313
|
-
if (keyStr === '\u0003') {
|
|
314
|
-
process.exit(0);
|
|
315
|
-
}
|
|
316
|
-
else if (keyStr === '\u001b[A') {
|
|
317
|
-
selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : options.length - 1;
|
|
318
|
-
render();
|
|
319
|
-
}
|
|
320
|
-
else if (keyStr === '\u001b[B') {
|
|
321
|
-
selectedIndex = selectedIndex < options.length - 1 ? selectedIndex + 1 : 0;
|
|
322
|
-
render();
|
|
323
|
-
}
|
|
324
|
-
else if (keyStr === ' ') {
|
|
325
|
-
const selectedOption = options[selectedIndex];
|
|
326
|
-
if (selectedOption) {
|
|
327
|
-
selectedOption.selected = !selectedOption.selected;
|
|
328
|
-
render();
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
else if (keyStr === '\r') {
|
|
332
|
-
process.stdin.setRawMode(false);
|
|
333
|
-
process.stdin.pause();
|
|
334
|
-
rl.close();
|
|
335
|
-
resolve(options.filter((o) => o.selected));
|
|
336
|
-
}
|
|
337
|
-
});
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
export async function runInstaller() {
|
|
341
|
-
printHeader();
|
|
342
|
-
console.log(`${c.cyan}${sym.info} Checking for available databases...${c.reset}`);
|
|
343
|
-
const choices = [];
|
|
344
|
-
for (const db of OPTIONAL_DBS) {
|
|
345
|
-
const localVersion = getLocalVersion(db);
|
|
346
|
-
const remoteInfo = await getRemoteVersion(db);
|
|
347
|
-
choices.push({ ...db, localVersion, remoteInfo, selected: false });
|
|
348
|
-
}
|
|
349
|
-
if (choices.length === 0) {
|
|
350
|
-
console.log(`${c.yellow}No optional databases found in configuration.${c.reset}`);
|
|
351
|
-
return;
|
|
352
|
-
}
|
|
353
|
-
const selected = await promptSelection(choices);
|
|
354
|
-
if (selected.length === 0) {
|
|
355
|
-
console.log(`\n${c.yellow}No databases selected. Exiting.${c.reset}`);
|
|
356
|
-
return;
|
|
357
|
-
}
|
|
358
|
-
console.log(`\n${c.brightWhite}Starting installation...${c.reset}\n`);
|
|
359
|
-
for (const item of selected) {
|
|
360
|
-
if (!item.remoteInfo) {
|
|
361
|
-
console.log(`${c.red}${sym.cross} Skipping ${item.name}: Remote version unavailable.${c.reset}`);
|
|
362
|
-
continue;
|
|
363
|
-
}
|
|
364
|
-
const destDbPath = path.join(CONFIG.dataDir, item.fileName);
|
|
365
|
-
const destManifestPath = path.join(CONFIG.dataDir, item.manifestName);
|
|
366
|
-
console.log(`${c.brightCyan}${sym.package} Installing ${item.name} (v${item.remoteInfo.version})...${c.reset}`);
|
|
367
|
-
if (!fs.existsSync(CONFIG.dataDir)) {
|
|
368
|
-
fs.mkdirSync(CONFIG.dataDir, { recursive: true });
|
|
369
|
-
}
|
|
370
|
-
try {
|
|
371
|
-
console.log();
|
|
372
|
-
await downloadFile(item.remoteInfo.downloadUrl, destDbPath, (current, total, speed) => {
|
|
373
|
-
drawProgressBar(current, total, speed, `Downloading ${item.fileName}`);
|
|
374
|
-
});
|
|
375
|
-
console.log(`\n${c.green}${sym.check} Download complete!${c.reset}`);
|
|
376
|
-
if (item.remoteInfo.manifestUrl) {
|
|
377
|
-
console.log(`${c.dim} Fetching manifest...${c.reset}`);
|
|
378
|
-
await downloadFile(item.remoteInfo.manifestUrl, destManifestPath);
|
|
379
|
-
}
|
|
380
|
-
else {
|
|
381
|
-
const minimalManifest = {
|
|
382
|
-
version: item.remoteInfo.version,
|
|
383
|
-
updatedAt: new Date().toISOString(),
|
|
384
|
-
source: 'manual-install',
|
|
385
|
-
};
|
|
386
|
-
fs.writeFileSync(destManifestPath, JSON.stringify(minimalManifest, null, 2));
|
|
387
|
-
}
|
|
388
|
-
console.log(`${c.brightGreen}${sym.sparkle} Successfully installed ${item.name}!${c.reset}\n`);
|
|
389
|
-
}
|
|
390
|
-
catch (err) {
|
|
391
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
392
|
-
console.error(`\n${c.red}${sym.cross} Failed to install ${item.name}: ${message}${c.reset}\n`);
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
console.log(`${c.brightWhite}${sym.check} All operations completed.${c.reset}`);
|
|
396
|
-
}
|
|
397
|
-
//# sourceMappingURL=install.js.map
|
package/dist/cli/install.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAM3C,MAAM,MAAM,GAAG;IACb,SAAS,EAAE,UAAU;IACrB,QAAQ,EAAE,eAAe;IAEzB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC;IACjD,SAAS,EAAE,yBAAyB;CACrC,CAAC;AAqCF,MAAM,YAAY,GAAiB;IACjC;QACE,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,iBAAiB;QAC3B,YAAY,EAAE,4BAA4B;QAC1C,WAAW,EAAE,2DAA2D;QACxE,SAAS,EAAE,YAAY;QACvB,IAAI,EAAE,IAAI;KACX;CACF,CAAC;AAMF,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AAEvE,MAAM,CAAC,GAAG;IACR,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;IACxC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;IACvC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;IACtC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;IACzC,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;IAC5C,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IACzC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IACvC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IACzC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IAC1C,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IACxC,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IAC3C,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IACxC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IACzC,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IAC/C,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IAC7C,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IAC/C,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IAChD,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IAC9C,aAAa,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IACjD,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IAC9C,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IAC/C,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IAC1C,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;IAC5C,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;IAC3C,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;IAC/C,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;CAChD,CAAC;AAEF,MAAM,GAAG,GAAG;IACV,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,UAAU,EAAE,GAAG;IACf,WAAW,EAAE,GAAG;IAChB,UAAU,EAAE,GAAG;IACf,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,GAAG;IACb,SAAS,EAAE,GAAG;IACd,WAAW,EAAE,GAAG;IAChB,YAAY,EAAE,GAAG;IACjB,WAAW,EAAE,GAAG;IAChB,SAAS,EAAE,GAAG;IACd,OAAO,EAAE,GAAG;IACZ,eAAe,EAAE,GAAG;IACpB,OAAO,EAAE,GAAG;IACZ,UAAU,EAAE,GAAG;IACf,QAAQ,EAAE,GAAG;IACb,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;IACV,OAAO,EAAE,GAAG;IACZ,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,OAAO,EAAE,GAAG;IACZ,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,GAAG;IACb,MAAM,EAAE,KAAK;IACb,KAAK,EAAE,GAAG;IACV,SAAS,EAAE,GAAG;IACd,UAAU,EAAE,GAAG;IACf,GAAG,EAAE,GAAG;IACR,MAAM,EAAE,GAAG;IACX,QAAQ,EAAE,GAAG;IACb,UAAU,EAAE,GAAG;CAChB,CAAC;AAMF,SAAS,gBAAgB;IACvB,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,KAAa;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;IAChD,OAAO,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC;IACf,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,UAAU,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,WAAW,CAAC,cAAsB;IACzC,OAAO,WAAW,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;AAC5C,CAAC;AAMD,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE;SAC5C,CAAC;QACF,KAAK;aACF,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC3B,GAAG,CAAC,MAAM,EAAE,CAAC;gBACb,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAChF,CAAC;YACD,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC;YAC3C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5B,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,MAAM,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;aACD,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,GAAW,EACX,QAAgB,EAChB,UAAoE;IAEpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE;SAC5C,CAAC;QAEF,KAAK;aACF,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBACrD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;oBAC1B,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;gBACxD,CAAC;gBACD,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACrF,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC3B,GAAG,CAAC,MAAM,EAAE,CAAC;gBACb,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACjF,CAAC;YAED,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;YACrE,IAAI,cAAc,GAAG,CAAC,CAAC;YACvB,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE3B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC/B,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC;gBAC/B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAElB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;gBACjD,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEzD,IAAI,UAAU,EAAE,CAAC;oBACf,UAAU,CAAC,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC,GAAG,EAAE,CAAC;gBACX,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACtB,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAC9B,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;aACD,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACnB,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC;AAMD,SAAS,WAAW;IAClB,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC;IAE7B,OAAO,CAAC,GAAG,CACT,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,CACvF,CAAC;IACF,OAAO,CAAC,GAAG,CACT,CAAC,CAAC,UAAU;QACV,GAAG,CAAC,QAAQ;QACZ,CAAC,CAAC,KAAK;QACP,UAAU,CACR,GAAG,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,oCAAoC,CAAC,CAAC,KAAK,EAAE,EACtE,UAAU,CACX;QACD,CAAC,CAAC,UAAU;QACZ,GAAG,CAAC,QAAQ;QACZ,CAAC,CAAC,KAAK,CACV,CAAC;IACF,OAAO,CAAC,GAAG,CACT,CAAC,CAAC,UAAU;QACV,GAAG,CAAC,QAAQ;QACZ,CAAC,CAAC,KAAK;QACP,UAAU,CACR,GAAG,CAAC,CAAC,GAAG,6DAA6D,CAAC,CAAC,KAAK,EAAE,EAC9E,UAAU,CACX;QACD,CAAC,CAAC,UAAU;QACZ,GAAG,CAAC,QAAQ;QACZ,CAAC,CAAC,KAAK,CACV,CAAC;IACF,OAAO,CAAC,GAAG,CACT,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,KAAK,CAC7F,CAAC;IACF,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,KAAa,EAAE,KAAa,EAAE,KAAK,GAAG,aAAa;IAC3F,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;IAE1C,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAC;IAE1C,MAAM,SAAS,GAAG,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IAC5E,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IAEnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAEzC,MAAM,OAAO,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;IAChE,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEpC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,QAAQ,IAAI,KAAK,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,QAAQ,IAAI,CAAC,CAAC,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,OAAO,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;AAChD,CAAC;AAMD,SAAS,eAAe,CAAC,QAAoB;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IACtE,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAwB,CAAC;YAC1F,OAAO,QAAQ,CAAC,OAAO,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,QAAoB;IAClD,IAAI,CAAC;QAEH,MAAM,QAAQ,GAAG,CAAC,MAAM,SAAS,CAC/B,gCAAgC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,WAAW,CAC/E,CAAoB,CAAC;QAGtB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAEhF,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAG1B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAGjE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzE,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEnF,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE1B,OAAO;YACL,OAAO;YACP,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,WAAW,EAAE,OAAO,CAAC,oBAAoB;YACzC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI;YACtE,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,YAAY;SAClC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,OAAqB;IAClD,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,WAAW,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,WAAW,uCAAuC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAEhF,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,UAAU,GAAG,GAAG,KAAK,aAAa,CAAC;YACzC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YACvE,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ;gBAC3B,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,EAAE;gBAC7C,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAE5D,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,QAAQ,IAAI,KAAK,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAGlE,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,eAAe,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAAC;YAC9C,CAAC;YAED,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;gBACnB,IAAI,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,KAAK,GAAG,CAAC,YAAY,EAAE,CAAC;oBACpE,MAAM,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,YAAY,sBAAsB,GAAG,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;gBAC3G,CAAC;qBAAM,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;oBAC7B,MAAM,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,UAAU,eAAe,GAAG,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;gBAClG,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC;gBAC1C,CAAC;gBACD,MAAM,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,IAAI,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAC,KAAK,EAAE,CAAC;YACvD,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,yDAAyD,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1F,CAAC,CAAC;IAEF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAE7B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAEvB,MAAM,EAAE,CAAC;QAET,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;YAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YAE9B,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAExB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;iBAAM,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;gBAEjC,aAAa,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC3E,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;gBAEjC,aAAa,GAAG,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3E,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;gBAE1B,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;gBAC9C,IAAI,cAAc,EAAE,CAAC;oBACnB,cAAc,CAAC,QAAQ,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC;oBACnD,MAAM,EAAE,CAAC;gBACX,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAE3B,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACtB,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,WAAW,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,uCAAuC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAGlF,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,gDAAgD,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAClF,OAAO;IACT,CAAC;IAGD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAEhD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,kCAAkC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,WAAW,2BAA2B,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAGtE,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CACT,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,aAAa,IAAI,CAAC,IAAI,gCAAgC,CAAC,CAAC,KAAK,EAAE,CACpF,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAEtE,OAAO,CAAC,GAAG,CACT,GAAG,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,OAAO,eAAe,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,EAAE,CACnG,CAAC;QAGF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC;YAEH,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,MAAM,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACpF,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACzE,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAGrE,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gBACzD,MAAM,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBAEN,MAAM,eAAe,GAAG;oBACtB,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO;oBAChC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,MAAM,EAAE,gBAAgB;iBACzB,CAAC;gBACF,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/E,CAAC;YAED,OAAO,CAAC,GAAG,CACT,GAAG,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,OAAO,2BAA2B,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAClF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,sBAAsB,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,CAAC,CAAC,KAAK,IAAI,CAChF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,KAAK,6BAA6B,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAClF,CAAC"}
|