@grackle-ai/core 0.82.2 → 0.83.1
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/dist/codespace-handlers.d.ts +6 -0
- package/dist/codespace-handlers.d.ts.map +1 -0
- package/dist/codespace-handlers.js +66 -0
- package/dist/codespace-handlers.js.map +1 -0
- package/dist/cron-phase.d.ts +1 -1
- package/dist/cron-phase.d.ts.map +1 -1
- package/dist/cron-phase.js +1 -1
- package/dist/cron-phase.js.map +1 -1
- package/dist/environment-handlers.d.ts +16 -0
- package/dist/environment-handlers.d.ts.map +1 -0
- package/dist/environment-handlers.js +237 -0
- package/dist/environment-handlers.js.map +1 -0
- package/dist/event-bus.d.ts +1 -1
- package/dist/event-bus.d.ts.map +1 -1
- package/dist/event-bus.js.map +1 -1
- package/dist/event-hub.d.ts +29 -0
- package/dist/event-hub.d.ts.map +1 -0
- package/dist/event-hub.js +89 -0
- package/dist/event-hub.js.map +1 -0
- package/dist/finding-handlers.d.ts +6 -0
- package/dist/finding-handlers.d.ts.map +1 -0
- package/dist/finding-handlers.js +27 -0
- package/dist/finding-handlers.js.map +1 -0
- package/dist/grpc-mcp-config.d.ts +11 -0
- package/dist/grpc-mcp-config.d.ts.map +1 -0
- package/dist/grpc-mcp-config.js +29 -0
- package/dist/grpc-mcp-config.js.map +1 -0
- package/dist/grpc-proto-converters.d.ts +25 -0
- package/dist/grpc-proto-converters.d.ts.map +1 -0
- package/dist/grpc-proto-converters.js +193 -0
- package/dist/grpc-proto-converters.js.map +1 -0
- package/dist/grpc-service.d.ts +3 -19
- package/dist/grpc-service.d.ts.map +1 -1
- package/dist/grpc-service.js +28 -1989
- package/dist/grpc-service.js.map +1 -1
- package/dist/grpc-shared.d.ts +25 -0
- package/dist/grpc-shared.d.ts.map +1 -0
- package/dist/grpc-shared.js +110 -0
- package/dist/grpc-shared.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/knowledge-handlers.d.ts +12 -0
- package/dist/knowledge-handlers.d.ts.map +1 -0
- package/dist/knowledge-handlers.js +85 -0
- package/dist/knowledge-handlers.js.map +1 -0
- package/dist/orphan-phase.d.ts +27 -0
- package/dist/orphan-phase.d.ts.map +1 -0
- package/dist/orphan-phase.js +69 -0
- package/dist/orphan-phase.js.map +1 -0
- package/dist/persona-handlers.d.ts +12 -0
- package/dist/persona-handlers.d.ts.map +1 -0
- package/dist/persona-handlers.js +148 -0
- package/dist/persona-handlers.js.map +1 -0
- package/dist/schedule-handlers.d.ts +12 -0
- package/dist/schedule-handlers.d.ts.map +1 -0
- package/dist/schedule-handlers.js +122 -0
- package/dist/schedule-handlers.js.map +1 -0
- package/dist/session-handlers.d.ts +34 -0
- package/dist/session-handlers.d.ts.map +1 -0
- package/dist/session-handlers.js +488 -0
- package/dist/session-handlers.js.map +1 -0
- package/dist/settings-handlers.d.ts +10 -0
- package/dist/settings-handlers.d.ts.map +1 -0
- package/dist/settings-handlers.js +68 -0
- package/dist/settings-handlers.js.map +1 -0
- package/dist/signals/orphan-reparent.d.ts +30 -0
- package/dist/signals/orphan-reparent.d.ts.map +1 -0
- package/dist/signals/orphan-reparent.js +179 -0
- package/dist/signals/orphan-reparent.js.map +1 -0
- package/dist/signals/sigchld.d.ts.map +1 -1
- package/dist/signals/sigchld.js +4 -8
- package/dist/signals/sigchld.js.map +1 -1
- package/dist/task-handlers.d.ts +22 -0
- package/dist/task-handlers.d.ts.map +1 -0
- package/dist/task-handlers.js +463 -0
- package/dist/task-handlers.js.map +1 -0
- package/dist/task-session.d.ts +26 -0
- package/dist/task-session.d.ts.map +1 -0
- package/dist/task-session.js +132 -0
- package/dist/task-session.js.map +1 -0
- package/dist/test-utils/mock-database.d.ts +2 -0
- package/dist/test-utils/mock-database.d.ts.map +1 -1
- package/dist/test-utils/mock-database.js +2 -0
- package/dist/test-utils/mock-database.js.map +1 -1
- package/dist/token-handlers.d.ts +12 -0
- package/dist/token-handlers.d.ts.map +1 -0
- package/dist/token-handlers.js +85 -0
- package/dist/token-handlers.js.map +1 -0
- package/dist/workspace-handlers.d.ts +12 -0
- package/dist/workspace-handlers.d.ts.map +1 -0
- package/dist/workspace-handlers.js +86 -0
- package/dist/workspace-handlers.js.map +1 -0
- package/package.json +7 -9
- package/dist/ws-bridge.d.ts +0 -30
- package/dist/ws-bridge.d.ts.map +0 -1
- package/dist/ws-bridge.js +0 -372
- package/dist/ws-bridge.js.map +0 -1
- package/dist/ws-broadcast.d.ts +0 -19
- package/dist/ws-broadcast.d.ts.map +0 -1
- package/dist/ws-broadcast.js +0 -60
- package/dist/ws-broadcast.js.map +0 -1
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orphan reparenting — automatically reparent non-terminal children when
|
|
3
|
+
* a parent task reaches terminal state (complete/failed).
|
|
4
|
+
*
|
|
5
|
+
* Follows the SIGCHLD subscriber pattern: subscribes to domain events,
|
|
6
|
+
* detects orphan conditions, and reparents children to the grandparent.
|
|
7
|
+
* The root task (PID 1) is the ultimate adopter.
|
|
8
|
+
*/
|
|
9
|
+
import { ROOT_TASK_ID, TASK_STATUS } from "@grackle-ai/common";
|
|
10
|
+
import { subscribe, emit } from "../event-bus.js";
|
|
11
|
+
import { taskStore, sessionStore } from "@grackle-ai/database";
|
|
12
|
+
import * as streamRegistry from "../stream-registry.js";
|
|
13
|
+
import { ensureAsyncDeliveryListener } from "../pipe-delivery.js";
|
|
14
|
+
import { deliverSignalToTask } from "./signal-delivery.js";
|
|
15
|
+
import { logger } from "../logger.js";
|
|
16
|
+
/** Terminal task statuses that trigger orphan reparenting. */
|
|
17
|
+
const TERMINAL_TASK_STATUSES = new Set([
|
|
18
|
+
TASK_STATUS.COMPLETE,
|
|
19
|
+
TASK_STATUS.FAILED,
|
|
20
|
+
]);
|
|
21
|
+
/** How long (ms) to remember a processed parent before allowing re-processing. */
|
|
22
|
+
const DEDUP_TTL_MS = 3_600_000; // 1 hour
|
|
23
|
+
/** Track processed parents to prevent duplicate reparenting: parentTaskId → timestamp. */
|
|
24
|
+
const processed = new Map();
|
|
25
|
+
/** Whether the subscriber has been initialized. */
|
|
26
|
+
let initialized = false;
|
|
27
|
+
/**
|
|
28
|
+
* Initialize the orphan reparenting event-bus subscriber.
|
|
29
|
+
* Idempotent — safe to call multiple times.
|
|
30
|
+
*/
|
|
31
|
+
export function initOrphanReparentSubscriber() {
|
|
32
|
+
if (initialized) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
initialized = true;
|
|
36
|
+
subscribe((event) => {
|
|
37
|
+
if (event.type !== "task.completed" && event.type !== "task.updated") {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const parentTaskId = event.payload.taskId;
|
|
41
|
+
if (!parentTaskId) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// Root task never completes — guard defensively
|
|
45
|
+
if (parentTaskId === ROOT_TASK_ID) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// Fire-and-forget async handler — errors are logged, never thrown
|
|
49
|
+
(async () => {
|
|
50
|
+
try {
|
|
51
|
+
await handleParentTerminal(parentTaskId);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
logger.error({ err, parentTaskId }, "Orphan reparenting failed for parent task");
|
|
55
|
+
}
|
|
56
|
+
})().catch(() => { });
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check if a parent task is terminal and reparent its non-terminal children.
|
|
61
|
+
*/
|
|
62
|
+
async function handleParentTerminal(parentTaskId) {
|
|
63
|
+
const parentTask = taskStore.getTask(parentTaskId);
|
|
64
|
+
if (!parentTask) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// Only trigger for terminal statuses
|
|
68
|
+
if (!TERMINAL_TASK_STATUSES.has(parentTask.status)) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// Deduplication: skip if we already processed this parent recently
|
|
72
|
+
const now = Date.now();
|
|
73
|
+
const lastProcessed = processed.get(parentTaskId);
|
|
74
|
+
if (lastProcessed && now - lastProcessed < DEDUP_TTL_MS) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
// Mark as processed before doing work (prevents concurrent re-entry)
|
|
78
|
+
processed.set(parentTaskId, now);
|
|
79
|
+
// Determine the grandparent (or root task as ultimate adopter)
|
|
80
|
+
const grandparentId = parentTask.parentTaskId || ROOT_TASK_ID;
|
|
81
|
+
// Always transfer pipe fds from dead parent to grandparent, even when there
|
|
82
|
+
// are no orphaned tasks. ipc_spawn creates child sessions (not tasks), so
|
|
83
|
+
// pipe subscriptions can exist without corresponding child tasks.
|
|
84
|
+
transferAllPipeSubscriptions(parentTaskId, grandparentId);
|
|
85
|
+
// Get non-terminal children for reparenting
|
|
86
|
+
const orphans = taskStore.getOrphanedTasks(parentTaskId);
|
|
87
|
+
if (orphans.length === 0) {
|
|
88
|
+
// Evict stale dedup entries even when no reparenting needed
|
|
89
|
+
for (const [key, ts] of processed) {
|
|
90
|
+
if (now - ts > DEDUP_TTL_MS) {
|
|
91
|
+
processed.delete(key);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
logger.info({ parentTaskId, grandparentId, orphanCount: orphans.length, reason: parentTask.status }, "Reparenting orphaned children to grandparent");
|
|
97
|
+
// Reparent each orphan
|
|
98
|
+
for (const orphan of orphans) {
|
|
99
|
+
try {
|
|
100
|
+
taskStore.reparentTask(orphan.id, grandparentId);
|
|
101
|
+
emit("task.reparented", {
|
|
102
|
+
taskId: orphan.id,
|
|
103
|
+
oldParentTaskId: parentTaskId,
|
|
104
|
+
newParentTaskId: grandparentId,
|
|
105
|
+
workspaceId: orphan.workspaceId || "",
|
|
106
|
+
});
|
|
107
|
+
emit("task.updated", {
|
|
108
|
+
taskId: orphan.id,
|
|
109
|
+
workspaceId: orphan.workspaceId || "",
|
|
110
|
+
});
|
|
111
|
+
// Deliver [ADOPTED] signal to grandparent
|
|
112
|
+
const message = `[ADOPTED] Task "${orphan.title}" (${orphan.id}) was adopted from ` +
|
|
113
|
+
`terminated parent "${parentTask.title}" (${parentTask.id}). ` +
|
|
114
|
+
`The task is now your direct child. Use ipc_list_fds to see transferred pipe fds.`;
|
|
115
|
+
await deliverSignalToTask(grandparentId, "adopted", message);
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
logger.error({ err, orphanId: orphan.id, parentTaskId, grandparentId }, "Failed to reparent orphan — continuing with remaining children");
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Evict stale dedup entries
|
|
122
|
+
for (const [key, ts] of processed) {
|
|
123
|
+
if (now - ts > DEDUP_TTL_MS) {
|
|
124
|
+
processed.delete(key);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Transfer ALL pipe subscriptions from a dead parent's sessions to the
|
|
130
|
+
* grandparent's active session. Called once per parent death (not per child).
|
|
131
|
+
*
|
|
132
|
+
* When a parent dies, all its pipe connections should move to the grandparent —
|
|
133
|
+
* like fd inheritance when a Unix process dies and init takes over.
|
|
134
|
+
*
|
|
135
|
+
* Exported so it can be called synchronously from completeTask() /
|
|
136
|
+
* killSessionAndCleanup() before sessions are cleaned up.
|
|
137
|
+
*/
|
|
138
|
+
export function transferAllPipeSubscriptions(deadParentTaskId, grandparentTaskId) {
|
|
139
|
+
const grandparentSessions = sessionStore.getActiveSessionsForTask(grandparentTaskId);
|
|
140
|
+
if (grandparentSessions.length === 0) {
|
|
141
|
+
logger.debug({ deadParentTaskId, grandparentTaskId }, "No active grandparent session — skipping pipe fd transfer");
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const grandparentSessionId = grandparentSessions[0].id;
|
|
145
|
+
const parentSessions = sessionStore.listSessionsForTask(deadParentTaskId);
|
|
146
|
+
let transferred = 0;
|
|
147
|
+
for (const parentSession of parentSessions) {
|
|
148
|
+
const subs = streamRegistry.getSubscriptionsForSession(parentSession.id);
|
|
149
|
+
for (const sub of subs) {
|
|
150
|
+
const stream = streamRegistry.getStream(sub.streamId);
|
|
151
|
+
if (!stream?.name.startsWith("pipe:")) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
streamRegistry.subscribe(sub.streamId, grandparentSessionId, sub.permission, sub.deliveryMode, sub.createdBySpawn);
|
|
156
|
+
streamRegistry.unsubscribe(sub.id);
|
|
157
|
+
if (sub.deliveryMode === "async") {
|
|
158
|
+
ensureAsyncDeliveryListener(grandparentSessionId);
|
|
159
|
+
}
|
|
160
|
+
transferred++;
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
logger.warn({ err, stream: stream.name, deadParentTaskId }, "Failed to transfer pipe fd");
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (transferred > 0) {
|
|
168
|
+
logger.info({ deadParentTaskId, grandparentTaskId, grandparentSessionId, transferred }, "Transferred %d pipe fd(s) to grandparent session", transferred);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Reset module state. For testing only.
|
|
173
|
+
* @internal
|
|
174
|
+
*/
|
|
175
|
+
export function _resetForTesting() {
|
|
176
|
+
initialized = false;
|
|
177
|
+
processed.clear();
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=orphan-reparent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphan-reparent.js","sourceRoot":"","sources":["../../src/signals/orphan-reparent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sigchld.d.ts","sourceRoot":"","sources":["../../src/signals/sigchld.ts"],"names":[],"mappings":"AAwCA,wBAAgB,qBAAqB,IAAI,IAAI,CA2B5C;
|
|
1
|
+
{"version":3,"file":"sigchld.d.ts","sourceRoot":"","sources":["../../src/signals/sigchld.ts"],"names":[],"mappings":"AAwCA,wBAAgB,qBAAqB,IAAI,IAAI,CA2B5C;AAqHD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC"}
|
package/dist/signals/sigchld.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SESSION_STATUS } from "@grackle-ai/common";
|
|
2
2
|
import { subscribe } from "../event-bus.js";
|
|
3
3
|
import { taskStore, sessionStore } from "@grackle-ai/database";
|
|
4
|
-
import {
|
|
4
|
+
import { readLastTextEntry } from "../log-writer.js";
|
|
5
5
|
import { deliverSignalToTask } from "./signal-delivery.js";
|
|
6
6
|
import { logger } from "../logger.js";
|
|
7
7
|
/** Maximum length for the child's last text message in the notification. */
|
|
@@ -137,6 +137,8 @@ function pruneDelivered(now) {
|
|
|
137
137
|
}
|
|
138
138
|
/**
|
|
139
139
|
* Read the session log and extract the content of the last "text" entry.
|
|
140
|
+
* Uses readLastTextEntry which only reads the tail of the file (up to 64 KB)
|
|
141
|
+
* instead of parsing the entire log into memory.
|
|
140
142
|
* Returns an empty string if no text entries exist or the log cannot be read.
|
|
141
143
|
*/
|
|
142
144
|
function extractLastTextMessage(logPath) {
|
|
@@ -144,13 +146,7 @@ function extractLastTextMessage(logPath) {
|
|
|
144
146
|
return "";
|
|
145
147
|
}
|
|
146
148
|
try {
|
|
147
|
-
|
|
148
|
-
for (let i = entries.length - 1; i >= 0; i--) {
|
|
149
|
-
if (entries[i].type === "text") {
|
|
150
|
-
return entries[i].content;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
return "";
|
|
149
|
+
return readLastTextEntry(logPath)?.content ?? "";
|
|
154
150
|
}
|
|
155
151
|
catch {
|
|
156
152
|
return "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sigchld.js","sourceRoot":"","sources":["../../src/signals/sigchld.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAqB,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sigchld.js","sourceRoot":"","sources":["../../src/signals/sigchld.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { grackle } from "@grackle-ai/common";
|
|
2
|
+
/** List tasks, optionally filtered by workspace, search query, or status. */
|
|
3
|
+
export declare function listTasks(req: grackle.ListTasksRequest): Promise<grackle.TaskList>;
|
|
4
|
+
/** Create a new task. */
|
|
5
|
+
export declare function createTask(req: grackle.CreateTaskRequest): Promise<grackle.Task>;
|
|
6
|
+
/** Get a task by ID with computed status. */
|
|
7
|
+
export declare function getTask(req: grackle.TaskId): Promise<grackle.Task>;
|
|
8
|
+
/** Update task fields or late-bind a session to a task. */
|
|
9
|
+
export declare function updateTask(req: grackle.UpdateTaskRequest): Promise<grackle.Task>;
|
|
10
|
+
/** Start a task by spawning a new agent session. */
|
|
11
|
+
export declare function startTask(req: grackle.StartTaskRequest): Promise<grackle.Session>;
|
|
12
|
+
/** Mark a task as complete and clean up active sessions. */
|
|
13
|
+
export declare function completeTask(req: grackle.TaskId): Promise<grackle.Task>;
|
|
14
|
+
/** Set the workpad JSON for a task. */
|
|
15
|
+
export declare function setWorkpad(req: grackle.SetWorkpadRequest): Promise<grackle.Task>;
|
|
16
|
+
/** Resume the latest session for a task. */
|
|
17
|
+
export declare function resumeTask(req: grackle.TaskId): Promise<grackle.Session>;
|
|
18
|
+
/** Stop a task by terminating all its active sessions. */
|
|
19
|
+
export declare function stopTask(req: grackle.TaskId): Promise<grackle.Task>;
|
|
20
|
+
/** Delete a task and all its sessions. */
|
|
21
|
+
export declare function deleteTask(req: grackle.TaskId): Promise<grackle.Empty>;
|
|
22
|
+
//# sourceMappingURL=task-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-handlers.d.ts","sourceRoot":"","sources":["../src/task-handlers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAa,MAAM,oBAAoB,CAAC;AAoCxD,6EAA6E;AAC7E,wBAAsB,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAwBxF;AAED,yBAAyB;AACzB,wBAAsB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAkDtF;AAED,6CAA6C;AAC7C,wBAAsB,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAQxE;AAED,2DAA2D;AAC3D,wBAAsB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CA6DtF;AAED,oDAAoD;AACpD,wBAAsB,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAkLvF;AAED,4DAA4D;AAC5D,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAqD7E;AAED,uCAAuC;AACvC,wBAAsB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CA2BtF;AAED,4CAA4C;AAC5C,wBAAsB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CA2D9E;AAED,0DAA0D;AAC1D,wBAAsB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CA0CzE;AAED,0CAA0C;AAC1C,wBAAsB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAoC5E"}
|