@switchbot/openapi-cli 1.1.0 → 1.2.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 (90) hide show
  1. package/README.md +174 -18
  2. package/dist/api/client.d.ts +7 -1
  3. package/dist/api/client.js +44 -8
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/commands/batch.d.ts +2 -0
  6. package/dist/commands/batch.js +252 -0
  7. package/dist/commands/batch.js.map +1 -0
  8. package/dist/commands/cache.d.ts +2 -0
  9. package/dist/commands/cache.js +108 -0
  10. package/dist/commands/cache.js.map +1 -0
  11. package/dist/commands/capabilities.d.ts +2 -0
  12. package/dist/commands/capabilities.js +91 -0
  13. package/dist/commands/capabilities.js.map +1 -0
  14. package/dist/commands/catalog.d.ts +2 -0
  15. package/dist/commands/catalog.js +291 -0
  16. package/dist/commands/catalog.js.map +1 -0
  17. package/dist/commands/config.js +123 -10
  18. package/dist/commands/config.js.map +1 -1
  19. package/dist/commands/devices.js +234 -147
  20. package/dist/commands/devices.js.map +1 -1
  21. package/dist/commands/doctor.d.ts +2 -0
  22. package/dist/commands/doctor.js +147 -0
  23. package/dist/commands/doctor.js.map +1 -0
  24. package/dist/commands/events.d.ts +15 -0
  25. package/dist/commands/events.js +188 -0
  26. package/dist/commands/events.js.map +1 -0
  27. package/dist/commands/explain.d.ts +2 -0
  28. package/dist/commands/explain.js +137 -0
  29. package/dist/commands/explain.js.map +1 -0
  30. package/dist/commands/history.d.ts +2 -0
  31. package/dist/commands/history.js +104 -0
  32. package/dist/commands/history.js.map +1 -0
  33. package/dist/commands/mcp.d.ts +4 -0
  34. package/dist/commands/mcp.js +386 -0
  35. package/dist/commands/mcp.js.map +1 -0
  36. package/dist/commands/plan.d.ts +37 -0
  37. package/dist/commands/plan.js +344 -0
  38. package/dist/commands/plan.js.map +1 -0
  39. package/dist/commands/quota.d.ts +2 -0
  40. package/dist/commands/quota.js +77 -0
  41. package/dist/commands/quota.js.map +1 -0
  42. package/dist/commands/scenes.js +19 -13
  43. package/dist/commands/scenes.js.map +1 -1
  44. package/dist/commands/schema.d.ts +2 -0
  45. package/dist/commands/schema.js +77 -0
  46. package/dist/commands/schema.js.map +1 -0
  47. package/dist/commands/watch.d.ts +2 -0
  48. package/dist/commands/watch.js +161 -0
  49. package/dist/commands/watch.js.map +1 -0
  50. package/dist/commands/webhook.js +37 -22
  51. package/dist/commands/webhook.js.map +1 -1
  52. package/dist/config.d.ts +11 -0
  53. package/dist/config.js +32 -6
  54. package/dist/config.js.map +1 -1
  55. package/dist/devices/cache.d.ts +50 -0
  56. package/dist/devices/cache.js +152 -1
  57. package/dist/devices/cache.js.map +1 -1
  58. package/dist/devices/catalog.d.ts +49 -0
  59. package/dist/devices/catalog.js +362 -92
  60. package/dist/devices/catalog.js.map +1 -1
  61. package/dist/index.js +31 -1
  62. package/dist/index.js.map +1 -1
  63. package/dist/lib/devices.d.ts +144 -0
  64. package/dist/lib/devices.js +329 -0
  65. package/dist/lib/devices.js.map +1 -0
  66. package/dist/lib/scenes.d.ts +7 -0
  67. package/dist/lib/scenes.js +11 -0
  68. package/dist/lib/scenes.js.map +1 -0
  69. package/dist/utils/audit.d.ts +13 -0
  70. package/dist/utils/audit.js +43 -0
  71. package/dist/utils/audit.js.map +1 -0
  72. package/dist/utils/filter.d.ts +45 -0
  73. package/dist/utils/filter.js +96 -0
  74. package/dist/utils/filter.js.map +1 -0
  75. package/dist/utils/flags.d.ts +42 -0
  76. package/dist/utils/flags.js +108 -0
  77. package/dist/utils/flags.js.map +1 -1
  78. package/dist/utils/format.d.ts +9 -0
  79. package/dist/utils/format.js +109 -0
  80. package/dist/utils/format.js.map +1 -0
  81. package/dist/utils/output.d.ts +11 -0
  82. package/dist/utils/output.js +37 -6
  83. package/dist/utils/output.js.map +1 -1
  84. package/dist/utils/quota.d.ts +48 -0
  85. package/dist/utils/quota.js +144 -0
  86. package/dist/utils/quota.js.map +1 -0
  87. package/dist/utils/retry.d.ts +23 -0
  88. package/dist/utils/retry.js +60 -0
  89. package/dist/utils/retry.js.map +1 -0
  90. package/package.json +4 -1
@@ -1,5 +1,35 @@
1
- import { saveConfig, showConfig } from '../config.js';
1
+ import fs from 'node:fs';
2
+ import { execFileSync } from 'node:child_process';
3
+ import { saveConfig, showConfig, listProfiles } from '../config.js';
4
+ import { isJsonMode, printJson } from '../utils/output.js';
2
5
  import chalk from 'chalk';
6
+ function parseEnvFile(file) {
7
+ const out = {};
8
+ const raw = fs.readFileSync(file, 'utf-8');
9
+ for (const line of raw.split(/\r?\n/)) {
10
+ const trimmed = line.trim();
11
+ if (!trimmed || trimmed.startsWith('#'))
12
+ continue;
13
+ const eq = trimmed.indexOf('=');
14
+ if (eq === -1)
15
+ continue;
16
+ const key = trimmed.slice(0, eq).trim();
17
+ let val = trimmed.slice(eq + 1).trim();
18
+ if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
19
+ val = val.slice(1, -1);
20
+ }
21
+ if (key === 'SWITCHBOT_TOKEN')
22
+ out.token = val;
23
+ else if (key === 'SWITCHBOT_SECRET')
24
+ out.secret = val;
25
+ }
26
+ return out;
27
+ }
28
+ function readFromOp(ref) {
29
+ // 1Password CLI: `op read "op://vault/item/field"` → single line on stdout
30
+ const stdout = execFileSync('op', ['read', ref], { encoding: 'utf-8' });
31
+ return stdout.trim();
32
+ }
3
33
  export function registerConfigCommand(program) {
4
34
  const config = program
5
35
  .command('config')
@@ -7,25 +37,92 @@ export function registerConfigCommand(program) {
7
37
  .addHelpText('after', `
8
38
  Credential priority:
9
39
  1. Environment variables: SWITCHBOT_TOKEN and SWITCHBOT_SECRET
10
- 2. File: ~/.switchbot/config.json (created by 'config set-token')
40
+ 2. --config <path> (explicit file override)
41
+ 3. --profile <name> → ~/.switchbot/profiles/<name>.json
42
+ 4. ~/.switchbot/config.json (default)
11
43
 
12
44
  Obtain your token/secret from the SwitchBot mobile app:
13
45
  Profile → Preferences → Developer Options → Get Token
14
46
  `);
15
47
  config
16
48
  .command('set-token')
17
- .description('Save token and secret to ~/.switchbot/config.json (mode 0600)')
18
- .argument('<token>', 'API token (long hex string from the SwitchBot app)')
19
- .argument('<secret>', 'API client secret (hex string from the SwitchBot app)')
49
+ .description('Save token and secret (mode 0600). Use --profile to target a named profile.')
50
+ .argument('[token]', 'API token; omit when using --from-env-file / --from-op')
51
+ .argument('[secret]', 'API client secret; omit when using --from-env-file / --from-op')
52
+ .option('--from-env-file <path>', 'Read SWITCHBOT_TOKEN and SWITCHBOT_SECRET from a dotenv file')
53
+ .option('--from-op <tokenRef>', 'Read token via 1Password CLI (op read). Pair with --op-secret <ref>')
54
+ .option('--op-secret <secretRef>', '1Password reference for the secret, used with --from-op')
20
55
  .addHelpText('after', `
21
- Example:
22
- $ switchbot config set-token 0123abcd... 9876ffff...
56
+ Examples:
57
+ $ switchbot config set-token <token> <secret>
58
+ $ switchbot --profile work config set-token <token> <secret>
59
+ $ switchbot config set-token --from-env-file ./.env
60
+ $ switchbot config set-token --from-op op://vault/switchbot/token --op-secret op://vault/switchbot/secret
23
61
 
24
- Note: the file is written with mode 0600 so only your user can read it.
62
+ Files are written with mode 0600. Profiles live under ~/.switchbot/profiles/<name>.json.
25
63
  `)
26
- .action((token, secret) => {
64
+ .action(async (tokenArg, secretArg, options) => {
65
+ let token = tokenArg;
66
+ let secret = secretArg;
67
+ if (options.fromEnvFile) {
68
+ if (!fs.existsSync(options.fromEnvFile)) {
69
+ const msg = `--from-env-file: file not found: ${options.fromEnvFile}`;
70
+ if (isJsonMode()) {
71
+ console.error(JSON.stringify({ error: { code: 2, kind: 'usage', message: msg } }));
72
+ }
73
+ else {
74
+ console.error(msg);
75
+ }
76
+ process.exit(2);
77
+ }
78
+ const parsed = parseEnvFile(options.fromEnvFile);
79
+ token = token ?? parsed.token;
80
+ secret = secret ?? parsed.secret;
81
+ }
82
+ if (options.fromOp) {
83
+ if (!options.opSecret) {
84
+ const msg = '--from-op requires --op-secret <ref> for the secret reference.';
85
+ if (isJsonMode()) {
86
+ console.error(JSON.stringify({ error: { code: 2, kind: 'usage', message: msg } }));
87
+ }
88
+ else {
89
+ console.error(msg);
90
+ }
91
+ process.exit(2);
92
+ }
93
+ try {
94
+ token = readFromOp(options.fromOp);
95
+ secret = readFromOp(options.opSecret);
96
+ }
97
+ catch (err) {
98
+ const msg = `1Password CLI read failed: ${err instanceof Error ? err.message : String(err)}`;
99
+ if (isJsonMode()) {
100
+ console.error(JSON.stringify({ error: { code: 1, kind: 'runtime', message: msg, hint: 'Ensure the "op" CLI is installed and authenticated (op signin).' } }));
101
+ }
102
+ else {
103
+ console.error(msg);
104
+ console.error('Ensure the "op" CLI is installed and authenticated (op signin).');
105
+ }
106
+ process.exit(1);
107
+ }
108
+ }
109
+ if (!token || !secret) {
110
+ const msg = 'Missing token/secret. Provide positional arguments or use --from-env-file / --from-op.';
111
+ if (isJsonMode()) {
112
+ console.error(JSON.stringify({ error: { code: 2, kind: 'usage', message: msg } }));
113
+ }
114
+ else {
115
+ console.error(msg);
116
+ }
117
+ process.exit(2);
118
+ }
27
119
  saveConfig(token, secret);
28
- console.log(chalk.green('✓ Credentials saved to ~/.switchbot/config.json'));
120
+ if (isJsonMode()) {
121
+ printJson({ ok: true, message: 'credentials saved' });
122
+ }
123
+ else {
124
+ console.log(chalk.green('✓ Credentials saved'));
125
+ }
29
126
  });
30
127
  config
31
128
  .command('show')
@@ -33,5 +130,21 @@ Note: the file is written with mode 0600 so only your user can read it.
33
130
  .action(() => {
34
131
  showConfig();
35
132
  });
133
+ config
134
+ .command('list-profiles')
135
+ .description('List named profiles under ~/.switchbot/profiles/')
136
+ .action(() => {
137
+ const profiles = listProfiles();
138
+ if (isJsonMode()) {
139
+ printJson({ profiles });
140
+ return;
141
+ }
142
+ if (profiles.length === 0) {
143
+ console.log('No profiles. Create one with: switchbot --profile <name> config set-token ...');
144
+ return;
145
+ }
146
+ for (const p of profiles)
147
+ console.log(p);
148
+ });
36
149
  }
37
150
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,WAAW,CAAC,OAAO,EAAE;;;;;;;CAOzB,CAAC,CAAC;IAED,MAAM;SACH,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,+DAA+D,CAAC;SAC5E,QAAQ,CAAC,SAAS,EAAE,oDAAoD,CAAC;SACzE,QAAQ,CAAC,UAAU,EAAE,uDAAuD,CAAC;SAC7E,WAAW,CAAC,OAAO,EAAE;;;;;CAKzB,CAAC;SACG,MAAM,CAAC,CAAC,KAAa,EAAE,MAAc,EAAE,EAAE;QACxC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wDAAwD,CAAC;SACrE,MAAM,CAAC,GAAG,EAAE;QACX,UAAU,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,GAAG,GAAwC,EAAE,CAAC;IACpD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClD,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,SAAS;QACxB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC7F,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,GAAG,KAAK,iBAAiB;YAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC;aAC1C,IAAI,GAAG,KAAK,kBAAkB;YAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;IACxD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,2EAA2E;IAC3E,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACxE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,WAAW,CAAC,OAAO,EAAE;;;;;;;;;CASzB,CAAC,CAAC;IAED,MAAM;SACH,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,6EAA6E,CAAC;SAC1F,QAAQ,CAAC,SAAS,EAAE,wDAAwD,CAAC;SAC7E,QAAQ,CAAC,UAAU,EAAE,gEAAgE,CAAC;SACtF,MAAM,CAAC,wBAAwB,EAAE,8DAA8D,CAAC;SAChG,MAAM,CAAC,sBAAsB,EAAE,qEAAqE,CAAC;SACrG,MAAM,CAAC,yBAAyB,EAAE,yDAAyD,CAAC;SAC5F,WAAW,CAAC,OAAO,EAAE;;;;;;;;CAQzB,CAAC;SACG,MAAM,CAAC,KAAK,EACX,QAA4B,EAC5B,SAA6B,EAC7B,OAAqE,EACrE,EAAE;QACF,IAAI,KAAK,GAAG,QAAQ,CAAC;QACrB,IAAI,MAAM,GAAG,SAAS,CAAC;QAEvB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;gBACxC,MAAM,GAAG,GAAG,oCAAoC,OAAO,CAAC,WAAW,EAAE,CAAC;gBACtE,IAAI,UAAU,EAAE,EAAE,CAAC;oBACjB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;gBACrF,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACjD,KAAK,GAAG,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;YAC9B,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;QACnC,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAG,gEAAgE,CAAC;gBAC7E,IAAI,UAAU,EAAE,EAAE,CAAC;oBACjB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;gBACrF,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,CAAC;gBACH,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACnC,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,8BAA8B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7F,IAAI,UAAU,EAAE,EAAE,CAAC;oBACjB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,iEAAiE,EAAE,EAAE,CAAC,CAAC,CAAC;gBAChK,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACnB,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;gBACnF,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,wFAAwF,CAAC;YACrG,IAAI,UAAU,EAAE,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;YACrF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1B,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wDAAwD,CAAC;SACrE,MAAM,CAAC,GAAG,EAAE;QACX,UAAU,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACP,CAAC"}