@boxlite-ai/boxlite 0.2.11 → 0.3.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/browserbox.d.ts.map +1 -1
- package/dist/browserbox.js.map +1 -1
- package/dist/codebox.d.ts +2 -2
- package/dist/codebox.d.ts.map +1 -1
- package/dist/codebox.js +10 -10
- package/dist/codebox.js.map +1 -1
- package/dist/computerbox.d.ts +4 -4
- package/dist/computerbox.d.ts.map +1 -1
- package/dist/computerbox.js +36 -32
- package/dist/computerbox.js.map +1 -1
- package/dist/constants.d.ts +5 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +9 -3
- package/dist/constants.js.map +1 -1
- package/dist/copy.d.ts +14 -0
- package/dist/copy.d.ts.map +1 -0
- package/dist/copy.js +2 -0
- package/dist/copy.js.map +1 -0
- package/dist/errors.js +4 -4
- package/dist/index.d.ts +11 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -10
- package/dist/index.js.map +1 -1
- package/dist/interactivebox.d.ts +1 -1
- package/dist/interactivebox.d.ts.map +1 -1
- package/dist/interactivebox.js +6 -6
- package/dist/interactivebox.js.map +1 -1
- package/dist/native.js +1 -1
- package/dist/simplebox.d.ts +28 -1
- package/dist/simplebox.d.ts.map +1 -1
- package/dist/simplebox.js +84 -40
- package/dist/simplebox.js.map +1 -1
- package/dist/skillbox.d.ts +109 -0
- package/dist/skillbox.d.ts.map +1 -0
- package/dist/skillbox.js +368 -0
- package/dist/skillbox.js.map +1 -0
- package/native/boxlite.js +54 -53
- package/package.json +12 -7
package/dist/skillbox.js
ADDED
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SkillBox - Secure Claude Code CLI container.
|
|
3
|
+
*
|
|
4
|
+
* Provides an isolated environment for running Claude Code CLI with skills.
|
|
5
|
+
*/
|
|
6
|
+
import * as net from "node:net";
|
|
7
|
+
import { SimpleBox } from "./simplebox.js";
|
|
8
|
+
import { TimeoutError } from "./errors.js";
|
|
9
|
+
import { SKILLBOX_IMAGE, SKILLBOX_MEMORY_MIB, SKILLBOX_DISK_SIZE_GB, SKILLBOX_GUI_HTTP_PORT, SKILLBOX_GUI_HTTPS_PORT, COMPUTERBOX_DISPLAY_WIDTH, COMPUTERBOX_DISPLAY_HEIGHT, DESKTOP_READY_TIMEOUT, DESKTOP_READY_RETRY_DELAY, } from "./constants.js";
|
|
10
|
+
function findAvailablePort(start = 10000, end = 65535) {
|
|
11
|
+
const ports = Array.from({ length: end - start + 1 }, (_, i) => start + i);
|
|
12
|
+
// Shuffle and try up to 100
|
|
13
|
+
for (let i = ports.length - 1; i > 0; i--) {
|
|
14
|
+
const j = Math.floor(Math.random() * (i + 1));
|
|
15
|
+
[ports[i], ports[j]] = [ports[j], ports[i]];
|
|
16
|
+
}
|
|
17
|
+
const candidates = ports.slice(0, 100);
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
let idx = 0;
|
|
20
|
+
function tryNext() {
|
|
21
|
+
if (idx >= candidates.length) {
|
|
22
|
+
reject(new Error(`Could not find an available port in range ${start}-${end}`));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const port = candidates[idx++];
|
|
26
|
+
const server = net.createServer();
|
|
27
|
+
server.once("error", () => tryNext());
|
|
28
|
+
server.once("listening", () => {
|
|
29
|
+
server.close(() => resolve(port));
|
|
30
|
+
});
|
|
31
|
+
server.listen(port, "127.0.0.1");
|
|
32
|
+
}
|
|
33
|
+
tryNext();
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function sleep(ms) {
|
|
37
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Secure container for running Claude Code CLI with skills.
|
|
41
|
+
*
|
|
42
|
+
* SkillBox provides an isolated environment for Claude Code CLI
|
|
43
|
+
* with user-specified skills installed. It supports multi-turn conversations
|
|
44
|
+
* and includes a desktop GUI accessible via noVNC.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const box = new SkillBox({ skills: ["anthropics/skills"] });
|
|
49
|
+
* try {
|
|
50
|
+
* await box.start();
|
|
51
|
+
* const result = await box.call("What skills do you have?");
|
|
52
|
+
* console.log(result);
|
|
53
|
+
* } finally {
|
|
54
|
+
* await box.stop();
|
|
55
|
+
* }
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export class SkillBox extends SimpleBox {
|
|
59
|
+
constructor(options = {}) {
|
|
60
|
+
// Build image args
|
|
61
|
+
const imageOpts = {};
|
|
62
|
+
if (options.rootfsPath) {
|
|
63
|
+
imageOpts.rootfsPath = options.rootfsPath;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
imageOpts.image = options.image ?? SKILLBOX_IMAGE;
|
|
67
|
+
}
|
|
68
|
+
const oauthToken = options.oauthToken ?? process.env.CLAUDE_CODE_OAUTH_TOKEN ?? "";
|
|
69
|
+
super({
|
|
70
|
+
...imageOpts,
|
|
71
|
+
memoryMib: options.memoryMib ?? SKILLBOX_MEMORY_MIB,
|
|
72
|
+
diskSizeGb: options.diskSizeGb ?? SKILLBOX_DISK_SIZE_GB,
|
|
73
|
+
name: options.name ?? "skill-box",
|
|
74
|
+
autoRemove: options.autoRemove ?? true,
|
|
75
|
+
runtime: options.runtime,
|
|
76
|
+
env: {
|
|
77
|
+
CLAUDE_CODE_OAUTH_TOKEN: oauthToken,
|
|
78
|
+
DISPLAY: ":1",
|
|
79
|
+
DISPLAY_SIZEW: String(COMPUTERBOX_DISPLAY_WIDTH),
|
|
80
|
+
DISPLAY_SIZEH: String(COMPUTERBOX_DISPLAY_HEIGHT),
|
|
81
|
+
SELKIES_MANUAL_WIDTH: String(COMPUTERBOX_DISPLAY_WIDTH),
|
|
82
|
+
SELKIES_MANUAL_HEIGHT: String(COMPUTERBOX_DISPLAY_HEIGHT),
|
|
83
|
+
SELKIES_UI_SHOW_SIDEBAR: "false",
|
|
84
|
+
},
|
|
85
|
+
ports: [],
|
|
86
|
+
});
|
|
87
|
+
this._process = null;
|
|
88
|
+
this._stdin = null;
|
|
89
|
+
this._stdout = null;
|
|
90
|
+
this._sessionId = "default";
|
|
91
|
+
this._setupComplete = false;
|
|
92
|
+
this._started = false;
|
|
93
|
+
this._skillboxEnv = {
|
|
94
|
+
DISPLAY: ":1",
|
|
95
|
+
};
|
|
96
|
+
this._skills = options.skills ?? [];
|
|
97
|
+
this._oauthToken = oauthToken;
|
|
98
|
+
this.guiHttpPort = options.guiHttpPort ?? 0;
|
|
99
|
+
this.guiHttpsPort = options.guiHttpsPort ?? 0;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Start the SkillBox (resolves ports and creates the box).
|
|
103
|
+
*/
|
|
104
|
+
async start() {
|
|
105
|
+
if (!this._oauthToken) {
|
|
106
|
+
throw new Error("OAuth token required. Set CLAUDE_CODE_OAUTH_TOKEN env var " +
|
|
107
|
+
"or pass oauthToken parameter.");
|
|
108
|
+
}
|
|
109
|
+
// Resolve ports
|
|
110
|
+
if (this.guiHttpPort === 0) {
|
|
111
|
+
this.guiHttpPort = await findAvailablePort();
|
|
112
|
+
}
|
|
113
|
+
if (this.guiHttpsPort === 0) {
|
|
114
|
+
this.guiHttpsPort = await findAvailablePort();
|
|
115
|
+
}
|
|
116
|
+
if (this.guiHttpPort === this.guiHttpsPort) {
|
|
117
|
+
this.guiHttpsPort = await findAvailablePort();
|
|
118
|
+
}
|
|
119
|
+
// Patch port mappings before box creation
|
|
120
|
+
this._boxOpts.ports = [
|
|
121
|
+
{ hostPort: this.guiHttpPort, guestPort: SKILLBOX_GUI_HTTP_PORT },
|
|
122
|
+
{ hostPort: this.guiHttpsPort, guestPort: SKILLBOX_GUI_HTTPS_PORT },
|
|
123
|
+
];
|
|
124
|
+
await this._ensureBox();
|
|
125
|
+
this._started = true;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Stop the SkillBox and clean up Claude process.
|
|
129
|
+
*/
|
|
130
|
+
async stop() {
|
|
131
|
+
await this._stopClaude();
|
|
132
|
+
this._started = false;
|
|
133
|
+
await super.stop();
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Wait until the desktop environment is fully loaded and ready.
|
|
137
|
+
*
|
|
138
|
+
* @param timeout - Maximum time to wait in seconds (default: 60)
|
|
139
|
+
*/
|
|
140
|
+
async waitUntilReady(timeout = DESKTOP_READY_TIMEOUT) {
|
|
141
|
+
const startMs = Date.now();
|
|
142
|
+
const expectedSize = `${COMPUTERBOX_DISPLAY_WIDTH}x${COMPUTERBOX_DISPLAY_HEIGHT}`;
|
|
143
|
+
while (true) {
|
|
144
|
+
const elapsed = (Date.now() - startMs) / 1000;
|
|
145
|
+
if (elapsed > timeout) {
|
|
146
|
+
throw new TimeoutError(`Desktop did not become ready within ${timeout} seconds`);
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
const result = await SimpleBox.prototype.exec.call(this, "xwininfo", ["-tree", "-root"], this._skillboxEnv);
|
|
150
|
+
if (result.stdout.includes("xfdesktop") &&
|
|
151
|
+
result.stdout.includes(expectedSize)) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// Not ready yet
|
|
157
|
+
}
|
|
158
|
+
await sleep(DESKTOP_READY_RETRY_DELAY * 1000);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Send a prompt to Claude and return the response.
|
|
163
|
+
*
|
|
164
|
+
* Supports multi-turn conversations within the same session.
|
|
165
|
+
* On first call, installs dependencies if not already installed.
|
|
166
|
+
*
|
|
167
|
+
* @param prompt - The message to send to Claude
|
|
168
|
+
* @returns Claude's response text
|
|
169
|
+
*/
|
|
170
|
+
async call(prompt) {
|
|
171
|
+
if (!this._started) {
|
|
172
|
+
throw new Error("SkillBox not started. Call start() first.");
|
|
173
|
+
}
|
|
174
|
+
if (!this._setupComplete) {
|
|
175
|
+
await this._setup();
|
|
176
|
+
this._setupComplete = true;
|
|
177
|
+
}
|
|
178
|
+
if (!this._stdin || !this._stdout) {
|
|
179
|
+
await this._startClaude();
|
|
180
|
+
}
|
|
181
|
+
const [responseText, newSessionId] = await this._sendMessage(prompt);
|
|
182
|
+
this._sessionId = newSessionId;
|
|
183
|
+
return responseText;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Install a skill from skills.sh.
|
|
187
|
+
*
|
|
188
|
+
* @param skillId - Skill identifier (owner/repo format)
|
|
189
|
+
* @returns True if installation succeeded
|
|
190
|
+
*/
|
|
191
|
+
async installSkill(skillId) {
|
|
192
|
+
if (!this._started) {
|
|
193
|
+
throw new Error("SkillBox not started. Call start() first.");
|
|
194
|
+
}
|
|
195
|
+
if (!this._setupComplete) {
|
|
196
|
+
await this._setup();
|
|
197
|
+
this._setupComplete = true;
|
|
198
|
+
}
|
|
199
|
+
return this._installSkillInternal(skillId);
|
|
200
|
+
}
|
|
201
|
+
async _setup() {
|
|
202
|
+
if (!(await this._isClaudeInstalled())) {
|
|
203
|
+
await this._installDependencies();
|
|
204
|
+
}
|
|
205
|
+
for (const skillId of this._skills) {
|
|
206
|
+
await this._installSkillInternal(skillId);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
async _isClaudeInstalled() {
|
|
210
|
+
try {
|
|
211
|
+
const result = await SimpleBox.prototype.exec.call(this, "claude", ["--version"], this._skillboxEnv);
|
|
212
|
+
return result.exitCode === 0;
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
async _installDependencies() {
|
|
219
|
+
const run = (cmd, args) => SimpleBox.prototype.exec.call(this, cmd, args, this._skillboxEnv);
|
|
220
|
+
await run("apt-get", ["update"]);
|
|
221
|
+
const installResult = await run("bash", [
|
|
222
|
+
"-c",
|
|
223
|
+
"curl -fsSL https://claude.ai/install.sh | bash",
|
|
224
|
+
]);
|
|
225
|
+
if (installResult.exitCode !== 0) {
|
|
226
|
+
throw new Error(`Failed to install Claude CLI: ${installResult.stderr}`);
|
|
227
|
+
}
|
|
228
|
+
const bashResult = await run("apt-get", ["install", "-y", "bash"]);
|
|
229
|
+
if (bashResult.exitCode !== 0) {
|
|
230
|
+
throw new Error(`Failed to install bash: ${bashResult.stderr}`);
|
|
231
|
+
}
|
|
232
|
+
const gitResult = await run("apt-get", ["install", "-y", "git"]);
|
|
233
|
+
if (gitResult.exitCode !== 0) {
|
|
234
|
+
throw new Error(`Failed to install git: ${gitResult.stderr}`);
|
|
235
|
+
}
|
|
236
|
+
const pyResult = await run("apt-get", [
|
|
237
|
+
"install",
|
|
238
|
+
"-y",
|
|
239
|
+
"python3",
|
|
240
|
+
"python3-pip",
|
|
241
|
+
]);
|
|
242
|
+
if (pyResult.exitCode !== 0) {
|
|
243
|
+
throw new Error(`Failed to install Python: ${pyResult.stderr}`);
|
|
244
|
+
}
|
|
245
|
+
await run("/config/.local/bin/claude", ["--version"]);
|
|
246
|
+
}
|
|
247
|
+
async _installSkillInternal(skillId) {
|
|
248
|
+
const result = await SimpleBox.prototype.exec.call(this, "npx", ["add-skill", skillId, "-y", "--agent", "claude-code"], this._skillboxEnv);
|
|
249
|
+
return result.exitCode === 0;
|
|
250
|
+
}
|
|
251
|
+
async _startClaude() {
|
|
252
|
+
const box = await this._ensureBox();
|
|
253
|
+
this._process = await box.exec("claude", [
|
|
254
|
+
"--dangerously-skip-permissions",
|
|
255
|
+
"--input-format",
|
|
256
|
+
"stream-json",
|
|
257
|
+
"--output-format",
|
|
258
|
+
"stream-json",
|
|
259
|
+
"--mcp-config",
|
|
260
|
+
"/config/.claude.json",
|
|
261
|
+
"--verbose",
|
|
262
|
+
], [
|
|
263
|
+
["CLAUDE_CODE_OAUTH_TOKEN", this._oauthToken],
|
|
264
|
+
["IS_SANDBOX", "1"],
|
|
265
|
+
["SHELL", "/bin/bash"],
|
|
266
|
+
["DISPLAY", ":1"],
|
|
267
|
+
], false);
|
|
268
|
+
this._stdin = await this._process.stdin();
|
|
269
|
+
this._stdout = await this._process.stdout();
|
|
270
|
+
}
|
|
271
|
+
async _stopClaude() {
|
|
272
|
+
if (this._stdin) {
|
|
273
|
+
try {
|
|
274
|
+
await this._stdin.close();
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
// Ignore close errors
|
|
278
|
+
}
|
|
279
|
+
this._stdin = null;
|
|
280
|
+
}
|
|
281
|
+
if (this._process) {
|
|
282
|
+
try {
|
|
283
|
+
await this._process.wait();
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
// Ignore wait errors
|
|
287
|
+
}
|
|
288
|
+
this._process = null;
|
|
289
|
+
}
|
|
290
|
+
this._stdout = null;
|
|
291
|
+
}
|
|
292
|
+
async _sendMessage(content) {
|
|
293
|
+
const msg = {
|
|
294
|
+
type: "user",
|
|
295
|
+
message: { role: "user", content },
|
|
296
|
+
session_id: this._sessionId,
|
|
297
|
+
parent_tool_use_id: null,
|
|
298
|
+
};
|
|
299
|
+
const payload = JSON.stringify(msg) + "\n";
|
|
300
|
+
await this._stdin.writeString(payload);
|
|
301
|
+
const responses = [];
|
|
302
|
+
let newSessionId = this._sessionId;
|
|
303
|
+
let buffer = "";
|
|
304
|
+
let done = false;
|
|
305
|
+
try {
|
|
306
|
+
while (!done) {
|
|
307
|
+
const chunk = await Promise.race([
|
|
308
|
+
this._stdout.next(),
|
|
309
|
+
sleep(120000).then(() => {
|
|
310
|
+
throw new TimeoutError("Timeout waiting for Claude response");
|
|
311
|
+
}),
|
|
312
|
+
]);
|
|
313
|
+
if (chunk === null)
|
|
314
|
+
break;
|
|
315
|
+
buffer += chunk;
|
|
316
|
+
while (buffer.includes("\n")) {
|
|
317
|
+
const nlIdx = buffer.indexOf("\n");
|
|
318
|
+
const line = buffer.slice(0, nlIdx).trim();
|
|
319
|
+
buffer = buffer.slice(nlIdx + 1);
|
|
320
|
+
if (!line)
|
|
321
|
+
continue;
|
|
322
|
+
try {
|
|
323
|
+
const parsed = JSON.parse(line);
|
|
324
|
+
responses.push(parsed);
|
|
325
|
+
if (parsed.session_id) {
|
|
326
|
+
newSessionId = parsed.session_id;
|
|
327
|
+
}
|
|
328
|
+
if (parsed.type === "result") {
|
|
329
|
+
done = true;
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
// JSON parse error, skip
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
catch (err) {
|
|
340
|
+
if (!(err instanceof TimeoutError)) {
|
|
341
|
+
// Stream ended
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// Extract response text
|
|
345
|
+
const resultMsg = responses.find((r) => r.type === "result");
|
|
346
|
+
let responseText = "";
|
|
347
|
+
if (resultMsg) {
|
|
348
|
+
responseText = resultMsg.result ?? "";
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
for (const r of responses) {
|
|
352
|
+
if (r.type === "assistant") {
|
|
353
|
+
const contentList = r.message?.content ?? [];
|
|
354
|
+
for (const item of contentList) {
|
|
355
|
+
if (item.type === "text" && item.text) {
|
|
356
|
+
responseText = item.text;
|
|
357
|
+
break;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
if (responseText)
|
|
361
|
+
break;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
return [responseText, newSessionId];
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=skillbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillbox.js","sourceRoot":"","sources":["../lib/skillbox.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,SAAS,EAAyB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AAkCxB,SAAS,iBAAiB,CAAC,KAAK,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC3E,4BAA4B;IAC5B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAEvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,SAAS,OAAO;YACd,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBAC7B,MAAM,CACJ,IAAI,KAAK,CACP,6CAA6C,KAAK,IAAI,GAAG,EAAE,CAC5D,CACF,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;gBAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,QAAS,SAAQ,SAAS;IAmBrC,YAAY,UAA2B,EAAE;QACvC,mBAAmB;QACnB,MAAM,SAAS,GAA8B,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,SAAS,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,cAAc,CAAC;QACpD,CAAC;QAED,MAAM,UAAU,GACd,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,EAAE,CAAC;QAElE,KAAK,CAAC;YACJ,GAAG,SAAS;YACZ,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,mBAAmB;YACnD,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,qBAAqB;YACvD,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,WAAW;YACjC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;YACtC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,GAAG,EAAE;gBACH,uBAAuB,EAAE,UAAU;gBACnC,OAAO,EAAE,IAAI;gBACb,aAAa,EAAE,MAAM,CAAC,yBAAyB,CAAC;gBAChD,aAAa,EAAE,MAAM,CAAC,0BAA0B,CAAC;gBACjD,oBAAoB,EAAE,MAAM,CAAC,yBAAyB,CAAC;gBACvD,qBAAqB,EAAE,MAAM,CAAC,0BAA0B,CAAC;gBACzD,uBAAuB,EAAE,OAAO;aACjC;YACD,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;QA7CG,aAAQ,GAA2B,IAAI,CAAC;QACxC,WAAM,GAAQ,IAAI,CAAC;QACnB,YAAO,GAAQ,IAAI,CAAC;QACpB,eAAU,GAAW,SAAS,CAAC;QAC/B,mBAAc,GAAY,KAAK,CAAC;QAChC,aAAQ,GAAY,KAAK,CAAC;QAO1B,iBAAY,GAA2B;YAC7C,OAAO,EAAE,IAAI;SACd,CAAC;QAiCA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,4DAA4D;gBAC1D,+BAA+B,CAClC,CAAC;QACJ,CAAC;QAED,gBAAgB;QAChB,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,WAAW,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,YAAY,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAChD,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3C,IAAI,CAAC,YAAY,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAChD,CAAC;QAED,0CAA0C;QAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG;YACpB,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,sBAAsB,EAAE;YACjE,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,uBAAuB,EAAE;SACpE,CAAC;QAEF,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,cAAc,CAAC,UAAkB,qBAAqB;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,GAAG,yBAAyB,IAAI,0BAA0B,EAAE,CAAC;QAElF,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;YAC9C,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;gBACtB,MAAM,IAAI,YAAY,CACpB,uCAAuC,OAAO,UAAU,CACzD,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAChD,IAAI,EACJ,UAAU,EACV,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,IAAI,CAAC,YAAY,CAClB,CAAC;gBAEF,IACE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;oBACnC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EACpC,CAAC;oBACD,OAAO;gBACT,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,gBAAgB;YAClB,CAAC;YAED,MAAM,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CAAC,MAAc;QACvB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5B,CAAC;QAED,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC;QAC/B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,OAAe;QAChC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,OAAO,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACpC,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,kBAAkB;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAChD,IAAI,EACJ,QAAQ,EACR,CAAC,WAAW,CAAC,EACb,IAAI,CAAC,YAAY,CAClB,CAAC;YACF,OAAO,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB;QAChC,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,CAC1C,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAEpE,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEjC,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE;YACtC,IAAI;YACJ,gDAAgD;SACjD,CAAC,CAAC;QACH,IAAI,aAAa,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,iCAAiC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACnE,IAAI,UAAU,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,2BAA2B,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACjE,IAAI,SAAS,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,EAAE;YACpC,SAAS;YACT,IAAI;YACJ,SAAS;YACT,aAAa;SACd,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,GAAG,CAAC,2BAA2B,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,OAAe;QACjD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAChD,IAAI,EACJ,KAAK,EACL,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,EACtD,IAAI,CAAC,YAAY,CAClB,CAAC;QACF,OAAO,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAC5B,QAAQ,EACR;YACE,gCAAgC;YAChC,gBAAgB;YAChB,aAAa;YACb,iBAAiB;YACjB,aAAa;YACb,cAAc;YACd,sBAAsB;YACtB,WAAW;SACZ,EACD;YACE,CAAC,yBAAyB,EAAE,IAAI,CAAC,WAAW,CAAC;YAC7C,CAAC,YAAY,EAAE,GAAG,CAAC;YACnB,CAAC,OAAO,EAAE,WAAW,CAAC;YACtB,CAAC,SAAS,EAAE,IAAI,CAAC;SAClB,EACD,KAAK,CACN,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;YACvB,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,OAAe;QACxC,MAAM,GAAG,GAAG;YACV,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;YAClC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,kBAAkB,EAAE,IAAI;SACzB,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QAC3C,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEvC,MAAM,SAAS,GAAU,EAAE,CAAC;QAC5B,IAAI,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,IAAI,GAAG,KAAK,CAAC;QAEjB,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,EAAE,CAAC;gBACb,MAAM,KAAK,GAAkB,MAAM,OAAO,CAAC,IAAI,CAAC;oBAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,EAA4B;oBAC7C,KAAK,CAAC,MAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;wBACvB,MAAM,IAAI,YAAY,CAAC,qCAAqC,CAAC,CAAC;oBAChE,CAAC,CAAC;iBACH,CAAC,CAAC;gBAEH,IAAI,KAAK,KAAK,IAAI;oBAAE,MAAM;gBAC1B,MAAM,IAAI,KAAK,CAAC;gBAEhB,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACnC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC3C,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;oBAEjC,IAAI,CAAC,IAAI;wBAAE,SAAS;oBAEpB,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAChC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBAEvB,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;4BACtB,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC;wBACnC,CAAC;wBAED,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;4BAC7B,IAAI,GAAG,IAAI,CAAC;4BACZ,MAAM;wBACR,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,yBAAyB;oBAC3B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,GAAG,YAAY,YAAY,CAAC,EAAE,CAAC;gBACnC,eAAe;YACjB,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAC7D,IAAI,YAAY,GAAG,EAAE,CAAC;QAEtB,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,GAAG,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBAC3B,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;oBAC7C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;wBAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;4BACtC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC;4BACzB,MAAM;wBACR,CAAC;oBACH,CAAC;oBACD,IAAI,YAAY;wBAAE,MAAM;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACtC,CAAC;CACF"}
|