@silverbackbase/root 0.4.4 → 0.4.5
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/auth.d.ts.map +1 -1
- package/dist/auth.js +8 -0
- package/dist/auth.js.map +1 -1
- package/dist/mcp.js +1 -1
- package/dist/server.js +91 -2
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AA6C9C,eAAO,MAAM,WAAW,EAAE,iBAkBzB,CAAC"}
|
package/dist/auth.js
CHANGED
|
@@ -3,6 +3,7 @@ const VALIDATE_URL = process.env.SILVERBACKBASE_URL
|
|
|
3
3
|
? `${process.env.SILVERBACKBASE_URL}/api/tokens/validate`
|
|
4
4
|
: null;
|
|
5
5
|
const VALIDATE_SECRET = process.env.ROOT_VALIDATE_SECRET ?? process.env.TRAIL_VALIDATE_SECRET ?? "";
|
|
6
|
+
const ROOT_ADMIN_TOKEN = process.env.ROOT_ADMIN_TOKEN ?? "";
|
|
6
7
|
const cache = new Map();
|
|
7
8
|
async function validateToken(token) {
|
|
8
9
|
// Cloud mode: validate against silverbackbase.com
|
|
@@ -40,6 +41,13 @@ export const requireAuth = async (c, next) => {
|
|
|
40
41
|
return c.json({ error: "Unauthorized — provide Authorization: Bearer <token>" }, 401);
|
|
41
42
|
}
|
|
42
43
|
const token = auth.slice(7).trim();
|
|
44
|
+
// Admin bypass — website proxy and unified MCP gateway
|
|
45
|
+
if (ROOT_ADMIN_TOKEN && token === ROOT_ADMIN_TOKEN) {
|
|
46
|
+
const workspaceId = c.req.header("x-workspace-id") ?? null;
|
|
47
|
+
c.set("workspaceId", workspaceId);
|
|
48
|
+
await next();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
43
51
|
const { valid, workspaceId } = await validateToken(token);
|
|
44
52
|
if (!valid)
|
|
45
53
|
return c.json({ error: "Invalid or revoked token" }, 401);
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB;IACjD,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,sBAAsB;IACzD,CAAC,CAAC,IAAI,CAAC;AAET,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp.js
CHANGED
|
@@ -16,7 +16,7 @@ function resolveProjectId(projectId) {
|
|
|
16
16
|
return projectId ?? process.env.ROOT_ACCOUNT_ID ?? "default";
|
|
17
17
|
}
|
|
18
18
|
export function buildServer(workspaceId) {
|
|
19
|
-
const server = new McpServer({ name: "root", version: "0.4.
|
|
19
|
+
const server = new McpServer({ name: "root", version: "0.4.5" });
|
|
20
20
|
// ── PROJECT MANAGEMENT ─────────────────────────────────────────────────────
|
|
21
21
|
server.registerTool("root_create_project", {
|
|
22
22
|
description: "Create a new project and automatically onboard its website. Scrapes the URL, extracts business knowledge (offers, personas, competitors, geo zones…) and stores it under a new isolated project ID. Returns the project object and the full onboarding summary.",
|
package/dist/server.js
CHANGED
|
@@ -5,15 +5,104 @@ import { cors } from "hono/cors";
|
|
|
5
5
|
import { requireAuth } from "./auth.js";
|
|
6
6
|
import { createMcpHandler } from "./mcp.js";
|
|
7
7
|
import { startScheduler } from "./core/scheduler.js";
|
|
8
|
+
import { getContext, getCategory, createItem, updateItem, deleteItem, searchKnowledge, createProject, listProjects, deleteProject, assertProjectAccess, } from "./core/knowledge.js";
|
|
9
|
+
import { onboardFromUrl } from "./core/onboard.js";
|
|
10
|
+
import { refreshKnowledge } from "./core/refresh.js";
|
|
8
11
|
const port = parseInt(process.env.PORT ?? "3000");
|
|
12
|
+
function resolveProject(pid) {
|
|
13
|
+
return pid ?? process.env.ROOT_ACCOUNT_ID ?? "default";
|
|
14
|
+
}
|
|
9
15
|
const app = new Hono();
|
|
10
|
-
app.use("*", cors({ origin: "*", allowMethods: ["GET", "POST", "OPTIONS"] }));
|
|
11
|
-
app.get("/health", (c) => c.json({ status: "ok", service: "root", version: "0.
|
|
16
|
+
app.use("*", cors({ origin: "*", allowMethods: ["GET", "POST", "PATCH", "DELETE", "OPTIONS"] }));
|
|
17
|
+
app.get("/health", (c) => c.json({ status: "ok", service: "root", version: "0.4.5" }));
|
|
12
18
|
app.all("/mcp", requireAuth, createMcpHandler());
|
|
19
|
+
// ── REST API — called by unified MCP gateway and website proxy ──────────────
|
|
20
|
+
app.use("/api/*", requireAuth);
|
|
21
|
+
app.get("/api/projects", async (c) => {
|
|
22
|
+
const workspaceId = c.get("workspaceId");
|
|
23
|
+
const projects = await listProjects(workspaceId);
|
|
24
|
+
return c.json({ projects, count: projects.length });
|
|
25
|
+
});
|
|
26
|
+
app.post("/api/projects", async (c) => {
|
|
27
|
+
const workspaceId = c.get("workspaceId");
|
|
28
|
+
const { name, url } = await c.req.json();
|
|
29
|
+
const project = await createProject(name, url, workspaceId);
|
|
30
|
+
const onboarding = await onboardFromUrl(project.id, url);
|
|
31
|
+
return c.json({ project, onboarding });
|
|
32
|
+
});
|
|
33
|
+
app.delete("/api/projects/:id", async (c) => {
|
|
34
|
+
const workspaceId = c.get("workspaceId");
|
|
35
|
+
const result = await deleteProject(c.req.param("id"), workspaceId);
|
|
36
|
+
return c.json(result);
|
|
37
|
+
});
|
|
38
|
+
app.post("/api/context", async (c) => {
|
|
39
|
+
const workspaceId = c.get("workspaceId");
|
|
40
|
+
const body = await c.req.json().catch(() => ({ project_id: undefined }));
|
|
41
|
+
const pid = resolveProject(body.project_id);
|
|
42
|
+
await assertProjectAccess(pid, workspaceId);
|
|
43
|
+
const context = await getContext(pid);
|
|
44
|
+
return c.json(context);
|
|
45
|
+
});
|
|
46
|
+
app.post("/api/category", async (c) => {
|
|
47
|
+
const workspaceId = c.get("workspaceId");
|
|
48
|
+
const { project_id, category } = await c.req.json();
|
|
49
|
+
const pid = resolveProject(project_id);
|
|
50
|
+
await assertProjectAccess(pid, workspaceId);
|
|
51
|
+
const items = await getCategory(pid, category);
|
|
52
|
+
return c.json({ category, items, count: items.length });
|
|
53
|
+
});
|
|
54
|
+
app.post("/api/search", async (c) => {
|
|
55
|
+
const workspaceId = c.get("workspaceId");
|
|
56
|
+
const { project_id, query } = await c.req.json();
|
|
57
|
+
const pid = resolveProject(project_id);
|
|
58
|
+
await assertProjectAccess(pid, workspaceId);
|
|
59
|
+
const results = await searchKnowledge(pid, query);
|
|
60
|
+
return c.json({ query, results, count: results.length });
|
|
61
|
+
});
|
|
62
|
+
app.post("/api/onboard", async (c) => {
|
|
63
|
+
const workspaceId = c.get("workspaceId");
|
|
64
|
+
const { project_id, url } = await c.req.json();
|
|
65
|
+
const pid = resolveProject(project_id);
|
|
66
|
+
await assertProjectAccess(pid, workspaceId);
|
|
67
|
+
const result = await onboardFromUrl(pid, url);
|
|
68
|
+
return c.json(result);
|
|
69
|
+
});
|
|
70
|
+
app.post("/api/refresh", async (c) => {
|
|
71
|
+
const workspaceId = c.get("workspaceId");
|
|
72
|
+
const body = await c.req.json().catch(() => ({ project_id: undefined }));
|
|
73
|
+
const pid = resolveProject(body.project_id);
|
|
74
|
+
await assertProjectAccess(pid, workspaceId);
|
|
75
|
+
const diff = await refreshKnowledge(pid);
|
|
76
|
+
return c.json(diff);
|
|
77
|
+
});
|
|
78
|
+
app.post("/api/items", async (c) => {
|
|
79
|
+
const workspaceId = c.get("workspaceId");
|
|
80
|
+
const { project_id, category, data } = await c.req.json();
|
|
81
|
+
const pid = resolveProject(project_id);
|
|
82
|
+
await assertProjectAccess(pid, workspaceId);
|
|
83
|
+
const item = await createItem(pid, category, data);
|
|
84
|
+
return c.json({ success: true, item });
|
|
85
|
+
});
|
|
86
|
+
app.patch("/api/items/:id", async (c) => {
|
|
87
|
+
const workspaceId = c.get("workspaceId");
|
|
88
|
+
const { project_id, data } = await c.req.json();
|
|
89
|
+
const pid = resolveProject(project_id);
|
|
90
|
+
await assertProjectAccess(pid, workspaceId);
|
|
91
|
+
const item = await updateItem(pid, c.req.param("id"), data);
|
|
92
|
+
return c.json({ success: true, item });
|
|
93
|
+
});
|
|
94
|
+
app.delete("/api/items/:id", async (c) => {
|
|
95
|
+
const workspaceId = c.get("workspaceId");
|
|
96
|
+
const pid = resolveProject(c.req.query("project_id"));
|
|
97
|
+
await assertProjectAccess(pid, workspaceId);
|
|
98
|
+
const result = await deleteItem(pid, c.req.param("id"));
|
|
99
|
+
return c.json(result);
|
|
100
|
+
});
|
|
13
101
|
serve({ fetch: app.fetch, port }, async () => {
|
|
14
102
|
const base = process.env.ROOT_URL ?? `http://localhost:${port}`;
|
|
15
103
|
console.log(`Root server running on port ${port}`);
|
|
16
104
|
console.log(` MCP → ${base}/mcp`);
|
|
105
|
+
console.log(` API → ${base}/api`);
|
|
17
106
|
await startScheduler();
|
|
18
107
|
});
|
|
19
108
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EACL,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAC5E,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,GAChE,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;AAIlD,SAAS,cAAc,CAAC,GAAY;IAClC,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,SAAS,CAAC;AACzD,CAAC;AAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAA4B,CAAC;AAEjD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;AACjG,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AACvF,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAEjD,+EAA+E;AAC/E,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAE/B,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACnC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAkB,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IACjD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACpC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAkB,CAAC;IAC1D,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAiC,CAAC;IACxE,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC1C,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAkB,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC;IACnE,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACnC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAkB,CAAC;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAA2B,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAClG,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,mBAAmB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACpC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAkB,CAAC;IAC1D,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAwD,CAAC;IAC1G,MAAM,GAAG,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,mBAAmB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC/C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAClC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAkB,CAAC;IAC1D,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAA0C,CAAC;IACzF,MAAM,GAAG,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,mBAAmB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACnC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAkB,CAAC;IAC1D,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAwC,CAAC;IACrF,MAAM,GAAG,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,mBAAmB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9C,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACnC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAkB,CAAC;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAA2B,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAClG,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,mBAAmB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACjC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAkB,CAAC;IAC1D,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAuF,CAAC;IAC/I,MAAM,GAAG,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,mBAAmB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACnD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACtC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAkB,CAAC;IAC1D,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAA0D,CAAC;IACxG,MAAM,GAAG,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,mBAAmB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACvC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAkB,CAAC;IAC1D,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IACtD,MAAM,mBAAmB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI,EAAE;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,oBAAoB,IAAI,EAAE,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,CAAC;IACnC,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC"}
|