@mcpc-tech/plugin-markdown-loader 0.0.5 → 0.0.6

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/index.cjs CHANGED
@@ -32,7 +32,9 @@ var mod_exports = {};
32
32
  __export(mod_exports, {
33
33
  createPlugin: () => createPlugin,
34
34
  default: () => mod_default,
35
+ isDirectory: () => isDirectory,
35
36
  isMarkdownAgentFile: () => isMarkdownFile,
37
+ loadMarkdownAgentDirectory: () => loadMarkdownAgentDirectory,
36
38
  loadMarkdownAgentFile: () => loadMarkdownAgentFile,
37
39
  markdownAgentToComposeDefinition: () => markdownAgentToComposeDefinition,
38
40
  markdownLoaderPlugin: () => markdownLoaderPlugin,
@@ -1559,7 +1561,7 @@ IMPORTANT: You MUST respond with valid JSON only. Do not include any text before
1559
1561
  let enhanced = systemPrompt || "";
1560
1562
  const toolsPrompt = `
1561
1563
 
1562
- AVAILABLE TOOLS:
1564
+ <available_tools>
1563
1565
  You have access to the following tools. To use a tool, respond with this XML format:
1564
1566
  <use_tool tool="tool_name">
1565
1567
  {"param1": "value1", "param2": "value2"}
@@ -1568,23 +1570,34 @@ You have access to the following tools. To use a tool, respond with this XML for
1568
1570
  Follow the JSON schema definition for each tool's parameters.
1569
1571
  You can use multiple tools in one response. DO NOT include text before or after tool calls - wait for the tool results first.
1570
1572
 
1571
- Tools:`;
1573
+ <tools>`;
1572
1574
  const toolDescriptions = tools.map((tool2) => {
1573
1575
  if (tool2.type === "function") {
1574
1576
  const toolAny = tool2;
1575
1577
  const description = toolAny.description || "No description provided";
1576
1578
  const schema = toolAny.inputSchema || toolAny.parameters;
1577
- const params = schema ? `
1578
- JSON Schema: ${JSON.stringify(schema, null, 2)}` : "";
1579
+ const schemaStr = schema ? `
1580
+ <schema>
1581
+ ${JSON.stringify(schema, null, 2)}
1582
+ </schema>` : "";
1579
1583
  return `
1580
- - ${tool2.name}: ${description}${params}`;
1584
+ <tool name="${tool2.name}">
1585
+ <description>
1586
+ ${description}
1587
+ </description>${schemaStr}
1588
+ </tool>`;
1581
1589
  } else if (tool2.type === "provider-defined") {
1582
1590
  return `
1583
- - ${tool2.name}: ${tool2.id || "No description provided"}`;
1591
+ <tool name="${tool2.name}">
1592
+ <description>${tool2.id || "No description provided"}</description>
1593
+ </tool>`;
1584
1594
  }
1585
1595
  return "";
1586
1596
  }).filter(Boolean).join("");
1587
- enhanced = enhanced ? `${enhanced}${toolsPrompt}${toolDescriptions}` : `${toolsPrompt}${toolDescriptions}`.trim();
1597
+ const toolsEnd = `
1598
+ </tools>
1599
+ </available_tools>`;
1600
+ enhanced = enhanced ? `${enhanced}${toolsPrompt}${toolDescriptions}${toolsEnd}` : `${toolsPrompt}${toolDescriptions}${toolsEnd}`.trim();
1588
1601
  return enhanced || void 0;
1589
1602
  }
1590
1603
  /**
@@ -4002,6 +4015,7 @@ function parse(content, options = {}) {
4002
4015
  }
4003
4016
 
4004
4017
  // __mcpc__plugin-markdown-loader_latest/node_modules/@mcpc/plugin-markdown-loader/src/markdown-loader.js
4018
+ var import_node_path = require("node:path");
4005
4019
  var import_node_process5 = __toESM(require("node:process"), 1);
4006
4020
  function replaceEnvVars(str2) {
4007
4021
  return str2.replace(/\$([A-Za-z_][A-Za-z0-9_]*)/g, (_match, varName) => {
@@ -4042,7 +4056,7 @@ function parseMarkdownAgent(content) {
4042
4056
  }
4043
4057
  return {
4044
4058
  frontMatter,
4045
- description: markdownContent.trim()
4059
+ body: markdownContent.trim()
4046
4060
  };
4047
4061
  }
4048
4062
  var OPTION_KEYS = [
@@ -4057,16 +4071,20 @@ var OPTION_KEYS = [
4057
4071
  ];
4058
4072
  function markdownAgentToComposeDefinition(parsed) {
4059
4073
  const frontMatter = replaceEnvVarsInObject(parsed.frontMatter);
4060
- const description = replaceEnvVars(parsed.description);
4074
+ const body = replaceEnvVars(parsed.body);
4061
4075
  const options = {};
4062
4076
  for (const key of OPTION_KEYS) {
4063
4077
  if (frontMatter[key] !== void 0) {
4064
4078
  options[key] = frontMatter[key];
4065
4079
  }
4066
4080
  }
4081
+ const hasDescription = frontMatter.description !== void 0 && frontMatter.description !== "";
4067
4082
  return {
4068
4083
  name: frontMatter.name,
4069
- description,
4084
+ description: hasDescription ? frontMatter.description : body,
4085
+ ...hasDescription && body ? {
4086
+ manual: body
4087
+ } : {},
4070
4088
  deps: frontMatter.deps,
4071
4089
  plugins: frontMatter.plugins,
4072
4090
  ...Object.keys(options).length > 0 ? {
@@ -4079,6 +4097,45 @@ async function loadMarkdownAgentFile(filePath) {
4079
4097
  const parsed = parseMarkdownAgent(content);
4080
4098
  return markdownAgentToComposeDefinition(parsed);
4081
4099
  }
4100
+ async function loadMarkdownAgentDirectory(dirPath, options = {}) {
4101
+ const { recursive = false } = options;
4102
+ const definitions = [];
4103
+ const errors = [];
4104
+ async function processDirectory(dir) {
4105
+ const entries = await (0, import_promises.readdir)(dir, {
4106
+ withFileTypes: true
4107
+ });
4108
+ for (const entry of entries) {
4109
+ const fullPath = (0, import_node_path.join)(dir, entry.name);
4110
+ if (entry.isDirectory() && recursive) {
4111
+ await processDirectory(fullPath);
4112
+ } else if (entry.isFile() && isMarkdownFile(entry.name)) {
4113
+ try {
4114
+ const definition = await loadMarkdownAgentFile(fullPath);
4115
+ definitions.push(definition);
4116
+ } catch (error) {
4117
+ errors.push({
4118
+ path: fullPath,
4119
+ error: error instanceof Error ? error.message : String(error)
4120
+ });
4121
+ }
4122
+ }
4123
+ }
4124
+ }
4125
+ await processDirectory(dirPath);
4126
+ return {
4127
+ definitions,
4128
+ errors
4129
+ };
4130
+ }
4131
+ async function isDirectory(path) {
4132
+ try {
4133
+ const stats = await (0, import_promises.stat)(path);
4134
+ return stats.isDirectory();
4135
+ } catch {
4136
+ return false;
4137
+ }
4138
+ }
4082
4139
 
4083
4140
  // __mcpc__plugin-markdown-loader_latest/node_modules/@mcpc/plugin-markdown-loader/mod.ts
4084
4141
  function markdownLoaderPlugin() {
@@ -4098,7 +4155,9 @@ var mod_default = defaultPlugin;
4098
4155
  // Annotate the CommonJS export names for ESM import in node:
4099
4156
  0 && (module.exports = {
4100
4157
  createPlugin,
4158
+ isDirectory,
4101
4159
  isMarkdownAgentFile,
4160
+ loadMarkdownAgentDirectory,
4102
4161
  loadMarkdownAgentFile,
4103
4162
  markdownAgentToComposeDefinition,
4104
4163
  markdownLoaderPlugin,
package/index.mjs CHANGED
@@ -1520,7 +1520,7 @@ IMPORTANT: You MUST respond with valid JSON only. Do not include any text before
1520
1520
  let enhanced = systemPrompt || "";
1521
1521
  const toolsPrompt = `
1522
1522
 
1523
- AVAILABLE TOOLS:
1523
+ <available_tools>
1524
1524
  You have access to the following tools. To use a tool, respond with this XML format:
1525
1525
  <use_tool tool="tool_name">
1526
1526
  {"param1": "value1", "param2": "value2"}
@@ -1529,23 +1529,34 @@ You have access to the following tools. To use a tool, respond with this XML for
1529
1529
  Follow the JSON schema definition for each tool's parameters.
1530
1530
  You can use multiple tools in one response. DO NOT include text before or after tool calls - wait for the tool results first.
1531
1531
 
1532
- Tools:`;
1532
+ <tools>`;
1533
1533
  const toolDescriptions = tools.map((tool2) => {
1534
1534
  if (tool2.type === "function") {
1535
1535
  const toolAny = tool2;
1536
1536
  const description = toolAny.description || "No description provided";
1537
1537
  const schema = toolAny.inputSchema || toolAny.parameters;
1538
- const params = schema ? `
1539
- JSON Schema: ${JSON.stringify(schema, null, 2)}` : "";
1538
+ const schemaStr = schema ? `
1539
+ <schema>
1540
+ ${JSON.stringify(schema, null, 2)}
1541
+ </schema>` : "";
1540
1542
  return `
1541
- - ${tool2.name}: ${description}${params}`;
1543
+ <tool name="${tool2.name}">
1544
+ <description>
1545
+ ${description}
1546
+ </description>${schemaStr}
1547
+ </tool>`;
1542
1548
  } else if (tool2.type === "provider-defined") {
1543
1549
  return `
1544
- - ${tool2.name}: ${tool2.id || "No description provided"}`;
1550
+ <tool name="${tool2.name}">
1551
+ <description>${tool2.id || "No description provided"}</description>
1552
+ </tool>`;
1545
1553
  }
1546
1554
  return "";
1547
1555
  }).filter(Boolean).join("");
1548
- enhanced = enhanced ? `${enhanced}${toolsPrompt}${toolDescriptions}` : `${toolsPrompt}${toolDescriptions}`.trim();
1556
+ const toolsEnd = `
1557
+ </tools>
1558
+ </available_tools>`;
1559
+ enhanced = enhanced ? `${enhanced}${toolsPrompt}${toolDescriptions}${toolsEnd}` : `${toolsPrompt}${toolDescriptions}${toolsEnd}`.trim();
1549
1560
  return enhanced || void 0;
1550
1561
  }
1551
1562
  /**
@@ -2024,7 +2035,7 @@ function isMarkdownFile(path) {
2024
2035
  }
2025
2036
 
2026
2037
  // __mcpc__plugin-markdown-loader_latest/node_modules/@mcpc/plugin-markdown-loader/src/markdown-loader.js
2027
- import { readFile } from "node:fs/promises";
2038
+ import { readdir, readFile, stat } from "node:fs/promises";
2028
2039
 
2029
2040
  // __mcpc__plugin-markdown-loader_latest/node_modules/@jsr/std__yaml/_chars.js
2030
2041
  var TAB = 9;
@@ -3963,6 +3974,7 @@ function parse(content, options = {}) {
3963
3974
  }
3964
3975
 
3965
3976
  // __mcpc__plugin-markdown-loader_latest/node_modules/@mcpc/plugin-markdown-loader/src/markdown-loader.js
3977
+ import { join } from "node:path";
3966
3978
  import process5 from "node:process";
3967
3979
  function replaceEnvVars(str2) {
3968
3980
  return str2.replace(/\$([A-Za-z_][A-Za-z0-9_]*)/g, (_match, varName) => {
@@ -4003,7 +4015,7 @@ function parseMarkdownAgent(content) {
4003
4015
  }
4004
4016
  return {
4005
4017
  frontMatter,
4006
- description: markdownContent.trim()
4018
+ body: markdownContent.trim()
4007
4019
  };
4008
4020
  }
4009
4021
  var OPTION_KEYS = [
@@ -4018,16 +4030,20 @@ var OPTION_KEYS = [
4018
4030
  ];
4019
4031
  function markdownAgentToComposeDefinition(parsed) {
4020
4032
  const frontMatter = replaceEnvVarsInObject(parsed.frontMatter);
4021
- const description = replaceEnvVars(parsed.description);
4033
+ const body = replaceEnvVars(parsed.body);
4022
4034
  const options = {};
4023
4035
  for (const key of OPTION_KEYS) {
4024
4036
  if (frontMatter[key] !== void 0) {
4025
4037
  options[key] = frontMatter[key];
4026
4038
  }
4027
4039
  }
4040
+ const hasDescription = frontMatter.description !== void 0 && frontMatter.description !== "";
4028
4041
  return {
4029
4042
  name: frontMatter.name,
4030
- description,
4043
+ description: hasDescription ? frontMatter.description : body,
4044
+ ...hasDescription && body ? {
4045
+ manual: body
4046
+ } : {},
4031
4047
  deps: frontMatter.deps,
4032
4048
  plugins: frontMatter.plugins,
4033
4049
  ...Object.keys(options).length > 0 ? {
@@ -4040,6 +4056,45 @@ async function loadMarkdownAgentFile(filePath) {
4040
4056
  const parsed = parseMarkdownAgent(content);
4041
4057
  return markdownAgentToComposeDefinition(parsed);
4042
4058
  }
4059
+ async function loadMarkdownAgentDirectory(dirPath, options = {}) {
4060
+ const { recursive = false } = options;
4061
+ const definitions = [];
4062
+ const errors = [];
4063
+ async function processDirectory(dir) {
4064
+ const entries = await readdir(dir, {
4065
+ withFileTypes: true
4066
+ });
4067
+ for (const entry of entries) {
4068
+ const fullPath = join(dir, entry.name);
4069
+ if (entry.isDirectory() && recursive) {
4070
+ await processDirectory(fullPath);
4071
+ } else if (entry.isFile() && isMarkdownFile(entry.name)) {
4072
+ try {
4073
+ const definition = await loadMarkdownAgentFile(fullPath);
4074
+ definitions.push(definition);
4075
+ } catch (error) {
4076
+ errors.push({
4077
+ path: fullPath,
4078
+ error: error instanceof Error ? error.message : String(error)
4079
+ });
4080
+ }
4081
+ }
4082
+ }
4083
+ }
4084
+ await processDirectory(dirPath);
4085
+ return {
4086
+ definitions,
4087
+ errors
4088
+ };
4089
+ }
4090
+ async function isDirectory(path) {
4091
+ try {
4092
+ const stats = await stat(path);
4093
+ return stats.isDirectory();
4094
+ } catch {
4095
+ return false;
4096
+ }
4097
+ }
4043
4098
 
4044
4099
  // __mcpc__plugin-markdown-loader_latest/node_modules/@mcpc/plugin-markdown-loader/mod.ts
4045
4100
  function markdownLoaderPlugin() {
@@ -4059,7 +4114,9 @@ var mod_default = defaultPlugin;
4059
4114
  export {
4060
4115
  createPlugin,
4061
4116
  mod_default as default,
4117
+ isDirectory,
4062
4118
  isMarkdownFile as isMarkdownAgentFile,
4119
+ loadMarkdownAgentDirectory,
4063
4120
  loadMarkdownAgentFile,
4064
4121
  markdownAgentToComposeDefinition,
4065
4122
  markdownLoaderPlugin,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcpc-tech/plugin-markdown-loader",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "homepage": "https://jsr.io/@mcpc/plugin-markdown-loader",
5
5
  "dependencies": {
6
6
  "@ai-sdk/provider": "^2.0.0",
package/types/mod.d.ts CHANGED
@@ -25,7 +25,7 @@
25
25
  * @module
26
26
  */ import { type ToolPlugin } from "@jsr/mcpc__core";
27
27
  export { setMarkdownAgentLoader } from "@jsr/mcpc__core";
28
- export { isMarkdownAgentFile, loadMarkdownAgentFile, type MarkdownAgentFrontMatter, markdownAgentToComposeDefinition, type ParsedMarkdownAgent, parseMarkdownAgent } from "./src/markdown-loader.js";
28
+ export { isDirectory, isMarkdownAgentFile, type LoadDirectoryResult, loadMarkdownAgentDirectory, loadMarkdownAgentFile, type MarkdownAgentFrontMatter, markdownAgentToComposeDefinition, type ParsedMarkdownAgent, parseMarkdownAgent } from "./src/markdown-loader.js";
29
29
  /**
30
30
  * Create a Markdown loader plugin for mcpc().
31
31
  *
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","sources":["../mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;CAyBC,GAED,SAAiC,KAAK,UAAU,0BAAiC;AAIjF,SAAS,sBAAsB,0BAAiC;AAEhE,SACE,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,wBAAwB,EAC7B,gCAAgC,EAChC,KAAK,mBAAmB,EACxB,kBAAkB,mCACc;AAElC;;;;;CAKC,GACD,OAAO,iBAAS,wBAAwB;AAWxC,qDAAqD,GACrD,OAAO,cAAM,kBAAoC;AAEjD,4DAA4D,GAC5D,cAAM,eAAe;AACrB,eAAe,cAAc"}
1
+ {"version":3,"file":"mod.d.ts","sources":["../mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;CAyBC,GAED,SAAiC,KAAK,UAAU,0BAAiC;AAIjF,SAAS,sBAAsB,0BAAiC;AAEhE,SACE,WAAW,EACX,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,0BAA0B,EAC1B,qBAAqB,EACrB,KAAK,wBAAwB,EAC7B,gCAAgC,EAChC,KAAK,mBAAmB,EACxB,kBAAkB,mCACc;AAElC;;;;;CAKC,GACD,OAAO,iBAAS,wBAAwB;AAWxC,qDAAqD,GACrD,OAAO,cAAM,kBAAoC;AAEjD,4DAA4D,GAC5D,cAAM,eAAe;AACrB,eAAe,cAAc"}
@@ -31,6 +31,11 @@ export { isMarkdownFile as isMarkdownAgentFile };
31
31
  * Front matter configuration for Markdown agent definitions
32
32
  */ export interface MarkdownAgentFrontMatter {
33
33
  /** Agent name (required) */ name: string;
34
+ /**
35
+ * Short description for progressive disclosure.
36
+ * If provided, the Markdown body becomes the `manual` field.
37
+ * If not provided, the Markdown body becomes the `description` field.
38
+ */ description?: string;
34
39
  /** Execution mode */ mode?: "agentic" | "ai_sampling" | "ai_acp" | "code_execution";
35
40
  /** Maximum execution steps */ maxSteps?: number;
36
41
  /** Maximum tokens for sampling */ maxTokens?: number;
@@ -71,7 +76,7 @@ export { isMarkdownFile as isMarkdownAgentFile };
71
76
  * Result of parsing a Markdown agent file
72
77
  */ export interface ParsedMarkdownAgent {
73
78
  frontMatter: MarkdownAgentFrontMatter;
74
- description: string;
79
+ /** The Markdown body content */ body: string;
75
80
  }
76
81
  /**
77
82
  * Parse YAML front matter and Markdown content from a string
@@ -82,4 +87,27 @@ export { isMarkdownFile as isMarkdownAgentFile };
82
87
  /**
83
88
  * Load a Markdown agent definition from a file path
84
89
  */ export declare function loadMarkdownAgentFile(filePath: string): Promise<ComposeDefinition>;
90
+ /**
91
+ * Result of loading agents from a directory
92
+ */ export interface LoadDirectoryResult {
93
+ /** Successfully loaded agent definitions */ definitions: ComposeDefinition[];
94
+ /** Errors encountered during loading (file path and error message) */ errors: Array<{
95
+ path: string;
96
+ error: string;
97
+ }>;
98
+ }
99
+ /**
100
+ * Load all Markdown agent definitions from a directory.
101
+ * Only loads .md files in the directory (non-recursive by default).
102
+ *
103
+ * @param dirPath - Path to the directory containing Markdown agent files
104
+ * @param options - Options for loading
105
+ * @param options.recursive - If true, recursively search subdirectories (default: false)
106
+ * @returns Object containing definitions and any errors encountered
107
+ */ export declare function loadMarkdownAgentDirectory(dirPath: string, options?: {
108
+ recursive?: boolean;
109
+ }): Promise<LoadDirectoryResult>;
110
+ /**
111
+ * Check if a path is a directory
112
+ */ export declare function isDirectory(path: string): Promise<boolean>;
85
113
  //# sourceMappingURL=markdown-loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-loader.d.ts","sources":["../../src/markdown-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GAED,SACE,KAAK,iBAAiB,EACtB,cAAc,EACd,KAAK,eAAe,EAEpB,KAAK,cAAc,0BACW;AAMhC,SAAyB,kBAAkB,mBAAmB,GAAG;AAgCjE;;CAEC,GACD,iBAAiB;EACf,0BAA0B,GAC1B,MAAM,MAAM;EACZ,mBAAmB,GACnB,OAAO,YAAY,gBAAgB,WAAW;EAC9C,4BAA4B,GAC5B,WAAW,MAAM;EACjB,gCAAgC,GAChC,YAAY,MAAM;EAClB,mBAAmB,GACnB,iBAAiB,OAAO;EACxB,4BAA4B,GAC5B;IACE,YAAY,OAAO,MAAM,EAAE;;EAE7B,sBAAsB,GACtB,UAAU,MAAM;EAChB,oBAAoB,GACpB,OAAO,MAAM;EACb,2BAA2B,GAC3B,iBAAiB;EACjB,8CAA8C,GAC9C;IACE;MACE,QAAQ;QAAQ,OAAO,MAAM;;MAC7B,eAAe,MAAM;MACrB,gBAAgB,MAAM;MACtB,uBAAuB,MAAM;;;EAGjC,qCAAqC,GACrC;IACE,SAAS,MAAM;IACf,OAAO,MAAM;IACb,MAAM,OAAO,MAAM,EAAE,MAAM;IAC3B;MACE,MAAM,MAAM;MACZ,aAAa;QACX,MAAM,MAAM;QACZ,SAAS,MAAM;QACf,OAAO,MAAM;QACb,MAAM,OAAO,MAAM,EAAE,MAAM;;;IAG/B,iBAAiB,OAAO;;;AAI5B;;CAEC,GACD,iBAAiB;EACf,aAAa;EACb,aAAa,MAAM;;AAGrB;;CAEC,GACD,OAAO,iBAAS,mBAAmB,SAAS,MAAM,GAAG;AA8CrD;;CAEC,GACD,OAAO,iBAAS,iCACd,QAAQ,mBAAmB,GAC1B;AAsBH;;CAEC,GACD,OAAO,iBAAe,sBACpB,UAAU,MAAM,GACf,QAAQ"}
1
+ {"version":3,"file":"markdown-loader.d.ts","sources":["../../src/markdown-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GAED,SACE,KAAK,iBAAiB,EACtB,cAAc,EACd,KAAK,eAAe,EAEpB,KAAK,cAAc,0BACW;AAOhC,SAAyB,kBAAkB,mBAAmB,GAAG;AAgCjE;;CAEC,GACD,iBAAiB;EACf,0BAA0B,GAC1B,MAAM,MAAM;EACZ;;;;GAIC,GACD,cAAc,MAAM;EACpB,mBAAmB,GACnB,OAAO,YAAY,gBAAgB,WAAW;EAC9C,4BAA4B,GAC5B,WAAW,MAAM;EACjB,gCAAgC,GAChC,YAAY,MAAM;EAClB,mBAAmB,GACnB,iBAAiB,OAAO;EACxB,4BAA4B,GAC5B;IACE,YAAY,OAAO,MAAM,EAAE;;EAE7B,sBAAsB,GACtB,UAAU,MAAM;EAChB,oBAAoB,GACpB,OAAO,MAAM;EACb,2BAA2B,GAC3B,iBAAiB;EACjB,8CAA8C,GAC9C;IACE;MACE,QAAQ;QAAQ,OAAO,MAAM;;MAC7B,eAAe,MAAM;MACrB,gBAAgB,MAAM;MACtB,uBAAuB,MAAM;;;EAGjC,qCAAqC,GACrC;IACE,SAAS,MAAM;IACf,OAAO,MAAM;IACb,MAAM,OAAO,MAAM,EAAE,MAAM;IAC3B;MACE,MAAM,MAAM;MACZ,aAAa;QACX,MAAM,MAAM;QACZ,SAAS,MAAM;QACf,OAAO,MAAM;QACb,MAAM,OAAO,MAAM,EAAE,MAAM;;;IAG/B,iBAAiB,OAAO;;;AAI5B;;CAEC,GACD,iBAAiB;EACf,aAAa;EACb,8BAA8B,GAC9B,MAAM,MAAM;;AAGd;;CAEC,GACD,OAAO,iBAAS,mBAAmB,SAAS,MAAM,GAAG;AA8CrD;;CAEC,GACD,OAAO,iBAAS,iCACd,QAAQ,mBAAmB,GAC1B;AA6BH;;CAEC,GACD,OAAO,iBAAe,sBACpB,UAAU,MAAM,GACf,QAAQ;AAMX;;CAEC,GACD,iBAAiB;EACf,0CAA0C,GAC1C,aAAa;EACb,oEAAoE,GACpE,QAAQ;IAAQ,MAAM,MAAM;IAAE,OAAO,MAAM;;;AAG7C;;;;;;;;CAQC,GACD,OAAO,iBAAe,2BACpB,SAAS,MAAM,EACf;EAAW,YAAY,OAAO;CAAO,GACpC,QAAQ;AAgCX;;CAEC,GACD,OAAO,iBAAe,YAAY,MAAM,MAAM,GAAG,QAAQ,OAAO"}