@theihtisham/agent-shadow-brain 4.0.3 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,502 @@
1
+ // src/brain/context-recall.ts — Context-Triggered Associative Recall
2
+ // Activates memories based on current work context, not just search queries
3
+ // v5.0.0 — Infinite Intelligence Edition
4
+ import * as fs from 'fs';
5
+ import * as path from 'path';
6
+ import * as crypto from 'crypto';
7
+ const STORE_DIR = path.join(process.env.HOME || process.env.USERPROFILE || '~', '.shadow-brain', 'context-recall');
8
+ /**
9
+ * ContextRecall — associative memory activation engine.
10
+ *
11
+ * Instead of requiring explicit search queries, this engine monitors the
12
+ * current work context (file being edited, keywords, project type, time)
13
+ * and automatically activates relevant memories.
14
+ *
15
+ * Activation triggers:
16
+ * 1. File path pattern matching (e.g., editing auth/*.ts triggers security memories)
17
+ * 2. Keyword detection (e.g., "database" triggers SQL/pattern memories)
18
+ * 3. Category association (e.g., "bug-fix" context loads past fix patterns)
19
+ * 4. Temporal patterns (time-of-day, day-of-week work habits)
20
+ * 5. Co-occurrence (memories frequently activated together strengthen their link)
21
+ */
22
+ export class ContextRecall {
23
+ constructor(hierarchicalMemory, customDir) {
24
+ this.triggers = new Map();
25
+ this.activationLinks = new Map();
26
+ this.recentActivations = [];
27
+ this.hierarchicalMemory = hierarchicalMemory;
28
+ this.storeDir = customDir || STORE_DIR;
29
+ this.loadFromDisk();
30
+ }
31
+ // ── Core Operations ──────────────────────────────────────────────────────────
32
+ /** Activate memories based on current work context */
33
+ recall(context, topK = 20) {
34
+ const activationScores = new Map();
35
+ // Phase 1: Score all entries by context relevance
36
+ const allEntries = this.getAllEntries();
37
+ for (const entry of allEntries) {
38
+ const triggers = this.matchTriggers(entry.id, context);
39
+ if (triggers.length === 0)
40
+ continue;
41
+ let score = 0;
42
+ for (const trigger of triggers) {
43
+ score += trigger.strength;
44
+ }
45
+ // Recency boost — recently accessed entries are more relevant
46
+ const recencyMs = Date.now() - entry.lastAccessed.getTime();
47
+ const recencyDays = recencyMs / (1000 * 60 * 60 * 24);
48
+ score *= 1 / (1 + recencyDays * 0.05);
49
+ // Importance boost
50
+ score *= 0.5 + entry.importance * 0.5;
51
+ // Higher-tier entries get a relevance premium
52
+ const tierBonus = {
53
+ raw: 1.0,
54
+ summary: 1.15,
55
+ pattern: 1.3,
56
+ principle: 1.5,
57
+ };
58
+ score *= tierBonus[entry.tier];
59
+ if (score > 0.2) {
60
+ activationScores.set(entry.id, { score, triggers });
61
+ }
62
+ }
63
+ // Phase 2: Co-occurrence spreading activation
64
+ for (const [entryId] of activationScores) {
65
+ const links = this.activationLinks.get(entryId) || [];
66
+ for (const link of links) {
67
+ if (activationScores.has(link.targetId)) {
68
+ // Boost already-activated neighbors
69
+ const existing = activationScores.get(link.targetId);
70
+ existing.score += link.strength * 0.15;
71
+ }
72
+ else {
73
+ // Weakly activate linked entries
74
+ const linkedEntry = this.hierarchicalMemory.get(link.targetId);
75
+ if (linkedEntry) {
76
+ activationScores.set(link.targetId, {
77
+ score: link.strength * 0.3,
78
+ triggers: [{
79
+ patterns: [`co-occurrence with ${entryId}`],
80
+ strength: link.strength * 0.3,
81
+ recency: Date.now() - link.lastActivated.getTime(),
82
+ }],
83
+ });
84
+ }
85
+ }
86
+ }
87
+ }
88
+ // Phase 3: Build results sorted by score
89
+ const results = [];
90
+ const sorted = Array.from(activationScores.entries())
91
+ .sort((a, b) => b[1].score - a[1].score)
92
+ .slice(0, topK);
93
+ for (const [entryId, { score, triggers: matchedTriggers }] of sorted) {
94
+ const entry = this.hierarchicalMemory.get(entryId);
95
+ if (!entry)
96
+ continue;
97
+ results.push({
98
+ entry,
99
+ relevanceScore: Math.min(1, score),
100
+ activatedTriggers: matchedTriggers.flatMap(t => t.patterns),
101
+ activationPath: this.buildActivationPath(entryId, context),
102
+ });
103
+ // Update access tracking
104
+ this.recentActivations.push({
105
+ entryId,
106
+ timestamp: new Date(),
107
+ context,
108
+ });
109
+ }
110
+ // Phase 4: Update co-occurrence links for co-activated entries
111
+ this.updateCoOccurrence(results.map(r => r.entry.id));
112
+ // Phase 5: Learn new triggers from this context
113
+ this.learnTriggers(context, results);
114
+ // Trim recent activations buffer
115
+ if (this.recentActivations.length > 1000) {
116
+ this.recentActivations = this.recentActivations.slice(-500);
117
+ }
118
+ return results;
119
+ }
120
+ /** Get a summary of what the brain "knows" about the current context */
121
+ getContextSummary(context) {
122
+ const results = this.recall(context, 10);
123
+ if (results.length === 0) {
124
+ return `No relevant memories found for context: ${context.currentFile || 'general'}`;
125
+ }
126
+ const lines = [`Context recall for: ${context.currentFile || context.projectType || 'general'}`];
127
+ lines.push(`Activated ${results.length} memories`);
128
+ const byTier = new Map();
129
+ for (const r of results) {
130
+ const tier = r.entry.tier;
131
+ if (!byTier.has(tier))
132
+ byTier.set(tier, []);
133
+ byTier.get(tier).push(r);
134
+ }
135
+ for (const [tier, tierResults] of byTier) {
136
+ lines.push(`\n[${tier.toUpperCase()}] (${tierResults.length})`);
137
+ for (const r of tierResults.slice(0, 3)) {
138
+ const preview = r.entry.content.slice(0, 100).replace(/\n/g, ' ');
139
+ lines.push(` ${(r.relevanceScore * 100).toFixed(0)}% — ${preview}...`);
140
+ }
141
+ }
142
+ return lines.join('\n');
143
+ }
144
+ // ── Trigger System ────────────────────────────────────────────────────────────
145
+ matchTriggers(entryId, context) {
146
+ const triggers = [];
147
+ const entry = this.hierarchicalMemory.get(entryId);
148
+ if (!entry)
149
+ return triggers;
150
+ // File pattern matching
151
+ if (context.currentFile) {
152
+ const fileLower = context.currentFile.toLowerCase();
153
+ const contentLower = entry.content.toLowerCase();
154
+ // Direct file reference in memory content
155
+ if (contentLower.includes(fileLower)) {
156
+ triggers.push({
157
+ patterns: [`file:${context.currentFile}`],
158
+ strength: 0.6,
159
+ recency: Date.now() - entry.lastAccessed.getTime(),
160
+ });
161
+ }
162
+ // File extension category matching
163
+ const ext = path.extname(context.currentFile).toLowerCase();
164
+ const categoryMap = {
165
+ '.ts': ['typescript', 'code', 'script'],
166
+ '.tsx': ['typescript', 'react', 'component'],
167
+ '.js': ['javascript', 'code', 'script'],
168
+ '.py': ['python', 'code', 'script'],
169
+ '.sql': ['database', 'sql', 'query'],
170
+ '.css': ['style', 'css', 'layout'],
171
+ '.html': ['markup', 'html', 'template'],
172
+ '.json': ['config', 'data', 'json'],
173
+ '.yml': ['config', 'yaml', 'ci'],
174
+ '.yaml': ['config', 'yaml', 'ci'],
175
+ '.md': ['documentation', 'readme', 'docs'],
176
+ };
177
+ const keywords = categoryMap[ext] || [];
178
+ for (const kw of keywords) {
179
+ if (contentLower.includes(kw) || entry.category.toLowerCase().includes(kw)) {
180
+ triggers.push({
181
+ patterns: [`ext-category:${kw}`],
182
+ strength: 0.35,
183
+ recency: Date.now() - entry.lastAccessed.getTime(),
184
+ });
185
+ }
186
+ }
187
+ // Directory-based category matching
188
+ const dir = path.dirname(context.currentFile).toLowerCase();
189
+ const dirCategories = {
190
+ 'auth': 'security',
191
+ 'security': 'security',
192
+ 'api': 'api',
193
+ 'database': 'database',
194
+ 'db': 'database',
195
+ 'test': 'testing',
196
+ 'tests': 'testing',
197
+ '__tests__': 'testing',
198
+ 'config': 'configuration',
199
+ 'utils': 'utility',
200
+ 'helpers': 'utility',
201
+ 'components': 'component',
202
+ 'services': 'service',
203
+ 'models': 'model',
204
+ 'routes': 'routing',
205
+ 'controllers': 'controller',
206
+ 'middleware': 'middleware',
207
+ };
208
+ for (const [dirName, category] of Object.entries(dirCategories)) {
209
+ if (dir.includes(dirName)) {
210
+ if (contentLower.includes(category) || entry.category.toLowerCase().includes(category)) {
211
+ triggers.push({
212
+ patterns: [`dir-category:${dirName}→${category}`],
213
+ strength: 0.4,
214
+ recency: Date.now() - entry.lastAccessed.getTime(),
215
+ });
216
+ }
217
+ }
218
+ }
219
+ }
220
+ // Keyword matching
221
+ if (context.keywords && context.keywords.length > 0) {
222
+ const contentLower = entry.content.toLowerCase();
223
+ const categoryLower = entry.category.toLowerCase();
224
+ let keywordHits = 0;
225
+ for (const keyword of context.keywords) {
226
+ const kwLower = keyword.toLowerCase();
227
+ if (contentLower.includes(kwLower) || categoryLower.includes(kwLower)) {
228
+ keywordHits++;
229
+ }
230
+ }
231
+ if (keywordHits > 0) {
232
+ const keywordStrength = Math.min(0.8, keywordHits * 0.2);
233
+ triggers.push({
234
+ patterns: [`keywords:${keywordHits}/${context.keywords.length} matched`],
235
+ strength: keywordStrength,
236
+ recency: Date.now() - entry.lastAccessed.getTime(),
237
+ });
238
+ }
239
+ }
240
+ // Category direct match
241
+ if (context.currentCategory) {
242
+ if (entry.category.toLowerCase() === context.currentCategory.toLowerCase()) {
243
+ triggers.push({
244
+ patterns: [`category:${context.currentCategory}`],
245
+ strength: 0.5,
246
+ recency: Date.now() - entry.lastAccessed.getTime(),
247
+ });
248
+ }
249
+ }
250
+ // Project type matching
251
+ if (context.projectType) {
252
+ if (entry.metadata.projectType === context.projectType) {
253
+ triggers.push({
254
+ patterns: [`project-type:${context.projectType}`],
255
+ strength: 0.3,
256
+ recency: Date.now() - entry.lastAccessed.getTime(),
257
+ });
258
+ }
259
+ }
260
+ // Learned trigger patterns
261
+ for (const [triggerId, trigger] of this.triggers) {
262
+ if (this.triggerMatchesContext(trigger, context)) {
263
+ const contentLower = entry.content.toLowerCase();
264
+ if (contentLower.includes(trigger.pattern.toLowerCase())) {
265
+ triggers.push({
266
+ patterns: [`learned:${trigger.pattern}`],
267
+ strength: trigger.strength * Math.min(1, trigger.matchCount * 0.1),
268
+ recency: Date.now() - trigger.lastMatched.getTime(),
269
+ });
270
+ trigger.lastMatched = new Date();
271
+ trigger.matchCount++;
272
+ }
273
+ }
274
+ }
275
+ return triggers;
276
+ }
277
+ triggerMatchesContext(trigger, context) {
278
+ const pat = trigger.pattern.toLowerCase();
279
+ if (context.currentFile?.toLowerCase().includes(pat))
280
+ return true;
281
+ if (context.currentCategory?.toLowerCase().includes(pat))
282
+ return true;
283
+ if (context.projectType?.toLowerCase().includes(pat))
284
+ return true;
285
+ if (context.keywords?.some(k => k.toLowerCase().includes(pat)))
286
+ return true;
287
+ return false;
288
+ }
289
+ learnTriggers(context, results) {
290
+ if (results.length === 0)
291
+ return;
292
+ // Extract potential trigger patterns from high-scoring results
293
+ for (const result of results.slice(0, 5)) {
294
+ if (result.relevanceScore < 0.5)
295
+ continue;
296
+ const entry = result.entry;
297
+ // Learn from file paths mentioned in activated entries
298
+ const filePaths = this.extractFilePaths(entry.content);
299
+ for (const fp of filePaths) {
300
+ const key = crypto.createHash('md5').update(`trigger:${fp}`).digest('hex').slice(0, 8);
301
+ if (!this.triggers.has(key)) {
302
+ this.triggers.set(key, {
303
+ id: key,
304
+ pattern: fp,
305
+ category: entry.category,
306
+ strength: 0.3,
307
+ lastMatched: new Date(),
308
+ matchCount: 1,
309
+ });
310
+ }
311
+ }
312
+ // Learn from keywords in context that matched
313
+ if (context.keywords) {
314
+ for (const keyword of context.keywords) {
315
+ if (entry.content.toLowerCase().includes(keyword.toLowerCase())) {
316
+ const key = crypto.createHash('md5').update(`trigger:kw:${keyword}`).digest('hex').slice(0, 8);
317
+ const existing = this.triggers.get(key);
318
+ if (existing) {
319
+ existing.strength = Math.min(1, existing.strength + 0.05);
320
+ }
321
+ else {
322
+ this.triggers.set(key, {
323
+ id: key,
324
+ pattern: keyword,
325
+ category: entry.category,
326
+ strength: 0.2,
327
+ lastMatched: new Date(),
328
+ matchCount: 1,
329
+ });
330
+ }
331
+ }
332
+ }
333
+ }
334
+ }
335
+ }
336
+ extractFilePaths(text) {
337
+ const patterns = [
338
+ /(?:src\/|lib\/|app\/|test\/|tests\/)[\w/.-]+\.\w+/g,
339
+ /(?:\/?[\w-]+\/[\w-]+\.\w{2,4})/g,
340
+ ];
341
+ const paths = [];
342
+ for (const pattern of patterns) {
343
+ const matches = text.match(pattern);
344
+ if (matches)
345
+ paths.push(...matches.slice(0, 5));
346
+ }
347
+ return [...new Set(paths)];
348
+ }
349
+ // ── Co-occurrence Network ────────────────────────────────────────────────────
350
+ updateCoOccurrence(activatedIds) {
351
+ for (let i = 0; i < activatedIds.length; i++) {
352
+ for (let j = i + 1; j < activatedIds.length; j++) {
353
+ const a = activatedIds[i];
354
+ const b = activatedIds[j];
355
+ this.strengthenLink(a, b);
356
+ this.strengthenLink(b, a);
357
+ }
358
+ }
359
+ }
360
+ strengthenLink(sourceId, targetId) {
361
+ const links = this.activationLinks.get(sourceId) || [];
362
+ const existing = links.find(l => l.targetId === targetId);
363
+ if (existing) {
364
+ existing.coOccurrence++;
365
+ existing.strength = Math.min(1, existing.strength + 0.02);
366
+ existing.lastActivated = new Date();
367
+ }
368
+ else {
369
+ links.push({
370
+ sourceId,
371
+ targetId,
372
+ strength: 0.1,
373
+ coOccurrence: 1,
374
+ lastActivated: new Date(),
375
+ });
376
+ this.activationLinks.set(sourceId, links);
377
+ }
378
+ // Cap links per entry to prevent unbounded growth
379
+ if (links.length > 50) {
380
+ links.sort((a, b) => b.strength - a.strength);
381
+ this.activationLinks.set(sourceId, links.slice(0, 30));
382
+ }
383
+ }
384
+ buildActivationPath(entryId, context) {
385
+ const path = [];
386
+ if (context.currentFile)
387
+ path.push(`file:${context.currentFile}`);
388
+ if (context.currentCategory)
389
+ path.push(`category:${context.currentCategory}`);
390
+ if (context.projectType)
391
+ path.push(`project:${context.projectType}`);
392
+ if (context.keywords?.length)
393
+ path.push(`keywords:${context.keywords.join(',')}`);
394
+ path.push(`→memory:${entryId.slice(0, 8)}`);
395
+ return path;
396
+ }
397
+ // ── Helpers ───────────────────────────────────────────────────────────────────
398
+ getAllEntries() {
399
+ const tiers = ['raw', 'summary', 'pattern', 'principle'];
400
+ const entries = [];
401
+ for (const tier of tiers) {
402
+ const tierEntries = this.hierarchicalMemory.getByTier(tier);
403
+ for (const e of tierEntries) {
404
+ entries.push({
405
+ id: e.id,
406
+ tier: e.tier,
407
+ content: e.content,
408
+ category: e.category,
409
+ importance: e.importance,
410
+ lastAccessed: e.lastAccessed,
411
+ metadata: e.metadata,
412
+ });
413
+ }
414
+ }
415
+ return entries;
416
+ }
417
+ // ── Statistics ────────────────────────────────────────────────────────────────
418
+ getStats() {
419
+ const topTriggers = Array.from(this.triggers.values())
420
+ .sort((a, b) => b.strength - a.strength)
421
+ .slice(0, 10)
422
+ .map(t => ({ pattern: t.pattern, strength: t.strength, matches: t.matchCount }));
423
+ let linkCount = 0;
424
+ for (const links of this.activationLinks.values()) {
425
+ linkCount += links.length;
426
+ }
427
+ return {
428
+ triggerCount: this.triggers.size,
429
+ linkCount,
430
+ recentActivationCount: this.recentActivations.length,
431
+ topTriggers,
432
+ };
433
+ }
434
+ // ── Persistence ──────────────────────────────────────────────────────────────
435
+ async persist() {
436
+ try {
437
+ if (!fs.existsSync(this.storeDir)) {
438
+ fs.mkdirSync(this.storeDir, { recursive: true });
439
+ }
440
+ const data = {
441
+ triggers: Array.from(this.triggers.entries()).map(([id, t]) => ({
442
+ id,
443
+ pattern: t.pattern,
444
+ category: t.category,
445
+ strength: t.strength,
446
+ lastMatched: t.lastMatched.toISOString(),
447
+ matchCount: t.matchCount,
448
+ })),
449
+ links: Array.from(this.activationLinks.entries()).map(([sourceId, links]) => ({
450
+ sourceId,
451
+ targets: links.map(l => ({
452
+ targetId: l.targetId,
453
+ strength: l.strength,
454
+ coOccurrence: l.coOccurrence,
455
+ lastActivated: l.lastActivated.toISOString(),
456
+ })),
457
+ })),
458
+ version: '5.0.0',
459
+ };
460
+ fs.writeFileSync(path.join(this.storeDir, 'recall-state.json'), JSON.stringify(data));
461
+ }
462
+ catch {
463
+ // Non-blocking
464
+ }
465
+ }
466
+ loadFromDisk() {
467
+ try {
468
+ const file = path.join(this.storeDir, 'recall-state.json');
469
+ if (!fs.existsSync(file))
470
+ return;
471
+ const data = JSON.parse(fs.readFileSync(file, 'utf-8'));
472
+ if (data.triggers) {
473
+ for (const t of data.triggers) {
474
+ this.triggers.set(t.id, {
475
+ id: t.id,
476
+ pattern: t.pattern,
477
+ category: t.category,
478
+ strength: t.strength,
479
+ lastMatched: new Date(t.lastMatched),
480
+ matchCount: t.matchCount,
481
+ });
482
+ }
483
+ }
484
+ if (data.links) {
485
+ for (const linkGroup of data.links) {
486
+ const links = linkGroup.targets.map((t) => ({
487
+ sourceId: linkGroup.sourceId,
488
+ targetId: t.targetId,
489
+ strength: t.strength,
490
+ coOccurrence: t.coOccurrence,
491
+ lastActivated: new Date(t.lastActivated),
492
+ }));
493
+ this.activationLinks.set(linkGroup.sourceId, links);
494
+ }
495
+ }
496
+ }
497
+ catch {
498
+ // Fresh start
499
+ }
500
+ }
501
+ }
502
+ //# sourceMappingURL=context-recall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-recall.js","sourceRoot":"","sources":["../../src/brain/context-recall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { HierarchicalMemoryEntry, MemoryTier, HierarchicalMemoryStats } from '../types.js';
2
+ /**
3
+ * Hierarchical Memory — never forget, always compress.
4
+ *
5
+ * Tier 1 (raw): Full insight text, full context, full metadata. Retained for 7 days or until tier limit.
6
+ * Tier 2 (summary): LLM-generated or algorithmic summary. Key facts, file references, category.
7
+ * Tier 3 (pattern): Abstracted patterns extracted from multiple summaries. Reusable rules.
8
+ * Tier 4 (principle): Fundamental truths / heuristics that survived many projects and sessions.
9
+ *
10
+ * Drill-down: Given a principle, trace back through patterns → summaries → raw entries.
11
+ *
12
+ * Compression: When a tier exceeds its limit, the oldest/least-accessed entries are
13
+ * batch-compressed into the next tier up. Originals are archived (not deleted).
14
+ */
15
+ export declare class HierarchicalMemory {
16
+ private entries;
17
+ private tierIndex;
18
+ private storeDir;
19
+ constructor(customDir?: string);
20
+ /** Store a new memory at the raw tier */
21
+ store(content: string, category: string, confidence: number, metadata?: Record<string, unknown>): Promise<string>;
22
+ /** Retrieve a specific entry by ID */
23
+ get(id: string): HierarchicalMemoryEntry | undefined;
24
+ /** Drill down from a higher-tier entry to its source entries */
25
+ drillDown(id: string, maxDepth?: number): HierarchicalMemoryEntry[][];
26
+ /** Drill up from a raw entry to see what principles it contributed to */
27
+ drillUp(id: string, maxDepth?: number): HierarchicalMemoryEntry[][];
28
+ /** Get all entries at a specific tier */
29
+ getByTier(tier: MemoryTier): HierarchicalMemoryEntry[];
30
+ /** Search across all tiers by content or category */
31
+ search(query: string, topK?: number): HierarchicalMemoryEntry[];
32
+ /** Manually promote an entry to a higher tier */
33
+ promote(id: string): Promise<boolean>;
34
+ private checkCompression;
35
+ /** Compress multiple entries into a single higher-tier entry */
36
+ private compressContent;
37
+ private calculateImportance;
38
+ private recencyFactor;
39
+ /** Simple text-to-vector using character frequency and word hashing */
40
+ private textToVector;
41
+ private cosineSimilarity;
42
+ private extractCommonTerms;
43
+ private extractKeyPhrases;
44
+ stats(): HierarchicalMemoryStats;
45
+ private calculatePromotionRate;
46
+ private persist;
47
+ private loadFromDisk;
48
+ }
49
+ //# sourceMappingURL=hierarchical-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hierarchical-memory.d.ts","sourceRoot":"","sources":["../../src/brain/hierarchical-memory.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAgB3F;;;;;;;;;;;;GAYG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAmD;IAClE,OAAO,CAAC,SAAS,CAKd;IACH,OAAO,CAAC,QAAQ,CAAS;gBAEb,SAAS,CAAC,EAAE,MAAM;IAO9B,yCAAyC;IACnC,KAAK,CACT,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,OAAO,CAAC,MAAM,CAAC;IAiClB,sCAAsC;IACtC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS;IASpD,gEAAgE;IAChE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,GAAG,uBAAuB,EAAE,EAAE;IAgCzE,yEAAyE;IACzE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,GAAG,uBAAuB,EAAE,EAAE;IA+BvE,yCAAyC;IACzC,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,uBAAuB,EAAE;IAQtD,qDAAqD;IACrD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,uBAAuB,EAAE;IAoCnE,iDAAiD;IAC3C,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAmB7B,gBAAgB;IAiF9B,gEAAgE;IAChE,OAAO,CAAC,eAAe;IAqCvB,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,aAAa;IAMrB,uEAAuE;IACvE,OAAO,CAAC,YAAY;IAiCpB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,iBAAiB;IAOzB,KAAK,IAAI,uBAAuB;IA2BhC,OAAO,CAAC,sBAAsB;YAUhB,OAAO;IAsBrB,OAAO,CAAC,YAAY;CAoBrB"}