@zincapp/znvault-cli 2.26.4 → 2.29.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 (62) hide show
  1. package/dist/commands/group.d.ts +3 -0
  2. package/dist/commands/group.d.ts.map +1 -0
  3. package/dist/commands/group.js +319 -0
  4. package/dist/commands/group.js.map +1 -0
  5. package/dist/commands/host/bootstrap-token.d.ts.map +1 -1
  6. package/dist/commands/host/bootstrap-token.js +28 -10
  7. package/dist/commands/host/bootstrap-token.js.map +1 -1
  8. package/dist/commands/host/index.d.ts.map +1 -1
  9. package/dist/commands/host/index.js +4 -0
  10. package/dist/commands/host/index.js.map +1 -1
  11. package/dist/commands/host/link-agent.d.ts +26 -0
  12. package/dist/commands/host/link-agent.d.ts.map +1 -0
  13. package/dist/commands/host/link-agent.js +110 -0
  14. package/dist/commands/host/link-agent.js.map +1 -0
  15. package/dist/commands/host/types.d.ts +5 -0
  16. package/dist/commands/host/types.d.ts.map +1 -1
  17. package/dist/commands/ssh-ca/ca.d.ts +14 -0
  18. package/dist/commands/ssh-ca/ca.d.ts.map +1 -0
  19. package/dist/commands/ssh-ca/ca.js +169 -0
  20. package/dist/commands/ssh-ca/ca.js.map +1 -0
  21. package/dist/commands/ssh-ca/certificates.d.ts +7 -0
  22. package/dist/commands/ssh-ca/certificates.d.ts.map +1 -0
  23. package/dist/commands/ssh-ca/certificates.js +131 -0
  24. package/dist/commands/ssh-ca/certificates.js.map +1 -0
  25. package/dist/commands/ssh-ca/helpers.d.ts +37 -0
  26. package/dist/commands/ssh-ca/helpers.d.ts.map +1 -0
  27. package/dist/commands/ssh-ca/helpers.js +104 -0
  28. package/dist/commands/ssh-ca/helpers.js.map +1 -0
  29. package/dist/commands/ssh-ca/index.d.ts +7 -0
  30. package/dist/commands/ssh-ca/index.d.ts.map +1 -0
  31. package/dist/commands/ssh-ca/index.js +180 -0
  32. package/dist/commands/ssh-ca/index.js.map +1 -0
  33. package/dist/commands/ssh-ca/mappings.d.ts +11 -0
  34. package/dist/commands/ssh-ca/mappings.d.ts.map +1 -0
  35. package/dist/commands/ssh-ca/mappings.js +178 -0
  36. package/dist/commands/ssh-ca/mappings.js.map +1 -0
  37. package/dist/commands/ssh-ca/server-groups.d.ts +21 -0
  38. package/dist/commands/ssh-ca/server-groups.d.ts.map +1 -0
  39. package/dist/commands/ssh-ca/server-groups.js +252 -0
  40. package/dist/commands/ssh-ca/server-groups.js.map +1 -0
  41. package/dist/commands/ssh-ca/sign.d.ts +3 -0
  42. package/dist/commands/ssh-ca/sign.d.ts.map +1 -0
  43. package/dist/commands/ssh-ca/sign.js +79 -0
  44. package/dist/commands/ssh-ca/sign.js.map +1 -0
  45. package/dist/commands/ssh-ca/types.d.ts +135 -0
  46. package/dist/commands/ssh-ca/types.d.ts.map +1 -0
  47. package/dist/commands/ssh-ca/types.js +3 -0
  48. package/dist/commands/ssh-ca/types.js.map +1 -0
  49. package/dist/commands/ssh-ca.d.ts +7 -0
  50. package/dist/commands/ssh-ca.d.ts.map +1 -0
  51. package/dist/commands/ssh-ca.js +7 -0
  52. package/dist/commands/ssh-ca.js.map +1 -0
  53. package/dist/commands/ssh.d.ts +3 -0
  54. package/dist/commands/ssh.d.ts.map +1 -0
  55. package/dist/commands/ssh.js +814 -0
  56. package/dist/commands/ssh.js.map +1 -0
  57. package/dist/index.js +6 -0
  58. package/dist/index.js.map +1 -1
  59. package/dist/lib/client/tenants.d.ts.map +1 -1
  60. package/dist/lib/client/tenants.js +3 -6
  61. package/dist/lib/client/tenants.js.map +1 -1
  62. package/package.json +1 -1
@@ -0,0 +1,180 @@
1
+ // Path: src/commands/ssh-ca/index.ts
2
+ import { getStatus, initCA, deleteCA, getPublicKey } from './ca.js';
3
+ import { listMappings, createMapping, updateMapping, deleteMapping } from './mappings.js';
4
+ import { listServerGroups, getServerGroup, createServerGroup, deleteServerGroup, setAccessRule, deleteAccessRule, getAuthorizedPrincipals, } from './server-groups.js';
5
+ import { listCertificates, getCertificate, revokeCertificate } from './certificates.js';
6
+ import { signCertificate } from './sign.js';
7
+ // Re-export types
8
+ export * from './types.js';
9
+ export function registerSSHCACommands(program) {
10
+ const sshca = program
11
+ .command('ssh-ca')
12
+ .description('SSH Certificate Authority management')
13
+ .addHelpText('after', `
14
+ Examples:
15
+ # Initialize the CA
16
+ znvault ssh-ca init --key-type ed25519 --default-ttl 28800
17
+
18
+ # Get CA public key for server configuration
19
+ znvault ssh-ca public-key --raw > /etc/ssh/trusted-user-ca-keys.pub
20
+
21
+ # Create a principal mapping
22
+ znvault ssh-ca mapping create --group-id GROUP_ID --principals deploy,developer
23
+
24
+ # Create a server group and add access rules
25
+ znvault ssh-ca server-group create --name production-web
26
+ znvault ssh-ca server-group set-access GROUP_ID --linux-user deploy --principals deploy,admin
27
+
28
+ # Sign your SSH public key
29
+ znvault ssh-ca sign --file ~/.ssh/id_ed25519.pub > ~/.ssh/id_ed25519-cert.pub
30
+
31
+ # List and revoke certificates
32
+ znvault ssh-ca cert list --active-only
33
+ znvault ssh-ca cert revoke CERT_ID --reason "User offboarded"
34
+ `);
35
+ // -------------------------------------------------------------------------
36
+ // CA Commands
37
+ // -------------------------------------------------------------------------
38
+ sshca
39
+ .command('status')
40
+ .description('Get SSH CA status')
41
+ .option('--json', 'Output as JSON')
42
+ .action(getStatus);
43
+ sshca
44
+ .command('init')
45
+ .description('Initialize SSH CA')
46
+ .option('--key-type <type>', 'Key type: ed25519 or rsa-4096')
47
+ .option('--default-ttl <seconds>', 'Default certificate TTL in seconds')
48
+ .option('--max-ttl <seconds>', 'Maximum certificate TTL in seconds')
49
+ .option('--extensions <list>', 'Allowed extensions (comma-separated)')
50
+ .option('--json', 'Output as JSON')
51
+ .action(initCA);
52
+ sshca
53
+ .command('delete')
54
+ .description('Delete SSH CA (destructive!)')
55
+ .option('--force', 'Skip confirmation')
56
+ .option('--json', 'Output as JSON')
57
+ .action(deleteCA);
58
+ sshca
59
+ .command('public-key')
60
+ .description('Get CA public key')
61
+ .option('--raw', 'Output only the key (for piping to file)')
62
+ .option('--json', 'Output as JSON')
63
+ .action(getPublicKey);
64
+ // -------------------------------------------------------------------------
65
+ // Mapping Commands
66
+ // -------------------------------------------------------------------------
67
+ const mapping = sshca.command('mapping').description('Manage principal mappings (SSO group → SSH principals)');
68
+ mapping
69
+ .command('list')
70
+ .alias('ls')
71
+ .description('List principal mappings')
72
+ .option('--json', 'Output as JSON')
73
+ .action(listMappings);
74
+ mapping
75
+ .command('create')
76
+ .description('Create a principal mapping')
77
+ .option('--group-id <id>', 'SSO group ID')
78
+ .option('--principals <list>', 'SSH principals (comma-separated)')
79
+ .option('--json', 'Output as JSON')
80
+ .action(createMapping);
81
+ mapping
82
+ .command('update <mapping-id>')
83
+ .description('Update a principal mapping')
84
+ .option('--principals <list>', 'New SSH principals (comma-separated)')
85
+ .option('--json', 'Output as JSON')
86
+ .action(updateMapping);
87
+ mapping
88
+ .command('delete <mapping-id>')
89
+ .alias('rm')
90
+ .description('Delete a principal mapping')
91
+ .option('--force', 'Skip confirmation')
92
+ .option('--json', 'Output as JSON')
93
+ .action(deleteMapping);
94
+ // -------------------------------------------------------------------------
95
+ // Server Group Commands
96
+ // -------------------------------------------------------------------------
97
+ const serverGroup = sshca.command('server-group').alias('sg').description('Manage server groups');
98
+ serverGroup
99
+ .command('list')
100
+ .alias('ls')
101
+ .description('List server groups')
102
+ .option('--json', 'Output as JSON')
103
+ .action(listServerGroups);
104
+ serverGroup
105
+ .command('get <group-id>')
106
+ .description('Get server group details')
107
+ .option('--json', 'Output as JSON')
108
+ .action(getServerGroup);
109
+ serverGroup
110
+ .command('create')
111
+ .description('Create a server group')
112
+ .option('--name <name>', 'Server group name')
113
+ .option('--description <desc>', 'Description')
114
+ .option('--json', 'Output as JSON')
115
+ .action(createServerGroup);
116
+ serverGroup
117
+ .command('delete <group-id>')
118
+ .alias('rm')
119
+ .description('Delete a server group')
120
+ .option('--force', 'Skip confirmation')
121
+ .option('--json', 'Output as JSON')
122
+ .action(deleteServerGroup);
123
+ serverGroup
124
+ .command('set-access <group-id>')
125
+ .description('Set access rule for a server group')
126
+ .option('--linux-user <user>', 'Linux user name')
127
+ .option('--principals <list>', 'Allowed principals (comma-separated)')
128
+ .option('--json', 'Output as JSON')
129
+ .action(setAccessRule);
130
+ serverGroup
131
+ .command('delete-access <group-id> <linux-user>')
132
+ .description('Delete access rule from a server group')
133
+ .option('--force', 'Skip confirmation')
134
+ .option('--json', 'Output as JSON')
135
+ .action(deleteAccessRule);
136
+ serverGroup
137
+ .command('principals <group-id>')
138
+ .description('Get authorized principals for server configuration')
139
+ .option('--json', 'Output as JSON')
140
+ .action(getAuthorizedPrincipals);
141
+ // -------------------------------------------------------------------------
142
+ // Certificate Commands
143
+ // -------------------------------------------------------------------------
144
+ const cert = sshca.command('cert').alias('certificate').description('Manage SSH certificates');
145
+ cert
146
+ .command('list')
147
+ .alias('ls')
148
+ .description('List certificates')
149
+ .option('--active-only', 'Show only active certificates')
150
+ .option('--revoked', 'Show only revoked certificates')
151
+ .option('--user-id <id>', 'Filter by user ID')
152
+ .option('--limit <n>', 'Maximum number of results')
153
+ .option('--json', 'Output as JSON')
154
+ .action(listCertificates);
155
+ cert
156
+ .command('get <cert-id>')
157
+ .description('Get certificate details')
158
+ .option('--json', 'Output as JSON')
159
+ .action(getCertificate);
160
+ cert
161
+ .command('revoke <cert-id>')
162
+ .description('Revoke a certificate')
163
+ .option('--reason <reason>', 'Revocation reason')
164
+ .option('--force', 'Skip confirmation')
165
+ .option('--json', 'Output as JSON')
166
+ .action(revokeCertificate);
167
+ // -------------------------------------------------------------------------
168
+ // Sign Command
169
+ // -------------------------------------------------------------------------
170
+ sshca
171
+ .command('sign')
172
+ .description('Sign SSH public key to get a certificate')
173
+ .option('--public-key <key>', 'SSH public key string')
174
+ .option('--file <path>', 'Path to SSH public key file')
175
+ .option('--ttl <seconds>', 'Certificate TTL in seconds')
176
+ .option('--principals <list>', 'Direct principal specification (admin override, comma-separated). Requires ssh:ca:admin permission.')
177
+ .option('--json', 'Output as JSON')
178
+ .action(signCertificate);
179
+ }
180
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/ssh-ca/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { MappingCreateOptions, MappingUpdateOptions } from './types.js';
2
+ export declare function listMappings(options: {
3
+ json?: boolean;
4
+ }): Promise<void>;
5
+ export declare function createMapping(options: MappingCreateOptions): Promise<void>;
6
+ export declare function updateMapping(mappingId: string, options: MappingUpdateOptions): Promise<void>;
7
+ export declare function deleteMapping(mappingId: string, options: {
8
+ force?: boolean;
9
+ json?: boolean;
10
+ }): Promise<void>;
11
+ //# sourceMappingURL=mappings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mappings.d.ts","sourceRoot":"","sources":["../../../src/commands/ssh-ca/mappings.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAGV,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAapB,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC7E;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2EhF;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BnG;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BlH"}
@@ -0,0 +1,178 @@
1
+ // Path: src/commands/ssh-ca/mappings.ts
2
+ /**
3
+ * Principal mapping commands for SSH CA
4
+ */
5
+ import ora from 'ora';
6
+ import Table from 'cli-table3';
7
+ import inquirer from 'inquirer';
8
+ import { client } from '../../lib/client.js';
9
+ import * as output from '../../lib/output.js';
10
+ import { formatDate, formatPrincipals, parsePrincipals, isValidPrincipal } from './helpers.js';
11
+ export async function listMappings(options) {
12
+ const spinner = ora('Fetching principal mappings...').start();
13
+ try {
14
+ const response = await client.get('/v1/ssh/principal-mappings');
15
+ spinner.stop();
16
+ if (options.json) {
17
+ output.json(response.items);
18
+ return;
19
+ }
20
+ if (response.items.length === 0) {
21
+ output.info('No principal mappings found.');
22
+ output.info('Create one with: znvault ssh-ca mapping create');
23
+ return;
24
+ }
25
+ const table = new Table({
26
+ head: ['ID', 'SSO Group', 'Principals', 'Created'],
27
+ style: { head: ['cyan'] },
28
+ });
29
+ for (const mapping of response.items) {
30
+ table.push([
31
+ mapping.id.substring(0, 8) + '...',
32
+ mapping.groupDisplayName ?? mapping.groupName ?? mapping.groupId.substring(0, 8),
33
+ formatPrincipals(mapping.principals),
34
+ formatDate(mapping.createdAt),
35
+ ]);
36
+ }
37
+ console.log(table.toString());
38
+ output.info(`${response.items.length} mapping(s) found`);
39
+ }
40
+ catch (err) {
41
+ spinner.fail('Failed to list mappings');
42
+ output.error(err instanceof Error ? err.message : String(err));
43
+ process.exit(1);
44
+ }
45
+ }
46
+ export async function createMapping(options) {
47
+ // Fetch SSO groups for selection
48
+ let groups = [];
49
+ try {
50
+ const groupsResponse = await client.get('/v1/sso/groups');
51
+ groups = groupsResponse.items;
52
+ }
53
+ catch {
54
+ // Groups endpoint might fail, continue with manual input
55
+ }
56
+ let groupId = options.groupId;
57
+ if (!groupId) {
58
+ if (groups.length > 0) {
59
+ const { selectedGroup } = await inquirer.prompt([{
60
+ type: 'list',
61
+ name: 'selectedGroup',
62
+ message: 'Select SSO group:',
63
+ choices: groups.map(g => ({
64
+ name: g.displayName ?? g.name,
65
+ value: g.id,
66
+ })),
67
+ }]);
68
+ groupId = selectedGroup;
69
+ }
70
+ else {
71
+ const { id } = await inquirer.prompt([{
72
+ type: 'input',
73
+ name: 'id',
74
+ message: 'SSO Group ID:',
75
+ validate: (input) => input.trim() ? true : 'Group ID is required',
76
+ }]);
77
+ groupId = id;
78
+ }
79
+ }
80
+ const principalsInput = options.principals ?? (await inquirer.prompt([{
81
+ type: 'input',
82
+ name: 'principals',
83
+ message: 'SSH Principals (comma-separated):',
84
+ validate: (input) => {
85
+ const principals = parsePrincipals(input);
86
+ if (principals.length === 0)
87
+ return 'At least one principal is required';
88
+ for (const p of principals) {
89
+ if (!isValidPrincipal(p))
90
+ return `Invalid principal: ${p}`;
91
+ }
92
+ return true;
93
+ },
94
+ }])).principals;
95
+ const principals = parsePrincipals(principalsInput);
96
+ const spinner = ora('Creating principal mapping...').start();
97
+ try {
98
+ const response = await client.post('/v1/ssh/principal-mappings', {
99
+ groupId,
100
+ principals,
101
+ });
102
+ spinner.succeed('Principal mapping created');
103
+ if (options.json) {
104
+ output.json(response);
105
+ return;
106
+ }
107
+ output.keyValue({
108
+ 'ID': response.id,
109
+ 'Group ID': response.groupId,
110
+ 'Principals': response.principals.join(', '),
111
+ 'Created': formatDate(response.createdAt),
112
+ });
113
+ }
114
+ catch (err) {
115
+ spinner.fail('Failed to create mapping');
116
+ output.error(err instanceof Error ? err.message : String(err));
117
+ process.exit(1);
118
+ }
119
+ }
120
+ export async function updateMapping(mappingId, options) {
121
+ const principalsInput = options.principals ?? (await inquirer.prompt([{
122
+ type: 'input',
123
+ name: 'principals',
124
+ message: 'New SSH Principals (comma-separated):',
125
+ validate: (input) => {
126
+ const principals = parsePrincipals(input);
127
+ if (principals.length === 0)
128
+ return 'At least one principal is required';
129
+ for (const p of principals) {
130
+ if (!isValidPrincipal(p))
131
+ return `Invalid principal: ${p}`;
132
+ }
133
+ return true;
134
+ },
135
+ }])).principals;
136
+ const principals = parsePrincipals(principalsInput);
137
+ const spinner = ora('Updating principal mapping...').start();
138
+ try {
139
+ await client.put(`/v1/ssh/principal-mappings/${mappingId}`, { principals });
140
+ spinner.succeed('Principal mapping updated');
141
+ if (options.json) {
142
+ output.json({ success: true, mappingId, principals });
143
+ }
144
+ }
145
+ catch (err) {
146
+ spinner.fail('Failed to update mapping');
147
+ output.error(err instanceof Error ? err.message : String(err));
148
+ process.exit(1);
149
+ }
150
+ }
151
+ export async function deleteMapping(mappingId, options) {
152
+ if (!options.force) {
153
+ const { confirm } = await inquirer.prompt([{
154
+ type: 'confirm',
155
+ name: 'confirm',
156
+ message: `Delete principal mapping ${mappingId}?`,
157
+ default: false,
158
+ }]);
159
+ if (!confirm) {
160
+ output.info('Operation cancelled.');
161
+ return;
162
+ }
163
+ }
164
+ const spinner = ora('Deleting principal mapping...').start();
165
+ try {
166
+ await client.delete(`/v1/ssh/principal-mappings/${mappingId}`);
167
+ spinner.succeed('Principal mapping deleted');
168
+ if (options.json) {
169
+ output.json({ success: true });
170
+ }
171
+ }
172
+ catch (err) {
173
+ spinner.fail('Failed to delete mapping');
174
+ output.error(err instanceof Error ? err.message : String(err));
175
+ process.exit(1);
176
+ }
177
+ }
178
+ //# sourceMappingURL=mappings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mappings.js","sourceRoot":"","sources":["../../../src/commands/ssh-ca/mappings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ServerGroupCreateOptions, AccessRuleOptions } from './types.js';
2
+ export declare function listServerGroups(options: {
3
+ json?: boolean;
4
+ }): Promise<void>;
5
+ export declare function getServerGroup(groupId: string, options: {
6
+ json?: boolean;
7
+ }): Promise<void>;
8
+ export declare function createServerGroup(options: ServerGroupCreateOptions): Promise<void>;
9
+ export declare function deleteServerGroup(groupId: string, options: {
10
+ force?: boolean;
11
+ json?: boolean;
12
+ }): Promise<void>;
13
+ export declare function setAccessRule(groupId: string, options: AccessRuleOptions): Promise<void>;
14
+ export declare function deleteAccessRule(groupId: string, linuxUser: string, options: {
15
+ force?: boolean;
16
+ json?: boolean;
17
+ }): Promise<void>;
18
+ export declare function getAuthorizedPrincipals(groupId: string, options: {
19
+ json?: boolean;
20
+ }): Promise<void>;
21
+ //# sourceMappingURL=server-groups.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-groups.d.ts","sourceRoot":"","sources":["../../../src/commands/ssh-ca/server-groups.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAIV,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAGpB,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCjF;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ChG;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CxF;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BpH;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C9F;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCzG"}