@reminix/runtime 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +201 -30
- package/dist/agent.d.ts +126 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +201 -0
- package/dist/agent.js.map +1 -0
- package/dist/index.d.ts +28 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -5
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +39 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +239 -0
- package/dist/server.js.map +1 -0
- package/dist/streaming.d.ts +27 -0
- package/dist/streaming.d.ts.map +1 -0
- package/dist/streaming.js +58 -0
- package/dist/streaming.js.map +1 -0
- package/dist/types.d.ts +185 -79
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +82 -2
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +6 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/package.json +11 -8
- package/dist/executor.d.ts +0 -17
- package/dist/executor.d.ts.map +0 -1
- package/dist/executor.js +0 -22
- package/dist/executor.js.map +0 -1
- package/dist/loader.d.ts +0 -19
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -52
- package/dist/loader.js.map +0 -1
- package/dist/registry.d.ts +0 -24
- package/dist/registry.d.ts.map +0 -1
- package/dist/registry.js +0 -208
- package/dist/registry.js.map +0 -1
package/dist/registry.js
DELETED
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Registry for auto-discovering agents, tools, and prompts from directories
|
|
3
|
-
*/
|
|
4
|
-
import { readdir, stat } from 'fs/promises';
|
|
5
|
-
import { join, extname, basename } from 'path';
|
|
6
|
-
import { pathToFileURL } from 'url';
|
|
7
|
-
import { loadHandler } from './loader';
|
|
8
|
-
/**
|
|
9
|
-
* Auto-discover and load handlers from a directory structure
|
|
10
|
-
*
|
|
11
|
-
* Expected structure:
|
|
12
|
-
* handler/
|
|
13
|
-
* agents/
|
|
14
|
-
* chatbot.ts
|
|
15
|
-
* assistant.ts
|
|
16
|
-
* tools/
|
|
17
|
-
* search.ts
|
|
18
|
-
* prompts/
|
|
19
|
-
* system.ts
|
|
20
|
-
*/
|
|
21
|
-
export async function discoverRegistry(handlerPath) {
|
|
22
|
-
const registry = {
|
|
23
|
-
agents: {},
|
|
24
|
-
tools: {},
|
|
25
|
-
prompts: {},
|
|
26
|
-
};
|
|
27
|
-
try {
|
|
28
|
-
// Check if path exists and is a directory
|
|
29
|
-
const stats = await stat(handlerPath);
|
|
30
|
-
if (!stats.isDirectory()) {
|
|
31
|
-
throw new Error(`Handler path must be a directory: ${handlerPath}`);
|
|
32
|
-
}
|
|
33
|
-
// Discover agents
|
|
34
|
-
const agentsPath = join(handlerPath, 'agents');
|
|
35
|
-
try {
|
|
36
|
-
const agentsStats = await stat(agentsPath);
|
|
37
|
-
if (agentsStats.isDirectory()) {
|
|
38
|
-
const agents = await loadDirectory(agentsPath);
|
|
39
|
-
// Filter to only AgentHandler types
|
|
40
|
-
for (const [key, value] of Object.entries(agents)) {
|
|
41
|
-
if (typeof value === 'function') {
|
|
42
|
-
registry.agents[key] = value;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
// agents/ directory doesn't exist, skip
|
|
49
|
-
}
|
|
50
|
-
// Discover tools
|
|
51
|
-
const toolsPath = join(handlerPath, 'tools');
|
|
52
|
-
try {
|
|
53
|
-
const toolsStats = await stat(toolsPath);
|
|
54
|
-
if (toolsStats.isDirectory()) {
|
|
55
|
-
const tools = await loadDirectory(toolsPath);
|
|
56
|
-
// Filter to only ToolHandler types
|
|
57
|
-
for (const [key, value] of Object.entries(tools)) {
|
|
58
|
-
if (typeof value === 'function') {
|
|
59
|
-
registry.tools[key] = value;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
// tools/ directory doesn't exist, skip
|
|
66
|
-
}
|
|
67
|
-
// Discover prompts
|
|
68
|
-
const promptsPath = join(handlerPath, 'prompts');
|
|
69
|
-
try {
|
|
70
|
-
const promptsStats = await stat(promptsPath);
|
|
71
|
-
if (promptsStats.isDirectory()) {
|
|
72
|
-
const prompts = await loadDirectory(promptsPath);
|
|
73
|
-
registry.prompts = prompts;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
catch {
|
|
77
|
-
// prompts/ directory doesn't exist, skip
|
|
78
|
-
}
|
|
79
|
-
// Validate that at least something was discovered
|
|
80
|
-
if (Object.keys(registry.agents).length === 0 &&
|
|
81
|
-
Object.keys(registry.tools).length === 0 &&
|
|
82
|
-
Object.keys(registry.prompts).length === 0) {
|
|
83
|
-
throw new Error(`No agents, tools, or prompts found in directory: ${handlerPath}`);
|
|
84
|
-
}
|
|
85
|
-
return registry;
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
if (error instanceof Error) {
|
|
89
|
-
throw new Error(`Failed to discover registry from "${handlerPath}": ${error.message}`);
|
|
90
|
-
}
|
|
91
|
-
throw error;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Load all handler files from a directory
|
|
96
|
-
* Filename (without extension) becomes the key in the registry
|
|
97
|
-
*/
|
|
98
|
-
async function loadDirectory(dirPath) {
|
|
99
|
-
const handlers = {};
|
|
100
|
-
try {
|
|
101
|
-
const entries = await readdir(dirPath);
|
|
102
|
-
for (const entry of entries) {
|
|
103
|
-
const fullPath = join(dirPath, entry);
|
|
104
|
-
const stats = await stat(fullPath);
|
|
105
|
-
// Skip if not a file
|
|
106
|
-
if (!stats.isFile()) {
|
|
107
|
-
continue;
|
|
108
|
-
}
|
|
109
|
-
// Only process TypeScript/JavaScript files
|
|
110
|
-
const ext = extname(entry);
|
|
111
|
-
if (ext !== '.ts' && ext !== '.js' && ext !== '.mjs') {
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
// Extract the key from filename (without extension)
|
|
115
|
-
const key = entry.replace(ext, '');
|
|
116
|
-
try {
|
|
117
|
-
// Try loading as a handler file (expects agents/tools/prompts exports)
|
|
118
|
-
const loaded = await loadHandler(fullPath);
|
|
119
|
-
// Merge agents, tools, and prompts into the registry
|
|
120
|
-
if (loaded.agents) {
|
|
121
|
-
const agentKeys = Object.keys(loaded.agents);
|
|
122
|
-
if (agentKeys.length === 1) {
|
|
123
|
-
handlers[key] = loaded.agents[agentKeys[0]];
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
for (const agentKey of agentKeys) {
|
|
127
|
-
handlers[`${key}.${agentKey}`] = loaded.agents[agentKey];
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
if (loaded.tools) {
|
|
132
|
-
const toolKeys = Object.keys(loaded.tools);
|
|
133
|
-
if (toolKeys.length === 1) {
|
|
134
|
-
handlers[key] = loaded.tools[toolKeys[0]];
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
for (const toolKey of toolKeys) {
|
|
138
|
-
handlers[`${key}.${toolKey}`] = loaded.tools[toolKey];
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
if (loaded.prompts) {
|
|
143
|
-
const promptKeys = Object.keys(loaded.prompts);
|
|
144
|
-
if (promptKeys.length === 1) {
|
|
145
|
-
handlers[key] = loaded.prompts[promptKeys[0]];
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
for (const promptKey of promptKeys) {
|
|
149
|
-
handlers[`${key}.${promptKey}`] = loaded.prompts[promptKey];
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
catch {
|
|
155
|
-
// If loadHandler fails, try loading as direct export
|
|
156
|
-
// This handles files that export functions directly (e.g., export const chatbot)
|
|
157
|
-
try {
|
|
158
|
-
const fileUrl = pathToFileURL(fullPath).href;
|
|
159
|
-
const module = await import(fileUrl);
|
|
160
|
-
// Determine type based on directory name
|
|
161
|
-
const dirName = basename(dirPath);
|
|
162
|
-
// Check for direct exports matching the directory type
|
|
163
|
-
if (dirName === 'agents') {
|
|
164
|
-
// Look for exported function with same name as file, or any exported function
|
|
165
|
-
const exportedFunction = module[key] || module.default;
|
|
166
|
-
if (typeof exportedFunction === 'function') {
|
|
167
|
-
handlers[key] = exportedFunction;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
else if (dirName === 'tools') {
|
|
171
|
-
const exportedFunction = module[key] || module.default;
|
|
172
|
-
if (typeof exportedFunction === 'function') {
|
|
173
|
-
handlers[key] = exportedFunction;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
else if (dirName === 'prompts') {
|
|
177
|
-
// For prompts, accept any export (function, object, string, etc.)
|
|
178
|
-
// Try to get export with same name as file, or default, or any named export
|
|
179
|
-
const exportedValue = module[key] || module.default;
|
|
180
|
-
if (exportedValue !== undefined) {
|
|
181
|
-
handlers[key] = exportedValue;
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
// Check if module has any exports (excluding default module properties)
|
|
185
|
-
const moduleKeys = Object.keys(module).filter((k) => k !== 'default' && !k.startsWith('__'));
|
|
186
|
-
if (moduleKeys.length > 0) {
|
|
187
|
-
// Use the first export, or the module itself if it's a simple object
|
|
188
|
-
handlers[key] = module[moduleKeys[0]] || module;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
catch {
|
|
194
|
-
// Skip this file if both methods fail
|
|
195
|
-
continue;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
return handlers;
|
|
200
|
-
}
|
|
201
|
-
catch (error) {
|
|
202
|
-
if (error instanceof Error) {
|
|
203
|
-
throw new Error(`Failed to load directory "${dirPath}": ${error.message}`);
|
|
204
|
-
}
|
|
205
|
-
throw error;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
//# sourceMappingURL=registry.js.map
|
package/dist/registry.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AASvC;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB;IACxD,MAAM,QAAQ,GAAa;QACzB,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,EAAE;KACZ,CAAC;IAEF,IAAI,CAAC;QACH,0CAA0C;QAC1C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,qCAAqC,WAAW,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,kBAAkB;QAClB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;YAC3C,IAAI,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;gBAC/C,oCAAoC;gBACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBAClD,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;wBAChC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAqB,CAAC;oBAC/C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;QAED,iBAAiB;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;YACzC,IAAI,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;gBAC7C,mCAAmC;gBACnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjD,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;wBAChC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAoB,CAAC;oBAC7C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;QAED,mBAAmB;QACnB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;gBACjD,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;YAC7B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;QAC3C,CAAC;QAED,kDAAkD;QAClD,IACE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAC1C,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,oDAAoD,WAAW,EAAE,CAAC,CAAC;QACrF,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,qCAAqC,WAAW,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,aAAa,CAC1B,OAAe;IAEf,MAAM,QAAQ,GAAyD,EAAE,CAAC;IAE1E,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QAEvC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEnC,qBAAqB;YACrB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBACpB,SAAS;YACX,CAAC;YAED,2CAA2C;YAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACrD,SAAS;YACX,CAAC;YAED,oDAAoD;YACpD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAEnC,IAAI,CAAC;gBACH,uEAAuE;gBACvE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAE3C,qDAAqD;gBACrD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC7C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC3B,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC9C,CAAC;yBAAM,CAAC;wBACN,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;4BACjC,QAAQ,CAAC,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;wBAC3D,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC3C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC1B,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC5C,CAAC;yBAAM,CAAC;wBACN,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;4BAC/B,QAAQ,CAAC,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBACxD,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAC/C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC5B,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChD,CAAC;yBAAM,CAAC;wBACN,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;4BACnC,QAAQ,CAAC,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;wBAC9D,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,qDAAqD;gBACrD,iFAAiF;gBACjF,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;oBAC7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;oBAErC,yCAAyC;oBACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAElC,uDAAuD;oBACvD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;wBACzB,8EAA8E;wBAC9E,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;wBACvD,IAAI,OAAO,gBAAgB,KAAK,UAAU,EAAE,CAAC;4BAC3C,QAAQ,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC;wBACnC,CAAC;oBACH,CAAC;yBAAM,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;wBAC/B,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;wBACvD,IAAI,OAAO,gBAAgB,KAAK,UAAU,EAAE,CAAC;4BAC3C,QAAQ,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC;wBACnC,CAAC;oBACH,CAAC;yBAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;wBACjC,kEAAkE;wBAClE,4EAA4E;wBAC5E,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;wBACpD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;4BAChC,QAAQ,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC;wBAChC,CAAC;6BAAM,CAAC;4BACN,wEAAwE;4BACxE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAC9C,CAAC;4BACF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCAC1B,qEAAqE;gCACrE,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;4BAClD,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,sCAAsC;oBACtC,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,6BAA6B,OAAO,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|