@borgresearch/odin-mcp 0.3.0 → 0.3.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/README.md +1 -1
- package/dist/{chunk-ODZB3YP2.js → chunk-MHMO7K4D.js} +12 -5
- package/dist/chunk-MHMO7K4D.js.map +1 -0
- package/dist/http.js +1 -1
- package/dist/index.js +1 -1
- package/dist/server.js +1 -1
- package/package.json +3 -3
- package/dist/chunk-ODZB3YP2.js.map +0 -1
package/README.md
CHANGED
|
@@ -62,7 +62,7 @@ Each call sends `Authorization: Bearer ${ODIN_API_KEY}`. Keys belong to one orga
|
|
|
62
62
|
|
|
63
63
|
## Tools
|
|
64
64
|
|
|
65
|
-
All tools accept one JSON object and return both a Markdown summary and a structured payload. Read tools are annotated `readOnlyHint: true`; every Read & Write tool is annotated `destructiveHint: true`, so clients ask before running it.
|
|
65
|
+
All tools accept one JSON object and return both a Markdown summary and a structured payload. The same payload is also returned as JSON text for clients that only read text content. Read tools are annotated `readOnlyHint: true`; every Read & Write tool is annotated `destructiveHint: true`, so clients ask before running it.
|
|
66
66
|
|
|
67
67
|
| Name | Permission | Description |
|
|
68
68
|
|------|------------|-------------|
|
|
@@ -16,7 +16,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
16
16
|
import { z } from "zod";
|
|
17
17
|
|
|
18
18
|
// package.json
|
|
19
|
-
var version = "0.3.
|
|
19
|
+
var version = "0.3.1";
|
|
20
20
|
|
|
21
21
|
// src/server.ts
|
|
22
22
|
var PACKAGE_VERSION = version;
|
|
@@ -74,14 +74,21 @@ function createOdinMcpServer(client, options = {}) {
|
|
|
74
74
|
title: tool.title,
|
|
75
75
|
description: tool.description,
|
|
76
76
|
inputSchema: tool.inputSchema,
|
|
77
|
-
annotations: tool.annotations
|
|
77
|
+
annotations: { ...tool.annotations, title: tool.title }
|
|
78
78
|
},
|
|
79
79
|
async (params) => {
|
|
80
80
|
try {
|
|
81
81
|
const { markdown, structured } = await tool.run(client, params);
|
|
82
|
+
const structuredContent = { markdown, ...toObject(structured) };
|
|
82
83
|
return {
|
|
83
|
-
content: [
|
|
84
|
-
|
|
84
|
+
content: [
|
|
85
|
+
{ type: "text", text: markdown },
|
|
86
|
+
{
|
|
87
|
+
type: "text",
|
|
88
|
+
text: JSON.stringify(structuredContent)
|
|
89
|
+
}
|
|
90
|
+
],
|
|
91
|
+
structuredContent
|
|
85
92
|
};
|
|
86
93
|
} catch (error) {
|
|
87
94
|
return {
|
|
@@ -110,4 +117,4 @@ export {
|
|
|
110
117
|
PACKAGE_VERSION,
|
|
111
118
|
createOdinMcpServer
|
|
112
119
|
};
|
|
113
|
-
//# sourceMappingURL=chunk-
|
|
120
|
+
//# sourceMappingURL=chunk-MHMO7K4D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server.ts","../package.json"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { version } from \"../package.json\";\nimport { OdinApiError, type OdinClient } from \"./client.js\";\nimport {\n buildFixFindingPrompt,\n buildServerInstructions,\n buildSetupPrompt,\n} from \"./guidance.js\";\nimport { ODIN_TOOLS } from \"./tools.js\";\n\nexport const PACKAGE_VERSION = version;\n\nexport interface OdinMcpServerOptions {\n /** Public Odin origin for links in guidance. Defaults to production. */\n appUrl?: string;\n}\n\nexport function createOdinMcpServer(\n client: OdinClient,\n options: OdinMcpServerOptions = {},\n) {\n const { appUrl } = options;\n const server = new McpServer(\n { name: \"@borgresearch/odin-mcp\", version: PACKAGE_VERSION },\n { instructions: buildServerInstructions({ appUrl }) },\n );\n\n server.registerPrompt(\n \"setup\",\n {\n title: \"Set up Odin\",\n description:\n \"Learn what Odin does, check what is set up, get recommendations for this repository and reach a first result.\",\n },\n () => ({\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildSetupPrompt({ appUrl }),\n },\n },\n ],\n }),\n );\n\n server.registerPrompt(\n \"fix_finding\",\n {\n title: \"Fix an Odin finding\",\n description:\n \"Fix one finding in this repository, open a pull request and link it so Odin can retest the fix.\",\n argsSchema: {\n finding: z\n .string()\n .max(100)\n .optional()\n .describe(\n \"Finding ID such as ODI-12. Leave empty to pick the most severe open finding.\",\n ),\n },\n },\n ({ finding }) => ({\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildFixFindingPrompt({ appUrl, finding }),\n },\n },\n ],\n }),\n );\n\n for (const tool of ODIN_TOOLS) {\n server.registerTool(\n tool.name,\n {\n title: tool.title,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: { ...tool.annotations, title: tool.title },\n },\n async (params: unknown) => {\n try {\n const { markdown, structured } = await tool.run(client, params);\n const structuredContent = { markdown, ...toObject(structured) };\n return {\n content: [\n { type: \"text\" as const, text: markdown },\n {\n type: \"text\" as const,\n text: JSON.stringify(structuredContent),\n },\n ],\n structuredContent,\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: \"text\" as const, text: toErrorMessage(error) }],\n };\n }\n },\n );\n }\n\n return server;\n}\n\nfunction toObject(value: unknown): Record<string, unknown> {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return { data: value };\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof OdinApiError) return error.message;\n if (error instanceof Error) return `Unexpected error: ${error.message}`;\n return `Unexpected error: ${String(error)}`;\n}\n","{\n \"name\": \"@borgresearch/odin-mcp\",\n \"version\": \"0.3.1\",\n \"mcpName\": \"io.github.BorgDevelopment/odin-mcp\",\n \"description\": \"MCP server for the Odin security API\",\n \"keywords\": [\n \"mcp\",\n \"model-context-protocol\",\n \"odin\",\n \"security\"\n ],\n \"homepage\": \"https://docs.borghq.io/platform/odin-mcp\",\n \"bugs\": {\n \"email\": \"mail@borghq.io\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/BorgDevelopment/borg-platform.git\",\n \"directory\": \"frontend/packages/odin-mcp\"\n },\n \"license\": \"MIT\",\n \"author\": \"Borg Research\",\n \"type\": \"module\",\n \"bin\": {\n \"odin-mcp\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./server\": {\n \"types\": \"./dist/server.d.ts\",\n \"import\": \"./dist/server.js\"\n },\n \"./http\": {\n \"types\": \"./dist/http.d.ts\",\n \"import\": \"./dist/http.js\"\n },\n \"./client\": {\n \"types\": \"./dist/client.d.ts\",\n \"import\": \"./dist/client.js\"\n },\n \"./guidance\": {\n \"types\": \"./dist/guidance.d.ts\",\n \"import\": \"./dist/guidance.js\"\n },\n \"./tools\": {\n \"types\": \"./dist/tools.d.ts\",\n \"import\": \"./dist/tools.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"engines\": {\n \"node\": \">=24.0.0\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:run\": \"vitest run\",\n \"lint\": \"biome check .\",\n \"format\": \"biome format --write .\",\n \"inspect\": \"mcp-inspector node dist/index.js\",\n \"inspect:dev\": \"pnpm build && pnpm inspect\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.31.0\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"2.3.14\",\n \"@modelcontextprotocol/inspector\": \"^0.21.2\",\n \"@types/node\": \"^24.10.1\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.11\"\n },\n \"packageManager\": \"pnpm@11.2.2\"\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,iBAAiB;AAC1B,SAAS,SAAS;;;ACChB,cAAW;;;ADSN,IAAM,kBAAkB;AAOxB,SAAS,oBACd,QACA,UAAgC,CAAC,GACjC;AACA,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,SAAS,IAAI;AAAA,IACjB,EAAE,MAAM,0BAA0B,SAAS,gBAAgB;AAAA,IAC3D,EAAE,cAAc,wBAAwB,EAAE,OAAO,CAAC,EAAE;AAAA,EACtD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,MACL,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,MAAM,iBAAiB,EAAE,OAAO,CAAC;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,YAAY;AAAA,QACV,SAAS,EACN,OAAO,EACP,IAAI,GAAG,EACP,SAAS,EACT;AAAA,UACC;AAAA,QACF;AAAA,MACJ;AAAA,IACF;AAAA,IACA,CAAC,EAAE,QAAQ,OAAO;AAAA,MAChB,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,MAAM,sBAAsB,EAAE,QAAQ,QAAQ,CAAC;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,QAAQ,YAAY;AAC7B,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,QACE,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK;AAAA,QAClB,aAAa,EAAE,GAAG,KAAK,aAAa,OAAO,KAAK,MAAM;AAAA,MACxD;AAAA,MACA,OAAO,WAAoB;AACzB,YAAI;AACF,gBAAM,EAAE,UAAU,WAAW,IAAI,MAAM,KAAK,IAAI,QAAQ,MAAM;AAC9D,gBAAM,oBAAoB,EAAE,UAAU,GAAG,SAAS,UAAU,EAAE;AAC9D,iBAAO;AAAA,YACL,SAAS;AAAA,cACP,EAAE,MAAM,QAAiB,MAAM,SAAS;AAAA,cACxC;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,KAAK,UAAU,iBAAiB;AAAA,cACxC;AAAA,YACF;AAAA,YACA;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,eAAe,KAAK,EAAE,CAAC;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,OAAyC;AACzD,MAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO;AAAA,EACT;AACA,SAAO,EAAE,MAAM,MAAM;AACvB;AAEA,SAAS,eAAe,OAAwB;AAC9C,MAAI,iBAAiB,aAAc,QAAO,MAAM;AAChD,MAAI,iBAAiB,MAAO,QAAO,qBAAqB,MAAM,OAAO;AACrE,SAAO,qBAAqB,OAAO,KAAK,CAAC;AAC3C;","names":[]}
|
package/dist/http.js
CHANGED
package/dist/index.js
CHANGED
package/dist/server.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@borgresearch/odin-mcp",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"mcpName": "io.github.BorgDevelopment/odin-mcp",
|
|
5
5
|
"description": "MCP server for the Odin security API",
|
|
6
6
|
"keywords": [
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
"odin",
|
|
10
10
|
"security"
|
|
11
11
|
],
|
|
12
|
-
"homepage": "https://
|
|
12
|
+
"homepage": "https://docs.borghq.io/platform/odin-mcp",
|
|
13
13
|
"bugs": {
|
|
14
|
-
"
|
|
14
|
+
"email": "mail@borghq.io"
|
|
15
15
|
},
|
|
16
16
|
"repository": {
|
|
17
17
|
"type": "git",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server.ts","../package.json"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { version } from \"../package.json\";\nimport { OdinApiError, type OdinClient } from \"./client.js\";\nimport {\n buildFixFindingPrompt,\n buildServerInstructions,\n buildSetupPrompt,\n} from \"./guidance.js\";\nimport { ODIN_TOOLS } from \"./tools.js\";\n\nexport const PACKAGE_VERSION = version;\n\nexport interface OdinMcpServerOptions {\n /** Public Odin origin for links in guidance. Defaults to production. */\n appUrl?: string;\n}\n\nexport function createOdinMcpServer(\n client: OdinClient,\n options: OdinMcpServerOptions = {},\n) {\n const { appUrl } = options;\n const server = new McpServer(\n { name: \"@borgresearch/odin-mcp\", version: PACKAGE_VERSION },\n { instructions: buildServerInstructions({ appUrl }) },\n );\n\n server.registerPrompt(\n \"setup\",\n {\n title: \"Set up Odin\",\n description:\n \"Learn what Odin does, check what is set up, get recommendations for this repository and reach a first result.\",\n },\n () => ({\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildSetupPrompt({ appUrl }),\n },\n },\n ],\n }),\n );\n\n server.registerPrompt(\n \"fix_finding\",\n {\n title: \"Fix an Odin finding\",\n description:\n \"Fix one finding in this repository, open a pull request and link it so Odin can retest the fix.\",\n argsSchema: {\n finding: z\n .string()\n .max(100)\n .optional()\n .describe(\n \"Finding ID such as ODI-12. Leave empty to pick the most severe open finding.\",\n ),\n },\n },\n ({ finding }) => ({\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildFixFindingPrompt({ appUrl, finding }),\n },\n },\n ],\n }),\n );\n\n for (const tool of ODIN_TOOLS) {\n server.registerTool(\n tool.name,\n {\n title: tool.title,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: tool.annotations,\n },\n async (params: unknown) => {\n try {\n const { markdown, structured } = await tool.run(client, params);\n return {\n content: [{ type: \"text\" as const, text: markdown }],\n structuredContent: { markdown, ...toObject(structured) },\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: \"text\" as const, text: toErrorMessage(error) }],\n };\n }\n },\n );\n }\n\n return server;\n}\n\nfunction toObject(value: unknown): Record<string, unknown> {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return { data: value };\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof OdinApiError) return error.message;\n if (error instanceof Error) return `Unexpected error: ${error.message}`;\n return `Unexpected error: ${String(error)}`;\n}\n","{\n \"name\": \"@borgresearch/odin-mcp\",\n \"version\": \"0.3.0\",\n \"mcpName\": \"io.github.BorgDevelopment/odin-mcp\",\n \"description\": \"MCP server for the Odin security API\",\n \"keywords\": [\n \"mcp\",\n \"model-context-protocol\",\n \"odin\",\n \"security\"\n ],\n \"homepage\": \"https://github.com/BorgDevelopment/borg-platform/tree/develop/frontend/packages/odin-mcp\",\n \"bugs\": {\n \"url\": \"https://github.com/BorgDevelopment/borg-platform/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/BorgDevelopment/borg-platform.git\",\n \"directory\": \"frontend/packages/odin-mcp\"\n },\n \"license\": \"MIT\",\n \"author\": \"Borg Research\",\n \"type\": \"module\",\n \"bin\": {\n \"odin-mcp\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./server\": {\n \"types\": \"./dist/server.d.ts\",\n \"import\": \"./dist/server.js\"\n },\n \"./http\": {\n \"types\": \"./dist/http.d.ts\",\n \"import\": \"./dist/http.js\"\n },\n \"./client\": {\n \"types\": \"./dist/client.d.ts\",\n \"import\": \"./dist/client.js\"\n },\n \"./guidance\": {\n \"types\": \"./dist/guidance.d.ts\",\n \"import\": \"./dist/guidance.js\"\n },\n \"./tools\": {\n \"types\": \"./dist/tools.d.ts\",\n \"import\": \"./dist/tools.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"engines\": {\n \"node\": \">=24.0.0\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:run\": \"vitest run\",\n \"lint\": \"biome check .\",\n \"format\": \"biome format --write .\",\n \"inspect\": \"mcp-inspector node dist/index.js\",\n \"inspect:dev\": \"pnpm build && pnpm inspect\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.31.0\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"2.3.14\",\n \"@modelcontextprotocol/inspector\": \"^0.21.2\",\n \"@types/node\": \"^24.10.1\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.11\"\n },\n \"packageManager\": \"pnpm@11.2.2\"\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,iBAAiB;AAC1B,SAAS,SAAS;;;ACChB,cAAW;;;ADSN,IAAM,kBAAkB;AAOxB,SAAS,oBACd,QACA,UAAgC,CAAC,GACjC;AACA,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,SAAS,IAAI;AAAA,IACjB,EAAE,MAAM,0BAA0B,SAAS,gBAAgB;AAAA,IAC3D,EAAE,cAAc,wBAAwB,EAAE,OAAO,CAAC,EAAE;AAAA,EACtD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,MACL,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,MAAM,iBAAiB,EAAE,OAAO,CAAC;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,YAAY;AAAA,QACV,SAAS,EACN,OAAO,EACP,IAAI,GAAG,EACP,SAAS,EACT;AAAA,UACC;AAAA,QACF;AAAA,MACJ;AAAA,IACF;AAAA,IACA,CAAC,EAAE,QAAQ,OAAO;AAAA,MAChB,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,MAAM,sBAAsB,EAAE,QAAQ,QAAQ,CAAC;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,QAAQ,YAAY;AAC7B,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,QACE,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK;AAAA,MACpB;AAAA,MACA,OAAO,WAAoB;AACzB,YAAI;AACF,gBAAM,EAAE,UAAU,WAAW,IAAI,MAAM,KAAK,IAAI,QAAQ,MAAM;AAC9D,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,SAAS,CAAC;AAAA,YACnD,mBAAmB,EAAE,UAAU,GAAG,SAAS,UAAU,EAAE;AAAA,UACzD;AAAA,QACF,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,eAAe,KAAK,EAAE,CAAC;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,OAAyC;AACzD,MAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO;AAAA,EACT;AACA,SAAO,EAAE,MAAM,MAAM;AACvB;AAEA,SAAS,eAAe,OAAwB;AAC9C,MAAI,iBAAiB,aAAc,QAAO,MAAM;AAChD,MAAI,iBAAiB,MAAO,QAAO,qBAAqB,MAAM,OAAO;AACrE,SAAO,qBAAqB,OAAO,KAAK,CAAC;AAC3C;","names":[]}
|