@hilbras/remembra 3.1.0 → 3.3.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/CHANGELOG.md +79 -0
- package/README.md +15 -0
- package/dist/backend.d.ts +27 -0
- package/dist/backend.js +2 -0
- package/dist/backend.js.map +1 -0
- package/dist/errors.d.ts +28 -0
- package/dist/errors.js +60 -0
- package/dist/errors.js.map +1 -0
- package/dist/http.js +16 -7
- package/dist/http.js.map +1 -1
- package/dist/index.js +117 -62
- package/dist/index.js.map +1 -1
- package/dist/service.d.ts +28 -4
- package/dist/service.js +94 -11
- package/dist/service.js.map +1 -1
- package/dist/store.d.ts +39 -5
- package/dist/store.js +343 -85
- package/dist/store.js.map +1 -1
- package/dist/types.d.ts +183 -5
- package/dist/types.js +78 -14
- package/dist/types.js.map +1 -1
- package/docs/architecture.md +98 -0
- package/docs/clients.md +3 -0
- package/docs/security.md +12 -7
- package/docs/tools.md +11 -0
- package/package.json +1 -1
package/dist/store.js
CHANGED
|
@@ -2,6 +2,8 @@ import { promises as fs } from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import os from "node:os";
|
|
4
4
|
import { randomUUID } from "node:crypto";
|
|
5
|
+
import { SCHEMA_VERSION } from "./types.js";
|
|
6
|
+
import { RemembraError } from "./errors.js";
|
|
5
7
|
/**
|
|
6
8
|
* File-based memory store (source of truth — no database).
|
|
7
9
|
*
|
|
@@ -11,64 +13,58 @@ import { randomUUID } from "node:crypto";
|
|
|
11
13
|
* archived/global/<id>.md — archived memories (out of search, listed with flag)
|
|
12
14
|
* archived/scopes/<scope>/ — archived scoped memories
|
|
13
15
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
+
* Concurrency (audit: advisory file locking):
|
|
17
|
+
* - in-process: all mutating ops of one instance go through a FIFO queue;
|
|
18
|
+
* - cross-process: `<root>/.remembra.lock` via O_EXCL create, stolen only
|
|
19
|
+
* when stale (dead pid or older than lockStaleMs).
|
|
20
|
+
*
|
|
21
|
+
* Crash recovery (audit: journal for crash recovery — recovery-pass flavor):
|
|
22
|
+
* atomic rename() already prevents torn files, so instead of a WAL this
|
|
23
|
+
* store runs a one-time recovery on first access per instance:
|
|
24
|
+
* 1. delete orphaned `*.tmp` files (crash between write and rename);
|
|
25
|
+
* 2. reconcile ids present in BOTH active and archived trees (crash
|
|
26
|
+
* between archive/revive's write and unlink) — newest updatedAt wins,
|
|
27
|
+
* ties go to the archived copy.
|
|
16
28
|
*/
|
|
17
29
|
export class MemoryStore {
|
|
18
30
|
root;
|
|
19
|
-
|
|
31
|
+
lockTimeoutMs;
|
|
32
|
+
lockStaleMs;
|
|
33
|
+
/** In-process FIFO so the file lock is only ever contended cross-process. */
|
|
34
|
+
queue = Promise.resolve();
|
|
35
|
+
recovery = null;
|
|
36
|
+
recovered = false;
|
|
37
|
+
holdsLock = false;
|
|
38
|
+
constructor(root, opts = {}) {
|
|
20
39
|
this.root = root;
|
|
40
|
+
this.lockTimeoutMs = opts.lockTimeoutMs ?? Number(process.env.REMEMBRA_LOCK_TIMEOUT_MS ?? 5000);
|
|
41
|
+
this.lockStaleMs = opts.lockStaleMs ?? Number(process.env.REMEMBRA_LOCK_STALE_MS ?? 10000);
|
|
21
42
|
}
|
|
22
43
|
static defaultRoot() {
|
|
23
44
|
return process.env.REMEMBRA_HOME ?? path.join(os.homedir(), ".remembra");
|
|
24
45
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
: path.join(this.root, "archived", "scopes", safeScope);
|
|
31
|
-
const dir = m.archivedAt ? archivedBase : base;
|
|
32
|
-
const file = path.resolve(path.join(dir, `${m.id}.md`));
|
|
33
|
-
// Defense in depth (P0): never touch anything outside the storage root.
|
|
34
|
-
const root = path.resolve(this.root);
|
|
35
|
-
if (!file.startsWith(root + path.sep)) {
|
|
36
|
-
throw new Error(`Invalid scope "${m.scope}": resolves outside the storage root`);
|
|
37
|
-
}
|
|
38
|
-
return file;
|
|
39
|
-
}
|
|
46
|
+
// -------------------------------------------------------------------------
|
|
47
|
+
// Public API — each entry awaits recovery, then runs under the lock.
|
|
48
|
+
// Internal helpers must NOT call back into locked public methods
|
|
49
|
+
// (the queue/lock are not reentrant); reads (get/all) never lock.
|
|
50
|
+
// -------------------------------------------------------------------------
|
|
40
51
|
async store(input, embedding) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
let id = genId();
|
|
44
|
-
for (let i = 0; i < 10 && (await this.findFile(id)); i++)
|
|
45
|
-
id = genId();
|
|
46
|
-
const memory = {
|
|
47
|
-
id,
|
|
48
|
-
type: input.type,
|
|
49
|
-
content: input.content,
|
|
50
|
-
scope: input.scope,
|
|
51
|
-
tags: input.tags,
|
|
52
|
-
importance: input.importance,
|
|
53
|
-
createdAt: now,
|
|
54
|
-
updatedAt: now,
|
|
55
|
-
source: input.source,
|
|
56
|
-
embedding,
|
|
57
|
-
};
|
|
58
|
-
const file = this.fileFor(memory);
|
|
59
|
-
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
60
|
-
await writeFileAtomic(file, render(memory), fs);
|
|
61
|
-
return memory;
|
|
52
|
+
await this.ensureRecovered();
|
|
53
|
+
return this.withLock(() => this.storeLocked(input, embedding));
|
|
62
54
|
}
|
|
63
55
|
async forget(id) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
56
|
+
await this.ensureRecovered();
|
|
57
|
+
return this.withLock(async () => {
|
|
58
|
+
const file = await this.findFile(id);
|
|
59
|
+
if (!file)
|
|
60
|
+
return false;
|
|
61
|
+
await fs.unlink(file);
|
|
62
|
+
return true;
|
|
63
|
+
});
|
|
69
64
|
}
|
|
70
65
|
/** Load active memories (excludes archived). Pass includeArchived for everything. */
|
|
71
66
|
async all(includeArchived = false) {
|
|
67
|
+
await this.ensureRecovered();
|
|
72
68
|
const dirs = [path.join(this.root, "global"), path.join(this.root, "scopes")];
|
|
73
69
|
if (includeArchived) {
|
|
74
70
|
dirs.push(path.join(this.root, "archived", "global"), path.join(this.root, "archived", "scopes"));
|
|
@@ -78,6 +74,7 @@ export class MemoryStore {
|
|
|
78
74
|
return memories.filter((m) => m !== null);
|
|
79
75
|
}
|
|
80
76
|
async get(id) {
|
|
77
|
+
await this.ensureRecovered();
|
|
81
78
|
const file = await this.findFile(id);
|
|
82
79
|
if (!file)
|
|
83
80
|
return null;
|
|
@@ -85,60 +82,301 @@ export class MemoryStore {
|
|
|
85
82
|
}
|
|
86
83
|
/** Move a memory to the archived tree (sets archivedAt). */
|
|
87
84
|
async archive(id) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
85
|
+
await this.ensureRecovered();
|
|
86
|
+
return this.withLock(async () => {
|
|
87
|
+
const m = await this.get(id);
|
|
88
|
+
if (!m || m.archivedAt)
|
|
89
|
+
return null;
|
|
90
|
+
const oldFile = this.fileFor(m);
|
|
91
|
+
const now = new Date().toISOString();
|
|
92
|
+
const updated = { ...m, archivedAt: now, updatedAt: now };
|
|
93
|
+
const newFile = this.fileFor(updated);
|
|
94
|
+
if (oldFile === newFile)
|
|
95
|
+
return null;
|
|
96
|
+
await fs.mkdir(path.dirname(newFile), { recursive: true });
|
|
97
|
+
await writeFileAtomic(newFile, render(updated), fs);
|
|
98
|
+
await fs.unlink(oldFile);
|
|
99
|
+
return updated;
|
|
100
|
+
});
|
|
100
101
|
}
|
|
101
102
|
/** Bring an archived memory back into active search. */
|
|
102
103
|
async revive(id) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
104
|
+
await this.ensureRecovered();
|
|
105
|
+
return this.withLock(async () => {
|
|
106
|
+
const m = await this.get(id);
|
|
107
|
+
if (!m || !m.archivedAt)
|
|
108
|
+
return null;
|
|
109
|
+
const oldFile = this.fileFor(m);
|
|
110
|
+
const now = new Date().toISOString();
|
|
111
|
+
const updated = { ...m, archivedAt: undefined, lastSeen: now, updatedAt: now };
|
|
112
|
+
const newFile = this.fileFor(updated);
|
|
113
|
+
await fs.mkdir(path.dirname(newFile), { recursive: true });
|
|
114
|
+
await writeFileAtomic(newFile, render(updated), fs);
|
|
115
|
+
await fs.unlink(oldFile);
|
|
116
|
+
return updated;
|
|
117
|
+
});
|
|
114
118
|
}
|
|
115
119
|
/** Persist changes to an existing memory (merge/update path). */
|
|
116
120
|
async update(memory) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
121
|
+
await this.ensureRecovered();
|
|
122
|
+
return this.withLock(async () => {
|
|
123
|
+
const updated = { ...memory, updatedAt: new Date().toISOString() };
|
|
124
|
+
const file = this.fileFor(updated);
|
|
125
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
126
|
+
await writeFileAtomic(file, render(updated), fs);
|
|
127
|
+
return updated;
|
|
128
|
+
});
|
|
122
129
|
}
|
|
123
130
|
/** Record that a memory surfaced in search (decay refresh). Cheap: no-op if seen <1h ago. */
|
|
124
131
|
async touch(id) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
132
|
+
await this.ensureRecovered();
|
|
133
|
+
return this.withLock(async () => {
|
|
134
|
+
// Read + write inside the lock: racing an archive/revive move here is
|
|
135
|
+
// what used to be able to resurrect a file in both trees.
|
|
136
|
+
const m = await this.get(id);
|
|
137
|
+
if (!m)
|
|
138
|
+
return;
|
|
139
|
+
const last = Date.parse(m.lastSeen ?? m.updatedAt);
|
|
140
|
+
if (Number.isFinite(last) && Date.now() - last < 3_600_000)
|
|
141
|
+
return;
|
|
142
|
+
m.lastSeen = new Date().toISOString();
|
|
143
|
+
await writeFileAtomic(this.fileFor(m), render(m), fs);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
/** Import a snapshot memory verbatim (id preserved). Returns false if the id exists. */
|
|
147
|
+
async importMemory(m) {
|
|
148
|
+
await this.ensureRecovered();
|
|
149
|
+
return this.withLock(async () => {
|
|
150
|
+
if (await this.findFile(m.id))
|
|
151
|
+
return false;
|
|
152
|
+
const file = this.fileFor(m); // containment check applies (P0)
|
|
153
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
154
|
+
await writeFileAtomic(file, render(m), fs);
|
|
155
|
+
return true;
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
// -------------------------------------------------------------------------
|
|
159
|
+
// Locked body helpers (no reentrant locking inside these).
|
|
160
|
+
// -------------------------------------------------------------------------
|
|
161
|
+
async storeLocked(input, embedding) {
|
|
162
|
+
const now = new Date().toISOString();
|
|
163
|
+
// 12 hex chars (2^48): collision-safe; existence check guards the rest (P2 audit #9).
|
|
164
|
+
let id = genId();
|
|
165
|
+
for (let i = 0; i < 10 && (await this.findFile(id)); i++)
|
|
166
|
+
id = genId();
|
|
167
|
+
if (await this.findFile(id)) {
|
|
168
|
+
throw new RemembraError("CONFLICT", `could not allocate a unique memory id after retries`);
|
|
169
|
+
}
|
|
170
|
+
const memory = {
|
|
171
|
+
id,
|
|
172
|
+
type: input.type,
|
|
173
|
+
content: input.content,
|
|
174
|
+
scope: input.scope,
|
|
175
|
+
tags: input.tags,
|
|
176
|
+
importance: input.importance,
|
|
177
|
+
createdAt: now,
|
|
178
|
+
updatedAt: now,
|
|
179
|
+
source: input.source,
|
|
180
|
+
embedding,
|
|
181
|
+
};
|
|
182
|
+
const file = this.fileFor(memory);
|
|
183
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
184
|
+
await writeFileAtomic(file, render(memory), fs);
|
|
185
|
+
return memory;
|
|
186
|
+
}
|
|
187
|
+
fileFor(m) {
|
|
188
|
+
const safeScope = m.scope === "global" ? "global" : m.scope.replace(/[^a-zA-Z0-9._/-]/g, "_");
|
|
189
|
+
const base = m.scope === "global" ? path.join(this.root, "global") : path.join(this.root, "scopes", safeScope);
|
|
190
|
+
const archivedBase = m.scope === "global"
|
|
191
|
+
? path.join(this.root, "archived", "global")
|
|
192
|
+
: path.join(this.root, "archived", "scopes", safeScope);
|
|
193
|
+
const dir = m.archivedAt ? archivedBase : base;
|
|
194
|
+
const file = path.resolve(path.join(dir, `${m.id}.md`));
|
|
195
|
+
// Defense in depth (P0): never touch anything outside the storage root.
|
|
196
|
+
const root = path.resolve(this.root);
|
|
197
|
+
if (!file.startsWith(root + path.sep)) {
|
|
198
|
+
throw new RemembraError("SCOPE_ESCAPES_ROOT", `Invalid scope "${m.scope}": resolves outside the storage root`);
|
|
199
|
+
}
|
|
200
|
+
return file;
|
|
133
201
|
}
|
|
134
202
|
async findFile(id) {
|
|
135
203
|
const files = await walk(path.join(this.root, "global"), path.join(this.root, "scopes"), path.join(this.root, "archived"));
|
|
136
204
|
return files.find((f) => path.basename(f, ".md") === id) ?? null;
|
|
137
205
|
}
|
|
206
|
+
// -------------------------------------------------------------------------
|
|
207
|
+
// Advisory file lock + in-process queue.
|
|
208
|
+
// -------------------------------------------------------------------------
|
|
209
|
+
lockFile() {
|
|
210
|
+
return path.join(this.root, ".remembra.lock");
|
|
211
|
+
}
|
|
212
|
+
async withLock(fn) {
|
|
213
|
+
const prev = this.queue;
|
|
214
|
+
let release;
|
|
215
|
+
this.queue = new Promise((r) => (release = r));
|
|
216
|
+
await prev;
|
|
217
|
+
try {
|
|
218
|
+
await this.acquireFileLock();
|
|
219
|
+
try {
|
|
220
|
+
return await fn();
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
throw classifyFsError(err);
|
|
224
|
+
}
|
|
225
|
+
finally {
|
|
226
|
+
await this.releaseFileLock();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
finally {
|
|
230
|
+
release();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
async acquireFileLock() {
|
|
234
|
+
const file = this.lockFile();
|
|
235
|
+
const deadline = Date.now() + this.lockTimeoutMs;
|
|
236
|
+
for (;;) {
|
|
237
|
+
try {
|
|
238
|
+
const fh = await fs.open(file, "wx");
|
|
239
|
+
try {
|
|
240
|
+
await fh.writeFile(JSON.stringify({ pid: process.pid, at: Date.now() }), "utf8");
|
|
241
|
+
}
|
|
242
|
+
finally {
|
|
243
|
+
await fh.close();
|
|
244
|
+
}
|
|
245
|
+
this.holdsLock = true;
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
if (err.code !== "EEXIST") {
|
|
250
|
+
throw new RemembraError("IO_ERROR", `cannot create lock file: ${err instanceof Error ? err.message : err}`, { cause: err });
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (await this.lockIsStale(file)) {
|
|
254
|
+
await fs.unlink(file).catch(() => { });
|
|
255
|
+
continue; // steal: O_EXCL create decides the winner
|
|
256
|
+
}
|
|
257
|
+
if (Date.now() >= deadline) {
|
|
258
|
+
const holder = await lockHolderPid(file);
|
|
259
|
+
throw new RemembraError("LOCK_TIMEOUT", `storage is locked by ${holder !== null ? `pid ${holder}` : "another process"} (waited ${this.lockTimeoutMs}ms)`);
|
|
260
|
+
}
|
|
261
|
+
await sleep(15 + Math.floor(Math.random() * 20));
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
async releaseFileLock() {
|
|
265
|
+
if (!this.holdsLock)
|
|
266
|
+
return;
|
|
267
|
+
this.holdsLock = false;
|
|
268
|
+
try {
|
|
269
|
+
const info = JSON.parse(await fs.readFile(this.lockFile(), "utf8"));
|
|
270
|
+
if (info.pid === process.pid)
|
|
271
|
+
await fs.unlink(this.lockFile()).catch(() => { });
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
// already gone (or unreadable) — nothing to release
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
async lockIsStale(file) {
|
|
278
|
+
try {
|
|
279
|
+
const st = await fs.stat(file);
|
|
280
|
+
if (Date.now() - st.mtimeMs >= this.lockStaleMs)
|
|
281
|
+
return true;
|
|
282
|
+
let pid;
|
|
283
|
+
try {
|
|
284
|
+
pid = JSON.parse(await fs.readFile(file, "utf8")).pid;
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
pid = undefined;
|
|
288
|
+
}
|
|
289
|
+
if (typeof pid !== "number")
|
|
290
|
+
return false; // fresh but unwritten: writer in progress
|
|
291
|
+
if (pid === process.pid)
|
|
292
|
+
return true; // our own leftover (queue prevents live self-holds)
|
|
293
|
+
try {
|
|
294
|
+
process.kill(pid, 0);
|
|
295
|
+
return false; // alive
|
|
296
|
+
}
|
|
297
|
+
catch (err) {
|
|
298
|
+
return err.code !== "EPERM"; // ESRCH dead → stale; EPERM alive → wait
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
return true; // vanished between EEXIST and stat → retry the create
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// -------------------------------------------------------------------------
|
|
306
|
+
// Crash recovery (the "journal" phase — see class doc for why not a WAL).
|
|
307
|
+
// -------------------------------------------------------------------------
|
|
308
|
+
async ensureRecovered() {
|
|
309
|
+
if (this.recovered)
|
|
310
|
+
return;
|
|
311
|
+
if (!this.recovery) {
|
|
312
|
+
this.recovery = this.withLock(() => this.recover()).then(() => {
|
|
313
|
+
this.recovered = true;
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
await this.recovery;
|
|
317
|
+
}
|
|
318
|
+
async recover() {
|
|
319
|
+
const everything = await walkRaw(this.root);
|
|
320
|
+
const tmps = everything.filter((f) => f.endsWith(".tmp"));
|
|
321
|
+
for (const t of tmps)
|
|
322
|
+
await fs.unlink(t).catch(() => { });
|
|
323
|
+
// Ids present in both active and archived trees → interrupted archive/revive.
|
|
324
|
+
const active = await walk(path.join(this.root, "global"), path.join(this.root, "scopes"));
|
|
325
|
+
const archived = await walk(path.join(this.root, "archived"));
|
|
326
|
+
const archivedById = new Map(archived.map((f) => [path.basename(f, ".md"), f]));
|
|
327
|
+
let reconciled = 0;
|
|
328
|
+
for (const activeFile of active) {
|
|
329
|
+
const twin = archivedById.get(path.basename(activeFile, ".md"));
|
|
330
|
+
if (!twin)
|
|
331
|
+
continue;
|
|
332
|
+
const [am, zm] = await Promise.all([parse(activeFile), parse(twin)]);
|
|
333
|
+
if (!am && !zm) {
|
|
334
|
+
await fs.unlink(activeFile).catch(() => { });
|
|
335
|
+
await fs.unlink(twin).catch(() => { });
|
|
336
|
+
reconciled++;
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
// Newest updatedAt wins; ties go to the archived copy (archive writes
|
|
340
|
+
// archivedAt last in the common crash window).
|
|
341
|
+
const keepArchived = !am || (zm !== null && Date.parse(zm.updatedAt) >= Date.parse(am.updatedAt));
|
|
342
|
+
await fs.unlink(keepArchived ? activeFile : twin).catch(() => { });
|
|
343
|
+
reconciled++;
|
|
344
|
+
}
|
|
345
|
+
if (tmps.length > 0 || reconciled > 0) {
|
|
346
|
+
console.error(`Remembra: crash recovery — removed ${tmps.length} orphaned temp file(s), reconciled ${reconciled} interrupted move(s)`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
138
349
|
}
|
|
350
|
+
// ---------------------------------------------------------------------------
|
|
351
|
+
// Helpers
|
|
352
|
+
// ---------------------------------------------------------------------------
|
|
139
353
|
function genId() {
|
|
140
354
|
return randomUUID().replace(/-/g, "").slice(0, 12);
|
|
141
355
|
}
|
|
356
|
+
function sleep(ms) {
|
|
357
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
358
|
+
}
|
|
359
|
+
async function lockHolderPid(file) {
|
|
360
|
+
try {
|
|
361
|
+
const pid = JSON.parse(await fs.readFile(file, "utf8")).pid;
|
|
362
|
+
return typeof pid === "number" ? pid : null;
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
return null;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
/** Wrap raw filesystem failures so callers see a stable IO_ERROR code. */
|
|
369
|
+
function classifyFsError(err) {
|
|
370
|
+
if (err instanceof RemembraError)
|
|
371
|
+
return err;
|
|
372
|
+
const code = err?.code;
|
|
373
|
+
if (typeof code === "string" && /^E[A-Z]+$/.test(code)) {
|
|
374
|
+
return new RemembraError("IO_ERROR", `filesystem error (${code}): ${err.message}`, {
|
|
375
|
+
cause: err,
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
return err;
|
|
379
|
+
}
|
|
142
380
|
/**
|
|
143
381
|
* Atomic write (P1 audit): write to a temp file in the same directory,
|
|
144
382
|
* then rename() over the target — POSIX-atomic, so a crash mid-write can
|
|
@@ -155,7 +393,7 @@ async function writeFileAtomic(file, data, fsmod) {
|
|
|
155
393
|
throw err;
|
|
156
394
|
}
|
|
157
395
|
}
|
|
158
|
-
async function
|
|
396
|
+
async function walkGeneric(dirs, pred) {
|
|
159
397
|
const out = [];
|
|
160
398
|
for (const dir of dirs) {
|
|
161
399
|
let entries;
|
|
@@ -168,17 +406,25 @@ async function walk(...dirs) {
|
|
|
168
406
|
for (const e of entries) {
|
|
169
407
|
const full = path.join(dir, e.name);
|
|
170
408
|
if (e.isDirectory())
|
|
171
|
-
out.push(...(await
|
|
172
|
-
else if (e.name
|
|
409
|
+
out.push(...(await walkGeneric([full], pred)));
|
|
410
|
+
else if (pred(e.name))
|
|
173
411
|
out.push(full);
|
|
174
412
|
}
|
|
175
413
|
}
|
|
176
414
|
return out;
|
|
177
415
|
}
|
|
416
|
+
/** All files (used by crash recovery to find *.tmp orphans). */
|
|
417
|
+
async function walkRaw(...dirs) {
|
|
418
|
+
return walkGeneric(dirs, () => true);
|
|
419
|
+
}
|
|
420
|
+
async function walk(...dirs) {
|
|
421
|
+
return walkGeneric(dirs, (name) => name.endsWith(".md"));
|
|
422
|
+
}
|
|
178
423
|
function render(m) {
|
|
179
424
|
const lines = [
|
|
180
425
|
"---",
|
|
181
426
|
`id: ${m.id}`,
|
|
427
|
+
`version: ${SCHEMA_VERSION}`,
|
|
182
428
|
`type: ${m.type}`,
|
|
183
429
|
`scope: ${m.scope}`,
|
|
184
430
|
`tags: [${m.tags.join(", ")}]`,
|
|
@@ -196,12 +442,23 @@ function render(m) {
|
|
|
196
442
|
];
|
|
197
443
|
return lines.filter((l) => l !== undefined).join("\n");
|
|
198
444
|
}
|
|
445
|
+
/** Files we've already warned about (avoid log spam on every search). */
|
|
446
|
+
const parseWarnings = new Set();
|
|
199
447
|
async function parse(file) {
|
|
448
|
+
const warnOnce = (why) => {
|
|
449
|
+
const key = `${file}:${why}`;
|
|
450
|
+
if (parseWarnings.has(key))
|
|
451
|
+
return;
|
|
452
|
+
parseWarnings.add(key);
|
|
453
|
+
console.error(`Remembra: skipping unparseable memory file ${path.basename(file)} (${why})`);
|
|
454
|
+
};
|
|
200
455
|
try {
|
|
201
456
|
const raw = await fs.readFile(file, "utf8");
|
|
202
457
|
const match = raw.match(/^---\n([\s\S]*?)\n---\n\n?([\s\S]*)$/);
|
|
203
|
-
if (!match)
|
|
458
|
+
if (!match) {
|
|
459
|
+
warnOnce("missing/invalid frontmatter");
|
|
204
460
|
return null;
|
|
461
|
+
}
|
|
205
462
|
const meta = {};
|
|
206
463
|
for (const line of match[1].split("\n")) {
|
|
207
464
|
const idx = line.indexOf(":");
|
|
@@ -231,7 +488,8 @@ async function parse(file) {
|
|
|
231
488
|
embedding,
|
|
232
489
|
};
|
|
233
490
|
}
|
|
234
|
-
catch {
|
|
491
|
+
catch (err) {
|
|
492
|
+
warnOnce(err instanceof Error ? err.message : String(err));
|
|
235
493
|
return null;
|
|
236
494
|
}
|
|
237
495
|
}
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAsB,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAS5C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,WAAW;IAUH;IATF,aAAa,CAAS;IACtB,WAAW,CAAS;IACrC,6EAA6E;IACrE,KAAK,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IACzC,QAAQ,GAAyB,IAAI,CAAC;IACtC,SAAS,GAAG,KAAK,CAAC;IAClB,SAAS,GAAG,KAAK,CAAC;IAE1B,YACmB,IAAY,EAC7B,OAAyB,EAAE;QADV,SAAI,GAAJ,IAAI,CAAQ;QAG7B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,IAAI,CAAC,CAAC;QAChG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,KAAK,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;IAC3E,CAAC;IAED,4EAA4E;IAC5E,qEAAqE;IACrE,iEAAiE;IACjE,kEAAkE;IAClE,4EAA4E;IAE5E,KAAK,CAAC,KAAK,CAAC,KAAiB,EAAE,SAAoB;QACjD,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YACxB,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,qFAAqF;IACrF,KAAK,CAAC,GAAG,CAAC,eAAe,GAAG,KAAK;QAC/B,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC9E,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;QACpG,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC9B,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU;gBAAE,OAAO,IAAI,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,OAAO,GAAW,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;YAClE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,OAAO,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAC;YACrC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,MAAM,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACpD,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,wDAAwD;IACxD,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC9B,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU;gBAAE,OAAO,IAAI,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,OAAO,GAAW,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;YACvF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,MAAM,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACpD,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC9B,MAAM,OAAO,GAAW,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACjD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,6FAA6F;IAC7F,KAAK,CAAC,KAAK,CAAC,EAAU;QACpB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC9B,sEAAsE;YACtE,0DAA0D;YAC1D,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,CAAC,CAAC;gBAAE,OAAO;YACf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;YACnD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,SAAS;gBAAE,OAAO;YACnE,CAAC,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,wFAAwF;IACxF,KAAK,CAAC,YAAY,CAAC,CAAS;QAC1B,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC9B,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,iCAAiC;YAC/D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,2DAA2D;IAC3D,4EAA4E;IAEpE,KAAK,CAAC,WAAW,CAAC,KAAiB,EAAE,SAAoB;QAC/D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,sFAAsF;QACtF,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE;YAAE,EAAE,GAAG,KAAK,EAAE,CAAC;QACvE,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,aAAa,CAAC,UAAU,EAAE,qDAAqD,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,MAAM,GAAW;YACrB,EAAE;YACF,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS;SACV,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAChD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,OAAO,CAAC,CAAS;QACvB,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;QAC9F,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC/G,MAAM,YAAY,GAChB,CAAC,CAAC,KAAK,KAAK,QAAQ;YAClB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC;YAC5C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QACxD,wEAAwE;QACxE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,aAAa,CACrB,oBAAoB,EACpB,kBAAkB,CAAC,CAAC,KAAK,sCAAsC,CAChE,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,EAAU;QAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CACtB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,EAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,EAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CACjC,CAAC;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;IACnE,CAAC;IAED,4EAA4E;IAC5E,yCAAyC;IACzC,4EAA4E;IAEpE,QAAQ;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAChD,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAI,EAAoB;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,IAAI,CAAC;QACX,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,OAAO,MAAM,EAAE,EAAE,CAAC;YACpB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;QACjD,SAAS,CAAC;YACR,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACrC,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBACnF,CAAC;wBAAS,CAAC;oBACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;gBACnB,CAAC;gBACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,OAAO;YACT,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACrD,MAAM,IAAI,aAAa,CACrB,UAAU,EACV,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,EACtE,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,IAAI,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACtC,SAAS,CAAC,0CAA0C;YACtD,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;gBACzC,MAAM,IAAI,aAAa,CACrB,cAAc,EACd,wBAAwB,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC,CAAC,iBAAiB,YAAY,IAAI,CAAC,aAAa,KAAK,CACjH,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAC5B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;YACpE,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG;gBAAE,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACjF,CAAC;QAAC,MAAM,CAAC;YACP,oDAAoD;QACtD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,IAAY;QACpC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW;gBAAE,OAAO,IAAI,CAAC;YAC7D,IAAI,GAAY,CAAC;YACjB,IAAI,CAAC;gBACH,GAAG,GAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAuB,CAAC,GAAG,CAAC;YAC/E,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,GAAG,SAAS,CAAC;YAClB,CAAC;YACD,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC,CAAC,0CAA0C;YACrF,IAAI,GAAG,KAAK,OAAO,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC,CAAC,oDAAoD;YAC1F,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACrB,OAAO,KAAK,CAAC,CAAC,QAAQ;YACxB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAQ,GAA6B,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,yCAAyC;YACnG,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,CAAC,sDAAsD;QACrE,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,0EAA0E;IAC1E,4EAA4E;IAEpE,KAAK,CAAC,eAAe;QAC3B,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC5D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACxB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEzD,8EAA8E;QAC9E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1F,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,UAAU,IAAI,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;YAChE,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAC5C,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACtC,UAAU,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;YACD,sEAAsE;YACtE,+CAA+C;YAC/C,MAAM,YAAY,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;YAClG,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAClE,UAAU,EAAE,CAAC;QACf,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CACX,sCAAsC,IAAI,CAAC,MAAM,sCAAsC,UAAU,sBAAsB,CACxH,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,KAAK;IACZ,OAAO,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAY;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAuB,CAAC,GAAG,CAAC;QACnF,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,SAAS,eAAe,CAAC,GAAY;IACnC,IAAI,GAAG,YAAY,aAAa;QAAE,OAAO,GAAG,CAAC;IAC7C,MAAM,IAAI,GAAI,GAAoC,EAAE,IAAI,CAAC;IACzD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,OAAO,IAAI,aAAa,CAAC,UAAU,EAAE,qBAAqB,IAAI,MAAO,GAAa,CAAC,OAAO,EAAE,EAAE;YAC5F,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,IAAY,EAAE,KAAgB;IACzE,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACxC,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAc,EAAE,IAA+B;IACxE,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,CAAC,WAAW,EAAE;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;iBAC/D,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gEAAgE;AAChE,KAAK,UAAU,OAAO,CAAC,GAAG,IAAc;IACtC,OAAO,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,GAAG,IAAc;IACnC,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,MAAM,KAAK,GAAG;QACZ,KAAK;QACL,OAAO,CAAC,CAAC,EAAE,EAAE;QACb,YAAY,cAAc,EAAE;QAC5B,SAAS,CAAC,CAAC,IAAI,EAAE;QACjB,UAAU,CAAC,CAAC,KAAK,EAAE;QACnB,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QAC9B,eAAe,CAAC,CAAC,UAAU,EAAE;QAC7B,YAAY,CAAC,CAAC,SAAS,EAAE;QACzB,YAAY,CAAC,CAAC,SAAS,EAAE;QACzB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;QAClD,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS;QACxD,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;QAC5C,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;QAC3F,KAAK;QACL,EAAE;QACF,CAAC,CAAC,OAAO;QACT,EAAE;KACH,CAAC;IACF,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,yEAAyE;AACzE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;AAExC,KAAK,UAAU,KAAK,CAAC,IAAY;IAC/B,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE;QAC/B,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;QAC7B,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO;QACnC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,8CAA8C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;IAC9F,CAAC,CAAC;IACF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAChE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,QAAQ,CAAC,6BAA6B,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAA2B,EAAE,CAAC;QACxC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,SAAS;YACzB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC5D,IAAI,SAA+B,CAAC;QACpC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3E,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAAE,SAAS,GAAG,IAAI,CAAC;QACjF,CAAC;QACD,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;YACzC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAmB;YAC7C,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YACxB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,QAAQ;YAC7B,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;YAC5D,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;YACxC,SAAS,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;YACpD,SAAS,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;YACpE,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS;SACV,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|