@zincapp/znvault-cli 4.24.1 → 4.24.3

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 (53) hide show
  1. package/dist/commands/dynamic-secrets/index.d.ts.map +1 -1
  2. package/dist/commands/dynamic-secrets/index.js +65 -2
  3. package/dist/commands/dynamic-secrets/index.js.map +1 -1
  4. package/dist/commands/dynamic-secrets/permit.d.ts +5 -0
  5. package/dist/commands/dynamic-secrets/permit.d.ts.map +1 -0
  6. package/dist/commands/dynamic-secrets/permit.js +104 -0
  7. package/dist/commands/dynamic-secrets/permit.js.map +1 -0
  8. package/dist/commands/dynamic-secrets/recovery-fence.d.ts +5 -0
  9. package/dist/commands/dynamic-secrets/recovery-fence.d.ts.map +1 -0
  10. package/dist/commands/dynamic-secrets/recovery-fence.js +84 -0
  11. package/dist/commands/dynamic-secrets/recovery-fence.js.map +1 -0
  12. package/dist/commands/dynamic-secrets/recovery-parse.d.ts +4 -0
  13. package/dist/commands/dynamic-secrets/recovery-parse.d.ts.map +1 -0
  14. package/dist/commands/dynamic-secrets/recovery-parse.js +22 -0
  15. package/dist/commands/dynamic-secrets/recovery-parse.js.map +1 -0
  16. package/dist/commands/dynamic-secrets/recovery-types.d.ts +117 -0
  17. package/dist/commands/dynamic-secrets/recovery-types.d.ts.map +1 -0
  18. package/dist/commands/dynamic-secrets/recovery-types.js +3 -0
  19. package/dist/commands/dynamic-secrets/recovery-types.js.map +1 -0
  20. package/dist/commands/dynamic-secrets/role.d.ts +2 -5
  21. package/dist/commands/dynamic-secrets/role.d.ts.map +1 -1
  22. package/dist/commands/dynamic-secrets/role.js +10 -2
  23. package/dist/commands/dynamic-secrets/role.js.map +1 -1
  24. package/dist/commands/dynamic-secrets/types.d.ts +11 -1
  25. package/dist/commands/dynamic-secrets/types.d.ts.map +1 -1
  26. package/dist/commands/mysql/index.d.ts +2 -0
  27. package/dist/commands/mysql/index.d.ts.map +1 -1
  28. package/dist/commands/mysql/index.js +70 -2
  29. package/dist/commands/mysql/index.js.map +1 -1
  30. package/dist/commands/mysql/mycnf.d.ts +2 -2
  31. package/dist/commands/mysql/mycnf.d.ts.map +1 -1
  32. package/dist/commands/mysql/mycnf.js +1 -1
  33. package/dist/commands/mysql/mycnf.js.map +1 -1
  34. package/dist/commands/mysql/permit-broker.d.ts +35 -0
  35. package/dist/commands/mysql/permit-broker.d.ts.map +1 -0
  36. package/dist/commands/mysql/permit-broker.js +365 -0
  37. package/dist/commands/mysql/permit-broker.js.map +1 -0
  38. package/dist/commands/mysql/recovery-hpke.d.ts +32 -0
  39. package/dist/commands/mysql/recovery-hpke.d.ts.map +1 -0
  40. package/dist/commands/mysql/recovery-hpke.js +311 -0
  41. package/dist/commands/mysql/recovery-hpke.js.map +1 -0
  42. package/dist/commands/mysql/run.d.ts +59 -19
  43. package/dist/commands/mysql/run.d.ts.map +1 -1
  44. package/dist/commands/mysql/run.js +399 -46
  45. package/dist/commands/mysql/run.js.map +1 -1
  46. package/dist/commands/mysql/types.d.ts +7 -0
  47. package/dist/commands/mysql/types.d.ts.map +1 -1
  48. package/dist/lib/client/http.d.ts.map +1 -1
  49. package/dist/lib/client/http.js +18 -0
  50. package/dist/lib/client/http.js.map +1 -1
  51. package/dist/lib/client/types.d.ts +6 -0
  52. package/dist/lib/client/types.d.ts.map +1 -1
  53. package/package.json +5 -1
@@ -0,0 +1,365 @@
1
+ /** Secure consumer lifecycle for `znvault mysql exec-permit`. */
2
+ import { client } from '../../lib/client.js';
3
+ import { createMyCnf } from './mycnf.js';
4
+ import { assertMysqlExecCapabilities, assertMysqlOnPath, assertSafeMysqlDatabase, inspectMysqlClient, runMysql, } from './run.js';
5
+ import { generateEphemeralRecoveryRecipient, openRecoveryCredential, } from './recovery-hpke.js';
6
+ const RETRY_DELAYS_MS = [250, 1_000, 2_000];
7
+ const OPERATION_SETTLE_TIMEOUT_MS = 120_000;
8
+ const OPERATION_POLL_DELAYS_MS = [250, 500, 1_000, 2_000];
9
+ const MAX_EXEC_PERMIT_SQL_BYTES = 16 * 1024 * 1024;
10
+ const TERMINAL_STATES = new Set([
11
+ 'REVOKED',
12
+ 'EXPIRED_REVOKED',
13
+ 'CANCELLED_NO_TARGET',
14
+ 'FAILED_NO_TARGET',
15
+ ]);
16
+ async function prepareExecPermitSql(options) {
17
+ if (options.input !== undefined) {
18
+ if (options.files && options.files.length > 0) {
19
+ throw new Error('Recovery SQL input and --file cannot be combined');
20
+ }
21
+ if (options.input.length > MAX_EXEC_PERMIT_SQL_BYTES) {
22
+ throw new Error(`Recovery SQL exceeds ${MAX_EXEC_PERMIT_SQL_BYTES} bytes`);
23
+ }
24
+ const copy = Buffer.from(options.input);
25
+ if (!copy.some(byte => byte > 0x20)) {
26
+ copy.fill(0);
27
+ throw new Error('Recovery SQL input is empty');
28
+ }
29
+ return copy;
30
+ }
31
+ if (!options.files || options.files.length === 0) {
32
+ throw new Error('znvault mysql exec-permit requires at least one --file with non-empty SQL');
33
+ }
34
+ const fs = await import('node:fs/promises');
35
+ const chunks = [];
36
+ let totalBytes = 0;
37
+ try {
38
+ for (const file of options.files) {
39
+ const handle = await fs.open(file, 'r');
40
+ let chunk;
41
+ try {
42
+ const stat = await handle.stat();
43
+ if (!stat.isFile()) {
44
+ throw new Error(`Recovery SQL source is not a regular file: ${file}`);
45
+ }
46
+ chunk = await handle.readFile();
47
+ }
48
+ finally {
49
+ await handle.close();
50
+ }
51
+ totalBytes += chunk.length;
52
+ if (totalBytes > MAX_EXEC_PERMIT_SQL_BYTES) {
53
+ throw new Error(`Recovery SQL exceeds ${MAX_EXEC_PERMIT_SQL_BYTES} bytes`);
54
+ }
55
+ chunks.push(chunk);
56
+ }
57
+ const prepared = Buffer.concat(chunks, totalBytes);
58
+ if (!prepared.some(byte => byte > 0x20)) {
59
+ prepared.fill(0);
60
+ throw new Error('Recovery SQL files contain no executable input');
61
+ }
62
+ return prepared;
63
+ }
64
+ finally {
65
+ for (const chunk of chunks)
66
+ chunk.fill(0);
67
+ }
68
+ }
69
+ function sleep(ms) {
70
+ return new Promise(resolve => setTimeout(resolve, ms));
71
+ }
72
+ function statusCode(error) {
73
+ return error?.statusCode;
74
+ }
75
+ function errorCode(error) {
76
+ return error?.errorCode;
77
+ }
78
+ function isRetryable(error) {
79
+ const status = statusCode(error);
80
+ return status === undefined || status >= 500;
81
+ }
82
+ async function retrySameRequest(request) {
83
+ let lastError;
84
+ for (let attempt = 0; attempt <= RETRY_DELAYS_MS.length; attempt++) {
85
+ try {
86
+ return await request();
87
+ }
88
+ catch (error) {
89
+ lastError = error;
90
+ if (!isRetryable(error) || attempt === RETRY_DELAYS_MS.length)
91
+ throw error;
92
+ await sleep(RETRY_DELAYS_MS[attempt] ?? 2_000);
93
+ }
94
+ }
95
+ throw lastError;
96
+ }
97
+ function operationPath(permitId, requestId) {
98
+ return `/v1/dynamic-secrets/mint-permits/${encodeURIComponent(permitId)}` +
99
+ `/operations/${encodeURIComponent(requestId)}`;
100
+ }
101
+ async function fetchCredential(permitId, requestId) {
102
+ return await retrySameRequest(async () => await client.get(`${operationPath(permitId, requestId)}/credential`));
103
+ }
104
+ async function acknowledgeCredential(permitId, requestId, envelopeSha256) {
105
+ return await retrySameRequest(async () => await client.put(`${operationPath(permitId, requestId)}/delivery-ack`, { envelopeSha256 }));
106
+ }
107
+ export async function revokePermitOperationWithRetry(permitId, requestId, reason) {
108
+ let lastError;
109
+ for (let attempt = 0; attempt <= RETRY_DELAYS_MS.length; attempt++) {
110
+ try {
111
+ return await client.put(`${operationPath(permitId, requestId)}/revoke`, {
112
+ reason,
113
+ });
114
+ }
115
+ catch (error) {
116
+ const status = statusCode(error);
117
+ let retry = isRetryable(error);
118
+ // A terminal-state race is safe. Fetch the state so the receipt is exact.
119
+ if (status === 409) {
120
+ try {
121
+ const current = await client.get(operationPath(permitId, requestId));
122
+ if (TERMINAL_STATES.has(current.state))
123
+ return current;
124
+ retry = true;
125
+ }
126
+ catch {
127
+ retry = true;
128
+ }
129
+ }
130
+ lastError = error;
131
+ if (!retry || attempt === RETRY_DELAYS_MS.length)
132
+ break;
133
+ await sleep(RETRY_DELAYS_MS[attempt] ?? 2_000);
134
+ }
135
+ }
136
+ const message = lastError instanceof Error ? lastError.message : 'unknown API failure';
137
+ console.warn(`[znvault] WARN: revoke by requestId did not complete for permit ${permitId}, ` +
138
+ `request ${requestId}. Retry with 'znvault dynasec permit revoke'. Last error: ${message}`);
139
+ return null;
140
+ }
141
+ function clearCredential(credential) {
142
+ if (!credential)
143
+ return;
144
+ credential.username = '';
145
+ credential.password = '';
146
+ credential.host = '';
147
+ credential.database = '';
148
+ credential.expiresAt = '';
149
+ credential.port = 0;
150
+ }
151
+ function assertDeliverableOperation(operation, permitId, requestId, fenceEpoch) {
152
+ if (operation.permitId !== permitId
153
+ || operation.requestId !== requestId
154
+ || operation.fenceEpoch !== fenceEpoch) {
155
+ throw new Error('Recovery operation response does not match permit, request, or fence epoch');
156
+ }
157
+ if (operation.state !== 'CONSUMED' && operation.state !== 'DELIVERED') {
158
+ throw new Error(`Recovery operation is ${operation.state}; no credential is safe to execute`);
159
+ }
160
+ }
161
+ async function waitForDeliverableOperation(initial, permitId, requestId, fenceEpoch) {
162
+ const deadline = Date.now() + OPERATION_SETTLE_TIMEOUT_MS;
163
+ let current = initial;
164
+ let poll = 0;
165
+ for (;;) {
166
+ if (current.permitId !== permitId
167
+ || current.requestId !== requestId
168
+ || current.fenceEpoch !== fenceEpoch) {
169
+ throw new Error('Recovery operation response does not match permit, request, or fence epoch');
170
+ }
171
+ if (current.state === 'CONSUMED' || current.state === 'DELIVERED')
172
+ return current;
173
+ if (TERMINAL_STATES.has(current.state) || current.state === 'RECOVERY_REQUIRED') {
174
+ throw new Error(`Recovery operation reached ${current.state}; no credential is safe to execute`);
175
+ }
176
+ if (Date.now() >= deadline) {
177
+ throw new Error(`Recovery operation remained ${current.state} for ${OPERATION_SETTLE_TIMEOUT_MS}ms`);
178
+ }
179
+ await sleep(OPERATION_POLL_DELAYS_MS[Math.min(poll, OPERATION_POLL_DELAYS_MS.length - 1)]);
180
+ poll++;
181
+ current = await retrySameRequest(async () => await client.get(operationPath(permitId, requestId)));
182
+ }
183
+ }
184
+ /**
185
+ * Consume, decrypt, ACK, execute, and revoke one one-shot recovery permit.
186
+ * Password material exists only in the HPKE plaintext buffer/object and an
187
+ * already-unlinked my.cnf inode inherited by the mysql child.
188
+ */
189
+ export async function runExecPermit(options) {
190
+ // Recovery phases have fixed execution semantics. In particular --force,
191
+ // --one-database, --safe-updates, --reconnect and --wait could omit failed
192
+ // statements or turn a partial phase into exit 0. Public exec-permit exposes
193
+ // no passthrough, and internal callers are rejected before recipient
194
+ // generation or any one-shot consume request.
195
+ if (options.passthrough !== undefined && options.passthrough.length > 0) {
196
+ throw new Error('Recovery exec-permit does not accept mysql passthrough flags; ' +
197
+ 'phase execution semantics are fixed.');
198
+ }
199
+ const recipient = await generateEphemeralRecoveryRecipient();
200
+ const consumeBody = Object.freeze({
201
+ fenceEpoch: options.fenceEpoch,
202
+ recipientKeyId: recipient.recipientKeyId,
203
+ recipientPublicKey: recipient.recipientPublicKey,
204
+ deliveryFormat: 'hpke-v1',
205
+ });
206
+ let cleanupArmed = false;
207
+ let cleanupPromise;
208
+ let operation;
209
+ let delivery;
210
+ let credential;
211
+ let cnf;
212
+ let sqlInput;
213
+ let revokeState = 'RECOVERY_REQUIRED';
214
+ const cleanup = (reason) => {
215
+ cleanupPromise ??= (async () => {
216
+ cnf?.cleanup();
217
+ clearCredential(credential);
218
+ if (!cleanupArmed)
219
+ return true;
220
+ const revoked = await revokePermitOperationWithRetry(options.permitId, options.requestId, reason);
221
+ if (revoked) {
222
+ revokeState = revoked.state;
223
+ return TERMINAL_STATES.has(revoked.state);
224
+ }
225
+ return false;
226
+ })();
227
+ return cleanupPromise;
228
+ };
229
+ const onSignal = (exitCode) => () => {
230
+ void (async () => {
231
+ await cleanup('znvault_mysql_exec_permit_signal');
232
+ process.exit(exitCode);
233
+ })();
234
+ };
235
+ const onSIGINT = onSignal(130);
236
+ const onSIGTERM = onSignal(143);
237
+ const onSIGHUP = onSignal(129);
238
+ const onUncaughtException = () => {
239
+ console.error('[znvault] Recovery mysql execution aborted by an uncaught exception');
240
+ void (async () => {
241
+ await cleanup('znvault_mysql_exec_permit_uncaught_exception');
242
+ process.exit(1);
243
+ })();
244
+ };
245
+ process.once('SIGINT', onSIGINT);
246
+ process.once('SIGTERM', onSIGTERM);
247
+ process.once('SIGHUP', onSIGHUP);
248
+ process.once('uncaughtException', onUncaughtException);
249
+ try {
250
+ // Prove option-file isolation before consuming the one-shot permit. The
251
+ // test/custom runner path deliberately skips probing a workstation binary.
252
+ if (options.run === undefined) {
253
+ assertMysqlExecCapabilities(inspectMysqlClient(assertMysqlOnPath()));
254
+ }
255
+ // Validate and freeze the exact SQL bytes before the one-shot server-side
256
+ // consume. Missing, unreadable or empty files therefore make zero API calls.
257
+ sqlInput = await prepareExecPermitSql(options);
258
+ cleanupArmed = true;
259
+ const consumeAttempt = { hadUncertainFailure: false };
260
+ try {
261
+ operation = await retrySameRequest(async () => {
262
+ try {
263
+ return await client.put(operationPath(options.permitId, options.requestId), consumeBody);
264
+ }
265
+ catch (error) {
266
+ if (isRetryable(error))
267
+ consumeAttempt.hadUncertainFailure = true;
268
+ throw error;
269
+ }
270
+ });
271
+ }
272
+ catch (error) {
273
+ // A definitive client error means the server rejected the consume before
274
+ // creating this operation. Do not burn the permit with a tombstone. The
275
+ // exception is recovery_request_id_conflict: it means this permit/request
276
+ // already exists with a different recipient key, which is exactly what a
277
+ // restarted process sees after losing its process-local HPKE private key.
278
+ // Confirm that operation through the subject-scoped GET, then leave cleanup
279
+ // armed so the finally path revokes it by requestId. For network/5xx
280
+ // ambiguity cleanup also remains armed and revoke is mandatory.
281
+ const status = statusCode(error);
282
+ if (!consumeAttempt.hadUncertainFailure
283
+ && status !== undefined
284
+ && status >= 400
285
+ && status < 500) {
286
+ cleanupArmed = false;
287
+ if (errorCode(error) === 'recovery_request_id_conflict') {
288
+ try {
289
+ const existing = await retrySameRequest(async () => await client.get(operationPath(options.permitId, options.requestId)));
290
+ if (existing.permitId !== options.permitId
291
+ || existing.requestId !== options.requestId) {
292
+ throw new Error('Recovery operation lookup does not match the conflicted permit or request');
293
+ }
294
+ cleanupArmed = true;
295
+ }
296
+ catch (lookupError) {
297
+ const lookupStatus = statusCode(lookupError);
298
+ // Only the server's exact not-found result proves that no operation
299
+ // exists at this subject-scoped path. Authentication, validation,
300
+ // conflict, malformed and unavailable responses are ambiguous and
301
+ // therefore remain fail-closed via a revoke attempt.
302
+ cleanupArmed = !(lookupStatus === 404
303
+ && errorCode(lookupError) === 'recovery_operation_not_found');
304
+ }
305
+ }
306
+ }
307
+ throw error;
308
+ }
309
+ operation = await waitForDeliverableOperation(operation, options.permitId, options.requestId, options.fenceEpoch);
310
+ assertDeliverableOperation(operation, options.permitId, options.requestId, options.fenceEpoch);
311
+ delivery = operation.credential ?? await fetchCredential(options.permitId, options.requestId);
312
+ credential = await openRecoveryCredential({ delivery, operation, recipient });
313
+ // The database is authenticated HPKE plaintext but may originate in an old
314
+ // or compromised producer. Reject it before materialising credentials, ACK,
315
+ // or invoking mysql; the armed finally path revokes by requestId.
316
+ assertSafeMysqlDatabase(credential.database);
317
+ // Materialize the credential only into the already-unlinked option-file
318
+ // inode before ACK. If this fails, MySQL is never invoked and revoke runs.
319
+ cnf = await createMyCnf({
320
+ user: credential.username,
321
+ password: credential.password,
322
+ host: credential.host,
323
+ port: credential.port,
324
+ });
325
+ const acknowledged = await acknowledgeCredential(options.permitId, options.requestId, delivery.envelopeSha256);
326
+ if (acknowledged.state !== 'DELIVERED') {
327
+ throw new Error(`Recovery delivery ACK returned unexpected state ${acknowledged.state}`);
328
+ }
329
+ const run = options.run ?? (async (args) => await runMysql({
330
+ fd: args.fd,
331
+ fdPath: args.fdPath,
332
+ database: args.database,
333
+ mode: 'exec',
334
+ input: args.input,
335
+ }));
336
+ const mysqlExitCode = await run({
337
+ fd: cnf.fd,
338
+ fdPath: cnf.fdPath,
339
+ database: credential.database,
340
+ input: sqlInput,
341
+ });
342
+ const revoked = await cleanup('znvault_mysql_exec_permit_complete');
343
+ if (!revoked) {
344
+ throw new Error('MySQL completed, but revoke by requestId is not proven; run dynasec permit revoke immediately');
345
+ }
346
+ return {
347
+ permitId: options.permitId,
348
+ requestId: options.requestId,
349
+ operationId: operation.operationId,
350
+ deliveryState: 'DELIVERED',
351
+ mysqlExitCode,
352
+ revokeState,
353
+ envelopeSha256: delivery.envelopeSha256,
354
+ };
355
+ }
356
+ finally {
357
+ process.off('SIGINT', onSIGINT);
358
+ process.off('SIGTERM', onSIGTERM);
359
+ process.off('SIGHUP', onSIGHUP);
360
+ process.off('uncaughtException', onUncaughtException);
361
+ sqlInput?.fill(0);
362
+ await cleanup('znvault_mysql_exec_permit_failure');
363
+ }
364
+ }
365
+ //# sourceMappingURL=permit-broker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permit-broker.js","sourceRoot":"","sources":["../../../src/commands/mysql/permit-broker.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAEjE,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAC,WAAW,EAAmB,MAAM,YAAY,CAAC;AACzD,OAAO,EACL,2BAA2B,EAC3B,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,QAAQ,GACT,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,kCAAkC,EAClC,sBAAsB,GAEvB,MAAM,oBAAoB,CAAC;AAM5B,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAC5C,MAAM,2BAA2B,GAAG,OAAO,CAAC;AAC5C,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAC1D,MAAM,yBAAyB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACnD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,SAAS;IACT,iBAAiB;IACjB,qBAAqB;IACrB,kBAAkB;CACnB,CAAC,CAAC;AAwBH,KAAK,UAAU,oBAAoB,CAAC,OAA0B;IAC5D,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,yBAAyB,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,wBAAwB,yBAAyB,QAAQ,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACxC,IAAI,KAAa,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;oBACnB,MAAM,IAAI,KAAK,CAAC,8CAA8C,IAAI,EAAE,CAAC,CAAC;gBACxE,CAAC;gBACD,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;YAClC,CAAC;oBAAS,CAAC;gBACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;YACD,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC;YAC3B,IAAI,UAAU,GAAG,yBAAyB,EAAE,CAAC;gBAC3C,MAAM,IAAI,KAAK,CAAC,wBAAwB,yBAAyB,QAAQ,CAAC,CAAC;YAC7E,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAYD,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAQ,KAA+B,EAAE,UAAU,CAAC;AACtD,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAQ,KAA+B,EAAE,SAAS,CAAC;AACrD,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,IAAI,GAAG,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAI,OAAyB;IAC1D,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QACnE,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,eAAe,CAAC,MAAM;gBAAE,MAAM,KAAK,CAAC;YAC3E,MAAM,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,SAAiB;IACxD,OAAO,oCAAoC,kBAAkB,CAAC,QAAQ,CAAC,EAAE;QACvE,eAAe,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;AACnD,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,QAAgB,EAChB,SAAiB;IAEjB,OAAO,MAAM,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,CACxD,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,aAAa,CACnD,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,QAAgB,EAChB,SAAiB,EACjB,cAAsB;IAEtB,OAAO,MAAM,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,CACxD,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,eAAe,EACpD,EAAC,cAAc,EAAC,CACjB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,QAAgB,EAChB,SAAiB,EACjB,MAAc;IAEd,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QACnE,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,CAAC,GAAG,CAAgB,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,SAAS,EAAE;gBACrF,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YAC/B,0EAA0E;YAC1E,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnB,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,CAAgB,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;oBACpF,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;wBAAE,OAAO,OAAO,CAAC;oBACvD,KAAK,GAAG,IAAI,CAAC;gBACf,CAAC;gBAAC,MAAM,CAAC;oBACP,KAAK,GAAG,IAAI,CAAC;gBACf,CAAC;YACH,CAAC;YACD,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,eAAe,CAAC,MAAM;gBAAE,MAAM;YACxD,MAAM,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;IACvF,OAAO,CAAC,IAAI,CACV,mEAAmE,QAAQ,IAAI;QAC/E,WAAW,SAAS,6DAA6D,OAAO,EAAE,CAC3F,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,UAAmD;IAC1E,IAAI,CAAC,UAAU;QAAE,OAAO;IACxB,UAAU,CAAC,QAAQ,GAAG,EAAE,CAAC;IACzB,UAAU,CAAC,QAAQ,GAAG,EAAE,CAAC;IACzB,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC;IACrB,UAAU,CAAC,QAAQ,GAAG,EAAE,CAAC;IACzB,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;IAC1B,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,0BAA0B,CACjC,SAAwB,EACxB,QAAgB,EAChB,SAAiB,EACjB,UAAkB;IAElB,IACE,SAAS,CAAC,QAAQ,KAAK,QAAQ;WAC5B,SAAS,CAAC,SAAS,KAAK,SAAS;WACjC,SAAS,CAAC,UAAU,KAAK,UAAU,EACtC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,SAAS,CAAC,KAAK,KAAK,UAAU,IAAI,SAAS,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CACb,yBAAyB,SAAS,CAAC,KAAK,oCAAoC,CAC7E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,OAAsB,EACtB,QAAgB,EAChB,SAAiB,EACjB,UAAkB;IAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,2BAA2B,CAAC;IAC1D,IAAI,OAAO,GAAG,OAAO,CAAC;IACtB,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,SAAS,CAAC;QACR,IACE,OAAO,CAAC,QAAQ,KAAK,QAAQ;eAC1B,OAAO,CAAC,SAAS,KAAK,SAAS;eAC/B,OAAO,CAAC,UAAU,KAAK,UAAU,EACpC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;QAChG,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,KAAK,UAAU,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW;YAAE,OAAO,OAAO,CAAC;QAClF,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,KAAK,mBAAmB,EAAE,CAAC;YAChF,MAAM,IAAI,KAAK,CACb,8BAA8B,OAAO,CAAC,KAAK,oCAAoC,CAChF,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,+BAA+B,OAAO,CAAC,KAAK,QAAQ,2BAA2B,IAAI,CACpF,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,wBAAwB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,IAAI,EAAE,CAAC;QACP,OAAO,GAAG,MAAM,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,CAC3D,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CACnC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA0B;IAC5D,yEAAyE;IACzE,2EAA2E;IAC3E,6EAA6E;IAC7E,qEAAqE;IACrE,8CAA8C;IAC9C,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CACb,gEAAgE;YAChE,sCAAsC,CACvC,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,kCAAkC,EAAE,CAAC;IAC7D,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAChC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,cAAc,EAAE,SAAS,CAAC,cAAc;QACxC,kBAAkB,EAAE,SAAS,CAAC,kBAAkB;QAChD,cAAc,EAAE,SAAkB;KACnC,CAAC,CAAC;IAEH,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,cAA4C,CAAC;IACjD,IAAI,SAAoC,CAAC;IACzC,IAAI,QAA4C,CAAC;IACjD,IAAI,UAAmD,CAAC;IACxD,IAAI,GAA4B,CAAC;IACjC,IAAI,QAA4B,CAAC;IACjC,IAAI,WAAW,GAA2B,mBAAmB,CAAC;IAE9D,MAAM,OAAO,GAAG,CAAC,MAAc,EAAoB,EAAE;QACnD,cAAc,KAAK,CAAC,KAAK,IAAI,EAAE;YAC7B,GAAG,EAAE,OAAO,EAAE,CAAC;YACf,eAAe,CAAC,UAAU,CAAC,CAAC;YAC5B,IAAI,CAAC,YAAY;gBAAE,OAAO,IAAI,CAAC;YAC/B,MAAM,OAAO,GAAG,MAAM,8BAA8B,CAClD,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,SAAS,EACjB,MAAM,CACP,CAAC;YACF,IAAI,OAAO,EAAE,CAAC;gBACZ,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;gBAC5B,OAAO,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,cAAc,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAgB,EAAE,CAAC,GAAG,EAAE;QACxD,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,OAAO,CAAC,kCAAkC,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,mBAAmB,GAAG,GAAS,EAAE;QACrC,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACrF,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,OAAO,CAAC,8CAA8C,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC;IAEF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACjC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACjC,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;IAEvD,IAAI,CAAC;QACH,wEAAwE;QACxE,2EAA2E;QAC3E,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC9B,2BAA2B,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,0EAA0E;QAC1E,6EAA6E;QAC7E,QAAQ,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC/C,YAAY,GAAG,IAAI,CAAC;QAEpB,MAAM,cAAc,GAAG,EAAC,mBAAmB,EAAE,KAAK,EAAC,CAAC;QACpD,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,gBAAgB,CAAC,KAAK,IAAI,EAAE;gBAC5C,IAAI,CAAC;oBACH,OAAO,MAAM,MAAM,CAAC,GAAG,CACrB,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,EAClD,WAAW,CACZ,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,WAAW,CAAC,KAAK,CAAC;wBAAE,cAAc,CAAC,mBAAmB,GAAG,IAAI,CAAC;oBAClE,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,yEAAyE;YACzE,wEAAwE;YACxE,0EAA0E;YAC1E,yEAAyE;YACzE,0EAA0E;YAC1E,4EAA4E;YAC5E,qEAAqE;YACrE,gEAAgE;YAChE,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YACjC,IACE,CAAC,cAAc,CAAC,mBAAmB;mBAChC,MAAM,KAAK,SAAS;mBACpB,MAAM,IAAI,GAAG;mBACb,MAAM,GAAG,GAAG,EACf,CAAC;gBACD,YAAY,GAAG,KAAK,CAAC;gBACrB,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,8BAA8B,EAAE,CAAC;oBACxD,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,CAClE,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CACnD,CAAC,CAAC;wBACH,IACE,QAAQ,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;+BACnC,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,EAC3C,CAAC;4BACD,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;wBACJ,CAAC;wBACD,YAAY,GAAG,IAAI,CAAC;oBACtB,CAAC;oBAAC,OAAO,WAAW,EAAE,CAAC;wBACrB,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;wBAC7C,oEAAoE;wBACpE,kEAAkE;wBAClE,kEAAkE;wBAClE,qDAAqD;wBACrD,YAAY,GAAG,CAAC,CACd,YAAY,KAAK,GAAG;+BACjB,SAAS,CAAC,WAAW,CAAC,KAAK,8BAA8B,CAC7D,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,SAAS,GAAG,MAAM,2BAA2B,CAC3C,SAAS,EACT,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,UAAU,CACnB,CAAC;QACF,0BAA0B,CACxB,SAAS,EACT,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,UAAU,CACnB,CAAC;QAEF,QAAQ,GAAG,SAAS,CAAC,UAAU,IAAI,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAC9F,UAAU,GAAG,MAAM,sBAAsB,CAAC,EAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAC,CAAC,CAAC;QAE5E,2EAA2E;QAC3E,4EAA4E;QAC5E,kEAAkE;QAClE,uBAAuB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE7C,wEAAwE;QACxE,2EAA2E;QAC3E,GAAG,GAAG,MAAM,WAAW,CAAC;YACtB,IAAI,EAAE,UAAU,CAAC,QAAQ;YACzB,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,IAAI,EAAE,UAAU,CAAC,IAAI;SACtB,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,MAAM,qBAAqB,CAC9C,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,SAAS,EACjB,QAAQ,CAAC,cAAc,CACxB,CAAC;QACF,IAAI,YAAY,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,mDAAmD,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3F,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE,CAAC,MAAM,QAAQ,CAAC;YACvD,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC,CAAC;QACJ,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC;YAC9B,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,oCAAoC,CAAC,CAAC;QACpE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;QACJ,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,aAAa,EAAE,WAAW;YAC1B,aAAa;YACb,WAAW;YACX,cAAc,EAAE,QAAQ,CAAC,cAAc;SACxC,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;QACtD,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,OAAO,CAAC,mCAAmC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Consumer-side HPKE for Dynamic Secrets Recovery Fence v1.
3
+ *
4
+ * The X25519 private key is a process-local CryptoKey. It is never serialized,
5
+ * written to disk, printed, placed in argv, or copied into the environment.
6
+ */
7
+ import type { MintOperation, RecoveryHpkeCredential } from '../dynamic-secrets/recovery-types.js';
8
+ declare const CREDENTIAL_SCHEMA = "znvault.dynsec.recovery-credential.v1";
9
+ export interface EphemeralRecoveryRecipient {
10
+ readonly recipientPublicKey: string;
11
+ readonly recipientKeyId: string;
12
+ readonly privateKey: CryptoKey;
13
+ }
14
+ export interface RecoveryCredentialPlaintext {
15
+ schema: typeof CREDENTIAL_SCHEMA;
16
+ version: 1;
17
+ username: string;
18
+ password: string;
19
+ host: string;
20
+ port: number;
21
+ database: string;
22
+ expiresAt: string;
23
+ }
24
+ export declare function canonicalJsonBytes(value: unknown): Buffer;
25
+ export declare function generateEphemeralRecoveryRecipient(): Promise<EphemeralRecoveryRecipient>;
26
+ export declare function openRecoveryCredential(input: {
27
+ delivery: RecoveryHpkeCredential;
28
+ operation: MintOperation;
29
+ recipient: EphemeralRecoveryRecipient;
30
+ }): Promise<RecoveryCredentialPlaintext>;
31
+ export {};
32
+ //# sourceMappingURL=recovery-hpke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-hpke.d.ts","sourceRoot":"","sources":["../../../src/commands/mysql/recovery-hpke.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EACV,aAAa,EACb,sBAAsB,EAGvB,MAAM,sCAAsC,CAAC;AAM9C,QAAA,MAAM,iBAAiB,0CAA0C,CAAC;AAOlE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;CAChC;AAYD,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,OAAO,iBAAiB,CAAC;IACjC,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAmDD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEzD;AAoMD,wBAAsB,kCAAkC,IAAI,OAAO,CAAC,0BAA0B,CAAC,CAmB9F;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAClD,QAAQ,EAAE,sBAAsB,CAAC;IACjC,SAAS,EAAE,aAAa,CAAC;IACzB,SAAS,EAAE,0BAA0B,CAAC;CACvC,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAqEvC"}