@artblocks/abx-cli 0.1.0-alpha.4 → 0.1.0-alpha.41

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.
Files changed (189) hide show
  1. package/CHANGELOG.md +161 -0
  2. package/assets/renderer-scaffold/README.md +41 -11
  3. package/assets/renderer-scaffold/foundry.toml +5 -0
  4. package/assets/renderer-scaffold/remappings.txt +1 -1
  5. package/assets/renderer-scaffold/script/DeployHooks.s.sol +24 -0
  6. package/assets/renderer-scaffold/script/Preview.s.sol +99 -0
  7. package/assets/renderer-scaffold/src/MyHooks.sol +20 -0
  8. package/assets/renderer-scaffold/src/MyRenderer.sol +4 -4
  9. package/assets/renderer-scaffold/src/MyTraits.sol +2 -2
  10. package/assets/renderer-scaffold/test/MyRenderer.t.sol +60 -3
  11. package/dist/bin.d.ts +26 -0
  12. package/dist/bin.d.ts.map +1 -0
  13. package/dist/bin.js +63 -0
  14. package/dist/bin.js.map +1 -0
  15. package/dist/capabilities.d.ts +99 -0
  16. package/dist/capabilities.d.ts.map +1 -0
  17. package/dist/capabilities.js +144 -0
  18. package/dist/capabilities.js.map +1 -0
  19. package/dist/commands/auth.d.ts +54 -0
  20. package/dist/commands/auth.d.ts.map +1 -0
  21. package/dist/commands/auth.js +447 -0
  22. package/dist/commands/auth.js.map +1 -0
  23. package/dist/commands/deploy.d.ts +242 -0
  24. package/dist/commands/deploy.d.ts.map +1 -0
  25. package/dist/commands/deploy.js +5429 -0
  26. package/dist/commands/deploy.js.map +1 -0
  27. package/dist/commands/feedback.d.ts +7 -0
  28. package/dist/commands/feedback.d.ts.map +1 -0
  29. package/dist/commands/feedback.js +147 -0
  30. package/dist/commands/feedback.js.map +1 -0
  31. package/dist/commands/maintenance.d.ts +4 -0
  32. package/dist/commands/maintenance.d.ts.map +1 -0
  33. package/dist/commands/maintenance.js +114 -0
  34. package/dist/commands/maintenance.js.map +1 -0
  35. package/dist/commands/project.d.ts +429 -0
  36. package/dist/commands/project.d.ts.map +1 -0
  37. package/dist/commands/project.js +1720 -0
  38. package/dist/commands/project.js.map +1 -0
  39. package/dist/commands/reads.d.ts +85 -0
  40. package/dist/commands/reads.d.ts.map +1 -0
  41. package/dist/commands/reads.js +868 -0
  42. package/dist/commands/reads.js.map +1 -0
  43. package/dist/commands/scaffold.d.ts +89 -0
  44. package/dist/commands/scaffold.d.ts.map +1 -0
  45. package/dist/commands/scaffold.js +738 -0
  46. package/dist/commands/scaffold.js.map +1 -0
  47. package/dist/commands/service.d.ts +67 -0
  48. package/dist/commands/service.d.ts.map +1 -0
  49. package/dist/commands/service.js +748 -0
  50. package/dist/commands/service.js.map +1 -0
  51. package/dist/commands/storage.d.ts +51 -0
  52. package/dist/commands/storage.d.ts.map +1 -0
  53. package/dist/commands/storage.js +399 -0
  54. package/dist/commands/storage.js.map +1 -0
  55. package/dist/commands/submit-app.d.ts +102 -0
  56. package/dist/commands/submit-app.d.ts.map +1 -0
  57. package/dist/commands/submit-app.js +622 -0
  58. package/dist/commands/submit-app.js.map +1 -0
  59. package/dist/config.d.ts +105 -2
  60. package/dist/config.d.ts.map +1 -1
  61. package/dist/config.js +351 -12
  62. package/dist/config.js.map +1 -1
  63. package/dist/conformance.d.ts +31 -0
  64. package/dist/conformance.d.ts.map +1 -0
  65. package/dist/conformance.js +390 -0
  66. package/dist/conformance.js.map +1 -0
  67. package/dist/contract-read-error.d.ts +5 -0
  68. package/dist/contract-read-error.d.ts.map +1 -0
  69. package/dist/contract-read-error.js +37 -0
  70. package/dist/contract-read-error.js.map +1 -0
  71. package/dist/deploy-plan.d.ts +150 -0
  72. package/dist/deploy-plan.d.ts.map +1 -0
  73. package/dist/deploy-plan.js +31 -0
  74. package/dist/deploy-plan.js.map +1 -0
  75. package/dist/deps.d.ts +6 -39
  76. package/dist/deps.d.ts.map +1 -1
  77. package/dist/deps.js +4 -68
  78. package/dist/deps.js.map +1 -1
  79. package/dist/errors.d.ts +20 -0
  80. package/dist/errors.d.ts.map +1 -0
  81. package/dist/errors.js +25 -0
  82. package/dist/errors.js.map +1 -0
  83. package/dist/flag-allowlists.d.ts +53 -0
  84. package/dist/flag-allowlists.d.ts.map +1 -0
  85. package/dist/flag-allowlists.js +184 -0
  86. package/dist/flag-allowlists.js.map +1 -0
  87. package/dist/flags.d.ts +47 -0
  88. package/dist/flags.d.ts.map +1 -1
  89. package/dist/flags.js +125 -1
  90. package/dist/flags.js.map +1 -1
  91. package/dist/jsonout.d.ts +37 -0
  92. package/dist/jsonout.d.ts.map +1 -0
  93. package/dist/jsonout.js +79 -0
  94. package/dist/jsonout.js.map +1 -0
  95. package/dist/kind.d.ts +57 -0
  96. package/dist/kind.d.ts.map +1 -0
  97. package/dist/kind.js +122 -0
  98. package/dist/kind.js.map +1 -0
  99. package/dist/main.js +786 -4838
  100. package/dist/main.js.map +1 -1
  101. package/dist/mintpage.d.ts +17 -2
  102. package/dist/mintpage.d.ts.map +1 -1
  103. package/dist/mintpage.js +241 -54
  104. package/dist/mintpage.js.map +1 -1
  105. package/dist/output.d.ts +179 -0
  106. package/dist/output.d.ts.map +1 -0
  107. package/dist/output.js +780 -0
  108. package/dist/output.js.map +1 -0
  109. package/dist/ownerops.d.ts +381 -57
  110. package/dist/ownerops.d.ts.map +1 -1
  111. package/dist/ownerops.js +2014 -359
  112. package/dist/ownerops.js.map +1 -1
  113. package/dist/preview.d.ts +23 -5
  114. package/dist/preview.d.ts.map +1 -1
  115. package/dist/preview.js +95 -43
  116. package/dist/preview.js.map +1 -1
  117. package/dist/prompt.d.ts +17 -0
  118. package/dist/prompt.d.ts.map +1 -0
  119. package/dist/prompt.js +19 -0
  120. package/dist/prompt.js.map +1 -0
  121. package/dist/provision.d.ts +3 -13
  122. package/dist/provision.d.ts.map +1 -1
  123. package/dist/provision.js +19 -21
  124. package/dist/provision.js.map +1 -1
  125. package/dist/remote.d.ts +157 -52
  126. package/dist/remote.d.ts.map +1 -1
  127. package/dist/remote.js +435 -46
  128. package/dist/remote.js.map +1 -1
  129. package/dist/riskgate.d.ts +62 -0
  130. package/dist/riskgate.d.ts.map +1 -0
  131. package/dist/riskgate.js +234 -0
  132. package/dist/riskgate.js.map +1 -0
  133. package/dist/scaffold.d.ts +12 -0
  134. package/dist/scaffold.d.ts.map +1 -0
  135. package/dist/scaffold.js +56 -0
  136. package/dist/scaffold.js.map +1 -0
  137. package/dist/schema.d.ts +36 -1
  138. package/dist/schema.d.ts.map +1 -1
  139. package/dist/schema.js +121 -26
  140. package/dist/schema.js.map +1 -1
  141. package/dist/script-chunks.d.ts +8 -0
  142. package/dist/script-chunks.d.ts.map +1 -0
  143. package/dist/script-chunks.js +35 -0
  144. package/dist/script-chunks.js.map +1 -0
  145. package/dist/served.d.ts +30 -0
  146. package/dist/served.d.ts.map +1 -0
  147. package/dist/served.js +112 -0
  148. package/dist/served.js.map +1 -0
  149. package/dist/signer.d.ts +13 -0
  150. package/dist/signer.d.ts.map +1 -1
  151. package/dist/signer.js +84 -15
  152. package/dist/signer.js.map +1 -1
  153. package/dist/update-check.d.ts +86 -5
  154. package/dist/update-check.d.ts.map +1 -1
  155. package/dist/update-check.js +161 -20
  156. package/dist/update-check.js.map +1 -1
  157. package/package.json +13 -12
  158. package/skill/SKILL.md +181 -347
  159. package/skill/agents/openai.yaml +4 -0
  160. package/skill/reference/capabilities.md +188 -0
  161. package/skill/reference/code.md +220 -0
  162. package/skill/reference/creator-token.md +94 -0
  163. package/skill/reference/deploy.md +174 -0
  164. package/skill/reference/diagnose.md +178 -0
  165. package/skill/reference/hosting.md +186 -93
  166. package/skill/reference/operate.md +220 -0
  167. package/skill/reference/services.md +121 -0
  168. package/skill/reference/setup.md +154 -36
  169. package/assets/renderer-scaffold/src/interfaces/IAbxFieldRenderer.sol +0 -32
  170. package/assets/renderer-scaffold/src/interfaces/IAbxParams.sol +0 -26
  171. package/dist/inspect.d.ts +0 -48
  172. package/dist/inspect.d.ts.map +0 -1
  173. package/dist/inspect.js +0 -184
  174. package/dist/inspect.js.map +0 -1
  175. package/dist/migrate.d.ts +0 -65
  176. package/dist/migrate.d.ts.map +0 -1
  177. package/dist/migrate.js +0 -180
  178. package/dist/migrate.js.map +0 -1
  179. package/dist/onchain-uri.d.ts +0 -97
  180. package/dist/onchain-uri.d.ts.map +0 -1
  181. package/dist/onchain-uri.js +0 -243
  182. package/dist/onchain-uri.js.map +0 -1
  183. package/dist/upload.d.ts +0 -28
  184. package/dist/upload.d.ts.map +0 -1
  185. package/dist/upload.js +0 -41
  186. package/dist/upload.js.map +0 -1
  187. package/skill/reference/code-projects.md +0 -246
  188. package/skill/reference/operating.md +0 -116
  189. package/skill/reference/troubleshooting.md +0 -28
@@ -0,0 +1,447 @@
1
+ import { execFileSync, spawn } from 'node:child_process';
2
+ import { existsSync, lstatSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
3
+ import { basename, dirname, resolve as resolvePath } from 'node:path';
4
+ import { randomBytes } from 'node:crypto';
5
+ import { parseEnvContent } from '@artblocks/abx-sdk/node';
6
+ import { positionalArgs } from '../flags.js';
7
+ import { ABX_SERVICES_API_KEY_VAR, resolveRemote } from '../remote.js';
8
+ import { bold, dim, g, info, ok } from '../output.js';
9
+ const DEVICE_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:device_code';
10
+ const DEVICE_CLIENT_ID = 'abx-cli';
11
+ function cleanBaseUrl(value) {
12
+ return value.replace(/\/+$/, '');
13
+ }
14
+ function safeDescription(value) {
15
+ return typeof value === 'string' ? value.replace(/[\r\n\t]+/g, ' ').slice(0, 240) : '';
16
+ }
17
+ async function jsonObject(response) {
18
+ const body = (await response.json().catch(() => null));
19
+ return body && typeof body === 'object' && !Array.isArray(body) ? body : {};
20
+ }
21
+ function oauthFailure(prefix, response, body, sensitiveValues = []) {
22
+ const code = safeDescription(body.error) || `HTTP ${response.status}`;
23
+ let detail = safeDescription(body.error_description);
24
+ for (const value of sensitiveValues)
25
+ if (value)
26
+ detail = detail.replaceAll(value, '[redacted]');
27
+ return new Error(`${prefix}: ${code}${detail ? ` — ${detail}` : ''}`);
28
+ }
29
+ function assertUrl(value, field) {
30
+ if (typeof value !== 'string')
31
+ throw new Error(`OAuth discovery omitted ${field}`);
32
+ const parsed = new URL(value);
33
+ if (parsed.username || parsed.password)
34
+ throw new Error(`OAuth discovery returned credentials in ${field}`);
35
+ if (parsed.protocol !== 'https:' && !(parsed.protocol === 'http:' && ['127.0.0.1', 'localhost'].includes(parsed.hostname))) {
36
+ throw new Error(`OAuth discovery returned an insecure ${field}; HTTPS is required outside localhost`);
37
+ }
38
+ return parsed.toString();
39
+ }
40
+ function discoverUrl(baseUrl) {
41
+ const parsed = new URL(cleanBaseUrl(baseUrl));
42
+ const issuerPath = parsed.pathname.replace(/\/+$/, '');
43
+ parsed.pathname = `/.well-known/oauth-authorization-server${issuerPath}`;
44
+ parsed.search = '';
45
+ parsed.hash = '';
46
+ return parsed.toString();
47
+ }
48
+ async function discoverOAuthMetadata(baseUrl, fetchImpl) {
49
+ const expectedIssuer = cleanBaseUrl(assertUrl(baseUrl, 'provider base URL'));
50
+ const response = await fetchImpl(discoverUrl(expectedIssuer), {
51
+ headers: { accept: 'application/json' },
52
+ signal: AbortSignal.timeout(15_000)
53
+ });
54
+ const body = await jsonObject(response);
55
+ if (!response.ok)
56
+ throw oauthFailure('OAuth discovery failed', response, body);
57
+ const metadata = body;
58
+ assertUrl(metadata.issuer, 'issuer');
59
+ if (metadata.issuer !== expectedIssuer) {
60
+ throw new Error(`OAuth issuer mismatch: expected ${expectedIssuer}, received ${safeDescription(metadata.issuer)}`);
61
+ }
62
+ return metadata;
63
+ }
64
+ function defaultSleep(ms) {
65
+ return new Promise((resolve) => setTimeout(resolve, ms));
66
+ }
67
+ /** Best-effort only: the complete verification link is always printed, so headless and sandboxed
68
+ * agents still have a correct handoff when the OS refuses to launch a browser. */
69
+ function defaultOpenBrowser(url) {
70
+ if (process.env.CI)
71
+ return false;
72
+ try {
73
+ const command = process.platform === 'darwin'
74
+ ? { file: 'open', args: [url] }
75
+ : process.platform === 'win32'
76
+ ? { file: 'rundll32', args: ['url.dll,FileProtocolHandler', url] }
77
+ : { file: 'xdg-open', args: [url] };
78
+ const child = spawn(command.file, command.args, { detached: true, stdio: 'ignore' });
79
+ child.on('error', () => { });
80
+ child.unref();
81
+ return true;
82
+ }
83
+ catch {
84
+ return false;
85
+ }
86
+ }
87
+ function activeEnvLine(source, key) {
88
+ const escaped = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
89
+ return new RegExp(`^\\s*(?:export\\s+)?${escaped}\\s*=`, 'm').test(source);
90
+ }
91
+ function gitCheck(cwd, args) {
92
+ try {
93
+ execFileSync('git', args, { cwd, stdio: 'ignore' });
94
+ return true;
95
+ }
96
+ catch (error) {
97
+ const status = error.status;
98
+ return status === 1 || status === 128 ? false : null;
99
+ }
100
+ }
101
+ /** Refuse the two silent secret-exposure modes: replacing a tracked file, or creating an unignored
102
+ * .env inside a Git worktree. A non-Git directory is fine. */
103
+ export function assertPrivateEnvPath(envPath) {
104
+ const cwd = dirname(envPath);
105
+ if (existsSync(envPath) && lstatSync(envPath).isSymbolicLink()) {
106
+ throw new Error(`refusing to store an API key through symbolic-link ${basename(envPath)}`);
107
+ }
108
+ if (!gitCheck(cwd, ['rev-parse', '--is-inside-work-tree']))
109
+ return;
110
+ if (gitCheck(cwd, ['ls-files', '--error-unmatch', '--', basename(envPath)])) {
111
+ throw new Error(`refusing to store an API key in tracked ${basename(envPath)} — remove it from Git history first`);
112
+ }
113
+ if (!gitCheck(cwd, ['check-ignore', '--quiet', '--', basename(envPath)])) {
114
+ throw new Error(`${basename(envPath)} is not Git-ignored. Add '${basename(envPath)}' to .gitignore, then run login again.`);
115
+ }
116
+ }
117
+ /** Bearer-token grammar (RFC 6750) — the default value shape {@link saveEnvSecret} accepts. Exported
118
+ * so a caller writing something differently-shaped (a URL, say) can pass its own `valuePattern`
119
+ * instead of fighting this one. */
120
+ export const BEARER_TOKEN_PATTERN = /^[A-Za-z0-9._~+/-]+={0,}$/;
121
+ export function saveEnvSecret(envPath, key, value, valuePattern = BEARER_TOKEN_PATTERN) {
122
+ saveEnvSecrets(envPath, [{ key, value, valuePattern }]);
123
+ }
124
+ /** Validate and replace several env values with one atomic rename. A credential pair must never
125
+ * land half-updated because the process stopped between two individually-atomic writes. */
126
+ export function saveEnvSecrets(envPath, entries) {
127
+ if (!entries.length)
128
+ return;
129
+ const values = new Map();
130
+ for (const { key, value, valuePattern = BEARER_TOKEN_PATTERN } of entries) {
131
+ // Safe to round-trip through the CLI's minimal .env parser. Reject anything broader instead of
132
+ // quoting a provider-controlled value incorrectly — this is a plain `KEY=value` writer, no shell
133
+ // quoting, so a value that could ever contain a newline (or otherwise break the line grammar) is
134
+ // the actual risk `valuePattern` guards against, not "this specific value doesn't look like X".
135
+ if (!/^[A-Z][A-Z0-9_]*$/.test(key) || !valuePattern.test(value) || values.has(key)) {
136
+ throw new Error('the provided values cannot be stored safely in an environment file');
137
+ }
138
+ values.set(key, value);
139
+ }
140
+ const source = existsSync(envPath) ? readFileSync(envPath, 'utf8') : '';
141
+ const eol = source.includes('\r\n') ? '\r\n' : '\n';
142
+ const lines = source ? source.split(/\r?\n/) : [];
143
+ const next = [];
144
+ const replaced = new Set();
145
+ for (const line of lines) {
146
+ const found = [...values.keys()].find((key) => {
147
+ const escaped = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
148
+ return new RegExp(`^\\s*(?:export\\s+)?${escaped}\\s*=`).test(line);
149
+ });
150
+ if (!found) {
151
+ next.push(line);
152
+ continue;
153
+ }
154
+ if (!replaced.has(found))
155
+ next.push(`${found}=${values.get(found)}`);
156
+ replaced.add(found);
157
+ }
158
+ let appended = false;
159
+ for (const [key, value] of values) {
160
+ if (replaced.has(key))
161
+ continue;
162
+ if (!appended && next.length && next[next.length - 1] !== '')
163
+ next.push('');
164
+ next.push(`${key}=${value}`);
165
+ appended = true;
166
+ }
167
+ while (next[next.length - 1] === '')
168
+ next.pop();
169
+ const output = `${next.join(eol)}${eol}`;
170
+ const temp = resolvePath(dirname(envPath), `.${basename(envPath)}.${process.pid}.${randomBytes(6).toString('hex')}.tmp`);
171
+ try {
172
+ writeFileSync(temp, output, { encoding: 'utf8', mode: 0o600 });
173
+ renameSync(temp, envPath);
174
+ }
175
+ catch (error) {
176
+ if (existsSync(temp))
177
+ unlinkSync(temp);
178
+ throw error;
179
+ }
180
+ }
181
+ function envFileValue(envPath, key) {
182
+ if (!existsSync(envPath))
183
+ return undefined;
184
+ return parseEnvContent(readFileSync(envPath, 'utf8')).entries.find(([entryKey]) => entryKey === key)?.[1];
185
+ }
186
+ function envAssignmentKey(line) {
187
+ let candidate = line.trim();
188
+ if (!candidate || candidate.startsWith('#'))
189
+ return undefined;
190
+ candidate = candidate.replace(/^export\s+/, '');
191
+ const equals = candidate.indexOf('=');
192
+ return equals === -1 ? undefined : candidate.slice(0, equals).trim();
193
+ }
194
+ /** Remove every active assignment for one key. If conflicting duplicates existed, leaving a hidden
195
+ * assignment behind would silently log the next process back in, so logout removes the whole set. */
196
+ function removeEnvSecret(envPath, key, expectedValue) {
197
+ if (!existsSync(envPath))
198
+ return false;
199
+ if (lstatSync(envPath).isSymbolicLink()) {
200
+ throw new Error(`API key was revoked at the provider, but refusing to modify symbolic-link ${basename(envPath)}`);
201
+ }
202
+ const source = readFileSync(envPath, 'utf8');
203
+ if (!activeEnvLine(source, key) || envFileValue(envPath, key) !== expectedValue)
204
+ return false;
205
+ const eol = source.includes('\r\n') ? '\r\n' : '\n';
206
+ const output = source
207
+ .split(/\r?\n/)
208
+ .filter((line) => envAssignmentKey(line) !== key)
209
+ .join(eol);
210
+ const temp = resolvePath(dirname(envPath), `.${basename(envPath)}.${process.pid}.${randomBytes(6).toString('hex')}.tmp`);
211
+ try {
212
+ writeFileSync(temp, output, { encoding: 'utf8', mode: 0o600 });
213
+ renameSync(temp, envPath);
214
+ }
215
+ catch (error) {
216
+ if (existsSync(temp))
217
+ unlinkSync(temp);
218
+ const detail = error instanceof Error ? safeDescription(error.message) : '';
219
+ throw new Error(`API key was revoked at the provider, but ${key} could not be removed from ${basename(envPath)}: ${detail || 'filesystem error'}`);
220
+ }
221
+ return true;
222
+ }
223
+ function assertLoginDestination(options) {
224
+ assertPrivateEnvPath(options.envPath);
225
+ const source = existsSync(options.envPath) ? readFileSync(options.envPath, 'utf8') : '';
226
+ const fileValue = parseEnvContent(source).entries.find(([key]) => key === options.envVar)?.[1];
227
+ if (activeEnvLine(source, options.envVar) && !options.force) {
228
+ throw new Error(`${options.envVar} already exists in ${basename(options.envPath)}; run \`abx auth logout\` before login to revoke it, ` +
229
+ 'or pass --force to replace only the local value without revoking the old key');
230
+ }
231
+ if (process.env[options.envVar] !== undefined && process.env[options.envVar] !== fileValue) {
232
+ throw new Error(`${options.envVar} is already set outside ${basename(options.envPath)}. Unset it before login so it cannot shadow the newly issued key.`);
233
+ }
234
+ }
235
+ /** Standards-only core, dependency-injected for a no-secret-output regression test. */
236
+ export async function deviceLogin(options, deps = {}) {
237
+ assertLoginDestination(options);
238
+ const fetchImpl = deps.fetchImpl ?? fetch;
239
+ const sleep = deps.sleep ?? defaultSleep;
240
+ const now = deps.now ?? Date.now;
241
+ const openBrowser = deps.openBrowser ?? defaultOpenBrowser;
242
+ const line = deps.line ?? console.log;
243
+ const warning = deps.warning ?? console.warn;
244
+ const metadata = await discoverOAuthMetadata(options.baseUrl, fetchImpl);
245
+ if (!metadata.grant_types_supported?.includes(DEVICE_GRANT_TYPE)) {
246
+ throw new Error('the provider does not advertise the OAuth device authorization grant');
247
+ }
248
+ const deviceEndpoint = assertUrl(metadata.device_authorization_endpoint, 'device_authorization_endpoint');
249
+ const tokenEndpoint = assertUrl(metadata.token_endpoint, 'token_endpoint');
250
+ const startResponse = await fetchImpl(deviceEndpoint, {
251
+ method: 'POST',
252
+ headers: { 'content-type': 'application/x-www-form-urlencoded', accept: 'application/json' },
253
+ body: new URLSearchParams({ client_id: DEVICE_CLIENT_ID }),
254
+ signal: AbortSignal.timeout(15_000)
255
+ });
256
+ const startBody = await jsonObject(startResponse);
257
+ if (!startResponse.ok)
258
+ throw oauthFailure('device authorization failed', startResponse, startBody);
259
+ const grant = startBody;
260
+ if (typeof grant.device_code !== 'string' ||
261
+ typeof grant.user_code !== 'string' ||
262
+ typeof grant.expires_in !== 'number' ||
263
+ !Number.isFinite(grant.expires_in) ||
264
+ grant.expires_in <= 0) {
265
+ throw new Error('the provider returned an invalid device authorization response');
266
+ }
267
+ const verificationUrl = assertUrl(grant.verification_uri_complete ?? grant.verification_uri, 'verification_uri');
268
+ let pollSeconds = typeof grant.interval === 'number' && Number.isFinite(grant.interval) && grant.interval >= 1
269
+ ? grant.interval
270
+ : 5;
271
+ const deadline = now() + grant.expires_in * 1000;
272
+ line(`Browser approval: ${verificationUrl}`);
273
+ line(`Confirm code: ${grant.user_code}`);
274
+ if (!options.noOpen && !openBrowser(verificationUrl)) {
275
+ warning('Could not open a browser automatically; open the approval URL above.');
276
+ }
277
+ line('Waiting for human approval…');
278
+ while (now() < deadline) {
279
+ await sleep(pollSeconds * 1000);
280
+ // Re-check before polling so a destination changed during the human approval wait normally
281
+ // aborts before the provider consumes a one-time grant and issues an orphaned credential.
282
+ assertLoginDestination(options);
283
+ let response;
284
+ try {
285
+ response = await fetchImpl(tokenEndpoint, {
286
+ method: 'POST',
287
+ headers: { 'content-type': 'application/x-www-form-urlencoded', accept: 'application/json' },
288
+ body: new URLSearchParams({
289
+ grant_type: DEVICE_GRANT_TYPE,
290
+ client_id: DEVICE_CLIENT_ID,
291
+ device_code: grant.device_code
292
+ }),
293
+ signal: AbortSignal.timeout(15_000)
294
+ });
295
+ }
296
+ catch {
297
+ pollSeconds = Math.min(Math.max(pollSeconds * 2, 5), 30);
298
+ warning(`The provider is temporarily unreachable; retrying in ${pollSeconds}s.`);
299
+ continue;
300
+ }
301
+ const body = await jsonObject(response);
302
+ if (response.ok) {
303
+ const accessToken = body.access_token;
304
+ if (typeof accessToken !== 'string' || !accessToken || /[\r\n]/.test(accessToken)) {
305
+ throw new Error('the provider returned an invalid OAuth access token');
306
+ }
307
+ if (typeof body.token_type !== 'string' || body.token_type.toLowerCase() !== 'bearer') {
308
+ throw new Error('the provider returned an unsupported OAuth token type');
309
+ }
310
+ // Re-check after the human wait: another process must not have tracked, unignored, symlinked,
311
+ // or newly populated the destination while this command was polling.
312
+ assertLoginDestination(options);
313
+ saveEnvSecret(options.envPath, options.envVar, accessToken);
314
+ return;
315
+ }
316
+ const code = safeDescription(body.error);
317
+ if (code === 'authorization_pending')
318
+ continue;
319
+ if (code === 'slow_down') {
320
+ pollSeconds += 5;
321
+ continue;
322
+ }
323
+ if (response.status === 429 || response.status >= 500) {
324
+ const retryAfter = Number(response.headers.get('retry-after'));
325
+ pollSeconds = Number.isFinite(retryAfter) && retryAfter > 0 ? retryAfter : Math.min(pollSeconds * 2, 30);
326
+ warning(`The provider asked the CLI to wait; retrying in ${pollSeconds}s.`);
327
+ continue;
328
+ }
329
+ if (code === 'access_denied')
330
+ throw new Error('device authorization was denied');
331
+ if (code === 'expired_token')
332
+ throw new Error('device authorization expired; run login again');
333
+ throw oauthFailure('OAuth token exchange failed', response, body, [grant.device_code]);
334
+ }
335
+ throw new Error('device authorization expired; run login again');
336
+ }
337
+ /** RFC 7009 logout: revoke remotely first, then remove the matching local assignment. Keeping the
338
+ * credential when discovery or revocation fails preserves the user's ability to retry safely. */
339
+ export async function oauthLogout(options, deps = {}) {
340
+ const fileValue = envFileValue(options.envPath, options.envVar);
341
+ const token = options.token || fileValue;
342
+ if (!token)
343
+ return { status: 'absent' };
344
+ const fetchImpl = deps.fetchImpl ?? fetch;
345
+ const metadata = await discoverOAuthMetadata(options.baseUrl, fetchImpl);
346
+ const revocationEndpoint = assertUrl(metadata.revocation_endpoint, 'revocation_endpoint');
347
+ const response = await fetchImpl(revocationEndpoint, {
348
+ method: 'POST',
349
+ headers: { 'content-type': 'application/x-www-form-urlencoded', accept: 'application/json' },
350
+ body: new URLSearchParams({
351
+ client_id: DEVICE_CLIENT_ID,
352
+ token,
353
+ token_type_hint: 'access_token'
354
+ }),
355
+ signal: AbortSignal.timeout(15_000)
356
+ });
357
+ if (!response.ok) {
358
+ const body = await jsonObject(response);
359
+ throw oauthFailure('OAuth token revocation failed', response, body, [token]);
360
+ }
361
+ const currentFileValue = envFileValue(options.envPath, options.envVar);
362
+ const local = currentFileValue === token && removeEnvSecret(options.envPath, options.envVar, token)
363
+ ? 'removed'
364
+ : currentFileValue === undefined
365
+ ? 'external'
366
+ : 'different';
367
+ if (process.env[options.envVar] === token)
368
+ delete process.env[options.envVar];
369
+ return { status: 'revoked', local };
370
+ }
371
+ function targetForAuth(spec, action) {
372
+ const target = resolveRemote(spec);
373
+ if (!target)
374
+ throw new Error(`auth ${action} needs a remote`);
375
+ if (target.source === 'url' || target.source === 'default') {
376
+ throw new Error(`auth ${action} needs a named remote so the credential has an unambiguous env var. Configure ABX_REMOTE_<NAME>_URL, then run \`abx auth ${action} <name>\`.`);
377
+ }
378
+ return target;
379
+ }
380
+ export async function cmdAuth(args, flags) {
381
+ const positions = positionalArgs(args);
382
+ const subcommand = positions[0];
383
+ if ((subcommand !== 'login' && subcommand !== 'logout') || positions.length > 2) {
384
+ throw new Error('usage: abx auth <login|logout> [<remote-name>]');
385
+ }
386
+ if (flags.remote === 'true')
387
+ throw new Error('--remote needs a named remote, for example `--remote abx`');
388
+ const positionalTarget = positions[1];
389
+ const flagTarget = typeof flags.remote === 'string' && flags.remote !== 'true' ? flags.remote : undefined;
390
+ if (positionalTarget && flagTarget)
391
+ throw new Error('choose a positional remote name or --remote, not both');
392
+ const spec = positionalTarget ?? flagTarget ?? 'abx';
393
+ const target = targetForAuth(spec, subcommand);
394
+ const envPath = resolvePath(process.cwd(), '.env');
395
+ if (subcommand === 'logout') {
396
+ console.log(`\n ${bold('ABX logout')} ${dim(`→ ${target.url}`)}`);
397
+ const result = await oauthLogout({
398
+ baseUrl: target.url,
399
+ envVar: target.tokenVar,
400
+ envPath,
401
+ token: target.token
402
+ });
403
+ if (result.status === 'absent') {
404
+ info(`no ${target.tokenVar} credential is active; already logged out locally`);
405
+ return;
406
+ }
407
+ ok('revoked the current API key at the provider');
408
+ if (result.local === 'removed')
409
+ ok(`removed ${target.tokenVar} from ${basename(envPath)}`);
410
+ else if (result.local === 'external') {
411
+ info(`${target.tokenVar} came from your shell or another environment source; unset it there (the value is now revoked).`);
412
+ }
413
+ else {
414
+ info(`${basename(envPath)} contains a different ${target.tokenVar}; it is still active and was left unchanged. ` +
415
+ `Unset the shadowing environment value, then run logout again to revoke the file credential too.`);
416
+ }
417
+ return;
418
+ }
419
+ console.log(`\n ${bold('ABX device login')} ${dim(`→ ${target.url}`)}`);
420
+ info('Email and the one-time code stay in your browser. The CLI receives the API key after approval and never prints it.');
421
+ await deviceLogin({
422
+ baseUrl: target.url,
423
+ envVar: target.tokenVar,
424
+ envPath,
425
+ force: flags.force !== undefined,
426
+ noOpen: flags['no-open'] !== undefined
427
+ });
428
+ ok(`authorized and saved ${target.tokenVar} in your private .env (the key was not printed)`);
429
+ info(`verify it with ${g(`abx remote ${target.name?.toLowerCase() ?? spec}`)}`);
430
+ }
431
+ export const AUTH_HELP = `
432
+ ${bold('abx auth login')} [<remote-name>] ${dim('— authorize this CLI with OAuth 2.0 Device Authorization Grant')}
433
+ ${g('abx auth login')} first-party ABX Services (default)
434
+ ${g('abx auth login <name>')} another named remote configured by ABX_REMOTE_<NAME>_URL
435
+ ${g('--remote <name>')} equivalent target spelling for agent workflows
436
+ ${g('--no-open')} print the browser URL and code without trying to open it
437
+ ${g('--force')} recovery only: replace the local value without revoking the displaced key
438
+ ${dim(`The browser owns email + OTP approval. Only the waiting CLI receives the key, stores it as ${ABX_SERVICES_API_KEY_VAR}`)}
439
+ ${dim('(or the named remote\'s token variable), and never prints it. .env must be Git-ignored and must not be tracked.')}
440
+ ${dim('The stored key remains valid until revoked; reuse it across normal tasks and agent sessions.')}
441
+
442
+ ${bold('abx auth logout')} [<remote-name>] ${dim('— revoke the current API key, then remove its matching .env entry')}
443
+ ${g('abx auth logout')} first-party ABX Services (default)
444
+ ${g('abx auth logout <name>')} another named remote with OAuth revocation discovery
445
+ ${g('--remote <name>')} equivalent target spelling for agent workflows
446
+ ${dim('Use for teardown, compromise, rotation, or cleanup—not after each task. Remote revocation happens before local removal.')}`;
447
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EACL,UAAU,EACV,SAAS,EACT,YAAY,EACZ,UAAU,EACV,UAAU,EACV,aAAa,EACd,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAc,cAAc,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EACL,wBAAwB,EACxB,aAAa,EAEd,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAErD,MAAM,iBAAiB,GAAG,8CAA8C,CAAA;AACxE,MAAM,gBAAgB,GAAG,SAAS,CAAA;AAmDlC,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AAClC,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACxF,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAkB;IAC1C,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAY,CAAA;IACjE,OAAO,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAgC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC1G,CAAC;AAED,SAAS,YAAY,CACnB,MAAc,EACd,QAAkB,EAClB,IAA6B,EAC7B,kBAA4B,EAAE;IAE9B,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAA;IACrE,IAAI,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IACpD,KAAK,MAAM,KAAK,IAAI,eAAe;QAAE,IAAI,KAAK;YAAE,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,CAAA;IAC/F,OAAO,IAAI,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AACvE,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,KAAa;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAA;IAClF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;IAC7B,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,EAAE,CAAC,CAAA;IAC3G,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC3H,MAAM,IAAI,KAAK,CAAC,wCAAwC,KAAK,uCAAuC,CAAC,CAAA;IACvG,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAA;AAC1B,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAA;IAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACtD,MAAM,CAAC,QAAQ,GAAG,0CAA0C,UAAU,EAAE,CAAA;IACxE,MAAM,CAAC,MAAM,GAAG,EAAE,CAAA;IAClB,MAAM,CAAC,IAAI,GAAG,EAAE,CAAA;IAChB,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAA;AAC1B,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,OAAe,EAAE,SAAuB;IAC3E,MAAM,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAC5E,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE;QAC5D,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;QACvC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAA;IACvC,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,YAAY,CAAC,wBAAwB,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC9E,MAAM,QAAQ,GAAG,IAAgC,CAAA;IACjD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACpC,IAAI,QAAQ,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,mCAAmC,cAAc,cAAc,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACpH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED;kFACkF;AAClF,SAAS,kBAAkB,CAAC,GAAW;IACrC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,KAAK,CAAA;IAChC,IAAI,CAAC;QACH,MAAM,OAAO,GACX,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAC3B,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE;YAC/B,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;gBAC5B,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,6BAA6B,EAAE,GAAG,CAAC,EAAE;gBAClE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAA;QACzC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QACpF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAC3B,KAAK,CAAC,KAAK,EAAE,CAAA;QACb,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,GAAW;IAChD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;IAC1D,OAAO,IAAI,MAAM,CAAC,uBAAuB,OAAO,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAC5E,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,IAAc;IAC3C,IAAI,CAAC;QACH,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QACnD,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAI,KAA6B,CAAC,MAAM,CAAA;QACpD,OAAO,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;IACtD,CAAC;AACH,CAAC;AAED;8DAC8D;AAC9D,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5B,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,sDAAsD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5F,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;QAAE,OAAM;IAClE,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,2CAA2C,QAAQ,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAA;IACpH,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CACb,GAAG,QAAQ,CAAC,OAAO,CAAC,6BAA6B,QAAQ,CAAC,OAAO,CAAC,wCAAwC,CAC3G,CAAA;IACH,CAAC;AACH,CAAC;AAED;;oCAEoC;AACpC,MAAM,CAAC,MAAM,oBAAoB,GAAG,2BAA2B,CAAA;AAE/D,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,GAAW,EAAE,KAAa,EAAE,eAAuB,oBAAoB;IACpH,cAAc,CAAC,OAAO,EAAE,CAAC,EAAC,GAAG,EAAE,KAAK,EAAE,YAAY,EAAC,CAAC,CAAC,CAAA;AACvD,CAAC;AAED;2FAC2F;AAC3F,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,OAAmE;IAEnE,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAM;IAC3B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;IACxC,KAAK,MAAM,EAAC,GAAG,EAAE,KAAK,EAAE,YAAY,GAAG,oBAAoB,EAAC,IAAI,OAAO,EAAE,CAAC;QAC1E,+FAA+F;QAC/F,iGAAiG;QACjG,iGAAiG;QACjG,gGAAgG;QAC9F,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnF,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAA;QACvF,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACxB,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACvE,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACjD,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;YAC1D,OAAO,IAAI,MAAM,CAAC,uBAAuB,OAAO,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrE,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACf,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACpE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;IACD,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAQ;QAC/B,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC3E,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAA;QAC5B,QAAQ,GAAG,IAAI,CAAA;IACjB,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,GAAG,EAAE,CAAA;IAC/C,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAA;IACxC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACxH,IAAI,CAAC;QACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC9D,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,CAAA;QACtC,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAAe,EAAE,GAAW;IAChD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAA;IAC1C,OAAO,eAAe,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AAC3G,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,IAAI,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IAC3B,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAA;IAC7D,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;IAC/C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACrC,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;AACtE,CAAC;AAED;qGACqG;AACrG,SAAS,eAAe,CAAC,OAAe,EAAE,GAAW,EAAE,aAAqB;IAC1E,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAA;IACtC,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,6EAA6E,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACnH,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC5C,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,aAAa;QAAE,OAAO,KAAK,CAAA;IAC7F,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;IACnD,MAAM,MAAM,GAAG,MAAM;SAClB,KAAK,CAAC,OAAO,CAAC;SACd,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;SAChD,IAAI,CAAC,GAAG,CAAC,CAAA;IACZ,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACxH,IAAI,CAAC;QACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC9D,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,CAAA;QACtC,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC3E,MAAM,IAAI,KAAK,CACb,4CAA4C,GAAG,8BAA8B,QAAQ,CAAC,OAAO,CAAC,KAAK,MAAM,IAAI,kBAAkB,EAAE,CAClI,CAAA;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,sBAAsB,CAAC,OAA2B;IACzD,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACrC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACvF,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC9F,IAAI,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,CAAC,MAAM,sBAAsB,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,uDAAuD;YACrH,8EAA8E,CACjF,CAAA;IACH,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3F,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,CAAC,MAAM,2BAA2B,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,mEAAmE,CACzI,CAAA;IACH,CAAC;AACH,CAAC;AAED,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B,EAAE,OAAwB,EAAE;IACvF,sBAAsB,CAAC,OAAO,CAAC,CAAA;IAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAA;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,YAAY,CAAA;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAA;IAChC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,kBAAkB,CAAA;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAA;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAA;IAE5C,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACxE,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAA;IACzF,CAAC;IACD,MAAM,cAAc,GAAG,SAAS,CAAC,QAAQ,CAAC,6BAA6B,EAAE,+BAA+B,CAAC,CAAA;IACzG,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAA;IAE1E,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,cAAc,EAAE;QACpD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE,MAAM,EAAE,kBAAkB,EAAE;QAC5F,IAAI,EAAE,IAAI,eAAe,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;QAC1D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAA;IACF,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,CAAA;IACjD,IAAI,CAAC,aAAa,CAAC,EAAE;QAAE,MAAM,YAAY,CAAC,6BAA6B,EAAE,aAAa,EAAE,SAAS,CAAC,CAAA;IAClG,MAAM,KAAK,GAAG,SAAmD,CAAA;IACjE,IACE,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;QACrC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QACpC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;QAClC,KAAK,CAAC,UAAU,IAAI,CAAC,EACrB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAA;IACnF,CAAC;IACD,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,yBAAyB,IAAI,KAAK,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAA;IAChH,IAAI,WAAW,GACb,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC;QAC1F,CAAC,CAAC,KAAK,CAAC,QAAQ;QAChB,CAAC,CAAC,CAAC,CAAA;IACP,MAAM,QAAQ,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC,UAAU,GAAG,IAAI,CAAA;IAEhD,IAAI,CAAC,qBAAqB,eAAe,EAAE,CAAC,CAAA;IAC5C,IAAI,CAAC,iBAAiB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAA;IACxC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,sEAAsE,CAAC,CAAA;IACjF,CAAC;IACD,IAAI,CAAC,6BAA6B,CAAC,CAAA;IAEnC,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;QAC/B,2FAA2F;QAC3F,0FAA0F;QAC1F,sBAAsB,CAAC,OAAO,CAAC,CAAA;QAC/B,IAAI,QAAkB,CAAA;QACtB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,SAAS,CAAC,aAAa,EAAE;gBACxC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE,MAAM,EAAE,kBAAkB,EAAE;gBAC5F,IAAI,EAAE,IAAI,eAAe,CAAC;oBACxB,UAAU,EAAE,iBAAiB;oBAC7B,SAAS,EAAE,gBAAgB;oBAC3B,WAAW,EAAE,KAAK,CAAC,WAAW;iBAC/B,CAAC;gBACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;aACpC,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACxD,OAAO,CAAC,wDAAwD,WAAW,IAAI,CAAC,CAAA;YAChF,SAAQ;QACV,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAA;QACvC,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAA;YACrC,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClF,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;YACxE,CAAC;YACD,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE,CAAC;gBACtF,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;YAC1E,CAAC;YACD,8FAA8F;YAC9F,qEAAqE;YACrE,sBAAsB,CAAC,OAAO,CAAC,CAAA;YAC/B,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;YAC3D,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACxC,IAAI,IAAI,KAAK,uBAAuB;YAAE,SAAQ;QAC9C,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,WAAW,IAAI,CAAC,CAAA;YAChB,SAAQ;QACV,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACtD,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAA;YAC9D,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,EAAE,EAAE,CAAC,CAAA;YACxG,OAAO,CAAC,mDAAmD,WAAW,IAAI,CAAC,CAAA;YAC3E,SAAQ;QACV,CAAC;QACD,IAAI,IAAI,KAAK,eAAe;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;QAChF,IAAI,IAAI,KAAK,eAAe;YAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;QAC9F,MAAM,YAAY,CAAC,6BAA6B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAA;IACxF,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;AAClE,CAAC;AAED;iGACiG;AACjG,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAA2B,EAC3B,OAAwB,EAAE;IAE1B,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,SAAS,CAAA;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;IAEvC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAA;IACzC,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACxE,MAAM,kBAAkB,GAAG,SAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAA;IACzF,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,kBAAkB,EAAE;QACnD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE,MAAM,EAAE,kBAAkB,EAAE;QAC5F,IAAI,EAAE,IAAI,eAAe,CAAC;YACxB,SAAS,EAAE,gBAAgB;YAC3B,KAAK;YACL,eAAe,EAAE,cAAc;SAChC,CAAC;QACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAA;IACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAA;QACvC,MAAM,YAAY,CAAC,+BAA+B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9E,CAAC;IAED,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACtE,MAAM,KAAK,GACT,gBAAgB,KAAK,KAAK,IAAI,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;QACnF,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,gBAAgB,KAAK,SAAS;YAC9B,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,WAAW,CAAA;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7E,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;AACrC,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,MAA0B;IAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IAClC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,iBAAiB,CAAC,CAAA;IAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,QAAQ,MAAM,4HAA4H,MAAM,YAAY,CAC7J,CAAA;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAc,EAAE,KAAY;IACxD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;IACtC,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;IAC/B,IAAI,CAAC,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,QAAQ,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChF,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IACnE,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;IACzG,MAAM,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;IACrC,MAAM,UAAU,GAAG,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;IACzG,IAAI,gBAAgB,IAAI,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;IAC5G,MAAM,IAAI,GAAG,gBAAgB,IAAI,UAAU,IAAI,KAAK,CAAA;IACpD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IAC9C,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAA;IAElD,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;QAClE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;YAC/B,OAAO,EAAE,MAAM,CAAC,GAAG;YACnB,MAAM,EAAE,MAAM,CAAC,QAAQ;YACvB,OAAO;YACP,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CAAA;QACF,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,MAAM,CAAC,QAAQ,mDAAmD,CAAC,CAAA;YAC9E,OAAM;QACR,CAAC;QACD,EAAE,CAAC,6CAA6C,CAAC,CAAA;QACjD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;YAAE,EAAE,CAAC,WAAW,MAAM,CAAC,QAAQ,SAAS,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;aACrF,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,iGAAiG,CAAC,CAAA;QAC3H,CAAC;aAAM,CAAC;YACN,IAAI,CACF,GAAG,QAAQ,CAAC,OAAO,CAAC,yBAAyB,MAAM,CAAC,QAAQ,+CAA+C;gBACzG,iGAAiG,CACpG,CAAA;QACH,CAAC;QACD,OAAM;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;IACxE,IAAI,CAAC,oHAAoH,CAAC,CAAA;IAC1H,MAAM,WAAW,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC,GAAG;QACnB,MAAM,EAAE,MAAM,CAAC,QAAQ;QACvB,OAAO;QACP,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS;QAChC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,SAAS;KACvC,CAAC,CAAA;IACF,EAAE,CAAC,wBAAwB,MAAM,CAAC,QAAQ,iDAAiD,CAAC,CAAA;IAC5F,IAAI,CAAC,kBAAkB,CAAC,CAAC,cAAc,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;AACjF,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;IACrB,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,GAAG,CAAC,gEAAgE,CAAC;MAC7G,CAAC,CAAC,gBAAgB,CAAC;MACnB,CAAC,CAAC,uBAAuB,CAAC;MAC1B,CAAC,CAAC,iBAAiB,CAAC;MACpB,CAAC,CAAC,WAAW,CAAC;MACd,CAAC,CAAC,SAAS,CAAC;MACZ,GAAG,CAAC,8FAA8F,wBAAwB,EAAE,CAAC;MAC7H,GAAG,CAAC,iHAAiH,CAAC;MACtH,GAAG,CAAC,8FAA8F,CAAC;;IAErG,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,GAAG,CAAC,mEAAmE,CAAC;MACjH,CAAC,CAAC,iBAAiB,CAAC;MACpB,CAAC,CAAC,wBAAwB,CAAC;MAC3B,CAAC,CAAC,iBAAiB,CAAC;MACpB,GAAG,CAAC,yHAAyH,CAAC,EAAE,CAAA"}