@toonstore/torm 0.2.0 → 0.4.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/dist/cli.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * TORM CLI
4
+ * Command-line interface for ToonStoreDB ORM
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
package/dist/cli.js ADDED
@@ -0,0 +1,549 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * TORM CLI
5
+ * Command-line interface for ToonStoreDB ORM
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ const child_process_1 = require("child_process");
42
+ const path = __importStar(require("path"));
43
+ const fs = __importStar(require("fs"));
44
+ const migrations_1 = require("./migrations");
45
+ const command = process.argv[2];
46
+ const subcommand = process.argv[3];
47
+ const args = process.argv.slice(3);
48
+ function printHelp() {
49
+ console.log(`
50
+ TORM CLI - ToonStoreDB ORM Tools
51
+
52
+ Usage:
53
+ torm <command> [options]
54
+
55
+ Commands:
56
+ studio Launch TORM Studio (visual database manager)
57
+ migrate:create <name> Create a new migration file
58
+ migrate:up [count] Run pending migrations (optional: number to run)
59
+ migrate:down [count] Rollback migrations (default: 1)
60
+ migrate:status Show migration status
61
+ help Show this help message
62
+
63
+ Examples:
64
+ torm studio # Start TORM Studio at http://localhost:4983
65
+ torm studio --port 8080 # Start on custom port
66
+
67
+ torm migrate:create add_age # Create migration file
68
+ torm migrate:up # Run all pending migrations
69
+ torm migrate:up 1 # Run 1 migration
70
+ torm migrate:down # Rollback last migration
71
+ torm migrate:down 2 # Rollback last 2 migrations
72
+ torm migrate:status # Show applied/pending migrations
73
+
74
+ Config:
75
+ Create torm.config.ts in your project root with DB credentials
76
+
77
+ For more info, visit: https://github.com/toonstore/torm
78
+ `);
79
+ }
80
+ function findConfig() {
81
+ const configPaths = [
82
+ path.join(process.cwd(), 'torm.config.ts'),
83
+ path.join(process.cwd(), 'torm.config.js'),
84
+ ];
85
+ for (const configPath of configPaths) {
86
+ if (fs.existsSync(configPath)) {
87
+ console.log(`📝 Found config: ${configPath}\n`);
88
+ try {
89
+ if (configPath.endsWith('.ts')) {
90
+ // Check if TypeScript loader is available
91
+ const hasLoader = checkTypeScriptLoader();
92
+ if (!hasLoader) {
93
+ console.error('⚠️ TypeScript config found but tsx/ts-node not installed');
94
+ console.error(' Install with: npm install -D tsx');
95
+ console.error(' Or use torm.config.js instead\n');
96
+ continue;
97
+ }
98
+ // Try to register TypeScript loader
99
+ try {
100
+ require('tsx/cjs');
101
+ }
102
+ catch {
103
+ try {
104
+ require('ts-node/register');
105
+ }
106
+ catch {
107
+ // Loader exists but can't register - try direct require anyway
108
+ }
109
+ }
110
+ const config = require(configPath);
111
+ return config.default || config;
112
+ }
113
+ else if (configPath.endsWith('.js')) {
114
+ const config = require(configPath);
115
+ return config.default || config;
116
+ }
117
+ }
118
+ catch (err) {
119
+ console.error(`⚠️ Error loading config: ${err.message}\n`);
120
+ }
121
+ }
122
+ }
123
+ return null;
124
+ }
125
+ async function studio() {
126
+ console.log('🚀 Starting TORM Studio...\n');
127
+ // Load config
128
+ const config = findConfig();
129
+ // If no config found, create one based on project type
130
+ if (!config) {
131
+ console.log('⚠️ No torm.config found in current directory\n');
132
+ console.log('Creating a default config for you...\n');
133
+ // Detect project type
134
+ const isTypeScriptProject = detectTypeScriptProject();
135
+ if (isTypeScriptProject) {
136
+ console.log('📦 TypeScript project detected');
137
+ // Check for TypeScript loaders
138
+ const hasTsxOrTsNode = checkTypeScriptLoader();
139
+ if (!hasTsxOrTsNode) {
140
+ console.log('⚠️ TypeScript runtime not found');
141
+ console.log(' Installing tsx for TypeScript support...\n');
142
+ // Try to install tsx
143
+ try {
144
+ const { execSync } = require('child_process');
145
+ execSync('npm install -D tsx', { stdio: 'inherit' });
146
+ console.log('\n✅ Installed tsx\n');
147
+ createTypeScriptConfig();
148
+ }
149
+ catch (e) {
150
+ console.log('\n⚠️ Could not auto-install tsx');
151
+ console.log(' Creating .js config instead\n');
152
+ createJavaScriptConfig();
153
+ }
154
+ }
155
+ else {
156
+ createTypeScriptConfig();
157
+ }
158
+ }
159
+ else {
160
+ console.log('📦 JavaScript project detected');
161
+ createJavaScriptConfig();
162
+ }
163
+ console.log('✅ Created config file');
164
+ console.log(' Edit this file with your database credentials\n');
165
+ console.log(' Then run `torm studio` again\n');
166
+ process.exit(0);
167
+ }
168
+ // Get port from args or config or default
169
+ let port = 4983; // Drizzle uses 4983
170
+ if (args.includes('--port')) {
171
+ port = parseInt(args[args.indexOf('--port') + 1]);
172
+ }
173
+ else if (config.studio?.port) {
174
+ port = config.studio.port;
175
+ }
176
+ // Check if studio-server.js exists
177
+ const serverPath = path.join(__dirname, 'studio-server.js');
178
+ if (!fs.existsSync(serverPath)) {
179
+ console.error('❌ Studio server not found!');
180
+ console.error(' Expected at:', serverPath);
181
+ console.error('\n💡 Run `npm run build` first\n');
182
+ process.exit(1);
183
+ }
184
+ console.log('📍 Starting TORM Studio server...\n');
185
+ // Pass config to server via environment
186
+ const env = {
187
+ ...process.env,
188
+ PORT: port.toString(),
189
+ TOONSTORE_HOST: config.dbCredentials?.host || 'localhost',
190
+ TOONSTORE_PORT: (config.dbCredentials?.port || 6379).toString(),
191
+ TOONSTORE_URL: config.dbCredentials?.url || '',
192
+ TOONSTORE_PASSWORD: config.dbCredentials?.password || '',
193
+ };
194
+ const server = (0, child_process_1.spawn)('node', [serverPath], {
195
+ stdio: 'inherit',
196
+ env,
197
+ });
198
+ server.on('error', (err) => {
199
+ console.error('\n❌ Error starting TORM Studio:');
200
+ console.error(' ', err.message);
201
+ process.exit(1);
202
+ });
203
+ server.on('close', (code) => {
204
+ if (code !== 0) {
205
+ console.log(`\n⚠️ TORM Studio exited with code ${code}`);
206
+ }
207
+ });
208
+ // Handle Ctrl+C gracefully
209
+ process.on('SIGINT', () => {
210
+ console.log('\n\n👋 Shutting down TORM Studio...');
211
+ server.kill('SIGINT');
212
+ process.exit(0);
213
+ });
214
+ }
215
+ async function migrate() {
216
+ const action = command.split(':')[1]; // migrate:create, migrate:up, etc.
217
+ const config = findConfig();
218
+ if (!config) {
219
+ console.error('❌ No torm.config.ts found');
220
+ console.error(' Create one first by running: torm studio\n');
221
+ process.exit(1);
222
+ }
223
+ const dbOptions = {
224
+ host: config.dbCredentials?.host || process.env.TOONSTORE_HOST || 'localhost',
225
+ port: config.dbCredentials?.port || Number(process.env.TOONSTORE_PORT) || 6379,
226
+ url: config.dbCredentials?.url || process.env.TOONSTORE_URL,
227
+ };
228
+ const migrationsDir = config.migrations?.directory || path.join(process.cwd(), 'migrations');
229
+ const runner = new migrations_1.MigrationRunner(dbOptions, migrationsDir);
230
+ try {
231
+ switch (action) {
232
+ case 'create': {
233
+ const name = subcommand;
234
+ if (!name) {
235
+ console.error('❌ Migration name required');
236
+ console.error(' Usage: torm migrate:create <name>\n');
237
+ process.exit(1);
238
+ }
239
+ await runner.create(name);
240
+ break;
241
+ }
242
+ case 'up': {
243
+ const count = subcommand ? parseInt(subcommand) : undefined;
244
+ await runner.up(count);
245
+ break;
246
+ }
247
+ case 'down': {
248
+ const count = subcommand ? parseInt(subcommand) : 1;
249
+ await runner.down(count);
250
+ break;
251
+ }
252
+ case 'status': {
253
+ await runner.status();
254
+ break;
255
+ }
256
+ default:
257
+ console.error(`❌ Unknown migration command: ${action}`);
258
+ console.error(' Use: create, up, down, or status\n');
259
+ process.exit(1);
260
+ }
261
+ }
262
+ catch (error) {
263
+ console.error(`\n❌ Migration error: ${error.message}\n`);
264
+ process.exit(1);
265
+ }
266
+ finally {
267
+ await runner.close();
268
+ }
269
+ }
270
+ async function generate() {
271
+ console.log('🔧 Generating TypeScript types from database...\n');
272
+ const config = findConfig();
273
+ if (!config) {
274
+ console.error('❌ No torm.config found');
275
+ console.error(' Create torm.config.js first\n');
276
+ process.exit(1);
277
+ }
278
+ const dbOptions = {
279
+ host: config.dbCredentials?.host || process.env.TOONSTORE_HOST || 'localhost',
280
+ port: config.dbCredentials?.port || Number(process.env.TOONSTORE_PORT) || 6379,
281
+ url: config.dbCredentials?.url || process.env.TOONSTORE_URL,
282
+ };
283
+ const Redis = require('ioredis');
284
+ const redis = dbOptions.url ? new Redis(dbOptions.url) : new Redis(dbOptions);
285
+ try {
286
+ console.log('📊 Scanning database for collections...\n');
287
+ // Get all keys
288
+ const allKeys = await redis.keys('toonstore:*');
289
+ if (allKeys.length === 0) {
290
+ console.log('⚠️ No data found in database');
291
+ console.log('💡 Create some models and data first, then run generate\n');
292
+ await redis.quit();
293
+ process.exit(0);
294
+ }
295
+ // Group keys by model name
296
+ const modelMap = {};
297
+ for (const key of allKeys) {
298
+ // Key format: toonstore:ModelName:id
299
+ const parts = key.split(':');
300
+ if (parts.length >= 3 && parts[0] === 'toonstore') {
301
+ const modelName = parts[1];
302
+ if (modelName === '_migrations')
303
+ continue; // Skip internal keys
304
+ if (!modelMap[modelName]) {
305
+ modelMap[modelName] = [];
306
+ }
307
+ const data = await redis.get(key);
308
+ if (data) {
309
+ try {
310
+ const parsed = JSON.parse(data);
311
+ modelMap[modelName].push(parsed);
312
+ }
313
+ catch (e) {
314
+ // Skip invalid JSON
315
+ }
316
+ }
317
+ }
318
+ }
319
+ const modelNames = Object.keys(modelMap);
320
+ if (modelNames.length === 0) {
321
+ console.log('⚠️ No valid models found in database\n');
322
+ await redis.quit();
323
+ process.exit(0);
324
+ }
325
+ console.log(`✅ Found ${modelNames.length} model(s): ${modelNames.join(', ')}\n`);
326
+ // Generate TypeScript interfaces
327
+ let output = `/**
328
+ * Auto-generated TypeScript types from ToonStoreDB
329
+ * Generated: ${new Date().toISOString()}
330
+ *
331
+ * ⚠️ DO NOT EDIT MANUALLY - This file is auto-generated
332
+ * Run 'npx torm generate' to regenerate
333
+ */
334
+
335
+ `;
336
+ for (const modelName of modelNames) {
337
+ const documents = modelMap[modelName];
338
+ console.log(`📝 Analyzing ${modelName} (${documents.length} document${documents.length > 1 ? 's' : ''})...`);
339
+ // Infer types from all documents
340
+ const fieldTypes = {};
341
+ for (const doc of documents) {
342
+ for (const [field, value] of Object.entries(doc)) {
343
+ if (!fieldTypes[field]) {
344
+ fieldTypes[field] = new Set();
345
+ }
346
+ fieldTypes[field].add(inferType(value));
347
+ }
348
+ }
349
+ // Generate interface - capitalize first letter for TypeScript convention
350
+ const interfaceName = modelName.charAt(0).toUpperCase() + modelName.slice(1);
351
+ output += `export interface ${interfaceName} {\n`;
352
+ // Sort fields: _id and metadata first, then alphabetically
353
+ const fields = Object.keys(fieldTypes).sort((a, b) => {
354
+ if (a.startsWith('_') && !b.startsWith('_'))
355
+ return -1;
356
+ if (!a.startsWith('_') && b.startsWith('_'))
357
+ return 1;
358
+ return a.localeCompare(b);
359
+ });
360
+ for (const field of fields) {
361
+ const types = Array.from(fieldTypes[field]);
362
+ const typeStr = types.length > 1 ? types.join(' | ') : types[0];
363
+ // Check if field is optional (not present in all documents)
364
+ const isOptional = documents.some(doc => !(field in doc));
365
+ const optionalMarker = isOptional ? '?' : '';
366
+ output += ` ${field}${optionalMarker}: ${typeStr};\n`;
367
+ }
368
+ output += `}\n\n`;
369
+ }
370
+ // Write to file
371
+ const outputDir = path.join(process.cwd(), 'src', 'generated');
372
+ const outputFile = path.join(outputDir, 'torm-types.ts');
373
+ if (!fs.existsSync(outputDir)) {
374
+ fs.mkdirSync(outputDir, { recursive: true });
375
+ }
376
+ fs.writeFileSync(outputFile, output);
377
+ console.log(`\n✅ Generated types for ${modelNames.length} model(s)`);
378
+ console.log(`📄 Output: ${outputFile}\n`);
379
+ console.log('💡 Usage:');
380
+ const interfaceNames = modelNames.map(name => name.charAt(0).toUpperCase() + name.slice(1));
381
+ console.log(` import { ${interfaceNames.join(', ')} } from './generated/torm-types';\n`);
382
+ await redis.quit();
383
+ }
384
+ catch (error) {
385
+ console.error(`\n❌ Error: ${error.message}\n`);
386
+ await redis.quit();
387
+ process.exit(1);
388
+ }
389
+ }
390
+ function inferType(value) {
391
+ if (value === null)
392
+ return 'null';
393
+ if (value === undefined)
394
+ return 'undefined';
395
+ const type = typeof value;
396
+ if (type === 'string')
397
+ return 'string';
398
+ if (type === 'number')
399
+ return 'number';
400
+ if (type === 'boolean')
401
+ return 'boolean';
402
+ if (Array.isArray(value)) {
403
+ if (value.length === 0)
404
+ return 'any[]';
405
+ // Infer array element types
406
+ const elementTypes = new Set(value.map(inferType));
407
+ if (elementTypes.size === 1) {
408
+ return `${Array.from(elementTypes)[0]}[]`;
409
+ }
410
+ return `(${Array.from(elementTypes).join(' | ')})[]`;
411
+ }
412
+ if (type === 'object')
413
+ return 'any'; // Could be more sophisticated
414
+ return 'any';
415
+ }
416
+ function detectTypeScriptProject() {
417
+ const cwd = process.cwd();
418
+ // Check for tsconfig.json
419
+ if (fs.existsSync(path.join(cwd, 'tsconfig.json'))) {
420
+ return true;
421
+ }
422
+ // Check package.json for TypeScript
423
+ const pkgPath = path.join(cwd, 'package.json');
424
+ if (fs.existsSync(pkgPath)) {
425
+ try {
426
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
427
+ // Check dependencies
428
+ const allDeps = {
429
+ ...pkg.dependencies,
430
+ ...pkg.devDependencies,
431
+ };
432
+ if (allDeps['typescript'] || allDeps['@types/node']) {
433
+ return true;
434
+ }
435
+ // Check if main/types field points to .ts files
436
+ if (pkg.main?.endsWith('.ts') || pkg.types?.endsWith('.ts')) {
437
+ return true;
438
+ }
439
+ }
440
+ catch (e) {
441
+ // Invalid package.json, assume JS
442
+ }
443
+ }
444
+ // Default to JavaScript
445
+ return false;
446
+ }
447
+ function checkTypeScriptLoader() {
448
+ const pkgPath = path.join(process.cwd(), 'package.json');
449
+ if (fs.existsSync(pkgPath)) {
450
+ try {
451
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
452
+ const allDeps = {
453
+ ...pkg.dependencies,
454
+ ...pkg.devDependencies,
455
+ };
456
+ return !!(allDeps['tsx'] || allDeps['ts-node']);
457
+ }
458
+ catch (e) {
459
+ return false;
460
+ }
461
+ }
462
+ return false;
463
+ }
464
+ function createTypeScriptConfig() {
465
+ const config = `/**
466
+ * TORM Configuration
467
+ * Define your ToonStoreDB connection here
468
+ */
469
+
470
+ export default {
471
+ // ToonStoreDB connection
472
+ dbCredentials: {
473
+ host: 'localhost',
474
+ port: 6379,
475
+ // For cloud/remote databases:
476
+ // password: process.env.TOONSTORE_PASSWORD,
477
+ // url: 'redis://user:pass@host:port',
478
+ },
479
+
480
+ // Studio configuration
481
+ studio: {
482
+ port: 4983,
483
+ },
484
+
485
+ // Migrations directory (optional)
486
+ migrations: {
487
+ directory: './migrations',
488
+ },
489
+ };
490
+ `;
491
+ fs.writeFileSync(path.join(process.cwd(), 'torm.config.ts'), config);
492
+ console.log('📄 Created: torm.config.ts');
493
+ }
494
+ function createJavaScriptConfig() {
495
+ const config = `/**
496
+ * TORM Configuration
497
+ * Define your ToonStoreDB connection here
498
+ */
499
+
500
+ module.exports = {
501
+ // ToonStoreDB connection
502
+ dbCredentials: {
503
+ host: 'localhost',
504
+ port: 6379,
505
+ // For cloud/remote databases:
506
+ // password: process.env.TOONSTORE_PASSWORD,
507
+ // url: 'redis://user:pass@host:port',
508
+ },
509
+
510
+ // Studio configuration
511
+ studio: {
512
+ port: 4983,
513
+ },
514
+
515
+ // Migrations directory (optional)
516
+ migrations: {
517
+ directory: './migrations',
518
+ },
519
+ };
520
+ `;
521
+ fs.writeFileSync(path.join(process.cwd(), 'torm.config.js'), config);
522
+ console.log('📄 Created: torm.config.js');
523
+ }
524
+ // Main CLI logic
525
+ const fullCommand = command || '';
526
+ if (fullCommand.startsWith('migrate:')) {
527
+ migrate();
528
+ }
529
+ else {
530
+ switch (command) {
531
+ case 'studio':
532
+ studio();
533
+ break;
534
+ case 'generate':
535
+ generate();
536
+ break;
537
+ case 'help':
538
+ case '--help':
539
+ case '-h':
540
+ case undefined:
541
+ printHelp();
542
+ break;
543
+ default:
544
+ console.error(`❌ Unknown command: ${command}\n`);
545
+ printHelp();
546
+ process.exit(1);
547
+ }
548
+ }
549
+ //# 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,62 @@
1
+ /**
2
+ * TORM Migration System
3
+ * Handles data-shape migrations for schemaless ToonStoreDB
4
+ */
5
+ import Redis from 'ioredis';
6
+ export interface Migration {
7
+ name: string;
8
+ timestamp: string;
9
+ up: (client: Redis) => Promise<void>;
10
+ down: (client: Redis) => Promise<void>;
11
+ }
12
+ export declare class MigrationRunner {
13
+ private redis;
14
+ private migrationsDir;
15
+ private migrationKey;
16
+ constructor(redisOptions: {
17
+ host?: string;
18
+ port?: number;
19
+ url?: string;
20
+ }, migrationsDir?: string);
21
+ /**
22
+ * Get list of applied migrations from database
23
+ */
24
+ getAppliedMigrations(): Promise<string[]>;
25
+ /**
26
+ * Save applied migrations to database
27
+ */
28
+ saveAppliedMigrations(migrations: string[]): Promise<void>;
29
+ /**
30
+ * Get list of migration files from directory
31
+ */
32
+ getMigrationFiles(): string[];
33
+ /**
34
+ * Load a migration module
35
+ */
36
+ loadMigration(filename: string): Promise<Migration>;
37
+ /**
38
+ * Get pending migrations that haven't been applied yet
39
+ */
40
+ getPendingMigrations(): Promise<Migration[]>;
41
+ /**
42
+ * Run pending migrations
43
+ */
44
+ up(count?: number): Promise<void>;
45
+ /**
46
+ * Rollback last migration
47
+ */
48
+ down(count?: number): Promise<void>;
49
+ /**
50
+ * Show migration status
51
+ */
52
+ status(): Promise<void>;
53
+ /**
54
+ * Create a new migration file
55
+ */
56
+ create(name: string): Promise<void>;
57
+ /**
58
+ * Close Redis connection
59
+ */
60
+ close(): Promise<void>;
61
+ }
62
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,SAAS,CAAC;AAI5B,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,CAAC,MAAM,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAA2B;gBAEnC,YAAY,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,aAAa,CAAC,EAAE,MAAM;IAahG;;OAEG;IACG,oBAAoB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAK/C;;OAEG;IACG,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE;;OAEG;IACH,iBAAiB,IAAI,MAAM,EAAE;IAW7B;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAoBzD;;OAEG;IACG,oBAAoB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAgBlD;;OAEG;IACG,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BvC;;OAEG;IACG,IAAI,CAAC,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAyC5C;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB7B;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkEzC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}