@openagt/servers 0.0.0-stage → 0.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Suleiman Shahbari
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/bin/servers ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from '../dist/cli.js'
3
+
4
+ runCli(process.argv.slice(2), { env: process.env, stdout: line => console.log(line), stderr: line => console.error(line) })
5
+ .then(code => {
6
+ process.exitCode = code
7
+ })
8
+ .catch(err => {
9
+ console.error(err)
10
+ process.exitCode = 1
11
+ })
package/dist/cli.d.ts ADDED
@@ -0,0 +1,66 @@
1
+ import { type Mint } from './logins.js';
2
+ import type { Exec } from './ssh.js';
3
+ import { type LoginKind, type StepState } from './store.js';
4
+ /**
5
+ * The command line: JSON on stdout, one line for a person on stderr, and the exit code says how
6
+ * it went: 0 for a result, 1 for a refusal or a failure, 2 for a command that could not be read.
7
+ * The same contract as the other packages' commands, so a person and a dashboard read it the same way.
8
+ */
9
+ export declare const USAGE = "usage: servers <command>\n\n status the servers this computer installed OpenAgent on, how far each install is, and\n which logins each was given\n connect <address> <user> <version> [github]\n install OpenAgent at this version on the server at this number or name, logging in\n over SSH as this user (root, or one that becomes root without a password) with this\n computer's own SSH keys; run again, it goes on where it failed, and brings a server\n that fell behind to this version; with \"github\", this computer's GitHub login is\n copied to the server once it is installed\n link <address> a link the server's door gives for a new machine, once, for five minutes\n added <address> the server is among OpenAgent's machines: nothing is left to add\n github the GitHub account gh is logged in to on this computer: whose login a copy would be,\n or why there is none to copy\n login <address> github copy this computer's GitHub login to the server, over SSH\n login <address> claude make a Claude login for the server: this computer's browser asks you once, the\n login lasts a year and goes to the server over SSH; this computer's own Claude\n login is never read; run again while the browser waits, it asks anew\n logout <address> github|claude delete that login on the server; the login itself is not ended by this\n forget <address> take the server off this list; nothing is changed on the server\n work <address> <version> the install's own process, started by connect\n login-work <address> github|claude the process that gives the server a login, started by login\n logout-work <address> github|claude the process that takes a login off the server, started by logout";
10
+ export interface CliIO {
11
+ env: NodeJS.ProcessEnv;
12
+ stdout: (line: string) => void;
13
+ stderr: (line: string) => void;
14
+ /** How a command is run, on a server and on this computer; the real one when unsaid. */
15
+ exec?: Exec;
16
+ /** How a Claude login is made; Claude Code's own `setup-token` when unsaid. */
17
+ mint?: Mint;
18
+ /** Starts this command again with these words, as a process of its own, and answers its id; a process apart from this one when unsaid. */
19
+ startWork?: (words: string[]) => number;
20
+ /** Ends `work` and `login-work`; SIGINT and SIGTERM when unsaid. */
21
+ signal?: AbortSignal;
22
+ }
23
+ /** One login of a server, as `status` tells it. The login itself is never told: this computer does not keep it. */
24
+ export interface LoginStatus {
25
+ /** This computer put it on the server, and did not take it off since. */
26
+ there: boolean;
27
+ /** It is being changed right now, or the install copies it at its end. */
28
+ working: boolean;
29
+ /** Claude: this computer's browser waits for the person's yes, and nothing was sent yet. */
30
+ asking?: boolean;
31
+ /** GitHub: the person asked for a copy, and it was not made yet. */
32
+ wanted?: boolean;
33
+ /** GitHub: the account, as the server's own gh answered. */
34
+ account?: string;
35
+ /** ISO 8601: when it was put there. */
36
+ since?: string;
37
+ /** Claude: when it ends by itself, a year after it was made. */
38
+ ends?: string;
39
+ /** Why the last try ended without a login. */
40
+ said?: string;
41
+ }
42
+ /** A server as `status` tells it. */
43
+ export interface ServerStatus {
44
+ address: string;
45
+ /** Where the server's door answers: what OpenAgent's machines know it by. */
46
+ url: string;
47
+ user: string;
48
+ /** What the server's key is known by, as SSH showed it when this computer first met it. */
49
+ fingerprint?: string;
50
+ /** The install runs right now. */
51
+ working: boolean;
52
+ /** The steps are to end with the server among the machines, and it has not been added yet. */
53
+ adding: boolean;
54
+ steps: {
55
+ id: string;
56
+ label: string;
57
+ state: StepState;
58
+ said?: string;
59
+ }[];
60
+ logins: Record<LoginKind, LoginStatus>;
61
+ }
62
+ export interface Status {
63
+ servers: ServerStatus[];
64
+ }
65
+ export declare function runCli(args: string[], io: CliIO): Promise<number>;
66
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgD,KAAK,IAAI,EAAE,MAAM,aAAa,CAAA;AACrF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAEpC,OAAO,EAA8H,KAAK,SAAS,EAAe,KAAK,SAAS,EAAc,MAAM,YAAY,CAAA;AAEhN;;;;GAIG;AAEH,eAAO,MAAM,KAAK,4pEAsBsF,CAAA;AAExG,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IACtB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,wFAAwF;IACxF,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,+EAA+E;IAC/E,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,0IAA0I;IAC1I,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,MAAM,CAAA;IACvC,oEAAoE;IACpE,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAID,mHAAmH;AACnH,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,KAAK,EAAE,OAAO,CAAA;IACd,0EAA0E;IAC1E,OAAO,EAAE,OAAO,CAAA;IAChB,4FAA4F;IAC5F,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,oEAAoE;IACpE,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,qCAAqC;AACrC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,6EAA6E;IAC7E,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,2FAA2F;IAC3F,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAA;IAChB,8FAA8F;IAC9F,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACvE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,YAAY,EAAE,CAAA;CACxB;AAiKD,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAmFvE"}
package/dist/cli.js ADDED
@@ -0,0 +1,310 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { AlreadyWorking, askLink, install } from './install.js';
3
+ import { AlreadyAtWork, changeLogin, ownGithubAccount } from './logins.js';
4
+ import { STEPS } from './steps.js';
5
+ import { LOGIN_KINDS, Unreadable, addressOf, atWork, doorUrl, freshSteps, isUser, isVersion, readStore, update, working } from './store.js';
6
+ /**
7
+ * The command line: JSON on stdout, one line for a person on stderr, and the exit code says how
8
+ * it went: 0 for a result, 1 for a refusal or a failure, 2 for a command that could not be read.
9
+ * The same contract as the other packages' commands, so a person and a dashboard read it the same way.
10
+ */
11
+ export const USAGE = `usage: servers <command>
12
+
13
+ status the servers this computer installed OpenAgent on, how far each install is, and
14
+ which logins each was given
15
+ connect <address> <user> <version> [github]
16
+ install OpenAgent at this version on the server at this number or name, logging in
17
+ over SSH as this user (root, or one that becomes root without a password) with this
18
+ computer's own SSH keys; run again, it goes on where it failed, and brings a server
19
+ that fell behind to this version; with "github", this computer's GitHub login is
20
+ copied to the server once it is installed
21
+ link <address> a link the server's door gives for a new machine, once, for five minutes
22
+ added <address> the server is among OpenAgent's machines: nothing is left to add
23
+ github the GitHub account gh is logged in to on this computer: whose login a copy would be,
24
+ or why there is none to copy
25
+ login <address> github copy this computer's GitHub login to the server, over SSH
26
+ login <address> claude make a Claude login for the server: this computer's browser asks you once, the
27
+ login lasts a year and goes to the server over SSH; this computer's own Claude
28
+ login is never read; run again while the browser waits, it asks anew
29
+ logout <address> github|claude delete that login on the server; the login itself is not ended by this
30
+ forget <address> take the server off this list; nothing is changed on the server
31
+ work <address> <version> the install's own process, started by connect
32
+ login-work <address> github|claude the process that gives the server a login, started by login
33
+ logout-work <address> github|claude the process that takes a login off the server, started by logout`;
34
+ class Refused extends Error {
35
+ }
36
+ /** How long a Claude login lasts that was made for a server. */
37
+ const CLAUDE_LASTS_MS = 365 * 24 * 60 * 60_000;
38
+ function loginOf(kind, login, installing) {
39
+ const there = login?.since !== undefined;
40
+ return {
41
+ there,
42
+ working: atWork(login?.worker) || (login?.wanted === true && installing),
43
+ ...(login?.asking && atWork(login.worker) ? { asking: true } : {}),
44
+ ...(login?.wanted ? { wanted: true } : {}),
45
+ ...(login?.account ? { account: login.account } : {}),
46
+ ...(there ? { since: login.since } : {}),
47
+ ...(there && kind === 'claude' ? { ends: new Date(Date.parse(login.since) + CLAUDE_LASTS_MS).toISOString() } : {}),
48
+ ...(login?.failed ? { said: login.failed } : {}),
49
+ };
50
+ }
51
+ function statusOf(store) {
52
+ return {
53
+ servers: store.servers.map(server => {
54
+ const busy = working(server);
55
+ return {
56
+ address: server.address,
57
+ url: doorUrl(server.address),
58
+ user: server.user,
59
+ ...(server.fingerprint ? { fingerprint: server.fingerprint } : {}),
60
+ working: busy,
61
+ adding: server.adding,
62
+ steps: STEPS.map(({ id, label }) => {
63
+ const step = server.steps.find(candidate => candidate.id === id);
64
+ // A step that still reads as running with no process behind it: the install died there.
65
+ if (step.state === 'running' && !busy)
66
+ return { id, label, state: 'failed', said: 'The install stopped before this step ended.' };
67
+ return { id, label, state: step.state, ...(step.said ? { said: step.said } : {}) };
68
+ }),
69
+ logins: { github: loginOf('github', server.github, busy), claude: loginOf('claude', server.claude, busy) },
70
+ };
71
+ }),
72
+ };
73
+ }
74
+ /** This command again, as a process apart from the one that started it, so it goes on when that one has answered. */
75
+ function startWork(words, env) {
76
+ const child = spawn(process.execPath, [process.argv[1], ...words], { env, stdio: 'ignore', detached: true });
77
+ // A process that could not start has no number: told below, not thrown from here later.
78
+ child.once('error', () => { });
79
+ child.unref();
80
+ if (child.pid === undefined)
81
+ throw new Refused('the work could not be started');
82
+ return child.pid;
83
+ }
84
+ async function connect(io, said) {
85
+ const address = addressOf(said.address);
86
+ if (address === undefined)
87
+ throw new Refused(`${said.address} is not a server's number or name`);
88
+ if (!isUser(said.user))
89
+ throw new Refused(`${said.user} is not a user name`);
90
+ if (!isVersion(said.version))
91
+ throw new Refused(`${said.version} is not a version of OpenAgent`);
92
+ // Written before the install's process starts, which reads it; held under this command's own
93
+ // name until that process has one, so two presses of the button are one install.
94
+ await update(io.env, store => {
95
+ const known = store.servers.find(server => server.address === address);
96
+ if (known && working(known))
97
+ throw new Refused(`OpenAgent is being installed on ${address} right now`);
98
+ if (known && changing(known))
99
+ throw new Refused(`A login of ${address} is being changed right now: wait until it ends`);
100
+ const fresh = { address, user: said.user, ...(known?.fingerprint ? { fingerprint: known.fingerprint } : {}), steps: freshSteps(), worker: { pid: process.pid, seen: new Date().toISOString() }, adding: true };
101
+ if (known)
102
+ Object.assign(known, fresh);
103
+ else
104
+ store.servers.unshift(fresh);
105
+ // The person's tick, as it is at this press, kept until the install's end, where the copy is made.
106
+ const server = store.servers.find(candidate => candidate.address === address);
107
+ const { since, account } = server.github ?? {};
108
+ if (since || said.github)
109
+ server.github = { ...(since ? { since } : {}), ...(account ? { account } : {}), ...(said.github ? { wanted: true } : {}) };
110
+ else
111
+ delete server.github;
112
+ });
113
+ let worker;
114
+ try {
115
+ worker = (io.startWork ?? (words => startWork(words, io.env)))(['work', address, said.version]);
116
+ }
117
+ finally {
118
+ await update(io.env, store => {
119
+ const server = store.servers.find(candidate => candidate.address === address);
120
+ // The install's process puts its own name there as it starts: it may have, and may have ended already.
121
+ if (!server || server.worker?.pid !== process.pid)
122
+ return;
123
+ if (worker !== undefined)
124
+ server.worker = { pid: worker, seen: new Date().toISOString() };
125
+ else
126
+ delete server.worker;
127
+ });
128
+ }
129
+ return statusOf(await readStore(io.env));
130
+ }
131
+ /** The saved server at what a person typed, or a refusal. */
132
+ async function saved(io, said) {
133
+ const server = (await readStore(io.env)).servers.find(candidate => candidate.address === addressOf(said));
134
+ if (!server)
135
+ throw new Refused(`no server at ${said}`);
136
+ return server;
137
+ }
138
+ /** The saved server, when nothing is being done to it that a login would get in the way of. */
139
+ async function still(io, said) {
140
+ const server = await saved(io, said);
141
+ if (working(server))
142
+ throw new Refused(`OpenAgent is being installed on ${server.address} right now`);
143
+ return server;
144
+ }
145
+ const isKind = (said) => LOGIN_KINDS.includes(said ?? '');
146
+ /** Whether one of the server's logins is being changed right now. */
147
+ const changing = (server) => LOGIN_KINDS.some(kind => atWork(server[kind]?.worker));
148
+ /**
149
+ * Start the process that changes one login of a server: gives it one, or takes it off. A login
150
+ * that is being changed is not changed a second time, with one exception: a Claude login that
151
+ * still waits for the person is ended and asked for anew, since a second press is the person
152
+ * starting over, with a browser page that was closed.
153
+ */
154
+ async function changeLoginOf(io, said, kind, remove) {
155
+ const { address } = await still(io, said);
156
+ const before = await update(io.env, store => {
157
+ const server = store.servers.find(candidate => candidate.address === address);
158
+ const login = server[kind];
159
+ const busy = atWork(login?.worker);
160
+ if (busy && (remove || login.asking !== true))
161
+ throw new Refused(new AlreadyAtWork(address, kind).message);
162
+ server[kind] = { ...(login?.since ? { since: login.since } : {}), ...(login?.account ? { account: login.account } : {}), worker: { pid: process.pid, seen: new Date().toISOString() } };
163
+ return busy ? login.worker.pid : undefined;
164
+ });
165
+ if (before !== undefined) {
166
+ try {
167
+ process.kill(before, 'SIGTERM');
168
+ }
169
+ catch {
170
+ // Ended by itself in the meantime.
171
+ }
172
+ }
173
+ let worker;
174
+ try {
175
+ worker = (io.startWork ?? (words => startWork(words, io.env)))([remove ? 'logout-work' : 'login-work', address, kind]);
176
+ }
177
+ finally {
178
+ await update(io.env, store => {
179
+ const login = store.servers.find(candidate => candidate.address === address)?.[kind];
180
+ if (!login || login.worker?.pid !== process.pid)
181
+ return;
182
+ if (worker !== undefined)
183
+ login.worker = { pid: worker, seen: new Date().toISOString() };
184
+ else
185
+ delete login.worker;
186
+ });
187
+ }
188
+ return statusOf(await readStore(io.env));
189
+ }
190
+ /** Run `work` until it ends, or until this process is told to stop. */
191
+ async function untilStopped(io, work) {
192
+ const controller = new AbortController();
193
+ const stop = () => controller.abort();
194
+ if (io.signal)
195
+ io.signal.addEventListener('abort', stop, { once: true });
196
+ else {
197
+ process.once('SIGINT', stop);
198
+ process.once('SIGTERM', stop);
199
+ }
200
+ try {
201
+ if (io.signal?.aborted)
202
+ stop();
203
+ await work(controller.signal);
204
+ }
205
+ finally {
206
+ process.off('SIGINT', stop);
207
+ process.off('SIGTERM', stop);
208
+ }
209
+ }
210
+ export async function runCli(args, io) {
211
+ const [command, ...rest] = args;
212
+ const print = (value) => {
213
+ io.stdout(JSON.stringify(value));
214
+ return 0;
215
+ };
216
+ const over = { env: io.env, ...(io.exec ? { exec: io.exec } : {}) };
217
+ try {
218
+ switch (command) {
219
+ case 'status':
220
+ if (rest.length)
221
+ break;
222
+ return print(statusOf(await readStore(io.env)));
223
+ case 'connect': {
224
+ const [address, user, version, github] = rest;
225
+ if (rest.length < 3 || rest.length > 4 || !address || !user || !version || (rest.length === 4 && github !== 'github'))
226
+ break;
227
+ return print(await connect(io, { address, user, version, github: github === 'github' }));
228
+ }
229
+ case 'link': {
230
+ const [address] = rest;
231
+ if (rest.length !== 1 || !address)
232
+ break;
233
+ const link = await askLink(await still(io, address), io.exec ? { exec: io.exec } : {});
234
+ if (!link.ok)
235
+ throw new Refused(link.error);
236
+ return print({ url: link.url, expires: link.expires });
237
+ }
238
+ case 'added': {
239
+ const [address] = rest;
240
+ if (rest.length !== 1 || !address)
241
+ break;
242
+ const { address: at } = await saved(io, address);
243
+ await update(io.env, store => {
244
+ const server = store.servers.find(candidate => candidate.address === at);
245
+ if (server)
246
+ server.adding = false;
247
+ });
248
+ return print(statusOf(await readStore(io.env)));
249
+ }
250
+ case 'github': {
251
+ if (rest.length)
252
+ break;
253
+ // Nobody's is an answer too, with why: a page asks this to know what it can offer.
254
+ const own = await ownGithubAccount(io.exec);
255
+ return print(own.ok ? { account: own.account } : { problem: own.error });
256
+ }
257
+ case 'login':
258
+ case 'logout': {
259
+ const [address, kind] = rest;
260
+ if (rest.length !== 2 || !address || !isKind(kind))
261
+ break;
262
+ return print(await changeLoginOf(io, address, kind, command === 'logout'));
263
+ }
264
+ case 'forget': {
265
+ const [address] = rest;
266
+ if (rest.length !== 1 || !address)
267
+ break;
268
+ const { address: at } = await saved(io, address);
269
+ await update(io.env, store => {
270
+ const server = store.servers.find(candidate => candidate.address === at);
271
+ if (server && working(server))
272
+ throw new Refused(`OpenAgent is being installed on ${at} right now: wait until it ends`);
273
+ if (server && changing(server))
274
+ throw new Refused(`A login of ${at} is being changed right now: wait until it ends`);
275
+ store.servers = store.servers.filter(candidate => candidate.address !== at);
276
+ });
277
+ return print(statusOf(await readStore(io.env)));
278
+ }
279
+ case 'work': {
280
+ const [address, version] = rest;
281
+ if (rest.length !== 2 || !address || !version)
282
+ break;
283
+ if (!isVersion(version))
284
+ throw new Refused(`${version} is not a version of OpenAgent`);
285
+ const { address: at } = await saved(io, address);
286
+ await untilStopped(io, signal => install({ ...over, address: at, version, signal }));
287
+ return 0;
288
+ }
289
+ case 'login-work':
290
+ case 'logout-work': {
291
+ const [address, kind] = rest;
292
+ if (rest.length !== 2 || !address || !isKind(kind))
293
+ break;
294
+ const { address: at } = await saved(io, address);
295
+ await untilStopped(io, signal => changeLogin({ ...over, address: at, kind, remove: command === 'logout-work', signal, ...(io.mint ? { mint: io.mint } : {}) }));
296
+ return 0;
297
+ }
298
+ default:
299
+ }
300
+ }
301
+ catch (err) {
302
+ if (!(err instanceof Refused || err instanceof Unreadable || err instanceof AlreadyWorking || err instanceof AlreadyAtWork))
303
+ throw err;
304
+ io.stderr(err.message);
305
+ return 1;
306
+ }
307
+ io.stderr(USAGE);
308
+ return 2;
309
+ }
310
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAa,MAAM,aAAa,CAAA;AAErF,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAuE,MAAM,YAAY,CAAA;AAEhN;;;;GAIG;AAEH,MAAM,CAAC,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;wGAsBmF,CAAA;AAgBxG,MAAM,OAAQ,SAAQ,KAAK;CAAG;AA0C9B,gEAAgE;AAChE,MAAM,eAAe,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAA;AAE9C,SAAS,OAAO,CAAC,IAAe,EAAE,KAAwB,EAAE,UAAmB;IAC7E,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,KAAK,SAAS,CAAA;IACxC,OAAO;QACL,KAAK;QACL,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,UAAU,CAAC;QACxE,GAAG,CAAC,KAAK,EAAE,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAM,CAAC,KAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,KAAK,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAM,CAAC,KAAM,CAAC,GAAG,eAAe,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpH,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjD,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAY;IAC5B,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YAClC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;YAC5B,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC5B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;oBACjC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAE,CAAA;oBACjE,wFAAwF;oBACxF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,IAAI;wBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAiB,EAAE,IAAI,EAAE,6CAA6C,EAAE,CAAA;oBAC1I,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;gBACpF,CAAC,CAAC;gBACF,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;aAC3G,CAAA;QACH,CAAC,CAAC;KACH,CAAA;AACH,CAAC;AAED,qHAAqH;AACrH,SAAS,SAAS,CAAC,KAAe,EAAE,GAAsB;IACxD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7G,wFAAwF;IACxF,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAC7B,KAAK,CAAC,KAAK,EAAE,CAAA;IACb,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;QAAE,MAAM,IAAI,OAAO,CAAC,+BAA+B,CAAC,CAAA;IAC/E,OAAO,KAAK,CAAC,GAAG,CAAA;AAClB,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,EAAS,EAAE,IAAyE;IACzG,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACvC,IAAI,OAAO,KAAK,SAAS;QAAE,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,mCAAmC,CAAC,CAAA;IAChG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,qBAAqB,CAAC,CAAA;IAC5E,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,gCAAgC,CAAC,CAAA;IAChG,6FAA6F;IAC7F,iFAAiF;IACjF,MAAM,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,CAAA;QACtE,IAAI,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,OAAO,CAAC,mCAAmC,OAAO,YAAY,CAAC,CAAA;QACtG,IAAI,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,OAAO,CAAC,cAAc,OAAO,iDAAiD,CAAC,CAAA;QACvH,MAAM,KAAK,GAAW,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;QACtN,IAAI,KAAK;YAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;;YACjC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,mGAAmG;QACnG,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,KAAK,OAAO,CAAE,CAAA;QAC9E,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAA;QAC9C,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;;YAC/I,OAAO,MAAM,CAAC,MAAM,CAAA;IAC3B,CAAC,CAAC,CAAA;IACF,IAAI,MAA0B,CAAA;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IACjG,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE;YAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,KAAK,OAAO,CAAC,CAAA;YAC7E,uGAAuG;YACvG,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG;gBAAE,OAAM;YACzD,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAA;;gBACpF,OAAO,MAAM,CAAC,MAAM,CAAA;QAC3B,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;AAC1C,CAAC;AAED,6DAA6D;AAC7D,KAAK,UAAU,KAAK,CAAC,EAAS,EAAE,IAAY;IAC1C,MAAM,MAAM,GAAG,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IACzG,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAA;IACtD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,+FAA+F;AAC/F,KAAK,UAAU,KAAK,CAAC,EAAS,EAAE,IAAY;IAC1C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;IACpC,IAAI,OAAO,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,OAAO,CAAC,mCAAmC,MAAM,CAAC,OAAO,YAAY,CAAC,CAAA;IACrG,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,IAAwB,EAAqB,EAAE,CAAE,WAAiC,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;AAEvH,qEAAqE;AACrE,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAW,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AAEpG;;;;;GAKG;AACH,KAAK,UAAU,aAAa,CAAC,EAAS,EAAE,IAAY,EAAE,IAAe,EAAE,MAAe;IACpF,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,KAAK,OAAO,CAAE,CAAA;QAC9E,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAClC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,KAAM,CAAC,MAAM,KAAK,IAAI,CAAC;YAAE,MAAM,IAAI,OAAO,CAAC,IAAI,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAA;QAC3G,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAA;QACvL,OAAO,IAAI,CAAC,CAAC,CAAC,KAAM,CAAC,MAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;IAC9C,CAAC,CAAC,CAAA;IACF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC;IACD,IAAI,MAA0B,CAAA;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;IACxH,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE;YAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;YACpF,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG;gBAAE,OAAM;YACvD,IAAI,MAAM,KAAK,SAAS;gBAAE,KAAK,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAA;;gBACnF,OAAO,KAAK,CAAC,MAAM,CAAA;QAC1B,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;AAC1C,CAAC;AAED,uEAAuE;AACvE,KAAK,UAAU,YAAY,CAAC,EAAS,EAAE,IAA4C;IACjF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,IAAI,GAAG,GAAS,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;IAC3C,IAAI,EAAE,CAAC,MAAM;QAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;SACnE,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC5B,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAC/B,CAAC;IACD,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO;YAAE,IAAI,EAAE,CAAA;QAC9B,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC/B,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC3B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc,EAAE,EAAS;IACpD,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;IAC/B,MAAM,KAAK,GAAG,CAAC,KAAc,EAAU,EAAE;QACvC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;QAChC,OAAO,CAAC,CAAA;IACV,CAAC,CAAA;IACD,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IACnE,IAAI,CAAC;QACH,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,QAAQ;gBACX,IAAI,IAAI,CAAC,MAAM;oBAAE,MAAK;gBACtB,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACjD,KAAK,SAAS,EAAE,CAAC;gBACf,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;gBAC7C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,QAAQ,CAAC;oBAAE,MAAK;gBAC5H,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAA;YAC1F,CAAC;YACD,KAAK,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;gBACtB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO;oBAAE,MAAK;gBACxC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;gBACtF,IAAI,CAAC,IAAI,CAAC,EAAE;oBAAE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC3C,OAAO,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;YACxD,CAAC;YACD,KAAK,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;gBACtB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO;oBAAE,MAAK;gBACxC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,MAAM,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;gBAChD,MAAM,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE;oBAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,KAAK,EAAE,CAAC,CAAA;oBACxE,IAAI,MAAM;wBAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAA;gBACnC,CAAC,CAAC,CAAA;gBACF,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACjD,CAAC;YACD,KAAK,QAAQ,EAAE,CAAC;gBACd,IAAI,IAAI,CAAC,MAAM;oBAAE,MAAK;gBACtB,mFAAmF;gBACnF,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;gBAC3C,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAA;YAC1E,CAAC;YACD,KAAK,OAAO,CAAC;YACb,KAAK,QAAQ,EAAE,CAAC;gBACd,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAA;gBAC5B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBAAE,MAAK;gBACzD,OAAO,KAAK,CAAC,MAAM,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAA;YAC5E,CAAC;YACD,KAAK,QAAQ,EAAE,CAAC;gBACd,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;gBACtB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO;oBAAE,MAAK;gBACxC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,MAAM,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;gBAChD,MAAM,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE;oBAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,KAAK,EAAE,CAAC,CAAA;oBACxE,IAAI,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;wBAAE,MAAM,IAAI,OAAO,CAAC,mCAAmC,EAAE,gCAAgC,CAAC,CAAA;oBACvH,IAAI,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC;wBAAE,MAAM,IAAI,OAAO,CAAC,cAAc,EAAE,iDAAiD,CAAC,CAAA;oBACpH,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,KAAK,EAAE,CAAC,CAAA;gBAC7E,CAAC,CAAC,CAAA;gBACF,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACjD,CAAC;YACD,KAAK,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;gBAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO;oBAAE,MAAK;gBACpD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;oBAAE,MAAM,IAAI,OAAO,CAAC,GAAG,OAAO,gCAAgC,CAAC,CAAA;gBACtF,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,MAAM,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;gBAChD,MAAM,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;gBACpF,OAAO,CAAC,CAAA;YACV,CAAC;YACD,KAAK,YAAY,CAAC;YAClB,KAAK,aAAa,EAAE,CAAC;gBACnB,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAA;gBAC5B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBAAE,MAAK;gBACzD,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,MAAM,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;gBAChD,MAAM,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,KAAK,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC/J,OAAO,CAAC,CAAA;YACV,CAAC;YACD,QAAQ;QACV,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,YAAY,OAAO,IAAI,GAAG,YAAY,UAAU,IAAI,GAAG,YAAY,cAAc,IAAI,GAAG,YAAY,aAAa,CAAC;YAAE,MAAM,GAAG,CAAA;QACtI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACtB,OAAO,CAAC,CAAA;IACV,CAAC;IACD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAChB,OAAO,CAAC,CAAA;AACV,CAAC"}
@@ -0,0 +1,3 @@
1
+ /*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-mono:"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--radius-md:.375rem}}@layer utilities{.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-4{margin-left:calc(var(--spacing) * 4)}.flex{display:flex}.inline-block{display:inline-block}.w-4{width:calc(var(--spacing) * 4)}.w-32{width:calc(var(--spacing) * 32)}.min-w-0{min-width:0}.min-w-40{min-width:calc(var(--spacing) * 40)}.flex-1{flex:1}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.gap-2{gap:calc(var(--spacing) * 2)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--border)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-border{border-color:var(--border)}.bg-background{background-color:var(--background)}.p-2{padding:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.whitespace-pre-wrap{white-space:pre-wrap}.text-danger{color:var(--danger)}.text-foreground{color:var(--foreground)}.text-muted-foreground{color:var(--muted-foreground)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}
3
+ /*$vite$:1*/