@sharpee/transcript-tester 0.9.61-beta

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 (137) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/LICENSE +21 -0
  3. package/dist/cli.d.ts +11 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +367 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/condition-evaluator.d.ts +30 -0
  8. package/dist/condition-evaluator.d.ts.map +1 -0
  9. package/dist/condition-evaluator.js +314 -0
  10. package/dist/condition-evaluator.js.map +1 -0
  11. package/dist/fast-cli.d.ts +13 -0
  12. package/dist/fast-cli.d.ts.map +1 -0
  13. package/dist/fast-cli.js +363 -0
  14. package/dist/fast-cli.js.map +1 -0
  15. package/dist/index.d.ts +17 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +48 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/navigator.d.ts +27 -0
  20. package/dist/navigator.d.ts.map +1 -0
  21. package/dist/navigator.js +303 -0
  22. package/dist/navigator.js.map +1 -0
  23. package/dist/parser.d.ts +19 -0
  24. package/dist/parser.d.ts.map +1 -0
  25. package/dist/parser.js +453 -0
  26. package/dist/parser.js.map +1 -0
  27. package/dist/reporter.d.ts +41 -0
  28. package/dist/reporter.d.ts.map +1 -0
  29. package/dist/reporter.js +386 -0
  30. package/dist/reporter.js.map +1 -0
  31. package/dist/runner.d.ts +44 -0
  32. package/dist/runner.d.ts.map +1 -0
  33. package/dist/runner.js +977 -0
  34. package/dist/runner.js.map +1 -0
  35. package/dist/story-loader.d.ts +31 -0
  36. package/dist/story-loader.d.ts.map +1 -0
  37. package/dist/story-loader.js +169 -0
  38. package/dist/story-loader.js.map +1 -0
  39. package/dist/types.d.ts +204 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +8 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist-esm/cli.d.ts +11 -0
  44. package/dist-esm/cli.d.ts.map +1 -0
  45. package/dist-esm/cli.js +332 -0
  46. package/dist-esm/cli.js.map +1 -0
  47. package/dist-esm/condition-evaluator.d.ts +30 -0
  48. package/dist-esm/condition-evaluator.d.ts.map +1 -0
  49. package/dist-esm/condition-evaluator.js +311 -0
  50. package/dist-esm/condition-evaluator.js.map +1 -0
  51. package/dist-esm/fast-cli.d.ts +13 -0
  52. package/dist-esm/fast-cli.d.ts.map +1 -0
  53. package/dist-esm/fast-cli.js +328 -0
  54. package/dist-esm/fast-cli.js.map +1 -0
  55. package/dist-esm/index.d.ts +17 -0
  56. package/dist-esm/index.d.ts.map +1 -0
  57. package/dist-esm/index.js +21 -0
  58. package/dist-esm/index.js.map +1 -0
  59. package/dist-esm/navigator.d.ts +27 -0
  60. package/dist-esm/navigator.d.ts.map +1 -0
  61. package/dist-esm/navigator.js +300 -0
  62. package/dist-esm/navigator.js.map +1 -0
  63. package/dist-esm/parser.d.ts +19 -0
  64. package/dist-esm/parser.d.ts.map +1 -0
  65. package/dist-esm/parser.js +415 -0
  66. package/dist-esm/parser.js.map +1 -0
  67. package/dist-esm/reporter.d.ts +41 -0
  68. package/dist-esm/reporter.d.ts.map +1 -0
  69. package/dist-esm/reporter.js +342 -0
  70. package/dist-esm/reporter.js.map +1 -0
  71. package/dist-esm/runner.d.ts +44 -0
  72. package/dist-esm/runner.d.ts.map +1 -0
  73. package/dist-esm/runner.js +941 -0
  74. package/dist-esm/runner.js.map +1 -0
  75. package/dist-esm/story-loader.d.ts +31 -0
  76. package/dist-esm/story-loader.d.ts.map +1 -0
  77. package/dist-esm/story-loader.js +131 -0
  78. package/dist-esm/story-loader.js.map +1 -0
  79. package/dist-esm/types.d.ts +204 -0
  80. package/dist-esm/types.d.ts.map +1 -0
  81. package/dist-esm/types.js +7 -0
  82. package/dist-esm/types.js.map +1 -0
  83. package/dist-npm/cli.d.ts +11 -0
  84. package/dist-npm/cli.d.ts.map +1 -0
  85. package/dist-npm/cli.js +367 -0
  86. package/dist-npm/cli.js.map +1 -0
  87. package/dist-npm/condition-evaluator.d.ts +30 -0
  88. package/dist-npm/condition-evaluator.d.ts.map +1 -0
  89. package/dist-npm/condition-evaluator.js +314 -0
  90. package/dist-npm/condition-evaluator.js.map +1 -0
  91. package/dist-npm/fast-cli.d.ts +13 -0
  92. package/dist-npm/fast-cli.d.ts.map +1 -0
  93. package/dist-npm/fast-cli.js +363 -0
  94. package/dist-npm/fast-cli.js.map +1 -0
  95. package/dist-npm/index.d.ts +17 -0
  96. package/dist-npm/index.d.ts.map +1 -0
  97. package/dist-npm/index.js +48 -0
  98. package/dist-npm/index.js.map +1 -0
  99. package/dist-npm/navigator.d.ts +27 -0
  100. package/dist-npm/navigator.d.ts.map +1 -0
  101. package/dist-npm/navigator.js +303 -0
  102. package/dist-npm/navigator.js.map +1 -0
  103. package/dist-npm/parser.d.ts +19 -0
  104. package/dist-npm/parser.d.ts.map +1 -0
  105. package/dist-npm/parser.js +453 -0
  106. package/dist-npm/parser.js.map +1 -0
  107. package/dist-npm/reporter.d.ts +41 -0
  108. package/dist-npm/reporter.d.ts.map +1 -0
  109. package/dist-npm/reporter.js +386 -0
  110. package/dist-npm/reporter.js.map +1 -0
  111. package/dist-npm/runner.d.ts +44 -0
  112. package/dist-npm/runner.d.ts.map +1 -0
  113. package/dist-npm/runner.js +977 -0
  114. package/dist-npm/runner.js.map +1 -0
  115. package/dist-npm/story-loader.d.ts +31 -0
  116. package/dist-npm/story-loader.d.ts.map +1 -0
  117. package/dist-npm/story-loader.js +169 -0
  118. package/dist-npm/story-loader.js.map +1 -0
  119. package/dist-npm/types.d.ts +204 -0
  120. package/dist-npm/types.d.ts.map +1 -0
  121. package/dist-npm/types.js +8 -0
  122. package/dist-npm/types.js.map +1 -0
  123. package/package.json +49 -0
  124. package/src/cli.ts +385 -0
  125. package/src/condition-evaluator.ts +382 -0
  126. package/src/fast-cli.ts +403 -0
  127. package/src/index.ts +26 -0
  128. package/src/navigator.ts +365 -0
  129. package/src/parser.ts +488 -0
  130. package/src/reporter.ts +409 -0
  131. package/src/runner.ts +1152 -0
  132. package/src/story-loader.ts +168 -0
  133. package/src/types.ts +244 -0
  134. package/tsconfig.esm.json +11 -0
  135. package/tsconfig.esm.tsbuildinfo +1 -0
  136. package/tsconfig.json +22 -0
  137. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,342 @@
1
+ /**
2
+ * Transcript Test Reporter
3
+ *
4
+ * Formats and displays test results with colors and diffs.
5
+ */
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ // Use chalk for colors (chalk@4 for CommonJS compatibility)
9
+ import chalk from 'chalk';
10
+ /**
11
+ * Report results of running a single transcript
12
+ */
13
+ export function reportTranscript(result, options = {}) {
14
+ const { verbose = false } = options;
15
+ console.log();
16
+ console.log(chalk.bold(`Running: ${result.transcript.filePath}`));
17
+ if (result.transcript.header.title) {
18
+ console.log(chalk.gray(` "${result.transcript.header.title}"`));
19
+ }
20
+ console.log();
21
+ for (const cmd of result.commands) {
22
+ reportCommand(cmd, verbose);
23
+ }
24
+ // Summary line
25
+ console.log();
26
+ reportTranscriptSummary(result);
27
+ }
28
+ /**
29
+ * Report a single command result
30
+ */
31
+ function reportCommand(result, verbose) {
32
+ const { command, passed, expectedFailure, skipped, actualOutput, error } = result;
33
+ // Command input
34
+ const inputDisplay = chalk.cyan(`> ${command.input}`);
35
+ // Status indicator
36
+ let status;
37
+ if (skipped) {
38
+ status = chalk.yellow('SKIP');
39
+ }
40
+ else if (expectedFailure) {
41
+ status = chalk.magenta('EXPECTED FAIL');
42
+ }
43
+ else if (passed) {
44
+ status = chalk.green('PASS');
45
+ }
46
+ else {
47
+ status = chalk.red('FAIL');
48
+ }
49
+ // Compact format
50
+ console.log(` ${inputDisplay.padEnd(50)} ${status}`);
51
+ // Verbose output
52
+ if (verbose || (!passed && !skipped && !expectedFailure)) {
53
+ if (error) {
54
+ console.log(chalk.red(` Error: ${error}`));
55
+ }
56
+ // Show assertion details
57
+ for (const ar of result.assertionResults) {
58
+ if (!ar.passed || verbose) {
59
+ const icon = ar.passed ? chalk.green('✓') : chalk.red('✗');
60
+ const msg = formatAssertion(ar);
61
+ console.log(` ${icon} ${msg}`);
62
+ }
63
+ }
64
+ // Always show actual output in verbose mode, or for failures
65
+ if (verbose || (!passed && !skipped)) {
66
+ console.log(chalk.gray(' ─── Output ───'));
67
+ for (const line of actualOutput.split('\n')) {
68
+ if (line.trim()) {
69
+ console.log(chalk.white(` ${line}`));
70
+ }
71
+ }
72
+ console.log(chalk.gray(' ─────────────'));
73
+ // Show events in verbose mode
74
+ if (verbose && result.actualEvents && result.actualEvents.length > 0) {
75
+ console.log(chalk.gray(` ─── Events (${result.actualEvents.length}) ───`));
76
+ for (const event of result.actualEvents) {
77
+ const dataStr = Object.keys(event.data).length > 0
78
+ ? ` ${chalk.gray(JSON.stringify(event.data))}`
79
+ : '';
80
+ console.log(chalk.blue(` • ${event.type}`) + dataStr);
81
+ }
82
+ console.log(chalk.gray(' ─────────────'));
83
+ }
84
+ }
85
+ // Show diff for failures with expected output
86
+ if (!passed && !skipped && command.expectedOutput.length > 0) {
87
+ console.log();
88
+ console.log(chalk.gray(' Expected:'));
89
+ for (const line of command.expectedOutput) {
90
+ console.log(chalk.green(` + ${line}`));
91
+ }
92
+ }
93
+ }
94
+ // Show reason for skips and expected failures
95
+ if (skipped || expectedFailure) {
96
+ const reason = result.assertionResults[0]?.assertion.reason;
97
+ if (reason) {
98
+ console.log(chalk.gray(` (${reason})`));
99
+ }
100
+ }
101
+ }
102
+ /**
103
+ * Format an assertion result for display
104
+ */
105
+ function formatAssertion(result) {
106
+ const { assertion, message } = result;
107
+ switch (assertion.type) {
108
+ case 'ok':
109
+ return message || 'Exact match';
110
+ case 'ok-contains':
111
+ return message || `Contains "${assertion.value}"`;
112
+ case 'ok-not-contains':
113
+ return message || `Does not contain "${assertion.value}"`;
114
+ case 'ok-matches':
115
+ return message || `Matches ${assertion.pattern}`;
116
+ case 'fail':
117
+ return `Expected failure: ${assertion.reason}`;
118
+ case 'skip':
119
+ return `Skipped: ${assertion.reason || 'no reason given'}`;
120
+ case 'todo':
121
+ return `TODO: ${assertion.reason || 'not implemented'}`;
122
+ case 'event-count':
123
+ return message || `Event count: ${assertion.eventCount}`;
124
+ case 'event-assert': {
125
+ const prefix = assertion.assertTrue ? 'assertTrue' : 'assertFalse';
126
+ const posStr = assertion.eventPosition ? ` Event ${assertion.eventPosition}:` : '';
127
+ const dataStr = assertion.eventData ? ` ${JSON.stringify(assertion.eventData)}` : '';
128
+ return message || `${prefix}:${posStr} ${assertion.eventType}${dataStr}`;
129
+ }
130
+ case 'state-assert': {
131
+ const prefix = assertion.assertTrue ? 'assertTrue' : 'assertFalse';
132
+ return message || `${prefix}: ${assertion.stateExpression}`;
133
+ }
134
+ default:
135
+ return message || 'Unknown assertion';
136
+ }
137
+ }
138
+ /**
139
+ * Report transcript summary
140
+ */
141
+ function reportTranscriptSummary(result) {
142
+ const { passed, failed, expectedFailures, skipped, duration } = result;
143
+ const parts = [];
144
+ if (passed > 0) {
145
+ parts.push(chalk.green(`${passed} passed`));
146
+ }
147
+ if (failed > 0) {
148
+ parts.push(chalk.red(`${failed} failed`));
149
+ }
150
+ if (expectedFailures > 0) {
151
+ parts.push(chalk.magenta(`${expectedFailures} expected failures`));
152
+ }
153
+ if (skipped > 0) {
154
+ parts.push(chalk.yellow(`${skipped} skipped`));
155
+ }
156
+ console.log(` ${parts.join(', ')} (${duration}ms)`);
157
+ }
158
+ /**
159
+ * Report results of running multiple transcripts
160
+ * Note: Individual transcripts should already be reported as they run.
161
+ * This function only shows the aggregate summary.
162
+ */
163
+ export function reportTestRun(result, options = {}) {
164
+ console.log();
165
+ console.log(chalk.bold('━'.repeat(60)));
166
+ console.log();
167
+ // Overall summary
168
+ const { totalPassed, totalFailed, totalExpectedFailures, totalSkipped, totalDuration } = result;
169
+ const total = totalPassed + totalFailed + totalExpectedFailures + totalSkipped;
170
+ console.log(chalk.bold(`Total: ${total} tests in ${result.transcripts.length} transcripts`));
171
+ const parts = [];
172
+ if (totalPassed > 0) {
173
+ parts.push(chalk.green(`${totalPassed} passed`));
174
+ }
175
+ if (totalFailed > 0) {
176
+ parts.push(chalk.red(`${totalFailed} failed`));
177
+ }
178
+ if (totalExpectedFailures > 0) {
179
+ parts.push(chalk.magenta(`${totalExpectedFailures} expected failures`));
180
+ }
181
+ if (totalSkipped > 0) {
182
+ parts.push(chalk.yellow(`${totalSkipped} skipped`));
183
+ }
184
+ console.log(parts.join(', '));
185
+ console.log(chalk.gray(`Duration: ${totalDuration}ms`));
186
+ console.log();
187
+ // Final status
188
+ if (totalFailed === 0) {
189
+ console.log(chalk.green.bold('✓ All tests passed!'));
190
+ }
191
+ else {
192
+ console.log(chalk.red.bold(`✗ ${totalFailed} test(s) failed`));
193
+ }
194
+ }
195
+ /**
196
+ * Get exit code based on results
197
+ */
198
+ export function getExitCode(result) {
199
+ if (result.totalFailed > 0) {
200
+ return 1;
201
+ }
202
+ return 0;
203
+ }
204
+ /**
205
+ * Generate a timestamp string for filenames
206
+ */
207
+ export function generateTimestamp() {
208
+ const now = new Date();
209
+ const year = now.getFullYear();
210
+ const month = String(now.getMonth() + 1).padStart(2, '0');
211
+ const day = String(now.getDate()).padStart(2, '0');
212
+ const hours = String(now.getHours()).padStart(2, '0');
213
+ const minutes = String(now.getMinutes()).padStart(2, '0');
214
+ const seconds = String(now.getSeconds()).padStart(2, '0');
215
+ return `${year}-${month}-${day}_${hours}-${minutes}-${seconds}`;
216
+ }
217
+ /**
218
+ * Write test results to a JSON file
219
+ */
220
+ export function writeResultsToJson(result, outputDir, timestamp) {
221
+ // Ensure output directory exists
222
+ if (!fs.existsSync(outputDir)) {
223
+ fs.mkdirSync(outputDir, { recursive: true });
224
+ }
225
+ const filename = `results_${timestamp}.json`;
226
+ const filepath = path.join(outputDir, filename);
227
+ // Write JSON with serializable data (strip non-serializable like RegExp)
228
+ const serializableResult = JSON.parse(JSON.stringify(result, (key, value) => {
229
+ if (value instanceof RegExp) {
230
+ return value.toString();
231
+ }
232
+ return value;
233
+ }));
234
+ fs.writeFileSync(filepath, JSON.stringify(serializableResult, null, 2));
235
+ return filepath;
236
+ }
237
+ /**
238
+ * Write a human-readable report to a text file
239
+ */
240
+ export function writeReportToFile(result, outputDir, timestamp) {
241
+ // Ensure output directory exists
242
+ if (!fs.existsSync(outputDir)) {
243
+ fs.mkdirSync(outputDir, { recursive: true });
244
+ }
245
+ const filename = `report_${timestamp}.txt`;
246
+ const filepath = path.join(outputDir, filename);
247
+ const lines = [];
248
+ lines.push('='.repeat(60));
249
+ lines.push('TRANSCRIPT TEST REPORT');
250
+ lines.push(`Generated: ${new Date().toISOString()}`);
251
+ lines.push('='.repeat(60));
252
+ lines.push('');
253
+ // Overall summary
254
+ const { totalPassed, totalFailed, totalExpectedFailures, totalSkipped, totalDuration } = result;
255
+ const total = totalPassed + totalFailed + totalExpectedFailures + totalSkipped;
256
+ lines.push(`Total: ${total} tests in ${result.transcripts.length} transcript(s)`);
257
+ lines.push(` Passed: ${totalPassed}`);
258
+ lines.push(` Failed: ${totalFailed}`);
259
+ lines.push(` Expected Failures: ${totalExpectedFailures}`);
260
+ lines.push(` Skipped: ${totalSkipped}`);
261
+ lines.push(` Duration: ${totalDuration}ms`);
262
+ lines.push('');
263
+ // Per-transcript details
264
+ for (const transcript of result.transcripts) {
265
+ lines.push('-'.repeat(60));
266
+ lines.push(`Transcript: ${transcript.transcript.filePath}`);
267
+ if (transcript.transcript.header.title) {
268
+ lines.push(` Title: ${transcript.transcript.header.title}`);
269
+ }
270
+ lines.push(` Results: ${transcript.passed} passed, ${transcript.failed} failed, ${transcript.expectedFailures} expected failures, ${transcript.skipped} skipped`);
271
+ lines.push('');
272
+ // Command details (only show failures in summary)
273
+ const failedCommands = transcript.commands.filter(c => !c.passed && !c.skipped && !c.expectedFailure);
274
+ if (failedCommands.length > 0) {
275
+ lines.push(' FAILURES:');
276
+ for (const cmd of failedCommands) {
277
+ lines.push(` Line ${cmd.command.lineNumber}: > ${cmd.command.input}`);
278
+ if (cmd.error) {
279
+ lines.push(` Error: ${cmd.error}`);
280
+ }
281
+ for (const ar of cmd.assertionResults) {
282
+ if (!ar.passed) {
283
+ lines.push(` - ${ar.message || formatAssertionPlain(ar.assertion)}`);
284
+ }
285
+ }
286
+ lines.push(' Actual output:');
287
+ for (const line of cmd.actualOutput.split('\n')) {
288
+ if (line.trim()) {
289
+ lines.push(` ${line}`);
290
+ }
291
+ }
292
+ lines.push('');
293
+ }
294
+ }
295
+ }
296
+ lines.push('='.repeat(60));
297
+ if (totalFailed === 0) {
298
+ lines.push('ALL TESTS PASSED');
299
+ }
300
+ else {
301
+ lines.push(`${totalFailed} TEST(S) FAILED`);
302
+ }
303
+ lines.push('='.repeat(60));
304
+ fs.writeFileSync(filepath, lines.join('\n'));
305
+ return filepath;
306
+ }
307
+ /**
308
+ * Format an assertion without chalk colors (for file output)
309
+ */
310
+ function formatAssertionPlain(assertion) {
311
+ switch (assertion.type) {
312
+ case 'ok':
313
+ return 'Exact match';
314
+ case 'ok-contains':
315
+ return `Contains "${assertion.value}"`;
316
+ case 'ok-not-contains':
317
+ return `Does not contain "${assertion.value}"`;
318
+ case 'ok-matches':
319
+ return `Matches ${assertion.pattern}`;
320
+ case 'fail':
321
+ return `Expected failure: ${assertion.reason}`;
322
+ case 'skip':
323
+ return `Skipped: ${assertion.reason || 'no reason given'}`;
324
+ case 'todo':
325
+ return `TODO: ${assertion.reason || 'not implemented'}`;
326
+ case 'event-count':
327
+ return `Event count: ${assertion.eventCount}`;
328
+ case 'event-assert': {
329
+ const prefix = assertion.assertTrue ? 'assertTrue' : 'assertFalse';
330
+ const posStr = assertion.eventPosition ? ` Event ${assertion.eventPosition}:` : '';
331
+ const dataStr = assertion.eventData ? ` ${JSON.stringify(assertion.eventData)}` : '';
332
+ return `${prefix}:${posStr} ${assertion.eventType}${dataStr}`;
333
+ }
334
+ case 'state-assert': {
335
+ const prefix = assertion.assertTrue ? 'assertTrue' : 'assertFalse';
336
+ return `${prefix}: ${assertion.stateExpression}`;
337
+ }
338
+ default:
339
+ return 'Unknown assertion';
340
+ }
341
+ }
342
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Transcript Runner
3
+ *
4
+ * Executes transcript commands against a loaded story and checks results.
5
+ */
6
+ import { Transcript, TranscriptResult, RunnerOptions } from './types';
7
+ /**
8
+ * Interface for the game engine
9
+ */
10
+ interface GameEngine {
11
+ executeCommand(input: string): Promise<string> | string;
12
+ getOutput?(): string;
13
+ lastEvents?: Array<{
14
+ type: string;
15
+ data?: any;
16
+ }>;
17
+ world?: WorldModel;
18
+ }
19
+ /**
20
+ * Minimal interface for world model state queries
21
+ */
22
+ interface WorldModel {
23
+ getEntityById?(id: string): any;
24
+ getEntity?(id: string): any;
25
+ findEntityByName?(name: string): any;
26
+ getAllEntities?(): any[];
27
+ getLocation?(entityId: string): string | undefined;
28
+ getContents?(containerId: string, options?: {
29
+ includeWorn?: boolean;
30
+ }): any[];
31
+ findWhere?(predicate: (entity: any) => boolean): any[];
32
+ findByTrait?(traitType: string): any[];
33
+ findPath?(fromRoomId: string, toRoomId: string): string[] | null;
34
+ getPlayer?(): any;
35
+ }
36
+ /**
37
+ * Run a single transcript against an engine
38
+ *
39
+ * If transcript has items (with directives), use the smart runner.
40
+ * Otherwise, fall back to legacy command-only execution.
41
+ */
42
+ export declare function runTranscript(transcript: Transcript, engine: GameEngine, options?: RunnerOptions): Promise<TranscriptResult>;
43
+ export {};
44
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,UAAU,EAWV,gBAAgB,EAChB,aAAa,EAEd,MAAM,SAAS,CAAC;AAIjB;;GAEG;AACH,UAAU,UAAU;IAClB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IACxD,SAAS,CAAC,IAAI,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;IACjD,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED;;GAEG;AACH,UAAU,UAAU;IAClB,aAAa,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC;IAChC,SAAS,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC;IAC5B,gBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC;IACrC,cAAc,CAAC,IAAI,GAAG,EAAE,CAAC;IACzB,WAAW,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACnD,WAAW,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,GAAG,EAAE,CAAC;IAC9E,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,GAAG,GAAG,EAAE,CAAC;IACvD,WAAW,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC;IACvC,QAAQ,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACjE,SAAS,CAAC,IAAI,GAAG,CAAC;CACnB;AAmBD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAoC3B"}