statecli-mcp-server 0.2.0 → 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.
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Cross-File Impact - Predict which files will be affected by a change
3
+ *
4
+ * Analyzes code to predict ripple effects of changes.
5
+ */
6
+ import { StateCLI } from './statecli';
7
+ export interface SymbolReference {
8
+ symbol: string;
9
+ file: string;
10
+ line: number;
11
+ type: 'definition' | 'usage' | 'import' | 'export';
12
+ }
13
+ export interface ChangeProposal {
14
+ file: string;
15
+ symbol?: string;
16
+ changeType: 'modify' | 'rename' | 'delete' | 'move';
17
+ newValue?: string;
18
+ }
19
+ export interface ImpactPrediction {
20
+ proposal: ChangeProposal;
21
+ affectedFiles: AffectedFile[];
22
+ totalFilesAffected: number;
23
+ riskScore: number;
24
+ breakingChanges: BreakingChange[];
25
+ suggestions: string[];
26
+ }
27
+ export interface AffectedFile {
28
+ path: string;
29
+ reason: string;
30
+ references: SymbolReference[];
31
+ changeRequired: boolean;
32
+ suggestedFix?: string;
33
+ }
34
+ export interface BreakingChange {
35
+ file: string;
36
+ line: number;
37
+ description: string;
38
+ severity: 'error' | 'warning';
39
+ }
40
+ export declare class CrossFileImpact {
41
+ private statecli;
42
+ private dependencyTracker;
43
+ private projectPath;
44
+ private symbolIndex;
45
+ constructor(statecli: StateCLI, projectPath?: string);
46
+ /**
47
+ * Build symbol index for the project
48
+ */
49
+ buildIndex(): void;
50
+ /**
51
+ * Predict impact of a proposed change
52
+ */
53
+ predictImpact(proposal: ChangeProposal): ImpactPrediction;
54
+ /**
55
+ * Find all references to a symbol
56
+ */
57
+ findSymbolReferences(symbol: string): SymbolReference[];
58
+ /**
59
+ * Analyze what would break if a file is deleted
60
+ */
61
+ analyzeFileDeletion(filePath: string): ImpactPrediction;
62
+ /**
63
+ * Analyze what would break if a symbol is renamed
64
+ */
65
+ analyzeRename(filePath: string, oldName: string, newName: string): ImpactPrediction;
66
+ /**
67
+ * Get a safe change order for multiple files
68
+ */
69
+ getSafeChangeOrder(files: string[]): {
70
+ order: string[];
71
+ reason: string;
72
+ };
73
+ /**
74
+ * Check if a change is safe to make
75
+ */
76
+ isChangeSafe(proposal: ChangeProposal): {
77
+ safe: boolean;
78
+ reasons: string[];
79
+ };
80
+ private scanForSymbols;
81
+ private extractSymbols;
82
+ private isSourceFile;
83
+ private calculateRiskScore;
84
+ }
85
+ //# sourceMappingURL=cross-file-impact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-file-impact.d.ts","sourceRoot":"","sources":["../src/cross-file-impact.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;CACpD;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAA6C;gBAEpD,QAAQ,EAAE,QAAQ,EAAE,WAAW,GAAE,MAAY;IAMzD;;OAEG;IACH,UAAU,IAAI,IAAI;IAWlB;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,cAAc,GAAG,gBAAgB;IAoGzD;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,EAAE;IAIvD;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB;IAOvD;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,gBAAgB;IASnF;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG;QACnC,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB;IAoBD;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG;QACtC,IAAI,EAAE,OAAO,CAAC;QACd,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB;IAoBD,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,cAAc;IAyEtB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,kBAAkB;CAwB3B"}
@@ -0,0 +1,338 @@
1
+ "use strict";
2
+ /**
3
+ * Cross-File Impact - Predict which files will be affected by a change
4
+ *
5
+ * Analyzes code to predict ripple effects of changes.
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
+ exports.CrossFileImpact = void 0;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const dependency_tracker_1 = require("./dependency-tracker");
45
+ class CrossFileImpact {
46
+ statecli;
47
+ dependencyTracker;
48
+ projectPath;
49
+ symbolIndex = new Map();
50
+ constructor(statecli, projectPath = '.') {
51
+ this.statecli = statecli;
52
+ this.projectPath = path.resolve(projectPath);
53
+ this.dependencyTracker = new dependency_tracker_1.DependencyTracker(statecli, projectPath);
54
+ }
55
+ /**
56
+ * Build symbol index for the project
57
+ */
58
+ buildIndex() {
59
+ this.symbolIndex.clear();
60
+ this.dependencyTracker.buildGraph();
61
+ this.scanForSymbols(this.projectPath);
62
+ this.statecli.track('cross-file', 'index-built', {
63
+ symbolCount: this.symbolIndex.size,
64
+ timestamp: new Date().toISOString()
65
+ }, 'cross-file-impact');
66
+ }
67
+ /**
68
+ * Predict impact of a proposed change
69
+ */
70
+ predictImpact(proposal) {
71
+ const affectedFiles = [];
72
+ const breakingChanges = [];
73
+ const suggestions = [];
74
+ // Get dependency impact
75
+ const depImpact = this.dependencyTracker.analyzeImpact(proposal.file);
76
+ // Add direct dependents
77
+ for (const dep of depImpact.directDependents) {
78
+ affectedFiles.push({
79
+ path: dep,
80
+ reason: 'Directly imports the changed file',
81
+ references: [],
82
+ changeRequired: proposal.changeType === 'delete' || proposal.changeType === 'move'
83
+ });
84
+ }
85
+ // Add transitive dependents for high-risk changes
86
+ if (proposal.changeType === 'delete' || proposal.changeType === 'rename') {
87
+ for (const dep of depImpact.transitiveDependents) {
88
+ if (!affectedFiles.find(f => f.path === dep)) {
89
+ affectedFiles.push({
90
+ path: dep,
91
+ reason: 'Transitively depends on the changed file',
92
+ references: [],
93
+ changeRequired: false
94
+ });
95
+ }
96
+ }
97
+ }
98
+ // If changing a specific symbol, find all usages
99
+ if (proposal.symbol) {
100
+ const references = this.findSymbolReferences(proposal.symbol);
101
+ for (const ref of references) {
102
+ if (ref.file !== proposal.file) {
103
+ let existing = affectedFiles.find(f => f.path === ref.file);
104
+ if (!existing) {
105
+ existing = {
106
+ path: ref.file,
107
+ reason: `Uses symbol "${proposal.symbol}"`,
108
+ references: [],
109
+ changeRequired: proposal.changeType !== 'modify'
110
+ };
111
+ affectedFiles.push(existing);
112
+ }
113
+ existing.references.push(ref);
114
+ // Add breaking change if deleting or renaming
115
+ if (proposal.changeType === 'delete' || proposal.changeType === 'rename') {
116
+ breakingChanges.push({
117
+ file: ref.file,
118
+ line: ref.line,
119
+ description: `Reference to "${proposal.symbol}" will break`,
120
+ severity: 'error'
121
+ });
122
+ }
123
+ }
124
+ }
125
+ }
126
+ // Generate suggestions
127
+ if (proposal.changeType === 'rename' && proposal.newValue) {
128
+ suggestions.push(`Use find-and-replace to rename "${proposal.symbol}" to "${proposal.newValue}" across ${affectedFiles.length} files`);
129
+ }
130
+ if (proposal.changeType === 'delete') {
131
+ suggestions.push(`Remove or replace all ${breakingChanges.length} references before deleting`);
132
+ }
133
+ if (affectedFiles.length > 10) {
134
+ suggestions.push('Consider creating a checkpoint before making this change');
135
+ }
136
+ if (breakingChanges.length === 0 && affectedFiles.length > 0) {
137
+ suggestions.push('No breaking changes detected, but review affected files after change');
138
+ }
139
+ // Calculate risk score
140
+ const riskScore = this.calculateRiskScore(proposal, affectedFiles, breakingChanges);
141
+ // Track prediction
142
+ this.statecli.track('cross-file', 'impact-prediction', {
143
+ file: proposal.file,
144
+ changeType: proposal.changeType,
145
+ symbol: proposal.symbol,
146
+ affectedCount: affectedFiles.length,
147
+ breakingCount: breakingChanges.length,
148
+ riskScore
149
+ }, 'cross-file-impact');
150
+ return {
151
+ proposal,
152
+ affectedFiles,
153
+ totalFilesAffected: affectedFiles.length,
154
+ riskScore,
155
+ breakingChanges,
156
+ suggestions
157
+ };
158
+ }
159
+ /**
160
+ * Find all references to a symbol
161
+ */
162
+ findSymbolReferences(symbol) {
163
+ return this.symbolIndex.get(symbol) || [];
164
+ }
165
+ /**
166
+ * Analyze what would break if a file is deleted
167
+ */
168
+ analyzeFileDeletion(filePath) {
169
+ return this.predictImpact({
170
+ file: filePath,
171
+ changeType: 'delete'
172
+ });
173
+ }
174
+ /**
175
+ * Analyze what would break if a symbol is renamed
176
+ */
177
+ analyzeRename(filePath, oldName, newName) {
178
+ return this.predictImpact({
179
+ file: filePath,
180
+ symbol: oldName,
181
+ changeType: 'rename',
182
+ newValue: newName
183
+ });
184
+ }
185
+ /**
186
+ * Get a safe change order for multiple files
187
+ */
188
+ getSafeChangeOrder(files) {
189
+ // Sort by dependency order - change leaf nodes first
190
+ const scored = files.map(file => {
191
+ const impact = this.dependencyTracker.analyzeImpact(file);
192
+ return {
193
+ file,
194
+ score: impact.transitiveDependents.length
195
+ };
196
+ });
197
+ const order = scored
198
+ .sort((a, b) => a.score - b.score)
199
+ .map(s => s.file);
200
+ return {
201
+ order,
202
+ reason: 'Files sorted by dependency impact - change files with fewer dependents first'
203
+ };
204
+ }
205
+ /**
206
+ * Check if a change is safe to make
207
+ */
208
+ isChangeSafe(proposal) {
209
+ const prediction = this.predictImpact(proposal);
210
+ const reasons = [];
211
+ if (prediction.breakingChanges.length > 0) {
212
+ reasons.push(`${prediction.breakingChanges.length} breaking changes detected`);
213
+ }
214
+ if (prediction.riskScore > 70) {
215
+ reasons.push(`High risk score: ${prediction.riskScore}`);
216
+ }
217
+ if (prediction.totalFilesAffected > 20) {
218
+ reasons.push(`Too many files affected: ${prediction.totalFilesAffected}`);
219
+ }
220
+ return {
221
+ safe: reasons.length === 0,
222
+ reasons
223
+ };
224
+ }
225
+ scanForSymbols(dir) {
226
+ try {
227
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
228
+ for (const entry of entries) {
229
+ const fullPath = path.join(dir, entry.name);
230
+ if (entry.isDirectory()) {
231
+ if (!['node_modules', '.git', 'dist', 'build', '__pycache__'].includes(entry.name)) {
232
+ this.scanForSymbols(fullPath);
233
+ }
234
+ }
235
+ else if (entry.isFile() && this.isSourceFile(entry.name)) {
236
+ this.extractSymbols(fullPath);
237
+ }
238
+ }
239
+ }
240
+ catch (error) {
241
+ // Directory might not be readable
242
+ }
243
+ }
244
+ extractSymbols(filePath) {
245
+ try {
246
+ const content = fs.readFileSync(filePath, 'utf-8');
247
+ const lines = content.split('\n');
248
+ const relativePath = path.relative(this.projectPath, filePath).replace(/\\/g, '/');
249
+ // Patterns for symbol extraction
250
+ const patterns = [
251
+ // Function/class definitions
252
+ { regex: /(?:export\s+)?(?:async\s+)?function\s+(\w+)/g, type: 'definition' },
253
+ { regex: /(?:export\s+)?class\s+(\w+)/g, type: 'definition' },
254
+ { regex: /(?:export\s+)?(?:const|let|var)\s+(\w+)/g, type: 'definition' },
255
+ { regex: /(?:export\s+)?interface\s+(\w+)/g, type: 'definition' },
256
+ { regex: /(?:export\s+)?type\s+(\w+)/g, type: 'definition' },
257
+ // Python definitions
258
+ { regex: /^def\s+(\w+)/gm, type: 'definition' },
259
+ { regex: /^class\s+(\w+)/gm, type: 'definition' },
260
+ // Imports
261
+ { regex: /import\s+\{([^}]+)\}/g, type: 'import' },
262
+ { regex: /import\s+(\w+)\s+from/g, type: 'import' },
263
+ ];
264
+ for (const { regex, type } of patterns) {
265
+ let match;
266
+ while ((match = regex.exec(content)) !== null) {
267
+ const symbols = match[1].split(',').map(s => s.trim());
268
+ const lineNumber = content.substring(0, match.index).split('\n').length;
269
+ for (const symbol of symbols) {
270
+ if (symbol && symbol.length > 1) {
271
+ const ref = {
272
+ symbol,
273
+ file: relativePath,
274
+ line: lineNumber,
275
+ type
276
+ };
277
+ if (!this.symbolIndex.has(symbol)) {
278
+ this.symbolIndex.set(symbol, []);
279
+ }
280
+ this.symbolIndex.get(symbol).push(ref);
281
+ }
282
+ }
283
+ }
284
+ }
285
+ // Find usages (identifiers that aren't definitions)
286
+ const identifierRegex = /\b([A-Z][a-zA-Z0-9]*)\b/g;
287
+ let match;
288
+ while ((match = identifierRegex.exec(content)) !== null) {
289
+ const symbol = match[1];
290
+ const lineNumber = content.substring(0, match.index).split('\n').length;
291
+ // Check if this is already tracked as a definition in this file
292
+ const existing = this.symbolIndex.get(symbol);
293
+ const isDefinitionHere = existing?.some(r => r.file === relativePath && r.type === 'definition' && r.line === lineNumber);
294
+ if (!isDefinitionHere && existing) {
295
+ existing.push({
296
+ symbol,
297
+ file: relativePath,
298
+ line: lineNumber,
299
+ type: 'usage'
300
+ });
301
+ }
302
+ }
303
+ }
304
+ catch (error) {
305
+ // File might not be readable
306
+ }
307
+ }
308
+ isSourceFile(filename) {
309
+ const extensions = ['.ts', '.tsx', '.js', '.jsx', '.py', '.java', '.cs'];
310
+ return extensions.some(ext => filename.endsWith(ext));
311
+ }
312
+ calculateRiskScore(proposal, affectedFiles, breakingChanges) {
313
+ let score = 0;
314
+ // Base score by change type
315
+ switch (proposal.changeType) {
316
+ case 'modify':
317
+ score += 10;
318
+ break;
319
+ case 'rename':
320
+ score += 30;
321
+ break;
322
+ case 'move':
323
+ score += 40;
324
+ break;
325
+ case 'delete':
326
+ score += 50;
327
+ break;
328
+ }
329
+ // Add for affected files
330
+ score += Math.min(affectedFiles.length * 3, 30);
331
+ // Add for breaking changes
332
+ score += Math.min(breakingChanges.length * 5, 20);
333
+ // Cap at 100
334
+ return Math.min(score, 100);
335
+ }
336
+ }
337
+ exports.CrossFileImpact = CrossFileImpact;
338
+ //# sourceMappingURL=cross-file-impact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-file-impact.js","sourceRoot":"","sources":["../src/cross-file-impact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Dependency Tracker - Understand code dependencies
3
+ *
4
+ * Analyzes imports/exports to understand what code depends on what.
5
+ */
6
+ import { StateCLI } from './statecli';
7
+ export interface Dependency {
8
+ source: string;
9
+ target: string;
10
+ type: 'import' | 'require' | 'export' | 'extends' | 'implements';
11
+ line?: number;
12
+ }
13
+ export interface FileNode {
14
+ path: string;
15
+ imports: string[];
16
+ exports: string[];
17
+ dependsOn: string[];
18
+ dependedBy: string[];
19
+ }
20
+ export interface DependencyGraph {
21
+ files: Map<string, FileNode>;
22
+ edges: Dependency[];
23
+ }
24
+ export interface ImpactAnalysis {
25
+ changedFile: string;
26
+ directDependents: string[];
27
+ transitiveDependents: string[];
28
+ riskLevel: 'low' | 'medium' | 'high' | 'critical';
29
+ recommendation: string;
30
+ }
31
+ export declare class DependencyTracker {
32
+ private statecli;
33
+ private projectPath;
34
+ private graph;
35
+ private fileExtensions;
36
+ constructor(statecli: StateCLI, projectPath?: string, options?: {
37
+ extensions?: string[];
38
+ });
39
+ /**
40
+ * Build dependency graph for the project
41
+ */
42
+ buildGraph(rootDir?: string): DependencyGraph;
43
+ /**
44
+ * Analyze impact of changing a file
45
+ */
46
+ analyzeImpact(filePath: string): ImpactAnalysis;
47
+ /**
48
+ * Get what a file depends on
49
+ */
50
+ getDependencies(filePath: string): string[];
51
+ /**
52
+ * Get what depends on a file
53
+ */
54
+ getDependents(filePath: string): string[];
55
+ /**
56
+ * Find circular dependencies
57
+ */
58
+ findCircularDependencies(): string[][];
59
+ /**
60
+ * Get dependency tree as a string for display
61
+ */
62
+ getDependencyTree(filePath: string, maxDepth?: number): string;
63
+ /**
64
+ * Get most depended-upon files (core files)
65
+ */
66
+ getCoreFiles(limit?: number): Array<{
67
+ file: string;
68
+ dependentCount: number;
69
+ }>;
70
+ private scanDirectory;
71
+ private analyzeFile;
72
+ private buildReverseLinks;
73
+ private resolveImportPath;
74
+ private normalizePath;
75
+ private getDirectDependents;
76
+ private getTransitiveDependents;
77
+ }
78
+ //# sourceMappingURL=dependency-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-tracker.d.ts","sourceRoot":"","sources":["../src/dependency-tracker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7B,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAClD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,cAAc,CAAW;gBAG/B,QAAQ,EAAE,QAAQ,EAClB,WAAW,GAAE,MAAY,EACzB,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB;IAQH;;OAEG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAiB7C;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc;IAmD/C;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAM3C;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAMzC;;OAEG;IACH,wBAAwB,IAAI,MAAM,EAAE,EAAE;IAmCtC;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM;IAyBjE;;OAEG;IACH,YAAY,CAAC,KAAK,GAAE,MAAW,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IAejF,OAAO,CAAC,aAAa;IAqBrB,OAAO,CAAC,WAAW;IAiDnB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,uBAAuB;CAkBhC"}