mmt-testlight 0.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.
package/README.md ADDED
@@ -0,0 +1,50 @@
1
+ # Multimeter CLI (mmtcli)
2
+
3
+ CLI runner for Multimeter test files.
4
+
5
+ ## Usage
6
+
7
+ ```
8
+ npx testlight run sample.yaml
9
+ testlight run test.mmt.yaml -o result.json
10
+ ```
11
+
12
+ Commands:
13
+ - `testlight run <file>`
14
+ - `testlight version-info`
15
+
16
+ ## Build
17
+
18
+ ```
19
+ npm install
20
+ npm run build
21
+ ```
22
+
23
+ ## Bundle single-file binary (pkg)
24
+
25
+ ```
26
+ npm run pkg
27
+ ```
28
+
29
+ Integrate deeper execution by wiring real core runtime logic in `runTestObject`.
30
+
31
+ ## Standalone binary for CI/CD
32
+
33
+ The `pkg` step builds self-contained binaries (macOS/Linux/Windows) under `dist/bin`.
34
+
35
+ - No Node.js is required on the machine running the binary.
36
+ - Core runtime (`mmt-core`) and HTTP client (`axios`) are bundled.
37
+
38
+ Examples:
39
+
40
+ ```
41
+ # macOS
42
+ ./dist/bin/testlight-macos version-info
43
+ ./dist/bin/testlight-macos to-js ../examples/test/login_and_get_user_info.mmt
44
+ ./dist/bin/testlight-macos run ../examples/test/login_and_get_user_info.mmt --quiet
45
+
46
+ # Linux
47
+ ./dist/bin/testlight-linux run path/to/test.mmt --quiet
48
+ ```
49
+
50
+ Tip: Upload the platform binary to your artifact store and invoke it in pipelines.
package/dist/cli.js ADDED
@@ -0,0 +1,407 @@
1
+ import { Command } from 'commander';
2
+ import fs from 'fs';
3
+ import yaml from 'js-yaml';
4
+ import * as mmtcore from 'mmt-core';
5
+ // Import from mmt-core root exports to avoid subpath resolution issues under
6
+ // pkg
7
+ import { apiParsePack, docHtml, docParsePack, runner } from 'mmt-core';
8
+ /**
9
+ * Generic resolver for mmt-core exports that handles three resolution strategies:
10
+ * 1. pkg snapshot paths (require 'mmt-core/dist/...')
11
+ * 2. CJS/Node16 paths (require 'mmt-core/...')
12
+ * 3. Fallback from mmtcore namespace
13
+ */
14
+ function resolveCoreExport(module, exportName, fallback) {
15
+ try {
16
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
17
+ const mod = require(`mmt-core/dist/${module}.js`);
18
+ if (mod && typeof mod[exportName] === 'function') {
19
+ return mod[exportName];
20
+ }
21
+ }
22
+ catch { /* pkg path not available */ }
23
+ try {
24
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
25
+ const mod = require(`mmt-core/${module}`);
26
+ if (mod && typeof mod[exportName] === 'function') {
27
+ return mod[exportName];
28
+ }
29
+ }
30
+ catch { /* CJS path not available */ }
31
+ return fallback ?? mmtcore?.[module]?.[exportName] ?? null;
32
+ }
33
+ async function loadCoreExport(module, exportName) {
34
+ // When running as ESM, prefer dynamic import
35
+ try {
36
+ const mod = await import(`mmt-core/${module}`);
37
+ if (mod && typeof mod[exportName] === 'function') {
38
+ return mod[exportName];
39
+ }
40
+ }
41
+ catch { /* ESM path not available */ }
42
+ return resolveCoreExport(module, exportName);
43
+ }
44
+ import path from 'path';
45
+ import { summarize } from './loadTest.js';
46
+ import { startMockServerFromPath, stopAllServers } from './mockRunner.js';
47
+ import { buildCliRunArgs } from './runArgs.js';
48
+ // Defer importing runTest until needed to avoid pulling axios for to-js
49
+ const program = new Command();
50
+ // Resolve version from package.json when available; fallback to a single const
51
+ // here.
52
+ function resolveCliVersion() {
53
+ const fallback = '0.2.0';
54
+ try {
55
+ const pkgPath = path.resolve('mmtcli', '.', 'package.json');
56
+ const candidates = [pkgPath];
57
+ for (const p of candidates) {
58
+ if (p && fs.existsSync(p)) {
59
+ const txt = fs.readFileSync(p, 'utf8');
60
+ const pkg = JSON.parse(txt);
61
+ if (pkg && typeof pkg.version === 'string' && pkg.version) {
62
+ return pkg.version;
63
+ }
64
+ }
65
+ }
66
+ }
67
+ catch {
68
+ }
69
+ return fallback;
70
+ }
71
+ const CLI_VERSION = resolveCliVersion();
72
+ program.name('multimeter')
73
+ .description('Multimeter CLI runner')
74
+ .version(CLI_VERSION, '-v, --version', 'output the version number');
75
+ program.option('--log-level <level>', 'Set log level (error|warn|info|debug|trace)', 'info');
76
+ program.command('run')
77
+ .argument('<file>', 'Test file (.yaml/.yml/.json/.mmt)')
78
+ .option('-q, --quiet', 'Minimal output', false)
79
+ .option('-o, --out <file>', 'Write result JSON to file')
80
+ .option('-i, --input <values...>', 'Input variables as key value pairs (repeatable)')
81
+ .option('-e, --env <values...>', 'Environment variables as key value pairs or key=val (repeatable)')
82
+ .option('--env-file <path>', 'Environment file (.mmt/.yaml) to read variables from')
83
+ .option('--preset <name>', 'Preset name from env file (e.g., runner.dev) or just name under runner')
84
+ .option('--example <name|#n>', 'Run a named example (matches name) or numeric index (#1 = first)')
85
+ .option('-p, --print-js', 'Print generated JS before executing', false)
86
+ .option('--report <format>', 'Generate test report: junit, mmt, html, or md')
87
+ .option('--report-file <path>', 'Output path for the report file (default depends on format)')
88
+ .action(async (file, opts) => {
89
+ try {
90
+ const runJSCode = await loadCoreExport('jsRunner', 'runJSCode');
91
+ if (typeof runJSCode !== 'function') {
92
+ throw new Error('Internal error: runJSCode is not available');
93
+ }
94
+ const full = path.resolve(process.cwd(), file);
95
+ const rawText = fs.readFileSync(full, 'utf8');
96
+ const raw = /\.json$/i.test(full) ? JSON.parse(rawText) : yaml.load(rawText);
97
+ const summary = summarize(raw);
98
+ if (!opts.quiet) {
99
+ console.log(`Loaded: ${path.resolve(file)} (${summary})`);
100
+ }
101
+ const { runFileOptions, networkConfig, outFile, printJs, reportFormat, reportFile, getReportResults } = buildCliRunArgs(file, { ...opts, logLevel: program.opts().logLevel });
102
+ // Apply network config if certificates are configured
103
+ if (networkConfig) {
104
+ try {
105
+ const setRunnerNetworkConfig = await loadCoreExport('jsRunner', 'setRunnerNetworkConfig');
106
+ if (setRunnerNetworkConfig) {
107
+ setRunnerNetworkConfig(networkConfig);
108
+ }
109
+ }
110
+ catch (e) {
111
+ console.warn(`Unable to apply certificate settings: ${e}`);
112
+ }
113
+ }
114
+ const runOpts = { ...runFileOptions };
115
+ // Create serverRunner to start mock servers from suite servers and test run steps
116
+ const cliServerRunner = async (alias, filePath) => {
117
+ if (!opts.quiet) {
118
+ console.log(`Starting mock server: ${alias}`);
119
+ }
120
+ return startMockServerFromPath(filePath, runOpts.envvar || {});
121
+ };
122
+ runOpts.serverRunner = cliServerRunner;
123
+ runOpts.jsRunner = (ctx) => runJSCode({ ...ctx, serverRunner: cliServerRunner });
124
+ let runOutcome;
125
+ try {
126
+ runOutcome = await runner.runFile(runOpts);
127
+ }
128
+ finally {
129
+ // Always stop mock servers after run completes
130
+ stopAllServers();
131
+ }
132
+ const { js, result } = runOutcome;
133
+ if (printJs) {
134
+ console.log(js.trim());
135
+ }
136
+ if (!opts.quiet) {
137
+ console.log(`Success: ${result.success}`);
138
+ console.log(`Duration: ${mmtcore.CommonData.formatDuration(result.durationMs)}`);
139
+ if (result.errors.length) {
140
+ console.log('Errors:');
141
+ result.errors.forEach((e) => console.log(' -', e));
142
+ }
143
+ }
144
+ if (outFile) {
145
+ const outPath = path.resolve(outFile);
146
+ fs.writeFileSync(outPath, JSON.stringify(result, null, 2), 'utf8');
147
+ if (!opts.quiet) {
148
+ console.log(`Result written: ${outPath}`);
149
+ }
150
+ }
151
+ // Generate and write test report if --report was specified
152
+ if (reportFormat && reportFile && getReportResults) {
153
+ const collectedResults = getReportResults();
154
+ let reportContent;
155
+ const serializers = {
156
+ junit: mmtcore.junitXml?.generateJunitXml,
157
+ mmt: mmtcore.mmtReport?.generateMmtReport,
158
+ html: mmtcore.reportHtml?.generateReportHtml,
159
+ md: mmtcore.reportMarkdown?.generateReportMarkdown,
160
+ };
161
+ const serializer = serializers[reportFormat];
162
+ if (typeof serializer === 'function') {
163
+ reportContent = serializer(collectedResults);
164
+ }
165
+ if (reportContent) {
166
+ const reportPath = path.resolve(reportFile);
167
+ fs.writeFileSync(reportPath, reportContent, 'utf8');
168
+ if (!opts.quiet) {
169
+ console.log(`Report written: ${reportPath}`);
170
+ }
171
+ }
172
+ else if (!opts.quiet) {
173
+ console.warn(`Unknown report format: ${reportFormat}`);
174
+ }
175
+ }
176
+ // Handle suite exports (from suite file's export: field)
177
+ const suiteExports = runOutcome.suiteExports;
178
+ if (suiteExports && Array.isArray(suiteExports.paths) && suiteExports.collectedResults) {
179
+ const suiteDir = path.dirname(path.resolve(process.cwd(), file));
180
+ const projectRoot = runFileOptions.projectRoot;
181
+ for (const exportPath of suiteExports.paths) {
182
+ try {
183
+ // Resolve path relative to suite file or +/ project root
184
+ let resolvedPath;
185
+ if (exportPath.startsWith('+/')) {
186
+ if (projectRoot) {
187
+ resolvedPath = path.resolve(projectRoot, exportPath.slice(2));
188
+ }
189
+ else {
190
+ if (!opts.quiet) {
191
+ console.warn(`Cannot resolve +/ path without project root: ${exportPath}`);
192
+ }
193
+ continue;
194
+ }
195
+ }
196
+ else {
197
+ resolvedPath = path.resolve(suiteDir, exportPath);
198
+ }
199
+ // Determine format from extension
200
+ const ext = path.extname(resolvedPath).toLowerCase();
201
+ const formatForExt = {
202
+ '.xml': 'junit',
203
+ '.html': 'html',
204
+ '.md': 'md',
205
+ '.mmt': 'mmt',
206
+ };
207
+ const format = formatForExt[ext];
208
+ if (!format) {
209
+ if (!opts.quiet) {
210
+ console.warn(`Unknown export format for extension ${ext}: ${exportPath}`);
211
+ }
212
+ continue;
213
+ }
214
+ // Generate report content
215
+ const exportSerializers = {
216
+ junit: mmtcore.junitXml?.generateJunitXml,
217
+ mmt: mmtcore.mmtReport?.generateMmtReport,
218
+ html: mmtcore.reportHtml?.generateReportHtml,
219
+ md: mmtcore.reportMarkdown?.generateReportMarkdown,
220
+ };
221
+ const serializer = exportSerializers[format];
222
+ if (typeof serializer !== 'function') {
223
+ if (!opts.quiet) {
224
+ console.warn(`Export serializer not available for format: ${format}`);
225
+ }
226
+ continue;
227
+ }
228
+ if (!opts.quiet) {
229
+ console.log(`Exporting results to ${resolvedPath}`);
230
+ }
231
+ const content = serializer(suiteExports.collectedResults);
232
+ // Create parent directories if they don't exist
233
+ const parentDir = path.dirname(resolvedPath);
234
+ if (!fs.existsSync(parentDir)) {
235
+ fs.mkdirSync(parentDir, { recursive: true });
236
+ }
237
+ fs.writeFileSync(resolvedPath, content, 'utf8');
238
+ if (!opts.quiet) {
239
+ console.log(`Suite export written: ${resolvedPath}`);
240
+ }
241
+ }
242
+ catch (e) {
243
+ if (!opts.quiet) {
244
+ console.warn(`Failed to write suite export ${exportPath}: ${e?.message || e}`);
245
+ }
246
+ }
247
+ }
248
+ }
249
+ process.exit(result.success ? 0 : 1);
250
+ }
251
+ catch (e) {
252
+ if (!opts.quiet) {
253
+ }
254
+ console.error('Error:', e?.message || e);
255
+ process.exit(2);
256
+ }
257
+ });
258
+ program.command('print-js')
259
+ .argument('<file>', 'Test file (.yaml/.yml/.json/.mmt)')
260
+ .description('Convert a test definition file to executable JS using JSer and print to stdout')
261
+ .option('-s, --stages', 'Include stage headers as comments when stages exist', true)
262
+ .option('-i, --input <values...>', 'Input variables as key value pairs (repeatable)')
263
+ .option('-e, --env <values...>', 'Environment variables as key value pairs or key=val (repeatable)')
264
+ .option('--env-file <path>', 'Environment file (.mmt/.yaml) to read variables from')
265
+ .option('--preset <name>', 'Preset name from env file (e.g., runner.dev) or just name under runner')
266
+ .option('--example <name|#n>', 'Select a named example (matches name) or numeric index (#1 = first)')
267
+ .action(async (file, opts) => {
268
+ try {
269
+ const { runFileOptions } = buildCliRunArgs(file, { ...opts, logLevel: program.opts().logLevel });
270
+ const rawText = runFileOptions.file;
271
+ const envVars = (runFileOptions.envvar || {});
272
+ const inputs = (runFileOptions.manualInputs || {});
273
+ const fullPath = runFileOptions.filePath || path.resolve(process.cwd(), file);
274
+ const js = await mmtcore.runner.generateTestJs({
275
+ rawText,
276
+ name: path.basename(fullPath).replace(/[^a-zA-Z0-9_]/g, '_'),
277
+ inputs,
278
+ envVars,
279
+ fileLoader: runFileOptions.fileLoader,
280
+ });
281
+ if (!js.trim()) {
282
+ console.error('No JS could be generated (empty flow).');
283
+ process.exit(1);
284
+ }
285
+ console.log(js.trim());
286
+ }
287
+ catch (e) {
288
+ console.error('Error generating JS:', e?.message || e);
289
+ process.exit(2);
290
+ }
291
+ });
292
+ program.command('version-info')
293
+ .description('Show environment info')
294
+ .action(() => {
295
+ console.log(`multimeter cli ${CLI_VERSION}`);
296
+ console.log('Node:', process.version);
297
+ });
298
+ program.command('doc')
299
+ .argument('<file>', 'Doc file (.mmt/.yaml/.yml)')
300
+ .description('Generate documentation from a doc .mmt')
301
+ .option('-o, --out <file>', 'Write output to file (default: <docname>.<ext>)')
302
+ .option('--html', 'Generate HTML (default)', false)
303
+ .option('--md', 'Generate Markdown instead of HTML', false)
304
+ .action(async (file, opts) => {
305
+ try {
306
+ const full = path.resolve(process.cwd(), file);
307
+ const docDir = path.dirname(full);
308
+ const text = fs.readFileSync(full, 'utf8');
309
+ const doc = docParsePack.yamlToDoc(text);
310
+ const sources = [];
311
+ if (Array.isArray(doc.sources)) {
312
+ sources.push(...doc.sources);
313
+ }
314
+ if (Array.isArray(doc.services)) {
315
+ for (const s of doc.services) {
316
+ if (Array.isArray(s?.sources)) {
317
+ sources.push(...s.sources);
318
+ }
319
+ }
320
+ }
321
+ const files = new Set();
322
+ const walk = (p) => {
323
+ if (!fs.existsSync(p)) {
324
+ return;
325
+ }
326
+ const stat = fs.statSync(p);
327
+ if (stat.isDirectory()) {
328
+ for (const entry of fs.readdirSync(p)) {
329
+ walk(path.join(p, entry));
330
+ }
331
+ }
332
+ else if (stat.isFile() && p.toLowerCase().endsWith('.mmt')) {
333
+ files.add(p);
334
+ }
335
+ };
336
+ for (const s of sources) {
337
+ const abs = path.isAbsolute(s) ? s : path.join(docDir, s);
338
+ if (/\.mmt$/i.test(abs)) {
339
+ files.add(abs);
340
+ }
341
+ else {
342
+ walk(abs);
343
+ }
344
+ }
345
+ const apis = [];
346
+ for (const f of Array.from(files)) {
347
+ try {
348
+ const t = fs.readFileSync(f, 'utf8');
349
+ const parsed = yaml.load(t);
350
+ if (parsed && parsed.type === 'api') {
351
+ const api = apiParsePack.yamlToAPI(t);
352
+ api.__file = f; // attach file path for grouping
353
+ apis.push(api);
354
+ }
355
+ }
356
+ catch {
357
+ }
358
+ }
359
+ // logo embedding
360
+ let logoDataUrl = undefined;
361
+ const logo = doc?.logo;
362
+ if (logo && typeof logo === 'string' && !/^https?:\/\//i.test(logo) &&
363
+ !/^data:/i.test(logo)) {
364
+ const p = path.isAbsolute(logo) ? logo : path.join(docDir, logo);
365
+ try {
366
+ const data = fs.readFileSync(p);
367
+ const ext = (path.extname(p) || '').toLowerCase();
368
+ const mime = ext === '.png' ? 'image/png' :
369
+ ext === '.jpg' || ext === '.jpeg' ? 'image/jpeg' :
370
+ ext === '.svg' ? 'image/svg+xml' :
371
+ ext === '.gif' ? 'image/gif' :
372
+ 'application/octet-stream';
373
+ logoDataUrl = `data:${mime};base64,${data.toString('base64')}`;
374
+ }
375
+ catch {
376
+ }
377
+ }
378
+ const useMd = opts.md && !opts.html; // HTML remains default
379
+ const htmlOrMd = useMd ?
380
+ mmtcore.docMarkdown.buildDocMarkdown(apis, {
381
+ title: doc.title,
382
+ description: doc.description,
383
+ logo: logoDataUrl || doc.logo,
384
+ sources: Array.isArray(doc.sources) ? doc.sources : undefined,
385
+ services: Array.isArray(doc.services) ? doc.services : undefined,
386
+ }) :
387
+ docHtml.buildDocHtml(apis, {
388
+ title: doc.title,
389
+ description: doc.description,
390
+ logo: logoDataUrl || doc.logo,
391
+ sources: Array.isArray(doc.sources) ? doc.sources : undefined,
392
+ services: Array.isArray(doc.services) ? doc.services : undefined,
393
+ });
394
+ const defExt = useMd ? '.md' : '.html';
395
+ const outPath = opts.out ?
396
+ path.resolve(process.cwd(), opts.out) :
397
+ path.resolve(process.cwd(), `${path.basename(full, path.extname(full))}${defExt}`);
398
+ fs.writeFileSync(outPath, htmlOrMd, 'utf8');
399
+ console.log(`Doc generated: ${outPath}`);
400
+ }
401
+ catch (e) {
402
+ console.error('Error generating doc:', e?.message || e);
403
+ process.exit(2);
404
+ }
405
+ });
406
+ program.parseAsync(process.argv);
407
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import yaml from 'js-yaml';
4
+ export function loadTestFile(filePath) {
5
+ const full = path.resolve(process.cwd(), filePath);
6
+ if (!fs.existsSync(full)) {
7
+ throw new Error(`File not found: ${full}`);
8
+ }
9
+ const txt = fs.readFileSync(full, 'utf8');
10
+ if (/(\.ya?ml|\.mmt)$/i.test(full)) {
11
+ return yaml.load(txt);
12
+ }
13
+ if (/\.json$/i.test(full)) {
14
+ return JSON.parse(txt);
15
+ }
16
+ try {
17
+ return yaml.load(txt);
18
+ }
19
+ catch {
20
+ return JSON.parse(txt);
21
+ }
22
+ }
23
+ export function extractFlow(obj) {
24
+ if (Array.isArray(obj?.stages)) {
25
+ return { steps: [], stages: obj.stages };
26
+ }
27
+ if (Array.isArray(obj?.steps)) {
28
+ return { steps: obj.steps };
29
+ }
30
+ return { steps: [] };
31
+ }
32
+ export function summarize(obj) {
33
+ const { steps, stages } = extractFlow(obj);
34
+ return stages ? `stages: ${stages.length}` : `steps: ${steps.length}`;
35
+ }
36
+ //# sourceMappingURL=loadTest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadTest.js","sourceRoot":"","sources":["../src/loadTest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,IAAI,MAAM,SAAS,CAAC;AAG3B,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAQ;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IAC3C,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAQ;IAChC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC3C,OAAO,MAAM,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,MAAM,EAAE,CAAC;AACxE,CAAC"}