@elizaos/plugin-computeruse 2.0.0-alpha.9 → 2.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/actions/desktop-handlers.d.ts +20 -0
  2. package/dist/actions/desktop-handlers.d.ts.map +1 -0
  3. package/dist/actions/desktop.d.ts +11 -0
  4. package/dist/actions/desktop.d.ts.map +1 -0
  5. package/dist/actions/helpers.d.ts +33 -0
  6. package/dist/actions/helpers.d.ts.map +1 -0
  7. package/dist/actions/use-computer.d.ts +3 -0
  8. package/dist/actions/use-computer.d.ts.map +1 -0
  9. package/dist/approval-manager.d.ts +29 -0
  10. package/dist/approval-manager.d.ts.map +1 -0
  11. package/dist/index.d.ts +30 -5
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +7125 -59
  14. package/dist/index.js.map +34 -1
  15. package/dist/osworld/action-converter.d.ts +35 -0
  16. package/dist/osworld/action-converter.d.ts.map +1 -0
  17. package/dist/osworld/adapter.d.ts +78 -0
  18. package/dist/osworld/adapter.d.ts.map +1 -0
  19. package/dist/osworld/types.d.ts +69 -0
  20. package/dist/osworld/types.d.ts.map +1 -0
  21. package/dist/platform/a11y.d.ts +36 -0
  22. package/dist/platform/a11y.d.ts.map +1 -0
  23. package/dist/platform/browser.d.ts +61 -0
  24. package/dist/platform/browser.d.ts.map +1 -0
  25. package/dist/platform/capabilities.d.ts +10 -0
  26. package/dist/platform/capabilities.d.ts.map +1 -0
  27. package/dist/platform/desktop.d.ts +33 -0
  28. package/dist/platform/desktop.d.ts.map +1 -0
  29. package/dist/platform/driver.d.ts +27 -0
  30. package/dist/platform/driver.d.ts.map +1 -0
  31. package/dist/platform/file-ops.d.ts +10 -0
  32. package/dist/platform/file-ops.d.ts.map +1 -0
  33. package/dist/platform/helpers.d.ts +61 -0
  34. package/dist/platform/helpers.d.ts.map +1 -0
  35. package/dist/platform/nut-driver.d.ts +19 -0
  36. package/dist/platform/nut-driver.d.ts.map +1 -0
  37. package/dist/platform/permissions.d.ts +21 -0
  38. package/dist/platform/permissions.d.ts.map +1 -0
  39. package/dist/platform/screenshot.d.ts +16 -0
  40. package/dist/platform/screenshot.d.ts.map +1 -0
  41. package/dist/platform/security.d.ts +12 -0
  42. package/dist/platform/security.d.ts.map +1 -0
  43. package/dist/platform/terminal.d.ts +38 -0
  44. package/dist/platform/terminal.d.ts.map +1 -0
  45. package/dist/platform/windows-list.d.ts +36 -0
  46. package/dist/platform/windows-list.d.ts.map +1 -0
  47. package/dist/providers/computer-state.d.ts +9 -0
  48. package/dist/providers/computer-state.d.ts.map +1 -0
  49. package/dist/register-routes.d.ts +2 -0
  50. package/dist/register-routes.d.ts.map +1 -0
  51. package/dist/register-routes.js +7111 -0
  52. package/dist/register-routes.js.map +34 -0
  53. package/dist/routes/computer-use-compat-routes.d.ts +29 -0
  54. package/dist/routes/computer-use-compat-routes.d.ts.map +1 -0
  55. package/dist/routes/computer-use-routes.d.ts +3 -0
  56. package/dist/routes/computer-use-routes.d.ts.map +1 -0
  57. package/dist/routes/sandbox-routes.d.ts +53 -0
  58. package/dist/routes/sandbox-routes.d.ts.map +1 -0
  59. package/dist/services/computer-use-service.d.ts +66 -0
  60. package/dist/services/computer-use-service.d.ts.map +1 -0
  61. package/dist/services/desktop-control.d.ts +35 -0
  62. package/dist/services/desktop-control.d.ts.map +1 -0
  63. package/dist/types.d.ts +273 -39
  64. package/dist/types.d.ts.map +1 -1
  65. package/package.json +100 -103
  66. package/dist/actions/click-coordinates.d.ts +0 -3
  67. package/dist/actions/click-coordinates.d.ts.map +0 -1
  68. package/dist/actions/click-coordinates.js +0 -139
  69. package/dist/actions/click-coordinates.js.map +0 -1
  70. package/dist/actions/click.d.ts +0 -3
  71. package/dist/actions/click.d.ts.map +0 -1
  72. package/dist/actions/click.js +0 -144
  73. package/dist/actions/click.js.map +0 -1
  74. package/dist/actions/drag.d.ts +0 -3
  75. package/dist/actions/drag.d.ts.map +0 -1
  76. package/dist/actions/drag.js +0 -145
  77. package/dist/actions/drag.js.map +0 -1
  78. package/dist/actions/get-applications.d.ts +0 -3
  79. package/dist/actions/get-applications.d.ts.map +0 -1
  80. package/dist/actions/get-applications.js +0 -105
  81. package/dist/actions/get-applications.js.map +0 -1
  82. package/dist/actions/get-window-tree.d.ts +0 -3
  83. package/dist/actions/get-window-tree.d.ts.map +0 -1
  84. package/dist/actions/get-window-tree.js +0 -133
  85. package/dist/actions/get-window-tree.js.map +0 -1
  86. package/dist/actions/open-application.d.ts +0 -3
  87. package/dist/actions/open-application.d.ts.map +0 -1
  88. package/dist/actions/open-application.js +0 -117
  89. package/dist/actions/open-application.js.map +0 -1
  90. package/dist/actions/press-key.d.ts +0 -3
  91. package/dist/actions/press-key.d.ts.map +0 -1
  92. package/dist/actions/press-key.js +0 -115
  93. package/dist/actions/press-key.js.map +0 -1
  94. package/dist/actions/screenshot.d.ts +0 -3
  95. package/dist/actions/screenshot.d.ts.map +0 -1
  96. package/dist/actions/screenshot.js +0 -99
  97. package/dist/actions/screenshot.js.map +0 -1
  98. package/dist/actions/scroll.d.ts +0 -3
  99. package/dist/actions/scroll.d.ts.map +0 -1
  100. package/dist/actions/scroll.js +0 -137
  101. package/dist/actions/scroll.js.map +0 -1
  102. package/dist/actions/type.d.ts +0 -3
  103. package/dist/actions/type.d.ts.map +0 -1
  104. package/dist/actions/type.js +0 -163
  105. package/dist/actions/type.js.map +0 -1
  106. package/dist/providers/available-apps.d.ts +0 -3
  107. package/dist/providers/available-apps.d.ts.map +0 -1
  108. package/dist/providers/available-apps.js +0 -28
  109. package/dist/providers/available-apps.js.map +0 -1
  110. package/dist/providers/computeruse-state.d.ts +0 -3
  111. package/dist/providers/computeruse-state.d.ts.map +0 -1
  112. package/dist/providers/computeruse-state.js +0 -36
  113. package/dist/providers/computeruse-state.js.map +0 -1
  114. package/dist/service-registry.d.ts +0 -7
  115. package/dist/service-registry.d.ts.map +0 -1
  116. package/dist/service-registry.js +0 -2
  117. package/dist/service-registry.js.map +0 -1
  118. package/dist/services/computeruse-service.d.ts +0 -36
  119. package/dist/services/computeruse-service.d.ts.map +0 -1
  120. package/dist/services/computeruse-service.js +0 -391
  121. package/dist/services/computeruse-service.js.map +0 -1
  122. package/dist/types.js +0 -11
  123. package/dist/types.js.map +0 -1
  124. package/dist/utils/params.d.ts +0 -5
  125. package/dist/utils/params.d.ts.map +0 -1
  126. package/dist/utils/params.js +0 -13
  127. package/dist/utils/params.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1,34 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IAgentRuntime, Plugin } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { z } from \"zod\";\nimport \"./service-registry.js\";\nimport { computeruseClickAction } from \"./actions/click.js\";\nimport { computeruseClickCoordinatesAction } from \"./actions/click-coordinates.js\";\nimport { computeruseDragAction } from \"./actions/drag.js\";\nimport { computeruseGetApplicationsAction } from \"./actions/get-applications.js\";\nimport { computeruseGetWindowTreeAction } from \"./actions/get-window-tree.js\";\nimport { computeruseOpenApplicationAction } from \"./actions/open-application.js\";\nimport { computerusePressKeyAction } from \"./actions/press-key.js\";\nimport { computeruseScreenshotAction } from \"./actions/screenshot.js\";\nimport { computeruseScrollAction } from \"./actions/scroll.js\";\nimport { computeruseTypeAction } from \"./actions/type.js\";\nimport { computeruseAvailableAppsProvider } from \"./providers/available-apps.js\";\nimport { computeruseStateProvider } from \"./providers/computeruse-state.js\";\nimport { ComputerUseService } from \"./services/computeruse-service.js\";\n\nexport * from \"./types.js\";\nexport { ComputerUseService };\n\nconst configSchema = z.object({\n\tCOMPUTERUSE_ENABLED: z\n\t\t.string()\n\t\t.optional()\n\t\t.default(\"false\")\n\t\t.transform((val) => val === \"true\"),\n\tCOMPUTERUSE_MODE: z.enum([\"auto\", \"local\", \"mcp\"]).optional().default(\"auto\"),\n\tCOMPUTERUSE_MCP_SERVER: z.string().optional().default(\"computeruse\"),\n});\n\nexport const computerusePlugin: Plugin = {\n\tname: \"plugin-computeruse\",\n\tdescription: \"Computer automation plugin (local or MCP)\",\n\tconfig: {\n\t\tCOMPUTERUSE_ENABLED: process.env.COMPUTERUSE_ENABLED ?? \"true\",\n\t\tCOMPUTERUSE_MODE: process.env.COMPUTERUSE_MODE ?? \"auto\",\n\t\tCOMPUTERUSE_MCP_SERVER: process.env.COMPUTERUSE_MCP_SERVER ?? \"computeruse\",\n\t},\n\tasync init(\n\t\tconfig: Record<string, string>,\n\t\t_runtime: IAgentRuntime,\n\t): Promise<void> {\n\t\tlogger.info(\"Initializing computeruse plugin\");\n\t\t// Auto-enable when the plugin is loaded — the plugin being present in\n\t\t// the runtime means the user toggled it on via the Capabilities UI.\n\t\tconst configWithDefaults = {\n\t\t\t...config,\n\t\t\tCOMPUTERUSE_ENABLED: config.COMPUTERUSE_ENABLED ?? \"true\",\n\t\t};\n\t\tconst validated = await configSchema.parseAsync(configWithDefaults);\n\t\tfor (const [key, value] of Object.entries(validated)) {\n\t\t\tprocess.env[key] = String(value);\n\t\t}\n\t},\n\tservices: [ComputerUseService],\n\tactions: [\n\t\tcomputeruseOpenApplicationAction,\n\t\tcomputeruseClickAction,\n\t\tcomputeruseClickCoordinatesAction,\n\t\tcomputeruseTypeAction,\n\t\tcomputerusePressKeyAction,\n\t\tcomputeruseScrollAction,\n\t\tcomputeruseDragAction,\n\t\tcomputeruseScreenshotAction,\n\t\tcomputeruseGetApplicationsAction,\n\t\tcomputeruseGetWindowTreeAction,\n\t],\n\tproviders: [computeruseStateProvider, computeruseAvailableAppsProvider],\n\tdependencies: [\"mcp\"],\n};\n\nexport default computerusePlugin;\n"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/actions/helpers.ts", "../src/actions/desktop-handlers.ts", "../src/actions/desktop.ts", "../src/actions/use-computer.ts", "../src/platform/helpers.ts", "../src/providers/computer-state.ts", "../src/routes/computer-use-compat-routes.ts", "../src/approval-manager.ts", "../src/platform/browser.ts", "../src/platform/capabilities.ts", "../src/platform/permissions.ts", "../src/platform/desktop.ts", "../src/platform/nut-driver.ts", "../src/platform/screenshot.ts", "../src/platform/driver.ts", "../src/platform/security.ts", "../src/platform/file-ops.ts", "../src/platform/terminal.ts", "../src/platform/windows-list.ts", "../src/services/computer-use-service.ts", "../src/services/desktop-control.ts", "../src/routes/computer-use-routes.ts", "../src/routes/sandbox-routes.ts", "../src/register-routes.ts", "../src/index.ts"],
4
+ "sourcesContent": [
5
+ "import type { ActionResult, HandlerOptions, Memory } from \"@elizaos/core\";\n\nexport interface NativeComputerUseResult {\n success: boolean;\n message?: string;\n error?: string;\n permissionDenied?: boolean;\n permissionType?: string;\n approvalRequired?: boolean;\n approvalId?: string;\n screenshot?: string;\n frontendScreenshot?: string;\n}\n\nexport function resolveActionParams<T>(\n message: Memory,\n options?: HandlerOptions,\n): T {\n const params = {\n ...(((options as Record<string, unknown> | undefined)?.parameters ??\n {}) as Record<string, unknown>),\n };\n\n if (message.content && typeof message.content === \"object\") {\n for (const [key, value] of Object.entries(\n message.content as Record<string, unknown>,\n )) {\n if (params[key] === undefined) {\n params[key] = value;\n }\n }\n }\n\n return params as T;\n}\n\nexport function buildScreenshotAttachment(args: {\n idPrefix: string;\n screenshot: string;\n title: string;\n description: string;\n}) {\n return {\n id: `${args.idPrefix}-${Date.now()}`,\n url: `data:image/png;base64,${args.screenshot}`,\n title: args.title,\n source: \"computeruse\",\n description: args.description,\n contentType: \"image\" as const,\n };\n}\n\nfunction sanitizeNativeResult<T extends NativeComputerUseResult>(\n result: T,\n): Record<string, unknown> {\n const sanitized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(result)) {\n if (key === \"screenshot\") {\n sanitized.hasScreenshot = typeof value === \"string\" && value.length > 0;\n continue;\n }\n if (key === \"frontendScreenshot\") {\n sanitized.hasFrontendScreenshot =\n typeof value === \"string\" && value.length > 0;\n continue;\n }\n sanitized[key] = value;\n }\n return sanitized;\n}\n\nexport function toComputerUseActionResult<T extends NativeComputerUseResult>({\n action,\n result,\n text,\n suppressClipboard = false,\n}: {\n action: string;\n result: T;\n text: string;\n suppressClipboard?: boolean;\n}): ActionResult {\n return {\n success: result.success,\n text,\n ...(result.success ? {} : { error: result.error ?? \"Computer-use failed\" }),\n data: {\n source: \"computeruse\",\n computerUseAction: action,\n result: sanitizeNativeResult(result),\n ...(suppressClipboard ? { suppressActionResultClipboard: true } : {}),\n },\n };\n}\n",
6
+ "/**\n * Pure handler functions for the DESKTOP parent action — one per op group.\n *\n * Each handler takes the live `ComputerUseService` instance and the resolved\n * params object, executes the underlying service call, and returns an\n * `ActionResult`. Format/text helpers stay local to this file so the parent\n * action only does dispatch.\n *\n * Logic preserved verbatim from the original per-verb actions\n * (file-action.ts / manage-window.ts / terminal-action.ts).\n */\n\nimport type { ActionResult, HandlerCallback } from \"@elizaos/core\";\nimport type { ComputerUseService } from \"../services/computer-use-service.js\";\nimport type {\n FileActionParams,\n FileActionResult,\n TerminalActionParams,\n TerminalActionResult,\n WindowActionParams,\n WindowActionResult,\n} from \"../types.js\";\nimport { toComputerUseActionResult } from \"./helpers.js\";\n\nexport const DESKTOP_OPS = [\"file\", \"window\", \"terminal\"] as const;\nexport type DesktopOp = (typeof DESKTOP_OPS)[number];\n\n// ── file op ───────────────────────────────────────────────────────────────\n\nconst MAX_FILE_RESULT_BYTES = 4000;\n\nfunction formatFileResultText(result: FileActionResult): string {\n if (!result.success) {\n return `File action failed: ${result.error}`;\n }\n return (\n result.content ??\n result.message ??\n (result.items\n ? `Listed ${result.count ?? result.items.length} filesystem entries.`\n : \"File action completed.\")\n );\n}\n\nexport async function handleFileOp(\n service: ComputerUseService,\n params: FileActionParams,\n callback?: HandlerCallback,\n): Promise<ActionResult> {\n if (!params.action) {\n if (callback) {\n await callback({ text: \"File op requires an action.\" });\n }\n return { success: false, error: \"Missing file action\" };\n }\n\n const result = await service.executeFileAction(params);\n const text = formatFileResultText(result).slice(0, MAX_FILE_RESULT_BYTES);\n\n if (callback) {\n await callback({ text });\n }\n\n return toComputerUseActionResult({\n action: params.action,\n result,\n text,\n });\n}\n\n// ── window op ─────────────────────────────────────────────────────────────\n\nconst MAX_WINDOW_ROWS = 50;\nconst MAX_WINDOW_ROW_BYTES = 120;\n\nfunction formatWindowResultText(\n params: WindowActionParams,\n result: WindowActionResult,\n): string {\n if (result.windows) {\n const windowText =\n result.windows.length > 0\n ? result.windows\n .map((w) => `[${w.id}] ${w.app} - ${w.title}`)\n .join(\"\\n\")\n : \"No visible windows found.\";\n return `Open windows:\\n${windowText}`;\n }\n\n return result.success\n ? (result.message ?? `Window ${params.action} completed.`)\n : result.approvalRequired\n ? `Window action is waiting for approval (${result.approvalId}).`\n : `Window action failed: ${result.error}`;\n}\n\nexport async function handleWindowOp(\n service: ComputerUseService,\n params: WindowActionParams,\n callback?: HandlerCallback,\n): Promise<ActionResult> {\n params.action ??= \"list\";\n\n const result = await service.executeWindowAction(params);\n const text = formatWindowResultText(params, result).slice(\n 0,\n MAX_WINDOW_ROWS * MAX_WINDOW_ROW_BYTES,\n );\n\n if (callback) {\n await callback({ text });\n }\n\n return toComputerUseActionResult({\n action: params.action,\n result,\n text,\n suppressClipboard: true,\n });\n}\n\n// ── terminal op ───────────────────────────────────────────────────────────\n\nconst MAX_TERMINAL_RESULT_BYTES = 4000;\nconst MAX_TERMINAL_TIMEOUT_SECONDS = 120;\nconst DEFAULT_TERMINAL_TIMEOUT_SECONDS = 30;\n\nfunction formatTerminalResultText(result: TerminalActionResult): string {\n return result.success\n ? (result.output ?? result.message ?? \"Terminal action completed.\")\n : `Terminal action failed: ${result.error}`;\n}\n\nexport async function handleTerminalOp(\n service: ComputerUseService,\n params: TerminalActionParams,\n callback?: HandlerCallback,\n): Promise<ActionResult> {\n if (!params.action && params.command) {\n params.action = \"execute\";\n }\n if (!params.action) {\n if (callback) {\n await callback({ text: \"Terminal op requires an action.\" });\n }\n return { success: false, error: \"Missing terminal action\" };\n }\n\n const timeoutSeconds = Math.min(\n Number(\n params.timeout ?? params.timeoutSeconds ?? DEFAULT_TERMINAL_TIMEOUT_SECONDS,\n ),\n MAX_TERMINAL_TIMEOUT_SECONDS,\n );\n const result = await service.executeTerminalAction({\n ...params,\n timeout: timeoutSeconds,\n });\n const text = formatTerminalResultText(result).slice(\n 0,\n MAX_TERMINAL_RESULT_BYTES,\n );\n\n if (callback) {\n await callback({ text });\n }\n\n return toComputerUseActionResult({\n action: params.action,\n result,\n text,\n suppressClipboard: true,\n });\n}\n",
7
+ "/**\n * DESKTOP parent action — single canonical action that dispatches to the\n * underlying desktop ops (file, window, terminal). Built on the same\n * `op`/`subaction` pattern as BROWSER. Future ops (`screenshot`, `ocr`,\n * `detect_elements`) are reserved in the enum but not yet implemented here —\n * canonical screen capture / OCR / element detection live on the\n * COMPUTER_USE action and stay there until intentionally moved.\n */\n\nimport {\n type Action,\n type ActionResult,\n dispatchSubaction,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n type Memory,\n readSubaction,\n type State,\n} from \"@elizaos/core\";\nimport type { ComputerUseService } from \"../services/computer-use-service.js\";\nimport type {\n FileActionParams,\n FileActionType,\n TerminalActionParams,\n TerminalActionType,\n WindowActionParams,\n WindowActionType,\n} from \"../types.js\";\nimport type { DesktopOp } from \"./desktop-handlers.js\";\nimport {\n DESKTOP_OPS,\n handleFileOp,\n handleTerminalOp,\n handleWindowOp,\n} from \"./desktop-handlers.js\";\nimport { resolveActionParams } from \"./helpers.js\";\n\n/**\n * Resolved DESKTOP payload. `action` semantics depend on the chosen `op` (file /\n * window / terminal); dispatch narrows before calling per-op handlers.\n */\ntype DesktopParameters = Omit<\n Partial<FileActionParams>,\n \"action\"\n> &\n Omit<Partial<WindowActionParams>, \"action\"> &\n Omit<Partial<TerminalActionParams>, \"action\"> & {\n op?: DesktopOp;\n subaction?: DesktopOp;\n action?:\n | FileActionType\n | WindowActionType\n | TerminalActionType;\n };\n\nexport const desktopAction: Action = {\n name: \"DESKTOP\",\n contexts: [\n \"files\",\n \"terminal\",\n \"code\",\n \"browser\",\n \"screen_time\",\n \"automation\",\n ],\n contextGate: {\n anyOf: [\n \"files\",\n \"terminal\",\n \"code\",\n \"browser\",\n \"screen_time\",\n \"automation\",\n ],\n },\n roleGate: { minRole: \"USER\" },\n similes: [\n // Old per-verb action names — preserved so older planner-side callers and\n // training data still resolve to DESKTOP.\n \"FILE_ACTION\",\n \"MANAGE_WINDOW\",\n \"TERMINAL_ACTION\",\n // Generic aliases.\n \"DESKTOP\",\n \"USE_DESKTOP\",\n \"DESKTOP_ACTION\",\n ],\n description:\n \"Single DESKTOP action — dispatches local desktop operations through the computer-use service. \" +\n \"Supported ops: `file` (read/write/edit/append/delete/exists/list/delete_directory/upload/download/list_downloads), \" +\n \"`window` (list/focus/switch/arrange/move/minimize/maximize/restore/close), and \" +\n \"`terminal` (connect/execute/read/type/clear/close/execute_command). \" +\n \"Future ops `screenshot`, `ocr`, and `detect_elements` are reserved on the enum but currently live on COMPUTER_USE.\",\n descriptionCompressed:\n \"Single DESKTOP action; op=file|window|terminal dispatches to the matching computer-use op (screenshot/ocr/detect_elements reserved).\",\n parameters: [\n {\n name: \"subaction\",\n description:\n \"Desktop operation group. Reserved future values: screenshot, ocr, detect_elements (currently on COMPUTER_USE).\",\n required: true,\n schema: {\n type: \"string\",\n enum: [...DESKTOP_OPS, \"screenshot\", \"ocr\", \"detect_elements\"],\n },\n },\n {\n name: \"action\",\n description:\n \"Sub-op verb for the chosen op (e.g. read/write for file, list/focus for window, execute for terminal).\",\n required: false,\n schema: { type: \"string\" },\n },\n // File params.\n {\n name: \"path\",\n description: \"Primary file or directory path (file op).\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"filepath\",\n description: \"Upstream alias for path (file op).\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"dirpath\",\n description: \"Upstream alias for directory path (file op).\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"content\",\n description: \"Content for write, append, or upload (file op).\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"encoding\",\n description: \"Encoding for read/download (file op).\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"oldText\",\n description: \"Replacement source text for edit (file op).\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"newText\",\n description: \"Replacement destination text for edit (file op).\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"old_text\",\n description: \"Upstream edit source text (file op).\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"new_text\",\n description: \"Upstream edit destination text (file op).\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"find\",\n description: \"Upstream alias for old_text (file op).\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"replace\",\n description: \"Upstream alias for new_text (file op).\",\n required: false,\n schema: { type: \"string\" },\n },\n // Window params.\n {\n name: \"windowId\",\n description: \"Window identifier (window op).\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"windowTitle\",\n description: \"Window title or app-name query (window op).\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"arrangement\",\n description:\n \"Layout for window arrange: tile, cascade, vertical, or horizontal.\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"x\",\n description: \"Target X coordinate for window move.\",\n required: false,\n schema: { type: \"number\" },\n },\n {\n name: \"y\",\n description: \"Target Y coordinate for window move.\",\n required: false,\n schema: { type: \"number\" },\n },\n // Terminal params.\n {\n name: \"command\",\n description: \"Shell command (terminal op execute / execute_command).\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"cwd\",\n description: \"Working directory for terminal connect or execute.\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"sessionId\",\n description: \"Terminal session ID alias.\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"session_id\",\n description: \"Upstream terminal session ID alias.\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"text\",\n description: \"Text for terminal type.\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"timeout\",\n description: \"Timeout in seconds (terminal op).\",\n required: false,\n schema: { type: \"number\", default: 30 },\n },\n {\n name: \"timeoutSeconds\",\n description: \"Alias for timeout (terminal op).\",\n required: false,\n schema: { type: \"number\", default: 30 },\n },\n ],\n validate: async (\n runtime: IAgentRuntime,\n _message: Memory,\n _state?: State,\n ): Promise<boolean> => {\n const service =\n (runtime.getService(\"computeruse\") as ComputerUseService) ??\n null;\n if (!service) return false;\n const caps = service.getCapabilities();\n return (\n caps.fileSystem.available ||\n caps.windowList.available ||\n caps.terminal.available\n );\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n options?: HandlerOptions,\n callback?: HandlerCallback,\n ): Promise<ActionResult> => {\n const service =\n (runtime.getService(\"computeruse\") as ComputerUseService) ??\n null;\n if (!service) {\n return { success: false, error: \"ComputerUseService not available\" };\n }\n\n const params = resolveActionParams<DesktopParameters>(message, options);\n const op = readSubaction<DesktopOp>(\n params as Record<string, unknown>,\n {\n allowed: DESKTOP_OPS,\n keys: [\"op\", \"subaction\"],\n },\n );\n\n return dispatchSubaction(\n op,\n {\n file: () => handleFileOp(service, params as FileActionParams, callback),\n window: () =>\n handleWindowOp(service, params as WindowActionParams, callback),\n terminal: () =>\n handleTerminalOp(service, params as TerminalActionParams, callback),\n },\n undefined,\n );\n },\n\n examples: [\n [\n {\n name: \"{{name1}}\",\n content: { text: \"Read the file /tmp/notes.md.\", source: \"chat\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Reading the file.\",\n actions: [\"DESKTOP\"],\n thought:\n \"Local filesystem read maps to DESKTOP subaction=file with action=read; the computer-use service handles the path.\",\n },\n },\n ],\n [\n {\n name: \"{{name1}}\",\n content: {\n text: \"List the open windows on my desktop.\",\n source: \"chat\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Listing windows.\",\n actions: [\"DESKTOP\"],\n thought:\n \"Window inventory routes to DESKTOP subaction=window with action=list.\",\n },\n },\n ],\n [\n {\n name: \"{{name1}}\",\n content: {\n text: \"Run `git status` in the repo terminal session.\",\n source: \"chat\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Running the command.\",\n actions: [\"DESKTOP\"],\n thought:\n \"Shell execution belongs on DESKTOP subaction=terminal with action=execute and command='git status'.\",\n },\n },\n ],\n ],\n};\n",
8
+ "import type {\n Action,\n ActionResult,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport type { ComputerUseService } from \"../services/computer-use-service.js\";\nimport type { ComputerActionResult, DesktopActionParams } from \"../types.js\";\nimport {\n buildScreenshotAttachment,\n resolveActionParams,\n toComputerUseActionResult,\n} from \"./helpers.js\";\n\nconst MOCK_SCREENSHOT_BASE64 =\n \"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO7+R4QAAAAASUVORK5CYII=\";\n\nfunction isTruthyEnv(value: string | undefined): boolean {\n if (!value) return false;\n const normalized = value.trim().toLowerCase();\n return (\n normalized === \"1\" ||\n normalized === \"true\" ||\n normalized === \"yes\" ||\n normalized === \"on\" ||\n normalized === \"fixture\"\n );\n}\n\nfunction isFalsyEnv(value: string | undefined): boolean {\n if (!value) return false;\n const normalized = value.trim().toLowerCase();\n return (\n normalized === \"0\" ||\n normalized === \"false\" ||\n normalized === \"no\" ||\n normalized === \"off\"\n );\n}\n\nfunction isMockComputerUseEnabled(): boolean {\n const explicit = process.env.ELIZA_TEST_COMPUTERUSE_BACKEND;\n if (isFalsyEnv(explicit)) return false;\n if (isTruthyEnv(explicit)) return true;\n return process.env.ELIZA_BENCHMARK_USE_MOCKS === \"1\";\n}\n\nfunction getComputerUseService(\n runtime: IAgentRuntime,\n): ComputerUseService | null {\n return (\n (runtime.getService(\"computeruse\") as ComputerUseService) ?? null\n );\n}\n\nfunction buildMockDesktopResult(\n params: DesktopActionParams,\n): ComputerActionResult {\n if (params.action === \"detect_elements\") {\n return {\n success: true,\n message: \"Mocked desktop element scan completed.\",\n screenshot: MOCK_SCREENSHOT_BASE64,\n data: {\n elements: [\n {\n role: \"textbox\",\n label: \"Amount\",\n coordinate: params.coordinate ?? [640, 360],\n },\n ],\n },\n };\n }\n\n if (params.action === \"ocr\") {\n return {\n success: true,\n message: \"Mocked OCR completed.\",\n screenshot: MOCK_SCREENSHOT_BASE64,\n data: { text: \"Expense form\\nAmount\\n$42.50\" },\n };\n }\n\n const message =\n params.action === \"screenshot\"\n ? \"Mocked desktop screenshot captured.\"\n : `Mocked desktop action completed: ${params.action}.`;\n\n return {\n success: true,\n message,\n screenshot: MOCK_SCREENSHOT_BASE64,\n data: {\n mocked: true,\n action: params.action,\n coordinate: params.coordinate,\n startCoordinate: params.startCoordinate,\n text: params.text,\n key: params.key,\n modifiers: params.modifiers,\n button: params.button,\n clicks: params.clicks,\n scrollDirection: params.scrollDirection,\n scrollAmount: params.scrollAmount,\n },\n };\n}\n\nfunction formatDesktopResultText(\n params: DesktopActionParams,\n result: ComputerActionResult,\n): string {\n if (!result.success) {\n if (result.permissionDenied) {\n return `Desktop action failed because ${result.permissionType} permission is missing.`;\n }\n if (result.approvalRequired) {\n return `Desktop action \"${params.action}\" is waiting for approval (${result.approvalId}).`;\n }\n return `Desktop action failed: ${result.error}`;\n }\n\n if (params.action === \"screenshot\") {\n return result.message ?? \"Here is the current screen.\";\n }\n return result.message ?? `Completed ${params.action}.`;\n}\n\nasync function deliverResult(\n params: DesktopActionParams,\n result: ComputerActionResult,\n text: string,\n callback?: HandlerCallback,\n): Promise<void> {\n if (!callback) return;\n await callback({\n text,\n ...(result.screenshot\n ? {\n attachments: [\n buildScreenshotAttachment({\n idPrefix: \"computeruse-screenshot\",\n screenshot: result.screenshot,\n title: \"Screenshot\",\n description:\n params.action === \"screenshot\"\n ? \"Current screen capture\"\n : `Screen capture after ${params.action}`,\n }),\n ],\n }\n : {}),\n });\n}\n\nexport const useComputerAction: Action = {\n name: \"COMPUTER_USE\",\n contexts: [\n \"browser\",\n \"files\",\n \"terminal\",\n \"screen_time\",\n \"automation\",\n \"admin\",\n ],\n contextGate: {\n anyOf: [\n \"browser\",\n \"files\",\n \"terminal\",\n \"screen_time\",\n \"automation\",\n \"admin\",\n ],\n },\n roleGate: { minRole: \"OWNER\" },\n similes: [\n \"USE_COMPUTER\",\n \"CONTROL_COMPUTER\",\n \"COMPUTER_ACTION\",\n \"DESKTOP_ACTION\",\n \"CLICK\",\n \"CLICK_SCREEN\",\n \"TYPE_TEXT\",\n \"PRESS_KEY\",\n \"KEY_COMBO\",\n \"SCROLL_SCREEN\",\n \"MOVE_MOUSE\",\n \"DRAG\",\n \"MOUSE_CLICK\",\n \"CLICK_WITH_MODIFIERS\",\n \"TAKE_SCREENSHOT\",\n \"CAPTURE_SCREEN\",\n \"SEE_SCREEN\",\n ],\n description:\n \"computer_use:\\n purpose: Canonical cross-platform computer-use action for real desktop interaction on macOS, Linux, and Windows when direct computer operation is required.\\n guidance: Take a screenshot before acting. After each desktop action, the result includes a screenshot when available. Use this standard plugin action, not a LifeOps wrapper, for Finder/Desktop/native-app/browser/file/terminal workflows on the owner's machine.\\n actions: screenshot/click/click_with_modifiers/double_click/right_click/mouse_move/type/key/key_combo/scroll/drag/detect_elements/ocr.\",\n descriptionCompressed:\n \"Canonical cross-platform desktop control: screenshot/click/modified click/double/right/move/type/key/key_combo/scroll/drag/detect_elements/ocr.\",\n routingHint:\n \"desktop/computer/native-app/Finder/window screenshots or control -> COMPUTER_USE; never invent takeScreenshot\",\n\n parameters: [\n {\n name: \"action\",\n description: \"Desktop action to perform.\",\n required: true,\n schema: {\n type: \"string\",\n enum: [\n \"screenshot\",\n \"click\",\n \"click_with_modifiers\",\n \"double_click\",\n \"right_click\",\n \"mouse_move\",\n \"type\",\n \"key\",\n \"key_combo\",\n \"scroll\",\n \"drag\",\n \"detect_elements\",\n \"ocr\",\n ],\n },\n },\n {\n name: \"coordinate\",\n description: \"Target [x, y] pixel coordinate.\",\n required: false,\n schema: { type: \"array\", items: { type: \"number\" } },\n },\n {\n name: \"startCoordinate\",\n description: \"Start [x, y] pixel coordinate for drag.\",\n required: false,\n schema: { type: \"array\", items: { type: \"number\" } },\n },\n {\n name: \"text\",\n description: \"Text to type.\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"modifiers\",\n description:\n \"Modifier keys to hold during click_with_modifiers, e.g. ['cmd', 'shift'] or ['ctrl'].\",\n required: false,\n schema: { type: \"array\", items: { type: \"string\" } },\n },\n {\n name: \"key\",\n description: \"Single key or combo string depending on action.\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"button\",\n description: \"Mouse button for click_with_modifiers.\",\n required: false,\n schema: { type: \"string\", enum: [\"left\", \"middle\", \"right\"] },\n },\n {\n name: \"clicks\",\n description: \"Number of clicks for click_with_modifiers.\",\n required: false,\n schema: { type: \"number\", minimum: 1, maximum: 5 },\n },\n {\n name: \"scrollDirection\",\n description: \"Scroll direction.\",\n required: false,\n schema: { type: \"string\", enum: [\"up\", \"down\", \"left\", \"right\"] },\n },\n {\n name: \"scrollAmount\",\n description: \"Scroll tick count.\",\n required: false,\n schema: { type: \"number\", minimum: 1, maximum: 20, default: 3 },\n },\n ],\n validate: async (\n runtime: IAgentRuntime,\n _message: Memory,\n _state?: State,\n ): Promise<boolean> => {\n const service = getComputerUseService(runtime);\n return service !== null || isMockComputerUseEnabled();\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n options?: HandlerOptions,\n callback?: HandlerCallback,\n ): Promise<ActionResult> => {\n const params = resolveActionParams<DesktopActionParams>(message, options);\n params.action ??= \"screenshot\";\n\n const service = getComputerUseService(runtime);\n if (!service) {\n if (!isMockComputerUseEnabled()) {\n return { success: false, error: \"ComputerUseService not available\" };\n }\n const mockResult = buildMockDesktopResult(params);\n const text = formatDesktopResultText(params, mockResult);\n await deliverResult(params, mockResult, text, callback);\n return toComputerUseActionResult({\n action: params.action,\n result: mockResult,\n text,\n suppressClipboard: true,\n });\n }\n\n const result = await service.executeDesktopAction(params);\n const text = formatDesktopResultText(params, result);\n await deliverResult(params, result, text, callback);\n return toComputerUseActionResult({\n action: params.action,\n result,\n text,\n suppressClipboard: true,\n });\n },\n\n examples: [\n [\n {\n name: \"{{name1}}\",\n content: { text: \"Take a screenshot of my screen.\", source: \"chat\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Capturing the screen.\",\n actions: [\"COMPUTER_USE\"],\n thought:\n \"User asked for a screenshot of the desktop; COMPUTER_USE action=screenshot is the canonical handler.\",\n },\n },\n ],\n [\n {\n name: \"{{name1}}\",\n content: { text: \"Click the Send button on the page.\", source: \"chat\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Clicking Send.\",\n actions: [\"COMPUTER_USE\"],\n thought:\n \"Direct UI click on a desktop control belongs in COMPUTER_USE action=click; pass the coordinate of the visible button.\",\n },\n },\n ],\n [\n {\n name: \"{{name1}}\",\n content: {\n text: \"Type 'Hello team' in the focused text box.\",\n source: \"chat\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Typing the text.\",\n actions: [\"COMPUTER_USE\"],\n thought:\n \"Keyboard input into the focused field maps to COMPUTER_USE action=type with the literal text payload.\",\n },\n },\n ],\n [\n {\n name: \"{{name1}}\",\n content: { text: \"Press Cmd+Shift+T to reopen the closed tab.\", source: \"chat\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Sending the key combo.\",\n actions: [\"COMPUTER_USE\"],\n thought:\n \"A multi-key shortcut routes to COMPUTER_USE action=key_combo with key='cmd+shift+t' so the desktop service triggers it as a single chord.\",\n },\n },\n ],\n ],\n};\n",
9
+ "/**\n * Shared platform utilities for computer-use plugin.\n *\n * Ported from coasty-ai/open-computer-use desktop-automation.ts\n * and eliza sandbox-routes.ts (Apache 2.0 / MIT).\n */\n\nimport { execFileSync, execSync } from \"node:child_process\";\nimport { platform } from \"node:os\";\n\n// ── Command Execution ───────────────────────────────────────────────────────\n\n/**\n * Check if a CLI tool is available on the system.\n */\nexport function commandExists(cmd: string): boolean {\n try {\n const which = platform() === \"win32\" ? \"where\" : \"which\";\n execSync(`${which} ${cmd}`, { stdio: \"ignore\", timeout: 3000 });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Run a command via execFileSync (no shell) with timeout.\n * Throws on non-zero exit or timeout.\n */\nexport function runCommand(\n command: string,\n args: string[],\n timeout: number,\n): string {\n const result = execFileSync(command, args, {\n timeout,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n encoding: \"utf-8\",\n });\n return result;\n}\n\n/**\n * Run a command via execFileSync, returning the raw Buffer stdout.\n */\nexport function runCommandBuffer(\n command: string,\n args: string[],\n timeout: number,\n): void {\n execFileSync(command, args, {\n timeout,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n}\n\n/**\n * Run a shell command string (uses shell). Use sparingly — prefer runCommand.\n */\nexport function runShellCommand(cmd: string, timeout: number): string {\n return execSync(cmd, {\n encoding: \"utf-8\",\n timeout,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n}\n\n// ── Input Validation ────────────────────────────────────────────────────────\n\n/**\n * Coerce a value to a safe integer to prevent shell injection via coordinates.\n * Ported from open-computer-use desktop-automation.ts validateInt().\n */\nexport function validateInt(val: unknown): number {\n if (val === null || val === undefined) {\n throw new Error(`Invalid numeric value: ${String(val)}`);\n }\n if (typeof val === \"string\" && val.trim().length === 0) {\n throw new Error(`Invalid numeric value: ${String(val)}`);\n }\n const n = Number(val);\n if (!Number.isFinite(n)) {\n throw new Error(`Invalid numeric value: ${String(val)}`);\n }\n return Math.round(n);\n}\n\n/**\n * Validate and clamp coordinates within screen bounds.\n */\nexport function validateCoordinate(\n x: number,\n y: number,\n maxX: number,\n maxY: number,\n): [number, number] {\n const safeX = Math.max(0, Math.min(validateInt(x), maxX));\n const safeY = Math.max(0, Math.min(validateInt(y), maxY));\n return [safeX, safeY];\n}\n\n/**\n * Validate a window/process identifier before interpolating it into a\n * platform shell command (AppleScript / PowerShell). Rejects anything that\n * is not a decimal integer or `0x`-prefixed hex, preventing escape out of\n * the surrounding script literal.\n */\nexport function validateWindowId(windowId: string): string {\n if (typeof windowId !== \"string\") {\n throw new Error(`Invalid windowId: must be string, got ${typeof windowId}`);\n }\n const trimmed = windowId.trim();\n if (!/^[0-9]+$/.test(trimmed) && !/^0x[0-9a-f]+$/i.test(trimmed)) {\n throw new Error(\n `Invalid windowId: must be numeric or 0x-prefixed hex, got \"${windowId}\"`,\n );\n }\n return trimmed;\n}\n\n/**\n * Validate text input length to prevent abuse.\n */\nexport function validateText(text: string, maxLength = 4096): string {\n if (typeof text !== \"string\") {\n throw new Error(\"Text must be a string\");\n }\n if (text.length > maxLength) {\n throw new Error(`Text too long: ${text.length} chars (max ${maxLength})`);\n }\n return text;\n}\n\n// ── AppleScript Escaping ────────────────────────────────────────────────────\n\n/**\n * Safely escape a string for use inside an AppleScript double-quoted literal.\n * Ported from open-computer-use desktop-automation.ts.\n */\nexport function escapeAppleScript(value: string): string {\n return `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n}\n\n// ── xdotool Key Validation ──────────────────────────────────────────────────\n\n/**\n * Known-safe xdotool key names. Whitelist approach from open-computer-use.\n */\nconst SAFE_XDOTOOL_KEYS = new Set([\n \"Return\",\n \"Tab\",\n \"Escape\",\n \"BackSpace\",\n \"Delete\",\n \"space\",\n \"Home\",\n \"End\",\n \"Page_Up\",\n \"Page_Down\",\n \"Left\",\n \"Right\",\n \"Up\",\n \"Down\",\n \"F1\",\n \"F2\",\n \"F3\",\n \"F4\",\n \"F5\",\n \"F6\",\n \"F7\",\n \"F8\",\n \"F9\",\n \"F10\",\n \"F11\",\n \"F12\",\n \"shift\",\n \"Shift_L\",\n \"Shift_R\",\n \"ctrl\",\n \"Control_L\",\n \"Control_R\",\n \"alt\",\n \"Alt_L\",\n \"Alt_R\",\n \"super\",\n \"Super_L\",\n \"Super_R\",\n \"Meta_L\",\n \"Meta_R\",\n \"plus\",\n \"minus\",\n \"period\",\n \"comma\",\n \"slash\",\n \"backslash\",\n \"bracketleft\",\n \"bracketright\",\n \"semicolon\",\n \"apostrophe\",\n \"grave\",\n \"equal\",\n]);\n\n/**\n * Validate a key name for xdotool. Must be a known key name or a single\n * printable ASCII character.\n */\nexport function safeXdotoolKey(key: string): string {\n const trimmed = key.trim();\n if (SAFE_XDOTOOL_KEYS.has(trimmed)) {\n return trimmed;\n }\n // Single printable ASCII character\n if (\n trimmed.length === 1 &&\n trimmed.charCodeAt(0) >= 32 &&\n trimmed.charCodeAt(0) <= 126\n ) {\n return trimmed;\n }\n throw new Error(\n `Invalid key for xdotool: \"${trimmed}\". Use a known key name or single ASCII character.`,\n );\n}\n\n/**\n * Safe keypress pattern for general validation (matches sandbox-routes).\n */\nconst SAFE_KEYPRESS_PATTERN = /^[A-Za-z0-9+_ .,:-]+$/;\n\nexport function validateKeypress(keys: string, maxLength = 128): string {\n if (typeof keys !== \"string\" || keys.length === 0) {\n throw new Error(\"Key input must be a non-empty string\");\n }\n if (keys.length > maxLength) {\n throw new Error(\n `Key input too long: ${keys.length} chars (max ${maxLength})`,\n );\n }\n if (!SAFE_KEYPRESS_PATTERN.test(keys)) {\n throw new Error(\n `Key input contains invalid characters: \"${keys}\". Only alphanumerics, +, _, ., ,, :, - and space allowed.`,\n );\n }\n return keys;\n}\n\n// ── Key Normalization ───────────────────────────────────────────────────────\n\nconst CANONICAL_KEY_ALIASES: Record<string, string> = {\n esc: \"escape\",\n escape: \"escape\",\n return: \"enter\",\n enter: \"enter\",\n spacebar: \"space\",\n space: \"space\",\n tab: \"tab\",\n up: \"up\",\n down: \"down\",\n left: \"left\",\n right: \"right\",\n pageup: \"pageup\",\n pagedown: \"pagedown\",\n home: \"home\",\n end: \"end\",\n del: \"delete\",\n delete: \"delete\",\n backspace: \"backspace\",\n};\n\nfunction normalizeKeyAlias(key: string): string {\n if (typeof key !== \"string\" || key.trim().length === 0) {\n throw new Error(\"Key input must be a non-empty string\");\n }\n return key\n .trim()\n .toLowerCase()\n .replace(/^arrow/, \"\")\n .replace(/[\\s_-]+/g, \"\");\n}\n\nexport function canonicalKeyName(key: string): string {\n const normalized = normalizeKeyAlias(key);\n if (/^f\\d{1,2}$/.test(normalized)) {\n return normalized;\n }\n return CANONICAL_KEY_ALIASES[normalized] ?? normalized;\n}\n\nconst CLICLICK_KEY_NAMES: Record<string, string> = {\n escape: \"esc\",\n enter: \"return\",\n up: \"arrow-up\",\n down: \"arrow-down\",\n left: \"arrow-left\",\n right: \"arrow-right\",\n pageup: \"page-up\",\n pagedown: \"page-down\",\n backspace: \"delete\",\n delete: \"fwd-delete\",\n home: \"home\",\n end: \"end\",\n space: \"space\",\n tab: \"tab\",\n};\n\nexport function toCliclickKeyName(key: string): string {\n const canonical = canonicalKeyName(key);\n return CLICLICK_KEY_NAMES[canonical] ?? canonical;\n}\n\nconst XDOTOOL_KEY_NAMES: Record<string, string> = {\n escape: \"Escape\",\n enter: \"Return\",\n tab: \"Tab\",\n backspace: \"BackSpace\",\n delete: \"Delete\",\n space: \"space\",\n home: \"Home\",\n end: \"End\",\n pageup: \"Page_Up\",\n pagedown: \"Page_Down\",\n left: \"Left\",\n right: \"Right\",\n up: \"Up\",\n down: \"Down\",\n};\n\nexport function toXdotoolKeyName(key: string): string {\n const canonical = canonicalKeyName(key);\n if (/^f\\d{1,2}$/.test(canonical)) {\n return canonical.toUpperCase();\n }\n return XDOTOOL_KEY_NAMES[canonical] ?? key.trim();\n}\n\nconst WINDOWS_SEND_KEYS: Record<string, string> = {\n escape: \"{ESC}\",\n enter: \"{ENTER}\",\n tab: \"{TAB}\",\n backspace: \"{BACKSPACE}\",\n delete: \"{DELETE}\",\n home: \"{HOME}\",\n end: \"{END}\",\n pageup: \"{PGUP}\",\n pagedown: \"{PGDN}\",\n left: \"{LEFT}\",\n right: \"{RIGHT}\",\n up: \"{UP}\",\n down: \"{DOWN}\",\n space: \" \",\n};\n\nexport function toWindowsSendKey(key: string): string {\n const canonical = canonicalKeyName(key);\n if (/^f\\d{1,2}$/.test(canonical)) {\n return `{${canonical.toUpperCase()}}`;\n }\n return WINDOWS_SEND_KEYS[canonical] ?? key.trim();\n}\n\n// ── Platform Detection ──────────────────────────────────────────────────────\n\nexport type PlatformOS = \"darwin\" | \"linux\" | \"win32\";\n\nexport function currentPlatform(): PlatformOS {\n const os = platform();\n if (os === \"darwin\" || os === \"linux\" || os === \"win32\") {\n return os;\n }\n throw new Error(`Unsupported platform: ${os}`);\n}\n",
10
+ "/**\n * ComputerStateProvider — injects current computer state into the LLM context.\n *\n * Provides platform info, screen dimensions, available capabilities,\n * and a summary of recent actions so the agent has continuity.\n */\n\nimport type {\n IAgentRuntime,\n Memory,\n Provider,\n ProviderResult,\n State,\n} from \"@elizaos/core\";\nimport { currentPlatform } from \"../platform/helpers.js\";\nimport type { ComputerUseService } from \"../services/computer-use-service.js\";\n\nexport const computerStateProvider: Provider = {\n name: \"computerState\",\n description:\n \"Current computer state: platform, screen size, available tools, recent computer-use actions, and approval queue\",\n\n descriptionCompressed:\n \"Platform, screen size, tools, recent actions, approval queue.\",\n contexts: [\"browser\", \"files\", \"terminal\", \"automation\", \"admin\"],\n contextGate: {\n anyOf: [\"browser\", \"files\", \"terminal\", \"automation\", \"admin\"],\n },\n cacheStable: false,\n cacheScope: \"turn\",\n get: async (\n runtime: IAgentRuntime,\n _message: Memory,\n _state: State,\n ): Promise<ProviderResult> => {\n try {\n const service = runtime.getService(\"computeruse\") as\n | ComputerUseService\n | undefined;\n if (!service) {\n return { text: \"\" };\n }\n\n const caps = service.getCapabilities();\n const screen = service.getScreenDimensions();\n const recent = service.getRecentActions();\n const approvals = service.getApprovalSnapshot();\n\n const text = `\\`\\`\\`json\\n${JSON.stringify(\n {\n computer_use: {\n platform: currentPlatform(),\n screen: { width: screen.width, height: screen.height },\n approvals: {\n mode: approvals.mode,\n pendingCount: approvals.pendingCount,\n pending: approvals.pendingApprovals\n .slice(0, 5)\n .map((approval) => ({\n id: approval.id,\n command: approval.command,\n })),\n },\n capabilities: {\n screenshot: caps.screenshot.available\n ? caps.screenshot.tool\n : \"unavailable\",\n mouseKeyboard: caps.computerUse.available\n ? caps.computerUse.tool\n : \"unavailable\",\n browser: caps.browser.available\n ? caps.browser.tool\n : \"unavailable\",\n windowList: caps.windowList.available\n ? caps.windowList.tool\n : \"unavailable\",\n terminal: caps.terminal.available\n ? caps.terminal.tool\n : \"unavailable\",\n fileSystem: caps.fileSystem.available\n ? caps.fileSystem.tool\n : \"unavailable\",\n },\n recentActions: recent.slice(-5).map((entry) => ({\n action: entry.action,\n success: entry.success,\n })),\n },\n },\n null,\n 2,\n )}\\n\\`\\`\\``;\n\n return {\n text,\n values: {\n platform: currentPlatform(),\n screenWidth: screen.width,\n screenHeight: screen.height,\n },\n data: {\n approvals: {\n ...approvals,\n pendingApprovals: approvals.pendingApprovals.slice(0, 5),\n },\n capabilities: caps,\n screenSize: screen,\n recentActions: recent.slice(-5),\n },\n };\n } catch {\n return { text: \"\", values: {}, data: {} };\n }\n },\n};\n",
11
+ "/**\n * Computer-use compat HTTP routes — moved out of\n * `packages/app-core/src/api/computer-use-compat-routes.ts`.\n *\n * Exposes:\n * GET /api/computer-use/approvals (auth)\n * GET /api/computer-use/approvals/stream (token-or-header auth, SSE)\n * POST /api/computer-use/approval-mode (sensitive auth)\n * POST /api/computer-use/approvals/:id (sensitive auth)\n *\n * Service injection: pulls the running ComputerUseService off the agent\n * runtime via `runtime.getService(\"computeruse\")`. Uses a structural\n * `ComputerUseServiceLike` interface so the runtime type stays loose.\n */\n\nimport type http from \"node:http\";\nimport crypto from \"node:crypto\";\n\ntype CompatRuntimeState = {\n current: {\n getService?: (name: string) => unknown;\n } | null;\n};\n\nconst MAX_BODY_BYTES = 1_048_576;\n\nfunction firstHeaderValue(value: string | string[] | undefined): string | null {\n if (typeof value === \"string\") return value;\n return Array.isArray(value) && typeof value[0] === \"string\" ? value[0] : null;\n}\n\nfunction isTrustedLocalRequest(\n req: Pick<http.IncomingMessage, \"headers\" | \"socket\">,\n): boolean {\n const remoteAddress = req.socket?.remoteAddress?.trim().toLowerCase();\n if (\n remoteAddress &&\n remoteAddress !== \"127.0.0.1\" &&\n remoteAddress !== \"::1\" &&\n remoteAddress !== \"0:0:0:0:0:0:0:1\" &&\n remoteAddress !== \"::ffff:127.0.0.1\" &&\n remoteAddress !== \"::ffff:0:127.0.0.1\"\n ) {\n return false;\n }\n\n const origin = firstHeaderValue(req.headers.origin);\n if (origin) {\n try {\n const parsed = new URL(origin);\n if (parsed.hostname !== \"localhost\" && parsed.hostname !== \"127.0.0.1\") {\n return false;\n }\n } catch {\n return false;\n }\n }\n\n return true;\n}\n\nfunction tokenMatches(expected: string, provided: string): boolean {\n const expectedBuf = Buffer.from(expected);\n const providedBuf = Buffer.from(provided);\n return (\n expectedBuf.length === providedBuf.length &&\n crypto.timingSafeEqual(expectedBuf, providedBuf)\n );\n}\n\nfunction getCompatApiToken(): string | null {\n return process.env.ELIZA_API_TOKEN?.trim() || null;\n}\n\nfunction getProvidedApiToken(\n req: Pick<http.IncomingMessage, \"headers\">,\n): string | null {\n const authHeader = firstHeaderValue(req.headers.authorization)\n ?.slice(0, 1024)\n ?.trim();\n if (authHeader) {\n const match = /^Bearer\\s{1,8}(.+)$/i.exec(authHeader);\n if (match?.[1]) return match[1].trim();\n }\n\n return (\n firstHeaderValue(req.headers[\"x-eliza-token\"]) ??\n firstHeaderValue(req.headers[\"x-elizaos-token\"]) ??\n firstHeaderValue(req.headers[\"x-api-key\"]) ??\n firstHeaderValue(req.headers[\"x-api-token\"])\n )?.trim() || null;\n}\n\nfunction sendJsonResponse(\n res: http.ServerResponse,\n status: number,\n body: unknown,\n): void {\n if (res.headersSent) return;\n res.statusCode = status;\n res.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n res.end(JSON.stringify(body));\n}\n\nfunction sendJsonErrorResponse(\n res: http.ServerResponse,\n status: number,\n message: string,\n): void {\n sendJsonResponse(res, status, { error: message });\n}\n\nfunction ensureCompatSensitiveRouteAuthorized(\n req: Pick<http.IncomingMessage, \"headers\" | \"socket\">,\n res: http.ServerResponse,\n): boolean {\n if (isTrustedLocalRequest(req)) return true;\n\n const expected = getCompatApiToken();\n const provided = getProvidedApiToken(req);\n if (expected && provided && tokenMatches(expected, provided)) {\n return true;\n }\n\n sendJsonErrorResponse(res, expected ? 401 : 403, \"Unauthorized\");\n return false;\n}\n\nasync function ensureRouteAuthorized(\n req: Pick<http.IncomingMessage, \"headers\" | \"socket\">,\n res: http.ServerResponse,\n _state?: CompatRuntimeState,\n): Promise<boolean> {\n if (isTrustedLocalRequest(req)) return true;\n\n const expected = getCompatApiToken();\n const provided = getProvidedApiToken(req);\n if (expected && provided && tokenMatches(expected, provided)) {\n return true;\n }\n\n sendJsonErrorResponse(res, 401, \"Unauthorized\");\n return false;\n}\n\nasync function readCompatJsonBody(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n): Promise<Record<string, unknown> | null> {\n const preParsed = (req as { body?: unknown }).body;\n if (preParsed && typeof preParsed === \"object\" && !Array.isArray(preParsed)) {\n return preParsed as Record<string, unknown>;\n }\n\n const chunks: Buffer[] = [];\n let totalBytes = 0;\n try {\n for await (const chunk of req) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n totalBytes += buf.length;\n if (totalBytes > MAX_BODY_BYTES) {\n req.destroy();\n sendJsonErrorResponse(res, 413, \"Request body too large\");\n return null;\n }\n chunks.push(buf);\n }\n } catch {\n sendJsonErrorResponse(res, 400, \"Invalid request body\");\n return null;\n }\n\n if (chunks.length === 0) return {};\n\n try {\n const parsed = JSON.parse(Buffer.concat(chunks).toString(\"utf8\")) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n sendJsonErrorResponse(res, 400, \"Invalid JSON body\");\n return null;\n }\n return parsed as Record<string, unknown>;\n } catch {\n sendJsonErrorResponse(res, 400, \"Invalid JSON body\");\n return null;\n }\n}\n\ntype ComputerUseApprovalMode =\n | \"full_control\"\n | \"smart_approve\"\n | \"approve_all\"\n | \"off\";\n\ntype ComputerUseApprovalSnapshot = {\n mode: ComputerUseApprovalMode;\n pendingCount: number;\n pendingApprovals: Array<{\n id: string;\n command: string;\n parameters: Record<string, unknown>;\n requestedAt: string;\n }>;\n};\n\ntype ComputerUseApprovalResolution = {\n id: string;\n command: string;\n approved: boolean;\n cancelled: boolean;\n mode: ComputerUseApprovalMode;\n requestedAt: string;\n resolvedAt: string;\n reason?: string;\n};\n\ntype ComputerUseServiceLike = {\n getApprovalSnapshot(): ComputerUseApprovalSnapshot;\n setApprovalMode(mode: ComputerUseApprovalMode): ComputerUseApprovalMode;\n resolveApproval(\n id: string,\n approved: boolean,\n reason?: string,\n ): ComputerUseApprovalResolution | null;\n subscribeApprovals?(\n listener: (snapshot: ComputerUseApprovalSnapshot) => void,\n ): () => void;\n};\n\nconst VALID_APPROVAL_MODES: ComputerUseApprovalMode[] = [\n \"full_control\",\n \"smart_approve\",\n \"approve_all\",\n \"off\",\n];\n\nconst EMPTY_APPROVAL_SNAPSHOT: ComputerUseApprovalSnapshot = {\n mode: \"full_control\",\n pendingCount: 0,\n pendingApprovals: [],\n};\n\nfunction isApprovalMode(value: string): value is ComputerUseApprovalMode {\n return VALID_APPROVAL_MODES.includes(value as ComputerUseApprovalMode);\n}\n\nfunction getComputerUseService(\n state: CompatRuntimeState,\n): ComputerUseServiceLike | null {\n const runtime = state.current as {\n getService?: (name: string) => unknown;\n } | null;\n if (!runtime?.getService) {\n return null;\n }\n\n const service = runtime.getService(\"computeruse\");\n if (!service || typeof service !== \"object\") {\n return null;\n }\n\n const candidate = service as Partial<ComputerUseServiceLike>;\n if (\n typeof candidate.getApprovalSnapshot !== \"function\" ||\n typeof candidate.setApprovalMode !== \"function\" ||\n typeof candidate.resolveApproval !== \"function\"\n ) {\n return null;\n }\n\n return candidate as ComputerUseServiceLike;\n}\n\nfunction isStreamAuthorized(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n url: URL,\n): boolean {\n const expectedToken = getCompatApiToken();\n if (!expectedToken) {\n return true;\n }\n\n const headerToken = getProvidedApiToken(req);\n const providedToken = url.searchParams.get(\"token\")?.trim();\n if (\n (headerToken && tokenMatches(expectedToken, headerToken)) ||\n (providedToken && tokenMatches(expectedToken, providedToken))\n ) {\n return true;\n }\n\n res.writeHead(401, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Unauthorized\" }));\n return false;\n}\n\nfunction writeSseEvent(\n res: http.ServerResponse,\n payload: Record<string, unknown>,\n): void {\n res.write(`data: ${JSON.stringify(payload)}\\n\\n`);\n}\n\nexport async function handleComputerUseCompatRoutes(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n state: CompatRuntimeState,\n): Promise<boolean> {\n const method = (req.method ?? \"GET\").toUpperCase();\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n\n if (!url.pathname.startsWith(\"/api/computer-use/\")) {\n return false;\n }\n\n if (\n method === \"GET\" &&\n url.pathname === \"/api/computer-use/approvals/stream\"\n ) {\n if (!isStreamAuthorized(req, res, url)) {\n return true;\n }\n\n const service = getComputerUseService(state);\n if (!service) {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n });\n writeSseEvent(res, {\n type: \"snapshot\",\n snapshot: EMPTY_APPROVAL_SNAPSHOT,\n });\n res.end();\n return true;\n }\n\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n });\n\n writeSseEvent(res, {\n type: \"snapshot\",\n snapshot: service.getApprovalSnapshot(),\n });\n\n const heartbeat = setInterval(() => {\n res.write(\": heartbeat\\n\\n\");\n }, 15_000);\n if (typeof heartbeat === \"object\" && \"unref\" in heartbeat) {\n heartbeat.unref();\n }\n\n const unsubscribe = service.subscribeApprovals?.((snapshot) => {\n writeSseEvent(res, {\n type: \"snapshot\",\n snapshot,\n });\n });\n\n const cleanup = () => {\n clearInterval(heartbeat);\n unsubscribe?.();\n };\n\n req.on(\"close\", cleanup);\n req.on(\"aborted\", cleanup);\n return true;\n }\n\n if (method === \"GET\" && url.pathname === \"/api/computer-use/approvals\") {\n if (!(await ensureRouteAuthorized(req, res, state))) {\n return true;\n }\n\n const service = getComputerUseService(state);\n if (!service) {\n sendJsonResponse(res, 200, EMPTY_APPROVAL_SNAPSHOT);\n return true;\n }\n\n sendJsonResponse(res, 200, service.getApprovalSnapshot());\n return true;\n }\n\n if (method === \"POST\" && url.pathname === \"/api/computer-use/approval-mode\") {\n if (!ensureCompatSensitiveRouteAuthorized(req, res)) {\n return true;\n }\n\n const body = await readCompatJsonBody(req, res);\n if (!body) {\n return true;\n }\n\n if (typeof body.mode !== \"string\" || !isApprovalMode(body.mode)) {\n sendJsonErrorResponse(\n res,\n 400,\n \"mode must be one of full_control, smart_approve, approve_all, off\",\n );\n return true;\n }\n\n const service = getComputerUseService(state);\n if (!service) {\n sendJsonErrorResponse(res, 404, \"Computer use service not available\");\n return true;\n }\n\n sendJsonResponse(res, 200, {\n mode: service.setApprovalMode(body.mode),\n });\n return true;\n }\n\n const match = url.pathname.match(/^\\/api\\/computer-use\\/approvals\\/([^/]+)$/);\n if (method === \"POST\" && match) {\n if (!ensureCompatSensitiveRouteAuthorized(req, res)) {\n return true;\n }\n\n const body = await readCompatJsonBody(req, res);\n if (!body) {\n return true;\n }\n\n if (typeof body.approved !== \"boolean\") {\n sendJsonErrorResponse(res, 400, \"approved must be a boolean\");\n return true;\n }\n\n const service = getComputerUseService(state);\n if (!service) {\n sendJsonErrorResponse(res, 404, \"Computer use service not available\");\n return true;\n }\n\n const approvalId = match[1];\n if (approvalId === undefined) {\n sendJsonErrorResponse(res, 400, \"Missing approval id\");\n return true;\n }\n\n const resolution = service.resolveApproval(\n decodeURIComponent(approvalId),\n body.approved,\n typeof body.reason === \"string\" ? body.reason : undefined,\n );\n\n if (!resolution) {\n sendJsonErrorResponse(res, 404, \"Approval not found\");\n return true;\n }\n\n sendJsonResponse(res, 200, resolution);\n return true;\n }\n\n sendJsonErrorResponse(res, 404, \"Not found\");\n return true;\n}\n\n/**\n * Runtime plugin route adapter. The runtime plugin route bridge passes\n * `(req, res, runtime)` — wrap into a CompatRuntimeState stub for the\n * shared dispatcher.\n */\nexport function computerUseRouteHandler() {\n return async (\n req: unknown,\n res: unknown,\n runtime: unknown,\n ): Promise<void> => {\n const httpReq = req as http.IncomingMessage;\n const httpRes = res as http.ServerResponse;\n const state = { current: runtime } as CompatRuntimeState;\n await handleComputerUseCompatRoutes(httpReq, httpRes, state);\n };\n}\n",
12
+ "import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type {\n ApprovalMode,\n ApprovalResolution,\n ApprovalSnapshot,\n PendingApproval,\n} from \"./types.js\";\n\nconst VALID_APPROVAL_MODES: ApprovalMode[] = [\n \"full_control\",\n \"smart_approve\",\n \"approve_all\",\n \"off\",\n];\n\nconst SAFE_COMMANDS = new Set<string>([\n \"screenshot\",\n \"browser_screenshot\",\n \"browser_state\",\n \"browser_info\",\n \"browser_get_dom\",\n \"browser_dom\",\n \"browser_get_clickables\",\n \"browser_clickables\",\n \"browser_get_context\",\n \"browser_list_tabs\",\n \"browser_wait\",\n \"file_read\",\n \"file_exists\",\n \"directory_list\",\n \"file_list_downloads\",\n \"file_download\",\n \"terminal_read\",\n \"terminal_connect\",\n \"list_windows\",\n]);\n\ntype ApprovalDecision = {\n approved: boolean;\n cancelled: boolean;\n reason?: string;\n};\n\ntype PendingApprovalRecord = PendingApproval & {\n resolve: (result: ApprovalDecision) => void;\n};\n\ntype ApprovalListener = (snapshot: ApprovalSnapshot) => void;\n\nexport function isApprovalMode(value: string): value is ApprovalMode {\n return VALID_APPROVAL_MODES.includes(value as ApprovalMode);\n}\n\nexport class ComputerUseApprovalManager {\n private mode: ApprovalMode = \"full_control\";\n private pending = new Map<string, PendingApprovalRecord>();\n private listeners = new Set<ApprovalListener>();\n private readonly configPath = path.join(\n os.homedir(),\n \".eliza\",\n \"computer-use-approval.json\",\n );\n\n constructor() {\n this.loadConfig();\n }\n\n getMode(): ApprovalMode {\n return this.mode;\n }\n\n setMode(mode: string): ApprovalMode {\n if (isApprovalMode(mode)) {\n this.mode = mode;\n this.saveConfig();\n this.emit();\n }\n return this.mode;\n }\n\n shouldAutoApprove(command: string): boolean {\n switch (this.mode) {\n case \"full_control\":\n return true;\n case \"smart_approve\":\n return SAFE_COMMANDS.has(command);\n case \"approve_all\":\n case \"off\":\n return false;\n }\n }\n\n isDenyAll(): boolean {\n return this.mode === \"off\";\n }\n\n requestApproval(\n command: string,\n parameters: Record<string, unknown> = {},\n ): Promise<ApprovalDecision> {\n const id = `approval_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n const requestedAt = new Date().toISOString();\n\n return new Promise((resolve) => {\n this.pending.set(id, {\n id,\n command,\n parameters,\n requestedAt,\n resolve,\n });\n this.emit();\n });\n }\n\n getSnapshot(): ApprovalSnapshot {\n return {\n mode: this.mode,\n pendingCount: this.pending.size,\n pendingApprovals: Array.from(this.pending.values()).map(\n ({ id, command, parameters, requestedAt }) => ({\n id,\n command,\n parameters,\n requestedAt,\n }),\n ),\n };\n }\n\n resolveApproval(\n id: string,\n approved: boolean,\n reason?: string,\n ): ApprovalResolution | null {\n const pending = this.pending.get(id);\n if (!pending) {\n return null;\n }\n\n this.pending.delete(id);\n pending.resolve({ approved, cancelled: false, reason });\n this.emit();\n\n return {\n id: pending.id,\n command: pending.command,\n approved,\n cancelled: false,\n mode: this.mode,\n requestedAt: pending.requestedAt,\n resolvedAt: new Date().toISOString(),\n ...(reason ? { reason } : {}),\n };\n }\n\n cancelAll(reason?: string): void {\n for (const pending of this.pending.values()) {\n pending.resolve({ approved: false, cancelled: true, reason });\n }\n this.pending.clear();\n this.emit();\n }\n\n subscribe(listener: ApprovalListener): () => void {\n this.listeners.add(listener);\n listener(this.getSnapshot());\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private loadConfig(): void {\n try {\n const raw = fs.readFileSync(this.configPath, \"utf8\");\n const parsed = JSON.parse(raw) as { mode?: unknown };\n if (typeof parsed.mode === \"string\" && isApprovalMode(parsed.mode)) {\n this.mode = parsed.mode;\n }\n } catch {\n // Keep the default mode when the config file is missing or invalid.\n }\n }\n\n private saveConfig(): void {\n try {\n fs.mkdirSync(path.dirname(this.configPath), { recursive: true });\n fs.writeFileSync(\n this.configPath,\n JSON.stringify({ mode: this.mode }, null, 2),\n \"utf8\",\n );\n } catch {\n // Ignore persistence failures; approval mode still applies in-memory.\n }\n }\n\n private emit(): void {\n const snapshot = this.getSnapshot();\n for (const listener of this.listeners) {\n listener(snapshot);\n }\n }\n}\n",
13
+ "/**\n * Browser automation via Puppeteer Core + Chrome DevTools Protocol.\n *\n * Ported from coasty-ai/open-computer-use browser-automation.ts (Apache 2.0).\n *\n * Uses puppeteer-core (not full puppeteer) to avoid bundling Chromium.\n * Auto-detects installed Chrome, Edge, or Brave at launch.\n * Each session uses a temp user data directory to prevent conflicts.\n */\n\nimport { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { mkdtemp, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type {\n BrowserInfo,\n BrowserState,\n BrowserTab,\n ClickableElement,\n} from \"../types.js\";\nimport { currentPlatform } from \"./helpers.js\";\n\n// Lazy-load puppeteer-core so the plugin still loads if it's not installed\nlet puppeteer: typeof import(\"puppeteer-core\") | null = null;\ntype Browser = import(\"puppeteer-core\").Browser;\ntype Page = import(\"puppeteer-core\").Page;\n\nasync function getPuppeteer() {\n if (!puppeteer) {\n try {\n puppeteer = await import(\"puppeteer-core\");\n } catch {\n throw new Error(\n \"puppeteer-core is required for browser automation. Install via: bun add puppeteer-core\",\n );\n }\n }\n return puppeteer;\n}\n\n// ── State ───────────────────────────────────────────────────────────────────\n\nlet browser: Browser | null = null;\nlet activePage: Page | null = null;\nlet tempUserDataDir: string | null = null;\nlet browserHeadless = false;\nconst BROWSER_LAUNCH_ATTEMPTS = 3;\n\nexport function setBrowserRuntimeOptions(options: {\n headless?: boolean;\n}): void {\n if (typeof options.headless === \"boolean\") {\n browserHeadless = options.headless;\n }\n}\n\nfunction envFlagEnabled(value: string | undefined): boolean {\n if (!value) return false;\n const normalized = value.trim().toLowerCase();\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\";\n}\n\n// ── Browser Detection ───────────────────────────────────────────────────────\n\nfunction detectBrowserPath(): string | null {\n const os = currentPlatform();\n const candidates: string[] = [];\n\n if (os === \"darwin\") {\n candidates.push(\n \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n \"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge\",\n \"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser\",\n \"/Applications/Chromium.app/Contents/MacOS/Chromium\",\n );\n } else if (os === \"linux\") {\n candidates.push(\n \"/usr/bin/google-chrome\",\n \"/usr/bin/google-chrome-stable\",\n \"/usr/bin/chromium-browser\",\n \"/usr/bin/chromium\",\n \"/usr/bin/microsoft-edge\",\n \"/usr/bin/brave-browser\",\n \"/snap/bin/chromium\",\n );\n } else if (os === \"win32\") {\n const programFiles = process.env.PROGRAMFILES || \"C:\\\\Program Files\";\n const programFilesX86 =\n process.env[\"PROGRAMFILES(X86)\"] || \"C:\\\\Program Files (x86)\";\n const localAppData = process.env.LOCALAPPDATA || \"\";\n candidates.push(\n join(programFiles, \"Google\\\\Chrome\\\\Application\\\\chrome.exe\"),\n join(programFilesX86, \"Google\\\\Chrome\\\\Application\\\\chrome.exe\"),\n join(localAppData, \"Google\\\\Chrome\\\\Application\\\\chrome.exe\"),\n join(programFiles, \"Microsoft\\\\Edge\\\\Application\\\\msedge.exe\"),\n join(programFilesX86, \"Microsoft\\\\Edge\\\\Application\\\\msedge.exe\"),\n join(\n programFiles,\n \"BraveSoftware\\\\Brave-Browser\\\\Application\\\\brave.exe\",\n ),\n );\n }\n\n for (const path of candidates) {\n if (existsSync(path)) {\n return path;\n }\n }\n\n const lookup = os === \"win32\" ? \"where\" : \"which\";\n for (const candidate of [\n \"google-chrome\",\n \"google-chrome-stable\",\n \"chromium-browser\",\n \"chromium\",\n \"microsoft-edge\",\n \"brave-browser\",\n \"chrome.exe\",\n \"msedge.exe\",\n ]) {\n try {\n const output = execFileSync(lookup, [candidate], {\n encoding: \"utf8\",\n timeout: 3000,\n });\n const match = output\n .split(/\\r?\\n/)\n .map((value) => value.trim())\n .find((value) => value && existsSync(value));\n if (match) {\n return match;\n }\n } catch {\n // Ignore PATH misses.\n }\n }\n\n return null;\n}\n\n/**\n * Check if a Chromium-based browser is available.\n */\nexport function isBrowserAvailable(): boolean {\n return detectBrowserPath() !== null;\n}\n\n// ── Lifecycle ───────────────────────────────────────────────────────────────\n\nasync function ensureBrowser(): Promise<Page> {\n if (browser && activePage) {\n try {\n await activePage.evaluate(\"1\");\n return activePage;\n } catch {\n // Page disconnected, reset\n browser = null;\n activePage = null;\n }\n }\n throw new Error(\"Browser not open. Use the open action first.\");\n}\n\nexport async function openBrowser(url?: string): Promise<BrowserState> {\n const pup = await getPuppeteer();\n const executablePath = detectBrowserPath();\n if (!executablePath) {\n throw new Error(\n \"No Chromium-based browser found. Install Chrome, Edge, or Brave.\",\n );\n }\n\n // Close existing browser if any\n if (browser) {\n await closeBrowser();\n }\n\n const isCi =\n process.env.CI === \"true\" || process.env.GITHUB_ACTIONS === \"true\";\n const launchArgs = [\n \"--no-first-run\",\n \"--no-default-browser-check\",\n \"--disable-infobars\",\n `--window-size=1280,900`,\n ];\n if (isCi) {\n launchArgs.push(\n \"--no-sandbox\",\n \"--disable-setuid-sandbox\",\n \"--disable-dev-shm-usage\",\n \"--disable-gpu\",\n );\n }\n let lastError: unknown = null;\n\n for (let attempt = 1; attempt <= BROWSER_LAUNCH_ATTEMPTS; attempt += 1) {\n tempUserDataDir = await mkdtemp(join(tmpdir(), \"computeruse-browser-\"));\n\n try {\n browser = await pup.default.launch({\n executablePath,\n headless: browserHeadless,\n userDataDir: tempUserDataDir,\n args: launchArgs,\n defaultViewport: { width: 1280, height: 900 },\n });\n\n const pages = await browser.pages();\n activePage = pages[0] ?? (await browser.newPage());\n\n if (url) {\n await activePage.goto(url, {\n waitUntil: \"domcontentloaded\",\n timeout: 30000,\n });\n }\n\n return {\n url: activePage.url(),\n title: await activePage.title(),\n isOpen: true,\n is_open: true,\n };\n } catch (error) {\n lastError = error;\n await closeBrowser();\n if (attempt < BROWSER_LAUNCH_ATTEMPTS) {\n await new Promise((resolve) => setTimeout(resolve, attempt * 500));\n }\n }\n }\n\n const message =\n lastError instanceof Error ? lastError.message : String(lastError);\n throw new Error(`Failed to launch browser after retries: ${message}`);\n}\n\nexport async function closeBrowser(): Promise<void> {\n if (browser) {\n try {\n await browser.close();\n } catch {\n /* ignore */\n }\n browser = null;\n activePage = null;\n }\n\n if (tempUserDataDir) {\n try {\n await rm(tempUserDataDir, { recursive: true, force: true });\n } catch {\n /* ignore */\n }\n tempUserDataDir = null;\n }\n}\n\n// ── Navigation ──────────────────────────────────────────────────────────────\n\nexport async function navigateBrowser(url: string): Promise<BrowserState> {\n const page = await ensureBrowser();\n await page.goto(url, { waitUntil: \"domcontentloaded\", timeout: 30000 });\n return {\n url: page.url(),\n title: await page.title(),\n isOpen: true,\n is_open: true,\n };\n}\n\n// ── Click ───────────────────────────────────────────────────────────────────\n\nexport async function clickBrowser(\n selector?: string,\n coordinate?: [number, number],\n text?: string,\n): Promise<void> {\n const page = await ensureBrowser();\n\n if (selector) {\n await page.click(selector);\n } else if (coordinate) {\n await page.mouse.click(coordinate[0], coordinate[1]);\n } else if (text) {\n const el = await page.evaluateHandle((t) => {\n const walker = document.createTreeWalker(\n document.body,\n NodeFilter.SHOW_TEXT,\n );\n while (walker.nextNode()) {\n const node = walker.currentNode;\n if (node.textContent?.includes(t)) {\n return node.parentElement;\n }\n }\n return null;\n }, text);\n const element = el.asElement() as\n | import(\"puppeteer-core\").ElementHandle<Element>\n | null;\n if (!element) {\n await el.dispose();\n throw new Error(`Element with text \"${text}\" not found`);\n }\n await element.click();\n await el.dispose();\n } else {\n throw new Error(\n \"selector, coordinate, or text is required for browser click\",\n );\n }\n}\n\n// ── Type ────────────────────────────────────────────────────────────────────\n\nexport async function typeBrowser(\n text: string,\n selector?: string,\n): Promise<void> {\n const page = await ensureBrowser();\n\n if (selector) {\n await page.click(selector);\n await page.type(selector, text);\n } else {\n await page.keyboard.type(text);\n }\n}\n\n// ── Scroll ──────────────────────────────────────────────────────────────────\n\nexport async function scrollBrowser(\n direction: \"up\" | \"down\",\n amount = 300,\n): Promise<void> {\n const page = await ensureBrowser();\n const delta = direction === \"up\" ? -amount : amount;\n await page.evaluate((d) => window.scrollBy(0, d), delta);\n}\n\n// ── State ───────────────────────────────────────────────────────────────────\n\nexport async function getBrowserState(): Promise<BrowserState> {\n const page = await ensureBrowser();\n return {\n url: page.url(),\n title: await page.title(),\n isOpen: true,\n is_open: true,\n };\n}\n\nexport async function getBrowserContext(): Promise<BrowserState> {\n return getBrowserState();\n}\n\nexport async function getBrowserInfo(): Promise<BrowserInfo> {\n try {\n const state = await getBrowserState();\n return {\n success: true,\n isOpen: true,\n is_open: true,\n ...state,\n };\n } catch (error) {\n return {\n success: false,\n isOpen: false,\n is_open: false,\n url: \"\",\n title: \"\",\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n// ── DOM ─────────────────────────────────────────────────────────────────────\n\nexport async function getBrowserDom(): Promise<string> {\n const page = await ensureBrowser();\n const html = await page.content();\n // Limit to first 5000 chars to prevent context overflow\n return html.slice(0, 5000);\n}\n\n// ── Clickable Elements ──────────────────────────────────────────────────────\n\nexport async function getBrowserClickables(): Promise<ClickableElement[]> {\n const page = await ensureBrowser();\n return page.evaluate(() => {\n const selectors =\n \"a, button, input, select, textarea, [role='button'], [role='link'], [onclick]\";\n const elements = document.querySelectorAll(selectors);\n const result: Array<{\n tag: string;\n text: string;\n selector: string;\n type?: string;\n href?: string;\n ariaLabel?: string;\n }> = [];\n\n for (const el of elements) {\n if (result.length >= 50) break;\n const tag = el.tagName.toLowerCase();\n const text = (el.textContent ?? \"\").trim().slice(0, 100);\n const id = el.id ? `#${el.id}` : \"\";\n const cls =\n el.className && typeof el.className === \"string\"\n ? `.${el.className.split(\" \").filter(Boolean).join(\".\")}`\n : \"\";\n result.push({\n tag,\n text,\n selector: id || `${tag}${cls}`,\n type: (el as HTMLInputElement).type || undefined,\n href: (el as HTMLAnchorElement).href || undefined,\n ariaLabel: el.getAttribute(\"aria-label\") || undefined,\n });\n }\n return result;\n });\n}\n\n// ── Screenshot ──────────────────────────────────────────────────────────────\n\nexport async function screenshotBrowser(): Promise<string> {\n const page = await ensureBrowser();\n const buffer = await page.screenshot({ encoding: \"base64\", type: \"png\" });\n return buffer as string;\n}\n\n// ── Execute JavaScript ──────────────────────────────────────────────────────\n\nexport async function executeBrowser(code: string): Promise<string> {\n const page = await ensureBrowser();\n try {\n const result = await page.evaluate(async (script) => {\n const AsyncFunction = Object.getPrototypeOf(async function placeholder() {\n // noop\n }).constructor as new (\n ...args: string[]\n ) => (...fnArgs: unknown[]) => Promise<unknown>;\n const fn = new AsyncFunction(script);\n return await fn();\n }, code);\n return renderPlainData(result);\n } catch (err) {\n throw err instanceof Error ? err : new Error(String(err));\n }\n}\n\nfunction renderPlainData(value: unknown, indent = 0): string {\n const prefix = \" \".repeat(indent);\n if (value === null || value === undefined) {\n return \"none\";\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return \"items[0]:\";\n }\n return [\n `items[${value.length}]:`,\n ...value.map((item) => `${prefix}- ${renderPlainData(item, indent + 1)}`),\n ].join(\"\\n\");\n }\n if (typeof value === \"object\") {\n return Object.entries(value as Record<string, unknown>)\n .map(([key, nestedValue]) => {\n if (nestedValue && typeof nestedValue === \"object\") {\n return `${key}:\\n${renderPlainData(nestedValue, indent + 1)}`;\n }\n return `${key}: ${renderPlainData(nestedValue, indent + 1)}`;\n })\n .join(\"\\n\");\n }\n return String(value);\n}\n\n// ── Wait ────────────────────────────────────────────────────────────────────\n\nexport async function waitBrowser(\n selector?: string,\n text?: string,\n timeout = 5000,\n): Promise<void> {\n const page = await ensureBrowser();\n if (selector) {\n await page.waitForSelector(selector, { timeout });\n } else if (text) {\n await page.waitForFunction(\n (t) => document.body.textContent?.includes(t),\n { timeout },\n text,\n );\n } else {\n await new Promise((resolve) =>\n setTimeout(resolve, Math.min(timeout, 5000)),\n );\n }\n}\n\nexport async function browserWait(\n selector?: string,\n text?: string,\n timeout = 5000,\n): Promise<{ success: boolean; message?: string; error?: string }> {\n try {\n await waitBrowser(selector, text, timeout);\n if (selector) {\n return { success: true, message: `Element \"${selector}\" found` };\n }\n if (text) {\n return { success: true, message: `Text \"${text}\" found on page` };\n }\n return { success: true, message: `Waited ${Math.min(timeout, 5000)}ms` };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n// ── Tab Management ──────────────────────────────────────────────────────────\n\nexport async function listBrowserTabs(): Promise<BrowserTab[]> {\n if (!browser) throw new Error(\"Browser not open.\");\n const pages = await browser.pages();\n const tabs: BrowserTab[] = [];\n for (let i = 0; i < pages.length; i++) {\n const page = pages[i]!;\n tabs.push({\n id: String(i),\n url: page.url(),\n title: await page.title(),\n active: page === activePage,\n });\n }\n return tabs;\n}\n\nexport async function openBrowserTab(url?: string): Promise<BrowserTab> {\n if (!browser) throw new Error(\"Browser not open.\");\n const page = await browser.newPage();\n activePage = page;\n if (url) {\n await page.goto(url, { waitUntil: \"domcontentloaded\", timeout: 30000 });\n }\n const pages = await browser.pages();\n return {\n id: String(pages.indexOf(page)),\n url: page.url(),\n title: await page.title(),\n active: true,\n };\n}\n\nexport async function closeBrowserTab(tabId: string): Promise<void> {\n if (!browser) throw new Error(\"Browser not open.\");\n const pages = await browser.pages();\n const idx = Number.parseInt(tabId, 10);\n const page = pages[idx];\n if (!page) throw new Error(`Tab ${tabId} not found.`);\n if (page === activePage) {\n // Switch to another tab before closing\n activePage = pages.find((p) => p !== page) ?? null;\n }\n await page.close();\n}\n\nexport async function switchBrowserTab(tabId: string): Promise<BrowserState> {\n if (!browser) throw new Error(\"Browser not open.\");\n const pages = await browser.pages();\n const idx = Number.parseInt(tabId, 10);\n const page = pages[idx];\n if (!page) throw new Error(`Tab ${tabId} not found.`);\n activePage = page;\n await page.bringToFront();\n return {\n url: page.url(),\n title: await page.title(),\n isOpen: true,\n is_open: true,\n };\n}\n\nexport const browser_open = openBrowser;\nexport const browser_connect = openBrowser;\nexport const browser_navigate = navigateBrowser;\nexport const browser_click = clickBrowser;\nexport const browser_type = typeBrowser;\nexport const browser_scroll = scrollBrowser;\nexport const browser_close = closeBrowser;\nexport const browser_execute = executeBrowser;\nexport const browser_screenshot = screenshotBrowser;\nexport const browser_dom = getBrowserDom;\nexport const browser_get_dom = getBrowserDom;\nexport const browser_get_clickables = getBrowserClickables;\nexport const browser_state = getBrowserState;\nexport const browser_get_context = getBrowserContext;\nexport const browser_info = getBrowserInfo;\nexport const browser_wait = browserWait;\nexport const browser_list_tabs = listBrowserTabs;\nexport const browser_open_tab = openBrowserTab;\nexport const browser_close_tab = closeBrowserTab;\nexport const browser_switch_tab = switchBrowserTab;\n",
14
+ "import type { PlatformCapabilities } from \"../types.js\";\nimport type { PlatformOS } from \"./helpers.js\";\n\nexport interface CapabilityDetectionOptions {\n osName: PlatformOS;\n commandExists: (command: string) => boolean;\n isBrowserAvailable: () => boolean;\n shell?: string;\n}\n\nexport function detectPlatformCapabilities(\n options: CapabilityDetectionOptions,\n): PlatformCapabilities {\n const caps: PlatformCapabilities = {\n screenshot: { available: false, tool: \"none\" },\n computerUse: { available: false, tool: \"none\" },\n windowList: { available: false, tool: \"none\" },\n browser: { available: false, tool: \"none\" },\n terminal: { available: false, tool: \"none\" },\n fileSystem: { available: true, tool: \"node:fs\" },\n };\n\n if (options.osName === \"darwin\") {\n caps.screenshot = { available: true, tool: \"screencapture (built-in)\" };\n caps.computerUse = options.commandExists(\"cliclick\")\n ? { available: true, tool: \"cliclick\" }\n : {\n available: true,\n tool: \"AppleScript / Swift fallbacks (mouse_move requires cliclick)\",\n };\n caps.windowList = {\n available: true,\n tool: \"AppleScript System Events\",\n };\n } else if (options.osName === \"linux\") {\n if (options.commandExists(\"import\")) {\n caps.screenshot = { available: true, tool: \"ImageMagick import\" };\n } else if (options.commandExists(\"scrot\")) {\n caps.screenshot = { available: true, tool: \"scrot\" };\n } else if (options.commandExists(\"gnome-screenshot\")) {\n caps.screenshot = { available: true, tool: \"gnome-screenshot\" };\n } else {\n caps.screenshot = {\n available: false,\n tool: \"none (install ImageMagick, scrot, or gnome-screenshot)\",\n };\n }\n\n caps.computerUse = options.commandExists(\"xdotool\")\n ? { available: true, tool: \"xdotool\" }\n : { available: false, tool: \"none (install xdotool)\" };\n\n if (options.commandExists(\"wmctrl\")) {\n caps.windowList = { available: true, tool: \"wmctrl\" };\n } else if (options.commandExists(\"xdotool\")) {\n caps.windowList = { available: true, tool: \"xdotool\" };\n } else {\n caps.windowList = {\n available: false,\n tool: \"none (install wmctrl or xdotool)\",\n };\n }\n } else if (options.osName === \"win32\") {\n caps.screenshot = { available: true, tool: \"PowerShell System.Drawing\" };\n caps.computerUse = { available: true, tool: \"PowerShell user32.dll\" };\n caps.windowList = { available: true, tool: \"PowerShell Get-Process\" };\n }\n\n caps.browser = options.isBrowserAvailable()\n ? { available: true, tool: \"puppeteer-core (Chromium detected)\" }\n : { available: false, tool: \"none (no Chrome/Edge/Brave found)\" };\n\n caps.terminal =\n options.osName === \"win32\"\n ? { available: true, tool: \"powershell.exe\" }\n : options.commandExists(options.shell ?? \"/bin/bash\")\n ? { available: true, tool: options.shell ?? \"/bin/bash\" }\n : { available: true, tool: options.shell ?? \"/bin/sh\" };\n\n return caps;\n}\n",
15
+ "import type { PermissionType } from \"../types.js\";\n\ntype PermissionErrorOptions = {\n permissionType: PermissionType;\n operation: string;\n message: string;\n details?: string;\n};\n\nexport type PermissionDeniedError = Error & {\n permissionDenied: true;\n permissionType: PermissionType;\n operation: string;\n details?: string;\n};\n\nfunction toMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nexport function createPermissionDeniedError(\n options: PermissionErrorOptions,\n): PermissionDeniedError {\n const error = new Error(options.message) as PermissionDeniedError;\n error.name = \"PermissionDeniedError\";\n error.permissionDenied = true;\n error.permissionType = options.permissionType;\n error.operation = options.operation;\n if (options.details) {\n error.details = options.details;\n }\n return error;\n}\n\nexport function isPermissionDeniedError(\n value: unknown,\n): value is PermissionDeniedError {\n return (\n value instanceof Error &&\n \"permissionDenied\" in value &&\n value.permissionDenied === true &&\n \"permissionType\" in value &&\n typeof value.permissionType === \"string\"\n );\n}\n\nfunction matchesAccessibilityPermissionError(message: string): boolean {\n return /accessibility|assistive access|not authorized to send apple events|osascript.*not allowed|osascript.*etimedout|spawnsync osascript etimedout|system events got an error|not permitted to send keystrokes|control.*not allowed/i.test(\n message,\n );\n}\n\nfunction matchesScreenRecordingPermissionError(message: string): boolean {\n return /screen recording|screen capture|not authorized|permission denied|could not create image from display|screencapture.*empty|cgwindowlistcreateimage|capture failed/i.test(\n message,\n );\n}\n\nexport function classifyPermissionDeniedError(\n error: unknown,\n fallback: {\n permissionType: PermissionType;\n operation: string;\n },\n): PermissionDeniedError | null {\n if (isPermissionDeniedError(error)) {\n return error;\n }\n\n const message = toMessage(error);\n\n if (\n fallback.permissionType === \"accessibility\" &&\n matchesAccessibilityPermissionError(message)\n ) {\n return createPermissionDeniedError({\n permissionType: \"accessibility\",\n operation: fallback.operation,\n message:\n \"Desktop automation requires macOS Accessibility permission. Grant access in System Settings > Privacy & Security > Accessibility, then retry.\",\n details: message,\n });\n }\n\n if (\n fallback.permissionType === \"screen_recording\" &&\n matchesScreenRecordingPermissionError(message)\n ) {\n return createPermissionDeniedError({\n permissionType: \"screen_recording\",\n operation: fallback.operation,\n message:\n \"Screenshots require macOS Screen Recording permission. Grant access in System Settings > Privacy & Security > Screen Recording, then retry.\",\n details: message,\n });\n }\n\n return null;\n}\n",
16
+ "/**\n * Cross-platform desktop automation — mouse, keyboard, scroll, drag.\n *\n * Ported from coasty-ai/open-computer-use desktop-automation.ts (Apache 2.0)\n * and eliza sandbox-routes.ts performClick/performType/performKeypress.\n *\n * Platform backends:\n * macOS — cliclick (preferred, brew install cliclick) or AppleScript fallback\n * Linux — xdotool (required: sudo apt install xdotool)\n * Windows — PowerShell with user32.dll P/Invoke\n *\n * All coordinate inputs are validated via validateInt() to prevent injection.\n */\n\nimport {\n canonicalKeyName,\n commandExists,\n currentPlatform,\n escapeAppleScript,\n runCommand,\n safeXdotoolKey,\n toCliclickKeyName,\n toWindowsSendKey,\n toXdotoolKeyName,\n validateInt,\n validateKeypress,\n validateText,\n} from \"./helpers.js\";\nimport {\n classifyPermissionDeniedError,\n isPermissionDeniedError,\n} from \"./permissions.js\";\n\nfunction toAppleScriptModifier(key: string): string {\n const normalized = key.trim().toLowerCase();\n const mapping: Record<string, string> = {\n cmd: \"command\",\n command: \"command\",\n meta: \"command\",\n super: \"command\",\n ctrl: \"control\",\n control: \"control\",\n alt: \"option\",\n option: \"option\",\n shift: \"shift\",\n fn: \"function\",\n };\n const modifier = mapping[normalized];\n if (!modifier) {\n throw new Error(`Unsupported modifier key: \"${key}\"`);\n }\n return modifier;\n}\n\nfunction toAppleScriptKeyCode(key: string): number | null {\n const canonical = canonicalKeyName(key);\n const keyCodes: Record<string, number> = {\n enter: 36,\n return: 36,\n tab: 48,\n space: 49,\n escape: 53,\n delete: 51,\n backspace: 51,\n left: 123,\n right: 124,\n down: 125,\n up: 126,\n home: 115,\n end: 119,\n pageup: 116,\n pagedown: 121,\n f1: 122,\n f2: 120,\n f3: 99,\n f4: 118,\n f5: 96,\n f6: 97,\n f7: 98,\n f8: 100,\n f9: 101,\n f10: 109,\n f11: 103,\n f12: 111,\n };\n return keyCodes[canonical] ?? null;\n}\n\nfunction runDarwinJxa(script: string, timeoutMs = 5000): void {\n runCommand(\"osascript\", [\"-l\", \"JavaScript\", \"-e\", script], timeoutMs);\n}\n\nfunction moveMouseDarwin(x: number, y: number): void {\n runDarwinJxa(\n `\nObjC.import(\"ApplicationServices\");\nconst point = $.CGPointMake(${x}, ${y});\nconst event = $.CGEventCreateMouseEvent(\n null,\n $.kCGEventMouseMoved,\n point,\n $.kCGMouseButtonLeft\n);\n$.CGEventPost($.kCGHIDEventTap, event);\n`,\n );\n}\n\nfunction clickDarwinWithCoreGraphics(\n x: number,\n y: number,\n button: \"left\" | \"right\",\n clickCount = 1,\n): void {\n const downEvent =\n button === \"right\" ? \"$.kCGEventRightMouseDown\" : \"$.kCGEventLeftMouseDown\";\n const upEvent =\n button === \"right\" ? \"$.kCGEventRightMouseUp\" : \"$.kCGEventLeftMouseUp\";\n const mouseButton =\n button === \"right\" ? \"$.kCGMouseButtonRight\" : \"$.kCGMouseButtonLeft\";\n runDarwinJxa(\n `\nObjC.import(\"ApplicationServices\");\nconst point = $.CGPointMake(${x}, ${y});\nfor (let clickIndex = 1; clickIndex <= ${clickCount}; clickIndex += 1) {\n const down = $.CGEventCreateMouseEvent(null, ${downEvent}, point, ${mouseButton});\n $.CGEventSetIntegerValueField(down, $.kCGMouseEventClickState, clickIndex);\n $.CGEventPost($.kCGHIDEventTap, down);\n const up = $.CGEventCreateMouseEvent(null, ${upEvent}, point, ${mouseButton});\n $.CGEventSetIntegerValueField(up, $.kCGMouseEventClickState, clickIndex);\n $.CGEventPost($.kCGHIDEventTap, up);\n}\n`,\n );\n}\n\nfunction scrollDarwin(\n x: number,\n y: number,\n direction: \"up\" | \"down\" | \"left\" | \"right\",\n amount: number,\n): void {\n const vertical =\n direction === \"up\" ? amount : direction === \"down\" ? -amount : 0;\n const horizontal =\n direction === \"left\" ? amount : direction === \"right\" ? -amount : 0;\n runDarwinJxa(\n `\nObjC.import(\"ApplicationServices\");\nconst point = $.CGPointMake(${x}, ${y});\nconst moveEvent = $.CGEventCreateMouseEvent(\n null,\n $.kCGEventMouseMoved,\n point,\n $.kCGMouseButtonLeft\n);\n$.CGEventPost($.kCGHIDEventTap, moveEvent);\nconst scrollEvent = $.CGEventCreateScrollWheelEvent(\n null,\n $.kCGScrollEventUnitLine,\n 2,\n ${vertical},\n ${horizontal}\n);\n$.CGEventPost($.kCGHIDEventTap, scrollEvent);\n`,\n );\n}\n\n// ── Mouse Click ─────────────────────────────────────────────────────────────\n\nexport function desktopClick(x: number, y: number): void {\n runWithAccessibilityPermission(\n \"desktop_click\",\n () => {\n const sx = validateInt(x);\n const sy = validateInt(y);\n const os = currentPlatform();\n\n if (os === \"darwin\") {\n if (commandExists(\"cliclick\")) {\n runCommand(\"cliclick\", [`c:${sx},${sy}`], 5000);\n } else {\n runCommand(\n \"osascript\",\n [\n \"-e\",\n `tell application \"System Events\" to click at {${sx}, ${sy}}`,\n ],\n 5000,\n );\n }\n } else if (os === \"linux\") {\n requireXdotool();\n runCommand(\n \"xdotool\",\n [\"mousemove\", String(sx), String(sy), \"click\", \"1\"],\n 5000,\n );\n } else if (os === \"win32\") {\n const ps = [\n \"Add-Type -AssemblyName System.Windows.Forms\",\n `[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(${sx},${sy})`,\n `Add-Type -MemberDefinition '[DllImport(\"user32.dll\")] public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);' -Name Win32Mouse -Namespace Win32`,\n \"[Win32.Win32Mouse]::mouse_event(0x0002, 0, 0, 0, 0); [Win32.Win32Mouse]::mouse_event(0x0004, 0, 0, 0, 0)\",\n ].join(\"; \");\n runCommand(\"powershell\", [\"-Command\", ps], 5000);\n }\n },\n \"desktop_click\",\n );\n}\n\nexport function desktopClickWithModifiers(\n x: number,\n y: number,\n modifiers: string[],\n): void {\n runWithAccessibilityPermission(\n \"desktop_click_with_modifiers\",\n () => {\n const sx = validateInt(x);\n const sy = validateInt(y);\n const os = currentPlatform();\n const normalizedModifiers = normalizeModifiers(modifiers);\n\n if (normalizedModifiers.length === 0) {\n desktopClick(sx, sy);\n return;\n }\n\n if (os === \"darwin\") {\n const flagMap: Record<string, string> = {\n cmd: \".maskCommand\",\n command: \".maskCommand\",\n meta: \".maskCommand\",\n super: \".maskCommand\",\n ctrl: \".maskControl\",\n control: \".maskControl\",\n alt: \".maskAlternate\",\n option: \".maskAlternate\",\n shift: \".maskShift\",\n };\n const flags = normalizedModifiers\n .map((modifier) => flagMap[modifier])\n .filter(Boolean);\n const flagExpr = flags.length > 0 ? `[${flags.join(\", \")}]` : \"[]\";\n const swiftScript = `\nimport Cocoa\nlet point = CGPoint(x: ${sx}, y: ${sy})\nlet flags: CGEventFlags = ${flagExpr}\nlet down = CGEvent(mouseEventSource: nil, mouseType: .leftMouseDown, mouseCursorPosition: point, mouseButton: .left)\ndown?.flags = flags\ndown?.post(tap: .cghidEventTap)\nlet up = CGEvent(mouseEventSource: nil, mouseType: .leftMouseUp, mouseCursorPosition: point, mouseButton: .left)\nup?.flags = flags\nup?.post(tap: .cghidEventTap)\n`;\n runCommand(\"swift\", [\"-e\", swiftScript], 10000);\n return;\n }\n\n if (os === \"linux\") {\n requireXdotool();\n const modMap: Record<string, string> = {\n cmd: \"super\",\n command: \"super\",\n meta: \"super\",\n super: \"super\",\n ctrl: \"ctrl\",\n control: \"ctrl\",\n alt: \"alt\",\n option: \"alt\",\n shift: \"shift\",\n };\n const keys = normalizedModifiers.map(\n (modifier) => modMap[modifier] ?? modifier,\n );\n runCommand(\n \"xdotool\",\n [\n ...keys.flatMap((key) => [\"keydown\", key]),\n \"mousemove\",\n String(sx),\n String(sy),\n \"click\",\n \"1\",\n ...[...keys].reverse().flatMap((key) => [\"keyup\", key]),\n ],\n 5000,\n );\n return;\n }\n\n if (os === \"win32\") {\n const vkMap: Record<string, number> = {\n cmd: 0x5b,\n command: 0x5b,\n meta: 0x5b,\n super: 0x5b,\n ctrl: 0x11,\n control: 0x11,\n alt: 0x12,\n option: 0x12,\n shift: 0x10,\n };\n const keyDown = normalizedModifiers\n .map((modifier) => vkMap[modifier])\n .filter((code): code is number => Number.isFinite(code))\n .map(\n (code) => `[Win32.Win32Keyboard]::keybd_event(${code}, 0, 0, 0)`,\n );\n const keyUp = [...normalizedModifiers]\n .reverse()\n .map((modifier) => vkMap[modifier])\n .filter((code): code is number => Number.isFinite(code))\n .map(\n (code) => `[Win32.Win32Keyboard]::keybd_event(${code}, 0, 2, 0)`,\n );\n const ps = [\n \"Add-Type -AssemblyName System.Windows.Forms\",\n `[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(${sx},${sy})`,\n `Add-Type -MemberDefinition '[DllImport(\"user32.dll\")] public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo); [DllImport(\"user32.dll\")] public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);' -Name Win32Keyboard -Namespace Win32`,\n ...keyDown,\n \"[Win32.Win32Keyboard]::mouse_event(0x0002, 0, 0, 0, 0); [Win32.Win32Keyboard]::mouse_event(0x0004, 0, 0, 0, 0)\",\n ...keyUp,\n ].join(\"; \");\n runCommand(\"powershell\", [\"-Command\", ps], 5000);\n }\n },\n \"desktop_click_with_modifiers\",\n );\n}\n\n// ── Double Click ────────────────────────────────────────────────────────────\n\nexport function desktopDoubleClick(x: number, y: number): void {\n runWithAccessibilityPermission(\n \"desktop_double_click\",\n () => {\n const sx = validateInt(x);\n const sy = validateInt(y);\n const os = currentPlatform();\n\n if (os === \"darwin\") {\n if (commandExists(\"cliclick\")) {\n runCommand(\"cliclick\", [`dc:${sx},${sy}`], 5000);\n } else {\n const swiftScript = `\nimport Cocoa\nlet point = CGPoint(x: ${sx}, y: ${sy})\nlet down1 = CGEvent(mouseEventSource: nil, mouseType: .leftMouseDown, mouseCursorPosition: point, mouseButton: .left)\ndown1?.setIntegerValueField(.mouseEventClickState, value: 1)\ndown1?.post(tap: .cghidEventTap)\nlet up1 = CGEvent(mouseEventSource: nil, mouseType: .leftMouseUp, mouseCursorPosition: point, mouseButton: .left)\nup1?.setIntegerValueField(.mouseEventClickState, value: 1)\nup1?.post(tap: .cghidEventTap)\nusleep(50000)\nlet down2 = CGEvent(mouseEventSource: nil, mouseType: .leftMouseDown, mouseCursorPosition: point, mouseButton: .left)\ndown2?.setIntegerValueField(.mouseEventClickState, value: 2)\ndown2?.post(tap: .cghidEventTap)\nlet up2 = CGEvent(mouseEventSource: nil, mouseType: .leftMouseUp, mouseCursorPosition: point, mouseButton: .left)\nup2?.setIntegerValueField(.mouseEventClickState, value: 2)\nup2?.post(tap: .cghidEventTap)\n`;\n runCommand(\"swift\", [\"-e\", swiftScript], 10000);\n }\n } else if (os === \"linux\") {\n requireXdotool();\n runCommand(\n \"xdotool\",\n [\"mousemove\", String(sx), String(sy), \"click\", \"--repeat\", \"2\", \"1\"],\n 5000,\n );\n } else if (os === \"win32\") {\n const ps = [\n \"Add-Type -AssemblyName System.Windows.Forms\",\n `[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(${sx},${sy})`,\n `Add-Type -MemberDefinition '[DllImport(\"user32.dll\")] public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);' -Name Win32Mouse -Namespace Win32`,\n \"[Win32.Win32Mouse]::mouse_event(0x0002, 0, 0, 0, 0); [Win32.Win32Mouse]::mouse_event(0x0004, 0, 0, 0, 0)\",\n \"[Win32.Win32Mouse]::mouse_event(0x0002, 0, 0, 0, 0); [Win32.Win32Mouse]::mouse_event(0x0004, 0, 0, 0, 0)\",\n ].join(\"; \");\n runCommand(\"powershell\", [\"-Command\", ps], 5000);\n }\n },\n \"desktop_double_click\",\n );\n}\n\n// ── Right Click ─────────────────────────────────────────────────────────────\n\nexport function desktopRightClick(x: number, y: number): void {\n runWithAccessibilityPermission(\n \"desktop_right_click\",\n () => {\n const sx = validateInt(x);\n const sy = validateInt(y);\n const os = currentPlatform();\n\n if (os === \"darwin\") {\n if (commandExists(\"cliclick\")) {\n runCommand(\"cliclick\", [`rc:${sx},${sy}`], 5000);\n } else {\n const swiftScript = `\nimport Cocoa\nlet point = CGPoint(x: ${sx}, y: ${sy})\nCGEvent(mouseEventSource: nil, mouseType: .rightMouseDown, mouseCursorPosition: point, mouseButton: .right)?.post(tap: .cghidEventTap)\nCGEvent(mouseEventSource: nil, mouseType: .rightMouseUp, mouseCursorPosition: point, mouseButton: .right)?.post(tap: .cghidEventTap)\n`;\n runCommand(\"swift\", [\"-e\", swiftScript], 10000);\n }\n } else if (os === \"linux\") {\n requireXdotool();\n runCommand(\n \"xdotool\",\n [\"mousemove\", String(sx), String(sy), \"click\", \"3\"],\n 5000,\n );\n } else if (os === \"win32\") {\n const ps = [\n \"Add-Type -AssemblyName System.Windows.Forms\",\n `[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(${sx},${sy})`,\n `Add-Type -MemberDefinition '[DllImport(\"user32.dll\")] public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);' -Name Win32Mouse -Namespace Win32`,\n \"[Win32.Win32Mouse]::mouse_event(0x0008, 0, 0, 0, 0); [Win32.Win32Mouse]::mouse_event(0x0010, 0, 0, 0, 0)\",\n ].join(\"; \");\n runCommand(\"powershell\", [\"-Command\", ps], 5000);\n }\n },\n \"desktop_right_click\",\n );\n}\n\n// ── Mouse Move ──────────────────────────────────────────────────────────────\n\nexport function desktopMouseMove(x: number, y: number): void {\n runWithAccessibilityPermission(\n \"desktop_mouse_move\",\n () => {\n const sx = validateInt(x);\n const sy = validateInt(y);\n const os = currentPlatform();\n\n if (os === \"darwin\") {\n if (commandExists(\"cliclick\")) {\n runCommand(\"cliclick\", [`m:${sx},${sy}`], 5000);\n } else {\n // JXA (JavaScript for Automation) CoreGraphics fallback — no deps.\n const jxa = `ObjC.import('CoreGraphics'); const e = $.CGEventCreateMouseEvent($(), $.kCGEventMouseMoved, {x:${sx}, y:${sy}}, $.kCGMouseButtonLeft); $.CGEventPost($.kCGHIDEventTap, e);`;\n runCommand(\"osascript\", [\"-l\", \"JavaScript\", \"-e\", jxa], 5000);\n }\n } else if (os === \"linux\") {\n requireXdotool();\n runCommand(\"xdotool\", [\"mousemove\", String(sx), String(sy)], 5000);\n } else if (os === \"win32\") {\n const ps = [\n \"Add-Type -AssemblyName System.Windows.Forms\",\n `[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(${sx},${sy})`,\n ].join(\"; \");\n runCommand(\"powershell\", [\"-Command\", ps], 5000);\n }\n },\n \"desktop_mouse_move\",\n );\n}\n\n// ── Drag ────────────────────────────────────────────────────────────────────\n\nexport function desktopDrag(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): void {\n runWithAccessibilityPermission(\n \"desktop_drag\",\n () => {\n const sx1 = validateInt(x1);\n const sy1 = validateInt(y1);\n const sx2 = validateInt(x2);\n const sy2 = validateInt(y2);\n const os = currentPlatform();\n\n if (os === \"darwin\") {\n if (commandExists(\"cliclick\")) {\n runCommand(\n \"cliclick\",\n [`dd:${sx1},${sy1}`, `du:${sx2},${sy2}`],\n 10000,\n );\n } else {\n // AppleScript drag is limited; best-effort\n const script = [\n `tell application \"System Events\"`,\n ` click at {${sx1}, ${sy1}}`,\n ` delay 0.1`,\n ` click at {${sx2}, ${sy2}}`,\n `end tell`,\n ].join(\"\\n\");\n runCommand(\"osascript\", [\"-e\", script], 10000);\n }\n } else if (os === \"linux\") {\n requireXdotool();\n runCommand(\n \"xdotool\",\n [\n \"mousemove\",\n String(sx1),\n String(sy1),\n \"mousedown\",\n \"1\",\n \"mousemove\",\n \"--sync\",\n String(sx2),\n String(sy2),\n \"mouseup\",\n \"1\",\n ],\n 10000,\n );\n } else if (os === \"win32\") {\n const ps = [\n \"Add-Type -AssemblyName System.Windows.Forms\",\n `Add-Type -MemberDefinition '[DllImport(\"user32.dll\")] public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);' -Name Win32Mouse -Namespace Win32`,\n `[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(${sx1},${sy1})`,\n \"Start-Sleep -Milliseconds 50\",\n \"[Win32.Win32Mouse]::mouse_event(0x0002, 0, 0, 0, 0)\", // left down\n \"Start-Sleep -Milliseconds 50\",\n `[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(${sx2},${sy2})`,\n \"Start-Sleep -Milliseconds 50\",\n \"[Win32.Win32Mouse]::mouse_event(0x0004, 0, 0, 0, 0)\", // left up\n ].join(\"; \");\n runCommand(\"powershell\", [\"-Command\", ps], 10000);\n }\n },\n \"desktop_drag\",\n );\n}\n\n// ── Scroll ──────────────────────────────────────────────────────────────────\n\nexport function desktopScroll(\n x: number,\n y: number,\n direction: \"up\" | \"down\" | \"left\" | \"right\",\n amount = 3,\n): void {\n runWithAccessibilityPermission(\n \"desktop_scroll\",\n () => {\n const sx = validateInt(x);\n const sy = validateInt(y);\n const clicks = Math.max(1, Math.min(validateInt(amount), 20));\n const os = currentPlatform();\n\n if (os === \"darwin\") {\n // JXA CGEventCreateScrollWheelEvent — works without cliclick.\n // For vertical scrolls, positive Y deltas scroll up, negative scrolls down.\n // For horizontal, positive X deltas scroll right, negative scrolls left.\n const axis =\n direction === \"left\" || direction === \"right\"\n ? \"horizontal\"\n : \"vertical\";\n const delta =\n direction === \"up\" || direction === \"left\" ? clicks : -clicks;\n const jxa =\n axis === \"vertical\"\n ? `ObjC.import('CoreGraphics'); const e = $.CGEventCreateScrollWheelEvent($(), $.kCGScrollEventUnitLine, 1, ${delta}); $.CGEventPost($.kCGHIDEventTap, e);`\n : `ObjC.import('CoreGraphics'); const e = $.CGEventCreateScrollWheelEvent($(), $.kCGScrollEventUnitLine, 2, 0, ${delta}); $.CGEventPost($.kCGHIDEventTap, e);`;\n runCommand(\"osascript\", [\"-l\", \"JavaScript\", \"-e\", jxa], 5000);\n } else if (os === \"linux\") {\n requireXdotool();\n // Move to position first\n runCommand(\"xdotool\", [\"mousemove\", String(sx), String(sy)], 3000);\n // xdotool: button 4=scroll up, 5=scroll down, 6=scroll left, 7=scroll right\n const button =\n direction === \"up\"\n ? \"4\"\n : direction === \"down\"\n ? \"5\"\n : direction === \"left\"\n ? \"6\"\n : \"7\";\n for (let i = 0; i < clicks; i++) {\n runCommand(\"xdotool\", [\"click\", button], 2000);\n }\n } else if (os === \"win32\") {\n // MOUSEEVENTF_WHEEL = 0x0800, positive = up, negative = down\n // Each wheel click is 120 units\n const wheelDelta =\n (direction === \"up\" || direction === \"left\" ? 1 : -1) * 120 * clicks;\n const ps = [\n \"Add-Type -AssemblyName System.Windows.Forms\",\n `[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(${sx},${sy})`,\n `Add-Type -MemberDefinition '[DllImport(\"user32.dll\")] public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);' -Name Win32Mouse -Namespace Win32`,\n `[Win32.Win32Mouse]::mouse_event(0x0800, 0, 0, ${wheelDelta}, 0)`,\n ].join(\"; \");\n runCommand(\"powershell\", [\"-Command\", ps], 5000);\n }\n },\n \"desktop_scroll\",\n );\n}\n\n// ── Type Text ───────────────────────────────────────────────────────────────\n\nexport function desktopType(text: string): void {\n runWithAccessibilityPermission(\n \"desktop_type\",\n () => {\n const safeText = validateText(text);\n const os = currentPlatform();\n\n if (os === \"darwin\") {\n if (commandExists(\"cliclick\")) {\n runCommand(\"cliclick\", [`t:${safeText}`], 10000);\n } else {\n runCommand(\n \"osascript\",\n [\n \"-e\",\n `tell application \"System Events\" to keystroke ${escapeAppleScript(safeText)}`,\n ],\n 10000,\n );\n }\n } else if (os === \"linux\") {\n requireXdotool();\n runCommand(\"xdotool\", [\"type\", \"--\", safeText], 10000);\n } else if (os === \"win32\") {\n const escaped = safeText.replace(/'/g, \"''\");\n runCommand(\n \"powershell\",\n [\n \"-Command\",\n `Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SendKeys]::SendWait('${escaped}')`,\n ],\n 10000,\n );\n }\n },\n \"desktop_type\",\n );\n}\n\n// ── Key Press ───────────────────────────────────────────────────────────────\n\n/**\n * Press a single key by name (e.g. \"Return\", \"Tab\", \"Escape\", \"F5\").\n */\nexport function desktopKeyPress(key: string): void {\n runWithAccessibilityPermission(\n \"desktop_key_press\",\n () => {\n const safeKey = validateKeypress(key);\n const os = currentPlatform();\n\n if (os === \"darwin\") {\n if (commandExists(\"cliclick\")) {\n runCommand(\"cliclick\", [`kp:${toCliclickKeyName(safeKey)}`], 5000);\n } else {\n // Map common key names to macOS key codes\n const keyCodes: Record<string, number> = {\n return: 36,\n enter: 36,\n tab: 48,\n space: 49,\n escape: 53,\n esc: 53,\n delete: 51,\n backspace: 51,\n forwarddelete: 117,\n left: 123,\n right: 124,\n down: 125,\n up: 126,\n home: 115,\n end: 119,\n pageup: 116,\n pagedown: 121,\n f1: 122,\n f2: 120,\n f3: 99,\n f4: 118,\n f5: 96,\n f6: 97,\n f7: 98,\n f8: 100,\n f9: 101,\n f10: 109,\n f11: 103,\n f12: 111,\n };\n const normalized = safeKey.trim().toLowerCase();\n const code = keyCodes[normalized];\n if (code !== undefined) {\n runCommand(\n \"osascript\",\n [\"-e\", `tell application \"System Events\" to key code ${code}`],\n 5000,\n );\n } else {\n runCommand(\n \"osascript\",\n [\n \"-e\",\n `tell application \"System Events\" to keystroke ${escapeAppleScript(safeKey)}`,\n ],\n 5000,\n );\n }\n }\n } else if (os === \"linux\") {\n requireXdotool();\n const xKey = safeXdotoolKey(safeKey);\n runCommand(\"xdotool\", [\"key\", xKey], 5000);\n } else if (os === \"win32\") {\n const escaped = safeKey.replace(/'/g, \"''\");\n runCommand(\n \"powershell\",\n [\n \"-Command\",\n `Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SendKeys]::SendWait('${escaped}')`,\n ],\n 5000,\n );\n }\n },\n \"desktop_key_press\",\n );\n}\n\n// ── Key Combo ───────────────────────────────────────────────────────────────\n\n/**\n * Press a key combination like \"ctrl+c\", \"cmd+shift+s\", \"alt+F4\".\n * Modifier names: ctrl, shift, alt, cmd/meta/super.\n *\n * Ported from open-computer-use desktopKeyCombo().\n */\nexport function desktopKeyCombo(combo: string): void {\n runWithAccessibilityPermission(\n \"desktop_key_combo\",\n () => {\n const safeCombo = validateKeypress(combo);\n const parts = safeCombo.split(\"+\").map((p) => p.trim().toLowerCase());\n const os = currentPlatform();\n\n if (os === \"darwin\") {\n // Map modifier names to AppleScript \"using\" clauses\n const modifierMap: Record<string, string> = {\n cmd: \"command down\",\n command: \"command down\",\n meta: \"command down\",\n super: \"command down\",\n ctrl: \"control down\",\n control: \"control down\",\n shift: \"shift down\",\n alt: \"option down\",\n option: \"option down\",\n };\n const macKeyCodes: Record<string, number> = {\n return: 36,\n enter: 36,\n tab: 48,\n space: 49,\n escape: 53,\n esc: 53,\n delete: 51,\n backspace: 51,\n forwarddelete: 117,\n left: 123,\n right: 124,\n down: 125,\n up: 126,\n home: 115,\n end: 119,\n pageup: 116,\n pagedown: 121,\n f1: 122,\n f2: 120,\n f3: 99,\n f4: 118,\n f5: 96,\n f6: 97,\n f7: 98,\n f8: 100,\n f9: 101,\n f10: 109,\n f11: 103,\n f12: 111,\n };\n const modifiers: string[] = [];\n let key = \"\";\n for (const part of parts) {\n if (modifierMap[part]) {\n modifiers.push(modifierMap[part]);\n } else {\n key = part;\n }\n }\n const using =\n modifiers.length > 0 ? ` using {${modifiers.join(\", \")}}` : \"\";\n const canonical = canonicalKeyName(key);\n const keyCode = macKeyCodes[canonical];\n const command =\n keyCode !== undefined\n ? `tell application \"System Events\" to key code ${keyCode}${using}`\n : `tell application \"System Events\" to keystroke ${escapeAppleScript(key)}${using}`;\n runCommand(\"osascript\", [\"-e\", command], 5000);\n } else if (os === \"linux\") {\n requireXdotool();\n // xdotool key combo: \"ctrl+c\" → \"ctrl+c\" (xdotool understands this directly)\n const xParts = parts.map((p) => {\n const xMap: Record<string, string> = {\n cmd: \"super\",\n command: \"super\",\n meta: \"super\",\n ctrl: \"ctrl\",\n control: \"ctrl\",\n };\n return xMap[p] ?? toXdotoolKeyName(p);\n });\n runCommand(\"xdotool\", [\"key\", xParts.join(\"+\")], 5000);\n } else if (os === \"win32\") {\n // PowerShell SendKeys: ^ = Ctrl, + = Shift, % = Alt\n const psModMap: Record<string, string> = {\n ctrl: \"^\",\n control: \"^\",\n shift: \"+\",\n alt: \"%\",\n cmd: \"^\",\n command: \"^\",\n meta: \"^\",\n super: \"^\", // Map cmd → ctrl on Windows\n };\n let prefix = \"\";\n let key = \"\";\n for (const part of parts) {\n if (psModMap[part]) {\n prefix += psModMap[part];\n } else {\n key = part;\n }\n }\n const mappedKey = toWindowsSendKey(key);\n const sendKey = `${prefix}${mappedKey}`.replace(/'/g, \"''\");\n runCommand(\n \"powershell\",\n [\n \"-Command\",\n `Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SendKeys]::SendWait('${sendKey}')`,\n ],\n 5000,\n );\n }\n },\n \"desktop_key_combo\",\n );\n}\n\nfunction runWithAccessibilityPermission<T>(\n operation: string,\n handler: () => T,\n _command?: string,\n): T {\n try {\n return handler();\n } catch (error) {\n if (isPermissionDeniedError(error)) {\n throw error;\n }\n const permissionError = classifyPermissionDeniedError(error, {\n permissionType: \"accessibility\",\n operation,\n });\n if (permissionError) {\n throw permissionError;\n }\n throw error;\n }\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction normalizeModifiers(modifiers: string[]): string[] {\n const normalized = modifiers\n .map((modifier) => modifier.trim().toLowerCase())\n .filter(Boolean);\n\n for (const modifier of normalized) {\n if (\n ![\n \"cmd\",\n \"command\",\n \"meta\",\n \"super\",\n \"ctrl\",\n \"control\",\n \"alt\",\n \"option\",\n \"shift\",\n ].includes(modifier)\n ) {\n throw new Error(`Unsupported modifier key: ${modifier}`);\n }\n }\n\n return normalized;\n}\n\nfunction requireXdotool(): void {\n if (!commandExists(\"xdotool\")) {\n throw new Error(\n \"xdotool is required for mouse/keyboard control on Linux. Install via: sudo apt install xdotool\",\n );\n }\n}\n",
17
+ "/**\n * Cross-platform desktop driver backed by @nut-tree-fork/nut-js.\n *\n * Wraps native libnut bindings into the same input surface exposed by\n * the legacy per-OS shell drivers in `desktop.ts` and `screenshot.ts`.\n * Selected at runtime via `ELIZA_COMPUTERUSE_DRIVER=nutjs` (default) — the\n * legacy shell drivers remain the fallback when the env var is set to\n * `legacy` or when the native module fails to load.\n *\n * Native module loading: nut-js ships prebuilt binaries via `libnut`. We\n * load it eagerly at module init and surface a clean diagnostic if the\n * binary is missing for the current arch (`isAvailable()` reports false).\n */\nimport { createRequire } from \"node:module\";\nimport { readFileSync, unlinkSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ScreenRegion } from \"../types.js\";\nimport { canonicalKeyName, validateInt, validateText } from \"./helpers.js\";\n\nconst requireFromHere = createRequire(import.meta.url);\n\ninterface NutModule {\n mouse: {\n config: { mouseSpeed: number; autoDelayMs: number };\n setPosition: (point: { x: number; y: number }) => Promise<unknown>;\n move: (path: Promise<unknown> | unknown) => Promise<unknown>;\n click: (button: number) => Promise<unknown>;\n doubleClick: (button: number) => Promise<unknown>;\n pressButton: (button: number) => Promise<unknown>;\n releaseButton: (button: number) => Promise<unknown>;\n scrollUp: (amount: number) => Promise<unknown>;\n scrollDown: (amount: number) => Promise<unknown>;\n scrollLeft: (amount: number) => Promise<unknown>;\n scrollRight: (amount: number) => Promise<unknown>;\n };\n keyboard: {\n config: { autoDelayMs: number };\n type: (input: string) => Promise<unknown>;\n pressKey: (...keys: number[]) => Promise<unknown>;\n releaseKey: (...keys: number[]) => Promise<unknown>;\n };\n screen: {\n width: () => Promise<number>;\n height: () => Promise<number>;\n capture: (\n fileName: string,\n fileFormat: number,\n filePath?: string,\n ) => Promise<string>;\n captureRegion: (\n fileName: string,\n region: { left: number; top: number; width: number; height: number },\n fileFormat: number,\n filePath?: string,\n ) => Promise<string>;\n };\n Button: { LEFT: number; MIDDLE: number; RIGHT: number };\n Key: Record<string, number>;\n Point: new (x: number, y: number) => { x: number; y: number };\n straightTo: (\n target: { x: number; y: number },\n ) => Promise<unknown> | unknown;\n FileType: { PNG: number; JPG: number };\n}\n\nlet cachedModule: NutModule | null = null;\nlet loadError: Error | null = null;\n\nfunction loadNut(): NutModule | null {\n if (cachedModule !== null) return cachedModule;\n if (loadError !== null) return null;\n try {\n const mod = requireFromHere(\"@nut-tree-fork/nut-js\") as NutModule;\n mod.mouse.config.mouseSpeed = 1000;\n mod.mouse.config.autoDelayMs = 0;\n mod.keyboard.config.autoDelayMs = 0;\n cachedModule = mod;\n return mod;\n } catch (err) {\n loadError = err instanceof Error ? err : new Error(String(err));\n return null;\n }\n}\n\nexport function isAvailable(): boolean {\n return loadNut() !== null;\n}\n\nexport function loadFailureReason(): string | null {\n if (cachedModule) return null;\n loadNut();\n return loadError ? loadError.message : null;\n}\n\nfunction nut(): NutModule {\n const m = loadNut();\n if (!m) {\n throw new Error(\n `nutjs driver unavailable: ${loadError?.message ?? \"module did not load\"}`,\n );\n }\n return m;\n}\n\nconst MODIFIER_KEYS: Record<string, string[]> = {\n cmd: [\"LeftSuper\"],\n command: [\"LeftSuper\"],\n meta: [\"LeftSuper\"],\n super: [\"LeftSuper\"],\n win: [\"LeftSuper\"],\n ctrl: [\"LeftControl\"],\n control: [\"LeftControl\"],\n alt: [\"LeftAlt\"],\n option: [\"LeftAlt\"],\n shift: [\"LeftShift\"],\n};\n\nconst NAMED_KEY_TO_NUT: Record<string, string> = {\n enter: \"Return\",\n return: \"Return\",\n tab: \"Tab\",\n space: \"Space\",\n escape: \"Escape\",\n esc: \"Escape\",\n backspace: \"Backspace\",\n delete: \"Delete\",\n forwarddelete: \"Delete\",\n left: \"Left\",\n right: \"Right\",\n up: \"Up\",\n down: \"Down\",\n home: \"Home\",\n end: \"End\",\n pageup: \"PageUp\",\n pagedown: \"PageDown\",\n};\n\nfunction resolveKeyCode(key: string): number {\n const m = nut();\n const canonical = canonicalKeyName(key);\n // Function keys F1..F24\n const fnMatch = canonical.match(/^f(\\d{1,2})$/);\n if (fnMatch) {\n const name = `F${fnMatch[1]}`;\n const code = m.Key[name];\n if (code !== undefined) return code;\n }\n const mapped = NAMED_KEY_TO_NUT[canonical];\n if (mapped !== undefined) {\n const code = m.Key[mapped];\n if (code !== undefined) return code;\n }\n // Single character — map A-Z / 0-9 directly via Key enum\n if (key.length === 1) {\n const upper = key.toUpperCase();\n if (m.Key[upper] !== undefined) return m.Key[upper];\n const digitName = `Num${key}`;\n if (m.Key[digitName] !== undefined) return m.Key[digitName];\n }\n // Last resort: lookup by raw name as-typed\n const raw = m.Key[key];\n if (raw !== undefined) return raw;\n throw new Error(`Unsupported key for nutjs driver: \"${key}\"`);\n}\n\nfunction resolveModifierCodes(modifier: string): number[] {\n const m = nut();\n const names = MODIFIER_KEYS[modifier.trim().toLowerCase()];\n if (!names) {\n throw new Error(`Unsupported modifier: \"${modifier}\"`);\n }\n return names.map((name) => {\n const code = m.Key[name];\n if (code === undefined) {\n throw new Error(`nutjs Key enum missing entry for \"${name}\"`);\n }\n return code;\n });\n}\n\n// ── Mouse ───────────────────────────────────────────────────────────────────\n\nexport async function nutClick(x: number, y: number): Promise<void> {\n const m = nut();\n const sx = validateInt(x);\n const sy = validateInt(y);\n await m.mouse.setPosition(new m.Point(sx, sy));\n await m.mouse.click(m.Button.LEFT);\n}\n\nexport async function nutClickWithModifiers(\n x: number,\n y: number,\n modifiers: string[],\n): Promise<void> {\n const m = nut();\n const sx = validateInt(x);\n const sy = validateInt(y);\n const modCodes = modifiers.flatMap((mod) => resolveModifierCodes(mod));\n await m.mouse.setPosition(new m.Point(sx, sy));\n if (modCodes.length === 0) {\n await m.mouse.click(m.Button.LEFT);\n return;\n }\n await m.keyboard.pressKey(...modCodes);\n try {\n await m.mouse.click(m.Button.LEFT);\n } finally {\n await m.keyboard.releaseKey(...modCodes.reverse());\n }\n}\n\nexport async function nutDoubleClick(x: number, y: number): Promise<void> {\n const m = nut();\n await m.mouse.setPosition(new m.Point(validateInt(x), validateInt(y)));\n await m.mouse.doubleClick(m.Button.LEFT);\n}\n\nexport async function nutRightClick(x: number, y: number): Promise<void> {\n const m = nut();\n await m.mouse.setPosition(new m.Point(validateInt(x), validateInt(y)));\n await m.mouse.click(m.Button.RIGHT);\n}\n\nexport async function nutMouseMove(x: number, y: number): Promise<void> {\n const m = nut();\n await m.mouse.setPosition(new m.Point(validateInt(x), validateInt(y)));\n}\n\nexport async function nutDrag(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): Promise<void> {\n const m = nut();\n const sx1 = validateInt(x1);\n const sy1 = validateInt(y1);\n const sx2 = validateInt(x2);\n const sy2 = validateInt(y2);\n await m.mouse.setPosition(new m.Point(sx1, sy1));\n await m.mouse.pressButton(m.Button.LEFT);\n try {\n await m.mouse.move(m.straightTo(new m.Point(sx2, sy2)));\n } finally {\n await m.mouse.releaseButton(m.Button.LEFT);\n }\n}\n\nexport async function nutScroll(\n x: number,\n y: number,\n direction: \"up\" | \"down\" | \"left\" | \"right\",\n amount: number,\n): Promise<void> {\n const m = nut();\n const sx = validateInt(x);\n const sy = validateInt(y);\n const clicks = Math.max(1, Math.min(validateInt(amount), 20));\n await m.mouse.setPosition(new m.Point(sx, sy));\n if (direction === \"up\") await m.mouse.scrollUp(clicks);\n else if (direction === \"down\") await m.mouse.scrollDown(clicks);\n else if (direction === \"left\") await m.mouse.scrollLeft(clicks);\n else await m.mouse.scrollRight(clicks);\n}\n\n// ── Keyboard ────────────────────────────────────────────────────────────────\n\nexport async function nutType(text: string): Promise<void> {\n const m = nut();\n const safe = validateText(text);\n await m.keyboard.type(safe);\n}\n\nexport async function nutKeyPress(key: string): Promise<void> {\n const m = nut();\n const code = resolveKeyCode(key);\n await m.keyboard.pressKey(code);\n await m.keyboard.releaseKey(code);\n}\n\nexport async function nutKeyCombo(combo: string): Promise<void> {\n const m = nut();\n const parts = combo.split(\"+\").map((p) => p.trim());\n const modifierCodes: number[] = [];\n let mainKey: string | null = null;\n for (const part of parts) {\n const lower = part.toLowerCase();\n if (MODIFIER_KEYS[lower]) {\n modifierCodes.push(...resolveModifierCodes(lower));\n } else {\n mainKey = part;\n }\n }\n if (!mainKey) {\n throw new Error(`Combo \"${combo}\" must include at least one non-modifier key`);\n }\n const mainCode = resolveKeyCode(mainKey);\n if (modifierCodes.length > 0) {\n await m.keyboard.pressKey(...modifierCodes);\n }\n try {\n await m.keyboard.pressKey(mainCode);\n await m.keyboard.releaseKey(mainCode);\n } finally {\n if (modifierCodes.length > 0) {\n await m.keyboard.releaseKey(...modifierCodes.reverse());\n }\n }\n}\n\n// ── Screenshot ──────────────────────────────────────────────────────────────\n\nexport async function nutCaptureScreenshot(\n region?: ScreenRegion,\n): Promise<Buffer> {\n const m = nut();\n const fileName = `computeruse-nutjs-${Date.now()}.png`;\n const dir = tmpdir();\n let absolutePath = \"\";\n try {\n if (region) {\n const r = {\n left: validateInt(region.x),\n top: validateInt(region.y),\n width: validateInt(region.width),\n height: validateInt(region.height),\n };\n absolutePath = await m.screen.captureRegion(\n fileName,\n r,\n m.FileType.PNG,\n dir,\n );\n } else {\n absolutePath = await m.screen.capture(fileName, m.FileType.PNG, dir);\n }\n if (!absolutePath) absolutePath = join(dir, fileName);\n return readFileSync(absolutePath);\n } finally {\n if (absolutePath) {\n try {\n unlinkSync(absolutePath);\n } catch {\n /* best effort */\n }\n }\n }\n}\n\nexport async function nutScreenSize(): Promise<{ width: number; height: number }> {\n const m = nut();\n const [width, height] = await Promise.all([m.screen.width(), m.screen.height()]);\n return { width, height };\n}\n",
18
+ "/**\n * Cross-platform screenshot capture.\n *\n * Ported from:\n * - coasty-ai/open-computer-use screenshot.ts (Apache 2.0)\n * - eliza sandbox-routes.ts captureScreenshot()\n *\n * Uses native CLI tools — no Electron dependency.\n * Full logical resolution is preserved (critical for accurate coordinate mapping).\n */\n\nimport { execSync } from \"node:child_process\";\nimport { readFileSync, unlinkSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ScreenRegion } from \"../types.js\";\nimport { commandExists, currentPlatform, runCommandBuffer } from \"./helpers.js\";\nimport {\n classifyPermissionDeniedError,\n createPermissionDeniedError,\n isPermissionDeniedError,\n} from \"./permissions.js\";\n\nconst SCREEN_RECORDING_OPERATION_MESSAGE =\n \"macOS Screen Recording permission is required for screenshots. Grant access in System Settings > Privacy & Security > Screen Recording, then retry.\";\n\n/**\n * Capture a screenshot of the entire screen (or a region) and return as a Buffer (PNG).\n */\nexport function captureScreenshot(region?: ScreenRegion): Buffer {\n const os = currentPlatform();\n const tmpFile = join(tmpdir(), `computeruse-screenshot-${Date.now()}.png`);\n\n try {\n if (os === \"darwin\") {\n captureDarwin(tmpFile, region);\n } else if (os === \"linux\") {\n captureLinux(tmpFile, region);\n } else if (os === \"win32\") {\n captureWindows(tmpFile, region);\n }\n\n const data = readFileSync(tmpFile);\n if (os === \"darwin\" && data.length === 0) {\n throw createPermissionDeniedError({\n permissionType: \"screen_recording\",\n operation: \"screenshot_capture\",\n message: SCREEN_RECORDING_OPERATION_MESSAGE,\n details: \"screencapture returned an empty file.\",\n });\n }\n\n try {\n unlinkSync(tmpFile);\n } catch {\n /* cleanup best effort */\n }\n return data;\n } catch (err) {\n try {\n unlinkSync(tmpFile);\n } catch {\n /* ignore */\n }\n\n if (isPermissionDeniedError(err)) {\n throw err;\n }\n\n const permissionError = classifyPermissionDeniedError(err, {\n permissionType: \"screen_recording\",\n operation: region ? \"screenshot_region\" : \"screenshot_capture\",\n });\n if (permissionError) {\n throw permissionError;\n }\n\n throw err;\n }\n}\n\n// ── macOS ───────────────────────────────────────────────────────────────────\n\nfunction captureDarwin(tmpFile: string, region?: ScreenRegion): void {\n try {\n if (region) {\n runCommandBuffer(\n \"screencapture\",\n [\n `-R${region.x},${region.y},${region.width},${region.height}`,\n \"-x\",\n tmpFile,\n ],\n 10000,\n );\n } else {\n // -x suppresses the shutter sound\n runCommandBuffer(\"screencapture\", [\"-x\", tmpFile], 10000);\n }\n } catch (error) {\n const permissionError = classifyPermissionDeniedError(error, {\n permissionType: \"screen_recording\",\n operation: region ? \"screenshot_region\" : \"screenshot_capture\",\n });\n if (permissionError) {\n throw permissionError;\n }\n throw error;\n }\n}\n\n// ── Linux ───────────────────────────────────────────────────────────────────\n\nfunction captureLinux(tmpFile: string, region?: ScreenRegion): void {\n // Try tools in preference order\n if (commandExists(\"import\")) {\n if (region) {\n runCommandBuffer(\n \"import\",\n [\n \"-window\",\n \"root\",\n \"-crop\",\n `${region.width}x${region.height}+${region.x}+${region.y}`,\n tmpFile,\n ],\n 10000,\n );\n } else {\n runCommandBuffer(\"import\", [\"-window\", \"root\", tmpFile], 10000);\n }\n } else if (commandExists(\"scrot\")) {\n runCommandBuffer(\"scrot\", [tmpFile], 10000);\n } else if (commandExists(\"gnome-screenshot\")) {\n runCommandBuffer(\"gnome-screenshot\", [\"-f\", tmpFile], 10000);\n } else {\n throw new Error(\n \"No screenshot tool available. Install ImageMagick (import), scrot, or gnome-screenshot.\",\n );\n }\n}\n\n// ── Windows ─────────────────────────────────────────────────────────────────\n\nfunction captureWindows(tmpFile: string, _region?: ScreenRegion): void {\n const escapedPath = tmpFile.replace(/\\//g, \"\\\\\");\n const psCmd = [\n \"Add-Type -AssemblyName System.Windows.Forms\",\n \"$screen = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds\",\n \"$bitmap = New-Object System.Drawing.Bitmap($screen.Width, $screen.Height)\",\n \"$graphics = [System.Drawing.Graphics]::FromImage($bitmap)\",\n \"$graphics.CopyFromScreen($screen.Location, [System.Drawing.Point]::Empty, $screen.Size)\",\n `$bitmap.Save('${escapedPath}')`,\n \"$graphics.Dispose()\",\n \"$bitmap.Dispose()\",\n ].join(\"; \");\n\n execSync(`powershell -Command \"${psCmd}\"`, {\n timeout: 15000,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n}\n",
19
+ "/**\n * Driver-selection seam for desktop input + screenshot capture.\n *\n * Default = `nutjs` (cross-platform native bindings via @nut-tree-fork/nut-js).\n * Set `ELIZA_COMPUTERUSE_DRIVER=legacy` to fall back to the per-OS shell\n * drivers (cliclick/xdotool/PowerShell). The legacy drivers also activate\n * automatically when the nutjs native module fails to load.\n *\n * Each exported function dispatches to the chosen backend. Callers (the\n * service, actions, tests) use these wrappers; the underlying `desktop.ts`\n * and `screenshot.ts` modules remain importable for the legacy code path.\n */\n\nimport type { ScreenRegion } from \"../types.js\";\nimport {\n desktopClick,\n desktopClickWithModifiers,\n desktopDoubleClick,\n desktopDrag,\n desktopKeyCombo,\n desktopKeyPress,\n desktopMouseMove,\n desktopRightClick,\n desktopScroll,\n desktopType,\n} from \"./desktop.js\";\nimport {\n isAvailable as nutAvailable,\n loadFailureReason,\n nutCaptureScreenshot,\n nutClick,\n nutClickWithModifiers,\n nutDoubleClick,\n nutDrag,\n nutKeyCombo,\n nutKeyPress,\n nutMouseMove,\n nutRightClick,\n nutScroll,\n nutType,\n} from \"./nut-driver.js\";\nimport { captureScreenshot as legacyCaptureScreenshot } from \"./screenshot.js\";\n\nexport type DriverName = \"nutjs\" | \"legacy\";\n\nlet warned = false;\n\nexport function selectedDriver(): DriverName {\n const requested = (process.env.ELIZA_COMPUTERUSE_DRIVER ?? \"nutjs\")\n .trim()\n .toLowerCase();\n if (requested === \"legacy\") return \"legacy\";\n if (requested !== \"nutjs\") {\n if (!warned) {\n // eslint-disable-next-line no-console\n console.warn(\n `[computeruse] Unknown ELIZA_COMPUTERUSE_DRIVER=${requested}; falling back to legacy.`,\n );\n warned = true;\n }\n return \"legacy\";\n }\n if (!nutAvailable()) {\n if (!warned) {\n // eslint-disable-next-line no-console\n console.warn(\n `[computeruse] nutjs driver unavailable (${loadFailureReason()}); falling back to legacy shell drivers.`,\n );\n warned = true;\n }\n return \"legacy\";\n }\n return \"nutjs\";\n}\n\n// ── Mouse ───────────────────────────────────────────────────────────────────\n\nexport async function driverClick(x: number, y: number): Promise<void> {\n if (selectedDriver() === \"nutjs\") return nutClick(x, y);\n desktopClick(x, y);\n}\n\nexport async function driverClickWithModifiers(\n x: number,\n y: number,\n modifiers: string[],\n): Promise<void> {\n if (selectedDriver() === \"nutjs\") return nutClickWithModifiers(x, y, modifiers);\n desktopClickWithModifiers(x, y, modifiers);\n}\n\nexport async function driverDoubleClick(x: number, y: number): Promise<void> {\n if (selectedDriver() === \"nutjs\") return nutDoubleClick(x, y);\n desktopDoubleClick(x, y);\n}\n\nexport async function driverRightClick(x: number, y: number): Promise<void> {\n if (selectedDriver() === \"nutjs\") return nutRightClick(x, y);\n desktopRightClick(x, y);\n}\n\nexport async function driverMouseMove(x: number, y: number): Promise<void> {\n if (selectedDriver() === \"nutjs\") return nutMouseMove(x, y);\n desktopMouseMove(x, y);\n}\n\nexport async function driverDrag(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): Promise<void> {\n if (selectedDriver() === \"nutjs\") return nutDrag(x1, y1, x2, y2);\n desktopDrag(x1, y1, x2, y2);\n}\n\nexport async function driverScroll(\n x: number,\n y: number,\n direction: \"up\" | \"down\" | \"left\" | \"right\",\n amount = 3,\n): Promise<void> {\n if (selectedDriver() === \"nutjs\") return nutScroll(x, y, direction, amount);\n desktopScroll(x, y, direction, amount);\n}\n\n// ── Keyboard ────────────────────────────────────────────────────────────────\n\nexport async function driverType(text: string): Promise<void> {\n if (selectedDriver() === \"nutjs\") return nutType(text);\n desktopType(text);\n}\n\nexport async function driverKeyPress(key: string): Promise<void> {\n if (selectedDriver() === \"nutjs\") return nutKeyPress(key);\n desktopKeyPress(key);\n}\n\nexport async function driverKeyCombo(combo: string): Promise<void> {\n if (selectedDriver() === \"nutjs\") return nutKeyCombo(combo);\n desktopKeyCombo(combo);\n}\n\n// ── Screenshot ──────────────────────────────────────────────────────────────\n\nexport async function driverCaptureScreenshot(\n region?: ScreenRegion,\n): Promise<Buffer> {\n if (selectedDriver() === \"nutjs\") {\n try {\n return await nutCaptureScreenshot(region);\n } catch {\n return legacyCaptureScreenshot(region);\n }\n }\n return legacyCaptureScreenshot(region);\n}\n",
20
+ "import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport interface PathValidationResult {\n allowed: boolean;\n reason?: string;\n}\n\nexport interface CommandRiskResult {\n blocked: boolean;\n reason?: string;\n}\n\ninterface LabelledPattern {\n pattern: RegExp;\n label: string;\n}\n\ninterface DangerousPattern {\n pattern: RegExp;\n reason: string;\n}\n\nconst CREDENTIAL_PATTERNS: LabelledPattern[] = [\n {\n pattern: /^\\/\\.ssh\\/(?:id_|.*\\.pem$|authorized_keys$|config$)/i,\n label: \"SSH key/config\",\n },\n { pattern: /^\\/\\.gnupg\\//i, label: \"GPG keyring\" },\n { pattern: /^\\/\\.aws\\/credentials$/i, label: \"AWS credentials\" },\n {\n pattern: /^\\/\\.config\\/gcloud\\/application_default_credentials\\.json$/i,\n label: \"GCP credentials\",\n },\n { pattern: /^\\/\\.docker\\/config\\.json$/i, label: \"Docker credentials\" },\n { pattern: /^\\/\\.kube\\/config$/i, label: \"Kubernetes config\" },\n { pattern: /^\\/\\.netrc$/i, label: \"netrc credentials\" },\n { pattern: /^\\/\\.npmrc$/i, label: \"npm credentials\" },\n { pattern: /^\\/\\.git-credentials$/i, label: \"Git stored credentials\" },\n { pattern: /^\\/Library\\/Keychains\\//i, label: \"macOS Keychain\" },\n {\n pattern:\n /\\/(?:Google\\/Chrome|Microsoft\\/Edge|BraveSoftware\\/Brave-Browser)\\/.*\\/Login Data$/i,\n label: \"browser password database\",\n },\n {\n pattern:\n /\\/(?:Google\\/Chrome|Microsoft\\/Edge|BraveSoftware\\/Brave-Browser)\\/.*\\/Cookies$/i,\n label: \"browser cookie database\",\n },\n {\n pattern:\n /\\/\\.mozilla\\/firefox\\/.*\\/(?:logins\\.json|key[34]\\.db|cookies\\.sqlite)$/i,\n label: \"Firefox credential/cookie store\",\n },\n];\n\nconst SYSTEM_DIR_PATTERNS_WIN32: LabelledPattern[] = [\n { pattern: /^[A-Z]:\\/Windows\\//i, label: \"Windows system directory\" },\n { pattern: /^[A-Z]:\\/Program Files/i, label: \"Program Files directory\" },\n { pattern: /^[A-Z]:\\/ProgramData\\//i, label: \"ProgramData directory\" },\n {\n pattern: /^[A-Z]:\\/PROGRA~[1-4]\\//i,\n label: \"Program Files (8.3 short name)\",\n },\n];\n\nconst SYSTEM_DIR_PATTERNS_UNIX: LabelledPattern[] = [\n { pattern: /^\\/boot\\//i, label: \"boot directory\" },\n { pattern: /^\\/sbin\\//i, label: \"system binary directory\" },\n { pattern: /^\\/usr\\/sbin\\//i, label: \"system admin binary directory\" },\n { pattern: /^\\/usr\\/lib\\//i, label: \"system library directory\" },\n {\n pattern: /^\\/etc\\/(?:shadow|sudoers|pam\\.d|master\\.passwd)/i,\n label: \"system auth config\",\n },\n { pattern: /^\\/System\\//i, label: \"macOS System directory\" },\n {\n pattern: /^\\/private\\/var\\/db\\/dslocal/i,\n label: \"macOS Directory Services\",\n },\n { pattern: /^\\/dev\\//i, label: \"device node\" },\n { pattern: /^\\/proc\\//i, label: \"proc filesystem\" },\n { pattern: /^\\/sys\\//i, label: \"sys filesystem\" },\n];\n\nconst WINDOWS_DEVICE_NAME = /^(CON|PRN|AUX|NUL|COM\\d|LPT\\d)(\\..+)?$/i;\n\nconst STRIP_EXACT_ENV = new Set([\n \"INTERNAL_API_KEY\",\n \"CSRF_SECRET\",\n \"ENCRYPTION_KEY\",\n \"SUPABASE_SERVICE_ROLE\",\n \"STRIPE_API_KEY\",\n \"STRIPE_WEBHOOK_SECRET\",\n \"POSTHOG_API_KEY\",\n]);\n\nconst STRIP_PATTERN_ENV: RegExp[] = [\n /^SUPABASE_.*(?:SERVICE_ROLE|SECRET)/i,\n /^STRIPE_.*(?:SECRET|WEBHOOK)/i,\n /^ELIZA_.*(?:SECRET|KEY|TOKEN)/i,\n /^ELIZA_.*(?:SECRET|KEY|TOKEN)/i,\n];\n\nconst DANGEROUS_COMMAND_PATTERNS: DangerousPattern[] = [\n {\n pattern: /\\brm\\s+-[^\\n;|&]*r[^\\n;|&]*\\s+\\/(\\s*$|\\s*;|\\s*&|\\s*\\|)/im,\n reason: \"Recursive deletion of the root filesystem (rm -rf /).\",\n },\n {\n pattern: /\\brm\\s+-[^\\n;|&]*r[^\\n;|&]*\\s+\\/\\*/im,\n reason: \"Recursive deletion of all root contents (rm -rf /*).\",\n },\n {\n pattern: /\\brm\\s+-[^\\n;|&]*r[^\\n;|&]*\\s+~\\/?(\\s|$|;|&|\\|)/im,\n reason: \"Recursive deletion of the entire home directory.\",\n },\n {\n pattern:\n /\\bRemove-Item\\b(?=[^;|&]*-Recurse)(?=[^;|&]*[\\s'\"][A-Z]:[\\\\/](?=[^a-zA-Z0-9]|$))/im,\n reason: \"PowerShell recursive deletion of drive root.\",\n },\n {\n pattern:\n /\\bRemove-Item\\b(?=[^;|&]*-Recurse)(?=[^;|&]*[\\s'\"]\\/{1,2}['\"\\s])/im,\n reason: \"PowerShell recursive deletion of filesystem root.\",\n },\n {\n pattern:\n /\\b(?:powershell|pwsh)(?:\\.exe)?\\b[^|]*-(?:enc|encodedcommand)\\b/im,\n reason: \"Encoded PowerShell command.\",\n },\n {\n pattern: /\\bmkfs(?:\\.\\w+)?\\s/i,\n reason: \"Filesystem format command (mkfs).\",\n },\n {\n pattern: /\\bdd\\s+[^;|&]*\\bof=\\/dev\\/[hs]d/i,\n reason: \"Raw disk write (dd of=/dev/sdX).\",\n },\n {\n pattern: /:\\(\\)\\s*\\{[^}]*:\\s*\\|\\s*:/,\n reason: \"Fork bomb detected.\",\n },\n {\n pattern: /\\breg\\s+delete\\s+HKLM\\\\/i,\n reason: \"System registry deletion.\",\n },\n];\n\nexport function validateFilePath(\n filePath: string,\n operation: \"read\" | \"write\" | \"delete\",\n): PathValidationResult {\n if (!filePath || typeof filePath !== \"string\") {\n return { allowed: false, reason: \"No file path provided.\" };\n }\n\n if (filePath.includes(\"\\0\")) {\n return {\n allowed: false,\n reason: \"Path contains null bytes (possible injection attack).\",\n };\n }\n\n let resolved = path.resolve(filePath);\n if (resolved.startsWith(\"\\\\\\\\\")) {\n return {\n allowed: false,\n reason: \"Network (UNC) paths are blocked. Only local files are allowed.\",\n };\n }\n\n if (process.platform === \"win32\" && /~\\d/.test(resolved)) {\n try {\n const expanded = fs.realpathSync.native(resolved);\n if (expanded !== resolved) {\n resolved = expanded;\n }\n } catch {\n // Ignore nonexistent paths; the static blocklists still apply.\n }\n }\n\n const normalized = resolved.replace(/\\\\/g, \"/\");\n\n if (process.platform === \"win32\" && operation !== \"read\") {\n const basename = path.basename(resolved);\n if (WINDOWS_DEVICE_NAME.test(basename)) {\n return {\n allowed: false,\n reason: `Blocked: \"${basename}\" is a Windows reserved device name.`,\n };\n }\n }\n\n const home = os.homedir().replace(/\\\\/g, \"/\");\n const relativeToHome = normalized.startsWith(`${home}/`)\n ? normalized.slice(home.length)\n : null;\n if (relativeToHome) {\n for (const { pattern, label } of CREDENTIAL_PATTERNS) {\n if (pattern.test(relativeToHome)) {\n return {\n allowed: false,\n reason: `Blocked: \"${path.basename(resolved)}\" is a ${label} file.`,\n };\n }\n }\n }\n\n if (operation !== \"read\") {\n const patterns =\n process.platform === \"win32\"\n ? SYSTEM_DIR_PATTERNS_WIN32\n : SYSTEM_DIR_PATTERNS_UNIX;\n\n for (const { pattern, label } of patterns) {\n if (pattern.test(normalized)) {\n return {\n allowed: false,\n reason: `Blocked: cannot ${operation} in ${label}.`,\n };\n }\n }\n\n if (/^[A-Z]:\\/?$/i.test(normalized) || normalized === \"/\") {\n return {\n allowed: false,\n reason: `Blocked: cannot ${operation} the filesystem root.`,\n };\n }\n }\n\n return { allowed: true };\n}\n\nexport function sanitizeChildEnv(): Record<string, string | undefined> {\n const env = { ...process.env };\n for (const key of Object.keys(env)) {\n if (STRIP_EXACT_ENV.has(key)) {\n delete env[key];\n continue;\n }\n for (const pattern of STRIP_PATTERN_ENV) {\n if (pattern.test(key)) {\n delete env[key];\n break;\n }\n }\n }\n return env;\n}\n\nexport function checkDangerousCommand(command: string): CommandRiskResult {\n if (!command || typeof command !== \"string\") {\n return { blocked: false };\n }\n\n const trimmed = command.trim();\n for (const { pattern, reason } of DANGEROUS_COMMAND_PATTERNS) {\n if (pattern.test(trimmed)) {\n return {\n blocked: true,\n reason:\n `Command blocked: ${reason}\\n` +\n \"If you genuinely need to run this, execute it manually in a terminal.\",\n };\n }\n }\n\n return { blocked: false };\n}\n",
21
+ "import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { FileActionResult, FileEntry } from \"../types.js\";\nimport { validateFilePath } from \"./security.js\";\n\nexport async function readFile(\n targetPath: string,\n encoding: BufferEncoding = \"utf8\",\n): Promise<FileActionResult> {\n const check = validateFilePath(targetPath, \"read\");\n if (!check.allowed) {\n return { success: false, error: check.reason };\n }\n\n try {\n const content = await fs.readFile(targetPath, { encoding });\n return {\n success: true,\n path: targetPath,\n content: String(content).slice(0, 10000),\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nexport async function writeFile(\n targetPath: string,\n content: string,\n): Promise<FileActionResult> {\n const check = validateFilePath(targetPath, \"write\");\n if (!check.allowed) {\n return { success: false, error: check.reason };\n }\n\n try {\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.writeFile(targetPath, content, \"utf8\");\n return {\n success: true,\n path: targetPath,\n message: \"File written.\",\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nexport async function editFile(\n targetPath: string,\n oldText: string,\n newText: string,\n): Promise<FileActionResult> {\n const check = validateFilePath(targetPath, \"write\");\n if (!check.allowed) {\n return { success: false, error: check.reason };\n }\n\n try {\n const content = await fs.readFile(targetPath, \"utf8\");\n if (!content.includes(oldText)) {\n return {\n success: false,\n error: \"Old text not found in file.\",\n };\n }\n await fs.writeFile(targetPath, content.replace(oldText, newText), \"utf8\");\n return {\n success: true,\n path: targetPath,\n message: \"File edited.\",\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nexport async function appendFile(\n targetPath: string,\n content: string,\n): Promise<FileActionResult> {\n const check = validateFilePath(targetPath, \"write\");\n if (!check.allowed) {\n return { success: false, error: check.reason };\n }\n\n try {\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.appendFile(targetPath, content, \"utf8\");\n return {\n success: true,\n path: targetPath,\n message: \"Content appended.\",\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nexport async function deleteFile(\n targetPath: string,\n): Promise<FileActionResult> {\n const check = validateFilePath(targetPath, \"delete\");\n if (!check.allowed) {\n return { success: false, error: check.reason };\n }\n\n try {\n await fs.unlink(targetPath);\n return {\n success: true,\n path: targetPath,\n message: \"File deleted.\",\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nexport async function fileExists(\n targetPath: string,\n): Promise<FileActionResult> {\n try {\n await fs.access(targetPath);\n const stat = await fs.stat(targetPath);\n return {\n success: true,\n path: targetPath,\n exists: true,\n isFile: stat.isFile(),\n isDirectory: stat.isDirectory(),\n is_file: stat.isFile(),\n is_directory: stat.isDirectory(),\n size: stat.size,\n };\n } catch {\n return {\n success: true,\n path: targetPath,\n exists: false,\n isFile: false,\n isDirectory: false,\n is_file: false,\n is_directory: false,\n size: 0,\n };\n }\n}\n\nexport async function listDirectory(\n targetPath: string,\n): Promise<FileActionResult> {\n const check = validateFilePath(targetPath, \"read\");\n if (!check.allowed) {\n return { success: false, error: check.reason };\n }\n\n try {\n const entries = await fs.readdir(targetPath, { withFileTypes: true });\n const items: FileEntry[] = entries.map((entry) => ({\n name: entry.name,\n type: entry.isDirectory() ? \"directory\" : \"file\",\n path: path.join(targetPath, entry.name),\n }));\n return {\n success: true,\n path: targetPath,\n items,\n count: items.length,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nexport async function deleteDirectory(\n targetPath: string,\n): Promise<FileActionResult> {\n const check = validateFilePath(targetPath, \"delete\");\n if (!check.allowed) {\n return { success: false, error: check.reason };\n }\n\n try {\n await fs.rm(targetPath, { recursive: true, force: true });\n return {\n success: true,\n path: targetPath,\n message: \"Directory deleted.\",\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n",
22
+ "import { execFile } from \"node:child_process\";\nimport os from \"node:os\";\nimport type { TerminalActionResult } from \"../types.js\";\nimport { checkDangerousCommand, sanitizeChildEnv } from \"./security.js\";\n\nexport type TerminalSession = {\n id: string;\n cwd: string;\n createdAt: string;\n lastOutput?: string;\n};\n\nconst sessions = new Map<string, TerminalSession>();\nlet sessionCounter = 0;\nlet lastOutputBuffer = \"\";\n\nfunction truncateOutput(output: string): string {\n return output.slice(0, 5000);\n}\n\nfunction resolveShell(): {\n command: string;\n argsFor: (command: string) => string[];\n} {\n if (process.platform === \"win32\") {\n return {\n command: \"powershell.exe\",\n argsFor: (command) => [\"-NoProfile\", \"-Command\", command],\n };\n }\n\n return {\n command: \"/bin/bash\",\n argsFor: (command) => [\"-c\", command],\n };\n}\n\nexport function connectTerminal(\n arg?: string | { cwd?: string },\n): TerminalActionResult {\n const cwd = typeof arg === \"string\" ? arg : arg?.cwd;\n const sessionId = `term_${++sessionCounter}`;\n const sessionCwd = cwd || os.homedir();\n sessions.set(sessionId, {\n id: sessionId,\n cwd: sessionCwd,\n createdAt: new Date().toISOString(),\n });\n return {\n success: true,\n sessionId,\n session_id: sessionId,\n cwd: sessionCwd,\n message: `Terminal session ${sessionId} created.`,\n };\n}\n\nexport async function executeTerminal(params: {\n command: string;\n timeoutSeconds?: number;\n sessionId?: string;\n cwd?: string;\n}): Promise<TerminalActionResult> {\n const risk = checkDangerousCommand(params.command);\n if (risk.blocked) {\n return {\n success: false,\n output: \"\",\n exitCode: -1,\n error: risk.reason,\n };\n }\n\n const shell = resolveShell();\n const sessionCwd =\n (params.sessionId ? sessions.get(params.sessionId)?.cwd : undefined) ||\n params.cwd ||\n os.homedir();\n const timeoutSeconds = params.timeoutSeconds ?? 30;\n\n return await new Promise<TerminalActionResult>((resolve) => {\n const child = execFile(\n shell.command,\n shell.argsFor(params.command),\n {\n cwd: sessionCwd,\n timeout: timeoutSeconds * 1000,\n maxBuffer: 1024 * 1024,\n env: sanitizeChildEnv(),\n },\n (error, stdout, stderr) => {\n const output = truncateOutput(\n `${stdout}${stderr ? `\\n${stderr}` : \"\"}`,\n );\n lastOutputBuffer = output;\n if (params.sessionId) {\n const existing = sessions.get(params.sessionId);\n if (existing) {\n existing.lastOutput = output;\n }\n }\n if (!error) {\n resolve({\n success: true,\n output,\n exitCode: 0,\n exit_code: 0,\n cwd: sessionCwd,\n sessionId: params.sessionId,\n session_id: params.sessionId,\n });\n return;\n }\n\n const exitCode =\n typeof error.code === \"number\" ? error.code : error.killed ? -1 : 1;\n resolve({\n success: false,\n output,\n exitCode,\n exit_code: exitCode,\n cwd: sessionCwd,\n sessionId: params.sessionId,\n session_id: params.sessionId,\n error: error.message,\n });\n },\n );\n\n const killTimer = setTimeout(\n () => {\n child.kill(\"SIGKILL\");\n resolve({\n success: false,\n output: \"\",\n exitCode: -1,\n exit_code: -1,\n cwd: sessionCwd,\n sessionId: params.sessionId,\n session_id: params.sessionId,\n error: `Command timed out after ${timeoutSeconds}s.`,\n });\n },\n (timeoutSeconds + 1) * 1000,\n );\n\n child.once(\"exit\", () => {\n clearTimeout(killTimer);\n });\n });\n}\n\nexport function readTerminal(\n arg?: string | { session_id?: string; sessionId?: string },\n): TerminalActionResult {\n const sessionId =\n typeof arg === \"string\" ? arg : (arg?.session_id ?? arg?.sessionId);\n const output =\n (sessionId ? sessions.get(sessionId)?.lastOutput : undefined) ??\n lastOutputBuffer;\n return {\n success: true,\n sessionId,\n session_id: sessionId,\n output,\n message: output.length > 0 ? undefined : \"No pending terminal output.\",\n };\n}\n\nexport function typeTerminal(\n arg: string | { text: string; session_id?: string; sessionId?: string },\n): TerminalActionResult {\n const text = typeof arg === \"string\" ? arg : arg.text;\n const sessionId =\n typeof arg === \"string\" ? undefined : (arg.session_id ?? arg.sessionId);\n return {\n success: true,\n sessionId,\n session_id: sessionId,\n message: `queued terminal text: ${text.slice(0, 50)}`,\n };\n}\n\nexport function clearTerminal(\n arg?: string | { session_id?: string; sessionId?: string },\n): TerminalActionResult {\n const sessionId =\n typeof arg === \"string\" ? arg : (arg?.session_id ?? arg?.sessionId);\n return {\n success: true,\n sessionId,\n session_id: sessionId,\n message: \"Terminal cleared.\",\n };\n}\n\nexport function closeTerminal(\n arg?: string | { session_id?: string; sessionId?: string },\n): TerminalActionResult {\n const sessionId =\n typeof arg === \"string\" ? arg : (arg?.session_id ?? arg?.sessionId);\n if (sessionId) {\n sessions.delete(sessionId);\n } else {\n sessions.clear();\n }\n\n return {\n success: true,\n sessionId,\n session_id: sessionId,\n message: `Terminal session ${sessionId ?? \"default\"} closed.`,\n };\n}\n\nexport function closeAllTerminalSessions(): void {\n sessions.clear();\n}\n\nexport function listTerminalSessions(): TerminalSession[] {\n return Array.from(sessions.values());\n}\n\n/** Alias of executeTerminal — upstream calls it execute_command. */\nexport const executeCommand = executeTerminal;\n",
23
+ "/**\n * Cross-platform window listing and management.\n *\n * Ported from:\n * - coasty-ai/open-computer-use local-executor.ts window handlers (Apache 2.0)\n * - eliza sandbox-routes.ts listWindows()\n */\n\nimport { execSync } from \"node:child_process\";\nimport type { ScreenSize, WindowInfo } from \"../types.js\";\nimport {\n commandExists,\n currentPlatform,\n escapeAppleScript,\n runCommand,\n validateInt,\n validateWindowId,\n} from \"./helpers.js\";\n\nfunction escapeAppleScriptString(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nfunction normalizeWindowQuery(value: string): string {\n return value.trim().toLowerCase();\n}\n\nfunction matchesWindowQuery(win: WindowInfo, query: string): boolean {\n const normalized = normalizeWindowQuery(query);\n if (!normalized) return false;\n\n return [win.id, win.title, win.app].some((field) =>\n normalizeWindowQuery(field).includes(normalized),\n );\n}\n\nexport function findWindowsByQuery(\n query: string,\n windows: WindowInfo[] = listWindows(),\n): WindowInfo[] {\n const normalized = normalizeWindowQuery(query);\n if (!normalized) return [];\n\n const exact = windows.filter(\n (win) => normalizeWindowQuery(win.id) === normalized,\n );\n if (exact.length > 0) return exact;\n\n return windows.filter((win) => matchesWindowQuery(win, normalized));\n}\n\nfunction resolveWindowTarget(queryOrId: string): WindowInfo | null {\n const matches = findWindowsByQuery(queryOrId);\n return matches[0] ?? null;\n}\n\nfunction resolveWindowTargetOrThrow(queryOrId: string): WindowInfo {\n const target = resolveWindowTarget(queryOrId);\n if (!target) {\n throw new Error(`Window not found: ${queryOrId}`);\n }\n return target;\n}\n\nfunction resolveWindowCommandId(queryOrId: string): string {\n const target = resolveWindowTarget(queryOrId);\n return validateWindowId(target?.id ?? queryOrId);\n}\n\nexport function resolveWindowMatch(\n queryOrId: string,\n windows: WindowInfo[] = listWindows(),\n): WindowInfo | null {\n return findWindowsByQuery(queryOrId, windows)[0] ?? null;\n}\n\nfunction appleScriptWindowMatchTerms(target: WindowInfo): string[] {\n return [target.id, target.title, target.app]\n .map((value) => normalizeWindowQuery(value))\n .filter((value) => value.length > 0 && value !== \"unknown\");\n}\n\nfunction runDarwinWindowScript(target: WindowInfo, body: string): void {\n const terms = appleScriptWindowMatchTerms(target);\n const termList =\n terms.length > 0\n ? `{${terms.map((term) => `\"${escapeAppleScriptString(term)}\"`).join(\", \")}}`\n : \"{}\";\n const script = `\n tell application \"System Events\"\n repeat with proc in (every process whose visible is true)\n try\n set procName to name of proc\n set matched to false\n repeat with term in ${termList}\n if procName contains term then\n set matched to true\n exit repeat\n end if\n end repeat\n if not matched then\n repeat with w in (every window of proc)\n set winName to name of w\n repeat with term in ${termList}\n if winName contains term then\n set matched to true\n exit repeat\n end if\n end repeat\n if matched then exit repeat\n end repeat\n end if\n if matched then\n ${body}\n exit repeat\n end if\n end try\n end repeat\n end tell`;\n\n runCommand(\"osascript\", [\"-e\", script], 5000);\n}\n\n// ── List Windows ────────────────────────────────────────────────────────────\n\nexport function listWindows(): WindowInfo[] {\n const os = currentPlatform();\n\n if (os === \"darwin\") {\n return listWindowsDarwin();\n }\n if (os === \"linux\") {\n return listWindowsLinux();\n }\n if (os === \"win32\") {\n return listWindowsWindows();\n }\n return [];\n}\n\nfunction listWindowsDarwin(): WindowInfo[] {\n try {\n const script = `\n tell application \"System Events\"\n set windowList to {}\n repeat with proc in (every process whose visible is true)\n try\n repeat with w in (every window of proc)\n set end of windowList to (name of proc) & \"|||\" & (name of w) & \"|||\" & (id of w as text)\n end repeat\n end try\n end repeat\n return windowList as text\n end tell`;\n const output = execSync(`osascript -e '${script}'`, {\n encoding: \"utf-8\",\n timeout: 10000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n return output\n .split(\", \")\n .filter(Boolean)\n .map((entry) => {\n const parts = entry.split(\"|||\");\n return {\n app: parts[0] ?? \"unknown\",\n title: parts[1] ?? \"unknown\",\n id: parts[2] ?? \"0\",\n };\n });\n } catch {\n return [];\n }\n}\n\nfunction listWindowsLinux(): WindowInfo[] {\n try {\n if (commandExists(\"wmctrl\")) {\n const output = execSync(\"wmctrl -l\", {\n encoding: \"utf-8\",\n timeout: 5000,\n });\n return output\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => {\n // wmctrl format: 0x0400000a 0 hostname Title\n const parts = line.trim().split(/\\s+/);\n const id = parts[0] ?? \"0\";\n const title = parts.slice(3).join(\" \") || \"unknown\";\n return { id, title, app: \"unknown\" };\n });\n }\n const output = execSync(\n 'xdotool search --name \"\" getwindowname 2>/dev/null || true',\n { encoding: \"utf-8\", timeout: 5000 },\n );\n return output\n .split(\"\\n\")\n .filter(Boolean)\n .map((line, i) => ({\n id: String(i),\n title: line.trim(),\n app: \"unknown\",\n }));\n } catch {\n return [];\n }\n}\n\nfunction listWindowsWindows(): WindowInfo[] {\n try {\n const output = execSync(\n `powershell -Command \"Get-Process | Where-Object {$_.MainWindowTitle} | Select-Object Id, MainWindowTitle | ConvertTo-Json\"`,\n { encoding: \"utf-8\", timeout: 10000 },\n );\n const parsed = JSON.parse(output);\n const list = Array.isArray(parsed) ? parsed : [parsed];\n return list.map((p: { Id: number; MainWindowTitle: string }) => ({\n id: String(p.Id),\n title: p.MainWindowTitle,\n app: \"unknown\",\n }));\n } catch {\n return [];\n }\n}\n\n// ── Focus Window ────────────────────────────────────────────────────────────\n\nexport function focusWindow(windowId: string): void {\n const os = currentPlatform();\n const target = resolveWindowTarget(windowId);\n\n if (os === \"darwin\") {\n const commandTarget = target ?? resolveWindowTargetOrThrow(windowId);\n try {\n runDarwinWindowScript(commandTarget, \"set frontmost of proc to true\");\n } catch {\n runCommand(\n \"osascript\",\n [\n \"-e\",\n `tell application \"${escapeAppleScriptString(commandTarget.app)}\" to activate`,\n ],\n 5000,\n );\n }\n } else if (os === \"linux\") {\n const commandId = resolveWindowCommandId(windowId);\n if (commandExists(\"wmctrl\")) {\n runCommand(\"wmctrl\", [\"-i\", \"-a\", commandId], 5000);\n } else if (commandExists(\"xdotool\")) {\n runCommand(\"xdotool\", [\"windowactivate\", commandId], 5000);\n } else {\n throw new Error(\"Window focus requires wmctrl or xdotool on Linux\");\n }\n } else if (os === \"win32\") {\n const commandId = resolveWindowCommandId(windowId);\n const ps = `\n Add-Type -MemberDefinition '[DllImport(\"user32.dll\")] public static extern bool SetForegroundWindow(IntPtr hWnd);' -Name Win32 -Namespace Win32\n $proc = Get-Process -Id ${commandId} -ErrorAction SilentlyContinue\n if (-not $proc) { throw \"Window not found: ${commandId}\" }\n [Win32.Win32]::SetForegroundWindow($proc.MainWindowHandle)\n `;\n runCommand(\"powershell\", [\"-Command\", ps], 5000);\n }\n}\n\nexport function switchWindow(windowQuery: string): void {\n focusWindow(windowQuery);\n}\n\nfunction setWindowBounds(\n windowId: string,\n x: number,\n y: number,\n width?: number,\n height?: number,\n): void {\n const safeX = validateInt(x);\n const safeY = validateInt(y);\n const safeWidth =\n width === undefined ? undefined : Math.max(1, validateInt(width));\n const safeHeight =\n height === undefined ? undefined : Math.max(1, validateInt(height));\n const os = currentPlatform();\n\n if (os === \"darwin\") {\n const target = resolveWindowTargetOrThrow(windowId);\n runDarwinWindowScript(\n target,\n `\n set position of window 1 of proc to {${safeX}, ${safeY}}\n ${\n safeWidth !== undefined && safeHeight !== undefined\n ? `set size of window 1 of proc to {${safeWidth}, ${safeHeight}}`\n : \"\"\n }`,\n );\n return;\n }\n\n const commandId = resolveWindowCommandId(windowId);\n if (os === \"linux\") {\n if (commandExists(\"wmctrl\")) {\n runCommand(\n \"wmctrl\",\n [\n \"-i\",\n \"-r\",\n commandId,\n \"-e\",\n `0,${safeX},${safeY},${safeWidth ?? -1},${safeHeight ?? -1}`,\n ],\n 5000,\n );\n return;\n }\n if (commandExists(\"xdotool\")) {\n runCommand(\n \"xdotool\",\n [\"windowmove\", commandId, String(safeX), String(safeY)],\n 5000,\n );\n if (safeWidth !== undefined && safeHeight !== undefined) {\n runCommand(\n \"xdotool\",\n [\"windowsize\", commandId, String(safeWidth), String(safeHeight)],\n 5000,\n );\n }\n return;\n }\n throw new Error(\"Window move requires wmctrl or xdotool on Linux\");\n }\n\n if (os === \"win32\") {\n const noSizeFlag =\n safeWidth === undefined || safeHeight === undefined ? \"0x0001\" : \"0\";\n const widthArg = safeWidth ?? 0;\n const heightArg = safeHeight ?? 0;\n const ps = `\n Add-Type -MemberDefinition '[DllImport(\"user32.dll\")] public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);' -Name Win32 -Namespace Win32\n $proc = Get-Process -Id ${commandId} -ErrorAction SilentlyContinue\n if (-not $proc) { throw \"Window not found: ${commandId}\" }\n [Win32.Win32]::SetWindowPos($proc.MainWindowHandle, [IntPtr]::Zero, ${safeX}, ${safeY}, ${widthArg}, ${heightArg}, ${noSizeFlag})\n `;\n runCommand(\"powershell\", [\"-Command\", ps], 5000);\n return;\n }\n\n throw new Error(`Window move is not supported on ${os}`);\n}\n\nexport function arrangeWindows(arrangement = \"tile\"): {\n success: true;\n message: string;\n} {\n const windows = listWindows();\n if (windows.length === 0) {\n return {\n success: true,\n message: \"No visible windows found to arrange.\",\n };\n }\n\n const screen = getScreenSize();\n const normalized = arrangement.trim().toLowerCase();\n const count = windows.length;\n const cascadeOffset = 32;\n\n windows.forEach((windowInfo, index) => {\n if (normalized === \"cascade\") {\n const width = Math.max(480, Math.floor(screen.width * 0.72));\n const height = Math.max(360, Math.floor(screen.height * 0.72));\n const maxOffsetX = Math.max(0, screen.width - width);\n const maxOffsetY = Math.max(0, screen.height - height);\n setWindowBounds(\n windowInfo.id,\n Math.min(index * cascadeOffset, maxOffsetX),\n Math.min(index * cascadeOffset, maxOffsetY),\n width,\n height,\n );\n return;\n }\n\n if (normalized === \"vertical\") {\n const width = Math.max(1, Math.floor(screen.width / count));\n setWindowBounds(windowInfo.id, index * width, 0, width, screen.height);\n return;\n }\n\n if (normalized === \"horizontal\") {\n const height = Math.max(1, Math.floor(screen.height / count));\n setWindowBounds(windowInfo.id, 0, index * height, screen.width, height);\n return;\n }\n\n const columns = Math.ceil(Math.sqrt(count));\n const rows = Math.ceil(count / columns);\n const width = Math.max(1, Math.floor(screen.width / columns));\n const height = Math.max(1, Math.floor(screen.height / rows));\n const column = index % columns;\n const row = Math.floor(index / columns);\n setWindowBounds(windowInfo.id, column * width, row * height, width, height);\n });\n\n return {\n success: true,\n message: `Arranged ${windows.length} window${windows.length === 1 ? \"\" : \"s\"} using ${normalized || \"tile\"} layout.`,\n };\n}\n\nexport function moveWindow(\n windowId: string,\n x?: number,\n y?: number,\n): {\n success: true;\n message: string;\n} {\n if (typeof x !== \"number\" || typeof y !== \"number\") {\n throw new Error(\"x and y are required for window move\");\n }\n setWindowBounds(windowId, x, y);\n return {\n success: true,\n message: `Moved window to (${validateInt(x)}, ${validateInt(y)}).`,\n };\n}\n\n// ── Minimize Window ─────────────────────────────────────────────────────────\n\nexport function minimizeWindow(windowId: string): void {\n const os = currentPlatform();\n const target = resolveWindowTarget(windowId);\n\n if (os === \"darwin\") {\n runDarwinWindowScript(\n target ?? resolveWindowTargetOrThrow(windowId),\n \"set miniaturized of window 1 of proc to true\",\n );\n } else if (os === \"linux\") {\n const commandId = resolveWindowCommandId(windowId);\n if (commandExists(\"xdotool\")) {\n runCommand(\"xdotool\", [\"windowminimize\", commandId], 5000);\n } else {\n throw new Error(\"Window minimize requires xdotool on Linux\");\n }\n } else if (os === \"win32\") {\n const commandId = resolveWindowCommandId(windowId);\n const ps = `\n Add-Type -MemberDefinition '[DllImport(\"user32.dll\")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);' -Name Win32 -Namespace Win32\n $proc = Get-Process -Id ${commandId} -ErrorAction SilentlyContinue\n if (-not $proc) { throw \"Window not found: ${commandId}\" }\n [Win32.Win32]::ShowWindow($proc.MainWindowHandle, 6)\n `;\n runCommand(\"powershell\", [\"-Command\", ps], 5000);\n }\n}\n\n// ── Maximize Window ─────────────────────────────────────────────────────────\n\nexport function maximizeWindow(windowId: string): void {\n const os = currentPlatform();\n const target = resolveWindowTarget(windowId);\n\n if (os === \"darwin\") {\n runDarwinWindowScript(\n target ?? resolveWindowTargetOrThrow(windowId),\n 'set value of attribute \"AXFullScreen\" of window 1 of proc to true',\n );\n } else if (os === \"linux\") {\n const commandId = resolveWindowCommandId(windowId);\n if (commandExists(\"wmctrl\")) {\n runCommand(\n \"wmctrl\",\n [\"-i\", \"-r\", commandId, \"-b\", \"add,maximized_vert,maximized_horz\"],\n 5000,\n );\n } else {\n throw new Error(\"Window maximize requires wmctrl on Linux\");\n }\n } else if (os === \"win32\") {\n const commandId = resolveWindowCommandId(windowId);\n const ps = `\n Add-Type -MemberDefinition '[DllImport(\"user32.dll\")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);' -Name Win32 -Namespace Win32\n $proc = Get-Process -Id ${commandId} -ErrorAction SilentlyContinue\n if (-not $proc) { throw \"Window not found: ${commandId}\" }\n [Win32.Win32]::ShowWindow($proc.MainWindowHandle, 3)\n `;\n runCommand(\"powershell\", [\"-Command\", ps], 5000);\n }\n}\n\nexport function restoreWindow(windowId: string): void {\n const os = currentPlatform();\n const target = resolveWindowTarget(windowId);\n\n if (os === \"darwin\") {\n runDarwinWindowScript(\n target ?? resolveWindowTargetOrThrow(windowId),\n `\n try\n set miniaturized of window 1 of proc to false\n end try\n set frontmost of proc to true`,\n );\n } else if (os === \"linux\") {\n const commandId = resolveWindowCommandId(windowId);\n if (commandExists(\"wmctrl\")) {\n runCommand(\n \"wmctrl\",\n [\"-i\", \"-r\", commandId, \"-b\", \"remove,maximized_vert,maximized_horz\"],\n 5000,\n );\n runCommand(\"wmctrl\", [\"-i\", \"-a\", commandId], 5000);\n } else if (commandExists(\"xdotool\")) {\n runCommand(\"xdotool\", [\"windowactivate\", commandId], 5000);\n } else {\n throw new Error(\"Window restore requires wmctrl or xdotool on Linux\");\n }\n } else if (os === \"win32\") {\n const commandId = resolveWindowCommandId(windowId);\n const ps = `\n Add-Type -MemberDefinition '[DllImport(\"user32.dll\")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);' -Name Win32 -Namespace Win32\n $proc = Get-Process -Id ${commandId} -ErrorAction SilentlyContinue\n if (-not $proc) { throw \"Window not found: ${commandId}\" }\n [Win32.Win32]::ShowWindow($proc.MainWindowHandle, 9)\n `;\n runCommand(\"powershell\", [\"-Command\", ps], 5000);\n }\n}\n\n// ── Close Window ────────────────────────────────────────────────────────────\n\nexport function closeWindow(windowId: string): void {\n const os = currentPlatform();\n const target = resolveWindowTarget(windowId);\n\n if (os === \"darwin\") {\n runDarwinWindowScript(\n target ?? resolveWindowTargetOrThrow(windowId),\n \"click button 1 of window 1 of proc\",\n );\n } else if (os === \"linux\") {\n const commandId = resolveWindowCommandId(windowId);\n if (commandExists(\"wmctrl\")) {\n runCommand(\"wmctrl\", [\"-i\", \"-c\", commandId], 5000);\n } else if (commandExists(\"xdotool\")) {\n runCommand(\"xdotool\", [\"windowclose\", commandId], 5000);\n } else {\n throw new Error(\"Window close requires wmctrl or xdotool on Linux\");\n }\n } else if (os === \"win32\") {\n const commandId = resolveWindowCommandId(windowId);\n const ps = `Stop-Process -Id ${commandId} -ErrorAction SilentlyContinue`;\n runCommand(\"powershell\", [\"-Command\", ps], 5000);\n }\n}\n\nexport const list_windows = listWindows;\nexport const focus_window = focusWindow;\nexport const switch_to_window = switchWindow;\nexport const arrange_windows = arrangeWindows;\nexport const move_window = moveWindow;\nexport const minimize_window = minimizeWindow;\nexport const maximize_window = maximizeWindow;\nexport const restore_window = restoreWindow;\nexport const close_window = closeWindow;\n\n// ── Screen Size ─────────────────────────────────────────────────────────────\n\nexport function getScreenSize(): ScreenSize {\n const os = currentPlatform();\n\n if (os === \"darwin\") {\n try {\n const output = execSync(\n `osascript -l JavaScript -e 'ObjC.import(\"CoreGraphics\"); const bounds = $.CGDisplayBounds($.CGMainDisplayID()); String(Math.round(bounds.size.width)) + \",\" + String(Math.round(bounds.size.height));'`,\n { encoding: \"utf-8\", timeout: 3000 },\n );\n const [width, height] = output\n .trim()\n .split(\",\")\n .map((part) => Number.parseInt(part.trim(), 10));\n if (\n Number.isFinite(width) &&\n Number.isFinite(height) &&\n width > 0 &&\n height > 0\n ) {\n return { width, height };\n }\n } catch {\n /* fallback */\n }\n try {\n const output = execSync(\n `osascript -e 'tell application \"Finder\" to get bounds of window of desktop'`,\n { encoding: \"utf-8\", timeout: 5000 },\n );\n // Returns: \"0, 0, 2560, 1440\"\n const parts = output\n .trim()\n .split(\",\")\n .map((p) => Number.parseInt(p.trim(), 10));\n if (parts.length >= 4) {\n return { width: parts[2]!, height: parts[3]! };\n }\n } catch {\n /* fallback */\n }\n // Fallback: system_profiler\n try {\n const output = execSync(\n \"system_profiler SPDisplaysDataType 2>/dev/null | grep Resolution\",\n { encoding: \"utf-8\", timeout: 5000 },\n );\n const match = output.match(/(\\d+)\\s*x\\s*(\\d+)/);\n if (match) {\n return {\n width: Number.parseInt(match[1]!, 10),\n height: Number.parseInt(match[2]!, 10),\n };\n }\n } catch {\n /* fallback */\n }\n return { width: 1920, height: 1080 };\n }\n\n if (os === \"linux\") {\n if (commandExists(\"xdotool\")) {\n try {\n const output = runCommand(\"xdotool\", [\"getdisplaygeometry\"], 3000);\n const parts = output.trim().split(\" \");\n if (parts.length >= 2) {\n return {\n width: Number.parseInt(parts[0]!, 10),\n height: Number.parseInt(parts[1]!, 10),\n };\n }\n } catch {\n /* fallback */\n }\n }\n if (commandExists(\"xrandr\")) {\n try {\n const output = execSync(\"xrandr 2>/dev/null | grep '*'\", {\n encoding: \"utf-8\",\n timeout: 5000,\n });\n const match = output.match(/(\\d+)x(\\d+)/);\n if (match) {\n return {\n width: Number.parseInt(match[1]!, 10),\n height: Number.parseInt(match[2]!, 10),\n };\n }\n } catch {\n /* fallback */\n }\n }\n return { width: 1920, height: 1080 };\n }\n\n if (os === \"win32\") {\n try {\n const output = execSync(\n `powershell -Command \"[System.Windows.Forms.Screen]::PrimaryScreen.Bounds | ConvertTo-Json\"`,\n { encoding: \"utf-8\", timeout: 5000 },\n );\n const bounds = JSON.parse(output);\n return { width: bounds.Width, height: bounds.Height };\n } catch {\n /* fallback */\n }\n return { width: 1920, height: 1080 };\n }\n\n return { width: 1920, height: 1080 };\n}\n",
24
+ "import os from \"node:os\";\nimport path from \"node:path\";\nimport { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport {\n ComputerUseApprovalManager,\n isApprovalMode,\n} from \"../approval-manager.js\";\nimport {\n clickBrowser,\n closeBrowser,\n closeBrowserTab,\n executeBrowser,\n getBrowserClickables,\n getBrowserContext,\n getBrowserDom,\n getBrowserInfo,\n getBrowserState,\n isBrowserAvailable,\n listBrowserTabs,\n navigateBrowser,\n openBrowser,\n openBrowserTab,\n screenshotBrowser,\n scrollBrowser,\n setBrowserRuntimeOptions,\n switchBrowserTab,\n typeBrowser,\n waitBrowser,\n} from \"../platform/browser.js\";\nimport { detectPlatformCapabilities } from \"../platform/capabilities.js\";\nimport {\n driverCaptureScreenshot,\n driverClick,\n driverClickWithModifiers,\n driverDoubleClick,\n driverDrag,\n driverKeyCombo,\n driverKeyPress,\n driverMouseMove,\n driverRightClick,\n driverScroll,\n driverType,\n} from \"../platform/driver.js\";\nimport {\n appendFile,\n deleteDirectory,\n deleteFile,\n editFile,\n fileExists,\n listDirectory,\n readFile,\n writeFile,\n} from \"../platform/file-ops.js\";\nimport { commandExists, currentPlatform } from \"../platform/helpers.js\";\nimport { classifyPermissionDeniedError } from \"../platform/permissions.js\";\nimport {\n clearTerminal,\n closeAllTerminalSessions,\n closeTerminal,\n connectTerminal,\n executeTerminal,\n readTerminal,\n typeTerminal,\n} from \"../platform/terminal.js\";\nimport {\n arrangeWindows,\n closeWindow,\n focusWindow,\n getScreenSize,\n listWindows,\n maximizeWindow,\n minimizeWindow,\n moveWindow,\n restoreWindow,\n switchWindow,\n} from \"../platform/windows-list.js\";\nimport type {\n ActionHistoryEntry,\n ApprovalMode,\n ApprovalResolution,\n ApprovalSnapshot,\n BrowserActionParams,\n BrowserActionResult,\n ComputerActionResult,\n ComputerUseConfig,\n ComputerUseResult,\n DesktopActionParams,\n FileActionParams,\n FileActionResult,\n PlatformCapabilities,\n ScreenSize,\n TerminalActionParams,\n TerminalActionResult,\n WindowActionParams,\n WindowActionResult,\n} from \"../types.js\";\n\nconst MAX_RECENT_ACTIONS = 10;\nconst BROWSER_NOT_OPEN_ERROR = \"Browser not open\";\nconst BROWSER_LIFECYCLE_ACTIONS = new Set<BrowserActionParams[\"action\"]>([\n \"open\",\n \"connect\",\n \"close\",\n]);\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isBrowserNotOpenMessage(message: unknown): boolean {\n const text =\n typeof message === \"string\"\n ? message\n : message instanceof Error\n ? message.message\n : \"\";\n return text.includes(BROWSER_NOT_OPEN_ERROR);\n}\n\nfunction commandParameters<TParams extends object>(\n parameters: Record<string, unknown>,\n): Omit<TParams, \"action\"> {\n return parameters as Omit<TParams, \"action\">;\n}\n\nfunction stringifyData(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n return renderPlainData(value);\n}\n\nfunction renderPlainData(value: unknown, indent = 0): string {\n const prefix = \" \".repeat(indent);\n if (value === null || value === undefined) {\n return \"none\";\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return \"items[0]:\";\n }\n return [\n `items[${value.length}]:`,\n ...value.map((item) => `${prefix}- ${renderPlainData(item, indent + 1)}`),\n ].join(\"\\n\");\n }\n if (typeof value === \"object\") {\n return Object.entries(value as Record<string, unknown>)\n .map(([key, nestedValue]) => {\n if (nestedValue && typeof nestedValue === \"object\") {\n return `${key}:\\n${renderPlainData(nestedValue, indent + 1)}`;\n }\n return `${key}: ${renderPlainData(nestedValue, indent + 1)}`;\n })\n .join(\"\\n\");\n }\n return String(value);\n}\n\nexport class ComputerUseService extends Service {\n static serviceType = \"computeruse\";\n\n capabilityDescription =\n \"Desktop automation, screenshots, browser control, file operations, terminal access, window management, and approval-gated local actions\";\n\n private capabilities!: PlatformCapabilities;\n private recentActions: ActionHistoryEntry[] = [];\n private screenSize: ScreenSize = { width: 1920, height: 1080 };\n private approvalManager = new ComputerUseApprovalManager();\n private cuConfig: ComputerUseConfig = {\n screenshotAfterAction: true,\n actionTimeoutMs: 10000,\n maxRecentActions: MAX_RECENT_ACTIONS,\n approvalMode: \"full_control\",\n browserHeadless: false,\n };\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const instance = new ComputerUseService(runtime);\n instance.loadConfig(runtime);\n instance.capabilities = instance.detectCapabilities();\n\n try {\n instance.screenSize = getScreenSize();\n } catch (error) {\n logger.warn(\n `[computeruse] Falling back to default screen size: ${errorMessage(error)}`,\n );\n }\n\n logger.info(\n `[computeruse] Service started on ${currentPlatform()} (${instance.screenSize.width}x${instance.screenSize.height}) approval=${instance.getApprovalMode()}`,\n );\n\n return instance;\n }\n\n async stop(): Promise<void> {\n this.approvalManager.cancelAll(\"computer-use service stopped\");\n closeAllTerminalSessions();\n try {\n await closeBrowser();\n } catch {\n // ignore browser shutdown failures\n }\n logger.info(\"[computeruse] Service stopped\");\n }\n\n async executeCommand(\n command: string,\n parameters: Record<string, unknown> = {},\n ): Promise<ComputerUseResult> {\n switch (command) {\n case \"screenshot\":\n case \"click\":\n case \"click_with_modifiers\":\n case \"double_click\":\n case \"right_click\":\n case \"mouse_move\":\n case \"type\":\n case \"key_press\":\n case \"key_combo\":\n case \"scroll\":\n case \"drag\":\n case \"detect_elements\":\n case \"ocr\":\n return this.executeDesktopAction({\n ...commandParameters<DesktopActionParams>(parameters),\n action: this.mapDesktopCommandToAction(command),\n });\n case \"browser_open\":\n case \"browser_connect\":\n case \"browser_close\":\n case \"browser_navigate\":\n case \"browser_click\":\n case \"browser_type\":\n case \"browser_scroll\":\n case \"browser_screenshot\":\n case \"browser_dom\":\n case \"browser_get_dom\":\n case \"browser_clickables\":\n case \"browser_get_clickables\":\n case \"browser_execute\":\n case \"browser_state\":\n case \"browser_info\":\n case \"browser_get_context\":\n case \"browser_wait\":\n case \"browser_list_tabs\":\n case \"browser_open_tab\":\n case \"browser_close_tab\":\n case \"browser_switch_tab\":\n return this.executeBrowserAction({\n ...commandParameters<BrowserActionParams>(parameters),\n action: this.mapBrowserCommandToAction(command),\n });\n case \"list_windows\":\n case \"switch_to_window\":\n case \"arrange_windows\":\n case \"move_window\":\n case \"minimize_window\":\n case \"maximize_window\":\n case \"restore_window\":\n case \"close_window\":\n return this.executeWindowAction({\n ...commandParameters<WindowActionParams>(parameters),\n action: this.mapWindowCommandToAction(command),\n });\n case \"file_read\":\n case \"file_write\":\n case \"file_edit\":\n case \"file_append\":\n case \"file_delete\":\n case \"file_exists\":\n case \"directory_list\":\n case \"directory_delete\":\n case \"file_upload\":\n case \"file_download\":\n case \"file_list_downloads\":\n return this.executeFileAction({\n ...commandParameters<FileActionParams>(parameters),\n action: this.mapFileCommandToAction(command),\n });\n case \"terminal_connect\":\n case \"terminal_execute\":\n case \"terminal_read\":\n case \"terminal_type\":\n case \"terminal_clear\":\n case \"terminal_close\":\n case \"execute_command\":\n return this.executeTerminalAction({\n ...commandParameters<TerminalActionParams>(parameters),\n action: this.mapTerminalCommandToAction(command),\n });\n default:\n return {\n success: false,\n error: `Unknown computer-use command: ${command}`,\n };\n }\n }\n\n async executeDesktopAction(\n rawParams: DesktopActionParams,\n ): Promise<ComputerActionResult> {\n const params = this.normalizeDesktopActionParams(rawParams);\n const entry = this.createEntry(params.action, this.toParamsRecord(params));\n\n try {\n const approvalError = await this.awaitApproval(\n this.desktopApprovalCommand(params.action),\n this.toParamsRecord(params),\n );\n if (approvalError) {\n return this.failEntry(entry, { success: false, error: approvalError });\n }\n\n if (params.action === \"detect_elements\") {\n return this.failEntry(entry, {\n success: false,\n error:\n \"Element detection is not available on local machines. Use a screenshot plus model reasoning instead.\",\n });\n }\n\n if (params.action === \"ocr\") {\n return this.failEntry(entry, {\n success: false,\n error:\n \"OCR is not available on local machines. Use a screenshot plus model reasoning instead.\",\n });\n }\n\n switch (params.action) {\n case \"screenshot\":\n return this.succeedEntry(entry, {\n success: true,\n screenshot: await this.captureScreenshotBase64(),\n });\n case \"click\":\n this.requireCoordinate(params.coordinate, \"click\");\n await driverClick(params.coordinate[0], params.coordinate[1]);\n break;\n case \"click_with_modifiers\":\n this.requireCoordinate(params.coordinate, \"click_with_modifiers\");\n await driverClickWithModifiers(\n params.coordinate[0],\n params.coordinate[1],\n params.modifiers ?? [],\n );\n break;\n case \"double_click\":\n this.requireCoordinate(params.coordinate, \"double_click\");\n await driverDoubleClick(params.coordinate[0], params.coordinate[1]);\n break;\n case \"right_click\":\n this.requireCoordinate(params.coordinate, \"right_click\");\n await driverRightClick(params.coordinate[0], params.coordinate[1]);\n break;\n case \"mouse_move\":\n this.requireCoordinate(params.coordinate, \"mouse_move\");\n await driverMouseMove(params.coordinate[0], params.coordinate[1]);\n break;\n case \"type\":\n if (!params.text) throw new Error(\"text is required for type action\");\n await driverType(params.text);\n break;\n case \"key\":\n if (!params.key) throw new Error(\"key is required for key action\");\n await driverKeyPress(params.key);\n break;\n case \"key_combo\":\n if (!params.key) {\n throw new Error(\"key is required for key_combo action\");\n }\n await driverKeyCombo(params.key);\n break;\n case \"scroll\":\n this.requireCoordinate(params.coordinate, \"scroll\");\n await driverScroll(\n params.coordinate[0],\n params.coordinate[1],\n params.scrollDirection ?? \"down\",\n params.scrollAmount ?? 3,\n );\n break;\n case \"drag\":\n this.requireCoordinate(\n params.startCoordinate,\n \"drag\",\n \"startCoordinate\",\n );\n this.requireCoordinate(params.coordinate, \"drag\");\n await driverDrag(\n params.startCoordinate[0],\n params.startCoordinate[1],\n params.coordinate[0],\n params.coordinate[1],\n );\n break;\n default:\n return this.failEntry(entry, {\n success: false,\n error: `Unknown desktop action: ${(params as { action: string }).action}`,\n });\n }\n\n const result: ComputerActionResult = { success: true };\n if (this.shouldCaptureAfterDesktopAction(params.action)) {\n try {\n result.screenshot = await this.captureScreenshotBase64();\n } catch (error) {\n logger.warn(\n `[computeruse] Post-action screenshot failed: ${errorMessage(error)}`,\n );\n }\n }\n return this.succeedEntry(entry, result);\n } catch (error) {\n const permissionError = classifyPermissionDeniedError(error, {\n permissionType:\n params.action === \"screenshot\" ? \"screen_recording\" : \"accessibility\",\n operation: params.action,\n });\n if (permissionError) {\n return this.failEntry(entry, {\n success: false,\n error: permissionError.message,\n permissionDenied: true,\n permissionType: permissionError.permissionType,\n });\n }\n return this.failEntry(entry, {\n success: false,\n error: errorMessage(error),\n });\n }\n }\n\n async executeBrowserAction(\n rawParams: BrowserActionParams,\n ): Promise<BrowserActionResult> {\n const params = this.normalizeBrowserActionParams(rawParams);\n const entry = this.createEntry(\n `browser_${params.action}`,\n this.toParamsRecord(params),\n );\n\n try {\n const approvalError = await this.awaitApproval(\n this.browserApprovalCommand(params.action),\n this.toParamsRecord(params),\n );\n if (approvalError) {\n return this.failEntry(entry, { success: false, error: approvalError });\n }\n\n const result = await this.runBrowserAction(params);\n if (this.shouldAutoOpenBrowser(params.action, result.error)) {\n return await this.retryBrowserActionAfterOpen(entry, params);\n }\n return result.success\n ? this.succeedEntry(entry, result)\n : this.failEntry(entry, result);\n } catch (error) {\n if (this.shouldAutoOpenBrowser(params.action, error)) {\n return await this.retryBrowserActionAfterOpen(entry, params);\n }\n return this.failEntry(entry, {\n success: false,\n error: errorMessage(error),\n });\n }\n }\n\n private async retryBrowserActionAfterOpen(\n entry: ActionHistoryEntry,\n params: BrowserActionParams,\n ): Promise<BrowserActionResult> {\n try {\n const openResult = await this.runBrowserAction({\n ...params,\n action: \"open\",\n });\n if (!openResult.success) {\n return this.failEntry(entry, openResult);\n }\n\n const retryResult = await this.runBrowserAction(params);\n return retryResult.success\n ? this.succeedEntry(entry, retryResult)\n : this.failEntry(entry, retryResult);\n } catch (error) {\n return this.failEntry(entry, {\n success: false,\n error: errorMessage(error),\n });\n }\n }\n\n private shouldAutoOpenBrowser(\n action: BrowserActionParams[\"action\"],\n error: unknown,\n ): boolean {\n return (\n !BROWSER_LIFECYCLE_ACTIONS.has(action) && isBrowserNotOpenMessage(error)\n );\n }\n\n private async runBrowserAction(\n params: BrowserActionParams,\n ): Promise<BrowserActionResult> {\n switch (params.action) {\n case \"open\":\n case \"connect\": {\n const state = await openBrowser(params.url);\n return {\n success: true,\n url: state.url,\n title: state.title,\n isOpen: true,\n is_open: true,\n data: state,\n content: stringifyData(state),\n message: `Opened browser: ${state.url}`,\n };\n }\n case \"close\":\n await closeBrowser();\n return {\n success: true,\n isOpen: false,\n is_open: false,\n message: \"Browser closed.\",\n };\n case \"navigate\": {\n const url = this.requireIdentifier(\n params.url,\n \"url is required for navigate\",\n );\n const state = await navigateBrowser(url);\n return {\n success: true,\n url: state.url,\n title: state.title,\n isOpen: true,\n is_open: true,\n data: state,\n content: stringifyData(state),\n message: `Navigated to ${state.url}`,\n };\n }\n case \"click\":\n await clickBrowser(params.selector, params.coordinate, params.text);\n return {\n success: true,\n message: \"Clicked browser target.\",\n };\n case \"type\":\n if (!params.text) {\n throw new Error(\"text is required for browser type\");\n }\n await typeBrowser(params.text, params.selector);\n return {\n success: true,\n message: \"Typed browser text.\",\n };\n case \"scroll\":\n await scrollBrowser(params.direction ?? \"down\", params.amount ?? 300);\n return {\n success: true,\n message: `Scrolled browser ${params.direction ?? \"down\"}.`,\n };\n case \"screenshot\": {\n const screenshot = await screenshotBrowser();\n return {\n success: true,\n screenshot,\n frontendScreenshot: screenshot,\n message: \"Captured browser screenshot.\",\n };\n }\n case \"dom\":\n case \"get_dom\": {\n const content = await getBrowserDom();\n return {\n success: true,\n content,\n message: \"Fetched browser DOM.\",\n };\n }\n case \"clickables\":\n case \"get_clickables\": {\n const elements = await getBrowserClickables();\n return {\n success: true,\n elements,\n count: elements.length,\n data: elements,\n content: stringifyData(elements),\n message: \"Fetched browser clickables.\",\n };\n }\n case \"execute\": {\n const code = this.requireIdentifier(\n params.code,\n \"code is required for browser execute\",\n );\n const content = await executeBrowser(code);\n return {\n success: true,\n content,\n message: \"Executed browser JavaScript.\",\n };\n }\n case \"state\": {\n const data = await getBrowserState();\n return {\n success: true,\n url: data.url,\n title: data.title,\n isOpen: true,\n is_open: true,\n data,\n content: stringifyData(data),\n };\n }\n case \"info\": {\n const info = await getBrowserInfo();\n return {\n success: info.success,\n url: info.url,\n title: info.title,\n isOpen: info.isOpen,\n is_open: info.is_open,\n data: info,\n content: stringifyData(info),\n ...(info.success ? {} : { error: info.error }),\n };\n }\n case \"context\":\n case \"get_context\": {\n const data = await getBrowserContext();\n return {\n success: true,\n url: data.url,\n title: data.title,\n isOpen: true,\n is_open: true,\n data,\n content: stringifyData(data),\n };\n }\n case \"wait\":\n await waitBrowser(\n params.selector,\n params.text,\n params.timeout ?? this.cuConfig.actionTimeoutMs,\n );\n return {\n success: true,\n message: \"Browser wait condition satisfied.\",\n };\n case \"list_tabs\": {\n const tabs = await listBrowserTabs();\n return {\n success: true,\n tabs,\n count: tabs.length,\n data: tabs,\n content: stringifyData(tabs),\n };\n }\n case \"open_tab\": {\n const tab = await openBrowserTab(params.url);\n return {\n success: true,\n data: tab,\n content: stringifyData(tab),\n message: `Opened tab ${tab.id}.`,\n };\n }\n case \"close_tab\": {\n const tabId = this.requireIdentifier(\n params.tabId,\n \"tabId is required for close_tab\",\n );\n await closeBrowserTab(tabId);\n return {\n success: true,\n message: `Closed tab ${tabId}.`,\n };\n }\n case \"switch_tab\": {\n const tabId = this.requireIdentifier(\n params.tabId,\n \"tabId is required for switch_tab\",\n );\n const state = await switchBrowserTab(tabId);\n return {\n success: true,\n url: state.url,\n title: state.title,\n isOpen: true,\n is_open: true,\n data: state,\n content: stringifyData(state),\n message: `Switched to tab ${tabId}.`,\n };\n }\n default:\n return {\n success: false,\n error: `Unknown browser action: ${(params as { action: string }).action}`,\n };\n }\n }\n\n async executeWindowAction(\n rawParams: WindowActionParams,\n ): Promise<WindowActionResult> {\n const params = this.normalizeWindowActionParams(rawParams);\n const entry = this.createEntry(\n `window_${params.action}`,\n this.toParamsRecord(params),\n );\n\n try {\n const approvalError = await this.awaitApproval(\n this.windowApprovalCommand(params.action),\n this.toParamsRecord(params),\n );\n if (approvalError) {\n return this.failEntry(entry, { success: false, error: approvalError });\n }\n\n switch (params.action) {\n case \"list\": {\n const windows = listWindows();\n return this.succeedEntry(entry, {\n success: true,\n windows,\n count: windows.length,\n });\n }\n case \"focus\":\n focusWindow(this.requireWindowTarget(params));\n return this.succeedEntry(entry, {\n success: true,\n message: \"Focused window.\",\n });\n case \"switch\":\n switchWindow(this.requireWindowTarget(params));\n return this.succeedEntry(entry, {\n success: true,\n message: \"Switched window.\",\n });\n case \"arrange\":\n return this.succeedEntry(entry, arrangeWindows(params.arrangement));\n case \"move\": {\n const result = moveWindow(\n this.requireWindowTarget(params),\n this.requireNumber(params.x, \"x is required for window move\"),\n this.requireNumber(params.y, \"y is required for window move\"),\n );\n return this.succeedEntry(entry, result);\n }\n case \"minimize\":\n minimizeWindow(this.requireWindowTarget(params));\n return this.succeedEntry(entry, {\n success: true,\n message: \"Window minimized.\",\n });\n case \"maximize\":\n maximizeWindow(this.requireWindowTarget(params));\n return this.succeedEntry(entry, {\n success: true,\n message: \"Window maximized.\",\n });\n case \"restore\":\n restoreWindow(this.requireWindowTarget(params));\n return this.succeedEntry(entry, {\n success: true,\n message: \"Window restored.\",\n });\n case \"close\":\n closeWindow(this.requireWindowTarget(params));\n return this.succeedEntry(entry, {\n success: true,\n message: \"Window closed.\",\n });\n default:\n return this.failEntry(entry, {\n success: false,\n error: `Unknown window action: ${(params as { action: string }).action}`,\n });\n }\n } catch (error) {\n const permissionError = classifyPermissionDeniedError(error, {\n permissionType: \"accessibility\",\n operation: params.action,\n });\n if (permissionError) {\n return this.failEntry(entry, {\n success: false,\n error: permissionError.message,\n permissionDenied: true,\n permissionType: permissionError.permissionType,\n });\n }\n return this.failEntry(entry, {\n success: false,\n error: errorMessage(error),\n });\n }\n }\n\n async executeFileAction(\n rawParams: FileActionParams,\n ): Promise<FileActionResult> {\n const params = this.normalizeFileActionParams(rawParams);\n const entry = this.createEntry(\n `file_${params.action}`,\n this.toParamsRecord(params),\n );\n\n try {\n const approvalError = await this.awaitApproval(\n this.fileApprovalCommand(params.action),\n this.toParamsRecord(params),\n );\n if (approvalError) {\n return this.failEntry(entry, { success: false, error: approvalError });\n }\n\n const targetPath =\n params.action === \"list_downloads\"\n ? this.defaultDownloadsPath()\n : this.requireIdentifier(\n params.path,\n \"path is required for file action\",\n );\n\n switch (params.action) {\n case \"read\":\n case \"download\":\n return this.finishFileEntry(\n entry,\n await readFile(targetPath, this.normalizeEncoding(params.encoding)),\n );\n case \"write\":\n case \"upload\":\n if (typeof params.content !== \"string\") {\n throw new Error(\"content is required for file write\");\n }\n return this.finishFileEntry(\n entry,\n await writeFile(targetPath, params.content),\n );\n case \"edit\":\n if (typeof params.old_text !== \"string\") {\n throw new Error(\"old_text is required for file edit\");\n }\n if (typeof params.new_text !== \"string\") {\n throw new Error(\"new_text is required for file edit\");\n }\n return this.finishFileEntry(\n entry,\n await editFile(targetPath, params.old_text, params.new_text),\n );\n case \"append\":\n if (typeof params.content !== \"string\") {\n throw new Error(\"content is required for file append\");\n }\n return this.finishFileEntry(\n entry,\n await appendFile(targetPath, params.content),\n );\n case \"delete\":\n return this.finishFileEntry(entry, await deleteFile(targetPath));\n case \"exists\":\n return this.finishFileEntry(entry, await fileExists(targetPath));\n case \"list\":\n case \"list_downloads\":\n return this.finishFileEntry(entry, await listDirectory(targetPath));\n case \"delete_directory\":\n return this.finishFileEntry(entry, await deleteDirectory(targetPath));\n default:\n return this.failEntry(entry, {\n success: false,\n error: `Unknown file action: ${(params as { action: string }).action}`,\n });\n }\n } catch (error) {\n return this.failEntry(entry, {\n success: false,\n error: errorMessage(error),\n });\n }\n }\n\n async executeTerminalAction(\n rawParams: TerminalActionParams,\n ): Promise<TerminalActionResult> {\n const params = this.normalizeTerminalActionParams(rawParams);\n const entry = this.createEntry(\n `terminal_${params.action}`,\n this.toParamsRecord(params),\n );\n\n try {\n const approvalError = await this.awaitApproval(\n this.terminalApprovalCommand(params.action),\n this.toParamsRecord(params),\n );\n if (approvalError) {\n return this.failEntry(entry, { success: false, error: approvalError });\n }\n\n switch (params.action) {\n case \"connect\":\n return this.finishTerminalEntry(\n entry,\n await connectTerminal(params.cwd),\n );\n case \"execute\":\n return this.finishTerminalEntry(\n entry,\n await executeTerminal({\n command: this.requireIdentifier(\n params.command,\n \"command is required for terminal execute\",\n ),\n timeoutSeconds:\n params.timeout ??\n Math.max(1, Math.ceil(this.cuConfig.actionTimeoutMs / 1000)),\n sessionId: params.sessionId,\n cwd: params.cwd,\n }),\n );\n case \"read\":\n return this.finishTerminalEntry(\n entry,\n await readTerminal(params.sessionId),\n );\n case \"type\":\n return this.finishTerminalEntry(\n entry,\n await typeTerminal(\n this.requireIdentifier(\n params.text,\n \"text is required for terminal type\",\n ),\n ),\n );\n case \"clear\":\n return this.finishTerminalEntry(\n entry,\n await clearTerminal(params.sessionId),\n );\n case \"close\":\n return this.finishTerminalEntry(\n entry,\n await closeTerminal(params.sessionId),\n );\n case \"execute_command\":\n return this.finishTerminalEntry(\n entry,\n await executeTerminal({\n command: this.requireIdentifier(\n params.command,\n \"command is required for execute_command\",\n ),\n timeoutSeconds:\n params.timeout ??\n Math.max(1, Math.ceil(this.cuConfig.actionTimeoutMs / 1000)),\n sessionId: params.sessionId,\n cwd: params.cwd,\n }),\n );\n default:\n return this.failEntry(entry, {\n success: false,\n error: `Unknown terminal action: ${(params as { action: string }).action}`,\n });\n }\n } catch (error) {\n return this.failEntry(entry, {\n success: false,\n error: errorMessage(error),\n });\n }\n }\n\n async captureScreen(): Promise<Buffer> {\n return driverCaptureScreenshot();\n }\n\n getCapabilities(): PlatformCapabilities {\n return this.capabilities;\n }\n\n getRecentActions(): ActionHistoryEntry[] {\n return [...this.recentActions];\n }\n\n getScreenDimensions(): ScreenSize {\n return this.screenSize;\n }\n\n getApprovalMode(): ApprovalMode {\n return this.approvalManager.getMode();\n }\n\n setApprovalMode(mode: ApprovalMode): ApprovalMode {\n const nextMode = this.approvalManager.setMode(mode);\n this.cuConfig.approvalMode = nextMode;\n logger.info(`[computeruse] Approval mode set to ${nextMode}`);\n return nextMode;\n }\n\n getApprovalSnapshot(): ApprovalSnapshot {\n return this.approvalManager.getSnapshot();\n }\n\n subscribeApprovals(\n listener: (snapshot: ApprovalSnapshot) => void,\n ): () => void {\n return this.approvalManager.subscribe(listener);\n }\n\n resolveApproval(\n id: string,\n approved: boolean,\n reason?: string,\n ): ApprovalResolution | null {\n return this.approvalManager.resolveApproval(id, approved, reason);\n }\n\n private normalizeDesktopActionParams(\n params: DesktopActionParams,\n ): DesktopActionParams {\n const coordinate =\n params.coordinate ??\n (params.x !== undefined && params.y !== undefined\n ? [Number(params.x), Number(params.y)]\n : undefined);\n const startCoordinate =\n params.startCoordinate ??\n (params.x1 !== undefined && params.y1 !== undefined\n ? [Number(params.x1), Number(params.y1)]\n : undefined);\n const endCoordinate =\n coordinate ??\n (params.x2 !== undefined && params.y2 !== undefined\n ? [Number(params.x2), Number(params.y2)]\n : undefined);\n\n return {\n ...params,\n coordinate: endCoordinate,\n startCoordinate,\n modifiers: params.modifiers ?? params.hold_keys,\n scrollAmount: params.scrollAmount ?? params.amount,\n };\n }\n\n private normalizeBrowserActionParams(\n params: BrowserActionParams,\n ): BrowserActionParams {\n const tabIdCandidate = params.tabId ?? params.index ?? params.tab_index;\n return {\n ...params,\n tabId: tabIdCandidate !== undefined ? String(tabIdCandidate) : undefined,\n action: this.normalizeBrowserAction(params.action),\n };\n }\n\n private normalizeWindowActionParams(\n params: WindowActionParams,\n ): WindowActionParams {\n return {\n ...params,\n windowId: params.windowId ?? params.window ?? params.title,\n windowTitle: params.windowTitle ?? params.window ?? params.title,\n };\n }\n\n private normalizeFileActionParams(\n params: FileActionParams,\n ): FileActionParams {\n return {\n ...params,\n path: params.path ?? params.filepath ?? params.dirpath,\n old_text: params.old_text ?? params.oldText ?? params.find,\n new_text: params.new_text ?? params.newText ?? params.replace,\n };\n }\n\n private normalizeTerminalActionParams(\n params: TerminalActionParams,\n ): TerminalActionParams {\n return {\n ...params,\n timeout: params.timeout ?? params.timeoutSeconds,\n sessionId: params.sessionId ?? params.session_id,\n action:\n params.action === \"execute_command\" ? \"execute_command\" : params.action,\n };\n }\n\n private normalizeBrowserAction(\n action: BrowserActionParams[\"action\"],\n ): BrowserActionParams[\"action\"] {\n switch (action) {\n case \"get_dom\":\n return \"dom\";\n case \"get_clickables\":\n return \"clickables\";\n case \"get_context\":\n return \"context\";\n default:\n return action;\n }\n }\n\n private desktopApprovalCommand(\n action: DesktopActionParams[\"action\"],\n ): string {\n return action === \"key\" ? \"key_press\" : action;\n }\n\n private browserApprovalCommand(\n action: BrowserActionParams[\"action\"],\n ): string {\n switch (action) {\n case \"open\":\n return \"browser_open\";\n case \"connect\":\n return \"browser_connect\";\n case \"close\":\n return \"browser_close\";\n case \"navigate\":\n return \"browser_navigate\";\n case \"click\":\n return \"browser_click\";\n case \"type\":\n return \"browser_type\";\n case \"scroll\":\n return \"browser_scroll\";\n case \"screenshot\":\n return \"browser_screenshot\";\n case \"dom\":\n return \"browser_get_dom\";\n case \"clickables\":\n return \"browser_get_clickables\";\n case \"execute\":\n return \"browser_execute\";\n case \"state\":\n return \"browser_state\";\n case \"info\":\n return \"browser_info\";\n case \"context\":\n return \"browser_get_context\";\n case \"wait\":\n return \"browser_wait\";\n case \"list_tabs\":\n return \"browser_list_tabs\";\n case \"open_tab\":\n return \"browser_open_tab\";\n case \"close_tab\":\n return \"browser_close_tab\";\n case \"switch_tab\":\n return \"browser_switch_tab\";\n case \"get_dom\":\n return \"browser_get_dom\";\n case \"get_clickables\":\n return \"browser_get_clickables\";\n default:\n return `browser_${action as string}`;\n }\n }\n\n private windowApprovalCommand(action: WindowActionParams[\"action\"]): string {\n switch (action) {\n case \"list\":\n return \"list_windows\";\n case \"focus\":\n case \"switch\":\n return \"switch_to_window\";\n case \"arrange\":\n return \"arrange_windows\";\n case \"move\":\n return \"move_window\";\n case \"minimize\":\n return \"minimize_window\";\n case \"maximize\":\n return \"maximize_window\";\n case \"restore\":\n return \"restore_window\";\n case \"close\":\n return \"close_window\";\n }\n }\n\n private fileApprovalCommand(action: FileActionParams[\"action\"]): string {\n switch (action) {\n case \"read\":\n return \"file_read\";\n case \"write\":\n return \"file_write\";\n case \"edit\":\n return \"file_edit\";\n case \"append\":\n return \"file_append\";\n case \"delete\":\n return \"file_delete\";\n case \"exists\":\n return \"file_exists\";\n case \"list\":\n return \"directory_list\";\n case \"delete_directory\":\n return \"directory_delete\";\n case \"upload\":\n return \"file_upload\";\n case \"download\":\n return \"file_download\";\n case \"list_downloads\":\n return \"file_list_downloads\";\n case \"list_directory\":\n return \"directory_list\";\n default:\n return `file_${action as string}`;\n }\n }\n\n private terminalApprovalCommand(\n action: TerminalActionParams[\"action\"],\n ): string {\n switch (action) {\n case \"connect\":\n return \"terminal_connect\";\n case \"execute\":\n return \"terminal_execute\";\n case \"read\":\n return \"terminal_read\";\n case \"type\":\n return \"terminal_type\";\n case \"clear\":\n return \"terminal_clear\";\n case \"close\":\n return \"terminal_close\";\n case \"execute_command\":\n return \"execute_command\";\n }\n }\n\n private mapDesktopCommandToAction(\n command: string,\n ): DesktopActionParams[\"action\"] {\n switch (command) {\n case \"key_press\":\n return \"key\";\n default:\n return command as DesktopActionParams[\"action\"];\n }\n }\n\n private mapBrowserCommandToAction(\n command: string,\n ): BrowserActionParams[\"action\"] {\n const value = command.replace(/^browser_/, \"\");\n switch (value) {\n case \"get_dom\":\n return \"get_dom\";\n case \"get_clickables\":\n return \"get_clickables\";\n case \"get_context\":\n return \"context\";\n default:\n return value as BrowserActionParams[\"action\"];\n }\n }\n\n private mapWindowCommandToAction(\n command: string,\n ): WindowActionParams[\"action\"] {\n switch (command) {\n case \"list_windows\":\n return \"list\";\n case \"switch_to_window\":\n return \"switch\";\n case \"arrange_windows\":\n return \"arrange\";\n case \"move_window\":\n return \"move\";\n case \"minimize_window\":\n return \"minimize\";\n case \"maximize_window\":\n return \"maximize\";\n case \"restore_window\":\n return \"restore\";\n case \"close_window\":\n return \"close\";\n default:\n return \"list\";\n }\n }\n\n private mapFileCommandToAction(command: string): FileActionParams[\"action\"] {\n switch (command) {\n case \"file_read\":\n return \"read\";\n case \"file_write\":\n return \"write\";\n case \"file_edit\":\n return \"edit\";\n case \"file_append\":\n return \"append\";\n case \"file_delete\":\n return \"delete\";\n case \"file_exists\":\n return \"exists\";\n case \"directory_list\":\n return \"list\";\n case \"directory_delete\":\n return \"delete_directory\";\n case \"file_upload\":\n return \"upload\";\n case \"file_download\":\n return \"download\";\n case \"file_list_downloads\":\n return \"list_downloads\";\n default:\n return \"read\";\n }\n }\n\n private mapTerminalCommandToAction(\n command: string,\n ): TerminalActionParams[\"action\"] {\n switch (command) {\n case \"terminal_connect\":\n return \"connect\";\n case \"terminal_execute\":\n return \"execute\";\n case \"terminal_read\":\n return \"read\";\n case \"terminal_type\":\n return \"type\";\n case \"terminal_clear\":\n return \"clear\";\n case \"terminal_close\":\n return \"close\";\n case \"execute_command\":\n return \"execute_command\";\n default:\n return \"connect\";\n }\n }\n\n private async awaitApproval(\n command: string,\n parameters: Record<string, unknown>,\n ): Promise<string | null> {\n if (this.approvalManager.shouldAutoApprove(command)) {\n return null;\n }\n if (this.approvalManager.isDenyAll()) {\n return `Computer use is paused. \"${command}\" was blocked by approval mode \"${this.approvalManager.getMode()}\".`;\n }\n const decision = await this.approvalManager.requestApproval(\n command,\n parameters,\n );\n if (decision.approved) {\n return null;\n }\n if (decision.cancelled) {\n return decision.reason\n ? `Computer-use approval cancelled: ${decision.reason}`\n : `Computer-use approval cancelled for \"${command}\".`;\n }\n return decision.reason\n ? `Computer-use approval rejected: ${decision.reason}`\n : `Computer-use approval rejected for \"${command}\".`;\n }\n\n private async captureScreenshotBase64(): Promise<string> {\n const buf = await driverCaptureScreenshot();\n return buf.toString(\"base64\");\n }\n\n private shouldCaptureAfterDesktopAction(\n action: DesktopActionParams[\"action\"],\n ): boolean {\n return action !== \"screenshot\" &&\n action !== \"detect_elements\" &&\n action !== \"ocr\"\n ? this.cuConfig.screenshotAfterAction\n : false;\n }\n\n private createEntry(\n action: string,\n params: Record<string, unknown>,\n ): ActionHistoryEntry {\n return {\n action,\n timestamp: Date.now(),\n params,\n success: false,\n };\n }\n\n private succeedEntry<T extends { success: boolean }>(\n entry: ActionHistoryEntry,\n result: T,\n ): T {\n entry.success = true;\n this.pushAction(entry);\n return result;\n }\n\n private failEntry<T extends { success: boolean }>(\n entry: ActionHistoryEntry,\n result: T,\n ): T {\n entry.success = false;\n this.pushAction(entry);\n return result;\n }\n\n private finishFileEntry(\n entry: ActionHistoryEntry,\n result: FileActionResult,\n ): FileActionResult {\n const normalized: FileActionResult = {\n ...result,\n isFile: result.isFile ?? result.is_file,\n isDirectory: result.isDirectory ?? result.is_directory,\n is_file: result.is_file ?? result.isFile,\n is_directory: result.is_directory ?? result.isDirectory,\n };\n return normalized.success\n ? this.succeedEntry(entry, normalized)\n : this.failEntry(entry, normalized);\n }\n\n private finishTerminalEntry(\n entry: ActionHistoryEntry,\n result: TerminalActionResult,\n ): TerminalActionResult {\n const normalized: TerminalActionResult = {\n ...result,\n exitCode: result.exitCode ?? result.exit_code,\n exit_code: result.exit_code ?? result.exitCode,\n sessionId: result.sessionId ?? result.session_id,\n session_id: result.session_id ?? result.sessionId,\n };\n return normalized.success\n ? this.succeedEntry(entry, normalized)\n : this.failEntry(entry, normalized);\n }\n\n private requireCoordinate(\n coordinate: [number, number] | undefined,\n action: string,\n fieldName: string = \"coordinate\",\n ): asserts coordinate is [number, number] {\n if (!coordinate || coordinate.length < 2) {\n throw new Error(`${fieldName} [x, y] is required for ${action}`);\n }\n }\n\n private requireIdentifier(\n value: string | undefined,\n message: string,\n ): string {\n if (!value) {\n throw new Error(message);\n }\n return value;\n }\n\n private requireNumber(value: number | undefined, message: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(message);\n }\n return value;\n }\n\n private requireWindowTarget(params: WindowActionParams): string {\n return (\n params.windowId ??\n params.windowTitle ??\n this.requireIdentifier(undefined, \"windowId or windowTitle is required\")\n );\n }\n\n private normalizeEncoding(\n value: string | BufferEncoding | undefined,\n ): BufferEncoding {\n switch (String(value ?? \"utf8\").toLowerCase()) {\n case \"ascii\":\n return \"ascii\";\n case \"base64\":\n return \"base64\";\n case \"hex\":\n return \"hex\";\n case \"latin1\":\n case \"binary\":\n return \"latin1\";\n case \"ucs2\":\n case \"ucs-2\":\n case \"utf16le\":\n case \"utf-16le\":\n return \"utf16le\";\n default:\n return \"utf8\";\n }\n }\n\n private defaultDownloadsPath(): string {\n return path.join(os.homedir(), \"Downloads\");\n }\n\n private toParamsRecord(value: object): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(value).filter(\n ([, entryValue]) => entryValue !== undefined,\n ),\n );\n }\n\n private pushAction(entry: ActionHistoryEntry): void {\n this.recentActions.push(entry);\n if (this.recentActions.length > this.cuConfig.maxRecentActions) {\n this.recentActions.shift();\n }\n }\n\n private loadConfig(runtime: IAgentRuntime): void {\n const getSetting = (key: string): string | undefined => {\n try {\n const value = runtime.getSetting(key);\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n } catch {\n // ignore runtime setting lookup failures\n }\n return undefined;\n };\n\n const screenshotAfter = getSetting(\"COMPUTER_USE_SCREENSHOT_AFTER_ACTION\");\n if (screenshotAfter !== undefined) {\n this.cuConfig.screenshotAfterAction =\n screenshotAfter !== \"false\" && screenshotAfter !== \"0\";\n }\n\n const timeout = getSetting(\"COMPUTER_USE_ACTION_TIMEOUT_MS\");\n if (timeout) {\n const numericTimeout = Number.parseInt(timeout, 10);\n if (Number.isFinite(numericTimeout) && numericTimeout > 0) {\n this.cuConfig.actionTimeoutMs = numericTimeout;\n }\n }\n\n const approvalMode = getSetting(\"COMPUTER_USE_APPROVAL_MODE\");\n if (approvalMode && isApprovalMode(approvalMode)) {\n this.cuConfig.approvalMode = approvalMode;\n this.approvalManager.setMode(approvalMode);\n }\n\n const browserHeadless = getSetting(\"COMPUTER_USE_BROWSER_HEADLESS\");\n if (browserHeadless !== undefined) {\n this.cuConfig.browserHeadless =\n browserHeadless === \"true\" || browserHeadless === \"1\";\n }\n setBrowserRuntimeOptions({\n headless: this.cuConfig.browserHeadless ?? false,\n });\n }\n\n private detectCapabilities(): PlatformCapabilities {\n return detectPlatformCapabilities({\n osName: currentPlatform(),\n commandExists,\n isBrowserAvailable,\n shell: process.env.SHELL,\n });\n }\n}\n",
25
+ "import { execFileSync } from \"node:child_process\";\nimport { readFileSync, unlinkSync } from \"node:fs\";\nimport { platform, tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport type DesktopInputButton = \"left\" | \"right\";\n\nexport interface DesktopScreenshotRegion {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface DesktopWindowInfo {\n id: string;\n title: string;\n app: string;\n}\n\nexport interface DesktopControlCapability {\n available: boolean;\n tool: string;\n}\n\nexport interface DesktopControlCapabilities {\n screenshot: DesktopControlCapability;\n computerUse: DesktopControlCapability;\n windowList: DesktopControlCapability;\n headfulGui: DesktopControlCapability;\n}\n\nexport function isHeadfulGuiAvailable(): boolean {\n const os = platform();\n if (os === \"darwin\" || os === \"win32\") {\n return true;\n }\n if (os === \"linux\") {\n return Boolean(\n process.env.DISPLAY?.trim() ||\n process.env.WAYLAND_DISPLAY?.trim() ||\n process.env.MIR_SOCKET?.trim(),\n );\n }\n return false;\n}\n\nexport function commandExists(command: string): boolean {\n try {\n const which = platform() === \"win32\" ? \"where\" : \"which\";\n execFileSync(which, [command], {\n stdio: \"ignore\",\n timeout: 3000,\n });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function captureDesktopScreenshot(\n region?: DesktopScreenshotRegion,\n): Buffer {\n const os = platform();\n const tmpFile = join(tmpdir(), `desktop-screenshot-${Date.now()}.png`);\n\n try {\n if (os === \"darwin\") {\n if (region) {\n runMacScreenshotCommand([\n `-R${region.x},${region.y},${region.width},${region.height}`,\n \"-x\",\n tmpFile,\n ]);\n } else {\n runMacScreenshotCommand([\"-x\", tmpFile]);\n }\n } else if (os === \"linux\") {\n if (!isHeadfulGuiAvailable()) {\n throw new Error(\"No Linux GUI display is available.\");\n }\n if (commandExists(\"import\")) {\n if (region) {\n runCommand(\n \"import\",\n [\n \"-window\",\n \"root\",\n \"-crop\",\n `${region.width}x${region.height}+${region.x}+${region.y}`,\n tmpFile,\n ],\n 10000,\n );\n } else {\n runCommand(\"import\", [\"-window\", \"root\", tmpFile], 10000);\n }\n } else if (commandExists(\"scrot\")) {\n runCommand(\"scrot\", [tmpFile], 10000);\n } else if (commandExists(\"gnome-screenshot\")) {\n runCommand(\"gnome-screenshot\", [\"-f\", tmpFile], 10000);\n } else {\n throw new Error(\n \"No screenshot tool available. Install ImageMagick, scrot, or gnome-screenshot.\",\n );\n }\n } else if (os === \"win32\") {\n const windowsPath = tmpFile.replace(/\\//g, \"\\\\\").replace(/'/g, \"''\");\n const psCommand = [\n \"Add-Type -AssemblyName System.Windows.Forms\",\n \"$screen = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds\",\n \"$bitmap = New-Object System.Drawing.Bitmap($screen.Width, $screen.Height)\",\n \"$graphics = [System.Drawing.Graphics]::FromImage($bitmap)\",\n \"$graphics.CopyFromScreen($screen.Location, [System.Drawing.Point]::Empty, $screen.Size)\",\n `$bitmap.Save('${windowsPath}')`,\n \"$graphics.Dispose()\",\n \"$bitmap.Dispose()\",\n ].join(\"; \");\n execFileSync(\"powershell\", [\"-Command\", psCommand], {\n timeout: 15000,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n } else {\n throw new Error(`Screenshot not supported on platform: ${os}`);\n }\n\n const data = readFileSync(tmpFile);\n removeTempFile(tmpFile);\n return data;\n } catch (error) {\n removeTempFile(tmpFile);\n throw error;\n }\n}\n\nexport function listDesktopWindows(): DesktopWindowInfo[] {\n const os = platform();\n\n if (os === \"darwin\") {\n const script = `\n tell application \"System Events\"\n set previousDelimiters to AppleScript's text item delimiters\n set AppleScript's text item delimiters to linefeed\n set windowList to {}\n repeat with proc in (every process whose visible is true)\n try\n repeat with w in (every window of proc)\n set end of windowList to (name of proc) & \"|||\" & (name of w) & \"|||\" & (id of w as text)\n end repeat\n end try\n end repeat\n set serializedWindowList to windowList as text\n set AppleScript's text item delimiters to previousDelimiters\n return serializedWindowList\n end tell`;\n let output: string;\n try {\n output = execFileSync(\"osascript\", [\"-e\", script], {\n encoding: \"utf-8\",\n timeout: 5000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n } catch {\n throw new Error(\n \"Window listing failed. Grant Accessibility permission to this app or terminal and try again.\",\n );\n }\n return output\n .split(\"\\n\")\n .filter(Boolean)\n .map((entry) => {\n const parts = entry.split(\"|||\");\n return {\n app: parts[0] ?? \"unknown\",\n title: parts[1] ?? \"unknown\",\n id: parts[2] ?? \"0\",\n };\n });\n }\n\n if (os === \"linux\") {\n if (commandExists(\"wmctrl\")) {\n const output = execFileSync(\"wmctrl\", [\"-l\"], {\n encoding: \"utf-8\",\n timeout: 5000,\n });\n return output\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => {\n const match = line.match(/^(\\S+)\\s+\\S+\\s+\\S+\\s*(.*)$/);\n return {\n id: match?.[1] ?? \"0\",\n title: match?.[2]?.trim() || line.trim(),\n app: \"unknown\",\n };\n });\n }\n if (commandExists(\"xdotool\")) {\n const output = execFileSync(\n \"sh\",\n [\"-c\", 'xdotool search --name \"\" getwindowname 2>/dev/null'],\n {\n encoding: \"utf-8\",\n timeout: 5000,\n },\n );\n return output\n .split(\"\\n\")\n .filter(Boolean)\n .map((title, index) => ({\n id: String(index),\n title: title.trim(),\n app: \"unknown\",\n }));\n }\n }\n\n if (os === \"win32\") {\n const output = execFileSync(\n \"powershell\",\n [\n \"-Command\",\n \"Get-Process | Where-Object {$_.MainWindowTitle} | Select-Object Id, MainWindowTitle | ConvertTo-Json\",\n ],\n { encoding: \"utf-8\", timeout: 10000 },\n );\n if (!output.trim()) {\n return [];\n }\n const parsed = JSON.parse(output) as\n | { Id: number; MainWindowTitle: string }\n | Array<{ Id: number; MainWindowTitle: string }>;\n const processes = Array.isArray(parsed) ? parsed : [parsed];\n return processes.map((process) => ({\n id: String(process.Id),\n title: process.MainWindowTitle,\n app: \"unknown\",\n }));\n }\n\n return [];\n}\n\nexport function performDesktopClick(\n x: number,\n y: number,\n button: DesktopInputButton = \"left\",\n): void {\n const os = platform();\n\n if (os === \"darwin\") {\n if (commandExists(\"cliclick\")) {\n const clickCommand = button === \"right\" ? \"rc\" : \"c\";\n runCommand(\"cliclick\", [`${clickCommand}:${x},${y}`], 5000);\n return;\n }\n runCommand(\n \"osascript\",\n [\"-e\", `tell application \"System Events\" to click at {${x}, ${y}}`],\n 5000,\n );\n return;\n }\n\n if (os === \"linux\") {\n if (!commandExists(\"xdotool\")) {\n throw new Error(\"xdotool required for mouse control on Linux.\");\n }\n const clickButton = button === \"right\" ? \"3\" : \"1\";\n runCommand(\n \"xdotool\",\n [\"mousemove\", String(x), String(y), \"click\", clickButton],\n 5000,\n );\n return;\n }\n\n if (os === \"win32\") {\n runPowerShellMouseScript(x, y, button === \"right\" ? \"right\" : \"left\", 1);\n return;\n }\n\n throw new Error(`Mouse control not supported on platform: ${os}`);\n}\n\nexport function performDesktopDoubleClick(\n x: number,\n y: number,\n button: DesktopInputButton = \"left\",\n): void {\n const os = platform();\n\n if (os === \"darwin\" && commandExists(\"cliclick\") && button === \"left\") {\n runCommand(\"cliclick\", [`dc:${x},${y}`], 5000);\n return;\n }\n\n if (os === \"linux\") {\n if (!commandExists(\"xdotool\")) {\n throw new Error(\"xdotool required for mouse control on Linux.\");\n }\n const clickButton = button === \"right\" ? \"3\" : \"1\";\n runCommand(\n \"xdotool\",\n [\n \"mousemove\",\n String(x),\n String(y),\n \"click\",\n \"--repeat\",\n \"2\",\n clickButton,\n ],\n 5000,\n );\n return;\n }\n\n if (os === \"win32\") {\n runPowerShellMouseScript(x, y, button === \"right\" ? \"right\" : \"left\", 2);\n return;\n }\n\n performDesktopClick(x, y, button);\n performDesktopClick(x, y, button);\n}\n\nexport function performDesktopMouseMove(x: number, y: number): void {\n const os = platform();\n\n if (os === \"darwin\") {\n if (!commandExists(\"cliclick\")) {\n throw new Error(\"cliclick required for mouse move on macOS.\");\n }\n runCommand(\"cliclick\", [`m:${x},${y}`], 5000);\n return;\n }\n\n if (os === \"linux\") {\n if (!commandExists(\"xdotool\")) {\n throw new Error(\"xdotool required for mouse move on Linux.\");\n }\n runCommand(\"xdotool\", [\"mousemove\", String(x), String(y)], 5000);\n return;\n }\n\n if (os === \"win32\") {\n const psScript = [\n \"Add-Type -AssemblyName System.Windows.Forms\",\n `[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(${x},${y})`,\n ].join(\"; \");\n runCommand(\"powershell\", [\"-Command\", psScript], 5000);\n return;\n }\n\n throw new Error(`Mouse move not supported on platform: ${os}`);\n}\n\nexport function performDesktopScroll(deltaX: number, deltaY: number): void {\n const os = platform();\n const normalizedX = clampScrollDelta(deltaX);\n const normalizedY = clampScrollDelta(deltaY);\n\n if (normalizedX === 0 && normalizedY === 0) {\n return;\n }\n\n if (os === \"darwin\") {\n const psScript = [\n 'ObjC.import(\"ApplicationServices\")',\n `const event = $.CGEventCreateScrollWheelEvent(null, 1, 2, ${-normalizedY}, ${-normalizedX})`,\n \"$.CGEventPost(0, event)\",\n \"$.CFRelease(event)\",\n ].join(\"; \");\n runCommand(\"osascript\", [\"-l\", \"JavaScript\", \"-e\", psScript], 5000);\n return;\n }\n\n if (os === \"linux\") {\n if (!commandExists(\"xdotool\")) {\n throw new Error(\"xdotool required for scroll on Linux.\");\n }\n clickMouseWheel(normalizedY < 0 ? \"4\" : \"5\", Math.abs(normalizedY));\n clickMouseWheel(normalizedX < 0 ? \"6\" : \"7\", Math.abs(normalizedX));\n return;\n }\n\n if (os === \"win32\") {\n const psScript = [\n `Add-Type -MemberDefinition '[DllImport(\"user32.dll\")] public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);' -Name Win32Mouse -Namespace Win32`,\n `[Win32.Win32Mouse]::mouse_event(0x0800, 0, 0, ${normalizedY * -120}, 0)`,\n ].join(\"; \");\n runCommand(\"powershell\", [\"-Command\", psScript], 5000);\n return;\n }\n\n throw new Error(`Scroll not supported on platform: ${os}`);\n}\n\nexport function performDesktopTextInput(text: string): void {\n const os = platform();\n\n if (os === \"darwin\") {\n if (commandExists(\"cliclick\")) {\n runCommand(\"cliclick\", [`t:${text}`], 10000);\n return;\n }\n runCommand(\n \"osascript\",\n [\n \"-e\",\n `tell application \"System Events\" to keystroke ${toAppleScriptStringLiteral(text)}`,\n ],\n 10000,\n );\n return;\n }\n\n if (os === \"linux\") {\n if (!commandExists(\"xdotool\")) {\n throw new Error(\"xdotool required for keyboard input on Linux.\");\n }\n runCommand(\"xdotool\", [\"type\", \"--\", text], 10000);\n return;\n }\n\n if (os === \"win32\") {\n const escaped = text.replace(/'/g, \"''\");\n runCommand(\n \"powershell\",\n [\n \"-Command\",\n `Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SendKeys]::SendWait('${escaped}')`,\n ],\n 10000,\n );\n return;\n }\n\n throw new Error(`Text input not supported on platform: ${os}`);\n}\n\nexport function performDesktopKeypress(keys: string): void {\n const os = platform();\n\n if (os === \"darwin\") {\n if (commandExists(\"cliclick\")) {\n const cliclickKey = toCliclickKey(keys);\n if (cliclickKey) {\n runCommand(\"cliclick\", [`kp:${cliclickKey}`], 5000);\n } else {\n runCommand(\"cliclick\", [`t:${keys}`], 5000);\n }\n return;\n }\n\n const keyCode = macKeyCode(keys);\n if (keyCode !== null) {\n runCommand(\n \"osascript\",\n [\"-e\", `tell application \"System Events\" to key code ${keyCode}`],\n 5000,\n );\n return;\n }\n\n runCommand(\n \"osascript\",\n [\n \"-e\",\n `tell application \"System Events\" to keystroke ${toAppleScriptStringLiteral(keys)}`,\n ],\n 5000,\n );\n return;\n }\n\n if (os === \"linux\") {\n if (!commandExists(\"xdotool\")) {\n throw new Error(\"xdotool required for key input on Linux.\");\n }\n runCommand(\"xdotool\", [\"key\", toXdotoolKey(keys)], 5000);\n return;\n }\n\n if (os === \"win32\") {\n const escaped = toWindowsSendKey(keys).replace(/'/g, \"''\");\n runCommand(\n \"powershell\",\n [\n \"-Command\",\n `Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SendKeys]::SendWait('${escaped}')`,\n ],\n 5000,\n );\n return;\n }\n\n throw new Error(`Key input not supported on platform: ${os}`);\n}\n\nfunction toCliclickKey(keys: string): string | null {\n const keyMap: Record<string, string> = {\n backspace: \"delete\",\n down: \"arrow-down\",\n enter: \"enter\",\n escape: \"esc\",\n esc: \"esc\",\n left: \"arrow-left\",\n right: \"arrow-right\",\n return: \"return\",\n space: \"space\",\n tab: \"tab\",\n up: \"arrow-up\",\n };\n return keyMap[keys.trim().toLowerCase()] ?? null;\n}\n\nfunction toXdotoolKey(keys: string): string {\n const keyMap: Record<string, string> = {\n backspace: \"BackSpace\",\n down: \"Down\",\n enter: \"Return\",\n escape: \"Escape\",\n esc: \"Escape\",\n left: \"Left\",\n right: \"Right\",\n return: \"Return\",\n space: \"space\",\n tab: \"Tab\",\n up: \"Up\",\n };\n const normalized = keys.trim().toLowerCase();\n return keyMap[normalized] ?? keys.trim();\n}\n\nfunction toWindowsSendKey(keys: string): string {\n const keyMap: Record<string, string> = {\n backspace: \"{BACKSPACE}\",\n down: \"{DOWN}\",\n enter: \"{ENTER}\",\n escape: \"{ESC}\",\n esc: \"{ESC}\",\n left: \"{LEFT}\",\n right: \"{RIGHT}\",\n return: \"{ENTER}\",\n space: \" \",\n tab: \"{TAB}\",\n up: \"{UP}\",\n };\n const normalized = keys.trim().toLowerCase();\n return keyMap[normalized] ?? keys;\n}\n\nexport function detectDesktopControlCapabilities(): DesktopControlCapabilities {\n const os = platform();\n const headfulGui = isHeadfulGuiAvailable();\n\n return {\n headfulGui: {\n available: headfulGui,\n tool: headfulGui ? \"desktop session\" : \"no GUI display detected\",\n },\n screenshot: detectScreenshotCapability(os),\n computerUse: detectComputerUseCapability(os),\n windowList: detectWindowListCapability(os),\n };\n}\n\nfunction detectScreenshotCapability(\n os: NodeJS.Platform,\n): DesktopControlCapability {\n if (os === \"darwin\") {\n return canCaptureMacScreen()\n ? { available: true, tool: \"screencapture (built-in)\" }\n : {\n available: false,\n tool: \"screencapture blocked (grant Screen Recording permission)\",\n };\n }\n if (os === \"linux\") {\n if (!isHeadfulGuiAvailable()) {\n return { available: false, tool: \"no GUI display detected\" };\n }\n if (commandExists(\"import\")) {\n return { available: true, tool: \"ImageMagick import\" };\n }\n if (commandExists(\"scrot\")) {\n return { available: true, tool: \"scrot\" };\n }\n if (commandExists(\"gnome-screenshot\")) {\n return { available: true, tool: \"gnome-screenshot\" };\n }\n return {\n available: false,\n tool: \"none (install ImageMagick, scrot, or gnome-screenshot)\",\n };\n }\n if (os === \"win32\") {\n return { available: true, tool: \"PowerShell System.Drawing\" };\n }\n return { available: false, tool: \"unsupported platform\" };\n}\n\nfunction detectComputerUseCapability(\n os: NodeJS.Platform,\n): DesktopControlCapability {\n if (os === \"darwin\") {\n if (commandExists(\"cliclick\")) {\n return { available: true, tool: \"cliclick\" };\n }\n return { available: true, tool: \"AppleScript (limited)\" };\n }\n if (os === \"linux\") {\n if (!isHeadfulGuiAvailable()) {\n return { available: false, tool: \"no GUI display detected\" };\n }\n if (commandExists(\"xdotool\")) {\n return { available: true, tool: \"xdotool\" };\n }\n return { available: false, tool: \"none (install xdotool)\" };\n }\n if (os === \"win32\") {\n return { available: true, tool: \"PowerShell SendKeys\" };\n }\n return { available: false, tool: \"unsupported platform\" };\n}\n\nfunction detectWindowListCapability(\n os: NodeJS.Platform,\n): DesktopControlCapability {\n if (os === \"darwin\") {\n return canUseMacSystemEvents()\n ? { available: true, tool: \"AppleScript\" }\n : {\n available: false,\n tool: \"AppleScript blocked (grant Accessibility permission)\",\n };\n }\n if (os === \"linux\") {\n if (commandExists(\"wmctrl\")) {\n return { available: true, tool: \"wmctrl\" };\n }\n if (commandExists(\"xdotool\")) {\n return { available: true, tool: \"xdotool\" };\n }\n return {\n available: false,\n tool: \"none (install wmctrl or xdotool)\",\n };\n }\n if (os === \"win32\") {\n return { available: true, tool: \"PowerShell Get-Process\" };\n }\n return { available: false, tool: \"unsupported platform\" };\n}\n\nfunction runCommand(command: string, args: string[], timeout: number): void {\n execFileSync(command, args, {\n timeout,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n}\n\nfunction runMacScreenshotCommand(args: string[]): void {\n try {\n runCommand(\"screencapture\", args, 10000);\n } catch {\n throw new Error(\n \"Screen capture failed. Grant Screen Recording permission to this app or terminal and try again.\",\n );\n }\n}\n\nfunction canCaptureMacScreen(): boolean {\n const tmpFile = join(tmpdir(), `desktop-screenshot-probe-${Date.now()}.png`);\n try {\n runCommand(\"screencapture\", [\"-x\", \"-R0,0,1,1\", tmpFile], 5000);\n return true;\n } catch {\n return false;\n } finally {\n removeTempFile(tmpFile);\n }\n}\n\nfunction canUseMacSystemEvents(): boolean {\n try {\n execFileSync(\n \"osascript\",\n [\"-e\", 'tell application \"System Events\" to count of processes'],\n {\n encoding: \"utf-8\",\n timeout: 3000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n },\n );\n return true;\n } catch {\n return false;\n }\n}\n\nfunction removeTempFile(filePath: string): void {\n try {\n unlinkSync(filePath);\n } catch {\n // Temp cleanup is best effort.\n }\n}\n\nfunction toAppleScriptStringLiteral(value: string): string {\n return `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n}\n\nfunction macKeyCode(keys: string): number | null {\n const symbolicKeyCodes: Record<string, number> = {\n return: 36,\n enter: 36,\n tab: 48,\n space: 49,\n escape: 53,\n esc: 53,\n left: 123,\n right: 124,\n down: 125,\n up: 126,\n };\n const normalized = keys.trim().toLowerCase();\n const mappedCode = symbolicKeyCodes[normalized];\n if (mappedCode !== undefined) {\n return mappedCode;\n }\n const numericCode = Number(keys.trim());\n return Number.isInteger(numericCode) ? numericCode : null;\n}\n\nfunction runPowerShellMouseScript(\n x: number,\n y: number,\n button: DesktopInputButton,\n repeat: number,\n): void {\n const downFlag = button === \"right\" ? \"0x0008\" : \"0x0002\";\n const upFlag = button === \"right\" ? \"0x0010\" : \"0x0004\";\n const clicks = Array.from(\n { length: Math.max(1, Math.min(2, repeat)) },\n () =>\n `[Win32.Win32Mouse]::mouse_event(${downFlag}, 0, 0, 0, 0); [Win32.Win32Mouse]::mouse_event(${upFlag}, 0, 0, 0, 0)`,\n ).join(\"; \");\n const psScript = [\n \"Add-Type -AssemblyName System.Windows.Forms\",\n `[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(${x},${y})`,\n `Add-Type -MemberDefinition '[DllImport(\"user32.dll\")] public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);' -Name Win32Mouse -Namespace Win32`,\n clicks,\n ].join(\"; \");\n runCommand(\"powershell\", [\"-Command\", psScript], 5000);\n}\n\nfunction clampScrollDelta(value: number): number {\n if (!Number.isFinite(value)) {\n return 0;\n }\n return Math.trunc(Math.max(-20, Math.min(20, value)));\n}\n\nfunction clickMouseWheel(button: string, count: number): void {\n for (let index = 0; index < count; index += 1) {\n runCommand(\"xdotool\", [\"click\", button], 5000);\n }\n}\n\nexport function getDesktopPlatformName(): NodeJS.Platform {\n return platform();\n}\n",
26
+ "import type http from \"node:http\";\n\nconst EMPTY_APPROVAL_SNAPSHOT = {\n mode: \"full_control\",\n pendingCount: 0,\n pendingApprovals: [],\n} as const;\n\nfunction sendJson(\n res: http.ServerResponse,\n status: number,\n body: unknown,\n): void {\n if (res.headersSent) return;\n res.statusCode = status;\n res.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n res.end(JSON.stringify(body));\n}\n\nfunction sendEmptyApprovalStream(res: http.ServerResponse): void {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n });\n res.write(\n `data: ${JSON.stringify({ type: \"snapshot\", snapshot: EMPTY_APPROVAL_SNAPSHOT })}\\n\\n`,\n );\n}\n\nexport async function handleComputerUseRoutes(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n method: string,\n): Promise<boolean> {\n if (!pathname.startsWith(\"/api/computer-use/\")) {\n return false;\n }\n\n if (method === \"GET\" && pathname === \"/api/computer-use/approvals\") {\n sendJson(res, 200, EMPTY_APPROVAL_SNAPSHOT);\n return true;\n }\n\n if (method === \"GET\" && pathname === \"/api/computer-use/approvals/stream\") {\n sendEmptyApprovalStream(res);\n req.on(\"close\", () => {\n res.end();\n });\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/computer-use/approval-mode\") {\n sendJson(res, 200, { mode: EMPTY_APPROVAL_SNAPSHOT.mode });\n return true;\n }\n\n const approvalDecision = /^\\/api\\/computer-use\\/approvals\\/([^/]+)$/.exec(\n pathname,\n );\n if (method === \"POST\" && approvalDecision) {\n sendJson(res, 404, {\n error: \"Computer-use approval is not pending.\",\n id: decodeURIComponent(approvalDecision[1] ?? \"\"),\n });\n return true;\n }\n\n return false;\n}\n",
27
+ "/** Sandbox capability API routes: status, exec, browser, screen, audio, computer use. */\n\nimport { execFileSync, execSync } from \"node:child_process\";\nimport { readFileSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { platform, tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n readJsonBody as parseJsonBody,\n readRequestBody,\n sendJson as sendJsonResponse,\n} from \"@elizaos/core\";\n\ninterface SandboxExecResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n durationMs: number;\n executedInSandbox: boolean;\n}\n\ninterface SandboxManager {\n getStatus(): unknown;\n getEventLog(): unknown[];\n start(): Promise<void>;\n stop(): Promise<void>;\n recover(): Promise<void>;\n exec(options: {\n command: string;\n workdir?: string;\n timeoutMs?: number;\n }): Promise<SandboxExecResult>;\n getBrowserCdpEndpoint(): string | null;\n getBrowserWsEndpoint(): string | null;\n getBrowserNoVncEndpoint(): string | null;\n}\n\ninterface SigningRequest {\n requestId: string;\n chainId: number;\n to: string;\n value: string;\n data: string;\n nonce?: number;\n gasLimit?: string;\n createdAt: number;\n}\n\ninterface SigningResult {\n success: boolean;\n [key: string]: unknown;\n}\n\ninterface RemoteSigningService {\n submitSigningRequest(request: SigningRequest): Promise<SigningResult>;\n approveRequest(requestId: string): Promise<SigningResult>;\n rejectRequest(requestId: string): boolean;\n getPendingApprovals(): unknown[];\n getAddress(): Promise<string>;\n}\n\ninterface SandboxRouteState {\n sandboxManager: SandboxManager | null;\n signingService?: RemoteSigningService | null;\n}\n\nconst MAX_COMPUTER_INPUT_LENGTH = 4096;\nconst MAX_KEYPRESS_LENGTH = 128;\nconst SAFE_KEYPRESS_PATTERN = /^[A-Za-z0-9+_.,: -]+$/;\nconst ALLOWED_AUDIO_FORMATS = new Set([\"wav\", \"mp3\", \"ogg\", \"flac\", \"m4a\"]);\nconst MIN_AUDIO_RECORD_DURATION_MS = 250;\nconst MAX_AUDIO_RECORD_DURATION_MS = 30_000;\n\n// ── Route handler ────────────────────────────────────────────────────────────\n\n/** Returns `true` if handled, `false` to fall through. */\nexport async function handleSandboxRoute(\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n method: string,\n state: SandboxRouteState,\n): Promise<boolean> {\n if (!pathname.startsWith(\"/api/sandbox\")) {\n return false;\n }\n\n const mgr = state.sandboxManager;\n\n // Platform info doesn't require a running manager\n if (method === \"GET\" && pathname === \"/api/sandbox/platform\") {\n sendJson(res, 200, getPlatformInfo());\n return true;\n }\n\n // ── POST /api/sandbox/docker/start ────────────────────────────────\n // Attempt to start Docker Desktop (works on macOS/Windows desktop builds)\n if (method === \"POST\" && pathname === \"/api/sandbox/docker/start\") {\n try {\n const result = attemptDockerStart();\n sendJson(res, 200, result);\n } catch (err) {\n sendJson(res, 500, {\n success: false,\n error: `Failed to start Docker: ${String(err)}`,\n });\n }\n return true;\n }\n\n if (!mgr) {\n sendJson(res, 503, {\n error: \"Sandbox manager not initialized\",\n });\n return true;\n }\n\n // ── GET /api/sandbox/status ─────────────────────────────────────────\n if (method === \"GET\" && pathname === \"/api/sandbox/status\") {\n sendJson(res, 200, mgr.getStatus());\n return true;\n }\n\n // ── GET /api/sandbox/events ─────────────────────────────────────────\n if (method === \"GET\" && pathname === \"/api/sandbox/events\") {\n const events = mgr.getEventLog();\n sendJson(res, 200, { events: events.slice(-100) });\n return true;\n }\n\n // ── POST /api/sandbox/start ─────────────────────────────────────────\n if (method === \"POST\" && pathname === \"/api/sandbox/start\") {\n try {\n await mgr.start();\n sendJson(res, 200, mgr.getStatus());\n } catch (err) {\n sendJson(res, 500, {\n error: `Failed to start sandbox: ${String(err)}`,\n });\n }\n return true;\n }\n\n // ── POST /api/sandbox/stop ──────────────────────────────────────────\n if (method === \"POST\" && pathname === \"/api/sandbox/stop\") {\n try {\n await mgr.stop();\n sendJson(res, 200, mgr.getStatus());\n } catch (err) {\n sendJson(res, 500, {\n error: `Failed to stop sandbox: ${String(err)}`,\n });\n }\n return true;\n }\n\n // ── POST /api/sandbox/recover ───────────────────────────────────────\n if (method === \"POST\" && pathname === \"/api/sandbox/recover\") {\n try {\n await mgr.recover();\n sendJson(res, 200, mgr.getStatus());\n } catch (err) {\n sendJson(res, 500, {\n error: `Recovery failed: ${String(err)}`,\n });\n }\n return true;\n }\n\n // ── POST /api/sandbox/exec ──────────────────────────────────────────\n if (method === \"POST\" && pathname === \"/api/sandbox/exec\") {\n const parsed = await readJsonBody<{\n command?: string;\n workdir?: string;\n timeoutMs?: number;\n }>(req, res);\n if (!parsed) return true;\n\n if (!parsed.command || typeof parsed.command !== \"string\") {\n sendJson(res, 400, { error: \"Missing 'command' field\" });\n return true;\n }\n\n const result = await mgr.exec({\n command: parsed.command,\n workdir: parsed.workdir,\n timeoutMs: parsed.timeoutMs,\n });\n\n sendJson(res, result.exitCode === 0 ? 200 : 422, result);\n return true;\n }\n\n // ── GET /api/sandbox/browser ────────────────────────────────────────\n if (method === \"GET\" && pathname === \"/api/sandbox/browser\") {\n sendJson(res, 200, {\n cdpEndpoint: mgr.getBrowserCdpEndpoint(),\n wsEndpoint: mgr.getBrowserWsEndpoint(),\n noVncEndpoint: mgr.getBrowserNoVncEndpoint(),\n });\n return true;\n }\n\n // ── Capability bridges ──────────────────────────────────────────────\n if (method === \"GET\" && pathname === \"/api/sandbox/screen/screenshot\") {\n try {\n const screenshot = captureScreenshot();\n res.writeHead(200, {\n \"Content-Type\": \"image/png\",\n \"Content-Length\": screenshot.length,\n });\n res.end(screenshot);\n } catch (err) {\n sendJson(res, 500, {\n error: `Screenshot failed: ${String(err)}`,\n });\n }\n return true;\n }\n\n // ── POST /api/sandbox/screen/screenshot ─────────────────────────────\n // Returns base64-encoded screenshot for easy consumption by agents\n if (method === \"POST\" && pathname === \"/api/sandbox/screen/screenshot\") {\n const rawBody = await readBody(req);\n if (!rawBody?.trim()) {\n sendJson(res, 200, {\n format: \"png\",\n encoding: \"base64\",\n width: null,\n height: null,\n data: captureScreenshot().toString(\"base64\"),\n });\n return true;\n }\n\n let regionInput: unknown;\n try {\n regionInput = JSON.parse(rawBody);\n } catch {\n sendJson(res, 400, { error: \"Invalid JSON body\" });\n return true;\n }\n\n const region = resolveScreenshotRegion(regionInput);\n if (region.error) {\n sendJson(res, 400, { error: region.error });\n return true;\n }\n\n try {\n const screenshot = captureScreenshot(region.region);\n const base64 = screenshot.toString(\"base64\");\n sendJson(res, 200, {\n format: \"png\",\n encoding: \"base64\",\n width: null, // platform-dependent\n height: null,\n data: base64,\n });\n } catch (err) {\n sendJson(res, 500, {\n error: `Screenshot failed: ${String(err)}`,\n });\n }\n return true;\n }\n\n // ── GET /api/sandbox/screen/windows ─────────────────────────────────\n if (method === \"GET\" && pathname === \"/api/sandbox/screen/windows\") {\n try {\n const windows = listWindows();\n sendJson(res, 200, { windows });\n } catch (err) {\n sendJson(res, 200, { windows: [], error: String(err) });\n }\n return true;\n }\n\n // ── POST /api/sandbox/audio/record ──────────────────────────────────\n if (method === \"POST\" && pathname === \"/api/sandbox/audio/record\") {\n const body = await readBody(req);\n let durationMs = 5000;\n if (body) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n sendJson(res, 400, {\n error: \"Invalid JSON in request body\",\n });\n return true;\n }\n\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n Array.isArray(parsed)\n ) {\n sendJson(res, 400, { error: \"Request body must be a JSON object\" });\n return true;\n }\n\n const bodyValues = parsed as Record<string, unknown>;\n\n if (Object.hasOwn(bodyValues, \"durationMs\")) {\n const durationValue = bodyValues.durationMs;\n if (typeof durationValue !== \"number\") {\n sendJson(res, 400, {\n error: \"durationMs must be a finite number\",\n });\n return true;\n }\n // Defense in depth: JSON.parse only produces finite numbers, but this guard\n // keeps behavior explicit against future parser/runtime changes.\n if (!Number.isFinite(durationValue)) {\n sendJson(res, 400, {\n error: \"durationMs must be a finite number\",\n });\n return true;\n }\n if (!Number.isInteger(durationValue)) {\n sendJson(res, 400, {\n error: \"durationMs must be an integer number of milliseconds\",\n });\n return true;\n }\n if (\n durationValue < MIN_AUDIO_RECORD_DURATION_MS ||\n durationValue > MAX_AUDIO_RECORD_DURATION_MS\n ) {\n sendJson(res, 400, {\n error: `durationMs must be between ${MIN_AUDIO_RECORD_DURATION_MS} and ${MAX_AUDIO_RECORD_DURATION_MS} milliseconds`,\n });\n return true;\n }\n durationMs = durationValue;\n }\n }\n try {\n const audio = await recordAudio(durationMs);\n sendJson(res, 200, {\n format: \"wav\",\n encoding: \"base64\",\n durationMs,\n data: audio.toString(\"base64\"),\n });\n } catch (err) {\n sendJson(res, 500, {\n error: `Audio recording failed: ${String(err)}`,\n });\n }\n return true;\n }\n\n // ── POST /api/sandbox/audio/play ────────────────────────────────────\n if (method === \"POST\" && pathname === \"/api/sandbox/audio/play\") {\n const parsed = await readJsonBody(req, res);\n if (!parsed) return true;\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n sendJson(res, 400, { error: \"Body must be a JSON object\" });\n return true;\n }\n\n const payload = parsed as { data?: unknown; format?: unknown };\n if (typeof payload.data !== \"string\" || !payload.data.trim()) {\n sendJson(res, 400, { error: \"Missing 'data' field (base64 audio)\" });\n return true;\n }\n\n const formatResult = resolveAudioFormat(payload.format);\n if (formatResult.error) {\n sendJson(res, 400, { error: formatResult.error });\n return true;\n }\n\n try {\n await playAudio(Buffer.from(payload.data, \"base64\"), formatResult.format);\n sendJson(res, 200, { success: true });\n } catch (err) {\n sendJson(res, 500, {\n error: `Audio playback failed: ${String(err)}`,\n });\n }\n return true;\n }\n\n // ── POST /api/sandbox/computer/click ────────────────────────────────\n if (method === \"POST\" && pathname === \"/api/sandbox/computer/click\") {\n const parsed = await readJsonBody(req, res);\n if (!parsed) return true;\n\n const clickPayload = resolveClickPayload(parsed);\n if (clickPayload.error) {\n sendJson(res, 400, { error: clickPayload.error });\n return true;\n }\n\n try {\n const { x, y, button } = clickPayload;\n performClick(x, y, button);\n sendJson(res, 200, { success: true, x, y, button });\n } catch (err) {\n sendJson(res, 500, {\n error: `Click failed: ${String(err)}`,\n });\n }\n return true;\n }\n\n // ── POST /api/sandbox/computer/type ─────────────────────────────────\n if (method === \"POST\" && pathname === \"/api/sandbox/computer/type\") {\n const parsed = await readJsonBody(req, res);\n if (!parsed) return true;\n\n const typePayload = resolveTypePayload(parsed);\n if (typePayload.error) {\n sendJson(res, 400, { error: typePayload.error });\n return true;\n }\n\n try {\n const { text } = typePayload;\n performType(text);\n sendJson(res, 200, { success: true, length: text.length });\n } catch (err) {\n sendJson(res, 500, {\n error: `Type failed: ${String(err)}`,\n });\n }\n return true;\n }\n\n // ── POST /api/sandbox/computer/keypress ─────────────────────────────\n if (method === \"POST\" && pathname === \"/api/sandbox/computer/keypress\") {\n const parsed = await readJsonBody(req, res);\n if (!parsed) return true;\n\n const keypressPayload = resolveKeypressPayload(parsed);\n if (keypressPayload.error) {\n sendJson(res, 400, { error: keypressPayload.error });\n return true;\n }\n\n try {\n const { keys } = keypressPayload;\n performKeypress(keys);\n sendJson(res, 200, { success: true, keys });\n } catch (err) {\n sendJson(res, 500, {\n error: `Keypress failed: ${String(err)}`,\n });\n }\n return true;\n }\n\n // ── Signing routes ─────────────────────────────────────────────────\n\n if (method === \"POST\" && pathname === \"/api/sandbox/sign\") {\n const signer = state.signingService;\n if (!signer) {\n sendJson(res, 503, { error: \"Signing service not configured\" });\n return true;\n }\n const body = await readJsonBody<unknown>(req, res);\n if (body === null) return true;\n const parsed = resolveSigningRequestPayload(body);\n if (\"error\" in parsed) {\n sendJson(res, 400, { error: parsed.error });\n return true;\n }\n try {\n const result = await signer.submitSigningRequest(parsed.request);\n sendJson(res, result.success ? 200 : 403, result);\n } catch (err) {\n sendJson(res, 400, {\n error: `Invalid request: ${String(err)}`,\n });\n }\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/sandbox/sign/approve\") {\n const signer = state.signingService;\n if (!signer) {\n sendJson(res, 503, { error: \"Signing service not configured\" });\n return true;\n }\n const body = await readJsonBody<{ requestId?: string }>(req, res);\n if (!body) return true;\n try {\n const { requestId } = body as { requestId: string };\n const result = await signer.approveRequest(requestId);\n sendJson(res, result.success ? 200 : 403, result);\n } catch (err) {\n sendJson(res, 400, { error: String(err) });\n }\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/sandbox/sign/reject\") {\n const signer = state.signingService;\n if (!signer) {\n sendJson(res, 503, { error: \"Signing service not configured\" });\n return true;\n }\n const body = await readJsonBody<{ requestId?: string }>(req, res);\n if (!body) return true;\n try {\n const { requestId } = body as { requestId: string };\n const rejected = signer.rejectRequest(requestId);\n sendJson(res, 200, { rejected });\n } catch (err) {\n sendJson(res, 400, { error: String(err) });\n }\n return true;\n }\n\n if (method === \"GET\" && pathname === \"/api/sandbox/sign/pending\") {\n const signer = state.signingService;\n if (!signer) {\n sendJson(res, 503, { error: \"Signing service not configured\" });\n return true;\n }\n sendJson(res, 200, { pending: signer.getPendingApprovals() });\n return true;\n }\n\n if (method === \"GET\" && pathname === \"/api/sandbox/sign/address\") {\n const signer = state.signingService;\n if (!signer) {\n sendJson(res, 503, { error: \"Signing service not configured\" });\n return true;\n }\n try {\n const address = await signer.getAddress();\n sendJson(res, 200, { address });\n } catch (err) {\n sendJson(res, 500, { error: String(err) });\n }\n return true;\n }\n\n // ── GET /api/sandbox/capabilities ───────────────────────────────────\n if (method === \"GET\" && pathname === \"/api/sandbox/capabilities\") {\n sendJson(res, 200, detectCapabilities());\n return true;\n }\n\n // ── Fallthrough ─────────────────────────────────────────────────────\n sendJson(res, 404, { error: `Unknown sandbox route: ${method} ${pathname}` });\n return true;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n}\n\nfunction resolveSigningRequestPayload(\n input: unknown,\n): { request: SigningRequest } | { error: string } {\n const obj = asObject(input);\n if (!obj) {\n return { error: \"Signing payload must be a JSON object\" };\n }\n\n const requestId = obj.requestId;\n const chainId = parseFiniteInteger(obj.chainId);\n const to = obj.to;\n const value = obj.value;\n const data = obj.data;\n const nonce =\n obj.nonce === undefined ? undefined : parseFiniteInteger(obj.nonce);\n const rawGasLimit = obj.gasLimit;\n const createdAt = parseFiniteInteger(obj.createdAt);\n\n if (typeof requestId !== \"string\" || !requestId.trim()) {\n return { error: \"Signing payload requires a non-empty string 'requestId'\" };\n }\n if (chainId === null || chainId < 0) {\n return { error: \"Signing payload requires an integer 'chainId' >= 0\" };\n }\n if (typeof to !== \"string\" || !/^0x[0-9a-fA-F]{40}$/.test(to.trim())) {\n return {\n error:\n \"Signing payload requires a hex 'to' address (e.g., 0x followed by 40 hex characters)\",\n };\n }\n if (typeof value !== \"string\" || !value.trim()) {\n return { error: \"Signing payload requires a non-empty string 'value'\" };\n }\n if (typeof data !== \"string\" || !data.trim()) {\n return { error: \"Signing payload requires a non-empty string 'data'\" };\n }\n if (nonce === null) {\n return { error: \"'nonce' must be a non-negative integer when provided\" };\n }\n if (createdAt === null) {\n return { error: \"Signing payload requires an integer 'createdAt'\" };\n }\n if (rawGasLimit !== undefined && typeof rawGasLimit !== \"string\") {\n return {\n error: \"Signing payload 'gasLimit' must be a string when provided\",\n };\n }\n\n const gasLimit = (rawGasLimit as string | undefined)?.trim();\n if (gasLimit === \"\") {\n return {\n error: \"Signing payload 'gasLimit' cannot be empty when provided\",\n };\n }\n\n return {\n request: {\n requestId: requestId.trim(),\n chainId,\n to: to.trim(),\n value: value.trim(),\n data,\n ...(nonce === undefined ? {} : { nonce }),\n ...(gasLimit === undefined ? {} : { gasLimit }),\n createdAt,\n },\n };\n}\n\nfunction parseFiniteInteger(value: unknown): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return null;\n if (!Number.isInteger(value)) return null;\n return value;\n}\n\nfunction resolveScreenshotRegion(input: unknown): {\n region?: { x: number; y: number; width: number; height: number };\n error?: string;\n} {\n if (input === undefined || input === null) return {};\n const obj = asObject(input);\n if (!obj) return { error: \"Screenshot region payload must be a JSON object\" };\n\n const hasRegionField =\n \"x\" in obj || \"y\" in obj || \"width\" in obj || \"height\" in obj;\n if (!hasRegionField) return {};\n\n const x = parseFiniteInteger(obj.x);\n const y = parseFiniteInteger(obj.y);\n const width = parseFiniteInteger(obj.width);\n const height = parseFiniteInteger(obj.height);\n\n if (x === null || y === null || width === null || height === null) {\n return {\n error: \"Region requires integer x, y, width, and height values\",\n };\n }\n if (width <= 0 || height <= 0) {\n return { error: \"Region width and height must be greater than 0\" };\n }\n\n return {\n region: { x, y, width, height },\n };\n}\n\nfunction resolveClickPayload(input: unknown): {\n x: number;\n y: number;\n button: \"left\" | \"right\";\n error?: string;\n} {\n const obj = asObject(input);\n if (!obj) {\n return {\n x: 0,\n y: 0,\n button: \"left\",\n error: \"Click payload must be a JSON object\",\n };\n }\n\n const x = parseFiniteInteger(obj.x);\n const y = parseFiniteInteger(obj.y);\n if (x === null || y === null) {\n return {\n x: 0,\n y: 0,\n button: \"left\",\n error: \"Click payload requires integer x and y coordinates\",\n };\n }\n\n const rawButton = obj.button;\n let button: \"left\" | \"right\" = \"left\";\n if (rawButton !== undefined) {\n if (rawButton !== \"left\" && rawButton !== \"right\") {\n return {\n x,\n y,\n button,\n error: \"button must be either 'left' or 'right'\",\n };\n }\n button = rawButton;\n }\n\n return { x, y, button };\n}\n\nfunction resolveTypePayload(input: unknown): { text: string; error?: string } {\n const obj = asObject(input);\n if (!obj) return { text: \"\", error: \"Type payload must be a JSON object\" };\n if (typeof obj.text !== \"string\") {\n return { text: \"\", error: \"Type payload requires a string 'text' field\" };\n }\n if (obj.text.length === 0) {\n return { text: \"\", error: \"text cannot be empty\" };\n }\n if (obj.text.length > MAX_COMPUTER_INPUT_LENGTH) {\n return {\n text: \"\",\n error: `text exceeds maximum length (${MAX_COMPUTER_INPUT_LENGTH})`,\n };\n }\n return { text: obj.text };\n}\n\nfunction resolveKeypressPayload(input: unknown): {\n keys: string;\n error?: string;\n} {\n const obj = asObject(input);\n if (!obj) {\n return { keys: \"\", error: \"Keypress payload must be a JSON object\" };\n }\n if (typeof obj.keys !== \"string\") {\n return {\n keys: \"\",\n error: \"Keypress payload requires a string 'keys' field\",\n };\n }\n\n const keys = obj.keys.trim();\n if (!keys) return { keys: \"\", error: \"keys cannot be empty\" };\n if (keys.length > MAX_KEYPRESS_LENGTH) {\n return {\n keys: \"\",\n error: `keys exceeds maximum length (${MAX_KEYPRESS_LENGTH})`,\n };\n }\n if (!SAFE_KEYPRESS_PATTERN.test(keys)) {\n return {\n keys: \"\",\n error:\n \"keys contains unsupported characters; allowed: letters, numbers, space, +, _, ., ,, :, -\",\n };\n }\n\n return { keys };\n}\n\nfunction resolveAudioFormat(input: unknown): {\n format: string;\n error?: string;\n} {\n if (input === undefined || input === null) return { format: \"wav\" };\n if (typeof input !== \"string\") {\n return { format: \"wav\", error: \"format must be a string\" };\n }\n\n const normalized = input.trim().toLowerCase();\n if (!normalized) return { format: \"wav\" };\n if (!/^[a-z0-9]+$/.test(normalized)) {\n return {\n format: \"wav\",\n error:\n \"format contains unsupported characters; use one of: wav, mp3, ogg, flac, m4a\",\n };\n }\n if (!ALLOWED_AUDIO_FORMATS.has(normalized)) {\n return {\n format: \"wav\",\n error: \"format must be one of: wav, mp3, ogg, flac, m4a\",\n };\n }\n\n return { format: normalized };\n}\n\nfunction runCommand(command: string, args: string[], timeout: number): void {\n execFileSync(command, args, {\n timeout,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n}\n\nfunction captureScreenshot(region?: {\n x: number;\n y: number;\n width: number;\n height: number;\n}): Buffer {\n const os = platform();\n const tmpFile = join(tmpdir(), `sandbox-screenshot-${Date.now()}.png`);\n\n try {\n if (os === \"darwin\") {\n if (region) {\n runCommand(\n \"screencapture\",\n [\n `-R${region.x},${region.y},${region.width},${region.height}`,\n \"-x\",\n tmpFile,\n ],\n 10000,\n );\n } else {\n runCommand(\"screencapture\", [\"-x\", tmpFile], 10000);\n }\n } else if (os === \"linux\") {\n // Try tools in preference order\n if (commandExists(\"import\")) {\n if (region) {\n runCommand(\n \"import\",\n [\n \"-window\",\n \"root\",\n \"-crop\",\n `${region.width}x${region.height}+${region.x}+${region.y}`,\n tmpFile,\n ],\n 10000,\n );\n } else {\n runCommand(\"import\", [\"-window\", \"root\", tmpFile], 10000);\n }\n } else if (commandExists(\"scrot\")) {\n runCommand(\"scrot\", [tmpFile], 10000);\n } else if (commandExists(\"gnome-screenshot\")) {\n runCommand(\"gnome-screenshot\", [\"-f\", tmpFile], 10000);\n } else {\n throw new Error(\n \"No screenshot tool available. Install ImageMagick, scrot, or gnome-screenshot.\",\n );\n }\n } else if (os === \"win32\") {\n // PowerShell screenshot\n const psCmd = [\n `Add-Type -AssemblyName System.Windows.Forms`,\n `$screen = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds`,\n `$bitmap = New-Object System.Drawing.Bitmap($screen.Width, $screen.Height)`,\n `$graphics = [System.Drawing.Graphics]::FromImage($bitmap)`,\n `$graphics.CopyFromScreen($screen.Location, [System.Drawing.Point]::Empty, $screen.Size)`,\n `$bitmap.Save('${tmpFile.replace(/\\//g, \"\\\\\")}')`,\n `$graphics.Dispose()`,\n `$bitmap.Dispose()`,\n ].join(\"; \");\n execSync(`powershell -Command \"${psCmd}\"`, {\n timeout: 15000,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n } else {\n throw new Error(`Screenshot not supported on platform: ${os}`);\n }\n\n const data = readFileSync(tmpFile);\n try {\n unlinkSync(tmpFile);\n } catch {\n /* cleanup best effort */\n }\n return data;\n } catch (err) {\n // Clean up temp file on error\n try {\n unlinkSync(tmpFile);\n } catch {\n /* ignore */\n }\n throw err;\n }\n}\n\nfunction listWindows(): Array<{ id: string; title: string; app: string }> {\n const os = platform();\n\n if (os === \"darwin\") {\n try {\n const script = `\n tell application \"System Events\"\n set windowList to {}\n repeat with proc in (every process whose visible is true)\n try\n repeat with w in (every window of proc)\n set end of windowList to (name of proc) & \"|||\" & (name of w) & \"|||\" & (id of w as text)\n end repeat\n end try\n end repeat\n return windowList as text\n end tell`;\n const output = execSync(`osascript -e '${script}'`, {\n encoding: \"utf-8\",\n timeout: 10000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n return output\n .split(\", \")\n .filter(Boolean)\n .map((entry) => {\n const parts = entry.split(\"|||\");\n return {\n app: parts[0] ?? \"unknown\",\n title: parts[1] ?? \"unknown\",\n id: parts[2] ?? \"0\",\n };\n });\n } catch {\n return [];\n }\n }\n\n if (os === \"linux\") {\n try {\n const output = execSync(\n 'wmctrl -l 2>/dev/null || xdotool search --name \"\" getwindowname 2>/dev/null',\n {\n encoding: \"utf-8\",\n timeout: 5000,\n },\n );\n return output\n .split(\"\\n\")\n .filter(Boolean)\n .map((line, i) => ({\n id: String(i),\n title: line.trim(),\n app: \"unknown\",\n }));\n } catch {\n return [];\n }\n }\n\n if (os === \"win32\") {\n try {\n const output = execSync(\n `powershell -Command \"Get-Process | Where-Object {$_.MainWindowTitle} | Select-Object Id, MainWindowTitle | ConvertTo-Json\"`,\n { encoding: \"utf-8\", timeout: 10000 },\n );\n const processes = JSON.parse(output);\n const list = Array.isArray(processes) ? processes : [processes];\n return list.map((p: { Id: number; MainWindowTitle: string }) => ({\n id: String(p.Id),\n title: p.MainWindowTitle,\n app: \"unknown\",\n }));\n } catch {\n return [];\n }\n }\n\n return [];\n}\n\nasync function recordAudio(durationMs: number): Promise<Buffer> {\n const os = platform();\n const durationSec = Math.ceil(durationMs / 1000);\n const tmpFile = join(tmpdir(), `sandbox-audio-${Date.now()}.wav`);\n\n if (os === \"darwin\") {\n // Use sox (rec) on macOS\n if (commandExists(\"rec\")) {\n execSync(`rec -q ${tmpFile} trim 0 ${durationSec}`, {\n timeout: durationMs + 5000,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n } else if (commandExists(\"ffmpeg\")) {\n execSync(\n `ffmpeg -f avfoundation -i \":0\" -t ${durationSec} -y ${tmpFile} 2>/dev/null`,\n { timeout: durationMs + 10000, stdio: [\"ignore\", \"pipe\", \"pipe\"] },\n );\n } else {\n throw new Error(\n \"No audio recording tool available. Install sox or ffmpeg.\",\n );\n }\n } else if (os === \"linux\") {\n if (commandExists(\"arecord\")) {\n execSync(`arecord -d ${durationSec} -f cd ${tmpFile}`, {\n timeout: durationMs + 5000,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n } else if (commandExists(\"ffmpeg\")) {\n execSync(\n `ffmpeg -f pulse -i default -t ${durationSec} -y ${tmpFile} 2>/dev/null`,\n { timeout: durationMs + 10000, stdio: [\"ignore\", \"pipe\", \"pipe\"] },\n );\n } else {\n throw new Error(\n \"No audio recording tool available. Install alsa-utils or ffmpeg.\",\n );\n }\n } else if (os === \"win32\") {\n // Use ffmpeg on Windows (most portable)\n if (commandExists(\"ffmpeg\")) {\n execSync(\n `ffmpeg -f dshow -i audio=\"Microphone\" -t ${durationSec} -y \"${tmpFile.replace(/\\//g, \"\\\\\")}\" 2>NUL`,\n { timeout: durationMs + 10000, stdio: [\"ignore\", \"pipe\", \"pipe\"] },\n );\n } else {\n throw new Error(\"No audio recording tool available. Install ffmpeg.\");\n }\n } else {\n throw new Error(`Audio recording not supported on platform: ${os}`);\n }\n\n const data = readFileSync(tmpFile);\n try {\n unlinkSync(tmpFile);\n } catch {\n /* cleanup */\n }\n return data;\n}\n\nasync function playAudio(data: Buffer, format: string): Promise<void> {\n const os = platform();\n const tmpFile = join(tmpdir(), `sandbox-play-${Date.now()}.${format}`);\n writeFileSync(tmpFile, data);\n\n try {\n if (os === \"darwin\") {\n runCommand(\"afplay\", [tmpFile], 60000);\n } else if (os === \"linux\") {\n if (commandExists(\"aplay\")) {\n runCommand(\"aplay\", [tmpFile], 60000);\n } else if (commandExists(\"paplay\")) {\n runCommand(\"paplay\", [tmpFile], 60000);\n } else if (commandExists(\"ffplay\")) {\n runCommand(\"ffplay\", [\"-autoexit\", \"-nodisp\", tmpFile], 60000);\n } else {\n throw new Error(\"No audio playback tool available.\");\n }\n } else if (os === \"win32\") {\n const escapedPath = tmpFile.replace(/\\//g, \"\\\\\").replace(/'/g, \"''\");\n runCommand(\n \"powershell\",\n [\n \"-Command\",\n `(New-Object Media.SoundPlayer '${escapedPath}').PlaySync()`,\n ],\n 60000,\n );\n }\n } finally {\n try {\n unlinkSync(tmpFile);\n } catch {\n /* cleanup */\n }\n }\n}\n\nfunction toAppleScriptStringLiteral(value: string): string {\n return `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n}\n\nfunction performClick(x: number, y: number, button: \"left\" | \"right\"): void {\n const os = platform();\n\n if (os === \"darwin\") {\n // Use cliclick on macOS (brew install cliclick)\n if (commandExists(\"cliclick\")) {\n const btn = button === \"right\" ? \"rc\" : \"c\";\n runCommand(\"cliclick\", [`${btn}:${x},${y}`], 5000);\n } else {\n // AppleScript fallback\n runCommand(\n \"osascript\",\n [\"-e\", `tell application \"System Events\" to click at {${x}, ${y}}`],\n 5000,\n );\n }\n } else if (os === \"linux\") {\n if (commandExists(\"xdotool\")) {\n const btn = button === \"right\" ? \"3\" : \"1\";\n runCommand(\n \"xdotool\",\n [\"mousemove\", String(x), String(y), \"click\", btn],\n 5000,\n );\n } else {\n throw new Error(\"xdotool required for mouse control on Linux.\");\n }\n } else if (os === \"win32\") {\n // Use Win32 API via PowerShell to perform an actual mouse click\n const psScript = [\n `Add-Type -AssemblyName System.Windows.Forms`,\n `[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(${x},${y})`,\n `Add-Type -MemberDefinition '[DllImport(\"user32.dll\")] public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);' -Name Win32Mouse -Namespace Win32`,\n button === \"right\"\n ? `[Win32.Win32Mouse]::mouse_event(0x0008, 0, 0, 0, 0); [Win32.Win32Mouse]::mouse_event(0x0010, 0, 0, 0, 0)` // right down + up\n : `[Win32.Win32Mouse]::mouse_event(0x0002, 0, 0, 0, 0); [Win32.Win32Mouse]::mouse_event(0x0004, 0, 0, 0, 0)`, // left down + up\n ].join(\"; \");\n runCommand(\"powershell\", [\"-Command\", psScript], 5000);\n }\n}\n\nfunction performType(text: string): void {\n const os = platform();\n\n if (os === \"darwin\") {\n if (commandExists(\"cliclick\")) {\n runCommand(\"cliclick\", [`t:${text}`], 10000);\n } else {\n runCommand(\n \"osascript\",\n [\n \"-e\",\n `tell application \"System Events\" to keystroke ${toAppleScriptStringLiteral(text)}`,\n ],\n 10000,\n );\n }\n } else if (os === \"linux\") {\n if (commandExists(\"xdotool\")) {\n runCommand(\"xdotool\", [\"type\", \"--\", text], 10000);\n } else {\n throw new Error(\"xdotool required for keyboard input on Linux.\");\n }\n } else if (os === \"win32\") {\n const escaped = text.replace(/'/g, \"''\");\n runCommand(\n \"powershell\",\n [\n \"-Command\",\n `Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SendKeys]::SendWait('${escaped}')`,\n ],\n 10000,\n );\n }\n}\n\nfunction performKeypress(keys: string): void {\n const os = platform();\n\n if (os === \"darwin\") {\n if (commandExists(\"cliclick\")) {\n runCommand(\"cliclick\", [`kp:${keys}`], 5000);\n } else {\n const symbolicKeyCodes: Record<string, number> = {\n return: 36,\n enter: 36,\n tab: 48,\n space: 49,\n escape: 53,\n esc: 53,\n left: 123,\n right: 124,\n down: 125,\n up: 126,\n };\n const normalized = keys.trim().toLowerCase();\n const mappedCode = symbolicKeyCodes[normalized];\n const numericCode =\n mappedCode ??\n (Number.isInteger(Number(keys.trim())) ? Number(keys.trim()) : null);\n\n if (numericCode !== null) {\n runCommand(\n \"osascript\",\n [\"-e\", `tell application \"System Events\" to key code ${numericCode}`],\n 5000,\n );\n } else {\n runCommand(\n \"osascript\",\n [\n \"-e\",\n `tell application \"System Events\" to keystroke ${toAppleScriptStringLiteral(keys)}`,\n ],\n 5000,\n );\n }\n }\n } else if (os === \"linux\") {\n if (commandExists(\"xdotool\")) {\n runCommand(\"xdotool\", [\"key\", keys], 5000);\n } else {\n throw new Error(\"xdotool required for key input on Linux.\");\n }\n } else if (os === \"win32\") {\n const escaped = keys.replace(/'/g, \"''\");\n runCommand(\n \"powershell\",\n [\n \"-Command\",\n `Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SendKeys]::SendWait('${escaped}')`,\n ],\n 5000,\n );\n }\n}\n\nfunction detectCapabilities(): Record<\n string,\n { available: boolean; tool: string }\n> {\n const os = platform();\n const caps: Record<string, { available: boolean; tool: string }> = {};\n\n // Screenshot\n if (os === \"darwin\") {\n caps.screenshot = { available: true, tool: \"screencapture (built-in)\" };\n } else if (os === \"linux\") {\n if (commandExists(\"import\"))\n caps.screenshot = { available: true, tool: \"ImageMagick import\" };\n else if (commandExists(\"scrot\"))\n caps.screenshot = { available: true, tool: \"scrot\" };\n else if (commandExists(\"gnome-screenshot\"))\n caps.screenshot = { available: true, tool: \"gnome-screenshot\" };\n else\n caps.screenshot = {\n available: false,\n tool: \"none (install ImageMagick, scrot, or gnome-screenshot)\",\n };\n } else if (os === \"win32\") {\n caps.screenshot = { available: true, tool: \"PowerShell System.Drawing\" };\n } else {\n caps.screenshot = { available: false, tool: \"unsupported platform\" };\n }\n\n // Audio record\n if (os === \"darwin\") {\n if (commandExists(\"rec\"))\n caps.audioRecord = { available: true, tool: \"sox rec\" };\n else if (commandExists(\"ffmpeg\"))\n caps.audioRecord = { available: true, tool: \"ffmpeg\" };\n else\n caps.audioRecord = {\n available: false,\n tool: \"none (install sox or ffmpeg)\",\n };\n } else if (os === \"linux\") {\n if (commandExists(\"arecord\"))\n caps.audioRecord = { available: true, tool: \"arecord\" };\n else if (commandExists(\"ffmpeg\"))\n caps.audioRecord = { available: true, tool: \"ffmpeg\" };\n else\n caps.audioRecord = {\n available: false,\n tool: \"none (install alsa-utils or ffmpeg)\",\n };\n } else if (os === \"win32\") {\n if (commandExists(\"ffmpeg\"))\n caps.audioRecord = { available: true, tool: \"ffmpeg\" };\n else caps.audioRecord = { available: false, tool: \"none (install ffmpeg)\" };\n } else {\n caps.audioRecord = { available: false, tool: \"unsupported\" };\n }\n\n // Audio play\n if (os === \"darwin\")\n caps.audioPlay = { available: true, tool: \"afplay (built-in)\" };\n else if (os === \"linux\") {\n if (commandExists(\"aplay\"))\n caps.audioPlay = { available: true, tool: \"aplay\" };\n else if (commandExists(\"paplay\"))\n caps.audioPlay = { available: true, tool: \"paplay\" };\n else if (commandExists(\"ffplay\"))\n caps.audioPlay = { available: true, tool: \"ffplay\" };\n else caps.audioPlay = { available: false, tool: \"none\" };\n } else if (os === \"win32\") {\n caps.audioPlay = { available: true, tool: \"PowerShell SoundPlayer\" };\n } else {\n caps.audioPlay = { available: false, tool: \"unsupported\" };\n }\n\n // Mouse/keyboard control\n if (os === \"darwin\") {\n if (commandExists(\"cliclick\"))\n caps.computerUse = { available: true, tool: \"cliclick\" };\n else caps.computerUse = { available: true, tool: \"AppleScript (limited)\" };\n } else if (os === \"linux\") {\n if (commandExists(\"xdotool\"))\n caps.computerUse = { available: true, tool: \"xdotool\" };\n else\n caps.computerUse = { available: false, tool: \"none (install xdotool)\" };\n } else if (os === \"win32\") {\n caps.computerUse = { available: true, tool: \"PowerShell SendKeys\" };\n } else {\n caps.computerUse = { available: false, tool: \"unsupported\" };\n }\n\n // Window listing\n if (os === \"darwin\")\n caps.windowList = { available: true, tool: \"AppleScript\" };\n else if (os === \"linux\") {\n if (commandExists(\"wmctrl\"))\n caps.windowList = { available: true, tool: \"wmctrl\" };\n else if (commandExists(\"xdotool\"))\n caps.windowList = { available: true, tool: \"xdotool\" };\n else\n caps.windowList = {\n available: false,\n tool: \"none (install wmctrl or xdotool)\",\n };\n } else if (os === \"win32\") {\n caps.windowList = { available: true, tool: \"PowerShell Get-Process\" };\n } else {\n caps.windowList = { available: false, tool: \"unsupported\" };\n }\n\n // Browser\n caps.browser = { available: true, tool: \"CDP via sandbox browser container\" };\n\n // Shell\n caps.shell = { available: true, tool: \"docker exec\" };\n\n return caps;\n}\n\nfunction getPlatformInfo(): Record<string, string | boolean> {\n const os = platform();\n let dockerInstalled = false;\n let dockerRunning = false;\n let appleContainerAvailable = false;\n\n // Check if docker binary exists (installed)\n try {\n const which = os === \"win32\" ? \"where\" : \"which\";\n execSync(`${which} docker`, { stdio: \"ignore\", timeout: 3000 });\n dockerInstalled = true;\n } catch {\n /* not installed */\n }\n\n // Check if docker daemon is running (docker info succeeds only when daemon is up)\n if (dockerInstalled) {\n try {\n execSync(\"docker info\", { stdio: \"ignore\", timeout: 5000 });\n dockerRunning = true;\n } catch {\n /* installed but not running */\n }\n }\n\n if (os === \"darwin\") {\n try {\n execSync(\"which container\", { stdio: \"ignore\", timeout: 3000 });\n appleContainerAvailable = true;\n } catch {\n /* */\n }\n }\n\n return {\n platform: os,\n arch: require(\"node:os\").arch(),\n dockerInstalled,\n dockerRunning,\n // Legacy compat: dockerAvailable = running (old clients check this)\n dockerAvailable: dockerRunning,\n appleContainerAvailable,\n wsl2: os === \"win32\" ? isWsl2Available() : false,\n recommended:\n os === \"darwin\" && appleContainerAvailable ? \"apple-container\" : \"docker\",\n };\n}\n\nfunction isWsl2Available(): boolean {\n try {\n execSync(\"wsl --status\", { stdio: \"ignore\", timeout: 5000 });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction attemptDockerStart(): {\n success: boolean;\n message: string;\n waitMs: number;\n} {\n const os = platform();\n\n try {\n if (os === \"darwin\") {\n execSync('open -a \"Docker\"', { timeout: 5000, stdio: \"ignore\" });\n return {\n success: true,\n message: \"Docker Desktop is starting on macOS. Give it a moment~\",\n waitMs: 15000,\n };\n }\n\n if (os === \"win32\") {\n // Try common install locations\n const paths = [\n '\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\Docker Desktop.exe\"',\n '\"C:\\\\Program Files (x86)\\\\Docker\\\\Docker\\\\Docker Desktop.exe\"',\n ];\n let started = false;\n for (const p of paths) {\n try {\n execSync(`start \"\" ${p}`, {\n timeout: 5000,\n stdio: \"ignore\",\n shell: \"cmd.exe\",\n });\n started = true;\n break;\n } catch {\n /* try next path */\n }\n }\n if (!started) {\n // Try via start menu\n execSync('start \"\" \"Docker Desktop\"', {\n timeout: 5000,\n stdio: \"ignore\",\n shell: \"cmd.exe\",\n });\n }\n return {\n success: true,\n message:\n \"Docker Desktop is starting on Windows. This may take 30 seconds~\",\n waitMs: 30000,\n };\n }\n\n if (os === \"linux\") {\n // Try systemctl first (most common)\n try {\n execSync(\"sudo systemctl start docker\", {\n timeout: 10000,\n stdio: \"ignore\",\n });\n return {\n success: true,\n message: \"Docker daemon started via systemctl\",\n waitMs: 5000,\n };\n } catch {\n /* systemctl may not be available */\n }\n\n // Try service command\n try {\n execSync(\"sudo service docker start\", {\n timeout: 10000,\n stdio: \"ignore\",\n });\n return {\n success: true,\n message: \"Docker daemon started via service\",\n waitMs: 5000,\n };\n } catch {\n /* */\n }\n\n return {\n success: false,\n message:\n \"Could not auto-start Docker on Linux. Run: sudo systemctl start docker\",\n waitMs: 0,\n };\n }\n\n return {\n success: false,\n message: `Auto-start not supported on ${os}`,\n waitMs: 0,\n };\n } catch (err) {\n return {\n success: false,\n message: `Failed: ${String(err)}`,\n waitMs: 0,\n };\n }\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction commandExists(cmd: string): boolean {\n try {\n const which = platform() === \"win32\" ? \"where\" : \"which\";\n execSync(`${which} ${cmd}`, { stdio: \"ignore\", timeout: 3000 });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction sendJson(res: ServerResponse, status: number, data: unknown): void {\n sendJsonResponse(res, data, status);\n}\n\nfunction readBody(req: IncomingMessage): Promise<string | null> {\n return readRequestBody(req, {\n maxBytes: 10 * 1024 * 1024,\n returnNullOnTooLarge: true,\n returnNullOnError: true,\n destroyOnTooLarge: true,\n });\n}\n\nfunction readJsonBody<T = unknown>(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<T | null> {\n return parseJsonBody(req, res, {\n maxBytes: 10 * 1024 * 1024,\n requireObject: false,\n readErrorStatus: 400,\n parseErrorStatus: 400,\n readErrorMessage: \"Missing request body\",\n parseErrorMessage: \"Invalid JSON in request body\",\n });\n}\n",
28
+ "import { registerAppRoutePluginLoader } from \"@elizaos/core\";\n\nregisterAppRoutePluginLoader(\"@elizaos/plugin-computeruse\", async () => {\n const { computerUsePlugin } = await import(\"./index.js\");\n return computerUsePlugin;\n});\n",
29
+ "/**\n * @elizaos/plugin-computeruse\n *\n * Desktop automation plugin for elizaOS agents — screenshots, mouse/keyboard\n * control, browser CDP automation, terminal access, file operations, and\n * window management.\n *\n * Deeply ported from coasty-ai/open-computer-use (Apache 2.0).\n *\n * Enable via:\n * - Config: features.computeruse: true\n * - Env: COMPUTER_USE_ENABLED=1\n *\n * Platform requirements:\n * macOS — screencapture (built-in), cliclick (brew install cliclick), AppleScript\n * Linux — xdotool (sudo apt install xdotool), ImageMagick/scrot for screenshots\n * Windows — PowerShell (built-in)\n * Browser — puppeteer-core + Chrome/Edge/Brave installed\n *\n * @module @elizaos/plugin-computeruse\n */\n\nimport type { Plugin, Route } from \"@elizaos/core\";\nimport { promoteSubactionsToActions } from \"@elizaos/core\";\nimport { desktopAction } from \"./actions/desktop.js\";\nimport { useComputerAction } from \"./actions/use-computer.js\";\nimport { computerStateProvider } from \"./providers/computer-state.js\";\nimport { computerUseRouteHandler } from \"./routes/computer-use-compat-routes.js\";\nimport { ComputerUseService } from \"./services/computer-use-service.js\";\n\nconst computerUseRoutes: Route[] = [\n {\n type: \"GET\",\n path: \"/api/computer-use/approvals\",\n rawPath: true,\n handler: computerUseRouteHandler(),\n },\n {\n type: \"GET\",\n path: \"/api/computer-use/approvals/stream\",\n rawPath: true,\n public: true,\n name: \"computeruse-approvals-stream\",\n handler: computerUseRouteHandler(),\n },\n {\n type: \"POST\",\n path: \"/api/computer-use/approval-mode\",\n rawPath: true,\n handler: computerUseRouteHandler(),\n },\n {\n // Dynamic `:id` segment — handler decodes the id from req.url itself.\n type: \"POST\",\n path: \"/api/computer-use/approvals/:id\",\n rawPath: true,\n handler: computerUseRouteHandler(),\n },\n];\n\nexport const computerUsePlugin: Plugin = {\n name: \"@elizaos/plugin-computeruse\",\n description:\n \"Desktop automation — take screenshots, control mouse and keyboard, \" +\n \"automate web browsers via CDP, manage desktop windows, read/write files, and use a local terminal. \" +\n \"Ported from open-computer-use (Apache 2.0).\",\n\n services: [ComputerUseService],\n\n // COMPUTER_USE (canonical desktop interaction: screenshot/click/key/etc.)\n // and DESKTOP (parent action dispatching file/window/terminal ops) stay\n // registered as distinct top-level actions — they cover different surfaces.\n // Each umbrella's subactions are promoted to virtual top-level actions\n // (e.g. COMPUTER_USE_CLICK, DESKTOP_OPEN) so the planner can pick a\n // specific verb directly from the action catalogue.\n actions: [\n ...promoteSubactionsToActions(useComputerAction),\n ...promoteSubactionsToActions(desktopAction),\n ],\n\n providers: [computerStateProvider],\n\n routes: computerUseRoutes,\n\n autoEnable: {\n envKeys: [\"COMPUTER_USE_ENABLED\"],\n },\n};\n\nexport const computerusePlugin = computerUsePlugin;\n\nexport default computerUsePlugin;\n\nexport { ComputerUseService } from \"./services/computer-use-service.js\";\nexport {\n captureDesktopScreenshot,\n commandExists,\n detectDesktopControlCapabilities,\n getDesktopPlatformName,\n isHeadfulGuiAvailable,\n listDesktopWindows,\n performDesktopClick,\n performDesktopDoubleClick,\n performDesktopKeypress,\n performDesktopMouseMove,\n performDesktopScroll,\n performDesktopTextInput,\n} from \"./services/desktop-control.js\";\nexport type {\n DesktopControlCapabilities,\n DesktopControlCapability,\n DesktopInputButton,\n DesktopScreenshotRegion,\n DesktopWindowInfo,\n} from \"./services/desktop-control.js\";\nexport { handleComputerUseRoutes } from \"./routes/computer-use-routes.js\";\nexport { handleSandboxRoute } from \"./routes/sandbox-routes.js\";\n// Re-export types for consumers\nexport type {\n ActionHistoryEntry,\n ApprovalMode,\n ApprovalResolution,\n ApprovalSnapshot,\n BrowserActionParams,\n BrowserActionResult,\n BrowserActionType,\n BrowserInfo,\n BrowserState,\n BrowserTab,\n ClickableElement,\n ComputerActionResult,\n ComputerUseConfig,\n ComputerUseResult,\n DesktopActionParams,\n DesktopActionType,\n FileActionParams,\n FileActionResult,\n FileActionType,\n FileEntry,\n PendingApproval,\n PermissionType,\n PlatformCapabilities,\n ScreenRegion,\n ScreenSize,\n TerminalActionParams,\n TerminalActionResult,\n TerminalActionType,\n WindowActionParams,\n WindowActionResult,\n WindowActionType,\n WindowInfo,\n} from \"./types.js\";\nexport * from \"./register-routes.js\";\n"
30
+ ],
31
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAcO,SAAS,mBAAsB,CACpC,SACA,SACG;AAAA,EACH,MAAM,SAAS;AAAA,OACP,SAAiD,cACrD,CAAC;AAAA,EACL;AAAA,EAEA,IAAI,QAAQ,WAAW,OAAO,QAAQ,YAAY,UAAU;AAAA,IAC1D,YAAY,KAAK,UAAU,OAAO,QAChC,QAAQ,OACV,GAAG;AAAA,MACD,IAAI,OAAO,SAAS,WAAW;AAAA,QAC7B,OAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAGF,SAAS,yBAAyB,CAAC,MAKvC;AAAA,EACD,OAAO;AAAA,IACL,IAAI,GAAG,KAAK,YAAY,KAAK,IAAI;AAAA,IACjC,KAAK,yBAAyB,KAAK;AAAA,IACnC,OAAO,KAAK;AAAA,IACZ,QAAQ;AAAA,IACR,aAAa,KAAK;AAAA,IAClB,aAAa;AAAA,EACf;AAAA;AAGF,SAAS,oBAAuD,CAC9D,QACyB;AAAA,EACzB,MAAM,YAAqC,CAAC;AAAA,EAC5C,YAAY,KAAK,UAAU,OAAO,QAAQ,MAAM,GAAG;AAAA,IACjD,IAAI,QAAQ,cAAc;AAAA,MACxB,UAAU,gBAAgB,OAAO,UAAU,YAAY,MAAM,SAAS;AAAA,MACtE;AAAA,IACF;AAAA,IACA,IAAI,QAAQ,sBAAsB;AAAA,MAChC,UAAU,wBACR,OAAO,UAAU,YAAY,MAAM,SAAS;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,UAAU,OAAO;AAAA,EACnB;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,yBAA4D;AAAA,EAC1E;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,GAML;AAAA,EACf,OAAO;AAAA,IACL,SAAS,OAAO;AAAA,IAChB;AAAA,OACI,OAAO,UAAU,CAAC,IAAI,EAAE,OAAO,OAAO,SAAS,sBAAsB;AAAA,IACzE,MAAM;AAAA,MACJ,QAAQ;AAAA,MACR,mBAAmB;AAAA,MACnB,QAAQ,qBAAqB,MAAM;AAAA,SAC/B,oBAAoB,EAAE,+BAA+B,KAAK,IAAI,CAAC;AAAA,IACrE;AAAA,EACF;AAAA;;;AC7DF,SAAS,oBAAoB,CAAC,QAAkC;AAAA,EAC9D,IAAI,CAAC,OAAO,SAAS;AAAA,IACnB,OAAO,uBAAuB,OAAO;AAAA,EACvC;AAAA,EACA,OACE,OAAO,WACP,OAAO,YACN,OAAO,QACJ,UAAU,OAAO,SAAS,OAAO,MAAM,+BACvC;AAAA;AAIR,eAAsB,YAAY,CAChC,SACA,QACA,UACuB;AAAA,EACvB,IAAI,CAAC,OAAO,QAAQ;AAAA,IAClB,IAAI,UAAU;AAAA,MACZ,MAAM,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAAA,IACxD;AAAA,IACA,OAAO,EAAE,SAAS,OAAO,OAAO,sBAAsB;AAAA,EACxD;AAAA,EAEA,MAAM,SAAS,MAAM,QAAQ,kBAAkB,MAAM;AAAA,EACrD,MAAM,OAAO,qBAAqB,MAAM,EAAE,MAAM,GAAG,qBAAqB;AAAA,EAExE,IAAI,UAAU;AAAA,IACZ,MAAM,SAAS,EAAE,KAAK,CAAC;AAAA,EACzB;AAAA,EAEA,OAAO,0BAA0B;AAAA,IAC/B,QAAQ,OAAO;AAAA,IACf;AAAA,IACA;AAAA,EACF,CAAC;AAAA;AAQH,SAAS,sBAAsB,CAC7B,QACA,QACQ;AAAA,EACR,IAAI,OAAO,SAAS;AAAA,IAClB,MAAM,aACJ,OAAO,QAAQ,SAAS,IACpB,OAAO,QACJ,IAAI,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAC5C,KAAK;AAAA,CAAI,IACZ;AAAA,IACN,OAAO;AAAA,EAAkB;AAAA,EAC3B;AAAA,EAEA,OAAO,OAAO,UACT,OAAO,WAAW,UAAU,OAAO,sBACpC,OAAO,mBACL,0CAA0C,OAAO,iBACjD,yBAAyB,OAAO;AAAA;AAGxC,eAAsB,cAAc,CAClC,SACA,QACA,UACuB;AAAA,EACvB,OAAO,WAAW;AAAA,EAElB,MAAM,SAAS,MAAM,QAAQ,oBAAoB,MAAM;AAAA,EACvD,MAAM,OAAO,uBAAuB,QAAQ,MAAM,EAAE,MAClD,GACA,kBAAkB,oBACpB;AAAA,EAEA,IAAI,UAAU;AAAA,IACZ,MAAM,SAAS,EAAE,KAAK,CAAC;AAAA,EACzB;AAAA,EAEA,OAAO,0BAA0B;AAAA,IAC/B,QAAQ,OAAO;AAAA,IACf;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,EACrB,CAAC;AAAA;AASH,SAAS,wBAAwB,CAAC,QAAsC;AAAA,EACtE,OAAO,OAAO,UACT,OAAO,UAAU,OAAO,WAAW,+BACpC,2BAA2B,OAAO;AAAA;AAGxC,eAAsB,gBAAgB,CACpC,SACA,QACA,UACuB;AAAA,EACvB,IAAI,CAAC,OAAO,UAAU,OAAO,SAAS;AAAA,IACpC,OAAO,SAAS;AAAA,EAClB;AAAA,EACA,IAAI,CAAC,OAAO,QAAQ;AAAA,IAClB,IAAI,UAAU;AAAA,MACZ,MAAM,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAAA,IAC5D;AAAA,IACA,OAAO,EAAE,SAAS,OAAO,OAAO,0BAA0B;AAAA,EAC5D;AAAA,EAEA,MAAM,iBAAiB,KAAK,IAC1B,OACE,OAAO,WAAW,OAAO,kBAAkB,gCAC7C,GACA,4BACF;AAAA,EACA,MAAM,SAAS,MAAM,QAAQ,sBAAsB;AAAA,OAC9C;AAAA,IACH,SAAS;AAAA,EACX,CAAC;AAAA,EACD,MAAM,OAAO,yBAAyB,MAAM,EAAE,MAC5C,GACA,yBACF;AAAA,EAEA,IAAI,UAAU;AAAA,IACZ,MAAM,SAAS,EAAE,KAAK,CAAC;AAAA,EACzB;AAAA,EAEA,OAAO,0BAA0B;AAAA,IAC/B,QAAQ,OAAO;AAAA,IACf;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,EACrB,CAAC;AAAA;AAAA,IApJU,aAKP,wBAAwB,MA2CxB,kBAAkB,IAClB,uBAAuB,KAkDvB,4BAA4B,MAC5B,+BAA+B,KAC/B,mCAAmC;AAAA;AAAA,EArG5B,cAAc,CAAC,QAAQ,UAAU,UAAU;AAAA;;;ACfxD;AAAA;AAAA;AAAA;AAAA,IA+Ca;AAAA;AAAA,EA1Bb;AAAA,EA0Ba,gBAAwB;AAAA,IACnC,MAAM;AAAA,IACN,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,aAAa;AAAA,MACX,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,UAAU,EAAE,SAAS,OAAO;AAAA,IAC5B,SAAS;AAAA,MAGP;AAAA,MACA;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,aACE,mGACA,wHACA,oFACA,yEACA;AAAA,IACF,uBACE;AAAA,IACF,YAAY;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,QACF,UAAU;AAAA,QACV,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,MAAM,CAAC,GAAG,aAAa,cAAc,OAAO,iBAAiB;AAAA,QAC/D;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,QACF,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MAEA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MAEA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,QACF,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MAEA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,SAAS,GAAG;AAAA,MACxC;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,SAAS,GAAG;AAAA,MACxC;AAAA,IACF;AAAA,IACA,UAAU,OACR,SACA,UACA,WACqB;AAAA,MACrB,MAAM,UACH,QAAQ,WAAW,aAAa,KACjC;AAAA,MACF,IAAI,CAAC;AAAA,QAAS,OAAO;AAAA,MACrB,MAAM,OAAO,QAAQ,gBAAgB;AAAA,MACrC,OACE,KAAK,WAAW,aAChB,KAAK,WAAW,aAChB,KAAK,SAAS;AAAA;AAAA,IAGlB,SAAS,OACP,SACA,SACA,QACA,SACA,aAC0B;AAAA,MAC1B,MAAM,UACH,QAAQ,WAAW,aAAa,KACjC;AAAA,MACF,IAAI,CAAC,SAAS;AAAA,QACZ,OAAO,EAAE,SAAS,OAAO,OAAO,mCAAmC;AAAA,MACrE;AAAA,MAEA,MAAM,SAAS,oBAAuC,SAAS,OAAO;AAAA,MACtE,MAAM,KAAK,cACT,QACA;AAAA,QACE,SAAS;AAAA,QACT,MAAM,CAAC,MAAM,WAAW;AAAA,MAC1B,CACF;AAAA,MAEA,OAAO,kBACL,IACA;AAAA,QACE,MAAM,MAAM,aAAa,SAAS,QAA4B,QAAQ;AAAA,QACtE,QAAQ,MACN,eAAe,SAAS,QAA8B,QAAQ;AAAA,QAChE,UAAU,MACR,iBAAiB,SAAS,QAAgC,QAAQ;AAAA,MACtE,GACA,SACF;AAAA;AAAA,IAGF,UAAU;AAAA,MACR;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,SAAS,EAAE,MAAM,gCAAgC,QAAQ,OAAO;AAAA,QAClE;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,CAAC,SAAS;AAAA,YACnB,SACE;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,CAAC,SAAS;AAAA,YACnB,SACE;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,CAAC,SAAS;AAAA,YACnB,SACE;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;;;ACtVA,SAAS,WAAW,CAAC,OAAoC;AAAA,EACvD,IAAI,CAAC;AAAA,IAAO,OAAO;AAAA,EACnB,MAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAAA,EAC5C,OACE,eAAe,OACf,eAAe,UACf,eAAe,SACf,eAAe,QACf,eAAe;AAAA;AAInB,SAAS,UAAU,CAAC,OAAoC;AAAA,EACtD,IAAI,CAAC;AAAA,IAAO,OAAO;AAAA,EACnB,MAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAAA,EAC5C,OACE,eAAe,OACf,eAAe,WACf,eAAe,QACf,eAAe;AAAA;AAInB,SAAS,wBAAwB,GAAY;AAAA,EAC3C,MAAM,WAAW,QAAQ,IAAI;AAAA,EAC7B,IAAI,WAAW,QAAQ;AAAA,IAAG,OAAO;AAAA,EACjC,IAAI,YAAY,QAAQ;AAAA,IAAG,OAAO;AAAA,EAClC,OAAO,QAAQ,IAAI,8BAA8B;AAAA;AAGnD,SAAS,qBAAqB,CAC5B,SAC2B;AAAA,EAC3B,OACG,QAAQ,WAAW,aAAa,KAA4B;AAAA;AAIjE,SAAS,sBAAsB,CAC7B,QACsB;AAAA,EACtB,IAAI,OAAO,WAAW,mBAAmB;AAAA,IACvC,OAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,MAAM;AAAA,QACJ,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,YACP,YAAY,OAAO,cAAc,CAAC,KAAK,GAAG;AAAA,UAC5C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,OAAO,WAAW,OAAO;AAAA,IAC3B,OAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,MAAM,EAAE,MAAM;AAAA;AAAA,QAA+B;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAM,UACJ,OAAO,WAAW,eACd,wCACA,oCAAoC,OAAO;AAAA,EAEjD,OAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,MAAM;AAAA,MACJ,QAAQ;AAAA,MACR,QAAQ,OAAO;AAAA,MACf,YAAY,OAAO;AAAA,MACnB,iBAAiB,OAAO;AAAA,MACxB,MAAM,OAAO;AAAA,MACb,KAAK,OAAO;AAAA,MACZ,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,MACf,iBAAiB,OAAO;AAAA,MACxB,cAAc,OAAO;AAAA,IACvB;AAAA,EACF;AAAA;AAGF,SAAS,uBAAuB,CAC9B,QACA,QACQ;AAAA,EACR,IAAI,CAAC,OAAO,SAAS;AAAA,IACnB,IAAI,OAAO,kBAAkB;AAAA,MAC3B,OAAO,iCAAiC,OAAO;AAAA,IACjD;AAAA,IACA,IAAI,OAAO,kBAAkB;AAAA,MAC3B,OAAO,mBAAmB,OAAO,oCAAoC,OAAO;AAAA,IAC9E;AAAA,IACA,OAAO,0BAA0B,OAAO;AAAA,EAC1C;AAAA,EAEA,IAAI,OAAO,WAAW,cAAc;AAAA,IAClC,OAAO,OAAO,WAAW;AAAA,EAC3B;AAAA,EACA,OAAO,OAAO,WAAW,aAAa,OAAO;AAAA;AAG/C,eAAe,aAAa,CAC1B,QACA,QACA,MACA,UACe;AAAA,EACf,IAAI,CAAC;AAAA,IAAU;AAAA,EACf,MAAM,SAAS;AAAA,IACb;AAAA,OACI,OAAO,aACP;AAAA,MACE,aAAa;AAAA,QACX,0BAA0B;AAAA,UACxB,UAAU;AAAA,UACV,YAAY,OAAO;AAAA,UACnB,OAAO;AAAA,UACP,aACE,OAAO,WAAW,eACd,2BACA,wBAAwB,OAAO;AAAA,QACvC,CAAC;AAAA,MACH;AAAA,IACF,IACA,CAAC;AAAA,EACP,CAAC;AAAA;AAAA,IA3IG,yBACJ,gGA6IW;AAAA;AAAA,sBAA4B;AAAA,IACvC,MAAM;AAAA,IACN,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,aAAa;AAAA,MACX,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,UAAU,EAAE,SAAS,QAAQ;AAAA,IAC7B,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,aACE;AAAA;AAAA;AAAA;AAAA,IACF,uBACE;AAAA,IACF,aACE;AAAA,IAEF,YAAY;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,MACrD;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,MACrD;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,QACF,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,MACrD;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,MAAM,CAAC,QAAQ,UAAU,OAAO,EAAE;AAAA,MAC9D;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,SAAS,GAAG,SAAS,EAAE;AAAA,MACnD;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,MAAM,CAAC,MAAM,QAAQ,QAAQ,OAAO,EAAE;AAAA,MAClE;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,SAAS,GAAG,SAAS,IAAI,SAAS,EAAE;AAAA,MAChE;AAAA,IACF;AAAA,IACA,UAAU,OACR,SACA,UACA,WACqB;AAAA,MACrB,MAAM,UAAU,sBAAsB,OAAO;AAAA,MAC7C,OAAO,YAAY,QAAQ,yBAAyB;AAAA;AAAA,IAEtD,SAAS,OACP,SACA,SACA,QACA,SACA,aAC0B;AAAA,MAC1B,MAAM,SAAS,oBAAyC,SAAS,OAAO;AAAA,MACxE,OAAO,WAAW;AAAA,MAElB,MAAM,UAAU,sBAAsB,OAAO;AAAA,MAC7C,IAAI,CAAC,SAAS;AAAA,QACZ,IAAI,CAAC,yBAAyB,GAAG;AAAA,UAC/B,OAAO,EAAE,SAAS,OAAO,OAAO,mCAAmC;AAAA,QACrE;AAAA,QACA,MAAM,aAAa,uBAAuB,MAAM;AAAA,QAChD,MAAM,QAAO,wBAAwB,QAAQ,UAAU;AAAA,QACvD,MAAM,cAAc,QAAQ,YAAY,OAAM,QAAQ;AAAA,QACtD,OAAO,0BAA0B;AAAA,UAC/B,QAAQ,OAAO;AAAA,UACf,QAAQ;AAAA,UACR;AAAA,UACA,mBAAmB;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,SAAS,MAAM,QAAQ,qBAAqB,MAAM;AAAA,MACxD,MAAM,OAAO,wBAAwB,QAAQ,MAAM;AAAA,MACnD,MAAM,cAAc,QAAQ,QAAQ,MAAM,QAAQ;AAAA,MAClD,OAAO,0BAA0B;AAAA,QAC/B,QAAQ,OAAO;AAAA,QACf;AAAA,QACA;AAAA,QACA,mBAAmB;AAAA,MACrB,CAAC;AAAA;AAAA,IAGH,UAAU;AAAA,MACR;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,SAAS,EAAE,MAAM,mCAAmC,QAAQ,OAAO;AAAA,QACrE;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,CAAC,cAAc;AAAA,YACxB,SACE;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,SAAS,EAAE,MAAM,sCAAsC,QAAQ,OAAO;AAAA,QACxE;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,CAAC,cAAc;AAAA,YACxB,SACE;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,CAAC,cAAc;AAAA,YACxB,SACE;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,SAAS,EAAE,MAAM,+CAA+C,QAAQ,OAAO;AAAA,QACjF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,CAAC,cAAc;AAAA,YACxB,SACE;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;;;ACrYA;AACA;AAOO,SAAS,aAAa,CAAC,KAAsB;AAAA,EAClD,IAAI;AAAA,IACF,MAAM,QAAQ,SAAS,MAAM,UAAU,UAAU;AAAA,IACjD,SAAS,GAAG,SAAS,OAAO,EAAE,OAAO,UAAU,SAAS,KAAK,CAAC;AAAA,IAC9D,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAQJ,SAAS,UAAU,CACxB,SACA,MACA,SACQ;AAAA,EACR,MAAM,SAAS,aAAa,SAAS,MAAM;AAAA,IACzC;AAAA,IACA,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAChC,UAAU;AAAA,EACZ,CAAC;AAAA,EACD,OAAO;AAAA;AAMF,SAAS,gBAAgB,CAC9B,SACA,MACA,SACM;AAAA,EACN,aAAa,SAAS,MAAM;AAAA,IAC1B;AAAA,IACA,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,EAClC,CAAC;AAAA;AAoBI,SAAS,WAAW,CAAC,KAAsB;AAAA,EAChD,IAAI,QAAQ,QAAQ,QAAQ,WAAW;AAAA,IACrC,MAAM,IAAI,MAAM,0BAA0B,OAAO,GAAG,GAAG;AAAA,EACzD;AAAA,EACA,IAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,EAAE,WAAW,GAAG;AAAA,IACtD,MAAM,IAAI,MAAM,0BAA0B,OAAO,GAAG,GAAG;AAAA,EACzD;AAAA,EACA,MAAM,IAAI,OAAO,GAAG;AAAA,EACpB,IAAI,CAAC,OAAO,SAAS,CAAC,GAAG;AAAA,IACvB,MAAM,IAAI,MAAM,0BAA0B,OAAO,GAAG,GAAG;AAAA,EACzD;AAAA,EACA,OAAO,KAAK,MAAM,CAAC;AAAA;AAuBd,SAAS,gBAAgB,CAAC,UAA0B;AAAA,EACzD,IAAI,OAAO,aAAa,UAAU;AAAA,IAChC,MAAM,IAAI,MAAM,yCAAyC,OAAO,UAAU;AAAA,EAC5E;AAAA,EACA,MAAM,UAAU,SAAS,KAAK;AAAA,EAC9B,IAAI,CAAC,WAAW,KAAK,OAAO,KAAK,CAAC,iBAAiB,KAAK,OAAO,GAAG;AAAA,IAChE,MAAM,IAAI,MACR,8DAA8D,WAChE;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAMF,SAAS,YAAY,CAAC,MAAc,YAAY,MAAc;AAAA,EACnE,IAAI,OAAO,SAAS,UAAU;AAAA,IAC5B,MAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AAAA,EACA,IAAI,KAAK,SAAS,WAAW;AAAA,IAC3B,MAAM,IAAI,MAAM,kBAAkB,KAAK,qBAAqB,YAAY;AAAA,EAC1E;AAAA,EACA,OAAO;AAAA;AASF,SAAS,iBAAiB,CAAC,OAAuB;AAAA,EACvD,OAAO,IAAI,MAAM,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,MAAK;AAAA;AAmEtD,SAAS,cAAc,CAAC,KAAqB;AAAA,EAClD,MAAM,UAAU,IAAI,KAAK;AAAA,EACzB,IAAI,kBAAkB,IAAI,OAAO,GAAG;AAAA,IAClC,OAAO;AAAA,EACT;AAAA,EAEA,IACE,QAAQ,WAAW,KACnB,QAAQ,WAAW,CAAC,KAAK,MACzB,QAAQ,WAAW,CAAC,KAAK,KACzB;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,MACR,6BAA6B,2DAC/B;AAAA;AAQK,SAAS,gBAAgB,CAAC,MAAc,YAAY,KAAa;AAAA,EACtE,IAAI,OAAO,SAAS,YAAY,KAAK,WAAW,GAAG;AAAA,IACjD,MAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAAA,EACA,IAAI,KAAK,SAAS,WAAW;AAAA,IAC3B,MAAM,IAAI,MACR,uBAAuB,KAAK,qBAAqB,YACnD;AAAA,EACF;AAAA,EACA,IAAI,CAAC,sBAAsB,KAAK,IAAI,GAAG;AAAA,IACrC,MAAM,IAAI,MACR,2CAA2C,gEAC7C;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AA0BT,SAAS,iBAAiB,CAAC,KAAqB;AAAA,EAC9C,IAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,EAAE,WAAW,GAAG;AAAA,IACtD,MAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAAA,EACA,OAAO,IACJ,KAAK,EACL,YAAY,EACZ,QAAQ,UAAU,EAAE,EACpB,QAAQ,YAAY,EAAE;AAAA;AAGpB,SAAS,gBAAgB,CAAC,KAAqB;AAAA,EACpD,MAAM,aAAa,kBAAkB,GAAG;AAAA,EACxC,IAAI,aAAa,KAAK,UAAU,GAAG;AAAA,IACjC,OAAO;AAAA,EACT;AAAA,EACA,OAAO,sBAAsB,eAAe;AAAA;AAoBvC,SAAS,iBAAiB,CAAC,KAAqB;AAAA,EACrD,MAAM,YAAY,iBAAiB,GAAG;AAAA,EACtC,OAAO,mBAAmB,cAAc;AAAA;AAoBnC,SAAS,gBAAgB,CAAC,KAAqB;AAAA,EACpD,MAAM,YAAY,iBAAiB,GAAG;AAAA,EACtC,IAAI,aAAa,KAAK,SAAS,GAAG;AAAA,IAChC,OAAO,UAAU,YAAY;AAAA,EAC/B;AAAA,EACA,OAAO,kBAAkB,cAAc,IAAI,KAAK;AAAA;AAoB3C,SAAS,gBAAgB,CAAC,KAAqB;AAAA,EACpD,MAAM,YAAY,iBAAiB,GAAG;AAAA,EACtC,IAAI,aAAa,KAAK,SAAS,GAAG;AAAA,IAChC,OAAO,IAAI,UAAU,YAAY;AAAA,EACnC;AAAA,EACA,OAAO,kBAAkB,cAAc,IAAI,KAAK;AAAA;AAO3C,SAAS,eAAe,GAAe;AAAA,EAC5C,MAAM,KAAK,SAAS;AAAA,EACpB,IAAI,OAAO,YAAY,OAAO,WAAW,OAAO,SAAS;AAAA,IACvD,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,MAAM,yBAAyB,IAAI;AAAA;AAAA,IA9NzC,mBAgFA,uBAqBA,uBAwCA,oBAsBA,mBAyBA;AAAA;AAAA,EA5LA,oBAAoB,IAAI,IAAI;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EA2BK,wBAAwB;AAAA,EAqBxB,wBAAgD;AAAA,IACpD,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EAqBM,qBAA6C;AAAA,IACjD,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,KAAK;AAAA,IACL,OAAO;AAAA,IACP,KAAK;AAAA,EACP;AAAA,EAOM,oBAA4C;AAAA,IAChD,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,KAAK;AAAA,IACL,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,MAAM;AAAA,EACR;AAAA,EAUM,oBAA4C;AAAA,IAChD,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,KAAK;AAAA,IACL,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA;;;IC9Ua;AAAA;AAAA,EAHb;AAAA,EAGa,wBAAkC;AAAA,IAC7C,MAAM;AAAA,IACN,aACE;AAAA,IAEF,uBACE;AAAA,IACF,UAAU,CAAC,WAAW,SAAS,YAAY,cAAc,OAAO;AAAA,IAChE,aAAa;AAAA,MACX,OAAO,CAAC,WAAW,SAAS,YAAY,cAAc,OAAO;AAAA,IAC/D;AAAA,IACA,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,KAAK,OACH,SACA,UACA,WAC4B;AAAA,MAC5B,IAAI;AAAA,QACF,MAAM,UAAU,QAAQ,WAAW,aAAa;AAAA,QAGhD,IAAI,CAAC,SAAS;AAAA,UACZ,OAAO,EAAE,MAAM,GAAG;AAAA,QACpB;AAAA,QAEA,MAAM,OAAO,QAAQ,gBAAgB;AAAA,QACrC,MAAM,SAAS,QAAQ,oBAAoB;AAAA,QAC3C,MAAM,SAAS,QAAQ,iBAAiB;AAAA,QACxC,MAAM,YAAY,QAAQ,oBAAoB;AAAA,QAE9C,MAAM,OAAO;AAAA,EAAe,KAAK,UAC/B;AAAA,UACE,cAAc;AAAA,YACZ,UAAU,gBAAgB;AAAA,YAC1B,QAAQ,EAAE,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO;AAAA,YACrD,WAAW;AAAA,cACT,MAAM,UAAU;AAAA,cAChB,cAAc,UAAU;AAAA,cACxB,SAAS,UAAU,iBAChB,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,cAAc;AAAA,gBAClB,IAAI,SAAS;AAAA,gBACb,SAAS,SAAS;AAAA,cACpB,EAAE;AAAA,YACN;AAAA,YACA,cAAc;AAAA,cACZ,YAAY,KAAK,WAAW,YACxB,KAAK,WAAW,OAChB;AAAA,cACJ,eAAe,KAAK,YAAY,YAC5B,KAAK,YAAY,OACjB;AAAA,cACJ,SAAS,KAAK,QAAQ,YAClB,KAAK,QAAQ,OACb;AAAA,cACJ,YAAY,KAAK,WAAW,YACxB,KAAK,WAAW,OAChB;AAAA,cACJ,UAAU,KAAK,SAAS,YACpB,KAAK,SAAS,OACd;AAAA,cACJ,YAAY,KAAK,WAAW,YACxB,KAAK,WAAW,OAChB;AAAA,YACN;AAAA,YACA,eAAe,OAAO,MAAM,EAAE,EAAE,IAAI,CAAC,WAAW;AAAA,cAC9C,QAAQ,MAAM;AAAA,cACd,SAAS,MAAM;AAAA,YACjB,EAAE;AAAA,UACJ;AAAA,QACF,GACA,MACA,CACF;AAAA;AAAA,QAEA,OAAO;AAAA,UACL;AAAA,UACA,QAAQ;AAAA,YACN,UAAU,gBAAgB;AAAA,YAC1B,aAAa,OAAO;AAAA,YACpB,cAAc,OAAO;AAAA,UACvB;AAAA,UACA,MAAM;AAAA,YACJ,WAAW;AAAA,iBACN;AAAA,cACH,kBAAkB,UAAU,iBAAiB,MAAM,GAAG,CAAC;AAAA,YACzD;AAAA,YACA,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,eAAe,OAAO,MAAM,EAAE;AAAA,UAChC;AAAA,QACF;AAAA,QACA,MAAM;AAAA,QACN,OAAO,EAAE,MAAM,IAAI,QAAQ,CAAC,GAAG,MAAM,CAAC,EAAE;AAAA;AAAA;AAAA,EAG9C;AAAA;;;AClGA;AAUA,SAAS,gBAAgB,CAAC,OAAqD;AAAA,EAC7E,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO;AAAA,EACtC,OAAO,MAAM,QAAQ,KAAK,KAAK,OAAO,MAAM,OAAO,WAAW,MAAM,KAAK;AAAA;AAG3E,SAAS,qBAAqB,CAC5B,KACS;AAAA,EACT,MAAM,gBAAgB,IAAI,QAAQ,eAAe,KAAK,EAAE,YAAY;AAAA,EACpE,IACE,iBACA,kBAAkB,eAClB,kBAAkB,SAClB,kBAAkB,qBAClB,kBAAkB,sBAClB,kBAAkB,sBAClB;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,iBAAiB,IAAI,QAAQ,MAAM;AAAA,EAClD,IAAI,QAAQ;AAAA,IACV,IAAI;AAAA,MACF,MAAM,SAAS,IAAI,IAAI,MAAM;AAAA,MAC7B,IAAI,OAAO,aAAa,eAAe,OAAO,aAAa,aAAa;AAAA,QACtE,OAAO;AAAA,MACT;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA;AAAA,EAEX;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,YAAY,CAAC,UAAkB,UAA2B;AAAA,EACjE,MAAM,cAAc,OAAO,KAAK,QAAQ;AAAA,EACxC,MAAM,cAAc,OAAO,KAAK,QAAQ;AAAA,EACxC,OACE,YAAY,WAAW,YAAY,UACnC,OAAO,gBAAgB,aAAa,WAAW;AAAA;AAInD,SAAS,iBAAiB,GAAkB;AAAA,EAC1C,OAAO,QAAQ,IAAI,iBAAiB,KAAK,KAAK;AAAA;AAGhD,SAAS,mBAAmB,CAC1B,KACe;AAAA,EACf,MAAM,aAAa,iBAAiB,IAAI,QAAQ,aAAa,GACzD,MAAM,GAAG,IAAI,GACb,KAAK;AAAA,EACT,IAAI,YAAY;AAAA,IACd,MAAM,QAAQ,uBAAuB,KAAK,UAAU;AAAA,IACpD,IAAI,QAAQ;AAAA,MAAI,OAAO,MAAM,GAAG,KAAK;AAAA,EACvC;AAAA,EAEA,QACE,iBAAiB,IAAI,QAAQ,gBAAgB,KAC7C,iBAAiB,IAAI,QAAQ,kBAAkB,KAC/C,iBAAiB,IAAI,QAAQ,YAAY,KACzC,iBAAiB,IAAI,QAAQ,cAAc,IAC1C,KAAK,KAAK;AAAA;AAGf,SAAS,gBAAgB,CACvB,KACA,QACA,MACM;AAAA,EACN,IAAI,IAAI;AAAA,IAAa;AAAA,EACrB,IAAI,aAAa;AAAA,EACjB,IAAI,UAAU,gBAAgB,iCAAiC;AAAA,EAC/D,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC;AAAA;AAG9B,SAAS,qBAAqB,CAC5B,KACA,QACA,SACM;AAAA,EACN,iBAAiB,KAAK,QAAQ,EAAE,OAAO,QAAQ,CAAC;AAAA;AAGlD,SAAS,oCAAoC,CAC3C,KACA,KACS;AAAA,EACT,IAAI,sBAAsB,GAAG;AAAA,IAAG,OAAO;AAAA,EAEvC,MAAM,WAAW,kBAAkB;AAAA,EACnC,MAAM,WAAW,oBAAoB,GAAG;AAAA,EACxC,IAAI,YAAY,YAAY,aAAa,UAAU,QAAQ,GAAG;AAAA,IAC5D,OAAO;AAAA,EACT;AAAA,EAEA,sBAAsB,KAAK,WAAW,MAAM,KAAK,cAAc;AAAA,EAC/D,OAAO;AAAA;AAGT,eAAe,qBAAqB,CAClC,KACA,KACA,QACkB;AAAA,EAClB,IAAI,sBAAsB,GAAG;AAAA,IAAG,OAAO;AAAA,EAEvC,MAAM,WAAW,kBAAkB;AAAA,EACnC,MAAM,WAAW,oBAAoB,GAAG;AAAA,EACxC,IAAI,YAAY,YAAY,aAAa,UAAU,QAAQ,GAAG;AAAA,IAC5D,OAAO;AAAA,EACT;AAAA,EAEA,sBAAsB,KAAK,KAAK,cAAc;AAAA,EAC9C,OAAO;AAAA;AAGT,eAAe,kBAAkB,CAC/B,KACA,KACyC;AAAA,EACzC,MAAM,YAAa,IAA2B;AAAA,EAC9C,IAAI,aAAa,OAAO,cAAc,YAAY,CAAC,MAAM,QAAQ,SAAS,GAAG;AAAA,IAC3E,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAmB,CAAC;AAAA,EAC1B,IAAI,aAAa;AAAA,EACjB,IAAI;AAAA,IACF,iBAAiB,SAAS,KAAK;AAAA,MAC7B,MAAM,MAAM,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK;AAAA,MAC9D,cAAc,IAAI;AAAA,MAClB,IAAI,aAAa,gBAAgB;AAAA,QAC/B,IAAI,QAAQ;AAAA,QACZ,sBAAsB,KAAK,KAAK,wBAAwB;AAAA,QACxD,OAAO;AAAA,MACT;AAAA,MACA,OAAO,KAAK,GAAG;AAAA,IACjB;AAAA,IACA,MAAM;AAAA,IACN,sBAAsB,KAAK,KAAK,sBAAsB;AAAA,IACtD,OAAO;AAAA;AAAA,EAGT,IAAI,OAAO,WAAW;AAAA,IAAG,OAAO,CAAC;AAAA,EAEjC,IAAI;AAAA,IACF,MAAM,SAAS,KAAK,MAAM,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,CAAC;AAAA,IAChE,IAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAAA,MAClE,sBAAsB,KAAK,KAAK,mBAAmB;AAAA,MACnD,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,IACP,MAAM;AAAA,IACN,sBAAsB,KAAK,KAAK,mBAAmB;AAAA,IACnD,OAAO;AAAA;AAAA;AA0DX,SAAS,cAAc,CAAC,OAAiD;AAAA,EACvE,OAAO,qBAAqB,SAAS,KAAgC;AAAA;AAGvE,SAAS,sBAAqB,CAC5B,OAC+B;AAAA,EAC/B,MAAM,UAAU,MAAM;AAAA,EAGtB,IAAI,CAAC,SAAS,YAAY;AAAA,IACxB,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,QAAQ,WAAW,aAAa;AAAA,EAChD,IAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAAA,IAC3C,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY;AAAA,EAClB,IACE,OAAO,UAAU,wBAAwB,cACzC,OAAO,UAAU,oBAAoB,cACrC,OAAO,UAAU,oBAAoB,YACrC;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,kBAAkB,CACzB,KACA,KACA,KACS;AAAA,EACT,MAAM,gBAAgB,kBAAkB;AAAA,EACxC,IAAI,CAAC,eAAe;AAAA,IAClB,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,oBAAoB,GAAG;AAAA,EAC3C,MAAM,gBAAgB,IAAI,aAAa,IAAI,OAAO,GAAG,KAAK;AAAA,EAC1D,IACG,eAAe,aAAa,eAAe,WAAW,KACtD,iBAAiB,aAAa,eAAe,aAAa,GAC3D;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AAAA,EACzD,IAAI,IAAI,KAAK,UAAU,EAAE,OAAO,eAAe,CAAC,CAAC;AAAA,EACjD,OAAO;AAAA;AAGT,SAAS,aAAa,CACpB,KACA,SACM;AAAA,EACN,IAAI,MAAM,SAAS,KAAK,UAAU,OAAO;AAAA;AAAA,CAAO;AAAA;AAGlD,eAAsB,6BAA6B,CACjD,KACA,KACA,OACkB;AAAA,EAClB,MAAM,UAAU,IAAI,UAAU,OAAO,YAAY;AAAA,EACjD,MAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,kBAAkB;AAAA,EAEtD,IAAI,CAAC,IAAI,SAAS,WAAW,oBAAoB,GAAG;AAAA,IAClD,OAAO;AAAA,EACT;AAAA,EAEA,IACE,WAAW,SACX,IAAI,aAAa,sCACjB;AAAA,IACA,IAAI,CAAC,mBAAmB,KAAK,KAAK,GAAG,GAAG;AAAA,MACtC,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,UAAU,uBAAsB,KAAK;AAAA,IAC3C,IAAI,CAAC,SAAS;AAAA,MACZ,IAAI,UAAU,KAAK;AAAA,QACjB,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,qBAAqB;AAAA,MACvB,CAAC;AAAA,MACD,cAAc,KAAK;AAAA,QACjB,MAAM;AAAA,QACN,UAAU;AAAA,MACZ,CAAC;AAAA,MACD,IAAI,IAAI;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,UAAU,KAAK;AAAA,MACjB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,YAAY;AAAA,MACZ,qBAAqB;AAAA,IACvB,CAAC;AAAA,IAED,cAAc,KAAK;AAAA,MACjB,MAAM;AAAA,MACN,UAAU,QAAQ,oBAAoB;AAAA,IACxC,CAAC;AAAA,IAED,MAAM,YAAY,YAAY,MAAM;AAAA,MAClC,IAAI,MAAM;AAAA;AAAA,CAAiB;AAAA,OAC1B,KAAM;AAAA,IACT,IAAI,OAAO,cAAc,YAAY,WAAW,WAAW;AAAA,MACzD,UAAU,MAAM;AAAA,IAClB;AAAA,IAEA,MAAM,cAAc,QAAQ,qBAAqB,CAAC,aAAa;AAAA,MAC7D,cAAc,KAAK;AAAA,QACjB,MAAM;AAAA,QACN;AAAA,MACF,CAAC;AAAA,KACF;AAAA,IAED,MAAM,UAAU,MAAM;AAAA,MACpB,cAAc,SAAS;AAAA,MACvB,cAAc;AAAA;AAAA,IAGhB,IAAI,GAAG,SAAS,OAAO;AAAA,IACvB,IAAI,GAAG,WAAW,OAAO;AAAA,IACzB,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,WAAW,SAAS,IAAI,aAAa,+BAA+B;AAAA,IACtE,IAAI,CAAE,MAAM,sBAAsB,KAAK,KAAK,KAAK,GAAI;AAAA,MACnD,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,UAAU,uBAAsB,KAAK;AAAA,IAC3C,IAAI,CAAC,SAAS;AAAA,MACZ,iBAAiB,KAAK,KAAK,uBAAuB;AAAA,MAClD,OAAO;AAAA,IACT;AAAA,IAEA,iBAAiB,KAAK,KAAK,QAAQ,oBAAoB,CAAC;AAAA,IACxD,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,WAAW,UAAU,IAAI,aAAa,mCAAmC;AAAA,IAC3E,IAAI,CAAC,qCAAqC,KAAK,GAAG,GAAG;AAAA,MACnD,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,OAAO,MAAM,mBAAmB,KAAK,GAAG;AAAA,IAC9C,IAAI,CAAC,MAAM;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,OAAO,KAAK,SAAS,YAAY,CAAC,eAAe,KAAK,IAAI,GAAG;AAAA,MAC/D,sBACE,KACA,KACA,mEACF;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,UAAU,uBAAsB,KAAK;AAAA,IAC3C,IAAI,CAAC,SAAS;AAAA,MACZ,sBAAsB,KAAK,KAAK,oCAAoC;AAAA,MACpE,OAAO;AAAA,IACT;AAAA,IAEA,iBAAiB,KAAK,KAAK;AAAA,MACzB,MAAM,QAAQ,gBAAgB,KAAK,IAAI;AAAA,IACzC,CAAC;AAAA,IACD,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,IAAI,SAAS,MAAM,2CAA2C;AAAA,EAC5E,IAAI,WAAW,UAAU,OAAO;AAAA,IAC9B,IAAI,CAAC,qCAAqC,KAAK,GAAG,GAAG;AAAA,MACnD,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,OAAO,MAAM,mBAAmB,KAAK,GAAG;AAAA,IAC9C,IAAI,CAAC,MAAM;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,OAAO,KAAK,aAAa,WAAW;AAAA,MACtC,sBAAsB,KAAK,KAAK,4BAA4B;AAAA,MAC5D,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,UAAU,uBAAsB,KAAK;AAAA,IAC3C,IAAI,CAAC,SAAS;AAAA,MACZ,sBAAsB,KAAK,KAAK,oCAAoC;AAAA,MACpE,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,aAAa,MAAM;AAAA,IACzB,IAAI,eAAe,WAAW;AAAA,MAC5B,sBAAsB,KAAK,KAAK,qBAAqB;AAAA,MACrD,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,aAAa,QAAQ,gBACzB,mBAAmB,UAAU,GAC7B,KAAK,UACL,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS,SAClD;AAAA,IAEA,IAAI,CAAC,YAAY;AAAA,MACf,sBAAsB,KAAK,KAAK,oBAAoB;AAAA,MACpD,OAAO;AAAA,IACT;AAAA,IAEA,iBAAiB,KAAK,KAAK,UAAU;AAAA,IACrC,OAAO;AAAA,EACT;AAAA,EAEA,sBAAsB,KAAK,KAAK,WAAW;AAAA,EAC3C,OAAO;AAAA;AAQF,SAAS,uBAAuB,GAAG;AAAA,EACxC,OAAO,OACL,KACA,KACA,YACkB;AAAA,IAClB,MAAM,UAAU;AAAA,IAChB,MAAM,UAAU;AAAA,IAChB,MAAM,QAAQ,EAAE,SAAS,QAAQ;AAAA,IACjC,MAAM,8BAA8B,SAAS,SAAS,KAAK;AAAA;AAAA;AAAA,IA1czD,iBAAiB,SA4MjB,sBAOA;AAAA;AAAA,EAPA,uBAAkD;AAAA,IACtD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEM,0BAAuD;AAAA,IAC3D,MAAM;AAAA,IACN,cAAc;AAAA,IACd,kBAAkB,CAAC;AAAA,EACrB;AAAA;;;AC/OA;AACA;AACA;AAiDO,SAAS,eAAc,CAAC,OAAsC;AAAA,EACnE,OAAO,sBAAqB,SAAS,KAAqB;AAAA;AAAA;AAGrD,MAAM,2BAA2B;AAAA,EAC9B,OAAqB;AAAA,EACrB,UAAU,IAAI;AAAA,EACd,YAAY,IAAI;AAAA,EACP,aAAa,KAAK,KACjC,GAAG,QAAQ,GACX,UACA,4BACF;AAAA,EAEA,WAAW,GAAG;AAAA,IACZ,KAAK,WAAW;AAAA;AAAA,EAGlB,OAAO,GAAiB;AAAA,IACtB,OAAO,KAAK;AAAA;AAAA,EAGd,OAAO,CAAC,MAA4B;AAAA,IAClC,IAAI,gBAAe,IAAI,GAAG;AAAA,MACxB,KAAK,OAAO;AAAA,MACZ,KAAK,WAAW;AAAA,MAChB,KAAK,KAAK;AAAA,IACZ;AAAA,IACA,OAAO,KAAK;AAAA;AAAA,EAGd,iBAAiB,CAAC,SAA0B;AAAA,IAC1C,QAAQ,KAAK;AAAA,WACN;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,QACH,OAAO,cAAc,IAAI,OAAO;AAAA,WAC7B;AAAA,WACA;AAAA,QACH,OAAO;AAAA;AAAA;AAAA,EAIb,SAAS,GAAY;AAAA,IACnB,OAAO,KAAK,SAAS;AAAA;AAAA,EAGvB,eAAe,CACb,SACA,aAAsC,CAAC,GACZ;AAAA,IAC3B,MAAM,KAAK,YAAY,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAAA,IAC1E,MAAM,cAAc,IAAI,KAAK,EAAE,YAAY;AAAA,IAE3C,OAAO,IAAI,QAAQ,CAAC,YAAY;AAAA,MAC9B,KAAK,QAAQ,IAAI,IAAI;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACD,KAAK,KAAK;AAAA,KACX;AAAA;AAAA,EAGH,WAAW,GAAqB;AAAA,IAC9B,OAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,cAAc,KAAK,QAAQ;AAAA,MAC3B,kBAAkB,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC,EAAE,IAClD,GAAG,IAAI,SAAS,YAAY,mBAAmB;AAAA,QAC7C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EACF;AAAA,IACF;AAAA;AAAA,EAGF,eAAe,CACb,IACA,UACA,QAC2B;AAAA,IAC3B,MAAM,UAAU,KAAK,QAAQ,IAAI,EAAE;AAAA,IACnC,IAAI,CAAC,SAAS;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IAEA,KAAK,QAAQ,OAAO,EAAE;AAAA,IACtB,QAAQ,QAAQ,EAAE,UAAU,WAAW,OAAO,OAAO,CAAC;AAAA,IACtD,KAAK,KAAK;AAAA,IAEV,OAAO;AAAA,MACL,IAAI,QAAQ;AAAA,MACZ,SAAS,QAAQ;AAAA,MACjB;AAAA,MACA,WAAW;AAAA,MACX,MAAM,KAAK;AAAA,MACX,aAAa,QAAQ;AAAA,MACrB,YAAY,IAAI,KAAK,EAAE,YAAY;AAAA,SAC/B,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC7B;AAAA;AAAA,EAGF,SAAS,CAAC,QAAuB;AAAA,IAC/B,WAAW,WAAW,KAAK,QAAQ,OAAO,GAAG;AAAA,MAC3C,QAAQ,QAAQ,EAAE,UAAU,OAAO,WAAW,MAAM,OAAO,CAAC;AAAA,IAC9D;AAAA,IACA,KAAK,QAAQ,MAAM;AAAA,IACnB,KAAK,KAAK;AAAA;AAAA,EAGZ,SAAS,CAAC,UAAwC;AAAA,IAChD,KAAK,UAAU,IAAI,QAAQ;AAAA,IAC3B,SAAS,KAAK,YAAY,CAAC;AAAA,IAC3B,OAAO,MAAM;AAAA,MACX,KAAK,UAAU,OAAO,QAAQ;AAAA;AAAA;AAAA,EAI1B,UAAU,GAAS;AAAA,IACzB,IAAI;AAAA,MACF,MAAM,MAAM,GAAG,aAAa,KAAK,YAAY,MAAM;AAAA,MACnD,MAAM,SAAS,KAAK,MAAM,GAAG;AAAA,MAC7B,IAAI,OAAO,OAAO,SAAS,YAAY,gBAAe,OAAO,IAAI,GAAG;AAAA,QAClE,KAAK,OAAO,OAAO;AAAA,MACrB;AAAA,MACA,MAAM;AAAA;AAAA,EAKF,UAAU,GAAS;AAAA,IACzB,IAAI;AAAA,MACF,GAAG,UAAU,KAAK,QAAQ,KAAK,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,MAC/D,GAAG,cACD,KAAK,YACL,KAAK,UAAU,EAAE,MAAM,KAAK,KAAK,GAAG,MAAM,CAAC,GAC3C,MACF;AAAA,MACA,MAAM;AAAA;AAAA,EAKF,IAAI,GAAS;AAAA,IACnB,MAAM,WAAW,KAAK,YAAY;AAAA,IAClC,WAAW,YAAY,KAAK,WAAW;AAAA,MACrC,SAAS,QAAQ;AAAA,IACnB;AAAA;AAEJ;AAAA,IAnMM,uBAOA;AAAA;AAAA,EAPA,wBAAuC;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEM,gBAAgB,IAAI,IAAY;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA;;;AC3BD,yBAAS;AACT;AACA;AACA;AACA;AAcA,eAAe,YAAY,GAAG;AAAA,EAC5B,IAAI,CAAC,WAAW;AAAA,IACd,IAAI;AAAA,MACF,YAAY,MAAa;AAAA,MACzB,MAAM;AAAA,MACN,MAAM,IAAI,MACR,wFACF;AAAA;AAAA,EAEJ;AAAA,EACA,OAAO;AAAA;AAWF,SAAS,wBAAwB,CAAC,SAEhC;AAAA,EACP,IAAI,OAAO,QAAQ,aAAa,WAAW;AAAA,IACzC,kBAAkB,QAAQ;AAAA,EAC5B;AAAA;AAWF,SAAS,iBAAiB,GAAkB;AAAA,EAC1C,MAAM,MAAK,gBAAgB;AAAA,EAC3B,MAAM,aAAuB,CAAC;AAAA,EAE9B,IAAI,QAAO,UAAU;AAAA,IACnB,WAAW,KACT,gEACA,kEACA,gEACA,oDACF;AAAA,EACF,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,WAAW,KACT,0BACA,iCACA,6BACA,qBACA,2BACA,0BACA,oBACF;AAAA,EACF,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,MAAM,eAAe,QAAQ,IAAI,gBAAgB;AAAA,IACjD,MAAM,kBACJ,QAAQ,IAAI,wBAAwB;AAAA,IACtC,MAAM,eAAe,QAAQ,IAAI,gBAAgB;AAAA,IACjD,WAAW,KACT,KAAK,cAAc,yCAAyC,GAC5D,KAAK,iBAAiB,yCAAyC,GAC/D,KAAK,cAAc,yCAAyC,GAC5D,KAAK,cAAc,0CAA0C,GAC7D,KAAK,iBAAiB,0CAA0C,GAChE,KACE,cACA,sDACF,CACF;AAAA,EACF;AAAA,EAEA,WAAW,SAAQ,YAAY;AAAA,IAC7B,IAAI,WAAW,KAAI,GAAG;AAAA,MACpB,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,QAAO,UAAU,UAAU;AAAA,EAC1C,WAAW,aAAa;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAG;AAAA,IACD,IAAI;AAAA,MACF,MAAM,SAAS,cAAa,QAAQ,CAAC,SAAS,GAAG;AAAA,QAC/C,UAAU;AAAA,QACV,SAAS;AAAA,MACX,CAAC;AAAA,MACD,MAAM,QAAQ,OACX,MAAM,OAAO,EACb,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,KAAK,CAAC,UAAU,SAAS,WAAW,KAAK,CAAC;AAAA,MAC7C,IAAI,OAAO;AAAA,QACT,OAAO;AAAA,MACT;AAAA,MACA,MAAM;AAAA,EAGV;AAAA,EAEA,OAAO;AAAA;AAMF,SAAS,kBAAkB,GAAY;AAAA,EAC5C,OAAO,kBAAkB,MAAM;AAAA;AAKjC,eAAe,aAAa,GAAkB;AAAA,EAC5C,IAAI,WAAW,YAAY;AAAA,IACzB,IAAI;AAAA,MACF,MAAM,WAAW,SAAS,GAAG;AAAA,MAC7B,OAAO;AAAA,MACP,MAAM;AAAA,MAEN,UAAU;AAAA,MACV,aAAa;AAAA;AAAA,EAEjB;AAAA,EACA,MAAM,IAAI,MAAM,8CAA8C;AAAA;AAGhE,eAAsB,WAAW,CAAC,KAAqC;AAAA,EACrE,MAAM,MAAM,MAAM,aAAa;AAAA,EAC/B,MAAM,iBAAiB,kBAAkB;AAAA,EACzC,IAAI,CAAC,gBAAgB;AAAA,IACnB,MAAM,IAAI,MACR,kEACF;AAAA,EACF;AAAA,EAGA,IAAI,SAAS;AAAA,IACX,MAAM,aAAa;AAAA,EACrB;AAAA,EAEA,MAAM,OACJ,QAAQ,IAAI,OAAO,UAAU,QAAQ,IAAI,mBAAmB;AAAA,EAC9D,MAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,IAAI,MAAM;AAAA,IACR,WAAW,KACT,gBACA,4BACA,2BACA,eACF;AAAA,EACF;AAAA,EACA,IAAI,YAAqB;AAAA,EAEzB,SAAS,UAAU,EAAG,WAAW,yBAAyB,WAAW,GAAG;AAAA,IACtE,kBAAkB,MAAM,QAAQ,KAAK,OAAO,GAAG,sBAAsB,CAAC;AAAA,IAEtE,IAAI;AAAA,MACF,UAAU,MAAM,IAAI,QAAQ,OAAO;AAAA,QACjC;AAAA,QACA,UAAU;AAAA,QACV,aAAa;AAAA,QACb,MAAM;AAAA,QACN,iBAAiB,EAAE,OAAO,MAAM,QAAQ,IAAI;AAAA,MAC9C,CAAC;AAAA,MAED,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAAA,MAClC,aAAa,MAAM,MAAO,MAAM,QAAQ,QAAQ;AAAA,MAEhD,IAAI,KAAK;AAAA,QACP,MAAM,WAAW,KAAK,KAAK;AAAA,UACzB,WAAW;AAAA,UACX,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,MAEA,OAAO;AAAA,QACL,KAAK,WAAW,IAAI;AAAA,QACpB,OAAO,MAAM,WAAW,MAAM;AAAA,QAC9B,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MACA,OAAO,OAAO;AAAA,MACd,YAAY;AAAA,MACZ,MAAM,aAAa;AAAA,MACnB,IAAI,UAAU,yBAAyB;AAAA,QACrC,MAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,UAAU,GAAG,CAAC;AAAA,MACnE;AAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,UACJ,qBAAqB,QAAQ,UAAU,UAAU,OAAO,SAAS;AAAA,EACnE,MAAM,IAAI,MAAM,2CAA2C,SAAS;AAAA;AAGtE,eAAsB,YAAY,GAAkB;AAAA,EAClD,IAAI,SAAS;AAAA,IACX,IAAI;AAAA,MACF,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM;AAAA,IAGR,UAAU;AAAA,IACV,aAAa;AAAA,EACf;AAAA,EAEA,IAAI,iBAAiB;AAAA,IACnB,IAAI;AAAA,MACF,MAAM,GAAG,iBAAiB,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MAC1D,MAAM;AAAA,IAGR,kBAAkB;AAAA,EACpB;AAAA;AAKF,eAAsB,eAAe,CAAC,KAAoC;AAAA,EACxE,MAAM,OAAO,MAAM,cAAc;AAAA,EACjC,MAAM,KAAK,KAAK,KAAK,EAAE,WAAW,oBAAoB,SAAS,MAAM,CAAC;AAAA,EACtE,OAAO;AAAA,IACL,KAAK,KAAK,IAAI;AAAA,IACd,OAAO,MAAM,KAAK,MAAM;AAAA,IACxB,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA;AAKF,eAAsB,YAAY,CAChC,UACA,YACA,MACe;AAAA,EACf,MAAM,OAAO,MAAM,cAAc;AAAA,EAEjC,IAAI,UAAU;AAAA,IACZ,MAAM,KAAK,MAAM,QAAQ;AAAA,EAC3B,EAAO,SAAI,YAAY;AAAA,IACrB,MAAM,KAAK,MAAM,MAAM,WAAW,IAAI,WAAW,EAAE;AAAA,EACrD,EAAO,SAAI,MAAM;AAAA,IACf,MAAM,KAAK,MAAM,KAAK,eAAe,CAAC,MAAM;AAAA,MAC1C,MAAM,SAAS,SAAS,iBACtB,SAAS,MACT,WAAW,SACb;AAAA,MACA,OAAO,OAAO,SAAS,GAAG;AAAA,QACxB,MAAM,OAAO,OAAO;AAAA,QACpB,IAAI,KAAK,aAAa,SAAS,CAAC,GAAG;AAAA,UACjC,OAAO,KAAK;AAAA,QACd;AAAA,MACF;AAAA,MACA,OAAO;AAAA,OACN,IAAI;AAAA,IACP,MAAM,UAAU,GAAG,UAAU;AAAA,IAG7B,IAAI,CAAC,SAAS;AAAA,MACZ,MAAM,GAAG,QAAQ;AAAA,MACjB,MAAM,IAAI,MAAM,sBAAsB,iBAAiB;AAAA,IACzD;AAAA,IACA,MAAM,QAAQ,MAAM;AAAA,IACpB,MAAM,GAAG,QAAQ;AAAA,EACnB,EAAO;AAAA,IACL,MAAM,IAAI,MACR,6DACF;AAAA;AAAA;AAMJ,eAAsB,WAAW,CAC/B,MACA,UACe;AAAA,EACf,MAAM,OAAO,MAAM,cAAc;AAAA,EAEjC,IAAI,UAAU;AAAA,IACZ,MAAM,KAAK,MAAM,QAAQ;AAAA,IACzB,MAAM,KAAK,KAAK,UAAU,IAAI;AAAA,EAChC,EAAO;AAAA,IACL,MAAM,KAAK,SAAS,KAAK,IAAI;AAAA;AAAA;AAMjC,eAAsB,aAAa,CACjC,WACA,SAAS,KACM;AAAA,EACf,MAAM,OAAO,MAAM,cAAc;AAAA,EACjC,MAAM,QAAQ,cAAc,OAAO,CAAC,SAAS;AAAA,EAC7C,MAAM,KAAK,SAAS,CAAC,MAAM,OAAO,SAAS,GAAG,CAAC,GAAG,KAAK;AAAA;AAKzD,eAAsB,eAAe,GAA0B;AAAA,EAC7D,MAAM,OAAO,MAAM,cAAc;AAAA,EACjC,OAAO;AAAA,IACL,KAAK,KAAK,IAAI;AAAA,IACd,OAAO,MAAM,KAAK,MAAM;AAAA,IACxB,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA;AAGF,eAAsB,iBAAiB,GAA0B;AAAA,EAC/D,OAAO,gBAAgB;AAAA;AAGzB,eAAsB,cAAc,GAAyB;AAAA,EAC3D,IAAI;AAAA,IACF,MAAM,QAAQ,MAAM,gBAAgB;AAAA,IACpC,OAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAS;AAAA,SACN;AAAA,IACL;AAAA,IACA,OAAO,OAAO;AAAA,IACd,OAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,KAAK;AAAA,MACL,OAAO;AAAA,MACP,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA;AAAA;AAMJ,eAAsB,aAAa,GAAoB;AAAA,EACrD,MAAM,OAAO,MAAM,cAAc;AAAA,EACjC,MAAM,OAAO,MAAM,KAAK,QAAQ;AAAA,EAEhC,OAAO,KAAK,MAAM,GAAG,IAAI;AAAA;AAK3B,eAAsB,oBAAoB,GAAgC;AAAA,EACxE,MAAM,OAAO,MAAM,cAAc;AAAA,EACjC,OAAO,KAAK,SAAS,MAAM;AAAA,IACzB,MAAM,YACJ;AAAA,IACF,MAAM,WAAW,SAAS,iBAAiB,SAAS;AAAA,IACpD,MAAM,SAOD,CAAC;AAAA,IAEN,WAAW,MAAM,UAAU;AAAA,MACzB,IAAI,OAAO,UAAU;AAAA,QAAI;AAAA,MACzB,MAAM,MAAM,GAAG,QAAQ,YAAY;AAAA,MACnC,MAAM,QAAQ,GAAG,eAAe,IAAI,KAAK,EAAE,MAAM,GAAG,GAAG;AAAA,MACvD,MAAM,KAAK,GAAG,KAAK,IAAI,GAAG,OAAO;AAAA,MACjC,MAAM,MACJ,GAAG,aAAa,OAAO,GAAG,cAAc,WACpC,IAAI,GAAG,UAAU,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,MACpD;AAAA,MACN,OAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA,UAAU,MAAM,GAAG,MAAM;AAAA,QACzB,MAAO,GAAwB,QAAQ;AAAA,QACvC,MAAO,GAAyB,QAAQ;AAAA,QACxC,WAAW,GAAG,aAAa,YAAY,KAAK;AAAA,MAC9C,CAAC;AAAA,IACH;AAAA,IACA,OAAO;AAAA,GACR;AAAA;AAKH,eAAsB,iBAAiB,GAAoB;AAAA,EACzD,MAAM,OAAO,MAAM,cAAc;AAAA,EACjC,MAAM,SAAS,MAAM,KAAK,WAAW,EAAE,UAAU,UAAU,MAAM,MAAM,CAAC;AAAA,EACxE,OAAO;AAAA;AAKT,eAAsB,cAAc,CAAC,MAA+B;AAAA,EAClE,MAAM,OAAO,MAAM,cAAc;AAAA,EACjC,IAAI;AAAA,IACF,MAAM,SAAS,MAAM,KAAK,SAAS,OAAO,WAAW;AAAA,MACnD,MAAM,gBAAgB,OAAO,eAAe,eAAe,WAAW,GAAG,EAExE,EAAE;AAAA,MAGH,MAAM,KAAK,IAAI,cAAc,MAAM;AAAA,MACnC,OAAO,MAAM,GAAG;AAAA,OACf,IAAI;AAAA,IACP,OAAO,gBAAgB,MAAM;AAAA,IAC7B,OAAO,KAAK;AAAA,IACZ,MAAM,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA;AAAA;AAI5D,SAAS,eAAe,CAAC,OAAgB,SAAS,GAAW;AAAA,EAC3D,MAAM,SAAS,KAAK,OAAO,MAAM;AAAA,EACjC,IAAI,UAAU,QAAQ,UAAU,WAAW;AAAA,IACzC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,IACxB,IAAI,MAAM,WAAW,GAAG;AAAA,MACtB,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,MACL,SAAS,MAAM;AAAA,MACf,GAAG,MAAM,IAAI,CAAC,SAAS,GAAG,WAAW,gBAAgB,MAAM,SAAS,CAAC,GAAG;AAAA,IAC1E,EAAE,KAAK;AAAA,CAAI;AAAA,EACb;AAAA,EACA,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO,OAAO,QAAQ,KAAgC,EACnD,IAAI,EAAE,KAAK,iBAAiB;AAAA,MAC3B,IAAI,eAAe,OAAO,gBAAgB,UAAU;AAAA,QAClD,OAAO,GAAG;AAAA,EAAS,gBAAgB,aAAa,SAAS,CAAC;AAAA,MAC5D;AAAA,MACA,OAAO,GAAG,QAAQ,gBAAgB,aAAa,SAAS,CAAC;AAAA,KAC1D,EACA,KAAK;AAAA,CAAI;AAAA,EACd;AAAA,EACA,OAAO,OAAO,KAAK;AAAA;AAKrB,eAAsB,WAAW,CAC/B,UACA,MACA,UAAU,MACK;AAAA,EACf,MAAM,OAAO,MAAM,cAAc;AAAA,EACjC,IAAI,UAAU;AAAA,IACZ,MAAM,KAAK,gBAAgB,UAAU,EAAE,QAAQ,CAAC;AAAA,EAClD,EAAO,SAAI,MAAM;AAAA,IACf,MAAM,KAAK,gBACT,CAAC,MAAM,SAAS,KAAK,aAAa,SAAS,CAAC,GAC5C,EAAE,QAAQ,GACV,IACF;AAAA,EACF,EAAO;AAAA,IACL,MAAM,IAAI,QAAQ,CAAC,YACjB,WAAW,SAAS,KAAK,IAAI,SAAS,IAAI,CAAC,CAC7C;AAAA;AAAA;AA4BJ,eAAsB,eAAe,GAA0B;AAAA,EAC7D,IAAI,CAAC;AAAA,IAAS,MAAM,IAAI,MAAM,mBAAmB;AAAA,EACjD,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAAA,EAClC,MAAM,OAAqB,CAAC;AAAA,EAC5B,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,IACrC,MAAM,OAAO,MAAM;AAAA,IACnB,KAAK,KAAK;AAAA,MACR,IAAI,OAAO,CAAC;AAAA,MACZ,KAAK,KAAK,IAAI;AAAA,MACd,OAAO,MAAM,KAAK,MAAM;AAAA,MACxB,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AAGT,eAAsB,cAAc,CAAC,KAAmC;AAAA,EACtE,IAAI,CAAC;AAAA,IAAS,MAAM,IAAI,MAAM,mBAAmB;AAAA,EACjD,MAAM,OAAO,MAAM,QAAQ,QAAQ;AAAA,EACnC,aAAa;AAAA,EACb,IAAI,KAAK;AAAA,IACP,MAAM,KAAK,KAAK,KAAK,EAAE,WAAW,oBAAoB,SAAS,MAAM,CAAC;AAAA,EACxE;AAAA,EACA,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAAA,EAClC,OAAO;AAAA,IACL,IAAI,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,IAC9B,KAAK,KAAK,IAAI;AAAA,IACd,OAAO,MAAM,KAAK,MAAM;AAAA,IACxB,QAAQ;AAAA,EACV;AAAA;AAGF,eAAsB,eAAe,CAAC,OAA8B;AAAA,EAClE,IAAI,CAAC;AAAA,IAAS,MAAM,IAAI,MAAM,mBAAmB;AAAA,EACjD,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAAA,EAClC,MAAM,MAAM,OAAO,SAAS,OAAO,EAAE;AAAA,EACrC,MAAM,OAAO,MAAM;AAAA,EACnB,IAAI,CAAC;AAAA,IAAM,MAAM,IAAI,MAAM,OAAO,kBAAkB;AAAA,EACpD,IAAI,SAAS,YAAY;AAAA,IAEvB,aAAa,MAAM,KAAK,CAAC,MAAM,MAAM,IAAI,KAAK;AAAA,EAChD;AAAA,EACA,MAAM,KAAK,MAAM;AAAA;AAGnB,eAAsB,gBAAgB,CAAC,OAAsC;AAAA,EAC3E,IAAI,CAAC;AAAA,IAAS,MAAM,IAAI,MAAM,mBAAmB;AAAA,EACjD,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAAA,EAClC,MAAM,MAAM,OAAO,SAAS,OAAO,EAAE;AAAA,EACrC,MAAM,OAAO,MAAM;AAAA,EACnB,IAAI,CAAC;AAAA,IAAM,MAAM,IAAI,MAAM,OAAO,kBAAkB;AAAA,EACpD,aAAa;AAAA,EACb,MAAM,KAAK,aAAa;AAAA,EACxB,OAAO;AAAA,IACL,KAAK,KAAK,IAAI;AAAA,IACd,OAAO,MAAM,KAAK,MAAM;AAAA,IACxB,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA;AAAA,IAnjBE,YAAoD,MAmBpD,UAA0B,MAC1B,aAA0B,MAC1B,kBAAiC,MACjC,kBAAkB,OAChB,0BAA0B;AAAA;AAAA,EA1BhC;AAAA;;;ACXO,SAAS,0BAA0B,CACxC,SACsB;AAAA,EACtB,MAAM,OAA6B;AAAA,IACjC,YAAY,EAAE,WAAW,OAAO,MAAM,OAAO;AAAA,IAC7C,aAAa,EAAE,WAAW,OAAO,MAAM,OAAO;AAAA,IAC9C,YAAY,EAAE,WAAW,OAAO,MAAM,OAAO;AAAA,IAC7C,SAAS,EAAE,WAAW,OAAO,MAAM,OAAO;AAAA,IAC1C,UAAU,EAAE,WAAW,OAAO,MAAM,OAAO;AAAA,IAC3C,YAAY,EAAE,WAAW,MAAM,MAAM,UAAU;AAAA,EACjD;AAAA,EAEA,IAAI,QAAQ,WAAW,UAAU;AAAA,IAC/B,KAAK,aAAa,EAAE,WAAW,MAAM,MAAM,2BAA2B;AAAA,IACtE,KAAK,cAAc,QAAQ,cAAc,UAAU,IAC/C,EAAE,WAAW,MAAM,MAAM,WAAW,IACpC;AAAA,MACE,WAAW;AAAA,MACX,MAAM;AAAA,IACR;AAAA,IACJ,KAAK,aAAa;AAAA,MAChB,WAAW;AAAA,MACX,MAAM;AAAA,IACR;AAAA,EACF,EAAO,SAAI,QAAQ,WAAW,SAAS;AAAA,IACrC,IAAI,QAAQ,cAAc,QAAQ,GAAG;AAAA,MACnC,KAAK,aAAa,EAAE,WAAW,MAAM,MAAM,qBAAqB;AAAA,IAClE,EAAO,SAAI,QAAQ,cAAc,OAAO,GAAG;AAAA,MACzC,KAAK,aAAa,EAAE,WAAW,MAAM,MAAM,QAAQ;AAAA,IACrD,EAAO,SAAI,QAAQ,cAAc,kBAAkB,GAAG;AAAA,MACpD,KAAK,aAAa,EAAE,WAAW,MAAM,MAAM,mBAAmB;AAAA,IAChE,EAAO;AAAA,MACL,KAAK,aAAa;AAAA,QAChB,WAAW;AAAA,QACX,MAAM;AAAA,MACR;AAAA;AAAA,IAGF,KAAK,cAAc,QAAQ,cAAc,SAAS,IAC9C,EAAE,WAAW,MAAM,MAAM,UAAU,IACnC,EAAE,WAAW,OAAO,MAAM,yBAAyB;AAAA,IAEvD,IAAI,QAAQ,cAAc,QAAQ,GAAG;AAAA,MACnC,KAAK,aAAa,EAAE,WAAW,MAAM,MAAM,SAAS;AAAA,IACtD,EAAO,SAAI,QAAQ,cAAc,SAAS,GAAG;AAAA,MAC3C,KAAK,aAAa,EAAE,WAAW,MAAM,MAAM,UAAU;AAAA,IACvD,EAAO;AAAA,MACL,KAAK,aAAa;AAAA,QAChB,WAAW;AAAA,QACX,MAAM;AAAA,MACR;AAAA;AAAA,EAEJ,EAAO,SAAI,QAAQ,WAAW,SAAS;AAAA,IACrC,KAAK,aAAa,EAAE,WAAW,MAAM,MAAM,4BAA4B;AAAA,IACvE,KAAK,cAAc,EAAE,WAAW,MAAM,MAAM,wBAAwB;AAAA,IACpE,KAAK,aAAa,EAAE,WAAW,MAAM,MAAM,yBAAyB;AAAA,EACtE;AAAA,EAEA,KAAK,UAAU,QAAQ,mBAAmB,IACtC,EAAE,WAAW,MAAM,MAAM,qCAAqC,IAC9D,EAAE,WAAW,OAAO,MAAM,oCAAoC;AAAA,EAElE,KAAK,WACH,QAAQ,WAAW,UACf,EAAE,WAAW,MAAM,MAAM,iBAAiB,IAC1C,QAAQ,cAAc,QAAQ,SAAS,WAAW,IAChD,EAAE,WAAW,MAAM,MAAM,QAAQ,SAAS,YAAY,IACtD,EAAE,WAAW,MAAM,MAAM,QAAQ,SAAS,UAAU;AAAA,EAE5D,OAAO;AAAA;;;AC/DT,SAAS,SAAS,CAAC,OAAwB;AAAA,EACzC,IAAI,iBAAiB,OAAO;AAAA,IAC1B,OAAO,MAAM;AAAA,EACf;AAAA,EACA,OAAO,OAAO,KAAK;AAAA;AAGd,SAAS,2BAA2B,CACzC,SACuB;AAAA,EACvB,MAAM,QAAQ,IAAI,MAAM,QAAQ,OAAO;AAAA,EACvC,MAAM,OAAO;AAAA,EACb,MAAM,mBAAmB;AAAA,EACzB,MAAM,iBAAiB,QAAQ;AAAA,EAC/B,MAAM,YAAY,QAAQ;AAAA,EAC1B,IAAI,QAAQ,SAAS;AAAA,IACnB,MAAM,UAAU,QAAQ;AAAA,EAC1B;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,uBAAuB,CACrC,OACgC;AAAA,EAChC,OACE,iBAAiB,SACjB,sBAAsB,SACtB,MAAM,qBAAqB,QAC3B,oBAAoB,SACpB,OAAO,MAAM,mBAAmB;AAAA;AAIpC,SAAS,mCAAmC,CAAC,SAA0B;AAAA,EACrE,OAAO,iOAAiO,KACtO,OACF;AAAA;AAGF,SAAS,qCAAqC,CAAC,SAA0B;AAAA,EACvE,OAAO,oKAAoK,KACzK,OACF;AAAA;AAGK,SAAS,6BAA6B,CAC3C,OACA,UAI8B;AAAA,EAC9B,IAAI,wBAAwB,KAAK,GAAG;AAAA,IAClC,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,UAAU,KAAK;AAAA,EAE/B,IACE,SAAS,mBAAmB,mBAC5B,oCAAoC,OAAO,GAC3C;AAAA,IACA,OAAO,4BAA4B;AAAA,MACjC,gBAAgB;AAAA,MAChB,WAAW,SAAS;AAAA,MACpB,SACE;AAAA,MACF,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,IACE,SAAS,mBAAmB,sBAC5B,sCAAsC,OAAO,GAC7C;AAAA,IACA,OAAO,4BAA4B;AAAA,MACjC,gBAAgB;AAAA,MAChB,WAAW,SAAS;AAAA,MACpB,SACE;AAAA,MACF,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;;;ACuEF,SAAS,YAAY,CAAC,GAAW,GAAiB;AAAA,EACvD,+BACE,iBACA,MAAM;AAAA,IACJ,MAAM,KAAK,YAAY,CAAC;AAAA,IACxB,MAAM,KAAK,YAAY,CAAC;AAAA,IACxB,MAAM,MAAK,gBAAgB;AAAA,IAE3B,IAAI,QAAO,UAAU;AAAA,MACnB,IAAI,cAAc,UAAU,GAAG;AAAA,QAC7B,WAAW,YAAY,CAAC,KAAK,MAAM,IAAI,GAAG,IAAI;AAAA,MAChD,EAAO;AAAA,QACL,WACE,aACA;AAAA,UACE;AAAA,UACA,iDAAiD,OAAO;AAAA,QAC1D,GACA,IACF;AAAA;AAAA,IAEJ,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,eAAe;AAAA,MACf,WACE,WACA,CAAC,aAAa,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,SAAS,GAAG,GAClD,IACF;AAAA,IACF,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,MAAM,KAAK;AAAA,QACT;AAAA,QACA,6EAA6E,MAAM;AAAA,QACnF;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,MACX,WAAW,cAAc,CAAC,YAAY,EAAE,GAAG,IAAI;AAAA,IACjD;AAAA,KAEF,eACF;AAAA;AAGK,SAAS,yBAAyB,CACvC,GACA,GACA,WACM;AAAA,EACN,+BACE,gCACA,MAAM;AAAA,IACJ,MAAM,KAAK,YAAY,CAAC;AAAA,IACxB,MAAM,KAAK,YAAY,CAAC;AAAA,IACxB,MAAM,MAAK,gBAAgB;AAAA,IAC3B,MAAM,sBAAsB,mBAAmB,SAAS;AAAA,IAExD,IAAI,oBAAoB,WAAW,GAAG;AAAA,MACpC,aAAa,IAAI,EAAE;AAAA,MACnB;AAAA,IACF;AAAA,IAEA,IAAI,QAAO,UAAU;AAAA,MACnB,MAAM,UAAkC;AAAA,QACtC,KAAK;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,QACT,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,MACA,MAAM,QAAQ,oBACX,IAAI,CAAC,aAAa,QAAQ,SAAS,EACnC,OAAO,OAAO;AAAA,MACjB,MAAM,WAAW,MAAM,SAAS,IAAI,IAAI,MAAM,KAAK,IAAI,OAAO;AAAA,MAC9D,MAAM,cAAc;AAAA;AAAA,yBAEH,UAAU;AAAA,4BACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQpB,WAAW,SAAS,CAAC,MAAM,WAAW,GAAG,GAAK;AAAA,MAC9C;AAAA,IACF;AAAA,IAEA,IAAI,QAAO,SAAS;AAAA,MAClB,eAAe;AAAA,MACf,MAAM,SAAiC;AAAA,QACrC,KAAK;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,QACT,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,MACA,MAAM,OAAO,oBAAoB,IAC/B,CAAC,aAAa,OAAO,aAAa,QACpC;AAAA,MACA,WACE,WACA;AAAA,QACE,GAAG,KAAK,QAAQ,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC;AAAA,QACzC;AAAA,QACA,OAAO,EAAE;AAAA,QACT,OAAO,EAAE;AAAA,QACT;AAAA,QACA;AAAA,QACA,GAAG,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC;AAAA,MACxD,GACA,IACF;AAAA,MACA;AAAA,IACF;AAAA,IAEA,IAAI,QAAO,SAAS;AAAA,MAClB,MAAM,QAAgC;AAAA,QACpC,KAAK;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,QACT,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,MACA,MAAM,UAAU,oBACb,IAAI,CAAC,aAAa,MAAM,SAAS,EACjC,OAAO,CAAC,SAAyB,OAAO,SAAS,IAAI,CAAC,EACtD,IACC,CAAC,SAAS,sCAAsC,gBAClD;AAAA,MACF,MAAM,QAAQ,CAAC,GAAG,mBAAmB,EAClC,QAAQ,EACR,IAAI,CAAC,aAAa,MAAM,SAAS,EACjC,OAAO,CAAC,SAAyB,OAAO,SAAS,IAAI,CAAC,EACtD,IACC,CAAC,SAAS,sCAAsC,gBAClD;AAAA,MACF,MAAM,KAAK;AAAA,QACT;AAAA,QACA,6EAA6E,MAAM;AAAA,QACnF;AAAA,QACA,GAAG;AAAA,QACH;AAAA,QACA,GAAG;AAAA,MACL,EAAE,KAAK,IAAI;AAAA,MACX,WAAW,cAAc,CAAC,YAAY,EAAE,GAAG,IAAI;AAAA,IACjD;AAAA,KAEF,8BACF;AAAA;AAKK,SAAS,kBAAkB,CAAC,GAAW,GAAiB;AAAA,EAC7D,+BACE,wBACA,MAAM;AAAA,IACJ,MAAM,KAAK,YAAY,CAAC;AAAA,IACxB,MAAM,KAAK,YAAY,CAAC;AAAA,IACxB,MAAM,MAAK,gBAAgB;AAAA,IAE3B,IAAI,QAAO,UAAU;AAAA,MACnB,IAAI,cAAc,UAAU,GAAG;AAAA,QAC7B,WAAW,YAAY,CAAC,MAAM,MAAM,IAAI,GAAG,IAAI;AAAA,MACjD,EAAO;AAAA,QACL,MAAM,cAAc;AAAA;AAAA,yBAEL,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAezB,WAAW,SAAS,CAAC,MAAM,WAAW,GAAG,GAAK;AAAA;AAAA,IAElD,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,eAAe;AAAA,MACf,WACE,WACA,CAAC,aAAa,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,SAAS,YAAY,KAAK,GAAG,GACnE,IACF;AAAA,IACF,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,MAAM,KAAK;AAAA,QACT;AAAA,QACA,6EAA6E,MAAM;AAAA,QACnF;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,MACX,WAAW,cAAc,CAAC,YAAY,EAAE,GAAG,IAAI;AAAA,IACjD;AAAA,KAEF,sBACF;AAAA;AAKK,SAAS,iBAAiB,CAAC,GAAW,GAAiB;AAAA,EAC5D,+BACE,uBACA,MAAM;AAAA,IACJ,MAAM,KAAK,YAAY,CAAC;AAAA,IACxB,MAAM,KAAK,YAAY,CAAC;AAAA,IACxB,MAAM,MAAK,gBAAgB;AAAA,IAE3B,IAAI,QAAO,UAAU;AAAA,MACnB,IAAI,cAAc,UAAU,GAAG;AAAA,QAC7B,WAAW,YAAY,CAAC,MAAM,MAAM,IAAI,GAAG,IAAI;AAAA,MACjD,EAAO;AAAA,QACL,MAAM,cAAc;AAAA;AAAA,yBAEL,UAAU;AAAA;AAAA;AAAA;AAAA,QAIzB,WAAW,SAAS,CAAC,MAAM,WAAW,GAAG,GAAK;AAAA;AAAA,IAElD,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,eAAe;AAAA,MACf,WACE,WACA,CAAC,aAAa,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,SAAS,GAAG,GAClD,IACF;AAAA,IACF,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,MAAM,KAAK;AAAA,QACT;AAAA,QACA,6EAA6E,MAAM;AAAA,QACnF;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,MACX,WAAW,cAAc,CAAC,YAAY,EAAE,GAAG,IAAI;AAAA,IACjD;AAAA,KAEF,qBACF;AAAA;AAKK,SAAS,gBAAgB,CAAC,GAAW,GAAiB;AAAA,EAC3D,+BACE,sBACA,MAAM;AAAA,IACJ,MAAM,KAAK,YAAY,CAAC;AAAA,IACxB,MAAM,KAAK,YAAY,CAAC;AAAA,IACxB,MAAM,MAAK,gBAAgB;AAAA,IAE3B,IAAI,QAAO,UAAU;AAAA,MACnB,IAAI,cAAc,UAAU,GAAG;AAAA,QAC7B,WAAW,YAAY,CAAC,KAAK,MAAM,IAAI,GAAG,IAAI;AAAA,MAChD,EAAO;AAAA,QAEL,MAAM,MAAM,kGAAkG,SAAS;AAAA,QACvH,WAAW,aAAa,CAAC,MAAM,cAAc,MAAM,GAAG,GAAG,IAAI;AAAA;AAAA,IAEjE,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,eAAe;AAAA,MACf,WAAW,WAAW,CAAC,aAAa,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,GAAG,IAAI;AAAA,IACnE,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,MAAM,KAAK;AAAA,QACT;AAAA,QACA,6EAA6E,MAAM;AAAA,MACrF,EAAE,KAAK,IAAI;AAAA,MACX,WAAW,cAAc,CAAC,YAAY,EAAE,GAAG,IAAI;AAAA,IACjD;AAAA,KAEF,oBACF;AAAA;AAKK,SAAS,WAAW,CACzB,IACA,IACA,IACA,IACM;AAAA,EACN,+BACE,gBACA,MAAM;AAAA,IACJ,MAAM,MAAM,YAAY,EAAE;AAAA,IAC1B,MAAM,MAAM,YAAY,EAAE;AAAA,IAC1B,MAAM,MAAM,YAAY,EAAE;AAAA,IAC1B,MAAM,MAAM,YAAY,EAAE;AAAA,IAC1B,MAAM,MAAK,gBAAgB;AAAA,IAE3B,IAAI,QAAO,UAAU;AAAA,MACnB,IAAI,cAAc,UAAU,GAAG;AAAA,QAC7B,WACE,YACA,CAAC,MAAM,OAAO,OAAO,MAAM,OAAO,KAAK,GACvC,GACF;AAAA,MACF,EAAO;AAAA,QAEL,MAAM,SAAS;AAAA,UACb;AAAA,UACA,eAAe,QAAQ;AAAA,UACvB;AAAA,UACA,eAAe,QAAQ;AAAA,UACvB;AAAA,QACF,EAAE,KAAK;AAAA,CAAI;AAAA,QACX,WAAW,aAAa,CAAC,MAAM,MAAM,GAAG,GAAK;AAAA;AAAA,IAEjD,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,eAAe;AAAA,MACf,WACE,WACA;AAAA,QACE;AAAA,QACA,OAAO,GAAG;AAAA,QACV,OAAO,GAAG;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,GAAG;AAAA,QACV,OAAO,GAAG;AAAA,QACV;AAAA,QACA;AAAA,MACF,GACA,GACF;AAAA,IACF,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,MAAM,KAAK;AAAA,QACT;AAAA,QACA;AAAA,QACA,6EAA6E,OAAO;AAAA,QACpF;AAAA,QACA;AAAA,QACA;AAAA,QACA,6EAA6E,OAAO;AAAA,QACpF;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,MACX,WAAW,cAAc,CAAC,YAAY,EAAE,GAAG,GAAK;AAAA,IAClD;AAAA,KAEF,cACF;AAAA;AAKK,SAAS,aAAa,CAC3B,GACA,GACA,WACA,SAAS,GACH;AAAA,EACN,+BACE,kBACA,MAAM;AAAA,IACJ,MAAM,KAAK,YAAY,CAAC;AAAA,IACxB,MAAM,KAAK,YAAY,CAAC;AAAA,IACxB,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,YAAY,MAAM,GAAG,EAAE,CAAC;AAAA,IAC5D,MAAM,MAAK,gBAAgB;AAAA,IAE3B,IAAI,QAAO,UAAU;AAAA,MAInB,MAAM,OACJ,cAAc,UAAU,cAAc,UAClC,eACA;AAAA,MACN,MAAM,QACJ,cAAc,QAAQ,cAAc,SAAS,SAAS,CAAC;AAAA,MACzD,MAAM,MACJ,SAAS,aACL,4GAA4G,gDAC5G,+GAA+G;AAAA,MACrH,WAAW,aAAa,CAAC,MAAM,cAAc,MAAM,GAAG,GAAG,IAAI;AAAA,IAC/D,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,eAAe;AAAA,MAEf,WAAW,WAAW,CAAC,aAAa,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,GAAG,IAAI;AAAA,MAEjE,MAAM,SACJ,cAAc,OACV,MACA,cAAc,SACZ,MACA,cAAc,SACZ,MACA;AAAA,MACV,SAAS,IAAI,EAAG,IAAI,QAAQ,KAAK;AAAA,QAC/B,WAAW,WAAW,CAAC,SAAS,MAAM,GAAG,IAAI;AAAA,MAC/C;AAAA,IACF,EAAO,SAAI,QAAO,SAAS;AAAA,MAGzB,MAAM,cACH,cAAc,QAAQ,cAAc,SAAS,IAAI,MAAM,MAAM;AAAA,MAChE,MAAM,KAAK;AAAA,QACT;AAAA,QACA,6EAA6E,MAAM;AAAA,QACnF;AAAA,QACA,iDAAiD;AAAA,MACnD,EAAE,KAAK,IAAI;AAAA,MACX,WAAW,cAAc,CAAC,YAAY,EAAE,GAAG,IAAI;AAAA,IACjD;AAAA,KAEF,gBACF;AAAA;AAKK,SAAS,WAAW,CAAC,MAAoB;AAAA,EAC9C,+BACE,gBACA,MAAM;AAAA,IACJ,MAAM,WAAW,aAAa,IAAI;AAAA,IAClC,MAAM,MAAK,gBAAgB;AAAA,IAE3B,IAAI,QAAO,UAAU;AAAA,MACnB,IAAI,cAAc,UAAU,GAAG;AAAA,QAC7B,WAAW,YAAY,CAAC,KAAK,UAAU,GAAG,GAAK;AAAA,MACjD,EAAO;AAAA,QACL,WACE,aACA;AAAA,UACE;AAAA,UACA,iDAAiD,kBAAkB,QAAQ;AAAA,QAC7E,GACA,GACF;AAAA;AAAA,IAEJ,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,eAAe;AAAA,MACf,WAAW,WAAW,CAAC,QAAQ,MAAM,QAAQ,GAAG,GAAK;AAAA,IACvD,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,MAAM,UAAU,SAAS,QAAQ,MAAM,IAAI;AAAA,MAC3C,WACE,cACA;AAAA,QACE;AAAA,QACA,2FAA2F;AAAA,MAC7F,GACA,GACF;AAAA,IACF;AAAA,KAEF,cACF;AAAA;AAQK,SAAS,eAAe,CAAC,KAAmB;AAAA,EACjD,+BACE,qBACA,MAAM;AAAA,IACJ,MAAM,UAAU,iBAAiB,GAAG;AAAA,IACpC,MAAM,MAAK,gBAAgB;AAAA,IAE3B,IAAI,QAAO,UAAU;AAAA,MACnB,IAAI,cAAc,UAAU,GAAG;AAAA,QAC7B,WAAW,YAAY,CAAC,MAAM,kBAAkB,OAAO,GAAG,GAAG,IAAI;AAAA,MACnE,EAAO;AAAA,QAEL,MAAM,WAAmC;AAAA,UACvC,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,KAAK;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,eAAe;AAAA,UACf,MAAM;AAAA,UACN,OAAO;AAAA,UACP,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,QACP;AAAA,QACA,MAAM,aAAa,QAAQ,KAAK,EAAE,YAAY;AAAA,QAC9C,MAAM,OAAO,SAAS;AAAA,QACtB,IAAI,SAAS,WAAW;AAAA,UACtB,WACE,aACA,CAAC,MAAM,gDAAgD,MAAM,GAC7D,IACF;AAAA,QACF,EAAO;AAAA,UACL,WACE,aACA;AAAA,YACE;AAAA,YACA,iDAAiD,kBAAkB,OAAO;AAAA,UAC5E,GACA,IACF;AAAA;AAAA;AAAA,IAGN,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,eAAe;AAAA,MACf,MAAM,OAAO,eAAe,OAAO;AAAA,MACnC,WAAW,WAAW,CAAC,OAAO,IAAI,GAAG,IAAI;AAAA,IAC3C,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,MAAM,UAAU,QAAQ,QAAQ,MAAM,IAAI;AAAA,MAC1C,WACE,cACA;AAAA,QACE;AAAA,QACA,2FAA2F;AAAA,MAC7F,GACA,IACF;AAAA,IACF;AAAA,KAEF,mBACF;AAAA;AAWK,SAAS,eAAe,CAAC,OAAqB;AAAA,EACnD,+BACE,qBACA,MAAM;AAAA,IACJ,MAAM,YAAY,iBAAiB,KAAK;AAAA,IACxC,MAAM,QAAQ,UAAU,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC;AAAA,IACpE,MAAM,MAAK,gBAAgB;AAAA,IAE3B,IAAI,QAAO,UAAU;AAAA,MAEnB,MAAM,cAAsC;AAAA,QAC1C,KAAK;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,KAAK;AAAA,QACL,QAAQ;AAAA,MACV;AAAA,MACA,MAAM,cAAsC;AAAA,QAC1C,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,eAAe;AAAA,QACf,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA,MAAM,YAAsB,CAAC;AAAA,MAC7B,IAAI,MAAM;AAAA,MACV,WAAW,QAAQ,OAAO;AAAA,QACxB,IAAI,YAAY,OAAO;AAAA,UACrB,UAAU,KAAK,YAAY,KAAK;AAAA,QAClC,EAAO;AAAA,UACL,MAAM;AAAA;AAAA,MAEV;AAAA,MACA,MAAM,QACJ,UAAU,SAAS,IAAI,WAAW,UAAU,KAAK,IAAI,OAAO;AAAA,MAC9D,MAAM,YAAY,iBAAiB,GAAG;AAAA,MACtC,MAAM,UAAU,YAAY;AAAA,MAC5B,MAAM,UACJ,YAAY,YACR,gDAAgD,UAAU,UAC1D,iDAAiD,kBAAkB,GAAG,IAAI;AAAA,MAChF,WAAW,aAAa,CAAC,MAAM,OAAO,GAAG,IAAI;AAAA,IAC/C,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,eAAe;AAAA,MAEf,MAAM,SAAS,MAAM,IAAI,CAAC,MAAM;AAAA,QAC9B,MAAM,OAA+B;AAAA,UACnC,KAAK;AAAA,UACL,SAAS;AAAA,UACT,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,QACA,OAAO,KAAK,MAAM,iBAAiB,CAAC;AAAA,OACrC;AAAA,MACD,WAAW,WAAW,CAAC,OAAO,OAAO,KAAK,GAAG,CAAC,GAAG,IAAI;AAAA,IACvD,EAAO,SAAI,QAAO,SAAS;AAAA,MAEzB,MAAM,WAAmC;AAAA,QACvC,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,KAAK;AAAA,QACL,KAAK;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA,IAAI,SAAS;AAAA,MACb,IAAI,MAAM;AAAA,MACV,WAAW,QAAQ,OAAO;AAAA,QACxB,IAAI,SAAS,OAAO;AAAA,UAClB,UAAU,SAAS;AAAA,QACrB,EAAO;AAAA,UACL,MAAM;AAAA;AAAA,MAEV;AAAA,MACA,MAAM,YAAY,iBAAiB,GAAG;AAAA,MACtC,MAAM,UAAU,GAAG,SAAS,YAAY,QAAQ,MAAM,IAAI;AAAA,MAC1D,WACE,cACA;AAAA,QACE;AAAA,QACA,2FAA2F;AAAA,MAC7F,GACA,IACF;AAAA,IACF;AAAA,KAEF,mBACF;AAAA;AAGF,SAAS,8BAAiC,CACxC,WACA,SACA,UACG;AAAA,EACH,IAAI;AAAA,IACF,OAAO,QAAQ;AAAA,IACf,OAAO,OAAO;AAAA,IACd,IAAI,wBAAwB,KAAK,GAAG;AAAA,MAClC,MAAM;AAAA,IACR;AAAA,IACA,MAAM,kBAAkB,8BAA8B,OAAO;AAAA,MAC3D,gBAAgB;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,IACD,IAAI,iBAAiB;AAAA,MACnB,MAAM;AAAA,IACR;AAAA,IACA,MAAM;AAAA;AAAA;AAMV,SAAS,kBAAkB,CAAC,WAA+B;AAAA,EACzD,MAAM,aAAa,UAChB,IAAI,CAAC,aAAa,SAAS,KAAK,EAAE,YAAY,CAAC,EAC/C,OAAO,OAAO;AAAA,EAEjB,WAAW,YAAY,YAAY;AAAA,IACjC,IACE,CAAC;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,SAAS,QAAQ,GACnB;AAAA,MACA,MAAM,IAAI,MAAM,6BAA6B,UAAU;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,cAAc,GAAS;AAAA,EAC9B,IAAI,CAAC,cAAc,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,MACR,gGACF;AAAA,EACF;AAAA;AAAA;AAAA,EAr4BF;AAAA;;;ACDA,0BAAS;AACT;AACA,mBAAS;AACT,iBAAS;AAqDT,SAAS,OAAO,GAAqB;AAAA,EACnC,IAAI,iBAAiB;AAAA,IAAM,OAAO;AAAA,EAClC,IAAI,cAAc;AAAA,IAAM,OAAO;AAAA,EAC/B,IAAI;AAAA,IACF,MAAM,MAAM,gBAAgB,uBAAuB;AAAA,IACnD,IAAI,MAAM,OAAO,aAAa;AAAA,IAC9B,IAAI,MAAM,OAAO,cAAc;AAAA,IAC/B,IAAI,SAAS,OAAO,cAAc;AAAA,IAClC,eAAe;AAAA,IACf,OAAO;AAAA,IACP,OAAO,KAAK;AAAA,IACZ,YAAY,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,IAC9D,OAAO;AAAA;AAAA;AAIJ,SAAS,WAAW,GAAY;AAAA,EACrC,OAAO,QAAQ,MAAM;AAAA;AAGhB,SAAS,iBAAiB,GAAkB;AAAA,EACjD,IAAI;AAAA,IAAc,OAAO;AAAA,EACzB,QAAQ;AAAA,EACR,OAAO,YAAY,UAAU,UAAU;AAAA;AAGzC,SAAS,GAAG,GAAc;AAAA,EACxB,MAAM,IAAI,QAAQ;AAAA,EAClB,IAAI,CAAC,GAAG;AAAA,IACN,MAAM,IAAI,MACR,6BAA6B,WAAW,WAAW,uBACrD;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAoCT,SAAS,cAAc,CAAC,KAAqB;AAAA,EAC3C,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,YAAY,iBAAiB,GAAG;AAAA,EAEtC,MAAM,UAAU,UAAU,MAAM,cAAc;AAAA,EAC9C,IAAI,SAAS;AAAA,IACX,MAAM,OAAO,IAAI,QAAQ;AAAA,IACzB,MAAM,OAAO,EAAE,IAAI;AAAA,IACnB,IAAI,SAAS;AAAA,MAAW,OAAO;AAAA,EACjC;AAAA,EACA,MAAM,SAAS,iBAAiB;AAAA,EAChC,IAAI,WAAW,WAAW;AAAA,IACxB,MAAM,OAAO,EAAE,IAAI;AAAA,IACnB,IAAI,SAAS;AAAA,MAAW,OAAO;AAAA,EACjC;AAAA,EAEA,IAAI,IAAI,WAAW,GAAG;AAAA,IACpB,MAAM,QAAQ,IAAI,YAAY;AAAA,IAC9B,IAAI,EAAE,IAAI,WAAW;AAAA,MAAW,OAAO,EAAE,IAAI;AAAA,IAC7C,MAAM,YAAY,MAAM;AAAA,IACxB,IAAI,EAAE,IAAI,eAAe;AAAA,MAAW,OAAO,EAAE,IAAI;AAAA,EACnD;AAAA,EAEA,MAAM,MAAM,EAAE,IAAI;AAAA,EAClB,IAAI,QAAQ;AAAA,IAAW,OAAO;AAAA,EAC9B,MAAM,IAAI,MAAM,sCAAsC,MAAM;AAAA;AAG9D,SAAS,oBAAoB,CAAC,UAA4B;AAAA,EACxD,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,QAAQ,cAAc,SAAS,KAAK,EAAE,YAAY;AAAA,EACxD,IAAI,CAAC,OAAO;AAAA,IACV,MAAM,IAAI,MAAM,0BAA0B,WAAW;AAAA,EACvD;AAAA,EACA,OAAO,MAAM,IAAI,CAAC,SAAS;AAAA,IACzB,MAAM,OAAO,EAAE,IAAI;AAAA,IACnB,IAAI,SAAS,WAAW;AAAA,MACtB,MAAM,IAAI,MAAM,qCAAqC,OAAO;AAAA,IAC9D;AAAA,IACA,OAAO;AAAA,GACR;AAAA;AAKH,eAAsB,QAAQ,CAAC,GAAW,GAA0B;AAAA,EAClE,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,KAAK,YAAY,CAAC;AAAA,EACxB,MAAM,KAAK,YAAY,CAAC;AAAA,EACxB,MAAM,EAAE,MAAM,YAAY,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;AAAA,EAC7C,MAAM,EAAE,MAAM,MAAM,EAAE,OAAO,IAAI;AAAA;AAGnC,eAAsB,qBAAqB,CACzC,GACA,GACA,WACe;AAAA,EACf,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,KAAK,YAAY,CAAC;AAAA,EACxB,MAAM,KAAK,YAAY,CAAC;AAAA,EACxB,MAAM,WAAW,UAAU,QAAQ,CAAC,QAAQ,qBAAqB,GAAG,CAAC;AAAA,EACrE,MAAM,EAAE,MAAM,YAAY,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;AAAA,EAC7C,IAAI,SAAS,WAAW,GAAG;AAAA,IACzB,MAAM,EAAE,MAAM,MAAM,EAAE,OAAO,IAAI;AAAA,IACjC;AAAA,EACF;AAAA,EACA,MAAM,EAAE,SAAS,SAAS,GAAG,QAAQ;AAAA,EACrC,IAAI;AAAA,IACF,MAAM,EAAE,MAAM,MAAM,EAAE,OAAO,IAAI;AAAA,YACjC;AAAA,IACA,MAAM,EAAE,SAAS,WAAW,GAAG,SAAS,QAAQ,CAAC;AAAA;AAAA;AAIrD,eAAsB,cAAc,CAAC,GAAW,GAA0B;AAAA,EACxE,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,EAAE,MAAM,YAAY,IAAI,EAAE,MAAM,YAAY,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;AAAA,EACrE,MAAM,EAAE,MAAM,YAAY,EAAE,OAAO,IAAI;AAAA;AAGzC,eAAsB,aAAa,CAAC,GAAW,GAA0B;AAAA,EACvE,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,EAAE,MAAM,YAAY,IAAI,EAAE,MAAM,YAAY,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;AAAA,EACrE,MAAM,EAAE,MAAM,MAAM,EAAE,OAAO,KAAK;AAAA;AAGpC,eAAsB,YAAY,CAAC,GAAW,GAA0B;AAAA,EACtE,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,EAAE,MAAM,YAAY,IAAI,EAAE,MAAM,YAAY,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;AAAA;AAGvE,eAAsB,OAAO,CAC3B,IACA,IACA,IACA,IACe;AAAA,EACf,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,MAAM,YAAY,EAAE;AAAA,EAC1B,MAAM,MAAM,YAAY,EAAE;AAAA,EAC1B,MAAM,MAAM,YAAY,EAAE;AAAA,EAC1B,MAAM,MAAM,YAAY,EAAE;AAAA,EAC1B,MAAM,EAAE,MAAM,YAAY,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC;AAAA,EAC/C,MAAM,EAAE,MAAM,YAAY,EAAE,OAAO,IAAI;AAAA,EACvC,IAAI;AAAA,IACF,MAAM,EAAE,MAAM,KAAK,EAAE,WAAW,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC,CAAC;AAAA,YACtD;AAAA,IACA,MAAM,EAAE,MAAM,cAAc,EAAE,OAAO,IAAI;AAAA;AAAA;AAI7C,eAAsB,SAAS,CAC7B,GACA,GACA,WACA,QACe;AAAA,EACf,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,KAAK,YAAY,CAAC;AAAA,EACxB,MAAM,KAAK,YAAY,CAAC;AAAA,EACxB,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,YAAY,MAAM,GAAG,EAAE,CAAC;AAAA,EAC5D,MAAM,EAAE,MAAM,YAAY,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;AAAA,EAC7C,IAAI,cAAc;AAAA,IAAM,MAAM,EAAE,MAAM,SAAS,MAAM;AAAA,EAChD,SAAI,cAAc;AAAA,IAAQ,MAAM,EAAE,MAAM,WAAW,MAAM;AAAA,EACzD,SAAI,cAAc;AAAA,IAAQ,MAAM,EAAE,MAAM,WAAW,MAAM;AAAA,EACzD;AAAA,UAAM,EAAE,MAAM,YAAY,MAAM;AAAA;AAKvC,eAAsB,OAAO,CAAC,MAA6B;AAAA,EACzD,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,OAAO,aAAa,IAAI;AAAA,EAC9B,MAAM,EAAE,SAAS,KAAK,IAAI;AAAA;AAG5B,eAAsB,WAAW,CAAC,KAA4B;AAAA,EAC5D,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,OAAO,eAAe,GAAG;AAAA,EAC/B,MAAM,EAAE,SAAS,SAAS,IAAI;AAAA,EAC9B,MAAM,EAAE,SAAS,WAAW,IAAI;AAAA;AAGlC,eAAsB,WAAW,CAAC,OAA8B;AAAA,EAC9D,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,QAAQ,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,EAClD,MAAM,gBAA0B,CAAC;AAAA,EACjC,IAAI,UAAyB;AAAA,EAC7B,WAAW,QAAQ,OAAO;AAAA,IACxB,MAAM,QAAQ,KAAK,YAAY;AAAA,IAC/B,IAAI,cAAc,QAAQ;AAAA,MACxB,cAAc,KAAK,GAAG,qBAAqB,KAAK,CAAC;AAAA,IACnD,EAAO;AAAA,MACL,UAAU;AAAA;AAAA,EAEd;AAAA,EACA,IAAI,CAAC,SAAS;AAAA,IACZ,MAAM,IAAI,MAAM,UAAU,mDAAmD;AAAA,EAC/E;AAAA,EACA,MAAM,WAAW,eAAe,OAAO;AAAA,EACvC,IAAI,cAAc,SAAS,GAAG;AAAA,IAC5B,MAAM,EAAE,SAAS,SAAS,GAAG,aAAa;AAAA,EAC5C;AAAA,EACA,IAAI;AAAA,IACF,MAAM,EAAE,SAAS,SAAS,QAAQ;AAAA,IAClC,MAAM,EAAE,SAAS,WAAW,QAAQ;AAAA,YACpC;AAAA,IACA,IAAI,cAAc,SAAS,GAAG;AAAA,MAC5B,MAAM,EAAE,SAAS,WAAW,GAAG,cAAc,QAAQ,CAAC;AAAA,IACxD;AAAA;AAAA;AAMJ,eAAsB,oBAAoB,CACxC,QACiB;AAAA,EACjB,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,WAAW,qBAAqB,KAAK,IAAI;AAAA,EAC/C,MAAM,MAAM,QAAO;AAAA,EACnB,IAAI,eAAe;AAAA,EACnB,IAAI;AAAA,IACF,IAAI,QAAQ;AAAA,MACV,MAAM,IAAI;AAAA,QACR,MAAM,YAAY,OAAO,CAAC;AAAA,QAC1B,KAAK,YAAY,OAAO,CAAC;AAAA,QACzB,OAAO,YAAY,OAAO,KAAK;AAAA,QAC/B,QAAQ,YAAY,OAAO,MAAM;AAAA,MACnC;AAAA,MACA,eAAe,MAAM,EAAE,OAAO,cAC5B,UACA,GACA,EAAE,SAAS,KACX,GACF;AAAA,IACF,EAAO;AAAA,MACL,eAAe,MAAM,EAAE,OAAO,QAAQ,UAAU,EAAE,SAAS,KAAK,GAAG;AAAA;AAAA,IAErE,IAAI,CAAC;AAAA,MAAc,eAAe,MAAK,KAAK,QAAQ;AAAA,IACpD,OAAO,aAAa,YAAY;AAAA,YAChC;AAAA,IACA,IAAI,cAAc;AAAA,MAChB,IAAI;AAAA,QACF,WAAW,YAAY;AAAA,QACvB,MAAM;AAAA,IAGV;AAAA;AAAA;AAAA,IAvUE,iBA8CF,eAAiC,MACjC,YAA0B,MAsCxB,eAaA;AAAA;AAAA,EApGN;AAAA,EAEM,kBAAkB,eAAc,YAAY,GAAG;AAAA,EAqF/C,gBAA0C;AAAA,IAC9C,KAAK,CAAC,WAAW;AAAA,IACjB,SAAS,CAAC,WAAW;AAAA,IACrB,MAAM,CAAC,WAAW;AAAA,IAClB,OAAO,CAAC,WAAW;AAAA,IACnB,KAAK,CAAC,WAAW;AAAA,IACjB,MAAM,CAAC,aAAa;AAAA,IACpB,SAAS,CAAC,aAAa;AAAA,IACvB,KAAK,CAAC,SAAS;AAAA,IACf,QAAQ,CAAC,SAAS;AAAA,IAClB,OAAO,CAAC,WAAW;AAAA,EACrB;AAAA,EAEM,mBAA2C;AAAA,IAC/C,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,MAAM;AAAA,IACN,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA;;;AC7HA,qBAAS;AACT,yBAAS,6BAAc;AACvB,mBAAS;AACT,iBAAS;AAeF,SAAS,iBAAiB,CAAC,QAA+B;AAAA,EAC/D,MAAM,MAAK,gBAAgB;AAAA,EAC3B,MAAM,UAAU,MAAK,QAAO,GAAG,0BAA0B,KAAK,IAAI,OAAO;AAAA,EAEzE,IAAI;AAAA,IACF,IAAI,QAAO,UAAU;AAAA,MACnB,cAAc,SAAS,MAAM;AAAA,IAC/B,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,aAAa,SAAS,MAAM;AAAA,IAC9B,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,eAAe,SAAS,MAAM;AAAA,IAChC;AAAA,IAEA,MAAM,OAAO,cAAa,OAAO;AAAA,IACjC,IAAI,QAAO,YAAY,KAAK,WAAW,GAAG;AAAA,MACxC,MAAM,4BAA4B;AAAA,QAChC,gBAAgB;AAAA,QAChB,WAAW;AAAA,QACX,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,IAEA,IAAI;AAAA,MACF,YAAW,OAAO;AAAA,MAClB,MAAM;AAAA,IAGR,OAAO;AAAA,IACP,OAAO,KAAK;AAAA,IACZ,IAAI;AAAA,MACF,YAAW,OAAO;AAAA,MAClB,MAAM;AAAA,IAIR,IAAI,wBAAwB,GAAG,GAAG;AAAA,MAChC,MAAM;AAAA,IACR;AAAA,IAEA,MAAM,kBAAkB,8BAA8B,KAAK;AAAA,MACzD,gBAAgB;AAAA,MAChB,WAAW,SAAS,sBAAsB;AAAA,IAC5C,CAAC;AAAA,IACD,IAAI,iBAAiB;AAAA,MACnB,MAAM;AAAA,IACR;AAAA,IAEA,MAAM;AAAA;AAAA;AAMV,SAAS,aAAa,CAAC,SAAiB,QAA6B;AAAA,EACnE,IAAI;AAAA,IACF,IAAI,QAAQ;AAAA,MACV,iBACE,iBACA;AAAA,QACE,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,SAAS,OAAO;AAAA,QACpD;AAAA,QACA;AAAA,MACF,GACA,GACF;AAAA,IACF,EAAO;AAAA,MAEL,iBAAiB,iBAAiB,CAAC,MAAM,OAAO,GAAG,GAAK;AAAA;AAAA,IAE1D,OAAO,OAAO;AAAA,IACd,MAAM,kBAAkB,8BAA8B,OAAO;AAAA,MAC3D,gBAAgB;AAAA,MAChB,WAAW,SAAS,sBAAsB;AAAA,IAC5C,CAAC;AAAA,IACD,IAAI,iBAAiB;AAAA,MACnB,MAAM;AAAA,IACR;AAAA,IACA,MAAM;AAAA;AAAA;AAMV,SAAS,YAAY,CAAC,SAAiB,QAA6B;AAAA,EAElE,IAAI,cAAc,QAAQ,GAAG;AAAA,IAC3B,IAAI,QAAQ;AAAA,MACV,iBACE,UACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG,OAAO,SAAS,OAAO,UAAU,OAAO,KAAK,OAAO;AAAA,QACvD;AAAA,MACF,GACA,GACF;AAAA,IACF,EAAO;AAAA,MACL,iBAAiB,UAAU,CAAC,WAAW,QAAQ,OAAO,GAAG,GAAK;AAAA;AAAA,EAElE,EAAO,SAAI,cAAc,OAAO,GAAG;AAAA,IACjC,iBAAiB,SAAS,CAAC,OAAO,GAAG,GAAK;AAAA,EAC5C,EAAO,SAAI,cAAc,kBAAkB,GAAG;AAAA,IAC5C,iBAAiB,oBAAoB,CAAC,MAAM,OAAO,GAAG,GAAK;AAAA,EAC7D,EAAO;AAAA,IACL,MAAM,IAAI,MACR,yFACF;AAAA;AAAA;AAMJ,SAAS,cAAc,CAAC,SAAiB,SAA8B;AAAA,EACrE,MAAM,cAAc,QAAQ,QAAQ,OAAO,IAAI;AAAA,EAC/C,MAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EAEX,UAAS,wBAAwB,UAAU;AAAA,IACzC,SAAS;AAAA,IACT,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,EAClC,CAAC;AAAA;AAAA,IAzIG,qCACJ;AAAA;AAAA,EARF;AAAA;;;AC+BO,SAAS,cAAc,GAAe;AAAA,EAC3C,MAAM,aAAa,QAAQ,IAAI,4BAA4B,SACxD,KAAK,EACL,YAAY;AAAA,EACf,IAAI,cAAc;AAAA,IAAU,OAAO;AAAA,EACnC,IAAI,cAAc,SAAS;AAAA,IACzB,IAAI,CAAC,QAAQ;AAAA,MAEX,QAAQ,KACN,kDAAkD,oCACpD;AAAA,MACA,SAAS;AAAA,IACX;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,IAAI,CAAC,YAAa,GAAG;AAAA,IACnB,IAAI,CAAC,QAAQ;AAAA,MAEX,QAAQ,KACN,2CAA2C,kBAAkB,2CAC/D;AAAA,MACA,SAAS;AAAA,IACX;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA;AAKT,eAAsB,WAAW,CAAC,GAAW,GAA0B;AAAA,EACrE,IAAI,eAAe,MAAM;AAAA,IAAS,OAAO,SAAS,GAAG,CAAC;AAAA,EACtD,aAAa,GAAG,CAAC;AAAA;AAGnB,eAAsB,wBAAwB,CAC5C,GACA,GACA,WACe;AAAA,EACf,IAAI,eAAe,MAAM;AAAA,IAAS,OAAO,sBAAsB,GAAG,GAAG,SAAS;AAAA,EAC9E,0BAA0B,GAAG,GAAG,SAAS;AAAA;AAG3C,eAAsB,iBAAiB,CAAC,GAAW,GAA0B;AAAA,EAC3E,IAAI,eAAe,MAAM;AAAA,IAAS,OAAO,eAAe,GAAG,CAAC;AAAA,EAC5D,mBAAmB,GAAG,CAAC;AAAA;AAGzB,eAAsB,gBAAgB,CAAC,GAAW,GAA0B;AAAA,EAC1E,IAAI,eAAe,MAAM;AAAA,IAAS,OAAO,cAAc,GAAG,CAAC;AAAA,EAC3D,kBAAkB,GAAG,CAAC;AAAA;AAGxB,eAAsB,eAAe,CAAC,GAAW,GAA0B;AAAA,EACzE,IAAI,eAAe,MAAM;AAAA,IAAS,OAAO,aAAa,GAAG,CAAC;AAAA,EAC1D,iBAAiB,GAAG,CAAC;AAAA;AAGvB,eAAsB,UAAU,CAC9B,IACA,IACA,IACA,IACe;AAAA,EACf,IAAI,eAAe,MAAM;AAAA,IAAS,OAAO,QAAQ,IAAI,IAAI,IAAI,EAAE;AAAA,EAC/D,YAAY,IAAI,IAAI,IAAI,EAAE;AAAA;AAG5B,eAAsB,YAAY,CAChC,GACA,GACA,WACA,SAAS,GACM;AAAA,EACf,IAAI,eAAe,MAAM;AAAA,IAAS,OAAO,UAAU,GAAG,GAAG,WAAW,MAAM;AAAA,EAC1E,cAAc,GAAG,GAAG,WAAW,MAAM;AAAA;AAKvC,eAAsB,UAAU,CAAC,MAA6B;AAAA,EAC5D,IAAI,eAAe,MAAM;AAAA,IAAS,OAAO,QAAQ,IAAI;AAAA,EACrD,YAAY,IAAI;AAAA;AAGlB,eAAsB,cAAc,CAAC,KAA4B;AAAA,EAC/D,IAAI,eAAe,MAAM;AAAA,IAAS,OAAO,YAAY,GAAG;AAAA,EACxD,gBAAgB,GAAG;AAAA;AAGrB,eAAsB,cAAc,CAAC,OAA8B;AAAA,EACjE,IAAI,eAAe,MAAM;AAAA,IAAS,OAAO,YAAY,KAAK;AAAA,EAC1D,gBAAgB,KAAK;AAAA;AAKvB,eAAsB,uBAAuB,CAC3C,QACiB;AAAA,EACjB,IAAI,eAAe,MAAM,SAAS;AAAA,IAChC,IAAI;AAAA,MACF,OAAO,MAAM,qBAAqB,MAAM;AAAA,MACxC,MAAM;AAAA,MACN,OAAO,kBAAwB,MAAM;AAAA;AAAA,EAEzC;AAAA,EACA,OAAO,kBAAwB,MAAM;AAAA;AAAA,IA9GnC,SAAS;AAAA;AAAA,EA/Bb;AAAA,EAYA;AAAA,EAeA;AAAA;;;ACzCA;AACA;AACA;AAsJO,SAAS,gBAAgB,CAC9B,UACA,WACsB;AAAA,EACtB,IAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAAA,IAC7C,OAAO,EAAE,SAAS,OAAO,QAAQ,yBAAyB;AAAA,EAC5D;AAAA,EAEA,IAAI,SAAS,SAAS,MAAI,GAAG;AAAA,IAC3B,OAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,IAAI,WAAW,MAAK,QAAQ,QAAQ;AAAA,EACpC,IAAI,SAAS,WAAW,MAAM,GAAG;AAAA,IAC/B,OAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,IAAI,QAAQ,aAAa,WAAW,MAAM,KAAK,QAAQ,GAAG;AAAA,IACxD,IAAI;AAAA,MACF,MAAM,WAAW,IAAG,aAAa,OAAO,QAAQ;AAAA,MAChD,IAAI,aAAa,UAAU;AAAA,QACzB,WAAW;AAAA,MACb;AAAA,MACA,MAAM;AAAA,EAGV;AAAA,EAEA,MAAM,aAAa,SAAS,QAAQ,OAAO,GAAG;AAAA,EAE9C,IAAI,QAAQ,aAAa,WAAW,cAAc,QAAQ;AAAA,IACxD,MAAM,WAAW,MAAK,SAAS,QAAQ;AAAA,IACvC,IAAI,oBAAoB,KAAK,QAAQ,GAAG;AAAA,MACtC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,aAAa;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,IAAG,QAAQ,EAAE,QAAQ,OAAO,GAAG;AAAA,EAC5C,MAAM,iBAAiB,WAAW,WAAW,GAAG,OAAO,IACnD,WAAW,MAAM,KAAK,MAAM,IAC5B;AAAA,EACJ,IAAI,gBAAgB;AAAA,IAClB,aAAa,SAAS,WAAW,qBAAqB;AAAA,MACpD,IAAI,QAAQ,KAAK,cAAc,GAAG;AAAA,QAChC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ,aAAa,MAAK,SAAS,QAAQ,WAAW;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,cAAc,QAAQ;AAAA,IACxB,MAAM,WACJ,QAAQ,aAAa,UACjB,4BACA;AAAA,IAEN,aAAa,SAAS,WAAW,UAAU;AAAA,MACzC,IAAI,QAAQ,KAAK,UAAU,GAAG;AAAA,QAC5B,OAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ,mBAAmB,gBAAgB;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI,eAAe,KAAK,UAAU,KAAK,eAAe,KAAK;AAAA,MACzD,OAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,mBAAmB;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,EAAE,SAAS,KAAK;AAAA;AAGlB,SAAS,gBAAgB,GAAuC;AAAA,EACrE,MAAM,MAAM,KAAK,QAAQ,IAAI;AAAA,EAC7B,WAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAAA,IAClC,IAAI,gBAAgB,IAAI,GAAG,GAAG;AAAA,MAC5B,OAAO,IAAI;AAAA,MACX;AAAA,IACF;AAAA,IACA,WAAW,WAAW,mBAAmB;AAAA,MACvC,IAAI,QAAQ,KAAK,GAAG,GAAG;AAAA,QACrB,OAAO,IAAI;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,qBAAqB,CAAC,SAAoC;AAAA,EACxE,IAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAAA,IAC3C,OAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AAAA,EAEA,MAAM,UAAU,QAAQ,KAAK;AAAA,EAC7B,aAAa,SAAS,YAAY,4BAA4B;AAAA,IAC5D,IAAI,QAAQ,KAAK,OAAO,GAAG;AAAA,MACzB,OAAO;AAAA,QACL,SAAS;AAAA,QACT,QACE,oBAAoB;AAAA,IACpB;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,EAAE,SAAS,MAAM;AAAA;AAAA,IAzPpB,qBAkCA,2BAUA,0BAmBA,qBAEA,iBAUA,mBAOA;AAAA;AAAA,EAlFA,sBAAyC;AAAA,IAC7C;AAAA,MACE,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,EAAE,SAAS,iBAAiB,OAAO,cAAc;AAAA,IACjD,EAAE,SAAS,2BAA2B,OAAO,kBAAkB;AAAA,IAC/D;AAAA,MACE,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,EAAE,SAAS,+BAA+B,OAAO,qBAAqB;AAAA,IACtE,EAAE,SAAS,uBAAuB,OAAO,oBAAoB;AAAA,IAC7D,EAAE,SAAS,gBAAgB,OAAO,oBAAoB;AAAA,IACtD,EAAE,SAAS,gBAAgB,OAAO,kBAAkB;AAAA,IACpD,EAAE,SAAS,0BAA0B,OAAO,yBAAyB;AAAA,IACrE,EAAE,SAAS,4BAA4B,OAAO,iBAAiB;AAAA,IAC/D;AAAA,MACE,SACE;AAAA,MACF,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,SACE;AAAA,MACF,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,SACE;AAAA,MACF,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEM,4BAA+C;AAAA,IACnD,EAAE,SAAS,uBAAuB,OAAO,2BAA2B;AAAA,IACpE,EAAE,SAAS,2BAA2B,OAAO,0BAA0B;AAAA,IACvE,EAAE,SAAS,2BAA2B,OAAO,wBAAwB;AAAA,IACrE;AAAA,MACE,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEM,2BAA8C;AAAA,IAClD,EAAE,SAAS,cAAc,OAAO,iBAAiB;AAAA,IACjD,EAAE,SAAS,cAAc,OAAO,0BAA0B;AAAA,IAC1D,EAAE,SAAS,mBAAmB,OAAO,gCAAgC;AAAA,IACrE,EAAE,SAAS,kBAAkB,OAAO,2BAA2B;AAAA,IAC/D;AAAA,MACE,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,EAAE,SAAS,gBAAgB,OAAO,yBAAyB;AAAA,IAC3D;AAAA,MACE,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,EAAE,SAAS,aAAa,OAAO,cAAc;AAAA,IAC7C,EAAE,SAAS,cAAc,OAAO,kBAAkB;AAAA,IAClD,EAAE,SAAS,aAAa,OAAO,iBAAiB;AAAA,EAClD;AAAA,EAEM,sBAAsB;AAAA,EAEtB,kBAAkB,IAAI,IAAI;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EAEK,oBAA8B;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEM,6BAAiD;AAAA,IACrD;AAAA,MACE,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,SACE;AAAA,MACF,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,SACE;AAAA,MACF,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,SACE;AAAA,MACF,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAAA;;;ACtJA;AACA;AAIA,eAAsB,QAAQ,CAC5B,YACA,WAA2B,QACA;AAAA,EAC3B,MAAM,QAAQ,iBAAiB,YAAY,MAAM;AAAA,EACjD,IAAI,CAAC,MAAM,SAAS;AAAA,IAClB,OAAO,EAAE,SAAS,OAAO,OAAO,MAAM,OAAO;AAAA,EAC/C;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,UAAU,MAAM,IAAG,SAAS,YAAY,EAAE,SAAS,CAAC;AAAA,IAC1D,OAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS,OAAO,OAAO,EAAE,MAAM,GAAG,GAAK;AAAA,IACzC;AAAA,IACA,OAAO,OAAO;AAAA,IACd,OAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA;AAAA;AAIJ,eAAsB,SAAS,CAC7B,YACA,SAC2B;AAAA,EAC3B,MAAM,QAAQ,iBAAiB,YAAY,OAAO;AAAA,EAClD,IAAI,CAAC,MAAM,SAAS;AAAA,IAClB,OAAO,EAAE,SAAS,OAAO,OAAO,MAAM,OAAO;AAAA,EAC/C;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,IAAG,MAAM,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAC5D,MAAM,IAAG,UAAU,YAAY,SAAS,MAAM;AAAA,IAC9C,OAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,OAAO,OAAO;AAAA,IACd,OAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA;AAAA;AAIJ,eAAsB,QAAQ,CAC5B,YACA,SACA,SAC2B;AAAA,EAC3B,MAAM,QAAQ,iBAAiB,YAAY,OAAO;AAAA,EAClD,IAAI,CAAC,MAAM,SAAS;AAAA,IAClB,OAAO,EAAE,SAAS,OAAO,OAAO,MAAM,OAAO;AAAA,EAC/C;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,UAAU,MAAM,IAAG,SAAS,YAAY,MAAM;AAAA,IACpD,IAAI,CAAC,QAAQ,SAAS,OAAO,GAAG;AAAA,MAC9B,OAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,MAAM,IAAG,UAAU,YAAY,QAAQ,QAAQ,SAAS,OAAO,GAAG,MAAM;AAAA,IACxE,OAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,OAAO,OAAO;AAAA,IACd,OAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA;AAAA;AAIJ,eAAsB,UAAU,CAC9B,YACA,SAC2B;AAAA,EAC3B,MAAM,QAAQ,iBAAiB,YAAY,OAAO;AAAA,EAClD,IAAI,CAAC,MAAM,SAAS;AAAA,IAClB,OAAO,EAAE,SAAS,OAAO,OAAO,MAAM,OAAO;AAAA,EAC/C;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,IAAG,MAAM,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAC5D,MAAM,IAAG,WAAW,YAAY,SAAS,MAAM;AAAA,IAC/C,OAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,OAAO,OAAO;AAAA,IACd,OAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA;AAAA;AAIJ,eAAsB,UAAU,CAC9B,YAC2B;AAAA,EAC3B,MAAM,QAAQ,iBAAiB,YAAY,QAAQ;AAAA,EACnD,IAAI,CAAC,MAAM,SAAS;AAAA,IAClB,OAAO,EAAE,SAAS,OAAO,OAAO,MAAM,OAAO;AAAA,EAC/C;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,IAAG,OAAO,UAAU;AAAA,IAC1B,OAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,OAAO,OAAO;AAAA,IACd,OAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA;AAAA;AAIJ,eAAsB,UAAU,CAC9B,YAC2B;AAAA,EAC3B,IAAI;AAAA,IACF,MAAM,IAAG,OAAO,UAAU;AAAA,IAC1B,MAAM,OAAO,MAAM,IAAG,KAAK,UAAU;AAAA,IACrC,OAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,KAAK,OAAO;AAAA,MACpB,aAAa,KAAK,YAAY;AAAA,MAC9B,SAAS,KAAK,OAAO;AAAA,MACrB,cAAc,KAAK,YAAY;AAAA,MAC/B,MAAM,KAAK;AAAA,IACb;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,SAAS;AAAA,MACT,cAAc;AAAA,MACd,MAAM;AAAA,IACR;AAAA;AAAA;AAIJ,eAAsB,aAAa,CACjC,YAC2B;AAAA,EAC3B,MAAM,QAAQ,iBAAiB,YAAY,MAAM;AAAA,EACjD,IAAI,CAAC,MAAM,SAAS;AAAA,IAClB,OAAO,EAAE,SAAS,OAAO,OAAO,MAAM,OAAO;AAAA,EAC/C;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,UAAU,MAAM,IAAG,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AAAA,IACpE,MAAM,QAAqB,QAAQ,IAAI,CAAC,WAAW;AAAA,MACjD,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM,YAAY,IAAI,cAAc;AAAA,MAC1C,MAAM,MAAK,KAAK,YAAY,MAAM,IAAI;AAAA,IACxC,EAAE;AAAA,IACF,OAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN;AAAA,MACA,OAAO,MAAM;AAAA,IACf;AAAA,IACA,OAAO,OAAO;AAAA,IACd,OAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA;AAAA;AAIJ,eAAsB,eAAe,CACnC,YAC2B;AAAA,EAC3B,MAAM,QAAQ,iBAAiB,YAAY,QAAQ;AAAA,EACnD,IAAI,CAAC,MAAM,SAAS;AAAA,IAClB,OAAO,EAAE,SAAS,OAAO,OAAO,MAAM,OAAO;AAAA,EAC/C;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,IAAG,GAAG,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACxD,OAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,OAAO,OAAO;AAAA,IACd,OAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA;AAAA;AAAA;AAAA,EAjNJ;AAAA;;;ACHA;AACA;AAeA,SAAS,cAAc,CAAC,QAAwB;AAAA,EAC9C,OAAO,OAAO,MAAM,GAAG,IAAI;AAAA;AAG7B,SAAS,YAAY,GAGnB;AAAA,EACA,IAAI,QAAQ,aAAa,SAAS;AAAA,IAChC,OAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,CAAC,YAAY,CAAC,cAAc,YAAY,OAAO;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,CAAC,YAAY,CAAC,MAAM,OAAO;AAAA,EACtC;AAAA;AAGK,SAAS,eAAe,CAC7B,KACsB;AAAA,EACtB,MAAM,MAAM,OAAO,QAAQ,WAAW,MAAM,KAAK;AAAA,EACjD,MAAM,YAAY,QAAQ,EAAE;AAAA,EAC5B,MAAM,aAAa,OAAO,IAAG,QAAQ;AAAA,EACrC,SAAS,IAAI,WAAW;AAAA,IACtB,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,WAAW,IAAI,KAAK,EAAE,YAAY;AAAA,EACpC,CAAC;AAAA,EACD,OAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,SAAS,oBAAoB;AAAA,EAC/B;AAAA;AAGF,eAAsB,eAAe,CAAC,QAKJ;AAAA,EAChC,MAAM,OAAO,sBAAsB,OAAO,OAAO;AAAA,EACjD,IAAI,KAAK,SAAS;AAAA,IAChB,OAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,aAAa;AAAA,EAC3B,MAAM,cACH,OAAO,YAAY,SAAS,IAAI,OAAO,SAAS,GAAG,MAAM,cAC1D,OAAO,OACP,IAAG,QAAQ;AAAA,EACb,MAAM,iBAAiB,OAAO,kBAAkB;AAAA,EAEhD,OAAO,MAAM,IAAI,QAA8B,CAAC,YAAY;AAAA,IAC1D,MAAM,QAAQ,SACZ,MAAM,SACN,MAAM,QAAQ,OAAO,OAAO,GAC5B;AAAA,MACE,KAAK;AAAA,MACL,SAAS,iBAAiB;AAAA,MAC1B,WAAW,OAAO;AAAA,MAClB,KAAK,iBAAiB;AAAA,IACxB,GACA,CAAC,OAAO,QAAQ,WAAW;AAAA,MACzB,MAAM,SAAS,eACb,GAAG,SAAS,SAAS;AAAA,EAAK,WAAW,IACvC;AAAA,MACA,mBAAmB;AAAA,MACnB,IAAI,OAAO,WAAW;AAAA,QACpB,MAAM,WAAW,SAAS,IAAI,OAAO,SAAS;AAAA,QAC9C,IAAI,UAAU;AAAA,UACZ,SAAS,aAAa;AAAA,QACxB;AAAA,MACF;AAAA,MACA,IAAI,CAAC,OAAO;AAAA,QACV,QAAQ;AAAA,UACN,SAAS;AAAA,UACT;AAAA,UACA,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK;AAAA,UACL,WAAW,OAAO;AAAA,UAClB,YAAY,OAAO;AAAA,QACrB,CAAC;AAAA,QACD;AAAA,MACF;AAAA,MAEA,MAAM,WACJ,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,MAAM,SAAS,KAAK;AAAA,MACpE,QAAQ;AAAA,QACN,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,KAAK;AAAA,QACL,WAAW,OAAO;AAAA,QAClB,YAAY,OAAO;AAAA,QACnB,OAAO,MAAM;AAAA,MACf,CAAC;AAAA,KAEL;AAAA,IAEA,MAAM,YAAY,WAChB,MAAM;AAAA,MACJ,MAAM,KAAK,SAAS;AAAA,MACpB,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,WAAW;AAAA,QACX,KAAK;AAAA,QACL,WAAW,OAAO;AAAA,QAClB,YAAY,OAAO;AAAA,QACnB,OAAO,2BAA2B;AAAA,MACpC,CAAC;AAAA,QAEF,iBAAiB,KAAK,IACzB;AAAA,IAEA,MAAM,KAAK,QAAQ,MAAM;AAAA,MACvB,aAAa,SAAS;AAAA,KACvB;AAAA,GACF;AAAA;AAGI,SAAS,YAAY,CAC1B,KACsB;AAAA,EACtB,MAAM,YACJ,OAAO,QAAQ,WAAW,MAAO,KAAK,cAAc,KAAK;AAAA,EAC3D,MAAM,UACH,YAAY,SAAS,IAAI,SAAS,GAAG,aAAa,cACnD;AAAA,EACF,OAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA,SAAS,OAAO,SAAS,IAAI,YAAY;AAAA,EAC3C;AAAA;AAGK,SAAS,YAAY,CAC1B,KACsB;AAAA,EACtB,MAAM,OAAO,OAAO,QAAQ,WAAW,MAAM,IAAI;AAAA,EACjD,MAAM,YACJ,OAAO,QAAQ,WAAW,YAAa,IAAI,cAAc,IAAI;AAAA,EAC/D,OAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,SAAS,yBAAyB,KAAK,MAAM,GAAG,EAAE;AAAA,EACpD;AAAA;AAGK,SAAS,aAAa,CAC3B,KACsB;AAAA,EACtB,MAAM,YACJ,OAAO,QAAQ,WAAW,MAAO,KAAK,cAAc,KAAK;AAAA,EAC3D,OAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,SAAS;AAAA,EACX;AAAA;AAGK,SAAS,aAAa,CAC3B,KACsB;AAAA,EACtB,MAAM,YACJ,OAAO,QAAQ,WAAW,MAAO,KAAK,cAAc,KAAK;AAAA,EAC3D,IAAI,WAAW;AAAA,IACb,SAAS,OAAO,SAAS;AAAA,EAC3B,EAAO;AAAA,IACL,SAAS,MAAM;AAAA;AAAA,EAGjB,OAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,SAAS,oBAAoB,aAAa;AAAA,EAC5C;AAAA;AAGK,SAAS,wBAAwB,GAAS;AAAA,EAC/C,SAAS,MAAM;AAAA;AAAA,IA5MX,UACF,iBAAiB,GACjB,mBAAmB;AAAA;AAAA,EAXvB;AAAA,EASM,WAAW,IAAI;AAAA;;;ACJrB,qBAAS;AAWT,SAAS,uBAAuB,CAAC,OAAuB;AAAA,EACtD,OAAO,MAAM,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,MAAK;AAAA;AAGzD,SAAS,oBAAoB,CAAC,OAAuB;AAAA,EACnD,OAAO,MAAM,KAAK,EAAE,YAAY;AAAA;AAGlC,SAAS,kBAAkB,CAAC,KAAiB,OAAwB;AAAA,EACnE,MAAM,aAAa,qBAAqB,KAAK;AAAA,EAC7C,IAAI,CAAC;AAAA,IAAY,OAAO;AAAA,EAExB,OAAO,CAAC,IAAI,IAAI,IAAI,OAAO,IAAI,GAAG,EAAE,KAAK,CAAC,UACxC,qBAAqB,KAAK,EAAE,SAAS,UAAU,CACjD;AAAA;AAGK,SAAS,kBAAkB,CAChC,OACA,UAAwB,YAAY,GACtB;AAAA,EACd,MAAM,aAAa,qBAAqB,KAAK;AAAA,EAC7C,IAAI,CAAC;AAAA,IAAY,OAAO,CAAC;AAAA,EAEzB,MAAM,QAAQ,QAAQ,OACpB,CAAC,QAAQ,qBAAqB,IAAI,EAAE,MAAM,UAC5C;AAAA,EACA,IAAI,MAAM,SAAS;AAAA,IAAG,OAAO;AAAA,EAE7B,OAAO,QAAQ,OAAO,CAAC,QAAQ,mBAAmB,KAAK,UAAU,CAAC;AAAA;AAGpE,SAAS,mBAAmB,CAAC,WAAsC;AAAA,EACjE,MAAM,UAAU,mBAAmB,SAAS;AAAA,EAC5C,OAAO,QAAQ,MAAM;AAAA;AAGvB,SAAS,0BAA0B,CAAC,WAA+B;AAAA,EACjE,MAAM,SAAS,oBAAoB,SAAS;AAAA,EAC5C,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,IAAI,MAAM,qBAAqB,WAAW;AAAA,EAClD;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,sBAAsB,CAAC,WAA2B;AAAA,EACzD,MAAM,SAAS,oBAAoB,SAAS;AAAA,EAC5C,OAAO,iBAAiB,QAAQ,MAAM,SAAS;AAAA;AAUjD,SAAS,2BAA2B,CAAC,QAA8B;AAAA,EACjE,OAAO,CAAC,OAAO,IAAI,OAAO,OAAO,OAAO,GAAG,EACxC,IAAI,CAAC,UAAU,qBAAqB,KAAK,CAAC,EAC1C,OAAO,CAAC,UAAU,MAAM,SAAS,KAAK,UAAU,SAAS;AAAA;AAG9D,SAAS,qBAAqB,CAAC,QAAoB,MAAoB;AAAA,EACrE,MAAM,QAAQ,4BAA4B,MAAM;AAAA,EAChD,MAAM,WACJ,MAAM,SAAS,IACX,IAAI,MAAM,IAAI,CAAC,SAAS,IAAI,wBAAwB,IAAI,IAAI,EAAE,KAAK,IAAI,OACvE;AAAA,EACN,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAMiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCASI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAUtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,WAAW,aAAa,CAAC,MAAM,MAAM,GAAG,IAAI;AAAA;AAKvC,SAAS,WAAW,GAAiB;AAAA,EAC1C,MAAM,MAAK,gBAAgB;AAAA,EAE3B,IAAI,QAAO,UAAU;AAAA,IACnB,OAAO,kBAAkB;AAAA,EAC3B;AAAA,EACA,IAAI,QAAO,SAAS;AAAA,IAClB,OAAO,iBAAiB;AAAA,EAC1B;AAAA,EACA,IAAI,QAAO,SAAS;AAAA,IAClB,OAAO,mBAAmB;AAAA,EAC5B;AAAA,EACA,OAAO,CAAC;AAAA;AAGV,SAAS,iBAAiB,GAAiB;AAAA,EACzC,IAAI;AAAA,IACF,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYf,MAAM,SAAS,UAAS,iBAAiB,WAAW;AAAA,MAClD,UAAU;AAAA,MACV,SAAS;AAAA,MACT,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,IACpC,CAAC;AAAA,IACD,OAAO,OACJ,MAAM,IAAI,EACV,OAAO,OAAO,EACd,IAAI,CAAC,UAAU;AAAA,MACd,MAAM,QAAQ,MAAM,MAAM,KAAK;AAAA,MAC/B,OAAO;AAAA,QACL,KAAK,MAAM,MAAM;AAAA,QACjB,OAAO,MAAM,MAAM;AAAA,QACnB,IAAI,MAAM,MAAM;AAAA,MAClB;AAAA,KACD;AAAA,IACH,MAAM;AAAA,IACN,OAAO,CAAC;AAAA;AAAA;AAIZ,SAAS,gBAAgB,GAAiB;AAAA,EACxC,IAAI;AAAA,IACF,IAAI,cAAc,QAAQ,GAAG;AAAA,MAC3B,MAAM,UAAS,UAAS,aAAa;AAAA,QACnC,UAAU;AAAA,QACV,SAAS;AAAA,MACX,CAAC;AAAA,MACD,OAAO,QACJ,MAAM;AAAA,CAAI,EACV,OAAO,OAAO,EACd,IAAI,CAAC,SAAS;AAAA,QAEb,MAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK;AAAA,QACrC,MAAM,KAAK,MAAM,MAAM;AAAA,QACvB,MAAM,QAAQ,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK;AAAA,QAC1C,OAAO,EAAE,IAAI,OAAO,KAAK,UAAU;AAAA,OACpC;AAAA,IACL;AAAA,IACA,MAAM,SAAS,UACb,8DACA,EAAE,UAAU,SAAS,SAAS,KAAK,CACrC;AAAA,IACA,OAAO,OACJ,MAAM;AAAA,CAAI,EACV,OAAO,OAAO,EACd,IAAI,CAAC,MAAM,OAAO;AAAA,MACjB,IAAI,OAAO,CAAC;AAAA,MACZ,OAAO,KAAK,KAAK;AAAA,MACjB,KAAK;AAAA,IACP,EAAE;AAAA,IACJ,MAAM;AAAA,IACN,OAAO,CAAC;AAAA;AAAA;AAIZ,SAAS,kBAAkB,GAAiB;AAAA,EAC1C,IAAI;AAAA,IACF,MAAM,SAAS,UACb,8HACA,EAAE,UAAU,SAAS,SAAS,IAAM,CACtC;AAAA,IACA,MAAM,SAAS,KAAK,MAAM,MAAM;AAAA,IAChC,MAAM,OAAO,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAAA,IACrD,OAAO,KAAK,IAAI,CAAC,OAAgD;AAAA,MAC/D,IAAI,OAAO,EAAE,EAAE;AAAA,MACf,OAAO,EAAE;AAAA,MACT,KAAK;AAAA,IACP,EAAE;AAAA,IACF,MAAM;AAAA,IACN,OAAO,CAAC;AAAA;AAAA;AAML,SAAS,WAAW,CAAC,UAAwB;AAAA,EAClD,MAAM,MAAK,gBAAgB;AAAA,EAC3B,MAAM,SAAS,oBAAoB,QAAQ;AAAA,EAE3C,IAAI,QAAO,UAAU;AAAA,IACnB,MAAM,gBAAgB,UAAU,2BAA2B,QAAQ;AAAA,IACnE,IAAI;AAAA,MACF,sBAAsB,eAAe,+BAA+B;AAAA,MACpE,MAAM;AAAA,MACN,WACE,aACA;AAAA,QACE;AAAA,QACA,qBAAqB,wBAAwB,cAAc,GAAG;AAAA,MAChE,GACA,IACF;AAAA;AAAA,EAEJ,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,MAAM,YAAY,uBAAuB,QAAQ;AAAA,IACjD,IAAI,cAAc,QAAQ,GAAG;AAAA,MAC3B,WAAW,UAAU,CAAC,MAAM,MAAM,SAAS,GAAG,IAAI;AAAA,IACpD,EAAO,SAAI,cAAc,SAAS,GAAG;AAAA,MACnC,WAAW,WAAW,CAAC,kBAAkB,SAAS,GAAG,IAAI;AAAA,IAC3D,EAAO;AAAA,MACL,MAAM,IAAI,MAAM,kDAAkD;AAAA;AAAA,EAEtE,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,MAAM,YAAY,uBAAuB,QAAQ;AAAA,IACjD,MAAM,KAAK;AAAA;AAAA,gCAEiB;AAAA,mDACmB;AAAA;AAAA;AAAA,IAG/C,WAAW,cAAc,CAAC,YAAY,EAAE,GAAG,IAAI;AAAA,EACjD;AAAA;AAGK,SAAS,YAAY,CAAC,aAA2B;AAAA,EACtD,YAAY,WAAW;AAAA;AAGzB,SAAS,eAAe,CACtB,UACA,GACA,GACA,OACA,QACM;AAAA,EACN,MAAM,QAAQ,YAAY,CAAC;AAAA,EAC3B,MAAM,QAAQ,YAAY,CAAC;AAAA,EAC3B,MAAM,YACJ,UAAU,YAAY,YAAY,KAAK,IAAI,GAAG,YAAY,KAAK,CAAC;AAAA,EAClE,MAAM,aACJ,WAAW,YAAY,YAAY,KAAK,IAAI,GAAG,YAAY,MAAM,CAAC;AAAA,EACpE,MAAM,MAAK,gBAAgB;AAAA,EAE3B,IAAI,QAAO,UAAU;AAAA,IACnB,MAAM,SAAS,2BAA2B,QAAQ;AAAA,IAClD,sBACE,QACA;AAAA,qDAC+C,UAAU;AAAA,gBAE/C,cAAc,aAAa,eAAe,YACtC,oCAAoC,cAAc,gBAClD,IAEhB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,uBAAuB,QAAQ;AAAA,EACjD,IAAI,QAAO,SAAS;AAAA,IAClB,IAAI,cAAc,QAAQ,GAAG;AAAA,MAC3B,WACE,UACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK,SAAS,SAAS,aAAa,MAAM,cAAc;AAAA,MAC1D,GACA,IACF;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,cAAc,SAAS,GAAG;AAAA,MAC5B,WACE,WACA,CAAC,cAAc,WAAW,OAAO,KAAK,GAAG,OAAO,KAAK,CAAC,GACtD,IACF;AAAA,MACA,IAAI,cAAc,aAAa,eAAe,WAAW;AAAA,QACvD,WACE,WACA,CAAC,cAAc,WAAW,OAAO,SAAS,GAAG,OAAO,UAAU,CAAC,GAC/D,IACF;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,MAAM,aACJ,cAAc,aAAa,eAAe,YAAY,WAAW;AAAA,IACnE,MAAM,WAAW,aAAa;AAAA,IAC9B,MAAM,YAAY,cAAc;AAAA,IAChC,MAAM,KAAK;AAAA;AAAA,gCAEiB;AAAA,mDACmB;AAAA,4EACyB,UAAU,UAAU,aAAa,cAAc;AAAA;AAAA,IAEvH,WAAW,cAAc,CAAC,YAAY,EAAE,GAAG,IAAI;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,MAAM,mCAAmC,KAAI;AAAA;AAGlD,SAAS,cAAc,CAAC,cAAc,QAG3C;AAAA,EACA,MAAM,UAAU,YAAY;AAAA,EAC5B,IAAI,QAAQ,WAAW,GAAG;AAAA,IACxB,OAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,cAAc;AAAA,EAC7B,MAAM,aAAa,YAAY,KAAK,EAAE,YAAY;AAAA,EAClD,MAAM,QAAQ,QAAQ;AAAA,EACtB,MAAM,gBAAgB;AAAA,EAEtB,QAAQ,QAAQ,CAAC,YAAY,UAAU;AAAA,IACrC,IAAI,eAAe,WAAW;AAAA,MAC5B,MAAM,SAAQ,KAAK,IAAI,KAAK,KAAK,MAAM,OAAO,QAAQ,IAAI,CAAC;AAAA,MAC3D,MAAM,UAAS,KAAK,IAAI,KAAK,KAAK,MAAM,OAAO,SAAS,IAAI,CAAC;AAAA,MAC7D,MAAM,aAAa,KAAK,IAAI,GAAG,OAAO,QAAQ,MAAK;AAAA,MACnD,MAAM,aAAa,KAAK,IAAI,GAAG,OAAO,SAAS,OAAM;AAAA,MACrD,gBACE,WAAW,IACX,KAAK,IAAI,QAAQ,eAAe,UAAU,GAC1C,KAAK,IAAI,QAAQ,eAAe,UAAU,GAC1C,QACA,OACF;AAAA,MACA;AAAA,IACF;AAAA,IAEA,IAAI,eAAe,YAAY;AAAA,MAC7B,MAAM,SAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,QAAQ,KAAK,CAAC;AAAA,MAC1D,gBAAgB,WAAW,IAAI,QAAQ,QAAO,GAAG,QAAO,OAAO,MAAM;AAAA,MACrE;AAAA,IACF;AAAA,IAEA,IAAI,eAAe,cAAc;AAAA,MAC/B,MAAM,UAAS,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,SAAS,KAAK,CAAC;AAAA,MAC5D,gBAAgB,WAAW,IAAI,GAAG,QAAQ,SAAQ,OAAO,OAAO,OAAM;AAAA,MACtE;AAAA,IACF;AAAA,IAEA,MAAM,UAAU,KAAK,KAAK,KAAK,KAAK,KAAK,CAAC;AAAA,IAC1C,MAAM,OAAO,KAAK,KAAK,QAAQ,OAAO;AAAA,IACtC,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,QAAQ,OAAO,CAAC;AAAA,IAC5D,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,SAAS,IAAI,CAAC;AAAA,IAC3D,MAAM,SAAS,QAAQ;AAAA,IACvB,MAAM,MAAM,KAAK,MAAM,QAAQ,OAAO;AAAA,IACtC,gBAAgB,WAAW,IAAI,SAAS,OAAO,MAAM,QAAQ,OAAO,MAAM;AAAA,GAC3E;AAAA,EAED,OAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,YAAY,QAAQ,gBAAgB,QAAQ,WAAW,IAAI,KAAK,aAAa,cAAc;AAAA,EACtG;AAAA;AAGK,SAAS,UAAU,CACxB,UACA,GACA,GAIA;AAAA,EACA,IAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;AAAA,IAClD,MAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAAA,EACA,gBAAgB,UAAU,GAAG,CAAC;AAAA,EAC9B,OAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,oBAAoB,YAAY,CAAC,MAAM,YAAY,CAAC;AAAA,EAC/D;AAAA;AAKK,SAAS,cAAc,CAAC,UAAwB;AAAA,EACrD,MAAM,MAAK,gBAAgB;AAAA,EAC3B,MAAM,SAAS,oBAAoB,QAAQ;AAAA,EAE3C,IAAI,QAAO,UAAU;AAAA,IACnB,sBACE,UAAU,2BAA2B,QAAQ,GAC7C,8CACF;AAAA,EACF,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,MAAM,YAAY,uBAAuB,QAAQ;AAAA,IACjD,IAAI,cAAc,SAAS,GAAG;AAAA,MAC5B,WAAW,WAAW,CAAC,kBAAkB,SAAS,GAAG,IAAI;AAAA,IAC3D,EAAO;AAAA,MACL,MAAM,IAAI,MAAM,2CAA2C;AAAA;AAAA,EAE/D,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,MAAM,YAAY,uBAAuB,QAAQ;AAAA,IACjD,MAAM,KAAK;AAAA;AAAA,gCAEiB;AAAA,mDACmB;AAAA;AAAA;AAAA,IAG/C,WAAW,cAAc,CAAC,YAAY,EAAE,GAAG,IAAI;AAAA,EACjD;AAAA;AAKK,SAAS,cAAc,CAAC,UAAwB;AAAA,EACrD,MAAM,MAAK,gBAAgB;AAAA,EAC3B,MAAM,SAAS,oBAAoB,QAAQ;AAAA,EAE3C,IAAI,QAAO,UAAU;AAAA,IACnB,sBACE,UAAU,2BAA2B,QAAQ,GAC7C,mEACF;AAAA,EACF,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,MAAM,YAAY,uBAAuB,QAAQ;AAAA,IACjD,IAAI,cAAc,QAAQ,GAAG;AAAA,MAC3B,WACE,UACA,CAAC,MAAM,MAAM,WAAW,MAAM,mCAAmC,GACjE,IACF;AAAA,IACF,EAAO;AAAA,MACL,MAAM,IAAI,MAAM,0CAA0C;AAAA;AAAA,EAE9D,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,MAAM,YAAY,uBAAuB,QAAQ;AAAA,IACjD,MAAM,KAAK;AAAA;AAAA,gCAEiB;AAAA,mDACmB;AAAA;AAAA;AAAA,IAG/C,WAAW,cAAc,CAAC,YAAY,EAAE,GAAG,IAAI;AAAA,EACjD;AAAA;AAGK,SAAS,aAAa,CAAC,UAAwB;AAAA,EACpD,MAAM,MAAK,gBAAgB;AAAA,EAC3B,MAAM,SAAS,oBAAoB,QAAQ;AAAA,EAE3C,IAAI,QAAO,UAAU;AAAA,IACnB,sBACE,UAAU,2BAA2B,QAAQ,GAC7C;AAAA;AAAA;AAAA;AAAA,4CAKF;AAAA,EACF,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,MAAM,YAAY,uBAAuB,QAAQ;AAAA,IACjD,IAAI,cAAc,QAAQ,GAAG;AAAA,MAC3B,WACE,UACA,CAAC,MAAM,MAAM,WAAW,MAAM,sCAAsC,GACpE,IACF;AAAA,MACA,WAAW,UAAU,CAAC,MAAM,MAAM,SAAS,GAAG,IAAI;AAAA,IACpD,EAAO,SAAI,cAAc,SAAS,GAAG;AAAA,MACnC,WAAW,WAAW,CAAC,kBAAkB,SAAS,GAAG,IAAI;AAAA,IAC3D,EAAO;AAAA,MACL,MAAM,IAAI,MAAM,oDAAoD;AAAA;AAAA,EAExE,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,MAAM,YAAY,uBAAuB,QAAQ;AAAA,IACjD,MAAM,KAAK;AAAA;AAAA,gCAEiB;AAAA,mDACmB;AAAA;AAAA;AAAA,IAG/C,WAAW,cAAc,CAAC,YAAY,EAAE,GAAG,IAAI;AAAA,EACjD;AAAA;AAKK,SAAS,WAAW,CAAC,UAAwB;AAAA,EAClD,MAAM,MAAK,gBAAgB;AAAA,EAC3B,MAAM,SAAS,oBAAoB,QAAQ;AAAA,EAE3C,IAAI,QAAO,UAAU;AAAA,IACnB,sBACE,UAAU,2BAA2B,QAAQ,GAC7C,oCACF;AAAA,EACF,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,MAAM,YAAY,uBAAuB,QAAQ;AAAA,IACjD,IAAI,cAAc,QAAQ,GAAG;AAAA,MAC3B,WAAW,UAAU,CAAC,MAAM,MAAM,SAAS,GAAG,IAAI;AAAA,IACpD,EAAO,SAAI,cAAc,SAAS,GAAG;AAAA,MACnC,WAAW,WAAW,CAAC,eAAe,SAAS,GAAG,IAAI;AAAA,IACxD,EAAO;AAAA,MACL,MAAM,IAAI,MAAM,kDAAkD;AAAA;AAAA,EAEtE,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,MAAM,YAAY,uBAAuB,QAAQ;AAAA,IACjD,MAAM,KAAK,oBAAoB;AAAA,IAC/B,WAAW,cAAc,CAAC,YAAY,EAAE,GAAG,IAAI;AAAA,EACjD;AAAA;AAeK,SAAS,aAAa,GAAe;AAAA,EAC1C,MAAM,MAAK,gBAAgB;AAAA,EAE3B,IAAI,QAAO,UAAU;AAAA,IACnB,IAAI;AAAA,MACF,MAAM,SAAS,UACb,0MACA,EAAE,UAAU,SAAS,SAAS,KAAK,CACrC;AAAA,MACA,OAAO,OAAO,UAAU,OACrB,KAAK,EACL,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,OAAO,SAAS,KAAK,KAAK,GAAG,EAAE,CAAC;AAAA,MACjD,IACE,OAAO,SAAS,KAAK,KACrB,OAAO,SAAS,MAAM,KACtB,QAAQ,KACR,SAAS,GACT;AAAA,QACA,OAAO,EAAE,OAAO,OAAO;AAAA,MACzB;AAAA,MACA,MAAM;AAAA,IAGR,IAAI;AAAA,MACF,MAAM,SAAS,UACb,+EACA,EAAE,UAAU,SAAS,SAAS,KAAK,CACrC;AAAA,MAEA,MAAM,QAAQ,OACX,KAAK,EACL,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,OAAO,SAAS,EAAE,KAAK,GAAG,EAAE,CAAC;AAAA,MAC3C,IAAI,MAAM,UAAU,GAAG;AAAA,QACrB,OAAO,EAAE,OAAO,MAAM,IAAK,QAAQ,MAAM,GAAI;AAAA,MAC/C;AAAA,MACA,MAAM;AAAA,IAIR,IAAI;AAAA,MACF,MAAM,SAAS,UACb,oEACA,EAAE,UAAU,SAAS,SAAS,KAAK,CACrC;AAAA,MACA,MAAM,QAAQ,OAAO,MAAM,mBAAmB;AAAA,MAC9C,IAAI,OAAO;AAAA,QACT,OAAO;AAAA,UACL,OAAO,OAAO,SAAS,MAAM,IAAK,EAAE;AAAA,UACpC,QAAQ,OAAO,SAAS,MAAM,IAAK,EAAE;AAAA,QACvC;AAAA,MACF;AAAA,MACA,MAAM;AAAA,IAGR,OAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA,EACrC;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,IAAI,cAAc,SAAS,GAAG;AAAA,MAC5B,IAAI;AAAA,QACF,MAAM,SAAS,WAAW,WAAW,CAAC,oBAAoB,GAAG,IAAI;AAAA,QACjE,MAAM,QAAQ,OAAO,KAAK,EAAE,MAAM,GAAG;AAAA,QACrC,IAAI,MAAM,UAAU,GAAG;AAAA,UACrB,OAAO;AAAA,YACL,OAAO,OAAO,SAAS,MAAM,IAAK,EAAE;AAAA,YACpC,QAAQ,OAAO,SAAS,MAAM,IAAK,EAAE;AAAA,UACvC;AAAA,QACF;AAAA,QACA,MAAM;AAAA,IAGV;AAAA,IACA,IAAI,cAAc,QAAQ,GAAG;AAAA,MAC3B,IAAI;AAAA,QACF,MAAM,SAAS,UAAS,iCAAiC;AAAA,UACvD,UAAU;AAAA,UACV,SAAS;AAAA,QACX,CAAC;AAAA,QACD,MAAM,QAAQ,OAAO,MAAM,aAAa;AAAA,QACxC,IAAI,OAAO;AAAA,UACT,OAAO;AAAA,YACL,OAAO,OAAO,SAAS,MAAM,IAAK,EAAE;AAAA,YACpC,QAAQ,OAAO,SAAS,MAAM,IAAK,EAAE;AAAA,UACvC;AAAA,QACF;AAAA,QACA,MAAM;AAAA,IAGV;AAAA,IACA,OAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA,EACrC;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,IAAI;AAAA,MACF,MAAM,SAAS,UACb,8FACA,EAAE,UAAU,SAAS,SAAS,KAAK,CACrC;AAAA,MACA,MAAM,SAAS,KAAK,MAAM,MAAM;AAAA,MAChC,OAAO,EAAE,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO;AAAA,MACpD,MAAM;AAAA,IAGR,OAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA,EACrC;AAAA,EAEA,OAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA;AAAA;AAAA,EAjqBrC;AAAA;;;ACVA;AACA;AACA;AAuGA,SAAS,YAAY,CAAC,OAAwB;AAAA,EAC5C,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA;AAG9D,SAAS,uBAAuB,CAAC,SAA2B;AAAA,EAC1D,MAAM,OACJ,OAAO,YAAY,WACf,UACA,mBAAmB,QACjB,QAAQ,UACR;AAAA,EACR,OAAO,KAAK,SAAS,sBAAsB;AAAA;AAG7C,SAAS,iBAAyC,CAChD,YACyB;AAAA,EACzB,OAAO;AAAA;AAGT,SAAS,aAAa,CAAC,OAAwB;AAAA,EAC7C,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO;AAAA,EACT;AAAA,EACA,OAAO,iBAAgB,KAAK;AAAA;AAG9B,SAAS,gBAAe,CAAC,OAAgB,SAAS,GAAW;AAAA,EAC3D,MAAM,SAAS,KAAK,OAAO,MAAM;AAAA,EACjC,IAAI,UAAU,QAAQ,UAAU,WAAW;AAAA,IACzC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,IACxB,IAAI,MAAM,WAAW,GAAG;AAAA,MACtB,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,MACL,SAAS,MAAM;AAAA,MACf,GAAG,MAAM,IAAI,CAAC,SAAS,GAAG,WAAW,iBAAgB,MAAM,SAAS,CAAC,GAAG;AAAA,IAC1E,EAAE,KAAK;AAAA,CAAI;AAAA,EACb;AAAA,EACA,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO,OAAO,QAAQ,KAAgC,EACnD,IAAI,EAAE,KAAK,iBAAiB;AAAA,MAC3B,IAAI,eAAe,OAAO,gBAAgB,UAAU;AAAA,QAClD,OAAO,GAAG;AAAA,EAAS,iBAAgB,aAAa,SAAS,CAAC;AAAA,MAC5D;AAAA,MACA,OAAO,GAAG,QAAQ,iBAAgB,aAAa,SAAS,CAAC;AAAA,KAC1D,EACA,KAAK;AAAA,CAAI;AAAA,EACd;AAAA,EACA,OAAO,OAAO,KAAK;AAAA;AAAA,IA3Df,qBAAqB,IACrB,yBAAyB,oBACzB,2BA4DO;AAAA;AAAA,EA5Jb;AAAA,EAIA;AAAA,EAuBA;AAAA,EAaA;AAAA,EAUA;AAAA,EAEA;AAAA,EASA;AAAA,EAmCM,4BAA4B,IAAI,IAAmC;AAAA,IACvE;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EAwDY,qBAAN,MAAM,2BAA2B,QAAQ;AAAA,WACvC,cAAc;AAAA,IAErB,wBACE;AAAA,IAEM;AAAA,IACA,gBAAsC,CAAC;AAAA,IACvC,aAAyB,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA,IACrD,kBAAkB,IAAI;AAAA,IACtB,WAA8B;AAAA,MACpC,uBAAuB;AAAA,MACvB,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,cAAc;AAAA,MACd,iBAAiB;AAAA,IACnB;AAAA,gBAEa,MAAK,CAAC,SAA0C;AAAA,MAC3D,MAAM,WAAW,IAAI,mBAAmB,OAAO;AAAA,MAC/C,SAAS,WAAW,OAAO;AAAA,MAC3B,SAAS,eAAe,SAAS,mBAAmB;AAAA,MAEpD,IAAI;AAAA,QACF,SAAS,aAAa,cAAc;AAAA,QACpC,OAAO,OAAO;AAAA,QACd,OAAO,KACL,sDAAsD,aAAa,KAAK,GAC1E;AAAA;AAAA,MAGF,OAAO,KACL,oCAAoC,gBAAgB,MAAM,SAAS,WAAW,SAAS,SAAS,WAAW,oBAAoB,SAAS,gBAAgB,GAC1J;AAAA,MAEA,OAAO;AAAA;AAAA,SAGH,KAAI,GAAkB;AAAA,MAC1B,KAAK,gBAAgB,UAAU,8BAA8B;AAAA,MAC7D,yBAAyB;AAAA,MACzB,IAAI;AAAA,QACF,MAAM,aAAa;AAAA,QACnB,MAAM;AAAA,MAGR,OAAO,KAAK,+BAA+B;AAAA;AAAA,SAGvC,eAAc,CAClB,SACA,aAAsC,CAAC,GACX;AAAA,MAC5B,QAAQ;AAAA,aACD;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,UACH,OAAO,KAAK,qBAAqB;AAAA,eAC5B,kBAAuC,UAAU;AAAA,YACpD,QAAQ,KAAK,0BAA0B,OAAO;AAAA,UAChD,CAAC;AAAA,aACE;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,UACH,OAAO,KAAK,qBAAqB;AAAA,eAC5B,kBAAuC,UAAU;AAAA,YACpD,QAAQ,KAAK,0BAA0B,OAAO;AAAA,UAChD,CAAC;AAAA,aACE;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,UACH,OAAO,KAAK,oBAAoB;AAAA,eAC3B,kBAAsC,UAAU;AAAA,YACnD,QAAQ,KAAK,yBAAyB,OAAO;AAAA,UAC/C,CAAC;AAAA,aACE;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,UACH,OAAO,KAAK,kBAAkB;AAAA,eACzB,kBAAoC,UAAU;AAAA,YACjD,QAAQ,KAAK,uBAAuB,OAAO;AAAA,UAC7C,CAAC;AAAA,aACE;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,UACH,OAAO,KAAK,sBAAsB;AAAA,eAC7B,kBAAwC,UAAU;AAAA,YACrD,QAAQ,KAAK,2BAA2B,OAAO;AAAA,UACjD,CAAC;AAAA;AAAA,UAED,OAAO;AAAA,YACL,SAAS;AAAA,YACT,OAAO,iCAAiC;AAAA,UAC1C;AAAA;AAAA;AAAA,SAIA,qBAAoB,CACxB,WAC+B;AAAA,MAC/B,MAAM,SAAS,KAAK,6BAA6B,SAAS;AAAA,MAC1D,MAAM,QAAQ,KAAK,YAAY,OAAO,QAAQ,KAAK,eAAe,MAAM,CAAC;AAAA,MAEzE,IAAI;AAAA,QACF,MAAM,gBAAgB,MAAM,KAAK,cAC/B,KAAK,uBAAuB,OAAO,MAAM,GACzC,KAAK,eAAe,MAAM,CAC5B;AAAA,QACA,IAAI,eAAe;AAAA,UACjB,OAAO,KAAK,UAAU,OAAO,EAAE,SAAS,OAAO,OAAO,cAAc,CAAC;AAAA,QACvE;AAAA,QAEA,IAAI,OAAO,WAAW,mBAAmB;AAAA,UACvC,OAAO,KAAK,UAAU,OAAO;AAAA,YAC3B,SAAS;AAAA,YACT,OACE;AAAA,UACJ,CAAC;AAAA,QACH;AAAA,QAEA,IAAI,OAAO,WAAW,OAAO;AAAA,UAC3B,OAAO,KAAK,UAAU,OAAO;AAAA,YAC3B,SAAS;AAAA,YACT,OACE;AAAA,UACJ,CAAC;AAAA,QACH;AAAA,QAEA,QAAQ,OAAO;AAAA,eACR;AAAA,YACH,OAAO,KAAK,aAAa,OAAO;AAAA,cAC9B,SAAS;AAAA,cACT,YAAY,MAAM,KAAK,wBAAwB;AAAA,YACjD,CAAC;AAAA,eACE;AAAA,YACH,KAAK,kBAAkB,OAAO,YAAY,OAAO;AAAA,YACjD,MAAM,YAAY,OAAO,WAAW,IAAI,OAAO,WAAW,EAAE;AAAA,YAC5D;AAAA,eACG;AAAA,YACH,KAAK,kBAAkB,OAAO,YAAY,sBAAsB;AAAA,YAChE,MAAM,yBACJ,OAAO,WAAW,IAClB,OAAO,WAAW,IAClB,OAAO,aAAa,CAAC,CACvB;AAAA,YACA;AAAA,eACG;AAAA,YACH,KAAK,kBAAkB,OAAO,YAAY,cAAc;AAAA,YACxD,MAAM,kBAAkB,OAAO,WAAW,IAAI,OAAO,WAAW,EAAE;AAAA,YAClE;AAAA,eACG;AAAA,YACH,KAAK,kBAAkB,OAAO,YAAY,aAAa;AAAA,YACvD,MAAM,iBAAiB,OAAO,WAAW,IAAI,OAAO,WAAW,EAAE;AAAA,YACjE;AAAA,eACG;AAAA,YACH,KAAK,kBAAkB,OAAO,YAAY,YAAY;AAAA,YACtD,MAAM,gBAAgB,OAAO,WAAW,IAAI,OAAO,WAAW,EAAE;AAAA,YAChE;AAAA,eACG;AAAA,YACH,IAAI,CAAC,OAAO;AAAA,cAAM,MAAM,IAAI,MAAM,kCAAkC;AAAA,YACpE,MAAM,WAAW,OAAO,IAAI;AAAA,YAC5B;AAAA,eACG;AAAA,YACH,IAAI,CAAC,OAAO;AAAA,cAAK,MAAM,IAAI,MAAM,gCAAgC;AAAA,YACjE,MAAM,eAAe,OAAO,GAAG;AAAA,YAC/B;AAAA,eACG;AAAA,YACH,IAAI,CAAC,OAAO,KAAK;AAAA,cACf,MAAM,IAAI,MAAM,sCAAsC;AAAA,YACxD;AAAA,YACA,MAAM,eAAe,OAAO,GAAG;AAAA,YAC/B;AAAA,eACG;AAAA,YACH,KAAK,kBAAkB,OAAO,YAAY,QAAQ;AAAA,YAClD,MAAM,aACJ,OAAO,WAAW,IAClB,OAAO,WAAW,IAClB,OAAO,mBAAmB,QAC1B,OAAO,gBAAgB,CACzB;AAAA,YACA;AAAA,eACG;AAAA,YACH,KAAK,kBACH,OAAO,iBACP,QACA,iBACF;AAAA,YACA,KAAK,kBAAkB,OAAO,YAAY,MAAM;AAAA,YAChD,MAAM,WACJ,OAAO,gBAAgB,IACvB,OAAO,gBAAgB,IACvB,OAAO,WAAW,IAClB,OAAO,WAAW,EACpB;AAAA,YACA;AAAA;AAAA,YAEA,OAAO,KAAK,UAAU,OAAO;AAAA,cAC3B,SAAS;AAAA,cACT,OAAO,2BAA4B,OAA8B;AAAA,YACnE,CAAC;AAAA;AAAA,QAGL,MAAM,SAA+B,EAAE,SAAS,KAAK;AAAA,QACrD,IAAI,KAAK,gCAAgC,OAAO,MAAM,GAAG;AAAA,UACvD,IAAI;AAAA,YACF,OAAO,aAAa,MAAM,KAAK,wBAAwB;AAAA,YACvD,OAAO,OAAO;AAAA,YACd,OAAO,KACL,gDAAgD,aAAa,KAAK,GACpE;AAAA;AAAA,QAEJ;AAAA,QACA,OAAO,KAAK,aAAa,OAAO,MAAM;AAAA,QACtC,OAAO,OAAO;AAAA,QACd,MAAM,kBAAkB,8BAA8B,OAAO;AAAA,UAC3D,gBACE,OAAO,WAAW,eAAe,qBAAqB;AAAA,UACxD,WAAW,OAAO;AAAA,QACpB,CAAC;AAAA,QACD,IAAI,iBAAiB;AAAA,UACnB,OAAO,KAAK,UAAU,OAAO;AAAA,YAC3B,SAAS;AAAA,YACT,OAAO,gBAAgB;AAAA,YACvB,kBAAkB;AAAA,YAClB,gBAAgB,gBAAgB;AAAA,UAClC,CAAC;AAAA,QACH;AAAA,QACA,OAAO,KAAK,UAAU,OAAO;AAAA,UAC3B,SAAS;AAAA,UACT,OAAO,aAAa,KAAK;AAAA,QAC3B,CAAC;AAAA;AAAA;AAAA,SAIC,qBAAoB,CACxB,WAC8B;AAAA,MAC9B,MAAM,SAAS,KAAK,6BAA6B,SAAS;AAAA,MAC1D,MAAM,QAAQ,KAAK,YACjB,WAAW,OAAO,UAClB,KAAK,eAAe,MAAM,CAC5B;AAAA,MAEA,IAAI;AAAA,QACF,MAAM,gBAAgB,MAAM,KAAK,cAC/B,KAAK,uBAAuB,OAAO,MAAM,GACzC,KAAK,eAAe,MAAM,CAC5B;AAAA,QACA,IAAI,eAAe;AAAA,UACjB,OAAO,KAAK,UAAU,OAAO,EAAE,SAAS,OAAO,OAAO,cAAc,CAAC;AAAA,QACvE;AAAA,QAEA,MAAM,SAAS,MAAM,KAAK,iBAAiB,MAAM;AAAA,QACjD,IAAI,KAAK,sBAAsB,OAAO,QAAQ,OAAO,KAAK,GAAG;AAAA,UAC3D,OAAO,MAAM,KAAK,4BAA4B,OAAO,MAAM;AAAA,QAC7D;AAAA,QACA,OAAO,OAAO,UACV,KAAK,aAAa,OAAO,MAAM,IAC/B,KAAK,UAAU,OAAO,MAAM;AAAA,QAChC,OAAO,OAAO;AAAA,QACd,IAAI,KAAK,sBAAsB,OAAO,QAAQ,KAAK,GAAG;AAAA,UACpD,OAAO,MAAM,KAAK,4BAA4B,OAAO,MAAM;AAAA,QAC7D;AAAA,QACA,OAAO,KAAK,UAAU,OAAO;AAAA,UAC3B,SAAS;AAAA,UACT,OAAO,aAAa,KAAK;AAAA,QAC3B,CAAC;AAAA;AAAA;AAAA,SAIS,4BAA2B,CACvC,OACA,QAC8B;AAAA,MAC9B,IAAI;AAAA,QACF,MAAM,aAAa,MAAM,KAAK,iBAAiB;AAAA,aAC1C;AAAA,UACH,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,IAAI,CAAC,WAAW,SAAS;AAAA,UACvB,OAAO,KAAK,UAAU,OAAO,UAAU;AAAA,QACzC;AAAA,QAEA,MAAM,cAAc,MAAM,KAAK,iBAAiB,MAAM;AAAA,QACtD,OAAO,YAAY,UACf,KAAK,aAAa,OAAO,WAAW,IACpC,KAAK,UAAU,OAAO,WAAW;AAAA,QACrC,OAAO,OAAO;AAAA,QACd,OAAO,KAAK,UAAU,OAAO;AAAA,UAC3B,SAAS;AAAA,UACT,OAAO,aAAa,KAAK;AAAA,QAC3B,CAAC;AAAA;AAAA;AAAA,IAIG,qBAAqB,CAC3B,QACA,OACS;AAAA,MACT,OACE,CAAC,0BAA0B,IAAI,MAAM,KAAK,wBAAwB,KAAK;AAAA;AAAA,SAI7D,iBAAgB,CAC5B,QAC8B;AAAA,MAC9B,QAAQ,OAAO;AAAA,aACR;AAAA,aACA,WAAW;AAAA,UACd,MAAM,QAAQ,MAAM,YAAY,OAAO,GAAG;AAAA,UAC1C,OAAO;AAAA,YACL,SAAS;AAAA,YACT,KAAK,MAAM;AAAA,YACX,OAAO,MAAM;AAAA,YACb,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,MAAM;AAAA,YACN,SAAS,cAAc,KAAK;AAAA,YAC5B,SAAS,mBAAmB,MAAM;AAAA,UACpC;AAAA,QACF;AAAA,aACK;AAAA,UACH,MAAM,aAAa;AAAA,UACnB,OAAO;AAAA,YACL,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,aACG,YAAY;AAAA,UACf,MAAM,MAAM,KAAK,kBACf,OAAO,KACP,8BACF;AAAA,UACA,MAAM,QAAQ,MAAM,gBAAgB,GAAG;AAAA,UACvC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,KAAK,MAAM;AAAA,YACX,OAAO,MAAM;AAAA,YACb,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,MAAM;AAAA,YACN,SAAS,cAAc,KAAK;AAAA,YAC5B,SAAS,gBAAgB,MAAM;AAAA,UACjC;AAAA,QACF;AAAA,aACK;AAAA,UACH,MAAM,aAAa,OAAO,UAAU,OAAO,YAAY,OAAO,IAAI;AAAA,UAClE,OAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,aACG;AAAA,UACH,IAAI,CAAC,OAAO,MAAM;AAAA,YAChB,MAAM,IAAI,MAAM,mCAAmC;AAAA,UACrD;AAAA,UACA,MAAM,YAAY,OAAO,MAAM,OAAO,QAAQ;AAAA,UAC9C,OAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,aACG;AAAA,UACH,MAAM,cAAc,OAAO,aAAa,QAAQ,OAAO,UAAU,GAAG;AAAA,UACpE,OAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS,oBAAoB,OAAO,aAAa;AAAA,UACnD;AAAA,aACG,cAAc;AAAA,UACjB,MAAM,aAAa,MAAM,kBAAkB;AAAA,UAC3C,OAAO;AAAA,YACL,SAAS;AAAA,YACT;AAAA,YACA,oBAAoB;AAAA,YACpB,SAAS;AAAA,UACX;AAAA,QACF;AAAA,aACK;AAAA,aACA,WAAW;AAAA,UACd,MAAM,UAAU,MAAM,cAAc;AAAA,UACpC,OAAO;AAAA,YACL,SAAS;AAAA,YACT;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAAA,aACK;AAAA,aACA,kBAAkB;AAAA,UACrB,MAAM,WAAW,MAAM,qBAAqB;AAAA,UAC5C,OAAO;AAAA,YACL,SAAS;AAAA,YACT;AAAA,YACA,OAAO,SAAS;AAAA,YAChB,MAAM;AAAA,YACN,SAAS,cAAc,QAAQ;AAAA,YAC/B,SAAS;AAAA,UACX;AAAA,QACF;AAAA,aACK,WAAW;AAAA,UACd,MAAM,OAAO,KAAK,kBAChB,OAAO,MACP,sCACF;AAAA,UACA,MAAM,UAAU,MAAM,eAAe,IAAI;AAAA,UACzC,OAAO;AAAA,YACL,SAAS;AAAA,YACT;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAAA,aACK,SAAS;AAAA,UACZ,MAAM,OAAO,MAAM,gBAAgB;AAAA,UACnC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,KAAK,KAAK;AAAA,YACV,OAAO,KAAK;AAAA,YACZ,QAAQ;AAAA,YACR,SAAS;AAAA,YACT;AAAA,YACA,SAAS,cAAc,IAAI;AAAA,UAC7B;AAAA,QACF;AAAA,aACK,QAAQ;AAAA,UACX,MAAM,OAAO,MAAM,eAAe;AAAA,UAClC,OAAO;AAAA,YACL,SAAS,KAAK;AAAA,YACd,KAAK,KAAK;AAAA,YACV,OAAO,KAAK;AAAA,YACZ,QAAQ,KAAK;AAAA,YACb,SAAS,KAAK;AAAA,YACd,MAAM;AAAA,YACN,SAAS,cAAc,IAAI;AAAA,eACvB,KAAK,UAAU,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM;AAAA,UAC9C;AAAA,QACF;AAAA,aACK;AAAA,aACA,eAAe;AAAA,UAClB,MAAM,OAAO,MAAM,kBAAkB;AAAA,UACrC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,KAAK,KAAK;AAAA,YACV,OAAO,KAAK;AAAA,YACZ,QAAQ;AAAA,YACR,SAAS;AAAA,YACT;AAAA,YACA,SAAS,cAAc,IAAI;AAAA,UAC7B;AAAA,QACF;AAAA,aACK;AAAA,UACH,MAAM,YACJ,OAAO,UACP,OAAO,MACP,OAAO,WAAW,KAAK,SAAS,eAClC;AAAA,UACA,OAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,aACG,aAAa;AAAA,UAChB,MAAM,OAAO,MAAM,gBAAgB;AAAA,UACnC,OAAO;AAAA,YACL,SAAS;AAAA,YACT;AAAA,YACA,OAAO,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS,cAAc,IAAI;AAAA,UAC7B;AAAA,QACF;AAAA,aACK,YAAY;AAAA,UACf,MAAM,MAAM,MAAM,eAAe,OAAO,GAAG;AAAA,UAC3C,OAAO;AAAA,YACL,SAAS;AAAA,YACT,MAAM;AAAA,YACN,SAAS,cAAc,GAAG;AAAA,YAC1B,SAAS,cAAc,IAAI;AAAA,UAC7B;AAAA,QACF;AAAA,aACK,aAAa;AAAA,UAChB,MAAM,QAAQ,KAAK,kBACjB,OAAO,OACP,iCACF;AAAA,UACA,MAAM,gBAAgB,KAAK;AAAA,UAC3B,OAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS,cAAc;AAAA,UACzB;AAAA,QACF;AAAA,aACK,cAAc;AAAA,UACjB,MAAM,QAAQ,KAAK,kBACjB,OAAO,OACP,kCACF;AAAA,UACA,MAAM,QAAQ,MAAM,iBAAiB,KAAK;AAAA,UAC1C,OAAO;AAAA,YACL,SAAS;AAAA,YACT,KAAK,MAAM;AAAA,YACX,OAAO,MAAM;AAAA,YACb,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,MAAM;AAAA,YACN,SAAS,cAAc,KAAK;AAAA,YAC5B,SAAS,mBAAmB;AAAA,UAC9B;AAAA,QACF;AAAA;AAAA,UAEE,OAAO;AAAA,YACL,SAAS;AAAA,YACT,OAAO,2BAA4B,OAA8B;AAAA,UACnE;AAAA;AAAA;AAAA,SAIA,oBAAmB,CACvB,WAC6B;AAAA,MAC7B,MAAM,SAAS,KAAK,4BAA4B,SAAS;AAAA,MACzD,MAAM,QAAQ,KAAK,YACjB,UAAU,OAAO,UACjB,KAAK,eAAe,MAAM,CAC5B;AAAA,MAEA,IAAI;AAAA,QACF,MAAM,gBAAgB,MAAM,KAAK,cAC/B,KAAK,sBAAsB,OAAO,MAAM,GACxC,KAAK,eAAe,MAAM,CAC5B;AAAA,QACA,IAAI,eAAe;AAAA,UACjB,OAAO,KAAK,UAAU,OAAO,EAAE,SAAS,OAAO,OAAO,cAAc,CAAC;AAAA,QACvE;AAAA,QAEA,QAAQ,OAAO;AAAA,eACR,QAAQ;AAAA,YACX,MAAM,UAAU,YAAY;AAAA,YAC5B,OAAO,KAAK,aAAa,OAAO;AAAA,cAC9B,SAAS;AAAA,cACT;AAAA,cACA,OAAO,QAAQ;AAAA,YACjB,CAAC;AAAA,UACH;AAAA,eACK;AAAA,YACH,YAAY,KAAK,oBAAoB,MAAM,CAAC;AAAA,YAC5C,OAAO,KAAK,aAAa,OAAO;AAAA,cAC9B,SAAS;AAAA,cACT,SAAS;AAAA,YACX,CAAC;AAAA,eACE;AAAA,YACH,aAAa,KAAK,oBAAoB,MAAM,CAAC;AAAA,YAC7C,OAAO,KAAK,aAAa,OAAO;AAAA,cAC9B,SAAS;AAAA,cACT,SAAS;AAAA,YACX,CAAC;AAAA,eACE;AAAA,YACH,OAAO,KAAK,aAAa,OAAO,eAAe,OAAO,WAAW,CAAC;AAAA,eAC/D,QAAQ;AAAA,YACX,MAAM,SAAS,WACb,KAAK,oBAAoB,MAAM,GAC/B,KAAK,cAAc,OAAO,GAAG,+BAA+B,GAC5D,KAAK,cAAc,OAAO,GAAG,+BAA+B,CAC9D;AAAA,YACA,OAAO,KAAK,aAAa,OAAO,MAAM;AAAA,UACxC;AAAA,eACK;AAAA,YACH,eAAe,KAAK,oBAAoB,MAAM,CAAC;AAAA,YAC/C,OAAO,KAAK,aAAa,OAAO;AAAA,cAC9B,SAAS;AAAA,cACT,SAAS;AAAA,YACX,CAAC;AAAA,eACE;AAAA,YACH,eAAe,KAAK,oBAAoB,MAAM,CAAC;AAAA,YAC/C,OAAO,KAAK,aAAa,OAAO;AAAA,cAC9B,SAAS;AAAA,cACT,SAAS;AAAA,YACX,CAAC;AAAA,eACE;AAAA,YACH,cAAc,KAAK,oBAAoB,MAAM,CAAC;AAAA,YAC9C,OAAO,KAAK,aAAa,OAAO;AAAA,cAC9B,SAAS;AAAA,cACT,SAAS;AAAA,YACX,CAAC;AAAA,eACE;AAAA,YACH,YAAY,KAAK,oBAAoB,MAAM,CAAC;AAAA,YAC5C,OAAO,KAAK,aAAa,OAAO;AAAA,cAC9B,SAAS;AAAA,cACT,SAAS;AAAA,YACX,CAAC;AAAA;AAAA,YAED,OAAO,KAAK,UAAU,OAAO;AAAA,cAC3B,SAAS;AAAA,cACT,OAAO,0BAA2B,OAA8B;AAAA,YAClE,CAAC;AAAA;AAAA,QAEL,OAAO,OAAO;AAAA,QACd,MAAM,kBAAkB,8BAA8B,OAAO;AAAA,UAC3D,gBAAgB;AAAA,UAChB,WAAW,OAAO;AAAA,QACpB,CAAC;AAAA,QACD,IAAI,iBAAiB;AAAA,UACnB,OAAO,KAAK,UAAU,OAAO;AAAA,YAC3B,SAAS;AAAA,YACT,OAAO,gBAAgB;AAAA,YACvB,kBAAkB;AAAA,YAClB,gBAAgB,gBAAgB;AAAA,UAClC,CAAC;AAAA,QACH;AAAA,QACA,OAAO,KAAK,UAAU,OAAO;AAAA,UAC3B,SAAS;AAAA,UACT,OAAO,aAAa,KAAK;AAAA,QAC3B,CAAC;AAAA;AAAA;AAAA,SAIC,kBAAiB,CACrB,WAC2B;AAAA,MAC3B,MAAM,SAAS,KAAK,0BAA0B,SAAS;AAAA,MACvD,MAAM,QAAQ,KAAK,YACjB,QAAQ,OAAO,UACf,KAAK,eAAe,MAAM,CAC5B;AAAA,MAEA,IAAI;AAAA,QACF,MAAM,gBAAgB,MAAM,KAAK,cAC/B,KAAK,oBAAoB,OAAO,MAAM,GACtC,KAAK,eAAe,MAAM,CAC5B;AAAA,QACA,IAAI,eAAe;AAAA,UACjB,OAAO,KAAK,UAAU,OAAO,EAAE,SAAS,OAAO,OAAO,cAAc,CAAC;AAAA,QACvE;AAAA,QAEA,MAAM,aACJ,OAAO,WAAW,mBACd,KAAK,qBAAqB,IAC1B,KAAK,kBACH,OAAO,MACP,kCACF;AAAA,QAEN,QAAQ,OAAO;AAAA,eACR;AAAA,eACA;AAAA,YACH,OAAO,KAAK,gBACV,OACA,MAAM,SAAS,YAAY,KAAK,kBAAkB,OAAO,QAAQ,CAAC,CACpE;AAAA,eACG;AAAA,eACA;AAAA,YACH,IAAI,OAAO,OAAO,YAAY,UAAU;AAAA,cACtC,MAAM,IAAI,MAAM,oCAAoC;AAAA,YACtD;AAAA,YACA,OAAO,KAAK,gBACV,OACA,MAAM,UAAU,YAAY,OAAO,OAAO,CAC5C;AAAA,eACG;AAAA,YACH,IAAI,OAAO,OAAO,aAAa,UAAU;AAAA,cACvC,MAAM,IAAI,MAAM,oCAAoC;AAAA,YACtD;AAAA,YACA,IAAI,OAAO,OAAO,aAAa,UAAU;AAAA,cACvC,MAAM,IAAI,MAAM,oCAAoC;AAAA,YACtD;AAAA,YACA,OAAO,KAAK,gBACV,OACA,MAAM,SAAS,YAAY,OAAO,UAAU,OAAO,QAAQ,CAC7D;AAAA,eACG;AAAA,YACH,IAAI,OAAO,OAAO,YAAY,UAAU;AAAA,cACtC,MAAM,IAAI,MAAM,qCAAqC;AAAA,YACvD;AAAA,YACA,OAAO,KAAK,gBACV,OACA,MAAM,WAAW,YAAY,OAAO,OAAO,CAC7C;AAAA,eACG;AAAA,YACH,OAAO,KAAK,gBAAgB,OAAO,MAAM,WAAW,UAAU,CAAC;AAAA,eAC5D;AAAA,YACH,OAAO,KAAK,gBAAgB,OAAO,MAAM,WAAW,UAAU,CAAC;AAAA,eAC5D;AAAA,eACA;AAAA,YACH,OAAO,KAAK,gBAAgB,OAAO,MAAM,cAAc,UAAU,CAAC;AAAA,eAC/D;AAAA,YACH,OAAO,KAAK,gBAAgB,OAAO,MAAM,gBAAgB,UAAU,CAAC;AAAA;AAAA,YAEpE,OAAO,KAAK,UAAU,OAAO;AAAA,cAC3B,SAAS;AAAA,cACT,OAAO,wBAAyB,OAA8B;AAAA,YAChE,CAAC;AAAA;AAAA,QAEL,OAAO,OAAO;AAAA,QACd,OAAO,KAAK,UAAU,OAAO;AAAA,UAC3B,SAAS;AAAA,UACT,OAAO,aAAa,KAAK;AAAA,QAC3B,CAAC;AAAA;AAAA;AAAA,SAIC,sBAAqB,CACzB,WAC+B;AAAA,MAC/B,MAAM,SAAS,KAAK,8BAA8B,SAAS;AAAA,MAC3D,MAAM,QAAQ,KAAK,YACjB,YAAY,OAAO,UACnB,KAAK,eAAe,MAAM,CAC5B;AAAA,MAEA,IAAI;AAAA,QACF,MAAM,gBAAgB,MAAM,KAAK,cAC/B,KAAK,wBAAwB,OAAO,MAAM,GAC1C,KAAK,eAAe,MAAM,CAC5B;AAAA,QACA,IAAI,eAAe;AAAA,UACjB,OAAO,KAAK,UAAU,OAAO,EAAE,SAAS,OAAO,OAAO,cAAc,CAAC;AAAA,QACvE;AAAA,QAEA,QAAQ,OAAO;AAAA,eACR;AAAA,YACH,OAAO,KAAK,oBACV,OACA,MAAM,gBAAgB,OAAO,GAAG,CAClC;AAAA,eACG;AAAA,YACH,OAAO,KAAK,oBACV,OACA,MAAM,gBAAgB;AAAA,cACpB,SAAS,KAAK,kBACZ,OAAO,SACP,0CACF;AAAA,cACA,gBACE,OAAO,WACP,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,SAAS,kBAAkB,IAAI,CAAC;AAAA,cAC7D,WAAW,OAAO;AAAA,cAClB,KAAK,OAAO;AAAA,YACd,CAAC,CACH;AAAA,eACG;AAAA,YACH,OAAO,KAAK,oBACV,OACA,MAAM,aAAa,OAAO,SAAS,CACrC;AAAA,eACG;AAAA,YACH,OAAO,KAAK,oBACV,OACA,MAAM,aACJ,KAAK,kBACH,OAAO,MACP,oCACF,CACF,CACF;AAAA,eACG;AAAA,YACH,OAAO,KAAK,oBACV,OACA,MAAM,cAAc,OAAO,SAAS,CACtC;AAAA,eACG;AAAA,YACH,OAAO,KAAK,oBACV,OACA,MAAM,cAAc,OAAO,SAAS,CACtC;AAAA,eACG;AAAA,YACH,OAAO,KAAK,oBACV,OACA,MAAM,gBAAgB;AAAA,cACpB,SAAS,KAAK,kBACZ,OAAO,SACP,yCACF;AAAA,cACA,gBACE,OAAO,WACP,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,SAAS,kBAAkB,IAAI,CAAC;AAAA,cAC7D,WAAW,OAAO;AAAA,cAClB,KAAK,OAAO;AAAA,YACd,CAAC,CACH;AAAA;AAAA,YAEA,OAAO,KAAK,UAAU,OAAO;AAAA,cAC3B,SAAS;AAAA,cACT,OAAO,4BAA6B,OAA8B;AAAA,YACpE,CAAC;AAAA;AAAA,QAEL,OAAO,OAAO;AAAA,QACd,OAAO,KAAK,UAAU,OAAO;AAAA,UAC3B,SAAS;AAAA,UACT,OAAO,aAAa,KAAK;AAAA,QAC3B,CAAC;AAAA;AAAA;AAAA,SAIC,cAAa,GAAoB;AAAA,MACrC,OAAO,wBAAwB;AAAA;AAAA,IAGjC,eAAe,GAAyB;AAAA,MACtC,OAAO,KAAK;AAAA;AAAA,IAGd,gBAAgB,GAAyB;AAAA,MACvC,OAAO,CAAC,GAAG,KAAK,aAAa;AAAA;AAAA,IAG/B,mBAAmB,GAAe;AAAA,MAChC,OAAO,KAAK;AAAA;AAAA,IAGd,eAAe,GAAiB;AAAA,MAC9B,OAAO,KAAK,gBAAgB,QAAQ;AAAA;AAAA,IAGtC,eAAe,CAAC,MAAkC;AAAA,MAChD,MAAM,WAAW,KAAK,gBAAgB,QAAQ,IAAI;AAAA,MAClD,KAAK,SAAS,eAAe;AAAA,MAC7B,OAAO,KAAK,sCAAsC,UAAU;AAAA,MAC5D,OAAO;AAAA;AAAA,IAGT,mBAAmB,GAAqB;AAAA,MACtC,OAAO,KAAK,gBAAgB,YAAY;AAAA;AAAA,IAG1C,kBAAkB,CAChB,UACY;AAAA,MACZ,OAAO,KAAK,gBAAgB,UAAU,QAAQ;AAAA;AAAA,IAGhD,eAAe,CACb,IACA,UACA,QAC2B;AAAA,MAC3B,OAAO,KAAK,gBAAgB,gBAAgB,IAAI,UAAU,MAAM;AAAA;AAAA,IAG1D,4BAA4B,CAClC,QACqB;AAAA,MACrB,MAAM,aACJ,OAAO,eACN,OAAO,MAAM,aAAa,OAAO,MAAM,YACpC,CAAC,OAAO,OAAO,CAAC,GAAG,OAAO,OAAO,CAAC,CAAC,IACnC;AAAA,MACN,MAAM,kBACJ,OAAO,oBACN,OAAO,OAAO,aAAa,OAAO,OAAO,YACtC,CAAC,OAAO,OAAO,EAAE,GAAG,OAAO,OAAO,EAAE,CAAC,IACrC;AAAA,MACN,MAAM,gBACJ,eACC,OAAO,OAAO,aAAa,OAAO,OAAO,YACtC,CAAC,OAAO,OAAO,EAAE,GAAG,OAAO,OAAO,EAAE,CAAC,IACrC;AAAA,MAEN,OAAO;AAAA,WACF;AAAA,QACH,YAAY;AAAA,QACZ;AAAA,QACA,WAAW,OAAO,aAAa,OAAO;AAAA,QACtC,cAAc,OAAO,gBAAgB,OAAO;AAAA,MAC9C;AAAA;AAAA,IAGM,4BAA4B,CAClC,QACqB;AAAA,MACrB,MAAM,iBAAiB,OAAO,SAAS,OAAO,SAAS,OAAO;AAAA,MAC9D,OAAO;AAAA,WACF;AAAA,QACH,OAAO,mBAAmB,YAAY,OAAO,cAAc,IAAI;AAAA,QAC/D,QAAQ,KAAK,uBAAuB,OAAO,MAAM;AAAA,MACnD;AAAA;AAAA,IAGM,2BAA2B,CACjC,QACoB;AAAA,MACpB,OAAO;AAAA,WACF;AAAA,QACH,UAAU,OAAO,YAAY,OAAO,UAAU,OAAO;AAAA,QACrD,aAAa,OAAO,eAAe,OAAO,UAAU,OAAO;AAAA,MAC7D;AAAA;AAAA,IAGM,yBAAyB,CAC/B,QACkB;AAAA,MAClB,OAAO;AAAA,WACF;AAAA,QACH,MAAM,OAAO,QAAQ,OAAO,YAAY,OAAO;AAAA,QAC/C,UAAU,OAAO,YAAY,OAAO,WAAW,OAAO;AAAA,QACtD,UAAU,OAAO,YAAY,OAAO,WAAW,OAAO;AAAA,MACxD;AAAA;AAAA,IAGM,6BAA6B,CACnC,QACsB;AAAA,MACtB,OAAO;AAAA,WACF;AAAA,QACH,SAAS,OAAO,WAAW,OAAO;AAAA,QAClC,WAAW,OAAO,aAAa,OAAO;AAAA,QACtC,QACE,OAAO,WAAW,oBAAoB,oBAAoB,OAAO;AAAA,MACrE;AAAA;AAAA,IAGM,sBAAsB,CAC5B,QAC+B;AAAA,MAC/B,QAAQ;AAAA,aACD;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA;AAAA,UAEP,OAAO;AAAA;AAAA;AAAA,IAIL,sBAAsB,CAC5B,QACQ;AAAA,MACR,OAAO,WAAW,QAAQ,cAAc;AAAA;AAAA,IAGlC,sBAAsB,CAC5B,QACQ;AAAA,MACR,QAAQ;AAAA,aACD;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA;AAAA,UAEP,OAAO,WAAW;AAAA;AAAA;AAAA,IAIhB,qBAAqB,CAAC,QAA8C;AAAA,MAC1E,QAAQ;AAAA,aACD;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,aACA;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA;AAAA;AAAA,IAIL,mBAAmB,CAAC,QAA4C;AAAA,MACtE,QAAQ;AAAA,aACD;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA;AAAA,UAEP,OAAO,QAAQ;AAAA;AAAA;AAAA,IAIb,uBAAuB,CAC7B,QACQ;AAAA,MACR,QAAQ;AAAA,aACD;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA;AAAA;AAAA,IAIL,yBAAyB,CAC/B,SAC+B;AAAA,MAC/B,QAAQ;AAAA,aACD;AAAA,UACH,OAAO;AAAA;AAAA,UAEP,OAAO;AAAA;AAAA;AAAA,IAIL,yBAAyB,CAC/B,SAC+B;AAAA,MAC/B,MAAM,QAAQ,QAAQ,QAAQ,aAAa,EAAE;AAAA,MAC7C,QAAQ;AAAA,aACD;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA;AAAA,UAEP,OAAO;AAAA;AAAA;AAAA,IAIL,wBAAwB,CAC9B,SAC8B;AAAA,MAC9B,QAAQ;AAAA,aACD;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA;AAAA,UAEP,OAAO;AAAA;AAAA;AAAA,IAIL,sBAAsB,CAAC,SAA6C;AAAA,MAC1E,QAAQ;AAAA,aACD;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA;AAAA,UAEP,OAAO;AAAA;AAAA;AAAA,IAIL,0BAA0B,CAChC,SACgC;AAAA,MAChC,QAAQ;AAAA,aACD;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA;AAAA,UAEP,OAAO;AAAA;AAAA;AAAA,SAIC,cAAa,CACzB,SACA,YACwB;AAAA,MACxB,IAAI,KAAK,gBAAgB,kBAAkB,OAAO,GAAG;AAAA,QACnD,OAAO;AAAA,MACT;AAAA,MACA,IAAI,KAAK,gBAAgB,UAAU,GAAG;AAAA,QACpC,OAAO,4BAA4B,0CAA0C,KAAK,gBAAgB,QAAQ;AAAA,MAC5G;AAAA,MACA,MAAM,WAAW,MAAM,KAAK,gBAAgB,gBAC1C,SACA,UACF;AAAA,MACA,IAAI,SAAS,UAAU;AAAA,QACrB,OAAO;AAAA,MACT;AAAA,MACA,IAAI,SAAS,WAAW;AAAA,QACtB,OAAO,SAAS,SACZ,oCAAoC,SAAS,WAC7C,wCAAwC;AAAA,MAC9C;AAAA,MACA,OAAO,SAAS,SACZ,mCAAmC,SAAS,WAC5C,uCAAuC;AAAA;AAAA,SAG/B,wBAAuB,GAAoB;AAAA,MACvD,MAAM,MAAM,MAAM,wBAAwB;AAAA,MAC1C,OAAO,IAAI,SAAS,QAAQ;AAAA;AAAA,IAGtB,+BAA+B,CACrC,QACS;AAAA,MACT,OAAO,WAAW,gBAChB,WAAW,qBACX,WAAW,QACT,KAAK,SAAS,wBACd;AAAA;AAAA,IAGE,WAAW,CACjB,QACA,QACoB;AAAA,MACpB,OAAO;AAAA,QACL;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,QACpB;AAAA,QACA,SAAS;AAAA,MACX;AAAA;AAAA,IAGM,YAA4C,CAClD,OACA,QACG;AAAA,MACH,MAAM,UAAU;AAAA,MAChB,KAAK,WAAW,KAAK;AAAA,MACrB,OAAO;AAAA;AAAA,IAGD,SAAyC,CAC/C,OACA,QACG;AAAA,MACH,MAAM,UAAU;AAAA,MAChB,KAAK,WAAW,KAAK;AAAA,MACrB,OAAO;AAAA;AAAA,IAGD,eAAe,CACrB,OACA,QACkB;AAAA,MAClB,MAAM,aAA+B;AAAA,WAChC;AAAA,QACH,QAAQ,OAAO,UAAU,OAAO;AAAA,QAChC,aAAa,OAAO,eAAe,OAAO;AAAA,QAC1C,SAAS,OAAO,WAAW,OAAO;AAAA,QAClC,cAAc,OAAO,gBAAgB,OAAO;AAAA,MAC9C;AAAA,MACA,OAAO,WAAW,UACd,KAAK,aAAa,OAAO,UAAU,IACnC,KAAK,UAAU,OAAO,UAAU;AAAA;AAAA,IAG9B,mBAAmB,CACzB,OACA,QACsB;AAAA,MACtB,MAAM,aAAmC;AAAA,WACpC;AAAA,QACH,UAAU,OAAO,YAAY,OAAO;AAAA,QACpC,WAAW,OAAO,aAAa,OAAO;AAAA,QACtC,WAAW,OAAO,aAAa,OAAO;AAAA,QACtC,YAAY,OAAO,cAAc,OAAO;AAAA,MAC1C;AAAA,MACA,OAAO,WAAW,UACd,KAAK,aAAa,OAAO,UAAU,IACnC,KAAK,UAAU,OAAO,UAAU;AAAA;AAAA,IAG9B,iBAAiB,CACvB,YACA,QACA,YAAoB,cACoB;AAAA,MACxC,IAAI,CAAC,cAAc,WAAW,SAAS,GAAG;AAAA,QACxC,MAAM,IAAI,MAAM,GAAG,oCAAoC,QAAQ;AAAA,MACjE;AAAA;AAAA,IAGM,iBAAiB,CACvB,OACA,SACQ;AAAA,MACR,IAAI,CAAC,OAAO;AAAA,QACV,MAAM,IAAI,MAAM,OAAO;AAAA,MACzB;AAAA,MACA,OAAO;AAAA;AAAA,IAGD,aAAa,CAAC,OAA2B,SAAyB;AAAA,MACxE,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AAAA,QACxD,MAAM,IAAI,MAAM,OAAO;AAAA,MACzB;AAAA,MACA,OAAO;AAAA;AAAA,IAGD,mBAAmB,CAAC,QAAoC;AAAA,MAC9D,OACE,OAAO,YACP,OAAO,eACP,KAAK,kBAAkB,WAAW,qCAAqC;AAAA;AAAA,IAInE,iBAAiB,CACvB,OACgB;AAAA,MAChB,QAAQ,OAAO,SAAS,MAAM,EAAE,YAAY;AAAA,aACrC;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,aACA;AAAA,UACH,OAAO;AAAA,aACJ;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,UACH,OAAO;AAAA;AAAA,UAEP,OAAO;AAAA;AAAA;AAAA,IAIL,oBAAoB,GAAW;AAAA,MACrC,OAAO,MAAK,KAAK,IAAG,QAAQ,GAAG,WAAW;AAAA;AAAA,IAGpC,cAAc,CAAC,OAAwC;AAAA,MAC7D,OAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,EAAE,OACpB,IAAI,gBAAgB,eAAe,SACrC,CACF;AAAA;AAAA,IAGM,UAAU,CAAC,OAAiC;AAAA,MAClD,KAAK,cAAc,KAAK,KAAK;AAAA,MAC7B,IAAI,KAAK,cAAc,SAAS,KAAK,SAAS,kBAAkB;AAAA,QAC9D,KAAK,cAAc,MAAM;AAAA,MAC3B;AAAA;AAAA,IAGM,UAAU,CAAC,SAA8B;AAAA,MAC/C,MAAM,aAAa,CAAC,QAAoC;AAAA,QACtD,IAAI;AAAA,UACF,MAAM,QAAQ,QAAQ,WAAW,GAAG;AAAA,UACpC,IACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AAAA,YACA,OAAO,OAAO,KAAK;AAAA,UACrB;AAAA,UACA,MAAM;AAAA,QAGR;AAAA;AAAA,MAGF,MAAM,kBAAkB,WAAW,sCAAsC;AAAA,MACzE,IAAI,oBAAoB,WAAW;AAAA,QACjC,KAAK,SAAS,wBACZ,oBAAoB,WAAW,oBAAoB;AAAA,MACvD;AAAA,MAEA,MAAM,UAAU,WAAW,gCAAgC;AAAA,MAC3D,IAAI,SAAS;AAAA,QACX,MAAM,iBAAiB,OAAO,SAAS,SAAS,EAAE;AAAA,QAClD,IAAI,OAAO,SAAS,cAAc,KAAK,iBAAiB,GAAG;AAAA,UACzD,KAAK,SAAS,kBAAkB;AAAA,QAClC;AAAA,MACF;AAAA,MAEA,MAAM,eAAe,WAAW,4BAA4B;AAAA,MAC5D,IAAI,gBAAgB,gBAAe,YAAY,GAAG;AAAA,QAChD,KAAK,SAAS,eAAe;AAAA,QAC7B,KAAK,gBAAgB,QAAQ,YAAY;AAAA,MAC3C;AAAA,MAEA,MAAM,mBAAkB,WAAW,+BAA+B;AAAA,MAClE,IAAI,qBAAoB,WAAW;AAAA,QACjC,KAAK,SAAS,kBACZ,qBAAoB,UAAU,qBAAoB;AAAA,MACtD;AAAA,MACA,yBAAyB;AAAA,QACvB,UAAU,KAAK,SAAS,mBAAmB;AAAA,MAC7C,CAAC;AAAA;AAAA,IAGK,kBAAkB,GAAyB;AAAA,MACjD,OAAO,2BAA2B;AAAA,QAChC,QAAQ,gBAAgB;AAAA,QACxB;AAAA,QACA;AAAA,QACA,OAAO,QAAQ,IAAI;AAAA,MACrB,CAAC;AAAA;AAAA,EAEL;AAAA;;;AC5jDA,yBAAS;AACT,yBAAS,6BAAc;AACvB,qBAAS,qBAAU;AACnB,iBAAS;AA6BF,SAAS,qBAAqB,GAAY;AAAA,EAC/C,MAAM,MAAK,UAAS;AAAA,EACpB,IAAI,QAAO,YAAY,QAAO,SAAS;AAAA,IACrC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,QAAO,SAAS;AAAA,IAClB,OAAO,QACL,QAAQ,IAAI,SAAS,KAAK,KACxB,QAAQ,IAAI,iBAAiB,KAAK,KAClC,QAAQ,IAAI,YAAY,KAAK,CACjC;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,cAAa,CAAC,SAA0B;AAAA,EACtD,IAAI;AAAA,IACF,MAAM,QAAQ,UAAS,MAAM,UAAU,UAAU;AAAA,IACjD,cAAa,OAAO,CAAC,OAAO,GAAG;AAAA,MAC7B,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AAAA,IACD,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIJ,SAAS,wBAAwB,CACtC,QACQ;AAAA,EACR,MAAM,MAAK,UAAS;AAAA,EACpB,MAAM,UAAU,MAAK,QAAO,GAAG,sBAAsB,KAAK,IAAI,OAAO;AAAA,EAErE,IAAI;AAAA,IACF,IAAI,QAAO,UAAU;AAAA,MACnB,IAAI,QAAQ;AAAA,QACV,wBAAwB;AAAA,UACtB,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,SAAS,OAAO;AAAA,UACpD;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,EAAO;AAAA,QACL,wBAAwB,CAAC,MAAM,OAAO,CAAC;AAAA;AAAA,IAE3C,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,IAAI,CAAC,sBAAsB,GAAG;AAAA,QAC5B,MAAM,IAAI,MAAM,oCAAoC;AAAA,MACtD;AAAA,MACA,IAAI,eAAc,QAAQ,GAAG;AAAA,QAC3B,IAAI,QAAQ;AAAA,UACV,YACE,UACA;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA,GAAG,OAAO,SAAS,OAAO,UAAU,OAAO,KAAK,OAAO;AAAA,YACvD;AAAA,UACF,GACA,GACF;AAAA,QACF,EAAO;AAAA,UACL,YAAW,UAAU,CAAC,WAAW,QAAQ,OAAO,GAAG,GAAK;AAAA;AAAA,MAE5D,EAAO,SAAI,eAAc,OAAO,GAAG;AAAA,QACjC,YAAW,SAAS,CAAC,OAAO,GAAG,GAAK;AAAA,MACtC,EAAO,SAAI,eAAc,kBAAkB,GAAG;AAAA,QAC5C,YAAW,oBAAoB,CAAC,MAAM,OAAO,GAAG,GAAK;AAAA,MACvD,EAAO;AAAA,QACL,MAAM,IAAI,MACR,gFACF;AAAA;AAAA,IAEJ,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,MAAM,cAAc,QAAQ,QAAQ,OAAO,IAAI,EAAE,QAAQ,MAAM,IAAI;AAAA,MACnE,MAAM,YAAY;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,iBAAiB;AAAA,QACjB;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,MACX,cAAa,cAAc,CAAC,YAAY,SAAS,GAAG;AAAA,QAClD,SAAS;AAAA,QACT,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAClC,CAAC;AAAA,IACH,EAAO;AAAA,MACL,MAAM,IAAI,MAAM,yCAAyC,KAAI;AAAA;AAAA,IAG/D,MAAM,OAAO,cAAa,OAAO;AAAA,IACjC,eAAe,OAAO;AAAA,IACtB,OAAO;AAAA,IACP,OAAO,OAAO;AAAA,IACd,eAAe,OAAO;AAAA,IACtB,MAAM;AAAA;AAAA;AAIH,SAAS,kBAAkB,GAAwB;AAAA,EACxD,MAAM,MAAK,UAAS;AAAA,EAEpB,IAAI,QAAO,UAAU;AAAA,IACnB,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgBf,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,SAAS,cAAa,aAAa,CAAC,MAAM,MAAM,GAAG;AAAA,QACjD,UAAU;AAAA,QACV,SAAS;AAAA,QACT,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,MACpC,CAAC;AAAA,MACD,MAAM;AAAA,MACN,MAAM,IAAI,MACR,8FACF;AAAA;AAAA,IAEF,OAAO,OACJ,MAAM;AAAA,CAAI,EACV,OAAO,OAAO,EACd,IAAI,CAAC,UAAU;AAAA,MACd,MAAM,QAAQ,MAAM,MAAM,KAAK;AAAA,MAC/B,OAAO;AAAA,QACL,KAAK,MAAM,MAAM;AAAA,QACjB,OAAO,MAAM,MAAM;AAAA,QACnB,IAAI,MAAM,MAAM;AAAA,MAClB;AAAA,KACD;AAAA,EACL;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,IAAI,eAAc,QAAQ,GAAG;AAAA,MAC3B,MAAM,SAAS,cAAa,UAAU,CAAC,IAAI,GAAG;AAAA,QAC5C,UAAU;AAAA,QACV,SAAS;AAAA,MACX,CAAC;AAAA,MACD,OAAO,OACJ,MAAM;AAAA,CAAI,EACV,OAAO,OAAO,EACd,IAAI,CAAC,SAAS;AAAA,QACb,MAAM,QAAQ,KAAK,MAAM,4BAA4B;AAAA,QACrD,OAAO;AAAA,UACL,IAAI,QAAQ,MAAM;AAAA,UAClB,OAAO,QAAQ,IAAI,KAAK,KAAK,KAAK,KAAK;AAAA,UACvC,KAAK;AAAA,QACP;AAAA,OACD;AAAA,IACL;AAAA,IACA,IAAI,eAAc,SAAS,GAAG;AAAA,MAC5B,MAAM,SAAS,cACb,MACA,CAAC,MAAM,oDAAoD,GAC3D;AAAA,QACE,UAAU;AAAA,QACV,SAAS;AAAA,MACX,CACF;AAAA,MACA,OAAO,OACJ,MAAM;AAAA,CAAI,EACV,OAAO,OAAO,EACd,IAAI,CAAC,OAAO,WAAW;AAAA,QACtB,IAAI,OAAO,KAAK;AAAA,QAChB,OAAO,MAAM,KAAK;AAAA,QAClB,KAAK;AAAA,MACP,EAAE;AAAA,IACN;AAAA,EACF;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,MAAM,SAAS,cACb,cACA;AAAA,MACE;AAAA,MACA;AAAA,IACF,GACA,EAAE,UAAU,SAAS,SAAS,IAAM,CACtC;AAAA,IACA,IAAI,CAAC,OAAO,KAAK,GAAG;AAAA,MAClB,OAAO,CAAC;AAAA,IACV;AAAA,IACA,MAAM,SAAS,KAAK,MAAM,MAAM;AAAA,IAGhC,MAAM,YAAY,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAAA,IAC1D,OAAO,UAAU,IAAI,CAAC,cAAa;AAAA,MACjC,IAAI,OAAO,SAAQ,EAAE;AAAA,MACrB,OAAO,SAAQ;AAAA,MACf,KAAK;AAAA,IACP,EAAE;AAAA,EACJ;AAAA,EAEA,OAAO,CAAC;AAAA;AAGH,SAAS,mBAAmB,CACjC,GACA,GACA,SAA6B,QACvB;AAAA,EACN,MAAM,MAAK,UAAS;AAAA,EAEpB,IAAI,QAAO,UAAU;AAAA,IACnB,IAAI,eAAc,UAAU,GAAG;AAAA,MAC7B,MAAM,eAAe,WAAW,UAAU,OAAO;AAAA,MACjD,YAAW,YAAY,CAAC,GAAG,gBAAgB,KAAK,GAAG,GAAG,IAAI;AAAA,MAC1D;AAAA,IACF;AAAA,IACA,YACE,aACA,CAAC,MAAM,iDAAiD,MAAM,IAAI,GAClE,IACF;AAAA,IACA;AAAA,EACF;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,IAAI,CAAC,eAAc,SAAS,GAAG;AAAA,MAC7B,MAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAAA,IACA,MAAM,cAAc,WAAW,UAAU,MAAM;AAAA,IAC/C,YACE,WACA,CAAC,aAAa,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,SAAS,WAAW,GACxD,IACF;AAAA,IACA;AAAA,EACF;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,yBAAyB,GAAG,GAAG,WAAW,UAAU,UAAU,QAAQ,CAAC;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,MAAM,4CAA4C,KAAI;AAAA;AAG3D,SAAS,yBAAyB,CACvC,GACA,GACA,SAA6B,QACvB;AAAA,EACN,MAAM,MAAK,UAAS;AAAA,EAEpB,IAAI,QAAO,YAAY,eAAc,UAAU,KAAK,WAAW,QAAQ;AAAA,IACrE,YAAW,YAAY,CAAC,MAAM,KAAK,GAAG,GAAG,IAAI;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,IAAI,CAAC,eAAc,SAAS,GAAG;AAAA,MAC7B,MAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAAA,IACA,MAAM,cAAc,WAAW,UAAU,MAAM;AAAA,IAC/C,YACE,WACA;AAAA,MACE;AAAA,MACA,OAAO,CAAC;AAAA,MACR,OAAO,CAAC;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,GACA,IACF;AAAA,IACA;AAAA,EACF;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,yBAAyB,GAAG,GAAG,WAAW,UAAU,UAAU,QAAQ,CAAC;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,oBAAoB,GAAG,GAAG,MAAM;AAAA,EAChC,oBAAoB,GAAG,GAAG,MAAM;AAAA;AAG3B,SAAS,uBAAuB,CAAC,GAAW,GAAiB;AAAA,EAClE,MAAM,MAAK,UAAS;AAAA,EAEpB,IAAI,QAAO,UAAU;AAAA,IACnB,IAAI,CAAC,eAAc,UAAU,GAAG;AAAA,MAC9B,MAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AAAA,IACA,YAAW,YAAY,CAAC,KAAK,KAAK,GAAG,GAAG,IAAI;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,IAAI,CAAC,eAAc,SAAS,GAAG;AAAA,MAC7B,MAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AAAA,IACA,YAAW,WAAW,CAAC,aAAa,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,MAAM,WAAW;AAAA,MACf;AAAA,MACA,6EAA6E,KAAK;AAAA,IACpF,EAAE,KAAK,IAAI;AAAA,IACX,YAAW,cAAc,CAAC,YAAY,QAAQ,GAAG,IAAI;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,MAAM,yCAAyC,KAAI;AAAA;AAGxD,SAAS,oBAAoB,CAAC,QAAgB,QAAsB;AAAA,EACzE,MAAM,MAAK,UAAS;AAAA,EACpB,MAAM,cAAc,iBAAiB,MAAM;AAAA,EAC3C,MAAM,cAAc,iBAAiB,MAAM;AAAA,EAE3C,IAAI,gBAAgB,KAAK,gBAAgB,GAAG;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,IAAI,QAAO,UAAU;AAAA,IACnB,MAAM,WAAW;AAAA,MACf;AAAA,MACA,6DAA6D,CAAC,gBAAgB,CAAC;AAAA,MAC/E;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,IACX,YAAW,aAAa,CAAC,MAAM,cAAc,MAAM,QAAQ,GAAG,IAAI;AAAA,IAClE;AAAA,EACF;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,IAAI,CAAC,eAAc,SAAS,GAAG;AAAA,MAC7B,MAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAAA,IACA,gBAAgB,cAAc,IAAI,MAAM,KAAK,KAAK,IAAI,WAAW,CAAC;AAAA,IAClE,gBAAgB,cAAc,IAAI,MAAM,KAAK,KAAK,IAAI,WAAW,CAAC;AAAA,IAClE;AAAA,EACF;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,MAAM,WAAW;AAAA,MACf;AAAA,MACA,iDAAiD,cAAc;AAAA,IACjE,EAAE,KAAK,IAAI;AAAA,IACX,YAAW,cAAc,CAAC,YAAY,QAAQ,GAAG,IAAI;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,MAAM,qCAAqC,KAAI;AAAA;AAGpD,SAAS,uBAAuB,CAAC,MAAoB;AAAA,EAC1D,MAAM,MAAK,UAAS;AAAA,EAEpB,IAAI,QAAO,UAAU;AAAA,IACnB,IAAI,eAAc,UAAU,GAAG;AAAA,MAC7B,YAAW,YAAY,CAAC,KAAK,MAAM,GAAG,GAAK;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,YACE,aACA;AAAA,MACE;AAAA,MACA,iDAAiD,2BAA2B,IAAI;AAAA,IAClF,GACA,GACF;AAAA,IACA;AAAA,EACF;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,IAAI,CAAC,eAAc,SAAS,GAAG;AAAA,MAC7B,MAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAAA,IACA,YAAW,WAAW,CAAC,QAAQ,MAAM,IAAI,GAAG,GAAK;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,MAAM,UAAU,KAAK,QAAQ,MAAM,IAAI;AAAA,IACvC,YACE,cACA;AAAA,MACE;AAAA,MACA,2FAA2F;AAAA,IAC7F,GACA,GACF;AAAA,IACA;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,MAAM,yCAAyC,KAAI;AAAA;AAGxD,SAAS,sBAAsB,CAAC,MAAoB;AAAA,EACzD,MAAM,MAAK,UAAS;AAAA,EAEpB,IAAI,QAAO,UAAU;AAAA,IACnB,IAAI,eAAc,UAAU,GAAG;AAAA,MAC7B,MAAM,cAAc,cAAc,IAAI;AAAA,MACtC,IAAI,aAAa;AAAA,QACf,YAAW,YAAY,CAAC,MAAM,aAAa,GAAG,IAAI;AAAA,MACpD,EAAO;AAAA,QACL,YAAW,YAAY,CAAC,KAAK,MAAM,GAAG,IAAI;AAAA;AAAA,MAE5C;AAAA,IACF;AAAA,IAEA,MAAM,UAAU,WAAW,IAAI;AAAA,IAC/B,IAAI,YAAY,MAAM;AAAA,MACpB,YACE,aACA,CAAC,MAAM,gDAAgD,SAAS,GAChE,IACF;AAAA,MACA;AAAA,IACF;AAAA,IAEA,YACE,aACA;AAAA,MACE;AAAA,MACA,iDAAiD,2BAA2B,IAAI;AAAA,IAClF,GACA,IACF;AAAA,IACA;AAAA,EACF;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,IAAI,CAAC,eAAc,SAAS,GAAG;AAAA,MAC7B,MAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AAAA,IACA,YAAW,WAAW,CAAC,OAAO,aAAa,IAAI,CAAC,GAAG,IAAI;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,MAAM,UAAU,kBAAiB,IAAI,EAAE,QAAQ,MAAM,IAAI;AAAA,IACzD,YACE,cACA;AAAA,MACE;AAAA,MACA,2FAA2F;AAAA,IAC7F,GACA,IACF;AAAA,IACA;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,MAAM,wCAAwC,KAAI;AAAA;AAG9D,SAAS,aAAa,CAAC,MAA6B;AAAA,EAClD,MAAM,SAAiC;AAAA,IACrC,WAAW;AAAA,IACX,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,KAAK;AAAA,IACL,IAAI;AAAA,EACN;AAAA,EACA,OAAO,OAAO,KAAK,KAAK,EAAE,YAAY,MAAM;AAAA;AAG9C,SAAS,YAAY,CAAC,MAAsB;AAAA,EAC1C,MAAM,SAAiC;AAAA,IACrC,WAAW;AAAA,IACX,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,KAAK;AAAA,IACL,IAAI;AAAA,EACN;AAAA,EACA,MAAM,aAAa,KAAK,KAAK,EAAE,YAAY;AAAA,EAC3C,OAAO,OAAO,eAAe,KAAK,KAAK;AAAA;AAGzC,SAAS,iBAAgB,CAAC,MAAsB;AAAA,EAC9C,MAAM,SAAiC;AAAA,IACrC,WAAW;AAAA,IACX,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,KAAK;AAAA,IACL,IAAI;AAAA,EACN;AAAA,EACA,MAAM,aAAa,KAAK,KAAK,EAAE,YAAY;AAAA,EAC3C,OAAO,OAAO,eAAe;AAAA;AAGxB,SAAS,gCAAgC,GAA+B;AAAA,EAC7E,MAAM,MAAK,UAAS;AAAA,EACpB,MAAM,aAAa,sBAAsB;AAAA,EAEzC,OAAO;AAAA,IACL,YAAY;AAAA,MACV,WAAW;AAAA,MACX,MAAM,aAAa,oBAAoB;AAAA,IACzC;AAAA,IACA,YAAY,2BAA2B,GAAE;AAAA,IACzC,aAAa,4BAA4B,GAAE;AAAA,IAC3C,YAAY,2BAA2B,GAAE;AAAA,EAC3C;AAAA;AAGF,SAAS,0BAA0B,CACjC,KAC0B;AAAA,EAC1B,IAAI,QAAO,UAAU;AAAA,IACnB,OAAO,oBAAoB,IACvB,EAAE,WAAW,MAAM,MAAM,2BAA2B,IACpD;AAAA,MACE,WAAW;AAAA,MACX,MAAM;AAAA,IACR;AAAA,EACN;AAAA,EACA,IAAI,QAAO,SAAS;AAAA,IAClB,IAAI,CAAC,sBAAsB,GAAG;AAAA,MAC5B,OAAO,EAAE,WAAW,OAAO,MAAM,0BAA0B;AAAA,IAC7D;AAAA,IACA,IAAI,eAAc,QAAQ,GAAG;AAAA,MAC3B,OAAO,EAAE,WAAW,MAAM,MAAM,qBAAqB;AAAA,IACvD;AAAA,IACA,IAAI,eAAc,OAAO,GAAG;AAAA,MAC1B,OAAO,EAAE,WAAW,MAAM,MAAM,QAAQ;AAAA,IAC1C;AAAA,IACA,IAAI,eAAc,kBAAkB,GAAG;AAAA,MACrC,OAAO,EAAE,WAAW,MAAM,MAAM,mBAAmB;AAAA,IACrD;AAAA,IACA,OAAO;AAAA,MACL,WAAW;AAAA,MACX,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,IAAI,QAAO,SAAS;AAAA,IAClB,OAAO,EAAE,WAAW,MAAM,MAAM,4BAA4B;AAAA,EAC9D;AAAA,EACA,OAAO,EAAE,WAAW,OAAO,MAAM,uBAAuB;AAAA;AAG1D,SAAS,2BAA2B,CAClC,KAC0B;AAAA,EAC1B,IAAI,QAAO,UAAU;AAAA,IACnB,IAAI,eAAc,UAAU,GAAG;AAAA,MAC7B,OAAO,EAAE,WAAW,MAAM,MAAM,WAAW;AAAA,IAC7C;AAAA,IACA,OAAO,EAAE,WAAW,MAAM,MAAM,wBAAwB;AAAA,EAC1D;AAAA,EACA,IAAI,QAAO,SAAS;AAAA,IAClB,IAAI,CAAC,sBAAsB,GAAG;AAAA,MAC5B,OAAO,EAAE,WAAW,OAAO,MAAM,0BAA0B;AAAA,IAC7D;AAAA,IACA,IAAI,eAAc,SAAS,GAAG;AAAA,MAC5B,OAAO,EAAE,WAAW,MAAM,MAAM,UAAU;AAAA,IAC5C;AAAA,IACA,OAAO,EAAE,WAAW,OAAO,MAAM,yBAAyB;AAAA,EAC5D;AAAA,EACA,IAAI,QAAO,SAAS;AAAA,IAClB,OAAO,EAAE,WAAW,MAAM,MAAM,sBAAsB;AAAA,EACxD;AAAA,EACA,OAAO,EAAE,WAAW,OAAO,MAAM,uBAAuB;AAAA;AAG1D,SAAS,0BAA0B,CACjC,KAC0B;AAAA,EAC1B,IAAI,QAAO,UAAU;AAAA,IACnB,OAAO,sBAAsB,IACzB,EAAE,WAAW,MAAM,MAAM,cAAc,IACvC;AAAA,MACE,WAAW;AAAA,MACX,MAAM;AAAA,IACR;AAAA,EACN;AAAA,EACA,IAAI,QAAO,SAAS;AAAA,IAClB,IAAI,eAAc,QAAQ,GAAG;AAAA,MAC3B,OAAO,EAAE,WAAW,MAAM,MAAM,SAAS;AAAA,IAC3C;AAAA,IACA,IAAI,eAAc,SAAS,GAAG;AAAA,MAC5B,OAAO,EAAE,WAAW,MAAM,MAAM,UAAU;AAAA,IAC5C;AAAA,IACA,OAAO;AAAA,MACL,WAAW;AAAA,MACX,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,IAAI,QAAO,SAAS;AAAA,IAClB,OAAO,EAAE,WAAW,MAAM,MAAM,yBAAyB;AAAA,EAC3D;AAAA,EACA,OAAO,EAAE,WAAW,OAAO,MAAM,uBAAuB;AAAA;AAG1D,SAAS,WAAU,CAAC,SAAiB,MAAgB,SAAuB;AAAA,EAC1E,cAAa,SAAS,MAAM;AAAA,IAC1B;AAAA,IACA,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,EAClC,CAAC;AAAA;AAGH,SAAS,uBAAuB,CAAC,MAAsB;AAAA,EACrD,IAAI;AAAA,IACF,YAAW,iBAAiB,MAAM,GAAK;AAAA,IACvC,MAAM;AAAA,IACN,MAAM,IAAI,MACR,iGACF;AAAA;AAAA;AAIJ,SAAS,mBAAmB,GAAY;AAAA,EACtC,MAAM,UAAU,MAAK,QAAO,GAAG,4BAA4B,KAAK,IAAI,OAAO;AAAA,EAC3E,IAAI;AAAA,IACF,YAAW,iBAAiB,CAAC,MAAM,aAAa,OAAO,GAAG,IAAI;AAAA,IAC9D,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,YACP;AAAA,IACA,eAAe,OAAO;AAAA;AAAA;AAI1B,SAAS,qBAAqB,GAAY;AAAA,EACxC,IAAI;AAAA,IACF,cACE,aACA,CAAC,MAAM,wDAAwD,GAC/D;AAAA,MACE,UAAU;AAAA,MACV,SAAS;AAAA,MACT,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,IACpC,CACF;AAAA,IACA,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,SAAS,cAAc,CAAC,UAAwB;AAAA,EAC9C,IAAI;AAAA,IACF,YAAW,QAAQ;AAAA,IACnB,MAAM;AAAA;AAKV,SAAS,0BAA0B,CAAC,OAAuB;AAAA,EACzD,OAAO,IAAI,MAAM,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,MAAK;AAAA;AAG7D,SAAS,UAAU,CAAC,MAA6B;AAAA,EAC/C,MAAM,mBAA2C;AAAA,IAC/C,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,IAAI;AAAA,EACN;AAAA,EACA,MAAM,aAAa,KAAK,KAAK,EAAE,YAAY;AAAA,EAC3C,MAAM,aAAa,iBAAiB;AAAA,EACpC,IAAI,eAAe,WAAW;AAAA,IAC5B,OAAO;AAAA,EACT;AAAA,EACA,MAAM,cAAc,OAAO,KAAK,KAAK,CAAC;AAAA,EACtC,OAAO,OAAO,UAAU,WAAW,IAAI,cAAc;AAAA;AAGvD,SAAS,wBAAwB,CAC/B,GACA,GACA,QACA,QACM;AAAA,EACN,MAAM,WAAW,WAAW,UAAU,WAAW;AAAA,EACjD,MAAM,SAAS,WAAW,UAAU,WAAW;AAAA,EAC/C,MAAM,SAAS,MAAM,KACnB,EAAE,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC,EAAE,GAC3C,MACE,mCAAmC,0DAA0D,qBACjG,EAAE,KAAK,IAAI;AAAA,EACX,MAAM,WAAW;AAAA,IACf;AAAA,IACA,6EAA6E,KAAK;AAAA,IAClF;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,YAAW,cAAc,CAAC,YAAY,QAAQ,GAAG,IAAI;AAAA;AAGvD,SAAS,gBAAgB,CAAC,OAAuB;AAAA,EAC/C,IAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAAA,IAC3B,OAAO;AAAA,EACT;AAAA,EACA,OAAO,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC;AAAA;AAGtD,SAAS,eAAe,CAAC,QAAgB,OAAqB;AAAA,EAC5D,SAAS,QAAQ,EAAG,QAAQ,OAAO,SAAS,GAAG;AAAA,IAC7C,YAAW,WAAW,CAAC,SAAS,MAAM,GAAG,IAAI;AAAA,EAC/C;AAAA;AAGK,SAAS,sBAAsB,GAAoB;AAAA,EACxD,OAAO,UAAS;AAAA;AAAA;;;AC9vBlB,SAAS,QAAQ,CACf,KACA,QACA,MACM;AAAA,EACN,IAAI,IAAI;AAAA,IAAa;AAAA,EACrB,IAAI,aAAa;AAAA,EACjB,IAAI,UAAU,gBAAgB,iCAAiC;AAAA,EAC/D,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC;AAAA;AAG9B,SAAS,uBAAuB,CAAC,KAAgC;AAAA,EAC/D,IAAI,UAAU,KAAK;AAAA,IACjB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,YAAY;AAAA,EACd,CAAC;AAAA,EACD,IAAI,MACF,SAAS,KAAK,UAAU,EAAE,MAAM,YAAY,UAAU,yBAAwB,CAAC;AAAA;AAAA,CACjF;AAAA;AAGF,eAAsB,uBAAuB,CAC3C,KACA,KACA,UACA,QACkB;AAAA,EAClB,IAAI,CAAC,SAAS,WAAW,oBAAoB,GAAG;AAAA,IAC9C,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,WAAW,SAAS,aAAa,+BAA+B;AAAA,IAClE,SAAS,KAAK,KAAK,wBAAuB;AAAA,IAC1C,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,WAAW,SAAS,aAAa,sCAAsC;AAAA,IACzE,wBAAwB,GAAG;AAAA,IAC3B,IAAI,GAAG,SAAS,MAAM;AAAA,MACpB,IAAI,IAAI;AAAA,KACT;AAAA,IACD,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,WAAW,UAAU,aAAa,mCAAmC;AAAA,IACvE,SAAS,KAAK,KAAK,EAAE,MAAM,yBAAwB,KAAK,CAAC;AAAA,IACzD,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,mBAAmB,4CAA4C,KACnE,QACF;AAAA,EACA,IAAI,WAAW,UAAU,kBAAkB;AAAA,IACzC,SAAS,KAAK,KAAK;AAAA,MACjB,OAAO;AAAA,MACP,IAAI,mBAAmB,iBAAiB,MAAM,EAAE;AAAA,IAClD,CAAC;AAAA,IACD,OAAO;AAAA,EACT;AAAA,EAEA,OAAO;AAAA;AAAA,IAnEH;AAAA;AAAA,6BAA0B;AAAA,IAC9B,MAAM;AAAA,IACN,cAAc;AAAA,IACd,kBAAkB,CAAC;AAAA,EACrB;AAAA;;;ACJA,yBAAS,2BAAc;AACvB,yBAAS,6BAAc;AAEvB,qBAAS,qBAAU;AACnB,iBAAS;AACT;AAAA,kBACE;AAAA;AAAA,cAEA;AAAA;AAkEF,eAAsB,kBAAkB,CACtC,KACA,KACA,UACA,QACA,OACkB;AAAA,EAClB,IAAI,CAAC,SAAS,WAAW,cAAc,GAAG;AAAA,IACxC,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,MAAM;AAAA,EAGlB,IAAI,WAAW,SAAS,aAAa,yBAAyB;AAAA,IAC5D,UAAS,KAAK,KAAK,gBAAgB,CAAC;AAAA,IACpC,OAAO;AAAA,EACT;AAAA,EAIA,IAAI,WAAW,UAAU,aAAa,6BAA6B;AAAA,IACjE,IAAI;AAAA,MACF,MAAM,SAAS,mBAAmB;AAAA,MAClC,UAAS,KAAK,KAAK,MAAM;AAAA,MACzB,OAAO,KAAK;AAAA,MACZ,UAAS,KAAK,KAAK;AAAA,QACjB,SAAS;AAAA,QACT,OAAO,2BAA2B,OAAO,GAAG;AAAA,MAC9C,CAAC;AAAA;AAAA,IAEH,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,CAAC,KAAK;AAAA,IACR,UAAS,KAAK,KAAK;AAAA,MACjB,OAAO;AAAA,IACT,CAAC;AAAA,IACD,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,SAAS,aAAa,uBAAuB;AAAA,IAC1D,UAAS,KAAK,KAAK,IAAI,UAAU,CAAC;AAAA,IAClC,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,SAAS,aAAa,uBAAuB;AAAA,IAC1D,MAAM,SAAS,IAAI,YAAY;AAAA,IAC/B,UAAS,KAAK,KAAK,EAAE,QAAQ,OAAO,MAAM,IAAI,EAAE,CAAC;AAAA,IACjD,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,UAAU,aAAa,sBAAsB;AAAA,IAC1D,IAAI;AAAA,MACF,MAAM,IAAI,MAAM;AAAA,MAChB,UAAS,KAAK,KAAK,IAAI,UAAU,CAAC;AAAA,MAClC,OAAO,KAAK;AAAA,MACZ,UAAS,KAAK,KAAK;AAAA,QACjB,OAAO,4BAA4B,OAAO,GAAG;AAAA,MAC/C,CAAC;AAAA;AAAA,IAEH,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,UAAU,aAAa,qBAAqB;AAAA,IACzD,IAAI;AAAA,MACF,MAAM,IAAI,KAAK;AAAA,MACf,UAAS,KAAK,KAAK,IAAI,UAAU,CAAC;AAAA,MAClC,OAAO,KAAK;AAAA,MACZ,UAAS,KAAK,KAAK;AAAA,QACjB,OAAO,2BAA2B,OAAO,GAAG;AAAA,MAC9C,CAAC;AAAA;AAAA,IAEH,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,UAAU,aAAa,wBAAwB;AAAA,IAC5D,IAAI;AAAA,MACF,MAAM,IAAI,QAAQ;AAAA,MAClB,UAAS,KAAK,KAAK,IAAI,UAAU,CAAC;AAAA,MAClC,OAAO,KAAK;AAAA,MACZ,UAAS,KAAK,KAAK;AAAA,QACjB,OAAO,oBAAoB,OAAO,GAAG;AAAA,MACvC,CAAC;AAAA;AAAA,IAEH,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,UAAU,aAAa,qBAAqB;AAAA,IACzD,MAAM,SAAS,MAAM,aAIlB,KAAK,GAAG;AAAA,IACX,IAAI,CAAC;AAAA,MAAQ,OAAO;AAAA,IAEpB,IAAI,CAAC,OAAO,WAAW,OAAO,OAAO,YAAY,UAAU;AAAA,MACzD,UAAS,KAAK,KAAK,EAAE,OAAO,0BAA0B,CAAC;AAAA,MACvD,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,SAAS,MAAM,IAAI,KAAK;AAAA,MAC5B,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,MAChB,WAAW,OAAO;AAAA,IACpB,CAAC;AAAA,IAED,UAAS,KAAK,OAAO,aAAa,IAAI,MAAM,KAAK,MAAM;AAAA,IACvD,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,SAAS,aAAa,wBAAwB;AAAA,IAC3D,UAAS,KAAK,KAAK;AAAA,MACjB,aAAa,IAAI,sBAAsB;AAAA,MACvC,YAAY,IAAI,qBAAqB;AAAA,MACrC,eAAe,IAAI,wBAAwB;AAAA,IAC7C,CAAC;AAAA,IACD,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,SAAS,aAAa,kCAAkC;AAAA,IACrE,IAAI;AAAA,MACF,MAAM,aAAa,mBAAkB;AAAA,MACrC,IAAI,UAAU,KAAK;AAAA,QACjB,gBAAgB;AAAA,QAChB,kBAAkB,WAAW;AAAA,MAC/B,CAAC;AAAA,MACD,IAAI,IAAI,UAAU;AAAA,MAClB,OAAO,KAAK;AAAA,MACZ,UAAS,KAAK,KAAK;AAAA,QACjB,OAAO,sBAAsB,OAAO,GAAG;AAAA,MACzC,CAAC;AAAA;AAAA,IAEH,OAAO;AAAA,EACT;AAAA,EAIA,IAAI,WAAW,UAAU,aAAa,kCAAkC;AAAA,IACtE,MAAM,UAAU,MAAM,SAAS,GAAG;AAAA,IAClC,IAAI,CAAC,SAAS,KAAK,GAAG;AAAA,MACpB,UAAS,KAAK,KAAK;AAAA,QACjB,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,MAAM,mBAAkB,EAAE,SAAS,QAAQ;AAAA,MAC7C,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,IAEA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,cAAc,KAAK,MAAM,OAAO;AAAA,MAChC,MAAM;AAAA,MACN,UAAS,KAAK,KAAK,EAAE,OAAO,oBAAoB,CAAC;AAAA,MACjD,OAAO;AAAA;AAAA,IAGT,MAAM,SAAS,wBAAwB,WAAW;AAAA,IAClD,IAAI,OAAO,OAAO;AAAA,MAChB,UAAS,KAAK,KAAK,EAAE,OAAO,OAAO,MAAM,CAAC;AAAA,MAC1C,OAAO;AAAA,IACT;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,aAAa,mBAAkB,OAAO,MAAM;AAAA,MAClD,MAAM,SAAS,WAAW,SAAS,QAAQ;AAAA,MAC3C,UAAS,KAAK,KAAK;AAAA,QACjB,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,MAAM;AAAA,MACR,CAAC;AAAA,MACD,OAAO,KAAK;AAAA,MACZ,UAAS,KAAK,KAAK;AAAA,QACjB,OAAO,sBAAsB,OAAO,GAAG;AAAA,MACzC,CAAC;AAAA;AAAA,IAEH,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,SAAS,aAAa,+BAA+B;AAAA,IAClE,IAAI;AAAA,MACF,MAAM,UAAU,aAAY;AAAA,MAC5B,UAAS,KAAK,KAAK,EAAE,QAAQ,CAAC;AAAA,MAC9B,OAAO,KAAK;AAAA,MACZ,UAAS,KAAK,KAAK,EAAE,SAAS,CAAC,GAAG,OAAO,OAAO,GAAG,EAAE,CAAC;AAAA;AAAA,IAExD,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,UAAU,aAAa,6BAA6B;AAAA,IACjE,MAAM,OAAO,MAAM,SAAS,GAAG;AAAA,IAC/B,IAAI,aAAa;AAAA,IACjB,IAAI,MAAM;AAAA,MACR,IAAI;AAAA,MACJ,IAAI;AAAA,QACF,SAAS,KAAK,MAAM,IAAI;AAAA,QACxB,MAAM;AAAA,QACN,UAAS,KAAK,KAAK;AAAA,UACjB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,OAAO;AAAA;AAAA,MAGT,IACE,WAAW,QACX,OAAO,WAAW,YAClB,MAAM,QAAQ,MAAM,GACpB;AAAA,QACA,UAAS,KAAK,KAAK,EAAE,OAAO,qCAAqC,CAAC;AAAA,QAClE,OAAO;AAAA,MACT;AAAA,MAEA,MAAM,aAAa;AAAA,MAEnB,IAAI,OAAO,OAAO,YAAY,YAAY,GAAG;AAAA,QAC3C,MAAM,gBAAgB,WAAW;AAAA,QACjC,IAAI,OAAO,kBAAkB,UAAU;AAAA,UACrC,UAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,UACT,CAAC;AAAA,UACD,OAAO;AAAA,QACT;AAAA,QAGA,IAAI,CAAC,OAAO,SAAS,aAAa,GAAG;AAAA,UACnC,UAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,UACT,CAAC;AAAA,UACD,OAAO;AAAA,QACT;AAAA,QACA,IAAI,CAAC,OAAO,UAAU,aAAa,GAAG;AAAA,UACpC,UAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,UACT,CAAC;AAAA,UACD,OAAO;AAAA,QACT;AAAA,QACA,IACE,gBAAgB,gCAChB,gBAAgB,8BAChB;AAAA,UACA,UAAS,KAAK,KAAK;AAAA,YACjB,OAAO,8BAA8B,oCAAoC;AAAA,UAC3E,CAAC;AAAA,UACD,OAAO;AAAA,QACT;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,IAAI;AAAA,MACF,MAAM,QAAQ,MAAM,YAAY,UAAU;AAAA,MAC1C,UAAS,KAAK,KAAK;AAAA,QACjB,QAAQ;AAAA,QACR,UAAU;AAAA,QACV;AAAA,QACA,MAAM,MAAM,SAAS,QAAQ;AAAA,MAC/B,CAAC;AAAA,MACD,OAAO,KAAK;AAAA,MACZ,UAAS,KAAK,KAAK;AAAA,QACjB,OAAO,2BAA2B,OAAO,GAAG;AAAA,MAC9C,CAAC;AAAA;AAAA,IAEH,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,UAAU,aAAa,2BAA2B;AAAA,IAC/D,MAAM,SAAS,MAAM,aAAa,KAAK,GAAG;AAAA,IAC1C,IAAI,CAAC;AAAA,MAAQ,OAAO;AAAA,IAEpB,IAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAAA,MAClE,UAAS,KAAK,KAAK,EAAE,OAAO,6BAA6B,CAAC;AAAA,MAC1D,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,UAAU;AAAA,IAChB,IAAI,OAAO,QAAQ,SAAS,YAAY,CAAC,QAAQ,KAAK,KAAK,GAAG;AAAA,MAC5D,UAAS,KAAK,KAAK,EAAE,OAAO,sCAAsC,CAAC;AAAA,MACnE,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,eAAe,mBAAmB,QAAQ,MAAM;AAAA,IACtD,IAAI,aAAa,OAAO;AAAA,MACtB,UAAS,KAAK,KAAK,EAAE,OAAO,aAAa,MAAM,CAAC;AAAA,MAChD,OAAO;AAAA,IACT;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,UAAU,OAAO,KAAK,QAAQ,MAAM,QAAQ,GAAG,aAAa,MAAM;AAAA,MACxE,UAAS,KAAK,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,MACpC,OAAO,KAAK;AAAA,MACZ,UAAS,KAAK,KAAK;AAAA,QACjB,OAAO,0BAA0B,OAAO,GAAG;AAAA,MAC7C,CAAC;AAAA;AAAA,IAEH,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,UAAU,aAAa,+BAA+B;AAAA,IACnE,MAAM,SAAS,MAAM,aAAa,KAAK,GAAG;AAAA,IAC1C,IAAI,CAAC;AAAA,MAAQ,OAAO;AAAA,IAEpB,MAAM,eAAe,oBAAoB,MAAM;AAAA,IAC/C,IAAI,aAAa,OAAO;AAAA,MACtB,UAAS,KAAK,KAAK,EAAE,OAAO,aAAa,MAAM,CAAC;AAAA,MAChD,OAAO;AAAA,IACT;AAAA,IAEA,IAAI;AAAA,MACF,QAAQ,GAAG,GAAG,WAAW;AAAA,MACzB,aAAa,GAAG,GAAG,MAAM;AAAA,MACzB,UAAS,KAAK,KAAK,EAAE,SAAS,MAAM,GAAG,GAAG,OAAO,CAAC;AAAA,MAClD,OAAO,KAAK;AAAA,MACZ,UAAS,KAAK,KAAK;AAAA,QACjB,OAAO,iBAAiB,OAAO,GAAG;AAAA,MACpC,CAAC;AAAA;AAAA,IAEH,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,UAAU,aAAa,8BAA8B;AAAA,IAClE,MAAM,SAAS,MAAM,aAAa,KAAK,GAAG;AAAA,IAC1C,IAAI,CAAC;AAAA,MAAQ,OAAO;AAAA,IAEpB,MAAM,cAAc,mBAAmB,MAAM;AAAA,IAC7C,IAAI,YAAY,OAAO;AAAA,MACrB,UAAS,KAAK,KAAK,EAAE,OAAO,YAAY,MAAM,CAAC;AAAA,MAC/C,OAAO;AAAA,IACT;AAAA,IAEA,IAAI;AAAA,MACF,QAAQ,SAAS;AAAA,MACjB,YAAY,IAAI;AAAA,MAChB,UAAS,KAAK,KAAK,EAAE,SAAS,MAAM,QAAQ,KAAK,OAAO,CAAC;AAAA,MACzD,OAAO,KAAK;AAAA,MACZ,UAAS,KAAK,KAAK;AAAA,QACjB,OAAO,gBAAgB,OAAO,GAAG;AAAA,MACnC,CAAC;AAAA;AAAA,IAEH,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,UAAU,aAAa,kCAAkC;AAAA,IACtE,MAAM,SAAS,MAAM,aAAa,KAAK,GAAG;AAAA,IAC1C,IAAI,CAAC;AAAA,MAAQ,OAAO;AAAA,IAEpB,MAAM,kBAAkB,uBAAuB,MAAM;AAAA,IACrD,IAAI,gBAAgB,OAAO;AAAA,MACzB,UAAS,KAAK,KAAK,EAAE,OAAO,gBAAgB,MAAM,CAAC;AAAA,MACnD,OAAO;AAAA,IACT;AAAA,IAEA,IAAI;AAAA,MACF,QAAQ,SAAS;AAAA,MACjB,gBAAgB,IAAI;AAAA,MACpB,UAAS,KAAK,KAAK,EAAE,SAAS,MAAM,KAAK,CAAC;AAAA,MAC1C,OAAO,KAAK;AAAA,MACZ,UAAS,KAAK,KAAK;AAAA,QACjB,OAAO,oBAAoB,OAAO,GAAG;AAAA,MACvC,CAAC;AAAA;AAAA,IAEH,OAAO;AAAA,EACT;AAAA,EAIA,IAAI,WAAW,UAAU,aAAa,qBAAqB;AAAA,IACzD,MAAM,SAAS,MAAM;AAAA,IACrB,IAAI,CAAC,QAAQ;AAAA,MACX,UAAS,KAAK,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAAA,MAC9D,OAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAO,MAAM,aAAsB,KAAK,GAAG;AAAA,IACjD,IAAI,SAAS;AAAA,MAAM,OAAO;AAAA,IAC1B,MAAM,SAAS,6BAA6B,IAAI;AAAA,IAChD,IAAI,WAAW,QAAQ;AAAA,MACrB,UAAS,KAAK,KAAK,EAAE,OAAO,OAAO,MAAM,CAAC;AAAA,MAC1C,OAAO;AAAA,IACT;AAAA,IACA,IAAI;AAAA,MACF,MAAM,SAAS,MAAM,OAAO,qBAAqB,OAAO,OAAO;AAAA,MAC/D,UAAS,KAAK,OAAO,UAAU,MAAM,KAAK,MAAM;AAAA,MAChD,OAAO,KAAK;AAAA,MACZ,UAAS,KAAK,KAAK;AAAA,QACjB,OAAO,oBAAoB,OAAO,GAAG;AAAA,MACvC,CAAC;AAAA;AAAA,IAEH,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,WAAW,UAAU,aAAa,6BAA6B;AAAA,IACjE,MAAM,SAAS,MAAM;AAAA,IACrB,IAAI,CAAC,QAAQ;AAAA,MACX,UAAS,KAAK,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAAA,MAC9D,OAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAO,MAAM,aAAqC,KAAK,GAAG;AAAA,IAChE,IAAI,CAAC;AAAA,MAAM,OAAO;AAAA,IAClB,IAAI;AAAA,MACF,QAAQ,cAAc;AAAA,MACtB,MAAM,SAAS,MAAM,OAAO,eAAe,SAAS;AAAA,MACpD,UAAS,KAAK,OAAO,UAAU,MAAM,KAAK,MAAM;AAAA,MAChD,OAAO,KAAK;AAAA,MACZ,UAAS,KAAK,KAAK,EAAE,OAAO,OAAO,GAAG,EAAE,CAAC;AAAA;AAAA,IAE3C,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,WAAW,UAAU,aAAa,4BAA4B;AAAA,IAChE,MAAM,SAAS,MAAM;AAAA,IACrB,IAAI,CAAC,QAAQ;AAAA,MACX,UAAS,KAAK,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAAA,MAC9D,OAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAO,MAAM,aAAqC,KAAK,GAAG;AAAA,IAChE,IAAI,CAAC;AAAA,MAAM,OAAO;AAAA,IAClB,IAAI;AAAA,MACF,QAAQ,cAAc;AAAA,MACtB,MAAM,WAAW,OAAO,cAAc,SAAS;AAAA,MAC/C,UAAS,KAAK,KAAK,EAAE,SAAS,CAAC;AAAA,MAC/B,OAAO,KAAK;AAAA,MACZ,UAAS,KAAK,KAAK,EAAE,OAAO,OAAO,GAAG,EAAE,CAAC;AAAA;AAAA,IAE3C,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,WAAW,SAAS,aAAa,6BAA6B;AAAA,IAChE,MAAM,SAAS,MAAM;AAAA,IACrB,IAAI,CAAC,QAAQ;AAAA,MACX,UAAS,KAAK,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAAA,MAC9D,OAAO;AAAA,IACT;AAAA,IACA,UAAS,KAAK,KAAK,EAAE,SAAS,OAAO,oBAAoB,EAAE,CAAC;AAAA,IAC5D,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,WAAW,SAAS,aAAa,6BAA6B;AAAA,IAChE,MAAM,SAAS,MAAM;AAAA,IACrB,IAAI,CAAC,QAAQ;AAAA,MACX,UAAS,KAAK,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAAA,MAC9D,OAAO;AAAA,IACT;AAAA,IACA,IAAI;AAAA,MACF,MAAM,UAAU,MAAM,OAAO,WAAW;AAAA,MACxC,UAAS,KAAK,KAAK,EAAE,QAAQ,CAAC;AAAA,MAC9B,OAAO,KAAK;AAAA,MACZ,UAAS,KAAK,KAAK,EAAE,OAAO,OAAO,GAAG,EAAE,CAAC;AAAA;AAAA,IAE3C,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,SAAS,aAAa,6BAA6B;AAAA,IAChE,UAAS,KAAK,KAAK,mBAAmB,CAAC;AAAA,IACvC,OAAO;AAAA,EACT;AAAA,EAGA,UAAS,KAAK,KAAK,EAAE,OAAO,0BAA0B,UAAU,WAAW,CAAC;AAAA,EAC5E,OAAO;AAAA;AAGT,SAAS,QAAQ,CAAC,OAAgD;AAAA,EAChE,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK;AAAA,IAAG,OAAO;AAAA,EACxE,OAAO;AAAA;AAGT,SAAS,4BAA4B,CACnC,OACiD;AAAA,EACjD,MAAM,MAAM,SAAS,KAAK;AAAA,EAC1B,IAAI,CAAC,KAAK;AAAA,IACR,OAAO,EAAE,OAAO,wCAAwC;AAAA,EAC1D;AAAA,EAEA,MAAM,YAAY,IAAI;AAAA,EACtB,MAAM,UAAU,mBAAmB,IAAI,OAAO;AAAA,EAC9C,MAAM,KAAK,IAAI;AAAA,EACf,MAAM,QAAQ,IAAI;AAAA,EAClB,MAAM,OAAO,IAAI;AAAA,EACjB,MAAM,QACJ,IAAI,UAAU,YAAY,YAAY,mBAAmB,IAAI,KAAK;AAAA,EACpE,MAAM,cAAc,IAAI;AAAA,EACxB,MAAM,YAAY,mBAAmB,IAAI,SAAS;AAAA,EAElD,IAAI,OAAO,cAAc,YAAY,CAAC,UAAU,KAAK,GAAG;AAAA,IACtD,OAAO,EAAE,OAAO,0DAA0D;AAAA,EAC5E;AAAA,EACA,IAAI,YAAY,QAAQ,UAAU,GAAG;AAAA,IACnC,OAAO,EAAE,OAAO,qDAAqD;AAAA,EACvE;AAAA,EACA,IAAI,OAAO,OAAO,YAAY,CAAC,sBAAsB,KAAK,GAAG,KAAK,CAAC,GAAG;AAAA,IACpE,OAAO;AAAA,MACL,OACE;AAAA,IACJ;AAAA,EACF;AAAA,EACA,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,GAAG;AAAA,IAC9C,OAAO,EAAE,OAAO,sDAAsD;AAAA,EACxE;AAAA,EACA,IAAI,OAAO,SAAS,YAAY,CAAC,KAAK,KAAK,GAAG;AAAA,IAC5C,OAAO,EAAE,OAAO,qDAAqD;AAAA,EACvE;AAAA,EACA,IAAI,UAAU,MAAM;AAAA,IAClB,OAAO,EAAE,OAAO,uDAAuD;AAAA,EACzE;AAAA,EACA,IAAI,cAAc,MAAM;AAAA,IACtB,OAAO,EAAE,OAAO,kDAAkD;AAAA,EACpE;AAAA,EACA,IAAI,gBAAgB,aAAa,OAAO,gBAAgB,UAAU;AAAA,IAChE,OAAO;AAAA,MACL,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,WAAY,aAAoC,KAAK;AAAA,EAC3D,IAAI,aAAa,IAAI;AAAA,IACnB,OAAO;AAAA,MACL,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,SAAS;AAAA,MACP,WAAW,UAAU,KAAK;AAAA,MAC1B;AAAA,MACA,IAAI,GAAG,KAAK;AAAA,MACZ,OAAO,MAAM,KAAK;AAAA,MAClB;AAAA,SACI,UAAU,YAAY,CAAC,IAAI,EAAE,MAAM;AAAA,SACnC,aAAa,YAAY,CAAC,IAAI,EAAE,SAAS;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAAA;AAGF,SAAS,kBAAkB,CAAC,OAA+B;AAAA,EACzD,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK;AAAA,IAAG,OAAO;AAAA,EACjE,IAAI,CAAC,OAAO,UAAU,KAAK;AAAA,IAAG,OAAO;AAAA,EACrC,OAAO;AAAA;AAGT,SAAS,uBAAuB,CAAC,OAG/B;AAAA,EACA,IAAI,UAAU,aAAa,UAAU;AAAA,IAAM,OAAO,CAAC;AAAA,EACnD,MAAM,MAAM,SAAS,KAAK;AAAA,EAC1B,IAAI,CAAC;AAAA,IAAK,OAAO,EAAE,OAAO,kDAAkD;AAAA,EAE5E,MAAM,iBACJ,OAAO,OAAO,OAAO,OAAO,WAAW,OAAO,YAAY;AAAA,EAC5D,IAAI,CAAC;AAAA,IAAgB,OAAO,CAAC;AAAA,EAE7B,MAAM,IAAI,mBAAmB,IAAI,CAAC;AAAA,EAClC,MAAM,IAAI,mBAAmB,IAAI,CAAC;AAAA,EAClC,MAAM,QAAQ,mBAAmB,IAAI,KAAK;AAAA,EAC1C,MAAM,SAAS,mBAAmB,IAAI,MAAM;AAAA,EAE5C,IAAI,MAAM,QAAQ,MAAM,QAAQ,UAAU,QAAQ,WAAW,MAAM;AAAA,IACjE,OAAO;AAAA,MACL,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,IAAI,SAAS,KAAK,UAAU,GAAG;AAAA,IAC7B,OAAO,EAAE,OAAO,iDAAiD;AAAA,EACnE;AAAA,EAEA,OAAO;AAAA,IACL,QAAQ,EAAE,GAAG,GAAG,OAAO,OAAO;AAAA,EAChC;AAAA;AAGF,SAAS,mBAAmB,CAAC,OAK3B;AAAA,EACA,MAAM,MAAM,SAAS,KAAK;AAAA,EAC1B,IAAI,CAAC,KAAK;AAAA,IACR,OAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,mBAAmB,IAAI,CAAC;AAAA,EAClC,MAAM,IAAI,mBAAmB,IAAI,CAAC;AAAA,EAClC,IAAI,MAAM,QAAQ,MAAM,MAAM;AAAA,IAC5B,OAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,IAAI;AAAA,EACtB,IAAI,SAA2B;AAAA,EAC/B,IAAI,cAAc,WAAW;AAAA,IAC3B,IAAI,cAAc,UAAU,cAAc,SAAS;AAAA,MACjD,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX;AAAA,EAEA,OAAO,EAAE,GAAG,GAAG,OAAO;AAAA;AAGxB,SAAS,kBAAkB,CAAC,OAAkD;AAAA,EAC5E,MAAM,MAAM,SAAS,KAAK;AAAA,EAC1B,IAAI,CAAC;AAAA,IAAK,OAAO,EAAE,MAAM,IAAI,OAAO,qCAAqC;AAAA,EACzE,IAAI,OAAO,IAAI,SAAS,UAAU;AAAA,IAChC,OAAO,EAAE,MAAM,IAAI,OAAO,8CAA8C;AAAA,EAC1E;AAAA,EACA,IAAI,IAAI,KAAK,WAAW,GAAG;AAAA,IACzB,OAAO,EAAE,MAAM,IAAI,OAAO,uBAAuB;AAAA,EACnD;AAAA,EACA,IAAI,IAAI,KAAK,SAAS,2BAA2B;AAAA,IAC/C,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,gCAAgC;AAAA,IACzC;AAAA,EACF;AAAA,EACA,OAAO,EAAE,MAAM,IAAI,KAAK;AAAA;AAG1B,SAAS,sBAAsB,CAAC,OAG9B;AAAA,EACA,MAAM,MAAM,SAAS,KAAK;AAAA,EAC1B,IAAI,CAAC,KAAK;AAAA,IACR,OAAO,EAAE,MAAM,IAAI,OAAO,yCAAyC;AAAA,EACrE;AAAA,EACA,IAAI,OAAO,IAAI,SAAS,UAAU;AAAA,IAChC,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,IAAI,KAAK,KAAK;AAAA,EAC3B,IAAI,CAAC;AAAA,IAAM,OAAO,EAAE,MAAM,IAAI,OAAO,uBAAuB;AAAA,EAC5D,IAAI,KAAK,SAAS,qBAAqB;AAAA,IACrC,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,gCAAgC;AAAA,IACzC;AAAA,EACF;AAAA,EACA,IAAI,CAAC,uBAAsB,KAAK,IAAI,GAAG;AAAA,IACrC,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OACE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,OAAO,EAAE,KAAK;AAAA;AAGhB,SAAS,kBAAkB,CAAC,OAG1B;AAAA,EACA,IAAI,UAAU,aAAa,UAAU;AAAA,IAAM,OAAO,EAAE,QAAQ,MAAM;AAAA,EAClE,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO,EAAE,QAAQ,OAAO,OAAO,0BAA0B;AAAA,EAC3D;AAAA,EAEA,MAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAAA,EAC5C,IAAI,CAAC;AAAA,IAAY,OAAO,EAAE,QAAQ,MAAM;AAAA,EACxC,IAAI,CAAC,cAAc,KAAK,UAAU,GAAG;AAAA,IACnC,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,OACE;AAAA,IACJ;AAAA,EACF;AAAA,EACA,IAAI,CAAC,sBAAsB,IAAI,UAAU,GAAG;AAAA,IAC1C,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO,EAAE,QAAQ,WAAW;AAAA;AAG9B,SAAS,WAAU,CAAC,SAAiB,MAAgB,SAAuB;AAAA,EAC1E,cAAa,SAAS,MAAM;AAAA,IAC1B;AAAA,IACA,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,EAClC,CAAC;AAAA;AAGH,SAAS,kBAAiB,CAAC,QAKhB;AAAA,EACT,MAAM,MAAK,UAAS;AAAA,EACpB,MAAM,UAAU,MAAK,QAAO,GAAG,sBAAsB,KAAK,IAAI,OAAO;AAAA,EAErE,IAAI;AAAA,IACF,IAAI,QAAO,UAAU;AAAA,MACnB,IAAI,QAAQ;AAAA,QACV,YACE,iBACA;AAAA,UACE,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,SAAS,OAAO;AAAA,UACpD;AAAA,UACA;AAAA,QACF,GACA,GACF;AAAA,MACF,EAAO;AAAA,QACL,YAAW,iBAAiB,CAAC,MAAM,OAAO,GAAG,GAAK;AAAA;AAAA,IAEtD,EAAO,SAAI,QAAO,SAAS;AAAA,MAEzB,IAAI,eAAc,QAAQ,GAAG;AAAA,QAC3B,IAAI,QAAQ;AAAA,UACV,YACE,UACA;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA,GAAG,OAAO,SAAS,OAAO,UAAU,OAAO,KAAK,OAAO;AAAA,YACvD;AAAA,UACF,GACA,GACF;AAAA,QACF,EAAO;AAAA,UACL,YAAW,UAAU,CAAC,WAAW,QAAQ,OAAO,GAAG,GAAK;AAAA;AAAA,MAE5D,EAAO,SAAI,eAAc,OAAO,GAAG;AAAA,QACjC,YAAW,SAAS,CAAC,OAAO,GAAG,GAAK;AAAA,MACtC,EAAO,SAAI,eAAc,kBAAkB,GAAG;AAAA,QAC5C,YAAW,oBAAoB,CAAC,MAAM,OAAO,GAAG,GAAK;AAAA,MACvD,EAAO;AAAA,QACL,MAAM,IAAI,MACR,gFACF;AAAA;AAAA,IAEJ,EAAO,SAAI,QAAO,SAAS;AAAA,MAEzB,MAAM,QAAQ;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,iBAAiB,QAAQ,QAAQ,OAAO,IAAI;AAAA,QAC5C;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,MACX,UAAS,wBAAwB,UAAU;AAAA,QACzC,SAAS;AAAA,QACT,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAClC,CAAC;AAAA,IACH,EAAO;AAAA,MACL,MAAM,IAAI,MAAM,yCAAyC,KAAI;AAAA;AAAA,IAG/D,MAAM,OAAO,cAAa,OAAO;AAAA,IACjC,IAAI;AAAA,MACF,YAAW,OAAO;AAAA,MAClB,MAAM;AAAA,IAGR,OAAO;AAAA,IACP,OAAO,KAAK;AAAA,IAEZ,IAAI;AAAA,MACF,YAAW,OAAO;AAAA,MAClB,MAAM;AAAA,IAGR,MAAM;AAAA;AAAA;AAIV,SAAS,YAAW,GAAsD;AAAA,EACxE,MAAM,MAAK,UAAS;AAAA,EAEpB,IAAI,QAAO,UAAU;AAAA,IACnB,IAAI;AAAA,MACF,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYf,MAAM,SAAS,UAAS,iBAAiB,WAAW;AAAA,QAClD,UAAU;AAAA,QACV,SAAS;AAAA,QACT,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,MACpC,CAAC;AAAA,MACD,OAAO,OACJ,MAAM,IAAI,EACV,OAAO,OAAO,EACd,IAAI,CAAC,UAAU;AAAA,QACd,MAAM,QAAQ,MAAM,MAAM,KAAK;AAAA,QAC/B,OAAO;AAAA,UACL,KAAK,MAAM,MAAM;AAAA,UACjB,OAAO,MAAM,MAAM;AAAA,UACnB,IAAI,MAAM,MAAM;AAAA,QAClB;AAAA,OACD;AAAA,MACH,MAAM;AAAA,MACN,OAAO,CAAC;AAAA;AAAA,EAEZ;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,IAAI;AAAA,MACF,MAAM,SAAS,UACb,+EACA;AAAA,QACE,UAAU;AAAA,QACV,SAAS;AAAA,MACX,CACF;AAAA,MACA,OAAO,OACJ,MAAM;AAAA,CAAI,EACV,OAAO,OAAO,EACd,IAAI,CAAC,MAAM,OAAO;AAAA,QACjB,IAAI,OAAO,CAAC;AAAA,QACZ,OAAO,KAAK,KAAK;AAAA,QACjB,KAAK;AAAA,MACP,EAAE;AAAA,MACJ,MAAM;AAAA,MACN,OAAO,CAAC;AAAA;AAAA,EAEZ;AAAA,EAEA,IAAI,QAAO,SAAS;AAAA,IAClB,IAAI;AAAA,MACF,MAAM,SAAS,UACb,8HACA,EAAE,UAAU,SAAS,SAAS,IAAM,CACtC;AAAA,MACA,MAAM,YAAY,KAAK,MAAM,MAAM;AAAA,MACnC,MAAM,OAAO,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC,SAAS;AAAA,MAC9D,OAAO,KAAK,IAAI,CAAC,OAAgD;AAAA,QAC/D,IAAI,OAAO,EAAE,EAAE;AAAA,QACf,OAAO,EAAE;AAAA,QACT,KAAK;AAAA,MACP,EAAE;AAAA,MACF,MAAM;AAAA,MACN,OAAO,CAAC;AAAA;AAAA,EAEZ;AAAA,EAEA,OAAO,CAAC;AAAA;AAGV,eAAe,WAAW,CAAC,YAAqC;AAAA,EAC9D,MAAM,MAAK,UAAS;AAAA,EACpB,MAAM,cAAc,KAAK,KAAK,aAAa,IAAI;AAAA,EAC/C,MAAM,UAAU,MAAK,QAAO,GAAG,iBAAiB,KAAK,IAAI,OAAO;AAAA,EAEhE,IAAI,QAAO,UAAU;AAAA,IAEnB,IAAI,eAAc,KAAK,GAAG;AAAA,MACxB,UAAS,UAAU,kBAAkB,eAAe;AAAA,QAClD,SAAS,aAAa;AAAA,QACtB,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAClC,CAAC;AAAA,IACH,EAAO,SAAI,eAAc,QAAQ,GAAG;AAAA,MAClC,UACE,qCAAqC,kBAAkB,uBACvD,EAAE,SAAS,aAAa,KAAO,OAAO,CAAC,UAAU,QAAQ,MAAM,EAAE,CACnE;AAAA,IACF,EAAO;AAAA,MACL,MAAM,IAAI,MACR,2DACF;AAAA;AAAA,EAEJ,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,IAAI,eAAc,SAAS,GAAG;AAAA,MAC5B,UAAS,cAAc,qBAAqB,WAAW;AAAA,QACrD,SAAS,aAAa;AAAA,QACtB,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAClC,CAAC;AAAA,IACH,EAAO,SAAI,eAAc,QAAQ,GAAG;AAAA,MAClC,UACE,iCAAiC,kBAAkB,uBACnD,EAAE,SAAS,aAAa,KAAO,OAAO,CAAC,UAAU,QAAQ,MAAM,EAAE,CACnE;AAAA,IACF,EAAO;AAAA,MACL,MAAM,IAAI,MACR,kEACF;AAAA;AAAA,EAEJ,EAAO,SAAI,QAAO,SAAS;AAAA,IAEzB,IAAI,eAAc,QAAQ,GAAG;AAAA,MAC3B,UACE,4CAA4C,mBAAmB,QAAQ,QAAQ,OAAO,IAAI,YAC1F,EAAE,SAAS,aAAa,KAAO,OAAO,CAAC,UAAU,QAAQ,MAAM,EAAE,CACnE;AAAA,IACF,EAAO;AAAA,MACL,MAAM,IAAI,MAAM,oDAAoD;AAAA;AAAA,EAExE,EAAO;AAAA,IACL,MAAM,IAAI,MAAM,8CAA8C,KAAI;AAAA;AAAA,EAGpE,MAAM,OAAO,cAAa,OAAO;AAAA,EACjC,IAAI;AAAA,IACF,YAAW,OAAO;AAAA,IAClB,MAAM;AAAA,EAGR,OAAO;AAAA;AAGT,eAAe,SAAS,CAAC,MAAc,QAA+B;AAAA,EACpE,MAAM,MAAK,UAAS;AAAA,EACpB,MAAM,UAAU,MAAK,QAAO,GAAG,gBAAgB,KAAK,IAAI,KAAK,QAAQ;AAAA,EACrE,cAAc,SAAS,IAAI;AAAA,EAE3B,IAAI;AAAA,IACF,IAAI,QAAO,UAAU;AAAA,MACnB,YAAW,UAAU,CAAC,OAAO,GAAG,KAAK;AAAA,IACvC,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,IAAI,eAAc,OAAO,GAAG;AAAA,QAC1B,YAAW,SAAS,CAAC,OAAO,GAAG,KAAK;AAAA,MACtC,EAAO,SAAI,eAAc,QAAQ,GAAG;AAAA,QAClC,YAAW,UAAU,CAAC,OAAO,GAAG,KAAK;AAAA,MACvC,EAAO,SAAI,eAAc,QAAQ,GAAG;AAAA,QAClC,YAAW,UAAU,CAAC,aAAa,WAAW,OAAO,GAAG,KAAK;AAAA,MAC/D,EAAO;AAAA,QACL,MAAM,IAAI,MAAM,mCAAmC;AAAA;AAAA,IAEvD,EAAO,SAAI,QAAO,SAAS;AAAA,MACzB,MAAM,cAAc,QAAQ,QAAQ,OAAO,IAAI,EAAE,QAAQ,MAAM,IAAI;AAAA,MACnE,YACE,cACA;AAAA,QACE;AAAA,QACA,kCAAkC;AAAA,MACpC,GACA,KACF;AAAA,IACF;AAAA,YACA;AAAA,IACA,IAAI;AAAA,MACF,YAAW,OAAO;AAAA,MAClB,MAAM;AAAA;AAAA;AAMZ,SAAS,2BAA0B,CAAC,OAAuB;AAAA,EACzD,OAAO,IAAI,MAAM,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,MAAK;AAAA;AAG7D,SAAS,YAAY,CAAC,GAAW,GAAW,QAAgC;AAAA,EAC1E,MAAM,MAAK,UAAS;AAAA,EAEpB,IAAI,QAAO,UAAU;AAAA,IAEnB,IAAI,eAAc,UAAU,GAAG;AAAA,MAC7B,MAAM,MAAM,WAAW,UAAU,OAAO;AAAA,MACxC,YAAW,YAAY,CAAC,GAAG,OAAO,KAAK,GAAG,GAAG,IAAI;AAAA,IACnD,EAAO;AAAA,MAEL,YACE,aACA,CAAC,MAAM,iDAAiD,MAAM,IAAI,GAClE,IACF;AAAA;AAAA,EAEJ,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,IAAI,eAAc,SAAS,GAAG;AAAA,MAC5B,MAAM,MAAM,WAAW,UAAU,MAAM;AAAA,MACvC,YACE,WACA,CAAC,aAAa,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,SAAS,GAAG,GAChD,IACF;AAAA,IACF,EAAO;AAAA,MACL,MAAM,IAAI,MAAM,8CAA8C;AAAA;AAAA,EAElE,EAAO,SAAI,QAAO,SAAS;AAAA,IAEzB,MAAM,WAAW;AAAA,MACf;AAAA,MACA,6EAA6E,KAAK;AAAA,MAClF;AAAA,MACA,WAAW,UACP,6GACA;AAAA,IACN,EAAE,KAAK,IAAI;AAAA,IACX,YAAW,cAAc,CAAC,YAAY,QAAQ,GAAG,IAAI;AAAA,EACvD;AAAA;AAGF,SAAS,WAAW,CAAC,MAAoB;AAAA,EACvC,MAAM,MAAK,UAAS;AAAA,EAEpB,IAAI,QAAO,UAAU;AAAA,IACnB,IAAI,eAAc,UAAU,GAAG;AAAA,MAC7B,YAAW,YAAY,CAAC,KAAK,MAAM,GAAG,GAAK;AAAA,IAC7C,EAAO;AAAA,MACL,YACE,aACA;AAAA,QACE;AAAA,QACA,iDAAiD,4BAA2B,IAAI;AAAA,MAClF,GACA,GACF;AAAA;AAAA,EAEJ,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,IAAI,eAAc,SAAS,GAAG;AAAA,MAC5B,YAAW,WAAW,CAAC,QAAQ,MAAM,IAAI,GAAG,GAAK;AAAA,IACnD,EAAO;AAAA,MACL,MAAM,IAAI,MAAM,+CAA+C;AAAA;AAAA,EAEnE,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,MAAM,UAAU,KAAK,QAAQ,MAAM,IAAI;AAAA,IACvC,YACE,cACA;AAAA,MACE;AAAA,MACA,2FAA2F;AAAA,IAC7F,GACA,GACF;AAAA,EACF;AAAA;AAGF,SAAS,eAAe,CAAC,MAAoB;AAAA,EAC3C,MAAM,MAAK,UAAS;AAAA,EAEpB,IAAI,QAAO,UAAU;AAAA,IACnB,IAAI,eAAc,UAAU,GAAG;AAAA,MAC7B,YAAW,YAAY,CAAC,MAAM,MAAM,GAAG,IAAI;AAAA,IAC7C,EAAO;AAAA,MACL,MAAM,mBAA2C;AAAA,QAC/C,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM;AAAA,QACN,IAAI;AAAA,MACN;AAAA,MACA,MAAM,aAAa,KAAK,KAAK,EAAE,YAAY;AAAA,MAC3C,MAAM,aAAa,iBAAiB;AAAA,MACpC,MAAM,cACJ,eACC,OAAO,UAAU,OAAO,KAAK,KAAK,CAAC,CAAC,IAAI,OAAO,KAAK,KAAK,CAAC,IAAI;AAAA,MAEjE,IAAI,gBAAgB,MAAM;AAAA,QACxB,YACE,aACA,CAAC,MAAM,gDAAgD,aAAa,GACpE,IACF;AAAA,MACF,EAAO;AAAA,QACL,YACE,aACA;AAAA,UACE;AAAA,UACA,iDAAiD,4BAA2B,IAAI;AAAA,QAClF,GACA,IACF;AAAA;AAAA;AAAA,EAGN,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,IAAI,eAAc,SAAS,GAAG;AAAA,MAC5B,YAAW,WAAW,CAAC,OAAO,IAAI,GAAG,IAAI;AAAA,IAC3C,EAAO;AAAA,MACL,MAAM,IAAI,MAAM,0CAA0C;AAAA;AAAA,EAE9D,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,MAAM,UAAU,KAAK,QAAQ,MAAM,IAAI;AAAA,IACvC,YACE,cACA;AAAA,MACE;AAAA,MACA,2FAA2F;AAAA,IAC7F,GACA,IACF;AAAA,EACF;AAAA;AAGF,SAAS,kBAAkB,GAGzB;AAAA,EACA,MAAM,MAAK,UAAS;AAAA,EACpB,MAAM,OAA6D,CAAC;AAAA,EAGpE,IAAI,QAAO,UAAU;AAAA,IACnB,KAAK,aAAa,EAAE,WAAW,MAAM,MAAM,2BAA2B;AAAA,EACxE,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,IAAI,eAAc,QAAQ;AAAA,MACxB,KAAK,aAAa,EAAE,WAAW,MAAM,MAAM,qBAAqB;AAAA,IAC7D,SAAI,eAAc,OAAO;AAAA,MAC5B,KAAK,aAAa,EAAE,WAAW,MAAM,MAAM,QAAQ;AAAA,IAChD,SAAI,eAAc,kBAAkB;AAAA,MACvC,KAAK,aAAa,EAAE,WAAW,MAAM,MAAM,mBAAmB;AAAA,IAE9D;AAAA,WAAK,aAAa;AAAA,QAChB,WAAW;AAAA,QACX,MAAM;AAAA,MACR;AAAA,EACJ,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,KAAK,aAAa,EAAE,WAAW,MAAM,MAAM,4BAA4B;AAAA,EACzE,EAAO;AAAA,IACL,KAAK,aAAa,EAAE,WAAW,OAAO,MAAM,uBAAuB;AAAA;AAAA,EAIrE,IAAI,QAAO,UAAU;AAAA,IACnB,IAAI,eAAc,KAAK;AAAA,MACrB,KAAK,cAAc,EAAE,WAAW,MAAM,MAAM,UAAU;AAAA,IACnD,SAAI,eAAc,QAAQ;AAAA,MAC7B,KAAK,cAAc,EAAE,WAAW,MAAM,MAAM,SAAS;AAAA,IAErD;AAAA,WAAK,cAAc;AAAA,QACjB,WAAW;AAAA,QACX,MAAM;AAAA,MACR;AAAA,EACJ,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,IAAI,eAAc,SAAS;AAAA,MACzB,KAAK,cAAc,EAAE,WAAW,MAAM,MAAM,UAAU;AAAA,IACnD,SAAI,eAAc,QAAQ;AAAA,MAC7B,KAAK,cAAc,EAAE,WAAW,MAAM,MAAM,SAAS;AAAA,IAErD;AAAA,WAAK,cAAc;AAAA,QACjB,WAAW;AAAA,QACX,MAAM;AAAA,MACR;AAAA,EACJ,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,IAAI,eAAc,QAAQ;AAAA,MACxB,KAAK,cAAc,EAAE,WAAW,MAAM,MAAM,SAAS;AAAA,IAClD;AAAA,WAAK,cAAc,EAAE,WAAW,OAAO,MAAM,wBAAwB;AAAA,EAC5E,EAAO;AAAA,IACL,KAAK,cAAc,EAAE,WAAW,OAAO,MAAM,cAAc;AAAA;AAAA,EAI7D,IAAI,QAAO;AAAA,IACT,KAAK,YAAY,EAAE,WAAW,MAAM,MAAM,oBAAoB;AAAA,EAC3D,SAAI,QAAO,SAAS;AAAA,IACvB,IAAI,eAAc,OAAO;AAAA,MACvB,KAAK,YAAY,EAAE,WAAW,MAAM,MAAM,QAAQ;AAAA,IAC/C,SAAI,eAAc,QAAQ;AAAA,MAC7B,KAAK,YAAY,EAAE,WAAW,MAAM,MAAM,SAAS;AAAA,IAChD,SAAI,eAAc,QAAQ;AAAA,MAC7B,KAAK,YAAY,EAAE,WAAW,MAAM,MAAM,SAAS;AAAA,IAChD;AAAA,WAAK,YAAY,EAAE,WAAW,OAAO,MAAM,OAAO;AAAA,EACzD,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,KAAK,YAAY,EAAE,WAAW,MAAM,MAAM,yBAAyB;AAAA,EACrE,EAAO;AAAA,IACL,KAAK,YAAY,EAAE,WAAW,OAAO,MAAM,cAAc;AAAA;AAAA,EAI3D,IAAI,QAAO,UAAU;AAAA,IACnB,IAAI,eAAc,UAAU;AAAA,MAC1B,KAAK,cAAc,EAAE,WAAW,MAAM,MAAM,WAAW;AAAA,IACpD;AAAA,WAAK,cAAc,EAAE,WAAW,MAAM,MAAM,wBAAwB;AAAA,EAC3E,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,IAAI,eAAc,SAAS;AAAA,MACzB,KAAK,cAAc,EAAE,WAAW,MAAM,MAAM,UAAU;AAAA,IAEtD;AAAA,WAAK,cAAc,EAAE,WAAW,OAAO,MAAM,yBAAyB;AAAA,EAC1E,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,KAAK,cAAc,EAAE,WAAW,MAAM,MAAM,sBAAsB;AAAA,EACpE,EAAO;AAAA,IACL,KAAK,cAAc,EAAE,WAAW,OAAO,MAAM,cAAc;AAAA;AAAA,EAI7D,IAAI,QAAO;AAAA,IACT,KAAK,aAAa,EAAE,WAAW,MAAM,MAAM,cAAc;AAAA,EACtD,SAAI,QAAO,SAAS;AAAA,IACvB,IAAI,eAAc,QAAQ;AAAA,MACxB,KAAK,aAAa,EAAE,WAAW,MAAM,MAAM,SAAS;AAAA,IACjD,SAAI,eAAc,SAAS;AAAA,MAC9B,KAAK,aAAa,EAAE,WAAW,MAAM,MAAM,UAAU;AAAA,IAErD;AAAA,WAAK,aAAa;AAAA,QAChB,WAAW;AAAA,QACX,MAAM;AAAA,MACR;AAAA,EACJ,EAAO,SAAI,QAAO,SAAS;AAAA,IACzB,KAAK,aAAa,EAAE,WAAW,MAAM,MAAM,yBAAyB;AAAA,EACtE,EAAO;AAAA,IACL,KAAK,aAAa,EAAE,WAAW,OAAO,MAAM,cAAc;AAAA;AAAA,EAI5D,KAAK,UAAU,EAAE,WAAW,MAAM,MAAM,oCAAoC;AAAA,EAG5E,KAAK,QAAQ,EAAE,WAAW,MAAM,MAAM,cAAc;AAAA,EAEpD,OAAO;AAAA;AAGT,SAAS,eAAe,GAAqC;AAAA,EAC3D,MAAM,MAAK,UAAS;AAAA,EACpB,IAAI,kBAAkB;AAAA,EACtB,IAAI,gBAAgB;AAAA,EACpB,IAAI,0BAA0B;AAAA,EAG9B,IAAI;AAAA,IACF,MAAM,QAAQ,QAAO,UAAU,UAAU;AAAA,IACzC,UAAS,GAAG,gBAAgB,EAAE,OAAO,UAAU,SAAS,KAAK,CAAC;AAAA,IAC9D,kBAAkB;AAAA,IAClB,MAAM;AAAA,EAKR,IAAI,iBAAiB;AAAA,IACnB,IAAI;AAAA,MACF,UAAS,eAAe,EAAE,OAAO,UAAU,SAAS,KAAK,CAAC;AAAA,MAC1D,gBAAgB;AAAA,MAChB,MAAM;AAAA,EAGV;AAAA,EAEA,IAAI,QAAO,UAAU;AAAA,IACnB,IAAI;AAAA,MACF,UAAS,mBAAmB,EAAE,OAAO,UAAU,SAAS,KAAK,CAAC;AAAA,MAC9D,0BAA0B;AAAA,MAC1B,MAAM;AAAA,EAGV;AAAA,EAEA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,2BAAyB,KAAK;AAAA,IAC9B;AAAA,IACA;AAAA,IAEA,iBAAiB;AAAA,IACjB;AAAA,IACA,MAAM,QAAO,UAAU,gBAAgB,IAAI;AAAA,IAC3C,aACE,QAAO,YAAY,0BAA0B,oBAAoB;AAAA,EACrE;AAAA;AAGF,SAAS,eAAe,GAAY;AAAA,EAClC,IAAI;AAAA,IACF,UAAS,gBAAgB,EAAE,OAAO,UAAU,SAAS,KAAK,CAAC;AAAA,IAC3D,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,SAAS,kBAAkB,GAIzB;AAAA,EACA,MAAM,MAAK,UAAS;AAAA,EAEpB,IAAI;AAAA,IACF,IAAI,QAAO,UAAU;AAAA,MACnB,UAAS,oBAAoB,EAAE,SAAS,MAAM,OAAO,SAAS,CAAC;AAAA,MAC/D,OAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IAEA,IAAI,QAAO,SAAS;AAAA,MAElB,MAAM,QAAQ;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AAAA,MACA,IAAI,UAAU;AAAA,MACd,WAAW,KAAK,OAAO;AAAA,QACrB,IAAI;AAAA,UACF,UAAS,YAAY,KAAK;AAAA,YACxB,SAAS;AAAA,YACT,OAAO;AAAA,YACP,OAAO;AAAA,UACT,CAAC;AAAA,UACD,UAAU;AAAA,UACV;AAAA,UACA,MAAM;AAAA,MAGV;AAAA,MACA,IAAI,CAAC,SAAS;AAAA,QAEZ,UAAS,6BAA6B;AAAA,UACpC,SAAS;AAAA,UACT,OAAO;AAAA,UACP,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,SACE;AAAA,QACF,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IAEA,IAAI,QAAO,SAAS;AAAA,MAElB,IAAI;AAAA,QACF,UAAS,+BAA+B;AAAA,UACtC,SAAS;AAAA,UACT,OAAO;AAAA,QACT,CAAC;AAAA,QACD,OAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,QACV;AAAA,QACA,MAAM;AAAA,MAKR,IAAI;AAAA,QACF,UAAS,6BAA6B;AAAA,UACpC,SAAS;AAAA,UACT,OAAO;AAAA,QACT,CAAC;AAAA,QACD,OAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,QACV;AAAA,QACA,MAAM;AAAA,MAIR,OAAO;AAAA,QACL,SAAS;AAAA,QACT,SACE;AAAA,QACF,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,+BAA+B;AAAA,MACxC,QAAQ;AAAA,IACV;AAAA,IACA,OAAO,KAAK;AAAA,IACZ,OAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,WAAW,OAAO,GAAG;AAAA,MAC9B,QAAQ;AAAA,IACV;AAAA;AAAA;AAMJ,SAAS,cAAa,CAAC,KAAsB;AAAA,EAC3C,IAAI;AAAA,IACF,MAAM,QAAQ,UAAS,MAAM,UAAU,UAAU;AAAA,IACjD,UAAS,GAAG,SAAS,OAAO,EAAE,OAAO,UAAU,SAAS,KAAK,CAAC;AAAA,IAC9D,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,SAAS,SAAQ,CAAC,KAAqB,QAAgB,MAAqB;AAAA,EAC1E,kBAAiB,KAAK,MAAM,MAAM;AAAA;AAGpC,SAAS,QAAQ,CAAC,KAA8C;AAAA,EAC9D,OAAO,gBAAgB,KAAK;AAAA,IAC1B,UAAU,KAAK,OAAO;AAAA,IACtB,sBAAsB;AAAA,IACtB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,EACrB,CAAC;AAAA;AAGH,SAAS,YAAyB,CAChC,KACA,KACmB;AAAA,EACnB,OAAO,cAAc,KAAK,KAAK;AAAA,IAC7B,UAAU,KAAK,OAAO;AAAA,IACtB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,EACrB,CAAC;AAAA;AAAA,IAj7CG,4BAA4B,MAC5B,sBAAsB,KACtB,wBACA,uBACA,+BAA+B,KAC/B,+BAA+B;AAAA;AAAA,EAH/B,yBAAwB;AAAA,EACxB,wBAAwB,IAAI,IAAI,CAAC,OAAO,OAAO,OAAO,QAAQ,KAAK,CAAC;AAAA;;;ACrE1E;AAAA;AAAA,EAEA,6BAA6B,+BAA+B,YAAY;AAAA,IACtE,QAAQ,sBAAsB;AAAA,IAC9B,OAAO;AAAA,GACR;AAAA;;;;;;;;;;;;;;;;;;;;;;;;ACkBD;AAAA,IAOM,mBA8BO,mBA6BA,mBAEE;AAAA;AAAA,EAnEf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAiEA;AAAA,EACA;AAAA,EAqBA;AAAA,EACA;AAAA,EAoCA;AAAA,EA1HM,oBAA6B;AAAA,IACjC;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,wBAAwB;AAAA,IACnC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS,wBAAwB;AAAA,IACnC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,wBAAwB;AAAA,IACnC;AAAA,IACA;AAAA,MAEE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,wBAAwB;AAAA,IACnC;AAAA,EACF;AAAA,EAEa,oBAA4B;AAAA,IACvC,MAAM;AAAA,IACN,aACE,wEACA,wGACA;AAAA,IAEF,UAAU,CAAC,kBAAkB;AAAA,IAQ7B,SAAS;AAAA,MACP,GAAG,2BAA2B,iBAAiB;AAAA,MAC/C,GAAG,2BAA2B,aAAa;AAAA,IAC7C;AAAA,IAEA,WAAW,CAAC,qBAAqB;AAAA,IAEjC,QAAQ;AAAA,IAER,YAAY;AAAA,MACV,SAAS,CAAC,sBAAsB;AAAA,IAClC;AAAA,EACF;AAAA,EAEa,oBAAoB;AAAA,EAElB;AAAA;",
32
+ "debugId": "BECEA3E743939AEA64756E2164756E21",
33
+ "names": []
34
+ }