@zincapp/zn-vault-agent 1.3.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.
Files changed (88) hide show
  1. package/README.md +701 -0
  2. package/deploy/logrotate.d/zn-vault-agent +14 -0
  3. package/deploy/systemd/zn-vault-agent.service +75 -0
  4. package/dist/commands/certs.d.ts +3 -0
  5. package/dist/commands/certs.d.ts.map +1 -0
  6. package/dist/commands/certs.js +369 -0
  7. package/dist/commands/certs.js.map +1 -0
  8. package/dist/commands/exec.d.ts +3 -0
  9. package/dist/commands/exec.d.ts.map +1 -0
  10. package/dist/commands/exec.js +193 -0
  11. package/dist/commands/exec.js.map +1 -0
  12. package/dist/commands/login.d.ts +3 -0
  13. package/dist/commands/login.d.ts.map +1 -0
  14. package/dist/commands/login.js +234 -0
  15. package/dist/commands/login.js.map +1 -0
  16. package/dist/commands/secrets.d.ts +3 -0
  17. package/dist/commands/secrets.d.ts.map +1 -0
  18. package/dist/commands/secrets.js +445 -0
  19. package/dist/commands/secrets.js.map +1 -0
  20. package/dist/commands/setup.d.ts +9 -0
  21. package/dist/commands/setup.d.ts.map +1 -0
  22. package/dist/commands/setup.js +346 -0
  23. package/dist/commands/setup.js.map +1 -0
  24. package/dist/commands/start.d.ts +3 -0
  25. package/dist/commands/start.d.ts.map +1 -0
  26. package/dist/commands/start.js +113 -0
  27. package/dist/commands/start.js.map +1 -0
  28. package/dist/commands/status.d.ts +3 -0
  29. package/dist/commands/status.d.ts.map +1 -0
  30. package/dist/commands/status.js +85 -0
  31. package/dist/commands/status.js.map +1 -0
  32. package/dist/commands/sync.d.ts +3 -0
  33. package/dist/commands/sync.d.ts.map +1 -0
  34. package/dist/commands/sync.js +126 -0
  35. package/dist/commands/sync.js.map +1 -0
  36. package/dist/index.d.ts +3 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +28 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/lib/api.d.ts +104 -0
  41. package/dist/lib/api.d.ts.map +1 -0
  42. package/dist/lib/api.js +338 -0
  43. package/dist/lib/api.js.map +1 -0
  44. package/dist/lib/config.d.ts +164 -0
  45. package/dist/lib/config.d.ts.map +1 -0
  46. package/dist/lib/config.js +299 -0
  47. package/dist/lib/config.js.map +1 -0
  48. package/dist/lib/deployer.d.ts +22 -0
  49. package/dist/lib/deployer.d.ts.map +1 -0
  50. package/dist/lib/deployer.js +407 -0
  51. package/dist/lib/deployer.js.map +1 -0
  52. package/dist/lib/health.d.ts +68 -0
  53. package/dist/lib/health.d.ts.map +1 -0
  54. package/dist/lib/health.js +216 -0
  55. package/dist/lib/health.js.map +1 -0
  56. package/dist/lib/logger.d.ts +38 -0
  57. package/dist/lib/logger.d.ts.map +1 -0
  58. package/dist/lib/logger.js +161 -0
  59. package/dist/lib/logger.js.map +1 -0
  60. package/dist/lib/metrics.d.ts +50 -0
  61. package/dist/lib/metrics.d.ts.map +1 -0
  62. package/dist/lib/metrics.js +273 -0
  63. package/dist/lib/metrics.js.map +1 -0
  64. package/dist/lib/secret-deployer.d.ts +22 -0
  65. package/dist/lib/secret-deployer.d.ts.map +1 -0
  66. package/dist/lib/secret-deployer.js +201 -0
  67. package/dist/lib/secret-deployer.js.map +1 -0
  68. package/dist/lib/validation.d.ts +25 -0
  69. package/dist/lib/validation.d.ts.map +1 -0
  70. package/dist/lib/validation.js +257 -0
  71. package/dist/lib/validation.js.map +1 -0
  72. package/dist/lib/websocket.d.ts +74 -0
  73. package/dist/lib/websocket.d.ts.map +1 -0
  74. package/dist/lib/websocket.js +441 -0
  75. package/dist/lib/websocket.js.map +1 -0
  76. package/dist/services/api-key-renewal.d.ts +13 -0
  77. package/dist/services/api-key-renewal.d.ts.map +1 -0
  78. package/dist/services/api-key-renewal.js +204 -0
  79. package/dist/services/api-key-renewal.js.map +1 -0
  80. package/dist/services/npm-auto-update.d.ts +60 -0
  81. package/dist/services/npm-auto-update.d.ts.map +1 -0
  82. package/dist/services/npm-auto-update.js +245 -0
  83. package/dist/services/npm-auto-update.js.map +1 -0
  84. package/dist/types/update.d.ts +19 -0
  85. package/dist/types/update.d.ts.map +1 -0
  86. package/dist/types/update.js +7 -0
  87. package/dist/types/update.js.map +1 -0
  88. package/package.json +74 -0
@@ -0,0 +1,407 @@
1
+ // Path: src/lib/deployer.ts
2
+ // Certificate deployment with atomic writes and verification
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import crypto from 'node:crypto';
6
+ import { execSync } from 'node:child_process';
7
+ import os from 'node:os';
8
+ import { decryptCertificate, getCertificate, ackDelivery } from './api.js';
9
+ import { updateTargetFingerprint, loadConfig } from './config.js';
10
+ import { deployLogger as log } from './logger.js';
11
+ import { metrics } from './metrics.js';
12
+ import { updateCertStatus } from './health.js';
13
+ /**
14
+ * Parse PEM certificate bundle into components
15
+ */
16
+ function parsePemBundle(pemData) {
17
+ const certRegex = /-----BEGIN CERTIFICATE-----[\s\S]*?-----END CERTIFICATE-----/g;
18
+ // Support all private key formats: RSA, EC, PKCS8, and encrypted
19
+ const keyRegex = /-----BEGIN (?:RSA |EC |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |ENCRYPTED )?PRIVATE KEY-----/;
20
+ const certs = pemData.match(certRegex) || [];
21
+ const keyMatch = pemData.match(keyRegex);
22
+ log.debug({
23
+ certsFound: certs.length,
24
+ hasPrivateKey: !!keyMatch,
25
+ pemLength: pemData.length,
26
+ }, 'Parsed PEM bundle');
27
+ return {
28
+ certificate: certs[0] || '',
29
+ privateKey: keyMatch ? keyMatch[0] : '',
30
+ chain: certs.slice(1),
31
+ };
32
+ }
33
+ /**
34
+ * Calculate SHA-256 hash of content
35
+ */
36
+ function hashContent(content) {
37
+ return crypto.createHash('sha256').update(content).digest('hex');
38
+ }
39
+ /**
40
+ * Write file atomically using temp file + rename
41
+ * This ensures the file is either fully written or not at all
42
+ */
43
+ function writeFileAtomic(filePath, content, mode) {
44
+ const dir = path.dirname(filePath);
45
+ const tempPath = path.join(dir, `.${path.basename(filePath)}.${process.pid}.tmp`);
46
+ // Create directory if needed
47
+ if (!fs.existsSync(dir)) {
48
+ fs.mkdirSync(dir, { recursive: true });
49
+ }
50
+ try {
51
+ // Write to temp file
52
+ fs.writeFileSync(tempPath, content, { mode });
53
+ // Atomic rename
54
+ fs.renameSync(tempPath, filePath);
55
+ }
56
+ catch (err) {
57
+ // Clean up temp file on error
58
+ try {
59
+ if (fs.existsSync(tempPath)) {
60
+ fs.unlinkSync(tempPath);
61
+ }
62
+ }
63
+ catch {
64
+ // Ignore cleanup errors
65
+ }
66
+ throw err;
67
+ }
68
+ }
69
+ /**
70
+ * Verify file was written correctly by re-reading and comparing hash
71
+ */
72
+ function verifyFile(filePath, expectedHash) {
73
+ try {
74
+ const content = fs.readFileSync(filePath, 'utf-8');
75
+ const actualHash = hashContent(content);
76
+ return actualHash === expectedHash;
77
+ }
78
+ catch {
79
+ return false;
80
+ }
81
+ }
82
+ /**
83
+ * Write file with proper ownership and permissions, using atomic write
84
+ */
85
+ function writeSecureFile(filePath, content, owner, mode) {
86
+ const fileMode = mode ? parseInt(mode, 8) : 0o600;
87
+ // Atomic write
88
+ writeFileAtomic(filePath, content, fileMode);
89
+ // Set ownership if specified and running as root
90
+ if (owner && process.getuid?.() === 0) {
91
+ const [user, group] = owner.split(':');
92
+ try {
93
+ execSync(`chown ${user}:${group || user} "${filePath}"`, { stdio: 'pipe' });
94
+ }
95
+ catch (err) {
96
+ log.warn({ filePath, owner, err }, 'Failed to set file ownership');
97
+ }
98
+ }
99
+ // Set permissions (may be different from atomic write due to umask)
100
+ if (mode) {
101
+ try {
102
+ fs.chmodSync(filePath, fileMode);
103
+ }
104
+ catch (err) {
105
+ log.warn({ filePath, mode, err }, 'Failed to set file permissions');
106
+ }
107
+ }
108
+ return { hash: hashContent(content) };
109
+ }
110
+ /**
111
+ * Backup existing files before deployment
112
+ */
113
+ function backupFiles(outputs) {
114
+ const backups = new Map();
115
+ for (const filePath of Object.values(outputs)) {
116
+ if (filePath && fs.existsSync(filePath)) {
117
+ const backupPath = `${filePath}.bak`;
118
+ try {
119
+ fs.copyFileSync(filePath, backupPath);
120
+ backups.set(filePath, backupPath);
121
+ log.debug({ original: filePath, backup: backupPath }, 'Created backup');
122
+ }
123
+ catch (err) {
124
+ log.warn({ filePath, err }, 'Failed to create backup');
125
+ }
126
+ }
127
+ }
128
+ return backups;
129
+ }
130
+ /**
131
+ * Restore files from backup
132
+ */
133
+ function restoreBackups(backups) {
134
+ for (const [original, backup] of backups) {
135
+ if (fs.existsSync(backup)) {
136
+ try {
137
+ fs.copyFileSync(backup, original);
138
+ log.info({ original, backup }, 'Restored from backup');
139
+ }
140
+ catch (err) {
141
+ log.error({ original, backup, err }, 'Failed to restore backup');
142
+ }
143
+ }
144
+ }
145
+ }
146
+ /**
147
+ * Clean up backup files after successful deployment
148
+ */
149
+ function cleanupBackups(backups) {
150
+ for (const backup of backups.values()) {
151
+ try {
152
+ if (fs.existsSync(backup)) {
153
+ fs.unlinkSync(backup);
154
+ }
155
+ }
156
+ catch {
157
+ // Ignore cleanup errors
158
+ }
159
+ }
160
+ }
161
+ /**
162
+ * Execute reload command
163
+ */
164
+ function executeReload(cmd) {
165
+ log.debug({ cmd }, 'Executing reload command');
166
+ try {
167
+ const output = execSync(cmd, { encoding: 'utf-8', timeout: 30000 });
168
+ log.info({ cmd }, 'Reload command succeeded');
169
+ return { success: true, output };
170
+ }
171
+ catch (err) {
172
+ const error = err;
173
+ const output = error.stderr || error.message || 'Unknown error';
174
+ log.error({ cmd, error: output }, 'Reload command failed');
175
+ return { success: false, output };
176
+ }
177
+ }
178
+ /**
179
+ * Execute health check command
180
+ */
181
+ function executeHealthCheck(cmd) {
182
+ log.debug({ cmd }, 'Executing health check');
183
+ try {
184
+ execSync(cmd, { encoding: 'utf-8', timeout: 10000, stdio: 'pipe' });
185
+ log.debug({ cmd }, 'Health check passed');
186
+ return true;
187
+ }
188
+ catch (err) {
189
+ log.warn({ cmd, err }, 'Health check failed');
190
+ return false;
191
+ }
192
+ }
193
+ /**
194
+ * Deploy a certificate to its target locations
195
+ */
196
+ export async function deployCertificate(target, force = false) {
197
+ const { certId, name, outputs, owner, mode, reloadCmd, healthCheckCmd } = target;
198
+ const config = loadConfig();
199
+ const startTime = Date.now();
200
+ log.info({ certId, name, force }, 'Starting certificate deployment');
201
+ try {
202
+ // Get certificate metadata to check fingerprint
203
+ const metadata = await getCertificate(certId);
204
+ // Update expiry metric
205
+ metrics.setCertExpiry(certId, name, metadata.daysUntilExpiry);
206
+ // Check if certificate has changed (unless forced)
207
+ if (!force && target.lastFingerprint === metadata.fingerprintSha256) {
208
+ const duration = Date.now() - startTime;
209
+ log.debug({ certId, name, duration }, 'Certificate unchanged, skipping');
210
+ return {
211
+ success: true,
212
+ certId,
213
+ name,
214
+ message: 'Certificate unchanged',
215
+ fingerprint: metadata.fingerprintSha256,
216
+ durationMs: duration,
217
+ };
218
+ }
219
+ // Check expiry
220
+ if (metadata.daysUntilExpiry < 0) {
221
+ const duration = Date.now() - startTime;
222
+ const message = `Certificate is EXPIRED (${Math.abs(metadata.daysUntilExpiry)} days ago)`;
223
+ log.error({ certId, name, daysExpired: Math.abs(metadata.daysUntilExpiry) }, message);
224
+ metrics.syncFailure(name, 'expired');
225
+ return {
226
+ success: false,
227
+ certId,
228
+ name,
229
+ message,
230
+ durationMs: duration,
231
+ };
232
+ }
233
+ // Decrypt certificate
234
+ const decrypted = await decryptCertificate(certId, `Agent sync to ${os.hostname()}`);
235
+ // Decode from base64
236
+ const pemData = Buffer.from(decrypted.certificateData, 'base64').toString('utf-8');
237
+ // Parse PEM bundle
238
+ const { certificate, privateKey, chain } = parsePemBundle(pemData);
239
+ if (!certificate) {
240
+ throw new Error('No certificate found in PEM data');
241
+ }
242
+ // Backup existing files
243
+ const backups = backupFiles(outputs);
244
+ const filesWritten = [];
245
+ const fileHashes = new Map();
246
+ try {
247
+ // Write files based on output configuration
248
+ if (outputs.combined) {
249
+ const combined = [certificate, privateKey, ...chain].filter(Boolean).join('\n');
250
+ const { hash } = writeSecureFile(outputs.combined, combined, owner, mode);
251
+ fileHashes.set(outputs.combined, hash);
252
+ filesWritten.push(outputs.combined);
253
+ }
254
+ if (outputs.cert) {
255
+ const { hash } = writeSecureFile(outputs.cert, certificate, owner, mode);
256
+ fileHashes.set(outputs.cert, hash);
257
+ filesWritten.push(outputs.cert);
258
+ }
259
+ if (outputs.key) {
260
+ if (privateKey) {
261
+ const { hash } = writeSecureFile(outputs.key, privateKey, owner, mode || '0600');
262
+ fileHashes.set(outputs.key, hash);
263
+ filesWritten.push(outputs.key);
264
+ }
265
+ else {
266
+ log.warn({
267
+ certId,
268
+ name,
269
+ keyPath: outputs.key,
270
+ }, 'Private key output configured but certificate has no private key - was the key included when storing?');
271
+ }
272
+ }
273
+ if (outputs.chain && chain.length > 0) {
274
+ const chainContent = chain.join('\n');
275
+ const { hash } = writeSecureFile(outputs.chain, chainContent, owner, mode);
276
+ fileHashes.set(outputs.chain, hash);
277
+ filesWritten.push(outputs.chain);
278
+ }
279
+ if (outputs.fullchain) {
280
+ const fullchain = [certificate, ...chain].filter(Boolean).join('\n');
281
+ const { hash } = writeSecureFile(outputs.fullchain, fullchain, owner, mode);
282
+ fileHashes.set(outputs.fullchain, hash);
283
+ filesWritten.push(outputs.fullchain);
284
+ }
285
+ // Verify all written files
286
+ for (const [filePath, expectedHash] of fileHashes) {
287
+ if (!verifyFile(filePath, expectedHash)) {
288
+ throw new Error(`File verification failed for ${filePath}`);
289
+ }
290
+ }
291
+ log.debug({ files: filesWritten.length }, 'All files written and verified');
292
+ // Execute reload command
293
+ const reloadCommand = reloadCmd || config.globalReloadCmd;
294
+ let reloadOutput;
295
+ if (reloadCommand) {
296
+ const result = executeReload(reloadCommand);
297
+ reloadOutput = result.output;
298
+ if (!result.success) {
299
+ // Reload failed, rollback
300
+ log.warn({ certId, name }, 'Reload failed, rolling back');
301
+ restoreBackups(backups);
302
+ if (reloadCommand) {
303
+ executeReload(reloadCommand); // Try to reload with old certs
304
+ }
305
+ metrics.syncFailure(name, 'reload_failed');
306
+ return {
307
+ success: false,
308
+ certId,
309
+ name,
310
+ message: `Reload failed: ${result.output}`,
311
+ rolledBack: true,
312
+ durationMs: Date.now() - startTime,
313
+ };
314
+ }
315
+ }
316
+ // Execute health check
317
+ let healthCheckPassed;
318
+ if (healthCheckCmd) {
319
+ healthCheckPassed = executeHealthCheck(healthCheckCmd);
320
+ if (!healthCheckPassed) {
321
+ // Health check failed, rollback
322
+ log.warn({ certId, name }, 'Health check failed, rolling back');
323
+ restoreBackups(backups);
324
+ if (reloadCommand) {
325
+ executeReload(reloadCommand); // Reload with old certs
326
+ }
327
+ metrics.syncFailure(name, 'health_check_failed');
328
+ return {
329
+ success: false,
330
+ certId,
331
+ name,
332
+ message: 'Health check failed after deployment',
333
+ rolledBack: true,
334
+ durationMs: Date.now() - startTime,
335
+ };
336
+ }
337
+ }
338
+ // Update fingerprint in config
339
+ updateTargetFingerprint(certId, metadata.fingerprintSha256);
340
+ // Acknowledge delivery to server
341
+ await ackDelivery(certId, os.hostname(), metadata.version);
342
+ // Clean up backups after successful deployment
343
+ cleanupBackups(backups);
344
+ const duration = Date.now() - startTime;
345
+ const message = `Deployed v${metadata.version} (expires in ${metadata.daysUntilExpiry}d)`;
346
+ log.info({ certId, name, version: metadata.version, expiresIn: metadata.daysUntilExpiry, duration }, message);
347
+ metrics.syncSuccess(name);
348
+ metrics.syncDuration(name, duration);
349
+ return {
350
+ success: true,
351
+ certId,
352
+ name,
353
+ message,
354
+ fingerprint: metadata.fingerprintSha256,
355
+ filesWritten,
356
+ reloadOutput,
357
+ healthCheckPassed,
358
+ durationMs: duration,
359
+ };
360
+ }
361
+ catch (deployErr) {
362
+ // Deployment failed, try to rollback
363
+ log.error({ certId, name, err: deployErr }, 'Deployment failed, rolling back');
364
+ restoreBackups(backups);
365
+ throw deployErr;
366
+ }
367
+ }
368
+ catch (err) {
369
+ const duration = Date.now() - startTime;
370
+ const message = err instanceof Error ? err.message : String(err);
371
+ log.error({ certId, name, err, duration }, 'Certificate deployment failed');
372
+ metrics.syncFailure(name, 'error');
373
+ return {
374
+ success: false,
375
+ certId,
376
+ name,
377
+ message,
378
+ durationMs: duration,
379
+ };
380
+ }
381
+ }
382
+ /**
383
+ * Deploy all configured certificate targets
384
+ */
385
+ export async function deployAllCertificates(force = false) {
386
+ const config = loadConfig();
387
+ const results = [];
388
+ let successCount = 0;
389
+ let errorCount = 0;
390
+ log.info({ count: config.targets.length, force }, 'Deploying all certificates');
391
+ for (const target of config.targets) {
392
+ const result = await deployCertificate(target, force);
393
+ results.push(result);
394
+ if (result.success) {
395
+ successCount++;
396
+ }
397
+ else {
398
+ errorCount++;
399
+ }
400
+ }
401
+ // Update health status
402
+ updateCertStatus(successCount, errorCount);
403
+ metrics.setCertsTracked(config.targets.length);
404
+ log.info({ total: config.targets.length, success: successCount, errors: errorCount }, 'Deployment complete');
405
+ return results;
406
+ }
407
+ //# sourceMappingURL=deployer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployer.js","sourceRoot":"","sources":["../../src/lib/deployer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import http from 'node:http';
2
+ export interface HealthStatus {
3
+ status: 'healthy' | 'degraded' | 'unhealthy';
4
+ timestamp: string;
5
+ uptime: number;
6
+ version: string;
7
+ websocket: {
8
+ certificates: {
9
+ connected: boolean;
10
+ lastEvent?: string;
11
+ };
12
+ secrets: {
13
+ connected: boolean;
14
+ lastEvent?: string;
15
+ };
16
+ };
17
+ vault: {
18
+ url: string;
19
+ reachable: boolean;
20
+ };
21
+ certificates: {
22
+ total: number;
23
+ synced: number;
24
+ errors: number;
25
+ };
26
+ secrets: {
27
+ total: number;
28
+ synced: number;
29
+ errors: number;
30
+ };
31
+ }
32
+ /**
33
+ * Update WebSocket connection status for certificates
34
+ */
35
+ export declare function setWebSocketStatus(connected: boolean, eventTime?: Date): void;
36
+ /**
37
+ * Update WebSocket connection status for secrets
38
+ */
39
+ export declare function setSecretWebSocketStatus(connected: boolean, eventTime?: Date): void;
40
+ /**
41
+ * Update vault reachability status
42
+ */
43
+ export declare function setVaultReachable(reachable: boolean): void;
44
+ /**
45
+ * Update certificate sync status
46
+ */
47
+ export declare function updateCertStatus(synced: number, errors: number): void;
48
+ /**
49
+ * Update secret sync status
50
+ */
51
+ export declare function updateSecretStatus(synced: number, errors: number): void;
52
+ /**
53
+ * Get current health status
54
+ */
55
+ export declare function getHealthStatus(): HealthStatus;
56
+ /**
57
+ * Start the health HTTP server
58
+ */
59
+ export declare function startHealthServer(port?: number): Promise<http.Server>;
60
+ /**
61
+ * Stop the health HTTP server
62
+ */
63
+ export declare function stopHealthServer(): Promise<void>;
64
+ /**
65
+ * Check if health server is running
66
+ */
67
+ export declare function isHealthServerRunning(): boolean;
68
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/lib/health.ts"],"names":[],"mappings":"AAGA,OAAO,IAAI,MAAM,WAAW,CAAC;AAK7B,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE;QACT,YAAY,EAAE;YAAE,SAAS,EAAE,OAAO,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACzD,OAAO,EAAE;YAAE,SAAS,EAAE,OAAO,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACrD,CAAC;IACF,KAAK,EAAE;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAcD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAK7E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAKnF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAE1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAGrE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAGvE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAoD9C;AAmED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,MAAa,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAwB3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBhD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C"}