arkna-sdk 0.1.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/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +562 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +257 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +948 -0
- package/dist/client.js.map +1 -0
- package/dist/enforcement.d.ts +67 -0
- package/dist/enforcement.d.ts.map +1 -0
- package/dist/enforcement.js +303 -0
- package/dist/enforcement.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +74 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +333 -0
- package/dist/init.js.map +1 -0
- package/dist/instrumentations/langchain.d.ts +79 -0
- package/dist/instrumentations/langchain.d.ts.map +1 -0
- package/dist/instrumentations/langchain.js +398 -0
- package/dist/instrumentations/langchain.js.map +1 -0
- package/dist/instrumentations/vercel-ai.d.ts +40 -0
- package/dist/instrumentations/vercel-ai.d.ts.map +1 -0
- package/dist/instrumentations/vercel-ai.js +212 -0
- package/dist/instrumentations/vercel-ai.js.map +1 -0
- package/dist/license.d.ts +89 -0
- package/dist/license.d.ts.map +1 -0
- package/dist/license.js +198 -0
- package/dist/license.js.map +1 -0
- package/dist/types.d.ts +402 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +41 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ARKNA CLI — Setup and manage agent governance
|
|
4
|
+
*
|
|
5
|
+
* Commands:
|
|
6
|
+
* npx @arkna/sdk init — Interactive setup: register agent, write config, install hooks
|
|
7
|
+
* npx @arkna/sdk init --token <token> --url <url> — Non-interactive setup
|
|
8
|
+
* npx @arkna/sdk status — Check connection, compliance, enforcement status
|
|
9
|
+
* npx @arkna/sdk heartbeat — Send a single heartbeat (useful for cron)
|
|
10
|
+
*
|
|
11
|
+
* What `init` does:
|
|
12
|
+
* 1. Creates .arkna/.env with gateway token + URL
|
|
13
|
+
* 2. Registers agent with the ARKNA gateway
|
|
14
|
+
* 3. Fetches and writes governance contract (.arkna/governance.json)
|
|
15
|
+
* 4. Detects OpenClaw and auto-installs @arkna/openclaw-hook
|
|
16
|
+
* 5. Starts enforcement (if governance contract is strict mode)
|
|
17
|
+
* 6. Sends initial heartbeat to confirm connectivity
|
|
18
|
+
*/
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,562 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* ARKNA CLI — Setup and manage agent governance
|
|
5
|
+
*
|
|
6
|
+
* Commands:
|
|
7
|
+
* npx @arkna/sdk init — Interactive setup: register agent, write config, install hooks
|
|
8
|
+
* npx @arkna/sdk init --token <token> --url <url> — Non-interactive setup
|
|
9
|
+
* npx @arkna/sdk status — Check connection, compliance, enforcement status
|
|
10
|
+
* npx @arkna/sdk heartbeat — Send a single heartbeat (useful for cron)
|
|
11
|
+
*
|
|
12
|
+
* What `init` does:
|
|
13
|
+
* 1. Creates .arkna/.env with gateway token + URL
|
|
14
|
+
* 2. Registers agent with the ARKNA gateway
|
|
15
|
+
* 3. Fetches and writes governance contract (.arkna/governance.json)
|
|
16
|
+
* 4. Detects OpenClaw and auto-installs @arkna/openclaw-hook
|
|
17
|
+
* 5. Starts enforcement (if governance contract is strict mode)
|
|
18
|
+
* 6. Sends initial heartbeat to confirm connectivity
|
|
19
|
+
*/
|
|
20
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
23
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
24
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
25
|
+
}
|
|
26
|
+
Object.defineProperty(o, k2, desc);
|
|
27
|
+
}) : (function(o, m, k, k2) {
|
|
28
|
+
if (k2 === undefined) k2 = k;
|
|
29
|
+
o[k2] = m[k];
|
|
30
|
+
}));
|
|
31
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
32
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
33
|
+
}) : function(o, v) {
|
|
34
|
+
o["default"] = v;
|
|
35
|
+
});
|
|
36
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
37
|
+
var ownKeys = function(o) {
|
|
38
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
39
|
+
var ar = [];
|
|
40
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
41
|
+
return ar;
|
|
42
|
+
};
|
|
43
|
+
return ownKeys(o);
|
|
44
|
+
};
|
|
45
|
+
return function (mod) {
|
|
46
|
+
if (mod && mod.__esModule) return mod;
|
|
47
|
+
var result = {};
|
|
48
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
49
|
+
__setModuleDefault(result, mod);
|
|
50
|
+
return result;
|
|
51
|
+
};
|
|
52
|
+
})();
|
|
53
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
+
const fs = __importStar(require("fs"));
|
|
55
|
+
const path = __importStar(require("path"));
|
|
56
|
+
const readline = __importStar(require("readline"));
|
|
57
|
+
const child_process_1 = require("child_process");
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// Helpers
|
|
60
|
+
// ============================================================================
|
|
61
|
+
const COLORS = {
|
|
62
|
+
reset: '\x1b[0m',
|
|
63
|
+
green: '\x1b[32m',
|
|
64
|
+
red: '\x1b[31m',
|
|
65
|
+
yellow: '\x1b[33m',
|
|
66
|
+
blue: '\x1b[34m',
|
|
67
|
+
dim: '\x1b[2m',
|
|
68
|
+
bold: '\x1b[1m',
|
|
69
|
+
};
|
|
70
|
+
function log(msg) { console.log(msg); }
|
|
71
|
+
function ok(msg) { log(`${COLORS.green}✓${COLORS.reset} ${msg}`); }
|
|
72
|
+
function warn(msg) { log(`${COLORS.yellow}⚠${COLORS.reset} ${msg}`); }
|
|
73
|
+
function fail(msg) { log(`${COLORS.red}✗${COLORS.reset} ${msg}`); }
|
|
74
|
+
function info(msg) { log(`${COLORS.dim} ${msg}${COLORS.reset}`); }
|
|
75
|
+
function heading(msg) { log(`\n${COLORS.bold}${msg}${COLORS.reset}`); }
|
|
76
|
+
function prompt(question) {
|
|
77
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
78
|
+
return new Promise(resolve => {
|
|
79
|
+
rl.question(question, answer => { rl.close(); resolve(answer.trim()); });
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function detectOpenClaw() {
|
|
83
|
+
try {
|
|
84
|
+
(0, child_process_1.execSync)('which openclaw', { stdio: 'pipe' });
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function detectPlatform() {
|
|
92
|
+
if (detectOpenClaw())
|
|
93
|
+
return 'openclaw';
|
|
94
|
+
try {
|
|
95
|
+
// Check for common agent frameworks
|
|
96
|
+
const pkg = JSON.parse(fs.readFileSync('package.json', 'utf-8'));
|
|
97
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
98
|
+
if (deps['crewai'] || deps['@crewai/sdk'])
|
|
99
|
+
return 'crewai';
|
|
100
|
+
if (deps['langchain'] || deps['@langchain/core'])
|
|
101
|
+
return 'langchain';
|
|
102
|
+
if (deps['autogen'] || deps['@autogen/core'])
|
|
103
|
+
return 'autogen';
|
|
104
|
+
}
|
|
105
|
+
catch { }
|
|
106
|
+
return 'custom';
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Apply fail-closed OpenClaw hard-routing policy.
|
|
110
|
+
*
|
|
111
|
+
* This does not "route" native tools through ARKNA (OpenClaw core would need a pre-tool middleware for that),
|
|
112
|
+
* so we enforce by denying direct high-risk native tools and requiring governed SDK paths instead.
|
|
113
|
+
*/
|
|
114
|
+
function applyOpenClawHardRoutePolicy() {
|
|
115
|
+
const cfgPath = path.join(process.env.HOME || '', '.openclaw', 'openclaw.json');
|
|
116
|
+
const notes = [];
|
|
117
|
+
if (!fs.existsSync(cfgPath)) {
|
|
118
|
+
return { changed: false, notes: ['openclaw config not found'] };
|
|
119
|
+
}
|
|
120
|
+
const cfg = JSON.parse(fs.readFileSync(cfgPath, 'utf-8'));
|
|
121
|
+
const agents = (cfg.agents ||= {});
|
|
122
|
+
const list = (agents.list ||= [{ id: 'main' }]);
|
|
123
|
+
let main = list.find((a) => a && a.id === 'main');
|
|
124
|
+
if (!main) {
|
|
125
|
+
main = { id: 'main' };
|
|
126
|
+
list.push(main);
|
|
127
|
+
}
|
|
128
|
+
const tools = (main.tools ||= {});
|
|
129
|
+
const deny = new Set(Array.isArray(tools.deny) ? tools.deny : []);
|
|
130
|
+
// High-risk direct paths that can bypass ARKNA policy decision flow
|
|
131
|
+
for (const t of ['message', 'exec', 'nodes', 'browser'])
|
|
132
|
+
deny.add(t);
|
|
133
|
+
tools.deny = Array.from(deny).sort();
|
|
134
|
+
// Global exec fail-closed policy
|
|
135
|
+
const rootTools = (cfg.tools ||= {});
|
|
136
|
+
const execCfg = (rootTools.exec ||= {});
|
|
137
|
+
execCfg.security = 'deny';
|
|
138
|
+
execCfg.ask = 'off';
|
|
139
|
+
fs.writeFileSync(cfgPath, JSON.stringify(cfg, null, 2) + '\n');
|
|
140
|
+
notes.push('main.tools.deny += [message, exec, nodes, browser]');
|
|
141
|
+
notes.push('tools.exec.security=deny, tools.exec.ask=off');
|
|
142
|
+
return { changed: true, notes };
|
|
143
|
+
}
|
|
144
|
+
// ============================================================================
|
|
145
|
+
// Commands
|
|
146
|
+
// ============================================================================
|
|
147
|
+
async function init(args) {
|
|
148
|
+
heading('ARKNA Agent Setup');
|
|
149
|
+
log('');
|
|
150
|
+
// Parse args
|
|
151
|
+
let token = '';
|
|
152
|
+
let url = 'https://api.arkna.com.au';
|
|
153
|
+
let name = '';
|
|
154
|
+
let nonInteractive = false;
|
|
155
|
+
for (let i = 0; i < args.length; i++) {
|
|
156
|
+
if (args[i] === '--token' && args[i + 1]) {
|
|
157
|
+
token = args[++i];
|
|
158
|
+
nonInteractive = true;
|
|
159
|
+
}
|
|
160
|
+
if (args[i] === '--url' && args[i + 1]) {
|
|
161
|
+
url = args[++i];
|
|
162
|
+
}
|
|
163
|
+
if (args[i] === '--name' && args[i + 1]) {
|
|
164
|
+
name = args[++i];
|
|
165
|
+
}
|
|
166
|
+
if (args[i] === '--non-interactive' || args[i] === '-y') {
|
|
167
|
+
nonInteractive = true;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Step 1: Get credentials
|
|
171
|
+
heading('1. Gateway credentials');
|
|
172
|
+
// Check if .arkna/.env already exists
|
|
173
|
+
const arknaDir = path.join(process.cwd(), '.arkna');
|
|
174
|
+
const envPath = path.join(arknaDir, '.env');
|
|
175
|
+
if (fs.existsSync(envPath)) {
|
|
176
|
+
const existing = fs.readFileSync(envPath, 'utf-8');
|
|
177
|
+
const existingToken = existing.match(/ARKNA_GATEWAY_TOKEN=(.+)/)?.[1]?.trim();
|
|
178
|
+
if (existingToken) {
|
|
179
|
+
ok('.arkna/.env already exists');
|
|
180
|
+
if (!token)
|
|
181
|
+
token = existingToken;
|
|
182
|
+
const existingUrl = existing.match(/ARKNA_URL=(.+)/)?.[1]?.trim();
|
|
183
|
+
if (existingUrl && !url)
|
|
184
|
+
url = existingUrl;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (!token && !nonInteractive) {
|
|
188
|
+
log(' Get your token from https://app.arkna.com.au → Settings → Integration Tokens');
|
|
189
|
+
token = await prompt(` ${COLORS.bold}Gateway token:${COLORS.reset} `);
|
|
190
|
+
}
|
|
191
|
+
if (!token) {
|
|
192
|
+
fail('No gateway token provided. Get one from https://app.arkna.com.au');
|
|
193
|
+
process.exit(1);
|
|
194
|
+
}
|
|
195
|
+
if (!nonInteractive && !url) {
|
|
196
|
+
const customUrl = await prompt(` ${COLORS.bold}Gateway URL${COLORS.reset} [${url}]: `);
|
|
197
|
+
if (customUrl)
|
|
198
|
+
url = customUrl;
|
|
199
|
+
}
|
|
200
|
+
// Write .arkna/.env
|
|
201
|
+
fs.mkdirSync(arknaDir, { recursive: true });
|
|
202
|
+
// Add .arkna to .gitignore if not already there
|
|
203
|
+
const gitignorePath = path.join(arknaDir, '.gitignore');
|
|
204
|
+
if (!fs.existsSync(gitignorePath)) {
|
|
205
|
+
fs.writeFileSync(gitignorePath, '.env\ngovernance.json\n');
|
|
206
|
+
}
|
|
207
|
+
const envContent = `# ARKNA AI Trust Gateway — auto-generated by arkna init
|
|
208
|
+
# Docs: https://docs.arkna.com.au/sdk
|
|
209
|
+
ARKNA_GATEWAY_TOKEN=${token}
|
|
210
|
+
ARKNA_URL=${url}
|
|
211
|
+
`;
|
|
212
|
+
fs.writeFileSync(envPath, envContent);
|
|
213
|
+
ok('.arkna/.env written');
|
|
214
|
+
// Step 2: Register agent
|
|
215
|
+
heading('2. Agent registration');
|
|
216
|
+
const platform = detectPlatform();
|
|
217
|
+
if (!name) {
|
|
218
|
+
name = path.basename(process.cwd());
|
|
219
|
+
if (!nonInteractive) {
|
|
220
|
+
const customName = await prompt(` ${COLORS.bold}Agent name${COLORS.reset} [${name}]: `);
|
|
221
|
+
if (customName)
|
|
222
|
+
name = customName;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
const apiBase = url.replace(/\/$/, '') + '/api/gateway';
|
|
226
|
+
try {
|
|
227
|
+
const regResp = await fetch(`${apiBase}/register`, {
|
|
228
|
+
method: 'POST',
|
|
229
|
+
headers: { 'X-Integration-Token': token, 'Content-Type': 'application/json' },
|
|
230
|
+
body: JSON.stringify({ name, platform, metadata: { sdk_version: '0.1.0', setup: 'cli' } }),
|
|
231
|
+
signal: AbortSignal.timeout(10_000),
|
|
232
|
+
});
|
|
233
|
+
if (regResp.ok) {
|
|
234
|
+
const reg = await regResp.json();
|
|
235
|
+
const agentId = reg.agent?.id || reg.agent_id || reg.id;
|
|
236
|
+
ok(`Registered as "${name}" (${platform})`);
|
|
237
|
+
if (agentId)
|
|
238
|
+
info(`Agent ID: ${agentId}`);
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
const err = await regResp.json().catch(() => ({}));
|
|
242
|
+
if (regResp.status === 409) {
|
|
243
|
+
ok('Agent already registered');
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
warn(`Registration: ${err.error || regResp.status} (non-fatal, heartbeats still work)`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
warn(`Could not reach gateway: ${err.message}`);
|
|
252
|
+
info('The agent will register automatically on first heartbeat');
|
|
253
|
+
}
|
|
254
|
+
// Step 3: Fetch governance contract
|
|
255
|
+
heading('3. Governance contract');
|
|
256
|
+
try {
|
|
257
|
+
const govResp = await fetch(`${apiBase}/governance`, {
|
|
258
|
+
headers: { 'X-Integration-Token': token },
|
|
259
|
+
signal: AbortSignal.timeout(10_000),
|
|
260
|
+
});
|
|
261
|
+
if (govResp.ok) {
|
|
262
|
+
const gov = await govResp.json();
|
|
263
|
+
if (gov.governance_contract) {
|
|
264
|
+
const contractPath = path.join(arknaDir, 'governance.json');
|
|
265
|
+
fs.writeFileSync(contractPath, JSON.stringify(gov.governance_contract, null, 2));
|
|
266
|
+
ok(`Governance contract written (${gov.governance_contract.enforcement_mode} mode)`);
|
|
267
|
+
info(`Governed domains: ${gov.governance_contract.governed_domains?.length || 0}`);
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
info('No governance contract assigned yet');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
info('Could not fetch governance contract (will retry on heartbeat)');
|
|
276
|
+
}
|
|
277
|
+
// Step 4: Detect and install OpenClaw hook
|
|
278
|
+
heading('4. Runtime integration');
|
|
279
|
+
if (detectOpenClaw()) {
|
|
280
|
+
ok('OpenClaw detected');
|
|
281
|
+
// Check if hook is already installed
|
|
282
|
+
try {
|
|
283
|
+
const hooksList = (0, child_process_1.execSync)('openclaw hooks list 2>/dev/null', { encoding: 'utf-8' });
|
|
284
|
+
if (hooksList.includes('arkna-telemetry')) {
|
|
285
|
+
ok('@arkna/openclaw-hook already installed');
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
info('Installing @arkna/openclaw-hook...');
|
|
289
|
+
try {
|
|
290
|
+
// Try npm install first (published), fall back to local link
|
|
291
|
+
(0, child_process_1.execSync)('openclaw hooks install @arkna/openclaw-hook 2>/dev/null', { stdio: 'pipe' });
|
|
292
|
+
ok('@arkna/openclaw-hook installed');
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
// Try local path (dev/pre-publish)
|
|
296
|
+
const localHookPath = path.resolve(__dirname, '..', '..', 'arkna-openclaw-hook');
|
|
297
|
+
if (fs.existsSync(path.join(localHookPath, 'HOOK.md'))) {
|
|
298
|
+
try {
|
|
299
|
+
(0, child_process_1.execSync)(`openclaw hooks install --link ${localHookPath}`, { stdio: 'pipe' });
|
|
300
|
+
ok('@arkna/openclaw-hook installed (local link)');
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
warn('Could not install hook — install manually: openclaw hooks install @arkna/openclaw-hook');
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
warn('Hook package not found — install manually: openclaw hooks install @arkna/openclaw-hook');
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
warn('Could not check hooks — install manually: openclaw hooks install @arkna/openclaw-hook');
|
|
314
|
+
}
|
|
315
|
+
// Apply fail-closed policy so direct high-risk native tools are blocked by default.
|
|
316
|
+
try {
|
|
317
|
+
const hardRoute = applyOpenClawHardRoutePolicy();
|
|
318
|
+
if (hardRoute.changed) {
|
|
319
|
+
ok('Applied OpenClaw hard-routing policy (fail-closed)');
|
|
320
|
+
hardRoute.notes.forEach((n) => info(n));
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
catch (err) {
|
|
324
|
+
warn(`Could not apply hard-routing policy automatically: ${err.message}`);
|
|
325
|
+
info('Manual: set main.tools.deny=[message,exec,nodes,browser] and tools.exec.security=deny');
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
info('Not running in OpenClaw — use SDK directly:');
|
|
330
|
+
info('');
|
|
331
|
+
info(" import { ArknaClient } from '@arkna/sdk';");
|
|
332
|
+
info(' const client = new ArknaClient();');
|
|
333
|
+
info(' client.startHeartbeat(30_000, { enriched: true });');
|
|
334
|
+
info('');
|
|
335
|
+
}
|
|
336
|
+
// Step 5: Send initial heartbeat
|
|
337
|
+
heading('5. Connectivity check');
|
|
338
|
+
try {
|
|
339
|
+
const hbResp = await fetch(`${apiBase}/heartbeat`, {
|
|
340
|
+
method: 'POST',
|
|
341
|
+
headers: { 'X-Integration-Token': token, 'Content-Type': 'application/json' },
|
|
342
|
+
body: JSON.stringify({
|
|
343
|
+
metadata: {
|
|
344
|
+
sdk_version: '0.1.0',
|
|
345
|
+
platform,
|
|
346
|
+
setup_event: 'init_complete',
|
|
347
|
+
enforcement_active: fs.existsSync(path.join(arknaDir, 'governance.json')),
|
|
348
|
+
},
|
|
349
|
+
}),
|
|
350
|
+
signal: AbortSignal.timeout(10_000),
|
|
351
|
+
});
|
|
352
|
+
if (hbResp.ok) {
|
|
353
|
+
const hb = await hbResp.json();
|
|
354
|
+
ok('Gateway connected');
|
|
355
|
+
info(`Agent ID: ${hb.agent_id}`);
|
|
356
|
+
info(`Kill switch: ${hb.kill_switch ? 'ACTIVE' : 'off'}`);
|
|
357
|
+
if (hb.kill_switch) {
|
|
358
|
+
warn(`Kill switch is active: ${hb.kill_reason || 'no reason given'}`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
fail(`Heartbeat failed: HTTP ${hbResp.status}`);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
catch (err) {
|
|
366
|
+
fail(`Cannot reach gateway: ${err.message}`);
|
|
367
|
+
}
|
|
368
|
+
// Done
|
|
369
|
+
heading('Setup complete\n');
|
|
370
|
+
log(` Your agent is now governed by ARKNA.`);
|
|
371
|
+
log(` Dashboard: https://app.arkna.com.au`);
|
|
372
|
+
log(` Docs: https://docs.arkna.com.au/sdk\n`);
|
|
373
|
+
if (detectOpenClaw()) {
|
|
374
|
+
log(` ${COLORS.dim}Restart the gateway to activate the hook:${COLORS.reset}`);
|
|
375
|
+
log(` ${COLORS.bold}openclaw gateway restart${COLORS.reset}\n`);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
async function status() {
|
|
379
|
+
heading('ARKNA Agent Status');
|
|
380
|
+
// Load config
|
|
381
|
+
const arknaDir = path.join(process.cwd(), '.arkna');
|
|
382
|
+
const envPath = path.join(arknaDir, '.env');
|
|
383
|
+
if (!fs.existsSync(envPath)) {
|
|
384
|
+
fail('Not initialized. Run: npx @arkna/sdk init');
|
|
385
|
+
process.exit(1);
|
|
386
|
+
}
|
|
387
|
+
const envContent = fs.readFileSync(envPath, 'utf-8');
|
|
388
|
+
const token = envContent.match(/ARKNA_GATEWAY_TOKEN=(.+)/)?.[1]?.trim();
|
|
389
|
+
const url = (envContent.match(/ARKNA_URL=(.+)/)?.[1]?.trim() || 'https://api.arkna.com.au').replace(/\/$/, '');
|
|
390
|
+
if (!token) {
|
|
391
|
+
fail('No ARKNA_GATEWAY_TOKEN in .arkna/.env');
|
|
392
|
+
process.exit(1);
|
|
393
|
+
}
|
|
394
|
+
const apiBase = url + '/api/gateway';
|
|
395
|
+
// Check gateway connectivity
|
|
396
|
+
log('');
|
|
397
|
+
try {
|
|
398
|
+
const hbResp = await fetch(`${apiBase}/heartbeat`, {
|
|
399
|
+
method: 'POST',
|
|
400
|
+
headers: { 'X-Integration-Token': token, 'Content-Type': 'application/json' },
|
|
401
|
+
body: JSON.stringify({ metadata: { sdk_version: '0.1.0', probe: 'status' } }),
|
|
402
|
+
signal: AbortSignal.timeout(10_000),
|
|
403
|
+
});
|
|
404
|
+
if (hbResp.ok) {
|
|
405
|
+
const hb = await hbResp.json();
|
|
406
|
+
ok(`Gateway: connected`);
|
|
407
|
+
info(`Agent ID: ${hb.agent_id}`);
|
|
408
|
+
info(`Kill switch: ${hb.kill_switch ? `ACTIVE (${hb.kill_reason})` : 'off'}`);
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
fail(`Gateway: HTTP ${hbResp.status}`);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
catch (err) {
|
|
415
|
+
fail(`Gateway: unreachable (${err.message})`);
|
|
416
|
+
}
|
|
417
|
+
// Check governance contract
|
|
418
|
+
const contractPath = path.join(arknaDir, 'governance.json');
|
|
419
|
+
if (fs.existsSync(contractPath)) {
|
|
420
|
+
try {
|
|
421
|
+
const contract = JSON.parse(fs.readFileSync(contractPath, 'utf-8'));
|
|
422
|
+
ok(`Governance: ${contract.enforcement_mode} mode`);
|
|
423
|
+
info(`Domains: ${contract.governed_domains?.length || 0} governed`);
|
|
424
|
+
info(`Issued: ${contract.issued_at}`);
|
|
425
|
+
}
|
|
426
|
+
catch {
|
|
427
|
+
warn('Governance: contract file corrupt');
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
info('Governance: no contract (run init to fetch)');
|
|
432
|
+
}
|
|
433
|
+
// Check OpenClaw hook + hard-routing policy
|
|
434
|
+
if (detectOpenClaw()) {
|
|
435
|
+
try {
|
|
436
|
+
const hooks = (0, child_process_1.execSync)('openclaw hooks list 2>/dev/null', { encoding: 'utf-8' });
|
|
437
|
+
if (hooks.includes('arkna-telemetry')) {
|
|
438
|
+
ok('OpenClaw hook: installed');
|
|
439
|
+
}
|
|
440
|
+
else {
|
|
441
|
+
warn('OpenClaw hook: not installed (run: openclaw hooks install @arkna/openclaw-hook)');
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
catch {
|
|
445
|
+
warn('OpenClaw hook: could not check');
|
|
446
|
+
}
|
|
447
|
+
try {
|
|
448
|
+
const cfgPath = path.join(process.env.HOME || '', '.openclaw', 'openclaw.json');
|
|
449
|
+
if (fs.existsSync(cfgPath)) {
|
|
450
|
+
const cfg = JSON.parse(fs.readFileSync(cfgPath, 'utf-8'));
|
|
451
|
+
const main = (cfg?.agents?.list || []).find((a) => a?.id === 'main') || {};
|
|
452
|
+
const deny = new Set(Array.isArray(main?.tools?.deny) ? main.tools.deny : []);
|
|
453
|
+
const needed = ['message', 'exec', 'nodes', 'browser'];
|
|
454
|
+
const missing = needed.filter((k) => !deny.has(k));
|
|
455
|
+
const execCfg = cfg?.tools?.exec || {};
|
|
456
|
+
const execLocked = execCfg.security === 'deny';
|
|
457
|
+
if (missing.length === 0 && execLocked) {
|
|
458
|
+
ok('Hard-routing policy: enabled (direct high-risk tools blocked)');
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
warn('Hard-routing policy: incomplete');
|
|
462
|
+
if (missing.length > 0)
|
|
463
|
+
info(`missing deny entries: ${missing.join(', ')}`);
|
|
464
|
+
if (!execLocked)
|
|
465
|
+
info('tools.exec.security is not deny');
|
|
466
|
+
info('Run: arkna init to apply fail-closed OpenClaw policy');
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
catch {
|
|
471
|
+
warn('Hard-routing policy: could not check');
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
log('');
|
|
475
|
+
}
|
|
476
|
+
async function heartbeat() {
|
|
477
|
+
// Load config
|
|
478
|
+
const envPath = path.join(process.cwd(), '.arkna', '.env');
|
|
479
|
+
if (!fs.existsSync(envPath)) {
|
|
480
|
+
fail('Not initialized. Run: npx @arkna/sdk init');
|
|
481
|
+
process.exit(1);
|
|
482
|
+
}
|
|
483
|
+
const envContent = fs.readFileSync(envPath, 'utf-8');
|
|
484
|
+
const token = envContent.match(/ARKNA_GATEWAY_TOKEN=(.+)/)?.[1]?.trim();
|
|
485
|
+
const url = (envContent.match(/ARKNA_URL=(.+)/)?.[1]?.trim() || 'https://api.arkna.com.au').replace(/\/$/, '');
|
|
486
|
+
if (!token) {
|
|
487
|
+
fail('No token');
|
|
488
|
+
process.exit(1);
|
|
489
|
+
}
|
|
490
|
+
const os = require('os');
|
|
491
|
+
const loadAvg = os.loadavg();
|
|
492
|
+
const totalMem = os.totalmem();
|
|
493
|
+
const freeMem = os.freemem();
|
|
494
|
+
const resp = await fetch(`${url}/api/gateway/heartbeat`, {
|
|
495
|
+
method: 'POST',
|
|
496
|
+
headers: { 'X-Integration-Token': token, 'Content-Type': 'application/json' },
|
|
497
|
+
body: JSON.stringify({
|
|
498
|
+
metadata: {
|
|
499
|
+
sdk_version: '0.1.0',
|
|
500
|
+
source: 'cli',
|
|
501
|
+
system: {
|
|
502
|
+
load_1m: Math.round(loadAvg[0] * 100) / 100,
|
|
503
|
+
memory_used_pct: Math.round((1 - freeMem / totalMem) * 100),
|
|
504
|
+
platform: os.platform(),
|
|
505
|
+
hostname: os.hostname(),
|
|
506
|
+
},
|
|
507
|
+
},
|
|
508
|
+
}),
|
|
509
|
+
signal: AbortSignal.timeout(10_000),
|
|
510
|
+
});
|
|
511
|
+
if (resp.ok) {
|
|
512
|
+
const hb = await resp.json();
|
|
513
|
+
ok(`Heartbeat sent — agent ${hb.agent_id}, kill_switch: ${hb.kill_switch}`);
|
|
514
|
+
if (hb.kill_switch) {
|
|
515
|
+
fail(`KILL SWITCH ACTIVE: ${hb.kill_reason}`);
|
|
516
|
+
process.exit(2);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
fail(`Heartbeat failed: HTTP ${resp.status}`);
|
|
521
|
+
process.exit(1);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
// ============================================================================
|
|
525
|
+
// Main
|
|
526
|
+
// ============================================================================
|
|
527
|
+
const [cmd, ...args] = process.argv.slice(2);
|
|
528
|
+
switch (cmd) {
|
|
529
|
+
case 'init':
|
|
530
|
+
init(args).catch(err => { fail(err.message); process.exit(1); });
|
|
531
|
+
break;
|
|
532
|
+
case 'status':
|
|
533
|
+
status().catch(err => { fail(err.message); process.exit(1); });
|
|
534
|
+
break;
|
|
535
|
+
case 'heartbeat':
|
|
536
|
+
heartbeat().catch(err => { fail(err.message); process.exit(1); });
|
|
537
|
+
break;
|
|
538
|
+
default:
|
|
539
|
+
log(`
|
|
540
|
+
${COLORS.bold}@arkna/sdk${COLORS.reset} — ARKNA AI Trust Gateway CLI
|
|
541
|
+
|
|
542
|
+
${COLORS.bold}Commands:${COLORS.reset}
|
|
543
|
+
init Set up agent governance (register, configure, install hooks)
|
|
544
|
+
status Check connection and compliance status
|
|
545
|
+
heartbeat Send a single heartbeat with system metrics
|
|
546
|
+
|
|
547
|
+
${COLORS.bold}Setup:${COLORS.reset}
|
|
548
|
+
npx @arkna/sdk init
|
|
549
|
+
npx @arkna/sdk init --token intk_... --url https://api.arkna.com.au
|
|
550
|
+
|
|
551
|
+
${COLORS.bold}Options:${COLORS.reset}
|
|
552
|
+
--token Gateway integration token
|
|
553
|
+
--url Gateway URL (default: https://api.arkna.com.au)
|
|
554
|
+
--name Agent name (default: directory name)
|
|
555
|
+
-y Non-interactive mode
|
|
556
|
+
|
|
557
|
+
${COLORS.bold}Docs:${COLORS.reset} https://docs.arkna.com.au/sdk
|
|
558
|
+
`);
|
|
559
|
+
if (cmd)
|
|
560
|
+
process.exit(1);
|
|
561
|
+
}
|
|
562
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;;;;;;;GAgBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAE7B,mDAAqC;AACrC,iDAAyC;AAEzC,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,UAAU;IACf,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF,SAAS,GAAG,CAAC,GAAW,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC/C,SAAS,EAAE,CAAC,GAAW,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3E,SAAS,IAAI,CAAC,GAAW,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9E,SAAS,IAAI,CAAC,GAAW,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3E,SAAS,IAAI,CAAC,GAAW,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,KAAK,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3E,SAAS,OAAO,CAAC,GAAW,IAAI,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AAE/E,SAAS,MAAM,CAAC,QAAgB;IAC9B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AAC3B,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,cAAc,EAAE;QAAE,OAAO,UAAU,CAAC;IACxC,IAAI,CAAC;QACH,oCAAoC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;QAC7D,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC;YAAE,OAAO,QAAQ,CAAC;QAC3D,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC;YAAE,OAAO,WAAW,CAAC;QACrE,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC;YAAE,OAAO,SAAS,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,SAAS,4BAA4B;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IAChF,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,2BAA2B,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAQ,CAAC;IACjE,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAEhD,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IACvD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAE1E,oEAAoE;IACpE,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC;QAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrE,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAErC,iCAAiC;IACjC,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC;IAC1B,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC;IAEpB,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAE/D,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IACjE,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAE3D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC;AAED,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,CAAC,CAAC;IAER,aAAa;IACb,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,GAAG,GAAG,0BAA0B,CAAC;IACrC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAAC,cAAc,GAAG,IAAI,CAAC;QAAC,CAAC;QACvF,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAAC,CAAC;QAC5D,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAAC,CAAC;QAC9D,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,mBAAmB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAAC,cAAc,GAAG,IAAI,CAAC;QAAC,CAAC;IACrF,CAAC;IAED,0BAA0B;IAC1B,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAElC,sCAAsC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE5C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QAC9E,IAAI,aAAa,EAAE,CAAC;YAClB,EAAE,CAAC,4BAA4B,CAAC,CAAC;YACjC,IAAI,CAAC,KAAK;gBAAE,KAAK,GAAG,aAAa,CAAC;YAClC,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YAClE,IAAI,WAAW,IAAI,CAAC,GAAG;gBAAE,GAAG,GAAG,WAAW,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;QAC9B,GAAG,CAAC,gFAAgF,CAAC,CAAC;QACtF,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,MAAM,CAAC,IAAI,iBAAiB,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,CAAC,kEAAkE,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,cAAc,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,MAAM,CAAC,IAAI,cAAc,MAAM,CAAC,KAAK,KAAK,GAAG,KAAK,CAAC,CAAC;QACxF,IAAI,SAAS;YAAE,GAAG,GAAG,SAAS,CAAC;IACjC,CAAC;IAED,oBAAoB;IACpB,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,gDAAgD;IAChD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACxD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,yBAAyB,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,UAAU,GAAG;;sBAEC,KAAK;YACf,GAAG;CACd,CAAC;IACA,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACtC,EAAE,CAAC,qBAAqB,CAAC,CAAC;IAE1B,yBAAyB;IACzB,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAEjC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,KAAK,MAAM,CAAC,IAAI,aAAa,MAAM,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC;YACzF,IAAI,UAAU;gBAAE,IAAI,GAAG,UAAU,CAAC;QACpC,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,cAAc,CAAC;IAExD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,WAAW,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC7E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;YAC1F,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,EAAS,CAAC;YACxC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,EAAE,CAAC;YACxD,EAAE,CAAC,kBAAkB,IAAI,MAAM,QAAQ,GAAG,CAAC,CAAC;YAC5C,IAAI,OAAO;gBAAE,IAAI,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAQ,CAAC;YAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC3B,EAAE,CAAC,0BAA0B,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,iBAAiB,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,qCAAqC,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,CAAC,4BAA4B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,0DAA0D,CAAC,CAAC;IACnE,CAAC;IAED,oCAAoC;IACpC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAElC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,aAAa,EAAE;YACnD,OAAO,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE;YACzC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,EAAS,CAAC;YACxC,IAAI,GAAG,CAAC,mBAAmB,EAAE,CAAC;gBAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;gBAC5D,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACjF,EAAE,CAAC,gCAAgC,GAAG,CAAC,mBAAmB,CAAC,gBAAgB,QAAQ,CAAC,CAAC;gBACrF,IAAI,CAAC,qBAAqB,GAAG,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;YACrF,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,qCAAqC,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,+DAA+D,CAAC,CAAC;IACxE,CAAC;IAED,2CAA2C;IAC3C,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAElC,IAAI,cAAc,EAAE,EAAE,CAAC;QACrB,EAAE,CAAC,mBAAmB,CAAC,CAAC;QAExB,qCAAqC;QACrC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAA,wBAAQ,EAAC,iCAAiC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YACrF,IAAI,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC1C,EAAE,CAAC,wCAAwC,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,oCAAoC,CAAC,CAAC;gBAC3C,IAAI,CAAC;oBACH,6DAA6D;oBAC7D,IAAA,wBAAQ,EAAC,yDAAyD,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;oBACvF,EAAE,CAAC,gCAAgC,CAAC,CAAC;gBACvC,CAAC;gBAAC,MAAM,CAAC;oBACP,mCAAmC;oBACnC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAC;oBACjF,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;wBACvD,IAAI,CAAC;4BACH,IAAA,wBAAQ,EAAC,iCAAiC,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;4BAC9E,EAAE,CAAC,6CAA6C,CAAC,CAAC;wBACpD,CAAC;wBAAC,MAAM,CAAC;4BACP,IAAI,CAAC,wFAAwF,CAAC,CAAC;wBACjG,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,wFAAwF,CAAC,CAAC;oBACjG,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,uFAAuF,CAAC,CAAC;QAChG,CAAC;QAED,oFAAoF;QACpF,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,4BAA4B,EAAE,CAAC;YACjD,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,EAAE,CAAC,oDAAoD,CAAC,CAAC;gBACzD,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,sDAAsD,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1E,IAAI,CAAC,uFAAuF,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,6CAA6C,CAAC,CAAC;QACpD,IAAI,CAAC,EAAE,CAAC,CAAC;QACT,IAAI,CAAC,6CAA6C,CAAC,CAAC;QACpD,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAC5C,IAAI,CAAC,sDAAsD,CAAC,CAAC;QAC7D,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,CAAC;IAED,iCAAiC;IACjC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAEjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,YAAY,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC7E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE;oBACR,WAAW,EAAE,OAAO;oBACpB,QAAQ;oBACR,WAAW,EAAE,eAAe;oBAC5B,kBAAkB,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;iBAC1E;aACF,CAAC;YACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAS,CAAC;YACtC,EAAE,CAAC,mBAAmB,CAAC,CAAC;YACxB,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YACjC,IAAI,CAAC,gBAAgB,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1D,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACnB,IAAI,CAAC,0BAA0B,EAAE,CAAC,WAAW,IAAI,iBAAiB,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,0BAA0B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,CAAC,yBAAyB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO;IACP,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC5B,GAAG,CAAC,wCAAwC,CAAC,CAAC;IAC9C,GAAG,CAAC,uCAAuC,CAAC,CAAC;IAC7C,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAE/C,IAAI,cAAc,EAAE,EAAE,CAAC;QACrB,GAAG,CAAC,KAAK,MAAM,CAAC,GAAG,4CAA4C,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/E,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,2BAA2B,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,MAAM;IACnB,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAE9B,cAAc;IACd,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IACxE,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,0BAA0B,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE/G,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,CAAC,uCAAuC,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,GAAG,cAAc,CAAC;IAErC,6BAA6B;IAC7B,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,YAAY,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC7E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;YAC7E,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAS,CAAC;YACtC,EAAE,CAAC,oBAAoB,CAAC,CAAC;YACzB,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YACjC,IAAI,CAAC,gBAAgB,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAChF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,iBAAiB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,CAAC,yBAAyB,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC;IAChD,CAAC;IAED,4BAA4B;IAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;YACpE,EAAE,CAAC,eAAe,QAAQ,CAAC,gBAAgB,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,YAAY,QAAQ,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC;YACpE,IAAI,CAAC,WAAW,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,6CAA6C,CAAC,CAAC;IACtD,CAAC;IAED,4CAA4C;IAC5C,IAAI,cAAc,EAAE,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAA,wBAAQ,EAAC,iCAAiC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YACjF,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACtC,EAAE,CAAC,0BAA0B,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,iFAAiF,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,gCAAgC,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;YAChF,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAQ,CAAC;gBACjE,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACtF,MAAM,MAAM,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;gBACvD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnD,MAAM,OAAO,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;gBACvC,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC;gBAE/C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;oBACvC,EAAE,CAAC,+DAA+D,CAAC,CAAC;gBACtE,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,iCAAiC,CAAC,CAAC;oBACxC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;wBAAE,IAAI,CAAC,yBAAyB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC5E,IAAI,CAAC,UAAU;wBAAE,IAAI,CAAC,iCAAiC,CAAC,CAAC;oBACzD,IAAI,CAAC,sDAAsD,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,sCAAsC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,GAAG,CAAC,EAAE,CAAC,CAAC;AACV,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,cAAc;IACd,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IACxE,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,0BAA0B,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE/G,IAAI,CAAC,KAAK,EAAE,CAAC;QAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAElD,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAE7B,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,wBAAwB,EAAE;QACvD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC7E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,QAAQ,EAAE;gBACR,WAAW,EAAE,OAAO;gBACpB,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE;oBACN,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;oBAC3C,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC;oBAC3D,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;oBACvB,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;iBACxB;aACF;SACF,CAAC;QACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,EAAS,CAAC;QACpC,EAAE,CAAC,0BAA0B,EAAE,CAAC,QAAQ,kBAAkB,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5E,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,uBAAuB,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,0BAA0B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,OAAO;AACP,+EAA+E;AAE/E,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE7C,QAAQ,GAAG,EAAE,CAAC;IACZ,KAAK,MAAM;QACT,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM;IACR,KAAK,QAAQ;QACX,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM;IACR,KAAK,WAAW;QACd,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM;IACR;QACE,GAAG,CAAC;EACN,MAAM,CAAC,IAAI,aAAa,MAAM,CAAC,KAAK;;EAEpC,MAAM,CAAC,IAAI,YAAY,MAAM,CAAC,KAAK;;;;;EAKnC,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,KAAK;;;;EAIhC,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,KAAK;;;;;;EAMlC,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,KAAK;CAChC,CAAC,CAAC;QACC,IAAI,GAAG;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC"}
|