@hope666/melu 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.
- package/LICENSE +15 -0
- package/README.md +57 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +630 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +45 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +135 -0
- package/dist/config.js.map +1 -0
- package/dist/embedder-client.d.ts +24 -0
- package/dist/embedder-client.d.ts.map +1 -0
- package/dist/embedder-client.js +164 -0
- package/dist/embedder-client.js.map +1 -0
- package/dist/embedder-daemon-client.d.ts +10 -0
- package/dist/embedder-daemon-client.d.ts.map +1 -0
- package/dist/embedder-daemon-client.js +185 -0
- package/dist/embedder-daemon-client.js.map +1 -0
- package/dist/embedder-daemon.d.ts +11 -0
- package/dist/embedder-daemon.d.ts.map +1 -0
- package/dist/embedder-daemon.js +284 -0
- package/dist/embedder-daemon.js.map +1 -0
- package/dist/embedder-ipc.d.ts +27 -0
- package/dist/embedder-ipc.d.ts.map +1 -0
- package/dist/embedder-ipc.js +60 -0
- package/dist/embedder-ipc.js.map +1 -0
- package/dist/embedder-main.d.ts +2 -0
- package/dist/embedder-main.d.ts.map +1 -0
- package/dist/embedder-main.js +6 -0
- package/dist/embedder-main.js.map +1 -0
- package/dist/embedder.d.ts +41 -0
- package/dist/embedder.d.ts.map +1 -0
- package/dist/embedder.js +231 -0
- package/dist/embedder.js.map +1 -0
- package/dist/extraction-queue.d.ts +53 -0
- package/dist/extraction-queue.d.ts.map +1 -0
- package/dist/extraction-queue.js +418 -0
- package/dist/extraction-queue.js.map +1 -0
- package/dist/extraction-stats.d.ts +15 -0
- package/dist/extraction-stats.d.ts.map +1 -0
- package/dist/extraction-stats.js +89 -0
- package/dist/extraction-stats.js.map +1 -0
- package/dist/extractor-worker-main.d.ts +2 -0
- package/dist/extractor-worker-main.d.ts.map +1 -0
- package/dist/extractor-worker-main.js +70 -0
- package/dist/extractor-worker-main.js.map +1 -0
- package/dist/extractor-worker.d.ts +17 -0
- package/dist/extractor-worker.d.ts.map +1 -0
- package/dist/extractor-worker.js +164 -0
- package/dist/extractor-worker.js.map +1 -0
- package/dist/extractor.d.ts +36 -0
- package/dist/extractor.d.ts.map +1 -0
- package/dist/extractor.js +244 -0
- package/dist/extractor.js.map +1 -0
- package/dist/i18n.d.ts +995 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +1024 -0
- package/dist/i18n.js.map +1 -0
- package/dist/memory.d.ts +62 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +293 -0
- package/dist/memory.js.map +1 -0
- package/dist/model-bootstrap.d.ts +29 -0
- package/dist/model-bootstrap.d.ts.map +1 -0
- package/dist/model-bootstrap.js +235 -0
- package/dist/model-bootstrap.js.map +1 -0
- package/dist/proxy-main.d.ts +5 -0
- package/dist/proxy-main.d.ts.map +1 -0
- package/dist/proxy-main.js +10 -0
- package/dist/proxy-main.js.map +1 -0
- package/dist/proxy.d.ts +9 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +309 -0
- package/dist/proxy.js.map +1 -0
- package/dist/run-runtime.d.ts +34 -0
- package/dist/run-runtime.d.ts.map +1 -0
- package/dist/run-runtime.js +170 -0
- package/dist/run-runtime.js.map +1 -0
- package/dist/runtime-context.d.ts +12 -0
- package/dist/runtime-context.d.ts.map +1 -0
- package/dist/runtime-context.js +39 -0
- package/dist/runtime-context.js.map +1 -0
- package/dist/text-chunking.d.ts +7 -0
- package/dist/text-chunking.d.ts.map +1 -0
- package/dist/text-chunking.js +50 -0
- package/dist/text-chunking.js.map +1 -0
- package/package.json +46 -0
package/dist/embedder.js
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Melu Embedding 封装。
|
|
3
|
+
*
|
|
4
|
+
* 使用 node-llama-cpp 加载 GGUF embedding 模型,
|
|
5
|
+
* 运行时使用预编译 llama.cpp binary,不要求用户自行安装系统编译依赖。
|
|
6
|
+
*/
|
|
7
|
+
import { getLlama, LlamaLogLevel, } from "node-llama-cpp";
|
|
8
|
+
import { createConnection } from "node:net";
|
|
9
|
+
import { loadConfig } from "./config.js";
|
|
10
|
+
import { ensureEmbeddingModelReady } from "./model-bootstrap.js";
|
|
11
|
+
import { splitTextIntoOverlappingWindows } from "./text-chunking.js";
|
|
12
|
+
// 英文 instruction 前缀,跨语言效果最优
|
|
13
|
+
const DEFAULT_INSTRUCTION = "Instruct: Retrieve semantically similar memories for the user\nQuery: ";
|
|
14
|
+
const EMBEDDER_SOCKET_ENV = "MELU_EMBEDDER_SOCKET";
|
|
15
|
+
const RUN_ID_ENV = "MELU_RUN_ID";
|
|
16
|
+
const REMOTE_EMBEDDER_TIMEOUT_MS = 10000;
|
|
17
|
+
let _embedder = null;
|
|
18
|
+
let _loading = null;
|
|
19
|
+
/**
|
|
20
|
+
* 获取或初始化 embedding backend(单例,懒加载)。
|
|
21
|
+
*/
|
|
22
|
+
export async function getEmbedder(modelId) {
|
|
23
|
+
if (_embedder)
|
|
24
|
+
return _embedder;
|
|
25
|
+
if (_loading)
|
|
26
|
+
return _loading;
|
|
27
|
+
_loading = (async () => {
|
|
28
|
+
const config = loadConfig();
|
|
29
|
+
const { modelPath } = await ensureEmbeddingModelReady({
|
|
30
|
+
config,
|
|
31
|
+
interactive: false,
|
|
32
|
+
showProgress: false,
|
|
33
|
+
});
|
|
34
|
+
console.log(`[Melu] 加载 GGUF embedding 模型: ${modelId}`);
|
|
35
|
+
console.log(`[Melu] 模型文件: ${modelPath}`);
|
|
36
|
+
const llama = await getLlama({
|
|
37
|
+
build: "never",
|
|
38
|
+
gpu: "auto",
|
|
39
|
+
logLevel: LlamaLogLevel.warn,
|
|
40
|
+
progressLogs: false,
|
|
41
|
+
});
|
|
42
|
+
const model = await llama.loadModel({
|
|
43
|
+
gpuLayers: "auto",
|
|
44
|
+
modelPath,
|
|
45
|
+
useMmap: true,
|
|
46
|
+
});
|
|
47
|
+
// 切块 2000 字符,纯中文最坏 ≈ 1400 tokens,3072 留足余量
|
|
48
|
+
const embeddingContext = await model.createEmbeddingContext({
|
|
49
|
+
contextSize: 3072,
|
|
50
|
+
});
|
|
51
|
+
_embedder = {
|
|
52
|
+
llama,
|
|
53
|
+
model,
|
|
54
|
+
embeddingContext,
|
|
55
|
+
};
|
|
56
|
+
console.log("[Melu] Embedding 模型就绪");
|
|
57
|
+
return _embedder;
|
|
58
|
+
})();
|
|
59
|
+
return _loading;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 对单条文本生成 embedding 向量。
|
|
63
|
+
*/
|
|
64
|
+
export async function embed(text, modelId, options = {}) {
|
|
65
|
+
const purpose = options.purpose ?? "query";
|
|
66
|
+
if (shouldUseRemoteEmbedder()) {
|
|
67
|
+
const vectors = await requestRemoteEmbeddings([text], purpose);
|
|
68
|
+
return vectors[0];
|
|
69
|
+
}
|
|
70
|
+
const { embeddingContext } = await getEmbedder(modelId);
|
|
71
|
+
const inputText = DEFAULT_INSTRUCTION + text;
|
|
72
|
+
const output = await embeddingContext.getEmbeddingFor(inputText);
|
|
73
|
+
return normalizeVector(new Float32Array(output.vector));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 对长文本分块后做 embedding,并对所有 chunk 向量取平均。
|
|
77
|
+
*/
|
|
78
|
+
export async function embedLongText(text, modelId, options = {}) {
|
|
79
|
+
const chunks = splitTextIntoOverlappingWindows(text);
|
|
80
|
+
if (chunks.length === 0) {
|
|
81
|
+
throw new Error("Cannot embed empty text");
|
|
82
|
+
}
|
|
83
|
+
if (chunks.length === 1) {
|
|
84
|
+
return embed(chunks[0], modelId, options);
|
|
85
|
+
}
|
|
86
|
+
const vectors = await embedBatch(chunks, modelId, options);
|
|
87
|
+
return averageVectors(vectors);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 批量 embedding。
|
|
91
|
+
*/
|
|
92
|
+
export async function embedBatch(texts, modelId, options = {}) {
|
|
93
|
+
const purpose = options.purpose ?? "query";
|
|
94
|
+
if (shouldUseRemoteEmbedder()) {
|
|
95
|
+
return requestRemoteEmbeddings(texts, purpose);
|
|
96
|
+
}
|
|
97
|
+
const results = [];
|
|
98
|
+
for (const text of texts) {
|
|
99
|
+
results.push(await embed(text, modelId, options));
|
|
100
|
+
}
|
|
101
|
+
return results;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 释放模型,回收内存。
|
|
105
|
+
*/
|
|
106
|
+
export async function disposeEmbedder() {
|
|
107
|
+
if (_embedder) {
|
|
108
|
+
await _embedder.embeddingContext.dispose();
|
|
109
|
+
await _embedder.model.dispose();
|
|
110
|
+
await _embedder.llama.dispose();
|
|
111
|
+
_embedder = null;
|
|
112
|
+
}
|
|
113
|
+
_loading = null;
|
|
114
|
+
}
|
|
115
|
+
function normalizeVector(vector) {
|
|
116
|
+
let norm = 0;
|
|
117
|
+
for (let i = 0; i < vector.length; i++) {
|
|
118
|
+
norm += vector[i] * vector[i];
|
|
119
|
+
}
|
|
120
|
+
if (norm <= 1e-12) {
|
|
121
|
+
return vector;
|
|
122
|
+
}
|
|
123
|
+
const scale = 1 / Math.sqrt(norm);
|
|
124
|
+
for (let i = 0; i < vector.length; i++) {
|
|
125
|
+
vector[i] *= scale;
|
|
126
|
+
}
|
|
127
|
+
return vector;
|
|
128
|
+
}
|
|
129
|
+
function averageVectors(vectors) {
|
|
130
|
+
if (vectors.length === 0) {
|
|
131
|
+
throw new Error("Cannot average empty vectors");
|
|
132
|
+
}
|
|
133
|
+
const result = new Float32Array(vectors[0].length);
|
|
134
|
+
for (const vector of vectors) {
|
|
135
|
+
if (vector.length !== result.length) {
|
|
136
|
+
throw new Error("Vectors have different lengths");
|
|
137
|
+
}
|
|
138
|
+
for (let i = 0; i < vector.length; i++) {
|
|
139
|
+
result[i] += vector[i];
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const scale = 1 / vectors.length;
|
|
143
|
+
for (let i = 0; i < result.length; i++) {
|
|
144
|
+
result[i] *= scale;
|
|
145
|
+
}
|
|
146
|
+
return normalizeVector(result);
|
|
147
|
+
}
|
|
148
|
+
function shouldUseRemoteEmbedder() {
|
|
149
|
+
return Boolean(process.env[EMBEDDER_SOCKET_ENV]?.trim());
|
|
150
|
+
}
|
|
151
|
+
async function requestRemoteEmbeddings(texts, purpose) {
|
|
152
|
+
const socketPath = process.env[EMBEDDER_SOCKET_ENV]?.trim();
|
|
153
|
+
if (!socketPath) {
|
|
154
|
+
throw new Error("Remote embedder socket is not configured");
|
|
155
|
+
}
|
|
156
|
+
if (texts.length === 0) {
|
|
157
|
+
return [];
|
|
158
|
+
}
|
|
159
|
+
const response = await sendRemoteEmbeddingRequest({
|
|
160
|
+
id: `embed-${Date.now()}-${Math.random().toString(16).slice(2, 8)}`,
|
|
161
|
+
run_id: process.env[RUN_ID_ENV]?.trim() || "legacy",
|
|
162
|
+
type: purpose,
|
|
163
|
+
texts,
|
|
164
|
+
}, socketPath);
|
|
165
|
+
const embeddings = response.embeddings;
|
|
166
|
+
if (!Array.isArray(embeddings)) {
|
|
167
|
+
throw new Error("Remote embedder returned no embeddings");
|
|
168
|
+
}
|
|
169
|
+
if (embeddings.length !== texts.length) {
|
|
170
|
+
throw new Error("Remote embedder returned mismatched embedding count");
|
|
171
|
+
}
|
|
172
|
+
return embeddings.map((vector) => normalizeVector(new Float32Array(vector)));
|
|
173
|
+
}
|
|
174
|
+
function sendRemoteEmbeddingRequest(request, socketPath) {
|
|
175
|
+
return new Promise((resolve, reject) => {
|
|
176
|
+
const socket = createConnection(socketPath);
|
|
177
|
+
let buffer = "";
|
|
178
|
+
let settled = false;
|
|
179
|
+
const finish = (error, response) => {
|
|
180
|
+
if (settled)
|
|
181
|
+
return;
|
|
182
|
+
settled = true;
|
|
183
|
+
clearTimeout(timer);
|
|
184
|
+
socket.destroy();
|
|
185
|
+
if (error) {
|
|
186
|
+
reject(error);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
resolve(response);
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
const timer = setTimeout(() => {
|
|
193
|
+
finish(new Error(`Remote embedder timed out after ${REMOTE_EMBEDDER_TIMEOUT_MS}ms`));
|
|
194
|
+
}, REMOTE_EMBEDDER_TIMEOUT_MS);
|
|
195
|
+
socket.setEncoding("utf-8");
|
|
196
|
+
socket.on("connect", () => {
|
|
197
|
+
socket.write(`${JSON.stringify(request)}\n`);
|
|
198
|
+
});
|
|
199
|
+
socket.on("data", (chunk) => {
|
|
200
|
+
buffer += chunk;
|
|
201
|
+
const newlineIndex = buffer.indexOf("\n");
|
|
202
|
+
if (newlineIndex === -1)
|
|
203
|
+
return;
|
|
204
|
+
const line = buffer.slice(0, newlineIndex).trim();
|
|
205
|
+
if (!line) {
|
|
206
|
+
finish(new Error("Remote embedder returned an empty response"));
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
const parsed = JSON.parse(line);
|
|
211
|
+
if (parsed.error) {
|
|
212
|
+
finish(new Error(parsed.error));
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
finish(undefined, parsed);
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
finish(error instanceof Error ? error : new Error(String(error)));
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
socket.on("error", (error) => {
|
|
222
|
+
finish(error);
|
|
223
|
+
});
|
|
224
|
+
socket.on("close", () => {
|
|
225
|
+
if (!settled) {
|
|
226
|
+
finish(new Error("Remote embedder closed before responding"));
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=embedder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder.js","sourceRoot":"","sources":["../src/embedder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export interface ExtractionQueuePaths {
|
|
2
|
+
runId: string;
|
|
3
|
+
runDir: string;
|
|
4
|
+
pendingDir: string;
|
|
5
|
+
workingDir: string;
|
|
6
|
+
failedDir: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ExtractionQueueJob {
|
|
9
|
+
id: string;
|
|
10
|
+
runId: string;
|
|
11
|
+
text: string;
|
|
12
|
+
ts: number;
|
|
13
|
+
attempts: number;
|
|
14
|
+
memoryPath: string | null;
|
|
15
|
+
lastError: string | null;
|
|
16
|
+
nextAttemptAt: number | null;
|
|
17
|
+
updatedAt: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ClaimedPendingExtractionJob extends ExtractionQueueJob {
|
|
20
|
+
claimedPath: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ExtractionQueueSnapshot {
|
|
23
|
+
runId: string;
|
|
24
|
+
pending: number;
|
|
25
|
+
working: number;
|
|
26
|
+
retryableFailed: number;
|
|
27
|
+
terminalFailed: number;
|
|
28
|
+
remaining: number;
|
|
29
|
+
nextRetryAt: number | null;
|
|
30
|
+
}
|
|
31
|
+
export interface RequeueClaimedPendingExtractionJobPolicy {
|
|
32
|
+
maxAttempts?: number;
|
|
33
|
+
baseDelayMs?: number;
|
|
34
|
+
maxDelayMs?: number;
|
|
35
|
+
}
|
|
36
|
+
export interface RequeueClaimedPendingExtractionJobResult {
|
|
37
|
+
job: ExtractionQueueJob;
|
|
38
|
+
terminal: boolean;
|
|
39
|
+
path: string;
|
|
40
|
+
}
|
|
41
|
+
export declare function resolveExtractionRunId(value?: string | null): string;
|
|
42
|
+
export declare function getExtractionQueuePaths(runId: string): ExtractionQueuePaths;
|
|
43
|
+
export declare function preparePendingExtractionQueue(runId?: string | null): void;
|
|
44
|
+
export declare function preparePendingExtractionQueueForRun(runId: string): void;
|
|
45
|
+
export declare function enqueuePendingExtractionJob(text: string, memoryPath?: string | null, runId?: string | null): string | null;
|
|
46
|
+
export declare function enqueuePendingExtractionJobForRun(runId: string, text: string, memoryPath?: string | null): string | null;
|
|
47
|
+
export declare function claimNextPendingExtractionJob(runId?: string | null): ClaimedPendingExtractionJob | null;
|
|
48
|
+
export declare function claimNextPendingExtractionJobForRun(runId: string): ClaimedPendingExtractionJob | null;
|
|
49
|
+
export declare function completeClaimedPendingExtractionJob(job: ClaimedPendingExtractionJob): void;
|
|
50
|
+
export declare function requeueClaimedPendingExtractionJob(job: ClaimedPendingExtractionJob, updates?: Partial<ExtractionQueueJob>, policy?: RequeueClaimedPendingExtractionJobPolicy | null): RequeueClaimedPendingExtractionJobResult;
|
|
51
|
+
export declare function getExtractionQueueSnapshot(runId?: string | null): ExtractionQueueSnapshot;
|
|
52
|
+
export declare function getExtractionQueueSnapshotForRun(runId: string): ExtractionQueueSnapshot;
|
|
53
|
+
//# sourceMappingURL=extraction-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extraction-queue.d.ts","sourceRoot":"","sources":["../src/extraction-queue.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA4B,SAAQ,kBAAkB;IACrE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,wCAAwC;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,wCAAwC;IACvD,GAAG,EAAE,kBAAkB,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AASD,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMpE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,CAU3E;AAgPD,wBAAgB,6BAA6B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAEzE;AAED,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAMvE;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACpB,MAAM,GAAG,IAAI,CAEf;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GACzB,MAAM,GAAG,IAAI,CAUf;AAED,wBAAgB,6BAA6B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,2BAA2B,GAAG,IAAI,CAEvG;AAED,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,MAAM,GAAG,2BAA2B,GAAG,IAAI,CA+BrG;AAED,wBAAgB,mCAAmC,CACjD,GAAG,EAAE,2BAA2B,GAC/B,IAAI,CAMN;AAaD,wBAAgB,kCAAkC,CAChD,GAAG,EAAE,2BAA2B,EAChC,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACrC,MAAM,CAAC,EAAE,wCAAwC,GAAG,IAAI,GACvD,wCAAwC,CA0C1C;AAED,wBAAgB,0BAA0B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,uBAAuB,CAEzF;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,MAAM,GAAG,uBAAuB,CA4CvF"}
|