@mieweb/ui 0.11.0-dev.51 → 0.11.0-dev.52
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/{chunk-G56OUIGH.cjs → chunk-ARI25ZYT.cjs} +42 -11
- package/dist/chunk-ARI25ZYT.cjs.map +1 -0
- package/dist/{chunk-O3MN3TYS.js → chunk-NCC3VF6V.js} +42 -11
- package/dist/chunk-NCC3VF6V.js.map +1 -0
- package/dist/components/SuperChat/index.cjs +7 -7
- package/dist/components/SuperChat/index.d.cts +2 -2
- package/dist/components/SuperChat/index.d.ts +2 -2
- package/dist/components/SuperChat/index.js +1 -1
- package/dist/components/SuperChat/plugins/index.d.cts +2 -2
- package/dist/components/SuperChat/plugins/index.d.ts +2 -2
- package/dist/index.cjs +28 -28
- package/dist/index.d.cts +9 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +2 -2
- package/dist/{types-ByK_dbT7.d.cts → types-BFbvl6xU.d.cts} +6 -0
- package/dist/{types-ByK_dbT7.d.ts → types-BFbvl6xU.d.ts} +6 -0
- package/package.json +1 -1
- package/dist/chunk-G56OUIGH.cjs.map +0 -1
- package/dist/chunk-O3MN3TYS.js.map +0 -1
|
@@ -912,14 +912,15 @@ function MCPToolCallDisplay({
|
|
|
912
912
|
if (ms < 1e3) return `${ms}ms`;
|
|
913
913
|
return `${(ms / 1e3).toFixed(1)}s`;
|
|
914
914
|
};
|
|
915
|
-
const friendlyName = getToolFriendlyName(toolCall.toolName, toolCall.status);
|
|
915
|
+
const friendlyName = toolCall.displayName ? /* @__PURE__ */ jsxRuntime.jsx("bdi", { children: toolCall.displayName }) : getToolFriendlyName(toolCall.toolName, toolCall.status);
|
|
916
916
|
const durationLabel = formatDuration(toolCall.duration);
|
|
917
|
-
const paramSummary = getParameterSummary(
|
|
918
|
-
toolCall.toolName,
|
|
919
|
-
toolCall.parameters
|
|
920
|
-
);
|
|
917
|
+
const paramSummary = toolCall.displayName ? null : getParameterSummary(toolCall.toolName, toolCall.parameters);
|
|
921
918
|
const detailBit = toolCall.status === "success" ? durationLabel : paramSummary ?? durationLabel;
|
|
922
|
-
const pillLabel = detailBit ?
|
|
919
|
+
const pillLabel = detailBit ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
920
|
+
friendlyName,
|
|
921
|
+
" \xB7 ",
|
|
922
|
+
detailBit
|
|
923
|
+
] }) : friendlyName;
|
|
923
924
|
const hasParams = showParameters && toolCall.parameters.length > 0;
|
|
924
925
|
const hasBoxContent = Boolean(toolCall.result || toolCall.error || hasParams);
|
|
925
926
|
const isCompleted = toolCall.status === "success" || toolCall.status === "error";
|
|
@@ -1016,7 +1017,11 @@ var defaultMCPToolCallGroupLabels = {
|
|
|
1016
1017
|
denied: "Denied",
|
|
1017
1018
|
expired: "Expired"
|
|
1018
1019
|
},
|
|
1019
|
-
callLabel: (toolCall) =>
|
|
1020
|
+
callLabel: (toolCall) => {
|
|
1021
|
+
const name = toolCall.displayName || toolCall.toolName;
|
|
1022
|
+
return toolCall.serverName ? `Tool call: ${name} from ${toolCall.serverName}` : `Tool call: ${name}`;
|
|
1023
|
+
},
|
|
1024
|
+
toolId: "Tool ID",
|
|
1020
1025
|
showResult: "Show result",
|
|
1021
1026
|
showError: "Show error",
|
|
1022
1027
|
allowOnce: "Allow once",
|
|
@@ -1149,7 +1154,7 @@ function ToolCallRow({
|
|
|
1149
1154
|
const result = toolCall.result?.type === "error" ? null : formatResult(toolCall);
|
|
1150
1155
|
const errorText = formatError(toolCall);
|
|
1151
1156
|
const hasLinks = hasToolResultLinks(toolCall.result);
|
|
1152
|
-
const hasDetails = toolCall.parameters.length > 0 || Boolean(result) || hasLinks;
|
|
1157
|
+
const hasDetails = Boolean(toolCall.displayName) || toolCall.parameters.length > 0 || Boolean(result) || hasLinks;
|
|
1153
1158
|
const act = async (action) => {
|
|
1154
1159
|
setActing(true);
|
|
1155
1160
|
try {
|
|
@@ -1192,7 +1197,11 @@ function ToolCallRow({
|
|
|
1192
1197
|
}
|
|
1193
1198
|
),
|
|
1194
1199
|
toolCall.serverName && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 text-neutral-500 dark:text-neutral-400", children: toolCall.serverName }),
|
|
1195
|
-
|
|
1200
|
+
toolCall.displayName ? (
|
|
1201
|
+
// Host text may be in another script than the page; isolate it so
|
|
1202
|
+
// neutral characters such as a trailing "/" keep their place.
|
|
1203
|
+
/* @__PURE__ */ jsxRuntime.jsx("bdi", { className: "min-w-0 truncate", children: toolCall.displayName })
|
|
1204
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("code", { className: "min-w-0 truncate font-mono text-xs", children: toolCall.toolName }),
|
|
1196
1205
|
toolCall.status === "running" && /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(chunkXXVUHLQN_cjs.Spinner, { size: "xs" }) }),
|
|
1197
1206
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1198
1207
|
chunk7E46YDOT_cjs.Badge,
|
|
@@ -1214,6 +1223,28 @@ function ToolCallRow({
|
|
|
1214
1223
|
}
|
|
1215
1224
|
),
|
|
1216
1225
|
/* @__PURE__ */ jsxRuntime.jsxs(chunkVXW7D5LR_cjs.CollapsibleContent, { className: "ms-6 mt-1 space-y-2 pb-1", children: [
|
|
1226
|
+
toolCall.displayName && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1227
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1228
|
+
"p",
|
|
1229
|
+
{
|
|
1230
|
+
"data-slot": "ai-tool-call-display-name",
|
|
1231
|
+
className: "break-words",
|
|
1232
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("bdi", { children: toolCall.displayName })
|
|
1233
|
+
}
|
|
1234
|
+
),
|
|
1235
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
1236
|
+
"p",
|
|
1237
|
+
{
|
|
1238
|
+
"data-slot": "ai-tool-call-id",
|
|
1239
|
+
className: "text-xs break-words text-neutral-600 dark:text-neutral-400",
|
|
1240
|
+
children: [
|
|
1241
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: labels.toolId }),
|
|
1242
|
+
" ",
|
|
1243
|
+
/* @__PURE__ */ jsxRuntime.jsx("code", { className: "font-mono", children: toolCall.toolName })
|
|
1244
|
+
]
|
|
1245
|
+
}
|
|
1246
|
+
)
|
|
1247
|
+
] }),
|
|
1217
1248
|
toolCall.result && hasLinks && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1218
1249
|
ToolResultLinks,
|
|
1219
1250
|
{
|
|
@@ -1920,5 +1951,5 @@ exports.SpinnerIcon = SpinnerIcon;
|
|
|
1920
1951
|
exports.ToolStatusIcon = ToolStatusIcon;
|
|
1921
1952
|
exports.defaultMCPToolCallGroupLabels = defaultMCPToolCallGroupLabels;
|
|
1922
1953
|
exports.getToolIcon = getToolIcon;
|
|
1923
|
-
//# sourceMappingURL=chunk-
|
|
1924
|
-
//# sourceMappingURL=chunk-
|
|
1954
|
+
//# sourceMappingURL=chunk-ARI25ZYT.cjs.map
|
|
1955
|
+
//# sourceMappingURL=chunk-ARI25ZYT.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/AI/icons.tsx","../src/components/AI/CollapsiblePill.tsx","../src/components/AI/MCPToolCall.tsx","../src/components/AI/MCPToolCallGroup.tsx","../src/components/AI/AIMessage.tsx","../src/components/ChatComposer/JumpToBottomButton.tsx"],"names":["jsxs","cn","jsx","React","cva","Fragment","React2","Collapsible","CollapsibleTrigger","ChevronDown","CollapsibleContent","usePrefersReducedMotion","Animated","Wrench","Spinner","Badge","Button","AnimatedPresence","React3","AudioPlayer","ArrowDownIcon"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,IAAM,WAAA,GAAc;AAAA,EAClB,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAMO,SAAS,YAAA,CAAa,EAAE,SAAA,EAAW,IAAA,GAAO,MAAK,EAAsB;AAC1E,EAAA,uBACEA,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAWC,oBAAA,CAAG,WAAA,CAAY,IAAI,GAAG,SAAS,CAAA;AAAA,MAC1C,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,cAAA;AAAA,MAGL,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,GAAE,6PAAA,EAA8P,CAAA;AAAA,wBAEtQA,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,SAAA;AAAA,YACF,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,GAAA;AAAA,YACZ,aAAA,EAAc;AAAA;AAAA,SAChB;AAAA,wBACAA,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,UAAA;AAAA,YACF,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,GAAA;AAAA,YACZ,aAAA,EAAc;AAAA;AAAA;AAChB;AAAA;AAAA,GACF;AAEJ;AAgBO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,IAAA,GAAO,MAAK,EAAoB;AACtE,EAAA,uBACEF,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAWC,oBAAA,CAAG,WAAA,CAAY,IAAI,GAAG,SAAS,CAAA;AAAA,MAC1C,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MAEL,QAAA,EAAA;AAAA,wBAAAC,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,4BAAA;AAAA,YACF,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe,OAAA;AAAA,YACf,IAAA,EAAK,cAAA;AAAA,YACL,WAAA,EAAY;AAAA;AAAA,SACd;AAAA,wBACAA,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,mBAAA;AAAA,YACF,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe;AAAA;AAAA,SACjB;AAAA,wBACAA,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,mBAAA;AAAA,YACF,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA;AAAA,GACF;AAEJ;AAUO,SAAS,SAAA,CAAU,EAAE,SAAA,EAAU,EAAmB;AACvD,EAAA,uBACEA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAWD,oBAAA,CAAG,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,GAAA;AAAA,MAEZ,QAAA,kBAAAC,cAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,GACF;AAEJ;AAUO,SAAS,WAAA,CAAY,EAAE,SAAA,EAAU,EAAqB;AAC3D,EAAA,uBACEA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAWD,oBAAA,CAAG,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MAEZ,QAAA,kBAAAC,cAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,GACF;AAEJ;AAWA,IAAM,eAAA,GAAkB;AAAA,EACtB,EAAA,EAAI,aAAA;AAAA,EACJ,IAAA,EAAM,EAAA;AAAA,EACN,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAEO,SAAS,WAAA,CAAY;AAAA,EAC1B,SAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAqB;AACnB,EAAA,uBACEA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,WAAWD,oBAAA,CAAG,SAAA,EAAW,eAAA,CAAgB,SAAS,GAAG,SAAS,CAAA;AAAA,MAC9D,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,GAAA;AAAA,MAEZ,yCAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,gBAAA,EAAiB;AAAA;AAAA,GACxE;AAEJ;AAUO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAkB;AACrD,EAAA,uBACEC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAWD,oBAAA,CAAG,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAO,cAAA;AAAA,MAEP,QAAA,kBAAAC,cAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,WAAA,EAAa,CAAA;AAAA,UACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,GACF;AAEJ;AAUO,SAAS,WAAA,CAAY,EAAE,SAAA,EAAU,EAAqB;AAC3D,EAAA,uBACEF,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAWC,oBAAA,CAAG,sBAAA,EAAwB,SAAS,CAAA;AAAA,MAC/C,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAQ,WAAA;AAAA,MAER,QAAA,EAAA;AAAA,wBAAAC,cAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,YAAA;AAAA,YACV,EAAA,EAAG,IAAA;AAAA,YACH,EAAA,EAAG,IAAA;AAAA,YACH,CAAA,EAAE,IAAA;AAAA,YACF,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY;AAAA;AAAA,SACd;AAAA,wBACAA,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,YAAA;AAAA,YACV,IAAA,EAAK,cAAA;AAAA,YACL,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AAAA,GACF;AAEJ;AC3OO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA,GAAU,UAAA;AAAA,EACV,WAAA,GAAc,KAAA;AAAA,EACd,aAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,UAAA,GAAa,QAAQ,QAAQ,CAAA;AACnC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAUC,2BAAS,WAAW,CAAA;AACtD,EAAA,MAAM,YAAkBA,iBAAA,CAAA,KAAA,EAAM;AAE9B,EAAMA,4BAAU,MAAM;AACpB,IAAA,SAAA,CAAU,WAAW,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,SAAA,CAAU,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,EAC3B,CAAA;AAEA,EAAA,uBACEH,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,oBAAmB,SAAA,EAChC,QAAA,EAAA;AAAA,oBAAAA,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,aAAa,MAAA,GAAS,MAAA;AAAA,QAC/B,eAAA,EAAe,aAAa,MAAA,GAAS,MAAA;AAAA,QACrC,eAAA,EAAe,aAAa,SAAA,GAAY,MAAA;AAAA,QACxC,KAAA;AAAA,QACA,UAAU,CAAC,UAAA;AAAA,QACX,SAAA,EAAWC,oBAAA;AAAA,UACT,mKAAA;AAAA,UACA,OAAA,KAAY,cACR,uCAAA,GACA,2CAAA;AAAA,UACJ;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,WAAA;AAAA,0BACDC,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UACZ,8BACCA,cAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,SAAS,MAAA,GAAS,OAAA;AAAA,cAC7B,SAAA,EACE,OAAA,KAAY,WAAA,GACR,wBAAA,GACA;AAAA;AAAA;AAER;AAAA;AAAA,KAEJ;AAAA,IACC,8BACCA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,SAAA;AAAA,QACJ,eAAa,CAAC,MAAA;AAAA,QACd,KAAA,EAAO,CAAC,MAAA,IAAU,MAAA;AAAA,QAClB,SAAA,EAAWD,oBAAA;AAAA,UACT,0EAAA;AAAA,UACA,SACI,2CAAA,GACA;AAAA,SACN;AAAA,QAEA,QAAA,kBAAAC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAU,QAAA,EAAS;AAAA;AAAA;AACpC,GAAA,EAEJ,CAAA;AAEJ;AC/DA,IAAM,kBAAA,GAAqBE,0BAAA;AAAA,EACzB,uDAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,OAAA,EAAS,oCAAA;AAAA,QACT,mBAAA,EAAqB,mCAAA;AAAA,QACrB,OAAA,EAAS,uCAAA;AAAA,QACT,OAAA,EAAS,mCAAA;AAAA,QACT,KAAA,EAAO,+BAAA;AAAA,QACP,SAAA,EAAW,oCAAA;AAAA,QACX,MAAA,EAAQ,oCAAA;AAAA,QACR,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,MAAA,EAAQ;AAAA;AACV;AAEJ,CAAA;AAOA,SAAS,cAAA,CAAe,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAwB;AAClE,EAAA,uBACEJ,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,qBAAA;AAAA,MACV,WAAWC,oBAAA,CAAG,kBAAA,CAAmB,EAAE,MAAA,EAAQ,GAAG,SAAS,CAAA;AAAA,MAEtD,QAAA,EAAA;AAAA,QAAA,MAAA,KAAW,6BACVC,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,MAAA;AAAA,YACZ,SAAA,EAAU,0BAAA;AAAA,YACV,IAAA,EAAK,cAAA;AAAA,YACL,OAAA,EAAQ,WAAA;AAAA,YAER,QAAA,kBAAAA,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI;AAAA;AAAA,SAChC;AAAA,QAED,MAAA,KAAW,uCACVA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,MAAA;AAAA,YACZ,SAAA,EAAU,4CAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,OAAA,EAAQ,WAAA;AAAA,YACR,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,GAAA;AAAA,YAEZ,QAAA,kBAAAA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,SACF;AAAA,QAED,MAAA,KAAW,6BACVF,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,MAAA;AAAA,YACZ,SAAA,EAAU,6DAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,OAAA,EAAQ,WAAA;AAAA,YAER,QAAA,EAAA;AAAA,8BAAAE,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,YAAA;AAAA,kBACV,EAAA,EAAG,IAAA;AAAA,kBACH,EAAA,EAAG,IAAA;AAAA,kBACH,CAAA,EAAE,IAAA;AAAA,kBACF,MAAA,EAAO,cAAA;AAAA,kBACP,WAAA,EAAY;AAAA;AAAA,eACd;AAAA,8BACAA,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,YAAA;AAAA,kBACV,IAAA,EAAK,cAAA;AAAA,kBACL,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AAAA,SACF;AAAA,QAED,MAAA,KAAW,6BACVA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,MAAA;AAAA,YACZ,SAAA,EAAU,4CAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,OAAA,EAAQ,WAAA;AAAA,YACR,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,GAAA;AAAA,YAEZ,QAAA,kBAAAA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,SACF;AAAA,QAED,MAAA,KAAW,2BACVA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,MAAA;AAAA,YACZ,SAAA,EAAU,wCAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,OAAA,EAAQ,WAAA;AAAA,YACR,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,GAAA;AAAA,YAEZ,QAAA,kBAAAA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,SACF;AAAA,QAAA,CAEA,WAAW,WAAA,IACX,MAAA,KAAW,QAAA,IACX,MAAA,KAAW,8BACXA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,MAAA;AAAA,YACZ,SAAA,EAAU,0BAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,OAAA,EAAQ,WAAA;AAAA,YACR,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,GAAA;AAAA,YAEZ,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,UAAA,EAAW;AAAA;AAAA;AAClE;AAAA;AAAA,GAEJ;AAEJ;AAMA,IAAM,UAAA,GAA8C;AAAA;AAAA,EAElD,gCACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAU,SAAA;AAAA,MACV,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MAEZ,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,GACF;AAAA,EAEF,6BACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAU,SAAA;AAAA,MACV,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MAEZ,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,GACF;AAAA,EAEF,iCACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAU,SAAA;AAAA,MACV,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MAEZ,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,GACF;AAAA;AAAA,EAGF,sCACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAU,SAAA;AAAA,MACV,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MAEZ,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,GACF;AAAA;AAAA,EAGF,iCACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAU,SAAA;AAAA,MACV,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MAEZ,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,GACF;AAAA;AAAA,EAGF,kCACEF,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAU,SAAA;AAAA,MACV,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MAEZ,QAAA,EAAA;AAAA,wBAAAE,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe,OAAA;AAAA,YACf,CAAA,EAAE;AAAA;AAAA,SACJ;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe,OAAA;AAAA,YACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AAAA,GACF;AAAA;AAAA,EAGF,yBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAU,SAAA;AAAA,MACV,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MAEZ,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AAGN,CAAA;AAEA,SAAS,YAAY,QAAA,EAAmC;AACtD,EAAA,OAAO,UAAA,CAAW,QAAQ,CAAA,IAAK,UAAA,CAAW,OAAA;AAC5C;AAYO,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,OAAA,EAAS,WAAU,EAAsB;AAC5E,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAwB;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAA,GAAiD;AAAA,IACrD,yBACEA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,MAAA;AAAA,QACZ,SAAA,EAAU,SAAA;AAAA,QACV,IAAA,EAAK,MAAA;AAAA,QACL,OAAA,EAAQ,WAAA;AAAA,QACR,MAAA,EAAO,cAAA;AAAA,QACP,WAAA,EAAY,KAAA;AAAA,QAEZ,QAAA,kBAAAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe,OAAA;AAAA,YACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,KACF;AAAA,IAEF,0BACEA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,MAAA;AAAA,QACZ,SAAA,EAAU,SAAA;AAAA,QACV,IAAA,EAAK,MAAA;AAAA,QACL,OAAA,EAAQ,WAAA;AAAA,QACR,MAAA,EAAO,cAAA;AAAA,QACP,WAAA,EAAY,KAAA;AAAA,QAEZ,QAAA,kBAAAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe,OAAA;AAAA,YACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,KACF;AAAA,IAEF,6BACEA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,MAAA;AAAA,QACZ,SAAA,EAAU,SAAA;AAAA,QACV,IAAA,EAAK,MAAA;AAAA,QACL,OAAA,EAAQ,WAAA;AAAA,QACR,MAAA,EAAO,cAAA;AAAA,QACP,WAAA,EAAY,KAAA;AAAA,QAEZ,QAAA,kBAAAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe,OAAA;AAAA,YACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,KACF;AAAA,IAEF,uBACEA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,MAAA;AAAA,QACZ,SAAA,EAAU,SAAA;AAAA,QACV,IAAA,EAAK,MAAA;AAAA,QACL,OAAA,EAAQ,WAAA;AAAA,QACR,MAAA,EAAO,cAAA;AAAA,QACP,WAAA,EAAY,KAAA;AAAA,QAEZ,QAAA,kBAAAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe,OAAA;AAAA,YACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,KACF;AAAA,IAEF,0BACEF,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,MAAA;AAAA,QACZ,SAAA,EAAU,SAAA;AAAA,QACV,IAAA,EAAK,MAAA;AAAA,QACL,OAAA,EAAQ,WAAA;AAAA,QACR,MAAA,EAAO,cAAA;AAAA,QACP,WAAA,EAAY,KAAA;AAAA,QAEZ,QAAA,EAAA;AAAA,0BAAAE,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAc,OAAA;AAAA,cACd,cAAA,EAAe,OAAA;AAAA,cACf,CAAA,EAAE;AAAA;AAAA,WACJ;AAAA,0BACAA,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAc,OAAA;AAAA,cACd,cAAA,EAAe,OAAA;AAAA,cACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AAAA,KACF;AAAA,IAEF,0BACEA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,MAAA;AAAA,QACZ,SAAA,EAAU,SAAA;AAAA,QACV,IAAA,EAAK,MAAA;AAAA,QACL,OAAA,EAAQ,WAAA;AAAA,QACR,MAAA,EAAO,cAAA;AAAA,QACP,WAAA,EAAY,KAAA;AAAA,QAEZ,QAAA,kBAAAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe,OAAA;AAAA,YACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,KACF;AAAA,IAEF,0BACEA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,MAAA;AAAA,QACZ,SAAA,EAAU,SAAA;AAAA,QACV,IAAA,EAAK,MAAA;AAAA,QACL,OAAA,EAAQ,WAAA;AAAA,QACR,MAAA,EAAO,cAAA;AAAA,QACP,WAAA,EAAY,KAAA;AAAA,QAEZ,QAAA,kBAAAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe,OAAA;AAAA,YACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AACF,GAEJ;AAEA,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA,GAAO,cAAc,IAAA,CAAK,IAAI,IAAI,aAAA,CAAc,QAAA;AAElE,EAAA,uBACEF,eAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAA,EAAS,WAAA;AAAA,MACT,SAAA,EAAWC,oBAAA;AAAA,QACT,2DAAA;AAAA,QACA,qDAAA;AAAA,QACA,2EAAA;AAAA,QACA,uCAAA;AAAA,QACA,4EAAA;AAAA,QACA,oCAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,wBACDC,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,QACjB,IAAA,CAAK,IAAA,KAAS,UAAA,oBACbA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,MAAA;AAAA,YACZ,SAAA,EAAU,oBAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,OAAA,EAAQ,WAAA;AAAA,YACR,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,GAAA;AAAA,YAEZ,QAAA,kBAAAA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AACF;AAAA;AAAA,GAEJ;AAEJ;AAYA,SAAS,iBAAA,CAAkB;AAAA,EACzB,MAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAC3B,IAAA,uBACEA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWD,oBAAA;AAAA,UACT,kDAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEA,QAAA,kBAAAC,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAA,EACV,QAAA,EAAA,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GACpB,MAAA,CAAO,MAAA,CAAO,IAAI,IAClB,mBAAA,EACN;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,uBACEF,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAWC,oBAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EACtC,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,2BACNC,cAAAA,CAAC,OAAE,SAAA,EAAU,gDAAA,EACV,iBAAO,OAAA,EACV,CAAA;AAAA,oBAGFA,cAAAA,CAAC,eAAA,EAAA,EAAgB,MAAA,EAAgB,WAAA,EAA0B;AAAA,GAAA,EAC7D,CAAA;AAEJ;AAGO,SAAS,mBAAmB,MAAA,EAA4C;AAC7E,EAAA,OAAO,OAAA,CAAQ,MAAA,EAAQ,IAAA,IAAQ,MAAA,EAAQ,WAAW,MAAM,CAAA;AAC1D;AAQO,SAAS,eAAA,CAAgB,EAAE,MAAA,EAAQ,WAAA,EAAY,EAAyB;AAC7E,EAAA,uBACEF,gBAAAK,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,IAAA,oBAAQH,cAAAA,CAAC,YAAA,EAAA,EAAa,MAAM,MAAA,CAAO,IAAA,EAAM,SAAS,WAAA,EAAa,CAAA;AAAA,IAEtE,OAAO,SAAA,IAAa,MAAA,CAAO,SAAA,CAAU,MAAA,GAAS,qBAC7CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBACZ,QAAA,EAAA,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,CAAC,6BACrBA,cAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAM;AAAA,UACJ,IAAA,EAAM,SAAS,GAAA,IAAO,GAAA;AAAA,UACtB,OAAO,QAAA,CAAS,IAAA;AAAA,UAChB,MAAM,QAAA,CAAS;AAAA,SACjB;AAAA,QACA,OAAA,EAAS;AAAA,OAAA;AAAA,MANJ,QAAA,CAAS;AAAA,KAQjB,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAOA,IAAM,mBAAA,GAA8C;AAAA,EAClD,cAAA,EAAgB,kBAAA;AAAA,EAChB,WAAA,EAAa,oBAAA;AAAA,EACb,eAAA,EAAiB,oBAAA;AAAA,EACjB,cAAA,EAAgB,kBAAA;AAAA,EAChB,cAAA,EAAgB,kBAAA;AAAA,EAChB,oBAAA,EAAsB,wBAAA;AAAA,EACtB,kBAAA,EAAoB,uBAAA;AAAA,EACpB,kBAAA,EAAoB,sBAAA;AAAA,EACpB,eAAA,EAAiB,mBAAA;AAAA,EACjB,eAAA,EAAiB,oBAAA;AAAA,EACjB,YAAA,EAAc,qBAAA;AAAA,EACd,gBAAA,EAAkB,qBAAA;AAAA,EAClB,YAAA,EAAc,gBAAA;AAAA,EACd,YAAA,EAAc,iBAAA;AAAA,EACd,MAAA,EAAQ,WAAA;AAAA,EACR,gBAAA,EAAkB;AACpB,CAAA;AAEA,SAAS,mBAAA,CAAoB,UAAkB,MAAA,EAA+B;AAC5E,EAAA,MAAM,WAAW,mBAAA,CAAoB,QAAQ,KAAK,QAAA,CAAS,OAAA,CAAQ,MAAM,GAAG,CAAA;AAG5E,EAAA,IAAI,WAAW,SAAA,EAAW;AAGxB,IAAA,IAAI,QAAA,CAAS,WAAW,UAAU,CAAA;AAChC,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,SAAS,CAAA;AAC/C,IAAA,IAAI,QAAA,CAAS,WAAW,YAAY,CAAA;AAClC,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,YAAA,EAAc,WAAW,CAAA;AACnD,IAAA,IAAI,QAAA,CAAS,WAAW,eAAe,CAAA;AACrC,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,eAAA,EAAiB,OAAO,CAAA;AAClD,IAAA,IAAI,QAAA,CAAS,WAAW,WAAW,CAAA;AACjC,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,OAAO,CAAA;AAC9C,IAAA,IAAI,QAAA,CAAS,WAAW,SAAS,CAAA;AAC/B,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA;AAC5C,IAAA,IAAI,QAAA,CAAS,WAAW,UAAU,CAAA;AAChC,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,SAAS,CAAA;AAC/C,IAAA,IAAI,QAAA,CAAS,WAAW,UAAU,CAAA;AAChC,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,SAAS,CAAA;AAC/C,IAAA,IAAI,QAAA,CAAS,WAAW,WAAW,CAAA;AACjC,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,UAAU,CAAA;AACjD,IAAA,IAAI,QAAA,CAAS,WAAW,YAAY,CAAA;AAClC,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,YAAA,EAAc,WAAW,CAAA;AACnD,IAAA,IAAI,QAAA,CAAS,WAAW,WAAW,CAAA;AACjC,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,UAAU,CAAA;AACjD,IAAA,IAAI,QAAA,CAAS,WAAW,SAAS,CAAA;AAC/B,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAW,MAAM,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO,QAAA;AACT;AAGA,SAAS,mBAAA,CACP,UACA,MAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAGxE,EAAA,IACE,QAAA,KAAa,gBAAA,IACb,QAAA,CAAS,SAAA,IACT,SAAS,QAAA,EACT;AACA,IAAA,OAAO,CAAA,EAAG,QAAA,CAAS,SAAS,CAAA,CAAA,EAAI,SAAS,QAAQ,CAAA,CAAA;AAAA,EACnD;AAGA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,IAAK,SAAS,KAAA,EAAO;AACjD,IAAA,OAAO,CAAA,CAAA,EAAI,SAAS,KAAK,CAAA,CAAA,CAAA;AAAA,EAC3B;AAGA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,aAAa,CAAA,IAAK,SAAS,WAAA,EAAa;AAC5D,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,IAAiB,QAAA,CAAS,IAAA;AAChD,IAAA,OAAO,IAAA,GACH,GAAG,QAAA,CAAS,WAAW,OAAO,IAAI,CAAA,CAAA,GAClC,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA;AAAA,EACjC;AAGA,EAAA,IAAI,QAAA,KAAa,kBAAA,IAAsB,QAAA,CAAS,OAAA,EAAS;AACvD,IAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,IAAA,OAAO,OAAA,GACH,GAAG,OAAO,CAAA,MAAA,EAAS,SAAS,OAAO,CAAA,CAAA,GACnC,CAAA,KAAA,EAAQ,QAAA,CAAS,OAAO,CAAA,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,IAAA;AACT;AAGA,IAAM,iBAAA,GAAmD;AAAA,EACvD,OAAA,EACE,sHAAA;AAAA,EACF,mBAAA,EACE,4GAAA;AAAA,EACF,OAAA,EACE,wHAAA;AAAA,EACF,OAAA,EACE,4GAAA;AAAA,EACF,KAAA,EACE,gGAAA;AAAA,EACF,SAAA,EACE,iIAAA;AAAA,EACF,MAAA,EACE,iIAAA;AAAA,EACF,OAAA,EACE;AACJ,CAAA;AAyBO,SAAS,kBAAA,CAAmB;AAAA,EACjC,QAAA;AAAA,EACA,cAAA,GAAiB,IAAA;AAAA,EACjB,WAAA,GAAc,IAAA;AAAA,EACd,gBAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,WAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,cAAA,GAAiB,CAAC,EAAA,KAAgB;AACtC,IAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,IAAA,IAAI,EAAA,GAAK,GAAA,EAAM,OAAO,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AAC3B,IAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,EAClC,CAAA;AAIA,EAAA,MAAM,YAAA,GAAgC,QAAA,CAAS,WAAA,mBAC7CA,cAAAA,CAAC,KAAA,EAAA,EAAK,QAAA,EAAA,QAAA,CAAS,WAAA,EAAY,CAAA,GAE3B,mBAAA,CAAoB,QAAA,CAAS,QAAA,EAAU,SAAS,MAAM,CAAA;AAExD,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,QAAA,CAAS,QAAQ,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAe,SAAS,WAAA,GAC1B,IAAA,GACA,oBAAoB,QAAA,CAAS,QAAA,EAAU,SAAS,UAAU,CAAA;AAK9D,EAAA,MAAM,SAAA,GACJ,QAAA,CAAS,MAAA,KAAW,SAAA,GAChB,gBACC,YAAA,IAAgB,aAAA;AACvB,EAAA,MAAM,SAAA,GAAY,SAAA,mBAChBF,eAAAA,CAAAK,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,YAAA;AAAA,IAAa,QAAA;AAAA,IAAI;AAAA,GAAA,EACpB,CAAA,GAEA,YAAA;AAGF,EAAA,MAAM,SAAA,GAAY,cAAA,IAAkB,QAAA,CAAS,UAAA,CAAW,MAAA,GAAS,CAAA;AACjE,EAAA,MAAM,gBAAgB,OAAA,CAAQ,QAAA,CAAS,MAAA,IAAU,QAAA,CAAS,SAAS,SAAS,CAAA;AAC5E,EAAA,MAAM,WAAA,GACJ,QAAA,CAAS,MAAA,KAAW,SAAA,IAAa,SAAS,MAAA,KAAW,OAAA;AACvD,EAAA,MAAM,yBAAA,GAA4B,oBAAoB,CAAC,WAAA;AAEvD,EAAA,IAAI,QAAQ,OAAO,IAAA;AAGnB,EAAA,MAAM,sBACJL,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWC,oBAAA;AAAA,QACT,6HAAA;AAAA,QACA,UAAU,KAAA,GAAQ;AAAA,OACpB;AAAA,MAGC,QAAA,EAAA;AAAA,QAAA,QAAA,CAAS,0BACRC,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,kBACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,iBAAA;AAAA,UAAA;AAAA,YACC,QAAQ,QAAA,CAAS,MAAA;AAAA,YACjB;AAAA;AAAA,SACF,EACF,CAAA;AAAA,QAID,QAAA,CAAS,KAAA,oBACRA,cAAAA,CAAC,SAAI,SAAA,EAAU,8CAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAA,EACV,QAAA,EAAA,QAAA,CAAS,OACZ,CAAA,EACF,CAAA;AAAA,QAID,6BACCF,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAU,oBAAA;AAAA,YACV,SAAA,EAAU,mDAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAE,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2FAAA,EAA4F,QAAA,EAAA,YAAA,EAE1G,CAAA;AAAA,8BACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eACZ,QAAA,EAAA,QAAA,CAAS,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,qBACxBF,eAAAA,CAAC,KAAA,EAAA,EAAqB,WAAU,gCAAA,EAC9B,QAAA,EAAA;AAAA,gCAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kDAAA,EACb,QAAA,EAAA;AAAA,kBAAA,KAAA,CAAM,IAAA;AAAA,kBAAK;AAAA,iBAAA,EACd,CAAA;AAAA,gCACAE,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oDACb,QAAA,EAAA,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,GACpB,MAAM,KAAA,GACN,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA,EAChC;AAAA,eAAA,EAAA,EARQ,KAAA,CAAM,IAShB,CACD,CAAA,EACH;AAAA;AAAA;AAAA;AACF;AAAA;AAAA,GAEJ;AAGF,EAAA,MAAM,6BACJF,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAWC,oBAAA;AAAA,QACT,qDAAA;AAAA,QACA,UACI,uCAAA,GACA,2CAAA;AAAA,QACJ,iBAAA,CAAkB,SAAS,MAAM;AAAA,OACnC;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAAC,cAAA,EAAA,EAAe,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ,CAAA;AAAA,wBACzCA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,SAAA,EAAU;AAAA;AAAA;AAAA,GACnB;AAGF,EAAA,uBACEA,eAAC,KAAA,EAAA,EAAI,WAAA,EAAU,gBAAe,SAAA,EAC3B,QAAA,EAAA,CAAC,gBACA,UAAA,GACE,WAAA;AAAA;AAAA,oBAEFA,cAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,SAAA;AAAA,QACP,6BAAaA,cAAAA,CAAC,cAAA,EAAA,EAAe,MAAA,EAAQ,SAAS,MAAA,EAAQ,CAAA;AAAA,QACtD,OAAA,EAAS,UAAU,WAAA,GAAc,UAAA;AAAA,QACjC,aAAa,CAAC,yBAAA;AAAA,QACd,aAAA,EAAe,iBAAA,CAAkB,QAAA,CAAS,MAAM,CAAA;AAAA,QAChD,KAAA,EAAM,gBAAA;AAAA,QAEL,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,oBAGAF,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA;AAAA,MAAA,UAAA;AAAA,MACA;AAAA,KAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACvvBA,IAAM,SAAS,CAAC,KAAA,EAAe,KAAa,KAAA,KAC1C,KAAA,KAAU,IAAI,GAAA,GAAM,KAAA;AAEf,IAAM,6BAAA,GAAwD;AAAA,EACnE,IAAA,EAAM,CAAC,KAAA,KAAU,CAAA,KAAA,EAAQ,KAAK,IAAI,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAC,CAAA,CAAA;AAAA,EAChE,OAAA,EAAS,CAAC,KAAA,KAAU,CAAA,QAAA,EAAW,KAAK,IAAI,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAC,CAAA,CAAA;AAAA,EACtE,aAAA,EAAe,CAAC,KAAA,KACd,CAAA,EAAG,KAAK,IAAI,MAAA,CAAO,KAAA,EAAO,OAAA,EAAS,MAAM,CAAC,CAAA,SAAA,CAAA;AAAA,EAC5C,MAAA,EAAQ,CAAC,KAAA,KAAU,CAAA,EAAG,KAAK,CAAA,OAAA,CAAA;AAAA,EAC3B,gBAAA,EAAkB,CAAC,KAAA,KACjB,CAAA,EAAG,KAAK,SAAS,MAAA,CAAO,KAAA,EAAO,YAAA,EAAc,YAAY,CAAC,CAAA,cAAA,CAAA;AAAA,EAC5D,cAAA,EAAgB,CAAC,KAAA,KACf,CAAA,EAAG,KAAK,SAAS,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAC,CAAA,OAAA,CAAA;AAAA,EACjD,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,mBAAA,EAAqB,gBAAA;AAAA,IACrB,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,MAAA;AAAA,IACT,KAAA,EAAO,QAAA;AAAA,IACP,SAAA,EAAW,WAAA;AAAA,IACX,MAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,QAAA,KAAa;AACvB,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,WAAA,IAAe,QAAA,CAAS,QAAA;AAC9C,IAAA,OAAO,QAAA,CAAS,aACZ,CAAA,WAAA,EAAc,IAAI,SAAS,QAAA,CAAS,UAAU,CAAA,CAAA,GAC9C,CAAA,WAAA,EAAc,IAAI,CAAA,CAAA;AAAA,EACxB,CAAA;AAAA,EACA,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,aAAA;AAAA,EACZ,SAAA,EAAW,YAAA;AAAA,EACX,SAAA,EAAW,YAAA;AAAA,EACX,WAAA,EAAa,cAAA;AAAA,EACb,IAAA,EAAM;AACR;AAEA,SAAS,cACP,SAAA,EACwB;AACxB,EAAA,IAAI,CAAC,WAAW,OAAO,6BAAA;AACvB,EAAA,OAAO;AAAA,IACL,GAAG,6BAAA;AAAA,IACH,GAAG,SAAA;AAAA,IACH,QAAQ,EAAE,GAAG,8BAA8B,MAAA,EAAQ,GAAG,UAAU,MAAA;AAAO,GACzE;AACF;AAOA,SAAS,eAAe,QAAA,EAAgC;AACtD,EAAA,OAAO,QAAA,CAAS,MAAA,KAAW,mBAAA,IAAuB,QAAA,CAAS,MAAA,KAAW,OAAA;AACxE;AAcA,SAAS,UAAU,SAAA,EAA4C;AAC7D,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,IAAI,SAAS,MAAA,KAAW,mBAAA,EAAqB,WAAA,CAAY,IAAA,CAAK,SAAS,EAAE,CAAA;AAAA,SAAA,IAChE,QAAA,CAAS,MAAA,KAAW,OAAA,EAAS,MAAA,IAAU,CAAA;AAAA,SAAA,IACvC,QAAA,CAAS,MAAA,KAAW,SAAA,IAAa,QAAA,CAAS,MAAA,KAAW,SAAA;AAC5D,MAAA,QAAA,IAAY,CAAA;AAAA,EAChB;AACA,EAAA,OAAO;AAAA,IACL,OAAO,SAAA,CAAU,MAAA;AAAA,IACjB,kBAAkB,WAAA,CAAY,MAAA;AAAA,IAC9B,MAAA;AAAA,IACA,QAAA,EAAU,WAAA,CAAY,MAAA,GAAS,QAAA,GAAW,CAAA;AAAA,IAC1C,SAAA,EAAW,SAAA,CAAU,GAAA,CAAI,CAAC,SAAS,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,IACxE,WAAA,EAAa,WAAA,CAAY,IAAA,CAAK,GAAG;AAAA,GACnC;AACF;AAeA,SAAS,eAAA,CACP,QAAA,EACA,SAAA,EACA,KAAA,EACwC;AACxC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUM,2BAAS,OAAO;AAAA,IAC9C,SAAA;AAAA,IACA,QAAA,EAAU,QAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ,CAAE,CAAA;AAEF,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,IAAI,KAAA,CAAM,cAAc,SAAA,EAAW;AACjC,IAAA,MAAM,QAAA,GAAW,YAAY,KAAA,KAAU,MAAA;AACvC,IAAA,IAAA,GAAO,EAAE,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,aAAa,QAAA,EAAS;AAAA,EAChE,CAAA,MAAA,IAAW,KAAA,CAAM,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC3C,IAAA,IAAA,GAAO,EAAE,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,UAAU,KAAA,EAAM;AAAA,EAC1D;AACA,EAAA,IAAI,IAAA,KAAS,KAAA,EAAO,QAAA,CAAS,IAAI,CAAA;AAEjC,EAAA,MAAM,WAAA,GAAoBA,iBAAA,CAAA,WAAA;AAAA,IACxB,CAAC,QAAA,KACC,QAAA,CAAS,CAAC,OAAA,MAAa,EAAE,GAAG,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,KAAA,EAAM,CAAE,CAAA;AAAA,IACnE;AAAC,GACH;AACA,EAAA,OAAO,CAAC,IAAA,CAAK,QAAA,EAAU,WAAW,CAAA;AACpC;AAEA,SAAS,oBAAA,CACP,SACA,MAAA,EACQ;AACR,EAAA,IAAI,OAAA,CAAQ,mBAAmB,CAAA,EAAG;AAChC,IAAA,OAAO,MAAA,CAAO,gBAAA,CAAiB,OAAA,CAAQ,gBAAgB,CAAA;AAAA,EACzD;AACA,EAAA,IAAI,QAAQ,QAAA,EAAU,OAAO,MAAA,CAAO,OAAA,CAAQ,QAAQ,KAAK,CAAA;AACzD,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AAClC;AAMA,IAAM,oBAAA,GAGF;AAAA,EACF,OAAA,EAAS,WAAA;AAAA,EACT,mBAAA,EAAqB,SAAA;AAAA,EACrB,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,QAAA;AAAA,EACP,SAAA,EAAW,WAAA;AAAA,EACX,MAAA,EAAQ,WAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAEA,SAAS,iBAAiB,QAAA,EAA+B;AACvD,EAAA,OAAO,IAAA,CAAK,SAAA;AAAA,IACV,MAAA,CAAO,WAAA,CAAY,QAAA,CAAS,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAAA,IACpE,IAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,WAAW,IAAA,EAAuB;AACzC,EAAA,OAAO,OAAO,SAAS,QAAA,GAAW,IAAA,GAAO,KAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAC,CAAA;AACvE;AAEA,SAAS,aAAa,QAAA,EAAsC;AAC1D,EAAA,MAAM,EAAE,QAAO,GAAI,QAAA;AACnB,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,OAAO,MAAA,CAAO,OAAA,IAAW,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AACjD;AAGA,SAAS,YAAY,QAAA,EAAsC;AACzD,EAAA,IAAI,QAAA,CAAS,KAAA,EAAO,OAAO,QAAA,CAAS,KAAA;AACpC,EAAA,MAAM,EAAE,QAAO,GAAI,QAAA;AACnB,EAAA,IAAI,MAAA,EAAQ,IAAA,KAAS,OAAA,EAAS,OAAO,IAAA;AACrC,EAAA,IAAI,MAAA,CAAO,QAAQ,IAAA,IAAQ,MAAA,CAAO,SAAS,EAAA,EAAI,OAAO,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AAC5E,EAAA,OAAO,OAAO,OAAA,IAAW,IAAA;AAC3B;AAGA,SAAS,gBAAA,CAAiB,EAAE,KAAA,EAAO,IAAA,EAAK,EAAoC;AAC1E,EAAA,uBACEN,gBAACO,6BAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAP,eAAAA,CAACQ,oCAAA,EAAA,EAAmB,SAAA,EAAU,uIAAA,EAC5B,QAAA,EAAA;AAAA,sBAAAN,cAAAA;AAAA,QAACO,uBAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAY,MAAA;AAAA,UACZ,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,MACC;AAAA,KAAA,EACH,CAAA;AAAA,oBACAP,cAAAA,CAACQ,oCAAA,EAAA,EAAmB,SAAA,EAAU,QAC5B,QAAA,kBAAAR,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAI,MAAA;AAAA,QACJ,SAAA,EAAU,mGAAA;AAAA,QAET,QAAA,EAAA;AAAA;AAAA,KACH,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAkBA,SAAS,WAAA,CAAY;AAAA,EACnB,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAqB;AAGnB,EAAA,MAAM,uBAAuBS,yCAAA,EAAwB;AACrD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAUL,2BAAS,KAAK,CAAA;AAChD,EAAA,MAAM,UAAA,GAAmBA,yBAA0B,IAAI,CAAA;AACvD,EAAA,MAAM,iBAAA,GAA0BA,yBAAO,KAAK,CAAA;AAC5C,EAAA,MAAM,kBAAA,GAAqB,SAAS,MAAA,KAAW,mBAAA;AAE/C,EAAA,MAAM,SACJ,QAAA,CAAS,MAAA,EAAQ,SAAS,OAAA,GAAU,IAAA,GAAO,aAAa,QAAQ,CAAA;AAClE,EAAA,MAAM,SAAA,GAAY,YAAY,QAAQ,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,QAAA,CAAS,MAAM,CAAA;AACnD,EAAA,MAAM,UAAA,GACJ,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,IAC5B,QAAA,CAAS,UAAA,CAAW,MAAA,GAAS,CAAA,IAC7B,OAAA,CAAQ,MAAM,CAAA,IACd,QAAA;AAEF,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,KAAuC;AACxD,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,EAAO;AAAA,IACf,CAAA,CAAA,MAAQ;AAAA,IAER,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAKA,EAAMA,kCAAgB,MAAM;AAC1B,IAAA,IAAI,kBAAA,IAAsB,CAAC,iBAAA,CAAkB,OAAA,EAAS;AACtD,IAAA,iBAAA,CAAkB,OAAA,GAAU,KAAA;AAC5B,IAAA,IAAI,CAAC,QAAA,CAAS,aAAA,IAAiB,QAAA,CAAS,aAAA,KAAkB,SAAS,IAAA,EAAM;AACvE,MAAA,UAAA,CAAW,SAAS,KAAA,EAAM;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAEvB,EAAA,uBACEJ,cAAAA;AAAA,IAACU,0BAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAK,UAAA;AAAA,MACL,SAAS,CAAC,oBAAA;AAAA,MACV,IAAA,EAAK,UAAA;AAAA,MACL,WAAA,EAAU,kBAAA;AAAA,MAEV,SAAA,EAAU,yBAAA;AAAA,MAEV,QAAA,kBAAAZ,gBAAC,KAAA,EAAA,EAAI,IAAA,EAAK,SAAQ,YAAA,EAAY,MAAA,CAAO,SAAA,CAAU,QAAQ,CAAA,EACrD,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAACO,6BAAA,EAAA,EAAY,WAAA,EAAa,kBAAA,IAAsB,UAAA,EAC9C,QAAA,EAAA;AAAA,0BAAAP,eAAAA;AAAA,YAACQ,oCAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,UAAA;AAAA,cACL,SAAA,EAAU,8NAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAN,cAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,aAAA,EAAY,MAAA;AAAA,oBACZ,SAAA,EAAU,oGAAA;AAAA,oBAET,QAAA,EAAA,QAAA,CAAS,IAAA,oBAAQA,cAAAA,CAACW,kBAAA,EAAA,EAAO;AAAA;AAAA,iBAC5B;AAAA,gBACC,QAAA,CAAS,8BACRX,cAAAA,CAAC,UAAK,SAAA,EAAU,iDAAA,EACb,mBAAS,UAAA,EACZ,CAAA;AAAA,gBAED,QAAA,CAAS,WAAA;AAAA;AAAA;AAAA,kCAGRA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAoB,mBAAS,WAAA,EAAY;AAAA,oCAExDA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EACb,mBAAS,QAAA,EACZ,CAAA;AAAA,gBAED,QAAA,CAAS,MAAA,KAAW,SAAA,oBACnBA,eAAC,MAAA,EAAA,EAAK,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,YACjC,QAAA,kBAAAA,cAAAA,CAACY,yBAAA,EAAA,EAAQ,IAAA,EAAK,MAAK,CAAA,EACrB,CAAA;AAAA,gCAEFZ,cAAAA;AAAA,kBAACa,uBAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAS,oBAAA,CAAqB,QAAA,CAAS,MAAM,CAAA;AAAA,oBAC7C,IAAA,EAAK,IAAA;AAAA,oBACL,SAAA,EAAU,kBAAA;AAAA,oBAET,QAAA,EAAA,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,MAAM;AAAA;AAAA,iBAChC;AAAA,gCACAb,cAAAA;AAAA,kBAACO,uBAAA;AAAA,kBAAA;AAAA,oBACC,aAAA,EAAY,MAAA;AAAA,oBACZ,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,WACF;AAAA,0BAEAT,eAAAA,CAACU,oCAAA,EAAA,EAAmB,SAAA,EAAU,0BAAA,EAC3B,QAAA,EAAA;AAAA,YAAA,QAAA,CAAS,WAAA,oBACRV,eAAAA,CAAAK,mBAAAA,EAAA,EAEE,QAAA,EAAA;AAAA,8BAAAH,cAAAA;AAAA,gBAAC,GAAA;AAAA,gBAAA;AAAA,kBACC,WAAA,EAAU,2BAAA;AAAA,kBACV,SAAA,EAAU,aAAA;AAAA,kBAEV,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAK,QAAA,EAAA,QAAA,CAAS,WAAA,EAAY;AAAA;AAAA,eAC7B;AAAA,8BACAF,eAAAA;AAAA,gBAAC,GAAA;AAAA,gBAAA;AAAA,kBACC,WAAA,EAAU,iBAAA;AAAA,kBACV,SAAA,EAAU,4DAAA;AAAA,kBAEV,QAAA,EAAA;AAAA,oCAAAE,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,iBAAO,MAAA,EAAO,CAAA;AAAA,oBAAQ,GAAA;AAAA,oCACrDA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAa,mBAAS,QAAA,EAAS;AAAA;AAAA;AAAA;AACjD,aAAA,EACF,CAAA;AAAA,YAED,QAAA,CAAS,MAAA,IAAU,QAAA,oBAClBA,cAAAA;AAAA,cAAC,eAAA;AAAA,cAAA;AAAA,gBACC,QAAQ,QAAA,CAAS,MAAA;AAAA,gBACjB;AAAA;AAAA,aACF;AAAA,YAED,QAAA,CAAS,WAAW,MAAA,GAAS,CAAA;AAAA,4BAE5BA,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAI,KAAA;AAAA,gBACJ,SAAA,EAAU,+EAAA;AAAA,gBAET,2BAAiB,QAAQ;AAAA;AAAA,aAC5B;AAAA,YAED,MAAA,oBACCA,cAAAA,CAAC,gBAAA,EAAA,EAAiB,OAAO,MAAA,CAAO,UAAA,EAAY,MAAM,MAAA,EAAQ,CAAA;AAAA,YAE3D,SAAA,oBACCA,cAAAA,CAAC,gBAAA,EAAA,EAAiB,OAAO,MAAA,CAAO,SAAA,EAAW,MAAM,SAAA,EAAW;AAAA,WAAA,EAEhE;AAAA,SAAA,EACF,CAAA;AAAA,QAEC,QAAA,CAAS,WAAW,OAAA,IAAW,SAAA,oBAC9BA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0DAAA,EACV,QAAA,EAAA,SAAA,EACH,CAAA;AAAA,QAGD,kBAAA,KAAuB,SAAA,IAAa,MAAA,CAAA,oBACnCF,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,qCAAA;AAAA,YACV,SAAS,MAAM;AACb,cAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAAA,YAC9B,CAAA;AAAA,YACA,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,cAAA,IAAI,CAAC,KAAA,CAAM,aAAA,CAAc,QAAA,CAAS,KAAA,CAAM,aAAa,CAAA,EAAG;AACtD,gBAAA,iBAAA,CAAkB,OAAA,GAAU,KAAA;AAAA,cAC9B;AAAA,YACF,CAAA;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,SAAA,oBACCA,eAAAA,CAAAK,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,gCAAAH,cAAAA;AAAA,kBAACc,wBAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,IAAA;AAAA,oBACL,OAAA,EAAS,MACP,KAAK,GAAA,CAAI,MAAM,SAAA,CAAU,QAAA,EAAU,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAC,CAAA;AAAA,oBAEvD,QAAA,EAAU,MAAA;AAAA,oBACV,SAAA,EAAW,MAAA;AAAA,oBAEV,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA,iBACV;AAAA,gCACAd,cAAAA;AAAA,kBAACc,wBAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,IAAA;AAAA,oBACL,OAAA,EAAQ,SAAA;AAAA,oBACR,OAAA,EAAS,MACP,KAAK,GAAA,CAAI,MAAM,SAAA,CAAU,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,oBAEtD,QAAA,EAAU,MAAA;AAAA,oBAET,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA;AACV,eAAA,EACF,CAAA;AAAA,cAED,0BACCd,cAAAA;AAAA,gBAACc,wBAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,IAAA;AAAA,kBACL,OAAA,EAAQ,QAAA;AAAA,kBACR,SAAS,MAAM,KAAK,IAAI,MAAM,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,kBAC9C,QAAA,EAAU,MAAA;AAAA,kBAET,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA;AACV;AAAA;AAAA;AAEJ,OAAA,EAEJ;AAAA;AAAA,GACF;AAEJ;AA2CO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,SAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA,EAAQ,cAAA;AAAA,EACR;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,MAAA,GAAeV,iBAAA,CAAA,OAAA;AAAA,IACnB,MAAM,cAAc,cAAc,CAAA;AAAA,IAClC,CAAC,cAAc;AAAA,GACjB;AACA,EAAA,MAAM,SAAeA,iBAAA,CAAA,KAAA,EAAM;AAC3B,EAAA,MAAM,OAAA,GAAU,UAAU,SAAS,CAAA;AACnC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,2BAAqB,IAAI,CAAA;AACzD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,eAAA;AAAA,IAC9B,OAAA,CAAQ,QAAA;AAAA,IACR,OAAA,CAAQ,SAAA;AAAA,IACR;AAAA,GACF;AAIA,EAAA,MAAM,SAAA,GAAY,UAAU,MAAA,GAAS,CAAA;AACrC,EAAA,MAAM,eACJ,CAAC,SAAA,IAAa,WAAW,SAAA,GAAY,SAAA,CAAU,OAAO,cAAc,CAAA;AAEtE,EAAA,uBACEN,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,oBAAA;AAAA,MACV,SAAA;AAAA,MACA,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,QAAA,IAAI,CAAC,MAAM,aAAA,CAAc,QAAA,CAAS,MAAM,aAAa,CAAA,WAAY,IAAI,CAAA;AAAA,MACvE,CAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,SAAA,oBACCA,eAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,eAAA,EAAe,QAAA;AAAA,YACf,eAAA,EAAe,MAAA;AAAA,YACf,OAAA,EAAS,MAAM,WAAA,CAAY,CAAC,QAAQ,CAAA;AAAA,YACpC,OAAA,EAAS,MAAM,QAAA,CAAS,QAAQ,CAAA;AAAA,YAChC,SAAA,EAAU,gPAAA;AAAA,YAET,QAAA,EAAA;AAAA,cAAA,OAAA,CAAQ,QAAA,mBACPE,cAAAA,CAAC,MAAA,EAAA,EAAK,eAAY,MAAA,EAAO,SAAA,EAAU,YACjC,QAAA,kBAAAA,cAAAA,CAACY,6BAAQ,IAAA,EAAK,IAAA,EAAK,GACrB,CAAA,mBAEAZ,eAACW,kBAAA,EAAA,EAAO,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,8BAE9DX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EACb,kBAAQ,QAAA,GACL,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,GAC5B,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,EAC/B,CAAA;AAAA,cACC,QAAQ,gBAAA,GAAmB,CAAA,oBAC1BA,cAAAA,CAACa,2BAAM,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAAK,WAAU,UAAA,EAC1C,QAAA,EAAA,MAAA,CAAO,aAAA,CAAc,OAAA,CAAQ,gBAAgB,CAAA,EAChD,CAAA;AAAA,cAED,QAAQ,MAAA,GAAS,CAAA,oBAChBb,cAAAA,CAACa,2BAAM,OAAA,EAAQ,QAAA,EAAS,IAAA,EAAK,IAAA,EAAK,WAAU,UAAA,EACzC,QAAA,EAAA,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAC/B,CAAA;AAAA,8BAEFb,cAAAA;AAAA,gBAACO,uBAAA;AAAA,gBAAA;AAAA,kBACC,aAAA,EAAY,MAAA;AAAA,kBACZ,SAAA,EAAWR,oBAAA;AAAA,oBACT,yEAAA;AAAA,oBACA,QAAA,IAAY;AAAA;AACd;AAAA;AACF;AAAA;AAAA,SACF;AAAA,wBAEFC,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,EAAA,EAAI,MAAA;AAAA,YACJ,OAAA,EAAS,MAAM,QAAA,CAAS,MAAM,CAAA;AAAA,YAC9B,SAAA,EAAWD,oBAAA;AAAA,cACT,SAAA,IACE;AAAA,aACJ;AAAA,YAEA,QAAA,kBAAAC,eAACe,kCAAA,EAAA,EAAiB,OAAA,EAAS,OACxB,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,QAAA,qBACjBf,cAAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBAEC,QAAA;AAAA,gBACA,MAAA;AAAA,gBACA,SAAA;AAAA,gBACA,MAAA;AAAA,gBACA;AAAA,eAAA;AAAA,cALK,QAAA,CAAS;AAAA,aAOjB,CAAA,EACH;AAAA;AAAA,SACF;AAAA,wBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAK,QAAA,EAAS,WAAU,SAAA,EAGzB,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EACE,+BAAqB,OAAA,EAAS,MAAM,CAAA,EAAA,EAD5B,OAAA,CAAQ,WAEnB,CAAA,EACF,CAAA;AAAA,wBAEAA,cAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAK,UAAS,SAAA,EAAU,SAAA,EACxB,QAAA,EAAA,OAAA,CAAQ,MAAA,GAAS,IAAI,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,MAAM,IAAI,EAAA,EAChE;AAAA;AAAA;AAAA,GACF;AAEJ;AC3mBA,IAAM,cAAA,GAAiBE,0BAAAA;AAAA,EACrB,wDAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,8EAAA;AAAA,QACN,SAAA,EAAW,+CAAA;AAAA,QACX,MAAA,EACE,2EAAA;AAAA,QACF,IAAA,EAAM;AAAA,OACR;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,iBAAA;AAAA,QACJ,EAAA,EAAI,iBAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM;AAAA;AACR;AAEJ,CAAA;AAOA,SAAS,aAAA,CAAc;AAAA,EACrB,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAkB;AACrC,IAAA,IAAI,CAAC,MAAM,OAAO,GAAA;AAClB,IAAA,OAAO,KACJ,KAAA,CAAM,GAAG,EACT,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,CAAC,CAAC,CAAA,CACf,KAAK,EAAE,CAAA,CACP,UAAU,CAAA,EAAG,CAAC,EACd,WAAA,EAAY;AAAA,EACjB,CAAA;AAEA,EAAA,uBACEF,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,mBAAA;AAAA,MACV,SAAA,EAAWD,qBAAG,cAAA,CAAe,EAAE,MAAM,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,MAEtD,QAAA,EAAA,IAAA,KAAS,8BACRC,cAAAA,CAAC,gBAAa,IAAA,EAAK,IAAA,EAAK,IACtB,IAAA,KAAS,MAAA,mBACXA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,aAAA,EAAe,QAAA,EAAA,WAAA,CAAY,QAAQ,CAAA,EAAE,CAAA,GACnD,IAAA,KAAS,QAAA,mBACXA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAY,MAAA;AAAA,UACZ,SAAA,EAAU,SAAA;AAAA,UACV,IAAA,EAAK,MAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UACR,MAAA,EAAO,cAAA;AAAA,UACP,WAAA,EAAY,KAAA;AAAA,UAEZ,QAAA,kBAAAA,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAc,OAAA;AAAA,cACd,cAAA,EAAe,OAAA;AAAA,cACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,0BAGFA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAY,MAAA;AAAA,UACZ,SAAA,EAAU,SAAA;AAAA,UACV,IAAA,EAAK,MAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UACR,MAAA,EAAO,cAAA;AAAA,UACP,WAAA,EAAY,KAAA;AAAA,UAEZ,QAAA,kBAAAA,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAc,OAAA;AAAA,cACd,cAAA,EAAe,OAAA;AAAA,cACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AACF;AAAA,GAEJ;AAEJ;AAMA,SAAS,iBAAA,CAAkB,EAAE,SAAA,EAAU,EAA2B;AAChE,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ,KAAA;AAAA,IACR,QAAA,EAAU,KAAA;AAAA,IACV,SAAA,EAAW,KAAA;AAAA,IACX,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,uBACEF,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,qBAAA;AAAA,MACV,SAAA,EAAWC,oBAAA,CAAG,+CAAA,EAAiD,SAAS,CAAA;AAAA,MAExE,QAAA,EAAA;AAAA,wBAAAC,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,iDAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,GAAG,QAAA;AAAA,cACH,SAAA,EAAW,2CAAA;AAAA,cACX,cAAA,EAAgB;AAAA;AAClB;AAAA,SACF;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,iDAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,GAAG,QAAA;AAAA,cACH,SAAA,EAAW,2CAAA;AAAA,cACX,cAAA,EAAgB;AAAA;AAClB;AAAA,SACF;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,iDAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,GAAG,QAAA;AAAA,cACH,SAAA,EAAW;AAAA;AACb;AAAA,SACF;AAAA,wBACAA,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EAKN;AAAA;AAAA;AAAA,GACJ;AAEJ;AAMA,SAAS,aAAA,CAAc;AAAA,EACrB,IAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA,GAAmB;AACrB,CAAA,EAIG;AACD,EAAA,MAAM,SAAA,GAAkBgB,iBAAA,CAAA,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AACzC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,2BAAwB,IAAI,CAAA;AAGhE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAUA,2BAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,aAAA,GAAsBA,yBAAO,SAAS,CAAA;AAE5C,EAAMA,4BAAU,MAAM;AACpB,IAAA,IAAI,aAAA,CAAc,OAAA,IAAW,CAAC,SAAA,EAAW;AACvC,MAAA,UAAA,CAAW,IAAA,CAAK,OAAO,IAAA,CAAK,GAAA,KAAQ,SAAA,CAAU,OAAA,IAAW,GAAI,CAAC,CAAA;AAC9D,MAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,IACvB,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,OAAA,IAAW,SAAA,EAAW;AAE9C,MAAA,SAAA,CAAU,OAAA,GAAU,KAAK,GAAA,EAAI;AAC7B,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB;AACA,IAAA,aAAA,CAAc,OAAA,GAAU,SAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,KAAA,GAAQ,YACV,UAAA,GACA,OAAA,KAAY,QAAQ,OAAA,GAAU,CAAA,GAC5B,CAAA,YAAA,EAAe,OAAO,CAAA,CAAA,CAAA,GACtB,SAAA;AAEN,EAAA,MAAM,GAAA,GAAM,4BACVhB,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAU;AAAA;AAAA,GACZ,GACE,IAAA;AAEJ,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,uBACb,QAAA,kBAAAA,cAAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,WAAA,EAAa,GAAA;AAAA,MACb,WAAA,EAAa,CAAC,gBAAA,IAAoB,CAAC,aAAA;AAAA,MACnC,aAAA,EAAc,gMAAA;AAAA,MAEd,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sIACZ,QAAA,EAAA,IAAA,EACH;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;AAeA,SAAS,YAAA,CAAa;AAAA,EACpB,OAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,MAAA,IAAU,OAAA,CAAQ,IAAA,EAAM;AAC3C,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACZ,QAAA,EAAA,iBAAA,CAAkB,OAAA,CAAQ,IAAA,EAAM,EAAE,SAAA,EAAW,SAAA,EAAW,IAAA,EAAM,CAAA,EACjE,CAAA;AAAA,IAEJ;AACA,IAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,OAAA,CAAQ,IAAA,EAAK,CAAA,EACnD,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,UAAA,IAAc,OAAA,CAAQ,QAAA,EAAU;AACnD,IAAA,uBACEA,cAAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,WAAA;AAAA,QACA,kBAAkB,OAAA,CAAQ;AAAA;AAAA,KAC5B;AAAA,EAEJ;AAEA,EAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,UAAA,IAAc,OAAA,CAAQ,IAAA,EAAM;AAC/C,IAAA,uBACEA,cAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,SAAA;AAAA,QACA,gBAAA,EAAkB,QAAQ,SAAA,IAAa;AAAA;AAAA,KACzC;AAAA,EAEJ;AAEA,EAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,MAAA,IAAU,OAAA,CAAQ,IAAA,EAAM;AAC3C,IAAA,uBACEA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,iBAAA;AAAA,QACV,SAAA,EAAU,2DAAA;AAAA,QAEV,QAAA,kBAAAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,WAAW,OAAA,CAAQ,QAAA,GAAW,CAAA,SAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA,CAAA,GAAK,EAAA;AAAA,YAE9D,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA;AACX;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,OAAA,IAAW,OAAA,CAAQ,QAAA,EAAU;AAEhD,IAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC7C,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,uBACEA,cAAAA;AAAA,MAACiB,6BAAA;AAAA,MAAA;AAAA,QACC,KAAK,OAAA,CAAQ,QAAA;AAAA,QACb,KAAA,EAAO,QAAQ,IAAA,IAAQ,iBAAA;AAAA,QACvB,OAAA,EAAQ,UAAA;AAAA,QACR,QAAA,EAAQ,IAAA;AAAA,QACR,gBAAA,EAAgB,IAAA;AAAA,QAChB,kBAAkB,OAAA,CAAQ;AAAA;AAAA,KAC5B;AAAA,EAEJ;AAEA,EAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,OAAA,IAAW,OAAA,CAAQ,QAAA,EAAU;AAEhD,IAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC7C,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,uBACEjB,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,KAAK,OAAA,CAAQ,QAAA;AAAA,QACb,QAAA,EAAQ,IAAA;AAAA,QACR,OAAA,EAAQ,UAAA;AAAA,QACR,YAAA,EAAY,QAAQ,IAAA,IAAQ,iBAAA;AAAA,QAC5B,SAAA,EAAU,0CAAA;AAAA,QAGV,QAAA,kBAAAA,cAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,UAAA,EAAW;AAAA;AAAA,KACzB;AAAA,EAEJ;AAEA,EAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,OAAA,IAAW,OAAA,CAAQ,QAAA,EAAU;AAChD,IAAA,MAAM,WAAW,kBAAA,CAAmB,IAAA,CAAK,QAAQ,QAAQ,CAAA,GACrD,SACA,OAAA,CAAQ,QAAA;AACZ,IAAA,uBACEA,cAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAI,qBAAA;AAAA,QACJ,SAAA,EAAU,qDAAA;AAAA,QACV,YAAA,EAAY,CAAA,KAAA,EAAQ,OAAA,CAAQ,IAAA,IAAQ,gBAAgB,CAAA,CAAA;AAAA,QAEpD,QAAA,kBAAAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAK,OAAA,CAAQ,QAAA;AAAA,YACb,GAAA,EAAK,QAAQ,IAAA,IAAQ,gBAAA;AAAA,YACrB,OAAA,EAAQ,MAAA;AAAA,YACR,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,IAAA,MAAM,SAAA,GACJ,OAAO,OAAA,CAAQ,QAAA,KAAa,WACxB,cAAA,CAAe,OAAA,CAAQ,QAAQ,CAAA,GAC/B,MAAA;AACN,IAAA,MAAM,IAAA,mBACJF,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kGAAA,EACb,QAAA,EAAA;AAAA,sBAAAE,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAY,MAAA;AAAA,UACZ,SAAA,EAAU,SAAA;AAAA,UACV,IAAA,EAAK,MAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UACR,MAAA,EAAO,cAAA;AAAA,UACP,WAAA,EAAa,CAAA;AAAA,UAEb,QAAA,kBAAAA,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAc,OAAA;AAAA,cACd,cAAA,EAAe,OAAA;AAAA,cACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,OACF,EACF,CAAA;AAAA,sBACAF,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAE,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAAA,EACV,QAAA,EAAA,OAAA,CAAQ,QAAQ,UAAA,EACnB,CAAA;AAAA,QACC,6BAAaA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sBAAsB,QAAA,EAAA,SAAA,EAAU;AAAA,OAAA,EAC7D;AAAA,KAAA,EACF,CAAA;AAGF,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAM,eAAe,kBAAA,CAAmB,IAAA,CAAK,QAAQ,OAAO,CAAA,GACxD,SACA,OAAA,CAAQ,OAAA;AACZ,MAAA,uBACEA,cAAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,YAAA;AAAA,UACN,MAAA,EAAO,QAAA;AAAA,UACP,GAAA,EAAI,qBAAA;AAAA,UACJ,SAAA,EAAU,0BAAA;AAAA,UAET,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,IAEJ;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,eAAe,KAAA,EAAuB;AAC7C,EAAA,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA;AACjC,EAAA,IAAI,KAAA,GAAQ,OAAO,IAAA,EAAM,OAAO,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC5D,EAAA,OAAO,IAAI,KAAA,IAAS,IAAA,GAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC9C;AAMA,IAAM,eAAA,GAAkBE,2BAAI,YAAA,EAAc;AAAA,EACxC,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,kBAAA;AAAA,MACN,SAAA,EAAW,UAAA;AAAA,MACX,MAAA,EAAQ,yBAAA;AAAA,MACR,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM;AAAA;AAEV,CAAC,CAAA;AAED,IAAM,cAAA,GAAiBA,2BAAI,2CAAA,EAA6C;AAAA,EACtE,QAAA,EAAU;AAAA,IACR,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,+CAAA;AAAA,MACN,SAAA,EACE,qEAAA;AAAA,MACF,MAAA,EACE,2GAAA;AAAA,MACF,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAqBD,IAAM,UAAA,GAAmBc,iBAAA,CAAA,UAAA;AAAA,EACvB,CACE,EAAE,SAAA,EAAW,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,GAAG,KAAA,EAAM,EAClE,GAAA,KACG;AACH,IAAA,uBACEhB,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,aAAA;AAAA,QACV,SAAA,EAAWD,oBAAA;AAAA,UACT,cAAA,CAAe,EAAE,OAAA,EAAS,CAAA;AAAA,UAC1B,QAAA,IAAY,2CAAA;AAAA,UACZ;AAAA,SACF;AAAA,QACA,KAAA,EACE,SACI,EAAE,iBAAA,EAAmB,aAAa,MAAM,CAAA,CAAA,EAAI,GAAG,KAAA,EAAM,GACrD,KAAA;AAAA,QAEL,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AAEA,UAAA,CAAW,WAAA,GAAc,YAAA;AAwCzB,SAAS,oBAAA,CAAqB;AAAA,EAC5B,OAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,MAAM,QAA2B,EAAC;AAClC,EAAA,IAAI,MAAqB,EAAC;AAC1B,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACtB,IAAA,KAAA,CAAM,IAAA;AAAA,sBACJC,cAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAW,GAAA;AAAA,UACX,WAAA;AAAA,UACC,GAAG;AAAA,SAAA;AAAA,QAHC,CAAA,gBAAA,EAAmB,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA;AAAA;AAInC,KACF;AACA,IAAA,GAAA,GAAM,EAAC;AAAA,EACT,CAAA;AAEA,EAAA,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,CAAC,OAAA,EAAS,KAAA,KAAU;AAC1C,IAAA,IAAI,aAAA,IAAiB,OAAA,CAAQ,IAAA,KAAS,UAAA,IAAc,QAAQ,QAAA,EAAU;AACpE,MAAA,GAAA,CAAI,IAAA,CAAK,QAAQ,QAAQ,CAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,QAAA,EAAS;AACT,IAAA,KAAA,CAAM,IAAA;AAAA,sBACJA,cAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UAEC,OAAA;AAAA,UACA,WAAA;AAAA,UACA,WAAW,OAAA,CAAQ,EAAA;AAAA,UACnB,SAAA;AAAA,UACA,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd;AAAA,SAAA;AAAA,QANK;AAAA;AAOP,KACF;AAAA,EACF,CAAC,CAAA;AACD,EAAA,QAAA,EAAS;AAET,EAAA,uBAAOA,cAAAA,CAAAG,mBAAAA,EAAA,EAAG,QAAA,EAAA,KAAA,EAAM,CAAA;AAClB;AAKO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,GAAa,IAAA;AAAA,EACb,aAAA,GAAgB,KAAA;AAAA,EAChB,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,KAAW,WAAA;AACvC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA;AAC5C,EAAA,MAAM,aAAA,GAAgB,sBAAsB,OAAO,CAAA;AACnD,EAAA,MAAM,gCACJH,cAAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,SAAA,EAAW,WAAA;AAAA,MACX,WAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA;AAAA,GACF;AAGF,EAAA,MAAM,UAAA,GAAa,CAAC,SAAA,KAA6B;AAC/C,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,SAAS,CAAA;AAC/B,IAAA,OAAO,IAAA,CAAK,mBAAmB,MAAA,EAAW;AAAA,MACxC,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH,CAAA;AAKA,EAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,IAAA,uBACEA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,YAAA;AAAA,QACV,SAAA,EAAWD,qBAAG,eAAA,CAAgB,EAAE,MAAM,OAAA,CAAQ,IAAA,EAAM,CAAA,EAAG,SAAS,CAAA;AAAA,QAEhE,QAAA,kBAAAC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAA4B,QAAA,EAAA,aAAA,EAAc;AAAA;AAAA,KAC3D;AAAA,EAEJ;AAEA,EAAA,uBACEF,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,YAAA;AAAA,MACV,SAAA,EAAWC,qBAAG,eAAA,CAAgB,EAAE,MAAM,OAAA,CAAQ,IAAA,EAAM,CAAA,EAAG,SAAS,CAAA;AAAA,MAE/D,QAAA,EAAA;AAAA,QAAA,UAAA,IAAc,OAAA,CAAQ,SAAS,QAAA,oBAC9BC,eAAC,aAAA,EAAA,EAAc,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,QAAA,EAAoB,CAAA;AAAA,wBAGzDF,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWC,oBAAA;AAAA,cACT,oCAAA;AAAA,cACA,OAAA,CAAQ,SAAS,MAAA,IAAU;AAAA,aAC7B;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAC,cAAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,WAAA,EAAU,mBAAA;AAAA,kBACV,SAAS,OAAA,CAAQ,IAAA;AAAA,kBACjB,QAAA,EAAU,QAAQ,MAAA,KAAW,OAAA;AAAA,kBAE5B,uCACCA,cAAAA,CAAC,SAAI,SAAA,EAAU,WAAA,EAAa,yBAAc,CAAA,GACxC,WAAA,mBACFA,cAAAA,CAAC,SAAI,SAAA,EAAU,kCAAA,EACb,0BAAAA,cAAAA,CAAC,iBAAA,EAAA,EAAkB,GACrB,CAAA,GACE;AAAA;AAAA,eACN;AAAA,cAEC,aAAA,IAAiB,IAAA,IAAQ,aAAA,KAAkB,KAAA,oBAC1CA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,mBAAA,EAAoB,SAAA,EAAU,mBAAA,EAC1C,QAAA,EAAA,aAAA,EACH,CAAA;AAAA,cAGD,iCACCA,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,WAAA,EAAU,sBAAA;AAAA,kBACV,SAAA,EAAU,+BAAA;AAAA,kBAET,QAAA,EAAA,UAAA,CAAW,QAAQ,SAAS;AAAA;AAAA,eAC/B;AAAA,cAGD,OAAA,CAAQ,MAAA,KAAW,OAAA,oBAClBA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA,OAAA,CAAQ,IAAA,KAAS,MAAA,GAAS,gBAAA,GAAmB,mBAAA,EAChD;AAAA;AAAA;AAAA;AAEJ;AAAA;AAAA,GACF;AAEJ;ACrpBO,SAAS,kBAAA,CAAmB;AAAA,EACjC,cAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,uBACEF,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAW,QAAA;AAAA,MACX,OAAA;AAAA,MACA,YAAA,EACE,iBAAiB,sCAAA,GAAoC,kBAAA;AAAA,MAEvD,SAAA,EAAWC,oBAAA;AAAA,QACT,kDAAA;AAAA,QACA,8HAAA;AAAA,QACA,4CAAA;AAAA,QACA,wEAAA;AAAA,QACA,yHAAA;AAAA,QACA,cAAA,IAAkB;AAAA,OACpB;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,cAAA,oBAAkBC,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,wBACrCA,cAAAA,CAACkB,qBAAA,EAAA,EAAc,IAAA,EAAM,EAAA,EAAI,eAAY,MAAA,EAAO;AAAA;AAAA;AAAA,GAC9C;AAEJ","file":"chunk-ARI25ZYT.cjs","sourcesContent":["/**\n * AI Component Icons\n *\n * Shared icon components for AI features to follow DRY principles.\n */\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Sparkles Icon (Modern AI Symbol)\n// ============================================================================\n\nexport interface SparklesIconProps {\n className?: string;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n}\n\nconst sizeClasses = {\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-7 w-7',\n};\n\n/**\n * Sparkles icon - the modern symbol for AI features\n * Used by ChatGPT, GitHub Copilot, Google Gemini, etc.\n */\nexport function SparklesIcon({ className, size = 'md' }: SparklesIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn(sizeClasses[size], className)}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n {/* Large sparkle */}\n <path d=\"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\" />\n {/* Small sparkle */}\n <path\n d=\"M20 3v4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M22 5h-4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// AI Logo Icon (Stack/Layers) - Legacy\n// ============================================================================\n\nexport interface AILogoIconProps {\n className?: string;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * The AI assistant logo - a stacked layers/prism icon\n * @deprecated Use SparklesIcon for a more recognizable AI symbol\n */\nexport function AILogoIcon({ className, size = 'md' }: AILogoIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn(sizeClasses[size], className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n d=\"M12 2L2 7L12 12L22 7L12 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"currentColor\"\n fillOpacity=\"0.2\"\n />\n <path\n d=\"M2 17L12 22L22 17\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M2 12L12 17L22 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Close Icon\n// ============================================================================\n\nexport interface CloseIconProps {\n className?: string;\n}\n\nexport function CloseIcon({ className }: CloseIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Refresh/Clear Icon\n// ============================================================================\n\nexport interface RefreshIconProps {\n className?: string;\n}\n\nexport function RefreshIcon({ className }: RefreshIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Chevron Icon\n// ============================================================================\n\nexport interface ChevronIconProps {\n className?: string;\n direction?: 'up' | 'down' | 'left' | 'right';\n}\n\nconst chevronRotation = {\n up: '-rotate-180',\n down: '',\n left: 'rotate-90',\n right: '-rotate-90',\n};\n\nexport function ChevronIcon({\n className,\n direction = 'down',\n}: ChevronIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-4 w-4', chevronRotation[direction], className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n );\n}\n\n// ============================================================================\n// Send Icon\n// ============================================================================\n\nexport interface SendIconProps {\n className?: string;\n}\n\nexport function SendIcon({ className }: SendIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 19l9 2-9-18-9 18 9-2zm0 0v-8\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Spinner Icon\n// ============================================================================\n\nexport interface SpinnerIconProps {\n className?: string;\n}\n\nexport function SpinnerIcon({ className }: SpinnerIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5 animate-spin', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n );\n}\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { ChevronIcon } from './icons';\n\nexport interface CollapsiblePillProps {\n label: React.ReactNode;\n leadingIcon?: React.ReactNode;\n density?: 'standard' | 'condensed';\n defaultOpen?: boolean;\n pillClassName?: string;\n className?: string;\n /** Native tooltip shown on hover (e.g. \"Show details\") */\n title?: string;\n children?: React.ReactNode;\n}\n\nexport function CollapsiblePill({\n label,\n leadingIcon,\n density = 'standard',\n defaultOpen = false,\n pillClassName,\n className,\n title,\n children,\n}: CollapsiblePillProps) {\n const hasContent = Boolean(children);\n const [isOpen, setIsOpen] = React.useState(defaultOpen);\n const contentId = React.useId();\n\n React.useEffect(() => {\n setIsOpen(defaultOpen);\n }, [defaultOpen]);\n\n const toggle = () => {\n setIsOpen((open) => !open);\n };\n\n return (\n <div data-slot=\"collapsible-pill\" className={className}>\n <button\n type=\"button\"\n onClick={hasContent ? toggle : undefined}\n aria-expanded={hasContent ? isOpen : undefined}\n aria-controls={hasContent ? contentId : undefined}\n title={title}\n disabled={!hasContent}\n className={cn(\n 'focus-visible:ring-ring inline-flex items-center gap-1.5 border font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1',\n density === 'condensed'\n ? 'rounded-[8px] px-2 py-0.5 text-[10px]'\n : 'rounded-[10px] px-[11px] py-1 text-[11px]',\n pillClassName\n )}\n >\n {leadingIcon}\n <span>{label}</span>\n {hasContent && (\n <ChevronIcon\n direction={isOpen ? 'down' : 'right'}\n className={\n density === 'condensed'\n ? 'h-2.5 w-2.5 opacity-60'\n : 'h-3 w-3 opacity-60'\n }\n />\n )}\n </button>\n {hasContent && (\n <div\n id={contentId}\n aria-hidden={!isOpen}\n inert={!isOpen || undefined}\n className={cn(\n 'overflow-hidden transition-[max-height,opacity] duration-300 ease-in-out',\n isOpen\n ? 'max-h-[500px] overflow-y-auto opacity-100'\n : 'max-h-0 opacity-0'\n )}\n >\n <div className=\"mt-1.5\">{children}</div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * MCP Tool Call Display Component\n *\n * Renders an MCP tool invocation with status, parameters, and results.\n */\n\nimport * as React from 'react';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { CollapsiblePill } from './CollapsiblePill';\nimport type {\n MCPToolCall,\n MCPToolStatus,\n MCPToolResult,\n MCPResourceLink,\n MCPToolParameter,\n} from './types';\n\n// ============================================================================\n// Status Icon Component\n// ============================================================================\n\nconst statusIconVariants = cva(\n 'flex h-5 w-5 items-center justify-center rounded-full',\n {\n variants: {\n status: {\n pending: 'bg-neutral-200 dark:bg-neutral-700',\n 'awaiting-approval': 'bg-amber-100 dark:bg-amber-900/50',\n running: 'bg-primary-100 dark:bg-primary-900/50',\n success: 'bg-green-100 dark:bg-green-900/50',\n error: 'bg-red-100 dark:bg-red-900/50',\n cancelled: 'bg-neutral-200 dark:bg-neutral-700',\n denied: 'bg-neutral-200 dark:bg-neutral-700',\n expired: 'bg-neutral-200 dark:bg-neutral-700',\n },\n },\n defaultVariants: {\n status: 'pending',\n },\n }\n);\n\ninterface ToolStatusIconProps {\n status: MCPToolStatus;\n className?: string;\n}\n\nfunction ToolStatusIcon({ status, className }: ToolStatusIconProps) {\n return (\n <span\n data-slot=\"ai-tool-status-icon\"\n className={cn(statusIconVariants({ status }), className)}\n >\n {status === 'pending' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-neutral-500\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <circle cx=\"10\" cy=\"10\" r=\"3\" />\n </svg>\n )}\n {status === 'awaiting-approval' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-amber-600 dark:text-amber-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 7v6m0 4h.01\"\n />\n </svg>\n )}\n {status === 'running' && (\n <svg\n aria-hidden=\"true\"\n className=\"text-primary-800 dark:text-primary-400 h-3 w-3 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n )}\n {status === 'success' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-green-600 dark:text-green-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n )}\n {status === 'error' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-red-600 dark:text-red-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n )}\n {(status === 'cancelled' ||\n status === 'denied' ||\n status === 'expired') && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-neutral-500\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M18 12H6\" />\n </svg>\n )}\n </span>\n );\n}\n\n// ============================================================================\n// Tool Icon Component\n// ============================================================================\n\nconst TOOL_ICONS: Record<string, React.ReactNode> = {\n // Patient tools\n create_patient: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M18 7.5v3m0 0v3m0-3h3m-3 0h-3m-2.25-4.125a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zM3 19.235v-.11a6.375 6.375 0 0112.75 0v.109A12.318 12.318 0 019.374 21c-2.331 0-4.512-.645-6.374-1.766z\"\n />\n </svg>\n ),\n get_patient: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z\"\n />\n </svg>\n ),\n search_patients: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z\"\n />\n </svg>\n ),\n // Appointment tools\n schedule_appointment: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5m-9-6h.008v.008H12v-.008zM12 15h.008v.008H12V15zm0 2.25h.008v.008H12v-.008zM9.75 15h.008v.008H9.75V15zm0 2.25h.008v.008H9.75v-.008zM7.5 15h.008v.008H7.5V15zm0 2.25h.008v.008H7.5v-.008zm6.75-4.5h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V15zm0 2.25h.008v.008h-.008v-.008zm2.25-4.5h.008v.008H16.5v-.008zm0 2.25h.008v.008H16.5V15z\"\n />\n </svg>\n ),\n // Document tools\n create_document: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m3.75 9v6m3-3H9m1.5-12H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\"\n />\n </svg>\n ),\n // Provider tools\n search_providers: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15 10.5a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1115 0z\"\n />\n </svg>\n ),\n // Default tool icon\n default: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.42 15.17L17.25 21A2.652 2.652 0 0021 17.25l-5.877-5.877M11.42 15.17l2.496-3.03c.317-.384.74-.626 1.208-.766M11.42 15.17l-4.655 5.653a2.548 2.548 0 11-3.586-3.586l6.837-5.63m5.108-.233c.55-.164 1.163-.188 1.743-.14a4.5 4.5 0 004.486-6.336l-3.276 3.277a3.004 3.004 0 01-2.25-2.25l3.276-3.276a4.5 4.5 0 00-6.336 4.486c.091 1.076-.071 2.264-.904 2.95l-.102.085m-1.745 1.437L5.909 7.5H4.5L2.25 3.75l1.5-1.5L7.5 4.5v1.409l4.26 4.26m-1.745 1.437l1.745-1.437m6.615 8.206L15.75 15.75M4.867 19.125h.008v.008h-.008v-.008z\"\n />\n </svg>\n ),\n};\n\nfunction getToolIcon(toolName: string): React.ReactNode {\n return TOOL_ICONS[toolName] || TOOL_ICONS.default;\n}\n\n// ============================================================================\n// Resource Link Component\n// ============================================================================\n\nexport interface ResourceLinkProps {\n link: MCPResourceLink;\n onClick?: (link: MCPResourceLink) => void;\n className?: string;\n}\n\nexport function ResourceLink({ link, onClick, className }: ResourceLinkProps) {\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n e.preventDefault();\n onClick(link);\n }\n };\n\n const linkTypeIcons: Record<string, React.ReactNode> = {\n patient: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z\"\n />\n </svg>\n ),\n document: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\"\n />\n </svg>\n ),\n appointment: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5\"\n />\n </svg>\n ),\n order: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 12h3.75M9 15h3.75M9 18h3.75m3 .75H18a2.25 2.25 0 002.25-2.25V6.108c0-1.135-.845-2.098-1.976-2.192a48.424 48.424 0 00-1.123-.08m-5.801 0c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m0 0H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H8.25z\"\n />\n </svg>\n ),\n provider: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15 10.5a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1115 0z\"\n />\n </svg>\n ),\n external: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\"\n />\n </svg>\n ),\n internal: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M13.19 8.688a4.5 4.5 0 011.242 7.244l-4.5 4.5a4.5 4.5 0 01-6.364-6.364l1.757-1.757m13.35-.622l1.757-1.757a4.5 4.5 0 00-6.364-6.364l-4.5 4.5a4.5 4.5 0 001.242 7.244\"\n />\n </svg>\n ),\n };\n\n const icon = link.type ? linkTypeIcons[link.type] : linkTypeIcons.internal;\n\n return (\n <a\n href={link.href}\n onClick={handleClick}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5',\n 'bg-primary-50 text-primary-900 hover:bg-primary-100',\n 'dark:bg-primary-900/30 dark:text-primary-300 dark:hover:bg-primary-900/50',\n 'text-sm font-medium transition-colors',\n 'focus:ring-primary-500 focus:ring-2 focus:ring-offset-2 focus:outline-none',\n 'dark:focus:ring-offset-neutral-900',\n className\n )}\n >\n {icon}\n <span>{link.label}</span>\n {link.type === 'external' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 opacity-60\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M4.5 19.5l15-15m0 0H8.25m11.25 0v11.25\"\n />\n </svg>\n )}\n </a>\n );\n}\n\n// ============================================================================\n// Tool Result Component\n// ============================================================================\n\ninterface ToolResultDisplayProps {\n result: MCPToolResult;\n onLinkClick?: (link: MCPResourceLink) => void;\n className?: string;\n}\n\nfunction ToolResultDisplay({\n result,\n onLinkClick,\n className,\n}: ToolResultDisplayProps) {\n if (result.type === 'error') {\n return (\n <div\n className={cn(\n 'mt-2 rounded-md bg-red-50 p-3 dark:bg-red-900/20',\n className\n )}\n >\n <p className=\"text-sm text-red-700 dark:text-red-300\">\n {typeof result.data === 'string'\n ? String(result.data)\n : 'An error occurred'}\n </p>\n </div>\n );\n }\n\n return (\n <div className={cn('space-y-2', className)}>\n {result.summary && (\n <p className=\"text-sm text-neutral-700 dark:text-neutral-300\">\n {result.summary}\n </p>\n )}\n\n <ToolResultLinks result={result} onLinkClick={onLinkClick} />\n </div>\n );\n}\n\n/** True when a result carries a `link` or `resources` to render. */\nexport function hasToolResultLinks(result: MCPToolResult | undefined): boolean {\n return Boolean(result?.link || result?.resources?.length);\n}\n\ninterface ToolResultLinksProps {\n result: MCPToolResult;\n onLinkClick?: (link: MCPResourceLink) => void;\n}\n\n/** A result's `link` and `resources` as {@link ResourceLink}s. */\nexport function ToolResultLinks({ result, onLinkClick }: ToolResultLinksProps) {\n return (\n <>\n {result.link && <ResourceLink link={result.link} onClick={onLinkClick} />}\n\n {result.resources && result.resources.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {result.resources.map((resource) => (\n <ResourceLink\n key={resource.id}\n link={{\n href: resource.uri || '#',\n label: resource.name,\n type: resource.type as MCPResourceLink['type'],\n }}\n onClick={onLinkClick}\n />\n ))}\n </div>\n )}\n </>\n );\n}\n\n// ============================================================================\n// MCP Tool Call Component\n// ============================================================================\n\n// Human-readable tool names\nconst TOOL_FRIENDLY_NAMES: Record<string, string> = {\n create_patient: 'Creating patient',\n get_patient: 'Looking up patient',\n search_patients: 'Searching patients',\n update_patient: 'Updating patient',\n delete_patient: 'Removing patient',\n schedule_appointment: 'Scheduling appointment',\n cancel_appointment: 'Canceling appointment',\n update_appointment: 'Updating appointment',\n create_document: 'Creating document',\n upload_document: 'Uploading document',\n get_document: 'Retrieving document',\n search_documents: 'Searching documents',\n create_order: 'Creating order',\n send_message: 'Sending message',\n search: 'Searching',\n search_providers: 'Searching for providers',\n};\n\nfunction getToolFriendlyName(toolName: string, status: MCPToolStatus): string {\n const baseName = TOOL_FRIENDLY_NAMES[toolName] || toolName.replace(/_/g, ' ');\n\n // Adjust tense based on status\n if (status === 'success') {\n // Past tense approximation — check longer prefixes first to avoid\n // partial matches (e.g. \"Searching for\" before \"Searching\")\n if (baseName.startsWith('Creating'))\n return baseName.replace('Creating', 'Created');\n if (baseName.startsWith('Scheduling'))\n return baseName.replace('Scheduling', 'Scheduled');\n if (baseName.startsWith('Searching for'))\n return baseName.replace('Searching for', 'Found');\n if (baseName.startsWith('Searching'))\n return baseName.replace('Searching', 'Found');\n if (baseName.startsWith('Looking'))\n return baseName.replace('Looking', 'Found');\n if (baseName.startsWith('Updating'))\n return baseName.replace('Updating', 'Updated');\n if (baseName.startsWith('Removing'))\n return baseName.replace('Removing', 'Removed');\n if (baseName.startsWith('Canceling'))\n return baseName.replace('Canceling', 'Canceled');\n if (baseName.startsWith('Retrieving'))\n return baseName.replace('Retrieving', 'Retrieved');\n if (baseName.startsWith('Uploading'))\n return baseName.replace('Uploading', 'Uploaded');\n if (baseName.startsWith('Sending'))\n return baseName.replace('Sending', 'Sent');\n }\n return baseName;\n}\n\n// Generate a user-friendly summary from parameters\nfunction getParameterSummary(\n toolName: string,\n params: MCPToolParameter[]\n): string | null {\n const paramMap = Object.fromEntries(params.map((p) => [p.name, p.value]));\n\n // Patient creation\n if (\n toolName === 'create_patient' &&\n paramMap.firstName &&\n paramMap.lastName\n ) {\n return `${paramMap.firstName} ${paramMap.lastName}`;\n }\n\n // Search\n if (toolName.includes('search') && paramMap.query) {\n return `\"${paramMap.query}\"`;\n }\n\n // Appointment\n if (toolName.includes('appointment') && paramMap.patientName) {\n const date = paramMap.preferredDate || paramMap.date;\n return date\n ? `${paramMap.patientName} on ${date}`\n : String(paramMap.patientName);\n }\n\n // Provider search\n if (toolName === 'search_providers' && paramMap.zipcode) {\n const service = paramMap.service;\n return service\n ? `${service} near ${paramMap.zipcode}`\n : `near ${paramMap.zipcode}`;\n }\n\n return null;\n}\n\n// Pill header colors per status (Ozwell-style status pill)\nconst statusPillClasses: Record<MCPToolStatus, string> = {\n pending:\n 'bg-neutral-100 border-neutral-200 text-neutral-600 dark:bg-neutral-800 dark:border-neutral-700 dark:text-neutral-400',\n 'awaiting-approval':\n 'bg-amber-50 border-amber-200 text-amber-800 dark:bg-amber-900/20 dark:border-amber-800 dark:text-amber-300',\n running:\n 'bg-primary-50 border-primary-200 text-primary-800 dark:bg-primary-900/20 dark:border-primary-800 dark:text-primary-300',\n success:\n 'bg-green-50 border-green-200 text-green-700 dark:bg-green-900/20 dark:border-green-800 dark:text-green-300',\n error:\n 'bg-red-50 border-red-200 text-red-700 dark:bg-red-900/20 dark:border-red-800 dark:text-red-300',\n cancelled:\n 'bg-neutral-100 border-neutral-200 text-neutral-400 opacity-60 dark:bg-neutral-800 dark:border-neutral-700 dark:text-neutral-400',\n denied:\n 'bg-neutral-100 border-neutral-200 text-neutral-400 opacity-60 dark:bg-neutral-800 dark:border-neutral-700 dark:text-neutral-400',\n expired:\n 'bg-neutral-100 border-neutral-200 text-neutral-400 opacity-60 dark:bg-neutral-800 dark:border-neutral-700 dark:text-neutral-400',\n};\n\nexport interface MCPToolCallDisplayProps {\n /** The tool call to display */\n toolCall: MCPToolCall;\n /** Compact (condensed) sizing — tighter pill and box */\n compact?: boolean;\n /** Whether to include raw parameters inside the detail box */\n showParameters?: boolean;\n /** Whether clicking the pill can expand/collapse the entire detail box */\n collapsible?: boolean;\n /** Default collapsed state. By default, completed tool calls start expanded. */\n defaultCollapsed?: boolean;\n /** Hide the whole tool-call display (mirrors Ozwell's debug flag) */\n hidden?: boolean;\n /** Callback when a resource link is clicked */\n onLinkClick?: (link: MCPResourceLink) => void;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Displays an MCP tool call with its status, parameters, and results.\n * Shows a user-friendly summary by default, with technical details available on expand.\n */\nexport function MCPToolCallDisplay({\n toolCall,\n showParameters = true,\n collapsible = true,\n defaultCollapsed,\n compact,\n hidden = false,\n onLinkClick,\n className,\n}: MCPToolCallDisplayProps) {\n const formatDuration = (ms?: number) => {\n if (!ms) return null;\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n };\n\n // Host text may be in another script than the page; isolate it so neutral\n // characters such as a trailing \"/\" keep their place.\n const friendlyName: React.ReactNode = toolCall.displayName ? (\n <bdi>{toolCall.displayName}</bdi>\n ) : (\n getToolFriendlyName(toolCall.toolName, toolCall.status)\n );\n const durationLabel = formatDuration(toolCall.duration);\n // A host-supplied display name already names what the call acted on.\n const paramSummary = toolCall.displayName\n ? null\n : getParameterSummary(toolCall.toolName, toolCall.parameters);\n\n // While running, show the input summary in the pill (e.g. \"Creating patient\n // · John Smith\"). On success the name already appears as the result link, so\n // show the duration instead to avoid duplication.\n const detailBit =\n toolCall.status === 'success'\n ? durationLabel\n : (paramSummary ?? durationLabel);\n const pillLabel = detailBit ? (\n <>\n {friendlyName} · {detailBit}\n </>\n ) : (\n friendlyName\n );\n\n const hasParams = showParameters && toolCall.parameters.length > 0;\n const hasBoxContent = Boolean(toolCall.result || toolCall.error || hasParams);\n const isCompleted =\n toolCall.status === 'success' || toolCall.status === 'error';\n const effectiveDefaultCollapsed = defaultCollapsed ?? !isCompleted;\n\n if (hidden) return null;\n\n // Everything the pill reveals in one click: result, links, and raw params.\n const box = (\n <div\n className={cn(\n 'w-full max-w-md space-y-2 rounded-lg border border-neutral-200 bg-neutral-50 dark:border-neutral-700 dark:bg-neutral-800/50',\n compact ? 'p-2' : 'p-3'\n )}\n >\n {/* Result Summary & Links */}\n {toolCall.result && (\n <div data-slot=\"ai-tool-result\">\n <ToolResultDisplay\n result={toolCall.result}\n onLinkClick={onLinkClick}\n />\n </div>\n )}\n\n {/* Error */}\n {toolCall.error && (\n <div className=\"rounded-md bg-red-100 p-2 dark:bg-red-900/30\">\n <p className=\"text-sm text-red-700 dark:text-red-300\">\n {toolCall.error}\n </p>\n </div>\n )}\n\n {/* Raw parameters — revealed together with the box */}\n {hasParams && (\n <div\n data-slot=\"ai-tool-parameters\"\n className=\"rounded-md bg-neutral-100 p-2 dark:bg-neutral-800\"\n >\n <h4 className=\"mb-1.5 text-xs font-medium tracking-wide text-neutral-600 uppercase dark:text-neutral-400\">\n Parameters\n </h4>\n <div className=\"space-y-0.5\">\n {toolCall.parameters.map((param) => (\n <div key={param.name} className=\"flex items-start gap-2 text-xs\">\n <span className=\"font-mono text-neutral-600 dark:text-neutral-400\">\n {param.name}:\n </span>\n <span className=\"font-mono text-neutral-700 dark:text-neutral-300\">\n {typeof param.value === 'string'\n ? param.value\n : JSON.stringify(param.value)}\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n\n const staticPill = (\n <span\n data-slot=\"ai-tool-pill\"\n className={cn(\n 'inline-flex items-center gap-1.5 border font-medium',\n compact\n ? 'rounded-[8px] px-2 py-0.5 text-[10px]'\n : 'rounded-[10px] px-[11px] py-1 text-[11px]',\n statusPillClasses[toolCall.status]\n )}\n >\n <ToolStatusIcon status={toolCall.status} />\n <span>{pillLabel}</span>\n </span>\n );\n\n return (\n <div data-slot=\"ai-tool-call\" className={className}>\n {!hasBoxContent ? (\n staticPill\n ) : collapsible ? (\n // Pill click reveals the whole box (result + params) in one go.\n <CollapsiblePill\n label={pillLabel}\n leadingIcon={<ToolStatusIcon status={toolCall.status} />}\n density={compact ? 'condensed' : 'standard'}\n defaultOpen={!effectiveDefaultCollapsed}\n pillClassName={statusPillClasses[toolCall.status]}\n title=\"Toggle details\"\n >\n {box}\n </CollapsiblePill>\n ) : (\n // Non-collapsible: pill + box always visible.\n <div className=\"space-y-1.5\">\n {staticPill}\n {box}\n </div>\n )}\n </div>\n );\n}\n\nexport { ToolStatusIcon, getToolIcon };\n","/**\n * MCP Tool Call Group\n *\n * Renders a run of consecutive tool calls as one compact block: a row per call\n * under a \"Used N tools\" header that collapses itself once every call has\n * settled, while calls that need the user stay in view.\n */\n\nimport * as React from 'react';\nimport { ChevronDown, Wrench } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Animated, AnimatedPresence } from '../../motion';\nimport { usePrefersReducedMotion } from '../../hooks/usePrefersReducedMotion';\nimport { Badge, type BadgeProps } from '../Badge';\nimport { Button } from '../Button';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '../Collapsible';\nimport { Spinner } from '../Spinner';\nimport { hasToolResultLinks, ToolResultLinks } from './MCPToolCall';\nimport type { MCPResourceLink, MCPToolCall, MCPToolStatus } from './types';\n\n// ============================================================================\n// Labels\n// ============================================================================\n\n/**\n * Every user-facing string the group renders. Strings that carry a count are\n * functions so the host can pluralise with its own i18n library.\n */\nexport interface MCPToolCallGroupLabels {\n /** Header once every call has settled, e.g. \"Used 3 tools\". */\n used: (count: number) => string;\n /** Header while any call is running or awaiting approval. */\n running: (count: number) => string;\n /** Header badge for calls awaiting approval. */\n needsApproval: (count: number) => string;\n /** Header badge for failed calls. */\n failed: (count: number) => string;\n /** Live-region announcement when calls start awaiting approval. */\n announceApproval: (count: number) => string;\n /** Live-region announcement when calls fail, sent as each failure lands. */\n announceFailed: (count: number) => string;\n /** Status badge text per status. */\n status: Record<MCPToolStatus, string>;\n /** Accessible name for a call's row. */\n callLabel: (toolCall: MCPToolCall) => string;\n /** Heads the raw `toolName` in a row's details when `displayName` is set. */\n toolId: string;\n /** Disclosure for a successful call's output. */\n showResult: string;\n /** Disclosure for a failed call's full error. */\n showError: string;\n /** Approve this call only. */\n allowOnce: string;\n /** Approve this call and stop asking for it. */\n allowAlways: string;\n /** Refuse the call. */\n deny: string;\n}\n\n/** Label overrides; `status` merges per key rather than replacing the record. */\nexport type MCPToolCallGroupLabelOverrides = Partial<\n Omit<MCPToolCallGroupLabels, 'status'>\n> & {\n status?: Partial<Record<MCPToolStatus, string>>;\n};\n\nconst plural = (count: number, one: string, other: string) =>\n count === 1 ? one : other;\n\nexport const defaultMCPToolCallGroupLabels: MCPToolCallGroupLabels = {\n used: (count) => `Used ${count} ${plural(count, 'tool', 'tools')}`,\n running: (count) => `Running ${count} ${plural(count, 'tool', 'tools')}`,\n needsApproval: (count) =>\n `${count} ${plural(count, 'needs', 'need')} approval`,\n failed: (count) => `${count} failed`,\n announceApproval: (count) =>\n `${count} tool ${plural(count, 'call needs', 'calls need')} your approval`,\n announceFailed: (count) =>\n `${count} tool ${plural(count, 'call', 'calls')} failed`,\n status: {\n pending: 'Pending',\n 'awaiting-approval': 'Needs approval',\n running: 'Running',\n success: 'Done',\n error: 'Failed',\n cancelled: 'Cancelled',\n denied: 'Denied',\n expired: 'Expired',\n },\n callLabel: (toolCall) => {\n const name = toolCall.displayName || toolCall.toolName;\n return toolCall.serverName\n ? `Tool call: ${name} from ${toolCall.serverName}`\n : `Tool call: ${name}`;\n },\n toolId: 'Tool ID',\n showResult: 'Show result',\n showError: 'Show error',\n allowOnce: 'Allow once',\n allowAlways: 'Always allow',\n deny: 'Deny',\n};\n\nfunction resolveLabels(\n overrides: MCPToolCallGroupLabelOverrides | undefined\n): MCPToolCallGroupLabels {\n if (!overrides) return defaultMCPToolCallGroupLabels;\n return {\n ...defaultMCPToolCallGroupLabels,\n ...overrides,\n status: { ...defaultMCPToolCallGroupLabels.status, ...overrides.status },\n };\n}\n\n// ============================================================================\n// Group state\n// ============================================================================\n\n/** A call the user has to see without expanding anything. */\nfunction needsAttention(toolCall: MCPToolCall): boolean {\n return toolCall.status === 'awaiting-approval' || toolCall.status === 'error';\n}\n\ninterface ToolGroupSummary {\n total: number;\n awaitingApproval: number;\n failed: number;\n /** True while any call is queued, running or awaiting approval. */\n isActive: boolean;\n /** Changes whenever a call is added or changes status. */\n signature: string;\n /** IDs of the calls awaiting approval; changes with each new request. */\n approvalKey: string;\n}\n\nfunction summarize(toolCalls: MCPToolCall[]): ToolGroupSummary {\n let failed = 0;\n let inFlight = 0;\n const awaitingIds: string[] = [];\n for (const toolCall of toolCalls) {\n if (toolCall.status === 'awaiting-approval') awaitingIds.push(toolCall.id);\n else if (toolCall.status === 'error') failed += 1;\n else if (toolCall.status === 'running' || toolCall.status === 'pending')\n inFlight += 1;\n }\n return {\n total: toolCalls.length,\n awaitingApproval: awaitingIds.length,\n failed,\n isActive: awaitingIds.length + inFlight > 0,\n signature: toolCalls.map((call) => `${call.id}:${call.status}`).join('|'),\n approvalKey: awaitingIds.join('|'),\n };\n}\n\n/** Where keyboard focus sits within a group, if anywhere. */\ntype GroupFocus = 'header' | 'rows' | null;\n\n/**\n * Open while any call is active, closed once every call has settled. A manual\n * toggle holds until the group's signature changes (a call arrives or changes\n * status), at which point the automatic state returns.\n *\n * Focus in the rows holds them in view: an automatic change made then opens\n * the group rather than removing the focused row, and the automatic state is\n * applied once focus leaves the group. Leaving for the header does not count,\n * so clicking the header still toggles from what the user sees.\n */\nfunction useAutoCollapse(\n isActive: boolean,\n signature: string,\n focus: GroupFocus\n): [boolean, (expanded: boolean) => void] {\n const [state, setState] = React.useState(() => ({\n signature,\n expanded: isActive,\n deferred: false,\n }));\n\n let next = state;\n if (state.signature !== signature) {\n const expanded = isActive || focus === 'rows';\n next = { signature, expanded, deferred: expanded !== isActive };\n } else if (state.deferred && focus === null) {\n next = { signature, expanded: isActive, deferred: false };\n }\n if (next !== state) setState(next);\n\n const setExpanded = React.useCallback(\n (expanded: boolean) =>\n setState((current) => ({ ...current, expanded, deferred: false })),\n []\n );\n return [next.expanded, setExpanded];\n}\n\nfunction progressAnnouncement(\n summary: ToolGroupSummary,\n labels: MCPToolCallGroupLabels\n): string {\n if (summary.awaitingApproval > 0) {\n return labels.announceApproval(summary.awaitingApproval);\n }\n if (summary.isActive) return labels.running(summary.total);\n return labels.used(summary.total);\n}\n\n// ============================================================================\n// Row\n// ============================================================================\n\nconst STATUS_BADGE_VARIANT: Record<\n MCPToolStatus,\n NonNullable<BadgeProps['variant']>\n> = {\n pending: 'secondary',\n 'awaiting-approval': 'warning',\n running: 'default',\n success: 'success',\n error: 'danger',\n cancelled: 'secondary',\n denied: 'secondary',\n expired: 'secondary',\n};\n\nfunction formatParameters(toolCall: MCPToolCall): string {\n return JSON.stringify(\n Object.fromEntries(toolCall.parameters.map((p) => [p.name, p.value])),\n null,\n 2\n );\n}\n\nfunction formatData(data: unknown): string {\n return typeof data === 'string' ? data : JSON.stringify(data, null, 2);\n}\n\nfunction formatResult(toolCall: MCPToolCall): string | null {\n const { result } = toolCall;\n if (!result) return null;\n return result.summary || formatData(result.data);\n}\n\n/** The failure text: `error`, else an error result's detail, else its summary. */\nfunction formatError(toolCall: MCPToolCall): string | null {\n if (toolCall.error) return toolCall.error;\n const { result } = toolCall;\n if (result?.type !== 'error') return null;\n if (result.data != null && result.data !== '') return formatData(result.data);\n return result.summary || null;\n}\n\n/** A row's own collapsed block of output text, such as a result or error. */\nfunction OutputDisclosure({ label, text }: { label: string; text: string }) {\n return (\n <Collapsible>\n <CollapsibleTrigger className=\"flex items-center gap-1 text-xs font-medium text-neutral-600 hover:text-neutral-800 dark:text-neutral-400 dark:hover:text-neutral-200\">\n <ChevronDown\n aria-hidden=\"true\"\n className=\"h-3 w-3 transition-transform motion-reduce:transition-none [[data-state=open]>&]:rotate-180\"\n />\n {label}\n </CollapsibleTrigger>\n <CollapsibleContent className=\"mt-1\">\n <pre\n dir=\"auto\"\n className=\"max-h-60 overflow-auto rounded bg-neutral-100 p-2 text-xs whitespace-pre-wrap dark:bg-neutral-900\"\n >\n {text}\n </pre>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\ninterface ToolCallRowProps {\n toolCall: MCPToolCall;\n labels: MCPToolCallGroupLabels;\n onApprove?: MCPToolCallGroupProps['onApprove'];\n onDeny?: MCPToolCallGroupProps['onDeny'];\n onLinkClick?: MCPToolCallGroupProps['onLinkClick'];\n}\n\n/**\n * One call as a single compact line: icon, provider, name, status. Arguments\n * and output sit behind the row's own disclosure; approval controls and the\n * failure reason stay outside it so they are never hidden.\n *\n * The row animates its height in and out, so it must sit in an\n * `AnimatedPresence` for the exit to run.\n */\nfunction ToolCallRow({\n toolCall,\n labels,\n onApprove,\n onDeny,\n onLinkClick,\n}: ToolCallRowProps) {\n // `collapse` animates height, which `MotionConfig reducedMotion=\"user\"`\n // leaves running, so the row honours the preference itself.\n const prefersReducedMotion = usePrefersReducedMotion();\n const [acting, setActing] = React.useState(false);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const focusInActionsRef = React.useRef(false);\n const isAwaitingApproval = toolCall.status === 'awaiting-approval';\n // An `error` result is failure text, the same as `toolCall.error`.\n const result =\n toolCall.result?.type === 'error' ? null : formatResult(toolCall);\n const errorText = formatError(toolCall);\n const hasLinks = hasToolResultLinks(toolCall.result);\n const hasDetails =\n Boolean(toolCall.displayName) ||\n toolCall.parameters.length > 0 ||\n Boolean(result) ||\n hasLinks;\n\n const act = async (action: () => void | Promise<void>) => {\n setActing(true);\n try {\n await action();\n } catch {\n // The host reports failures; the row only re-enables its controls.\n } finally {\n setActing(false);\n }\n };\n\n // Browsers fire no blur when a focused element is removed, so when the\n // approval buttons go with focus in them, focus would drop to the body.\n // Keep it on the row instead.\n React.useLayoutEffect(() => {\n if (isAwaitingApproval || !focusInActionsRef.current) return;\n focusInActionsRef.current = false;\n if (!document.activeElement || document.activeElement === document.body) {\n triggerRef.current?.focus();\n }\n }, [isAwaitingApproval]);\n\n return (\n <Animated\n preset=\"collapse\"\n mode=\"presence\"\n enabled={!prefersReducedMotion}\n role=\"listitem\"\n data-slot=\"ai-tool-call-row\"\n // Clipped so the row does not spill past its box while the height travels.\n className=\"overflow-hidden text-sm\"\n >\n <div role=\"group\" aria-label={labels.callLabel(toolCall)}>\n <Collapsible defaultOpen={isAwaitingApproval && hasDetails}>\n <CollapsibleTrigger\n ref={triggerRef}\n className=\"focus-visible:ring-primary-500 flex w-full min-w-0 items-center gap-2 rounded px-1.5 py-1 text-start hover:bg-neutral-100 focus-visible:ring-2 focus-visible:outline-none focus-visible:ring-inset dark:hover:bg-neutral-800\"\n >\n <span\n aria-hidden=\"true\"\n className=\"flex h-3.5 w-3.5 shrink-0 items-center justify-center text-neutral-500 [&_svg]:h-3.5 [&_svg]:w-3.5\"\n >\n {toolCall.icon ?? <Wrench />}\n </span>\n {toolCall.serverName && (\n <span className=\"shrink-0 text-neutral-500 dark:text-neutral-400\">\n {toolCall.serverName}\n </span>\n )}\n {toolCall.displayName ? (\n // Host text may be in another script than the page; isolate it so\n // neutral characters such as a trailing \"/\" keep their place.\n <bdi className=\"min-w-0 truncate\">{toolCall.displayName}</bdi>\n ) : (\n <code className=\"min-w-0 truncate font-mono text-xs\">\n {toolCall.toolName}\n </code>\n )}\n {toolCall.status === 'running' && (\n <span aria-hidden=\"true\" className=\"shrink-0\">\n <Spinner size=\"xs\" />\n </span>\n )}\n <Badge\n variant={STATUS_BADGE_VARIANT[toolCall.status]}\n size=\"sm\"\n className=\"ms-auto shrink-0\"\n >\n {labels.status[toolCall.status]}\n </Badge>\n <ChevronDown\n aria-hidden=\"true\"\n className=\"h-3.5 w-3.5 shrink-0 text-neutral-400 transition-transform motion-reduce:transition-none [[data-state=open]>&]:rotate-180\"\n />\n </CollapsibleTrigger>\n\n <CollapsibleContent className=\"ms-6 mt-1 space-y-2 pb-1\">\n {toolCall.displayName && (\n <>\n {/* The row truncates the name; here it wraps so it can be read in full. */}\n <p\n data-slot=\"ai-tool-call-display-name\"\n className=\"break-words\"\n >\n <bdi>{toolCall.displayName}</bdi>\n </p>\n <p\n data-slot=\"ai-tool-call-id\"\n className=\"text-xs break-words text-neutral-600 dark:text-neutral-400\"\n >\n <span className=\"font-medium\">{labels.toolId}</span>{' '}\n <code className=\"font-mono\">{toolCall.toolName}</code>\n </p>\n </>\n )}\n {toolCall.result && hasLinks && (\n <ToolResultLinks\n result={toolCall.result}\n onLinkClick={onLinkClick}\n />\n )}\n {toolCall.parameters.length > 0 && (\n // JSON keeps its left-to-right order in RTL documents.\n <pre\n dir=\"ltr\"\n className=\"max-h-40 overflow-auto rounded bg-neutral-100 p-2 text-xs dark:bg-neutral-900\"\n >\n {formatParameters(toolCall)}\n </pre>\n )}\n {result && (\n <OutputDisclosure label={labels.showResult} text={result} />\n )}\n {errorText && (\n <OutputDisclosure label={labels.showError} text={errorText} />\n )}\n </CollapsibleContent>\n </Collapsible>\n\n {toolCall.status === 'error' && errorText && (\n <p className=\"ms-6 line-clamp-2 text-xs text-red-600 dark:text-red-400\">\n {errorText}\n </p>\n )}\n\n {isAwaitingApproval && (onApprove || onDeny) && (\n <div\n className=\"ms-6 mt-1 flex flex-wrap gap-2 pb-1\"\n onFocus={() => {\n focusInActionsRef.current = true;\n }}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n focusInActionsRef.current = false;\n }\n }}\n >\n {onApprove && (\n <>\n <Button\n size=\"sm\"\n onClick={() =>\n void act(() => onApprove(toolCall, { always: false }))\n }\n disabled={acting}\n isLoading={acting}\n >\n {labels.allowOnce}\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() =>\n void act(() => onApprove(toolCall, { always: true }))\n }\n disabled={acting}\n >\n {labels.allowAlways}\n </Button>\n </>\n )}\n {onDeny && (\n <Button\n size=\"sm\"\n variant=\"danger\"\n onClick={() => void act(() => onDeny(toolCall))}\n disabled={acting}\n >\n {labels.deny}\n </Button>\n )}\n </div>\n )}\n </div>\n </Animated>\n );\n}\n\n// ============================================================================\n// Group\n// ============================================================================\n\nexport interface MCPToolCallGroupProps {\n /** The calls in this run, in the order they were made. */\n toolCalls: MCPToolCall[];\n /**\n * Approve a call that is `awaiting-approval`. `always` is true for \"Always\n * allow\". The row shows a busy state until the returned promise settles;\n * report failures yourself (a toast, for example).\n */\n onApprove?: (\n toolCall: MCPToolCall,\n options: { always: boolean }\n ) => void | Promise<void>;\n /** Deny a call that is `awaiting-approval`. */\n onDeny?: (toolCall: MCPToolCall) => void | Promise<void>;\n /** Intercept clicks on a result's `link` and `resources`. */\n onLinkClick?: (link: MCPResourceLink) => void;\n /** Overrides for the English default strings. */\n labels?: MCPToolCallGroupLabelOverrides;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * The parts of {@link MCPToolCallGroupProps} a chat passes to every group.\n * `onLinkClick` comes from the chat's own prop of the same name.\n */\nexport type MCPToolCallGroupOptions = Omit<\n MCPToolCallGroupProps,\n 'toolCalls' | 'className' | 'onLinkClick'\n>;\n\n/**\n * A run of consecutive tool calls as one compact block. More than one call gets\n * a \"Used N tools\" header that collapses once every call has settled; calls\n * awaiting approval or that failed stay listed even while collapsed. A lone\n * call renders as a bare row.\n */\nexport function MCPToolCallGroup({\n toolCalls,\n onApprove,\n onDeny,\n onLinkClick,\n labels: labelOverrides,\n className,\n}: MCPToolCallGroupProps) {\n const labels = React.useMemo(\n () => resolveLabels(labelOverrides),\n [labelOverrides]\n );\n const listId = React.useId();\n const summary = summarize(toolCalls);\n const [focus, setFocus] = React.useState<GroupFocus>(null);\n const [expanded, setExpanded] = useAutoCollapse(\n summary.isActive,\n summary.signature,\n focus\n );\n\n // A lone call needs no header. The list keeps its place in the tree either\n // way, so the first row is not remounted when a second call arrives.\n const hasHeader = toolCalls.length > 1;\n const visibleCalls =\n !hasHeader || expanded ? toolCalls : toolCalls.filter(needsAttention);\n\n return (\n <div\n data-slot=\"ai-tool-call-group\"\n className={className}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) setFocus(null);\n }}\n >\n {hasHeader && (\n <button\n type=\"button\"\n aria-expanded={expanded}\n aria-controls={listId}\n onClick={() => setExpanded(!expanded)}\n onFocus={() => setFocus('header')}\n className=\"focus-visible:ring-primary-500 flex max-w-full items-center gap-2 rounded px-1.5 py-1 text-start text-sm text-neutral-600 hover:bg-neutral-100 focus-visible:ring-2 focus-visible:outline-none dark:text-neutral-400 dark:hover:bg-neutral-800\"\n >\n {summary.isActive ? (\n <span aria-hidden=\"true\" className=\"shrink-0\">\n <Spinner size=\"xs\" />\n </span>\n ) : (\n <Wrench aria-hidden=\"true\" className=\"h-3.5 w-3.5 shrink-0\" />\n )}\n <span className=\"font-medium\">\n {summary.isActive\n ? labels.running(summary.total)\n : labels.used(summary.total)}\n </span>\n {summary.awaitingApproval > 0 && (\n <Badge variant=\"warning\" size=\"sm\" className=\"shrink-0\">\n {labels.needsApproval(summary.awaitingApproval)}\n </Badge>\n )}\n {summary.failed > 0 && (\n <Badge variant=\"danger\" size=\"sm\" className=\"shrink-0\">\n {labels.failed(summary.failed)}\n </Badge>\n )}\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(\n 'h-3.5 w-3.5 shrink-0 transition-transform motion-reduce:transition-none',\n expanded && 'rotate-180'\n )}\n />\n </button>\n )}\n <div\n role=\"list\"\n id={listId}\n onFocus={() => setFocus('rows')}\n className={cn(\n hasHeader &&\n 'ms-3 border-s border-neutral-200 ps-2 dark:border-neutral-700'\n )}\n >\n <AnimatedPresence initial={false}>\n {visibleCalls.map((toolCall) => (\n <ToolCallRow\n key={toolCall.id}\n toolCall={toolCall}\n labels={labels}\n onApprove={onApprove}\n onDeny={onDeny}\n onLinkClick={onLinkClick}\n />\n ))}\n </AnimatedPresence>\n </div>\n <p role=\"status\" className=\"sr-only\">\n {/* A new approval request replaces the node even when the text is\n unchanged, so it is announced as an addition. */}\n <span key={summary.approvalKey}>\n {progressAnnouncement(summary, labels)}\n </span>\n </p>\n {/* Failures get their own region so progress updates never mask them. */}\n <p role=\"status\" className=\"sr-only\">\n {summary.failed > 0 ? labels.announceFailed(summary.failed) : ''}\n </p>\n </div>\n );\n}\n","/**\n * AI Message Component\n *\n * Renders AI chat messages with support for text, tool calls, and streaming.\n */\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport type {\n AIMessage,\n AIMessageContent,\n AIRenderMessageFooter,\n AIRenderTextContent,\n MCPResourceLink,\n MCPToolCall,\n} from './types';\nimport { MCPToolCallDisplay } from './MCPToolCall';\nimport {\n MCPToolCallGroup,\n type MCPToolCallGroupOptions,\n} from './MCPToolCallGroup';\nimport { SparklesIcon } from './icons';\nimport { CollapsiblePill } from './CollapsiblePill';\nimport { AudioPlayer } from '../AudioPlayer';\n\n// ============================================================================\n// Avatar Component\n// ============================================================================\n\nconst avatarVariants = cva(\n 'flex shrink-0 items-center justify-center rounded-full',\n {\n variants: {\n role: {\n user: 'bg-primary-100 text-primary-900 dark:bg-primary-900/50 dark:text-primary-300',\n assistant: 'bg-primary-800 text-white dark:bg-primary-800',\n system:\n 'bg-neutral-200 text-neutral-600 dark:bg-neutral-700 dark:text-neutral-400',\n tool: 'bg-amber-100 text-amber-700 dark:bg-amber-900/50 dark:text-amber-300',\n },\n size: {\n sm: 'h-6 w-6 text-xs',\n md: 'h-8 w-8 text-sm',\n lg: 'h-10 w-10 text-base',\n },\n },\n defaultVariants: {\n role: 'user',\n size: 'md',\n },\n }\n);\n\ninterface MessageAvatarProps extends VariantProps<typeof avatarVariants> {\n userName?: string;\n className?: string;\n}\n\nfunction MessageAvatar({\n role,\n size,\n userName,\n className,\n}: MessageAvatarProps) {\n const getInitials = (name?: string) => {\n if (!name) return '?';\n return name\n .split(' ')\n .map((n) => n[0])\n .join('')\n .substring(0, 2)\n .toUpperCase();\n };\n\n return (\n <div\n data-slot=\"ai-message-avatar\"\n className={cn(avatarVariants({ role, size }), className)}\n >\n {role === 'assistant' ? (\n <SparklesIcon size=\"md\" />\n ) : role === 'user' ? (\n <span className=\"font-medium\">{getInitials(userName)}</span>\n ) : role === 'system' ? (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\"\n />\n </svg>\n ) : (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.42 15.17L17.25 21A2.652 2.652 0 0021 17.25l-5.877-5.877M11.42 15.17l2.496-3.03c.317-.384.74-.626 1.208-.766M11.42 15.17l-4.655 5.653a2.548 2.548 0 11-3.586-3.586l6.837-5.63m5.108-.233c.55-.164 1.163-.188 1.743-.14a4.5 4.5 0 004.486-6.336l-3.276 3.277a3.004 3.004 0 01-2.25-2.25l3.276-3.276a4.5 4.5 0 00-6.336 4.486c.091 1.076-.071 2.264-.904 2.95l-.102.085m-1.745 1.437L5.909 7.5H4.5L2.25 3.75l1.5-1.5L7.5 4.5v1.409l4.26 4.26m-1.745 1.437l1.745-1.437m6.615 8.206L15.75 15.75M4.867 19.125h.008v.008h-.008v-.008z\"\n />\n </svg>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Typing Indicator\n// ============================================================================\n\nfunction AITypingIndicator({ className }: { className?: string }) {\n const dotStyle = {\n width: '6px',\n height: '6px',\n minWidth: '6px',\n minHeight: '6px',\n flexShrink: 0,\n };\n\n return (\n <div\n data-slot=\"ai-typing-indicator\"\n className={cn('inline-flex items-center justify-center gap-2', className)}\n >\n <span\n className=\"rounded-full bg-neutral-500 dark:bg-neutral-400\"\n style={{\n ...dotStyle,\n animation: 'typing-dot 1.4s infinite ease-in-out both',\n animationDelay: '-0.32s',\n }}\n />\n <span\n className=\"rounded-full bg-neutral-500 dark:bg-neutral-400\"\n style={{\n ...dotStyle,\n animation: 'typing-dot 1.4s infinite ease-in-out both',\n animationDelay: '-0.16s',\n }}\n />\n <span\n className=\"rounded-full bg-neutral-500 dark:bg-neutral-400\"\n style={{\n ...dotStyle,\n animation: 'typing-dot 1.4s infinite ease-in-out both',\n }}\n />\n <style>{`\n @keyframes typing-dot {\n 0%, 80%, 100% { opacity: 0.4; }\n 40% { opacity: 1; }\n }\n `}</style>\n </div>\n );\n}\n\n// ============================================================================\n// Thinking Block\n// ============================================================================\n\nfunction ThinkingBlock({\n text,\n streaming,\n defaultCollapsed = false,\n}: {\n text: string;\n streaming: boolean;\n defaultCollapsed?: boolean;\n}) {\n const startedAt = React.useRef(Date.now());\n const [elapsed, setElapsed] = React.useState<number | null>(null);\n // Set once on the streaming → done transition so the pill auto-collapses\n // when thinking finishes; the user can still re-expand it afterwards.\n const [autoCollapsed, setAutoCollapsed] = React.useState(false);\n const prevStreaming = React.useRef(streaming);\n\n React.useEffect(() => {\n if (prevStreaming.current && !streaming) {\n setElapsed(Math.round((Date.now() - startedAt.current) / 1000));\n setAutoCollapsed(true);\n } else if (!prevStreaming.current && streaming) {\n // Re-streaming in the same block: re-expand for the new thinking pass.\n startedAt.current = Date.now();\n setAutoCollapsed(false);\n }\n prevStreaming.current = streaming;\n }, [streaming]);\n\n const label = streaming\n ? 'Thinking'\n : elapsed !== null && elapsed > 0\n ? `Thought for ${elapsed}s`\n : 'Thought';\n\n const dot = streaming ? (\n <span\n aria-hidden=\"true\"\n className=\"inline-block h-1.5 w-1.5 animate-pulse rounded-full bg-violet-500 dark:bg-violet-400\"\n />\n ) : null;\n\n return (\n <div data-slot=\"ai-message-thinking\">\n <CollapsiblePill\n label={label}\n leadingIcon={dot}\n defaultOpen={!defaultCollapsed && !autoCollapsed}\n pillClassName=\"bg-violet-50 border-violet-200 text-violet-600 hover:bg-violet-100 dark:bg-violet-950/30 dark:border-violet-800 dark:text-violet-400 dark:hover:bg-violet-950/50 focus-visible:ring-violet-500\"\n >\n <div className=\"border-s-2 border-violet-200 ps-3 text-[13px] leading-relaxed text-neutral-600 italic dark:border-violet-700 dark:text-neutral-400\">\n {text}\n </div>\n </CollapsiblePill>\n </div>\n );\n}\n\n// ============================================================================\n// Content Block Renderer\n// ============================================================================\n\ninterface ContentBlockProps {\n content: AIMessageContent;\n onLinkClick?: (link: MCPResourceLink) => void;\n messageId: string;\n streaming: boolean;\n role: AIMessage['role'];\n renderTextContent?: AIRenderTextContent;\n}\n\nfunction ContentBlock({\n content,\n onLinkClick,\n messageId,\n streaming,\n role,\n renderTextContent,\n}: ContentBlockProps) {\n if (content.type === 'text' && content.text) {\n if (renderTextContent) {\n return (\n <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n {renderTextContent(content.text, { messageId, streaming, role })}\n </div>\n );\n }\n return (\n <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n <p className=\"whitespace-pre-wrap\">{content.text}</p>\n </div>\n );\n }\n\n if (content.type === 'tool_use' && content.toolCall) {\n return (\n <MCPToolCallDisplay\n toolCall={content.toolCall}\n onLinkClick={onLinkClick}\n defaultCollapsed={content.collapsed}\n />\n );\n }\n\n if (content.type === 'thinking' && content.text) {\n return (\n <ThinkingBlock\n text={content.text}\n streaming={streaming}\n defaultCollapsed={content.collapsed ?? false}\n />\n );\n }\n\n if (content.type === 'code' && content.text) {\n return (\n <pre\n data-slot=\"ai-message-code\"\n className=\"rounded-lg bg-neutral-900 p-3 text-sm dark:bg-neutral-950\"\n >\n <code\n className={content.language ? `language-${content.language}` : ''}\n >\n {content.text}\n </code>\n </pre>\n );\n }\n\n if (content.type === 'audio' && content.audioUrl) {\n // Guard against `javascript:` URLs, mirroring the image/file blocks.\n if (/^\\s*javascript:/i.test(content.audioUrl)) {\n return null;\n }\n return (\n <AudioPlayer\n src={content.audioUrl}\n title={content.text || 'Audio recording'}\n variant=\"waveform\"\n showTime\n showPlaybackRate\n fallbackDuration={content.duration}\n />\n );\n }\n\n if (content.type === 'video' && content.videoUrl) {\n // Guard against `javascript:` URLs, mirroring the audio/image/file blocks.\n if (/^\\s*javascript:/i.test(content.videoUrl)) {\n return null;\n }\n return (\n <video\n src={content.videoUrl}\n controls\n preload=\"metadata\"\n aria-label={content.text || 'Video recording'}\n className=\"my-1 max-h-80 w-full rounded-lg bg-black\"\n >\n {/* Recorded clips carry no caption track; present for a11y compliance. */}\n <track kind=\"captions\" />\n </video>\n );\n }\n\n if (content.type === 'image' && content.imageUrl) {\n const safeHref = /^\\s*javascript:/i.test(content.imageUrl)\n ? undefined\n : content.imageUrl;\n return (\n <a\n href={safeHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block w-fit transition-transform hover:scale-[1.02]\"\n aria-label={`View ${content.name || 'Uploaded image'}`}\n >\n <img\n src={content.imageUrl}\n alt={content.name || 'Uploaded image'}\n loading=\"lazy\"\n className=\"my-1 max-h-64 w-auto rounded-lg object-cover\"\n />\n </a>\n );\n }\n\n if (content.type === 'file') {\n const sizeLabel =\n typeof content.fileSize === 'number'\n ? formatFileSize(content.fileSize)\n : undefined;\n const card = (\n <div className=\"my-1 flex items-center gap-3 rounded-lg bg-neutral-100 p-3 transition-colors dark:bg-neutral-800\">\n <div className=\"rounded-lg bg-neutral-200 p-2 dark:bg-neutral-700\">\n <svg\n aria-hidden=\"true\"\n className=\"h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">\n {content.name || 'Document'}\n </p>\n {sizeLabel && <p className=\"text-xs opacity-70\">{sizeLabel}</p>}\n </div>\n </div>\n );\n\n if (content.fileUrl) {\n const safeFileHref = /^\\s*javascript:/i.test(content.fileUrl)\n ? undefined\n : content.fileUrl;\n return (\n <a\n href={safeFileHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block w-fit no-underline\"\n >\n {card}\n </a>\n );\n }\n return card;\n }\n\n return null;\n}\n\n/** Human-readable file size (e.g. \"1.2 MB\"). */\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n// ============================================================================\n// AI Message Component\n// ============================================================================\n\nconst messageVariants = cva('flex gap-3', {\n variants: {\n role: {\n user: 'flex-row-reverse',\n assistant: 'flex-row',\n system: 'flex-row justify-center',\n tool: 'flex-row',\n },\n },\n defaultVariants: {\n role: 'assistant',\n },\n});\n\nconst bubbleVariants = cva('rounded-2xl px-4 py-2.5 w-fit max-w-[85%]', {\n variants: {\n variant: {\n user: 'bg-primary-800 text-white dark:bg-primary-800',\n assistant:\n 'bg-neutral-100 text-neutral-900 dark:bg-neutral-800 dark:text-white',\n system:\n 'bg-neutral-100 text-neutral-600 dark:bg-neutral-800 dark:text-neutral-400 text-center text-sm max-w-[95%]',\n tool: 'bg-transparent p-0 max-w-full w-full',\n },\n },\n defaultVariants: {\n variant: 'assistant',\n },\n});\n\nexport interface ChatBubbleProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof bubbleVariants> {\n /** Show error styling (red border). */\n hasError?: boolean;\n /**\n * Optional inline-start border accent color. Used by multi-participant\n * surfaces (e.g. SuperChat) to tint a speaker's bubble; AI chat leaves it\n * unset.\n */\n accent?: string;\n}\n\n/**\n * The shared chat bubble shell. This is the single source of truth for how a\n * chat message bubble looks across the library (AI chat, SuperChat, etc.).\n * Presentational only — callers render their own content inside.\n */\nconst ChatBubble = React.forwardRef<HTMLDivElement, ChatBubbleProps>(\n (\n { className, variant, hasError, accent, style, children, ...props },\n ref\n ) => {\n return (\n <div\n ref={ref}\n data-slot=\"chat-bubble\"\n className={cn(\n bubbleVariants({ variant }),\n hasError && 'border border-red-300 dark:border-red-700',\n className\n )}\n style={\n accent\n ? { borderInlineStart: `3px solid ${accent}`, ...style }\n : style\n }\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nChatBubble.displayName = 'ChatBubble';\n\nexport interface AIMessageDisplayProps {\n /** The message to display */\n message: AIMessage;\n /** User name for user messages */\n userName?: string;\n /** Whether to show the avatar. `tool` messages never show one. */\n showAvatar?: boolean;\n /** Whether to show timestamp */\n showTimestamp?: boolean;\n /** Callback when a resource link is clicked */\n onLinkClick?: (link: MCPResourceLink) => void;\n /**\n * Optional renderer for `text` content blocks (e.g. Markdown). Called per\n * text block with `{ messageId, streaming, role }`. Host must sanitize.\n */\n renderTextContent?: AIRenderTextContent;\n /**\n * Optional renderer for a per-message footer shown below the bubble (e.g.\n * message action controls). Aligned with the message (right for user, left\n * for assistant).\n */\n renderMessageFooter?: AIRenderMessageFooter;\n /**\n * Opt in to grouped tool calls: each run of consecutive `tool_use` blocks\n * renders as one {@link MCPToolCallGroup} (compact rows under a \"Used N\n * tools\" header, with approval controls) instead of a pill per call. The\n * options carry the group's callbacks and labels.\n */\n toolCallGroup?: MCPToolCallGroupOptions;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Renders a message's content blocks in order. With `toolCallGroup`, each run\n * of consecutive `tool_use` blocks becomes one group, keyed by its first call\n * so the group keeps its state as later calls join it.\n */\nfunction MessageContentBlocks({\n message,\n streaming,\n onLinkClick,\n renderTextContent,\n toolCallGroup,\n}: {\n message: AIMessage;\n streaming: boolean;\n onLinkClick?: (link: MCPResourceLink) => void;\n renderTextContent?: AIRenderTextContent;\n toolCallGroup?: MCPToolCallGroupOptions;\n}) {\n const nodes: React.ReactNode[] = [];\n let run: MCPToolCall[] = [];\n const flushRun = () => {\n if (run.length === 0) return;\n nodes.push(\n <MCPToolCallGroup\n key={`tool-call-group-${run[0].id}`}\n toolCalls={run}\n onLinkClick={onLinkClick}\n {...toolCallGroup}\n />\n );\n run = [];\n };\n\n message.content.forEach((content, index) => {\n if (toolCallGroup && content.type === 'tool_use' && content.toolCall) {\n run.push(content.toolCall);\n return;\n }\n flushRun();\n nodes.push(\n <ContentBlock\n key={index}\n content={content}\n onLinkClick={onLinkClick}\n messageId={message.id}\n streaming={streaming}\n role={message.role}\n renderTextContent={renderTextContent}\n />\n );\n });\n flushRun();\n\n return <>{nodes}</>;\n}\n\n/**\n * Displays an AI chat message with support for text, tool calls, and streaming.\n */\nexport function AIMessageDisplay({\n message,\n userName,\n showAvatar = true,\n showTimestamp = false,\n onLinkClick,\n renderTextContent,\n renderMessageFooter,\n toolCallGroup,\n className,\n}: AIMessageDisplayProps) {\n const isStreaming = message.status === 'streaming';\n const hasContent = message.content.length > 0;\n const messageFooter = renderMessageFooter?.(message);\n const contentBlocks = (\n <MessageContentBlocks\n message={message}\n streaming={isStreaming}\n onLinkClick={onLinkClick}\n renderTextContent={renderTextContent}\n toolCallGroup={toolCallGroup}\n />\n );\n\n const formatTime = (timestamp: Date | string) => {\n const date = new Date(timestamp);\n return date.toLocaleTimeString(undefined, {\n hour: 'numeric',\n minute: '2-digit',\n });\n };\n\n // Tool messages render just the tool call: no bubble and no avatar. They sit\n // between the assistant's own messages, so a per-call avatar only repeats\n // who is speaking and pushes the conversation out of view.\n if (message.role === 'tool') {\n return (\n <div\n data-slot=\"ai-message\"\n className={cn(messageVariants({ role: message.role }), className)}\n >\n <div className=\"min-w-0 flex-1 space-y-2\">{contentBlocks}</div>\n </div>\n );\n }\n\n return (\n <div\n data-slot=\"ai-message\"\n className={cn(messageVariants({ role: message.role }), className)}\n >\n {showAvatar && message.role !== 'system' && (\n <MessageAvatar role={message.role} userName={userName} />\n )}\n\n <div\n className={cn(\n 'flex min-w-0 flex-1 flex-col gap-1',\n message.role === 'user' && 'items-end'\n )}\n >\n <ChatBubble\n data-slot=\"ai-message-bubble\"\n variant={message.role}\n hasError={message.status === 'error'}\n >\n {hasContent ? (\n <div className=\"space-y-3\">{contentBlocks}</div>\n ) : isStreaming ? (\n <div className=\"flex items-center justify-center\">\n <AITypingIndicator />\n </div>\n ) : null}\n </ChatBubble>\n\n {messageFooter != null && messageFooter !== false && (\n <div data-slot=\"ai-message-footer\" className=\"w-fit max-w-[85%]\">\n {messageFooter}\n </div>\n )}\n\n {showTimestamp && (\n <span\n data-slot=\"ai-message-timestamp\"\n className=\"px-2 text-xs text-neutral-500\"\n >\n {formatTime(message.timestamp)}\n </span>\n )}\n\n {message.status === 'error' && (\n <span className=\"px-2 text-xs text-red-500\">\n {message.role === 'user' ? 'Failed to send' : 'An error occurred'}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nexport { MessageAvatar, AITypingIndicator, ChatBubble, bubbleVariants };\n","/**\n * Jump-to-bottom — shared scroll-anchoring affordance for chat threads.\n *\n * Lives in the ChatComposer module (the shared chat infrastructure) so both\n * SuperChat and AIChat — and eventually Messaging — can use it without\n * reaching into another module's internals. Pairs with the\n * `useStickToBottom` hook (`src/hooks/useStickToBottom.ts`).\n */\n\nimport * as React from 'react';\nimport { ArrowDown as ArrowDownIcon } from 'lucide-react';\nimport { cn } from '../../utils/cn';\n\ninterface JumpToBottomButtonProps {\n /** Show the \"New messages\" hint — unseen messages arrived below. */\n hasNewMessages: boolean;\n onClick: () => void;\n /**\n * `data-slot` attribute — each chat surface keeps its own slot namespace\n * (e.g. `superchat-jump-to-bottom`, `ai-chat-jump-to-bottom`).\n */\n dataSlot: string;\n}\n\n/**\n * Floating control shown over the thread whenever the user has scrolled up:\n * more content exists below (possibly still streaming in), and activating the\n * button returns to the newest message and resumes bottom-pinning. Absolutely\n * positioned within the thread viewport wrapper — never `fixed`, so it stays\n * inside embedded layouts.\n */\nexport function JumpToBottomButton({\n hasNewMessages,\n onClick,\n dataSlot,\n}: JumpToBottomButtonProps) {\n return (\n <button\n type=\"button\"\n data-slot={dataSlot}\n onClick={onClick}\n aria-label={\n hasNewMessages ? 'New messages — scroll to bottom' : 'Scroll to bottom'\n }\n className={cn(\n 'absolute bottom-3 left-1/2 z-20 -translate-x-1/2',\n 'flex items-center gap-1.5 rounded-full border border-neutral-200 bg-white p-2 text-xs font-medium text-neutral-600 shadow-lg',\n 'hover:bg-neutral-50 hover:text-neutral-800',\n 'focus-visible:ring-primary-500 focus:outline-none focus-visible:ring-2',\n 'dark:border-neutral-700 dark:bg-neutral-800 dark:text-neutral-300 dark:hover:bg-neutral-700 dark:hover:text-neutral-100',\n hasNewMessages && 'ps-3'\n )}\n >\n {hasNewMessages && <span>New messages</span>}\n <ArrowDownIcon size={16} aria-hidden=\"true\" />\n </button>\n );\n}\n"]}
|
|
@@ -890,14 +890,15 @@ function MCPToolCallDisplay({
|
|
|
890
890
|
if (ms < 1e3) return `${ms}ms`;
|
|
891
891
|
return `${(ms / 1e3).toFixed(1)}s`;
|
|
892
892
|
};
|
|
893
|
-
const friendlyName = getToolFriendlyName(toolCall.toolName, toolCall.status);
|
|
893
|
+
const friendlyName = toolCall.displayName ? /* @__PURE__ */ jsx("bdi", { children: toolCall.displayName }) : getToolFriendlyName(toolCall.toolName, toolCall.status);
|
|
894
894
|
const durationLabel = formatDuration(toolCall.duration);
|
|
895
|
-
const paramSummary = getParameterSummary(
|
|
896
|
-
toolCall.toolName,
|
|
897
|
-
toolCall.parameters
|
|
898
|
-
);
|
|
895
|
+
const paramSummary = toolCall.displayName ? null : getParameterSummary(toolCall.toolName, toolCall.parameters);
|
|
899
896
|
const detailBit = toolCall.status === "success" ? durationLabel : paramSummary ?? durationLabel;
|
|
900
|
-
const pillLabel = detailBit ?
|
|
897
|
+
const pillLabel = detailBit ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
898
|
+
friendlyName,
|
|
899
|
+
" \xB7 ",
|
|
900
|
+
detailBit
|
|
901
|
+
] }) : friendlyName;
|
|
901
902
|
const hasParams = showParameters && toolCall.parameters.length > 0;
|
|
902
903
|
const hasBoxContent = Boolean(toolCall.result || toolCall.error || hasParams);
|
|
903
904
|
const isCompleted = toolCall.status === "success" || toolCall.status === "error";
|
|
@@ -994,7 +995,11 @@ var defaultMCPToolCallGroupLabels = {
|
|
|
994
995
|
denied: "Denied",
|
|
995
996
|
expired: "Expired"
|
|
996
997
|
},
|
|
997
|
-
callLabel: (toolCall) =>
|
|
998
|
+
callLabel: (toolCall) => {
|
|
999
|
+
const name = toolCall.displayName || toolCall.toolName;
|
|
1000
|
+
return toolCall.serverName ? `Tool call: ${name} from ${toolCall.serverName}` : `Tool call: ${name}`;
|
|
1001
|
+
},
|
|
1002
|
+
toolId: "Tool ID",
|
|
998
1003
|
showResult: "Show result",
|
|
999
1004
|
showError: "Show error",
|
|
1000
1005
|
allowOnce: "Allow once",
|
|
@@ -1127,7 +1132,7 @@ function ToolCallRow({
|
|
|
1127
1132
|
const result = toolCall.result?.type === "error" ? null : formatResult(toolCall);
|
|
1128
1133
|
const errorText = formatError(toolCall);
|
|
1129
1134
|
const hasLinks = hasToolResultLinks(toolCall.result);
|
|
1130
|
-
const hasDetails = toolCall.parameters.length > 0 || Boolean(result) || hasLinks;
|
|
1135
|
+
const hasDetails = Boolean(toolCall.displayName) || toolCall.parameters.length > 0 || Boolean(result) || hasLinks;
|
|
1131
1136
|
const act = async (action) => {
|
|
1132
1137
|
setActing(true);
|
|
1133
1138
|
try {
|
|
@@ -1170,7 +1175,11 @@ function ToolCallRow({
|
|
|
1170
1175
|
}
|
|
1171
1176
|
),
|
|
1172
1177
|
toolCall.serverName && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-neutral-500 dark:text-neutral-400", children: toolCall.serverName }),
|
|
1173
|
-
|
|
1178
|
+
toolCall.displayName ? (
|
|
1179
|
+
// Host text may be in another script than the page; isolate it so
|
|
1180
|
+
// neutral characters such as a trailing "/" keep their place.
|
|
1181
|
+
/* @__PURE__ */ jsx("bdi", { className: "min-w-0 truncate", children: toolCall.displayName })
|
|
1182
|
+
) : /* @__PURE__ */ jsx("code", { className: "min-w-0 truncate font-mono text-xs", children: toolCall.toolName }),
|
|
1174
1183
|
toolCall.status === "running" && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "shrink-0", children: /* @__PURE__ */ jsx(Spinner, { size: "xs" }) }),
|
|
1175
1184
|
/* @__PURE__ */ jsx(
|
|
1176
1185
|
Badge,
|
|
@@ -1192,6 +1201,28 @@ function ToolCallRow({
|
|
|
1192
1201
|
}
|
|
1193
1202
|
),
|
|
1194
1203
|
/* @__PURE__ */ jsxs(CollapsibleContent, { className: "ms-6 mt-1 space-y-2 pb-1", children: [
|
|
1204
|
+
toolCall.displayName && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1205
|
+
/* @__PURE__ */ jsx(
|
|
1206
|
+
"p",
|
|
1207
|
+
{
|
|
1208
|
+
"data-slot": "ai-tool-call-display-name",
|
|
1209
|
+
className: "break-words",
|
|
1210
|
+
children: /* @__PURE__ */ jsx("bdi", { children: toolCall.displayName })
|
|
1211
|
+
}
|
|
1212
|
+
),
|
|
1213
|
+
/* @__PURE__ */ jsxs(
|
|
1214
|
+
"p",
|
|
1215
|
+
{
|
|
1216
|
+
"data-slot": "ai-tool-call-id",
|
|
1217
|
+
className: "text-xs break-words text-neutral-600 dark:text-neutral-400",
|
|
1218
|
+
children: [
|
|
1219
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: labels.toolId }),
|
|
1220
|
+
" ",
|
|
1221
|
+
/* @__PURE__ */ jsx("code", { className: "font-mono", children: toolCall.toolName })
|
|
1222
|
+
]
|
|
1223
|
+
}
|
|
1224
|
+
)
|
|
1225
|
+
] }),
|
|
1195
1226
|
toolCall.result && hasLinks && /* @__PURE__ */ jsx(
|
|
1196
1227
|
ToolResultLinks,
|
|
1197
1228
|
{
|
|
@@ -1880,5 +1911,5 @@ function JumpToBottomButton({
|
|
|
1880
1911
|
}
|
|
1881
1912
|
|
|
1882
1913
|
export { AILogoIcon, AIMessageDisplay, AITypingIndicator, ChatBubble, ChevronIcon, CloseIcon, CollapsiblePill, JumpToBottomButton, MCPToolCallDisplay, MCPToolCallGroup, MessageAvatar, RefreshIcon, ResourceLink, SendIcon, SparklesIcon, SpinnerIcon, ToolStatusIcon, defaultMCPToolCallGroupLabels, getToolIcon };
|
|
1883
|
-
//# sourceMappingURL=chunk-
|
|
1884
|
-
//# sourceMappingURL=chunk-
|
|
1914
|
+
//# sourceMappingURL=chunk-NCC3VF6V.js.map
|
|
1915
|
+
//# sourceMappingURL=chunk-NCC3VF6V.js.map
|