@emaenriquez/projectmanager-cli 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.
Files changed (174) hide show
  1. package/README.md +98 -0
  2. package/dist/application/ConfigManager.d.ts +73 -0
  3. package/dist/application/ConfigManager.d.ts.map +1 -0
  4. package/dist/application/ConfigManager.js +253 -0
  5. package/dist/application/ConfigManager.js.map +1 -0
  6. package/dist/application/errors/ErrorHandler.d.ts +27 -0
  7. package/dist/application/errors/ErrorHandler.d.ts.map +1 -0
  8. package/dist/application/errors/ErrorHandler.js +88 -0
  9. package/dist/application/errors/ErrorHandler.js.map +1 -0
  10. package/dist/application/state/StateManager.d.ts +26 -0
  11. package/dist/application/state/StateManager.d.ts.map +1 -0
  12. package/dist/application/state/StateManager.js +114 -0
  13. package/dist/application/state/StateManager.js.map +1 -0
  14. package/dist/application/use_cases/AddProjectUseCase.d.ts +9 -0
  15. package/dist/application/use_cases/AddProjectUseCase.d.ts.map +1 -0
  16. package/dist/application/use_cases/AddProjectUseCase.js +85 -0
  17. package/dist/application/use_cases/AddProjectUseCase.js.map +1 -0
  18. package/dist/application/use_cases/ListProjectsUseCase.d.ts +7 -0
  19. package/dist/application/use_cases/ListProjectsUseCase.d.ts.map +1 -0
  20. package/dist/application/use_cases/ListProjectsUseCase.js +14 -0
  21. package/dist/application/use_cases/ListProjectsUseCase.js.map +1 -0
  22. package/dist/application/use_cases/OpenProjectUseCase.d.ts +10 -0
  23. package/dist/application/use_cases/OpenProjectUseCase.d.ts.map +1 -0
  24. package/dist/application/use_cases/OpenProjectUseCase.js +168 -0
  25. package/dist/application/use_cases/OpenProjectUseCase.js.map +1 -0
  26. package/dist/application/use_cases/RemoveProjectUseCase.d.ts +7 -0
  27. package/dist/application/use_cases/RemoveProjectUseCase.d.ts.map +1 -0
  28. package/dist/application/use_cases/RemoveProjectUseCase.js +24 -0
  29. package/dist/application/use_cases/RemoveProjectUseCase.js.map +1 -0
  30. package/dist/application/use_cases/ScanProjectsUseCase.d.ts +13 -0
  31. package/dist/application/use_cases/ScanProjectsUseCase.d.ts.map +1 -0
  32. package/dist/application/use_cases/ScanProjectsUseCase.js +57 -0
  33. package/dist/application/use_cases/ScanProjectsUseCase.js.map +1 -0
  34. package/dist/application/use_cases/SyncProjectsUseCase.d.ts +12 -0
  35. package/dist/application/use_cases/SyncProjectsUseCase.d.ts.map +1 -0
  36. package/dist/application/use_cases/SyncProjectsUseCase.js +74 -0
  37. package/dist/application/use_cases/SyncProjectsUseCase.js.map +1 -0
  38. package/dist/application/use_cases/SystemDiagnostics.d.ts +16 -0
  39. package/dist/application/use_cases/SystemDiagnostics.d.ts.map +1 -0
  40. package/dist/application/use_cases/SystemDiagnostics.js +35 -0
  41. package/dist/application/use_cases/SystemDiagnostics.js.map +1 -0
  42. package/dist/application/use_cases/TagProjectUseCase.d.ts +9 -0
  43. package/dist/application/use_cases/TagProjectUseCase.d.ts.map +1 -0
  44. package/dist/application/use_cases/TagProjectUseCase.js +41 -0
  45. package/dist/application/use_cases/TagProjectUseCase.js.map +1 -0
  46. package/dist/domain/patterns/ProjectPatterns.d.ts +47 -0
  47. package/dist/domain/patterns/ProjectPatterns.d.ts.map +1 -0
  48. package/dist/domain/patterns/ProjectPatterns.js +200 -0
  49. package/dist/domain/patterns/ProjectPatterns.js.map +1 -0
  50. package/dist/domain/services/GitService.d.ts +23 -0
  51. package/dist/domain/services/GitService.d.ts.map +1 -0
  52. package/dist/domain/services/GitService.js +155 -0
  53. package/dist/domain/services/GitService.js.map +1 -0
  54. package/dist/domain/services/IgnoreFileParser.d.ts +55 -0
  55. package/dist/domain/services/IgnoreFileParser.d.ts.map +1 -0
  56. package/dist/domain/services/IgnoreFileParser.js +200 -0
  57. package/dist/domain/services/IgnoreFileParser.js.map +1 -0
  58. package/dist/domain/services/ProjectScanner.d.ts +65 -0
  59. package/dist/domain/services/ProjectScanner.d.ts.map +1 -0
  60. package/dist/domain/services/ProjectScanner.js +207 -0
  61. package/dist/domain/services/ProjectScanner.js.map +1 -0
  62. package/dist/domain/services/TechnologyDetector.d.ts +78 -0
  63. package/dist/domain/services/TechnologyDetector.d.ts.map +1 -0
  64. package/dist/domain/services/TechnologyDetector.js +633 -0
  65. package/dist/domain/services/TechnologyDetector.js.map +1 -0
  66. package/dist/domain/services/ToolDetector.d.ts +74 -0
  67. package/dist/domain/services/ToolDetector.d.ts.map +1 -0
  68. package/dist/domain/services/ToolDetector.js +344 -0
  69. package/dist/domain/services/ToolDetector.js.map +1 -0
  70. package/dist/domain/services/index.d.ts +5 -0
  71. package/dist/domain/services/index.d.ts.map +1 -0
  72. package/dist/domain/services/index.js +12 -0
  73. package/dist/domain/services/index.js.map +1 -0
  74. package/dist/domain/types/Config.d.ts +37 -0
  75. package/dist/domain/types/Config.d.ts.map +1 -0
  76. package/dist/domain/types/Config.js +6 -0
  77. package/dist/domain/types/Config.js.map +1 -0
  78. package/dist/index.d.ts +6 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +17 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/infrastructure/database/DatabaseConnection.d.ts +88 -0
  83. package/dist/infrastructure/database/DatabaseConnection.d.ts.map +1 -0
  84. package/dist/infrastructure/database/DatabaseConnection.js +318 -0
  85. package/dist/infrastructure/database/DatabaseConnection.js.map +1 -0
  86. package/dist/infrastructure/database/DatabaseValidator.d.ts +154 -0
  87. package/dist/infrastructure/database/DatabaseValidator.d.ts.map +1 -0
  88. package/dist/infrastructure/database/DatabaseValidator.js +583 -0
  89. package/dist/infrastructure/database/DatabaseValidator.js.map +1 -0
  90. package/dist/infrastructure/database/index.d.ts +8 -0
  91. package/dist/infrastructure/database/index.d.ts.map +1 -0
  92. package/dist/infrastructure/database/index.js +14 -0
  93. package/dist/infrastructure/database/index.js.map +1 -0
  94. package/dist/infrastructure/database/migrations/001_initial.d.ts +24 -0
  95. package/dist/infrastructure/database/migrations/001_initial.d.ts.map +1 -0
  96. package/dist/infrastructure/database/migrations/001_initial.js +109 -0
  97. package/dist/infrastructure/database/migrations/001_initial.js.map +1 -0
  98. package/dist/infrastructure/database/migrations/Migration.d.ts +27 -0
  99. package/dist/infrastructure/database/migrations/Migration.d.ts.map +1 -0
  100. package/dist/infrastructure/database/migrations/Migration.js +3 -0
  101. package/dist/infrastructure/database/migrations/Migration.js.map +1 -0
  102. package/dist/infrastructure/database/migrations/MigrationRunner.d.ts +52 -0
  103. package/dist/infrastructure/database/migrations/MigrationRunner.d.ts.map +1 -0
  104. package/dist/infrastructure/database/migrations/MigrationRunner.js +167 -0
  105. package/dist/infrastructure/database/migrations/MigrationRunner.js.map +1 -0
  106. package/dist/infrastructure/database/migrations/index.d.ts +10 -0
  107. package/dist/infrastructure/database/migrations/index.d.ts.map +1 -0
  108. package/dist/infrastructure/database/migrations/index.js +22 -0
  109. package/dist/infrastructure/database/migrations/index.js.map +1 -0
  110. package/dist/infrastructure/filesystem/DirectoryManager.d.ts +50 -0
  111. package/dist/infrastructure/filesystem/DirectoryManager.d.ts.map +1 -0
  112. package/dist/infrastructure/filesystem/DirectoryManager.js +143 -0
  113. package/dist/infrastructure/filesystem/DirectoryManager.js.map +1 -0
  114. package/dist/infrastructure/filesystem/index.d.ts +2 -0
  115. package/dist/infrastructure/filesystem/index.d.ts.map +1 -0
  116. package/dist/infrastructure/filesystem/index.js +6 -0
  117. package/dist/infrastructure/filesystem/index.js.map +1 -0
  118. package/dist/infrastructure/logging/LogRotator.d.ts +43 -0
  119. package/dist/infrastructure/logging/LogRotator.d.ts.map +1 -0
  120. package/dist/infrastructure/logging/LogRotator.js +172 -0
  121. package/dist/infrastructure/logging/LogRotator.js.map +1 -0
  122. package/dist/infrastructure/logging/Logger.d.ts +59 -0
  123. package/dist/infrastructure/logging/Logger.d.ts.map +1 -0
  124. package/dist/infrastructure/logging/Logger.js +182 -0
  125. package/dist/infrastructure/logging/Logger.js.map +1 -0
  126. package/dist/infrastructure/logging/index.d.ts +3 -0
  127. package/dist/infrastructure/logging/index.d.ts.map +1 -0
  128. package/dist/infrastructure/logging/index.js +8 -0
  129. package/dist/infrastructure/logging/index.js.map +1 -0
  130. package/dist/infrastructure/repositories/ProjectRepository.d.ts +20 -0
  131. package/dist/infrastructure/repositories/ProjectRepository.d.ts.map +1 -0
  132. package/dist/infrastructure/repositories/ProjectRepository.js +61 -0
  133. package/dist/infrastructure/repositories/ProjectRepository.js.map +1 -0
  134. package/dist/infrastructure/repositories/QueryBuilder.d.ts +24 -0
  135. package/dist/infrastructure/repositories/QueryBuilder.d.ts.map +1 -0
  136. package/dist/infrastructure/repositories/QueryBuilder.js +92 -0
  137. package/dist/infrastructure/repositories/QueryBuilder.js.map +1 -0
  138. package/dist/infrastructure/repositories/TagRepository.d.ts +18 -0
  139. package/dist/infrastructure/repositories/TagRepository.d.ts.map +1 -0
  140. package/dist/infrastructure/repositories/TagRepository.js +66 -0
  141. package/dist/infrastructure/repositories/TagRepository.js.map +1 -0
  142. package/dist/infrastructure/repositories/TechnologyRepository.d.ts +16 -0
  143. package/dist/infrastructure/repositories/TechnologyRepository.d.ts.map +1 -0
  144. package/dist/infrastructure/repositories/TechnologyRepository.js +46 -0
  145. package/dist/infrastructure/repositories/TechnologyRepository.js.map +1 -0
  146. package/dist/infrastructure/repositories/TransactionManager.d.ts +11 -0
  147. package/dist/infrastructure/repositories/TransactionManager.d.ts.map +1 -0
  148. package/dist/infrastructure/repositories/TransactionManager.js +21 -0
  149. package/dist/infrastructure/repositories/TransactionManager.js.map +1 -0
  150. package/dist/infrastructure/ui/ScreenManager.d.ts +11 -0
  151. package/dist/infrastructure/ui/ScreenManager.d.ts.map +1 -0
  152. package/dist/infrastructure/ui/ScreenManager.js +69 -0
  153. package/dist/infrastructure/ui/ScreenManager.js.map +1 -0
  154. package/dist/ui/cli/CLI.d.ts +9 -0
  155. package/dist/ui/cli/CLI.d.ts.map +1 -0
  156. package/dist/ui/cli/CLI.js +211 -0
  157. package/dist/ui/cli/CLI.js.map +1 -0
  158. package/dist/ui/components/DetailsPanel.d.ts +11 -0
  159. package/dist/ui/components/DetailsPanel.d.ts.map +1 -0
  160. package/dist/ui/components/DetailsPanel.js +181 -0
  161. package/dist/ui/components/DetailsPanel.js.map +1 -0
  162. package/dist/ui/components/ProjectListView.d.ts +15 -0
  163. package/dist/ui/components/ProjectListView.d.ts.map +1 -0
  164. package/dist/ui/components/ProjectListView.js +122 -0
  165. package/dist/ui/components/ProjectListView.js.map +1 -0
  166. package/dist/ui/tui/TUIApplication.d.ts +17 -0
  167. package/dist/ui/tui/TUIApplication.d.ts.map +1 -0
  168. package/dist/ui/tui/TUIApplication.js +532 -0
  169. package/dist/ui/tui/TUIApplication.js.map +1 -0
  170. package/dist/ui/tui/Theme.d.ts +25 -0
  171. package/dist/ui/tui/Theme.d.ts.map +1 -0
  172. package/dist/ui/tui/Theme.js +62 -0
  173. package/dist/ui/tui/Theme.js.map +1 -0
  174. package/package.json +56 -0
@@ -0,0 +1,633 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.TechnologyDetector = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ /**
40
+ * TechnologyDetector detects programming languages, frameworks, and tools
41
+ * used in a project by analyzing configuration files
42
+ */
43
+ class TechnologyDetector {
44
+ /**
45
+ * Detect all technologies in a project
46
+ * @param projectPath Path to the project directory
47
+ * @returns Array of detected technologies
48
+ */
49
+ detect(projectPath) {
50
+ const technologies = [];
51
+ try {
52
+ // Check Node.js/JavaScript/TypeScript
53
+ const packageJsonTechs = this.detectFromPackageJson(projectPath);
54
+ technologies.push(...packageJsonTechs);
55
+ // Check Python
56
+ const pythonTechs = this.detectFromRequirements(projectPath);
57
+ technologies.push(...pythonTechs);
58
+ // Check Ruby
59
+ const rubyTechs = this.detectFromGemfile(projectPath);
60
+ technologies.push(...rubyTechs);
61
+ // Check Rust
62
+ const rustTechs = this.detectFromCargoToml(projectPath);
63
+ technologies.push(...rustTechs);
64
+ // Check Go
65
+ const goTechs = this.detectFromGoMod(projectPath);
66
+ technologies.push(...goTechs);
67
+ // Check Java
68
+ const javaTechs = this.detectFromPom(projectPath);
69
+ technologies.push(...javaTechs);
70
+ // Check PHP
71
+ const phpTechs = this.detectFromComposerJson(projectPath);
72
+ technologies.push(...phpTechs);
73
+ }
74
+ catch (error) {
75
+ // Log error but don't fail - continue with partial detection
76
+ console.error(`Error detecting technologies in ${projectPath}:`, error);
77
+ }
78
+ return technologies;
79
+ }
80
+ /**
81
+ * Detect Node.js/TypeScript/JavaScript from package.json
82
+ */
83
+ detectFromPackageJson(projectPath) {
84
+ const technologies = [];
85
+ const packageJsonPath = path.join(projectPath, 'package.json');
86
+ if (!fs.existsSync(packageJsonPath)) {
87
+ return technologies;
88
+ }
89
+ try {
90
+ const content = fs.readFileSync(packageJsonPath, 'utf-8');
91
+ const packageJson = this.parseJSON(content);
92
+ if (!packageJson) {
93
+ return technologies;
94
+ }
95
+ // Detect Node.js/TypeScript
96
+ const nodeVersion = packageJson.engines?.node;
97
+ const resolvedNodeVersion = nodeVersion
98
+ ? this.extractVersion(nodeVersion)
99
+ : this.extractNodeVersionFromLockFile(projectPath);
100
+ technologies.push({
101
+ name: 'Node.js',
102
+ version: resolvedNodeVersion,
103
+ category: 'language'
104
+ });
105
+ // Check for TypeScript
106
+ if (packageJson.devDependencies?.typescript || packageJson.dependencies?.typescript) {
107
+ const tsVersion = packageJson.devDependencies?.typescript || packageJson.dependencies?.typescript;
108
+ technologies.push({
109
+ name: 'TypeScript',
110
+ version: this.extractVersion(tsVersion),
111
+ category: 'language'
112
+ });
113
+ }
114
+ // Detect frameworks
115
+ const frameworks = this.detectFrameworksFromDependencies(packageJson);
116
+ technologies.push(...frameworks);
117
+ }
118
+ catch (error) {
119
+ console.error(`Error parsing package.json: ${error}`);
120
+ }
121
+ return technologies;
122
+ }
123
+ /**
124
+ * Detect Python from requirements.txt or pyproject.toml
125
+ */
126
+ detectFromRequirements(projectPath) {
127
+ const technologies = [];
128
+ // Check requirements.txt
129
+ const requirementsPath = path.join(projectPath, 'requirements.txt');
130
+ if (fs.existsSync(requirementsPath)) {
131
+ const pythonVersion = this.extractPythonVersionFromLockFile(projectPath);
132
+ technologies.push({
133
+ name: 'Python',
134
+ version: pythonVersion,
135
+ category: 'language'
136
+ });
137
+ // Detect Python frameworks from requirements.txt
138
+ try {
139
+ const content = fs.readFileSync(requirementsPath, 'utf-8');
140
+ this.detectPythonFrameworks(content).forEach(framework => {
141
+ technologies.push(framework);
142
+ });
143
+ }
144
+ catch (error) {
145
+ console.error(`Error reading requirements.txt: ${error}`);
146
+ }
147
+ return technologies;
148
+ }
149
+ // Check pyproject.toml
150
+ const pyprojectPath = path.join(projectPath, 'pyproject.toml');
151
+ if (fs.existsSync(pyprojectPath)) {
152
+ try {
153
+ const content = fs.readFileSync(pyprojectPath, 'utf-8');
154
+ if (content.includes('python')) {
155
+ // Try to extract python version requirement
156
+ const pythonMatch = content.match(/python\s*=\s*['"]([\d.x*]+)['"]/);
157
+ const pythonVersion = pythonMatch ? pythonMatch[1].replace(/[x*]/g, '') : this.extractPythonVersionFromLockFile(projectPath);
158
+ technologies.push({
159
+ name: 'Python',
160
+ version: pythonVersion,
161
+ category: 'language'
162
+ });
163
+ // Detect Python frameworks from pyproject.toml
164
+ this.detectPythonFrameworks(content).forEach(framework => {
165
+ technologies.push(framework);
166
+ });
167
+ }
168
+ }
169
+ catch (error) {
170
+ console.error(`Error reading pyproject.toml: ${error}`);
171
+ }
172
+ }
173
+ return technologies;
174
+ }
175
+ /**
176
+ * Detect Rust from Cargo.toml
177
+ */
178
+ detectFromCargoToml(projectPath) {
179
+ const technologies = [];
180
+ const cargoTomlPath = path.join(projectPath, 'Cargo.toml');
181
+ if (!fs.existsSync(cargoTomlPath)) {
182
+ return technologies;
183
+ }
184
+ try {
185
+ const content = fs.readFileSync(cargoTomlPath, 'utf-8');
186
+ if (content.includes('[package]')) {
187
+ technologies.push({
188
+ name: 'Rust',
189
+ category: 'language'
190
+ });
191
+ }
192
+ }
193
+ catch (error) {
194
+ console.error(`Error reading Cargo.toml: ${error}`);
195
+ }
196
+ return technologies;
197
+ }
198
+ /**
199
+ * Detect Go from go.mod
200
+ */
201
+ detectFromGoMod(projectPath) {
202
+ const technologies = [];
203
+ const goModPath = path.join(projectPath, 'go.mod');
204
+ if (!fs.existsSync(goModPath)) {
205
+ return technologies;
206
+ }
207
+ try {
208
+ const content = fs.readFileSync(goModPath, 'utf-8');
209
+ const versionMatch = content.match(/^go\s+([\d.]+)/m);
210
+ technologies.push({
211
+ name: 'Go',
212
+ version: versionMatch ? versionMatch[1] : undefined,
213
+ category: 'language'
214
+ });
215
+ }
216
+ catch (error) {
217
+ console.error(`Error reading go.mod: ${error}`);
218
+ }
219
+ return technologies;
220
+ }
221
+ /**
222
+ * Detect Java from pom.xml or build.gradle
223
+ */
224
+ detectFromPom(projectPath) {
225
+ const technologies = [];
226
+ // Check pom.xml
227
+ const pomPath = path.join(projectPath, 'pom.xml');
228
+ if (fs.existsSync(pomPath)) {
229
+ try {
230
+ const content = fs.readFileSync(pomPath, 'utf-8');
231
+ if (content.includes('<project')) {
232
+ // Detect Java version from maven version
233
+ const sourceMatch = content.match(/<source>([\d.]+)<\/source>/);
234
+ technologies.push({
235
+ name: 'Java',
236
+ version: sourceMatch ? sourceMatch[1] : undefined,
237
+ category: 'language'
238
+ });
239
+ // Detect Maven
240
+ technologies.push({
241
+ name: 'Maven',
242
+ category: 'tool'
243
+ });
244
+ // Detect Spring if present
245
+ if (content.includes('spring-boot') || content.includes('spring-framework')) {
246
+ technologies.push({
247
+ name: 'Spring',
248
+ category: 'framework'
249
+ });
250
+ }
251
+ }
252
+ }
253
+ catch (error) {
254
+ console.error(`Error reading pom.xml: ${error}`);
255
+ }
256
+ return technologies;
257
+ }
258
+ // Check build.gradle
259
+ const gradlePath = path.join(projectPath, 'build.gradle');
260
+ if (fs.existsSync(gradlePath)) {
261
+ try {
262
+ const content = fs.readFileSync(gradlePath, 'utf-8');
263
+ if (content.includes('plugins')) {
264
+ // Try to extract Java version from gradle config
265
+ const javaVersion = this.extractJavaVersionFromBuildFiles(projectPath);
266
+ technologies.push({
267
+ name: 'Java',
268
+ version: javaVersion,
269
+ category: 'language'
270
+ });
271
+ // Detect Gradle
272
+ technologies.push({
273
+ name: 'Gradle',
274
+ category: 'tool'
275
+ });
276
+ // Detect Spring if present
277
+ if (content.includes('spring-boot') || content.includes('spring')) {
278
+ technologies.push({
279
+ name: 'Spring',
280
+ category: 'framework'
281
+ });
282
+ }
283
+ }
284
+ }
285
+ catch (error) {
286
+ console.error(`Error reading build.gradle: ${error}`);
287
+ }
288
+ }
289
+ return technologies;
290
+ }
291
+ /**
292
+ * Detect PHP from composer.json
293
+ */
294
+ detectFromComposerJson(projectPath) {
295
+ const technologies = [];
296
+ const composerJsonPath = path.join(projectPath, 'composer.json');
297
+ if (!fs.existsSync(composerJsonPath)) {
298
+ return technologies;
299
+ }
300
+ try {
301
+ const content = fs.readFileSync(composerJsonPath, 'utf-8');
302
+ const composerJson = this.parseJSON(content);
303
+ if (!composerJson) {
304
+ return technologies;
305
+ }
306
+ // Detect PHP version from require
307
+ const phpVersion = composerJson.require?.php;
308
+ technologies.push({
309
+ name: 'PHP',
310
+ version: phpVersion ? this.extractVersion(phpVersion) : undefined,
311
+ category: 'language'
312
+ });
313
+ // Detect frameworks
314
+ if (composerJson.require) {
315
+ if (composerJson.require['laravel/framework']) {
316
+ technologies.push({
317
+ name: 'Laravel',
318
+ category: 'framework'
319
+ });
320
+ }
321
+ if (composerJson.require['symfony/console']) {
322
+ technologies.push({
323
+ name: 'Symfony',
324
+ category: 'framework'
325
+ });
326
+ }
327
+ }
328
+ }
329
+ catch (error) {
330
+ console.error(`Error parsing composer.json: ${error}`);
331
+ }
332
+ return technologies;
333
+ }
334
+ /**
335
+ * Detect Ruby from Gemfile
336
+ */
337
+ detectFromGemfile(projectPath) {
338
+ const technologies = [];
339
+ const gemfilePath = path.join(projectPath, 'Gemfile');
340
+ if (!fs.existsSync(gemfilePath)) {
341
+ return technologies;
342
+ }
343
+ try {
344
+ const content = fs.readFileSync(gemfilePath, 'utf-8');
345
+ // Detect Ruby
346
+ technologies.push({
347
+ name: 'Ruby',
348
+ category: 'language'
349
+ });
350
+ // Detect Ruby frameworks
351
+ const rubyFrameworks = {
352
+ 'rails': 'Rails',
353
+ 'sinatra': 'Sinatra',
354
+ 'hanami': 'Hanami',
355
+ 'rack': 'Rack',
356
+ 'grape': 'Grape',
357
+ 'padrino': 'Padrino'
358
+ };
359
+ Object.keys(rubyFrameworks).forEach(framework => {
360
+ const regex = new RegExp(`gem\\s+['"]${framework}['"]`, 'i');
361
+ if (regex.test(content)) {
362
+ technologies.push({
363
+ name: rubyFrameworks[framework],
364
+ category: 'framework'
365
+ });
366
+ }
367
+ });
368
+ }
369
+ catch (error) {
370
+ console.error(`Error reading Gemfile: ${error}`);
371
+ }
372
+ return technologies;
373
+ }
374
+ /**
375
+ * Detect Python frameworks from requirements content
376
+ */
377
+ detectPythonFrameworks(content) {
378
+ const frameworks = [];
379
+ const pythonFrameworks = {
380
+ 'django': 'Django',
381
+ 'flask': 'Flask',
382
+ 'fastapi': 'FastAPI',
383
+ 'starlette': 'Starlette',
384
+ 'pyramid': 'Pyramid',
385
+ 'tornado': 'Tornado',
386
+ 'aiohttp': 'aiohttp',
387
+ 'sanic': 'Sanic',
388
+ 'bottle': 'Bottle',
389
+ 'cherrypy': 'CherryPy',
390
+ 'sqlalchemy': 'SQLAlchemy',
391
+ 'pydantic': 'Pydantic',
392
+ 'celery': 'Celery'
393
+ };
394
+ Object.keys(pythonFrameworks).forEach(framework => {
395
+ // Match framework in requirements (case-insensitive)
396
+ const regex = new RegExp(`\\b${framework}\\b`, 'i');
397
+ if (regex.test(content)) {
398
+ frameworks.push({
399
+ name: pythonFrameworks[framework],
400
+ category: 'framework'
401
+ });
402
+ }
403
+ });
404
+ return frameworks;
405
+ }
406
+ /**
407
+ * Detect frameworks from npm dependencies
408
+ */
409
+ detectFrameworksFromDependencies(packageJson) {
410
+ const frameworks = [];
411
+ const allDeps = {
412
+ ...packageJson.dependencies,
413
+ ...packageJson.devDependencies
414
+ };
415
+ // Comprehensive framework detection map
416
+ const frameworkMap = {
417
+ // Frontend Frameworks
418
+ 'react': 'React',
419
+ 'react-dom': 'React',
420
+ 'vue': 'Vue',
421
+ '@vue/core': 'Vue',
422
+ 'next': 'Next.js',
423
+ 'nuxt': 'Nuxt',
424
+ '@nuxt/core': 'Nuxt',
425
+ '@angular/core': 'Angular',
426
+ 'angular': 'Angular',
427
+ 'svelte': 'Svelte',
428
+ 'astro': 'Astro',
429
+ 'remix': 'Remix',
430
+ // Backend Frameworks
431
+ 'express': 'Express',
432
+ 'koa': 'Koa',
433
+ 'hapi': 'Hapi',
434
+ 'fastify': 'Fastify',
435
+ '@nestjs/core': 'NestJS',
436
+ '@nestjs/common': 'NestJS',
437
+ 'nestjs-core': 'NestJS',
438
+ 'adonis': 'AdonisJS',
439
+ 'adonisjs': 'AdonisJS',
440
+ 'loopback': 'LoopBack',
441
+ 'strapi': 'Strapi',
442
+ 'blitz': 'Blitz',
443
+ // Full-stack
444
+ 'sveltekit': 'SvelteKit',
445
+ // Utilities & Libraries
446
+ 'webpack': 'Webpack',
447
+ 'vite': 'Vite',
448
+ 'rollup': 'Rollup',
449
+ 'parcel': 'Parcel',
450
+ 'babel': 'Babel',
451
+ 'typescript': 'TypeScript',
452
+ 'jest': 'Jest',
453
+ 'vitest': 'Vitest',
454
+ 'mocha': 'Mocha',
455
+ 'jasmine': 'Jasmine'
456
+ };
457
+ Object.keys(frameworkMap).forEach(dep => {
458
+ if (allDeps[dep]) {
459
+ frameworks.push({
460
+ name: frameworkMap[dep],
461
+ version: this.extractVersion(allDeps[dep]),
462
+ category: 'framework'
463
+ });
464
+ }
465
+ });
466
+ return frameworks;
467
+ }
468
+ /**
469
+ * Parse JSON content
470
+ */
471
+ parseJSON(content) {
472
+ try {
473
+ return JSON.parse(content);
474
+ }
475
+ catch (error) {
476
+ console.error(`Failed to parse JSON: ${error}`);
477
+ return null;
478
+ }
479
+ }
480
+ /**
481
+ * Extract Node.js version from lock files (package-lock.json, yarn.lock, pnpm-lock.yaml)
482
+ */
483
+ extractNodeVersionFromLockFile(projectPath) {
484
+ // Try package-lock.json first
485
+ const packageLockPath = path.join(projectPath, 'package-lock.json');
486
+ if (fs.existsSync(packageLockPath)) {
487
+ try {
488
+ const content = fs.readFileSync(packageLockPath, 'utf-8');
489
+ const packageLock = this.parseJSON(content);
490
+ if (packageLock?.lockfileVersion && packageLock?.packages?.['']?.engines?.node) {
491
+ return this.extractVersion(packageLock.packages[''].engines.node);
492
+ }
493
+ }
494
+ catch (error) {
495
+ console.error(`Error reading package-lock.json: ${error}`);
496
+ }
497
+ }
498
+ // Try yarn.lock (simple parsing)
499
+ const yarnLockPath = path.join(projectPath, 'yarn.lock');
500
+ if (fs.existsSync(yarnLockPath)) {
501
+ try {
502
+ const content = fs.readFileSync(yarnLockPath, 'utf-8');
503
+ // Look for node version in yarn.lock
504
+ const nodeMatch = content.match(/# yarn\.lock file.*?\nnode (\d+\.\d+\.\d+)/s);
505
+ if (nodeMatch) {
506
+ return nodeMatch[1];
507
+ }
508
+ }
509
+ catch (error) {
510
+ console.error(`Error reading yarn.lock: ${error}`);
511
+ }
512
+ }
513
+ // Try pnpm-lock.yaml (simple parsing)
514
+ const pnpmLockPath = path.join(projectPath, 'pnpm-lock.yaml');
515
+ if (fs.existsSync(pnpmLockPath)) {
516
+ try {
517
+ const content = fs.readFileSync(pnpmLockPath, 'utf-8');
518
+ // Look for node version in pnpm-lock.yaml
519
+ const nodeMatch = content.match(/engines:\s*node:\s*(['"])?(\d+\.\d+\.\d+)\1?/);
520
+ if (nodeMatch) {
521
+ return nodeMatch[2];
522
+ }
523
+ }
524
+ catch (error) {
525
+ console.error(`Error reading pnpm-lock.yaml: ${error}`);
526
+ }
527
+ }
528
+ return undefined;
529
+ }
530
+ /**
531
+ * Extract Python version from lock files or virtual environment
532
+ */
533
+ extractPythonVersionFromLockFile(projectPath) {
534
+ // Try poetry.lock
535
+ const poetryLockPath = path.join(projectPath, 'poetry.lock');
536
+ if (fs.existsSync(poetryLockPath)) {
537
+ try {
538
+ const content = fs.readFileSync(poetryLockPath, 'utf-8');
539
+ // Look for python version in metadata
540
+ const pythonMatch = content.match(/python-versions\s*=\s*"([^"]+)"/);
541
+ if (pythonMatch) {
542
+ // Extract first version mentioned
543
+ const versionMatch = pythonMatch[1].match(/(\d+\.\d+)/);
544
+ return versionMatch ? versionMatch[1] : undefined;
545
+ }
546
+ }
547
+ catch (error) {
548
+ console.error(`Error reading poetry.lock: ${error}`);
549
+ }
550
+ }
551
+ // Try Pipfile.lock
552
+ const pipfileLockPath = path.join(projectPath, 'Pipfile.lock');
553
+ if (fs.existsSync(pipfileLockPath)) {
554
+ try {
555
+ const content = fs.readFileSync(pipfileLockPath, 'utf-8');
556
+ const pipfileLock = this.parseJSON(content);
557
+ if (pipfileLock?._meta?.requires?.python_version) {
558
+ return pipfileLock._meta.requires.python_version;
559
+ }
560
+ }
561
+ catch (error) {
562
+ console.error(`Error reading Pipfile.lock: ${error}`);
563
+ }
564
+ }
565
+ // Try pdm.lock
566
+ const pdmLockPath = path.join(projectPath, 'pdm.lock');
567
+ if (fs.existsSync(pdmLockPath)) {
568
+ try {
569
+ const content = fs.readFileSync(pdmLockPath, 'utf-8');
570
+ // Look for python version in metadata
571
+ const pythonMatch = content.match(/requires-python\s*=\s*"([^"]+)"/);
572
+ if (pythonMatch) {
573
+ const versionMatch = pythonMatch[1].match(/(\d+\.\d+)/);
574
+ return versionMatch ? versionMatch[1] : undefined;
575
+ }
576
+ }
577
+ catch (error) {
578
+ console.error(`Error reading pdm.lock: ${error}`);
579
+ }
580
+ }
581
+ return undefined;
582
+ }
583
+ /**
584
+ * Extract Java version from Maven or Gradle build files
585
+ */
586
+ extractJavaVersionFromBuildFiles(projectPath) {
587
+ // Check gradle.properties or gradle-wrapper.properties
588
+ const gradlePropsPath = path.join(projectPath, 'gradle.properties');
589
+ if (fs.existsSync(gradlePropsPath)) {
590
+ try {
591
+ const content = fs.readFileSync(gradlePropsPath, 'utf-8');
592
+ const javaMatch = content.match(/org\.gradle\.java\.home=.*?java-(\d+)/);
593
+ if (javaMatch) {
594
+ return javaMatch[1];
595
+ }
596
+ }
597
+ catch (error) {
598
+ console.error(`Error reading gradle.properties: ${error}`);
599
+ }
600
+ }
601
+ // Check gradle-wrapper.properties
602
+ const wrapperPropsPath = path.join(projectPath, 'gradle', 'wrapper', 'gradle-wrapper.properties');
603
+ if (fs.existsSync(wrapperPropsPath)) {
604
+ try {
605
+ const content = fs.readFileSync(wrapperPropsPath, 'utf-8');
606
+ const javaMatch = content.match(/org\.gradle\.java\.home=.*?java-(\d+)/);
607
+ if (javaMatch) {
608
+ return javaMatch[1];
609
+ }
610
+ }
611
+ catch (error) {
612
+ console.error(`Error reading gradle-wrapper.properties: ${error}`);
613
+ }
614
+ }
615
+ return undefined;
616
+ }
617
+ /**
618
+ * Extract version from version string
619
+ * Handles common formats like "^1.0.0", "~1.0.0", "1.0.0", etc.
620
+ */
621
+ extractVersion(versionString) {
622
+ if (!versionString) {
623
+ return undefined;
624
+ }
625
+ // Remove common version specifiers
626
+ const cleaned = versionString.replace(/^[\^~>=<]*/, '').trim();
627
+ // Extract first version number
628
+ const match = cleaned.match(/^([\d.]+)/);
629
+ return match ? match[1] : undefined;
630
+ }
631
+ }
632
+ exports.TechnologyDetector = TechnologyDetector;
633
+ //# sourceMappingURL=TechnologyDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TechnologyDetector.js","sourceRoot":"","sources":["../../../src/domain/services/TechnologyDetector.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAW7B;;;GAGG;AACH,MAAa,kBAAkB;IAC7B;;;;OAIG;IACI,MAAM,CAAC,WAAmB;QAC/B,MAAM,YAAY,GAAyB,EAAE,CAAC;QAE9C,IAAI,CAAC;YACH,sCAAsC;YACtC,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;YACjE,YAAY,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;YAEvC,eAAe;YACf,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;YAC7D,YAAY,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;YAElC,aAAa;YACb,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YACtD,YAAY,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;YAEhC,aAAa;YACb,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;YACxD,YAAY,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;YAEhC,WAAW;YACX,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;YAClD,YAAY,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;YAE9B,aAAa;YACb,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAClD,YAAY,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;YAEhC,YAAY;YACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;YAC1D,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,6DAA6D;YAC7D,OAAO,CAAC,KAAK,CAAC,mCAAmC,WAAW,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,qBAAqB,CAAC,WAAmB;QAC9C,MAAM,YAAY,GAAyB,EAAE,CAAC;QAC9C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAE/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACpC,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAE5C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,YAAY,CAAC;YACtB,CAAC;YAED,4BAA4B;YAC5B,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC;YAC9C,MAAM,mBAAmB,GAAG,WAAW;gBACrC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;gBAClC,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,WAAW,CAAC,CAAC;YAErD,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,mBAAmB;gBAC5B,QAAQ,EAAE,UAAU;aACrB,CAAC,CAAC;YAEH,uBAAuB;YACvB,IAAI,WAAW,CAAC,eAAe,EAAE,UAAU,IAAI,WAAW,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC;gBACpF,MAAM,SAAS,GAAG,WAAW,CAAC,eAAe,EAAE,UAAU,IAAI,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC;gBAClG,YAAY,CAAC,IAAI,CAAC;oBAChB,IAAI,EAAE,YAAY;oBAClB,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;oBACvC,QAAQ,EAAE,UAAU;iBACrB,CAAC,CAAC;YACL,CAAC;YAED,oBAAoB;YACpB,MAAM,UAAU,GAAG,IAAI,CAAC,gCAAgC,CAAC,WAAW,CAAC,CAAC;YACtE,YAAY,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,sBAAsB,CAAC,WAAmB;QAC/C,MAAM,YAAY,GAAyB,EAAE,CAAC;QAE9C,yBAAyB;QACzB,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QACpE,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACpC,MAAM,aAAa,GAAG,IAAI,CAAC,gCAAgC,CAAC,WAAW,CAAC,CAAC;YACzE,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,aAAa;gBACtB,QAAQ,EAAE,UAAU;aACrB,CAAC,CAAC;YAEH,iDAAiD;YACjD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAC3D,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;oBACvD,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC/B,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;YAC5D,CAAC;YAED,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,uBAAuB;QACvB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;QAC/D,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;gBACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/B,4CAA4C;oBAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;oBACrE,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,WAAW,CAAC,CAAC;oBAE7H,YAAY,CAAC,IAAI,CAAC;wBAChB,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,aAAa;wBACtB,QAAQ,EAAE,UAAU;qBACrB,CAAC,CAAC;oBAEH,+CAA+C;oBAC/C,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;wBACvD,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC/B,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,mBAAmB,CAAC,WAAmB;QAC5C,MAAM,YAAY,GAAyB,EAAE,CAAC;QAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAE3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClC,YAAY,CAAC,IAAI,CAAC;oBAChB,IAAI,EAAE,MAAM;oBACZ,QAAQ,EAAE,UAAU;iBACrB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,eAAe,CAAC,WAAmB;QACxC,MAAM,YAAY,GAAyB,EAAE,CAAC;QAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAEnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACtD,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;gBACnD,QAAQ,EAAE,UAAU;aACrB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,WAAmB;QACtC,MAAM,YAAY,GAAyB,EAAE,CAAC;QAE9C,gBAAgB;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAClD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAClD,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;oBACjC,yCAAyC;oBACzC,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;oBAChE,YAAY,CAAC,IAAI,CAAC;wBAChB,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;wBACjD,QAAQ,EAAE,UAAU;qBACrB,CAAC,CAAC;oBAEH,eAAe;oBACf,YAAY,CAAC,IAAI,CAAC;wBAChB,IAAI,EAAE,OAAO;wBACb,QAAQ,EAAE,MAAM;qBACjB,CAAC,CAAC;oBAEH,2BAA2B;oBAC3B,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;wBAC5E,YAAY,CAAC,IAAI,CAAC;4BAChB,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,WAAW;yBACtB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,qBAAqB;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACrD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBAChC,iDAAiD;oBACjD,MAAM,WAAW,GAAG,IAAI,CAAC,gCAAgC,CAAC,WAAW,CAAC,CAAC;oBAEvE,YAAY,CAAC,IAAI,CAAC;wBAChB,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,WAAW;wBACpB,QAAQ,EAAE,UAAU;qBACrB,CAAC,CAAC;oBAEH,gBAAgB;oBAChB,YAAY,CAAC,IAAI,CAAC;wBAChB,IAAI,EAAE,QAAQ;wBACd,QAAQ,EAAE,MAAM;qBACjB,CAAC,CAAC;oBAEH,2BAA2B;oBAC3B,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAClE,YAAY,CAAC,IAAI,CAAC;4BAChB,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,WAAW;yBACtB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,sBAAsB,CAAC,WAAmB;QAC/C,MAAM,YAAY,GAAyB,EAAE,CAAC;QAC9C,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAEjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACrC,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAE7C,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,YAAY,CAAC;YACtB,CAAC;YAED,kCAAkC;YAClC,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC;YAC7C,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;gBACjE,QAAQ,EAAE,UAAU;aACrB,CAAC,CAAC;YAEH,oBAAoB;YACpB,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBACzB,IAAI,YAAY,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBAC9C,YAAY,CAAC,IAAI,CAAC;wBAChB,IAAI,EAAE,SAAS;wBACf,QAAQ,EAAE,WAAW;qBACtB,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,YAAY,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBAC5C,YAAY,CAAC,IAAI,CAAC;wBAChB,IAAI,EAAE,SAAS;wBACf,QAAQ,EAAE,WAAW;qBACtB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,WAAmB;QAC1C,MAAM,YAAY,GAAyB,EAAE,CAAC;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAEtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAEtD,cAAc;YACd,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,UAAU;aACrB,CAAC,CAAC;YAEH,yBAAyB;YACzB,MAAM,cAAc,GAA2B;gBAC7C,OAAO,EAAE,OAAO;gBAChB,SAAS,EAAE,SAAS;gBACpB,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,OAAO;gBAChB,SAAS,EAAE,SAAS;aACrB,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;gBAC9C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,cAAc,SAAS,MAAM,EAAE,GAAG,CAAC,CAAC;gBAC7D,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxB,YAAY,CAAC,IAAI,CAAC;wBAChB,IAAI,EAAE,cAAc,CAAC,SAAS,CAAC;wBAC/B,QAAQ,EAAE,WAAW;qBACtB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,OAAe;QAC5C,MAAM,UAAU,GAAyB,EAAE,CAAC;QAE5C,MAAM,gBAAgB,GAA2B;YAC/C,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,SAAS;YACpB,WAAW,EAAE,WAAW;YACxB,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,SAAS;YACpB,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,UAAU;YACtB,YAAY,EAAE,YAAY;YAC1B,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,QAAQ;SACnB,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YAChD,qDAAqD;YACrD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,SAAS,KAAK,EAAE,GAAG,CAAC,CAAC;YACpD,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxB,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,gBAAgB,CAAC,SAAS,CAAC;oBACjC,QAAQ,EAAE,WAAW;iBACtB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,gCAAgC,CAAC,WAAgB;QACvD,MAAM,UAAU,GAAyB,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG;YACd,GAAG,WAAW,CAAC,YAAY;YAC3B,GAAG,WAAW,CAAC,eAAe;SAC/B,CAAC;QAEF,wCAAwC;QACxC,MAAM,YAAY,GAA2B;YAC3C,sBAAsB;YACtB,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,OAAO;YACpB,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,MAAM;YACd,YAAY,EAAE,MAAM;YACpB,eAAe,EAAE,SAAS;YAC1B,SAAS,EAAE,SAAS;YACpB,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,OAAO;YAEhB,qBAAqB;YACrB,SAAS,EAAE,SAAS;YACpB,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,SAAS;YACpB,cAAc,EAAE,QAAQ;YACxB,gBAAgB,EAAE,QAAQ;YAC1B,aAAa,EAAE,QAAQ;YACvB,QAAQ,EAAE,UAAU;YACpB,UAAU,EAAE,UAAU;YACtB,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,OAAO;YAEhB,aAAa;YACb,WAAW,EAAE,WAAW;YAExB,wBAAwB;YACxB,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,OAAO;YAChB,YAAY,EAAE,YAAY;YAC1B,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,SAAS;SACrB,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACtC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjB,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC;oBACvB,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBAC1C,QAAQ,EAAE,WAAW;iBACtB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,OAAe;QAC/B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;YAChD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,8BAA8B,CAAC,WAAmB;QACxD,8BAA8B;QAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;QACpE,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;gBAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,WAAW,EAAE,eAAe,IAAI,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBAC/E,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACzD,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBACvD,qCAAqC;gBACrC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;gBAC/E,IAAI,SAAS,EAAE,CAAC;oBACd,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;QAC9D,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBACvD,0CAA0C;gBAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;gBAChF,IAAI,SAAS,EAAE,CAAC;oBACd,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,gCAAgC,CAAC,WAAmB;QAC1D,kBAAkB;QAClB,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC7D,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;gBACzD,sCAAsC;gBACtC,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBACrE,IAAI,WAAW,EAAE,CAAC;oBAChB,kCAAkC;oBAClC,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;oBACxD,OAAO,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACpD,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC/D,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;gBAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;oBACjD,OAAO,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC;gBACnD,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,eAAe;QACf,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACvD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBACtD,sCAAsC;gBACtC,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBACrE,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;oBACxD,OAAO,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACpD,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,gCAAgC,CAAC,WAAmB;QAC1D,uDAAuD;QACvD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;QACpE,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;gBAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBACzE,IAAI,SAAS,EAAE,CAAC;oBACd,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,2BAA2B,CAAC,CAAC;QAClG,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBACzE,IAAI,SAAS,EAAE,CAAC;oBACd,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,4CAA4C,KAAK,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACK,cAAc,CAAC,aAAqB;QAC1C,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,mCAAmC;QACnC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAE/D,+BAA+B;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACzC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtC,CAAC;CACF;AA3oBD,gDA2oBC"}