@tyroneross/navgator 0.1.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/.claude-plugin/plugin.json +10 -0
- package/LICENSE +21 -0
- package/README.md +486 -0
- package/agents/architecture-advisor.md +109 -0
- package/commands/nav-check.md +64 -0
- package/commands/nav-connections.md +58 -0
- package/commands/nav-diagram.md +106 -0
- package/commands/nav-export.md +71 -0
- package/commands/nav-impact.md +58 -0
- package/commands/nav-scan.md +46 -0
- package/commands/nav-status.md +44 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +627 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config.d.ts +95 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +262 -0
- package/dist/config.js.map +1 -0
- package/dist/diagram.d.ts +36 -0
- package/dist/diagram.d.ts.map +1 -0
- package/dist/diagram.js +333 -0
- package/dist/diagram.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/scanner.d.ts +57 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +282 -0
- package/dist/scanner.js.map +1 -0
- package/dist/scanners/connections/ast-scanner.d.ts +26 -0
- package/dist/scanners/connections/ast-scanner.d.ts.map +1 -0
- package/dist/scanners/connections/ast-scanner.js +430 -0
- package/dist/scanners/connections/ast-scanner.js.map +1 -0
- package/dist/scanners/connections/service-calls.d.ts +14 -0
- package/dist/scanners/connections/service-calls.d.ts.map +1 -0
- package/dist/scanners/connections/service-calls.js +719 -0
- package/dist/scanners/connections/service-calls.js.map +1 -0
- package/dist/scanners/infrastructure/index.d.ts +27 -0
- package/dist/scanners/infrastructure/index.d.ts.map +1 -0
- package/dist/scanners/infrastructure/index.js +233 -0
- package/dist/scanners/infrastructure/index.js.map +1 -0
- package/dist/scanners/packages/npm.d.ts +18 -0
- package/dist/scanners/packages/npm.d.ts.map +1 -0
- package/dist/scanners/packages/npm.js +256 -0
- package/dist/scanners/packages/npm.js.map +1 -0
- package/dist/scanners/packages/pip.d.ts +14 -0
- package/dist/scanners/packages/pip.d.ts.map +1 -0
- package/dist/scanners/packages/pip.js +228 -0
- package/dist/scanners/packages/pip.js.map +1 -0
- package/dist/scanners/prompts/detector.d.ts +119 -0
- package/dist/scanners/prompts/detector.d.ts.map +1 -0
- package/dist/scanners/prompts/detector.js +617 -0
- package/dist/scanners/prompts/detector.js.map +1 -0
- package/dist/scanners/prompts/index.d.ts +51 -0
- package/dist/scanners/prompts/index.d.ts.map +1 -0
- package/dist/scanners/prompts/index.js +340 -0
- package/dist/scanners/prompts/index.js.map +1 -0
- package/dist/scanners/prompts/types.d.ts +127 -0
- package/dist/scanners/prompts/types.d.ts.map +1 -0
- package/dist/scanners/prompts/types.js +37 -0
- package/dist/scanners/prompts/types.js.map +1 -0
- package/dist/setup.d.ts +65 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +261 -0
- package/dist/setup.js.map +1 -0
- package/dist/storage.d.ts +147 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +931 -0
- package/dist/storage.js.map +1 -0
- package/dist/types.d.ts +296 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +55 -0
- package/dist/types.js.map +1 -0
- package/dist/ui-server.d.ts +17 -0
- package/dist/ui-server.d.ts.map +1 -0
- package/dist/ui-server.js +815 -0
- package/dist/ui-server.js.map +1 -0
- package/hooks/hooks.json +57 -0
- package/package.json +80 -0
- package/scripts/ibr-ui-test.mjs +359 -0
- package/scripts/postinstall.cjs +35 -0
- package/skills/architecture-awareness/SKILL.md +141 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python Package Scanner
|
|
3
|
+
* Detects packages from requirements.txt, pyproject.toml, setup.py
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { generateComponentId, } from '../../types.js';
|
|
8
|
+
const PYTHON_SIGNATURES = [
|
|
9
|
+
// Web frameworks
|
|
10
|
+
{ packageName: 'django', type: 'framework', layer: 'backend', purpose: 'Django web framework', critical: true },
|
|
11
|
+
{ packageName: 'flask', type: 'framework', layer: 'backend', purpose: 'Flask web framework', critical: true },
|
|
12
|
+
{ packageName: 'fastapi', type: 'framework', layer: 'backend', purpose: 'FastAPI framework', critical: true },
|
|
13
|
+
{ packageName: 'starlette', type: 'framework', layer: 'backend', purpose: 'Starlette ASGI framework', critical: true },
|
|
14
|
+
{ packageName: 'tornado', type: 'framework', layer: 'backend', purpose: 'Tornado async framework', critical: true },
|
|
15
|
+
// Database
|
|
16
|
+
{ packageName: 'sqlalchemy', type: 'database', layer: 'database', purpose: 'SQLAlchemy ORM', critical: true },
|
|
17
|
+
{ packageName: 'psycopg2', type: 'database', layer: 'database', purpose: 'PostgreSQL adapter', critical: true },
|
|
18
|
+
{ packageName: 'psycopg2-binary', type: 'database', layer: 'database', purpose: 'PostgreSQL adapter', critical: true },
|
|
19
|
+
{ packageName: 'pymongo', type: 'database', layer: 'database', purpose: 'MongoDB driver', critical: true },
|
|
20
|
+
{ packageName: 'redis', type: 'database', layer: 'database', purpose: 'Redis client', critical: false },
|
|
21
|
+
{ packageName: 'prisma', type: 'database', layer: 'database', purpose: 'Prisma Python client', critical: true },
|
|
22
|
+
{ packageName: 'supabase', type: 'service', layer: 'database', purpose: 'Supabase client', critical: true },
|
|
23
|
+
// Queue systems
|
|
24
|
+
{ packageName: 'celery', type: 'queue', layer: 'queue', purpose: 'Celery task queue', critical: true },
|
|
25
|
+
{ packageName: 'rq', type: 'queue', layer: 'queue', purpose: 'Redis Queue', critical: true },
|
|
26
|
+
{ packageName: 'dramatiq', type: 'queue', layer: 'queue', purpose: 'Dramatiq task queue', critical: true },
|
|
27
|
+
// AI/ML
|
|
28
|
+
{ packageName: 'anthropic', type: 'service', layer: 'external', purpose: 'Claude AI SDK', critical: true },
|
|
29
|
+
{ packageName: 'openai', type: 'service', layer: 'external', purpose: 'OpenAI SDK', critical: true },
|
|
30
|
+
{ packageName: 'langchain', type: 'service', layer: 'external', purpose: 'LangChain framework', critical: true },
|
|
31
|
+
{ packageName: 'transformers', type: 'npm', layer: 'backend', purpose: 'Hugging Face Transformers', critical: false },
|
|
32
|
+
// External services
|
|
33
|
+
{ packageName: 'stripe', type: 'service', layer: 'external', purpose: 'Stripe payments', critical: true },
|
|
34
|
+
{ packageName: 'twilio', type: 'service', layer: 'external', purpose: 'Twilio SMS/Voice', critical: false },
|
|
35
|
+
{ packageName: 'boto3', type: 'infra', layer: 'infra', purpose: 'AWS SDK', critical: false },
|
|
36
|
+
{ packageName: 'google-cloud-storage', type: 'infra', layer: 'infra', purpose: 'Google Cloud Storage', critical: false },
|
|
37
|
+
];
|
|
38
|
+
// =============================================================================
|
|
39
|
+
// REQUIREMENTS.TXT PARSING
|
|
40
|
+
// =============================================================================
|
|
41
|
+
/**
|
|
42
|
+
* Scan for Python packages in a project
|
|
43
|
+
*/
|
|
44
|
+
export async function scanPipPackages(projectRoot) {
|
|
45
|
+
const components = [];
|
|
46
|
+
const warnings = [];
|
|
47
|
+
const timestamp = Date.now();
|
|
48
|
+
// Scan requirements.txt
|
|
49
|
+
const requirementsPath = path.join(projectRoot, 'requirements.txt');
|
|
50
|
+
if (fs.existsSync(requirementsPath)) {
|
|
51
|
+
const result = await parseRequirementsTxt(requirementsPath, timestamp);
|
|
52
|
+
components.push(...result.components);
|
|
53
|
+
warnings.push(...result.warnings);
|
|
54
|
+
}
|
|
55
|
+
// Scan pyproject.toml
|
|
56
|
+
const pyprojectPath = path.join(projectRoot, 'pyproject.toml');
|
|
57
|
+
if (fs.existsSync(pyprojectPath)) {
|
|
58
|
+
const result = await parsePyprojectToml(pyprojectPath, timestamp);
|
|
59
|
+
components.push(...result.components);
|
|
60
|
+
warnings.push(...result.warnings);
|
|
61
|
+
}
|
|
62
|
+
// Deduplicate by name (prefer pyproject.toml version if both exist)
|
|
63
|
+
const seen = new Map();
|
|
64
|
+
for (const component of components) {
|
|
65
|
+
if (!seen.has(component.name)) {
|
|
66
|
+
seen.set(component.name, component);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
components: Array.from(seen.values()),
|
|
71
|
+
connections: [],
|
|
72
|
+
warnings,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Parse requirements.txt file
|
|
77
|
+
*/
|
|
78
|
+
async function parseRequirementsTxt(filePath, timestamp) {
|
|
79
|
+
const components = [];
|
|
80
|
+
const warnings = [];
|
|
81
|
+
try {
|
|
82
|
+
const content = await fs.promises.readFile(filePath, 'utf-8');
|
|
83
|
+
const lines = content.split('\n');
|
|
84
|
+
for (const line of lines) {
|
|
85
|
+
const trimmed = line.trim();
|
|
86
|
+
// Skip comments and empty lines
|
|
87
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
88
|
+
continue;
|
|
89
|
+
// Skip -r includes and other flags
|
|
90
|
+
if (trimmed.startsWith('-'))
|
|
91
|
+
continue;
|
|
92
|
+
// Parse package name and version
|
|
93
|
+
const parsed = parseRequirementLine(trimmed);
|
|
94
|
+
if (parsed) {
|
|
95
|
+
const component = createComponentFromPackage(parsed.name, parsed.version, filePath, timestamp);
|
|
96
|
+
components.push(component);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
warnings.push({
|
|
102
|
+
type: 'parse_error',
|
|
103
|
+
message: `Failed to parse requirements.txt: ${error}`,
|
|
104
|
+
file: filePath,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return { components, warnings };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Parse a single requirement line
|
|
111
|
+
*/
|
|
112
|
+
function parseRequirementLine(line) {
|
|
113
|
+
// Handle various formats:
|
|
114
|
+
// package==1.0.0
|
|
115
|
+
// package>=1.0.0
|
|
116
|
+
// package~=1.0.0
|
|
117
|
+
// package[extra]==1.0.0
|
|
118
|
+
// package @ https://...
|
|
119
|
+
// Remove extras like [extra1,extra2]
|
|
120
|
+
const withoutExtras = line.replace(/\[.*?\]/, '');
|
|
121
|
+
// Split by version specifier
|
|
122
|
+
const match = withoutExtras.match(/^([a-zA-Z0-9_-]+)\s*([@<>=!~]+.*)?$/);
|
|
123
|
+
if (!match)
|
|
124
|
+
return null;
|
|
125
|
+
const name = match[1].toLowerCase();
|
|
126
|
+
let version;
|
|
127
|
+
if (match[2]) {
|
|
128
|
+
// Extract version number from specifier
|
|
129
|
+
const versionMatch = match[2].match(/[<>=!~]+\s*(\d+[\d.]*\d*)/);
|
|
130
|
+
if (versionMatch) {
|
|
131
|
+
version = versionMatch[1];
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return { name, version };
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Parse pyproject.toml file (basic parsing)
|
|
138
|
+
*/
|
|
139
|
+
async function parsePyprojectToml(filePath, timestamp) {
|
|
140
|
+
const components = [];
|
|
141
|
+
const warnings = [];
|
|
142
|
+
try {
|
|
143
|
+
const content = await fs.promises.readFile(filePath, 'utf-8');
|
|
144
|
+
// Basic TOML parsing for dependencies
|
|
145
|
+
// Look for [project.dependencies] or [tool.poetry.dependencies]
|
|
146
|
+
const dependencyMatches = content.match(/\[(?:project\.dependencies|tool\.poetry\.dependencies)\]([\s\S]*?)(?=\[|$)/);
|
|
147
|
+
if (dependencyMatches) {
|
|
148
|
+
const section = dependencyMatches[1];
|
|
149
|
+
const lines = section.split('\n');
|
|
150
|
+
for (const line of lines) {
|
|
151
|
+
const trimmed = line.trim();
|
|
152
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
153
|
+
continue;
|
|
154
|
+
// Parse "package = version" or "package = {version = ...}"
|
|
155
|
+
const match = trimmed.match(/^([a-zA-Z0-9_-]+)\s*=\s*["']?([^"'\s}]+)/);
|
|
156
|
+
if (match) {
|
|
157
|
+
const name = match[1].toLowerCase();
|
|
158
|
+
const version = match[2].replace(/[^0-9.]/g, '');
|
|
159
|
+
const component = createComponentFromPackage(name, version || undefined, filePath, timestamp);
|
|
160
|
+
components.push(component);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Also check for dependencies array format
|
|
165
|
+
const arrayMatch = content.match(/dependencies\s*=\s*\[([\s\S]*?)\]/);
|
|
166
|
+
if (arrayMatch) {
|
|
167
|
+
const deps = arrayMatch[1].match(/"([^"]+)"/g) || [];
|
|
168
|
+
for (const dep of deps) {
|
|
169
|
+
const parsed = parseRequirementLine(dep.replace(/"/g, ''));
|
|
170
|
+
if (parsed) {
|
|
171
|
+
const component = createComponentFromPackage(parsed.name, parsed.version, filePath, timestamp);
|
|
172
|
+
components.push(component);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
warnings.push({
|
|
179
|
+
type: 'parse_error',
|
|
180
|
+
message: `Failed to parse pyproject.toml: ${error}`,
|
|
181
|
+
file: filePath,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
return { components, warnings };
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Create a component from a Python package
|
|
188
|
+
*/
|
|
189
|
+
function createComponentFromPackage(name, version, configFile, timestamp) {
|
|
190
|
+
// Check if this matches a known framework/service
|
|
191
|
+
const signature = PYTHON_SIGNATURES.find((s) => s.packageName.toLowerCase() === name.toLowerCase());
|
|
192
|
+
const type = signature?.type || 'pip';
|
|
193
|
+
const layer = signature?.layer || 'backend';
|
|
194
|
+
const purpose = signature?.purpose || `Python package`;
|
|
195
|
+
const critical = signature?.critical ?? true;
|
|
196
|
+
return {
|
|
197
|
+
component_id: generateComponentId('pip', name),
|
|
198
|
+
name,
|
|
199
|
+
version,
|
|
200
|
+
type,
|
|
201
|
+
role: {
|
|
202
|
+
purpose,
|
|
203
|
+
layer,
|
|
204
|
+
critical,
|
|
205
|
+
},
|
|
206
|
+
source: {
|
|
207
|
+
detection_method: 'auto',
|
|
208
|
+
config_files: [configFile],
|
|
209
|
+
confidence: 1.0,
|
|
210
|
+
},
|
|
211
|
+
connects_to: [],
|
|
212
|
+
connected_from: [],
|
|
213
|
+
status: 'active',
|
|
214
|
+
tags: ['pip', type, layer],
|
|
215
|
+
timestamp,
|
|
216
|
+
last_updated: timestamp,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Check if pip/Python is used in this project
|
|
221
|
+
*/
|
|
222
|
+
export function detectPip(projectRoot) {
|
|
223
|
+
return (fs.existsSync(path.join(projectRoot, 'requirements.txt')) ||
|
|
224
|
+
fs.existsSync(path.join(projectRoot, 'pyproject.toml')) ||
|
|
225
|
+
fs.existsSync(path.join(projectRoot, 'setup.py')) ||
|
|
226
|
+
fs.existsSync(path.join(projectRoot, 'Pipfile')));
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=pip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pip.js","sourceRoot":"","sources":["../../../src/scanners/packages/pip.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects AI prompt patterns in source code using regex patterns.
|
|
5
|
+
* For more accurate detection, use the AST-based extractor.
|
|
6
|
+
*/
|
|
7
|
+
import { DetectedPrompt, PromptPattern, PromptWarning } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Patterns for detecting AI API calls
|
|
10
|
+
*/
|
|
11
|
+
export declare const AI_CALL_PATTERNS: PromptPattern[];
|
|
12
|
+
/**
|
|
13
|
+
* Patterns for detecting prompt definitions
|
|
14
|
+
*/
|
|
15
|
+
export declare const PROMPT_DEFINITION_PATTERNS: RegExp[];
|
|
16
|
+
/**
|
|
17
|
+
* Patterns for detecting template variables
|
|
18
|
+
*/
|
|
19
|
+
export declare const TEMPLATE_VARIABLE_PATTERNS: RegExp[];
|
|
20
|
+
export interface DetectorOptions {
|
|
21
|
+
maxPromptLength?: number;
|
|
22
|
+
includeRawContent?: boolean;
|
|
23
|
+
detectVariables?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Detects prompts in source files using regex patterns
|
|
27
|
+
*/
|
|
28
|
+
export declare class PromptDetector {
|
|
29
|
+
private options;
|
|
30
|
+
constructor(options?: DetectorOptions);
|
|
31
|
+
/**
|
|
32
|
+
* Scan a project for prompts
|
|
33
|
+
*/
|
|
34
|
+
scanProject(projectRoot: string): Promise<{
|
|
35
|
+
prompts: DetectedPrompt[];
|
|
36
|
+
warnings: PromptWarning[];
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* Detect prompts in a single file
|
|
40
|
+
*/
|
|
41
|
+
detectInFile(filePath: string, content: string): DetectedPrompt[];
|
|
42
|
+
/**
|
|
43
|
+
* Find AI API calls in the file
|
|
44
|
+
*/
|
|
45
|
+
private findAPICalls;
|
|
46
|
+
/**
|
|
47
|
+
* Find prompt definitions in content
|
|
48
|
+
*/
|
|
49
|
+
private findPromptDefinitions;
|
|
50
|
+
/**
|
|
51
|
+
* Find the end of an array definition
|
|
52
|
+
*/
|
|
53
|
+
private findArrayEnd;
|
|
54
|
+
/**
|
|
55
|
+
* Find the end of a string definition
|
|
56
|
+
*/
|
|
57
|
+
private findStringEnd;
|
|
58
|
+
/**
|
|
59
|
+
* Find the end of a Python multi-line string
|
|
60
|
+
*/
|
|
61
|
+
private findPythonStringEnd;
|
|
62
|
+
/**
|
|
63
|
+
* Build a DetectedPrompt from a match
|
|
64
|
+
*/
|
|
65
|
+
private buildPromptFromMatch;
|
|
66
|
+
/**
|
|
67
|
+
* Extract messages from a messages array
|
|
68
|
+
*/
|
|
69
|
+
private extractMessages;
|
|
70
|
+
/**
|
|
71
|
+
* Extract a single message from string content
|
|
72
|
+
*/
|
|
73
|
+
private extractSingleMessage;
|
|
74
|
+
/**
|
|
75
|
+
* Detect template variables in content
|
|
76
|
+
*/
|
|
77
|
+
private detectVariables;
|
|
78
|
+
/**
|
|
79
|
+
* Find the containing function for a line
|
|
80
|
+
*/
|
|
81
|
+
private findContainingFunction;
|
|
82
|
+
/**
|
|
83
|
+
* Find nearest API call to a line
|
|
84
|
+
*/
|
|
85
|
+
private findNearestAPICall;
|
|
86
|
+
/**
|
|
87
|
+
* Extract purpose from comments near the prompt
|
|
88
|
+
*/
|
|
89
|
+
private extractPurpose;
|
|
90
|
+
/**
|
|
91
|
+
* Detect template syntax used
|
|
92
|
+
*/
|
|
93
|
+
private detectTemplateSyntax;
|
|
94
|
+
/**
|
|
95
|
+
* Generate tags from content
|
|
96
|
+
*/
|
|
97
|
+
private generateTags;
|
|
98
|
+
/**
|
|
99
|
+
* Detect prompt category
|
|
100
|
+
*/
|
|
101
|
+
private detectCategory;
|
|
102
|
+
/**
|
|
103
|
+
* Calculate detection confidence
|
|
104
|
+
*/
|
|
105
|
+
private calculateConfidence;
|
|
106
|
+
/**
|
|
107
|
+
* Generate a unique prompt ID
|
|
108
|
+
*/
|
|
109
|
+
private generatePromptId;
|
|
110
|
+
/**
|
|
111
|
+
* Generate a prompt name from context
|
|
112
|
+
*/
|
|
113
|
+
private generatePromptName;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Create a default detector instance
|
|
117
|
+
*/
|
|
118
|
+
export declare function createDetector(options?: DetectorOptions): PromptDetector;
|
|
119
|
+
//# sourceMappingURL=detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../../src/scanners/prompts/detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EACL,cAAc,EAEd,aAAa,EAEb,aAAa,EAEd,MAAM,YAAY,CAAC;AAMpB;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,aAAa,EA4D3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,UAgBtC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,UAYtC,CAAC;AAMF,MAAM,WAAW,eAAe;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA4B;gBAE/B,OAAO,GAAE,eAAoB;IAQzC;;OAEG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAC9C,OAAO,EAAE,cAAc,EAAE,CAAC;QAC1B,QAAQ,EAAE,aAAa,EAAE,CAAC;KAC3B,CAAC;IAuCF;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE;IAoBjE;;OAEG;IACH,OAAO,CAAC,YAAY;IAuBpB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiE7B;;OAEG;IACH,OAAO,CAAC,YAAY;IAqCpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAqBrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA0E5B;;OAEG;IACH,OAAO,CAAC,eAAe;IA4BvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsB5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAwBvB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAwB9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAsB1B;;OAEG;IACH,OAAO,CAAC,cAAc;IA+BtB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAS5B;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAa3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAS3B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,cAAc,CAExE"}
|