@connexum/ai-governance 1.0.0-beta.21 → 1.0.0-beta.23
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/agent-dir-scanner.d.ts +32 -0
- package/dist/cli/agent-dir-scanner.d.ts.map +1 -1
- package/dist/cli/agent-dir-scanner.js +52 -0
- package/dist/cli/agent-dir-scanner.js.map +1 -1
- package/dist/cli/governance-md-renderer.d.ts +50 -0
- package/dist/cli/governance-md-renderer.d.ts.map +1 -0
- package/dist/cli/governance-md-renderer.js +185 -0
- package/dist/cli/governance-md-renderer.js.map +1 -0
- package/dist/cli/governance-projection-writer.d.ts +88 -0
- package/dist/cli/governance-projection-writer.d.ts.map +1 -0
- package/dist/cli/governance-projection-writer.js +291 -0
- package/dist/cli/governance-projection-writer.js.map +1 -0
- package/dist/cli/index.d.ts +85 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +343 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/per-folder-identity.d.ts +79 -0
- package/dist/cli/per-folder-identity.d.ts.map +1 -0
- package/dist/cli/per-folder-identity.js +321 -0
- package/dist/cli/per-folder-identity.js.map +1 -0
- package/dist/cli/sync.d.ts +193 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +1094 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/cli/wrap-shim-generator.d.ts +33 -0
- package/dist/cli/wrap-shim-generator.d.ts.map +1 -1
- package/dist/cli/wrap-shim-generator.js +93 -8
- package/dist/cli/wrap-shim-generator.js.map +1 -1
- package/dist/esm/cli/agent-dir-scanner.js +52 -0
- package/dist/esm/cli/agent-dir-scanner.js.map +1 -1
- package/dist/esm/cli/governance-md-renderer.js +182 -0
- package/dist/esm/cli/governance-md-renderer.js.map +1 -0
- package/dist/esm/cli/governance-projection-writer.js +253 -0
- package/dist/esm/cli/governance-projection-writer.js.map +1 -0
- package/dist/esm/cli/index.js +343 -3
- package/dist/esm/cli/index.js.map +1 -1
- package/dist/esm/cli/per-folder-identity.js +283 -0
- package/dist/esm/cli/per-folder-identity.js.map +1 -0
- package/dist/esm/cli/sync.js +1054 -0
- package/dist/esm/cli/sync.js.map +1 -0
- package/dist/esm/cli/wrap-shim-generator.js +92 -8
- package/dist/esm/cli/wrap-shim-generator.js.map +1 -1
- package/dist/esm/governance/governance-projection-canonical.js +101 -0
- package/dist/esm/governance/governance-projection-canonical.js.map +1 -0
- package/dist/governance/governance-projection-canonical.d.ts +104 -0
- package/dist/governance/governance-projection-canonical.d.ts.map +1 -0
- package/dist/governance/governance-projection-canonical.js +141 -0
- package/dist/governance/governance-projection-canonical.js.map +1 -0
- package/dist/hooks/audit-logger.sh +108 -10
- package/package.json +1 -1
- package/src/hooks/audit-logger.sh +108 -10
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Governance-projection writer — write-back RFC F2 (§3.1, §4, §10.C).
|
|
3
|
+
*
|
|
4
|
+
* The downward half of the loop: after the identity/token passes, `sync`
|
|
5
|
+
* fetches each agent's effective-governance projection from
|
|
6
|
+
* GET /api/v1/cli/agent-governance and writes
|
|
7
|
+
*
|
|
8
|
+
* <agent>/.connexum/governance.json machine-readable projection (3.1)
|
|
9
|
+
* <agent>/.connexum/GOVERNANCE.md human/LLM-readable rendering (3.2)
|
|
10
|
+
*
|
|
11
|
+
* Both files are DERIVED, REGENERABLE, SECRET-FREE — safe to commit, never
|
|
12
|
+
* hand-edited.
|
|
13
|
+
*
|
|
14
|
+
* File semantics (normative, §10.C):
|
|
15
|
+
* - All writes are atomic (temp → renameSync). No chmod — non-secret.
|
|
16
|
+
* - checksum covers the canonical POLICY body only (shared module —
|
|
17
|
+
* generatedAt/score/version/staleAfter excluded), so a score refresh or
|
|
18
|
+
* re-sync of unchanged policy never perturbs hand-edit detection.
|
|
19
|
+
* - Existing file whose stored checksum mismatches its own body ⇒ HAND-EDITED
|
|
20
|
+
* ⇒ WARN + skip, never clobber (W4). An ABSENT file (user deleted) is
|
|
21
|
+
* written fresh without WARN — absent ≠ hand-edited.
|
|
22
|
+
* - Unchanged policy (new checksum === pristine existing checksum) ⇒ skip the
|
|
23
|
+
* rewrite entirely: byte-identical files (W6) and generatedAt keeps meaning
|
|
24
|
+
* "when the policy last changed".
|
|
25
|
+
* - Fetch failure ⇒ caller never reaches the writer ⇒ prior files retained
|
|
26
|
+
* (Invariant 2 — never delete on failure).
|
|
27
|
+
*
|
|
28
|
+
* Traversal guard is REUSED from per-folder-identity.ts (Shield S-W2) — the
|
|
29
|
+
* same realpath-compared guard B1 writes identities through.
|
|
30
|
+
*
|
|
31
|
+
* @connexum/ai-governance governance-writeback-f2
|
|
32
|
+
*/
|
|
33
|
+
import * as fs from 'fs';
|
|
34
|
+
import * as path from 'path';
|
|
35
|
+
import * as crypto from 'crypto';
|
|
36
|
+
import { spawnSync } from 'child_process';
|
|
37
|
+
import { resolveGuardedAgentFolder } from './per-folder-identity.js';
|
|
38
|
+
import { pickCanonicalPolicyBody, computeProjectionChecksum, computeProjectionVersion, } from '../governance/governance-projection-canonical.js';
|
|
39
|
+
import { renderGovernanceMd } from './governance-md-renderer.js';
|
|
40
|
+
/**
|
|
41
|
+
* Fetch the batch governance projection. Same transport posture as the token
|
|
42
|
+
* fetch in sync.ts: HTTPS via curl, Authorization in a 0600 tmpfile (never on
|
|
43
|
+
* argv), NEVER throws — server unreachable returns {agents:null} and the
|
|
44
|
+
* caller leaves prior files intact (Invariant 2/3).
|
|
45
|
+
*/
|
|
46
|
+
export function fetchAgentGovernance(govServerUrl, installToken, timeoutSec = 15) {
|
|
47
|
+
const url = `${govServerUrl.replace(/\/$/, '')}/api/v1/cli/agent-governance`;
|
|
48
|
+
let authTmpFile = null;
|
|
49
|
+
try {
|
|
50
|
+
const tmpDir = process.env['TMPDIR'] || process.env['TMP'] || process.env['TEMP'] || '/tmp';
|
|
51
|
+
const tmpPath = path.join(tmpDir, `gov-proj-auth-${crypto.randomBytes(8).toString('hex')}.hdr`);
|
|
52
|
+
fs.writeFileSync(tmpPath, `Authorization: Bearer ${installToken}\n`, { mode: 0o600 });
|
|
53
|
+
try {
|
|
54
|
+
fs.chmodSync(tmpPath, 0o600);
|
|
55
|
+
}
|
|
56
|
+
catch { /* best-effort on Windows */ }
|
|
57
|
+
authTmpFile = tmpPath;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
console.warn('[gov-sync] WARNING: auth tmpfile write failed; falling back to token-on-argv (less secure). Check TMPDIR permissions.');
|
|
61
|
+
authTmpFile = null;
|
|
62
|
+
}
|
|
63
|
+
const authArgs = authTmpFile
|
|
64
|
+
? ['-H', `@${authTmpFile}`]
|
|
65
|
+
: ['-H', `Authorization: Bearer ${installToken}`];
|
|
66
|
+
try {
|
|
67
|
+
const result = spawnSync('curl', [
|
|
68
|
+
'--silent', '--show-error',
|
|
69
|
+
'--max-time', String(timeoutSec),
|
|
70
|
+
'--connect-timeout', '5',
|
|
71
|
+
'--fail-with-body',
|
|
72
|
+
...authArgs,
|
|
73
|
+
'-H', 'Accept: application/json',
|
|
74
|
+
url,
|
|
75
|
+
], { encoding: 'utf8', timeout: (timeoutSec + 5) * 1000 });
|
|
76
|
+
if (result.status !== 0) {
|
|
77
|
+
const detail = result.stderr?.trim() || `curl exit ${result.status}`;
|
|
78
|
+
return { agents: null, error: `Governance projection fetch failed: ${detail}` };
|
|
79
|
+
}
|
|
80
|
+
if (!result.stdout)
|
|
81
|
+
return { agents: null, error: 'Empty response from server.' };
|
|
82
|
+
let parsed;
|
|
83
|
+
try {
|
|
84
|
+
parsed = JSON.parse(result.stdout);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return { agents: null, error: 'Could not parse governance response as JSON.' };
|
|
88
|
+
}
|
|
89
|
+
const obj = parsed;
|
|
90
|
+
if (typeof obj?.['error'] === 'string')
|
|
91
|
+
return { agents: null, error: `Server error: ${obj['error']}` };
|
|
92
|
+
if (!Array.isArray(obj?.['agents']))
|
|
93
|
+
return { agents: null, error: 'Server response missing agents[].' };
|
|
94
|
+
const agents = [];
|
|
95
|
+
for (const a of obj['agents']) {
|
|
96
|
+
const e = a;
|
|
97
|
+
if (typeof e?.['agentId'] === 'string' &&
|
|
98
|
+
e?.['effectiveGovernance'] && typeof e['effectiveGovernance'] === 'object' &&
|
|
99
|
+
e?.['scoreSummary'] && typeof e['scoreSummary'] === 'object' &&
|
|
100
|
+
typeof e?.['projectionVersion'] === 'string') {
|
|
101
|
+
agents.push({
|
|
102
|
+
agentId: e['agentId'],
|
|
103
|
+
effectiveGovernance: e['effectiveGovernance'],
|
|
104
|
+
scoreSummary: e['scoreSummary'],
|
|
105
|
+
projectionVersion: e['projectionVersion'],
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const staleRaw = obj['staleAfterDays'];
|
|
110
|
+
return {
|
|
111
|
+
agents,
|
|
112
|
+
staleAfterDays: typeof staleRaw === 'number' && Number.isFinite(staleRaw) ? staleRaw : 7,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
return { agents: null, error: `Request failed: ${err.message}` };
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
if (authTmpFile) {
|
|
120
|
+
try {
|
|
121
|
+
fs.unlinkSync(authTmpFile);
|
|
122
|
+
}
|
|
123
|
+
catch { /* best-effort */ }
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const SCHEMA_VERSION = '1.0';
|
|
128
|
+
/** Compose the full governance.json file object for one agent (RFC §3.1). */
|
|
129
|
+
function buildFileObject(input, generatedAt, staleAfter) {
|
|
130
|
+
const policy = pickCanonicalPolicyBody({
|
|
131
|
+
...input.effectiveGovernance,
|
|
132
|
+
agentId: input.agentId,
|
|
133
|
+
});
|
|
134
|
+
const checksum = computeProjectionChecksum(policy);
|
|
135
|
+
return {
|
|
136
|
+
schemaVersion: SCHEMA_VERSION,
|
|
137
|
+
generated: true,
|
|
138
|
+
generatedAt,
|
|
139
|
+
staleAfter,
|
|
140
|
+
effectiveGovernanceVersion: input.projectionVersion,
|
|
141
|
+
...policy,
|
|
142
|
+
score: { ...input.scoreSummary },
|
|
143
|
+
checksum,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Write governance.json + GOVERNANCE.md into each agent's .connexum/ folder.
|
|
148
|
+
* Never throws (Invariant 2): every failure is a per-agent skip + advisory.
|
|
149
|
+
*/
|
|
150
|
+
export function writeGovernanceProjections(projectDir, inputs, opts = {}) {
|
|
151
|
+
const warn = opts.warn ?? ((m) => console.warn(m));
|
|
152
|
+
const result = { written: [], unchanged: [], skipped: [] };
|
|
153
|
+
if (inputs.length === 0)
|
|
154
|
+
return result;
|
|
155
|
+
const generatedAt = opts.generatedAt ?? new Date().toISOString();
|
|
156
|
+
const staleDays = Math.min(Math.max(1, Math.floor(opts.staleAfterDays ?? 7)), 30);
|
|
157
|
+
const staleAfter = new Date(Date.parse(generatedAt) + staleDays * 24 * 3600 * 1000).toISOString();
|
|
158
|
+
for (const input of inputs) {
|
|
159
|
+
// Same realpath traversal guard as B1 (Shield S-W2 reuse requirement).
|
|
160
|
+
const guarded = resolveGuardedAgentFolder(projectDir, input.filePath);
|
|
161
|
+
if (!guarded.folder) {
|
|
162
|
+
result.skipped.push({ agentId: input.agentId, reason: guarded.error ?? 'path-traversal: folder outside project root' });
|
|
163
|
+
warn(`[connexum] governance projection skipped for ${input.agentId}: resolved folder escapes project root (${input.filePath})`);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
const dir = path.join(guarded.folder, '.connexum');
|
|
168
|
+
const jsonFile = path.join(dir, 'governance.json');
|
|
169
|
+
const mdFile = path.join(dir, 'GOVERNANCE.md');
|
|
170
|
+
const fileObj = buildFileObject(input, generatedAt, staleAfter);
|
|
171
|
+
const newChecksum = fileObj['checksum'];
|
|
172
|
+
// Hand-edit / unchanged detection against the existing file (W4/W6).
|
|
173
|
+
let existingPristineChecksum = null;
|
|
174
|
+
if (fs.existsSync(jsonFile)) {
|
|
175
|
+
let handEdited = true;
|
|
176
|
+
try {
|
|
177
|
+
const existing = JSON.parse(fs.readFileSync(jsonFile, 'utf-8'));
|
|
178
|
+
const recomputed = computeProjectionChecksum(pickCanonicalPolicyBody(existing));
|
|
179
|
+
if (typeof existing['checksum'] === 'string' && existing['checksum'] === recomputed) {
|
|
180
|
+
handEdited = false;
|
|
181
|
+
existingPristineChecksum = recomputed;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// unparseable ⇒ treat as hand-edited: clobbering an operator's file
|
|
186
|
+
// is the harm the guard exists to prevent.
|
|
187
|
+
}
|
|
188
|
+
if (handEdited) {
|
|
189
|
+
result.skipped.push({ agentId: input.agentId, reason: 'hand-edited: checksum mismatch on existing governance.json' });
|
|
190
|
+
warn(`[connexum] governance.json for ${input.agentId} differs from its recorded checksum — it was edited by hand. Leaving it (and GOVERNANCE.md) untouched. Delete the file and re-run sync to regenerate.`);
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Pristine + same policy ⇒ nothing to do (byte-identical idempotency).
|
|
195
|
+
if (existingPristineChecksum === newChecksum && fs.existsSync(mdFile)) {
|
|
196
|
+
result.unchanged.push(input.agentId);
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
200
|
+
// When policy is unchanged but GOVERNANCE.md is missing, re-render from
|
|
201
|
+
// the EXISTING file's timestamps so governance.json stays byte-identical.
|
|
202
|
+
// Stern C-1 (PR #1716 review): the stored score block is OUR write, but
|
|
203
|
+
// guard its shape anyway — a malformed score falls back to the freshly
|
|
204
|
+
// fetched fileObj (json then gets rewritten, which is the safe direction).
|
|
205
|
+
let effective = fileObj;
|
|
206
|
+
if (existingPristineChecksum === newChecksum) {
|
|
207
|
+
const stored = JSON.parse(fs.readFileSync(jsonFile, 'utf-8'));
|
|
208
|
+
const storedScore = stored['score'];
|
|
209
|
+
if (storedScore && typeof storedScore['band'] === 'string' && Array.isArray(storedScore['openFindings'])) {
|
|
210
|
+
effective = stored;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (existingPristineChecksum !== newChecksum) {
|
|
214
|
+
atomicWrite(jsonFile, `${JSON.stringify(fileObj, null, 2)}\n`);
|
|
215
|
+
}
|
|
216
|
+
const md = renderGovernanceMd({
|
|
217
|
+
policy: pickCanonicalPolicyBody(effective),
|
|
218
|
+
score: effective['score'],
|
|
219
|
+
generatedAt: String(effective['generatedAt']),
|
|
220
|
+
staleAfter: String(effective['staleAfter']),
|
|
221
|
+
effectiveGovernanceVersion: String(effective['effectiveGovernanceVersion']),
|
|
222
|
+
});
|
|
223
|
+
atomicWrite(mdFile, md.endsWith('\n') ? md : `${md}\n`);
|
|
224
|
+
result.written.push(input.agentId);
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
result.skipped.push({ agentId: input.agentId, reason: `write-failed: ${err.message}` });
|
|
228
|
+
warn(`[connexum] governance projection write failed for ${input.agentId}: ${err.message}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return result;
|
|
232
|
+
}
|
|
233
|
+
/** Atomic non-secret write: temp → rename (POSIX-atomic replace).
|
|
234
|
+
* Shield Condition-2 (PR #1716 review): clear any orphaned .tmp left by a
|
|
235
|
+
* crash between write and rename on a prior run, so .connexum/ never
|
|
236
|
+
* accumulates stale files an operator could mistake for current data. */
|
|
237
|
+
function atomicWrite(file, content) {
|
|
238
|
+
const tmp = `${file}.tmp`;
|
|
239
|
+
try {
|
|
240
|
+
fs.unlinkSync(tmp);
|
|
241
|
+
}
|
|
242
|
+
catch { /* no orphan */ }
|
|
243
|
+
fs.writeFileSync(tmp, content);
|
|
244
|
+
fs.renameSync(tmp, file);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Sanity re-export so callers can verify a projection version locally without
|
|
248
|
+
* importing the canonical module path directly.
|
|
249
|
+
*/
|
|
250
|
+
export function computeLocalProjectionVersion(policy) {
|
|
251
|
+
return computeProjectionVersion(policy);
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=governance-projection-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governance-projection-writer.js","sourceRoot":"","sources":["../../../src/cli/governance-projection-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,GAEzB,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAA2B,MAAM,6BAA6B,CAAC;AAgB1F;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,YAAoB,EACpB,YAAoB,EACpB,UAAU,GAAG,EAAE;IAEf,MAAM,GAAG,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,8BAA8B,CAAC;IAE7E,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;QAC5F,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChG,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,yBAAyB,YAAY,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACtF,IAAI,CAAC;YAAC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,4BAA4B,CAAC,CAAC;QAC5E,WAAW,GAAG,OAAO,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,uHAAuH,CAAC,CAAC;QACtI,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,MAAM,QAAQ,GAAa,WAAW;QACpC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC,IAAI,EAAE,yBAAyB,YAAY,EAAE,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CACtB,MAAM,EACN;YACE,UAAU,EAAE,cAAc;YAC1B,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC;YAChC,mBAAmB,EAAE,GAAG;YACxB,kBAAkB;YAClB,GAAG,QAAQ;YACX,IAAI,EAAE,0BAA0B;YAChC,GAAG;SACJ,EACD,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,CACvD,CAAC;QAEF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC;YACrE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,uCAAuC,MAAM,EAAE,EAAE,CAAC;QAClF,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;QAElF,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QAC3C,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,8CAA8C,EAAE,CAAC;QAAC,CAAC;QAEzF,MAAM,GAAG,GAAG,MAAiC,CAAC;QAC9C,IAAI,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QACxG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC;QAEzG,MAAM,MAAM,GAA6B,EAAE,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAc,EAAE,CAAC;YAC3C,MAAM,CAAC,GAAG,CAA4B,CAAC;YACvC,IACE,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,QAAQ;gBAClC,CAAC,EAAE,CAAC,qBAAqB,CAAC,IAAI,OAAO,CAAC,CAAC,qBAAqB,CAAC,KAAK,QAAQ;gBAC1E,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,CAAC,cAAc,CAAC,KAAK,QAAQ;gBAC5D,OAAO,CAAC,EAAE,CAAC,mBAAmB,CAAC,KAAK,QAAQ,EAC5C,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC;oBACV,OAAO,EAAE,CAAC,CAAC,SAAS,CAAW;oBAC/B,mBAAmB,EAAE,CAAC,CAAC,qBAAqB,CAAyB;oBACrE,YAAY,EAAE,CAAC,CAAC,cAAc,CAAuB;oBACrD,iBAAiB,EAAE,CAAC,CAAC,mBAAmB,CAAW;iBACpD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACvC,OAAO;YACL,MAAM;YACN,cAAc,EAAE,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;SACzF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,mBAAoB,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;IAC9E,CAAC;YAAS,CAAC;QACT,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC;gBAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC;AA0BD,MAAM,cAAc,GAAG,KAAK,CAAC;AAE7B,6EAA6E;AAC7E,SAAS,eAAe,CACtB,KAAoC,EACpC,WAAmB,EACnB,UAAkB;IAElB,MAAM,MAAM,GAAG,uBAAuB,CAAC;QACrC,GAAI,KAAK,CAAC,mBAA0D;QACpE,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IACnD,OAAO;QACL,aAAa,EAAE,cAAc;QAC7B,SAAS,EAAE,IAAI;QACf,WAAW;QACX,UAAU;QACV,0BAA0B,EAAE,KAAK,CAAC,iBAAiB;QACnD,GAAI,MAA6C;QACjD,KAAK,EAAE,EAAE,GAAI,KAAK,CAAC,YAAmD,EAAE;QACxE,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,UAAkB,EAClB,MAAuC,EACvC,OAA0C,EAAE;IAE5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAqC,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC7F,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAEvC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClF,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,SAAS,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAElG,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,uEAAuE;QACvE,MAAM,OAAO,GAAG,yBAAyB,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,6CAA6C,EAAE,CAAC,CAAC;YACxH,IAAI,CAAC,gDAAgD,KAAK,CAAC,OAAO,2CAA2C,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;YAChI,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YAChE,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAW,CAAC;YAElD,qEAAqE;YACrE,IAAI,wBAAwB,GAAkB,IAAI,CAAC;YACnD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,IAAI,UAAU,GAAG,IAAI,CAAC;gBACtB,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAA4B,CAAC;oBAC3F,MAAM,UAAU,GAAG,yBAAyB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAChF,IAAI,OAAO,QAAQ,CAAC,UAAU,CAAC,KAAK,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,UAAU,EAAE,CAAC;wBACpF,UAAU,GAAG,KAAK,CAAC;wBACnB,wBAAwB,GAAG,UAAU,CAAC;oBACxC,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,oEAAoE;oBACpE,2CAA2C;gBAC7C,CAAC;gBACD,IAAI,UAAU,EAAE,CAAC;oBACf,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,4DAA4D,EAAE,CAAC,CAAC;oBACtH,IAAI,CAAC,kCAAkC,KAAK,CAAC,OAAO,uJAAuJ,CAAC,CAAC;oBAC7M,SAAS;gBACX,CAAC;YACH,CAAC;YAED,uEAAuE;YACvE,IAAI,wBAAwB,KAAK,WAAW,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACrC,SAAS;YACX,CAAC;YAED,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvC,wEAAwE;YACxE,0EAA0E;YAC1E,wEAAwE;YACxE,uEAAuE;YACvE,2EAA2E;YAC3E,IAAI,SAAS,GAA4B,OAAO,CAAC;YACjD,IAAI,wBAAwB,KAAK,WAAW,EAAE,CAAC;gBAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAA4B,CAAC;gBACzF,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAwC,CAAC;gBAC3E,IAAI,WAAW,IAAI,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;oBACzG,SAAS,GAAG,MAAM,CAAC;gBACrB,CAAC;YACH,CAAC;YAED,IAAI,wBAAwB,KAAK,WAAW,EAAE,CAAC;gBAC7C,WAAW,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,EAAE,GAAG,kBAAkB,CAAC;gBAC5B,MAAM,EAAE,uBAAuB,CAAC,SAAS,CAAC;gBAC1C,KAAK,EAAE,SAAS,CAAC,OAAO,CAAuB;gBAC/C,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;gBAC7C,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;gBAC3C,0BAA0B,EAAE,MAAM,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;aAC5E,CAAC,CAAC;YACH,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACxD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAkB,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACnG,IAAI,CAAC,qDAAqD,KAAK,CAAC,OAAO,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACxG,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;yEAGyE;AACzE,SAAS,WAAW,CAAC,IAAY,EAAE,OAAe;IAChD,MAAM,GAAG,GAAG,GAAG,IAAI,MAAM,CAAC;IAC1B,IAAI,CAAC;QAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IACrD,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC/B,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,6BAA6B,CAAC,MAA4B;IACxE,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC"}
|