atlas-pipeline-mcp 1.0.21 → 1.0.22
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/tools/advanced-testgen.d.ts +93 -0
- package/dist/tools/advanced-testgen.d.ts.map +1 -0
- package/dist/tools/advanced-testgen.js +382 -0
- package/dist/tools/advanced-testgen.js.map +1 -0
- package/dist/tools/architecture-advisor.d.ts +174 -0
- package/dist/tools/architecture-advisor.d.ts.map +1 -0
- package/dist/tools/architecture-advisor.js +509 -0
- package/dist/tools/architecture-advisor.js.map +1 -0
- package/dist/tools/code-migration.d.ts +86 -0
- package/dist/tools/code-migration.d.ts.map +1 -0
- package/dist/tools/code-migration.js +339 -0
- package/dist/tools/code-migration.js.map +1 -0
- package/dist/tools/ml-predictor.d.ts +84 -0
- package/dist/tools/ml-predictor.d.ts.map +1 -0
- package/dist/tools/ml-predictor.js +407 -0
- package/dist/tools/ml-predictor.js.map +1 -0
- package/dist/tools/rag-search.d.ts +88 -0
- package/dist/tools/rag-search.d.ts.map +1 -0
- package/dist/tools/rag-search.js +338 -0
- package/dist/tools/rag-search.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atlas Server - Intelligent Code Migration Assistant
|
|
3
|
+
*
|
|
4
|
+
* AI-powered code migration and modernization:
|
|
5
|
+
* - Framework upgrades (React 17→18, Vue 2→3, etc.)
|
|
6
|
+
* - Language conversion (JS→TS, Python 2→3)
|
|
7
|
+
* - API migration (deprecated→modern APIs)
|
|
8
|
+
* - Dependency upgrades with breaking change handling
|
|
9
|
+
* - Architecture modernization (Class→Functional, Callbacks→Promises→Async/Await)
|
|
10
|
+
* - Build tool migration (Webpack→Vite, etc.)
|
|
11
|
+
* - Database migration generation
|
|
12
|
+
* - CI/CD pipeline modernization
|
|
13
|
+
*
|
|
14
|
+
* @module code-migration
|
|
15
|
+
* @author Nishant Unavane
|
|
16
|
+
* @version 1.0.0
|
|
17
|
+
*/
|
|
18
|
+
import { promises as fs } from 'fs';
|
|
19
|
+
import { join } from 'path';
|
|
20
|
+
import { logger, createTimer } from '../utils.js';
|
|
21
|
+
import { z } from 'zod';
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Validation Schema
|
|
24
|
+
// ============================================================================
|
|
25
|
+
const MigrationOptionsSchema = z.object({
|
|
26
|
+
projectPath: z.string().min(1),
|
|
27
|
+
migrationType: z.enum([
|
|
28
|
+
'javascript-to-typescript',
|
|
29
|
+
'react-upgrade',
|
|
30
|
+
'vue-upgrade',
|
|
31
|
+
'python-2-to-3',
|
|
32
|
+
'class-to-functional',
|
|
33
|
+
'callback-to-async',
|
|
34
|
+
'webpack-to-vite',
|
|
35
|
+
'jest-to-vitest',
|
|
36
|
+
'commonjs-to-esm',
|
|
37
|
+
'api-migration',
|
|
38
|
+
'database-migration',
|
|
39
|
+
'custom',
|
|
40
|
+
]),
|
|
41
|
+
from: z.string(),
|
|
42
|
+
to: z.string(),
|
|
43
|
+
files: z.array(z.string()).optional(),
|
|
44
|
+
filePattern: z.string().optional(),
|
|
45
|
+
strategy: z.enum(['safe', 'aggressive', 'manual']).optional(),
|
|
46
|
+
preserveComments: z.boolean().optional(),
|
|
47
|
+
createBackup: z.boolean().optional(),
|
|
48
|
+
dryRun: z.boolean().optional(),
|
|
49
|
+
handleBreakingChanges: z.boolean().optional(),
|
|
50
|
+
updateDependencies: z.boolean().optional(),
|
|
51
|
+
generateTests: z.boolean().optional(),
|
|
52
|
+
});
|
|
53
|
+
// ============================================================================
|
|
54
|
+
// Migration Strategies
|
|
55
|
+
// ============================================================================
|
|
56
|
+
/**
|
|
57
|
+
* Migrate JavaScript to TypeScript
|
|
58
|
+
*/
|
|
59
|
+
async function migrateJSToTS(code, filePath) {
|
|
60
|
+
const changes = [];
|
|
61
|
+
const lines = code.split('\n');
|
|
62
|
+
// Add type annotations to function parameters
|
|
63
|
+
const functionPattern = /function\s+(\w+)\s*\(([^)]*)\)/g;
|
|
64
|
+
let match;
|
|
65
|
+
while ((match = functionPattern.exec(code)) !== null) {
|
|
66
|
+
const funcName = match[1];
|
|
67
|
+
const params = match[2];
|
|
68
|
+
if (params && !params.includes(':')) {
|
|
69
|
+
const typedParams = params.split(',').map(p => `${p.trim()}: any`).join(', ');
|
|
70
|
+
const before = match[0];
|
|
71
|
+
const after = `function ${funcName}(${typedParams}): any`;
|
|
72
|
+
changes.push({
|
|
73
|
+
filePath,
|
|
74
|
+
changeType: 'type-annotation',
|
|
75
|
+
description: `Added type annotations to function ${funcName}`,
|
|
76
|
+
before,
|
|
77
|
+
after,
|
|
78
|
+
automated: true,
|
|
79
|
+
confidence: 0.7,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Convert var to let/const
|
|
84
|
+
const varPattern = /\bvar\s+(\w+)/g;
|
|
85
|
+
while ((match = varPattern.exec(code)) !== null) {
|
|
86
|
+
changes.push({
|
|
87
|
+
filePath,
|
|
88
|
+
changeType: 'syntax',
|
|
89
|
+
description: 'Converted var to const/let',
|
|
90
|
+
before: `var ${match[1]}`,
|
|
91
|
+
after: `const ${match[1]}`,
|
|
92
|
+
automated: true,
|
|
93
|
+
confidence: 0.9,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return changes;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Migrate from callbacks to async/await
|
|
100
|
+
*/
|
|
101
|
+
async function migrateCallbackToAsync(code, filePath) {
|
|
102
|
+
const changes = [];
|
|
103
|
+
// Detect callback patterns
|
|
104
|
+
const callbackPattern = /(\w+)\s*\([^)]*,\s*function\s*\(([^)]*)\)\s*{([^}]*)}/g;
|
|
105
|
+
let match;
|
|
106
|
+
while ((match = callbackPattern.exec(code)) !== null) {
|
|
107
|
+
const funcName = match[1];
|
|
108
|
+
const params = match[2];
|
|
109
|
+
const body = match[3];
|
|
110
|
+
if (!funcName || !body)
|
|
111
|
+
continue;
|
|
112
|
+
// Convert to async/await
|
|
113
|
+
const before = match[0];
|
|
114
|
+
const after = `const result = await ${funcName}Async();\n// Process: ${body.trim()}`;
|
|
115
|
+
changes.push({
|
|
116
|
+
filePath,
|
|
117
|
+
changeType: 'syntax',
|
|
118
|
+
description: `Converted callback to async/await for ${funcName}`,
|
|
119
|
+
before,
|
|
120
|
+
after,
|
|
121
|
+
automated: false, // Requires manual verification
|
|
122
|
+
confidence: 0.6,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return changes;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Migrate React class components to functional
|
|
129
|
+
*/
|
|
130
|
+
async function migrateReactClassToFunctional(code, filePath) {
|
|
131
|
+
const changes = [];
|
|
132
|
+
// Detect class components
|
|
133
|
+
if (/class\s+\w+\s+extends\s+React\.Component/.test(code)) {
|
|
134
|
+
changes.push({
|
|
135
|
+
filePath,
|
|
136
|
+
changeType: 'structure',
|
|
137
|
+
description: 'Convert class component to functional component with hooks',
|
|
138
|
+
before: code.substring(0, 100) + '...',
|
|
139
|
+
after: '// Converted to functional component\nconst Component = () => {\n // Use useState, useEffect hooks\n}',
|
|
140
|
+
automated: false,
|
|
141
|
+
confidence: 0.5,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// Convert this.state to useState
|
|
145
|
+
const statePattern = /this\.state\.(\w+)/g;
|
|
146
|
+
let match;
|
|
147
|
+
const stateVars = new Set();
|
|
148
|
+
while ((match = statePattern.exec(code)) !== null) {
|
|
149
|
+
if (match[1]) {
|
|
150
|
+
stateVars.add(match[1]);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (stateVars.size > 0) {
|
|
154
|
+
changes.push({
|
|
155
|
+
filePath,
|
|
156
|
+
changeType: 'api',
|
|
157
|
+
description: `Convert ${stateVars.size} state variables to useState hooks`,
|
|
158
|
+
before: `this.state = { ${Array.from(stateVars).join(', ')} }`,
|
|
159
|
+
after: Array.from(stateVars).map(v => `const [${v}, set${v.charAt(0).toUpperCase() + v.slice(1)}] = useState()`).join('\n'),
|
|
160
|
+
automated: false,
|
|
161
|
+
confidence: 0.7,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return changes;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Migrate CommonJS to ESM
|
|
168
|
+
*/
|
|
169
|
+
async function migrateCommonJSToESM(code, filePath) {
|
|
170
|
+
const changes = [];
|
|
171
|
+
// Convert require to import
|
|
172
|
+
const requirePattern = /const\s+(\w+)\s*=\s*require\(['"]([^'"]+)['"]\)/g;
|
|
173
|
+
let match;
|
|
174
|
+
while ((match = requirePattern.exec(code)) !== null) {
|
|
175
|
+
const varName = match[1];
|
|
176
|
+
const modulePath = match[2];
|
|
177
|
+
changes.push({
|
|
178
|
+
filePath,
|
|
179
|
+
changeType: 'import',
|
|
180
|
+
description: 'Convert require to import',
|
|
181
|
+
before: match[0],
|
|
182
|
+
after: `import ${varName} from '${modulePath}'`,
|
|
183
|
+
automated: true,
|
|
184
|
+
confidence: 0.95,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
// Convert module.exports to export
|
|
188
|
+
if (/module\.exports\s*=/.test(code)) {
|
|
189
|
+
changes.push({
|
|
190
|
+
filePath,
|
|
191
|
+
changeType: 'export',
|
|
192
|
+
description: 'Convert module.exports to export default',
|
|
193
|
+
before: 'module.exports = ',
|
|
194
|
+
after: 'export default ',
|
|
195
|
+
automated: true,
|
|
196
|
+
confidence: 0.9,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
return changes;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Detect breaking changes
|
|
203
|
+
*/
|
|
204
|
+
function detectBreakingChanges(changes, migrationType) {
|
|
205
|
+
const breakingChanges = [];
|
|
206
|
+
// API changes with low confidence are potential breaking changes
|
|
207
|
+
const riskyChanges = changes.filter(c => c.changeType === 'api' && c.confidence < 0.8);
|
|
208
|
+
for (const change of riskyChanges) {
|
|
209
|
+
breakingChanges.push({
|
|
210
|
+
filePath: change.filePath,
|
|
211
|
+
issue: change.description,
|
|
212
|
+
impact: 'medium',
|
|
213
|
+
manualAction: 'Review and test this change carefully',
|
|
214
|
+
documentation: 'Check official migration guide',
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
return breakingChanges;
|
|
218
|
+
}
|
|
219
|
+
// ============================================================================
|
|
220
|
+
// Main Migration Function
|
|
221
|
+
// ============================================================================
|
|
222
|
+
/**
|
|
223
|
+
* Intelligent code migration
|
|
224
|
+
*/
|
|
225
|
+
export async function migrateCode(options) {
|
|
226
|
+
const timer = createTimer();
|
|
227
|
+
const { projectPath, migrationType, from, to, files = [], strategy = 'safe', preserveComments = true, createBackup = true, dryRun = false, handleBreakingChanges = true, } = MigrationOptionsSchema.parse(options);
|
|
228
|
+
logger.info({ migrationType, from, to, dryRun }, 'Starting code migration');
|
|
229
|
+
// Collect files to migrate
|
|
230
|
+
const targetFiles = files.length > 0 ? files : [
|
|
231
|
+
join(projectPath, 'src', 'index.ts'),
|
|
232
|
+
];
|
|
233
|
+
let allChanges = [];
|
|
234
|
+
let filesAnalyzed = 0;
|
|
235
|
+
let filesMigrated = 0;
|
|
236
|
+
let filesSkipped = 0;
|
|
237
|
+
// Process each file
|
|
238
|
+
for (const filePath of targetFiles) {
|
|
239
|
+
try {
|
|
240
|
+
const code = await fs.readFile(filePath, 'utf-8');
|
|
241
|
+
filesAnalyzed++;
|
|
242
|
+
let changes = [];
|
|
243
|
+
// Apply migration strategy
|
|
244
|
+
switch (migrationType) {
|
|
245
|
+
case 'javascript-to-typescript':
|
|
246
|
+
changes = await migrateJSToTS(code, filePath);
|
|
247
|
+
break;
|
|
248
|
+
case 'callback-to-async':
|
|
249
|
+
changes = await migrateCallbackToAsync(code, filePath);
|
|
250
|
+
break;
|
|
251
|
+
case 'class-to-functional':
|
|
252
|
+
changes = await migrateReactClassToFunctional(code, filePath);
|
|
253
|
+
break;
|
|
254
|
+
case 'commonjs-to-esm':
|
|
255
|
+
changes = await migrateCommonJSToESM(code, filePath);
|
|
256
|
+
break;
|
|
257
|
+
default:
|
|
258
|
+
logger.warn({ migrationType }, 'Migration type not yet implemented');
|
|
259
|
+
}
|
|
260
|
+
if (changes.length > 0) {
|
|
261
|
+
allChanges = allChanges.concat(changes);
|
|
262
|
+
filesMigrated++;
|
|
263
|
+
// Apply changes if not dry run
|
|
264
|
+
if (!dryRun && strategy === 'aggressive') {
|
|
265
|
+
let newCode = code;
|
|
266
|
+
for (const change of changes.filter(c => c.automated)) {
|
|
267
|
+
newCode = newCode.replace(change.before, change.after);
|
|
268
|
+
}
|
|
269
|
+
if (createBackup) {
|
|
270
|
+
await fs.writeFile(`${filePath}.backup`, code);
|
|
271
|
+
}
|
|
272
|
+
await fs.writeFile(filePath, newCode);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
filesSkipped++;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
logger.error({ error, filePath }, 'Error processing file');
|
|
281
|
+
filesSkipped++;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Detect breaking changes
|
|
285
|
+
const breakingChanges = handleBreakingChanges
|
|
286
|
+
? detectBreakingChanges(allChanges, migrationType)
|
|
287
|
+
: [];
|
|
288
|
+
// Generate warnings
|
|
289
|
+
const warnings = [];
|
|
290
|
+
if (allChanges.some(c => !c.automated)) {
|
|
291
|
+
warnings.push({
|
|
292
|
+
filePath: 'multiple',
|
|
293
|
+
message: 'Some changes require manual intervention',
|
|
294
|
+
severity: 'warning',
|
|
295
|
+
suggestion: 'Review all changes marked as manual',
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
const stats = {
|
|
299
|
+
linesChanged: allChanges.length,
|
|
300
|
+
apiCallsUpdated: allChanges.filter(c => c.changeType === 'api').length,
|
|
301
|
+
dependenciesUpdated: 0,
|
|
302
|
+
testsGenerated: 0,
|
|
303
|
+
backupsCreated: createBackup ? filesMigrated : 0,
|
|
304
|
+
};
|
|
305
|
+
const recommendations = [
|
|
306
|
+
'Run all tests after migration',
|
|
307
|
+
'Review breaking changes carefully',
|
|
308
|
+
'Update documentation to reflect changes',
|
|
309
|
+
'Consider gradual rollout of migrated code',
|
|
310
|
+
];
|
|
311
|
+
const migrationTimeMs = timer.elapsed();
|
|
312
|
+
logger.info({
|
|
313
|
+
filesMigrated,
|
|
314
|
+
changesCount: allChanges.length,
|
|
315
|
+
breakingChanges: breakingChanges.length,
|
|
316
|
+
migrationTimeMs
|
|
317
|
+
}, 'Migration completed');
|
|
318
|
+
return {
|
|
319
|
+
success: true,
|
|
320
|
+
migrationType,
|
|
321
|
+
from,
|
|
322
|
+
to,
|
|
323
|
+
filesAnalyzed,
|
|
324
|
+
filesMigrated,
|
|
325
|
+
filesSkipped,
|
|
326
|
+
changes: allChanges,
|
|
327
|
+
breakingChanges,
|
|
328
|
+
warnings,
|
|
329
|
+
stats,
|
|
330
|
+
recommendations,
|
|
331
|
+
migrationTimeMs,
|
|
332
|
+
dryRun,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
// ============================================================================
|
|
336
|
+
// Export
|
|
337
|
+
// ============================================================================
|
|
338
|
+
export default migrateCode;
|
|
339
|
+
//# sourceMappingURL=code-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-migration.js","sourceRoot":"","sources":["../../src/tools/code-migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atlas Server - ML-Powered Bug & Performance Prediction
|
|
3
|
+
*
|
|
4
|
+
* Machine Learning based code analysis:
|
|
5
|
+
* - Bug probability prediction
|
|
6
|
+
* - Performance bottleneck detection
|
|
7
|
+
* - Code smell prediction using ML patterns
|
|
8
|
+
* - Maintenance effort estimation
|
|
9
|
+
* - Test coverage prediction
|
|
10
|
+
* - Regression risk analysis
|
|
11
|
+
* - Code churn correlation
|
|
12
|
+
* - Developer productivity insights
|
|
13
|
+
* - Technical debt quantification
|
|
14
|
+
* - Failure prediction based on historical patterns
|
|
15
|
+
*
|
|
16
|
+
* @module ml-predictor
|
|
17
|
+
* @author Nishant Unavane
|
|
18
|
+
* @version 1.0.0
|
|
19
|
+
*/
|
|
20
|
+
export interface MLPredictorOptions {
|
|
21
|
+
projectPath: string;
|
|
22
|
+
filePath?: string;
|
|
23
|
+
predictions?: PredictionType[];
|
|
24
|
+
modelType?: 'statistical' | 'llm' | 'hybrid';
|
|
25
|
+
confidenceThreshold?: number;
|
|
26
|
+
gitHistory?: boolean;
|
|
27
|
+
includeMetrics?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export type PredictionType = 'bug-probability' | 'performance-issues' | 'maintenance-effort' | 'test-coverage' | 'regression-risk' | 'technical-debt' | 'code-churn' | 'failure-prediction';
|
|
30
|
+
export interface MLPredictorResult {
|
|
31
|
+
filePath: string;
|
|
32
|
+
predictions: Prediction[];
|
|
33
|
+
overallRisk: RiskLevel;
|
|
34
|
+
confidence: number;
|
|
35
|
+
recommendations: string[];
|
|
36
|
+
features: CodeFeatures;
|
|
37
|
+
analysisTimeMs: number;
|
|
38
|
+
modelUsed: string;
|
|
39
|
+
}
|
|
40
|
+
export interface Prediction {
|
|
41
|
+
type: PredictionType;
|
|
42
|
+
probability: number;
|
|
43
|
+
confidence: number;
|
|
44
|
+
severity: 'low' | 'medium' | 'high' | 'critical';
|
|
45
|
+
explanation: string;
|
|
46
|
+
evidence: Evidence[];
|
|
47
|
+
mitigation: string[];
|
|
48
|
+
}
|
|
49
|
+
export interface Evidence {
|
|
50
|
+
location: {
|
|
51
|
+
line: number;
|
|
52
|
+
column?: number;
|
|
53
|
+
};
|
|
54
|
+
snippet: string;
|
|
55
|
+
reason: string;
|
|
56
|
+
weight: number;
|
|
57
|
+
}
|
|
58
|
+
export type RiskLevel = 'minimal' | 'low' | 'moderate' | 'high' | 'critical';
|
|
59
|
+
export interface CodeFeatures {
|
|
60
|
+
cyclomaticComplexity: number;
|
|
61
|
+
cognitiveComplexity: number;
|
|
62
|
+
linesOfCode: number;
|
|
63
|
+
functionCount: number;
|
|
64
|
+
classCount: number;
|
|
65
|
+
nestingDepth: number;
|
|
66
|
+
commentRatio: number;
|
|
67
|
+
testCoverage: number;
|
|
68
|
+
commitCount: number;
|
|
69
|
+
authorCount: number;
|
|
70
|
+
churnRate: number;
|
|
71
|
+
patterns: DetectedPattern[];
|
|
72
|
+
}
|
|
73
|
+
export interface DetectedPattern {
|
|
74
|
+
name: string;
|
|
75
|
+
type: 'anti-pattern' | 'design-pattern' | 'code-smell';
|
|
76
|
+
confidence: number;
|
|
77
|
+
occurrences: number;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* ML-powered code analysis and prediction
|
|
81
|
+
*/
|
|
82
|
+
export declare function predictCodeIssues(options: MLPredictorOptions): Promise<MLPredictorResult>;
|
|
83
|
+
export default predictCodeIssues;
|
|
84
|
+
//# sourceMappingURL=ml-predictor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ml-predictor.d.ts","sourceRoot":"","sources":["../../src/tools/ml-predictor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAYH,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAG/B,SAAS,CAAC,EAAE,aAAa,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC7C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAG7B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,cAAc,GACtB,iBAAiB,GACjB,oBAAoB,GACpB,oBAAoB,GACpB,eAAe,GACf,iBAAiB,GACjB,gBAAgB,GAChB,YAAY,GACZ,oBAAoB,CAAC;AAEzB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,WAAW,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,YAAY,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;AAE7E,MAAM,WAAW,YAAY;IAE3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IAGpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IAGrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IAGrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAGlB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,cAAc,GAAG,gBAAgB,GAAG,YAAY,CAAC;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AA2WD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoF/F;AAMD,eAAe,iBAAiB,CAAC"}
|