@backendkit-labs/curator-codex-agent 0.2.0 → 1.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.
Files changed (101) hide show
  1. package/dist/analyzer.d.ts +1 -17
  2. package/dist/analyzer.d.ts.map +1 -1
  3. package/dist/analyzer.js +80 -163
  4. package/dist/analyzer.js.map +1 -1
  5. package/dist/audit.d.ts +27 -0
  6. package/dist/audit.d.ts.map +1 -0
  7. package/dist/audit.js +43 -0
  8. package/dist/audit.js.map +1 -0
  9. package/dist/checksum.d.ts +0 -22
  10. package/dist/checksum.d.ts.map +1 -1
  11. package/dist/checksum.js +14 -103
  12. package/dist/checksum.js.map +1 -1
  13. package/dist/documentation-curator.d.ts +1 -1
  14. package/dist/documentation-curator.d.ts.map +1 -1
  15. package/dist/documentation-curator.js +79 -95
  16. package/dist/documentation-curator.js.map +1 -1
  17. package/dist/index.d.ts +19 -9
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +12 -22
  20. package/dist/index.js.map +1 -1
  21. package/dist/knowledge/embedder-worker.d.ts +2 -0
  22. package/dist/knowledge/embedder-worker.d.ts.map +1 -0
  23. package/dist/knowledge/embedder-worker.js +55 -0
  24. package/dist/knowledge/embedder-worker.js.map +1 -0
  25. package/dist/knowledge/engine.d.ts +10 -56
  26. package/dist/knowledge/engine.d.ts.map +1 -1
  27. package/dist/knowledge/engine.js +42 -153
  28. package/dist/knowledge/engine.js.map +1 -1
  29. package/dist/knowledge/rag-provider.d.ts +14 -56
  30. package/dist/knowledge/rag-provider.d.ts.map +1 -1
  31. package/dist/knowledge/rag-provider.js +63 -154
  32. package/dist/knowledge/rag-provider.js.map +1 -1
  33. package/dist/knowledge/synthesis.d.ts +0 -10
  34. package/dist/knowledge/synthesis.d.ts.map +1 -1
  35. package/dist/knowledge/synthesis.js +32 -77
  36. package/dist/knowledge/synthesis.js.map +1 -1
  37. package/dist/knowledge/transformers-embedder.d.ts +61 -0
  38. package/dist/knowledge/transformers-embedder.d.ts.map +1 -0
  39. package/dist/knowledge/transformers-embedder.js +222 -0
  40. package/dist/knowledge/transformers-embedder.js.map +1 -0
  41. package/dist/pdf-reader.d.ts +11 -0
  42. package/dist/pdf-reader.d.ts.map +1 -0
  43. package/dist/pdf-reader.js +21 -0
  44. package/dist/pdf-reader.js.map +1 -0
  45. package/dist/project.d.ts +28 -0
  46. package/dist/project.d.ts.map +1 -0
  47. package/dist/project.js +88 -0
  48. package/dist/project.js.map +1 -0
  49. package/dist/providers/anthropic-adapter.d.ts +2 -2
  50. package/dist/providers/anthropic-adapter.d.ts.map +1 -1
  51. package/dist/providers/anthropic-adapter.js +7 -13
  52. package/dist/providers/anthropic-adapter.js.map +1 -1
  53. package/dist/providers/index.d.ts +1 -1
  54. package/dist/providers/index.d.ts.map +1 -1
  55. package/dist/providers/index.js +13 -20
  56. package/dist/providers/index.js.map +1 -1
  57. package/dist/providers/openai-adapter.d.ts +2 -2
  58. package/dist/providers/openai-adapter.d.ts.map +1 -1
  59. package/dist/providers/openai-adapter.js +7 -13
  60. package/dist/providers/openai-adapter.js.map +1 -1
  61. package/dist/providers/types.d.ts +8 -1
  62. package/dist/providers/types.d.ts.map +1 -1
  63. package/dist/providers/types.js +1 -2
  64. package/dist/types.d.ts.map +1 -1
  65. package/dist/types.js +1 -3
  66. package/dist/types.js.map +1 -1
  67. package/dist/vault-dedup.d.ts +35 -0
  68. package/dist/vault-dedup.d.ts.map +1 -0
  69. package/dist/vault-dedup.js +130 -0
  70. package/dist/vault-dedup.js.map +1 -0
  71. package/package.json +43 -56
  72. package/AGENT.md +0 -187
  73. package/README.md +0 -475
  74. package/dist/api/config.d.ts +0 -57
  75. package/dist/api/config.d.ts.map +0 -1
  76. package/dist/api/config.js +0 -183
  77. package/dist/api/config.js.map +0 -1
  78. package/dist/api/http-server.d.ts +0 -24
  79. package/dist/api/http-server.d.ts.map +0 -1
  80. package/dist/api/http-server.js +0 -108
  81. package/dist/api/http-server.js.map +0 -1
  82. package/dist/api/routes.d.ts +0 -8
  83. package/dist/api/routes.d.ts.map +0 -1
  84. package/dist/api/routes.js +0 -382
  85. package/dist/api/routes.js.map +0 -1
  86. package/dist/api/security.d.ts +0 -107
  87. package/dist/api/security.d.ts.map +0 -1
  88. package/dist/api/security.js +0 -200
  89. package/dist/api/security.js.map +0 -1
  90. package/dist/http-server-main.d.ts +0 -28
  91. package/dist/http-server-main.d.ts.map +0 -1
  92. package/dist/http-server-main.js +0 -69
  93. package/dist/http-server-main.js.map +0 -1
  94. package/dist/server.d.ts +0 -33
  95. package/dist/server.d.ts.map +0 -1
  96. package/dist/server.js +0 -640
  97. package/dist/server.js.map +0 -1
  98. package/dist/watcher.d.ts +0 -26
  99. package/dist/watcher.d.ts.map +0 -1
  100. package/dist/watcher.js +0 -168
  101. package/dist/watcher.js.map +0 -1
package/dist/watcher.d.ts DELETED
@@ -1,26 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * curator-codex-watcher — autonomous code analysis service
4
- *
5
- * Analyzes source code files recursively, extracts knowledge, and curates into vault.
6
- *
7
- * Required env vars:
8
- * CURATOR_API_KEY — DeepSeek / OpenAI-compatible API key
9
- * CURATOR_OUTPUT_PATH — absolute path to the shared vault (where notes are written)
10
- *
11
- * Optional:
12
- * CURATOR_INPUT_PATH — path to code to analyze (if set: process once; if not: watch vault/incoming/)
13
- * CURATOR_MODEL — LLM model (default: deepseek-reasoner)
14
- * CURATOR_BASE_URL — LLM base URL
15
- * CURATOR_POLL_MS — polling interval in ms (default: 30 000)
16
- *
17
- * Modes:
18
- * Mode 1 (Watcher): no CURATOR_INPUT_PATH → watch vault/incoming/ for new files
19
- * Mode 2 (Direct): CURATOR_INPUT_PATH set → process code once with progress bar
20
- *
21
- * Run:
22
- * # Mode 2: Direct code analysis
23
- * CURATOR_INPUT_PATH=/project CURATOR_OUTPUT_PATH=/vault CURATOR_API_KEY=sk-... node dist/watcher.js
24
- */
25
- export {};
26
- //# sourceMappingURL=watcher.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;GAsBG"}
package/dist/watcher.js DELETED
@@ -1,168 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- /**
4
- * curator-codex-watcher — autonomous code analysis service
5
- *
6
- * Analyzes source code files recursively, extracts knowledge, and curates into vault.
7
- *
8
- * Required env vars:
9
- * CURATOR_API_KEY — DeepSeek / OpenAI-compatible API key
10
- * CURATOR_OUTPUT_PATH — absolute path to the shared vault (where notes are written)
11
- *
12
- * Optional:
13
- * CURATOR_INPUT_PATH — path to code to analyze (if set: process once; if not: watch vault/incoming/)
14
- * CURATOR_MODEL — LLM model (default: deepseek-reasoner)
15
- * CURATOR_BASE_URL — LLM base URL
16
- * CURATOR_POLL_MS — polling interval in ms (default: 30 000)
17
- *
18
- * Modes:
19
- * Mode 1 (Watcher): no CURATOR_INPUT_PATH → watch vault/incoming/ for new files
20
- * Mode 2 (Direct): CURATOR_INPUT_PATH set → process code once with progress bar
21
- *
22
- * Run:
23
- * # Mode 2: Direct code analysis
24
- * CURATOR_INPUT_PATH=/project CURATOR_OUTPUT_PATH=/vault CURATOR_API_KEY=sk-... node dist/watcher.js
25
- */
26
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
27
- if (k2 === undefined) k2 = k;
28
- var desc = Object.getOwnPropertyDescriptor(m, k);
29
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
30
- desc = { enumerable: true, get: function() { return m[k]; } };
31
- }
32
- Object.defineProperty(o, k2, desc);
33
- }) : (function(o, m, k, k2) {
34
- if (k2 === undefined) k2 = k;
35
- o[k2] = m[k];
36
- }));
37
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
38
- Object.defineProperty(o, "default", { enumerable: true, value: v });
39
- }) : function(o, v) {
40
- o["default"] = v;
41
- });
42
- var __importStar = (this && this.__importStar) || (function () {
43
- var ownKeys = function(o) {
44
- ownKeys = Object.getOwnPropertyNames || function (o) {
45
- var ar = [];
46
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
47
- return ar;
48
- };
49
- return ownKeys(o);
50
- };
51
- return function (mod) {
52
- if (mod && mod.__esModule) return mod;
53
- var result = {};
54
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
55
- __setModuleDefault(result, mod);
56
- return result;
57
- };
58
- })();
59
- Object.defineProperty(exports, "__esModule", { value: true });
60
- const fsSync = __importStar(require("node:fs"));
61
- const analyzer_js_1 = require("./analyzer.js");
62
- const index_js_1 = require("./providers/index.js");
63
- const checksum_js_1 = require("./checksum.js");
64
- const VAULT_PATH = process.env.CURATOR_OUTPUT_PATH ?? '';
65
- const INPUT_PATH = process.env.CURATOR_INPUT_PATH ?? null;
66
- const POLL_MS = parseInt(process.env.CURATOR_POLL_MS ?? '30000');
67
- function validate() {
68
- if (!process.env.CURATOR_API_KEY) {
69
- console.error('✗ CURATOR_API_KEY is required');
70
- process.exit(1);
71
- }
72
- if (!VAULT_PATH) {
73
- console.error('✗ CURATOR_OUTPUT_PATH is required');
74
- process.exit(1);
75
- }
76
- if (INPUT_PATH) {
77
- try {
78
- fsSync.accessSync(INPUT_PATH, fsSync.constants.R_OK);
79
- }
80
- catch {
81
- console.error(`✗ CURATOR_INPUT_PATH not readable: ${INPUT_PATH}`);
82
- process.exit(1);
83
- }
84
- }
85
- }
86
- function makeAnalyzer() {
87
- return new analyzer_js_1.CodeAnalyzer({ provider: (0, index_js_1.createProvider)(), vaultPath: VAULT_PATH });
88
- }
89
- function log(msg) {
90
- console.log(`[codex-watcher] ${new Date().toISOString().slice(11, 19)} ${msg}`);
91
- }
92
- function buildProgressBar(current, total, width = 40) {
93
- const percent = Math.round((current / total) * 100);
94
- const filled = Math.round((width * current) / total);
95
- const bar = '█'.repeat(filled) + '░'.repeat(width - filled);
96
- return `[${bar}] ${percent}%`;
97
- }
98
- async function processInputDirectory() {
99
- if (!INPUT_PATH)
100
- return;
101
- let files;
102
- try {
103
- files = await (0, checksum_js_1.findAllFiles)(INPUT_PATH);
104
- files.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
105
- }
106
- catch (err) {
107
- log(`✗ Failed to read INPUT_PATH: ${err.message}`);
108
- return;
109
- }
110
- if (files.length === 0) {
111
- log(`ℹ No code files found in ${INPUT_PATH}`);
112
- return;
113
- }
114
- let manifest = await (0, checksum_js_1.loadManifest)(INPUT_PATH);
115
- if (!manifest) {
116
- manifest = (0, checksum_js_1.createManifest)(INPUT_PATH, VAULT_PATH);
117
- log(`\n💡 No manifest found. Will analyze ALL ${files.length} files to build initial index.\n`);
118
- }
119
- console.log(`\n🔍 Analyzing ${files.length} code files...\n`);
120
- let succeeded = 0;
121
- let failed = 0;
122
- let skipped = 0;
123
- for (let i = 0; i < files.length; i++) {
124
- const { fullPath: filePath, relativePath } = files[i];
125
- const counter = `[${i + 1}/${files.length}]`;
126
- const progressBar = buildProgressBar(i + 1, files.length);
127
- try {
128
- const changed = await (0, checksum_js_1.hasFileChanged)(filePath, relativePath, manifest);
129
- if (!changed) {
130
- console.log(` ${counter} ${progressBar} ${relativePath}... ⊘ (unchanged)`);
131
- await (0, checksum_js_1.updateManifestEntry)(manifest, filePath, relativePath, 'skipped');
132
- skipped++;
133
- }
134
- else {
135
- process.stdout.write(` ${counter} ${progressBar} ${relativePath}... `);
136
- const analyzer = makeAnalyzer();
137
- await analyzer.analyzeFile(filePath, relativePath, files);
138
- succeeded++;
139
- await (0, checksum_js_1.updateManifestEntry)(manifest, filePath, relativePath, 'success');
140
- console.log('✓');
141
- }
142
- }
143
- catch (err) {
144
- console.log(`✗ ${err.message}`);
145
- failed++;
146
- await (0, checksum_js_1.updateManifestEntry)(manifest, filePath, relativePath, 'failed');
147
- }
148
- console.log('');
149
- }
150
- await (0, checksum_js_1.saveManifest)(INPUT_PATH, manifest);
151
- console.log((0, checksum_js_1.generateReport)(manifest));
152
- }
153
- async function main() {
154
- validate();
155
- log(`Vault: ${VAULT_PATH}`);
156
- log(`Mode: ${INPUT_PATH ? 'Process INPUT_PATH once' : 'Watch vault/incoming/'}`);
157
- if (INPUT_PATH)
158
- log(`Input: ${INPUT_PATH}`);
159
- log(`Provider: ${process.env.CURATOR_PROVIDER ?? 'deepseek'}`);
160
- log(`Model: ${process.env.CURATOR_MODEL ?? 'deepseek-reasoner'}`);
161
- await processInputDirectory();
162
- process.exit(0);
163
- }
164
- main().catch(err => {
165
- console.error(`[codex-watcher] Fatal: ${err.message}`);
166
- process.exit(1);
167
- });
168
- //# sourceMappingURL=watcher.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGH,gDAAoC;AAEpC,+CAA6C;AAC7C,mDAAsD;AACtD,+CAQuB;AAEvB,MAAM,UAAU,GAAM,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC;AAC5D,MAAM,UAAU,GAAM,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC;AAC7D,MAAM,OAAO,GAAS,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,CAAC;AAEvE,SAAS,QAAQ;IACb,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IACvG,IAAI,CAAC,UAAU,EAAmB,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAC3G,IAAI,UAAU,EAAE,CAAC;QACb,IAAI,CAAC;YACD,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,CAAC,KAAK,CAAC,uCAAuC,UAAU,EAAE,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxF,CAAC;IACL,CAAC;AACL,CAAC;AAED,SAAS,YAAY;IACjB,OAAO,IAAI,0BAAY,CAAC,EAAE,QAAQ,EAAE,IAAA,yBAAc,GAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,GAAG,CAAC,GAAW;IACpB,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAE,KAAa,EAAE,QAAgB,EAAE;IACxE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;IAC5D,OAAO,IAAI,GAAG,KAAK,OAAO,GAAG,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,qBAAqB;IAChC,IAAI,CAAC,UAAU;QAAE,OAAO;IAExB,IAAI,KAAwD,CAAC;IAC7D,IAAI,CAAC;QACD,KAAK,GAAG,MAAM,IAAA,0BAAY,EAAC,UAAU,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,GAAG,CAAC,gCAAiC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,OAAO;IACX,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,GAAG,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;QAC/C,OAAO;IACX,CAAC;IAED,IAAI,QAAQ,GAAG,MAAM,IAAA,0BAAY,EAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,QAAQ,GAAG,IAAA,4BAAc,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAClD,GAAG,CAAC,4CAA4C,KAAK,CAAC,MAAM,kCAAkC,CAAC,CAAC;IACpG,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,MAAM,kBAAkB,CAAC,CAAC;IAE9D,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAC7C,MAAM,WAAW,GAAG,gBAAgB,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAE1D,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAA,4BAAc,EAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YAEvE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,IAAI,WAAW,IAAI,YAAY,mBAAmB,CAAC,CAAC;gBAC5E,MAAM,IAAA,iCAAmB,EAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;gBACvE,OAAO,EAAE,CAAC;YACd,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,IAAI,WAAW,IAAI,YAAY,MAAM,CAAC,CAAC;gBAExE,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;gBAChC,MAAM,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;gBAC1D,SAAS,EAAE,CAAC;gBACZ,MAAM,IAAA,iCAAmB,EAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;gBACvE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3C,MAAM,EAAE,CAAC;YACT,MAAM,IAAA,iCAAmB,EAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,IAAA,0BAAY,EAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,IAAA,4BAAc,EAAC,QAAQ,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,IAAI;IACf,QAAQ,EAAE,CAAC;IACX,GAAG,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC;IAC/B,GAAG,CAAC,aAAa,UAAU,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,uBAAuB,EAAE,CAAC,CAAC;IACrF,IAAI,UAAU;QAAE,GAAG,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC;IAC/C,GAAG,CAAC,aAAa,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,UAAU,EAAE,CAAC,CAAC;IAC/D,GAAG,CAAC,aAAa,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,mBAAmB,EAAE,CAAC,CAAC;IAErE,MAAM,qBAAqB,EAAE,CAAC;IAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACf,OAAO,CAAC,KAAK,CAAC,0BAA2B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}