driftdetect-core 0.6.1 → 0.7.1

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 (141) hide show
  1. package/LICENSE +21 -0
  2. package/dist/constants/analysis/categorizer.d.ts +27 -0
  3. package/dist/constants/analysis/categorizer.d.ts.map +1 -0
  4. package/dist/constants/analysis/categorizer.js +364 -0
  5. package/dist/constants/analysis/categorizer.js.map +1 -0
  6. package/dist/constants/analysis/consistency-analyzer.d.ts +77 -0
  7. package/dist/constants/analysis/consistency-analyzer.d.ts.map +1 -0
  8. package/dist/constants/analysis/consistency-analyzer.js +176 -0
  9. package/dist/constants/analysis/consistency-analyzer.js.map +1 -0
  10. package/dist/constants/analysis/dead-constant-detector.d.ts +79 -0
  11. package/dist/constants/analysis/dead-constant-detector.d.ts.map +1 -0
  12. package/dist/constants/analysis/dead-constant-detector.js +242 -0
  13. package/dist/constants/analysis/dead-constant-detector.js.map +1 -0
  14. package/dist/constants/analysis/magic-detector.d.ts +116 -0
  15. package/dist/constants/analysis/magic-detector.d.ts.map +1 -0
  16. package/dist/constants/analysis/magic-detector.js +425 -0
  17. package/dist/constants/analysis/magic-detector.js.map +1 -0
  18. package/dist/constants/analysis/reference-finder.d.ts +87 -0
  19. package/dist/constants/analysis/reference-finder.d.ts.map +1 -0
  20. package/dist/constants/analysis/reference-finder.js +269 -0
  21. package/dist/constants/analysis/reference-finder.js.map +1 -0
  22. package/dist/constants/analysis/security-scanner.d.ts +115 -0
  23. package/dist/constants/analysis/security-scanner.d.ts.map +1 -0
  24. package/dist/constants/analysis/security-scanner.js +429 -0
  25. package/dist/constants/analysis/security-scanner.js.map +1 -0
  26. package/dist/constants/extractors/base-extractor.d.ts +97 -0
  27. package/dist/constants/extractors/base-extractor.d.ts.map +1 -0
  28. package/dist/constants/extractors/base-extractor.js +285 -0
  29. package/dist/constants/extractors/base-extractor.js.map +1 -0
  30. package/dist/constants/extractors/regex/base-regex.d.ts +67 -0
  31. package/dist/constants/extractors/regex/base-regex.d.ts.map +1 -0
  32. package/dist/constants/extractors/regex/base-regex.js +209 -0
  33. package/dist/constants/extractors/regex/base-regex.js.map +1 -0
  34. package/dist/constants/extractors/regex/csharp-regex.d.ts +39 -0
  35. package/dist/constants/extractors/regex/csharp-regex.d.ts.map +1 -0
  36. package/dist/constants/extractors/regex/csharp-regex.js +316 -0
  37. package/dist/constants/extractors/regex/csharp-regex.js.map +1 -0
  38. package/dist/constants/extractors/regex/go-regex.d.ts +40 -0
  39. package/dist/constants/extractors/regex/go-regex.d.ts.map +1 -0
  40. package/dist/constants/extractors/regex/go-regex.js +297 -0
  41. package/dist/constants/extractors/regex/go-regex.js.map +1 -0
  42. package/dist/constants/extractors/regex/java-regex.d.ts +43 -0
  43. package/dist/constants/extractors/regex/java-regex.d.ts.map +1 -0
  44. package/dist/constants/extractors/regex/java-regex.js +276 -0
  45. package/dist/constants/extractors/regex/java-regex.js.map +1 -0
  46. package/dist/constants/extractors/regex/php-regex.d.ts +39 -0
  47. package/dist/constants/extractors/regex/php-regex.d.ts.map +1 -0
  48. package/dist/constants/extractors/regex/php-regex.js +270 -0
  49. package/dist/constants/extractors/regex/php-regex.js.map +1 -0
  50. package/dist/constants/extractors/regex/python-regex.d.ts +39 -0
  51. package/dist/constants/extractors/regex/python-regex.d.ts.map +1 -0
  52. package/dist/constants/extractors/regex/python-regex.js +287 -0
  53. package/dist/constants/extractors/regex/python-regex.js.map +1 -0
  54. package/dist/constants/extractors/regex/typescript-regex.d.ts +35 -0
  55. package/dist/constants/extractors/regex/typescript-regex.d.ts.map +1 -0
  56. package/dist/constants/extractors/regex/typescript-regex.js +313 -0
  57. package/dist/constants/extractors/regex/typescript-regex.js.map +1 -0
  58. package/dist/constants/index.d.ts +26 -0
  59. package/dist/constants/index.d.ts.map +1 -0
  60. package/dist/constants/index.js +36 -0
  61. package/dist/constants/index.js.map +1 -0
  62. package/dist/constants/integration/callgraph-adapter.d.ts +167 -0
  63. package/dist/constants/integration/callgraph-adapter.d.ts.map +1 -0
  64. package/dist/constants/integration/callgraph-adapter.js +287 -0
  65. package/dist/constants/integration/callgraph-adapter.js.map +1 -0
  66. package/dist/constants/integration/index.d.ts +10 -0
  67. package/dist/constants/integration/index.d.ts.map +1 -0
  68. package/dist/constants/integration/index.js +13 -0
  69. package/dist/constants/integration/index.js.map +1 -0
  70. package/dist/constants/integration/pattern-adapter.d.ts +171 -0
  71. package/dist/constants/integration/pattern-adapter.d.ts.map +1 -0
  72. package/dist/constants/integration/pattern-adapter.js +331 -0
  73. package/dist/constants/integration/pattern-adapter.js.map +1 -0
  74. package/dist/constants/integration/scanner-adapter.d.ts +153 -0
  75. package/dist/constants/integration/scanner-adapter.d.ts.map +1 -0
  76. package/dist/constants/integration/scanner-adapter.js +337 -0
  77. package/dist/constants/integration/scanner-adapter.js.map +1 -0
  78. package/dist/constants/store/constant-store.d.ts +117 -0
  79. package/dist/constants/store/constant-store.d.ts.map +1 -0
  80. package/dist/constants/store/constant-store.js +367 -0
  81. package/dist/constants/store/constant-store.js.map +1 -0
  82. package/dist/constants/types.d.ts +423 -0
  83. package/dist/constants/types.d.ts.map +1 -0
  84. package/dist/constants/types.js +43 -0
  85. package/dist/constants/types.js.map +1 -0
  86. package/dist/constraints/store/constraint-store.d.ts.map +1 -1
  87. package/dist/constraints/store/constraint-store.js +37 -2
  88. package/dist/constraints/store/constraint-store.js.map +1 -1
  89. package/dist/environment/env-scanner.d.ts +53 -0
  90. package/dist/environment/env-scanner.d.ts.map +1 -0
  91. package/dist/environment/env-scanner.js +290 -0
  92. package/dist/environment/env-scanner.js.map +1 -0
  93. package/dist/environment/env-store.d.ts +70 -0
  94. package/dist/environment/env-store.d.ts.map +1 -0
  95. package/dist/environment/env-store.js +201 -0
  96. package/dist/environment/env-store.js.map +1 -0
  97. package/dist/environment/extractors/base-env-extractor.d.ts +56 -0
  98. package/dist/environment/extractors/base-env-extractor.d.ts.map +1 -0
  99. package/dist/environment/extractors/base-env-extractor.js +74 -0
  100. package/dist/environment/extractors/base-env-extractor.js.map +1 -0
  101. package/dist/environment/extractors/csharp-env-extractor.d.ts +49 -0
  102. package/dist/environment/extractors/csharp-env-extractor.d.ts.map +1 -0
  103. package/dist/environment/extractors/csharp-env-extractor.js +240 -0
  104. package/dist/environment/extractors/csharp-env-extractor.js.map +1 -0
  105. package/dist/environment/extractors/go-env-extractor.d.ts +53 -0
  106. package/dist/environment/extractors/go-env-extractor.d.ts.map +1 -0
  107. package/dist/environment/extractors/go-env-extractor.js +267 -0
  108. package/dist/environment/extractors/go-env-extractor.js.map +1 -0
  109. package/dist/environment/extractors/index.d.ts +13 -0
  110. package/dist/environment/extractors/index.d.ts.map +1 -0
  111. package/dist/environment/extractors/index.js +13 -0
  112. package/dist/environment/extractors/index.js.map +1 -0
  113. package/dist/environment/extractors/java-env-extractor.d.ts +58 -0
  114. package/dist/environment/extractors/java-env-extractor.d.ts.map +1 -0
  115. package/dist/environment/extractors/java-env-extractor.js +219 -0
  116. package/dist/environment/extractors/java-env-extractor.js.map +1 -0
  117. package/dist/environment/extractors/php-env-extractor.d.ts +58 -0
  118. package/dist/environment/extractors/php-env-extractor.d.ts.map +1 -0
  119. package/dist/environment/extractors/php-env-extractor.js +231 -0
  120. package/dist/environment/extractors/php-env-extractor.js.map +1 -0
  121. package/dist/environment/extractors/python-env-extractor.d.ts +50 -0
  122. package/dist/environment/extractors/python-env-extractor.d.ts.map +1 -0
  123. package/dist/environment/extractors/python-env-extractor.js +219 -0
  124. package/dist/environment/extractors/python-env-extractor.js.map +1 -0
  125. package/dist/environment/extractors/typescript-env-extractor.d.ts +54 -0
  126. package/dist/environment/extractors/typescript-env-extractor.d.ts.map +1 -0
  127. package/dist/environment/extractors/typescript-env-extractor.js +228 -0
  128. package/dist/environment/extractors/typescript-env-extractor.js.map +1 -0
  129. package/dist/environment/index.d.ts +11 -0
  130. package/dist/environment/index.d.ts.map +1 -0
  131. package/dist/environment/index.js +15 -0
  132. package/dist/environment/index.js.map +1 -0
  133. package/dist/environment/types.d.ts +145 -0
  134. package/dist/environment/types.d.ts.map +1 -0
  135. package/dist/environment/types.js +84 -0
  136. package/dist/environment/types.js.map +1 -0
  137. package/dist/index.d.ts +4 -0
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +40 -0
  140. package/dist/index.js.map +1 -1
  141. package/package.json +13 -13
@@ -0,0 +1,367 @@
1
+ /**
2
+ * Constant Store
3
+ *
4
+ * Persistence layer for constants and enums with sharded storage
5
+ * and fast indexing.
6
+ */
7
+ import { createHash } from 'crypto';
8
+ import { promises as fs } from 'fs';
9
+ import * as path from 'path';
10
+ /**
11
+ * Constant store for persistence
12
+ */
13
+ export class ConstantStore {
14
+ rootDir;
15
+ constantsDir;
16
+ filesDir;
17
+ indexPath;
18
+ /** In-memory index cache */
19
+ indexCache = null;
20
+ /** In-memory shard cache */
21
+ shardCache = new Map();
22
+ constructor(config) {
23
+ this.rootDir = config.rootDir;
24
+ this.constantsDir = path.join(config.rootDir, '.drift', 'lake', 'constants');
25
+ this.filesDir = path.join(this.constantsDir, 'files');
26
+ this.indexPath = path.join(this.constantsDir, 'index.json');
27
+ }
28
+ /**
29
+ * Initialize the store (create directories)
30
+ */
31
+ async initialize() {
32
+ await fs.mkdir(this.filesDir, { recursive: true });
33
+ }
34
+ /**
35
+ * Save extraction result for a file
36
+ */
37
+ async saveFileResult(result, contentHash) {
38
+ const shard = this.createShard(result, contentHash);
39
+ const shardPath = this.getShardPath(result.file);
40
+ await fs.mkdir(path.dirname(shardPath), { recursive: true });
41
+ await fs.writeFile(shardPath, JSON.stringify(shard, null, 2));
42
+ // Update cache
43
+ this.shardCache.set(result.file, shard);
44
+ // Invalidate index cache
45
+ this.indexCache = null;
46
+ }
47
+ /**
48
+ * Get extraction result for a file
49
+ */
50
+ async getFileResult(filePath) {
51
+ // Check cache first
52
+ if (this.shardCache.has(filePath)) {
53
+ return this.shardCache.get(filePath);
54
+ }
55
+ const shardPath = this.getShardPath(filePath);
56
+ try {
57
+ const content = await fs.readFile(shardPath, 'utf-8');
58
+ const shard = JSON.parse(content);
59
+ this.shardCache.set(filePath, shard);
60
+ return shard;
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ /**
67
+ * Check if a file needs re-extraction
68
+ */
69
+ async needsExtraction(filePath, contentHash) {
70
+ const shard = await this.getFileResult(filePath);
71
+ if (!shard) {
72
+ return true;
73
+ }
74
+ return shard.contentHash !== contentHash;
75
+ }
76
+ /**
77
+ * Delete extraction result for a file
78
+ */
79
+ async deleteFileResult(filePath) {
80
+ const shardPath = this.getShardPath(filePath);
81
+ try {
82
+ await fs.unlink(shardPath);
83
+ }
84
+ catch {
85
+ // File doesn't exist, that's fine
86
+ }
87
+ this.shardCache.delete(filePath);
88
+ this.indexCache = null;
89
+ }
90
+ /**
91
+ * Get all constants
92
+ */
93
+ async getAllConstants() {
94
+ const shards = await this.getAllShards();
95
+ return shards.flatMap((s) => s.constants);
96
+ }
97
+ /**
98
+ * Get all enums
99
+ */
100
+ async getAllEnums() {
101
+ const shards = await this.getAllShards();
102
+ return shards.flatMap((s) => s.enums);
103
+ }
104
+ /**
105
+ * Get constants by category
106
+ */
107
+ async getConstantsByCategory(category) {
108
+ const constants = await this.getAllConstants();
109
+ return constants.filter((c) => c.category === category);
110
+ }
111
+ /**
112
+ * Get constants by file
113
+ */
114
+ async getConstantsByFile(filePath) {
115
+ const shard = await this.getFileResult(filePath);
116
+ return shard?.constants ?? [];
117
+ }
118
+ /**
119
+ * Get constant by ID
120
+ */
121
+ async getConstantById(id) {
122
+ const constants = await this.getAllConstants();
123
+ return constants.find((c) => c.id === id) ?? null;
124
+ }
125
+ /**
126
+ * Get enum by ID
127
+ */
128
+ async getEnumById(id) {
129
+ const enums = await this.getAllEnums();
130
+ return enums.find((e) => e.id === id) ?? null;
131
+ }
132
+ /**
133
+ * Search constants by name
134
+ */
135
+ async searchByName(query) {
136
+ const constants = await this.getAllConstants();
137
+ const lowerQuery = query.toLowerCase();
138
+ return constants.filter((c) => c.name.toLowerCase().includes(lowerQuery) ||
139
+ c.qualifiedName.toLowerCase().includes(lowerQuery));
140
+ }
141
+ /**
142
+ * Get or rebuild the index
143
+ */
144
+ async getIndex() {
145
+ if (this.indexCache) {
146
+ return this.indexCache;
147
+ }
148
+ // Try to load from disk
149
+ try {
150
+ const content = await fs.readFile(this.indexPath, 'utf-8');
151
+ this.indexCache = JSON.parse(content);
152
+ return this.indexCache;
153
+ }
154
+ catch {
155
+ // Rebuild index
156
+ return this.rebuildIndex();
157
+ }
158
+ }
159
+ /**
160
+ * Rebuild the index from all shards
161
+ */
162
+ async rebuildIndex() {
163
+ const shards = await this.getAllShards();
164
+ const byCategory = {
165
+ config: [],
166
+ api: [],
167
+ status: [],
168
+ error: [],
169
+ feature_flag: [],
170
+ limit: [],
171
+ regex: [],
172
+ path: [],
173
+ env: [],
174
+ security: [],
175
+ uncategorized: [],
176
+ };
177
+ const byFile = {};
178
+ const byName = {};
179
+ const enumsByFile = {};
180
+ const stats = {
181
+ totalConstants: 0,
182
+ totalEnums: 0,
183
+ totalEnumMembers: 0,
184
+ byLanguage: {},
185
+ byCategory: {},
186
+ byKind: {},
187
+ issues: {
188
+ magicValues: 0,
189
+ deadConstants: 0,
190
+ potentialSecrets: 0,
191
+ inconsistentValues: 0,
192
+ },
193
+ };
194
+ for (const shard of shards) {
195
+ // Index constants
196
+ for (const constant of shard.constants) {
197
+ stats.totalConstants++;
198
+ // By category
199
+ byCategory[constant.category].push(constant.id);
200
+ stats.byCategory[constant.category] = (stats.byCategory[constant.category] ?? 0) + 1;
201
+ // By file
202
+ if (!byFile[constant.file]) {
203
+ byFile[constant.file] = [];
204
+ }
205
+ byFile[constant.file].push(constant.id);
206
+ // By name
207
+ if (!byName[constant.name]) {
208
+ byName[constant.name] = [];
209
+ }
210
+ byName[constant.name].push(constant.id);
211
+ // By language
212
+ stats.byLanguage[constant.language] = (stats.byLanguage[constant.language] ?? 0) + 1;
213
+ // By kind
214
+ stats.byKind[constant.kind] = (stats.byKind[constant.kind] ?? 0) + 1;
215
+ // Count security issues
216
+ if (constant.category === 'security') {
217
+ stats.issues.potentialSecrets++;
218
+ }
219
+ }
220
+ // Index enums
221
+ for (const enumDef of shard.enums) {
222
+ stats.totalEnums++;
223
+ stats.totalEnumMembers += enumDef.members.length;
224
+ if (!enumsByFile[enumDef.file]) {
225
+ enumsByFile[enumDef.file] = [];
226
+ }
227
+ enumsByFile[enumDef.file].push(enumDef.id);
228
+ }
229
+ }
230
+ // Check for inconsistent values (same name, different values)
231
+ for (const [_name, ids] of Object.entries(byName)) {
232
+ if (ids.length > 1) {
233
+ const values = new Set();
234
+ for (const id of ids) {
235
+ const constant = shards
236
+ .flatMap((s) => s.constants)
237
+ .find((c) => c.id === id);
238
+ if (constant?.value !== undefined) {
239
+ values.add(String(constant.value));
240
+ }
241
+ }
242
+ if (values.size > 1) {
243
+ stats.issues.inconsistentValues++;
244
+ }
245
+ }
246
+ }
247
+ const index = {
248
+ version: '1.0',
249
+ generatedAt: new Date().toISOString(),
250
+ projectRoot: this.rootDir,
251
+ byCategory,
252
+ byFile,
253
+ byName,
254
+ enumsByFile,
255
+ stats,
256
+ };
257
+ // Ensure directory exists before saving
258
+ await fs.mkdir(this.constantsDir, { recursive: true });
259
+ // Save index
260
+ await fs.writeFile(this.indexPath, JSON.stringify(index, null, 2));
261
+ this.indexCache = index;
262
+ return index;
263
+ }
264
+ /**
265
+ * Get statistics
266
+ */
267
+ async getStats() {
268
+ const index = await this.getIndex();
269
+ return index.stats;
270
+ }
271
+ /**
272
+ * Clear all data
273
+ */
274
+ async clear() {
275
+ try {
276
+ await fs.rm(this.constantsDir, { recursive: true, force: true });
277
+ }
278
+ catch {
279
+ // Directory doesn't exist
280
+ }
281
+ this.indexCache = null;
282
+ this.shardCache.clear();
283
+ await this.initialize();
284
+ }
285
+ /**
286
+ * Get all shards
287
+ */
288
+ async getAllShards() {
289
+ const shards = [];
290
+ try {
291
+ const files = await this.walkDirectory(this.filesDir);
292
+ for (const file of files) {
293
+ if (file.endsWith('.json')) {
294
+ try {
295
+ const content = await fs.readFile(file, 'utf-8');
296
+ const shard = JSON.parse(content);
297
+ shards.push(shard);
298
+ }
299
+ catch {
300
+ // Skip invalid files
301
+ }
302
+ }
303
+ }
304
+ }
305
+ catch {
306
+ // Directory doesn't exist yet
307
+ }
308
+ return shards;
309
+ }
310
+ /**
311
+ * Walk directory recursively
312
+ */
313
+ async walkDirectory(dir) {
314
+ const files = [];
315
+ try {
316
+ const entries = await fs.readdir(dir, { withFileTypes: true });
317
+ for (const entry of entries) {
318
+ const fullPath = path.join(dir, entry.name);
319
+ if (entry.isDirectory()) {
320
+ files.push(...(await this.walkDirectory(fullPath)));
321
+ }
322
+ else {
323
+ files.push(fullPath);
324
+ }
325
+ }
326
+ }
327
+ catch {
328
+ // Directory doesn't exist
329
+ }
330
+ return files;
331
+ }
332
+ /**
333
+ * Get shard path for a file
334
+ */
335
+ getShardPath(filePath) {
336
+ const hash = this.hashFilePath(filePath);
337
+ return path.join(this.filesDir, `${hash}.json`);
338
+ }
339
+ /**
340
+ * Hash a file path for shard naming
341
+ */
342
+ hashFilePath(filePath) {
343
+ return createHash('sha256').update(filePath).digest('hex').slice(0, 16);
344
+ }
345
+ /**
346
+ * Create a shard from extraction result
347
+ */
348
+ createShard(result, contentHash) {
349
+ return {
350
+ version: '1.0',
351
+ file: result.file,
352
+ contentHash: contentHash ?? this.hashContent(JSON.stringify(result)),
353
+ extractedAt: new Date().toISOString(),
354
+ constants: result.constants,
355
+ enums: result.enums,
356
+ references: result.references,
357
+ quality: result.quality,
358
+ };
359
+ }
360
+ /**
361
+ * Hash content for change detection
362
+ */
363
+ hashContent(content) {
364
+ return createHash('sha256').update(content).digest('hex');
365
+ }
366
+ }
367
+ //# sourceMappingURL=constant-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constant-store.js","sourceRoot":"","sources":["../../../src/constants/store/constant-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAqB7B;;GAEG;AACH,MAAM,OAAO,aAAa;IACP,OAAO,CAAS;IAChB,YAAY,CAAS;IACrB,QAAQ,CAAS;IACjB,SAAS,CAAS;IAEnC,4BAA4B;IACpB,UAAU,GAAyB,IAAI,CAAC;IAEhD,4BAA4B;IACpB,UAAU,GAAmC,IAAI,GAAG,EAAE,CAAC;IAE/D,YAAY,MAA2B;QACrC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAC7E,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,MAA0B,EAAE,WAAoB;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE9D,eAAe;QACf,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAExC,yBAAyB;QACzB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,oBAAoB;QACpB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;QACxC,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,CAAC;YACvD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,WAAmB;QACzD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC,WAAW,KAAK,WAAW,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QACzC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QACzC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB,CAAC,QAA0B;QACrD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,QAAgB;QACvC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACjD,OAAO,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,EAAU;QAC9B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,KAAa;QAC9B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,OAAO,SAAS,CAAC,MAAM,CACrB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;YACzC,CAAC,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CACrD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QAED,wBAAwB;QACxB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC3D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;YACvD,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;YAChB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAEzC,MAAM,UAAU,GAAuC;YACrD,MAAM,EAAE,EAAE;YACV,GAAG,EAAE,EAAE;YACP,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,EAAE;YACT,YAAY,EAAE,EAAE;YAChB,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,EAAE;YACR,GAAG,EAAE,EAAE;YACP,QAAQ,EAAE,EAAE;YACZ,aAAa,EAAE,EAAE;SAClB,CAAC;QAEF,MAAM,MAAM,GAA6B,EAAE,CAAC;QAC5C,MAAM,MAAM,GAA6B,EAAE,CAAC;QAC5C,MAAM,WAAW,GAA6B,EAAE,CAAC;QAEjD,MAAM,KAAK,GAAkB;YAC3B,cAAc,EAAE,CAAC;YACjB,UAAU,EAAE,CAAC;YACb,gBAAgB,EAAE,CAAC;YACnB,UAAU,EAAE,EAAsC;YAClD,UAAU,EAAE,EAAsC;YAClD,MAAM,EAAE,EAAkC;YAC1C,MAAM,EAAE;gBACN,WAAW,EAAE,CAAC;gBACd,aAAa,EAAE,CAAC;gBAChB,gBAAgB,EAAE,CAAC;gBACnB,kBAAkB,EAAE,CAAC;aACtB;SACF,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,kBAAkB;YAClB,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACvC,KAAK,CAAC,cAAc,EAAE,CAAC;gBAEvB,cAAc;gBACd,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAChD,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBAErF,UAAU;gBACV,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC7B,CAAC;gBACD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAEzC,UAAU;gBACV,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC7B,CAAC;gBACD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAEzC,cAAc;gBACd,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBAErF,UAAU;gBACV,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBAErE,wBAAwB;gBACxB,IAAI,QAAQ,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;oBACrC,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAClC,CAAC;YACH,CAAC;YAED,cAAc;YACd,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAClC,KAAK,CAAC,UAAU,EAAE,CAAC;gBACnB,KAAK,CAAC,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;gBAEjD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC/B,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACjC,CAAC;gBACD,WAAW,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;gBACjC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;oBACrB,MAAM,QAAQ,GAAG,MAAM;yBACpB,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;yBAC3B,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC5B,IAAI,QAAQ,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;wBAClC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;oBACrC,CAAC;gBACH,CAAC;gBACD,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBACpB,KAAK,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAkB;YAC3B,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,WAAW,EAAE,IAAI,CAAC,OAAO;YACzB,UAAU;YACV,MAAM;YACN,MAAM;YACN,WAAW;YACX,KAAK;SACN,CAAC;QAEF,wCAAwC;QACxC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvD,aAAa;QACb,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAExB,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY;QACxB,MAAM,MAAM,GAAwB,EAAE,CAAC;QAEvC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3B,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;wBACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,CAAC;wBACvD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACrB,CAAC;oBAAC,MAAM,CAAC;wBACP,qBAAqB;oBACvB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,GAAW;QACrC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAE/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACtD,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,QAAgB;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,QAAgB;QACnC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,MAA0B,EAAE,WAAoB;QAClE,OAAO;YACL,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACpE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,OAAe;QACjC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;CACF"}